sakai-memoru
11/15/2019 - 7:16 AM

lock Sakura Macro::open_journal.jse

Sakura Macro::open_journal.jse

  • メモを、作業ログ(ジャーナル・メモと呼ぶ)に、書くためのmacro。

  • Editorで作業中に、簡単なメモを、作業ログとして取りたい時がある。この要求に対応したマクロ。日付で設定される「yyMMdd.md」ファイルにメモを書き出す。

  • 仕様は、以下。

    • ジャーナル・メモファイル名:yyMMdd.md (例:191115.md)
    • ジャーナル・メモの蓄積先:Mydocument配下の'journal'フォルダ。なければ作成する。(c:\users\<user_name>\Documents\journal配下)
    • GitJournal (SmartPhoneソフト:日記をGitHubに蓄積して閲覧可能とするソフト)の仕様にあわせ、ファイルの初めに、yamlのヘッダを付与。
      • journalを、GitHubのprivate repositoryとして、GitHubと同期。
      • GitJournal サイト
      • 当該のGitJournalで、PCのジャーナル・メモを、日記風にAndroid、iPhoneで閲覧可能となる。
  • open_journal.jseは、Edtorからも、WSHでも起動可能。より、PC起動時に、Startupで、WSHよりopen_journal.jseを起動すると、日付に対応したメモが立ち上がる。

cscript G:\users\sakai\AppData\Roaming\sakura\open_journal.jse
  • moduleの構成
例 \Users\<user_name>\AppData\Roaming\sakura配下
  ├- open_journal.jse
  ├- config
    + add_memoLineForJournal.jse
    + new_memoLineForJournal.jse

ジャーナルメモを呼び出したイメージ

GitJournal イメージ

(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.');
  }
}

}())

Bug Fix

  • 以下でバグがあった

    • 修正前:sepに''を入れると、'/'が入る。本当は何もセパレートしたくなかった。
    • returnが'19/11/17'ではなく、'191117'
// 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);
}