Establece el fondo de los bloques <code> exportados por org según el tema

24

Exporte archivos de modo org con bastante frecuencia, y casi todos tienen código. Cuando exporto código, termina coloreando el texto dependiendo de mi tema, sin embargo, cambio regularmente entre un tema oscuro y uno claro. En el caso del tema claro, los <code>bloques deben tener un fondo claro, y para un tema oscuro deben tener un fondo oscuro (de lo contrario, termino con un texto amarillo claro sobre un fondo grisáceo y es ilegible).

Tengo que agregar esta línea para fondos oscuros:

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

Y luego recuerde eliminarlo cada vez que cambie a un fondo de color claro

¿Hay alguna forma en que pueda detectar automáticamente el color de fondo del tema actual en el momento de la exportación y usarlo en el CSS del HTML exportado?

EDITAR

Voy con la respuesta de Jordon (¡gracias Jordon, obtienes los puntos de karma!), Sin embargo, quería publicar la solución que terminé agregando a mi código, ya que era una versión ligeramente modificada de su respuesta:

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

Esto establece no solo el color de fondo, sino también el color de primer plano. También agrega la línea a la org-html-head-extraconfiguración existente para que otro HTML no se sobrescriba accidentalmente. ¡Lo he probado y esto funciona muy bien para mí!

Lee H
fuente
1
Estoy seguro de que hay una manera, pero ¿no sería mejor aplicar siempre el mismo tema al exportar? ¿O exportas intencionalmente con diferentes temas?
Malabarba
@Malabarba la intención es poder exportar el tema que esté usando actualmente y que el código sea legible. Dado que muchos temas no cambian limpiamente (incluso con disable-theme), no quiero tener que reiniciar Emacs con un tema separado solo para exportar HTML, lo que hago muchas veces al día.
Lee H
1
Si entiendo correctamente, su configuración actual ya usa los colores del tema en los bloques de código, y el problema que tiene es que no se usa el fondo del tema. Si me equivoqué, no dude en revertir la edición que hice a su título.
Malabarba
@Malabarba mi configuración actual no especifica el color de fondo de los bloques de código (aunque puedo codificar un color de fondo en el CSS si eso ayudaría). Me gustaría utilizar el color de fondo del tema para los bloques de código del modo org. El nuevo título funciona para mí.
Lee H
Hay dos problemas con la solución anterior. Primero, los colores como 'gray80' no se traducirán correctamente a valores CSS y no se establecerán. En segundo lugar, cada vez que se ejecuta la exportación, org-html-head-extrase agrega, lo que lleva a un crecimiento ilimitado, aunque la funcionalidad del estilo no se verá afectada.
RP Dillon

Respuestas:

10

Primero, creo que org puede usar htmlizepara colorear automáticamente sus bloques de código fuente de acuerdo con su tema.

Alternativamente.

Echa un vistazo a http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . Tiene un gran ejemplo de cómo usar org-export-before-processing-hookpara lanzar CSS personalizado en un documento de organización antes de una exportación html.

Aquí está el código en caso de que el sitio se caiga:

Aquí, en una exportación html, org buscará un archivo llamado styles.css en el directorio actual o un archivo predeterminado en el directorio .emacs.d e inyectará ese css en el documento. Esto es agradable pero no perfecto para su caso de uso.

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

Puede personalizar esto de varias maneras para que funcione como desee.

Una forma sería construir manualmente el CSS basado en su tema e insertarlo.

Aquí hay una versión modificada que establece el fondo del pre.srcvalor hexadecimal de las caras predeterminadas: propiedad de fondo.

(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
fuente
1
Gracias Jordon, esto es genial! He actualizado mi pregunta original con mi versión ligeramente editada, ¡pero obtienes la recompensa y la solución!
Lee H