{"version":3,"sources":["../src/utils.ts","../src/styleLibrary.ts","../src/parser/textToHTML.ts","../src/parser/JSONToHTML.ts","../src/parser/JSONToCleanedText.ts","../src/parser/textToJSON.ts","../src/parser/autoToHTML.ts","../src/parser/autoCleanToText.ts","../src/index.ts"],"sourcesContent":["/*\n * minecraft motd parser\n * (c) 2023 Kevin Zheng\n * Released under the MIT license\n */\n\nimport { motdJsonType } from \"./types\";\n\n\n\n\n/**\n * Base color code regex\n */\nexport const baseColorCodeRegex = /([§][0-9a-fA-FklmnorKLMNOR])/g;\n\n\n\n// Type checking function\nexport function isMotdJSONType(object: unknown): object is motdJsonType {\n  // basic type check\n  if (!object || typeof object !== \"object\" || Array.isArray(object)) {\n    return false;\n  }\n\n  // check if has necessary property\n  const hasText = \"text\" in object;\n  const hasTranslate = \"translate\" in object;\n  const hasExtra = \"extra\" in object && Array.isArray(object.extra);\n\n  // MOTD JSON at least need one of text, translate or extra\n  return hasText || hasTranslate || hasExtra;\n}\n\n\n\n/**\n * Replace all HTML special characters with HTML entities\n * Prevents HTML injection by safely encoding special characters\n */\nexport function htmlStringFormatting(text: string): string {\n  if (!text || typeof text !== \"string\") {\n    return \"\";\n  }\n\n  return (\n    text\n      // First handle & character, but avoid breaking existing HTML entities\n      // Use negative lookahead to prevent double-encoding existing HTML entities\n      .replace(/&(?!(?:amp|lt|gt|quot|#39|#x[0-9A-Fa-f]+|#[0-9]+);)/g, \"&amp;\")\n      .replace(/</g, \"&lt;\")\n      .replace(/>/g, \"&gt;\")\n      .replace(/\"/g, \"&quot;\")\n      .replace(/'/g, \"&#39;\")\n      // Convert newlines to HTML line breaks\n      .replace(/\\n/g, \"<br/>\")\n  );\n};\n\n\n\n/**\n * Clean HTML tags safely\n * \n * Safely removes HTML tags and prevents HTML injection vulnerabilities.\n * \n * @param text - Input text that may contain HTML tags\n * @example `<span>hello world</span>` → `hello world`\n * \n * @returns Clean text without HTML tags\n */\nexport function cleanHtmlTags(text: string): string {\n  if (!text || typeof text !== \"string\") {\n    return \"\";\n  }\n\n  let cleanedText = \"\";\n\n  // === Config ===\n  const DANGEROUS_TAGS = new Set([\n    \"script\", \"style\", \"noscript\",\n    \"iframe\", \"object\", \"embed\", \"applet\",\n    \"svg\", \"math\", \"foreignobject\",\n  ]);\n\n  // === FSM States ===\n  enum State {\n    TEXT,        // Normal text\n    TAG,         // Currently consuming a normal tag until >\n    SKIP_BLOCK,  // Currently skipping dangerous block until </tag>\n    COMMENT      // HTML comment <!-- ... -->\n  }\n\n  let state = State.TEXT;\n  let tagName = \"\";          // Temporary storage for encountered tag name\n  let skipUntil = \"\";        // Corresponding \"</tag>\" for dangerous block\n  const len = text.length;\n\n  for (let i = 0; i < len; i++) {\n    const ch = text[i];\n\n    /* --------------- TEXT -> TAG/COMMENT --------------- */\n    if (state === State.TEXT && ch === \"<\") {\n      // Check if it's an HTML comment\n      if (text.slice(i, i + 4) === \"<!--\") {\n        state = State.COMMENT;\n        continue;\n      }\n\n      // Try to extract tag name\n      let j = i + 1;\n      let isClosing = false;\n\n      // Skip '/'\n      if (j < len && text[j] === \"/\") {\n        isClosing = true;\n        j++;\n      }\n      // Skip whitespace\n      while (j < len && /\\s/.test(text[j])) j++;\n\n      // Extract tagName (a~z or A~Z or 0-9 or -)\n      const start = j;\n      while (j < len && /[A-Za-z0-9-]/.test(text[j])) j++;\n\n      tagName = text.slice(start, j).toLowerCase();\n\n      /* Dangerous block ── only \"opening tag\" starts skip */\n      if (!isClosing && DANGEROUS_TAGS.has(tagName)) {\n        state = State.SKIP_BLOCK;\n        skipUntil = `</${tagName}>`;\n      } else {\n        state = State.TAG;\n      }\n      continue;\n    }\n\n    /* --------------- TAG -> TEXT --------------- */\n    if (state === State.TAG) {\n      if (ch === \">\") state = State.TEXT;\n      // Don't write to output\n      continue;\n    }\n\n    /* --------------- COMMENT -> TEXT --------------- */\n    if (state === State.COMMENT) {\n      // Check for comment end -->\n      if (text.slice(i, i + 3) === \"-->\") {\n        i += 2; // Skip '-->'\n        state = State.TEXT;\n      }\n      continue;\n    }\n\n    /* --------------- SKIP_BLOCK Logic --------------- */\n    if (state === State.SKIP_BLOCK) {\n      // Transition: SKIP_BLOCK -> TEXT\n      // Check if the current segment matches the end tag (e.g., </script>)\n      if (\n        ch === \"<\" &&\n        text.slice(i, i + skipUntil.length).toLowerCase() === skipUntil\n      ) {\n        // Skip the entire end tag (case-insensitive match)\n        i += skipUntil.length - 1;\n        state = State.TEXT; // Return to TEXT state\n      }\n      continue; // Consume all content until the end tag is found\n    }\n\n    /* --------------- TEXT State: Normal output --------------- */\n    if (state === State.TEXT) {\n      cleanedText += ch;\n    }\n  }\n\n  return cleanedText.trim();\n}\n\n\n\n/**\n * Clean MOTD color codes\n * \n * Clean all formatting codes from MOTD source string.\n * \n * @param {string} text - MOTD string with § formatting codes to be removed\n * @returns {string} Text without MOTD formatting codes\n */\nexport function cleanCodes(text: string): string {\n  const REGEX = /(?:§)([0-9a-fA-FklmnorFKLMNOR])/g;\n  let textResult = \"\";\n\n  textResult = text.replace(REGEX, \"\");\n\n  return textResult;\n};\n","import { extraLibraryType } from \"./types\";\n\n\n\n// color code to font styles\nconst extras: extraLibraryType = {\n  \"§k\": \"obfuscated;\",\n  \"§l\": \"font-weight: bold;\",\n  \"§m\": \"text-decoration: line-through;\",\n  \"§n\": \"text-decoration: underline;\",\n  \"§o\": \"font-style: italic;\",\n  \"§r\": \"color: inherit;text-decoration: none !important;font-weight:normal!important;font-style: normal!important;\",\n};\n\n// json extra font styles\nconst extraFontStyles: extraLibraryType = {\n  bold: \"font-weight: bold;\",\n  italic: \"font-style: italic;\",\n  underlined: \"text-decoration:underline;\",\n  strikethrough: \"text-decoration: line-through;\",\n  obfuscated: \"mc_obfuscated;\",\n  reset: \"color: inherit;text-decoration: none !important;font-weight:normal!important;font-style: normal!important;\",\n};\n\n// text to json extra name\nconst textToJsonExtras: extraLibraryType = {\n  \"§k\": \"obfuscated\",\n  \"§l\": \"bold\",\n  \"§m\": \"strikethrough\",\n  \"§n\": \"underlined\",\n  \"§o\": \"italic\",\n  \"§r\": \"reset\",\n};\n\n// base color hex\nconst colorCodeToHex: extraLibraryType = {\n  \"§0\": \"#000000\",\n  \"§1\": \"#0000AA\",\n  \"§2\": \"#00AA00\",\n  \"§3\": \"#00AAAA\",\n  \"§4\": \"#AA0000\",\n  \"§5\": \"#AA00AA\",\n  \"§6\": \"#FFAA00\",\n  \"§7\": \"#AAAAAA\",\n  \"§8\": \"#555555\",\n  \"§9\": \"#5555FF\",\n  \"§a\": \"#55FF55\",\n  \"§b\": \"#55FFFF\",\n  \"§c\": \"#FF5555\",\n  \"§d\": \"#FF55FF\",\n  \"§e\": \"#FFFF55\",\n  \"§f\": \"#FFFFFF\",\n};\n\n// json extra to hex color\nconst extraColorsToHex: extraLibraryType = {\n  black: \"#000000\",\n  dark_blue: \"#0000AA\",\n  dark_green: \"#00AA00\",\n  dark_aqua: \"#00AAAA\",\n  dark_red: \"#AA0000\",\n  dark_purple: \"#AA00AA\",\n  gold: \"#FFAA00\",\n  gray: \"#AAAAAA\",\n  dark_gray: \"#555555\",\n  blue: \"#5555FF\",\n  green: \"#55FF55\",\n  aqua: \"#55FFFF\",\n  red: \"#FF5555\",\n  light_purple: \"#FF55FF\",\n  yellow: \"#FFFF55\",\n  white: \"#FFFFFF\",\n};\n\n\n\nexport {\n  extras,\n  extraFontStyles,\n  textToJsonExtras,\n  colorCodeToHex,\n  extraColorsToHex,\n};\n","import {\n  extras,\n  colorCodeToHex,\n} from \"../styleLibrary\";\nimport {\n  htmlStringFormatting,\n  baseColorCodeRegex,\n} from \"../utils\";\n\n\n\n/**\n * Convert motd text to html.\n * @param motdString\n */\nexport default function textToHTML(motdString: string) {\n  const colorCodeReg = baseColorCodeRegex;\n  const codeREGEX = new RegExp(colorCodeReg.source);\n  const codeSplit = motdString.split(codeREGEX).filter(item => item !== \"\");\n\n  let fontStyle = \"\";\n  let colorHex = \"\";\n  let resultHTML = \"\";\n\n  codeSplit.forEach((item) => {\n    const motdStringToLowerCase = item.toLowerCase();\n    // console.log('motdStringToLowerCase', motdStringToLowerCase);\n\n    // 過濾 hex\n    if (Object.hasOwn(colorCodeToHex, motdStringToLowerCase)) {\n      //console.log(`偵測出 ${ colorCodeToHex[item] }`)\n      colorHex = colorCodeToHex[motdStringToLowerCase];\n\n      // §f reset\n      if(motdStringToLowerCase === \"§f\") {\n        fontStyle = \"\";\n      }\n      // 過濾文字 style\n    } else if (Object.hasOwn(extras, motdStringToLowerCase)) {\n      if(motdStringToLowerCase === \"§r\") {\n        colorHex = \"\";\n        fontStyle = \"\";\n      } else {\n        // font style code 轉換\n        // console.log(`偵測出 style ${ extras[motdStringToLowerCase] }`);\n        fontStyle += extras[motdStringToLowerCase];\n      }\n      // console.log('motdStringToLowerCase', motdStringToLowerCase);\n      // console.log('textFont: ' + fontStyle);\n      // 正常文字\n    } else {\n      let resultColor = \"\";\n      let textContent = item;\n      //console.log(fontStyle)\n\n      // 檢查 Hex color\n      if (colorHex !== \"\") {\n        resultColor = `color:${colorHex};`;\n      }\n\n      if (textContent !== \"\") {\n        //console.log('font: ' + fontStyle)\n        //console.log('color: ' + colorHex)\n        //console.log('text: ' + item)\n        //console.log('---------------------------------')\n        // replace html tags\n        textContent = htmlStringFormatting(textContent);\n\n        if (resultColor.length !== 0 || fontStyle.length !== 0) {\n          resultHTML += `<span style=\"${resultColor}${fontStyle}\">${textContent}</span>`;\n        } else {\n          resultHTML += textContent;\n        }\n      }\n    }\n  });\n\n  return resultHTML;\n}\n","import { motdJsonType } from \"../types\";\nimport {\n  extraFontStyles,\n  colorCodeToHex,\n  extraColorsToHex,\n} from \"../styleLibrary\";\nimport {\n  isMotdJSONType,\n} from \"../utils\";\nimport textToHTML from \"./textToHTML\";\n\n\n\n/**\n * Convert JSON to HTML.\n * \n * @param sourceJson\n */\nexport default function parseJSONToHTML(\n  sourceJson: motdJsonType,\n) {\n  let htmlElement = \"\";\n  let colorStyle = \"\";\n  let fontStyle = \"\";\n\n  // console.log('sourceJson', sourceJson);\n  // console.log('---------');\n\n  for (let key of Object.keys(sourceJson)) {\n    // console.log('sourceJson key', key);\n    key = key.toLowerCase();\n\n    // text styles\n    if (Object.hasOwn(extraFontStyles, key)) {\n      if (sourceJson[key]) {\n        fontStyle += String(extraFontStyles[key]);\n      }\n    }\n\n    // ---------- old text process ----------\n    // if (key === \"text\") {\n    //   if (\n    //     typeof sourceJson.text === \"string\" ||\n    //     typeof sourceJson.text === \"number\"\n    //   ) {\n    //     // convert all type to string\n    //     htmlElement += textToHTML(String(sourceJson.text));\n    //   }\n    // }\n\n    // color\n    if (key === \"color\") {\n      const colorKey = sourceJson[key];\n      let colorHex = \"\";\n\n      if (typeof colorKey === \"string\") {\n        // Hex color\n        if (Object.hasOwn(extraColorsToHex, colorKey)) {\n          colorHex = extraColorsToHex[colorKey];\n          // color code\n        } else if (Object.hasOwn(colorCodeToHex, colorKey)) {\n          colorHex = colorCodeToHex[colorKey];\n          // custom color\n        } else {\n          const customHexColorMatches = colorKey.match(\n            /^#([-+]?0+|\\+?0*[1-9A-Fa-f][0-9A-Fa-f]{0,5})$/,\n          );\n\n          if (customHexColorMatches !== null) {\n            // custom hex color code mode\n            colorHex =\n              \"#\" +\n              customHexColorMatches[1].replace(/^[-+]?0*/, \"\").padStart(6, \"0\");\n          }\n        }\n      }\n\n      if(colorHex !== \"\") {\n        colorStyle = `color:${colorHex};`;\n      }\n    }\n\n    // extra\n    if (key === \"extra\" && typeof sourceJson.extra === \"object\") {\n      // ---------- with extra text ----------\n      if (typeof sourceJson.text === \"string\" || typeof sourceJson.text === \"number\") {\n        // content to html\n        htmlElement += textToHTML(String(sourceJson.text));\n      }\n\n      // ---------- foreach extra data and parse ----------\n      for (const sourceJsonExtra of sourceJson.extra) {\n        // console.log('sourceJsonExtra', sourceJsonExtra);\n        if (typeof sourceJsonExtra === \"string\") {\n          // Process string elements directly with textToHTML\n          htmlElement += textToHTML(sourceJsonExtra);\n        } else if (isMotdJSONType(sourceJsonExtra)) {\n          htmlElement += parseJSONToHTML(sourceJsonExtra);\n        }\n      }\n    }\n  }\n\n  // ---------- without extra text content ----------\n  if (sourceJson.extra === undefined && sourceJson.text !== undefined) {\n    const currentText = sourceJson.text;\n    if (\n      typeof sourceJson.text === \"string\" ||\n      typeof sourceJson.text === \"number\"\n    ) {\n      // convert all type to string\n      htmlElement += textToHTML(String(currentText));\n    }\n  }\n\n\n\n  let returnHTML = \"\";\n  if (fontStyle.length !== 0 || colorStyle.length !== 0) {\n    returnHTML = `<span style=\"${colorStyle + fontStyle}\">${htmlElement}</span>`;\n  } else {\n    returnHTML = htmlElement;\n  }\n\n  return returnHTML;\n}\n","import { motdJsonType } from \"../types\";\nimport {\n  isMotdJSONType,\n  cleanCodes\n} from \"../utils\";\n\n\n\n/**\n * Convert JSON to Cleaned Text.\n * \n * @param sourceJson\n */\nexport default function JSONToCleanedText(\n  sourceJson: motdJsonType,\n) {\n  let textString = \"\";\n\n  for (let key of Object.keys(sourceJson)) {\n    key = key.toLowerCase();\n\n    // extra\n    if (key === \"extra\" && typeof sourceJson.extra === \"object\") {\n      // ---------- with extra text ----------\n      if (typeof sourceJson.text === \"string\" || typeof sourceJson.text === \"number\") {\n        // content to html\n        textString += cleanCodes(String(sourceJson.text));\n      }\n\n      // ---------- foreach extra data and parse ----------\n      for (const sourceJsonExtra of sourceJson.extra) {\n        // console.log('sourceJsonExtra', sourceJsonExtra);\n        if (typeof sourceJsonExtra === \"string\") {\n          // Add string elements directly to the output\n          textString += cleanCodes(sourceJsonExtra);\n        } else if (isMotdJSONType(sourceJsonExtra)) {\n          textString += JSONToCleanedText(sourceJsonExtra);\n        }\n      }\n    }\n  }\n\n  // ---------- without extra text content ----------\n  if (sourceJson.extra === undefined && sourceJson.text !== undefined) {\n    const currentText = sourceJson.text;\n    if (\n      typeof sourceJson.text === \"string\" ||\n      typeof sourceJson.text === \"number\"\n    ) {\n      // convert all type to string\n      textString += cleanCodes(String(currentText));\n    }\n  }\n\n  return textString;\n}\n","import { motdJsonType } from \"../types\";\nimport {\n  textToJsonExtras,\n  colorCodeToHex,\n} from \"../styleLibrary\";\nimport { baseColorCodeRegex } from \"../utils\";\n\n\n\n/**\n * Convert motd text to JSON.\n * \n * @param text\n */\nexport default function parseTextToJSON(text: string) {\n  const motdText = text;\n\n  const colorCodeReg = baseColorCodeRegex;\n  const codeREGEX = new RegExp(colorCodeReg.source);\n  const textSplit = motdText.split(codeREGEX);\n  let fontStyle = \"\";\n  let colorHex = \"\";\n\n  const resultObject: motdJsonType = {\n    text: \"\",\n    extra: [],\n  };\n\n  // console.log('textSplit', textSplit);\n  textSplit.forEach((item) => {\n    const stringToLowerCase = item.toLowerCase();\n\n    // color code 轉換成 hex\n    if (Object.hasOwn(colorCodeToHex, stringToLowerCase)) {\n      //console.log(`偵測出 ${ colorCodeToHex[item] }`)\n      colorHex = colorCodeToHex[stringToLowerCase];\n      // §f reset\n      if(stringToLowerCase === \"§f\") {\n        fontStyle = \"\";\n      }\n    } else if (Object.hasOwn(textToJsonExtras, stringToLowerCase)) {\n      if(stringToLowerCase === \"§r\") {\n        fontStyle = \"\";\n        colorHex = \"\";\n      } else {\n        // font style code 轉換\n        //console.log(`偵測出 style ${ textToJsonExtras[item] }`)\n        fontStyle = textToJsonExtras[stringToLowerCase];\n      }\n    } else {\n      const innerObject: motdJsonType = {\n        text: \"\",\n        extra: [],\n      };\n\n      // 其餘字串\n      if (fontStyle !== \"\") {\n        innerObject[fontStyle] = true;\n      }\n\n      innerObject.text = item;\n\n      if (colorHex !== \"\") {\n        innerObject.color = colorHex;\n      }\n\n      if (typeof resultObject.extra === \"object\") {\n        resultObject.extra.push(innerObject);\n      }\n    }\n  });\n\n  // code styles merge\n  let newExtra: motdJsonType[] = [];\n  // console.log('resultObject', resultObject);\n  if (resultObject.extra) {\n    if (resultObject.extra.length > 1) {\n      // if text is '', remove it and merge to next array\n      resultObject.extra.forEach((item, index) => {\n        // console.log('item', item);\n        if (item.text === \"\") {\n          if (\n            resultObject.extra\n            && typeof resultObject.extra[index + 1] === \"object\"\n          ) {\n            newExtra.push({\n              ...(item as motdJsonType),\n              ...resultObject.extra[index + 1],\n            });\n          }\n        } else {\n          if (\n            item.text !== newExtra[newExtra.length - 1]?.text\n          ) {\n            newExtra.push(item as motdJsonType);\n          }\n        }\n      });\n    } else {\n      newExtra.push(resultObject.extra[0] as motdJsonType);\n    }\n  }\n\n  // console.log('newExtra', newExtra);\n  // remove blank content\n  newExtra = newExtra.filter((item) => item.text !== \"\");\n  // console.log('newExtra', newExtra);\n\n  return {\n    text: resultObject.text,\n    extra: newExtra,\n  };\n}\n","import { motdJsonType } from \"../types\";\nimport {\n  JSONToHTML,\n  textToHTML,\n} from \"./\";\n\n\n\n// make sure JSON data is JSON object and then convert.\nexport function JSONRender(json: object) {\n  return JSONToHTML(json as motdJsonType);\n}\n\n/**\n * auto check data type then convert to html.\n */\nexport function autoToHTML(motd: string | object): string {\n  // type check\n  if (typeof motd === \"object\") {\n    // console.log('process mode: Object mode');\n    return JSONRender(motd);\n  } else if (typeof motd === \"string\") {\n    // console.log('process mode: String mode');\n    // console.log('textToJSON(motd)', textToJSON(motd));\n    return textToHTML(motd);\n    // return jsonRender(textToJSON(motd));\n  } else {\n    return \"unknown motd data type\";\n  }\n}\n\n\n\nexport default autoToHTML;\n","import { motdJsonType } from \"../types\";\nimport {\n  JSONToCleanedText,\n} from \".\";\nimport { cleanCodes } from \"../utils\";\n\n\n\n/**\n * auto check data type then convert to html.\n */\nexport function autoCleanToText(motd: string | object): string {\n  // type check\n  if (typeof motd === \"object\") {\n    // console.log('process mode: Object mode');\n    return JSONToCleanedText(motd as motdJsonType);\n  } else if (typeof motd === \"string\") {\n    // console.log('process mode: String mode');\n    return cleanCodes(motd);\n  } else {\n    return \"unknown motd data type\";\n  }\n}\n\n\n\nexport default autoCleanToText;\n","/*\n * minecraft motd parser\n * (c) 2021 Kevin Zheng\n * Released under the MIT license\n */\nimport {\n  htmlStringFormatting,\n  cleanCodes,\n  cleanHtmlTags,\n} from \"./utils\";\nimport {\n  JSONToHTML,\n  JSONToCleanedText,\n\n  textToHTML,\n  textToJSON,\n\n  JSONRender,\n  autoToHTML,\n  autoCleanToText,\n} from \"./parser\";\n\n\n\n\n\n\nexport * from \"./utils\";\nexport * from \"./parser\";\n\n\n\n/*\n * #### minecraft motd parser\n * * [github](https://github.com/SnowFireWolf/minecraft-motd-parser/tree/main#minecraft-server-motd-parser)\n * * [npm](https://www.npmjs.com/package/@sfirew/minecraft-motd-parser)\n *\n * (c) 2021 Kevin Zheng\n *\n * Released under the MIT license\n */\nconst motdParser = {\n  // --- normal format ---\n  // text convert to HTML\n  textToHTML,\n  // text convert to JSON\n  textToJSON,\n  // JSON convert to HTML\n  JSONToHTML,\n  // JSON string to JSON object and convert to HTML\n  JSONRender,\n  // auto check type to convert\n  autoToHTML,\n\n  // --- utils ---\n  // html string formatter\n  htmlStringFormatting,\n  // clean all motd codes\n  cleanCodes,\n  // clean all html tags\n  cleanHtmlTags,\n  // json to not html text\n  JSONToCleanedText,\n  // auto check type and convert to cleaned text\n  autoCleanToText,\n};\n\nexport default motdParser;\n"],"mappings":"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","names":["baseColorCodeRegex","isMotdJSONType","object","hasText","hasTranslate","hasExtra","htmlStringFormatting","text","cleanHtmlTags","cleanedText","DANGEROUS_TAGS","State","state","tagName","skipUntil","len","i","ch","j","isClosing","start","cleanCodes","REGEX","textResult","extras","extraFontStyles","textToJsonExtras","colorCodeToHex","extraColorsToHex","textToHTML","motdString","colorCodeReg","baseColorCodeRegex","codeREGEX","codeSplit","item","fontStyle","colorHex","resultHTML","motdStringToLowerCase","colorCodeToHex","extras","resultColor","textContent","htmlStringFormatting","parseJSONToHTML","sourceJson","htmlElement","colorStyle","fontStyle","key","extraFontStyles","colorKey","colorHex","extraColorsToHex","colorCodeToHex","customHexColorMatches","textToHTML","sourceJsonExtra","isMotdJSONType","currentText","returnHTML","JSONToCleanedText","sourceJson","textString","key","cleanCodes","sourceJsonExtra","isMotdJSONType","currentText","parseTextToJSON","text","motdText","colorCodeReg","baseColorCodeRegex","codeREGEX","textSplit","fontStyle","colorHex","resultObject","item","stringToLowerCase","colorCodeToHex","textToJsonExtras","innerObject","newExtra","index","_a","__spreadValues","JSONRender","json","parseJSONToHTML","autoToHTML","motd","textToHTML","autoCleanToText","motd","JSONToCleanedText","cleanCodes","autoCleanToText_default","motdParser","textToHTML","parseTextToJSON","parseJSONToHTML","JSONRender","autoToHTML","htmlStringFormatting","cleanCodes","cleanHtmlTags","JSONToCleanedText","autoCleanToText_default","index_default"]}