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