xamplr 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES.txt +13 -0
- data/LICENSE +3 -0
- data/README.rdoc +26 -0
- data/README.rdoc.orig +118 -0
- data/Rakefile +85 -0
- data/VERSION.yml +4 -0
- data/examples/random-people-shared-addresses/Makefile +16 -0
- data/examples/random-people-shared-addresses/batch-load-users.rb +83 -0
- data/examples/random-people-shared-addresses/find-mentions.rb +47 -0
- data/examples/random-people-shared-addresses/find-people-by-address.rb +104 -0
- data/examples/random-people-shared-addresses/optimise.rb +16 -0
- data/examples/random-people-shared-addresses/people.rb +35 -0
- data/examples/random-people-shared-addresses/query.rb +75 -0
- data/examples/random-people-shared-addresses/query2.rb +73 -0
- data/examples/random-people-shared-addresses/random-names.csv +10000 -0
- data/examples/random-people-shared-addresses/settings.rb +3 -0
- data/examples/random-people-shared-addresses/what-to-query-on.rb +82 -0
- data/examples/random-people-shared-addresses/xampl-gen.rb +36 -0
- data/examples/random-people-shared-addresses/xml/people.xml +14 -0
- data/examples/random-people/Makefile +16 -0
- data/examples/random-people/batch-load-users.rb +61 -0
- data/examples/random-people/optimise.rb +16 -0
- data/examples/random-people/people.rb +22 -0
- data/examples/random-people/query.rb +73 -0
- data/examples/random-people/query2.rb +73 -0
- data/examples/random-people/random-names.csv +10000 -0
- data/examples/random-people/rawtc.rb +91 -0
- data/examples/random-people/settings.rb +3 -0
- data/examples/random-people/what-to-query-on.rb +80 -0
- data/examples/random-people/xampl-gen.rb +36 -0
- data/examples/random-people/xml/people.xml +11 -0
- data/examples/read-testing/Makefile +10 -0
- data/examples/read-testing/load.rb +65 -0
- data/examples/read-testing/read.rb +51 -0
- data/examples/read-testing/rrr.rb +87 -0
- data/examples/read-testing/settings.rb +2 -0
- data/examples/read-testing/xampl-gen.rb +36 -0
- data/examples/read-testing/xml/text.xml +8 -0
- data/examples/tokyo-cabinet-experimental/expt-query.rb +42 -0
- data/examples/tokyo-cabinet-experimental/expt-query2.rb +42 -0
- data/examples/tokyo-cabinet-experimental/expt-query3.rb +41 -0
- data/examples/tokyo-cabinet-experimental/expt-reader.rb +32 -0
- data/examples/tokyo-cabinet-experimental/expt.rb +61 -0
- data/examples/tokyo-cabinet-experimental/xampl-gen.rb +36 -0
- data/examples/tokyo-cabinet-experimental/xml/tcx.xml +6 -0
- data/lib/xampl-generator.rb +3 -0
- data/lib/xampl.rb +3 -0
- data/lib/xamplr-generator.rb +10 -0
- data/lib/xamplr.rb +37 -0
- data/lib/xamplr/README-POSSIBLE-PROBLEMS +5 -0
- data/lib/xamplr/TODO +1 -0
- data/lib/xamplr/exceptions.rb +97 -0
- data/lib/xamplr/from-xml-orig.rb +350 -0
- data/lib/xamplr/from-xml.rb +439 -0
- data/lib/xamplr/gen-elements.xml +6230 -0
- data/lib/xamplr/gen.elements.xml +108 -0
- data/lib/xamplr/generate-elements.rb +15 -0
- data/lib/xamplr/generator.rb +5 -0
- data/lib/xamplr/graphml-out.rb +470 -0
- data/lib/xamplr/handwritten/example.rb +698 -0
- data/lib/xamplr/handwritten/hand-example.rb +533 -0
- data/lib/xamplr/handwritten/test-handwritten.rb +873 -0
- data/lib/xamplr/indexed-array.rb +115 -0
- data/lib/xamplr/mixins.rb +397 -0
- data/lib/xamplr/my.gen.elements.xml +461 -0
- data/lib/xamplr/notifications.rb +57 -0
- data/lib/xamplr/obsolete/fsdb.rb +62 -0
- data/lib/xamplr/persist-to-xml.rb +249 -0
- data/lib/xamplr/persistence.rb +522 -0
- data/lib/xamplr/persistence.rb.more_thread_safe +771 -0
- data/lib/xamplr/persistence.rb.partially_thread_safe +763 -0
- data/lib/xamplr/persister.rb +310 -0
- data/lib/xamplr/persisters/caches.rb +186 -0
- data/lib/xamplr/persisters/caching.rb +172 -0
- data/lib/xamplr/persisters/filesystem.rb +60 -0
- data/lib/xamplr/persisters/in-memory.rb +180 -0
- data/lib/xamplr/persisters/simple.rb +59 -0
- data/lib/xamplr/persisters/tokyo-cabinet.rb +641 -0
- data/lib/xamplr/simpleTemplate/danger.rx +4 -0
- data/lib/xamplr/simpleTemplate/obsolete/input-c.r4 +35 -0
- data/lib/xamplr/simpleTemplate/obsolete/play.r6.txt +12 -0
- data/lib/xamplr/simpleTemplate/obsolete/play_more.r6.txt +20 -0
- data/lib/xamplr/simpleTemplate/obsolete/test001.r5 +8 -0
- data/lib/xamplr/simpleTemplate/obsolete/test002.r5 +13 -0
- data/lib/xamplr/simpleTemplate/obsolete/test003.r5 +37 -0
- data/lib/xamplr/simpleTemplate/old/r6.000.rb +122 -0
- data/lib/xamplr/simpleTemplate/old/r6.001.rb +145 -0
- data/lib/xamplr/simpleTemplate/play.r6 +12 -0
- data/lib/xamplr/simpleTemplate/play_more.r6 +20 -0
- data/lib/xamplr/simpleTemplate/play_noblanks.r6 +21 -0
- data/lib/xamplr/simpleTemplate/playq.r6 +16 -0
- data/lib/xamplr/simpleTemplate/r6.rb +87 -0
- data/lib/xamplr/simpleTemplate/simple-template.rb +75 -0
- data/lib/xamplr/templates/child.template +47 -0
- data/lib/xamplr/templates/child_indexed.template +89 -0
- data/lib/xamplr/templates/child_modules.template +5 -0
- data/lib/xamplr/templates/element_classes.template +11 -0
- data/lib/xamplr/templates/element_data.template +282 -0
- data/lib/xamplr/templates/element_empty.template +285 -0
- data/lib/xamplr/templates/element_mixed.template +277 -0
- data/lib/xamplr/templates/element_simple.template +276 -0
- data/lib/xamplr/templates/package.template +26 -0
- data/lib/xamplr/test-support/Makefile +47 -0
- data/lib/xamplr/test-support/bench-cache.rb +80 -0
- data/lib/xamplr/test-support/bench-script.rb +21 -0
- data/lib/xamplr/test-support/bench.rb +116 -0
- data/lib/xamplr/test-support/bench2.rb +132 -0
- data/lib/xamplr/test-support/test-cache.rb +147 -0
- data/lib/xamplr/test-support/test-data/binding.xml +7 -0
- data/lib/xamplr/test-support/test-data/example.xml +14 -0
- data/lib/xamplr/test-support/test-data/internationalization-utf8.txt +1 -0
- data/lib/xamplr/test-support/test-data/labels.xml +37 -0
- data/lib/xamplr/test-support/test-data/labels001.xml +38 -0
- data/lib/xamplr/test-support/test-deep-change.rb +135 -0
- data/lib/xamplr/test-support/test-elements.rb +109 -0
- data/lib/xamplr/test-support/test-indexed-array.rb +169 -0
- data/lib/xamplr/test-support/test-misc.rb +73 -0
- data/lib/xamplr/test-support/test-names.rb +67 -0
- data/lib/xamplr/test-support/test-rollback.rb +106 -0
- data/lib/xamplr/test-support/test.rb +1504 -0
- data/lib/xamplr/to-ruby.rb +220 -0
- data/lib/xamplr/to-xml.rb +158 -0
- data/lib/xamplr/version.rb +67 -0
- data/lib/xamplr/visitor.rb +140 -0
- data/lib/xamplr/visitors.rb +573 -0
- data/lib/xamplr/xampl-generator.rb +533 -0
- data/lib/xamplr/xampl-hand-generated.rb +1535 -0
- data/lib/xamplr/xampl-module.rb +36 -0
- data/lib/xamplr/xampl-object-internals.rb +6 -0
- data/lib/xamplr/xampl-object.rb +202 -0
- data/lib/xamplr/xampl-persisted-object.rb +122 -0
- data/lib/xamplr/xml-text.rb +117 -0
- data/lib/xamplr/xml/document.xml +7 -0
- data/lib/xamplr/xml/elements.xml +101 -0
- data/lib/xamplr/xml/elements000.xml +73 -0
- data/lib/xamplr/xml/example.xml +23 -0
- data/lib/xamplr/xml/options.xml +12 -0
- data/lib/xamplr/xml/uche.xml +38 -0
- data/lib/xamplr/yEd-sample.graphml +300 -0
- data/test/test_helper.rb +10 -0
- data/test/xamplr_test.rb +7 -0
- metadata +245 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
|
2
|
+
require "xamplr/persister"
|
3
|
+
|
4
|
+
|
5
|
+
module Xampl
|
6
|
+
|
7
|
+
@@xampl_extends_symbols = false
|
8
|
+
|
9
|
+
def Xampl.xampl_extends_symbols
|
10
|
+
@@xampl_extends_symbols
|
11
|
+
end
|
12
|
+
|
13
|
+
def Xampl.xampl_extends_symbols=(v)
|
14
|
+
@@xampl_extends_symbols = v
|
15
|
+
|
16
|
+
if @@xampl_extends_symbols then
|
17
|
+
Symbol.module_eval("include XamplExtensionsToRubyObjects")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class XamplLiteralRubyObject
|
22
|
+
def initialize(thing)
|
23
|
+
@thing = thing
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_xml(out="")
|
27
|
+
out << @thing.to_s
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
module XamplExtensionsToRubyObjects
|
32
|
+
def to_xml(out="")
|
33
|
+
out << self.to_s
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,202 @@
|
|
1
|
+
|
2
|
+
module Xampl
|
3
|
+
|
4
|
+
module XamplObject
|
5
|
+
attr_accessor :is_changed, :parents
|
6
|
+
|
7
|
+
@@preferred_ns_prefix = { "http://xampl.com/" => "xampl",
|
8
|
+
"http://xampl.com/generator" => "xampl-gen",
|
9
|
+
"http://www.w3.org/XML/1998/namespace" => "xml" }
|
10
|
+
|
11
|
+
def init_xampl_object
|
12
|
+
@parents = nil if not defined? @parents
|
13
|
+
@is_changed = false if not defined? @is_changed
|
14
|
+
end
|
15
|
+
|
16
|
+
def init_hook
|
17
|
+
end
|
18
|
+
|
19
|
+
def XamplObject.ns_preferred_prefix(ns, prefix)
|
20
|
+
@@preferred_ns_prefix[ns] = prefix unless @@preferred_ns_prefix.has_key?(ns)
|
21
|
+
end
|
22
|
+
|
23
|
+
def XamplObject.lookup_preferred_ns_prefix(ns)
|
24
|
+
@@preferred_ns_prefix[ns]
|
25
|
+
end
|
26
|
+
|
27
|
+
def persist_required
|
28
|
+
return false
|
29
|
+
end
|
30
|
+
|
31
|
+
def ignore_when_no_index
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
|
35
|
+
def invalidate
|
36
|
+
self.note_invalidate
|
37
|
+
self.persister.uncache(self) if self.persister
|
38
|
+
self.extend InvalidXampl
|
39
|
+
end
|
40
|
+
|
41
|
+
def invalid
|
42
|
+
return kind_of?(InvalidXampl)
|
43
|
+
end
|
44
|
+
|
45
|
+
def changes_accepted
|
46
|
+
ResetIsChanged.new.start(self)
|
47
|
+
end
|
48
|
+
|
49
|
+
def changed
|
50
|
+
unless Xampl.persister then
|
51
|
+
raise UnmanagedChange.new(self)
|
52
|
+
end
|
53
|
+
unless @is_changed then
|
54
|
+
@is_changed = true
|
55
|
+
@parents.each{ | parent | parent.changed } if nil != @parents
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def accessed
|
60
|
+
raise XamplIsInvalid.new(self) if invalid
|
61
|
+
end
|
62
|
+
|
63
|
+
def add_parent(xampl)
|
64
|
+
@parents = [] if (not defined? @parents) or (nil == @parents)
|
65
|
+
@parents << xampl
|
66
|
+
if Xampl.persister and self.persist_required and (nil == self.persister) then
|
67
|
+
Xampl.introduce_to_persister(self)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def init_attributes(attr_name, attr_namespace, attr_value)
|
72
|
+
return unless attr_name
|
73
|
+
|
74
|
+
attr_name.each_index do |i|
|
75
|
+
self.attributes.each do |attr_spec|
|
76
|
+
if (2 == attr_spec.size) then
|
77
|
+
if (attr_spec[1] == attr_name[i]) then
|
78
|
+
self.instance_variable_set(attr_spec[0], attr_value[i])
|
79
|
+
end
|
80
|
+
else
|
81
|
+
if ((attr_spec[1] == attr_name[i]) and (attr_spec[2] == attr_namespace[i])) then
|
82
|
+
self.instance_variable_set(attr_spec[0], attr_value[i])
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def compare_xampl(other)
|
90
|
+
accessed
|
91
|
+
other.accessed if other
|
92
|
+
return false unless self.class == other.class
|
93
|
+
return false unless self.children.size == other.children.size
|
94
|
+
self.children.zip(other.children).each do |c1, c2|
|
95
|
+
return false unless c1.class == c2.class
|
96
|
+
if c1.kind_of? String then
|
97
|
+
return false unless c1 == c2
|
98
|
+
else
|
99
|
+
return false unless c1.compare_xampl(c2)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
if (defined? self._content) and (defined? other._content) then
|
103
|
+
return false unless self._content == other._content
|
104
|
+
else
|
105
|
+
return false if (defined? self._content) or (defined? other._content)
|
106
|
+
end
|
107
|
+
return true
|
108
|
+
end
|
109
|
+
|
110
|
+
def ===(other)
|
111
|
+
accessed
|
112
|
+
other.accessed if other
|
113
|
+
return false unless self.class == other.class
|
114
|
+
return false unless self.children.size == other.children.size
|
115
|
+
self.children.zip(other.children).each do |c1, c2|
|
116
|
+
return false unless c1.class == c2.class
|
117
|
+
if c1.kind_of? String then
|
118
|
+
return false unless c1 == c2
|
119
|
+
else
|
120
|
+
return false unless c1 === c2
|
121
|
+
end
|
122
|
+
end
|
123
|
+
if (defined? self._content) and (defined? other._content) then
|
124
|
+
return false unless self._content == other._content
|
125
|
+
else
|
126
|
+
return false if (defined? self._content) or (defined? other._content)
|
127
|
+
end
|
128
|
+
return true
|
129
|
+
end
|
130
|
+
|
131
|
+
def to_ruby(mentions=nil)
|
132
|
+
accessed
|
133
|
+
return RubyPrinter.new(mentions).to_ruby(self)
|
134
|
+
end
|
135
|
+
|
136
|
+
module XamplRubyDefinition
|
137
|
+
@@proc = nil
|
138
|
+
|
139
|
+
def XamplRubyDefinition.build(target = nil)
|
140
|
+
xampl = nil
|
141
|
+
if @@proc then
|
142
|
+
local_proc = @@proc
|
143
|
+
@@proc = nil
|
144
|
+
xampl = local_proc.call(target)
|
145
|
+
@@proc = nil
|
146
|
+
else
|
147
|
+
xampl = XamplRubyDefinition.build_it(target)
|
148
|
+
end
|
149
|
+
|
150
|
+
return xampl
|
151
|
+
end
|
152
|
+
|
153
|
+
def build_it
|
154
|
+
nil
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
def XamplObject.from_string(string, target=nil)
|
159
|
+
return FromXML.new.parse_string(string, true, false, target)
|
160
|
+
|
161
|
+
# if '<' == string[0] then
|
162
|
+
# puts "XO.from_string XML ------------------------------------------------------"
|
163
|
+
# return FromXML.new.parse_string(string, true, false, target)
|
164
|
+
# else
|
165
|
+
# puts "XO.from_string RUBY ------------------------------------------------------"
|
166
|
+
# return XamplObject.from_ruby(string, target)
|
167
|
+
# end
|
168
|
+
end
|
169
|
+
|
170
|
+
def XamplObject.recover_from_string(string)
|
171
|
+
# return FromXML.new.realise_string(string)
|
172
|
+
return FromXML.new(true).parse_string(string, true, false, nil)
|
173
|
+
end
|
174
|
+
|
175
|
+
def XamplObject.from_ruby(ruby_string, target=nil)
|
176
|
+
eval(ruby_string, nil, "ruby_definition", 0)
|
177
|
+
target.load_needed = false if target
|
178
|
+
xampl = XamplRubyDefinition.build(target)
|
179
|
+
end
|
180
|
+
|
181
|
+
def persist(out="", mentions=nil, rules=nil)
|
182
|
+
persist_xml_new = PersistXML.new(out, mentions)
|
183
|
+
return persist_xml_new.start(self).done
|
184
|
+
end
|
185
|
+
|
186
|
+
def XamplObject.realise_from_xml_string(xml_string, target=nil, tokenise=true)
|
187
|
+
xampl = FromXML.new.realise_string(xml_string, tokenise, target)
|
188
|
+
return xampl
|
189
|
+
end
|
190
|
+
|
191
|
+
def XamplObject.from_xml_string(xml_string, tokenise=true)
|
192
|
+
return FromXML.new.parse_string(xml_string, tokenise)
|
193
|
+
end
|
194
|
+
|
195
|
+
def XamplObject.from_xml_file(file_name, tokenise=true)
|
196
|
+
return FromXML.new.parse(file_name, tokenise)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
end
|
202
|
+
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module Xampl
|
2
|
+
|
3
|
+
module XamplPersistedObject
|
4
|
+
include XamplObject
|
5
|
+
|
6
|
+
attr_reader :persister
|
7
|
+
attr_accessor :load_needed
|
8
|
+
|
9
|
+
def persist_required
|
10
|
+
return true
|
11
|
+
end
|
12
|
+
|
13
|
+
def accessed
|
14
|
+
raise XamplIsInvalid.new(self) if invalid
|
15
|
+
# TODO -- why do I need to get rid of this line, alternatively, why
|
16
|
+
# is this next line even there? Well, because accessed is now called
|
17
|
+
# differently. But???
|
18
|
+
#raise NoActivePersister unless @persister
|
19
|
+
|
20
|
+
if @load_needed and @persister then
|
21
|
+
raise NoActivePersister.new unless @persister
|
22
|
+
|
23
|
+
if nil == Xampl.persister then
|
24
|
+
#raise UnmanagedChange.new(self)
|
25
|
+
if not @persister.syncing then
|
26
|
+
Xampl.read_only(@persister) do
|
27
|
+
Xampl.lazy_load(self)
|
28
|
+
end
|
29
|
+
else
|
30
|
+
puts "LOAD NEEDED(2): REFUSED (persister: #{@persister.name})"
|
31
|
+
puts " pid: #{self.get_the_index} #{self}"
|
32
|
+
caller(0).each { | trace | puts " #{trace}"}
|
33
|
+
end
|
34
|
+
elsif Xampl.persister != @persister then
|
35
|
+
raise MixedPersisters.new(@persister, self)
|
36
|
+
elsif Xampl.persister == @persister then
|
37
|
+
if not @persister.syncing then
|
38
|
+
Xampl.lazy_load(self)
|
39
|
+
else
|
40
|
+
puts "LOAD NEEDED(3): REFUSED (persister: #{@persister.name})"
|
41
|
+
puts " pid: #{self.get_the_index} #{self}"
|
42
|
+
caller(0).each { | trace | puts " #{trace}"}
|
43
|
+
end
|
44
|
+
else
|
45
|
+
puts "LOAD NEEDED(4): REFUSED (persister: #{@persister.name})"
|
46
|
+
puts " pid: #{self.get_the_index} #{self}"
|
47
|
+
caller(0).each { | trace | puts " #{trace}"}
|
48
|
+
end
|
49
|
+
else
|
50
|
+
puts "LOAD NEEDED(5): REFUSED (persister: #{@persister})" if @load_needed
|
51
|
+
puts " pid: #{self.get_the_index} #{self}" if @load_needed
|
52
|
+
caller(0).each { | trace | puts " #{trace}"} if @load_needed
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def changed
|
57
|
+
#puts "CHANGED: is_changed #{@is_changed} xampl #{self}"
|
58
|
+
unless Xampl.persister then
|
59
|
+
raise UnmanagedChange.new(self)
|
60
|
+
end
|
61
|
+
if @persister then
|
62
|
+
if Xampl.persister != @persister then
|
63
|
+
raise UnmanagedChange.new(self)
|
64
|
+
end
|
65
|
+
if @persister.block_changes then
|
66
|
+
raise BlockedChange.new(self)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
unless @is_changed then
|
70
|
+
@is_changed = true
|
71
|
+
if @persister then
|
72
|
+
@persister.has_changed self
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def force_load
|
78
|
+
@load_needed = true
|
79
|
+
@is_changed = false
|
80
|
+
@persister.has_not_changed(self) if @persister
|
81
|
+
self.clear_non_persistent_index_attributes
|
82
|
+
methods = self.methods.grep(/init_.*_as_child/)
|
83
|
+
methods.each do |method_name|
|
84
|
+
self.send(method_name)
|
85
|
+
end
|
86
|
+
@children = []
|
87
|
+
end
|
88
|
+
|
89
|
+
def reset_contents
|
90
|
+
self.clear_non_persistent_index_attributes
|
91
|
+
self.methods.grep(/init_.*_as_child/).each do |method_name|
|
92
|
+
self.send(method_name)
|
93
|
+
end
|
94
|
+
@children = []
|
95
|
+
end
|
96
|
+
|
97
|
+
def introduce_persister(persister)
|
98
|
+
#accessed
|
99
|
+
if @persister and (@persister != persister) then
|
100
|
+
raise AlreadyKnownToPersister.new(self, persister)
|
101
|
+
end
|
102
|
+
@persister = persister
|
103
|
+
return true
|
104
|
+
end
|
105
|
+
|
106
|
+
def init_xampl_object
|
107
|
+
super
|
108
|
+
@persister = nil
|
109
|
+
@load_needed = false
|
110
|
+
if (Xampl.persister and Xampl.persister.automatic) then
|
111
|
+
Xampl.persister.introduce(self)
|
112
|
+
else
|
113
|
+
introduce_persister(nil)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def describe_yourself
|
118
|
+
nil
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
module Xampl
|
2
|
+
|
3
|
+
class XMLText
|
4
|
+
attr_accessor :namespaces, :prefix_ns_map, :ns, :first_text, :text
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@namespaces = []
|
8
|
+
@prefix_ns_map = {}
|
9
|
+
@first_text = nil
|
10
|
+
@text = nil
|
11
|
+
@ns = nil
|
12
|
+
end
|
13
|
+
|
14
|
+
def start_element(pp, depth)
|
15
|
+
@namespaces = {}
|
16
|
+
@namespaces[pp.namespace] = pp.namespace
|
17
|
+
|
18
|
+
depth += 1
|
19
|
+
|
20
|
+
if @first_text then
|
21
|
+
@text << "<" << pp.qname
|
22
|
+
|
23
|
+
pp.attributeCount.times do |i|
|
24
|
+
@text << " " << pp.attributeQName(i) << "='" << pp.attributeValue(i) << "'"
|
25
|
+
|
26
|
+
prefix = pp.attributePrefix(i)
|
27
|
+
if prefix then
|
28
|
+
@prefix_ns_map[prefix] = pp.attributeNamespace(i)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
else
|
32
|
+
@first_text = "<" << pp.qname
|
33
|
+
|
34
|
+
pp.attributeCount.times do |i|
|
35
|
+
@first_text << " " << pp.attributeQName(i) << "='" << pp.attributeValue(i) << "'"
|
36
|
+
|
37
|
+
prefix = pp.attributePrefix(i)
|
38
|
+
if prefix then
|
39
|
+
@prefix_ns_map[prefix] = pp.attributeNamespace(i)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
@text = ""
|
43
|
+
end
|
44
|
+
|
45
|
+
prefix = pp.prefix
|
46
|
+
if prefix then
|
47
|
+
@prefix_ns_map[prefix] = pp.namespace
|
48
|
+
end
|
49
|
+
|
50
|
+
if @ns != pp.namespace then
|
51
|
+
@text << " xmlns='" << pp.namespace << "'"
|
52
|
+
end
|
53
|
+
|
54
|
+
@text << ">"
|
55
|
+
|
56
|
+
return depth
|
57
|
+
end
|
58
|
+
|
59
|
+
def end_element(pp, depth)
|
60
|
+
depth -= 1
|
61
|
+
|
62
|
+
@text << "</"
|
63
|
+
@text << pp.prefix << ":" if pp.prefix
|
64
|
+
@text << pp.name << ">"
|
65
|
+
|
66
|
+
return depth
|
67
|
+
end
|
68
|
+
|
69
|
+
def to_s
|
70
|
+
@text
|
71
|
+
end
|
72
|
+
|
73
|
+
def to_xml(xml_printer=nil)
|
74
|
+
@text
|
75
|
+
end
|
76
|
+
|
77
|
+
def build(pp)
|
78
|
+
@namespaces = {}
|
79
|
+
@first_text = nil
|
80
|
+
@text = nil
|
81
|
+
|
82
|
+
depth = start_element(pp, 0)
|
83
|
+
|
84
|
+
while true
|
85
|
+
raise XamplException.new("unexpected end of document") if pp.endDocument?
|
86
|
+
|
87
|
+
case pp.nextEvent
|
88
|
+
when Xampl_PP::START_DOCUMENT
|
89
|
+
raise XamplException.new("unexpected start of document")
|
90
|
+
when Xampl_PP::END_DOCUMENT
|
91
|
+
raise XamplException.new("unexpected end of document")
|
92
|
+
when Xampl_PP::START_ELEMENT
|
93
|
+
depth = start_element(pp, depth)
|
94
|
+
when Xampl_PP::END_ELEMENT
|
95
|
+
depth = end_element(pp, depth)
|
96
|
+
break if depth <= 0
|
97
|
+
when Xampl_PP::TEXT, Xampl_PP::CDATA_SECTION, Xampl_PP::ENTITY_REF
|
98
|
+
@text << pp.text
|
99
|
+
#when Xampl_PP::IGNORABLE_WHITESPACE
|
100
|
+
#when Xampl_PP::PROCESSING_INSTRUCTION
|
101
|
+
#when Xampl_PP::COMMENT
|
102
|
+
#when Xampl_PP::DOCTYPE
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
@namespaces = @namespaces.keys
|
107
|
+
|
108
|
+
@prefix_ns_map.sort.each do |prefix, ns|
|
109
|
+
@first_text << " xmlns:" << prefix << "='" << ns << "'"
|
110
|
+
end
|
111
|
+
@first_text << @text
|
112
|
+
@text = @first_text
|
113
|
+
@first_text = nil
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|