Cantumkan Gambar sebagai Base64 pada ekspor HTML dari Orgmode

8

Tujuannya adalah untuk membuat file html mandiri ketika mengekspor dari orgmode sehingga gambar intrinsik ke file dan satu file html akan dapat didistribusikan (saya mencoba melakukan ini untuk kelas yang saya ajarkan dan ingin memberi siswa satu html yang bisa dibuka di browser).

Saya menemukan potongan kode on line yang memberikan ide tentang apa yang saya inginkan:

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

Dan saya mencoba untuk membuatnya menjadi elisp dan dengan demikian menghapus ketergantungan pada python dan sebagai langkah untuk membuat fungsi elisp saya sendiri yang dapat memiliki lebih banyak detail.

Inilah yang saya dapatkan. Nasihat dihargai.

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

dan di mana tob64adalah

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

Ini tidak memberikan pemformatan dan penawaran yang benar.

Tujuan yang akan dikerjakan adalah beberapa varian di org-html-export-to-htmlmana fungsi elisp bisa hidup dan dipanggil ketika opsi seperti #+OPTIONS: embed-images-on-html-export:tdipanggil.

Dan sebagai tambahan, mengapa fungsi mengekspor ke html dengan gambar yang disematkan sudah ada dalam mode-org? Apakah ada masalah yang lebih besar yang membuat ini bermasalah untuk saya upayakan?

brittAnderson
sumber

Jawaban:

3

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

Anda juga dapat menemukan ini: https://github.com/KitchinHUB/kitchingroup-66/blob/master/manuscript.org#the-custom-export-code-labelexport-code cara menarik untuk menyandikan data base64 dalam html.

Kode Anda berfungsi untuk saya:

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

menghasilkan gambar yang disandikan base64 yang bisa saya lihat di ekspor.

Agar ini berfungsi secara otomatis dalam ekspor, Anda mungkin ingin menggunakan fungsi dalam org-ekspor-sebelum-pemrosesan-kait yang akan melewati dan mengganti tautan file Anda dengan blok html yang berisi output dari fungsi seperti yang di atas.

John Kitchin
sumber
Terima kasih telah meluangkan waktu. Masalahnya bagi saya adalah saya terus berusaha printatau insert. Sekarang akan membaca format. Sulit untuk mengetahui apa yang harus dicari ketika Anda tidak tahu nama-nama benda. Akan mengeksplorasi saran Anda tentang cara menggunakan kail. Bukankah ini terdengar seperti sesuatu yang berharga?
brittAnderson
Ini akan menjadi cara yang bagus untuk membuat file html mandiri yang dapat diemailkan atau ditransfer.
John Kitchin
2

Dari utas 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
sumber
1

Sebagai alternatif, Anda dapat menggunakan paket ox-pandoc . Pandoc sendiri memiliki opsi baris perintah bernama --self-contained yang akan menyematkan gambar dalam html.

Untuk Anda menggunakan ini hanya untuk pandoc HTML5 eksportir, dengan meletakkan ini di .emacs Anda:

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

Selain itu, Anda juga bisa memilikinya untuk html4 / juga:

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

Atau menggunakan --self-contained untuk semua pandoc:

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

Perhatikan bahwa (standalone . t)bagian ini opsional, saya sertakan hanya karena ini kemudian mereplikasi default yang dimiliki pandoc. Anda bisa menghapusnya jika mau, atau menggantinya dengan set opsi Anda sendiri.

Akhirnya, Anda dapat melakukan hal yang sama untuk satu file dengan menggunakan header:

#+PANDOC_OPTIONS: self-contained:t

Menandai
sumber