{"version":3,"names":["stringFormat","str","args","replace","_match","index","truncateHtml","text","length","truncated","substring","lastIndexOf","eliminateHTMLTagCount","trim","truncatedEndTagExpr","truncatedEndTagMatch","exec","truncatedEndTag","startTagExpr","RegExp","testString","startTagMatch","startTag","reverseHtml","reverseTagOpenExpr","tagMatch","tag","tagName","startPos","endPos","fragment","test","match","endTag","startTagCount","endTagCount","startTagCharLength","endTagCharLength","totalTagLengthCount","ph","String","fromCharCode","result","split","reverse","join","indexOf","stripHtml","htmlString","shortenString","maxlength","endChars","shortenLink","link","toConstantCase","replaceAll","positions","i","push","pos","forEach","insert","toUpperCase","main_string","ins_string","slice","find","Object","prototype","toString","call","toLowerCase","camelToDashCase","v","ret","prevLowercase","prevIsNumber","s","isUppercase","isNumber","isNaN"],"sources":["src/utils/string-format.ts"],"sourcesContent":["/**\n * Replaces placeholders like {0} in the given string with the arguments at the matching position.\n * @param str The input string with placeholders, e.g. \"Hello {0}\"\n * @param args The sorted arguments matching the placeholders, e.g. \"World\"\n * @example stringFormat(\"Hello {0} {1}\", \"beautiful\", \"World!\") // returns \"Hello beautiful World!\"\n * @example stringFormat(\"Hello {0}, {0}\", \"beauty\", \"World\") // returns \"Hello beauty, beauty!\"\n * @example stringFormat(\"Hello {1}, {0}\", \"beauty\", \"World\") // returns \"Hello World, beauty!\"\n */\nexport const stringFormat = (str: string, ...args: string[]) => {\n if (!str) {\n return \"\";\n }\n return str.replace(/{(\\d+)}/g, (_match, index) => args[index] || \"\");\n};\n\nexport const truncateHtml = (text, length) => {\n var truncated = text.substring(0, text.lastIndexOf(\" \", length + eliminateHTMLTagCount(text)));\n // Remove line breaks and surrounding whitespace\n truncated = truncated.replace(/(\\r\\n|\\n|\\r)/gm, \"\").trim();\n // If the text ends with an incomplete start tag, trim it off\n truncated = truncated.replace(/<(\\w*)(?:(?:\\s\\w+(?:={0,1}([\"']{0,1})\\w*\\2{0,1})))*$/g, \"\");\n // If the text ends with a truncated end tag, fix it.\n var truncatedEndTagExpr = /<\\/((?:\\w*))$/g;\n var truncatedEndTagMatch = truncatedEndTagExpr.exec(truncated);\n if (truncatedEndTagMatch != null) {\n var truncatedEndTag = truncatedEndTagMatch[1];\n // Check to see if there's an identifiable tag in the end tag\n if (truncatedEndTag.length > 0) {\n // If so, find the start tag, and close it\n var startTagExpr = new RegExp(\"<(\" + truncatedEndTag + \"\\\\w?)(?:(?:\\\\s\\\\w+(?:=([\\\"'])\\\\w*\\\\2)))*>\");\n var testString = truncated;\n var startTagMatch = startTagExpr.exec(testString);\n\n var startTag = null;\n while (startTagMatch != null) {\n startTag = startTagMatch[1];\n testString = testString.replace(startTagExpr, \"\");\n startTagMatch = startTagExpr.exec(testString);\n }\n if (startTag != null) {\n truncated = truncated.replace(truncatedEndTagExpr, \"\");\n }\n } else {\n // Otherwise, cull off the broken end tag\n truncated = truncated.replace(truncatedEndTagExpr, \"\");\n }\n }\n // Now the tricky part. Reverse the text, and look for opening tags. For each opening tag,\n // check to see that he closing tag before it is for that tag. If not, append a closing tag.\n var testString = reverseHtml(truncated);\n var reverseTagOpenExpr = /<(?:([\"'])\\w*\\1=\\w+ )*(\\w*)>/;\n var tagMatch = reverseTagOpenExpr.exec(testString);\n while (tagMatch != null) {\n var tag = tagMatch[0];\n var tagName = tagMatch[2];\n var startPos = tagMatch.index;\n var endPos = startPos + tag.length;\n var fragment = testString.substring(0, endPos);\n // Test to see if an end tag is found in the fragment. If not, append one to the end\n // of the truncated HTML, thus closing the last unclosed tag\n if (!new RegExp(\"<\" + tagName + \"/>\").test(fragment)) {\n truncated += \"\";\n }\n // Get rid of the already tested fragment\n testString = testString.replace(fragment, \"\");\n // Get another tag to test\n tagMatch = reverseTagOpenExpr.exec(testString);\n }\n return truncated;\n};\n\nfunction eliminateHTMLTagCount(text) {\n const startTag = text.match(new RegExp(/(<([^>]+)>)/gi.exec(text)[0], \"gi\"));\n const endTag = text.match(new RegExp(/(<[/]([^>]+)>)/gi.exec(text)[0], \"gi\"));\n // Total count of start and end tags in a string\n const startTagCount = startTag.length;\n const endTagCount = endTag.length;\n // Total character count of start and end tags in a string\n const startTagCharLength = startTag[0].length * startTagCount;\n const endTagCharLength = endTag[0].length * endTagCount;\n // Overall character count of both tags in a string\n const totalTagLengthCount = startTagCharLength + endTagCharLength;\n return totalTagLengthCount;\n}\n\nfunction reverseHtml(str) {\n var ph = String.fromCharCode(206);\n var result = str.split(\"\").reverse().join(\"\");\n while (result.indexOf(\"<\") > -1) {\n result = result.replace(\"<\", ph);\n }\n while (result.indexOf(\">\") > -1) {\n result = result.replace(\">\", \"<\");\n }\n while (result.indexOf(ph) > -1) {\n result = result.replace(ph, \">\");\n }\n return result;\n}\n\nexport const stripHtml = (htmlString: string) => {\n return htmlString.replace(/<\\/?[^>]+(>|$)/g, \"\");\n};\n\n/**\n * Shortens a string without cutting words\n * @param str The string to be shorten\n * @param maxlength max length of the string\n * @param endChars charakters to be added to the shortened string ( \"...\" for example)\n */\nexport const shortenString = (str, maxlength, endChars) => {\n return str.substring(0, str.lastIndexOf(\" \", maxlength)) + endChars;\n};\n\n/**\n * remove protocol and third-level-domain (subdomain) from link\n * @param link {string}\n */\nexport const shortenLink = (link: string) => {\n return link.replace(/^(?:https?:\\/\\/)?(?:www\\.)?/i, \"\");\n};\n\n/**\n * Converts a string to a CONSTANT_CASE\n * @param str str to be converted\n * @returns the converted string\n */\nexport const toConstantCase = (str: string): string => {\n //replace whitespace with underscore\n str = replaceAll(str, \" \", \"_\");\n //replace \"-\" if it was dashCase\n str = replaceAll(str, \"-\", \"_\");\n let positions = [];\n //get position of every uppercase character\n for (var i = 0; i < str.length; i++) {\n if (str[i].match(/[A-Z]/) != null) {\n positions.push(i);\n }\n }\n let pos = 0;\n // Why? => pos += 1;\n // At the first time coloumn 137 we find ozt all the position whos hsa a uppercase, after find out the position,\n // we add a \"_\", so that the second position dont fit because we add \"_\" (pos +1), if we found a third uppercase character,\n // e.g \"mellowYellowMuted\", we add two \"_\", so on the third run we add tweo to pos,\n\n positions.forEach((index) => {\n str = insert(str, \"_\", index + pos);\n pos += 1;\n });\n return str.toUpperCase();\n};\n\n/**\n * Inserts a string into a specific position on another string\n * @param main_string The main string\n * @param ins_string The string to be inserted\n * @param pos the position where the inserted string will be\n * @returns the changed string\n */\nconst insert = function insert(main_string, ins_string, pos) {\n if (typeof pos == \"undefined\") {\n pos = 0;\n }\n if (typeof ins_string == \"undefined\") {\n ins_string = \"\";\n }\n return main_string.slice(0, pos) + ins_string + main_string.slice(pos);\n};\n\n/**\n * Replaces all occurrences inside a string\n * @param str The string where the replacement should happen\n * @param find the string to find\n * @param replace the string to replace\n * @returns Returns the string with the replacements\n */\nconst replaceAll = function (str, find, replace) {\n // If a regex pattern\n if (Object.prototype.toString.call(find).toLowerCase() === \"[object regexp]\") {\n return str.replace(find, replace);\n }\n\n // If a string\n return str.replace(new RegExp(find, \"g\"), replace);\n};\n\nexport const camelToDashCase = (v) => {\n let ret = \"\",\n prevLowercase = false,\n prevIsNumber = false;\n for (let s of v) {\n const isUppercase = s.toUpperCase() === s;\n const isNumber = !isNaN(s);\n if (isNumber) {\n if (prevLowercase) {\n // ret += \"-\";\n }\n } else {\n if (isUppercase && (prevLowercase || prevIsNumber)) {\n ret += \"-\";\n }\n }\n ret += s;\n prevLowercase = !isUppercase;\n prevIsNumber = isNumber;\n }\n return ret.replace(/-+/g, \"-\").toLowerCase();\n};\n"],"mappings":"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"}