#!/usr/bin/env python # -*- coding: utf-8 -*- import os import re import pandoc from tempfile import NamedTemporaryFile from panfry.util import * from panfry.page import TextFile, Page class Document: def __init__(self, path): self.src_path = path self.meta = self.get_meta(path) self.pages = self.get_pages(path) css_file = 'css/style.css' workdir = 'stdocs-work' @property def title(self): if self.header.firstline.startswith('%'): return self.header.firstline.split('%')[1].strip() else: return pages[0].title def get_pages(self, path): pages = [] filelist = self.toc.lines print filelist for filename in filelist: print("Reading in %s..." % filename) if not filename: # blank line in toc print("WARNING: %s contains blank lines" % self.toc.filename) continue source = read_file(os.path.join(path, filename)) if source: pages.append(Page(filename, source)) else: print("WARNING: Page: %s not found or is empty." % filename) return pages def get_meta(self, path): metafiles = ['TOC', 'HEADER'] meta = {} for filename in metafiles: source = read_file(os.path.join(path, filename)) if source: metafile = TextFile(filename, source) setattr(self, filename.lower(), metafile) else: print("!E: %s not found or is empty. Aborting..." % filename) exit(1) return meta def set_templater(self, templater): self.templater = templater def next_page(self, page): try: idx = self.pages.index(page) except: return '' if idx >= len(self.pages) - 1: return '' return self.pages[idx+1] def prev_page(self, page): try: idx = self.pages.index(page) except: return '' if idx == 0: return '' return self.pages[idx-1] @property def toc_links(self): ''' Returns a list of dictionaries. Each dictionary element contains a page title and the html file name. ''' links = [] for page in self.pages: title, level = page.title links.append(dict(link=unicode(page.htmlfile, "utf8"), text=unicode(title, "utf8"), level=level, )) return links @property def pdf_filename(self): filename = self.title filename = re.sub(r'\s+', ' ', filename) filename = re.sub(r'[\n ]', '_', filename) filename = re.sub(r'[:,]', '-', filename) filename = re.sub(r'_+', '_', filename) filename = re.sub(r'-_', '-', filename) filename = re.sub(r'-+', '-', filename) return filename + '.pdf' def publish_pdf(self, pub_path): pdf_path = os.path.join(pub_path, self.pdf_filename) src = self.header.source for page in self.pages: src += '\n%s' % page.source doc = pandoc.Document() doc.markdown = src pandoc.set_cwd(os.path.abspath(self.src_path)) doc.to_file(pdf_path) pandoc.set_cwd(None) return self.pdf_filename def publish_css(self, pub_path): src = os.path.join(self.src_path, 'css') dst = os.path.join(pub_path, 'css') if os.path.isdir(src): copy(src, dst) def publish_images(self, pub_path): src_path = self.src_path if os.path.exists(os.path.join(src_path, 'images/html')): src = os.path.join(src_path, 'images/html') else: src = os.path.join(src_path, 'images') dst = os.path.join(pub_path, 'images') if os.path.exists(src): copy(src, dst) def publish_html(self, pub_path): pandoc.set_cwd(None) for page in self.pages: print("generating %s..." % page.htmlfile) template_file = NamedTemporaryFile(mode='w', suffix='pf.template', delete=False) template = self.templater.page_template(self, page) template_file.write(template) template_file.close() doc = pandoc.Document() doc.add_argument('toc') doc.add_argument('template=%s' % template_file.name) doc.add_argument('css=%s' % self.css_file) doc.markdown = '%s\n%s' % (self.header.source, page.source) content = doc.html write_file(os.path.join(pub_path, page.htmlfile), unicode(content, 'utf-8')) # If there is not explicit index.html, then link 'index.html' # to the toplevel page. if not 'index.md' in self.pages: src = os.path.join(self.pages[0].htmlfile) ref = os.path.join(pub_path, 'index.html') os.symlink(src, ref) ###### Copy any images to publish directory self.publish_css(pub_path) self.publish_images(pub_path)