#author("2018-03-14T06:46:12+09:00","","") #author("2018-03-14T06:47:42+09:00","","") * AutoTicketLink 外部チケットへの自動リンク [#k9115a28] - ページ: BugTrack - 投稿者: [[umorigu]] - 優先順位: 低 - 状態: 完了 - カテゴリー: 本体新機能 - 投稿日: 2017-02-22 (水) 07:16:14 - バージョン: 1.5.1 - リリース予定バージョン: 1.5.2 #contents ** メッセージ [#w7fw328ed] InterWikiLinkの書式を使わず、地の文章の中で特定のパターンの文字列を外部システム(主にITS)の特定ページへのリンクにしたい。 (例: issue:2420 と書くと [[BugTrack/2420]] へのリンクになる) ** 関連 [#gf186069] - [[BugTrack/2002]] AutoAlias機能追加 -- [[BugTrack/2002#d03572b7]] 正規表現の直接指定によるAutoLink/AutoAlias - [[official:AutoTicketLink]] ** 残件 [#v5003073] - (a) JavaScriptファイル名 (PukiWiki本体標準のJavaScriptロジックを1ファイルで提供する) - (a) %%JavaScriptファイル名 (PukiWiki本体標準のJavaScriptロジックを1ファイルで提供する)%% -- すべてのロジックを skin/main.js に統合しました - (b) %%keyに使える文字の明確化%% 済(2017/04/03) - (c) 仕様のドキュメント化 - (c) %%仕様のドキュメント化%% [[official:AutoTicketLink]] - (d) %%リンクのTitleの実装%% 済(2017/04/03) -------- ** コメント [#ff9c7190] *** コメント: デザインに関して [#g7f93d4c] - こんにちは。プラグインの記法を &color(); ((セミコロンあり)) とするか、 &color() ((セミコロンなし))とするか、という過去の静かな争いを思い出しました((後発のWikiサービスが後者を採用していましたが、もう稼働していないはずです。まだありますか?))。機械可読性を下げる方向の記法は、そのコンテンツの寿命とトレードオフの関係をもたらすと思っています。所定のサイトや所定の区画だけで使えるようであれば両立できるはずです。 -- [[henoheno]] &new{2017-02-23 (木) 22:55:59}; #comment *** コメント: 名称について [#e08d3242] - この機能は AutoTicketLink という名称にしたいと思っています -- [[umorigu]] &new{2017-03-12 (日) 19:14:48}; - 文字コードに依存しない文字であることを前提とした引数を一つ取って、URLの一か所をクライアント側で動的加工して、最終的に特定パターンのテキストにハイパーリンクの装飾を動的に行う、というシンプルかつ軽量な実装の名称が AutoTicketLink であるという点については、デザイン上のターゲットを示すものとしてまとまっていると思います。 -- [[henoheno]] &new{2017-03-13 (月) 23:22:05}; *** コメント: JavaScriptによる自動リンクの実装について [#o8480fcc] - JavaScriptで仮実装しました。 github.com/umorigu/pukiwiki.autoticketlink Webブラウザ側で処理するのでサーバー側、既存実装の変更は少なくできると思っています。 -- [[umorigu]] &new{2017-03-09 (木) 08:19:46}; -- skin/pukiwiki.skin.php に <script src="skin/ticketlink.js"></script> を追加します。あとはInterWikiのようにPukiWiki本体側(サーバー側)でサイト定義を設定できるようにしたい - こんにちは。InterWikiをJavaScriptで外部に実装したようなモノのようですね。nodeValueが((攻撃する時の))キモのようですが、値が安全に取り出されていてnullでないことは保証(validate)されていますか?menubarはどうされたいのでしょうか。 -- [[henoheno]] &new{2017-03-09 (木) 22:02:18}; -- はい。機能はInterWikiに近いです。/\S/.test(e.nodeValue) でチェックしているつもりでしたが、/\S/.test(null) は true になってしまいました。さすが鋭いですね。対応します。menubarは特に特別扱いせず、処理対象です -- [[umorigu]] &new{2017-03-09 (木) 23:28:27}; - 更新しました -- [[umorigu]] &new{2017-03-10 (金) 09:12:02}; -- e.nodeValue が null の場合の対処と、サイト情報を配列で定義できるようにしています。; - validateの話題や、ignoreTags はいつか突然whitelist方式にしなければならなくなるかもしれないといった懸念はあります。 -- [[henoheno]] &new{2017-03-13 (月) 23:22:05}; - 外部JavaScriptファイルskin/ticketlink.jsを追加されているようですが、今後JavaScriptを増やす可能性があるのなら、skin/pukiwiki.jsのような名称の1ファイルに全てのJavaScriptを納めた方が良いと思います。ファイル数が増えるとHTTPリクエストが増えてしまうので。 -- [[Yorkfield]] &new{2017-03-18 (土) 01:41:52}; -- そうですね。これはまとめたいと思っています -- [[umorigu]] &new{2017-03-18 (土) 07:31:06}; -- <script src="skin/ticketlink.js"></script> はページ描画をブロックするので、</body>の直前が望ましいと思います。 -- [[Yorkfield]] &new{2017-03-19 (日) 02:09:29}; --- ご指摘ありがとうございます。これはそうですね。同等の効果があるはずの「scriptタグにdefer属性」を指定しました [[commit:e511e2e870]] -- [[umorigu]] &new{2017-03-20 (月) 10:35:44}; - typeに"git"を使えるようにしました [[commit:0da07d48b9]] -- [[umorigu]] &new{2017-04-03 (月) 08:04:36}; - リンクのtitle(ポップアップ)を設定するようにしました [[commit:a81938a8f6]] -- [[umorigu]] &new{2017-04-03 (月) 08:05:57}; #comment *** コメント: PHPとJavaScript間のデータ受け渡し [#ked30b2d] - PukiWiki本体側を含めて実装しました。 [[commit:b351d0f966]] -- [[umorigu]] &new{2017-03-12 (日) 19:14:48}; - 時間が無いため、雑なコメントになることをお許しください。 -- [[henoheno]] &new{2017-03-13 (月) 23:21:54}; -- 今回は、PukiWiki本体に設定が統合され、フッターに出力しておいたspanタグを経由して、それがJavaScriptへ入力される方向の改訂が行われております。これは、JavaScriptのようなプログラム部分に設定を置きたくなかった、また、ユーザーごとに異なる設定を利用できるようにしたかった、というお気持ちから発したものだろうと推測します。 -- [[henoheno]] &new{2017-03-13 (月) 23:22:15}; -- ただし、それによって『テキストファイルに「issue:1239」といった文字列があったならば、それをサーバー側で動的に置換してInterWikiとして処理させる』といったハックに比べると、転送量やロード時間、受け入れられる文字コードの種類、JavaScriptへの依存性などの点で、これまでのメリットが薄まってしまっているように思います。(このハックは、今思いついたものです) -- [[henoheno]] &new{2017-03-13 (月) 23:22:24}; -- クライアント側での(WebブラウザのJavaScriptによる)処理にすることでご指摘のようなデメリットもあると思います。&br;一方で、(a)サーバー負荷を軽減できる。(b)DOMを利用できるので、処理がシンプルになる(PHPではWikiテキスト、またはHTMLそのものを対象にする必要がある)。(c)安定して動作しているPukiWikiの本体処理に手を加えずに済む。のようなメリットもあります。&br;また将来的な話としては、クライアントから直接ITSにアクセスすることで、例えばチケットのタイトルを取得・表示するような拡張も考えられます。ブラウザが古かったりJavaScriptがOFFであると動作しないこともありますが、昨今JavaScript OFFの環境が少ないと想像されること、またそもそも想定するのが、そのWikiと関連の深いチケットシステムへのリンクであり、例えば jira:PKWK-2420 のような文字列があればリンクされていなくてもJIRAのチケットであることは容易に判別できます。JavaScriptが動作しなくとも(リンクにならず、PlainTextのままでも)十分に意味は伝わります。 -- [[umorigu]] &new{2017-03-18 (土) 00:02:04}; -- そして、どうしてもリンクされないと意味がない場合はInterWikiを使ってもよく、どちらを使うかは完全に管理者の意志で決定できます。&br;サーバー側ですべての処理を行うと、HTMLキャッシュを使った際にうまく動作しないケース(更新日時の目安表示など)もあるので、もう少しPukiWiki本体の処理もJavaScriptに持って行ってよいと思っています。 -- [[umorigu]] &new{2017-03-18 (土) 00:23:45}; - 気になったところをいくつかまとめてコメントします。 -- [[Yorkfield]] &new{2017-03-19 (日) 02:09:13}; //なぜか途中からコメントできなくなったと思ったら外部URLのせいでした。 -- <span class="pukiwiki-ticketlink-site" data-site="key=$key,type=$type,detail=$detail,name=$name,baseUrl=$base_url" /> ですが、spanは空要素(Void elements)ではないので閉じタグを付けなければなりません。(たまたま気づきましたがSite admin:の所にも空p要素がありますね。) -- [[Yorkfield]] &new{2017-03-19 (日) 02:23:22}; --- これは知りませんでした。修正します。(Site admin については別の機会に) [[commit:c97f4f88fe]] -- [[umorigu]] &new{2017-03-20 (月) 10:48:03}; --- 私も気づいたときは確証は無かったのですが、www.w3.org/TR/html5/syntax.html#start-tags (8.1.2.1 Start tags)を確認してみると /> が許されるのはvoid elementsとforeign elementだけでした。(おそらくですが、古いブラウザが /> を無視すると想定しているのではないかと。) -- [[Yorkfield]] &new{2017-03-20 (月) 12:49:55}; -- どこかでkeyは英数字のみに限定するなどした方が良いかもしれません。今はpukiwiki.ini.phpで正規表現が指定できてしまいます。(正規表現を使う用途があるならこのままもあり?) -- [[Yorkfield]] &new{2017-03-19 (日) 02:23:31}; --- 鋭いですね。実際に使ってみると"."や"-"は使いたくなるので少し悩んでいました。正規表現は不要だけどいくつかの記号は使いたいという意味で。記号を許してしまうと jira: と asf-jira: があった時にどちらが選ばれるか、実装依存になってしまいます。これは制約にするしかないか...いずれにしても管理者がコントロールできる範囲ではあるので大きな問題にはならないと考えています。 -- [[umorigu]] &new{2017-03-20 (月) 10:49:07}; --- keyに使える文字を 英数字、"-","." に限定しました [[commit:95306d1416]] -- [[umorigu]] &new{2017-04-03 (月) 08:04:17}; -- data-site属性経由で設定を渡していますが、JavaScriptの代入文を生成した方がJavaScript側で解析する必要がなくなって良い気がします。ただ、代入できるようにグローバルオブジェクトを1つは作らないといけないのでこの方法が絶対に良いというわけでも無いですが。 -- [[Yorkfield]] &new{2017-03-19 (日) 02:23:38}; //JavaScriptの代入文例 pukiwiki.ticketlink.list = [{key:"phpbug",type:"redmine",detail:"",name:"PHP :: Bug #$1",baseUrl:"//bugs.php.net/bug.php?id="}]; --- JavaScriptの文にすると動的に<script>タグを挿入する必要があるので、できれば避けたいです。HTMLとエスケープ方法が違うのでセキュリティバグの発生しやすい部分になります。ただ、data-site属性のフォーマットが独自のものになっている点はメンテナンスに難があるのでJSONにしてみます。これでParseもしやすくなります。デメリットとして人から読みにくくはなってしまいますが --- [[umorigu]] &new{2017-03-20 (月) 11:15:15}; --- はい、<script>タグの生成にリスクがあるのはその通りですので、無理にこの手段を取ることもないと思います。(エスケープについてはjson_encodeでなんとかならないかなと考えていましたが、2種類のエスケープが混在するとミスもしやすくなりそうです。)data-site属性のフォーマットをJSONにするのは良い案だと思います。 -- [[Yorkfield]] &new{2017-03-20 (月) 12:50:04}; --- まずJSONに対応しました [[commit:fa378b39be]] -- [[umorigu]] &new{2017-03-20 (月) 19:02:49}; #comment *** コメント [#m193e292] - [[official:AutoTicketLink]]にドキュメントを書きました。完了とします -- [[umorigu]] &new{2018-03-14 (水) 06:45:13}; #comment