Adding pdf support.

This commit is contained in:
Alexis Metaireau 2010-11-06 02:03:32 +00:00
commit 93c46b7519
4 changed files with 45 additions and 9 deletions

View file

@ -4,7 +4,7 @@ import argparse
from pelican.utils import clean_output_dir
from pelican.generators import Generator
from pelican.processors import (ArticlesProcessor, PagesProcessor,
StaticProcessor)
StaticProcessor, PdfProcessor)
parser = argparse.ArgumentParser(description="""A tool to generate a
static blog, with restructured text input files.""")
@ -31,5 +31,6 @@ if __name__ == '__main__':
generator = Generator(args.settings, args.path, args.theme,
args.output, markup)
clean_output_dir(args.output)
generator.run([ArticlesProcessor, PagesProcessor, StaticProcessor])
generator.run([ArticlesProcessor, PagesProcessor, StaticProcessor,
PdfProcessor])
print "Enjoy !"

View file

@ -10,7 +10,7 @@ class Page(object):
"""
mandatory_properties = ('title',)
def __init__(self, content, metadatas={}, settings={}):
def __init__(self, content, metadatas={}, settings={}, filename=None):
self.content = content
for key, value in metadatas.items():
setattr(self, key, value)
@ -19,6 +19,9 @@ class Page(object):
if 'AUTHOR' in settings:
self.author = settings['AUTHOR']
if filename:
self.filename = filename
def check_properties(self):
"""test that each mandatory property is set."""
for prop in self.mandatory_properties:
@ -27,7 +30,11 @@ class Page(object):
@property
def url(self):
return '%s.html' % slugify(self.title)
return '%s.html' % self.slug
@property
def slug(self):
return slugify(self.title)
@property
def summary(self):
@ -49,4 +56,3 @@ def is_valid_content(content, f):
except NameError as e:
print u" [info] Skipping %s: impossible to find informations about '%s'" % (f, e)
return False

View file

@ -1,6 +1,8 @@
from operator import attrgetter
import os
from rst2pdf.createpdf import RstToPdf
from pelican.utils import update_dict, copytree
from pelican.contents import Article, Page, is_valid_content
from pelican.readers import read_file
@ -70,7 +72,8 @@ class ArticlesProcessor(Processor):
if category != '':
metadatas['category'] = unicode(category)
article = Article(content, metadatas, settings=generator.settings)
article = Article(content, metadatas, settings=generator.settings,
filename=f)
if not is_valid_content(article, f):
continue
@ -102,7 +105,8 @@ class PagesProcessor(Processor):
def preprocess(self, context, generator):
for f in generator.get_files(os.sep.join((generator.path, 'pages'))):
content, metadatas = read_file(f)
page = Page(content, metadatas, settings=generator.settings)
page = Page(content, metadatas, settings=generator.settings,
filename=f)
if not is_valid_content(page, f):
continue
self.pages.append(page)
@ -125,3 +129,27 @@ class StaticProcessor(Processor):
copytree(path, generator.theme, generator.output_path)
copytree('pics', generator.path, generator.output_path)
class PdfProcessor(Processor):
"""Generate PDFs on the output dir, for all articles and pages coming from
rst"""
def _create_pdf(self, creator, obj, output_path):
if obj.filename.endswith(".rst"):
creator.createPdf(text=open(obj.filename).read(),
output=os.path.join(output_path, "%s.pdf" % obj.slug))
def process(self, context, generator):
pdf_path = os.path.join(generator.output_path, 'pdf')
try:
os.mkdir(pdf_path)
except OSError:
pass
pdfcreator = RstToPdf(breakside=0, stylesheets=['twelvepoint'])
for article in context['articles']:
self._create_pdf(pdfcreator, article, pdf_path)
for page in context['pages']:
self._create_pdf(pdfcreator, page, pdf_path)

View file

@ -1,13 +1,14 @@
from setuptools import setup
import sys
requires = ['feedgenerator', 'jinja2', 'pygments', 'docutils', 'Markdown']
requires = ['feedgenerator', 'jinja2', 'pygments', 'docutils', 'Markdown',
'rst2pdf']
if sys.version_info < (2,7):
requires.append('argparse')
setup(
name = "pelican",
version = '2.3',
version = '2.4',
url = 'http://alexis.notmyidea.org/pelican/',
author = 'Alexis Metaireau',
author_email = 'alexis@notmyidea.org',