NXML 0.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/nxml.rb +192 -0
  3. metadata +44 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f08655347f6689ca26e003711ff1286beeaf22f22177902bc642a535bc2daa38
4
+ data.tar.gz: 2230e2aa5df7ef3612391a18a57bba46f330c285a9eed07513203e9c65b0f729
5
+ SHA512:
6
+ metadata.gz: 29b85a1c6b9e32b6acbe70533eff4ba7a52e1f740666f7c6dce536c7eaa2c36731c7d2746a53b4963130c5b22b1f3bd3189f91d481ea974b5eab52ae8b652d64
7
+ data.tar.gz: 7343fdbc8d299b4d745bf817286b57c4fa3a973783f554cc6fd37a2981a64d8309892a1abb4282484dceed91d24814fba994800c0696c38bbc5588614fd035b5
@@ -0,0 +1,192 @@
1
+ # Andrej Gelenberg <andrej.gelenberg@udo.edu> (c) 2019
2
+
3
+ class NXML
4
+
5
+ NAME_START = ":A-Z_a-z\u{C0}-\u{D6}\u{D8}-\u{F6}\u{F8}-\u{2FF}\u{370}-\u{37D}\u{37F}-\u{1FFF}\u{200C}-\u{200D}\u{2070}-\u{218F}\u{2C00}-\u{2FEF}\u{3001}-\u{D7FF}\u{F900}-\u{FDCF}\u{FDF0}-\u{FFFD}\u{10000}-\u{EFFFF}"
6
+ NAME_CHAR = "\\-.0-9\u{B7}\u{0300}-\u{036F}\u{203F}-\u{2040}"
7
+
8
+ NAME_RE = Regexp.new "^[#{NAME_START}][#{NAME_START}#{NAME_CHAR}]*$"
9
+
10
+ ATTR_ESCAPE_HASH = {
11
+ '&' => '&amp;',
12
+ '"' => '&quot;',
13
+ '<' => '&lt;'
14
+ }
15
+ ATTR_ESCAPE = Regexp.new "[#{ATTR_ESCAPE_HASH.keys.join}]"
16
+
17
+ TEXT_ESCAPE_HASH = {
18
+ '&' => '&amp;',
19
+ '<' => '&gt;',
20
+ '>' => '&lt;'
21
+ }
22
+ TEXT_ESCAPE = Regexp.new "[#{TEXT_ESCAPE_HASH.keys.join}]"
23
+
24
+ def self.check_name(name)
25
+ if not name.match? NAME_RE
26
+ raise ArgumentError.new "invalid XML name \"#{name}\""
27
+ end
28
+ end
29
+
30
+ def self.escape_attr_value(value)
31
+ value.gsub ATTR_ESCAPE, ATTR_ESCAPE_HASH
32
+ end
33
+
34
+ def self.escape_attr_raw(value)
35
+ value.gsub /["]/, '&quot;'
36
+ end
37
+
38
+ def self.escape_text(value)
39
+ value.gsub TEXT_ESCAPE, TEXT_ESCAPE_HASH
40
+ end
41
+
42
+ def self.escape_text_raw(value)
43
+ value.gsub /[<]/, '&lt;'
44
+ end
45
+
46
+ class Text
47
+ def initialize(text, raw = false)
48
+ if raw
49
+ @text = NXML::escape_text_raw text
50
+ else
51
+ @text = NXML::escape_text text
52
+ end
53
+ end
54
+
55
+ def to_str
56
+ @text
57
+ end
58
+ end
59
+
60
+ class Element
61
+ def initialize(name, &block)
62
+ NXML::check_name name
63
+
64
+ @name = name
65
+ @attributes = {}
66
+ @children = []
67
+
68
+ instance_eval &block if block_given?
69
+ end
70
+
71
+ def method_missing(name, value = nil, *attrs)
72
+ if name[-1] == '='
73
+ name = name[0..-2]
74
+ if value.nil?
75
+ @attributes[name]
76
+ else
77
+ attribute name, value
78
+ end
79
+ else
80
+ super name, value, *attrs
81
+ end
82
+ end
83
+
84
+ def tag(name, &block)
85
+ r = Element.new(name, &block)
86
+ @children << r
87
+ r
88
+ end
89
+
90
+ def text(text)
91
+ r = Text.new(text)
92
+ @children << r
93
+ r
94
+ end
95
+
96
+ def cdata(text)
97
+ r = CDATA.new(text)
98
+ @children << r
99
+ r
100
+ end
101
+
102
+ def attribute(name, value)
103
+ NXML::check_name name
104
+ r = NXML::escape_attr_value value
105
+ @attributes[name] = r
106
+ r
107
+ end
108
+
109
+ def attribute_raw(name, value)
110
+ XML::check_name name
111
+
112
+ r = NXML::escape_attr_raw value
113
+ @attributes[name] = r
114
+ r
115
+ end
116
+
117
+ def a(name, value)
118
+ attribute name, value
119
+ end
120
+
121
+ def to_str
122
+ ret = "<#{@name}"
123
+
124
+ if not @attributes.empty?
125
+ for k,v in @attributes
126
+ ret += " #{k}=\"#{v}\""
127
+ end
128
+ end
129
+
130
+ if @children.empty?
131
+ ret += "/>"
132
+ else
133
+ ret += ">#{@children.join}</#{@name}>"
134
+ end
135
+
136
+ ret
137
+ end
138
+
139
+ end
140
+
141
+ class CDATA
142
+ def initialize(data)
143
+ if not data.index(']]>').nil?
144
+ raise ArgumentError.new "CDATA should not contain CDATA closing sequence ']]>'"
145
+ end
146
+
147
+ @data = data
148
+ end
149
+
150
+ def to_str
151
+ "<![CDATA[#{@data}]]>"
152
+ end
153
+ end
154
+
155
+ attr_accessor :version, :encoding, :standalone, :root
156
+
157
+ def initialize(&block)
158
+ version = "1.0"
159
+ @encoding = Encoding::UTF_8
160
+
161
+ instance_eval &block
162
+ end
163
+
164
+ def root(tagname, &block)
165
+ @root = Element.new tagname, &block
166
+ end
167
+
168
+ def to_str
169
+ ret = "<?xml"
170
+
171
+ if @root.nil?
172
+ end
173
+
174
+ if not @version.nil?
175
+ ret += " version=\"#{@version}\""
176
+ end
177
+
178
+ if not @encoding.nil?
179
+ ret += " encoding=\"#{@encoding.name}\""
180
+ end
181
+
182
+ if not @standalone.nil?
183
+ ret += " standalone=\"#{@standalone ? "yes" : "no"}\""
184
+ end
185
+
186
+ ret += "?>\n"
187
+
188
+ ret += @root
189
+
190
+ ret.encode @encoding
191
+ end
192
+ end
metadata ADDED
@@ -0,0 +1,44 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: NXML
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Andrej Gelenberg
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-05-20 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: library for generating XML 1.0 documents
14
+ email: andrej.gelenberg@udo.edu
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/nxml.rb
20
+ homepage: https://gitlab.com/andrej.gelenberg/nxml
21
+ licenses:
22
+ - MIT
23
+ metadata: {}
24
+ post_install_message:
25
+ rdoc_options: []
26
+ require_paths:
27
+ - lib
28
+ required_ruby_version: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ requirements: []
39
+ rubyforge_project:
40
+ rubygems_version: 2.7.6.2
41
+ signing_key:
42
+ specification_version: 4
43
+ summary: NXML
44
+ test_files: []