🌸

[sakura macro]編集中のファイルの最終行に、簡易テンプレートで生成した行を挿入する

5 min read

[sakura macro]編集中のファイルの最終行に、簡易テンプレートで生成した行を挿入する: insert_memoLine.jse

overview

  • sakura editor歴、15年以上の私が使っているMacroを公開する。
  • System Engineerにとって、さらっと使えるマクロなので、興味がある方はご利用を。

environment

  • サクラエディタ Ver. 2.2.0.1
  • Marco environment : WSH(Windows Script Host) / JScript

Gist

Script

  • script folder : G:\Users\user name\AppData\Roaming\sakura
  • script file name : insert_memoLineWithTemplate.jse
(function(){

///////////////////////////////////////
// here-string CRLF
//  ↓↓↓↓↓↓↓↓↓
var herestrings = function(){
/*

## memo : yy/MM/dd(ddd)hh:mm :

- CLIP

*/
}

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);
}

function get_template(sep){
  sep = sep || '\r\n';
  var template = herestrings.toString().split(sep).slice(2,-2).join(sep);
  return template;
}

function merge_map(template, map_){
  var merged = template;
  for(key_ in map_){
    if(map_.hasOwnProperty(key_)){
      var value_ = map_[key_];
      merged = replace_all(merged, '{{' + key_ + '}}', value_);
    }
  };
  return merged;
}

var get_dateMap = function(dtm){
  var retMap = {};
  retMap.YYYY = '' + dtm.getFullYear();
  retMap.yy = retMap.YYYY.slice(-2);
  retMap.MM = ('0' + (dtm.getMonth() + 1)).slice(-2);
  retMap.dd = ('0' + dtm.getDate()).slice(-2);
  retMap.hh = ('0' + dtm.getHours()).slice(-2);
  retMap.mm = ('0' + dtm.getMinutes()).slice(-2);
  retMap.ss = ('0' + dtm.getSeconds()).slice(-2);
  retMap.DDD = get_dayString(dtm);
  retMap.aaaa = get_dayString(dtm, 0);
  return retMap;
}

var convertTo_statement =function(format){
  var statement = format;
  var aryForKey = ['yyyy', 'yy', 'MM', 'dddd', 'ddd', 'dd', 'hh', 'mm', 'ss','CLIP'];
  var aryForVal = ['{{YYYY}}', '{{yy}}', '{{MM}}', '{{aaaa}}', '{{DDD}}', '{{dd}}', '{{hh}}', '{{mm}}', '{{ss}}','{{clip_text}}'];
  for(var i in aryForKey){
    var key_ = aryForKey[i];
    var val_ = aryForVal[i];
    statement = replace_all(statement, key_, val_);
  }
  return statement;
}

var get_dayString = function(dtm,num){
  if(typeof(num) === 'undefined') num=3;
  var aryDay = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"];
  var dw = dtm.getDay();
  var ret = aryDay[dw];
  //WScript.Echo(ret);
  if(num){
    ret = ret.substr(0, num);
  }
  return ret;
}

function doProcess(){
  var dtm = new Date();
  var template = get_template();
  // merge template
  var map_ = get_dateMap(dtm);
  map_.clip_text = Editor.GetClipboard(0);
  var converted_template = convertTo_statement(template);
  //// Editor.TraceOut(converted_template);
  var merged_template = merge_map(converted_template, map_);
  //// Editor.TraceOut(merged_template);
  // 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.');
  }
}

}())

note

functions

  • Main process
    • doProcess() // main process
  • Sub function
    • get_template() // herestrings()よりTemplate文字列を取得
    • get_dateMap() // 日付データをマップで取得
      • get_dayString()
    • convertTo_statement() // templateをMerge用templateに変換
    • merge_map() // MapデータをもとにTemplateをMerge
      • replace_all()

template strings

  • herestrings()関数に、記述する。以下、記述例。「/」「/」の間の行がテンプレート文字列となる。
///////////////////////////////////////
// here-string CRLF
//  ↓↓↓↓↓↓↓↓↓
var herestrings = function(){
/*

## memo : yy/MM/dd(ddd)hh:mm :

- CLIP

*/
}

  • Templateで使われる予約文字列
    • 'yyyy' :年4桁 2021
    • 'yy'  :年2桁 21
    • 'MM'  :月2桁 06
    • 'dddd' :曜日 Monday
    • 'ddd'  :曜日 Mon
    • 'dd'  :日付2桁 01
    • 'hh'  :時2桁
    • 'mm'  :分2桁
    • 'ss'  :秒2桁
    • 'CLIP' :クリップボードから取得した文字列

// --- End of markdown