操纵Doxygen中的函数变量

时间:2017-11-29 16:46:42

标签: c++ doxygen

这可能吗?

以此代码为例

class LuaCamera
{
    public:
        LuaCamera(lua_State* L);
        static bool defaultControls;
        bool FPSCam;

        int lookAt(lua_State* L);
        int getRotation(lua_State* L);
        int setRotation(lua_State* L);
        // ...

        virtual ~LuaCamera();
        static const char className[];
        static const Luna<LuaCamera>::RegType Register[];
    protected:
    private:
};

如您所见,我正在使用Lua,所以我想记录Lua用法。 我希望看到int setRotation(lua_State* L),而不是在Doxygen输出中获得void setRotation(int x, int y, int z)。同样,我希望在输出中将类命名为Camera而不是LuaCamera

我意识到我可以重命名该类并创建未使用的函数来执行此操作,但我的程序具有大量的Lua函数,这将是一个糟糕的方法。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我决定制作一个非常简单的脚本来完成我需要的任务。

对于那些可能正在寻找类似解决方案的人来说,这里是python文件的源代码:

import os;

path = "include/";
output = "doxygen/src/";
modOutput = False;
srcFiles = os.listdir(path);

def writeFile(fileName, cont):
    f = open(fileName, "w");
    f.write(cont);
    f.close();

def readFile(fileName):
    cont = open(fileName, "r");
    return cont;

def readFileLines(fileName):
    return readFile(fileName).readlines();

#   creates the original files without the \mod option.
def outputNormalSrc():
    for srcFile in srcFiles:
        fileLines = readFileLines(path + srcFile);
        newFile = "";

        # We want everything in the original src files except for \mod lines.
        for line in fileLines:
            if line.find("\mod") >= 0:
                line = line[ : line.find("\mod")] + "\n";

            newFile += line;

        writeFile(output + srcFile, newFile);

#   creates the modded files for Lua doxygen output.
def outputModdedSrc():
    for srcFile in srcFiles:
        fileLines = readFileLines(path + srcFile);
        newFile = "";

        foundClass = "";
        for line in fileLines:
            if foundClass == "" and line.find("class") >= 0:
                foundClass = line[line.find("class")+6 : -1];
                break;
        if foundClass == "":
            print "WARNING: couldn't find class in src file " + srcFile + ". Skipping.";
            continue;

        newFile = "class " + foundClass + "\n{\n";

        getLines = False;
        writeBeforeClass = False;
        inMod = False;
        whiteSpaces = "";
        for line in fileLines:
            # We want everything in the block quote.
            #   If the block quote is for the class, put it before the class definition.
            if line.find("/**") >= 0:
                getLines = True;
                if line.find("class") >= 0:
                    writeBeforeClass = "";

            # Store the \mod function name.
            if line.find("\mod") >= 0 and getLines:
                inMod = line[line.find("\mod")+5 : -1];
                line = line[ : line.find("\mod")] + "\n";

            # Here we start storing the necessary lines we need for the output.
            if getLines or line.find("public:") >= 0 or line.find("private:") >= 0 or line.find("protected:") >= 0 or line.find("}") >= 0:
                if writeBeforeClass != False:
                    writeBeforeClass += line;
                else:
                    newFile += line;

            # The end of the block quote.
            if line.find("*/") >= 0 and getLines:
                getLines = False;

                # If we are writing the block quote before the class.
                if writeBeforeClass != False:
                    newFile = writeBeforeClass + newFile;
                    writeBeforeClass = False;

                # Add our modded function in place of the normal function.
                if inMod != False:
                    newFile += whiteSpaces + inMod + ";\n";
                    inMod = False;

            # Used to append whitespaces the beginning of modded functions
            #   based on the previous line's whitespaces.
            whiteSpaces = "";
            for i in range(len(line)):
                if line[i].isspace() == False:
                    break;
                whiteSpaces += line[i];

        # Create the files.
        writeFile(output + srcFile, newFile);

def main():
    # Choice: Create the original output without the \mod command,
    #           or with the \mod command to overwrite function definitions.
    if modOutput:
        outputModdedSrc();
    else:
        outputNormalSrc();

main();