opulent 1.4.0 → 1.4.1
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/benchmark/benchmark.rb +18 -7
- data/benchmark/cases/node/node.haml +6 -16
- data/benchmark/cases/node/node.op +6 -13
- data/benchmark/cases/node/node.slim +6 -18
- data/docs/comments.md +5 -0
- data/docs/filters.md +31 -0
- data/docs/includes.md +0 -0
- data/docs/nodes.md +88 -0
- data/docs/reference.md +7 -6
- data/lib/opulent.rb +2 -1
- data/lib/opulent/compiler.rb +19 -18
- data/lib/opulent/compiler/buffer.rb +260 -0
- data/lib/opulent/compiler/comment.rb +4 -9
- data/lib/opulent/compiler/control.rb +65 -67
- data/lib/opulent/compiler/define.rb +91 -63
- data/lib/opulent/compiler/doctype.rb +1 -5
- data/lib/opulent/compiler/eval.rb +1 -1
- data/lib/opulent/compiler/node.rb +10 -194
- data/lib/opulent/compiler/root.rb +1 -1
- data/lib/opulent/compiler/text.rb +3 -40
- data/lib/opulent/compiler/yield.rb +15 -0
- data/lib/opulent/context.rb +2 -2
- data/lib/opulent/engine.rb +56 -57
- data/lib/opulent/parser.rb +10 -10
- data/lib/opulent/parser/control.rb +2 -3
- data/lib/opulent/parser/expression.rb +1 -1
- data/lib/opulent/parser/{require.rb → include.rb} +17 -15
- data/lib/opulent/parser/node.rb +22 -17
- data/lib/opulent/parser/root.rb +3 -4
- data/lib/opulent/parser/text.rb +3 -7
- data/lib/opulent/parser/yield.rb +23 -0
- data/lib/opulent/settings.rb +5 -4
- data/lib/opulent/template.rb +12 -30
- data/lib/opulent/tokens.rb +5 -9
- data/lib/opulent/utils.rb +41 -0
- data/lib/opulent/version.rb +1 -1
- metadata +9 -5
- data/lib/opulent/compiler/block.rb +0 -31
- data/lib/opulent/parser/block.rb +0 -56
data/lib/opulent/parser/text.rb
CHANGED
@@ -28,7 +28,7 @@ module Opulent
|
|
28
28
|
value = value[1..-1] if value[0] == '\\'
|
29
29
|
|
30
30
|
# Create the text node using input data
|
31
|
-
text_node = [:plain, type, {value: value.strip, escaped: escaped
|
31
|
+
text_node = [:plain, type, {value: value.strip, escaped: escaped}, nil, indent]
|
32
32
|
|
33
33
|
# If we have a multiline node, get all the text which has higher
|
34
34
|
# indentation than our indentation node.
|
@@ -42,10 +42,6 @@ module Opulent
|
|
42
42
|
return nil
|
43
43
|
end
|
44
44
|
|
45
|
-
if text_node[@options][:value] =~ Settings::InterpolationCheck
|
46
|
-
text_node[@options][:evaluate] = true
|
47
|
-
end
|
48
|
-
|
49
45
|
# Increase indentation if this is an inline text node
|
50
46
|
text_node[@indent] += Settings[:indent] unless multiline_or_print
|
51
47
|
|
@@ -58,7 +54,7 @@ module Opulent
|
|
58
54
|
def html_text(parent, indent)
|
59
55
|
if (text_feed = accept :html_text)
|
60
56
|
text_node = [:plain, :text, {value: text_feed.strip, escaped: false}, nil, indent]
|
61
|
-
|
57
|
+
|
62
58
|
parent[@children] << text_node
|
63
59
|
end
|
64
60
|
end
|
@@ -107,7 +103,7 @@ module Opulent
|
|
107
103
|
# Add next line feed, prepend the indent and append the newline
|
108
104
|
buffer += " " * next_line_indent if next_line_indent > 0
|
109
105
|
buffer += accept_stripped(:line_feed) || ""
|
110
|
-
buffer +=
|
106
|
+
buffer += accept(:newline) || ""
|
111
107
|
|
112
108
|
# Get blank lines until we match something
|
113
109
|
blank_lines[]
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# @Opulent
|
2
|
+
module Opulent
|
3
|
+
# @Parser
|
4
|
+
class Parser
|
5
|
+
# Match a yield with a explicit or implicit target
|
6
|
+
#
|
7
|
+
# yield target
|
8
|
+
#
|
9
|
+
# @param parent [Node] Parent node to which we append the definition
|
10
|
+
#
|
11
|
+
def block_yield(parent, indent)
|
12
|
+
if accept :yield
|
13
|
+
# Consume the newline from the end of the element
|
14
|
+
error :yield unless accept(:line_feed).strip.empty?
|
15
|
+
|
16
|
+
# Create a new node
|
17
|
+
yield_node = [:yield, nil, {}, [], indent]
|
18
|
+
|
19
|
+
parent[@children] << yield_node
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/opulent/settings.rb
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
module Opulent
|
3
3
|
# @Settings
|
4
4
|
module Settings
|
5
|
-
#
|
6
|
-
|
5
|
+
# Set buffer variable name
|
6
|
+
Buffer = :@_opulent_buffer
|
7
7
|
|
8
|
-
# Default
|
9
|
-
|
8
|
+
# Default Opulent file extension
|
9
|
+
FileExtension = '.op'
|
10
10
|
|
11
11
|
# Default yield target which is used for child block replacements
|
12
12
|
DefaultEachKey = :key
|
@@ -45,6 +45,7 @@ module Opulent
|
|
45
45
|
#dependency_manager: true, # Soon to be implemented
|
46
46
|
indent: 2,
|
47
47
|
layouts: false,
|
48
|
+
pretty: false, # Under work
|
48
49
|
default_layout: :'views/layouts/application'
|
49
50
|
}
|
50
51
|
|
data/lib/opulent/template.rb
CHANGED
@@ -2,6 +2,10 @@
|
|
2
2
|
module Opulent
|
3
3
|
# @OpulentTemplate
|
4
4
|
class OpulentTemplate < ::Tilt::Template
|
5
|
+
# Allow accessing engine definitions
|
6
|
+
attr_reader :def
|
7
|
+
|
8
|
+
# Set default mime type
|
5
9
|
self.default_mime_type = 'text/html'
|
6
10
|
|
7
11
|
# Do whatever preparation is necessary to setup the underlying template
|
@@ -11,17 +15,11 @@ module Opulent
|
|
11
15
|
# Subclasses must provide an implementation of this method.
|
12
16
|
#
|
13
17
|
def prepare
|
14
|
-
# Set the file which is being evaluated
|
15
|
-
@options[:file] = eval_file
|
16
|
-
|
17
|
-
# Enable caching for the current rendered file
|
18
|
-
@options[:cache] = true
|
19
|
-
|
20
|
-
# Enable layouts so that we can render with symbols
|
21
|
-
#@options[:layouts] = true
|
22
|
-
|
23
18
|
# Set up the rendering engine
|
24
|
-
@engine = ::Opulent.new @options
|
19
|
+
@engine = ::Opulent.new eval_file.to_sym, @options
|
20
|
+
|
21
|
+
# Set reusable template definitions
|
22
|
+
@def = @engine.def
|
25
23
|
end
|
26
24
|
|
27
25
|
# Execute the compiled template and return the result string. Template
|
@@ -32,17 +30,8 @@ module Opulent
|
|
32
30
|
# override render() may not support all features.
|
33
31
|
#
|
34
32
|
def evaluate(scope, locals, &block)
|
35
|
-
|
36
|
-
|
37
|
-
# else
|
38
|
-
# @engine.render(data, locals, &block)
|
39
|
-
# end
|
40
|
-
if @engine.preamble
|
41
|
-
super
|
42
|
-
else
|
43
|
-
locals[:scope] = scope
|
44
|
-
@engine.render(data, locals, &block)
|
45
|
-
end
|
33
|
+
raise ArgumentError, 'Invalid scope: must not be frozen.' if scope.frozen?
|
34
|
+
super
|
46
35
|
end
|
47
36
|
|
48
37
|
# A string containing the (Ruby) source code for the template. The
|
@@ -52,15 +41,8 @@ module Opulent
|
|
52
41
|
# support, custom scopes, proper encoding, and support for template
|
53
42
|
# compilation.
|
54
43
|
#
|
55
|
-
def precompiled_template(locals)
|
56
|
-
|
57
|
-
# as text to the user.
|
58
|
-
# For example:
|
59
|
-
# _buff = [] # This should be in preamble
|
60
|
-
# _buff << "<html>",
|
61
|
-
# _buff << compile('a * b')
|
62
|
-
# _buff << "</html>"
|
63
|
-
@engine.preamble
|
44
|
+
def precompiled_template(locals = {})
|
45
|
+
@engine.template
|
64
46
|
end
|
65
47
|
end
|
66
48
|
|
data/lib/opulent/tokens.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Opulent
|
2
2
|
# Opulent Keywords
|
3
|
-
Keywords = %i(def
|
3
|
+
Keywords = %i(def yield include if else elsif unless case when each while until doctype)
|
4
4
|
|
5
5
|
# @Tokens
|
6
6
|
class Tokens
|
@@ -30,10 +30,10 @@ module Opulent
|
|
30
30
|
def: /\Adef +/,
|
31
31
|
|
32
32
|
# Definition
|
33
|
-
doctype: /\Adoctype
|
33
|
+
doctype: /\Adoctype */,
|
34
34
|
|
35
|
-
#
|
36
|
-
|
35
|
+
# Include file
|
36
|
+
include: /\Ainclude +/,
|
37
37
|
|
38
38
|
# Node Attributes
|
39
39
|
attributes_bracket: /\A\(\[\{/,
|
@@ -69,14 +69,10 @@ module Opulent
|
|
69
69
|
|
70
70
|
# Yield
|
71
71
|
yield: /\A(yield)/,
|
72
|
-
yield_identifier: /\A[a-zA-Z]([\_]?[a-zA-Z0-9]+)*/,
|
73
|
-
|
74
|
-
# Yield
|
75
|
-
block: /\A(block)/,
|
76
72
|
|
77
73
|
# Conditional Structures
|
78
74
|
control: /\A(if|elsif|else|unless|case|when|each|while|until)/,
|
79
|
-
each_pattern: /\A(
|
75
|
+
each_pattern: /\A(.+) +do *\|(.+)\|/,
|
80
76
|
|
81
77
|
# Text
|
82
78
|
text: /\A\|/,
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# @Opulent
|
2
|
+
module Opulent
|
3
|
+
module Utils
|
4
|
+
# Used by escape_html
|
5
|
+
#
|
6
|
+
EscapeHTML = {
|
7
|
+
'&' => '&',
|
8
|
+
'"' => '"',
|
9
|
+
'\'' => ''',
|
10
|
+
'<' => '<',
|
11
|
+
'>' => '>'
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
# Pattern matching for html escape characters
|
15
|
+
EscapeHTMLPattern = Regexp.union(*EscapeHTML.keys)
|
16
|
+
|
17
|
+
# Ruby interpolation pattern
|
18
|
+
InterpolationPattern = /\#\{([^}]+)\}/
|
19
|
+
|
20
|
+
# @Utils
|
21
|
+
class << self
|
22
|
+
if defined?(EscapeUtils)
|
23
|
+
# Returns an escaped copy of `html`.
|
24
|
+
#
|
25
|
+
# @param html [String] The string to escape
|
26
|
+
# @return [String] The escaped string
|
27
|
+
def escape(html)
|
28
|
+
EscapeUtils.escape_html html.to_s, false
|
29
|
+
end
|
30
|
+
else
|
31
|
+
# Returns an escaped copy of `html`.
|
32
|
+
#
|
33
|
+
# @param html [String] The string to escape
|
34
|
+
# @return [String] The escaped string
|
35
|
+
def escape(html)
|
36
|
+
html.to_s.gsub EscapeHTMLPattern, EscapeHTML
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/lib/opulent/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opulent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Grozav
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-09-
|
11
|
+
date: 2015-09-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -140,12 +140,14 @@ files:
|
|
140
140
|
- docs/control-structures.md
|
141
141
|
- docs/doctype.md
|
142
142
|
- docs/expressions.md
|
143
|
+
- docs/filters.md
|
144
|
+
- docs/includes.md
|
143
145
|
- docs/nodes.md
|
144
146
|
- docs/reference.md
|
145
147
|
- docs/usage.md
|
146
148
|
- lib/opulent.rb
|
147
149
|
- lib/opulent/compiler.rb
|
148
|
-
- lib/opulent/compiler/
|
150
|
+
- lib/opulent/compiler/buffer.rb
|
149
151
|
- lib/opulent/compiler/comment.rb
|
150
152
|
- lib/opulent/compiler/control.rb
|
151
153
|
- lib/opulent/compiler/define.rb
|
@@ -155,13 +157,13 @@ files:
|
|
155
157
|
- lib/opulent/compiler/node.rb
|
156
158
|
- lib/opulent/compiler/root.rb
|
157
159
|
- lib/opulent/compiler/text.rb
|
160
|
+
- lib/opulent/compiler/yield.rb
|
158
161
|
- lib/opulent/context.rb
|
159
162
|
- lib/opulent/engine.rb
|
160
163
|
- lib/opulent/exec.rb
|
161
164
|
- lib/opulent/filters.rb
|
162
165
|
- lib/opulent/logger.rb
|
163
166
|
- lib/opulent/parser.rb
|
164
|
-
- lib/opulent/parser/block.rb
|
165
167
|
- lib/opulent/parser/comment.rb
|
166
168
|
- lib/opulent/parser/control.rb
|
167
169
|
- lib/opulent/parser/define.rb
|
@@ -169,13 +171,15 @@ files:
|
|
169
171
|
- lib/opulent/parser/eval.rb
|
170
172
|
- lib/opulent/parser/expression.rb
|
171
173
|
- lib/opulent/parser/filter.rb
|
174
|
+
- lib/opulent/parser/include.rb
|
172
175
|
- lib/opulent/parser/node.rb
|
173
|
-
- lib/opulent/parser/require.rb
|
174
176
|
- lib/opulent/parser/root.rb
|
175
177
|
- lib/opulent/parser/text.rb
|
178
|
+
- lib/opulent/parser/yield.rb
|
176
179
|
- lib/opulent/settings.rb
|
177
180
|
- lib/opulent/template.rb
|
178
181
|
- lib/opulent/tokens.rb
|
182
|
+
- lib/opulent/utils.rb
|
179
183
|
- lib/opulent/version.rb
|
180
184
|
- opulent.gemspec
|
181
185
|
homepage: http://opulent.io
|
@@ -1,31 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Compiler
|
4
|
-
class Compiler
|
5
|
-
# Generate the code for a while control structure
|
6
|
-
#
|
7
|
-
# @param node [Array] Node code generation data
|
8
|
-
# @param indent [Fixnum] Size of the indentation to be added
|
9
|
-
# @param context [Context] Processing environment data
|
10
|
-
#
|
11
|
-
def yield_node(node, indent, context)
|
12
|
-
if @block_stack[-1].has_key? node[@value]
|
13
|
-
@block_stack[-1][node[@value]].each do |child|
|
14
|
-
root child, indent, context.parent
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
# Generate the code for a while control structure
|
20
|
-
#
|
21
|
-
# @param node [Array] Node code generation data
|
22
|
-
# @param indent [Fixnum] Size of the indentation to be added
|
23
|
-
# @param context [Context] Processing environment data
|
24
|
-
#
|
25
|
-
def block_node(node, indent, context)
|
26
|
-
node[@children].each do |child|
|
27
|
-
root child, indent, context
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/opulent/parser/block.rb
DELETED
@@ -1,56 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Parser
|
4
|
-
class Parser
|
5
|
-
# Match a yield with a explicit or implicit target
|
6
|
-
#
|
7
|
-
# yield target
|
8
|
-
#
|
9
|
-
# @param parent [Node] Parent node to which we append the definition
|
10
|
-
#
|
11
|
-
def block_yield(parent, indent)
|
12
|
-
if accept :yield
|
13
|
-
# Get definition name
|
14
|
-
if(yield_name = accept_stripped(:yield_identifier))
|
15
|
-
yield_name = yield_name.strip.to_sym
|
16
|
-
else
|
17
|
-
yield_name = Settings::DefaultYield
|
18
|
-
end
|
19
|
-
|
20
|
-
# Consume the newline from the end of the element
|
21
|
-
error :yield unless accept(:line_feed).strip.empty?
|
22
|
-
|
23
|
-
# Create a new node
|
24
|
-
yield_node = [:yield, yield_name, {}, [], indent]
|
25
|
-
|
26
|
-
parent[@children] << yield_node
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Match a block with a explicit target
|
31
|
-
#
|
32
|
-
# block target
|
33
|
-
#
|
34
|
-
# @param parent [Node] Parent node to which we append the definition
|
35
|
-
#
|
36
|
-
def block(parent, indent)
|
37
|
-
if accept :block
|
38
|
-
# Get definition name
|
39
|
-
if(block_name = accept_stripped(:yield_identifier))
|
40
|
-
block_name = block_name.strip.to_sym
|
41
|
-
else
|
42
|
-
block_name = Settings::DefaultYield
|
43
|
-
end
|
44
|
-
|
45
|
-
# Consume the newline from the end of the element
|
46
|
-
error :block unless accept(:line_feed).strip.empty?
|
47
|
-
|
48
|
-
# Create a new node
|
49
|
-
block_node = [:block, block_name, {}, [], indent]
|
50
|
-
root block_node, indent
|
51
|
-
|
52
|
-
parent[@children] << block_node
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|