Legen Sie den Hintergrund von org-exportierten <code> -Blöcken entsprechend dem Thema fest

24

Ich exportiere sehr oft Dateien im Organisationsmodus und fast alle enthalten Code. Wenn ich Code exportiere, färbt er den Text in Abhängigkeit von meinem Thema. Ich wechsle jedoch regelmäßig zwischen einem dunklen und einem hellen Thema. Im Fall des hellen Themas müssen die <code>Blöcke einen hellen Hintergrund haben, und für ein dunkles Thema müssen sie einen dunklen Hintergrund haben (andernfalls erhalte ich hellgelben Text auf einem grauen Hintergrund und er ist nicht lesbar).

Ich muss diese Zeile für dunkle Hintergründe hinzufügen:

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

Und denken Sie daran, es zu entfernen, wenn ich auf einen hellen Hintergrund wechsle

Gibt es eine Möglichkeit, die Hintergrundfarbe des aktuellen Designs beim Export automatisch zu erkennen und im CSS des exportierten HTML zu verwenden?

BEARBEITEN

Ich gehe mit Jordons Antwort (danke Jordon, du bekommst die Karma-Punkte!), Aber ich wollte die Lösung posten, die ich meinem Code hinzugefügt habe, da es sich um eine leicht modifizierte Version seiner Antwort handelte:

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

Dies legt nicht nur die Hintergrundfarbe, sondern auch die Vordergrundfarbe fest. Außerdem wird die Zeile an die vorhandene org-html-head-extraEinstellung angehängt , damit kein anderer HTML- Code versehentlich überschrieben wird. Ich habe getestet und das funktioniert großartig für mich!

Lee H
quelle
1
Ich bin mir sicher, dass es einen Weg gibt, aber wäre es nicht besser, beim Exportieren immer dasselbe Thema durchzusetzen? Oder exportieren Sie absichtlich mit verschiedenen Themen?
Malabarba
@Malabarba die Absicht ist, in der Lage zu sein, zu exportieren, welches Thema ich aktuell benutze und der Code lesbar sein soll. Da viele Themen nicht sauber wechseln (auch nicht mit disable-theme), möchte ich Emacs nicht mit einem separaten Thema neu starten müssen, nur um HTML zu exportieren, was ich mehrmals am Tag mache.
Lee H
1
Wenn ich das richtig verstehe, verwendet Ihr aktuelles Setup bereits die Farben des Themas in den Codeblöcken, und das Problem, das Sie haben, ist, dass der Hintergrund des Themas nicht verwendet wird. Wenn ich etwas falsch gemacht habe, können Sie die Bearbeitung, die ich an Ihrem Titel vorgenommen habe, jederzeit rückgängig machen.
Malabarba
@Malabarba Mein aktuelles Setup gibt die Hintergrundfarbe von Codeblöcken nicht an (obwohl ich eine Hintergrundfarbe in der CSS hart codieren kann, wenn das helfen würde). Ich möchte, dass die Hintergrundfarbe des Themas für die Codeblöcke im Organisationsmodus verwendet wird. Der neue Titel funktioniert für mich.
Lee H
Es gibt zwei Probleme mit der obigen Lösung. Erstens werden Farben wie 'gray80' nicht korrekt in CSS-Werte übersetzt und nicht festgelegt. Zweitens wird bei jeder Ausführung des Exports der an den org-html-head-extraangehängt, was zu einem unbegrenzten Wachstum führt, obwohl die Funktionalität des Stils nicht beeinträchtigt wird.
RP Dillon

Antworten:

10

Erstens glaube ich, dass org verwenden kann, htmlizeum Ihre Quellcodeblöcke automatisch gemäß Ihrem Thema einzufärben.

Alternative.

Schauen Sie sich http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ an . Es enthält ein hervorragendes Beispiel für die Verwendung org-export-before-processing-hookvon, um benutzerdefiniertes CSS vor einem HTML-Export auf ein Organisationsdokument zu werfen.

Hier ist der Code für den Fall, dass die Website ausfällt:

Hier sucht org bei einem HTML-Export nach einer Datei namens styles.css im aktuellen Verzeichnis oder nach einer Standarddatei im Verzeichnis .emacs.d und fügt diese CSS in das Dokument ein. Das ist schön, aber nicht perfekt für Ihren Anwendungsfall.

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

Sie können dies auf verschiedene Arten anpassen, damit es nach Ihren Wünschen funktioniert.

Eine Möglichkeit wäre, die CSS manuell basierend auf Ihrem Thema zu erstellen und diese einzufügen.

Hier ist eine modifizierte Version, die den Hintergrund pre.srcauf den Hexadezimalwert der Standardgesichter einstellt : background-Eigenschaft.

(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
quelle
1
Danke Jordon, das ist großartig! Ich habe meine ursprüngliche Frage mit meiner leicht bearbeiteten Version aktualisiert, aber Sie bekommen das Kopfgeld und die Lösung!
Lee H