• 追加された行はこの色です。
  • 削除された行はこの色です。
  • なでしこWiki(仮) へ行く。

[[なでしこ&葵まとめ>Nadeshiko_programming4JapaneseStyle]]

日本語プログラミング言語なでしこを使って、簡単なWikiエンジンを作ってみました。WikiWiki(ウィキウィキ)とは、Webブラウザだけで各ページを編集できるツールです。

とりあえず[[YukiWikiMini:http://www.hyuki.com/yukiwiki/mini/index.html]]に相当するシンプルな機能しか持っていません。
[[椿ウヰキ>tsubaki-wiki]]の正式公開に伴い、こちらのページはクローズします。

#contents

*関連資料 [#eb6ed651]

-[[なでしこCGI:http://nadesi.com/wiki/index.php?catch#rc95d78c]] インストールや実行方法は、これを参考にしてください。

-[[making_wiki]]
-[[なでしこRegularExpression]]
-[[windows_apache]] WindowsにApacheを入れる方法

*表記方法 [#bd5c0a93]

|記号|意味||
|[[ ]]|内部リンク||
|----|水平線||
|*,**,***|見出し1-3||

*ソースコード [#qc51bcd7]

以下の2つのファイルを利用します。

**本体 [#f6fe9ca1]

下記のコードを「test_wiki.nako」として保存してください。

 #!C:\xampp\cnako\cnako.exe
 #1行目は、CGIの実行環境に合わせて書き換えること
 
 # 日本語プログラミング言語なでしこによるWikiクローン
 # Copyright 2010 Yutaka Kachi
 #
 # 0034 見出しタグを追加、二重リンクに対応
 
 !「cgi.nako」を取り込む
 サイト名=「ナデシコWiki(仮)」
 バージョン=「ver.0034」
 DBファイルパス=「dat」
 スクリプトURL=「test_wiki.nako」
 著作権表示=「Copyright 2010 Yutaka Kachi」
 
 リンクタグ=「\[\[.+?\]\]」
 表紙名=「トビラ」
 編集名=「編集」
 書込名=「書込み」
 一覧名=「ページ一覧」
 漢字コード=「sjis」
 編集記号=「?」
 背景色=「white」
 HTMLコンテンツ型=「Content-type: text/html; charset=Shift_JIS」
 
 削除メッセージ=「を、削除しました」
 エディタ行数=80
 エディタ列数=20
 スタイルシート=「style.css」
 
 処理フォームとは、ハッシュ
 主処理する
 終了
 
 
 ●主処理()
 	フォーム=フォーム取得
 	もし、(フォーム@mymsg=空)でなければ
 		フォーム@mymsg=フォーム@mymsgをhtml無害化
 
 	フォーム要素=フォームのハッシュキー列挙
 	
 	もし、(フォーム要素=「」)ならば
 		処理フォーム@ページ=表紙名
 		読込する
 		戻る
 
 	A=フォーム@mycmd
 	Aで条件分岐
 		「edit」ならば
 			処理フォーム@ページ=フォーム@mypage
 			編集する
 		「write」ならば
 			処理フォーム@ページ=フォーム@mypage
 			処理フォーム@本文=フォーム@mymsg
 			書込する
 		「index」ならば
 			処理フォーム@ページ=一覧名
 			一覧表示する
 		違えば
 			処理フォーム@ページ=フォーム要素
 			読込する
 
 #------ コマンド ------
 
 ●編集()
 
 	処理フォーム@ページを「編集不可」でヘッダー文生成して、表示する
 	編集欄生成して、表示する
 	フッター文生成して、表示する
 
 ●書込()
 	#編集内容を保存する
 	#編集内容が空白だったら削除する
 
 	ファイルパス=DBファイルパス&「\」&処理フォーム@ページ
 	もし、(処理フォーム@本文<>「」)ならば
 		DBファイルパスをファイルロック
 		処理フォーム@本文をファイルパスに保存
 		DBファイルパスをファイルロック解除
 		読込する
 	違えば、
 		ファイルパスをファイル削除
 		処理フォーム@ページ&削除メッセージを「編集不可」でヘッダー文生成して、表示する
 		フッター文生成して、表示する
 
 ●一覧表示()
 
 	処理フォーム@ページを「編集不可」でヘッダー文生成して、表示する
 	一覧文生成して、表示する
 	フッター文生成して、表示する
 
 ●読込()
 
 	処理フォーム@ページを「編集可」でヘッダー文生成して、表示する
 	本文生成して、表示する
 	フッター文生成して、表示する
 
 
 #------ HTMLを生成 ------
 
 ●ヘッダー文生成(ページ名を編集可否で)
 
 	もし、(編集可否=「編集可」)ならば、
 		編集メニュー=「<a href="{スクリプトURL}?mycmd=edit&mypage={ページ名}">{編集名}</a>」
 		一覧メニュー=「<a href="{スクリプトURL}?mycmd=index">{一覧名}</a>」
 	違えば
 		編集メニュー=編集名
 		一覧メニュー=一覧名
 
 	それは、「{HTMLコンテンツ型}{改行}{改行}
 	<html>
 	<head>
 		<title>{サイト名}の{ページ名}</title>
 		<link rel="stylesheet" href={スタイルシート} type="text/css" />
 	</head>
 	<body bgcolor="{背景色}">
 	<table width="100%" border="0">
 		<tr valign="top">
 			<td>
 				<h1>{サイト名}の{ページ名}</h1>
 			</td>
 			<td align="right">
 				<a href="{スクリプトURL}?{表紙名}">{表紙名}に戻る</a> | 
 				{編集メニュー} | 
 				{一覧メニュー} | 
 				<a href="http://www.catch.jp/wiki/">catch.jp-wiki</a>
 			</td>
 		</tr>
 	</table>」
 
 ●本文生成()
 
 	生成文=「」
 	ファイルパス=DBファイルパス&「\」&処理フォーム@ページ
 
 	もし、(ファイルパスの存在=いいえ)ならば、
 		生成文=「{処理フォーム@ページ}に、ようこそ<br>」
 	違えば
 		本文にファイルパスを読む
 		本文を反復
 			テキスト=それを表記分析
 			生成文=生成文&「{テキスト}」&改行
 
 	それは、生成文
 
 ●フッター文生成()
 
 	それは、「
 	<hr>
 	{著作権表示}:{バージョン}
 	</body>
 	</html>」
 
 ●編集欄生成()
 
 	生成文=「」
 	ファイルパス=DBファイルパス&「\」&処理フォーム@ページ
 
 	もし、(ファイルパスの存在=いいえ)ならば、
 		本文=「{処理フォーム@ページ}を新規作成します」
 	違えば
 		本文にファイルパスを読む
 
 	生成文=「
 		<form action="{スクリプトURL}" method="post">
 			<input type="hidden" name="mycmd" value="write">
 			<input type="hidden" name="mypage" value="{処理フォーム@ページ}">
 			<textarea cols="{エディタ行数}" rows="{エディタ列数}" name="mymsg" wrap="off">{本文}</textarea><br />
 			<input type="submit" value="{書込名}">
 		</form>」
 
 	それは、生成文
 
 ●一覧文生成()
 
 	生成文=「<ul>{改行}」
 	DBファイルパスのファイル列挙
 
 	それを反復
 		生成文=生成文&「<li><a href="{スクリプトURL}?{それ}">{それ}</a></li>」&改行
 
 	生成文=生成文&「</ul>」
 	それは、生成文
 
 
 #---- 表記の分析と変換 ----
 
 ●表記分析(テキスト文を)
 
 	変換文=テキスト文
 
 	#空行
 	もし、テキスト文=「」ならば、
 		「<p></p>」で戻る
 
 	#水平線
 	パターン=「\A----」
 	テキスト文をパターンで正規表現マッチ
 	もし、それが空でなければ、
 		「<hr>」で戻る
 
 	#見出し
 	パターン=「\A\*+」
 	テキスト文をパターンで正規表現マッチ
 	もし、それが空でなければ、
 		見出しレベル=それの文字数
 		テキスト文のパターンを「」へ正規表現置換
 		それをリンク変換
 		「<h{見出しレベル}>{それ}</h{見出しレベル}>」で戻る
 	違えば、
 		(テキスト文をリンク変換)&「<br>」で戻る
 
 
 ●リンク変換(テキスト文を)
 
 	#外部リンクを変換
 	URL表示=「((http|https|mailto):[\x21-\x7E]*)」
 	変換文=テキスト文のURL表示を「\x01$1\x01」へ正規表現置換
 
 	テキスト文からURL表示で正規表現全抽出2
 	それを反復
 		リンク語=それ
 		リンク先=「<a href="{リンク語}">{リンク語}</a>」
 		変換文=変換文の「\x01{リンク語}\x01」をリンク先へ正規表現単置換
 
 	#内部リンクを変換
 	テキスト文からリンクタグで正規表現全抽出2
 	それを反復
 		リンク語=それ
 		リンク先=リンク語を内部リンク変換
 		変換文=変換文のリンク語をリンク先に置換
 
 	変換文で戻る
 
 
 ●内部リンク変換(リンク語を)
 
 	リンク先=「」
 	リンク語=リンク語の「[[」を「」に置換
 	リンク語=リンク語の「]]」を「」に置換
 
 	ファイルパス=DBファイルパス&「\」&リンク語
 
 	もし、(ファイルパスの存在=いいえ)ならば、
 		リンク先=「{リンク語}<a href="{スクリプトURL}?mycmd=edit&mypage={リンク語}">{編集記号}</a>」
 	違えば
 		リンク先=「<a href="{スクリプトURL}?{リンク語}">{リンク語}</a>」
 
 	リンク先で戻る
 
 #---- 補助処理 ----
 
 ●html無害化(テキストを)
 
 	結果文=「」
 
 	本文=テキストを改行で区切る
 	本文を反復
 		途中文=「」
 		途中文=それの「&」を「&amp;」に置換
 		途中文=途中文の「"」を「&quot;」に置換
 		途中文=途中文の「<」を「&lt;」に置換
 		途中文=途中文の「>」を「&gt;」に置換
 		結果文=結果文&改行&途中文
 
 	結果文で戻る
 
 //対象文からパターンをすべて抽出
 //マッチした数が1個の場合は戻値を返す
 //http://www26.atwiki.jp/isoroku_be/pages/44.html
 ●正規表現全抽出2(対象文からパターンで)
 	正規表現修飾子は「gmk」
 //マッチした数を計算
 	対象文2=対象文
 	対象文2=対象文2の「(●)」を「※」に正規表現置換
 	対象文2=対象文2のパターンを「●」に正規表現置換
 	マッチ数=対象文2で「●」の出現回数
 //抽出
 	戻値とは文字列
 	戻値は対象文の(「(」&パターン&「)」)を「\x01$1\x02」で正規表現置換
 	戻値は戻値の「\x02[^\x01]*」を「\x02」に正規表現置換
 	戻値は戻値の「[^\x02]*\x01」を空に正規表現置換
 //
 	マッチ数で条件分岐
 		「0」ならば
 			それは空
 			戻る
 		「1」ならば
 			戻値の「\x02」を空に正規表現置換して戻る
 		違えば
 			戻値を「\x02」で正規表現区切って戻る
 




**スタイルシート [#fda9936d]

以下のコードを「style.css」として保存してください。

 <style type="text/css">
 <!--
 body { font-family: "Courier New", monospace; }
 pre { line-height:130%; }
 a { text-decoration: none }
 a:hover { text-decoration: underline }
 -->
 </style>

*変更履歴 [#kd077ce6]

-2010-05-04:[[椿ウヰキ>tsubaki-wiki]]の正式公開に伴い、ここはクローズ
-2010-01-19:0027 htmlの無害化を追加
-2010-01-28:0029 htmlの無害化の不具合を解消、水平線タグを追加
-2010-02-08:0034 見出しタグを追加、複数のリンクタグに対応、URLを自動リンク

*参考 [#u2f26879]

-[[YukiWikiMini Home:http://www.hyuki.com/yukiwiki/mini/index.html]]
-[[pukipa.rb:http://jp.rubyist.net/magazine/?0010-CodeReview]] RubyによるPukiWiki文法のパーサ(MIT ライセンス) を添削したもの
-[[Konawiki:http://aoikujira.com/wiki/konawiki/]]


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS