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.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +13 -0
- data/{LICENSE → LICENSE.md} +0 -0
- data/bin/opulent +0 -0
- data/lib/opulent.rb +10 -10
- data/lib/opulent/compiler.rb +15 -9
- data/lib/opulent/compiler/buffer.rb +123 -62
- data/lib/opulent/compiler/comment.rb +3 -4
- data/lib/opulent/compiler/control.rb +20 -26
- data/lib/opulent/compiler/define.rb +88 -36
- data/lib/opulent/compiler/doctype.rb +20 -22
- data/lib/opulent/compiler/eval.rb +23 -2
- data/lib/opulent/compiler/filter.rb +4 -5
- data/lib/opulent/compiler/node.rb +18 -12
- data/lib/opulent/compiler/root.rb +4 -5
- data/lib/opulent/compiler/text.rb +7 -2
- data/lib/opulent/compiler/yield.rb +2 -3
- data/lib/opulent/engine.rb +21 -20
- data/lib/opulent/exec.rb +21 -63
- data/lib/opulent/logger.rb +230 -3
- data/lib/opulent/parser.rb +14 -76
- data/lib/opulent/parser/comment.rb +45 -34
- data/lib/opulent/parser/control.rb +132 -111
- data/lib/opulent/parser/define.rb +15 -12
- data/lib/opulent/parser/doctype.rb +15 -15
- data/lib/opulent/parser/eval.rb +16 -6
- data/lib/opulent/parser/expression.rb +87 -84
- data/lib/opulent/parser/filter.rb +31 -25
- data/lib/opulent/parser/include.rb +38 -42
- data/lib/opulent/parser/node.rb +136 -118
- data/lib/opulent/parser/root.rb +24 -18
- data/lib/opulent/parser/text.rb +150 -123
- data/lib/opulent/parser/yield.rb +23 -23
- data/lib/opulent/settings.rb +70 -51
- data/lib/opulent/tokens.rb +17 -15
- data/lib/opulent/utils.rb +5 -4
- data/lib/opulent/version.rb +1 -1
- metadata +4 -43
- data/.libold/opulent.rb +0 -96
- data/.libold/opulent/context.rb +0 -80
- data/.libold/opulent/engine.rb +0 -88
- data/.libold/opulent/filter.rb +0 -101
- data/.libold/opulent/logger.rb +0 -67
- data/.libold/opulent/nodes.rb +0 -13
- data/.libold/opulent/nodes/block.rb +0 -29
- data/.libold/opulent/nodes/comment.rb +0 -35
- data/.libold/opulent/nodes/control.rb +0 -230
- data/.libold/opulent/nodes/define.rb +0 -42
- data/.libold/opulent/nodes/eval.rb +0 -41
- data/.libold/opulent/nodes/expression.rb +0 -28
- data/.libold/opulent/nodes/filter.rb +0 -70
- data/.libold/opulent/nodes/helper.rb +0 -69
- data/.libold/opulent/nodes/node.rb +0 -101
- data/.libold/opulent/nodes/root.rb +0 -62
- data/.libold/opulent/nodes/text.rb +0 -54
- data/.libold/opulent/nodes/theme.rb +0 -36
- data/.libold/opulent/parser.rb +0 -252
- data/.libold/opulent/parser/block.rb +0 -70
- data/.libold/opulent/parser/comment.rb +0 -32
- data/.libold/opulent/parser/control.rb +0 -83
- data/.libold/opulent/parser/define.rb +0 -39
- data/.libold/opulent/parser/eval.rb +0 -33
- data/.libold/opulent/parser/expression.rb +0 -350
- data/.libold/opulent/parser/filter.rb +0 -41
- data/.libold/opulent/parser/node.rb +0 -232
- data/.libold/opulent/parser/root.rb +0 -96
- data/.libold/opulent/parser/text.rb +0 -114
- data/.libold/opulent/parser/theme.rb +0 -36
- data/.libold/opulent/preprocessor.rb +0 -102
- data/.libold/opulent/runtime.rb +0 -144
- data/.libold/opulent/template.rb +0 -43
- data/.libold/opulent/tokens.rb +0 -276
- data/.libold/opulent/version.rb +0 -5
- data/.travis.yml +0 -4
- data/benchmark/benchmark.rb +0 -57
- data/benchmark/cases/node/node.haml +0 -7
- data/benchmark/cases/node/node.op +0 -7
- data/benchmark/cases/node/node.slim +0 -7
@@ -1,42 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @Define
|
6
|
-
#
|
7
|
-
# Define a custom HTML element
|
8
|
-
#
|
9
|
-
class Define < Node
|
10
|
-
# Node evaluation method which goes through all the child nodes and
|
11
|
-
# evaluates them using their own eval method
|
12
|
-
#
|
13
|
-
def evaluate(context, blocks = {})
|
14
|
-
yields = @yields.clone
|
15
|
-
|
16
|
-
@children.map do |child|
|
17
|
-
evaluated_child = child.evaluate context
|
18
|
-
|
19
|
-
# Check to see if the child element being mapped is one of the yield
|
20
|
-
# node parent pointers
|
21
|
-
if yields.include? child
|
22
|
-
yields.delete child
|
23
|
-
|
24
|
-
# We need to replace the yield nodes with the matching named block
|
25
|
-
# in order to map the yield node correctly
|
26
|
-
evaluated_child.children.map! do |subchild|
|
27
|
-
if subchild.is_a?(Yield) && blocks[subchild.name]
|
28
|
-
blocks[subchild.name]
|
29
|
-
else
|
30
|
-
subchild
|
31
|
-
end
|
32
|
-
end
|
33
|
-
evaluated_child.children.compact!
|
34
|
-
evaluated_child.children.flatten!
|
35
|
-
end
|
36
|
-
|
37
|
-
evaluated_child
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,41 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @Evaluate
|
6
|
-
#
|
7
|
-
# The eval node evaluates ruby code in the given context without printing
|
8
|
-
# any output in the page
|
9
|
-
#
|
10
|
-
class Evaluate
|
11
|
-
attr_accessor :value, :parent, :indent, :children, :name
|
12
|
-
|
13
|
-
# Ruby code evaluation node
|
14
|
-
#
|
15
|
-
# @param name [String] name of the html node
|
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(value = '', parent = nil, indent = 0, children = [])
|
21
|
-
@name = :eval
|
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 << node
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def evaluate(context)
|
36
|
-
context.evaluate @value
|
37
|
-
return nil
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
41
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @Expression
|
6
|
-
#
|
7
|
-
# Literals are static values that have a Ruby representation, eg.: a string, a number,
|
8
|
-
# true, false, nil, etc.
|
9
|
-
#
|
10
|
-
class Expression
|
11
|
-
attr_accessor :value, :escaped
|
12
|
-
|
13
|
-
def initialize(value = '')
|
14
|
-
@value = value
|
15
|
-
@escaped = true
|
16
|
-
end
|
17
|
-
|
18
|
-
def to_s
|
19
|
-
@value
|
20
|
-
end
|
21
|
-
|
22
|
-
def evaluate(context)
|
23
|
-
evaluated = context.evaluate @value
|
24
|
-
@escaped ? Runtime.escape(evaluated) : evaluated
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
@@ -1,70 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @Filter
|
6
|
-
#
|
7
|
-
# Node class used to run a value interpretation
|
8
|
-
#
|
9
|
-
class Filter
|
10
|
-
# Allow direct access to node variables
|
11
|
-
attr_accessor :name, :attributes, :value, :parent, :indent
|
12
|
-
|
13
|
-
# Initialize node instance variables
|
14
|
-
#
|
15
|
-
# @param name [String] name of the html node
|
16
|
-
# @param indentation [Fixnum] node indentation for restructuring
|
17
|
-
# @param attributes [Hash] stores key="value" attributes
|
18
|
-
# @param value [String] Contents to be interpreted
|
19
|
-
#
|
20
|
-
def initialize(name = '', attributes = {}, parent = nil, indent = 0, value = '')
|
21
|
-
@name = name
|
22
|
-
@parent = parent
|
23
|
-
@indent = indent
|
24
|
-
@attributes = attributes
|
25
|
-
@value = value
|
26
|
-
end
|
27
|
-
|
28
|
-
# Update attributes with values from current evaluation context
|
29
|
-
#
|
30
|
-
def get_attributes(context)
|
31
|
-
Hash[@attributes.map{ |key, val|
|
32
|
-
unless val.nil?
|
33
|
-
value = val.evaluate(context)
|
34
|
-
value.flatten! if value.is_a?(Array)
|
35
|
-
end
|
36
|
-
[key, value]
|
37
|
-
}]
|
38
|
-
end
|
39
|
-
|
40
|
-
# Node evaluation method which goes through all the child nodes and evaluates
|
41
|
-
# them using their own eval method
|
42
|
-
#
|
43
|
-
def evaluate(context)
|
44
|
-
# Set attributes for current context
|
45
|
-
attributes = Runtime.attributes @attributes, nil, context
|
46
|
-
|
47
|
-
# Check if filter is registered
|
48
|
-
Runtime.error :filter_registered, name unless Engine.filter? name
|
49
|
-
|
50
|
-
# Load the required filter
|
51
|
-
Engine.filters[name].load_filter
|
52
|
-
|
53
|
-
# Render output using the chosen engine
|
54
|
-
output = Engine.filters[name].render @value
|
55
|
-
|
56
|
-
# Main output node which contains filter rendered value
|
57
|
-
text_node = Text.new output, false, @parent, @indent
|
58
|
-
|
59
|
-
# If we have a provided filter tag, wrap the text node in the wrapper
|
60
|
-
# node tag and further indent
|
61
|
-
if (wrapper_tag = Engine.filters[name].options[:tag])
|
62
|
-
text_node.indent = @indent + Engine[:indent]
|
63
|
-
return Node.new wrapper_tag, Engine.filters[name].options[:attributes], @parent, @indent, [text_node]
|
64
|
-
else
|
65
|
-
return text_node
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
end
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @NodeFactory
|
6
|
-
class Helper
|
7
|
-
def root
|
8
|
-
Root.new
|
9
|
-
end
|
10
|
-
|
11
|
-
def node(name = '', atts = {}, parent = nil, indent = 0, children = [])
|
12
|
-
Node.new name, atts, parent, indent, children
|
13
|
-
end
|
14
|
-
|
15
|
-
def block_yield(name = '', parent = nil, indent = 0, children = [])
|
16
|
-
Yield.new name, {}, parent, indent, children
|
17
|
-
end
|
18
|
-
|
19
|
-
def block(name = '', parent = nil, indent = 0, children = [])
|
20
|
-
Block.new name, {}, parent, indent, children
|
21
|
-
end
|
22
|
-
|
23
|
-
def theme(name = '', parent = nil, indent = 0, children = [])
|
24
|
-
Theme.new name, parent, indent, children
|
25
|
-
end
|
26
|
-
|
27
|
-
def filter(name = '', atts = {}, parent = nil, indent = 0, value = '')
|
28
|
-
Filter.new name, atts, parent, indent, value
|
29
|
-
end
|
30
|
-
|
31
|
-
def evaluate(value, parent = nil, indent = 0, children = [])
|
32
|
-
Evaluate.new value, parent, indent, children
|
33
|
-
end
|
34
|
-
|
35
|
-
def control(name, value = '', parent = nil, indent = 0, children = [[]])
|
36
|
-
case name
|
37
|
-
when :if, :unless
|
38
|
-
CnditionalControl.new name, value, parent, indent, children
|
39
|
-
when :case
|
40
|
-
CaseControl.new name, value, parent, indent, children.first
|
41
|
-
when :while, :until
|
42
|
-
LoopControl.new name, value, parent, indent, children.first
|
43
|
-
when :each
|
44
|
-
EachControl.new name, value, parent, indent, children.first
|
45
|
-
end
|
46
|
-
end
|
47
|
-
|
48
|
-
def expression(value = [])
|
49
|
-
Expression.new value
|
50
|
-
end
|
51
|
-
|
52
|
-
def definition(name, params = [], parent = nil, indent = 0)
|
53
|
-
Define.new name, params, parent, indent
|
54
|
-
end
|
55
|
-
|
56
|
-
def text(value = nil, escaped = true, parent = nil, indent = 0)
|
57
|
-
Text.new value, escaped, parent, indent
|
58
|
-
end
|
59
|
-
|
60
|
-
def print(value = nil, escaped = true, parent = nil, indent = 0)
|
61
|
-
Print.new value, escaped, parent, indent
|
62
|
-
end
|
63
|
-
|
64
|
-
def comment(value = nil, parent = nil, indent = 0)
|
65
|
-
Comment.new value, parent, indent
|
66
|
-
end
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
@@ -1,101 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @Node
|
6
|
-
#
|
7
|
-
# Node class used to describe a HTML Element used for building a
|
8
|
-
# page model during the parsing process
|
9
|
-
#
|
10
|
-
class Node
|
11
|
-
# Allow direct access to node variables
|
12
|
-
attr_accessor :name, :attributes, :children, :whitespace, :parent, :indent, :extension, :theme, :blocks, :yields, :self_enclosing
|
13
|
-
|
14
|
-
# Initialize node instance variables
|
15
|
-
#
|
16
|
-
# @param name [String] name of the html node
|
17
|
-
# @param indentation [Fixnum] node indentation for restructuring
|
18
|
-
# @param attributes [Hash] stores key="value" attributes
|
19
|
-
# @param children [Array] collection of the node's child elements
|
20
|
-
#
|
21
|
-
def initialize(name = '', attributes = {}, parent = nil, indent = 0, children = [])
|
22
|
-
@name = name
|
23
|
-
@parent = parent
|
24
|
-
@indent = indent
|
25
|
-
@attributes = attributes
|
26
|
-
@children = children
|
27
|
-
@extension = nil
|
28
|
-
@theme = Engine::DEFAULT_THEME
|
29
|
-
@self_enclosing = Engine::SELF_ENCLOSING.include? name
|
30
|
-
@whitespace = [nil, nil]
|
31
|
-
@blocks = {
|
32
|
-
Engine::DEFAULT_YIELD => @children
|
33
|
-
}
|
34
|
-
@yields = []
|
35
|
-
end
|
36
|
-
|
37
|
-
# Add a new node to the nodes array
|
38
|
-
#
|
39
|
-
def push(node)
|
40
|
-
@children << node
|
41
|
-
self
|
42
|
-
end
|
43
|
-
|
44
|
-
# Return extended attributes if an extension was set using the [extend]
|
45
|
-
# identifier of the node
|
46
|
-
#
|
47
|
-
def extend_attributes(attributes, extension)
|
48
|
-
return attributes if extension.nil?
|
49
|
-
|
50
|
-
extension.each do |key, value|
|
51
|
-
case attributes[key]
|
52
|
-
when Array
|
53
|
-
attributes[key] = (attributes[key] << value).flatten
|
54
|
-
when Hash
|
55
|
-
attributes[key] = value.merge attributes[key]
|
56
|
-
when nil
|
57
|
-
attributes[key] = value
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
attributes
|
62
|
-
end
|
63
|
-
|
64
|
-
# Node evaluation method which goes through all the child nodes and evaluates
|
65
|
-
# them using their own eval method
|
66
|
-
#
|
67
|
-
def evaluate(context)
|
68
|
-
# Set attributes for current context
|
69
|
-
attributes = Runtime.attributes @attributes, @extension, context
|
70
|
-
|
71
|
-
# Evaluate all provided blocks
|
72
|
-
blocks = Hash[@blocks.map{ |key, value|
|
73
|
-
children = value.map do |child|
|
74
|
-
child.evaluate context
|
75
|
-
end.flatten.compact
|
76
|
-
|
77
|
-
[key, children]
|
78
|
-
}]
|
79
|
-
|
80
|
-
# Map self to a different node and set evaluated children nodes and
|
81
|
-
# evaluated attributes and add a pointer to the children block
|
82
|
-
mapped_node = self.dup
|
83
|
-
mapped_node.attributes = attributes
|
84
|
-
mapped_node.blocks = blocks
|
85
|
-
mapped_node.children = mapped_node.blocks[Engine::DEFAULT_YIELD]
|
86
|
-
|
87
|
-
# Replace node with its definition if it has one
|
88
|
-
if Runtime[@theme]
|
89
|
-
if Runtime[@theme][@name] && @name != context.name
|
90
|
-
return Runtime.define mapped_node, attributes, context
|
91
|
-
else
|
92
|
-
return mapped_node
|
93
|
-
end
|
94
|
-
else
|
95
|
-
# Theme does not exist
|
96
|
-
Runtime.error :theme, @theme
|
97
|
-
end
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Nodes
|
4
|
-
module Nodes
|
5
|
-
# @Root
|
6
|
-
#
|
7
|
-
# HTML Root from which the construction of the final page starts. The root
|
8
|
-
# stores all the node definitions that will be replaced in the components.
|
9
|
-
#
|
10
|
-
class Root
|
11
|
-
# Allow direct access to node variables
|
12
|
-
attr_accessor :themes, :children, :indent, :blocks, :yields
|
13
|
-
|
14
|
-
# Initialize node instance variables
|
15
|
-
#
|
16
|
-
# @param definitions [Hash] node definitions to be replaced in children
|
17
|
-
# @param children [Array] collection of the node's child elements
|
18
|
-
#
|
19
|
-
def initialize
|
20
|
-
@themes = {
|
21
|
-
Engine::DEFAULT_THEME => {}
|
22
|
-
}
|
23
|
-
@children = []
|
24
|
-
@blocks = {}
|
25
|
-
@yields = {}
|
26
|
-
@indent = -1
|
27
|
-
end
|
28
|
-
|
29
|
-
# Add a new node to the nodes array
|
30
|
-
#
|
31
|
-
# @param node [Node] Node to be added to the parent
|
32
|
-
#
|
33
|
-
def push(node)
|
34
|
-
@children << node
|
35
|
-
self
|
36
|
-
end
|
37
|
-
|
38
|
-
# Shorthand theme access for root definitions
|
39
|
-
#
|
40
|
-
# @param key [Symbol] definition or theme name
|
41
|
-
#
|
42
|
-
def [](key)
|
43
|
-
if @themes.has_key? key
|
44
|
-
@themes[key]
|
45
|
-
else
|
46
|
-
@themes[Engine::DEFAULT_THEME][key]
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
# Evaluate all child nodes using the given context and the
|
51
|
-
# node definitions from the root knowledgebase
|
52
|
-
#
|
53
|
-
# @param context [Context] Call environment binding object
|
54
|
-
#
|
55
|
-
def evaluate(context)
|
56
|
-
@children.map do |node|
|
57
|
-
node.evaluate(context)
|
58
|
-
end.flatten.compact
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,54 +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 Text
|
10
|
-
# Allow direct access to literal value and type
|
11
|
-
attr_accessor :value, :escaped, :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, escaped = true, parent = nil, indent = 0)
|
18
|
-
@value = value
|
19
|
-
@escaped = escaped
|
20
|
-
@parent = parent
|
21
|
-
@indent = indent
|
22
|
-
@name = :text
|
23
|
-
end
|
24
|
-
|
25
|
-
# Value evaluation method which returns the processed value of the
|
26
|
-
# literal
|
27
|
-
#
|
28
|
-
def evaluate(context)
|
29
|
-
value = context.evaluate "\"#{@value}\""
|
30
|
-
|
31
|
-
evaluated_text = self.dup
|
32
|
-
evaluated_text.value = @escaped ? Runtime.escape(value) : value
|
33
|
-
return evaluated_text
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# @Print
|
38
|
-
#
|
39
|
-
# The print class will evaluate the ruby code and return a new text
|
40
|
-
# node containing the escaped or unescaped eval sequence
|
41
|
-
#
|
42
|
-
class Print < Text
|
43
|
-
# Value evaluation method which returns the processed value of the literal
|
44
|
-
#
|
45
|
-
def evaluate(context)
|
46
|
-
value = context.evaluate @value
|
47
|
-
|
48
|
-
evaluated_text = self.dup
|
49
|
-
evaluated_text.value = @escaped ? Runtime.escape(value) : value
|
50
|
-
return evaluated_text
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
end
|