about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAlan Pearce2014-09-28 19:21:55 +0100
committerAlan Pearce2014-09-28 19:21:55 +0100
commit2beb34d0d9481faa111567b6faf019c0c179c591 (patch)
treeff3282f6615fad6aff575006cdd5b28d64d130c1
parentb1e28b8b122a46951ab8e17f010ab58fd06f9524 (diff)
downloadmicroformats-2beb34d0d9481faa111567b6faf019c0c179c591.tar.lz
microformats-2beb34d0d9481faa111567b6faf019c0c179c591.tar.zst
microformats-2beb34d0d9481faa111567b6faf019c0c179c591.zip
Parse properties for child microformats
-rw-r--r--src/microformats/parser.clj39
-rw-r--r--test/microformats/parser_expectations.clj11
2 files changed, 40 insertions, 10 deletions
diff --git a/src/microformats/parser.clj b/src/microformats/parser.clj
index 32d0331..27c1388 100644
--- a/src/microformats/parser.clj
+++ b/src/microformats/parser.clj
@@ -79,19 +79,38 @@
   (when-let [values (seq (html/select el [html/root :> :.value]))]
     (get-value-class values)))
 
+(declare parse-h)
+
+(defn get-child-mf-properties
+  [element]
+  (assoc (parse-h element) :value (-> element :content node-to-text)))
+
+(defn remove-property-classes
+  [element]
+  (into {} (html/transform (list element) [html/root]
+                           (apply html/remove-class (filter (prefixed-by? "p-")
+                                                            (element-to-classes element))))))
+
+(defn- find-child-mf
+  "Find child property microformats of an element."
+  [element]
+  (when (-> element :attrs :class (.indexOf "h-") (>= 0))
+    (-> element remove-property-classes get-child-mf-properties)))
+
 (defn get-p-value
   "Get the p-x property value of an element"
   [el]
-  (str/trim (or (find-value-class el)
-                (case (:tag el)
-                  :img (-> el :attrs :alt)
-                  :area (-> el :attrs :alt)
-                  :abbr (-> el :attrs :title)
-                  :data (-> el :attrs :value)
-                  :input (-> el :attrs :value)
-                  nil)
-                (node-to-text (:content el))
-                "")))
+  (or (find-child-mf el)
+      (str/trim (or (find-value-class el)
+                    (case (:tag el)
+                      :img (-> el :attrs :alt)
+                      :area (-> el :attrs :alt)
+                      :abbr (-> el :attrs :title)
+                      :data (-> el :attrs :value)
+                      :input (-> el :attrs :value)
+                      nil)
+                    (node-to-text (:content el))
+                    ""))))
 
 (defn get-u-value
   "Get the u-x property value of an element"
diff --git a/test/microformats/parser_expectations.clj b/test/microformats/parser_expectations.clj
index 1cbeedd..12234aa 100644
--- a/test/microformats/parser_expectations.clj
+++ b/test/microformats/parser_expectations.clj
@@ -244,3 +244,14 @@
                   :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")}})}}]
+         :rels {}}
+        (parse "<div class=\"h-card\">
+<span class=\"p-name\">John Doe</span>
+<span class=\"p-org h-card h-org\">Example</span>
+</div>"))