예제 #1
0
def compilefile(file, mode=None):
    assert mode in ("html", "xml", None)
    if mode is None:
        ext = os.path.splitext(file)[1]
        if ext.lower() in (".html", ".htm"):
            mode = "html"
        else:
            mode = "xml"
    # make sure we can find the file
    prefix = os.path.dirname(os.path.abspath(__file__)) + os.path.sep
    if (not os.path.exists(file)
            and os.path.exists(os.path.join(prefix, file))):
        file = os.path.join(prefix, file)
    # normalize filenames for test output
    filename = os.path.abspath(file)
    if filename.startswith(prefix):
        filename = filename[len(prefix):]
    filename = filename.replace(os.sep, '/')  # test files expect slashes
    # parse
    from zope.tal.talgenerator import TALGenerator
    if mode == "html":
        from zope.tal.htmltalparser import HTMLTALParser
        p = HTMLTALParser(gen=TALGenerator(source_file=filename, xml=0))
    else:
        from zope.tal.talparser import TALParser
        p = TALParser(gen=TALGenerator(source_file=filename))
    p.parseFile(file)
    return p.getCode()
예제 #2
0
    def _cook(self):
        """Compile the TAL and METAL statments.

        Cooking must not fail due to compilation errors in templates.
        """
        engine = self.pt_getEngine()
        source_file = self.pt_source_file()
        if self.content_type == 'text/html':
            gen = TALGenerator(engine, xml=0, source_file=source_file)
            parser = HTMLTALParser(gen)
        else:
            gen = TALGenerator(engine, source_file=source_file)
            parser = TALParser(gen)

        self._v_errors = ()
        try:
            parser.parseString(self._text)
            self._v_program, self._v_macros = parser.getCode()
        except:
            etype, e = sys.exc_info()[:2]
            self._v_errors = [
                "Compilation failed",
                "%s.%s: %s" % (etype.__module__, etype.__name__, e)
            ]
        self._v_cooked = 1
예제 #3
0
 def emitStartElement(self, name, attrlist, taldict, metaldict, i18ndict,
                      position=(None, None), isend=0):
     metaldict = {}
     taldict = {}
     i18ndict = {}
     if self.enabled and self.repldict:
         taldict["attributes"] = "x x"
     TALGenerator.emitStartElement(self, name, attrlist,
                                   taldict, metaldict, i18ndict,
                                   position, isend)
예제 #4
0
    def cook(cls, source_file, text, engine, content_type):
        if content_type == 'text/html':
            gen = TALGenerator(engine, xml=0, source_file=source_file)
            parser = HTMLTALParser(gen)
        else:
            gen = TALGenerator(engine, source_file=source_file)
            parser = TALParser(gen)

        parser.parseString(text)
        program, macros = parser.getCode()

        return cls(program), macros
예제 #5
0
 def emitStartElement(self,
                      name,
                      attrlist,
                      taldict,
                      metaldict,
                      i18ndict,
                      position=(None, None),
                      isend=0):
     metaldict = {}
     taldict = {}
     i18ndict = {}
     if self.enabled and self.repldict:
         taldict["attributes"] = "x x"
     TALGenerator.emitStartElement(self, name, attrlist, taldict, metaldict,
                                   i18ndict, position, isend)
예제 #6
0
def talEval(expression, context, extra=None):
    """
    Perform a TAL eval on the expression.
    """
    # First, account for the possibility that it is merely TALES; if there are
    # no <tal> in it at all (nor the ${python:} you can do with this function),
    # just send it to talesEval
    isTales = '<tal' not in expression and '${python:' not in expression
    if isTales:
        return talesEvalStr(expression, context, extra)

    # Next, as a convenience, replace all ${} blocks that aren't inside a <tal>
    # with <tal:block content="..."/> equivalent
    chunks = TAG.split(expression)
    modified = []
    for chunk in chunks:
        if chunk.startswith('<tal'):
            modified.append(chunk)
        else:
            modified.append(TPLBLOCK.sub(_chunk_repl, chunk))
    expression = ''.join(modified)

    # Finally, compile the expression and apply context
    gen = TALGenerator(Engine, xml=0)
    parser = HTMLTALParser(gen)
    parser.parseString(expression)
    program, macros = parser.getCode()
    output = cStringIO.StringIO()
    context = Engine.getContext(context)
    TALInterpreter(program, macros, context, output, tal=True)()
    return output.getvalue()
예제 #7
0
 def __call__(self, value, *args, **kw):
     gen = TALGenerator(getEngine(), xml=1, source_file=None)
     parser = HTMLTALParser(gen)
     try:
         parser.parseString(value)
     except Exception, err:
         return ("Validation Failed(%s): \n %s" % (self.name, err))
예제 #8
0
 def __init__(self, gen=None, encoding=None):  # Override
     XMLParser.__init__(self, encoding)
     if gen is None:
         gen = TALGenerator()
     self.gen = gen
     self.nsStack = []
     self.nsDict = {XML_NS: 'xml'}
     self.nsNew = []
예제 #9
0
 def __init__(self, gen=None):
     HTMLParser.__init__(self)
     if gen is None:
         gen = TALGenerator(xml=0)
     self.gen = gen
     self.tagstack = []
     self.nsstack = []
     self.nsdict = {'tal': ZOPE_TAL_NS,
                    'metal': ZOPE_METAL_NS,
                    'i18n': ZOPE_I18N_NS,
                    }
