about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAlan Pearce2014-09-23 21:38:11 +0100
committerAlan Pearce2014-09-23 21:38:11 +0100
commit648699e0c15773bc332b2876ad0aa21c897e3654 (patch)
treee362e91b4f88215297bcacdbc15071f8f39cd138
parent2bf7f18a47beb329f6dcd3776a819d6541cff166 (diff)
downloadmicroformats-648699e0c15773bc332b2876ad0aa21c897e3654.tar.lz
microformats-648699e0c15773bc332b2876ad0aa21c897e3654.tar.zst
microformats-648699e0c15773bc332b2876ad0aa21c897e3654.zip
Add full support for implied names
-rw-r--r--src/microformats/parser.clj22
-rw-r--r--test/microformats/parser_expectations.clj16
2 files changed, 37 insertions, 1 deletions
diff --git a/src/microformats/parser.clj b/src/microformats/parser.clj
index b28fce7..875caec 100644
--- a/src/microformats/parser.clj
+++ b/src/microformats/parser.clj
@@ -3,6 +3,16 @@
             [clojure.core.reducers :as r]
             [clojure.string :as str]))
 
+(defmacro cond-let
+  [& clauses]
+  (when clauses
+    (list 'if-let ['x (first clauses)]
+          (if (next clauses)
+            (second clauses)
+            (throw (IllegalArgumentException.
+                    "cond-let requires an even number of forms")))
+          (cons 'cond-let (next (next clauses))))))
+
 (defn mf-names-from-class
   "Get microformat classnames from a class attribute"
   [prefix]
@@ -165,8 +175,18 @@
   "Imply the name of an entity from the element"
   [element]
   (case (:tag element)
+    :abbr (-> element :attrs :title)
     :img (-> element :attrs :alt)
-    (node-to-text (:content element))))
+    (cond-let
+     (first (html/select element [html/root :> [:img html/only-child]]))
+     (-> x :attrs :alt)
+     (first (html/select element [html/root :> [:abbr html/only-child (html/attr? :title)]]))
+     (-> x :attrs :title)
+     (first (html/select element [html/root :> html/only-child :> [:img html/only-child]]))
+     (-> x :attrs :alt)
+     (first (html/select element [html/root :> html/only-child :> [:abbr html/only-child (html/attr? :title)]]))
+     (-> x :attrs :title)
+     true (node-to-text (:content element)))))
 
 (defn- imply-url
   [element]
diff --git a/test/microformats/parser_expectations.clj b/test/microformats/parser_expectations.clj
index c903165..30e05f1 100644
--- a/test/microformats/parser_expectations.clj
+++ b/test/microformats/parser_expectations.clj
@@ -136,6 +136,22 @@
 (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 {}}
+        (parse "<abbr class=\"h-card\" title=\"Example User\">Incorrect</abbr>"))
+
+(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 {}}
+        (parse "<p class=\"h-card\"><abbr title=\"Example User\">Wrong </abbr></p>"))
+
+(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 {}}
+        (parse "<div class=\"h-card\"><p><abbr title=\"Example User\">Wrong</abbr></p></div>"))
+
 (expect
  {:items [{:type ["h-adr"],
            :properties {:street-address '("665 3rd St."),