レ点腫瘍学ノート

Top / pukiwikiカスタマイズ箇所 / 2022

Pukiwiki 1.5.3も無理やりMarkdown化した

pukiwiki markdown

Pukiwiki 1.5.3も無理やりMarkdown化した

もともとpukiwiki 1.5.0を無理やりMarkdown対応したという記事がqiitaにありました。確かにタイトルにあるとおり無理やり腕力でMarkdownにしたものなのでやや強引な感じは否めませんが、非常に興味深いものです。

関連記事

Pukiwikiを無理やりMarkdown記法に変えてみた - Qiita
とりあえず実現した PukiwikiがMarkdownで書けたらいいなと思ったPukiwikiユーザーさんはたくさんいらっしゃると思います。 いないですかね…… 僕はそういったものがどうしても欲しくて、PukiwikiライクでM...
https://qiita.com/devneko/items/fafac4ade37c9cb3d2f4
Pukiwiki 1.5.4も無理やりMarkdown記法とPukiwiki記法に両対応させた - レ点腫瘍学ノート
pukiwiki 以前にPukiwiki 1.5.3も無理やりMarkdown記法とPukiwiki記法に両対応させたという記事を公開していました。今回はそのPukiwiki 1.5.4版です。 Pukiwiki 1.5.3も無理やりMarkdown記法とPukiwiki記法に両対応させたpukiwiki markdown
https://oncologynote.jp/?baa57eda56

イヤでもデファクトスタンダードになっているMarkdown

もともと文法のわかりやすさや機能性はpukiwiki記法のほうがMarkdownより優れていると思います。リンクも分かりやすいし、文字色などのスタイリングもpukiwiki記法の方が柔軟です。しかし、世の中はますまずMarkdown記法が使える局面が増えてきています。

Windows/Macを問わずMarkdownを書くためのアプリは増えていますし、iPadなどで文書を書く人にもMarkdown記法は使いやすい書式になっています。もはやMicrosoft OfficeのWordで書かれる文書よりもMarkdownのほうが多いのではないでしょうか。そういう時代ですから、pukiwikiもMarkdownで書ければ良いのになと思っていたのでした。何よりも、MarkdownはTyporaにせよiA writerにせよ自分の使い慣れたライティングソフトで書きやすいのが良い。

pukiwiki-mdをまねてPukiwiki 1.5.3をpukiwiki153-md化する

そこで、pukiwiki 1.5.0で止まっていたpukiwiki-mdを無理やりMarkdown化をpukiwiki 1.5.3に応用してみることにしました。色々と試行錯誤していますが、まだ十分には動作検証はできていません。それでも、なんとかpukiwiki 1.5.3のMarkdown版として動くところまでは来ました。PHP 7.4で動作しています(1.5.3なのでPHP 8では動きません)。

とりあえずテスト環境では動作していますが、現在動作確認中です。ご使用は自己責任で。
https://github.com/m0370/pukiwiki153_md

Release Pukiwiki 1.5.3-md · m0370/pukiwiki153_md
Pukiwiki 1.5.3で動作するMarkdown化バージョンです。
https://github.com/m0370/pukiwiki153_md/releases/tag/pukiwiki1.5.3md

サンプル

