aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-06 06:07:34 +0000
committerakr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2008-09-06 06:07:34 +0000
commite490d925486bfff70eeb3630e9ab0a4dc1e6ee21 (patch)
tree1361fe85f24c116ab272ad1902ea3802b09a5ab6
parent34be4c1ce5c6ad39720a48a015b40f6cc4e25ca5 (diff)
downloadruby-e490d925486bfff70eeb3630e9ab0a4dc1e6ee21.tar.gz
* transcode.c (sym_html): new variable.
(sym_text): ditto. (sym_attr): ditto. (econv_opts): check :html=>:text and :html=>:attr. (Init_transcode): initialize the above variables. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19180 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--test/ruby/test_econv.rb7
-rw-r--r--transcode.c18
3 files changed, 33 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index 545ee32d77..a214a8ed07 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Sat Sep 6 15:06:21 2008 Tanaka Akira <akr@fsij.org>
+
+ * transcode.c (sym_html): new variable.
+ (sym_text): ditto.
+ (sym_attr): ditto.
+ (econv_opts): check :html=>:text and :html=>:attr.
+ (Init_transcode): initialize the above variables.
+
Sat Sep 6 14:46:12 2008 Tanaka Akira <akr@fsij.org>
* include/ruby/encoding.h (ECONV_HTML_TEXT_ENCODER): new constant.
diff --git a/test/ruby/test_econv.rb b/test/ruby/test_econv.rb
index 6966ff4e82..3f82d2742c 100644
--- a/test/ruby/test_econv.rb
+++ b/test/ruby/test_econv.rb
@@ -768,4 +768,11 @@ class TestEncodingConverter < Test::Unit::TestCase
assert_equal("&amp;\e$B$&\e(B&amp;".force_encoding("iso-2022-jp"), ec.convert("&\u3046&"))
assert_equal('', ec.finish)
end
+
+ def test_html_hasharg
+ assert_equal("&amp;\e$B$&\e(B&#x2665;&amp;\"'".force_encoding("iso-2022-jp"),
+ "&\u3046\u2665&\"'".encode("iso-2022-jp", html: :text))
+ assert_equal("\"&amp;\e$B$&\e(B&#x2661;&amp;&quot;'\"".force_encoding("iso-2022-jp"),
+ "&\u3046\u2661&\"'".encode("iso-2022-jp", html: :attr))
+ end
end
diff --git a/transcode.c b/transcode.c
index 20303286cd..cc3fc53c7a 100644
--- a/transcode.c
+++ b/transcode.c
@@ -21,6 +21,7 @@ VALUE rb_eNoConverter;
VALUE rb_cEncodingConverter;
static VALUE sym_invalid, sym_undef, sym_ignore, sym_replace;
+static VALUE sym_html, sym_text, sym_attr;
static VALUE sym_universal_newline_decoder;
static VALUE sym_crlf_newline_encoder;
static VALUE sym_cr_newline_encoder;
@@ -2133,6 +2134,20 @@ econv_opts(VALUE opt)
rb_raise(rb_eArgError, "unknown value for undefined character option");
}
+ v = rb_hash_aref(opt, sym_html);
+ if (!NIL_P(v)) {
+ v = rb_convert_type(v, T_SYMBOL, "Symbol", "to_sym");
+ if (v==sym_text) {
+ ecflags |= ECONV_HTML_TEXT_ENCODER|ECONV_UNDEF_HEX_CHARREF;
+ }
+ else if (v==sym_attr) {
+ ecflags |= ECONV_HTML_ATTR_ENCODER|ECONV_UNDEF_HEX_CHARREF;
+ }
+ else {
+ rb_raise(rb_eArgError, "unexpected value for html option: %s", rb_id2name(SYM2ID(v)));
+ }
+ }
+
v = rb_hash_aref(opt, sym_universal_newline_decoder);
if (RTEST(v))
ecflags |= ECONV_UNIVERSAL_NEWLINE_DECODER;
@@ -3477,6 +3492,9 @@ Init_transcode(void)
sym_undef = ID2SYM(rb_intern("undef"));
sym_ignore = ID2SYM(rb_intern("ignore"));
sym_replace = ID2SYM(rb_intern("replace"));
+ sym_html = ID2SYM(rb_intern("html"));
+ sym_text = ID2SYM(rb_intern("text"));
+ sym_attr = ID2SYM(rb_intern("attr"));
sym_invalid_byte_sequence = ID2SYM(rb_intern("invalid_byte_sequence"));
sym_undefined_conversion = ID2SYM(rb_intern("undefined_conversion"));