/
decode_entities.rb
77 lines (61 loc) · 3.16 KB
/
decode_entities.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#--
###############################################################################
# #
# A component of cmess, the encoding tool-box. #
# #
# Copyright (C) 2008-2012 University of Cologne, #
# Albertus-Magnus-Platz, #
# 50923 Cologne, Germany #
# #
# Copyright (C) 2013-2014 Jens Wille #
# #
# Authors: #
# Jens Wille <jens.wille@gmail.com> #
# #
# cmess is free software; you can redistribute it and/or modify it under the #
# terms of the GNU Affero General Public License as published by the Free #
# Software Foundation; either version 3 of the License, or (at your option) #
# any later version. #
# #
# cmess is distributed in the hope that it will be useful, but WITHOUT ANY #
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS #
# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for #
# more details. #
# #
# You should have received a copy of the GNU Affero General Public License #
# along with cmess. If not, see <http://www.gnu.org/licenses/>. #
# #
###############################################################################
#++
require 'htmlentities'
require 'cmess' unless Object.const_defined?(:CMess)
module CMess::DecodeEntities
extend self
VERSION = '0.1.0'
# HTMLEntities requires UTF-8
ENCODING = 'UTF-8'
DEFAULT_FLAVOUR = 'xml-safe'
def decode(options)
input, output, source = CMess.ensure_options!(options,
:input, :output, :source_encoding
)
target, entities, encoding = options[:target_encoding] || source,
HTMLEntities.new(options[:flavour] || DEFAULT_FLAVOUR), ENCODING
skip_source, skip_target = source == encoding, target == encoding
input.each { |line|
line = encode(line, source, encoding) unless skip_source
line = entities.decode(line)
line = encode(line, encoding, target) unless skip_target
output.puts(line)
}
end
private
def encode(string, source, target)
string.encode(target, source)
end
end
class HTMLEntities # :nodoc:
FLAVORS << 'xml-safe'
MAPPINGS['xml-safe'] = MAPPINGS['xhtml1'].dup
%w[amp apos gt lt quot].each { |key| MAPPINGS['xml-safe'].delete(key) }
end