From 49f22167881cc64b6a7533a34a78af3b7e1389a6 Mon Sep 17 00:00:00 2001 From: piterson05 <75865556+piterson05@users.noreply.github.com> Date: Mon, 11 Sep 2023 01:31:19 +0200 Subject: [PATCH] added ability to preview text formatting --- .gitignore | 1 + fonts/ChaletComprime_CologneSixty.ttf | Bin 0 -> 94432 bytes fonts/ChaletLondonNineteenSixty.ttf | Bin 0 -> 41564 bytes main.xml | 2 +- validator.py | 387 +++++++++++++++++++++++++- 5 files changed, 383 insertions(+), 7 deletions(-) create mode 100644 .gitignore create mode 100644 fonts/ChaletComprime_CologneSixty.ttf create mode 100644 fonts/ChaletLondonNineteenSixty.ttf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c805ddb --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +preview.html \ No newline at end of file diff --git a/fonts/ChaletComprime_CologneSixty.ttf b/fonts/ChaletComprime_CologneSixty.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5b5da498ec4e3819809736260ee71418f34d9948 GIT binary patch literal 94432 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 literal 0 HcmV?d00001 diff --git a/fonts/ChaletLondonNineteenSixty.ttf b/fonts/ChaletLondonNineteenSixty.ttf new file mode 100644 index 0000000000000000000000000000000000000000..48ff6ade9f871708817ec7fa77b93616cd6f262d GIT binary patch literal 41564 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 H`1#^rUg1ik literal 0 HcmV?d00001 diff --git a/main.xml b/main.xml index 0eb64c7..e3cb87f 100644 --- a/main.xml +++ b/main.xml @@ -434,7 +434,7 @@ 🛡️ ~b~GTA CnR Shield ~s~baneo {0} por {1} por ~r~{2}~s~. Total de jugadores baneados: {3} 🛡️ ~b~GTA CnR Shield ~s~a banni {0} pendant {1} pour ~r~{2}~s~. Total de joueurs bannis: {3} 🛡️ ~b~GTA CnR Shield ~s~hat {0} für {1} wegen ~r~{2}~s~ gebannt. Insgesamt gebannte Spieler: {3} - 🛡️ ~b~GTA CnR Shield ~s~~baneo {0} por {1} por ~r~{2}~s~. Total de jogadores banidos: {3} + 🛡️ ~b~GTA CnR Shield ~s~baneo {0} por {1} por ~r~{2}~s~. Total de jogadores banidos: {3} diff --git a/validator.py b/validator.py index 32e0f41..bf61084 100644 --- a/validator.py +++ b/validator.py @@ -5,17 +5,282 @@ import xml.sax import re -USE_COLORAMA = True +COLORAMA_INSTALLED = True +DOMINATE_INSTALLED = True + try: import colorama except ModuleNotFoundError: - USE_COLORAMA = False + COLORAMA_INSTALLED = False +try: + import dominate + import dominate.tags +except ModuleNotFoundError: + DOMINATE_INSTALLED = False + +GTA_HUD_COLORS = { + "HUD_COLOUR_PURE_WHITE": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_WHITE": "rgba(240, 240, 240, 255)", + "HUD_COLOUR_BLACK": "rgba(0, 0, 0, 255)", + "HUD_COLOUR_GREY": "rgba(155, 155, 155, 255)", + "HUD_COLOUR_GREYLIGHT": "rgba(205, 205, 205, 255)", + "HUD_COLOUR_GREYDARK": "rgba(77, 77, 77, 255)", + "HUD_COLOUR_RED": "rgba(224, 50, 50, 255)", + "HUD_COLOUR_REDLIGHT": "rgba(240, 153, 153, 255)", + "HUD_COLOUR_REDDARK": "rgba(112, 25, 25, 255)", + "HUD_COLOUR_BLUE": "rgba(93, 182, 229, 255)", + "HUD_COLOUR_BLUELIGHT": "rgba(174, 219, 242, 255)", + "HUD_COLOUR_BLUEDARK": "rgba(47, 92, 115, 255)", + "HUD_COLOUR_YELLOW": "rgba(240, 200, 80, 255)", + "HUD_COLOUR_YELLOWLIGHT": "rgba(254, 235, 169, 255)", + "HUD_COLOUR_YELLOWDARK": "rgba(126, 107, 41, 255)", + "HUD_COLOUR_ORANGE": "rgba(255, 133, 85, 255)", + "HUD_COLOUR_ORANGELIGHT": "rgba(255, 194, 170, 255)", + "HUD_COLOUR_ORANGEDARK": "rgba(127, 66, 42, 255)", + "HUD_COLOUR_GREEN": "rgba(114, 204, 114, 255)", + "HUD_COLOUR_GREENLIGHT": "rgba(185, 230, 185, 255)", + "HUD_COLOUR_GREENDARK": "rgba(57, 102, 57, 255)", + "HUD_COLOUR_PURPLE": "rgba(132, 102, 226, 255)", + "HUD_COLOUR_PURPLELIGHT": "rgba(192, 179, 239, 255)", + "HUD_COLOUR_PURPLEDARK": "rgba(67, 57, 111, 255)", + "HUD_COLOUR_PINK": "rgba(203, 54, 148, 255)", + "HUD_COLOUR_RADAR_HEALTH": "rgba(53, 154, 71, 255)", + "HUD_COLOUR_RADAR_ARMOUR": "rgba(93, 182, 229, 255)", + "HUD_COLOUR_RADAR_DAMAGE": "rgba(235, 36, 39, 255)", + "HUD_COLOUR_NET_PLAYER1": "rgba(194, 80, 80, 255)", + "HUD_COLOUR_NET_PLAYER2": "rgba(156, 110, 175, 255)", + "HUD_COLOUR_NET_PLAYER3": "rgba(255, 123, 196, 255)", + "HUD_COLOUR_NET_PLAYER4": "rgba(247, 159, 123, 255)", + "HUD_COLOUR_NET_PLAYER5": "rgba(178, 144, 132, 255)", + "HUD_COLOUR_NET_PLAYER6": "rgba(141, 206, 167, 255)", + "HUD_COLOUR_NET_PLAYER7": "rgba(113, 169, 175, 255)", + "HUD_COLOUR_NET_PLAYER8": "rgba(211, 209, 231, 255)", + "HUD_COLOUR_NET_PLAYER9": "rgba(144, 127, 153, 255)", + "HUD_COLOUR_NET_PLAYER10": "rgba(106, 196, 191, 255)", + "HUD_COLOUR_NET_PLAYER11": "rgba(214, 196, 153, 255)", + "HUD_COLOUR_NET_PLAYER12": "rgba(234, 142, 80, 255)", + "HUD_COLOUR_NET_PLAYER13": "rgba(152, 203, 234, 255)", + "HUD_COLOUR_NET_PLAYER14": "rgba(178, 98, 135, 255)", + "HUD_COLOUR_NET_PLAYER15": "rgba(144, 142, 122, 255)", + "HUD_COLOUR_NET_PLAYER16": "rgba(166, 117, 94, 255)", + "HUD_COLOUR_NET_PLAYER17": "rgba(175, 168, 168, 255)", + "HUD_COLOUR_NET_PLAYER18": "rgba(232, 142, 155, 255)", + "HUD_COLOUR_NET_PLAYER19": "rgba(187, 214, 91, 255)", + "HUD_COLOUR_NET_PLAYER20": "rgba(12, 123, 86, 255)", + "HUD_COLOUR_NET_PLAYER21": "rgba(123, 196, 255, 255)", + "HUD_COLOUR_NET_PLAYER22": "rgba(171, 60, 230, 255)", + "HUD_COLOUR_NET_PLAYER23": "rgba(206, 169, 13, 255)", + "HUD_COLOUR_NET_PLAYER24": "rgba(71, 99, 173, 255)", + "HUD_COLOUR_NET_PLAYER25": "rgba(42, 166, 185, 255)", + "HUD_COLOUR_NET_PLAYER26": "rgba(186, 157, 125, 255)", + "HUD_COLOUR_NET_PLAYER27": "rgba(201, 225, 255, 255)", + "HUD_COLOUR_NET_PLAYER28": "rgba(240, 240, 150, 255)", + "HUD_COLOUR_NET_PLAYER29": "rgba(237, 140, 161, 255)", + "HUD_COLOUR_NET_PLAYER30": "rgba(249, 138, 138, 255)", + "HUD_COLOUR_NET_PLAYER31": "rgba(252, 239, 166, 255)", + "HUD_COLOUR_NET_PLAYER32": "rgba(240, 240, 240, 255)", + "HUD_COLOUR_SIMPLEBLIP_DEFAULT": "rgba(159, 201, 166, 255)", + "HUD_COLOUR_MENU_BLUE": "rgba(140, 140, 140, 255)", + "HUD_COLOUR_MENU_GREY_LIGHT": "rgba(140, 140, 140, 255)", + "HUD_COLOUR_MENU_BLUE_EXTRA_DARK": "rgba(40, 40, 40, 255)", + "HUD_COLOUR_MENU_YELLOW": "rgba(240, 160, 0, 255)", + "HUD_COLOUR_MENU_YELLOW_DARK": "rgba(240, 160, 0, 255)", + "HUD_COLOUR_MENU_GREEN": "rgba(240, 160, 0, 255)", + "HUD_COLOUR_MENU_GREY": "rgba(140, 140, 140, 255)", + "HUD_COLOUR_MENU_GREY_DARK": "rgba(60, 60, 60, 255)", + "HUD_COLOUR_MENU_HIGHLIGHT": "rgba(30, 30, 30, 255)", + "HUD_COLOUR_MENU_STANDARD": "rgba(140, 140, 140, 255)", + "HUD_COLOUR_MENU_DIMMED": "rgba(75, 75, 75, 255)", + "HUD_COLOUR_MENU_EXTRA_DIMMED": "rgba(50, 50, 50, 255)", + "HUD_COLOUR_BRIEF_TITLE": "rgba(95, 95, 95, 255)", + "HUD_COLOUR_MID_GREY_MP": "rgba(100, 100, 100, 255)", + "HUD_COLOUR_NET_PLAYER1_DARK": "rgba(93, 39, 39, 255)", + "HUD_COLOUR_NET_PLAYER2_DARK": "rgba(77, 55, 89, 255)", + "HUD_COLOUR_NET_PLAYER3_DARK": "rgba(124, 62, 99, 255)", + "HUD_COLOUR_NET_PLAYER4_DARK": "rgba(120, 80, 80, 255)", + "HUD_COLOUR_NET_PLAYER5_DARK": "rgba(87, 72, 66, 255)", + "HUD_COLOUR_NET_PLAYER6_DARK": "rgba(74, 103, 83, 255)", + "HUD_COLOUR_NET_PLAYER7_DARK": "rgba(60, 85, 88, 255)", + "HUD_COLOUR_NET_PLAYER8_DARK": "rgba(105, 105, 64, 255)", + "HUD_COLOUR_NET_PLAYER9_DARK": "rgba(72, 63, 76, 255)", + "HUD_COLOUR_NET_PLAYER10_DARK": "rgba(53, 98, 95, 255)", + "HUD_COLOUR_NET_PLAYER11_DARK": "rgba(107, 98, 76, 255)", + "HUD_COLOUR_NET_PLAYER12_DARK": "rgba(117, 71, 40, 255)", + "HUD_COLOUR_NET_PLAYER13_DARK": "rgba(76, 101, 117, 255)", + "HUD_COLOUR_NET_PLAYER14_DARK": "rgba(65, 35, 47, 255)", + "HUD_COLOUR_NET_PLAYER15_DARK": "rgba(72, 71, 61, 255)", + "HUD_COLOUR_NET_PLAYER16_DARK": "rgba(85, 58, 47, 255)", + "HUD_COLOUR_NET_PLAYER17_DARK": "rgba(87, 84, 84, 255)", + "HUD_COLOUR_NET_PLAYER18_DARK": "rgba(116, 71, 77, 255)", + "HUD_COLOUR_NET_PLAYER19_DARK": "rgba(93, 107, 45, 255)", + "HUD_COLOUR_NET_PLAYER20_DARK": "rgba(6, 61, 43, 255)", + "HUD_COLOUR_NET_PLAYER21_DARK": "rgba(61, 98, 127, 255)", + "HUD_COLOUR_NET_PLAYER22_DARK": "rgba(85, 30, 115, 255)", + "HUD_COLOUR_NET_PLAYER23_DARK": "rgba(103, 84, 6, 255)", + "HUD_COLOUR_NET_PLAYER24_DARK": "rgba(35, 49, 86, 255)", + "HUD_COLOUR_NET_PLAYER25_DARK": "rgba(21, 83, 92, 255)", + "HUD_COLOUR_NET_PLAYER26_DARK": "rgba(93, 98, 62, 255)", + "HUD_COLOUR_NET_PLAYER27_DARK": "rgba(100, 112, 127, 255)", + "HUD_COLOUR_NET_PLAYER28_DARK": "rgba(120, 120, 75, 255)", + "HUD_COLOUR_NET_PLAYER29_DARK": "rgba(152, 76, 93, 255)", + "HUD_COLOUR_NET_PLAYER30_DARK": "rgba(124, 69, 69, 255)", + "HUD_COLOUR_NET_PLAYER31_DARK": "rgba(10, 43, 50, 255)", + "HUD_COLOUR_NET_PLAYER32_DARK": "rgba(95, 95, 10, 255)", + "HUD_COLOUR_BRONZE": "rgba(180, 130, 97, 255)", + "HUD_COLOUR_SILVER": "rgba(150, 153, 161, 255)", + "HUD_COLOUR_GOLD": "rgba(214, 181, 99, 255)", + "HUD_COLOUR_PLATINUM": "rgba(166, 221, 190, 255)", + "HUD_COLOUR_GANG1": "rgba(29, 100, 153, 255)", + "HUD_COLOUR_GANG2": "rgba(214, 116, 15, 255)", + "HUD_COLOUR_GANG3": "rgba(135, 125, 142, 255)", + "HUD_COLOUR_GANG4": "rgba(229, 119, 185, 255)", + "HUD_COLOUR_SAME_CREW": "rgba(252, 239, 166, 255)", + "HUD_COLOUR_FREEMODE": "rgba(45, 110, 185, 255)", + "HUD_COLOUR_PAUSE_BG": "rgba(0, 0, 0, 186)", + "HUD_COLOUR_FRIENDLY": "rgba(93, 182, 229, 255)", + "HUD_COLOUR_ENEMY": "rgba(194, 80, 80, 255)", + "HUD_COLOUR_LOCATION": "rgba(240, 200, 80, 255)", + "HUD_COLOUR_PICKUP": "rgba(114, 204, 114, 255)", + "HUD_COLOUR_PAUSE_SINGLEPLAYER": "rgba(114, 204, 114, 255)", + "HUD_COLOUR_FREEMODE_DARK": "rgba(22, 55, 92, 255)", + "HUD_COLOUR_INACTIVE_MISSION": "rgba(154, 154, 154, 255)", + "HUD_COLOUR_DAMAGE": "rgba(194, 80, 80, 255)", + "HUD_COLOUR_PINKLIGHT": "rgba(252, 115, 201, 255)", + "HUD_COLOUR_PM_MITEM_HIGHLIGHT": "rgba(252, 177, 49, 255)", + "HUD_COLOUR_SCRIPT_VARIABLE": "rgba(0, 0, 0, 255)", + "HUD_COLOUR_YOGA": "rgba(109, 247, 204, 255)", + "HUD_COLOUR_TENNIS": "rgba(241, 101, 34, 255)", + "HUD_COLOUR_GOLF": "rgba(214, 189, 97, 255)", + "HUD_COLOUR_SHOOTING_RANGE": "rgba(112, 25, 25, 255)", + "HUD_COLOUR_FLIGHT_SCHOOL": "rgba(47, 92, 115, 255)", + "HUD_COLOUR_NORTH_BLUE": "rgba(93, 182, 229, 255)", + "HUD_COLOUR_SOCIAL_CLUB": "rgba(234, 153, 28, 255)", + "HUD_COLOUR_PLATFORM_BLUE": "rgba(11, 55, 123, 255)", + "HUD_COLOUR_PLATFORM_GREEN": "rgba(146, 200, 62, 255)", + "HUD_COLOUR_PLATFORM_GREY": "rgba(234, 153, 28, 255)", + "HUD_COLOUR_FACEBOOK_BLUE": "rgba(66, 89, 148, 255)", + "HUD_COLOUR_INGAME_BG": "rgba(0, 0, 0, 186)", + "HUD_COLOUR_DARTS": "rgba(114, 204, 114, 255)", + "HUD_COLOUR_WAYPOINT": "rgba(164, 76, 242, 255)", + "HUD_COLOUR_MICHAEL": "rgba(101, 180, 212, 255)", + "HUD_COLOUR_FRANKLIN": "rgba(171, 237, 171, 255)", + "HUD_COLOUR_TREVOR": "rgba(255, 163, 87, 255)", + "HUD_COLOUR_GOLF_P1": "rgba(240, 240, 240, 255)", + "HUD_COLOUR_GOLF_P2": "rgba(235, 239, 30, 255)", + "HUD_COLOUR_GOLF_P3": "rgba(255, 149, 14, 255)", + "HUD_COLOUR_GOLF_P4": "rgba(246, 60, 161, 255)", + "HUD_COLOUR_WAYPOINTLIGHT": "rgba(210, 166, 249, 255)", + "HUD_COLOUR_WAYPOINTDARK": "rgba(82, 38, 121, 255)", + "HUD_COLOUR_PANEL_LIGHT": "rgba(0, 0, 0, 77)", + "HUD_COLOUR_MICHAEL_DARK": "rgba(72, 103, 116, 255)", + "HUD_COLOUR_FRANKLIN_DARK": "rgba(85, 118, 85, 255)", + "HUD_COLOUR_TREVOR_DARK": "rgba(127, 81, 43, 255)", + "HUD_COLOUR_OBJECTIVE_ROUTE": "rgba(240, 200, 80, 255)", + "HUD_COLOUR_PAUSEMAP_TINT": "rgba(0, 0, 0, 215)", + "HUD_COLOUR_PAUSE_DESELECT": "rgba(100, 100, 100, 127)", + "HUD_COLOUR_PM_WEAPONS_PURCHASABLE": "rgba(45, 110, 185, 255)", + "HUD_COLOUR_PM_WEAPONS_LOCKED": "rgba(240, 240, 240, 191)", + "HUD_COLOUR_END_SCREEN_BG": "rgba(0, 0, 0, 186)", + "HUD_COLOUR_CHOP": "rgba(224, 50, 50, 255)", + "HUD_COLOUR_PAUSEMAP_TINT_HALF": "rgba(0, 0, 0, 215)", + "HUD_COLOUR_NORTH_BLUE_OFFICIAL": "rgba(0, 71, 133, 255)", + "HUD_COLOUR_SCRIPT_VARIABLE_2": "rgba(0, 0, 0, 255)", + "HUD_COLOUR_H": "rgba(33, 118, 37, 255)", + "HUD_COLOUR_HDARK": "rgba(37, 102, 40, 255)", + "HUD_COLOUR_T": "rgba(234, 153, 28, 255)", + "HUD_COLOUR_TDARK": "rgba(225, 140, 8, 255)", + "HUD_COLOUR_HSHARD": "rgba(20, 40, 0, 255)", + "HUD_COLOUR_CONTROLLER_MICHAEL": "rgba(48, 255, 255, 255)", + "HUD_COLOUR_CONTROLLER_FRANKLIN": "rgba(48, 255, 0, 255)", + "HUD_COLOUR_CONTROLLER_TREVOR": "rgba(176, 80, 0, 255)", + "HUD_COLOUR_CONTROLLER_CHOP": "rgba(127, 0, 0, 255)", + "HUD_COLOUR_VIDEO_EDITOR_VIDEO": "rgba(53, 166, 224, 255)", + "HUD_COLOUR_VIDEO_EDITOR_AUDIO": "rgba(162, 79, 157, 255)", + "HUD_COLOUR_VIDEO_EDITOR_TEXT": "rgba(104, 192, 141, 255)", + "HUD_COLOUR_HB_BLUE": "rgba(29, 100, 153, 255)", + "HUD_COLOUR_HB_YELLOW": "rgba(234, 153, 28, 255)", + "HUD_COLOUR_VIDEO_EDITOR_SCORE": "rgba(240, 160, 1, 255)", + "HUD_COLOUR_VIDEO_EDITOR_AUDIO_FADEOUT": "rgba(59, 34, 57, 255)", + "HUD_COLOUR_VIDEO_EDITOR_TEXT_FADEOUT": "rgba(41, 68, 53, 255)", + "HUD_COLOUR_VIDEO_EDITOR_SCORE_FADEOUT": "rgba(82, 58, 10, 255)", + "HUD_COLOUR_HEIST_BACKGROUND": "rgba(37, 102, 40, 186)", + "HUD_COLOUR_VIDEO_EDITOR_AMBIENT": "rgba(240, 200, 80, 255)", + "HUD_COLOUR_VIDEO_EDITOR_AMBIENT_FADEOUT": "rgba(80, 70, 34, 255)", + "HUD_COLOUR_VIDEO_EDITOR_AMBIENT_DARK": "rgba(255, 133, 85, 255)", + "HUD_COLOUR_VIDEO_EDITOR_AMBIENT_LIGHT": "rgba(255, 194, 170, 255)", + "HUD_COLOUR_VIDEO_EDITOR_AMBIENT_MID": "rgba(255, 133, 85, 255)", + "HUD_COLOUR_LOW_FLOW": "rgba(240, 200, 80, 255)", + "HUD_COLOUR_LOW_FLOW_DARK": "rgba(126, 107, 41, 255)", + "HUD_COLOUR_G1": "rgba(247, 159, 123, 255)", + "HUD_COLOUR_G2": "rgba(226, 134, 187, 255)", + "HUD_COLOUR_G3": "rgba(239, 238, 151, 255)", + "HUD_COLOUR_G4": "rgba(113, 169, 175, 255)", + "HUD_COLOUR_G5": "rgba(160, 140, 193, 255)", + "HUD_COLOUR_G6": "rgba(141, 206, 167, 255)", + "HUD_COLOUR_G7": "rgba(181, 214, 234, 255)", + "HUD_COLOUR_G8": "rgba(178, 144, 132, 255)", + "HUD_COLOUR_G9": "rgba(0, 132, 114, 255)", + "HUD_COLOUR_G10": "rgba(216, 85, 117, 255)", + "HUD_COLOUR_G11": "rgba(30, 100, 152, 255)", + "HUD_COLOUR_G12": "rgba(43, 181, 117, 255)", + "HUD_COLOUR_G13": "rgba(233, 141, 79, 255)", + "HUD_COLOUR_G14": "rgba(137, 210, 215, 255)", + "HUD_COLOUR_G15": "rgba(134, 125, 141, 255)", + "HUD_COLOUR_ADVERSARY": "rgba(109, 34, 33, 255)", + "HUD_COLOUR_DEGEN_RED": "rgba(255, 0, 0, 255)", + "HUD_COLOUR_DEGEN_YELLOW": "rgba(255, 255, 0, 255)", + "HUD_COLOUR_DEGEN_GREEN": "rgba(0, 255, 0, 255)", + "HUD_COLOUR_DEGEN_CYAN": "rgba(0, 255, 255, 255)", + "HUD_COLOUR_DEGEN_BLUE": "rgba(0, 0, 255, 255)", + "HUD_COLOUR_DEGEN_MAGENTA": "rgba(255, 0, 255, 255)", + "HUD_COLOUR_STUNT_1": "rgba(38, 136, 234, 255)", + "HUD_COLOUR_STUNT_2": "rgba(224, 50, 50, 255)", + "HUD_COLOUR_SPECIAL_RACE_SERIES": "rgba(154, 178, 54, 255)", + "HUD_COLOUR_SPECIAL_RACE_SERIES_DARK": "rgba(93, 107, 45, 255)", + "HUD_COLOUR_CS": "rgba(206, 169, 13, 255)", + "HUD_COLOUR_CS_DARK": "rgba(103, 84, 6, 255)", + "HUD_COLOUR_TECH_GREEN": "rgba(0, 151, 151, 255)", + "HUD_COLOUR_TECH_GREEN_DARK": "rgba(5, 119, 113, 255)", + "HUD_COLOUR_TECH_RED": "rgba(151, 0, 0, 255)", + "HUD_COLOUR_TECH_GREEN_VERY_DARK": "rgba(0, 40, 40, 255)", + "HUD_COLOUR_PLACEHOLDER_01": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_02": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_03": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_04": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_05": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_06": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_07": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_08": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_09": "rgba(255, 255, 255, 255)", + "HUD_COLOUR_PLACEHOLDER_10": "rgba(255, 255, 255, 255)" +} + +GTA_FORMAT_REPLACEMENT_TABLE = [ + [r"~r~", '~HUD_COLOUR_RED~'], + [r"~g~", '~HUD_COLOUR_GREEN~'], + [r"~b~", '~HUD_COLOUR_BLUE~'], + [r"~f~", '~HUD_COLOUR_FRIENDLY~'], + [r"~y~", '~HUD_COLOUR_YELLOW~'], + [r"~c~", '~HUD_COLOUR_MENU_GREY~'], + [r"~t~", '~HUD_COLOUR_MENU_GREY~'], + [r"~o~", '~HUD_COLOUR_ORANGE~'], + [r"~p~", '~HUD_COLOUR_PURPLE~'], + [r"~q~", '~HUD_COLOUR_PINK~'], + [r"~m~", '~HUD_COLOUR_MID_GREY_MP~'], + [r"~l~", '~HUD_COLOUR_BLACK~'], + [r"~d~", '~HUD_COLOUR_BLUEDARK~'], + [r"~s~", '~HUD_COLOUR_GREYLIGHT~'] +] def get_text_from_node(node: xml.dom.minidom.Node): return "".join(t.nodeValue for t in node.childNodes if t.nodeType == t.TEXT_NODE) +def regex_replace_multiple(text: str, replacement_table: list[list[str]]) -> str: + for replacement in replacement_table: + text = re.sub(replacement[0], replacement[1], text) + return text class Validator: """XML Validation @@ -44,6 +309,8 @@ class Validator: found_missing_lang: int = 0 total_strings: int = 0 custom_xml_parser = None + preview_formatting = False + main_doc = None @staticmethod def setup_xml_parser(): @@ -98,7 +365,7 @@ def print_error(error: str, location: list[str], custom_file_cursor: tuple[int] """ Validator.errors += 1 txt = f"[!] {Validator.get_location_string(location, custom_file_cursor=custom_file_cursor)}:\n{error}" - if USE_COLORAMA: + if COLORAMA_INSTALLED: print(f"{colorama.Fore.RED}{txt}{colorama.Fore.RESET}") else: print(txt) @@ -116,7 +383,7 @@ def print_warning(warning: str, location: list[str], custom_file_cursor: tuple[i None """ txt = f"[*] {Validator.get_location_string(location, custom_file_cursor=custom_file_cursor)}:\n{warning}" - if USE_COLORAMA: + if COLORAMA_INSTALLED: print(f"{colorama.Fore.YELLOW}{txt}{colorama.Fore.RESET}") else: print(txt) @@ -143,11 +410,105 @@ def check_unknown_tag(entry: xml.dom.minidom.Element, known_tags: list[str], loc return True Validator.print_error(f"Unknown tag: {repr(entry.tagName)}, expected one of these: {', '.join(known_tags[:Validator.display_limit])}", location, entry.parse_position) return False + + + def setup_html_doc(): + if Validator.preview_formatting: + Validator.main_doc = dominate.document(title="Text formatting preview") + with Validator.main_doc.head: + dominate.tags.style( + """ + html { + background-color: #202327; + } + span, h1, h2, h3 { + color: #ffffff; + } + @font-face { + font-family: 'Chalet'; + src: url('fonts/ChaletLondonNineteenSixty.ttf'); + font-stretch: normal; + } + @font-face { + font-family: 'ChaletComprime'; + src: url('fonts/ChaletComprime_CologneSixty.ttf'); + font-stretch: 1%, 100%; + } + .condensed { + font-family:'ChaletComprime'; + font-size: 2.07vh; + } + .bold { + font-weight: bold; + } + span { + font-family:'Chalet'; + font-weight: lighter; + font-size: 1.725vh; + } + """ + ) + + + def add_formatted_text_to_html(text: str): + text = regex_replace_multiple(text, GTA_FORMAT_REPLACEMENT_TABLE) + GROUP_REGEX = r"~h~|~n~|~bold~|~italic~||<\/C>|~HUD_COLOUR_.+?~|~HC_.+?~|~CC_[0-9]{1,3}_[0-9]{1,3}_[0-9]{1,3}~" + bolded = False + italic = False + color = "rgb(205,205,205)" + condensed = 0 + new_line = False + text_fragments = re.split(GROUP_REGEX, text) + matchedActions = re.findall(GROUP_REGEX, text) + with Validator.main_doc.body: + if text_fragments[0] != "": + dominate.tags.span(text_fragments[0], style=f"color: {color};") + for i, fragment in enumerate(text_fragments[1:]): + formatting = matchedActions[i] + match formatting: + case "~h~" | "~bold~": + bolded = not bolded + case "~italic~": + italic = not italic + case "": + condensed += 1 + case "": + condensed -= 1 + case "~n~": + new_line = not new_line + case _: + HUDColorMatches = re.findall(r"(?<=~)(HUD_COLOUR_.+?)(?=~)|(?<=~)(HC_.+?)(?=~)", formatting) + if HUDColorMatches: + color = GTA_HUD_COLORS[HUDColorMatches[0][0]] + CustomColorMatches = re.findall(r"(?<=~CC_)([0-9]{1,3}_[0-9]{1,3}_[0-9]{1,3})(?=~)", formatting) + if CustomColorMatches: + color = f'rgba(${CustomColorMatches[0].split("_").join(",")})' + classes = [] + if (condensed > 0): + classes.append("condensed") + if bolded: + classes.append("bolded") + style = "" + if italic: + style += "font-style: italic;" + style += f"color: {color};" + with Validator.main_doc.body: + if fragment != "": + with dominate.tags.span(fragment): + if classes: + dominate.tags.attr(cls=' '.join(classes), style=style) + else: + dominate.tags.attr(style=style) + if new_line: + dominate.tags.br() @staticmethod def check_xml_files(): for file in Validator.xml_files: + if DOMINATE_INSTALLED and Validator.preview_formatting: + with Validator.main_doc.body: + dominate.tags.h1(file) try: dom = xml.dom.minidom.parse(file, Validator.custom_xml_parser) root: xml.dom.minidom.Element = dom.documentElement @@ -179,6 +540,9 @@ def check_entries(entry: xml.dom.minidom.Element, path: list[str]): Validator.total_strings -= 1 Validator.used_ids.add(element_found_id) path = [*path, Validator.entry_pretty_print(entry)] + if DOMINATE_INSTALLED and Validator.preview_formatting: + with Validator.main_doc.body: + dominate.tags.h2(element_found_id) found_langs: list[str] = [] lang_attrib = "xml:lang" should_end_with_format = None @@ -206,6 +570,10 @@ def check_entries(entry: xml.dom.minidom.Element, path: list[str]): for string_entry in good_string_entries: text = get_text_from_node(string_entry) current_lang = dict(string_entry.attributes.items()).get(lang_attrib) + if DOMINATE_INSTALLED and Validator.preview_formatting: + with Validator.main_doc.body: + dominate.tags.h3(current_lang) + Validator.add_formatted_text_to_html(text) found_formats = re.findall(FORMAT_REGEX, text) if len(found_formats)>0 and should_end_with_format is not None: found_format = found_formats[-1] @@ -234,13 +602,17 @@ def check_entries(entry: xml.dom.minidom.Element, path: list[str]): if __name__ == '__main__': - if USE_COLORAMA: + if COLORAMA_INSTALLED: colorama.init() parser = argparse.ArgumentParser(description='Validates localization files') parser.add_argument('--show_lang', type=str, help='Show missing language localizations', choices=Validator.supported_langs) + parser.add_argument('--preview_formatting', action='store_true', help='Show formatted localizations as HTML file') parser.add_argument('--display_limit', type=int, default=10, help='Set display limit for missing translations') args = parser.parse_args() Validator.custom_xml_parser = Validator.setup_xml_parser() + if args.preview_formatting and DOMINATE_INSTALLED: + Validator.preview_formatting = True + Validator.setup_html_doc() Validator.display_limit = args.display_limit Validator.show_lang = args.show_lang with open("index.json", "r", encoding="utf-8") as index_file: @@ -254,5 +626,8 @@ def check_entries(entry: xml.dom.minidom.Element, path: list[str]): sys.exit(1) else: print("No errors found") - if USE_COLORAMA: + if Validator.preview_formatting and DOMINATE_INSTALLED: + with open("preview.html", "w", encoding="utf-8") as file: + file.write(Validator.main_doc.render(pretty=False)) + if COLORAMA_INSTALLED: colorama.deinit()