opulent 1.1.0 → 1.1.5
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/lib/opulent/compiler.rb +1 -0
- data/lib/opulent/compiler/comment.rb +3 -2
- data/lib/opulent/compiler/control.rb +24 -2
- data/lib/opulent/compiler/define.rb +1 -1
- data/lib/opulent/compiler/doctype.rb +42 -0
- data/lib/opulent/compiler/node.rb +6 -4
- data/lib/opulent/context.rb +2 -2
- data/lib/opulent/engine.rb +2 -2
- data/lib/opulent/parser.rb +5 -2
- data/lib/opulent/parser/comment.rb +8 -1
- data/lib/opulent/parser/doctype.rb +15 -0
- data/lib/opulent/parser/node.rb +3 -0
- data/lib/opulent/parser/root.rb +2 -1
- data/lib/opulent/tokens.rb +4 -1
- data/lib/opulent/version.rb +1 -1
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fbda9fcfae11aa802dd630503537fe4ad6e68208
|
4
|
+
data.tar.gz: 7d9f569b65d0a043c6fdb831992eb17860cd9d01
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 48323906c8fd7463558c599b7bdb2aa3d4799b6544fb51d5ad284903d11869bd00f24b96ade47edaf90a34c13fe0b36dedd8b8a43ca855ee5d65586ba76bd242
|
7
|
+
data.tar.gz: 10cee6d1c1153a20d15acbcf591a7404722ee7dde668d40d7d0cb118719b8360f1061bc013411cf345c5fabfafc7fe2131714a39e88a3059959e2a15c3046e8c
|
data/lib/opulent/compiler.rb
CHANGED
@@ -2,6 +2,7 @@ require_relative 'compiler/block.rb'
|
|
2
2
|
require_relative 'compiler/comment.rb'
|
3
3
|
require_relative 'compiler/control.rb'
|
4
4
|
require_relative 'compiler/define.rb'
|
5
|
+
require_relative 'compiler/doctype.rb'
|
5
6
|
require_relative 'compiler/eval.rb'
|
6
7
|
require_relative 'compiler/filter.rb'
|
7
8
|
require_relative 'compiler/node.rb'
|
@@ -11,9 +11,10 @@ module Opulent
|
|
11
11
|
def comment(node, indent, context)
|
12
12
|
indentation = " " * indent
|
13
13
|
|
14
|
-
|
14
|
+
# Escaping double quotes is required in order to avoid any conflicts with the eval quotes.
|
15
|
+
value = indent_lines context.evaluate('"' + node[@value].gsub('"', '\\"') + '"'), " " * indent
|
15
16
|
|
16
|
-
comment_tag = "#{indentation}<!-- #{value} -->\n"
|
17
|
+
comment_tag = "#{"\n" if node[@options][:newline]}#{indentation}<!-- #{value.strip} -->\n"
|
17
18
|
|
18
19
|
@node_stack << :comment
|
19
20
|
@code += comment_tag
|
@@ -23,6 +23,27 @@ module Opulent
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
# Generate the code for a unless-else control structure
|
27
|
+
#
|
28
|
+
# @param node [Array] Node code generation data
|
29
|
+
# @param indent [Fixnum] Size of the indentation to be added
|
30
|
+
# @param context [Context] Processing environment data
|
31
|
+
#
|
32
|
+
def unless_node(node, indent, context)
|
33
|
+
# Check if we have any condition met, or an else branch
|
34
|
+
index = node[@value].index do |value|
|
35
|
+
value.empty? || !context.evaluate(value)
|
36
|
+
end
|
37
|
+
|
38
|
+
# If we have a branch that meets the condition, generate code for the
|
39
|
+
# children related to that specific branch
|
40
|
+
if index
|
41
|
+
node[@children][index].each do |child|
|
42
|
+
root child, indent, context
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
26
47
|
# Generate the code for a case-when-else control structure
|
27
48
|
#
|
28
49
|
# @param node [Array] Node code generation data
|
@@ -126,11 +147,12 @@ module Opulent
|
|
126
147
|
|
127
148
|
# Create a new context based on the parent context and progressively update
|
128
149
|
# variables in the new context
|
129
|
-
|
150
|
+
block = context.block.clone if context.block
|
151
|
+
each_context = Context.new Hash.new, &block
|
130
152
|
each_context.parent = context
|
131
153
|
|
132
154
|
# Evaluate the iterable object
|
133
|
-
enumerable =
|
155
|
+
enumerable = context.evaluate(node[@value][1])
|
134
156
|
|
135
157
|
# Check if input can be iterated
|
136
158
|
self.error :enumerable, node[@value][1] unless enumerable.respond_to? :each
|
@@ -71,7 +71,6 @@ module Opulent
|
|
71
71
|
end
|
72
72
|
|
73
73
|
# Set variable to determine available blocks
|
74
|
-
#
|
75
74
|
arguments[:blocks] = Hash[@block_stack[-1].keys.map{|key| [key, true]}]
|
76
75
|
|
77
76
|
# Create local variables from argument variables
|
@@ -82,6 +81,7 @@ module Opulent
|
|
82
81
|
root child, indent, definition_context
|
83
82
|
end
|
84
83
|
|
84
|
+
# Remove last set of blocks from the block stack
|
85
85
|
@block_stack.pop
|
86
86
|
end
|
87
87
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
# @Opulent
|
3
|
+
module Opulent
|
4
|
+
# @Compiler
|
5
|
+
class Compiler
|
6
|
+
# Generate the code for a while control structure
|
7
|
+
#
|
8
|
+
# @param node [Array] Node code generation data
|
9
|
+
# @param indent [Fixnum] Size of the indentation to be added
|
10
|
+
# @param context [Context] Processing environment data
|
11
|
+
#
|
12
|
+
def doctype_node(node, indent, context)
|
13
|
+
indentation = " " * indent
|
14
|
+
|
15
|
+
value = case node[@value]
|
16
|
+
when :"", :"html", :"5"
|
17
|
+
"!DOCTYPE html"
|
18
|
+
when :"1.1"
|
19
|
+
'!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"'
|
20
|
+
when :strict
|
21
|
+
'!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"'
|
22
|
+
when :frameset
|
23
|
+
'!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd"'
|
24
|
+
when :mobile
|
25
|
+
'!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd"'
|
26
|
+
when :basic
|
27
|
+
'!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd"'
|
28
|
+
when :transitional
|
29
|
+
'!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"'
|
30
|
+
when :xml
|
31
|
+
'?xml version="1.0" encoding="utf-8" ?'
|
32
|
+
when :'xml ISO-8859-1'
|
33
|
+
'?xml version="1.0" encoding="iso-8859-1" ?'
|
34
|
+
end
|
35
|
+
|
36
|
+
doctype_tag = "#{indentation}<#{value}>\n"
|
37
|
+
|
38
|
+
@node_stack << :doctype
|
39
|
+
@code += doctype_tag
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -210,19 +210,21 @@ module Opulent
|
|
210
210
|
attribute_value = value.join '_'
|
211
211
|
end
|
212
212
|
|
213
|
-
|
214
|
-
|
213
|
+
unless attribute_value.empty?
|
214
|
+
attribute_code += " #{key}"
|
215
|
+
attribute_code += "=\"#{attribute_value.strip}\""
|
216
|
+
end
|
215
217
|
when Hash
|
216
218
|
value.each do |k,v|
|
217
219
|
if v
|
218
220
|
attribute_code += " #{key}-#{k}"
|
219
|
-
attribute_code += "=\"#{v.to_s}\"" unless v == true
|
221
|
+
attribute_code += "=\"#{v.to_s.strip}\"" unless v == true
|
220
222
|
end
|
221
223
|
end
|
222
224
|
else
|
223
225
|
if value
|
224
226
|
attribute_code += " #{key}"
|
225
|
-
attribute_code += "=\"#{value.to_s}\"" unless value == true
|
227
|
+
attribute_code += "=\"#{value.to_s.strip}\"" unless value == true
|
226
228
|
end
|
227
229
|
end
|
228
230
|
|
data/lib/opulent/context.rb
CHANGED
@@ -20,7 +20,7 @@ module Opulent
|
|
20
20
|
@binding = if @block
|
21
21
|
@block.binding.clone
|
22
22
|
else
|
23
|
-
Binding.new
|
23
|
+
Binding.new.get
|
24
24
|
end
|
25
25
|
|
26
26
|
extend_locals locals
|
@@ -80,7 +80,7 @@ module Opulent
|
|
80
80
|
|
81
81
|
# @Binding
|
82
82
|
class Binding
|
83
|
-
def
|
83
|
+
def get
|
84
84
|
return binding
|
85
85
|
end
|
86
86
|
end
|
data/lib/opulent/engine.rb
CHANGED
@@ -17,7 +17,7 @@ module Opulent
|
|
17
17
|
# @param overwrite [Boolean] Write changes directly to the parent binding
|
18
18
|
#
|
19
19
|
def initialize(settings = {})
|
20
|
-
@definitions =
|
20
|
+
@definitions = {}
|
21
21
|
@overwrite = settings.delete :overwrite
|
22
22
|
|
23
23
|
Settings.update_settings settings unless settings.empty?
|
@@ -48,7 +48,7 @@ module Opulent
|
|
48
48
|
@code = read input
|
49
49
|
|
50
50
|
# Get the nodes tree
|
51
|
-
@nodes = Parser.new(@file).parse @code
|
51
|
+
@nodes, @definitions = Parser.new(@file, @definitions).parse @code
|
52
52
|
|
53
53
|
# @TODO
|
54
54
|
# Implement precompiled template handling
|
data/lib/opulent/parser.rb
CHANGED
@@ -2,6 +2,7 @@ require_relative 'parser/block.rb'
|
|
2
2
|
require_relative 'parser/comment.rb'
|
3
3
|
require_relative 'parser/control.rb'
|
4
4
|
require_relative 'parser/define.rb'
|
5
|
+
require_relative 'parser/doctype.rb'
|
5
6
|
require_relative 'parser/eval.rb'
|
6
7
|
require_relative 'parser/expression.rb'
|
7
8
|
require_relative 'parser/filter.rb'
|
@@ -21,7 +22,7 @@ module Opulent
|
|
21
22
|
#
|
22
23
|
# [:node_type, :value, :attributes, :children, :indent]
|
23
24
|
#
|
24
|
-
def initialize(file)
|
25
|
+
def initialize(file, definitions)
|
25
26
|
# Convention accessors
|
26
27
|
@type = 0
|
27
28
|
@value = 1
|
@@ -34,7 +35,7 @@ module Opulent
|
|
34
35
|
@dir = File.dirname @file
|
35
36
|
|
36
37
|
# Initialize definitions for the parser
|
37
|
-
@definitions =
|
38
|
+
@definitions = definitions
|
38
39
|
end
|
39
40
|
|
40
41
|
# Initialize the parsing process by splitting the code into lines and
|
@@ -57,6 +58,8 @@ module Opulent
|
|
57
58
|
# Get all nodes starting from the root element and return output
|
58
59
|
# nodes and definitions
|
59
60
|
root @root
|
61
|
+
|
62
|
+
return @root, @definitions
|
60
63
|
end
|
61
64
|
|
62
65
|
# Check and accept or reject a given token as long as we have tokens
|
@@ -17,7 +17,14 @@ module Opulent
|
|
17
17
|
# create a new comment element. Otherwise, we ignore the current
|
18
18
|
# gathered text and we simply begin the root parsing again
|
19
19
|
if buffer[0] == '!'
|
20
|
-
|
20
|
+
offset = 1; options = {}
|
21
|
+
|
22
|
+
# Allow leading comment newline
|
23
|
+
if buffer[1] == '^'
|
24
|
+
offset = 2; options[:newline] = true
|
25
|
+
end
|
26
|
+
|
27
|
+
parent[@children] << [:comment, buffer[offset..-1].strip, options, nil, indent]
|
21
28
|
end
|
22
29
|
|
23
30
|
return parent
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# @Opulent
|
2
|
+
module Opulent
|
3
|
+
# @Parser
|
4
|
+
class Parser
|
5
|
+
# Match one line or multiline comments
|
6
|
+
#
|
7
|
+
def doctype(parent, indent)
|
8
|
+
if (accept :doctype)
|
9
|
+
buffer = accept(:line_feed)
|
10
|
+
|
11
|
+
parent[@children] << [:doctype, buffer.strip.to_sym, {}, nil, indent]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
data/lib/opulent/parser/node.rb
CHANGED
@@ -78,8 +78,11 @@ module Opulent
|
|
78
78
|
error :self_enclosing_children, line
|
79
79
|
end
|
80
80
|
|
81
|
+
# Create a clone of the definition model. Cloning the options is also
|
82
|
+
# necessary because it's a shallow copy
|
81
83
|
if @definitions.keys.include? node_name
|
82
84
|
model = @definitions[node_name].clone
|
85
|
+
model[@options] = {}.merge model[@options]
|
83
86
|
model[@options][:call] = current_node
|
84
87
|
|
85
88
|
parent[@children] << model
|
data/lib/opulent/parser/root.rb
CHANGED
@@ -37,7 +37,8 @@ module Opulent
|
|
37
37
|
filter(parent, indent) ||
|
38
38
|
block_yield(parent, indent) ||
|
39
39
|
block(parent, indent) ||
|
40
|
-
require_file(parent, indent)
|
40
|
+
require_file(parent, indent)||
|
41
|
+
doctype(parent, indent)
|
41
42
|
|
42
43
|
# Throw an error if we couldn't find a valid node
|
43
44
|
error :unknown_node_type unless current_node
|
data/lib/opulent/tokens.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
module Opulent
|
2
2
|
# Opulent Keywords
|
3
|
-
Keywords = %i(def block yield require if else elsif unless case when each while until)
|
3
|
+
Keywords = %i(def block yield require if else elsif unless case when each while until doctype)
|
4
4
|
|
5
5
|
# @Tokens
|
6
6
|
class Tokens
|
@@ -29,6 +29,9 @@ module Opulent
|
|
29
29
|
# Definition
|
30
30
|
def: /\Adef +/,
|
31
31
|
|
32
|
+
# Definition
|
33
|
+
doctype: /\Adoctype +/,
|
34
|
+
|
32
35
|
# Require file
|
33
36
|
require: /\Arequire +/,
|
34
37
|
|
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.1.
|
4
|
+
version: 1.1.5
|
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-07-
|
11
|
+
date: 2015-07-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -143,6 +143,7 @@ files:
|
|
143
143
|
- lib/opulent/compiler/comment.rb
|
144
144
|
- lib/opulent/compiler/control.rb
|
145
145
|
- lib/opulent/compiler/define.rb
|
146
|
+
- lib/opulent/compiler/doctype.rb
|
146
147
|
- lib/opulent/compiler/eval.rb
|
147
148
|
- lib/opulent/compiler/filter.rb
|
148
149
|
- lib/opulent/compiler/node.rb
|
@@ -158,6 +159,7 @@ files:
|
|
158
159
|
- lib/opulent/parser/comment.rb
|
159
160
|
- lib/opulent/parser/control.rb
|
160
161
|
- lib/opulent/parser/define.rb
|
162
|
+
- lib/opulent/parser/doctype.rb
|
161
163
|
- lib/opulent/parser/eval.rb
|
162
164
|
- lib/opulent/parser/expression.rb
|
163
165
|
- lib/opulent/parser/filter.rb
|
@@ -190,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
190
192
|
version: '0'
|
191
193
|
requirements: []
|
192
194
|
rubyforge_project:
|
193
|
-
rubygems_version: 2.4.
|
195
|
+
rubygems_version: 2.4.6
|
194
196
|
signing_key:
|
195
197
|
specification_version: 4
|
196
198
|
summary: Intelligent Templating Engine for Creative Web Developers.
|