4

「午後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&#58;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")]
      })]
  })

掘り続けようとしますが、提案は大歓迎です。

4

1 に答える 1

2

のこぎりの回帰誤差だと思います。私はあなたの問題を再現することができ、Nokogiriのいくつかのバージョンでそれを試しました。

1.5.0では正しく動作します。

jruby-1.6.7.2 :002 > gem 'nokogiri', '=1.5.0'
 => true 
jruby-1.6.7.2 :003 > require 'nokogiri'
 => true 
jruby-1.6.7.2 :004 > doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #<Nokogiri::HTML::DocumentFragment:0x7d4 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x7d2 name="span" children=[#<Nokogiri::XML::Text:0x7d0 "3:30pm">]>]> 

1.5.1で失敗します。

jruby-1.6.7.2 :002 > gem 'nokogiri', '=1.5.1'
 => true 
jruby-1.6.7.2 :003 > require 'nokogiri'
 => true 
jruby-1.6.7.2 :004 > doc = Nokogiri::HTML.fragment("<span>3:30pm</span>")
 => #<Nokogiri::HTML::DocumentFragment:0x7d4 name="#document-fragment" children=[#<Nokogiri::XML::Element:0x7d2 name="span" children=[#<Nokogiri::XML::Text:0x7d0 "30pm">]>]> 

編集:Nokogiriは、機能、速度、および不正な形式のマークアップを処理する能力において本当に比類のない素晴らしいlibxml2Cライブラリを中心に構築されていることに注意することが重要です。JRubyの実装は、XercesNekoHTMLを使用してそれを一致させる試みです。彼らは、JRubyの実装をMRIの対応する機能(速度ではないにしても)とほぼ完全に一致させ、大きく異なる実装の違いを説明するという素晴らしい仕事をしたと思います。そうは言っても、時々発生するエッジケースがまだあります。

先に進んで、のこぎりにバグレポートを提出しました。

于 2012-11-17T22:34:32.497 に答える