アプリケーション

【日記】1ヶ月分の日記の雛形を作る[TextExpander+JavaScript]

1ヶ月分の日記の雛形を作る TextExpander スニペットを作りました。
中身は JavaScript です。

TextExpander は有料で代替アプリもたくさんあるので使ってる人少ないと思いますけど参考になれば。

1ヶ月分の日記の雛形を作るスニペット

今までは1日分の雛形を使ってましたが、毎日起動するのがめんどくさいしたまに忘れるので1ヶ月分くらい作り置きしたかったんですよね。

【日記】Dynawrite の登録語句で入力していた日記テンプレを TextExpander のスニペットに移管(TextExpander に JavaScript ライブラリを追加)@rabirgoです。 日記ネタです。 https://rabirgo.net/dynawrite-template-mor...

TextExpander の snippet で JavaScript 書くのめんどくさいというイメージから放置してました。
後述しますけど今回もちょっとハマって1時間くらいかかったかな。

起動日の翌日から31日分作るようにしてます。
1〜2行目については仕込みが必要なので前回の記事を参照ください。

%snippet:,,momentjs%
%snippet:,,momentlocalesjs%
moment.locale('ja');
var str = new String();
var d = moment();
for (var i = 0; i < 31; i++) {
d.add(1, 'days');
var y = d.clone().add(-1, 'days');
var t = d.clone().add(+1, 'days');
var l = d.clone().add(-355, 'days');
str += d.format('YYYY-MM-DD(ddd)!(YYYY-MM-DD +09:00)') + ' ブログ本、\n' +
d.format('\t#YYYY-MM-DD #dddd #日記 #YYYY #YYYY-MM #MM月 #MM-DD') + '\n' +
y.format('\t← #YYYY-MM-DD #dddd') + ' ' +
t.format('\t#YYYY-MM-DD #dddd →') + '\n' +
l.format('\t去年の10日後 #YYYY-MM-DD') + '\n' +
"\t#気分 "+ '\n' +
"\t#天気体感 "+ '\n' +
"\t#blog記事数、状況 "+ '\n'  +
"\tログ" + '\n' + '\t\n' +
"\tTweet" + '\n' + '\t\n' ;
}
str;

私はテキストエディタに出力して、必要な部分だけ日記ツールとして使ってる Dynalist へカット&ペーストでしてます。

Dynalist 上でこんな感じの表記になります。

Dynalist での日記向けタグDynalist での日記向けタグ

31日分にしてるのは、雛形を変えたくなった時に入れ替えしやすいようにです。
1年分とか作っちゃったら変更するの大変なので・・。

ハマったポイント

JavaScript あまり得意でないのでハマりました。

moment オブジェクトの仕様が分からなかった

moment というよりも JavaScript のオブジェクトの仕様を理解してないのかも。

例えば

// NG パターン
var today = moment(); // 今日
var yesterday = today.add(-1, 'days'); // 今日から1日引いて昨日の変数を作りたい

こんな感じのソースは意図通りに動かないんですよね。

まず add が破壊的メソッドのようなので today の値が変わってしまう。

次に別の変数に代入してるのは参照渡しになるようで、today や yesterday の値を変更するとどちらも同じように変わってしまいます。

結果的に前日のオブジェクトを作るのは

var y = moment(d.format('YYYY-MM-DD')).add(-1, 'days');

という手法でできました。

もっとスマートなやり方がありそうだけどまあ良しです。

とここまで書いてスマートなやり方ありました。
公式ページっぽいところに書いてあった。ハマりがちらしい。

The moment object in Moment.js is mutable. This means that operations like add, subtract, or set change the original moment object.
When first using Moment.js many developers are confused by scenarios like this:

こうするのね。

var y = d.clone().add(-1, 'days');

TextExpander + JavaScript のテキスト出力仕様を忘れてた

Ruby なんかだと print 文があるんですが、知る限りだと JavaScript ってないんですよね。
window.print() や console.log() ではない、標準出力に出力するメソッドはないんじゃないかなと。

ではどうやって出力するのかというと、TextExpander の仕様としては最後の変数を評価するようです。

よって、最後の str のみが評価されてテキストになります。
つまり、ループの中で何回も str; を使っても最後の1回しか評価されないんですよね。ってところでハマりました。

さいごに

これで、たまに雛形作るの忘れて手動で日付変えながら雛形作るって苦行から解放されそうです。

Taskuma のログとも組み合わせてブラッシュアップして、振り返りが効率的にできるようにしたいな。

Evernote に保存されたら整形されて日記ツールとして使ってる Dynalist に自動登録されるというのが理想なんですけど API なんかも使わないといけないだろうからハードルが高そうです。

ABOUT ME
rabirgo
うさぎ年(rabbit)おとめ座(virgo)生まれの rabirgo です。 2019年よりフリーランスとして活動しています。 よかったら Twitter フォローお願いします! Follow @rabirgo

COMMENT

メールアドレスが公開されることはありません。