################################################## # SPYCE - Python-based HTML Scripting # Copyright (c) 2002 Rimon Barr. # # Refer to spyce.py ################################################## from spyceModule import spyceModule import re import spyce, spyceUtil __doc__ = """Include module is used to assist the inclusion of abitrary elements/files into a Spyce file. It can also support the notion of an 'inclusion context'.""" class include(spyceModule): def start(self): self.context = None self.vars = None def spyce(self, url, context=None): "Include a Spyce file" spyce.DEBUG('including ' + url) if len(self._api.getStack()) >= spyce.MAX_STACK: raise 'Maximum stack depth exceeded! (infinite include loop?)' filename = spyceUtil.url2file(url, self._api.getFilename()) result = s = code = None try: code = self._api.spyceFile(filename) s = code.newWrapper() modules = self._api.getModules() for name in modules.keys(): s.setModule(name, modules[name]) # include module as well! s.spyceInit(self._api.getRequest(), self._api.getResponse()) incmod = s._startModule('include', None, None, 1) incmod.context = context if type(context)==type({}): incmod.vars = spyceVars(context) self._api.getStack().append(filename) result = s.spyceProcess() self._api.getStack().pop() finally: if s: s.spyceDestroy() code.returnWrapper(s) return result def spyceStr(self, url, context=None): stdout = self._api.getModule('stdout') stdout.push() try: result = self.spyce(url, context) finally: output = stdout.pop() return output def dump(self, file, binary=0): "Include a plain text file, verbatim" file = os.path.join(os.path.dirname(self._api.getFilename()), file) f = None try: if binary: mode='rb' else: mode='r' f = open(file, mode) buf = f.read() finally: if f: f.close() return buf def spycecode(self, url=None, string=None, html=None, code=None, eval=None, directive=None, comment=None, tag=None): "Emit formatted Spyce code" if not html: html = ('', '') if not code: code = ('', '') if not eval: eval = ('', '') if not directive: directive = ('', '') if not comment: comment = ('', '') if not tag: tag = ('', '') import spyceCompile from StringIO import StringIO if (url and string) or (not url and not string): raise 'must specify either url or string, and not both' if url: f = None try: filename = spyceUtil.url2file(url, self._api.getFilename()) f = open(filename, 'r') string = f.read() finally: if f: f.close() html_encode = self._api.getModule('transform').html_encode try: tokens = spyceCompile.spyceTokenize(string) buf = StringIO() markupstack = [] buf.write(html[0]); markupstack.append(html[1]) for type, text, _, _ in tokens: if type == spyceCompile.T_TEXT: while True: m = spyceCompile.RE_LIB_TAG.search(text) if not m: buf.write(html_encode(text)) break pre = text[:m.start()] post = text[m.end():] buf.write(html_encode(pre)) buf.write(tag[0]) buf.write(html_encode(m.group(0))) buf.write(tag[1]) text = post continue if type in (spyceCompile.T_STMT, spyceCompile.T_CHUNK, spyceCompile.T_CHUNKC,): buf.write(code[0]); markupstack.append(code[1]) elif type in (spyceCompile.T_LAMBDA,): buf.write(html[0]); markupstack.append(html[1]) elif type in (spyceCompile.T_EVAL,): buf.write(eval[0]); markupstack.append(eval[1]) elif type in (spyceCompile.T_DIRECT,): buf.write(directive[0]); markupstack.append(directive[1]) elif type in (spyceCompile.T_CMNT,): buf.write(comment[0]); markupstack.append(comment[1]) buf.write(html_encode(text)) if type in (spyceCompile.T_END_CMNT, spyceCompile.T_END,): buf.write(markupstack.pop()) while markupstack: buf.write(markupstack.pop()) return buf.getvalue() except: raise raise 'error tokenizing!' class spyceVars: def __init__(self, vars): self.__dict__['vars'] = vars def __getattr__(self, name): try: return self.__dict__['vars'][name] except KeyError: raise AttributeError def __setattr__(self, name, value): self.__dict__['vars'][name] = value