tilia-xml 1.2.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 +7 -0
- data/.gitignore +19 -0
- data/.rubocop.yml +32 -0
- data/.simplecov +4 -0
- data/.travis.yml +3 -0
- data/CHANGELOG.sabre.md +167 -0
- data/CONTRIBUTING.md +25 -0
- data/Gemfile +15 -0
- data/Gemfile.lock +56 -0
- data/LICENSE +27 -0
- data/LICENSE.sabre +27 -0
- data/README.md +30 -0
- data/Rakefile +17 -0
- data/lib/tilia/xml/context_stack_trait.rb +99 -0
- data/lib/tilia/xml/element/base.rb +73 -0
- data/lib/tilia/xml/element/cdata.rb +53 -0
- data/lib/tilia/xml/element/elements.rb +109 -0
- data/lib/tilia/xml/element/key_value.rb +110 -0
- data/lib/tilia/xml/element/uri.rb +98 -0
- data/lib/tilia/xml/element/xml_fragment.rb +128 -0
- data/lib/tilia/xml/element.rb +22 -0
- data/lib/tilia/xml/lib_xml_exception.rb +9 -0
- data/lib/tilia/xml/parse_exception.rb +7 -0
- data/lib/tilia/xml/reader.rb +240 -0
- data/lib/tilia/xml/service.rb +151 -0
- data/lib/tilia/xml/version.rb +9 -0
- data/lib/tilia/xml/writer.rb +261 -0
- data/lib/tilia/xml/xml_deserializable.rb +29 -0
- data/lib/tilia/xml/xml_serializable.rb +27 -0
- data/lib/tilia/xml.rb +23 -0
- data/test/test_helper.rb +4 -0
- data/test/xml/context_stack_test.rb +40 -0
- data/test/xml/element/cdata_test.rb +37 -0
- data/test/xml/element/eater.rb +60 -0
- data/test/xml/element/elements_test.rb +113 -0
- data/test/xml/element/key_value_test.rb +187 -0
- data/test/xml/element/mock.rb +52 -0
- data/test/xml/element/uri_test.rb +55 -0
- data/test/xml/element/xml_fragment_test.rb +121 -0
- data/test/xml/infite_loop_test.rb +47 -0
- data/test/xml/reader_test.rb +407 -0
- data/test/xml/service_test.rb +156 -0
- data/test/xml/writer_test.rb +260 -0
- data/tilia-xml.gemspec +15 -0
- metadata +132 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: a3fb4181ed07ce2430cb07b7fb523b084bf745a2
|
4
|
+
data.tar.gz: c47a873a3d33f0605a0f5427b42beae183a8b2c6
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e67f3310cad179234b9539320a0930ab2f0056438d9f49fda16cabb0640ee9f12bb51f64e108e72f2bf9687186213aef77227bacbe9bd6bad0b98e99f5629d2b
|
7
|
+
data.tar.gz: 35c16b92d5fabb186167abcb33c47c8d4f35c0866326724585fa41b3c656d0bbdac050bc48164a601879fbec5f9ed4c564655014d49f1dd84c091e561a0f2c1b
|
data/.gitignore
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# Disable metrics - we stick to the sabre coding
|
2
|
+
Metrics/AbcSize:
|
3
|
+
Enabled: false
|
4
|
+
|
5
|
+
Metrics/BlockNesting:
|
6
|
+
Enabled: false
|
7
|
+
|
8
|
+
Metrics/ClassLength:
|
9
|
+
Enabled: false
|
10
|
+
|
11
|
+
Metrics/ModuleLength:
|
12
|
+
Enabled: false
|
13
|
+
|
14
|
+
Metrics/CyclomaticComplexity:
|
15
|
+
Enabled: false
|
16
|
+
|
17
|
+
Metrics/LineLength:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Metrics/MethodLength:
|
21
|
+
Enabled: false
|
22
|
+
|
23
|
+
Metrics/ParameterLists:
|
24
|
+
Enabled: false
|
25
|
+
|
26
|
+
Metrics/PerceivedComplexity:
|
27
|
+
Enabled: false
|
28
|
+
|
29
|
+
# ['word', 'array'] looks better when aligned with other arrays that can't use
|
30
|
+
# %w() syntax
|
31
|
+
Style/WordArray:
|
32
|
+
Enabled: false
|
data/.simplecov
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.sabre.md
ADDED
@@ -0,0 +1,167 @@
|
|
1
|
+
ChangeLog
|
2
|
+
=========
|
3
|
+
|
4
|
+
1.2.0 (2015-08-30)
|
5
|
+
------------------
|
6
|
+
|
7
|
+
* #53: Added `parseGetElements`, a function like `parseInnerTree`, except
|
8
|
+
that it always returns an array of elements, or an empty array.
|
9
|
+
|
10
|
+
|
11
|
+
1.1.0 (2015-06-29)
|
12
|
+
------------------
|
13
|
+
|
14
|
+
* #44, #45: Catching broken and invalid XML better and throwing
|
15
|
+
`Sabre\Xml\LibXMLException` whenever we encounter errors. (@stefanmajoor,
|
16
|
+
@DaanBiesterbos)
|
17
|
+
|
18
|
+
|
19
|
+
1.0.0 (2015-05-25)
|
20
|
+
------------------
|
21
|
+
|
22
|
+
* No functional changes since 0.4.3. Marking it as 1.0.0 as a promise for
|
23
|
+
API stability.
|
24
|
+
* Using php-cs-fixer for automated CS enforcement.
|
25
|
+
|
26
|
+
|
27
|
+
0.4.3 (2015-04-01)
|
28
|
+
-----------------
|
29
|
+
|
30
|
+
* Minor tweaks for the public release.
|
31
|
+
|
32
|
+
|
33
|
+
0.4.2 (2015-03-20)
|
34
|
+
------------------
|
35
|
+
|
36
|
+
* Removed `constants.php` again. They messed with PHPUnit and don't really
|
37
|
+
provide a great benefit.
|
38
|
+
* #41: Correctly handle self-closing xml elements.
|
39
|
+
|
40
|
+
|
41
|
+
0.4.1 (2015-03-19)
|
42
|
+
------------------
|
43
|
+
|
44
|
+
* #40: An element with an empty namespace (xmlns="") is not allowed to have a
|
45
|
+
prefix. This is now fixed.
|
46
|
+
|
47
|
+
|
48
|
+
0.4.0 (2015-03-18)
|
49
|
+
------------------
|
50
|
+
|
51
|
+
* Added `Sabre\Xml\Service`. This is intended as a simple way to centrally
|
52
|
+
configure xml applications and easily parse/write things from there. #35, #38.
|
53
|
+
* Renamed 'baseUri' to 'contextUri' everywhere.
|
54
|
+
* #36: Added a few convenience constants to `lib/constants.php`.
|
55
|
+
* `Sabre\Xml\Util::parseClarkNotation` is now in the `Sabre\Xml\Service` class.
|
56
|
+
|
57
|
+
|
58
|
+
0.3.1 (2015-02-08)
|
59
|
+
------------------
|
60
|
+
|
61
|
+
* Added `XmlDeserializable` to match `XmlSerializable`.
|
62
|
+
|
63
|
+
|
64
|
+
0.3.0 (2015-02-06)
|
65
|
+
------------------
|
66
|
+
|
67
|
+
* Added `$elementMap` argument to parseInnerTree, for quickly overriding
|
68
|
+
parsing rules within an element.
|
69
|
+
|
70
|
+
|
71
|
+
0.2.2 (2015-02-05)
|
72
|
+
------------------
|
73
|
+
|
74
|
+
* Now depends on sabre/uri 1.0.
|
75
|
+
|
76
|
+
|
77
|
+
0.2.1 (2014-12-17)
|
78
|
+
------------------
|
79
|
+
|
80
|
+
* LibXMLException now inherits from ParseException, so it's easy for users to
|
81
|
+
catch any exception thrown by the parser.
|
82
|
+
|
83
|
+
|
84
|
+
0.2.0 (2014-12-05)
|
85
|
+
------------------
|
86
|
+
|
87
|
+
* Major BC Break: method names for the Element interface have been renamed
|
88
|
+
from `serializeXml` and `deserializeXml` to `xmlSerialize` and
|
89
|
+
`xmlDeserialize`. This is so that it matches PHP's `JsonSerializable`
|
90
|
+
interface.
|
91
|
+
* #25: Added `XmlSerializable` to allow people to write serializers without
|
92
|
+
having to implement a deserializer in the same class.
|
93
|
+
* #26: Renamed the `Sabre\XML` namespace to `Sabre\Xml`. Due to composer magic
|
94
|
+
and the fact that PHP namespace are case-insensitive, this should not affect
|
95
|
+
anyone, unless you are doing exact string matches on class names.
|
96
|
+
* #23: It's not possible to automatically extract or serialize Xml fragments
|
97
|
+
from documents using `Sabre\Xml\Element\XmlFragment`.
|
98
|
+
|
99
|
+
|
100
|
+
0.1.0 (2014-11-24)
|
101
|
+
------------------
|
102
|
+
|
103
|
+
* #16: Added ability to override `elementMap`, `namespaceMap` and `baseUri` for
|
104
|
+
a fragment of a document during reading an writing using `pushContext` and
|
105
|
+
`popContext`.
|
106
|
+
* Removed: `Writer::$context` and `Reader::$context`.
|
107
|
+
* #15: Added `Reader::$baseUri` to match `Writer::$baseUri`.
|
108
|
+
* #20: Allow callbacks to be used instead of `Element` classes in the `Reader`.
|
109
|
+
* #25: Added `readText` to quickly grab all text from a node and advance the
|
110
|
+
reader to the next node.
|
111
|
+
* #15: Added `Sabre\XML\Element\Uri`.
|
112
|
+
|
113
|
+
|
114
|
+
0.0.6 (2014-09-26)
|
115
|
+
------------------
|
116
|
+
|
117
|
+
* Added: `CData` element.
|
118
|
+
* #13: Better support for xml with no namespaces. (@kalmas)
|
119
|
+
* Switched to PSR-4 directory structure.
|
120
|
+
|
121
|
+
|
122
|
+
0.0.5 (2013-03-27)
|
123
|
+
------------------
|
124
|
+
|
125
|
+
* Added: baseUri property to the Writer class.
|
126
|
+
* Added: The writeElement method can now write complex elements.
|
127
|
+
* Added: Throwing exception when invalid objects are written.
|
128
|
+
|
129
|
+
|
130
|
+
0.0.4 (2013-03-14)
|
131
|
+
------------------
|
132
|
+
|
133
|
+
* Fixed: The KeyValue parser was skipping over elements when there was no
|
134
|
+
whitespace between them.
|
135
|
+
* Fixed: Clearing libxml errors after parsing.
|
136
|
+
* Added: Support for CDATA.
|
137
|
+
* Added: Context properties.
|
138
|
+
|
139
|
+
|
140
|
+
0.0.3 (2013-02-22)
|
141
|
+
------------------
|
142
|
+
|
143
|
+
* Changed: Reader::parse returns an array with 1 level less depth.
|
144
|
+
* Added: A LibXMLException is now thrown if the XMLReader comes across an error.
|
145
|
+
* Fixed: Both the Elements and KeyValue parsers had severe issues with
|
146
|
+
nesting.
|
147
|
+
* Fixed: The reader now detects when the end of the document is hit before it
|
148
|
+
should (because we're still parsing an element).
|
149
|
+
|
150
|
+
|
151
|
+
0.0.2 (2013-02-17)
|
152
|
+
------------------
|
153
|
+
|
154
|
+
* Added: Elements parser.
|
155
|
+
* Added: KeyValue parser.
|
156
|
+
* Change: Reader::parseSubTree is now named parseInnerTree, and returns either
|
157
|
+
a string (in case of a text-node), or an array (in case there were child
|
158
|
+
elements).
|
159
|
+
* Added: Reader::parseCurrentElement is now public.
|
160
|
+
|
161
|
+
|
162
|
+
0.0.1 (2013-02-07)
|
163
|
+
------------------
|
164
|
+
|
165
|
+
* First alpha release
|
166
|
+
|
167
|
+
Project started: 2012-11-13. First experiments in June 2009.
|
data/CONTRIBUTING.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# Contributing
|
2
|
+
|
3
|
+
This project adheres to the [Open Code of Conduct][code-of-conduct]. By participating, you are expected to honor this code.
|
4
|
+
[code-of-conduct]: http://todogroup.org/opencodeofconduct/#tilia-uri/tilia@jakobsack.de
|
5
|
+
|
6
|
+
This library is a port of [sabre/uri](http://github.com/fruux/sabre-uri). The ruby code should match the php code as good as possible. For more information refer to the [coding guidelines](https://tilia.github.io/coding_guidelines).
|
7
|
+
|
8
|
+
If you are having an issue [search the open issues](https://github.com/tilia/tilia-uri/issues) or create an issue and we'll help point you in the right direction.
|
9
|
+
|
10
|
+
## Submitting a Pull Request
|
11
|
+
|
12
|
+
* Fork the project on Github
|
13
|
+
* Install development dependencies (`bundle install`)
|
14
|
+
* Create a topic branch for your changes
|
15
|
+
* Ensure that you provide *documentation* and *test coverage* for your changes (patches won't be accepted without)
|
16
|
+
* Ensure that all tests pass (`bundle exec rake`)
|
17
|
+
* Create a [pull request](https://github.com/tilia/tilia-uri/pulls) on Github (these are also a great place to start a conversation around a patch as early as possible)
|
18
|
+
|
19
|
+
## Testing
|
20
|
+
|
21
|
+
To run the tests:
|
22
|
+
|
23
|
+
$ rake
|
24
|
+
|
25
|
+
If nothing complains, congratulations!
|
data/Gemfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
source 'https://rubygems.org'
|
2
|
+
|
3
|
+
# Internal dependencies
|
4
|
+
gem 'tilia-uri', '~> 1.0'
|
5
|
+
|
6
|
+
# External dependencies
|
7
|
+
gem 'activesupport', '~> 4.2'
|
8
|
+
gem 'libxml-ruby', '~> 2.8'
|
9
|
+
|
10
|
+
# Testing
|
11
|
+
gem 'rake'
|
12
|
+
gem 'minitest', '~> 5.8'
|
13
|
+
gem 'simplecov', '~> 0.10'
|
14
|
+
gem 'rubocop', '~> 0.34'
|
15
|
+
gem 'yard', '~> 0.8'
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
GEM
|
2
|
+
remote: https://rubygems.org/
|
3
|
+
specs:
|
4
|
+
activesupport (4.2.4)
|
5
|
+
i18n (~> 0.7)
|
6
|
+
json (~> 1.7, >= 1.7.7)
|
7
|
+
minitest (~> 5.1)
|
8
|
+
thread_safe (~> 0.3, >= 0.3.4)
|
9
|
+
tzinfo (~> 1.1)
|
10
|
+
ast (2.1.0)
|
11
|
+
astrolabe (1.3.1)
|
12
|
+
parser (~> 2.2)
|
13
|
+
docile (1.1.5)
|
14
|
+
i18n (0.7.0)
|
15
|
+
json (1.8.3)
|
16
|
+
libxml-ruby (2.8.0)
|
17
|
+
minitest (5.8.1)
|
18
|
+
parser (2.2.3.0)
|
19
|
+
ast (>= 1.1, < 3.0)
|
20
|
+
powerpack (0.1.1)
|
21
|
+
rainbow (2.0.0)
|
22
|
+
rake (10.4.2)
|
23
|
+
rubocop (0.34.2)
|
24
|
+
astrolabe (~> 1.3)
|
25
|
+
parser (>= 2.2.2.5, < 3.0)
|
26
|
+
powerpack (~> 0.1)
|
27
|
+
rainbow (>= 1.99.1, < 3.0)
|
28
|
+
ruby-progressbar (~> 1.4)
|
29
|
+
ruby-progressbar (1.7.5)
|
30
|
+
simplecov (0.10.0)
|
31
|
+
docile (~> 1.1.0)
|
32
|
+
json (~> 1.8)
|
33
|
+
simplecov-html (~> 0.10.0)
|
34
|
+
simplecov-html (0.10.0)
|
35
|
+
thread_safe (0.3.5)
|
36
|
+
tilia-uri (1.0.1)
|
37
|
+
activesupport (~> 4.2)
|
38
|
+
tzinfo (1.2.2)
|
39
|
+
thread_safe (~> 0.1)
|
40
|
+
yard (0.8.7.6)
|
41
|
+
|
42
|
+
PLATFORMS
|
43
|
+
ruby
|
44
|
+
|
45
|
+
DEPENDENCIES
|
46
|
+
activesupport (~> 4.2)
|
47
|
+
libxml-ruby (~> 2.8)
|
48
|
+
minitest (~> 5.8)
|
49
|
+
rake
|
50
|
+
rubocop (~> 0.34)
|
51
|
+
simplecov (~> 0.10)
|
52
|
+
tilia-uri (~> 1.0)
|
53
|
+
yard (~> 0.8)
|
54
|
+
|
55
|
+
BUNDLED WITH
|
56
|
+
1.10.6
|
data/LICENSE
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
Copyright (C) 2015 Jakob Sack (tilia@jakobsack.de)
|
2
|
+
|
3
|
+
All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
* Redistributions of source code must retain the above copyright notice,
|
9
|
+
this list of conditions and the following disclaimer.
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
* Neither the name Tilia nor the names of its contributors
|
14
|
+
may be used to endorse or promote products derived from this software
|
15
|
+
without specific prior written permission.
|
16
|
+
|
17
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
18
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
19
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
20
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
21
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
22
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
23
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
24
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
25
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
26
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/LICENSE.sabre
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
Copyright (C) 2009-2015 fruux GmbH (https://fruux.com/)
|
2
|
+
|
3
|
+
All rights reserved.
|
4
|
+
|
5
|
+
Redistribution and use in source and binary forms, with or without modification,
|
6
|
+
are permitted provided that the following conditions are met:
|
7
|
+
|
8
|
+
* Redistributions of source code must retain the above copyright notice,
|
9
|
+
this list of conditions and the following disclaimer.
|
10
|
+
* Redistributions in binary form must reproduce the above copyright notice,
|
11
|
+
this list of conditions and the following disclaimer in the documentation
|
12
|
+
and/or other materials provided with the distribution.
|
13
|
+
* Neither the name Sabre nor the names of its contributors
|
14
|
+
may be used to endorse or promote products derived from this software
|
15
|
+
without specific prior written permission.
|
16
|
+
|
17
|
+
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
18
|
+
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
19
|
+
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
20
|
+
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
21
|
+
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
22
|
+
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
23
|
+
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
24
|
+
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
25
|
+
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
26
|
+
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
27
|
+
POSSIBILITY OF SUCH DAMAGE.
|
data/README.md
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
tilia/xml
|
2
|
+
=========
|
3
|
+
|
4
|
+
[](https://travis-ci.org/tilia/tilia-xml)
|
5
|
+
|
6
|
+
**tilia/xml is a port of [sabre/xml](https://github.com/fruux/sabre-xml)**
|
7
|
+
|
8
|
+
The sabre/xml library is a specialized XML reader and writer.
|
9
|
+
|
10
|
+
|
11
|
+
Installation
|
12
|
+
------------
|
13
|
+
|
14
|
+
Simply add tilia-xml to your Gemfile and bundle it up:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'tilia-xml', '~> 1.2'
|
18
|
+
```
|
19
|
+
|
20
|
+
|
21
|
+
Contributing
|
22
|
+
------------
|
23
|
+
|
24
|
+
See [Contributing](CONTRIBUTING.md)
|
25
|
+
|
26
|
+
|
27
|
+
License
|
28
|
+
-------
|
29
|
+
|
30
|
+
tilia-xml is licensed under the terms of the [three-clause BSD-license](LICENSE).
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rubocop/rake_task'
|
4
|
+
require 'yard'
|
5
|
+
|
6
|
+
Rake::TestTask.new do |t|
|
7
|
+
t.test_files = Dir.glob('test/**/*_test.rb')
|
8
|
+
t.libs << 'test'
|
9
|
+
end
|
10
|
+
RuboCop::RakeTask.new do |t|
|
11
|
+
t.options = ['--format', 'html', '--out', 'coverage/rubocop.html']
|
12
|
+
end
|
13
|
+
YARD::Rake::YardocTask.new do |t|
|
14
|
+
t.files = ['lib/**/*.rb', '-', 'README.md']
|
15
|
+
end
|
16
|
+
|
17
|
+
task(default: :test)
|
@@ -0,0 +1,99 @@
|
|
1
|
+
module Tilia
|
2
|
+
module Xml
|
3
|
+
# Context Stack
|
4
|
+
#
|
5
|
+
# The Context maintains information about a document during either reading or
|
6
|
+
# writing.
|
7
|
+
#
|
8
|
+
# During this process, it may be neccesary to override this context
|
9
|
+
# information.
|
10
|
+
#
|
11
|
+
# This trait allows easy access to the context, and allows the end-user to
|
12
|
+
# override its settings for document fragments, and easily restore it again
|
13
|
+
# later.
|
14
|
+
module ContextStackTrait
|
15
|
+
# This is the element map. It contains a list of XML elements (in clark
|
16
|
+
# notation) as keys and PHP class names as values.
|
17
|
+
#
|
18
|
+
# The PHP class names must implement Sabre\Xml\Element.
|
19
|
+
#
|
20
|
+
# Values may also be a callable. In that case the function will be called
|
21
|
+
# directly.
|
22
|
+
#
|
23
|
+
# @return [Hash]
|
24
|
+
attr_accessor :element_map
|
25
|
+
|
26
|
+
# A context_uri pointing to the document being parsed / written.
|
27
|
+
# This uri may be used to resolve relative urls that may appear in the
|
28
|
+
# document.
|
29
|
+
#
|
30
|
+
# The reader and writer don't use this property, but as it's an extremely
|
31
|
+
# common use-case for parsing XML documents, it's added here as a
|
32
|
+
# convenience.
|
33
|
+
#
|
34
|
+
# @return [String]
|
35
|
+
attr_accessor :context_uri
|
36
|
+
|
37
|
+
# This is a list of namespaces that you want to give default prefixes.
|
38
|
+
#
|
39
|
+
# You must make sure you create this entire list before starting to write.
|
40
|
+
# They should be registered on the root element.
|
41
|
+
#
|
42
|
+
# @return [Hash]
|
43
|
+
attr_accessor :namespace_map
|
44
|
+
|
45
|
+
protected
|
46
|
+
|
47
|
+
# Backups of previous contexts.
|
48
|
+
#
|
49
|
+
# @return [Array]
|
50
|
+
attr_accessor :context_stack
|
51
|
+
|
52
|
+
public
|
53
|
+
|
54
|
+
# Create a new "context".
|
55
|
+
#
|
56
|
+
# This allows you to safely modify the element_map, context_uri or
|
57
|
+
# namespace_map. After you're done, you can restore the old data again
|
58
|
+
# with popContext.
|
59
|
+
#
|
60
|
+
# @return [void]
|
61
|
+
def push_context
|
62
|
+
dup_or_obj = lambda do |obj|
|
63
|
+
if obj.nil?
|
64
|
+
nil
|
65
|
+
elsif obj.is_a? Fixnum
|
66
|
+
obj
|
67
|
+
else
|
68
|
+
obj.dup
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
@context_stack << [
|
73
|
+
dup_or_obj.call(@element_map),
|
74
|
+
dup_or_obj.call(@context_uri),
|
75
|
+
dup_or_obj.call(@namespace_map)
|
76
|
+
]
|
77
|
+
end
|
78
|
+
|
79
|
+
# Restore the previous "context".
|
80
|
+
#
|
81
|
+
# @return [void]
|
82
|
+
def pop_context
|
83
|
+
(
|
84
|
+
@element_map,
|
85
|
+
@context_uri,
|
86
|
+
@namespace_map
|
87
|
+
) = @context_stack.pop
|
88
|
+
end
|
89
|
+
|
90
|
+
# TODO: document
|
91
|
+
def initialize_context_stack_attributes
|
92
|
+
@element_map = {}
|
93
|
+
@namespace_map = {}
|
94
|
+
@context_uri = ''
|
95
|
+
@context_stack = []
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
module Tilia
|
2
|
+
module Xml
|
3
|
+
module Element
|
4
|
+
# The Base XML element is the standard parser & generator that's used by the
|
5
|
+
# XML reader and writer.
|
6
|
+
#
|
7
|
+
# It spits out a simple PHP array structure during deserialization, that can
|
8
|
+
# also be directly injected back into Writer::write.
|
9
|
+
class Base
|
10
|
+
include Element
|
11
|
+
|
12
|
+
protected
|
13
|
+
|
14
|
+
# PHP value to serialize.
|
15
|
+
attr_accessor :value
|
16
|
+
|
17
|
+
public
|
18
|
+
|
19
|
+
# Constructor
|
20
|
+
#
|
21
|
+
# @param value
|
22
|
+
def initialize(value = nil)
|
23
|
+
@value = value
|
24
|
+
end
|
25
|
+
|
26
|
+
# The xml_serialize metod is called during xml writing.
|
27
|
+
#
|
28
|
+
# Use the writer argument to write its own xml serialization.
|
29
|
+
#
|
30
|
+
# An important note: do _not_ create a parent element. Any element
|
31
|
+
# implementing XmlSerializable should only ever write what's considered
|
32
|
+
# its 'inner xml'.
|
33
|
+
#
|
34
|
+
# The parent of the current element is responsible for writing a
|
35
|
+
# containing element.
|
36
|
+
#
|
37
|
+
# This allows serializers to be re-used for different element names.
|
38
|
+
#
|
39
|
+
# If you are opening new elements, you must also close them again.
|
40
|
+
#
|
41
|
+
# @param [Writer] writer
|
42
|
+
# @return [void]
|
43
|
+
def xml_serialize(writer)
|
44
|
+
writer.write(@value)
|
45
|
+
end
|
46
|
+
|
47
|
+
# The deserialize method is called during xml parsing.
|
48
|
+
#
|
49
|
+
# This method is called statictly, this is because in theory this method
|
50
|
+
# may be used as a type of constructor, or factory method.
|
51
|
+
#
|
52
|
+
# Often you want to return an instance of the current class, but you are
|
53
|
+
# free to return other data as well.
|
54
|
+
#
|
55
|
+
# Important note 2: You are responsible for advancing the reader to the
|
56
|
+
# next element. Not doing anything will result in a never-ending loop.
|
57
|
+
#
|
58
|
+
# If you just want to skip parsing for this element altogether, you can
|
59
|
+
# just call reader->next();
|
60
|
+
#
|
61
|
+
# reader->parseInnerTree() will parse the entire sub-tree, and advance to
|
62
|
+
# the next element.
|
63
|
+
#
|
64
|
+
# @param [Reader] reader
|
65
|
+
# @return mixed
|
66
|
+
def self.xml_deserialize(reader)
|
67
|
+
sub_tree = reader.parse_inner_tree
|
68
|
+
sub_tree
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Tilia
|
2
|
+
module Xml
|
3
|
+
module Element
|
4
|
+
# CDATA element.
|
5
|
+
#
|
6
|
+
# This element allows you to easily inject CDATA.
|
7
|
+
#
|
8
|
+
# Note that we strongly recommend avoiding CDATA nodes, unless you definitely
|
9
|
+
# know what you're doing, or you're working with unchangable systems that
|
10
|
+
# require CDATA.
|
11
|
+
class Cdata
|
12
|
+
include XmlSerializable
|
13
|
+
|
14
|
+
protected
|
15
|
+
|
16
|
+
# CDATA element value.
|
17
|
+
#
|
18
|
+
# @return [String]
|
19
|
+
attr_accessor :value
|
20
|
+
|
21
|
+
public
|
22
|
+
|
23
|
+
# Constructor
|
24
|
+
#
|
25
|
+
# @param [String] value
|
26
|
+
def initialize(value)
|
27
|
+
@value = value
|
28
|
+
end
|
29
|
+
|
30
|
+
# The xml_serialize metod is called during xml writing.
|
31
|
+
#
|
32
|
+
# Use the writer argument to write its own xml serialization.
|
33
|
+
#
|
34
|
+
# An important note: do _not_ create a parent element. Any element
|
35
|
+
# implementing XmlSerializble should only ever write what's considered
|
36
|
+
# its 'inner xml'.
|
37
|
+
#
|
38
|
+
# The parent of the current element is responsible for writing a
|
39
|
+
# containing element.
|
40
|
+
#
|
41
|
+
# This allows serializers to be re-used for different element names.
|
42
|
+
#
|
43
|
+
# If you are opening new elements, you must also close them again.
|
44
|
+
#
|
45
|
+
# @param [Writer] writer
|
46
|
+
# @return [void]
|
47
|
+
def xml_serialize(writer)
|
48
|
+
writer.write_cdata(@value)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|