rdf-rdfa 0.3.1.2 → 0.3.3
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.
- data/.yardopts +2 -1
- data/Gemfile +18 -0
- data/History.md +14 -1
- data/README +291 -0
- data/README.md +236 -36
- data/Rakefile +7 -27
- data/UNLICENSE +24 -0
- data/VERSION +1 -1
- data/etc/basic.html +1 -1
- data/etc/profile.html +40 -0
- data/example-files/payswarm.html +449 -0
- data/example-files/payswarm.n3 +86 -0
- data/lib/rdf/rdfa.rb +5 -0
- data/lib/rdf/rdfa/format.rb +8 -4
- data/lib/rdf/rdfa/patches/graph_properties.rb +34 -0
- data/lib/rdf/rdfa/patches/nokogiri_hacks.rb +6 -0
- data/lib/rdf/rdfa/patches/string_hacks.rb +9 -0
- data/lib/rdf/rdfa/profile.rb +65 -41
- data/lib/rdf/rdfa/profile/xhtml.rb +36 -0
- data/lib/rdf/rdfa/profile/xml.rb +45 -0
- data/lib/rdf/rdfa/reader.rb +168 -92
- data/lib/rdf/rdfa/writer.rb +822 -0
- data/lib/rdf/rdfa/writer/haml_templates.rb +306 -0
- data/rdf-rdfa.gemspec +77 -23
- data/script/intern_vocabulary +83 -0
- data/script/parse +62 -27
- data/script/tc +87 -37
- data/spec/.gitignore +1 -0
- data/spec/matchers.rb +89 -154
- data/spec/profile_spec.rb +36 -21
- data/spec/{rdfa_reader_spec.rb → reader_spec.rb} +86 -159
- data/spec/spec_helper.rb +6 -29
- data/spec/test_helper.rb +97 -0
- data/spec/writer_spec.rb +385 -0
- metadata +203 -37
- data/spec/html4-manifest.yml +0 -1749
- data/spec/html5-manifest.yml +0 -1749
- data/spec/rdfa_helper.rb +0 -257
- data/spec/svgtiny-manifest.yml +0 -37
- data/spec/xhtml-manifest.yml +0 -1749
data/.yardopts
CHANGED
data/Gemfile
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
source "http://rubygems.org"
|
2
|
+
gem 'addressable', '2.2.4'
|
3
|
+
gem 'rdf', :git => "https://github.com/gkellogg/rdf.git", :branch => "query-algebra"
|
4
|
+
gem 'haml', '>= 3.0.0'
|
5
|
+
gem 'nokogiri', '>= 1.3.3'
|
6
|
+
|
7
|
+
group :development do
|
8
|
+
gem 'open-uri-cached', '>= 0.0.3'
|
9
|
+
gem 'rdf-spec', :git => "https://github.com/gkellogg/rdf-spec.git", :branch => "query-algebra", :require => 'rdf/spec'
|
10
|
+
gem 'rdf-isomorphic', '>= 0.3.4', :require => 'rdf/isomorphic'
|
11
|
+
gem 'rdf-n3', '>= 0.3.1', :require => 'rdf/n3'
|
12
|
+
gem 'rspec', '>= 2.1.0'
|
13
|
+
gem 'sxp', :git => "https://github.com/gkellogg/sxp-ruby.git", :branch => "query-algebra"
|
14
|
+
gem 'sparql-algebra', :git => "https://github.com/gkellogg/sparql-algebra.git", :require => 'sparql/algebra'
|
15
|
+
gem 'sparql-grammar', :git => "https://github.com/gkellogg/sparql-grammar.git", :require => 'sparql/grammar'
|
16
|
+
gem 'spira', '>= 0.0.12'
|
17
|
+
gem 'yard', '>= 0.6.4'
|
18
|
+
end
|
data/History.md
CHANGED
@@ -1,5 +1,18 @@
|
|
1
|
+
### 0.3.3
|
2
|
+
* Major update to writer using Haml templates, rather than Nokogiri node creation.
|
3
|
+
|
4
|
+
### 0.3.2
|
5
|
+
* Added RDFa Writer, to perform templated serialization of RDF content to RDFa.
|
6
|
+
* Uses Haml to define default and minimal templates for RDFa serialization.
|
7
|
+
* Allows templates to be specified on invocation, for arbitrary RDFa serialization.
|
8
|
+
* Update to pre-LC2 drafts of RDFa
|
9
|
+
* Add support for cached profiles, and include cached profiles for XML+RDFa and XHTML+RDFa.
|
10
|
+
* Profiles are processed left to right
|
11
|
+
* Detect 1.0 using @version
|
12
|
+
* Automatically load profiles based on host language
|
13
|
+
|
1
14
|
### 0.3.1.2
|
2
|
-
* Assert :html and xhtml as a format types (by creating RDF::RDFa::HTML/XHTML as a sub-
|
15
|
+
* Assert :html and xhtml as a format types (by creating RDF::RDFa::HTML/XHTML as a sub-class of Format that uses RDFa::Reader/Writer)
|
3
16
|
* Added :svg format, image/svg+xml and .svg as looks for RDFa parser as well.
|
4
17
|
|
5
18
|
### 0.3.1
|
data/README
ADDED
@@ -0,0 +1,291 @@
|
|
1
|
+
# RDF::RDFa reader/writer
|
2
|
+
|
3
|
+
[RDFa][RDFa 1.1 Core] parser for RDF.rb.
|
4
|
+
|
5
|
+
## DESCRIPTION
|
6
|
+
RDF::RDFa is an RDFa reader and writer for Ruby using the [RDF.rb][RDF.rb] library suite.
|
7
|
+
|
8
|
+
## FEATURES
|
9
|
+
RDF::RDFa parses [RDFa][RDFa 1.1 Core] into statements or triples.
|
10
|
+
|
11
|
+
* Fully compliant RDFa 1.1 parser.
|
12
|
+
* Template-based Writer to generate XHTML+RDFa.
|
13
|
+
* Writer uses user-replacable [Haml][Haml]-based templates to generate RDFa.
|
14
|
+
* Uses Nokogiri for parsing HTML/SVG
|
15
|
+
* [RDFa tests][RDFa-test-suite] use SPARQL for most tests due to Rasqal limitations. Other tests compare directly against N-triples.
|
16
|
+
|
17
|
+
Install with 'gem install rdf-rdfa'
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
### Reading RDF data in the RDFa format
|
22
|
+
|
23
|
+
RDF::RDFa::Reader.open("etc/foaf.html") do |reader|
|
24
|
+
reader.each_statement do |statement|
|
25
|
+
puts statement.inspect
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
### Writing RDF data using the XHTML+RDFa format
|
30
|
+
|
31
|
+
require 'rdf/rdfa'
|
32
|
+
|
33
|
+
RDF::RDFa::Writer.open("hello.html") do |writer|
|
34
|
+
writer << RDF::Graph.new do |graph|
|
35
|
+
graph << [:hello, RDF::DC.title, "Hello, world!"]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Note that prefixes may be chained between Reader and Writer, so that the Writer will
|
40
|
+
use the same prefix definitions found during parsing:
|
41
|
+
|
42
|
+
prefixes = {}
|
43
|
+
graph = RDF::Graph.load("etc/foaf.html", :prefixes => prefixes)
|
44
|
+
puts graph.dump(:rdfa, :prefixes => prefixes)
|
45
|
+
|
46
|
+
### Template-based Writer
|
47
|
+
The RDFa writer uses [Haml][Haml] templates for code generation. This allows fully customizable
|
48
|
+
RDFa output in a variety of host languages. The [default template]({RDF::RDFa::Writer::DEFAULT_HAML})
|
49
|
+
generates human readable HTML5 output. A [minimal template]({RDF::RDFa::Writer::MIN_HAML})
|
50
|
+
generates HTML, which is not intended for human consumption.
|
51
|
+
|
52
|
+
To specify an alternative Haml template, consider the following:
|
53
|
+
|
54
|
+
require 'rdf/rdfa'
|
55
|
+
|
56
|
+
RDF::RDFa::Writer.buffer(:haml => RDF::RDFa::Writer::MIN_HAML) << graph
|
57
|
+
|
58
|
+
The template hash defines four Haml templates:
|
59
|
+
|
60
|
+
* _doc_: Document Template, takes an ordered list of _subject_s and yields each one to be rendered.
|
61
|
+
Described further in {RDF::RDFa::Writer#render_document}.
|
62
|
+
|
63
|
+
!!! XML
|
64
|
+
!!! 5
|
65
|
+
%html{:xmlns => "http://www.w3.org/1999/xhtml", :lang => lang, :profile => profile, :prefix => prefix}
|
66
|
+
- if base || title
|
67
|
+
%head
|
68
|
+
- if base
|
69
|
+
%base{:href => base}
|
70
|
+
- if title
|
71
|
+
%title= title
|
72
|
+
%body
|
73
|
+
- subjects.each do |subject|
|
74
|
+
!= yield(subject)
|
75
|
+
|
76
|
+
This template takes locals _lang_, _profile_, _prefix_, _base_, _title_ in addition to _subjects_
|
77
|
+
to create output similar to the following:
|
78
|
+
|
79
|
+
<!DOCTYPE html>
|
80
|
+
<html prefix='xhv: http://www.w3.org/1999/xhtml/vocab#' xmlns='http://www.w3.org/1999/xhtml'>
|
81
|
+
<head>
|
82
|
+
<base href="http://example/">
|
83
|
+
<title>Document Title</title>
|
84
|
+
</head>
|
85
|
+
<body>
|
86
|
+
...
|
87
|
+
</body>
|
88
|
+
</html>
|
89
|
+
|
90
|
+
Options passed to the Writer are used to supply _lang_, _profile_ and _base_ locals.
|
91
|
+
_prefix_ is generated based upon prefixes found from default or supplied profiles, as well
|
92
|
+
as those provided by a previous Reader. _title_ is taken from the first top-level subject
|
93
|
+
having an appropriate title property (as defined by the _heading_predicates_ option).
|
94
|
+
|
95
|
+
* _subject_: Subject Template, take a _subject_ and an order list of _predicate_s and yields
|
96
|
+
each _predicate_ to be rendered. Described further in {RDF::RDFa::Writer#render_subject}.
|
97
|
+
|
98
|
+
- if element == :li
|
99
|
+
%li{:about => get_curie(subject), :typeof => typeof}
|
100
|
+
- if typeof
|
101
|
+
%span.type!= typeof
|
102
|
+
- predicates.each do |predicate|
|
103
|
+
!= yield(predicate)
|
104
|
+
- elsif rel && typeof
|
105
|
+
%div{:rel => get_curie(rel)}
|
106
|
+
%div{:about => get_curie(subject), :typeof => typeof}
|
107
|
+
%span.type!= typeof
|
108
|
+
- predicates.each do |predicate|
|
109
|
+
!= yield(predicate)
|
110
|
+
- elsif rel
|
111
|
+
%div{:rel => get_curie(rel), :resource => get_curie(subject)}
|
112
|
+
- predicates.each do |predicate|
|
113
|
+
!= yield(predicate)
|
114
|
+
- else
|
115
|
+
%div{:about => get_curie(subject), :typeof => typeof}
|
116
|
+
- if typeof
|
117
|
+
%span.type!= typeof
|
118
|
+
- predicates.each do |predicate|
|
119
|
+
!= yield(predicate)
|
120
|
+
|
121
|
+
The template takes locals _rel_ and _typeof_ in addition to _predicates_ and _subject_ to
|
122
|
+
create output similar to the following:
|
123
|
+
|
124
|
+
<div about="http://example/">
|
125
|
+
...
|
126
|
+
</div>
|
127
|
+
|
128
|
+
Note that if _typeof_ is defined, in this template, it will generate a textual description.
|
129
|
+
|
130
|
+
* _property\_value_: Property Value Template, used for predicates having a single value; takes
|
131
|
+
a _predicate_, and a single-valued Array of _objects_. Described further in {RDF::RDFa::Writer#render\_property}.
|
132
|
+
|
133
|
+
- object = objects.first
|
134
|
+
- if heading_predicates.include?(predicate) && object.literal?
|
135
|
+
%h1{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}&= get_value(object)
|
136
|
+
- else
|
137
|
+
%div.property
|
138
|
+
%span.label
|
139
|
+
= get_predicate_name(predicate)
|
140
|
+
- if res = yield(object)
|
141
|
+
!= res
|
142
|
+
- elsif object.node?
|
143
|
+
%span{:resource => get_curie(object), :rel => get_curie(predicate)}= get_curie(object)
|
144
|
+
- elsif object.uri?
|
145
|
+
%a{:href => object.to_s, :rel => get_curie(predicate)}= object.to_s
|
146
|
+
- elsif object.datatype == RDF.XMLLiteral
|
147
|
+
%span{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_dt_curie(object)}<!= get_value(object)
|
148
|
+
- else
|
149
|
+
%span{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}&= get_value(object)
|
150
|
+
|
151
|
+
In addition to _predicate_ and _objects_, the template takes locals _property_ and/or _rel_, which are
|
152
|
+
copies of _predicate_ and indicate use in the @property or @rel attributes. Either or both may be
|
153
|
+
specified, as the conditions dictate.
|
154
|
+
|
155
|
+
Also, if the predicate is identified as a _heading predicate_ (via _:heading\_predicates_ option),
|
156
|
+
it will generate a heading element, and may use the value as the document title.
|
157
|
+
|
158
|
+
Each _object_ is yielded to the calling block, and the result is rendered, unless nil.
|
159
|
+
Otherwise, rendering depends on the type of _object_. This is useful for recursive document
|
160
|
+
descriptions.
|
161
|
+
|
162
|
+
Creates output similar to the following:
|
163
|
+
|
164
|
+
<div class='property'>
|
165
|
+
<span class='label'>
|
166
|
+
xhv:alternate
|
167
|
+
</span>
|
168
|
+
<a href='http://rdfa.info/feed/' rel='xhv:alternate'>http://rdfa.info/feed/</a>
|
169
|
+
</div>
|
170
|
+
|
171
|
+
Note the use of methods defined in {RDF::RDFa::Writer} useful in rendering the output.
|
172
|
+
|
173
|
+
* _property\_values_: Similar to _property\_value_, but for predicates having more than one value.
|
174
|
+
Locals are identical to _property\_values_, but _objects_ is expected to have more than one value.
|
175
|
+
|
176
|
+
%div.property
|
177
|
+
%span.label
|
178
|
+
= get_predicate_name(predicate)
|
179
|
+
%ul{:rel => (get_curie(rel) if rel), :property => (get_curie(property) if property)}
|
180
|
+
- objects.each do |object|
|
181
|
+
- if res = yield(object)
|
182
|
+
!= res
|
183
|
+
- elsif object.node?
|
184
|
+
%li{:resource => get_curie(object)}= get_curie(object)
|
185
|
+
- elsif object.uri?
|
186
|
+
%li
|
187
|
+
%a{:href => object.to_s}= object.to_s
|
188
|
+
- elsif object.datatype == RDF.XMLLiteral
|
189
|
+
%li{:lang => get_lang(object), :datatype => get_curie(object.datatype)}<!= get_value(object)
|
190
|
+
- else
|
191
|
+
%li{:content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}&= get_value(object)
|
192
|
+
|
193
|
+
In this case, and unordered list is used for output. Creates output similar to the following:
|
194
|
+
|
195
|
+
<div class='property'>
|
196
|
+
<span class='label'>
|
197
|
+
xhv:bookmark
|
198
|
+
</span>
|
199
|
+
<ul rel='xhv:bookmark'>
|
200
|
+
<li>
|
201
|
+
<a href='http://rdfa.info/2009/12/12/oreilly-catalog-uses-rdfa/'>
|
202
|
+
http://rdfa.info/2009/12/12/oreilly-catalog-uses-rdfa/
|
203
|
+
</a>
|
204
|
+
</li>
|
205
|
+
<a href='http://rdfa.info/2010/05/31/new-rdfa-checker/'>
|
206
|
+
http://rdfa.info/2010/05/31/new-rdfa-checker/
|
207
|
+
</a>
|
208
|
+
</li>
|
209
|
+
</ul>
|
210
|
+
</div>
|
211
|
+
|
212
|
+
## Dependencies
|
213
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.1)
|
214
|
+
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
|
215
|
+
* [Haml](https://rubygems.org/gems/haml) (>= 3.0.0)
|
216
|
+
|
217
|
+
## Documentation
|
218
|
+
Full documentation available on [RubyForge](http://rdf.rubyforge.org/rdfa)
|
219
|
+
|
220
|
+
### Principle Classes
|
221
|
+
* {RDF::RDFa::Format}
|
222
|
+
* {RDF::RDFa::HTML}
|
223
|
+
Asserts :html format, text/html mime-type and .html file extension.
|
224
|
+
* {RDF::RDFa::XHTML}
|
225
|
+
Asserts :html format, application/xhtml+xml mime-type and .xhtml file extension.
|
226
|
+
* {RDF::RDFa::SVG}
|
227
|
+
Asserts :svg format, image/svg+xml mime-type and .svg file extension.
|
228
|
+
* {RDF::RDFa::Reader}
|
229
|
+
* {RDF::RDFa::Profile}
|
230
|
+
* {RDF::RDFa::Writer}
|
231
|
+
|
232
|
+
### Additional vocabularies
|
233
|
+
* {RDF::PTR}
|
234
|
+
* {RDF::RDFA}
|
235
|
+
* {RDF::XHV}
|
236
|
+
* {RDF::XML}
|
237
|
+
* {RDF::XSI}
|
238
|
+
|
239
|
+
## TODO
|
240
|
+
* Add support for LibXML and REXML bindings, and use the best available
|
241
|
+
* Consider a SAX-based parser for improved performance
|
242
|
+
|
243
|
+
## Resources
|
244
|
+
* [RDF.rb][RDF.rb]
|
245
|
+
* [Distiller](http://distiller.kellogg-assoc)
|
246
|
+
* [Documentation](http://rdf.rubyforge.org/rdfa)
|
247
|
+
* [History](file:file.History.html)
|
248
|
+
* [RDFa 1.1 Core][RDFa 1.1 Core]
|
249
|
+
* [XHTML+RDFa 1.1][XHTML+RDFa 1.1]
|
250
|
+
* [RDFa-test-suite](http://rdfa.digitalbazaar.com/test-suite/ "RDFa test suite")
|
251
|
+
|
252
|
+
## Author
|
253
|
+
* [Gregg Kellogg](http://github.com/gkellogg) - <http://kellogg-assoc.com/>
|
254
|
+
|
255
|
+
## Contributors
|
256
|
+
* [Nicholas Humfrey](http://github.com/njh)
|
257
|
+
|
258
|
+
## Contributing
|
259
|
+
|
260
|
+
* Do your best to adhere to the existing coding conventions and idioms.
|
261
|
+
* Don't use hard tabs, and don't leave trailing whitespace on any line.
|
262
|
+
* Do document every method you add using [YARD][] annotations. Read the
|
263
|
+
[tutorial][YARD-GS] or just look at the existing code for examples.
|
264
|
+
* Don't touch the `.gemspec`, `VERSION` or `AUTHORS` files. If you need to
|
265
|
+
change them, do so on your private branch only.
|
266
|
+
* Do feel free to add yourself to the `CREDITS` file and the corresponding
|
267
|
+
list in the the `README`. Alphabetical order applies.
|
268
|
+
* Do note that in order for us to merge any non-trivial changes (as a rule
|
269
|
+
of thumb, additions larger than about 15 lines of code), we need an
|
270
|
+
explicit [public domain dedication][PDD] on record from you.
|
271
|
+
|
272
|
+
## License
|
273
|
+
|
274
|
+
This is free and unencumbered public domain software. For more information,
|
275
|
+
see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
276
|
+
|
277
|
+
## FEEDBACK
|
278
|
+
|
279
|
+
* gregg@kellogg-assoc.com
|
280
|
+
* <http://rubygems.org/rdf-rdfa>
|
281
|
+
* <http://github.com/gkellogg/rdf-rdfa>
|
282
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
283
|
+
|
284
|
+
[RDF.rb]: http://rdf.rubyforge.org/
|
285
|
+
[YARD]: http://yardoc.org/
|
286
|
+
[YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
287
|
+
[PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
|
288
|
+
[RDFa 1.1 Core]: http://www.w3.org/TR/2010/WD-rdfa-core-20100422/ "RDFa 1.1 Core"
|
289
|
+
[XHTML+RDFa 1.1]: http://www.w3.org/TR/2010/WD-xhtml-rdfa-20100422/ "XHTML+RDFa 1.1"
|
290
|
+
[RDFa-test-suite]: http://rdfa.digitalbazaar.com/test-suite/ "RDFa test suite"
|
291
|
+
[Haml]: http://haml-lang.com/
|
data/README.md
CHANGED
@@ -1,21 +1,24 @@
|
|
1
1
|
# RDF::RDFa reader/writer
|
2
2
|
|
3
|
-
RDFa parser for RDF.rb.
|
3
|
+
[RDFa][RDFa 1.1 Core] parser for RDF.rb.
|
4
4
|
|
5
5
|
## DESCRIPTION
|
6
|
-
RDF::RDFa is an RDFa reader for Ruby using the [RDF.rb]
|
6
|
+
RDF::RDFa is an RDFa reader and writer for Ruby using the [RDF.rb][RDF.rb] library suite.
|
7
7
|
|
8
8
|
## FEATURES
|
9
|
-
RDF::RDFa parses RDFa into statements or triples.
|
9
|
+
RDF::RDFa parses [RDFa][RDFa 1.1 Core] into statements or triples.
|
10
10
|
|
11
|
-
* Fully compliant
|
12
|
-
*
|
13
|
-
*
|
11
|
+
* Fully compliant RDFa 1.1 parser.
|
12
|
+
* Template-based Writer to generate XHTML+RDFa.
|
13
|
+
* Writer uses user-replacable [Haml][Haml]-based templates to generate RDFa.
|
14
|
+
* Uses Nokogiri for parsing HTML/SVG
|
15
|
+
* [RDFa tests][RDFa-test-suite] use SPARQL for most tests due to Rasqal limitations. Other tests compare directly against N-triples.
|
14
16
|
|
15
17
|
Install with 'gem install rdf-rdfa'
|
16
18
|
|
17
19
|
## Usage
|
18
|
-
|
20
|
+
|
21
|
+
### Reading RDF data in the RDFa format
|
19
22
|
|
20
23
|
RDF::RDFa::Reader.open("etc/foaf.html") do |reader|
|
21
24
|
reader.each_statement do |statement|
|
@@ -23,17 +26,208 @@ Instantiate a parser and parse source, specifying type and base-URL
|
|
23
26
|
end
|
24
27
|
end
|
25
28
|
|
29
|
+
### Writing RDF data using the XHTML+RDFa format
|
30
|
+
|
31
|
+
require 'rdf/rdfa'
|
32
|
+
|
33
|
+
RDF::RDFa::Writer.open("hello.html") do |writer|
|
34
|
+
writer << RDF::Graph.new do |graph|
|
35
|
+
graph << [:hello, RDF::DC.title, "Hello, world!"]
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
Note that prefixes may be chained between Reader and Writer, so that the Writer will
|
40
|
+
use the same prefix definitions found during parsing:
|
41
|
+
|
42
|
+
prefixes = {}
|
43
|
+
graph = RDF::Graph.load("etc/foaf.html", :prefixes => prefixes)
|
44
|
+
puts graph.dump(:rdfa, :prefixes => prefixes)
|
45
|
+
|
46
|
+
### Template-based Writer
|
47
|
+
The RDFa writer uses [Haml][Haml] templates for code generation. This allows fully customizable
|
48
|
+
RDFa output in a variety of host languages. The [default template]({RDF::RDFa::Writer::DEFAULT_HAML})
|
49
|
+
generates human readable HTML5 output. A [minimal template]({RDF::RDFa::Writer::MIN_HAML})
|
50
|
+
generates HTML, which is not intended for human consumption.
|
51
|
+
|
52
|
+
To specify an alternative Haml template, consider the following:
|
53
|
+
|
54
|
+
require 'rdf/rdfa'
|
55
|
+
|
56
|
+
RDF::RDFa::Writer.buffer(:haml => RDF::RDFa::Writer::MIN_HAML) << graph
|
57
|
+
|
58
|
+
The template hash defines four Haml templates:
|
59
|
+
|
60
|
+
* _doc_: Document Template, takes an ordered list of _subject_s and yields each one to be rendered.
|
61
|
+
Described further in {RDF::RDFa::Writer#render_document}.
|
62
|
+
|
63
|
+
!!! XML
|
64
|
+
!!! 5
|
65
|
+
%html{:xmlns => "http://www.w3.org/1999/xhtml", :lang => lang, :profile => profile, :prefix => prefix}
|
66
|
+
- if base || title
|
67
|
+
%head
|
68
|
+
- if base
|
69
|
+
%base{:href => base}
|
70
|
+
- if title
|
71
|
+
%title= title
|
72
|
+
%body
|
73
|
+
- subjects.each do |subject|
|
74
|
+
!= yield(subject)
|
75
|
+
|
76
|
+
This template takes locals _lang_, _profile_, _prefix_, _base_, _title_ in addition to _subjects_
|
77
|
+
to create output similar to the following:
|
78
|
+
|
79
|
+
<!DOCTYPE html>
|
80
|
+
<html prefix='xhv: http://www.w3.org/1999/xhtml/vocab#' xmlns='http://www.w3.org/1999/xhtml'>
|
81
|
+
<head>
|
82
|
+
<base href="http://example/">
|
83
|
+
<title>Document Title</title>
|
84
|
+
</head>
|
85
|
+
<body>
|
86
|
+
...
|
87
|
+
</body>
|
88
|
+
</html>
|
89
|
+
|
90
|
+
Options passed to the Writer are used to supply _lang_, _profile_ and _base_ locals.
|
91
|
+
_prefix_ is generated based upon prefixes found from default or supplied profiles, as well
|
92
|
+
as those provided by a previous Reader. _title_ is taken from the first top-level subject
|
93
|
+
having an appropriate title property (as defined by the _heading_predicates_ option).
|
94
|
+
|
95
|
+
* _subject_: Subject Template, take a _subject_ and an order list of _predicate_s and yields
|
96
|
+
each _predicate_ to be rendered. Described further in {RDF::RDFa::Writer#render_subject}.
|
97
|
+
|
98
|
+
- if element == :li
|
99
|
+
%li{:about => get_curie(subject), :typeof => typeof}
|
100
|
+
- if typeof
|
101
|
+
%span.type!= typeof
|
102
|
+
- predicates.each do |predicate|
|
103
|
+
!= yield(predicate)
|
104
|
+
- elsif rel && typeof
|
105
|
+
%div{:rel => get_curie(rel)}
|
106
|
+
%div{:about => get_curie(subject), :typeof => typeof}
|
107
|
+
%span.type!= typeof
|
108
|
+
- predicates.each do |predicate|
|
109
|
+
!= yield(predicate)
|
110
|
+
- elsif rel
|
111
|
+
%div{:rel => get_curie(rel), :resource => get_curie(subject)}
|
112
|
+
- predicates.each do |predicate|
|
113
|
+
!= yield(predicate)
|
114
|
+
- else
|
115
|
+
%div{:about => get_curie(subject), :typeof => typeof}
|
116
|
+
- if typeof
|
117
|
+
%span.type!= typeof
|
118
|
+
- predicates.each do |predicate|
|
119
|
+
!= yield(predicate)
|
120
|
+
|
121
|
+
The template takes locals _rel_ and _typeof_ in addition to _predicates_ and _subject_ to
|
122
|
+
create output similar to the following:
|
123
|
+
|
124
|
+
<div about="http://example/">
|
125
|
+
...
|
126
|
+
</div>
|
127
|
+
|
128
|
+
Note that if _typeof_ is defined, in this template, it will generate a textual description.
|
129
|
+
|
130
|
+
* _property\_value_: Property Value Template, used for predicates having a single value; takes
|
131
|
+
a _predicate_, and a single-valued Array of _objects_. Described further in {RDF::RDFa::Writer#render\_property}.
|
132
|
+
|
133
|
+
- object = objects.first
|
134
|
+
- if heading_predicates.include?(predicate) && object.literal?
|
135
|
+
%h1{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}&= get_value(object)
|
136
|
+
- else
|
137
|
+
%div.property
|
138
|
+
%span.label
|
139
|
+
= get_predicate_name(predicate)
|
140
|
+
- if res = yield(object)
|
141
|
+
!= res
|
142
|
+
- elsif object.node?
|
143
|
+
%span{:resource => get_curie(object), :rel => get_curie(predicate)}= get_curie(object)
|
144
|
+
- elsif object.uri?
|
145
|
+
%a{:href => object.to_s, :rel => get_curie(predicate)}= object.to_s
|
146
|
+
- elsif object.datatype == RDF.XMLLiteral
|
147
|
+
%span{:property => get_curie(predicate), :lang => get_lang(object), :datatype => get_dt_curie(object)}<!= get_value(object)
|
148
|
+
- else
|
149
|
+
%span{:property => get_curie(predicate), :content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}&= get_value(object)
|
150
|
+
|
151
|
+
In addition to _predicate_ and _objects_, the template takes locals _property_ and/or _rel_, which are
|
152
|
+
copies of _predicate_ and indicate use in the @property or @rel attributes. Either or both may be
|
153
|
+
specified, as the conditions dictate.
|
154
|
+
|
155
|
+
Also, if the predicate is identified as a _heading predicate_ (via _:heading\_predicates_ option),
|
156
|
+
it will generate a heading element, and may use the value as the document title.
|
157
|
+
|
158
|
+
Each _object_ is yielded to the calling block, and the result is rendered, unless nil.
|
159
|
+
Otherwise, rendering depends on the type of _object_. This is useful for recursive document
|
160
|
+
descriptions.
|
161
|
+
|
162
|
+
Creates output similar to the following:
|
163
|
+
|
164
|
+
<div class='property'>
|
165
|
+
<span class='label'>
|
166
|
+
xhv:alternate
|
167
|
+
</span>
|
168
|
+
<a href='http://rdfa.info/feed/' rel='xhv:alternate'>http://rdfa.info/feed/</a>
|
169
|
+
</div>
|
170
|
+
|
171
|
+
Note the use of methods defined in {RDF::RDFa::Writer} useful in rendering the output.
|
172
|
+
|
173
|
+
* _property\_values_: Similar to _property\_value_, but for predicates having more than one value.
|
174
|
+
Locals are identical to _property\_values_, but _objects_ is expected to have more than one value.
|
175
|
+
|
176
|
+
%div.property
|
177
|
+
%span.label
|
178
|
+
= get_predicate_name(predicate)
|
179
|
+
%ul{:rel => (get_curie(rel) if rel), :property => (get_curie(property) if property)}
|
180
|
+
- objects.each do |object|
|
181
|
+
- if res = yield(object)
|
182
|
+
!= res
|
183
|
+
- elsif object.node?
|
184
|
+
%li{:resource => get_curie(object)}= get_curie(object)
|
185
|
+
- elsif object.uri?
|
186
|
+
%li
|
187
|
+
%a{:href => object.to_s}= object.to_s
|
188
|
+
- elsif object.datatype == RDF.XMLLiteral
|
189
|
+
%li{:lang => get_lang(object), :datatype => get_curie(object.datatype)}<!= get_value(object)
|
190
|
+
- else
|
191
|
+
%li{:content => get_content(object), :lang => get_lang(object), :datatype => get_dt_curie(object)}&= get_value(object)
|
192
|
+
|
193
|
+
In this case, and unordered list is used for output. Creates output similar to the following:
|
194
|
+
|
195
|
+
<div class='property'>
|
196
|
+
<span class='label'>
|
197
|
+
xhv:bookmark
|
198
|
+
</span>
|
199
|
+
<ul rel='xhv:bookmark'>
|
200
|
+
<li>
|
201
|
+
<a href='http://rdfa.info/2009/12/12/oreilly-catalog-uses-rdfa/'>
|
202
|
+
http://rdfa.info/2009/12/12/oreilly-catalog-uses-rdfa/
|
203
|
+
</a>
|
204
|
+
</li>
|
205
|
+
<a href='http://rdfa.info/2010/05/31/new-rdfa-checker/'>
|
206
|
+
http://rdfa.info/2010/05/31/new-rdfa-checker/
|
207
|
+
</a>
|
208
|
+
</li>
|
209
|
+
</ul>
|
210
|
+
</div>
|
211
|
+
|
26
212
|
## Dependencies
|
27
|
-
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.
|
213
|
+
* [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.3.1)
|
28
214
|
* [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
|
215
|
+
* [Haml](https://rubygems.org/gems/haml) (>= 3.0.0)
|
29
216
|
|
30
217
|
## Documentation
|
31
218
|
Full documentation available on [RubyForge](http://rdf.rubyforge.org/rdfa)
|
32
219
|
|
33
220
|
### Principle Classes
|
34
221
|
* {RDF::RDFa::Format}
|
222
|
+
* {RDF::RDFa::HTML}
|
223
|
+
Asserts :html format, text/html mime-type and .html file extension.
|
224
|
+
* {RDF::RDFa::XHTML}
|
225
|
+
Asserts :html format, application/xhtml+xml mime-type and .xhtml file extension.
|
226
|
+
* {RDF::RDFa::SVG}
|
227
|
+
Asserts :svg format, image/svg+xml mime-type and .svg file extension.
|
35
228
|
* {RDF::RDFa::Reader}
|
36
229
|
* {RDF::RDFa::Profile}
|
230
|
+
* {RDF::RDFa::Writer}
|
37
231
|
|
38
232
|
### Additional vocabularies
|
39
233
|
* {RDF::PTR}
|
@@ -45,47 +239,53 @@ Full documentation available on [RubyForge](http://rdf.rubyforge.org/rdfa)
|
|
45
239
|
## TODO
|
46
240
|
* Add support for LibXML and REXML bindings, and use the best available
|
47
241
|
* Consider a SAX-based parser for improved performance
|
48
|
-
* Port SPARQL tests to native SPARQL processor, when one becomes available.
|
49
|
-
* Add generic XHTML+RDFa Writer
|
50
242
|
|
51
243
|
## Resources
|
52
|
-
* [RDF.rb]
|
244
|
+
* [RDF.rb][RDF.rb]
|
53
245
|
* [Distiller](http://distiller.kellogg-assoc)
|
54
246
|
* [Documentation](http://rdf.rubyforge.org/rdfa)
|
55
247
|
* [History](file:file.History.html)
|
56
|
-
* [RDFa 1.1 Core]
|
57
|
-
* [XHTML+RDFa 1.1
|
248
|
+
* [RDFa 1.1 Core][RDFa 1.1 Core]
|
249
|
+
* [XHTML+RDFa 1.1][XHTML+RDFa 1.1]
|
58
250
|
* [RDFa-test-suite](http://rdfa.digitalbazaar.com/test-suite/ "RDFa test suite")
|
59
251
|
|
60
|
-
##
|
252
|
+
## Author
|
253
|
+
* [Gregg Kellogg](http://github.com/gkellogg) - <http://kellogg-assoc.com/>
|
61
254
|
|
62
|
-
|
255
|
+
## Contributors
|
256
|
+
* [Nicholas Humfrey](http://github.com/njh)
|
63
257
|
|
64
|
-
|
258
|
+
## Contributing
|
65
259
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
the
|
260
|
+
* Do your best to adhere to the existing coding conventions and idioms.
|
261
|
+
* Don't use hard tabs, and don't leave trailing whitespace on any line.
|
262
|
+
* Do document every method you add using [YARD][] annotations. Read the
|
263
|
+
[tutorial][YARD-GS] or just look at the existing code for examples.
|
264
|
+
* Don't touch the `.gemspec`, `VERSION` or `AUTHORS` files. If you need to
|
265
|
+
change them, do so on your private branch only.
|
266
|
+
* Do feel free to add yourself to the `CREDITS` file and the corresponding
|
267
|
+
list in the the `README`. Alphabetical order applies.
|
268
|
+
* Do note that in order for us to merge any non-trivial changes (as a rule
|
269
|
+
of thumb, additions larger than about 15 lines of code), we need an
|
270
|
+
explicit [public domain dedication][PDD] on record from you.
|
73
271
|
|
74
|
-
|
75
|
-
included in all copies or substantial portions of the Software.
|
272
|
+
## License
|
76
273
|
|
77
|
-
|
78
|
-
|
79
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
80
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
81
|
-
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
82
|
-
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
83
|
-
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
274
|
+
This is free and unencumbered public domain software. For more information,
|
275
|
+
see <http://unlicense.org/> or the accompanying {file:UNLICENSE} file.
|
84
276
|
|
85
277
|
## FEEDBACK
|
86
278
|
|
87
279
|
* gregg@kellogg-assoc.com
|
88
|
-
* rubygems.org/rdf-rdfa
|
89
|
-
* github.com/gkellogg/rdf-rdfa
|
90
|
-
*
|
91
|
-
|
280
|
+
* <http://rubygems.org/rdf-rdfa>
|
281
|
+
* <http://github.com/gkellogg/rdf-rdfa>
|
282
|
+
* <http://lists.w3.org/Archives/Public/public-rdf-ruby/>
|
283
|
+
|
284
|
+
[RDF.rb]: http://rdf.rubyforge.org/
|
285
|
+
[YARD]: http://yardoc.org/
|
286
|
+
[YARD-GS]: http://rubydoc.info/docs/yard/file/docs/GettingStarted.md
|
287
|
+
[PDD]: http://lists.w3.org/Archives/Public/public-rdf-ruby/2010May/0013.html
|
288
|
+
[RDFa 1.1 Core]: http://www.w3.org/TR/2010/WD-rdfa-core-20100422/ "RDFa 1.1 Core"
|
289
|
+
[XHTML+RDFa 1.1]: http://www.w3.org/TR/2010/WD-xhtml-rdfa-20100422/ "XHTML+RDFa 1.1"
|
290
|
+
[RDFa-test-suite]: http://rdfa.digitalbazaar.com/test-suite/ "RDFa test suite"
|
291
|
+
[Haml]: http://haml-lang.com/
|