import json, os HERE=os.path.dirname(os.path.abspath(__file__)) ns={} src=open(os.path.join(HERE,'samples.py')).read() exec(src[:src.index('cols=')], ns) SAMPLES={"Elisp":ns['ELS'],"Go":ns['GOS'],"Python":ns['PYS'],"TypeScript":ns['TSS'],"Shell":ns['SHS'],"C/C++":ns['CS']} COLS=ns['COLS'] MAP={k:v[0] for k,v in COLS.items()}; BOLD={k:v[1] for k,v in COLS.items()}; MAP['str']='#5d9b86'; MAP['bg']='#000000' PALETTE=[["#67809c","blue"],["#e8bd30","gold"],["#9b5fd0","regal"],["#2ba178","emerald"],["#5d9b86","sage"], ["#cb6b4d","terracotta"],["#be9e74","tan"],["#ffffff","white"],["#a9b2bb","silver"],["#838d97","steel"], ["#5e6770","pewter"],["#2f343a","gunmetal"],["#264364","navy"],["#000000","ground"],["#1a1714","bg-dim"]] CATS=[["bg","background (ground)","Aa Bb 123"],["p","fg · default text","other / whitespace"],["kw","keyword","class def if return"],["bi","builtin","len echo printf"], ["pp","preprocessor","#include #define"],["fnd","function · def","resolve push"], ["fnc","function · call","printf rsync get"],["dec","decorator","@dataclass"], ["ty","type / class","int str Order Queue"],["prop","property / field","id name items"], ["con","constant","None nil NULL true"],["num","number","8080 100 -1"], ["str","string",'"dupre" "fmt"'],["esc","escape","\\n \\t"],["re","regexp","/^#[0-9a-f]+/"], ["doc","docstring",'"""..."""'],["cm","comment","# reject nil"],["cmd","comment delim","# // ;;"], ["var","variable / use","value key self"],["op","operator",": = -> =="], ["punc","punctuation","{ } ( ) ;"]] UI_FACES=[["cursor","cursor","Aa|"],["region","region (selection)","selected text"], ["hl-line","hl-line (current line)","current line"],["highlight","highlight","hover"], ["mode-line","mode-line","status active"],["mode-line-inactive","mode-line-inactive","status idle"], ["fringe","fringe","| |"],["line-number","line-number"," 42"], ["line-number-current-line","line-number-current-line","> 42"],["minibuffer-prompt","minibuffer-prompt","M-x "], ["isearch","isearch (match)","match"],["lazy-highlight","lazy-highlight","other match"], ["isearch-fail","isearch-fail","no match"],["show-paren-match","show-paren-match","( )"], ["show-paren-mismatch","show-paren-mismatch",") ("],["link","link","https://"], ["error","error","error!"],["warning","warning","warning"], ["success","success","ok"],["vertical-border","vertical-border","|"]] UIMAP={"cursor":{"fg":None,"bg":"#a9b2bb"},"region":{"fg":None,"bg":"#264364"}, "hl-line":{"fg":None,"bg":"#1a1714"},"highlight":{"fg":None,"bg":"#2f343a"}, "mode-line":{"fg":"#cdced1","bg":"#2f343a"},"mode-line-inactive":{"fg":"#838d97","bg":"#1a1714"}, "fringe":{"fg":None,"bg":"#0d0b0a"},"line-number":{"fg":"#5e6770","bg":None}, "line-number-current-line":{"fg":"#e8bd30","bg":"#1a1714"},"minibuffer-prompt":{"fg":"#67809c","bg":None}, "isearch":{"fg":"#0d0b0a","bg":"#e8bd30"},"lazy-highlight":{"fg":"#0d0b0a","bg":"#838d97"}, "isearch-fail":{"fg":"#cb6b4d","bg":None},"show-paren-match":{"fg":None,"bg":"#264364"}, "show-paren-mismatch":{"fg":"#0d0b0a","bg":"#cb6b4d"},"link":{"fg":"#67809c","bg":None}, "error":{"fg":"#cb6b4d","bg":None},"warning":{"fg":"#e8bd30","bg":None}, "success":{"fg":"#5d9b86","bg":None},"vertical-border":{"fg":"#2f343a","bg":None}} # Tier-3 package faces (Phase 2): complete own-defface sets for org/magit/elfeed, # built from face-name lists + a curated seed-color map. Prominent faces are # seeded; the long tail seeds to the default foreground for the user to tune. ORG_FACES=("org-document-title org-document-info org-document-info-keyword " "org-level-1 org-level-2 org-level-3 org-level-4 org-level-5 org-level-6 org-level-7 org-level-8 " "org-headline-todo org-headline-done org-todo org-done org-priority org-tag org-tag-group " "org-special-keyword org-drawer org-property-value org-checkbox org-checkbox-statistics-todo " "org-checkbox-statistics-done org-warning org-link org-footnote org-date org-sexp-date " "org-date-selected org-target org-macro org-cite org-cite-key org-block org-block-begin-line " "org-block-end-line org-code org-verbatim org-inline-src-block org-quote org-verse " "org-latex-and-related org-table org-table-header org-table-row org-formula org-column " "org-column-title org-list-dt org-meta-line org-ellipsis org-hide org-indent org-archived " "org-default org-dispatcher-highlight org-agenda-structure org-agenda-structure-secondary " "org-agenda-structure-filter org-agenda-date org-agenda-date-today org-agenda-date-weekend " "org-agenda-date-weekend-today org-agenda-current-time org-agenda-done org-agenda-dimmed-todo-face " "org-agenda-calendar-event org-agenda-calendar-sexp org-agenda-calendar-daterange org-agenda-diary " "org-agenda-clocking org-agenda-column-dateline org-agenda-restriction-lock org-agenda-filter-category " "org-agenda-filter-effort org-agenda-filter-regexp org-agenda-filter-tags org-scheduled " "org-scheduled-today org-scheduled-previously org-upcoming-deadline org-upcoming-distant-deadline " "org-imminent-deadline org-time-grid org-clock-overlay org-mode-line-clock org-mode-line-clock-overrun").split() MAGIT_FACES=("magit-section-heading magit-section-secondary-heading magit-section-heading-selection " "magit-section-highlight magit-section-child-count magit-diff-added magit-diff-added-highlight " "magit-diff-removed magit-diff-removed-highlight magit-diff-context magit-diff-context-highlight " "magit-diff-file-heading magit-diff-file-heading-highlight magit-diff-file-heading-selection " "magit-diff-hunk-heading magit-diff-hunk-heading-highlight magit-diff-hunk-heading-selection " "magit-diff-hunk-region magit-diff-lines-heading magit-diff-lines-boundary magit-diff-base " "magit-diff-base-highlight magit-diff-our magit-diff-our-highlight magit-diff-their " "magit-diff-their-highlight magit-diff-conflict-heading magit-diff-conflict-heading-highlight " "magit-diff-revision-summary magit-diff-revision-summary-highlight magit-diff-whitespace-warning " "magit-diffstat-added magit-diffstat-removed magit-branch-current magit-branch-local " "magit-branch-remote magit-branch-remote-head magit-branch-upstream magit-branch-warning " "magit-head magit-tag magit-hash magit-filename magit-dimmed magit-keyword magit-keyword-squash " "magit-refname magit-refname-stash magit-refname-wip magit-refname-pullreq magit-log-author " "magit-log-date magit-log-graph magit-header-line magit-header-line-key magit-header-line-log-select " "magit-process-ok magit-process-ng magit-mode-line-process magit-mode-line-process-error " "magit-bisect-good magit-bisect-bad magit-bisect-skip magit-blame-heading magit-blame-highlight " "magit-blame-hash magit-blame-name magit-blame-date magit-blame-summary magit-blame-dimmed " "magit-blame-margin magit-cherry-equivalent magit-cherry-unmatched magit-signature-good " "magit-signature-bad magit-signature-untrusted magit-signature-expired magit-signature-expired-key " "magit-signature-revoked magit-signature-error magit-reflog-commit magit-reflog-amend " "magit-reflog-merge magit-reflog-checkout magit-reflog-reset magit-reflog-rebase " "magit-reflog-cherry-pick magit-reflog-remote magit-reflog-other magit-sequence-pick " "magit-sequence-stop magit-sequence-part magit-sequence-head magit-sequence-drop magit-sequence-done " "magit-sequence-onto magit-sequence-exec magit-left-margin").split() ELFEED_FACES=("elfeed-search-date-face elfeed-search-title-face elfeed-search-unread-title-face " "elfeed-search-feed-face elfeed-search-tag-face elfeed-search-unread-count-face " "elfeed-search-filter-face elfeed-search-last-update-face elfeed-log-date-face " "elfeed-log-error-level-face elfeed-log-warn-level-face elfeed-log-info-level-face " "elfeed-log-debug-level-face").split() ORG_SEED={ "org-document-title":{"fg":"gold","bold":True,"height":1.5},"org-document-info":{"fg":"steel"}, "org-document-info-keyword":{"fg":"pewter","inherit":"fixed-pitch"}, "org-level-1":{"fg":"blue","bold":True,"height":1.3},"org-level-2":{"fg":"gold","height":1.2}, "org-level-3":{"fg":"regal","height":1.15},"org-level-4":{"fg":"emerald","height":1.1}, "org-level-5":{"fg":"terracotta"},"org-level-6":{"fg":"tan"},"org-level-7":{"fg":"sage"},"org-level-8":{"fg":"steel"}, "org-headline-done":{"fg":"pewter"},"org-todo":{"fg":"terracotta","bold":True},"org-done":{"fg":"sage","bold":True}, "org-priority":{"fg":"gold","bold":True},"org-tag":{"fg":"tan"},"org-tag-group":{"fg":"tan"}, "org-special-keyword":{"fg":"pewter"},"org-drawer":{"fg":"pewter"},"org-property-value":{"fg":"steel"}, "org-checkbox":{"fg":"gold","inherit":"fixed-pitch"},"org-checkbox-statistics-todo":{"fg":"terracotta"}, "org-checkbox-statistics-done":{"fg":"sage"},"org-warning":{"fg":"terracotta","bold":True}, "org-link":{"fg":"blue"},"org-footnote":{"fg":"blue"},"org-date":{"fg":"steel","inherit":"fixed-pitch"}, "org-sexp-date":{"fg":"steel"},"org-date-selected":{"fg":"ground","bg":"gold"},"org-target":{"fg":"regal"}, "org-macro":{"fg":"regal"},"org-cite":{"fg":"blue"},"org-cite-key":{"fg":"blue"}, "org-block":{"fg":"white","bg":"bg-dim","inherit":"fixed-pitch"}, "org-block-begin-line":{"fg":"pewter","bg":"bg-dim","inherit":"fixed-pitch"}, "org-block-end-line":{"fg":"pewter","bg":"bg-dim","inherit":"fixed-pitch"}, "org-code":{"fg":"terracotta","inherit":"fixed-pitch"},"org-verbatim":{"fg":"steel","inherit":"fixed-pitch"}, "org-inline-src-block":{"fg":"terracotta","inherit":"fixed-pitch"},"org-quote":{"fg":"silver","italic":True}, "org-verse":{"fg":"silver","italic":True},"org-latex-and-related":{"fg":"gold"}, "org-table":{"fg":"steel","inherit":"fixed-pitch"},"org-table-header":{"fg":"white","bold":True,"bg":"gunmetal"}, "org-formula":{"fg":"terracotta"},"org-column":{"bg":"gunmetal"},"org-column-title":{"fg":"white","bold":True,"bg":"gunmetal"}, "org-list-dt":{"fg":"gold","bold":True},"org-meta-line":{"fg":"pewter","inherit":"fixed-pitch"}, "org-ellipsis":{"fg":"pewter"},"org-hide":{"fg":"ground"},"org-indent":{"fg":"ground"}, "org-archived":{"fg":"pewter"},"org-dispatcher-highlight":{"fg":"gold","bold":True,"bg":"navy"}, "org-agenda-structure":{"fg":"blue","bold":True,"height":1.1},"org-agenda-structure-secondary":{"fg":"blue"}, "org-agenda-structure-filter":{"fg":"terracotta","bold":True},"org-agenda-date":{"fg":"steel","height":1.05}, "org-agenda-date-today":{"fg":"gold","bold":True,"height":1.05},"org-agenda-date-weekend":{"fg":"steel","bold":True}, "org-agenda-date-weekend-today":{"fg":"gold","bold":True},"org-agenda-current-time":{"fg":"gold"}, "org-agenda-done":{"fg":"sage"},"org-agenda-dimmed-todo-face":{"fg":"pewter"}, "org-agenda-calendar-event":{"fg":"white"},"org-agenda-calendar-sexp":{"fg":"steel"}, "org-agenda-calendar-daterange":{"fg":"steel"},"org-agenda-diary":{"fg":"sage"}, "org-agenda-clocking":{"bg":"navy"},"org-agenda-column-dateline":{"bg":"gunmetal"}, "org-agenda-restriction-lock":{"bg":"terracotta"},"org-agenda-filter-category":{"fg":"gold","bold":True}, "org-agenda-filter-effort":{"fg":"gold","bold":True},"org-agenda-filter-regexp":{"fg":"gold","bold":True}, "org-agenda-filter-tags":{"fg":"gold","bold":True},"org-scheduled":{"fg":"sage"}, "org-scheduled-today":{"fg":"sage","bold":True},"org-scheduled-previously":{"fg":"terracotta"}, "org-upcoming-deadline":{"fg":"gold"},"org-upcoming-distant-deadline":{"fg":"tan"}, "org-imminent-deadline":{"fg":"terracotta","bold":True},"org-time-grid":{"fg":"tan"}, "org-clock-overlay":{"bg":"navy"},"org-mode-line-clock":{"fg":"steel"},"org-mode-line-clock-overrun":{"fg":"terracotta","bold":True}} MAGIT_SEED={ "magit-section-heading":{"fg":"gold","bold":True},"magit-section-secondary-heading":{"fg":"tan","bold":True}, "magit-section-heading-selection":{"fg":"gold","bg":"navy"},"magit-section-highlight":{"bg":"bg-dim"}, "magit-section-child-count":{"fg":"pewter"},"magit-diff-added":{"fg":"sage"}, "magit-diff-added-highlight":{"fg":"sage","bg":"bg-dim"},"magit-diff-removed":{"fg":"terracotta"}, "magit-diff-removed-highlight":{"fg":"terracotta","bg":"bg-dim"},"magit-diff-context":{"fg":"pewter"}, "magit-diff-context-highlight":{"fg":"silver","bg":"bg-dim"},"magit-diff-file-heading":{"fg":"white","bold":True}, "magit-diff-file-heading-highlight":{"fg":"white","bold":True,"bg":"bg-dim"}, "magit-diff-hunk-heading":{"fg":"steel","bg":"gunmetal"},"magit-diff-hunk-heading-highlight":{"fg":"white","bg":"gunmetal"}, "magit-diffstat-added":{"fg":"sage"},"magit-diffstat-removed":{"fg":"terracotta"}, "magit-branch-current":{"fg":"blue","bold":True},"magit-branch-local":{"fg":"blue"}, "magit-branch-remote":{"fg":"sage"},"magit-branch-remote-head":{"fg":"sage","bold":True}, "magit-head":{"fg":"blue","bold":True},"magit-tag":{"fg":"gold"},"magit-hash":{"fg":"pewter"}, "magit-filename":{"fg":"steel"},"magit-dimmed":{"fg":"pewter"},"magit-keyword":{"fg":"regal"}, "magit-keyword-squash":{"fg":"terracotta"},"magit-refname":{"fg":"pewter"},"magit-log-author":{"fg":"tan"}, "magit-log-date":{"fg":"steel"},"magit-log-graph":{"fg":"pewter"}, "magit-header-line":{"fg":"white","bold":True,"bg":"gunmetal"},"magit-process-ok":{"fg":"sage","bold":True}, "magit-process-ng":{"fg":"terracotta","bold":True},"magit-mode-line-process":{"fg":"sage"}, "magit-mode-line-process-error":{"fg":"terracotta"},"magit-bisect-good":{"fg":"sage"}, "magit-bisect-bad":{"fg":"terracotta"},"magit-bisect-skip":{"fg":"gold"}, "magit-blame-heading":{"fg":"steel","bg":"gunmetal"},"magit-blame-hash":{"fg":"pewter"}, "magit-blame-name":{"fg":"tan"},"magit-blame-date":{"fg":"steel"},"magit-cherry-equivalent":{"fg":"regal"}, "magit-cherry-unmatched":{"fg":"sage"},"magit-signature-good":{"fg":"sage"}, "magit-signature-bad":{"fg":"terracotta","bold":True},"magit-signature-untrusted":{"fg":"gold"}, "magit-signature-expired":{"fg":"tan"},"magit-diff-whitespace-warning":{"bg":"terracotta"}, "magit-reflog-commit":{"fg":"sage"},"magit-reflog-amend":{"fg":"regal"},"magit-reflog-merge":{"fg":"sage"}, "magit-reflog-checkout":{"fg":"blue"},"magit-reflog-reset":{"fg":"terracotta"},"magit-reflog-rebase":{"fg":"regal"}, "magit-reflog-cherry-pick":{"fg":"sage"},"magit-reflog-remote":{"fg":"steel"},"magit-reflog-other":{"fg":"steel"}, "magit-sequence-pick":{"fg":"white"},"magit-sequence-stop":{"fg":"terracotta"},"magit-sequence-done":{"fg":"pewter"}, "magit-sequence-head":{"fg":"blue"}} ELFEED_SEED={ "elfeed-search-date-face":{"fg":"steel"},"elfeed-search-title-face":{"fg":"silver"}, "elfeed-search-unread-title-face":{"fg":"white","bold":True},"elfeed-search-feed-face":{"fg":"sage"}, "elfeed-search-tag-face":{"fg":"tan"},"elfeed-search-unread-count-face":{"fg":"gold"}, "elfeed-search-filter-face":{"fg":"blue","bold":True},"elfeed-search-last-update-face":{"fg":"pewter"}, "elfeed-log-date-face":{"fg":"steel"},"elfeed-log-error-level-face":{"fg":"terracotta","bold":True}, "elfeed-log-warn-level-face":{"fg":"gold"},"elfeed-log-info-level-face":{"fg":"sage"}, "elfeed-log-debug-level-face":{"fg":"pewter"}} def _faces(names,prefix,seed): out=[] for f in names: lbl=(f[len(prefix):] if f.startswith(prefix) else f).replace("-face","").replace("-"," ") out.append([f,lbl,seed.get(f,{})]) return out APPS={"org-mode":{"label":"org-mode","preview":"org","faces":_faces(ORG_FACES,"org-",ORG_SEED)}, "magit":{"label":"magit","preview":"magit","faces":_faces(MAGIT_FACES,"magit-",MAGIT_SEED)}, "elfeed":{"label":"elfeed","preview":"elfeed","faces":_faces(ELFEED_FACES,"elfeed-",ELFEED_SEED)}} HTML = """theme-selector

Untitled: theme

palette

#888888
limit

export, import, and save

code/color assignments

color △styleelements △examplecontrast

 

ui faces

faceforegroundbackgroundpreview

package faces

facefgbgweightinheritsizecontrast
""" HTML=(HTML.replace("SAMPLES_J",json.dumps(SAMPLES)) .replace("PALETTE_J",json.dumps(PALETTE)).replace("CATS_J",json.dumps(CATS)) .replace("UIFACES_J",json.dumps(UI_FACES)).replace("UIMAP_J",json.dumps(UIMAP)).replace("APPS_J",json.dumps(APPS)) .replace("BOLD_J",json.dumps(BOLD)).replace("MAP_J",json.dumps(MAP))) OUT=os.path.join(HERE,'theme-selector.html') open(OUT,"w").write(HTML) print("wrote",OUT)