diff options
| -rw-r--r-- | js/src/index.ts | 22 | ||||
| -rw-r--r-- | js/test/tests.ts | 48 |
2 files changed, 48 insertions, 22 deletions
diff --git a/js/src/index.ts b/js/src/index.ts index 13b1f3b..1563b59 100644 --- a/js/src/index.ts +++ b/js/src/index.ts @@ -1,15 +1,20 @@ import dingbats from "./dingbats"; -interface UnicodeScalarValue { +export interface UnicodeScalarValue { codePoint: number; + string: string; } const dingbatsByDec: {[key: string]: UnicodeScalarValue} = {}; const dingbatsByHex: {[key: string]: UnicodeScalarValue} = {}; +const fromCodePoint = String.fromCodePoint ? String.fromCodePoint : fromCodePointPolyfill; + for (const dingbat of dingbats) { + const codePoint = parseInt(dingbat["Unicode dec"], 10); const scalarValue = { - codePoint: parseInt(dingbat["Unicode dec"], 10), + codePoint: codePoint, + string: fromCodePoint(codePoint), }; dingbatsByDec[dingbat["Typeface name"] + "_" + dingbat["Dingbat dec"]] = scalarValue; @@ -27,3 +32,16 @@ export function dec(typeface: string, dec: string): UnicodeScalarValue | undefin export function hex(typeface: string, hex: string): UnicodeScalarValue | undefined { return dingbatsByHex[typeface + "_" + hex.toUpperCase()]; } + +function fromCodePointPolyfill(codePoint: number) { + if (codePoint <= 0xFFFF) { + // BMP + return String.fromCharCode(codePoint); + } else { + // Astral + // https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae + const highSurrogate = Math.floor((codePoint - 0x10000) / 0x400) + 0xD800; + const lowSurrogate = (codePoint - 0x10000) % 0x400 + 0xDC00; + return String.fromCharCode(highSurrogate, lowSurrogate); + } +}; diff --git a/js/test/tests.ts b/js/test/tests.ts index a00b827..68a4bdf 100644 --- a/js/test/tests.ts +++ b/js/test/tests.ts @@ -3,41 +3,49 @@ import assert from "assert"; import * as dingbatToUnicode from "../"; export function canConvertFromDingbatCodePointToUnicode() { - const result = dingbatToUnicode.codePoint("Wingdings", 41); + const result = dingbatToUnicode.codePoint("Wingdings", 41)!!; - assert.deepStrictEqual(result, { - codePoint: 0x2706, - }); + assert.strictEqual(result.codePoint, 0x2706); } export function canConvertFromDecimalDingbatToUnicode() { - const result = dingbatToUnicode.dec("Wingdings", "41"); + const result = dingbatToUnicode.dec("Wingdings", "41")!!; - assert.deepStrictEqual(result, { - codePoint: 0x2706, - }); + assert.strictEqual(result.codePoint, 0x2706); } export function canConvertFromHexDingbatToUnicode() { - const result = dingbatToUnicode.hex("Wingdings", "29"); + const result = dingbatToUnicode.hex("Wingdings", "29")!!; - assert.deepStrictEqual(result, { - codePoint: 0x2706, - }); + assert.strictEqual(result.codePoint, 0x2706); } export function canConvertFromUppercaseHexDingbatToUnicode() { - const result = dingbatToUnicode.hex("Wingdings", "3E"); + const result = dingbatToUnicode.hex("Wingdings", "3E")!!; - assert.deepStrictEqual(result, { - codePoint: 0x2707, - }); + assert.strictEqual(result.codePoint, 0x2707); } export function canConvertFromLowercaseHexDingbatToUnicode() { - const result = dingbatToUnicode.hex("Wingdings", "3e"); + const result = dingbatToUnicode.hex("Wingdings", "3e")!!; - assert.deepStrictEqual(result, { - codePoint: 0x2707, - }); + assert.strictEqual(result.codePoint, 0x2707); +} + +export function returnedValueIncludesCodePoint() { + const result = dingbatToUnicode.hex("Wingdings", "29")!!; + + assert.strictEqual(result.codePoint, 0x2706); +} + +export function whenUnicodeCodePointIsInBmpThenReturnedValueIncludesString() { + const result = dingbatToUnicode.hex("Wingdings", "29")!!; + + assert.strictEqual(result.string, "\u2706"); +} + +export function whenUnicodeCodePointIsInAstralPlaneThenReturnedValueIncludesString() { + const result = dingbatToUnicode.hex("Wingdings", "28")!!; + + assert.strictEqual(result.string, "🕿"); } |
