rdf-rdfxml 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (386) hide show
  1. data/.gitignore +2 -0
  2. data/.yardopts +2 -1
  3. data/CONTRIBUTORS +1 -0
  4. data/History.txt +7 -0
  5. data/README.rdoc +19 -2
  6. data/Rakefile +14 -0
  7. data/VERSION +1 -1
  8. data/example.rb +0 -1
  9. data/lib/rdf/rdfxml.rb +14 -6
  10. data/lib/rdf/rdfxml/format.rb +6 -5
  11. data/lib/rdf/rdfxml/patches/array_hacks.rb +53 -0
  12. data/lib/rdf/rdfxml/patches/nokogiri_hacks.rb +8 -0
  13. data/lib/rdf/rdfxml/patches/rdf_escape.rb +131 -0
  14. data/lib/rdf/rdfxml/reader.rb +90 -57
  15. data/lib/rdf/rdfxml/version.rb +1 -1
  16. data/lib/rdf/rdfxml/vocab.rb +3 -0
  17. data/lib/rdf/rdfxml/writer.rb +399 -0
  18. data/rdf-rdfxml.gemspec +448 -0
  19. data/script/console +10 -0
  20. data/spec/format_spec.rb +22 -0
  21. data/spec/matchers.rb +121 -0
  22. data/spec/rdf_helper.rb +176 -0
  23. data/spec/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.nt +24 -0
  24. data/spec/rdf_tests/cc197bad-dc9c-440d-a5b5-d52ba2e14234.rdf +46 -0
  25. data/spec/rdf_tests/tm_001.nt +1 -0
  26. data/spec/rdf_tests/tm_001.rdf +7 -0
  27. data/spec/rdf_tests/xml-literal-mixed.nt +6 -0
  28. data/spec/rdf_tests/xml-literal-mixed.rdf +15 -0
  29. data/spec/rdfcore/Manifest.rdf +5395 -0
  30. data/spec/rdfcore/Manifest.yml +1970 -0
  31. data/spec/rdfcore/amp-in-url/test001.nt +16 -0
  32. data/spec/rdfcore/amp-in-url/test001.rdf +40 -0
  33. data/spec/rdfcore/datatypes-intensional/test001.nt +18 -0
  34. data/spec/rdfcore/datatypes-intensional/test002.nt +18 -0
  35. data/spec/rdfcore/datatypes/test001.nt +15 -0
  36. data/spec/rdfcore/datatypes/test001.rdf +29 -0
  37. data/spec/rdfcore/datatypes/test002.nt +14 -0
  38. data/spec/rdfcore/datatypes/test002.rdf +27 -0
  39. data/spec/rdfcore/datatypes/test002b.nt +17 -0
  40. data/spec/rdfcore/datatypes/test003a.nt +16 -0
  41. data/spec/rdfcore/datatypes/test003b.nt +16 -0
  42. data/spec/rdfcore/datatypes/test005a.nt +16 -0
  43. data/spec/rdfcore/datatypes/test005b.nt +16 -0
  44. data/spec/rdfcore/datatypes/test006.nt +17 -0
  45. data/spec/rdfcore/datatypes/test008a.nt +15 -0
  46. data/spec/rdfcore/datatypes/test008b.nt +15 -0
  47. data/spec/rdfcore/datatypes/test009a.nt +15 -0
  48. data/spec/rdfcore/datatypes/test009b.nt +15 -0
  49. data/spec/rdfcore/datatypes/test010.nt +17 -0
  50. data/spec/rdfcore/datatypes/test011a.nt +17 -0
  51. data/spec/rdfcore/datatypes/test011b.nt +17 -0
  52. data/spec/rdfcore/horst-01/test001.rdf +38 -0
  53. data/spec/rdfcore/horst-01/test002.rdf +39 -0
  54. data/spec/rdfcore/horst-01/test003.rdf +40 -0
  55. data/spec/rdfcore/horst-01/test004.rdf +42 -0
  56. data/spec/rdfcore/pfps-10/test001a.nt +14 -0
  57. data/spec/rdfcore/pfps-10/test001b.nt +15 -0
  58. data/spec/rdfcore/rdf-charmod-literals/test001.nt +15 -0
  59. data/spec/rdfcore/rdf-charmod-literals/test001.rdf +34 -0
  60. data/spec/rdfcore/rdf-charmod-uris/test001.nt +14 -0
  61. data/spec/rdfcore/rdf-charmod-uris/test001.rdf +34 -0
  62. data/spec/rdfcore/rdf-charmod-uris/test002.nt +15 -0
  63. data/spec/rdfcore/rdf-charmod-uris/test002.rdf +33 -0
  64. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error001.rdf +27 -0
  65. data/spec/rdfcore/rdf-containers-syntax-vs-schema/error002.rdf +34 -0
  66. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.nt +17 -0
  67. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test001.rdf +27 -0
  68. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.nt +19 -0
  69. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test002.rdf +37 -0
  70. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.nt +18 -0
  71. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test003.rdf +29 -0
  72. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.nt +29 -0
  73. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test004.rdf +33 -0
  74. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.nt +40 -0
  75. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test006.rdf +28 -0
  76. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.nt +20 -0
  77. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test007.rdf +32 -0
  78. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.nt +15 -0
  79. data/spec/rdfcore/rdf-containers-syntax-vs-schema/test008.rdf +28 -0
  80. data/spec/rdfcore/rdf-element-not-mandatory/test001.nt +10 -0
  81. data/spec/rdfcore/rdf-element-not-mandatory/test001.rdf +14 -0
  82. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.nt +14 -0
  83. data/spec/rdfcore/rdf-ns-prefix-confusion/test0001.rdf +35 -0
  84. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.nt +14 -0
  85. data/spec/rdfcore/rdf-ns-prefix-confusion/test0003.rdf +35 -0
  86. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.nt +14 -0
  87. data/spec/rdfcore/rdf-ns-prefix-confusion/test0004.rdf +34 -0
  88. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.nt +15 -0
  89. data/spec/rdfcore/rdf-ns-prefix-confusion/test0005.rdf +40 -0
  90. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.nt +14 -0
  91. data/spec/rdfcore/rdf-ns-prefix-confusion/test0006.rdf +32 -0
  92. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.nt +14 -0
  93. data/spec/rdfcore/rdf-ns-prefix-confusion/test0009.rdf +32 -0
  94. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.nt +14 -0
  95. data/spec/rdfcore/rdf-ns-prefix-confusion/test0010.rdf +38 -0
  96. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.nt +15 -0
  97. data/spec/rdfcore/rdf-ns-prefix-confusion/test0011.rdf +40 -0
  98. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.nt +15 -0
  99. data/spec/rdfcore/rdf-ns-prefix-confusion/test0012.rdf +40 -0
  100. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.nt +15 -0
  101. data/spec/rdfcore/rdf-ns-prefix-confusion/test0013.rdf +40 -0
  102. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.nt +15 -0
  103. data/spec/rdfcore/rdf-ns-prefix-confusion/test0014.rdf +42 -0
  104. data/spec/rdfcore/rdfms-abouteach/error001.rdf +35 -0
  105. data/spec/rdfcore/rdfms-abouteach/error002.rdf +35 -0
  106. data/spec/rdfcore/rdfms-difference-between-ID-and-about/error1.rdf +25 -0
  107. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.nt +14 -0
  108. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test1.rdf +22 -0
  109. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.nt +14 -0
  110. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test2.rdf +22 -0
  111. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.nt +14 -0
  112. data/spec/rdfcore/rdfms-difference-between-ID-and-about/test3.rdf +22 -0
  113. data/spec/rdfcore/rdfms-duplicate-member-props/test001.nt +17 -0
  114. data/spec/rdfcore/rdfms-duplicate-member-props/test001.rdf +30 -0
  115. data/spec/rdfcore/rdfms-empty-property-elements/error001.rdf +33 -0
  116. data/spec/rdfcore/rdfms-empty-property-elements/error002.rdf +33 -0
  117. data/spec/rdfcore/rdfms-empty-property-elements/error003.rdf +39 -0
  118. data/spec/rdfcore/rdfms-empty-property-elements/test001.nt +14 -0
  119. data/spec/rdfcore/rdfms-empty-property-elements/test001.rdf +33 -0
  120. data/spec/rdfcore/rdfms-empty-property-elements/test002.nt +14 -0
  121. data/spec/rdfcore/rdfms-empty-property-elements/test002.rdf +31 -0
  122. data/spec/rdfcore/rdfms-empty-property-elements/test003.nt +14 -0
  123. data/spec/rdfcore/rdfms-empty-property-elements/test003.rdf +32 -0
  124. data/spec/rdfcore/rdfms-empty-property-elements/test004.nt +14 -0
  125. data/spec/rdfcore/rdfms-empty-property-elements/test004.rdf +32 -0
  126. data/spec/rdfcore/rdfms-empty-property-elements/test005.nt +18 -0
  127. data/spec/rdfcore/rdfms-empty-property-elements/test005.rdf +32 -0
  128. data/spec/rdfcore/rdfms-empty-property-elements/test006.nt +18 -0
  129. data/spec/rdfcore/rdfms-empty-property-elements/test006.rdf +32 -0
  130. data/spec/rdfcore/rdfms-empty-property-elements/test007.nt +14 -0
  131. data/spec/rdfcore/rdfms-empty-property-elements/test007.rdf +32 -0
  132. data/spec/rdfcore/rdfms-empty-property-elements/test008.nt +14 -0
  133. data/spec/rdfcore/rdfms-empty-property-elements/test008.rdf +31 -0
  134. data/spec/rdfcore/rdfms-empty-property-elements/test009.nt +14 -0
  135. data/spec/rdfcore/rdfms-empty-property-elements/test009.rdf +32 -0
  136. data/spec/rdfcore/rdfms-empty-property-elements/test010.nt +14 -0
  137. data/spec/rdfcore/rdfms-empty-property-elements/test010.rdf +31 -0
  138. data/spec/rdfcore/rdfms-empty-property-elements/test011.nt +18 -0
  139. data/spec/rdfcore/rdfms-empty-property-elements/test011.rdf +30 -0
  140. data/spec/rdfcore/rdfms-empty-property-elements/test012.nt +18 -0
  141. data/spec/rdfcore/rdfms-empty-property-elements/test012.rdf +30 -0
  142. data/spec/rdfcore/rdfms-empty-property-elements/test013.nt +15 -0
  143. data/spec/rdfcore/rdfms-empty-property-elements/test013.rdf +35 -0
  144. data/spec/rdfcore/rdfms-empty-property-elements/test014.nt +15 -0
  145. data/spec/rdfcore/rdfms-empty-property-elements/test014.rdf +34 -0
  146. data/spec/rdfcore/rdfms-empty-property-elements/test015.nt +15 -0
  147. data/spec/rdfcore/rdfms-empty-property-elements/test015.rdf +38 -0
  148. data/spec/rdfcore/rdfms-empty-property-elements/test016.nt +14 -0
  149. data/spec/rdfcore/rdfms-empty-property-elements/test016.rdf +31 -0
  150. data/spec/rdfcore/rdfms-empty-property-elements/test017.nt +14 -0
  151. data/spec/rdfcore/rdfms-empty-property-elements/test017.rdf +38 -0
  152. data/spec/rdfcore/rdfms-identity-anon-resources/test001.nt +14 -0
  153. data/spec/rdfcore/rdfms-identity-anon-resources/test001.rdf +33 -0
  154. data/spec/rdfcore/rdfms-identity-anon-resources/test002.nt +15 -0
  155. data/spec/rdfcore/rdfms-identity-anon-resources/test002.rdf +33 -0
  156. data/spec/rdfcore/rdfms-identity-anon-resources/test003.nt +14 -0
  157. data/spec/rdfcore/rdfms-identity-anon-resources/test003.rdf +31 -0
  158. data/spec/rdfcore/rdfms-identity-anon-resources/test004.nt +15 -0
  159. data/spec/rdfcore/rdfms-identity-anon-resources/test004.rdf +33 -0
  160. data/spec/rdfcore/rdfms-identity-anon-resources/test005.nt +14 -0
  161. data/spec/rdfcore/rdfms-identity-anon-resources/test005.rdf +31 -0
  162. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.nt +19 -0
  163. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test001.rdf +29 -0
  164. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.nt +15 -0
  165. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test002.rdf +29 -0
  166. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.nt +18 -0
  167. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test004.rdf +29 -0
  168. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.nt +19 -0
  169. data/spec/rdfcore/rdfms-not-id-and-resource-attr/test005.rdf +29 -0
  170. data/spec/rdfcore/rdfms-para196/test001.nt +17 -0
  171. data/spec/rdfcore/rdfms-para196/test001.rdf +35 -0
  172. data/spec/rdfcore/rdfms-rdf-id/error001.rdf +26 -0
  173. data/spec/rdfcore/rdfms-rdf-id/error002.rdf +26 -0
  174. data/spec/rdfcore/rdfms-rdf-id/error003.rdf +29 -0
  175. data/spec/rdfcore/rdfms-rdf-id/error004.rdf +27 -0
  176. data/spec/rdfcore/rdfms-rdf-id/error005.rdf +31 -0
  177. data/spec/rdfcore/rdfms-rdf-id/error006.rdf +26 -0
  178. data/spec/rdfcore/rdfms-rdf-id/error007.rdf +29 -0
  179. data/spec/rdfcore/rdfms-rdf-names-use/error-001.rdf +23 -0
  180. data/spec/rdfcore/rdfms-rdf-names-use/error-002.rdf +23 -0
  181. data/spec/rdfcore/rdfms-rdf-names-use/error-003.rdf +23 -0
  182. data/spec/rdfcore/rdfms-rdf-names-use/error-004.rdf +23 -0
  183. data/spec/rdfcore/rdfms-rdf-names-use/error-005.rdf +23 -0
  184. data/spec/rdfcore/rdfms-rdf-names-use/error-006.rdf +23 -0
  185. data/spec/rdfcore/rdfms-rdf-names-use/error-007.rdf +23 -0
  186. data/spec/rdfcore/rdfms-rdf-names-use/error-008.rdf +23 -0
  187. data/spec/rdfcore/rdfms-rdf-names-use/error-009.rdf +23 -0
  188. data/spec/rdfcore/rdfms-rdf-names-use/error-010.rdf +23 -0
  189. data/spec/rdfcore/rdfms-rdf-names-use/error-011.rdf +25 -0
  190. data/spec/rdfcore/rdfms-rdf-names-use/error-012.rdf +25 -0
  191. data/spec/rdfcore/rdfms-rdf-names-use/error-013.rdf +25 -0
  192. data/spec/rdfcore/rdfms-rdf-names-use/error-014.rdf +25 -0
  193. data/spec/rdfcore/rdfms-rdf-names-use/error-015.rdf +25 -0
  194. data/spec/rdfcore/rdfms-rdf-names-use/error-016.rdf +25 -0
  195. data/spec/rdfcore/rdfms-rdf-names-use/error-017.rdf +25 -0
  196. data/spec/rdfcore/rdfms-rdf-names-use/error-018.rdf +25 -0
  197. data/spec/rdfcore/rdfms-rdf-names-use/error-019.rdf +25 -0
  198. data/spec/rdfcore/rdfms-rdf-names-use/error-020.rdf +25 -0
  199. data/spec/rdfcore/rdfms-rdf-names-use/test-001.nt +1 -0
  200. data/spec/rdfcore/rdfms-rdf-names-use/test-001.rdf +23 -0
  201. data/spec/rdfcore/rdfms-rdf-names-use/test-002.nt +1 -0
  202. data/spec/rdfcore/rdfms-rdf-names-use/test-002.rdf +23 -0
  203. data/spec/rdfcore/rdfms-rdf-names-use/test-003.nt +1 -0
  204. data/spec/rdfcore/rdfms-rdf-names-use/test-003.rdf +23 -0
  205. data/spec/rdfcore/rdfms-rdf-names-use/test-004.nt +1 -0
  206. data/spec/rdfcore/rdfms-rdf-names-use/test-004.rdf +23 -0
  207. data/spec/rdfcore/rdfms-rdf-names-use/test-005.nt +1 -0
  208. data/spec/rdfcore/rdfms-rdf-names-use/test-005.rdf +23 -0
  209. data/spec/rdfcore/rdfms-rdf-names-use/test-006.nt +1 -0
  210. data/spec/rdfcore/rdfms-rdf-names-use/test-006.rdf +23 -0
  211. data/spec/rdfcore/rdfms-rdf-names-use/test-007.nt +1 -0
  212. data/spec/rdfcore/rdfms-rdf-names-use/test-007.rdf +23 -0
  213. data/spec/rdfcore/rdfms-rdf-names-use/test-008.nt +1 -0
  214. data/spec/rdfcore/rdfms-rdf-names-use/test-008.rdf +23 -0
  215. data/spec/rdfcore/rdfms-rdf-names-use/test-009.nt +1 -0
  216. data/spec/rdfcore/rdfms-rdf-names-use/test-009.rdf +23 -0
  217. data/spec/rdfcore/rdfms-rdf-names-use/test-010.nt +1 -0
  218. data/spec/rdfcore/rdfms-rdf-names-use/test-010.rdf +23 -0
  219. data/spec/rdfcore/rdfms-rdf-names-use/test-011.nt +1 -0
  220. data/spec/rdfcore/rdfms-rdf-names-use/test-011.rdf +23 -0
  221. data/spec/rdfcore/rdfms-rdf-names-use/test-012.nt +1 -0
  222. data/spec/rdfcore/rdfms-rdf-names-use/test-012.rdf +23 -0
  223. data/spec/rdfcore/rdfms-rdf-names-use/test-013.nt +1 -0
  224. data/spec/rdfcore/rdfms-rdf-names-use/test-013.rdf +23 -0
  225. data/spec/rdfcore/rdfms-rdf-names-use/test-014.nt +1 -0
  226. data/spec/rdfcore/rdfms-rdf-names-use/test-014.rdf +23 -0
  227. data/spec/rdfcore/rdfms-rdf-names-use/test-015.nt +1 -0
  228. data/spec/rdfcore/rdfms-rdf-names-use/test-015.rdf +23 -0
  229. data/spec/rdfcore/rdfms-rdf-names-use/test-016.nt +1 -0
  230. data/spec/rdfcore/rdfms-rdf-names-use/test-016.rdf +23 -0
  231. data/spec/rdfcore/rdfms-rdf-names-use/test-017.nt +1 -0
  232. data/spec/rdfcore/rdfms-rdf-names-use/test-017.rdf +25 -0
  233. data/spec/rdfcore/rdfms-rdf-names-use/test-018.nt +1 -0
  234. data/spec/rdfcore/rdfms-rdf-names-use/test-018.rdf +25 -0
  235. data/spec/rdfcore/rdfms-rdf-names-use/test-019.nt +1 -0
  236. data/spec/rdfcore/rdfms-rdf-names-use/test-019.rdf +25 -0
  237. data/spec/rdfcore/rdfms-rdf-names-use/test-020.nt +1 -0
  238. data/spec/rdfcore/rdfms-rdf-names-use/test-020.rdf +25 -0
  239. data/spec/rdfcore/rdfms-rdf-names-use/test-021.nt +1 -0
  240. data/spec/rdfcore/rdfms-rdf-names-use/test-021.rdf +25 -0
  241. data/spec/rdfcore/rdfms-rdf-names-use/test-022.nt +1 -0
  242. data/spec/rdfcore/rdfms-rdf-names-use/test-022.rdf +25 -0
  243. data/spec/rdfcore/rdfms-rdf-names-use/test-023.nt +1 -0
  244. data/spec/rdfcore/rdfms-rdf-names-use/test-023.rdf +25 -0
  245. data/spec/rdfcore/rdfms-rdf-names-use/test-024.nt +1 -0
  246. data/spec/rdfcore/rdfms-rdf-names-use/test-024.rdf +25 -0
  247. data/spec/rdfcore/rdfms-rdf-names-use/test-025.nt +1 -0
  248. data/spec/rdfcore/rdfms-rdf-names-use/test-025.rdf +25 -0
  249. data/spec/rdfcore/rdfms-rdf-names-use/test-026.nt +1 -0
  250. data/spec/rdfcore/rdfms-rdf-names-use/test-026.rdf +25 -0
  251. data/spec/rdfcore/rdfms-rdf-names-use/test-027.nt +1 -0
  252. data/spec/rdfcore/rdfms-rdf-names-use/test-027.rdf +25 -0
  253. data/spec/rdfcore/rdfms-rdf-names-use/test-028.nt +1 -0
  254. data/spec/rdfcore/rdfms-rdf-names-use/test-028.rdf +25 -0
  255. data/spec/rdfcore/rdfms-rdf-names-use/test-029.nt +1 -0
  256. data/spec/rdfcore/rdfms-rdf-names-use/test-029.rdf +25 -0
  257. data/spec/rdfcore/rdfms-rdf-names-use/test-030.nt +1 -0
  258. data/spec/rdfcore/rdfms-rdf-names-use/test-030.rdf +25 -0
  259. data/spec/rdfcore/rdfms-rdf-names-use/test-031.nt +1 -0
  260. data/spec/rdfcore/rdfms-rdf-names-use/test-031.rdf +25 -0
  261. data/spec/rdfcore/rdfms-rdf-names-use/test-032.nt +1 -0
  262. data/spec/rdfcore/rdfms-rdf-names-use/test-032.rdf +24 -0
  263. data/spec/rdfcore/rdfms-rdf-names-use/test-033.nt +1 -0
  264. data/spec/rdfcore/rdfms-rdf-names-use/test-033.rdf +24 -0
  265. data/spec/rdfcore/rdfms-rdf-names-use/test-034.nt +1 -0
  266. data/spec/rdfcore/rdfms-rdf-names-use/test-034.rdf +24 -0
  267. data/spec/rdfcore/rdfms-rdf-names-use/test-035.nt +1 -0
  268. data/spec/rdfcore/rdfms-rdf-names-use/test-035.rdf +24 -0
  269. data/spec/rdfcore/rdfms-rdf-names-use/test-036.nt +1 -0
  270. data/spec/rdfcore/rdfms-rdf-names-use/test-036.rdf +24 -0
  271. data/spec/rdfcore/rdfms-rdf-names-use/test-037.nt +1 -0
  272. data/spec/rdfcore/rdfms-rdf-names-use/test-037.rdf +24 -0
  273. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.nt +1 -0
  274. data/spec/rdfcore/rdfms-rdf-names-use/warn-001.rdf +23 -0
  275. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.nt +1 -0
  276. data/spec/rdfcore/rdfms-rdf-names-use/warn-002.rdf +25 -0
  277. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.nt +1 -0
  278. data/spec/rdfcore/rdfms-rdf-names-use/warn-003.rdf +24 -0
  279. data/spec/rdfcore/rdfms-reification-required/test001.nt +15 -0
  280. data/spec/rdfcore/rdfms-reification-required/test001.rdf +29 -0
  281. data/spec/rdfcore/rdfms-seq-representation/empty.nt +13 -0
  282. data/spec/rdfcore/rdfms-seq-representation/test001.nt +19 -0
  283. data/spec/rdfcore/rdfms-seq-representation/test001.rdf +33 -0
  284. data/spec/rdfcore/rdfms-seq-representation/test002.nt +14 -0
  285. data/spec/rdfcore/rdfms-seq-representation/test003a.nt +14 -0
  286. data/spec/rdfcore/rdfms-seq-representation/test003b.nt +14 -0
  287. data/spec/rdfcore/rdfms-seq-representation/test004.nt +14 -0
  288. data/spec/rdfcore/rdfms-syntax-incomplete/error001.rdf +26 -0
  289. data/spec/rdfcore/rdfms-syntax-incomplete/error002.rdf +26 -0
  290. data/spec/rdfcore/rdfms-syntax-incomplete/error003.rdf +29 -0
  291. data/spec/rdfcore/rdfms-syntax-incomplete/error004.rdf +25 -0
  292. data/spec/rdfcore/rdfms-syntax-incomplete/error005.rdf +25 -0
  293. data/spec/rdfcore/rdfms-syntax-incomplete/error006.rdf +28 -0
  294. data/spec/rdfcore/rdfms-syntax-incomplete/test001.nt +14 -0
  295. data/spec/rdfcore/rdfms-syntax-incomplete/test001.rdf +28 -0
  296. data/spec/rdfcore/rdfms-syntax-incomplete/test002.nt +19 -0
  297. data/spec/rdfcore/rdfms-syntax-incomplete/test002.rdf +38 -0
  298. data/spec/rdfcore/rdfms-syntax-incomplete/test003.nt +17 -0
  299. data/spec/rdfcore/rdfms-syntax-incomplete/test003.rdf +28 -0
  300. data/spec/rdfcore/rdfms-syntax-incomplete/test004.nt +21 -0
  301. data/spec/rdfcore/rdfms-syntax-incomplete/test004.rdf +36 -0
  302. data/spec/rdfcore/rdfms-uri-substructure/error001.nt +18 -0
  303. data/spec/rdfcore/rdfms-uri-substructure/test001.nt +17 -0
  304. data/spec/rdfcore/rdfms-uri-substructure/test001.rdf +29 -0
  305. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.nt +13 -0
  306. data/spec/rdfcore/rdfms-xml-literal-namespaces/test001.rdf +33 -0
  307. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.nt +14 -0
  308. data/spec/rdfcore/rdfms-xml-literal-namespaces/test002.rdf +47 -0
  309. data/spec/rdfcore/rdfms-xmllang/test001.nt +14 -0
  310. data/spec/rdfcore/rdfms-xmllang/test001.rdf +30 -0
  311. data/spec/rdfcore/rdfms-xmllang/test002.nt +14 -0
  312. data/spec/rdfcore/rdfms-xmllang/test002.rdf +29 -0
  313. data/spec/rdfcore/rdfms-xmllang/test003.nt +14 -0
  314. data/spec/rdfcore/rdfms-xmllang/test003.rdf +28 -0
  315. data/spec/rdfcore/rdfms-xmllang/test004.nt +14 -0
  316. data/spec/rdfcore/rdfms-xmllang/test004.rdf +28 -0
  317. data/spec/rdfcore/rdfms-xmllang/test005.nt +14 -0
  318. data/spec/rdfcore/rdfms-xmllang/test005.rdf +28 -0
  319. data/spec/rdfcore/rdfms-xmllang/test006.nt +14 -0
  320. data/spec/rdfcore/rdfms-xmllang/test006.rdf +29 -0
  321. data/spec/rdfcore/rdfms-xmllang/test007a.nt +14 -0
  322. data/spec/rdfcore/rdfms-xmllang/test007b.nt +14 -0
  323. data/spec/rdfcore/rdfms-xmllang/test007c.nt +14 -0
  324. data/spec/rdfcore/rdfs-container-membership-superProperty/not1C.rdf +13 -0
  325. data/spec/rdfcore/rdfs-container-membership-superProperty/not1P.rdf +14 -0
  326. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions005.rdf +28 -0
  327. data/spec/rdfcore/rdfs-domain-and-range/nonconclusions006.rdf +28 -0
  328. data/spec/rdfcore/rdfs-domain-and-range/premises005.rdf +32 -0
  329. data/spec/rdfcore/rdfs-domain-and-range/premises006.rdf +32 -0
  330. data/spec/rdfcore/rdfs-domain-and-range/test001.nt +16 -0
  331. data/spec/rdfcore/rdfs-domain-and-range/test001.rdf +29 -0
  332. data/spec/rdfcore/rdfs-domain-and-range/test002.nt +16 -0
  333. data/spec/rdfcore/rdfs-domain-and-range/test002.rdf +29 -0
  334. data/spec/rdfcore/rdfs-entailment/test001.nt +16 -0
  335. data/spec/rdfcore/rdfs-entailment/test002.nt +15 -0
  336. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.nt +18 -0
  337. data/spec/rdfcore/rdfs-no-cycles-in-subClassOf/test001.rdf +37 -0
  338. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.nt +18 -0
  339. data/spec/rdfcore/rdfs-no-cycles-in-subPropertyOf/test001.rdf +40 -0
  340. data/spec/rdfcore/rdfs-subClassOf-a-Property/test001.nt +15 -0
  341. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test001.nt +24 -0
  342. data/spec/rdfcore/rdfs-subPropertyOf-semantics/test002.nt +21 -0
  343. data/spec/rdfcore/statement-entailment/test001a.nt +12 -0
  344. data/spec/rdfcore/statement-entailment/test001b.nt +2 -0
  345. data/spec/rdfcore/statement-entailment/test002a.nt +2 -0
  346. data/spec/rdfcore/statement-entailment/test002b.nt +5 -0
  347. data/spec/rdfcore/tex-01/test001.rdf +34 -0
  348. data/spec/rdfcore/tex-01/test002.rdf +33 -0
  349. data/spec/rdfcore/unrecognised-xml-attributes/test001.nt +15 -0
  350. data/spec/rdfcore/unrecognised-xml-attributes/test001.rdf +31 -0
  351. data/spec/rdfcore/unrecognised-xml-attributes/test002.nt +14 -0
  352. data/spec/rdfcore/unrecognised-xml-attributes/test002.rdf +32 -0
  353. data/spec/rdfcore/xml-canon/test001.nt +16 -0
  354. data/spec/rdfcore/xml-canon/test001.rdf +28 -0
  355. data/spec/rdfcore/xmlbase/test001.nt +14 -0
  356. data/spec/rdfcore/xmlbase/test001.rdf +27 -0
  357. data/spec/rdfcore/xmlbase/test002.nt +14 -0
  358. data/spec/rdfcore/xmlbase/test002.rdf +28 -0
  359. data/spec/rdfcore/xmlbase/test003.nt +14 -0
  360. data/spec/rdfcore/xmlbase/test003.rdf +25 -0
  361. data/spec/rdfcore/xmlbase/test004.nt +18 -0
  362. data/spec/rdfcore/xmlbase/test004.rdf +27 -0
  363. data/spec/rdfcore/xmlbase/test006.nt +15 -0
  364. data/spec/rdfcore/xmlbase/test006.rdf +26 -0
  365. data/spec/rdfcore/xmlbase/test007.nt +14 -0
  366. data/spec/rdfcore/xmlbase/test007.rdf +25 -0
  367. data/spec/rdfcore/xmlbase/test008.nt +14 -0
  368. data/spec/rdfcore/xmlbase/test008.rdf +25 -0
  369. data/spec/rdfcore/xmlbase/test009.nt +14 -0
  370. data/spec/rdfcore/xmlbase/test009.rdf +26 -0
  371. data/spec/rdfcore/xmlbase/test010.nt +14 -0
  372. data/spec/rdfcore/xmlbase/test010.rdf +26 -0
  373. data/spec/rdfcore/xmlbase/test011.nt +14 -0
  374. data/spec/rdfcore/xmlbase/test011.rdf +27 -0
  375. data/spec/rdfcore/xmlbase/test013.nt +15 -0
  376. data/spec/rdfcore/xmlbase/test013.rdf +28 -0
  377. data/spec/rdfcore/xmlbase/test014.nt +15 -0
  378. data/spec/rdfcore/xmlbase/test014.rdf +28 -0
  379. data/spec/rdfcore/xmlsch-02/test001.rdf +34 -0
  380. data/spec/rdfcore/xmlsch-02/test002.rdf +34 -0
  381. data/spec/rdfcore/xmlsch-02/test003.rdf +37 -0
  382. data/spec/reader_spec.rb +421 -0
  383. data/spec/spec.opts +1 -0
  384. data/spec/spec_helper.rb +50 -0
  385. data/spec/xml_serializer_spec.rb +386 -0
  386. metadata +385 -6
