microformats2 2.9.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +125 -25
  3. data/Rakefile +0 -60
  4. data/lib/microformats2.rb +7 -15
  5. data/lib/microformats2/absolute_uri.rb +5 -1
  6. data/lib/microformats2/format_parser.rb +321 -46
  7. data/lib/microformats2/parser.rb +86 -6
  8. data/lib/microformats2/parser_core.rb +343 -0
  9. data/lib/microformats2/property_parser.rb +104 -34
  10. data/lib/microformats2/results/collection.rb +121 -0
  11. data/lib/microformats2/results/parser_result.rb +111 -0
  12. data/lib/microformats2/results/property_set.rb +87 -0
  13. data/lib/microformats2/time_property_parser.rb +161 -0
  14. data/lib/microformats2/version.rb +1 -1
  15. data/microformats2.gemspec +2 -1
  16. data/spec/lib/microformats2/absolute_uri_spec.rb +2 -2
  17. data/spec/lib/microformats2/parser_spec.rb +36 -5
  18. data/spec/lib/microformats2_spec.rb +5 -5
  19. data/spec/spec_helper.rb +0 -1
  20. data/vendor/tests/.gitignore +25 -0
  21. data/vendor/tests/LICENSE.md +36 -0
  22. data/vendor/tests/README.md +48 -0
  23. data/vendor/tests/app.js +84 -0
  24. data/vendor/tests/composer.json +5 -0
  25. data/vendor/tests/css/testsuite.css +159 -0
  26. data/vendor/tests/interface.js +18 -0
  27. data/vendor/tests/package.json +27 -0
  28. data/vendor/tests/tests/microformats-mixed/h-card/change-log.html +63 -0
  29. data/vendor/tests/tests/microformats-mixed/h-card/mixedpropertries.html +14 -0
  30. data/vendor/tests/tests/microformats-mixed/h-card/mixedpropertries.json +22 -0
  31. data/vendor/tests/tests/microformats-mixed/h-card/tworoots.html +1 -0
  32. data/vendor/tests/tests/microformats-mixed/h-card/tworoots.json +10 -0
  33. data/vendor/tests/tests/microformats-mixed/h-entry/mixedroots.html +16 -0
  34. data/vendor/tests/tests/microformats-mixed/h-entry/mixedroots.json +38 -0
  35. data/vendor/tests/tests/microformats-mixed/h-resume/change-log.html +68 -0
  36. data/vendor/tests/tests/microformats-mixed/h-resume/mixedroots.html +16 -0
  37. data/vendor/tests/tests/microformats-mixed/h-resume/mixedroots.json +31 -0
  38. data/vendor/tests/tests/microformats-v1/adr/change-log.html +63 -0
  39. data/vendor/tests/tests/microformats-v1/adr/simpleproperties.html +8 -0
  40. data/vendor/tests/tests/microformats-v1/adr/simpleproperties.json +15 -0
  41. data/vendor/tests/tests/microformats-v1/geo/abbrpattern.html +5 -0
  42. data/vendor/tests/tests/microformats-v1/geo/abbrpattern.json +11 -0
  43. data/vendor/tests/tests/microformats-v1/geo/change-log.1.html +78 -0
  44. data/vendor/tests/tests/microformats-v1/geo/change-log.html +63 -0
  45. data/vendor/tests/tests/microformats-v1/geo/hidden.html +10 -0
  46. data/vendor/tests/tests/microformats-v1/geo/hidden.json +11 -0
  47. data/vendor/tests/tests/microformats-v1/geo/simpleproperties.html +6 -0
  48. data/vendor/tests/tests/microformats-v1/geo/simpleproperties.json +11 -0
  49. data/vendor/tests/tests/microformats-v1/geo/valuetitleclass.html +11 -0
  50. data/vendor/tests/tests/microformats-v1/geo/valuetitleclass.json +11 -0
  51. data/vendor/tests/tests/microformats-v1/hcalendar/ampm.html +41 -0
  52. data/vendor/tests/tests/microformats-v1/hcalendar/ampm.json +21 -0
  53. data/vendor/tests/tests/microformats-v1/hcalendar/attendees.html +13 -0
  54. data/vendor/tests/tests/microformats-v1/hcalendar/attendees.json +37 -0
  55. data/vendor/tests/tests/microformats-v1/hcalendar/change-log.html +68 -0
  56. data/vendor/tests/tests/microformats-v1/hcalendar/combining.html +15 -0
  57. data/vendor/tests/tests/microformats-v1/hcalendar/combining.json +31 -0
  58. data/vendor/tests/tests/microformats-v1/hcalendar/concatenate.html +7 -0
  59. data/vendor/tests/tests/microformats-v1/hcalendar/concatenate.json +12 -0
  60. data/vendor/tests/tests/microformats-v1/hcalendar/time.html +44 -0
  61. data/vendor/tests/tests/microformats-v1/hcalendar/time.json +22 -0
  62. data/vendor/tests/tests/microformats-v1/hcard/change-log.html +68 -0
  63. data/vendor/tests/tests/microformats-v1/hcard/email.html +14 -0
  64. data/vendor/tests/tests/microformats-v1/hcard/email.json +11 -0
  65. data/vendor/tests/tests/microformats-v1/hcard/format.html +6 -0
  66. data/vendor/tests/tests/microformats-v1/hcard/format.json +11 -0
  67. data/vendor/tests/tests/microformats-v1/hcard/hyperlinkedphoto.html +3 -0
  68. data/vendor/tests/tests/microformats-v1/hcard/hyperlinkedphoto.json +8 -0
  69. data/vendor/tests/tests/microformats-v1/hcard/justahyperlink.html +1 -0
  70. data/vendor/tests/tests/microformats-v1/hcard/justahyperlink.json +8 -0
  71. data/vendor/tests/tests/microformats-v1/hcard/justaname.html +1 -0
  72. data/vendor/tests/tests/microformats-v1/hcard/justaname.json +8 -0
  73. data/vendor/tests/tests/microformats-v1/hcard/multiple.html +74 -0
  74. data/vendor/tests/tests/microformats-v1/hcard/multiple.json +65 -0
  75. data/vendor/tests/tests/microformats-v1/hcard/name.html +11 -0
  76. data/vendor/tests/tests/microformats-v1/hcard/name.json +15 -0
  77. data/vendor/tests/tests/microformats-v1/hcard/single.html +14 -0
  78. data/vendor/tests/tests/microformats-v1/hcard/single.json +24 -0
  79. data/vendor/tests/tests/microformats-v1/hentry/change-log.html +73 -0
  80. data/vendor/tests/tests/microformats-v1/hentry/summarycontent.html +20 -0
  81. data/vendor/tests/tests/microformats-v1/hentry/summarycontent.json +24 -0
  82. data/vendor/tests/tests/microformats-v1/hfeed/simple.html +30 -0
  83. data/vendor/tests/tests/microformats-v1/hfeed/simple.json +49 -0
  84. data/vendor/tests/tests/microformats-v1/hnews/all.html +37 -0
  85. data/vendor/tests/tests/microformats-v1/hnews/all.json +74 -0
  86. data/vendor/tests/tests/microformats-v1/hnews/change-log.html +72 -0
  87. data/vendor/tests/tests/microformats-v1/hnews/minimum.html +25 -0
  88. data/vendor/tests/tests/microformats-v1/hnews/minimum.json +48 -0
  89. data/vendor/tests/tests/microformats-v1/hproduct/aggregate.html +26 -0
  90. data/vendor/tests/tests/microformats-v1/hproduct/aggregate.json +52 -0
  91. data/vendor/tests/tests/microformats-v1/hproduct/change-log.html +62 -0
  92. data/vendor/tests/tests/microformats-v1/hproduct/simpleproperties.html +13 -0
  93. data/vendor/tests/tests/microformats-v1/hproduct/simpleproperties.json +33 -0
  94. data/vendor/tests/tests/microformats-v1/hresume/affiliation.html +12 -0
  95. data/vendor/tests/tests/microformats-v1/hresume/affiliation.json +25 -0
  96. data/vendor/tests/tests/microformats-v1/hresume/change-log.html +73 -0
  97. data/vendor/tests/tests/microformats-v1/hresume/contact.html +18 -0
  98. data/vendor/tests/tests/microformats-v1/hresume/contact.json +32 -0
  99. data/vendor/tests/tests/microformats-v1/hresume/education.html +13 -0
  100. data/vendor/tests/tests/microformats-v1/hresume/education.json +29 -0
  101. data/vendor/tests/tests/microformats-v1/hresume/skill.html +12 -0
  102. data/vendor/tests/tests/microformats-v1/hresume/skill.json +33 -0
  103. data/vendor/tests/tests/microformats-v1/hresume/work.html +16 -0
  104. data/vendor/tests/tests/microformats-v1/hresume/work.json +30 -0
  105. data/vendor/tests/tests/microformats-v1/hreview-aggregate/change-log.html +67 -0
  106. data/vendor/tests/tests/microformats-v1/hreview-aggregate/hcard.html +18 -0
  107. data/vendor/tests/tests/microformats-v1/hreview-aggregate/hcard.json +31 -0
  108. data/vendor/tests/tests/microformats-v1/hreview-aggregate/justahyperlink.html +6 -0
  109. data/vendor/tests/tests/microformats-v1/hreview-aggregate/justahyperlink.json +19 -0
  110. data/vendor/tests/tests/microformats-v1/hreview-aggregate/vevent.html +13 -0
  111. data/vendor/tests/tests/microformats-v1/hreview-aggregate/vevent.json +22 -0
  112. data/vendor/tests/tests/microformats-v1/hreview/change-log.html +73 -0
  113. data/vendor/tests/tests/microformats-v1/hreview/item.html +8 -0
  114. data/vendor/tests/tests/microformats-v1/hreview/item.json +19 -0
  115. data/vendor/tests/tests/microformats-v1/hreview/vcard.html +23 -0
  116. data/vendor/tests/tests/microformats-v1/hreview/vcard.json +58 -0
  117. data/vendor/tests/tests/microformats-v1/includes/change-log.html +72 -0
  118. data/vendor/tests/tests/microformats-v1/includes/hcarditemref.html +16 -0
  119. data/vendor/tests/tests/microformats-v1/includes/hcarditemref.json +49 -0
  120. data/vendor/tests/tests/microformats-v1/includes/heventitemref.html +25 -0
  121. data/vendor/tests/tests/microformats-v1/includes/heventitemref.json +33 -0
  122. data/vendor/tests/tests/microformats-v1/includes/hyperlink.html +18 -0
  123. data/vendor/tests/tests/microformats-v1/includes/hyperlink.json +43 -0
  124. data/vendor/tests/tests/microformats-v1/includes/object.html +23 -0
  125. data/vendor/tests/tests/microformats-v1/includes/object.json +42 -0
  126. data/vendor/tests/tests/microformats-v1/includes/table.html +12 -0
  127. data/vendor/tests/tests/microformats-v1/includes/table.json +19 -0
  128. data/vendor/tests/tests/microformats-v2/h-adr/change-log.html +62 -0
  129. data/vendor/tests/tests/microformats-v2/h-adr/geo.html +10 -0
  130. data/vendor/tests/tests/microformats-v2/h-adr/geo.json +16 -0
  131. data/vendor/tests/tests/microformats-v2/h-adr/geourl.html +4 -0
  132. data/vendor/tests/tests/microformats-v2/h-adr/geourl.json +13 -0
  133. data/vendor/tests/tests/microformats-v2/h-adr/justaname.html +1 -0
  134. data/vendor/tests/tests/microformats-v2/h-adr/justaname.json +10 -0
  135. data/vendor/tests/tests/microformats-v2/h-adr/lettercase.html +21 -0
  136. data/vendor/tests/tests/microformats-v2/h-adr/lettercase.json +12 -0
  137. data/vendor/tests/tests/microformats-v2/h-adr/simpleproperties.html +8 -0
  138. data/vendor/tests/tests/microformats-v2/h-adr/simpleproperties.json +16 -0
  139. data/vendor/tests/tests/microformats-v2/h-as-note/note.html +56 -0
  140. data/vendor/tests/tests/microformats-v2/h-as-note/note.json +98 -0
  141. data/vendor/tests/tests/microformats-v2/h-card/baseurl.html +6 -0
  142. data/vendor/tests/tests/microformats-v2/h-card/baseurl.json +26 -0
  143. data/vendor/tests/tests/microformats-v2/h-card/change-log.html +100 -0
  144. data/vendor/tests/tests/microformats-v2/h-card/childimplied.html +7 -0
  145. data/vendor/tests/tests/microformats-v2/h-card/childimplied.json +12 -0
  146. data/vendor/tests/tests/microformats-v2/h-card/extendeddescription.html +10 -0
  147. data/vendor/tests/tests/microformats-v2/h-card/extendeddescription.json +15 -0
  148. data/vendor/tests/tests/microformats-v2/h-card/hcard.html +4 -0
  149. data/vendor/tests/tests/microformats-v2/h-card/hcard.json +19 -0
  150. data/vendor/tests/tests/microformats-v2/h-card/horghcard.html +4 -0
  151. data/vendor/tests/tests/microformats-v2/h-card/horghcard.json +19 -0
  152. data/vendor/tests/tests/microformats-v2/h-card/hyperlinkedphoto.html +3 -0
  153. data/vendor/tests/tests/microformats-v2/h-card/hyperlinkedphoto.json +12 -0
  154. data/vendor/tests/tests/microformats-v2/h-card/impliedname.html +15 -0
  155. data/vendor/tests/tests/microformats-v2/h-card/impliedname.json +90 -0
  156. data/vendor/tests/tests/microformats-v2/h-card/impliedphoto.html +11 -0
  157. data/vendor/tests/tests/microformats-v2/h-card/impliedphoto.json +72 -0
  158. data/vendor/tests/tests/microformats-v2/h-card/impliedurl.html +5 -0
  159. data/vendor/tests/tests/microformats-v2/h-card/impliedurl.json +45 -0
  160. data/vendor/tests/tests/microformats-v2/h-card/justahyperlink.html +1 -0
  161. data/vendor/tests/tests/microformats-v2/h-card/justahyperlink.json +11 -0
  162. data/vendor/tests/tests/microformats-v2/h-card/justaname.html +1 -0
  163. data/vendor/tests/tests/microformats-v2/h-card/justaname.json +10 -0
  164. data/vendor/tests/tests/microformats-v2/h-card/nested.html +4 -0
  165. data/vendor/tests/tests/microformats-v2/h-card/nested.json +18 -0
  166. data/vendor/tests/tests/microformats-v2/h-card/p-property.html +21 -0
  167. data/vendor/tests/tests/microformats-v2/h-card/p-property.json +15 -0
  168. data/vendor/tests/tests/microformats-v2/h-card/relativeurls.html +6 -0
  169. data/vendor/tests/tests/microformats-v2/h-card/relativeurls.json +29 -0
  170. data/vendor/tests/tests/microformats-v2/h-entry/change-log.html +90 -0
  171. data/vendor/tests/tests/microformats-v2/h-entry/encoding.html +3 -0
  172. data/vendor/tests/tests/microformats-v2/h-entry/encoding.json +14 -0
  173. data/vendor/tests/tests/microformats-v2/h-entry/impliedvalue-nested.html +9 -0
  174. data/vendor/tests/tests/microformats-v2/h-entry/impliedvalue-nested.json +27 -0
  175. data/vendor/tests/tests/microformats-v2/h-entry/justahyperlink.html +1 -0
  176. data/vendor/tests/tests/microformats-v2/h-entry/justahyperlink.json +11 -0
  177. data/vendor/tests/tests/microformats-v2/h-entry/justaname.html +1 -0
  178. data/vendor/tests/tests/microformats-v2/h-entry/justaname.json +10 -0
  179. data/vendor/tests/tests/microformats-v2/h-entry/scriptstyletags.html +4 -0
  180. data/vendor/tests/tests/microformats-v2/h-entry/scriptstyletags.json +14 -0
  181. data/vendor/tests/tests/microformats-v2/h-entry/summarycontent.html +20 -0
  182. data/vendor/tests/tests/microformats-v2/h-entry/summarycontent.json +25 -0
  183. data/vendor/tests/tests/microformats-v2/h-entry/u-property.html +33 -0
  184. data/vendor/tests/tests/microformats-v2/h-entry/u-property.json +12 -0
  185. data/vendor/tests/tests/microformats-v2/h-entry/urlincontent.html +13 -0
  186. data/vendor/tests/tests/microformats-v2/h-entry/urlincontent.json +14 -0
  187. data/vendor/tests/tests/microformats-v2/h-event/ampm.html +41 -0
  188. data/vendor/tests/tests/microformats-v2/h-event/ampm.json +21 -0
  189. data/vendor/tests/tests/microformats-v2/h-event/attendees.html +13 -0
  190. data/vendor/tests/tests/microformats-v2/h-event/attendees.json +37 -0
  191. data/vendor/tests/tests/microformats-v2/h-event/change-log.html +82 -0
  192. data/vendor/tests/tests/microformats-v2/h-event/combining.html +13 -0
  193. data/vendor/tests/tests/microformats-v2/h-event/combining.json +25 -0
  194. data/vendor/tests/tests/microformats-v2/h-event/concatenate.html +8 -0
  195. data/vendor/tests/tests/microformats-v2/h-event/concatenate.json +12 -0
  196. data/vendor/tests/tests/microformats-v2/h-event/dates.html +13 -0
  197. data/vendor/tests/tests/microformats-v2/h-event/dates.json +26 -0
  198. data/vendor/tests/tests/microformats-v2/h-event/dt-property.html +23 -0
  199. data/vendor/tests/tests/microformats-v2/h-event/dt-property.json +20 -0
  200. data/vendor/tests/tests/microformats-v2/h-event/justahyperlink.html +1 -0
  201. data/vendor/tests/tests/microformats-v2/h-event/justahyperlink.json +11 -0
  202. data/vendor/tests/tests/microformats-v2/h-event/justaname.html +1 -0
  203. data/vendor/tests/tests/microformats-v2/h-event/justaname.json +10 -0
  204. data/vendor/tests/tests/microformats-v2/h-event/time.html +47 -0
  205. data/vendor/tests/tests/microformats-v2/h-event/time.json +25 -0
  206. data/vendor/tests/tests/microformats-v2/h-feed/implied-title.html +30 -0
  207. data/vendor/tests/tests/microformats-v2/h-feed/implied-title.json +23 -0
  208. data/vendor/tests/tests/microformats-v2/h-feed/simple.html +26 -0
  209. data/vendor/tests/tests/microformats-v2/h-feed/simple.json +33 -0
  210. data/vendor/tests/tests/microformats-v2/h-geo/abbrpattern.html +5 -0
  211. data/vendor/tests/tests/microformats-v2/h-geo/abbrpattern.json +12 -0
  212. data/vendor/tests/tests/microformats-v2/h-geo/altitude.html +8 -0
  213. data/vendor/tests/tests/microformats-v2/h-geo/altitude.json +13 -0
  214. data/vendor/tests/tests/microformats-v2/h-geo/change-log.html +67 -0
  215. data/vendor/tests/tests/microformats-v2/h-geo/hidden.html +10 -0
  216. data/vendor/tests/tests/microformats-v2/h-geo/hidden.json +12 -0
  217. data/vendor/tests/tests/microformats-v2/h-geo/justaname.html +3 -0
  218. data/vendor/tests/tests/microformats-v2/h-geo/justaname.json +10 -0
  219. data/vendor/tests/tests/microformats-v2/h-geo/simpleproperties.html +5 -0
  220. data/vendor/tests/tests/microformats-v2/h-geo/simpleproperties.json +12 -0
  221. data/vendor/tests/tests/microformats-v2/h-geo/valuetitleclass.html +11 -0
  222. data/vendor/tests/tests/microformats-v2/h-geo/valuetitleclass.json +12 -0
  223. data/vendor/tests/tests/microformats-v2/h-news/all.html +35 -0
  224. data/vendor/tests/tests/microformats-v2/h-news/all.json +51 -0
  225. data/vendor/tests/tests/microformats-v2/h-news/change-log.html +78 -0
  226. data/vendor/tests/tests/microformats-v2/h-news/minimum.html +24 -0
  227. data/vendor/tests/tests/microformats-v2/h-news/minimum.json +40 -0
  228. data/vendor/tests/tests/microformats-v2/h-org/change-log.html +57 -0
  229. data/vendor/tests/tests/microformats-v2/h-org/hyperlink.html +1 -0
  230. data/vendor/tests/tests/microformats-v2/h-org/hyperlink.json +11 -0
  231. data/vendor/tests/tests/microformats-v2/h-org/simple.html +1 -0
  232. data/vendor/tests/tests/microformats-v2/h-org/simple.json +10 -0
  233. data/vendor/tests/tests/microformats-v2/h-org/simpleproperties.html +4 -0
  234. data/vendor/tests/tests/microformats-v2/h-org/simpleproperties.json +12 -0
  235. data/vendor/tests/tests/microformats-v2/h-product/aggregate.html +21 -0
  236. data/vendor/tests/tests/microformats-v2/h-product/aggregate.json +45 -0
  237. data/vendor/tests/tests/microformats-v2/h-product/change-log.html +62 -0
  238. data/vendor/tests/tests/microformats-v2/h-product/justahyperlink.html +1 -0
  239. data/vendor/tests/tests/microformats-v2/h-product/justahyperlink.json +11 -0
  240. data/vendor/tests/tests/microformats-v2/h-product/justaname.html +1 -0
  241. data/vendor/tests/tests/microformats-v2/h-product/justaname.json +10 -0
  242. data/vendor/tests/tests/microformats-v2/h-product/simpleproperties.html +10 -0
  243. data/vendor/tests/tests/microformats-v2/h-product/simpleproperties.json +26 -0
  244. data/vendor/tests/tests/microformats-v2/h-recipe/all.html +63 -0
  245. data/vendor/tests/tests/microformats-v2/h-recipe/all.json +54 -0
  246. data/vendor/tests/tests/microformats-v2/h-recipe/change-log.html +62 -0
  247. data/vendor/tests/tests/microformats-v2/h-recipe/minimum.html +7 -0
  248. data/vendor/tests/tests/microformats-v2/h-recipe/minimum.json +17 -0
  249. data/vendor/tests/tests/microformats-v2/h-resume/affiliation.html +12 -0
  250. data/vendor/tests/tests/microformats-v2/h-resume/affiliation.json +20 -0
  251. data/vendor/tests/tests/microformats-v2/h-resume/change-log.html +78 -0
  252. data/vendor/tests/tests/microformats-v2/h-resume/contact.html +17 -0
  253. data/vendor/tests/tests/microformats-v2/h-resume/contact.json +26 -0
  254. data/vendor/tests/tests/microformats-v2/h-resume/education.html +13 -0
  255. data/vendor/tests/tests/microformats-v2/h-resume/education.json +30 -0
  256. data/vendor/tests/tests/microformats-v2/h-resume/justaname.html +1 -0
  257. data/vendor/tests/tests/microformats-v2/h-resume/justaname.json +10 -0
  258. data/vendor/tests/tests/microformats-v2/h-resume/skill.html +12 -0
  259. data/vendor/tests/tests/microformats-v2/h-resume/skill.json +12 -0
  260. data/vendor/tests/tests/microformats-v2/h-resume/work.html +16 -0
  261. data/vendor/tests/tests/microformats-v2/h-resume/work.json +31 -0
  262. data/vendor/tests/tests/microformats-v2/h-review-aggregate/change-log.html +78 -0
  263. data/vendor/tests/tests/microformats-v2/h-review-aggregate/hevent.html +13 -0
  264. data/vendor/tests/tests/microformats-v2/h-review-aggregate/hevent.json +23 -0
  265. data/vendor/tests/tests/microformats-v2/h-review-aggregate/justahyperlink.html +8 -0
  266. data/vendor/tests/tests/microformats-v2/h-review-aggregate/justahyperlink.json +19 -0
  267. data/vendor/tests/tests/microformats-v2/h-review-aggregate/simpleproperties.html +18 -0
  268. data/vendor/tests/tests/microformats-v2/h-review-aggregate/simpleproperties.json +26 -0
  269. data/vendor/tests/tests/microformats-v2/h-review/change-log.html +84 -0
  270. data/vendor/tests/tests/microformats-v2/h-review/hyperlink.html +1 -0
  271. data/vendor/tests/tests/microformats-v2/h-review/hyperlink.json +11 -0
  272. data/vendor/tests/tests/microformats-v2/h-review/implieditem.html +4 -0
  273. data/vendor/tests/tests/microformats-v2/h-review/implieditem.json +19 -0
  274. data/vendor/tests/tests/microformats-v2/h-review/item.html +8 -0
  275. data/vendor/tests/tests/microformats-v2/h-review/item.json +20 -0
  276. data/vendor/tests/tests/microformats-v2/h-review/justaname.html +1 -0
  277. data/vendor/tests/tests/microformats-v2/h-review/justaname.json +10 -0
  278. data/vendor/tests/tests/microformats-v2/h-review/photo.html +1 -0
  279. data/vendor/tests/tests/microformats-v2/h-review/photo.json +11 -0
  280. data/vendor/tests/tests/microformats-v2/h-review/vcard.html +23 -0
  281. data/vendor/tests/tests/microformats-v2/h-review/vcard.json +48 -0
  282. data/vendor/tests/tests/microformats-v2/rel/change-log.html +67 -0
  283. data/vendor/tests/tests/microformats-v2/rel/duplicate-rels.html +10 -0
  284. data/vendor/tests/tests/microformats-v2/rel/duplicate-rels.json +75 -0
  285. data/vendor/tests/tests/microformats-v2/rel/license.html +1 -0
  286. data/vendor/tests/tests/microformats-v2/rel/license.json +12 -0
  287. data/vendor/tests/tests/microformats-v2/rel/nofollow.html +1 -0
  288. data/vendor/tests/tests/microformats-v2/rel/nofollow.json +12 -0
  289. data/vendor/tests/tests/microformats-v2/rel/rel-urls.html +8 -0
  290. data/vendor/tests/tests/microformats-v2/rel/rel-urls.json +33 -0
  291. data/vendor/tests/tests/microformats-v2/rel/varying-text-duplicate-rels.html +4 -0
  292. data/vendor/tests/tests/microformats-v2/rel/varying-text-duplicate-rels.json +20 -0
  293. data/vendor/tests/tests/microformats-v2/rel/xfn-all.html +19 -0
  294. data/vendor/tests/tests/microformats-v2/rel/xfn-all.json +92 -0
  295. data/vendor/tests/tests/microformats-v2/rel/xfn-elsewhere.html +10 -0
  296. data/vendor/tests/tests/microformats-v2/rel/xfn-elsewhere.json +40 -0
  297. metadata +285 -37
  298. data/lib/microformats2/collection.rb +0 -136
  299. data/lib/microformats2/format.rb +0 -151
  300. data/lib/microformats2/implied_property/foundation.rb +0 -59
  301. data/lib/microformats2/implied_property/name.rb +0 -34
  302. data/lib/microformats2/implied_property/photo.rb +0 -28
  303. data/lib/microformats2/implied_property/url.rb +0 -24
  304. data/lib/microformats2/property.rb +0 -21
  305. data/lib/microformats2/property/date_time.rb +0 -28
  306. data/lib/microformats2/property/embedded.rb +0 -9
  307. data/lib/microformats2/property/foundation.rb +0 -143
  308. data/lib/microformats2/property/text.rb +0 -16
  309. data/lib/microformats2/property/url.rb +0 -26
  310. data/spec/lib/microformats2/collection_spec.rb +0 -252
  311. data/spec/lib/microformats2/implied_property/name_spec.rb +0 -31
  312. data/spec/lib/microformats2/implied_property/photo_spec.rb +0 -31
  313. data/spec/lib/microformats2/implied_property/url_spec.rb +0 -58
