opulent 1.5.5 → 1.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.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +13 -0
  3. data/{LICENSE → LICENSE.md} +0 -0
  4. data/bin/opulent +0 -0
  5. data/lib/opulent.rb +10 -10
  6. data/lib/opulent/compiler.rb +15 -9
  7. data/lib/opulent/compiler/buffer.rb +123 -62
  8. data/lib/opulent/compiler/comment.rb +3 -4
  9. data/lib/opulent/compiler/control.rb +20 -26
  10. data/lib/opulent/compiler/define.rb +88 -36
  11. data/lib/opulent/compiler/doctype.rb +20 -22
  12. data/lib/opulent/compiler/eval.rb +23 -2
  13. data/lib/opulent/compiler/filter.rb +4 -5
  14. data/lib/opulent/compiler/node.rb +18 -12
  15. data/lib/opulent/compiler/root.rb +4 -5
  16. data/lib/opulent/compiler/text.rb +7 -2
  17. data/lib/opulent/compiler/yield.rb +2 -3
  18. data/lib/opulent/engine.rb +21 -20
  19. data/lib/opulent/exec.rb +21 -63
  20. data/lib/opulent/logger.rb +230 -3
  21. data/lib/opulent/parser.rb +14 -76
  22. data/lib/opulent/parser/comment.rb +45 -34
  23. data/lib/opulent/parser/control.rb +132 -111
  24. data/lib/opulent/parser/define.rb +15 -12
  25. data/lib/opulent/parser/doctype.rb +15 -15
  26. data/lib/opulent/parser/eval.rb +16 -6
  27. data/lib/opulent/parser/expression.rb +87 -84
  28. data/lib/opulent/parser/filter.rb +31 -25
  29. data/lib/opulent/parser/include.rb +38 -42
  30. data/lib/opulent/parser/node.rb +136 -118
  31. data/lib/opulent/parser/root.rb +24 -18
  32. data/lib/opulent/parser/text.rb +150 -123
  33. data/lib/opulent/parser/yield.rb +23 -23
  34. data/lib/opulent/settings.rb +70 -51
  35. data/lib/opulent/tokens.rb +17 -15
  36. data/lib/opulent/utils.rb +5 -4
  37. data/lib/opulent/version.rb +1 -1
  38. metadata +4 -43
  39. data/.libold/opulent.rb +0 -96
  40. data/.libold/opulent/context.rb +0 -80
  41. data/.libold/opulent/engine.rb +0 -88
  42. data/.libold/opulent/filter.rb +0 -101
  43. data/.libold/opulent/logger.rb +0 -67
  44. data/.libold/opulent/nodes.rb +0 -13
  45. data/.libold/opulent/nodes/block.rb +0 -29
  46. data/.libold/opulent/nodes/comment.rb +0 -35
  47. data/.libold/opulent/nodes/control.rb +0 -230
  48. data/.libold/opulent/nodes/define.rb +0 -42
  49. data/.libold/opulent/nodes/eval.rb +0 -41
  50. data/.libold/opulent/nodes/expression.rb +0 -28
  51. data/.libold/opulent/nodes/filter.rb +0 -70
  52. data/.libold/opulent/nodes/helper.rb +0 -69
  53. data/.libold/opulent/nodes/node.rb +0 -101
  54. data/.libold/opulent/nodes/root.rb +0 -62
  55. data/.libold/opulent/nodes/text.rb +0 -54
  56. data/.libold/opulent/nodes/theme.rb +0 -36
  57. data/.libold/opulent/parser.rb +0 -252
  58. data/.libold/opulent/parser/block.rb +0 -70
  59. data/.libold/opulent/parser/comment.rb +0 -32
  60. data/.libold/opulent/parser/control.rb +0 -83
  61. data/.libold/opulent/parser/define.rb +0 -39
  62. data/.libold/opulent/parser/eval.rb +0 -33
  63. data/.libold/opulent/parser/expression.rb +0 -350
  64. data/.libold/opulent/parser/filter.rb +0 -41
  65. data/.libold/opulent/parser/node.rb +0 -232
  66. data/.libold/opulent/parser/root.rb +0 -96
  67. data/.libold/opulent/parser/text.rb +0 -114
  68. data/.libold/opulent/parser/theme.rb +0 -36
  69. data/.libold/opulent/preprocessor.rb +0 -102
  70. data/.libold/opulent/runtime.rb +0 -144
  71. data/.libold/opulent/template.rb +0 -43
  72. data/.libold/opulent/tokens.rb +0 -276
  73. data/.libold/opulent/version.rb +0 -5
  74. data/.travis.yml +0 -4
  75. data/benchmark/benchmark.rb +0 -57
  76. data/benchmark/cases/node/node.haml +0 -7
  77. data/benchmark/cases/node/node.op +0 -7
  78. data/benchmark/cases/node/node.slim +0 -7
