Imposta lo sfondo dei blocchi <code> esportati dall'organizzazione in base al tema


24

Esportazione abbastanza spesso i file in modalità org e quasi tutti contengono codice. Quando eseguo il codice di esportazione, finisce per colorare il testo a seconda del mio tema, tuttavia, cambio regolarmente tra un tema scuro e un tema chiaro. Nel caso del tema chiaro, i <code>blocchi devono avere uno sfondo chiaro, e per un tema scuro devono avere uno sfondo scuro (altrimenti finisco con un testo giallo chiaro su uno sfondo grigiastro ed è illeggibile).

Devo aggiungere questa linea per gli sfondi scuri:

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

E poi ricordati di rimuoverlo ogni volta che passo a uno sfondo di colore chiaro

Esiste un modo per rilevare automaticamente il colore di sfondo del tema corrente al momento dell'esportazione e utilizzarlo nel CSS esportato dell'HTML?

MODIFICARE

Vado con la risposta di Jordon (grazie Jordon, ottieni i punti karma!), Tuttavia volevo pubblicare la soluzione che ho finito per aggiungere al mio codice, poiché era una versione leggermente modificata della sua risposta:

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

Questo imposta non solo il colore di sfondo, ma anche il colore di primo piano. Aggiunge inoltre la linea org-html-head-extraall'impostazione esistente in modo che l'altro HTML non venga sovrascritto accidentalmente. Ho provato e questo funziona alla grande per me!


1
Sono sicuro che c'è un modo, ma non sarebbe meglio invece applicare sempre lo stesso tema durante l'esportazione? O esporti intenzionalmente con temi diversi?
Malabarba,

@Malabarba l'intento è quello di poter esportare quale tema sto attualmente usando e avere il codice leggibile. Poiché molti temi non cambiano in modo chiaro (anche con disable-theme), non voglio riavviare Emacs con un tema separato solo per esportare HTML, cosa che faccio più volte al giorno.
Lee H,

1
Se ho capito bene, la tua configurazione attuale utilizza già i colori del tema sui blocchi di codice e il problema che stai riscontrando è che lo sfondo del tema non viene utilizzato. Se ho sbagliato, non esitare a ripristinare la modifica che ho apportato al tuo titolo.
Malabarba,

@Malabarba la mia configurazione attuale non specifica il colore di sfondo dei blocchi di codice (anche se posso codificare un colore di sfondo nel CSS se ciò potrebbe aiutare). Vorrei che il colore di sfondo del tema fosse usato per i blocchi di codice in modalità org. Il nuovo titolo funziona per me.
Lee H,

Esistono due problemi con la soluzione sopra. Innanzitutto, i colori come "gray80" non verranno tradotti correttamente nei valori CSS e non verranno impostati. In secondo luogo, ogni volta che viene eseguita l'esportazione, org-html-head-extraviene aggiunto, portando a una crescita illimitata, sebbene la funzionalità dello stile non venga compromessa.
RP Dillon

Risposte:


10

In primo luogo, credo che org possa usare htmlizeper colorare automaticamente i blocchi di codice sorgente in base al tema.

In alternativa.

Dai un'occhiata a http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . Ha un ottimo esempio di come usare il org-export-before-processing-hookper lanciare CSS personalizzati su un documento organizzativo prima di un'esportazione html.

Ecco il codice nel caso in cui il sito non funzioni:

Qui su un'esportazione html, org cercherà un file chiamato styles.css nella directory corrente o un file predefinito nella directory .emacs.d e inietterà quel css nel documento. Questo è carino ma non perfetto per il tuo caso d'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)

Puoi personalizzarlo in alcuni modi per farlo funzionare come desideri.

Un modo sarebbe quello di creare manualmente il CSS in base al tema e inserirlo.

Ecco una versione modificata che imposta lo sfondo del pre.srcvalore esadecimale delle facce predefinite: proprietà 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
Grazie Jordon, è fantastico! Ho aggiornato la mia domanda originale con la mia versione leggermente modificata, ma ottieni la taglia e la soluzione!
Lee H,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.