← back to Rebel Walls Push
title-caser preserves 3D/ABC/acronym tokens
87b713367bb719ef991f4d486ff9a75f4df7863a · 2026-06-04 00:12:39 -0700 · Steve
Files touched
Diff
commit 87b713367bb719ef991f4d486ff9a75f4df7863a
Author: Steve <steve@designerwallcoverings.com>
Date: Thu Jun 4 00:12:39 2026 -0700
title-caser preserves 3D/ABC/acronym tokens
---
scripts/push.js | 19 ++++++++++++++++---
1 file changed, 16 insertions(+), 3 deletions(-)
diff --git a/scripts/push.js b/scripts/push.js
index 1efa9eb..0ecd088 100644
--- a/scripts/push.js
+++ b/scripts/push.js
@@ -124,9 +124,22 @@ const sleep = ms => new Promise(r => setTimeout(r, ms));
// ---- build helpers ------------------------------------------------------
function titleCase(s) {
if (!s) return s;
- return s.replace(/\w[^\s-]*/g, w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase())
- .replace(/\b(Of|And|The|In|On|For|A|An|To|With)\b/g, m => m.toLowerCase())
- .replace(/^(\w)/, c => c.toUpperCase());
+ const minor = new Set(['of','and','the','in','on','for','a','an','to','with']);
+ const words = s.split(/(\s+|-)/);
+ let wi = 0;
+ return words.map(tok => {
+ if (/^\s+$/.test(tok) || tok === '-') return tok;
+ const first = wi === 0;
+ wi++;
+ // preserve tokens that already carry a digit or an internal/leading capital (3D, ABC, McKay, R19794)
+ if (/\d/.test(tok) || /[A-Z]/.test(tok.slice(1)) || tok === tok.toUpperCase() && tok.length <= 4 && /[A-Z]/.test(tok)) {
+ // normalize a leading digit+letter like "3d" -> "3D"
+ return tok.replace(/^(\d+)([a-z])/, (m, d, l) => d + l.toUpperCase());
+ }
+ const low = tok.toLowerCase();
+ if (!first && minor.has(low)) return low;
+ return low.charAt(0).toUpperCase() + low.slice(1);
+ }).join('');
}
function buildTitle(row) {
// Format: "Pattern Name, Color | Rebel Walls". No color -> skip color segment. Never "Unknown", never "Wallpaper".
← 3dcaf20 rebel walls -> shopify pusher (productSet, draft, sample var
·
back to Rebel Walls Push
·
align metafield types to store defs; canary 5 verified clean f6de296 →