xml-mixup 0.1.3 → 0.1.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/README.md +31 -8
- data/lib/xml/mixup/version.rb +1 -1
- data/lib/xml/mixup.rb +22 -21
- data/xml-mixup.gemspec +1 -0
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a594513555bc316fae8b161bdb001a6f180dff72f9979277b4c2acdb8e0be60
|
4
|
+
data.tar.gz: 6cca44a5594a90854e0a78ea799e5e77d9356129a6bcb58a0c465b8f09b4b2e4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5e776ca7dc85b8d3c4617dfa18d90e384a7659ac2cfd34aa663ca70b2da23a62add625c92567935e7a1f78b6bd1ad5ed8e46ff1aa93e07022652efb68908da68
|
7
|
+
data.tar.gz: a286229b7037866857840f7785e4a0ad9b2607765abbc655df237b89f22ac5b548078f66cffcd2ba0287a29e3e14b86b12c75344dc09d024bf9ac8ea5c5efbb4
|
data/README.md
CHANGED
@@ -76,17 +76,19 @@ fun. Good luck with that.
|
|
76
76
|
### Enter `XML::Mixup`
|
77
77
|
|
78
78
|
* __The input consists of ordinary Ruby data objects__ so you can
|
79
|
-
build them up ahead of time, in bulk, transform them
|
79
|
+
build them up ahead of time, in bulk, transform them using familiar
|
80
|
+
operations, etc.,
|
80
81
|
* __Sprinkle pre-built XML subtrees anywhere into the spec__ so you
|
81
82
|
can memoize repeating elements, or otherwise compile a document
|
82
83
|
incrementally,
|
83
84
|
* __Attach new generated content anywhere:__ underneath a parent node,
|
84
85
|
or before, after, or _instead of_ a node at the sibling level.
|
85
86
|
|
86
|
-
## The spec format
|
87
|
+
## The tree spec format
|
87
88
|
|
88
89
|
At the heart of this module is a single method called `markup`, which,
|
89
|
-
among other things, takes a `:spec`. The spec can be any composite
|
90
|
+
among other things, takes a `:spec`. The spec can be any composite of
|
91
|
+
these objects, and will behave as described:
|
90
92
|
|
91
93
|
### Hashes
|
92
94
|
|
@@ -98,12 +100,12 @@ generate pretty much any node with it:
|
|
98
100
|
```ruby
|
99
101
|
{ '#tag' => 'foo' } # => <foo/>
|
100
102
|
|
101
|
-
# or
|
102
|
-
{ '#elem' => 'foo' } # => <foo/>
|
103
|
-
|
104
103
|
# or, with the element name as a symbol
|
105
104
|
{ '#element' => :foo } # => <foo/>
|
106
105
|
|
106
|
+
# or
|
107
|
+
{ '#elem' => 'foo' } # => <foo/>
|
108
|
+
|
107
109
|
# or, with nil as a key
|
108
110
|
{ nil => :foo } # => <foo/>
|
109
111
|
|
@@ -122,8 +124,22 @@ generate pretty much any node with it:
|
|
122
124
|
|
123
125
|
# or, shove your child nodes into an otherwise content-less key
|
124
126
|
{ [:hi] => :foo, bar: :hurr } # => <foo bar="hurr">hi</foo>
|
127
|
+
|
128
|
+
# or, if you have content and the element name is not a reserved word
|
129
|
+
{ '#html' => { '#head' => { '#title' => :hi } } }
|
130
|
+
# => <html><head><title>hi</title></head></html>
|
131
|
+
|
132
|
+
# also works with namespaces
|
133
|
+
{ '#atom:feed' => nil, 'xmlns:atom' => 'http://www.w3.org/2005/Atom' }
|
134
|
+
# => <atom:feed xmlns:atom="http://www.w3.org/2005/Atom"/>
|
125
135
|
```
|
126
136
|
|
137
|
+
Reserved hash keywords are: `#comment`, `#cdata`, `#doctype`, `#dtd`,
|
138
|
+
`#elem`, `#element`, `#pi`, `#processing-instruction`, `#tag`. Note
|
139
|
+
that the constructs `{ nil => :foo }`, `{ nil => 'foo' }`, and `{
|
140
|
+
'#foo' => nil }`, plus `[]` anywhere you see `nil`, are all
|
141
|
+
equivalent.
|
142
|
+
|
127
143
|
Attributes are sorted lexically. Composite attribute values get
|
128
144
|
flattened like this:
|
129
145
|
|
@@ -187,16 +203,23 @@ another `Proc`.)
|
|
187
203
|
|
188
204
|
Turned into a text node.
|
189
205
|
|
206
|
+
## Documentation
|
207
|
+
|
208
|
+
Generated and deposited
|
209
|
+
[in the usual place](http://www.rubydoc.info/gems/xml-mixup/).
|
210
|
+
|
190
211
|
## Installation
|
191
212
|
|
192
213
|
Come on, you know how to do this:
|
193
214
|
|
194
215
|
$ gem install xml-mixup
|
195
216
|
|
217
|
+
Or, [download it off rubygems.org](https://rubygems.org/gems/xml-mixup).
|
218
|
+
|
196
219
|
## Contributing
|
197
220
|
|
198
221
|
Bug reports and pull requests are welcome at
|
199
|
-
https://github.com/doriantaylor/rb-xml-mixup.
|
222
|
+
[the GitHub repository](https://github.com/doriantaylor/rb-xml-mixup).
|
200
223
|
|
201
224
|
## The Future
|
202
225
|
|
@@ -208,7 +231,7 @@ make more streamlined methods. This may or may not make the same kind
|
|
208
231
|
of sense with Ruby.
|
209
232
|
|
210
233
|
In particular, these methods do not touch the calling object's
|
211
|
-
state. In fact they
|
234
|
+
state. In fact they _should_ be completely stateless and side-effect
|
212
235
|
free. Likewise, they are really meant to be private. As such, it may
|
213
236
|
make sense to simply bundle them as class methods and use them as
|
214
237
|
such. I don't know, I haven't decided yet.
|
data/lib/xml/mixup/version.rb
CHANGED
data/lib/xml/mixup.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'xml/mixup/version'
|
2
2
|
require 'nokogiri'
|
3
|
+
require 'set'
|
3
4
|
|
4
5
|
module XML::Mixup
|
5
6
|
|
@@ -9,26 +10,26 @@ module XML::Mixup
|
|
9
10
|
private
|
10
11
|
|
11
12
|
ADJACENT = {
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
RESERVED = %w{comment cdata doctype dtd elem element
|
31
|
-
|
13
|
+
parent: lambda do |node, parent|
|
14
|
+
if parent.node_type == 9 and node.node_type == 1
|
15
|
+
parent.root = node
|
16
|
+
elsif node.node_type == 11
|
17
|
+
node.children.each do |child|
|
18
|
+
parent.add_child(child)
|
19
|
+
end
|
20
|
+
else
|
21
|
+
parent.add_child(node)
|
22
|
+
end
|
23
|
+
end,
|
24
|
+
before: lambda do |node, sibling|
|
25
|
+
sibling.add_previous_sibling node
|
26
|
+
end,
|
27
|
+
after: lambda { |node, sibling| sibling.add_next_sibling node },
|
28
|
+
replace: lambda { |node, target| target.replace node },
|
29
|
+
}.freeze
|
30
|
+
|
31
|
+
RESERVED = Set.new(%w{comment cdata doctype dtd elem element
|
32
|
+
pi processing-instruction tag}.map {|x| "##{x}"}).freeze
|
32
33
|
|
33
34
|
public
|
34
35
|
|
@@ -478,7 +479,7 @@ module XML::Mixup
|
|
478
479
|
prefix = local = nil
|
479
480
|
if tag.respond_to? :to_a
|
480
481
|
prefix, local = tag
|
481
|
-
tag = tag.join ':'
|
482
|
+
tag = tag[0..1].join ':'
|
482
483
|
end
|
483
484
|
elem = doc.create_element tag.to_s
|
484
485
|
ns.sort.each do |p, u|
|
data/xml-mixup.gemspec
CHANGED
@@ -12,6 +12,7 @@ Gem::Specification.new do |spec|
|
|
12
12
|
spec.summary = %q{A mixin for (XML) markup}
|
13
13
|
spec.description = %q{XML::Mixup uses declarative data structures to incrementally generate XML.}
|
14
14
|
spec.homepage = "https://github.com/doriantaylor/rb-xml-mixup"
|
15
|
+
spec.required_ruby_version = "~> 2.0"
|
15
16
|
|
16
17
|
# Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
|
17
18
|
# to allow pushing to a single host or delete this section to allow pushing to any host.
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: xml-mixup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dorian Taylor
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-05-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -94,9 +94,9 @@ require_paths:
|
|
94
94
|
- lib
|
95
95
|
required_ruby_version: !ruby/object:Gem::Requirement
|
96
96
|
requirements:
|
97
|
-
- - "
|
97
|
+
- - "~>"
|
98
98
|
- !ruby/object:Gem::Version
|
99
|
-
version: '0'
|
99
|
+
version: '2.0'
|
100
100
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
102
|
- - ">="
|