about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/microformats/parser.clj27
-rw-r--r--test/microformats/parser_test.clj9
2 files changed, 35 insertions, 1 deletions
diff --git a/src/microformats/parser.clj b/src/microformats/parser.clj
index 97d0376..9801515 100644
--- a/src/microformats/parser.clj
+++ b/src/microformats/parser.clj
@@ -32,6 +32,13 @@
                :class
                split-ws-attribute))
 
+(defn element-to-rels
+  "Get list of rels from an element"
+  [el] (-> el
+           :attrs
+           :rel
+           split-ws-attribute))
+
 (defn get-p-value
   "Get the p-x property value of an element"
   [el]
@@ -134,8 +141,26 @@
   [element]
   (mapv parse-children (html/select element [(html/attr-starts :class "h-")])))
 
+(defn parse-rel
+  "Parse rel attributes of an HTML link element"
+  [element]
+  (->> element
+       element-to-rels
+       (map keyword)
+       (map #(hash-map % [(-> element :attrs :href)]))
+       (into {})))
+
+(defn select-rels
+  "Select linking HTML elements with rel attributes"
+  [html] (html/select html [[#{:a :link} (html/attr? :rel)]]))
+
+(defn parse-rels
+  "Parse rel attibutes of a set of HTML link elements"
+  [elements]
+  (apply merge-with into (map parse-rel (select-rels elements))))
+
 (defn parse
   "Parse a HTML string with microformats"
   [html]
   (let [document (html/html-snippet html)]
-    {:items (parse-h document) :rels {}}))
+    {:items (parse-h document) :rels (parse-rels document)}))
diff --git a/test/microformats/parser_test.clj b/test/microformats/parser_test.clj
index 7d837f2..51c45c7 100644
--- a/test/microformats/parser_test.clj
+++ b/test/microformats/parser_test.clj
@@ -121,3 +121,12 @@
     (are [ex in] (= ex (parse-e (first (html-snippet in))))
          {:content {:html "Here is a load of <strong>embedded markup</strong>" :value "Here is a load of embedded markup"}}
          "<div class=\"e-content\">Here is a load of <strong>embedded markup</strong></div>")))
+
+(deftest parse-rel-test
+  (testing "link and a tags with rel attributes should be parsed"
+    (are [ex in] (= ex (parse-rels (html-snippet in)))
+         {:author ["http://example.com/a"]}
+         "<a rel=\"author\" href=\"http://example.com/a\">author a</a>"
+
+         {:author ["http://example.com/a" "http://example.com/b"]}
+         "<a rel=\"author\" href=\"http://example.com/a\">author a</a><a rel=\"author\" href=\"http://example.com/b\">author b</a>")))