レ点腫瘍学ノート

pukiwikiカスタマイズ箇所/2022/Pukiwiki 1.5.3も無理やりMarkdown記法とPukiwiki記法に両対応させた の履歴差分(No.4)


#author("2022-01-02T17:48:20+09:00;2022-01-02T09:04:47+09:00","default:tgoto","tgoto")
#author("2022-01-03T18:38:49+09:00;2022-01-02T09:04:47+09:00","default:tgoto","tgoto")
&tag(pukiwiki,markdown);

先週Pukiwiki 1.5.3を無理やりMarkdownに対応させたという記事を公開していました。Pukiwiki ではどうしても書き方が馴染めないと言う人が少なくない上にMarkdownエディターはいろいろな優れたアプリがどんどん増えていて自分に合った使いやすいものがかなり選べる状態になっています。そこでPukiwikiもやはりMarkdownを取り込んでいかないといけないと考えていたのでした。Pukiwiki Devでもそのような話題が上がっていたようです([[参考リンク>https://pukiwiki.osdn.jp/dev/?BugTrack/2413]])。

#ogp(https://oncologynote.com/?2a74686299)

しかし、先日公開した無理やりMarkdown対応した[[Pukiwiki-md>https://github.com/m0370/pukiwiki153_md/releases/tag/pukiwiki1.5.3md]]は全てのページがMarkdownでしか書けないために不便を感じることもありました。 従来型の書き方を使いたいと言うこともあるからです。 そこで、ページによって2種類の書き方を使い分けることができるような改造しました。さらに、チェックボックスで編集からそのいずれかを採用するかを選ぶことができます。

#contents

* スクリーンショット [#l708443b]

#ref(https://oncologynote.com/img/ae42d4ca0c.png,nolink,Pukiwiki 1.5.3でMarkdownが使えるチェックボックス)

* 従来からの改良点 [#h65a0992]

- ページ毎に''Pukiwiki記法かMarkdown記法を選択可能''になっています。
-- 編集画面のチェックボックスでどちらの記法を使うかを選べます。
-- 新規ページの初期設定はMarkdownに設定しています(変更可能です)。これまでに書いたページはPukiwiki記法で残しつつ、今後のページはMarkdown記法で書き足してゆくということもできます。
- Markdown記法を使っているときでも''プラグインが使用可能''です。
-- ブロックプラグインでは #plugin の代わりに !plugin の表記を用います。
- リンクはPukiwiki記法([[リンク>URL]])でもMarkdown記法([リンク](URL))でも使用可能です。
- Pukiwiki記法の場合はCSSとjavascriptを各1行ずつ読み込むだけで簡単に''ビジュアルMarkdownエディタ''「[[SimpleMDE>https://simplemde.com/]]」が使用可能で、書いたマークダウン書式はリアルタイムに反映されます。
-- Pukiwiki記法で記載しているときは書式は反映されません。
-- 不要な場合は下記のpukiwiki.ini.phpで$use_simplemde = 0;を設定してください。

なお、今回の改良を有効にするためにpukiwiki.ini.phpに$markdown_safemodeと$use_simplemdeの設定項目が必要です。

 /////////////////////////////////////////////////
 // Pukiwiki Markdown
 // https://github.com/m0370/pukiwiki153_md
 // https://github.com/sparksuite/simplemde-markdown-editor/
 $markdown_safemode = 1; // Safemode 1:On, 0:Off
 $use_simplemde = 1; // simple Markdown editorを使用 1:Enable, 0:Disable

** 編集画面 [#g70dcb2d]

チェックボックスでMarkdownにチェックを入れると、Markdown記法で書くことができるようになります。チェックボックスを外していると従来のPukiwiki記法になります。

いずれの記法を選んでいるかは内部的にはテキストファイルに#notemdという偽装プラグインを書くことで区別しています。ページ毎に使い分けが可能になっています。ただし、プレビュー機能はこの使い分けに対応していないため、プレビューボタンを非表示にしています。

** Markdown記法でもプラグインが使用可能 [#pb028b82]

従来のPukiwiki記法ではブロックプラグインを使用する場合は行頭に#(シャープ)の記号を付けていました。しかし、Markdownでは行頭の#は見出し記号になりますのでプラグインに使用できません。そこで、!を使っています。インラインプラグインは従来通り&plugin();で記載します。

- #plugin
- !plugin
- &plugin();

なお、Markdown parserに本文を投入する関係で複数行プラグインには未対応です。

* 前回からの改装箇所 [#g9658a0d]

- 本文に#notemdというキーワード(偽装プラグイン)がある場合はMarkdown記法で、ない場合はPukiwiki記法でパースします。このため、convert_html.phpを2つのParser(Pukiwiki用とerusev/Parsedown)を本文中に#notemdが含まれているかどうかで区別しています。
- さらに#notemdそのものを消してしまったり書き間違えたりするリスクを減らすため、編集画面などにはこの#notemdは非表示になるようにconvert_html.phpに改装を行いました。
- 編集画面で#notemdが非表示になるということは、手動で#notemdと書いてMarkdown記法に切り替えることができなくなることでもあるので、lib/file.phpの1093-1105行目付近およびlib/html.phpの409行目付近および430行目付近に手を入れてチェックボックスでMarkdownかどうかを選択できるようにしました。なお、新規ページ作成での初期設定はMarkdownになるようにしました。
- 本文中に#notemdがあるかどうかでMarkdownのチェックボックスのデフォルト値を振り分けるようにしました。これを行うためにlib/file.phpに内部functionとして(#authorプラグインを参考に)remove_notemd、get_notemdなどのfunctionを新設しました。

* 既存のPukiwikiからの引っ越しも可能 [#aa06021a]

この、ページ毎に従来のPukiwiki記法とMarkdown記法のいずれかを選んで使い分けることができるという方式で何が有利かというと、既存ページのwikiフォルダはそのままに設定ファイルなどを書き換えれば、今まで使っていたPukiwikiがそのままMarkdownも併用できるようになるという点です。全てのページがMarkdownしか使えないのは全ページの書き換えが必要だったので、新規に設置するPukiwikiにはよくても既存の稼働しているPukiwikiからの引っ越しには不向きでした。

今回の改造では、Pukiwiki記法で使用しているページの保存ファイルは手を加えず、一方でMarkdown記法を指定した保存ファイルには #notemd の偽装プラグインを書き込むようにしています。Pukiwiki記法で書いたページのファイルは手を加えていないと言うことは、wikiフォルダをそのまま移植すればこの新しいPukiwiki 1.5.3-mdでも続きを使い続けることができるということを意味します。

なお、必ずバックアップを取ってから引っ越し作業をしてください。データの消失などには責任を負えませんので、ご使用は自己責任で。タイムスタンプを保持したままPukiwikiを丸ごとバックアップする方法については[[こちらのページ>https://oncologynote.com/?b64520e1c0]]もご覧ください。

** 本家のPukiwikiに比べてまだ残っている課題の機能 [#xf3a7928]

- ''複数行プラグインは使用不可'':複数行プラグインは現在動作させることができません。
- ''プレビューの書式反映問題'':プレビューはPukiwiki記法とMarkdown記法が正しく両方を反映させることができないので、プレビューボタンを便宜上非表示にしています。
- %%プレビューの書式反映問題'':プレビューはPukiwiki記法とMarkdown記法が正しく両方を反映させることができないので、プレビューボタンを便宜上非表示にしています。%% プレビュー機能は[[2022/01/03のコミット>https://github.com/m0370/pukiwiki153_md/commit/5258fd96632ce6f44a7c06eab60880d51542b45d]]から使用可能となりました。
- ''プラグイン動作確認'':プラグインによっては動作確認が不十分なことがあります。
- ''脆弱性'':MarkdownはHTMLをそのまま投入できるので誰でも自由に書き込めるPukiwikiの場合はクロスサイトスクリプティングのような脆弱性の問題があります。今回の改造ではerusev/markdownのMarkdown parserを使っていて、このparserにはセーフモードにする(あるいはHTMLは全てエスケープする)という設定項目もあり、pukiwiki.ini.phpでこれを有効にすることができるようにしていますが、セーフモードにすると表記したもののうちリンクを含む部分はコードが変換されずそのままむき出しになるので見栄えがわるいです。
- ''脆弱性'':MarkdownはHTMLをそのまま投入できるので誰でも自由に書き込めるPukiwikiの場合はクロスサイトスクリプティングのような脆弱性の問題があります。今回の改造ではerusev/markdownのMarkdown parserを使っていて、このparserにはセーフモードにする(あるいはHTMLは全てエスケープする)という設定項目もあり、pukiwiki.ini.phpでこれを有効にすることができるようにしていますが、セーフモードにすると表記したもののうちリンクを含む部分はコードが変換されずそのままむき出しになるので見栄えがわるいです。Markdown parserのセーフモードよりも、Markdown parserに通した後のテキストをPukiwikiのhtmlsc()に通す方がまだマシのようですが、まだこの修正を適用できていません。

* ダウンロード [#ea6a4763]

ダウンロードはこちらからどうぞ。設置方法は従来のPukiwikiとほぼ同様です。
[[ダウンロードはこちら>https://github.com/m0370/pukiwiki153_md/archive/refs/heads/master.zip]]からどうぞ。設置方法は従来のPukiwikiとほぼ同様です。
ただし、pukiwiki.ini.phpに上記の設定項目を設置するのを忘れないようにしてください。
ライセンスはGPL2。

#ogp(https://github.com/m0370/pukiwiki153_md/releases/tag/pukiwiki1.5.3md-v2)
#ogp(https://github.com/m0370/pukiwiki153_md)

** 動作しないときのチェックリスト [#g816070d]

- pukiwiki.ini.phpへの追記設定はできていますか?
- Markdown parser(plugin/vendorフォルダ内)は設置できていますか?

もしうまく動かない時は不具合修正のため、ぜひ問題点をTwitterのほうまでご連絡ください。