#hoge
文章です。
[[FrontPage]]で内部リンクを張れる。
もちろん[ほげほげ](http://example.com)というMarkdownのリンクの書き方もできる。

##リスト
- foo
- bar

##画像を表示(Pukiwikiプラグインが使える)
!ref(テスト/test.jpg)

改装箇所

vendorフォルダにMarkdown parserをインストール

Markdown parserは何を使っても良いが、今回は erusev/parsedown を使用しています。

https://github.com/erusev/parsedown/wiki/

index.phpでMarkdown parserを読み込む設定をする

index.php に <?php require('vendor/autoload.php'); ?>を加えておく必要がある。

lib/convert_html.php

22-25行目をコメントアウトして書き換える

$body = new Body(++$contents_id);
$body->parse($lines);
	
return $body->toString();

上記のようになっているところを、下記のように書き換える。

foreach ( $lines as &$line ) {
	$matches = array();
	if ( preg_match('/^\\!([a-zA-Z0-9_]+)(\\(([^\\)\\n]*)?\\))?/', $line, $matches) ) {
		$plugin = $matches[1];
		if ( exist_plugin_convert($plugin) ) {
			$name = 'plugin_' . $matches[1] . '_convert';
			$params = array();
			if ( isset($matches[3]) ) {
				$params = explode(',', $matches[3]);
			}
			$line = call_user_func_array($name, $params);
		} else {
			$line = "plugin ${plugin} failed.";
		}
	} else {
		$line = make_link($line); //この行をコメントアウトしてmake_linkをスキップするとraw HTMLを書けるようになる一方でPukiwiki方式のリンクなどの書式が使えなくなる
		// ファイル読み込んだ場合に改行コードが末尾に付いていることがあるので削除
		// 空白は削除しちゃだめなのでrtrim()は使ってはいけない
        $line = str_replace(array("\r\n","\n","\r"), "", $line);
	}
}
unset($line);

$text = implode("\n", $lines);

$parsedown = new \Parsedown(); //Parsedown→ParsedownExtraに変更しても良い
$result = $parsedown ->setBreaksEnabled(true) ->text($text); // ->setBreaksEnabled(true)を付けて改行を可能にしている

return $result;

通常のMarkdownではなくMarkdownExtraにしたい場合は $parsedown = new \Parsedown(); の代わりに $parsedown = new \ParsedownExtra(); としてください。その場合はvendor/erusev/parsedownフォルダにParsedownExtra.phpのファイルも入れておく必要があります。

また、今後Pukiwiki 1.5.4が正式リリースされると思いますので、PHP 8.0の対応を見据えて下記のように書き換えておきます。

lib/file.php

lib/make_link.phpの修正

123行目付近の下記の行をコメントアウトして書き換えます。

// $arr = explode("\x08", make_line_rules(htmlsc($string)));
$arr = explode("\x08", make_line_rules($string));

htmlscは、htmlspecialcharsで特殊文字をHTMLエンティティに変換するための内部コードですが、HTMLエンティティに変換してしまうと正しくパースされない部分があります。
また、{0}も1箇所[0]に修正しておく。

78〜93行目のうち下記の行をコメントアウトしておく。

if ($converters === NULL) {
	$converters = array(
		'plugin',        // Inline plugins
		'note',          // Footnotes
		// 'url',           // URLs
		// 'url_interwiki', // URLs (interwiki definition)
		// 'mailto',        // mailto: URL schemes
		// 'interwikiname', // InterWikiNames
		// 'autoalias',     // AutoAlias
		// 'autolink',      // AutoLinks
		'bracketname',   // BracketNames
		// 'wikiname',      // WikiNames
		// 'autoalias_a',   // AutoAlias(alphabet)
		// 'autolink_a',    // AutoLinks(alphabet)
	);
}

上記のautolinkやautoaliasの行をコメントを外すようにすればautolinkが効くようにできますが、Markdown parserと何らかのコンフリクトが生じるかも知れません。

#authorの修正

下記のファイルで #author となっている部分を全て !author にする必要があります。ほかに、#freezeや#related・#unrelatedなども!freezeや!related・!unrelatedに変更します。

現状の問題点

Home · erusev/parsedown Wiki
Better Markdown Parser in PHP. Contribute to erusev/parsedown development by creating an account on GitHub.
https://github.com/erusev/parsedown/wiki/

その後の追加

その後に、さらにMarkdown式リンクをPukiwiki式リンクに変換できるよう改善を加えました(2021/12/30)。45行目に下記の一文を追記しています。

$line = preg_replace('/\[(.*?)\]\((https?\:\/\/[\-_\.\!\~\*\'\(\)a-zA-Z0-9\;\/\?\:\@\&\=\+\$\,\%\#]+)( )?(\".*\")?\)/', "[[$1>$2]]", $line);

さらに、Pukwiwiki記法とMarkdown記法をチェックボックスで切り替えられるようにしました。

pukiwiki markdown 先週Pukiwiki 1.5.3を無理やりMarkdownに対応させたという記事を公開していました。Pukiwiki ではどうしても書き方が馴染めないと言う人が少なくない上にMarkdownエディターはいろいろな優れたアプリがどんどん増えていて自分に合った使いやすいものがかなり選べる状態になっています

関連記事

pukiwiki markdown GitHub - m0370/pukiwiki_markdown.inc.php: Pukiwiki MarkdownプラグインPukiwiki Markdownプラグイン. Contribute to m0370/pukiwiki_markdown.inc.php development by

この記事に対するコメント

このページには、まだコメントはありません。

お名前:

更新日:2021-12-29 閲覧数:1476 views.