Incorpora immagine come Base64 nell'esportazione HTML da Orgmode


8

L'obiettivo è creare un file html autonomo quando si esporta da orgmode in modo che le immagini siano intrinseche al file e che sia possibile distribuire un singolo file html (sto cercando di farlo per una classe che insegno e voglio dare agli studenti un singolo HTML che possono aprire in un browser).

Ho trovato uno snippet di codice online che dà l'idea di ciò che voglio:

#+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

E sto provando a metterlo in elisp e quindi rimuovere la dipendenza da python e come passo per creare la mia funzione elisp che potrebbe avere qualche dettaglio in più.

Ecco cosa ho avuto. Consiglio apprezzato.

#+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

e dove tob64è

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

Ciò non fornisce la formattazione e le quotazioni corrette.

L'obiettivo su cui lavorare è una variante di org-html-export-to-htmldove la funzione elisp potrebbe vivere e essere invocata quando è #+OPTIONS: embed-images-on-html-export:tstata invocata un'opzione simile .

E a parte questo, perché la funzionalità di esportazione in HTML con immagini incorporate non esiste già in modalità organizzazione? C'è qualche problema più grande che rende questo problematico a cui sto lavorando?

Risposte:


3

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

Puoi anche trovare questo: https://github.com/KitchinHUB/kitchingroup-66/blob/master/manuscript.org#the-custom-export-code-labelexport-code un modo interessante per codificare i dati base64 in html.

Il tuo codice funziona per me:

#+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

genera un'immagine codificata in base64 che posso vedere nell'esportazione.

Per farlo funzionare automaticamente nell'esportazione, probabilmente si desidera utilizzare una funzione in org-export-before-processing-hook che passerà attraverso e sostituirà i collegamenti dei file con un blocco html contenente l'output di una funzione come quella sopra.


Grazie per aver dedicato del tempo. Il problema per me era che continuavo a provare printo insert. Ora continuerò a leggere format. Difficile sapere cosa cercare quando non si conoscono i nomi delle cose. Esplorerai i tuoi consigli sull'uso del gancio. Non sembra qualcosa che vale la pena avere però?
brittAnderson

Sarebbe un buon modo per creare un file html autonomo che potrebbe essere inviato via email o semplicemente trasferito.
John Kitchin,

2

Dal thread reddit 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))))

1

In alternativa, è possibile utilizzare il pacchetto ox-pandoc . Pandoc stesso ha un'opzione da riga di comando chiamata - stessi-contenuta che incorporerà le immagini in HTML.

Per utilizzarlo solo per l'esportatore HTML5 pandoc, inserendolo nel tuo .emacs:

(setq org-pandoc-options-for-html5 '((standalone . t) (self-contained . t)))

Inoltre, potresti averlo per html4 invece / pure:

(setq org-pandoc-options-for-html5 '((standalone . t) (self-contained . t)))

O da usare autonomamente per tutti i pandoc:

(setq org-pandoc-options '((standalone . t) (self-contained . t)))

Si noti che la (standalone . t)parte è facoltativa, includo solo perché questo replica quindi le impostazioni predefinite di PandC. Se lo desideri, puoi rimuoverlo o sostituirlo con il tuo set di opzioni.

Infine, puoi fare la stessa cosa per un singolo file usando l'intestazione:

#+PANDOC_OPTIONS: self-contained:t

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.