[object Object]

← 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 →