Définissez l'arrière-plan des blocs <code> exportés par l'organisation en fonction du thème


24

J'exporte assez souvent des fichiers en mode org, et presque tous contiennent du code. Lorsque j'exporte du code, cela finit par colorer le texte en fonction de mon thème, cependant, je bascule régulièrement entre un thème sombre et un thème clair. Dans le cas du thème clair, les <code>blocs doivent avoir un fond clair et pour un thème sombre, ils doivent avoir un fond sombre (sinon je me retrouve avec du texte jaune clair sur fond grisâtre et c'est illisible).

Je dois ajouter cette ligne pour les fonds sombres:

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

Et n'oubliez pas de le retirer chaque fois que je passe à un arrière-plan de couleur claire

Existe-t-il un moyen de détecter automatiquement la couleur d'arrière-plan du thème actuel au moment de l'exportation et de l'utiliser dans le CSS HTML exporté?

MODIFIER

Je vais avec la réponse de Jordon (merci Jordon, vous obtenez les points de karma!), Mais je voulais poster la solution que j'ai fini par ajouter à mon code, car c'était une version légèrement modifiée de sa réponse:

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

Cela définit non seulement la couleur d'arrière-plan, mais également la couleur de premier plan. Il ajoute également la ligne au org-html-head-extraparamètre existant afin que tout autre code HTML ne soit pas remplacé accidentellement. J'ai testé et cela fonctionne très bien pour moi!


1
Je suis sûr qu'il existe un moyen, mais ne serait-il pas préférable de toujours appliquer le même thème lors de l'exportation? Ou exportez-vous intentionnellement avec différents thèmes?
Malabarba

@Malabarba, l'intention est de pouvoir exporter quel que soit le thème que j'utilise actuellement et que le code soit lisible. Étant donné que de nombreux thèmes ne changent pas proprement (même avec disable-theme), je ne veux pas avoir à redémarrer Emacs avec un thème séparé juste pour exporter du HTML, ce que je fais plusieurs fois par jour.
Lee H

1
Si je comprends bien, votre configuration actuelle utilise déjà les couleurs du thème sur les blocs de code, et le problème que vous rencontrez est que l'arrière-plan du thème n'est pas utilisé. Si je me trompe, n'hésitez pas à annuler la modification que j'ai apportée à votre titre.
Malabarba

@Malabarba ma configuration actuelle ne spécifie pas la couleur d'arrière-plan des blocs de code (bien que je puisse coder en dur une couleur d'arrière-plan dans le CSS si cela peut aider). Je voudrais que la couleur d'arrière-plan du thème soit utilisée pour les blocs de code en mode org. Le nouveau titre fonctionne pour moi.
Lee H

Il y a deux problèmes avec la solution ci-dessus. Tout d'abord, les couleurs comme «gray80» ne seront pas traduites correctement en valeurs CSS et ne seront pas définies. Deuxièmement, chaque fois que l'exportation s'exécute, le org-html-head-extraest ajouté à, ce qui entraîne une croissance illimitée, bien que la fonctionnalité du style ne soit pas affectée.
RP Dillon

Réponses:


10

Tout d'abord, je pense que l'organisation peut utiliser htmlizepour colorer automatiquement vos blocs de code source en fonction de votre thème.

Alternativement.

Consultez http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . Il a un excellent exemple de la façon d'utiliser le org-export-before-processing-hookpour lancer un CSS personnalisé sur un document d'organisation avant une exportation HTML.

Voici le code en cas de panne du site:

Ici, lors d'une exportation html, org recherchera un fichier appelé styles.css dans le répertoire courant ou un fichier par défaut dans le répertoire .emacs.d et injectera ce css dans le document. C'est bien mais pas parfait pour votre cas d'utilisation.

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

Vous pouvez personnaliser cela de plusieurs manières pour le faire fonctionner comme vous le souhaitez.

Une façon serait de créer manuellement le CSS en fonction de votre thème et de l'insérer.

Voici une version modifiée qui définit l'arrière-plan de pre.srcla valeur hexadécimale des faces par défaut: propriété 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
Merci Jordon, c'est super! J'ai mis à jour ma question d'origine avec ma version légèrement modifiée, mais vous obtenez la prime et la solution!
Lee H
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.