ตั้งค่าพื้นหลังของบล็อก <code> ที่ส่งออกโดยองค์กรตามธีม


24

ฉันส่งออกไฟล์โหมดองค์กรค่อนข้างบ่อยและเกือบทั้งหมดมีรหัสในนั้น เมื่อฉันทำรหัสส่งออกมันจะจบลงด้วยการระบายสีข้อความตามธีมของฉันอย่างไรก็ตามฉันสลับไปมาระหว่างธีมสีเข้มและธีมสีอ่อนเป็นประจำ ในกรณีของชุดรูปแบบแสง<code>บล็อกต้องมีพื้นหลังสีอ่อนและสำหรับชุดรูปแบบสีเข้มที่พวกเขาจำเป็นต้องมีพื้นหลังสีเข้ม (มิฉะนั้นฉันท้ายด้วยข้อความสีเหลืองอ่อนบนพื้นหลังสีเทาและไม่สามารถอ่านได้)

ฉันต้องเพิ่มบรรทัดนี้สำหรับพื้นหลังสีเข้ม:

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

และอย่าลืมลบมันทุกครั้งที่ฉันเปลี่ยนเป็นพื้นหลังสีอ่อน

มีวิธีที่ฉันสามารถตรวจจับสีพื้นหลังของชุดรูปแบบปัจจุบันในเวลาส่งออกโดยอัตโนมัติและใช้ใน CSS ของ HTML ที่ส่งออกหรือไม่

แก้ไข

ฉันจะตอบคำถามของ Jordon (ขอบคุณ Jordon คุณจะได้คะแนน karma!) อย่างไรก็ตามฉันต้องการโพสต์คำตอบที่ฉันเพิ่มลงในรหัสของฉันเนื่องจากเป็นคำตอบที่แก้ไขเล็กน้อย:

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

ชุดนี้ไม่เพียง แต่สีพื้นหลัง แต่ยังเป็นสีพื้นหน้า นอกจากนี้ยังเพิ่มบรรทัดต่อไปยังการorg-html-head-extraตั้งค่าปัจจุบันเพื่อให้ HTML อื่นไม่ถูกเขียนทับโดยไม่ตั้งใจ ฉันได้ทดสอบแล้วและนี่ใช้งานได้ดีสำหรับฉัน!


1
ฉันแน่ใจว่ามีวิธี แต่จะดีกว่าหรือไม่ที่จะบังคับใช้ชุดรูปแบบเดียวกันเสมอเมื่อส่งออก หรือคุณตั้งใจส่งออกด้วยธีมที่แตกต่างกัน?
Malabarba

@ Malabarba ความตั้งใจที่จะสามารถส่งออกชุดรูปแบบใดก็ตามที่ฉันกำลังใช้และมีรหัสสามารถอ่านได้ เนื่องจากหลาย ๆ ธีมไม่ได้เปลี่ยนอย่างหมดจด (แม้กระทั่งdisable-theme) ฉันไม่ต้องการรีสตาร์ท Emacs ด้วยธีมแยกต่างหากเพื่อส่งออก HTML ซึ่งฉันทำวันละหลายครั้ง
Lee H

1
หากฉันเข้าใจอย่างถูกต้องการตั้งค่าปัจจุบันของคุณใช้สีของชุดรูปแบบบนบล็อคโค้ดแล้วและปัญหาที่คุณพบคือพื้นหลังของชุดรูปแบบไม่ได้ใช้ หากฉันเข้าใจผิดโปรดย้อนกลับการแก้ไขที่ฉันทำกับชื่อของคุณ
Malabarba

@Malabarba การตั้งค่าปัจจุบันของฉันไม่ได้ระบุสีพื้นหลังของบล็อครหัส (แม้ว่าฉันสามารถกำหนดรหัสสีพื้นหลังใน CSS ได้อย่างง่ายดายหากนั่นจะช่วยได้) ฉันต้องการสีพื้นหลังของชุดรูปแบบที่จะใช้สำหรับบล็อกรหัสโหมดองค์กร ชื่อใหม่เหมาะกับฉัน
Lee H

มีสองปัญหากับวิธีแก้ไขปัญหาข้างต้น ก่อนอื่นสีเช่น 'gray80' จะไม่ถูกแปลเป็นค่า CSS อย่างถูกต้องและจะไม่ได้รับการตั้งค่า ประการที่สองทุกครั้งที่มีการส่งออกข้อมูลorg-html-head-extraจะถูกผนวกเข้าด้วยกันซึ่งนำไปสู่การเติบโตอย่างมากมายแม้ว่าการทำงานของสไตล์จะไม่ด้อยลง
RP Dillon

คำตอบ:


10

ก่อนอื่นฉันเชื่อว่า org สามารถใช้htmlizeเพื่อบล็อกสีซอร์สโค้ดของคุณโดยอัตโนมัติตามธีมของคุณ

อีกทางเลือกหนึ่ง

ตรวจสอบhttp://definitelyaplug.b0.cx/post/custom-inlined-css-in-org-mode-html-export/ มีตัวอย่างที่ดีของวิธีการใช้org-export-before-processing-hookเพื่อโยน css ที่กำหนดเองลงในเอกสาร org ก่อนที่จะส่งออก html

นี่คือรหัสในกรณีที่ไซต์หยุดทำงาน:

ในการส่งออก html ที่นี่ org จะค้นหาไฟล์ชื่อ styles.css ในไดเรกทอรีปัจจุบันหรือไฟล์เริ่มต้นในไดเรกทอรี. emacs.d และฉีด css นั้นลงในเอกสาร นี่เป็นสิ่งที่ดี แต่ไม่เหมาะสำหรับกรณีการใช้ของคุณ

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

คุณสามารถปรับแต่งสิ่งนี้ได้สองสามวิธีเพื่อให้มันทำงานตามที่คุณต้องการ

วิธีหนึ่งคือการสร้าง css ด้วยตนเองตามธีมของคุณและใส่เข้าไป

นี่คือเวอร์ชันที่ปรับเปลี่ยนซึ่งตั้งค่าพื้นหลังของpre.srcเป็นค่าฐานสิบหกของใบหน้ามาตรฐาน: คุณสมบัติพื้นหลัง

(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
ขอบคุณ Jordon นี่เยี่ยมมาก! ฉันได้อัปเดตคำถามเดิมของฉันด้วยเวอร์ชันที่แก้ไขเล็กน้อย แต่คุณได้รับความโปรดปรานและวิธีแก้ปัญหา!
Lee H
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.