about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/microformats/parser.clj31
-rw-r--r--test/microformats/parser_expectations.clj17
2 files changed, 39 insertions, 9 deletions
diff --git a/src/microformats/parser.clj b/src/microformats/parser.clj
index f348f3b..ab14cd6 100644
--- a/src/microformats/parser.clj
+++ b/src/microformats/parser.clj
@@ -171,8 +171,8 @@
        (r/filter (mf-names-from-class "h-"))
        (into [])))
 
-(defn- imply-name
-  "Imply the name of an entity from the element"
+(defn- parse-implied-name
+  "Get the implied name of an entity"
   [element]
   (case (:tag element)
     :abbr (-> element :attrs :title)
@@ -188,25 +188,38 @@
      (-> % :attrs :title)
      true (node-to-text (:content element)))))
 
-(defn- imply-url
+(defn- parse-implied-url
   [element]
   (case (:tag element)
     :a (-> element :attrs :href)
     nil))
 
-(defn- imply-photo
+(defn- parse-implied-photo
   [element]
   (case (:tag element)
     :img (-> element :attrs :src)
-    nil))
+    :object (-> element :attrs :data)
+    (cond-let
+     (first (html/select element [html/root :> [:img (html/but-node (html/attr-contains :class "h-")) html/only-of-type]]))
+     (-> % :attrs :src)
+     (first (html/select element [html/root :> [:object (html/but-node (html/attr-contains :class "h-")) html/only-of-type]]))
+     (-> % :attrs :data)
+     (first (html/select element [html/root :> html/only-child :> [:img (html/but-node (html/attr-contains :class "h-")) html/only-of-type]]))
+     (-> % :attrs :src)
+     (first (html/select element [html/root :> html/only-child :> [:object (html/but-node (html/attr-contains :class "h-")) html/only-of-type]]))
+     (-> % :attrs :data)
+     )))
+
+(def empty-ish
+  #(not (str/blank? (first (second %)))))
 
 (defn parse-implied
   "Parse implied properties of a HTML element"
   [element]
-  (into {} (filter #(first (second %))
-                   {:name (list (imply-name element))
-                    :url (list (imply-url element))
-                    :photo (list (imply-photo element))})))
+  (into {} (filter empty-ish
+                   {:name (list (parse-implied-name element))
+                    :url (list (parse-implied-url element))
+                    :photo (list (parse-implied-photo element))})))
 
 (defn get-mf-properties
   "Parse children of a microformat, returning a map of properties"
diff --git a/test/microformats/parser_expectations.clj b/test/microformats/parser_expectations.clj
index 30e05f1..639c417 100644
--- a/test/microformats/parser_expectations.clj
+++ b/test/microformats/parser_expectations.clj
@@ -152,6 +152,23 @@
 (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 {}}
+        (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 {}}
+        (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 {}}
+        (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 {}}
+        (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 {}}
+        (parse "<div class=\"h-card\"><div><img alt=\"Example User\" src=\"http://example.com/me.png\"></div></div>"))
+
 (expect
  {:items [{:type ["h-adr"],
            :properties {:street-address '("665 3rd St."),