about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/microformats/parser.clj19
-rw-r--r--test/microformats/parser_expectations.clj107
2 files changed, 65 insertions, 61 deletions
diff --git a/src/microformats/parser.clj b/src/microformats/parser.clj
index 8d5bb10..ba07fcf 100644
--- a/src/microformats/parser.clj
+++ b/src/microformats/parser.clj
@@ -188,8 +188,7 @@
   [element]
   (->> element
        element-to-classes
-       (r/filter (prefixed-by? "h-"))
-       (into [])))
+       (filter (prefixed-by? "h-"))))
 
 (defn- parse-implied-name
   "Get the implied name of an entity"
@@ -270,13 +269,13 @@
   (hash-map :type (get-mf-names element)
             :properties (get-mf-properties element)))
 
-(defn select-h
-  "Select top-level h-* elements within a HTML element."
-  [loc]
-  (when (not (z/end? loc))
-    (if (some->> loc z/node first :attrs :class (re-matcher #"(?:^|\s) h-\w"))
-      (z/node loc)
-      (recur (z/next loc)))))
+(defn map-h
+  "Map fn to top-level h-* elements within a HTML element."
+  [fn loc]
+  (if (some->> loc z/node :attrs :class (re-matcher #"(?:^|\s) h-\w"))
+    (list (fn (z/node loc)))
+    (when (not (z/end? loc))
+      (recur fn (z/next loc)))))
 
 (defn parse-rel
   "Parse rel attributes of an HTML link element"
@@ -300,4 +299,4 @@
   "Parse a HTML string with microformats"
   [html]
   (let [document (html/html-snippet (str/trim html))]
-    {:items (mapv parse-h (some->> document z/xml-zip select-h)) :rels (parse-rels document)}))
+    {:items (some->> document first z/xml-zip (map-h parse-h)) :rels (parse-rels document)}))
diff --git a/test/microformats/parser_expectations.clj b/test/microformats/parser_expectations.clj
index b22e3a9..1c6d4f1 100644
--- a/test/microformats/parser_expectations.clj
+++ b/test/microformats/parser_expectations.clj
@@ -27,14 +27,19 @@
 
 (expect '({:tag :div :attrs {:class "h-card"}
            :content nil})
-        (select-h (z/xml-zip (html-snippet
-                              "<div class=\"h-card\"></div>"))))
+        (map-h identity (z/xml-zip (snippet
+                                    "<div class=\"h-card\"></div>"))))
+
+(expect '({:tag :div :attrs {:class "h-card"}
+           :content nil})
+        (map-h identity (z/xml-zip (snippet
+                                    "<header><div class=\"h-card\"></div></header>"))))
 
 (expect '({:tag :div :attrs {:class "h-card"}
            :content ({:tag :a :attrs {:class "h-org"}
                       :content nil})})
-        (select-h (z/xml-zip (html-snippet
-                              "<div class=\"h-card\"><a class=\"h-org\"></a></div>"))))
+        (map-h identity (z/xml-zip (snippet
+                                    "<div class=\"h-card\"><a class=\"h-org\"></a></div>"))))
 
 (expect '({:tag :div :attrs {:class "h-card"}
            :content ("\n"
@@ -42,7 +47,7 @@
                       :content ({:tag :a :attrs {:class "h-org"}
                                  :content nil})}
                      "\n")})
