A lot of modifications

This commit is contained in:
Grégory Soutadé 2012-08-14 21:26:48 +02:00
parent cc29c0a9d7
commit 6fb23e62fb
7 changed files with 132 additions and 60 deletions

View File

@ -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)

View File

@ -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):

View File

@ -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')

View File

@ -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

View File

@ -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">&lt;&lt;</a> '
nav = nav + href + '.html">&lt;&lt; First</a> '
if self.cur_page == 1:
nav = nav + '<a href="/' + self.filename + '.html">&lt;</a> '
nav = nav + href + '.html">&lt; Prev</a> '
else:
nav = nav + '<a href="/' + self.filename + str(self.cur_page) + '.html">&lt;</a> '
nav = nav + href + str(self.cur_page-1) + '.html">&lt; 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">&gt;</a> '
nav = nav + '<a href="/' + self.filename + str(self.nb_pages) + '.html">&gt;&gt;</a>'
nav = nav + href + str(self.cur_page+1) + '.html">Next &gt;</a> '
nav = nav + href + str(self.nb_pages) + '.html">Last &gt;&gt;</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'

View File

@ -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()

View File

@ -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.