diff -r 614b4710dc7e webtranslate/newgrf/language_file.py --- a/webtranslate/newgrf/language_file.py Wed May 27 19:44:13 2015 +0200 +++ b/webtranslate/newgrf/language_file.py Thu May 28 17:59:54 2015 +0200 @@ -34,7 +34,7 @@ gender_assign_pat = re.compile('{G *= *([^ }]+) *}') argument_pat = re.compile('[ \\t]+([^"][^ \\t}]*|"[^"}]*")') end_argument_pat = re.compile('[ \\t]*}') -number_pat = re.compile('[0-9]+$') +posref_pat = re.compile('([0-9]+)(:([0-9]+))?$') def check_string(projtype, text, default_case, extra_commands, lng, in_blng, save_pieces = False): """ @@ -130,7 +130,7 @@ string_info.add_error(ErrorMessage(ERROR, None, "Case {} of string command {} does not exist in the language".format(case, m.group(2)))) return string_info - if not entry.takes_param: + if len(entry.parameters) == 0: if argnum is not None: string_info.add_error(ErrorMessage(ERROR, None, "String command {} does not take an argument count".format(m.group(2)))) return string_info @@ -154,14 +154,22 @@ return string_info elif len(args) > 0: # If the first argument is a number, it cannot be a value for the plural command. - m = number_pat.match(args[0]) + m = posref_pat.match(args[0]) if m: - num = int(args[0], 10) - cmd_num = num + num = int(m.group(1), 10) + sub = m.group(3) + + if sub is None: + cmd_num = (num, None) + num = (num, 0) + else: + sub = int(sub, 10) + num = cmd_num = (num, sub) + cmd_args = args[1:] else: - num = pos - 1 - cmd_num = None + num = (pos - 1, 0) + cmd_num = (None, None) cmd_args = args if len(cmd_args) == plural_count: @@ -206,14 +214,22 @@ return string_info elif len(args) > 0: # If the first argument is a number, it cannot be a value for the plural command. - m = number_pat.match(args[0]) + m = posref_pat.match(args[0]) if m: - num = int(args[0], 10) - cmd_num = num + num = int(m.group(1), 10) + sub = m.group(3) + + if sub is None: + cmd_num = (num, None) + num = (num, 0) + else: + sub = int(sub, 10) + num = cmd_num = (num, sub) + cmd_args = args[1:] else: - num = pos - cmd_num = None + num = (pos, 0) + cmd_num = (None, None) cmd_args = args if len(cmd_args) == expected: @@ -227,7 +243,9 @@ string_info.add_error(ErrorMessage(ERROR, None, "Unknown {...} command found in the string")) return string_info - string_info.check_sanity() + if in_blng: + string_info.check_plural_and_gender(string_info) + return string_info # {{{ def get_arguments(text, cmd, idx, string_info): @@ -351,7 +369,7 @@ Piece representing a plural {P ...} command. @param cmd_num: Number given to the command by the user, if provided. - @type cmd_num: C{int} or C{None} + @type cmd_num: C{pair} of (C{int} or C{None}) @ivar cmd_args: Plural command arguments. @type cmd_args: C{list} of C{str} @@ -361,10 +379,12 @@ self.cmd_num = cmd_num def get_translation_text(self): - if self.cmd_num is None: - prefix = "{P " - else: - prefix = "{P " + str(self.cmd_num) + " " + prefix = "{P " + if self.cmd_num[0] is not None: + prefix += str(self.cmd_num[0]) + if self.cmd_num[1] is not None: + prefix += ":" + str(self.cmd_num[1]) + prefix += " " return prefix + " ".join(self.cmd_args) + "}" class GenderPiece(StringPiece): @@ -372,7 +392,7 @@ Piece representing a gender {G ...} command. @param cmd_num: Number given to the command by the user, if provided. - @type cmd_num: C{int} or C{None} + @type cmd_num: C{pair} of (C{int} or C{None}) @ivar cmd_args: Gender command arguments. @type cmd_args: C{list} of C{str} @@ -382,10 +402,12 @@ self.cmd_num = cmd_num def get_translation_text(self): - if self.cmd_num is None: - prefix = "{G " - else: - prefix = "{G " + str(self.cmd_num) + " " + prefix = "{G " + if self.cmd_num[0] is not None: + prefix += str(self.cmd_num[0]) + if self.cmd_num[1] is not None: + prefix += ":" + str(self.cmd_num[1]) + prefix += " " return prefix + " ".join(self.cmd_args) + "}" class GenderAssignPiece(StringPiece): @@ -500,10 +522,10 @@ Add a gender query for parameter L{pos}. @param pos: String parameter number used for gender query. - @type pos: C{int} + @type pos: (C{int}, C{int}) @param cmd_num: Number given to the command by the user, if provided. - @type cmd_num: C{int} or C{None} + @type cmd_num: C{pair} of (C{int} or C{None}) @param cmd_args: Command arguments. @type cmd_args: C{list} of C{str} @@ -517,10 +539,10 @@ Add a plural query for parameter L{pos}. @param pos: String parameter number used for plural query. - @type pos: C{int} + @type pos: (C{int}, C{int}) @param cmd_num: Number given to the command by the user, if provided. - @type cmd_num: C{int} or C{None} + @type cmd_num: C{pair} of (C{int} or C{None}) @param cmd_args: Command arguments. @type cmd_args: C{list} of C{str} @@ -607,32 +629,60 @@ """ self.pieces.append(GenderAssignPiece(gender)) - def check_sanity(self): + def check_plural_and_gender(self, base_info): """ - Check sanity of the string commands and parameters. + Check plural and gender parameter references. + + Note: The base language is required to know the exact string commands and amount of sub-parameters. + + @param base_info: Information about string parameters from the base language. + @type base_info: L{StringInfo} + + @return: True of references are valid. + @rtype: C{bool} """ ok = True if ok: - for pos in self.plurals: - if pos < 0 or pos >= len(self.commands): - self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for plural queries {{P ..}}".format(pos))) + for pos, sub in self.plurals: + pos_name = str(pos) + if sub > 0: + pos_name += ":" + str(sub) + + if pos < 0 or pos >= len(base_info.commands): + self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for plural queries {{P ..}}".format(pos_name))) ok = False continue - cmd = self.commands[pos] - if cmd is None or not cmd.use_plural: - self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for plural queries {{P ..}}".format(pos))) + cmd = base_info.commands[pos] + if cmd is None or sub < 0 or sub >= len(cmd.parameters): + self.add_error(ErrorMessage(ERROR, None, "Plural query {{P ..}} references non-existing parameter {}.".format(pos_name))) + ok = False + continue + + if not cmd.use_plural(sub): + self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for plural queries {{P ..}}".format(pos_name))) ok = False if ok: - for pos in self.genders: - if pos < 0 or pos >= len(self.commands): - self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for gender queries {{G ..}}".format(pos))) + for pos, sub in self.genders: + pos_name = str(pos) + if sub > 0: + pos_name += ":" + str(sub) + + if pos < 0 or pos >= len(base_info.commands): + self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for gender queries {{G ..}}".format(pos_name))) continue - cmd = self.commands[pos] - if cmd is None or not cmd.use_gender: - self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for gender queries {{G ..}}".format(pos))) + cmd = base_info.commands[pos] + if cmd is None or sub < 0 or sub >= len(cmd.parameters): + self.add_error(ErrorMessage(ERROR, None, "Gender query {{G ..}} references non-existing parameter {}.".format(pos_name))) + ok = False + continue + + if not cmd.use_gender(sub): + self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for gender queries {{G ..}}".format(pos_name))) + + return ok # }}} # }}} @@ -869,7 +919,9 @@ if line.startswith(bom): line = line[len(bom):] - if line.startswith('##'): + # Comments either have 1 or >= 3 leading '#'. + # The pragma ##id is special. It belongs to the skeleton, not to the header. Threat it like a comment. + if line.startswith('##') and not line.startswith('###') and not line.startswith('##id'): if seen_strings: data.add_error(ErrorMessage(ERROR, lnum, "Cannot change language properties after processing strings")) continue @@ -991,6 +1043,10 @@ lng_info.add_error(ErrorMessage(ERROR, None, msg)) return False + # Validate plural and gender references + if not lng_info.check_plural_and_gender(base_info): + return False + # Non-positional commands must match in count. if base_info.non_positionals != lng_info.non_positionals: for bname, bcnt in base_info.non_positionals.items(): diff -r 614b4710dc7e webtranslate/project_type.py --- a/webtranslate/project_type.py Wed May 27 19:44:13 2015 +0200 +++ b/webtranslate/project_type.py Thu May 28 17:59:54 2015 +0200 @@ -107,14 +107,8 @@ @ivar literal: Text of the literal (without curly brackets). @type literal: C{str} - @ivar takes_param: Takes a string parameter. - @type takes_param: C{bool} - - @ivar use_plural: May be used for plural. - @type use_plural: C{bool} - - @ivar use_gender: May be used for gender. - @type use_gender: C{bool} + @ivar parameters: For each parameter whether it is suitable for plural or gender forms. + @type parameters: C{list} of (C{bool}, C{bool}) @ivar allow_case: May have a ".case" suffix. @type allow_case: C{bool} @@ -125,15 +119,37 @@ @ivar translated_cmd: For commands in the base language, command to use checking and displaying. @type translated_cmd: C{str} or C{None} (the latter means use C{self}) """ - def __init__(self, literal, takes_param, use_plural, use_gender, allow_case, critical, translated_cmd = None): + def __init__(self, literal, parameters, allow_case, critical, translated_cmd = None): self.literal = literal - self.takes_param = takes_param - self.use_plural = use_plural - self.use_gender = use_gender + self.parameters = parameters self.allow_case = allow_case self.critical = critical self.translated_cmd = translated_cmd + def use_plural(self, subindex): + """ + Check whether a parameter can be used for plural forms. + + @param subindex: Parameter index. + @type subindex: C{int} + + @return: True if suitable for plural form. + @rtype: C{bool} + """ + return subindex >= 0 and subindex < len(self.parameters) and self.parameters[subindex][0] + + def use_gender(self, subindex): + """ + Check whether a parameter can be used for gender forms. + + @param subindex: Parameter index. + @type subindex: C{int} + + @return: True if suitable for gender form. + @rtype: C{bool} + """ + return subindex >= 0 and subindex < len(self.parameters) and self.parameters[subindex][1] + def get_translated_cmd(self): """ Get the command name to use for a translation. @@ -144,56 +160,61 @@ if self.translated_cmd is None: return self.literal return self.translated_cmd +P__ = (False, False) # Parameter, not suitable for plural or gender +PP_ = (True, False) # Parameter suitable for plural +P_G = (False, True) # Parameter suitable for gender +PPG = (True, True) # Parameter suitable for both plural and gender + # {{{ NEWGRF_PARAMETERS _NEWGRF_PARAMETERS = [ - ParameterInfo("NBSP", False, False, False, False, False), - ParameterInfo("COPYRIGHT", False, False, False, False, True ), - ParameterInfo("TRAIN", False, False, False, False, True ), - ParameterInfo("LORRY", False, False, False, False, True ), - ParameterInfo("BUS", False, False, False, False, True ), - ParameterInfo("PLANE", False, False, False, False, True ), - ParameterInfo("SHIP", False, False, False, False, True ), - ParameterInfo("TINYFONT", False, False, False, False, True ), - ParameterInfo("BIGFONT", False, False, False, False, True ), - ParameterInfo("BLUE", False, False, False, False, True ), - ParameterInfo("SILVER", False, False, False, False, True ), - ParameterInfo("GOLD", False, False, False, False, True ), - ParameterInfo("RED", False, False, False, False, True ), - ParameterInfo("PURPLE", False, False, False, False, True ), - ParameterInfo("LTBROWN", False, False, False, False, True ), - ParameterInfo("ORANGE", False, False, False, False, True ), - ParameterInfo("GREEN", False, False, False, False, True ), - ParameterInfo("YELLOW", False, False, False, False, True ), - ParameterInfo("DKGREEN", False, False, False, False, True ), - ParameterInfo("CREAM", False, False, False, False, True ), - ParameterInfo("BROWN", False, False, False, False, True ), - ParameterInfo("WHITE", False, False, False, False, True ), - ParameterInfo("LTBLUE", False, False, False, False, True ), - ParameterInfo("GRAY", False, False, False, False, True ), - ParameterInfo("DKBLUE", False, False, False, False, True ), - ParameterInfo("BLACK", False, False, False, False, True ), + ParameterInfo("NBSP", [], False, False), + ParameterInfo("COPYRIGHT", [], False, True ), + ParameterInfo("TRAIN", [], False, True ), + ParameterInfo("LORRY", [], False, True ), + ParameterInfo("BUS", [], False, True ), + ParameterInfo("PLANE", [], False, True ), + ParameterInfo("SHIP", [], False, True ), + ParameterInfo("TINYFONT", [], False, True ), + ParameterInfo("BIGFONT", [], False, True ), + ParameterInfo("BLUE", [], False, True ), + ParameterInfo("SILVER", [], False, True ), + ParameterInfo("GOLD", [], False, True ), + ParameterInfo("RED", [], False, True ), + ParameterInfo("PURPLE", [], False, True ), + ParameterInfo("LTBROWN", [], False, True ), + ParameterInfo("ORANGE", [], False, True ), + ParameterInfo("GREEN", [], False, True ), + ParameterInfo("YELLOW", [], False, True ), + ParameterInfo("DKGREEN", [], False, True ), + ParameterInfo("CREAM", [], False, True ), + ParameterInfo("BROWN", [], False, True ), + ParameterInfo("WHITE", [], False, True ), + ParameterInfo("LTBLUE", [], False, True ), + ParameterInfo("GRAY", [], False, True ), + ParameterInfo("DKBLUE", [], False, True ), + ParameterInfo("BLACK", [], False, True ), - ParameterInfo("COMMA", True, True, False, False, True ), - ParameterInfo("SIGNED_WORD", True, True, False, False, True ), - ParameterInfo("UNSIGNED_WORD", True, True, False, False, True ), - ParameterInfo("CURRENCY", True, False, False, False, True ), - ParameterInfo("VELOCITY", True, False, False, False, True ), - ParameterInfo("VOLUME", True, False, False, False, True ), - ParameterInfo("VOLUME_SHORT", True, False, False, False, True ), - ParameterInfo("POWER", True, False, False, False, True ), - ParameterInfo("WEIGHT", True, False, False, False, True ), - ParameterInfo("WEIGHT_SHORT", True, False, False, False, True ), - ParameterInfo("CARGO_LONG", True, False, True, False, True ), - ParameterInfo("CARGO_SHORT", True, False, False, False, True ), # short cargo description, only ### tons, or ### litres - ParameterInfo("CARGO_TINY", True, False, False, False, True ), # tiny cargo description with only the amount - ParameterInfo("HEX", True, True, False, False, True ), - ParameterInfo("STRING", True, False, True , True, True ), - ParameterInfo("DATE1920_LONG", True, False, False, False, True ), - ParameterInfo("DATE1920_SHORT", True, False, False, False, True ), - ParameterInfo("DATE_LONG", True, False, False, False, True ), - ParameterInfo("DATE_SHORT", True, False, False, False, True ), - ParameterInfo("POP_WORD", True, False, False, False, True ), - ParameterInfo("STATION", True, False, False, False, True ), + ParameterInfo("COMMA", [PP_], False, True ), + ParameterInfo("SIGNED_WORD", [PP_], False, True ), + ParameterInfo("UNSIGNED_WORD", [PP_], False, True ), + ParameterInfo("CURRENCY", [PP_], False, True ), + ParameterInfo("VELOCITY", [PP_], False, True ), + ParameterInfo("VOLUME", [PP_], False, True ), + ParameterInfo("VOLUME_SHORT", [PP_], False, True ), + ParameterInfo("POWER", [PP_], False, True ), + ParameterInfo("WEIGHT", [PP_], False, True ), + ParameterInfo("WEIGHT_SHORT", [PP_], False, True ), + ParameterInfo("CARGO_LONG", [P_G, PP_], False, True ), + ParameterInfo("CARGO_SHORT", [P__, PP_], False, True ), # short cargo description, only ### tons, or ### litres + ParameterInfo("CARGO_TINY", [P__, PP_], False, True ), # tiny cargo description with only the amount + ParameterInfo("HEX", [PP_], False, True ), + ParameterInfo("STRING", [P_G], True, True ), + ParameterInfo("DATE1920_LONG", [P__], False, True ), + ParameterInfo("DATE1920_SHORT", [P__], False, True ), + ParameterInfo("DATE_LONG", [P__], False, True ), + ParameterInfo("DATE_SHORT", [P__], False, True ), + ParameterInfo("POP_WORD", [P__], False, True ), + ParameterInfo("STATION", [P__], False, True ), ] NEWGRF_PARAMETERS = dict((x.literal, x) for x in _NEWGRF_PARAMETERS) @@ -201,95 +222,95 @@ # {{{ GS_PARAMETERS # Based on OpenTTD src/tables/strgen_tables.h r26050 _GS_PARAMETERS = [ - ParameterInfo("TINY_FONT", False, False, False, False, True ), - ParameterInfo("BIG_FONT", False, False, False, False, True ), + ParameterInfo("TINY_FONT", [], False, True ), + ParameterInfo("BIG_FONT", [], False, True ), - ParameterInfo("BLUE", False, False, False, False, False), - ParameterInfo("SILVER", False, False, False, False, False), - ParameterInfo("GOLD", False, False, False, False, False), - ParameterInfo("RED", False, False, False, False, False), - ParameterInfo("PURPLE", False, False, False, False, False), - ParameterInfo("LTBROWN", False, False, False, False, False), - ParameterInfo("ORANGE", False, False, False, False, False), - ParameterInfo("GREEN", False, False, False, False, False), - ParameterInfo("YELLOW", False, False, False, False, False), - ParameterInfo("DKGREEN", False, False, False, False, False), - ParameterInfo("CREAM", False, False, False, False, False), - ParameterInfo("BROWN", False, False, False, False, False), - ParameterInfo("WHITE", False, False, False, False, False), - ParameterInfo("LTBLUE", False, False, False, False, False), - ParameterInfo("GRAY", False, False, False, False, False), - ParameterInfo("DKBLUE", False, False, False, False, False), - ParameterInfo("BLACK", False, False, False, False, False), + ParameterInfo("BLUE", [], False, False), + ParameterInfo("SILVER", [], False, False), + ParameterInfo("GOLD", [], False, False), + ParameterInfo("RED", [], False, False), + ParameterInfo("PURPLE", [], False, False), + ParameterInfo("LTBROWN", [], False, False), + ParameterInfo("ORANGE", [], False, False), + ParameterInfo("GREEN", [], False, False), + ParameterInfo("YELLOW", [], False, False), + ParameterInfo("DKGREEN", [], False, False), + ParameterInfo("CREAM", [], False, False), + ParameterInfo("BROWN", [], False, False), + ParameterInfo("WHITE", [], False, False), + ParameterInfo("LTBLUE", [], False, False), + ParameterInfo("GRAY", [], False, False), + ParameterInfo("DKBLUE", [], False, False), + ParameterInfo("BLACK", [], False, False), - ParameterInfo("STRING1", True, True, True, True, True, "STRING"), - ParameterInfo("STRING2", True, True, True, True, True, "STRING"), - ParameterInfo("STRING3", True, True, True, True, True, "STRING"), - ParameterInfo("STRING4", True, True, True, True, True, "STRING"), - ParameterInfo("STRING5", True, True, True, True, True, "STRING"), - ParameterInfo("STRING6", True, True, True, True, True, "STRING"), - ParameterInfo("STRING7", True, True, True, True, True, "STRING"), + ParameterInfo("STRING1", [P_G, PPG], True, True, "STRING"), + ParameterInfo("STRING2", [P_G, PPG, PPG], True, True, "STRING"), + ParameterInfo("STRING3", [P_G, PPG, PPG, PPG], True, True, "STRING"), + ParameterInfo("STRING4", [P_G, PPG, PPG, PPG, PPG], True, True, "STRING"), + ParameterInfo("STRING5", [P_G, PPG, PPG, PPG, PPG, PPG], True, True, "STRING"), + ParameterInfo("STRING6", [P_G, PPG, PPG, PPG, PPG, PPG, PPG], True, True, "STRING"), + ParameterInfo("STRING7", [P_G, PPG, PPG, PPG, PPG, PPG, PPG, PPG], True, True, "STRING"), - ParameterInfo("INDUSTRY", True, False, True, True, True ), # takes an industry number. - ParameterInfo("CARGO_LONG", True, False, True, False, True ), - ParameterInfo("CARGO_SHORT", True, False, False, False, True ), # short cargo description, only ### tons, or ### litres - ParameterInfo("CARGO_TINY", True, False, False, False, True ), # tiny cargo description with only the amount - ParameterInfo("CARGO_LIST", True, False, False, True, True ), - ParameterInfo("POWER", True, False, False, False, True ), - ParameterInfo("VOLUME_LONG", True, False, False, False, True ), - ParameterInfo("VOLUME_SHORT", True, False, False, False, True ), - ParameterInfo("WEIGHT_LONG", True, False, False, False, True ), - ParameterInfo("WEIGHT_SHORT", True, False, False, False, True ), - ParameterInfo("FORCE", True, False, False, False, True ), - ParameterInfo("VELOCITY", True, False, False, False, True ), - ParameterInfo("HEIGHT", True, False, False, False, True ), - ParameterInfo("DATE_TINY", True, False, False, False, True ), - ParameterInfo("DATE_SHORT", True, False, False, True, True ), - ParameterInfo("DATE_LONG", True, False, False, True, True ), - ParameterInfo("DATE_ISO", True, False, False, False, True ), + ParameterInfo("INDUSTRY", [P_G], True, True ), # takes an industry number. + ParameterInfo("CARGO_LONG", [P_G, PP_], False, True ), + ParameterInfo("CARGO_SHORT", [P__, PP_], False, True ), # short cargo description, only ### tons, or ### litres + ParameterInfo("CARGO_TINY", [P__, PP_], False, True ), # tiny cargo description with only the amount + ParameterInfo("CARGO_LIST", [P__], True, True ), + ParameterInfo("POWER", [PP_], False, True ), + ParameterInfo("VOLUME_LONG", [PP_], False, True ), + ParameterInfo("VOLUME_SHORT", [PP_], False, True ), + ParameterInfo("WEIGHT_LONG", [PP_], False, True ), + ParameterInfo("WEIGHT_SHORT", [PP_], False, True ), + ParameterInfo("FORCE", [PP_], False, True ), + ParameterInfo("VELOCITY", [PP_], False, True ), + ParameterInfo("HEIGHT", [PP_], False, True ), + ParameterInfo("DATE_TINY", [P__], False, True ), + ParameterInfo("DATE_SHORT", [P__], True, True ), + ParameterInfo("DATE_LONG", [P__], True, True ), + ParameterInfo("DATE_ISO", [P__], False, True ), - ParameterInfo("STRING", True, True, True, True, True ), - ParameterInfo("RAW_STRING", True, True, True, False, True, "STRING"), + ParameterInfo("STRING", [P_G], True, True ), + ParameterInfo("RAW_STRING", [P_G], False, True, "STRING"), - ParameterInfo("COMMA", True, True, False, False, True ), # Number with comma - ParameterInfo("DECIMAL", True, True, False, False, True ), # Number with comma and fractional part. - ParameterInfo("NUM", True, True, False, False, True ), # Signed number - ParameterInfo("ZEROFILL_NUM", True, True, False, False, True ), # Unsigned number with zero fill, e.g. "02". - ParameterInfo("BYTES", True, True, False, False, True ), # Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB" - ParameterInfo("HEX", True, True, False, False, True ), # Hexadecimally printed number + ParameterInfo("COMMA", [PP_], False, True ), # Number with comma + ParameterInfo("DECIMAL", [PP_, P__], False, True ), # Number with comma and fractional part. + ParameterInfo("NUM", [PP_], False, True ), # Signed number + ParameterInfo("ZEROFILL_NUM", [PP_, P__], False, True ), # Unsigned number with zero fill, e.g. "02". + ParameterInfo("BYTES", [PP_], False, True ), # Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB" + ParameterInfo("HEX", [PP_], False, True ), # Hexadecimally printed number - ParameterInfo("CURRENCY_LONG", True, True, False, False, True ), - ParameterInfo("CURRENCY_SHORT", True, True, False, False, True ), # compact currency + ParameterInfo("CURRENCY_LONG", [PP_], False, True ), + ParameterInfo("CURRENCY_SHORT", [PP_], False, True ), # compact currency - ParameterInfo("WAYPOINT", True, False, True, False, True ), # waypoint name - ParameterInfo("STATION", True, False, True, False, True ), - ParameterInfo("DEPOT", True, False, True, False, True ), - ParameterInfo("TOWN", True, False, True, False, True ), - ParameterInfo("GROUP", True, False, True, False, True ), - ParameterInfo("SIGN", True, False, True, False, True ), - ParameterInfo("ENGINE", True, False, True, False, True ), - ParameterInfo("VEHICLE", True, False, True, False, True ), - ParameterInfo("COMPANY", True, False, True, False, True ), - ParameterInfo("COMPANY_NUM", True, False, False, False, True ), - ParameterInfo("PRESIDENT_NAME", True, False, True, False, True ), + ParameterInfo("WAYPOINT", [P_G], False, True ), # waypoint name + ParameterInfo("STATION", [P_G], False, True ), + ParameterInfo("DEPOT", [P_G, P__], False, True ), + ParameterInfo("TOWN", [P_G], False, True ), + ParameterInfo("GROUP", [P_G], False, True ), + ParameterInfo("SIGN", [P_G], False, True ), + ParameterInfo("ENGINE", [P_G], False, True ), + ParameterInfo("VEHICLE", [P_G], False, True ), + ParameterInfo("COMPANY", [P_G], False, True ), + ParameterInfo("COMPANY_NUM", [P__], False, True ), + ParameterInfo("PRESIDENT_NAME", [P_G], False, True ), - ParameterInfo("TRAIN", False, False, False, False, True ), - ParameterInfo("LORRY", False, False, False, False, True ), - ParameterInfo("BUS", False, False, False, False, True ), - ParameterInfo("PLANE", False, False, False, False, True ), - ParameterInfo("SHIP", False, False, False, False, True ), - ParameterInfo("NBSP", False, False, False, False, False), - ParameterInfo("COPYRIGHT", False, False, False, False, True ), + ParameterInfo("TRAIN", [], False, True ), + ParameterInfo("LORRY", [], False, True ), + ParameterInfo("BUS", [], False, True ), + ParameterInfo("PLANE", [], False, True ), + ParameterInfo("SHIP", [], False, True ), + ParameterInfo("NBSP", [], False, False), + ParameterInfo("COPYRIGHT", [], False, True ), # The following are directional formatting codes used to get the RTL strings right: # http://www.unicode.org/unicode/reports/tr9/#Directional_Formatting_Codes - ParameterInfo("LRM", False, False, False, False, False), - ParameterInfo("RLM", False, False, False, False, False), - ParameterInfo("LRE", False, False, False, False, False), - ParameterInfo("RLE", False, False, False, False, False), - ParameterInfo("LRO", False, False, False, False, False), - ParameterInfo("RLO", False, False, False, False, False), - ParameterInfo("PDF", False, False, False, False, False), + ParameterInfo("LRM", [], False, False), + ParameterInfo("RLM", [], False, False), + ParameterInfo("LRE", [], False, False), + ParameterInfo("RLE", [], False, False), + ParameterInfo("LRO", [], False, False), + ParameterInfo("RLO", [], False, False), + ParameterInfo("PDF", [], False, False), ] GS_PARAMETERS = dict((x.literal, x) for x in _GS_PARAMETERS) @@ -300,25 +321,25 @@ # Some string parameters are only allowed in the OpenTTD project. # While they technically also work in Game Scripts, disencourage the usage. # This also includes the "sprite" characters. - ParameterInfo("REV", False, False, False, False, True ), - ParameterInfo("STATION_FEATURES", True, False, False, False, True ), # station features string, icons of the features - ParameterInfo("UP_ARROW", False, False, False, False, True ), - ParameterInfo("SMALL_UP_ARROW", False, False, False, False, True ), - ParameterInfo("SMALL_DOWN_ARROW", False, False, False, False, True ), - ParameterInfo("DOWN_ARROW", False, False, False, False, True ), - ParameterInfo("CHECKMARK", False, False, False, False, True ), - ParameterInfo("CROSS", False, False, False, False, True ), - ParameterInfo("RIGHT_ARROW", False, False, False, False, False), - ParameterInfo("SMALL_LEFT_ARROW", False, False, False, False, False), - ParameterInfo("SMALL_RIGHT_ARROW", False, False, False, False, False), + ParameterInfo("REV", [], False, True ), + ParameterInfo("STATION_FEATURES", [P__], False, True ), # station features string, icons of the features + ParameterInfo("UP_ARROW", [], False, True ), + ParameterInfo("SMALL_UP_ARROW", [], False, True ), + ParameterInfo("SMALL_DOWN_ARROW", [], False, True ), + ParameterInfo("DOWN_ARROW", [], False, True ), + ParameterInfo("CHECKMARK", [], False, True ), + ParameterInfo("CROSS", [], False, True ), + ParameterInfo("RIGHT_ARROW", [], False, False), # left/right arrows are not critical due to LTR/RTL languages + ParameterInfo("SMALL_LEFT_ARROW", [], False, False), + ParameterInfo("SMALL_RIGHT_ARROW", [], False, False), ] OPENTTD_PARAMETERS = dict((x.literal, x) for x in _OPENTTD_PARAMETERS) OPENTTD_PARAMETERS.update((x.literal, x) for x in _GS_PARAMETERS) # }}} -NL_PARAMETER = ParameterInfo("", False, False, False, False, False) -CURLY_PARAMETER = ParameterInfo("{", False, False, False, False, False) +NL_PARAMETER = ParameterInfo("", [], False, False) +CURLY_PARAMETER = ParameterInfo("{", [], False, False) # Available project types, ordered by internal name.