xrt 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 522fc466d294244892a5bbc592f6eada3fe5b1fb
4
- data.tar.gz: bb90d04bbd0e92f87b6ce9285cd2955eed534874
3
+ metadata.gz: 6e794554d3ea1a41e6b8baf7b319eef351a0e75c
4
+ data.tar.gz: 6f474d42d839fcabd1d80bedd8e730c9033f4cb2
5
5
  SHA512:
6
- metadata.gz: 3d3d56352e6f7eae2dc34841c4904d9d9562fef2772cf6cdfef92c41d2780377cd0044d754da1595852fb94113cedb358ed8bb0a046807a62fa1052ff1c871b4
7
- data.tar.gz: 6ff6151ddfdc56e96edbd492d860e584c4a03c8baa4acb7d630e1500f3199aa03e80aff932cb0217964be67fa276cc0714880828857afe9c230b58af97ee7493
6
+ metadata.gz: 6d9c72d02fe07ecaa4175ea58f1f690dc9226824965320e875e31a928a41b54f3c28b745f4a2aff834c5bb2e4e81082a5e6ecfafd420d6759fb1da3ec0ebf46e
7
+ data.tar.gz: 5da38ce8f05c3f78548d09a8d9221c89ba7b9815e20feb19b5979aed68f212ca5ccceab26ee3d8bc690ed43663a6032648e8588502db9b2804b6981ad20d4dac
@@ -19,31 +19,44 @@ module XRT
19
19
  # push contents to (container) node
20
20
  # returns parsed container node
21
21
  # return when tokenized is empty, or node is closed
22
- def parse_contents(tokenized, node)
22
+ def parse_contents(tokenized, node, in_raw_text = false)
23
+ if node.kind_of?(XRT::Statement::TagPair) && node.children[0].tag_raw_text_element?
24
+ parse_raw_text_element(tokenized, node)
25
+ return
26
+ end
27
+
23
28
  while tokenized.length > 0
24
- statement = XRT::Statement::Factory.new_from_content(tokenized.shift)
29
+ statement = new_statement(tokenized.shift)
25
30
 
26
- case statement
27
- when XRT::Statement::Tag
28
- parse_contents(tokenized, statement)
29
- if statement.tag_opening?
30
- statement = XRT::Statement::TagPair.new(statement)
31
+ unless in_raw_text
32
+ case statement
33
+ when XRT::Statement::Tag
31
34
  parse_contents(tokenized, statement)
32
- node << statement
33
- next
34
- elsif statement.tag_closing?
35
- statement = XRT::Statement::TagPairEnd.new(statement)
36
- node << statement
37
- break
38
- else
39
- node << statement
40
- next
35
+ if statement.tag_opening?
36
+ statement = XRT::Statement::TagPair.new(statement)
37
+ parse_contents(tokenized, statement, in_raw_text)
38
+ node << statement
39
+ next
40
+ elsif statement.tag_closing?
41
+ statement = XRT::Statement::TagPairEnd.new(statement)
42
+ node << statement
43
+ break
44
+ else
45
+ node << statement
46
+ next
47
+ end
48
+ end
49
+ end
50
+
51
+ if in_raw_text
52
+ if statement.kind_of?(XRT::Statement::Tag) || statement.kind_of?(XRT::Statement::TagEnd)
53
+ statement = XRT::Statement::Text.new(statement.content)
41
54
  end
42
55
  end
43
56
 
44
57
  case statement
45
- when XRT::Statement::Block
46
- parse_contents(tokenized, statement)
58
+ when XRT::Statement::ControlBlock
59
+ parse_contents(tokenized, statement, in_raw_text)
47
60
  node << statement
48
61
  when XRT::Statement::End
49
62
  node << statement
@@ -56,6 +69,64 @@ module XRT
56
69
  node
57
70
  end
58
71
 
