# HG changeset patch # User Claudio Luck # Date 1584555601 -3600 # Node ID a218553807ab47eafb071a5a6716ab05e4efcd7d # Parent 2f4ad3800a3f288e6f2b28cb317362d457ae4af6# Parent 432ab62b253799aaa2c8962d0d36abd1ac4933c5 pypackage: Merge 2.6.2 diff -r 2f4ad3800a3f -r a218553807ab heading.en.yhtml2 --- a/heading.en.yhtml2 Wed Feb 27 14:43:35 2019 +0100 +++ b/heading.en.yhtml2 Wed Mar 18 19:20:01 2020 +0100 @@ -13,10 +13,12 @@ div id=headline { p > YML – Why a Markup Language?! div class=small { - "YML 2.5.8 of We 29 Aug 2018 – Copyleft 2007-2018, " + "YML 2.6.2 of Mo 02 Nov 2019 – Copyleft 2007-2019, " a "http://blog.fdik.org", "Volker Birk"; " – " a "http://fdik.org/yml2.tar.bz2", "Download YML 2"; + " – " + a "https://pep.foundation/dev/repos/yml2/", "Mercurial repository"; } } diff -r 2f4ad3800a3f -r a218553807ab yml2/backend.py --- a/yml2/backend.py Wed Feb 27 14:43:35 2019 +0100 +++ b/yml2/backend.py Wed Mar 18 19:20:01 2020 +0100 @@ -1,20 +1,20 @@ -# 2.5.10 backend +# 2.6.1 backend # written by VB. import re, codecs import fileinput -import sys, traceback, exceptions, os +import sys, traceback, os from xml.sax.saxutils import escape, quoteattr -from copy import deepcopy +from copy import copy, deepcopy from glob import glob from pyPEG import code, parse, parseLine, u, Symbol from yml2 import ymlCStyle, comment, _inner ymlFunc, pointers, pythonFunc = {}, {}, {} -in_ns = u"" +in_ns = "" operator = [] -included = u"" +included = "" includePath = [] emitlinenumbers = False encoding = "utf-8" @@ -29,9 +29,9 @@ def clearAll(): global ymlFunc, pointers, pythonFunc, in_ns, operator, included ymlFunc, pointers, pythonFunc = {}, {}, {} - in_ns = u"" + in_ns = "" operator = [] - included = u"" + included = "" lq = re.compile(r"\|(\>*)(.*)") sq = re.compile(r"(\d*)\>(.*)") @@ -48,84 +48,84 @@ return u(pointers[name[1:]]) except: if name == "*_trace_info": - return u'""' + return '""' if included: - raise LookupError(u"in " + included + u":" + u(line) + u": pointer " + name) - else: - raise LookupError(u"in " + u(line) + u": pointer " + name) + raise LookupError("in " + included + ":" + u(line) + ": pointer " + name) + else: + raise LookupError("in " + u(line) + ": pointer " + name) def evalPython(expr): try: result = eval(u(expr), pythonFunc) - if type(result) is str: + if type(result) is bytes: return codecs.decode(result, encoding) else: return result except: name, parm, tb = sys.exc_info() - msg = u"in python expression: " + u(parm) - if name is exceptions.SyntaxError: + msg = "in python expression: " + u(parm) + if name is SyntaxError: tbl = traceback.format_exception(name, parm, tb) - msg += u"\n" + tbl[-3] + tbl[-2] - else: - msg += u": " + expr + u"\n" + msg += "\n" + tbl[-3] + tbl[-2] + else: + msg += ": " + expr + "\n" if included: - raise name(u"in " + included + u":" + u(line) + u": " + msg) - else: - raise name(u"in " + u(line) + u": " + msg) + raise name("in " + included + ":" + u(line) + ": " + msg) + else: + raise name("in " + u(line) + ": " + msg) def execPython(script): try: - if type(script) is unicode: - exec script in pythonFunc - else: - exec codecs.decode(script, encoding) in pythonFunc + if type(script) is str: + exec(script, pythonFunc) + else: + exec(codecs.decode(script, encoding), pythonFunc) except: name, parm, tb = sys.exc_info() - msg = u"in python script: " + u(parm) - if name is exceptions.SyntaxError: + msg = "in python script: " + u(parm) + if name is SyntaxError: tbl = traceback.format_exception(name, parm, tb) - msg += u"\n" + tbl[-3] + tbl[-2] - else: - msg += u": " + expr + u"\n" + msg += "\n" + tbl[-3] + tbl[-2] + else: + msg += ": " + expr + "\n" if included: - raise name(u"in " + included + u":" + u(line) + u": " + msg) - else: - raise name(u"in " + u(line) + u": " + msg) + raise name("in " + included + ":" + u(line) + ": " + msg) + else: + raise name("in " + u(line) + ": " + msg) def textOut(text): if not text: - return u"" - if type(text) is not unicode: + return "" + if type(text) is not str: text = codecs.decode(text, encoding) text = text.replace(r'\"', r'\\"') - text = u'u"""' + text.replace('"', r'\"') + u'"""' + text = '"""' + text.replace('"', r'\"') + '"""' try: textFunc = ymlFunc["text"] parms = ['text', ('parm', [text])] c, result = textFunc(parms) if c: - if type(textFunc.alias) is unicode: - result += u"" - else: - result += u"" + if type(textFunc.alias) is str: + result += "" + else: + result += "" return result except: return escape(eval(text)) def strRepl(text): if not text: - return u"" - if type(text) is not unicode: + return "" + if type(text) is not str: text = codecs.decode(text, encoding) text = text.replace(r'\"', r'\\"') - text = u'u"""' + text.replace('"', r'\"') + u'"""' - if type(text) is unicode: + text = '"""' + text.replace('"', r'\"') + '"""' + if type(text) is str: return escape(eval(text)) def applyMacros(macros, text): result = text - for key, value in macros.iteritems(): + for key, value in macros.items(): result = result.replace(key, value) return result @@ -139,7 +139,7 @@ self.pointers = {} self.macros = {} if in_ns: - self.alias = in_ns + u":" + name.replace("_", "-") + self.alias = in_ns + ":" + name.replace("_", "-") else: self.alias = name.replace("_", "-") pythonFunc["yml_" + name] = self @@ -205,13 +205,13 @@ hasContent = True if enable_tracing: - text = u(parms) + u", " + u(vals) - pointers["_trace_info"] = u'"' + u(line) + u": " + u(self.name) + u" " + text.replace(u'"', u'#') + u'"' + text = u(parms) + ", " + u(vals) + pointers["_trace_info"] = '"' + u(line) + ": " + u(self.name) + " " + text.replace('"', '#') + '"' if emitlinenumbers: global first if first: - vals["xmlns:yml"] = u"http://fdik.org/yml" + vals["xmlns:yml"] = "http://fdik.org/yml" first = False vals["yml:called"] = u(line) return self.xml(parms, vals, hasContent, avoidTag) @@ -231,7 +231,7 @@ self.descends.append(desc) def addValue(self, parm, value): - if type(value) is str or type(value) is unicode: + if type(value) is str or type(value) is str: if value[0] != "'" and value[0] != '"': self.values[parm] = u(value) else: @@ -241,16 +241,16 @@ def xml(self, callParms, callValues, hasContent, avoidTag = False): global pointers - extraContent = u"" + extraContent = "" if self.content: hasContent = True resultParms = self.values.copy() macros = self.macros.copy() - toDelete = resultParms.keys() + toDelete = [ key for key in resultParms.keys() ] for key in toDelete: if key[0] == "*": del resultParms[key] - for key, value in callValues.iteritems(): + for key, value in callValues.items(): if key[0] == "%": macros[key] = value else: @@ -261,9 +261,9 @@ if self.parms[i][0] == "*": cp = u(cp) if "'" in cp: - pointers[self.parms[i][1:]] = u'"' + cp + u'"' + pointers[self.parms[i][1:]] = '"' + cp + '"' else: - pointers[self.parms[i][1:]] = u"'" + cp + u"'" + pointers[self.parms[i][1:]] = "'" + cp + "'" elif self.parms[i][0] == "%": macros[self.parms[i]] = u(cp) else: @@ -272,21 +272,21 @@ extraContent += u(cp) hasContent = True i += 1 - result = u"" - for p, v in resultParms.iteritems(): + result = "" + for p, v in resultParms.items(): if p[0] == "'" or p[0] == '"': p = eval(p) - result += u" "+ p + u"=" + quoteattr(applyMacros(macros, u(v))) + result += " "+ p + "=" + quoteattr(applyMacros(macros, u(v))) if hasContent: if avoidTag: return True, strRepl(extraContent) else: - return True, u"<" + self.alias + result + u">" + strRepl(extraContent) + return True, "<" + self.alias + result + ">" + strRepl(extraContent) else: if avoidTag: - return False, u"" - else: - return False, u"<" + self.alias + result + u"/>" + return False, "" + else: + return False, "<" + self.alias + result + "/>" def replaceContent(tree, subtree): n = 0 @@ -313,7 +313,7 @@ return tree def executeCmd(text): - if type(text) is not unicode: + if type(text) is not str: text = codecs.decode(text, encoding) for (regex, pattern) in operator: match = re.search(regex, text) @@ -321,11 +321,11 @@ cmd = pattern opt = match.groups() for i in range(len(opt)): - cmd = cmd.replace(u"%" + u(i+1), opt[i]) - text = text[:match.start()] + u"`" + cmd + u"`"+ text[match.end():] + cmd = cmd.replace("%" + u(i+1), opt[i]) + text = text[:match.start()] + "`" + cmd + "`"+ text[match.end():] match = re.search(regex, text) - result = u"" + result = "" m = re.search(bq, text) while text and m: cmd = m.group(1) @@ -336,9 +336,9 @@ if rest: raise SyntaxError(cmd) except SyntaxError: if included: - raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in executing command: " + cmd.strip()) - else: - raise SyntaxError(u"in " + u(line) + u": syntax error in executing command: " + cmd.strip()) + raise SyntaxError("in " + included + ":" + u(line) + ": syntax error in executing command: " + cmd.strip()) + else: + raise SyntaxError("in " + u(line) + ": syntax error in executing command: " + cmd.strip()) inner = _finish(r) result += head + inner m = re.search(bq, text) @@ -358,20 +358,20 @@ except: pass if ctype == "empty": - return code(u"") + return code("") if ctype == "in_ns": in_ns = obj[1][0] subtree = obj[1] for sel in subtree: codegen(sel) - in_ns = u"" - return code(u"") + in_ns = "" + return code("") elif ctype == "decl": - name = u"" + name = "" for data in obj[1]: - if type(data) is unicode or type(data) is str: + if type(data) is str: name = data try: yf = ymlFunc[name] @@ -380,7 +380,7 @@ ymlFunc[name] = YF(name) yf = ymlFunc[name] if in_ns: - yf.alias = in_ns + u":" + name + yf.alias = in_ns + ":" + name if not enable_tracing: if in_ns == "xsl" and (name == "debug" or name=="assert" or name[:7]=="_trace_"): yf.alias = "-" @@ -394,9 +394,9 @@ yf = ymlFunc[name] = ymlFunc[base].copy(name) except KeyError: if included: - raise KeyError(u"in " + included + u":" + u(line) + u": " + base + u" as base for " + name) + raise KeyError("in " + included + ":" + u(line) + ": " + base + " as base for " + name) else: - raise KeyError(u"in " + u(line) + u": " + base + u" as base for " + name) + raise KeyError("in " + u(line) + ": " + base + " as base for " + name) elif data[0] == "shape": shape = ymlFunc[data[1]] try: @@ -404,9 +404,9 @@ yf.patch(shape) except KeyError: if included: - raise KeyError(u"in " + included + u":" + u(line) + u": " + base + u" as shape for " + name) + raise KeyError("in " + included + ":" + u(line) + ": " + base + " as shape for " + name) else: - raise KeyError(u"in " + u(line) + u": " + base + u" as shape for " + name) + raise KeyError("in " + u(line) + ": " + base + " as shape for " + name) elif data[0] == "descend": yf.addDescend(data[1]) elif data[0] == "declParm": @@ -422,23 +422,23 @@ yf.pointers[parmName[1:]] = value yf.addParm(parmName) elif parmName[0] == "%": - if type(value) is unicode or type(value) is str: + if type(value) is str: yf.macros[parmName] = u(evalPython(value)) else: yf.macros[parmName] = u(evalPython(u(value))) yf.addParm(parmName) elif data[0] == "alias": if in_ns: - yf.alias = in_ns + u":" + data[1][0] + yf.alias = in_ns + ":" + data[1][0] else: yf.alias = data[1][0] elif data[0] == "content": yf.content = data[1] - return code(u"") + return code("") elif ctype == "funclist": - result = u"" + result = "" for f in obj[1]: result += codegen(f) return code(result) @@ -447,13 +447,13 @@ if len(obj[1]): return codegen(('func', ['_parentheses', ('content', [obj[1][0]])])) else: - return u"" + return "" elif ctype == "fparm": if len(obj[1]): return codegen(('func', ['_parm', ('content', [obj[1][0]])])) else: - return u"" + return "" elif ctype == "generic": return codegen(('func', ['_generic', ('content', [obj[1][0]])])) @@ -468,15 +468,15 @@ if name == "decl": if ymlFunc[name] == "#error": if included: - raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in decl statement") + raise SyntaxError("in " + included + ":" + u(line) + ": syntax error in decl statement") else: - raise SyntaxError(u"in " + u(line) + u": syntax error in decl statement") + raise SyntaxError("in " + u(line) + ": syntax error in decl statement") if name == "define" or name == "operator": if ymlFunc[name] == "#error": if included: - raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in define statement") + raise SyntaxError("in " + included + ":" + u(line) + ": syntax error in define statement") else: - raise SyntaxError(u"in " + u(line) + u": syntax error in define statement") + raise SyntaxError("in " + u(line) + ": syntax error in define statement") if name[0] == "&": avoidTag = True @@ -485,7 +485,7 @@ if len(name) > 2: if name[0:2] == "**": - return code(eval('u'+pointer(name[1:]))) + return code(eval(''+pointer(name[1:]))) if name[0] == "*": name = eval(pointer(name)) @@ -495,11 +495,15 @@ try: ymlFunc[name] - except: + except KeyError: try: - ymlFunc["_"] - return codegen(('func', ['_', ('content', [('funclist', [obj])])])) - except: + if ymlFunc["_"].alias != "-": + return codegen(('func', ['_', ('content', [('funclist', [obj])])])) + else: + ymlFunc[name] = copy(ymlFunc["_"]) + ymlFunc[name].alias = name.replace("_", "-") + return codegen(obj) + except KeyError: ymlFunc[name] = YF(name) if ymlFunc[name].alias == "-": avoidTag = True @@ -508,9 +512,9 @@ if len(ymlFunc[name].descends): if obj[1][-1][0] != 'content': if included: - raise KeyError(u"in " + included + u":" + u(line) + u": " + name + u" has descending attributes, but no descendants are following") + raise KeyError("in " + included + ":" + u(line) + ": " + name + " has descending attributes, but no descendants are following") else: - raise KeyError(u"in " + u(line) + u": " + name + u" has descending attributes, but no descendants are following") + raise KeyError("in " + u(line) + ": " + name + " has descending attributes, but no descendants are following") def first_func(obj): if type(obj) is tuple or type(obj) is Symbol: @@ -559,7 +563,7 @@ if dname[0] == "*": pointers[dname[1:]] = "'" + f[1][0] + "'" else: - add_params.append( ('parm', [dname, u"'" + f[1][0] + u"'"]) ) + add_params.append( ('parm', [dname, "'" + f[1][0] + "'"]) ) try: add_params.extend( get_parms(f) ) except: pass @@ -571,14 +575,14 @@ to_add.append( ('func', new_things ) ) except: if included: - raise KeyError(u"in " + included + u":" + u(line) + u": " + name + u" has descending attributes, and too less descendants are following") + raise KeyError("in " + included + ":" + u(line) + ": " + name + " has descending attributes, and too less descendants are following") else: - raise KeyError(u"in " + u(line) + u": " + name + u" has descending attributes, and too less descendants are following") + raise KeyError("in " + u(line) + ": " + name + " has descending attributes, and too less descendants are following") if not to_add: to_add = ( obj, ) - complete = u"" + complete = "" for obj in to_add: subtree = None @@ -602,14 +606,14 @@ result += codegen(sel) if hasContent and not(avoidTag): - result += u"" + result += "" complete += result return code(complete) elif ctype == "textsection": - result = u'' + result = '' ll = obj[1].splitlines() space = len(ll[-1]) - 2 for l in ll[1:-1]: @@ -622,15 +626,15 @@ result += _finish(r) except SyntaxError: if included: - raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in executing command: " + cmd.strip()) + raise SyntaxError("in " + included + ":" + u(line) + ": syntax error in executing command: " + cmd.strip()) else: - raise SyntaxError(u"in " + u(line) + u": syntax error in executing command: " + cmd.strip()) - else: - result += codegen(Symbol(u'lineQuote', u'| ' + l[space:])) + raise SyntaxError("in " + u(line) + ": syntax error in executing command: " + cmd.strip()) + else: + result += codegen(Symbol('lineQuote', '| ' + l[space:])) return code(result) elif ctype == "textsectionu": - result = u'' + result = '' ll = obj[1].splitlines() space = len(ll[-1]) - 2 for l in ll[1:-1]: @@ -643,16 +647,16 @@ result += _finish(r) except SyntaxError: if included: - raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in executing command: " + cmd.strip()) + raise SyntaxError("in " + included + ":" + u(line) + ": syntax error in executing command: " + cmd.strip()) else: - raise SyntaxError(u"in " + u(line) + u": syntax error in executing command: " + cmd.strip()) - else: - if result != u'': result += u' ' - result += codegen(Symbol(u'quote', [u'> ' + l[space:]])) + raise SyntaxError("in " + u(line) + ": syntax error in executing command: " + cmd.strip()) + else: + if result != '': result += ' ' + result += codegen(Symbol('quote', ['> ' + l[space:]])) return code(result) elif ctype == "lineQuote" or ctype == "quote": - m, text, base, inds = None, u"", 0, 0 + m, text, base, inds = None, "", 0, 0 if ctype == "lineQuote": text = obj[1] @@ -670,20 +674,20 @@ inds = int(m.group(1)) text = m.group(2)[1:] else: - if type(text) is unicode or type(text) is str: + if type(text) is str: text = u(evalPython(text)) - ind = u"" + ind = "" if inds > -1: try: - cmd = evalPython(u"indent(" + u(inds) + u")") + cmd = evalPython("indent(" + u(inds) + ")") result, rest = parseLine(u(cmd), _inner, [], True, comment) if rest: raise SyntaxError() ind = _finish(result) except: pass - if ctype == "lineQuote": text += u"\n" + if ctype == "lineQuote": text += "\n" hasTextFunc = False try: @@ -697,13 +701,13 @@ elif ctype == "tagQuote": m = tq.match(obj[1]) if m.group(1) == "<": - return code(u"<" + m.group(2)) + return code("<" + m.group(2)) else: return code(m.group(2)) elif ctype == "operator": operator.append((re.compile(evalPython(obj[1][0])), obj[1][1])) - return code(u"") + return code("") elif ctype == "constant": name = obj[1][0] @@ -711,7 +715,7 @@ name = name[1:] value = obj[1][1] pointers[name] = value - return code(u"") + return code("") elif ctype == "include": reverse = False @@ -724,7 +728,7 @@ ktext = True elif arg[0] == "kxml": kxml = True - elif type(arg) is unicode or type(arg) is str: + elif type(arg) is str: filemask = arg if filemask[0] == '/' or filemask[0] == '.': @@ -740,14 +744,14 @@ if not(files): if included: - raise IOError(u"in " + included + ":" + u(line) + u": include file(s) '" + filemask + u"' not found") - else: - raise IOError(u"in " + u(line) + u": include file(s) '" + filemask + u"' not found") + raise IOError("in " + included + ":" + u(line) + ": include file(s) '" + filemask + "' not found") + else: + raise IOError("in " + u(line) + ": include file(s) '" + filemask + "' not found") includeFile = fileinput.input(files, mode="rU", openhook=fileinput.hook_encoded(encoding)) _included = included if ktext or kxml: - text = u"" + text = "" for line in includeFile: included = includeFile.filename() if kxml: @@ -776,7 +780,7 @@ parms = [] data = obj[1] for p in data: - if type(p) is unicode or type(p) is str: + if type(p) is str: name = p elif type(p) is tuple or type(p) is Symbol: ptype = p[0] @@ -786,9 +790,9 @@ else: parms.append(p[1][0]) if len(parms) == 0: - exp = name + u"()" + exp = name + "()" elif len(parms) == 1: - exp = name + u"(" + u(parms[0]) + u")" + exp = name + "(" + u(parms[0]) + ")" else: exp = name + u(tuple(parms)) cmd = evalPython(exp) @@ -798,31 +802,31 @@ return code(_finish(result)) else: - return code(u"") + return code("") def _finish(tree): - result = u"" - python = u"" + result = "" + python = "" for el in tree: if el[0] == "python": if el[1][0][:2] == "!!": python += el[1][0][2:-2] else: - python += el[1][0][1:] + u"\n" + python += el[1][0][1:] + "\n" continue else: if python: execPython(python) - python = u"" + python = "" try: result += codegen(el) except RuntimeError: if included: - raise RuntimeError(u"in " + included + u":" + u(line)) - else: - raise RuntimeError(u"in " + u(line)) + raise RuntimeError("in " + included + ":" + u(line)) + else: + raise RuntimeError("in " + u(line)) if python: execPython(python) diff -r 2f4ad3800a3f -r a218553807ab yml2/pyPEG.py --- a/yml2/pyPEG.py Wed Feb 27 14:43:35 2019 +0100 +++ b/yml2/pyPEG.py Wed Mar 18 19:20:01 2020 +0100 @@ -1,13 +1,13 @@ -# YPL parser 1.5 +# YPL parser 1.6 +# adapted for Python 3.x # written by VB. import re import sys, codecs -import exceptions - -class keyword(unicode): pass -class code(unicode): pass + +class keyword(str): pass +class code(str): pass class ignore(object): def __init__(self, regex_text, *args): self.regex = re.compile(regex_text, *args) @@ -18,10 +18,10 @@ class _not(_and): pass -class Name(unicode): +class Name(str): def __init__(self, *args): self.line = 0 - self.file = u"" + self.file = "" class Symbol(list): def __init__(self, name, what): @@ -31,27 +31,27 @@ self.append(what) def __call__(self): return self.what - def __unicode__(self): - return u'Symbol(' + repr(self.__name__) + ', ' + repr(self.what) + u')' + def __str__(self): + return 'Symbol(' + repr(self.__name__) + ', ' + repr(self.what) + ')' def __repr__(self): - return unicode(self) - -word_regex = re.compile(ur"\w+") -rest_regex = re.compile(ur".*") + return str(self) + +word_regex = re.compile(r"\w+") +rest_regex = re.compile(r".*") print_trace = False def u(text): - if isinstance(text, exceptions.BaseException): + if isinstance(text, BaseException): text = text.args[0] - if type(text) is unicode: + if type(text) is str: return text - if isinstance(text, str): + if isinstance(text, bytes): if sys.stdin.encoding: return codecs.decode(text, sys.stdin.encoding) else: return codecs.decode(text, "utf-8") - return unicode(text) + return str(text) def skip(skipper, text, skipWS, skipComments): if skipWS: @@ -104,7 +104,7 @@ if print_trace: try: if _pattern.__name__ != "comment": - sys.stderr.write(u"match: " + _pattern.__name__ + u"\n") + sys.stderr.write("match: " + _pattern.__name__ + "\n") except: pass if self.restlen == -1: @@ -146,7 +146,7 @@ if print_trace: try: if pattern.__name__ != "comment": - sys.stderr.write(u"testing with " + pattern.__name__ + u": " + textline[:40] + u"\n") + sys.stderr.write("testing with " + pattern.__name__ + ": " + textline[:40] + "\n") except: pass if pattern.__name__[0] != "_": @@ -160,7 +160,7 @@ pattern_type = type(pattern) - if pattern_type is str or pattern_type is unicode: + if pattern_type is str: if text[:len(pattern)] == pattern: text = skip(self.skipper, text[len(pattern):], skipWS, skipComments) return R(None, text) @@ -251,11 +251,11 @@ syntaxError() else: - raise SyntaxError(u"illegal type in grammar: " + u(pattern_type)) + raise SyntaxError("illegal type in grammar: " + u(pattern_type)) def lineNo(self): - if not(self.lines): return u"" - if self.restlen == -1: return u"" + if not(self.lines): return "" + if self.restlen == -1: return "" parsed = self.textlen - self.restlen left, right = 0, len(self.lines) @@ -266,20 +266,20 @@ try: if self.lines[mid + 1][0] >= parsed: try: - return u(self.lines[mid + 1][1]) + u":" + u(self.lines[mid + 1][2]) + return u(self.lines[mid + 1][1]) + ":" + u(self.lines[mid + 1][2]) except: - return u"" + return "" else: left = mid + 1 except: try: - return u(self.lines[mid + 1][1]) + u":" + u(self.lines[mid + 1][2]) + return u(self.lines[mid + 1][1]) + ":" + u(self.lines[mid + 1][2]) except: - return u"" + return "" else: right = mid - 1 if left > right: - return u"" + return "" # plain module API @@ -308,7 +308,7 @@ while callable(language): language = language() - orig, ld = u"", 0 + orig, ld = "", 0 for line in lineSource: if lineSource.isfirstline(): ld = 1 @@ -331,10 +331,10 @@ if text: raise SyntaxError() - except SyntaxError, msg: + except SyntaxError as msg: parsed = textlen - p.restlen textlen = 0 - nn, lineNo, file = 0, 0, u"" + nn, lineNo, file = 0, 0, "" for n, ld, l in lines: if n >= parsed: break @@ -346,6 +346,6 @@ lineNo += 1 nn -= 1 lineCont = orig.splitlines()[nn] - raise SyntaxError(u"syntax error in " + u(file) + u":" + u(lineNo) + u": " + lineCont) + raise SyntaxError("syntax error in " + u(file) + ":" + u(lineNo) + ": " + lineCont) return result diff -r 2f4ad3800a3f -r a218553807ab yml2/yml2.py --- a/yml2/yml2.py Wed Feb 27 14:43:35 2019 +0100 +++ b/yml2/yml2.py Wed Mar 18 19:20:01 2020 +0100 @@ -1,4 +1,4 @@ -# YML 2.5.10 language definition +# YML 2.6.0 language definition # written by VB. @@ -44,12 +44,12 @@ macro = r(r"\%" + _symbol, re.U) reference = r(r"\&" + _symbol, re.U) -NameStartChar = ur''':|[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]''' -NameChar = NameStartChar + ur'''|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040]''' +NameStartChar = r''':|[A-Z]|_|[a-z]|[\u00C0-\u00D6]|[\u00D8-\u00F6]|[\u00F8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]''' +NameChar = NameStartChar + r'''|-|\.|[0-9]|\u00B7|[\u0300-\u036F]|[\u203F-\u2040]''' -_xmlSymbol = u"(" + NameStartChar + u")(" + NameChar + u")*" +_xmlSymbol = "(" + NameStartChar + ")(" + NameChar + ")*" xmlSymbol = r(_xmlSymbol) -aliasSymbol = r(ur"-|(" + _xmlSymbol + ur")") +aliasSymbol = r(r"-|(" + _xmlSymbol + r")") literal = [r(r'""".*?"""', re.S), r(r"'''.*?'''", re.S), r(r"""0x[a-f0-9]+|-?\d+\.\d*|-?\.\d+|-?\d+|".*?"|'.*?'""")] filename = [("'", r(r"[^']*"), "'"), ('"', r(r'[^"]*'), '"'), r(r"[^\s;]+")] diff -r 2f4ad3800a3f -r a218553807ab yml2/yml2c.py --- a/yml2/yml2c.py Wed Feb 27 14:43:35 2019 +0100 +++ b/yml2/yml2c.py Wed Mar 18 19:20:01 2020 +0100 @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # vim: set fileencoding=utf-8 : """\ -YML 2 compiler version 5.8 -Copyleft (c), 2009-2011, Volker Birk http://fdik.org/yml/ +YML 2 compiler version 6.2 +Copyleft (c), 2009-2019, Volker Birk http://fdik.org/yml/ """ @@ -17,18 +17,15 @@ def printInfo(option, opt_str, value, parser): sys.stdout.write(__doc__) + sys.exit(0) def w(msg): if isinstance(msg, BaseException): - try: - msg = str(msg) + "\n" - except: - msg = u(msg) + u"\n" - if type(msg) is unicode: + msg = str(msg) + "\n" + if type(msg) is bytes: msg = codecs.encode(msg, sys.stderr.encoding) sys.stderr.write(msg) - def main(): optParser = OptionParser() optParser.add_option("-C", "--old-syntax", action="store_true", dest="old_syntax", @@ -78,20 +75,21 @@ result = unicodedata.normalize(options.normalization, result) if options.outputFile and options.outputFile != "-": - outfile = open(options.outputFile, "w") + outfile = open(options.outputFile, "wb") outfile.write(codecs.encode(result, options.encoding)) outfile.close() else: - print(codecs.encode(result, options.encoding)) + sys.stdout.buffer.write(codecs.encode(result, options.encoding)) + print() except KeyboardInterrupt: w("\n") sys.exit(1) except KeyError as msg: - w(u"not found: " + u(msg) + u"\n") + w("not found: " + u(msg) + "\n") sys.exit(4) except LookupError as msg: - w(u"not found: " + u(msg) + u"\n") + w("not found: " + u(msg) + "\n") sys.exit(4) except Exception as msg: w(msg) @@ -100,3 +98,4 @@ if __name__ == "__main__": sys.exit(main()) + diff -r 2f4ad3800a3f -r a218553807ab yml2/yml2proc.py --- a/yml2/yml2proc.py Wed Feb 27 14:43:35 2019 +0100 +++ b/yml2/yml2proc.py Wed Mar 18 19:20:01 2020 +0100 @@ -1,9 +1,9 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 # vim: set fileencoding=utf-8 : """\ -YML/YSLT 2 processor version 5.10 -Copyleft (c), 2009-2018 Volker Birk http://fdik.org/yml/ +YML/YSLT 2 processor version 6.2 +Copyleft (c), 2009-2019 Volker Birk http://fdik.org/yml/ """ @@ -32,12 +32,9 @@ try: msg = str(msg) + "\n" except: - msg = u(msg) + u"\n" - if type(msg) is unicode: - msg = codecs.encode(msg, sys.stderr.encoding) + msg = u(msg) + "\n" sys.stderr.write(msg) - def main(): optParser = OptionParser() optParser.add_option("-C", "--old-syntax", action="store_true", dest="old_syntax", @@ -78,24 +75,24 @@ help="convert XML to normalized YML code") optParser.add_option("-V", "--version", action="callback", callback=printInfo, help="show version info and exit") (options, args) = optParser.parse_args() - + if options.old_syntax: oldSyntax() - + if options.trace: backend.enable_tracing = True - + if options.emitlinenumbers: backend.emitlinenumbers = True - + if options.includePathText: backend.includePath = options.includePathText.split(':') - + backend.encoding = options.encoding - + dirs = os.environ.get('YML_PATH', '.').split(':') backend.includePath.extend(dirs) - + if options.xml2yml: for directory in backend.includePath: try: @@ -105,22 +102,22 @@ break except: pass - + options.yslt = name options.xml = True - + if (options.xslt and options.yslt) or (options.xslt and options.xpath) or (options.yslt and options.xpath): sys.stderr.write("Cannot combine --xpath, --xslt and --yslt params\n") sys.exit(1) - + try: ymlC = ymlCStyle() - - rtext = u"" - + + rtext = "" + if not options.emptyinput: files = fileinput.input(args, mode="rU", openhook=fileinput.hook_encoded(options.encoding)) - + if options.xml: rtext = "" for line in files: @@ -132,39 +129,39 @@ sys.exit(0) else: rtext = backend.finish(result) - + if not rtext: - rtext = u"" - + rtext = "" + def ymldebug(context, text): if options.trace: sys.stderr.write("Debug: " + codecs.encode(u(text), options.encoding) + "\n") return "" - + def ymlassert(context, value, msg): if options.trace: if not value: raise YMLAssert(msg) return "" - + ymlns = etree.FunctionNamespace("http://fdik.org/yml") ymlns.prefix = "yml" ymlns['debug'] = ymldebug ymlns['assert'] = ymlassert - + if options.xpath: tree = etree.fromstring(rtext) ltree = tree.xpath(codecs.decode(options.xpath, options.encoding)) - rtext = u"" + rtext = "" try: for rtree in ltree: rtext += etree.tostring(rtree, pretty_print=options.pretty, encoding=unicode) except: rtext = ltree - + elif options.yslt or options.xslt: params = {} - + if options.yslt: backend.clearAll() yscript = fileinput.input(options.yslt, mode="rU", openhook=fileinput.hook_encoded(options.encoding)) @@ -175,21 +172,21 @@ ytext = "" for line in yscript: ytext += line - + doc = etree.fromstring(rtext) - + xsltree = etree.XML(ytext, base_url=os.path.abspath(yscript.filename())) transform = etree.XSLT(xsltree) if options.params: params = eval(options.params) for key, value in params.iteritems(): - if type(value) != unicode: + if type(value) is not str: params[key] = u(value) if options.stringparams: for key, value in eval(options.stringparams).iteritems(): - params[key] = u"'" + u(value) + u"'" - + params[key] = "'" + u(value) + "'" + rresult = transform(doc, **params) # lxml is somewhat buggy try: @@ -198,46 +195,48 @@ rtext = etree.tostring(rresult, encoding=unicode) if not rtext: rtext = codecs.decode(str(rresult), "utf-8") - + if options.normalization != "none": rtext = unicodedata.normalize(options.normalization, rtext) - + if options.pretty: plaintext = etree.tostring(etree.fromstring(rtext), pretty_print=True, xml_declaration=True, encoding=options.encoding) else: - if isinstance(rtext, unicode): + if isinstance(rtext, str): plaintext = codecs.encode(rtext, options.encoding) else: - plaintext = str(rtext) - + plaintext = rtext + try: if plaintext[-1] == "\n": plaintext = plaintext[:-1] except: pass - + if options.outputFile and options.outputFile != "-": - outfile = open(options.outputFile, "w") + outfile = open(options.outputFile, "wb") outfile.write(plaintext) outfile.close() else: - print(plaintext) - + sys.stdout.buffer.write(plaintext) + if not options.pretty: + print() + except KeyboardInterrupt: w("\n") sys.exit(1) except YMLAssert as msg: - w(u"YML Assertion failed: " + u(msg) + u"\n") + w("YML Assertion failed: " + u(msg) + "\n") sys.exit(2) except KeyError as msg: - w(u"not found: " + u(msg) + u"\n") + w("not found: " + u(msg) + "\n") sys.exit(4) except LookupError as msg: - w(u"not found: " + u(msg) + u"\n") + w("not found: " + u(msg) + "\n") sys.exit(4) except etree.XMLSyntaxError as e: log = e.error_log.filter_from_level(etree.ErrorLevels.FATAL) for entry in log: - w(u"XML error: " + u(entry.message) + u"\n") + w("XML error: " + u(entry.message) + "\n") sys.exit(5) except Exception as msg: w(msg) diff -r 2f4ad3800a3f -r a218553807ab yml2/yslt.yml2 --- a/yml2/yslt.yml2 Wed Feb 27 14:43:35 2019 +0100 +++ b/yml2/yslt.yml2 Wed Mar 18 19:20:01 2020 +0100 @@ -1,4 +1,4 @@ -// YSLT version 2.5.5 +// YSLT version 2.6.2 !! def indent(level): @@ -49,7 +49,7 @@ output *output; const "space", !"'" + " " * 200 + "'"!; param "autoindent", 4; - xsl:template "text()"; + xsl:template match="text()"; content; }, tstylesheet is textstylesheet;