/ 最近 .rdf 追記 編集 設定 本棚

脳log[20140904] (タイトル↑からの続き)



2014年09月04日 (木) [正規表現][tDiary] これもマッチしない方がましな例かな?「Wikiスタイルのプラグイン記法でクォーテーションまわりの処理に異常がある · Issue #437 · tdiary/tdiary-core · GitHub」■参考:20131209p01■tDiaryの方に話を戻すと、「リンクはWiki記法ので作られるのが前提」なのではなくて、101行目以降の処理は HTMLから二重ブラケットリンク記法を(不完全ながら)復元してそこにあるべき機能(myプラグイン/kwプラグイン展開)を付加するためにあると思っていて、だから、プラグイン記法でイレギュラーに挿入された Aタグに対しては 101行目のマッチングに失敗してその後の処理をスキップすればいいわけで、「101行目:html.gsub!( %r!<a href="([^"\n]+?)">(.+?)</a>! ) do」あたりが好みかな。試してないので机上の大法螺かもしれんけど。補足。\nを除外したのは mフラグなしの . に合わせた結果。この \nにマッチしない制限も知らない HTMLに触れない方針の一環と思われる。wiki.rbの他の場所では使われている mフラグがこのパターンには付いていないことに意図を見出すなら。■実のところどういう機序でこのように「; _erbout.concat(('<%=kw 'ttp://google.com" target="_blank...」不完全なシングルクォート文字列が _erbout.concatの引数になってエラーに発展するのか把握していない。だってそこは ERBが dumpした部分であって(たぶん)、どんな入力でも文法エラーを起こせるとは思えないから。■GitHubの画面はまことに適切ですな。ページ最下部までコメントを読んでいくとこう「Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment」結局アカウントは作らなかったが。■何行目っていって GitHubに張ったリンクは HEADとともに対象が移ろう URLだろうか。gitに HEADってあるんだろうか。今現在のHEAD(相当のもの)に固定したリンクはどこへ張る?■■■対象が変化していくだけではない。たぶんこれによって早くもリンクが切れてる。「Merge pull request #432 from tdiary/standard-structure · 3f8ff2a · tdiary/tdiary-core · GitHub」■ちょっとだけ関係するかもしれない話。たとえばこの日記に /diary/ でアクセスしたとき、そのままの URLで最新の日記を表示するか、内容は同じだが日付を固定した URLにリダイレクトするか。サーチエンジンだけ日付指定URLにリダイレクトしてるけど、どっちみち noindexなので関係ないかも。何が嫌なのかって、検索してアクセスしてみたらそれが現時点で最新のページであって、検索にマッチした内容が流れて消えてしまっていること。

最終更新: 2015-03-31T20:06+0900

[tDiary] (タイトル↑からの続き)

この日記ではバグを再現できないので tdiary/wiki_style.rbの該当部を見てみた。

	hikihtml = HikiDoc::HTMLOutput.new
	html.gsub!( %r!<a href="(.*?)">(.*?)</a>! ) do
		k, u = hikihtml.unescape_html($2), hikihtml.unescape_html($1)
		if /^(\d{4}|\d{6}|\d{8}|\d{8}-\d+)\D*([pctf]\d+(?:[-.]\d+)*)?$/ =~ u then
			%Q[<%=my '#{$1}#{$2}', '#{escape_quote CGI.escapeHTML k}' %>]
		elsif /:/ =~ u
			scheme, path = u.split( /:/, 2 )
			if /\A(?:https?|ftp|mailto|javascript)\z/ =~ scheme
				u.sub!( %r@\A(?!mailto|javascript)\w+:(?!//)@, '' )
				%Q[<a href="#{CGI.escapeHTML u}">#{CGI.escapeHTML k}</a>]
			elsif ( k == u )
				%Q[<%=kw '#{escape_quote u}'%>]
			else
				%Q[<%=kw '#{escape_quote u}', '#{escape_quote k}'%>]
			end
		elsif k.empty?
			%Q[<a href="#{CGI.escapeHTML u}">#{CGI.escapeHTML u}</a>]
		elsif u.empty?
			%Q[<%=kw '#{escape_quote k}'%>]
		elsif k == u
			%Q[<%=kw '#{escape_quote u}', '#{escape_quote k}'%>]
		else
			%Q[<a href="#{CGI.escapeHTML u}">#{CGI.escapeHTML k}</a>]
		end
	end
	html
end

154行目の正規表現は同じ問題を含んでるけど、ざっと見ただけで

  • 量指定子が +? でなく *?
  • hikihtml.unescape_html*を使ってる (ユーザーが自分で kwプラグインを呼ぶとき HTMLエスケープしますか?ってことだ)
  • URIを使ってない (屁理屈を言うなら、フルスペックのバリデーションなんていらんよね)
  • schemeの消し方が細かい
  • elsifがなんか多い (たぶんこれのために量指定子を変更した)
  • CGI.escapeHTMLを使ってる (hikihtml.unescape_htmlが関知しなかったダブルクォートが &amp;quot; にされるかも)

あたりが違う感じ。どれが影響してエラーにならないんだろ。

……ならないんだけど、自分が正しいと信じる解決策を下のように適用しておいた(量指定子はこの日記のもともとの仕様に従って +? ではなく *? を使うように変更してある)。

	html.gsub!( %r!<a href="([^"\n]*?)">(.*?)</a>! ) do

* メンバ変数に依存しないメンバ関数って……。まったく無駄な new!!!