「午後6時30分」が「午後30時」に変わっていることに気付いたとき、いくつかのhtmlフラグメントをクリーンアップしようとしているときに、ヘチマとサニタイズの両方で奇妙な動作に遭遇しました。
いくつかの調査を行い、次のことがわかりました。
Loofah.scrub_fragment("<span>asdfasdf 6:30 pm</span>", :strip).to_html
#=> "<span>asdfasdf 30 pm</span>"
Loofah.scrub_fragment("6:30 pm", :strip).to_html
#=> "6:30 pm"
Loofah.scrub_fragment("<foo>asdfasdf 6:30 pm</foo>", :strip).to_html
#=> "asdfasdf 6:30 pm"
Loofah.scrub_fragment("bar:30 pm", :strip).to_html
#=> "bar:30 pm"
Loofah.scrub_fragment("<span>bar:30 pm</span>", :strip).to_html
#=> "<span>30 pm</span>"
Loofah.scrub_fragment("<span>bar: asdfasdfadsf pm</span>", :strip).to_html
#=> "<span>bar: asdfasdfadsf pm</span>"
これは Loofah (:prune など) と Sanitize のすべてのバリアントに当てはまるため、両方に共通するコードの問題であると想定しています。サニタイズする前に、コード内のコロンをエスケープするために何か特別なことをする必要がありますか?
編集 1 jruby ( jruby 1.7.0 (1.9.3p203) ) を使用していることを忘れていたことに気付きました。おそらく nokogiri に問題があるかどうかを整理しようとしています (これらの宝石の両方の根底にあるのはどれですか?)
編集 2 さらに掘り下げると、Jruby の Nokogiri で問題が発生する可能性があるようです (私は nokagiri のバージョン 1.5.5 を使用しています)。Jruby と Ruby 1.9.3 で nokogiri のフラグメント パーサーをチェックアウトしました。
Jruby 1.7.0:予期しない結果
doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #(DocumentFragment:0x5fbc {
name = "#document-fragment",
children = [
#(Element:0x5fc0 { name = "span", children = [ #(Text "30pm")] })]
})
Ruby 1.9.3:期待される結果
doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
=> #(DocumentFragment:0x3fc4b102055c {
name = "#document-fragment",
children = [
#(Element:0x3fc4b101fff8 {
name = "span",
children = [ #(Text "3:30pm")]
})]
})
掘り続けようとしますが、提案は大歓迎です。