diff options
Diffstat (limited to 'sandbox/edloper/docpy/docpy.py')
-rwxr-xr-x | sandbox/edloper/docpy/docpy.py | 323 |
1 files changed, 0 insertions, 323 deletions
diff --git a/sandbox/edloper/docpy/docpy.py b/sandbox/edloper/docpy/docpy.py deleted file mode 100755 index 450a9b735..000000000 --- a/sandbox/edloper/docpy/docpy.py +++ /dev/null @@ -1,323 +0,0 @@ -#!/usr/bin/env python - -# Author: David Goodger -# Contact: goodger@users.sourceforge.net -# Revision: $Revision$ -# Date: $Date$ -# Copyright: This module has been placed in the public domain. - -""" -:todo: role-labeled inline text -:todo: generate output (subclass LaTeXTransformer) -:todo later: macros (susbtitution refs) -""" -from docutils import nodes -from docutils.parsers.rst import directives -from docutils.parsers.rst.directives import admonitions -from docutils.parsers.rst import states -from docutils.writers import latex2e -import re, tokenize - -###################################################################### -# New nodes -###################################################################### - -class funcdesc(nodes.Admonition, nodes.Element): pass -class classdesc(nodes.Admonition, nodes.Element): pass -class methoddesc(nodes.Admonition, nodes.Element): pass -class datadesc(nodes.Admonition, nodes.Element): pass -class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass - -# We might use pynodes instead. -class func_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass -class func_name(nodes.Part, nodes.Inline, nodes.TextElement): pass -class func_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement): pass -class func_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass -class func_optional(nodes.Part, nodes.Inline, nodes.TextElement): pass - -# These are the inline things. -class docpy_function(nodes.Inline, nodes.TextElement): pass -class docpy_manpage(nodes.Inline, nodes.TextElement): pass -class docpy_regexp(nodes.Inline, nodes.TextElement): pass -class docpy_file(nodes.Inline, nodes.TextElement): pass -class docpy_label(nodes.Inline, nodes.TextElement): pass -class docpy_class(nodes.Inline, nodes.TextElement): pass -class docpy_method(nodes.Inline, nodes.TextElement): pass -class docpy_cfunction(nodes.Inline, nodes.TextElement): pass -class docpy_refmodule(nodes.Inline, nodes.TextElement): pass -class docpy_module(nodes.Inline, nodes.TextElement): pass -class docpy_var(nodes.Inline, nodes.TextElement): pass -inline_docpy_elements = { # Maps roles to entitites - 'function':docpy_function, - 'manpage':docpy_manpage, - 'regexp':docpy_regexp, - 'file':docpy_file, - 'label': docpy_label, - 'class': docpy_class, - 'method': docpy_method, - 'cfunction': docpy_cfunction, - 'refmodule': docpy_refmodule, - 'module': docpy_module, - 'var': docpy_var, - } - -for (role, element) in inline_docpy_elements.items(): - states.register_inliner_role(role, element) - - -###################################################################### -# Directives -###################################################################### - -# Transform a python signature into RST. -def parse_signature(s): - """ - A straw-man implementation. (Might be sufficient) - """ - s = s.strip() - m = re.match(r'^(\w+)\s*\((.*)\)$', s) - if m is None: raise ValueError(`s`) - name, arglist = m.groups() - - sig = func_signature(s,'') - - sig.append(func_name(name,name)) - sig.append(func_parameterlist()) - - stack = [sig[-1]] - for token in re.split(r'(\*{0,2}\w+|[\[\],])', arglist): - #print `token`, stack - if token == '[': - opt = func_optional() - stack[-1].append(opt) - stack.append(opt) - elif token == ']': - stack.pop() - elif token == ',': - pass - elif re.match(r'^\s*$', token): - pass - elif re.match(r'^\*{0,2}\w+$', token): - stack[-1].append(func_parameter(token,token)) - else: - raise ValueError(s) - if len(stack) != 1: raise ValueError(s) - return sig - -def funcdesc_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - rv = admonitions.make_admonition(funcdesc, name, [], options, content, - lineno, content_offset, block_text, - state, state_machine) - rv[0].insert(0, parse_signature(arguments[0])) - return rv -funcdesc_directive.content = 1 -funcdesc_directive.arguments = (1,0,1) # 1 required arg with spaces. - -def methoddesc_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - rv = admonitions.make_admonition(methoddesc, name, [], options, content, - lineno, content_offset, block_text, - state, state_machine) - rv[0].insert(0, parse_signature(arguments[0])) - return rv -methoddesc_directive.content = 1 -methoddesc_directive.arguments = (1,0,1) # 1 required arg with spaces. - -def classdesc_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - rv = admonitions.make_admonition(classdesc, name, [], options, content, - lineno, content_offset, block_text, - state, state_machine) - rv[0].insert(0, parse_signature(arguments[0])) - return rv -classdesc_directive.content = 1 -classdesc_directive.arguments = (1,0,1) # 1 required arg with spaces. - -def datadesc_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - rv = admonitions.make_admonition(datadesc, name, [], options, content, - lineno, content_offset, block_text, - state, state_machine) - rv[0].insert(0, desc_name(arguments[0], arguments[0])) - return rv -datadesc_directive.content = 1 -datadesc_directive.arguments = (1,0,1) # 1 required arg with spaces. - -# Register the directives -directives.register_directive('funcdesc', funcdesc_directive) -directives.register_directive('methoddesc', methoddesc_directive) -directives.register_directive('classdesc', classdesc_directive) -directives.register_directive('datadesc', datadesc_directive) - -###################################################################### -# Writer -###################################################################### - -class DocpyWriter(latex2e.Writer): - def translate(self): - visitor = DocpyTranslator(self.document) - self.document.walkabout(visitor) - self.output = visitor.astext() - self.head_prefix = visitor.head_prefix - self.head = visitor.head - self.body_prefix = visitor.body_prefix - self.body = visitor.body - self.body_suffix = visitor.body_suffix - -class DocpyTranslator(latex2e.LaTeXTranslator): - """ - Incompatibilities: - - latex docs uses \subsection, we generate \subsection* - (e.g., \subsection{asyncore Exampe ...}) - - we generate header & footer info that we don't need - - we don't handle RFC822 stuff & generate a top-level \section - - in a function signature, we escape underscores but latex docs - don't. e.g., funcdesc (line 46 of asyncore). - - in role-labeled text, we escape underscore but latex docs - don't. - - table rendering is completely different. - """ - - def __init__(self, *args): - latex2e.LaTeXTranslator.__init__(self, *args) - self.section_level = 1 - self.first_paramter_visited = 0 - - - #------------------------------------------------------------ - # Directives - #------------------------------------------------------------ - def visit_funcdesc(self, node): - self.body.append('\n'+r'\begin{funcdesc}') - def depart_funcdesc(self, node): - self.body.append(r'\end{funcdesc}'+'\n') - - def visit_methoddesc(self, node): - self.body.append('\n'+r'\begin{methoddesc}') - def depart_methoddesc(self, node): - self.body.append(r'\end{methoddesc}'+'\n') - - def visit_classdesc(self, node): - self.body.append('\n'+r'\begin{classdesc}') - def depart_classdesc(self, node): - self.body.append(r'\end{classdesc}'+'\n') - - def visit_datadesc(self, node): - self.body.append('\n'+r'\begin{datadesc}') - def depart_datadesc(self, node): - self.body.append(r'\end{datadesc}'+'\n') - - def visit_desc_name(self, node): - self.body.append('{') - def depart_desc_name(self, node): - self.body.append('}') - - def visit_func_name(self, node): - self.body.append('{') - def depart_func_name(self, node): - self.body.append('}') - - def visit_func_signature(self, node): pass - def depart_func_signature(self, node): pass - - def visit_func_parameterlist(self, node): - self.body.append('{') - self.first_parameter_visited = 0 - def depart_func_parameterlist(self, node): - self.body.append('}') - - def visit_func_parameter(self, node): - if self.first_parameter_visited: - self.body.append(', ') - self.first_parameter_visited = 1 - def depart_func_parameter(self, node): pass - - def visit_func_optional(self, node): - self.body.append(r'\optional{') - if self.first_paramter_visited: - self.body.append(',') - def depart_func_optional(self, node): - self.body.append('}') - - - #------------------------------------------------------------ - # Inline Roles - #------------------------------------------------------------ - def visit_docpy_function(self, node): - self.body.append(r'\function{') - def depart_docpy_function(self, node): - self.body.append(r'}') - - def visit_docpy_manpage(self, node): - self.body.append(r'\manpage{') - def depart_docpy_manpage(self, node): - self.body.append(r'}') - - def visit_docpy_regexp(self, node): - self.body.append(r'\regexp{') - def depart_docpy_regexp(self, node): - self.body.append(r'}') - - def visit_docpy_file(self, node): - self.body.append(r'\file{') - def depart_docpy_file(self, node): - self.body.append(r'}') - - def visit_docpy_label(self, node): - self.body.append(r'\label{') - def depart_docpy_label(self, node): - self.body.append(r'}') - - def visit_docpy_class(self, node): - self.body.append(r'\class{') - def depart_docpy_class(self, node): - self.body.append(r'}') - - def visit_docpy_method(self, node): - self.body.append(r'\method{') - def depart_docpy_method(self, node): - self.body.append(r'}') - - def visit_docpy_cfunction(self, node): - self.body.append(r'\cfunction{') - def depart_docpy_cfunction(self, node): - self.body.append(r'}') - - def visit_docpy_refmodule(self, node): - self.body.append(r'\refmodule{') - def depart_docpy_refmodule(self, node): - self.body.append(r'}') - - def visit_docpy_module(self, node): - self.body.append(r'\module{') - def depart_docpy_module(self, node): - self.body.append(r'}') - - def visit_docpy_var(self, node): - self.body.append(r'\var{') - def depart_docpy_var(self, node): - self.body.append(r'}') - - #------------------------------------------------------------ - # Etc. - #------------------------------------------------------------ - def visit_literal(self, node): - self.literal = 1 - self.body.append('\\code{') - -###################################################################### -# Front-end code -###################################################################### -if __name__ == '__main__': - import locale - try: - locale.setlocale(locale.LC_ALL, '') - except: - pass - - from docutils.core import publish_cmdline, default_description - description = default_description - publish_cmdline(writer=DocpyWriter(), description=description) - #publish_cmdline(writer_name='pseudoxml', description=description) - |