rdf_context 0.4.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (551) hide show
  1. data/.autotest +2 -0
  2. data/.gitignore +10 -0
  3. data/.gitmodules +3 -0
  4. data/History.txt +73 -0
  5. data/README.rdoc +145 -0
  6. data/Rakefile +77 -0
  7. data/VERSION +1 -0
  8. data/bin/reddy +59 -0
  9. data/lib/rdf_context.rb +60 -0
  10. data/lib/rdf_context/bnode.rb +99 -0
  11. data/lib/rdf_context/conjunctive_graph.rb +47 -0
  12. data/lib/rdf_context/exceptions.rb +11 -0
  13. data/lib/rdf_context/graph.rb +333 -0
  14. data/lib/rdf_context/literal.rb +340 -0
  15. data/lib/rdf_context/n3_grammar.rb +2171 -0
  16. data/lib/rdf_context/n3_grammar.treetop +143 -0
  17. data/lib/rdf_context/n3parser.rb +152 -0
  18. data/lib/rdf_context/namespace.rb +82 -0
  19. data/lib/rdf_context/nokogiri_hacks.rb +8 -0
  20. data/lib/rdf_context/parser.rb +119 -0
  21. data/lib/rdf_context/rdfaparser.rb +398 -0
  22. data/lib/rdf_context/rdfxmlparser.rb +525 -0
  23. data/lib/rdf_context/store/abstract_sql_store.rb +843 -0
  24. data/lib/rdf_context/store/abstract_store.rb +64 -0
  25. data/lib/rdf_context/store/list_store.rb +63 -0
  26. data/lib/rdf_context/store/memory_store.rb +323 -0
  27. data/lib/rdf_context/store/sqlite3_store.rb +223 -0
  28. data/lib/rdf_context/string_hacks.rb +108 -0
  29. data/lib/rdf_context/term_utils.rb +196 -0
  30. data/lib/rdf_context/triple.rb +144 -0
  31. data/lib/rdf_context/uriref.rb +95 -0
  32. data/script/console +10 -0
  33. data/spec/bnode_spec.rb +58 -0
  34. data/spec/conjunctive_graph_spec.rb +60 -0
  35. data/spec/graph_spec.rb +390 -0
  36. data/spec/list_store_spec.rb +12 -0
  37. data/spec/literal_spec.rb +314 -0
  38. data/spec/matchers.rb +150 -0
  39. data/spec/memory_store_spec.rb +23 -0
  40. data/spec/n3parser_spec.rb +229 -0
  41. data/spec/namespaces_spec.rb +66 -0
  42. data/spec/ntriples/test.nt +78 -0
  43. data/spec/parser_spec.rb +29 -0
  44. data/spec/rdfa-triples/0001.nt +1 -0
  45. data/spec/rdfa-triples/0006.nt +2 -0
  46. data/spec/rdfa-triples/0007.nt +3 -0
  47. data/spec/rdfa-triples/0008.nt +1 -0
  48. data/spec/rdfa-triples/0009.nt +1 -0
  49. data/spec/rdfa-triples/0010.nt +2 -0
  50. data/spec/rdfa-triples/0011.nt +3 -0
  51. data/spec/rdfa-triples/0012.nt +1 -0
  52. data/spec/rdfa-triples/0013.nt +1 -0
  53. data/spec/rdfa-triples/0014.nt +1 -0
  54. data/spec/rdfa-triples/0015.nt +2 -0
  55. data/spec/rdfa-triples/0017.nt +3 -0
  56. data/spec/rdfa-triples/0018.nt +1 -0
  57. data/spec/rdfa-triples/0019.nt +1 -0
  58. data/spec/rdfa-triples/0020.nt +1 -0
  59. data/spec/rdfa-triples/0021.nt +1 -0
  60. data/spec/rdfa-triples/0023.nt +1 -0
  61. data/spec/rdfa-triples/0025.nt +2 -0
  62. data/spec/rdfa-triples/0026.nt +1 -0
  63. data/spec/rdfa-triples/0027.nt +1 -0
  64. data/spec/rdfa-triples/0029.nt +1 -0
  65. data/spec/rdfa-triples/0030.nt +1 -0
  66. data/spec/rdfa-triples/0031.nt +1 -0
  67. data/spec/rdfa-triples/0032.nt +1 -0
  68. data/spec/rdfa-triples/0033.nt +2 -0
  69. data/spec/rdfa-triples/0034.nt +1 -0
  70. data/spec/rdfa-triples/0035.nt +1 -0
  71. data/spec/rdfa-triples/0036.nt +1 -0
  72. data/spec/rdfa-triples/0037.nt +1 -0
  73. data/spec/rdfa-triples/0038.nt +1 -0
  74. data/spec/rdfa-triples/0039.nt +1 -0
  75. data/spec/rdfa-triples/0040.nt +1 -0
  76. data/spec/rdfa-triples/0041.nt +1 -0
  77. data/spec/rdfa-triples/0042.nt +0 -0
  78. data/spec/rdfa-triples/0046.nt +3 -0
  79. data/spec/rdfa-triples/0047.nt +3 -0
  80. data/spec/rdfa-triples/0048.nt +3 -0
  81. data/spec/rdfa-triples/0049.nt +2 -0
  82. data/spec/rdfa-triples/0050.nt +2 -0
  83. data/spec/rdfa-triples/0051.nt +2 -0
  84. data/spec/rdfa-triples/0052.nt +1 -0
  85. data/spec/rdfa-triples/0053.nt +2 -0
  86. data/spec/rdfa-triples/0054.nt +2 -0
  87. data/spec/rdfa-triples/0055.nt +2 -0
  88. data/spec/rdfa-triples/0056.nt +3 -0
  89. data/spec/rdfa-triples/0057.nt +4 -0
  90. data/spec/rdfa-triples/0058.nt +6 -0
  91. data/spec/rdfa-triples/0059.nt +6 -0
  92. data/spec/rdfa-triples/0060.nt +2 -0
  93. data/spec/rdfa-triples/0061.nt +1 -0
  94. data/spec/rdfa-triples/0062.nt +1 -0
  95. data/spec/rdfa-triples/0063.nt +1 -0
  96. data/spec/rdfa-triples/0064.nt +1 -0
  97. data/spec/rdfa-triples/0065.nt +3 -0
  98. data/spec/rdfa-triples/0066.nt +1 -0
  99. data/spec/rdfa-triples/0067.nt +1 -0
  100. data/spec/rdfa-triples/0068.nt +1 -0
  101. data/spec/rdfa-triples/0069.nt +1 -0
  102. data/spec/rdfa-triples/0070.nt +1 -0
  103. data/spec/rdfa-triples/0071.nt +1 -0
  104. data/spec/rdfa-triples/0072.nt +1 -0
  105. data/spec/rdfa-triples/0073.nt +1 -0
  106. data/spec/rdfa-triples/0074.nt +1 -0
  107. data/spec/rdfa-triples/0075.nt +1 -0
  108. data/spec/rdfa-triples/0076.nt +23 -0
  109. data/spec/rdfa-triples/0077.nt +23 -0
  110. data/spec/rdfa-triples/0078.nt +6 -0
  111. data/spec/rdfa-triples/0079.nt +3 -0
  112. data/spec/rdfa-triples/0080.nt +1 -0
  113. data/spec/rdfa-triples/0081.nt +6 -0
  114. data/spec/rdfa-triples/0082.nt +8 -0
  115. data/spec/rdfa-triples/0083.nt +6 -0
  116. data/spec/rdfa-triples/0084.nt +8 -0
  117. data/spec/rdfa-triples/0085.nt +4 -0
  118. data/spec/rdfa-triples/0086.nt +0 -0
  119. data/spec/rdfa-triples/0087.nt +23 -0
  120. data/spec/rdfa-triples/0088.nt +3 -0
  121. data/spec/rdfa-triples/0089.nt +1 -0
  122. data/spec/rdfa-triples/0090.nt +1 -0
  123. data/spec/rdfa-triples/0091.nt +3 -0
  124. data/spec/rdfa-triples/0092.nt +3 -0
  125. data/spec/rdfa-triples/0093.nt +2 -0
  126. data/spec/rdfa-triples/0094.nt +3 -0
  127. data/spec/rdfa-triples/0099.nt +1 -0
  128. data/spec/rdfa-triples/0100.nt +3 -0
  129. data/spec/rdfa-triples/0101.nt +3 -0
  130. data/spec/rdfa-triples/0102.nt +1 -0
  131. data/spec/rdfa-triples/0103.nt +1 -0
  132. data/spec/rdfa-triples/0104.nt +3 -0
  133. data/spec/rdfa-triples/0105.nt +1 -0
  134. data/spec/rdfa-triples/0106.nt +1 -0
  135. data/spec/rdfa-triples/0107.nt +0 -0
  136. data/spec/rdfa-triples/0108.nt +1 -0
  137. data/spec/rdfa-triples/0109.nt +1 -0
  138. data/spec/rdfa-triples/0110.nt +1 -0
  139. data/spec/rdfa-triples/0111.nt +2 -0
  140. data/spec/rdfa-triples/0112.nt +1 -0
  141. data/spec/rdfa-triples/0113.nt +2 -0
  142. data/spec/rdfa-triples/0114.nt +3 -0
  143. data/spec/rdfa-triples/0115.nt +4 -0
  144. data/spec/rdfa-triples/0116.nt +2 -0
  145. data/spec/rdfa-triples/0117.nt +2 -0
  146. data/spec/rdfa-triples/0118.nt +1 -0
  147. data/spec/rdfa-triples/0119.nt +1 -0
  148. data/spec/rdfa-triples/0120.nt +1 -0
  149. data/spec/rdfa-triples/0121.nt +2 -0
  150. data/spec/rdfa-triples/0122.nt +1 -0
  151. data/spec/rdfa-triples/0123.nt +3 -0
  152. data/spec/rdfa-triples/0124.nt +4 -0
  153. data/spec/rdfa-triples/0125.nt +1 -0
  154. data/spec/rdfa-triples/0126.nt +3 -0
  155. data/spec/rdfa-triples/1001.nt +6 -0
  156. data/spec/rdfa_helper.rb +189 -0
  157. data/spec/rdfa_parser_spec.rb +148 -0
  158. data/spec/rdfcore/Manifest.rdf +5395 -0
  159. data/spec/rdfcore/amp-in-url/test001.nt +16 -0
  160. data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
  161. data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
  162. data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
  163. data/spec/rdfcore/datatypes/test001.nt +15 -0
  164. data/spec/rdfcore/datatypes/test001.rdf +29 -0
  165. data/spec/rdfcore/datatypes/test002.nt +14 -0
  166. data/spec/rdfcore/datatypes/test002.rdf +27 -0
  167. data/spec/rdfcore/datatypes/test002b.nt +17 -0
  168. data/spec/rdfcore/datatypes/test003a.nt +16 -0
  169. data/spec/rdfcore/datatypes/test003b.nt +16 -0
  170. data/spec/rdfcore/datatypes/test005a.nt +16 -0
  171. data/spec/rdfcore/datatypes/test005b.nt +16 -0
  172. data/spec/rdfcore/datatypes/test006.nt +17 -0
  173. data/spec/rdfcore/datatypes/test008a.nt +15 -0
  174. data/spec/rdfcore/datatypes/test008b.nt +15 -0
  175. data/spec/rdfcore/datatypes/test009a.nt +15 -0
  176. data/spec/rdfcore/datatypes/test009b.nt +15 -0
  177. data/spec/rdfcore/datatypes/test010.nt +17 -0
  178. data/spec/rdfcore/datatypes/test011a.nt +17 -0
  179. data/spec/rdfcore/datatypes/test011b.nt +17 -0
  180. data/spec/rdfcore/horst-01/test001.rdf +38 -0
  181. data/spec/rdfcore/horst-01/test002.rdf +39 -0
  182. data/spec/rdfcore/horst-01/test003.rdf +40 -0
  183. data/spec/rdfcore/horst-01/test004.rdf +42 -0
  184. data/spec/rdfcore/pfps-10/test001a.nt +14 -0
  185. data/spec/rdfcore/pfps-10/test001b.nt +15 -0
  186. data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
  187. data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
  188. data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
  189. data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
  190. data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
  191. data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
  192. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
  193. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
  194. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
  195. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
  196. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
  197. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
  198. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
  199. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
  200. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
  201. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
  202. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
  203. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
  204. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
  205. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
  206. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
  207. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
  208. data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
  209. data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
  210. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
  211. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
  212. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
  213. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
  214. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
  215. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
  216. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
  217. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
  218. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
  219. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
  220. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
  221. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
  222. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
  223. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
  224. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
  225. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
  226. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
  227. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
  228. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
  229. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
  230. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
  231. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
  232. data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
  233. data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
  234. data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
  235. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
  236. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
  237. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
  238. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
  239. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
  240. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
  241. data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
  242. data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
  243. data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
  244. data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
  245. data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
  246. data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
  247. data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
  248. data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
  249. data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
  250. data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
  251. data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
  252. data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
  253. data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
  254. data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
  255. data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
  256. data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
  257. data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
  258. data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
  259. data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
  260. data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
  261. data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
  262. data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
  263. data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
  264. data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
  265. data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
  266. data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
  267. data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
  268. data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
  269. data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
  270. data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
  271. data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
  272. data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
  273. data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
  274. data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
  275. data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
  276. data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
  277. data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
  278. data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
  279. data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
  280. data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
  281. data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
  282. data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
  283. data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
  284. data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
  285. data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
  286. data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
  287. data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
  288. data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
  289. data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
  290. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
  291. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
  292. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
  293. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
  294. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
  295. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
  296. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
  297. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
  298. data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
  299. data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
  300. data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
  301. data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
  302. data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
  303. data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
  304. data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
  305. data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
  306. data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
  307. data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
  308. data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
  309. data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
  310. data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
  311. data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
  312. data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
  313. data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
  314. data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
  315. data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
  316. data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
  317. data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
  318. data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
  319. data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
  320. data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
  321. data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
  322. data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
  323. data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
  324. data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
  325. data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
  326. data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
  327. data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
  328. data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
  329. data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
  330. data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
  331. data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
  332. data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
  333. data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
  334. data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
  335. data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
  336. data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
  337. data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
  338. data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
  339. data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
  340. data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
  341. data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
  342. data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
  343. data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
  344. data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
  345. data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
  346. data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
  347. data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
  348. data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
  349. data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
  350. data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
  351. data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
  352. data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
  353. data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
  354. data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
  355. data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
  356. data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
  357. data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
  358. data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
  359. data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
  360. data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
  361. data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
  362. data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
  363. data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
  364. data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
  365. data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
  366. data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
  367. data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
  368. data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
  369. data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
  370. data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
  371. data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
  372. data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
  373. data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
  374. data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
  375. data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
  376. data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
  377. data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
  378. data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
  379. data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
  380. data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
  381. data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
  382. data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
  383. data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
  384. data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
  385. data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
  386. data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
  387. data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
  388. data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
  389. data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
  390. data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
  391. data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
  392. data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
  393. data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
  394. data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
  395. data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
  396. data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
  397. data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
  398. data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
  399. data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
  400. data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
  401. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
  402. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
  403. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
  404. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
  405. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
  406. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
  407. data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
  408. data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
  409. data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
  410. data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
  411. data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
  412. data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
  413. data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
  414. data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
  415. data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
  416. data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
  417. data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
  418. data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
  419. data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
  420. data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
  421. data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
  422. data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
  423. data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
  424. data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
  425. data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
  426. data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
  427. data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
  428. data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
  429. data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
  430. data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
  431. data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
  432. data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
  433. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
  434. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
  435. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
  436. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
  437. data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
  438. data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
  439. data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
  440. data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
  441. data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
  442. data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
  443. data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
  444. data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
  445. data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
  446. data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
  447. data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
  448. data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
  449. data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
  450. data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
  451. data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
  452. data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
  453. data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
  454. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
  455. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
  456. data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
  457. data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
  458. data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
  459. data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
  460. data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
  461. data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
  462. data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
  463. data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
  464. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
  465. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
  466. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
  467. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
  468. data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
  469. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
  470. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
  471. data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
  472. data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
  473. data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
  474. data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
  475. data/spec/rdfcore/tex-01/test001.rdf +34 -0
  476. data/spec/rdfcore/tex-01/test002.rdf +33 -0
  477. data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
  478. data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
  479. data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
  480. data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
  481. data/spec/rdfcore/xml-canon/test001.nt +16 -0
  482. data/spec/rdfcore/xml-canon/test001.rdf +28 -0
  483. data/spec/rdfcore/xmlbase/test001.nt +14 -0
  484. data/spec/rdfcore/xmlbase/test001.rdf +27 -0
  485. data/spec/rdfcore/xmlbase/test002.nt +14 -0
  486. data/spec/rdfcore/xmlbase/test002.rdf +28 -0
  487. data/spec/rdfcore/xmlbase/test003.nt +14 -0
  488. data/spec/rdfcore/xmlbase/test003.rdf +25 -0
  489. data/spec/rdfcore/xmlbase/test004.nt +18 -0
  490. data/spec/rdfcore/xmlbase/test004.rdf +27 -0
  491. data/spec/rdfcore/xmlbase/test006.nt +15 -0
  492. data/spec/rdfcore/xmlbase/test006.rdf +26 -0
  493. data/spec/rdfcore/xmlbase/test007.nt +14 -0
  494. data/spec/rdfcore/xmlbase/test007.rdf +25 -0
  495. data/spec/rdfcore/xmlbase/test008.nt +14 -0
  496. data/spec/rdfcore/xmlbase/test008.rdf +25 -0
  497. data/spec/rdfcore/xmlbase/test009.nt +14 -0
  498. data/spec/rdfcore/xmlbase/test009.rdf +26 -0
  499. data/spec/rdfcore/xmlbase/test010.nt +14 -0
  500. data/spec/rdfcore/xmlbase/test010.rdf +26 -0
  501. data/spec/rdfcore/xmlbase/test011.nt +14 -0
  502. data/spec/rdfcore/xmlbase/test011.rdf +27 -0
  503. data/spec/rdfcore/xmlbase/test013.nt +15 -0
  504. data/spec/rdfcore/xmlbase/test013.rdf +28 -0
  505. data/spec/rdfcore/xmlbase/test014.nt +15 -0
  506. data/spec/rdfcore/xmlbase/test014.rdf +28 -0
  507. data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
  508. data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
  509. data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
  510. data/spec/rdfxml_helper.rb +137 -0
  511. data/spec/rdfxml_spec.rb +362 -0
  512. data/spec/spec.opts +1 -0
  513. data/spec/spec_helper.rb +23 -0
  514. data/spec/sqlite3_store_spec.rb +41 -0
  515. data/spec/store_helper.rb +231 -0
  516. data/spec/string_hacks_spec.rb +21 -0
  517. data/spec/triple_spec.rb +172 -0
  518. data/spec/uriref_spec.rb +117 -0
  519. data/test/longtests_spec.rb +25 -0
  520. data/test/n3_tests/lcsh/sh85062913.n3 +41 -0
  521. data/test/n3_tests/lcsh/sh85062913.nt +21 -0
  522. data/test/n3_tests/lcsh/sh85082139.n3 +157 -0
  523. data/test/n3_tests/lcsh/sh85082139.nt +79 -0
  524. data/test/n3_tests/lcsh/sh85118553.n3 +123 -0
  525. data/test/n3_tests/lcsh/sh85118553.nt +63 -0
  526. data/test/n3_tests/misc/on_now-01.n3 +30 -0
  527. data/test/n3_tests/misc/on_now-01.nt +15 -0
  528. data/test/n3_tests/n3p/simple-01.n3 +1 -0
  529. data/test/n3_tests/n3p/simple-01.nt +0 -0
  530. data/test/n3_tests/n3p/simple-02.n3 +4 -0
  531. data/test/n3_tests/n3p/simple-02.nt +0 -0
  532. data/test/n3_tests/n3p/simple-03.n3 +5 -0
  533. data/test/n3_tests/n3p/simple-03.nt +1 -0
  534. data/test/n3_tests/n3p/simple-04.n3 +6 -0
  535. data/test/n3_tests/n3p/simple-04.nt +3 -0
  536. data/test/n3_tests/n3p/simple-05.n3 +7 -0
  537. data/test/n3_tests/n3p/simple-05.nt +2 -0
  538. data/test/n3_tests/n3p/simple-06.n3 +6 -0
  539. data/test/n3_tests/n3p/simple-06.nt +4 -0
  540. data/test/n3_tests/n3p/simple-07.n3 +7 -0
  541. data/test/n3_tests/n3p/simple-07.nt +6 -0
  542. data/test/perf_test/test.rb +11 -0
  543. data/test/perf_test/tommorris.rdf +2267 -0
  544. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
  545. data/test/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
  546. data/test/rdf_tests/tm_001.nt +1 -0
  547. data/test/rdf_tests/tm_001.rdf +7 -0
  548. data/test/rdf_tests/xml-literal-mixed.nt +7 -0
  549. data/test/rdf_tests/xml-literal-mixed.rdf +15 -0
  550. data/test/xml.rdf +6 -0
  551. metadata +696 -0