@@ -1,52 +1,122 @@
1
1
  module Microformats2
2
- class PropertyParser
3
- class << self
4
- def parse(element, base)
5
- @@base = base
6
- parse_node(element).flatten.compact
7
- end
2
+ class PropertyParser < ParserCore
3
+
4
+ def parse(element, base: nil, element_type: , format_class_array: [], backcompat: nil)
5
+ @base = base
6
+ @value = nil
7
+ @property_type = element_type
8
+
9
+ @fmt_classes = format_class_array
10
+ @mode_backcompat = backcompat
8
11
 
9
- def parse_node(node)
10
- case
11
- when node.is_a?(Nokogiri::XML::NodeSet) then parse_nodeset(node)
12
- when node.is_a?(Nokogiri::XML::Element) then [parse_for_properties(node)]
12
+ if element_type == 'p'
13
+ parse_value_class_pattern(element)
14
+
15
+ if @value.nil?
16
+ if element.name == 'abbr' and not element.attribute('title').nil?
17
+ @value = element.attribute('title').value.strip
18
+ elsif (element.name == 'data' or element.name == 'input') and not element.attribute('value').nil?
19
+ @value = element.attribute('value').value.strip
20
+ elsif (element.name == 'img' or element.name == 'area') and not element.attribute('alt').nil?
21
+ @value = element.attribute('alt').value.strip
22
+ else
23
+ @value = render_text_and_replace_images(element, base: @base)
24
+ end
13
25
  end
