Compare commits

...

4 Commits

Author SHA1 Message Date
Ellis Kenyo d52696836c
Work with multiple HTML content classes 2024-04-21 17:51:12 +08:00
TEC 2601556c27
Look for all languages used in the org buffer
org-babel-load-languages gives the languages that babel can execute, not
languages that it's seen, and we really want the latter.
2024-04-21 17:17:24 +08:00
Ellis Kenyo 4fdba88f1f
Allow CSS rendering of faces to use current theme 2024-04-21 16:20:35 +08:00
Ellis Kenyo 9010e61dc7
Simplify heading/outline CSS generation 2024-04-21 16:18:29 +08:00
1 changed files with 49 additions and 45 deletions

View File

@ -73,9 +73,10 @@ This can be overriden via #+chameleon_theme.")
(plist-put info :latex-engraved-theme chameleon-theme)) (plist-put info :latex-engraved-theme chameleon-theme))
t) t)
((and (org-export-derived-backend-p backend 'html) ((and (org-export-derived-backend-p backend 'html)
(equal (plist-get info :html-content-class) "chameleon")) (member "chameleon" (split-string (plist-get info :html-content-class))))
(plist-put info :html-content-class (plist-put info :html-content-class
(concat "chameleon " (concat (plist-get info :html-content-class)
" "
(symbol-name (car custom-enabled-themes)))) (symbol-name (car custom-enabled-themes))))
(unless (plist-get info :html-engraved-theme) (unless (plist-get info :html-engraved-theme)
(plist-put info :html-engraved-theme chameleon-theme)) (plist-put info :html-engraved-theme chameleon-theme))
@ -194,17 +195,17 @@ and the current theme otherwise."
(let ((engrave-faces-current-preset-style (ox-chameleon--get-theme info))) (let ((engrave-faces-current-preset-style (ox-chameleon--get-theme info)))
(require 'engrave-faces-html) (require 'engrave-faces-html)
(concat "<style>" (concat "<style>"
(ox-chameleon--generate-html-root-style) (ox-chameleon--generate-html-root-style info)
"body { background: var(--bg); color: var(--fg); font-family: var(--variable-pitch-font);}" "body { background: var(--bg); color: var(--fg); font-family: var(--variable-pitch-font);}"
"pre { font-family: var(--fixed-pitch-font);}" "pre { font-family: var(--fixed-pitch-font);}"
(ox-chameleon--generate-html-heading-style) (ox-chameleon--generate-html-heading-style info)
(ox-chameleon--generate-html-code-style) (ox-chameleon--generate-html-code-style info)
(ox-chameleon--face-to-css 'link "a") (ox-chameleon--face-to-css 'link "a")
(ox-chameleon--face-to-css 'link-visited "a:visited") (ox-chameleon--face-to-css 'link-visited "a:visited")
(ox-chameleon--face-to-css 'highlight "a:hover") (ox-chameleon--face-to-css 'highlight "a:hover")
"</style>"))) "</style>")))
(defun ox-chameleon--generate-html-root-style () (defun ox-chameleon--generate-html-root-style (_info)
(concat (concat
":root {" ":root {"
(apply #'format "--bg: #%s;\n--fg: #%s;\n" (ox-chameleon--generate-fgbg-colours)) (apply #'format "--bg: #%s;\n--fg: #%s;\n" (ox-chameleon--generate-fgbg-colours))
@ -212,16 +213,14 @@ and the current theme otherwise."
(ox-chameleon--face-attr 'variable-pitch :family) (ox-chameleon--face-attr 'variable-pitch :family)
(ox-chameleon--face-attr 'default :family)))) (ox-chameleon--face-attr 'default :family))))
(defun ox-chameleon--generate-html-heading-style () (defun ox-chameleon--generate-html-heading-style (_info)
(concat (string-join
(ox-chameleon--face-to-css 'outline-1 "h1") (cl-loop for i from 1 to 5
(string-join collect (ox-chameleon--face-to-css
(cl-loop for i from 2 to 5 (intern (format "outline-%s" i))
collect (ox-chameleon--face-to-css (format "h%s" i)))))
(intern (format "outline-%s" (- i 1)))
(format "h%s" (- i 1)))))))
(defun ox-chameleon--generate-html-rainbow-parens () (defun ox-chameleon--generate-html-rainbow-parens (_info)
(when (require 'rainbow-delimiters nil t) (when (require 'rainbow-delimiters nil t)
(string-join (string-join
(cl-loop for i from 1 to 9 (cl-loop for i from 1 to 9
@ -229,42 +228,47 @@ and the current theme otherwise."
(intern (format "rainbow-delimiters-depth-%s-face" i)) (intern (format "rainbow-delimiters-depth-%s-face" i))
(format ".org-rainbow-delimiters-depth-%s" i)))))) (format ".org-rainbow-delimiters-depth-%s" i))))))
(defun ox-chameleon--generate-html-code-style () (defun ox-chameleon--generate-html-code-style (info)
(concat (concat
(ox-chameleon--face-to-css 'org-block ".org-src-container") (ox-chameleon--face-to-css 'org-block ".org-src-container")
(ox-chameleon--face-to-css 'highlight-quoted-symbol ".org-highlight-quoted-symbol") (ox-chameleon--face-to-css 'highlight-quoted-symbol ".org-highlight-quoted-symbol")
(ox-chameleon--face-to-css 'highlight-quoted-quote ".org-highlight-quoted-quote") (ox-chameleon--face-to-css 'highlight-quoted-quote ".org-highlight-quoted-quote")
(ox-chameleon--face-to-css 'highlight-numbers-number ".org-highlight-numbers-number") (ox-chameleon--face-to-css 'highlight-numbers-number ".org-highlight-numbers-number")
(ox-chameleon--generate-html-code-style-font-lock) (ox-chameleon--generate-html-code-style-font-lock info)
(ox-chameleon--generate-html-rainbow-parens) (ox-chameleon--generate-html-rainbow-parens info)
(ox-chameleon--generate-html-block-names))) (ox-chameleon--generate-html-block-names info)))
(defun ox-chameleon--generate-html-block-names () (defun ox-chameleon--generate-html-block-names (info)
(string-join (let ((symbols (with-temp-buffer (org-mode) prettify-symbols-alist))
(mapcar (lambda (lang) (languages
(if-let ((symbols (with-temp-buffer (delete-dups
(org-mode) (org-element-map
prettify-symbols-alist))) (plist-get info :parse-tree)
(let ((begin (alist-get "#+begin_src" symbols nil nil #'string=)) 'src-block
(end (alist-get "#+end_src" symbols nil nil #'string=))) (lambda (src)
(format (org-element-property :language src))
"pre.src-%s::before { content: '%s %s'; display: block; %s } info))))
pre.src-%s::after { content: '%s'; display: block; %s }" (mapconcat
(symbol-name (car lang)) (lambda (lang)
begin (if symbols
(symbol-name (car lang)) (let ((begin (alist-get "#+begin_src" symbols nil nil #'string=))
(ox-chameleon--face-to-css 'org-block-begin-line) (end (alist-get "#+end_src" symbols nil nil #'string=)))
(symbol-name (car lang)) (format
end "pre.src-%s::before { content: '%s %s'; display: block; %s }
(ox-chameleon--face-to-css 'org-block-end-line))) pre.src-%s::after { content: '%s'; display: block; %s }"
(format lang begin lang
"pre.src-%s::before { content: '%s'; display: block; %s }" (ox-chameleon--face-to-css 'org-block-begin-line)
(symbol-name (car lang)) lang end
(replace-regexp-in-string "-" " " (capitalize (symbol-name (car lang)))) (ox-chameleon--face-to-css 'org-block-end-line)))
(ox-chameleon--face-to-css 'org-block-begin-line)))) (format
org-babel-load-languages))) "pre.src-%s::before { content: '%s'; display: block; %s }"
lang
(replace-regexp-in-string "-" " " (capitalize lang))
(ox-chameleon--face-to-css 'org-block-begin-line))))
languages
"\n")))
(defun ox-chameleon--generate-html-code-style-font-lock () (defun ox-chameleon--generate-html-code-style-font-lock (_info)
(string-join (string-join
(mapcar (lambda (face) (mapcar (lambda (face)
(ox-chameleon--face-to-css (ox-chameleon--face-to-css
@ -291,7 +295,7 @@ and the current theme otherwise."
(concat pre (concat pre
(string-join (string-join
(cl-map 'list (lambda (attr) (cl-map 'list (lambda (attr)
(let ((val (ox-chameleon--face-attr face (car attr) t))) (let ((val (ox-chameleon--face-attr face (car attr))))
(when (engrave-faces--check-nondefault (car attr) val) (when (engrave-faces--check-nondefault (car attr) val)
(format "%s: %s;" (cdr attr) (format "%s: %s;" (cdr attr)
(if (eq :weight (car attr)) (if (eq :weight (car attr))