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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f5cc0aa3fd21ded1886f9c0cd66093d376f734de
4
- data.tar.gz: 2202dadac71019f67a5739be0183fa3e0a019788
3
+ metadata.gz: 94078f341de6bb0794aa103efc520773d9766abd
4
+ data.tar.gz: 9073385427a5aa7911b7406f83f79615041a6043
5
5
  SHA512:
6
- metadata.gz: d18c4084c7dd37e24e77935d32d0428f6a8f09988447119a9f848f9e271bbb8f7cd560d7325ff8568514b1696b0690fe0646eab30e9ef402015ba5e327518b0c
7
- data.tar.gz: 8deb31e8fd6843b9d6ebf99c90a39e63dff7c7c0becba7a697bb1e7d132ccfec05b95919b09b1975bd9a14fb75ffdd639d645dbeb536a24a1a8108a83f5939aa
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
  ```
@@ -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
- evaluate_nodes(root, scope)
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
- def drill_down_to_value scope, expression
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
- scope = scope[part]
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
- def initialize parent, element
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
@@ -1,3 +1,3 @@
1
1
  module MarkdownExpander
2
- VERSION = "0.5.0"
2
+ VERSION = "0.6.0"
3
3
  end
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.5.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-02-22 00:00:00.000000000 Z
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