14
- end
15
26
 
16
- def parse_nodeset(nodeset)
17
- nodeset.map { |node| parse_node(node) }
18
- end
27
+ elsif element_type == 'e'
28
+ @value = {
29
+ value: render_text(element, base: @base), #TODO the spec doesn't say to remove script and style tags, assuming this to be in error
30
+ html: element.inner_html.gsub(/\A +/, '').gsub(/ +\Z/, '')
31
+ }
19
32
 
20
- def parse_for_properties(element)
21
- if property_classes(element).length >= 1
22
- parse_property(element)
23
- elsif format_classes(element).length >= 1
24
- #do nothing because we don't want child elements ending up with their properties here
25
- else
26
- parse_nodeset(element.children)
33
+ elsif element_type == 'u'
34
+ if ['a', 'area'].include? element.name and not element.attribute('href').nil?
35
+ @value = element.attribute('href').value.strip
36
+ elsif ['img', 'audio', 'video', 'source'].include? element.name and not element.attribute('src').nil?
37
+ @value = element.attribute('src').value.strip
38
+ elsif element.name == 'video' and not element.attribute('poster').nil?
39
+ @value = element.attribute('poster').value.strip
40
+ elsif element.name == 'object' and not element.attribute('data').nil?
41
+ @value = element.attribute('data').value.strip
27
42
  end
