Grammalecte  Hex Artifact Content

Artifact e1dbc7ea448d47a98611801826a59c18da38434ffd7910a1d5c31d05369e052c:


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 73 43 6f 64 65     sCode = sCode
0890: 2e 72 65 70 6c 61 63 65 28 22 28 3f 3c 21 2d 29  .replace("(?<!-)
08a0: 22 2c 20 22 22 29 20 20 23 20 74 6f 64 6f 0a 20  ", "")  # todo. 
08b0: 20 20 20 23 20 73 6c 69 63 65 73 0a 20 20 20 20     # slices.    
08c0: 73 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65  sCode = sCode.re
08d0: 70 6c 61 63 65 28 22 5b 3a 6d 2e 73 74 61 72 74  place("[:m.start
08e0: 28 29 5d 22 2c 20 22 2e 73 6c 69 63 65 28 30 2c  ()]", ".slice(0,
08f0: 6d 2e 69 6e 64 65 78 29 22 29 0a 20 20 20 20 73  m.index)").    s
0900: 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70  Code = sCode.rep
0910: 6c 61 63 65 28 22 5b 6d 2e 65 6e 64 28 29 3a 5d  lace("[m.end():]
0920: 22 2c 20 22 2e 73 6c 69 63 65 28 6d 2e 65 6e 64  ", ".slice(m.end
0930: 5b 30 5d 29 22 29 0a 20 20 20 20 73 43 6f 64 65  [0])").    sCode
0940: 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65   = sCode.replace
0950: 28 22 5b 6d 2e 73 74 61 72 74 28 29 3a 6d 2e 65  ("[m.start():m.e
0960: 6e 64 28 29 5d 22 2c 20 22 2e 73 6c 69 63 65 28  nd()]", ".slice(
0970: 6d 2e 69 6e 64 65 78 2c 20 6d 2e 65 6e 64 5b 30  m.index, m.end[0
0980: 5d 29 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d  ])").    sCode =
0990: 20 72 65 2e 73 75 62 28 22 5c 5c 5b 28 2d 3f 5c   re.sub("\\[(-?\
09a0: 5c 64 2b 29 3a 28 2d 3f 5c 5c 64 2b 29 5c 5c 5d  \d+):(-?\\d+)\\]
09b0: 22 2c 20 22 2e 73 6c 69 63 65 28 5c 5c 31 2c 5c  ", ".slice(\\1,\
09c0: 5c 32 29 22 2c 20 73 43 6f 64 65 29 0a 20 20 20  \2)", sCode).   
09d0: 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28   sCode = re.sub(
09e0: 22 5c 5c 5b 28 2d 3f 5c 5c 64 2b 29 3a 5c 5c 5d  "\\[(-?\\d+):\\]
09f0: 22 2c 20 22 2e 73 6c 69 63 65 28 5c 5c 31 29 22  ", ".slice(\\1)"
0a00: 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43 6f  , sCode).    sCo
0a10: 64 65 20 3d 20 72 65 2e 73 75 62 28 22 5c 5c 5b  de = re.sub("\\[
0a20: 3a 28 2d 3f 5c 5c 64 2b 29 5c 5c 5d 22 2c 20 22  :(-?\\d+)\\]", "
0a30: 2e 73 6c 69 63 65 28 30 2c 5c 5c 31 29 22 2c 20  .slice(0,\\1)", 
0a40: 73 43 6f 64 65 29 0a 20 20 20 20 23 20 72 65 67  sCode).    # reg
0a50: 65 78 20 6d 61 74 63 68 65 73 0a 20 20 20 20 73  ex matches.    s
0a60: 43 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70  Code = sCode.rep
0a70: 6c 61 63 65 28 22 2e 65 6e 64 28 29 22 2c 20 22  lace(".end()", "
0a80: 2e 65 6e 64 5b 30 5d 22 29 0a 20 20 20 20 73 43  .end[0]").    sC
0a90: 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c  ode = sCode.repl
0aa0: 61 63 65 28 22 2e 73 74 61 72 74 28 29 22 2c 20  ace(".start()", 
0ab0: 22 2e 69 6e 64 65 78 22 29 0a 20 20 20 20 73 43  ".index").    sC
0ac0: 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c  ode = sCode.repl
0ad0: 61 63 65 28 22 6d 2e 67 72 6f 75 70 28 29 22 2c  ace("m.group()",
0ae0: 20 22 6d 5b 30 5d 22 29 0a 20 20 20 20 73 43 6f   "m[0]").    sCo
0af0: 64 65 20 3d 20 72 65 2e 73 75 62 28 22 5c 5c 2e  de = re.sub("\\.
0b00: 73 74 61 72 74 5c 5c 28 28 5c 5c 64 2b 29 5c 5c  start\\((\\d+)\\
0b10: 29 22 2c 20 22 2e 73 74 61 72 74 5b 5c 5c 31 5d  )", ".start[\\1]
0b20: 22 2c 20 73 43 6f 64 65 29 0a 20 20 20 20 73 43  ", sCode).    sC
0b30: 6f 64 65 20 3d 20 72 65 2e 73 75 62 28 22 6d 5c  ode = re.sub("m\
0b40: 5c 2e 67 72 6f 75 70 5c 5c 28 28 5c 5c 64 2b 29  \.group\\((\\d+)
0b50: 5c 5c 29 22 2c 20 22 6d 5b 5c 5c 31 5d 22 2c 20  \\)", "m[\\1]", 
0b60: 73 43 6f 64 65 29 0a 20 20 20 20 23 20 74 75 70  sCode).    # tup
0b70: 6c 65 73 20 2d 3e 20 6c 69 73 74 73 0a 20 20 20  les -> lists.   
0b80: 20 73 43 6f 64 65 20 3d 20 72 65 2e 73 75 62 28   sCode = re.sub(
0b90: 22 5c 28 28 6d 5c 2e 73 74 61 72 74 5c 5b 5c 5c  "\((m\.start\[\\
0ba0: 64 2b 5c 5d 2c 20 6d 5c 5b 5c 5c 64 2b 5c 5d 29  d+\], m\[\\d+\])
0bb0: 5c 29 22 2c 20 22 5b 5c 5c 31 5d 22 2c 20 73 43  \)", "[\\1]", sC
0bc0: 6f 64 65 29 0a 20 20 20 20 23 20 72 65 67 65 78  ode).    # regex
0bd0: 0a 20 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f  .    sCode = sCo
0be0: 64 65 2e 72 65 70 6c 61 63 65 28 22 5c 77 5b 5c  de.replace("\w[\
0bf0: 77 2d 5d 2b 22 2c 20 22 5b 61 2d 7a 41 2d 5a c3  w-]+", "[a-zA-Z.
0c00: a0 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f c3 b8 2d  .-....-..0-9_..-
0c10: c3 bf c3 98 2d c3 9f c4 80 2d ca af ef ac 81 2d  ....-....-.....-
0c20: ef ac 86 5d 5b 61 2d 7a 41 2d 5a c3 a0 2d c3 b6  ...][a-zA-Z..-..
0c30: c3 80 2d c3 96 30 2d 39 5f c3 b8 2d c3 bf c3 98  ..-..0-9_..-....
0c40: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 2d  -....-.....-...-
0c50: 5d 2b 22 29 0a 20 20 20 20 73 43 6f 64 65 20 3d  ]+").    sCode =
0c60: 20 73 43 6f 64 65 2e 72 65 70 6c 61 63 65 28 72   sCode.replace(r
0c70: 22 2f 5c 77 2f 22 2c 20 22 2f 5b 61 2d 7a 41 2d  "/\w/", "/[a-zA-
0c80: 5a c3 a0 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f c3  Z..-....-..0-9_.
0c90: b8 2d c3 bf c3 98 2d c3 9f c4 80 2d ca af ef ac  .-....-....-....
0ca0: 81 2d ef ac 86 5d 2f 22 29 0a 20 20 20 20 73 43  .-...]/").    sC
0cb0: 6f 64 65 20 3d 20 73 43 6f 64 65 2e 72 65 70 6c  ode = sCode.repl
0cc0: 61 63 65 28 72 22 5b 5c 77 2d 5d 22 2c 20 22 5b  ace(r"[\w-]", "[
0cd0: 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3 80 2d c3 96  a-zA-Z..-....-..
0ce0: 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d c3 9f c4 80  0-9_..-....-....
0cf0: 2d ca af ef ac 81 2d ef ac 86 2d 5d 22 29 0a 20  -.....-...-]"). 
0d00: 20 20 20 73 43 6f 64 65 20 3d 20 73 43 6f 64 65     sCode = sCode
0d10: 2e 72 65 70 6c 61 63 65 28 72 22 5b 5c 77 2c 5d  .replace(r"[\w,]
0d20: 22 2c 20 22 5b 61 2d 7a 41 2d 5a c3 a0 2d c3 b6  ", "[a-zA-Z..-..
0d30: c3 80 2d c3 96 30 2d 39 5f c3 b8 2d c3 bf c3 98  ..-..0-9_..-....
0d40: 2d c3 9f c4 80 2d ca af ef ac 81 2d ef ac 86 2c  -....-.....-...,
0d50: 5d 22 29 0a 20 20 20 20 72 65 74 75 72 6e 20 73  ]").    return s
0d60: 43 6f 64 65 0a 0a 0a 64 65 66 20 72 65 67 65 78  Code...def regex
0d70: 32 6a 73 20 28 73 52 65 67 65 78 2c 20 73 57 4f  2js (sRegex, sWO
0d80: 52 44 4c 49 4d 49 54 4c 45 46 54 29 3a 0a 20 20  RDLIMITLEFT):.  
0d90: 20 20 22 63 6f 6e 76 65 72 74 73 20 50 79 74 68    "converts Pyth
0da0: 6f 6e 20 72 65 67 65 78 20 74 6f 20 4a 53 20 72  on regex to JS r
0db0: 65 67 65 78 20 61 6e 64 20 72 65 74 75 72 6e 73  egex and returns
0dc0: 20 4a 53 20 72 65 67 65 78 20 61 6e 64 20 6c 69   JS regex and li
0dd0: 73 74 20 6f 66 20 6e 65 67 61 74 69 76 65 20 6c  st of negative l
0de0: 6f 6f 6b 62 65 66 6f 72 65 20 61 73 73 65 72 74  ookbefore assert
0df0: 69 6f 6e 73 22 0a 20 20 20 20 23 20 20 20 4c 61  ions".    #   La
0e00: 74 69 6e 20 6c 65 74 74 65 72 73 3a 20 68 74 74  tin letters: htt
0e10: 70 3a 2f 2f 75 6e 69 63 6f 64 65 2d 74 61 62 6c  p://unicode-tabl
0e20: 65 2e 63 6f 6d 2f 66 72 2f 0a 20 20 20 20 23 20  e.com/fr/.    # 
0e30: 20 20 30 2d 39 20 20 61 6e 64 20 20 5f 0a 20 20    0-9  and  _.  
0e40: 20 20 23 20 20 20 41 2d 5a 0a 20 20 20 20 23 20    #   A-Z.    # 
0e50: 20 20 61 2d 7a 0a 20 20 20 20 23 20 20 20 c3 80    a-z.    #   ..
0e60: 2d c3 96 20 20 20 20 20 30 30 43 30 2d 30 30 44  -..     00C0-00D
0e70: 36 20 20 20 28 75 70 70 65 72 20 63 61 73 65 29  6   (upper case)
0e80: 0a 20 20 20 20 23 20 20 20 c3 98 2d c3 9f 20 20  .    #   ..-..  
0e90: 20 20 20 30 30 44 38 2d 30 30 44 46 20 20 20 28     00D8-00DF   (
0ea0: 75 70 70 65 72 20 63 61 73 65 29 0a 20 20 20 20  upper case).    
0eb0: 23 20 20 20 c3 a0 2d c3 b6 20 20 20 20 20 30 30  #   ..-..     00
0ec0: 45 30 2d 30 30 46 36 20 20 20 28 6c 6f 77 65 72  E0-00F6   (lower
0ed0: 20 63 61 73 65 29 0a 20 20 20 20 23 20 20 20 c3   case).    #   .
0ee0: b8 2d c3 bf 20 20 20 20 20 30 30 46 38 2d 30 30  .-..     00F8-00
0ef0: 46 46 20 20 20 28 6c 6f 77 65 72 20 63 61 73 65  FF   (lower case
0f00: 29 0a 20 20 20 20 23 20 20 20 c4 80 2d ca af 20  ).    #   ..-.. 
0f10: 20 20 20 20 30 31 30 30 2d 30 32 41 46 20 20 20      0100-02AF   
0f20: 28 6d 69 78 65 64 29 0a 20 20 20 20 23 20 20 20  (mixed).    #   
0f30: 2d 3e 20 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3 80  -> a-zA-Z..-....
0f40: 2d c3 96 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d c3  -..0-9_..-....-.
0f50: 9f c4 80 2d ca af 0a 20 20 20 20 62 43 61 73 65  ...-...    bCase
0f60: 49 6e 73 65 6e 73 69 74 69 76 65 20 3d 20 46 61  Insensitive = Fa
0f70: 6c 73 65 0a 20 20 20 20 69 66 20 22 28 3f 69 29  lse.    if "(?i)
0f80: 22 20 69 6e 20 73 52 65 67 65 78 3a 0a 20 20 20  " in sRegex:.   
0f90: 20 20 20 20 20 73 52 65 67 65 78 20 3d 20 73 52       sRegex = sR
0fa0: 65 67 65 78 2e 72 65 70 6c 61 63 65 28 22 28 3f  egex.replace("(?
0fb0: 69 29 22 2c 20 22 22 29 0a 20 20 20 20 20 20 20  i)", "").       
0fc0: 20 62 43 61 73 65 49 6e 73 65 6e 73 69 74 69 76   bCaseInsensitiv
0fd0: 65 20 3d 20 54 72 75 65 0a 20 20 20 20 6c 4e 65  e = True.    lNe
0fe0: 67 4c 6f 6f 6b 42 65 66 6f 72 65 52 65 67 65 78  gLookBeforeRegex
0ff0: 20 3d 20 5b 5d 0a 20 20 20 20 69 66 20 73 57 4f   = [].    if sWO
1000: 52 44 4c 49 4d 49 54 4c 45 46 54 20 69 6e 20 73  RDLIMITLEFT in s
1010: 52 65 67 65 78 3a 0a 20 20 20 20 20 20 20 20 73  Regex:.        s
1020: 52 65 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72  Regex = sRegex.r
1030: 65 70 6c 61 63 65 28 73 57 4f 52 44 4c 49 4d 49  eplace(sWORDLIMI
1040: 54 4c 45 46 54 2c 20 22 22 29 0a 20 20 20 20 20  TLEFT, "").     
1050: 20 20 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f 72     lNegLookBefor
1060: 65 52 65 67 65 78 20 3d 20 5b 22 5b 61 2d 7a 41  eRegex = ["[a-zA
1070: 2d 5a c3 a0 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f  -Z..-....-..0-9_
1080: c3 b8 2d c3 bf c3 98 2d c3 9f c4 80 2d ca af 2e  ..-....-....-...
1090: 2c e2 80 93 2d 5d 24 22 5d 0a 20 20 20 20 73 52  ,...-]$"].    sR
10a0: 65 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72 65  egex = sRegex.re
10b0: 70 6c 61 63 65 28 22 5b 5c 5c 77 22 2c 20 22 5b  place("[\\w", "[
10c0: 61 2d 7a 41 2d 5a c3 a0 2d c3 b6 c3 80 2d c3 96  a-zA-Z..-....-..
10d0: 30 2d 39 5f c3 b8 2d c3 bf c3 98 2d c3 9f c4 80  0-9_..-....-....
10e0: 2d ca af 22 29 0a 20 20 20 20 73 52 65 67 65 78  -..").    sRegex
10f0: 20 3d 20 73 52 65 67 65 78 2e 72 65 70 6c 61 63   = sRegex.replac
1100: 65 28 22 5c 5c 77 22 2c 20 22 5b 61 2d 7a 41 2d  e("\\w", "[a-zA-
1110: 5a c3 a0 2d c3 b6 c3 80 2d c3 96 30 2d 39 5f c3  Z..-....-..0-9_.
1120: b8 2d c3 bf c3 98 2d c3 9f c4 80 2d ca af 5d 22  .-....-....-..]"
1130: 29 0a 20 20 20 20 73 52 65 67 65 78 20 3d 20 73  ).    sRegex = s
1140: 52 65 67 65 78 2e 72 65 70 6c 61 63 65 28 22 5b  Regex.replace("[
1150: 2e 5d 22 2c 20 72 22 5c 2e 22 29 0a 20 20 20 20  .]", r"\.").    
1160: 69 66 20 6e 6f 74 20 73 52 65 67 65 78 2e 73 74  if not sRegex.st
1170: 61 72 74 73 77 69 74 68 28 22 3c 6a 73 3e 22 29  artswith("<js>")
1180: 3a 0a 20 20 20 20 20 20 20 20 73 52 65 67 65 78  :.        sRegex
1190: 20 3d 20 73 52 65 67 65 78 2e 72 65 70 6c 61 63   = sRegex.replac
11a0: 65 28 22 2f 22 2c 20 72 22 5c 2f 22 29 0a 20 20  e("/", r"\/").  
11b0: 20 20 6d 20 3d 20 72 65 2e 73 65 61 72 63 68 28    m = re.search(
11c0: 72 22 5c 28 5c 3f 3c 21 28 5b 5e 28 29 5d 2b 29  r"\(\?<!([^()]+)
11d0: 5c 29 22 2c 20 73 52 65 67 65 78 29 20 20 23 20  \)", sRegex)  # 
11e0: 4e 65 67 61 74 69 76 65 20 6c 6f 6f 6b 62 65 66  Negative lookbef
11f0: 6f 72 65 20 61 73 73 65 72 74 69 6f 6e 20 73 68  ore assertion sh
1200: 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 20 61  ould always be a
1210: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
1220: 6f 66 20 72 65 67 65 78 0a 20 20 20 20 69 66 20  of regex.    if 
1230: 6d 3a 0a 20 20 20 20 20 20 20 20 6c 4e 65 67 4c  m:.        lNegL
1240: 6f 6f 6b 42 65 66 6f 72 65 52 65 67 65 78 2e 61  ookBeforeRegex.a
1250: 70 70 65 6e 64 28 6d 2e 67 72 6f 75 70 28 31 29  ppend(m.group(1)
1260: 2b 22 24 22 29 0a 20 20 20 20 20 20 20 20 73 52  +"$").        sR
1270: 65 67 65 78 20 3d 20 73 52 65 67 65 78 2e 72 65  egex = sRegex.re
1280: 70 6c 61 63 65 28 6d 2e 67 72 6f 75 70 28 30 29  place(m.group(0)
1290: 2c 20 22 22 29 0a 20 20 20 20 69 66 20 22 28 3f  , "").    if "(?
12a0: 3c 22 20 69 6e 20 73 52 65 67 65 78 3a 0a 20 20  <" in sRegex:.  
12b0: 20 20 20 20 20 20 70 72 69 6e 74 28 22 23 20 57        print("# W
12c0: 61 72 6e 69 6e 67 2e 20 4c 6f 6f 6b 62 65 66 6f  arning. Lookbefo
12d0: 72 65 20 61 73 73 65 72 74 69 6f 6e 20 6e 6f 74  re assertion not
12e0: 20 63 68 61 6e 67 65 64 20 69 6e 3a 5c 6e 20 20   changed in:\n  
12f0: 22 29 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74  ").        print
1300: 28 73 52 65 67 65 78 29 0a 20 20 20 20 69 66 20  (sRegex).    if 
1310: 73 52 65 67 65 78 2e 73 74 61 72 74 73 77 69 74  sRegex.startswit
1320: 68 28 22 3c 6a 73 3e 22 29 3a 0a 20 20 20 20 20  h("<js>"):.     
1330: 20 20 20 73 52 65 67 65 78 20 3d 20 73 52 65 67     sRegex = sReg
1340: 65 78 2e 72 65 70 6c 61 63 65 28 27 3c 6a 73 3e  ex.replace('<js>
1350: 27 2c 20 27 2f 27 29 2e 72 65 70 6c 61 63 65 28  ', '/').replace(
1360: 27 3c 2f 6a 73 3e 69 27 2c 20 27 2f 69 67 27 29  '</js>i', '/ig')
1370: 2e 72 65 70 6c 61 63 65 28 27 3c 2f 6a 73 3e 27  .replace('</js>'
1380: 2c 20 27 2f 67 27 29 0a 20 20 20 20 65 6c 73 65  , '/g').    else
1390: 3a 0a 20 20 20 20 20 20 20 20 73 52 65 67 65 78  :.        sRegex
13a0: 20 3d 20 22 2f 22 20 2b 20 73 52 65 67 65 78 20   = "/" + sRegex 
13b0: 2b 20 22 2f 67 22 0a 20 20 20 20 69 66 20 62 43  + "/g".    if bC
13c0: 61 73 65 49 6e 73 65 6e 73 69 74 69 76 65 20 61  aseInsensitive a
13d0: 6e 64 20 6e 6f 74 20 73 52 65 67 65 78 2e 65 6e  nd not sRegex.en
13e0: 64 73 77 69 74 68 28 22 2f 69 67 22 29 3a 0a 20  dswith("/ig"):. 
13f0: 20 20 20 20 20 20 20 73 52 65 67 65 78 20 3d 20         sRegex = 
1400: 73 52 65 67 65 78 20 2b 20 22 69 22 0a 20 20 20  sRegex + "i".   
1410: 20 69 66 20 6e 6f 74 20 6c 4e 65 67 4c 6f 6f 6b   if not lNegLook
1420: 42 65 66 6f 72 65 52 65 67 65 78 3a 0a 20 20 20  BeforeRegex:.   
1430: 20 20 20 20 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66       lNegLookBef
1440: 6f 72 65 52 65 67 65 78 20 3d 20 4e 6f 6e 65 0a  oreRegex = None.
1450: 20 20 20 20 72 65 74 75 72 6e 20 28 73 52 65 67      return (sReg
1460: 65 78 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65 66 6f  ex, lNegLookBefo
1470: 72 65 52 65 67 65 78 29 0a 0a 0a 64 65 66 20 70  reRegex)...def p
1480: 79 52 75 6c 65 54 6f 4a 53 20 28 6c 52 75 6c 65  yRuleToJS (lRule
1490: 2c 20 64 4a 53 52 45 47 45 58 45 53 2c 20 73 57  , dJSREGEXES, sW
14a0: 4f 52 44 4c 49 4d 49 54 4c 45 46 54 29 3a 0a 20  ORDLIMITLEFT):. 
14b0: 20 20 20 6c 52 75 6c 65 4a 53 20 3d 20 63 6f 70     lRuleJS = cop
14c0: 79 2e 64 65 65 70 63 6f 70 79 28 6c 52 75 6c 65  y.deepcopy(lRule
14d0: 29 0a 20 20 20 20 64 65 6c 20 6c 52 75 6c 65 5b  ).    del lRule[
14e0: 2d 31 5d 20 23 20 74 47 72 6f 75 70 73 20 70 6f  -1] # tGroups po
14f0: 73 69 74 69 6f 6e 69 6e 67 20 63 6f 64 65 73 20  sitioning codes 
1500: 61 72 65 20 75 73 65 6c 65 73 73 20 66 6f 72 20  are useless for 
1510: 50 79 74 68 6f 6e 0a 20 20 20 20 23 20 65 72 72  Python.    # err
1520: 6f 72 20 6d 65 73 73 61 67 65 73 0a 20 20 20 20  or messages.    
1530: 66 6f 72 20 61 41 63 74 69 6f 6e 20 69 6e 20 6c  for aAction in l
1540: 52 75 6c 65 4a 53 5b 36 5d 3a 0a 20 20 20 20 20  RuleJS[6]:.     
1550: 20 20 20 69 66 20 61 41 63 74 69 6f 6e 5b 31 5d     if aAction[1]
1560: 20 3d 3d 20 22 2d 22 3a 0a 20 20 20 20 20 20 20   == "-":.       
1570: 20 20 20 20 20 61 41 63 74 69 6f 6e 5b 32 5d 20       aAction[2] 
1580: 3d 20 61 41 63 74 69 6f 6e 5b 32 5d 2e 72 65 70  = aAction[2].rep
1590: 6c 61 63 65 28 22 c2 a0 22 2c 20 22 e2 80 af 22  lace("..", "..."
15a0: 29 20 23 20 6e 62 73 70 20 2d 2d 3e 20 6e 6e 62  ) # nbsp --> nnb
15b0: 73 70 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  sp.            a
15c0: 41 63 74 69 6f 6e 5b 34 5d 20 3d 20 61 41 63 74  Action[4] = aAct
15d0: 69 6f 6e 5b 34 5d 2e 72 65 70 6c 61 63 65 28 22  ion[4].replace("
15e0: c2 ab 20 22 2c 20 22 c2 ab e2 80 af 22 29 2e 72  .. ", ".....").r
15f0: 65 70 6c 61 63 65 28 22 20 c2 bb 22 2c 20 22 e2  eplace(" ..", ".
1600: 80 af c2 bb 22 29 2e 72 65 70 6c 61 63 65 28 22  ....").replace("
1610: 20 3a 22 2c 20 22 e2 80 af 3a 22 29 2e 72 65 70   :", "...:").rep
1620: 6c 61 63 65 28 22 c2 a0 3a 22 2c 20 22 e2 80 af  lace("..:", "...
1630: 3a 22 29 0a 20 20 20 20 23 20 6a 73 20 72 65 67  :").    # js reg
1640: 65 78 65 73 0a 20 20 20 20 6c 52 75 6c 65 4a 53  exes.    lRuleJS
1650: 5b 31 5d 2c 20 6c 4e 65 67 4c 6f 6f 6b 42 65 68  [1], lNegLookBeh
1660: 69 6e 64 52 65 67 65 78 20 3d 20 72 65 67 65 78  indRegex = regex
1670: 32 6a 73 28 64 4a 53 52 45 47 45 58 45 53 2e 67  2js(dJSREGEXES.g
1680: 65 74 28 6c 52 75 6c 65 4a 53 5b 33 5d 2c 20 6c  et(lRuleJS[3], l
1690: 52 75 6c 65 4a 53 5b 31 5d 29 2c 20 73 57 4f 52  RuleJS[1]), sWOR
16a0: 44 4c 49 4d 49 54 4c 45 46 54 29 0a 20 20 20 20  DLIMITLEFT).    
16b0: 6c 52 75 6c 65 4a 53 2e 61 70 70 65 6e 64 28 6c  lRuleJS.append(l
16c0: 4e 65 67 4c 6f 6f 6b 42 65 68 69 6e 64 52 65 67  NegLookBehindReg
16d0: 65 78 29 0a 20 20 20 20 72 65 74 75 72 6e 20 6c  ex).    return l
16e0: 52 75 6c 65 4a 53 0a 0a 0a 64 65 66 20 77 72 69  RuleJS...def wri
16f0: 74 65 52 75 6c 65 73 54 6f 4a 53 41 72 72 61 79  teRulesToJSArray
1700: 20 28 6c 52 75 6c 65 73 29 3a 0a 20 20 20 20 73   (lRules):.    s
1710: 41 72 72 61 79 20 3d 20 22 5b 5c 6e 22 0a 20 20  Array = "[\n".  
1720: 20 20 66 6f 72 20 73 4f 70 74 69 6f 6e 2c 20 61    for sOption, a
1730: 52 75 6c 65 47 72 6f 75 70 20 69 6e 20 6c 52 75  RuleGroup in lRu
1740: 6c 65 73 3a 0a 20 20 20 20 20 20 20 20 73 41 72  les:.        sAr
1750: 72 61 79 20 2b 3d 20 27 20 20 5b 22 27 20 2b 20  ray += '  ["' + 
1760: 73 4f 70 74 69 6f 6e 20 2b 20 27 22 2c 20 5b 5c  sOption + '", [\
1770: 6e 27 20 20 69 66 20 73 4f 70 74 69 6f 6e 20 20  n'  if sOption  
1780: 65 6c 73 65 20 20 22 20 20 5b 66 61 6c 73 65 2c  else  "  [false,
1790: 20 5b 5c 6e 22 0a 20 20 20 20 20 20 20 20 66 6f   [\n".        fo
17a0: 72 20 73 52 65 67 65 78 2c 20 62 43 61 73 65 49  r sRegex, bCaseI
17b0: 6e 73 65 6e 73 69 74 69 76 65 2c 20 73 4c 69 6e  nsensitive, sLin
17c0: 65 49 64 2c 20 73 52 75 6c 65 49 64 2c 20 6e 50  eId, sRuleId, nP
17d0: 72 69 6f 72 69 74 79 2c 20 6c 41 63 74 69 6f 6e  riority, lAction
17e0: 73 2c 20 61 47 72 6f 75 70 73 2c 20 61 4e 65 67  s, aGroups, aNeg
17f0: 4c 6f 6f 6b 42 65 68 69 6e 64 52 65 67 65 78 20  LookBehindRegex 
1800: 69 6e 20 61 52 75 6c 65 47 72 6f 75 70 3a 0a 20  in aRuleGroup:. 
1810: 20 20 20 20 20 20 20 20 20 20 20 73 41 72 72 61             sArra
1820: 79 20 2b 3d 20 27 20 20 20 20 5b 27 20 2b 20 73  y += '    [' + s
1830: 52 65 67 65 78 20 2b 20 22 2c 20 22 0a 20 20 20  Regex + ", ".   
1840: 20 20 20 20 20 20 20 20 20 73 41 72 72 61 79 20           sArray 
1850: 2b 3d 20 22 74 72 75 65 2c 20 22 20 69 66 20 62  += "true, " if b
1860: 43 61 73 65 49 6e 73 65 6e 73 69 74 69 76 65 20  CaseInsensitive 
1870: 20 65 6c 73 65 20 22 66 61 6c 73 65 2c 20 22 0a   else "false, ".
1880: 20 20 20 20 20 20 20 20 20 20 20 20 73 41 72 72              sArr
1890: 61 79 20 2b 3d 20 27 22 27 20 2b 20 73 4c 69 6e  ay += '"' + sLin
18a0: 65 49 64 20 2b 20 27 22 2c 20 27 0a 20 20 20 20  eId + '", '.    
18b0: 20 20 20 20 20 20 20 20 73 41 72 72 61 79 20 2b          sArray +
18c0: 3d 20 27 22 27 20 2b 20 73 52 75 6c 65 49 64 20  = '"' + sRuleId 
18d0: 2b 20 27 22 2c 20 27 0a 20 20 20 20 20 20 20 20  + '", '.        
18e0: 20 20 20 20 73 41 72 72 61 79 20 2b 3d 20 73 74      sArray += st
18f0: 72 28 6e 50 72 69 6f 72 69 74 79 29 20 2b 20 22  r(nPriority) + "
1900: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
1910: 73 41 72 72 61 79 20 2b 3d 20 6a 73 6f 6e 2e 64  sArray += json.d
1920: 75 6d 70 73 28 6c 41 63 74 69 6f 6e 73 2c 20 65  umps(lActions, e
1930: 6e 73 75 72 65 5f 61 73 63 69 69 3d 46 61 6c 73  nsure_ascii=Fals
1940: 65 29 20 2b 20 22 2c 20 22 0a 20 20 20 20 20 20  e) + ", ".      
1950: 20 20 20 20 20 20 73 41 72 72 61 79 20 2b 3d 20        sArray += 
1960: 6a 73 6f 6e 2e 64 75 6d 70 73 28 61 47 72 6f 75  json.dumps(aGrou
1970: 70 73 2c 20 65 6e 73 75 72 65 5f 61 73 63 69 69  ps, ensure_ascii
1980: 3d 46 61 6c 73 65 29 20 2b 20 22 2c 20 22 0a 20  =False) + ", ". 
1990: 20 20 20 20 20 20 20 20 20 20 20 73 41 72 72 61             sArra
19a0: 79 20 2b 3d 20 6a 73 6f 6e 2e 64 75 6d 70 73 28  y += json.dumps(
19b0: 61 4e 65 67 4c 6f 6f 6b 42 65 68 69 6e 64 52 65  aNegLookBehindRe
19c0: 67 65 78 2c 20 65 6e 73 75 72 65 5f 61 73 63 69  gex, ensure_asci
19d0: 69 3d 46 61 6c 73 65 29 20 2b 20 22 5d 2c 5c 6e  i=False) + "],\n
19e0: 22 0a 20 20 20 20 20 20 20 20 73 41 72 72 61 79  ".        sArray
19f0: 20 2b 3d 20 22 20 20 5d 5d 2c 5c 6e 22 0a 20 20   += "  ]],\n".  
1a00: 20 20 73 41 72 72 61 79 20 2b 3d 20 22 5d 22 0a    sArray += "]".
1a10: 20 20 20 20 72 65 74 75 72 6e 20 73 41 72 72 61      return sArra
1a20: 79 0a 0a 0a 64 65 66 20 67 72 6f 75 70 73 50 6f  y...def groupsPo
1a30: 73 69 74 69 6f 6e 69 6e 67 43 6f 64 65 54 6f 4c  sitioningCodeToL
1a40: 69 73 74 20 28 73 47 72 6f 75 70 73 50 6f 73 69  ist (sGroupsPosi
1a50: 74 69 6f 6e 69 6e 67 43 6f 64 65 29 3a 0a 20 20  tioningCode):.  
1a60: 20 20 69 66 20 6e 6f 74 20 73 47 72 6f 75 70 73    if not sGroups
1a70: 50 6f 73 69 74 69 6f 6e 69 6e 67 43 6f 64 65 3a  PositioningCode:
1a80: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1a90: 4e 6f 6e 65 0a 20 20 20 20 72 65 74 75 72 6e 20  None.    return 
1aa0: 5b 20 69 6e 74 28 73 43 6f 64 65 29 20 20 69 66  [ int(sCode)  if
1ab0: 20 73 43 6f 64 65 2e 69 73 64 69 67 69 74 28 29   sCode.isdigit()
1ac0: 20 6f 72 20 28 73 43 6f 64 65 5b 30 3a 31 5d 20   or (sCode[0:1] 
1ad0: 3d 3d 20 22 2d 22 20 61 6e 64 20 73 43 6f 64 65  == "-" and sCode
1ae0: 5b 31 3a 5d 2e 69 73 64 69 67 69 74 28 29 29 20  [1:].isdigit()) 
1af0: 20 65 6c 73 65 20 73 43 6f 64 65 20 5c 0a 20 20   else sCode \.  
1b00: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 73             for s
1b10: 43 6f 64 65 20 69 6e 20 73 47 72 6f 75 70 73 50  Code in sGroupsP
1b20: 6f 73 69 74 69 6f 6e 69 6e 67 43 6f 64 65 2e 73  ositioningCode.s
1b30: 70 6c 69 74 28 22 2c 22 29 20 5d 0a              plit(",") ].