Wikiスタイルを導入したAkiaryでは、日記を書くときにWiki記法で書けるようになります。
概要
ここでは、Wiki記法のパーサとしてFSWikiLiteを利用しています。同じようにYukiWikiの解析部を利用するような改造も可能だと思われますが(参考:blosxomのyukiwikix plugin)ここでは扱いません。
まだまだ完成度が低いですが、部分的にコードを公開してみます。私が普段使っているAkiaryを元に多少整理した?ものですが、
- Wikiスタイル
- WikiBack関連
- Permalink(DIDアンカー)改造
- BRタグマークアップ機能の無効化
- 「aciton」typo修正
を含んでいます。
また、FSWikiLite一式も一緒に設置されている必要があるのですが、それに対しても独自の改造を施してあります。そちらについては「改造内容」あたりを見るなどしてください。
方針
- 新規更新の時のみ、Wiki記法の解析とhtmlへの変換をする
- 修正更新のときは、htmlスルーで動作する
- Akiaryが本来備えている、改行文字とBRタグを相互に変換する機能は殺しています。(マークアップ的にバッティングするから)
なので、html直書きしたいときは、一度更新してから修正画面で書けばよいことになります。
逆に、修正画面でWikiスタイルを使うには、直接的な方法では不可能です。なぜなら、Akiaryは日記をhtmlに変換した状態で保存していて、html→Wiki記法への変換をするリーズナブルな方法がないからです。
実際のところ
ごちゃごちゃ書いていますが、ようは、次の2点だけで実現しています。
始めのほうで、FSWikiLiteのライブラリをrequireします。
require './lib/common.pl';
必要なところでWiki::process_wiki()を使います。
# FSWikiLiteのエンジンでwiki記法をパースする $BODY{$dids[0]} = &Wiki::process_wiki($BODY{$dids[0]});
コレだけです。あとはお膳立てみたいなもので、ライブラリを呼び出せるようにディレクトリ構造をFSWikiLiteのほうに合わせたり、そうそう、これは重要な点ですが全体的にEUC-JPで運用する必要があります。
それと、このまま動かそうとしても多分失敗すると思います。(FSWikiLite側の自作プラグインがバグっぽいことと、決め打ちでコーディングしている部分があることが原因。)
参考程度に考えていただければと思います。
差分
% diff -urN akiary.cgi.original akiary.cgi > akiary.cgi.diff
--- akiary.cgi.original 2004-12-07 16:25:15.448825600 +0900 +++ akiary.cgi 2004-12-07 19:06:26.228460800 +0900 @@ -7,6 +7,18 @@ # http://www.hi-ho.ne.jp/yakira/akiary/ # +require './lib/common.pl'; + +# version 0.51.ni03 2004.01.12 +# modfied by ISHIDA Naoto <not2000@anet.ne.jp> +# 1、「やーとぼーど」に報告されていたtypoバグ(aciton⇒action)を修正 +# 2、BRタグの扱いに関するBUGをFIX +# 3、Permalink機能の強化。 +# 4、FSWikiLiteのエンジンを呼び出してwiki記法をパースする +# 5、FSWikiLiteの拡張機能である、WikiBackを利用可能にする。TrackBack AutoDiscoveryは月別ログのみ対応。 +# 6、同時に、Bulkfeeds APIを利用した、RSS全文検索機能をつける。クエリーに渡すキーは各記事のタイトル。 +# 以上 + #-------------- # 設定(要変更) #-------------- @@ -183,9 +195,14 @@ $DATE{$dids[0]}=$date; $TITLE{$dids[0]}=$FORM{'title'}; $BODY{$dids[0]}=$FORM{'body'}; - $BODY{$dids[0]}=~s/\x0D\x0A/<br>/g; # 改行コード変換(Win) - $BODY{$dids[0]}=~s/\x0D/<br>/g; # 改行コード変換(Mac) - $BODY{$dids[0]}=~s/\x0A/<br>/g; # 改行コード変換(UNIX) + $BODY{$dids[0]}=~s/\x0D\x0A/\n/g; # 改行コード変換(Win) + $BODY{$dids[0]}=~s/\x0D/\n/g; # 改行コード変換(Mac) + $BODY{$dids[0]}=~s/\x0A/\n/g; # 改行コード変換(UNIX) + + # FSWikiLiteのエンジンでwiki記法をパースする + $BODY{$dids[0]} = &Wiki::process_wiki($BODY{$dids[0]}); + +# $BODY{$dids[0]} =~ s/\n/<br>/g; # 改行コード変換(html) $file=$date; $file=~s/^(\d{6}).*/$1.html/; @@ -214,9 +231,9 @@ $DATE{$dids[0]}=$date; $TITLE{$dids[0]}=$FORM{'title'}; $BODY{$dids[0]}=$FORM{'body'}; - $BODY{$dids[0]}=~s/\x0D\x0A/<br>/g; # 改行コード変換(Win) - $BODY{$dids[0]}=~s/\x0D/<br>/g; # 改行コード変換(Mac) - $BODY{$dids[0]}=~s/\x0A/<br>/g; # 改行コード変換(UNIX) + $BODY{$dids[0]}=~s/\x0D\x0A/\n/g; # 改行コード変換(Win) + $BODY{$dids[0]}=~s/\x0D/\n/g; # 改行コード変換(Mac) + $BODY{$dids[0]}=~s/\x0A/\n/g; # 改行コード変換(UNIX) $file=$date; $file=~s/^(\d{6}).*/$1.html/; @@ -371,7 +388,7 @@ # ファイル選択 if ($#files >= 0){ print "<hr>\n"; - print "<form method=\"post\" aciton=\"$OWNFILE\">\n"; + print "<form method=\"post\" action=\"$OWNFILE\">\n"; print "<input type=\"hidden\" name=\"password\" value=\"$escpw\">\n"; print "<select name=\"page\">\n"; $i=0; @@ -471,14 +488,14 @@ ($date,$title,$body)=($date{$did},$title{$did},$body{$did}); ($syear,$smon,$smday)=($date=~/^(\d{4})(\d{2})(\d{2})/); $retpage=$FORM{'retpage'}; - $body=~tr/\x0D\x0A//d; # 改行コード削除 - $body=~s/<br>/\n/ig; +# $body=~tr/\x0D\x0A//d; # 改行コード削除 +# $body=~s/(<|\<)\s*(b|B)(r|R).*?(>|\>)/<br>\n/ig; # ページ表示 print &HtmlHeader("修正"); print "<hr>\n"; - print "<form method=\"post\" aciton=\"$OWNFILE\">\n"; + print "<form method=\"post\" action=\"$OWNFILE\">\n"; print "<input type=\"hidden\" name=\"password\" value=\"$escpw\">\n"; print "<input type=\"hidden\" name=\"action\" value=\"modify\">\n"; print "<input type=\"hidden\" name=\"page\" value=\"modify\">\n"; @@ -536,7 +553,7 @@ $title=&escapeHTML($title{$did}); $body=$body{$did}; $body=&escapeHTML($body); - $body=~s/<br>/<br>/ig; +# $body=~s/(<|\<)\s*(b|B)(r|R).*?(>|\>)/<br>/ig; # 表示 print &HtmlHeader("削除確認"); @@ -557,7 +574,7 @@ <td>$body</td> </tr> </table> -<form method="post" aciton="$OWNFILE"> +<form method="post" action="$OWNFILE"> <input type="hidden" name="password" value="$escpw"> <input type="hidden" name="page" value="$retpage"> <input type="hidden" name="date" value="$date"> @@ -637,7 +654,7 @@ sub HtmlHeader{ return <<"_HTML_"; -Content-Type: text/html +Content-Type: text/html; charset=EUC-JP <html> <head> @@ -764,6 +781,76 @@ return("$sdate"); } +#============================================================================= +# did -> WikiBack URL変換 +# WikiBack:TrackBack Ping URLの表示と、埋め込みRDFを返す。 +# また、Bulkfeeds検索もつけます。 +#============================================================================= +# 【引数】 +# did, title, permalink(relative), mode +# 【返値】 +# html or uri (select by mode) +#============================================================================= +# いしだなおと 2004-1-22 +sub did2wb{ + my($date, $title, $permalink, $mode) = @_; + $date =~ s/(\d{4})(\d{2})(\d{2})_.*/$1-$2-$3/; + my $label = 'WikiBack/コメント'; + my $tb_uri_tip = 'この記事へのTrackBack、コメントを読み書きする'; + my $permalink_tip = 'この記事にリンクするURL(固定リンク)'; + + my $page = &Util::escapeHTML("$date : $title"); + my $site = &Util::escapeHTML("$main::SITE_TITLE"); + + my($uri, $tb_uri) = &Util::abs_url($page); + return undef unless $tb_uri; + $permalink = qq(http://$ENV{'HTTP_HOST'}/n3/$permalink) if ($permalink && $permalink !~ /^http:/); + + my $embeded_rdf = qq{ +<!-- +<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" + xmlns:dc="http://purl.org/dc/elements/1.1/"> +<rdf:Description + rdf:about="$permalink" + trackback:ping="$tb_uri" + dc:title="$page" + dc:identifier="$permalink" + dc:publisher="$site" + /> +</rdf:RDF> +--> +}; + + if($mode eq 'html'){ + my $html = sprintf(qq{ +<div class="comment trackbacks"> +[<a href="http://bulkfeeds.net/app/similar?target=_blank;url=%s;" + title="Bulkfeeds Similarity Search">Bulkfeeds Similarity</a>] +[<a href="%s" title="%s">Permalink</a>] +[<a href="%s" title="%s">%s</a>] +<br /> +</div> +%s +}, + # Bulkfeeds + &Util::url_encode($permalink), + # Permalink + $permalink, + &Util::escapeHTML($permalink_tip), + # WikiBack + $tb_uri, + &Util::escapeHTML($tb_uri_tip), + &Util::escapeHTML($label), + # Embeded RDF for TrackBack AutoDiscovery + ); +# $html =~ s/\n//g; + return $html . $embeded_rdf; + }else{ + return $tb_uri; + } +} + # # エラー # @@ -1143,17 +1230,23 @@ @k=reverse(@k) if ($tmpbnrev==1); # body部作成 + my $wikiback; foreach(@k){ - print FH "<a name=\"$bndate{$_}\"></a>\n"; + print FH qq{<a name="$_"></a>}; print FH "<!--akiary_diary did=$_ date=$bndate{$_}-->"; $tmp=$tmpbnbody; # 日付 $dates=&date2sdate($bndate{$_}); - $tmp=~s/<!--\s*akiary_date\s*-->/$dates/; + $permalink=$bndate{$_}; + $permalink=~s/^(\d{6}).*/$1.html/; + $permalink=$permalink.'#'.$_; + # WikiBack URI/link + $wikiback = &did2wb($_, $bntitle{$_}, $permalink, 'html'); + $tmp=~s{<!--\s*akiary_date\s*-->}{<a href="$permalink">▽</a>$dates}; # タイトル $tmp=~s/<!--\s*akiary_title\s*-->/<!--akiary_title-->$bntitle{$_}<!--\/akiary_title-->/; # 日記本文 - $tmp=~s/<!--\s*akiary_body\s*-->/<!--akiary_body-->$bnbody{$_}<!--\/akiary_body-->/; + $tmp=~s/<!--\s*akiary_body\s*-->/<!--akiary_body-->$bnbody{$_}<!--\/akiary_body-->\n$wikiback/; print FH "$tmp"; print FH "<!--/akiary_diary-->\n"; } @@ -1431,16 +1524,22 @@ $latest_times = $#k + 1 if ($latest_times > $#k); @k=splice(@k,-$latest_times,$latest_times); @k=reverse(@k) if ($reverse==1); + my $wikiback; foreach(@k){ - $ret.="<a name=\"$date{$_}\"></a>\n"; + $ret.=qq{<a name="$_"></a>}; $tmp=$match; # 日付 $dates=&date2sdate($date{$_}); - $tmp=~s/<!--\s*akiary_date\s*-->/$dates/g; + $permalink=$date{$_}; + $permalink=~s/^(\d{6}).*/$1.html/; + $permalink=$permalink.'#'.$_; + # WikiBack URI/link + $wikiback_uri = &did2wb($_, $title{$_}, $permalink, 'uri'); + $tmp=~s{<!--\s*akiary_date\s*-->}{<a href="$permalink">▽</a>$dates}g; # タイトル - $tmp=~s/<!--\s*akiary_title\s*-->/$title{$_}/g; + $tmp=~s{<!--\s*akiary_title\s*-->}{$title{$_}}g; # 日記本文 - $tmp=~s/<!--\s*akiary_body\s*-->/$body{$_}/g; + $tmp=~s{<!--\s*akiary_body\s*-->}{$body{$_}}g; $ret.=$tmp; }
FSWikiLite以外との連携 - いしだなおと (2004-12-10 18:24:57)
WikiConv - WikiWiki?ルールによるテキスト変換モジュール。
hail2u.net Pure JavaScript Wiki Like Formatter
いしだなおと it@isnot.jp