{"version":3,"file":"lang_string.min.mjs","sources":["../../../src/util/lang_string.ts"],"sourcesContent":["/**\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 = (string: string): string =>\n  string\n    .replace(/&/g, '&amp;')\n    .replace(/\"/g, '&quot;')\n    .replace(/'/g, '&apos;')\n    .replace(/</g, '&lt;')\n    .replace(/>/g, '&gt;');\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  const graphemes = [];\n  for (let i = 0, chr; i < textstring.length; i++) {\n    if ((chr = getWholeChar(textstring, i)) === false) {\n      continue;\n    }\n    graphemes.push(chr as string);\n  }\n  return graphemes;\n};\n\n// taken from mdn in the charAt doc page.\nconst getWholeChar = (str: string, i: number): string | boolean => {\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"],"names":["capitalize","string","firstLetterOnly","arguments","length","undefined","concat","charAt","toUpperCase","slice","toLowerCase","escapeXml","replace","graphemeSplit","textstring","graphemes","chr","i","getWholeChar","push","str","code","charCodeAt","isNaN","next","prev"],"mappings":"AAQaA,MAAAA,EAAa,SAACC,GAAc,IAAEC,EAAeC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,IAAAA,UAAA,GAAQ,MAAA,GAAAG,OAC7DL,EAAOM,OAAO,GAAGC,eAAaF,OAC/BJ,EAAkBD,EAAOQ,MAAM,GAAKR,EAAOQ,MAAM,GAAGC,cAAa,EAQxDC,EAAaV,GACxBA,EACGW,QAAQ,KAAM,SACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,UACdA,QAAQ,KAAM,QACdA,QAAQ,KAAM,QAONC,EAAiBC,IAC5B,MAAMC,EAAY,GAClB,IAAK,IAAWC,EAAPC,EAAI,EAAQA,EAAIH,EAAWV,OAAQa,KACE,KAAvCD,EAAME,EAAaJ,EAAYG,KAGpCF,EAAUI,KAAKH,GAEjB,OAAOD,CAAS,EAIZG,EAAeA,CAACE,EAAaH,KACjC,MAAMI,EAAOD,EAAIE,WAAWL,GAC5B,GAAIM,MAAMF,GACR,MAAO,GAET,GAAIA,EAAO,OAAUA,EAAO,MAC1B,OAAOD,EAAIb,OAAOU,GAKpB,GAAI,OAAUI,GAAQA,GAAQ,MAAQ,CACpC,GAAID,EAAIhB,QAAUa,EAAI,EACpB,KAAM,iDAER,MAAMO,EAAOJ,EAAIE,WAAWL,EAAI,GAChC,GAAI,MAASO,GAAQA,EAAO,MAC1B,KAAM,iDAER,OAAOJ,EAAIb,OAAOU,GAAKG,EAAIb,OAAOU,EAAI,EACxC,CAEA,GAAU,IAANA,EACF,KAAM,iDAER,MAAMQ,EAAOL,EAAIE,WAAWL,EAAI,GAIhC,GAAI,MAASQ,GAAQA,EAAO,MAC1B,KAAM,iDAIR,OAAO,CAAK"}