rdfa_parser 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (373) hide show
  1. data/.gitignore +7 -0
  2. data/History.txt +47 -0
  3. data/README.rdoc +61 -0
  4. data/Rakefile +52 -0
  5. data/VERSION +1 -0
  6. data/bin/rdfa_parser +55 -0
  7. data/lib/rdfa_parser.rb +35 -0
  8. data/lib/rdfa_parser/bnode.rb +92 -0
  9. data/lib/rdfa_parser/exceptions.rb +11 -0
  10. data/lib/rdfa_parser/graph.rb +222 -0
  11. data/lib/rdfa_parser/literal.rb +375 -0
  12. data/lib/rdfa_parser/namespace.rb +91 -0
  13. data/lib/rdfa_parser/rdfa_parser.rb +415 -0
  14. data/lib/rdfa_parser/triple.rb +100 -0
  15. data/lib/rdfa_parser/uriref.rb +94 -0
  16. data/script/console +10 -0
  17. data/script/destroy +14 -0
  18. data/script/generate +14 -0
  19. data/spec/bnode_spec.rb +51 -0
  20. data/spec/graph_spec.rb +230 -0
  21. data/spec/literal_spec.rb +282 -0
  22. data/spec/matchers.rb +134 -0
  23. data/spec/namespace_spec.rb +61 -0
  24. data/spec/rdfa_helper.rb +127 -0
  25. data/spec/rdfa_parser_spec.rb +119 -0
  26. data/spec/spec.opts +1 -0
  27. data/spec/spec_helper.rb +23 -0
  28. data/spec/triple_spec.rb +145 -0
  29. data/spec/uriref_spec.rb +117 -0
  30. data/spec/xhtml1-testcases/.sparql +13 -0
  31. data/spec/xhtml1-testcases/0001.nt +1 -0
  32. data/spec/xhtml1-testcases/0001.sparql +3 -0
  33. data/spec/xhtml1-testcases/0001.xhtml +11 -0
  34. data/spec/xhtml1-testcases/0002.sparql +3 -0
  35. data/spec/xhtml1-testcases/0003.sparql +3 -0
  36. data/spec/xhtml1-testcases/0006.nt +2 -0
  37. data/spec/xhtml1-testcases/0006.sparql +8 -0
  38. data/spec/xhtml1-testcases/0006.xhtml +16 -0
  39. data/spec/xhtml1-testcases/0007.nt +3 -0
  40. data/spec/xhtml1-testcases/0007.sparql +5 -0
  41. data/spec/xhtml1-testcases/0007.xhtml +16 -0
  42. data/spec/xhtml1-testcases/0008.nt +1 -0
  43. data/spec/xhtml1-testcases/0008.sparql +3 -0
  44. data/spec/xhtml1-testcases/0008.xhtml +16 -0
  45. data/spec/xhtml1-testcases/0009.nt +1 -0
  46. data/spec/xhtml1-testcases/0009.sparql +3 -0
  47. data/spec/xhtml1-testcases/0009.xhtml +14 -0
  48. data/spec/xhtml1-testcases/0010.nt +2 -0
  49. data/spec/xhtml1-testcases/0010.sparql +4 -0
  50. data/spec/xhtml1-testcases/0010.xhtml +13 -0
  51. data/spec/xhtml1-testcases/0011.nt +3 -0
  52. data/spec/xhtml1-testcases/0011.sparql +17 -0
  53. data/spec/xhtml1-testcases/0011.xhtml +14 -0
  54. data/spec/xhtml1-testcases/0012.nt +1 -0
  55. data/spec/xhtml1-testcases/0012.sparql +3 -0
  56. data/spec/xhtml1-testcases/0012.xhtml +12 -0
  57. data/spec/xhtml1-testcases/0013.nt +1 -0
  58. data/spec/xhtml1-testcases/0013.sparql +3 -0
  59. data/spec/xhtml1-testcases/0013.xhtml +12 -0
  60. data/spec/xhtml1-testcases/0014.nt +1 -0
  61. data/spec/xhtml1-testcases/0014.sparql +3 -0
  62. data/spec/xhtml1-testcases/0014.xhtml +15 -0
  63. data/spec/xhtml1-testcases/0015.nt +2 -0
  64. data/spec/xhtml1-testcases/0015.sparql +4 -0
  65. data/spec/xhtml1-testcases/0015.xhtml +13 -0
  66. data/spec/xhtml1-testcases/0017.nt +3 -0
  67. data/spec/xhtml1-testcases/0017.sparql +6 -0
  68. data/spec/xhtml1-testcases/0017.xhtml +16 -0
  69. data/spec/xhtml1-testcases/0018.nt +1 -0
  70. data/spec/xhtml1-testcases/0018.sparql +3 -0
  71. data/spec/xhtml1-testcases/0018.xhtml +17 -0
  72. data/spec/xhtml1-testcases/0019.nt +1 -0
  73. data/spec/xhtml1-testcases/0019.sparql +3 -0
  74. data/spec/xhtml1-testcases/0019.xhtml +14 -0
  75. data/spec/xhtml1-testcases/0020.nt +1 -0
  76. data/spec/xhtml1-testcases/0020.sparql +3 -0
  77. data/spec/xhtml1-testcases/0020.xhtml +17 -0
  78. data/spec/xhtml1-testcases/0021.nt +1 -0
  79. data/spec/xhtml1-testcases/0021.sparql +3 -0
  80. data/spec/xhtml1-testcases/0021.xhtml +17 -0
  81. data/spec/xhtml1-testcases/0023.nt +1 -0
  82. data/spec/xhtml1-testcases/0023.sparql +3 -0
  83. data/spec/xhtml1-testcases/0023.xhtml +16 -0
  84. data/spec/xhtml1-testcases/0025.nt +2 -0
  85. data/spec/xhtml1-testcases/0025.sparql +4 -0
  86. data/spec/xhtml1-testcases/0025.xhtml +19 -0
  87. data/spec/xhtml1-testcases/0026.nt +1 -0
  88. data/spec/xhtml1-testcases/0026.sparql +3 -0
  89. data/spec/xhtml1-testcases/0026.xhtml +16 -0
  90. data/spec/xhtml1-testcases/0027.nt +1 -0
  91. data/spec/xhtml1-testcases/0027.sparql +3 -0
  92. data/spec/xhtml1-testcases/0027.xhtml +17 -0
  93. data/spec/xhtml1-testcases/0029.nt +1 -0
  94. data/spec/xhtml1-testcases/0029.sparql +3 -0
  95. data/spec/xhtml1-testcases/0029.xhtml +17 -0
  96. data/spec/xhtml1-testcases/0030.nt +1 -0
  97. data/spec/xhtml1-testcases/0030.sparql +3 -0
  98. data/spec/xhtml1-testcases/0030.xhtml +16 -0
  99. data/spec/xhtml1-testcases/0031.nt +1 -0
  100. data/spec/xhtml1-testcases/0031.sparql +3 -0
  101. data/spec/xhtml1-testcases/0031.xhtml +14 -0
  102. data/spec/xhtml1-testcases/0032.nt +1 -0
  103. data/spec/xhtml1-testcases/0032.sparql +3 -0
  104. data/spec/xhtml1-testcases/0032.xhtml +15 -0
  105. data/spec/xhtml1-testcases/0033.nt +2 -0
  106. data/spec/xhtml1-testcases/0033.sparql +5 -0
  107. data/spec/xhtml1-testcases/0033.xhtml +19 -0
  108. data/spec/xhtml1-testcases/0034.nt +1 -0
  109. data/spec/xhtml1-testcases/0034.sparql +3 -0
  110. data/spec/xhtml1-testcases/0034.xhtml +14 -0
  111. data/spec/xhtml1-testcases/0035.nt +1 -0
  112. data/spec/xhtml1-testcases/0035.sparql +3 -0
  113. data/spec/xhtml1-testcases/0035.xhtml +17 -0
  114. data/spec/xhtml1-testcases/0036.nt +1 -0
  115. data/spec/xhtml1-testcases/0036.sparql +3 -0
  116. data/spec/xhtml1-testcases/0036.xhtml +17 -0
  117. data/spec/xhtml1-testcases/0037.nt +1 -0
  118. data/spec/xhtml1-testcases/0037.sparql +3 -0
  119. data/spec/xhtml1-testcases/0037.xhtml +18 -0
  120. data/spec/xhtml1-testcases/0038.nt +1 -0
  121. data/spec/xhtml1-testcases/0038.sparql +3 -0
  122. data/spec/xhtml1-testcases/0038.xhtml +14 -0
  123. data/spec/xhtml1-testcases/0039.nt +1 -0
  124. data/spec/xhtml1-testcases/0039.sparql +3 -0
  125. data/spec/xhtml1-testcases/0039.xhtml +17 -0
  126. data/spec/xhtml1-testcases/0040.nt +1 -0
  127. data/spec/xhtml1-testcases/0040.sparql +3 -0
  128. data/spec/xhtml1-testcases/0040.xhtml +16 -0
  129. data/spec/xhtml1-testcases/0041.nt +1 -0
  130. data/spec/xhtml1-testcases/0041.sparql +3 -0
  131. data/spec/xhtml1-testcases/0041.xhtml +18 -0
  132. data/spec/xhtml1-testcases/0042.nt +0 -0
  133. data/spec/xhtml1-testcases/0042.sparql +4 -0
  134. data/spec/xhtml1-testcases/0042.xhtml +15 -0
  135. data/spec/xhtml1-testcases/0046.nt +3 -0
  136. data/spec/xhtml1-testcases/0046.sparql +6 -0
  137. data/spec/xhtml1-testcases/0046.xhtml +13 -0
  138. data/spec/xhtml1-testcases/0047.nt +3 -0
  139. data/spec/xhtml1-testcases/0047.sparql +6 -0
  140. data/spec/xhtml1-testcases/0047.xhtml +13 -0
  141. data/spec/xhtml1-testcases/0048.nt +3 -0
  142. data/spec/xhtml1-testcases/0048.sparql +6 -0
  143. data/spec/xhtml1-testcases/0048.xhtml +14 -0
  144. data/spec/xhtml1-testcases/0049.nt +2 -0
  145. data/spec/xhtml1-testcases/0049.sparql +4 -0
  146. data/spec/xhtml1-testcases/0049.xhtml +14 -0
  147. data/spec/xhtml1-testcases/0050.nt +2 -0
  148. data/spec/xhtml1-testcases/0050.sparql +5 -0
  149. data/spec/xhtml1-testcases/0050.xhtml +14 -0
  150. data/spec/xhtml1-testcases/0051.nt +2 -0
  151. data/spec/xhtml1-testcases/0051.sparql +4 -0
  152. data/spec/xhtml1-testcases/0051.xhtml +12 -0
  153. data/spec/xhtml1-testcases/0052.nt +1 -0
  154. data/spec/xhtml1-testcases/0052.sparql +3 -0
  155. data/spec/xhtml1-testcases/0052.xhtml +13 -0
  156. data/spec/xhtml1-testcases/0053.nt +2 -0
  157. data/spec/xhtml1-testcases/0053.sparql +4 -0
  158. data/spec/xhtml1-testcases/0053.xhtml +13 -0
  159. data/spec/xhtml1-testcases/0054.nt +2 -0
  160. data/spec/xhtml1-testcases/0054.sparql +4 -0
  161. data/spec/xhtml1-testcases/0054.xhtml +14 -0
  162. data/spec/xhtml1-testcases/0055.nt +2 -0
  163. data/spec/xhtml1-testcases/0055.sparql +4 -0
  164. data/spec/xhtml1-testcases/0055.xhtml +16 -0
  165. data/spec/xhtml1-testcases/0056.nt +3 -0
  166. data/spec/xhtml1-testcases/0056.sparql +5 -0
  167. data/spec/xhtml1-testcases/0056.xhtml +13 -0
  168. data/spec/xhtml1-testcases/0057.nt +4 -0
  169. data/spec/xhtml1-testcases/0057.sparql +6 -0
  170. data/spec/xhtml1-testcases/0057.xhtml +14 -0
  171. data/spec/xhtml1-testcases/0058.nt +6 -0
  172. data/spec/xhtml1-testcases/0058.sparql +9 -0
  173. data/spec/xhtml1-testcases/0058.xhtml +14 -0
  174. data/spec/xhtml1-testcases/0059.nt +6 -0
  175. data/spec/xhtml1-testcases/0059.sparql +8 -0
  176. data/spec/xhtml1-testcases/0059.xhtml +16 -0
  177. data/spec/xhtml1-testcases/0060.nt +2 -0
  178. data/spec/xhtml1-testcases/0060.sparql +4 -0
  179. data/spec/xhtml1-testcases/0060.xhtml +14 -0
  180. data/spec/xhtml1-testcases/0061.nt +1 -0
  181. data/spec/xhtml1-testcases/0061.sparql +3 -0
  182. data/spec/xhtml1-testcases/0061.xhtml +11 -0
  183. data/spec/xhtml1-testcases/0062.nt +1 -0
  184. data/spec/xhtml1-testcases/0062.sparql +3 -0
  185. data/spec/xhtml1-testcases/0062.xhtml +12 -0
  186. data/spec/xhtml1-testcases/0063.nt +1 -0
  187. data/spec/xhtml1-testcases/0063.sparql +3 -0
  188. data/spec/xhtml1-testcases/0063.xhtml +11 -0
  189. data/spec/xhtml1-testcases/0064.nt +1 -0
  190. data/spec/xhtml1-testcases/0064.sparql +4 -0
  191. data/spec/xhtml1-testcases/0064.xhtml +13 -0
  192. data/spec/xhtml1-testcases/0065.nt +3 -0
  193. data/spec/xhtml1-testcases/0065.sparql +6 -0
  194. data/spec/xhtml1-testcases/0065.xhtml +22 -0
  195. data/spec/xhtml1-testcases/0066.nt +1 -0
  196. data/spec/xhtml1-testcases/0066.sparql +3 -0
  197. data/spec/xhtml1-testcases/0066.xhtml +11 -0
  198. data/spec/xhtml1-testcases/0067.nt +1 -0
  199. data/spec/xhtml1-testcases/0067.sparql +3 -0
  200. data/spec/xhtml1-testcases/0067.xhtml +11 -0
  201. data/spec/xhtml1-testcases/0068.nt +1 -0
  202. data/spec/xhtml1-testcases/0068.sparql +3 -0
  203. data/spec/xhtml1-testcases/0068.xhtml +14 -0
  204. data/spec/xhtml1-testcases/0069.nt +1 -0
  205. data/spec/xhtml1-testcases/0069.sparql +3 -0
  206. data/spec/xhtml1-testcases/0069.xhtml +14 -0
  207. data/spec/xhtml1-testcases/0070.nt +1 -0
  208. data/spec/xhtml1-testcases/0070.sparql +3 -0
  209. data/spec/xhtml1-testcases/0070.xhtml +13 -0
  210. data/spec/xhtml1-testcases/0071.nt +1 -0
  211. data/spec/xhtml1-testcases/0071.sparql +3 -0
  212. data/spec/xhtml1-testcases/0071.xhtml +16 -0
  213. data/spec/xhtml1-testcases/0072.nt +1 -0
  214. data/spec/xhtml1-testcases/0072.sparql +3 -0
  215. data/spec/xhtml1-testcases/0072.xhtml +16 -0
  216. data/spec/xhtml1-testcases/0073.nt +1 -0
  217. data/spec/xhtml1-testcases/0073.sparql +3 -0
  218. data/spec/xhtml1-testcases/0073.xhtml +16 -0
  219. data/spec/xhtml1-testcases/0074.nt +1 -0
  220. data/spec/xhtml1-testcases/0074.sparql +3 -0
  221. data/spec/xhtml1-testcases/0074.xhtml +16 -0
  222. data/spec/xhtml1-testcases/0075.nt +1 -0
  223. data/spec/xhtml1-testcases/0075.sparql +3 -0
  224. data/spec/xhtml1-testcases/0075.xhtml +16 -0
  225. data/spec/xhtml1-testcases/0076.nt +23 -0
  226. data/spec/xhtml1-testcases/0076.sparql +70 -0
  227. data/spec/xhtml1-testcases/0076.xhtml +35 -0
  228. data/spec/xhtml1-testcases/0077.nt +23 -0
  229. data/spec/xhtml1-testcases/0077.sparql +70 -0
  230. data/spec/xhtml1-testcases/0077.xhtml +58 -0
  231. data/spec/xhtml1-testcases/0078.nt +6 -0
  232. data/spec/xhtml1-testcases/0078.sparql +7 -0
  233. data/spec/xhtml1-testcases/0078.xhtml +15 -0
  234. data/spec/xhtml1-testcases/0079.nt +3 -0
  235. data/spec/xhtml1-testcases/0079.sparql +6 -0
  236. data/spec/xhtml1-testcases/0079.xhtml +15 -0
  237. data/spec/xhtml1-testcases/0080.nt +1 -0
  238. data/spec/xhtml1-testcases/0080.sparql +3 -0
  239. data/spec/xhtml1-testcases/0080.xhtml +13 -0
  240. data/spec/xhtml1-testcases/0081.nt +6 -0
  241. data/spec/xhtml1-testcases/0081.sparql +9 -0
  242. data/spec/xhtml1-testcases/0081.xhtml +15 -0
  243. data/spec/xhtml1-testcases/0082.nt +8 -0
  244. data/spec/xhtml1-testcases/0082.sparql +11 -0
  245. data/spec/xhtml1-testcases/0082.xhtml +15 -0
  246. data/spec/xhtml1-testcases/0083.nt +6 -0
  247. data/spec/xhtml1-testcases/0083.sparql +9 -0
  248. data/spec/xhtml1-testcases/0083.xhtml +15 -0
  249. data/spec/xhtml1-testcases/0084.nt +8 -0
  250. data/spec/xhtml1-testcases/0084.sparql +11 -0
  251. data/spec/xhtml1-testcases/0084.xhtml +18 -0
  252. data/spec/xhtml1-testcases/0085.nt +4 -0
  253. data/spec/xhtml1-testcases/0085.sparql +6 -0
  254. data/spec/xhtml1-testcases/0085.xhtml +17 -0
  255. data/spec/xhtml1-testcases/0086.nt +0 -0
  256. data/spec/xhtml1-testcases/0086.sparql +4 -0
  257. data/spec/xhtml1-testcases/0086.xhtml +13 -0
  258. data/spec/xhtml1-testcases/0087.nt +23 -0
  259. data/spec/xhtml1-testcases/0087.sparql +70 -0
  260. data/spec/xhtml1-testcases/0087.xhtml +35 -0
  261. data/spec/xhtml1-testcases/0088.nt +3 -0
  262. data/spec/xhtml1-testcases/0088.sparql +6 -0
  263. data/spec/xhtml1-testcases/0088.xhtml +14 -0
  264. data/spec/xhtml1-testcases/0089.nt +1 -0
  265. data/spec/xhtml1-testcases/0089.sparql +3 -0
  266. data/spec/xhtml1-testcases/0089.xhtml +13 -0
  267. data/spec/xhtml1-testcases/0090.nt +1 -0
  268. data/spec/xhtml1-testcases/0090.sparql +3 -0
  269. data/spec/xhtml1-testcases/0090.xhtml +16 -0
  270. data/spec/xhtml1-testcases/0091.nt +3 -0
  271. data/spec/xhtml1-testcases/0091.sparql +6 -0
  272. data/spec/xhtml1-testcases/0091.xhtml +16 -0
  273. data/spec/xhtml1-testcases/0092.nt +3 -0
  274. data/spec/xhtml1-testcases/0092.sparql +16 -0
  275. data/spec/xhtml1-testcases/0092.xhtml +15 -0
  276. data/spec/xhtml1-testcases/0093.nt +2 -0
  277. data/spec/xhtml1-testcases/0093.sparql +4 -0
  278. data/spec/xhtml1-testcases/0093.xhtml +15 -0
  279. data/spec/xhtml1-testcases/0094.nt +3 -0
  280. data/spec/xhtml1-testcases/0094.sparql +16 -0
  281. data/spec/xhtml1-testcases/0094.xhtml +15 -0
  282. data/spec/xhtml1-testcases/0099.nt +1 -0
  283. data/spec/xhtml1-testcases/0099.sparql +3 -0
  284. data/spec/xhtml1-testcases/0099.xhtml +20 -0
  285. data/spec/xhtml1-testcases/0100.nt +3 -0
  286. data/spec/xhtml1-testcases/0100.sparql +15 -0
  287. data/spec/xhtml1-testcases/0100.xhtml +16 -0
  288. data/spec/xhtml1-testcases/0101.nt +3 -0
  289. data/spec/xhtml1-testcases/0101.sparql +15 -0
  290. data/spec/xhtml1-testcases/0101.xhtml +16 -0
  291. data/spec/xhtml1-testcases/0102.nt +1 -0
  292. data/spec/xhtml1-testcases/0102.sparql +15 -0
  293. data/spec/xhtml1-testcases/0102.xhtml +16 -0
  294. data/spec/xhtml1-testcases/0103.nt +1 -0
  295. data/spec/xhtml1-testcases/0103.sparql +15 -0
  296. data/spec/xhtml1-testcases/0103.xhtml +15 -0
  297. data/spec/xhtml1-testcases/0104.nt +3 -0
  298. data/spec/xhtml1-testcases/0104.sparql +5 -0
  299. data/spec/xhtml1-testcases/0104.xhtml +18 -0
  300. data/spec/xhtml1-testcases/0105.nt +1 -0
  301. data/spec/xhtml1-testcases/0105.sparql +7 -0
  302. data/spec/xhtml1-testcases/0105.xhtml +13 -0
  303. data/spec/xhtml1-testcases/0106.nt +1 -0
  304. data/spec/xhtml1-testcases/0106.sparql +7 -0
  305. data/spec/xhtml1-testcases/0106.xhtml +13 -0
  306. data/spec/xhtml1-testcases/0107.nt +0 -0
  307. data/spec/xhtml1-testcases/0107.sparql +4 -0
  308. data/spec/xhtml1-testcases/0107.xhtml +11 -0
  309. data/spec/xhtml1-testcases/0108.nt +1 -0
  310. data/spec/xhtml1-testcases/0108.sparql +3 -0
  311. data/spec/xhtml1-testcases/0108.xhtml +14 -0
  312. data/spec/xhtml1-testcases/0109.nt +1 -0
  313. data/spec/xhtml1-testcases/0109.sparql +3 -0
  314. data/spec/xhtml1-testcases/0109.xhtml +15 -0
  315. data/spec/xhtml1-testcases/0110.nt +1 -0
  316. data/spec/xhtml1-testcases/0110.sparql +4 -0
  317. data/spec/xhtml1-testcases/0110.xhtml +12 -0
  318. data/spec/xhtml1-testcases/0111.nt +2 -0
  319. data/spec/xhtml1-testcases/0111.sparql +5 -0
  320. data/spec/xhtml1-testcases/0111.xhtml +14 -0
  321. data/spec/xhtml1-testcases/0112.nt +1 -0
  322. data/spec/xhtml1-testcases/0112.sparql +3 -0
  323. data/spec/xhtml1-testcases/0112.xhtml +16 -0
  324. data/spec/xhtml1-testcases/0113.nt +2 -0
  325. data/spec/xhtml1-testcases/0113.sparql +4 -0
  326. data/spec/xhtml1-testcases/0113.xhtml +12 -0
  327. data/spec/xhtml1-testcases/0114.nt +3 -0
  328. data/spec/xhtml1-testcases/0114.sparql +5 -0
  329. data/spec/xhtml1-testcases/0114.xhtml +15 -0
  330. data/spec/xhtml1-testcases/0115.nt +4 -0
  331. data/spec/xhtml1-testcases/0115.sparql +14 -0
  332. data/spec/xhtml1-testcases/0115.xhtml +17 -0
  333. data/spec/xhtml1-testcases/0116.nt +2 -0
  334. data/spec/xhtml1-testcases/0116.sparql +6 -0
  335. data/spec/xhtml1-testcases/0116.xhtml +10 -0
  336. data/spec/xhtml1-testcases/0117.nt +2 -0
  337. data/spec/xhtml1-testcases/0117.sparql +4 -0
  338. data/spec/xhtml1-testcases/0117.xhtml +15 -0
  339. data/spec/xhtml1-testcases/0118.nt +1 -0
  340. data/spec/xhtml1-testcases/0118.sparql +5 -0
  341. data/spec/xhtml1-testcases/0118.xhtml +16 -0
  342. data/spec/xhtml1-testcases/0119.nt +1 -0
  343. data/spec/xhtml1-testcases/0119.sparql +5 -0
  344. data/spec/xhtml1-testcases/0119.xhtml +19 -0
  345. data/spec/xhtml1-testcases/0120.nt +1 -0
  346. data/spec/xhtml1-testcases/0120.sparql +5 -0
  347. data/spec/xhtml1-testcases/0120.xhtml +17 -0
  348. data/spec/xhtml1-testcases/0121.nt +2 -0
  349. data/spec/xhtml1-testcases/0121.sparql +4 -0
  350. data/spec/xhtml1-testcases/0121.xhtml +24 -0
  351. data/spec/xhtml1-testcases/0122.nt +1 -0
  352. data/spec/xhtml1-testcases/0122.sparql +4 -0
  353. data/spec/xhtml1-testcases/0122.xhtml +16 -0
  354. data/spec/xhtml1-testcases/0123.nt +3 -0
  355. data/spec/xhtml1-testcases/0123.sparql +5 -0
  356. data/spec/xhtml1-testcases/0123.xhtml +18 -0
  357. data/spec/xhtml1-testcases/0124.nt +4 -0
  358. data/spec/xhtml1-testcases/0124.sparql +6 -0
  359. data/spec/xhtml1-testcases/0124.xhtml +14 -0
  360. data/spec/xhtml1-testcases/0125.nt +1 -0
  361. data/spec/xhtml1-testcases/0125.sparql +5 -0
  362. data/spec/xhtml1-testcases/0125.xhtml +16 -0
  363. data/spec/xhtml1-testcases/0126.nt +3 -0
  364. data/spec/xhtml1-testcases/0126.sparql +5 -0
  365. data/spec/xhtml1-testcases/0126.xhtml +15 -0
  366. data/spec/xhtml1-testcases/1001.nt +6 -0
  367. data/spec/xhtml1-testcases/1001.sparql +8 -0
  368. data/spec/xhtml1-testcases/1001.xhtml +20 -0
  369. data/spec/xhtml1-testcases/9999.nt +3 -0
  370. data/spec/xhtml1-testcases/9999.xhtml +14 -0
  371. data/spec/xhtml1-testcases/rdfa-xhtml1-test-manifest.rdf +1303 -0
  372. data/tasks/rspec.rake +21 -0
  373. metadata +485 -0
