You know, like add text_parser.js

This commit is contained in:
business-goose 2021-03-24 21:19:56 +00:00
parent cdd8cdbd4b
commit c38668b0d7
2 changed files with 129 additions and 0 deletions

3
.gitignore vendored
View file

@ -140,3 +140,6 @@ temp/
.ionide
# End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,node
# Yggdrasil
launcher_accounts.json

View file

@ -0,0 +1,126 @@
const language = require("minecraft-data")("1.16.1").language;
const colormap = {
black: "§0",
dark_blue: "§1",
dark_green: "§2",
dark_aqua: "§3",
dark_red: "§4",
dark_purple: "§5",
gold: "§6",
gray: "§7",
dark_gray: "§8",
blue: "§9",
green: "§a",
aqua: "§b",
red: "§c",
light_purple: "§d",
yellow: "§e",
white: "§f",
reset: "§r"
};
const ansimap = {
"§0": "\x1b[0m\x1b[30m",
"§1": "\x1b[0m\x1b[34m",
"§2": "\x1b[0m\x1b[32m",
"§3": "\x1b[0m\x1b[36m",
"§4": "\x1b[0m\x1b[31m",
"§5": "\x1b[0m\x1b[35m",
"§6": "\x1b[0m\x1b[33m",
"§7": "\x1b[0m\x1b[37m",
"§8": "\x1b[0m\x1b[90m",
"§9": "\x1b[0m\x1b[94m",
"§a": "\x1b[0m\x1b[92m",
"§b": "\x1b[0m\x1b[96m",
"§c": "\x1b[0m\x1b[91m",
"§d": "\x1b[0m\x1b[95m",
"§e": "\x1b[0m\x1b[93m",
"§f": "\x1b[0m\x1b[97m",
"§r": "\x1b[0m",
"§l": "\x1b[1m",
"§o": "\x1b[3m",
"§n": "\x1b[4m",
"§m": "\x1b[9m",
"§k": "\x1b[6m",
};
/**
* Parses a native minecraft text component in string form.
* @param {string} json_string - A text component string, such as the chat packet's "message" property.
* @returns {object} Parsed message in { raw, clean, ansi } form.
*/
function parseText(json_string) {
const json = JSON.parse(json_string);
let raw = parseJson(json, {color:"reset"});
if (raw.startsWith("§r")) {
raw = raw.substring(2);
}
let clean = raw.replace(/§[a-f0-9rlonmk]/g, "").replace(/§/g, "");
let ansi = raw.replace(/§[a-f0-9rlonmk]/g, (m) => {
return ansimap[m];
});
return { raw, clean, ansi };
}
/**
* Parses a native minecraft text component in JSON form.
* @param {object} json - The json message.
* @param {object} parent - The parent json.
* @returns {string} The parsed raw string.
*/
function parseJson(json, parent) {
if (typeof json === "string") {
json = {text:json};
}
json.color = json.color || parent.color;
json.bold = json.bold || parent.bold;
json.italic = json.italic || parent.italic;
json.underlined = json.underlined || parent.underlined;
json.strikethrough = json.strikethrough || parent.strikethrough;
json.obfuscated = json.obfuscated || parent.obfuscated;
let raw = "";
raw += colormap[json.color] || "";
if (json.bold) { raw += "§l"; }
if (json.italic) { raw += "§o"; }
if (json.underlined) { raw += "§n"; }
if (json.strikethrough) { raw += "§m"; }
if (json.obfuscated) { raw += "§k"; }
if (json.text) {
raw += json.text;
}
if (json.translate) { // I checked with the native minecraft code. This is how Minecraft does the matching and group indexing. -hhhzzzsss
if (language[json.translate]) {
let _with = json.with || [];
let i = 0;
raw += language[json.translate].replace(/%(?:(\\d+)\\$)?(s|%)/g, (g0, g1) => {
if (g0 === "%%") {
return "%";
}
else {
let idx = g1 ? parseInt(g1) : i++;
if (_with[idx]) {
return parseJson(_with[idx], json);
}
else {
return "";
}
}
});
}
else {
raw += json.translate;
}
}
if (json.extra) {
json.extra.forEach(function (extra) {
raw += parseJson(extra, json);
});
}
return raw;
}
module.exports = parseText;