Incorporar imagem como Base64 na exportação de HTML do Orgmode

8

O objetivo é criar um arquivo html independente ao exportar do modo de modo a que as imagens sejam intrínsecas ao arquivo e um único arquivo html possa ser distribuído (estou tentando fazer isso em uma aula que ensino e desejo dar aos alunos um único html que eles podem abrir em um navegador).

Encontrei um trecho de código on-line que dá a idéia do que eu quero:

#+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 estou tentando colocá-lo no elisp e, assim, remover a dependência do python e como um passo para criar minha própria função elisp que poderia ter mais detalhes.

Aqui está o que eu consegui. Conselho apreciado.

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

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

Isso não fornece a formatação e a citação corretas.

O objetivo a ser trabalhado é uma variante de org-html-export-to-htmlonde a função elisp poderia viver e ser invocada quando uma opção como #+OPTIONS: embed-images-on-html-export:tfoi invocada.

E, à parte, por que a funcionalidade de exportar para html com imagens incorporadas já não existe no modo organizacional? Existe algum problema maior que torna isso problemático para mim estar trabalhando?

brittAnderson
fonte

Respostas:

3

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

Você também pode encontrar o seguinte: https://github.com/KitchinHUB/kitchingroup-66/blob/master/manuscript.org#the-custom-export-code-labelexport-code uma maneira interessante de codificar dados base64 em html.

Seu código funciona para mim:

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

gera uma imagem codificada em base64 que posso ver na exportação.

Para que isso funcione automaticamente na exportação, é provável que você queira usar uma função no org-export-before-processing-hook que substituirá os links do arquivo por um bloco html que contenha a saída de uma função como a acima.

John Kitchin
fonte
Obrigado por reservar um tempo. O problema para mim era que eu continuava tentando printou insert. Agora vai ler format. Difícil saber o que procurar quando você não sabe o nome das coisas. Irá explorar seus conselhos sobre o uso do gancho. Isso não soa como algo que vale a pena ter?
BrittAnderson # 14/16
Seria uma boa maneira de criar um arquivo html independente que pudesse ser enviado por email ou simplesmente transferido.
John Kitchin
2

No thread do 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))))
Sainath Adapa
fonte