diff options
Diffstat (limited to 'src/lib/utils/glyph_hash.ts')
| -rw-r--r-- | src/lib/utils/glyph_hash.ts | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/src/lib/utils/glyph_hash.ts b/src/lib/utils/glyph_hash.ts new file mode 100644 index 0000000..b704569 --- /dev/null +++ b/src/lib/utils/glyph_hash.ts @@ -0,0 +1,55 @@ +export type GlyphHash = GlyphHashFragment[]; +type GlyphHashFragment = { + glyph: string, + color: string +}; + +const internals = { + kDehyphenRegex: /[-]/g, + kSplitterRegex: /.{1,8}/g, + kGlyphs: [ + '☽', + '☆', + '♢', + '♡', + '╱', + '╲', + '╳', + '〰', + '▷', + '⏊', + '〒', + '▢', + '◯', + '⏃', + '⏀', + '⏆' + ], + unexpectedUUIDLength: class UnexpectedUUIDLength extends Error { + name = 'UnexpectedUUIDLength'; + message = 'The provided string was not a valid UUIDv4, please provide a 32 character long string' + } +}; + +// Return a glyph with color based on a 4 byte fragment of a UUIDv4 +const getGlyphHashFragment = function (uuidFragment: string): GlyphHashFragment { + + const glyphIndex = parseInt(uuidFragment.substring(0, 2), 16) % 16; + return { + glyph: internals.kGlyphs[glyphIndex], + color: `#${uuidFragment.substring(2, 8)}` + }; +}; + +// Return an array of glyphs based on a UUIDv4 +export const getGlyphHash = function (uuid: string): GlyphHash { + + const dehyphenedUuid = uuid.replace(/[-]/g, ''); + + if (dehyphenedUuid.length !== 32) { + throw new internals.unexpectedUUIDLength(); + } + + const hashFragments = dehyphenedUuid.match(internals.kSplitterRegex); + return hashFragments.map(getGlyphHashFragment); +}; |