Loading

Paste #pvcko8qz5

  1. diff -r 614b4710dc7e webtranslate/newgrf/language_file.py
  2. --- a/webtranslate/newgrf/language_file.py  Wed May 27 19:44:13 2015 +0200
  3. +++ b/webtranslate/newgrf/language_file.py  Thu May 28 17:59:54 2015 +0200
  4. @@ -34,7 +34,7 @@
  5.  gender_assign_pat = re.compile('{G *= *([^ }]+) *}')
  6.  argument_pat = re.compile('[ \\t]+([^"][^ \\t}]*|"[^"}]*")')
  7.  end_argument_pat = re.compile('[ \\t]*}')
  8. -number_pat = re.compile('[0-9]+$')
  9. +posref_pat = re.compile('([0-9]+)(:([0-9]+))?$')
  10.  
  11.  def check_string(projtype, text, default_case, extra_commands, lng, in_blng, save_pieces = False):
  12.      """
  13. @@ -130,7 +130,7 @@
  14.                      string_info.add_error(ErrorMessage(ERROR, None, "Case {} of string command {} does not exist in the language".format(case, m.group(2))))
  15.                      return string_info
  16.  
  17. -            if not entry.takes_param:
  18. +            if len(entry.parameters) == 0:
  19.                  if argnum is not None:
  20.                      string_info.add_error(ErrorMessage(ERROR, None, "String command {} does not take an argument count".format(m.group(2))))
  21.                      return string_info
  22. @@ -154,14 +154,22 @@
  23.                  return string_info
  24.              elif len(args) > 0:
  25.                  # If the first argument is a number, it cannot be a value for the plural command.
  26. -                m = number_pat.match(args[0])
  27. +                m = posref_pat.match(args[0])
  28.                  if m:
  29. -                    num = int(args[0], 10)
  30. -                    cmd_num = num
  31. +                    num = int(m.group(1), 10)
  32. +                    sub = m.group(3)
  33. +
  34. +                    if sub is None:
  35. +                        cmd_num = (num, None)
  36. +                        num = (num, 0)
  37. +                    else:
  38. +                        sub = int(sub, 10)
  39. +                        num = cmd_num = (num, sub)
  40. +
  41.                      cmd_args = args[1:]
  42.                  else:
  43. -                    num = pos - 1
  44. -                    cmd_num = None
  45. +                    num = (pos - 1, 0)
  46. +                    cmd_num = (None, None)
  47.                      cmd_args = args
  48.  
  49.                  if len(cmd_args) == plural_count:
  50. @@ -206,14 +214,22 @@
  51.                  return string_info
  52.              elif len(args) > 0:
  53.                  # If the first argument is a number, it cannot be a value for the plural command.
  54. -                m = number_pat.match(args[0])
  55. +                m = posref_pat.match(args[0])
  56.                  if m:
  57. -                    num = int(args[0], 10)
  58. -                    cmd_num = num
  59. +                    num = int(m.group(1), 10)
  60. +                    sub = m.group(3)
  61. +
  62. +                    if sub is None:
  63. +                        cmd_num = (num, None)
  64. +                        num = (num, 0)
  65. +                    else:
  66. +                        sub = int(sub, 10)
  67. +                        num = cmd_num = (num, sub)
  68. +
  69.                      cmd_args = args[1:]
  70.                  else:
  71. -                    num = pos
  72. -                    cmd_num = None
  73. +                    num = (pos, 0)
  74. +                    cmd_num = (None, None)
  75.                      cmd_args = args
  76.  
  77.                  if len(cmd_args) == expected:
  78. @@ -227,7 +243,9 @@
  79.          string_info.add_error(ErrorMessage(ERROR, None, "Unknown {...} command found in the string"))
  80.          return string_info
  81.  
  82. -    string_info.check_sanity()
  83. +    if in_blng:
  84. +        string_info.check_plural_and_gender(string_info)
  85. +
  86.      return string_info
  87.  
  88.  # {{{ def get_arguments(text, cmd, idx, string_info):
  89. @@ -351,7 +369,7 @@
  90.      Piece representing a plural {P ...} command.
  91.  
  92.      @param cmd_num: Number given to the command by the user, if provided.
  93. -    @type  cmd_num: C{int} or C{None}
  94. +    @type  cmd_num: C{pair} of (C{int} or C{None})
  95.  
  96.      @ivar cmd_args: Plural command arguments.
  97.      @type cmd_args: C{list} of C{str}
  98. @@ -361,10 +379,12 @@
  99.          self.cmd_num = cmd_num
  100.  
  101.      def get_translation_text(self):
  102. -        if self.cmd_num is None:
  103. -            prefix = "{P "
  104. -        else:
  105. -            prefix = "{P " + str(self.cmd_num) + " "
  106. +        prefix = "{P "
  107. +        if self.cmd_num[0] is not None:
  108. +            prefix += str(self.cmd_num[0])
  109. +            if self.cmd_num[1] is not None:
  110. +                prefix += ":" + str(self.cmd_num[1])
  111. +            prefix += " "
  112.          return prefix + " ".join(self.cmd_args) + "}"
  113.  
  114.  class GenderPiece(StringPiece):
  115. @@ -372,7 +392,7 @@
  116.      Piece representing a gender {G ...} command.
  117.  
  118.      @param cmd_num: Number given to the command by the user, if provided.
  119. -    @type  cmd_num: C{int} or C{None}
  120. +    @type  cmd_num: C{pair} of (C{int} or C{None})
  121.  
  122.      @ivar cmd_args: Gender command arguments.
  123.      @type cmd_args: C{list} of C{str}
  124. @@ -382,10 +402,12 @@
  125.          self.cmd_num = cmd_num
  126.  
  127.      def get_translation_text(self):
  128. -        if self.cmd_num is None:
  129. -            prefix = "{G "
  130. -        else:
  131. -            prefix = "{G " + str(self.cmd_num) + " "
  132. +        prefix = "{G "
  133. +        if self.cmd_num[0] is not None:
  134. +            prefix += str(self.cmd_num[0])
  135. +            if self.cmd_num[1] is not None:
  136. +                prefix += ":" + str(self.cmd_num[1])
  137. +            prefix += " "
  138.          return prefix + " ".join(self.cmd_args) + "}"
  139.  
  140.  class GenderAssignPiece(StringPiece):
  141. @@ -500,10 +522,10 @@
  142.          Add a gender query for parameter L{pos}.
  143.  
  144.          @param pos: String parameter number used for gender query.
  145. -        @type  pos: C{int}
  146. +        @type  pos: (C{int}, C{int})
  147.  
  148.          @param cmd_num: Number given to the command by the user, if provided.
  149. -        @type  cmd_num: C{int} or C{None}
  150. +        @type  cmd_num: C{pair} of (C{int} or C{None})
  151.  
  152.          @param cmd_args: Command arguments.
  153.          @type  cmd_args: C{list} of C{str}
  154. @@ -517,10 +539,10 @@
  155.          Add a plural query for parameter L{pos}.
  156.  
  157.          @param pos: String parameter number used for plural query.
  158. -        @type  pos: C{int}
  159. +        @type  pos: (C{int}, C{int})
  160.  
  161.          @param cmd_num: Number given to the command by the user, if provided.
  162. -        @type  cmd_num: C{int} or C{None}
  163. +        @type  cmd_num: C{pair} of (C{int} or C{None})
  164.  
  165.          @param cmd_args: Command arguments.
  166.          @type  cmd_args: C{list} of C{str}
  167. @@ -607,32 +629,60 @@
  168.          """
  169.          self.pieces.append(GenderAssignPiece(gender))
  170.  
  171. -    def check_sanity(self):
  172. +    def check_plural_and_gender(self, base_info):
  173.          """
  174. -        Check sanity of the string commands and parameters.
  175. +        Check plural and gender parameter references.
  176. +
  177. +        Note: The base language is required to know the exact string commands and amount of sub-parameters.
  178. +
  179. +        @param base_info: Information about string parameters from the base language.
  180. +        @type  base_info: L{StringInfo}
  181. +
  182. +        @return: True of references are valid.
  183. +        @rtype:  C{bool}
  184.          """
  185.          ok = True
  186.          if ok:
  187. -            for pos in self.plurals:
  188. -                if pos < 0 or pos >= len(self.commands):
  189. -                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for plural queries {{P ..}}".format(pos)))
  190. +            for pos, sub in self.plurals:
  191. +                pos_name = str(pos)
  192. +                if sub > 0:
  193. +                    pos_name += ":" + str(sub)
  194. +
  195. +                if pos < 0 or pos >= len(base_info.commands):
  196. +                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for plural queries {{P ..}}".format(pos_name)))
  197.                      ok = False
  198.                      continue
  199.  
  200. -                cmd = self.commands[pos]
  201. -                if cmd is None or not cmd.use_plural:
  202. -                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for plural queries {{P ..}}".format(pos)))
  203. +                cmd = base_info.commands[pos]
  204. +                if cmd is None or sub < 0 or sub >= len(cmd.parameters):
  205. +                    self.add_error(ErrorMessage(ERROR, None, "Plural query {{P ..}} references non-existing parameter {}.".format(pos_name)))
  206. +                    ok = False
  207. +                    continue              
  208. +
  209. +                if not cmd.use_plural(sub):
  210. +                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for plural queries {{P ..}}".format(pos_name)))
  211.                      ok = False
  212.  
  213.          if ok:
  214. -            for pos in self.genders:
  215. -                if pos < 0 or pos >= len(self.commands):
  216. -                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for gender queries {{G ..}}".format(pos)))
  217. +            for pos, sub in self.genders:
  218. +                pos_name = str(pos)
  219. +                if sub > 0:
  220. +                    pos_name += ":" + str(sub)
  221. +
  222. +                if pos < 0 or pos >= len(base_info.commands):
  223. +                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} is out of bounds for gender queries {{G ..}}".format(pos_name)))
  224.                      continue
  225.  
  226. -                cmd = self.commands[pos]
  227. -                if cmd is None or not cmd.use_gender:
  228. -                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for gender queries {{G ..}}".format(pos)))
  229. +                cmd = base_info.commands[pos]
  230. +                if cmd is None or sub < 0 or sub >= len(cmd.parameters):
  231. +                    self.add_error(ErrorMessage(ERROR, None, "Gender query {{G ..}} references non-existing parameter {}.".format(pos_name)))
  232. +                    ok = False
  233. +                    continue              
  234. +
  235. +                if not cmd.use_gender(sub):
  236. +                    self.add_error(ErrorMessage(ERROR, None, "String parameter {} may not be used for gender queries {{G ..}}".format(pos_name)))
  237. +
  238. +        return ok
  239.  # }}}
  240.  # }}}
  241.  
  242. @@ -869,7 +919,9 @@
  243.          if line.startswith(bom):
  244.              line = line[len(bom):]
  245.  
  246. -        if line.startswith('##'):
  247. +        # Comments either have 1 or >= 3 leading '#'.
  248. +        # The pragma ##id is special. It belongs to the skeleton, not to the header. Threat it like a comment.
  249. +        if line.startswith('##') and not line.startswith('###') and not line.startswith('##id'):
  250.              if seen_strings:
  251.                  data.add_error(ErrorMessage(ERROR, lnum, "Cannot change language properties after processing strings"))
  252.                  continue
  253. @@ -991,6 +1043,10 @@
  254.              lng_info.add_error(ErrorMessage(ERROR, None, msg))
  255.              return False
  256.  
  257. +    # Validate plural and gender references
  258. +    if not lng_info.check_plural_and_gender(base_info):
  259. +        return False
  260. +
  261.      # Non-positional commands must match in count.
  262.      if base_info.non_positionals != lng_info.non_positionals:
  263.          for bname, bcnt in base_info.non_positionals.items():
  264. diff -r 614b4710dc7e webtranslate/project_type.py
  265. --- a/webtranslate/project_type.py  Wed May 27 19:44:13 2015 +0200
  266. +++ b/webtranslate/project_type.py  Thu May 28 17:59:54 2015 +0200
  267. @@ -107,14 +107,8 @@
  268.      @ivar literal: Text of the literal (without curly brackets).
  269.      @type literal: C{str}
  270.  
  271. -    @ivar takes_param: Takes a string parameter.
  272. -    @type takes_param: C{bool}
  273. -
  274. -    @ivar use_plural: May be used for plural.
  275. -    @type use_plural: C{bool}
  276. -
  277. -    @ivar use_gender: May be used for gender.
  278. -    @type use_gender: C{bool}
  279. +    @ivar parameters: For each parameter whether it is suitable for plural or gender forms.
  280. +    @type parameters: C{list} of (C{bool}, C{bool})
  281.  
  282.      @ivar allow_case: May have a ".case" suffix.
  283.      @type allow_case: C{bool}
  284. @@ -125,15 +119,37 @@
  285.      @ivar translated_cmd: For commands in the base language, command to use checking and displaying.
  286.      @type translated_cmd: C{str} or C{None} (the latter means use C{self})
  287.      """
  288. -    def __init__(self, literal, takes_param, use_plural, use_gender, allow_case, critical, translated_cmd = None):
  289. +    def __init__(self, literal, parameters, allow_case, critical, translated_cmd = None):
  290.          self.literal = literal
  291. -        self.takes_param = takes_param
  292. -        self.use_plural = use_plural
  293. -        self.use_gender = use_gender
  294. +        self.parameters = parameters
  295.          self.allow_case = allow_case
  296.          self.critical = critical
  297.          self.translated_cmd = translated_cmd
  298.  
  299. +    def use_plural(self, subindex):
  300. +        """
  301. +        Check whether a parameter can be used for plural forms.
  302. +
  303. +        @param subindex: Parameter index.
  304. +        @type  subindex: C{int}
  305. +
  306. +        @return: True if suitable for plural form.
  307. +        @rtype:  C{bool}
  308. +        """
  309. +        return subindex >= 0 and subindex < len(self.parameters) and self.parameters[subindex][0]
  310. +
  311. +    def use_gender(self, subindex):
  312. +        """
  313. +        Check whether a parameter can be used for gender forms.
  314. +
  315. +        @param subindex: Parameter index.
  316. +        @type  subindex: C{int}
  317. +
  318. +        @return: True if suitable for gender form.
  319. +        @rtype:  C{bool}
  320. +        """
  321. +        return subindex >= 0 and subindex < len(self.parameters) and self.parameters[subindex][1]
  322. +
  323.      def get_translated_cmd(self):
  324.          """
  325.          Get the command name to use for a translation.
  326. @@ -144,56 +160,61 @@
  327.          if self.translated_cmd is None: return self.literal
  328.          return self.translated_cmd
  329.  
  330. +P__ = (False, False) # Parameter, not suitable for plural or gender
  331. +PP_ = (True,  False) # Parameter suitable for plural
  332. +P_G = (False, True)  # Parameter suitable for gender
  333. +PPG = (True,  True)  # Parameter suitable for both plural and gender
  334. +
  335.  # {{{ NEWGRF_PARAMETERS
  336.  _NEWGRF_PARAMETERS = [
  337. -    ParameterInfo("NBSP",           False, False, False, False, False),
  338. -    ParameterInfo("COPYRIGHT",      False, False, False, False, True ),
  339. -    ParameterInfo("TRAIN",          False, False, False, False, True ),
  340. -    ParameterInfo("LORRY",          False, False, False, False, True ),
  341. -    ParameterInfo("BUS",            False, False, False, False, True ),
  342. -    ParameterInfo("PLANE",          False, False, False, False, True ),
  343. -    ParameterInfo("SHIP",           False, False, False, False, True ),
  344. -    ParameterInfo("TINYFONT",       False, False, False, False, True ),
  345. -    ParameterInfo("BIGFONT",        False, False, False, False, True ),
  346. -    ParameterInfo("BLUE",           False, False, False, False, True ),
  347. -    ParameterInfo("SILVER",         False, False, False, False, True ),
  348. -    ParameterInfo("GOLD",           False, False, False, False, True ),
  349. -    ParameterInfo("RED",            False, False, False, False, True ),
  350. -    ParameterInfo("PURPLE",         False, False, False, False, True ),
  351. -    ParameterInfo("LTBROWN",        False, False, False, False, True ),
  352. -    ParameterInfo("ORANGE",         False, False, False, False, True ),
  353. -    ParameterInfo("GREEN",          False, False, False, False, True ),
  354. -    ParameterInfo("YELLOW",         False, False, False, False, True ),
  355. -    ParameterInfo("DKGREEN",        False, False, False, False, True ),
  356. -    ParameterInfo("CREAM",          False, False, False, False, True ),
  357. -    ParameterInfo("BROWN",          False, False, False, False, True ),
  358. -    ParameterInfo("WHITE",          False, False, False, False, True ),
  359. -    ParameterInfo("LTBLUE",         False, False, False, False, True ),
  360. -    ParameterInfo("GRAY",           False, False, False, False, True ),
  361. -    ParameterInfo("DKBLUE",         False, False, False, False, True ),
  362. -    ParameterInfo("BLACK",          False, False, False, False, True ),
  363. +    ParameterInfo("NBSP",           [], False, False),
  364. +    ParameterInfo("COPYRIGHT",      [], False, True ),
  365. +    ParameterInfo("TRAIN",          [], False, True ),
  366. +    ParameterInfo("LORRY",          [], False, True ),
  367. +    ParameterInfo("BUS",            [], False, True ),
  368. +    ParameterInfo("PLANE",          [], False, True ),
  369. +    ParameterInfo("SHIP",           [], False, True ),
  370. +    ParameterInfo("TINYFONT",       [], False, True ),
  371. +    ParameterInfo("BIGFONT",        [], False, True ),
  372. +    ParameterInfo("BLUE",           [], False, True ),
  373. +    ParameterInfo("SILVER",         [], False, True ),
  374. +    ParameterInfo("GOLD",           [], False, True ),
  375. +    ParameterInfo("RED",            [], False, True ),
  376. +    ParameterInfo("PURPLE",         [], False, True ),
  377. +    ParameterInfo("LTBROWN",        [], False, True ),
  378. +    ParameterInfo("ORANGE",         [], False, True ),
  379. +    ParameterInfo("GREEN",          [], False, True ),
  380. +    ParameterInfo("YELLOW",         [], False, True ),
  381. +    ParameterInfo("DKGREEN",        [], False, True ),
  382. +    ParameterInfo("CREAM",          [], False, True ),
  383. +    ParameterInfo("BROWN",          [], False, True ),
  384. +    ParameterInfo("WHITE",          [], False, True ),
  385. +    ParameterInfo("LTBLUE",         [], False, True ),
  386. +    ParameterInfo("GRAY",           [], False, True ),
  387. +    ParameterInfo("DKBLUE",         [], False, True ),
  388. +    ParameterInfo("BLACK",          [], False, True ),
  389.  
  390. -    ParameterInfo("COMMA",          True,  True,  False, False, True ),
  391. -    ParameterInfo("SIGNED_WORD",    True,  True,  False, False, True ),
  392. -    ParameterInfo("UNSIGNED_WORD",  True,  True,  False, False, True ),
  393. -    ParameterInfo("CURRENCY",       True,  False, False, False, True ),
  394. -    ParameterInfo("VELOCITY",       True,  False, False, False, True ),
  395. -    ParameterInfo("VOLUME",         True,  False, False, False, True ),
  396. -    ParameterInfo("VOLUME_SHORT",   True,  False, False, False, True ),
  397. -    ParameterInfo("POWER",          True,  False, False, False, True ),
  398. -    ParameterInfo("WEIGHT",         True,  False, False, False, True ),
  399. -    ParameterInfo("WEIGHT_SHORT",   True,  False, False, False, True ),
  400. -    ParameterInfo("CARGO_LONG",     True,  False, True,  False, True ),
  401. -    ParameterInfo("CARGO_SHORT",    True,  False, False, False, True ), # short cargo description, only ### tons, or ### litres
  402. -    ParameterInfo("CARGO_TINY",     True,  False, False, False, True ), # tiny cargo description with only the amount
  403. -    ParameterInfo("HEX",            True,  True,  False, False, True ),
  404. -    ParameterInfo("STRING",         True,  False, True , True,  True ),
  405. -    ParameterInfo("DATE1920_LONG",  True,  False, False, False, True ),
  406. -    ParameterInfo("DATE1920_SHORT", True,  False, False, False, True ),
  407. -    ParameterInfo("DATE_LONG",      True,  False, False, False, True ),
  408. -    ParameterInfo("DATE_SHORT",     True,  False, False, False, True ),
  409. -    ParameterInfo("POP_WORD",       True,  False, False, False, True ),
  410. -    ParameterInfo("STATION",        True,  False, False, False, True ),
  411. +    ParameterInfo("COMMA",          [PP_],      False, True ),
  412. +    ParameterInfo("SIGNED_WORD",    [PP_],      False, True ),
  413. +    ParameterInfo("UNSIGNED_WORD",  [PP_],      False, True ),
  414. +    ParameterInfo("CURRENCY",       [PP_],      False, True ),
  415. +    ParameterInfo("VELOCITY",       [PP_],      False, True ),
  416. +    ParameterInfo("VOLUME",         [PP_],      False, True ),
  417. +    ParameterInfo("VOLUME_SHORT",   [PP_],      False, True ),
  418. +    ParameterInfo("POWER",          [PP_],      False, True ),
  419. +    ParameterInfo("WEIGHT",         [PP_],      False, True ),
  420. +    ParameterInfo("WEIGHT_SHORT",   [PP_],      False, True ),
  421. +    ParameterInfo("CARGO_LONG",     [P_G, PP_], False, True ),
  422. +    ParameterInfo("CARGO_SHORT",    [P__, PP_], False, True ), # short cargo description, only ### tons, or ### litres
  423. +    ParameterInfo("CARGO_TINY",     [P__, PP_], False, True ), # tiny cargo description with only the amount
  424. +    ParameterInfo("HEX",            [PP_],      False, True ),
  425. +    ParameterInfo("STRING",         [P_G],      True,  True ),
  426. +    ParameterInfo("DATE1920_LONG",  [P__],      False, True ),
  427. +    ParameterInfo("DATE1920_SHORT", [P__],      False, True ),
  428. +    ParameterInfo("DATE_LONG",      [P__],      False, True ),
  429. +    ParameterInfo("DATE_SHORT",     [P__],      False, True ),
  430. +    ParameterInfo("POP_WORD",       [P__],      False, True ),
  431. +    ParameterInfo("STATION",        [P__],      False, True ),
  432.  ]
  433.  
  434.  NEWGRF_PARAMETERS = dict((x.literal, x) for x in _NEWGRF_PARAMETERS)
  435. @@ -201,95 +222,95 @@
  436.  # {{{ GS_PARAMETERS
  437.  # Based on OpenTTD src/tables/strgen_tables.h r26050
  438.  _GS_PARAMETERS = [
  439. -    ParameterInfo("TINY_FONT",         False, False, False, False, True ),
  440. -    ParameterInfo("BIG_FONT",          False, False, False, False, True ),
  441. +    ParameterInfo("TINY_FONT",         [], False, True ),
  442. +    ParameterInfo("BIG_FONT",          [], False, True ),
  443.  
  444. -    ParameterInfo("BLUE",              False, False, False, False, False),
  445. -    ParameterInfo("SILVER",            False, False, False, False, False),
  446. -    ParameterInfo("GOLD",              False, False, False, False, False),
  447. -    ParameterInfo("RED",               False, False, False, False, False),
  448. -    ParameterInfo("PURPLE",            False, False, False, False, False),
  449. -    ParameterInfo("LTBROWN",           False, False, False, False, False),
  450. -    ParameterInfo("ORANGE",            False, False, False, False, False),
  451. -    ParameterInfo("GREEN",             False, False, False, False, False),
  452. -    ParameterInfo("YELLOW",            False, False, False, False, False),
  453. -    ParameterInfo("DKGREEN",           False, False, False, False, False),
  454. -    ParameterInfo("CREAM",             False, False, False, False, False),
  455. -    ParameterInfo("BROWN",             False, False, False, False, False),
  456. -    ParameterInfo("WHITE",             False, False, False, False, False),
  457. -    ParameterInfo("LTBLUE",            False, False, False, False, False),
  458. -    ParameterInfo("GRAY",              False, False, False, False, False),
  459. -    ParameterInfo("DKBLUE",            False, False, False, False, False),
  460. -    ParameterInfo("BLACK",             False, False, False, False, False),
  461. +    ParameterInfo("BLUE",              [], False, False),
  462. +    ParameterInfo("SILVER",            [], False, False),
  463. +    ParameterInfo("GOLD",              [], False, False),
  464. +    ParameterInfo("RED",               [], False, False),
  465. +    ParameterInfo("PURPLE",            [], False, False),
  466. +    ParameterInfo("LTBROWN",           [], False, False),
  467. +    ParameterInfo("ORANGE",            [], False, False),
  468. +    ParameterInfo("GREEN",             [], False, False),
  469. +    ParameterInfo("YELLOW",            [], False, False),
  470. +    ParameterInfo("DKGREEN",           [], False, False),
  471. +    ParameterInfo("CREAM",             [], False, False),
  472. +    ParameterInfo("BROWN",             [], False, False),
  473. +    ParameterInfo("WHITE",             [], False, False),
  474. +    ParameterInfo("LTBLUE",            [], False, False),
  475. +    ParameterInfo("GRAY",              [], False, False),
  476. +    ParameterInfo("DKBLUE",            [], False, False),
  477. +    ParameterInfo("BLACK",             [], False, False),
  478.  
  479. -    ParameterInfo("STRING1",           True,  True,  True,  True,  True,  "STRING"),
  480. -    ParameterInfo("STRING2",           True,  True,  True,  True,  True,  "STRING"),
  481. -    ParameterInfo("STRING3",           True,  True,  True,  True,  True,  "STRING"),
  482. -    ParameterInfo("STRING4",           True,  True,  True,  True,  True,  "STRING"),
  483. -    ParameterInfo("STRING5",           True,  True,  True,  True,  True,  "STRING"),
  484. -    ParameterInfo("STRING6",           True,  True,  True,  True,  True,  "STRING"),
  485. -    ParameterInfo("STRING7",           True,  True,  True,  True,  True,  "STRING"),
  486. +    ParameterInfo("STRING1",           [P_G, PPG],                                True,  True,  "STRING"),
  487. +    ParameterInfo("STRING2",           [P_G, PPG, PPG],                           True,  True,  "STRING"),
  488. +    ParameterInfo("STRING3",           [P_G, PPG, PPG, PPG],                      True,  True,  "STRING"),
  489. +    ParameterInfo("STRING4",           [P_G, PPG, PPG, PPG, PPG],                 True,  True,  "STRING"),
  490. +    ParameterInfo("STRING5",           [P_G, PPG, PPG, PPG, PPG, PPG],            True,  True,  "STRING"),
  491. +    ParameterInfo("STRING6",           [P_G, PPG, PPG, PPG, PPG, PPG, PPG],       True,  True,  "STRING"),
  492. +    ParameterInfo("STRING7",           [P_G, PPG, PPG, PPG, PPG, PPG, PPG, PPG],  True,  True,  "STRING"),
  493.  
  494. -    ParameterInfo("INDUSTRY",          True,  False, True,  True,  True ), # takes an industry number.
  495. -    ParameterInfo("CARGO_LONG",        True,  False, True,  False, True ),
  496. -    ParameterInfo("CARGO_SHORT",       True,  False, False, False, True ), # short cargo description, only ### tons, or ### litres
  497. -    ParameterInfo("CARGO_TINY",        True,  False, False, False, True ), # tiny cargo description with only the amount
  498. -    ParameterInfo("CARGO_LIST",        True,  False, False, True,  True ),
  499. -    ParameterInfo("POWER",             True,  False, False, False, True ),
  500. -    ParameterInfo("VOLUME_LONG",       True,  False, False, False, True ),
  501. -    ParameterInfo("VOLUME_SHORT",      True,  False, False, False, True ),
  502. -    ParameterInfo("WEIGHT_LONG",       True,  False, False, False, True ),
  503. -    ParameterInfo("WEIGHT_SHORT",      True,  False, False, False, True ),
  504. -    ParameterInfo("FORCE",             True,  False, False, False, True ),
  505. -    ParameterInfo("VELOCITY",          True,  False, False, False, True ),
  506. -    ParameterInfo("HEIGHT",            True,  False, False, False, True ),
  507. -    ParameterInfo("DATE_TINY",         True,  False, False, False, True ),
  508. -    ParameterInfo("DATE_SHORT",        True,  False, False, True,  True ),
  509. -    ParameterInfo("DATE_LONG",         True,  False, False, True,  True ),
  510. -    ParameterInfo("DATE_ISO",          True,  False, False, False, True ),
  511. +    ParameterInfo("INDUSTRY",          [P_G],       True,  True ), # takes an industry number.
  512. +    ParameterInfo("CARGO_LONG",        [P_G, PP_],  False, True ),
  513. +    ParameterInfo("CARGO_SHORT",       [P__, PP_], False, True ), # short cargo description, only ### tons, or ### litres
  514. +    ParameterInfo("CARGO_TINY",        [P__, PP_], False, True ), # tiny cargo description with only the amount
  515. +    ParameterInfo("CARGO_LIST",        [P__],      True,  True ),
  516. +    ParameterInfo("POWER",             [PP_],      False, True ),
  517. +    ParameterInfo("VOLUME_LONG",       [PP_],      False, True ),
  518. +    ParameterInfo("VOLUME_SHORT",      [PP_],      False, True ),
  519. +    ParameterInfo("WEIGHT_LONG",       [PP_],      False, True ),
  520. +    ParameterInfo("WEIGHT_SHORT",      [PP_],      False, True ),
  521. +    ParameterInfo("FORCE",             [PP_],      False, True ),
  522. +    ParameterInfo("VELOCITY",          [PP_],      False, True ),
  523. +    ParameterInfo("HEIGHT",            [PP_],      False, True ),
  524. +    ParameterInfo("DATE_TINY",         [P__],      False, True ),
  525. +    ParameterInfo("DATE_SHORT",        [P__],      True,  True ),
  526. +    ParameterInfo("DATE_LONG",         [P__],      True,  True ),
  527. +    ParameterInfo("DATE_ISO",          [P__],      False, True ),
  528.  
  529. -    ParameterInfo("STRING",            True,  True,  True,  True,  True ),
  530. -    ParameterInfo("RAW_STRING",        True,  True,  True,  False, True,  "STRING"),
  531. +    ParameterInfo("STRING",            [P_G],      True,  True ),
  532. +    ParameterInfo("RAW_STRING",        [P_G],      False, True,  "STRING"),
  533.  
  534. -    ParameterInfo("COMMA",             True,  True,  False, False, True ), # Number with comma
  535. -    ParameterInfo("DECIMAL",           True,  True,  False, False, True ), # Number with comma and fractional part.
  536. -    ParameterInfo("NUM",               True,  True,  False, False, True ), # Signed number
  537. -    ParameterInfo("ZEROFILL_NUM",      True,  True,  False, False, True ), # Unsigned number with zero fill, e.g. "02".
  538. -    ParameterInfo("BYTES",             True,  True,  False, False, True ), # Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB"
  539. -    ParameterInfo("HEX",               True,  True,  False, False, True ), # Hexadecimally printed number
  540. +    ParameterInfo("COMMA",             [PP_],      False, True ), # Number with comma
  541. +    ParameterInfo("DECIMAL",           [PP_, P__], False, True ), # Number with comma and fractional part.
  542. +    ParameterInfo("NUM",               [PP_],      False, True ), # Signed number
  543. +    ParameterInfo("ZEROFILL_NUM",      [PP_, P__], False, True ), # Unsigned number with zero fill, e.g. "02".
  544. +    ParameterInfo("BYTES",             [PP_],      False, True ), # Unsigned number with "bytes", i.e. "1.02 MiB or 123 KiB"
  545. +    ParameterInfo("HEX",               [PP_],      False, True ), # Hexadecimally printed number
  546.  
  547. -    ParameterInfo("CURRENCY_LONG",     True,  True,  False, False, True ),
  548. -    ParameterInfo("CURRENCY_SHORT",    True,  True,  False, False, True ), # compact currency
  549. +    ParameterInfo("CURRENCY_LONG",     [PP_],      False, True ),
  550. +    ParameterInfo("CURRENCY_SHORT",    [PP_],      False, True ), # compact currency
  551.  
  552. -    ParameterInfo("WAYPOINT",          True,  False, True,  False, True ), # waypoint name
  553. -    ParameterInfo("STATION",           True,  False, True,  False, True ),
  554. -    ParameterInfo("DEPOT",             True,  False, True,  False, True ),
  555. -    ParameterInfo("TOWN",              True,  False, True,  False, True ),
  556. -    ParameterInfo("GROUP",             True,  False, True,  False, True ),
  557. -    ParameterInfo("SIGN",              True,  False, True,  False, True ),
  558. -    ParameterInfo("ENGINE",            True,  False, True,  False, True ),
  559. -    ParameterInfo("VEHICLE",           True,  False, True,  False, True ),
  560. -    ParameterInfo("COMPANY",           True,  False, True,  False, True ),
  561. -    ParameterInfo("COMPANY_NUM",       True,  False, False, False, True ),
  562. -    ParameterInfo("PRESIDENT_NAME",    True,  False, True,  False, True ),
  563. +    ParameterInfo("WAYPOINT",          [P_G],      False, True ), # waypoint name
  564. +    ParameterInfo("STATION",           [P_G],      False, True ),
  565. +    ParameterInfo("DEPOT",             [P_G, P__], False, True ),
  566. +    ParameterInfo("TOWN",              [P_G],      False, True ),
  567. +    ParameterInfo("GROUP",             [P_G],      False, True ),
  568. +    ParameterInfo("SIGN",              [P_G],      False, True ),
  569. +    ParameterInfo("ENGINE",            [P_G],      False, True ),
  570. +    ParameterInfo("VEHICLE",           [P_G],      False, True ),
  571. +    ParameterInfo("COMPANY",           [P_G],      False, True ),
  572. +    ParameterInfo("COMPANY_NUM",       [P__],      False, True ),
  573. +    ParameterInfo("PRESIDENT_NAME",    [P_G],      False, True ),
  574.  
  575. -    ParameterInfo("TRAIN",             False, False, False, False, True ),
  576. -    ParameterInfo("LORRY",             False, False, False, False, True ),
  577. -    ParameterInfo("BUS",               False, False, False, False, True ),
  578. -    ParameterInfo("PLANE",             False, False, False, False, True ),
  579. -    ParameterInfo("SHIP",              False, False, False, False, True ),
  580. -    ParameterInfo("NBSP",              False, False, False, False, False),
  581. -    ParameterInfo("COPYRIGHT",         False, False, False, False, True ),
  582. +    ParameterInfo("TRAIN",             [], False, True ),
  583. +    ParameterInfo("LORRY",             [], False, True ),
  584. +    ParameterInfo("BUS",               [], False, True ),
  585. +    ParameterInfo("PLANE",             [], False, True ),
  586. +    ParameterInfo("SHIP",              [], False, True ),
  587. +    ParameterInfo("NBSP",              [], False, False),
  588. +    ParameterInfo("COPYRIGHT",         [], False, True ),
  589.  
  590.      # The following are directional formatting codes used to get the RTL strings right:
  591.      # http://www.unicode.org/unicode/reports/tr9/#Directional_Formatting_Codes
  592. -    ParameterInfo("LRM",               False, False, False, False, False),
  593. -    ParameterInfo("RLM",               False, False, False, False, False),
  594. -    ParameterInfo("LRE",               False, False, False, False, False),
  595. -    ParameterInfo("RLE",               False, False, False, False, False),
  596. -    ParameterInfo("LRO",               False, False, False, False, False),
  597. -    ParameterInfo("RLO",               False, False, False, False, False),
  598. -    ParameterInfo("PDF",               False, False, False, False, False),
  599. +    ParameterInfo("LRM",               [], False, False),
  600. +    ParameterInfo("RLM",               [], False, False),
  601. +    ParameterInfo("LRE",               [], False, False),
  602. +    ParameterInfo("RLE",               [], False, False),
  603. +    ParameterInfo("LRO",               [], False, False),
  604. +    ParameterInfo("RLO",               [], False, False),
  605. +    ParameterInfo("PDF",               [], False, False),
  606.  ]
  607.  
  608.  GS_PARAMETERS = dict((x.literal, x) for x in _GS_PARAMETERS)
  609. @@ -300,25 +321,25 @@
  610.      # Some string parameters are only allowed in the OpenTTD project.
  611.      # While they technically also work in Game Scripts, disencourage the usage.
  612.      # This also includes the "sprite" characters.
  613. -    ParameterInfo("REV",               False, False, False, False, True ),
  614. -    ParameterInfo("STATION_FEATURES",  True,  False, False, False, True ), # station features string, icons of the features
  615. -    ParameterInfo("UP_ARROW",          False, False, False, False, True ),
  616. -    ParameterInfo("SMALL_UP_ARROW",    False, False, False, False, True ),
  617. -    ParameterInfo("SMALL_DOWN_ARROW",  False, False, False, False, True ),
  618. -    ParameterInfo("DOWN_ARROW",        False, False, False, False, True ),
  619. -    ParameterInfo("CHECKMARK",         False, False, False, False, True ),
  620. -    ParameterInfo("CROSS",             False, False, False, False, True ),
  621. -    ParameterInfo("RIGHT_ARROW",       False, False, False, False, False),
  622. -    ParameterInfo("SMALL_LEFT_ARROW",  False, False, False, False, False),
  623. -    ParameterInfo("SMALL_RIGHT_ARROW", False, False, False, False, False),
  624. +    ParameterInfo("REV",               [],    False, True ),
  625. +    ParameterInfo("STATION_FEATURES",  [P__], False, True ), # station features string, icons of the features
  626. +    ParameterInfo("UP_ARROW",          [],    False, True ),
  627. +    ParameterInfo("SMALL_UP_ARROW",    [],    False, True ),
  628. +    ParameterInfo("SMALL_DOWN_ARROW",  [],    False, True ),
  629. +    ParameterInfo("DOWN_ARROW",        [],    False, True ),
  630. +    ParameterInfo("CHECKMARK",         [],    False, True ),
  631. +    ParameterInfo("CROSS",             [],    False, True ),
  632. +    ParameterInfo("RIGHT_ARROW",       [],    False, False), # left/right arrows are not critical due to LTR/RTL languages
  633. +    ParameterInfo("SMALL_LEFT_ARROW",  [],    False, False),
  634. +    ParameterInfo("SMALL_RIGHT_ARROW", [],    False, False),
  635.  ]
  636.  
  637.  OPENTTD_PARAMETERS = dict((x.literal, x) for x in _OPENTTD_PARAMETERS)
  638.  OPENTTD_PARAMETERS.update((x.literal, x) for x in _GS_PARAMETERS)
  639.  # }}}
  640.  
  641. -NL_PARAMETER    = ParameterInfo("",  False, False, False, False, False)
  642. -CURLY_PARAMETER = ParameterInfo("{", False, False, False, False, False)
  643. +NL_PARAMETER    = ParameterInfo("",  [], False, False)
  644. +CURLY_PARAMETER = ParameterInfo("{", [], False, False)
  645.  
  646.  
  647.  # Available project types, ordered by internal name.
  648.  

Comments