いまさらですが、Wiki的(またはMarkdown的)なリスト記法を処理して HTML の ul, li に変換するスクリプトを書いてみました。たまには再帰するプログラム書かないと、というリハビリ的な感じです。車輪の再発明は気にしない。というか、そもそも、ブログツール chalow 用に書いたもの。現在テスト中。
■コード (conv-ulli.pl)
■サンプルデータ (conv-ulli-test.txt)
■実行例
仕様
- 対応するリスト記法
- ("[ ]" は半角スペースを表す)
- 行頭の "-" の連続
- サブアイテムは "--[ ]", "---[ ]" という順に深くなる。
- a -- aa -- ab --- aba -- ac - b - c -- ca
- サブアイテムは "--[ ]", "---[ ]" という順に深くなる。
- 行頭の "-" とその前のスペース
- サブアイテムは例えば "[ ][ ]-[ ]", "[ ][ ][ ][ ]-[ ]" という順に深くなる。
- a - aa - ab - aba - ac - b - c - ca
- サブアイテムは例えば "[ ][ ]-[ ]", "[ ][ ][ ][ ]-[ ]" という順に深くなる。
- リストの開始タグと終わりタグ
- これらがないと、リストの終わりがわからなくなる。
- リスト中の空行を禁止するなどの措置が必要になり、個人的に困る。
- とりあえず、[ul][/ul]で囲む。
[ul] - a - aa bbb - ac - b bbb - c [/ul]
- これらがないと、リストの終わりがわからなくなる。
プログラムと実行例
■コード (conv-ulli.pl)
#!/usr/bin/env perl use strict; use warnings; my $str = join("", <>); $str =~ s{\[ul\](.+?)\[/ul\]}{make_ul_list_html($1)}gmse; print $str; sub make_ul_list_html { my ($str) = @_; my $new_str = ""; if ($str =~ m/^(-+|^ *-) /ms) { my $hd = $1; while ($str =~ m{^($hd .+?)(?=(^$hd |\z))}gms) { my $item_con = $1; $item_con =~ s{^$hd (.+?)(?=(^-+|^ *-|\z))}{}ms; my $item_str = $1; chomp $item_con; chomp $item_str; # $item_str =~ s{^\s+}{}gm; # 字下げスペース削除 $new_str .= "<li>$item_str" .make_ul_list_html($item_con)."</li>\n"; } } return $new_str ? "\n<ul>\n$new_str</ul>\n" : $str; }
■サンプルデータ (conv-ulli-test.txt)
hello [ul] - a <pre> abab ababa bababab </pre> - b - <img src="...jpg"> - bbbbb - <img src="...jpg"> - c [/ul] bye-bye [ul] - a -- b -- ababa bbbb --- bbbb -- c - fig.3 <table> <tr><th>hello</th><th>world</th><tr> <tr><td>100</td><td>2120</td><tr> <tr><td>150</td><td>1505</td><tr> </table> [/ul] the end
■実行例
% ./conv-ulli.pl < conv-ulli-test.txt hello <ul> <li>a <pre> abab ababa bababab </pre></li> <li>b <ul> <li><img src="...jpg"> <ul> <li>bbbbb</li> </ul> </li> <li><img src="...jpg"></li> </ul> </li> <li>c</li> </ul> bye-bye <ul> <li>a <ul> <li>b</li> <li>ababa bbbb <ul> <li>bbbb</li> </ul> </li> <li>c</li> </ul> </li> <li>fig.3 <table> <tr><th>hello</th><th>world</th><tr> <tr><td>100</td><td>2120</td><tr> <tr><td>150</td><td>1505</td><tr> </table></li> </ul> the end
(Mac OS X) % ./conv-ulli.pl < conv-ulli-test.txt > conv-ulli-test-res.html % open conv-ulli-test-res.html