diff options
Diffstat (limited to 'py/makeqstrdefs.py')
| -rw-r--r-- | py/makeqstrdefs.py | 89 |
1 files changed, 48 insertions, 41 deletions
diff --git a/py/makeqstrdefs.py b/py/makeqstrdefs.py index d3e90ba48..e6c003311 100644 --- a/py/makeqstrdefs.py +++ b/py/makeqstrdefs.py @@ -15,51 +15,54 @@ import os # - iterating through bytes is different # - codepoint2name lives in a different module import platform -if platform.python_version_tuple()[0] == '2': + +if platform.python_version_tuple()[0] == "2": bytes_cons = lambda val, enc=None: bytearray(val) from htmlentitydefs import name2codepoint -elif platform.python_version_tuple()[0] == '3': +elif platform.python_version_tuple()[0] == "3": bytes_cons = bytes from html.entities import name2codepoint + unichr = chr # end compatibility code # Blacklist of qstrings that are specially handled in further # processing and should be ignored -QSTRING_BLACK_LIST = set(['NULL', 'number_of']) +QSTRING_BLACK_LIST = set(["NULL", "number_of"]) # add some custom names to map characters that aren't in HTML -name2codepoint['hyphen'] = ord('-') -name2codepoint['space'] = ord(' ') -name2codepoint['squot'] = ord('\'') -name2codepoint['comma'] = ord(',') -name2codepoint['dot'] = ord('.') -name2codepoint['colon'] = ord(':') -name2codepoint['semicolon'] = ord(';') -name2codepoint['slash'] = ord('/') -name2codepoint['percent'] = ord('%') -name2codepoint['hash'] = ord('#') -name2codepoint['paren_open'] = ord('(') -name2codepoint['paren_close'] = ord(')') -name2codepoint['bracket_open'] = ord('[') -name2codepoint['bracket_close'] = ord(']') -name2codepoint['brace_open'] = ord('{') -name2codepoint['brace_close'] = ord('}') -name2codepoint['star'] = ord('*') -name2codepoint['bang'] = ord('!') -name2codepoint['backslash'] = ord('\\') -name2codepoint['plus'] = ord('+') -name2codepoint['dollar'] = ord('$') -name2codepoint['equals'] = ord('=') -name2codepoint['question'] = ord('?') -name2codepoint['at_sign'] = ord('@') -name2codepoint['caret'] = ord('^') -name2codepoint['pipe'] = ord('|') -name2codepoint['tilde'] = ord('~') +name2codepoint["hyphen"] = ord("-") +name2codepoint["space"] = ord(" ") +name2codepoint["squot"] = ord("'") +name2codepoint["comma"] = ord(",") +name2codepoint["dot"] = ord(".") +name2codepoint["colon"] = ord(":") +name2codepoint["semicolon"] = ord(";") +name2codepoint["slash"] = ord("/") +name2codepoint["percent"] = ord("%") +name2codepoint["hash"] = ord("#") +name2codepoint["paren_open"] = ord("(") +name2codepoint["paren_close"] = ord(")") +name2codepoint["bracket_open"] = ord("[") +name2codepoint["bracket_close"] = ord("]") +name2codepoint["brace_open"] = ord("{") +name2codepoint["brace_close"] = ord("}") +name2codepoint["star"] = ord("*") +name2codepoint["bang"] = ord("!") +name2codepoint["backslash"] = ord("\\") +name2codepoint["plus"] = ord("+") +name2codepoint["dollar"] = ord("$") +name2codepoint["equals"] = ord("=") +name2codepoint["question"] = ord("?") +name2codepoint["at_sign"] = ord("@") +name2codepoint["caret"] = ord("^") +name2codepoint["pipe"] = ord("|") +name2codepoint["tilde"] = ord("~") # These are just vexing! -del name2codepoint['and'] -del name2codepoint['or'] +del name2codepoint["and"] +del name2codepoint["or"] + def write_out(fname, output): if output: @@ -68,18 +71,20 @@ def write_out(fname, output): with open(args.output_dir + "/" + fname + ".qstr", "w") as f: f.write("\n".join(output) + "\n") + def qstr_unescape(qstr): for name in name2codepoint: if "__" + name + "__" in qstr: continue if "_" + name + "_" in qstr: - qstr = qstr.replace("_" + name + "_", str(unichr(name2codepoint[name]))) + qstr = qstr.replace("_" + name + "_", str(unichr(name2codepoint[name]))) return qstr + def process_file(f): re_line = re.compile(r"#[line]*\s(\d+)\s\"([^\"]+)\"") - re_qstr = re.compile(r'MP_QSTR_[_a-zA-Z0-9]+') - re_translate = re.compile(r'translate\(\"((?:(?=(\\?))\2.)*?)\"\)') + re_qstr = re.compile(r"MP_QSTR_[_a-zA-Z0-9]+") + re_translate = re.compile(r"translate\(\"((?:(?=(\\?))\2.)*?)\"\)") output = [] last_fname = None lineno = 0 @@ -87,10 +92,10 @@ def process_file(f): if line.isspace(): continue # match gcc-like output (# n "file") and msvc-like output (#line n "file") - if line.startswith(('# ', '#line')): + if line.startswith(("# ", "#line")): m = re_line.match(line) assert m is not None - #print(m.groups()) + # print(m.groups()) lineno = int(m.group(1)) fname = m.group(2) if not fname.endswith(".c"): @@ -101,9 +106,9 @@ def process_file(f): last_fname = fname continue for match in re_qstr.findall(line): - name = match.replace('MP_QSTR_', '') + name = match.replace("MP_QSTR_", "") if name not in QSTRING_BLACK_LIST: - output.append('Q(' + qstr_unescape(name) + ')') + output.append("Q(" + qstr_unescape(name) + ")") for match in re_translate.findall(line): output.append('TRANSLATE("' + match[0] + '")') lineno += 1 @@ -115,6 +120,7 @@ def process_file(f): def cat_together(): import glob import hashlib + hasher = hashlib.md5() all_lines = [] outf = open(args.output_dir + "/out", "wb") @@ -128,7 +134,7 @@ def cat_together(): outf.close() hasher.update(all_lines) new_hash = hasher.hexdigest() - #print(new_hash) + # print(new_hash) old_hash = None try: with open(args.output_file + ".hash") as f: @@ -151,11 +157,12 @@ def cat_together(): if __name__ == "__main__": if len(sys.argv) != 5: - print('usage: %s command input_filename output_dir output_file' % sys.argv[0]) + print("usage: %s command input_filename output_dir output_file" % sys.argv[0]) sys.exit(2) class Args: pass + args = Args() args.command = sys.argv[1] args.input_filename = sys.argv[2] |
