90 lines
2.0 KiB
Python
Executable File
90 lines
2.0 KiB
Python
Executable File
#!/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 ] )
|
|
|
|
|
|
|
|
|