Edgewall Software

Ticket #115: genshi-textinclude.diff

File genshi-textinclude.diff, 4.3 KB (added by alastair@…, 16 years ago)

Text template language include statement patch

  • genshi/template/directives.py

    diff -u -r Genshi-0.4/genshi/template/directives.py Genshi-0.4-textinclude/genshi/template/directives.py
    old new  
    2424__all__ = ['AttrsDirective', 'ChooseDirective', 'ContentDirective',
    2525           'DefDirective', 'ForDirective', 'IfDirective', 'MatchDirective',
    2626           'OtherwiseDirective', 'ReplaceDirective', 'StripDirective',
    27            'WhenDirective', 'WithDirective']
     27           'WhenDirective', 'WithDirective', 'IncludeDirective']
    2828__docformat__ = 'restructuredtext en'
    2929
    3030
     
    676676
    677677    def __repr__(self):
    678678        return '<%s>' % (self.__class__.__name__)
     679
     680
     681class IncludeDirective(Directive):
     682    """Implementation of the #include template directive for including
     683    template output."""
     684    __slots__ = ['include_ref', 'relative_to', 'loader']
     685
     686    def __init__(self, value, template, namespaces=None, lineno=-1, offset=-1):
     687        Directive.__init__(self, None, template, namespaces, lineno, offset)
     688        self.include_ref = value
     689        self.relative_to = template.filepath
     690        self.loader = template.loader
     691       
     692    def __call__(self, stream, ctxt, directives):
     693        import genshi.template.text
     694        template = self.loader.load(self.include_ref,
     695                                    relative_to=self.relative_to,
     696                                    cls=genshi.template.text.TextTemplate)
     697       
     698        return _apply_directives(template.generate(ctxt),
     699                                 ctxt, directives)
     700    def __repr__(self):
     701        return '<%s "%s">' % (self.__class__.__name__, self.include_ref)
  • genshi/template/tests/text.py

    diff -u -r Genshi-0.4/genshi/template/tests/text.py Genshi-0.4-textinclude/genshi/template/tests/text.py
    old new  
    1313
    1414import doctest
    1515import unittest
     16import shutil
     17import os
     18import tempfile
    1619
    1720from genshi.template.text import TextTemplate
    18 
     21from genshi.template.loader import TemplateLoader
    1922
    2023class TextTemplateTestCase(unittest.TestCase):
    2124    """Tests for text template processing."""
    2225
     26    def setUp(self):
     27        self.dirname = tempfile.mkdtemp(suffix='markup_test')
     28
     29    def tearDown(self):
     30        shutil.rmtree(self.dirname)
     31
    2332    def test_escaping(self):
    2433        tmpl = TextTemplate('\\#escaped')
    2534        self.assertEqual('#escaped', str(tmpl.generate()))
     
    7483
    7584""", tmpl.generate(items=range(3)).render('text'))
    7685
    77 
     86    def test_include(self):
     87        file1 = open(os.path.join(self.dirname, 'tmpl1.txt'), 'w')
     88        try:
     89            file1.write("Included\n")
     90        finally:
     91            file1.close()
     92
     93        file2 = open(os.path.join(self.dirname, 'tmpl2.txt'), 'w')
     94        try:
     95            file2.write("""----- Included data below this line -----
     96            #include tmpl1.txt
     97            ----- Included data above this line -----""")
     98        finally:
     99            file2.close()
     100
     101        loader = TemplateLoader([self.dirname])
     102        tmpl = loader.load('tmpl2.txt', cls=TextTemplate)
     103        self.assertEqual("""----- Included data below this line -----
     104Included
     105            ----- Included data above this line -----""",
     106                         tmpl.generate().render())
     107       
    78108def suite():
    79109    suite = unittest.TestSuite()
    80110    suite.addTest(doctest.DocTestSuite(TextTemplate.__module__))
  • genshi/template/text.py

    diff -u -r Genshi-0.4/genshi/template/text.py Genshi-0.4-textinclude/genshi/template/text.py
    old new  
    9595                    substream = stream[start_offset:]
    9696                    stream[start_offset:] = [(SUB, ([directive], substream),
    9797                                              (self.filepath, lineno, 0))]
     98            elif command == 'include':
     99                pos = (self.filename, lineno, 0)
     100                directive = IncludeDirective, value.strip(), None, pos
     101                stream.append((SUB, ([directive], []), pos))
    98102            elif command != '#':
    99103                cls = self._dir_by_name.get(command)
    100104                if cls is None: