リストプラグイン作成

 数週間前から私はChangeLog形式でメモを取り、ローカル内ではありますがchalowを用いてHTML化して閲覧し、週報や日報を書く、という情報活用を行っております。
 検索用のCGIもついていてとても便利なのですが、私にとって一番使い勝手が悪いのが、リストがネストできないこと。つまり、

  • これが
    • できないの
  • です

 1段は"自動文字列置換"に下記のような記述を追加すればできるのですが。2段が欲しい…欲を言えば3段。ということで2段を手に入れるべく行動開始。

s!^-\s!<li>!gsm;

Text::Hatenaを使って大改造だ

 まず、はてな記法をHTML化するText::HatenaというCPANで配布しているプラグインを導入してみることに。

 最初はchalowを直接弄って、すべてをそれを介して変換させようとしましたが,難しくて手をつけられませんでした。

大人しくプラグイン方式で

 ということで大人しくプラグイン方式に。cl.confに下記を追記。

### はてな記法で記述
# http://overlasting.dyndns.org/2006-05-26-2.html
# usage:
use Text::Hatena;
sub t_h{ #はてな記法に変換
    my ($text) = @_;
    my $parser = Text::Hatena->new;
    $parser->parse($text);
    my $parsed_text = $parser->html;
    return $parsed_text;
}

 取りあえずHatena.pmだけ置いて動かしてみる…動くわけがない。
 CPANで入れてみたり、Cygwin内にできてしまったモジュール群にパスを通してみるも,動きはすれども出力されない状態。

Text::Hatenaの環境ができないって…オチひどすぎ

 自動置換文字列が上から順に処理されることを前提として…なんていろいろと弄ってみるもギブアップ。

自分でプラグインを書いてしまえ

□自動文字列置換

s!^-\s!<li>!gsm;

プラグイン

### はてな記法で記述
# usage:
sub hatena{ #はてな記法に変換
    my ($text) = @_;
    $text =~ s/\n/<br>/g; # 改行を<br>に変換

    ### -,-- : <ol>
    # Level.1
    $text =~ s/<br>\-\s(.*?)<br>/<br><ul><li>$1<\/ul><br>/g;
    $text =~ s/<br>\-\s(.*?)<br>/<br><ul><li>$1<\/ul><br>/g;
    $text =~ s/<\/ul><br><ul>/<br>/g;

    # Level.2
    $text =~ s/<br>\-\-\s(.*?)<br>/<br><ul id=l2><li>$1<\/ul id=l2><br>/g;
    $text =~ s/<br>\-\-\s(.*?)<br>/<br><ul id=l2><li>$1<\/ul id=l2><br>/g;
    $text =~ s/<\/ul id=l2><br><ul id=l2>/<br>/g;
    $text =~ s/<\/ul><br><ul id=l2>/<br><ul id=l2>/g;
    $text =~ s/<\/ul id=l2><br><ul>/<\/ul id=l2><br>/g;

    $text =~ s/<br>/\n/g; # <br>を改行に戻し
    return $text;
}

 で、次のように使う。

{{hatena('
- Can I List Level3?
- TesTes
- TestTest
-- This is Level2.
-- This is Level2, too.
- OK
')}}

するとこんな風に表示される。

  • Can I List Level3?
  • TesTes
  • TestTest
    • This is Level2.
    • This is Level2, too.
  • OK

 また、ulをolにして"-"を"+"に変えれば……

  1. Can I List Level3?
  2. TesTes
  3. TestTest
    1. This is Level2.
    2. This is Level2, too.
  4. OK

 英語はひどいけどchalowはハッピー。