28
- end
29
43
 
30
- def parse_property(element)
31
- property_classes(element).map do |property_class|
32
- property = Property.new(element, property_class, nil, @@base).parse
33
- properties = format_classes(element).empty? ? PropertyParser.parse(element.children, @@base) : []
44
+ if not @value.nil?
45
+ @value = Microformats2::AbsoluteUri.new(@value, base: @base).absolutize
46
+ else
47
+
48
+ parse_value_class_pattern(element)
34
49
 
35
- [property].concat properties
50
+ if @value.nil?
51
+ if element.name == 'abbr' and not element.attribute('title').nil?
52
+ @value = element.attribute('title').value.strip
53
+ elsif (element.name == 'data' or element.name == 'input') and not element.attribute('value').nil?
54
+ @value = element.attribute('value').value.strip
55
+ else
56
+ @value = render_text(element, base: @base)
57
+ end
58
+
59
+ end
36
60
  end
61
+
62
+ elsif element_type == 'dt'
63
+ @value = Microformats2::TimePropertyParser.new.parse(element, base: base, element_type: element_type, format_class_array: format_class_array, backcompat: backcompat)
64
+
37
65
  end
38
66
 
39
- def property_classes(element)
40
- element.attribute("class").to_s.split.select do |html_class|
41
- html_class =~ Property::CLASS_REG_EXP
67
+ @value
68
+ end
69
+
70
+ def parse_value_class_pattern(element)
71
+ @value_class_pattern_value = []
72
+ parse_node(element.children)
73
+ @value = @value_class_pattern_value.join unless @value_class_pattern_value.empty?
74
+ end
75
+
76
+ def parse_element(element)
77
+ if value_title_classes(element).length >= 1
78
+ @value_class_pattern_value << element.attribute('title').value.strip
79
+
80
+ elsif value_classes(element).length >= 1
81
+ if element.name == 'img' or element.name == 'area' and not element.attribute('alt').nil?
82
+ @value_class_pattern_value << element.attribute('alt').value.strip
83
+ elsif element.name == 'data' and not element.attribute('value').nil?
84
+ @value_class_pattern_value << element.attribute('value').value.strip
85
+ elsif element.name == 'abbr' and not element.attribute('title').nil?
86
+ @value_class_pattern_value << element.attribute('title').value.strip
87
+ else
88
+ @value_class_pattern_value << element.text.strip
89
+ end
90
+ else
91
+ p_classes = property_classes(element)
92
+ p_classes = backcompat_property_classes(element) if @mode_backcompat
93
+ if p_classes.length == 0 and format_classes(element).length == 0
94
+ parse_node(element.children)
42
95
  end