72
+ # parse all statements as texts and whitespaces until </script> will appear.
73
+ def parse_raw_text_element(tokenized, node)
74
+ syntax = XRT::Syntax.new
75
+ tag_name = node.children[0].tag_name
76
+
77
+ while tokenized.length > 0
78
+ maybe_close_tag = new_statement(tokenized[0])
79
+ maybe_closing_content = new_statement(tokenized[1])
80
+
81
+ if maybe_close_tag.kind_of?(XRT::Statement::Tag)
82
+ maybe_close_tag << maybe_closing_content
83
+ if maybe_close_tag.tag_closing? && maybe_close_tag.tag_name == tag_name
84
+ close_tag = new_statement(tokenized.shift)
85
+ parse_contents(tokenized, close_tag)
86
+ statement = XRT::Statement::TagPairEnd.new(close_tag)
87
+ node << statement
88
+ return
89
+ end
90
+ end
91
+
92
+ content = tokenized.shift
93
+ block_level = syntax.block_level content
94
+ if block_level == 1
95
+ statement = XRT::Statement::ControlBlock.new content
96
+ parse_contents(tokenized, statement, true)
97
+ node << statement
98
+ elsif syntax.block? content
99
+ node << XRT::Statement::Directive.new(content)
100
+ elsif syntax.whitespace? content
101
+ node << XRT::Statement::Whitespace.new(content)
102
+ else
103
+ node << XRT::Statement::Text.new(content)
104
+ end
105
+ end
106
+ end
107
+
108
+ def new_statement content
109
+ syntax = XRT::Syntax.new
110
+
111
+ block_level = syntax.block_level content
112
+
113
+ if block_level == 1
114
+ XRT::Statement::ControlBlock.new content
115
+ elsif block_level == -1
116
+ XRT::Statement::End.new content
117
+ elsif syntax.block? content
118
+ XRT::Statement::Directive.new content
119
+ elsif syntax.tag_start? content
120
+ XRT::Statement::Tag.new content
121
+ elsif syntax.tag_end? content
122
+ XRT::Statement::TagEnd.new content
123
+ elsif syntax.whitespace? content
124
+ XRT::Statement::Whitespace.new content
125
+ else
126
+ XRT::Statement::Text.new content
127
+ end
128
+ end
129
+
59
130
  def tokens
60
131
  reading = @source.dup
61
132
  result = []
@@ -11,13 +11,17 @@ module XRT
11
11
  end
12
12
 
13
13
  def == other
14
- self.class == other.class && self.content == other.content
14
+ self.class == other.class && self.to_s == other.to_s
15
15
  end
16
16
 
17
17
  def inspect
18
18
  "(#{self.class}:#{self.content})"
19
19
  end
20
20
 
21
+ def to_s
22
+ inspect
23
+ end
24
+
21
25
  def children
22
26
  []
23
27
  end
@@ -92,30 +96,6 @@ module XRT
92
96
  end
93
97
 
94
98
  class Statement
95
- module Factory
96
- def self.new_from_content content
97
- syntax = XRT::Syntax.new
98
-
99
- block_level = syntax.block_level content
100
-
101
- if block_level == 1
102
- XRT::Statement::Block.new content
103
- elsif block_level == -1
104
- XRT::Statement::End.new content
105
- elsif syntax.block? content
106
- XRT::Statement::Directive.new content
107
- elsif syntax.tag_start? content
108
- XRT::Statement::Tag.new content
109
- elsif syntax.tag_end? content
110
- XRT::Statement::TagEnd.new content
111
- elsif syntax.whitespace? content
112
- XRT::Statement::Whitespace.new content
113
- else
114
- XRT::Statement::Text.new content
115
- end
116
- end
117
-
118
- end
119
99
 
120
100
  class Document < Statement
121
101
  def initialize
@@ -134,10 +114,6 @@ module XRT
134
114
  children.map{|c| c.content }.join
135
115
  end
136
116
 
137
- def == other
138
- self.content == other.content && self.children.zip(other.children).all{|a, b| p [a, b]; a == b }
139
- end
140
-
141
117
  def inspect
142
118
  "(#{self.class}:#{self.children})"
143
119
  end
@@ -190,6 +166,9 @@ module XRT
190
166
  end
191
167
  end
192
168
 
169
+ class ControlBlock < Block
170
+ end
171
+
193
172
  class Tag < Block
194
173
  def initialize content
195
174
  @children = []
@@ -203,6 +182,12 @@ module XRT
203
182
  void_element_names.include?(self.tag_name)
204
183
  end
205
184
 
185
+ def tag_raw_text_element?
186
+ # https://www.w3.org/TR/html5/syntax.html#raw-text-elements
187
+ raw_element_names = %w( script style )
188
+ raw_element_names.include?(self.tag_name)
189
+ end
190
+
206
191
  def tag_name
207
192
  return nil if @children.empty?
208
193
  matched = @children[1].content.match(%r{\A/?(\w+)})
@@ -211,7 +196,7 @@ module XRT
211
196
  end
212
197
 
213
198
  def tag_opening?
214
- !tag_independent? && !tag_closing? && !tag_void_element?
199
+ !tag_independent? && !tag_closing? && !tag_void_element? && !tag_comment?
215
200
  end
216
201
 
217
202
  def tag_closing?
@@ -221,6 +206,10 @@ module XRT
221
206
  def tag_independent?
222
207
  @children[-2].content[-1] == '/'
223
208
  end
209
+
210
+ def tag_comment?
211
+ @children[1].content[0] == '!'
212
+ end
224
213
  end
225
214
 
226
215
  class TagPair < Block
@@ -1,3 +1,3 @@
1
1
  module Xrt
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
@@ -6,6 +6,18 @@ class TestParser < Test::Unit::TestCase
6
6
  @parser = XRT::Parser.new
