Grammalecte  Hex Artifact Content

Artifact 2637ee1377e848322a5aa2b30fd2f9e9e9a1e3434266eb9cf70bdc9b40f8a163:


0000: 23 20 43 6f 6e 76 65 72 74 20 50 79 74 68 6f 6e  # Convert Python
0010: 20 63 6f 64 65 20 74 6f 20 4a 61 76 61 53 63 72   code to JavaScr
0020: 69 70 74 20 63 6f 64 65 0a 0a 69 6d 70 6f 72 74  ipt code..import
0030: 20 63 6f 70 79 0a 69 6d 70 6f 72 74 20 72 65 0a   copy.import re.
0040: 69 6d 70 6f 72 74 20 6a 73 6f 6e 0a 0a 0a 64 65  import json...de
0050: 66 20 70 79 32 6a 73 20 28 73 43 6f 64 65 29 3a  f py2js (sCode):
0060: 0a 20 20 20 20 22 63 6f 6e 76 65 72 74 20 50 79  .    "convert Py
0070: 74 68 6f 6e 20 63 6f 64 65 20 74 6f 20 4a 61 76  thon code to Jav
0080: 61 53 63 72 69 70 74 20 63 6f 64 65 22 0a 20 20  aScript code".  
0090: 20 20 23 20 50 79 74 68 6f 6e 20 32 2e 78 20 75    # Python 2.x u
00a0: 6e 69 63 6f 64 65 20 73 74 72 69 6e 67 73 0a 20  nicode strings. 
00b0: 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75     sCode = re.su
00c0: 62 28 27 5c 5c 62 5b 75 72 5d 22 27 2c 20 27 22  b('\\b[ur]"', '"
00d0: 27 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43  ', sCode).    sC
00e0: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 22 5c 5c  ode = re.sub("\\
00f0: 62 5b 75 72 5d 27 22 2c 20 22 27 22 2c 20 73 43  b[ur]'", "'", sC
0100: 6f 64 65 29 0a 20 20 20 20 23 20 6f 70 65 72 61  ode).    # opera
0110: 74 6f 72 73 0a 20 20 20 20 73 43 6f 64 65 20 3d  tors.    sCode =
0120: 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22   sCode.replace("
0130: 20 61 6e 64 20 22 2c 20 22 20 26 26 20 22 29 0a   and ", " && ").
0140: 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64      sCode = sCod
0150: 65 2e 72 65 70 6c 61 63 65 28 22 20 6f 72 20 22  e.replace(" or "
0160: 2c 20 22 20 7c 7c 20 22 29 0a 20 20 20 20 73 43  , " || ").    sC
0170: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 22 5c 5c  ode = re.sub("\\
0180: 62 6e 6f 74 5c 5c 62 22 2c 20 22 21 22 2c 20 73  bnot\\b", "!", s
0190: 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20  Code).    sCode 
01a0: 3d 20 72 65 2e 73 75 62 28 22 28 2e 2b 29 20 69  = re.sub("(.+) i
01b0: 66 20 28 2e 2b 29 20 65 6c 73 65 20 28 2e 2b 29  f (.+) else (.+)
01c0: 22 2c 20 22 28 5c 5c 32 29 20 3f 20 5c 5c 31 20  ", "(\\2) ? \\1 
01d0: 3a 20 5c 5c 33 22 2c 20 73 43 6f 64 65 29 0a 20  : \\3", sCode). 
01e0: 20 20 20 23 20 62 6f 6f 6c 65 61 6e 0a 20 20 20     # boolean.   
01f0: 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72   sCode = sCode.r
0200: 65 70 6c 61 63 65 28 22 46 61 6c 73 65 22 2c 20  eplace("False", 
0210: 22 66 61 6c 73 65 22 29 0a 20 20 20 20 73 43 6f  "false").    sCo
0220: 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61  de = sCode.repla
0230: 63 65 28 22 54 72 75 65 22 2c 20 22 74 72 75 65  ce("True", "true
0240: 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73  ").    sCode = s
0250: 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 62 6f  Code.replace("bo
0260: 6f 6c 22 2c 20 22 42 6f 6f 6c 65 61 6e 22 29 0a  ol", "Boolean").
0270: 20 20 20 20 23 20 6d 65 74 68 6f 64 73 0a 20 20      # methods.  
0280: 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e    sCode = sCode.
0290: 72 65 70 6c 61 63 65 28 22 2e 5f 5f 6c 65 6e 5f  replace(".__len_
02a0: 5f 28 29 22 2c 20 22 2e 6c 65 6e 67 74 68 22 29  _()", ".length")
02b0: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f  .    sCode = sCo
02c0: 64 65 2e 72 65 70 6c 61 63 65 28 22 2e 65 6e 64  de.replace(".end
02d0: 73 77 69 74 68 22 2c 20 22 2e 65 6e 64 73 57 69  swith", ".endsWi
02e0: 74 68 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d  th").    sCode =
02f0: 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22   sCode.replace("
0300: 2e 66 69 6e 64 22 2c 20 22 2e 69 6e 64 65 78 4f  .find", ".indexO
0310: 66 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20  f").    sCode = 
0320: 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 2e  sCode.replace(".
0330: 73 74 61 72 74 73 77 69 74 68 22 2c 20 22 2e 73  startswith", ".s
0340: 74 61 72 74 73 57 69 74 68 22 29 0a 20 20 20 20  tartsWith").    
0350: 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65  sCode = sCode.re
0360: 70 6c 61 63 65 28 22 2e 6c 6f 77 65 72 22 2c 20  place(".lower", 
0370: 22 2e 74 6f 4c 6f 77 65 72 43 61 73 65 22 29 0a  ".toLowerCase").
0380: 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64      sCode = sCod
0390: 65 2e 72 65 70 6c 61 63 65 28 22 2e 75 70 70 65  e.replace(".uppe
03a0: 72 22 2c 20 22 2e 74 6f 55 70 70 65 72 43 61 73  r", ".toUpperCas
03b0: 65 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20  e").    sCode = 
03c0: 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 2e  sCode.replace(".
03d0: 69 73 64 69 67 69 74 22 2c 20 22 2e 67 6c 5f 69  isdigit", ".gl_i
03e0: 73 44 69 67 69 74 22 29 0a 20 20 20 20 73 43 6f  sDigit").    sCo
03f0: 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61  de = sCode.repla
0400: 63 65 28 22 2e 69 73 75 70 70 65 72 22 2c 20 22  ce(".isupper", "
0410: 2e 67 6c 5f 69 73 55 70 70 65 72 43 61 73 65 22  .gl_isUpperCase"
0420: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43  ).    sCode = sC
0430: 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 2e 69 73  ode.replace(".is
0440: 6c 6f 77 65 72 22 2c 20 22 2e 67 6c 5f 69 73 4c  lower", ".gl_isL
0450: 6f 77 65 72 43 61 73 65 22 29 0a 20 20 20 20 73  owerCase").    s
0460: 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70  Code = sCode.rep
0470: 6c 61 63 65 28 22 2e 69 73 74 69 74 6c 65 22 2c  lace(".istitle",
0480: 20 22 2e 67 6c 5f 69 73 54 69 74 6c 65 22 29 0a   ".gl_isTitle").
0490: 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64      sCode = sCod
04a0: 65 2e 72 65 70 6c 61 63 65 28 22 2e 63 61 70 69  e.replace(".capi
04b0: 74 61 6c 69 7a 65 22 2c 20 22 2e 67 6c 5f 74 6f  talize", ".gl_to
04c0: 43 61 70 69 74 61 6c 69 7a 65 22 29 0a 20 20 20  Capitalize").   
04d0: 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72   sCode = sCode.r
04e0: 65 70 6c 61 63 65 28 22 2e 73 74 72 69 70 22 2c  eplace(".strip",
04f0: 20 22 2e 67 6c 5f 74 72 69 6d 22 29 0a 20 20 20   ".gl_trim").   
0500: 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72   sCode = sCode.r
0510: 65 70 6c 61 63 65 28 22 2e 6c 73 74 72 69 70 22  eplace(".lstrip"
0520: 2c 20 22 2e 67 6c 5f 74 72 69 6d 4c 65 66 74 22  , ".gl_trimLeft"
0530: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43  ).    sCode = sC
0540: 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 2e 72 73  ode.replace(".rs
0550: 74 72 69 70 22 2c 20 22 2e 67 6c 5f 74 72 69 6d  trip", ".gl_trim
0560: 52 69 67 68 74 22 29 0a 20 20 20 20 73 43 6f 64  Right").    sCod
0570: 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61 63  e = sCode.replac
0580: 65 28 27 2e 72 65 70 6c 61 63 65 28 22 2e 22 27  e('.replace("."'
0590: 2c 20 22 2e 72 65 70 6c 61 63 65 28 2f 5c 2e 2f  , ".replace(/\./
05a0: 67 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20  g").    sCode = 
05b0: 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 27 2e  sCode.replace('.
05c0: 72 65 70 6c 61 63 65 28 22 2e 2e 2e 22 27 2c 20  replace("..."', 
05d0: 22 2e 72 65 70 6c 61 63 65 28 2f 5c 2e 5c 2e 5c  ".replace(/\.\.\
05e0: 2e 2f 67 22 29 0a 20 20 20 20 73 43 6f 64 65 20  ./g").    sCode 
05f0: 3d 20 72 65 2e 73 75 62 28 27 2e 72 65 70 6c 61  = re.sub('.repla
0600: 63 65 5c 28 22 28 5b 5e 22 5d 2b 29 22 20 3f 2c  ce\("([^"]+)" ?,
0610: 27 2c 20 22 2e 72 65 70 6c 61 63 65 28 2f 5c 5c  ', ".replace(/\\
0620: 31 2f 67 2c 22 2c 20 73 43 6f 64 65 29 0a 20 20  1/g,", sCode).  
0630: 20 20 23 20 72 65 67 65 78 0a 20 20 20 20 73 43    # regex.    sC
0640: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 27 72 65  ode = re.sub('re
0650: 2e 73 65 61 72 63 68 5c 28 22 28 5b 5e 22 5d 2b  .search\("([^"]+
0660: 29 22 2c 20 2a 28 6d 2e 67 72 6f 75 70 5c 28 5c  )", *(m.group\(\
0670: 5c 64 5c 29 29 5c 29 27 2c 20 22 28 5c 5c 32 2e  \d\))\)', "(\\2.
0680: 73 65 61 72 63 68 28 2f 5c 5c 31 2f 29 20 3e 3d  search(/\\1/) >=
0690: 20 30 29 22 2c 20 73 43 6f 64 65 29 0a 20 20 20   0)", sCode).   
06a0: 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28   sCode = re.sub(
06b0: 22 2e 73 65 61 72 63 68 5c 5c 28 2f 5c 5c 28 5c  ".search\\(/\\(\
06c0: 5c 3f 69 5c 5c 29 28 5b 5e 2f 5d 2b 29 2f 5c 5c  \?i\\)([^/]+)/\\
06d0: 29 20 3e 3d 20 30 5c 5c 29 22 2c 20 22 2e 73 65  ) >= 0\\)", ".se
06e0: 61 72 63 68 28 2f 5c 5c 31 2f 69 29 20 3e 3d 20  arch(/\\1/i) >= 
06f0: 30 29 22 2c 20 73 43 6f 64 65 29 0a 20 20 20 20  0)", sCode).    
0700: 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 27  sCode = re.sub('
0710: 28 6c 6f 6f 6b 5c 5c 28 73 78 3f 5b 5d 5b 2e 61  (look\\(sx?[][.a
0720: 2d 7a 3a 28 29 5d 2a 29 2c 20 22 5c 5c 28 5c 5c  -z:()]*), "\\(\\
0730: 3f 69 5c 5c 29 28 5b 5e 22 5d 2b 29 22 27 2c 20  ?i\\)([^"]+)"', 
0740: 22 5c 5c 31 2c 20 2f 5c 5c 32 2f 69 22 2c 20 73  "\\1, /\\2/i", s
0750: 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20  Code).    sCode 
0760: 3d 20 72 65 2e 73 75 62 28 27 28 6c 6f 6f 6b 5c  = re.sub('(look\
0770: 5c 28 73 78 3f 5b 5d 5b 2e 61 2d 7a 3a 28 29 5d  \(sx?[][.a-z:()]
0780: 2a 29 2c 20 22 28 5b 5e 22 5d 2b 29 22 27 2c 20  *), "([^"]+)"', 
0790: 22 5c 5c 31 2c 20 2f 5c 5c 32 2f 22 2c 20 73 43  "\\1, /\\2/", sC
07a0: 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d  ode).    sCode =
07b0: 20 72 65 2e 73 75 62 28 27 28 6c 6f 6f 6b 5f 63   re.sub('(look_c
07c0: 68 6b 31 5c 5c 28 64 44 41 2c 20 73 78 3f 5b 5d  hk1\\(dDA, sx?[]
07d0: 5b 2e 61 2d 7a 3a 28 29 5d 2a 2c 20 5b 30 2d 39  [.a-z:()]*, [0-9
07e0: 61 2d 7a 2e 28 29 5d 2b 29 2c 20 22 5c 5c 28 5c  a-z.()]+), "\\(\
07f0: 5c 3f 69 5c 5c 29 28 5b 5e 22 5d 2b 29 22 27 2c  \?i\\)([^"]+)"',
0800: 20 22 5c 5c 31 2c 20 2f 5c 5c 32 2f 69 22 2c 20   "\\1, /\\2/i", 
0810: 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65  sCode).    sCode
0820: 20 3d 20 72 65 2e 73 75 62 28 27 28 6c 6f 6f 6b   = re.sub('(look
0830: 5f 63 68 6b 31 5c 5c 28 64 44 41 2c 20 73 78 3f  _chk1\\(dDA, sx?
0840: 5b 5d 5b 2e 61 2d 7a 3a 28 29 5d 2a 2c 20 5b 30  [][.a-z:()]*, [0
0850: 2d 39 61 2d 7a 2e 28 29 5d 2b 29 2c 20 22 28 5b  -9a-z.()]+), "([
0860: 5e 22 5d 2b 29 22 27 2c 20 22 5c 5c 31 2c 20 2f  ^"]+)"', "\\1, /
0870: 5c 5c 32 2f 69 22 2c 20 73 43 6f 64 65 29 0a 20  \\2/i", sCode). 
0880: 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75     sCode = re.su
0890: 62 28 27 6d 5c 5c 2e 67 72 6f 75 70 5c 5c 28 28  b('m\\.group\\((
08a0: 5c 5c 64 2b 29 5c 5c 29 20 2b 69 6e 20 2b 28 61  \\d+)\\) +in +(a
08b0: 5b 61 2d 7a 41 2d 5a 5d 2b 29 27 2c 20 22 5c 5c  [a-zA-Z]+)', "\\
08c0: 32 2e 68 61 73 28 6d 5b 5c 5c 31 5d 29 22 2c 20  2.has(m[\\1])", 
08d0: 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65  sCode).    sCode
08e0: 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65   = sCode.replace
08f0: 28 22 28 3f 3c 21 2d 29 22 2c 20 22 22 29 20 20  ("(?<!-)", "")  
0900: 23 20 74 6f 64 6f 0a 20 20 20 20 23 20 73 6c 69  # todo.    # sli
0910: 63 65 73 0a 20 20 20 20 73 43 6f 64 65 20 3d 20  ces.    sCode = 
0920: 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 5b  sCode.replace("[
0930: 3a 6d 2e 73 74 61 72 74 28 29 5d 22 2c 20 22 2e  :m.start()]", ".
0940: 73 6c 69 63 65 28 30 2c 6d 2e 69 6e 64 65 78 29  slice(0,m.index)
0950: 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73  ").    sCode = s
0960: 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 5b 6d  Code.replace("[m
0970: 2e 65 6e 64 28 29 3a 5d 22 2c 20 22 2e 73 6c 69  .end():]", ".sli
0980: 63 65 28 6d 2e 65 6e 64 5b 30 5d 29 22 29 0a 20  ce(m.end[0])"). 
0990: 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65     sCode = sCode
09a0: 2e 72 65 70 6c 61 63 65 28 22 5b 6d 2e 73 74 61  .replace("[m.sta
09b0: 72 74 28 29 3a 6d 2e 65 6e 64 28 29 5d 22 2c 20  rt():m.end()]", 
09c0: 22 2e 73 6c 69 63 65 28 6d 2e 69 6e 64 65 78 2c  ".slice(m.index,
09d0: 20 6d 2e 65 6e 64 5b 30 5d 29 22 29 0a 20 20 20   m.end[0])").   
09e0: 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28   sCode = re.sub(
09f0: 22 5c 5c 5b 28 2d 3f 5c 5c 64 2b 29 3a 28 2d 3f  "\\[(-?\\d+):(-?
0a00: 5c 5c 64 2b 29 5c 5c 5d 22 2c 20 22 2e 73 6c 69  \\d+)\\]", ".sli
0a10: 63 65 28 5c 5c 31 2c 5c 5c 32 29 22 2c 20 73 43  ce(\\1,\\2)", sC
0a20: 6f 64 65 29 0a 20 20 20 20 73 43 6f 64 65 20 3d  ode).    sCode =
0a30: 20 72 65 2e 73 75 62 28 22 5c 5c 5b 28 2d 3f 5c   re.sub("\\[(-?\
0a40: 5c 64 2b 29 3a 5c 5c 5d 22 2c 20 22 2e 73 6c 69  \d+):\\]", ".sli
0a50: 63 65 28 5c 5c 31 29 22 2c 20 73 43 6f 64 65 29  ce(\\1)", sCode)
0a60: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e  .    sCode = re.
0a70: 73 75 62 28 22 5c 5c 5b 3a 28 2d 3f 5c 5c 64 2b  sub("\\[:(-?\\d+
0a80: 29 5c 5c 5d 22 2c 20 22 2e 73 6c 69 63 65 28 30  )\\]", ".slice(0
0a90: 2c 5c 5c 31 29 22 2c 20 73 43 6f 64 65 29 0a 20  ,\\1)", sCode). 
0aa0: 20 20 20 23 20 72 65 67 65 78 20 6d 61 74 63 68     # regex match
0ab0: 65 73 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73  es.    sCode = s
0ac0: 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 2e 65  Code.replace(".e
0ad0: 6e 64 28 29 22 2c 20 22 2e 65 6e 64 5b 30 5d 22  nd()", ".end[0]"
0ae0: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43  ).    sCode = sC
0af0: 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 2e 73 74  ode.replace(".st
0b00: 61 72 74 28 29 22 2c 20 22 2e 69 6e 64 65 78 22  art()", ".index"
0b10: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43  ).    sCode = sC
0b20: 6f 64 65 2e 72 65 70 6c 61 63 65 28 22 6d 2e 67  ode.replace("m.g
0b30: 72 6f 75 70 28 29 22 2c 20 22 6d 5b 30 5d 22 29  roup()", "m[0]")
0b40: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65 2e  .    sCode = re.
0b50: 73 75 62 28 22 5c 5c 2e 73 74 61 72 74 5c 5c 28  sub("\\.start\\(
0b60: 28 5c 5c 64 2b 29 5c 5c 29 22 2c 20 22 2e 73 74  (\\d+)\\)", ".st
0b70: 61 72 74 5b 5c 5c 31 5d 22 2c 20 73 43 6f 64 65  art[\\1]", sCode
0b80: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 72 65  ).    sCode = re
0b90: 2e 73 75 62 28 22 6d 5c 5c 2e 67 72 6f 75 70 5c  .sub("m\\.group\
0ba0: 5c 28 28 5c 5c 64 2b 29 5c 5c 29 22 2c 20 22 6d  \((\\d+)\\)", "m
0bb0: 5b 5c 5c 31 5d 22 2c 20 73 43 6f 64 65 29 0a 20  [\\1]", sCode). 
0bc0: 20 20 20 23 20 74 75 70 6c 65 73 20 2d 3e 20 6c     # tuples -> l
0bd0: 69 73 74 73 0a 20 20 20 20 73 43 6f 64 65 20 3d  ists.    sCode =
0be0: 20 72 65 2e 73 75 62 28 22 5c 28 28 6d 5c 2e 73   re.sub("\((m\.s
0bf0: 74 61 72 74 5c 5b 5c 5c 64 2b 5c 5d 2c 20 6d 5c  tart\[\\d+\], m\
0c00: 5b 5c 5c 64 2b 5c 5d 29 5c 29 22 2c 20 22 5b 5c  [\\d+\])\)", "[\
0c10: 5c 31 5d 22 2c 20 73 43 6f 64 65 29 0a 20 20 20  \1]", sCode).   
0c20: 20 23 20 72 65 67 65 78 0a 20 20 20 20 73 43 6f   # regex.    sCo
0c30: 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61  de = sCode.repla
0c40: 63 65 28 22 5c 77 5b 5c 77 2d 5d 2b 22 2c 20 22  ce("\w[\w-]+", "
0c50: 5b 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3 80 2d c3  [a-zA-Z..-....-.
0c60: 96 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d c3 9f c4  .0-9_..-....-...
0c70: 80 2d ca af ef ac 81 2d ef ac 86 5d 5b 61 2d 7a  .-.....-...][a-z
0c80: 41 2d 5a c3 a0 2d c3 b6 c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
0c90: 5f c3 b8 2d c3 bf c3 98 2d c3 9f c4 80 2d ca af  _..-....-....-..
0ca0: ef ac 81 2d ef ac 86 2d 5d 2b 22 29 0a 20 20 20  ...-...-]+").   
0cb0: 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72   sCode = sCode.r
0cc0: 65 70 6c 61 63 65 28 72 22 2f 5c 77 2f 22 2c 20  eplace(r"/\w/", 
0cd0: 22 2f 5b 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3 80  "/[a-zA-Z..-....
0ce0: 2d c3 96 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d c3  -..0-9_..-....-.
0cf0: 9f c4 80 2d ca af ef ac 81 2d ef ac 86 5d 2f 22  ...-.....-...]/"
0d00: 29 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43  ).    sCode = sC
0d10: 6f 64 65 2e 72 65 70 6c 61 63 65 28 72 22 5b 5c  ode.replace(r"[\
0d20: 77 2d 5d 22 2c 20 22 5b 61 2d 7a 41 2d 5a c3 a0  w-]", "[a-zA-Z..
0d30: 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f c3 b8 2d c3  -....-..0-9_..-.
0d40: bf c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d ef  ...-....-.....-.
0d50: ac 86 2d 5d 22 29 0a 20 20 20 20 73 43 6f 64 65  ..-]").    sCode
0d60: 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65   = sCode.replace
0d70: 28 72 22 5b 5c 77 2c 5d 22 2c 20 22 5b 61 2d 7a  (r"[\w,]", "[a-z
0d80: 41 2d 5a c3 a0 2d c3 b6 c3 80 2d c3 96 30 2d 39  A-Z..-....-..0-9
0d90: 5f c3 b8 2d c3 bf c3 98 2d c3 9f c4 80 2d ca af  _..-....-....-..
0da0: ef ac 81 2d ef ac 86 2c 5d 22 29 0a 20 20 20 20  ...-...,]").    
0db0: 72 65 74 75 72 6e 20 73 43 6f 64 65 0a 0a 0a 64  return sCode...d
0dc0: 65 66 20 72 65 67 65 78 32 6a 73 20 28 73 52 65  ef regex2js (sRe
0dd0: 67 65 78 2c 20 73 57 4f 52 44 4c 49 4d 49 54 4c  gex, sWORDLIMITL
0de0: 45 46 54 29 3a 0a 20 20 20 20 22 63 6f 6e 76 65  EFT):.    "conve
0df0: 72 74 73 20 50 79 74 68 6f 6e 20 72 65 67 65 78  rts Python regex
0e00: 20 74 6f 20 4a 53 20 72 65 67 65 78 20 61 6e 64   to JS regex and
0e10: 20 72 65 74 75 72 6e 73 20 4a 53 20 72 65 67 65   returns JS rege
0e20: 78 20 61 6e 64 20 6c 69 73 74 20 6f 66 20 6e 65  x and list of ne
0e30: 67 61 74 69 76 65 20 6c 6f 6f 6b 62 65 66 6f 72  gative lookbefor
0e40: 65 20 61 73 73 65 72 74 69 6f 6e 73 22 0a 20 20  e assertions".  
0e50: 20 20 23 20 20 20 4c 61 74 69 6e 20 6c 65 74 74    #   Latin lett
0e60: 65 72 73 3a 20 68 74 74 70 3a 2f 2f 75 6e 69 63  ers: http://unic
0e70: 6f 64 65 2d 74 61 62 6c 65 2e 63 6f 6d 2f 66 72  ode-table.com/fr
0e80: 2f 0a 20 20 20 20 23 20 20 20 30 2d 39 20 20 61  /.    #   0-9  a
0e90: 6e 64 20 20 5f 0a 20 20 20 20 23 20 20 20 41 2d  nd  _.    #   A-
0ea0: 5a 0a 20 20 20 20 23 20 20 20 61 2d 7a 0a 20 20  Z.    #   a-z.  
0eb0: 20 20 23 20 20 20 c3 80 2d c3 96 20 20 20 20 20    #   ..-..     
0ec0: 30 30 43 30 2d 30 30 44 36 20 20 20 28 75 70 70  00C0-00D6   (upp
0ed0: 65 72 20 63 61 73 65 29 0a 20 20 20 20 23 20 20  er case).    #  
0ee0: 20 c3 98 2d c3 9f 20 20 20 20 20 30 30 44 38 2d   ..-..     00D8-
0ef0: 30 30 44 46 20 20 20 28 75 70 70 65 72 20 63 61  00DF   (upper ca
0f00: 73 65 29 0a 20 20 20 20 23 20 20 20 c3 a0 2d c3  se).    #   ..-.
0f10: b6 20 20 20 20 20 30 30 45 30 2d 30 30 46 36 20  .     00E0-00F6 
0f20: 20 20 28 6c 6f 77 65 72 20 63 61 73 65 29 0a 20    (lower case). 
0f30: 20 20 20 23 20 20 20 c3 b8 2d c3 bf 20 20 20 20     #   ..-..    
0f40: 20 30 30 46 38 2d 30 30 46 46 20 20 20 28 6c 6f   00F8-00FF   (lo
0f50: 77 65 72 20 63 61 73 65 29 0a 20 20 20 20 23 20  wer case).    # 
0f60: 20 20 c4 80 2d ca af 20 20 20 20 20 30 31 30 30    ..-..     0100
0f70: 2d 30 32 41 46 20 20 20 28 6d 69 78 65 64 29 0a  -02AF   (mixed).
0f80: 20 20 20 20 23 20 20 20 2d 3e 20 61 2d 7a 41 2d      #   -> a-zA-
0f90: 5a c3 a0 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f c3  Z..-....-..0-9_.
0fa0: b8 2d c3 bf c3 98 2d c3 9f c4 80 2d ca af 0a 20  .-....-....-... 
0fb0: 20 20 20 62 43 61 73 65 49 6e 73 65 6e 73 69 74     bCaseInsensit
0fc0: 69 76 65 20 3d 20 46 61 6c 73 65 0a 20 20 20 20  ive = False.    
0fd0: 69 66 20 22 28 3f 69 29 22 20 69 6e 20 73 52 65  if "(?i)" in sRe
0fe0: 67 65 78 3a 0a 20 20 20 20 20 20 20 20 73 52 65  gex:.        sRe
0ff0: 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72 65 70  gex = sRegex.rep
1000: 6c 61 63 65 28 22 28 3f 69 29 22 2c 20 22 22 29  lace("(?i)", "")
1010: 0a 20 20 20 20 20 20 20 20 62 43 61 73 65 49 6e  .        bCaseIn
1020: 73 65 6e 73 69 74 69 76 65 20 3d 20 54 72 75 65  sensitive = True
1030: 0a 20 20 20 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66  .    lNegLookBef
1040: 6f 72 65 52 65 67 65 78 20 3d 20 5b 5d 0a 20 20  oreRegex = [].  
1050: 20 20 69 66 20 73 57 4f 52 44 4c 49 4d 49 54 4c    if sWORDLIMITL
1060: 45 46 54 20 69 6e 20 73 52 65 67 65 78 3a 0a 20  EFT in sRegex:. 
1070: 20 20 20 20 20 20 20 73 52 65 67 65 78 20 3d 20         sRegex = 
1080: 73 52 65 67 65 78 2e 72 65 70 6c 61 63 65 28 73  sRegex.replace(s
1090: 57 4f 52 44 4c 49 4d 49 54 4c 45 46 54 2c 20 22  WORDLIMITLEFT, "
10a0: 22 29 0a 20 20 20 20 20 20 20 20 6c 4e 65 67 4c  ").        lNegL
10b0: 6f 6f 6b 42 65 66 6f 72 65 52 65 67 65 78 20 3d  ookBeforeRegex =
10c0: 20 5b 22 5b 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3   ["[a-zA-Z..-...
10d0: 80 2d c3 96 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d  .-..0-9_..-....-
10e0: c3 9f c4 80 2d ca af 2e 2c e2 80 93 2d 5d 24 22  ....-...,...-]$"
10f0: 5d 0a 20 20 20 20 73 52 65 67 65 78 20 3d 20 73  ].    sRegex = s
1100: 52 65 67 65 78 2e 72 65 70 6c 61 63 65 28 22 5b  Regex.replace("[
1110: 5c 5c 77 22 2c 20 22 5b 61 2d 7a 41 2d 5a c3 a0  \\w", "[a-zA-Z..
1120: 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f c3 b8 2d c3  -....-..0-9_..-.
1130: bf c3 98 2d c3 9f c4 80 2d ca af 22 29 0a 20 20  ...-....-..").  
1140: 20 20 73 52 65 67 65 78 20 3d 20 73 52 65 67 65    sRegex = sRege
1150: 78 2e 72 65 70 6c 61 63 65 28 22 5c 5c 77 22 2c  x.replace("\\w",
1160: 20 22 5b 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3 80   "[a-zA-Z..-....
1170: 2d c3 96 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d c3  -..0-9_..-....-.
1180: 9f c4 80 2d ca af 5d 22 29 0a 20 20 20 20 73 52  ...-..]").    sR
1190: 65 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72 65  egex = sRegex.re
11a0: 70 6c 61 63 65 28 22 5b 2e 5d 22 2c 20 72 22 5c  place("[.]", r"\
11b0: 2e 22 29 0a 20 20 20 20 69 66 20 6e 6f 74 20 73  .").    if not s
11c0: 52 65 67 65 78 2e 73 74 61 72 74 73 77 69 74 68  Regex.startswith
11d0: 28 22 3c 6a 73 3e 22 29 3a 0a 20 20 20 20 20 20  ("<js>"):.      
11e0: 20 20 73 52 65 67 65 78 20 3d 20 73 52 65 67 65    sRegex = sRege
11f0: 78 2e 72 65 70 6c 61 63 65 28 22 2f 22 2c 20 72  x.replace("/", r
1200: 22 5c 2f 22 29 0a 20 20 20 20 6d 20 3d 20 72 65  "\/").    m = re
1210: 2e 73 65 61 72 63 68 28 72 22 5c 28 5c 3f 3c 21  .search(r"\(\?<!
1220: 28 5b 5e 28 29 5d 2b 29 5c 29 22 2c 20 73 52 65  ([^()]+)\)", sRe
1230: 67 65 78 29 20 20 23 20 4e 65 67 61 74 69 76 65  gex)  # Negative
1240: 20 6c 6f 6f 6b 62 65 66 6f 72 65 20 61 73 73 65   lookbefore asse
1250: 72 74 69 6f 6e 20 73 68 6f 75 6c 64 20 61 6c 77  rtion should alw
1260: 61 79 73 20 62 65 20 61 74 20 74 68 65 20 62 65  ays be at the be
1270: 67 69 6e 6e 69 6e 67 20 6f 66 20 72 65 67 65 78  ginning of regex
1280: 0a 20 20 20 20 69 66 20 6d 3a 0a 20 20 20 20 20  .    if m:.     
1290: 20 20 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72     lNegLookBefor
12a0: 65 52 65 67 65 78 2e 61 70 70 65 6e 64 28 6d 2e  eRegex.append(m.
12b0: 67 72 6f 75 70 28 31 29 2b 22 24 22 29 0a 20 20  group(1)+"$").  
12c0: 20 20 20 20 20 20 73 52 65 67 65 78 20 3d 20 73        sRegex = s
12d0: 52 65 67 65 78 2e 72 65 70 6c 61 63 65 28 6d 2e  Regex.replace(m.
12e0: 67 72 6f 75 70 28 30 29 2c 20 22 22 29 0a 20 20  group(0), "").  
12f0: 20 20 69 66 20 22 28 3f 3c 22 20 69 6e 20 73 52    if "(?<" in sR
1300: 65 67 65 78 3a 0a 20 20 20 20 20 20 20 20 70 72  egex:.        pr
1310: 69 6e 74 28 22 23 20 57 61 72 6e 69 6e 67 2e 20  int("# Warning. 
1320: 4c 6f 6f 6b 62 65 66 6f 72 65 20 61 73 73 65 72  Lookbefore asser
1330: 74 69 6f 6e 20 6e 6f 74 20 63 68 61 6e 67 65 64  tion not changed
1340: 20 69 6e 3a 5c 6e 20 20 22 29 0a 20 20 20 20 20   in:\n  ").     
1350: 20 20 20 70 72 69 6e 74 28 73 52 65 67 65 78 29     print(sRegex)
1360: 0a 20 20 20 20 69 66 20 73 52 65 67 65 78 2e 73  .    if sRegex.s
1370: 74 61 72 74 73 77 69 74 68 28 22 3c 6a 73 3e 22  tartswith("<js>"
1380: 29 3a 0a 20 20 20 20 20 20 20 20 73 52 65 67 65  ):.        sRege
1390: 78 20 3d 20 73 52 65 67 65 78 2e 72 65 70 6c 61  x = sRegex.repla
13a0: 63 65 28 27 3c 6a 73 3e 27 2c 20 27 2f 27 29 2e  ce('<js>', '/').
13b0: 72 65 70 6c 61 63 65 28 27 3c 2f 6a 73 3e 69 27  replace('</js>i'
13c0: 2c 20 27 2f 69 67 27 29 2e 72 65 70 6c 61 63 65  , '/ig').replace
13d0: 28 27 3c 2f 6a 73 3e 27 2c 20 27 2f 67 27 29 0a  ('</js>', '/g').
13e0: 20 20 20 20 65 6c 73 65 3a 0a 20 20 20 20 20 20      else:.      
13f0: 20 20 73 52 65 67 65 78 20 3d 20 22 2f 22 20 2b    sRegex = "/" +
1400: 20 73 52 65 67 65 78 20 2b 20 22 2f 67 22 0a 20   sRegex + "/g". 
1410: 20 20 20 69 66 20 62 43 61 73 65 49 6e 73 65 6e     if bCaseInsen
1420: 73 69 74 69 76 65 20 61 6e 64 20 6e 6f 74 20 73  sitive and not s
1430: 52 65 67 65 78 2e 65 6e 64 73 77 69 74 68 28 22  Regex.endswith("
1440: 2f 69 67 22 29 3a 0a 20 20 20 20 20 20 20 20 73  /ig"):.        s
1450: 52 65 67 65 78 20 3d 20 73 52 65 67 65 78 20 2b  Regex = sRegex +
1460: 20 22 69 22 0a 20 20 20 20 69 66 20 6e 6f 74 20   "i".    if not 
1470: 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72 65 52 65  lNegLookBeforeRe
1480: 67 65 78 3a 0a 20 20 20 20 20 20 20 20 6c 4e 65  gex:.        lNe
1490: 67 4c 6f 6f 6b 42 65 66 6f 72 65 52 65 67 65 78  gLookBeforeRegex
14a0: 20 3d 20 4e 6f 6e 65 0a 20 20 20 20 72 65 74 75   = None.    retu
14b0: 72 6e 20 28 73 52 65 67 65 78 2c 20 6c 4e 65 67  rn (sRegex, lNeg
14c0: 4c 6f 6f 6b 42 65 66 6f 72 65 52 65 67 65 78 29  LookBeforeRegex)
14d0: 0a 0a 0a 64 65 66 20 70 79 52 75 6c 65 54 6f 4a  ...def pyRuleToJ
14e0: 53 20 28 6c 52 75 6c 65 2c 20 64 4a 53 52 45 47  S (lRule, dJSREG
14f0: 45 58 45 53 2c 20 73 57 4f 52 44 4c 49 4d 49 54  EXES, sWORDLIMIT
1500: 4c 45 46 54 29 3a 0a 20 20 20 20 6c 52 75 6c 65  LEFT):.    lRule
1510: 4a 53 20 3d 20 63 6f 70 79 2e 64 65 65 70 63 6f  JS = copy.deepco
1520: 70 79 28 6c 52 75 6c 65 29 0a 20 20 20 20 64 65  py(lRule).    de
1530: 6c 20 6c 52 75 6c 65 5b 2d 31 5d 20 23 20 74 47  l lRule[-1] # tG
1540: 72 6f 75 70 73 20 70 6f 73 69 74 69 6f 6e 69 6e  roups positionin
1550: 67 20 63 6f 64 65 73 20 61 72 65 20 75 73 65 6c  g codes are usel
1560: 65 73 73 20 66 6f 72 20 50 79 74 68 6f 6e 0a 20  ess for Python. 
1570: 20 20 20 23 20 65 72 72 6f 72 20 6d 65 73 73 61     # error messa
1580: 67 65 73 0a 20 20 20 20 66 6f 72 20 61 41 63 74  ges.    for aAct
1590: 69 6f 6e 20 69 6e 20 6c 52 75 6c 65 4a 53 5b 36  ion in lRuleJS[6
15a0: 5d 3a 0a 20 20 20 20 20 20 20 20 69 66 20 61 41  ]:.        if aA
15b0: 63 74 69 6f 6e 5b 31 5d 20 3d 3d 20 22 2d 22 3a  ction[1] == "-":
15c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 41 63  .            aAc
15d0: 74 69 6f 6e 5b 32 5d 20 3d 20 61 41 63 74 69 6f  tion[2] = aActio
15e0: 6e 5b 32 5d 2e 72 65 70 6c 61 63 65 28 22 c2 a0  n[2].replace("..
15f0: 22 2c 20 22 e2 80 af 22 29 20 23 20 6e 62 73 70  ", "...") # nbsp
1600: 20 2d 2d 3e 20 6e 6e 62 73 70 0a 20 20 20 20 20   --> nnbsp.     
1610: 20 20 20 20 20 20 20 61 41 63 74 69 6f 6e 5b 34         aAction[4
1620: 5d 20 3d 20 61 41 63 74 69 6f 6e 5b 34 5d 2e 72  ] = aAction[4].r
1630: 65 70 6c 61 63 65 28 22 c2 ab 20 22 2c 20 22 c2  eplace(".. ", ".
1640: ab e2 80 af 22 29 2e 72 65 70 6c 61 63 65 28 22  ....").replace("
1650: 20 c2 bb 22 2c 20 22 e2 80 af c2 bb 22 29 2e 72   ..", ".....").r
1660: 65 70 6c 61 63 65 28 22 20 3a 22 2c 20 22 e2 80  eplace(" :", "..
1670: af 3a 22 29 2e 72 65 70 6c 61 63 65 28 22 c2 a0  .:").replace("..
1680: 3a 22 2c 20 22 e2 80 af 3a 22 29 0a 20 20 20 20  :", "...:").    
1690: 23 20 6a 73 20 72 65 67 65 78 65 73 0a 20 20 20  # js regexes.   
16a0: 20 6c 52 75 6c 65 4a 53 5b 31 5d 2c 20 6c 4e 65   lRuleJS[1], lNe
16b0: 67 4c 6f 6f 6b 42 65 68 69 6e 64 52 65 67 65 78  gLookBehindRegex
16c0: 20 3d 20 72 65 67 65 78 32 6a 73 28 64 4a 53 52   = regex2js(dJSR
16d0: 45 47 45 58 45 53 2e 67 65 74 28 6c 52 75 6c 65  EGEXES.get(lRule
16e0: 4a 53 5b 33 5d 2c 20 6c 52 75 6c 65 4a 53 5b 31  JS[3], lRuleJS[1
16f0: 5d 29 2c 20 73 57 4f 52 44 4c 49 4d 49 54 4c 45  ]), sWORDLIMITLE
1700: 46 54 29 0a 20 20 20 20 6c 52 75 6c 65 4a 53 2e  FT).    lRuleJS.
1710: 61 70 70 65 6e 64 28 6c 4e 65 67 4c 6f 6f 6b 42  append(lNegLookB
1720: 65 68 69 6e 64 52 65 67 65 78 29 0a 20 20 20 20  ehindRegex).    
1730: 72 65 74 75 72 6e 20 6c 52 75 6c 65 4a 53 0a 0a  return lRuleJS..
1740: 0a 64 65 66 20 77 72 69 74 65 52 75 6c 65 73 54  .def writeRulesT
1750: 6f 4a 53 41 72 72 61 79 20 28 6c 52 75 6c 65 73  oJSArray (lRules
1760: 29 3a 0a 20 20 20 20 73 41 72 72 61 79 20 3d 20  ):.    sArray = 
1770: 22 5b 5c 6e 22 0a 20 20 20 20 66 6f 72 20 73 4f  "[\n".    for sO
1780: 70 74 69 6f 6e 2c 20 61 52 75 6c 65 47 72 6f 75  ption, aRuleGrou
1790: 70 20 69 6e 20 6c 52 75 6c 65 73 3a 0a 20 20 20  p in lRules:.   
17a0: 20 20 20 20 20 73 41 72 72 61 79 20 2b 3d 20 27       sArray += '
17b0: 20 20 5b 22 27 20 2b 20 73 4f 70 74 69 6f 6e 20    ["' + sOption 
17c0: 2b 20 27 22 2c 20 5b 5c 6e 27 20 20 69 66 20 73  + '", [\n'  if s
17d0: 4f 70 74 69 6f 6e 20 20 65 6c 73 65 20 20 22 20  Option  else  " 
17e0: 20 5b 66 61 6c 73 65 2c 20 5b 5c 6e 22 0a 20 20   [false, [\n".  
17f0: 20 20 20 20 20 20 66 6f 72 20 73 52 65 67 65 78        for sRegex
1800: 2c 20 62 43 61 73 65 49 6e 73 65 6e 73 69 74 69  , bCaseInsensiti
1810: 76 65 2c 20 73 4c 69 6e 65 49 64 2c 20 73 52 75  ve, sLineId, sRu
1820: 6c 65 49 64 2c 20 6e 50 72 69 6f 72 69 74 79 2c  leId, nPriority,
1830: 20 6c 41 63 74 69 6f 6e 73 2c 20 61 47 72 6f 75   lActions, aGrou
1840: 70 73 2c 20 61 4e 65 67 4c 6f 6f 6b 42 65 68 69  ps, aNegLookBehi
1850: 6e 64 52 65 67 65 78 20 69 6e 20 61 52 75 6c 65  ndRegex in aRule
1860: 47 72 6f 75 70 3a 0a 20 20 20 20 20 20 20 20 20  Group:.         
1870: 20 20 20 73 41 72 72 61 79 20 2b 3d 20 27 20 20     sArray += '  
1880: 20 20 5b 27 20 2b 20 73 52 65 67 65 78 20 2b 20    [' + sRegex + 
1890: 22 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ", ".           
18a0: 20 73 41 72 72 61 79 20 2b 3d 20 22 74 72 75 65   sArray += "true
18b0: 2c 20 22 20 69 66 20 62 43 61 73 65 49 6e 73 65  , " if bCaseInse
18c0: 6e 73 69 74 69 76 65 20 20 65 6c 73 65 20 22 66  nsitive  else "f
18d0: 61 6c 73 65 2c 20 22 0a 20 20 20 20 20 20 20 20  alse, ".        
18e0: 20 20 20 20 73 41 72 72 61 79 20 2b 3d 20 27 22      sArray += '"
18f0: 27 20 2b 20 73 4c 69 6e 65 49 64 20 2b 20 27 22  ' + sLineId + '"
1900: 2c 20 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  , '.            
1910: 73 41 72 72 61 79 20 2b 3d 20 27 22 27 20 2b 20  sArray += '"' + 
1920: 73 52 75 6c 65 49 64 20 2b 20 27 22 2c 20 27 0a  sRuleId + '", '.
1930: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 72 72              sArr
1940: 61 79 20 2b 3d 20 73 74 72 28 6e 50 72 69 6f 72  ay += str(nPrior
1950: 69 74 79 29 20 2b 20 22 2c 20 22 0a 20 20 20 20  ity) + ", ".    
1960: 20 20 20 20 20 20 20 20 73 41 72 72 61 79 20 2b          sArray +
1970: 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28 6c 41 63  = json.dumps(lAc
1980: 74 69 6f 6e 73 2c 20 65 6e 73 75 72 65 5f 61 73  tions, ensure_as
1990: 63 69 69 3d 46 61 6c 73 65 29 20 2b 20 22 2c 20  cii=False) + ", 
19a0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  ".            sA
19b0: 72 72 61 79 20 2b 3d 20 6a 73 6f 6e 2e 64 75 6d  rray += json.dum
19c0: 70 73 28 61 47 72 6f 75 70 73 2c 20 65 6e 73 75  ps(aGroups, ensu
19d0: 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29 20  re_ascii=False) 
19e0: 2b 20 22 2c 20 22 0a 20 20 20 20 20 20 20 20 20  + ", ".         
19f0: 20 20 20 73 41 72 72 61 79 20 2b 3d 20 6a 73 6f     sArray += jso
1a00: 6e 2e 64 75 6d 70 73 28 61 4e 65 67 4c 6f 6f 6b  n.dumps(aNegLook
1a10: 42 65 68 69 6e 64 52 65 67 65 78 2c 20 65 6e 73  BehindRegex, ens
1a20: 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73 65 29  ure_ascii=False)
1a30: 20 2b 20 22 5d 2c 5c 6e 22 0a 20 20 20 20 20 20   + "],\n".      
1a40: 20 20 73 41 72 72 61 79 20 2b 3d 20 22 20 20 5d    sArray += "  ]
1a50: 5d 2c 5c 6e 22 0a 20 20 20 20 73 41 72 72 61 79  ],\n".    sArray
1a60: 20 2b 3d 20 22 5d 22 0a 20 20 20 20 72 65 74 75   += "]".    retu
1a70: 72 6e 20 73 41 72 72 61 79 0a 0a 0a 64 65 66 20  rn sArray...def 
1a80: 67 72 6f 75 70 73 50 6f 73 69 74 69 6f 6e 69 6e  groupsPositionin
1a90: 67 43 6f 64 65 54 6f 4c 69 73 74 20 28 73 47 72  gCodeToList (sGr
1aa0: 6f 75 70 73 50 6f 73 69 74 69 6f 6e 69 6e 67 43  oupsPositioningC
1ab0: 6f 64 65 29 3a 0a 20 20 20 20 69 66 20 6e 6f 74  ode):.    if not
1ac0: 20 73 47 72 6f 75 70 73 50 6f 73 69 74 69 6f 6e   sGroupsPosition
1ad0: 69 6e 67 43 6f 64 65 3a 0a 20 20 20 20 20 20 20  ingCode:.       
1ae0: 20 72 65 74 75 72 6e 20 4e 6f 6e 65 0a 20 20 20   return None.   
1af0: 20 72 65 74 75 72 6e 20 5b 20 69 6e 74 28 73 43   return [ int(sC
1b00: 6f 64 65 29 20 20 69 66 20 73 43 6f 64 65 2e 69  ode)  if sCode.i
1b10: 73 64 69 67 69 74 28 29 20 6f 72 20 28 73 43 6f  sdigit() or (sCo
1b20: 64 65 5b 30 3a 31 5d 20 3d 3d 20 22 2d 22 20 61  de[0:1] == "-" a
1b30: 6e 64 20 73 43 6f 64 65 5b 31 3a 5d 2e 69 73 64  nd sCode[1:].isd
1b40: 69 67 69 74 28 29 29 20 20 65 6c 73 65 20 73 43  igit())  else sC
1b50: 6f 64 65 20 5c 0a 20 20 20 20 20 20 20 20 20 20  ode \.          
1b60: 20 20 20 66 6f 72 20 73 43 6f 64 65 20 69 6e 20     for sCode in 
1b70: 73 47 72 6f 75 70 73 50 6f 73 69 74 69 6f 6e 69  sGroupsPositioni
1b80: 6e 67 43 6f 64 65 2e 73 70 6c 69 74 28 22 2c 22  ngCode.split(","
1b90: 29 20 5d 0a                                      ) ].