emacs-orgmode@gnu.org archives
 help / color / mirror / code / Atom feed
From: gerard.vermeulen@posteo.net
To: Christian Moe <mail@christianmoe.com>
Cc: emacs-orgmode@gnu.org, Timothy <orgmode@tec.tecosaur.net>,
	Ihor Radchenko <yantar92@gmail.com>
Subject: Re: [PATCH] ox-html.el: add option to embed SVG for CSS support in SVG
Date: Tue, 06 Jun 2023 13:37:35 +0000	[thread overview]
Message-ID: <65d386e8c274e9703b80f2a2fefbcb7f@posteo.net> (raw)
In-Reply-To: <87fs74j4la.fsf@christianmoe.com>



On 06.06.2023 11:57, Christian Moe wrote:
> Hi,
> 
> I think there's a better approach. Tl;dr:
> 
> - A better way to have active CSS in SVG images is to link to the
>   external SVG file with the <object> rather than <img> tag, as we used
>   to.
> 
> - Without patching Org, you can embed an external SVG file as an SVG
>   island in Org HTML export simply by using #+INCLUDE.
> 
> Details:
> 
> 1) Embedded SVG is not the only way to have active CSS etc. in SVG
> images. Linking to an external SVG file with an OBJECT element instead
> of IMG should work fine (tested in Firefox). You can test this by
> exporting Gerard's mwe.org example and editing the mwe.html to replace
> 
> : img src="./doc8.svg"
> 
> with
> 
> : object type="image/svg+xml" data="./doc8.svg"

Indeed, the flower works after the replacement but the caption 
disappears.
I do not understand why, because the caption is still present in the 
HTML.

> 
> Org used to use OBJECT for SVG years ago, but switched to IMG at some
> point. I'm not quite sure when or why that happened (forgive me for not
> doing an exhaustive search of the archive or delving into the git
> record). But I think perhaps the reason was this thread,
> 
>   
> https://lists.gnu.org/archive/html/emacs-orgmode/2016-07/msg00380.html
> 
> where the issue was easy scaling, and that Jarmo Hurri's patch 
> switching
> to IMG came to be applied at some point, even though Jarmo and I agreed
> that adding a common CLASS="svgfig" attribute to OBJECT would solve his
> issue, see this thread:
> 
>   
> https://lists.gnu.org/archive/html/emacs-orgmode/2016-07/msg00410.html
> 
> I continue to think that OBJECT with an .svgfig class as default (or a
> setting to give the user a choice between IMG and OBJECT) is the best
> solution.
> 
> 2) You can actually embed an SVG island in Org HTML export simply by
> using #+INCLUDE. To try this, add the following line to Gerard's 
> mwe.org:
> 
> : #+INCLUDE: "./doc8.svg" export html
> 
> The exported HTML should now show the black flower from Gerard's 
> minimal
> non-working example plus a working flower.

Indeed, the flower works, but the caption disappears because Org does 
not
recognize the "#+INCLUDE ..." as a link, the caption does not show up in 
the
HTML. Is there an easy solution for this issue.

