]> git.eshelyaron.com Git - emacs.git/commitdiff
Add a new function dom-print
authorLars Ingebrigtsen <larsi@gnus.org>
Mon, 31 Aug 2020 17:12:12 +0000 (19:12 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Mon, 31 Aug 2020 17:13:30 +0000 (19:13 +0200)
* doc/lispref/text.texi (Document Object Model): Document it.

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

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

index 0c3813ff1d070c684aa56c587cc9fcc805ed6ba6..3a4cf6b5723b81eee36c17e30928859006f23812 100644 (file)
@@ -5154,6 +5154,11 @@ Utility functions:
 @item dom-pp @var{dom} &optional @var{remove-empty}
 Pretty-print @var{dom} at point.  If @var{remove-empty}, don't print
 textual nodes that just contain white-space.
+
+@item dom-print @var{dom} &optional @var{pretty} @var{xml}
+Print @var{dom} at point.  If @var{xml} is non-@code{nil}, print as
+@acronym{XML}; otherwise, print as @acronym{HTML}.  If @var{pretty} is
+non-@code{nil}, indent the @acronym{HTML}/@acronym{XML} logically.
 @end table
 
 
index ad63955f7bf1813ffb6c69b0f476a9eb2afb58e6..9a044cade1cb966261a7c0ef0c4b72f5ce18ad55 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1215,6 +1215,9 @@ equivalent period in seconds.
 +++
 ** The new function 'dom-remove-attribute' has been added.
 
++++
+** The new function 'dom-print' has been added.
+
 ---
 ** 'make-network-process', 'make-serial-process' ':coding' behavior change.
 Previously, passing ':coding nil' to either of these functions would
index 7ff9e07b729b7308fbd0aaece920d196c45c83f7..bf4a56ab9f5bd2659f15d4998fc4a5ee69788515 100644 (file)
@@ -269,6 +269,50 @@ white-space."
              (insert ")")
            (insert "\n" (make-string (1+ column) ? ))))))))
 
+(defun dom-print (dom &optional pretty xml)
+  "Print DOM at point as HTML/XML.
+If PRETTY, indent the HTML/XML logically.
+If XML, generate XML instead of HTML."
+  (let ((column (current-column)))
+    (insert (format "<%s" (dom-tag dom)))
+    (let ((attr (dom-attributes dom)))
+      (dolist (elem attr)
+       ;; In HTML, these are boolean attributes that should not have
+       ;; an = value.
+       (if (and (memq (car elem)
+                      '(async autofocus autoplay checked
+                              contenteditable controls default
+                              defer disabled formNoValidate frameborder
+                              hidden ismap itemscope loop
+                              multiple muted nomodule novalidate open
+                              readonly required reversed
+                              scoped selected typemustmatch))
+                (cdr elem)
+                (not xml))
+           (insert (format " %s" (car elem)))
+         (insert (format " %s=%S" (car elem) (cdr elem))))))
+    (let* ((children (dom-children dom))
+          (non-text nil))
+      (if (null children)
+         (insert " />")
+       (insert ">")
+        (dolist (child children)
+         (if (stringp child)
+             (insert child)
+           (setq non-text t)
+           (when pretty
+              (insert "\n" (make-string (+ column 2) ? )))
+           (dom-print child pretty xml)))
+       ;; If we inserted non-text child nodes, or a text node that
+       ;; ends with a newline, then we indent the end tag.
+        (when (and pretty
+                  (or (bolp)
+                      non-text))
+         (unless (bolp)
+            (insert "\n"))
+         (insert (make-string column ? )))
+        (insert (format "</%s>" (dom-tag dom)))))))
+
 (provide 'dom)
 
 ;;; dom.el ends here