htx 0.0.6 → 0.0.7
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.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/lib/htx/template.rb +30 -19
- data/lib/htx/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc1adc5f7b7b12da438f6c96c5a81b3585a8f9a8b761d54eee3895b5195898ec
|
4
|
+
data.tar.gz: cfc75dd48759fdb2151db74de71ce9c7ae07a73e07d20af415e96a0a37c07bda
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 81660a171c9eb0a384b483f5391bd929bec1833aceef2128ecefcfba1190ea4343efbc02f286f241fcf435dcd3fd860fd7f9844a6c29358d84e5005b10e2a62b
|
7
|
+
data.tar.gz: c8f764200a3e0f5fb19d1c19cc8f8e5a71209b4d0e8e87f7cf27941fbf0595090395ee141a136c67670be865de8dba50235d7f10ce8fc0ccd4a2cd060809af09
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.7
|
data/lib/htx/template.rb
CHANGED
@@ -4,13 +4,13 @@ require('nokogiri')
|
|
4
4
|
|
5
5
|
module HTX
|
6
6
|
class Template
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
FLAG_BITS
|
7
|
+
ELEMENT = 0b001
|
8
|
+
CHILDLESS = 0b010
|
9
|
+
XMLNS = 0b100
|
10
|
+
FLAG_BITS = 3
|
11
11
|
|
12
12
|
INDENT_DEFAULT = ' '
|
13
|
-
|
13
|
+
CONTENT_TAG = 'htx-content'
|
14
14
|
DYNAMIC_KEY_ATTR = 'htx-key'
|
15
15
|
|
16
16
|
DEFAULT_XMLNS = {
|
@@ -35,11 +35,12 @@ module HTX
|
|
35
35
|
HTML_ENTITY = /&([a-zA-Z]+|#\d+|x[0-9a-fA-F]+);/.freeze
|
36
36
|
NON_CONTROL_STATEMENT = /#{INTERPOLATION}|(#{HTML_ENTITY})/.freeze
|
37
37
|
CONTROL_STATEMENT = /[{}();]/.freeze
|
38
|
+
UNESCAPED_BACKTICK = /(?<!\\)((\\\\)*)`/.freeze
|
38
39
|
CLOSE_STATEMENT = /;?\s*htx\.close\((\d*)\);?(\s*)\z/.freeze
|
39
40
|
|
40
41
|
##
|
41
42
|
# Returns false. In the near future when support for the <:> tag has been dropped (in favor of
|
42
|
-
# <htx-
|
43
|
+
# <htx-content>), will return true if Nokogiri's HTML5 parser is available. To use it now, monkey patch
|
43
44
|
# this method to return true.
|
44
45
|
#
|
45
46
|
def self.html5_parser?
|
@@ -116,20 +117,25 @@ module HTX
|
|
116
117
|
#
|
117
118
|
# * +base+ - Base Nokogiri node to start from.
|
118
119
|
#
|
119
|
-
def process(base)
|
120
|
+
def process(base, xmlns: false)
|
120
121
|
base.children.each do |node|
|
121
122
|
next unless node.element? || node.text?
|
122
123
|
|
123
124
|
dynamic_key = process_value(node.attr(DYNAMIC_KEY_ATTR), :attr)
|
124
125
|
|
125
|
-
if node.text? || node.name ==
|
126
|
-
if node.name
|
127
|
-
warn("#{@name}:#{node.line}: The
|
128
|
-
|
126
|
+
if node.text? || node.name == CONTENT_TAG || node.name == 'htx-text' || node.name == ':'
|
127
|
+
if !node.text? && node.name != CONTENT_TAG
|
128
|
+
warn("#{@name}:#{node.line}: The <#{node.name}> tag has been deprecated. Please use "\
|
129
|
+
"<#{CONTENT_TAG}> for identical functionality.")
|
130
|
+
end
|
131
|
+
|
132
|
+
if (node.attributes.size - (dynamic_key ? 1 : 0)) != 0
|
133
|
+
raise(MalformedTemplateError.new("<#{node.name}> tags may not have attributes other than "\
|
134
|
+
"#{DYNAMIC_KEY_ATTR}", @name, node))
|
129
135
|
end
|
130
136
|
|
131
137
|
if (non_text_node = node.children.find { |n| !n.text? })
|
132
|
-
raise(MalformedTemplateError.new(
|
138
|
+
raise(MalformedTemplateError.new("<#{node.name}> tags may not contain child tags", @name,
|
133
139
|
non_text_node))
|
134
140
|
end
|
135
141
|
|
@@ -141,7 +147,7 @@ module HTX
|
|
141
147
|
"htx.node(#{[
|
142
148
|
value,
|
143
149
|
dynamic_key,
|
144
|
-
(
|
150
|
+
(@static_key += 1) << FLAG_BITS,
|
145
151
|
].compact.join(', ')})"\
|
146
152
|
"#{indent(text[TRAILING_WHITESPACE])}"
|
147
153
|
)
|
@@ -150,17 +156,18 @@ module HTX
|
|
150
156
|
end
|
151
157
|
else
|
152
158
|
childless = node.children.empty? || (node.children.size == 1 && node.children[0].text.strip == '')
|
153
|
-
attrs,
|
159
|
+
attrs, explicit_xmlns = process_attrs(node)
|
160
|
+
xmlns ||= explicit_xmlns
|
154
161
|
|
155
162
|
append("htx.node(#{[
|
156
163
|
"'#{tag_name(node.name)}'",
|
157
164
|
attrs,
|
158
165
|
dynamic_key,
|
159
|
-
((@static_key += 1) << FLAG_BITS) | (childless ? CHILDLESS : 0) | (xmlns ?
|
166
|
+
((@static_key += 1) << FLAG_BITS) | ELEMENT | (childless ? CHILDLESS : 0) | (xmlns ? XMLNS : 0),
|
160
167
|
].compact.flatten.join(', ')})")
|
161
168
|
|
162
169
|
unless childless
|
163
|
-
process(node)
|
170
|
+
process(node, xmlns: xmlns)
|
164
171
|
|
165
172
|
count = ''
|
166
173
|
@compiled.sub!(CLOSE_STATEMENT) do
|
@@ -220,13 +227,16 @@ module HTX
|
|
220
227
|
# Entire text is enclosed in ${...}.
|
221
228
|
value.strip!
|
222
229
|
quote = false
|
230
|
+
escape_quotes = false
|
223
231
|
elsif (value = text[TEMPLATE_STRING, 1])
|
224
232
|
# Entire text is enclosed in backticks (template string).
|
225
233
|
quote = true
|
234
|
+
escape_quotes = false
|
226
235
|
elsif is_attr || text.gsub(NON_CONTROL_STATEMENT, '') !~ CONTROL_STATEMENT
|
227
236
|
# Text is an attribute value or doesn't match control statement pattern.
|
228
237
|
value = text.dup
|
229
238
|
quote = true
|
239
|
+
escape_quotes = true
|
230
240
|
else
|
231
241
|
return nil
|
232
242
|
end
|
@@ -235,6 +245,7 @@ module HTX
|
|
235
245
|
# calculation ignores everything before the first newline in its search for the least-indented line.
|
236
246
|
outdent = value.scan(NON_BLANK_NON_FIRST_LINE).min
|
237
247
|
value.gsub!(/#{LEADING_WHITESPACE}|#{TRAILING_WHITESPACE}|^#{outdent}/, '')
|
248
|
+
value.gsub!(UNESCAPED_BACKTICK, '\1\\\`') if escape_quotes
|
238
249
|
value.insert(0, '`').insert(-1, '`') if quote
|
239
250
|
|
240
251
|
# Ensure any Unicode characters get converted to Unicode escape sequences. Also note that since
|
@@ -300,9 +311,9 @@ module HTX
|
|
300
311
|
#
|
301
312
|
# Note: Nokogiri's newer HTML5 parser resulting from the Nokogumbo merge fixes this issue, but it is
|
302
313
|
# currently not available for JRuby. It also does not parse <:> as a tag, which is why it's been
|
303
|
-
# deprecated in favor of <htx-
|
304
|
-
# will be used for regular Ruby and this tag and attribute mapping hack reserved for JRuby (and
|
305
|
-
# other potential environments where the HTML5 parser is not available).
|
314
|
+
# deprecated in favor of <htx-content>. Once support for <:> has been completely removed, the HTML5
|
315
|
+
# parser will be used for regular Ruby and this tag and attribute mapping hack reserved for JRuby (and
|
316
|
+
# any other potential environments where the HTML5 parser is not available).
|
306
317
|
|
307
318
|
# Source: https://developer.mozilla.org/en-US/docs/Web/SVG/Element
|
308
319
|
TAG_MAP = %w[
|
data/lib/htx/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: htx
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nate Pickens
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|