メモを、作業ログ(ジャーナル・メモと呼ぶ)に、書くためのmacro。
Editorで作業中に、簡単なメモを、作業ログとして取りたい時がある。この要求に対応したマクロ。日付で設定される「yyMMdd.md」ファイルにメモを書き出す。
仕様は、以下。
open_journal.jseは、Edtorからも、WSHでも起動可能。より、PC起動時に、Startupで、WSHよりopen_journal.jseを起動すると、日付に対応したメモが立ち上がる。
cscript G:\users\sakai\AppData\Roaming\sakura\open_journal.jse
例 \Users\<user_name>\AppData\Roaming\sakura配下
├- open_journal.jse
├- config
+ add_memoLineForJournal.jse
+ new_memoLineForJournal.jse
(function(){
// CONST
var CONS_TARGET_FOLDER = "journal";
var CONS_MACRO_FOLDER = "sakura";
var CONS_MACRO_FOR_NEW = "./config/new_memoLineForJournal.jse";
var CONS_MACRO_FOR_ADD = "./config/add_memoLineForJournal.jse";
// global function
function get_todayString(sep){
if(typeof(sep) === 'undefined') sep='/';
var dtm = new Date();
return [
('' + dtm.getFullYear()).slice(-2),
('0' + (dtm.getMonth() +1)).slice(-2),
('0' + dtm.getDate()).slice(-2)
].join(sep);
}
function get_nowTimeString(sep){
if(typeof(sep) === 'undefined') sep=':';
if(arguments.length){
sep = arguments[0]
}
var dtm = new Date();
return [
('0' + dtm.getHours()).slice(-2),
('0' + dtm.getMinutes()).slice(-2)
].join(sep);
}
function get_todayDayString(num){
if(typeof(num) === 'undefined') num=3;
var ret;
var aryDay = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var dtm = new Date();
var dw = dtm.getDay();
if(num === 0){
ret = dw;
} else {
ret = aryDay[dw].substr(0, 3);
}
return ret;
}
function get_journalForToday(){
var target_folder_name = CONS_TARGET_FOLDER;
var objFS = new ActiveXObject("Scripting.FileSystemObject");
var objShell = new ActiveXObject("WScript.Shell");
var doc_folder = objShell.SpecialFolders("MyDocuments");
var target_folder_path = objFS.BuildPath(doc_folder, target_folder_name);
var date_str = get_todayString('');
var target_journal_path = objFS.BuildPath(target_folder_path, date_str + ".md");
//WScript.Echo(target_journal_path)
objShell = null;
objFS = null;
return target_journal_path
}
function create_textfile_by_force(path){
var objFS = new ActiveXObject("Scripting.FileSystemObject");
var parent_folder = objFS.GetParentFolderName(path);
if(!objFS.FolderExists(parent_folder)){
objFS.CreateFolder(parent_folder);
}
var objTS = objFS.OpenTextFile(path,2,true); // FIXME UTF-16 -> UTF-8
objTS.Close();
objTS = null;
objFS = null;
}
function test_path_and_new(path){
var objFS = new ActiveXObject("Scripting.FileSystemObject");
var isExist = objFS.FileExists(path)
if(isExist){
null;
} else {
create_textfile_by_force(path);
}
objFS = null;
return isExist;
}
function get_sakuraMacroPathForExist(isExist){
if(isExist){
var target_macro_name = CONS_MACRO_FOR_ADD;
} else {
var target_macro_name = CONS_MACRO_FOR_NEW;
}
var target_folder_name = CONS_MACRO_FOLDER;
var objFS = new ActiveXObject("Scripting.FileSystemObject");
var objShell = new ActiveXObject("WScript.Shell");
var appdata_folder = objShell.SpecialFolders("AppData");
var target_folder_path = objFS.BuildPath(appdata_folder, target_folder_name);
var target_macro_path = objFS.BuildPath(target_folder_path, target_macro_name);
objShell = null;
objFS = null;
return target_macro_path
}
// journalファイルをsakuraで、macroを起動して開く
function doProcess(){
var target_journal_path = get_journalForToday();
var isExist = test_path_and_new(target_journal_path);
var target_macro_path = get_sakuraMacroPathForExist(isExist);
var cmd_statement = "sakura.exe " + target_journal_path + " -M=" + target_macro_path;
var objShell = new ActiveXObject("WScript.Shell");
objShell.Run(cmd_statement, 0);
var objShell = null;
}
// -------------- entry point
if(typeof(Editor) !== 'undefined'){
doProcess();
} else {
if(typeof(WScript) !== 'undefined'){
doProcess();
} else {
console.log('[Warn] This script is for sakura macro. A env is maybe node.')
}
}
}())
(function(){
///////////////////////////////////////
// here-string CRLF
// ↓↓↓↓↓↓↓↓↓
var herestrings = function(){
/*
## memo : {{date_str}} ({{day_str}}) {{time_str}} :
- {{clip_text}}
*/
}
if(!Object.keys){
Object.keys = function(obj){
var keys = [];
for(var i in obj){
if(obj.hasOwnProperty(i)){
keys.push(i);
}
}
return keys;
};
}
function get_template(){
var sep = '\r\n';
if(arguments.length){
sep = arguments[0]
}
var template = herestrings.toString().split(sep).slice(2,-2).join(sep);
return template;
}
function merge_map(template, map_){
var keys_ = Object.keys(map_);
for(key_ in keys_){
var value_ = map_[keys_[key_]];
template = template.replace( '{{' + keys_[key_] + '}}', value_);
};
return template;
}
function get_todayString(){
var sep = '';
if(arguments.length){
sep = arguments[0]
}
var dtm = new Date();
return [
('' + dtm.getFullYear()).slice(-2),
('0' + (dtm.getMonth() +1)).slice(-2),
('0' + dtm.getDate()).slice(-2)
].join(sep);
}
function get_nowTimeString(){
var sep = '';
if(arguments.length){
sep = arguments[0]
}
var dtm = new Date();
return [
('0' + dtm.getHours()).slice(-2),
('0' + dtm.getMinutes()).slice(-2)
].join(sep);
}
function get_todayDayString(){
var aryDay = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var dtm = new Date();
var dw = dtm.getDay();
return aryDay[dw].substr(0, 3);
}
function doProcess(){
// merge template
var template = get_template();
var map_ = {
'date_str' : get_todayString('/'),
'day_str' : get_todayDayString(),
'time_str' : get_nowTimeString(':'),
//clip_text : Editor.GetClipboard(0),
'clip_text' : ''
};
var merged_template = merge_map(template,map_);
// screen operation
Editor.GoFileEnd(0);
Editor.InsText(merged_template);
Editor.Left(0);
}
// -------------- entry point
if(typeof(Editor) !== 'undefined'){
doProcess();
} else {
if(typeof(WScript) !== 'undefined'){
WScript.Echo('This script is for sakura macro.');
} else {
console.log('This script is for sakura macro.');
}
}
}())
(function(){
///////////////////////////////////////
// here-string CRLF
// ↓↓↓↓↓↓↓↓↓
var herestrings = function(){
/*
---
created: {{date_str3}}
---
# {{date_str2}}
## memo : {{date_str}} ({{day_str}}) {{time_str}} :
- {{clip_text}}
*/
}
function replace_all(string, target, replacement) {
var result = "";
var offset = 0;
var target_length = target.length;
if (target_length === 0) {
for (var i = 0, c = string.length; i < c; i++) {
result += string[i];
result += replacement;
}
if (result.length)
return result.substr(0, result.length - replacement.length);
return result;
}
do {
var i = string.indexOf(target, offset);
if (i === -1) {
result += string.substring(offset);
return result;
}
result += string.substring(offset, i);
result += replacement;
offset = i + target_length;
} while (true);
}
if(!Object.keys){
Object.keys = function(obj){
var keys = [];
for(var i in obj){
if(obj.hasOwnProperty(i)){
keys.push(i);
}
}
return keys;
};
}
function get_template(){
var sep = '\r\n';
if(arguments.length){
sep = arguments[0]
}
var template = herestrings.toString().split(sep).slice(2,-2).join(sep);
return template;
}
function merge_map(template, map_){
var keys_ = Object.keys(map_);
for(key_ in keys_){
var value_ = map_[keys_[key_]];
template = replace_all(template, '{{' + keys_[key_] + '}}', value_);
};
return template;
}
function get_todayString(){
var sep = '';
if(arguments.length){
sep = arguments[0]
}
var dtm = new Date();
return [
('' + dtm.getFullYear()).slice(-2),
('0' + (dtm.getMonth() +1)).slice(-2),
('0' + dtm.getDate()).slice(-2)
].join(sep);
}
function get_nowTimeString(){
var sep = '';
if(arguments.length){
sep = arguments[0]
}
var dtm = new Date();
return [
('0' + dtm.getHours()).slice(-2),
('0' + dtm.getMinutes()).slice(-2)
].join(sep);
}
function get_todayDayString(){
var aryDay = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
var dtm = new Date();
var dw = dtm.getDay();
return aryDay[dw].substr(0, 3);
}
function doProcess(){
// merge template
var template = get_template();
var date_str = get_todayString('/');
var day_str = get_todayDayString();
var time_str = get_nowTimeString(':');
var date_str2 = replace_all(date_str,'/','') + '.md';
var date_str3 = '20' + replace_all(date_str,'/','-') + 'T' + time_str + ':00+09:00';
var clip_text = Editor.GetClipboard(0);
var map_ = {
'date_str' : date_str,
'day_str' : day_str,
'time_str' : time_str,
'date_str2' : date_str2,
'date_str3' : date_str3,
'clip_text' : clip_text
}
var merged_template = merge_map(template,map_);
// screen operation
Editor.GoFileEnd(0);
Editor.InsText(merged_template);
Editor.Left(0);
}
// -------------- entry point
if(typeof(Editor) !== 'undefined'){
doProcess();
} else {
if(typeof(WScript) !== 'undefined'){
WScript.Echo('This script is for sakura macro.');
} else {
console.log('This script is for sakura macro.');
}
}
}())
以下でバグがあった
// global function
function get_todayString(sep){
sep = sep ||'/';
var dtm = new Date();
return [
('' + dtm.getFullYear()).slice(-2),
('0' + (dtm.getMonth() +1)).slice(-2),
('0' + dtm.getDate()).slice(-2)
].join(sep);
}
// global function
function get_todayString(sep){
if(typeof(sep) === 'undefined') sep='/';
var dtm = new Date();
return [
('' + dtm.getFullYear()).slice(-2),
('0' + (dtm.getMonth() +1)).slice(-2),
('0' + dtm.getDate()).slice(-2)
].join(sep);
}