古い記事
ランダムジャンプ
新しい記事
いまさらですが、Wiki的(またはMarkdown的)なリスト記法を処理して HTML の ul, li に変換するスクリプトを書いてみました。たまには再帰するプログラム書かないと、というリハビリ的な感じです。車輪の再発明は気にしない。というか、そもそも、ブログツール chalow 用に書いたもの。現在テスト中。

仕様

  • 対応するリスト記法
    • ("[ ]" は半角スペースを表す)
    • 行頭の "-" の連続
      • サブアイテムは "--[ ]", "---[ ]" という順に深くなる。
        - 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
conv ul li test 2016-01-23