-
Notifications
You must be signed in to change notification settings - Fork 1
/
source_builder.rb
85 lines (75 loc) · 2.71 KB
/
source_builder.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# Copyright (c) 2010 Net7 SRL, <http://www.netseven.it/>
# This Software is released under the terms of the MIT License
# See LICENSE.TXT for the full text of the license.
module TaliaCore
module ActiveSourceParts
module Xml
# Class to build source representations of ActiveSource objects. Talia
# uses a simple XML format to encode the Source Object. The format
# maps easily to a Hash as it is used for the new or write_attributes
# methods:
#
# <sources>
# <source>
# <attribute>
# <predicate>http://foobar/</predicate>
# <object>http://barbar/</object>
# </attribute>
# ...
# </source>
# <source>
# <attribute>
# <predicate>http://foobar/bar/</pedicate>
# <value>val</value>
# <object>http://some_url</object>
# <value>another</value>
# ...
# </attribute>
# ...
# </source>
# ...
# </sources>
#
# Also see the parent class, TaliaUtil::Xml::BaseBuilder, for more information
class SourceBuilder < TaliaUtil::Xml::BaseBuilder
# Builds the XML for a single source, and returns the result as
# a string
def self.build_source(source)
make_xml_string { |build| build.write_source(source) }
end
# Build the XML for a single source.
def write_source(source)
@builder.source do
source.attributes.each { |attrib, value| write_attribute(attrib, value) }
source.direct_predicates.each { |pred| write_attribute(pred, source[pred]) }
end
end
private
# Builds an attribute tag (with contents) in a source
def write_attribute(predicate, values)
predicate = predicate.respond_to?(:uri) ? predicate.uri.to_s : predicate.to_s
values = [ values ] unless(values.respond_to?(:each))
@builder.attribute do
@builder.predicate { @builder.text!(predicate) }
values.each { |val| write_target(val) }
end
end
# Writes a value or object tag, depeding on the target.
def write_target(target)
if(target.respond_to?(:uri))
@builder.object { @builder.text!(target.uri.to_s) }
else
@builder.value { @builder.text!(target.to_s) }
end
end
# Build the structure for the XML file and pass on to
# the given block
def build_structure
@builder.sources do
yield
end
end
end
end
end
end