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 cur_article = 0
articles_per_page = 0 articles_per_page = 0
filename = 'index' filename = 'index'
dirname = ''
cur_year = 0 cur_year = 0
def createArchive(self, articles, dom, root, node): def createArchive(self, articles, dom, root, node):
@ -26,15 +27,17 @@ class Archive(Index):
if len(articles) > self.articles_per_page: if len(articles) > self.articles_per_page:
self.nb_pages = 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)): if not os.path.exists(output + self.dirname):
os.mkdir(output + '/archive/' + str(self.cur_year)) os.mkdir(output + self.dirname)
while self.cur_page <= self.nb_pages: while self.cur_page <= self.nb_pages:
#print 'Generate ' + filename #print 'Generate ' + filename
nodes = dom.getElementsByTagName("*") nodes = dom.getElementsByTagName("*")
self.parse(hooks, articles, dom, nodes[0]) nodes[0] = self.parse(src, hooks, articles, dom, nodes[0])
self.writeIfNotTheSame(output + '/archive/' + str(self.cur_year) + '/' + filename, nodes[0].toxml('utf8')) self.writeIfNotTheSame(output + self.dirname + '/' + filename, nodes[0].toxml('utf8'))
self.cur_page = self.cur_page + 1 self.cur_page = self.cur_page + 1
filename = self.filename + str(self.cur_page) + '.html' filename = self.filename + str(self.cur_page) + '.html'
dom = parse(src + '/_archive.html') dom = parse(src + '/_archive.html')
@ -47,7 +50,7 @@ class Archive(Index):
self.addReport('Removing unused ' + filename) self.addReport('Removing unused ' + filename)
os.unlink(filename) os.unlink(filename)
self.cur_page = self.cur_page + 1 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): def generate(self, blog, src, output):
from dynastie.models import Article, Blog from dynastie.models import Article, Blog
@ -78,7 +81,7 @@ class Archive(Index):
else: else:
self.addError('No tag dyn:articles found') 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: if articles.count() != 0:
self.cur_year = int(articles[0].creation_date.year) self.cur_year = int(articles[0].creation_date.year)
@ -93,6 +96,7 @@ class Archive(Index):
if i < nb_articles-1: if i < nb_articles-1:
if articles[i].creation_date.year != articles[i+1].creation_date.year: if articles[i].creation_date.year != articles[i+1].creation_date.year:
dom = parse(src + '/_archive.html') dom = parse(src + '/_archive.html')
my_articles.reverse()
self.createArchives(src, output, dom, hooks, my_articles) self.createArchives(src, output, dom, hooks, my_articles)
self.cur_year = int(articles[i+1].creation_date.year) self.cur_year = int(articles[i+1].creation_date.year)
#print 'New year ' + str(self.cur_year) #print 'New year ' + str(self.cur_year)

View File

@ -1,38 +1,22 @@
import os import os
from xml.dom.minidom import parse, parseString from xml.dom.minidom import parse, parseString
from dynastie.generators.generator import DynastieGenerator from dynastie.generators.generator import DynastieGenerator
from dynastie.generators.index import Index
from django.db import models from django.db import models
# TODO : content class Article(Index):
class Article(DynastieGenerator): def _createArticle(self, article, dom, article_elem, root):
self.createArticle(article, dom, article_elem, root)
def createArticle(self, article, dom, article_elem, root): article_nodes = dom.getElementsByTagNameNS(self.URI, "article")
values = {} article_elem = article_nodes[0]
values['title'] = article.title article_elem.parentNode.removeChild(article_elem)
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 generate(self, blog, src, output): def generate(self, blog, src, output):
from dynastie.models import Article, Blog from dynastie.models import Article, Blog
hooks = {'article' : self._createArticle}
if not os.path.exists(src + '/_article.html'): if not os.path.exists(src + '/_article.html'):
self.addError('No _article.html found, exiting') self.addError('No _article.html found, exiting')
return self.report return self.report
@ -51,7 +35,7 @@ class Article(DynastieGenerator):
for article in articles: for article in articles:
#print 'Generate ' + filename #print 'Generate ' + filename
nodes = dom.getElementsByTagName("*") nodes = dom.getElementsByTagName("*")
self.parse(article, dom, nodes[0]) nodes[0] = self.parse(src, hooks, article, dom, nodes[0])
filename = output + '/article/' filename = output + '/article/'
filename = filename + article.creation_date.strftime("%Y") + '/' + article.creation_date.strftime("%m") + '/' filename = filename + article.creation_date.strftime("%Y") + '/' + article.creation_date.strftime("%m") + '/'
if not os.path.exists(filename): if not os.path.exists(filename):

View File

