Grammalecte  Hex Artifact Content

Artifact 9bd1433006d838405ffcb07a78228f79ead23e35f355470c91f0fbeee1ba1fe2:


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 53 70 65 6c 6c 43 68 65 63 6b 65 72 2e 69  _oSpellChecker.i
0df0: 73 56 61 6c 69 64 28 27 2c 20 73 29 0a 20 20 20  sValid(', s).   
0e00: 20 73 20 3d 20 72 65 2e 73 75 62 28 72 22 5b 5c   s = re.sub(r"[\
0e10: 5c 5d 28 5c 64 2b 29 22 2c 20 27 6d 2e 67 72 6f  \](\d+)", 'm.gro
0e20: 75 70 28 5c 5c 31 29 27 2c 20 73 29 0a 20 20 20  up(\\1)', s).   
0e30: 20 72 65 74 75 72 6e 20 73 0a 0a 0a 64 65 66 20   return s...def 
0e40: 75 70 70 65 72 63 61 73 65 20 28 73 2c 20 73 4c  uppercase (s, sL
0e50: 61 6e 67 29 3a 0a 20 20 20 20 22 28 66 6c 61 67  ang):.    "(flag
0e60: 20 69 20 69 73 20 6e 6f 74 20 65 6e 6f 75 67 68   i is not enough
0e70: 29 3a 20 63 6f 6e 76 65 72 74 73 20 72 65 67 65  ): converts rege
0e80: 78 20 74 6f 20 75 70 70 65 72 63 61 73 65 20 72  x to uppercase r
0e90: 65 67 65 78 3a 20 27 66 6f 6f 27 20 62 65 63 6f  egex: 'foo' beco
0ea0: 6d 65 73 20 27 5b 46 66 5d 5b 4f 6f 5d 5b 4f 6f  mes '[Ff][Oo][Oo
0eb0: 5d 27 2c 20 62 75 74 20 27 42 61 72 27 20 62 65  ]', but 'Bar' be
0ec0: 63 6f 6d 65 73 20 27 42 5b 41 61 5d 5b 52 72 5d  comes 'B[Aa][Rr]
0ed0: 27 2e 22 0a 20 20 20 20 73 55 70 20 3d 20 22 22  '.".    sUp = ""
0ee0: 0a 20 20 20 20 6e 53 74 61 74 65 20 3d 20 30 0a  .    nState = 0.
0ef0: 20 20 20 20 66 6f 72 20 69 20 69 6e 20 72 61 6e      for i in ran
0f00: 67 65 28 30 2c 20 6c 65 6e 28 73 29 29 3a 0a 20  ge(0, len(s)):. 
0f10: 20 20 20 20 20 20 20 63 20 3d 20 73 5b 69 5d 0a         c = s[i].
0f20: 20 20 20 20 20 20 20 20 69 66 20 63 20 3d 3d 20          if c == 
0f30: 22 5b 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "[":.           
0f40: 20 6e 53 74 61 74 65 20 3d 20 31 0a 20 20 20 20   nState = 1.    
0f50: 20 20 20 20 69 66 20 6e 53 74 61 74 65 20 3d 3d      if nState ==
0f60: 20 31 20 61 6e 64 20 63 20 3d 3d 20 22 5d 22 3a   1 and c == "]":
0f70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 53 74  .            nSt
0f80: 61 74 65 20 3d 20 30 0a 20 20 20 20 20 20 20 20  ate = 0.        
0f90: 69 66 20 63 20 3d 3d 20 22 3c 22 20 61 6e 64 20  if c == "<" and 
0fa0: 69 20 3e 20 33 20 61 6e 64 20 73 5b 69 2d 33 3a  i > 3 and s[i-3:
0fb0: 69 5d 20 3d 3d 20 22 28 3f 50 22 3a 0a 20 20 20  i] == "(?P":.   
0fc0: 20 20 20 20 20 20 20 20 20 6e 53 74 61 74 65 20           nState 
0fd0: 3d 20 32 0a 20 20 20 20 20 20 20 20 69 66 20 6e  = 2.        if n
0fe0: 53 74 61 74 65 20 3d 3d 20 32 20 61 6e 64 20 63  State == 2 and c
0ff0: 20 3d 3d 20 22 3e 22 3a 0a 20 20 20 20 20 20 20   == ">":.       
1000: 20 20 20 20 20 6e 53 74 61 74 65 20 3d 20 30 0a       nState = 0.
1010: 20 20 20 20 20 20 20 20 69 66 20 63 20 3d 3d 20          if c == 
1020: 22 3f 22 20 61 6e 64 20 69 20 3e 20 30 20 61 6e  "?" and i > 0 an
1030: 64 20 73 5b 69 2d 31 3a 69 5d 20 3d 3d 20 22 28  d s[i-1:i] == "(
1040: 22 20 61 6e 64 20 73 5b 69 2b 31 3a 69 2b 32 5d  " and s[i+1:i+2]
1050: 20 21 3d 20 22 3a 22 3a 0a 20 20 20 20 20 20 20   != ":":.       
1060: 20 20 20 20 20 6e 53 74 61 74 65 20 3d 20 35 0a       nState = 5.
1070: 20 20 20 20 20 20 20 20 69 66 20 6e 53 74 61 74          if nStat
1080: 65 20 3d 3d 20 35 20 61 6e 64 20 63 20 3d 3d 20  e == 5 and c == 
1090: 22 29 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ")":.           
10a0: 20 6e 53 74 61 74 65 20 3d 20 30 0a 20 20 20 20   nState = 0.    
10b0: 20 20 20 20 69 66 20 63 2e 69 73 61 6c 70 68 61      if c.isalpha
10c0: 28 29 20 61 6e 64 20 63 2e 69 73 6c 6f 77 65 72  () and c.islower
10d0: 28 29 20 61 6e 64 20 6e 53 74 61 74 65 20 3d 3d  () and nState ==
10e0: 20 30 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20   0:.            
10f0: 69 66 20 63 20 3d 3d 20 22 69 22 20 61 6e 64 20  if c == "i" and 
1100: 28 73 4c 61 6e 67 20 3d 3d 20 22 74 72 22 20 6f  (sLang == "tr" o
1110: 72 20 73 4c 61 6e 67 20 3d 3d 20 22 61 7a 22 29  r sLang == "az")
1120: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1130: 20 20 73 55 70 20 2b 3d 20 22 5b c4 b0 22 20 2b    sUp += "[.." +
1140: 20 63 20 2b 20 22 5d 22 0a 20 20 20 20 20 20 20   c + "]".       
1150: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
1160: 20 20 20 20 20 20 20 20 20 20 20 73 55 70 20 2b             sUp +
1170: 3d 20 22 5b 22 20 2b 20 63 2e 75 70 70 65 72 28  = "[" + c.upper(
1180: 29 20 2b 20 63 20 2b 20 22 5d 22 0a 20 20 20 20  ) + c + "]".    
1190: 20 20 20 20 65 6c 69 66 20 63 2e 69 73 61 6c 70      elif c.isalp
11a0: 68 61 28 29 20 61 6e 64 20 63 2e 69 73 6c 6f 77  ha() and c.islow
11b0: 65 72 28 29 20 61 6e 64 20 6e 53 74 61 74 65 20  er() and nState 
11c0: 3d 3d 20 31 20 61 6e 64 20 73 5b 69 2b 31 3a 69  == 1 and s[i+1:i
11d0: 2b 32 5d 20 21 3d 20 22 2d 22 3a 0a 20 20 20 20  +2] != "-":.    
11e0: 20 20 20 20 20 20 20 20 69 66 20 73 5b 69 2d 31          if s[i-1
11f0: 3a 69 5d 20 3d 3d 20 22 2d 22 20 61 6e 64 20 73  :i] == "-" and s
1200: 5b 69 2d 32 3a 69 2d 31 5d 2e 69 73 6c 6f 77 65  [i-2:i-1].islowe
1210: 72 28 29 3a 20 20 23 20 5b 61 2d 7a 5d 20 2d 3e  r():  # [a-z] ->
1220: 20 5b 61 2d 7a 41 2d 5a 5d 0a 20 20 20 20 20 20   [a-zA-Z].      
1230: 20 20 20 20 20 20 20 20 20 20 73 55 70 20 2b 3d            sUp +=
1240: 20 63 20 2b 20 73 5b 69 2d 32 3a 69 2d 31 5d 2e   c + s[i-2:i-1].
1250: 75 70 70 65 72 28 29 20 2b 20 22 2d 22 20 2b 20  upper() + "-" + 
1260: 63 2e 75 70 70 65 72 28 29 0a 20 20 20 20 20 20  c.upper().      
1270: 20 20 20 20 20 20 65 6c 69 66 20 63 20 3d 3d 20        elif c == 
1280: 22 69 22 20 61 6e 64 20 28 73 4c 61 6e 67 20 3d  "i" and (sLang =
1290: 3d 20 22 74 72 22 20 6f 72 20 73 4c 61 6e 67 20  = "tr" or sLang 
12a0: 3d 3d 20 22 61 7a 22 29 3a 0a 20 20 20 20 20 20  == "az"):.      
12b0: 20 20 20 20 20 20 20 20 20 20 73 55 70 20 2b 3d            sUp +=
12c0: 20 22 c4 b0 22 20 2b 20 63 0a 20 20 20 20 20 20   ".." + c.      
12d0: 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20        else:.    
12e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 55 70 20              sUp 
12f0: 2b 3d 20 63 2e 75 70 70 65 72 28 29 20 2b 20 63  += c.upper() + c
1300: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
1310: 20 20 20 20 20 20 20 20 20 20 20 73 55 70 20 2b             sUp +
1320: 3d 20 63 0a 20 20 20 20 20 20 20 20 69 66 20 63  = c.        if c
1330: 20 3d 3d 20 22 5c 5c 22 3a 0a 20 20 20 20 20 20   == "\\":.      
1340: 20 20 20 20 20 20 6e 53 74 61 74 65 20 3d 20 34        nState = 4
1350: 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 6e 53  .        elif nS
1360: 74 61 74 65 20 3d 3d 20 34 3a 0a 20 20 20 20 20  tate == 4:.     
1370: 20 20 20 20 20 20 20 6e 53 74 61 74 65 20 3d 20         nState = 
1380: 30 0a 20 20 20 20 72 65 74 75 72 6e 20 73 55 70  0.    return sUp
1390: 0a 0a 0a 64 65 66 20 63 6f 75 6e 74 47 72 6f 75  ...def countGrou
13a0: 70 49 6e 52 65 67 65 78 20 28 73 52 65 67 65 78  pInRegex (sRegex
13b0: 29 3a 0a 20 20 20 20 74 72 79 3a 0a 20 20 20 20  ):.    try:.    
13c0: 20 20 20 20 72 65 74 75 72 6e 20 72 65 2e 63 6f      return re.co
13d0: 6d 70 69 6c 65 28 73 52 65 67 65 78 29 2e 67 72  mpile(sRegex).gr
13e0: 6f 75 70 73 0a 20 20 20 20 65 78 63 65 70 74 3a  oups.    except:
13f0: 0a 20 20 20 20 20 20 20 20 74 72 61 63 65 62 61  .        traceba
1400: 63 6b 2e 70 72 69 6e 74 5f 65 78 63 28 29 0a 20  ck.print_exc(). 
1410: 20 20 20 20 20 20 20 70 72 69 6e 74 28 73 52 65         print(sRe
1420: 67 65 78 29 0a 20 20 20 20 72 65 74 75 72 6e 20  gex).    return 
1430: 30 0a 0a 0a 64 65 66 20 63 72 65 61 74 65 52 75  0...def createRu
1440: 6c 65 20 28 73 2c 20 6e 49 64 4c 69 6e 65 2c 20  le (s, nIdLine, 
1450: 73 4c 61 6e 67 2c 20 62 50 61 72 61 67 72 61 70  sLang, bParagrap
1460: 68 2c 20 64 4f 70 74 50 72 69 6f 72 69 74 79 29  h, dOptPriority)
1470: 3a 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20 72  :.    "returns r
1480: 75 6c 65 20 61 73 20 6c 69 73 74 20 5b 6f 70 74  ule as list [opt
1490: 69 6f 6e 20 6e 61 6d 65 2c 20 72 65 67 65 78 2c  ion name, regex,
14a0: 20 62 43 61 73 65 49 6e 73 65 6e 73 69 74 69 76   bCaseInsensitiv
14b0: 65 2c 20 69 64 65 6e 74 69 66 69 65 72 2c 20 6c  e, identifier, l
14c0: 69 73 74 20 6f 66 20 61 63 74 69 6f 6e 73 5d 22  ist of actions]"
14d0: 0a 20 20 20 20 67 6c 6f 62 61 6c 20 64 4a 53 52  .    global dJSR
14e0: 45 47 45 58 45 53 0a 20 20 20 20 67 6c 6f 62 61  EGEXES.    globa
14f0: 6c 20 6e 52 55 4c 45 57 49 54 48 4f 55 54 4e 41  l nRULEWITHOUTNA
1500: 4d 45 0a 0a 20 20 20 20 23 23 23 23 20 4f 50 54  ME..    #### OPT
1510: 49 4f 4e 53 0a 20 20 20 20 73 4c 69 6e 65 49 64  IONS.    sLineId
1520: 20 3d 20 73 74 72 28 6e 49 64 4c 69 6e 65 29 20   = str(nIdLine) 
1530: 2b 20 28 22 70 22 20 69 66 20 62 50 61 72 61 67  + ("p" if bParag
1540: 72 61 70 68 20 65 6c 73 65 20 22 73 22 29 0a 20  raph else "s"). 
1550: 20 20 20 73 52 75 6c 65 49 64 20 3d 20 73 4c 69     sRuleId = sLi
1560: 6e 65 49 64 0a 20 20 20 20 73 4f 70 74 69 6f 6e  neId.    sOption
1570: 20 3d 20 46 61 6c 73 65 20 20 20 20 20 20 20 20   = False        
1580: 20 23 20 46 61 6c 73 65 20 6f 72 20 5b 61 2d 7a   # False or [a-z
1590: 30 2d 39 5d 2b 20 6e 61 6d 65 0a 20 20 20 20 6e  0-9]+ name.    n
15a0: 50 72 69 6f 72 69 74 79 20 3d 20 34 20 20 20 20  Priority = 4    
15b0: 20 20 20 20 20 20 20 23 20 44 65 66 61 75 6c 74         # Default
15c0: 20 69 73 20 34 2c 20 76 61 6c 75 65 20 6d 75 73   is 4, value mus
15d0: 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
15e0: 6e 64 20 39 0a 20 20 20 20 74 47 72 6f 75 70 73  nd 9.    tGroups
15f0: 20 3d 20 4e 6f 6e 65 20 20 20 20 20 20 20 20 20   = None         
1600: 20 23 20 63 6f 64 65 20 66 6f 72 20 67 72 6f 75   # code for grou
1610: 70 73 20 70 6f 73 69 74 69 6f 6e 69 6e 67 20 28  ps positioning (
1620: 6f 6e 6c 79 20 75 73 65 66 75 6c 20 66 6f 72 20  only useful for 
1630: 4a 61 76 61 53 63 72 69 70 74 29 0a 20 20 20 20  JavaScript).    
1640: 63 43 61 73 65 4d 6f 64 65 20 3d 20 27 69 27 20  cCaseMode = 'i' 
1650: 20 20 20 20 20 20 20 20 23 20 69 3a 20 63 61 73          # i: cas
1660: 65 20 69 6e 73 65 6e 73 69 74 69 76 65 2c 20 20  e insensitive,  
1670: 73 3a 20 63 61 73 65 20 73 65 6e 73 69 74 69 76  s: case sensitiv
1680: 65 2c 20 20 75 3a 20 75 70 70 65 72 63 61 73 69  e,  u: uppercasi
1690: 6e 67 20 61 6c 6c 6f 77 65 64 0a 20 20 20 20 63  ng allowed.    c
16a0: 57 6f 72 64 4c 69 6d 69 74 4c 65 66 74 20 3d 20  WordLimitLeft = 
16b0: 27 5b 27 20 20 20 20 23 20 5b 3a 20 77 6f 72 64  '['    # [: word
16c0: 20 6c 69 6d 69 74 2c 20 3c 3a 20 6e 6f 20 73 70   limit, <: no sp
16d0: 65 63 69 66 69 63 20 6c 69 6d 69 74 0a 20 20 20  ecific limit.   
16e0: 20 63 57 6f 72 64 4c 69 6d 69 74 52 69 67 68 74   cWordLimitRight
16f0: 20 3d 20 27 5d 27 20 20 20 23 20 5d 3a 20 77 6f   = ']'   # ]: wo
1700: 72 64 20 6c 69 6d 69 74 2c 20 3e 3a 20 6e 6f 20  rd limit, >: no 
1710: 73 70 65 63 69 66 69 63 20 6c 69 6d 69 74 0a 20  specific limit. 
1720: 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28     m = re.match(
1730: 22 5e 5f 5f 28 3f 50 3c 62 6f 72 64 65 72 73 5f  "^__(?P<borders_
1740: 61 6e 64 5f 63 61 73 65 3e 5b 5b 3c 5d 5c 5c 77  and_case>[[<]\\w
1750: 5b 5d 3e 5d 29 28 3f 50 3c 6f 70 74 69 6f 6e 3e  []>])(?P<option>
1760: 2f 5b 61 2d 7a 41 2d 5a 30 2d 39 5d 2b 7c 29 28  /[a-zA-Z0-9]+|)(
1770: 3f 50 3c 72 75 6c 65 69 64 3e 5c 5c 28 5c 5c 77  ?P<ruleid>\\(\\w
1780: 2b 5c 5c 29 7c 29 28 3f 50 3c 70 72 69 6f 72 69  +\\)|)(?P<priori
1790: 74 79 3e 21 5b 30 2d 39 5d 7c 29 5f 5f 20 2a 22  ty>![0-9]|)__ *"
17a0: 2c 20 73 29 0a 20 20 20 20 69 66 20 6d 3a 0a 20  , s).    if m:. 
17b0: 20 20 20 20 20 20 20 63 57 6f 72 64 4c 69 6d 69         cWordLimi
17c0: 74 4c 65 66 74 20 3d 20 6d 2e 67 72 6f 75 70 28  tLeft = m.group(
17d0: 27 62 6f 72 64 65 72 73 5f 61 6e 64 5f 63 61 73  'borders_and_cas
17e0: 65 27 29 5b 30 5d 0a 20 20 20 20 20 20 20 20 63  e')[0].        c
17f0: 43 61 73 65 4d 6f 64 65 20 3d 20 6d 2e 67 72 6f  CaseMode = m.gro
1800: 75 70 28 27 62 6f 72 64 65 72 73 5f 61 6e 64 5f  up('borders_and_
1810: 63 61 73 65 27 29 5b 31 5d 0a 20 20 20 20 20 20  case')[1].      
1820: 20 20 63 57 6f 72 64 4c 69 6d 69 74 52 69 67 68    cWordLimitRigh
1830: 74 20 3d 20 6d 2e 67 72 6f 75 70 28 27 62 6f 72  t = m.group('bor
1840: 64 65 72 73 5f 61 6e 64 5f 63 61 73 65 27 29 5b  ders_and_case')[
1850: 32 5d 0a 20 20 20 20 20 20 20 20 73 4f 70 74 69  2].        sOpti
1860: 6f 6e 20 3d 20 6d 2e 67 72 6f 75 70 28 27 6f 70  on = m.group('op
1870: 74 69 6f 6e 27 29 5b 31 3a 5d 20 20 69 66 20 6d  tion')[1:]  if m
1880: 2e 67 72 6f 75 70 28 27 6f 70 74 69 6f 6e 27 29  .group('option')
1890: 20 20 65 6c 73 65 20 46 61 6c 73 65 0a 20 20 20    else False.   
18a0: 20 20 20 20 20 69 66 20 6d 2e 67 72 6f 75 70 28       if m.group(
18b0: 27 72 75 6c 65 69 64 27 29 3a 0a 20 20 20 20 20  'ruleid'):.     
18c0: 20 20 20 20 20 20 20 73 52 75 6c 65 49 64 20 3d         sRuleId =
18d0: 20 20 6d 2e 67 72 6f 75 70 28 27 72 75 6c 65 69    m.group('rulei
18e0: 64 27 29 5b 31 3a 2d 31 5d 0a 20 20 20 20 20 20  d')[1:-1].      
18f0: 20 20 20 20 20 20 69 66 20 73 52 75 6c 65 49 64        if sRuleId
1900: 20 69 6e 20 61 52 55 4c 45 53 45 54 3a 0a 20 20   in aRULESET:.  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
1920: 69 6e 74 28 22 23 20 45 72 72 6f 72 2e 20 53 65  int("# Error. Se
1930: 76 65 72 61 6c 20 72 75 6c 65 73 20 68 61 76 65  veral rules have
1940: 20 74 68 65 20 73 61 6d 65 20 69 64 3a 20 22 20   the same id: " 
1950: 2b 20 73 52 75 6c 65 49 64 29 0a 20 20 20 20 20  + sRuleId).     
1960: 20 20 20 20 20 20 20 20 20 20 20 65 78 69 74 28             exit(
1970: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 52  ).            aR
1980: 55 4c 45 53 45 54 2e 61 64 64 28 73 52 75 6c 65  ULESET.add(sRule
1990: 49 64 29 0a 20 20 20 20 20 20 20 20 65 6c 73 65  Id).        else
19a0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 52  :.            nR
19b0: 55 4c 45 57 49 54 48 4f 55 54 4e 41 4d 45 20 2b  ULEWITHOUTNAME +
19c0: 3d 20 31 0a 20 20 20 20 20 20 20 20 6e 50 72 69  = 1.        nPri
19d0: 6f 72 69 74 79 20 3d 20 64 4f 70 74 50 72 69 6f  ority = dOptPrio
19e0: 72 69 74 79 2e 67 65 74 28 73 4f 70 74 69 6f 6e  rity.get(sOption
19f0: 2c 20 34 29 0a 20 20 20 20 20 20 20 20 69 66 20  , 4).        if 
1a00: 6d 2e 67 72 6f 75 70 28 27 70 72 69 6f 72 69 74  m.group('priorit
1a10: 79 27 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  y'):.           
1a20: 20 6e 50 72 69 6f 72 69 74 79 20 3d 20 69 6e 74   nPriority = int
1a30: 28 6d 2e 67 72 6f 75 70 28 27 70 72 69 6f 72 69  (m.group('priori
1a40: 74 79 27 29 5b 31 3a 5d 29 0a 20 20 20 20 20 20  ty')[1:]).      
1a50: 20 20 73 20 3d 20 73 5b 6d 2e 65 6e 64 28 30 29    s = s[m.end(0)
1a60: 3a 5d 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20  :].    else:.   
1a70: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 57 61       print("# Wa
1a80: 72 6e 69 6e 67 2e 20 4e 6f 20 6f 70 74 69 6f 6e  rning. No option
1a90: 20 64 65 66 69 6e 65 64 20 61 74 20 6c 69 6e 65   defined at line
1aa0: 3a 20 22 20 2b 20 73 4c 69 6e 65 49 64 29 0a 0a  : " + sLineId)..
1ab0: 20 20 20 20 23 23 23 23 20 52 45 47 45 58 20 54      #### REGEX T
1ac0: 52 49 47 47 45 52 0a 20 20 20 20 69 20 3d 20 73  RIGGER.    i = s
1ad0: 2e 66 69 6e 64 28 22 20 3c 3c 2d 22 29 0a 20 20  .find(" <<-").  
1ae0: 20 20 69 66 20 69 20 3d 3d 20 2d 31 3a 0a 20 20    if i == -1:.  
1af0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
1b00: 72 72 6f 72 3a 20 6e 6f 20 63 6f 6e 64 69 74 69  rror: no conditi
1b10: 6f 6e 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73  on at line " + s
1b20: 4c 69 6e 65 49 64 29 0a 20 20 20 20 20 20 20 20  LineId).        
1b30: 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 20 20 20 20  return None.    
1b40: 73 52 65 67 65 78 20 3d 20 73 5b 3a 69 5d 2e 73  sRegex = s[:i].s
1b50: 74 72 69 70 28 29 0a 20 20 20 20 73 20 3d 20 73  trip().    s = s
1b60: 5b 69 2b 34 3a 5d 0a 20 20 20 20 0a 20 20 20 20  [i+4:].    .    
1b70: 23 20 4a 53 20 67 72 6f 75 70 73 20 70 6f 73 69  # JS groups posi
1b80: 74 69 6f 6e 69 6e 67 20 63 6f 64 65 73 0a 20 20  tioning codes.  
1b90: 20 20 6d 20 3d 20 72 65 2e 73 65 61 72 63 68 28    m = re.search(
1ba0: 22 40 40 5c 5c 53 2b 22 2c 20 73 52 65 67 65 78  "@@\\S+", sRegex
1bb0: 29 0a 20 20 20 20 69 66 20 6d 3a 0a 20 20 20 20  ).    if m:.    
1bc0: 20 20 20 20 74 47 72 6f 75 70 73 20 3d 20 6a 73      tGroups = js
1bd0: 63 6f 6e 76 2e 67 72 6f 75 70 73 50 6f 73 69 74  conv.groupsPosit
1be0: 69 6f 6e 69 6e 67 43 6f 64 65 54 6f 4c 69 73 74  ioningCodeToList
1bf0: 28 73 52 65 67 65 78 5b 6d 2e 73 74 61 72 74 28  (sRegex[m.start(
1c00: 29 2b 32 3a 5d 29 0a 20 20 20 20 20 20 20 20 73  )+2:]).        s
1c10: 52 65 67 65 78 20 3d 20 73 52 65 67 65 78 5b 3a  Regex = sRegex[:
1c20: 6d 2e 73 74 61 72 74 28 29 5d 2e 73 74 72 69 70  m.start()].strip
1c30: 28 29 0a 20 20 20 20 23 20 4a 53 20 72 65 67 65  ().    # JS rege
1c40: 78 0a 20 20 20 20 6d 20 3d 20 72 65 2e 73 65 61  x.    m = re.sea
1c50: 72 63 68 28 22 3c 6a 73 3e 2e 2b 3c 2f 6a 73 3e  rch("<js>.+</js>
1c60: 69 3f 22 2c 20 73 52 65 67 65 78 29 0a 20 20 20  i?", sRegex).   
1c70: 20 69 66 20 6d 3a 0a 20 20 20 20 20 20 20 20 64   if m:.        d
1c80: 4a 53 52 45 47 45 58 45 53 5b 73 4c 69 6e 65 49  JSREGEXES[sLineI
1c90: 64 5d 20 3d 20 6d 2e 67 72 6f 75 70 28 30 29 0a  d] = m.group(0).
1ca0: 20 20 20 20 20 20 20 20 73 52 65 67 65 78 20 3d          sRegex =
1cb0: 20 73 52 65 67 65 78 5b 3a 6d 2e 73 74 61 72 74   sRegex[:m.start
1cc0: 28 29 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20  ()].strip().    
1cd0: 69 66 20 22 3c 6a 73 3e 22 20 69 6e 20 73 52 65  if "<js>" in sRe
1ce0: 67 65 78 20 6f 72 20 22 3c 2f 6a 73 3e 22 20 69  gex or "</js>" i
1cf0: 6e 20 73 52 65 67 65 78 3a 0a 20 20 20 20 20 20  n sRegex:.      
1d00: 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72    print("# Error
1d10: 3a 20 4a 61 76 61 53 63 72 69 70 74 20 72 65 67  : JavaScript reg
1d20: 65 78 20 6e 6f 74 20 64 65 6c 69 6d 69 74 65 64  ex not delimited
1d30: 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 4c 69   at line " + sLi
1d40: 6e 65 49 64 29 0a 20 20 20 20 20 20 20 20 72 65  neId).        re
1d50: 74 75 72 6e 20 4e 6f 6e 65 0a 0a 20 20 20 20 23  turn None..    #
1d60: 20 71 75 6f 74 65 73 20 3f 0a 20 20 20 20 69 66   quotes ?.    if
1d70: 20 73 52 65 67 65 78 2e 73 74 61 72 74 73 77 69   sRegex.startswi
1d80: 74 68 28 27 22 27 29 20 61 6e 64 20 73 52 65 67  th('"') and sReg
1d90: 65 78 2e 65 6e 64 73 77 69 74 68 28 27 22 27 29  ex.endswith('"')
1da0: 3a 0a 20 20 20 20 20 20 20 20 73 52 65 67 65 78  :.        sRegex
1db0: 20 3d 20 73 52 65 67 65 78 5b 31 3a 2d 31 5d 0a   = sRegex[1:-1].
1dc0: 0a 20 20 20 20 23 23 20 64 65 66 69 6e 69 74 69  .    ## definiti
1dd0: 6f 6e 73 0a 20 20 20 20 66 6f 72 20 73 44 65 66  ons.    for sDef
1de0: 2c 20 73 52 65 70 6c 20 69 6e 20 64 44 45 46 2e  , sRepl in dDEF.
1df0: 69 74 65 6d 73 28 29 3a 0a 20 20 20 20 20 20 20  items():.       
1e00: 20 73 52 65 67 65 78 20 3d 20 73 52 65 67 65 78   sRegex = sRegex
1e10: 2e 72 65 70 6c 61 63 65 28 73 44 65 66 2c 20 73  .replace(sDef, s
1e20: 52 65 70 6c 29 0a 0a 20 20 20 20 23 23 20 63 6f  Repl)..    ## co
1e30: 75 6e 74 20 6e 75 6d 62 65 72 20 6f 66 20 67 72  unt number of gr
1e40: 6f 75 70 73 20 28 6d 75 73 74 20 62 65 20 64 6f  oups (must be do
1e50: 6e 65 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  ne before modify
1e60: 69 6e 67 20 74 68 65 20 72 65 67 65 78 29 0a 20  ing the regex). 
1e70: 20 20 20 6e 47 72 6f 75 70 20 3d 20 63 6f 75 6e     nGroup = coun
1e80: 74 47 72 6f 75 70 49 6e 52 65 67 65 78 28 73 52  tGroupInRegex(sR
1e90: 65 67 65 78 29 0a 20 20 20 20 69 66 20 6e 47 72  egex).    if nGr
1ea0: 6f 75 70 20 3e 20 30 3a 0a 20 20 20 20 20 20 20  oup > 0:.       
1eb0: 20 69 66 20 6e 6f 74 20 74 47 72 6f 75 70 73 3a   if not tGroups:
1ec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
1ed0: 6e 74 28 22 23 20 57 61 72 6e 69 6e 67 3a 20 67  nt("# Warning: g
1ee0: 72 6f 75 70 73 20 70 6f 73 69 74 69 6f 6e 69 6e  roups positionin
1ef0: 67 20 63 6f 64 65 20 66 6f 72 20 4a 61 76 61 53  g code for JavaS
1f00: 63 72 69 70 74 20 73 68 6f 75 6c 64 20 62 65 20  cript should be 
1f10: 64 65 66 69 6e 65 64 20 61 74 20 6c 69 6e 65 20  defined at line 
1f20: 22 20 2b 20 73 4c 69 6e 65 49 64 29 0a 20 20 20  " + sLineId).   
1f30: 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20       else:.     
1f40: 20 20 20 20 20 20 20 69 66 20 6e 47 72 6f 75 70         if nGroup
1f50: 20 21 3d 20 6c 65 6e 28 74 47 72 6f 75 70 73 29   != len(tGroups)
1f60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
1f70: 20 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72    print("# Error
1f80: 3a 20 67 72 6f 75 70 73 20 70 6f 73 69 74 69 6f  : groups positio
1f90: 6e 69 6e 67 20 63 6f 64 65 20 69 72 72 65 6c 65  ning code irrele
1fa0: 76 61 6e 74 20 61 74 20 6c 69 6e 65 20 22 20 2b  vant at line " +
1fb0: 20 73 4c 69 6e 65 49 64 29 0a 0a 20 20 20 20 23   sLineId)..    #
1fc0: 23 20 77 6f 72 64 20 6c 69 6d 69 74 0a 20 20 20  # word limit.   
1fd0: 20 69 66 20 63 57 6f 72 64 4c 69 6d 69 74 4c 65   if cWordLimitLe
1fe0: 66 74 20 3d 3d 20 27 5b 27 20 61 6e 64 20 6e 6f  ft == '[' and no
1ff0: 74 20 73 52 65 67 65 78 2e 73 74 61 72 74 73 77  t sRegex.startsw
2000: 69 74 68 28 28 22 5e 22 2c 20 27 e2 80 99 27 2c  ith(("^", '...',
2010: 20 22 27 22 2c 20 22 2c 22 29 29 3a 0a 20 20 20   "'", ",")):.   
2020: 20 20 20 20 20 73 52 65 67 65 78 20 3d 20 73 57       sRegex = sW
2030: 4f 52 44 4c 49 4d 49 54 4c 45 46 54 20 2b 20 73  ORDLIMITLEFT + s
2040: 52 65 67 65 78 0a 20 20 20 20 69 66 20 63 57 6f  Regex.    if cWo
2050: 72 64 4c 69 6d 69 74 52 69 67 68 74 20 3d 3d 20  rdLimitRight == 
2060: 27 5d 27 20 61 6e 64 20 6e 6f 74 20 73 52 65 67  ']' and not sReg
2070: 65 78 2e 65 6e 64 73 77 69 74 68 28 28 22 24 22  ex.endswith(("$"
2080: 2c 20 27 e2 80 99 27 2c 20 22 27 22 2c 20 22 2c  , '...', "'", ",
2090: 22 29 29 3a 0a 20 20 20 20 20 20 20 20 73 52 65  ")):.        sRe
20a0: 67 65 78 20 3d 20 73 52 65 67 65 78 20 2b 20 73  gex = sRegex + s
20b0: 57 4f 52 44 4c 49 4d 49 54 52 49 47 48 54 0a 0a  WORDLIMITRIGHT..
20c0: 20 20 20 20 23 23 20 63 61 73 69 6e 67 20 6d 6f      ## casing mo
20d0: 64 65 0a 20 20 20 20 69 66 20 63 43 61 73 65 4d  de.    if cCaseM
20e0: 6f 64 65 20 3d 3d 20 22 69 22 3a 0a 20 20 20 20  ode == "i":.    
20f0: 20 20 20 20 62 43 61 73 65 49 6e 73 65 6e 73 69      bCaseInsensi
2100: 74 69 76 65 20 3d 20 54 72 75 65 0a 20 20 20 20  tive = True.    
2110: 20 20 20 20 69 66 20 6e 6f 74 20 73 52 65 67 65      if not sRege
2120: 78 2e 73 74 61 72 74 73 77 69 74 68 28 22 28 3f  x.startswith("(?
2130: 69 29 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  i)"):.          
2140: 20 20 73 52 65 67 65 78 20 3d 20 22 28 3f 69 29    sRegex = "(?i)
2150: 22 20 2b 20 73 52 65 67 65 78 0a 20 20 20 20 65  " + sRegex.    e
2160: 6c 69 66 20 63 43 61 73 65 4d 6f 64 65 20 3d 3d  lif cCaseMode ==
2170: 20 22 73 22 3a 0a 20 20 20 20 20 20 20 20 62 43   "s":.        bC
2180: 61 73 65 49 6e 73 65 6e 73 69 74 69 76 65 20 3d  aseInsensitive =
2190: 20 46 61 6c 73 65 0a 20 20 20 20 20 20 20 20 73   False.        s
21a0: 52 65 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72  Regex = sRegex.r
21b0: 65 70 6c 61 63 65 28 22 28 3f 69 29 22 2c 20 22  eplace("(?i)", "
21c0: 22 29 0a 20 20 20 20 65 6c 69 66 20 63 43 61 73  ").    elif cCas
21d0: 65 4d 6f 64 65 20 3d 3d 20 22 75 22 3a 0a 20 20  eMode == "u":.  
21e0: 20 20 20 20 20 20 62 43 61 73 65 49 6e 73 65 6e        bCaseInsen
21f0: 73 69 74 69 76 65 20 3d 20 46 61 6c 73 65 0a 20  sitive = False. 
2200: 20 20 20 20 20 20 20 73 52 65 67 65 78 20 3d 20         sRegex = 
2210: 73 52 65 67 65 78 2e 72 65 70 6c 61 63 65 28 22  sRegex.replace("
2220: 28 3f 69 29 22 2c 20 22 22 29 0a 20 20 20 20 20  (?i)", "").     
2230: 20 20 20 73 52 65 67 65 78 20 3d 20 75 70 70 65     sRegex = uppe
2240: 72 63 61 73 65 28 73 52 65 67 65 78 2c 20 73 4c  rcase(sRegex, sL
2250: 61 6e 67 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20  ang).    else:. 
2260: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
2270: 55 6e 6b 6e 6f 77 6e 20 63 61 73 65 20 6d 6f 64  Unknown case mod
2280: 65 20 5b 22 20 2b 20 63 43 61 73 65 4d 6f 64 65  e [" + cCaseMode
2290: 20 2b 20 22 5d 20 61 74 20 6c 69 6e 65 20 22 20   + "] at line " 
22a0: 2b 20 73 4c 69 6e 65 49 64 29 0a 0a 20 20 20 20  + sLineId)..    
22b0: 23 23 20 63 68 65 63 6b 20 72 65 67 65 78 0a 20  ## check regex. 
22c0: 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20 20     try:.        
22d0: 7a 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65 28 73  z = re.compile(s
22e0: 52 65 67 65 78 29 0a 20 20 20 20 65 78 63 65 70  Regex).    excep
22f0: 74 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  t:.        print
2300: 28 22 23 20 52 65 67 65 78 20 65 72 72 6f 72 20  ("# Regex error 
2310: 61 74 20 6c 69 6e 65 20 22 2c 20 6e 49 64 4c 69  at line ", nIdLi
2320: 6e 65 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e  ne).        prin
2330: 74 28 73 52 65 67 65 78 29 0a 20 20 20 20 20 20  t(sRegex).      
2340: 20 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69 6e    traceback.prin
2350: 74 5f 65 78 63 28 29 0a 20 20 20 20 20 20 20 20  t_exc().        
2360: 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 20 20 20 20  return None.    
2370: 23 23 20 67 72 6f 75 70 73 20 69 6e 20 6e 6f 6e  ## groups in non
2380: 20 67 72 6f 75 70 69 6e 67 20 70 61 72 65 6e 74   grouping parent
2390: 68 65 73 69 73 0a 20 20 20 20 66 6f 72 20 78 20  hesis.    for x 
23a0: 69 6e 20 72 65 2e 66 69 6e 64 69 74 65 72 28 22  in re.finditer("
23b0: 5c 28 5c 3f 3a 5b 5e 29 5d 2a 5c 28 5b 5b 5c 77  \(\?:[^)]*\([[\w
23c0: 20 2d 5d 22 2c 20 73 52 65 67 65 78 29 3a 0a 20   -]", sRegex):. 
23d0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
23e0: 57 61 72 6e 69 6e 67 3a 20 67 72 6f 75 70 73 20  Warning: groups 
23f0: 69 6e 73 69 64 65 20 6e 6f 6e 20 67 72 6f 75 70  inside non group
2400: 69 6e 67 20 70 61 72 65 6e 74 68 65 73 69 73 20  ing parenthesis 
2410: 69 6e 20 72 65 67 65 78 20 61 74 20 6c 69 6e 65  in regex at line
2420: 20 22 20 2b 20 73 4c 69 6e 65 49 64 29 0a 0a 20   " + sLineId).. 
2430: 20 20 20 23 23 23 23 20 50 41 52 53 45 20 41 43     #### PARSE AC
2440: 54 49 4f 4e 53 0a 20 20 20 20 6c 41 63 74 69 6f  TIONS.    lActio
2450: 6e 73 20 3d 20 5b 5d 0a 20 20 20 20 6e 41 63 74  ns = [].    nAct
2460: 69 6f 6e 20 3d 20 31 0a 20 20 20 20 66 6f 72 20  ion = 1.    for 
2470: 73 41 63 74 69 6f 6e 20 69 6e 20 73 2e 73 70 6c  sAction in s.spl
2480: 69 74 28 22 20 3c 3c 2d 20 22 29 3a 0a 20 20 20  it(" <<- "):.   
2490: 20 20 20 20 20 74 20 3d 20 63 72 65 61 74 65 41       t = createA
24a0: 63 74 69 6f 6e 28 73 52 75 6c 65 49 64 20 2b 20  ction(sRuleId + 
24b0: 22 5f 22 20 2b 20 73 74 72 28 6e 41 63 74 69 6f  "_" + str(nActio
24c0: 6e 29 2c 20 73 41 63 74 69 6f 6e 2c 20 6e 47 72  n), sAction, nGr
24d0: 6f 75 70 29 0a 20 20 20 20 20 20 20 20 6e 41 63  oup).        nAc
24e0: 74 69 6f 6e 20 2b 3d 20 31 0a 20 20 20 20 20 20  tion += 1.      
24f0: 20 20 69 66 20 74 3a 0a 20 20 20 20 20 20 20 20    if t:.        
2500: 20 20 20 20 6c 41 63 74 69 6f 6e 73 2e 61 70 70      lActions.app
2510: 65 6e 64 28 74 29 0a 20 20 20 20 69 66 20 6e 6f  end(t).    if no
2520: 74 20 6c 41 63 74 69 6f 6e 73 3a 0a 20 20 20 20  t lActions:.    
2530: 20 20 20 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a      return None.
2540: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 73 4f 70  .    return [sOp
2550: 74 69 6f 6e 2c 20 73 52 65 67 65 78 2c 20 62 43  tion, sRegex, bC
2560: 61 73 65 49 6e 73 65 6e 73 69 74 69 76 65 2c 20  aseInsensitive, 
2570: 73 4c 69 6e 65 49 64 2c 20 73 52 75 6c 65 49 64  sLineId, sRuleId
2580: 2c 20 6e 50 72 69 6f 72 69 74 79 2c 20 6c 41 63  , nPriority, lAc
2590: 74 69 6f 6e 73 2c 20 74 47 72 6f 75 70 73 5d 0a  tions, tGroups].
25a0: 0a 0a 64 65 66 20 63 72 65 61 74 65 41 63 74 69  ..def createActi
25b0: 6f 6e 20 28 73 49 64 41 63 74 69 6f 6e 2c 20 73  on (sIdAction, s
25c0: 41 63 74 69 6f 6e 2c 20 6e 47 72 6f 75 70 29 3a  Action, nGroup):
25d0: 0a 20 20 20 20 22 72 65 74 75 72 6e 73 20 61 6e  .    "returns an
25e0: 20 61 63 74 69 6f 6e 20 74 6f 20 70 65 72 66 6f   action to perfo
25f0: 72 6d 20 61 73 20 61 20 74 75 70 6c 65 20 28 63  rm as a tuple (c
2600: 6f 6e 64 69 74 69 6f 6e 2c 20 61 63 74 69 6f 6e  ondition, action
2610: 20 74 79 70 65 2c 20 61 63 74 69 6f 6e 5b 2c 20   type, action[, 
2620: 69 47 72 6f 75 70 20 5b 2c 20 6d 65 73 73 61 67  iGroup [, messag
2630: 65 2c 20 55 52 4c 20 5d 5d 29 22 0a 20 20 20 20  e, URL ]])".    
2640: 67 6c 6f 62 61 6c 20 6c 46 55 4e 43 54 49 4f 4e  global lFUNCTION
2650: 53 0a 0a 20 20 20 20 6d 20 3d 20 72 65 2e 73 65  S..    m = re.se
2660: 61 72 63 68 28 72 22 28 5b 2d 7e 3d 3e 5d 29 28  arch(r"([-~=>])(
2670: 5c 64 2a 7c 29 3e 3e 22 2c 20 73 41 63 74 69 6f  \d*|)>>", sActio
2680: 6e 29 0a 20 20 20 20 69 66 20 6e 6f 74 20 6d 3a  n).    if not m:
2690: 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22  .        print("
26a0: 23 20 4e 6f 20 61 63 74 69 6f 6e 20 61 74 20 6c  # No action at l
26b0: 69 6e 65 20 22 20 2b 20 73 49 64 41 63 74 69 6f  ine " + sIdActio
26c0: 6e 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  n).        retur
26d0: 6e 20 4e 6f 6e 65 0a 0a 20 20 20 20 23 23 23 23  n None..    ####
26e0: 20 43 4f 4e 44 49 54 49 4f 4e 0a 20 20 20 20 73   CONDITION.    s
26f0: 43 6f 6e 64 69 74 69 6f 6e 20 3d 20 73 41 63 74  Condition = sAct
2700: 69 6f 6e 5b 3a 6d 2e 73 74 61 72 74 28 29 5d 2e  ion[:m.start()].
2710: 73 74 72 69 70 28 29 0a 20 20 20 20 69 66 20 73  strip().    if s
2720: 43 6f 6e 64 69 74 69 6f 6e 3a 0a 20 20 20 20 20  Condition:.     
2730: 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20 3d 20     sCondition = 
2740: 70 72 65 70 61 72 65 46 75 6e 63 74 69 6f 6e 28  prepareFunction(
2750: 73 43 6f 6e 64 69 74 69 6f 6e 29 0a 20 20 20 20  sCondition).    
2760: 20 20 20 20 6c 46 55 4e 43 54 49 4f 4e 53 2e 61      lFUNCTIONS.a
2770: 70 70 65 6e 64 28 28 22 63 5f 22 2b 73 49 64 41  ppend(("c_"+sIdA
2780: 63 74 69 6f 6e 2c 20 73 43 6f 6e 64 69 74 69 6f  ction, sConditio
2790: 6e 29 29 0a 20 20 20 20 20 20 20 20 66 6f 72 20  n)).        for 
27a0: 78 20 69 6e 20 72 65 2e 66 69 6e 64 69 74 65 72  x in re.finditer
27b0: 28 22 5b 2e 5d 28 3f 3a 67 72 6f 75 70 7c 73 74  ("[.](?:group|st
27c0: 61 72 74 7c 65 6e 64 29 5b 28 5d 28 5c 64 2b 29  art|end)[(](\d+)
27d0: 5b 29 5d 22 2c 20 73 43 6f 6e 64 69 74 69 6f 6e  [)]", sCondition
27e0: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ):.            i
27f0: 66 20 69 6e 74 28 78 2e 67 72 6f 75 70 28 31 29  f int(x.group(1)
2800: 29 20 3e 20 6e 47 72 6f 75 70 3a 0a 20 20 20 20  ) > nGroup:.    
2810: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
2820: 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20 67 72  t("# Error in gr
2830: 6f 75 70 73 20 69 6e 20 63 6f 6e 64 69 74 69 6f  oups in conditio
2840: 6e 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49  n at line " + sI
2850: 64 41 63 74 69 6f 6e 20 2b 20 22 20 28 22 2b 73  dAction + " ("+s
2860: 74 72 28 6e 47 72 6f 75 70 29 2b 22 20 67 72 6f  tr(nGroup)+" gro
2870: 75 70 73 20 6f 6e 6c 79 29 22 29 0a 20 20 20 20  ups only)").    
2880: 20 20 20 20 69 66 20 22 2e 6d 61 74 63 68 22 20      if ".match" 
2890: 69 6e 20 73 43 6f 6e 64 69 74 69 6f 6e 3a 0a 20  in sCondition:. 
28a0: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
28b0: 28 22 23 20 45 72 72 6f 72 2e 20 4a 53 20 63 6f  ("# Error. JS co
28c0: 6d 70 61 74 69 62 69 6c 69 74 79 2e 20 44 6f 6e  mpatibility. Don
28d0: 27 74 20 75 73 65 20 2e 6d 61 74 63 68 28 29 20  't use .match() 
28e0: 69 6e 20 63 6f 6e 64 69 74 69 6f 6e 2c 20 75 73  in condition, us
28f0: 65 20 2e 73 65 61 72 63 68 28 29 22 29 0a 20 20  e .search()").  
2900: 20 20 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e        sCondition
2910: 20 3d 20 22 63 5f 22 2b 73 49 64 41 63 74 69 6f   = "c_"+sIdActio
2920: 6e 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  n.    else:.    
2930: 20 20 20 20 73 43 6f 6e 64 69 74 69 6f 6e 20 3d      sCondition =
2940: 20 4e 6f 6e 65 0a 0a 20 20 20 20 23 23 23 23 20   None..    #### 
2950: 69 47 72 6f 75 70 20 2f 20 70 6f 73 69 74 69 6f  iGroup / positio
2960: 6e 69 6e 67 0a 20 20 20 20 69 47 72 6f 75 70 20  ning.    iGroup 
2970: 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28 32 29  = int(m.group(2)
2980: 29 20 69 66 20 6d 2e 67 72 6f 75 70 28 32 29 20  ) if m.group(2) 
2990: 65 6c 73 65 20 30 0a 20 20 20 20 69 66 20 69 47  else 0.    if iG
29a0: 72 6f 75 70 20 3e 20 6e 47 72 6f 75 70 3a 0a 20  roup > nGroup:. 
29b0: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
29c0: 53 65 6c 65 63 74 65 64 20 67 72 6f 75 70 20 3e  Selected group >
29d0: 20 67 72 6f 75 70 20 6e 75 6d 62 65 72 20 69 6e   group number in
29e0: 20 72 65 67 65 78 20 61 74 20 6c 69 6e 65 20 22   regex at line "
29f0: 20 2b 20 73 49 64 41 63 74 69 6f 6e 29 0a 20 20   + sIdAction).  
2a00: 20 20 0a 20 20 20 20 23 23 23 23 20 41 43 54 49    .    #### ACTI
2a10: 4f 4e 0a 20 20 20 20 73 41 63 74 69 6f 6e 20 3d  ON.    sAction =
2a20: 20 73 41 63 74 69 6f 6e 5b 6d 2e 65 6e 64 28 29   sAction[m.end()
2a30: 3a 5d 2e 73 74 72 69 70 28 29 0a 20 20 20 20 63  :].strip().    c
2a40: 41 63 74 69 6f 6e 20 3d 20 6d 2e 67 72 6f 75 70  Action = m.group
2a50: 28 31 29 0a 20 20 20 20 69 66 20 63 41 63 74 69  (1).    if cActi
2a60: 6f 6e 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20 20  on == "-":.     
2a70: 20 20 20 23 23 20 65 72 72 6f 72 0a 20 20 20 20     ## error.    
2a80: 20 20 20 20 69 4d 73 67 20 3d 20 73 41 63 74 69      iMsg = sActi
2a90: 6f 6e 2e 66 69 6e 64 28 22 20 23 20 22 29 0a 20  on.find(" # "). 
2aa0: 20 20 20 20 20 20 20 69 66 20 69 4d 73 67 20 3d         if iMsg =
2ab0: 3d 20 2d 31 3a 0a 20 20 20 20 20 20 20 20 20 20  = -1:.          
2ac0: 20 20 73 4d 73 67 20 3d 20 22 23 20 45 72 72 6f    sMsg = "# Erro
2ad0: 72 2e 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  r. Error message
2ae0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 22 0a 20 20 20   not found.".   
2af0: 20 20 20 20 20 20 20 20 20 73 55 52 4c 20 3d 20           sURL = 
2b00: 22 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  "".            p
2b10: 72 69 6e 74 28 73 4d 73 67 20 2b 20 22 20 41 63  rint(sMsg + " Ac
2b20: 74 69 6f 6e 20 69 64 3a 20 22 20 2b 20 73 49 64  tion id: " + sId
2b30: 41 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20 20  Action).        
2b40: 65 6c 73 65 3a 0a 20 20 20 20 20 20 20 20 20 20  else:.          
2b50: 20 20 73 4d 73 67 20 3d 20 73 41 63 74 69 6f 6e    sMsg = sAction
2b60: 5b 69 4d 73 67 2b 33 3a 5d 2e 73 74 72 69 70 28  [iMsg+3:].strip(
2b70: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  ).            sA
2b80: 63 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 5b  ction = sAction[
2b90: 3a 69 4d 73 67 5d 2e 73 74 72 69 70 28 29 0a 20  :iMsg].strip(). 
2ba0: 20 20 20 20 20 20 20 20 20 20 20 73 55 52 4c 20             sURL 
2bb0: 3d 20 22 22 0a 20 20 20 20 20 20 20 20 20 20 20  = "".           
2bc0: 20 6d 55 52 4c 20 3d 20 72 65 2e 73 65 61 72 63   mURL = re.searc
2bd0: 68 28 22 5b 7c 5d 20 2a 28 68 74 74 70 73 3f 3a  h("[|] *(https?:
2be0: 2f 2f 2e 2a 29 22 2c 20 73 4d 73 67 29 0a 20 20  //.*)", sMsg).  
2bf0: 20 20 20 20 20 20 20 20 20 20 69 66 20 6d 55 52            if mUR
2c00: 4c 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L:.             
2c10: 20 20 20 73 55 52 4c 20 3d 20 6d 55 52 4c 2e 67     sURL = mURL.g
2c20: 72 6f 75 70 28 31 29 2e 73 74 72 69 70 28 29 0a  roup(1).strip().
2c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c40: 73 4d 73 67 20 3d 20 73 4d 73 67 5b 3a 6d 55 52  sMsg = sMsg[:mUR
2c50: 4c 2e 73 74 61 72 74 28 30 29 5d 2e 73 74 72 69  L.start(0)].stri
2c60: 70 28 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  p().            
2c70: 69 66 20 73 4d 73 67 5b 30 3a 31 5d 20 3d 3d 20  if sMsg[0:1] == 
2c80: 22 3d 22 3a 0a 20 20 20 20 20 20 20 20 20 20 20  "=":.           
2c90: 20 20 20 20 20 73 4d 73 67 20 3d 20 70 72 65 70       sMsg = prep
2ca0: 61 72 65 46 75 6e 63 74 69 6f 6e 28 73 4d 73 67  areFunction(sMsg
2cb0: 5b 31 3a 5d 29 0a 20 20 20 20 20 20 20 20 20 20  [1:]).          
2cc0: 20 20 20 20 20 20 6c 46 55 4e 43 54 49 4f 4e 53        lFUNCTIONS
2cd0: 2e 61 70 70 65 6e 64 28 28 22 6d 5f 22 2b 73 49  .append(("m_"+sI
2ce0: 64 41 63 74 69 6f 6e 2c 20 73 4d 73 67 29 29 0a  dAction, sMsg)).
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 66 6f 72 20 78 20 69 6e 20 72 65 2e 66 69 6e 64  for x in re.find
2d10: 69 74 65 72 28 22 67 72 6f 75 70 5b 28 5d 28 5c  iter("group[(](\
2d20: 64 2b 29 5b 29 5d 22 2c 20 73 4d 73 67 29 3a 0a  d+)[)]", sMsg):.
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d40: 20 20 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f      if int(x.gro
2d50: 75 70 28 31 29 29 20 3e 20 6e 47 72 6f 75 70 3a  up(1)) > nGroup:
2d60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d70: 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22           print("
2d80: 23 20 45 72 72 6f 72 20 69 6e 20 67 72 6f 75 70  # Error in group
2d90: 73 20 69 6e 20 6d 65 73 73 61 67 65 20 61 74 20  s in message at 
2da0: 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63 74 69  line " + sIdActi
2db0: 6f 6e 20 2b 20 22 20 28 22 2b 73 74 72 28 6e 47  on + " ("+str(nG
2dc0: 72 6f 75 70 29 2b 22 20 67 72 6f 75 70 73 20 6f  roup)+" groups o
2dd0: 6e 6c 79 29 22 29 0a 20 20 20 20 20 20 20 20 20  nly)").         
2de0: 20 20 20 20 20 20 20 73 4d 73 67 20 3d 20 22 3d         sMsg = "=
2df0: 6d 5f 22 2b 73 49 64 41 63 74 69 6f 6e 0a 20 20  m_"+sIdAction.  
2e00: 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a            else:.
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 66 6f 72 20 78 20 69 6e 20 72 65 2e 66 69 6e 64  for x in re.find
2e30: 69 74 65 72 28 72 22 5c 5c 28 5c 64 2b 29 22 2c  iter(r"\\(\d+)",
2e40: 20 73 4d 73 67 29 3a 0a 20 20 20 20 20 20 20 20   sMsg):.        
2e50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69              if i
2e60: 6e 74 28 78 2e 67 72 6f 75 70 28 31 29 29 20 3e  nt(x.group(1)) >
2e70: 20 6e 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20   nGroup:.       
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20   print("# Error 
2ea0: 69 6e 20 67 72 6f 75 70 73 20 69 6e 20 6d 65 73  in groups in mes
2eb0: 73 61 67 65 20 61 74 20 6c 69 6e 65 20 22 20 2b  sage at line " +
2ec0: 20 73 49 64 41 63 74 69 6f 6e 20 2b 20 22 20 28   sIdAction + " (
2ed0: 22 2b 73 74 72 28 6e 47 72 6f 75 70 29 2b 22 20  "+str(nGroup)+" 
2ee0: 67 72 6f 75 70 73 20 6f 6e 6c 79 29 22 29 0a 20  groups only)"). 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2f00: 66 20 72 65 2e 73 65 61 72 63 68 28 22 5b 2e 5d  f re.search("[.]
2f10: 5c 5c 77 2b 5b 28 5d 22 2c 20 73 4d 73 67 29 3a  \\w+[(]", sMsg):
2f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f30: 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45 72       print("# Er
2f40: 72 6f 72 20 69 6e 20 6d 65 73 73 61 67 65 20 61  ror in message a
2f50: 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63  t line " + sIdAc
2f60: 74 69 6f 6e 20 2b 20 22 3a 20 20 54 68 69 73 20  tion + ":  This 
2f70: 6d 65 73 73 61 67 65 20 6c 6f 6f 6b 73 20 6c 69  message looks li
2f80: 6b 65 20 63 6f 64 65 2e 20 4c 69 6e 65 20 73 68  ke code. Line sh
2f90: 6f 75 6c 64 20 62 65 67 69 6e 20 77 69 74 68 20  ould begin with 
2fa0: 3d 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  =").            
2fb0: 0a 20 20 20 20 69 66 20 73 41 63 74 69 6f 6e 5b  .    if sAction[
2fc0: 30 3a 31 5d 20 3d 3d 20 22 3d 22 20 6f 72 20 63  0:1] == "=" or c
2fd0: 41 63 74 69 6f 6e 20 3d 3d 20 22 3d 22 3a 0a 20  Action == "=":. 
2fe0: 20 20 20 20 20 20 20 69 66 20 22 64 65 66 69 6e         if "defin
2ff0: 65 22 20 69 6e 20 73 41 63 74 69 6f 6e 20 61 6e  e" in sAction an
3000: 64 20 6e 6f 74 20 72 65 2e 73 65 61 72 63 68 28  d not re.search(
3010: 72 22 64 65 66 69 6e 65 5c 28 5c 5c 5c 64 2b 20  r"define\(\\\d+ 
3020: 2a 2c 20 2a 5c 5b 2e 2a 5c 5d 20 2a 5c 29 22 2c  *, *\[.*\] *\)",
3030: 20 73 41 63 74 69 6f 6e 29 3a 0a 20 20 20 20 20   sAction):.     
3040: 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20         print("# 
3050: 45 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20  Error in action 
3060: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41  at line " + sIdA
3070: 63 74 69 6f 6e 20 2b 20 22 3a 20 73 65 63 6f 6e  ction + ": secon
3080: 64 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 64  d argument for d
3090: 65 66 69 6e 65 20 6d 75 73 74 20 62 65 20 61 20  efine must be a 
30a0: 6c 69 73 74 20 6f 66 20 73 74 72 69 6e 67 73 22  list of strings"
30b0: 29 0a 20 20 20 20 20 20 20 20 73 41 63 74 69 6f  ).        sActio
30c0: 6e 20 3d 20 70 72 65 70 61 72 65 46 75 6e 63 74  n = prepareFunct
30d0: 69 6f 6e 28 73 41 63 74 69 6f 6e 29 0a 20 20 20  ion(sAction).   
30e0: 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73       sAction = s
30f0: 41 63 74 69 6f 6e 2e 72 65 70 6c 61 63 65 28 22  Action.replace("
3100: 6d 2e 67 72 6f 75 70 28 69 5b 34 5d 29 22 2c 20  m.group(i[4])", 
3110: 22 6d 2e 67 72 6f 75 70 28 22 2b 73 74 72 28 69  "m.group("+str(i
3120: 47 72 6f 75 70 29 2b 22 29 22 29 0a 20 20 20 20  Group)+")").    
3130: 20 20 20 20 66 6f 72 20 78 20 69 6e 20 72 65 2e      for x in re.
3140: 66 69 6e 64 69 74 65 72 28 22 67 72 6f 75 70 5b  finditer("group[
3150: 28 5d 28 5c 64 2b 29 5b 29 5d 22 2c 20 73 41 63  (](\d+)[)]", sAc
3160: 74 69 6f 6e 29 3a 0a 20 20 20 20 20 20 20 20 20  tion):.         
3170: 20 20 20 69 66 20 69 6e 74 28 78 2e 67 72 6f 75     if int(x.grou
3180: 70 28 31 29 29 20 3e 20 6e 47 72 6f 75 70 3a 0a  p(1)) > nGroup:.
3190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a0: 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69  print("# Error i
31b0: 6e 20 67 72 6f 75 70 73 20 69 6e 20 72 65 70 6c  n groups in repl
31c0: 61 63 65 6d 65 6e 74 20 61 74 20 6c 69 6e 65 20  acement at line 
31d0: 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20  " + sIdAction + 
31e0: 22 20 28 22 2b 73 74 72 28 6e 47 72 6f 75 70 29  " ("+str(nGroup)
31f0: 2b 22 20 67 72 6f 75 70 73 20 6f 6e 6c 79 29 22  +" groups only)"
3200: 29 0a 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20  ).    else:.    
3210: 20 20 20 20 66 6f 72 20 78 20 69 6e 20 72 65 2e      for x in re.
3220: 66 69 6e 64 69 74 65 72 28 72 22 5c 5c 28 5c 64  finditer(r"\\(\d
3230: 2b 29 22 2c 20 73 41 63 74 69 6f 6e 29 3a 0a 20  +)", sAction):. 
3240: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 69 6e             if in
3250: 74 28 78 2e 67 72 6f 75 70 28 31 29 29 20 3e 20  t(x.group(1)) > 
3260: 6e 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20 20  nGroup:.        
3270: 20 20 20 20 20 20 20 20 70 72 69 6e 74 28 22 23          print("#
3280: 20 45 72 72 6f 72 20 69 6e 20 67 72 6f 75 70 73   Error in groups
3290: 20 69 6e 20 72 65 70 6c 61 63 65 6d 65 6e 74 20   in replacement 
32a0: 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41  at line " + sIdA
32b0: 63 74 69 6f 6e 20 2b 20 22 20 28 22 2b 73 74 72  ction + " ("+str
32c0: 28 6e 47 72 6f 75 70 29 2b 22 20 67 72 6f 75 70  (nGroup)+" group
32d0: 73 20 6f 6e 6c 79 29 22 29 0a 20 20 20 20 20 20  s only)").      
32e0: 20 20 69 66 20 72 65 2e 73 65 61 72 63 68 28 22    if re.search("
32f0: 5b 2e 5d 5c 5c 77 2b 5b 28 5d 7c 73 75 67 67 5c  [.]\\w+[(]|sugg\
3300: 5c 77 2b 5b 28 5d 22 2c 20 73 41 63 74 69 6f 6e  \w+[(]", sAction
3310: 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ):.            p
3320: 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e  rint("# Error in
3330: 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20   action at line 
3340: 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20  " + sIdAction + 
3350: 22 3a 20 20 54 68 69 73 20 61 63 74 69 6f 6e 20  ":  This action 
3360: 6c 6f 6f 6b 73 20 6c 69 6b 65 20 63 6f 64 65 2e  looks like code.
3370: 20 4c 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 67   Line should beg
3380: 69 6e 20 77 69 74 68 20 3d 22 29 0a 0a 20 20 20  in with =")..   
3390: 20 69 66 20 63 41 63 74 69 6f 6e 20 3d 3d 20 22   if cAction == "
33a0: 2d 22 3a 0a 20 20 20 20 20 20 20 20 23 23 20 65  -":.        ## e
33b0: 72 72 6f 72 20 64 65 74 65 63 74 65 64 20 2d 2d  rror detected --
33c0: 3e 20 73 75 67 67 65 73 74 69 6f 6e 0a 20 20 20  > suggestion.   
33d0: 20 20 20 20 20 69 66 20 6e 6f 74 20 73 41 63 74       if not sAct
33e0: 69 6f 6e 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ion:.           
33f0: 20 70 72 69 6e 74 28 22 23 20 45 72 72 6f 72 20   print("# Error 
3400: 69 6e 20 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e  in action at lin
3410: 65 20 22 20 2b 20 73 49 64 41 63 74 69 6f 6e 20  e " + sIdAction 
3420: 2b 20 22 3a 20 20 54 68 69 73 20 61 63 74 69 6f  + ":  This actio
3430: 6e 20 69 73 20 65 6d 70 74 79 2e 22 29 0a 20 20  n is empty.").  
3440: 20 20 20 20 20 20 69 66 20 73 41 63 74 69 6f 6e        if sAction
3450: 5b 30 3a 31 5d 20 3d 3d 20 22 3d 22 3a 0a 20 20  [0:1] == "=":.  
3460: 20 20 20 20 20 20 20 20 20 20 6c 46 55 4e 43 54            lFUNCT
3470: 49 4f 4e 53 2e 61 70 70 65 6e 64 28 28 22 73 5f  IONS.append(("s_
3480: 22 2b 73 49 64 41 63 74 69 6f 6e 2c 20 73 41 63  "+sIdAction, sAc
3490: 74 69 6f 6e 5b 31 3a 5d 29 29 0a 20 20 20 20 20  tion[1:])).     
34a0: 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20 3d         sAction =
34b0: 20 22 3d 73 5f 22 2b 73 49 64 41 63 74 69 6f 6e   "=s_"+sIdAction
34c0: 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 41  .        elif sA
34d0: 63 74 69 6f 6e 2e 73 74 61 72 74 73 77 69 74 68  ction.startswith
34e0: 28 27 22 27 29 20 61 6e 64 20 73 41 63 74 69 6f  ('"') and sActio
34f0: 6e 2e 65 6e 64 73 77 69 74 68 28 27 22 27 29 3a  n.endswith('"'):
3500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63  .            sAc
3510: 74 69 6f 6e 20 3d 20 73 41 63 74 69 6f 6e 5b 31  tion = sAction[1
3520: 3a 2d 31 5d 0a 20 20 20 20 20 20 20 20 69 66 20  :-1].        if 
3530: 6e 6f 74 20 73 4d 73 67 3a 0a 20 20 20 20 20 20  not sMsg:.      
3540: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 45        print("# E
3550: 72 72 6f 72 20 69 6e 20 61 63 74 69 6f 6e 20 61  rror in action a
3560: 74 20 6c 69 6e 65 20 22 20 2b 20 73 49 64 41 63  t line " + sIdAc
3570: 74 69 6f 6e 20 2b 20 22 3a 20 20 74 68 65 20 6d  tion + ":  the m
3580: 65 73 73 61 67 65 20 69 73 20 65 6d 70 74 79 2e  essage is empty.
3590: 22 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ").        retur
35a0: 6e 20 5b 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63  n [sCondition, c
35b0: 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c  Action, sAction,
35c0: 20 69 47 72 6f 75 70 2c 20 73 4d 73 67 2c 20 73   iGroup, sMsg, s
35d0: 55 52 4c 5d 0a 20 20 20 20 65 6c 69 66 20 63 41  URL].    elif cA
35e0: 63 74 69 6f 6e 20 3d 3d 20 22 7e 22 3a 0a 20 20  ction == "~":.  
35f0: 20 20 20 20 20 20 23 23 20 74 65 78 74 20 70 72        ## text pr
3600: 6f 63 65 73 73 6f 72 0a 20 20 20 20 20 20 20 20  ocessor.        
3610: 69 66 20 6e 6f 74 20 73 41 63 74 69 6f 6e 3a 0a  if not sAction:.
3620: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
3630: 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20 61 63  t("# Error in ac
3640: 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 22 20 2b  tion at line " +
3650: 20 73 49 64 41 63 74 69 6f 6e 20 2b 20 22 3a 20   sIdAction + ": 
3660: 20 54 68 69 73 20 61 63 74 69 6f 6e 20 69 73 20   This action is 
3670: 65 6d 70 74 79 2e 22 29 0a 20 20 20 20 20 20 20  empty.").       
3680: 20 69 66 20 73 41 63 74 69 6f 6e 5b 30 3a 31 5d   if sAction[0:1]
3690: 20 3d 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20   == "=":.       
36a0: 20 20 20 20 20 6c 46 55 4e 43 54 49 4f 4e 53 2e       lFUNCTIONS.
36b0: 61 70 70 65 6e 64 28 28 22 70 5f 22 2b 73 49 64  append(("p_"+sId
36c0: 41 63 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 5b  Action, sAction[
36d0: 31 3a 5d 29 29 0a 20 20 20 20 20 20 20 20 20 20  1:])).          
36e0: 20 20 73 41 63 74 69 6f 6e 20 3d 20 22 3d 70 5f    sAction = "=p_
36f0: 22 2b 73 49 64 41 63 74 69 6f 6e 0a 20 20 20 20  "+sIdAction.    
3700: 20 20 20 20 65 6c 69 66 20 73 41 63 74 69 6f 6e      elif sAction
3710: 2e 73 74 61 72 74 73 77 69 74 68 28 27 22 27 29  .startswith('"')
3720: 20 61 6e 64 20 73 41 63 74 69 6f 6e 2e 65 6e 64   and sAction.end
3730: 73 77 69 74 68 28 27 22 27 29 3a 0a 20 20 20 20  swith('"'):.    
3740: 20 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20          sAction 
3750: 3d 20 73 41 63 74 69 6f 6e 5b 31 3a 2d 31 5d 0a  = sAction[1:-1].
3760: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
3770: 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74  sCondition, cAct
3780: 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 2c 20 69 47  ion, sAction, iG
3790: 72 6f 75 70 5d 0a 20 20 20 20 65 6c 69 66 20 63  roup].    elif c
37a0: 41 63 74 69 6f 6e 20 3d 3d 20 22 3d 22 3a 0a 20  Action == "=":. 
37b0: 20 20 20 20 20 20 20 23 23 20 64 69 73 61 6d 62         ## disamb
37c0: 69 67 75 61 74 6f 72 0a 20 20 20 20 20 20 20 20  iguator.        
37d0: 69 66 20 73 41 63 74 69 6f 6e 5b 30 3a 31 5d 20  if sAction[0:1] 
37e0: 3d 3d 20 22 3d 22 3a 0a 20 20 20 20 20 20 20 20  == "=":.        
37f0: 20 20 20 20 73 41 63 74 69 6f 6e 20 3d 20 73 41      sAction = sA
3800: 63 74 69 6f 6e 5b 31 3a 5d 0a 20 20 20 20 20 20  ction[1:].      
3810: 20 20 69 66 20 6e 6f 74 20 73 41 63 74 69 6f 6e    if not sAction
3820: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72  :.            pr
3830: 69 6e 74 28 22 23 20 45 72 72 6f 72 20 69 6e 20  int("# Error in 
3840: 61 63 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 22  action at line "
3850: 20 2b 20 73 49 64 41 63 74 69 6f 6e 20 2b 20 22   + sIdAction + "
3860: 3a 20 20 54 68 69 73 20 61 63 74 69 6f 6e 20 69  :  This action i
3870: 73 20 65 6d 70 74 79 2e 22 29 0a 20 20 20 20 20  s empty.").     
3880: 20 20 20 6c 46 55 4e 43 54 49 4f 4e 53 2e 61 70     lFUNCTIONS.ap
3890: 70 65 6e 64 28 28 22 64 5f 22 2b 73 49 64 41 63  pend(("d_"+sIdAc
38a0: 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 29 29 0a  tion, sAction)).
38b0: 20 20 20 20 20 20 20 20 73 41 63 74 69 6f 6e 20          sAction 
38c0: 3d 20 22 64 5f 22 2b 73 49 64 41 63 74 69 6f 6e  = "d_"+sIdAction
38d0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
38e0: 5b 73 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63  [sCondition, cAc
38f0: 74 69 6f 6e 2c 20 73 41 63 74 69 6f 6e 5d 0a 20  tion, sAction]. 
3900: 20 20 20 65 6c 69 66 20 63 41 63 74 69 6f 6e 20     elif cAction 
3910: 3d 3d 20 22 3e 22 3a 0a 20 20 20 20 20 20 20 20  == ">":.        
3920: 23 23 20 6e 6f 20 61 63 74 69 6f 6e 2c 20 62 72  ## no action, br
3930: 65 61 6b 20 6c 6f 6f 70 20 69 66 20 63 6f 6e 64  eak loop if cond
3940: 69 74 69 6f 6e 20 69 73 20 46 61 6c 73 65 0a 20  ition is False. 
3950: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73         return [s
3960: 43 6f 6e 64 69 74 69 6f 6e 2c 20 63 41 63 74 69  Condition, cActi
3970: 6f 6e 2c 20 22 22 5d 0a 20 20 20 20 65 6c 73 65  on, ""].    else
3980: 3a 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 28  :.        print(
3990: 22 23 20 55 6e 6b 6e 6f 77 6e 20 61 63 74 69 6f  "# Unknown actio
39a0: 6e 20 61 74 20 6c 69 6e 65 20 22 20 2b 20 73 49  n at line " + sI
39b0: 64 41 63 74 69 6f 6e 29 0a 20 20 20 20 20 20 20  dAction).       
39c0: 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 0a 0a 64   return None...d
39d0: 65 66 20 5f 63 61 6c 63 52 75 6c 65 73 53 74 61  ef _calcRulesSta
39e0: 74 73 20 28 6c 52 75 6c 65 73 29 3a 0a 20 20 20  ts (lRules):.   
39f0: 20 64 20 3d 20 7b 27 3d 27 3a 30 2c 20 27 7e 27   d = {'=':0, '~'
3a00: 3a 20 30 2c 20 27 2d 27 3a 20 30 2c 20 27 3e 27  : 0, '-': 0, '>'
3a10: 3a 20 30 7d 0a 20 20 20 20 66 6f 72 20 61 52 75  : 0}.    for aRu
3a20: 6c 65 20 69 6e 20 6c 52 75 6c 65 73 3a 0a 20 20  le in lRules:.  
3a30: 20 20 20 20 20 20 66 6f 72 20 61 41 63 74 69 6f        for aActio
3a40: 6e 20 69 6e 20 61 52 75 6c 65 5b 36 5d 3a 0a 20  n in aRule[6]:. 
3a50: 20 20 20 20 20 20 20 20 20 20 20 64 5b 61 41 63             d[aAc
3a60: 74 69 6f 6e 5b 31 5d 5d 20 3d 20 64 5b 61 41 63  tion[1]] = d[aAc
3a70: 74 69 6f 6e 5b 31 5d 5d 20 2b 20 31 0a 20 20 20  tion[1]] + 1.   
3a80: 20 72 65 74 75 72 6e 20 28 64 2c 20 6c 65 6e 28   return (d, len(
3a90: 6c 52 75 6c 65 73 29 29 0a 0a 0a 64 65 66 20 64  lRules))...def d
3aa0: 69 73 70 6c 61 79 53 74 61 74 73 20 28 6c 50 61  isplayStats (lPa
3ab0: 72 61 67 72 61 70 68 52 75 6c 65 73 2c 20 6c 53  ragraphRules, lS
3ac0: 65 6e 74 65 6e 63 65 52 75 6c 65 73 29 3a 0a 20  entenceRules):. 
3ad0: 20 20 20 70 72 69 6e 74 28 22 20 20 7b 3a 3e 31     print("  {:>1
3ae0: 38 7d 20 7b 3a 3e 31 38 7d 20 7b 3a 3e 31 38 7d  8} {:>18} {:>18}
3af0: 20 7b 3a 3e 31 38 7d 22 2e 66 6f 72 6d 61 74 28   {:>18}".format(
3b00: 22 44 49 53 41 4d 42 49 47 55 41 54 4f 52 22 2c  "DISAMBIGUATOR",
3b10: 20 22 54 45 58 54 20 50 52 4f 43 45 53 53 4f 52   "TEXT PROCESSOR
3b20: 22 2c 20 22 47 52 41 4d 4d 41 52 20 43 48 45 43  ", "GRAMMAR CHEC
3b30: 4b 49 4e 47 22 2c 20 22 52 45 47 45 58 22 29 29  KING", "REGEX"))
3b40: 0a 20 20 20 20 64 2c 20 6e 52 75 6c 65 20 3d 20  .    d, nRule = 
3b50: 5f 63 61 6c 63 52 75 6c 65 73 53 74 61 74 73 28  _calcRulesStats(
3b60: 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73 29  lParagraphRules)
3b70: 0a 20 20 20 20 70 72 69 6e 74 28 22 c2 a7 20 7b  .    print(".. {
3b80: 3a 3e 31 30 7d 20 61 63 74 69 6f 6e 73 20 7b 3a  :>10} actions {:
3b90: 3e 31 30 7d 20 61 63 74 69 6f 6e 73 20 7b 3a 3e  >10} actions {:>
3ba0: 31 30 7d 20 61 63 74 69 6f 6e 73 20 20 69 6e 20  10} actions  in 
3bb0: 7b 3a 3e 38 7d 20 72 75 6c 65 73 22 2e 66 6f 72  {:>8} rules".for
3bc0: 6d 61 74 28 64 5b 27 3d 27 5d 2c 20 64 5b 27 7e  mat(d['='], d['~
3bd0: 27 5d 2c 20 64 5b 27 2d 27 5d 2c 20 6e 52 75 6c  '], d['-'], nRul
3be0: 65 29 29 0a 20 20 20 20 64 2c 20 6e 52 75 6c 65  e)).    d, nRule
3bf0: 20 3d 20 5f 63 61 6c 63 52 75 6c 65 73 53 74 61   = _calcRulesSta
3c00: 74 73 28 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65  ts(lSentenceRule
3c10: 73 29 0a 20 20 20 20 70 72 69 6e 74 28 22 73 20  s).    print("s 
3c20: 7b 3a 3e 31 30 7d 20 61 63 74 69 6f 6e 73 20 7b  {:>10} actions {
3c30: 3a 3e 31 30 7d 20 61 63 74 69 6f 6e 73 20 7b 3a  :>10} actions {:
3c40: 3e 31 30 7d 20 61 63 74 69 6f 6e 73 20 20 69 6e  >10} actions  in
3c50: 20 7b 3a 3e 38 7d 20 72 75 6c 65 73 22 2e 66 6f   {:>8} rules".fo
3c60: 72 6d 61 74 28 64 5b 27 3d 27 5d 2c 20 64 5b 27  rmat(d['='], d['
3c70: 7e 27 5d 2c 20 64 5b 27 2d 27 5d 2c 20 6e 52 75  ~'], d['-'], nRu
3c80: 6c 65 29 29 0a 0a 0a 64 65 66 20 6d 65 72 67 65  le))...def merge
3c90: 52 75 6c 65 73 42 79 4f 70 74 69 6f 6e 20 28 6c  RulesByOption (l
3ca0: 52 75 6c 65 73 29 3a 0a 20 20 20 20 22 72 65 74  Rules):.    "ret
3cb0: 75 72 6e 73 20 61 20 6c 69 73 74 20 6f 66 20 74  urns a list of t
3cc0: 75 70 6c 65 73 20 5b 6f 70 74 69 6f 6e 2c 20 6c  uples [option, l
3cd0: 69 73 74 20 6f 66 20 72 75 6c 65 73 5d 20 6b 65  ist of rules] ke
3ce0: 65 70 69 6e 67 20 74 68 65 20 72 75 6c 65 73 20  eping the rules 
3cf0: 6f 72 64 65 72 22 0a 20 20 20 20 6c 46 69 6e 61  order".    lFina
3d00: 6c 20 3d 20 5b 5d 0a 20 20 20 20 6c 54 65 6d 70  l = [].    lTemp
3d10: 20 3d 20 5b 5d 0a 20 20 20 20 73 4f 70 74 69 6f   = [].    sOptio
3d20: 6e 20 3d 20 4e 6f 6e 65 0a 20 20 20 20 66 6f 72  n = None.    for
3d30: 20 61 52 75 6c 65 20 69 6e 20 6c 52 75 6c 65 73   aRule in lRules
3d40: 3a 0a 20 20 20 20 20 20 20 20 69 66 20 61 52 75  :.        if aRu
3d50: 6c 65 5b 30 5d 20 21 3d 20 73 4f 70 74 69 6f 6e  le[0] != sOption
3d60: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  :.            if
3d70: 20 73 4f 70 74 69 6f 6e 20 21 3d 20 4e 6f 6e 65   sOption != None
3d80: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
3d90: 20 20 6c 46 69 6e 61 6c 2e 61 70 70 65 6e 64 28    lFinal.append(
3da0: 5b 73 4f 70 74 69 6f 6e 2c 20 6c 54 65 6d 70 5d  [sOption, lTemp]
3db0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 23 20  ).            # 
3dc0: 6e 65 77 20 74 75 70 6c 65 0a 20 20 20 20 20 20  new tuple.      
3dd0: 20 20 20 20 20 20 73 4f 70 74 69 6f 6e 20 3d 20        sOption = 
3de0: 61 52 75 6c 65 5b 30 5d 0a 20 20 20 20 20 20 20  aRule[0].       
3df0: 20 20 20 20 20 6c 54 65 6d 70 20 3d 20 5b 5d 0a       lTemp = [].
3e00: 20 20 20 20 20 20 20 20 6c 54 65 6d 70 2e 61 70          lTemp.ap
3e10: 70 65 6e 64 28 61 52 75 6c 65 5b 31 3a 5d 29 0a  pend(aRule[1:]).
3e20: 20 20 20 20 6c 46 69 6e 61 6c 2e 61 70 70 65 6e      lFinal.appen
3e30: 64 28 5b 73 4f 70 74 69 6f 6e 2c 20 6c 54 65 6d  d([sOption, lTem
3e40: 70 5d 29 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  p]).    return l
3e50: 46 69 6e 61 6c 0a 0a 0a 64 65 66 20 70 72 65 70  Final...def prep
3e60: 61 72 65 4f 70 74 69 6f 6e 73 20 28 6c 4f 70 74  areOptions (lOpt
3e70: 69 6f 6e 4c 69 6e 65 73 29 3a 0a 20 20 20 20 22  ionLines):.    "
3e80: 72 65 74 75 72 6e 73 20 61 20 64 69 63 74 69 6f  returns a dictio
3e90: 6e 61 72 79 20 77 69 74 68 20 64 61 74 61 20 61  nary with data a
3ea0: 62 6f 75 74 20 6f 70 74 69 6f 6e 73 22 0a 20 20  bout options".  
3eb0: 20 20 73 4c 61 6e 67 20 3d 20 22 22 0a 20 20 20    sLang = "".   
3ec0: 20 73 44 65 66 61 75 6c 74 55 49 4c 61 6e 67 20   sDefaultUILang 
3ed0: 3d 20 22 22 0a 20 20 20 20 6c 53 74 72 75 63 74  = "".    lStruct
3ee0: 4f 70 74 20 3d 20 5b 5d 0a 20 20 20 20 6c 4f 70  Opt = [].    lOp
3ef0: 74 20 3d 20 5b 5d 0a 20 20 20 20 64 4f 70 74 4c  t = [].    dOptL
3f00: 61 62 65 6c 20 3d 20 7b 7d 0a 20 20 20 20 64 4f  abel = {}.    dO
3f10: 70 74 50 72 69 6f 72 69 74 79 20 3d 20 7b 7d 0a  ptPriority = {}.
3f20: 20 20 20 20 66 6f 72 20 73 4c 69 6e 65 20 69 6e      for sLine in
3f30: 20 6c 4f 70 74 69 6f 6e 4c 69 6e 65 73 3a 0a 20   lOptionLines:. 
3f40: 20 20 20 20 20 20 20 73 4c 69 6e 65 20 3d 20 73         sLine = s
3f50: 4c 69 6e 65 2e 73 74 72 69 70 28 29 0a 20 20 20  Line.strip().   
3f60: 20 20 20 20 20 69 66 20 73 4c 69 6e 65 2e 73 74       if sLine.st
3f70: 61 72 74 73 77 69 74 68 28 22 4f 50 54 47 52 4f  artswith("OPTGRO
3f80: 55 50 2f 22 29 3a 0a 20 20 20 20 20 20 20 20 20  UP/"):.         
3f90: 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28     m = re.match(
3fa0: 22 4f 50 54 47 52 4f 55 50 2f 28 5b 61 2d 7a 30  "OPTGROUP/([a-z0
3fb0: 2d 39 5d 2b 29 3a 28 2e 2b 29 24 22 2c 20 73 4c  -9]+):(.+)$", sL
3fc0: 69 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20 20  ine).           
3fd0: 20 6c 53 74 72 75 63 74 4f 70 74 2e 61 70 70 65   lStructOpt.appe
3fe0: 6e 64 28 20 28 6d 2e 67 72 6f 75 70 28 31 29 2c  nd( (m.group(1),
3ff0: 20 6c 69 73 74 28 6d 61 70 28 73 74 72 2e 73 70   list(map(str.sp
4000: 6c 69 74 2c 20 6d 2e 67 72 6f 75 70 28 32 29 2e  lit, m.group(2).
4010: 73 70 6c 69 74 28 22 2c 22 29 29 29 29 20 29 0a  split(",")))) ).
4020: 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69          elif sLi
4030: 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 4f  ne.startswith("O
4040: 50 54 53 4f 46 54 57 41 52 45 3a 22 29 3a 0a 20  PTSOFTWARE:"):. 
4050: 20 20 20 20 20 20 20 20 20 20 20 6c 4f 70 74 20             lOpt 
4060: 3d 20 5b 20 5b 73 2c 20 7b 7d 5d 20 20 66 6f 72  = [ [s, {}]  for
4070: 20 73 20 69 6e 20 73 4c 69 6e 65 5b 31 32 3a 5d   s in sLine[12:]
4080: 2e 73 74 72 69 70 28 29 2e 73 70 6c 69 74 28 29  .strip().split()
4090: 20 5d 20 20 23 20 64 6f 6e e2 80 99 74 20 75 73   ]  # don...t us
40a0: 65 20 74 75 70 6c 65 73 20 28 73 2c 20 7b 7d 29  e tuples (s, {})
40b0: 2c 20 62 65 63 61 75 73 65 20 75 6e 6b 6e 6f 77  , because unknow
40c0: 6e 20 74 6f 20 4a 53 0a 20 20 20 20 20 20 20 20  n to JS.        
40d0: 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74  elif sLine.start
40e0: 73 77 69 74 68 28 22 4f 50 54 2f 22 29 3a 0a 20  swith("OPT/"):. 
40f0: 20 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20 72             m = r
4100: 65 2e 6d 61 74 63 68 28 22 4f 50 54 2f 28 5b 61  e.match("OPT/([a
4110: 2d 7a 30 2d 39 5d 2b 29 3a 28 2e 2b 29 24 22 2c  -z0-9]+):(.+)$",
4120: 20 73 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20   sLine).        
4130: 20 20 20 20 66 6f 72 20 69 2c 20 73 4f 70 74 20      for i, sOpt 
4140: 69 6e 20 65 6e 75 6d 65 72 61 74 65 28 6d 2e 67  in enumerate(m.g
4150: 72 6f 75 70 28 32 29 2e 73 70 6c 69 74 28 29 29  roup(2).split())
4160: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
4170: 20 20 6c 4f 70 74 5b 69 5d 5b 31 5d 5b 6d 2e 67    lOpt[i][1][m.g
4180: 72 6f 75 70 28 31 29 5d 20 3d 20 20 65 76 61 6c  roup(1)] =  eval
4190: 28 73 4f 70 74 29 0a 20 20 20 20 20 20 20 20 65  (sOpt).        e
41a0: 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73  lif sLine.starts
41b0: 77 69 74 68 28 22 4f 50 54 50 52 49 4f 52 49 54  with("OPTPRIORIT
41c0: 59 2f 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  Y/"):.          
41d0: 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68 28 22    m = re.match("
41e0: 4f 50 54 50 52 49 4f 52 49 54 59 2f 28 5b 61 2d  OPTPRIORITY/([a-
41f0: 7a 30 2d 39 5d 2b 29 3a 20 2a 28 5b 30 2d 39 5d  z0-9]+): *([0-9]
4200: 29 24 22 2c 20 73 4c 69 6e 65 29 0a 20 20 20 20  )$", sLine).    
4210: 20 20 20 20 20 20 20 20 64 4f 70 74 50 72 69 6f          dOptPrio
4220: 72 69 74 79 5b 6d 2e 67 72 6f 75 70 28 31 29 5d  rity[m.group(1)]
4230: 20 3d 20 69 6e 74 28 6d 2e 67 72 6f 75 70 28 32   = int(m.group(2
4240: 29 29 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20  )).        elif 
4250: 73 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68  sLine.startswith
4260: 28 22 4f 50 54 4c 41 4e 47 2f 22 29 3a 0a 20 20  ("OPTLANG/"):.  
4270: 20 20 20 20 20 20 20 20 20 20 6d 20 3d 20 72 65            m = re
4280: 2e 6d 61 74 63 68 28 22 4f 50 54 4c 41 4e 47 2f  .match("OPTLANG/
4290: 28 5b 61 2d 7a 5d 5b 61 2d 7a 5d 28 3f 3a 5f 5b  ([a-z][a-z](?:_[
42a0: 41 2d 5a 5d 5b 41 2d 5a 5d 7c 29 29 3a 28 2e 2b  A-Z][A-Z]|)):(.+
42b0: 29 24 22 2c 20 73 4c 69 6e 65 29 0a 20 20 20 20  )$", sLine).    
42c0: 20 20 20 20 20 20 20 20 73 4c 61 6e 67 20 3d 20          sLang = 
42d0: 6d 2e 67 72 6f 75 70 28 31 29 5b 3a 32 5d 0a 20  m.group(1)[:2]. 
42e0: 20 20 20 20 20 20 20 20 20 20 20 64 4f 70 74 4c             dOptL
42f0: 61 62 65 6c 5b 73 4c 61 6e 67 5d 20 3d 20 7b 20  abel[sLang] = { 
4300: 22 5f 5f 6f 70 74 69 6f 6e 74 69 74 6c 65 5f 5f  "__optiontitle__
4310: 22 3a 20 6d 2e 67 72 6f 75 70 28 32 29 2e 73 74  ": m.group(2).st
4320: 72 69 70 28 29 20 7d 0a 20 20 20 20 20 20 20 20  rip() }.        
4330: 65 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74  elif sLine.start
4340: 73 77 69 74 68 28 22 4f 50 54 44 45 46 41 55 4c  swith("OPTDEFAUL
4350: 54 55 49 4c 41 4e 47 3a 22 29 3a 0a 20 20 20 20  TUILANG:"):.    
4360: 20 20 20 20 20 20 20 20 6d 20 3d 20 72 65 2e 6d          m = re.m
4370: 61 74 63 68 28 22 4f 50 54 44 45 46 41 55 4c 54  atch("OPTDEFAULT
4380: 55 49 4c 41 4e 47 3a 20 2a 28 5b 61 2d 7a 5d 5b  UILANG: *([a-z][
4390: 61 2d 7a 5d 28 3f 3a 5f 5b 41 2d 5a 5d 5b 41 2d  a-z](?:_[A-Z][A-
43a0: 5a 5d 7c 29 29 24 22 2c 20 73 4c 69 6e 65 29 0a  Z]|))$", sLine).
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 73 44 65 66              sDef
43c0: 61 75 6c 74 55 49 4c 61 6e 67 20 3d 20 6d 2e 67  aultUILang = m.g
43d0: 72 6f 75 70 28 31 29 5b 3a 32 5d 0a 20 20 20 20  roup(1)[:2].    
43e0: 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65 2e 73      elif sLine.s
43f0: 74 61 72 74 73 77 69 74 68 28 22 4f 50 54 4c 41  tartswith("OPTLA
4400: 42 45 4c 2f 22 29 3a 0a 20 20 20 20 20 20 20 20  BEL/"):.        
4410: 20 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68      m = re.match
4420: 28 22 4f 50 54 4c 41 42 45 4c 2f 28 5b 61 2d 7a  ("OPTLABEL/([a-z
4430: 30 2d 39 5d 2b 29 3a 28 2e 2b 29 24 22 2c 20 73  0-9]+):(.+)$", s
4440: 4c 69 6e 65 29 0a 20 20 20 20 20 20 20 20 20 20  Line).          
4450: 20 20 64 4f 70 74 4c 61 62 65 6c 5b 73 4c 61 6e    dOptLabel[sLan
4460: 67 5d 5b 6d 2e 67 72 6f 75 70 28 31 29 5d 20 3d  g][m.group(1)] =
4470: 20 6c 69 73 74 28 6d 61 70 28 73 74 72 2e 73 74   list(map(str.st
4480: 72 69 70 2c 20 6d 2e 67 72 6f 75 70 28 32 29 2e  rip, m.group(2).
4490: 73 70 6c 69 74 28 22 7c 22 29 29 29 20 20 69 66  split("|")))  if
44a0: 20 22 7c 22 20 69 6e 20 6d 2e 67 72 6f 75 70 28   "|" in m.group(
44b0: 32 29 20 20 65 6c 73 65 20 20 5b 6d 2e 67 72 6f  2)  else  [m.gro
44c0: 75 70 28 32 29 2e 73 74 72 69 70 28 29 2c 20 22  up(2).strip(), "
44d0: 22 5d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a  "].        else:
44e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69  .            pri
44f0: 6e 74 28 22 23 20 45 72 72 6f 72 2e 20 57 72 6f  nt("# Error. Wro
4500: 6e 67 20 6f 70 74 69 6f 6e 20 6c 69 6e 65 20 69  ng option line i
4510: 6e 3a 5c 6e 20 20 22 29 0a 20 20 20 20 20 20 20  n:\n  ").       
4520: 20 20 20 20 20 70 72 69 6e 74 28 73 4c 69 6e 65       print(sLine
4530: 29 0a 20 20 20 20 70 72 69 6e 74 28 22 20 20 6f  ).    print("  o
4540: 70 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 66  ptions defined f
4550: 6f 72 3a 20 22 20 2b 20 22 2c 20 22 2e 6a 6f 69  or: " + ", ".joi
4560: 6e 28 5b 20 74 5b 30 5d 20 66 6f 72 20 74 20 69  n([ t[0] for t i
4570: 6e 20 6c 4f 70 74 20 5d 29 29 0a 20 20 20 20 64  n lOpt ])).    d
4580: 4f 70 74 69 6f 6e 73 20 3d 20 7b 20 22 6c 53 74  Options = { "lSt
4590: 72 75 63 74 4f 70 74 22 3a 20 6c 53 74 72 75 63  ructOpt": lStruc
45a0: 74 4f 70 74 2c 20 22 64 4f 70 74 4c 61 62 65 6c  tOpt, "dOptLabel
45b0: 22 3a 20 64 4f 70 74 4c 61 62 65 6c 2c 20 22 73  ": dOptLabel, "s
45c0: 44 65 66 61 75 6c 74 55 49 4c 61 6e 67 22 3a 20  DefaultUILang": 
45d0: 73 44 65 66 61 75 6c 74 55 49 4c 61 6e 67 20 7d  sDefaultUILang }
45e0: 0a 20 20 20 20 64 4f 70 74 69 6f 6e 73 2e 75 70  .    dOptions.up
45f0: 64 61 74 65 28 7b 20 22 64 4f 70 74 22 2b 6b 3a  date({ "dOpt"+k:
4600: 20 76 20 20 66 6f 72 20 6b 2c 20 76 20 69 6e 20   v  for k, v in 
4610: 6c 4f 70 74 20 7d 29 0a 20 20 20 20 72 65 74 75  lOpt }).    retu
4620: 72 6e 20 64 4f 70 74 69 6f 6e 73 2c 20 64 4f 70  rn dOptions, dOp
4630: 74 50 72 69 6f 72 69 74 79 0a 0a 0a 64 65 66 20  tPriority...def 
4640: 70 72 69 6e 74 42 6f 6f 6b 6d 61 72 6b 20 28 6e  printBookmark (n
4650: 4c 65 76 65 6c 2c 20 73 43 6f 6d 6d 65 6e 74 2c  Level, sComment,
4660: 20 6e 4c 69 6e 65 29 3a 0a 20 20 20 20 70 72 69   nLine):.    pri
4670: 6e 74 28 22 20 20 7b 3a 3e 36 7d 3a 20 20 7b 7d  nt("  {:>6}:  {}
4680: 22 2e 66 6f 72 6d 61 74 28 6e 4c 69 6e 65 2c 20  ".format(nLine, 
4690: 22 20 20 22 20 2a 20 6e 4c 65 76 65 6c 20 2b 20  "  " * nLevel + 
46a0: 73 43 6f 6d 6d 65 6e 74 29 29 0a 0a 0a 64 65 66  sComment))...def
46b0: 20 6d 61 6b 65 20 28 6c 52 75 6c 65 73 2c 20 73   make (lRules, s
46c0: 4c 61 6e 67 2c 20 62 4a 61 76 61 53 63 72 69 70  Lang, bJavaScrip
46d0: 74 29 3a 0a 20 20 20 20 22 63 6f 6d 70 69 6c 65  t):.    "compile
46e0: 20 72 75 6c 65 73 2c 20 72 65 74 75 72 6e 73 20   rules, returns 
46f0: 61 20 64 69 63 74 69 6f 6e 61 72 79 20 6f 66 20  a dictionary of 
4700: 76 61 6c 75 65 73 22 0a 20 20 20 20 23 20 66 6f  values".    # fo
4710: 72 20 63 6c 61 72 69 74 79 20 70 75 72 70 6f 73  r clarity purpos
4720: 65 2c 20 64 6f 6e e2 80 99 74 20 63 72 65 61 74  e, don...t creat
4730: 65 20 61 6e 79 20 66 69 6c 65 20 68 65 72 65 0a  e any file here.
4740: 0a 20 20 20 20 23 20 72 65 6d 6f 76 69 6e 67 20  .    # removing 
4750: 63 6f 6d 6d 65 6e 74 73 2c 20 7a 65 72 6f 69 6e  comments, zeroin
4760: 67 20 65 6d 70 74 79 20 6c 69 6e 65 73 2c 20 63  g empty lines, c
4770: 72 65 61 74 69 6e 67 20 64 65 66 69 6e 69 74 69  reating definiti
4780: 6f 6e 73 2c 20 73 74 6f 72 69 6e 67 20 74 65 73  ons, storing tes
4790: 74 73 2c 20 6d 65 72 67 69 6e 67 20 72 75 6c 65  ts, merging rule
47a0: 20 6c 69 6e 65 73 0a 20 20 20 20 70 72 69 6e 74   lines.    print
47b0: 28 22 20 20 70 61 72 73 69 6e 67 20 72 75 6c 65  ("  parsing rule
47c0: 73 2e 2e 2e 22 29 0a 20 20 20 20 67 6c 6f 62 61  s...").    globa
47d0: 6c 20 64 44 45 46 0a 20 20 20 20 6c 4c 69 6e 65  l dDEF.    lLine
47e0: 20 3d 20 5b 5d 0a 20 20 20 20 6c 52 75 6c 65 4c   = [].    lRuleL
47f0: 69 6e 65 20 3d 20 5b 5d 0a 20 20 20 20 6c 54 65  ine = [].    lTe
4800: 73 74 20 3d 20 5b 5d 0a 20 20 20 20 6c 4f 70 74  st = [].    lOpt
4810: 20 3d 20 5b 5d 0a 20 20 20 20 7a 42 6f 6f 6b 6d   = [].    zBookm
4820: 61 72 6b 20 3d 20 72 65 2e 63 6f 6d 70 69 6c 65  ark = re.compile
4830: 28 22 5e 21 21 2b 22 29 0a 0a 20 20 20 20 66 6f  ("^!!+")..    fo
4840: 72 20 69 2c 20 73 4c 69 6e 65 20 69 6e 20 65 6e  r i, sLine in en
4850: 75 6d 65 72 61 74 65 28 6c 52 75 6c 65 73 2c 20  umerate(lRules, 
4860: 31 29 3a 0a 20 20 20 20 20 20 20 20 69 66 20 73  1):.        if s
4870: 4c 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28  Line.startswith(
4880: 27 23 45 4e 44 27 29 3a 0a 20 20 20 20 20 20 20  '#END'):.       
4890: 20 20 20 20 20 70 72 69 6e 74 42 6f 6f 6b 6d 61       printBookma
48a0: 72 6b 28 30 2c 20 22 42 52 45 41 4b 20 42 59 20  rk(0, "BREAK BY 
48b0: 23 45 4e 44 22 2c 20 69 29 0a 20 20 20 20 20 20  #END", i).      
48c0: 20 20 20 20 20 20 62 72 65 61 6b 0a 20 20 20 20        break.    
48d0: 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65 2e 73      elif sLine.s
48e0: 74 61 72 74 73 77 69 74 68 28 22 23 22 29 3a 0a  tartswith("#"):.
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 73 73              pass
4900: 0a 20 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c  .        elif sL
4910: 69 6e 65 2e 73 74 61 72 74 73 77 69 74 68 28 22  ine.startswith("
4920: 44 45 46 3a 22 29 3a 0a 20 20 20 20 20 20 20 20  DEF:"):.        
4930: 20 20 20 20 6d 20 3d 20 72 65 2e 6d 61 74 63 68      m = re.match
4940: 28 22 44 45 46 3a 20 2b 28 5b 61 2d 7a 41 2d 5a  ("DEF: +([a-zA-Z
4950: 5f 5d 5b 61 2d 7a 41 2d 5a 5f 30 2d 39 5d 2a 29  _][a-zA-Z_0-9]*)
4960: 20 2b 28 2e 2b 29 24 22 2c 20 73 4c 69 6e 65 2e   +(.+)$", sLine.
4970: 73 74 72 69 70 28 29 29 0a 20 20 20 20 20 20 20  strip()).       
4980: 20 20 20 20 20 69 66 20 6d 3a 0a 20 20 20 20 20       if m:.     
4990: 20 20 20 20 20 20 20 20 20 20 20 64 44 45 46 5b             dDEF[
49a0: 22 7b 22 2b 6d 2e 67 72 6f 75 70 28 31 29 2b 22  "{"+m.group(1)+"
49b0: 7d 22 5d 20 3d 20 6d 2e 67 72 6f 75 70 28 32 29  }"] = m.group(2)
49c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73  .            els
49d0: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
49e0: 20 20 20 70 72 69 6e 74 28 22 45 72 72 6f 72 20     print("Error 
49f0: 69 6e 20 64 65 66 69 6e 69 74 69 6f 6e 3a 20 22  in definition: "
4a00: 2c 20 65 6e 64 3d 22 22 29 0a 20 20 20 20 20 20  , end="").      
4a10: 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74 28            print(
4a20: 73 4c 69 6e 65 2e 73 74 72 69 70 28 29 29 0a 20  sLine.strip()). 
4a30: 20 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e         elif sLin
4a40: 65 2e 73 74 61 72 74 73 77 69 74 68 28 22 54 45  e.startswith("TE
4a50: 53 54 3a 22 29 3a 0a 20 20 20 20 20 20 20 20 20  ST:"):.         
4a60: 20 20 20 6c 54 65 73 74 2e 61 70 70 65 6e 64 28     lTest.append(
4a70: 22 7b 3a 3c 38 7d 22 2e 66 6f 72 6d 61 74 28 69  "{:<8}".format(i
4a80: 29 20 2b 20 22 20 20 22 20 2b 20 73 4c 69 6e 65  ) + "  " + sLine
4a90: 5b 35 3a 5d 2e 73 74 72 69 70 28 29 29 0a 20 20  [5:].strip()).  
4aa0: 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65        elif sLine
4ab0: 2e 73 74 61 72 74 73 77 69 74 68 28 22 54 4f 44  .startswith("TOD
4ac0: 4f 3a 22 29 3a 0a 20 20 20 20 20 20 20 20 20 20  O:"):.          
4ad0: 20 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 65    pass.        e
4ae0: 6c 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73  lif sLine.starts
4af0: 77 69 74 68 28 28 22 4f 50 54 47 52 4f 55 50 2f  with(("OPTGROUP/
4b00: 22 2c 20 22 4f 50 54 53 4f 46 54 57 41 52 45 3a  ", "OPTSOFTWARE:
4b10: 22 2c 20 22 4f 50 54 2f 22 2c 20 22 4f 50 54 4c  ", "OPT/", "OPTL
4b20: 41 4e 47 2f 22 2c 20 22 4f 50 54 44 45 46 41 55  ANG/", "OPTDEFAU
4b30: 4c 54 55 49 4c 41 4e 47 3a 22 2c 20 22 4f 50 54  LTUILANG:", "OPT
4b40: 4c 41 42 45 4c 2f 22 2c 20 22 4f 50 54 50 52 49  LABEL/", "OPTPRI
4b50: 4f 52 49 54 59 2f 22 29 29 3a 0a 20 20 20 20 20  ORITY/")):.     
4b60: 20 20 20 20 20 20 20 6c 4f 70 74 2e 61 70 70 65         lOpt.appe
4b70: 6e 64 28 73 4c 69 6e 65 29 0a 20 20 20 20 20 20  nd(sLine).      
4b80: 20 20 65 6c 69 66 20 72 65 2e 6d 61 74 63 68 28    elif re.match(
4b90: 22 5b 20 c2 a0 5c 74 5d 2a 24 22 2c 20 73 4c 69  "[ ..\t]*$", sLi
4ba0: 6e 65 29 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ne):.           
4bb0: 20 70 61 73 73 0a 20 20 20 20 20 20 20 20 65 6c   pass.        el
4bc0: 69 66 20 73 4c 69 6e 65 2e 73 74 61 72 74 73 77  if sLine.startsw
4bd0: 69 74 68 28 22 21 21 22 29 3a 0a 20 20 20 20 20  ith("!!"):.     
4be0: 20 20 20 20 20 20 20 6d 20 3d 20 7a 42 6f 6f 6b         m = zBook
4bf0: 6d 61 72 6b 2e 73 65 61 72 63 68 28 73 4c 69 6e  mark.search(sLin
4c00: 65 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  e).            n
4c10: 45 78 4d 6b 20 3d 20 6c 65 6e 28 6d 2e 67 72 6f  ExMk = len(m.gro
4c20: 75 70 28 30 29 29 0a 20 20 20 20 20 20 20 20 20  up(0)).         
4c30: 20 20 20 69 66 20 73 4c 69 6e 65 5b 6e 45 78 4d     if sLine[nExM
4c40: 6b 3a 5d 2e 73 74 72 69 70 28 29 3a 0a 20 20 20  k:].strip():.   
4c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
4c60: 6e 74 42 6f 6f 6b 6d 61 72 6b 28 6e 45 78 4d 6b  ntBookmark(nExMk
4c70: 2d 32 2c 20 73 4c 69 6e 65 5b 6e 45 78 4d 6b 3a  -2, sLine[nExMk:
4c80: 5d 2e 73 74 72 69 70 28 29 2c 20 69 29 0a 20 20  ].strip(), i).  
4c90: 20 20 20 20 20 20 65 6c 69 66 20 73 4c 69 6e 65        elif sLine
4ca0: 2e 73 74 61 72 74 73 77 69 74 68 28 28 22 20 20  .startswith(("  
4cb0: 20 20 22 2c 20 22 5c 74 22 29 29 3a 0a 20 20 20    ", "\t")):.   
4cc0: 20 20 20 20 20 20 20 20 20 6c 52 75 6c 65 4c 69           lRuleLi
4cd0: 6e 65 5b 6c 65 6e 28 6c 52 75 6c 65 4c 69 6e 65  ne[len(lRuleLine
4ce0: 29 2d 31 5d 5b 31 5d 20 2b 3d 20 22 20 22 20 2b  )-1][1] += " " +
4cf0: 20 73 4c 69 6e 65 2e 73 74 72 69 70 28 29 0a 20   sLine.strip(). 
4d00: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
4d10: 20 20 20 20 20 20 20 20 20 6c 52 75 6c 65 4c 69           lRuleLi
4d20: 6e 65 2e 61 70 70 65 6e 64 28 5b 69 2c 20 73 4c  ne.append([i, sL
4d30: 69 6e 65 2e 73 74 72 69 70 28 29 5d 29 0a 0a 20  ine.strip()]).. 
4d40: 20 20 20 23 20 67 65 6e 65 72 61 74 69 6e 67 20     # generating 
4d50: 6f 70 74 69 6f 6e 73 20 66 69 6c 65 73 0a 20 20  options files.  
4d60: 20 20 70 72 69 6e 74 28 22 20 20 70 61 72 73 69    print("  parsi
4d70: 6e 67 20 6f 70 74 69 6f 6e 73 2e 2e 2e 22 29 0a  ng options...").
4d80: 20 20 20 20 74 72 79 3a 0a 20 20 20 20 20 20 20      try:.       
4d90: 20 64 4f 70 74 69 6f 6e 73 2c 20 64 4f 70 74 50   dOptions, dOptP
4da0: 72 69 6f 72 69 74 79 20 3d 20 70 72 65 70 61 72  riority = prepar
4db0: 65 4f 70 74 69 6f 6e 73 28 6c 4f 70 74 29 0a 20  eOptions(lOpt). 
4dc0: 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20 20 20     except:.     
4dd0: 20 20 20 74 72 61 63 65 62 61 63 6b 2e 70 72 69     traceback.pri
4de0: 6e 74 5f 65 78 63 28 29 0a 20 20 20 20 20 20 20  nt_exc().       
4df0: 20 65 78 69 74 28 29 0a 0a 20 20 20 20 23 20 74   exit()..    # t
4e00: 65 73 74 73 0a 20 20 20 20 70 72 69 6e 74 28 22  ests.    print("
4e10: 20 20 6c 69 73 74 20 74 65 73 74 73 2e 2e 2e 22    list tests..."
4e20: 29 0a 20 20 20 20 73 47 43 54 65 73 74 73 20 3d  ).    sGCTests =
4e30: 20 22 5c 6e 22 2e 6a 6f 69 6e 28 6c 54 65 73 74   "\n".join(lTest
4e40: 29 0a 20 20 20 20 73 47 43 54 65 73 74 73 4a 53  ).    sGCTestsJS
4e50: 20 3d 20 27 7b 20 22 61 44 61 74 61 22 3a 20 27   = '{ "aData": '
4e60: 20 2b 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 54   + json.dumps(lT
4e70: 65 73 74 2c 20 65 6e 73 75 72 65 5f 61 73 63 69  est, ensure_asci
4e80: 69 3d 46 61 6c 73 65 29 20 2b 20 22 20 7d 5c 6e  i=False) + " }\n
4e90: 22 0a 0a 20 20 20 20 23 20 70 72 6f 63 65 73 73  "..    # process
4ea0: 69 6e 67 0a 20 20 20 20 70 72 69 6e 74 28 22 20  ing.    print(" 
4eb0: 20 70 72 65 70 61 72 69 6e 67 20 72 75 6c 65 73   preparing rules
4ec0: 2e 2e 2e 22 29 0a 20 20 20 20 62 50 61 72 61 67  ...").    bParag
4ed0: 72 61 70 68 20 3d 20 54 72 75 65 0a 20 20 20 20  raph = True.    
4ee0: 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73 20  lParagraphRules 
4ef0: 3d 20 5b 5d 0a 20 20 20 20 6c 53 65 6e 74 65 6e  = [].    lSenten
4f00: 63 65 52 75 6c 65 73 20 3d 20 5b 5d 0a 20 20 20  ceRules = [].   
4f10: 20 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73   lParagraphRules
4f20: 4a 53 20 3d 20 5b 5d 0a 20 20 20 20 6c 53 65 6e  JS = [].    lSen
4f30: 74 65 6e 63 65 52 75 6c 65 73 4a 53 20 3d 20 5b  tenceRulesJS = [
4f40: 5d 0a 0a 20 20 20 20 66 6f 72 20 6e 4c 69 6e 65  ]..    for nLine
4f50: 2c 20 73 4c 69 6e 65 20 69 6e 20 6c 52 75 6c 65  , sLine in lRule
4f60: 4c 69 6e 65 3a 0a 20 20 20 20 20 20 20 20 69 66  Line:.        if
4f70: 20 73 4c 69 6e 65 3a 0a 20 20 20 20 20 20 20 20   sLine:.        
4f80: 20 20 20 20 69 66 20 73 4c 69 6e 65 20 3d 3d 20      if sLine == 
4f90: 22 5b 2b 2b 5d 22 3a 0a 20 20 20 20 20 20 20 20  "[++]":.        
4fa0: 20 20 20 20 20 20 20 20 62 50 61 72 61 67 72 61          bParagra
4fb0: 70 68 20 3d 20 46 61 6c 73 65 0a 20 20 20 20 20  ph = False.     
4fc0: 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20 20 20         else:.   
4fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 52 75               aRu
4fe0: 6c 65 20 3d 20 63 72 65 61 74 65 52 75 6c 65 28  le = createRule(
4ff0: 73 4c 69 6e 65 2c 20 6e 4c 69 6e 65 2c 20 73 4c  sLine, nLine, sL
5000: 61 6e 67 2c 20 62 50 61 72 61 67 72 61 70 68 2c  ang, bParagraph,
5010: 20 64 4f 70 74 50 72 69 6f 72 69 74 79 29 0a 20   dOptPriority). 
5020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
5030: 66 20 61 52 75 6c 65 3a 0a 20 20 20 20 20 20 20  f aRule:.       
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
5050: 62 50 61 72 61 67 72 61 70 68 3a 0a 20 20 20 20  bParagraph:.    
5060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5070: 20 20 20 20 6c 50 61 72 61 67 72 61 70 68 52 75      lParagraphRu
5080: 6c 65 73 2e 61 70 70 65 6e 64 28 61 52 75 6c 65  les.append(aRule
5090: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
50a0: 20 20 20 20 20 20 20 20 20 20 6c 50 61 72 61 67            lParag
50b0: 72 61 70 68 52 75 6c 65 73 4a 53 2e 61 70 70 65  raphRulesJS.appe
50c0: 6e 64 28 6a 73 63 6f 6e 76 2e 70 79 52 75 6c 65  nd(jsconv.pyRule
50d0: 54 6f 4a 53 28 61 52 75 6c 65 2c 20 64 4a 53 52  ToJS(aRule, dJSR
50e0: 45 47 45 58 45 53 2c 20 73 57 4f 52 44 4c 49 4d  EGEXES, sWORDLIM
50f0: 49 54 4c 45 46 54 29 29 0a 20 20 20 20 20 20 20  ITLEFT)).       
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73               els
5110: 65 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e:.             
5120: 20 20 20 20 20 20 20 20 20 20 20 6c 53 65 6e 74             lSent
5130: 65 6e 63 65 52 75 6c 65 73 2e 61 70 70 65 6e 64  enceRules.append
5140: 28 61 52 75 6c 65 29 0a 20 20 20 20 20 20 20 20  (aRule).        
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5160: 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65 73 4a 53  lSentenceRulesJS
5170: 2e 61 70 70 65 6e 64 28 6a 73 63 6f 6e 76 2e 70  .append(jsconv.p
5180: 79 52 75 6c 65 54 6f 4a 53 28 61 52 75 6c 65 2c  yRuleToJS(aRule,
5190: 20 64 4a 53 52 45 47 45 58 45 53 2c 20 73 57 4f   dJSREGEXES, sWO
51a0: 52 44 4c 49 4d 49 54 4c 45 46 54 29 29 0a 0a 20  RDLIMITLEFT)).. 
51b0: 20 20 20 23 20 63 72 65 61 74 69 6e 67 20 66 69     # creating fi
51c0: 6c 65 20 77 69 74 68 20 61 6c 6c 20 66 75 6e 63  le with all func
51d0: 74 69 6f 6e 73 20 63 61 6c 6c 61 62 6c 65 20 62  tions callable b
51e0: 79 20 72 75 6c 65 73 0a 20 20 20 20 70 72 69 6e  y rules.    prin
51f0: 74 28 22 20 20 63 72 65 61 74 69 6e 67 20 63 61  t("  creating ca
5200: 6c 6c 61 62 6c 65 73 2e 2e 2e 22 29 0a 20 20 20  llables...").   
5210: 20 73 50 79 43 61 6c 6c 61 62 6c 65 73 20 3d 20   sPyCallables = 
5220: 22 23 20 67 65 6e 65 72 61 74 65 64 20 63 6f 64  "# generated cod
5230: 65 2c 20 64 6f 20 6e 6f 74 20 65 64 69 74 5c 6e  e, do not edit\n
5240: 22 0a 20 20 20 20 73 4a 53 43 61 6c 6c 61 62 6c  ".    sJSCallabl
5250: 65 73 20 3d 20 22 2f 2f 20 67 65 6e 65 72 61 74  es = "// generat
5260: 65 64 20 63 6f 64 65 2c 20 64 6f 20 6e 6f 74 20  ed code, do not 
5270: 65 64 69 74 5c 6e 63 6f 6e 73 74 20 6f 45 76 61  edit\nconst oEva
5280: 6c 46 75 6e 63 20 3d 20 7b 5c 6e 22 0a 20 20 20  lFunc = {\n".   
5290: 20 66 6f 72 20 73 46 75 6e 63 4e 61 6d 65 2c 20   for sFuncName, 
52a0: 73 52 65 74 75 72 6e 20 69 6e 20 6c 46 55 4e 43  sReturn in lFUNC
52b0: 54 49 4f 4e 53 3a 0a 20 20 20 20 20 20 20 20 63  TIONS:.        c
52c0: 54 79 70 65 20 3d 20 73 46 75 6e 63 4e 61 6d 65  Type = sFuncName
52d0: 5b 30 3a 31 5d 0a 20 20 20 20 20 20 20 20 69 66  [0:1].        if
52e0: 20 63 54 79 70 65 20 3d 3d 20 22 63 22 3a 20 23   cType == "c": #
52f0: 20 63 6f 6e 64 69 74 69 6f 6e 0a 20 20 20 20 20   condition.     
5300: 20 20 20 20 20 20 20 73 50 61 72 61 6d 73 20 3d         sParams =
5310: 20 22 73 2c 20 73 78 2c 20 6d 2c 20 64 44 41 2c   "s, sx, m, dDA,
5320: 20 73 43 6f 75 6e 74 72 79 2c 20 62 43 6f 6e 64   sCountry, bCond
5330: 4d 65 6d 6f 22 0a 20 20 20 20 20 20 20 20 65 6c  Memo".        el
5340: 69 66 20 63 54 79 70 65 20 3d 3d 20 22 6d 22 3a  if cType == "m":
5350: 20 23 20 6d 65 73 73 61 67 65 0a 20 20 20 20 20   # message.     
5360: 20 20 20 20 20 20 20 73 50 61 72 61 6d 73 20 3d         sParams =
5370: 20 22 73 2c 20 6d 22 0a 20 20 20 20 20 20 20 20   "s, m".        
5380: 65 6c 69 66 20 63 54 79 70 65 20 3d 3d 20 22 73  elif cType == "s
5390: 22 3a 20 23 20 73 75 67 67 65 73 74 69 6f 6e 0a  ": # suggestion.
53a0: 20 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72              sPar
53b0: 61 6d 73 20 3d 20 22 73 2c 20 6d 22 0a 20 20 20  ams = "s, m".   
53c0: 20 20 20 20 20 65 6c 69 66 20 63 54 79 70 65 20       elif cType 
53d0: 3d 3d 20 22 70 22 3a 20 23 20 70 72 65 70 72 6f  == "p": # prepro
53e0: 63 65 73 73 6f 72 0a 20 20 20 20 20 20 20 20 20  cessor.         
53f0: 20 20 20 73 50 61 72 61 6d 73 20 3d 20 22 73 2c     sParams = "s,
5400: 20 6d 22 0a 20 20 20 20 20 20 20 20 65 6c 69 66   m".        elif
5410: 20 63 54 79 70 65 20 3d 3d 20 22 64 22 3a 20 23   cType == "d": #
5420: 20 64 69 73 61 6d 62 69 67 75 61 74 6f 72 0a 20   disambiguator. 
5430: 20 20 20 20 20 20 20 20 20 20 20 73 50 61 72 61             sPara
5440: 6d 73 20 3d 20 22 73 2c 20 6d 2c 20 64 44 41 22  ms = "s, m, dDA"
5450: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 3a 0a 20  .        else:. 
5460: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
5470: 28 22 23 20 55 6e 6b 6e 6f 77 6e 20 66 75 6e 63  ("# Unknown func
5480: 74 69 6f 6e 20 74 79 70 65 20 69 6e 20 5b 22 20  tion type in [" 
5490: 2b 20 73 46 75 6e 63 4e 61 6d 65 20 2b 20 22 5d  + sFuncName + "]
54a0: 22 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ").            c
54b0: 6f 6e 74 69 6e 75 65 0a 20 20 20 20 20 20 20 20  ontinue.        
54c0: 73 50 79 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20  sPyCallables += 
54d0: 22 64 65 66 20 7b 7d 20 28 7b 7d 29 3a 5c 6e 22  "def {} ({}):\n"
54e0: 2e 66 6f 72 6d 61 74 28 73 46 75 6e 63 4e 61 6d  .format(sFuncNam
54f0: 65 2c 20 73 50 61 72 61 6d 73 29 0a 20 20 20 20  e, sParams).    
5500: 20 20 20 20 73 50 79 43 61 6c 6c 61 62 6c 65 73      sPyCallables
5510: 20 2b 3d 20 22 20 20 20 20 72 65 74 75 72 6e 20   += "    return 
5520: 22 20 2b 20 73 52 65 74 75 72 6e 20 2b 20 22 5c  " + sReturn + "\
5530: 6e 22 0a 20 20 20 20 20 20 20 20 73 4a 53 43 61  n".        sJSCa
5540: 6c 6c 61 62 6c 65 73 20 2b 3d 20 22 20 20 20 20  llables += "    
5550: 7b 7d 3a 20 66 75 6e 63 74 69 6f 6e 20 28 7b 7d  {}: function ({}
5560: 29 22 2e 66 6f 72 6d 61 74 28 73 46 75 6e 63 4e  )".format(sFuncN
5570: 61 6d 65 2c 20 73 50 61 72 61 6d 73 29 20 2b 20  ame, sParams) + 
5580: 22 20 7b 5c 6e 22 0a 20 20 20 20 20 20 20 20 73  " {\n".        s
5590: 4a 53 43 61 6c 6c 61 62 6c 65 73 20 2b 3d 20 22  JSCallables += "
55a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
55b0: 20 2b 20 6a 73 63 6f 6e 76 2e 70 79 32 6a 73 28   + jsconv.py2js(
55c0: 73 52 65 74 75 72 6e 29 20 2b 20 22 3b 5c 6e 22  sReturn) + ";\n"
55d0: 0a 20 20 20 20 20 20 20 20 73 4a 53 43 61 6c 6c  .        sJSCall
55e0: 61 62 6c 65 73 20 2b 3d 20 22 20 20 20 20 7d 2c  ables += "    },
55f0: 5c 6e 22 0a 20 20 20 20 73 4a 53 43 61 6c 6c 61  \n".    sJSCalla
5600: 62 6c 65 73 20 2b 3d 20 22 7d 5c 6e 22 0a 0a 20  bles += "}\n".. 
5610: 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 73 28     displayStats(
5620: 6c 50 61 72 61 67 72 61 70 68 52 75 6c 65 73 2c  lParagraphRules,
5630: 20 6c 53 65 6e 74 65 6e 63 65 52 75 6c 65 73 29   lSentenceRules)
5640: 0a 0a 20 20 20 20 70 72 69 6e 74 28 22 55 6e 6e  ..    print("Unn
5650: 61 6d 65 64 20 72 75 6c 65 73 3a 20 22 20 2b 20  amed rules: " + 
5660: 73 74 72 28 6e 52 55 4c 45 57 49 54 48 4f 55 54  str(nRULEWITHOUT
5670: 4e 41 4d 45 29 29 0a 0a 20 20 20 20 64 20 3d 20  NAME))..    d = 
5680: 7b 20 22 63 61 6c 6c 61 62 6c 65 73 22 3a 20 73  { "callables": s
5690: 50 79 43 61 6c 6c 61 62 6c 65 73 2c 0a 20 20 20  PyCallables,.   
56a0: 20 20 20 20 20 20 20 22 63 61 6c 6c 61 62 6c 65         "callable
56b0: 73 4a 53 22 3a 20 73 4a 53 43 61 6c 6c 61 62 6c  sJS": sJSCallabl
56c0: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 22 67  es,.          "g
56d0: 63 74 65 73 74 73 22 3a 20 73 47 43 54 65 73 74  ctests": sGCTest
56e0: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 22 67 63  s,.          "gc
56f0: 74 65 73 74 73 4a 53 22 3a 20 73 47 43 54 65 73  testsJS": sGCTes
5700: 74 73 4a 53 2c 0a 20 20 20 20 20 20 20 20 20 20  tsJS,.          
5710: 22 70 61 72 61 67 72 61 70 68 5f 72 75 6c 65 73  "paragraph_rules
5720: 22 3a 20 6d 65 72 67 65 52 75 6c 65 73 42 79 4f  ": mergeRulesByO
5730: 70 74 69 6f 6e 28 6c 50 61 72 61 67 72 61 70 68  ption(lParagraph
5740: 52 75 6c 65 73 29 2c 0a 20 20 20 20 20 20 20 20  Rules),.        
5750: 20 20 22 73 65 6e 74 65 6e 63 65 5f 72 75 6c 65    "sentence_rule
5760: 73 22 3a 20 6d 65 72 67 65 52 75 6c 65 73 42 79  s": mergeRulesBy
5770: 4f 70 74 69 6f 6e 28 6c 53 65 6e 74 65 6e 63 65  Option(lSentence
5780: 52 75 6c 65 73 29 2c 0a 20 20 20 20 20 20 20 20  Rules),.        
5790: 20 20 22 70 61 72 61 67 72 61 70 68 5f 72 75 6c    "paragraph_rul
57a0: 65 73 5f 4a 53 22 3a 20 6a 73 63 6f 6e 76 2e 77  es_JS": jsconv.w
57b0: 72 69 74 65 52 75 6c 65 73 54 6f 4a 53 41 72 72  riteRulesToJSArr
57c0: 61 79 28 6d 65 72 67 65 52 75 6c 65 73 42 79 4f  ay(mergeRulesByO
57d0: 70 74 69 6f 6e 28 6c 50 61 72 61 67 72 61 70 68  ption(lParagraph
57e0: 52 75 6c 65 73 4a 53 29 29 2c 0a 20 20 20 20 20  RulesJS)),.     
57f0: 20 20 20 20 20 22 73 65 6e 74 65 6e 63 65 5f 72       "sentence_r
5800: 75 6c 65 73 5f 4a 53 22 3a 20 6a 73 63 6f 6e 76  ules_JS": jsconv
5810: 2e 77 72 69 74 65 52 75 6c 65 73 54 6f 4a 53 41  .writeRulesToJSA
5820: 72 72 61 79 28 6d 65 72 67 65 52 75 6c 65 73 42  rray(mergeRulesB
5830: 79 4f 70 74 69 6f 6e 28 6c 53 65 6e 74 65 6e 63  yOption(lSentenc
5840: 65 52 75 6c 65 73 4a 53 29 29 20 7d 0a 20 20 20  eRulesJS)) }.   
5850: 20 64 2e 75 70 64 61 74 65 28 64 4f 70 74 69 6f   d.update(dOptio
5860: 6e 73 29 0a 0a 20 20 20 20 72 65 74 75 72 6e 20  ns)..    return 
5870: 64 0a                                            d.