Overview
Comment: | [build] code cleaning (pylint) |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk | build |
Files: | files | file ages | folders |
SHA3-256: |
b508963a37b5b59eb46bda8d026acda1 |
User & Date: | olr on 2019-05-11 12:06:46 |
Other Links: | manifest | tags |
Context
2019-05-11
| ||
12:47 | [build] code cleaning (pylint) check-in: 1d0bea98d6 user: olr tags: trunk, build | |
12:06 | [build] code cleaning (pylint) check-in: b508963a37 user: olr tags: trunk, build | |
11:35 | [build] code cleaning (pylint) check-in: a7e04ce1e4 user: olr tags: trunk, build | |
Changes
Modified compile_rules.py from [380dd94ff7] to [f961bd8f78].
︙ | ︙ | |||
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | dJSREGEXES = {} sWORDLIMITLEFT = r"(?<![\w.,–-])" # r"(?<![-.,—])\b" seems slower sWORDLIMITRIGHT = r"(?![\w–-])" # r"\b(?!-—)" seems slower def convertRGBToInteger (r, g, b): return (r & 255) << 16 | (g & 255) << 8 | (b & 255) def convertHSLToRBG (h, s, l): r, g, b = colorsys.hls_to_rgb(h/360, l/100, s/100) return [round(r*255), round(g*255), round(b*255)] def createColors (dColor): dColorType = { "sCSS": {}, # dictionary of colors as strings for HTML/CSS (example: hsl(0, 50%, 50%)) "aRGB": {}, # dictionary of colors as RGB tuple "nInt": {} # dictionary of colors as integer values (for Writer) } for sKey, aHSL in dColor.items(): dColorType["sCSS"][sKey] = "hsl({}, {}%, {}%)".format(*aHSL) | > > > | 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | dJSREGEXES = {} sWORDLIMITLEFT = r"(?<![\w.,–-])" # r"(?<![-.,—])\b" seems slower sWORDLIMITRIGHT = r"(?![\w–-])" # r"\b(?!-—)" seems slower def convertRGBToInteger (r, g, b): "rbg (int, int, int) -> int" return (r & 255) << 16 | (g & 255) << 8 | (b & 255) def convertHSLToRBG (h, s, l): "hsl (int, int, int) -> [int, int, int]" r, g, b = colorsys.hls_to_rgb(h/360, l/100, s/100) return [round(r*255), round(g*255), round(b*255)] def createColors (dColor): "dictionary of colors {color_name: [h, s, l]} -> returns dictionary of colors as dictionaries of color types" dColorType = { "sCSS": {}, # dictionary of colors as strings for HTML/CSS (example: hsl(0, 50%, 50%)) "aRGB": {}, # dictionary of colors as RGB tuple "nInt": {} # dictionary of colors as integer values (for Writer) } for sKey, aHSL in dColor.items(): dColorType["sCSS"][sKey] = "hsl({}, {}%, {}%)".format(*aHSL) |
︙ | ︙ | |||
76 77 78 79 80 81 82 | s = re.sub(r"after0\(\s*", 'look(sSentence0[m.end():], ', s) # after0(sSentence) s = re.sub(r"textarea0\(\s*", 'look(sSentence0, ', s) # textarea0(sSentence) s = re.sub(r"\bspell *[(]", '_oSpellChecker.isValid(', s) s = re.sub(r"[\\](\d+)", 'm.group(\\1)', s) return s | | | < | | | | | | | | | 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | s = re.sub(r"after0\(\s*", 'look(sSentence0[m.end():], ', s) # after0(sSentence) s = re.sub(r"textarea0\(\s*", 'look(sSentence0, ', s) # textarea0(sSentence) s = re.sub(r"\bspell *[(]", '_oSpellChecker.isValid(', s) s = re.sub(r"[\\](\d+)", 'm.group(\\1)', s) return s def uppercase (sText, sLang): "(flag i is not enough): converts regex to uppercase regex: 'foo' becomes '[Ff][Oo][Oo]', but 'Bar' becomes 'B[Aa][Rr]'." sUp = "" nState = 0 for i, c in enumerate(sText): if c == "[": nState = 1 if nState == 1 and c == "]": nState = 0 if c == "<" and i > 3 and sText[i-3:i] == "(?P": nState = 2 if nState == 2 and c == ">": nState = 0 if c == "?" and i > 0 and sText[i-1:i] == "(" and sText[i+1:i+2] != ":": nState = 5 if nState == 5 and c == ")": nState = 0 if c.isalpha() and c.islower() and nState == 0: if c == "i" and sLang in ("tr", "az"): sUp += "[İ" + c + "]" else: sUp += "[" + c.upper() + c + "]" elif c.isalpha() and c.islower() and nState == 1 and sText[i+1:i+2] != "-": if sText[i-1:i] == "-" and sText[i-2:i-1].islower(): # [a-z] -> [a-zA-Z] sUp += c + sText[i-2:i-1].upper() + "-" + c.upper() elif c == "i" and sLang in ("tr", "az"): sUp += "İ" + c else: sUp += c.upper() + c else: sUp += c if c == "\\": nState = 4 elif nState == 4: nState = 0 return sUp def countGroupInRegex (sRegex): "returns the number of groups in <sRegex>" try: return re.compile(sRegex).groups except re.error: traceback.print_exc() print(sRegex) return 0 def createRule (s, nIdLine, sLang, bParagraph, dOptPriority): "returns rule as list [option name, regex, bCaseInsensitive, identifier, list of actions]" |
︙ | ︙ | |||
231 232 233 234 235 236 237 | sRegex = uppercase(sRegex, sLang) else: print("# Unknown case mode [" + cCaseMode + "] at line " + sLineId) ## check regex try: re.compile(sRegex) | | < | | 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 | sRegex = uppercase(sRegex, sLang) else: print("# Unknown case mode [" + cCaseMode + "] at line " + sLineId) ## check regex try: re.compile(sRegex) except re.error: print("# Regex error at line ", nIdLine) print(sRegex) return None ## groups in non grouping parenthesis for _ in re.finditer(r"\(\?:[^)]*\([\[\w -]", sRegex): print("# Warning: groups inside non grouping parenthesis in regex at line " + sLineId) #### PARSE ACTIONS lActions = [] nAction = 1 for sAction in s.split(" <<- "): t = createAction(sRuleId + "_" + str(nAction), sAction, nGroup) |
︙ | ︙ | |||
344 345 346 347 348 349 350 | lFUNCTIONS.append(("_s_"+sIdAction, sAction[1:])) sAction = "=_s_"+sIdAction elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] if not sMsg: print("# Error in action at line " + sIdAction + ": the message is empty.") return [sCondition, cAction, sAction, iGroup, sMsg, sURL] | | | < | | | 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 | lFUNCTIONS.append(("_s_"+sIdAction, sAction[1:])) sAction = "=_s_"+sIdAction elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] if not sMsg: print("# Error in action at line " + sIdAction + ": the message is empty.") return [sCondition, cAction, sAction, iGroup, sMsg, sURL] if cAction == "~": ## text processor if sAction[0:1] == "=": lFUNCTIONS.append(("_p_"+sIdAction, sAction[1:])) sAction = "=_p_"+sIdAction elif sAction.startswith('"') and sAction.endswith('"'): sAction = sAction[1:-1] return [sCondition, cAction, sAction, iGroup] if cAction == "=": ## disambiguator if sAction[0:1] == "=": sAction = sAction[1:] if "define" in sAction and not re.search(r"define\(dTokenPos, *m\.start.*, \[.*\] *\)", sAction): print("# Error in action at line " + sIdAction + ": second argument for define must be a list of strings") print(sAction) lFUNCTIONS.append(("_d_"+sIdAction, sAction)) sAction = "_d_"+sIdAction return [sCondition, cAction, sAction] print("# Unknown action at line " + sIdAction) return None def _calcRulesStats (lRules): "count rules and actions" d = {'=':0, '~': 0, '-': 0, '>': 0} for aRule in lRules: if aRule[0] != "@@@@": |
︙ | ︙ | |||
393 394 395 396 397 398 399 | def mergeRulesByOption (lRules): "returns a list of tuples [option, list of rules] keeping the rules order" lFinal = [] lTemp = [] sOption = None for aRule in lRules: if aRule[0] != sOption: | | | 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 | def mergeRulesByOption (lRules): "returns a list of tuples [option, list of rules] keeping the rules order" lFinal = [] lTemp = [] sOption = None for aRule in lRules: if aRule[0] != sOption: if sOption is not None: lFinal.append([sOption, lTemp]) # new tuple sOption = aRule[0] lTemp = [] lTemp.append(aRule[1:]) lFinal.append([sOption, lTemp]) return lFinal |
︙ | ︙ | |||
423 424 425 426 427 428 429 | m = re.match("OPTGROUP/([a-z0-9]+):(.+)$", sLine) lStructOpt.append( [m.group(1), list(map(str.split, m.group(2).split(",")))] ) elif sLine.startswith("OPTSOFTWARE:"): lOpt = [ [s, {}] for s in sLine[12:].strip().split() ] # don’t use tuples (s, {}), because unknown to JS elif sLine.startswith("OPT/"): m = re.match("OPT/([a-z0-9]+):(.+)$", sLine) for i, sOpt in enumerate(m.group(2).split()): | | | 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 | m = re.match("OPTGROUP/([a-z0-9]+):(.+)$", sLine) lStructOpt.append( [m.group(1), list(map(str.split, m.group(2).split(",")))] ) elif sLine.startswith("OPTSOFTWARE:"): lOpt = [ [s, {}] for s in sLine[12:].strip().split() ] # don’t use tuples (s, {}), because unknown to JS elif sLine.startswith("OPT/"): m = re.match("OPT/([a-z0-9]+):(.+)$", sLine) for i, sOpt in enumerate(m.group(2).split()): lOpt[i][1][m.group(1)] = sOpt in ("True", "true", "Yes", "yes") elif sLine.startswith("OPTCOLORTHEME:"): lOptColor = [ [s, {}] for s in sLine[14:].strip().split() ] # don’t use tuples (s, {}), because unknown to JS elif sLine.startswith("OPTCOLOR/"): m = re.match("OPTCOLOR/([a-z0-9]+):(.+)$", sLine) for i, sColor in enumerate(m.group(2).split()): lOptColor[i][1][m.group(1)] = sColor elif sLine.startswith("COLOR/"): |
︙ | ︙ | |||
479 480 481 482 483 484 485 | return dCacheVars fBuildTime = time.time() print("> read rules file...") try: lRules = open(spLang + "/rules.grx", 'r', encoding="utf-8").readlines() | | | 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 | return dCacheVars fBuildTime = time.time() print("> read rules file...") try: lRules = open(spLang + "/rules.grx", 'r', encoding="utf-8").readlines() except OSError: print("Error. Rules file in project [" + sLang + "] not found.") exit() # removing comments, zeroing empty lines, creating definitions, storing tests, merging rule lines print(" parsing rules...") lRuleLine = [] lTest = [] |
︙ | ︙ | |||
556 557 558 559 560 561 562 | lRuleLine[-1][1] += " " + sLine.strip() else: # new rule lRuleLine.append([i, sLine.strip()]) # generating options files print(" parsing options...") | < | < < < | 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 | lRuleLine[-1][1] += " " + sLine.strip() else: # new rule lRuleLine.append([i, sLine.strip()]) # generating options files print(" parsing options...") dOptions, dOptPriority = prepareOptions(lOpt) # tests print(" list tests...") sGCTests = "\n".join(lTest) sGCTestsJS = '{ "aData": ' + json.dumps(lTest, ensure_ascii=False) + " }\n" # processing |
︙ | ︙ |