[ruby-dev:50635] [Ruby trunk Bug#15057] REXML::Text#value returns a double unescaped string in non-raw mode
From:
rnanba@...
Date:
2018-09-04 07:08:31 UTC
List:
ruby-dev #50635
Issue #15057 has been updated by rna (Ryosuke Nanba).
>> This ignores the 'raw' attribute setting
>
> と書いているので、rawのときもそうじゃないときも期待した挙動にするのは、互換性を維持したままではムリなんですよねぇ。
>
> なので、element1.text = element2.textという使い方がよくないんですよねぇ。ただ、こう書けたほうがうれしいので、これに匹敵する使い勝手のAPIを考えておきます。
なるほど。`REXML::Element#text` も同様のコメントがあってセマンティクスを変えられないと。残念ですが仕方がないですかね… メジャーバージョンアップの際は再検討していただけると幸いです。
> 互換性は壊したくないので、現状ではatomutilでは次のように使ってもらいたいです。
了解しました。atomutil の方にはこちらから報告しておきます。
----------------------------------------
Bug #15057: REXML::Text#value returns a double unescaped string in non-raw mode
https://bugs.ruby-lang.org/issues/15057#change-73872
* 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/