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








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- 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