glimmer-dsl-xml 1.0.0 → 1.3.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/CHANGELOG.md +20 -0
- data/README.md +78 -30
- data/VERSION +1 -1
- data/lib/glimmer/dsl/xml/dsl.rb +2 -2
- data/lib/glimmer/dsl/xml/html_expression.rb +2 -6
- data/lib/glimmer/dsl/xml/name_space_expression.rb +13 -6
- data/lib/glimmer/dsl/xml/node_parent_expression.rb +5 -5
- data/lib/glimmer/dsl/xml/xml_expression.rb +4 -6
- data/lib/glimmer/dsl/xml/xml_node_expression.rb +42 -0
- data/lib/glimmer/xml/html_node.rb +39 -0
- data/lib/glimmer/xml/html_visitor.rb +61 -0
- data/lib/glimmer/xml/node.rb +11 -7
- data/lib/glimmer/xml/xml_visitor.rb +5 -1
- data/lib/glimmer-dsl-xml.rb +4 -3
- metadata +28 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b7531b79c996e380ee9e921e33240bb043db4e5e194f6cd2d3582fd45f6a316e
|
4
|
+
data.tar.gz: b65de2fe406335a7ea4190943cce76736867f4e74507d42d938ab754a8ccbfd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f5182930e5e4067e91affa54be7353de536a22bc7619ffda01951231f8d4b4bebeedc7c1293966889704e924384cab16bd1443ddb6ebc257e5f108398cc79f5
|
7
|
+
data.tar.gz: 5b3c56a03f721ec475ad45ab0ef0321a8626c3e8efe6b6ce207dcaab35b3ce63a64db040bf837f45749f33c7f19a2511f6d977f325fde9b84112e0b16f78bbb7
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,25 @@
|
|
1
1
|
# Change Log
|
2
2
|
|
3
|
+
## 1.3.0
|
4
|
+
|
5
|
+
- Upgrade to Glimmer 2.4.1 (automatically gets rid of `invalid log level:` output without needing v1.2.1's fix)
|
6
|
+
|
7
|
+
## 1.2.1
|
8
|
+
|
9
|
+
- Get rid of `invalid log level:` output by setting `GLIMMER_LOGGER_LEVEL` env var before requiring `glimmer`
|
10
|
+
|
11
|
+
## 1.2.0
|
12
|
+
|
13
|
+
- Upgraded to Glimmer 2
|
14
|
+
|
15
|
+
## 1.1.0
|
16
|
+
|
17
|
+
- Support `xml` keyword to produce partial xml/html without the html tag in output
|
18
|
+
- Update `html` keyword to add a doctype (`<!DOCTYPE html>`) at the top of rendered content
|
19
|
+
- Make `html` keyword automatically not include a doctype or html tag if content does not have HEAD or BODY
|
20
|
+
- Make name_space act like an alternative to `xml` keyword, not requiring `xml` or `html` underneath
|
21
|
+
- Upgraded to glimmer 1.0.1
|
22
|
+
|
3
23
|
## 1.0.0
|
4
24
|
|
5
25
|
- Upgraded to Glimmer 1.0.0
|
data/README.md
CHANGED
@@ -1,17 +1,19 @@
|
|
1
|
-
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for XML 1.
|
1
|
+
# [<img src="https://raw.githubusercontent.com/AndyObtiva/glimmer/master/images/glimmer-logo-hi-res.png" height=85 />](https://github.com/AndyObtiva/glimmer) Glimmer DSL for XML & HTML 1.3.0
|
2
2
|
[](http://badge.fury.io/rb/glimmer-dsl-xml)
|
3
3
|
[](https://travis-ci.com/github/AndyObtiva/glimmer-dsl-xml)
|
4
4
|
[](https://coveralls.io/github/AndyObtiva/glimmer-dsl-xml?branch=master)
|
5
5
|
[](https://codeclimate.com/github/AndyObtiva/glimmer-dsl-xml/maintainability)
|
6
6
|
[](https://gitter.im/AndyObtiva/glimmer?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
7
7
|
|
8
|
-
[Glimmer](https://github.com/AndyObtiva/glimmer) DSL for XML provides Ruby syntax for building XML (eXtensible Markup Language) documents.
|
8
|
+
[Glimmer](https://github.com/AndyObtiva/glimmer) DSL for XML provides Ruby syntax for building XML (eXtensible Markup Language) and HTML documents.
|
9
9
|
|
10
10
|
Within the context of desktop development, Glimmer DSL for XML is useful in providing XML data for the [SWT Browser widget](https://github.com/AndyObtiva/glimmer-dsl-swt/tree/master#browser-widget).
|
11
11
|
|
12
12
|
Other [Glimmer](https://github.com/AndyObtiva/glimmer) DSL gems:
|
13
|
-
- [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (JRuby Desktop GUI)
|
14
|
-
- [glimmer-dsl-tk](https://github.com/AndyObtiva/glimmer-dsl-tk): Glimmer DSL for Tk (Ruby Desktop GUI)
|
13
|
+
- [glimmer-dsl-swt](https://github.com/AndyObtiva/glimmer-dsl-swt): Glimmer DSL for SWT (JRuby Desktop Development GUI Library)
|
14
|
+
- [glimmer-dsl-tk](https://github.com/AndyObtiva/glimmer-dsl-tk): Glimmer DSL for Tk (Ruby Desktop Development GUI Library)
|
15
|
+
- [glimmer-dsl-libui](https://github.com/AndyObtiva/glimmer-dsl-libui): Glimmer DSL for LibUI (Prerequisite-Free Ruby Desktop Development GUI Library)
|
16
|
+
- [glimmer-dsl-gtk](https://github.com/AndyObtiva/glimmer-dsl-gtk): Glimmer DSL for GTK (Ruby-GNOME Desktop Development GUI Library)
|
15
17
|
- [glimmer-dsl-opal](https://github.com/AndyObtiva/glimmer-dsl-opal): Glimmer DSL for Opal (Web GUI Adapter for Desktop Apps)
|
16
18
|
- [glimmer-dsl-css](https://github.com/AndyObtiva/glimmer-dsl-css): Glimmer DSL for CSS (Cascading Style Sheets)
|
17
19
|
|
@@ -23,12 +25,10 @@ Please follow these instructions to make the `glimmer` command available on your
|
|
23
25
|
|
24
26
|
Run this command to install directly:
|
25
27
|
```
|
26
|
-
|
28
|
+
gem install glimmer-dsl-xml -v 1.3.0
|
27
29
|
```
|
28
30
|
|
29
|
-
`jgem` is JRuby's version of `gem` command.
|
30
|
-
RVM allows running `gem` as an alias.
|
31
|
-
Otherwise, you may also run `jruby -S gem install ...`
|
31
|
+
Note: When using JRuby, `jgem` is JRuby's version of `gem` command. RVM allows running `gem` as an alias in JRuby. Otherwise, you may also run `jruby -S gem install ...`
|
32
32
|
|
33
33
|
Add `require 'glimmer-dsl-xml'` to your code.
|
34
34
|
|
@@ -40,14 +40,16 @@ That's it! Requiring the gem activates the Glimmer XML DSL automatically.
|
|
40
40
|
|
41
41
|
Add the following to `Gemfile` (after `glimmer-dsl-swt` and/or `glimmer-dsl-opal` if included too):
|
42
42
|
```
|
43
|
-
gem 'glimmer-dsl-xml', '~> 1.
|
43
|
+
gem 'glimmer-dsl-xml', '~> 1.3.0'
|
44
44
|
```
|
45
45
|
|
46
46
|
And, then run:
|
47
47
|
```
|
48
|
-
|
48
|
+
bundle install
|
49
49
|
```
|
50
50
|
|
51
|
+
Note: When using JRuby, prefix with `jruby -S`
|
52
|
+
|
51
53
|
Require in your code via Bundler (e.g. `require 'bundler'; Bundler.require`) or add `require 'glimmer-dsl-xml'` to your code.
|
52
54
|
|
53
55
|
When using with [Glimmer DSL for SWT](https://github.com/AndyObtiva/glimmer-dsl-swt) or [Glimmer DSL for Opal](https://github.com/AndyObtiva/glimmer-dsl-opal), make sure it is loaded after `glimmer-dsl-swt` and `glimmer-dsl-opal` to give it a lower precedence than them when processed by the Glimmer DSL engine.
|
@@ -56,20 +58,31 @@ That's it! Requiring the gem activates the Glimmer XML DSL automatically.
|
|
56
58
|
|
57
59
|
## XML DSL
|
58
60
|
|
59
|
-
Simply start with `html` keyword and add HTML inside its block using Glimmer DSL syntax.
|
60
|
-
Once done, you may call `to_s`, `to_xml`, or `to_html` to get the formatted HTML output.
|
61
|
+
Simply start with the `html`, `xml`, `name_space`, or `tag` keyword and add XML/HTML inside its block using Glimmer DSL for XML syntax.
|
62
|
+
Once done, you may call `to_s`, `to_xml`, or `to_html` to get the formatted XML/HTML output.
|
61
63
|
|
62
64
|
Here are all the Glimmer XML DSL top-level keywords:
|
63
|
-
- `html`
|
64
|
-
- `
|
65
|
+
- `html`: renders partial HTML just like `xml` (not having body/head) or full HTML document (having body/head), automatically including doctype (`<!DOCTYPE html>`) and surrounding content by the `<html></html>` tag
|
66
|
+
- `xml`: renders XML/XHTML content (e.g. `xml {span {'Hello'}; br}.to_s` renders `<span>Hello</span><br />`)
|
65
67
|
- `name_space`: enables namespacing html tags
|
68
|
+
- `tag`: enables custom tag creation for exceptional cases (e.g. `p` as reserved Ruby keyword) by passing tag name as '_name' attribute
|
66
69
|
|
67
70
|
Element properties are typically passed as a key/value hash (e.g. `section(id: 'main', class: 'accordion')`) . However, for properties like "selected" or "checked", you must leave value `nil` or otherwise pass in front of the hash (e.g. `input(:checked, type: 'checkbox')` )
|
68
71
|
|
69
|
-
|
72
|
+
You may try the following examples in IRB after installing the [glimmer-dsl-xml](https://rubygems.org/gems/glimmer-dsl-xml) gem.
|
73
|
+
|
74
|
+
Just make sure to require the library and include Glimmer first:
|
70
75
|
|
71
76
|
```ruby
|
72
|
-
|
77
|
+
require 'glimmer-dsl-xml'
|
78
|
+
|
79
|
+
include Glimmer
|
80
|
+
```
|
81
|
+
|
82
|
+
Example (full HTML document):
|
83
|
+
|
84
|
+
```ruby
|
85
|
+
@html = html {
|
73
86
|
head {
|
74
87
|
meta(name: "viewport", content: "width=device-width, initial-scale=2.0")
|
75
88
|
}
|
@@ -77,59 +90,94 @@ Example (basic HTML):
|
|
77
90
|
h1 { "Hello, World!" }
|
78
91
|
}
|
79
92
|
}
|
80
|
-
|
93
|
+
|
94
|
+
puts @html
|
95
|
+
```
|
96
|
+
|
97
|
+
Output:
|
98
|
+
|
99
|
+
```
|
100
|
+
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=2.0" /></head><body><h1>Hello, World!</h1></body></html>
|
101
|
+
```
|
102
|
+
|
103
|
+
Example (partial HTML fragment):
|
104
|
+
|
105
|
+
```ruby
|
106
|
+
@html = html {
|
107
|
+
h1 { "Hello, World!" }
|
108
|
+
}
|
109
|
+
|
110
|
+
puts @html
|
81
111
|
```
|
82
112
|
|
83
113
|
Output:
|
84
114
|
|
85
115
|
```
|
86
|
-
<
|
116
|
+
<h1>Hello, World!</h1>
|
87
117
|
```
|
88
118
|
|
89
|
-
Example (
|
119
|
+
Example (basic XML):
|
90
120
|
|
91
121
|
```ruby
|
92
|
-
|
122
|
+
@xml = xml {
|
123
|
+
greeting { "Hello, World!" }
|
124
|
+
}
|
125
|
+
|
126
|
+
puts @xml
|
93
127
|
```
|
94
128
|
|
95
129
|
Output:
|
96
130
|
|
97
131
|
```
|
98
|
-
<
|
132
|
+
<greeting>Hello, World!</greeting>
|
99
133
|
```
|
100
134
|
|
101
135
|
Example (XML namespaces using `name_space` keyword):
|
102
136
|
|
103
137
|
```ruby
|
104
|
-
@xml = name_space(:
|
105
|
-
|
106
|
-
|
138
|
+
@xml = name_space(:acme) {
|
139
|
+
product(:id => "thesis", :class => "document") {
|
140
|
+
component(:id => "main") {
|
107
141
|
}
|
108
142
|
}
|
109
143
|
}
|
144
|
+
|
110
145
|
puts @xml
|
111
146
|
```
|
112
147
|
|
113
148
|
Output:
|
114
149
|
|
115
150
|
```
|
116
|
-
<
|
151
|
+
<acme:product id="thesis" class="document"><acme:component id="main"></acme:component></acme:product>
|
117
152
|
```
|
118
153
|
|
119
154
|
Example (XML namespaces using dot operator):
|
120
155
|
|
121
156
|
```ruby
|
122
|
-
@xml =
|
123
|
-
|
157
|
+
@xml = xml {
|
158
|
+
document.body(document.id => "main") {
|
159
|
+
}
|
124
160
|
}
|
125
|
-
|
126
|
-
puts @xml
|
161
|
+
|
162
|
+
puts @xml
|
163
|
+
```
|
164
|
+
|
165
|
+
Output:
|
166
|
+
|
167
|
+
```
|
168
|
+
<document:body document:id="main"></document:body>
|
169
|
+
```
|
170
|
+
|
171
|
+
Example (custom tag):
|
172
|
+
|
173
|
+
```ruby
|
174
|
+
puts tag(:_name => "p") {"p is a reserved keyword in Ruby"}
|
127
175
|
```
|
128
176
|
|
129
177
|
Output:
|
130
178
|
|
131
179
|
```
|
132
|
-
<
|
180
|
+
<p>p is a reserved keyword in Ruby</p>
|
133
181
|
```
|
134
182
|
|
135
183
|
## Multi-DSL Support
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.3.0
|
data/lib/glimmer/dsl/xml/dsl.rb
CHANGED
@@ -23,7 +23,7 @@ require 'glimmer/dsl/engine'
|
|
23
23
|
# Dir[File.expand_path('../*_expression.rb', __FILE__)].each {|f| require f} # cannot in Opal, disabling automated requires for now
|
24
24
|
require 'glimmer/dsl/xml/text_expression'
|
25
25
|
require 'glimmer/dsl/xml/tag_expression'
|
26
|
-
require 'glimmer/dsl/xml/
|
26
|
+
require 'glimmer/dsl/xml/xml_node_expression'
|
27
27
|
require 'glimmer/dsl/xml/html_expression'
|
28
28
|
require 'glimmer/dsl/xml/meta_expression'
|
29
29
|
require 'glimmer/dsl/xml/name_space_expression'
|
@@ -36,7 +36,7 @@ module Glimmer
|
|
36
36
|
%w[
|
37
37
|
text
|
38
38
|
tag
|
39
|
-
|
39
|
+
xml_node
|
40
40
|
]
|
41
41
|
)
|
42
42
|
end
|
@@ -20,9 +20,9 @@
|
|
20
20
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
21
|
|
22
22
|
require 'glimmer/dsl/xml/node_parent_expression'
|
23
|
-
require 'glimmer/dsl/xml/xml_expression'
|
24
23
|
require 'glimmer/dsl/static_expression'
|
25
24
|
require 'glimmer/dsl/top_level_expression'
|
25
|
+
require 'glimmer/xml/html_node'
|
26
26
|
|
27
27
|
module Glimmer
|
28
28
|
module DSL
|
@@ -34,11 +34,7 @@ module Glimmer
|
|
34
34
|
include NodeParentExpression
|
35
35
|
|
36
36
|
def interpret(parent, keyword, *args, &block)
|
37
|
-
|
38
|
-
end
|
39
|
-
|
40
|
-
def xml_expression
|
41
|
-
@xml_expression ||= XmlExpression.new
|
37
|
+
Glimmer::XML::HtmlNode.new(parent, keyword.to_s, args, &block)
|
42
38
|
end
|
43
39
|
end
|
44
40
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2020 - Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -21,6 +21,7 @@
|
|
21
21
|
|
22
22
|
require 'glimmer/dsl/static_expression'
|
23
23
|
require 'glimmer/dsl/top_level_expression'
|
24
|
+
require 'glimmer/dsl/parent_expression'
|
24
25
|
require 'glimmer/xml/node'
|
25
26
|
require 'glimmer/xml/depth_first_search_iterator'
|
26
27
|
require 'glimmer/xml/name_space_visitor'
|
@@ -30,6 +31,7 @@ module Glimmer
|
|
30
31
|
module XML
|
31
32
|
class NameSpaceExpression < StaticExpression
|
32
33
|
include TopLevelExpression
|
34
|
+
include ParentExpression
|
33
35
|
|
34
36
|
def can_interpret?(parent, keyword, *args, &block)
|
35
37
|
(parent == nil or parent.is_a?(Glimmer::XML::Node)) and
|
@@ -40,18 +42,23 @@ module Glimmer
|
|
40
42
|
end
|
41
43
|
|
42
44
|
def interpret(parent, keyword, *args, &block)
|
43
|
-
|
45
|
+
# act like a top-level xml tag
|
46
|
+
Glimmer::XML::Node.new(parent, args[0].to_s, :_name_space_context => true)
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_content(parent, keyword, *args, &block)
|
50
|
+
node = block.call(parent)
|
44
51
|
unless node.is_a?(String)
|
45
|
-
name_space_visitor = Glimmer::XML::NameSpaceVisitor.new(
|
52
|
+
name_space_visitor = Glimmer::XML::NameSpaceVisitor.new(parent.name)
|
46
53
|
Glimmer::XML::DepthFirstSearchIterator.new(node, name_space_visitor).iterate
|
47
54
|
def node.process_block(block)
|
48
55
|
Glimmer::Config.logger&.debug 'block'
|
49
|
-
#NOOP
|
50
56
|
end
|
51
57
|
end
|
52
58
|
parent.children << node if parent and !parent.children.include?(node)
|
53
59
|
node
|
54
60
|
end
|
61
|
+
|
55
62
|
end
|
56
63
|
end
|
57
64
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2020 - Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -30,8 +30,8 @@ module Glimmer
|
|
30
30
|
include ParentExpression
|
31
31
|
include Glimmer
|
32
32
|
|
33
|
-
def add_content(parent, &block)
|
34
|
-
return_value = block.call(parent)
|
33
|
+
def add_content(parent, keyword, *args, &block)
|
34
|
+
return_value = block.call(parent)
|
35
35
|
if !return_value.is_a?(Glimmer::XML::Node) and !parent.children.include?(return_value)
|
36
36
|
text = return_value.to_s
|
37
37
|
first_match = text.match(/[#][^{]+[{][^}]+[}]/)
|
@@ -20,19 +20,17 @@
|
|
20
20
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
21
|
|
22
22
|
require 'glimmer/dsl/xml/node_parent_expression'
|
23
|
-
require 'glimmer/dsl/
|
23
|
+
require 'glimmer/dsl/static_expression'
|
24
|
+
require 'glimmer/dsl/top_level_expression'
|
24
25
|
require 'glimmer/xml/node'
|
25
26
|
|
26
27
|
module Glimmer
|
27
28
|
module DSL
|
28
29
|
module XML
|
29
|
-
class XmlExpression <
|
30
|
+
class XmlExpression < StaticExpression
|
31
|
+
include TopLevelExpression
|
30
32
|
include NodeParentExpression
|
31
33
|
|
32
|
-
def can_interpret?(parent, keyword, *args, &block)
|
33
|
-
parent.is_a?(Glimmer::XML::Node)
|
34
|
-
end
|
35
|
-
|
36
34
|
def interpret(parent, keyword, *args, &block)
|
37
35
|
Glimmer::XML::Node.new(parent, keyword.to_s, args, &block)
|
38
36
|
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# Copyright (c) 2020 - Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/dsl/xml/node_parent_expression'
|
23
|
+
require 'glimmer/dsl/expression'
|
24
|
+
require 'glimmer/xml/node'
|
25
|
+
|
26
|
+
module Glimmer
|
27
|
+
module DSL
|
28
|
+
module XML
|
29
|
+
class XmlNodeExpression < Expression
|
30
|
+
include NodeParentExpression
|
31
|
+
|
32
|
+
def can_interpret?(parent, keyword, *args, &block)
|
33
|
+
parent.is_a?(Glimmer::XML::Node)
|
34
|
+
end
|
35
|
+
|
36
|
+
def interpret(parent, keyword, *args, &block)
|
37
|
+
Glimmer::XML::Node.new(parent, keyword.to_s, args, &block)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
|
2
|
+
# Copyright (c) 2020 - Andy Maleh
|
3
|
+
#
|
4
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
5
|
+
# a copy of this software and associated documentation files (the
|
6
|
+
# "Software"), to deal in the Software without restriction, including
|
7
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
8
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
9
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
10
|
+
# the following conditions:
|
11
|
+
#
|
12
|
+
# The above copyright notice and this permission notice shall be
|
13
|
+
# included in all copies or substantial portions of the Software.
|
14
|
+
#
|
15
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
16
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
17
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
18
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
19
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
20
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
21
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
22
|
+
|
23
|
+
require 'glimmer/xml/node'
|
24
|
+
require 'glimmer/xml/html_visitor'
|
25
|
+
require 'glimmer/xml/xml_visitor'
|
26
|
+
|
27
|
+
module Glimmer
|
28
|
+
module XML
|
29
|
+
class HtmlNode < Node
|
30
|
+
def to_xml
|
31
|
+
node_visitor = @name_space.nil? ? HtmlVisitor.new : XmlVisitor.new
|
32
|
+
DepthFirstSearchIterator.new(self, node_visitor).iterate
|
33
|
+
node_visitor.document
|
34
|
+
end
|
35
|
+
alias to_html to_xml
|
36
|
+
alias to_s to_xml
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# Copyright (c) 2020 - Andy Maleh
|
2
|
+
#
|
3
|
+
# Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
# a copy of this software and associated documentation files (the
|
5
|
+
# "Software"), to deal in the Software without restriction, including
|
6
|
+
# without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
# permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
# the following conditions:
|
10
|
+
#
|
11
|
+
# The above copyright notice and this permission notice shall be
|
12
|
+
# included in all copies or substantial portions of the Software.
|
13
|
+
#
|
14
|
+
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
|
+
|
22
|
+
require 'glimmer/xml/xml_visitor'
|
23
|
+
|
24
|
+
module Glimmer
|
25
|
+
module XML
|
26
|
+
class HtmlVisitor < XmlVisitor
|
27
|
+
|
28
|
+
def render_html_tag?(node)
|
29
|
+
if node.name == 'html'
|
30
|
+
node_children = node.children.select {|node_or_text| node_or_text.is_a?(Glimmer::XML::Node)}
|
31
|
+
if !node_children.empty?
|
32
|
+
children_names = node_children.map(&:name)
|
33
|
+
return false unless children_names.include?('head') || children_names.include?('body')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
true
|
37
|
+
end
|
38
|
+
|
39
|
+
def begin_open_tag(node)
|
40
|
+
return unless render_html_tag?(node)
|
41
|
+
@document += "<!DOCTYPE html>" if node.name == 'html'
|
42
|
+
super(node)
|
43
|
+
end
|
44
|
+
|
45
|
+
def end_open_tag(node)
|
46
|
+
return unless render_html_tag?(node)
|
47
|
+
super(node)
|
48
|
+
end
|
49
|
+
|
50
|
+
def append_close_tag(node)
|
51
|
+
return unless render_html_tag?(node)
|
52
|
+
super(node)
|
53
|
+
end
|
54
|
+
|
55
|
+
def append_attributes(node)
|
56
|
+
return unless render_html_tag?(node)
|
57
|
+
super(node)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/glimmer/xml/node.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2020 - Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -19,7 +19,6 @@
|
|
19
19
|
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
20
|
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
21
21
|
|
22
|
-
require 'glimmer'
|
23
22
|
require 'glimmer/xml/depth_first_search_iterator'
|
24
23
|
require 'glimmer/xml/xml_visitor'
|
25
24
|
|
@@ -28,8 +27,10 @@ module Glimmer
|
|
28
27
|
class Node
|
29
28
|
include Glimmer
|
30
29
|
|
30
|
+
# TODO change is_name_space to name_space?
|
31
|
+
|
31
32
|
attr_accessor :children, :name, :contents, :attributes, :is_name_space, :is_attribute, :name_space, :parent
|
32
|
-
|
33
|
+
|
33
34
|
def initialize(parent, name, attributes, &contents)
|
34
35
|
@is_name_space = false
|
35
36
|
@children = []
|
@@ -65,16 +66,19 @@ module Glimmer
|
|
65
66
|
def method_missing(symbol, *args, &block)
|
66
67
|
@is_name_space = true
|
67
68
|
parent.children.delete(self) if parent
|
68
|
-
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::XML::
|
69
|
+
Glimmer::DSL::Engine.add_content(self, Glimmer::DSL::XML::XmlExpression.new, name, attributes) {@tag = super}
|
69
70
|
@tag
|
70
71
|
end
|
72
|
+
|
73
|
+
def name_space_context?
|
74
|
+
attributes[:_name_space_context]
|
75
|
+
end
|
71
76
|
|
72
77
|
def to_xml
|
73
78
|
xml_visitor = XmlVisitor.new
|
74
79
|
DepthFirstSearchIterator.new(self, xml_visitor).iterate
|
75
80
|
xml_visitor.document
|
76
81
|
end
|
77
|
-
alias to_html to_xml
|
78
82
|
alias to_s to_xml
|
79
83
|
|
80
84
|
def text_command(text)
|
@@ -48,21 +48,24 @@ module Glimmer
|
|
48
48
|
end
|
49
49
|
|
50
50
|
def begin_open_tag(node)
|
51
|
+
return if node.name == 'xml' || node.name_space_context?
|
51
52
|
@document += "<"
|
52
53
|
@document += "#{node.name_space.name}:" if node.name_space
|
53
54
|
@document += node.name
|
54
55
|
end
|
55
56
|
|
56
57
|
def end_open_tag(node)
|
58
|
+
return if node.name == 'xml' || node.name_space_context?
|
57
59
|
if (node.contents)
|
58
60
|
@document += ">"
|
59
61
|
else
|
60
62
|
@document += " " if node.attributes.keys.size > 0
|
61
|
-
@document += "/>"
|
63
|
+
@document += " />"
|
62
64
|
end
|
63
65
|
end
|
64
66
|
|
65
67
|
def append_close_tag(node)
|
68
|
+
return if node.name == 'xml' || node.name_space_context?
|
66
69
|
if (node.contents)
|
67
70
|
@document += "</"
|
68
71
|
@document += "#{node.name_space.name}:" if node.name_space
|
@@ -71,6 +74,7 @@ module Glimmer
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def append_attributes(node)
|
77
|
+
return if node.name == 'xml' || node.name_space_context?
|
74
78
|
Glimmer::Config.logger&.debug "Take 3"
|
75
79
|
Glimmer::Config.logger&.debug(node.attributes)
|
76
80
|
node.attributes.each do |attribute, value|
|
data/lib/glimmer-dsl-xml.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# Copyright (c) 2020 - Andy Maleh
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Permission is hereby granted, free of charge, to any person obtaining
|
4
4
|
# a copy of this software and associated documentation files (the
|
5
5
|
# "Software"), to deal in the Software without restriction, including
|
@@ -7,10 +7,10 @@
|
|
7
7
|
# distribute, sublicense, and/or sell copies of the Software, and to
|
8
8
|
# permit persons to whom the Software is furnished to do so, subject to
|
9
9
|
# the following conditions:
|
10
|
-
#
|
10
|
+
#
|
11
11
|
# The above copyright notice and this permission notice shall be
|
12
12
|
# included in all copies or substantial portions of the Software.
|
13
|
-
#
|
13
|
+
#
|
14
14
|
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
15
|
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
16
|
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
@@ -21,4 +21,5 @@
|
|
21
21
|
|
22
22
|
$LOAD_PATH.unshift(File.expand_path('..', __FILE__))
|
23
23
|
|
24
|
+
require 'glimmer'
|
24
25
|
require 'glimmer/dsl/xml/dsl'
|
metadata
CHANGED
@@ -1,35 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: glimmer-dsl-xml
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- AndyMaleh
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-11-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glimmer
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 1.0.0
|
20
|
-
- - "<"
|
17
|
+
- - "~>"
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version: 2.
|
19
|
+
version: 2.4.1
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: 1.0.0
|
30
|
-
- - "<"
|
24
|
+
- - "~>"
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version: 2.
|
26
|
+
version: 2.4.1
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: rspec-mocks
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -62,16 +56,16 @@ dependencies:
|
|
62
56
|
name: puts_debuggerer
|
63
57
|
requirement: !ruby/object:Gem::Requirement
|
64
58
|
requirements:
|
65
|
-
- - "
|
59
|
+
- - ">="
|
66
60
|
- !ruby/object:Gem::Version
|
67
|
-
version: 0
|
61
|
+
version: '0'
|
68
62
|
type: :development
|
69
63
|
prerelease: false
|
70
64
|
version_requirements: !ruby/object:Gem::Requirement
|
71
65
|
requirements:
|
72
|
-
- - "
|
66
|
+
- - ">="
|
73
67
|
- !ruby/object:Gem::Version
|
74
|
-
version: 0
|
68
|
+
version: '0'
|
75
69
|
- !ruby/object:Gem::Dependency
|
76
70
|
name: rake
|
77
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -174,6 +168,20 @@ dependencies:
|
|
174
168
|
- - "~>"
|
175
169
|
- !ruby/object:Gem::Version
|
176
170
|
version: 0.7.0
|
171
|
+
- !ruby/object:Gem::Dependency
|
172
|
+
name: rake-tui
|
173
|
+
requirement: !ruby/object:Gem::Requirement
|
174
|
+
requirements:
|
175
|
+
- - ">="
|
176
|
+
- !ruby/object:Gem::Version
|
177
|
+
version: '0'
|
178
|
+
type: :development
|
179
|
+
prerelease: false
|
180
|
+
version_requirements: !ruby/object:Gem::Requirement
|
181
|
+
requirements:
|
182
|
+
- - ">="
|
183
|
+
- !ruby/object:Gem::Version
|
184
|
+
version: '0'
|
177
185
|
description: Glimmer DSL for XML (& HTML)
|
178
186
|
email: andy.am@gmail.com
|
179
187
|
executables: []
|
@@ -197,7 +205,10 @@ files:
|
|
197
205
|
- lib/glimmer/dsl/xml/tag_expression.rb
|
198
206
|
- lib/glimmer/dsl/xml/text_expression.rb
|
199
207
|
- lib/glimmer/dsl/xml/xml_expression.rb
|
208
|
+
- lib/glimmer/dsl/xml/xml_node_expression.rb
|
200
209
|
- lib/glimmer/xml/depth_first_search_iterator.rb
|
210
|
+
- lib/glimmer/xml/html_node.rb
|
211
|
+
- lib/glimmer/xml/html_visitor.rb
|
201
212
|
- lib/glimmer/xml/name_space_visitor.rb
|
202
213
|
- lib/glimmer/xml/node.rb
|
203
214
|
- lib/glimmer/xml/node_visitor.rb
|
@@ -221,7 +232,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
232
|
- !ruby/object:Gem::Version
|
222
233
|
version: '0'
|
223
234
|
requirements: []
|
224
|
-
rubygems_version: 3.
|
235
|
+
rubygems_version: 3.2.22
|
225
236
|
signing_key:
|
226
237
|
specification_version: 4
|
227
238
|
summary: Glimmer DSL for XML
|