Setel latar belakang blok <code> yang diekspor org menurut tema

24

Saya cukup sering mengekspor file mode-org, dan hampir semuanya memiliki kode di dalamnya. Ketika saya melakukan kode ekspor, akhirnya mewarnai teks tergantung pada tema saya, namun, saya beralih antara tema gelap dan tema terang secara teratur. Dalam hal tema terang, <code>blok harus memiliki latar belakang terang, dan untuk tema gelap mereka harus memiliki latar belakang gelap (jika tidak saya berakhir dengan teks kuning muda pada latar belakang keabu-abuan dan tidak dapat dibaca).

Saya harus menambahkan baris ini untuk latar belakang gelap:

#+HTML_HEAD: <style>pre.src {background-color: #303030; color: #e5e5e5;}</style>

Dan kemudian ingat untuk menghapusnya setiap kali saya beralih ke latar belakang berwarna terang

Apakah ada cara saya dapat secara otomatis mendeteksi warna latar belakang tema saat ini pada waktu ekspor dan menggunakannya dalam CSS HTML yang diekspor?

EDIT

Saya setuju dengan jawaban Jordon (terima kasih Jordon, Anda mendapatkan poin karma!), Namun saya ingin memposting solusi yang akhirnya saya tambahkan ke kode saya, karena itu adalah versi modifikasi dari jawabannya:

(defun my/org-inline-css-hook (exporter)
  "Insert custom inline css to automatically set the
background of code to whatever theme I'm using's background"
  (when (eq exporter 'html)
    (let* ((my-pre-bg (face-background 'default))
           (my-pre-fg (face-foreground 'default)))
      (setq
       org-html-head-extra
       (concat
        org-html-head-extra
        (format "<style type=\"text/css\">\n pre.src {background-color: %s; color: %s;}</style>\n"
                my-pre-bg my-pre-fg))))))

(add-hook 'org-export-before-processing-hook 'my/org-inline-css-hook)

Ini tidak hanya mengatur warna latar belakang, tetapi juga warna latar depan. Itu juga menambahkan baris ke org-html-head-extrapengaturan yang ada sehingga HTML lain tidak ditimpa secara tidak sengaja. Saya sudah menguji dan ini bekerja bagus untuk saya!

Lee H
sumber
1
Saya yakin ada caranya, tetapi bukankah lebih baik untuk selalu menerapkan tema yang sama saat mengekspor? Atau apakah Anda sengaja mengekspor dengan tema yang berbeda?
Malabarba
@Malabarba tujuannya adalah untuk dapat mengekspor tema mana pun yang saya gunakan saat ini dan membuat kode dapat dibaca. Karena banyak tema tidak beralih dengan rapi (bahkan dengan disable-theme), saya tidak ingin harus me-restart Emacs dengan tema terpisah hanya untuk mengekspor HTML, yang saya lakukan berkali-kali sehari.
Lee H
1
Jika saya mengerti dengan benar, pengaturan Anda saat ini sudah menggunakan warna tema pada blok kode, dan masalah yang Anda hadapi adalah latar belakang tema tersebut tidak digunakan. Jika saya salah, silakan kembalikan suntingan yang saya buat ke judul Anda.
Malabarba
@ Malabarba setup saya saat ini tidak menentukan warna latar belakang dari blok kode (meskipun saya bisa hard-kode warna latar belakang di css jika itu akan membantu). Saya ingin warna latar belakang tema yang akan digunakan untuk blok kode mode-org. Judul baru berfungsi untuk saya.
Lee H
Ada dua masalah dengan solusi di atas. Pertama, warna seperti 'grey80' tidak akan diterjemahkan dengan benar ke nilai CSS, dan tidak akan ditetapkan. Kedua, setiap kali ekspor berjalan, org-html-head-extraakan ditambahkan ke, menyebabkan pertumbuhan tanpa batas, meskipun fungsi gaya tidak akan terganggu.
RP Dillon

Jawaban:

10

Pertama, saya percaya org dapat digunakan htmlizeuntuk secara otomatis mewarnai blok kode sumber Anda sesuai dengan tema Anda.

Kalau tidak.

Lihat http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . Ini memiliki contoh yang bagus tentang bagaimana menggunakan org-export-before-processing-hookuntuk melemparkan css kustom ke dokumen org sebelum ekspor html.

Berikut kode jika situs turun:

Di sini, pada ekspor html, org akan mencari file bernama styles.css di direktori saat ini atau file default di direktori .emacs.d dan menyuntikkan css ke dalam dokumen. Ini bagus tetapi tidak sempurna untuk kasus penggunaan Anda.

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let* ((dir (ignore-errors (file-name-directory (buffer-file-name))))
           (path (concat dir "style.css"))
           (homestyle (or (null dir) (null (file-exists-p path))))
           (final (if homestyle "~/.emacs.d/org-style.css" path)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head (concat
                           "<style type=\"text/css\">\n"
                           "<!--/*--><![CDATA[/*><!--*/\n"
                           (with-temp-buffer
                             (insert-file-contents final)
                             (buffer-string))
                           "/*]]>*/-->\n"
                           "</style>\n")))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)

Anda dapat menyesuaikan ini dengan beberapa cara untuk membuatnya berfungsi seperti yang Anda inginkan.

Salah satu caranya adalah dengan membangun css secara manual berdasarkan tema Anda dan menyisipkannya.

Berikut adalah versi yang dimodifikasi yang mengatur latar belakang pre.srcke nilai hex dari wajah default: properti background.

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let ((my-pre-bg (face-background 'default)))
      (setq org-html-head-include-default-style nil)
      (setq org-html-head
            (format "<style type=\"text/css\">\n pre.src { background-color: %s;}</style>\n" my-pre-bg)))))

(add-hook 'org-export-before-processing-hook 'my-org-inline-css-hook)
Jordon Biondo
sumber
1
Terima kasih Jordon, ini luar biasa! Saya telah memperbarui pertanyaan awal saya dengan versi saya yang sedikit diedit, tetapi Anda mendapatkan karunia dan solusinya!
Lee H