-        (select-h (z/xml-zip (html-snippet "<div class=\"h-card\">
+        (map-h identity (z/xml-zip (snippet "<div class=\"h-card\">
 <p><a class=\"h-org\"></a></p>
 </div>"))))
 
@@ -136,77 +141,77 @@
 (expect {:content '({:html "Here is a load of <strong>embedded markup</strong>" :value "Here is a load of embedded markup"})}
         (parse-e (snippet "<div class=\"e-content\">Here is a load of <strong>embedded markup</strong></div>")))
 
-(expect {:author ["http://example.com/a"]}
+(expect {:author '("http://example.com/a")}
         (parse-rels (html-snippet "<a rel=\"author\" href=\"http://example.com/a\">author a</a>")))
 
-(expect {:author ["http://example.com/a" "http://example.com/b"]}
+(expect {:author '("http://example.com/a" "http://example.com/b")}
         (parse-rels (html-snippet "<a rel=\"author\" href=\"http://example.com/a\">author a</a>
 <a rel=\"author\" href=\"http://example.com/b\">author b</a>")))
 
-(expect {:items [] :rels {}}
+(expect {:items nil :rels {}}
         (parse ""))
 
-(expect {:items [{:properties {:name '("Example User")} :type ["h-card"]}] :rels {}}
+(expect {:items '({:properties {:name ("Example User")} :type ("h-card")}) :rels {}}
         (parse "<div class=\"h-card\"><p class=\"p-name\">Example User</p></div>"))
 
-(expect {:items [{:properties {:name '("Example User")} :type ["h-card"]}] :rels {}}
+(expect {:items '({:properties {:name ("Example User")} :type ("h-card")}) :rels {}}
         (parse "<div class=\"h-card\"><p class=\"p-name\">  Example User  </p></div>"))
 
-(expect {:items [{:properties {:name '("Example User")} :type ["h-card"]}] :rels {}}
+(expect {:items '({:properties {:name ("Example User")} :type ("h-card")}) :rels {}}
         (parse "  <div class=\"h-card\"><p class=\"p-name\">Example User</p></div>"))
 
-(expect {:items [{:properties {:name '("Example User") :url '("http://example.com")}
-                  :type ["h-card"]}] :rels {}}
+(expect {:items '({:properties {:name ("Example User") :url ("http://example.com")}
+                  :type ("h-card")}) :rels {}}
         (parse "<div class=\"h-card\"><a class=\"p-name u-url\" href=\"http://example.com\">Example User</></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")}}) :rels {}}
         (parse "<p class=\"h-card\">Example User</p>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User") :url '("http://example.com")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User") :url ("http://example.com")}}) :rels {}}
         (parse "<a class=\"h-card\" href=\"http://example.com\">Example User</a>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")
-                                                :photo '("http://example.com/me.png")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")
+                                                :photo ("http://example.com/me.png")}}) :rels {}}
         (parse "<img class=\"h-card\" alt=\"Example User\" src=\"http://example.com/me.png\"></img>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")}}) :rels {}}
         (parse "<abbr class=\"h-card\" title=\"Example User\">Incorrect</abbr>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")}}) :rels {}}
         (parse "<p class=\"h-card\"><img alt=\"Example User\"></p>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")}}) :rels {}}
         (parse "<p class=\"h-card\"><abbr title=\"Example User\">Wrong </abbr></p>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")}}) :rels {}}
         (parse "<div class=\"h-card\"><div><img alt=\"Example User\"></div></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")}}) :rels {}}
         (parse "<div class=\"h-card\"><p><abbr title=\"Example User\">Wrong</abbr></p></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:photo '("http://example.com/me.png")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:photo ("http://example.com/me.png")}}) :rels {}}
         (parse "<object class=\"h-card\" data=\"http://example.com/me.png\"></object>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")
-                                                :photo '("http://example.com/me.png")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")
+                                                :photo ("http://example.com/me.png")}}) :rels {}}
         (parse "<div class=\"h-card\"><img alt=\"Example User\" src=\"http://example.com/me.png\"></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:photo '("http://example.com/me.png")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:photo ("http://example.com/me.png")}}) :rels {}}
         (parse "<div class=\"h-card\"><object data=\"http://example.com/me.png\"></object></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:photo '("http://example.com/me.png")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:photo ("http://example.com/me.png")}}) :rels {}}
         (parse "<div class=\"h-card\"><div><object data=\"http://example.com/me.png\"></object></div></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User")
-                                                :photo '("http://example.com/me.png")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User")
+                                                :photo ("http://example.com/me.png")}}) :rels {}}
         (parse "<div class=\"h-card\"><div><img alt=\"Example User\" src=\"http://example.com/me.png\"></div></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example User") :url '("http://example.com")}}] :rels {}}
+(expect {:items '({:type ("h-card") :properties {:name ("Example User") :url ("http://example.com")}}) :rels {}}
         (parse "<div class=\"h-card\"><a href=\"http://example.com\">Example User</a></div>"))
 
-(expect {:items [{:type ["h-card"] :properties {:name '("Example")
-                                                :url '("http://example.com"
-                                                       "http://myblog.com")}}]
+(expect {:items '({:type ("h-card") :properties {:name ("Example")
+                                                :url ("http://example.com"
+                                                       "http://myblog.com")}})
          :rels {}}
         (parse "<div class=\"h-card\">
 <p class=\"u-name\">Example</p>
@@ -214,9 +219,9 @@
 <a class=\"u-url\" href=\"http://myblog.com\">My Blog</a>
 </div>"))
 
-(expect {:items [{:type ["h-card"]
-                  :properties {:name '("Example")
-                               :tel '("01234567890")}}]
+(expect {:items '({:type ("h-card")
+                  :properties {:name ("Example")
+                               :tel ("01234567890")}})
          :rels {}}
         (parse "<div class=\"h-card\">
 <p class=\"p-name\">Example</p>
@@ -225,14 +230,14 @@
 </div>"))
 
 (expect
- {:items [{:type ["h-adr"],
-           :properties {:street-address '("665 3rd St."),
-                        :extended-address '("Suite 207"),
-                        :locality '("San Francisco"),
-                        :region '("CA"),
-                        :postal-code '("94107"),
-                        :country-name '("U.S.A."),
-                        :name '("665 3rd St. Suite 207 San Francisco, CA 94107 U.S.A.")}}]
+ {:items '({:type ("h-adr"),
+           :properties {:street-address ("665 3rd St."),
+                        :extended-address ("Suite 207"),
+                        :locality ("San Francisco"),
+                        :region ("CA"),
+                        :postal-code ("94107"),
+                        :country-name ("U.S.A."),
+                        :name ("665 3rd St. Suite 207 San Francisco, CA 94107 U.S.A.")}})
   :rels {}}
  (parse "<p class=\"h-adr\">
 <span class=\"p-street-address\">665 3rd St.</span>
@@ -243,16 +248,16 @@
 <span class=\"p-country-name\">U.S.A.</span>
 </p>"))
 
-(expect {:items [{:type ["h-card" "h-org"]
-                  :properties {:name '("Example")}}]
+(expect {:items '({:type ("h-card" "h-org")
+                  :properties {:name ("Example")}})
          :rels {}}
         (parse "<p class=\"h-card h-org\">Example</p>"))
 
-(expect {:items [{:type ["h-card"]
-                  :properties {:name '("John Doe")
-                               :org '({:value "Example"
-                                       :type ["h-card" "h-org"]
-                                       :properties {:name ("Example")}})}}]
+(expect {:items '({:type ("h-card")
+                  :properties {:name ("John Doe")
+                               :org ({:value "Example"
+                                       :type ("h-card" "h-org")
+                                       :properties {:name ("Example")}})}})
          :rels {}}
         (parse "<div class=\"h-card\">
 <span class=\"p-name\">John Doe</span>