mirror of
https://github.com/getpelican/pelican.git
synced 2025-10-15 20:28:56 +02:00
Adding pdf support.
This commit is contained in:
parent
f7cbef6393
commit
93c46b7519
4 changed files with 45 additions and 9 deletions
|
|
@ -4,7 +4,7 @@ import argparse
|
||||||
from pelican.utils import clean_output_dir
|
from pelican.utils import clean_output_dir
|
||||||
from pelican.generators import Generator
|
from pelican.generators import Generator
|
||||||
from pelican.processors import (ArticlesProcessor, PagesProcessor,
|
from pelican.processors import (ArticlesProcessor, PagesProcessor,
|
||||||
StaticProcessor)
|
StaticProcessor, PdfProcessor)
|
||||||
|
|
||||||
parser = argparse.ArgumentParser(description="""A tool to generate a
|
parser = argparse.ArgumentParser(description="""A tool to generate a
|
||||||
static blog, with restructured text input files.""")
|
static blog, with restructured text input files.""")
|
||||||
|
|
@ -31,5 +31,6 @@ if __name__ == '__main__':
|
||||||
generator = Generator(args.settings, args.path, args.theme,
|
generator = Generator(args.settings, args.path, args.theme,
|
||||||
args.output, markup)
|
args.output, markup)
|
||||||
clean_output_dir(args.output)
|
clean_output_dir(args.output)
|
||||||
generator.run([ArticlesProcessor, PagesProcessor, StaticProcessor])
|
generator.run([ArticlesProcessor, PagesProcessor, StaticProcessor,
|
||||||
|
PdfProcessor])
|
||||||
print "Enjoy !"
|
print "Enjoy !"
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ class Page(object):
|
||||||
"""
|
"""
|
||||||
mandatory_properties = ('title',)
|
mandatory_properties = ('title',)
|
||||||
|
|
||||||
def __init__(self, content, metadatas={}, settings={}):
|
def __init__(self, content, metadatas={}, settings={}, filename=None):
|
||||||
self.content = content
|
self.content = content
|
||||||
for key, value in metadatas.items():
|
for key, value in metadatas.items():
|
||||||
setattr(self, key, value)
|
setattr(self, key, value)
|
||||||
|
|
@ -19,6 +19,9 @@ class Page(object):
|
||||||
if 'AUTHOR' in settings:
|
if 'AUTHOR' in settings:
|
||||||
self.author = settings['AUTHOR']
|
self.author = settings['AUTHOR']
|
||||||
|
|
||||||
|
if filename:
|
||||||
|
self.filename = filename
|
||||||
|
|
||||||
def check_properties(self):
|
def check_properties(self):
|
||||||
"""test that each mandatory property is set."""
|
"""test that each mandatory property is set."""
|
||||||
for prop in self.mandatory_properties:
|
for prop in self.mandatory_properties:
|
||||||
|
|
@ -27,7 +30,11 @@ class Page(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def url(self):
|
def url(self):
|
||||||
return '%s.html' % slugify(self.title)
|
return '%s.html' % self.slug
|
||||||
|
|
||||||
|
@property
|
||||||
|
def slug(self):
|
||||||
|
return slugify(self.title)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def summary(self):
|
def summary(self):
|
||||||
|
|
@ -49,4 +56,3 @@ def is_valid_content(content, f):
|
||||||
except NameError as e:
|
except NameError as e:
|
||||||
print u" [info] Skipping %s: impossible to find informations about '%s'" % (f, e)
|
print u" [info] Skipping %s: impossible to find informations about '%s'" % (f, e)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,8 @@
|
||||||
from operator import attrgetter
|
from operator import attrgetter
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
from rst2pdf.createpdf import RstToPdf
|
||||||
|
|
||||||
from pelican.utils import update_dict, copytree
|
from pelican.utils import update_dict, copytree
|
||||||
from pelican.contents import Article, Page, is_valid_content
|
from pelican.contents import Article, Page, is_valid_content
|
||||||
from pelican.readers import read_file
|
from pelican.readers import read_file
|
||||||
|
|
@ -70,7 +72,8 @@ class ArticlesProcessor(Processor):
|
||||||
if category != '':
|
if category != '':
|
||||||
metadatas['category'] = unicode(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):
|
if not is_valid_content(article, f):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
@ -102,7 +105,8 @@ class PagesProcessor(Processor):
|
||||||
def preprocess(self, context, generator):
|
def preprocess(self, context, generator):
|
||||||
for f in generator.get_files(os.sep.join((generator.path, 'pages'))):
|
for f in generator.get_files(os.sep.join((generator.path, 'pages'))):
|
||||||
content, metadatas = read_file(f)
|
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):
|
if not is_valid_content(page, f):
|
||||||
continue
|
continue
|
||||||
self.pages.append(page)
|
self.pages.append(page)
|
||||||
|
|
@ -125,3 +129,27 @@ class StaticProcessor(Processor):
|
||||||
copytree(path, generator.theme, generator.output_path)
|
copytree(path, generator.theme, generator.output_path)
|
||||||
copytree('pics', generator.path, 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)
|
||||||
|
|
|
||||||
5
setup.py
5
setup.py
|
|
@ -1,13 +1,14 @@
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
requires = ['feedgenerator', 'jinja2', 'pygments', 'docutils', 'Markdown']
|
requires = ['feedgenerator', 'jinja2', 'pygments', 'docutils', 'Markdown',
|
||||||
|
'rst2pdf']
|
||||||
if sys.version_info < (2,7):
|
if sys.version_info < (2,7):
|
||||||
requires.append('argparse')
|
requires.append('argparse')
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
name = "pelican",
|
name = "pelican",
|
||||||
version = '2.3',
|
version = '2.4',
|
||||||
url = 'http://alexis.notmyidea.org/pelican/',
|
url = 'http://alexis.notmyidea.org/pelican/',
|
||||||
author = 'Alexis Metaireau',
|
author = 'Alexis Metaireau',
|
||||||
author_email = 'alexis@notmyidea.org',
|
author_email = 'alexis@notmyidea.org',
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue