Changeset 101
- Timestamp:
- 08/13/05 05:26:09 (3 years ago)
- Files:
-
- generallinksyntaxplugin/trunk/GeneralLinkSyntax (modified) (1 prop)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/api.py (moved) (moved from generallinksyntaxplugin/trunk/GeneralLinkSyntax/GeneralLinkSyntax.py) (5 diffs)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/htdocs (added)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/htdocs/css (added)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/htdocs/css/admin_link.css (added)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/__init__.py (modified) (1 diff)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/model.py (added)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/templates (added)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/templates/admin_link.cs (added)
- generallinksyntaxplugin/trunk/GeneralLinkSyntax/web_ui.py (added)
- generallinksyntaxplugin/trunk/setup.py (modified) (1 diff)
- generallinksyntaxplugin/trunk/TracGeneralLink.egg-info (moved) (moved from generallinksyntaxplugin/trunk/GeneralLinkSyntax.egg-info)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
generallinksyntaxplugin/trunk/GeneralLinkSyntax
- Property svn:ignore set to
*.pyc
- Property svn:ignore set to
generallinksyntaxplugin/trunk/GeneralLinkSyntax/api.py
r100 r101 26 26 import re 27 27 from trac.core import * 28 from trac.util import TracError 28 29 from trac.util import escape 29 30 from trac.wiki import IWikiSyntaxProvider 30 31 32 from model import LinkInfo 31 33 32 34 class GeneralLinkSyntaxProvider(Component): 35 """Provides 'link:' syntax which is expanded to user defined links. 36 """ 33 37 implements(IWikiSyntaxProvider) 34 38 … … 43 47 # ... 44 48 45 # _link_info is hash of name to (dispname, url) 46 _link_info = {} 47 # _expose_names are string array to be exposed 48 _exposed_names = [] 49 # _links is hash of name to LinkInfo 50 _links = {} 49 51 50 52 _common_ns = 'link' … … 56 58 self._load_config() 57 59 58 # utilities 59 def _get_config(self, name, default=None): 60 return self.config.get(self._config_section, name, default) 60 # private config operations 61 def _get_config(self, key, default=None): 62 return self.config.get(self._config_section, key, default) 63 64 def _set_config(self, key, value): 65 self.config.set(self._config_section, key, value) 66 67 def _remove_config(self, key): 68 self.config.remove(self._config_section, key) 61 69 62 70 def _load_config(self): 63 self._link_info = {} 64 self._exposed_names = [] 65 names = self._get_config('names', '') 66 if len(names) == 0: 67 return # no entry 68 for name in names.split(','): 71 self._links = {} 72 exposes = {} 73 for name in self._get_config('expose').split(','): 74 name = name.strip() 75 if name == '': 76 continue 77 exposes[name] = True 78 79 for name in self._get_config('names', '').split(','): 80 name = name.strip() 81 if name == '': 82 continue 69 83 disp = self._get_config(name + self._disp_suffix, name) 70 84 url = self._get_config(name + self._url_suffix) 71 85 if not url: 72 raise Exception("No URL defined for '%s'" % name) 73 self.log.debug('Adding link: %s = (%s, %s)' % (name, disp, url)) 74 self._link_info[name] = (disp, url) 75 names = self._get_config('expose') 76 if names: 77 self._exposed_names = [name.strip() for name in names.split(',')] 78 86 raise TracError("No URL defined for '%s'" % name) 87 expose = exposes.has_key(name) 88 try: 89 self._internal_add(LinkInfo(name, expose, disp, url)) 90 except TracError, e: 91 self.log.debug('LinkInfo Error: ' + str(e)) 92 93 # private util 94 95 def _change_link(self, name, expose, disp, url): 96 # validate 97 if not name: 98 raise TracError('name must be specified.') 99 # delete? 100 if expose == None: 101 info = self._links.pop(name) 102 # clean config 103 self._remove_config(info.name + '_disp') 104 self._remove_config(info.name + '_url') 105 else: 106 # new object with error check 107 info = LinkInfo(name, expose, disp, url) 108 self._links[name] = info 109 self._set_config(info.name + '_disp', info.disp) 110 self._set_config(info.name + '_url', info.url) 111 112 # update 'names' and 'expose' 113 names = [n for n in self._links] 114 expose = [n for n in names if self._links[n].expose] 115 self._set_config('names', ', '.join(names)) 116 self._set_config('expose', ', '.join(expose)) 117 self.config.save() 118 self.log.debug('config is updated.') 119 120 121 # API 122 123 def get_links(self): 124 """Return sorted link info""" 125 names = [n for n in self._links] 126 names.sort() 127 return [self._links[n] for n in names] 128 129 def get_link(self, name): 130 if self._links.has_key(name): 131 return self._links[name] 132 else: 133 None 134 135 def has_name(self, name): 136 return self._links.has_key(name) 137 138 def _internal_add(self, info): 139 if self._links.has_key(info.name): 140 raise TracError('Already exist: ' + info.name) 141 self.log.debug('Adding link: %s = (%s, %s, %s)' % \ 142 (info.name, info.expose, info.disp, info.url)) 143 self._links[info.name] = info; 144 145 def add(self, name, expose, disp, url): 146 # validate 147 if self._links.has_key(name): 148 raise TracError("Link is already exist: '%s'" % name) 149 self.log.debug('adding ' + name) 150 self._change_link(name, expose, disp, url) 151 152 def delete(self, name): 153 if not self._links.has_key(name): 154 raise TracError("Link is not exist: '%s'" % name) 155 self.log.debug('deleting ' + name) 156 self._change_link(name, None, None, None) 157 158 def modify(self, name, expose, disp, url): 159 if not self._links.has_key(name): 160 raise TracError("Link is not exist: '%s'" % name) 161 self.log.debug('modifying ' + name) 162 self._change_link(name, expose, disp, url) 163 79 164 # IWikiSyntaxProvider methods 80 165 def get_link_resolvers(self): 81 166 ret = [(self._common_ns, self._format_link)] 82 if self._exposed_names: 83 for name in self._exposed_names: 84 ret.append((name, self._format_exposed_link)) 167 for name in [x.name for x in self._links.values() if x.expose]: 168 ret.append((name, self._format_exposed_link)) 85 169 return ret 86 170 … … 106 190 if 1 == len(items): 107 191 # wihtout id 108 name, id = items[0], "" 109 elif 2 == len(items): 192 name, id = items[0], '' 193 trailer = '' 194 elif 2 <= len(items): 110 195 name, id = items 111 else: 112 return "<span style='color:red'>[invalid link: %s]</span>" % \ 113 (ns + ':' + target) 196 trailer = ':'.join(items[2:]) 197 198 # if name not found, leave all as is 199 if not name or not self._links.has_key(name): 200 self.log.debug("Unknown link name: '%s'" % name) 201 return ':'.join(items) 114 202 115 if not name or not self._link_info.has_key(name): 116 return "<span style='color:red'>[Unknown link name: '%s']</span>" \ 117 % name 118 disp = self._link_info[name][0] 203 info = self._links[name] 204 disp = info.disp 119 205 if label == target or label == ns + ':' + target: 120 206 # label is not specifed in wiki text, (ex. [link:name]) … … 122 208 label = disp % id 123 209 except: 124 label = disp + ":"+ id125 url = self._link_info[name][1]210 label = disp + ':' + id 211 url = info.url 126 212 try: 127 213 url = url % id 128 214 except: 129 215 pass 130 return '<a href="%s">%s</a> ' % (url, label)131 216 return '<a href="%s">%s</a>%s' % (url, label, trailer) 217 generallinksyntaxplugin/trunk/GeneralLinkSyntax/__init__.py
r98 r101 1 # GeneralLinkSyntax plugin module 2 from GeneralLinkSyntax import * 1 # This is python module: GeneralLinkSyntax plugin 2 from api import * 3 from web_ui import * generallinksyntaxplugin/trunk/setup.py
r98 r101 1 1 from setuptools import setup 2 2 3 PACKAGE = ' GeneralLinkSyntax'3 PACKAGE = 'TracGeneralLink' 4 4 VERSION = '0.1' 5 5 6 setup(name=PACKAGE, version=VERSION, packages=['GeneralLinkSyntax']) 6 setup(name=PACKAGE, version=VERSION, packages=['GeneralLinkSyntax'], 7 package_data={'GeneralLinkSyntax': ['templates/*.cs', 'htdocs/css/*.css']})
