opulent 1.3.3 → 1.4.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/README.md +2 -9
- data/docs/attributes.md +1 -1
- data/docs/comments.md +22 -0
- data/docs/doctype.md +42 -0
- data/docs/expressions.md +38 -0
- data/docs/nodes.md +33 -0
- data/docs/reference.md +4 -2
- data/docs/usage.md +28 -1
- data/lib/opulent/compiler/define.rb +5 -1
- data/lib/opulent/context.rb +1 -1
- data/lib/opulent/parser/define.rb +6 -0
- data/lib/opulent/parser/node.rb +25 -6
- data/lib/opulent/settings.rb +3 -4
- data/lib/opulent/version.rb +1 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44c953a9be6c659e56a0c33bc41637d7e1e0730d
|
4
|
+
data.tar.gz: 260dd8c631ab34debe0748cc53a27024988246b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 59e7c5c79cca92558ca68f2ab5be229bdd2815e4cb5a488465d3e0d391e548626905e1398327ebdc52746fb70cf688705ef7d6eaf2b696b40f2e717b3f795140
|
7
|
+
data.tar.gz: 5d0a8ad12ca13ba645417a1f73b0bfbb46f96b57db9d509976c777a5761feae6dcbfec48fee944c79f8063813116ca5d9d5e7ce08d59a72f912ab29a54dc8ccd
|
data/README.md
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
Opulent is an __Intelligent Web Templating Engine__ created for extremely fast and efficient Web Development. Based on the idea of lightweight and reusable __Web Components__, Opulent greatly increases your development speed for any project.
|
4
4
|
|
5
|
+
[Read the Documentation](docs/reference.md)
|
6
|
+
|
5
7
|
## Syntax
|
6
8
|
|
7
9
|
Opulent has a beautiful, minimalistic syntax: no tags, indentation based, optional brackets, inline text, inline children and in page definitions.
|
@@ -75,15 +77,6 @@ require 'opulent'
|
|
75
77
|
Opulent.new.render_file :index
|
76
78
|
```
|
77
79
|
|
78
|
-
For layouts you can simply use the following code. By default, the layout is set to __layouts/application__.
|
79
|
-
|
80
|
-
```ruby
|
81
|
-
require 'opulent'
|
82
|
-
|
83
|
-
opulent = Opulent.new layouts: true
|
84
|
-
opulent.render_file :index, layout: :'path/layout'
|
85
|
-
```
|
86
|
-
|
87
80
|
<!--
|
88
81
|
## Development
|
89
82
|
|
data/docs/attributes.md
CHANGED
@@ -131,7 +131,7 @@ div unescaped=~"<div></div>"
|
|
131
131
|
Unescaped buffered code can be dangerous. You must be sure to sanitize any user inputs to avoid cross-site scripting.
|
132
132
|
|
133
133
|
### Extending Attributes
|
134
|
-
Attributes can be extended using a '__+__' symbol, followed by an expression which
|
134
|
+
Attributes can be extended using a '__+__' symbol, followed by an expression which provides Hash.
|
135
135
|
|
136
136
|
__Example__
|
137
137
|
```html
|
data/docs/comments.md
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# Opulent Comments
|
2
|
+
|
3
|
+
Single line comments are marked up with a forward slash character `/`.
|
4
|
+
|
5
|
+
```sass
|
6
|
+
/ This is a comment
|
7
|
+
```
|
8
|
+
|
9
|
+
## Block Comments
|
10
|
+
Block comments are marked up with two forward slash characters `//`.
|
11
|
+
|
12
|
+
```sass
|
13
|
+
// This is a block comment.
|
14
|
+
It is on multiple lines.
|
15
|
+
```
|
16
|
+
|
17
|
+
## Output Comments
|
18
|
+
By default, comments are only for reference inside Opulent files. You can output them
|
19
|
+
by adding an exclamation character `!`, to resemble HTML.
|
20
|
+
```html
|
21
|
+
/! This comment will be outputted
|
22
|
+
```
|
data/docs/doctype.md
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Opulent Expressions
|
2
|
+
|
3
|
+
```html
|
4
|
+
doctype html
|
5
|
+
<!DOCTYPE html>
|
6
|
+
```
|
7
|
+
|
8
|
+
## Doctype Shortcuts
|
9
|
+
```html
|
10
|
+
doctype xml
|
11
|
+
<?xml version="1.0" encoding="utf-8" ?>
|
12
|
+
```
|
13
|
+
```html
|
14
|
+
doctype transitional
|
15
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
16
|
+
```
|
17
|
+
```html
|
18
|
+
doctype strict
|
19
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
20
|
+
```
|
21
|
+
```html
|
22
|
+
doctype frameset
|
23
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">
|
24
|
+
```
|
25
|
+
```html
|
26
|
+
doctype 1.1
|
27
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
28
|
+
```
|
29
|
+
```html
|
30
|
+
doctype basic
|
31
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN" "http://www.w3.org/TR/xhtml-basic/xhtml-basic11.dtd">
|
32
|
+
```
|
33
|
+
```html
|
34
|
+
doctype mobile
|
35
|
+
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.2//EN" "http://www.openmobilealliance.org/tech/DTD/xhtml-mobile12.dtd">
|
36
|
+
```
|
37
|
+
|
38
|
+
## Custom Doctypes
|
39
|
+
```html
|
40
|
+
doctype html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN"
|
41
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML Basic 1.1//EN">
|
42
|
+
```
|
data/docs/expressions.md
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# Opulent Expressions
|
2
|
+
|
3
|
+
Opulent makes it possible to write inline Ruby code in your templates. There are a few types of code.
|
4
|
+
|
5
|
+
##Unbuffered Code
|
6
|
+
Unbuffered code starts with `-` (single line) or `+` (multi line) and does not provide an output directly.
|
7
|
+
|
8
|
+
```sass
|
9
|
+
- a = 1 + 2 + 3
|
10
|
+
|
11
|
+
+ if a == 6
|
12
|
+
a = 3
|
13
|
+
end
|
14
|
+
```
|
15
|
+
|
16
|
+
## Buffered Code
|
17
|
+
Buffered code starts with `=` and it outputs the Ruby expression as plain text. For safety reasons, it will be escaped by default.
|
18
|
+
|
19
|
+
```sass
|
20
|
+
p = "this is " + "an <escaped> ruby expression"
|
21
|
+
```
|
22
|
+
|
23
|
+
```html
|
24
|
+
<p>
|
25
|
+
this is an <escaped> ruby expression
|
26
|
+
</p>
|
27
|
+
```
|
28
|
+
|
29
|
+
## Unuffered Code
|
30
|
+
Whenever we want to unescape an output in Opulent, we use the tilde character `~` to do so.
|
31
|
+
|
32
|
+
```sass
|
33
|
+
p =~ "this is " + "an <escaped> ruby expression"
|
34
|
+
```
|
35
|
+
|
36
|
+
```html
|
37
|
+
<p>this is an <escaped> ruby expression</p>
|
38
|
+
```
|
data/docs/nodes.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# Opulent Nodes
|
2
|
+
|
3
|
+
Opulent has several node features which can be used within your views.
|
4
|
+
|
5
|
+
## Syntax
|
6
|
+
By default, every identifier can be a node, except the few keywords that Opulent uses for itself (e.g. def, yield, if, else, etc.).
|
7
|
+
```sass
|
8
|
+
node-name
|
9
|
+
```
|
10
|
+
Will render as:
|
11
|
+
```html
|
12
|
+
<node-name></node-name>
|
13
|
+
```
|
14
|
+
|
15
|
+
The following will render the same output:
|
16
|
+
```sass
|
17
|
+
div class="myclass"
|
18
|
+
div.myclass
|
19
|
+
.myclass
|
20
|
+
.("myclass")
|
21
|
+
."myclass"
|
22
|
+
```
|
23
|
+
```html
|
24
|
+
<div class="myclass"></div>
|
25
|
+
```
|
26
|
+
|
27
|
+
## Inline Child Nodes
|
28
|
+
Nodes such as text can be written inline without any identifier. However, when we want to have child nodes written inline we use the `>` character.
|
29
|
+
|
30
|
+
```sass
|
31
|
+
ul
|
32
|
+
li > a href="http://google.com" Google
|
33
|
+
```
|
data/docs/reference.md
CHANGED
@@ -5,5 +5,7 @@ Opulent is an __Intelligent Web Templating Engine__ created for extremely fast a
|
|
5
5
|
|
6
6
|
1. [Attributes](attributes.md)
|
7
7
|
2. [Control Structures](control-structures.md)
|
8
|
-
3. [Expressions](
|
9
|
-
4. [Comments](
|
8
|
+
3. [Expressions](expressions.md)
|
9
|
+
4. [Comments](comments.md)
|
10
|
+
5. [Doctype](doctype.md)
|
11
|
+
5. [Nodes](nodes.md)
|
data/docs/usage.md
CHANGED
@@ -1,3 +1,30 @@
|
|
1
1
|
# Opulent Usage
|
2
2
|
|
3
|
-
|
3
|
+
Opulent can be used to render a file by providing a symbol with the name of the file or to render code by providing a string input.
|
4
|
+
|
5
|
+
```ruby
|
6
|
+
require 'opulent'
|
7
|
+
|
8
|
+
Opulent.new.render_file :index
|
9
|
+
```
|
10
|
+
|
11
|
+
Opulent comes with a built in layout system. So if you're not using any web development framework, you'll really appreciate that.
|
12
|
+
For layouts you can simply use the following code. By default, the layout is set to __layouts/application__.
|
13
|
+
|
14
|
+
```ruby
|
15
|
+
require 'opulent'
|
16
|
+
|
17
|
+
opulent = Opulent.new layouts: true
|
18
|
+
opulent.render_file :index, layout: :'path/to/layout'
|
19
|
+
```
|
20
|
+
|
21
|
+
Here is a list of options you can use with opulent at the moment together with their default values.
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
options = {
|
25
|
+
indent: 2,
|
26
|
+
layouts: false,
|
27
|
+
default_layout: :'views/layouts/application'
|
28
|
+
}
|
29
|
+
opulent = Opulent.new options
|
30
|
+
```
|
@@ -10,7 +10,11 @@ module Opulent
|
|
10
10
|
#
|
11
11
|
def def_node(node, indent, context)
|
12
12
|
# Create a new definition context
|
13
|
-
|
13
|
+
#
|
14
|
+
# @update: Added &context.block to make sure yield can be called from
|
15
|
+
# within a definition (it might be a nice feature)
|
16
|
+
#
|
17
|
+
definition_context = Context.new &context.block
|
14
18
|
definition_context.extend_nonlocals context.binding
|
15
19
|
definition_context.name = node[@value]
|
16
20
|
definition_context.parent = context
|
data/lib/opulent/context.rb
CHANGED
@@ -16,7 +16,7 @@ module Opulent
|
|
16
16
|
# @param block [Binding] Call environment block
|
17
17
|
# @param content [Binding] Content yielding
|
18
18
|
#
|
19
|
-
def initialize(locals = {}, block, &content)
|
19
|
+
def initialize(locals = {}, block = nil, &content)
|
20
20
|
@content = content
|
21
21
|
|
22
22
|
@block = block
|
@@ -20,7 +20,13 @@ module Opulent
|
|
20
20
|
|
21
21
|
# Create node
|
22
22
|
definition = [:def, name, {parameters: attributes}, [], indent]
|
23
|
+
|
24
|
+
# Set definition as root node and let the parser know that we're inside
|
25
|
+
# a definition. This is used because inside definitions we do not process
|
26
|
+
# nodes (we do not check if they are have a definition or not).
|
27
|
+
@inside_definition = true
|
23
28
|
root(definition, indent)
|
29
|
+
@inside_definition = false
|
24
30
|
|
25
31
|
# Add to parent
|
26
32
|
@definitions[name] = definition
|
data/lib/opulent/parser/node.rb
CHANGED
@@ -80,18 +80,37 @@ module Opulent
|
|
80
80
|
|
81
81
|
# Create a clone of the definition model. Cloning the options is also
|
82
82
|
# necessary because it's a shallow copy
|
83
|
-
if @definitions.keys.include?
|
84
|
-
|
85
|
-
model[@options] = {}.merge model[@options]
|
86
|
-
model[@options][:call] = current_node
|
87
|
-
|
88
|
-
parent[@children] << model
|
83
|
+
if !@inside_definition && @definitions.keys.include?(node_name)
|
84
|
+
parent[@children] << process_definition(node_name, current_node)
|
89
85
|
else
|
90
86
|
parent[@children] << current_node
|
91
87
|
end
|
92
88
|
end
|
93
89
|
end
|
94
90
|
|
91
|
+
# When entering a definition model, we replace all the node types with their
|
92
|
+
# know definitions at definition call time.
|
93
|
+
#
|
94
|
+
# @param node_name [Symbol] Node identifier
|
95
|
+
# @param call_context [Node] Initial node call with its attributes
|
96
|
+
#
|
97
|
+
def process_definition(node_name, call_context)
|
98
|
+
model = @definitions[node_name].clone
|
99
|
+
model[@options] = {}.merge model[@options]
|
100
|
+
model[@options][:call] = call_context
|
101
|
+
|
102
|
+
# Recursively map each child node with its definition
|
103
|
+
model[@children].map! do |child|
|
104
|
+
if @definitions.keys.include? child[@value]
|
105
|
+
process_definition child[@value], child
|
106
|
+
else
|
107
|
+
child
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
return model
|
112
|
+
end
|
113
|
+
|
95
114
|
# Helper method to create an array of values when an attribute is set
|
96
115
|
# multiple times. This happens unless the key is id, which is unique
|
97
116
|
#
|
data/lib/opulent/settings.rb
CHANGED
@@ -41,12 +41,11 @@ module Opulent
|
|
41
41
|
class << self
|
42
42
|
# Opulent runtime options
|
43
43
|
Defaults = {
|
44
|
-
pretty: true,
|
44
|
+
#pretty: true, # At the moment, code cannot be uglified
|
45
|
+
#dependency_manager: true, # Soon to be implemented
|
45
46
|
indent: 2,
|
46
|
-
dependency_manager: true,
|
47
|
-
invert_escaping: true,
|
48
47
|
layouts: false,
|
49
|
-
default_layout: :'layouts/application'
|
48
|
+
default_layout: :'views/layouts/application'
|
50
49
|
}
|
51
50
|
|
52
51
|
# Set defaults as initial options
|
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
|
+
version: 1.4.0
|
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-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -136,7 +136,11 @@ files:
|
|
136
136
|
- benchmark/cases/node/node.slim
|
137
137
|
- bin/opulent
|
138
138
|
- docs/attributes.md
|
139
|
+
- docs/comments.md
|
139
140
|
- docs/control-structures.md
|
141
|
+
- docs/doctype.md
|
142
|
+
- docs/expressions.md
|
143
|
+
- docs/nodes.md
|
140
144
|
- docs/reference.md
|
141
145
|
- docs/usage.md
|
142
146
|
- lib/opulent.rb
|