Changeset 2058

Show
Ignore:
Timestamp:
02/27/07 22:31:14 (2 years ago)
Author:
coderanger
Message:

TagsPlugin:

Working UI.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • tagsplugin/branches/filter/tractags/web_ui.py

    r2055 r2058  
    11from trac.core import * 
    22from trac.web.main import IRequestHandler 
    3 from trac.web.chrome import ITemplateProvider, INavigationContributor 
     3from trac.web.chrome import ITemplateProvider, INavigationContributor, add_stylesheet 
    44from trac.web.api import IStreamFilter, IRequestFilter 
    55from trac.util import Markup 
     
    77from trac.wiki.web_ui import WikiModule 
    88from trac.wiki.formatter import wiki_to_oneliner 
     9from trac.wiki.model import WikiPage 
     10 
    911from genshi.builder import tag 
    1012from genshi.core import START, END 
     
    8587    def match_stream(self, req, stream, method): 
    8688        return req.path_info.startswith('/wiki') and \ 
    87                req.args.get('action') == 'edit' and \ 
     89               req.args.get('action','view') in ('edit', 'view') and \ 
    8890               method == 'xhtml' 
    8991                
    9092    def process_stream(self, req, stream, method): 
    9193        page_name = req.path_info[6:] or 'WikiStart' 
    92         stage = 1 
     94        tags = TagEngine(self.env).tagspace.wiki.get_tags([page_name]) 
     95        action = req.args.get('action','view') 
     96        if action == 'edit': 
     97            return self._process_edit(req, stream, method, tags) 
     98        elif action == 'view': 
     99            return self._process_view(req, stream, method, tags) 
     100                       
     101          
     102    def _process_edit(self, req, stream, method, tags): 
     103        stage = 1                      
    93104        elm = tag.div([tag.label('Tag under: (',  
    94105                                 tag.a('view all tags', href=req.href.tags()), 
    95                                   ')',  
    96                                   for_='tags'),  
     106                                 ')',  
     107                                 for_='tags'),  
    97108                       tag.br(),  
    98109                       tag.input(title='Comma separated list of tags', 
     
    101112                                 size='30', 
    102113                                 name='tags', 
    103                                  value=', '.join(TagEngine(self.env).tagspace.wiki.get_tags([page_name])
     114                                 value=', '.join(tags
    104115                                ), 
    105116                      ], class_='field') 
    106                        
    107117        for kind, data, pos in stream:             
    108118            yield kind, data, pos 
     
    118128                    yield e 
    119129                stage = None 
     130                 
     131    def _process_view(self, req, stream, method, tags): 
     132        stage = 1 
     133        div_count = 1 
     134         
     135        def tag_data(): 
     136            engine = TagEngine(self.env) 
     137            for t in tags: 
     138                href, title = engine.get_tag_link(t) 
     139                yield t, href, title 
     140         
     141        elm = tag.ul(tags and tag.lh('Tags'), 
     142                     [tag.li(tag.a(t, href=href, title=title), ' ') for t, href, title in tag_data()], 
     143                     class_='tags') 
     144                      
     145        for kind, data, pos in stream: 
     146            yield kind, data, pos 
     147            if stage == 1 and \ 
     148               kind is START and \ 
     149               data[0].localname == 'div' and \ 
     150               'wikipage' in data[1].get('class', ''): 
     151                stage = 2 
     152            elif stage == 2: 
     153                if kind is START and data[0].localname == 'div': 
     154                    div_count += 1 
     155                elif kind is END and data.localname == 'div': 
     156                    div_count -= 1 
     157                     
     158                if not div_count: 
     159                    for e in elm.generate(): 
     160                        yield e 
     161                    stage = None 
     162                     
    120163             
    121164    # IRequestFilter methods 
    122165    def pre_process_request(self, req, handler): 
     166        tags = req.args.get('tags') 
     167        if isinstance(handler, WikiModule): 
     168            add_stylesheet(req, 'tags/css/tractags.css') 
    123169         
     170            if req.method == 'POST' and tags is not None: 
     171                page_name = req.path_info[6:] or 'WikiStart' 
     172                new_tags = set([t.strip() for t in tags.split(',') if t.strip()]) 
     173                old_tags = TagEngine(self.env).tagspace.wiki.get_tags([page_name])         
     174                if old_tags != new_tags: 
     175                    TagEngine(self.env).tagspace.wiki.replace_tags(req, page_name, new_tags) 
     176                    if req.args.get('text') == WikiPage(self.env, page_name).text: 
     177                        # The wiki module would think this is wasn't changed, 
     178                        # so redirect around it. 
     179                        req.redirect(req.href.wiki(page_name)) 
     180        return handler 
     181 
     182    def post_process_request(self, req, template, data, content_type): 
     183        return template, data, content_type 
    124184 
    125185class TagsModule(Component):