diff --git a/generators/archive.py b/generators/archive.py index 3b1e901..eba5ce3 100644 --- a/generators/archive.py +++ b/generators/archive.py @@ -12,6 +12,7 @@ class Archive(Index): cur_article = 0 articles_per_page = 0 filename = 'index' + dirname = '' cur_year = 0 def createArchive(self, articles, dom, root, node): @@ -26,15 +27,17 @@ class Archive(Index): if len(articles) > self.articles_per_page: self.nb_pages = len(articles) / self.articles_per_page + + self.dirname = '/archive/' + str(self.cur_year) - if not os.path.exists(output + '/archive/' + str(self.cur_year)): - os.mkdir(output + '/archive/' + str(self.cur_year)) + if not os.path.exists(output + self.dirname): + os.mkdir(output + self.dirname) while self.cur_page <= self.nb_pages: #print 'Generate ' + filename nodes = dom.getElementsByTagName("*") - self.parse(hooks, articles, dom, nodes[0]) - self.writeIfNotTheSame(output + '/archive/' + str(self.cur_year) + '/' + filename, nodes[0].toxml('utf8')) + nodes[0] = self.parse(src, hooks, articles, dom, nodes[0]) + self.writeIfNotTheSame(output + self.dirname + '/' + filename, nodes[0].toxml('utf8')) self.cur_page = self.cur_page + 1 filename = self.filename + str(self.cur_page) + '.html' dom = parse(src + '/_archive.html') @@ -47,7 +50,7 @@ class Archive(Index): self.addReport('Removing unused ' + filename) os.unlink(filename) self.cur_page = self.cur_page + 1 - filename = output + '/archive/' + str(self.cur_year) + '/' + self.filename + str(self.cur_page) + '.html' + filename = output + self.dirname + '/' + self.filename + str(self.cur_page) + '.html' def generate(self, blog, src, output): from dynastie.models import Article, Blog @@ -78,7 +81,7 @@ class Archive(Index): else: self.addError('No tag dyn:articles found') - articles = Article.objects.all().order_by('creation_date') + articles = Article.objects.filter(published=True, front_page=True).order_by('creation_date') if articles.count() != 0: self.cur_year = int(articles[0].creation_date.year) @@ -93,6 +96,7 @@ class Archive(Index): if i < nb_articles-1: if articles[i].creation_date.year != articles[i+1].creation_date.year: dom = parse(src + '/_archive.html') + my_articles.reverse() self.createArchives(src, output, dom, hooks, my_articles) self.cur_year = int(articles[i+1].creation_date.year) #print 'New year ' + str(self.cur_year) diff --git a/generators/article.py b/generators/article.py index 79eea68..dd226d7 100644 --- a/generators/article.py +++ b/generators/article.py @@ -1,38 +1,22 @@ 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 -# TODO : content +class Article(Index): -class Article(DynastieGenerator): - - def createArticle(self, article, dom, article_elem, root): - values = {} - values['title'] = article.title - values['author'] = article.author.first_name - if article.creation_date != None: - values['date'] = article.creation_date.strftime("%d/%m/%Y") - values['content'] = '' - - self.simpleTransform(values, dom, article_elem, root) - - def parse(self, article, dom, root): - for node in root.childNodes: - if node.prefix == 'dyn': - if node.localName == 'content': - article_elem = self.createElement(dom, 'article') - self.createArticle(article, dom, article_elem, node) - root.replaceChild(article_elem, node) - - continue - if node.hasChildNodes(): - self.parse(article, dom, node) - return + def _createArticle(self, article, dom, article_elem, root): + self.createArticle(article, dom, article_elem, root) + article_nodes = dom.getElementsByTagNameNS(self.URI, "article") + article_elem = article_nodes[0] + article_elem.parentNode.removeChild(article_elem) def generate(self, blog, src, output): from dynastie.models import Article, Blog + hooks = {'article' : self._createArticle} + if not os.path.exists(src + '/_article.html'): self.addError('No _article.html found, exiting') return self.report @@ -51,7 +35,7 @@ class Article(DynastieGenerator): for article in articles: #print 'Generate ' + filename nodes = dom.getElementsByTagName("*") - self.parse(article, dom, nodes[0]) + nodes[0] = self.parse(src, hooks, article, dom, nodes[0]) filename = output + '/article/' filename = filename + article.creation_date.strftime("%Y") + '/' + article.creation_date.strftime("%m") + '/' if not os.path.exists(filename): diff --git a/generators/category.py b/generators/category.py index e023fee..aae2d88 100644 --- a/generators/category.py +++ b/generators/category.py @@ -11,6 +11,7 @@ class Category(Index): cur_article = 0 articles_per_page = 0 filename = 'index' + dirname = '' cur_category = None def createCategory(self, articles, dom, root, node): @@ -53,23 +54,26 @@ class Category(Index): for category in categories: self.cur_category = category filename = self.filename + '.html' - articles = Article.objects.filter(category__exact=category).order_by('-creation_date') + articles = Article.objects.filter(category__exact=category, published=True).order_by('-creation_date') self.nb_pages = 0 self.cur_page = 0 self.cur_article = 0 + self.dirname = '/category/' + category.name_slug + if articles.count() > self.articles_per_page: self.nb_pages = articles.count() / self.articles_per_page - if not os.path.exists(output + '/category/' + category.name_slug): - os.mkdir(output + '/category/' + category.name_slug) + if not os.path.exists(output + self.dirname): + os.mkdir(output + self.dirname) + while self.cur_page <= self.nb_pages: #print 'Generate ' + filename nodes = dom.getElementsByTagName("*") - self.parse(hooks, articles, dom, nodes[0]) - self.writeIfNotTheSame(output + '/category/' + category.name_slug + '/' + filename, nodes[0].toxml('utf8')) + nodes[0] = self.parse(src, hooks, articles, dom, nodes[0]) + self.writeIfNotTheSame(output + self.dirname + '/' + filename, nodes[0].toxml('utf8')) self.cur_page = self.cur_page + 1 filename = self.filename + str(self.cur_page) + '.html' dom = parse(src + '/_category.html') @@ -82,7 +86,7 @@ class Category(Index): self.addReport('Removing unused ' + filename) os.unlink(filename) self.cur_page = self.cur_page + 1 - filename = output + '/category/' + category.name_slug + '/' + self.filename + str(self.cur_page) + '.html' + filename = output + self.dirname + '/' + self.filename + str(self.cur_page) + '.html' if not self.somethingWrote: self.addReport('Nothing changed') diff --git a/generators/generator.py b/generators/generator.py index b880c63..fabd228 100644 --- a/generators/generator.py +++ b/generators/generator.py @@ -2,6 +2,8 @@ import os import hashlib import gzip from xml.dom import * +from xml.dom.minidom import parse +from xml.parsers.expat import * class DynastieGenerator: @@ -31,7 +33,14 @@ class DynastieGenerator: def generate(self, blog, src, output): return + def removeCDATA(self, content): + content = content.replace('
')
+        content = content.replace(']]>
', '') + + return content + def writeIfNotTheSame(self, filename, content): + content = self.removeCDATA(content) if os.path.exists(filename): src_md5 = hashlib.md5() f = open(filename,'rb') @@ -99,13 +108,71 @@ class DynastieGenerator: def replaceByText(self, dom, root, node, content): new_node = dom.createTextNode(content) root.replaceChild(new_node, node) - - def parse(self, hooks, articles, dom, root): + + def _parse(self, hooks, articles, dom, root): for node in root.childNodes: if node.prefix == 'dyn': if node.localName in hooks: hooks[node.localName](articles, dom, root, node) - if node.hasChildNodes(): - self.parse(hooks, articles, dom, node) + self._parse(hooks, articles, dom, node) return + + def parse(self, src, hooks, articles, dom, root): + bases = dom.getElementsByTagNameNS(self.URI, 'base') + + if len(bases) == 0: + self._parse(hooks, articles, dom, root) + return root + + if len(bases) != 1: + addError('More than one base defined') + return root + + base = bases[0] + + if not base.hasAttribute('file'): + addError('No \'file\' attribute defined') + return root + filename = base.getAttribute('file') + + if not base.hasAttribute('block'): + addError('No \'block\' attribute defined') + return root + target_block = base.getAttribute('block') + + if not os.path.exists(src + '/' + filename): + addError('Base ' + filename + ' doesn\'t exists') + return root + + dom2 = root + try: + dom2 = parse(src + '/' + filename) + except ExpatError, e: + self.addError('Error parsing ' + src + '/' + filename) + return root + + blocks = dom2.getElementsByTagNameNS(self.URI, 'block') + block_found = False + for block in blocks: + if not block.hasAttribute('name'): + addError('block has no attribute \'name\' in ' + filename) + return root + blockname = block.getAttribute('name') + if blockname != target_block: + continue + + for child in root.childNodes: + block.parentNode.appendChild(child.cloneNode(True)) + block.parentNode.removeChild(block) + block_found = True + + if not block_found: + addError('Block ' + target_block + ' not found in ' + src + '/' + filename) + return root + + root = dom2.firstChild + + self.parse(src, hooks, articles, dom2, root) + + return root diff --git a/generators/index.py b/generators/index.py index 94d9ddf..c5f9372 100644 --- a/generators/index.py +++ b/generators/index.py @@ -1,5 +1,6 @@ import os import datetime +import xml from xml.parsers.expat import * from xml.dom.minidom import parse, parseString from dynastie.generators.generator import DynastieGenerator @@ -12,24 +13,33 @@ class Index(DynastieGenerator): cur_article = 0 articles_per_page = 0 filename = 'index' + dirname = '' def createNavigation(self, articles, dom, root, node): if self.nb_pages == 0 or self.nb_pages == 1: return '' + if self.dirname != '': + if self.dirname.startswith('/'): + href = '<< ' + nav = nav + href + '.html"><< First ' if self.cur_page == 1: - nav = nav + '< ' + nav = nav + href + '.html">< Prev ' else: - nav = nav + '< ' + nav = nav + href + str(self.cur_page-1) + '.html">< Prev ' - start = (self.cur_page/5)*5 + start = int(self.cur_page/self.articles_per_page) end = start + 10 if end > self.nb_pages+1: - end = self.nb_pages+1 + end = self.nb_pages if (end-start) < 10: start = end - 10 @@ -41,13 +51,13 @@ class Index(DynastieGenerator): nav = nav + str(i+1) + ' ' else: if i == 0: - nav = nav + '1 ' + nav = nav + href + '.html">1 ' else: - nav = nav + '' + str(i+1) + ' ' + nav = nav + href + str(i) + '.html">' + str(i+1) + ' ' if self.cur_page != self.nb_pages: - nav = nav + '> ' - nav = nav + '>>' + nav = nav + href + str(self.cur_page+1) + '.html">Next > ' + nav = nav + href + str(self.nb_pages) + '.html">Last >>' new_dom = parseString('') new_node = new_dom.getElementsByTagName('div')[0] @@ -77,8 +87,10 @@ class Index(DynastieGenerator): dom2 = parseString(content) except ExpatError, e: self.addError('Error parsing ' + filename) + print filename + print e pass - + self.simpleTransform(values, dom, article_elem, root) content_nodes = article_elem.getElementsByTagName("div") @@ -112,6 +124,8 @@ class Index(DynastieGenerator): else: nb_recents = 5 recents_elem = self.createElement(dom, 'recents') + for child in node.childNodes: + recents_elem.appendChild(child.cloneNode(True)) list_elem = dom.createElement('ul') for i in range(0, nb_recents): article_elem = dom.createElement('li') @@ -155,19 +169,18 @@ class Index(DynastieGenerator): now = datetime.datetime.now() cur_year = now.year - articles = Article.objects.filter(creation_date__year=cur_year).order_by('-creation_date') + articles = Article.objects.filter(creation_date__year=cur_year, published=True, front_page=True).order_by('-creation_date') 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(hooks, articles, dom, nodes[0]) + nodes[0] = self.parse(src, hooks, articles, dom, nodes[0]) self.writeIfNotTheSame(output + '/' + filename, nodes[0].toxml(encoding='utf-8')) self.cur_page = self.cur_page + 1 filename = 'index' + str(self.cur_page) + '.html' diff --git a/models.py b/models.py index 2b92ece..38c111d 100644 --- a/models.py +++ b/models.py @@ -25,8 +25,8 @@ class Blog(models.Model): report = '' def create_paths(self): - self.src_path = 'sites/' + self.name - self.output_path = 'sites/' + self.name + '_output' + self.src_path = '/home/soutade/Projets_Perso/dynastie2/dynastie/dynastie/' + 'sites/' + self.name + self.output_path = '/home/soutade/Projets_Perso/dynastie2/dynastie/dynastie/' + 'sites/' + self.name + '_output' def create(self): self.create_paths() diff --git a/settings.py b/settings.py index 06005d0..d586285 100644 --- a/settings.py +++ b/settings.py @@ -4,7 +4,7 @@ DEBUG = True TEMPLATE_DEBUG = DEBUG ADMINS = ( - # ('Your Name', 'your_email@example.com'), + ('Gregory Soutade', 'gregory@soutade.fr'), ) MANAGERS = ADMINS @@ -27,7 +27,7 @@ DATABASES = { # timezone as the operating system. # If running in a Windows environment this must be set to the same as your # system time zone. -TIME_ZONE = 'America/Chicago' +TIME_ZONE = 'Europe/Paris' # Language code for this installation. All choices can be found here: # http://www.i18nguy.com/unicode/language-identifiers.html @@ -105,7 +105,7 @@ ROOT_URLCONF = 'dynastie.urls' WSGI_APPLICATION = 'dynastie.wsgi.application' TEMPLATE_DIRS = ( - "/home/soutade/Projets_Perso/dynastie2/dynastie/dynastie" + "/home/soutade/Projets_Perso/dynastie2/dynastie/dynastie/" # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". # Always use forward slashes, even on Windows. # Don't forget to use absolute paths, not relative paths.