#!/usr/bin/python """ Convert simple documentation to epydoc/pydoctor-compatible markup """ from sys import stdin, stdout, argv import os from tempfile import mkstemp from subprocess import call import re spaces = re.compile( r'\s+' ) singleLineExp = re.compile( r'\s+"([^"]+)"' ) commentStartExp = re.compile( r'\s+"""' ) commentEndExp = re.compile( r'"""$' ) returnExp = re.compile( r'\s+(returns:.*)' ) lastindent = '' comment = False def fixParam( line ): "Change foo: bar to @foo bar" result = re.sub( r'(\w+):', r'@param \1', line ) result = re.sub( r' @', r'@', result) return result def fixReturns( line ): "Change returns: foo to @return foo" return re.sub( 'returns:', r'@returns', line ) def fixLine( line ): global comment match = spaces.match( line ) if not match: return line else: indent = match.group(0) if singleLineExp.match( line ): return re.sub( '"', '"""', line ) if commentStartExp.match( line ): comment = True if comment: line = fixReturns( line ) line = fixParam( line ) if commentEndExp.search( line ): comment = False return line def test(): "Test transformations" assert fixLine(' "foo"') == ' """foo"""' assert fixParam( 'foo: bar' ) == '@param foo bar' assert commentStartExp.match( ' """foo"""') def funTest(): testFun = ( 'def foo():\n' ' "Single line comment"\n' ' """This is a test"""\n' ' bar: int\n' ' baz: string\n' ' returns: junk"""\n' ' if True:\n' ' print "OK"\n' ).splitlines( True ) fixLines( testFun ) def fixLines( lines, fid ): for line in lines: os.write( fid, fixLine( line ) ) if __name__ == '__main__': if False: funTest() infile = open( argv[1] ) outfid, outname = mkstemp() fixLines( infile.readlines(), outfid ) infile.close() os.close( outfid ) call( [ 'doxypy', outname ] )