UNPKG

fabric

Version:

Object model for HTML5 canvas, and SVG-to-canvas parser. Backed by jsdom and node-canvas.

1 lines 4.57 kB
{"version":3,"file":"lang_string.min.mjs","names":[],"sources":["../../../src/util/lang_string.ts"],"sourcesContent":["import { getFabricWindow } from '../env';\n\n/**\n * Capitalizes a string\n * @param {String} string String to capitalize\n * @param {Boolean} [firstLetterOnly] If true only first letter is capitalized\n * and other letters stay untouched, if false first letter is capitalized\n * and other letters are converted to lowercase.\n * @return {String} Capitalized version of a string\n */\nexport const capitalize = (string: string, firstLetterOnly = false): string =>\n `${string.charAt(0).toUpperCase()}${\n firstLetterOnly ? string.slice(1) : string.slice(1).toLowerCase()\n }`;\n\n/**\n * Escapes XML in a string\n * @param {String} string String to escape\n * @return {String} Escaped version of a string\n */\nexport const escapeXml = (stringOrNumber: string | number): string =>\n stringOrNumber\n .toString()\n .replace(/&/g, '&amp;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;');\n\nlet segmenter: Intl.Segmenter | false;\n\nconst getSegmenter = () => {\n if (!segmenter) {\n segmenter =\n 'Intl' in getFabricWindow() &&\n 'Segmenter' in Intl &&\n new Intl.Segmenter(undefined, {\n granularity: 'grapheme',\n });\n }\n return segmenter;\n};\n\n/**\n * Divide a string in the user perceived single units\n * @param {String} textstring String to escape\n * @return {Array} array containing the graphemes\n */\nexport const graphemeSplit = (textstring: string): string[] => {\n segmenter || getSegmenter();\n if (segmenter) {\n const segments = segmenter.segment(textstring);\n return Array.from(segments).map(({ segment }) => segment);\n }\n\n //Fallback\n return graphemeSplitImpl(textstring);\n};\n\nconst graphemeSplitImpl = (textstring: string): string[] => {\n const graphemes: string[] = [];\n for (let i = 0, chr; i < textstring.length; i++) {\n if ((chr = getWholeChar(textstring, i)) === false) {\n continue;\n }\n graphemes.push(chr);\n }\n return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | false => {\n const code = str.charCodeAt(i);\n if (isNaN(code)) {\n return ''; // Position not found\n }\n if (code < 0xd800 || code > 0xdfff) {\n return str.charAt(i);\n }\n\n // High surrogate (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 <= code && code <= 0xdbff) {\n if (str.length <= i + 1) {\n throw 'High surrogate without following low surrogate';\n }\n const next = str.charCodeAt(i + 1);\n if (0xdc00 > next || next > 0xdfff) {\n throw 'High surrogate without following low surrogate';\n }\n return str.charAt(i) + str.charAt(i + 1);\n }\n // Low surrogate (0xDC00 <= code && code <= 0xDFFF)\n if (i === 0) {\n throw 'Low surrogate without preceding high surrogate';\n }\n const prev = str.charCodeAt(i - 1);\n\n // (could change last hex to 0xDB7F to treat high private\n // surrogates as single characters)\n if (0xd800 > prev || prev > 0xdbff) {\n throw 'Low surrogate without preceding high surrogate';\n }\n // We can pass over low surrogates now as the second component\n // in a pair which we have already processed\n return false;\n};\n"],"mappings":"8LAUA,MAAa,GAAc,EAAgB,EAAA,CAAkB,IAC3D,GAAG,EAAO,OAAO,EAAA,CAAG,aAAA,GAClB,EAAkB,EAAO,MAAM,EAAA,CAAK,EAAO,MAAM,EAAA,CAAG,aAAA,GAQ3C,EAAa,GACxB,EACG,UAAA,CACA,QAAQ,KAAM,QAAA,CACd,QAAQ,KAAM,SAAA,CACd,QAAQ,KAAM,SAAA,CACd,QAAQ,KAAM,OAAA,CACd,QAAQ,KAAM,OAAA,CAEnB,IAAI,EAEJ,MAiBa,EAAiB,GAAA,CAE5B,GADA,GAjBK,IACH,EACE,SAAU,GAAA,EACV,cAAe,MACf,IAAI,KAAK,UAAA,IAAU,GAAW,CAC5B,YAAa,WAAA,CAAA,EAaf,EAAW,CACb,IAAM,EAAW,EAAU,QAAQ,EAAA,CACnC,OAAO,MAAM,KAAK,EAAA,CAAU,KAAA,CAAO,QAAA,KAAc,EAAA,CAInD,OAAO,EAAkB,EAAA,EAGrB,EAAqB,GAAA,CACzB,IAAM,EAAsB,EAAA,CAC5B,IAAK,IAAW,EAAP,EAAI,EAAQ,EAAI,EAAW,OAAQ,IAAA,CACE,KAAvC,EAAM,EAAa,EAAY,EAAA,GAGpC,EAAU,KAAK,EAAA,CAEjB,OAAO,GAIH,GAAgB,EAAa,IAAA,CACjC,IAAM,EAAO,EAAI,WAAW,EAAA,CAC5B,GAAI,MAAM,EAAA,CACR,MAAO,GAET,GAAI,EAAO,OAAU,EAAO,MAC1B,OAAO,EAAI,OAAO,EAAA,CAKpB,GAAI,OAAU,GAAQ,GAAQ,MAAQ,CACpC,GAAI,EAAI,QAAU,EAAI,EACpB,KAAM,iDAER,IAAM,EAAO,EAAI,WAAW,EAAI,EAAA,CAChC,GAAI,MAAS,GAAQ,EAAO,MAC1B,KAAM,iDAER,OAAO,EAAI,OAAO,EAAA,CAAK,EAAI,OAAO,EAAI,EAAA,CAGxC,GAAI,IAAM,EACR,KAAM,iDAER,IAAM,EAAO,EAAI,WAAW,EAAI,EAAA,CAIhC,GAAI,MAAS,GAAQ,EAAO,MAC1B,KAAM,iDAIR,MAAA,CAAO,GAAA,OAAA,KAAA,UAAA,KAAA,cAAA,KAAA"}