# # plaintext.py: plaintext docstring parsing # Edward Loper # # Created [04/10/01 12:00 AM] # $Id: plaintext.py 1574 2007-03-07 02:55:14Z dvarrazzo $ # """ Parser for plaintext docstrings. Plaintext docstrings are rendered as verbatim output, preserving all whitespace. """ __docformat__ = 'epytext en' from epydoc.markup import * from epydoc.util import plaintext_to_html, plaintext_to_latex def parse_docstring(docstring, errors, **options): """ @return: A pair C{(M{d}, M{e})}, where C{M{d}} is a C{ParsedDocstring} that encodes the contents of the given plaintext docstring; and C{M{e}} is a list of errors that were generated while parsing the docstring. @rtype: C{L{ParsedPlaintextDocstring}, C{list} of L{ParseError}} """ return ParsedPlaintextDocstring(docstring, **options) class ParsedPlaintextDocstring(ParsedDocstring): def __init__(self, text, **options): self._verbatim = options.get('verbatim', 1) if text is None: raise ValueError, 'Bad text value (expected a str)' self._text = text def to_html(self, docstring_linker, **options): if options.get('verbatim', self._verbatim) == 0: return plaintext_to_html(self.to_plaintext(docstring_linker)) else: return ParsedDocstring.to_html(self, docstring_linker, **options) def to_latex(self, docstring_linker, **options): if options.get('verbatim', self._verbatim) == 0: return plaintext_to_latex(self.to_plaintext(docstring_linker)) else: return ParsedDocstring.to_latex(self, docstring_linker, **options) def to_plaintext(self, docstring_linker, **options): if 'indent' in options: indent = options['indent'] lines = self._text.split('\n') return '\n'.join([' '*indent+l for l in lines])+'\n' return self._text+'\n' _SUMMARY_RE = re.compile(r'(\s*[\w\W]*?(?:\.(\s|$)|[\n][\t ]*[\n]))') def summary(self): m = self._SUMMARY_RE.match(self._text) if m: other = self._text[m.end():] return (ParsedPlaintextDocstring(m.group(1), verbatim=0), other != '' and not other.isspace()) else: parts = self._text.strip('\n').split('\n', 1) if len(parts) == 1: summary = parts[0] other = False else: summary = parts[0] + '...' other = True return ParsedPlaintextDocstring(summary, verbatim=0), other # def concatenate(self, other): # if not isinstance(other, ParsedPlaintextDocstring): # raise ValueError, 'Could not concatenate docstrings' # text = self._text+other._text # options = self._options.copy() # options.update(other._options) # return ParsedPlaintextDocstring(text, options)