import os
import datetime
import xml
from xml.parsers.expat import *
from xml.dom.minidom import parse, parseString
from dynastie.generators.generator import DynastieGenerator
from django.db import models
class Index(DynastieGenerator):
cur_page = 0
nb_pages = 0
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 = '<< First '
if self.cur_page == 1:
nav = nav + href + '.html">< Prev '
else:
nav = nav + href + str(self.cur_page-1) + '.html">< Prev '
start = self.cur_page-5
if start < 0:
start = 0
end = start + 10
if end > self.nb_pages:
end = self.nb_pages
for i in range(start, end):
if i == self.cur_page:
nav = nav + str(i+1) + ' '
else:
if i == 0:
nav = nav + href + '.html">1 '
else:
nav = nav + href + str(i) + '.html">' + str(i+1) + ' '
if self.cur_page < self.nb_pages-1:
nav = nav + href + str(self.cur_page+1) + '.html">Next > '
nav = nav + href + str(self.nb_pages-1) + '.html">Last >>'
new_dom = parseString('
' + nav + '
')
new_node = new_dom.getElementsByTagName('div')[0]
root.replaceChild(new_node.cloneNode(True), node)
def createArticle(self, article, dom, article_elem, root):
values = {}
values['title'] = self.createLinkElem(dom, article.getPath(), article.title)
values['author'] = article.author.first_name + ' ' + article.author.last_name
values['date'] = article.creation_date.strftime("%A, %d %B %Y %H:%m")
values['article_content'] = ''
blog = article.blog
blog.create_paths()
filename = blog.src_path + '/_articles/' + str(article.id)
if not os.path.exists(filename):
self.addError('File does not exists ' + filename)
return
f = open(filename, 'rb')
content = '' + f.read() + '
'
f.close()
dom2 = None
try:
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")
post_transform = ('article_content')
for content_node in content_nodes:
the_class = content_node.getAttribute('class')
if not the_class in post_transform:
continue
if the_class == 'article_content' and dom2 != None:
for article_node in dom2.firstChild.childNodes:
content_node.appendChild(article_node)
def createArticles(self, articles, dom, root, node):
articles_elem = self.createElement(dom, 'articles')
for i in range(0, self.articles_per_page):
article_elem = self.createElement(dom, 'article')
if len(articles) > 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 == len(articles):
break
root.replaceChild(articles_elem, node)
def createRecents(self, articles, dom, root, node):
if node.hasAttribute("limit"):
nb_recents = int(node.getAttribute("limit"))
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')
if self.cur_article+i < len(articles):
article = articles[self.cur_article+i]
link_elem = self.createLinkElem(dom, article.getPath(), article.title)
article_elem.appendChild(link_elem)
else:
break
list_elem.appendChild(article_elem)
recents_elem.appendChild(list_elem)
root.replaceChild(recents_elem, node)
def generate(self, blog, src, output):
from dynastie.models import Article, Blog
hooks = {'articles' : self.createArticles,
'navigation' : self.createNavigation,
'recents' : self.createRecents}
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:
if article_nodes[0].hasAttribute("limit"):
self.articles_per_page = int(article_nodes[0].getAttribute("limit"))
else:
self.articles_per_page = 5
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, 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 = self.computeNbPages(articles.count(), self.articles_per_page)
filename = 'index.html'
while self.cur_page <= self.nb_pages:
#print 'Generate ' + filename
nodes = dom.getElementsByTagName("*")
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'
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