nsmm 〜 日記システム名称未定

名称未定のままはや5年…(汗)。

  1. これは何?
  2. 使い方
    1. インストール
    2. はじめのいっぽ
    3. 日記ソースの書き方
    4. カスタマイズ
  3. ダウンロード
  4. 稼働例
  5. その他

1. これは何?

Web 日記を手軽に書くことを目的に作成された awk スクリプトです。同様のものとしては hnsTDSGNSnDiary などがありますが(このへんから辿るもよし)、それらと同じようなもので、これらが持つ機能の多くは nsmm も備えています。特徴としては、

てなことがあげられます。

2. 使い方

2.1 インストール

まず、awk をインストールします。Solaris などにデフォルトで存在する /usr/bin/awk や /usr/bin/nawk は時刻を扱う関数が存在しないので動きません。具体的には、gawk 2.13 以上をインストールしてください。なお、FreeBSD は 5 系から nawk に変更されていますので、別途 gawk を入れる必要があります。4 系ならば始めから GNU awk が入っています。DOS/Windows 環境では、mawk+MBCS が使えます。DOS/Win の mawk は vector からダウンロードできます。同じところに (j)gawk もありますが、なぜか動作しません(深く追及していないので原因はわかりません)。また cygwin な環境があれば、それに含まれる awk でも問題なく動作します。オリジナルの mawk には時刻を扱う関数がないようなので、UNIX 環境に mawk をインストールしても nsmm は動作しません(Debian では標準で mawk が入っているようです)。

次に、nsmm をダウンロードします。展開した後、インストールした awk に合わせて nkf などでスクリプトの文字コードを変換します。具体的には、UNIX 環境または cygwin なら EUC、DOS/Windows の mawk なら SJIS に変換します。日記ソースもこの文字コードで書きます。

環境に合わせて config.awk を書き換えます。最低限以下を設定してください。

diarystart
日記を開始する日付。これより以前は日記ソースが存在していても無視されます。diarystart = days_from_epoch(年, 月, 日) の形で指定します。
var["diarydir"]
日記ソースファイルを置くディレクトリ。デフォルトでは UNIX 環境では $HOME/diary、DOS/Win では C:\diary に設定されます(自動判別します)。
var["outputdir"]
HTML を出力するディレクトリ。デフォルトでは UNIX 環境では $HOME/public_html/diary、DOS/Win では C:\diary\html に設定されます。

ディレクトリを作成します。var["diarydir"] で指定したディレクトリを作成し、さらにその下に 2000/ など年ごとにサブディレクトリを作ります。また、var["outputdir"] で指定したディレクトリも作ります。自動で mkdir したりはしません(そもそも awk にディレクトリを扱う機能がありません。残念ながら)。

以上で最低限必要な準備ができました。

2.2 はじめのいっぽ

var["diarydir"] で指定したディレクトリの下の YYYY/dYYYYMMDD.hnf というファイルに日記を書きます。ファイルのフォーマットは、hnsで用いられる hnf 形式とほぼ互換です。2000/5/28 の日記として、たとえばこんなのを 2000/d20000528.hnf に書いてみましょう。

TENKI 晴
OK

NEW 朝
朝〜、朝だよ〜。朝ご飯食べて学校行くよ〜。

NEW 昼
舞と佐祐理さんと俺と3人で昼ご飯。

NEW 夜
真琴にコンニャク攻撃を食らった。

これをセーブしたら、以下のようにして nsmm を起動します。awk の実行ファイル名、パスは環境に応じて適宜変更してください。シェルスクリプト、あるいはバッチファイルにしておくと便利でしょう(アーカイブに同梱されています)。

> awk -f nsmm.awk -f config.awk

うまく設定ができていれば、var["outputdir"] に指定したディレクトリに index.html と 200005c.html ができています。どちらも今書いた 20000528.hnf に対応した部分が、以下のように変換されています。

<!-- 2000/05/28 start --> <h2><a name="20000528" href="200005c.html#20000528">2000年5月28日(日)</a> [晴]</h2> <h3><a name="200005281" href="200005c.html#200005281">■</a> 朝</h3> <blockquote> 朝〜、朝だよ〜。朝ご飯食べて学校行くよ〜。 </blockquote><!-- section end --> <h3><a name="200005282" href="200005c.html#200005282">■</a> 昼</h3> <blockquote> 舞と佐祐理さんと俺と3人で昼ご飯。 </blockquote><!-- section end --> <h3><a name="200005283" href="200005c.html#200005283">■</a> 夜</h3> <blockquote> 真琴にコンニャク攻撃を食らった。 </blockquote><!-- section end --> <!-- 2000/05/28 end -->

