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-&gt;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

以上。