Edgewall Software

Ticket #2138: wiki_engine_state_in_WikiSystem.patch

File wiki_engine_state_in_WikiSystem.patch, 6.7 KB (added by cboos, 7 years ago)

Fix the issue by taking the approach already implemented in InterTrac

  • trac/wiki/api.py

     
    2323    import dummy_threading as threading 
    2424import time 
    2525import urllib 
     26import re 
    2627 
    2728from trac.core import * 
    2829from trac.util import to_utf8, TRUE 
     
    8182        self._index = None 
    8283        self._last_index_update = 0 
    8384        self._index_lock = threading.RLock() 
     85        self._compiled_rules = None 
     86        self._link_resolvers = None 
     87        self._helper_patterns = None 
     88        self._external_handlers = None 
    8489 
    8590    def _update_index(self): 
    8691        self._index_lock.acquire() 
     
    116121        self._update_index() 
    117122        return self._index.has_key(pagename) 
    118123 
     124    def _get_rules(self): 
     125        self._prepare_rules() 
     126        return self._compiled_rules 
     127    rules = property(_get_rules) 
     128 
     129    def _get_helper_patterns(self): 
     130        self._prepare_rules() 
     131        return self._helper_patterns 
     132    helper_patterns = property(_get_helper_patterns) 
     133 
     134    def _get_external_handlers(self): 
     135        self._prepare_rules() 
     136        return self._external_handlers 
     137    external_handlers = property(_get_external_handlers) 
     138     
     139    def _prepare_rules(self): 
     140        from trac.wiki.formatter import Formatter 
     141        if not self._compiled_rules: 
     142            helpers = [] 
     143            handlers = {} 
     144            syntax = Formatter._pre_rules[:] 
     145            i = 0 
     146            for resolver in self.syntax_providers: 
     147                for regexp, handler in resolver.get_wiki_syntax(): 
     148                    handlers['i'+str(i)] = handler 
     149                    syntax.append('(?P<i%d>%s)' % (i, regexp)) 
     150                    i += 1 
     151            syntax += Formatter._post_rules[:] 
     152            helper_re = re.compile(r'\?P<([a-z\d_]+)>') 
     153            for rule in syntax: 
     154                helpers += helper_re.findall(rule)[1:] 
     155            rules = re.compile('(?:' + '|'.join(syntax) + ')') 
     156            self._external_handlers = handlers 
     157            self._helper_patterns = helpers 
     158            self._compiled_rules = rules 
     159 
     160    def _get_link_resolvers(self): 
     161        if not self._link_resolvers: 
     162            resolvers = {} 
     163            for resolver in self.syntax_providers: 
     164                for namespace, handler in resolver.get_link_resolvers(): 
     165                    resolvers[namespace] = handler 
     166            self._link_resolvers = resolvers 
     167        return self._link_resolvers 
     168    link_resolvers = property(_get_link_resolvers) 
     169 
    119170    # IWikiChangeListener methods 
    120171 
    121172    def wiki_page_added(self, page): 
  • trac/wiki/formatter.py

     
    1919from __future__ import generators 
    2020import re 
    2121import os 
    22 import string 
    2322import urllib 
    2423 
    2524try: 
     
    136135class Formatter(object): 
    137136    flavor = 'default' 
    138137 
    139     _link_resolvers = None 
    140138    # Rules provided by IWikiSyntaxProviders are inserted between pre_rules and post_rules 
    141139    _pre_rules = [r"(?P<bolditalic>%s)" % BOLDITALIC_TOKEN, 
    142140                  r"(?P<bold>%s)" % BOLD_TOKEN, 
     
    165163                   r"(?P<last_table_cell>\|\|\s*$)", 
    166164                   r"(?P<table_cell>\|\|)"] 
    167165 
    168     _compiled_rules = None 
    169     _helper_patterns = None 
    170     _external_handlers = None 
    171166    _processor_re = re.compile('#\!([\w+-][\w+-/]*)') 
    172167    _anchor_re = re.compile('[^\w\d\.-:]+', re.UNICODE) 
    173168     
     
    194189    db = property(fget=_get_db) 
    195190 
    196191    def _get_rules(self): 
    197         if not Formatter._compiled_rules: 
    198             helpers = [] 
    199             handlers = {} 
    200             syntax = Formatter._pre_rules[:] 
    201             wiki = WikiSystem(self.env) 
    202             i = 0 
    203             for resolver in wiki.syntax_providers: 
    204                 for regexp, handler in resolver.get_wiki_syntax(): 
    205                     handlers['i'+str(i)] = handler 
    206                     syntax.append('(?P<i%d>%s)' % (i, regexp)) 
    207                     i += 1 
    208             syntax += Formatter._post_rules[:] 
    209             helper_re = re.compile(r'\?P<([a-z\d]+)>') 
    210             for rule in syntax: 
    211                 helpers += helper_re.findall(rule)[1:] 
    212             rules = re.compile('(?:' + string.join(syntax, '|') + ')') 
    213             Formatter._external_handlers = handlers 
    214             Formatter._helper_patterns = helpers 
    215             Formatter._compiled_rules = rules 
    216         return Formatter._compiled_rules 
     192        return WikiSystem(self.env).rules 
    217193    rules = property(_get_rules) 
    218194 
    219195    def _get_link_resolvers(self): 
    220         if not self._link_resolvers: 
    221             resolvers = {} 
    222             wiki = WikiSystem(self.env) 
    223             for resolver in wiki.syntax_providers: 
    224                 for namespace, handler in resolver.get_link_resolvers(): 
    225                     resolvers[namespace] = handler 
    226             self._link_resolvers = resolvers 
    227         return self._link_resolvers 
     196        return WikiSystem(self.env).link_resolvers 
    228197    link_resolvers = property(_get_link_resolvers) 
    229198 
    230199    def replace(self, fullmatch): 
     200        wiki = WikiSystem(self.env)         
    231201        for itype, match in fullmatch.groupdict().items(): 
    232             if match and not itype in Formatter._helper_patterns: 
     202            if match and not itype in wiki.helper_patterns: 
    233203                # Check for preceding escape character '!' 
    234204                if match[0] == '!': 
    235205                    return match[1:] 
    236                 if itype in self._external_handlers: 
    237                     return self._external_handlers[itype](self, match, fullmatch) 
     206                if itype in wiki.external_handlers: 
     207                    return wiki.external_handlers[itype](self, match, fullmatch) 
    238208                else: 
    239209                    return getattr(self, '_' + itype + '_formatter')(match, fullmatch) 
    240210 
     
    308278 
    309279    def _make_link(self, ns, target, match, label): 
    310280        if ns in self.link_resolvers: 
    311             return self._link_resolvers[ns](self, ns, target, label) 
     281            return self.link_resolvers[ns](self, ns, target, label) 
    312282        elif target.startswith('//') or ns == "mailto": 
    313283            return self._make_ext_link(ns+':'+target, label) 
    314284        else: 
     
    342312        if match[0] == '!': 
    343313            return match[1:] 
    344314        else: 
    345             return self.simple_tag_handler('<span class="underline">', '</span>') 
     315            return self.simple_tag_handler('<span class="underline">', 
     316                                           '</span>') 
    346317 
    347318    def _strike_formatter(self, match, fullmatch): 
    348319        if match[0] == '!':