Defina o plano de fundo dos blocos <code> exportados pela organização de acordo com o tema

24

Eu exporto arquivos no modo organizacional com bastante frequência e quase todos eles possuem código. Quando exporto código, ele acaba colorindo o texto, dependendo do meu tema, no entanto, alterno regularmente entre um tema escuro e um claro. No caso do tema claro, os <code>blocos precisam ter um fundo claro e, para um tema escuro, precisam ter um fundo escuro (caso contrário, acabo com texto amarelo claro em um fundo acinzentado e é ilegível).

Eu tenho que adicionar esta linha para fundos escuros:

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

E lembre-se de removê-lo sempre que eu mudar para um fundo de cor clara

Existe uma maneira de detectar automaticamente a cor de fundo do tema atual no momento da exportação e usá-la no CSS do HTML exportado?

EDITAR

Eu vou com a resposta de Jordon (obrigado Jordon, você recebe os pontos de karma!), No entanto, eu queria postar a solução que acabei adicionando ao meu código, pois era uma versão ligeiramente modificada de sua resposta:

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

Isso define não apenas a cor do plano de fundo, mas também a cor do primeiro plano. Ele também anexa a linha à org-html-head-extraconfiguração existente para que outro HTML não seja substituído acidentalmente. Eu testei e isso funciona muito bem para mim!

Lee H
fonte
1
Tenho certeza de que há uma maneira, mas não seria melhor aplicar sempre o mesmo tema ao exportar? Ou você intencionalmente exporta com diferentes temas?
Malabarba 11/11
@ Malabarba, a intenção é poder exportar qual o tema que estou usando atualmente e que o código seja legível. Como muitos temas não mudam corretamente (mesmo com disable-theme), não quero ter que reiniciar o Emacs com um tema separado apenas para exportar HTML, o que faço muitas vezes por dia.
Lee H
1
Se bem entendi, sua configuração atual já usa as cores do tema nos blocos de código, e o problema que você está enfrentando é que o plano de fundo do tema não é usado. Se eu entendi errado, sinta-se à vontade para reverter a edição que fiz no seu título.
Malabarba
@ Malabarba minha configuração atual não especifica a cor de fundo dos blocos de código (embora eu possa codificar uma cor de fundo no css, se isso ajudar). Eu gostaria que a cor de fundo do tema fosse usada para os blocos de código do modo organizacional. O novo título funciona para mim.
Lee H
Existem dois problemas com a solução acima. Primeiro, cores como 'gray80' não serão traduzidas corretamente para valores CSS e não serão definidas. Em segundo lugar, toda vez que a exportação é executada, ela org-html-head-extraé anexada, levando a um crescimento ilimitado, embora a funcionalidade do estilo não seja prejudicada.
RP Dillon

Respostas:

10

Primeiro, acredito que a organização pode usar htmlizepara colorir automaticamente seus blocos de código-fonte de acordo com o seu tema.

Alternativamente.

Confira http://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ . Ele tem um ótimo exemplo de como usar o org-export-before-processing-hookpara lançar CSS personalizado em um documento organizacional antes de uma exportação html.

Aqui está o código caso o site seja desativado:

Aqui, em uma exportação de html, a organização procurará um arquivo chamado styles.css no diretório atual ou um arquivo padrão no diretório .emacs.d e injetará esse css no documento. Isso é bom, mas não é perfeito para o seu 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)

Você pode personalizá-lo de várias maneiras para fazê-lo funcionar como você gostaria.

Uma maneira seria construir manualmente o css com base no seu tema e inseri-lo.

Aqui está uma versão modificada que define o plano de fundo pre.srcpara o valor hexadecimal das faces padrão: propriedade de plano de fundo.

(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
fonte
1
Obrigado Jordon, isso é ótimo! Atualizei minha pergunta original com minha versão ligeiramente editada, mas você recebe a recompensa e a solução!
Lee H