data/.gitignore ADDED
@@ -0,0 +1,2 @@
1
+ .DS_Store
2
+ /pkg
data/.yardopts CHANGED
@@ -1,4 +1,4 @@
1
- --title "RDF::RDFa - RDFa Support for RDF.rb"
1
+ --title "RDF::RDFXML - RDF/XML Support for RDF.rb"
2
2
  --output-dir doc/yard
3
3
  --protected
4
4
  --no-private
@@ -7,4 +7,5 @@
7
7
  --readme README.rdoc
8
8
  -
9
9
  AUTHORS
10
+ CONTRIBUTORS
10
11
  VERSION
data/CONTRIBUTORS ADDED
@@ -0,0 +1 @@
1
+ * Nicholas Humfrey <nicholas.humfrey@bbc.co.uk>
data/History.txt CHANGED
@@ -1,2 +1,9 @@
1
+ === 0.0.2
2
+ * Added specs from RdfContext
3
+ * Added array_hacks, nokogiri_hacks, and rdf_escape
4
+ * Fixed most bugs that are not related to the underlying framework.
5
+ * Specific failing testcases for rdf-isomorphic, RDF::Literaland others need to be constructed and added as issues against those gems.
6
+ * Removed interal graph in Reader and implement each_triple & each_statement to perform parsing
7
+
1
8
  === 0.0.1
