Changeset 3225
- Timestamp:
- 02/13/08 01:52:05 (11 months ago)
- Files:
-
- tracblogplugin/trunk/setup.py (modified) (2 diffs)
- tracblogplugin/trunk/tBlog/templates/new_blog.cs (deleted)
- tracblogplugin/trunk/tracblog (moved) (moved from tracblogplugin/trunk/tBlog)
- tracblogplugin/trunk/tracblog/new_blog.py (modified) (7 diffs)
- tracblogplugin/trunk/tracblog/parseargs.py (modified) (1 diff)
- tracblogplugin/trunk/tracblog/templates/blog_new.html (modified) (1 diff)
- tracblogplugin/trunk/tracblog/web_ui.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
tracblogplugin/trunk/setup.py
r3214 r3225 3 3 from setuptools import setup, find_packages 4 4 5 PACKAGE = ' tBlog'5 PACKAGE = 'TracBlogPlugin' 6 6 VERSION = '0.3' 7 7 … … 10 10 author_email = 'pacopablo@pacopablo.com', 11 11 url = 'http://trac-hacks.org/wiki/TracBlogPlugin', 12 description = 'Blog ing systemplugin for Trac',12 description = 'Blogging plugin for Trac', 13 13 license='BSD', 14 14 15 packages = ['t Blog'],16 package_data = { 't Blog' : ['htdocs/css/*.css', 'htdocs/img/*',15 packages = ['tracblog'], 16 package_data = { 'tracblog' : ['htdocs/css/*.css', 'htdocs/img/*', 17 17 'templates/*.html', ]}, 18 entry_points = {'trac.plugins': ['t Blog = tBlog']},18 entry_points = {'trac.plugins': ['tracblog = tracblog']}, 19 19 install_requires = ['TracTags>=0.6'] 20 20 ) tracblogplugin/trunk/tracblog/new_blog.py
r3214 r3225 28 28 from trac.perm import IPermissionRequestor 29 29 from trac.util import Markup 30 from trac.wiki.api import IWikiMacroProvider31 30 from trac.wiki.formatter import wiki_to_html 32 31 from trac.wiki.model import WikiPage 33 32 from trac.wiki.macros import WikiMacroBase 34 from trac.config import Option 33 from trac.config import Option, ListOption, BoolOption 35 34 from trac.resource import * 36 35 37 from t Blog.parseargs import parseargs38 39 #from tractags.api import TagEngine 40 #from tractags.parseargs import parseargs 36 from tracblog.parseargs import parseargs 37 38 from tractags.api import TagSystem 39 41 40 42 41 __all__ = ['BlogPost'] … … 68 67 """ 69 68 70 implements(IRequestHandler, ITemplateProvider, IWikiMacroProvider, 71 IPermissionRequestor) 69 implements(IRequestHandler, ITemplateProvider, IPermissionRequestor) 72 70 73 71 page_format = Option('blog', 'page_format', '%Y/%m/%d/%H.%M', doc="Default page naming " 74 72 "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()") 75 84 76 85 # IPermissionRequestor … … 82 91 """ Display the blog in the wiki page """ 83 92 if formatter.perm.has_permission('BLOG_POSTER'): 84 args, kwargs = self._split_macro_args(content)93 args, kwargs = parseargs(content) 85 94 try: 86 95 blog_link = kwargs['link'] 87 96 del kwargs['link'] 88 97 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 91 99 return tag.a(blog_link, href=formatter.req.href.blog('new',**kwargs)) 92 100 return '' 93 94 def _split_macro_args(self, argv):95 """Return a list of arguments and a dictionary of keyword arguments96 97 """98 args = []99 kwargs = {}100 if argv:101 args, kwargs = parseargs(argv)102 return args, kwargs103 101 104 102 def match_request(self, req): … … 109 107 add_stylesheet(req, 'blog/css/blog.css') 110 108 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()113 109 data = self._new_blog_post(req) 114 data['blog']['referer'] = referer115 110 return 'blog_new.html', data, None 116 111 … … 120 115 wikitext = req.args.get('text', '') 121 116 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 124 125 page = WikiPage(self.env, pagename, None) 125 126 page.text = wikitext 126 127 comment = req.args.get('comment', '') 127 128 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') 129 130 scroll_bar_pos = req.args.get('scroll_bar_pos', '') 130 req_tags = req.args.get('tags', [])131 131 page_source = page.text 132 132 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 137 153 wiki = {'page_name' : pagename, 138 154 'comment' : comment, 139 'author' : req.authname,155 'author' : author, 140 156 'edit_rows' : edit_rows, 141 157 'version' : 0, … … 148 164 data = {'page' : page, 149 165 '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, 152 173 } 153 174 data.update(wiki) 154 175 return data 155 176 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): 203 201 """ Generate a page name based on the format specified. 204 202 … … 215 213 pagename = pagename.strip('-') 216 214 if '$U' in pagename: 217 pagename = pagename.replace('$U', authname) 215 username = re.sub(r'[^\w]+', '_', author) 216 pagename = pagename.replace('$U', username) 218 217 return pagename 219 218 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 270 223 271 224 # ITemplateProvider tracblogplugin/trunk/tracblog/parseargs.py
r3214 r3225 87 87 return parse_value(lexer) 88 88 89 lexer = Lexer(arguments)90 89 args = [] 91 90 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 110 110 return args, kwargs 111 111 tracblogplugin/trunk/tracblog/templates/blog_new.html
r3214 r3225 6 6 xmlns:xi="http://www.w3.org/2001/XInclude" 7 7 py:strip=""> 8 <py:match path="h1" once="true"> 9 <h1>${title}</h1> 10 </py:match> 8 11 <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> 10 41 <xi:include href="wiki_edit.html" /> 11 42 </html> tracblogplugin/trunk/tracblog/web_ui.py
r3214 r3225 38 38 from trac.config import Option, BoolOption, ListOption 39 39 40 from t Blog.parseargs import parseargs40 from tracblog.parseargs import parseargs 41 41 42 42 #from tractags.api import TagEngine