[Akiary/Weblog Like Style With Akiary]
Akiary本体の改造§Wikiスタイル

isnot.jp/wiki [Permalink] [編集] [差分]

最終更新:2006-11-24 08:21:50

Wikiスタイルを導入したAkiaryでは、日記を書くときにWiki記法で書けるようになります。

概要

ここでは、Wiki記法のパーサとしてFSWikiLiteを利用しています。同じようにYukiWikiの解析部を利用するような改造も可能だと思われますが(参考:blosxomのyukiwikix plugin)ここでは扱いません。

まだまだ完成度が低いですが、部分的にコードを公開してみます。私が普段使っているAkiaryを元に多少整理した?ものですが、

を含んでいます。

また、FSWikiLite一式も一緒に設置されている必要があるのですが、それに対しても独自の改造を施してあります。そちらについては「改造内容」あたりを見るなどしてください。

方針

なので、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/(&lt;|\<)\s*(b|B)(r|R).*?(&gt;|\>)/<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/&lt;br&gt;/<br>/ig;
+#    $body=~s/(&lt;|\<)\s*(b|B)(r|R).*?(&gt;|\>)/<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

お名前: コメント:

[FrontPage]

いしだなおと it@isnot.jp