blob: f9f60ad1bd8ee66d8ebd28ed47a46e17d067844e [file] [log] [blame]
#!/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 ] )