Content-Length: 37218 | pFad | http://github.com/doxygen/doxygen/pull/10782.diff
thub.com
diff --git a/src/config.xml b/src/config.xml
index f1a96a4d169..cfe00533440 100644
--- a/src/config.xml
+++ b/src/config.xml
@@ -3501,6 +3501,15 @@ If set to \c NO, doxygen will warn if a database file is already found and not m
If the \c PERLMOD_LATEX tag is set to \c YES, doxygen will generate
the necessary \c Makefile rules, \c Perl scripts and \f$\mbox{\LaTeX}\f$ code to be able
to generate PDF and DVI output from the Perl module output.
+]]>
+
+
+
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
index 1ae5bdf66e0..b06432be6bf 100644
--- a/src/perlmodgen.cpp
+++ b/src/perlmodgen.cpp
@@ -1422,6 +1422,12 @@ class PerlModGenerator
QCString pathDoxyLatexPL;
QCString pathDoxyLatexStructurePL;
QCString pathDoxyRules;
+ // perlmodPython PerlModGenerator path define
+ QCString pathPythonPut2cpp_py;
+ QCString pathPythonREADME_md;
+ QCString pathPythonSample_py;
+ QCString pathPythonDoxy2py_pl;
+ // perlmodPython PerlModGenerator path define
QCString pathMakefile;
inline PerlModGenerator(bool pretty) : m_output(pretty) { }
@@ -1448,6 +1454,12 @@ class PerlModGenerator
bool generateDoxyLatexPL();
bool generateDoxyLatexStructurePL();
bool generateDoxyRules();
+ // perlmodPython PerlModGenerator declare function
+ bool generatePythonPut2cpp_py();
+ bool generatePythonREADME_md();
+ bool generatePythonSample_py();
+ bool generatePythonDoxy2py_pl();
+ // perlmodPython PerlModGenerator declare function
bool generateMakefile();
bool generatePerlModOutput();
@@ -2522,6 +2534,587 @@ bool PerlModGenerator::generateDoxyRules()
return true;
}
+// perlmodPython PerlModGenerator file creation code
+bool PerlModGenerator::generatePythonPut2cpp_py()
+{
+ std::ofstream pythonStream;
+ if (!createOutputFile(pythonStream, pathPythonPut2cpp_py))
+ return false;
+
+ pythonStream <<
+ "import sys\n"
+ "import argparse\n"
+ "import re\n"
+ "import os\n"
+ "\n"
+ "class Solution:\n"
+ " \'\'\'\n"
+ " we replace several points.\n"
+ " - path define\n"
+ " - declare function\n"
+ " - file creation code\n"
+ " - code in generate function\n"
+ " - Makefile\n"
+ " \'\'\'\n"
+ " def __init__(self,inputdir,outlog,perlmodgen,debug):\n"
+ " \'\'\'\n"
+ " This is init funciton \"\"\" test \"\"\"\n"
+ " \'\'\'\n"
+ " self.inputdir = inputdir\n"
+ " self.outlog = outlog\n"
+ " self.perlmodgen = perlmodgen\n"
+ " self.debug = debug\n"
+ " if self.perlmodgen and not os.path.exists(self.perlmodgen):\n"
+ " print(\'error: not exist file :\', self.perlmodgen)\n"
+ " print(\' !! set --perlmodgen option with the location of perlmodgen.cpp\')\n"
+ " quit(4)\n"
+ " files = os.listdir(self.inputdir)\n"
+ " print(\'files:\',files)\n"
+ " self.p = []\n"
+ " self.o = {}\n"
+ " self.o[\'path define\'] = []\n"
+ " self.o[\'declare function\'] = []\n"
+ " self.o[\'file creation code\'] = []\n"
+ " self.o[\'code in generate function\'] = []\n"
+ " self.o[\'Makefile\'] = []\n"
+ " self.p.append(\'\'\'class PerlModGenerator\'\'\')\n"
+ " self.p.append(\'\'\'{\'\'\')\n"
+ " self.p.append(\'\'\' QCString pathDoxyRules;\'\'\')\n"
+ " self.p.append(\'\'\' // perlmodPython code\'\'\')\n"
+ " for file in files:\n"
+ " self.o[\'path define\'].append(\'\'\' QCString path{f};\'\'\'.format(f=self.createPythonName(file)))\n"
+ " self.p += self.o[\'path define\']\n"
+ " self.p.append(\'\'\' QCString pathMakefile;\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " self.p.append(\'\'\' bool generateDoxyRules();\'\'\')\n"
+ " self.p.append(\'\'\' // perlmodPython code\'\'\')\n"
+ " for file in files:\n"
+ " self.o[\'declare function\'].append(\'\'\' bool generate{f}();\'\'\'.format(f=self.createPythonName(file)))\n"
+ " self.p += self.o[\'declare function\']\n"
+ " self.p.append(\'\'\' bool generateMakefile();\'\'\')\n"
+ " self.p.append(\'\'\'}\'\'\')\n"
+ " self.p.append(\'\')\n"
+ "\n"
+ " self.p.append(\'\'\'bool PerlModGenerator::generateDoxyRules()\'\'\')\n"
+ " self.p.append(\'\'\'{\'\'\')\n"
+ " self.p.append(\'\'\'}\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " self.p.append(\'\'\'// perlmodPython code\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " for file in files:\n"
+ " filepath = self.inputdir+\'/\'+file\n"
+ " ff = self.createPythonName(file)\n"
+ " cpp = []\n"
+ " with open(filepath,\'r\', encoding=\'utf-8\', errors=\'ignore\') as f:\n"
+ " lines = f.readlines()\n"
+ " #bs = \' \\ \'\n"
+ " #bs = bs.replace(\' \',\'\')\n"
+ " for line in lines:\n"
+ " cpp.append(self.line2cpp(4,line))\n"
+ " self.o[\'file creation code\'].append(\'\'\'bool PerlModGenerator::generate{ff}()\'\'\'.format(ff=ff))\n"
+ " self.o[\'file creation code\'].append(\'\'\'{\'\'\')\n"
+ " self.o[\'file creation code\'].append(\'\'\' std::ofstream pythonStream;\'\'\')\n"
+ " self.o[\'file creation code\'].append(\'\'\' if (!createOutputFile(pythonStream, path{ff}))\'\'\'.format(ff=ff))\n"
+ " self.o[\'file creation code\'].append(\'\'\' return false;\'\'\')\n"
+ " self.o[\'file creation code\'].append(\'\')\n"
+ " self.o[\'file creation code\'].append(\'\'\' pythonStream <<\'\'\')\n"
+ " self.o[\'file creation code\'].append(\'\\n\'.join(cpp) + \';\')\n"
+ " self.o[\'file creation code\'].append(\'\')\n"
+ " self.o[\'file creation code\'].append(\'\'\' return true;\'\'\')\n"
+ " self.o[\'file creation code\'].append(\'\'\'}\'\'\')\n"
+ " self.o[\'file creation code\'].append(\'\')\n"
+ " self.p += self.o[\'file creation code\']\n"
+ " self.p.append(\'\'\'bool PerlModGenerator::generateMakefile()\'\'\')\n"
+ " self.p.append(\'\'\'{\'\'\')\n"
+ " self.p.append(\'\'\'}\'\'\')\n"
+ " self.p.append(\'\')\n"
+ "\n"
+ " self.p.append(\'\'\'void PerlModGenerator::generate()\'\'\')\n"
+ " self.p.append(\'\'\'{\'\'\')\n"
+ " self.p.append(\'\'\' bool perlmodLatex = Config_getBool(PERLMOD_LATEX);\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " self.p.append(\'\'\' if (perlmodLatex) {\'\'\')\n"
+ " self.p.append(\'\'\' }\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " self.p.append(\' // perlmodPython code\')\n"
+ " self.p.append(\'\')\n"
+ " generateList = []\n"
+ " for file in files:\n"
+ " ff = self.createPythonName(file)\n"
+ " self.o[\'code in generate function\'].append(\'\'\' path{ff} = perlModAbsPath + \"/{f}\";\'\'\'.format(f=file,ff=ff))\n"
+ " generateList.append(\'generate\' + ff + \'()\')\n"
+ " print(\'generateList\',generateList)\n"
+ " self.o[\'code in generate function\'].append(\'\'\' if (!(\'\'\' + \'\'\'\\n && \'\'\'.join(generateList) + \'\'\'))\'\'\')\n"
+ " self.o[\'code in generate function\'].append(\'\'\' return;\'\'\')\n"
+ " self.p += self.o[\'code in generate function\']\n"
+ " self.p.append(\'\'\'}\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " self.p.append(\'\'\'void generatePerlMod()\'\'\')\n"
+ " self.p.append(\'\'\'{\'\'\')\n"
+ " self.p.append(\'\'\'}\'\'\')\n"
+ " self.p.append(\'\')\n"
+ " self.p.append(\'\'\' bool perlmodPython = Config_getBool(PERLMOD_PYTHON);\'\'\')\n"
+ " self.p.append(\'\'\' if (perlmodPython) {\'\'\')\n"
+ " self.o[\'Makefile\'].append(\'\'\' makefileStream <<\'\'\')\n"
+ " mk = []\n"
+ " mk.append(\'\')\n"
+ " mk.append(\'\'\'# code2cpp\'\'\')\n"
+ " mk.append(\'\'\'code2cpp:\'\'\')\n"
+ " mk.append(\'\'\'\\trm -rf input_perlmodgen_files\'\'\')\n"
+ " mk.append(\'\'\'\\tmkdir -p input_perlmodgen_files\'\'\')\n"
+ " for file in files:\n"
+ " mk.append(\'\'\'\\tcd input_perlmodgen_files; ln -s ../{f} {f}\'\'\'.format(f=file))\n"
+ " mk.append(\'\'\'\\t# if you want to add python file into perlmodgen.cpp , you can use it.\'\'\')\n"
+ " mk.append(\'\'\'\\t# first of all, you add your py in input_perlmodgen_files directory\'\'\')\n"
+ " mk.append(\'\'\'\\t# please change ../../../../src/perlmodgen.cpp to location of src/perlmodgen.cpp\'\'\')\n"
+ " mk.append(\'\'\'\\t# output filename : perlmodgen.cpp.mod\'\'\')\n"
+ " mk.append(\'\'\'\\tpython3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp --outlog=out-perlmodgen.log\'\'\')\n"
+ " mk.append(\'\')\n"
+ " mk.append(\'\'\'# run python code with DoxyDocs\'\'\')\n"
+ " mk.append(\'\'\'python_doc:\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \"if you want to get plantuml without running java ,\"\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \" 1. set PLANTUML_JAR_PATH = ./plantuml.jar in Doxygile\"\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \" 2. do \'touch plantuml.jar\'\"\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \" 3. run \'doxygen\' then your DoxyDocs.pm will include plantuml.\"\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \"\"\'\'\')\n"
+ " mk.append(\'\'\'\\tperl doxy2py.pl\'\'\')\n"
+ " mk.append(\'\'\'\\tpython3 sample.py --outfile=output.md\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \"\"\'\'\')\n"
+ " mk.append(\'\'\'\\t@echo \"refer to https://github.com/cheoljoo/doxygen_perlmod_python for getting more example and usage\"\'\'\')\n"
+ " mk.append(\'\')\n"
+ " self.o[\'Makefile\'].append(\'\\n\'.join([self.line2cpp(6,item) for item in mk]) + \';\')\n"
+ " self.p += self.o[\'Makefile\']\n"
+ " self.p.append(\'\'\' }\'\'\')\n"
+ " with open(self.outlog ,\"w\") as f:\n"
+ " print(\'write:\',self.outlog)\n"
+ " f.write(\'\\n\'.join(self.p))\n"
+ " startRe = re.compile(\'^\\s*//\\s+perlmodPython\\s+PerlModGenerator\\s+(?P[^<>]+)\\s*\')\n"
+ " endRe = re.compile(\'^\\s*//\\s+perlmodPython\\s+PerlModGenerator\\s+(?P[^<>]+)\\s*\')\n"
+ " if self.perlmodgen:\n"
+ " pmg = []\n"
+ " lines = []\n"
+ " with open(self.perlmodgen,\'r\', encoding=\'utf-8\', errors=\'ignore\') as f:\n"
+ " lines = f.readlines()\n"
+ " flag = 0\n"
+ " startKey = \'\'\n"
+ " endKey = \'-\'\n"
+ " for line in lines:\n"
+ " line = line.rstrip()\n"
+ " grpStart = startRe.search(line)\n"
+ " grpEnd = endRe.search(line)\n"
+ " if grpStart:\n"
+ " if flag == 1:\n"
+ " print(\'error: already you were in perlmodpython pair\')\n"
+ " print(\' !! please chek ~ pair\')\n"
+ " quit(4)\n"
+ " print(\'start [\',grpStart.group(\'key\').strip(),\']\',line)\n"
+ " startKey = grpStart.group(\'key\').strip()\n"
+ " flag = 1\n"
+ " pmg.append(line)\n"
+ " elif grpEnd:\n"
+ " if flag == 0:\n"
+ " print(\'error: already you were out of perlmodpython pair\')\n"
+ " print(\' !! please chek ~ pair\')\n"
+ " quit(4)\n"
+ " print(\'end [\',grpEnd.group(\'key\').strip(),\']\',line)\n"
+ " endKey = grpEnd.group(\'key\').strip()\n"
+ " flag = 0\n"
+ " pmg += self.o[endKey]\n"
+ " pmg.append(line)\n"
+ " else:\n"
+ " if flag == 0:\n"
+ " pmg.append(line)\n"
+ " with open(self.perlmodgen + \'.mod\',\'w\') as f:\n"
+ " print(\'! output perlmodgen file:\',self.perlmodgen + \'.mod\')\n"
+ " s = \"\\n\".join(pmg)\n"
+ " f.write(s)\n"
+ "\n"
+ " def createPythonName(self,file):\n"
+ " \'\'\'\n"
+ " create new path name\n"
+ " \'\'\'\n"
+ " if not file:\n"
+ " return file\n"
+ " file2 = file.replace(\'.\',\'_\')\n"
+ " fileList = list(file2)\n"
+ " ff = \'Python\' + fileList[0].upper() + \'\'.join(fileList[1:])\n"
+ " print(ff)\n"
+ " return ff\n"
+ "\n"
+ " def line2cpp(self,indent,line):\n"
+ " \'\'\'\n"
+ " change characters for C++\n"
+ " \'\'\'\n"
+ " line = line.rstrip()\n"
+ " line = line.replace(\'\\\\\',\'\\\\\\\\\')\n"
+ " line = line.replace(\"\'\", \"\\\\\'\")\n"
+ " line = line.replace(\'\"\', \'\\\\\"\')\n"
+ " return \' \'*indent + \'\"\' + line + str(\'\\\\n\') + \'\"\'\n"
+ "\n"
+ "if (__name__ == \"__main__\"):\n"
+ " parser = argparse.ArgumentParser(\n"
+ " prog=sys.argv[0],\n"
+ " description=\n"
+ " \'put python code into cpp code and edit perlmodgen.cpp to add python code\'\n"
+ " )\n"
+ " parser.add_argument( \'--debug\', \'-d\' , action=\'store_const\' , const=1 , help=\'debug on\')\n"
+ " parser.add_argument( \'--inputdir\',\n"
+ " metavar=\"\",\n"
+ " type=str,\n"
+ " default=\'input_perlmodgen_files\',\n"
+ " help=\'input directory with python code. files of this directory will be inserted in cpp\')\n"
+ " parser.add_argument( \'--perlmodgen\',\n"
+ " metavar=\"\",\n"
+ " type=str,\n"
+ " default=\'./perlmodgen.cpp\',\n"
+ " help=\'location of perlmodgen.cpp. python codes in inputdir will be updated.\')\n"
+ " parser.add_argument( \'--outlog\',\n"
+ " metavar=\"\",\n"
+ " type=str,\n"
+ " default=\'out-perlmodgen.log\',\n"
+ " help=\'log file\')\n"
+ "\n"
+ " args = parser.parse_args()\n"
+ " debug = args.debug\n"
+ "\n"
+ " print(\'inputdir:\',args.inputdir)\n"
+ " print(\'input location of perlmodegen.cpp:\',args.perlmodgen)\n"
+ " S = Solution(args.inputdir,args.outlog,args.perlmodgen,args.debug)\n"
+ "\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generatePythonREADME_md()
+{
+ std::ofstream pythonStream;
+ if (!createOutputFile(pythonStream, pathPythonREADME_md))
+ return false;
+
+ pythonStream <<
+ "# PERLMOD_PYTHON\n"
+ "- developers want to use parsing data from doxygen.\n"
+ "- they want to do something with python.\n"
+ "\n"
+ "- set **GENERATE_PERLMOD = YES** and **PERLMOD_PYTHON = YES**\n"
+ "\n"
+ "## make python_doc\n"
+ "- DoxyDocs.pm converts to DoxyDocs.py.\n"
+ " - DoxyDocs.py is loaded in python program.\n"
+ "- sample.py makes markdown (output.md) file as final output.\n"
+ " - output.md includes table for classes and member functions.\n"
+ " - if doxygen comments include plantuml , output.md includes plantuml if you set PLANTUML_JAR_PATH = ./plantuml.jar and this file exists.\n"
+ "- output\n"
+ " - output.md : show markdown including plantuml with vscode (useful extension : markdown preview enhanced)\n"
+ "\n"
+ "## make code2cpp\n"
+ "- add new file in input_perlmodgen_files directory\n"
+ " - add new line for new file in Makefile : `cd input_perlmodgen_files; ln -s ../[wanted_file] [wanted_file]`\n"
+ "- all codes with related to PERLMOD_PYTHON are created by perlmodgen.cpp.\n"
+ "- put2cpp.py insert converted c++ code into perlmodgen.cpp from files in input_perlmodgen_files directory.\n"
+ "- `--perlmodgen` option : location of perlmodgen.cpp. python codes in inputdir will be updated.\n"
+ "- generated code will be inserted between `// perlmodPython PerlModGenerator [key] ` and `// perlmodPython PerlModGenerator [key] `\n"
+ "- output ( `--perlmodgen=../../../../src/perlmodgen.cpp` )\n"
+ " - ../../../../src/perlmodgen.cpp.mod : you can replace perlmodgen.cpp with it.\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generatePythonSample_py()
+{
+ std::ofstream pythonStream;
+ if (!createOutputFile(pythonStream, pathPythonSample_py))
+ return false;
+
+ pythonStream <<
+ "import DoxyDocs\n"
+ "import sys\n"
+ "import argparse\n"
+ "\n"
+ "class DoxyDocsClass :\n"
+ " \'\'\'\n"
+ " analyze classes as example. it will print table for class with markdown format\n"
+ " \'\'\'\n"
+ " def __init__(self,doxydocs={},outfile=\'\',debug=False):\n"
+ " self.plantumlCnt = 0\n"
+ " self.ret = \'
\' # or \'\\\\n\'\n"
+ "\n"
+ " self.D = doxydocs\n"
+ " self.outfile = outfile\n"
+ " self.debug = debug\n"
+ " self.of = None\n"
+ " if self.outfile.strip():\n"
+ " print(\'write:\',self.outfile)\n"
+ " self.of = open(self.outfile.strip(),\'w\')\n"
+ " def __fini__(self):\n"
+ " if self.outfile.strip():\n"
+ " close(self.of)\n"
+ "\n"
+ " def run(self):\n"
+ " self.print(0,\'# classes\')\n"
+ " self.print(0,\'| Class | Derived | Includes | Brief | Detailed Description|\')\n"
+ " self.print(0,\'|-------|-------------|---------|---------|----|\')\n"
+ "\n"
+ " self.cls = {}\n"
+ " for k,v in self.D[\'classes\'].items():\n"
+ " self.cls[k] = {}\n"
+ " name = v[\'name\']\n"
+ " includes = v.get(\'includes\',{}).get(\'name\',\'\')\n"
+ " self.cls[k][\'name\'] = name\n"
+ " self.cls[k][\'brief\'] = self.getDescription(doc=v.get(\'brief\',{}).get(\'doc\',{}))\n"
+ " self.cls[k][\'detailed\'] = self.getDescription(doc=v.get(\'detailed\',{}).get(\'doc\',{}))\n"
+ " self.cls[k][\'derived\'] = []\n"
+ " for k1,v2 in v.get(\'derived\',{}).items():\n"
+ " self.cls[k][\'derived\'].append(v2.get(\'name\',\'\'))\n"
+ " self.cls[k][\'includes\'] = includes\n"
+ " t = self.cls[k]\n"
+ " self.print(0,\'\'\'|{name}|{drived}|{includes}|{brief}|{detail}|\'\'\'.format(name=t[\'name\'],brief=t[\'brief\'],drived=\' \'.join(t[\'derived\']),includes=t[\'includes\'],detail=t[\'detailed\']))\n"
+ "\n"
+ " for k,v in self.D[\'classes\'].items():\n"
+ " self.print(0,\'## Function Lists of {c} class\'.format(c=v[\'name\']))\n"
+ " # plantuml\n"
+ " plantuml = self.getPlantuml(doc=v.get(\'detailed\',{}).get(\'doc\',{}))\n"
+ " for p in plantuml:\n"
+ " self.plantumlCnt += 1\n"
+ " self.print(0,\"\"\"- ```puml plantmul-{c}.png\"\"\".format(c=self.plantumlCnt))\n"
+ " self.print(2,\'@startuml\')\n"
+ " self.print(2,p)\n"
+ " self.print(2,\'@enduml\')\n"
+ " self.print(2,\'```\')\n"
+ " self.print(0,\'\')\n"
+ " # Table\n"
+ " self.print(2,\'| Accessibility | Function | Description | Parameters | param input | param output | Returns | return Description |\')\n"
+ " self.print(2,\'|-------|-------|----------|-------------|-------|-----|----|-------|\')\n"
+ " for accessibility,v2 in v.items():\n"
+ " if accessibility == \'public_methods\':\n"
+ " for k3,v3 in v2.get(\'members\',{}).items():\n"
+ " t = v2[\'members\'][k3]\n"
+ " func = t[\'name\']\n"
+ " brief = self.getDescription(doc=t.get(\'brief\',{}).get(\'doc\',{}))\n"
+ " detailed = self.getDescription(doc=t.get(\'detailed\',{}).get(\'doc\',{}))\n"
+ " returnType = t.get(\'type\',\'\')\n"
+ " # returnDoc = []\n"
+ " returnDoc = self.ret.join(self.getReturnDescription(doc=t.get(\'detailed\',{}).get(\'doc\',{})))\n"
+ " # params = { \'parameters\': [] , \'in\':[] , \'out\':[] }\n"
+ " params = self.getParameters(parameters=t.get(\'parameters\',{}),detailed_doc=t.get(\'detailed\',{}).get(\'doc\',{}))\n"
+ " #print(\'a\',accessibility,func,detailed)\n"
+ " #print(\'r\',returnType,returnDoc)\n"
+ " #print((self.ret).join(params[\'parameters\']))\n"
+ " #print((self.ret).join([x for x,y in params[\'in\']]))\n"
+ " self.print(2,\'\'\'|{acc}|{func}|{desc}|{param}|{i}|{o}|{r}|{rdesc}|\'\'\'.format(acc=accessibility,func=func,desc=detailed,param=self.ret.join(params[\'parameters\']),i=self.ret.join([ x for x,y in params[\'in\']]),o=self.ret.join([x for x,y in params[\'out\']]),r=returnType,rdesc=returnDoc))\n"
+ " self.print(0,\'\')\n"
+ "\n"
+ "\n"
+ " def print(self,spaceCnt=0,text=\'\'):\n"
+ " spaces = \' \'* (spaceCnt)\n"
+ " for txt in text.split(\'\\n\'):\n"
+ " if self.of:\n"
+ " print(spaces,txt,sep=\'\',file=self.of)\n"
+ " else:\n"
+ " print(spaces,txt,sep=\'\')\n"
+ "\n"
+ " def getParameters(self,parameters,detailed_doc):\n"
+ " \"\"\" parameters\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\'] [\'1\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\'] [\'1\'] [\'declaration_name\'] = \'\'\'a\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\'] [\'1\'] [\'type\'] = \'\'\'int &\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\'] [\'2\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\'] [\'2\'] [\'type\'] = \'\'\'int &\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'parameters\'] [\'2\'] [\'declaration_name\'] = \'\'\'b\'\'\'\n"
+ " # when it declare without name (for example, (const QCString &) ) , it does not have \'declaration_name\' value\n"
+ " D [\'classes\'] [\'4\'] [\'private_methods\'] [\'members\'] [\'5\'] [\'parameters\'] [\'1\'] [\'type\'] = \'\'\'const QCString &\'\'\'\n"
+ " D [\'classes\'] [\'4\'] [\'private_methods\'] [\'members\'] [\'5\'] [\'parameters\'] [\'1\'] [\'definition_name\'] = \'\'\'name\'\'\'\n"
+ " \"\"\"\n"
+ " retParameters = []\n"
+ " for k,v in parameters.items():\n"
+ " if v.get(\'declaration_name\',\'\'):\n"
+ " retParameters.append(\'{t} {d}\'.format(t=v.get(\'type\',\'\'),d=v.get(\'declaration_name\',\'\')))\n"
+ " else:\n"
+ " retParameters.append(\'{t} {d}\'.format(t=v.get(\'type\',\'\'),d=v.get(\'definition_name\',\'\')))\n"
+ "\n"
+ " \"\"\" detailed_doc\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'doc\'] [\'1\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'doc\'] [\'1\'] [\'type\'] = \'\'\'text\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'doc\'] [\'1\'] [\'content\'] = \'\'\'example of out \'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'parameters\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'parameters\'] [\'1\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'parameters\'] [\'1\'] [\'name\'] = \'\'\'b\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'4\'] [\'params\'] [\'1\'] [\'parameters\'] [\'1\'] [\'dir\'] = \'\'\'out\'\'\'\n"
+ " \"\"\"\n"
+ " retIn = []\n"
+ " retOut = []\n"
+ " for k,v in detailed_doc.items(): # k = \'4\'\n"
+ " for k2,v2 in v.items(): # k2 = \'params\'\n"
+ " if k2 == \'params\':\n"
+ " for k3,v3 in v2.items(): # k3 = \'1\'\n"
+ " ldesc = self.getDescription(doc=v3.get(\'doc\'))\n"
+ " ldir = v3.get(\'parameters\',{}).get(\'1\',{}).get(\'dir\',\'\')\n"
+ " lname = v3.get(\'parameters\',{}).get(\'1\',{}).get(\'name\',\'\')\n"
+ " # lname is connected to \'declaration_name\' of \'parameters\' when it has no warning.\n"
+ " if ldir.find(\'in\') >= 0:\n"
+ " retIn.append([lname,ldesc])\n"
+ " if ldir.find(\'out\') >= 0:\n"
+ " retOut.append([lname,ldesc])\n"
+ "\n"
+ "\n"
+ "\n"
+ " # params = { \'parameters\': [] , \'in\':[] , \'out\':[] }\n"
+ " return { \'parameters\': retParameters , \'in\':retIn , \'out\':retOut }\n"
+ "\n"
+ " def getReturnDescription(self,doc):\n"
+ " \"\"\"\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'1\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'1\'] [\'type\'] = \'\'\'text\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'1\'] [\'content\'] = \'\'\'The area of the \'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'2\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'2\'] [\'content\'] = \'\'\'Triangle\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'2\'] [\'link\'] = \'\'\'classTriangle\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'2\'] [\'type\'] = \'\'\'url\'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'3\']={}\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'3\'] [\'content\'] = \'\'\' object. \'\'\'\n"
+ " D [\'classes\'] [\'9\'] [\'public_methods\'] [\'members\'] [\'16\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'return\'] [\'3\'] [\'type\'] = \'\'\'text\'\'\'\n"
+ " \"\"\"\n"
+ " ret = []\n"
+ " for k,v in doc.items(): # k : \'3\' , v [return]...\n"
+ " s = \'\'\n"
+ " for k2,v2 in v.items():\n"
+ " if k2 == \'return\':\n"
+ " ret.append(self.getDescription(doc=doc[k][k2]))\n"
+ " return ret\n"
+ "\n"
+ " def getPlantuml(self,doc):\n"
+ " \"\"\"\n"
+ " D [\'classes\'] [\'2\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'type\'] = \'\'\'plantuml\'\'\'\n"
+ " D [\'classes\'] [\'2\'] [\'detailed\'] [\'doc\'] [\'3\'] [\'content\'] = \'\'\'package \"customer domain\" #DDDDDD { ... \'\'\'\n"
+ " \"\"\"\n"
+ " l = []\n"
+ " for k,v in doc.items(): # k = \'3\'\n"
+ " type = v.get(\'type\',\'\')\n"
+ " if type == \'plantuml\':\n"
+ " l.append(v[\'content\'])\n"
+ " return l\n"
+ "\n"
+ " def getDescription(self,doc):\n"
+ " \'\'\'\n"
+ " link = D [\'classes\'] [\'2\'] [\'public_methods\'] [\'members\'] [\'1\'] [\'brief\'] [\'doc\']\n"
+ " link = D [\'classes\'] [\'2\'] [\'public_methods\'] [\'members\'] [\'2\'] [\'detailed\'] [\'doc\']\n"
+ " \'\'\'\n"
+ " s = \'\'\n"
+ " for k,v in doc.items():\n"
+ " type = v.get(\'type\',\'\')\n"
+ " if type in [\'url\',\'text\']:\n"
+ " s += v.get(\'content\',\'\')\n"
+ " elif type in [\'linebreak\']: # \'parbreak\'\n"
+ " s += self.ret\n"
+ " return s\n"
+ "\n"
+ "if (__name__ == \"__main__\"):\n"
+ " parser = argparse.ArgumentParser(\n"
+ " prog=sys.argv[0],\n"
+ " description=\n"
+ " \'python sample for analyzing class and their member functions\'\n"
+ " )\n"
+ " parser.add_argument( \'--debug\', default=False , action=\"store_true\" , help=\"debug mode on default : false\")\n"
+ " parser.add_argument( \'--outfile\',\n"
+ " metavar=\"\",\n"
+ " type=str,\n"
+ " default=\'\',\n"
+ " help=\'if not exist , it prints stdout\')\n"
+ " args = parser.parse_args()\n"
+ "\n"
+ " ddc = DoxyDocsClass(doxydocs=DoxyDocs.D,outfile=args.outfile,debug=args.debug)\n"
+ " ddc.run()\n";
+
+ return true;
+}
+
+bool PerlModGenerator::generatePythonDoxy2py_pl()
+{
+ std::ofstream pythonStream;
+ if (!createOutputFile(pythonStream, pathPythonDoxy2py_pl))
+ return false;
+
+ pythonStream <<
+ "# BEGIN {push @INC, \'..\'}\n"
+ "use lib \'.\';\n"
+ "use DoxyDocs;\n"
+ "\n"
+ "our %init4py;\n"
+ "\n"
+ "sub change_special_code {\n"
+ " my ($s) = @_;\n"
+ " $s =~ s/\\\'/\\\\\\\'/g;\n"
+ " return $s;\n"
+ "}\n"
+ "\n"
+ "sub generate_cc($$) {\n"
+ " my $str = $_[0];\n"
+ " my $doc = $_[1];\n"
+ " my $cnt = 1;\n"
+ "\n"
+ " my $ps = $str;\n"
+ " $ps =~ s/\\{\\s*/\\[\\\'/g;\n"
+ " $ps =~ s/\\s*\\}/\\\'\\]/g;\n"
+ " $ps =~ s/^\\$//;\n"
+ "\n"
+ " #print \"generate_cc $doc\\n\";\n"
+ " if($doc =~ /^HASH\\(/){\n"
+ " #print PH \"=== $ps\\n\";\n"
+ " if($init4py{$ps} eq \"\"){\n"
+ " print PH \"$ps={}\\n\";\n"
+ " $init4py{$ps} = \"init\";\n"
+ " }\n"
+ " #print \"HASH \" . %{$doc} . \"\\n\";\n"
+ " foreach $key (keys %{$doc}) {\n"
+ " if( not ( (${$doc}{$key} =~ /^ARRAY\\(/) || (${$doc}{$key} =~ /^HASH\\(/) ) ){\n"
+ " #print \"hash $str { $key } = value( ${$doc}{$key} )\\n\";\n"
+ " print PH \"$ps [\'$key\'] = \\\'\\\'\\\'\" . change_special_code(${$doc}{$key}) . \"\\\'\\\'\\\'\\n\";\n"
+ " #print PH \"$ps [\'$key\'] = \\\"\" . change_special_code(${$doc}{$key}) . \"\\\"\\n\";\n"
+ " } else {\n"
+ " generate_cc(\"$str { $key }\", ${$doc}{$key});\n"
+ " }\n"
+ " }\n"
+ " } elsif($doc =~ /^ARRAY\\(/){\n"
+ " #print \"ARRAY @$doc\\n\";\n"
+ " #print PH \"=== $ps\\n\";\n"
+ " if($init4py{$ps} eq \"\"){\n"
+ " print PH \"$ps={}\\n\";\n"
+ " $init4py{$ps} = \"init\";\n"
+ " }\n"
+ " foreach $key (@{$doc}) {\n"
+ " #print \"array $cnt key( $key )\\n\";\n"
+ " #print \"array $doc->{$key}\\n\";\n"
+ " if( not ( ($key =~ /^ARRAY\\(/) || ($key =~ /^HASH\\(/) ) ){\n"
+ " #print \"hash $str { $key } = value( ${$doc}{$key} )\\n\";\n"
+ " print \"ARRAY $str [ $key ] = \\\'\\\'\\\'\" . change_special_code(${$doc}[$key]) . \"\\\'\\\'\\\'\\n\";\n"
+ " } else {\n"
+ " generate_cc(\"$str { $cnt }\",$key);\n"
+ " $cnt ++;\n"
+ " }\n"
+ " }\n"
+ " } else {\n"
+ " print PH \">>> $ps\\n\";\n"
+ " #print \"DOC $str $doc\\n\";\n"
+ " #print \"DOC $str @{$doc}\\n\";\n"
+ " #print \"DOC $str %{$doc}\\n\";\n"
+ " }\n"
+ "}\n"
+ "\n"
+ "\n"
+ "print STDERR \"input DoxyDocs.pm output filename = DoxyDocs.py\\n\";\n"
+ "open(PH, \">\",\"DoxyDocs.py\") or die \"Can\'t open < DoxyDocs.py : $!\";\n"
+ "#generate($doxydocs, $doxystructure);\n"
+ "generate_cc(\"\\$D\",$doxydocs);\n"
+ "close PH;\n"
+ "print STDERR \"DoxyDocs.py has variable of D dictionary including all DoxyDocs.pm\\n\";\n"
+ "\n";
+
+ return true;
+}
+
+// perlmodPython PerlModGenerator file creation code
+
bool PerlModGenerator::generateMakefile()
{
std::ofstream makefileStream;
@@ -2545,6 +3138,40 @@ bool PerlModGenerator::generateMakefile()
"dvi: $(" << prefix << "DOXYLATEX_DVI)\n";
}
+ bool perlmodPython = Config_getBool(PERLMOD_PYTHON);
+ if (perlmodPython) {
+ // perlmodPython PerlModGenerator Makefile
+ makefileStream <<
+ "\n"
+ "# code2cpp\n"
+ "code2cpp:\n"
+ " rm -rf input_perlmodgen_files\n"
+ " mkdir -p input_perlmodgen_files\n"
+ " cd input_perlmodgen_files; ln -s ../put2cpp.py put2cpp.py\n"
+ " cd input_perlmodgen_files; ln -s ../README.md README.md\n"
+ " cd input_perlmodgen_files; ln -s ../sample.py sample.py\n"
+ " cd input_perlmodgen_files; ln -s ../doxy2py.pl doxy2py.pl\n"
+ " # if you want to add python file into perlmodgen.cpp , you can use it.\n"
+ " # first of all, you add your py in input_perlmodgen_files directory\n"
+ " # please change ../../../../src/perlmodgen.cpp to location of src/perlmodgen.cpp\n"
+ " # output filename : perlmodgen.cpp.mod\n"
+ " python3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp --outlog=out-perlmodgen.log\n"
+ "\n"
+ "# run python code with DoxyDocs\n"
+ "python_doc:\n"
+ " @echo \"if you want to get plantuml without running java ,\"\n"
+ " @echo \" 1. set PLANTUML_JAR_PATH = ./plantuml.jar in Doxygile\"\n"
+ " @echo \" 2. do \'touch plantuml.jar\'\"\n"
+ " @echo \" 3. run \'doxygen\' then your DoxyDocs.pm will include plantuml.\"\n"
+ " @echo \"\"\n"
+ " perl doxy2py.pl\n"
+ " python3 sample.py --outfile=output.md\n"
+ " @echo \"\"\n"
+ " @echo \"refer to https://github.com/cheoljoo/doxygen_perlmod_python for getting more example and usage\"\n"
+ "\n";
+ // perlmodPython PerlModGenerator Makefile
+ }
+
return true;
}
@@ -2936,6 +3563,22 @@ void PerlModGenerator::generate()
&& generateDoxyFormatTex()))
return;
}
+
+ bool perlmodPython = Config_getBool(PERLMOD_PYTHON);
+ if (perlmodPython) {
+ // perlmodPython PerlModGenerator code in generate function
+ pathPythonPut2cpp_py = perlModAbsPath + "/put2cpp.py";
+ pathPythonREADME_md = perlModAbsPath + "/README.md";
+ pathPythonSample_py = perlModAbsPath + "/sample.py";
+ pathPythonDoxy2py_pl = perlModAbsPath + "/doxy2py.pl";
+ if (!(generatePythonPut2cpp_py()
+ && generatePythonREADME_md()
+ && generatePythonSample_py()
+ && generatePythonDoxy2py_pl()))
+ return;
+ // perlmodPython PerlModGenerator code in generate function
+ }
+
}
void generatePerlMod()
@@ -2964,4 +3607,4 @@ void generatePerlMod()
(replace-match (cadar replacers) t))
(goto-char start)
(setq replacers (cdr replacers)))))))
-*/
+*/
\ No newline at end of file
--- a PPN by Garber Painting Akron. With Image Size Reduction included!Fetched URL: http://github.com/doxygen/doxygen/pull/10782.diff
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy