Issue #1009: Moved PdfGenerator to pelican-plugins and added a basic test

This commit is contained in:
Kyle Mahan
2013-08-04 09:37:01 -07:00
parent 0483218326
commit b1f33df20d
4 changed files with 118 additions and 0 deletions

7
pdf/Readme.rst Normal file
View File

@@ -0,0 +1,7 @@
-------------
PDF Generator
-------------
The PDF Generator plugin automatically exports RST articles and pages
as PDF files as part of the site-generation process. PDFs are saved to
output/pdf/

1
pdf/__init__.py Normal file
View File

@@ -0,0 +1 @@
from .pdf import *

69
pdf/pdf.py Normal file
View File

@@ -0,0 +1,69 @@
# -*- coding: utf-8 -*-
'''
PDF Generator
-------
The pdf plugin generates PDF files from RST sources.
'''
from __future__ import unicode_literals, print_function
from pelican import signals
from pelican.generators import Generator
from rst2pdf.createpdf import RstToPdf
import os
import logging
logger = logging.getLogger(__name__)
class PdfGenerator(Generator):
"""Generate PDFs on the output dir, for all articles and pages coming from
rst"""
def __init__(self, *args, **kwargs):
super(PdfGenerator, self).__init__(*args, **kwargs)
pdf_style_path = os.path.join(self.settings['PDF_STYLE_PATH'])
pdf_style = self.settings['PDF_STYLE']
self.pdfcreator = RstToPdf(breakside=0,
stylesheets=[pdf_style],
style_path=[pdf_style_path])
def _create_pdf(self, obj, output_path):
if obj.source_path.endswith('.rst'):
filename = obj.slug + ".pdf"
output_pdf = os.path.join(output_path, filename)
# print('Generating pdf for', obj.source_path, 'in', output_pdf)
with open(obj.source_path) as f:
self.pdfcreator.createPdf(text=f.read(), output=output_pdf)
logger.info(' [ok] writing %s' % output_pdf)
def generate_context(self):
pass
def generate_output(self, writer=None):
# we don't use the writer passed as argument here
# since we write our own files
logger.info(' Generating PDF files...')
pdf_path = os.path.join(self.output_path, 'pdf')
if not os.path.exists(pdf_path):
try:
os.mkdir(pdf_path)
except OSError:
logger.error("Couldn't create the pdf output folder in " +
pdf_path)
for article in self.context['articles']:
self._create_pdf(article, pdf_path)
for page in self.context['pages']:
self._create_pdf(page, pdf_path)
def get_generators(generators):
return PdfGenerator
def register():
signals.get_generators.connect(get_generators)

41
pdf/test_pdf.py Normal file
View File

@@ -0,0 +1,41 @@
import unittest
import os
import locale
import logging
import pdf
from tempfile import mkdtemp
from pelican import Pelican
from pelican.settings import read_settings
from shutil import rmtree
CUR_DIR = os.path.dirname(__file__)
class TestPdfGeneration(unittest.TestCase):
def setUp(self, override=None):
import pdf
self.temp_path = mkdtemp(prefix='pelicantests.')
settings = {
'PATH': os.path.join(os.path.dirname(CUR_DIR), '..', 'test_data', 'content'),
'OUTPUT_PATH': self.temp_path,
'PLUGINS': [pdf],
'LOCALE': locale.normalize('en_US'),
}
if override:
settings.update(override)
self.settings = read_settings(override=settings)
pelican = Pelican(settings=self.settings)
try:
pelican.run()
except ValueError:
logging.warn('Relative links in the form of |filename|images/test.png are not yet handled by the pdf generator')
pass
def tearDown(self):
rmtree(self.temp_path)
def test_existence(self):
assert os.path.exists(os.path.join(self.temp_path, 'pdf', 'this-is-a-super-article.pdf'))