index.html には、最新5日分が日付逆順に出力されます。また、200005c.html には2000年5月下旬の日記が日付順に出力されます。

2.3 日記ソースの書き方

前述の通り、日記ソースのフォーマットは、hnf 形式とほぼ互換です。詳しくはそちらを参照してください。ただし、以下のような違いがあります。

サポートしているコマンド
NEW, LNEW, SUB, LSUB, LINK, URL, UL(/UL), OL(/OL), LI, DL(/DL), DT, DD, PRE(/PRE), CITE(/CITE), P(/P), DIV(/DIV), SPAN, FN(/FN), STRIKE, LSTRIKE, STRONG, FONT, IMG, ALIAS。これ以外のコマンド(CAT, MARK, RLINK, RLNEW など) は結果に何の影響も与えない、またはコマンドとして認識されません。また、独自拡張として VERBATIM(/VERBATIM) というコマンドが追加されています。これは指定した範囲について hnf としての解析を中止し、ソースに書かれている内容をそのまま出力します。hnf では表現できない複雑な HTML を書くときに使います。
リンク補完
LINK, LNEW など、URL を引数に取るコマンドについては、自分の過去の日記にリンクを張るときに #200005281 または #{2000,5,28,1} と書くだけで、自動的に 200005c.html#200005281 のように URL が変換されます。

2.4 カスタマイズ

config.awk でおこないます。nsmm.awk にある設定を config.awk で上書きするので、デフォルトでは気に入らない部分だけ config.awk で書き換えればいいです。指定できるキーワードとその意味については、nsmm.awk に詳しく書いてあるので、そちらを参照してください。入出力ファイル名や出力スタイルの変更など、たいていのことは自由に変更できます。ここでは config.awk および、head.html, foot.html で使われる特殊な変数の指定について触れます。

nsmm.awk をじーっと見ればわかりますが、var["variable"] の内容は、${variable} で参照できます。${variable} は入れ子にできるので、たとえば var["foo"] = "bar", var["bar"] = "baz" のとき、${${foo}} の値は baz になります。また、以下の特殊な記法を用いることにより、簡単な条件判断を記述できます。

${variable}
var["variable"] の値を参照
${variable+value}
var["variable"] が空文字列でなければ value
${variable-value}
var["variable"] が未定義または空文字列ならば value
${variable?value1:value2}
var["variable"] が value1 と等しければ value2
${variable!value1:value2}
var["variable"] が value1 と異なれば value2
${variable~RE:value}
var["variable"] が正規表現 RE にマッチすれば value
${variable!~RE:value}
var["variable"] が正規表現 RE にマッチしなければ value
$v{variable}
日記ソース中で指定したユーザー変数(TENKI, BGM,...)
$v{variable+value}
$v でも同じような記法が可能
$e{variable}
環境変数 variable を参照する
$t{timefmt}, $T{timefmt}
strftime(3) 上位互換のフォーマットに従って時刻文字列に変換する。
$i{filename}
filename の内容を挿入する。
$i{!command}
command を実行し、その標準出力を挿入する
$s{variable=value}, $S{variable=value}
変数、ユーザ変数に値を代入する

なお、$, {, } などの特殊文字をエスケープする手段はありません。どうしても必要ならば、&#36; のように実体参照で記述してください(将来的にはこれは解消したいな…)。

config.awk は awk スクリプトなので、awk の制御構造で自由に記述をすることができます。また文字列の指定についても awk の制限を受けるので、「"」という文字を記述するには \" のようにエスケープする必要があります。head.html, foot.html はこのような制限はありません。スクリプトを見ると行末にはすべて ; がついてますが、これは特になくてもかまいません。

3. ダウンロード

古いものも残してあるけど、できるだけ新しいものを使いましょう。

4. 稼働例

作者の側で把握してるものについて勝手にリンクしてます。敬称略。

なお、こちらにはどさにっきの日記ソース、設定ファイルがあります。また、ここには公開版よりも新しい作業中のスクリプトが置かれていることもあります。なお、サフィックスが .html のものについてはこの Web サーバの仕様によってバナー広告が勝手に付加されてしまうので、実際に使っているものとは異なります。

5. その他

無保証です。これを使って何か問題が起きるとかいうことはあまりないとは思いますが、自己責任で使ってください。著作権は特に主張しません。無断改変大いに結構。本スクリプト中には、awk を使う上で日記作成とはまったく別の目的にも有用なものが多く含まれていると思いますが、部分転用についても問題なし。改良やバグつぶしをされた場合は、わしもそのご相伴にあずかりたいので連絡してくれるとうれしい。

やまぐちたかのり(やまや)