]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a new `dom-search' function
authorLars Ingebrigtsen <larsi@gnus.org>
Thu, 26 Sep 2019 22:32:37 +0000 (00:32 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Thu, 26 Sep 2019 22:33:45 +0000 (00:33 +0200)
* doc/lispref/text.texi (Document Object Model): Document it.

* lisp/dom.el (dom-search): New function.

doc/lispref/text.texi
etc/NEWS
lisp/dom.el

index d7b04d2934ff3a978694e88fdfbbe0e9f49faf27..8d78a9b24ffabf2fba1cb2ec47d8b2be00fb48fc 100644 (file)
@@ -5162,6 +5162,11 @@ which is a regular expression.
 Return all nodes in @var{dom} that have IDs that match @var{match},
 which is a regular expression.
 
+@item dom-search @var{dom} @var{predicate}
+Return all nodes in @var{dom} where @var{predicate} returns a
+non-@code{nil} value.  @var{predicate} is called with the node to be
+tested as its parameter.
+
 @item dom-strings @var{dom}
 Return all strings in @var{dom}.
 
index 0a4ada3cc6cd68ee3aed5ed46192a9b3e8b04a6d..afeb387773947929aebda31106bb3b5793c040f3 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -275,6 +275,12 @@ obsolete, and the new utility function 'xml-remove-comments' can be
 used to remove comments before calling the libxml functions to parse
 the data.
 
++++
+** A new DOM (the XML/HTML document structure returned by functions
+such as 'libxml-parse-html-region') traversal function has been added:
+'dom-search', which takes a DOM and a predicate and returns all nodes
+that match.
+
 +++
 ** The Network Security Manager now allows more fine-grained control
 of what checks to run via the 'network-security-protocol-checks'
index d8c44339985e64aa1f75c3ae4bf9d3d5fde0a1a9..f01da5221b80dd99c8bbe3eab08eaf20416097c1 100644 (file)
@@ -108,6 +108,18 @@ A name is a symbol like `td'."
        (cons dom matches)
       matches)))
 
+(defun dom-search (dom predicate)
+  "Return elements in DOM where PREDICATE is non-nil.
+PREDICATE is called with the node as its only parameter."
+  (let ((matches (cl-loop for child in (dom-children dom)
+                         for matches = (and (not (stringp child))
+                                            (dom-search child predicate))
+                         when matches
+                         append matches)))
+    (if (funcall predicate dom)
+       (cons dom matches)
+      matches)))
+
 (defun dom-strings (dom)
   "Return elements in DOM that are strings."
   (cl-loop for child in (dom-children dom)