Created
December 1, 2011 23:34
-
-
Save anonymous/1420708 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/lib/rexml/encoding.rb b/lib/rexml/encoding.rb | |
index a01763b..b74b124 100644 | |
--- a/lib/rexml/encoding.rb | |
+++ b/lib/rexml/encoding.rb | |
@@ -17,6 +17,8 @@ module REXML | |
UTF_8 = 'UTF-8' | |
UTF_16 = 'UTF-16' | |
UNILE = 'UNILE' | |
+ | |
+ attr_accessor :encoder | |
# ID ---> Encoding name | |
attr_reader :encoding | |
diff --git a/lib/rexml/encodings/CP-1252.rb b/lib/rexml/encodings/CP-1252.rb | |
index 8675f9f..2b5f74d 100644 | |
--- a/lib/rexml/encodings/CP-1252.rb | |
+++ b/lib/rexml/encodings/CP-1252.rb | |
@@ -3,101 +3,101 @@ | |
# | |
module REXML | |
module Encoding | |
- register( "CP-1252" ) do |o| | |
- class << o | |
- alias encode encode_cp1252 | |
- alias decode decode_cp1252 | |
- end | |
- end | |
- | |
# Convert from UTF-8 | |
- def encode_cp1252(content) | |
- array_utf8 = content.unpack('U*') | |
- array_enc = [] | |
- array_utf8.each do |num| | |
- case num | |
- # shortcut first bunch basic characters | |
- when 0..0xFF; array_enc << num | |
- # characters added compared to iso-8859-1 | |
- when 0x20AC; array_enc << 0x80 # 0xe2 0x82 0xac | |
- when 0x201A; array_enc << 0x82 # 0xe2 0x82 0x9a | |
- when 0x0192; array_enc << 0x83 # 0xc6 0x92 | |
- when 0x201E; array_enc << 0x84 # 0xe2 0x82 0x9e | |
- when 0x2026; array_enc << 0x85 # 0xe2 0x80 0xa6 | |
- when 0x2020; array_enc << 0x86 # 0xe2 0x80 0xa0 | |
- when 0x2021; array_enc << 0x87 # 0xe2 0x80 0xa1 | |
- when 0x02C6; array_enc << 0x88 # 0xcb 0x86 | |
- when 0x2030; array_enc << 0x89 # 0xe2 0x80 0xb0 | |
- when 0x0160; array_enc << 0x8A # 0xc5 0xa0 | |
- when 0x2039; array_enc << 0x8B # 0xe2 0x80 0xb9 | |
- when 0x0152; array_enc << 0x8C # 0xc5 0x92 | |
- when 0x017D; array_enc << 0x8E # 0xc5 0xbd | |
- when 0x2018; array_enc << 0x91 # 0xe2 0x80 0x98 | |
- when 0x2019; array_enc << 0x92 # 0xe2 0x80 0x99 | |
- when 0x201C; array_enc << 0x93 # 0xe2 0x80 0x9c | |
- when 0x201D; array_enc << 0x94 # 0xe2 0x80 0x9d | |
- when 0x2022; array_enc << 0x95 # 0xe2 0x80 0xa2 | |
- when 0x2013; array_enc << 0x96 # 0xe2 0x80 0x93 | |
- when 0x2014; array_enc << 0x97 # 0xe2 0x80 0x94 | |
- when 0x02DC; array_enc << 0x98 # 0xcb 0x9c | |
- when 0x2122; array_enc << 0x99 # 0xe2 0x84 0xa2 | |
- when 0x0161; array_enc << 0x9A # 0xc5 0xa1 | |
- when 0x203A; array_enc << 0x9B # 0xe2 0x80 0xba | |
- when 0x0152; array_enc << 0x9C # 0xc5 0x93 | |
- when 0x017E; array_enc << 0x9E # 0xc5 0xbe | |
- when 0x0178; array_enc << 0x9F # 0xc5 0xb8 | |
- else | |
- # all remaining basic characters can be used directly | |
- if num <= 0xFF | |
- array_enc << num | |
+ class CP_1252Encoder | |
+ def encode(content) | |
+ array_utf8 = content.unpack('U*') | |
+ array_enc = [] | |
+ array_utf8.each do |num| | |
+ case num | |
+ # shortcut first bunch basic characters | |
+ when 0..0xFF; array_enc << num | |
+ # characters added compared to iso-8859-1 | |
+ when 0x20AC; array_enc << 0x80 # 0xe2 0x82 0xac | |
+ when 0x201A; array_enc << 0x82 # 0xe2 0x82 0x9a | |
+ when 0x0192; array_enc << 0x83 # 0xc6 0x92 | |
+ when 0x201E; array_enc << 0x84 # 0xe2 0x82 0x9e | |
+ when 0x2026; array_enc << 0x85 # 0xe2 0x80 0xa6 | |
+ when 0x2020; array_enc << 0x86 # 0xe2 0x80 0xa0 | |
+ when 0x2021; array_enc << 0x87 # 0xe2 0x80 0xa1 | |
+ when 0x02C6; array_enc << 0x88 # 0xcb 0x86 | |
+ when 0x2030; array_enc << 0x89 # 0xe2 0x80 0xb0 | |
+ when 0x0160; array_enc << 0x8A # 0xc5 0xa0 | |
+ when 0x2039; array_enc << 0x8B # 0xe2 0x80 0xb9 | |
+ when 0x0152; array_enc << 0x8C # 0xc5 0x92 | |
+ when 0x017D; array_enc << 0x8E # 0xc5 0xbd | |
+ when 0x2018; array_enc << 0x91 # 0xe2 0x80 0x98 | |
+ when 0x2019; array_enc << 0x92 # 0xe2 0x80 0x99 | |
+ when 0x201C; array_enc << 0x93 # 0xe2 0x80 0x9c | |
+ when 0x201D; array_enc << 0x94 # 0xe2 0x80 0x9d | |
+ when 0x2022; array_enc << 0x95 # 0xe2 0x80 0xa2 | |
+ when 0x2013; array_enc << 0x96 # 0xe2 0x80 0x93 | |
+ when 0x2014; array_enc << 0x97 # 0xe2 0x80 0x94 | |
+ when 0x02DC; array_enc << 0x98 # 0xcb 0x9c | |
+ when 0x2122; array_enc << 0x99 # 0xe2 0x84 0xa2 | |
+ when 0x0161; array_enc << 0x9A # 0xc5 0xa1 | |
+ when 0x203A; array_enc << 0x9B # 0xe2 0x80 0xba | |
+ when 0x0152; array_enc << 0x9C # 0xc5 0x93 | |
+ when 0x017E; array_enc << 0x9E # 0xc5 0xbe | |
+ when 0x0178; array_enc << 0x9F # 0xc5 0xb8 | |
else | |
- # Numeric entity (&#nnnn;); shard by Stefan Scholl | |
- array_enc.concat "&\##{num};".unpack('C*') | |
+ # all remaining basic characters can be used directly | |
+ if num <= 0xFF | |
+ array_enc << num | |
+ else | |
+ # Numeric entity (&#nnnn;); shard by Stefan Scholl | |
+ array_enc.concat "&\##{num};".unpack('C*') | |
+ end | |
end | |
end | |
+ array_enc.pack('C*') | |
end | |
- array_enc.pack('C*') | |
- end | |
- | |
- # Convert to UTF-8 | |
- def decode_cp1252(str) | |
- array_latin9 = str.unpack('C*') | |
- array_enc = [] | |
- array_latin9.each do |num| | |
- case num | |
- # characters that added compared to iso-8859-1 | |
- when 0x80; array_enc << 0x20AC # 0xe2 0x82 0xac | |
- when 0x82; array_enc << 0x201A # 0xe2 0x82 0x9a | |
- when 0x83; array_enc << 0x0192 # 0xc6 0x92 | |
- when 0x84; array_enc << 0x201E # 0xe2 0x82 0x9e | |
- when 0x85; array_enc << 0x2026 # 0xe2 0x80 0xa6 | |
- when 0x86; array_enc << 0x2020 # 0xe2 0x80 0xa0 | |
- when 0x87; array_enc << 0x2021 # 0xe2 0x80 0xa1 | |
- when 0x88; array_enc << 0x02C6 # 0xcb 0x86 | |
- when 0x89; array_enc << 0x2030 # 0xe2 0x80 0xb0 | |
- when 0x8A; array_enc << 0x0160 # 0xc5 0xa0 | |
- when 0x8B; array_enc << 0x2039 # 0xe2 0x80 0xb9 | |
- when 0x8C; array_enc << 0x0152 # 0xc5 0x92 | |
- when 0x8E; array_enc << 0x017D # 0xc5 0xbd | |
- when 0x91; array_enc << 0x2018 # 0xe2 0x80 0x98 | |
- when 0x92; array_enc << 0x2019 # 0xe2 0x80 0x99 | |
- when 0x93; array_enc << 0x201C # 0xe2 0x80 0x9c | |
- when 0x94; array_enc << 0x201D # 0xe2 0x80 0x9d | |
- when 0x95; array_enc << 0x2022 # 0xe2 0x80 0xa2 | |
- when 0x96; array_enc << 0x2013 # 0xe2 0x80 0x93 | |
- when 0x97; array_enc << 0x2014 # 0xe2 0x80 0x94 | |
- when 0x98; array_enc << 0x02DC # 0xcb 0x9c | |
- when 0x99; array_enc << 0x2122 # 0xe2 0x84 0xa2 | |
- when 0x9A; array_enc << 0x0161 # 0xc5 0xa1 | |
- when 0x9B; array_enc << 0x203A # 0xe2 0x80 0xba | |
- when 0x9C; array_enc << 0x0152 # 0xc5 0x93 | |
- when 0x9E; array_enc << 0x017E # 0xc5 0xbe | |
- when 0x9F; array_enc << 0x0178 # 0xc5 0xb8 | |
- else | |
- array_enc << num | |
+ | |
+ # Convert to UTF-8 | |
+ def decode(str) | |
+ array_latin9 = str.unpack('C*') | |
+ array_enc = [] | |
+ array_latin9.each do |num| | |
+ case num | |
+ # characters that added compared to iso-8859-1 | |
+ when 0x80; array_enc << 0x20AC # 0xe2 0x82 0xac | |
+ when 0x82; array_enc << 0x201A # 0xe2 0x82 0x9a | |
+ when 0x83; array_enc << 0x0192 # 0xc6 0x92 | |
+ when 0x84; array_enc << 0x201E # 0xe2 0x82 0x9e | |
+ when 0x85; array_enc << 0x2026 # 0xe2 0x80 0xa6 | |
+ when 0x86; array_enc << 0x2020 # 0xe2 0x80 0xa0 | |
+ when 0x87; array_enc << 0x2021 # 0xe2 0x80 0xa1 | |
+ when 0x88; array_enc << 0x02C6 # 0xcb 0x86 | |
+ when 0x89; array_enc << 0x2030 # 0xe2 0x80 0xb0 | |
+ when 0x8A; array_enc << 0x0160 # 0xc5 0xa0 | |
+ when 0x8B; array_enc << 0x2039 # 0xe2 0x80 0xb9 | |
+ when 0x8C; array_enc << 0x0152 # 0xc5 0x92 | |
+ when 0x8E; array_enc << 0x017D # 0xc5 0xbd | |
+ when 0x91; array_enc << 0x2018 # 0xe2 0x80 0x98 | |
+ when 0x92; array_enc << 0x2019 # 0xe2 0x80 0x99 | |
+ when 0x93; array_enc << 0x201C # 0xe2 0x80 0x9c | |
+ when 0x94; array_enc << 0x201D # 0xe2 0x80 0x9d | |
+ when 0x95; array_enc << 0x2022 # 0xe2 0x80 0xa2 | |
+ when 0x96; array_enc << 0x2013 # 0xe2 0x80 0x93 | |
+ when 0x97; array_enc << 0x2014 # 0xe2 0x80 0x94 | |
+ when 0x98; array_enc << 0x02DC # 0xcb 0x9c | |
+ when 0x99; array_enc << 0x2122 # 0xe2 0x84 0xa2 | |
+ when 0x9A; array_enc << 0x0161 # 0xc5 0xa1 | |
+ when 0x9B; array_enc << 0x203A # 0xe2 0x80 0xba | |
+ when 0x9C; array_enc << 0x0152 # 0xc5 0x93 | |
+ when 0x9E; array_enc << 0x017E # 0xc5 0xbe | |
+ when 0x9F; array_enc << 0x0178 # 0xc5 0xb8 | |
+ else | |
+ array_enc << num | |
+ end | |
end | |
+ array_enc.pack('U*') | |
end | |
- array_enc.pack('U*') | |
+ end | |
+ | |
+ cp_1252 = CP_1252Encoder.new | |
+ register( "CP-1252" ) do |o| | |
+ o.encoder = cp_1252 | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/EUC-JP.rb b/lib/rexml/encodings/EUC-JP.rb | |
index db37b6b..15063c0 100644 | |
--- a/lib/rexml/encodings/EUC-JP.rb | |
+++ b/lib/rexml/encodings/EUC-JP.rb | |
@@ -3,12 +3,14 @@ module REXML | |
begin | |
require 'uconv' | |
- def decode_eucjp(str) | |
- Uconv::euctou8(str) | |
- end | |
- | |
- def encode_eucjp content | |
- Uconv::u8toeuc(content) | |
+ class EUC_JP | |
+ def decode(str) | |
+ Uconv::euctou8(str) | |
+ end | |
+ | |
+ def encode content | |
+ Uconv::u8toeuc(content) | |
+ end | |
end | |
rescue LoadError | |
require 'nkf' | |
@@ -16,20 +18,20 @@ module REXML | |
EUCTOU8 = '-Ewm0' | |
U8TOEUC = '-Wem0' | |
- def decode_eucjp(str) | |
- NKF.nkf(EUCTOU8, str) | |
- end | |
- | |
- def encode_eucjp content | |
- NKF.nkf(U8TOEUC, content) | |
+ class EUC_JPEncoder | |
+ def decode(str) | |
+ NKF.nkf(EUCTOU8, str) | |
+ end | |
+ | |
+ def encode content | |
+ NKF.nkf(U8TOEUC, content) | |
+ end | |
end | |
end | |
+ euc_jp = EUC_JPEncoder.new | |
register("EUC-JP") do |obj| | |
- class << obj | |
- alias decode decode_eucjp | |
- alias encode encode_eucjp | |
- end | |
+ obj.encoder = euc_jp | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/ICONV.rb b/lib/rexml/encodings/ICONV.rb | |
index 172fba7..297738b 100644 | |
--- a/lib/rexml/encodings/ICONV.rb | |
+++ b/lib/rexml/encodings/ICONV.rb | |
@@ -3,20 +3,20 @@ raise LoadError unless defined? Iconv | |
module REXML | |
module Encoding | |
- def decode_iconv(str) | |
- Iconv.conv(UTF_8, @encoding, str) | |
- end | |
- | |
- def encode_iconv(content) | |
- Iconv.conv(@encoding, UTF_8, content) | |
+ class ICONVEncoder | |
+ def decode(str) | |
+ Iconv.conv(UTF_8, @encoding, str) | |
+ end | |
+ | |
+ def encode(content) | |
+ Iconv.conv(@encoding, UTF_8, content) | |
+ end | |
end | |
+ iconv = ICONVEncoder.new | |
register("ICONV") do |obj| | |
Iconv.conv(UTF_8, obj.encoding, nil) | |
- class << obj | |
- alias decode decode_iconv | |
- alias encode encode_iconv | |
- end | |
+ obj.encoder = iconv | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/ISO-8859-15.rb b/lib/rexml/encodings/ISO-8859-15.rb | |
index 8dea0d3..23632d8 100644 | |
--- a/lib/rexml/encodings/ISO-8859-15.rb | |
+++ b/lib/rexml/encodings/ISO-8859-15.rb | |
@@ -3,70 +3,72 @@ | |
# | |
module REXML | |
module Encoding | |
- register("ISO-8859-15") do |o| | |
- alias encode to_iso_8859_15 | |
- alias decode from_iso_8859_15 | |
- end | |
- | |
- # Convert from UTF-8 | |
- def to_iso_8859_15(content) | |
- array_utf8 = content.unpack('U*') | |
- array_enc = [] | |
- array_utf8.each do |num| | |
- case num | |
- # shortcut first bunch basic characters | |
- when 0..0xA3; array_enc << num | |
- # characters removed compared to iso-8859-1 | |
- when 0xA4; array_enc << '¤' | |
- when 0xA6; array_enc << '¦' | |
- when 0xA8; array_enc << '¨' | |
- when 0xB4; array_enc << '´' | |
- when 0xB8; array_enc << '¸' | |
- when 0xBC; array_enc << '¼' | |
- when 0xBD; array_enc << '½' | |
- when 0xBE; array_enc << '¾' | |
- # characters added compared to iso-8859-1 | |
- when 0x20AC; array_enc << 0xA4 # 0xe2 0x82 0xac | |
- when 0x0160; array_enc << 0xA6 # 0xc5 0xa0 | |
- when 0x0161; array_enc << 0xA8 # 0xc5 0xa1 | |
- when 0x017D; array_enc << 0xB4 # 0xc5 0xbd | |
- when 0x017E; array_enc << 0xB8 # 0xc5 0xbe | |
- when 0x0152; array_enc << 0xBC # 0xc5 0x92 | |
- when 0x0153; array_enc << 0xBD # 0xc5 0x93 | |
- when 0x0178; array_enc << 0xBE # 0xc5 0xb8 | |
- else | |
- # all remaining basic characters can be used directly | |
- if num <= 0xFF | |
- array_enc << num | |
+ class ISO_8859_15Encoder | |
+ # Convert from UTF-8 | |
+ def encode(content) | |
+ array_utf8 = content.unpack('U*') | |
+ array_enc = [] | |
+ array_utf8.each do |num| | |
+ case num | |
+ # shortcut first bunch basic characters | |
+ when 0..0xA3; array_enc << num | |
+ # characters removed compared to iso-8859-1 | |
+ when 0xA4; array_enc << '¤' | |
+ when 0xA6; array_enc << '¦' | |
+ when 0xA8; array_enc << '¨' | |
+ when 0xB4; array_enc << '´' | |
+ when 0xB8; array_enc << '¸' | |
+ when 0xBC; array_enc << '¼' | |
+ when 0xBD; array_enc << '½' | |
+ when 0xBE; array_enc << '¾' | |
+ # characters added compared to iso-8859-1 | |
+ when 0x20AC; array_enc << 0xA4 # 0xe2 0x82 0xac | |
+ when 0x0160; array_enc << 0xA6 # 0xc5 0xa0 | |
+ when 0x0161; array_enc << 0xA8 # 0xc5 0xa1 | |
+ when 0x017D; array_enc << 0xB4 # 0xc5 0xbd | |
+ when 0x017E; array_enc << 0xB8 # 0xc5 0xbe | |
+ when 0x0152; array_enc << 0xBC # 0xc5 0x92 | |
+ when 0x0153; array_enc << 0xBD # 0xc5 0x93 | |
+ when 0x0178; array_enc << 0xBE # 0xc5 0xb8 | |
else | |
- # Numeric entity (&#nnnn;); shard by Stefan Scholl | |
- array_enc.concat "&\##{num};".unpack('C*') | |
+ # all remaining basic characters can be used directly | |
+ if num <= 0xFF | |
+ array_enc << num | |
+ else | |
+ # Numeric entity (&#nnnn;); shard by Stefan Scholl | |
+ array_enc.concat "&\##{num};".unpack('C*') | |
+ end | |
end | |
end | |
+ array_enc.pack('C*') | |
end | |
- array_enc.pack('C*') | |
- end | |
- | |
- # Convert to UTF-8 | |
- def from_iso_8859_15(str) | |
- array_latin9 = str.unpack('C*') | |
- array_enc = [] | |
- array_latin9.each do |num| | |
- case num | |
- # characters that differ compared to iso-8859-1 | |
- when 0xA4; array_enc << 0x20AC | |
- when 0xA6; array_enc << 0x0160 | |
- when 0xA8; array_enc << 0x0161 | |
- when 0xB4; array_enc << 0x017D | |
- when 0xB8; array_enc << 0x017E | |
- when 0xBC; array_enc << 0x0152 | |
- when 0xBD; array_enc << 0x0153 | |
- when 0xBE; array_enc << 0x0178 | |
- else | |
- array_enc << num | |
+ | |
+ # Convert to UTF-8 | |
+ def decode(str) | |
+ array_latin9 = str.unpack('C*') | |
+ array_enc = [] | |
+ array_latin9.each do |num| | |
+ case num | |
+ # characters that differ compared to iso-8859-1 | |
+ when 0xA4; array_enc << 0x20AC | |
+ when 0xA6; array_enc << 0x0160 | |
+ when 0xA8; array_enc << 0x0161 | |
+ when 0xB4; array_enc << 0x017D | |
+ when 0xB8; array_enc << 0x017E | |
+ when 0xBC; array_enc << 0x0152 | |
+ when 0xBD; array_enc << 0x0153 | |
+ when 0xBE; array_enc << 0x0178 | |
+ else | |
+ array_enc << num | |
+ end | |
end | |
+ array_enc.pack('U*') | |
end | |
- array_enc.pack('U*') | |
+ end | |
+ | |
+ iso_8859_15 = ISO_8859_15Encoder.new | |
+ register("ISO-8859-15") do |o| | |
+ o.encoder = iso_8859_15 | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/SHIFT-JIS.rb b/lib/rexml/encodings/SHIFT-JIS.rb | |
index 9e0f4af..313d426 100644 | |
--- a/lib/rexml/encodings/SHIFT-JIS.rb | |
+++ b/lib/rexml/encodings/SHIFT-JIS.rb | |
@@ -2,34 +2,36 @@ module REXML | |
module Encoding | |
begin | |
require 'uconv' | |
- | |
- def decode_sjis content | |
- Uconv::sjistou8(content) | |
- end | |
- | |
- def encode_sjis(str) | |
- Uconv::u8tosjis(str) | |
+ | |
+ class SHIFT_JISEncoder | |
+ def decode content | |
+ Uconv::sjistou8(content) | |
+ end | |
+ | |
+ def encode(str) | |
+ Uconv::u8tosjis(str) | |
+ end | |
end | |
rescue LoadError | |
require 'nkf' | |
SJISTOU8 = '-Swm0x' | |
U8TOSJIS = '-Wsm0x' | |
- | |
- def decode_sjis(str) | |
- NKF.nkf(SJISTOU8, str) | |
- end | |
- | |
- def encode_sjis content | |
- NKF.nkf(U8TOSJIS, content) | |
+ | |
+ class SHIFT_JISEncoder | |
+ def decode(str) | |
+ NKF.nkf(SJISTOU8, str) | |
+ end | |
+ | |
+ def encode content | |
+ NKF.nkf(U8TOSJIS, content) | |
+ end | |
end | |
end | |
+ shift_jis = SHIFT_JISEncoder.new | |
b = proc do |obj| | |
- class << obj | |
- alias decode decode_sjis | |
- alias encode encode_sjis | |
- end | |
+ obj.encoder = shift_jis | |
end | |
register("SHIFT-JIS", &b) | |
register("SHIFT_JIS", &b) | |
diff --git a/lib/rexml/encodings/UNILE.rb b/lib/rexml/encodings/UNILE.rb | |
index d054140..6e360b1 100644 | |
--- a/lib/rexml/encodings/UNILE.rb | |
+++ b/lib/rexml/encodings/UNILE.rb | |
@@ -1,34 +1,34 @@ | |
module REXML | |
module Encoding | |
- def encode_unile content | |
- array_utf8 = content.unpack("U*") | |
- array_enc = [] | |
- array_utf8.each do |num| | |
- if ((num>>16) > 0) | |
- array_enc << ?? | |
- array_enc << 0 | |
- else | |
- array_enc << (num & 0xFF) | |
- array_enc << (num >> 8) | |
+ class UNILEEncoder | |
+ def encode content | |
+ array_utf8 = content.unpack("U*") | |
+ array_enc = [] | |
+ array_utf8.each do |num| | |
+ if ((num>>16) > 0) | |
+ array_enc << ?? | |
+ array_enc << 0 | |
+ else | |
+ array_enc << (num & 0xFF) | |
+ array_enc << (num >> 8) | |
+ end | |
end | |
+ array_enc.pack('C*') | |
+ end | |
+ | |
+ def decode(str) | |
+ array_enc=str.unpack('C*') | |
+ array_utf8 = [] | |
+ 0.step(array_enc.size-1, 2){|i| | |
+ array_utf8 << (array_enc.at(i) + array_enc.at(i+1)*0x100) | |
+ } | |
+ array_utf8.pack('U*') | |
end | |
- array_enc.pack('C*') | |
- end | |
- | |
- def decode_unile(str) | |
- array_enc=str.unpack('C*') | |
- array_utf8 = [] | |
- 0.step(array_enc.size-1, 2){|i| | |
- array_utf8 << (array_enc.at(i) + array_enc.at(i+1)*0x100) | |
- } | |
- array_utf8.pack('U*') | |
end | |
+ unile = UNILEEncoder.new | |
register(UNILE) do |obj| | |
- class << obj | |
- alias decode decode_unile | |
- alias encode encode_unile | |
- end | |
+ obj.encoder = unile | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/US-ASCII.rb b/lib/rexml/encodings/US-ASCII.rb | |
index fb4c217..5aea358 100644 | |
--- a/lib/rexml/encodings/US-ASCII.rb | |
+++ b/lib/rexml/encodings/US-ASCII.rb | |
@@ -1,30 +1,30 @@ | |
module REXML | |
module Encoding | |
- # Convert from UTF-8 | |
- def encode_ascii content | |
- array_utf8 = content.unpack('U*') | |
- array_enc = [] | |
- array_utf8.each do |num| | |
- if num <= 0x7F | |
- array_enc << num | |
- else | |
- # Numeric entity (&#nnnn;); shard by Stefan Scholl | |
- array_enc.concat "&\##{num};".unpack('C*') | |
+ class US_ASCIIEncoder | |
+ # Convert from UTF-8 | |
+ def encode content | |
+ array_utf8 = content.unpack('U*') | |
+ array_enc = [] | |
+ array_utf8.each do |num| | |
+ if num <= 0x7F | |
+ array_enc << num | |
+ else | |
+ # Numeric entity (&#nnnn;); shard by Stefan Scholl | |
+ array_enc.concat "&\##{num};".unpack('C*') | |
+ end | |
end | |
+ array_enc.pack('C*') | |
+ end | |
+ | |
+ # Convert to UTF-8 | |
+ def decode(str) | |
+ str.unpack('C*').pack('U*') | |
end | |
- array_enc.pack('C*') | |
- end | |
- | |
- # Convert to UTF-8 | |
- def decode_ascii(str) | |
- str.unpack('C*').pack('U*') | |
end | |
+ us_ascii = US_ASCIIEncoder.new | |
register("US-ASCII") do |obj| | |
- class << obj | |
- alias decode decode_ascii | |
- alias encode encode_ascii | |
- end | |
+ us_ascii.encoder = us_ascii | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/UTF-16.rb b/lib/rexml/encodings/UTF-16.rb | |
index 007c493..640fcc3 100644 | |
--- a/lib/rexml/encodings/UTF-16.rb | |
+++ b/lib/rexml/encodings/UTF-16.rb | |
@@ -1,35 +1,35 @@ | |
module REXML | |
module Encoding | |
- def encode_utf16 content | |
- array_utf8 = content.unpack("U*") | |
- array_enc = [] | |
- array_utf8.each do |num| | |
- if ((num>>16) > 0) | |
- array_enc << 0 | |
- array_enc << ?? | |
- else | |
- array_enc << (num >> 8) | |
- array_enc << (num & 0xFF) | |
+ class UTF_16Encoder | |
+ def encode content | |
+ array_utf8 = content.unpack("U*") | |
+ array_enc = [] | |
+ array_utf8.each do |num| | |
+ if ((num>>16) > 0) | |
+ array_enc << 0 | |
+ array_enc << ?? | |
+ else | |
+ array_enc << (num >> 8) | |
+ array_enc << (num & 0xFF) | |
+ end | |
end | |
+ array_enc.pack('C*') | |
+ end | |
+ | |
+ def decode(str) | |
+ str = str[2..-1] if /^\376\377/n =~ str | |
+ array_enc=str.unpack('C*') | |
+ array_utf8 = [] | |
+ 0.step(array_enc.size-1, 2){|i| | |
+ array_utf8 << (array_enc.at(i+1) + array_enc.at(i)*0x100) | |
+ } | |
+ array_utf8.pack('U*') | |
end | |
- array_enc.pack('C*') | |
- end | |
- | |
- def decode_utf16(str) | |
- str = str[2..-1] if /^\376\377/n =~ str | |
- array_enc=str.unpack('C*') | |
- array_utf8 = [] | |
- 0.step(array_enc.size-1, 2){|i| | |
- array_utf8 << (array_enc.at(i+1) + array_enc.at(i)*0x100) | |
- } | |
- array_utf8.pack('U*') | |
end | |
+ utf_16 = UTF_16Encoder.new | |
register(UTF_16) do |obj| | |
- class << obj | |
- alias decode decode_utf16 | |
- alias encode encode_utf16 | |
- end | |
+ obj.encoder = utf_16 | |
end | |
end | |
end | |
diff --git a/lib/rexml/encodings/UTF-8.rb b/lib/rexml/encodings/UTF-8.rb | |
index bb08f44..42f7b38 100644 | |
--- a/lib/rexml/encodings/UTF-8.rb | |
+++ b/lib/rexml/encodings/UTF-8.rb | |
@@ -1,18 +1,18 @@ | |
module REXML | |
module Encoding | |
- def encode_utf8 content | |
- content | |
- end | |
- | |
- def decode_utf8(str) | |
- str | |
+ class UTF_8Encoder | |
+ def encode content | |
+ content | |
+ end | |
+ | |
+ def decode(str) | |
+ str | |
+ end | |
end | |
+ utf_8 = UTF_8Encoder.new | |
register(UTF_8) do |obj| | |
- class << obj | |
- alias decode decode_utf8 | |
- alias encode encode_utf8 | |
- end | |
+ obj.encoder = utf_8 | |
end | |
end | |
end | |
diff --git a/lib/rexml/parsers/baseparser.rb b/lib/rexml/parsers/baseparser.rb | |
index fc2354a..50a7a81 100644 | |
--- a/lib/rexml/parsers/baseparser.rb | |
+++ b/lib/rexml/parsers/baseparser.rb | |
@@ -108,22 +108,10 @@ module REXML | |
def initialize( source ) | |
self.stream = source | |
+ @listeners = [] | |
end | |
def add_listener( listener ) | |
- if !defined?(@listeners) or !@listeners | |
- @listeners = [] | |
- instance_eval <<-EOL | |
- alias :_old_pull :pull | |
- def pull | |
- event = _old_pull | |
- @listeners.each do |listener| | |
- listener.receive event | |
- end | |
- event | |
- end | |
- EOL | |
- end | |
@listeners << listener | |
end | |
@@ -186,6 +174,14 @@ module REXML | |
# Returns the next event. This is a +PullEvent+ object. | |
def pull | |
+ _pull_inner.tap do |event| | |
+ @listeners.each do |listener| | |
+ listener.receive event | |
+ end | |
+ end | |
+ end | |
+ | |
+ def _pull_inner | |
if @closed | |
x, @closed = @closed, nil | |
return [ :end_element, x ] | |
diff --git a/lib/rexml/source.rb b/lib/rexml/source.rb | |
index ce7a2c9..aa9f20f 100644 | |
--- a/lib/rexml/source.rb | |
+++ b/lib/rexml/source.rb | |
@@ -52,9 +52,9 @@ module REXML | |
# Overridden to support optimized en/decoding | |
def encoding=(enc) | |
return unless super | |
- @line_break = encode( '>' ) | |
+ @line_break = @encoder.encode( '>' ) | |
if enc != UTF_8 | |
- @buffer = decode(@buffer) | |
+ @buffer = @encoder.decode(@buffer) | |
@to_utf = true | |
else | |
@to_utf = false |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment