From 648699e0c15773bc332b2876ad0aa21c897e3654 Mon Sep 17 00:00:00 2001 From: Alan Pearce Date: Tue, 23 Sep 2014 21:38:11 +0100 Subject: Add full support for implied names --- src/microformats/parser.clj | 22 +++++++++++++++++++++- test/microformats/parser_expectations.clj | 16 ++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) 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 "")) + +(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}} + (parse "Incorrect")) + +(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}} + (parse "
")) + +(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}} + (parse "Wrong
")) + +(expect {:items [{:type ["h-card"] :properties {:name '("Example User")}}] :rels {}} + (parse "Wrong