markdown-expander 0.5.0 → 0.6.0
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/.ruby-version +1 -0
- data/README.md +3 -3
- data/README.md.docu +3 -3
- data/lib/markdown-expander.rb +55 -13
- data/lib/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 94078f341de6bb0794aa103efc520773d9766abd
|
4
|
+
data.tar.gz: 9073385427a5aa7911b7406f83f79615041a6043
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f1b219b2dce87acce2fa2c117ec632ea84d13de1171b46bb65fc80741aa018b045b22f319b66dda193340c63079fbabc66f2fe2738e8585e3a45b0056d089033
|
7
|
+
data.tar.gz: f665687f5506bf48af177b4e78910dd7cc56fa005551accdd0cc1e9d9696222c1c2a11ec845aa326f9e089fcfee37c7d5e3914e6e884a6d2a3fe5669daa42d01
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
ruby-2.2.4
|
data/README.md
CHANGED
@@ -38,7 +38,7 @@ MarkdownExpander::Expander.new(
|
|
38
38
|
"# Title: {{thing.title}}"
|
39
39
|
).render(
|
40
40
|
thing: {title: "Hello"}
|
41
|
-
)
|
41
|
+
).body
|
42
42
|
#=> "# Title: Hello"
|
43
43
|
```
|
44
44
|
|
@@ -55,7 +55,7 @@ TEMPLATE
|
|
55
55
|
|
56
56
|
MarkdownExpander::Expander.new(template).render(
|
57
57
|
stuff: [ {title: "First!"}, {title: "Second!"} ]
|
58
|
-
)
|
58
|
+
).body
|
59
59
|
#=> "# First!\n# Second!\n"
|
60
60
|
```
|
61
61
|
|
@@ -74,6 +74,6 @@ TEMPLATE
|
|
74
74
|
|
75
75
|
MarkdownExpander::Expander.new(template).render(
|
76
76
|
animals: [ {name: "dogs"}, {name: "cats"} ]
|
77
|
-
)
|
77
|
+
).body
|
78
78
|
#=> "# cats are the best!!!!!\n"
|
79
79
|
```
|
data/README.md.docu
CHANGED
@@ -39,7 +39,7 @@ MarkdownExpander::Expander.new(
|
|
39
39
|
"# Title: {{thing.title}}"
|
40
40
|
).render(
|
41
41
|
thing: {title: "Hello"}
|
42
|
-
)
|
42
|
+
).body
|
43
43
|
#=> "# Title: Hello"
|
44
44
|
:end:
|
45
45
|
```
|
@@ -58,7 +58,7 @@ TEMPLATE
|
|
58
58
|
|
59
59
|
MarkdownExpander::Expander.new(template).render(
|
60
60
|
stuff: [ {title: "First!"}, {title: "Second!"} ]
|
61
|
-
)
|
61
|
+
).body
|
62
62
|
#=> "# First!\n# Second!\n"
|
63
63
|
:end:
|
64
64
|
```
|
@@ -79,7 +79,7 @@ TEMPLATE
|
|
79
79
|
|
80
80
|
MarkdownExpander::Expander.new(template).render(
|
81
81
|
animals: [ {name: "dogs"}, {name: "cats"} ]
|
82
|
-
)
|
82
|
+
).body
|
83
83
|
#=> "# cats are the best!!!!!\n"
|
84
84
|
:end:
|
85
85
|
```
|
data/lib/markdown-expander.rb
CHANGED
@@ -12,16 +12,17 @@ module MarkdownExpander
|
|
12
12
|
end
|
13
13
|
|
14
14
|
def render scope
|
15
|
-
root = Node.new(nil, nil)
|
15
|
+
root = Node.new(nil, nil, 1)
|
16
16
|
node = root
|
17
|
+
current_line = 1
|
17
18
|
|
18
19
|
@template.each_line do |line|
|
19
20
|
if line =~ LOOP_START_MATCH
|
20
|
-
new_node = Node.new(node, LoopStart.new($1, $2))
|
21
|
+
new_node = Node.new(node, LoopStart.new($1, $2), current_line)
|
21
22
|
node.children << new_node
|
22
23
|
node = new_node
|
23
24
|
elsif line =~ IF_START_MATCH
|
24
|
-
new_node = Node.new(node, IfStart.new($1, $2, $3))
|
25
|
+
new_node = Node.new(node, IfStart.new($1, $2, $3), current_line)
|
25
26
|
node.children << new_node
|
26
27
|
node = new_node
|
27
28
|
elsif line =~ END_MATCH
|
@@ -31,24 +32,54 @@ module MarkdownExpander
|
|
31
32
|
if line =~ EXPRESSION_MATCH
|
32
33
|
before_match = $`
|
33
34
|
after_match = $'
|
34
|
-
node.children << Node.new(node, before_match)
|
35
|
-
node.children << Node.new(node, Expression.new($1))
|
35
|
+
node.children << Node.new(node, before_match, current_line)
|
36
|
+
node.children << Node.new(node, Expression.new($1), current_line)
|
36
37
|
line = after_match
|
37
38
|
else
|
38
|
-
node.children << Node.new(node, line)
|
39
|
+
node.children << Node.new(node, line, current_line)
|
39
40
|
break
|
40
41
|
end
|
41
42
|
end
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
45
|
-
|
46
|
+
errors = []
|
47
|
+
if node != root
|
48
|
+
if node.element.class == IfStart
|
49
|
+
errors << "LINE #{node.line_number}: if statement has no end"
|
50
|
+
elsif node.element.class == LoopStart
|
51
|
+
errors << "LINE #{node.line_number}: loop has no end"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
if errors.any?
|
56
|
+
RenderResult.new(nil, errors)
|
57
|
+
else
|
58
|
+
begin
|
59
|
+
RenderResult.new(evaluate_nodes(root, scope), [])
|
60
|
+
rescue ExpressionDrillDownError => e
|
61
|
+
RenderResult.new(nil, ["LINE #{e.node.line_number}: expression '#{e.expression}' could not be evaluated"])
|
62
|
+
end
|
63
|
+
end
|
46
64
|
end
|
47
65
|
|
48
|
-
|
66
|
+
class ExpressionDrillDownError < StandardError
|
67
|
+
attr_reader :node
|
68
|
+
attr_reader :expression
|
69
|
+
def initialize node, expression
|
70
|
+
@node = node
|
71
|
+
@expression = expression
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def drill_down_to_value node, scope, expression
|
49
76
|
expression_parts = expression.split(".").map(&:to_sym)
|
50
77
|
expression_parts.each do |part|
|
51
|
-
|
78
|
+
begin
|
79
|
+
scope = scope[part]
|
80
|
+
rescue NoMethodError
|
81
|
+
raise ExpressionDrillDownError.new(node, expression)
|
82
|
+
end
|
52
83
|
end
|
53
84
|
scope
|
54
85
|
end
|
@@ -57,15 +88,15 @@ module MarkdownExpander
|
|
57
88
|
lines = []
|
58
89
|
root.children.each_with_index do |child, index|
|
59
90
|
if child.element.class == Expression
|
60
|
-
lines << drill_down_to_value(scope, child.element.expression)
|
91
|
+
lines << drill_down_to_value(child, scope, child.element.expression)
|
61
92
|
elsif child.element.class == LoopStart
|
62
93
|
name = child.element.name.to_sym
|
63
|
-
scope = drill_down_to_value(scope, child.element.expression)
|
94
|
+
scope = drill_down_to_value(child, scope, child.element.expression)
|
64
95
|
scope.each do |item|
|
65
96
|
lines << evaluate_nodes(child, {name => item})
|
66
97
|
end
|
67
98
|
elsif child.element.class == IfStart
|
68
|
-
value = drill_down_to_value(scope, child.element.expression)
|
99
|
+
value = drill_down_to_value(child, scope, child.element.expression)
|
69
100
|
expression_satisfied =
|
70
101
|
(child.element.operator == "==" && value.to_s == child.element.value) ||
|
71
102
|
(child.element.operator == "!=" && value.to_s != child.element.value)
|
@@ -79,13 +110,24 @@ module MarkdownExpander
|
|
79
110
|
lines.join("")
|
80
111
|
end
|
81
112
|
|
113
|
+
class RenderResult
|
114
|
+
attr_reader :body
|
115
|
+
attr_reader :errors
|
116
|
+
def initialize body, errors
|
117
|
+
@body = body
|
118
|
+
@errors = errors
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
82
122
|
class Node
|
83
123
|
attr_accessor :parent
|
84
124
|
attr_accessor :children
|
85
125
|
attr_accessor :element
|
86
|
-
|
126
|
+
attr_accessor :line_number
|
127
|
+
def initialize parent, element, line_number
|
87
128
|
@parent = parent
|
88
129
|
@element = element
|
130
|
+
@line_number = line_number
|
89
131
|
@children = []
|
90
132
|
end
|
91
133
|
end
|
data/lib/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: markdown-expander
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Vos
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-08-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -74,6 +74,7 @@ extensions: []
|
|
74
74
|
extra_rdoc_files: []
|
75
75
|
files:
|
76
76
|
- ".gitignore"
|
77
|
+
- ".ruby-version"
|
77
78
|
- ".travis.yml"
|
78
79
|
- Gemfile
|
79
80
|
- README.md
|