Ticket #2138: wiki_engine_state_in_WikiSystem.patch
| File wiki_engine_state_in_WikiSystem.patch, 6.7 KB (added by cboos, 7 years ago) |
|---|
-
trac/wiki/api.py
23 23 import dummy_threading as threading 24 24 import time 25 25 import urllib 26 import re 26 27 27 28 from trac.core import * 28 29 from trac.util import to_utf8, TRUE … … 81 82 self._index = None 82 83 self._last_index_update = 0 83 84 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 84 89 85 90 def _update_index(self): 86 91 self._index_lock.acquire() … … 116 121 self._update_index() 117 122 return self._index.has_key(pagename) 118 123 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 119 170 # IWikiChangeListener methods 120 171 121 172 def wiki_page_added(self, page): -
trac/wiki/formatter.py
19 19 from __future__ import generators 20 20 import re 21 21 import os 22 import string23 22 import urllib 24 23 25 24 try: … … 136 135 class Formatter(object): 137 136 flavor = 'default' 138 137 139 _link_resolvers = None140 138 # Rules provided by IWikiSyntaxProviders are inserted between pre_rules and post_rules 141 139 _pre_rules = [r"(?P<bolditalic>%s)" % BOLDITALIC_TOKEN, 142 140 r"(?P<bold>%s)" % BOLD_TOKEN, … … 165 163 r"(?P<last_table_cell>\|\|\s*$)", 166 164 r"(?P<table_cell>\|\|)"] 167 165 168 _compiled_rules = None169 _helper_patterns = None170 _external_handlers = None171 166 _processor_re = re.compile('#\!([\w+-][\w+-/]*)') 172 167 _anchor_re = re.compile('[^\w\d\.-:]+', re.UNICODE) 173 168 … … 194 189 db = property(fget=_get_db) 195 190 196 191 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 217 193 rules = property(_get_rules) 218 194 219 195 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 228 197 link_resolvers = property(_get_link_resolvers) 229 198 230 199 def replace(self, fullmatch): 200 wiki = WikiSystem(self.env) 231 201 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: 233 203 # Check for preceding escape character '!' 234 204 if match[0] == '!': 235 205 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) 238 208 else: 239 209 return getattr(self, '_' + itype + '_formatter')(match, fullmatch) 240 210 … … 308 278 309 279 def _make_link(self, ns, target, match, label): 310 280 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) 312 282 elif target.startswith('//') or ns == "mailto": 313 283 return self._make_ext_link(ns+':'+target, label) 314 284 else: … … 342 312 if match[0] == '!': 343 313 return match[1:] 344 314 else: 345 return self.simple_tag_handler('<span class="underline">', '</span>') 315 return self.simple_tag_handler('<span class="underline">', 316 '</span>') 346 317 347 318 def _strike_formatter(self, match, fullmatch): 348 319 if match[0] == '!':
