Class: MarkdownExpander::Expander
- Inherits:
-
Object
- Object
- MarkdownExpander::Expander
show all
- Defined in:
- lib/markdown-expander.rb
Defined Under Namespace
Classes: Expression, IfStart, LoopStart, Node
Constant Summary
collapse
- LOOP_START_MATCH =
/{{\s*([a-zA-Z_]*)\s+in\s+([a-zA-Z_.]*)\s*}}/
- END_MATCH =
/{{\s*end\s*}}/
- EXPRESSION_MATCH =
/{{\s*([a-zA-Z_.]+)\s*}}/
- IF_START_MATCH =
/{{\s*if\s*([a-zA-Z_.]*)\s*(==|!=)\s*"(.*)"}}/
Instance Method Summary
collapse
Constructor Details
#initialize(template) ⇒ Expander
Returns a new instance of Expander.
10
11
12
|
# File 'lib/markdown-expander.rb', line 10
def initialize template
@template = template
end
|
Instance Method Details
#drill_down_to_value(scope, expression) ⇒ Object
48
49
50
51
52
53
54
|
# File 'lib/markdown-expander.rb', line 48
def drill_down_to_value scope, expression
expression_parts = expression.split(".").map(&:to_sym)
expression_parts.each do |part|
scope = scope[part]
end
scope
end
|
#evaluate_nodes(root, scope) ⇒ Object
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
# File 'lib/markdown-expander.rb', line 56
def evaluate_nodes root, scope
lines = []
root.children.each_with_index do |child, index|
if child.element.class == Expression
lines << drill_down_to_value(scope, child.element.expression)
elsif child.element.class == LoopStart
name = child.element.name.to_sym
scope = drill_down_to_value(scope, child.element.expression)
scope.each do |item|
lines << evaluate_nodes(child, {name => item})
end
elsif child.element.class == IfStart
value = drill_down_to_value(scope, child.element.expression)
expression_satisfied =
(child.element.operator == "==" && value.to_s == child.element.value) ||
(child.element.operator == "!=" && value.to_s != child.element.value)
if expression_satisfied
lines << evaluate_nodes(child, scope)
end
else
lines << child.element
end
end
lines.join("")
end
|
#render(scope) ⇒ Object
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
|
# File 'lib/markdown-expander.rb', line 14
def render scope
root = Node.new(nil, nil)
node = root
@template.each_line do |line|
if line =~ LOOP_START_MATCH
new_node = Node.new(node, LoopStart.new($1, $2))
node.children << new_node
node = new_node
elsif line =~ IF_START_MATCH
new_node = Node.new(node, IfStart.new($1, $2, $3))
node.children << new_node
node = new_node
elsif line =~ END_MATCH
node = node.parent
else
loop do
if line =~ EXPRESSION_MATCH
before_match = $`
after_match = $'
node.children << Node.new(node, before_match)
node.children << Node.new(node, Expression.new($1))
line = after_match
else
node.children << Node.new(node, line)
break
end
end
end
end
evaluate_nodes(root, scope)
end
|