A lot of modifications
This commit is contained in:
		| @@ -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) | ||||
|   | ||||
| @@ -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): | ||||
|   | ||||
| @@ -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') | ||||
|   | ||||
| @@ -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('<pre><![CDATA[', '<pre>') | ||||
|         content = content.replace(']]></pre>', '</pre>') | ||||
|  | ||||
|         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 | ||||
|   | ||||
| @@ -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 = '<a href="' + self.dirname + '/' + self.filename | ||||
|             else: | ||||
|                 href = '<a href="/' + self.dirname + '/' + self.filename | ||||
|         else: | ||||
|             href = '<a href="/' + self.filename | ||||
|  | ||||
|         nav = '' | ||||
|         if self.cur_page != 0: | ||||
|             nav = nav + '<a href="/' + self.filename + '.html"><<</a>  ' | ||||
|             nav = nav + href + '.html"><< First</a>  ' | ||||
|             if self.cur_page == 1: | ||||
|                 nav = nav + '<a href="/' + self.filename + '.html"><</a> ' | ||||
|                 nav = nav + href + '.html">< Prev</a> ' | ||||
|             else: | ||||
|                 nav = nav + '<a href="/' + self.filename + str(self.cur_page) + '.html"><</a> ' | ||||
|                 nav = nav + href + str(self.cur_page-1) + '.html">< Prev</a> ' | ||||
|  | ||||
|         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 + '<a href="/' + self.filename + '.html">1</a> ' | ||||
|                     nav = nav + href + '.html">1</a> ' | ||||
|                 else: | ||||
|                     nav = nav + '<a href="/' + self.filename + str(i) + '.html">' + str(i+1) + '</a> ' | ||||
|                     nav = nav + href + str(i) + '.html">' + str(i+1) + '</a> ' | ||||
|  | ||||
|         if self.cur_page != self.nb_pages: | ||||
|             nav = nav + '<a href="/' + self.filename + str(self.cur_page+1) + '.html">></a>  ' | ||||
|             nav = nav + '<a href="/' + self.filename + str(self.nb_pages) + '.html">>></a>' | ||||
|             nav = nav + href + str(self.cur_page+1) + '.html">Next ></a>  ' | ||||
|             nav = nav + href + str(self.nb_pages) + '.html">Last >></a>' | ||||
|  | ||||
|         new_dom = parseString('<div class="navigation">' + nav + '</div>') | ||||
|         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' | ||||
|   | ||||
		Reference in New Issue
	
	Block a user