markdown-expander 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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