# Hurry Curry! - a game about cooking # Copyright (C) 2025 Hurry Curry! contributors # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, version 3 of the License only. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # class_name MessageParser extends Object var raw: Dictionary var kind := Kind.UNKNOWN var result var game: Game enum Kind { ITEM, TILE, TEXT, TRANSLATION, UNKNOWN } func _init(raw_: Dictionary, game_: Game) -> void: raw = raw_ game = game_ if "text" in raw: kind = Kind.TEXT result = raw["text"] elif "translation" in raw: kind = Kind.TRANSLATION # TODO: move function here var params: Array = raw.translation.params.map(MessageParser.new.bind(game)) var unformatted := tr(raw.translation.id) result = split_translation(unformatted, 0, params) if result.size() == 1 && result[0].kind == Kind.TEXT: kind = Kind.TEXT result = result[0].result elif "tile" in raw: kind = Kind.TILE result = game.tile_names[raw["tile"]] elif "item" in raw: kind = Kind.ITEM result = game.item_names[raw["item"]] func split_translation(msgstr: String, idx: int, params: Array) -> Array: if msgstr.contains("{%d}" % idx): var s := msgstr.split("{%d}" % idx, true, 1) var l := split_translation(s[0], idx + 1, params) if params[idx].kind == Kind.TRANSLATION: l.append_array(params[idx].result) else: l.push_back(params[idx]) var r := split_translation(s[1], idx + 1, params) l.append_array(r) var res := [l.front()] for e: MessageParser in l.slice(1): if res.back().kind == Kind.TEXT and e.kind == Kind.TEXT: res.back().result = "%s%s" % [res.back().result, e.result] else: res.push_back(e) return res else: return [] if msgstr.is_empty() else [MessageParser.new({"text": msgstr}, game)]