예제 #10
0
 def __init__(self, gen=None, encoding=None):  # Override
     """
     :keyword TALGenerator gen: The configured (with an expression compiler)
         code generator to use. If one is not given, a default will be used.
     """
     XMLParser.__init__(self, encoding)
     if gen is None:
         gen = TALGenerator()
     self.gen = gen
     self.nsStack = []
     self.nsDict = {XML_NS: 'xml'}
     self.nsNew = []
예제 #11
0
def compilefile(file, mode=None):
    assert mode in ("html", "xml", None)
    if mode is None:
        ext = os.path.splitext(file)[1]
        if ext.lower() in (".html", ".htm"):
            mode = "html"
        else:
            mode = "xml"
    from zope.tal.talgenerator import TALGenerator
    filename = os.path.abspath(file)
    prefix = os.path.dirname(os.path.abspath(__file__)) + os.path.sep
    if filename.startswith(prefix):
        filename = filename[len(prefix):]
    filename = filename.replace(os.sep, '/')  # test files expect slashes
    if mode == "html":
        from zope.tal.htmltalparser import HTMLTALParser
        p = HTMLTALParser(gen=TALGenerator(source_file=filename, xml=0))
    else:
        from zope.tal.talparser import TALParser
        p = TALParser(gen=TALGenerator(source_file=filename))
    p.parseFile(file)
    return p.getCode()
예제 #12
0
 def __init__(self, gen=None):
     """
     :keyword TALGenerator gen: The configured (with an expression compiler)
         code generator to use. If one is not given, a default will be used.
     """
     HTMLParser.__init__(self, **_html_parser_extras)
     if gen is None:
         gen = TALGenerator(xml=0)
     self.gen = gen
     self.tagstack = []
     self.nsstack = []
     self.nsdict = {
         'tal': ZOPE_TAL_NS,
         'metal': ZOPE_METAL_NS,
         'i18n': ZOPE_I18N_NS,
     }
예제 #13
0
def findStaticTranslationText(page_template, func_name_list):
  def iterate(node, target_name, function):
    if isinstance(node, list):
      for i in node:
        iterate(i, target_name, function)
    elif isinstance(node, tuple) and node:
      if node[0]==target_name:
        function(node)
      else:
        for i in node[1:]:
          iterate(i, target_name, function)

  text_dict = {}
  def addText(node):
    if len(node)!=2:
      node = (node[0], node[1:])
    program = [node]
    macros = {}
    engine = MyDummyEngine(macros)
    output = StringIO()
    interpreter = MyDummyTALInterpreter(program, macros, engine, output)
    interpreter()
    if interpreter._i18n_message_id_dict is not None:
      text_dict.update(interpreter._i18n_message_id_dict)

  def addTextFromPythonExpression(node):
    if node[0]=='insertText':
      tal_expression = node[1]
      if isinstance(tal_expression, (tuple, list)):
        tal_expression = tal_expression[0]
    elif node[0] in ('setLocal', 'setGlobal'):
      if len(node)==2:
        tal_expression = node[1][1]
      elif len(node)==3:
        tal_expression = node[2]
      else:
        return
    else:
      return
    tal_expression = tal_expression[1:-1]
    match = name_match(tal_expression)
    if match:
      type_, expression = match.group(1, 2)
      if type_=='python':
        # clean up expression
        expression = expression.strip()
        expression = expression.replace('\n', ' ')
        Base_getFunctionFirstArgumentValue = page_template.Base_getFunctionFirstArgumentValue
        for func_name in func_name_list:
          for message in Base_getFunctionFirstArgumentValue(func_name, expression):
            text_dict[message] = None

  if page_template.html():
    generator = TALGenerator(xml=0)
    parser = HTMLTALParser(generator)
  else:
    generator = TALGenerator(xml=1)
    parser = TALParser(generator)
  parser.parseString(page_template._text)
  iterate(parser.gen.program, 'insertTranslation', addText)
  iterate(parser.gen.program, 'insertText', addTextFromPythonExpression)
  iterate(parser.gen.program, 'setLocal', addTextFromPythonExpression)
  iterate(parser.gen.program, 'setGlobal', addTextFromPythonExpression)
  return text_dict.keys()
예제 #14
0
 def replaceAttrs(self, attrlist, repldict):
     if self.enabled and self.repldict:
         repldict = self.repldict
         self.repldict = None
     return TALGenerator.replaceAttrs(self, attrlist, repldict)
예제 #15
0
 def emit(self, *args):
     if self.enabled:
         TALGenerator.emit(self, *args)
예제 #16
0
 def __init__(self, repldict, expressionCompiler=None, xml=0):
     self.repldict = repldict
     self.enabled = 1
     TALGenerator.__init__(self, expressionCompiler, xml)
예제 #17
0
 def replaceAttrs(self, attrlist, repldict):
     if self.enabled and self.repldict:
         repldict = self.repldict
         self.repldict = None
     return TALGenerator.replaceAttrs(self, attrlist, repldict)
예제 #18
0
 def emit(self, *args):
     if self.enabled:
         TALGenerator.emit(self, *args)
예제 #19
0
 def __init__(self, repldict, expressionCompiler=None, xml=0):
     self.repldict = repldict
     self.enabled = 1
     TALGenerator.__init__(self, expressionCompiler, xml)
 def _compile(self, source, source_file=None):
     generator = TALGenerator(xml=0, source_file=source_file)
     parser = HTMLTALParser(generator)
     parser.parseString(source)
     program, macros = parser.getCode()
     return program, macros
예제 #21
0
 def parse(self, eng, s, fn):
     gen = TALGenerator(expressionCompiler=eng, xml=0, source_file=fn)
     parser = HTMLTALParser(gen)
     parser.parseString(s)
     program, macros = parser.getCode()
     return program, macros