herbgobbler 0.3.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -94,7 +94,7 @@ grammar ERBGrammer
94
94
  end
95
95
 
96
96
  rule method_call_content
97
- method_names whitespace ruby_string:double_quoted_ruby_string everything_else:(comma erb_string_non_text_content)? <MethodCallNode>
97
+ method_names whitespace ruby_string:(double_quoted_ruby_string / single_quoted_ruby_string) everything_else:(comma erb_string_non_text_content)? <MethodCallNode>
98
98
  end
99
99
 
100
100
  rule erb_string_non_text_content
@@ -111,7 +111,7 @@ grammar ERBGrammer
111
111
  end
112
112
 
113
113
  rule erb_string
114
- start_erb:erb_string_start start_space:(space)? text:(method_call_content / double_quoted_ruby_string)? everything_else:(pluralize / erb_string_non_text_content) end_erb:(erb_block_end) <NonTextNode>
114
+ start_erb:erb_string_start start_space:(space)? text:(method_call_content / double_quoted_ruby_string / single_quoted_ruby_string)? everything_else:(pluralize / erb_string_non_text_content) end_erb:(erb_block_end) <NonTextNode>
115
115
  {
116
116
  def node_name
117
117
  "erb_string"
@@ -125,6 +125,28 @@ grammar ERBGrammer
125
125
 
126
126
  end
127
127
 
128
+ rule single_quoted_ruby_string
129
+ start_quote:"'" unquoted_text:(( !"'" .)*) end_quote:"'" <TextNode>
130
+ {
131
+ def can_be_combined?
132
+ false
133
+ end
134
+
135
+ def html?
136
+ false
137
+ end
138
+
139
+ def text_value
140
+ self.unquoted_text.text_value
141
+ end
142
+
143
+ def node_name
144
+ "single_quoted_ruby_string"
145
+ end
146
+ }
147
+
148
+ end
149
+
128
150
  rule double_quoted_ruby_string
129
151
  start_quote:'"' unquoted_text:((!'"' (string_variable / .))*) end_quote:'"' <DoubleQuotedTextNode>
130
152
  {
@@ -262,7 +284,11 @@ grammar ERBGrammer
262
284
  start_tag:'<' tag_name:([a-zA-Z])+ tag_contents:(!'/>' (erb_string / .))* end_tag:'/>' <NonTextNode>
263
285
  {
264
286
  def can_be_combined?
265
- true
287
+ if( tag_name.text_value.downcase == 'br' )
288
+ false
289
+ else
290
+ true
291
+ end
266
292
  end
267
293
 
268
294
  def node_name
@@ -355,7 +381,7 @@ grammar ERBGrammer
355
381
  end
356
382
 
357
383
  rule whitespace
358
- ((![a-zA-Z\.] !('<' [a-zA-Z]+) !('</' [a-zA-Z]+) !'<%' !'"' !'<!' ) . )+ <NonTextNode>
384
+ ((![a-zA-Z\.] !('<' [a-zA-Z]+) !('</' [a-zA-Z]+) !'<%' !'"' !"'" !'<!' ) . )+ <NonTextNode>
359
385
  {
360
386
  def can_be_combined?
361
387
  true
data/lib/core/erb_file.rb CHANGED
@@ -111,7 +111,7 @@ class ErbFile
111
111
  nodes.each do |node|
112
112
  if( node.is_a?( HerbNodeRetainingTextNode ) )
113
113
  if( node.can_be_exploded? )
114
- to_return += node.nodes
114
+ to_return += node.explode
115
115
  else
116
116
  to_return << node
117
117
  end
@@ -6,11 +6,13 @@ class HerbNodeRetainingTextNode < HerbNodeRetainingNode
6
6
  self << node
7
7
  end
8
8
  end
9
-
9
+
10
10
  def can_remove_starting_or_ending_html_tags?
11
11
  if( find_first_non_whitespace_node.node_name == "html_start_tag" && find_last_non_whitespace_node.node_name == "html_end_tag" )
12
12
  if( find_first_non_whitespace_node.tag_name.text_value == find_last_non_whitespace_node.tag_name.text_value )
13
13
  true
14
+ elsif( last_tag_does_not_match_first_tag? )
15
+ true
14
16
  else
15
17
  false
16
18
  end
@@ -22,9 +24,17 @@ class HerbNodeRetainingTextNode < HerbNodeRetainingNode
22
24
 
23
25
  end
24
26
 
27
+ def last_tag_does_not_match_first_tag?
28
+ find_last_non_whitespace_node.node_name == "html_end_tag" && find_first_non_whitespace_node.node_name == "html_start_tag" && find_last_non_whitespace_node.tag_name.text_value.downcase != find_first_non_whitespace_node.tag_name.text_value.downcase
29
+ end
30
+
25
31
  def break_out_start_and_end_tags
26
- if( find_first_non_whitespace_node.node_name == "html_start_tag" && find_last_non_whitespace_node.node_name == "html_end_tag" )
27
- ( can_remove_starting_or_ending_html_tags? )
32
+ if( last_tag_does_not_match_first_tag? )
33
+ end_tag = extract_trailing_tag
34
+ start_tag = HerbNodeRetainingTextNode.new
35
+ start_tag.add_all( nodes[0..nodes.length - (end_tag.nodes.length + 1 ) ] )
36
+ [start_tag, end_tag]
37
+ elsif( find_first_non_whitespace_node.node_name == "html_start_tag" && find_last_non_whitespace_node.node_name == "html_end_tag" ) && ( can_remove_starting_or_ending_html_tags? )
28
38
  start_tag = extract_leading_tag
29
39
  end_tag = extract_trailing_tag
30
40
  middle_tag = HerbNodeRetainingTextNode.new
@@ -56,10 +66,68 @@ class HerbNodeRetainingTextNode < HerbNodeRetainingNode
56
66
  end
57
67
  end
58
68
 
69
+ def explode
70
+ nested_level = nesting_level
71
+ to_return = []
72
+ current_nest = 0
73
+ new_node_list = nil
74
+
75
+ # Go through and try to build rolled up nodes for all of the node
76
+ # contents that are below the nested list level
77
+ nodes.each do |current_node|
78
+ if( current_node.node_name == "html_start_tag" )
79
+ current_nest += 1
80
+ if( new_node_list.nil? )
81
+ to_return << current_node
82
+ else
83
+ new_node_list << current_node
84
+ end
85
+ if( current_nest == nesting_level + 1 )
86
+ new_node_list = []
87
+ end
88
+ elsif( current_node.node_name == "html_end_tag" )
89
+ if( current_nest == nesting_level + 1 )
90
+ to_return << build_correct_node_retaining_node( new_node_list )
91
+ to_return << current_node
92
+ new_node_list = nil
93
+ elsif( new_node_list.nil? )
94
+ to_return << current_node
95
+ else
96
+ new_node_list << current_node
97
+ end
98
+ current_nest -= 1
99
+ elsif( new_node_list.nil? )
100
+ to_return << current_node
101
+ elsif( !new_node_list.nil?)
102
+ new_node_list << current_node
103
+ end
104
+
105
+ end
106
+ to_return << build_correct_node_retaining_node( new_node_list ) unless new_node_list.nil?
107
+
108
+ return to_return
109
+ end
110
+
111
+ def build_correct_node_retaining_node( array_of_nodes )
112
+ text_retaining_node = false
113
+ array_of_nodes.each do |node|
114
+ text_retaining_node = true if node.is_a?(TextNode) && node.contains_alpha_characters?
115
+ end
116
+
117
+ if( text_retaining_node )
118
+ to_return = HerbNodeRetainingTextNode.new
119
+ to_return.add_all( array_of_nodes )
120
+ else
121
+ to_return = HerbNodeRetainingNonTextNode.create_from_nodes( array_of_nodes )
122
+ end
123
+
124
+ to_return
125
+ end
126
+
59
127
  def can_be_exploded?
60
128
  # it is possible that this node contains only non text nodes. If
61
129
  # there is no text within this combined node then this should be uncombined
62
- find_all_non_matched_tags_and_white_space(nodes).empty? || contains_only_non_text_and_non_method_nodes?
130
+ contains_list_of_elements? || contains_only_non_text_and_non_method_nodes?
63
131
  end
64
132
 
65
133
  def can_be_combined?
@@ -89,10 +157,55 @@ class HerbNodeRetainingTextNode < HerbNodeRetainingNode
89
157
  found_text = false
90
158
  nodes.each do |current_node|
91
159
  found_text = true if current_node.is_a?( TextNode ) && !current_node.is_a?(MethodCallNode)
92
-
93
160
  end
94
161
  !found_text
95
162
  end
163
+
164
+ def contains_list_of_elements?
165
+ # Two cases, first there could be an outer element that wraps the
166
+ # list, if this is true we want to strip it.
167
+ # After the outer elements are stripped then we want to walk
168
+ # through and find all of the top level elements - where a top
169
+ # level element is defined as anything that isn't nested further.
170
+ nested_level = nesting_level
171
+ nested_nodes = nested_nodes_list
172
+ to_return = true
173
+ nested_nodes[nested_level].each do |node_at_node_level|
174
+ to_return = false if node_at_node_level.is_a?(TextNode)
175
+ end
176
+
177
+ return to_return
178
+ end
179
+
180
+ def nested_nodes_list
181
+ nested_level = 0
182
+ nested_nodes = [ [] ]
183
+ nodes.each do |current_node|
184
+ if( current_node.node_name == "html_start_tag" )
185
+ nested_nodes[nested_level] << current_node
186
+ nested_level += 1
187
+ nested_nodes[ nested_level ] = [] if nested_nodes[nested_level].nil?
188
+ elsif( current_node.node_name == "html_end_tag" )
189
+ nested_level -= 1
190
+ nested_nodes[ nested_level ] << current_node
191
+ elsif( current_node.is_a?( TextNode ) && current_node.contains_alpha_characters? )
192
+ nested_nodes[ nested_level ] << current_node
193
+ end
194
+ end
195
+
196
+ return nested_nodes
197
+ end
198
+
199
+ def nesting_level
200
+ nested_nodes = nested_nodes_list
201
+ nested_level = 0
202
+ while( nested_nodes[nested_level].size == 2 && nested_nodes[nested_level].first.node_name == "html_start_tag" && nested_nodes[nested_level].last.node_name == "html_end_tag" )
203
+ nested_level += 1
204
+ end
205
+
206
+ return nested_level
207
+ end
208
+
96
209
 
97
210
  def extract_leading_tag
98
211
  node = find_first_non_whitespace_node
@@ -117,26 +230,4 @@ class HerbNodeRetainingTextNode < HerbNodeRetainingNode
117
230
 
118
231
  end
119
232
 
120
- def find_all_non_matched_tags_and_white_space( nodes )
121
- to_return = []
122
- search_node_name = nil
123
- nodes.each do |current_node|
124
- if( !current_node.respond_to?( :node_name ) )
125
- to_return << current_node
126
- elsif( search_node_name.nil? && current_node.node_name == "html_start_tag" )
127
- search_node_name = current_node.tag_name.text_value
128
- elsif( !search_node_name.nil? && current_node.node_name == "html_end_tag" )
129
- search_node_name = nil if search_node_name == current_node.tag_name.text_value
130
- elsif( search_node_name.nil? && current_node.is_a?(TextNode ) )
131
- if( current_node.contains_alpha_characters? )
132
- to_return << current_node
133
- end
134
- end
135
- end
136
-
137
- return to_return
138
- end
139
-
140
-
141
-
142
233
  end
@@ -20,6 +20,6 @@ erb_file.combine_nodes( erb_file.flatten_elements ).each do |element|
20
20
  name = ""
21
21
  end
22
22
 
23
- puts "`#{element.text_value}`(text=#{element.is_a?(TextNode)})(combindable=#{element.is_a?(NonTextNode) && element.can_be_combined?})(class=#{element.class})#{name}"
23
+ puts "`#{element.text_value}`(text=#{element.is_a?(TextNode)})(combindable=#{element.respond_to?(:can_be_combined?) && element.can_be_combined?})(class=#{element.class})#{name}"
24
24
  end
25
25
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: herbgobbler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-09 00:00:00.000000000 Z
12
+ date: 2012-04-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler