いまさらですが、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![]()