7
7
  end
8
8
 
9
+ def test_new_statement
10
+ parser = XRT::Parser.new('')
11
+
12
+ assert parser.new_statement('hi').kind_of? XRT::Statement::Text
13
+ assert parser.new_statement(' ').kind_of? XRT::Statement::Whitespace
14
+ assert parser.new_statement('[% foo %]').kind_of? XRT::Statement::Directive
15
+ assert parser.new_statement('[% foo IF 1 %]').kind_of? XRT::Statement::Directive
16
+ assert parser.new_statement('[% IF 1 %]').kind_of? XRT::Statement::ControlBlock
17
+ assert parser.new_statement('<').kind_of? XRT::Statement::Tag
18
+ assert parser.new_statement('>').kind_of? XRT::Statement::TagEnd
19
+ end
20
+
9
21
  def test_document_empty
10
22
  parser = XRT::Parser.new('')
11
23
  doc = parser.document
@@ -41,9 +53,9 @@ class TestParser < Test::Unit::TestCase
41
53
  parser = XRT::Parser.new('[% IF a %]1[% END %]')
42
54
  doc = parser.document
43
55
  assert doc.kind_of? XRT::Statement::Document
44
- if_block = XRT::Statement::Block.new('[% IF a %]')
56
+ if_block = XRT::Statement::ControlBlock.new('[% IF a %]')
45
57
  if_block << XRT::Statement::Text.new('1')
46
- if_block << XRT::Statement::Text.new('[% END %]')
58
+ if_block << XRT::Statement::End.new('[% END %]')
47
59
  assert_equal [
48
60
  if_block
49
61
  ], doc.children
@@ -53,12 +65,12 @@ class TestParser < Test::Unit::TestCase
53
65
  parser = XRT::Parser.new('[% IF a %][% IF b %]1[% END %][% END %]')
54
66
  doc = parser.document
55
67
  assert doc.kind_of? XRT::Statement::Document
56
- if_block1 = XRT::Statement::Block.new('[% IF a %]')
57
- if_block2 = XRT::Statement::Block.new('[% IF b %]')
68
+ if_block1 = XRT::Statement::ControlBlock.new('[% IF a %]')
69
+ if_block2 = XRT::Statement::ControlBlock.new('[% IF b %]')
58
70
  if_block2 << XRT::Statement::Text.new('1')
59
- if_block2 << XRT::Statement::Text.new('[% END %]')
71
+ if_block2 << XRT::Statement::End.new('[% END %]')
60
72
  if_block1 << if_block2
61
- if_block1 << XRT::Statement::Text.new('[% END %]')
73
+ if_block1 << XRT::Statement::End.new('[% END %]')
62
74
  assert_equal [
63
75
  if_block1
64
76
  ], doc.children
@@ -104,6 +116,85 @@ class TestParser < Test::Unit::TestCase
104
116
  ], doc.children
105
117
  end
106
118
 