@@ -1,101 +0,0 @@
1
- # @Opulent
2
- module Opulent
3
- # @Filter
4
- module Filter
5
- # @Filter
6
- class Filter
7
- attr_accessor :name, :options, :loaded
8
-
9
- # Set tag and attribute options for filter
10
- #
11
- def initialize(name, options)
12
- @name = name
13
- @options = options
14
- @loaded = false
15
- end
16
-
17
- # Error output in case the filter does not exist
18
- #
19
- def load_filter
20
- unless @loaded
21
- # Try to load the library associated to the chosen filter
22
- begin
23
- require gem_name
24
- @loaded = true
25
- rescue LoadError => error
26
- # Error output with filter name and installation instructions
27
- Runtime.error :filter_load, @name, install_error
28
- end
29
- end
30
- end
31
-
32
- # Error message to be shown in order to provide installation instructions
33
- # for the developer
34
- #
35
- def install_error
36
- "gem install #{gem_name}"
37
- end
38
-
39
- # Process input code using this filter and return the output to the
40
- # evaluation method from the Filter Node
41
- #
42
- def render(code, options = {})
43
- raise NoMethodError
44
- end
45
-
46
- # RubyGems name for explicit library require
47
- #
48
- def gem_name
49
- raise NoMethodError
50
- # "gem_name"
51
- end
52
-
53
- # After defining how to render the code,
54
- #
55
- # Engine.register self, :filter, tag: :tag, attributes: { type: 'text/css' }
56
- end
57
-
58
-
59
- # Add the default registered rendering filters for Opulent
60
-
61
- # @CoffeeScript
62
- class CoffeeScript < Filter
63
- def render(code, options = {})
64
- ::CoffeeScript.compile code, options
65
- end
66
-
67
- def gem_name
68
- "coffee-script"
69
- end
70
-
71
- Engine.register self, :coffeescript, tag: :script, attributes: { type: 'javascript' }
72
- end
73
-
74
- # @Scss
75
- class Scss < Filter
76
- def render(code, options = {})
77
- ::Sass.compile code, options
78
- end
79
-
80
- def gem_name
81
- "sass"
82
- end
83
-
84
- Engine.register self, :scss, tag: :style, attributes: { type: 'text/css' }
85
- end
86
-
87
- # @Sass
88
- class Sass < Filter
89
- def render(code, options = {})
90
- options[:syntax] = :sass
91
- ::Sass.compile code, options
92
- end
93
-
94
- def gem_name
95
- "sass"
96
- end
97
-
98
- Engine.register self, :sass, tag: :style, attributes: { type: 'text/css' }
99
- end
100
- end
101
- end
@@ -1,67 +0,0 @@
1
- # @Opulent
2
- module Opulent
3
- # @Logger
4
- module Logger
5
- # @Singleton
6
- class << self
7
- # Color the input text with the chosen color
8
- #
9
- # @param text [String] the string that will be colored
10
- # @param color_code [String] preset code for certain colors
11
- #
12
- def colorize(text, color_code)
13
- require_windows_libs
14
- "#{color_code}#{text}\e[0m"
15
- end
16
-
17
- # Colors available in the terminal
18
- #
19
- def black(text); colorize(text, "\e[30m"); end
20
- def red(text); colorize(text, "\e[31m"); end
21
- def green(text); colorize(text, "\e[32m"); end
22
- def yellow(text); colorize(text, "\e[33m"); end
23
- def blue(text); colorize(text, "\e[34m"); end
24
- def magenta(text); colorize(text, "\e[35m"); end
25
- def cyan(text); colorize(text, "\e[36m"); end
26
- def white(text); colorize(text, "\e[37m"); end
27
- def default(text); colorize(text, "\e[38m"); end
28
-
29
- # Require windows libraries for ANSI Console output
30
- #
31
- def require_windows_libs
32
- begin
33
- require 'Win32/Console/ANSI' if RUBY_PLATFORM =~ /win32/
34
- rescue LoadError
35
- raise 'You must run "gem install win32console" to use Opulent\'s
36
- error reporting on Windows.'
37
- end
38
- end
39
-
40
- # Pretty print Nodes with their important details
41
- #
42
- def pretty_print(model, indent = 0)
43
- model.each do |node|
44
- case node
45
- when Nodes::Node
46
- puts " " * indent +
47
- node.name.to_s +
48
- "::" + node.class.to_s.split('::').last +
49
- " #{node.attributes unless node.attributes.empty?}"
50
- pretty_print node.children, indent + 2
51
- when Nodes::Text, Nodes::Print
52
- puts " " * indent +
53
- "text" +
54
- "::" + node.class.to_s.split('::').last +
55
- " {:value => \"#{node.value}\"}"
56
- when NilClass
57
- else
58
- puts " " * indent +
59
- node.name.to_s +
60
- "::" + node.class.to_s.split('::').last +
61
- " {:value => \"#{node.value}\"}"
62
- end
63
- end
64
- end
65
- end
66
- end
67
- end
@@ -1,13 +0,0 @@
1
- # Include Opulent nodes which know how to evaluate themselves
2
- require_relative 'nodes/helper'
3
- require_relative 'nodes/root'
4
- require_relative 'nodes/node'
5
- require_relative 'nodes/define'
6
- require_relative 'nodes/eval'
7
- require_relative 'nodes/expression'
8
- require_relative 'nodes/text'
9
- require_relative 'nodes/filter'
10
- require_relative 'nodes/control'
11
- require_relative 'nodes/theme'
12
- require_relative 'nodes/block'
13
- require_relative 'nodes/comment'
@@ -1,29 +0,0 @@
1
- # @Opulent
2
- module Opulent
3
- # @Nodes
4
- module Nodes
5
- # @Yield
6
- #
7
- class Yield < Node
8
- # Node evaluation method which goes through all the child nodes and evaluates
9
- # them using their own eval method
10
- #
11
- def evaluate(context)
12
- self
13
- end
14
- end
15
-
16
- # @Block
17
- #
18
- class Block < Node
19
- # Node evaluation method which goes through all the child nodes and evaluates
20
- # them using their own eval method
21
- #
22
- def evaluate(context)
23
- @children.map do |child|
24
- child.evaluate context
25
- end.flatten.compact
26
- end
27
- end
28
- end
29
- end
@@ -1,35 +0,0 @@
1
- # @Opulent
2
- module Opulent
3
- # @Nodes
4
- module Nodes
5
- # @Text
6
- #
7
- # The text class will output raw or escaped HTML text
8
- #
9
- class Comment
10
- # Allow direct access to literal value and type
11
- attr_accessor :value, :visible, :parent, :indent, :name
12
-
13
- # Initialize literal instance variables
14
- #
15
- # @param value stores the literal's explicit value
16
- #
17
- def initialize(value = nil, parent = nil, indent = 0)
18
- @value = value
19
- @parent = parent
20
- @indent = indent
21
- @name = :comment
22
- end
23
-
24
- # Value evaluation method which returns the processed value of the
25
- # literal
26
- #
27
- def evaluate(context)
28
- comment = self.dup
29
- comment.value = context.evaluate "\"#{@value}\""
30
-
31
- return comment
32
- end
33
- end
34
- end
35
- end
@@ -1,230 +0,0 @@
1
- # @Opulent
2
- module Opulent
3
- # @Nodes
4
- module Nodes
5
- # @CnditionalControl
6
- #
7
- # Control structure for if-elsif-else and unless
8
- #
9
- class CnditionalControl
10
- attr_accessor :name, :value, :parent, :indent, :children
11
-
12
- # Ruby code evaluation node
13
- #
14
- # @param name [String] name of the html node
15
- # @param value [String] condition to be met
16
- # @param parent [Node] parent of the element
17
- # @param indent [Fixnum] node indentation for restructuring
18
- # @param children [Array] contents to be interpreted
19
- #
20
- def initialize(name = '', value = '', parent = nil, indent = 0, children = [[]])
21
- @name = name
22
- @value = [value]
23
- @parent = parent
24
- @indent = indent
25
- @children = children
26
- end
27
-
28
- # Add a new node to the nodes array
29
- #
30
- def push(node)
31
- @children[-1] << node
32
- self
33
- end
34
-
35
- # Node evaluation method which goes through all the child nodes and evaluates
36
- # them using their own eval method
37
- #
38
- def evaluate(context)
39
- index = @value.index do |value|
40
- value.empty? || context.evaluate(value)
41
- end
42
-
43
- if index
44
- @children[index].map do |child|
45
- child.evaluate context
46
- end
47
- end
48
- end
49
- end
50
-
51
- # @IfControl
52
- #
53
- # Control structure for if-elsif-else directive
54
- #
55
- class CaseControl
56
- attr_accessor :name, :case, :value, :parent, :indent, :children
57
-
58
- # Ruby code evaluation node
59
- #
60
- # @param name [String] name of the html node
61
- # @param value [String] condition to be met
62
- # @param parent [Node] parent of the element
63
- # @param indent [Fixnum] node indentation for restructuring
64
- # @param children [Array] contents to be interpreted
65
- #
66
- def initialize(name = '', switch_case = '', parent = nil, indent = 0, children = [[]])
67
- @name = name
68
- @case = switch_case
69
- @value = []
70
- @parent = parent
71
- @indent = indent
72
- @children = children
73
- end
74
-
75
- # Add a new node to the nodes array
76
- #
77
- def push(node)
78
- @children[-1] << node
79
- self
80
- end
81
-
82
- # Node evaluation method which goes through all the child nodes and evaluates
83
- # them using their own eval method
84
- #
85
- def evaluate(context)
86
- switch_case = context.evaluate @case
87
- index = @value.index do |value|
88
- value.empty? || switch_case == context.evaluate(value)
89
- end
90
-
91
- if index
92
- @children[index].map do |child|
93
- child.evaluate context
94
- end.flatten.compact
95
- end
96
- end
97
- end
98
-
99
- # @LoopControl
100
- #
101
- # Control structure for while and until directives
102
- #
103
- class LoopControl
104
- attr_accessor :name, :value, :parent, :indent, :children
105
-
106
- # Ruby code evaluation node
107
- #
108
- # @param name [String] name of the html node
109
- # @param value [String] condition to be met
110
- # @param parent [Node] parent of the element
111
- # @param indent [Fixnum] node indentation for restructuring
112
- # @param children [Array] contents to be interpreted
113
- #
114
- def initialize(name = '', value = '', parent = nil, indent = 0, children = [])
115
- @name = name
116
- @value = value
117
- @parent = parent
118
- @indent = indent
119
- @children = children
120
- end
121
-
122
- # Add a new node to the nodes array
123
- #
124
- def push(node)
125
- @children << node
126
- self
127
- end
128
-
129
- # Node evaluation method which goes through all the child nodes and evaluates
130
- # them using their own eval method
131
- #
132
- def evaluate(context)
133
- result = []
134
-
135
- evaluate_children = Proc.new do |context|
136
- result << @children.map do |child|
137
- child.evaluate context
138
- end.flatten
139
- end
140
-
141
- case @name
142
- when :while
143
- while context.evaluate @value
144
- evaluate_children[context]
145
- end
146
- when :until
147
- until context.evaluate @value
148
- evaluate_children[context]
149
- end
150
- end
151
-
152
- return result.flatten.compact
153
- end
154
- end
155
-
156
- # @EachControl
157
- #
158
- # Control structure for while and until directives
159
- #
160
- class EachControl < LoopControl
161
- # Node evaluation method which goes through all the child nodes and evaluates
162
- # them using their own eval method
163
- #
164
- def evaluate(context)
165
- result = []
166
-
167
- # Process named variables for each structure
168
- variables = @value[0].clone
169
-
170
- # The each structure accept missing arguments as well, therefore we need to
171
- # substitute them with our defaults
172
- #
173
- # each in iterable
174
- # each value in iterable
175
- # each key, value in iterable
176
-
177
- # Value argument name provided only
178
- if variables.length == 1
179
- variables.unshift Engine[:each][:default_key]
180
-
181
- # Missing key and value arguments
182
- elsif variables.empty?
183
- variables[0] = Engine[:each][:default_key]
184
- variables[1] = Engine[:each][:default_value]
185
- end
186
-
187
- # Evaluate in current context and add to results
188
- evaluate_children = Proc.new do |key, value, context|
189
- # Update the local variables in the each context with the values from the
190
- # current loop iteration
191
- locals = {
192
- variables[0] => key,
193
- variables[1] => value
194
- }
195
- context.extend_context locals
196
-
197
- # Add the mapped child elements
198
- result << @children.map do |child|
199
- child.evaluate context
200
- end.flatten
201
- end
202
-
203
- # Create a new context based on the parent context and progressively update
204
- # variables in the new context
205
- each_context = Context.new({}, context.binding.clone)
206
-
207
- # Evaluate the iterable object
208
- enumerable = each_context.evaluate(@value[1])
209
-
210
- # Check if input can be iterated
211
- Runtime.error :enumerable, @value[1] unless enumerable.respond_to? :each
212
-
213
- # Selectively iterate through the input and add the result using the previously
214
- # defined proc object
215
- case enumerable
216
- when Hash
217
- enumerable.each do |key, value|
218
- evaluate_children[key, value, context]
219
- end
220
- else
221
- enumerable.each_with_index do |value, key|
222
- evaluate_children[key, value, context]
223
- end
224
- end
225
-
226
- return result.flatten.compact
227
- end
228
- end
229
- end
230
- end