class Sigil { // Convert string to sigil array static generate(str) { if (!str) return []; // Convert to lowercase, remove non-word characters const cleaned = str.toLowerCase().replace(/[^a-z]/g, ''); // Remove vowels const noVowels = cleaned.replace(/[aeiou]/g, ''); // Remove duplicate characters const deduped = [...new Set(noVowels)].join(''); // Convert to ASCII values and get digital roots return [...deduped].map(char => { const ascii = char.charCodeAt(0); return Sigil.getDigitalRoot(ascii); }); } // Get digital root of a number (sum digits until single digit) static getDigitalRoot(num) { if (num < 10) return num; return Sigil.getDigitalRoot([...num.toString()].reduce((sum, digit) => sum + parseInt(digit), 0)); } // Helper to validate and debug sigil generation static debug(str) { console.log({ original: str, lowercase: str.toLowerCase(), cleaned: str.toLowerCase().replace(/[^a-z]/g, ''), noVowels: str.toLowerCase().replace(/[^a-z]/g, '').replace(/[aeiou]/g, ''), deduped: [...new Set(str.toLowerCase().replace(/[^a-z]/g, '').replace(/[aeiou]/g, ''))].join(''), sigil: Sigil.generate(str) }); } } // Export for use in other files if (typeof module !== 'undefined' && module.exports) { module.exports = Sigil; }