2
9
  * First port from RdfContext version 0.5.4
data/README.rdoc CHANGED
@@ -1,10 +1,10 @@
1
- = RDF::RDFa reader/writer
1
+ = RDF::RDFXML reader/writer
2
2
 
3
3
  RDF/XML parser for RDF.rb.
4
4
 
5
5
  == DESCRIPTION:
6
6
 
7
- RDF::RDFXML is an RDF/XML parser for Ruby using the RDF.rb library suite.
7
+ RDF::RDFXML is an RDF/XML reader/writer for Ruby using the RDF.rb library suite.
8
8
 
9
9
  == FEATURES:
10
10
  RDF::RDFXML parses RDF/XML into statements or triples.
@@ -22,10 +22,27 @@ Instantiate a parser and parse source, specifying type and base-URL
22
22
  end
23
23
  end
24
24
 
25
+ == Dependencies
26
+ * [RDF.rb](http://rubygems.org/gems/rdf) (>= 0.1.6)
27
+ * [Nokogiri](http://rubygems.org/gems/nokogiri) (>= 1.3.3)
28
+
29
+ == TODO
30
+ * Add support for LibXML and REXML bindings, and use the best available
31
+ * Consider a SAX-based parser for improved performance
32
+ * Add generic RDF/XML Writer
33
+
25
34
  == Resources:
26
35
  * Distiller[http://kellogg-assoc/distiller]
27
36
  * RDoc[http://rdoc.info/projects/gkellogg/rdf-rdfxml]
28
37
  * History[http://github.com/gkellogg/rdf-rdfxml/blob/master/History.txt]
38
+ * "XHTML+RDFXML 1.1 Core"[http://www.w3.org/TR/2010/WD-xhtml-rdfa-20100422/]
39
+ * "RDF Tests"[http://www.w3.org/2000/10/rdf-tests/rdfcore/allTestCases.html]
40
+
41
+ == AUTHOR:
42
+ * Gregg Kellogg <gregg@kellogg-assoc.com>
43
+
44
+ == CONTRIBUTORS:
45
+ * Nicholas Humfrey <nicholas.humfrey@bbc.co.uk>
29
46
 
30
47
  == LICENSE:
31
48
 
data/Rakefile CHANGED
@@ -44,4 +44,18 @@ Spec::Rake::SpecTask.new("doc:spec") do |spec|
44
44
  spec.spec_opts = ["--format", "html:doc/spec.html"]
45
45
  end
46
46
 
47
+ desc "Generate RDF Core Manifest.yml"
48
+ namespace :spec do
49
+ task :prepare do
50
+ $:.unshift(File.join(File.dirname(__FILE__), 'lib'))
51
+ require 'rdf/rdfxml'
52
+ require 'spec/rdf_helper'
53
+ require 'fileutils'
54
+
55
+ yaml = File.join(RDFCORE_DIR, "Manifest.yml")
56
+ FileUtils.rm_f(yaml)
57
+ RdfHelper::TestCase.to_yaml(RDFCORE_TEST, RDFCORE_DIR, yaml)
58
+ end
59
+ end
60
+
47
61
  task :default => :spec
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.0.2
data/example.rb CHANGED
@@ -6,7 +6,6 @@ require 'rubygems'
6
6
  require 'rdf/rdfxml'
7
7
 
8
8
  data = <<-EOF;
9
- <?xml version="1.0" ?>
10
9
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
11
10
  xmlns:ex="http://www.example.org/" xml:lang="en" xml:base="http://www.example.org/foo">
12
11
  <ex:Thing rdf:about="http://example.org/joe" ex:name="bar">
data/lib/rdf/rdfxml.rb CHANGED
@@ -1,4 +1,4 @@
1
- $:.unshift(File.dirname(__FILE__)) unless $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
1
+ $:.unshift(File.expand_path(File.join(File.dirname(__FILE__), '..')))
2
2
  require 'rdf'
3
3
 
4
4
  module RDF
@@ -8,7 +8,7 @@ module RDF
8
8
  # @example Requiring the `RDF::RDFXML` module
9
9
  # require 'rdf/rdfxml'
10
10
  #
11
- # @example Parsing RDF statements from an XHTML+RDFa file
11
+ # @example Parsing RDF statements from an XHTML+RDFXML file
12
12
  # RDF::RDFXML::Reader.open("etc/foaf.xml") do |reader|
13
13
  # reader.each_statement do |statement|
14
14
  # puts statement.inspect
@@ -19,10 +19,18 @@ module RDF
19
19
  # @see http://www.w3.org/TR/REC-rdf-syntax/
20
20
  #
21
21
  # @author [Gregg Kellogg](http://kellogg-assoc.com/)
22
- module RDFa
23
- require 'rdfxml/format'
24
- require 'rdfxml/vocab'
22
+ module RDFXML
23
+ require 'rdf/rdfxml/format'
24
+ require 'rdf/rdfxml/vocab'
25
+ require 'rdf/rdfxml/patches/array_hacks'
26
+ require 'rdf/rdfxml/patches/nokogiri_hacks'
27
+ require 'rdf/rdfxml/patches/rdf_escape'
25
28
  autoload :Reader, 'rdf/rdfxml/reader'
29
+ autoload :Writer, 'rdf/rdfxml/writer'
26
30
  autoload :VERSION, 'rdf/rdfxml/version'
31
+ autoload :XML, 'rdf/rdfxml/vocab'
32
+
33
+ # Fixme: RDF.to_s should generate this, but it doesn't
34
+ RDF_NS = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
27
35
  end
28
- end
36
+ end
@@ -1,9 +1,10 @@
1
1
  module RDF::RDFXML
2
2
  ##
3
- # RDFa format specification.
3
+ # RDFXML format specification.
4
4
  #
5
- # @example Obtaining an RDFa format class
6
- # RDF::Format.for(:rdfxml) #=> RDF::RDFXML::Format
5
+ # @example Obtaining an RDFXML format class
6
+ # RDF::Format.for(:rdf) # RDF::RDFXML::Format
7
+ # RDF::Format.for(:xml) # RDF::RDFXML::Format
7
8
  # RDF::Format.for("etc/foaf.xml")
8
9
  # RDF::Format.for(:file_name => "etc/foaf.xml")
9
10
  # RDF::Format.for(:file_extension => "xml")
@@ -23,7 +24,7 @@ module RDF::RDFXML
23
24
  content_type 'application/rdf+xml', :extension => :rdf
24
25
  content_encoding 'utf-8'
25
26
 
26
- reader { RDF::RDFa::RDFXML }
27
- writer { RDF::RDFa::RDFXML }
27
+ reader { RDF::RDFXML::Reader }
28
+ writer { RDF::RDFXML::Writer }
28
29
  end
29
30
  end
@@ -0,0 +1,53 @@
1
+ class Array
2
+ # http://wiki.rubygarden.org/Ruby/page/show/ArrayPermute
3
+ # Permute an array, and call a block for each permutation
4
+ # Author: Paul Battley
5
+ def permute(prefixed=[])
6
+ if (length < 2)
7
+ # there are no elements left to permute
8
+ yield(prefixed + self)
9
+ else
10
+ # recursively permute the remaining elements
11
+ each_with_index do |e, i|
12
+ (self[0,i]+self[(i+1)..-1]).permute(prefixed+[e]) { |a| yield a }
13
+ end
14
+ end
15
+ end unless Array.method_defined?(:permute)
16
+
17
+ # Converts the array to a comma-separated sentence where the last element is joined by the connector word. Options:
18
+ # * <tt>:words_connector</tt> - The sign or word used to join the elements in arrays with two or more elements (default: ", ")
19
+ # * <tt>:two_words_connector</tt> - The sign or word used to join the elements in arrays with two elements (default: " and ")
20
+ # * <tt>:last_word_connector</tt> - The sign or word used to join the last element in arrays with three or more elements (default: ", and ")
21
+ def to_sentence(options = {})
22
+ default_words_connector = ", "
23
+ default_two_words_connector = " and "
24
+ default_last_word_connector = ", and "
25
+
26
+ # Try to emulate to_senteces previous to 2.3
27
+ if options.has_key?(:connector) || options.has_key?(:skip_last_comma)
28
+ ::ActiveSupport::Deprecation.warn(":connector has been deprecated. Use :words_connector instead", caller) if options.has_key? :connector
29
+ ::ActiveSupport::Deprecation.warn(":skip_last_comma has been deprecated. Use :last_word_connector instead", caller) if options.has_key? :skip_last_comma
30
+
31
+ skip_last_comma = options.delete :skip_last_comma
32
+ if connector = options.delete(:connector)
33
+ options[:last_word_connector] ||= skip_last_comma ? connector : ", #{connector}"
34
+ else
35
+ options[:last_word_connector] ||= skip_last_comma ? default_two_words_connector : default_last_word_connector
36
+ end
37
+ end
38
+
39
+ # options.assert_valid_keys(:words_connector, :two_words_connector, :last_word_connector, :locale)
40
+ options = {:words_connector => default_words_connector, :two_words_connector => default_two_words_connector, :last_word_connector => default_last_word_connector}.merge(options)
41
+
42
+ case length
43
+ when 0
44
+ ""
45
+ when 1
46
+ self[0].to_s
47
+ when 2
48
+ "#{self[0]}#{options[:two_words_connector]}#{self[1]}"
49
+ else
50
+ "#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
51
+ end
52
+ end unless Array.method_defined?(:to_sentence)
53
+ end
@@ -0,0 +1,8 @@
1
+ require 'nokogiri'
2
+ class Nokogiri::XML::Node
3
+ # URI of namespace + node_name
4
+ def uri
5
+ ns = self.namespace ? self.namespace.href : RDF::XML.to_s
6
+ RDF::URI.new(ns + self.node_name)
7
+ end
8
+ end unless Nokogiri::XML::Node.method_defined?(:uri)
@@ -0,0 +1,131 @@
1
+ # coding: utf-8
2
+ require 'iconv'
3
+
4
+ class String
5
+ #private
6
+ # "Borrowed" from JSON utf8_to_json
7
+ RDF_MAP = {
8
+ "\x0" => '\u0000',
9
+ "\x1" => '\u0001',
10
+ "\x2" => '\u0002',
11
+ "\x3" => '\u0003',
12
+ "\x4" => '\u0004',
13
+ "\x5" => '\u0005',
14
+ "\x6" => '\u0006',
15
+ "\x7" => '\u0007',
16
+ "\b" => '\b',
17
+ "\t" => '\t',
18
+ "\n" => '\n',
19
+ "\xb" => '\u000B',
20
+ "\f" => '\f',
21
+ "\r" => '\r',
22
+ "\xe" => '\u000E',
23
+ "\xf" => '\u000F',
24
+ "\x10" => '\u0010',
25
+ "\x11" => '\u0011',
26
+ "\x12" => '\u0012',
27
+ "\x13" => '\u0013',
28
+ "\x14" => '\u0014',
29
+ "\x15" => '\u0015',
30
+ "\x16" => '\u0016',
31
+ "\x17" => '\u0017',
32
+ "\x18" => '\u0018',
33
+ "\x19" => '\u0019',
34
+ "\x1a" => '\u001A',
35
+ "\x1b" => '\u001B',
36
+ "\x1c" => '\u001C',
37
+ "\x1d" => '\u001D',
38
+ "\x1e" => '\u001E',
39
+ "\x1f" => '\u001F',
40
+ '"' => '\"',
41
+ '\\' => '\\\\',
42
+ '/' => '/',
43
+ } # :nodoc:
44
+
45
+ if defined?(::Encoding)
46
+ # Funky way to define constant, but if parsed in 1.8 it generates an 'invalid regular expression' error otherwise
47
+ eval %(ESCAPE_RE = %r([\u{80}-\u{10ffff}]))
48
+ else
49
+ ESCAPE_RE = %r(
50
+ [\xc2-\xdf][\x80-\xbf] |
51
+ [\xe0-\xef][\x80-\xbf]{2} |
52
+ [\xf0-\xf4][\x80-\xbf]{3}
53
+ )nx
54
+ end
55
+
56
+ # Convert a UTF8 encoded Ruby string _string_ to an escaped string, encoded with
57
+ # UTF16 big endian characters as \U????, and return it.
58
+ #
59
+ # \\:: Backslash
60
+ # \':: Single quote
61
+ # \":: Double quot
62
+ # \n:: ASCII Linefeed
63
+ # \r:: ASCII Carriage Return
64
+ # \t:: ASCCII Horizontal Tab
65
+ # \uhhhh:: character in BMP with Unicode value U+hhhh
66
+ # \U00hhhhhh:: character in plane 1-16 with Unicode value U+hhhhhh
67
+ def rdf_escape
68
+ string = self + '' # XXX workaround: avoid buffer sharing
69
+ string.gsub!(/["\\\/\x0-\x1f]/) { RDF_MAP[$&] }
70
+ if defined?(::Encoding)
71
+ string.force_encoding(Encoding::UTF_8)
72
+ string.gsub!(ESCAPE_RE) { |c|
73
+ s = c.dump.sub(/\"\\u\{(.+)\}\"/, '\1').upcase
74
+ (s.length <= 4 ? "\\u0000"[0,6-s.length] : "\\U00000000"[0,10-s.length]) + s
75
+ }
76
+ string.force_encoding(Encoding::ASCII_8BIT)
77
+ else
78
+ string.gsub!(ESCAPE_RE) { |c|
79
+ s = Iconv.new('utf-16be', 'utf-8').iconv(c).unpack('H*').first.upcase
80
+ "\\u" + s
81
+ }
82
+ end
83
+ string
84
+ end
85
+
86
+ # Unescape characters in strings.
87
+ RDF_UNESCAPE_MAP = Hash.new { |h, k| h[k] = k.chr }
88
+ RDF_UNESCAPE_MAP.update({
89
+ ?" => '"',
90
+ ?\\ => '\\',
91
+ ?/ => '/',
92
+ ?b => "\b",
93
+ ?f => "\f",
94
+ ?n => "\n",
95
+ ?r => "\r",
96
+ ?t => "\t",
97
+ ?u => nil,
98
+ })
99
+
100
+ if defined?(::Encoding)
101
+ UNESCAPE_RE = %r(
102
+ (?:\\[\\bfnrt"/]) # Escaped control characters, " and /
103
+ |(?:\\U00\h{6}) # 6 byte escaped Unicode
104
+ |(?:\\u\h{4}) # 4 byte escaped Unicode
105
+ )x
106
+ else
107
+ UNESCAPE_RE = %r((?:\\[\\bfnrt"/]|(?:\\u(?:[A-Fa-f\d]{4}))+|\\[\x20-\xff]))n
108
+ end
109
+
110
+ # Reverse operation of escape
111
+ # From JSON parser
112
+ def rdf_unescape
113
+ return '' if self.empty?
114
+ string = self.gsub(UNESCAPE_RE) do |c|
115
+ case c[1,1]
116
+ when 'U'
117
+ raise RDF::ReaderError, "Long Unicode escapes no supported in Ruby 1.8" unless defined?(::Encoding)
118
+ eval(c.sub(/\\U00(\h+)/, '"\u{\1}"'))
119
+ when 'u'
120
+ bytes = [c[2, 2].to_i(16), c[4, 2].to_i(16)]
121
+ Iconv.new('utf-8', 'utf-16').iconv(bytes.pack("C*"))
122
+ else
123
+ RDF_UNESCAPE_MAP[c[1]]
124
+ end
125
+ end
126
+ string.force_encoding(Encoding::UTF_8) if defined?(::Encoding)
127
+ string
128
+ rescue Iconv::Failure => e
129
+ raise RDF::ReaderError, "Caught #{e.class}: #{e}"
130
+ end
131
+ end unless String.method_defined?(:rdf_escape)
@@ -72,8 +72,8 @@ module RDF::RDFXML
72
72
 
73
73
  # Extract Evaluation Context from an element
74
74
  def extract_from_element(el)
75
- b = el.attribute_with_ns("base", XML_NS.uri.to_s)
76
- lang = el.attribute_with_ns("lang", XML_NS.uri.to_s)
75
+ b = el.attribute_with_ns("base", RDF::XML.to_s)
76
+ lang = el.attribute_with_ns("lang", RDF::XML.to_s)
77
77
  self.base = self.base.join(b) if b
78
78
  self.language = lang if lang
79
79
  self.uri_mappings.merge!(extract_mappings(el))
@@ -88,8 +88,7 @@ module RDF::RDFXML
88
88
  abbr, suffix = attr_name.to_s.split(":")
89
89
  if abbr == "xmlns"
90
90
  attr_value = self.base.to_s + attr_value if attr_value.match(/^\#/)
91
- mappings[suffix] = Namespace.new(attr_value, suffix)
92
- @graph.bind(mappings[suffix])
91
+ mappings[suffix] = attr_value
93
92
  end
94
93
  end
95
94
  mappings
@@ -98,14 +97,13 @@ module RDF::RDFXML
98
97
  # Produce the next list entry for this context
99
98
  def li_next
100
99
  @li_counter += 1
101
- predicate = URIRef.new(RDF["_#{@li_counter}"])
100
+ predicate = RDF["_#{@li_counter}"]
102
101
  end
103
102
 
104
103
  # Set XML base. Ignore any fragment
105
104
  def base=(b)
106
- b = Addressable::URI.parse(b.to_s)
107
- b.fragment = nil
108
105
  @base = RDF::URI.new(b)
106
+ @base.fragment = nil
109
107
  end
110
108
 
111
109
  def inspect
@@ -128,48 +126,87 @@ module RDF::RDFXML
128
126
  # @raise [Error]:: Raises RDF::ReaderError if _strict_
129
127
  def initialize(input = $stdin, options = {}, &block)
130
128
  super do
131
- @graph = RDF::Graph.new
132
129
  @debug = options[:debug]
133
130
  @strict = options[:strict]
134
- @base_uri = options[:base_uri]
135
- @base_uri = RDF::URI.parse(@base_uri) if @base_uri.is_a?(String)
131
+ @base_uri = RDF::URI.parse(options[:base_uri]) if options[:base_uri]
132
+
133
+ @id_mapping = Hash.new
136
134
 
137
- @doc = case stream
138
- when Nokogiri::XML::Document then stream
139
- else Nokogiri::XML.parse(stream, uri.to_s)
135
+ @doc = case input
136
+ when Nokogiri::XML::Document then input
137
+ else Nokogiri::XML.parse(input, @base_uri.to_s)
140
138
  end
141
139
 
142
- raise RDF::ReaderError, "Empty document" if @doc.nil? && @strict
143
- @callback = block
144
-
145
- # Look for rdf:RDF elements and process each.
146
- rdf_nodes = root.xpath("//rdf:RDF", RDF.prefix => RDF.uri.to_s)
147
- if rdf_nodes.length == 0
148
- # If none found, root element may be processed as an RDF Node
140
+ raise RDF::ReaderError, "Synax errors:\n#{@doc.errors}" if !@doc.errors.empty? && @strict
141
+ raise RDF::ReaderError, "Empty document" if (@doc.nil? || @doc.root.nil?) && @strict
149
142
 
150
- ec = EvaluationContext.new(@uri, root, @graph)
151
- nodeElement(root, ec)
152
- else
153
- rdf_nodes.each do |node|
154
- # XXX Skip this element if it's contained within another rdf:RDF element
155
-
156
- # Extract base, lang and namespaces from parents to create proper evaluation context
157
- ec = EvaluationContext.new(@uri, nil, @graph)
158
- ec.extract_from_ancestors(node)
159
- node.children.each {|el|
160
- next unless el.elem?
161
- new_ec = ec.clone(el)
162
- nodeElement(el, new_ec)
163
- }
164
- end
165
- end
166
-
167
143
  block.call(self) if block_given?
168
144
  end
169
145
  end
170
146
 
147
+ # XXX Invoke the parser, and allow add_triple to make the callback?
148
+ ##
149
+ # Iterates the given block for each RDF statement in the input.
150
+ #
151
+ # @yield [statement]
152
+ # @yieldparam [RDF::Statement] statement
153
+ # @return [void]
154
+ def each_statement(&block)
155
+ # Block called from add_statement
156
+ @callback = block
157
+
158
+ root = @doc.root
159
+
160
+ add_debug(root, "base_uri: #{@base_uri || 'nil'}")
161
+
162
+ rdf_nodes = root.xpath("//rdf:RDF", "rdf" => RDF_NS)
163
+ if rdf_nodes.length == 0
164
+ # If none found, root element may be processed as an RDF Node
165
+
166
+ ec = EvaluationContext.new(@base_uri, root, @graph)
167
+ nodeElement(root, ec)
168
+ else
169
+ rdf_nodes.each do |node|
170
+ # XXX Skip this element if it's contained within another rdf:RDF element
171
+
172
+ # Extract base, lang and namespaces from parents to create proper evaluation context
173
+ ec = EvaluationContext.new(@base_uri, nil, @graph)
174
+ ec.extract_from_ancestors(node)
175
+ node.children.each {|el|
176
+ next unless el.elem?
177
+ new_ec = ec.clone(el)
178
+ nodeElement(el, new_ec)
179
+ }
180
+ end
181
+ end
182
+ end
183
+
184
+ ##
185
+ # Iterates the given block for each RDF triple in the input.
186
+ #
187
+ # @yield [subject, predicate, object]
188
+ # @yieldparam [RDF::Resource] subject
189
+ # @yieldparam [RDF::URI] predicate
190
+ # @yieldparam [RDF::Value] object
191
+ # @return [void]
192
+ def each_triple(&block)
193
+ each_statement do |statement|
194
+ block.call(*statement.to_triple)
195
+ end
196
+ end
197
+
171
198
  private
172
199
 
200
+ # Keep track of allocated BNodes
201
+ def bnode(value = nil)
202
+ if value
203
+ @bnode_cache ||= {}
204
+ @bnode_cache[value.to_s] ||= RDF::Node.new(value)
205
+ else
206
+ RDF::Node.new
207
+ end
208
+ end
209
+
173
210
  # Figure out the document path, if it is a Nokogiri::XML::Element or Attribute
174
211
  def node_path(node)
175
212
  case node
@@ -199,12 +236,7 @@ module RDF::RDFXML
199
236
  def add_triple(node, subject, predicate, object)
200
237
  statement = RDF::Statement.new(subject, predicate, object)
201
238
  add_debug(node, "statement: #{statement}")
202
- @graph << statement
203
- statement
204
- rescue RDF::ReaderError => e
205
- add_debug(node, "add_triple raised #{e.class}: #{e.message}")
206
- puts e.backtrace if $DEBUG
207
- raise if @strict
239
+ @callback.call(statement)
208
240
  end
209
241
 
210
242
  # XML nodeElement production
@@ -221,14 +253,14 @@ module RDF::RDFXML
221
253
  add_debug(el, "nodeElement, el: #{el.uri}")
222
254
  add_debug(el, "nodeElement, subject: #{subject.nil? ? 'nil' : subject.to_s}")
223
255
 
224
- unless el.uri == RDF.Description.to_s
256
+ unless el.uri.to_s == RDF.Description.to_s
225
257
  add_triple(el, subject, RDF.type, el.uri)
226
258
  end
227
259
 
228
260
  # produce triples for attributes
229
261
  el.attribute_nodes.each do |attr|
230
262
  add_debug(el, "propertyAttr: #{attr.uri}='#{attr.value}'")
231
- if attr.uri == RDF.type
263
+ if attr.uri.to_s == RDF.type.to_s
232
264
  # If there is an attribute a in propertyAttr with a.URI == rdf:type
233
265
  # then u:=uri(identifier:=resolve(a.string-value))
234
266
  # and the following triple is added to the graph:
@@ -237,7 +269,7 @@ module RDF::RDFXML
237
269
  elsif is_propertyAttr?(attr)
238
270
  # Attributes not RDF.type
239
271
  predicate = attr.uri
240
- lit = Literal.untyped(attr.value, ec.language)
272
+ lit = RDF::Literal.new(attr.value, :language => ec.language)
241
273
  add_triple(attr, subject, predicate, lit)
242
274
  end
243
275
  end
@@ -283,9 +315,9 @@ module RDF::RDFXML
283
315
  # MAY choose to warn when the unqualified form is seen in a document.
284
316
  add_debug(el, "Unqualified attribute '#{attr}'")
285
317
  #attrs[attr.to_s] = attr.value unless attr.to_s.match?(/^xml/)
286
- elsif attr.namespace.href == XML_NS.uri.to_s
318
+ elsif attr.namespace.href == RDF::XML.to_s
287
319
  # No production. Lang and base elements already extracted
288
- elsif attr.namespace.href == RDF.uri.to_s
320
+ elsif attr.namespace.href == RDF_NS
289
321
  case attr.name
290
322
  when "ID" then id = attr.value
291
323
  when "datatype" then datatype = attr.value
@@ -342,7 +374,7 @@ module RDF::RDFXML
342
374
  end
343
375
 
344
376
  # For element e with possibly empty element content c.
345
- n = BNode.new
377
+ n = bnode
346
378
  add_triple(child, subject, predicate, n)
347
379
 
348
380
  # Reification
@@ -423,16 +455,16 @@ module RDF::RDFXML
423
455
  if resourceAttr
424
456
  resource = ec.base.join(resourceAttr)
425
457
  elsif nodeID
426
- resource = RDF::Node.new(nodeID)
458
+ resource = bnode(nodeID)
427
459
  else
428
- resource = RDF::Node.new
460
+ resource = bnode
429
461
  end
430
462
 
431
463
  # produce triples for attributes
432
464
  attrs.each_pair do |attr, val|
433
465
  add_debug(el, "attr: #{attr.name}='#{val}'")
434
466
 
435
- if attr.uri.to_s == RDF.type
467
+ if attr.uri.to_s == RDF.type.to_s
436
468
  add_triple(child, resource, RDF.type, val)
437
469
  else
438
470
  # Check for illegal attributes
@@ -463,7 +495,7 @@ module RDF::RDFXML
463
495
  add_triple(el, rsubject, RDF.subject, subject)
464
496
  add_triple(el, rsubject, RDF.predicate, predicate)
465
497
  add_triple(el, rsubject, RDF.object, object)
466
- add_triple(el, rsubject, RDF.type, RDF.Statement)
498
+ add_triple(el, rsubject, RDF.type, RDF["Statement"])
467
499
  end
468
500
 
469
501
  # Figure out the subject from the element.
@@ -491,14 +523,14 @@ module RDF::RDFXML
491
523
  # The value of rdf:nodeID must match the XML Name production
492
524
  nodeID = nodeID_check(el, nodeID.value.rdf_escape)
493
525
  add_debug(el, "parse_subject, nodeID: '#{nodeID}")
494
- RDF::Node.new(nodeID, @named_bnodes)
526
+ bnode(nodeID)
495
527
  when about
496
528
  about = about.value.rdf_escape
497
529
  add_debug(el, "parse_subject, about: '#{about}'")
498
530
  ec.base.join(about)
499
531
  else
500
532
  add_debug(el, "parse_subject, BNode")
501
- RDF::Node.new
533
+ bnode
502
534
  end
503
535
  end
504
536
 
@@ -507,7 +539,8 @@ module RDF::RDFXML
507
539
  if NC_REGEXP.match(id)
508
540
  # ID may only be specified once for the same URI
509
541
  if base
510
- uri = base.join("##{id}", base)
542
+ # FIXME: Known bug in RDF::URI#join
543
+ uri = base.join("##{id}")
511
544
  if @id_mapping[id] && @id_mapping[id] == uri
512
545
  warn = "ID addtribute '#{id}' may only be defined once for the same URI"
513
546
  add_debug(el, warn)
@@ -548,7 +581,7 @@ module RDF::RDFXML
548
581
  raise RDF::ReaderError.new(warn) if @strict
549
582
  return false
550
583
  end
551
- !CORE_SYNTAX_TERMS.include?(attr.uri.to_s) && attr.namespace && attr.namespace.href != XML_NS.uri.to_s
584
+ !CORE_SYNTAX_TERMS.include?(attr.uri.to_s) && attr.namespace && attr.namespace.href != RDF::XML.to_s
552
585
  end
553
586
 
554
587
  # Check Node Element name