日付が変わるごとに見出しを入れるJavaScriptマクロ(サクラエディタ)

サクラエディタのJavaScriptマクロで、ツイートの絶対年月日がブレイクする位置に区切りの見出しをつける

サクラエディタのJavaScriptマクロで、ツイートの絶対年月日がブレイクする位置に区切りの見出しをつける

// datekaiseki.js
// 全選択してテキストを取得
Editor.SelectAll();
var text = Editor.GetSelectedString();

// 改行コードで分割して1行ずつ処理
var lines = text.split(/\r?\n/);
var result = [];

// 英語の月名を数値に変換するマッピング
var monthMap = {
    "Jan": 0, "Feb": 1, "Mar": 2, "Apr": 3, "May": 4, "Jun": 5,
    "Jul": 6, "Aug": 7, "Sep": 8, "Oct": 9, "Nov": 10, "Dec": 11
};

var lastDate = null; // 直前の行のDateオブジェクトを記録

for (var i = 0; i < lines.length; i++) {
    var line = lines[i];
    
    // 行内から「Nov 1, 2020」や「Nov 3, 2021」のような形式を正規表現で探す
    var match = line.match(/([A-Z][a-z]{2})\s+(\d{1,2}),\s+(\d{4})/);
    
    if (match) {
        var monthEn = match[1];
        var dayNum  = parseInt(match[2], 10);
        var yearNum = parseInt(match[3], 10);
        var monthNum = monthMap[monthEn];
        
        if (monthNum !== undefined) {
            // 現在の行の日付オブジェクトを作成 (時刻は00:00:00に統一)
            var currentDate = new Date(yearNum, monthNum, dayNum);
            
            if (lastDate === null) {
                // 初回のみ無条件で見出しを出力
                var yearStr = currentDate.getFullYear();
                var monthStr = ("0" + (currentDate.getMonth() + 1)).slice(-2);
                result.push("## " + yearStr + "-" + monthStr + "-");
            } else {
                // 直前の日付からの経過日数を計算
                var diffTime = currentDate.getTime() - lastDate.getTime();
                var diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
                
                // 日付が未来に進んでいる場合、その日数分だけ見出しを出力する
                if (diffDays > 0) {
                    for (var d = 0; d < diffDays; d++) {
                        var targetDate = new Date(lastDate.getTime());
                        targetDate.setDate(targetDate.getDate() + d + 1);
                        
                        var yearStr = targetDate.getFullYear();
                        var monthStr = ("0" + (targetDate.getMonth() + 1)).slice(-2);
                        
                        // ループの最後(=現在の行と同じ日付)は実際のデータがあるので通常見出し、
                        // それより前のループ(=途中のスキップされた日付)は「|なし」を付与
                        if (d < diffDays - 1) {
                            result.push("## " + yearStr + "-" + monthStr + "-|なし");
                        } else {
                            result.push("## " + yearStr + "-" + monthStr + "-");
                        }
                    }
                }
            }
            lastDate = currentDate; // 基準日を更新
        }
    }
    
    // 元の行を追加
    result.push(line);
}

// 編集中のテキストを更新
Editor.InsText(result.join("\r\n"));

// 選択状態を解除してクリップボードにコピー
Editor.SelectAll(0);
Editor.Copy(0);

【欠点1】:月初あたりの初回ツイート日以前において[ツイートなし=見出しなし]は人間が判断して補う必要がある

  • 例えば、## 2019-09-06が初回ツイートなしだとしたら、[## 2019-09-(01)|なし][## 2019-09-(02)|なし][## 2019-09-(03)|なし][## 2019-09-(04)|なし][## 2019-09-(05)|なし]を人間が手動で補う。
  • (01)~(05)は、連番マクロhiduke.jsを使うなら、打ち込む必要はない。[## 2019-09-]を5行分挿入しておくだけでよい。

【欠点2】:月末あたりの最終ツイート日以降において[ツイートなし=見出しなし]は人間が判断して補う必要がある

  • 例えば、## 2019-09-30がツイートなしだとしたら、## 2019-09-29があれば、そこで見出しが止まっているので、## 2019-09-30を人間が手で補う必要がある。
  • 連番マクロhiduke.jsを使うなら、[## 2019-09-]までしか打ち込む必要がない。