vb@29: # 2.5.10 backend vb@0: vb@0: # written by VB. vb@0: vb@0: import re, codecs vb@0: import fileinput vb@0: import sys, traceback, exceptions, os vb@0: from xml.sax.saxutils import escape, quoteattr vb@29: from copy import copy, deepcopy vb@0: from glob import glob vb@0: from pyPEG import code, parse, parseLine, u, Symbol vb@0: from yml2 import ymlCStyle, comment, _inner vb@0: vb@0: ymlFunc, pointers, pythonFunc = {}, {}, {} vb@0: in_ns = u"" vb@0: operator = [] vb@0: included = u"" vb@0: includePath = [] vb@0: emitlinenumbers = False vb@0: encoding = "utf-8" vb@0: vb@0: first = True vb@0: enable_tracing = False vb@0: vb@0: ymlFunc["decl"] = "#error" vb@0: ymlFunc["define"] = "#error" vb@0: ymlFunc["operator"] = "#error" vb@0: vb@0: def clearAll(): vb@0: global ymlFunc, pointers, pythonFunc, in_ns, operator, included vb@0: ymlFunc, pointers, pythonFunc = {}, {}, {} vb@0: in_ns = u"" vb@0: operator = [] vb@0: included = u"" vb@0: vb@0: lq = re.compile(r"\|(\>*)(.*)") vb@0: sq = re.compile(r"(\d*)\>(.*)") vb@0: ts = re.compile(r'(\|\|(?P\>*)\s*\n(?P.*?)\n(?P\s*)\|\|)|("""(?P.*?)""")|(\>\>(?P.*?)\>\>)', re.S) vb@0: tq = re.compile(r"(\]|\<)\s*(.*)") vb@0: bq = re.compile(r"\`(.*?)\`", re.S) vb@0: bqq = re.compile(r"\s*\`\`(.*)") vb@0: all = re.compile(r".*", re.S) vb@0: vb@0: line = 1 vb@0: vb@0: def pointer(name): vb@0: try: vb@0: return u(pointers[name[1:]]) vb@0: except: vb@0: if name == "*_trace_info": vb@0: return u'""' vb@0: if included: vb@0: raise LookupError(u"in " + included + u":" + u(line) + u": pointer " + name) vb@0: else: vb@0: raise LookupError(u"in " + u(line) + u": pointer " + name) vb@0: vb@0: def evalPython(expr): vb@0: try: vb@0: result = eval(u(expr), pythonFunc) vb@0: if type(result) is str: vb@0: return codecs.decode(result, encoding) vb@0: else: vb@0: return result vb@0: except: vb@0: name, parm, tb = sys.exc_info() vb@0: msg = u"in python expression: " + u(parm) vb@0: if name is exceptions.SyntaxError: vb@0: tbl = traceback.format_exception(name, parm, tb) vb@0: msg += u"\n" + tbl[-3] + tbl[-2] vb@0: else: vb@0: msg += u": " + expr + u"\n" vb@0: if included: vb@0: raise name(u"in " + included + u":" + u(line) + u": " + msg) vb@0: else: vb@0: raise name(u"in " + u(line) + u": " + msg) vb@0: vb@0: def execPython(script): vb@0: try: vb@0: if type(script) is unicode: vb@0: exec script in pythonFunc vb@0: else: vb@0: exec codecs.decode(script, encoding) in pythonFunc vb@0: except: vb@0: name, parm, tb = sys.exc_info() vb@0: msg = u"in python script: " + u(parm) vb@0: if name is exceptions.SyntaxError: vb@0: tbl = traceback.format_exception(name, parm, tb) vb@0: msg += u"\n" + tbl[-3] + tbl[-2] vb@0: else: vb@0: msg += u": " + expr + u"\n" vb@0: if included: vb@0: raise name(u"in " + included + u":" + u(line) + u": " + msg) vb@0: else: vb@0: raise name(u"in " + u(line) + u": " + msg) vb@0: vb@0: def textOut(text): vb@0: if not text: vb@0: return u"" vb@0: if type(text) is not unicode: vb@0: text = codecs.decode(text, encoding) vb@0: text = text.replace(r'\"', r'\\"') vb@0: text = u'u"""' + text.replace('"', r'\"') + u'"""' vb@0: try: vb@0: textFunc = ymlFunc["text"] vb@0: parms = ['text', ('parm', [text])] vb@0: c, result = textFunc(parms) vb@0: if c: vb@0: if type(textFunc.alias) is unicode: vb@0: result += u"" vb@0: else: vb@0: result += u"" vb@0: return result vb@0: except: vb@0: return escape(eval(text)) vb@0: vb@0: def strRepl(text): vb@0: if not text: vb@0: return u"" vb@0: if type(text) is not unicode: vb@0: text = codecs.decode(text, encoding) vb@0: text = text.replace(r'\"', r'\\"') vb@0: text = u'u"""' + text.replace('"', r'\"') + u'"""' vb@0: if type(text) is unicode: vb@0: return escape(eval(text)) vb@0: vb@0: def applyMacros(macros, text): vb@0: result = text vb@0: for key, value in macros.iteritems(): vb@0: result = result.replace(key, value) vb@0: return result vb@0: vb@0: class YF: vb@0: def __init__(self, name): vb@0: self.name = name vb@0: self.parms = [] vb@0: self.descends = [] vb@0: self.values = {} vb@0: self.content = None vb@0: self.pointers = {} vb@0: self.macros = {} vb@0: if in_ns: vb@0: self.alias = in_ns + u":" + name.replace("_", "-") vb@0: else: vb@0: self.alias = name.replace("_", "-") vb@0: pythonFunc["yml_" + name] = self vb@0: if emitlinenumbers: vb@0: self.values["yml:declared"] = u(line) vb@0: vb@0: def copy(self, newName): vb@0: yf = YF(newName) vb@0: yf.parms.extend(self.parms) vb@0: yf.descends.extend(self.descends) vb@0: yf.values = self.values.copy() vb@0: yf.content = self.content vb@0: yf.pointers = self.pointers.copy() vb@0: yf.macros = self.macros.copy() vb@0: yf.alias = self.alias vb@0: return yf vb@0: vb@0: def patch(self, second): vb@0: self.parms.extend(second.parms) vb@0: self.descends.extend(second.descends) vb@0: self.values.update(second.values) vb@0: if second.content: vb@0: self.content = second.content vb@0: self.pointers.update(second.pointers) vb@0: self.macros.update(second.macros) vb@0: vb@0: def __call__(self, called_with, hasContent = False, avoidTag = False): vb@0: global pointers vb@0: parms = [] vb@0: vals = {} vb@0: if self.pointers: vb@0: pointers.update(self.pointers) vb@0: vb@0: for data in called_with: vb@0: if type(data) is tuple or type(data) is Symbol: vb@0: if data[0] == "parm": vb@0: l = data[1] vb@0: parm = l[0] vb@0: if parm[0] == "*": vb@0: parm = pointer(parm) vb@0: if len(l) == 1: vb@0: if type(parm) is tuple or type(parm) is Symbol: vb@0: if parm[0] == "pyExp": vb@0: val = evalPython(parm[1][0]) vb@0: parms.append(val) vb@0: else: vb@0: parms.append(evalPython((parm))) vb@0: else: vb@0: if type(parm) is tuple or type(parm) is Symbol: vb@0: if parm[0] == "pyExp": vb@0: parm = evalPython(parm[1][0]) vb@0: val = l[1] vb@0: if type(val) is tuple or type(val) is Symbol: vb@0: if val[0] == "pyExp": vb@0: val = evalPython(val[1][0]) vb@0: if val[0] == "*": vb@0: val = pointer(val) vb@0: if u(val)[0] == '"' or u(val)[0] == "'": vb@0: vals[parm] = evalPython(u(val)) vb@0: else: vb@0: vals[parm] = u(val) vb@0: elif data[0] == "content": vb@0: hasContent = True vb@0: vb@0: if enable_tracing: vb@0: text = u(parms) + u", " + u(vals) vb@0: pointers["_trace_info"] = u'"' + u(line) + u": " + u(self.name) + u" " + text.replace(u'"', u'#') + u'"' vb@0: vb@0: if emitlinenumbers: vb@0: global first vb@0: if first: vb@0: vals["xmlns:yml"] = u"http://fdik.org/yml" vb@0: first = False vb@0: vals["yml:called"] = u(line) vb@0: return self.xml(parms, vals, hasContent, avoidTag) vb@0: vb@0: def addParm(self, parm): vb@0: if parm[0] == "%": vb@0: for i in range(len(self.parms)): vb@0: if self.parms[i][0] != "%": vb@0: self.parms.insert(i, parm) vb@0: return vb@0: self.parms.append(parm) vb@0: vb@0: def addDescend(self, desc): vb@0: if desc[0] == "+" or desc[0] == "@": vb@0: self.descends.append(desc[1:]) vb@0: else: vb@0: self.descends.append(desc) vb@0: vb@0: def addValue(self, parm, value): vb@0: if type(value) is str or type(value) is unicode: vb@20: if value[0] != "'" and value[0] != '"': vb@22: self.values[parm] = u(value) vb@22: else: vb@22: self.values[parm] = u(evalPython(value)) vb@0: else: vb@0: self.values[parm] = u(evalPython(u(value))) vb@0: vb@0: def xml(self, callParms, callValues, hasContent, avoidTag = False): vb@0: global pointers vb@0: extraContent = u"" vb@0: if self.content: vb@0: hasContent = True vb@0: resultParms = self.values.copy() vb@0: macros = self.macros.copy() vb@0: toDelete = resultParms.keys() vb@0: for key in toDelete: vb@0: if key[0] == "*": vb@0: del resultParms[key] vb@0: for key, value in callValues.iteritems(): vb@0: if key[0] == "%": vb@0: macros[key] = value vb@0: else: vb@0: resultParms[key] = value vb@0: i = 0 vb@0: for cp in callParms: vb@0: if i < len(self.parms): vb@0: if self.parms[i][0] == "*": vb@0: cp = u(cp) vb@0: if "'" in cp: vb@0: pointers[self.parms[i][1:]] = u'"' + cp + u'"' vb@0: else: vb@0: pointers[self.parms[i][1:]] = u"'" + cp + u"'" vb@0: elif self.parms[i][0] == "%": vb@0: macros[self.parms[i]] = u(cp) vb@0: else: vb@0: resultParms[self.parms[i]] = cp vb@0: else: vb@0: extraContent += u(cp) vb@0: hasContent = True vb@0: i += 1 vb@0: result = u"" vb@0: for p, v in resultParms.iteritems(): vb@0: if p[0] == "'" or p[0] == '"': vb@0: p = eval(p) vb@0: result += u" "+ p + u"=" + quoteattr(applyMacros(macros, u(v))) vb@0: if hasContent: vb@0: if avoidTag: vb@0: return True, strRepl(extraContent) vb@0: else: vb@0: return True, u"<" + self.alias + result + u">" + strRepl(extraContent) vb@0: else: vb@0: if avoidTag: vb@0: return False, u"" vb@0: else: vb@0: return False, u"<" + self.alias + result + u"/>" vb@0: vb@0: def replaceContent(tree, subtree): vb@0: n = 0 vb@0: while n < len(tree): vb@0: obj = tree[n] vb@0: if obj[0] == "func": vb@0: l = obj[1] vb@0: if l[0] == "content": vb@0: d = 1 vb@0: if subtree: vb@0: for el in subtree: vb@0: tree.insert(n+d, el) vb@0: d += 1 vb@0: del tree[n] vb@0: n += d vb@0: else: vb@0: try: vb@0: if l[-1][0] == "content": vb@0: replaceContent(l[-1][1], subtree) vb@0: except: pass vb@0: elif obj[0] == "funclist": vb@0: replaceContent(obj[1], subtree) vb@0: n += 1 vb@0: return tree vb@0: vb@0: def executeCmd(text): vb@0: if type(text) is not unicode: vb@0: text = codecs.decode(text, encoding) vb@0: for (regex, pattern) in operator: vb@0: match = re.search(regex, text) vb@0: while match: vb@0: cmd = pattern vb@0: opt = match.groups() vb@0: for i in range(len(opt)): vb@0: cmd = cmd.replace(u"%" + u(i+1), opt[i]) vb@0: text = text[:match.start()] + u"`" + cmd + u"`"+ text[match.end():] vb@0: match = re.search(regex, text) vb@0: vb@0: result = u"" vb@0: m = re.search(bq, text) vb@0: while text and m: vb@0: cmd = m.group(1) vb@0: head = textOut(text[:m.start()]) vb@0: text = text[m.end():] vb@0: try: vb@0: r, rest = parseLine(cmd, _inner, [], True, comment) vb@0: if rest: raise SyntaxError(cmd) vb@0: except SyntaxError: vb@0: if included: vb@0: raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in executing command: " + cmd.strip()) vb@0: else: vb@0: raise SyntaxError(u"in " + u(line) + u": syntax error in executing command: " + cmd.strip()) vb@0: inner = _finish(r) vb@0: result += head + inner vb@0: m = re.search(bq, text) vb@0: result += textOut(text) vb@0: vb@0: return result vb@0: vb@0: def codegen(obj): vb@0: global in_ns, pointers, line, included vb@0: ctype = obj[0] vb@0: vb@0: if type(obj) is code: vb@0: return obj vb@0: vb@0: try: vb@0: if ctype.line: line = ctype.line vb@0: except: pass vb@0: vb@0: if ctype == "empty": vb@0: return code(u"") vb@0: vb@0: if ctype == "in_ns": vb@0: in_ns = obj[1][0] vb@0: subtree = obj[1] vb@0: for sel in subtree: vb@0: codegen(sel) vb@0: in_ns = u"" vb@0: return code(u"") vb@0: vb@0: elif ctype == "decl": vb@0: name = u"" vb@0: for data in obj[1]: vb@0: if type(data) is unicode or type(data) is str: vb@0: name = data vb@0: try: vb@0: yf = ymlFunc[name] vb@0: yf.alias vb@0: except: vb@0: ymlFunc[name] = YF(name) vb@0: yf = ymlFunc[name] vb@0: if in_ns: vb@0: yf.alias = in_ns + u":" + name vb@0: if not enable_tracing: vb@0: if in_ns == "xsl" and (name == "debug" or name=="assert" or name[:7]=="_trace_"): vb@0: yf.alias = "-" vb@0: yf.addParm("skip1") vb@0: yf.addParm("skip2") vb@0: break vb@0: elif type(data) is tuple or type(data) is Symbol: vb@0: if data[0] == "base": vb@0: base = data[1][0] vb@0: try: vb@0: yf = ymlFunc[name] = ymlFunc[base].copy(name) vb@0: except KeyError: vb@0: if included: vb@0: raise KeyError(u"in " + included + u":" + u(line) + u": " + base + u" as base for " + name) vb@0: else: vb@0: raise KeyError(u"in " + u(line) + u": " + base + u" as base for " + name) vb@0: elif data[0] == "shape": vb@0: shape = ymlFunc[data[1]] vb@0: try: vb@0: yf = ymlFunc[name] vb@0: yf.patch(shape) vb@0: except KeyError: vb@0: if included: vb@0: raise KeyError(u"in " + included + u":" + u(line) + u": " + base + u" as shape for " + name) vb@0: else: vb@0: raise KeyError(u"in " + u(line) + u": " + base + u" as shape for " + name) vb@0: elif data[0] == "descend": vb@0: yf.addDescend(data[1]) vb@0: elif data[0] == "declParm": vb@0: l = data[1] vb@0: parmName = l[0] vb@0: if len(l)==1: vb@0: yf.addParm(parmName) vb@0: else: vb@0: value = l[1] vb@0: if parmName[0] != "%": vb@0: yf.addValue(parmName, value) vb@0: if parmName[0] == "*": vb@0: yf.pointers[parmName[1:]] = value vb@0: yf.addParm(parmName) vb@0: elif parmName[0] == "%": vb@0: if type(value) is unicode or type(value) is str: vb@0: yf.macros[parmName] = u(evalPython(value)) vb@0: else: vb@0: yf.macros[parmName] = u(evalPython(u(value))) vb@0: yf.addParm(parmName) vb@0: elif data[0] == "alias": vb@0: if in_ns: vb@0: yf.alias = in_ns + u":" + data[1][0] vb@0: else: vb@0: yf.alias = data[1][0] vb@0: elif data[0] == "content": vb@0: yf.content = data[1] vb@0: vb@0: return code(u"") vb@0: vb@0: elif ctype == "funclist": vb@0: result = u"" vb@0: for f in obj[1]: vb@0: result += codegen(f) vb@0: return code(result) vb@0: vb@0: elif ctype == "parentheses": vb@0: if len(obj[1]): vb@0: return codegen(('func', ['_parentheses', ('content', [obj[1][0]])])) vb@0: else: vb@0: return u"" vb@0: vb@0: elif ctype == "fparm": vb@0: if len(obj[1]): vb@0: return codegen(('func', ['_parm', ('content', [obj[1][0]])])) vb@0: else: vb@0: return u"" vb@0: vb@0: elif ctype == "generic": vb@0: return codegen(('func', ['_generic', ('content', [obj[1][0]])])) vb@0: vb@0: elif ctype == "xbase": vb@0: return codegen(('func', ['_base', ('content', [obj[1][0]])])) vb@0: vb@0: elif ctype == "func": vb@0: avoidTag = False vb@0: name = obj[1][0] vb@0: vb@0: if name == "decl": vb@0: if ymlFunc[name] == "#error": vb@0: if included: vb@0: raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in decl statement") vb@0: else: vb@0: raise SyntaxError(u"in " + u(line) + u": syntax error in decl statement") vb@0: if name == "define" or name == "operator": vb@0: if ymlFunc[name] == "#error": vb@0: if included: vb@0: raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in define statement") vb@0: else: vb@0: raise SyntaxError(u"in " + u(line) + u": syntax error in define statement") vb@0: vb@0: if name[0] == "&": vb@0: avoidTag = True vb@0: name = name[1:] vb@0: hasContent = False vb@0: vb@0: if len(name) > 2: vb@0: if name[0:2] == "**": vb@0: return code(eval('u'+pointer(name[1:]))) vb@0: vb@0: if name[0] == "*": vb@0: name = eval(pointer(name)) vb@0: if name[0] == "&": vb@0: avoidTag = True vb@0: name = name[1:] vb@0: vb@0: try: vb@0: ymlFunc[name] vb@29: except KeyError: vb@0: try: vb@29: if ymlFunc["_"].alias != u"-": vb@29: return codegen(('func', ['_', ('content', [('funclist', [obj])])])) vb@29: else: vb@29: ymlFunc[name] = copy(ymlFunc["_"]) vb@29: ymlFunc[name].alias = name.replace("_", "-") vb@29: return codegen(obj) vb@29: except KeyError: vb@0: ymlFunc[name] = YF(name) vb@0: vb@0: if ymlFunc[name].alias == "-": avoidTag = True vb@0: vb@0: to_add = [] vb@0: if len(ymlFunc[name].descends): vb@0: if obj[1][-1][0] != 'content': vb@0: if included: vb@0: raise KeyError(u"in " + included + u":" + u(line) + u": " + name + u" has descending attributes, but no descendants are following") vb@0: else: vb@0: raise KeyError(u"in " + u(line) + u": " + name + u" has descending attributes, but no descendants are following") vb@0: vb@0: def first_func(obj): vb@0: if type(obj) is tuple or type(obj) is Symbol: vb@0: if obj[0] == 'func': vb@0: return obj vb@0: elif obj[0] == 'funclist': vb@0: return first_func(obj[1]) vb@0: elif obj[0] == 'content': vb@0: return first_func(obj[1]) vb@0: else: vb@0: return None vb@0: elif type(obj) == list: vb@0: for e in obj: vb@0: f = first_func(e) vb@0: if f: return f vb@0: return None vb@0: vb@0: def copy_without_first_func(o, found = False): vb@0: c = [] vb@0: for obj in o: vb@0: if found: vb@0: c.append(obj) vb@0: else: vb@0: if obj[0] == 'func': vb@0: if obj[1][-1][0] == 'content': vb@0: c.extend( obj[1][-1][1] ) vb@0: found = True vb@0: else: vb@0: c.append( ( obj[0], copy_without_first_func(obj[1], False ) ) ) vb@0: return c vb@0: vb@0: def get_parms(obj): vb@0: result = [] vb@0: for e in obj[1]: vb@0: if type(e) is tuple or type(e) is Symbol: vb@0: if e[0] == "parm": vb@0: result.append( e ) vb@0: return result vb@0: vb@0: try: vb@0: add_params = get_parms(obj) vb@0: for e in obj[1][-1][1]: vb@0: c = e[1] vb@0: for dname in ymlFunc[name].descends: vb@0: f, c = first_func(c), copy_without_first_func(c) vb@0: if dname[0] == "*": vb@0: pointers[dname[1:]] = "'" + f[1][0] + "'" vb@0: else: vb@0: add_params.append( ('parm', [dname, u"'" + f[1][0] + u"'"]) ) vb@0: try: vb@0: add_params.extend( get_parms(f) ) vb@0: except: pass vb@0: vb@0: new_things = [ e[1][0] ] vb@0: new_things.extend( add_params ) vb@0: new_things.append( ('content', c) ) vb@0: vb@0: to_add.append( ('func', new_things ) ) vb@0: except: vb@0: if included: vb@0: raise KeyError(u"in " + included + u":" + u(line) + u": " + name + u" has descending attributes, and too less descendants are following") vb@0: else: vb@0: raise KeyError(u"in " + u(line) + u": " + name + u" has descending attributes, and too less descendants are following") vb@0: vb@0: if not to_add: vb@0: to_add = ( obj, ) vb@0: vb@0: complete = u"" vb@0: vb@0: for obj in to_add: vb@0: subtree = None vb@0: try: vb@0: if obj[1][-1][0] == "content": vb@0: subtree = obj[1][-1][1] vb@0: except: pass vb@0: vb@0: if ymlFunc[name].content: vb@0: hasContent = True vb@0: treetemplate = deepcopy(ymlFunc[name].content) vb@0: subtree = replaceContent(treetemplate, subtree) vb@0: vb@0: if subtree: vb@0: hasContent = True vb@0: vb@0: hasContent, result = ymlFunc[name](obj[1], hasContent, avoidTag) vb@0: vb@0: if subtree: vb@0: for sel in subtree: vb@0: result += codegen(sel) vb@0: vb@0: if hasContent and not(avoidTag): vb@0: result += u"" vb@0: vb@0: complete += result vb@0: vb@0: return code(complete) vb@0: vb@0: elif ctype == "textsection": vb@0: result = u'' vb@0: ll = obj[1].splitlines() vb@0: space = len(ll[-1]) - 2 vb@0: for l in ll[1:-1]: vb@0: m = re.match(bqq, l) vb@0: if m: vb@0: cmd = m.group(1) vb@0: try: vb@0: r, x = parseLine(cmd, _inner, [], True, comment) vb@0: if x: raise SyntaxError(cmd) vb@0: result += _finish(r) vb@0: except SyntaxError: vb@0: if included: vb@0: raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in executing command: " + cmd.strip()) vb@0: else: vb@0: raise SyntaxError(u"in " + u(line) + u": syntax error in executing command: " + cmd.strip()) vb@0: else: vb@0: result += codegen(Symbol(u'lineQuote', u'| ' + l[space:])) vb@0: return code(result) vb@0: vb@14: elif ctype == "textsectionu": vb@14: result = u'' vb@14: ll = obj[1].splitlines() vb@14: space = len(ll[-1]) - 2 vb@14: for l in ll[1:-1]: vb@14: m = re.match(bqq, l) vb@14: if m: vb@14: cmd = m.group(1) vb@14: try: vb@14: r, x = parseLine(cmd, _inner, [], True, comment) vb@14: if x: raise SyntaxError(cmd) vb@14: result += _finish(r) vb@14: except SyntaxError: vb@14: if included: vb@14: raise SyntaxError(u"in " + included + u":" + u(line) + u": syntax error in executing command: " + cmd.strip()) vb@14: else: vb@14: raise SyntaxError(u"in " + u(line) + u": syntax error in executing command: " + cmd.strip()) vb@14: else: vb@14: if result != u'': result += u' ' vb@14: result += codegen(Symbol(u'quote', [u'> ' + l[space:]])) vb@14: return code(result) vb@14: vb@0: elif ctype == "lineQuote" or ctype == "quote": vb@0: m, text, base, inds = None, u"", 0, 0 vb@0: vb@0: if ctype == "lineQuote": vb@0: text = obj[1] vb@0: m = lq.match(text) vb@0: if m: vb@0: inds = len(m.group(1)) vb@0: text = m.group(2)[1:] vb@0: else: inds = 0 vb@0: elif ctype == "quote": vb@0: inds = -1 vb@0: text = obj[1][0] vb@0: m = sq.match(text) vb@0: if m: vb@0: if m.group(1): vb@0: inds = int(m.group(1)) vb@0: text = m.group(2)[1:] vb@0: else: vb@0: if type(text) is unicode or type(text) is str: vb@0: text = u(evalPython(text)) vb@0: vb@0: ind = u"" vb@0: if inds > -1: vb@0: try: vb@0: cmd = evalPython(u"indent(" + u(inds) + u")") vb@0: result, rest = parseLine(u(cmd), _inner, [], True, comment) vb@0: if rest: vb@0: raise SyntaxError() vb@0: ind = _finish(result) vb@0: except: pass vb@0: vb@0: if ctype == "lineQuote": text += u"\n" vb@0: vb@0: hasTextFunc = False vb@0: try: vb@0: ymlFunc["text"] vb@0: hasTextFunc = True vb@0: except: pass vb@0: vb@0: text = executeCmd(text) vb@0: return code(ind + text) vb@0: vb@0: elif ctype == "tagQuote": vb@0: m = tq.match(obj[1]) vb@0: if m.group(1) == "<": vb@0: return code(u"<" + m.group(2)) vb@0: else: vb@0: return code(m.group(2)) vb@0: vb@0: elif ctype == "operator": vb@0: operator.append((re.compile(evalPython(obj[1][0])), obj[1][1])) vb@0: return code(u"") vb@0: vb@0: elif ctype == "constant": vb@0: name = obj[1][0] vb@0: if name[0] == "*": vb@0: name = name[1:] vb@0: value = obj[1][1] vb@0: pointers[name] = value vb@0: return code(u"") vb@0: vb@0: elif ctype == "include": vb@0: reverse = False vb@0: ktext, kxml = False, False vb@0: for arg in obj[1]: vb@0: if type(arg) is tuple or type(arg) is Symbol: vb@0: if arg[0] == "reverse": vb@0: reverse = True vb@0: elif arg[0] == "ktext": vb@0: ktext = True vb@0: elif arg[0] == "kxml": vb@0: kxml = True vb@0: elif type(arg) is unicode or type(arg) is str: vb@0: filemask = arg vb@0: vb@0: if filemask[0] == '/' or filemask[0] == '.': vb@16: files = sorted(glob(filemask)) vb@0: else: vb@0: files = [] vb@0: for directory in includePath: vb@0: path = os.path.join(directory, filemask) vb@16: files.extend(sorted(glob(path))) vb@16: vb@16: if files and reverse: vb@0: files = files[-1::-1] vb@0: vb@0: if not(files): vb@0: if included: vb@0: raise IOError(u"in " + included + ":" + u(line) + u": include file(s) '" + filemask + u"' not found") vb@0: else: vb@0: raise IOError(u"in " + u(line) + u": include file(s) '" + filemask + u"' not found") vb@0: vb@0: includeFile = fileinput.input(files, mode="rU", openhook=fileinput.hook_encoded(encoding)) vb@0: _included = included vb@0: if ktext or kxml: vb@0: text = u"" vb@0: for line in includeFile: vb@0: included = includeFile.filename() vb@0: if kxml: vb@0: if (not line[:6] == '