aboutsummaryrefslogtreecommitdiff
path: root/scripts/theme-selector/generate.py
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-08 02:32:45 -0500
committerCraig Jennings <c@cjennings.net>2026-06-08 02:32:45 -0500
commitc05364951bf59edde7d0d0eb35013dfc077d40cf (patch)
tree6bef8d59e31f68b81dc4517d5393f10aeb328eab /scripts/theme-selector/generate.py
parente622f65fd61e260f36a62250b8894f555b8680dc (diff)
downloaddotemacs-c05364951bf59edde7d0d0eb35013dfc077d40cf.tar.gz
dotemacs-c05364951bf59edde7d0d0eb35013dfc077d40cf.zip
feat(theme-selector): generated all-package inventory (tier-3 phase 6)
I added the hybrid inventory. build-inventory.el, loaded into a running Emacs, queries every installed package's faces grouped by the package that defines them and writes package-inventory.json. generate.py embeds that file and merges each package into the app dropdown as an editable generic app, leaving the bespoke org, magit, and elfeed untouched. The dropdown now reaches 40 apps: the three bespoke plus 37 inventory packages (643 faces), so any installed package can be themed against the palette with the generic preview. The inventory is a committed data artifact refreshed by reloading the .el, never browser-side discovery, matching the spec's hybrid-and-split decision.
Diffstat (limited to 'scripts/theme-selector/generate.py')
-rw-r--r--scripts/theme-selector/generate.py11
1 files changed, 11 insertions, 0 deletions
diff --git a/scripts/theme-selector/generate.py b/scripts/theme-selector/generate.py
index 80e9ad54..a7bc1b73 100644
--- a/scripts/theme-selector/generate.py
+++ b/scripts/theme-selector/generate.py
@@ -174,6 +174,17 @@ def _faces(names,prefix,seed):
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)}}
+# Phase 6: merge the generated all-package inventory (refresh with build-inventory.el).
+# Bespoke apps stay; every other installed package becomes an editable generic app.
+_inv_path=os.path.join(HERE,"package-inventory.json")
+if os.path.exists(_inv_path):
+ _INV=json.load(open(_inv_path))
+ _BESPOKE={"magit","elfeed","org","org-mode"}
+ for _pkg in sorted(_INV):
+ if _pkg in _BESPOKE or _pkg in APPS: continue
+ APPS[_pkg]={"label":_pkg,"preview":"generic","faces":[
+ [f,(f[len(_pkg)+1:] if f.startswith(_pkg+"-") else f).replace("-face","").replace("-"," "),{}]
+ for f in _INV[_pkg]]}
HTML = """<!doctype html><meta charset=utf-8><title>theme-selector</title>
<style>
body{background:#0d0b0a;color:#cdced1;font:15px/1.55 monospace;margin:20px}