Add article inclusion (Mardown only)

This commit is contained in:
Gregory Soutade 2015-09-21 19:07:39 +02:00
parent dd6739461b
commit cde08b8cfa
4 changed files with 77 additions and 19 deletions

View File

@ -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

View File

@ -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

View File

@ -18,6 +18,7 @@
along with Dynastie. If not, see <http://www.gnu.org/licenses/>.
"""
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 <dyn:code> 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)

View File

@ -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}