import os import datetime from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator from django.db import models # TODO : content class Index(DynastieGenerator): cur_page = 0 nb_pages = 0 cur_article = 0 articles_per_page = 0 def createNavigation(self): if self.nb_pages == 0 or self.nb_pages == 1: return '' nav = '' if self.cur_page != 0: nav = nav + '<< ' if self.cur_page == 1: nav = nav + '< ' else: nav = nav + '< ' start = (self.cur_page/5)*5 end = start + 10 if end > self.nb_pages+1: end = self.nb_pages+1 for i in range(start, end): if i == self.cur_page: nav = nav + str(i+1) + ' ' else: if i == 0: nav = nav + '1 ' else: nav = nav + '' + str(i+1) + ' ' if self.cur_page != self.nb_pages: nav = nav + '> ' nav = nav + '>>' return nav def createArticle(self, article, dom, article_elem, root): values = {} values['title'] = article.title values['author'] = article.author.first_name values['date'] = article.creation_date.strftime("%d/%m/%Y") values['content'] = '' self.simpleTransform(values, dom, article_elem, root) def parse(self, articles, dom, root): for node in root.childNodes: if node.prefix == 'dyn': if node.localName == 'articles': articles_elem = self.createElement(dom, 'articles') for i in range(0, self.articles_per_page): article_elem = self.createElement(dom, 'article') if articles.count() > self.cur_article: self.createArticle(articles[self.cur_article], dom, article_elem, node) else: article_elem = self.createElement(dom, '', 'No articles yet') articles_elem.appendChild(article_elem) self.cur_article = self.cur_article + 1 if self.cur_article == articles.count(): break root.replaceChild(articles_elem, node) if node.localName == 'navigation': new_dom = parseString('') new_node = new_dom.getElementsByTagName('div')[0] root.replaceChild(new_node.cloneNode(True), node) continue if node.hasChildNodes(): self.parse(articles, dom, node) return def generate(self, blog, src, output): from dynastie.models import Article, Blog if not os.path.exists(src + '/_index.html'): self.addError('No _index.html found, exiting') return self.report try: dom = parse(src + '/_index.html') except xml.dom.DOMException as e: self.addError('Error parsing _index.html : ' + e) return self.report article_nodes = dom.getElementsByTagNameNS(self.URI, "articles") if not article_nodes is None: self.articles_per_page = int(article_nodes[0].getAttribute("limit")) else: self.addError('No tag dyn:articles found') now = datetime.datetime.now() cur_year = now.year articles = Article.objects.filter(creation_date__year=cur_year) if articles.count() < self.articles_per_page: articles = Article.objects.all()[:self.articles_per_page] if articles.count() > self.articles_per_page: self.nb_pages = articles.count() / self.articles_per_page filename = 'index.html' while self.cur_page <= self.nb_pages: #print 'Generate ' + filename nodes = dom.getElementsByTagName("*") self.parse(articles, dom, nodes[0]) self.writeIfNotTheSame(output + '/' + filename, nodes[0].toxml('utf8')) self.cur_page = self.cur_page + 1 filename = 'index' + str(self.cur_page) + '.html' dom = parse(src + '/_index.html') filename = output + '/' + filename while os.path.exists(filename): self.addReport('Removing unused ' + filename) os.unlink(filename) filename = filename + '.gz' if os.path.exists(filename): self.addReport('Removing unused ' + filename) os.unlink(filename) self.cur_page = self.cur_page + 1 filename = output + '/index' + str(self.cur_page) + '.html' if not self.somethingWrote: self.addReport('Nothing changed') return self.report