Grammalecte  Hex Artifact Content

Artifact 7fa2e820bf109bbb3518ffb8f3f5fb7e58621b03913ef662e8122aa39bb15bad:


0000: 0a 69 6d 70 6f 72 74 20 72 65 0a 69 6d 70 6f 72  .import re.impor
0010: 74 20 73 79 73 0a 69 6d 70 6f 72 74 20 74 72 61  t sys.import tra
0020: 63 65 62 61 63 6b 0a 69 6d 70 6f 72 74 20 6a 73  ceback.import js
0030: 6f 6e 0a 66 72 6f 6d 20 64 69 73 74 75 74 69 6c  on.from distutil
0040: 73 20 69 6d 70 6f 72 74 20 66 69 6c 65 5f 75 74  s import file_ut
0050: 69 6c 0a 0a 69 6d 70 6f 72 74 20 63 6f 6d 70 69  il..import compi
0060: 6c 65 5f 72 75 6c 65 73 5f 6a 73 5f 63 6f 6e 76  le_rules_js_conv
0070: 65 72 74 20 61 73 20 6a 73 63 6f 6e 76 0a 0a 0a  ert as jsconv...
0080: 64 44 45 46 20 3d 20 7b 7d 0a 6c 46 55 4e 43 54  dDEF = {}.lFUNCT
0090: 49 4f 4e 53 20 3d 20 5b 5d 0a 0a 61 52 55 4c 45  IONS = []..aRULE
00a0: 53 45 54 20 3d 20 73 65 74 28 29 20 20 20 20 20  SET = set()     
00b0: 23 20 73 65 74 20 6f 66 20 72 75 6c 65 2d 69 64  # set of rule-id
00c0: 73 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  s to check if th
00d0: 65 72 65 20 69 73 20 73 65 76 65 72 61 6c 20 72  ere is several r
00e0: 75 6c 65 73 20 77 69 74 68 20 74 68 65 20 73 61  ules with the sa
00f0: 6d 65 20 69 64 0a 6e 52 55 4c 45 57 49 54 48 4f  me id.nRULEWITHO
0100: 55 54 4e 41 4d 45 20 3d 20 30 0a 0a 64 4a 53 52  UTNAME = 0..dJSR
0110: 45 47 45 58 45 53 20 3d 20 7b 7d 0a 0a 73 57 4f  EGEXES = {}..sWO
0120: 52 44 4c 49 4d 49 54 4c 45 46 54 20 20 3d 20 72  RDLIMITLEFT  = r
0130: 22 28 3f 3c 21 5b 5c 77 2e 2c e2 80 93 2d 5d 29  "(?<![\w.,...-])
0140: 22 20 20 20 23 20 72 22 28 3f 3c 21 5b 2d 2e 2c  "   # r"(?<![-.,
0150: e2 80 94 5d 29 5c 62 22 20 20 73 65 65 6d 73 20  ...])\b"  seems 
0160: 73 6c 6f 77 65 72 0a 73 57 4f 52 44 4c 49 4d 49  slower.sWORDLIMI
0170: 54 52 49 47 48 54 20 3d 20 72 22 28 3f 21 5b 5c  TRIGHT = r"(?![\
0180: 77 e2 80 93 2d 5d 29 22 20 20 20 20 20 20 23 20  w...-])"      # 
0190: 72 22 5c 62 28 3f 21 2d e2 80 94 29 22 20 20 20  r"\b(?!-...)"   
01a0: 20 20 20 20 73 65 65 6d 73 20 73 6c 6f 77 65 72      seems slower
01b0: 0a 0a 0a 64 65 66 20 70 72 65 70 61 72 65 46 75  ...def prepareFu
01c0: 6e 63 74 69 6f 6e 20 28 73 29 3a 0a 20 20 20 20  nction (s):.    
01d0: 73 20 3d 20 73 2e 72 65 70 6c 61 63 65 28 22 5f  s = s.replace("_
01e0: 5f 61 6c 73 6f 5f 5f 22 2c 20 22 62 43 6f 6e 64  _also__", "bCond
01f0: 4d 65 6d 6f 22 29 0a 20 20 20 20 73 20 3d 20 73  Memo").    s = s
0200: 2e 72 65 70 6c 61 63 65 28 22 5f 5f 65 6c 73 65  .replace("__else
0210: 5f 5f 22 2c 20 22 6e 6f 74 20 62 43 6f 6e 64 4d  __", "not bCondM
0220: 65 6d 6f 22 29 0a 20 20 20 20 73 20 3d 20 72 65  emo").    s = re
0230: 2e 73 75 62 28 72 22 69 73 53 74 61 72 74 20 2a  .sub(r"isStart *
0240: 5c 28 5c 29 22 2c 20 27 62 65 66 6f 72 65 28 22  \(\)", 'before("
0250: 5e 20 2a 24 7c 2c 20 2a 24 22 29 27 2c 20 73 29  ^ *$|, *$")', s)
0260: 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28  .    s = re.sub(
0270: 72 22 69 73 52 65 61 6c 53 74 61 72 74 20 2a 5c  r"isRealStart *\
0280: 28 5c 29 22 2c 20 27 62 65 66 6f 72 65 28 22 5e  (\)", 'before("^
0290: 20 2a 24 22 29 27 2c 20 73 29 0a 20 20 20 20 73   *$")', s).    s
02a0: 20 3d 20 72 65 2e 73 75 62 28 72 22 69 73 53 74   = re.sub(r"isSt
02b0: 61 72 74 30 20 2a 5c 28 5c 29 22 2c 20 27 62 65  art0 *\(\)", 'be
02c0: 66 6f 72 65 30 28 22 5e 20 2a 24 7c 2c 20 2a 24  fore0("^ *$|, *$
02d0: 22 29 27 2c 20 73 29 0a 20 20 20 20 73 20 3d 20  ")', s).    s = 
02e0: 72 65 2e 73 75 62 28 72 22 69 73 52 65 61 6c 53  re.sub(r"isRealS
02f0: 74 61 72 74 30 20 2a 5c 28 5c 29 22 2c 20 27 62  tart0 *\(\)", 'b
0300: 65 66 6f 72 65 30 28 22 5e 20 2a 24 22 29 27 2c  efore0("^ *$")',
0310: 20 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73   s).    s = re.s
0320: 75 62 28 72 22 69 73 45 6e 64 20 2a 5c 28 5c 29  ub(r"isEnd *\(\)
0330: 22 2c 20 27 61 66 74 65 72 28 22 5e 20 2a 24 7c  ", 'after("^ *$|
0340: 5e 2c 22 29 27 2c 20 73 29 0a 20 20 20 20 73 20  ^,")', s).    s 
0350: 3d 20 72 65 2e 73 75 62 28 72 22 69 73 52 65 61  = re.sub(r"isRea
0360: 6c 45 6e 64 20 2a 5c 28 5c 29 22 2c 20 27 61 66  lEnd *\(\)", 'af
0370: 74 65 72 28 22 5e 20 2a 24 22 29 27 2c 20 73 29  ter("^ *$")', s)
0380: 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28  .    s = re.sub(
0390: 72 22 69 73 45 6e 64 30 20 2a 5c 28 5c 29 22 2c  r"isEnd0 *\(\)",
03a0: 20 27 61 66 74 65 72 30 28 22 5e 20 2a 24 7c 5e   'after0("^ *$|^
03b0: 2c 22 29 27 2c 20 73 29 0a 20 20 20 20 73 20 3d  ,")', s).    s =
03c0: 20 72 65 2e 73 75 62 28 72 22 69 73 52 65 61 6c   re.sub(r"isReal
03d0: 45 6e 64 30 20 2a 5c 28 5c 29 22 2c 20 27 61 66  End0 *\(\)", 'af
03e0: 74 65 72 30 28 22 5e 20 2a 24 22 29 27 2c 20 73  ter0("^ *$")', s
03f0: 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62  ).    s = re.sub
0400: 28 72 22 28 73 65 6c 65 63 74 7c 65 78 63 6c 75  (r"(select|exclu
0410: 64 65 29 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29 22  de)[(][\\](\d+)"
0420: 2c 20 27 5c 5c 31 28 64 44 41 2c 20 6d 2e 73 74  , '\\1(dDA, m.st
0430: 61 72 74 28 5c 5c 32 29 2c 20 6d 2e 67 72 6f 75  art(\\2), m.grou
0440: 70 28 5c 5c 32 29 27 2c 20 73 29 0a 20 20 20 20  p(\\2)', s).    
0450: 73 20 3d 20 72 65 2e 73 75 62 28 72 22 64 65 66  s = re.sub(r"def
0460: 69 6e 65 5b 28 5d 5b 5c 5c 5d 28 5c 64 2b 29 22  ine[(][\\](\d+)"
0470: 2c 20 27 64 65 66 69 6e 65 28 64 44 41 2c 20 6d  , 'define(dDA, m
0480: 2e 73 74 61 72 74 28 5c 5c 31 29 27 2c 20 73 29  .start(\\1)', s)
0490: 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28  .    s = re.sub(
04a0: 72 22 28 6d 6f 72 70 68 7c 6d 6f 72 70 68 65 78  r"(morph|morphex
04b0: 7c 64 69 73 70 6c 61 79 49 6e 66 6f 29 5b 28 5d  |displayInfo)[(]
04c0: 5b 5c 5c 5d 28 5c 64 2b 29 22 2c 20 27 5c 5c 31  [\\](\d+)", '\\1
04d0: 28 28 6d 2e 73 74 61 72 74 28 5c 5c 32 29 2c 20  ((m.start(\\2), 
04e0: 6d 2e 67 72 6f 75 70 28 5c 5c 32 29 29 27 2c 20  m.group(\\2))', 
04f0: 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75  s).    s = re.su
0500: 62 28 72 22 28 6d 6f 72 70 68 7c 6d 6f 72 70 68  b(r"(morph|morph
0510: 65 78 7c 64 69 73 70 6c 61 79 49 6e 66 6f 29 5b  ex|displayInfo)[
0520: 28 5d 22 2c 20 27 5c 5c 31 28 64 44 41 2c 20 27  (]", '\\1(dDA, '
0530: 2c 20 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e  , s).    s = re.
0540: 73 75 62 28 72 22 28 73 75 67 67 5c 77 2b 7c 73  sub(r"(sugg\w+|s
0550: 77 69 74 63 68 5c 77 2b 29 5c 28 40 22 2c 20 27  witch\w+)\(@", '
0560: 5c 5c 31 28 6d 2e 67 72 6f 75 70 28 69 5b 34 5d  \\1(m.group(i[4]
0570: 29 27 2c 20 73 29 0a 20 20 20 20 73 20 3d 20 72  )', s).    s = r
0580: 65 2e 73 75 62 28 72 22 77 6f 72 64 5c 28 5c 73  e.sub(r"word\(\s
0590: 2a 31 5c 62 22 2c 20 27 6e 65 78 74 77 6f 72 64  *1\b", 'nextword
05a0: 31 28 73 2c 20 6d 2e 65 6e 64 28 29 27 2c 20 73  1(s, m.end()', s
05b0: 29 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  )               
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 20 20 20 23 20 77 6f 72 64 28 31 29 0a 20 20 20     # word(1).   
05e0: 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22 77 6f   s = re.sub(r"wo
05f0: 72 64 5c 28 5c 73 2a 2d 31 5c 62 22 2c 20 27 70  rd\(\s*-1\b", 'p
0600: 72 65 76 77 6f 72 64 31 28 73 2c 20 6d 2e 73 74  revword1(s, m.st
0610: 61 72 74 28 29 27 2c 20 73 29 20 20 20 20 20 20  art()', s)      
0620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0630: 20 20 20 20 20 20 20 20 20 23 20 77 6f 72 64 28           # word(
0640: 2d 31 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73  -1).    s = re.s
0650: 75 62 28 72 22 77 6f 72 64 5c 28 5c 73 2a 28 5c  ub(r"word\(\s*(\
0660: 64 29 22 2c 20 27 6e 65 78 74 77 6f 72 64 28 73  d)", 'nextword(s
0670: 2c 20 6d 2e 65 6e 64 28 29 2c 20 5c 5c 31 27 2c  , m.end(), \\1',
0680: 20 73 29 20 20 20 20 20 20 20 20 20 20 20 20 20   s)             
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
06a0: 23 20 77 6f 72 64 28 6e 29 0a 20 20 20 20 73 20  # word(n).    s 
06b0: 3d 20 72 65 2e 73 75 62 28 72 22 77 6f 72 64 5c  = re.sub(r"word\
06c0: 28 5c 73 2a 2d 28 5c 64 29 22 2c 20 27 70 72 65  (\s*-(\d)", 'pre
06d0: 76 77 6f 72 64 28 73 2c 20 6d 2e 73 74 61 72 74  vword(s, m.start
06e0: 28 29 2c 20 5c 5c 31 27 2c 20 73 29 20 20 20 20  (), \\1', s)    
06f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0700: 20 20 20 20 20 20 23 20 77 6f 72 64 28 2d 6e 29        # word(-n)
0710: 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28  .    s = re.sub(
0720: 72 22 62 65 66 6f 72 65 5c 28 5c 73 2a 22 2c 20  r"before\(\s*", 
0730: 27 6c 6f 6f 6b 28 73 5b 3a 6d 2e 73 74 61 72 74  'look(s[:m.start
0740: 28 29 5d 2c 20 27 2c 20 73 29 20 20 20 20 20 20  ()], ', s)      
0750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0760: 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20 62               # b
0770: 65 66 6f 72 65 28 73 29 0a 20 20 20 20 73 20 3d  efore(s).    s =
0780: 20 72 65 2e 73 75 62 28 72 22 61 66 74 65 72 5c   re.sub(r"after\
0790: 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73 5b 6d  (\s*", 'look(s[m
07a0: 2e 65 6e 64 28 29 3a 5d 2c 20 27 2c 20 73 29 20  .end():], ', s) 
07b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07d0: 20 20 20 20 20 23 20 61 66 74 65 72 28 73 29 0a       # after(s).
07e0: 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28 72      s = re.sub(r
07f0: 22 74 65 78 74 61 72 65 61 5c 28 5c 73 2a 22 2c  "textarea\(\s*",
0800: 20 27 6c 6f 6f 6b 28 73 2c 20 27 2c 20 73 29 20   'look(s, ', s) 
0810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 20 20 20 20 20 20 20 23 20 74 65              # te
0840: 78 74 61 72 65 61 28 73 29 0a 20 20 20 20 73 20  xtarea(s).    s 
0850: 3d 20 72 65 2e 73 75 62 28 72 22 62 65 66 6f 72  = re.sub(r"befor
0860: 65 5f 63 68 6b 31 5c 28 5c 73 2a 22 2c 20 27 6c  e_chk1\(\s*", 'l
0870: 6f 6f 6b 5f 63 68 6b 31 28 64 44 41 2c 20 73 5b  ook_chk1(dDA, s[
0880: 3a 6d 2e 73 74 61 72 74 28 29 5d 2c 20 30 2c 20  :m.start()], 0, 
0890: 27 2c 20 73 29 20 20 20 20 20 20 20 20 20 20 20  ', s)           
08a0: 20 20 20 20 20 20 23 20 62 65 66 6f 72 65 5f 63        # before_c
08b0: 68 6b 31 28 73 29 0a 20 20 20 20 73 20 3d 20 72  hk1(s).    s = r
08c0: 65 2e 73 75 62 28 72 22 61 66 74 65 72 5f 63 68  e.sub(r"after_ch
08d0: 6b 31 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 5f  k1\(\s*", 'look_
08e0: 63 68 6b 31 28 64 44 41 2c 20 73 5b 6d 2e 65 6e  chk1(dDA, s[m.en
08f0: 64 28 29 3a 5d 2c 20 6d 2e 65 6e 64 28 29 2c 20  d():], m.end(), 
0900: 27 2c 20 73 29 20 20 20 20 20 20 20 20 20 20 20  ', s)           
0910: 20 20 20 23 20 61 66 74 65 72 5f 63 68 6b 31 28     # after_chk1(
0920: 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75  s).    s = re.su
0930: 62 28 72 22 74 65 78 74 61 72 65 61 5f 63 68 6b  b(r"textarea_chk
0940: 31 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 5f 63  1\(\s*", 'look_c
0950: 68 6b 31 28 64 44 41 2c 20 73 2c 20 30 2c 20 27  hk1(dDA, s, 0, '
0960: 2c 20 73 29 20 20 20 20 20 20 20 20 20 20 20 20  , s)            
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
0980: 20 74 65 78 74 61 72 65 61 5f 63 68 6b 31 28 73   textarea_chk1(s
0990: 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75 62  ).    s = re.sub
09a0: 28 72 22 2f 30 22 2c 20 27 73 78 5b 6d 2e 73 74  (r"/0", 'sx[m.st
09b0: 61 72 74 28 29 3a 6d 2e 65 6e 64 28 29 5d 27 2c  art():m.end()]',
09c0: 20 73 29 20 20 20 20 20 20 20 20 20 20 20 20 20   s)             
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
09f0: 2f 30 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75  /0.    s = re.su
0a00: 62 28 72 22 62 65 66 6f 72 65 30 5c 28 5c 73 2a  b(r"before0\(\s*
0a10: 22 2c 20 27 6c 6f 6f 6b 28 73 78 5b 3a 6d 2e 73  ", 'look(sx[:m.s
0a20: 74 61 72 74 28 29 5d 2c 20 27 2c 20 73 29 20 20  tart()], ', s)  
0a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23                 #
0a50: 20 62 65 66 6f 72 65 30 28 73 29 0a 20 20 20 20   before0(s).    
0a60: 73 20 3d 20 72 65 2e 73 75 62 28 72 22 61 66 74  s = re.sub(r"aft
0a70: 65 72 30 5c 28 5c 73 2a 22 2c 20 27 6c 6f 6f 6b  er0\(\s*", 'look
0a80: 28 73 78 5b 6d 2e 65 6e 64 28 29 3a 5d 2c 20 27  (sx[m.end():], '
0a90: 2c 20 73 29 20 20 20 20 20 20 20 20 20 20 20 20  , s)            
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 20 20 20 20 20 20 20 23 20 61 66 74 65 72 30          # after0
0ac0: 28 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73  (s).    s = re.s
0ad0: 75 62 28 72 22 74 65 78 74 61 72 65 61 30 5c 28  ub(r"textarea0\(
0ae0: 5c 73 2a 22 2c 20 27 6c 6f 6f 6b 28 73 78 2c 20  \s*", 'look(sx, 
0af0: 27 2c 20 73 29 20 20 20 20 20 20 20 20 20 20 20  ', s)           
0b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 23 20 74 65 78 74 61 72 65 61 30 28 73 29 0a 20  # textarea0(s). 
0b30: 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22     s = re.sub(r"
0b40: 62 65 66 6f 72 65 30 5f 63 68 6b 31 5c 28 5c 73  before0_chk1\(\s
0b50: 2a 22 2c 20 27 6c 6f 6f 6b 5f 63 68 6b 31 28 64  *", 'look_chk1(d
0b60: 44 41 2c 20 73 78 5b 3a 6d 2e 73 74 61 72 74 28  DA, sx[:m.start(
0b70: 29 5d 2c 20 30 2c 20 27 2c 20 73 29 20 20 20 20  )], 0, ', s)    
0b80: 20 20 20 20 20 20 20 20 20 20 20 23 20 62 65 66             # bef
0b90: 6f 72 65 30 5f 63 68 6b 31 28 73 29 0a 20 20 20  ore0_chk1(s).   
0ba0: 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22 61 66   s = re.sub(r"af
0bb0: 74 65 72 30 5f 63 68 6b 31 5c 28 5c 73 2a 22 2c  ter0_chk1\(\s*",
0bc0: 20 27 6c 6f 6f 6b 5f 63 68 6b 31 28 64 44 41 2c   'look_chk1(dDA,
0bd0: 20 73 78 5b 6d 2e 65 6e 64 28 29 3a 5d 2c 20 6d   sx[m.end():], m
0be0: 2e 65 6e 64 28 29 2c 20 27 2c 20 73 29 20 20 20  .end(), ', s)   
0bf0: 20 20 20 20 20 20 20 20 20 23 20 61 66 74 65 72           # after
0c00: 30 5f 63 68 6b 31 28 73 29 0a 20 20 20 20 73 20  0_chk1(s).    s 
0c10: 3d 20 72 65 2e 73 75 62 28 72 22 74 65 78 74 61  = re.sub(r"texta
0c20: 72 65 61 30 5f 63 68 6b 31 5c 28 5c 73 2a 22 2c  rea0_chk1\(\s*",
0c30: 20 27 6c 6f 6f 6b 5f 63 68 6b 31 28 64 44 41 2c   'look_chk1(dDA,
0c40: 20 73 78 2c 20 30 2c 20 27 2c 20 73 29 20 20 20   sx, 0, ', s)   
0c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c60: 20 20 20 20 20 20 23 20 74 65 78 74 61 72 65 61        # textarea
0c70: 30 5f 63 68 6b 31 28 73 29 0a 20 20 20 20 73 20  0_chk1(s).    s 
0c80: 3d 20 72 65 2e 73 75 62 28 72 22 69 73 45 6e 64  = re.sub(r"isEnd
0c90: 4f 66 4e 47 5c 28 5c 73 2a 5c 29 22 2c 20 27 69  OfNG\(\s*\)", 'i
0ca0: 73 45 6e 64 4f 66 4e 47 28 64 44 41 2c 20 73 5b  sEndOfNG(dDA, s[
0cb0: 6d 2e 65 6e 64 28 29 3a 5d 2c 20 6d 2e 65 6e 64  m.end():], m.end
0cc0: 28 29 29 27 2c 20 73 29 20 20 20 20 20 20 20 20  ())', s)        
0cd0: 20 20 20 20 20 20 23 20 69 73 45 6e 64 4f 66 4e        # isEndOfN
0ce0: 47 28 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e  G(s).    s = re.
0cf0: 73 75 62 28 72 22 69 73 4e 65 78 74 4e 6f 74 43  sub(r"isNextNotC
0d00: 4f 44 5c 28 5c 73 2a 5c 29 22 2c 20 27 69 73 4e  OD\(\s*\)", 'isN
0d10: 65 78 74 4e 6f 74 43 4f 44 28 64 44 41 2c 20 73  extNotCOD(dDA, s
0d20: 5b 6d 2e 65 6e 64 28 29 3a 5d 2c 20 6d 2e 65 6e  [m.end():], m.en
0d30: 64 28 29 29 27 2c 20 73 29 20 20 20 20 20 20 20  d())', s)       
0d40: 20 23 20 69 73 4e 65 78 74 4e 6f 74 43 4f 44 28   # isNextNotCOD(
0d50: 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e 73 75  s).    s = re.su
0d60: 62 28 72 22 69 73 4e 65 78 74 56 65 72 62 5c 28  b(r"isNextVerb\(
0d70: 5c 73 2a 5c 29 22 2c 20 27 69 73 4e 65 78 74 56  \s*\)", 'isNextV
0d80: 65 72 62 28 64 44 41 2c 20 73 5b 6d 2e 65 6e 64  erb(dDA, s[m.end
0d90: 28 29 3a 5d 2c 20 6d 2e 65 6e 64 28 29 29 27 2c  ():], m.end())',
0da0: 20 73 29 20 20 20 20 20 20 20 20 20 20 20 20 23   s)            #
0db0: 20 69 73 4e 65 78 74 56 65 72 62 28 73 29 0a 20   isNextVerb(s). 
0dc0: 20 20 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22     s = re.sub(r"
0dd0: 5c 62 73 70 65 6c 6c 20 2a 5b 28 5d 22 2c 20 27  \bspell *[(]", '
0de0: 5f 6f 44 69 63 74 2e 69 73 56 61 6c 69 64 28 27  _oDict.isValid('
0df0: 2c 20 73 29 0a 20 20 20 20 73 20 3d 20 72 65 2e  , s).    s = re.
0e00: 73 75 62 28 72 22 5b 5c 5c 5d 28 5c 64 2b 29 22  sub(r"[\\](\d+)"
0e10: 2c 20 27 6d 2e 67 72 6f 75 70 28 5c 5c 31 29 27  , 'm.group(\\1)'
0e20: 2c 20 73 29 0a 20 20 20 20 72 65 74 75 72 6e 20  , s).    return 
0e30: 73 0a 0a 0a 64 65 66 20 75 70 70 65 72 63 61 73  s...def uppercas
0e40: 65 20 28 73 2c 20 73 4c 61 6e 67 29 3a 0a 20 20  e (s, sLang):.  
0e50: 20 20 22 28 66 6c 61 67 20 69 20 69 73 20 6e 6f    "(flag i is no
0e60: 74 20 65 6e 6f 75 67 68 29 3a 20 63 6f 6e 76 65  t enough): conve
0e70: 72 74 73 20 72 65 67 65 78 20 74 6f 20 75 70 70  rts regex to upp
0e80: 65 72 63 61 73 65 20 72 65 67 65 78 3a 20 27 66  ercase regex: 'f
0e90: 6f 6f 27 20 62 65 63 6f 6d 65 73 20 27 5b 46 66  oo' becomes '[Ff
0ea0: 5d 5b 4f 6f 5d 5b 4f 6f 5d 27 2c 20 62 75 74 20  ][Oo][Oo]', but 
0eb0: 27 42 61 72 27 20 62 65 63 6f 6d 65 73 20 27 42  'Bar' becomes 'B
0ec0: 5b 41 61 5d 5b 52 72 5d 27 2e 22 0a 20 20 20 20  [Aa][Rr]'.".    
0ed0: 73 55 70 20 3d 20 22 22 0a 20 20 20 20 6e 53 74  sUp = "".    nSt
0ee0: 61 74 65 20 3d 20 30 0a 20 20 20 20 66 6f 72 20  ate = 0.    for 
0ef0: 69 20 69 6e 20 72 61 6e 67 65 28 30 2c 20 6c 65  i in range(0, le
0f00: 6e 28 73 29 29 3a 0a 20 20 20 20 20 20 20 20 63  n(s)):.        c
0f10: 20 3d 20 73 5b 69 5d 0a 20 20 20 20 20 20 20 20   = s[i].        
0f20: 69 66 20 63 20 3d 3d 20 22 5b 22 3a 0a 20 20 20  if c == "[":.   
0f30: 20 20 20 20 20 20 20 20 20 6e 53 74 61 74 65 20           nState 
0f40: 3d 20 31 0a 20 20 20 20 20 20 20 20 69 66 20 6e  = 1.        if n
0f50: 53 74 61 74 65 20 3d 3d 20 31 20 61 6e 64 20 63  State == 1 and c
0f60: 20 3d 3d 20 22 5d 22 3a 0a 20 20 20 20 20 20 20   == "]":.       
0f70: 20 20 20 20 20 6e 53 74 61 74 65 20 3d 20 30 0a       nState = 0.
0f80: 20 20 20 20 20 20 20 20 69 66 20 63 20 3d 3d 20          if c == 
0f90: 22 3c 22 20 61 6e 64 20 69 20 3e 20 33 20 61 6e  "<" and i > 3 an
0fa0: 64 20 73 5b 69 2d 33 3a 69 5d 20 3d 3d 20 22 28  d s[i-3:i] == "(
0fb0: 3f 50 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ?P":.           
0fc0: 20 6e 53 74 61 74 65 20 3d 20 32 0a 20 20 20 20   nState = 2.    
0fd0: 20 20 20 20 69 66 20 6e 53 74 61 74 65 20 3d 3d      if nState ==
0fe0: 20 32 20 61 6e 64 20 63 20 3d 3d 20 22 3e 22 3a   2 and c == ">":
0ff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 74  .            nSt
1000: 61 74 65 20 3d 20 30 0a 20 20 20 20 20 20 20 20  ate = 0.        
1010: 69 66 20 63 20 3d 3d 20 22 3f 22 20 61 6e 64 20  if c == "?" and 
1020: 69 20 3e 20 30 20 61 6e 64 20 73 5b 69 2d 31 3a  i > 0 and s[i-1:
1030: 69 5d 20 3d 3d 20 22 28 22 20 61 6e 64 20 73 5b  i] == "(" and s[
1040: 69 2b 31 3a 69 2b 32 5d 20 21 3d 20 22 3a 22 3a  i+1:i+2] != ":":
1050: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 74  .            nSt
1060: 61 74 65 20 3d 20 35 0a 20 20 20 20 20 20 20 20  ate = 5.        
1070: 69 66 20 6e 53 74 61 74 65 20 3d 3d 20 35 20 61  if nState == 5 a
1080: 6e 64 20 63 20 3d 3d 20 22 29 22 3a 0a 20 20 20  nd c == ")":.   
1090: 20 20 20 20 20 20 20 20 20 6e 53 74 61 74 65 20           nState 
10a0: 3d 20 30 0a 20 20 20 20 20 20 20 20 69 66 20 63  = 0.        if c
10b0: 2e 69 73 61 6c 70 68 61 28 29 20 61 6e 64 20 63  .isalpha() and c
10c0: 2e 69 73 6c 6f 77 65 72 28 29 20 61 6e 64 20 6e  .islower() and n
10d0: 53 74 61 74 65 20 3d 3d 20 30 3a 0a 20 20 20 20  State == 0:.    
10e0: 20 20 20 20 20 20 20 20 69 66 20 63 20 3d 3d 20          if c == 
10f0: 22 69 22 20 61 6e 64 20 28 73 4c 61 6e 67 20 3d  "i" and (sLang =
1100: 3d 20 22 74 72 22 20 6f 72 20 73 4c 61 6e 67 20  = "tr" or sLang 
1110: 3d 3d 20 22 61 7a 22 29 3a 0a 20 20 20 20 20 20  == "az"):.      
1120: 20 20 20 20 20 20 20 20 20 20 73 55 70 20 2b 3d            sUp +=
1130: 20 22 5b c4 b0 22 20 2b 20 63 20 2b 20 22 5d 22   "[.." + c + "]"
1140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
1150: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
1160: 20 20 20 73 55 70 20 2b 3d 20 22 5b 22 20 2b 20     sUp += "[" + 
1170: 63 2e 75 70 70 65 72 28 29 20 2b 20 63 20 2b 20  c.upper() + c + 
1180: 22 5d 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66  "]".        elif
1190: 20 63 2e 69 73 61 6c 70 68 61 28 29 20 61 6e 64   c.isalpha() and
11a0: 20 63 2e 69 73 6c 6f 77 65 72 28 29 20 61 6e 64   c.islower() and
11b0: 20 6e 53 74 61 74 65 20 3d 3d 20 31 20 61 6e 64   nState == 1 and
11c0: 20 73 5b 69 2b 31 3a 69 2b 32 5d 20 21 3d 20 22   s[i+1:i+2] != "
11d0: 2d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  -":.            
11e0: 69 66 20 73 5b 69 2d 31 3a 69 5d 20 3d 3d 20 22  if s[i-1:i] == "
11f0: 2d 22 20 61 6e 64 20 73 5b 69 2d 32 3a 69 2d 31  -" and s[i-2:i-1
1200: 5d 2e 69 73 6c 6f 77 65 72 28 29 3a 20 20 23 20  ].islower():  # 
1210: 5b 61 2d 7a 5d 20 2d 3e 20 5b 61 2d 7a 41 2d 5a  [a-z] -> [a-zA-Z
1220: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ].              
1230: 20 20 73 55 70 20 2b 3d 20 63 20 2b 20 73 5b 69    sUp += c + s[i
1240: 2d 32 3a 69 2d 31 5d 2e 75 70 70 65 72 28 29 20  -2:i-1].upper() 
1250: 2b 20 22 2d 22 20 2b 20 63 2e 75 70 70 65 72 28  + "-" + c.upper(
1260: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  ).            el
1270: 69 66 20 63 20 3d 3d 20 22 69 22 20 61 6e 64 20  if c == "i" and 
1280: 28 73 4c 61 6e 67 20 3d 3d 20 22 74 72 22 20 6f  (sLang == "tr" o
1290: 72 20 73 4c 61 6e 67 20 3d 3d 20 22 61 7a 22 29  r sLang == "az")
12a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
12b0: 20 20 73 55 70 20 2b 3d 20 22 c4 b0 22 20 2b 20    sUp += ".." + 
12c0: 63 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c  c.            el
12d0: 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  se:.            
12e0: 20 20 20 20 73 55 70 20 2b 3d 20 63 2e 75 70 70      sUp += c.upp
12f0: 65 72 28 29 20 2b 20 63 0a 20 20 20 20 20 20 20  er() + c.       
1300: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
1310: 20 20 20 73 55 70 20 2b 3d 20 63 0a 20 20 20 20     sUp += c.    
1320: 20 20 20 20 69 66 20 63 20 3d 3d 20 22 5c 5c 22      if c == "\\"
1330: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53  :.            nS
1340: 74 61 74 65 20 3d 20 34 0a 20 20 20 20 20 20 20  tate = 4.       
1350: 20 65 6c 69 66 20 6e 53 74 61 74 65 20 3d 3d 20   elif nState == 
1360: 34 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  4:.            n
1370: 53 74 61 74 65 20 3d 20 30 0a 20 20 20 20 72 65  State = 0.    re
1380: 74 75 72 6e 20 73 55 70 0a 0a 0a 64 65 66 20 63  turn sUp...def c
1390: 6f 75 6e 74 47 72 6f 75 70 49 6e 52 65 67 65 78  ountGroupInRegex
13a0: 20 28 73 52 65 67 65 78 29 3a 0a 20 20 20 20 74   (sRegex):.    t
13b0: 72 79 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ry:.        retu
13c0: 72 6e 20 72 65 2e 63 6f 6d 70 69 6c 65 28 73 52  rn re.compile(sR
13d0: 65 67 65 78 29 2e 67 72 6f 75 70 73 0a 20 20 20  egex).groups.   
13e0: 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20 20 20   except:.       
13f0: 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69 6e 74   traceback.print
1400: 5f 65 78 63 28 29 0a 20 20 20 20 20 20 20 20 70  _exc().        p
1410: 72 69 6e 74 28 73 52 65 67 65 78 29 0a 20 20 20  rint(sRegex).   
1420: 20 72 65 74 75 72 6e 20 30 0a 0a 0a 64 65 66 20   return 0...def 
1430: 63 72 65 61 74 65 52 75 6c 65 20 28 73 2c 20 6e  createRule (s, n
1440: 49 64 4c 69 6e 65 2c 20 73 4c 61 6e 67 2c 20 62  IdLine, sLang, b
1450: 50 61 72 61 67 72 61 70 68 2c 20 64 4f 70 74 50  Paragraph, dOptP
1460: 72 69 6f 72 69 74 79 29 3a 0a 20 20 20 20 22 72  riority):.    "r
1470: 65 74 75 72 6e 73 20 72 75 6c 65 20 61 73 20 6c  eturns rule as l
1480: 69 73 74 20 5b 6f 70 74 69 6f 6e 20 6e 61 6d 65  ist [option name
1490: 2c 20 72 65 67 65 78 2c 20 62 43 61 73 65 49 6e  , regex, bCaseIn
14a0: 73 65 6e 73 69 74 69 76 65 2c 20 69 64 65 6e 74  sensitive, ident
14b0: 69 66 69 65 72 2c 20 6c 69 73 74 20 6f 66 20 61  ifier, list of a
14c0: 63 74 69 6f 6e 73 5d 22 0a 20 20 20 20 67 6c 6f  ctions]".    glo
14d0: 62 61 6c 20 64 4a 53 52 45 47 45 58 45 53 0a 20  bal dJSREGEXES. 
14e0: 20 20 20 67 6c 6f 62 61 6c 20 6e 52 55 4c 45 57     global nRULEW
14f0: 49 54 48 4f 55 54 4e 41 4d 45 0a 0a 20 20 20 20  ITHOUTNAME..    
1500: 23 23 23 23 20 4f 50 54 49 4f 4e 53 0a 20 20 20  #### OPTIONS.   
1510: 20 73 4c 69 6e 65 49 64 20 3d 20 73 74 72 28 6e   sLineId = str(n
1520: 49 64 4c 69 6e 65 29 20 2b 20 28 22 70 22 20 69  IdLine) + ("p" i
1530: 66 20 62 50 61 72 61 67 72 61 70 68 20 65 6c 73  f bParagraph els
1540: 65 20 22 73 22 29 0a 20 20 20 20 73 52 75 6c 65  e "s").    sRule
1550: 49 64 20 3d 20 73 4c 69 6e 65 49 64 0a 20 20 20  Id = sLineId.   
1560: 20 73 4f 70 74 69 6f 6e 20 3d 20 46 61 6c 73 65   sOption = False
1570: 20 20 20 20 20 20 20 20 20 23 20 46 61 6c 73 65           # False
1580: 20 6f 72 20 5b 61 2d 7a 30 2d 39 5d 2b 20 6e 61   or [a-z0-9]+ na
1590: 6d 65 0a 20 20 20 20 6e 50 72 69 6f 72 69 74 79  me.    nPriority
15a0: 20 3d 20 34 20 20 20 20 20 20 20 20 20 20 20 23   = 4           #
15b0: 20 44 65 66 61 75 6c 74 20 69 73 20 34 2c 20 76   Default is 4, v
15c0: 61 6c 75 65 20 6d 75 73 74 20 62 65 20 62 65 74  alue must be bet
15d0: 77 65 65 6e 20 30 20 61 6e 64 20 39 0a 20 20 20  ween 0 and 9.   
15e0: 20 74 47 72 6f 75 70 73 20 3d 20 4e 6f 6e 65 20   tGroups = None 
15f0: 20 20 20 20 20 20 20 20 20 23 20 63 6f 64 65 20           # code 
1600: 66 6f 72 20 67 72 6f 75 70 73 20 70 6f 73 69 74  for groups posit
1610: 69 6f 6e 69 6e 67 20 28 6f 6e 6c 79 20 75 73 65  ioning (only use
1620: 66 75 6c 20 66 6f 72 20 4a 61 76 61 53 63 72 69  ful for JavaScri
1630: 70 74 29 0a 20 20 20 20 63 43 61 73 65 4d 6f 64  pt).    cCaseMod
1640: 65 20 3d 20 27 69 27 20 20 20 20 20 20 20 20 20  e = 'i'         
1650: 23 20 69 3a 20 63 61 73 65 20 69 6e 73 65 6e 73  # i: case insens
1660: 69 74 69 76 65 2c 20 20 73 3a 20 63 61 73 65 20  itive,  s: case 
1670: 73 65 6e 73 69 74 69 76 65 2c 20 20 75 3a 20 75  sensitive,  u: u
1680: 70 70 65 72 63 61 73 69 6e 67 20 61 6c 6c 6f 77  ppercasing allow
1690: 65 64 0a 20 20 20 20 63 57 6f 72 64 4c 69 6d 69  ed.    cWordLimi
16a0: 74 4c 65 66 74 20 3d 20 27 5b 27 20 20 20 20 23  tLeft = '['    #
16b0: 20 5b 3a 20 77 6f 72 64 20 6c 69 6d 69 74 2c 20   [: word limit, 
16c0: 3c 3a 20 6e 6f 20 73 70 65 63 69 66 69 63 20 6c  <: no specific l
16d0: 69 6d 69 74 0a 20 20 20 20 63 57 6f 72 64 4c 69  imit.    cWordLi
16e0: 6d 69 74 52 69 67 68 74 20 3d 20 27 5d 27 20 20  mitRight = ']'  
16f0: 20 23 20 5d 3a 20 77 6f 72 64 20 6c 69 6d 69 74   # ]: word limit
1700: 2c 20 3e 3a 20 6e 6f 20 73 70 65 63 69 66 69 63  , >: no specific
1710: 20 6c 69 6d 69 74 0a 20 20 20 20 6d 20 3d 20 72   limit.    m = r
1720: 65 2e 6d 61 74 63 68 28 22 5e 5f 5f 28 3f 50 3c  e.match("^__(?P<
1730: 62 6f 72 64 65 72 73 5f 61 6e 64 5f 63 61 73 65  borders_and_case
1740: 3e 5b 5b 3c 5d 5c 5c 77 5b 5d 3e 5d 29 28 3f 50  >[[<]\\w[]>])(?P
1750: 3c 6f 70 74 69 6f 6e 3e 2f 5b 61 2d 7a 41 2d 5a  <option>/[a-zA-Z
1760: 30 2d 39 5d 2b 7c 29 28 3f 50 3c 72 75 6c 65 69  0-9]+|)(?P<rulei
1770: 64 3e 5c 5c 28 5c 5c 77 2b 5c 5c 29 7c 29 28 3f  d>\\(\\w+\\)|)(?
1780: 50 3c 70 72 69 6f 72 69 74 79 3e 21 5b 30 2d 39  P<priority>![0-9
1790: 5d 7c 29 5f 5f 20 2a 22 2c 20 73 29 0a 20 20 20  ]|)__ *", s).   
17a0: 20 69 66 20 6d 3a 0a 20 20 20 20 20 20 20 20 63   if m:.        c
17b0: 57 6f 72 64 4c 69 6d 69 74 4c 65 66 74 20 3d 20  WordLimitLeft = 
17c0: 6d 2e 67 72 6f 75 70 28 27 62 6f 72 64 65 72 73  m.group('borders
17d0: 5f 61 6e 64 5f 63 61 73 65 27 29 5b 30 5d 0a 20  _and_case')[0]. 
17e0: 20 20 20 20 20 20 20 63 43 61 73 65 4d 6f 64 65         cCaseMode
17f0: 20 3d 20 6d 2e 67 72 6f 75 70 28 27 62 6f 72 64   = m.group('bord
1800: 65 72 73 5f 61 6e 64 5f 63 61 73 65 27 29 5b 31  ers_and_case')[1
1810: 5d 0a 20 20 20 20 20 20 20 20 63 57 6f 72 64 4c  ].        cWordL
1820: 69 6d 69 74 52 69 67 68 74 20 3d 20 6d 2e 67 72  imitRight = m.gr
1830: 6f 75 70 28 27 62 6f 72 64 65 72 73 5f 61 6e 64  oup('borders_and
1840: 5f 63 61 73 65 27 29 5b 32 5d 0a 20 20 20 20 20  _case')[2].     
1850: 20 20 20 73 4f 70 74 69 6f 6e 20 3d 20 6d 2e 67     sOption = m.g
1860: 72 6f 75 70 28 27 6f 70 74 69 6f 6e 27 29 5b 31  roup('option')[1
1870: 3a 5d 20 20 69 66 20 6d 2e 67 72 6f 75 70 28 27  :]  if m.group('
1880: 6f 70 74 69 6f 6e 27 29 20 20 65 6c 73 65 20 46  option')  else F
1890: 61 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 20  alse.        if 
18a0: 6d 2e 67 72 6f 75 70 28 27 72 75 6c 65 69 64 27  m.group('ruleid'
18b0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ):.            s
18c0: 52 75 6c 65 49 64 20 3d 20 20 6d 2e 67 72 6f 75  RuleId =  m.grou
18d0: 70 28 27 72 75 6c 65 69 64 27 29 5b 31 3a 2d 31  p('ruleid')[1:-1
18e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ].            if
18f0: 20 73 52 75 6c 65 49 64 20 69 6e 20 61 52 55 4c   sRuleId in aRUL
1900: 45 53 45 54 3a 0a 20 20 20 20 20 20 20 20 20 20  ESET:.          
1910: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
1920: 72 72 6f 72 2e 20 53 65 76 65 72 61 6c 20 72 75  rror. Several ru
1930: 6c 65 73 20 68 61 76 65 20 74 68 65 20 73 61 6d  les have the sam
1940: 65 20 69 64 3a 20 22 20 2b 20 73 52 75 6c 65 49  e id: " + sRuleI
1950: 64 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  d).             
1960: 20 20 20 65 78 69 74 28 29 0a 20 20 20 20 20 20     exit().      
1970: 20 20 20 20 20 20 61 52 55 4c 45 53 45 54 2e 61        aRULESET.a
1980: 64 64 28 73 52 75 6c 65 49 64 29 0a 20 20 20 20  dd(sRuleId).    
1990: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
19a0: 20 20 20 20 20 20 6e 52 55 4c 45 57 49 54 48 4f        nRULEWITHO
19b0: 55 54 4e 41 4d 45 20 2b 3d 20 31 0a 20 20 20 20  UTNAME += 1.    
19c0: 20 20 20 20 6e 50 72 69 6f 72 69 74 79 20 3d 20      nPriority = 
19d0: 64 4f 70 74 50 72 69 6f 72 69 74 79 2e 67 65 74  dOptPriority.get
19e0: 28 73 4f 70 74 69 6f 6e 2c 20 34 29 0a 20 20 20  (sOption, 4).   
19f0: 20 20 20 20 20 69 66 20 6d 2e 67 72 6f 75 70 28       if m.group(
1a00: 27 70 72 69 6f 72 69 74 79 27 29 3a 0a 20 20 20  'priority'):.   
1a10: 20 20 20 20 20 20 20 20 20 6e 50 72 69 6f 72 69           nPriori
1a20: 74 79 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70  ty = int(m.group
1a30: 28 27 70 72 69 6f 72 69 74 79 27 29 5b 31 3a 5d  ('priority')[1:]
1a40: 29 0a 20 20 20 20 20 20 20 20 73 20 3d 20 73 5b  ).        s = s[
1a50: 6d 2e 65 6e 64 28 30 29 3a 5d 0a 20 20 20 20 65  m.end(0):].    e
1a60: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 70 72 69  lse:.        pri
1a70: 6e 74 28 22 23 20 57 61 72 6e 69 6e 67 2e 20 4e  nt("# Warning. N
1a80: 6f 20 6f 70 74 69 6f 6e 20 64 65 66 69 6e 65 64  o option defined
1a90: 20 61 74 20 6c 69 6e 65 3a 20 22 20 2b 20 73 4c   at line: " + sL
1aa0: 69 6e 65 49 64 29 0a 0a 20 20 20 20 23 23 23 23  ineId)..    ####
1ab0: 20 52 45 47 45 58 20 54 52 49 47 47 45 52 0a 20   REGEX TRIGGER. 
1ac0: 20 20 20 69 20 3d 20 73 2e 66 69 6e 64 28 22 20     i = s.find(" 
1ad0: 3c 3c 2d 22 29 0a 20 20 20 20 69 66 20 69 20 3d  <<-").    if i =
1ae0: 3d 20 2d 31 3a 0a 20 20 20 20 20 20 20 20 70 72  = -1:.        pr
1af0: 69 6e 74 28 22 23 20 45 72 72 6f 72 3a 20 6e 6f  int("# Error: no
1b00: 20 63 6f 6e 64 69 74 69 6f 6e 20 61 74 20 6c 69   condition at li
1b10: 6e 65 20 22 20 2b 20 73 4c 69 6e 65 49 64 29 0a  ne " + sLineId).
1b20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e          return N
1b30: 6f 6e 65 0a 20 20 20 20 73 52 65 67 65 78 20 3d  one.    sRegex =
1b40: 20 73 5b 3a 69 5d 2e 73 74 72 69 70 28 29 0a 20   s[:i].strip(). 
1b50: 20 20 20 73 20 3d 20 73 5b 69 2b 34 3a 5d 0a 20     s = s[i+4:]. 
1b60: 20 20 20 0a 20 20 20 20 23 20 4a 53 20 67 72 6f     .    # JS gro
1b70: 75 70 73 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20  ups positioning 
1b80: 63 6f 64 65 73 0a 20 20 20 20 6d 20 3d 20 72 65  codes.    m = re
1b90: 2e 73 65 61 72 63 68 28 22 40 40 5c 5c 53 2b 22  .search("@@\\S+"
1ba0: 2c 20 73 52 65 67 65 78 29 0a 20 20 20 20 69 66  , sRegex).    if
1bb0: 20 6d 3a 0a 20 20 20 20 20 20 20 20 74 47 72 6f   m:.        tGro
1bc0: 75 70 73 20 3d 20 6a 73 63 6f 6e 76 2e 67 72 6f  ups = jsconv.gro
1bd0: 75 70 73 50 6f 73 69 74 69 6f 6e 69 6e 67 43 6f  upsPositioningCo
1be0: 64 65 54 6f 4c 69 73 74 28 73 52 65 67 65 78 5b  deToList(sRegex[
1bf0: 6d 2e 73 74 61 72 74 28 29 2b 32 3a 5d 29 0a 20  m.start()+2:]). 
1c00: 20 20 20 20 20 20 20 73 52 65 67 65 78 20 3d 20         sRegex = 
1c10: 73 52 65 67 65 78 5b 3a 6d 2e 73 74 61 72 74 28  sRegex[:m.start(
1c20: 29 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20 23  )].strip().    #
1c30: 20 4a 53 20 72 65 67 65 78 0a 20 20 20 20 6d 20   JS regex.    m 
1c40: 3d 20 72 65 2e 73 65 61 72 63 68 28 22 3c 6a 73  = re.search("<js
1c50: 3e 2e 2b 3c 2f 6a 73 3e 69 3f 22 2c 20 73 52 65  >.+</js>i?", sRe
1c60: 67 65 78 29 0a 20 20 20 20 69 66 20 6d 3a 0a 20  gex).    if m:. 
1c70: 20 20 20 20 20 20 20 64 4a 53 52 45 47 45 58 45         dJSREGEXE
1c80: 53 5b 73 4c 69 6e 65 49 64 5d 20 3d 20 6d 2e 67  S[sLineId] = m.g
1c90: 72 6f 75 70 28 30 29 0a 20 20 20 20 20 20 20 20  roup(0).        
1ca0: 73 52 65 67 65 78 20 3d 20 73 52 65 67 65 78 5b  sRegex = sRegex[
1cb0: 3a 6d 2e 73 74 61 72 74 28 29 5d 2e 73 74 72 69  :m.start()].stri
1cc0: 70 28 29 0a 20 20 20 20 69 66 20 22 3c 6a 73 3e  p().    if "<js>
1cd0: 22 20 69 6e 20 73 52 65 67 65 78 20 6f 72 20 22  " in sRegex or "
1ce0: 3c 2f 6a 73 3e 22 20 69 6e 20 73 52 65 67 65 78  </js>" in sRegex
1cf0: 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28  :.        print(
1d00: 22 23 20 45 72 72 6f 72 3a 20 4a 61 76 61 53 63  "# Error: JavaSc
1d10: 72 69 70 74 20 72 65 67 65 78 20 6e 6f 74 20 64  ript regex not d
1d20: 65 6c 69 6d 69 74 65 64 20 61 74 20 6c 69 6e 65  elimited at line
1d30: 20 22 20 2b 20 73 4c 69 6e 65 49 64 29 0a 20 20   " + sLineId).  
1d40: 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e        return Non
1d50: 65 0a 0a 20 20 20 20 23 20 71 75 6f 74 65 73 20  e..    # quotes 
1d60: 3f 0a 20 20 20 20 69 66 20 73 52 65 67 65 78 2e  ?.    if sRegex.
1d70: 73 74 61 72 74 73 77 69 74 68 28 27 22 27 29 20  startswith('"') 
1d80: 61 6e 64 20 73 52 65 67 65 78 2e 65 6e 64 73 77  and sRegex.endsw
1d90: 69 74 68 28 27 22 27 29 3a 0a 20 20 20 20 20 20  ith('"'):.      
1da0: 20 20 73 52 65 67 65 78 20 3d 20 73 52 65 67 65    sRegex = sRege
1db0: 78 5b 31 3a 2d 31 5d 0a 0a 20 20 20 20 23 23 20  x[1:-1]..    ## 
1dc0: 64 65 66 69 6e 69 74 69 6f 6e 73 0a 20 20 20 20  definitions.    
1dd0: 66 6f 72 20 73 44 65 66 2c 20 73 52 65 70 6c 20  for sDef, sRepl 
1de0: 69 6e 20 64 44 45 46 2e 69 74 65 6d 73 28 29 3a  in dDEF.items():
1df0: 0a 20 20 20 20 20 20 20 20 73 52 65 67 65 78 20  .        sRegex 
1e00: 3d 20 73 52 65 67 65 78 2e 72 65 70 6c 61 63 65  = sRegex.replace
1e10: 28 73 44 65 66 2c 20 73 52 65 70 6c 29 0a 0a 20  (sDef, sRepl).. 
1e20: 20 20 20 23 23 20 63 6f 75 6e 74 20 6e 75 6d 62     ## count numb
1e30: 65 72 20 6f 66 20 67 72 6f 75 70 73 20 28 6d 75  er of groups (mu
1e40: 73 74 20 62 65 20 64 6f 6e 65 20 62 65 66 6f 72  st be done befor
1e50: 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  e modifying the 
1e60: 72 65 67 65 78 29 0a 20 20 20 20 6e 47 72 6f 75  regex).    nGrou
1e70: 70 20 3d 20 63 6f 75 6e 74 47 72 6f 75 70 49 6e  p = countGroupIn
1e80: 52 65 67 65 78 28 73 52 65 67 65 78 29 0a 20 20  Regex(sRegex).  
1e90: 20 20 69 66 20 6e 47 72 6f 75 70 20 3e 20 30 3a    if nGroup > 0:
1ea0: 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20  .        if not 
1eb0: 74 47 72 6f 75 70 73 3a 0a 20 20 20 20 20 20 20  tGroups:.       
1ec0: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 57 61       print("# Wa
1ed0: 72 6e 69 6e 67 3a 20 67 72 6f 75 70 73 20 70 6f  rning: groups po
1ee0: 73 69 74 69 6f 6e 69 6e 67 20 63 6f 64 65 20 66  sitioning code f
1ef0: 6f 72 20 4a 61 76 61 53 63 72 69 70 74 20 73 68  or JavaScript sh
1f00: 6f 75 6c 64 20 62 65 20 64 65 66 69 6e 65 64 20  ould be defined 
1f10: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 4c 69 6e  at line " + sLin
1f20: 65 49 64 29 0a 20 20 20 20 20 20 20 20 65 6c 73  eId).        els
1f30: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e:.            i
1f40: 66 20 6e 47 72 6f 75 70 20 21 3d 20 6c 65 6e 28  f nGroup != len(
1f50: 74 47 72 6f 75 70 73 29 3a 0a 20 20 20 20 20 20  tGroups):.      
1f60: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
1f70: 22 23 20 45 72 72 6f 72 3a 20 67 72 6f 75 70 73  "# Error: groups
1f80: 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 63 6f 64   positioning cod
1f90: 65 20 69 72 72 65 6c 65 76 61 6e 74 20 61 74 20  e irrelevant at 
1fa0: 6c 69 6e 65 20 22 20 2b 20 73 4c 69 6e 65 49 64  line " + sLineId
1fb0: 29 0a 0a 20 20 20 20 23 23 20 77 6f 72 64 20 6c  )..    ## word l
1fc0: 69 6d 69 74 0a 20 20 20 20 69 66 20 63 57 6f 72  imit.    if cWor
1fd0: 64 4c 69 6d 69 74 4c 65 66 74 20 3d 3d 20 27 5b  dLimitLeft == '[
1fe0: 27 20 61 6e 64 20 6e 6f 74 20 73 52 65 67 65 78  ' and not sRegex
1ff0: 2e 73 74 61 72 74 73 77 69 74 68 28 28 22 5e 22  .startswith(("^"
2000: 2c 20 27 e2 80 99 27 2c 20 22 27 22 2c 20 22 2c  , '...', "'", ",
2010: 22 29 29 3a 0a 20 20 20 20 20 20 20 20 73 52 65  ")):.        sRe
2020: 67 65 78 20 3d 20 73 57 4f 52 44 4c 49 4d 49 54  gex = sWORDLIMIT
2030: 4c 45 46 54 20 2b 20 73 52 65 67 65 78 0a 20 20  LEFT + sRegex.  
2040: 20 20 69 66 20 63 57 6f 72 64 4c 69 6d 69 74 52    if cWordLimitR
2050: 69 67 68 74 20 3d 3d 20 27 5d 27 20 61 6e 64 20  ight == ']' and 
2060: 6e 6f 74 20 73 52 65 67 65 78 2e 65 6e 64 73 77  not sRegex.endsw
2070: 69 74 68 28 28 22 24 22 2c 20 27 e2 80 99 27 2c  ith(("$", '...',
2080: 20 22 27 22 2c 20 22 2c 22 29 29 3a 0a 20 20 20   "'", ",")):.   
2090: 20 20 20 20 20 73 52 65 67 65 78 20 3d 20 73 52       sRegex = sR
20a0: 65 67 65 78 20 2b 20 73 57 4f 52 44 4c 49 4d 49  egex + sWORDLIMI
20b0: 54 52 49 47 48 54 0a 0a 20 20 20 20 23 23 20 63  TRIGHT..    ## c
20c0: 61 73 69 6e 67 20 6d 6f 64 65 0a 20 20 20 20 69  asing mode.    i
20d0: 66 20 63 43 61 73 65 4d 6f 64 65 20 3d 3d 20 22  f cCaseMode == "
20e0: 69 22 3a 0a 20 20 20 20 20 20 20 20 62 43 61 73  i":.        bCas
20f0: 65 49 6e 73 65 6e 73 69 74 69 76 65 20 3d 20 54  eInsensitive = T
2100: 72 75 65 0a 20 20 20 20 20 20 20 20 69 66 20 6e  rue.        if n
2110: 6f 74 20 73 52 65 67 65 78 2e 73 74 61 72 74 73  ot sRegex.starts
2120: 77 69 74 68 28 22 28 3f 69 29 22 29 3a 0a 20 20  with("(?i)"):.  
2130: 20 20 20 20 20 20 20 20 20 20 73 52 65 67 65 78            sRegex
2140: 20 3d 20 22 28 3f 69 29 22 20 2b 20 73 52 65 67   = "(?i)" + sReg
2150: 65 78 0a 20 20 20 20 65 6c 69 66 20 63 43 61 73  ex.    elif cCas
2160: 65 4d 6f 64 65 20 3d 3d 20 22 73 22 3a 0a 20 20  eMode == "s":.  
2170: 20 20 20 20 20 20 62 43 61 73 65 49 6e 73 65 6e        bCaseInsen
2180: 73 69 74 69 76 65 20 3d 20 46 61 6c 73 65 0a 20  sitive = False. 
2190: 20 20 20 20 20 20 20 73 52 65 67 65 78 20 3d 20         sRegex = 
21a0: 73 52 65 67 65 78 2e 72 65 70 6c 61 63 65 28 22  sRegex.replace("
21b0: 28 3f 69 29 22 2c 20 22 22 29 0a 20 20 20 20 65  (?i)", "").    e
21c0: 6c 69 66 20 63 43 61 73 65 4d 6f 64 65 20 3d 3d  lif cCaseMode ==
21d0: 20 22 75 22 3a 0a 20 20 20 20 20 20 20 20 62 43   "u":.        bC
21e0: 61 73 65 49 6e 73 65 6e 73 69 74 69 76 65 20 3d  aseInsensitive =
21f0: 20 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 73   False.        s
2200: 52 65 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72  Regex = sRegex.r
2210: 65 70 6c 61 63 65 28 22 28 3f 69 29 22 2c 20 22  eplace("(?i)", "
2220: 22 29 0a 20 20 20 20 20 20 20 20 73 52 65 67 65  ").        sRege
2230: 78 20 3d 20 75 70 70 65 72 63 61 73 65 28 73 52  x = uppercase(sR
2240: 65 67 65 78 2c 20 73 4c 61 6e 67 29 0a 20 20 20  egex, sLang).   
2250: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 70   else:.        p
2260: 72 69 6e 74 28 22 23 20 55 6e 6b 6e 6f 77 6e 20  rint("# Unknown 
2270: 63 61 73 65 20 6d 6f 64 65 20 5b 22 20 2b 20 63  case mode [" + c
2280: 43 61 73 65 4d 6f 64 65 20 2b 20 22 5d 20 61 74  CaseMode + "] at
2290: 20 6c 69 6e 65 20 22 20 2b 20 73 4c 69 6e 65 49   line " + sLineI
22a0: 64 29 0a 0a 20 20 20 20 23 23 20 63 68 65 63 6b  d)..    ## check
22b0: 20 72 65 67 65 78 0a 20 20 20 20 74 72 79 3a 0a   regex.    try:.
22c0: 20 20 20 20 20 20 20 20 7a 20 3d 20 72 65 2e 63          z = re.c
22d0: 6f 6d 70 69 6c 65 28 73 52 65 67 65 78 29 0a 20  ompile(sRegex). 
22e0: 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20     except:.     
22f0: 20 20 20 70 72 69 6e 74 28 22 23 20 52 65 67 65     print("# Rege
2300: 78 20 65 72 72 6f 72 20 61 74 20 6c 69 6e 65 20  x error at line 
2310: 22 2c 20 6e 49 64 4c 69 6e 65 29 0a 20 20 20 20  ", nIdLine).    
2320: 20 20 20 20 70 72 69 6e 74 28 73 52 65 67 65 78      print(sRegex
2330: 29 0a 20 20 20 20 20 20 20 20 74 72 61 63 65 62  ).        traceb
2340: 61 63 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29 0a  ack.print_exc().
2350: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e          return N
2360: 6f 6e 65 0a 20 20 20 20 23 23 20 67 72 6f 75 70  one.    ## group
2370: 73 20 69 6e 20 6e 6f 6e 20 67 72 6f 75 70 69 6e  s in non groupin
2380: 67 20 70 61 72 65 6e 74 68 65 73 69 73 0a 20 20  g parenthesis.  
2390: 20 20 66 6f 72 20 78 20 69 6e 20 72 65 2e 66 69    for x in re.fi
23a0: 6e 64 69 74 65 72 28 22 5c 28 5c 3f 3a 5b 5e 29  nditer("\(\?:[^)
23b0: 5d 2a 5c 28 5b 5b 5c 77 20 2d 5d 22 2c 20 73 52  ]*\([[\w -]", sR
23c0: 65 67 65 78 29 3a 0a 20 20 20 20 20 20 20 20 70  egex):.        p
23d0: 72 69 6e 74 28 22 23 20 57 61 72 6e 69 6e 67 3a  rint("# Warning:
23e0: 20 67 72 6f 75 70 73 20 69 6e 73 69 64 65 20 6e   groups inside n
23f0: 6f 6e 20 67 72 6f 75 70 69 6e 67 20 70 61 72 65  on grouping pare
2400: 6e 74 68 65 73 69 73 20 69 6e 20 72 65 67 65 78  nthesis in regex
2410: 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 4c 69   at line " + sLi
2420: 6e 65 49 64 29 0a 0a 20 20 20 20 23 23 23 23 20  neId)..    #### 
2430: 50 41 52 53 45 20 41 43 54 49 4f 4e 53 0a 20 20  PARSE ACTIONS.  
2440: 20 20 6c 41 63 74 69 6f 6e 73 20 3d 20 5b 5d 0a    lActions = [].
2450: 20 20 20 20 6e 41 63 74 69 6f 6e 20 3d 20 31 0a      nAction = 1.
2460: 20 20 20 20 66 6f 72 20 73 41 63 74 69 6f 6e 20      for sAction 
2470: 69 6e 20 73 2e 73 70 6c 69 74 28 22 20 3c 3c 2d  in s.split(" <<-
2480: 20 22 29 3a 0a 20 20 20 20 20 20 20 20 74 20 3d   "):.        t =
2490: 20 63 72 65 61 74 65 41 63 74 69 6f 6e 28 73 52   createAction(sR
24a0: 75 6c 65 49 64 20 2b 20 22 5f 22 20 2b 20 73 74  uleId + "_" + st
24b0: 72 28 6e 41 63 74 69 6f 6e 29 2c 20 73 41 63 74  r(nAction), sAct
24c0: 69 6f 6e 2c 20 6e 47 72 6f 75 70 29 0a 20 20 20  ion, nGroup).   
24d0: 20 20 20 20 20 6e 41 63 74 69 6f 6e 20 2b 3d 20       nAction += 
24e0: 31 0a 20 20 20 20 20 20 20 20 69 66 20 74 3a 0a  1.        if t:.
24f0: 20 20 20 20 20 20 20 20 20 20 20 20 6c 41 63 74              lAct
2500: 69 6f 6e 73 2e 61 70 70 65 6e 64 28 74 29 0a 20  ions.append(t). 
2510: 20 20 20 69 66 20 6e 6f 74 20 6c 41 63 74 69 6f     if not lActio
2520: 6e 73 3a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ns:.        retu
2530: 72 6e 20 4e 6f 6e 65 0a 0a 20 20 20 20 72 65 74  rn None..    ret
2540: 75 72 6e 20 5b 73 4f 70 74 69 6f 6e 2c 20 73 52  urn [sOption, sR
2550: 65 67 65 78 2c 20 62 43 61 73 65 49 6e 73 65 6e  egex, bCaseInsen
2560: 73 69 74 69 76 65 2c 20 73 4c 69 6e 65 49 64 2c  sitive, sLineId,
2570: 20 73 52 75 6c 65 49 64 2c 20 6e 50 72 69 6f 72   sRuleId, nPrior
2580: 69 74 79 2c 20 6c 41 63 74 69 6f 6e 73 2c 20 74  ity, lActions, t
2590: 47 72 6f 75 70 73 5d 0a 0a 0a 64 65 66 20 63 72  Groups]...def cr
25a0: 65 61 74 65 41 63 74 69 6f 6e 20 28 73 49 64 41  eateAction (sIdA
25b0: 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c 20  ction, sAction, 
25c0: 6e 47 72 6f 75 70 29 3a 0a 20 20 20 20 22 72 65  nGroup):.    "re
25d0: 74 75 72 6e 73 20 61 6e 20 61 63 74 69 6f 6e 20  turns an action 
25e0: 74 6f 20 70 65 72 66 6f 72 6d 20 61 73 20 61 20  to perform as a 
25f0: 74 75 70 6c 65 20 28 63 6f 6e 64 69 74 69 6f 6e  tuple (condition
2600: 2c 20 61 63 74 69 6f 6e 20 74 79 70 65 2c 20 61  , action type, a
2610: 63 74 69 6f 6e 5b 2c 20 69 47 72 6f 75 70 20 5b  ction[, iGroup [
2620: 2c 20 6d 65 73 73 61 67 65 2c 20 55 52 4c 20 5d  , message, URL ]
2630: 5d 29 22 0a 20 20 20 20 67 6c 6f 62 61 6c 20 6c  ])".    global l
2640: 46 55 4e 43 54 49 4f 4e 53 0a 0a 20 20 20 20 6d  FUNCTIONS..    m
2650: 20 3d 20 72 65 2e 73 65 61 72 63 68 28 72 22 28   = re.search(r"(
2660: 5b 2d 7e 3d 3e 5d 29 28 5c 64 2a 7c 29 3e 3e 22  [-~=>])(\d*|)>>"
2670: 2c 20 73 41 63 74 69 6f 6e 29 0a 20 20 20 20 69  , sAction).    i
2680: 66 20 6e 6f 74 20 6d 3a 0a 20 20 20 20 20 20 20  f not m:.       
2690: 20 70 72 69 6e 74 28 22 23 20 4e 6f 20 61 63 74   print("# No act
26a0: 69 6f 6e 20 61 74 20 6c 69 6e 65 20 22 20 2b 20  ion at line " + 
26b0: 73 49 64 41 63 74 69 6f 6e 29 0a 20 20 20 20 20  sIdAction).     
26c0: 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 0a     return None..
26d0: 20 20 20 20 23 23 23 23 20 43 4f 4e 44 49 54 49      #### CONDITI
26e0: 4f 4e 0a 20 20 20 20 73 43 6f 6e 64 69 74 69 6f  ON.    sConditio
26f0: 6e 20 3d 20 73 41 63 74 69 6f 6e 5b 3a 6d 2e 73  n = sAction[:m.s
2700: 74 61 72 74 28 29 5d 2e 73 74 72 69 70 28 29 0a  tart()].strip().
2710: 20 20 20 20 69 66 20 73 43 6f 6e 64 69 74 69 6f      if sConditio
2720: 6e 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e 64  n:.        sCond
2730: 69 74 69 6f 6e 20 3d 20 70 72 65 70 61 72 65 46  ition = prepareF
2740: 75 6e 63 74 69 6f 6e 28 73 43 6f 6e 64 69 74 69  unction(sConditi
2750: 6f 6e 29 0a 20 20 20 20 20 20 20 20 6c 46 55 4e  on).        lFUN
2760: 43 54 49 4f 4e 53 2e 61 70 70 65 6e 64 28 28 22  CTIONS.append(("
2770: 63 5f 22 2b 73 49 64 41 63 74 69 6f 6e 2c 20 73  c_"+sIdAction, s
2780: 43 6f 6e 64 69 74 69 6f 6e 29 29 0a 20 20 20 20  Condition)).    
2790: 20 20 20 20 66 6f 72 20 78 20 69 6e 20 72 65 2e      for x in re.
27a0: 66 69 6e 64 69 74 65 72 28 22 5b 2e 5d 28 3f 3a  finditer("[.](?:
27b0: 67 72 6f 75 70 7c 73 74 61 72 74 7c 65 6e 64 29  group|start|end)
27c0: 5b 28 5d 28 5c 64 2b 29 5b 29 5d 22 2c 20 73 43  [(](\d+)[)]", sC
27d0: 6f 6e 64 69 74 69 6f 6e 29 3a 0a 20 20 20 20 20  ondition):.     
27e0: 20 20 20 20 20 20 20 69 66 20 69 6e 74 28 78 2e         if int(x.
27f0: 67 72 6f 75 70 28 31 29 29 20 3e 20 6e 47 72 6f  group(1)) > nGro
2800: 75 70 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  up:.            
2810: 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72      print("# Err
2820: 6f 72 20 69 6e 20 67 72 6f 75 70 73 20 69 6e 20  or in groups in 
2830: 63 6f 6e 64 69 74 69 6f 6e 20 61 74 20 6c 69 6e  condition at lin
2840: 65 20 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 20  e " + sIdAction 
2850: 2b 20 22 20 28 22 2b 73 74 72 28 6e 47 72 6f 75  + " ("+str(nGrou
2860: 70 29 2b 22 20 67 72 6f 75 70 73 20 6f 6e 6c 79  p)+" groups only
2870: 29 22 29 0a 20 20 20 20 20 20 20 20 69 66 20 22  )").        if "
2880: 2e 6d 61 74 63 68 22 20 69 6e 20 73 43 6f 6e 64  .match" in sCond
2890: 69 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20  ition:.         
28a0: 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f     print("# Erro
28b0: 72 2e 20 4a 53 20 63 6f 6d 70 61 74 69 62 69 6c  r. JS compatibil
28c0: 69 74 79 2e 20 44 6f 6e 27 74 20 75 73 65 20 2e  ity. Don't use .
28d0: 6d 61 74 63 68 28 29 20 69 6e 20 63 6f 6e 64 69  match() in condi
28e0: 74 69 6f 6e 2c 20 75 73 65 20 2e 73 65 61 72 63  tion, use .searc
28f0: 68 28 29 22 29 0a 20 20 20 20 20 20 20 20 73 43  h()").        sC
2900: 6f 6e 64 69 74 69 6f 6e 20 3d 20 22 63 5f 22 2b  ondition = "c_"+
2910: 73 49 64 41 63 74 69 6f 6e 0a 20 20 20 20 65 6c  sIdAction.    el
2920: 73 65 3a 0a 20 20 20 20 20 20 20 20 73 43 6f 6e  se:.        sCon
2930: 64 69 74 69 6f 6e 20 3d 20 4e 6f 6e 65 0a 0a 20  dition = None.. 
2940: 20 20 20 23 23 23 23 20 69 47 72 6f 75 70 20 2f     #### iGroup /
2950: 20 70 6f 73 69 74 69 6f 6e 69 6e 67 0a 20 20 20   positioning.   
2960: 20 69 47 72 6f 75 70 20 3d 20 69 6e 74 28 6d 2e   iGroup = int(m.
2970: 67 72 6f 75 70 28 32 29 29 20 69 66 20 6d 2e 67  group(2)) if m.g
2980: 72 6f 75 70 28 32 29 20 65 6c 73 65 20 30 0a 20  roup(2) else 0. 
2990: 20 20 20 69 66 20 69 47 72 6f 75 70 20 3e 20 6e     if iGroup > n
29a0: 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20 20 70  Group:.        p
29b0: 72 69 6e 74 28 22 23 20 53 65 6c 65 63 74 65 64  rint("# Selected
29c0: 20 67 72 6f 75 70 20 3e 20 67 72 6f 75 70 20 6e   group > group n
29d0: 75 6d 62 65 72 20 69 6e 20 72 65 67 65 78 20 61  umber in regex a
29e0: 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63  t line " + sIdAc
29f0: 74 69 6f 6e 29 0a 20 20 20 20 0a 20 20 20 20 23  tion).    .    #
2a00: 23 23 23 20 41 43 54 49 4f 4e 0a 20 20 20 20 73  ### ACTION.    s
2a10: 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e  Action = sAction
2a20: 5b 6d 2e 65 6e 64 28 29 3a 5d 2e 73 74 72 69 70  [m.end():].strip
2a30: 28 29 0a 20 20 20 20 63 41 63 74 69 6f 6e 20 3d  ().    cAction =
2a40: 20 6d 2e 67 72 6f 75 70 28 31 29 0a 20 20 20 20   m.group(1).    
2a50: 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22 2d  if cAction == "-
2a60: 22 3a 0a 20 20 20 20 20 20 20 20 23 23 20 65 72  ":.        ## er
2a70: 72 6f 72 0a 20 20 20 20 20 20 20 20 69 4d 73 67  ror.        iMsg
2a80: 20 3d 20 73 41 63 74 69 6f 6e 2e 66 69 6e 64 28   = sAction.find(
2a90: 22 20 23 20 22 29 0a 20 20 20 20 20 20 20 20 69  " # ").        i
2aa0: 66 20 69 4d 73 67 20 3d 3d 20 2d 31 3a 0a 20 20  f iMsg == -1:.  
2ab0: 20 20 20 20 20 20 20 20 20 20 73 4d 73 67 20 3d            sMsg =
2ac0: 20 22 23 20 45 72 72 6f 72 2e 20 45 72 72 6f 72   "# Error. Error
2ad0: 20 6d 65 73 73 61 67 65 20 6e 6f 74 20 66 6f 75   message not fou
2ae0: 6e 64 2e 22 0a 20 20 20 20 20 20 20 20 20 20 20  nd.".           
2af0: 20 73 55 52 4c 20 3d 20 22 22 0a 20 20 20 20 20   sURL = "".     
2b00: 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 4d 73         print(sMs
2b10: 67 20 2b 20 22 20 41 63 74 69 6f 6e 20 69 64 3a  g + " Action id:
2b20: 20 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 29 0a   " + sIdAction).
2b30: 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20          else:.  
2b40: 20 20 20 20 20 20 20 20 20 20 73 4d 73 67 20 3d            sMsg =
2b50: 20 73 41 63 74 69 6f 6e 5b 69 4d 73 67 2b 33 3a   sAction[iMsg+3:
2b60: 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20 20 20  ].strip().      
2b70: 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20        sAction = 
2b80: 73 41 63 74 69 6f 6e 5b 3a 69 4d 73 67 5d 2e 73  sAction[:iMsg].s
2b90: 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 20  trip().         
2ba0: 20 20 20 73 55 52 4c 20 3d 20 22 22 0a 20 20 20     sURL = "".   
2bb0: 20 20 20 20 20 20 20 20 20 6d 55 52 4c 20 3d 20           mURL = 
2bc0: 72 65 2e 73 65 61 72 63 68 28 22 5b 7c 5d 20 2a  re.search("[|] *
2bd0: 28 68 74 74 70 73 3f 3a 2f 2f 2e 2a 29 22 2c 20  (https?://.*)", 
2be0: 73 4d 73 67 29 0a 20 20 20 20 20 20 20 20 20 20  sMsg).          
2bf0: 20 20 69 66 20 6d 55 52 4c 3a 0a 20 20 20 20 20    if mURL:.     
2c00: 20 20 20 20 20 20 20 20 20 20 20 73 55 52 4c 20             sURL 
2c10: 3d 20 6d 55 52 4c 2e 67 72 6f 75 70 28 31 29 2e  = mURL.group(1).
2c20: 73 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20  strip().        
2c30: 20 20 20 20 20 20 20 20 73 4d 73 67 20 3d 20 73          sMsg = s
2c40: 4d 73 67 5b 3a 6d 55 52 4c 2e 73 74 61 72 74 28  Msg[:mURL.start(
2c50: 30 29 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20  0)].strip().    
2c60: 20 20 20 20 20 20 20 20 69 66 20 73 4d 73 67 5b          if sMsg[
2c70: 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20 20  0:1] == "=":.   
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 4d 73               sMs
2c90: 67 20 3d 20 70 72 65 70 61 72 65 46 75 6e 63 74  g = prepareFunct
2ca0: 69 6f 6e 28 73 4d 73 67 5b 31 3a 5d 29 0a 20 20  ion(sMsg[1:]).  
2cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 46                lF
2cc0: 55 4e 43 54 49 4f 4e 53 2e 61 70 70 65 6e 64 28  UNCTIONS.append(
2cd0: 28 22 6d 5f 22 2b 73 49 64 41 63 74 69 6f 6e 2c  ("m_"+sIdAction,
2ce0: 20 73 4d 73 67 29 29 0a 20 20 20 20 20 20 20 20   sMsg)).        
2cf0: 20 20 20 20 20 20 20 20 66 6f 72 20 78 20 69 6e          for x in
2d00: 20 72 65 2e 66 69 6e 64 69 74 65 72 28 22 67 72   re.finditer("gr
2d10: 6f 75 70 5b 28 5d 28 5c 64 2b 29 5b 29 5d 22 2c  oup[(](\d+)[)]",
2d20: 20 73 4d 73 67 29 3a 0a 20 20 20 20 20 20 20 20   sMsg):.        
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69              if i
2d40: 6e 74 28 78 2e 67 72 6f 75 70 28 31 29 29 20 3e  nt(x.group(1)) >
2d50: 20 6e 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20   nGroup:.       
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20   print("# Error 
2d80: 69 6e 20 67 72 6f 75 70 73 20 69 6e 20 6d 65 73  in groups in mes
2d90: 73 61 67 65 20 61 74 20 6c 69 6e 65 20 22 20 2b  sage at line " +
2da0: 20 73 49 64 41 63 74 69 6f 6e 20 2b 20 22 20 28   sIdAction + " (
2db0: 22 2b 73 74 72 28 6e 47 72 6f 75 70 29 2b 22 20  "+str(nGroup)+" 
2dc0: 67 72 6f 75 70 73 20 6f 6e 6c 79 29 22 29 0a 20  groups only)"). 
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2de0: 4d 73 67 20 3d 20 22 3d 6d 5f 22 2b 73 49 64 41  Msg = "=m_"+sIdA
2df0: 63 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ction.          
2e00: 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20    else:.        
2e10: 20 20 20 20 20 20 20 20 66 6f 72 20 78 20 69 6e          for x in
2e20: 20 72 65 2e 66 69 6e 64 69 74 65 72 28 72 22 5c   re.finditer(r"\
2e30: 5c 28 5c 64 2b 29 22 2c 20 73 4d 73 67 29 3a 0a  \(\d+)", sMsg):.
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e50: 20 20 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f      if int(x.gro
2e60: 75 70 28 31 29 29 20 3e 20 6e 47 72 6f 75 70 3a  up(1)) > nGroup:
2e70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e80: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
2e90: 23 20 45 72 72 6f 72 20 69 6e 20 67 72 6f 75 70  # Error in group
2ea0: 73 20 69 6e 20 6d 65 73 73 61 67 65 20 61 74 20  s in message at 
2eb0: 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63 74 69  line " + sIdActi
2ec0: 6f 6e 20 2b 20 22 20 28 22 2b 73 74 72 28 6e 47  on + " ("+str(nG
2ed0: 72 6f 75 70 29 2b 22 20 67 72 6f 75 70 73 20 6f  roup)+" groups o
2ee0: 6e 6c 79 29 22 29 0a 20 20 20 20 20 20 20 20 20  nly)").         
2ef0: 20 20 20 20 20 20 20 69 66 20 72 65 2e 73 65 61         if re.sea
2f00: 72 63 68 28 22 5b 2e 5d 5c 5c 77 2b 5b 28 5d 22  rch("[.]\\w+[(]"
2f10: 2c 20 73 4d 73 67 29 3a 0a 20 20 20 20 20 20 20  , sMsg):.       
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
2f30: 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20 6d  nt("# Error in m
2f40: 65 73 73 61 67 65 20 61 74 20 6c 69 6e 65 20 22  essage at line "
2f50: 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20 22   + sIdAction + "
2f60: 3a 20 20 54 68 69 73 20 6d 65 73 73 61 67 65 20  :  This message 
2f70: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 63 6f 64 65 2e  looks like code.
2f80: 20 4c 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 67   Line should beg
2f90: 69 6e 20 77 69 74 68 20 3d 22 29 0a 20 20 20 20  in with =").    
2fa0: 20 20 20 20 20 20 20 20 0a 20 20 20 20 69 66 20          .    if 
2fb0: 73 41 63 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20  sAction[0:1] == 
2fc0: 22 3d 22 20 6f 72 20 63 41 63 74 69 6f 6e 20 3d  "=" or cAction =
2fd0: 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 69  = "=":.        i
2fe0: 66 20 22 64 65 66 69 6e 65 22 20 69 6e 20 73 41  f "define" in sA
2ff0: 63 74 69 6f 6e 20 61 6e 64 20 6e 6f 74 20 72 65  ction and not re
3000: 2e 73 65 61 72 63 68 28 72 22 64 65 66 69 6e 65  .search(r"define
3010: 5c 28 5c 5c 5c 64 2b 20 2a 2c 20 2a 5c 5b 2e 2a  \(\\\d+ *, *\[.*
3020: 5c 5d 20 2a 5c 29 22 2c 20 73 41 63 74 69 6f 6e  \] *\)", sAction
3030: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ):.            p
3040: 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e  rint("# Error in
3050: 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20   action at line 
3060: 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20  " + sIdAction + 
3070: 22 3a 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  ": second argume
3080: 6e 74 20 66 6f 72 20 64 65 66 69 6e 65 20 6d 75  nt for define mu
3090: 73 74 20 62 65 20 61 20 6c 69 73 74 20 6f 66 20  st be a list of 
30a0: 73 74 72 69 6e 67 73 22 29 0a 20 20 20 20 20 20  strings").      
30b0: 20 20 73 41 63 74 69 6f 6e 20 3d 20 70 72 65 70    sAction = prep
30c0: 61 72 65 46 75 6e 63 74 69 6f 6e 28 73 41 63 74  areFunction(sAct
30d0: 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 73 41 63  ion).        sAc
30e0: 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 2e 72  tion = sAction.r
30f0: 65 70 6c 61 63 65 28 22 6d 2e 67 72 6f 75 70 28  eplace("m.group(
3100: 69 5b 34 5d 29 22 2c 20 22 6d 2e 67 72 6f 75 70  i[4])", "m.group
3110: 28 22 2b 73 74 72 28 69 47 72 6f 75 70 29 2b 22  ("+str(iGroup)+"
3120: 29 22 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20  )").        for 
3130: 78 20 69 6e 20 72 65 2e 66 69 6e 64 69 74 65 72  x in re.finditer
3140: 28 22 67 72 6f 75 70 5b 28 5d 28 5c 64 2b 29 5b  ("group[(](\d+)[
3150: 29 5d 22 2c 20 73 41 63 74 69 6f 6e 29 3a 0a 20  )]", sAction):. 
3160: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 6e             if in
3170: 74 28 78 2e 67 72 6f 75 70 28 31 29 29 20 3e 20  t(x.group(1)) > 
3180: 6e 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20 20  nGroup:.        
3190: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23          print("#
31a0: 20 45 72 72 6f 72 20 69 6e 20 67 72 6f 75 70 73   Error in groups
31b0: 20 69 6e 20 72 65 70 6c 61 63 65 6d 65 6e 74 20   in replacement 
31c0: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41  at line " + sIdA
31d0: 63 74 69 6f 6e 20 2b 20 22 20 28 22 2b 73 74 72  ction + " ("+str
31e0: 28 6e 47 72 6f 75 70 29 2b 22 20 67 72 6f 75 70  (nGroup)+" group
31f0: 73 20 6f 6e 6c 79 29 22 29 0a 20 20 20 20 65 6c  s only)").    el
3200: 73 65 3a 0a 20 20 20 20 20 20 20 20 66 6f 72 20  se:.        for 
3210: 78 20 69 6e 20 72 65 2e 66 69 6e 64 69 74 65 72  x in re.finditer
3220: 28 72 22 5c 5c 28 5c 64 2b 29 22 2c 20 73 41 63  (r"\\(\d+)", sAc
3230: 74 69 6f 6e 29 3a 0a 20 20 20 20 20 20 20 20 20  tion):.         
3240: 20 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f 75     if int(x.grou
3250: 70 28 31 29 29 20 3e 20 6e 47 72 6f 75 70 3a 0a  p(1)) > nGroup:.
3260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3270: 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69  print("# Error i
3280: 6e 20 67 72 6f 75 70 73 20 69 6e 20 72 65 70 6c  n groups in repl
3290: 61 63 65 6d 65 6e 74 20 61 74 20 6c 69 6e 65 20  acement at line 
32a0: 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20  " + sIdAction + 
32b0: 22 20 28 22 2b 73 74 72 28 6e 47 72 6f 75 70 29  " ("+str(nGroup)
32c0: 2b 22 20 67 72 6f 75 70 73 20 6f 6e 6c 79 29 22  +" groups only)"
32d0: 29 0a 20 20 20 20 20 20 20 20 69 66 20 72 65 2e  ).        if re.
32e0: 73 65 61 72 63 68 28 22 5b 2e 5d 5c 5c 77 2b 5b  search("[.]\\w+[
32f0: 28 5d 7c 73 75 67 67 5c 5c 77 2b 5b 28 5d 22 2c  (]|sugg\\w+[(]",
3300: 20 73 41 63 74 69 6f 6e 29 3a 0a 20 20 20 20 20   sAction):.     
3310: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
3320: 45 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20  Error in action 
3330: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41  at line " + sIdA
3340: 63 74 69 6f 6e 20 2b 20 22 3a 20 20 54 68 69 73  ction + ":  This
3350: 20 61 63 74 69 6f 6e 20 6c 6f 6f 6b 73 20 6c 69   action looks li
3360: 6b 65 20 63 6f 64 65 2e 20 4c 69 6e 65 20 73 68  ke code. Line sh
3370: 6f 75 6c 64 20 62 65 67 69 6e 20 77 69 74 68 20  ould begin with 
3380: 3d 22 29 0a 0a 20 20 20 20 69 66 20 63 41 63 74  =")..    if cAct
3390: 69 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20  ion == "-":.    
33a0: 20 20 20 20 23 23 20 65 72 72 6f 72 20 64 65 74      ## error det
33b0: 65 63 74 65 64 20 2d 2d 3e 20 73 75 67 67 65 73  ected --> sugges
33c0: 74 69 6f 6e 0a 20 20 20 20 20 20 20 20 69 66 20  tion.        if 
33d0: 6e 6f 74 20 73 41 63 74 69 6f 6e 3a 0a 20 20 20  not sAction:.   
33e0: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
33f0: 23 20 45 72 72 6f 72 20 69 6e 20 61 63 74 69 6f  # Error in actio
3400: 6e 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49  n at line " + sI
3410: 64 41 63 74 69 6f 6e 20 2b 20 22 3a 20 20 54 68  dAction + ":  Th
3420: 69 73 20 61 63 74 69 6f 6e 20 69 73 20 65 6d 70  is action is emp
3430: 74 79 2e 22 29 0a 20 20 20 20 20 20 20 20 69 66  ty.").        if
3440: 20 73 41 63 74 69 6f 6e 5b 30 3a 31 5d 20 3d 3d   sAction[0:1] ==
3450: 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20   "=":.          
3460: 20 20 6c 46 55 4e 43 54 49 4f 4e 53 2e 61 70 70    lFUNCTIONS.app
3470: 65 6e 64 28 28 22 73 5f 22 2b 73 49 64 41 63 74  end(("s_"+sIdAct
3480: 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 5b 31 3a 5d  ion, sAction[1:]
3490: 29 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  )).            s
34a0: 41 63 74 69 6f 6e 20 3d 20 22 3d 73 5f 22 2b 73  Action = "=s_"+s
34b0: 49 64 41 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  IdAction.       
34c0: 20 65 6c 69 66 20 73 41 63 74 69 6f 6e 2e 73 74   elif sAction.st
34d0: 61 72 74 73 77 69 74 68 28 27 22 27 29 20 61 6e  artswith('"') an
34e0: 64 20 73 41 63 74 69 6f 6e 2e 65 6e 64 73 77 69  d sAction.endswi
34f0: 74 68 28 27 22 27 29 3a 0a 20 20 20 20 20 20 20  th('"'):.       
3500: 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73       sAction = s
3510: 41 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a 20 20 20  Action[1:-1].   
3520: 20 20 20 20 20 69 66 20 6e 6f 74 20 73 4d 73 67       if not sMsg
3530: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
3540: 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20  int("# Error in 
3550: 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 22  action at line "
3560: 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20 22   + sIdAction + "
3570: 3a 20 20 74 68 65 20 6d 65 73 73 61 67 65 20 69  :  the message i
3580: 73 20 65 6d 70 74 79 2e 22 29 0a 20 20 20 20 20  s empty.").     
3590: 20 20 20 72 65 74 75 72 6e 20 5b 73 43 6f 6e 64     return [sCond
35a0: 69 74 69 6f 6e 2c 20 63 41 63 74 69 6f 6e 2c 20  ition, cAction, 
35b0: 73 41 63 74 69 6f 6e 2c 20 69 47 72 6f 75 70 2c  sAction, iGroup,
35c0: 20 73 4d 73 67 2c 20 73 55 52 4c 5d 0a 20 20 20   sMsg, sURL].   
35d0: 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d   elif cAction ==
35e0: 20 22 7e 22 3a 0a 20 20 20 20 20 20 20 20 23 23   "~":.        ##
35f0: 20 74 65 78 74 20 70 72 6f 63 65 73 73 6f 72 0a   text processor.
3600: 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74 20 73          if not s
3610: 41 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20  Action:.        
3620: 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72 72      print("# Err
3630: 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61 74 20  or in action at 
3640: 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63 74 69  line " + sIdActi
3650: 6f 6e 20 2b 20 22 3a 20 20 54 68 69 73 20 61 63  on + ":  This ac
3660: 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 2e 22 29  tion is empty.")
3670: 0a 20 20 20 20 20 20 20 20 69 66 20 73 41 63 74  .        if sAct
3680: 69 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a  ion[0:1] == "=":
3690: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 46 55  .            lFU
36a0: 4e 43 54 49 4f 4e 53 2e 61 70 70 65 6e 64 28 28  NCTIONS.append((
36b0: 22 70 5f 22 2b 73 49 64 41 63 74 69 6f 6e 2c 20  "p_"+sIdAction, 
36c0: 73 41 63 74 69 6f 6e 5b 31 3a 5d 29 29 0a 20 20  sAction[1:])).  
36d0: 20 20 20 20 20 20 20 20 20 20 73 41 63 74 69 6f            sActio
36e0: 6e 20 3d 20 22 3d 70 5f 22 2b 73 49 64 41 63 74  n = "=p_"+sIdAct
36f0: 69 6f 6e 0a 20 20 20 20 20 20 20 20 65 6c 69 66  ion.        elif
3700: 20 73 41 63 74 69 6f 6e 2e 73 74 61 72 74 73 77   sAction.startsw
3710: 69 74 68 28 27 22 27 29 20 61 6e 64 20 73 41 63  ith('"') and sAc
3720: 74 69 6f 6e 2e 65 6e 64 73 77 69 74 68 28 27 22  tion.endswith('"
3730: 27 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  '):.            
3740: 73 41 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f  sAction = sActio
3750: 6e 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20  n[1:-1].        
3760: 72 65 74 75 72 6e 20 5b 73 43 6f 6e 64 69 74 69  return [sConditi
3770: 6f 6e 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41 63  on, cAction, sAc
3780: 74 69 6f 6e 2c 20 69 47 72 6f 75 70 5d 0a 20 20  tion, iGroup].  
3790: 20 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20 3d    elif cAction =
37a0: 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 23  = "=":.        #
37b0: 23 20 64 69 73 61 6d 62 69 67 75 61 74 6f 72 0a  # disambiguator.
37c0: 20 20 20 20 20 20 20 20 69 66 20 73 41 63 74 69          if sActi
37d0: 6f 6e 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a  on[0:1] == "=":.
37e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63 74              sAct
37f0: 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 5b 31 3a  ion = sAction[1:
3800: 5d 0a 20 20 20 20 20 20 20 20 69 66 20 6e 6f 74  ].        if not
3810: 20 73 41 63 74 69 6f 6e 3a 0a 20 20 20 20 20 20   sAction:.      
3820: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
3830: 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61  rror in action a
3840: 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63  t line " + sIdAc
3850: 74 69 6f 6e 20 2b 20 22 3a 20 20 54 68 69 73 20  tion + ":  This 
3860: 61 63 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 2e  action is empty.
3870: 22 29 0a 20 20 20 20 20 20 20 20 6c 46 55 4e 43  ").        lFUNC
3880: 54 49 4f 4e 53 2e 61 70 70 65 6e 64 28 28 22 64  TIONS.append(("d
3890: 5f 22 2b 73 49 64 41 63 74 69 6f 6e 2c 20 73 41  _"+sIdAction, sA
38a0: 63 74 69 6f 6e 29 29 0a 20 20 20 20 20 20 20 20  ction)).        
38b0: 73 41 63 74 69 6f 6e 20 3d 20 22 64 5f 22 2b 73  sAction = "d_"+s
38c0: 49 64 41 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  IdAction.       
38d0: 20 72 65 74 75 72 6e 20 5b 73 43 6f 6e 64 69 74   return [sCondit
38e0: 69 6f 6e 2c 20 63 41 63 74 69 6f 6e 2c 20 73 41  ion, cAction, sA
38f0: 63 74 69 6f 6e 5d 0a 20 20 20 20 65 6c 69 66 20  ction].    elif 
3900: 63 41 63 74 69 6f 6e 20 3d 3d 20 22 3e 22 3a 0a  cAction == ">":.
3910: 20 20 20 20 20 20 20 20 23 23 20 6e 6f 20 61 63          ## no ac
3920: 74 69 6f 6e 2c 20 62 72 65 61 6b 20 6c 6f 6f 70  tion, break loop
3930: 20 69 66 20 63 6f 6e 64 69 74 69 6f 6e 20 69 73   if condition is
3940: 20 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 72   False.        r
3950: 65 74 75 72 6e 20 5b 73 43 6f 6e 64 69 74 69 6f  eturn [sConditio
3960: 6e 2c 20 63 41 63 74 69 6f 6e 2c 20 22 22 5d 0a  n, cAction, ""].
3970: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
3980: 20 20 70 72 69 6e 74 28 22 23 20 55 6e 6b 6e 6f    print("# Unkno
3990: 77 6e 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e  wn action at lin
39a0: 65 20 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 29  e " + sIdAction)
39b0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
39c0: 4e 6f 6e 65 0a 0a 0a 64 65 66 20 5f 63 61 6c 63  None...def _calc
39d0: 52 75 6c 65 73 53 74 61 74 73 20 28 6c 52 75 6c  RulesStats (lRul
39e0: 65 73 29 3a 0a 20 20 20 20 64 20 3d 20 7b 27 3d  es):.    d = {'=
39f0: 27 3a 30 2c 20 27 7e 27 3a 20 30 2c 20 27 2d 27  ':0, '~': 0, '-'
3a00: 3a 20 30 2c 20 27 3e 27 3a 20 30 7d 0a 20 20 20  : 0, '>': 0}.   
3a10: 20 66 6f 72 20 61 52 75 6c 65 20 69 6e 20 6c 52   for aRule in lR
3a20: 75 6c 65 73 3a 0a 20 20 20 20 20 20 20 20 66 6f  ules:.        fo
3a30: 72 20 61 41 63 74 69 6f 6e 20 69 6e 20 61 52 75  r aAction in aRu
3a40: 6c 65 5b 36 5d 3a 0a 20 20 20 20 20 20 20 20 20  le[6]:.         
3a50: 20 20 20 64 5b 61 41 63 74 69 6f 6e 5b 31 5d 5d     d[aAction[1]]
3a60: 20 3d 20 64 5b 61 41 63 74 69 6f 6e 5b 31 5d 5d   = d[aAction[1]]
3a70: 20 2b 20 31 0a 20 20 20 20 72 65 74 75 72 6e 20   + 1.    return 
3a80: 28 64 2c 20 6c 65 6e 28 6c 52 75 6c 65 73 29 29  (d, len(lRules))
3a90: 0a 0a 0a 64 65 66 20 64 69 73 70 6c 61 79 53 74  ...def displaySt
3aa0: 61 74 73 20 28 6c 50 61 72 61 67 72 61 70 68 52  ats (lParagraphR
3ab0: 75 6c 65 73 2c 20 6c 53 65 6e 74 65 6e 63 65 52  ules, lSentenceR
3ac0: 75 6c 65 73 29 3a 0a 20 20 20 20 70 72 69 6e 74  ules):.    print
3ad0: 28 22 20 20 7b 3a 3e 31 38 7d 20 7b 3a 3e 31 38  ("  {:>18} {:>18
3ae0: 7d 20 7b 3a 3e 31 38 7d 20 7b 3a 3e 31 38 7d 22  } {:>18} {:>18}"
3af0: 2e 66 6f 72 6d 61 74 28 22 44 49 53 41 4d 42 49  .format("DISAMBI
3b00: 47 55 41 54 4f 52 22 2c 20 22 54 45 58 54 20 50  GUATOR", "TEXT P
3b10: 52 4f 43 45 53 53 4f 52 22 2c 20 22 47 52 41 4d  ROCESSOR", "GRAM
3b20: 4d 41 52 20 43 48 45 43 4b 49 4e 47 22 2c 20 22  MAR CHECKING", "
3b30: 52 45 47 45 58 22 29 29 0a 20 20 20 20 64 2c 20  REGEX")).    d, 
3b40: 6e 52 75 6c 65 20 3d 20 5f 63 61 6c 63 52 75 6c  nRule = _calcRul
3b50: 65 73 53 74 61 74 73 28 6c 50 61 72 61 67 72 61  esStats(lParagra
3b60: 70 68 52 75 6c 65 73 29 0a 20 20 20 20 70 72 69  phRules).    pri
3b70: 6e 74 28 22 c2 a7 20 7b 3a 3e 31 30 7d 20 61 63  nt(".. {:>10} ac
3b80: 74 69 6f 6e 73 20 7b 3a 3e 31 30 7d 20 61 63 74  tions {:>10} act
3b90: 69 6f 6e 73 20 7b 3a 3e 31 30 7d 20 61 63 74 69  ions {:>10} acti
3ba0: 6f 6e 73 20 20 69 6e 20 7b 3a 3e 38 7d 20 72 75  ons  in {:>8} ru
3bb0: 6c 65 73 22 2e 66 6f 72 6d 61 74 28 64 5b 27 3d  les".format(d['=
3bc0: 27 5d 2c 20 64 5b 27 7e 27 5d 2c 20 64 5b 27 2d  '], d['~'], d['-
3bd0: 27 5d 2c 20 6e 52 75 6c 65 29 29 0a 20 20 20 20  '], nRule)).    
3be0: 64 2c 20 6e 52 75 6c 65 20 3d 20 5f 63 61 6c 63  d, nRule = _calc
3bf0: 52 75 6c 65 73 53 74 61 74 73 28 6c 53 65 6e 74  RulesStats(lSent
3c00: 65 6e 63 65 52 75 6c 65 73 29 0a 20 20 20 20 70  enceRules).    p
3c10: 72 69 6e 74 28 22 73 20 7b 3a 3e 31 30 7d 20 61  rint("s {:>10} a
3c20: 63 74 69 6f 6e 73 20 7b 3a 3e 31 30 7d 20 61 63  ctions {:>10} ac
3c30: 74 69 6f 6e 73 20 7b 3a 3e 31 30 7d 20 61 63 74  tions {:>10} act
3c40: 69 6f 6e 73 20 20 69 6e 20 7b 3a 3e 38 7d 20 72  ions  in {:>8} r
3c50: 75 6c 65 73 22 2e 66 6f 72 6d 61 74 28 64 5b 27  ules".format(d['
3c60: 3d 27 5d 2c 20 64 5b 27 7e 27 5d 2c 20 64 5b 27  ='], d['~'], d['
3c70: 2d 27 5d 2c 20 6e 52 75 6c 65 29 29 0a 0a 0a 64  -'], nRule))...d
3c80: 65 66 20 6d 65 72 67 65 52 75 6c 65 73 42 79 4f  ef mergeRulesByO
3c90: 70 74 69 6f 6e 20 28 6c 52 75 6c 65 73 29 3a 0a  ption (lRules):.
3ca0: 20 20 20 20 22 72 65 74 75 72 6e 73 20 61 20 6c      "returns a l
3cb0: 69 73 74 20 6f 66 20 74 75 70 6c 65 73 20 5b 6f  ist of tuples [o
3cc0: 70 74 69 6f 6e 2c 20 6c 69 73 74 20 6f 66 20 72  ption, list of r
3cd0: 75 6c 65 73 5d 20 6b 65 65 70 69 6e 67 20 74 68  ules] keeping th
3ce0: 65 20 72 75 6c 65 73 20 6f 72 64 65 72 22 0a 20  e rules order". 
3cf0: 20 20 20 6c 46 69 6e 61 6c 20 3d 20 5b 5d 0a 20     lFinal = []. 
3d00: 20 20 20 6c 54 65 6d 70 20 3d 20 5b 5d 0a 20 20     lTemp = [].  
3d10: 20 20 73 4f 70 74 69 6f 6e 20 3d 20 4e 6f 6e 65    sOption = None
3d20: 0a 20 20 20 20 66 6f 72 20 61 52 75 6c 65 20 69  .    for aRule i
3d30: 6e 20 6c 52 75 6c 65 73 3a 0a 20 20 20 20 20 20  n lRules:.      
3d40: 20 20 69 66 20 61 52 75 6c 65 5b 30 5d 20 21 3d    if aRule[0] !=
3d50: 20 73 4f 70 74 69 6f 6e 3a 0a 20 20 20 20 20 20   sOption:.      
3d60: 20 20 20 20 20 20 69 66 20 73 4f 70 74 69 6f 6e        if sOption
3d70: 20 21 3d 20 4e 6f 6e 65 3a 0a 20 20 20 20 20 20   != None:.      
3d80: 20 20 20 20 20 20 20 20 20 20 6c 46 69 6e 61 6c            lFinal
3d90: 2e 61 70 70 65 6e 64 28 5b 73 4f 70 74 69 6f 6e  .append([sOption
3da0: 2c 20 6c 54 65 6d 70 5d 29 0a 20 20 20 20 20 20  , lTemp]).      
3db0: 20 20 20 20 20 20 23 20 6e 65 77 20 74 75 70 6c        # new tupl
3dc0: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 4f  e.            sO
3dd0: 70 74 69 6f 6e 20 3d 20 61 52 75 6c 65 5b 30 5d  ption = aRule[0]
3de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 54 65  .            lTe
3df0: 6d 70 20 3d 20 5b 5d 0a 20 20 20 20 20 20 20 20  mp = [].        
3e00: 6c 54 65 6d 70 2e 61 70 70 65 6e 64 28 61 52 75  lTemp.append(aRu
3e10: 6c 65 5b 31 3a 5d 29 0a 20 20 20 20 6c 46 69 6e  le[1:]).    lFin
3e20: 61 6c 2e 61 70 70 65 6e 64 28 5b 73 4f 70 74 69  al.append([sOpti
3e30: 6f 6e 2c 20 6c 54 65 6d 70 5d 29 0a 20 20 20 20  on, lTemp]).    
3e40: 72 65 74 75 72 6e 20 6c 46 69 6e 61 6c 0a 0a 0a  return lFinal...
3e50: 64 65 66 20 70 72 65 70 61 72 65 4f 70 74 69 6f  def prepareOptio
3e60: 6e 73 20 28 6c 4f 70 74 69 6f 6e 4c 69 6e 65 73  ns (lOptionLines
3e70: 29 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20  ):.    "returns 
3e80: 61 20 64 69 63 74 69 6f 6e 61 72 79 20 77 69 74  a dictionary wit
3e90: 68 20 64 61 74 61 20 61 62 6f 75 74 20 6f 70 74  h data about opt
3ea0: 69 6f 6e 73 22 0a 20 20 20 20 73 4c 61 6e 67 20  ions".    sLang 
3eb0: 3d 20 22 22 0a 20 20 20 20 73 44 65 66 61 75 6c  = "".    sDefaul
3ec0: 74 55 49 4c 61 6e 67 20 3d 20 22 22 0a 20 20 20  tUILang = "".   
3ed0: 20 6c 53 74 72 75 63 74 4f 70 74 20 3d 20 5b 5d   lStructOpt = []
3ee0: 0a 20 20 20 20 6c 4f 70 74 20 3d 20 5b 5d 0a 20  .    lOpt = []. 
3ef0: 20 20 20 64 4f 70 74 4c 61 62 65 6c 20 3d 20 7b     dOptLabel = {
3f00: 7d 0a 20 20 20 20 64 4f 70 74 50 72 69 6f 72 69  }.    dOptPriori
3f10: 74 79 20 3d 20 7b 7d 0a 20 20 20 20 66 6f 72 20  ty = {}.    for 
3f20: 73 4c 69 6e 65 20 69 6e 20 6c 4f 70 74 69 6f 6e  sLine in lOption
3f30: 4c 69 6e 65 73 3a 0a 20 20 20 20 20 20 20 20 73  Lines:.        s
3f40: 4c 69 6e 65 20 3d 20 73 4c 69 6e 65 2e 73 74 72  Line = sLine.str
3f50: 69 70 28 29 0a 20 20 20 20 20 20 20 20 69 66 20  ip().        if 
3f60: 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68  sLine.startswith
3f70: 28 22 4f 50 54 47 52 4f 55 50 2f 22 29 3a 0a 20  ("OPTGROUP/"):. 
3f80: 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20 72             m = r
3f90: 65 2e 6d 61 74 63 68 28 22 4f 50 54 47 52 4f 55  e.match("OPTGROU
3fa0: 50 2f 28 5b 61 2d 7a 30 2d 39 5d 2b 29 3a 28 2e  P/([a-z0-9]+):(.
3fb0: 2b 29 24 22 2c 20 73 4c 69 6e 65 29 0a 20 20 20  +)$", sLine).   
3fc0: 20 20 20 20 20 20 20 20 20 6c 53 74 72 75 63 74           lStruct
3fd0: 4f 70 74 2e 61 70 70 65 6e 64 28 20 28 6d 2e 67  Opt.append( (m.g
3fe0: 72 6f 75 70 28 31 29 2c 20 6c 69 73 74 28 6d 61  roup(1), list(ma
3ff0: 70 28 73 74 72 2e 73 70 6c 69 74 2c 20 6d 2e 67  p(str.split, m.g
4000: 72 6f 75 70 28 32 29 2e 73 70 6c 69 74 28 22 2c  roup(2).split(",
4010: 22 29 29 29 29 20 29 0a 20 20 20 20 20 20 20 20  ")))) ).        
4020: 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74  elif sLine.start
4030: 73 77 69 74 68 28 22 4f 50 54 53 4f 46 54 57 41  swith("OPTSOFTWA
4040: 52 45 3a 22 29 3a 0a 20 20 20 20 20 20 20 20 20  RE:"):.         
4050: 20 20 20 6c 4f 70 74 20 3d 20 5b 20 5b 73 2c 20     lOpt = [ [s, 
4060: 7b 7d 5d 20 20 66 6f 72 20 73 20 69 6e 20 73 4c  {}]  for s in sL
4070: 69 6e 65 5b 31 32 3a 5d 2e 73 74 72 69 70 28 29  ine[12:].strip()
4080: 2e 73 70 6c 69 74 28 29 20 5d 20 20 23 20 64 6f  .split() ]  # do
4090: 6e e2 80 99 74 20 75 73 65 20 74 75 70 6c 65 73  n...t use tuples
40a0: 20 28 73 2c 20 7b 7d 29 2c 20 62 65 63 61 75 73   (s, {}), becaus
40b0: 65 20 75 6e 6b 6e 6f 77 6e 20 74 6f 20 4a 53 0a  e unknown to JS.
40c0: 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69          elif sLi
40d0: 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 4f  ne.startswith("O
40e0: 50 54 2f 22 29 3a 0a 20 20 20 20 20 20 20 20 20  PT/"):.         
40f0: 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28     m = re.match(
4100: 22 4f 50 54 2f 28 5b 61 2d 7a 30 2d 39 5d 2b 29  "OPT/([a-z0-9]+)
4110: 3a 28 2e 2b 29 24 22 2c 20 73 4c 69 6e 65 29 0a  :(.+)$", sLine).
4120: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
4130: 69 2c 20 73 4f 70 74 20 69 6e 20 65 6e 75 6d 65  i, sOpt in enume
4140: 72 61 74 65 28 6d 2e 67 72 6f 75 70 28 32 29 2e  rate(m.group(2).
4150: 73 70 6c 69 74 28 29 29 3a 0a 20 20 20 20 20 20  split()):.      
4160: 20 20 20 20 20 20 20 20 20 20 6c 4f 70 74 5b 69            lOpt[i
4170: 5d 5b 31 5d 5b 6d 2e 67 72 6f 75 70 28 31 29 5d  ][1][m.group(1)]
4180: 20 3d 20 20 65 76 61 6c 28 73 4f 70 74 29 0a 20   =  eval(sOpt). 
4190: 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e         elif sLin
41a0: 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 4f 50  e.startswith("OP
41b0: 54 50 52 49 4f 52 49 54 59 2f 22 29 3a 0a 20 20  TPRIORITY/"):.  
41c0: 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20 72 65            m = re
41d0: 2e 6d 61 74 63 68 28 22 4f 50 54 50 52 49 4f 52  .match("OPTPRIOR
41e0: 49 54 59 2f 28 5b 61 2d 7a 30 2d 39 5d 2b 29 3a  ITY/([a-z0-9]+):
41f0: 20 2a 28 5b 30 2d 39 5d 29 24 22 2c 20 73 4c 69   *([0-9])$", sLi
4200: 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne).            
4210: 64 4f 70 74 50 72 69 6f 72 69 74 79 5b 6d 2e 67  dOptPriority[m.g
4220: 72 6f 75 70 28 31 29 5d 20 3d 20 69 6e 74 28 6d  roup(1)] = int(m
4230: 2e 67 72 6f 75 70 28 32 29 29 0a 20 20 20 20 20  .group(2)).     
4240: 20 20 20 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74     elif sLine.st
4250: 61 72 74 73 77 69 74 68 28 22 4f 50 54 4c 41 4e  artswith("OPTLAN
4260: 47 2f 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  G/"):.          
4270: 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28 22    m = re.match("
4280: 4f 50 54 4c 41 4e 47 2f 28 5b 61 2d 7a 5d 5b 61  OPTLANG/([a-z][a
4290: 2d 7a 5d 28 3f 3a 5f 5b 41 2d 5a 5d 5b 41 2d 5a  -z](?:_[A-Z][A-Z
42a0: 5d 7c 29 29 3a 28 2e 2b 29 24 22 2c 20 73 4c 69  ]|)):(.+)$", sLi
42b0: 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ne).            
42c0: 73 4c 61 6e 67 20 3d 20 6d 2e 67 72 6f 75 70 28  sLang = m.group(
42d0: 31 29 5b 3a 32 5d 0a 20 20 20 20 20 20 20 20 20  1)[:2].         
42e0: 20 20 20 64 4f 70 74 4c 61 62 65 6c 5b 73 4c 61     dOptLabel[sLa
42f0: 6e 67 5d 20 3d 20 7b 20 22 5f 5f 6f 70 74 69 6f  ng] = { "__optio
4300: 6e 74 69 74 6c 65 5f 5f 22 3a 20 6d 2e 67 72 6f  ntitle__": m.gro
4310: 75 70 28 32 29 2e 73 74 72 69 70 28 29 20 7d 0a  up(2).strip() }.
4320: 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69          elif sLi
4330: 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 4f  ne.startswith("O
4340: 50 54 44 45 46 41 55 4c 54 55 49 4c 41 4e 47 3a  PTDEFAULTUILANG:
4350: 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  "):.            
4360: 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28 22 4f 50  m = re.match("OP
4370: 54 44 45 46 41 55 4c 54 55 49 4c 41 4e 47 3a 20  TDEFAULTUILANG: 
4380: 2a 28 5b 61 2d 7a 5d 5b 61 2d 7a 5d 28 3f 3a 5f  *([a-z][a-z](?:_
4390: 5b 41 2d 5a 5d 5b 41 2d 5a 5d 7c 29 29 24 22 2c  [A-Z][A-Z]|))$",
43a0: 20 73 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20   sLine).        
43b0: 20 20 20 20 73 44 65 66 61 75 6c 74 55 49 4c 61      sDefaultUILa
43c0: 6e 67 20 3d 20 6d 2e 67 72 6f 75 70 28 31 29 5b  ng = m.group(1)[
43d0: 3a 32 5d 0a 20 20 20 20 20 20 20 20 65 6c 69 66  :2].        elif
43e0: 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74   sLine.startswit
43f0: 68 28 22 4f 50 54 4c 41 42 45 4c 2f 22 29 3a 0a  h("OPTLABEL/"):.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20              m = 
4410: 72 65 2e 6d 61 74 63 68 28 22 4f 50 54 4c 41 42  re.match("OPTLAB
4420: 45 4c 2f 28 5b 61 2d 7a 30 2d 39 5d 2b 29 3a 28  EL/([a-z0-9]+):(
4430: 2e 2b 29 24 22 2c 20 73 4c 69 6e 65 29 0a 20 20  .+)$", sLine).  
4440: 20 20 20 20 20 20 20 20 20 20 64 4f 70 74 4c 61            dOptLa
4450: 62 65 6c 5b 73 4c 61 6e 67 5d 5b 6d 2e 67 72 6f  bel[sLang][m.gro
4460: 75 70 28 31 29 5d 20 3d 20 6c 69 73 74 28 6d 61  up(1)] = list(ma
4470: 70 28 73 74 72 2e 73 74 72 69 70 2c 20 6d 2e 67  p(str.strip, m.g
4480: 72 6f 75 70 28 32 29 2e 73 70 6c 69 74 28 22 7c  roup(2).split("|
4490: 22 29 29 29 20 20 69 66 20 22 7c 22 20 69 6e 20  ")))  if "|" in 
44a0: 6d 2e 67 72 6f 75 70 28 32 29 20 20 65 6c 73 65  m.group(2)  else
44b0: 20 20 5b 6d 2e 67 72 6f 75 70 28 32 29 2e 73 74    [m.group(2).st
44c0: 72 69 70 28 29 2c 20 22 22 5d 0a 20 20 20 20 20  rip(), ""].     
44d0: 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20     else:.       
44e0: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72       print("# Er
44f0: 72 6f 72 2e 20 57 72 6f 6e 67 20 6f 70 74 69 6f  ror. Wrong optio
4500: 6e 20 6c 69 6e 65 20 69 6e 3a 5c 6e 20 20 22 29  n line in:\n  ")
4510: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
4520: 6e 74 28 73 4c 69 6e 65 29 0a 20 20 20 20 70 72  nt(sLine).    pr
4530: 69 6e 74 28 22 20 20 6f 70 74 69 6f 6e 73 20 64  int("  options d
4540: 65 66 69 6e 65 64 20 66 6f 72 3a 20 22 20 2b 20  efined for: " + 
4550: 22 2c 20 22 2e 6a 6f 69 6e 28 5b 20 74 5b 30 5d  ", ".join([ t[0]
4560: 20 66 6f 72 20 74 20 69 6e 20 6c 4f 70 74 20 5d   for t in lOpt ]
4570: 29 29 0a 20 20 20 20 64 4f 70 74 69 6f 6e 73 20  )).    dOptions 
4580: 3d 20 7b 20 22 6c 53 74 72 75 63 74 4f 70 74 22  = { "lStructOpt"
4590: 3a 20 6c 53 74 72 75 63 74 4f 70 74 2c 20 22 64  : lStructOpt, "d
45a0: 4f 70 74 4c 61 62 65 6c 22 3a 20 64 4f 70 74 4c  OptLabel": dOptL
45b0: 61 62 65 6c 2c 20 22 73 44 65 66 61 75 6c 74 55  abel, "sDefaultU
45c0: 49 4c 61 6e 67 22 3a 20 73 44 65 66 61 75 6c 74  ILang": sDefault
45d0: 55 49 4c 61 6e 67 20 7d 0a 20 20 20 20 64 4f 70  UILang }.    dOp
45e0: 74 69 6f 6e 73 2e 75 70 64 61 74 65 28 7b 20 22  tions.update({ "
45f0: 64 4f 70 74 22 2b 6b 3a 20 76 20 20 66 6f 72 20  dOpt"+k: v  for 
4600: 6b 2c 20 76 20 69 6e 20 6c 4f 70 74 20 7d 29 0a  k, v in lOpt }).
4610: 20 20 20 20 72 65 74 75 72 6e 20 64 4f 70 74 69      return dOpti
4620: 6f 6e 73 2c 20 64 4f 70 74 50 72 69 6f 72 69 74  ons, dOptPriorit
4630: 79 0a 0a 0a 64 65 66 20 70 72 69 6e 74 42 6f 6f  y...def printBoo
4640: 6b 6d 61 72 6b 20 28 6e 4c 65 76 65 6c 2c 20 73  kmark (nLevel, s
4650: 43 6f 6d 6d 65 6e 74 2c 20 6e 4c 69 6e 65 29 3a  Comment, nLine):
4660: 0a 20 20 20 20 70 72 69 6e 74 28 22 20 20 7b 3a  .    print("  {:
4670: 3e 36 7d 3a 20 20 7b 7d 22 2e 66 6f 72 6d 61 74  >6}:  {}".format
4680: 28 6e 4c 69 6e 65 2c 20 22 20 20 22 20 2a 20 6e  (nLine, "  " * n
4690: 4c 65 76 65 6c 20 2b 20 73 43 6f 6d 6d 65 6e 74  Level + sComment
46a0: 29 29 0a 0a 0a 64 65 66 20 6d 61 6b 65 20 28 6c  ))...def make (l
46b0: 52 75 6c 65 73 2c 20 73 4c 61 6e 67 2c 20 62 4a  Rules, sLang, bJ
46c0: 61 76 61 53 63 72 69 70 74 29 3a 0a 20 20 20 20  avaScript):.    
46d0: 22 63 6f 6d 70 69 6c 65 20 72 75 6c 65 73 2c 20  "compile rules, 
46e0: 72 65 74 75 72 6e 73 20 61 20 64 69 63 74 69 6f  returns a dictio
46f0: 6e 61 72 79 20 6f 66 20 76 61 6c 75 65 73 22 0a  nary of values".
4700: 20 20 20 20 23 20 66 6f 72 20 63 6c 61 72 69 74      # for clarit
4710: 79 20 70 75 72 70 6f 73 65 2c 20 64 6f 6e e2 80  y purpose, don..
4720: 99 74 20 63 72 65 61 74 65 20 61 6e 79 20 66 69  .t create any fi
4730: 6c 65 20 68 65 72 65 0a 0a 20 20 20 20 23 20 72  le here..    # r
4740: 65 6d 6f 76 69 6e 67 20 63 6f 6d 6d 65 6e 74 73  emoving comments
4750: 2c 20 7a 65 72 6f 69 6e 67 20 65 6d 70 74 79 20  , zeroing empty 
4760: 6c 69 6e 65 73 2c 20 63 72 65 61 74 69 6e 67 20  lines, creating 
4770: 64 65 66 69 6e 69 74 69 6f 6e 73 2c 20 73 74 6f  definitions, sto
4780: 72 69 6e 67 20 74 65 73 74 73 2c 20 6d 65 72 67  ring tests, merg
4790: 69 6e 67 20 72 75 6c 65 20 6c 69 6e 65 73 0a 20  ing rule lines. 
47a0: 20 20 20 70 72 69 6e 74 28 22 20 20 70 61 72 73     print("  pars
47b0: 69 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29 0a 20  ing rules..."). 
47c0: 20 20 20 67 6c 6f 62 61 6c 20 64 44 45 46 0a 20     global dDEF. 
47d0: 20 20 20 6c 4c 69 6e 65 20 3d 20 5b 5d 0a 20 20     lLine = [].  
47e0: 20 20 6c 52 75 6c 65 4c 69 6e 65 20 3d 20 5b 5d    lRuleLine = []
47f0: 0a 20 20 20 20 6c 54 65 73 74 20 3d 20 5b 5d 0a  .    lTest = [].
4800: 20 20 20 20 6c 4f 70 74 20 3d 20 5b 5d 0a 20 20      lOpt = [].  
4810: 20 20 7a 42 6f 6f 6b 6d 61 72 6b 20 3d 20 72 65    zBookmark = re
4820: 2e 63 6f 6d 70 69 6c 65 28 22 5e 21 21 2b 22 29  .compile("^!!+")
4830: 0a 0a 20 20 20 20 66 6f 72 20 69 2c 20 73 4c 69  ..    for i, sLi
4840: 6e 65 20 69 6e 20 65 6e 75 6d 65 72 61 74 65 28  ne in enumerate(
4850: 6c 52 75 6c 65 73 2c 20 31 29 3a 0a 20 20 20 20  lRules, 1):.    
4860: 20 20 20 20 69 66 20 73 4c 69 6e 65 2e 73 74 61      if sLine.sta
4870: 72 74 73 77 69 74 68 28 27 23 45 4e 44 27 29 3a  rtswith('#END'):
4880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
4890: 6e 74 42 6f 6f 6b 6d 61 72 6b 28 30 2c 20 22 42  ntBookmark(0, "B
48a0: 52 45 41 4b 20 42 59 20 23 45 4e 44 22 2c 20 69  REAK BY #END", i
48b0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ).            br
48c0: 65 61 6b 0a 20 20 20 20 20 20 20 20 65 6c 69 66  eak.        elif
48d0: 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74   sLine.startswit
48e0: 68 28 22 23 22 29 3a 0a 20 20 20 20 20 20 20 20  h("#"):.        
48f0: 20 20 20 20 70 61 73 73 0a 20 20 20 20 20 20 20      pass.       
4900: 20 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72   elif sLine.star
4910: 74 73 77 69 74 68 28 22 44 45 46 3a 22 29 3a 0a  tswith("DEF:"):.
4920: 20 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20              m = 
4930: 72 65 2e 6d 61 74 63 68 28 22 44 45 46 3a 20 2b  re.match("DEF: +
4940: 28 5b 61 2d 7a 41 2d 5a 5f 5d 5b 61 2d 7a 41 2d  ([a-zA-Z_][a-zA-
4950: 5a 5f 30 2d 39 5d 2a 29 20 2b 28 2e 2b 29 24 22  Z_0-9]*) +(.+)$"
4960: 2c 20 73 4c 69 6e 65 2e 73 74 72 69 70 28 29 29  , sLine.strip())
4970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
4980: 6d 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  m:.             
4990: 20 20 20 64 44 45 46 5b 22 7b 22 2b 6d 2e 67 72     dDEF["{"+m.gr
49a0: 6f 75 70 28 31 29 2b 22 7d 22 5d 20 3d 20 6d 2e  oup(1)+"}"] = m.
49b0: 67 72 6f 75 70 28 32 29 0a 20 20 20 20 20 20 20  group(2).       
49c0: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
49d0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
49e0: 28 22 45 72 72 6f 72 20 69 6e 20 64 65 66 69 6e  ("Error in defin
49f0: 69 74 69 6f 6e 3a 20 22 2c 20 65 6e 64 3d 22 22  ition: ", end=""
4a00: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
4a10: 20 20 70 72 69 6e 74 28 73 4c 69 6e 65 2e 73 74    print(sLine.st
4a20: 72 69 70 28 29 29 0a 20 20 20 20 20 20 20 20 65  rip()).        e
4a30: 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73  lif sLine.starts
4a40: 77 69 74 68 28 22 54 45 53 54 3a 22 29 3a 0a 20  with("TEST:"):. 
4a50: 20 20 20 20 20 20 20 20 20 20 20 6c 54 65 73 74             lTest
4a60: 2e 61 70 70 65 6e 64 28 22 7b 3a 3c 38 7d 22 2e  .append("{:<8}".
4a70: 66 6f 72 6d 61 74 28 69 29 20 2b 20 22 20 20 22  format(i) + "  "
4a80: 20 2b 20 73 4c 69 6e 65 5b 35 3a 5d 2e 73 74 72   + sLine[5:].str
4a90: 69 70 28 29 29 0a 20 20 20 20 20 20 20 20 65 6c  ip()).        el
4aa0: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
4ab0: 69 74 68 28 22 54 4f 44 4f 3a 22 29 3a 0a 20 20  ith("TODO:"):.  
4ac0: 20 20 20 20 20 20 20 20 20 20 70 61 73 73 0a 20            pass. 
4ad0: 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e         elif sLin
4ae0: 65 2e 73 74 61 72 74 73 77 69 74 68 28 28 22 4f  e.startswith(("O
4af0: 50 54 47 52 4f 55 50 2f 22 2c 20 22 4f 50 54 53  PTGROUP/", "OPTS
4b00: 4f 46 54 57 41 52 45 3a 22 2c 20 22 4f 50 54 2f  OFTWARE:", "OPT/
4b10: 22 2c 20 22 4f 50 54 4c 41 4e 47 2f 22 2c 20 22  ", "OPTLANG/", "
4b20: 4f 50 54 44 45 46 41 55 4c 54 55 49 4c 41 4e 47  OPTDEFAULTUILANG
4b30: 3a 22 2c 20 22 4f 50 54 4c 41 42 45 4c 2f 22 2c  :", "OPTLABEL/",
4b40: 20 22 4f 50 54 50 52 49 4f 52 49 54 59 2f 22 29   "OPTPRIORITY/")
4b50: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ):.            l
4b60: 4f 70 74 2e 61 70 70 65 6e 64 28 73 4c 69 6e 65  Opt.append(sLine
4b70: 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 72  ).        elif r
4b80: 65 2e 6d 61 74 63 68 28 22 5b 20 c2 a0 5c 74 5d  e.match("[ ..\t]
4b90: 2a 24 22 2c 20 73 4c 69 6e 65 29 3a 0a 20 20 20  *$", sLine):.   
4ba0: 20 20 20 20 20 20 20 20 20 70 61 73 73 0a 20 20           pass.  
4bb0: 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65        elif sLine
4bc0: 2e 73 74 61 72 74 73 77 69 74 68 28 22 21 21 22  .startswith("!!"
4bd0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ):.            m
4be0: 20 3d 20 7a 42 6f 6f 6b 6d 61 72 6b 2e 73 65 61   = zBookmark.sea
4bf0: 72 63 68 28 73 4c 69 6e 65 29 0a 20 20 20 20 20  rch(sLine).     
4c00: 20 20 20 20 20 20 20 6e 45 78 4d 6b 20 3d 20 6c         nExMk = l
4c10: 65 6e 28 6d 2e 67 72 6f 75 70 28 30 29 29 0a 20  en(m.group(0)). 
4c20: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73 4c             if sL
4c30: 69 6e 65 5b 6e 45 78 4d 6b 3a 5d 2e 73 74 72 69  ine[nExMk:].stri
4c40: 70 28 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  p():.           
4c50: 20 20 20 20 20 70 72 69 6e 74 42 6f 6f 6b 6d 61       printBookma
4c60: 72 6b 28 6e 45 78 4d 6b 2d 32 2c 20 73 4c 69 6e  rk(nExMk-2, sLin
4c70: 65 5b 6e 45 78 4d 6b 3a 5d 2e 73 74 72 69 70 28  e[nExMk:].strip(
4c80: 29 2c 20 69 29 0a 20 20 20 20 20 20 20 20 65 6c  ), i).        el
4c90: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
4ca0: 69 74 68 28 28 22 20 20 20 20 22 2c 20 22 5c 74  ith(("    ", "\t
4cb0: 22 29 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ")):.           
4cc0: 20 6c 52 75 6c 65 4c 69 6e 65 5b 6c 65 6e 28 6c   lRuleLine[len(l
4cd0: 52 75 6c 65 4c 69 6e 65 29 2d 31 5d 5b 31 5d 20  RuleLine)-1][1] 
4ce0: 2b 3d 20 22 20 22 20 2b 20 73 4c 69 6e 65 2e 73  += " " + sLine.s
4cf0: 74 72 69 70 28 29 0a 20 20 20 20 20 20 20 20 65  trip().        e
4d00: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
4d10: 20 6c 52 75 6c 65 4c 69 6e 65 2e 61 70 70 65 6e   lRuleLine.appen
4d20: 64 28 5b 69 2c 20 73 4c 69 6e 65 2e 73 74 72 69  d([i, sLine.stri
4d30: 70 28 29 5d 29 0a 0a 20 20 20 20 23 20 67 65 6e  p()])..    # gen
4d40: 65 72 61 74 69 6e 67 20 6f 70 74 69 6f 6e 73 20  erating options 
4d50: 66 69 6c 65 73 0a 20 20 20 20 70 72 69 6e 74 28  files.    print(
4d60: 22 20 20 70 61 72 73 69 6e 67 20 6f 70 74 69 6f  "  parsing optio
4d70: 6e 73 2e 2e 2e 22 29 0a 20 20 20 20 74 72 79 3a  ns...").    try:
4d80: 0a 20 20 20 20 20 20 20 20 64 4f 70 74 69 6f 6e  .        dOption
4d90: 73 2c 20 64 4f 70 74 50 72 69 6f 72 69 74 79 20  s, dOptPriority 
4da0: 3d 20 70 72 65 70 61 72 65 4f 70 74 69 6f 6e 73  = prepareOptions
4db0: 28 6c 4f 70 74 29 0a 20 20 20 20 65 78 63 65 70  (lOpt).    excep
4dc0: 74 3a 0a 20 20 20 20 20 20 20 20 74 72 61 63 65  t:.        trace
4dd0: 62 61 63 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29  back.print_exc()
4de0: 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 29 0a  .        exit().
4df0: 0a 20 20 20 20 23 20 74 65 73 74 73 0a 20 20 20  .    # tests.   
4e00: 20 70 72 69 6e 74 28 22 20 20 6c 69 73 74 20 74   print("  list t
4e10: 65 73 74 73 2e 2e 2e 22 29 0a 20 20 20 20 73 47  ests...").    sG
4e20: 43 54 65 73 74 73 20 3d 20 22 5c 6e 22 2e 6a 6f  CTests = "\n".jo
4e30: 69 6e 28 6c 54 65 73 74 29 0a 20 20 20 20 73 47  in(lTest).    sG
4e40: 43 54 65 73 74 73 4a 53 20 3d 20 27 7b 20 22 61  CTestsJS = '{ "a
4e50: 44 61 74 61 22 3a 20 27 20 2b 20 6a 73 6f 6e 2e  Data": ' + json.
4e60: 64 75 6d 70 73 28 6c 54 65 73 74 2c 20 65 6e 73  dumps(lTest, ens
4e70: 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29  ure_ascii=False)
4e80: 20 2b 20 22 20 7d 5c 6e 22 0a 0a 20 20 20 20 23   + " }\n"..    #
4e90: 20 70 72 6f 63 65 73 73 69 6e 67 0a 20 20 20 20   processing.    
4ea0: 70 72 69 6e 74 28 22 20 20 70 72 65 70 61 72 69  print("  prepari
4eb0: 6e 67 20 72 75 6c 65 73 2e 2e 2e 22 29 0a 20 20  ng rules...").  
4ec0: 20 20 62 50 61 72 61 67 72 61 70 68 20 3d 20 54    bParagraph = T
4ed0: 72 75 65 0a 20 20 20 20 6c 50 61 72 61 67 72 61  rue.    lParagra
4ee0: 70 68 52 75 6c 65 73 20 3d 20 5b 5d 0a 20 20 20  phRules = [].   
4ef0: 20 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65 73 20   lSentenceRules 
4f00: 3d 20 5b 5d 0a 20 20 20 20 6c 50 61 72 61 67 72  = [].    lParagr
4f10: 61 70 68 52 75 6c 65 73 4a 53 20 3d 20 5b 5d 0a  aphRulesJS = [].
4f20: 20 20 20 20 6c 53 65 6e 74 65 6e 63 65 52 75 6c      lSentenceRul
4f30: 65 73 4a 53 20 3d 20 5b 5d 0a 0a 20 20 20 20 66  esJS = []..    f
4f40: 6f 72 20 6e 4c 69 6e 65 2c 20 73 4c 69 6e 65 20  or nLine, sLine 
4f50: 69 6e 20 6c 52 75 6c 65 4c 69 6e 65 3a 0a 20 20  in lRuleLine:.  
4f60: 20 20 20 20 20 20 69 66 20 73 4c 69 6e 65 3a 0a        if sLine:.
4f70: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 73              if s
4f80: 4c 69 6e 65 20 3d 3d 20 22 5b 2b 2b 5d 22 3a 0a  Line == "[++]":.
4f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4fa0: 62 50 61 72 61 67 72 61 70 68 20 3d 20 46 61 6c  bParagraph = Fal
4fb0: 73 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 65  se.            e
4fc0: 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20  lse:.           
4fd0: 20 20 20 20 20 61 52 75 6c 65 20 3d 20 63 72 65       aRule = cre
4fe0: 61 74 65 52 75 6c 65 28 73 4c 69 6e 65 2c 20 6e  ateRule(sLine, n
4ff0: 4c 69 6e 65 2c 20 73 4c 61 6e 67 2c 20 62 50 61  Line, sLang, bPa
5000: 72 61 67 72 61 70 68 2c 20 64 4f 70 74 50 72 69  ragraph, dOptPri
5010: 6f 72 69 74 79 29 0a 20 20 20 20 20 20 20 20 20  ority).         
5020: 20 20 20 20 20 20 20 69 66 20 61 52 75 6c 65 3a         if aRule:
5030: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5040: 20 20 20 20 20 69 66 20 62 50 61 72 61 67 72 61       if bParagra
5050: 70 68 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ph:.            
5060: 20 20 20 20 20 20 20 20 20 20 20 20 6c 50 61 72              lPar
5070: 61 67 72 61 70 68 52 75 6c 65 73 2e 61 70 70 65  agraphRules.appe
5080: 6e 64 28 61 52 75 6c 65 29 0a 20 20 20 20 20 20  nd(aRule).      
5090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50a0: 20 20 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65    lParagraphRule
50b0: 73 4a 53 2e 61 70 70 65 6e 64 28 6a 73 63 6f 6e  sJS.append(jscon
50c0: 76 2e 70 79 52 75 6c 65 54 6f 4a 53 28 61 52 75  v.pyRuleToJS(aRu
50d0: 6c 65 2c 20 64 4a 53 52 45 47 45 58 45 53 2c 20  le, dJSREGEXES, 
50e0: 73 57 4f 52 44 4c 49 4d 49 54 4c 45 46 54 29 29  sWORDLIMITLEFT))
50f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5100: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
5110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5120: 20 20 20 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65     lSentenceRule
5130: 73 2e 61 70 70 65 6e 64 28 61 52 75 6c 65 29 0a  s.append(aRule).
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5150: 20 20 20 20 20 20 20 20 6c 53 65 6e 74 65 6e 63          lSentenc
5160: 65 52 75 6c 65 73 4a 53 2e 61 70 70 65 6e 64 28  eRulesJS.append(
5170: 6a 73 63 6f 6e 76 2e 70 79 52 75 6c 65 54 6f 4a  jsconv.pyRuleToJ
5180: 53 28 61 52 75 6c 65 2c 20 64 4a 53 52 45 47 45  S(aRule, dJSREGE
5190: 58 45 53 2c 20 73 57 4f 52 44 4c 49 4d 49 54 4c  XES, sWORDLIMITL
51a0: 45 46 54 29 29 0a 0a 20 20 20 20 23 20 63 72 65  EFT))..    # cre
51b0: 61 74 69 6e 67 20 66 69 6c 65 20 77 69 74 68 20  ating file with 
51c0: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 63 61  all functions ca
51d0: 6c 6c 61 62 6c 65 20 62 79 20 72 75 6c 65 73 0a  llable by rules.
51e0: 20 20 20 20 70 72 69 6e 74 28 22 20 20 63 72 65      print("  cre
51f0: 61 74 69 6e 67 20 63 61 6c 6c 61 62 6c 65 73 2e  ating callables.
5200: 2e 2e 22 29 0a 20 20 20 20 73 50 79 43 61 6c 6c  ..").    sPyCall
5210: 61 62 6c 65 73 20 3d 20 22 23 20 67 65 6e 65 72  ables = "# gener
5220: 61 74 65 64 20 63 6f 64 65 2c 20 64 6f 20 6e 6f  ated code, do no
5230: 74 20 65 64 69 74 5c 6e 22 0a 20 20 20 20 73 4a  t edit\n".    sJ
5240: 53 43 61 6c 6c 61 62 6c 65 73 20 3d 20 22 2f 2f  SCallables = "//
5250: 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64 65 2c   generated code,
5260: 20 64 6f 20 6e 6f 74 20 65 64 69 74 5c 6e 63 6f   do not edit\nco
5270: 6e 73 74 20 6f 45 76 61 6c 46 75 6e 63 20 3d 20  nst oEvalFunc = 
5280: 7b 5c 6e 22 0a 20 20 20 20 66 6f 72 20 73 46 75  {\n".    for sFu
5290: 6e 63 4e 61 6d 65 2c 20 73 52 65 74 75 72 6e 20  ncName, sReturn 
52a0: 69 6e 20 6c 46 55 4e 43 54 49 4f 4e 53 3a 0a 20  in lFUNCTIONS:. 
52b0: 20 20 20 20 20 20 20 63 54 79 70 65 20 3d 20 73         cType = s
52c0: 46 75 6e 63 4e 61 6d 65 5b 30 3a 31 5d 0a 20 20  FuncName[0:1].  
52d0: 20 20 20 20 20 20 69 66 20 63 54 79 70 65 20 3d        if cType =
52e0: 3d 20 22 63 22 3a 20 23 20 63 6f 6e 64 69 74 69  = "c": # conditi
52f0: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  on.            s
5300: 50 61 72 61 6d 73 20 3d 20 22 73 2c 20 73 78 2c  Params = "s, sx,
5310: 20 6d 2c 20 64 44 41 2c 20 73 43 6f 75 6e 74 72   m, dDA, sCountr
5320: 79 2c 20 62 43 6f 6e 64 4d 65 6d 6f 22 0a 20 20  y, bCondMemo".  
5330: 20 20 20 20 20 20 65 6c 69 66 20 63 54 79 70 65        elif cType
5340: 20 3d 3d 20 22 6d 22 3a 20 23 20 6d 65 73 73 61   == "m": # messa
5350: 67 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ge.            s
5360: 50 61 72 61 6d 73 20 3d 20 22 73 2c 20 6d 22 0a  Params = "s, m".
5370: 20 20 20 20 20 20 20 20 65 6c 69 66 20 63 54 79          elif cTy
5380: 70 65 20 3d 3d 20 22 73 22 3a 20 23 20 73 75 67  pe == "s": # sug
5390: 67 65 73 74 69 6f 6e 0a 20 20 20 20 20 20 20 20  gestion.        
53a0: 20 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 73      sParams = "s
53b0: 2c 20 6d 22 0a 20 20 20 20 20 20 20 20 65 6c 69  , m".        eli
53c0: 66 20 63 54 79 70 65 20 3d 3d 20 22 70 22 3a 20  f cType == "p": 
53d0: 23 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  # preprocessor. 
53e0: 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72 61             sPara
53f0: 6d 73 20 3d 20 22 73 2c 20 6d 22 0a 20 20 20 20  ms = "s, m".    
5400: 20 20 20 20 65 6c 69 66 20 63 54 79 70 65 20 3d      elif cType =
5410: 3d 20 22 64 22 3a 20 23 20 64 69 73 61 6d 62 69  = "d": # disambi
5420: 67 75 61 74 6f 72 0a 20 20 20 20 20 20 20 20 20  guator.         
5430: 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 73 2c     sParams = "s,
5440: 20 6d 2c 20 64 44 41 22 0a 20 20 20 20 20 20 20   m, dDA".       
5450: 20 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20   else:.         
5460: 20 20 20 70 72 69 6e 74 28 22 23 20 55 6e 6b 6e     print("# Unkn
5470: 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 20 74 79 70  own function typ
5480: 65 20 69 6e 20 5b 22 20 2b 20 73 46 75 6e 63 4e  e in [" + sFuncN
5490: 61 6d 65 20 2b 20 22 5d 22 29 0a 20 20 20 20 20  ame + "]").     
54a0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a         continue.
54b0: 20 20 20 20 20 20 20 20 73 50 79 43 61 6c 6c 61          sPyCalla
54c0: 62 6c 65 73 20 2b 3d 20 22 64 65 66 20 7b 7d 20  bles += "def {} 
54d0: 28 7b 7d 29 3a 5c 6e 22 2e 66 6f 72 6d 61 74 28  ({}):\n".format(
54e0: 73 46 75 6e 63 4e 61 6d 65 2c 20 73 50 61 72 61  sFuncName, sPara
54f0: 6d 73 29 0a 20 20 20 20 20 20 20 20 73 50 79 43  ms).        sPyC
5500: 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22 20 20 20  allables += "   
5510: 20 72 65 74 75 72 6e 20 22 20 2b 20 73 52 65 74   return " + sRet
5520: 75 72 6e 20 2b 20 22 5c 6e 22 0a 20 20 20 20 20  urn + "\n".     
5530: 20 20 20 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20     sJSCallables 
5540: 2b 3d 20 22 20 20 20 20 7b 7d 3a 20 66 75 6e 63  += "    {}: func
5550: 74 69 6f 6e 20 28 7b 7d 29 22 2e 66 6f 72 6d 61  tion ({})".forma
5560: 74 28 73 46 75 6e 63 4e 61 6d 65 2c 20 73 50 61  t(sFuncName, sPa
5570: 72 61 6d 73 29 20 2b 20 22 20 7b 5c 6e 22 0a 20  rams) + " {\n". 
5580: 20 20 20 20 20 20 20 73 4a 53 43 61 6c 6c 61 62         sJSCallab
5590: 6c 65 73 20 2b 3d 20 22 20 20 20 20 20 20 20 20  les += "        
55a0: 72 65 74 75 72 6e 20 22 20 2b 20 6a 73 63 6f 6e  return " + jscon
55b0: 76 2e 70 79 32 6a 73 28 73 52 65 74 75 72 6e 29  v.py2js(sReturn)
55c0: 20 2b 20 22 3b 5c 6e 22 0a 20 20 20 20 20 20 20   + ";\n".       
55d0: 20 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20 2b 3d   sJSCallables +=
55e0: 20 22 20 20 20 20 7d 2c 5c 6e 22 0a 20 20 20 20   "    },\n".    
55f0: 73 4a 53 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20  sJSCallables += 
5600: 22 7d 5c 6e 22 0a 0a 20 20 20 20 64 69 73 70 6c  "}\n"..    displ
5610: 61 79 53 74 61 74 73 28 6c 50 61 72 61 67 72 61  ayStats(lParagra
5620: 70 68 52 75 6c 65 73 2c 20 6c 53 65 6e 74 65 6e  phRules, lSenten
5630: 63 65 52 75 6c 65 73 29 0a 0a 20 20 20 20 70 72  ceRules)..    pr
5640: 69 6e 74 28 22 55 6e 6e 61 6d 65 64 20 72 75 6c  int("Unnamed rul
5650: 65 73 3a 20 22 20 2b 20 73 74 72 28 6e 52 55 4c  es: " + str(nRUL
5660: 45 57 49 54 48 4f 55 54 4e 41 4d 45 29 29 0a 0a  EWITHOUTNAME))..
5670: 20 20 20 20 64 20 3d 20 7b 20 22 63 61 6c 6c 61      d = { "calla
5680: 62 6c 65 73 22 3a 20 73 50 79 43 61 6c 6c 61 62  bles": sPyCallab
5690: 6c 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 22  les,.          "
56a0: 63 61 6c 6c 61 62 6c 65 73 4a 53 22 3a 20 73 4a  callablesJS": sJ
56b0: 53 43 61 6c 6c 61 62 6c 65 73 2c 0a 20 20 20 20  SCallables,.    
56c0: 20 20 20 20 20 20 22 67 63 74 65 73 74 73 22 3a        "gctests":
56d0: 20 73 47 43 54 65 73 74 73 2c 0a 20 20 20 20 20   sGCTests,.     
56e0: 20 20 20 20 20 22 67 63 74 65 73 74 73 4a 53 22       "gctestsJS"
56f0: 3a 20 73 47 43 54 65 73 74 73 4a 53 2c 0a 20 20  : sGCTestsJS,.  
5700: 20 20 20 20 20 20 20 20 22 70 61 72 61 67 72 61          "paragra
5710: 70 68 5f 72 75 6c 65 73 22 3a 20 6d 65 72 67 65  ph_rules": merge
5720: 52 75 6c 65 73 42 79 4f 70 74 69 6f 6e 28 6c 50  RulesByOption(lP
5730: 61 72 61 67 72 61 70 68 52 75 6c 65 73 29 2c 0a  aragraphRules),.
5740: 20 20 20 20 20 20 20 20 20 20 22 73 65 6e 74 65            "sente
5750: 6e 63 65 5f 72 75 6c 65 73 22 3a 20 6d 65 72 67  nce_rules": merg
5760: 65 52 75 6c 65 73 42 79 4f 70 74 69 6f 6e 28 6c  eRulesByOption(l
5770: 53 65 6e 74 65 6e 63 65 52 75 6c 65 73 29 2c 0a  SentenceRules),.
5780: 20 20 20 20 20 20 20 20 20 20 22 70 61 72 61 67            "parag
5790: 72 61 70 68 5f 72 75 6c 65 73 5f 4a 53 22 3a 20  raph_rules_JS": 
57a0: 6a 73 63 6f 6e 76 2e 77 72 69 74 65 52 75 6c 65  jsconv.writeRule
57b0: 73 54 6f 4a 53 41 72 72 61 79 28 6d 65 72 67 65  sToJSArray(merge
57c0: 52 75 6c 65 73 42 79 4f 70 74 69 6f 6e 28 6c 50  RulesByOption(lP
57d0: 61 72 61 67 72 61 70 68 52 75 6c 65 73 4a 53 29  aragraphRulesJS)
57e0: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 22 73 65  ),.          "se
57f0: 6e 74 65 6e 63 65 5f 72 75 6c 65 73 5f 4a 53 22  ntence_rules_JS"
5800: 3a 20 6a 73 63 6f 6e 76 2e 77 72 69 74 65 52 75  : jsconv.writeRu
5810: 6c 65 73 54 6f 4a 53 41 72 72 61 79 28 6d 65 72  lesToJSArray(mer
5820: 67 65 52 75 6c 65 73 42 79 4f 70 74 69 6f 6e 28  geRulesByOption(
5830: 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65 73 4a 53  lSentenceRulesJS
5840: 29 29 20 7d 0a 20 20 20 20 64 2e 75 70 64 61 74  )) }.    d.updat
5850: 65 28 64 4f 70 74 69 6f 6e 73 29 0a 0a 20 20 20  e(dOptions)..   
5860: 20 72 65 74 75 72 6e 20 64 0a                     return d.