Edgewall Software

Ticket #55: pymatch-expr.diff

File pymatch-expr.diff, 3.3 KB (added by hodgestar+genshi@…, 17 years ago)

Patch against http://svn.edgewall.org/repos/genshi/trunk r466 implements ${} expression handling inside py:match XPath expressions.

  • genshi/template/tests/markup.py

     
    276276        finally:
    277277            shutil.rmtree(dirname)
    278278
     279    def test_dynamic_match(self):
     280        dirname = tempfile.mkdtemp(suffix='genshi_test')
     281        try:
     282            file1 = open(os.path.join(dirname, 'tmpl1.html'), 'w')
     283            try:
     284                file1.write("""<html xmlns:xi="http://www.w3.org/2001/XInclude"
     285                                     xmlns:py="http://genshi.edgewall.org/">
     286                    <span py:match="${xpath}ing">
     287                        Hello ${select('@name')}
     288                    </span>
     289                    <span>Some intervening text.</span>
     290                    <greeting name="Dude" />
     291                </html>""")
     292            finally:
     293                file1.close()
     294
     295            loader = TemplateLoader([dirname])
     296            tmpl = loader.load('tmpl1.html')
     297            self.assertEqual("""<html>
     298                    <span>Some intervening text.</span>
     299                    <span>
     300                        Hello Dude
     301                    </span>
     302                </html>""", tmpl.generate(xpath='greet').render())
     303        finally:
     304            shutil.rmtree(dirname)
     305
    279306    def test_fallback_when_include_found(self):
    280307        dirname = tempfile.mkdtemp(suffix='genshi_test')
    281308        try:
  • genshi/template/directives.py

     
    1818from genshi.core import Attrs, Stream
    1919from genshi.path import Path
    2020from genshi.template.core import TemplateRuntimeError, TemplateSyntaxError, \
    21                                  EXPR, _apply_directives
     21                                 EXPR, _apply_directives, Template
    2222from genshi.template.eval import Expression, _parse
    2323
    2424__all__ = ['AttrsDirective', 'ChooseDirective', 'ContentDirective',
     
    393393      </span>
    394394    </div>
    395395    """
    396     __slots__ = ['path', 'namespaces']
     396    __slots__ = ['pathlist', 'namespaces', 'filename', 'lineno']
    397397
    398398    ATTRIBUTE = 'path'
    399399
    400400    def __init__(self, value, namespaces=None, filename=None, lineno=-1,
    401401                 offset=-1):
    402402        Directive.__init__(self, None, namespaces, filename, lineno, offset)
    403         self.path = Path(value, filename, lineno)
     403        self.filename = filename
     404        self.lineno = lineno
     405        self.pathlist = list(Template._interpolate(value, None, filename, lineno, offset))
    404406        self.namespaces = namespaces or {}
    405407
    406408    def __call__(self, stream, ctxt, directives):
    407         ctxt._match_templates.append((self.path.test(ignore_context=True),
    408                                       self.path, list(stream), self.namespaces,
     409        path_value = "".join([(kind is EXPR) and data.evaluate(ctxt) or data for (kind, data, pos) in self.pathlist])
     410        path = Path(path_value, self.filename, self.lineno)
     411        ctxt._match_templates.append((path.test(ignore_context=True),
     412                                      path, list(stream), self.namespaces,
    409413                                      directives))
    410414        return []
    411415