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