diff --git a/ChangeLog b/ChangeLog index 2371d33..5e6324d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,12 @@ +v0.5 (21/09/2015) +** User ** + Enable code coloration support with Markdown syntax + Add article inclusion (Mardown only) + +** Dev ** + Support Django 1.8 + + v0.4 (09/08/2015) ** User ** Redirect user to comment when it's added and not to begining of page diff --git a/dynastie/generators/generator.py b/dynastie/generators/generator.py index f6de0b8..03b2dff 100755 --- a/dynastie/generators/generator.py +++ b/dynastie/generators/generator.py @@ -57,7 +57,7 @@ class DynastieGenerator: URI = "http://indefero.soutade.fr/p/dynastie" - def __init__(self, hash_posts=None, hash_posts_content=None): + def __init__(self, hash_posts={}, hash_posts_content={}): self.report = '' self.somethingWrote = False self.hash_posts = hash_posts diff --git a/dynastie/generators/index.py b/dynastie/generators/index.py index 85f523f..5dde0ae 100755 --- a/dynastie/generators/index.py +++ b/dynastie/generators/index.py @@ -18,6 +18,7 @@ along with Dynastie. If not, see . """ import os +import re import datetime import hashlib import xml @@ -30,7 +31,7 @@ from dynastie.generators import markdown2 class Index(DynastieGenerator): - def __init__(self, hash_posts=None, hash_posts_content=None): + def __init__(self, hash_posts={}, hash_posts_content={}): DynastieGenerator.__init__(self, hash_posts, hash_posts_content) self.hooks = {'posts' : self.createPosts, @@ -197,32 +198,56 @@ class Index(DynastieGenerator): if end < start: self.addError('Invalid tags in ' + self.filename) break - + try: dom = parseString(code[start:end+11]) except xml.dom.DOMException as e: self.addError('Error parsing ' + self.filename) break - + res = self.createCode(dom, dom.firstChild) if res: code = code.replace(code[start:end+11], res) return code - def createPost(self, posts, dom, post_elem, root): + def _have_I_right(self, user, post_id): + from dynastie.models import Post, Blog + + p = Post.objects.get(pk=post_id) + + if p is None: return None + + blog_id = p.blog.id + + if not user.is_superuser: + b = Blog.objects.filter(pk=blog_id, writers=user.id) + if not b: return None + b = b[0] + else: + b = Blog.objects.get(pk=blog_id) + if b is None: return None + + return (b, p) + + def _manageInternalPosts(self, post, text, parent_posts, user=None): from dynastie.models import Post - post = self.cur_post_obj + if not user: user = post.author + if post and post.content_format != Post.CONTENT_TEXT: return text + internal_posts = re.search('\[\[([0-9]+)\]\]', text) + if not internal_posts: return text + for post_id in internal_posts.groups(): + post_id = int(post_id) + if post_id in parent_posts: continue + _,post = self._have_I_right(user, post_id) + if not post: continue + new_content = self._loadPostContent(post, parent_posts) + if new_content: + text = text.replace('[[' + str(post_id) + ']]', new_content) + return text - if post.id in self.hash_posts and not self.first_try: - node = self.hash_posts[post.id] - return node.cloneNode(0) - - values = {'post_content': '', 'author': 'Unknown'} - try: - values['author'] = post.author.first_name + ' ' + post.author.last_name - except: - pass + def _loadPostContent(self, post, parent_posts): + from dynastie.models import Post blog = post.blog blog.create_paths() @@ -238,11 +263,32 @@ class Index(DynastieGenerator): post_content = f.read() f.close() if post.content_format == Post.CONTENT_TEXT: - post_content = markdown2.markdown(post_content) + parent_posts.append(post.id) + post_content = self._manageInternalPosts(post, post_content, parent_posts) + post_content = markdown2.markdown(post_content, extras=['fenced-code-blocks']) self.hash_posts_content[filename] = post_content else: post_content = self.hash_posts_content[filename] + return post_content + + def createPost(self, posts, dom, post_elem, root): + from dynastie.models import Post + post = self.cur_post_obj + + if post.id in self.hash_posts and not self.first_try: + node = self.hash_posts[post.id] + return node.cloneNode(0) + + values = {'post_content': '', 'author': 'Unknown'} + try: + values['author'] = post.author.first_name + ' ' + post.author.last_name + except: + pass + + post_content = _loadPostContent(post, []) + if not post_content: return None + post_content = self.pygmentCode(post_content) self.simpleTransform(values, dom, post_elem, root) diff --git a/dynastie/generators/post.py b/dynastie/generators/post.py index 10e3b2c..5c48f80 100755 --- a/dynastie/generators/post.py +++ b/dynastie/generators/post.py @@ -230,7 +230,8 @@ class Post(Index): v['date'] = now.strftime("%A, %d %B %Y %H:%m") v['post_content'] = '' - values['content'] = self.pygmentCode(values['content']) + post_content = self._manageInternalPosts(None, values['content'], [], self.user) + post_content = self.pygmentCode(post_content) self.simpleTransform(v, dom, root, node) @@ -241,7 +242,7 @@ class Post(Index): if not the_class in post_transform: continue if the_class == 'post_content': - new_node = dom.createTextNode(values['content']) + new_node = dom.createTextNode(post_content) content_node.appendChild(new_node) post_nodes = dom.getElementsByTagNameNS(self.URI, "post") @@ -250,9 +251,11 @@ class Post(Index): return post_elem - def preview(self, src, values): + def preview(self, request, src, values): from dynastie.models import Blog + self.user = request.user + # Override all hooks self.hooks = {'post' : self.createPreview, 'tags' : self.createTags}