Changeset 101

Show
Ignore:
Timestamp:
08/13/05 05:26:09 (3 years ago)
Author:
gotoh
Message:

GeneralLinkSyntaxPlugin:

Supported TracWebAdmin?. * You can manage links via web interface using TracWebAdmin plugin.

  • Package name is changed to 'TracGeneralLink?'.
    Remove old package if you installed old version. * Many refine of code.
  • More strict check
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • generallinksyntaxplugin/trunk/GeneralLinkSyntax

    • Property svn:ignore set to
      *.pyc
  • generallinksyntaxplugin/trunk/GeneralLinkSyntax/api.py

    r100 r101  
    2626import re 
    2727from trac.core import * 
     28from trac.util import TracError 
    2829from trac.util import escape 
    2930from trac.wiki import IWikiSyntaxProvider 
    3031 
     32from model import LinkInfo 
    3133 
    3234class GeneralLinkSyntaxProvider(Component): 
     35    """Provides 'link:' syntax which is expanded to user defined links. 
     36    """ 
    3337    implements(IWikiSyntaxProvider) 
    3438 
     
    4347    # ... 
    4448    
    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 = {} 
    4951     
    5052    _common_ns = 'link' 
     
    5658        self._load_config() 
    5759 
    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) 
    6169     
    6270    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 
    6983            disp = self._get_config(name + self._disp_suffix, name) 
    7084            url = self._get_config(name + self._url_suffix) 
    7185            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     
    79164    # IWikiSyntaxProvider methods 
    80165    def get_link_resolvers(self): 
    81166        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)) 
    85169        return ret 
    86170 
     
    106190        if 1 == len(items): 
    107191            # wihtout id 
    108             name, id = items[0], "" 
    109         elif 2 == len(items): 
     192            name, id = items[0], '' 
     193            trailer = '' 
     194        elif 2 <= len(items): 
    110195            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) 
    114202         
    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 
    119205        if label == target or label == ns + ':' + target: 
    120206            # label is not specifed in wiki text, (ex. [link:name]) 
     
    122208                label = disp % id 
    123209            except: 
    124                 label = disp + ":" + id 
    125         url = self._link_info[name][1] 
     210                label = disp + ':' + id 
     211        url = info.url 
    126212        try: 
    127213            url = url % id 
    128214        except: 
    129215            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 
     2from api import * 
     3from web_ui import * 
  • generallinksyntaxplugin/trunk/setup.py

    r98 r101  
    11from setuptools import setup 
    22 
    3 PACKAGE = 'GeneralLinkSyntax
     3PACKAGE = 'TracGeneralLink
    44VERSION = '0.1' 
    55 
    6 setup(name=PACKAGE, version=VERSION, packages=['GeneralLinkSyntax']) 
     6setup(name=PACKAGE, version=VERSION, packages=['GeneralLinkSyntax'], 
     7      package_data={'GeneralLinkSyntax': ['templates/*.cs', 'htdocs/css/*.css']})