Встановіть фон експортованих <code> блоків відповідно до теми


24

Я експортую файли org-mode досить часто, і майже всі вони мають код у них. Коли я роблю експортний код, він закінчується фарбуванням тексту залежно від моєї теми, однак я регулярно перемикаюся між темною та світлою темою. Що стосується світлої теми, у <code>блоків має бути світлий фон, а для темної теми - темний фон (інакше я закінчую світло-жовтим текстом на сіруватим тлі, і це не читається).

Мені потрібно додати цей рядок для темних фонів:

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

І тоді не забудьте видалити його будь-коли, коли я перейду на світлий колір фону

Чи є спосіб я автоматично визначити колір тла поточної теми під час експорту та використовувати його в експортованому HTML-коді HTML?

EDIT

Я збираюся відповісти Джордону (дякую Джордону, ви отримуєте бали карми!), Однак я хотів опублікувати рішення, яке я в кінцевому підсумку додав до свого коду, оскільки це була трохи змінена версія його відповіді:

(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)

Це встановлює не тільки колір тла, але і колір переднього плану. Він також додає рядок до існуючих org-html-head-extraналаштувань, щоб інший HTML не був перезаписаний випадково. Я тестував, і це чудово працює для мене!


1
Я впевнений, що є спосіб, але хіба не було б краще замість цього завжди застосовувати одну й ту ж тему при експорті? Або ви навмисно експортуєте різні теми?
Малабарба

@Malabarba має на меті можливість експортувати, яку саме тему я використовую, і код має бути читабельним. Оскільки багато тем не чітко перемикаються (навіть з disable-theme), я не хочу перезапускати Emacs окремою темою лише для експорту HTML, що я роблю багато разів на день.
Лі Х

1
Якщо я правильно розумію, ваша поточна установка вже використовує кольори теми на кодових блоках, і проблема, яка виникає, полягає в тому, що фон теми не використовується. Якщо я помилився, будь ласка, відкажіть редагування, яке я внесла до вашого заголовку.
Малабарба

@Malabarba моє поточне налаштування не визначає колір фону кодових блоків (хоча я можу жорстко кодувати фоновий колір у css, якщо це допоможе). Я хотів би, щоб колір фону теми використовувався для кодових блоків в режимі org. Нова назва працює для мене.
Лі Х

З вищезазначеним рішенням є дві проблеми. По-перше, кольори, такі як 'grey80', не будуть правильно переведені у значення CSS, і не будуть встановлені. По-друге, щоразу, коли експорт запускається, org-html-head-extraдодається додавання, що призводить до необмеженого зростання, хоча функціональність стилю не буде порушена.
RP Dillon

Відповіді:


10

По-перше, я вважаю, що org може використовувати htmlizeдля автоматичного забарвлення блоків вихідного коду відповідно до вашої теми.

Як варіант.

Перевірте http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . У ньому є чудовий приклад того, як використовувати org-export-before-processing-hookдля кидання спеціального css на документ org перед експортом html.

Ось код на випадок, коли сайт працює:

Тут, під час експорту html, org шукає файл, який називається styles.css у поточному каталозі, або файл за замовчуванням у каталозі .emacs.d та вводить цей css у документ. Це приємно, але не ідеально для вашого випадку використання.

(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)

Ви можете налаштувати це декількома способами, щоб змусити його працювати як завгодно.

Одним із способів було б скласти css вручну на основі своєї теми та вставити це.

Ось модифікована версія, яка встановлює тло pre.srcшестнадцяткового значення облич за замовчуванням: властивість 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)

1
Дякую Джордону, це чудово! Я оновив своє первісне запитання зі своєю трохи відредагованою версією, але ви отримаєте щедрості та рішення!
Лі Х
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.