Ustaw tło eksportowanych przez organizację bloków <code> zgodnie z motywem

24

Często eksportuję pliki w trybie organizacji i prawie wszystkie zawierają kod. Kiedy eksportuję kod, kolorowanie tekstu kończy się w zależności od mojego motywu, jednak regularnie przełączam między ciemnym motywem a jasnym motywem. W przypadku jasnego motywu <code>bloki muszą mieć jasne tło, a w przypadku ciemnego motywu muszą mieć ciemne tło (w przeciwnym razie otrzymam jasnożółty tekst na szarym tle i jest nieczytelny).

Muszę dodać tę linię do ciemnego tła:

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

A potem pamiętaj, aby go usunąć za każdym razem, gdy przełączam na jasne tło

Czy istnieje sposób, w jaki mogę automatycznie wykryć kolor tła bieżącego motywu podczas eksportu i użyć go w CSS wyeksportowanego HTML?

EDYTOWAĆ

Idę z odpowiedzią Jordona (dzięki Jordon, dostajesz punkty karmy!), Ale chciałem opublikować rozwiązanie, które ostatecznie dodałem do mojego kodu, ponieważ była to nieco zmodyfikowana wersja jego odpowiedzi:

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

To ustawia nie tylko kolor tła, ale także kolor pierwszego planu. Dołącza również linię do istniejącego org-html-head-extraustawienia, aby inne pliki HTML nie zostały przypadkowo zastąpione. Przetestowałem i to działa świetnie dla mnie!

Lee H.
źródło
1
Jestem pewien, że istnieje sposób, ale czy nie lepiej byłoby zawsze wymuszać ten sam motyw podczas eksportu? Czy celowo eksportujesz z różnymi motywami?
Malabarba
@Malabarba chodzi o to, aby móc wyeksportować którykolwiek motyw, którego obecnie używam, i zapewnić czytelność kodu. Ponieważ wiele motywów nie przełącza się czysto (nawet z disable-theme), nie chcę ponownie uruchamiać Emacsa z osobnym motywem, aby wyeksportować HTML, co robię wiele razy dziennie.
Lee H
1
Jeśli dobrze rozumiem, bieżąca konfiguracja używa już kolorów motywu w blokach kodu, a masz problem z tym, że tło motywu nie jest używane. Jeśli popełniłem błąd, prosimy o cofnięcie edycji, którą wprowadziłem do twojego tytułu.
Malabarba
@Malabarba moja obecna konfiguracja nie określa koloru tła bloków kodu (chociaż mogę na stałe zakodować kolor tła w css, jeśli to by pomogło). Chciałbym, aby kolor tła motywu był używany dla bloków kodu w trybie org. Nowy tytuł działa dla mnie.
Lee H
Istnieją dwa problemy z powyższym rozwiązaniem. Po pierwsze, kolory takie jak „gray80” nie zostaną poprawnie przetłumaczone na wartości CSS i nie zostaną ustawione. Po drugie, za każdym razem, gdy eksport jest uruchamiany, dodaje org-html-head-extrasię do niego, co prowadzi do nieograniczonego wzrostu, chociaż funkcjonalność stylu nie zostanie naruszona.
RP Dillon

Odpowiedzi:

10

Po pierwsze, wierzę, że org może użyć htmlizedo automatycznego pokolorowania bloków kodu źródłowego zgodnie z twoim motywem.

Alternatywnie.

Sprawdź http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . Ma świetny przykład użycia w org-export-before-processing-hookcelu rzucenia niestandardowego css na dokument organizacji przed eksportem HTML.

Oto kod na wypadek awarii strony:

Podczas eksportu html organizacja szuka pliku o nazwie styles.css w bieżącym katalogu lub pliku domyślnego w katalogu .emacs.d i wstrzykuje ten plik css do dokumentu. To jest miłe, ale nie idealne do twojego przypadku użycia.

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

Możesz to dostosować na kilka sposobów, aby działało tak, jak chcesz.

Jednym ze sposobów byłoby ręczne zbudowanie css na podstawie motywu i wstawienie go.

Oto zmodyfikowana wersja, która ustawia tło pre.srcwartości szesnastkowej domyślnych właściwości face: 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)
Jordon Biondo
źródło
1
Dzięki Jordon, to świetnie! Zaktualizowałem swoje pierwotne pytanie moją nieco zmodyfikowaną wersją, ale dostaniesz nagrodę i rozwiązanie!
Lee H