119
+ def test_block_in_raw_text_element
120
+ parser = XRT::Parser.new('<script>[% IF a %]1[% END %][% b %]</script>')
121
+ doc = parser.document
122
+ assert doc.kind_of? XRT::Statement::Document
123
+
124
+ tag_start = XRT::Statement::Tag.new '<'
125
+ tag_start << XRT::Statement::Text.new('script')
126
+ tag_start << XRT::Statement::TagEnd.new('>')
127
+
128
+ tag_close = XRT::Statement::Tag.new '<'
129
+ tag_close << XRT::Statement::Text.new('/script')
130
+ tag_close << XRT::Statement::TagEnd.new('>')
131
+
132
+ if_block = XRT::Statement::ControlBlock.new('[% IF a %]')
133
+ if_block << XRT::Statement::Text.new('1')
134
+ if_block << XRT::Statement::End.new('[% END %]')
135
+
136
+ directive = XRT::Statement::Directive.new('[% b %]')
137
+
138
+ tag_pair = XRT::Statement::TagPair.new(tag_start)
139
+ tag_pair << if_block
140
+ tag_pair << directive
141
+ tag_pair << XRT::Statement::TagPairEnd.new(tag_close)
142
+
143
+ assert_equal [
144
+ tag_pair,
145
+ ], doc.children
146
+ end
147
+
148
+ def test_simple_raw_text_element
149
+ parser = XRT::Parser.new('<script>1<2</script>')
150
+ doc = parser.document
151
+ assert doc.kind_of? XRT::Statement::Document
152
+
153
+ tag_start = XRT::Statement::Tag.new '<'
154
+ tag_start << XRT::Statement::Text.new('script')
155
+ tag_start << XRT::Statement::TagEnd.new('>')
156
+
157
+ tag_close = XRT::Statement::Tag.new '<'
158
+ tag_close << XRT::Statement::Text.new('/script')
159
+ tag_close << XRT::Statement::TagEnd.new('>')
160
+
161
+ tag_pair = XRT::Statement::TagPair.new(tag_start)
162
+ tag_pair << XRT::Statement::Text.new('1')
163
+ tag_pair << XRT::Statement::Text.new('<')
164
+ tag_pair << XRT::Statement::Text.new('2')
165
+ tag_pair << XRT::Statement::TagPairEnd.new(tag_close)
166
+
167
+ assert_equal [
168
+ tag_pair,
169
+ ], doc.children
170
+ end
171
+
172
+ def test_raw_text_in_block_in_raw_text_element
173
+ parser = XRT::Parser.new('<script>[% IF a %]<[% END %]</script>')
174
+ doc = parser.document
175
+ assert doc.kind_of? XRT::Statement::Document
176
+
177
+ tag_start = XRT::Statement::Tag.new '<'
178
+ tag_start << XRT::Statement::Text.new('script')
179
+ tag_start << XRT::Statement::TagEnd.new('>')
180
+
181
+ tag_close = XRT::Statement::Tag.new '<'
182
+ tag_close << XRT::Statement::Text.new('/script')
183
+ tag_close << XRT::Statement::TagEnd.new('>')
184
+
185
+ if_block = XRT::Statement::ControlBlock.new('[% IF a %]')
186
+ if_block << XRT::Statement::Text.new('<')
187
+ if_block << XRT::Statement::End.new('[% END %]')
188
+
189
+ tag_pair = XRT::Statement::TagPair.new(tag_start)
190
+ tag_pair << if_block
191
+ tag_pair << XRT::Statement::TagPairEnd.new(tag_close)
192
+
193
+ assert_equal [
194
+ tag_pair,
195
+ ], doc.children
196
+ end
197
+
107
198
  def test_read_directive
108
199
  assert_equal '[% %]', @parser.read_directive('[% %]')
109
200
  assert_equal '[% [ ] %]', @parser.read_directive('[% [ ] %]')
@@ -1,18 +1,6 @@
1
1
  require 'test/unit'
2
2
  require 'xrt/statement'
3
3
 
4
- class TestStatementFactory < Test::Unit::TestCase
5
- def test_new_from_string
6
- assert XRT::Statement::Factory.new_from_content('hi').kind_of? XRT::Statement::Text
7
- assert XRT::Statement::Factory.new_from_content(' ').kind_of? XRT::Statement::Whitespace
8
- assert XRT::Statement::Factory.new_from_content('[% foo %]').kind_of? XRT::Statement::Directive
9
- assert XRT::Statement::Factory.new_from_content('[% foo IF 1 %]').kind_of? XRT::Statement::Directive
10
- assert XRT::Statement::Factory.new_from_content('[% IF 1 %]').kind_of? XRT::Statement::Block
11
- assert XRT::Statement::Factory.new_from_content('<').kind_of? XRT::Statement::Tag
12
- assert XRT::Statement::Factory.new_from_content('>').kind_of? XRT::Statement::TagEnd
13
- end
14
- end
15
-
16
4
  class TestStatement < Test::Unit::TestCase
17
5
  def test_text
18
6
  text = XRT::Statement::Text.new('hi')
@@ -254,6 +242,17 @@ class TestTag < Test::Unit::TestCase
254
242
  assert tag.tag_independent?
255
243
  end
256
244
 
245
+ def test_comment
246
+ tag = XRT::Statement::Tag.new('<')
247
+ tag << XRT::Statement::Text.new('!--')
248
+ tag << XRT::Statement::Whitespace.new(' ')
249
+ tag << XRT::Statement::Text.new('--')
250
+ tag << XRT::Statement::TagEnd.new('>')
251
+ assert_false tag.tag_opening?
252
+ assert_false tag.tag_closing?
253
+ assert tag.tag_comment?
254
+ end
255
+
257
256
  def test_tag_name
258
257
  [
259
258
  'div',
@@ -297,4 +296,20 @@ class TestTag < Test::Unit::TestCase
297
296
  }
298
297
  end
299
298
 
299
+ def test_raw_text_element?
300
+ [
301
+ ['div', false],
302
+ ['script', true],
303
+ ['style', true],
304
+ ].each{|test_case|
305
+ tag_name, expect = *test_case
306
+
307
+ tag = XRT::Statement::Tag.new('<')
308
+ tag << XRT::Statement::Text.new(tag_name)
309
+ tag << XRT::Statement::TagEnd.new('>')
310
+ assert_equal expect, tag.tag_raw_text_element?
311
+ }
312
+ end
313
+
314
+
300
315
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xrt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.7
4
+ version: 0.0.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - hitode909
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-12-20 00:00:00.000000000 Z
11
+ date: 2016-12-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler