@sfirew/minecraft-motd-parser 1.1.5-dev.1 → 1.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -14
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -10
- package/types/index.d.ts +1 -1
- package/types/utils.d.ts +1 -1
- package/.eslintrc.ts +0 -23
- package/coverage/base.css +0 -224
- package/coverage/block-navigation.js +0 -87
- package/coverage/coverage-summary.json +0 -13
- package/coverage/favicon.png +0 -0
- package/coverage/index.html +0 -131
- package/coverage/lcov-report/base.css +0 -224
- package/coverage/lcov-report/block-navigation.js +0 -87
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +0 -131
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -2
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -196
- package/coverage/lcov.info +0 -633
- package/coverage/prettify.css +0 -1
- package/coverage/prettify.js +0 -2
- package/coverage/sort-arrow-sprite.png +0 -0
- package/coverage/sorter.js +0 -196
- package/jest.config.ts +0 -32
package/CHANGELOG.md
CHANGED
|
@@ -11,26 +11,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
11
11
|
|
|
12
12
|
### Added
|
|
13
13
|
- Comprehensive test coverage for hex color parsing, performance, security, and HTML cleaning
|
|
14
|
-
-
|
|
15
|
-
- test
|
|
16
|
-
- test(security): add security-focused test cases for robust input validation
|
|
17
|
-
- test(coverage): add additional tests for JSON rendering and HTML cleaning functionality
|
|
14
|
+
- Modern ESLint configuration with enhanced type safety and optional chaining
|
|
15
|
+
- New test scripts for coverage, watch, performance, security, and comprehensive testing
|
|
18
16
|
|
|
19
17
|
### Changed
|
|
20
|
-
- Major refactor of HTML string generation and formatting logic
|
|
21
|
-
- Enhanced type checking
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
- update(README): restructure content for clarity, enhance features section, and add installation and usage examples
|
|
18
|
+
- Major refactor of HTML string generation and formatting logic with secure tag cleaning
|
|
19
|
+
- Enhanced type checking and consistency across JSON parsing functions
|
|
20
|
+
- Streamlined text handling in textToHTML and parser functions
|
|
21
|
+
- Standardized code style: enforced double quotes, updated ESLint rules, improved Jest configuration
|
|
22
|
+
- Updated package.json: replaced `format` script with `lint` script, added ESLint dependencies
|
|
23
|
+
- Improved variable management using `const` instead of `let` where appropriate
|
|
24
|
+
- Enhanced README structure and clarity, removed hex color support example
|
|
28
25
|
- Merge pull request #21 from AlexTMjugador/alex/upstream-hex-color-parser-fix
|
|
29
26
|
|
|
30
27
|
### Fixed
|
|
31
28
|
- Parser behavior now precisely matches Minecraft game behavior
|
|
32
|
-
-
|
|
33
|
-
-
|
|
29
|
+
- Hex color value validation in text components
|
|
30
|
+
- Code consistency issues with standardized formatting
|
|
34
31
|
|
|
35
32
|
|
|
36
33
|
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var
|
|
1
|
+
var S=Object.defineProperty;var J=Object.getOwnPropertyDescriptor;var _=Object.getOwnPropertyNames,k=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,X=Object.prototype.propertyIsEnumerable;var j=(t,e,o)=>e in t?S(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,L=(t,e)=>{for(var o in e||(e={}))R.call(e,o)&&j(t,o,e[o]);if(k)for(var o of k(e))X.call(e,o)&&j(t,o,e[o]);return t};var K=(t,e)=>{for(var o in e)S(t,o,{get:e[o],enumerable:!0})},$=(t,e,o,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of _(e))!R.call(t,n)&&n!==o&&S(t,n,{get:()=>e[n],enumerable:!(s=J(e,n))||s.enumerable});return t};var G=t=>$(S({},"__esModule",{value:!0}),t);var I={};K(I,{JSONRender:()=>b,JSONToCleanedText:()=>y,JSONToHTML:()=>g,autoCleanToText:()=>C,autoToHTML:()=>O,baseColorCodeRegex:()=>u,cleanCodes:()=>m,cleanHtmlTags:()=>w,default:()=>B,htmlStringFormatting:()=>A,isMotdJSONType:()=>F,textToHTML:()=>x,textToJSON:()=>h});module.exports=G(I);var u=/([§][0-9a-fA-FklmnorKLMNOR])/g;function F(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e="text"in t,o="translate"in t,s="extra"in t&&Array.isArray(t.extra);return e||o||s}function A(t){return!t||typeof t!="string"?"":t.replace(/&(?!(?:amp|lt|gt|quot|#39|#x[0-9A-Fa-f]+|#[0-9]+);)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\n/g,"<br/>")}function w(t){if(!t||typeof t!="string")return"";let e="",o=new Set(["script","style","noscript","iframe","object","embed","applet","svg","math","foreignobject"]),s;(T=>(T[T.TEXT=0]="TEXT",T[T.TAG=1]="TAG",T[T.SKIP_BLOCK=2]="SKIP_BLOCK",T[T.COMMENT=3]="COMMENT"))(s||(s={}));let n=0,l="",f="",a=t.length;for(let r=0;r<a;r++){let p=t[r];if(n===0&&p==="<"){if(t.slice(r,r+4)==="<!--"){n=3;continue}let i=r+1,c=!1;for(i<a&&t[i]==="/"&&(c=!0,i++);i<a&&/\s/.test(t[i]);)i++;let T=i;for(;i<a&&/[A-Za-z0-9-]/.test(t[i]);)i++;l=t.slice(T,i).toLowerCase(),!c&&o.has(l)?(n=2,f=`</${l}>`):n=1;continue}if(n===1){p===">"&&(n=0);continue}if(n===3){t.slice(r,r+3)==="-->"&&(r+=2,n=0);continue}if(n===2){p==="<"&&t.slice(r,r+f.length).toLowerCase()===f&&(r+=f.length-1,n=0);continue}n===0&&(e+=p)}return e.trim()}function m(t){let e=/(?:§)([0-9a-fA-FklmnorFKLMNOR])/g,o="";return o=t.replace(e,""),o}var E={"\xA7k":"obfuscated;","\xA7l":"font-weight: bold;","\xA7m":"text-decoration: line-through;","\xA7n":"text-decoration: underline;","\xA7o":"font-style: italic;","\xA7r":"color: inherit;text-decoration: none !important;font-weight:normal!important;font-style: normal!important;"},H={bold:"font-weight: bold;",italic:"font-style: italic;",underlined:"text-decoration:underline;",strikethrough:"text-decoration: line-through;",obfuscated:"mc_obfuscated;",reset:"color: inherit;text-decoration: none !important;font-weight:normal!important;font-style: normal!important;"},M={"\xA7k":"obfuscated","\xA7l":"bold","\xA7m":"strikethrough","\xA7n":"underlined","\xA7o":"italic","\xA7r":"reset"},d={"\xA70":"#000000","\xA71":"#0000AA","\xA72":"#00AA00","\xA73":"#00AAAA","\xA74":"#AA0000","\xA75":"#AA00AA","\xA76":"#FFAA00","\xA77":"#AAAAAA","\xA78":"#555555","\xA79":"#5555FF","\xA7a":"#55FF55","\xA7b":"#55FFFF","\xA7c":"#FF5555","\xA7d":"#FF55FF","\xA7e":"#FFFF55","\xA7f":"#FFFFFF"},N={black:"#000000",dark_blue:"#0000AA",dark_green:"#00AA00",dark_aqua:"#00AAAA",dark_red:"#AA0000",dark_purple:"#AA00AA",gold:"#FFAA00",gray:"#AAAAAA",dark_gray:"#555555",blue:"#5555FF",green:"#55FF55",aqua:"#55FFFF",red:"#FF5555",light_purple:"#FF55FF",yellow:"#FFFF55",white:"#FFFFFF"};function x(t){let e=u,o=new RegExp(e.source),s=t.split(o).filter(a=>a!==""),n="",l="",f="";return s.forEach(a=>{let r=a.toLowerCase();if(Object.hasOwn(d,r))l=d[r],r==="\xA7f"&&(n="");else if(Object.hasOwn(E,r))r==="\xA7r"?(l="",n=""):n+=E[r];else{let p="",i=a;l!==""&&(p=`color:${l};`),i!==""&&(i=A(i),p.length!==0||n.length!==0?f+=`<span style="${p}${n}">${i}</span>`:f+=i)}}),f}function g(t){let e="",o="",s="";for(let l of Object.keys(t)){if(l=l.toLowerCase(),Object.hasOwn(H,l)&&t[l]&&(s+=String(H[l])),l==="color"){let f=t[l],a="";if(typeof f=="string")if(Object.hasOwn(N,f))a=N[f];else if(Object.hasOwn(d,f))a=d[f];else{let r=f.match(/^#([-+]?0+|\+?0*[1-9A-Fa-f][0-9A-Fa-f]{0,5})$/);r!==null&&(a="#"+r[1].replace(/^[-+]?0*/,"").padStart(6,"0"))}a!==""&&(o=`color:${a};`)}if(l==="extra"&&typeof t.extra=="object"){(typeof t.text=="string"||typeof t.text=="number")&&(e+=x(String(t.text)));for(let f of t.extra)typeof f=="string"?e+=x(f):F(f)&&(e+=g(f))}}if(t.extra===void 0&&t.text!==void 0){let l=t.text;(typeof t.text=="string"||typeof t.text=="number")&&(e+=x(String(l)))}let n="";return s.length!==0||o.length!==0?n=`<span style="${o+s}">${e}</span>`:n=e,n}function y(t){let e="";for(let o of Object.keys(t))if(o=o.toLowerCase(),o==="extra"&&typeof t.extra=="object"){(typeof t.text=="string"||typeof t.text=="number")&&(e+=m(String(t.text)));for(let s of t.extra)typeof s=="string"?e+=m(s):F(s)&&(e+=y(s))}if(t.extra===void 0&&t.text!==void 0){let o=t.text;(typeof t.text=="string"||typeof t.text=="number")&&(e+=m(String(o)))}return e}function h(t){let e=t,o=u,s=new RegExp(o.source),n=e.split(s),l="",f="",a={text:"",extra:[]};n.forEach(p=>{let i=p.toLowerCase();if(Object.hasOwn(d,i))f=d[i],i==="\xA7f"&&(l="");else if(Object.hasOwn(M,i))i==="\xA7r"?(l="",f=""):l=M[i];else{let c={text:"",extra:[]};l!==""&&(c[l]=!0),c.text=p,f!==""&&(c.color=f),typeof a.extra=="object"&&a.extra.push(c)}});let r=[];return a.extra&&(a.extra.length>1?a.extra.forEach((p,i)=>{var c;p.text===""?a.extra&&typeof a.extra[i+1]=="object"&&r.push(L(L({},p),a.extra[i+1])):p.text!==((c=r[r.length-1])==null?void 0:c.text)&&r.push(p)}):r.push(a.extra[0])),r=r.filter(p=>p.text!==""),{text:a.text,extra:r}}function b(t){return g(t)}function O(t){return typeof t=="object"?b(t):typeof t=="string"?x(t):"unknown motd data type"}function q(t){return typeof t=="object"?y(t):typeof t=="string"?m(t):"unknown motd data type"}var C=q;var P={textToHTML:x,textToJSON:h,JSONToHTML:g,JSONRender:b,autoToHTML:O,htmlStringFormatting:A,cleanCodes:m,cleanHtmlTags:w,JSONToCleanedText:y,autoCleanToText:C},B=P;0&&(module.exports={JSONRender,JSONToCleanedText,JSONToHTML,autoCleanToText,autoToHTML,baseColorCodeRegex,cleanCodes,cleanHtmlTags,htmlStringFormatting,isMotdJSONType,textToHTML,textToJSON});
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["/*\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","/*\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: any): 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\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 let 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 // Simple case-insensitive matching for skipUntil string\n if (\n ch === '<' &&\n text.slice(i, i + skipUntil.length).toLowerCase() === skipUntil\n ) {\n // Skip entire \"</tag>\" segment\n i += skipUntil.length - 1;\n state = State.TEXT;\n }\n continue; // Consume any content until leaving SKIP_BLOCK\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 motdText = motdString;\n\n const colorCodeReg = baseColorCodeRegex;\n const codeREGEX = new RegExp(colorCodeReg.source);\n const codeSplit = motdText.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 += `${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 let 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 (sourceJson.text !== undefined\n && (typeof sourceJson.text === \"string\" || typeof sourceJson.text === \"number\")\n ) {\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 (sourceJson.text !== undefined\n && (typeof sourceJson.text === \"string\" || typeof sourceJson.text === \"number\")\n ) {\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: Array<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]\n && 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"],"mappings":"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","names":["src_exports","__export","JSONRender","JSONToCleanedText","parseJSONToHTML","autoCleanToText_default","autoToHTML","baseColorCodeRegex","cleanCodes","cleanHtmlTags","src_default","htmlStringFormatting","isMotdJSONType","textToHTML","parseTextToJSON","__toCommonJS","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","motdText","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","__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","src_default"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["/*\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","/*\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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\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"],"mappings":"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","names":["index_exports","__export","JSONRender","JSONToCleanedText","parseJSONToHTML","autoCleanToText_default","autoToHTML","baseColorCodeRegex","cleanCodes","cleanHtmlTags","index_default","htmlStringFormatting","isMotdJSONType","textToHTML","parseTextToJSON","__toCommonJS","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"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var j=Object.defineProperty;var M=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable;var N=(t,e,o)=>e in t?j(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,
|
|
1
|
+
var j=Object.defineProperty;var M=Object.getOwnPropertySymbols;var R=Object.prototype.hasOwnProperty,J=Object.prototype.propertyIsEnumerable;var N=(t,e,o)=>e in t?j(t,e,{enumerable:!0,configurable:!0,writable:!0,value:o}):t[e]=o,S=(t,e)=>{for(var o in e||(e={}))R.call(e,o)&&N(t,o,e[o]);if(M)for(var o of M(e))J.call(e,o)&&N(t,o,e[o]);return t};var u=/([§][0-9a-fA-FklmnorKLMNOR])/g;function F(t){if(!t||typeof t!="object"||Array.isArray(t))return!1;let e="text"in t,o="translate"in t,p="extra"in t&&Array.isArray(t.extra);return e||o||p}function A(t){return!t||typeof t!="string"?"":t.replace(/&(?!(?:amp|lt|gt|quot|#39|#x[0-9A-Fa-f]+|#[0-9]+);)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'").replace(/\n/g,"<br/>")}function k(t){if(!t||typeof t!="string")return"";let e="",o=new Set(["script","style","noscript","iframe","object","embed","applet","svg","math","foreignobject"]),p;(c=>(c[c.TEXT=0]="TEXT",c[c.TAG=1]="TAG",c[c.SKIP_BLOCK=2]="SKIP_BLOCK",c[c.COMMENT=3]="COMMENT"))(p||(p={}));let f=0,a="",l="",i=t.length;for(let r=0;r<i;r++){let s=t[r];if(f===0&&s==="<"){if(t.slice(r,r+4)==="<!--"){f=3;continue}let n=r+1,x=!1;for(n<i&&t[n]==="/"&&(x=!0,n++);n<i&&/\s/.test(t[n]);)n++;let c=n;for(;n<i&&/[A-Za-z0-9-]/.test(t[n]);)n++;a=t.slice(c,n).toLowerCase(),!x&&o.has(a)?(f=2,l=`</${a}>`):f=1;continue}if(f===1){s===">"&&(f=0);continue}if(f===3){t.slice(r,r+3)==="-->"&&(r+=2,f=0);continue}if(f===2){s==="<"&&t.slice(r,r+l.length).toLowerCase()===l&&(r+=l.length-1,f=0);continue}f===0&&(e+=s)}return e.trim()}function d(t){let e=/(?:§)([0-9a-fA-FklmnorFKLMNOR])/g,o="";return o=t.replace(e,""),o}var O={"\xA7k":"obfuscated;","\xA7l":"font-weight: bold;","\xA7m":"text-decoration: line-through;","\xA7n":"text-decoration: underline;","\xA7o":"font-style: italic;","\xA7r":"color: inherit;text-decoration: none !important;font-weight:normal!important;font-style: normal!important;"},C={bold:"font-weight: bold;",italic:"font-style: italic;",underlined:"text-decoration:underline;",strikethrough:"text-decoration: line-through;",obfuscated:"mc_obfuscated;",reset:"color: inherit;text-decoration: none !important;font-weight:normal!important;font-style: normal!important;"},L={"\xA7k":"obfuscated","\xA7l":"bold","\xA7m":"strikethrough","\xA7n":"underlined","\xA7o":"italic","\xA7r":"reset"},m={"\xA70":"#000000","\xA71":"#0000AA","\xA72":"#00AA00","\xA73":"#00AAAA","\xA74":"#AA0000","\xA75":"#AA00AA","\xA76":"#FFAA00","\xA77":"#AAAAAA","\xA78":"#555555","\xA79":"#5555FF","\xA7a":"#55FF55","\xA7b":"#55FFFF","\xA7c":"#FF5555","\xA7d":"#FF55FF","\xA7e":"#FFFF55","\xA7f":"#FFFFFF"},w={black:"#000000",dark_blue:"#0000AA",dark_green:"#00AA00",dark_aqua:"#00AAAA",dark_red:"#AA0000",dark_purple:"#AA00AA",gold:"#FFAA00",gray:"#AAAAAA",dark_gray:"#555555",blue:"#5555FF",green:"#55FF55",aqua:"#55FFFF",red:"#FF5555",light_purple:"#FF55FF",yellow:"#FFFF55",white:"#FFFFFF"};function T(t){let e=u,o=new RegExp(e.source),p=t.split(o).filter(i=>i!==""),f="",a="",l="";return p.forEach(i=>{let r=i.toLowerCase();if(Object.hasOwn(m,r))a=m[r],r==="\xA7f"&&(f="");else if(Object.hasOwn(O,r))r==="\xA7r"?(a="",f=""):f+=O[r];else{let s="",n=i;a!==""&&(s=`color:${a};`),n!==""&&(n=A(n),s.length!==0||f.length!==0?l+=`<span style="${s}${f}">${n}</span>`:l+=n)}}),l}function g(t){let e="",o="",p="";for(let a of Object.keys(t)){if(a=a.toLowerCase(),Object.hasOwn(C,a)&&t[a]&&(p+=String(C[a])),a==="color"){let l=t[a],i="";if(typeof l=="string")if(Object.hasOwn(w,l))i=w[l];else if(Object.hasOwn(m,l))i=m[l];else{let r=l.match(/^#([-+]?0+|\+?0*[1-9A-Fa-f][0-9A-Fa-f]{0,5})$/);r!==null&&(i="#"+r[1].replace(/^[-+]?0*/,"").padStart(6,"0"))}i!==""&&(o=`color:${i};`)}if(a==="extra"&&typeof t.extra=="object"){(typeof t.text=="string"||typeof t.text=="number")&&(e+=T(String(t.text)));for(let l of t.extra)typeof l=="string"?e+=T(l):F(l)&&(e+=g(l))}}if(t.extra===void 0&&t.text!==void 0){let a=t.text;(typeof t.text=="string"||typeof t.text=="number")&&(e+=T(String(a)))}let f="";return p.length!==0||o.length!==0?f=`<span style="${o+p}">${e}</span>`:f=e,f}function y(t){let e="";for(let o of Object.keys(t))if(o=o.toLowerCase(),o==="extra"&&typeof t.extra=="object"){(typeof t.text=="string"||typeof t.text=="number")&&(e+=d(String(t.text)));for(let p of t.extra)typeof p=="string"?e+=d(p):F(p)&&(e+=y(p))}if(t.extra===void 0&&t.text!==void 0){let o=t.text;(typeof t.text=="string"||typeof t.text=="number")&&(e+=d(String(o)))}return e}function h(t){let e=t,o=u,p=new RegExp(o.source),f=e.split(p),a="",l="",i={text:"",extra:[]};f.forEach(s=>{let n=s.toLowerCase();if(Object.hasOwn(m,n))l=m[n],n==="\xA7f"&&(a="");else if(Object.hasOwn(L,n))n==="\xA7r"?(a="",l=""):a=L[n];else{let x={text:"",extra:[]};a!==""&&(x[a]=!0),x.text=s,l!==""&&(x.color=l),typeof i.extra=="object"&&i.extra.push(x)}});let r=[];return i.extra&&(i.extra.length>1?i.extra.forEach((s,n)=>{var x;s.text===""?i.extra&&typeof i.extra[n+1]=="object"&&r.push(S(S({},s),i.extra[n+1])):s.text!==((x=r[r.length-1])==null?void 0:x.text)&&r.push(s)}):r.push(i.extra[0])),r=r.filter(s=>s.text!==""),{text:i.text,extra:r}}function b(t){return g(t)}function E(t){return typeof t=="object"?b(t):typeof t=="string"?T(t):"unknown motd data type"}function _(t){return typeof t=="object"?y(t):typeof t=="string"?d(t):"unknown motd data type"}var H=_;var X={textToHTML:T,textToJSON:h,JSONToHTML:g,JSONRender:b,autoToHTML:E,htmlStringFormatting:A,cleanCodes:d,cleanHtmlTags:k,JSONToCleanedText:y,autoCleanToText:H},mt=X;export{b as JSONRender,y as JSONToCleanedText,g as JSONToHTML,H as autoCleanToText,E as autoToHTML,u as baseColorCodeRegex,d as cleanCodes,k as cleanHtmlTags,mt as default,A as htmlStringFormatting,F as isMotdJSONType,T as textToHTML,h as textToJSON};
|
|
2
2
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"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: any): 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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\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 let 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 // Simple case-insensitive matching for skipUntil string\n if (\n ch === '<' &&\n text.slice(i, i + skipUntil.length).toLowerCase() === skipUntil\n ) {\n // Skip entire \"</tag>\" segment\n i += skipUntil.length - 1;\n state = State.TEXT;\n }\n continue; // Consume any content until leaving SKIP_BLOCK\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 motdText = motdString;\n\n const colorCodeReg = baseColorCodeRegex;\n const codeREGEX = new RegExp(colorCodeReg.source);\n const codeSplit = motdText.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 += `${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 let 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 (sourceJson.text !== undefined\n && (typeof sourceJson.text === \"string\" || typeof sourceJson.text === \"number\")\n ) {\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 (sourceJson.text !== undefined\n && (typeof sourceJson.text === \"string\" || typeof sourceJson.text === \"number\")\n ) {\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: Array<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]\n && 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","motdText","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","__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","src_default"]}
|
|
1
|
+
{"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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\")\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":"yVAcO,IAAMA,EAAqB,gCAK3B,SAASC,EAAeC,EAAyC,CAEtE,GAAI,CAACA,GAAU,OAAOA,GAAW,UAAY,MAAM,QAAQA,CAAM,EAC/D,MAAO,GAIT,IAAMC,EAAU,SAAUD,EACpBE,EAAe,cAAeF,EAC9BG,EAAW,UAAWH,GAAU,MAAM,QAAQA,EAAO,KAAK,EAGhE,OAAOC,GAAWC,GAAgBC,CACpC,CAQO,SAASC,EAAqBC,EAAsB,CACzD,MAAI,CAACA,GAAQ,OAAOA,GAAS,SACpB,GAIPA,EAGG,QAAQ,uDAAwD,OAAO,EACvE,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,MAAM,EACpB,QAAQ,KAAM,QAAQ,EACtB,QAAQ,KAAM,OAAO,EAErB,QAAQ,MAAO,OAAO,CAE7B,CAcO,SAASC,EAAcD,EAAsB,CAClD,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAC3B,MAAO,GAGT,IAAIE,EAAc,GAGZC,EAAiB,IAAI,IAAI,CAC7B,SAAU,QAAS,WACnB,SAAU,SAAU,QAAS,SAC7B,MAAO,OAAQ,eACjB,CAAC,EAGIC,OACHA,IAAA,eACAA,IAAA,aACAA,IAAA,2BACAA,IAAA,uBAJGA,MAAA,KAOL,IAAIC,EAAQ,EACRC,EAAU,GACVC,EAAY,GACVC,EAAMR,EAAK,OAEjB,QAASS,EAAI,EAAGA,EAAID,EAAKC,IAAK,CAC5B,IAAMC,EAAKV,EAAKS,CAAC,EAGjB,GAAIJ,IAAU,GAAcK,IAAO,IAAK,CAEtC,GAAIV,EAAK,MAAMS,EAAGA,EAAI,CAAC,IAAM,OAAQ,CACnCJ,EAAQ,EACR,QACF,CAGA,IAAIM,EAAIF,EAAI,EACRG,EAAY,GAQhB,IALID,EAAIH,GAAOR,EAAKW,CAAC,IAAM,MACzBC,EAAY,GACZD,KAGKA,EAAIH,GAAO,KAAK,KAAKR,EAAKW,CAAC,CAAC,GAAGA,IAGtC,IAAME,EAAQF,EACd,KAAOA,EAAIH,GAAO,eAAe,KAAKR,EAAKW,CAAC,CAAC,GAAGA,IAEhDL,EAAUN,EAAK,MAAMa,EAAOF,CAAC,EAAE,YAAY,EAGvC,CAACC,GAAaT,EAAe,IAAIG,CAAO,GAC1CD,EAAQ,EACRE,EAAY,KAAKD,CAAO,KAExBD,EAAQ,EAEV,QACF,CAGA,GAAIA,IAAU,EAAW,CACnBK,IAAO,MAAKL,EAAQ,GAExB,QACF,CAGA,GAAIA,IAAU,EAAe,CAEvBL,EAAK,MAAMS,EAAGA,EAAI,CAAC,IAAM,QAC3BA,GAAK,EACLJ,EAAQ,GAEV,QACF,CAGA,GAAIA,IAAU,EAAkB,CAI5BK,IAAO,KACPV,EAAK,MAAMS,EAAGA,EAAIF,EAAU,MAAM,EAAE,YAAY,IAAMA,IAGtDE,GAAKF,EAAU,OAAS,EACxBF,EAAQ,GAEV,QACF,CAGIA,IAAU,IACZH,GAAeQ,EAEnB,CAEA,OAAOR,EAAY,KAAK,CAC1B,CAYO,SAASY,EAAWd,EAAsB,CAC/C,IAAMe,EAAQ,mCACVC,EAAa,GAEjB,OAAAA,EAAahB,EAAK,QAAQe,EAAO,EAAE,EAE5BC,CACT,CC9LA,IAAMC,EAA2B,CAC/B,QAAM,cACN,QAAM,qBACN,QAAM,iCACN,QAAM,8BACN,QAAM,sBACN,QAAM,4GACR,EAGMC,EAAoC,CACxC,KAAM,qBACN,OAAQ,sBACR,WAAY,6BACZ,cAAe,iCACf,WAAY,iBACZ,MAAO,4GACT,EAGMC,EAAqC,CACzC,QAAM,aACN,QAAM,OACN,QAAM,gBACN,QAAM,aACN,QAAM,SACN,QAAM,OACR,EAGMC,EAAmC,CACvC,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,UACN,QAAM,SACR,EAGMC,EAAqC,CACzC,MAAO,UACP,UAAW,UACX,WAAY,UACZ,UAAW,UACX,SAAU,UACV,YAAa,UACb,KAAM,UACN,KAAM,UACN,UAAW,UACX,KAAM,UACN,MAAO,UACP,KAAM,UACN,IAAK,UACL,aAAc,UACd,OAAQ,UACR,MAAO,SACT,ECzDe,SAARC,EAA4BC,EAAoB,CACrD,IAAMC,EAAeC,EACfC,EAAY,IAAI,OAAOF,EAAa,MAAM,EAC1CG,EAAYJ,EAAW,MAAMG,CAAS,EAAE,OAAOE,GAAQA,IAAS,EAAE,EAEpEC,EAAY,GACZC,EAAW,GACXC,EAAa,GAEjB,OAAAJ,EAAU,QAASC,GAAS,CAC1B,IAAMI,EAAwBJ,EAAK,YAAY,EAI/C,GAAI,OAAO,OAAOK,EAAgBD,CAAqB,EAErDF,EAAWG,EAAeD,CAAqB,EAG5CA,IAA0B,UAC3BH,EAAY,YAGL,OAAO,OAAOK,EAAQF,CAAqB,EACjDA,IAA0B,SAC3BF,EAAW,GACXD,EAAY,IAIZA,GAAaK,EAAOF,CAAqB,MAKtC,CACL,IAAIG,EAAc,GACdC,EAAcR,EAIdE,IAAa,KACfK,EAAc,SAASL,CAAQ,KAG7BM,IAAgB,KAMlBA,EAAcC,EAAqBD,CAAW,EAE1CD,EAAY,SAAW,GAAKN,EAAU,SAAW,EACnDE,GAAc,gBAAgBI,CAAW,GAAGN,CAAS,KAAKO,CAAW,UAErEL,GAAcK,EAGpB,CACF,CAAC,EAEML,CACT,CC5De,SAARO,EACLC,EACA,CACA,IAAIC,EAAc,GACdC,EAAa,GACbC,EAAY,GAKhB,QAASC,KAAO,OAAO,KAAKJ,CAAU,EAAG,CAuBvC,GArBAI,EAAMA,EAAI,YAAY,EAGlB,OAAO,OAAOC,EAAiBD,CAAG,GAChCJ,EAAWI,CAAG,IAChBD,GAAa,OAAOE,EAAgBD,CAAG,CAAC,GAgBxCA,IAAQ,QAAS,CACnB,IAAME,EAAWN,EAAWI,CAAG,EAC3BG,EAAW,GAEf,GAAI,OAAOD,GAAa,SAEtB,GAAI,OAAO,OAAOE,EAAkBF,CAAQ,EAC1CC,EAAWC,EAAiBF,CAAQ,UAE3B,OAAO,OAAOG,EAAgBH,CAAQ,EAC/CC,EAAWE,EAAeH,CAAQ,MAE7B,CACL,IAAMI,EAAwBJ,EAAS,MACrC,+CACF,EAEII,IAA0B,OAE5BH,EACE,IACAG,EAAsB,CAAC,EAAE,QAAQ,WAAY,EAAE,EAAE,SAAS,EAAG,GAAG,EAEtE,CAGCH,IAAa,KACdL,EAAa,SAASK,CAAQ,IAElC,CAGA,GAAIH,IAAQ,SAAW,OAAOJ,EAAW,OAAU,SAAU,EAEvD,OAAOA,EAAW,MAAS,UAAY,OAAOA,EAAW,MAAS,YAEpEC,GAAeU,EAAW,OAAOX,EAAW,IAAI,CAAC,GAInD,QAAWY,KAAmBZ,EAAW,MAEnC,OAAOY,GAAoB,SAE7BX,GAAeU,EAAWC,CAAe,EAChCC,EAAeD,CAAe,IACvCX,GAAeF,EAAgBa,CAAe,EAGpD,CACF,CAGA,GAAIZ,EAAW,QAAU,QAAaA,EAAW,OAAS,OAAW,CACnE,IAAMc,EAAcd,EAAW,MAE7B,OAAOA,EAAW,MAAS,UAC3B,OAAOA,EAAW,MAAS,YAG3BC,GAAeU,EAAW,OAAOG,CAAW,CAAC,EAEjD,CAIA,IAAIC,EAAa,GACjB,OAAIZ,EAAU,SAAW,GAAKD,EAAW,SAAW,EAClDa,EAAa,gBAAgBb,EAAaC,CAAS,KAAKF,CAAW,UAEnEc,EAAad,EAGRc,CACT,CChHe,SAARC,EACLC,EACA,CACA,IAAIC,EAAa,GAEjB,QAASC,KAAO,OAAO,KAAKF,CAAU,EAIpC,GAHAE,EAAMA,EAAI,YAAY,EAGlBA,IAAQ,SAAW,OAAOF,EAAW,OAAU,SAAU,EAEvD,OAAOA,EAAW,MAAS,UAAY,OAAOA,EAAW,MAAS,YAEpEC,GAAcE,EAAW,OAAOH,EAAW,IAAI,CAAC,GAIlD,QAAWI,KAAmBJ,EAAW,MAEnC,OAAOI,GAAoB,SAE7BH,GAAcE,EAAWC,CAAe,EAC/BC,EAAeD,CAAe,IACvCH,GAAcF,EAAkBK,CAAe,EAGrD,CAIF,GAAIJ,EAAW,QAAU,QAAaA,EAAW,OAAS,OAAW,CACnE,IAAMM,EAAcN,EAAW,MAE7B,OAAOA,EAAW,MAAS,UAC3B,OAAOA,EAAW,MAAS,YAG3BC,GAAcE,EAAW,OAAOG,CAAW,CAAC,EAEhD,CAEA,OAAOL,CACT,CCzCe,SAARM,EAAiCC,EAAc,CACpD,IAAMC,EAAWD,EAEXE,EAAeC,EACfC,EAAY,IAAI,OAAOF,EAAa,MAAM,EAC1CG,EAAYJ,EAAS,MAAMG,CAAS,EACtCE,EAAY,GACZC,EAAW,GAETC,EAA6B,CACjC,KAAM,GACN,MAAO,CAAC,CACV,EAGAH,EAAU,QAASI,GAAS,CAC1B,IAAMC,EAAoBD,EAAK,YAAY,EAG3C,GAAI,OAAO,OAAOE,EAAgBD,CAAiB,EAEjDH,EAAWI,EAAeD,CAAiB,EAExCA,IAAsB,UACvBJ,EAAY,YAEL,OAAO,OAAOM,EAAkBF,CAAiB,EACvDA,IAAsB,SACvBJ,EAAY,GACZC,EAAW,IAIXD,EAAYM,EAAiBF,CAAiB,MAE3C,CACL,IAAMG,EAA4B,CAChC,KAAM,GACN,MAAO,CAAC,CACV,EAGIP,IAAc,KAChBO,EAAYP,CAAS,EAAI,IAG3BO,EAAY,KAAOJ,EAEfF,IAAa,KACfM,EAAY,MAAQN,GAGlB,OAAOC,EAAa,OAAU,UAChCA,EAAa,MAAM,KAAKK,CAAW,CAEvC,CACF,CAAC,EAGD,IAAIC,EAA2B,CAAC,EAEhC,OAAIN,EAAa,QACXA,EAAa,MAAM,OAAS,EAE9BA,EAAa,MAAM,QAAQ,CAACC,EAAMM,IAAU,CA9ElD,IAAAC,EAgFYP,EAAK,OAAS,GAEdD,EAAa,OACV,OAAOA,EAAa,MAAMO,EAAQ,CAAC,GAAM,UAE5CD,EAAS,KAAKG,IAAA,GACRR,GACDD,EAAa,MAAMO,EAAQ,CAAC,EAChC,EAIDN,EAAK,SAASO,EAAAF,EAASA,EAAS,OAAS,CAAC,IAA5B,YAAAE,EAA+B,OAE7CF,EAAS,KAAKL,CAAoB,CAGxC,CAAC,EAEDK,EAAS,KAAKN,EAAa,MAAM,CAAC,CAAiB,GAMvDM,EAAWA,EAAS,OAAQL,GAASA,EAAK,OAAS,EAAE,EAG9C,CACL,KAAMD,EAAa,KACnB,MAAOM,CACT,CACF,CCvGO,SAASI,EAAWC,EAAc,CACvC,OAAOC,EAAWD,CAAoB,CACxC,CAKO,SAASE,EAAWC,EAA+B,CAExD,OAAI,OAAOA,GAAS,SAEXJ,EAAWI,CAAI,EACb,OAAOA,GAAS,SAGlBC,EAAWD,CAAI,EAGf,wBAEX,CClBO,SAASE,EAAgBC,EAA+B,CAE7D,OAAI,OAAOA,GAAS,SAEXC,EAAkBD,CAAoB,EACpC,OAAOA,GAAS,SAElBE,EAAWF,CAAI,EAEf,wBAEX,CAIA,IAAOG,EAAQJ,ECef,IAAMK,EAAa,CAGjB,WAAAC,EAEA,WAAAC,EAEA,WAAAC,EAEA,WAAAC,EAEA,WAAAC,EAIA,qBAAAC,EAEA,WAAAC,EAEA,cAAAC,EAEA,kBAAAC,EAEA,gBAAAC,CACF,EAEOC,GAAQX","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"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sfirew/minecraft-motd-parser",
|
|
3
3
|
"description": "Minecraft Server MOTD Parser, can convert to html, json, text.",
|
|
4
|
-
"version": "1.1.
|
|
4
|
+
"version": "1.1.6",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
7
7
|
"types": "types/index.d.ts",
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"build": "yarn build:dist && yarn build:declarations",
|
|
18
18
|
"build:dist": "tsup --format cjs,esm",
|
|
19
19
|
"build:declarations": "tsc --emitDeclarationOnly --declaration --outDir types",
|
|
20
|
-
"
|
|
20
|
+
"lint": "eslint \"**/*.ts\""
|
|
21
21
|
},
|
|
22
22
|
"tsup": {
|
|
23
23
|
"entry": [
|
|
@@ -29,17 +29,19 @@
|
|
|
29
29
|
"minify": true
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
+
"@eslint/js": "^9.28.0",
|
|
32
33
|
"@jest/globals": "^29.7.0",
|
|
33
|
-
"@types/node": "^20.
|
|
34
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
35
|
-
"@typescript-eslint/parser": "^5.
|
|
36
|
-
"eslint": "^8.
|
|
34
|
+
"@types/node": "^20.17.57",
|
|
35
|
+
"@typescript-eslint/eslint-plugin": "^5.62.0",
|
|
36
|
+
"@typescript-eslint/parser": "^5.62.0",
|
|
37
|
+
"eslint": "^8.57.1",
|
|
38
|
+
"globals": "^16.2.0",
|
|
37
39
|
"jest": "^29.7.0",
|
|
38
|
-
"
|
|
39
|
-
"ts-jest": "^29.2.2",
|
|
40
|
+
"ts-jest": "^29.3.4",
|
|
40
41
|
"ts-node": "^10.9.2",
|
|
41
|
-
"tsup": "^8.
|
|
42
|
-
"typescript": "^5.
|
|
42
|
+
"tsup": "^8.5.0",
|
|
43
|
+
"typescript": "^5.8.3",
|
|
44
|
+
"typescript-eslint": "^8.33.0"
|
|
43
45
|
},
|
|
44
46
|
"repository": "https://github.com/SnowFireWolf/minecraft-motd-parser.git",
|
|
45
47
|
"author": "SnowFireWolf",
|
package/types/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { htmlStringFormatting, cleanCodes, cleanHtmlTags } from "./utils";
|
|
2
2
|
import { JSONToHTML, JSONToCleanedText, textToHTML, textToJSON, JSONRender, autoToHTML, autoCleanToText } from "./parser";
|
|
3
|
-
export * from
|
|
3
|
+
export * from "./utils";
|
|
4
4
|
export * from "./parser";
|
|
5
5
|
declare const motdParser: {
|
|
6
6
|
textToHTML: typeof textToHTML;
|
package/types/utils.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import { motdJsonType } from "./types";
|
|
|
3
3
|
* Base color code regex
|
|
4
4
|
*/
|
|
5
5
|
export declare const baseColorCodeRegex: RegExp;
|
|
6
|
-
export declare function isMotdJSONType(object:
|
|
6
|
+
export declare function isMotdJSONType(object: unknown): object is motdJsonType;
|
|
7
7
|
/**
|
|
8
8
|
* Replace all HTML special characters with HTML entities
|
|
9
9
|
* Prevents HTML injection by safely encoding special characters
|
package/.eslintrc.ts
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
module.exports = {
|
|
2
|
-
"env": {
|
|
3
|
-
"browser": true,
|
|
4
|
-
"es2021": true,
|
|
5
|
-
"node": true
|
|
6
|
-
},
|
|
7
|
-
"extends": [
|
|
8
|
-
"eslint:recommended",
|
|
9
|
-
"plugin:@typescript-eslint/recommended"
|
|
10
|
-
],
|
|
11
|
-
"overrides": [
|
|
12
|
-
],
|
|
13
|
-
"parser": "@typescript-eslint/parser",
|
|
14
|
-
"parserOptions": {
|
|
15
|
-
"ecmaVersion": "latest",
|
|
16
|
-
"sourceType": "module"
|
|
17
|
-
},
|
|
18
|
-
"plugins": [
|
|
19
|
-
"@typescript-eslint"
|
|
20
|
-
],
|
|
21
|
-
"rules": {
|
|
22
|
-
}
|
|
23
|
-
}
|