diff --git a/generators/__init__.py b/generators/__init__.py index 054cd90..030c301 100644 --- a/generators/__init__.py +++ b/generators/__init__.py @@ -18,4 +18,4 @@ along with Dynastie. If not, see . """ -__all__ = ["generator", "index", "post", "category", "tag", "archive", "rss", "atom"] +__all__ = ["generator", "index", "post", "category", "tag", "archive", "rss", "atom", "all_posts"] diff --git a/generators/all_posts.py b/generators/all_posts.py new file mode 100644 index 0000000..05aae5d --- /dev/null +++ b/generators/all_posts.py @@ -0,0 +1,180 @@ +# -*- coding: utf-8 -*- +""" + Copyright 2012-2013 Grégory Soutadé + + This file is part of Dynastie. + + Dynastie is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + Dynastie is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Dynastie. If not, see . +""" +import os +from xml.dom.minidom import parse, parseString +from dynastie.generators.generator import DynastieGenerator +from dynastie.generators.index import Index +from django.db import models + +class AllPosts(Index): + + filename = 'all_posts' + cur_post = 0 + + def createPosts(self, posts, dom, root, node): + posts_elem = self.createElement(dom, 'posts') + + self.cur_post = 0 + for p in posts: + self.cur_post_obj = p + + post_elem = self.createElement(dom, 'post', '', subtree=node) + + self._parse(self.hooks, posts, dom, post_elem) + posts_elem.appendChild(post_elem) + self.cur_post = self.cur_post + 1 + + root.replaceChild(posts_elem, node) + + + def createMonth(self, posts, dom, root, node): + date_format = node.getAttribute('format') + if date_format == '': + date_format = '%B' + + self.cur_month = posts[0].creation_date.month + + root.removeChild(node) + cur_posts = [] + month_elem = None + prev_month = None + for p in posts: + if p.creation_date.month == self.cur_month: + cur_posts.append(p) + continue + + month_elem = self.createElement(dom, 'month') + month_def = dom.createElement('month') + month_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format))) + month_elem.appendChild(month_def) + self.cloneSubtree(month_elem, node) + + # Parse inner HTML + self._parse(self.hooks, cur_posts, dom, month_elem) + + if not root.hasChildNodes(): + root.appendChild(month_elem) + else: + root.insertBefore(month_elem, prev_month) + prev_month = month_elem + cur_posts = [] + self.cur_month = p.creation_date.month + cur_posts.append(p) + + # Last month + if not month_elem is None and len(cur_posts) != 0: + month_elem = self.createElement(dom, 'month') + month_def = dom.createElement('month') + month_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format))) + month_elem.appendChild(month_def) + self.cloneSubtree(month_elem, node) + + # Parse inner HTML + self._parse(self.hooks, cur_posts, dom, month_elem) + if not root.hasChildNodes(): + root.appendChild(month_elem) + else: + root.insertBefore(month_elem, prev_month) + + + return None + + def createYear(self, posts, dom, root, node): + date_format = node.getAttribute('format') + if date_format == '': + date_format = '%Y' + + self.cur_year = posts[0].creation_date.year + + root.removeChild(node) + cur_posts = [] + year_elem = None + for p in posts: + if p.creation_date.year == self.cur_year: + cur_posts.append(p) + continue + + year_elem = self.createElement(dom, 'year') + year_def = dom.createElement('year') + year_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format))) + year_elem.appendChild(year_def) + self.cloneSubtree(year_elem, node) + + # Parse inner HTML + self._parse(self.hooks, cur_posts, dom, year_elem) + + root.appendChild(year_elem) + cur_posts = [] + self.cur_year = p.creation_date.year + cur_posts.append(p) + + # Last year + if not year_elem is None and len(cur_posts) != 0: + year_elem = self.createElement(dom, 'year') + year_def = dom.createElement('year') + year_def.appendChild(dom.createTextNode(cur_posts[0].creation_date.strftime(date_format))) + year_elem.appendChild(year_def) + self.cloneSubtree(year_elem, node) + + # Parse inner HTML + self._parse(self.hooks, cur_posts, dom, year_elem) + root.appendChild(year_elem) + + return None + + def createAllPosts(self, posts, dom, root, node): + posts_elem = self.createElement(dom, 'all_posts') + + if len(posts) == 0: + post_elem = self.createElement(dom, '', 'No posts yet') + posts_elem.appendChild(post_elem) + else: + for cnode in node.childNodes: + new_node = cnode.cloneNode(True) + posts_elem.appendChild(new_node) + + self._parse(self.hooks, posts, dom, posts_elem) + + root.replaceChild(posts_elem, node) + return posts_elem + + def generate(self, blog, src, output): + from dynastie.models import Post, Blog, Category + + self.hooks['year'] = self.createYear + self.hooks['month'] = self.createMonth + self.hooks['posts'] = self.createPosts + self.hooks['all_posts'] = self.createAllPosts + + dom = self.parseTemplate(blog, src, output, 'all_posts') + if dom is None: return self.report + + posts = Post.objects.filter(published=True).order_by('-creation_date') + nodes = dom.getElementsByTagName("*") + + nodes[0] = self.parse(src, self.hooks, posts, dom, nodes[0]) + + self.writeIfNotTheSame(output + "/" + self.filename + '.html', nodes[0]) + + if not self.somethingWrote: + self.addReport('Nothing changed') + + return self.report + diff --git a/generators/generator.py b/generators/generator.py index 83c7745..f3364bb 100644 --- a/generators/generator.py +++ b/generators/generator.py @@ -132,12 +132,18 @@ class DynastieGenerator: return link_elem - def createElement(self, dom, name='', content=''): + def cloneSubtree(self, div, subtree): + for node in subtree.childNodes: + div.appendChild(node.cloneNode(True)) + + def createElement(self, dom, name='', content='', subtree=None): div = dom.createElement('div') if name != '': div.setAttribute('class', name) if content != '': div.appendChild(dom.createTextNode(content)) + if not subtree is None: + self.cloneSubtree(div, subtree) return div diff --git a/models.py b/models.py index 06a891b..99ac6a9 100644 --- a/models.py +++ b/models.py @@ -94,6 +94,7 @@ class Blog(models.Model): self.engines.append(globals()['archive']) self.engines.append(globals()['atom']) self.engines.append(globals()['rss']) + self.engines.append(globals()['all_posts']) def copytree(self, src, dst): names = os.listdir(src)