@@ -0,0 +1,47 @@
1
+ require File.join(File.dirname(__FILE__), "graph.rb")
2
+
3
+ module RdfContext
4
+ # ConjunctiveGraph - The top level container for all named Graphs sharing a _Store_
5
+ #
6
+ # A ConjuctiveGraph is a graph that can contain other graphs. Graphs are kept distinct
7
+ # by a _context_, which is the identifier of the sub-graph. It is the union of all graphs in a _Store_.
8
+ #
9
+ # For the sake of persistence, Conjunctive Graphs must be distinguished by identifiers (that may not
10
+ # necessarily be RDF identifiers or may be an RDF identifier normalized - SHA1/MD5 perhaps - for database
11
+ # naming purposes ) which could be referenced to indicate conjunctive queries (queries made across the
12
+ # entire conjunctive graph) or appear as nodes in asserted statements. In this latter case, such
13
+ # statements could be interpreted as being made about the entire 'known' universe.
14
+ class ConjunctiveGraph < Graph
15
+ # Store for ConjunctiveGraph must support contexts.
16
+ def initialize(options = {})
17
+ unless options[:store] && options[:store].context_aware?
18
+ raise GraphException.new("Conjuective Graph requires store supporting contexts")
19
+ end
20
+
21
+ super(:identifier => options[:store].identifier, :store => options[:store])
22
+ @context_aware = true
23
+ end
24
+
25
+ # The default_context is a Graph having an _identifier_ the same as the
26
+ # _identifier_ of the _store_.
27
+ def default_context
28
+ @@default_context = Graph.new(:identifier => @store.identifier, :store => @store)
29
+ end
30
+
31
+ # Parse source into a new context.
32
+ #
33
+ # Create a new context (Graph) and parse into that.
34
+ #
35
+ # @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
36
+ # @param [String] uri:: the URI of the document
37
+ # @param [Hash] options:: Options from
38
+ # <em>options[:debug]</em>:: Array to place debug messages
39
+ # <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
40
+ # <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
41
+ # @return [Graph]:: Returns the graph containing parsed triples
42
+ def parse(stream, uri, options = {}, &block) # :yields: triple
43
+ graph = Graph.new(:identifier => uri, :store => self.store)
44
+ Parser.parse(stream, uri, options.merge(:graph => graph), &block)
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,11 @@
1
+ module RdfContext
2
+ class RdfException < RuntimeError; end
3
+ class ParserException < RdfException; end
4
+ class GraphException < RdfException; end
5
+ class StoreException < RdfException; end
6
+ class BNodeException < RdfException; end
7
+ class TypeError < RdfException; end
8
+ class InvalidPredicate < RdfException; end
9
+ class InvalidSubject < RdfException; end
10
+ class InvalidObject < RdfException; end
11
+ end
@@ -0,0 +1,333 @@
1
+ require File.join(File.dirname(__FILE__), 'store', 'list_store')
2
+ require File.join(File.dirname(__FILE__), 'store', 'memory_store')
3
+
4
+ module RdfContext
5
+ # A simple graph to hold triples.
6
+ #
7
+ # Graphs store triples, and the namespaces associated with those triples, where defined
8
+ class Graph
9
+ attr_reader :triples
10
+ attr_reader :nsbinding
11
+ attr_reader :identifier
12
+ attr_reader :store
13
+
14
+ # Create a Graph with the given store and identifier.
15
+ #
16
+ # The constructor accepts a _store_ option,
17
+ # that will be used to store the graph data.
18
+ #
19
+ # Stores can be context-aware or unaware. Unaware stores take up
20
+ # (some) less space but cannot support features that require
21
+ # context, such as true merging/demerging of sub-graphs and
22
+ # provenance.
23
+ #
24
+ # The Graph constructor can take an identifier which identifies the Graph
25
+ # by name. If none is given, the graph is assigned a BNode for it's identifier.
26
+ # For more on named graphs, see: http://en.wikipedia.org/wiki/RDFLib
27
+ #
28
+ # @param [Hash] options:: Options
29
+ # <em>options[:store]</em>:: storage, defaults to a new ListStore instance
30
+ # <em>options[:identifier]</em>:: Identifier for this graph, Literal, BNode or URIRef
31
+ def initialize(options = {})
32
+ @nsbinding = {}
33
+
34
+ # Instantiate triple store
35
+ @store = case options[:store]
36
+ when AbstractStore then options[:store]
37
+ when :list_store then ListStore.new
38
+ when :memory_store then MemoryStore.new
39
+ else ListStore.new
40
+ end
41
+
42
+ @identifier = options[:identifier] || BNode.new
43
+ end
44
+
45
+ def inspect
46
+ "#{self.class}[id=#{identifier},store=#{store.inspect}]"
47
+ end
48
+
49
+ # Hash of graph, based on graph type and identifier
50
+ def hash
51
+ [self.class.to_s, self.identifier].hash
52
+ end
53
+
54
+ def context_aware?; @context_aware; end
55
+
56
+ # Data Store interface
57
+ def nsbinding; @store.nsbinding; end
58
+
59
+ # Destroy the store identified by _configuration_ if supported
60
+ def destroy(configuration = nil)
61
+ @store.destroy(configuration)
62
+ self.freeze
63
+ end
64
+
65
+ # Commit changes to graph
66
+ def commit; @store.commit; end
67
+
68
+ # Rollback active transactions
69
+ def rollback; @store.rollback; end
70
+
71
+ # Open the graph store
72
+ #
73
+ # Might be necessary for stores that require opening a connection to a
74
+ # database or acquiring some resource.
75
+ def open(configuration, create=false)
76
+ @store.open(configuration, create)
77
+ end
78
+
79
+ # Close the graph store
80
+ #
81
+ # Might be necessary for stores that require closing a connection to a
82
+ # database or releasing some resource.
83
+ def close(commit_pending_transaction=false)
84
+ @store.open(commit_pending_transaction)
85
+ end
86
+
87
+ ##
88
+ # Exports the graph to RDF in N-Triples form.
89
+ #
90
+ # ==== Example
91
+ # g = Graph.new; g.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new); g.to_ntriples # => returns a string of the graph in N-Triples form
92
+ #
93
+ # @return [String]:: The graph in N-Triples.
94
+ #
95
+ # @author Tom Morris
96
+ def to_ntriples
97
+ triples.collect do |t|
98
+ t.to_ntriples
99
+ end * "\n" + "\n"
100
+ end
101
+
102
+ # Output graph using to_ntriples
103
+ def to_s; self.to_ntriples; end
104
+
105
+ ##
106
+ # Exports the graph to RDF in RDF/XML form.
107
+ #
108
+ # @return [String]:: The RDF/XML graph
109
+ def to_rdfxml
110
+ replace_text = {}
111
+ rdfxml = ""
112
+ xml = builder = Builder::XmlMarkup.new(:target => rdfxml, :indent => 2)
113
+
114
+ extended_bindings = nsbinding.merge(
115
+ "rdf" => RDF_NS,
116
+ "rdfs" => RDFS_NS,
117
+ "xhv" => XHV_NS,
118
+ "xml" => XML_NS
119
+ )
120
+ rdf_attrs = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.xmlns_attr => ns.uri.to_s)}
121
+ uri_bindings = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.uri.to_s => ns.prefix)}
122
+ xml.instruct!
123
+ xml.rdf(:RDF, rdf_attrs) do
124
+ # Add statements for each subject
125
+ subjects.each do |s|
126
+ xml.rdf(:Description, (s.is_a?(BNode) ? "rdf:nodeID" : "rdf:about") => s) do
127
+ triples(Triple.new(s, nil, nil)) do |triple, context|
128
+ xml_args = triple.object.xml_args
129
+ if triple.object.is_a?(Literal) && triple.object.xmlliteral?
130
+ replace_text["__replace_with_#{triple.object.object_id}__"] = xml_args[0]
131
+ xml_args[0] = "__replace_with_#{triple.object.object_id}__"
132
+ end
133
+ xml.tag!(triple.predicate.to_qname(uri_bindings), *xml_args)
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+ # Perform literal substitutions
140
+ replace_text.each_pair do |match, value|
141
+ rdfxml.sub!(match, value)
142
+ end
143
+
144
+ rdfxml
145
+ end
146
+
147
+ ##
148
+ # Bind a namespace to the graph.
149
+ #
150
+ # ==== Example
151
+ # g = Graph.new; g.bind(Namespace.new("http://xmlns.com/foaf/0.1/", "foaf")) # => binds the Foaf namespace to g
152
+ #
153
+ # @param [String] namespace:: the namespace to bind
154
+ # @return [Namespace]:: The newly bound or pre-existing namespace.
155
+ def bind(namespace)
156
+ raise GraphException, "Can't bind #{namespace.inspect} as namespace" unless namespace.is_a?(Namespace)
157
+ @store.bind(namespace)
158
+ end
159
+
160
+ # Namespace for prefix
161
+ def namespace(prefix); @store.namespace(prefix); end
162
+
163
+ # Prefix for namespace
164
+ def prefix(namespace); @store.prefix(namespace); end
165
+
166
+ # Number of Triples in the graph
167
+ def size; @store.size(self); end
168
+
169
+ # List of distinct subjects in graph
170
+ def subjects; @store.subjects(self); end
171
+
172
+ # List of distinct predicates in graph
173
+ def predicates; @store.predicates(self); end
174
+
175
+ # List of distinct objects in graph
176
+ def objects; @store.objects(self); end
177
+
178
+ # Indexed statement in serialized graph triples. Equivalent to graph.triples[item]
179
+ def [] (item); @store.item(item, self); end
180
+
181
+ # Adds a triple to a graph directly from the intended subject, predicate, and object.
182
+ #
183
+ # ==== Example
184
+ # g = Graph.new; g.add_triple(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new) # => results in the triple being added to g; returns an array of g's triples
185
+ #
186
+ # @param [URIRef, BNode] subject:: the subject of the triple
187
+ # @param [URIRef] predicate:: the predicate of the triple
188
+ # @param [URIRef, BNode, Literal] object:: the object of the triple
189
+ # @return [Graph]:: Returns the graph
190
+ # @raise [Error]:: Checks parameter types and raises if they are incorrect.
191
+ def add_triple(subject, predicate, object)
192
+ self.add(Triple.new(subject, predicate, object))
193
+ self
194
+ end
195
+
196
+ ##
197
+ # Adds an more extant triples to a graph. Delegates to Store.
198
+ #
199
+ # ==== Example
200
+ # g = Graph.new;
201
+ # t = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
202
+ # g << t
203
+ #
204
+ # @param [Triple] t:: the triple to be added to the graph
205
+ # @return [Graph]:: Returns the graph
206
+ def << (triple)
207
+ @store.add(triple, self)
208
+ self
209
+ end
210
+
211
+ ##
212
+ # Adds one or more extant triples to a graph. Delegates to Store.
213
+ #
214
+ # ==== Example
215
+ # g = Graph.new;
216
+ # t1 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
217
+ # t2 = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new);
218
+ # g.add(t1, t2, ...)
219
+ #
220
+ # @param [Triple] triples:: one or more triples. Last element may be a hash for options
221
+ # <em>options[:context]</em>:: Graph context in which to deposit triples, defaults to default_context or self
222
+ # @return [Graph]:: Returns the graph
223
+ def add(*triples)
224
+ options = triples.last.is_a?(Hash) ? triples.pop : {}
225
+ ctx = options[:context] || @default_context || self
226
+ triples.each {|t| @store.add(t, ctx)}
227
+ self
228
+ end
229
+
230
+ # Remove a triple from the graph. Delegates to store.
231
+ # Nil matches all triples and thus empties the graph
232
+ def remove(triple); @store.remove(triple, self); end
233
+
234
+ # Triples from graph, optionally matching subject, predicate, or object.
235
+ # Delegates to Store#triples.
236
+ #
237
+ # @param [Triple, nil] triple:: Triple to match, may be a patern triple or nil
238
+ # @return [Array]:: List of matched triples
239
+ def triples(triple = Triple.new(nil, nil, nil), &block) # :yields: triple, context
240
+ @store.triples(triple, self, &block) || []
241
+ end
242
+ alias_method :find, :triples
243
+
244
+ # Detect the presence of a BNode in the graph, either as a subject or an object
245
+ #
246
+ # @param [BNode] bn:: BNode to find
247
+ #
248
+ def has_bnode_identifier?(bn)
249
+ triples do |triple, context|
250
+ return true if triple.subject.eql?(bn) || triple.object.eql?(bn)
251
+ end
252
+ false
253
+ end
254
+
255
+ # Check to see if this graph contains the specified triple
256
+ def contains?(triple)
257
+ @store.contains?(triple, self)
258
+ end
259
+
260
+ # Get all BNodes with usage count used within graph
261
+ def bnodes
262
+ @store.bnodes(self)
263
+ end
264
+
265
+ # Get list of subjects having rdf:type == object
266
+ #
267
+ # @param [Resource, Regexp, String] object:: Type resource
268
+ def get_by_type(object)
269
+ triples(Triple.new(nil, RDF_TYPE, object)).map {|t, ctx| t.subject}
270
+ end
271
+
272
+ # Merge a graph into this graph
273
+ def merge!(graph)
274
+ raise GraphException.new("merge without a graph") unless graph.is_a?(Graph)
275
+
276
+ # Map BNodes from source Graph to new BNodes
277
+ bn = graph.bnodes
278
+ bn.keys.each {|k| bn[k] = BNode.new}
279
+
280
+ graph.triples do |triple, context|
281
+ # If triple contains bnodes, remap to new values
282
+ if triple.subject.is_a?(BNode) || triple.object.is_a?(BNode)
283
+ triple = triple.clone
284
+ triple.subject = bn[triple.subject] if triple.subject.is_a?(BNode)
285
+ triple.object = bn[triple.object] if triple.object.is_a?(BNode)
286
+ end
287
+ self << triple
288
+ end
289
+ end
290
+
291
+ # Two graphs are equal if each is an instance of the other, considering BNode equivalence.
292
+ # This may be done by creating a new graph an substituting each permutation of BNode identifiers
293
+ # from self to other until every permutation is exhausted, or a textual equivalence is found
294
+ # after sorting each graph.
295
+ #
296
+ # We just follow Python RDFlib's lead and do a simple comparison
297
+ def eql? (other)
298
+ #puts "eql? size #{self.size} vs #{other.size}"
299
+ return false if !other.is_a?(Graph) || self.size != other.size
300
+ return false unless other.identifier.to_s == identifier.to_s
301
+
302
+ bn_self = bnodes.values.sort
303
+ bn_other = other.bnodes.values.sort
304
+ #puts "eql? bnodes '#{bn_self.to_sentence}' vs '#{bn_other.to_sentence}'"
305
+ return false unless bn_self == bn_other
306
+
307
+ # Check each triple to see if it's contained in the other graph
308
+ triples do |t, ctx|
309
+ next if t.subject.is_a?(BNode) || t.object.is_a?(BNode)
310
+ #puts "eql? contains '#{t.to_ntriples}'"
311
+ return false unless other.contains?(t)
312
+ end
313
+ true
314
+ end
315
+
316
+ alias_method :==, :eql?
317
+ end
318
+
319
+ # Parse source into Graph.
320
+ #
321
+ # Merges results into a common Graph
322
+ #
323
+ # @param [IO, String] stream:: the RDF IO stream, string, Nokogiri::HTML::Document or Nokogiri::XML::Document
324
+ # @param [String] uri:: the URI of the document
325
+ # @param [Hash] options:: Options from
326
+ # <em>options[:debug]</em>:: Array to place debug messages
327
+ # <em>options[:type]</em>:: One of _rdfxml_, _html_, or _n3_
328
+ # <em>options[:strict]</em>:: Raise Error if true, continue with lax parsing, otherwise
329
+ # @return [Graph]:: Returns the graph containing parsed triples
330
+ def parse(stream, uri, options = {}, &block) # :yields: triple
331
+ Parser.parse(stream, uri, options.merge(:graph => self), &block)
332
+ end
333
+ end
@@ -0,0 +1,340 @@
1
+ module RdfContext
2
+ # An RDF Literal, with value, encoding and language elements.
3
+ class Literal
4
+ class Encoding
5
+ attr_reader :value
6
+
7
+ # New Encoding for a literal, typed, untyped or XMLLiteral
8
+ def initialize(value)
9
+ @value = URIRef.new(value.to_s) if value
10
+ end
11
+
12
+ # Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#int")</tt>
13
+ def self.integer
14
+ @integer ||= coerce "http://www.w3.org/2001/XMLSchema#int"
15
+ end
16
+
17
+ # Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#float")</tt>
18
+ def self.float
19
+ @float ||= coerce "http://www.w3.org/2001/XMLSchema#float"
20
+ end
21
+
22
+ # Shortcut for <tt>Literal::Encoding.new("http://www.w3.org/2001/XMLSchema#string")</tt>
23
+ def self.string
24
+ @string ||= coerce "http://www.w3.org/2001/XMLSchema#string"
25
+ end
26
+
27
+ # Create from URI, empty or nil string
28
+ def self.coerce(string_or_nil)
29
+ if string_or_nil.nil? || string_or_nil == ''
30
+ the_null_encoding
31
+ elsif xmlliteral == string_or_nil.to_s
32
+ xmlliteral
33
+ else
34
+ new string_or_nil
35
+ end
36
+ end
37
+
38
+ def inspect
39
+ to_s()
40
+ end
41
+
42
+ def self.the_null_encoding
43
+ @the_null_encoding ||= Null.new(nil)
44
+ end
45
+
46
+ def self.xmlliteral
47
+ @xmlliteral ||= XMLLiteral.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#XMLLiteral")
48
+ end
49
+
50
+ # Compare against another encoding, or a URI of a literal type
51
+ def ==(other)
52
+ case other
53
+ when String
54
+ other == @value.to_s
55
+ when self.class
56
+ other.value.to_s == @value.to_s
57
+ else
58
+ false
59
+ end
60
+ end
61
+
62
+ # Generate hash of type to determine uniqueness
63
+ def hash
64
+ @value.hash
65
+ end
66
+
67
+ def to_s
68
+ @value.to_s
69
+ end
70
+
71
+ # Serialize literal, adding datatype and language elements, if present.
72
+ # XMLLiteral and String values are RDF-escaped.
73
+ def format_as_n3(content, lang)
74
+ quoted_content = "\"#{content.to_s.rdf_escape}\"^^<#{value}>"
75
+ end
76
+
77
+ # Serialize literal to TriX
78
+ def format_as_trix(content, lang)
79
+ lang = " xml:lang=\"#{lang}\"" if lang
80
+ "<typedLiteral datatype=\"#{@value}\"#{lang}>#{content}</typedLiteral>"
81
+ end
82
+
83
+ # Return content and hash appropriate for encoding in XML
84
+ #
85
+ # ==== Example
86
+ # Encoding.string.xml_args("foo", "en-US") => ["foo", {"rdf:datatype" => "xs:string"}]
87
+ def xml_args(content, lang)
88
+ hash = {"rdf:datatype" => @value.to_s}
89
+ [content.to_s, hash]
90
+ end
91
+
92
+ # Compare literal contents, ignore language
93
+ def compare_contents(a, b, same_lang)
94
+ a == b
95
+ end
96
+
97
+ # Encode literal contents
98
+ def encode_contents(contents, options)
99
+ contents
100
+ end
101
+ end
102
+
103
+ # The null encoding
104
+ class Null < Encoding
105
+ def to_s
106
+ ''
107
+ end
108
+
109
+ # Format content for n3/N-Triples. Quote an RDF-escape and include language
110
+ def format_as_n3(content, lang)
111
+ "\"#{content.to_s.rdf_escape}\"" + (lang ? "@#{lang}" : "")
112
+ end
113
+
114
+ # Format content for TriX
115
+ def format_as_trix(content, lang)
116
+ if lang
117
+ "<plainLiteral xml:lang=\"#{lang}\"\>#{content}</plainLiteral>"
118
+ else
119
+ "<plainLiteral>#{content}</plainLiteral>"
120
+ end
121
+ end
122
+
123
+ # Return content and hash appropriate for encoding in XML
124
+ #
125
+ # ==== Example
126
+ # Encoding.the_null_encoding.xml_args("foo", "en-US") => ["foo", {"xml:lang" => "en-US"}]
127
+ def xml_args(content, lang)
128
+ hash = {}
129
+ hash["xml:lang"] = lang if lang
130
+ [content, hash]
131
+ end
132
+
133
+ # Compare literal contents, requiring languages to match
134
+ def compare_contents(a, b, same_lang)
135
+ a == b && same_lang
136
+ end
137
+
138
+ def inspect
139
+ "<Literal::Encoding::Null>"
140
+ end
141
+ end
142
+
143
+ class XMLLiteral < Encoding
144
+ # Compare XMLLiterals
145
+ #
146
+ # Nokogiri doesn't do a deep compare of elements
147
+ #
148
+ # Convert node-sets to hash using ActiveSupport::XmlMini and compare hashes.
149
+ def compare_contents(a, b, same_lang)
150
+ begin
151
+ a_hash = ActiveSupport::XmlMini.parse("<foo>#{a}</foo>")
152
+ b_hash = ActiveSupport::XmlMini.parse("<foo>#{b}</foo>")
153
+ a_hash == b_hash
154
+ rescue
155
+ super
156
+ end
157
+ end
158
+
159
+ def format_as_n3(content, lang)
160
+ "\"#{content.to_s.rdf_escape}\"^^<#{value}>"
161
+ end
162
+
163
+ def format_as_trix(content, lang)
164
+ "<typedLiteral datatype=\"#{@value}\">#{content}</typedLiteral>"
165
+ end
166
+
167
+ def xml_args(content, lang)
168
+ hash = {"rdf:parseType" => "Literal"}
169
+ [content, hash]
170
+ end
171
+
172
+ # Map namespaces from context to each top-level element found within node-set
173
+ def encode_contents(contents, options)
174
+ #puts "encode_contents: '#{contents}'"
175
+ if contents.is_a?(String)
176
+ ns_hash = options[:namespaces].values.inject({}) {|h, ns| h.merge(ns.xmlns_hash)}
177
+ ns_strs = []
178
+ ns_hash.each_pair {|a, u| ns_strs << "#{a}=\"#{u}\""}
179
+
180
+ # Add inherited namespaces to created root element so that they're inherited to sub-elements
181
+ contents = Nokogiri::XML::Document.parse("<foo #{ns_strs.join(" ")}>#{contents}</foo>").root.children
182
+ end
183
+
184
+ # Add already mapped namespaces and language
185
+ @contents = contents.map do |c|
186
+ c = Nokogiri::XML.parse(c.copy(true).to_s) if c.is_a?(LibXML::XML::Node)
187
+ if c.is_a?(Nokogiri::XML::Element)
188
+ # Gather namespaces from self and decendant nodes
189
+ c.traverse do |n|
190
+ ns = n.namespace
191
+ next unless ns
192
+ prefix = ns.prefix ? "xmlns:#{ns.prefix}" : "xmlns"
193
+ c[prefix] = ns.href unless c.namespaces[prefix]
194
+ end
195
+
196
+ # Add lanuage
197
+ if options[:language] && c["lang"].to_s.empty?
198
+ c["xml:lang"] = options[:language]
199
+ end
200
+ end
201
+ c.to_html
202
+ end.join("")
203
+ end
204
+ end
205
+
206
+ class Language
207
+ attr_accessor :value
208
+ def initialize(string)
209
+ @value = string.to_s.downcase
210
+ end
211
+
212
+ def clean(string)
213
+ case string
214
+ when "eng"; "en"
215
+ else string
216
+ end
217
+ end
218
+
219
+ def == (other)
220
+ case other
221
+ when String
222
+ other == @value
223
+ when self.class
224
+ other.value == @value
225
+ end
226
+ end
227
+
228
+ def to_s; @value; end
229
+ end
230
+
231
+ attr_accessor :contents, :encoding, :lang
232
+
233
+ # Create a new Literal. Optinally pass a namespaces hash
234
+ # for use in applying to rdf::XMLLiteral values.
235
+ def initialize(contents, encoding, options = {})
236
+ unless encoding.is_a?(Encoding)
237
+ raise TypeError, "#{encoding.inspect} should be an instance of Encoding"
238
+ end
239
+ @encoding = encoding
240
+ lang = options[:language]
241
+ @lang = Language.new(lang) if lang
242
+ options = {:namespaces => {}}.merge(options)
243
+
244
+ @contents = @encoding.encode_contents(contents, options)
245
+ end
246
+
247
+ # Create literal from a string that is already N3 encoded.
248
+ def self.n3_encoded(contents, language, encoding = nil)
249
+ encoding = encoding.nil? ? Encoding.the_null_encoding : Encoding.coerce(encoding)
250
+ options = {}
251
+ options[:language] = language if language
252
+ #puts "encoded: #{contents.dump}"
253
+ contents = contents.rdf_unescape
254
+ #puts "unencoded: #{contents.dump}"
255
+ new(contents, encoding, options)
256
+ end
257
+
258
+ # Create an un-typed literal with a language
259
+ def self.untyped(contents, language = nil)
260
+ options = {}
261
+ options[:language] = language if language
262
+ new(contents, Encoding.the_null_encoding, options)
263
+ end
264
+
265
+ # Create a typed literal
266
+ # Options include:
267
+ # _namespaces_:: A hash of namespace entries (for XMLLiteral)
268
+ def self.typed(contents, encoding, options = {})
269
+ encoding = Encoding.coerce(encoding)
270
+ new(contents, encoding, options)
271
+ end
272
+
273
+ # Create a literal appropriate for type of object by datatype introspection
274
+ def self.build_from(object)
275
+ new(object.to_s, infer_encoding_for(object))
276
+ end
277
+
278
+ # Infer the proper XML datatype for the given object
279
+ def self.infer_encoding_for(object)
280
+ case object
281
+ when Integer then Encoding.new("http://www.w3.org/2001/XMLSchema#int")
282
+ when Float then Encoding.new("http://www.w3.org/2001/XMLSchema#float")
283
+ when Time then Encoding.new("http://www.w3.org/2001/XMLSchema#time")
284
+ when DateTime then Encoding.new("http://www.w3.org/2001/XMLSchema#dateTime")
285
+ when Date then Encoding.new("http://www.w3.org/2001/XMLSchema#date")
286
+ else Encoding.new("http://www.w3.org/2001/XMLSchema#string")
287
+ end
288
+ end
289
+
290
+ class << self
291
+ protected :new
292
+ end
293
+
294
+ # Compare literal with another literal or a string.
295
+ # If a string is passed, only contents must match.
296
+ # Otherwise, compare encoding types, contents and languages.
297
+ def ==(other)
298
+ case other
299
+ when String then other == self.contents
300
+ when self.class
301
+ other.encoding == @encoding &&
302
+ @encoding.compare_contents(self.contents, other.contents, other.lang == @lang)
303
+ else false
304
+ end
305
+ end
306
+
307
+ def hash
308
+ [@contents, @encoding, @lang].hash
309
+ end
310
+
311
+ # Output literal in N3 format
312
+ def to_n3
313
+ encoding.format_as_n3(self.contents, @lang)
314
+ end
315
+ alias_method :to_ntriples, :to_n3
316
+
317
+ # Output literal in TriX format
318
+ def to_trix
319
+ encoding.format_as_trix(@contents, @lang)
320
+ end
321
+
322
+ # Return content and hash appropriate for encoding in XML
323
+ #
324
+ # ==== Example
325
+ # Encoding.the_null_encoding.xml_args("foo", "en-US") => ["foo", {"xml:lang" => "en-US"}]
326
+ def xml_args
327
+ encoding.xml_args( @contents, @lang)
328
+ end
329
+
330
+ # Is this an XMLLiteral?
331
+ def xmlliteral?
332
+ encoding.is_a?(XMLLiteral)
333
+ end
334
+
335
+ # Output literal contents as a string
336
+ def to_s
337
+ self.contents.to_s
338
+ end
339
+ end
340
+ end