> 
> (Some SVG files may start with an XML declaration; if the XML
> declaration is on a separate first line, you can just skip it by adding
> =:lines "2-"= to the #+INCLUDE instruction.)
> 
> Yours,
> Christian

Thanks -- Gerard
> 
> Ihor Radchenko writes:
> 
>> gerard.vermeulen@posteo.net writes:
>> 
>>> I have been trying to export SVG images having links to CSS from Org 
>>> to
>>> HTML
>>> and I have found that the this CSS is not active in Firefox (only
>>> browser I tried).
>>> 
>>> I have found that the CCS is only active under two conditions:
>>> 1. The HTML page should manage the CSS that the SVG image links to.
>>> 2. The SVG image should be embedded in the HTML page.
>> 
>> CCing Timothy, the maintainer.
>> 
>> Also, does the above mean that Firefox does not support custom CSS 
>> user
>> stylesheets? What am I missing?
>> 
>>> I wrote an ox-html derived export backend to embed SVG images:
>>> https://forge.chapril.org/gav451/emacs.d/src/branch/main/site-lisp/ox-my-html/ox-my-html.el
>>> and merged the SVG embedding functionality into ox-html.el leading to
>>> the
>>> attached patch.
>> 
>> Thanks! I will provide high-level comments from general ox.el
>> perspective.
>> 
>>> +    (:html-embed-svg-excludes "HTML_EMBED_SVG_EXCLUDES" nil
>>> +                              org-html-embed-svg-excludes split)
>>> +    (:html-embed-svg-includes "HTML_EMBED_SVG_INCLUDES" nil
>>> +                              org-html-embed-svg-includes split)
>> 
>> This is awkward. To do per-image export adjustments, we usually use
>> export attributes (#+ATTR_HTML: ...). And why "split"?
>> 
>>> +    (:with-html-svg-embedding nil "html-embed-svg" 
>>> org-html-embed-svg)
>> 
>> We have :html-inline-images. Maybe better :html-embed-svg ?
>> 
>>> +(defcustom org-html-embed-svg nil
>>> ...
>>> +  :version "30.0"
>> 
>> We do not use :version tag. Please use :package-version.
>> See Elisp manual section "15.1 Common Item Keywords".
>> 
>> Also, maybe instead of t/nil boolean values here, we may allow the 
>> value
>> to be a list of regular expressions or a string representing regular
>> expression. This will allow what you are trying to do with
>> HTML_EMBED_SVG_INCLUDES. The list elements might also be (not "..."),
>> replicating HTML_EMBED_SVG_EXLCUDES.
>> 
>> Even more generally, we may turn this into HTML_EMBED_IMAGES and embed
>> all the images (possibly filtered by regexp). This will be slightly
>> beyond the scope of this patch though.
>> 
>>> +(defun org-html--embed-svg-p (link path info)
>>> +  "Check whether LINK and INFO specify to embed the SVG file named 
>>> PATH.
>>> +LINK must have no contents and link to an SVG file.  INFO may 
>>> contain
>>> +lists of SVG files to include in and/or to exclude from embedding."
>>> +  (and (not (org-element-contents link))
>> 
>> Please use `org-export-inline-image-p'.
>> 
>>> +(defun org-html-svg-contents (path)
>>> +  "Return the SVG contents of the file named PATH."
>>> +  (with-temp-buffer
>>> +    (insert-file-contents path)
>>> +    ;; Delete text preceding something starting as an SVG root 
>>> element.
>>> +    ;; The intent is to remove XML declarations (and XML comments).
>>> +    ;; This breaks in case of a preceding XML comment with <svg 
>>> inside
>>> +    ;; or a preceding XML element with an SVG element inside.
>>> +    ;; See https://emacs.stackexchange.com/a/57433 for the original 
>>> code.
>> 
>> But the original code is different, no?


  reply	other threads:[~2023-06-06 13:38 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-06-05 13:23 [PATCH] ox-html.el: add option to embed SVG for CSS support in SVG gerard.vermeulen
2023-06-06  7:49 ` Ihor Radchenko
2023-06-06  9:57   ` Christian Moe
2023-06-06 13:37     ` gerard.vermeulen [this message]
2023-06-06 18:54       ` Christian Moe
2023-06-07  8:43         ` Ihor Radchenko
2023-06-07  8:41     ` Ihor Radchenko
2023-06-07 14:30       ` Christian Moe
2023-06-07 17:57         ` Ihor Radchenko
2023-06-15 13:09           ` gerard.vermeulen
2023-06-15 14:55             ` Max Nikulin
2023-06-15 20:42               ` Ihor Radchenko
2023-06-15 20:51             ` Ihor Radchenko
2023-06-16 18:39               ` gerard.vermeulen
2023-06-17 12:38                 ` Ihor Radchenko
2023-06-17 14:45                   ` gerard.vermeulen
2023-06-21 15:52               ` Max Nikulin
2023-06-21 16:02                 ` Ihor Radchenko
2023-06-21 16:27                   ` Max Nikulin
2023-06-21 16:38                     ` Ihor Radchenko
2023-06-22 16:25                       ` Max Nikulin
2023-06-23 11:02                         ` Ihor Radchenko
2023-06-06 12:58   ` gerard.vermeulen
2023-06-07  9:07     ` Ihor Radchenko
2023-06-06 14:14 ` Max Nikulin
2023-06-06 16:08   ` gerard.vermeulen
2023-06-07  9:10     ` Ihor Radchenko
2023-06-09 15:27     ` Max Nikulin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.orgmode.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=65d386e8c274e9703b80f2a2fefbcb7f@posteo.net \
    --to=gerard.vermeulen@posteo.net \
    --cc=emacs-orgmode@gnu.org \
    --cc=mail@christianmoe.com \
    --cc=orgmode@tec.tecosaur.net \
    --cc=yantar92@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).