aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-06-14 22:06:41 -0500
committerCraig Jennings <c@cjennings.net>2026-06-14 22:06:41 -0500
commitded61fc6bbda1662e9647b207b18ba61a4d0543b (patch)
tree05ae3b1e2c33dbd49b68b3ce55ed38245ca10203 /scripts
parent4c4a10da4ea4d5536bcc27d70cdccdec58e48060 (diff)
downloaddotemacs-ded61fc6bbda1662e9647b207b18ba61a4d0543b.tar.gz
dotemacs-ded61fc6bbda1662e9647b207b18ba61a4d0543b.zip
refactor(theme-studio): spec-table the bespoke apps, guard the palette dedup
The bespoke APPS dict was 21 hand-repeated lines of the same shape. It's now a (key, label, preview, FACES, prefix, SEED) spec list turned into the dict by one comprehension, so adding an app is one row. add_palette_color's dedup set tolerates a palette row with no name slot instead of indexing past its end.
Diffstat (limited to 'scripts')
-rw-r--r--scripts/theme-studio/generate.py51
1 files changed, 28 insertions, 23 deletions
diff --git a/scripts/theme-studio/generate.py b/scripts/theme-studio/generate.py
index 523f3206d..667e7b263 100644
--- a/scripts/theme-studio/generate.py
+++ b/scripts/theme-studio/generate.py
@@ -154,7 +154,7 @@ def add_palette_color(palette,defaults,value,label=None):
name=label or defaults.label(value,'color-'+str(len(palette)))
base=name
n=2
- used={p[1].lower() for p in palette}
+ used={(p[1] if len(p) > 1 else '').lower() for p in palette}
while name.lower() in used:
name=base+'-'+str(n); n+=1
palette.append([value,name,column_id(name)])
@@ -221,28 +221,33 @@ PALETTE,UIMAP,LOCKS=apply_seed_basics(_d,PALETTE,UIMAP,LOCKS)
PALETTE=normalize_palette(PALETTE)
SYNTAX=build_syntax(COLS,MAP,BOLD,ITALIC_MAP,DEFAULTS)
apply_syntax_seed(_d if _seed else {},SYNTAX,MAP)
-# Bespoke package face lists and seed defaults live in face_data.py.
-APPS={"org-mode":{"label":"org-mode","preview":"org","faces":face_rows(ORG_FACES,"org-",ORG_SEED)},
- "magit":{"label":"magit","preview":"magit","faces":face_rows(MAGIT_FACES,"magit-",MAGIT_SEED)},
- "elfeed":{"label":"elfeed","preview":"elfeed","faces":face_rows(ELFEED_FACES,"elfeed-",ELFEED_SEED)},
- "mu4e":{"label":"mu4e","preview":"mu4e","faces":face_rows(MU4E_FACES,"mu4e-",MU4E_SEED)},
- "ghostel":{"label":"ghostel","preview":"ghostel","faces":face_rows(GHOSTEL_FACES,"ghostel-",GHOSTEL_SEED)},
- "auto-dim-other-buffers":{"label":"auto-dim","preview":"autodim","faces":face_rows(AUTODIM_FACES,"auto-dim-other-buffers-",AUTODIM_SEED)},
- "dashboard":{"label":"dashboard","preview":"dashboard","faces":face_rows(DASHBOARD_FACES,"dashboard-",DASHBOARD_SEED)},
- "lsp-mode":{"label":"lsp-mode","preview":"lsp","faces":face_rows(LSP_FACES,"lsp-",LSP_SEED)},
- "git-gutter":{"label":"git-gutter","preview":"gitgutter","faces":face_rows(GITGUTTER_FACES,"git-gutter:",GITGUTTER_SEED)},
- "flycheck":{"label":"flycheck","preview":"flycheck","faces":face_rows(FLYCHECK_FACES,"flycheck-",FLYCHECK_SEED)},
- "dired":{"label":"dired","preview":"dired","faces":face_rows(DIRED_FACES,"dired-",DIRED_SEED)},
- "dirvish":{"label":"dirvish","preview":"dirvish","faces":face_rows(DIRVISH_FACES,"dirvish-",DIRVISH_SEED)},
- "calibredb":{"label":"calibredb","preview":"calibredb","faces":face_rows(CALIBREDB_FACES,"calibredb-",CALIBREDB_SEED)},
- "erc":{"label":"erc","preview":"erc","faces":face_rows(ERC_FACES,"erc-",ERC_SEED)},
- "org-drill":{"label":"org-drill","preview":"orgdrill","faces":face_rows(ORGDRILL_FACES,"org-drill-",ORGDRILL_SEED)},
- "org-noter":{"label":"org-noter","preview":"orgnoter","faces":face_rows(ORGNOTER_FACES,"org-noter-",ORGNOTER_SEED)},
- "signel":{"label":"signel","preview":"signel","faces":face_rows(SIGNEL_FACES,"signel-",SIGNEL_SEED)},
- "pearl":{"label":"pearl","preview":"pearl","faces":face_rows(PEARL_FACES,"pearl-",PEARL_SEED)},
- "slack":{"label":"slack","preview":"slack","faces":face_rows(SLACK_FACES,"slack-",SLACK_SEED)},
- "telega":{"label":"telega","preview":"telega","faces":face_rows(TELEGA_FACES,"telega-",TELEGA_SEED)},
- "shr":{"label":"shr (HTML: nov/eww/mail)","preview":"shr","faces":face_rows(SHR_FACES,"shr-",SHR_SEED)}}
+# Bespoke package face lists and seed defaults live in face_data.py. Each entry
+# is (key, label, preview, FACES, prefix, SEED); add an app by adding one row.
+_BESPOKE_APPS=[
+ ("org-mode","org-mode","org",ORG_FACES,"org-",ORG_SEED),
+ ("magit","magit","magit",MAGIT_FACES,"magit-",MAGIT_SEED),
+ ("elfeed","elfeed","elfeed",ELFEED_FACES,"elfeed-",ELFEED_SEED),
+ ("mu4e","mu4e","mu4e",MU4E_FACES,"mu4e-",MU4E_SEED),
+ ("ghostel","ghostel","ghostel",GHOSTEL_FACES,"ghostel-",GHOSTEL_SEED),
+ ("auto-dim-other-buffers","auto-dim","autodim",AUTODIM_FACES,"auto-dim-other-buffers-",AUTODIM_SEED),
+ ("dashboard","dashboard","dashboard",DASHBOARD_FACES,"dashboard-",DASHBOARD_SEED),
+ ("lsp-mode","lsp-mode","lsp",LSP_FACES,"lsp-",LSP_SEED),
+ ("git-gutter","git-gutter","gitgutter",GITGUTTER_FACES,"git-gutter:",GITGUTTER_SEED),
+ ("flycheck","flycheck","flycheck",FLYCHECK_FACES,"flycheck-",FLYCHECK_SEED),
+ ("dired","dired","dired",DIRED_FACES,"dired-",DIRED_SEED),
+ ("dirvish","dirvish","dirvish",DIRVISH_FACES,"dirvish-",DIRVISH_SEED),
+ ("calibredb","calibredb","calibredb",CALIBREDB_FACES,"calibredb-",CALIBREDB_SEED),
+ ("erc","erc","erc",ERC_FACES,"erc-",ERC_SEED),
+ ("org-drill","org-drill","orgdrill",ORGDRILL_FACES,"org-drill-",ORGDRILL_SEED),
+ ("org-noter","org-noter","orgnoter",ORGNOTER_FACES,"org-noter-",ORGNOTER_SEED),
+ ("signel","signel","signel",SIGNEL_FACES,"signel-",SIGNEL_SEED),
+ ("pearl","pearl","pearl",PEARL_FACES,"pearl-",PEARL_SEED),
+ ("slack","slack","slack",SLACK_FACES,"slack-",SLACK_SEED),
+ ("telega","telega","telega",TELEGA_FACES,"telega-",TELEGA_SEED),
+ ("shr","shr (HTML: nov/eww/mail)","shr",SHR_FACES,"shr-",SHR_SEED),
+]
+APPS={key:{"label":label,"preview":preview,"faces":face_rows(faces,prefix,seed)}
+ for key,label,preview,faces,prefix,seed in _BESPOKE_APPS}
# 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")