エピグラフ・ランダム出力 JavaScript

私は名言集のようなものが好きである。昔の作家は愛する詩人・作家の文言を,象徴的意味を担うエピグラフ(題銘)として,己の作品にしばしば掲げたものである。西洋の著述家には現在もこの伝統が生きている。私もエピグラフの伝統が好きである。でもって,当サイトにも各ページにエピグラフを掲げたいと思い,短い JavaScript プログラムをひとつ書いた。

名言集テキストデータベースから指定した数だけランダムに名言を選択して,出力関数をしるしたブログ箇所にエピグラフを出力する。コード epigraphs.js は以下のようなものである。

// -*- coding: utf-8; mode: javascript; -*-
// Show Epigraphs
function epigraphs(outnum) {// outnum: 出力個数
    // 名言集 配列
    // - 追加するときは以下の形式で。' と , に注意
    //     '<div id="epgr">エピグラフ</div>' +
    //     '<div id="epgrath">— 著者</div>',
    // - 出力様式は id: epgr, epgrath を css で調整する。
    var words = [
        '<div id="epgr">Sator arepo tenet opera rotas<br />' +
        '種蒔く者は収穫を保有し収穫は種蒔く人を保有する</div>' +
        '<div id="epgrath">— ラテン語の格言</div>',
        '<div id="epgr">Hello darkness, my old friend</div>' +
        '<div id="epgrath">— ポール・サイモン</div>',
        '<div lang="grc" id="epgr">πάντα ῥεῖ. 萬物は流轉す</div>' +
        '<div id="epgrath">— Herakleitos</div>',
        '<div id="epgr">夜熟睡しない人間は多かれ少なかれ罪を犯している</div>' +
        '<div id="epgrath">— モーリス・ブランショ</div>',
        // このようにカンマ区切りで,ずらずら,いろいろ,名言を書いておく
        '<div id="epgr">おい小池,そろそろだ</div>' +
        '<div id="epgrath">— 警視庁</div>'
    ];
    // 引数チェック: 数値以外は初期値 2 を設定
    var wlen = words.length; // 名言集個数
    var num = 2;
    if (outnum != null) {
        // 引数指定がある場合
        if (isNaN(outnum)) {
            // 数値でない場合デフォルト
        } else {
            if (outnum > wlen) {
                // 名言集個数以上もデフォルト
            } else {
                num = outnum;
            }
        }
    } // 引数指定がない場合デフォルト
    // 乱数でランダムに指定個数分出力する。
    var alrd = new Array(); // 既出リスト
    var rand = wlen;        // 初期値は起こりえない数値
    var flag = true;        // 出力可フラグ
    while (num--) {
        rand = (Math.floor(Math.random()*1000)) % wlen;
        for (var i = 0; i < alrd.length; i++) {
            if (rand == alrd[i]) {
                // 同じものが選択されたら再度乱数を取得
                num++; flag = false; break;
            }
        }
        if (flag) {       // 初出のもののみ出力
            document.write(words[rand]);
            alrd.push(rand);
        } else {
            flag = true;
        }
    }
}

乱数を取得して三桁の整数値にし,名言データ配列数で割った剰余で出力すべき名言をポイントする。これで実行する都度「ランダム」な選択を実現している。つまりいまの版では,名言集は 1000 個までということになる。あまりに名言の数が多いと読込み時間もバカにならなくなるだろうから,1000 を越えるようなら,名言集を SQLite3 にでも格納して,Servlet がテキストを供給するように書き直した方がよいかも知れない。

名言データベースは上のコードの words[ ] 配列の要素として定義してある。名言とは言っても,私の勝手な思いつきで拾ったものなので,「おい小池,そろそろだ」みたいな愚にもつかないものも含まれている。面白いと思う方は,ご自分で名言集を構築してこのスクリプトを活用していただきたい。私のコードでは,出力スタイルの ID を埋め込むようになっていて,スタイルシートで表示様式をコントロールする前提である。

使い方は,epigraphs.js をロードしておき,エピグラフを表示したいブロックに以下のようにマークアップしておく。ブログならヘッダーテンプレートに書いておくなどすればよい。

<script language="JavaScript">epigraphs(3);</script>

引数(パーレンの中)に出力したいエピグラフの数を指定する。デフォルトは 2。

いま,このブログの右上に出ていますよね? リロードするたびに文句が変るはずである。