Skip to content

Commit 9a26f85

Browse files
authored
Simplify buffering compilation (#949)
With this change, there are three ways to buffer. 1. `buffer` takes a `StringNode` or an `EmbeddedStatementsNode`, adds it to the current buffer and outputs `nil`. If there is no current buffer, it creates one and outputs an `InterpolatedStringNode` that references it. 2. `raw` takes a `String` and converts it to a raw `StringNode` buffer. 3. `plain` takes a `String` and HTML escapes it at compile time then passes it to `raw`. 4. `interpolate` takes any Node and wraps it in an `EmbeddedStatementsNode`, then passes it to `buffer`.
2 parents 9e0887c + 025888a commit 9a26f85

File tree

1 file changed

+48
-71
lines changed

1 file changed

+48
-71
lines changed

lib/phlex/compiler/method_compiler.rb

Lines changed: 48 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -88,19 +88,19 @@ def compile_standard_element(node, tag)
8888

8989
Refract::StatementsNode.new(
9090
body: [
91-
buffer("<#{tag}"),
91+
raw("<#{tag}"),
9292
*(
9393
if node.arguments
9494
compile_phlex_attributes(node.arguments)
9595
end
9696
),
97-
buffer(">"),
97+
raw(">"),
9898
*(
9999
if node.block
100100
compile_phlex_block(node.block)
101101
end
102102
),
103-
buffer("</#{tag}>"),
103+
raw("</#{tag}>"),
104104
]
105105
)
106106
end
@@ -110,13 +110,13 @@ def compile_void_element(node, tag)
110110

111111
Refract::StatementsNode.new(
112112
body: [
113-
buffer("<#{tag}"),
113+
raw("<#{tag}"),
114114
*(
115115
if node.arguments
116116
compile_phlex_attributes(node.arguments)
117117
end
118118
),
119-
buffer(">"),
119+
raw(">"),
120120
]
121121
)
122122
end
@@ -131,7 +131,7 @@ def compile_phlex_attributes(node)
131131
end
132132

133133
if literal_attributes
134-
return buffer(
134+
return raw(
135135
Phlex::SGML::Attributes.generate_attributes(
136136
eval(
137137
"{#{Refract::Formatter.new.format_node(node)}}"
@@ -162,7 +162,7 @@ def compile_phlex_block(node)
162162
content = node.body.body.first
163163
case content
164164
when Refract::StringNode, Refract::SymbolNode
165-
return buffer(Phlex::Escape.html_escape(content.unescaped))
165+
return plain(content.unescaped)
166166
when Refract::InterpolatedStringNode
167167
return compile_interpolated_string_node(content)
168168
when Refract::NilNode
@@ -216,7 +216,7 @@ def compile_interpolated_string_node(node)
216216
body: node.parts.map do |part|
217217
case part
218218
when Refract::StringNode
219-
buffer(Phlex::Escape.html_escape(part.unescaped))
219+
plain(part.unescaped)
220220
when Refract::EmbeddedVariableNode
221221
interpolate(part.variable)
222222
when Refract::EmbeddedStatementsNode
@@ -234,27 +234,27 @@ def compile_whitespace_helper(node)
234234
if node.block
235235
Refract::StatementsNode.new(
236236
body: [
237-
buffer(" "),
237+
raw(" "),
238238
compile_phlex_block(node.block),
239-
buffer(" "),
239+
raw(" "),
240240
]
241241
)
242242
else
243-
buffer(" ")
243+
raw(" ")
244244
end
245245
end
246246

247247
def compile_doctype_helper(node)
248248
node => Refract::CallNode
249249

250-
buffer("<!doctype html>")
250+
raw("<!doctype html>")
251251
end
252252

253253
def compile_plain_helper(node)
254254
node => Refract::CallNode
255255

256256
if node.arguments in [Refract::StringNode]
257-
buffer(node.arguments.arguments.first.unescaped)
257+
raw(node.arguments.arguments.first.unescaped)
258258
else
259259
node
260260
end
@@ -306,98 +306,75 @@ def compile_comment_helper(node)
306306

307307
Refract::StatementsNode.new(
308308
body: [
309-
buffer("<!-- "),
309+
raw("<!-- "),
310310
compile_phlex_block(node.block),
311-
buffer(" -->"),
311+
raw(" -->"),
312312
]
313313
)
314314
end
315315

316316
def compile_raw_helper(node)
317317
node => Refract::CallNode
318-
319318
node
320319
end
321320

322-
private def buffer(value)
323-
if @current_buffer
324-
@current_buffer << Refract::StringNode.new(
325-
unescaped: value
326-
)
321+
private def plain(value)
322+
value => String
323+
raw(Phlex::Escape.html_escape(value))
324+
end
327325

328-
nil
329-
else
330-
new_buffer = [
331-
Refract::StringNode.new(
332-
unescaped: value
333-
),
334-
]
326+
private def raw(value)
327+
value => String
335328

336-
@current_buffer = new_buffer
329+
buffer(
330+
Refract::StringNode.new(
331+
unescaped: value
332+
)
333+
)
334+
end
337335

338-
Refract::IfNode.new(
339-
inline: false,
340-
predicate: Refract::LocalVariableReadNode.new(
341-
name: should_render_local
342-
),
336+
private def interpolate(statements)
337+
buffer(
338+
Refract::EmbeddedStatementsNode.new(
343339
statements: Refract::StatementsNode.new(
344340
body: [
345341
Refract::CallNode.new(
346-
receiver: Refract::CallNode.new(
347-
name: buffer_local,
342+
receiver: Refract::ConstantPathNode.new(
343+
parent: Refract::ConstantPathNode.new(
344+
name: "Phlex"
345+
),
346+
name: "Escape"
348347
),
349-
name: :<<,
348+
name: :html_escape,
350349
arguments: Refract::ArgumentsNode.new(
351350
arguments: [
352-
Refract::InterpolatedStringNode.new(
353-
parts: new_buffer
351+
Refract::CallNode.new(
352+
receiver: Refract::ParenthesesNode.new(
353+
body: statements
354+
),
355+
name: :to_s
354356
),
355357
]
356358
)
357359
),
358360
]
359361
)
360362
)
361-
end
363+
)
362364
end
363365

364-
private def interpolate(statements, escape: true)
365-
embedded_statement = Refract::EmbeddedStatementsNode.new(
366-
statements: Refract::StatementsNode.new(
367-
body: [
368-
Refract::CallNode.new(
369-
receiver: Refract::ConstantPathNode.new(
370-
parent: Refract::ConstantPathNode.new(
371-
name: "Phlex"
372-
),
373-
name: "Escape"
374-
),
375-
name: :html_escape,
376-
arguments: Refract::ArgumentsNode.new(
377-
arguments: [
378-
Refract::CallNode.new(
379-
receiver: Refract::ParenthesesNode.new(
380-
body: statements
381-
),
382-
name: :to_s
383-
),
384-
]
385-
)
386-
),
387-
]
388-
)
389-
)
366+
private def buffer(node)
367+
node => Refract::StringNode | Refract::EmbeddedStatementsNode
390368

391369
if @current_buffer
392-
@current_buffer << embedded_statement
370+
@current_buffer << node
393371

394372
nil
395373
else
396-
new_buffer = [embedded_statement]
397-
398-
@current_buffer = new_buffer
374+
@current_buffer = [node]
399375

400376
Refract::IfNode.new(
377+
inline: false,
401378
predicate: Refract::LocalVariableReadNode.new(
402379
name: should_render_local
403380
),
@@ -411,7 +388,7 @@ def compile_raw_helper(node)
411388
arguments: Refract::ArgumentsNode.new(
412389
arguments: [
413390
Refract::InterpolatedStringNode.new(
414-
parts: new_buffer
391+
parts: @current_buffer
415392
),
416393
]
417394
)

0 commit comments

Comments
 (0)