Changeset 3702

Show
Ignore:
Timestamp:
05/20/08 14:08:33 (8 months ago)
Author:
JasonWinnebeck
Message:

Closes #3047, rewritten to use IRequestFilter API, probably is more efficient now

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • showpathplugin/0.11/ShowPath.py

    r3699 r3702  
    1 # -*- coding: utf-8 -*- 
     1from trac.web.api import IRequestFilter 
     2from trac.web.chrome import * 
     3from trac.core import * 
     4 
     5from genshi.builder import tag 
    26 
    37""" 
     
    1923specifies the character to use in the path display: 
    2024    [showpath] 
    21     sep_character = ยป 
     25    sep_character = . 
    2226The default is a forward slash (/); note that no matter what character 
    2327is specified, it will always be rendered with a single space on 
     
    3135""" 
    3236 
    33 from pprint import pprint, pformat 
    34  
    35 from trac.core import * 
    36 #from trac.ticket.query import TicketQueryMacro 
    37 #from trac.wiki.macros import WikiMacroBase 
    38 from trac.wiki.api import parse_args 
    39 from trac.web import IRequestHandler, IRequestFilter, ITemplateStreamFilter 
    40  
    41 ## genshi imports (genshi.filters.Transformer requires Genshi 0.5+) 
    42 ##  http://genshi.edgewall.org/ 
    43 from genshi.builder import tag 
    44 from genshi.filters import Transformer 
    45 from genshi.core import TEXT 
    46 from genshi.input import HTML 
    47  
    4837_DEFAULT_SEP = '/' 
    4938 
    5039class ShowPath(Component): 
    51     implements(ITemplateStreamFilter) 
     40    implements(IRequestFilter) 
    5241 
    5342    def __init__(self, *args, **kwargs): 
     
    5948            self.sep_character = _DEFAULT_SEP 
    6049        self.sep_character = self.sep_character[0] 
    61              
    6250 
    63     # ITemplateStreamFilter methods 
    64      
    65     def filter_stream(self, req, method, filename, stream, data): 
    66         href = self.env.href 
     51    # IRequestFilter methods 
     52 
     53    def post_process_request(self, req, template, data, content_type): 
    6754        page_path = req.args.get('page',None) 
    6855        if not page_path or page_path == 'WikiStart': 
    69             return stream 
     56            return template, data, content_type 
     57 
     58        href = req.href 
     59        nav = req.chrome['ctxtnav'] 
     60        wikiStartIndex = None 
     61        for i, elm in enumerate( nav ): 
     62            if elm.tag == 'a' and elm.attrib.get('href') == href.wiki('WikiStart'): 
     63                wikiStartIndex = i 
     64                break 
     65 
     66        if wikiStartIndex is None: 
     67            return template, data, content_type 
    7068 
    7169        page_paths = page_path.split('/') 
     
    9795                #  ..so no sep char appended 
    9896                r += tag(text) 
    99                  
    100         # http://genshi.edgewall.org/wiki/GenshiRecipes/HtmlTransform 
    101         # http://genshi.edgewall.org/browser/trunk/genshi/filters/transform.py 
    102         t1 = Transformer( 
    103             "//div[@id='ctxtnav']//a[contains(@href,'%s')]" % href.wiki('WikiStart')) \ 
    104                 .replace(r) 
    105         stream |= t1 
    106         return stream 
     97 
     98        nav[i] = r 
     99 
     100        print r 
     101        return template, data, content_type 
     102 
     103    def pre_process_request(self, req, handler): 
     104        return handler