43
96
  end
97
+ end
44
98
 
45
- def format_classes(element)
46
- element.attribute("class").to_s.split.select do |html_class|
47
- html_class =~ Format::CLASS_REG_EXP
99
+ def render_text_and_replace_images(node, base: nil)
100
+ new_doc = Nokogiri::HTML(node.inner_html)
101
+ new_doc.xpath('//script').remove
102
+ new_doc.xpath('//style').remove
103
+ new_doc.traverse do |node|
104
+ if node.name == 'img' and not node.attribute('alt').nil?
105
+ node.replace(' ' + node.attribute('alt').value.to_s + ' ')
106
+ elsif node.name == 'img' and not node.attribute('src').nil?
107
+ absolute_url = Microformats2::AbsoluteUri.new(node.attribute('src').value.to_s, base: @base).absolutize
108
+ node.replace(' ' + absolute_url + ' ')
48
109
  end
49
110
  end
50
- end # class << self
111
+ new_doc.text.strip
112
+ end
113
+
114
+ def render_text(node, base: nil)
115
+ new_doc = Nokogiri::HTML(node.inner_html)
116
+ new_doc.xpath('//script').remove
117
+ new_doc.xpath('//style').remove
118
+ new_doc.text.strip
119
+ end
120
+
51
121
  end
