Đặt nền của các khối <code> được xuất theo chủ đề


24

Tôi xuất các tệp chế độ org khá thường xuyên và hầu như tất cả chúng đều có mã trong đó. Khi tôi thực hiện xuất mã, nó sẽ tô màu văn bản tùy thuộc vào chủ đề của tôi, tuy nhiên, tôi thường xuyên chuyển đổi giữa một chủ đề tối và một chủ đề sáng. Trong trường hợp chủ đề ánh sáng, các <code>khối cần phải có nền sáng và đối với chủ đề tối, chúng cần có nền tối (nếu không, tôi kết thúc bằng văn bản màu vàng nhạt trên nền màu xám và không thể đọc được).

Tôi phải thêm dòng này cho nền tối:

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

Và sau đó nhớ xóa nó bất cứ khi nào tôi chuyển sang nền màu sáng

Có cách nào để tôi có thể tự động phát hiện màu nền của chủ đề hiện tại khi xuất và sử dụng nó trong CSS của HTML đã xuất không?

CHỈNH SỬA

Tôi đang đi với câu trả lời của Jordon (cảm ơn Jordon, bạn sẽ nhận được điểm nghiệp chướng!), Tuy nhiên tôi muốn đăng giải pháp mà cuối cùng tôi đã thêm vào mã của mình, vì đó là phiên bản sửa đổi một chút của câu trả lời của anh ấy:

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

Bộ này không chỉ đặt màu nền mà còn cả màu nền trước. Nó cũng nối thêm dòng vào org-html-head-extracài đặt hiện có để các HTML khác không bị ghi đè một cách tình cờ. Tôi đã thử nghiệm và điều này làm việc rất tốt cho tôi!


1
Tôi chắc chắn có một cách, nhưng sẽ tốt hơn thay vì luôn luôn thực thi cùng một chủ đề khi xuất khẩu? Hay bạn cố tình xuất khẩu với các chủ đề khác nhau?
Malabarba

@Malabarba mục đích là có thể xuất bất kỳ chủ đề nào tôi hiện đang sử dụng và có mã có thể đọc được. Vì nhiều chủ đề không chuyển đổi rõ ràng (ngay cả với disable-theme), tôi không muốn phải khởi động lại Emacs với một chủ đề riêng chỉ để xuất HTML, mà tôi làm nhiều lần trong ngày.
Lee H

1
Nếu tôi hiểu chính xác, thiết lập hiện tại của bạn đã sử dụng màu của chủ đề trên các khối mã và vấn đề bạn gặp phải là nền của chủ đề không được sử dụng. Nếu tôi hiểu sai, xin vui lòng quay lại chỉnh sửa tôi đã thực hiện cho tiêu đề của bạn.
Malabarba

@Malabarba Thiết lập hiện tại của tôi không chỉ định màu nền của các khối mã (mặc dù tôi có thể mã hóa màu nền trong css nếu điều đó có ích). Tôi muốn màu nền của chủ đề được sử dụng cho các khối mã chế độ org. Tiêu đề mới làm việc cho tôi.
Lee H

Có hai vấn đề với giải pháp trên. Đầu tiên, các màu như 'grey80' sẽ không được dịch chính xác sang các giá trị CSS và sẽ không được đặt. Thứ hai, mỗi khi xuất khẩu chạy, org-html-head-extrasẽ được thêm vào, dẫn đến tăng trưởng không giới hạn, mặc dù chức năng của phong cách sẽ không bị suy giảm.
RP Dillon

Câu trả lời:


10

Đầu tiên, tôi tin rằng org có thể sử dụng htmlizeđể tự động tô màu các khối mã nguồn theo chủ đề của bạn.

Cách khác.

Kiểm tra http://definiteaplug.b0.cx/post/custom-inlines-css-in-org-mode-html-export/ . Nó có một ví dụ tuyệt vời về cách sử dụng org-export-before-processing-hookđể ném css tùy chỉnh vào tài liệu org trước khi xuất html.

Đây là mã trong trường hợp trang web bị sập:

Ở đây khi xuất html, org sẽ tìm một tệp có tên là style.css trong thư mục hiện tại hoặc một tệp mặc định trong thư mục .emacs.d và đưa css đó vào tài liệu. Điều này là tốt đẹp nhưng không hoàn hảo cho trường hợp sử dụng của bạn.

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

Bạn có thể tùy chỉnh điều này theo một số cách để làm cho nó hoạt động như bạn muốn.

Một cách sẽ là tự xây dựng css dựa trên chủ đề của bạn và chèn nó.

Đây là một phiên bản sửa đổi đặt nền của pre.srcgiá trị hex của các mặt mặc định: thuộc tính nền.

(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
Cảm ơn Jordon, điều này thật tuyệt! Tôi đã cập nhật câu hỏi ban đầu của mình với phiên bản được chỉnh sửa một chút, nhưng bạn sẽ nhận được tiền thưởng và giải pháp!
Lee H
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.