data/.gitignore ADDED
@@ -0,0 +1,7 @@
1
+ rdoc/
2
+ pkg/
3
+ doc/
4
+ .loadpath
5
+ .project
6
+ *.gemspec
7
+ *.DS_Store
data/History.txt ADDED
@@ -0,0 +1,47 @@
1
+ === 0.1.0 2009-10-17
2
+ * First gem release, all XHTML1 approved test cases pass at http://rdfa.digitalbazaar.com/test-suite/
3
+
4
+ === 0.0.5 2009-10-17
5
+ * Fixed generation of RDF/XML for XML Literals.
6
+ * Update Specs for style
7
+ * Add eql? and hash methods to BNode and URIRef to allow for uniq
8
+ * Added test based on 0017 to find BNode XML output problems.
9
+ * Allow empty BNodes to be considered to be named
10
+ * Add xml:lang to XMLLiterals as necessary
11
+ * Don't add existing namespace definition to XML Literal
12
+ * Special output for XML Literal to treat xml:lang within string. Add on create.
13
+ * Added Namespace#xmlns_hash
14
+ * Use XML Parser, not HTML (this should probably vary on doc type). HTML parser was removing namespace declarations from XMLLiterals.
15
+ * Added _profile_ option to RdfaParser#parse to set parsetype to xhtml1, html4, or html5. Right now only xhtml1 is used.
16
+ * Use to_html when re-serializing XMLLiterals, whitespace was being destroid otherwise.
17
+ * All specs pass!
18
+
19
+ === 0.0.4 2009-10-16
20
+ * Fixed namespace bug in RDF/XML generation from Graph
21
+ * Fixed URI generation from namespace, which failed when suffix was a defined method of Namespace (use ns + suffix)
22
+
23
+ === 0.0.3 2009-10-12
24
+ * Added --quiet option to executable
25
+ * BNode RDF/XML output
26
+ * Output all default namespaces in RDF/XML
27
+ === 0.0.2 2009-10-10
28
+ * Switch to jeweler from newgem/hoe
29
+ * RdfaParser.new just creates parser, allowing a different graph to be substituted.
30
+ * parser.parse() performs parse.
31
+ * Added Graph.to_rdfxml to output graph in XML serialization
32
+
33
+ === 0.0.1 2009-09-26
34
+
35
+ * Previous versions based on original work by Ben Adida.
36
+ * Spec tests use Redland/Rasqal to check results.
37
+ * Version 0.9.16 of Rasqal does not support UNION, so those tests are compared against NTriples
38
+ * Passes most XHTML+RDFa tests. Of those that don't pass:
39
+ * NTriple BNode production differences.
40
+ * XMLLiteral attribute/namespace ordering differences (requires deep XML compare, not in Nokogiri).
41
+ * Unexplained failures:
42
+ * Test0102: XMLLiteral with explicit namespace and xml:lang; not overwriting existing langs
43
+ * Test0103: XMLLiteral with explicit namespace; not overwriting local namespaces
44
+ * Test0105: inner @rel neither CURIE nor LinkType
45
+ * Test0106: chaining with empty value in inner @rel
46
+ * Test0121: "[]" is a valid safe CURIE
47
+ * RDFa parser seems to be working correctly, but Nokogiri parses embedded <p> incorrectly
data/README.rdoc ADDED
@@ -0,0 +1,61 @@
1
+ = rdfa_parser
2
+
3
+ * http://github.com/gkellogg/rdfa_parser
4
+
5
+ == DESCRIPTION:
6
+
7
+ RDFa parser written in pure Ruby. Yields each triple, or generate in-memory graph
8
+
9
+ == FEATURES/PROBLEMS:
10
+
11
+ * Most, but not all tests pass.
12
+ * Tests performed by comparison to expected NTriples, not based on SPARQL query
13
+ * Ultimately, this should be merged in with the Reddy gem to become part of a comprehensive Ruby RDF implementation
14
+ * Support libraries (Graph, Triple, and URIRef are used substantially intact, to facilitate a future merger)
15
+
16
+ == SYNOPSIS:
17
+
18
+ Based on original work of Ben Adida.
19
+
20
+ Basic usage:
21
+
22
+ require 'rdfa_parser'
23
+ parser = RdfaParser::RdfaParser.new(stream, base_uri) do |triple|
24
+ puts triple.to_ntriple
25
+ end
26
+
27
+ == REQUIREMENTS:
28
+
29
+ * addressable
30
+ * nokogiri
31
+ * redland (for testing only)
32
+
33
+ == INSTALL:
34
+
35
+ * sudo gem install rdfa_parser
36
+
37
+ == LICENSE:
38
+
39
+ (The MIT License)
40
+
41
+ Copyright (c) 2009 Gregg Kellogg
42
+ Copyright (c) 2008 Tom Morris and contributors (Portions of Reddy utilities)
43
+
44
+ Permission is hereby granted, free of charge, to any person obtaining
45
+ a copy of this software and associated documentation files (the
46
+ 'Software'), to deal in the Software without restriction, including
47
+ without limitation the rights to use, copy, modify, merge, publish,
48
+ distribute, sublicense, and/or sell copies of the Software, and to
49
+ permit persons to whom the Software is furnished to do so, subject to
50
+ the following conditions:
51
+
52
+ The above copyright notice and this permission notice shall be
53
+ included in all copies or substantial portions of the Software.
54
+
55
+ THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
56
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
57
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
58
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
59
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
60
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
61
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/Rakefile ADDED
@@ -0,0 +1,52 @@
1
+ require 'rubygems'
2
+ begin
3
+ gem 'jeweler'
4
+ require 'jeweler'
5
+ Jeweler::Tasks.new do |gemspec|
6
+ gemspec.name = "rdfa_parser"
7
+ gemspec.summary = "RDFa parser written in pure Ruby."
8
+ gemspec.description = " Yields each triple, or generate in-memory graph"
9
+ gemspec.email = "gregg@kellogg-assoc.com"
10
+ gemspec.homepage = "http://github.com/gkellogg/rdfa_parser"
11
+ gemspec.authors = ["Gregg Kellogg"]
12
+ gemspec.add_dependency('addressable', '>= 2.0.0')
13
+ gemspec.add_dependency('nokogiri', '>= 1.3.3')
14
+ gemspec.add_dependency('builder', '>= 2.1.2')
15
+ gemspec.add_development_dependency('rspec')
16
+ gemspec.add_development_dependency('activesupport', '>= 2.3.0')
17
+ gemspec.extra_rdoc_files = %w(README.rdoc History.txt)
18
+ end
19
+ Jeweler::GemcutterTasks.new
20
+ rescue LoadError
21
+ puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
22
+ end
23
+
24
+ require 'spec/rake/spectask'
25
+ Spec::Rake::SpecTask.new(:spec) do |spec|
26
+ spec.libs << 'lib' << 'spec'
27
+ spec.spec_files = FileList['spec/**/*_spec.rb']
28
+ end
29
+
30
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
31
+ spec.libs << 'lib' << 'spec'
32
+ spec.pattern = 'spec/**/*_spec.rb'
33
+ spec.rcov = true
34
+ end
35
+
36
+ task :spec => :check_dependencies
37
+
38
+ task :default => :spec
39
+
40
+ require 'rake/rdoctask'
41
+ Rake::RDocTask.new do |rdoc|
42
+ if File.exist?('VERSION')
43
+ version = File.read('VERSION')
44
+ else
45
+ version = ""
46
+ end
47
+
48
+ rdoc.rdoc_dir = 'rdoc'
49
+ rdoc.title = "rdfa_parser #{version}"
50
+ rdoc.rdoc_files.include('README*', "History.txt")
51
+ rdoc.rdoc_files.include('lib/**/*.rb')
52
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.1.0
data/bin/rdfa_parser ADDED
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env ruby -s
2
+ require 'rubygems'
3
+ require File.expand_path(File.dirname(__FILE__) + "/../lib/rdfa_parser")
4
+ require 'getoptlong'
5
+
6
+ class Parse
7
+ def parse(file, base_uri)
8
+ puts "Parse: #{file}" if $quiet
9
+ parser = RdfaParser::RdfaParser.new
10
+ parser.parse(File.read(file), base_uri)
11
+ output = case $format
12
+ when "xml"
13
+ parser.graph.to_rdfxml
14
+ else
15
+ parser.graph.to_ntriples
16
+ end
17
+ puts output unless $quiet
18
+
19
+ puts parser.debug.join("\n\t") if $verbose
20
+ rescue RdfaParser::ParserException => e
21
+ puts "Parse failure: #{e.message}"
22
+ puts parser.debug if $verbose && parser
23
+ #raise
24
+ rescue Exception => e
25
+ puts "Parser fault: #{e.message}"
26
+ puts parser.debug if parser && !$quiet
27
+ raise
28
+ end
29
+ end
30
+
31
+ $verbose = false
32
+ base_uri = "http://example.com"
33
+
34
+ opts = GetoptLong.new(
35
+ ["--verbose", GetoptLong::NO_ARGUMENT],
36
+ ["--quiet", GetoptLong::NO_ARGUMENT],
37
+ ["--debug", GetoptLong::NO_ARGUMENT],
38
+ ["--format", GetoptLong::REQUIRED_ARGUMENT],
39
+ ["--uri", GetoptLong::REQUIRED_ARGUMENT]
40
+ )
41
+ opts.each do |opt, arg|
42
+ case opt
43
+ when '--verbose' then $verbose = true
44
+ when '--quiet' then $quiet = true
45
+ when '--debug' then $DEBUG = true
46
+ when '--format' then $format = arg
47
+ when '--uri' then base_uri = arg
48
+ end
49
+ end
50
+
51
+ x = Parse.new
52
+ ARGV.each do |test_file|
53
+ x.parse(test_file, base_uri)
54
+ end
55
+
@@ -0,0 +1,35 @@
1
+ $:.unshift(File.dirname(__FILE__)) unless
2
+ $:.include?(File.dirname(__FILE__)) || $:.include?(File.expand_path(File.dirname(__FILE__)))
3
+
4
+ Dir.glob(File.join(File.dirname(__FILE__), 'rdfa_parser/**.rb')).each { |f| require f }
5
+
6
+ begin
7
+ require 'nokogiri'
8
+ require 'addressable/uri'
9
+ require 'builder'
10
+ rescue LoadError
11
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
12
+ gem 'nokogiri'
13
+ gem 'addressable'
14
+ require 'nokogiri'
15
+ require 'addressable/uri'
16
+ require 'builder'
17
+ end
18
+
19
+ module RdfaParser
20
+ LINK_TYPES = %w(
21
+ alternate appendix bookmark cite chapter contents copyright first glossary
22
+ help icon index last license meta next p3pv1 prev role section stylesheet subsection
23
+ start top up
24
+ )
25
+
26
+ RDF_TYPE = URIRef.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#type")
27
+ XML_LITERAL = Literal::Encoding.xmlliteral
28
+
29
+ RDF_NS = Namespace.new("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf")
30
+ RDFS_NS = Namespace.new("http://www.w3.org/2000/01/rdf-schema#", "rdfs")
31
+ XHV_NS = Namespace.new("http://www.w3.org/1999/xhtml/vocab#", "xhv")
32
+ XML_NS = Namespace.new("http://www.w3.org/XML/1998/namespace", "xml")
33
+
34
+ XH_MAPPING = {"" => Namespace.new("http://www.w3.org/1999/xhtml/vocab\#", nil)}
35
+ end
@@ -0,0 +1,92 @@
1
+ module RdfaParser
2
+ # The BNode class creates RDF blank nodes.
3
+ class BNode
4
+ @@next_generated = "a"
5
+ @@named_nodes = {}
6
+
7
+ # Create a new BNode, optionally accept a identifier for the BNode. Otherwise, generated sequentially
8
+ def initialize(identifier = nil)
9
+ if identifier != nil && self.valid_id?(identifier)
10
+ # Generate a name if it's blank
11
+ @identifier = (@@named_nodes[identifier] ||= identifier.to_s.length > 0 ? identifier : self )
12
+ else
13
+ # Don't actually allocate the name until it's used, to save generation space
14
+ # (and make checking test cases easier)
15
+ @identifier = self
16
+ end
17
+ end
18
+
19
+ def to_s
20
+ return self.identifier.to_s
21
+ end
22
+
23
+ ##
24
+ # Exports the BNode in N-Triples form.
25
+ #
26
+ # ==== Example
27
+ # b = BNode.new; b.to_n3 # => returns a string of the BNode in n3 form
28
+ #
29
+ # ==== Returns
30
+ # @return [String] The BNode in n3.
31
+ #
32
+ # @author Tom Morris
33
+
34
+ def to_n3
35
+ "_:#{self.identifier}"
36
+ end
37
+
38
+ ##
39
+ # Exports the BNode in N-Triples form.
40
+ #
41
+ # ==== Example
42
+ # b = BNode.new; b.to_ntriples # => returns a string of the BNode in N-Triples form
43
+ #
44
+ # ==== Returns
45
+ # @return [String] The BNode in N-Triples.
46
+ #
47
+ # @author Tom Morris
48
+
49
+ def to_ntriples
50
+ self.to_n3
51
+ end
52
+
53
+ # Output URI as resource reference for RDF/XML
54
+ def xml_args
55
+ [{"rdf:nodeID" => self.identifier}]
56
+ end
57
+
58
+ # The identifier used used for this BNode. Not evaluated until this is called, which means
59
+ # that BNodes that are never used in a triple won't polute the sequence.
60
+ def identifier
61
+ return @identifier unless @identifier.is_a?(BNode)
62
+ if @identifier.equal?(self)
63
+ # Generate from the sequence a..zzz, unless already taken
64
+ @@next_generated = @@next_generated.succ while @@named_nodes.has_key?(@@next_generated)
65
+ @identifier, @@next_generated = @@next_generated, @@next_generated.succ
66
+ else
67
+ # Previously allocated node
68
+ @identifier = @identifier.identifier
69
+ end
70
+ @identifier
71
+ end
72
+
73
+ def eql?(other)
74
+ other.is_a?(self.class) && self.identifier == other.identifier
75
+ end
76
+ alias_method :==, :eql?
77
+
78
+ # Needed for uniq
79
+ def hash; to_s.hash; end
80
+
81
+ # Start _identifier_ sequence from scratch
82
+ def self.reset(init = "a")
83
+ @@next_generated = init
84
+ @@named_nodes = {}
85
+ end
86
+
87
+ protected
88
+ def valid_id?(name)
89
+ name =~ /^[a-zA-Z_][a-zA-Z0-9]*$/ || name.empty?
90
+ end
91
+ end
92
+ end
@@ -0,0 +1,11 @@
1
+ module RdfaParser
2
+ class RdfException < RuntimeError; end
3
+ class ParserException < RdfException; end
4
+ class GraphException < RdfException; end
5
+ class TypeError < RdfException; end
6
+ class AboutEachException < ParserException; end
7
+ class UriRelativeException < RdfException; end
8
+ class InvalidPredicate < RdfException; end
9
+ class InvalidSubject < RdfException; end
10
+ class InvalidObject < RdfException; end
11
+ end
@@ -0,0 +1,222 @@
1
+ module RdfaParser
2
+ # A simple graph to hold triples (from Reddy)
3
+ class Graph
4
+ attr_accessor :triples, :nsbinding
5
+
6
+ def initialize
7
+ @triples = []
8
+ @nsbinding = {}
9
+ end
10
+
11
+ def self.load (uri)
12
+ RdfXmlParser.new(open(uri)).graph
13
+ end
14
+
15
+ def size
16
+ @triples.size
17
+ end
18
+
19
+ def each
20
+ @triples.each { |value| yield value }
21
+ end
22
+
23
+ def subjects
24
+ @triples.map {|t| t.subject}.uniq
25
+ end
26
+
27
+ def [] (item)
28
+ @triples[item]
29
+ end
30
+
31
+ def each_with_subject(subject)
32
+ @triples.each do |value|
33
+ yield value if value.subject == subject
34
+ end
35
+ end
36
+
37
+ def get_resource(subject)
38
+ @triples.find_all { |i| true if i.subject == subject}
39
+ end
40
+
41
+ ##
42
+ # Adds a triple to a graph directly from the intended subject, predicate, and object.
43
+ #
44
+ # ==== Example
45
+ # 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
46
+ #
47
+ # @param [URIRef, BNode] s the subject of the triple
48
+ # @param [URIRef] p the predicate of the triple
49
+ # @param [URIRef, BNode, Literal, TypedLiteral] o the object of the triple
50
+ #
51
+ # ==== Returns
52
+ # @return [Array] An array of the triples (leaky abstraction? consider returning the graph instead)
53
+ #
54
+ # @raise [Error] Checks parameter types and raises if they are incorrect.
55
+ # @author Tom Morris
56
+ def add_triple(s, p, o)
57
+ @triples += [ Triple.new(s, p, o) ]
58
+ end
59
+
60
+
61
+ ##
62
+ # Adds an extant triple to a graph
63
+ #
64
+ # ==== Example
65
+ # g = Graph.new; t = Triple.new(BNode.new, URIRef.new("http://xmlns.com/foaf/0.1/knows"), BNode.new); g << t) # => results in the triple being added to g; returns an array of g's triples
66
+ #
67
+ # @param [Triple] t the triple to be added to the graph
68
+ #
69
+ # ==== Returns
70
+ # @return [Array] An array of the triples (leaky abstraction? consider returning the graph instead)
71
+ #
72
+ # @author Tom Morris
73
+ def << (triple)
74
+ # self.add_triple(s, p, o)
75
+ @triples += [ triple ]
76
+ end
77
+
78
+ ##
79
+ # Exports the graph to RDF in N-Triples form.
80
+ #
81
+ # ==== Example
82
+ # 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
83
+ #
84
+ # ==== Returns
85
+ # @return [String] The graph in N-Triples.
86
+ #
87
+ # @author Tom Morris
88
+
89
+ def to_ntriples
90
+ @triples.collect do |t|
91
+ t.to_ntriples
92
+ end * "\n" + "\n"
93
+ end
94
+
95
+ # Output graph using to_ntriples
96
+ def to_s; self.to_ntriples; end
97
+
98
+ # Dump model to RDF/XML
99
+ def to_rdfxml
100
+ replace_text = {}
101
+ rdfxml = ""
102
+ xml = builder = Builder::XmlMarkup.new(:target => rdfxml, :indent => 2)
103
+
104
+ extended_bindings = nsbinding.merge(
105
+ "rdf" => RDF_NS,
106
+ "rdfs" => RDFS_NS,
107
+ "xhv" => XHV_NS,
108
+ "xml" => XML_NS
109
+ )
110
+ rdf_attrs = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.xmlns_attr => ns.uri.to_s)}
111
+ uri_bindings = extended_bindings.values.inject({}) { |hash, ns| hash.merge(ns.uri.to_s => ns.short)}
112
+ xml.instruct!
113
+ xml.rdf(:RDF, rdf_attrs) do
114
+ # Add statements for each subject
115
+ subjects.each do |s|
116
+ xml.rdf(:Description, (s.is_a?(BNode) ? "rdf:nodeID" : "rdf:about") => s) do
117
+ each_with_subject(s) do |triple|
118
+ xml_args = triple.object.xml_args
119
+ if triple.object.is_a?(Literal) && triple.object.xmlliteral?
120
+ replace_text["__replace_with_#{triple.object.object_id}__"] = xml_args[0]
121
+ xml_args[0] = "__replace_with_#{triple.object.object_id}__"
122
+ end
123
+ xml.tag!(triple.predicate.to_qname(uri_bindings), *xml_args)
124
+ end
125
+ end
126
+ end
127
+ end
128
+
129
+ # Perform literal substitutions
130
+ replace_text.each_pair do |match, value|
131
+ rdfxml.sub!(match, value)
132
+ end
133
+
134
+ rdfxml
135
+ end
136
+
137
+ ##
138
+ # Creates a new namespace given a URI and the short name and binds it to the graph.
139
+ #
140
+ # ==== Example
141
+ # g = Graph.new; g.namespace("http://xmlns.com/foaf/0.1/", "foaf") # => binds the Foaf namespace to g
142
+ #
143
+ # @param [String] uri the URI of the namespace
144
+ # @param [String] short the short name of the namespace
145
+ #
146
+ # ==== Returns
147
+ # @return [Namespace] The newly created namespace.
148
+ #
149
+ # @raise [Error] Checks validity of the desired shortname and raises if it is incorrect.
150
+ # @raise [Error] Checks that the newly created Namespace is of type Namespace and raises if it is incorrect.
151
+ # @author Tom Morris
152
+
153
+ def namespace(uri, short)
154
+ self.bind Namespace.new(uri, short)
155
+ end
156
+
157
+ def bind(namespace)
158
+ if namespace.class == Namespace
159
+ @nsbinding["#{namespace.short}"] = namespace
160
+ else
161
+ raise GraphException, "Can't bind #{namespace.inspect} as namespace"
162
+ end
163
+ end
164
+
165
+ def has_bnode_identifier?(bnodeid)
166
+ temp_bnode = BNode.new(bnodeid)
167
+ returnval = false
168
+ @triples.each { |triple|
169
+ if triple.subject.eql?(temp_bnode)
170
+ returnval = true
171
+ break
172
+ end
173
+ if triple.object.eql?(temp_bnode)
174
+ returnval = true
175
+ break
176
+ end
177
+ }
178
+ return returnval
179
+ end
180
+
181
+ def get_bnode_by_identifier(bnodeid)
182
+ temp_bnode = BNode.new(bnodeid)
183
+ each do |triple|
184
+ if triple.subject == temp_bnode
185
+ return triple.subject
186
+ end
187
+ if triple.object == temp_bnode
188
+ return triple.object
189
+ end
190
+ end
191
+ return false
192
+ end
193
+
194
+ def get_by_type(object)
195
+ out = []
196
+ each do |t|
197
+ next unless t.is_type?
198
+ next unless case object
199
+ when String
200
+ object == t.object.to_s
201
+ when Regexp
202
+ object.match(t.object.to_s)
203
+ else
204
+ object == t.object
205
+ end
206
+ out << t.subject
207
+ end
208
+ return out
209
+ end
210
+
211
+ def join(graph)
212
+ if graph.class == Graph
213
+ graph.each { |t|
214
+ self << t
215
+ }
216
+ else
217
+ raise GraphException, "join requires you provide a graph object"
218
+ end
219
+ end
220
+
221
+ end
222
+ end