{"version":3,"file":"lang_string.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":";;;;;;;;;;;;;;;;AAUA,MAAa,cAAc,QAAgB,kBAAkB,UAC3D,GAAG,OAAO,OAAO,EAAE,CAAC,aAAa,GAC/B,kBAAkB,OAAO,MAAM,EAAE,GAAG,OAAO,MAAM,EAAE,CAAC,aAAa;;;;;;AAQrE,MAAa,aAAa,mBACxB,eACG,UAAU,CACV,QAAQ,MAAM,QAAQ,CACtB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,SAAS,CACvB,QAAQ,MAAM,OAAO,CACrB,QAAQ,MAAM,OAAO;AAE1B,IAAI;AAEJ,MAAM,qBAAqB;AACzB,KAAI,CAAC,UACH,aACE,UAAU,iBAAiB,IAC3B,eAAe,QACf,IAAI,KAAK,UAAU,KAAA,GAAW,EAC5B,aAAa,YACd,CAAC;AAEN,QAAO;;;;;;;AAQT,MAAa,iBAAiB,eAAiC;AAC7D,cAAa,cAAc;AAC3B,KAAI,WAAW;EACb,MAAM,WAAW,UAAU,QAAQ,WAAW;AAC9C,SAAO,MAAM,KAAK,SAAS,CAAC,KAAK,EAAE,cAAc,QAAQ;;AAI3D,QAAO,kBAAkB,WAAW;;AAGtC,MAAM,qBAAqB,eAAiC;CAC1D,MAAM,YAAsB,EAAE;AAC9B,MAAK,IAAI,IAAI,GAAG,KAAK,IAAI,WAAW,QAAQ,KAAK;AAC/C,OAAK,MAAM,aAAa,YAAY,EAAE,MAAM,MAC1C;AAEF,YAAU,KAAK,IAAI;;AAErB,QAAO;;AAIT,MAAM,gBAAgB,KAAa,MAA8B;CAC/D,MAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,KAAI,MAAM,KAAK,CACb,QAAO;AAET,KAAI,OAAO,SAAU,OAAO,MAC1B,QAAO,IAAI,OAAO,EAAE;AAKtB,KAAI,SAAU,QAAQ,QAAQ,OAAQ;AACpC,MAAI,IAAI,UAAU,IAAI,EACpB,OAAM;EAER,MAAM,OAAO,IAAI,WAAW,IAAI,EAAE;AAClC,MAAI,QAAS,QAAQ,OAAO,MAC1B,OAAM;AAER,SAAO,IAAI,OAAO,EAAE,GAAG,IAAI,OAAO,IAAI,EAAE;;AAG1C,KAAI,MAAM,EACR,OAAM;CAER,MAAM,OAAO,IAAI,WAAW,IAAI,EAAE;AAIlC,KAAI,QAAS,QAAQ,OAAO,MAC1B,OAAM;AAIR,QAAO"}