opulent 1.0.3 → 1.0.4
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 +2 -11
- data/lib/opulent/context.rb +3 -3
- data/lib/opulent/engine.rb +5 -5
- data/lib/opulent/parser.rb +28 -5
- data/lib/opulent/parser/require.rb +31 -5
- data/lib/opulent/version.rb +1 -1
- metadata +1 -2
- data/lib/opulent/compiler/require.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e02913ca7a92447940158c0b4ff5dee49a28c32c
|
4
|
+
data.tar.gz: 97be181ec7177499387884db7dee3acaa644f7c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2fea0f9dc244784ccd505f290c53c6c1b22518c280f010be00d589ebcb496422f50f680e4085f708622929bbd0fd297e1612bc5ff6726cce9ba60c12d7bf071
|
7
|
+
data.tar.gz: 2112d92298f2752e573d15633594f1425ae9bf718658b1d66759d9602a0e05d37d18a04830c13abf6a491ca348a4d9eff56a95609cac6da474fc65978bedc6af
|
data/lib/opulent/compiler.rb
CHANGED
@@ -5,7 +5,6 @@ require_relative 'compiler/define.rb'
|
|
5
5
|
require_relative 'compiler/eval.rb'
|
6
6
|
require_relative 'compiler/filter.rb'
|
7
7
|
require_relative 'compiler/node.rb'
|
8
|
-
require_relative 'compiler/require.rb'
|
9
8
|
require_relative 'compiler/root.rb'
|
10
9
|
require_relative 'compiler/text.rb'
|
11
10
|
|
@@ -22,7 +21,7 @@ module Opulent
|
|
22
21
|
#
|
23
22
|
# @param path [String] Current file path needed for require nodes
|
24
23
|
#
|
25
|
-
def initialize
|
24
|
+
def initialize
|
26
25
|
# Setup convention accessors
|
27
26
|
@type = 0
|
28
27
|
@value = 1
|
@@ -30,12 +29,6 @@ module Opulent
|
|
30
29
|
@children = 3
|
31
30
|
@indent = 4
|
32
31
|
|
33
|
-
# Set current compiled file
|
34
|
-
@path = File.dirname settings.delete :path
|
35
|
-
|
36
|
-
# Extract definitions for require directives
|
37
|
-
@definitions = settings.delete :definitions
|
38
|
-
|
39
32
|
# Create the HTML Entities encoder/decoder
|
40
33
|
@entities = HTMLEntities.new
|
41
34
|
|
@@ -99,7 +92,7 @@ module Opulent
|
|
99
92
|
# @param text [String] Input text to be indented
|
100
93
|
# @param indent [String] Indentation string to be appended
|
101
94
|
#
|
102
|
-
def indent_lines
|
95
|
+
def indent_lines(text, indent)
|
103
96
|
text ||= ""
|
104
97
|
text.lines.inject("") do |result, line|
|
105
98
|
result += indent + line
|
@@ -130,8 +123,6 @@ module Opulent
|
|
130
123
|
"The \"#{data[0]}\" filter could not be recognized by Opulent."
|
131
124
|
when :filter_load
|
132
125
|
"The gem required for the \"#{data[0]}\" filter is not installed. You can install it by running:\n\n#{data[1]}"
|
133
|
-
when :require
|
134
|
-
"The required file #{data[0]} does not exist or an incorrect path has been specified."
|
135
126
|
end
|
136
127
|
|
137
128
|
# Reconstruct lines to display where errors occur
|
data/lib/opulent/context.rb
CHANGED
@@ -15,10 +15,10 @@ module Opulent
|
|
15
15
|
# @param locals [Hash] Binding extension
|
16
16
|
# @param bind [Binding] Call environment binding
|
17
17
|
#
|
18
|
-
def initialize(locals = {},
|
19
|
-
@block = block
|
18
|
+
def initialize(locals = {}, &block)
|
19
|
+
@block = block
|
20
20
|
@binding = if @block
|
21
|
-
|
21
|
+
@block.binding.clone
|
22
22
|
else
|
23
23
|
Binding.new
|
24
24
|
end
|
data/lib/opulent/engine.rb
CHANGED
@@ -8,7 +8,7 @@ module Opulent
|
|
8
8
|
|
9
9
|
# @Engine
|
10
10
|
class Engine
|
11
|
-
attr_reader :nodes, :preamble, :buffer
|
11
|
+
attr_reader :nodes, :definitions, :parser, :file, :preamble, :buffer
|
12
12
|
|
13
13
|
# Update render settings
|
14
14
|
#
|
@@ -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 = settings
|
20
|
+
@definitions = settings[:definitions] || {}
|
21
21
|
@overwrite = settings.delete :overwrite
|
22
22
|
|
23
23
|
Settings.update_settings settings unless settings.empty?
|
@@ -48,17 +48,17 @@ module Opulent
|
|
48
48
|
@code = read input
|
49
49
|
|
50
50
|
# Get the nodes tree
|
51
|
-
@nodes
|
51
|
+
@nodes = Parser.new(@file).parse @code
|
52
52
|
|
53
53
|
# @TODO
|
54
54
|
# Implement precompiled template handling
|
55
55
|
@preamble = @nodes.inspect.inspect
|
56
56
|
|
57
57
|
# Create a new context based on our rendering environment
|
58
|
-
@context = Context.new locals,
|
58
|
+
@context = Context.new locals, &block
|
59
59
|
|
60
60
|
# Compile our syntax tree using input context
|
61
|
-
@output = Compiler.new
|
61
|
+
@output = Compiler.new.compile @nodes, @context
|
62
62
|
|
63
63
|
# puts "Nodes\n---\n"
|
64
64
|
# pp @nodes
|
data/lib/opulent/parser.rb
CHANGED
@@ -21,7 +21,7 @@ module Opulent
|
|
21
21
|
#
|
22
22
|
# [:node_type, :value, :attributes, :children, :indent]
|
23
23
|
#
|
24
|
-
def initialize(
|
24
|
+
def initialize(file)
|
25
25
|
# Convention accessors
|
26
26
|
@type = 0
|
27
27
|
@value = 1
|
@@ -29,8 +29,12 @@ module Opulent
|
|
29
29
|
@children = 3
|
30
30
|
@indent = 4
|
31
31
|
|
32
|
-
#
|
33
|
-
@
|
32
|
+
# Set current compiled file
|
33
|
+
@file = file
|
34
|
+
@dir = File.dirname @file
|
35
|
+
|
36
|
+
# Initialize definitions for the parser
|
37
|
+
@definitions = {}
|
34
38
|
end
|
35
39
|
|
36
40
|
# Initialize the parsing process by splitting the code into lines and
|
@@ -52,7 +56,7 @@ module Opulent
|
|
52
56
|
|
53
57
|
# Get all nodes starting from the root element and return output
|
54
58
|
# nodes and definitions
|
55
|
-
|
59
|
+
root @root
|
56
60
|
end
|
57
61
|
|
58
62
|
# Check and accept or reject a given token as long as we have tokens
|
@@ -137,6 +141,18 @@ module Opulent
|
|
137
141
|
end
|
138
142
|
end
|
139
143
|
|
144
|
+
# Indent all lines of the input text using give indentation
|
145
|
+
#
|
146
|
+
# @param text [String] Input text to be indented
|
147
|
+
# @param indent [String] Indentation string to be appended
|
148
|
+
#
|
149
|
+
def indent_lines(text, indent)
|
150
|
+
text ||= ""
|
151
|
+
text.lines.inject("") do |result, line|
|
152
|
+
result += indent + line
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
140
156
|
# Give an explicit error report where an unexpected sequence of tokens
|
141
157
|
# appears and give indications on how to solve it
|
142
158
|
#
|
@@ -148,7 +164,7 @@ module Opulent
|
|
148
164
|
"An unknown node type has been encountered at:\n\n#{Logger.red @line}"
|
149
165
|
when :expected
|
150
166
|
data[0] = "#{Tokens.bracket data[0]}" if [:'(', :'{', :'[', :'<'].include? data[0]
|
151
|
-
"Expected to find a :#{data[0]} token at: \n\n#{@line[0..@offset-1]}#{Logger.red @line[@offset..-1].rstrip}"
|
167
|
+
"Expected to find a :#{data[0]} token on line #{@i+1} of input at: \n\n#{@line[0..@offset-1]}#{Logger.red @line[@offset..-1].rstrip}"
|
152
168
|
when :root
|
153
169
|
"Unknown node type encountered on line #{@i+1} of input at:\n\n" +
|
154
170
|
"#{@line[0..@offset-1]}#{Logger.red @line[@offset..-1].rstrip}"
|
@@ -186,6 +202,13 @@ module Opulent
|
|
186
202
|
when :self_enclosing_children
|
187
203
|
"Unexpected child elements found for self enclosing node on line #{data[0]+1} of input at:\n\n" +
|
188
204
|
"#{@code[data[0]]}#{Logger.red @code[data[0] + 1]}"
|
205
|
+
when :require
|
206
|
+
"The required file #{data[0]} does not exist or an incorrect path has been specified."
|
207
|
+
when :require_dir
|
208
|
+
"The required file path #{data[0]} is a directory."
|
209
|
+
when :require_end
|
210
|
+
"Unexpected content found after require on line #{@i+1} of input at:\n\n" +
|
211
|
+
"#{@line[0..@offset-1]}#{Logger.red @line[@offset..-1].rstrip}"
|
189
212
|
else
|
190
213
|
"#{@line[0..@offset-1]}#{Logger.red @line[@offset..-1].rstrip}"
|
191
214
|
end
|
@@ -15,14 +15,40 @@ module Opulent
|
|
15
15
|
#
|
16
16
|
def require_file(parent, indent)
|
17
17
|
if(match = accept :require)
|
18
|
+
|
18
19
|
# Process data
|
19
|
-
name = accept
|
20
|
+
name = accept :exp_string, :*
|
21
|
+
|
22
|
+
# Check if there is any string after the require input
|
23
|
+
unless (feed = accept(:line_feed) || "").strip.empty?
|
24
|
+
undo feed; error :require_end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Get the complete file path based on the current file being compiled
|
28
|
+
require_path = File.expand_path name[1..-2], @dir
|
29
|
+
|
30
|
+
# Throw an error if the file doesn't exist
|
31
|
+
error :require, name unless Dir[require_path].any?
|
32
|
+
|
33
|
+
# Require entire directory tree
|
34
|
+
Dir[require_path].each do |file|
|
35
|
+
# Skip current file when including from same directory
|
36
|
+
next if file == @file
|
37
|
+
|
38
|
+
# Throw an error if the file doesn't exist
|
39
|
+
error :require_dir, file if File.directory? file
|
40
|
+
|
41
|
+
# Throw an error if the file doesn't exist
|
42
|
+
error :require, file unless File.file? file
|
43
|
+
|
44
|
+
# Indent all lines and prepare them for the parser
|
45
|
+
lines = indent_lines File.read(file), " " * indent
|
20
46
|
|
21
|
-
|
22
|
-
|
47
|
+
# Indent all the output lines with the current indentation
|
48
|
+
@code.insert @i+1, *lines.lines
|
49
|
+
end
|
23
50
|
|
24
|
-
|
25
|
-
parent[@children] << require_node
|
51
|
+
return true
|
26
52
|
end
|
27
53
|
end
|
28
54
|
end
|
data/lib/opulent/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opulent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex Grozav
|
@@ -147,7 +147,6 @@ files:
|
|
147
147
|
- lib/opulent/compiler/eval.rb
|
148
148
|
- lib/opulent/compiler/filter.rb
|
149
149
|
- lib/opulent/compiler/node.rb
|
150
|
-
- lib/opulent/compiler/require.rb
|
151
150
|
- lib/opulent/compiler/root.rb
|
152
151
|
- lib/opulent/compiler/text.rb
|
153
152
|
- lib/opulent/context.rb
|
@@ -1,24 +0,0 @@
|
|
1
|
-
# @Opulent
|
2
|
-
module Opulent
|
3
|
-
# @Compiler
|
4
|
-
class Compiler
|
5
|
-
# Compile a new Opulent file using the current page context data
|
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 require_node(node, indent, context)
|
12
|
-
require_file = File.expand_path context.evaluate(node[@value]), @path
|
13
|
-
error :require, node[@value] unless File.file? require_file
|
14
|
-
|
15
|
-
data = {
|
16
|
-
definitions: @definitions,
|
17
|
-
overwrite: true
|
18
|
-
}
|
19
|
-
rendered = Engine.new(data).render_file require_file, &context.block
|
20
|
-
|
21
|
-
@code += indent_lines rendered, " " * indent
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|