@ -11,6 +11,7 @@ class Category(Index):
cur_article = 0 cur_article = 0
articles_per_page = 0 articles_per_page = 0
filename = 'index' filename = 'index'
dirname = ''
cur_category = None cur_category = None
def createCategory(self, articles, dom, root, node): def createCategory(self, articles, dom, root, node):
@ -53,23 +54,26 @@ class Category(Index):
for category in categories: for category in categories:
self.cur_category = category self.cur_category = category
filename = self.filename + '.html' 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.nb_pages = 0
self.cur_page = 0 self.cur_page = 0
self.cur_article = 0 self.cur_article = 0
self.dirname = '/category/' + category.name_slug
if articles.count() > self.articles_per_page: if articles.count() > self.articles_per_page:
self.nb_pages = 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): if not os.path.exists(output + self.dirname):
os.mkdir(output + '/category/' + category.name_slug) os.mkdir(output + self.dirname)
while self.cur_page <= self.nb_pages: while self.cur_page <= self.nb_pages:
#print 'Generate ' + filename #print 'Generate ' + filename
nodes = dom.getElementsByTagName("*") nodes = dom.getElementsByTagName("*")
self.parse(hooks, articles, dom, nodes[0]) nodes[0] = self.parse(src, hooks, articles, dom, nodes[0])
self.writeIfNotTheSame(output + '/category/' + category.name_slug + '/' + filename, nodes[0].toxml('utf8')) self.writeIfNotTheSame(output + self.dirname + '/' + filename, nodes[0].toxml('utf8'))
self.cur_page = self.cur_page + 1 self.cur_page = self.cur_page + 1
filename = self.filename + str(self.cur_page) + '.html' filename = self.filename + str(self.cur_page) + '.html'
dom = parse(src + '/_category.html') dom = parse(src + '/_category.html')
@ -82,7 +86,7 @@ class Category(Index):
self.addReport('Removing unused ' + filename) self.addReport('Removing unused ' + filename)
os.unlink(filename) os.unlink(filename)
self.cur_page = self.cur_page + 1 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: if not self.somethingWrote:
self.addReport('Nothing changed') self.addReport('Nothing changed')

View File

