Bild als Base64 beim HTML-Export aus Orgmode einbetten

8

Das Ziel ist es, beim Exportieren aus dem orgmode eine in sich geschlossene HTML-Datei zu erstellen, damit die Bilder in der Datei enthalten sind und eine einzelne HTML-Datei verteilt werden kann (ich versuche dies für eine Klasse zu tun, die ich unterrichte und die ich Schülern geben möchte ein einzelnes HTML, das sie in einem Browser öffnen können).

Ich habe online einen Codeausschnitt gefunden, der die Idee gibt, was ich will:

#+BEGIN_SRC python :results output html :exports results
with open('/home/britt/Pictures/Britt0001.jpg', 'rb') as image:
    data = image.read()
    print '<img src="data:image/jpg;base64,%s">' % data.encode("base64")
#+END_SRC

Und ich versuche, es in elisp zu bringen und damit die Abhängigkeit von Python zu beseitigen und als Schritt zur Schaffung meiner eigenen elisp-Funktion, die etwas detaillierter sein könnte.

Hier ist, was ich bekommen habe. Beratung geschätzt.

#+BEGIN_src elisp :results output html :exports results
    (setq myim (concat "<img src=\\"data:image/jpg;base64," (tob64 "/home/britt/Pictures/Britt0001.jpg") ">"))
     (print myim)
#+END_SRC

und wo tob64ist

(defun tob64 (filename)
  (base64-encode-string
   (with-temp-buffer
     (insert-file-contents filename)
     (buffer-string))))

Dies ergibt nicht die richtige Formatierung und Anführungszeichen.

Das Ziel, auf org-html-export-to-htmldas hingearbeitet werden soll, ist eine Variante, in der die elisp-Funktion leben und aufgerufen werden kann, wenn eine Option wie #+OPTIONS: embed-images-on-html-export:taufgerufen wurde.

Und abgesehen davon, warum gibt es die Funktionalität des Exports nach HTML mit eingebetteten Bildern nicht bereits im Organisationsmodus? Gibt es ein größeres Problem, das es für mich problematisch macht, darauf hinzuarbeiten?

brittAnderson
quelle

Antworten:

3

Siehe http://kitchingroup.cheme.cmu.edu/blog/2015/05/09/Another-approach-to-embedding-org-source-in-html/ .

Möglicherweise finden Sie auch Folgendes: https://github.com/KitchinHUB/kitchingroup-66/blob/master/manuscript.org#the-custom-export-code-labelexport-code ist eine interessante Möglichkeit, base64-Daten in HTML zu codieren.

Ihr Code funktioniert für mich:

#+BEGIN_SRC emacs-lisp :results html :exports both
(defun tob64 (filename)
  (base64-encode-string
   (with-temp-buffer
     (insert-file-contents filename)
     (buffer-string))))

(format "<img src=\"data:image/png;base64,%s\">"
    (tob64 "/Users/jkitchin/t.png"))
#+END_SRC

gibt ein Base64-codiertes Bild aus, das ich beim Export sehen kann.

Damit dies beim Export automatisch funktioniert, möchten Sie wahrscheinlich eine Funktion in org-export-before-Processing-Hook verwenden, die Ihre Dateilinks durch einen HTML-Block ersetzt, der die Ausgabe einer Funktion wie der oben genannten enthält.

John Kitchin
quelle
Vielen Dank, dass Sie sich die Zeit genommen haben. Das Problem für mich war, dass ich es immer wieder versuchte printoder insert. Werde jetzt weiterlesen format. Schwer zu wissen, wonach Sie suchen müssen, wenn Sie die Namen der Dinge nicht kennen. Erfahren Sie mehr über die Verwendung des Hakens. Klingt das nicht nach etwas Wertvollem?
BrittAnderson
Es wäre eine gute Möglichkeit, eine eigenständige HTML-Datei zu erstellen, die per E-Mail gesendet oder einfach übertragen werden kann.
John Kitchin
2

Aus dem reddit-Thread https://www.reddit.com/r/orgmode/comments/7dyywu/creating_a_selfcontained_html/

(defun replace-in-string (what with in)
  (replace-regexp-in-string (regexp-quote what) with in nil 'literal))

(defun org-html--format-image (source attributes info)
  (progn
    (setq source (replace-in-string "%20" " " source))
    (format "<img src=\"data:image/%s;base64,%s\"%s />"
            (or (file-name-extension source) "")
            (base64-encode-string
             (with-temp-buffer
               (insert-file-contents-literally source)
              (buffer-string)))
            (file-name-nondirectory source))))
Sainath Adapa
quelle