kaushalmodi / ox-hugo

A carefully crafted Org exporter back-end for Hugo
https://ox-hugo.scripter.co
GNU General Public License v3.0
867 stars 130 forks source link

Invalid inline SVG #648

Open simonthum opened 2 years ago

simonthum commented 2 years ago

Actual Behavior

Similar to #470, inline SVG is broken for me. I use excalidraw export. There are two issues with that:

ox-hugo produces the following markdown:

<figure>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0
  1135 694.5" width="1135" height="694.5">

  <defs> <style> @font-face { font-family: "Virgil"; src:

The empty line creates an extra html p tag on md -> html, which leads the browser to close the SVG tag prematurely, messing up the drawing. The emptyline is in the original SVG.

After fixing that, I noticed that text blocks are being wrapped in the output. This breaks text formatting in the rendered result.

Expected Behavior

Inline SVG should strip empty lines or otherwise prevent arbitrary p tag insertion.

Inline SVG should not have lines wrapped around arbitrarily. (preserve-filling is t)

How to Reproduce the Issue

Inline export an SVG with an empty line after the starting tag, as in the example above.

Example Org File

#+caption: Caption
#+attr_html: :inlined t
[[file:diagrams/diagram.svg]]

Generated Markdown File or Error

Ox-Hugo Debug Information

Debug information for ox-hugo

Debug Info ## Emacs Version GNU Emacs 27.2 (build 1, x86_64-redhat-linux-gnu, GTK+ Version 3.24.30, cairo version 1.17.4) of 2021-08-07 ## Org Version Org mode version 9.5.2 (9.5.2-gfbff08 @ /home/user/.emacs.d/elpa/org-9.5.2/) ## Hugo Version hugo v0.91.2-1798BD3F+extended linux/amd64 BuildDate=2021-12-23T15:33:34Z VendorInfo=gohugoio ### Org `load-path` shadows **Warning**: Possible mixed installation of Org /home/user/.emacs.d/elpa/org-9.5.2/ob-maxima hides /usr/share/emacs/27.2/lisp/org/ob-maxima /home/user/.emacs.d/elpa/org-9.5.2/ob-core hides /usr/share/emacs/27.2/lisp/org/ob-core /home/user/.emacs.d/elpa/org-contrib-0.3/ob-shen hides /usr/share/emacs/27.2/lisp/org/ob-shen /home/user/.emacs.d/elpa/org-9.5.2/org hides /usr/share/emacs/27.2/lisp/org/org /home/user/.emacs.d/elpa/org-contrib-0.3/ob-io hides /usr/share/emacs/27.2/lisp/org/ob-io /home/user/.emacs.d/elpa/org-9.5.2/org-protocol hides /usr/share/emacs/27.2/lisp/org/org-protocol /home/user/.emacs.d/elpa/org-9.5.2/ol-eshell hides /usr/share/emacs/27.2/lisp/org/ol-eshell /home/user/.emacs.d/elpa/org-9.5.2/org-habit hides /usr/share/emacs/27.2/lisp/org/org-habit /home/user/.emacs.d/elpa/org-9.5.2/ob-calc hides /usr/share/emacs/27.2/lisp/org/ob-calc /home/user/.emacs.d/elpa/org-9.5.2/ob-octave hides /usr/share/emacs/27.2/lisp/org/ob-octave /home/user/.emacs.d/elpa/org-9.5.2/ob-screen hides /usr/share/emacs/27.2/lisp/org/ob-screen /home/user/.emacs.d/elpa/org-9.5.2/ox-texinfo hides /usr/share/emacs/27.2/lisp/org/ox-texinfo /home/user/.emacs.d/elpa/org-9.5.2/ox-icalendar hides /usr/share/emacs/27.2/lisp/org/ox-icalendar /home/user/.emacs.d/elpa/org-9.5.2/org-plot hides /usr/share/emacs/27.2/lisp/org/org-plot /home/user/.emacs.d/elpa/org-9.5.2/ob-ref hides /usr/share/emacs/27.2/lisp/org/ob-ref /home/user/.emacs.d/elpa/org-contrib-0.3/ob-ebnf hides /usr/share/emacs/27.2/lisp/org/ob-ebnf /home/user/.emacs.d/elpa/org-9.5.2/org-inlinetask hides /usr/share/emacs/27.2/lisp/org/org-inlinetask /home/user/.emacs.d/elpa/org-9.5.2/org-num hides /usr/share/emacs/27.2/lisp/org/org-num /home/user/.emacs.d/elpa/org-9.5.2/ob-latex hides /usr/share/emacs/27.2/lisp/org/ob-latex /home/user/.emacs.d/elpa/org-9.5.2/ob-fortran hides /usr/share/emacs/27.2/lisp/org/ob-fortran /home/user/.emacs.d/elpa/org-9.5.2/ob-scheme hides /usr/share/emacs/27.2/lisp/org/ob-scheme /home/user/.emacs.d/elpa/org-9.5.2/ob-java hides /usr/share/emacs/27.2/lisp/org/ob-java /home/user/.emacs.d/elpa/org-9.5.2/ob-clojure hides /usr/share/emacs/27.2/lisp/org/ob-clojure /home/user/.emacs.d/elpa/org-9.5.2/ob-sql hides /usr/share/emacs/27.2/lisp/org/ob-sql /home/user/.emacs.d/elpa/org-9.5.2/org-table hides /usr/share/emacs/27.2/lisp/org/org-table /home/user/.emacs.d/elpa/org-contrib-0.3/ob-vala hides /usr/share/emacs/27.2/lisp/org/ob-vala /home/user/.emacs.d/elpa/org-9.5.2/ol-gnus hides /usr/share/emacs/27.2/lisp/org/ol-gnus /home/user/.emacs.d/elpa/org-9.5.2/org-attach-git hides /usr/share/emacs/27.2/lisp/org/org-attach-git /home/user/.emacs.d/elpa/org-9.5.2/ob-R hides /usr/share/emacs/27.2/lisp/org/ob-R /home/user/.emacs.d/elpa/org-9.5.2/ob-makefile hides /usr/share/emacs/27.2/lisp/org/ob-makefile /home/user/.emacs.d/elpa/org-9.5.2/ob hides /usr/share/emacs/27.2/lisp/org/ob /home/user/.emacs.d/elpa/org-9.5.2/ob-css hides /usr/share/emacs/27.2/lisp/org/ob-css /home/user/.emacs.d/elpa/org-9.5.2/org-agenda hides /usr/share/emacs/27.2/lisp/org/org-agenda /home/user/.emacs.d/elpa/org-9.5.2/ox-latex hides /usr/share/emacs/27.2/lisp/org/ox-latex /home/user/.emacs.d/elpa/org-9.5.2/ob-tangle hides /usr/share/emacs/27.2/lisp/org/ob-tangle /home/user/.emacs.d/elpa/org-9.5.2/ol hides /usr/share/emacs/27.2/lisp/org/ol /home/user/.emacs.d/elpa/org-9.5.2/ob-perl hides /usr/share/emacs/27.2/lisp/org/ob-perl /home/user/.emacs.d/elpa/org-9.5.2/ol-w3m hides /usr/share/emacs/27.2/lisp/org/ol-w3m /home/user/.emacs.d/elpa/org-9.5.2/ox hides /usr/share/emacs/27.2/lisp/org/ox /home/user/.emacs.d/elpa/org-9.5.2/ob-groovy hides /usr/share/emacs/27.2/lisp/org/ob-groovy /home/user/.emacs.d/elpa/org-9.5.2/ob-awk hides /usr/share/emacs/27.2/lisp/org/ob-awk /home/user/.emacs.d/elpa/org-9.5.2/org-element hides /usr/share/emacs/27.2/lisp/org/org-element /home/user/.emacs.d/elpa/org-9.5.2/ob-matlab hides /usr/share/emacs/27.2/lisp/org/ob-matlab /home/user/.emacs.d/elpa/org-9.5.2/org-colview hides /usr/share/emacs/27.2/lisp/org/org-colview /home/user/.emacs.d/elpa/org-9.5.2/org-tempo hides /usr/share/emacs/27.2/lisp/org/org-tempo /home/user/.emacs.d/elpa/org-contrib-0.3/ob-mscgen hides /usr/share/emacs/27.2/lisp/org/ob-mscgen /home/user/.emacs.d/elpa/org-9.5.2/org-macro hides /usr/share/emacs/27.2/lisp/org/org-macro /home/user/.emacs.d/elpa/org-9.5.2/ol-bbdb hides /usr/share/emacs/27.2/lisp/org/ol-bbdb /home/user/.emacs.d/elpa/org-9.5.2/ob-table hides /usr/share/emacs/27.2/lisp/org/ob-table /home/user/.emacs.d/elpa/org-9.5.2/org-datetree hides /usr/share/emacs/27.2/lisp/org/org-datetree /home/user/.emacs.d/elpa/org-9.5.2/ox-publish hides /usr/share/emacs/27.2/lisp/org/ox-publish /home/user/.emacs.d/elpa/org-9.5.2/ob-exp hides /usr/share/emacs/27.2/lisp/org/ob-exp /home/user/.emacs.d/elpa/org-9.5.2/ob-python hides /usr/share/emacs/27.2/lisp/org/ob-python /home/user/.emacs.d/elpa/org-9.5.2/org-keys hides /usr/share/emacs/27.2/lisp/org/org-keys /home/user/.emacs.d/elpa/org-9.5.2/ob-sed hides /usr/share/emacs/27.2/lisp/org/ob-sed /home/user/.emacs.d/elpa/org-9.5.2/ob-sass hides /usr/share/emacs/27.2/lisp/org/ob-sass /home/user/.emacs.d/elpa/org-9.5.2/ox-html hides /usr/share/emacs/27.2/lisp/org/ox-html /home/user/.emacs.d/elpa/org-9.5.2/ob-lob hides /usr/share/emacs/27.2/lisp/org/ob-lob /home/user/.emacs.d/elpa/org-9.5.2/org-entities hides /usr/share/emacs/27.2/lisp/org/org-entities /home/user/.emacs.d/elpa/org-9.5.2/org-timer hides /usr/share/emacs/27.2/lisp/org/org-timer /home/user/.emacs.d/elpa/org-9.5.2/ob-processing hides /usr/share/emacs/27.2/lisp/org/ob-processing /home/user/.emacs.d/elpa/org-9.5.2/ol-eww hides /usr/share/emacs/27.2/lisp/org/ol-eww /home/user/.emacs.d/elpa/org-9.5.2/ob-emacs-lisp hides /usr/share/emacs/27.2/lisp/org/ob-emacs-lisp /home/user/.emacs.d/elpa/org-9.5.2/ob-lua hides /usr/share/emacs/27.2/lisp/org/ob-lua /home/user/.emacs.d/elpa/org-contrib-0.3/ob-asymptote hides /usr/share/emacs/27.2/lisp/org/ob-asymptote /home/user/.emacs.d/elpa/org-9.5.2/ob-comint hides /usr/share/emacs/27.2/lisp/org/ob-comint /home/user/.emacs.d/elpa/org-9.5.2/org-footnote hides /usr/share/emacs/27.2/lisp/org/org-footnote /home/user/.emacs.d/elpa/org-contrib-0.3/ob-stan hides /usr/share/emacs/27.2/lisp/org/ob-stan /home/user/.emacs.d/elpa/org-9.5.2/ob-ditaa hides /usr/share/emacs/27.2/lisp/org/ob-ditaa /home/user/.emacs.d/elpa/org-9.5.2/ob-sqlite hides /usr/share/emacs/27.2/lisp/org/ob-sqlite /home/user/.emacs.d/elpa/org-9.5.2/org-lint hides /usr/share/emacs/27.2/lisp/org/org-lint /home/user/.emacs.d/elpa/org-9.5.2/org-mouse hides /usr/share/emacs/27.2/lisp/org/org-mouse /home/user/.emacs.d/elpa/org-9.5.2/ob-plantuml hides /usr/share/emacs/27.2/lisp/org/ob-plantuml /home/user/.emacs.d/elpa/org-9.5.2/ox-org hides /usr/share/emacs/27.2/lisp/org/ox-org /home/user/.emacs.d/elpa/org-9.5.2/org-duration hides /usr/share/emacs/27.2/lisp/org/org-duration /home/user/.emacs.d/elpa/org-9.5.2/ob-eval hides /usr/share/emacs/27.2/lisp/org/ob-eval /home/user/.emacs.d/elpa/org-9.5.2/ob-lisp hides /usr/share/emacs/27.2/lisp/org/ob-lisp /home/user/.emacs.d/elpa/org-contrib-0.3/ob-ledger hides /usr/share/emacs/27.2/lisp/org/ob-ledger /home/user/.emacs.d/elpa/org-9.5.2/ob-ocaml hides /usr/share/emacs/27.2/lisp/org/ob-ocaml /home/user/.emacs.d/elpa/org-9.5.2/ol-mhe hides /usr/share/emacs/27.2/lisp/org/ol-mhe /home/user/.emacs.d/elpa/org-9.5.2/org-clock hides /usr/share/emacs/27.2/lisp/org/org-clock /home/user/.emacs.d/elpa/org-9.5.2/ob-shell hides /usr/share/emacs/27.2/lisp/org/ob-shell /home/user/.emacs.d/elpa/org-9.5.2/org-attach hides /usr/share/emacs/27.2/lisp/org/org-attach /home/user/.emacs.d/elpa/org-contrib-0.3/ob-picolisp hides /usr/share/emacs/27.2/lisp/org/ob-picolisp /home/user/.emacs.d/elpa/org-9.5.2/ob-js hides /usr/share/emacs/27.2/lisp/org/ob-js /home/user/.emacs.d/elpa/org-contrib-0.3/ob-J hides /usr/share/emacs/27.2/lisp/org/ob-J /home/user/.emacs.d/elpa/org-contrib-0.3/ob-coq hides /usr/share/emacs/27.2/lisp/org/ob-coq /home/user/.emacs.d/elpa/org-9.5.2/ox-ascii hides /usr/share/emacs/27.2/lisp/org/ox-ascii /home/user/.emacs.d/elpa/org-9.5.2/ob-forth hides /usr/share/emacs/27.2/lisp/org/ob-forth /home/user/.emacs.d/elpa/org-9.5.2/ol-irc hides /usr/share/emacs/27.2/lisp/org/ol-irc /home/user/.emacs.d/elpa/org-9.5.2/org-id hides /usr/share/emacs/27.2/lisp/org/org-id /home/user/.emacs.d/elpa/org-9.5.2/ol-bibtex hides /usr/share/emacs/27.2/lisp/org/ol-bibtex /home/user/.emacs.d/elpa/org-9.5.2/ob-ruby hides /usr/share/emacs/27.2/lisp/org/ob-ruby /home/user/.emacs.d/elpa/org-9.5.2/org-archive hides /usr/share/emacs/27.2/lisp/org/org-archive /home/user/.emacs.d/elpa/org-9.5.2/ob-haskell hides /usr/share/emacs/27.2/lisp/org/ob-haskell /home/user/.emacs.d/elpa/org-contrib-0.3/ob-abc hides /usr/share/emacs/27.2/lisp/org/ob-abc /home/user/.emacs.d/elpa/org-9.5.2/org-pcomplete hides /usr/share/emacs/27.2/lisp/org/org-pcomplete /home/user/.emacs.d/elpa/org-9.5.2/org-macs hides /usr/share/emacs/27.2/lisp/org/org-macs /home/user/.emacs.d/elpa/org-9.5.2/org-capture hides /usr/share/emacs/27.2/lisp/org/org-capture /home/user/.emacs.d/elpa/org-9.5.2/ob-eshell hides /usr/share/emacs/27.2/lisp/org/ob-eshell /home/user/.emacs.d/elpa/org-9.5.2/org-mobile hides /usr/share/emacs/27.2/lisp/org/org-mobile /home/user/.emacs.d/elpa/org-9.5.2/ox-beamer hides /usr/share/emacs/27.2/lisp/org/ox-beamer /home/user/.emacs.d/elpa/org-9.5.2/org-loaddefs hides /usr/share/emacs/27.2/lisp/org/org-loaddefs /home/user/.emacs.d/elpa/org-9.5.2/org-list hides /usr/share/emacs/27.2/lisp/org/org-list /home/user/.emacs.d/elpa/org-9.5.2/ox-man hides /usr/share/emacs/27.2/lisp/org/ox-man /home/user/.emacs.d/elpa/org-9.5.2/org-crypt hides /usr/share/emacs/27.2/lisp/org/org-crypt /home/user/.emacs.d/elpa/org-9.5.2/ob-org hides /usr/share/emacs/27.2/lisp/org/ob-org /home/user/.emacs.d/elpa/org-9.5.2/ol-info hides /usr/share/emacs/27.2/lisp/org/ol-info /home/user/.emacs.d/elpa/org-9.5.2/ob-dot hides /usr/share/emacs/27.2/lisp/org/ob-dot /home/user/.emacs.d/elpa/org-9.5.2/ob-gnuplot hides /usr/share/emacs/27.2/lisp/org/ob-gnuplot /home/user/.emacs.d/elpa/org-9.5.2/org-refile hides /usr/share/emacs/27.2/lisp/org/org-refile /home/user/.emacs.d/elpa/org-9.5.2/ol-rmail hides /usr/share/emacs/27.2/lisp/org/ol-rmail /home/user/.emacs.d/elpa/org-9.5.2/ol-docview hides /usr/share/emacs/27.2/lisp/org/ol-docview /home/user/.emacs.d/elpa/org-9.5.2/org-ctags hides /usr/share/emacs/27.2/lisp/org/org-ctags /home/user/.emacs.d/elpa/org-9.5.2/ob-lilypond hides /usr/share/emacs/27.2/lisp/org/ob-lilypond /home/user/.emacs.d/elpa/org-9.5.2/org-faces hides /usr/share/emacs/27.2/lisp/org/org-faces /home/user/.emacs.d/elpa/org-9.5.2/org-compat hides /usr/share/emacs/27.2/lisp/org/org-compat /home/user/.emacs.d/elpa/org-contrib-0.3/ob-hledger hides /usr/share/emacs/27.2/lisp/org/ob-hledger /home/user/.emacs.d/elpa/org-9.5.2/ox-md hides /usr/share/emacs/27.2/lisp/org/ox-md /home/user/.emacs.d/elpa/org-9.5.2/org-feed hides /usr/share/emacs/27.2/lisp/org/org-feed /home/user/.emacs.d/elpa/org-9.5.2/ob-C hides /usr/share/emacs/27.2/lisp/org/ob-C /home/user/.emacs.d/elpa/org-9.5.2/org-src hides /usr/share/emacs/27.2/lisp/org/org-src /home/user/.emacs.d/elpa/org-9.5.2/org-version hides /usr/share/emacs/27.2/lisp/org/org-version /home/user/.emacs.d/elpa/org-9.5.2/org-indent hides /usr/share/emacs/27.2/lisp/org/org-indent /home/user/.emacs.d/elpa/org-9.5.2/ox-odt hides /usr/share/emacs/27.2/lisp/org/ox-odt /home/user/.emacs.d/elpa/org-9.5.2/org-goto hides /usr/share/emacs/27.2/lisp/org/org-goto Study the output of `M-x list-load-path-shadows`. ## `ox-hugo` defcustoms
org-hugo-section "posts"
org-hugo-use-code-for-kbd nil
org-hugo-preserve-filling t
org-hugo-delete-trailing-ws t
org-hugo-prefer-hyphen-in-tags t
org-hugo-allow-spaces-in-tags t
org-hugo-tag-processing-functions (org-hugo–tag-processing-fn-replace-with-spaces-maybe org-hugo–tag-processing-fn-replace-with-hyphens-maybe)
org-hugo-auto-set-lastmod nil
org-hugo-export-with-toc nil
org-hugo-export-with-section-numbers nil
org-hugo-front-matter-format "toml"
org-hugo-default-static-subdirectory-for-externals "ox-hugo"
org-hugo-external-file-extensions-allowed-for-copying ("jpg" "jpeg" "tiff" "png" "svg" "gif" "mp4" "pdf" "odt" "doc" "ppt" "xls" "docx" "pptx" "xlsx")
org-hugo-date-format "%Y-%m-%dT%T%z"
org-hugo-paired-shortcodes ""
org-hugo-suppress-lastmod-period 0.0
org-hugo-front-matter-format "toml"
kaushalmodi commented 2 years ago

Inline SVG should strip empty lines or otherwise prevent arbitrary p tag insertion.

Sure, that should be relatively easy to do. Note that this is going kind of out of the scope of ox-hugo though. If an external SVG is being inlined, the user should ensure that it's compatible to inline in a Markdown file. It's out of scope of ox-hugo because the org exporter is not generating the SVG.

Inline SVG should not have lines wrapped around arbitrarily. (preserve-filling is t)

Can you post the full SVG file over a gist or something? I'd like to see how the rendering changes between the wrapped and unwrapped cases. Except for the content in HTMLpre blocks, I am not sure of the wrapping matters in HTML and SVG. But I'd like to learn what I missed.

Thanks!

kaushalmodi commented 2 years ago

@simonthum I'll need an example SVG that I can use to reproduce this issue so that I can test and fix it.

kaushalmodi commented 1 year ago

Closing this issue as there was no response.

simonthum commented 1 year ago

Hi, sorry I missed your feedback!

I think it can be any SVG with a blank line and/or long lines in it. However, you may download from excalidraw:

https://excalidraw.com/#json=9fsXhwPq32hndZnYkIao4,6STG_FQmm2wXklexgT3PVQ

Click "Save as image" on the upper left, then select "SVG".

I hope this helps reproduce.

simonthum commented 1 year ago

If an external SVG is being inlined, the user should ensure that it's compatible to inline in a Markdown file. It's out of scope of ox-hugo because the org exporter is not generating the SVG.

That seems fine, could you link me to what exactly is required for SVG to be compatible to inline in MD?

Mind that the wrapped viewbox string in the example is from the inlining process, not the SVG.

kaushalmodi commented 1 year ago

Thanks for your replies. I'll see if I can reproduce the issue. If so, the fix should be easier.