From: Lars Magne Ingebrigtsen Date: Mon, 27 Jun 2016 20:25:10 +0000 (+0200) Subject: New functions svg-text and svg-remove X-Git-Url: https://code.delx.au/gnu-emacs/commitdiff_plain/f7ea7aa11f6211b5142bbcfc41c580d75485ca56 New functions svg-text and svg-remove * doc/lispref/display.texi (SVG Images): Document svg-remove. * doc/lispref/display.texi (SVG Images): Document svg-text. * lisp/svg.el (svg-remove): New function. (svg-text): New function. --- diff --git a/doc/lispref/display.texi b/doc/lispref/display.texi index 575cad89f8..b7a6b570eb 100644 --- a/doc/lispref/display.texi +++ b/doc/lispref/display.texi @@ -5350,6 +5350,24 @@ that describe the outer circumference of the polygon. @end lisp @end defun +@defun svg-text svg text &rest args +Add a text to @var{svg}. + +@lisp +(svg-text + svg "This is a text" + :font-size "40" + :font-weight "bold" + :stroke "black" + :fill "white" + :font-family "impact" + :letter-spacing "4pt" + :x 300 + :y 400 + :stroke-width 1) +@end lisp +@end defun + @defun svg-embed svg image image-type datap &rest args Add an embedded (raster) image to @var{svg}. If @var{datap} is @code{nil}, @var{IMAGE} should be a file name; if not, it should be a @@ -5363,6 +5381,10 @@ binary string containing the image data. @var{image-type} should be a @end lisp @end defun +@defun svg-remove svg id +Remove the element with identifier @code{id} from the @code{svg}. +@end defun + Finally, the @code{svg-image} takes an SVG object as its parameter and returns an image object suitable for use in functions like @code{insert-image}. Here's a complete example that creates and diff --git a/lisp/svg.el b/lisp/svg.el index c33b0923c2..a92c6dfb61 100644 --- a/lisp/svg.el +++ b/lisp/svg.el @@ -27,6 +27,7 @@ (require 'cl-lib) (require 'xml) (require 'dom) +(require 'subr-x) (defun svg-create (width height &rest args) "Create a new, empty SVG image with dimensions WIDTHxHEIGHT. @@ -149,13 +150,22 @@ otherwise. IMAGE-TYPE should be a MIME image type, like `((xlink:href . ,(svg--image-data image image-type datap)) ,@(svg--arguments svg args))))) +(defun svg-text (svg text &rest args) + "Add TEXT to SVG." + (svg--append + svg + (dom-node + 'text + `(,@(svg--arguments svg args)) + text))) + (defun svg--append (svg node) (let ((old (and (dom-attr node 'id) (dom-by-id svg (concat "\\`" (regexp-quote (dom-attr node 'id)) "\\'"))))) (if old - (dom-set-attributes old (dom-attributes node)) + (setcdr (car old) (cdr node)) (dom-append-child svg node))) (svg-possibly-update-image svg)) @@ -237,16 +247,26 @@ If the SVG is later changed, the image will also be updated." (defun svg-print (dom) "Convert DOM into a string containing the xml representation." - (insert (format "<%s" (car dom))) - (dolist (attr (nth 1 dom)) - ;; Ignore attributes that start with a colon. - (unless (= (aref (format "%s" (car attr)) 0) ?:) - (insert (format " %s=\"%s\"" (car attr) (cdr attr))))) - (insert ">") - (dolist (elem (nthcdr 2 dom)) - (insert " ") - (svg-print elem)) - (insert (format "" (car dom)))) + (if (stringp dom) + (insert dom) + (insert (format "<%s" (car dom))) + (dolist (attr (nth 1 dom)) + ;; Ignore attributes that start with a colon. + (unless (= (aref (format "%s" (car attr)) 0) ?:) + (insert (format " %s=\"%s\"" (car attr) (cdr attr))))) + (insert ">") + (dolist (elem (nthcdr 2 dom)) + (insert " ") + (svg-print elem)) + (insert (format "" (car dom))))) + +(defun svg-remove (svg id) + "Remove the element identified by ID from SVG." + (when-let ((node (car (dom-by-id + svg + (concat "\\`" (regexp-quote id) + "\\'"))))) + (dom-remove-node svg node))) (provide 'svg)