diff --git a/README.md b/README.md
index a08ba2a..b0e3d77 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,4 @@
# rst2pdf
+Convert reStructuredText to PDF via ReportLab.
+
diff --git a/rst2pdf-0.16-docutils_0.8.patch b/rst2pdf-0.16-docutils_0.8.patch
new file mode 100644
index 0000000..b751138
--- /dev/null
+++ b/rst2pdf-0.16-docutils_0.8.patch
@@ -0,0 +1,787 @@
+--- rst2pdf-0.16/rst2pdf/createpdf.py.orig 2010-10-06 23:21:41.000000000 +0200
++++ rst2pdf-0.16/rst2pdf/createpdf.py 2011-10-07 18:41:42.000000000 +0200
+@@ -1,8 +1,8 @@
+ # -*- coding: utf-8 -*-
+
+-#$HeadURL: https://rst2pdf.googlecode.com/svn/tags/0.16/rst2pdf/createpdf.py $
+-#$LastChangedDate: 2010-10-06 18:21:41 -0300 (Wed, 06 Oct 2010) $
+-#$LastChangedRevision: 2396 $
++#$HeadURL$
++#$LastChangedDate$
++#$LastChangedRevision$
+
+ # See LICENSE.txt for licensing terms
+
+@@ -65,7 +65,7 @@ from docutils.readers import standalone
+ from docutils.transforms import Transform
+
+ import pygments_code_block_directive # code-block directive
+-import oddeven_directive
++import oddeven_directive
+
+ from reportlab.platypus import *
+ from reportlab.platypus.doctemplate import IndexingFlowable
+@@ -125,13 +125,13 @@ from nodehandlers import nodehandlers
+ 'lowerroman': 'ROMAN_LOWER',
+ 'alpha': 'LETTERS_UPPER',
+ 'loweralpha': 'LETTERS_LOWER' }
+-
++
+
+
+ class RstToPdf(object):
+
+ def __init__(self, stylesheets=[],
+- language='en',
++ language='en_US',
+ header=None,
+ footer=None,
+ inlinelinks=False,
+@@ -157,6 +157,7 @@ from nodehandlers import nodehandlers
+ custom_cover='cover.tmpl',
+ floating_images=False,
+ numbered_links=False,
++ section_header_depth=2
+ ):
+ self.debugLinesPdf=False
+ self.depth=0
+@@ -165,17 +166,19 @@ from nodehandlers import nodehandlers
+ self.splittables=splittables
+ self.basedir=basedir
+ self.language = language
++ self.docutils_language = language
+ try:
+- get_language (self.language)
++ self.get_language(self.language)
+ except ImportError:
+ try:
+ language = self.language.split('_', 1)[0]
+- get_language (language)
+- self.language = language
++ self.get_language(language)
++ self.docutils_language = language
+ except ImportError:
+- log.warning("Can't load Docutils module "\
+- "for language %s or %s", self.language, language)
+- self.language = 'en'
++ log.warning("Can't load Docutils module"
++ " for language %s or %s", self.language, language)
++ self.language = 'en_US'
++ self.docutils_language = 'en'
+ self.doc_title = ""
+ self.doc_title_clean = ""
+ self.doc_subtitle = ""
+@@ -193,13 +196,13 @@ from nodehandlers import nodehandlers
+ self.PATH = abspath(dirname(sys.executable))
+ else:
+ self.PATH = abspath(dirname(__file__))
+-
+-
++
++
+ self.font_path=font_path
+ self.style_path=style_path
+ self.def_dpi=def_dpi
+ self.loadStyles(stylesheets)
+-
++
+ self.docutils_languages = {}
+ self.inlinelinks = inlinelinks
+ self.breaklevel = breaklevel
+@@ -218,6 +221,7 @@ from nodehandlers import nodehandlers
+ self.def_dpi = def_dpi
+ self.show_frame = show_frame
+ self.numbered_links = numbered_links
++ self.section_header_depth = section_header_depth
+ self.img_dir = os.path.join(self.PATH, 'images')
+
+ # Sorry about this, but importing sphinx.roles makes some
+@@ -242,18 +246,20 @@ from nodehandlers import nodehandlers
+ if self.language:
+ self.styles.languages.append(self.language)
+ self.styles['bodytext'].language = self.language
+-
++ else:
++ self.styles.languages.append('en_US')
++ self.styles['bodytext'].language = 'en_US'
+ # Load the docutils language modules for all required languages
+ for lang in self.styles.languages:
+ try:
+- self.docutils_languages[lang] = get_language(lang)
++ self.docutils_languages[lang] = self.get_language(lang)
+ except ImportError:
+ try:
+ self.docutils_languages[lang] = \
+- get_language(lang.split('_', 1)[0])
++ self.get_language(lang.split('_', 1)[0])
+ except ImportError:
+- log.warning("Can't load Docutils module \
+- for language %s", lang)
++ log.warning("Can't load Docutils module"
++ " for language %s", lang)
+
+ # Load the hyphenators for all required languages
+ if wordaxe is not None:
+@@ -265,8 +271,8 @@ from nodehandlers import nodehandlers
+ except Exception:
+ # hyphenators may not always be available or crash,
+ # e.g. wordaxe issue 2809074 (http://is.gd/16lqs)
+- log.warning("Can't load wordaxe DCW hyphenator "
+- "for German language, trying Py hyphenator instead")
++ log.warning("Can't load wordaxe DCW hyphenator"
++ " for German language, trying Py hyphenator instead")
+ else:
+ continue
+ try:
+@@ -286,17 +292,25 @@ from nodehandlers import nodehandlers
+
+ self.pending_targets=[]
+ self.targets=[]
+-
++
+ def loadStyles(self, styleSheets=None ):
+-
++
+ if styleSheets is None:
+ styleSheets=[]
+-
++
+ self.styles = sty.StyleSheet(styleSheets,
+ self.font_path,
+ self.style_path,
+ def_dpi=self.def_dpi)
+
++ def get_language(self, lang):
++ try:
++ return get_language(lang, reporter=log)
++ except TypeError, err: # Docutils < 0.8
++ if 'get_language' in str(err) and 'reporter' in str(err):
++ return get_language(lang)
++ raise # re-raise any other TypeError
++
+ def style_language(self, style):
+ """Return language corresponding to this style."""
+ try:
+@@ -318,8 +332,8 @@ from nodehandlers import nodehandlers
+ def text_for_label(self, label, style):
+ """Translate text for label."""
+ try:
+- text = self.docutils_languages[self.style_language(style)]\
+- .labels[label]
++ text = self.docutils_languages[
++ self.style_language(style)].labels[label]
+ except KeyError:
+ text = label.capitalize()
+ return text
+@@ -327,8 +341,8 @@ from nodehandlers import nodehandlers
+ def text_for_bib_field(self, field, style):
+ """Translate text for bibliographic fields."""
+ try:
+- text = self.docutils_languages[self.style_language(style)]\
+- .bibliographic_fields[field]
++ text = self.docutils_languages[
++ self.style_language(style)].bibliographic_fields[field]
+ except KeyError:
+ text = field
+ return text + ":"
+@@ -336,8 +350,8 @@ from nodehandlers import nodehandlers
+ def author_separator(self, style):
+ """Return separator string for authors."""
+ try:
+- sep = self.docutils_languages[self.style_language(style)]\
+- .author_separators[0]
++ sep = self.docutils_languages[
++ self.style_language(style)].author_separators[0]
+ except KeyError:
+ sep = ';'
+ return sep + " "
+@@ -366,13 +380,12 @@ from nodehandlers import nodehandlers
+ if s.underline:
+ r1.append('')
+ r2.insert(0,'')
+-
++
+ return [''.join(r1), ''.join(r2)]
+ except KeyError:
+ log.warning('Unknown class %s', style)
+ return None
+
+-
+
+ def styleToFont(self, style):
+ '''Takes a style name, returns a font tag for it, like
+@@ -387,7 +400,7 @@ from nodehandlers import nodehandlers
+ if bc:
+ r.append('backColor="#%s"' % bc.hexval()[2:])
+ if s.trueFontSize:
+- r.append('size="%d"'%s.fontSize)
++ r.append('size="%d"'%s.fontSize)
+ r.append('>')
+ return ''.join(r)
+ except KeyError:
+@@ -420,14 +433,14 @@ from nodehandlers import nodehandlers
+ else:
+ start = 1
+
+- if node.parent.get('bullet') or \
+- isinstance(node.parent, docutils.nodes.bullet_list):
+- b = node.parent.get('bullet','*')
++ if node.parent.get('bullet') or isinstance(
++ node.parent, docutils.nodes.bullet_list):
++ b = node.parent.get('bullet', '*')
+ if b == "None":
+ b = ""
+ t = 'bullet'
+
+- elif node.parent.get('enumtype')=='arabic':
++ elif node.parent.get('enumtype') == 'arabic':
+ b = str(node.parent.children.index(node) + start) + '.'
+
+ elif node.parent.get('enumtype') == 'lowerroman':
+@@ -521,9 +534,9 @@ from nodehandlers import nodehandlers
+ content=[XXPreformatted(text, style)],
+ mode=self.fit_mode, style=style)
+
+- def createPdf(self, text=None,
+- source_path=None,
+- output=None,
++ def createPdf(self, text=None,
++ source_path=None,
++ output=None,
+ doctree=None,
+ compressed=False,
+ # This adds entries to the PDF TOC
+@@ -541,7 +554,7 @@ from nodehandlers import nodehandlers
+ 'footer': self.footer,
+ 'endnotes': [],
+ 'extraflowables': []}
+-
++
+ self.pending_targets=[]
+ self.targets=[]
+
+@@ -550,7 +563,7 @@ from nodehandlers import nodehandlers
+ if doctree is None:
+ if text is not None:
+ if self.language:
+- settings_overrides={'language_code': self.language}
++ settings_overrides={'language_code': self.docutils_language}
+ else:
+ settings_overrides={}
+ self.doctree = docutils.core.publish_doctree(text,
+@@ -570,7 +583,7 @@ from nodehandlers import nodehandlers
+ self.doctree.walk(snf)
+ srf = SectRefExpander(self.doctree, snf.sectnums)
+ self.doctree.walk(srf)
+-
++
+ elements = self.gen_elements(self.doctree)
+
+ # Find cover template, save it in cover_file
+@@ -621,8 +634,8 @@ from nodehandlers import nodehandlers
+ # Handle images with alignment more like in HTML
+ new_elem=[]
+ for i,e in enumerate(elements[::-1]):
+- if isinstance (e, MyImage) and e.image.hAlign != 'CENTER'\
+- and new_elem:
++ if (isinstance (e, MyImage) and e.image.hAlign != 'CENTER'
++ and new_elem):
+ # This is an image where flowables should wrap
+ # around it
+ popped=new_elem.pop()
+@@ -670,7 +683,7 @@ from nodehandlers import nodehandlers
+ # first pass in the case of ###Total###, then we
+ # make a new forced two-pass build. This is broken.
+ # conceptually.
+-
++
+ if getattr(self, 'mustMultiBuild', False):
+ # Force a multibuild pass
+ if not isinstance(elements[-1],UnhappyOnce):
+@@ -686,8 +699,8 @@ from nodehandlers import nodehandlers
+ # Add it to the pile
+ #if not isinstance (e, MySpacer):
+ fnPile.append(e)
+- elif getattr(e, '_atTop', False) or \
+- isinstance (e, (UnhappyOnce, MyPageBreak)):
++ elif getattr(e, '_atTop', False) or isinstance(
++ e, (UnhappyOnce, MyPageBreak)):
+ if fnPile:
+ newStory.append(Sinker(fnPile))
+ newStory.append(e)
+@@ -702,7 +715,7 @@ from nodehandlers import nodehandlers
+ continue
+
+
+-
++
+ break
+ except ValueError, v:
+ # FIXME: cross-document links come through here, which means
+@@ -737,7 +750,7 @@ from reportlab.platypus import doctempla
+ # Notify TOC entry for headings/abstracts/dedications.
+ level, text = flowable.level, flowable.text
+ parent_id = flowable.parent_id
+- node = flowable.node
++ node = flowable.node
+ pagenum = setPageCounter()
+ self.notify('TOCEntry', (level, text, pagenum, parent_id, node))
+
+@@ -790,7 +803,8 @@ from reportlab.platypus import doctempla
+ self.afterFlowable(S[0])
+ doctemplate._addGeneratedContent(flowables,frame)
+ else:
+- ident = "Splitting error(n==%d) on page %d in\n%s" % (n,self.page,self._fIdent(f,60,frame))
++ ident = "Splitting error(n==%d) on page %d in\n%s" % (
++ n, self.page, self._fIdent(f, 60, frame))
+ #leave to keep apart from the raise
+ raise LayoutError(ident)
+ del S[0]
+@@ -798,17 +812,17 @@ from reportlab.platypus import doctempla
+ flowables.insert(i,f) # put split flowables back on the list
+ else:
+ if hasattr(f,'_postponed') and f._postponed > 4:
+- ident = "Flowable %s%s too large on page %d in frame %r%s of template %r" % \
+- (self._fIdent(f,60,frame),doctemplate._fSizeString(f),self.page, self.frame.id,
+- self.frame._aSpaceString(), self.pageTemplate.id)
++ ident = "Flowable %s%s too large on page %d in frame %r%s of template %r" % (
++ self._fIdent(f, 60, frame), doctemplate._fSizeString(f),self.page,
++ self.frame.id, self.frame._aSpaceString(), self.pageTemplate.id)
+ #leave to keep apart from the raise
+ raise LayoutError(ident)
+ # this ought to be cleared when they are finally drawn!
+ f._postponed = 1
+- mbe = getattr(self,'_multiBuildEdits',None)
++ mbe = getattr(self, '_multiBuildEdits', None)
+ if mbe:
+- mbe((delattr,f,'_postponed'))
+- flowables.insert(0,f) # put the flowable back
++ mbe((delattr, f, '_postponed'))
++ flowables.insert(0, f) # put the flowable back
+ self.handle_frameEnd()
+
+
+@@ -830,7 +844,7 @@ from reportlab.platypus import doctempla
+
+ def drawOn(self, canvas, x, y, _sW):
+ pass
+-
++
+ flowables.PageCounter = PageCounter
+
+ def setPageCounter(counter=None, style=None):
+@@ -853,13 +867,13 @@ flowables.PageCounter = PageCounter
+ else:
+ ptext=unicode(_counter)
+ return ptext
+-
++
+ class MyContainer(_Container, Flowable):
+ pass
+
+ class UnhappyOnce(IndexingFlowable):
+ '''An indexing flowable that is only unsatisfied once.
+- If added to a story, it will make multiBuild run
++ If added to a story, it will make multiBuild run
+ at least two passes. Useful for ###Total###'''
+ _unhappy=True
+ def isSatisfied(self):
+@@ -867,7 +881,7 @@ flowables.PageCounter = PageCounter
+ self._unhappy= False
+ return False
+ return True
+-
++
+ def draw(self):
+ pass
+
+@@ -935,7 +949,7 @@ flowables.PageCounter = PageCounter
+ getattr(canv, 'sectNum', ''))
+ text = smartyPants(text, smarty)
+ return text
+-
++
+ for i,e in enumerate(elems):
+ if isinstance(e, Paragraph):
+ text = replace(e.text)
+@@ -955,7 +969,7 @@ flowables.PageCounter = PageCounter
+ even=self.replaceTokens([e.even,], canv, doc, smarty)[0]
+ elems[i]=OddEven(odd, even)
+ return elems
+-
++
+ def draw(self, pageobj, canv, doc, x, y, width, height):
+ self.totalpages = max(self.totalpages, doc.page)
+ items = self.prepared
+@@ -1007,11 +1021,11 @@ flowables.PageCounter = PageCounter
+ return
+ try:
+ w, h, kind = MyImage.size_for_node(dict(uri=uri, ), self.client)
+- except ValueError:
++ except ValueError:
+ # Broken image, return arbitrary stuff
+ uri=missing
+ w, h, kind = 100, 100, 'direct'
+-
++
+ pw, ph = self.styles.pw, self.styles.ph
+ if self.client.background_fit_mode == 'center':
+ scale = min(1.0, 1.0 * pw / w, 1.0 * ph / h)
+@@ -1025,7 +1039,7 @@ flowables.PageCounter = PageCounter
+ # Do scale anyway
+ x, y = 0, 0
+ sw, sh = pw, ph
+-
++
+ bg = MyImage(uri, sw, sh, client=self.client)
+ self.image_cache[uri] = info = bg, x, y
+ bg, x, y = info
+@@ -1041,8 +1055,8 @@ flowables.PageCounter = PageCounter
+
+ global _counter, _counterStyle
+
+- self.tw = self.styles.pw - self.styles.lm -\
+- self.styles.rm - self.styles.gm
++ styles = self.styles
++ self.tw = styles.pw - styles.lm - styles.rm - styles.gm
+ # What page template to use?
+ tname = canv.__dict__.get('templateName',
+ self.styles.firstTemplate)
+@@ -1052,34 +1066,33 @@ flowables.PageCounter = PageCounter
+ doct = getattr(canv, '_doctemplate', None)
+ canv._doctemplate = None # to make _listWrapOn work
+
+- if doc.page==1:
+- _counter=0
+- _counterStyle='arabic'
+- _counter+=1
++ if doc.page == 1:
++ _counter = 0
++ _counterStyle = 'arabic'
++ _counter += 1
+
+ # Adjust text space accounting for header/footer
+-
++
+ self.hh = self._head.prepare(self, canv, doc)
+ self.fh = self._foot.prepare(self, canv, doc)
+-
++
+ canv._doctemplate = doct
+
+- self.hx = self.styles.lm
+- self.hy = self.styles.ph - self.styles.tm -self.hh
++ self.hx = styles.lm
++ self.hy = styles.ph - styles.tm - self.hh
++
++ self.fx = styles.lm
++ self.fy = styles.bm
++ self.th = styles.ph - styles.tm - styles.bm - self.hh \
++ - self.fh - styles.ts - styles.bs
+
+- self.fx = self.styles.lm
+- self.fy = self.styles.bm
+- self.th = self.styles.ph - self.styles.tm - \
+- self.styles.bm - self.hh - self.fh - \
+- self.styles.ts - self.styles.bs
+-
+ # Adjust gutter margins
+ if doc.page % 2: # Left page
+- x1 = self.styles.lm
++ x1 = styles.lm
+ else: # Right page
+- x1 = self.styles.lm + self.styles.gm
+- y1 = self.styles.bm + self.fh + self.styles.bs
+-
++ x1 = styles.lm + styles.gm
++ y1 = styles.bm + self.fh + styles.bs
++
+ # If there is a background parameter for this page Template, draw it
+ if 'background' in self.template:
+ self.draw_background('background', canv)
+@@ -1087,13 +1100,13 @@ flowables.PageCounter = PageCounter
+ self.frames = []
+ for frame in self.template['frames']:
+ self.frames.append(SmartFrame(self,
+- self.styles.adjustUnits(frame[0], self.tw) + x1,
+- self.styles.adjustUnits(frame[1], self.th) + y1,
+- self.styles.adjustUnits(frame[2], self.tw),
+- self.styles.adjustUnits(frame[3], self.th),
++ styles.adjustUnits(frame[0], self.tw) + x1,
++ styles.adjustUnits(frame[1], self.th) + y1,
++ styles.adjustUnits(frame[2], self.tw),
++ styles.adjustUnits(frame[3], self.th),
+ showBoundary=self.show_frame))
+- canv.firstSect=True
+- canv._pagenum=doc.page
++ canv.firstSect = True
++ canv._pagenum = doc.page
+ for frame in self.frames:
+ frame._pagenum=doc.page
+
+@@ -1101,15 +1114,15 @@ flowables.PageCounter = PageCounter
+ """Draw header/footer."""
+ # Adjust for gutter margin
+ canv.addPageLabel(canv._pageNumber-1,numberingstyles[_counterStyle],_counter)
+-
+- log.info('Page %s [%s]'%(_counter,doc.page))
++
++ log.error('Page %s [%s]'%(_counter,doc.page))
+ if doc.page % 2: # Left page
+ hx = self.hx
+ fx = self.fx
+ else: # Right Page
+ hx = self.hx + self.styles.gm
+ fx = self.fx + self.styles.gm
+-
++
+ self._head.draw(self, canv, doc, hx, self.hy, self.tw, self.hh)
+ self._foot.draw(self, canv, doc, fx, self.fy, self.tw, self.fh)
+
+@@ -1119,12 +1132,12 @@ flowables.PageCounter = PageCounter
+
+
+ def parse_commandline():
+-
++
+ parser = OptionParser()
+-
++
+ parser.add_option('--config', dest='configfile', metavar='FILE',
+ help='Config file to use. Default=~/.rst2pdf/config')
+-
++
+ parser.add_option('-o', '--output', dest='output', metavar='FILE',
+ help='Write the PDF to FILE')
+
+@@ -1133,16 +1146,16 @@ flowables.PageCounter = PageCounter
+ parser.add_option('-s', '--stylesheets', dest='style',
+ type='string', action='append',
+ metavar='STYLESHEETS', default=[def_ssheets],
+- help='A comma-separated list of custom stylesheets.'\
+- ' Default="%s"' % def_ssheets)
++ help='A comma-separated list of custom stylesheets. Default="%s"'
++ % def_ssheets)
+
+ def_sheetpath = os.pathsep.join([expanduser(p) for p in
+ config.getValue("general", "stylesheet_path", "").split(os.pathsep)])
+ parser.add_option('--stylesheet-path', dest='stylepath',
+ metavar='FOLDER%sFOLDER%s...%sFOLDER'%((os.pathsep, )*3),
+ default=def_sheetpath,
+- help='A list of folders to search for stylesheets,"\
+- " separated using "%s". Default="%s"' %(os.pathsep, def_sheetpath))
++ help='A list of folders to search for stylesheets,'
++ ' separated using "%s". Default="%s"' %(os.pathsep, def_sheetpath))
+
+ def_compressed = config.getValue("general", "compressed", False)
+ parser.add_option('-c', '--compressed', dest='compressed',
+@@ -1161,59 +1174,64 @@ flowables.PageCounter = PageCounter
+ parser.add_option('--font-path', dest='fpath',
+ metavar='FOLDER%sFOLDER%s...%sFOLDER'%((os.pathsep, )*3),
+ default=def_fontpath,
+- help='A list of folders to search for fonts,'\
+- ' separated using "%s". Default="%s"'%(os.pathsep, def_fontpath))
++ help='A list of folders to search for fonts, separated using "%s".'
++ ' Default="%s"' % (os.pathsep, def_fontpath))
+
+ def_baseurl = urlunparse(['file',os.getcwd()+os.sep,'','','',''])
+ parser.add_option('--baseurl', dest='baseurl', metavar='URL',
+ default=def_baseurl,
+ help='The base URL for relative URLs. Default="%s"'%def_baseurl)
+
+- def_lang = config.getValue("general", "language", 'en')
++ def_lang = config.getValue("general", "language", 'en_US')
+ parser.add_option('-l', '--language', metavar='LANG',
+ default=def_lang, dest='language',
+- help='Language to be used for hyphenation and '\
+- 'docutils localizations. Default="%s"' % def_lang)
++ help='Language to be used for hyphenation'
++ ' and docutils localizations. Default="%s"' % def_lang)
+
+ def_header = config.getValue("general", "header")
+ parser.add_option('--header', metavar='HEADER',
+ default=def_header, dest='header',
+- help='Page header if not specified in the document.'\
+- ' Default="%s"' % def_header)
++ help='Page header if not specified in the document.'
++ ' Default="%s"' % def_header)
+
+ def_footer = config.getValue("general", "footer")
+ parser.add_option('--footer', metavar='FOOTER',
+ default=def_footer, dest='footer',
+- help='Page footer if not specified in the document.'\
+- ' Default="%s"' % def_footer)
++ help='Page footer if not specified in the document.'
++ ' Default="%s"' % def_footer)
++
++ def_section_header_depth = config.getValue("general","section_header_depth",2)
++ parser.add_option('--section-header-depth', metavar='N',
++ default=def_section_header_depth, dest='section_header_depth',
++ help = '''Sections up to this depth will be used in the header and footer's replacement of ###Section###. Default=%s''' % def_section_header_depth)
+
+ def_smartquotes = config.getValue("general", "smartquotes", "0")
+ parser.add_option("--smart-quotes", metavar="VALUE",
+ default=def_smartquotes, dest="smarty",
+- help='Try to convert ASCII quotes, ellipsis and dashes '\
+- 'to the typographically correct equivalent. For details,'\
+- ' read the man page or the manual. Default="%s"'%def_smartquotes)
++ help='Try to convert ASCII quotes, ellipses and dashes'
++ ' to the typographically correct equivalent. For details,'
++ ' read the man page or the manual. Default="%s"' % def_smartquotes)
+
+ def_fit = config.getValue("general", "fit_mode", "shrink")
+ parser.add_option('--fit-literal-mode', metavar='MODE',
+ default=def_fit, dest='fit_mode',
+- help='What todo when a literal is too wide. One of error,'\
+- ' overflow,shrink,truncate. Default="%s"'%def_fit)
++ help='What to do when a literal is too wide. One of error,'
++ ' overflow,shrink,truncate. Default="%s"' % def_fit)
+
+ def_fit_background = config.getValue("general", "background_fit_mode",
+- "center")
++ "center")
+ parser.add_option('--fit-background-mode', metavar='MODE',
+ default=def_fit_background, dest='background_fit_mode',
+- help='How to fit the background image to the page.'\
+- ' One of scale or center. Default="%s"'%def_fit_background)
++ help='How to fit the background image to the page.'
++ ' One of scale or center. Default="%s"' % def_fit_background)
+
+ parser.add_option('--inline-links', action="store_true",
+ dest='inlinelinks', default=False,
+- help='shows target between parenthesis instead of active link')
++ help='Shows target between parentheses instead of active link.')
+
+ parser.add_option('--repeat-table-rows', action="store_true",
+ dest='repeattablerows', default=False,
+- help='Repeats header row for each splitted table')
++ help='Repeats header row for each split table.')
+
+ parser.add_option('-q', '--quiet', action="store_true",
+ dest='quiet', default=False,
+@@ -1235,22 +1253,22 @@ flowables.PageCounter = PageCounter
+ "footnote_backlinks", True)
+ parser.add_option('--no-footnote-backlinks', action='store_false',
+ dest='footnote_backlinks', default=def_footnote_backlinks,
+- help='Disable footnote backlinks.'\
+- ' Default=%s' % str(not def_footnote_backlinks))
++ help='Disable footnote backlinks.'
++ ' Default=%s' % str(not def_footnote_backlinks))
+
+ def_inline_footnotes = config.getValue("general",
+ "inline_footnotes", False)
+ parser.add_option('--inline-footnotes', action='store_true',
+ dest='inline_footnotes', default=def_inline_footnotes,
+- help='Show footnotes inline.'\
+- ' Default=%s' % str(not def_inline_footnotes))
++ help='Show footnotes inline.'
++ ' Default=%s' % str(not def_inline_footnotes))
+
+ def_real_footnotes = config.getValue("general",
+ "real_footnotes", False)
+ parser.add_option('--real-footnotes', action='store_true',
+ dest='real_footnotes', default=def_real_footnotes,
+- help='Show footnotes at the bottom of the page where they are defined.'\
+- ' Default=%s' % str(def_real_footnotes))
++ help='Show footnotes at the bottom of the page where they are defined.'
++ ' Default=%s' % str(def_real_footnotes))
+
+ def_dpi = config.getValue("general", "default_dpi", 300)
+ parser.add_option('--default-dpi', dest='def_dpi', metavar='NUMBER',
+@@ -1263,20 +1281,20 @@ flowables.PageCounter = PageCounter
+
+ parser.add_option('--disable-splittables', dest='splittables',
+ action='store_false', default=True,
+- help='Don\'t use splittable flowables in some elements. '
+- 'Only try this if you can\'t process a document any other way.')
++ help="Don't use splittable flowables in some elements."
++ " Only try this if you can't process a document any other way.")
+
+ def_break = config.getValue("general", "break_level", 0)
+ parser.add_option('-b', '--break-level', dest='breaklevel',
+ metavar='LEVEL', default=def_break,
+- help='Maximum section level that starts in a new page.'\
+- ' Default: %d' % def_break)
++ help='Maximum section level that starts in a new page.'
++ ' Default: %d' % def_break)
+
+ def_fpeven = config.getValue("general", "first_page_even", False)
+ parser.add_option('--first-page-even', dest='first_page_even',
+ action='store_true', default=def_fpeven,
+- help='Whether first page is odd (as in the screen on "facing pages"), '\
+- 'or even (as in a book)')
++ help='Whether first page is odd (as in the screen on "facing pages"),'
++ ' or even (as in a book).')
+
+ def_blankfirst = config.getValue("general", "blank_first_page", False)
+ parser.add_option('--blank-first-page', dest='blank_first_page',
+@@ -1286,14 +1304,16 @@ flowables.PageCounter = PageCounter
+ def_breakside = config.getValue("general", "break_side", 'any')
+ parser.add_option('--break-side', dest='breakside', metavar='VALUE',
+ default=def_breakside,
+- help='How section breaks work. Can be "even", and sections start in an even page,'\
+- '"odd", and sections start in odd pages, or "any" and sections start in the next page,'\
+- 'be it even or odd. See also the -b option.')
++ help='How section breaks work. Can be "even", and sections start'
++ ' in an even page, "odd", and sections start in odd pages,'
++ ' or "any" and sections start in the next page, be it even or odd.'
++ ' See also the -b option.')
+
+- parser.add_option('--date-invariant', dest='invariant',
++ parser.add_option('--date-invariant', dest='invariant',
+ action='store_true', default=False,
+- help="Don't store the current date in the PDF. Useful mainly for the test suite, "\
+- "where we don't want the PDFs to change.")
++ help="Don't store the current date in the PDF."
++ " Useful mainly for the test suite,"
++ " where we don't want the PDFs to change.")
+
+ parser.add_option('-e', '--extension-module', dest='extensions', action="append", type="string",
+ default = ['vectorpdf'],
+@@ -1307,7 +1327,7 @@ flowables.PageCounter = PageCounter
+
+ def_floating_images = config.getValue("general", "floating_images", False)
+ parser.add_option('--use-floating-images', action='store_true', default=def_floating_images,
+- help='Makes images with :aling: attribute work more like in rst2html. Default: %s'%def_floating_images,
++ help='Makes images with :align: attribute work more like in rst2html. Default: %s'%def_floating_images,
+ dest='floating_images')
+
+ def_numbered_links = config.getValue("general", "numbered_links", False)
+@@ -1324,7 +1344,7 @@ flowables.PageCounter = PageCounter
+ options, args = parser.parse_args(copy(args))
+
+ if options.configfile:
+- options.cfname=options.configfile
++ config.parseConfig(options.configfile)
+ parser = parse_commandline()
+ options, args = parser.parse_args(copy(args))
+
+@@ -1415,9 +1435,8 @@ flowables.PageCounter = PageCounter
+ options.inline_footnotes = True
+
+ if reportlab.Version < '2.3':
+- log.warning('You are using Reportlab version %s.'\
+- ' The suggested version '\
+- 'is 2.3 or higher'%reportlab.Version)
++ log.warning('You are using Reportlab version %s.'
++ ' The suggested version is 2.3 or higher' % reportlab.Version)
+
+ if options.invariant:
+ patch_PDFDate()
+@@ -1450,6 +1469,7 @@ flowables.PageCounter = PageCounter
+ custom_cover=options.custom_cover,
+ floating_images=options.floating_images,
+ numbered_links=options.numbered_links,
++ section_header_depth=int(options.section_header_depth),
+ ).createPdf(text=options.infile.read(),
+ source_path=options.infile.name,
+ output=options.outfile,
+@@ -1489,7 +1509,7 @@ filenames change'''
+ lambda yyyy,mm,dd,hh,m,s:
+ "D:%04d%02d%02d%02d%02d%02d%+03d'%02d'" % (yyyy,mm,dd,hh,m,s,0,0))
+ return pdfdoc.format(pdfdoc.PDFString(dfmt(*self.date)), doc)
+-
++
+ pdfdoc.PDFDate = PDFDate
+ reportlab.rl_config.invariant = 1
+
diff --git a/rst2pdf.spec b/rst2pdf.spec
new file mode 100644
index 0000000..e784ecb
--- /dev/null
+++ b/rst2pdf.spec
@@ -0,0 +1,64 @@
+Name: rst2pdf
+Version: 0.92
+Release: 1mamba
+Summary: Convert reStructuredText to PDF via ReportLab
+Group: System/Libraries/Python
+Vendor: openmamba
+Distribution: openmamba
+Packager: Stefano Cotta Ramusino
+URL: http://rst2pdf.googlecode.com
+Source: http://rst2pdf.googlecode.com/files/rst2pdf-%{version}.tar.gz
+Patch: rst2pdf-0.16-docutils_0.8.patch
+License: MIT
+## AUTOBUILDREQ-BEGIN
+BuildRequires: libpython-devel
+BuildRequires: python
+## AUTOBUILDREQ-END
+Requires: python >= %python_version
+Requires: python-reportlab
+BuildRoot: %{_tmppath}/%{name}-%{version}-root
+BuildArch: noarch
+
+%description
+Convert reStructuredText to PDF via ReportLab.
+
+%prep
+%setup -q
+#%patch -p1
+
+%build
+%{__python} setup.py build
+
+%install
+[ "%{buildroot}" != / ] && rm -rf "%{buildroot}"
+%{__python} setup.py install \
+ -O1 --skip-build \
+ --root="%{buildroot}" \
+ --install-headers=%{_includedir}/python \
+ --install-lib=%{python_sitearch} \
+ --single-version-externally-managed \
+ --record=%{name}.filelist
+
+sed -i "\,\.egg-info/,d;s,.*/man/.*,&.gz," %{name}.filelist
+
+#install -D -m 644 doc/rst2pdf.1 \
+# %{buildroot}/%{_mandir}/man1/rst2pdf.1
+#echo "%{_mandir}/man1/rst2pdf.1.gz" >> %{name}.filelist
+
+%clean
+[ "%{buildroot}" != / ] && rm -rf "%{buildroot}"
+
+%files -f %{name}.filelist
+%defattr(-,root,root)
+%doc LICENSE.txt
+#%doc CHANGES.txt Contributors.txt README.txt doc/manual.pdf
+
+%changelog
+* Thu Aug 09 2012 Automatic Build System 0.92-1mamba
+- automatic version update by autodist
+
+* Wed Dec 21 2011 Stefano Cotta Ramusino 0.16-2mamba
+- fixing compatibility with docutils 0.8
+
+* Tue Oct 12 2010 Stefano Cotta Ramusino 0.16-1mamba
+- package created by autospec