Ticket #264: irequestfilter-2.diff

File irequestfilter-2.diff, 3.3 kB (added by mrenzmann@otaku42.de, 6 years ago)

Revised version of the IRequestFilter patch

  • tracnav/tracnav.py

    old new  
    6262from trac.core import Component, implements 
    6363from trac.wiki.api import WikiSystem, IWikiMacroProvider 
    6464from trac.web.chrome import ITemplateProvider, add_stylesheet 
     65from trac.web.main import IRequestFilter, RequestDispatcher 
    6566from trac.wiki.model import WikiPage 
    6667from trac.wiki.formatter import Formatter, OneLinerFormatter 
    6768from StringIO import StringIO 
     
    7172LISTRULE = re.compile(r"^(?P<indent>[ \t\v]+)\* +(?P<rest>.*)$", re.M) 
    7273ALLOWED_MACROS = ["image"] 
    7374 
     75class PseudoRequest(object): 
     76    args = None 
     77    hdf = None 
     78    authname = None 
     79    perm = None 
     80    session = None 
     81    path_info = None 
     82     
     83    def __init__(self, path): 
     84        self.path_info = path 
    7485 
    7586class TocFormatter(OneLinerFormatter): 
    7687    """ 
     
    115126 
    116127        #save for later use 
    117128        self.env = env 
     129        self.config = env.config 
    118130        self.req = req 
    119131        self.out = out 
    120132        self.col = 0 
     
    223235        self.write('<h2><a href="%s">TracNav</a> menu</h2>\n' % TRACNAVHOME) 
    224236 
    225237        # add TOCs 
    226         for name in (self.names or ["TOC"]): 
     238        tocpages = self.config.get('tracnav', 'tocpages', 'TOC').split(',') 
     239        for name in (self.names or tocpages): 
    227240            toc = self.parse_toc(self.get_toc(name)) 
    228241            if not toc: 
    229242                toc = self.parse_toc(' * TOC "%s" is empty!' % name) 
     
    292305 
    293306class TracNav(Component): 
    294307 
    295     implements(IWikiMacroProvider, ITemplateProvider
     308    implements(IWikiMacroProvider, ITemplateProvider, IRequestFilter
    296309 
     310    # IWikiMacroProvider methods 
    297311    def get_macros(self): 
    298312        yield 'TracNav' 
    299313        yield 'JPNav' # legacy 
     
    307321        from inspect import getdoc, getmodule 
    308322        return getdoc(getmodule(self)) 
    309323 
     324 
     325    # ITemplateProvider methods 
    310326    def get_htdocs_dirs(self): 
    311327        from pkg_resources import resource_filename 
    312328        return [('tracnav', resource_filename(__name__, 'htdocs'))] 
     
    314330    def get_templates_dirs(self): 
    315331        # we don't provide templates 
    316332        return [] 
     333 
     334 
     335    # IRequestFilter methods 
     336    def pre_process_request(self, req, handler): 
     337        return handler 
     338 
     339    def post_process_request(self, req, template, content_type): 
     340        status = self.config.get('tracnav', 'request_filter', 'disabled') 
     341        if status == 'enabled': 
     342            paths = self.config.get('tracnav', 'match', '').split(',') 
     343 
     344            if req.path_info == '/': 
     345                dispatcher = RequestDispatcher(self.env) 
     346                default_handler = dispatcher.default_handler 
     347 
     348                for path in paths: 
     349                    pseudo_req = PseudoRequest(path) 
     350                    if default_handler.match_request(pseudo_req): 
     351                        self._do_post_process(req) 
     352                        break 
     353            else: 
     354                for path in paths: 
     355                    if req.path_info.startswith(path): 
     356                        self._do_post_process(req) 
     357                        break 
     358 
     359        return template, content_type 
     360 
     361    def _do_post_process(self, req): 
     362        out = StringIO() 
     363        Invocation(self.env, req, '', out).run() 
     364        req.hdf.setValue('tracnavplugin.toc', out.getvalue())