]> code.delx.au - gnu-emacs/blobdiff - lisp/dom.el
Add new function dom-remove-node
[gnu-emacs] / lisp / dom.el
index 42131073a04e2a5e0591bf0fc2e48ec10c1f5886..cf3a02a51dbcc1d0963e2a77d673f2422ac677b8 100644 (file)
@@ -1,6 +1,6 @@
 ;;; dom.el --- XML/HTML (etc.) DOM manipulation and searching functions
 
-;; Copyright (C) 2014-2015 Free Software Foundation, Inc.
+;; Copyright (C) 2014-2016 Free Software Foundation, Inc.
 
 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org>
 ;; Keywords: xml, html
@@ -25,6 +25,7 @@
 ;;; Code:
 
 (require 'cl-lib)
+(eval-when-compile (require 'subr-x))
 
 (defsubst dom-tag (node)
   "Return the NODE tag."
@@ -138,6 +139,16 @@ ATTRIBUTE would typically be `class', `id' or the like."
        (cons dom matches)
       matches)))
 
+(defun dom-remove-node (dom node)
+  "Remove NODE from DOM."
+  ;; If we're removing the top level node, just return nil.
+  (dolist (child (dom-children dom))
+    (cond
+     ((eq node child)
+      (delq node dom))
+     ((not (stringp child))
+      (dom-remove-node child node)))))
+
 (defun dom-parent (dom node)
   "Return the parent of NODE in DOM."
   (if (memq node (dom-children dom))
@@ -150,6 +161,7 @@ ATTRIBUTE would typically be `class', `id' or the like."
       result)))
 
 (defun dom-previous-sibling (dom node)
+  "Return the previous sibling of NODE in DOM."
   (when-let (parent (dom-parent dom node))
     (let ((siblings (dom-children parent))
          (previous nil))