FSWikiのwiki記法形式のファイルを一括でHTMLに変換する
FSWiki Ver.3.6.2。
PukiWiki よりも FreeStyle Wiki が好きで使ってたのですが、諸事情により MindTouch に移行する必要が発生してしまいました。
FSWiki <=> PukiWiki の変換はそんなに面倒じゃないのですが、MindTouchはDB内にHTML形式でページを持つので、data/*.wiki ファイルを変換してやらなきゃいけない。
でも、それなら FSWiki が自分でそういうパーザを持ってるよね、と思ってソースを読んでたらすぐにありました。
lib/Wiki.pm から抜粋
#=============================================================================== # <p> # 引数で渡したWikiフォーマットの文字列をHTMLに変換して返します。 # </p> # <pre> # my $html = $wiki->process_wiki(文字列); # </pre> #=============================================================================== sub process_wiki { my $self = shift; my $source = shift; my $mainflg = shift; if($self->{parse_times} >= 50){ return $self->error("Wiki::process_wikiの呼び出し回数が上限を越えました。"); } $self->{parse_times}++; my $parser = Wiki::HTMLParser->new($self,$mainflg); $parser->parse($source); $self->{parse_times}--; return $parser->{html}; }
そのまんまじゃん。
ということで、こいつに文字列を渡してやれば HTML に変換してくれそうです。
実験
以下のファイルをtest.plという名前でFSWikiのルートディレクトリに作成します
#!/usr/bin/perl use lib './lib'; use strict; use Wiki; use Util; use Jcode; my $wiki = Wiki->new('setup.dat'); print $wiki->process_wiki("!!!hoge");
$ perl test.pl
<h2>hoge</h2>
できてるっぽい!
一括変換
ということで data/*.wiki を読み込んで、 process_wiki() に渡してやって、ファイルに出力してやれば良さそうです。
まずひとつの .wiki ファイルを読み込んで HTML を標準出力に吐くスクリプト。
translate.pl
#!/usr/bin/perl use lib './lib'; use strict; use Wiki; use Util; use Jcode; use HTML::Template; my $input = ""; open(IN, $ARGV[0]); while (<IN>) { $input .= $_; } close(IN); my $wiki = Wiki->new('setup.dat'); print $wiki->process_wiki($input);
簡単ですね。Perl ってこんな感じでいいのかしら?
data/ ディレクトリ内の *.wiki ファイルを translate.pl にかけて html/ ディレクトリに保存するスクリプト。
#!/bin/sh for wiki in `find data -maxdepth 1 -mindepth 1`; do perl translate.pl $wiki > html/`basename $wiki`.html done
まぁワンライナーですが。
実行
$ mkdir html
$ sh translate.sh
以上。