Changeset 1698

Show
Ignore:
Timestamp:
12/16/06 08:20:17 (2 years ago)
Author:
coderanger
Message:

HierWikiPlugin:

Fix escaping issues.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • hierwikiplugin/0.10/hierwiki/macros/subwiki.py

    r883 r1698  
    22 
    33from trac.core import * 
    4 from trac.wiki.api import IWikiMacroProvider, WikiSystem 
     4from trac.wiki.api import WikiSystem 
     5from trac.wiki.macros import WikiMacroBase 
     6from trac.wiki.model import WikiPage 
     7from trac.util.html import html 
    58 
    69from StringIO import StringIO 
    710import re, string, inspect 
    811 
    9 class SubWikiMacro(Component): 
     12class SubWikiMacro(WikiMacroBase): 
    1013    """ 
    1114    Inserts an alphabetic list of sub-wiki pages into the output. 
     
    1922    """ 
    2023 
    21     # TODO: Everything until render_macro can be removed once switched to be based on WikiMacroBase 
    22     implements(IWikiMacroProvider) 
    23      
    24     def get_macros(self): 
    25         """Yield the name of the macro based on the class name.""" 
    26         name = self.__class__.__name__ 
    27         if name.endswith('Macro'): 
    28             name = name[:-5] 
    29         yield name 
    30          
    31     def get_macro_description(self, name): 
    32         """Return the subclass's docstring.""" 
    33         return inspect.getdoc(self.__class__) 
    34          
     24    TITLE_RE = re.compile(r'=+\s([^=]*)=+') 
     25 
    3526    def render_macro(self, req, name, args): 
    3627        # Args seperated by commas: 
     
    3930        # Page Name prefix to search for. 
    4031        # how many 'levels' in the hierarchy to go down. 
    41         db = self.env.get_db_cnx() 
    42         cursor = db.cursor() 
    43         cs = db.cursor() 
    44  
    4532        prefix = req.hdf.getValue('wiki.page_name', '') + '/' 
    46         level = None 
     33        level = 0 
    4734        if args: 
    4835            args = args.replace('\'', '\'\'') 
     
    5138                prefix = args[0] 
    5239            if len(args) > 1 and args[1] != 'None': 
    53                 level = args[1] 
     40                level = int(args[1]) 
    5441 
    55         sql = 'SELECT DISTINCT name FROM wiki ' 
    56         if prefix: 
    57             sql += 'WHERE name LIKE \'%s%%\' ' % prefix 
    58         sql += 'ORDER BY name' 
    59         cursor.execute(sql) 
    60  
    61         buf = StringIO() 
    62         buf.write('<ul>') 
    63         while 1: 
    64             row = cursor.fetchone() 
    65             if row == None: 
    66                 break 
    67             name = row[0] 
     42        pages = WikiSystem(self.env).get_pages(prefix) 
     43        good_pages = [] 
     44        for p in pages: 
    6845            if level: 
    69                 len_name = name.split('/') 
    70                 #buf.write(len_name) 
    71                 if len(len_name) > int(level)+1: 
     46                len_name = p.split('/') 
     47                if len(len_name) > level+1: 
    7248                    continue 
    73             # Get the latest revision only. 
    74             sql = 'SELECT name,text from wiki where name = \'%s\' order by version desc limit 1' % name 
    75             cs.execute(sql) 
    76             while 1: 
    77                 csrow = cs.fetchone() 
    78                 if csrow == None: 
    79                     break 
    80                 name = csrow[0] 
    81                 text = csrow[1] 
    82                 (linktext,title,desc) = self._getinfo(db,name) 
    83  
    84                 link = self.env.href.wiki(name) 
    85  
    86                 buf.write('<li><a title="%s" href="%s">' % (title,link)) 
    87                 buf.write(linktext) 
    88                 buf.write('</a> %s</li>\n' % desc) 
    89         buf.write('</ul>') 
    90  
    91         return buf.getvalue() 
    92  
    93     def _getinfo(self, db, name): 
    94         cs = db.cursor() 
    95         desc = name 
    96         # Get the latest revision only. 
    97         cs.execute('SELECT text from wiki where name = \'%s\' order by version desc limit 1' % name) 
    98         csrow = cs.fetchone() 
    99         prefix = '' 
    100  
    101         if csrow != None: 
    102             text = csrow[0] 
    103             m  = re.search('=+\s([^=]*)=+',text) 
    104             if m != None: 
    105                 desc = string.strip(m.group(1)) 
    106         else: 
    107             prefix = "Create " 
    108  
    109         title = StringIO() 
    110         title.write("%s%s"%(prefix, desc)) 
    111         if prefix != '' or desc == name: 
    112             desc = '' 
    113  
    114         return (name,title.getvalue(),desc) 
     49            page = WikiPage(self.env, p) 
     50            md = self.TITLE_RE.search(page.text) 
     51            title = '' 
     52            if md: 
     53                title = md.group(1) 
     54            good_pages.append((p, title)) 
     55        return html.UL([html.LI(html.A(t, title=t, href=req.href.wiki(p))) for p,t in good_pages]) 
     56