Changeset 3225

Show
Ignore:
Timestamp:
02/13/08 01:52:05 (11 months ago)
Author:
pacopablo
Message:
  • Refs #1111 - First big push towards porting to 0.11
  • The blog entry window has mostly been finished.
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • tracblogplugin/trunk/setup.py

    r3214 r3225  
    33from setuptools import setup, find_packages 
    44 
    5 PACKAGE = 'tBlog
     5PACKAGE = 'TracBlogPlugin
    66VERSION = '0.3' 
    77 
     
    1010        author_email = 'pacopablo@pacopablo.com', 
    1111        url = 'http://trac-hacks.org/wiki/TracBlogPlugin', 
    12         description = 'Bloging system plugin for Trac', 
     12        description = 'Blogging plugin for Trac', 
    1313        license='BSD', 
    1414 
    15         packages = ['tBlog'], 
    16         package_data = { 'tBlog' : ['htdocs/css/*.css', 'htdocs/img/*', 
     15        packages = ['tracblog'], 
     16        package_data = { 'tracblog' : ['htdocs/css/*.css', 'htdocs/img/*', 
    1717                                    'templates/*.html', ]}, 
    18         entry_points = {'trac.plugins': ['tBlog = tBlog']}, 
     18        entry_points = {'trac.plugins': ['tracblog = tracblog']}, 
    1919        install_requires = ['TracTags>=0.6'] 
    2020) 
  • tracblogplugin/trunk/tracblog/new_blog.py

    r3214 r3225  
    2828from trac.perm import IPermissionRequestor 
    2929from trac.util import Markup 
    30 from trac.wiki.api import IWikiMacroProvider 
    3130from trac.wiki.formatter import wiki_to_html 
    3231from trac.wiki.model import WikiPage 
    3332from trac.wiki.macros import WikiMacroBase 
    34 from trac.config import Option 
     33from trac.config import Option, ListOption, BoolOption 
    3534from trac.resource import * 
    3635 
    37 from tBlog.parseargs import parseargs 
    38  
    39 #from tractags.api import TagEngine 
    40 #from tractags.parseargs import parseargs 
     36from tracblog.parseargs import parseargs 
     37 
     38from tractags.api import TagSystem 
     39 
    4140 
    4241__all__ = ['BlogPost'] 
     
    6867    """ 
    6968 
    70     implements(IRequestHandler, ITemplateProvider, IWikiMacroProvider,  
    71                IPermissionRequestor) 
     69    implements(IRequestHandler, ITemplateProvider, IPermissionRequestor) 
    7270 
    7371    page_format = Option('blog', 'page_format', '%Y/%m/%d/%H.%M', doc="Default page naming " 
    7472                        "scheme for blog posts.") 
     73    new_blog_link_text = Option('blog', 'new_blog_link', 'New Blog Post', doc="Default text for link " 
     74                                "to new blog entry creation.") 
     75    default_tag = ListOption('blog', 'default_tag', 'blog',  doc="Comma separated list of " 
     76                             "tags.  The combination of which are used as the default for " 
     77                             "signifying a blog post.") 
     78    entry_page_title = Option('blog', 'entry_page_title', 'Create Blog Entry', doc="The title used in " 
     79                              "the <title></title> of the blog post entry page.  Also used for the " 
     80                              "title of the post entry page.") 
     81    footer = Option('blog', 'footer', '', doc="Footer to add to each blog post") 
     82    date_format = Option('blog', 'date_format', '%x %X', doc="Date format to use when displaying dates for " 
     83                         "blog entries.  The format is the same as time.strftime()") 
    7584 
    7685    # IPermissionRequestor 
     
    8291        """ Display the blog in the wiki page """ 
    8392        if formatter.perm.has_permission('BLOG_POSTER'): 
    84             args, kwargs = self._split_macro_args(content) 
     93            args, kwargs = parseargs(content) 
    8594            try: 
    8695                blog_link = kwargs['link'] 
    8796                del kwargs['link'] 
    8897            except KeyError: 
    89                 blog_link = self.env.config.get('blog', 'new_blog_link',  
    90                                                 'New Blog Post') 
     98                blog_link = self.new_blog_link_text 
    9199            return tag.a(blog_link, href=formatter.req.href.blog('new',**kwargs)) 
    92100        return '' 
    93  
    94     def _split_macro_args(self, argv): 
    95         """Return a list of arguments and a dictionary of keyword arguments 
    96  
    97         """ 
    98         args = [] 
    99         kwargs = {} 
    100         if argv: 
    101             args, kwargs = parseargs(argv) 
    102         return args, kwargs 
    103101 
    104102    def match_request(self, req): 
     
    109107        add_stylesheet(req, 'blog/css/blog.css') 
    110108        add_stylesheet(req, 'common/css/wiki.css') 
    111 #        self._new_blog_post(req) 
    112         referer = req.args.get('referer') or req.get_header('Referer') or req.href.blog() 
    113109        data = self._new_blog_post(req) 
    114         data['blog']['referer'] =  referer 
    115110        return 'blog_new.html', data, None 
    116111 
     
    120115        wikitext = req.args.get('text', '') 
    121116        blogtitle = req.args.get('blogtitle', '') 
    122         page_format = req.args.get('page_format', self.page_format)  
    123         pagename = self._generate_pagename(page_format, blogtitle, req.authname)  
     117        page_format = req.args.get('pagename', self.page_format)  
     118        tags = self._get_tags(req) 
     119        referer = req.args.get('referer') or req.get_header('Referer') or req.href.blog() 
     120 
     121        author = req.authname 
     122        pagename = self._generate_pagename(page_format, blogtitle, author)  
     123        titleline = ' '.join(["=", blogtitle, "=\n"]) 
     124 
    124125        page = WikiPage(self.env, pagename, None) 
    125  
     126        page.text = wikitext 
    126127        comment = req.args.get('comment', '') 
    127128        readonly = int(req.args.has_key('readonly')) 
    128         edit_rows = int(req.args.get('edit_rows', 20)
     129        edit_rows = req.args.get('edit_rows', '20'
    129130        scroll_bar_pos = req.args.get('scroll_bar_pos', '') 
    130         req_tags = req.args.get('tags', []) 
    131131        page_source = page.text 
    132132 
    133         title = get_resource_summary(self.env, page.resource) 
    134         if action: 
    135             title += ' (%s)' % action 
    136  
     133        if blogtitle: 
     134            wikitext = ''.join([titleline, wikitext]) 
     135 
     136        if req.method == 'POST': 
     137            if action == 'edit': 
     138                if req.args.has_key('cancel'): 
     139                    req.redirect(referer) 
     140                page = WikiPage(self.env, pagename, None) 
     141                tagsystem = TagSystem(self.env) 
     142                # Add footer  
     143                page.text = ''.join([wikitext, "\n\n", self.var_subs(author, self.footer)])  
     144                page.readonly = readonly 
     145                if req.args.has_key('preview'): 
     146                    action = 'preview' 
     147                else: 
     148                    page.save(author, comment, req.remote_addr) 
     149                    tagsystem.set_tags(req, page.resource, tags) 
     150                    req.redirect(referer) 
     151 
     152         
    137153        wiki = {'page_name' : pagename, 
    138154                'comment' : comment, 
    139                 'author' : req.authname
     155                'author' : author
    140156                'edit_rows' : edit_rows, 
    141157                'version' : 0, 
     
    148164        data = {'page' : page, 
    149165                'action' : action, 
    150                 'title' : title, 
    151                 'blog' : {}, 
     166                'title' : self.entry_page_title, 
     167                'blog' : {'title' : blogtitle, 
     168                          'pagename' : pagename, 
     169                          'referer' : referer, 
     170                         }, 
     171                'tags' : ', '.join(tags), 
     172                'referer' : referer, 
    152173               } 
    153174        data.update(wiki) 
    154175        return data 
    155176         
    156 #        if req.method == 'POST': 
    157 #            if action == 'edit': 
    158 #                if req.args.has_key('cancel'): 
    159 #                    referrer = req.args.get('referer') or req.get_header('Referer') or self.env.href.blog() 
    160 #                    req.redirect(referrer) 
    161 #                page = WikiPage(self.env, pagename, None) 
    162 #                tags = TagEngine(self.env).tagspace.wiki 
    163 #                if req.args.has_key('preview'): 
    164 #                    req.hdf['blog.action'] = 'preview' 
    165 #                    self._render_editor(req, page, self.env.get_db_cnx(), 
    166 #                                        preview=True)  
    167 #                else: 
    168 #                    titleline = ' '.join(["=", blogtitle, "=\n"]) 
    169 #                    if blogtitle: 
    170 #                        page.text = ''.join([titleline, wikitext]) 
    171 #                    else: 
    172 #                        page.text = wikitext 
    173 #                    # Add footer  
    174 #                    page.text = page.text.join(["\n\n",self.variable_substitution(req,self.env.config.get('blog', 'footer', ''))])  
    175 #                    page.readonly = readonly 
    176 #                    page.save(req.authname, comment, req.remote_addr) 
    177 #                    taglist = [x.strip() for x in req_tags.split(',') if x] 
    178 #                    taglist = [t.strip() for t in  
    179 #                               _tag_split.split(req.args.get('tags'))  
    180 #                               if t.strip()] 
    181 #                    tags.add_tags(req, pagename, taglist) 
    182 #                    referrer = req.args.get('referer') or req.get_header('Referer') or self.env.href.blog() 
    183 #                    req.redirect(referrer) 
    184 #        else: 
    185 #            info = { 
    186 #                'title' : blogtitle, 
    187 #                'pagename': pagename, 
    188 #                'page_source': wikitext, 
    189 #                'comment': comment, 
    190 #                'readonly': readonly, 
    191 #                'edit_rows': edit_rows, 
    192 #                'scroll_bar_pos': req.args.get('scroll_bar_pos', '') 
    193 #            } 
    194 #            req.hdf['blog'] = info 
    195 #            req.hdf['title'] = 'New Blog Entry' 
    196 #            tlist = req.args.getlist('tag') 
    197 #            if not tlist: 
    198 #                tlist = [self.env.config.get('blog', 'default_tag', 'blog')] 
    199 #            req.hdf['tags'] = ', '.join(tlist) 
    200 #            pass 
    201  
    202     def _generate_pagename(self, page_format, title, authname): 
     177 
     178    def _get_tags(self, req): 
     179        """ Return a list of tags. 
     180     
     181        First look for the presence of the `tags` query argument. If found, 
     182        parse the result into a list. 
     183 
     184        Otherwise, look for the `tag` query arguments. 
     185 
     186        If none of the previous query arguments exist, use the list of tags 
     187        from `trac.ini` 
     188 
     189        """ 
     190        taglist = req.args.get('tags', None) 
     191        if taglist: 
     192            tags = [t.strip() for t in _tag_split.split(taglist) if t.strip()] 
     193        elif req.args.has_key('tag'): 
     194            tags = req.args.getlist('tag') 
     195        else: 
     196            tags = self.default_tag 
     197        return tags 
     198 
     199 
     200    def _generate_pagename(self, page_format, title, author): 
    203201        """ Generate a page name based on the format specified. 
    204202 
     
    215213            pagename = pagename.strip('-') 
    216214        if '$U' in pagename: 
    217             pagename = pagename.replace('$U', authname) 
     215            username = re.sub(r'[^\w]+', '_', author) 
     216            pagename = pagename.replace('$U', username) 
    218217        return pagename 
    219218 
    220 #    def _render_editor(self, req, page, db, preview=False): 
    221 #        blogtitle = req.args.get('blogtitle') 
    222 #        titleline = ' '.join(["=", blogtitle, "=\n"]) 
    223 #        if req.args.has_key('text'): 
    224 #            page.text = req.args.get('text') 
    225 #        if preview: 
    226 #            page.readonly = req.args.has_key('readonly') 
    227 
    228 #        author = req.authname 
    229 #        comment = req.args.get('comment', '') 
    230 #        editrows = req.args.get('editrows') 
    231 #        tags = req.args.get('tags') 
    232 #        req.hdf['tags'] = tags 
    233 #        if editrows: 
    234 #            pref = req.session.get('wiki_editrows', '20') 
    235 #            if editrows != pref: 
    236 #                req.session['wiki_editrows'] = editrows 
    237 #        else: 
    238 #            editrows = req.session.get('wiki_editrows', '20') 
    239 
    240 #        req.hdf['title'] = page.name + ' (edit)' 
    241 #        info = { 
    242 #            'title' : blogtitle, 
    243 #            'pagename': page.name, 
    244 #            'page_source': page.text, 
    245 #            'author': author, 
    246 #            'comment': comment, 
    247 #            'readonly': page.readonly, 
    248 #            'edit_rows': editrows, 
    249 #            'scroll_bar_pos': req.args.get('scroll_bar_pos', '') 
    250 #        } 
    251 #        if preview: 
    252 #            if blogtitle: 
    253 #                info['page_html'] = wiki_to_html(''.join([titleline,  
    254 #                                                 req.args.get('text'),  
    255 #                                                 "\n\n",self.variable_substitution(req,self.env.config.get('blog', 'footer', ''))]),  
    256 #                                                self.env, req, db) 
    257 #            else: 
    258 #                info['page_html'] = wiki_to_html(page.text.join(["\n\n", 
    259 #                    self.variable_substitution(req,self.env.config.get('blog', 'footer', ''))]),  
    260 #                                                  self.env,  
    261 #                                                  req,  
    262 #                                                  db)  
    263 #            info['readonly'] = int(req.args.has_key('readonly')) 
    264 #        req.hdf['blog'] = info 
    265  
    266     def variable_substitution(self,req,string):  
    267         string = string.replace('$U',req.authname)  
    268         string = string.replace('$D',time.strftime(self.env.config.get('blog', 'date_format', '%x %X')))  
    269         return string  
     219    def var_subs(self, author, s):  
     220        s = s.replace('$U', author)  
     221        s = s.replace('$D', time.strftime(self.date_format))  
     222        return s 
    270223     
    271224    # ITemplateProvider 
  • tracblogplugin/trunk/tracblog/parseargs.py

    r3214 r3225  
    8787            return parse_value(lexer) 
    8888             
    89     lexer = Lexer(arguments) 
    9089    args = [] 
    9190    kwargs = {} 
    92  
    93     try: 
    94         while True: 
    95             arg = parse_value(lexer) 
    96             try: 
    97                 type, token = lexer.next() 
    98             except StopIteration: 
    99                 args.append(arg) 
    100                 break 
    101             if token == '=': 
    102                 kwargs[str(arg)] = parse_node(lexer) 
    103                 type, token = lexer.next() 
    104                 if token != ',': 
    105                     raise UnexpectedToken(token) 
    106             elif token == ',': 
    107                 args.append(arg) 
    108     except StopIteration: 
    109         pass 
     91    if  arguments: 
     92        lexer = Lexer(arguments) 
     93        try: 
     94            while True: 
     95                arg = parse_value(lexer) 
     96                try: 
     97                    type, token = lexer.next() 
     98                except StopIteration: 
     99                    args.append(arg) 
     100                    break 
     101                if token == '=': 
     102                    kwargs[str(arg)] = parse_node(lexer) 
     103                    type, token = lexer.next() 
     104                    if token != ',': 
     105                        raise UnexpectedToken(token) 
     106                elif token == ',': 
     107                    args.append(arg) 
     108        except StopIteration: 
     109            pass 
    110110    return args, kwargs 
    111111 
  • tracblogplugin/trunk/tracblog/templates/blog_new.html

    r3214 r3225  
    66      xmlns:xi="http://www.w3.org/2001/XInclude" 
    77      py:strip=""> 
     8  <py:match path="h1" once="true"> 
     9    <h1>${title}</h1> 
     10  </py:match> 
    811  <form py:match="//form[@id='edit']"  
    9     action="/blog/new" id="edit" method="post">${select('*|text()')}</form> 
     12    action="/blog/new" id="edit" method="POST">${select('*|text()')}</form> 
     13  <textarea py:match="//textarea[@id='text']" id="text" class="wikitext"  
     14    name="text" cols="80" rows="$edit_rows">${page_source}</textarea> 
     15  <fieldset py:match="//fieldset[@class='iefix']" once="true" class="iefix"> 
     16    <input type="hidden" name="referer" value="${blog.referer}" /> 
     17    <div class="field"> 
     18      <label>Entry Title<br /> 
     19        <input id="comment" type="text" name="blogtitle" size="60" 
     20          value="${blog.title}" /> 
     21      </label> 
     22    </div> 
     23    <br /> 
     24    ${select('*|text()')} 
     25  </fieldset> 
     26  <div py:match="//div[@id='changeinfo1']" id="changeinfo1"> 
     27    <div class="field"> 
     28      <label>Wiki Page name:<br /> 
     29        <input id="pagename" type="text" name="pagename" size="60" 
     30        value="${blog.pagename}" /> 
     31      </label> 
     32    </div> 
     33    <div class="field"> 
     34      <label>Tag under: (<a href="/tags">view all tags</a>)<br /> 
     35        <input size="30" type="text" id="tags" value="${tags}" name="tags" /> 
     36      </label> 
     37    </div> 
     38    <br /> 
     39    ${select('*|text()')} 
     40  </div> 
    1041  <xi:include href="wiki_edit.html" /> 
    1142</html> 
  • tracblogplugin/trunk/tracblog/web_ui.py

    r3214 r3225  
    3838from trac.config import Option, BoolOption, ListOption 
    3939 
    40 from tBlog.parseargs import parseargs 
     40from tracblog.parseargs import parseargs 
    4141 
    4242#from tractags.api import TagEngine