summaryrefslogtreecommitdiff
path: root/docs/doxygen/other/doxypy.py
diff options
context:
space:
mode:
Diffstat (limited to 'docs/doxygen/other/doxypy.py')
-rwxr-xr-xdocs/doxygen/other/doxypy.py142
1 files changed, 71 insertions, 71 deletions
diff --git a/docs/doxygen/other/doxypy.py b/docs/doxygen/other/doxypy.py
index 82fdb6bea..15d3e0824 100755
--- a/docs/doxygen/other/doxypy.py
+++ b/docs/doxygen/other/doxypy.py
@@ -21,7 +21,7 @@ __website__ = "http://code.foosel.org/doxypy"
__author__ = (
"Philippe 'demod' Neumann (doxypy at demod dot org)",
- "Gina 'foosel' Haeussge (gina at foosel dot net)"
+ "Gina 'foosel' Haeussge (gina at foosel dot net)"
)
__licenseName__ = "GPL v2"
@@ -46,32 +46,32 @@ from optparse import OptionParser, OptionGroup
class FSM(object):
"""Implements a finite state machine.
-
+
Transitions are given as 4-tuples, consisting of an origin state, a target
state, a condition for the transition (given as a reference to a function
which gets called with a given piece of input) and a pointer to a function
- to be called upon the execution of the given transition.
+ to be called upon the execution of the given transition.
"""
-
+
"""
@var transitions holds the transitions
@var current_state holds the current state
@var current_input holds the current input
@var current_transition hold the currently active transition
"""
-
+
def __init__(self, start_state=None, transitions=[]):
self.transitions = transitions
self.current_state = start_state
self.current_input = None
self.current_transition = None
-
+
def setStartState(self, state):
self.current_state = state
def addTransition(self, from_state, to_state, condition, callback):
self.transitions.append([from_state, to_state, condition, callback])
-
+
def makeTransition(self, input):
""" Makes a transition based on the given input.
@@ -93,16 +93,16 @@ class FSM(object):
class Doxypy(object):
def __init__(self):
string_prefixes = "[uU]?[rR]?"
-
+
self.start_single_comment_re = re.compile("^\s*%s(''')" % string_prefixes)
self.end_single_comment_re = re.compile("(''')\s*$")
-
+
self.start_double_comment_re = re.compile("^\s*%s(\"\"\")" % string_prefixes)
self.end_double_comment_re = re.compile("(\"\"\")\s*$")
-
+
self.single_comment_re = re.compile("^\s*%s(''').*(''')\s*$" % string_prefixes)
self.double_comment_re = re.compile("^\s*%s(\"\"\").*(\"\"\")\s*$" % string_prefixes)
-
+
self.defclass_re = re.compile("^(\s*)(def .+:|class .+:)")
self.empty_re = re.compile("^\s*$")
self.hashline_re = re.compile("^\s*#.*$")
@@ -110,16 +110,16 @@ class Doxypy(object):
self.multiline_defclass_start_re = re.compile("^(\s*)(def|class)(\s.*)?$")
self.multiline_defclass_end_re = re.compile(":\s*$")
-
+
## Transition list format
# ["FROM", "TO", condition, action]
transitions = [
### FILEHEAD
-
+
# single line comments
["FILEHEAD", "FILEHEAD", self.single_comment_re.search, self.appendCommentLine],
["FILEHEAD", "FILEHEAD", self.double_comment_re.search, self.appendCommentLine],
-
+
# multiline comments
["FILEHEAD", "FILEHEAD_COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine],
["FILEHEAD_COMMENT_SINGLE", "FILEHEAD", self.end_single_comment_re.search, self.appendCommentLine],
@@ -127,21 +127,21 @@ class Doxypy(object):
["FILEHEAD", "FILEHEAD_COMMENT_DOUBLE", self.start_double_comment_re.search, self.appendCommentLine],
["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD", self.end_double_comment_re.search, self.appendCommentLine],
["FILEHEAD_COMMENT_DOUBLE", "FILEHEAD_COMMENT_DOUBLE", self.catchall, self.appendCommentLine],
-
+
# other lines
["FILEHEAD", "FILEHEAD", self.empty_re.search, self.appendFileheadLine],
["FILEHEAD", "FILEHEAD", self.hashline_re.search, self.appendFileheadLine],
["FILEHEAD", "FILEHEAD", self.importline_re.search, self.appendFileheadLine],
["FILEHEAD", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch],
- ["FILEHEAD", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch],
+ ["FILEHEAD", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch],
["FILEHEAD", "DEFCLASS_BODY", self.catchall, self.appendFileheadLine],
### DEFCLASS
-
+
# single line comments
["DEFCLASS", "DEFCLASS_BODY", self.single_comment_re.search, self.appendCommentLine],
["DEFCLASS", "DEFCLASS_BODY", self.double_comment_re.search, self.appendCommentLine],
-
+
# multiline comments
["DEFCLASS", "COMMENT_SINGLE", self.start_single_comment_re.search, self.appendCommentLine],
["COMMENT_SINGLE", "DEFCLASS_BODY", self.end_single_comment_re.search, self.appendCommentLine],
@@ -155,9 +155,9 @@ class Doxypy(object):
["DEFCLASS", "DEFCLASS", self.defclass_re.search, self.resetCommentSearch],
["DEFCLASS", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.resetCommentSearch],
["DEFCLASS", "DEFCLASS_BODY", self.catchall, self.stopCommentSearch],
-
+
### DEFCLASS_BODY
-
+
["DEFCLASS_BODY", "DEFCLASS", self.defclass_re.search, self.startCommentSearch],
["DEFCLASS_BODY", "DEFCLASS_MULTI", self.multiline_defclass_start_re.search, self.startCommentSearch],
["DEFCLASS_BODY", "DEFCLASS_BODY", self.catchall, self.appendNormalLine],
@@ -166,10 +166,10 @@ class Doxypy(object):
["DEFCLASS_MULTI", "DEFCLASS", self.multiline_defclass_end_re.search, self.appendDefclassLine],
["DEFCLASS_MULTI", "DEFCLASS_MULTI", self.catchall, self.appendDefclassLine],
]
-
+
self.fsm = FSM("FILEHEAD", transitions)
self.outstream = sys.stdout
-
+
self.output = []
self.comment = []
self.filehead = []
@@ -178,22 +178,22 @@ class Doxypy(object):
def __closeComment(self):
"""Appends any open comment block and triggering block to the output."""
-
+
if options.autobrief:
if len(self.comment) == 1 \
or (len(self.comment) > 2 and self.comment[1].strip() == ''):
self.comment[0] = self.__docstringSummaryToBrief(self.comment[0])
-
+
if self.comment:
block = self.makeCommentBlock()
self.output.extend(block)
-
+
if self.defclass:
self.output.extend(self.defclass)
def __docstringSummaryToBrief(self, line):
"""Adds \\brief to the docstrings summary line.
-
+
A \\brief is prepended, provided no other doxygen command is at the
start of the line.
"""
@@ -202,7 +202,7 @@ class Doxypy(object):
return "\\brief " + line
else:
return line
-
+
def __flushBuffer(self):
"""Flushes the current outputbuffer to the outstream."""
if self.output:
@@ -212,8 +212,8 @@ class Doxypy(object):
print >>self.outstream, "\n".join(self.output)
self.outstream.flush()
except IOError:
- # Fix for FS#33. Catches "broken pipe" when doxygen closes
- # stdout prematurely upon usage of INPUT_FILTER, INLINE_SOURCES
+ # Fix for FS#33. Catches "broken pipe" when doxygen closes
+ # stdout prematurely upon usage of INPUT_FILTER, INLINE_SOURCES
# and FILTER_SOURCE_FILES.
pass
self.output = []
@@ -221,20 +221,20 @@ class Doxypy(object):
def catchall(self, input):
"""The catchall-condition, always returns true."""
return True
-
+
def resetCommentSearch(self, match):
"""Restarts a new comment search for a different triggering line.
-
+
Closes the current commentblock and starts a new comment search.
"""
if options.debug:
- print >>sys.stderr, "# CALLBACK: resetCommentSearch"
+ print >>sys.stderr, "# CALLBACK: resetCommentSearch"
self.__closeComment()
self.startCommentSearch(match)
-
+
def startCommentSearch(self, match):
"""Starts a new comment search.
-
+
Saves the triggering line, resets the current comment and saves
the current indentation.
"""
@@ -243,41 +243,41 @@ class Doxypy(object):
self.defclass = [self.fsm.current_input]
self.comment = []
self.indent = match.group(1)
-
+
def stopCommentSearch(self, match):
"""Stops a comment search.
-
+
Closes the current commentblock, resets the triggering line and
appends the current line to the output.
"""
if options.debug:
- print >>sys.stderr, "# CALLBACK: stopCommentSearch"
+ print >>sys.stderr, "# CALLBACK: stopCommentSearch"
self.__closeComment()
-
+
self.defclass = []
self.output.append(self.fsm.current_input)
-
+
def appendFileheadLine(self, match):
"""Appends a line in the FILEHEAD state.
-
+
Closes the open comment block, resets it and appends the current line.
- """
+ """
if options.debug:
- print >>sys.stderr, "# CALLBACK: appendFileheadLine"
+ print >>sys.stderr, "# CALLBACK: appendFileheadLine"
self.__closeComment()
self.comment = []
self.output.append(self.fsm.current_input)
def appendCommentLine(self, match):
"""Appends a comment line.
-
+
The comment delimiter is removed from multiline start and ends as
well as singleline comments.
"""
if options.debug:
- print >>sys.stderr, "# CALLBACK: appendCommentLine"
+ print >>sys.stderr, "# CALLBACK: appendCommentLine"
(from_state, to_state, condition, callback) = self.fsm.current_transition
-
+
# single line comment
if (from_state == "DEFCLASS" and to_state == "DEFCLASS_BODY") \
or (from_state == "FILEHEAD" and to_state == "FILEHEAD"):
@@ -308,19 +308,19 @@ class Doxypy(object):
else:
# just append the comment line
self.comment.append(self.fsm.current_input)
-
+
def appendNormalLine(self, match):
"""Appends a line to the output."""
if options.debug:
- print >>sys.stderr, "# CALLBACK: appendNormalLine"
+ print >>sys.stderr, "# CALLBACK: appendNormalLine"
self.output.append(self.fsm.current_input)
-
+
def appendDefclassLine(self, match):
"""Appends a line to the triggering block."""
if options.debug:
- print >>sys.stderr, "# CALLBACK: appendDefclassLine"
+ print >>sys.stderr, "# CALLBACK: appendDefclassLine"
self.defclass.append(self.fsm.current_input)
-
+
def makeCommentBlock(self):
"""Indents the current comment block with respect to the current
indentation level.
@@ -329,59 +329,59 @@ class Doxypy(object):
"""
doxyStart = "##"
commentLines = self.comment
-
+
commentLines = map(lambda x: "%s# %s" % (self.indent, x), commentLines)
l = [self.indent + doxyStart]
l.extend(commentLines)
-
+
return l
-
+
def parse(self, input):
"""Parses a python file given as input string and returns the doxygen-
compatible representation.
-
+
@param input the python code to parse
@returns the modified python code
- """
+ """
lines = input.split("\n")
-
+
for line in lines:
self.fsm.makeTransition(line)
-
+
if self.fsm.current_state == "DEFCLASS":
self.__closeComment()
-
+
return "\n".join(self.output)
-
+
def parseFile(self, filename):
"""Parses a python file given as input string and returns the doxygen-
compatible representation.
-
+
@param input the python code to parse
@returns the modified python code
- """
+ """
f = open(filename, 'r')
-
+
for line in f:
self.parseLine(line.rstrip('\r\n'))
if self.fsm.current_state == "DEFCLASS":
self.__closeComment()
self.__flushBuffer()
f.close()
-
+
def parseLine(self, line):
- """Parse one line of python and flush the resulting output to the
+ """Parse one line of python and flush the resulting output to the
outstream.
-
+
@param line the python code line to parse
"""
self.fsm.makeTransition(line)
self.__flushBuffer()
-
+
def optParse():
"""Parses commandline options."""
parser = OptionParser(prog=__applicationName__, version="%prog " + __version__)
-
+
parser.set_usage("%prog [options] filename")
parser.add_option("--autobrief",
action="store_true", dest="autobrief",
@@ -391,19 +391,19 @@ def optParse():
action="store_true", dest="debug",
help="enable debug output on stderr"
)
-
+
## parse options
global options
(options, filename) = parser.parse_args()
-
+
if not filename:
print >>sys.stderr, "No filename given."
sys.exit(-1)
-
+
return filename[0]
def main():
- """Starts the parser on the file given by the filename as the first
+ """Starts the parser on the file given by the filename as the first
argument on the commandline.
"""
filename = optParse()