@ -2,6 +2,8 @@ import os
import hashlib import hashlib
import gzip import gzip
from xml.dom import * from xml.dom import *
from xml.dom.minidom import parse
from xml.parsers.expat import *
class DynastieGenerator: class DynastieGenerator:
@ -31,7 +33,14 @@ class DynastieGenerator:
def generate(self, blog, src, output): def generate(self, blog, src, output):
return return
def removeCDATA(self, content):
content = content.replace('<pre><![CDATA[', '<pre>')
content = content.replace(']]></pre>', '</pre>')
return content
def writeIfNotTheSame(self, filename, content): def writeIfNotTheSame(self, filename, content):
content = self.removeCDATA(content)
if os.path.exists(filename): if os.path.exists(filename):
src_md5 = hashlib.md5() src_md5 = hashlib.md5()
f = open(filename,'rb') f = open(filename,'rb')
@ -99,13 +108,71 @@ class DynastieGenerator:
def replaceByText(self, dom, root, node, content): def replaceByText(self, dom, root, node, content):
new_node = dom.createTextNode(content) new_node = dom.createTextNode(content)
root.replaceChild(new_node, node) root.replaceChild(new_node, node)
def parse(self, hooks, articles, dom, root): def _parse(self, hooks, articles, dom, root):
for node in root.childNodes: for node in root.childNodes:
if node.prefix == 'dyn': if node.prefix == 'dyn':
if node.localName in hooks: if node.localName in hooks:
hooks[node.localName](articles, dom, root, node) hooks[node.localName](articles, dom, root, node)
if node.hasChildNodes(): if node.hasChildNodes():
self.parse(hooks, articles, dom, node) self._parse(hooks, articles, dom, node)
return 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 os
import datetime import datetime
import xml
from xml.parsers.expat import * from xml.parsers.expat import *
from xml.dom.minidom import parse, parseString from xml.dom.minidom import parse, parseString
from dynastie.generators.generator import DynastieGenerator from dynastie.generators.generator import DynastieGenerator
@ -12,24 +13,33 @@ class Index(DynastieGenerator):
cur_article = 0 cur_article = 0
articles_per_page = 0 articles_per_page = 0
filename = 'index' filename = 'index'
dirname = ''
def createNavigation(self, articles, dom, root, node): def createNavigation(self, articles, dom, root, node):
if self.nb_pages == 0 or self.nb_pages == 1: if self.nb_pages == 0 or self.nb_pages == 1:
return '' 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 = '' nav = ''
if self.cur_page != 0: 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: if self.cur_page == 1:
nav = nav + '<a href="/' + self.filename + '.html">&lt;</a> ' nav = nav + href + '.html">&lt; Prev</a> '
else: 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 end = start + 10
if end > self.nb_pages+1: if end > self.nb_pages+1:
end = self.nb_pages+1 end = self.nb_pages
if (end-start) < 10: if (end-start) < 10:
start = end - 10 start = end - 10
@ -41,13 +51,13 @@ class Index(DynastieGenerator):
nav = nav + str(i+1) + ' ' nav = nav + str(i+1) + ' '
else: else:
if i == 0: if i == 0:
nav = nav + '<a href="/' + self.filename + '.html">1</a> ' nav = nav + href + '.html">1</a> '
else: 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: if self.cur_page != self.nb_pages:
nav = nav + '<a href="/' + self.filename + str(self.cur_page+1) + '.html">&gt;</a> ' nav = nav + href + str(self.cur_page+1) + '.html">Next &gt;</a> '
nav = nav + '<a href="/' + self.filename + str(self.nb_pages) + '.html">&gt;&gt;</a>' nav = nav + href + str(self.nb_pages) + '.html">Last &gt;&gt;</a>'
new_dom = parseString('<div class="navigation">' + nav + '</div>') new_dom = parseString('<div class="navigation">' + nav + '</div>')
new_node = new_dom.getElementsByTagName('div')[0] new_node = new_dom.getElementsByTagName('div')[0]
@ -77,8 +87,10 @@ class Index(DynastieGenerator):
dom2 = parseString(content) dom2 = parseString(content)
except ExpatError, e: except ExpatError, e:
self.addError('Error parsing ' + filename) self.addError('Error parsing ' + filename)
print filename
print e
pass pass
self.simpleTransform(values, dom, article_elem, root) self.simpleTransform(values, dom, article_elem, root)
content_nodes = article_elem.getElementsByTagName("div") content_nodes = article_elem.getElementsByTagName("div")
@ -112,6 +124,8 @@ class Index(DynastieGenerator):
else: else:
nb_recents = 5 nb_recents = 5
recents_elem = self.createElement(dom, 'recents') recents_elem = self.createElement(dom, 'recents')
for child in node.childNodes:
recents_elem.appendChild(child.cloneNode(True))
list_elem = dom.createElement('ul') list_elem = dom.createElement('ul')
for i in range(0, nb_recents): for i in range(0, nb_recents):
article_elem = dom.createElement('li') article_elem = dom.createElement('li')
@ -155,19 +169,18 @@ class Index(DynastieGenerator):
now = datetime.datetime.now() now = datetime.datetime.now()
cur_year = now.year 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: if articles.count() < self.articles_per_page:
articles = Article.objects.all()[:self.articles_per_page] articles = Article.objects.all()[:self.articles_per_page]
if articles.count() > self.articles_per_page: if articles.count() > self.articles_per_page:
self.nb_pages = articles.count() / self.articles_per_page self.nb_pages = articles.count() / self.articles_per_page
filename = 'index.html' filename = 'index.html'
while self.cur_page <= self.nb_pages: while self.cur_page <= self.nb_pages:
#print 'Generate ' + filename #print 'Generate ' + filename
nodes = dom.getElementsByTagName("*") 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.writeIfNotTheSame(output + '/' + filename, nodes[0].toxml(encoding='utf-8'))
self.cur_page = self.cur_page + 1 self.cur_page = self.cur_page + 1
filename = 'index' + str(self.cur_page) + '.html' filename = 'index' + str(self.cur_page) + '.html'

View File

@ -25,8 +25,8 @@ class Blog(models.Model):
report = '' report = ''
def create_paths(self): def create_paths(self):
self.src_path = 'sites/' + self.name self.src_path = '/home/soutade/Projets_Perso/dynastie2/dynastie/dynastie/' + 'sites/' + self.name
self.output_path = 'sites/' + self.name + '_output' self.output_path = '/home/soutade/Projets_Perso/dynastie2/dynastie/dynastie/' + 'sites/' + self.name + '_output'
def create(self): def create(self):
self.create_paths() self.create_paths()

View File

@ -4,7 +4,7 @@ DEBUG = True
TEMPLATE_DEBUG = DEBUG TEMPLATE_DEBUG = DEBUG
ADMINS = ( ADMINS = (
# ('Your Name', 'your_email@example.com'), ('Gregory Soutade', 'gregory@soutade.fr'),
) )
MANAGERS = ADMINS MANAGERS = ADMINS
@ -27,7 +27,7 @@ DATABASES = {
# timezone as the operating system. # timezone as the operating system.
# If running in a Windows environment this must be set to the same as your # If running in a Windows environment this must be set to the same as your
# system time zone. # system time zone.
TIME_ZONE = 'America/Chicago' TIME_ZONE = 'Europe/Paris'
# Language code for this installation. All choices can be found here: # Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html # http://www.i18nguy.com/unicode/language-identifiers.html
@ -105,7 +105,7 @@ ROOT_URLCONF = 'dynastie.urls'
WSGI_APPLICATION = 'dynastie.wsgi.application' WSGI_APPLICATION = 'dynastie.wsgi.application'
TEMPLATE_DIRS = ( 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". # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
# Always use forward slashes, even on Windows. # Always use forward slashes, even on Windows.
# Don't forget to use absolute paths, not relative paths. # Don't forget to use absolute paths, not relative paths.