52
122
  end
@@ -0,0 +1,121 @@
1
+ module Microformats2
2
+
3
+ #stub to get around the tests for now
4
+ class Collection
5
+
6
+ def initialize(hash)
7
+ @hash = hash
8
+ end
9
+
10
+ def to_h
11
+ @hash
12
+ end
13
+
14
+ def to_hash
15
+ @hash
16
+ end
17
+
18
+ def to_json
19
+ to_hash.to_json
20
+ end
21
+
22
+ def to_s
23
+ if @hash['value']
24
+ return @hash['value']
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def [](key)
31
+ @hash[key]
32
+ end
33
+
34
+ def value
35
+ @hash['value']
36
+ end
37
+
38
+ def items
39
+ @hash['items'].map do |item|
40
+ ParserResult.new(item)
41
+ end
42
+ end
43
+
44
+ def rels
45
+ @hash['rels']
46
+ end
47
+
48
+ def rel_urls
49
+ @hash['rel-urls']
50
+ end
51
+
52
+ def respond_to?(sym, include_private = false)
53
+ has_item?(sym) || super(sym, include_private)
54
+ end
55
+
56
+ def method_missing(sym, *args, &block)
57
+
58
+ name = sym.to_s
59
+ name_dash = name.gsub('_', '-') if name.include? '_'
60
+
61
+ if not @hash['items'].nil?
62
+ result_hash = @hash['items'].select do |x|
63
+ x['type'].include?('h-' + name)
64
+ end
65
+ if result_hash.empty? and not name_dash.nil?
66
+ result_hash = @hash['items'].select do |x|
67
+ x['type'].include?('h-' + name_dash)
68
+ end
69
+ end
70
+ end
71
+
72
+ super(sym, *args, &block) if result_hash.empty?
73
+
74
+ if result_hash.is_a? Array
75
+ if args[0].nil?
76
+ result_hash = result_hash[0] #will return nil for an empty array
77
+
78
+ elsif args[0] == :all
79
+ return result_hash.map do |x|
80
+ ParserResult.new(x)
81
+ end
82
+
83
+ elsif args[0].to_i < result_hash.count
84
+ result_hash = result_hash[args[0].to_i]
85
+
86
+ else
87
+ result_hash = result_hash[0] #will return nil for an empty array
88
+ end
89
+ end
90
+
91
+ if result_hash.nil? or result_hash.empty?
92
+ result_hash
93
+ elsif result_hash.is_a? Hash
94
+ ParserResult.new(result_hash)
95
+ else
96
+ result_hash
97
+ end
98
+ end
99
+
100
+ private
101
+
102
+ def has_item?(name)
103
+ name = name.to_s
104
+ name_dash = name.gsub('_', '-') if name.include? '_'
105
+ if not @hash['items'].nil?
106
+ result_hash = @hash['items'].select do |x|
107
+ x['type'].include?('h-' + name)
108
+ end
109
+ if result_hash.empty? and not name_dash.nil?
110
+ result_hash = @hash['items'].select do |x|
111
+ x['type'].include?('h-' + name_dash)
112
+ end
113
+ end
114
+ end
115
+
116
+ not result_hash.empty?
117
+ end
118
+
119
+ end
120
+ end
121
+
@@ -0,0 +1,111 @@
1
+ module Microformats2
2
+
3
+ #stub to get around the tests for now
4
+ class ParserResult
5
+
6
+ def initialize(hash)
7
+ @hash = hash
8
+ end
9
+
10
+ def to_h
11
+ @hash
12
+ end
13
+
14
+ def to_hash
15
+ @hash
16
+ end
17
+
18
+ def to_json
19
+ to_hash.to_json
20
+ end
21
+
22
+ def to_s
23
+ if @hash['value']
24
+ return @hash['value']
25
+ else
26
+ super
27
+ end
28
+ end
29
+
30
+ def [](key)
31
+ @hash[key]
32
+ end
33
+
34
+ def value
35
+ @hash['value']
36
+ end
37
+
38
+ def properties
39
+ PropertySet.new( @hash['properties'])
40
+ end
41
+
42
+ def respond_to?(sym, include_private = false)
43
+ has_key?(sym) || has_property?(sym) || super(sym, include_private)
44
+ end
45
+
46
+ def method_missing(sym, *args, &block)
47
+
48
+ name = sym.to_s
49
+ name_dash = name.gsub('_', '-') if name.include? '_'
50
+
51
+ if not @hash[name].nil?
52
+ result_hash = @hash[name]
53
+
54
+ elsif not @hash['properties'].nil? and not @hash['properties'][name].nil?
55
+ result_hash = @hash['properties'][name]
56
+
57
+ elsif not name_dash.nil? and not @hash[name_dash].nil?
58
+ result_hash = @hash[name_dash]
59
+
60
+ elsif not name_dash.nil? and not @hash['properties'].nil? and not @hash['properties'][name_dash].nil?
61
+ result_hash = @hash['properties'][name_dash]
62
+
63
+ else
64
+ super(sym, *args, &block)
65
+ end
66
+
67
+ if result_hash.is_a? Array
68
+ if args[0].nil?
69
+ result_hash = result_hash[0] #will return nil for an empty array
70
+
71
+ elsif args[0] == :all
72
+ return result_hash.map do |x|
73
+ ParserResult.new(x)
74
+ end
75
+
76
+ elsif args[0].to_i < result_hash.count
77
+ result_hash = result_hash[args[0].to_i]
78
+
79
+ else
80
+ result_hash = result_hash[0] #will return nil for an empty array
81
+ end
82
+ end
83
+
84
+ if result_hash.nil? or result_hash.empty?
85
+ result_hash
86
+ elsif result_hash.is_a? Hash
87
+ ParserResult.new(result_hash)
88
+ else
89
+ result_hash
90
+ end
91
+ end
92
+
93
+ private
94
+
95
+ def has_key?(name)
96
+ name = name.to_s
97
+ name_dash = name.gsub('_', '-') if name.include? '_'
98
+
99
+ not @hash[name].nil? or not @hash[name_dash].nil?
100
+ end
101
+
102
+ def has_property?(name)
103
+ name = name.to_s
104
+ name_dash = name.gsub('_', '-') if name.include? '_'
105
+ return false if @hash['properties'].nil?
106
+ not @hash['properties'][name].nil? or not @hash['properties'][name_dash].nil?
107
+ end
108
+
109
+ end
110
+ end
111
+
@@ -0,0 +1,87 @@
1
+ module Microformats2
2
+
3
+ #stub to get around the tests for now
4
+ class PropertySet
5
+
6
+ def initialize(hash)
7
+ @hash = hash
8
+ end
9
+
10
+ def to_h
11
+ @hash
12
+ end
13
+
14
+ def to_hash
15
+ @hash.to_hash
16
+ end
17
+
18
+ def to_json
19
+ @hash.to_hash.to_json
20
+ end
21
+
22
+ def [](key)
23
+ @hash[key]
24
+ end
25
+
26
+ def respond_to?(sym, include_private = false)
27
+ has_key?(sym) || super(sym, include_private)
28
+ end
29
+
30
+
31
+ def method_missing(mname, *args, &block)
32
+
33
+ if respond_to? mname
34
+ result_hash = get_val? mname
35
+ if result_hash.is_a? Array
36
+ if args[0].nil?
37
+ result_hash = result_hash[0] #will return nil for an empty array
38
+
39
+ elsif args[0] == :all
40
+ return result_hash.map do |x|
41
+ ParserResult.new(x)
42
+ end
43
+
44
+ elsif args[0].to_i < result_hash.count
45
+ result_hash = result_hash[args[0].to_i]
46
+
47
+ else
48
+ result_hash = result_hash[0] #will return nil for an empty array
49
+ end
50
+ end
51
+
52
+ if result_hash.is_a? Hash
53
+ ParserResult.new(result_hash)
54
+ else
55
+ result_hash
56
+ end
57
+ else
58
+ super(mname, *args, &block)
59
+ end
60
+
61
+ end
62
+
63
+ private
64
+
65
+ def has_key?(name)
66
+ name = name.to_s
67
+ name_dash = name.gsub('_', '-') if name.include? '_'
68
+ not @hash[name].nil? or not @hash[name_dash].nil?
69
+ end
70
+
71
+ def get_val?(name)
72
+ name = name.to_s
73
+ name_dash = name.gsub('_', '-') if name.include? '_'
74
+
75
+ if not @hash[name].nil?
76
+ result_hash = @hash[name]
77
+
78
+ elsif not @hash[name_dash].nil?
79
+ result_hash = @hash[name_dash]
80
+ else
81
+ nil
82
+ end
83
+ end
84
+
85
+ end
86
+ end
87
+