From: rnanba@... Date: 2018-09-03T05:40:30+00:00 Subject: [ruby-dev:50633] [Ruby trunk Bug#15057] REXML::Text#value returns a double unescaped string in non-raw mode Issue #15057 has been updated by rna (Ryosuke Nanba). > atomutilでそうなるケースを試してみたいので再現するAtomとサンプルコードを提供してもらえませんか? これでどうでしょう? ~~~ require 'atomutil' entry = Atom::Entry.new entry.content = "<br>" puts entry.to_s ~~~ entry.to_s は実際に投稿する場合 HTTP の request body になります(参照: Atom::Client#create_resource)。 上のサンプルは「HTMLタグを記述可能なテキスト形式での投稿を受理するブログサービス(はてなブログのはてな記法モード等)で、HTMLタグ
の説明を書くためタグをエスケープして記述した」という想定です。ブログサービス側では atom の content 要素の内容をパースしたものをテキスト形式の投稿データとして扱います。 期待する結果はブログエントリに br タグのソースコードが表示されることですが、実際には改行が表示されます(本物の br タグとして機能してしまう)。 ちなみに本件は元々 HatenaBlogWriter v0.5 https://github.com/rnanba/HatenaBlogWriter/tree/v0.5 に対する不具合報告が発端です(master には現在 monkey patch による回避コードが入っています)。はてなブログで実際に試す場合はこちらを参考にしてください。 ---------------------------------------- Bug #15057: REXML::Text#value returns a double unescaped string in non-raw mode https://bugs.ruby-lang.org/issues/15057#change-73859 * Author: rna (Ryosuke Nanba) * Status: Feedback * Priority: Normal * Assignee: kou (Kouhei Sutou) * Target version: * ruby -v: ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux-gnu] * Backport: 2.3: UNKNOWN, 2.4: UNKNOWN, 2.5: UNKNOWN ---------------------------------------- `REXML::Text` オブジェクトが非rawモードの場合、`REXML::Text#value` がエスケープ済みのテキストを二重にエスケープ解除された文字列を返します。 例: ~~~ require 'rexml/document' t = REXML::Text.new("< <", false, nil, false) t.to_s # => "&lt; <" t.value # => "< <" (expected: "< <") ~~~ `REXML::Text#value` のコメントに以下のような記述があるため、上の挙動は期待通りのように見えますが、このコメントそのものが誤りだと思います。 ~~~ # t = Text.new( "< & &s; russell", false, nil, false ) # t.value #-> "< & sean russell" ~~~ 非rawモードではコンストラクタの第一引数に渡された文字列はテキストノードが表す文字列そのものを意味するはずです。上で渡された文字列中の "&s;" は実体参照ではなく単なる3文字のテキストを意味します。`t.value` は "< & &s; russell" であるべきだと思います。 -- https://bugs.ruby-lang.org/