Edgewall Software

Ticket #186: ticket186.diff

File ticket186.diff, 2.9 KB (added by cmlenz, 7 years ago)

Potential fix

  • genshi/template/tests/directives.py

     
    631631          </body> 
    632632        </html>""", str(tmpl.generate())) 
    633633 
     634    def test_recursive_match_3(self): 
     635        tmpl = MarkupTemplate("""<test xmlns:py="http://genshi.edgewall.org/"> 
     636          <py:match path="b[@type='bullet']"> 
     637            <bullet>${select('*|text()')}</bullet> 
     638          </py:match> 
     639          <py:match path="group[@type='bullet']"> 
     640            <ul>${select('*')}</ul> 
     641          </py:match> 
     642          <py:match path="b"> 
     643            <generic>${select('*|text()')}</generic> 
     644          </py:match> 
     645 
     646          <b> 
     647            <group type="bullet"> 
     648              <b type="bullet">1</b> 
     649              <b type="bullet">2</b> 
     650            </group> 
     651          </b> 
     652        </test> 
     653        """) 
     654        self.assertEqual("""<test> 
     655            <generic> 
     656            <ul><bullet>1</bullet><bullet>2</bullet></ul> 
     657          </generic> 
     658        </test>""", str(tmpl.generate())) 
     659 
    634660    def test_not_match_self(self): 
    635661        """ 
    636662        See http://genshi.edgewall.org/ticket/77 
  • genshi/template/markup.py

     
    272272                    # Consume and store all events until an end event 
    273273                    # corresponding to this start event is encountered 
    274274                    inner = _strip(stream) 
    275                     if 'match_once' not in hints \ 
    276                             and 'not_recursive' not in hints: 
    277                         inner = self._match(inner, ctxt, [match_templates[idx]]) 
     275                    pre_match_templates = match_templates[:idx + 1] 
     276                    if 'match_once' not in hints and 'not_recursive' in hints: 
     277                        pre_match_templates.pop() 
     278                    inner = self._match(inner, ctxt, pre_match_templates) 
    278279                    content = list(self._include(chain([event], inner, tail), 
    279280                                                 ctxt)) 
    280281 
     
    290291                    # Recursively process the output 
    291292                    template = _apply_directives(template, ctxt, directives) 
    292293                    remaining = match_templates 
    293                     if 'match_once' not in hints: 
    294                         remaining = remaining[:idx] + remaining[idx + 1:] 
    295294                    for event in self._match(self._exec( 
    296295                                    self._eval(self._flatten(template, ctxt), 
    297                                     ctxt), ctxt), ctxt, remaining): 
     296                                    ctxt), ctxt), ctxt, match_templates[idx + 1:]): 
    298297                        yield event 
    299298 
    300299                    ctxt.pop()