From 81c0a28daad5248edb0a8f44608b8933740be090 Mon Sep 17 00:00:00 2001 From: "Charles.lee" Date: Tue, 16 Jan 2024 11:11:58 +0900 Subject: [PATCH 01/10] gitconfig --- gitconfig | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 gitconfig diff --git a/gitconfig b/gitconfig new file mode 100644 index 00000000000..bffabece51a --- /dev/null +++ b/gitconfig @@ -0,0 +1,25 @@ +[user] + email = cheoljoo@gmail.com + name = Charles.lee +[core] + repositoryformatversion = 0 + filemode = true + bare = false + logallrefupdates = true +[remote "origin"] + url = https://github.com/cheoljoo/doxygen.git + fetch = +refs/heads/*:refs/remotes/origin/* +[branch "master"] + remote = origin + merge = refs/heads/master +[branch "clean"] + remote = origin + merge = refs/heads/clean +[remote "upstream"] + url = https://github.com/doxygen/doxygen.git + fetch = +refs/heads/*:refs/remotes/upstream/* +[credential] + helper = store +[branch "perlmod_enum_type"] + remote = origin + merge = refs/heads/perlmod_enum_type From ef9199613beeb165c6819f78f3b036bac45a4a1c Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Fri, 8 Mar 2024 14:02:47 +0900 Subject: [PATCH 02/10] design note: - out.cpp has adding code. - check the point with // perlmodPython PerlModGenerator [key...] --- src/perlmodgen.cpp | 11 ++++ src/put2cpp.py | 132 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 src/put2cpp.py diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index a4df99c6c50..2b605131ef4 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1409,6 +1409,8 @@ class PerlModGenerator QCString pathDoxyLatexPL; QCString pathDoxyLatexStructurePL; QCString pathDoxyRules; + // perlmodPython PerlModGenerator path define + // perlmodPython PerlModGenerator path define QCString pathMakefile; inline PerlModGenerator(bool pretty) : m_output(pretty) { } @@ -1435,6 +1437,8 @@ class PerlModGenerator bool generateDoxyLatexPL(); bool generateDoxyLatexStructurePL(); bool generateDoxyRules(); + // perlmodPython PerlModGenerator declare function + // perlmodPython PerlModGenerator declare function bool generateMakefile(); bool generatePerlModOutput(); @@ -2509,6 +2513,9 @@ bool PerlModGenerator::generateDoxyRules() return true; } +// perlmodPython PerlModGenerator file creation code +// perlmodPython PerlModGenerator file creation code + bool PerlModGenerator::generateMakefile() { std::ofstream makefileStream; @@ -2923,6 +2930,10 @@ void PerlModGenerator::generate() && generateDoxyFormatTex())) return; } + + // perlmodPython PerlModGenerator code in generate function + // perlmodPython PerlModGenerator code in generate function + } void generatePerlMod() diff --git a/src/put2cpp.py b/src/put2cpp.py new file mode 100644 index 00000000000..c81fe237e5c --- /dev/null +++ b/src/put2cpp.py @@ -0,0 +1,132 @@ +import sys +import argparse +import re +import os + +class Solution: + def __init__(self,inputdir,out,debug): + self.inputdir = inputdir + self.out = out + self.debug = debug + files = os.listdir(self.inputdir) + self.p = [] + self.o = {} + self.o['path define'] = [] + self.o['declare function'] = [] + self.o['file creation code'] = [] + self.o['code in generate function'] = [] + self.p.append('''class PerlModGenerator''') + self.p.append('''{''') + self.p.append(''' QCString pathDoxyRules;''') + self.p.append(''' // perlmodPython code''') + for file in files: + self.o['path define'].append(''' QCString path{f};'''.format(f=self.createPythonName(file))) + self.p += self.o['path define'] + self.p.append(''' QCString pathMakefile;''') + self.p.append('') + self.p.append(''' bool generateDoxyRules();''') + self.p.append(''' // perlmodPython code''') + for file in files: + self.o['declare function'].append(''' bool generate{f}();'''.format(f=self.createPythonName(file))) + self.p += self.o['declare function'] + self.p.append(''' bool generateMakefile();''') + self.p.append('''}''') + self.p.append('') + + self.p.append('''bool PerlModGenerator::generateDoxyRules()''') + self.p.append('''{''') + self.p.append('''}''') + self.p.append('') + self.p.append('''// perlmodPython code''') + self.p.append('') + for file in files: + filepath = self.inputdir+'/'+file + ff = self.createPythonName(file) + cpp = [] + with open(filepath,'r', encoding='utf-8', errors='ignore') as f: + lines = f.readlines() + for line in lines: + line = line.rstrip() + line = line.replace('"', '\\"') + line = line.replace('\\','\\\\') + cpp.append(' "' + line + '\\n"') + self.o['file creation code'].append('''bool PerlModGenerator::generate{ff}()'''.format(ff=ff)) + self.o['file creation code'].append('''{''') + self.o['file creation code'].append(''' std::ofstream pythonStream;''') + self.o['file creation code'].append(''' if (!createOutputFile(pythonStream, path{ff}))'''.format(ff=ff)) + self.o['file creation code'].append(''' return false;''') + self.o['file creation code'].append('') + self.o['file creation code'].append(''' pythonStream <<''') + self.o['file creation code'].append('\n'.join(cpp) + ';') + self.o['file creation code'].append('') + self.o['file creation code'].append(''' return true;''') + self.o['file creation code'].append('''}''') + self.o['file creation code'].append('') + self.p += self.o['file creation code'] + self.p.append('''bool PerlModGenerator::generateMakefile()''') + self.p.append('''{''') + self.p.append('''}''') + self.p.append('') + + self.p.append('''void PerlModGenerator::generate()''') + self.p.append('''{''') + self.p.append(''' bool perlmodLatex = Config_getBool(PERLMOD_LATEX);''') + self.p.append('') + self.p.append(''' if (perlmodLatex) {''') + self.p.append(''' }''') + self.p.append('') + self.p.append(' // perlmodPython code') + self.p.append('') + self.o['code in generate function'].append(''' bool perlmodPython = Config_getBool(PERLMOD_PYTHON);''') + self.o['code in generate function'].append(''' if (perlmodPython) {''') + generateList = [] + for file in files: + ff = self.createPythonName(file) + self.o['code in generate function'].append(''' path{ff} = perlModAbsPath + "/{f}";'''.format(f=file,ff=ff)) + generateList.append('generate' + ff + '()') + print('generateList',generateList) + self.o['code in generate function'].append(''' if (!(''' + '''\n && '''.join(generateList) + '''))''') + self.o['code in generate function'].append(''' return;''') + self.o['code in generate function'].append(''' }''') + self.p += self.o['code in generate function'] + self.p.append('''}''') + self.p.append('') + self.p.append('''void generatePerlMod()''') + self.p.append('''{''') + self.p.append('''}''') + with open(self.out ,"w") as f: + print('write:',self.out) + f.write('\n'.join(self.p)) + + def createPythonName(self,file): + if not file: + return file + file2 = file.replace('.py','') + fileList = list(file2) + ff = 'Python' + fileList[0].upper() + ''.join(fileList[1:]) + return ff + +if (__name__ == "__main__"): + parser = argparse.ArgumentParser( + prog=sys.argv[0], + description= + 'put python code into cpp code and edit perlmodgen.cpp to add python code' + ) + parser.add_argument( '--debug', '-d' , action='store_const' , const=1 , help='debug on') + parser.add_argument( '--inputdir', + metavar="", + type=str, + default='input', + help='input directory') + parser.add_argument( '--out', + metavar="", + type=str, + default='out.cpp', + help='insert python code into cpp (perlmodgen.cpp)') + + args = parser.parse_args() + debug = args.debug + + print('inputdir:',args.inputdir) + S = Solution(args.inputdir,args.out,args.debug) + From f93e9ac48a60850fc6a73282e8d3e78c060d7fc6 Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Tue, 12 Mar 2024 19:33:11 +0900 Subject: [PATCH 03/10] To use python , I add PERLMOD_PYTHON option in config.xml. PERLMOD_PYHON is YES (depends on GENERATE_PERLMOD = YES option) - config.xml - add PERLMOD_PYTHON with description - it is option to make python program with perlmod result - put2cpp.py - change/insert the code in perlmodgen.cpp between // perlmodPython PerlModGenerator ... ~ - perlmodgen.cpp - includes put2cpp.py - change Makefile to support many example - I will add more python file --- src/config.xml | 10 ++ src/perlmodgen.cpp | 252 ++++++++++++++++++++++++++++++++++++++++++++- src/put2cpp.py | 106 ++++++++++++++++--- 3 files changed, 350 insertions(+), 18 deletions(-) diff --git a/src/config.xml b/src/config.xml index 739e6fc916c..6a35d4948e1 100644 --- a/src/config.xml +++ b/src/config.xml @@ -3501,6 +3501,16 @@ 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 2b605131ef4..2effd43617f 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1410,6 +1410,7 @@ class PerlModGenerator QCString pathDoxyLatexStructurePL; QCString pathDoxyRules; // perlmodPython PerlModGenerator path define + QCString pathPythonPut2cpp; // perlmodPython PerlModGenerator path define QCString pathMakefile; @@ -1438,6 +1439,7 @@ class PerlModGenerator bool generateDoxyLatexStructurePL(); bool generateDoxyRules(); // perlmodPython PerlModGenerator declare function + bool generatePythonPut2cpp(); // perlmodPython PerlModGenerator declare function bool generateMakefile(); bool generatePerlModOutput(); @@ -2514,6 +2516,225 @@ bool PerlModGenerator::generateDoxyRules() } // perlmodPython PerlModGenerator file creation code +bool PerlModGenerator::generatePythonPut2cpp() +{ + std::ofstream pythonStream; + if (!createOutputFile(pythonStream, pathPythonPut2cpp)) + return false; + + pythonStream << + "import sys\n" + "import argparse\n" + "import re\n" + "import os\n" + "\n" + "class Solution:\n" + " def __init__(self,inputdir,out,perlmodgen,debug):\n" + " self.inputdir = inputdir\n" + " self.out = out\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" + " 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(\'\'\'# python2cpp init\'\'\')\n" + " mk.append(\'\'\'python2cpp_init:\'\'\')\n" + " mk.append(\'\'\'\\trm -rf input_python_files\'\'\')\n" + " mk.append(\'\'\'\\tmkdir -p input_python_files\'\'\')\n" + " for file in files:\n" + " mk.append(\'\'\'\\tcd input_python_files; ln -s ../{f} {f}\'\'\'.format(f=file))\n" + " mk.append(\'\')\n" + " mk.append(\'\'\'# if you want to add python file into perlmodgen.cpp , you can use it.\'\'\')\n" + " mk.append(\'\'\'# first of all, you add your py in input_python_files directory\'\'\')\n" + " mk.append(\'\'\'python2cpp_run:\'\'\')\n" + " mk.append(\'\'\'\\t# please change ??? to location of src/perlmodgen.cpp\'\'\')\n" + " mk.append(\'\'\'\\t# output filename : perlmodgen.cpp.mod\'\'\')\n" + " mk.append(\'\'\'\\tpython3 put2cpp.py --inputdir=input_python_files --perlmodgen=???\'\'\')\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.out ,\"w\") as f:\n" + " print(\'write:\',self.out)\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" + " if not file:\n" + " return file\n" + " file2 = file.replace(\'.py\',\'\')\n" + " fileList = list(file2)\n" + " ff = \'Python\' + fileList[0].upper() + \'\'.join(fileList[1:])\n" + " return ff\n" + "\n" + " def line2cpp(self,indent,line):\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_python_files\',\n" + " help=\'input directory with python code. this python code 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( \'--out\',\n" + " metavar=\"\",\n" + " type=str,\n" + " default=\'out.mod\',\n" + " help=\'insert python code into cpp (perlmodgen.cpp)\')\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.out,args.perlmodgen,args.debug)\n" + "\n"; + + return true; +} + // perlmodPython PerlModGenerator file creation code bool PerlModGenerator::generateMakefile() @@ -2539,6 +2760,25 @@ bool PerlModGenerator::generateMakefile() "dvi: $(" << prefix << "DOXYLATEX_DVI)\n"; } + bool perlmodPython = Config_getBool(PERLMOD_PYTHON); + if (perlmodPython) { + // perlmodPython PerlModGenerator Makefile + makefileStream << + "# python2cpp init\n" + "python2cpp_init:\n" + " rm -rf input_python_files\n" + " mkdir -p input_python_files\n" + " cd input_python_files; ln -s ../put2cpp.py put2cpp.py\n" + "\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_python_files directory\n" + "python2cpp_run:\n" + " # please change ??? to location of src/perlmodgen.cpp\n" + " # output filename : perlmodgen.cpp.mod\n" + " python3 put2cpp.py --inputdir=input_python_files --perlmodgen=???\n"; + // perlmodPython PerlModGenerator Makefile + } + return true; } @@ -2931,8 +3171,14 @@ void PerlModGenerator::generate() return; } - // perlmodPython PerlModGenerator code in generate function - // perlmodPython PerlModGenerator code in generate function + bool perlmodPython = Config_getBool(PERLMOD_PYTHON); + if (perlmodPython) { + // perlmodPython PerlModGenerator code in generate function + pathPythonPut2cpp = perlModAbsPath + "/put2cpp.py"; + if (!(generatePythonPut2cpp())) + return; + // perlmodPython PerlModGenerator code in generate function + } } @@ -2962,4 +3208,4 @@ void generatePerlMod() (replace-match (cadar replacers) t)) (goto-char start) (setq replacers (cdr replacers))))))) -*/ +*/ \ No newline at end of file diff --git a/src/put2cpp.py b/src/put2cpp.py index c81fe237e5c..c73669f3da8 100644 --- a/src/put2cpp.py +++ b/src/put2cpp.py @@ -4,10 +4,15 @@ import os class Solution: - def __init__(self,inputdir,out,debug): + def __init__(self,inputdir,out,perlmodgen,debug): self.inputdir = inputdir self.out = out + self.perlmodgen = perlmodgen self.debug = debug + if self.perlmodgen and not os.path.exists(self.perlmodgen): + print('error: not exist file :', self.perlmodgen) + print(' !! set --perlmodgen option with the location of perlmodgen.cpp') + quit(4) files = os.listdir(self.inputdir) self.p = [] self.o = {} @@ -15,6 +20,7 @@ def __init__(self,inputdir,out,debug): self.o['declare function'] = [] self.o['file creation code'] = [] self.o['code in generate function'] = [] + self.o['Makefile'] = [] self.p.append('''class PerlModGenerator''') self.p.append('''{''') self.p.append(''' QCString pathDoxyRules;''') @@ -45,11 +51,10 @@ def __init__(self,inputdir,out,debug): cpp = [] with open(filepath,'r', encoding='utf-8', errors='ignore') as f: lines = f.readlines() + #bs = ' \ ' + #bs = bs.replace(' ','') for line in lines: - line = line.rstrip() - line = line.replace('"', '\\"') - line = line.replace('\\','\\\\') - cpp.append(' "' + line + '\\n"') + cpp.append(self.line2cpp(4,line)) self.o['file creation code'].append('''bool PerlModGenerator::generate{ff}()'''.format(ff=ff)) self.o['file creation code'].append('''{''') self.o['file creation code'].append(''' std::ofstream pythonStream;''') @@ -77,8 +82,6 @@ def __init__(self,inputdir,out,debug): self.p.append('') self.p.append(' // perlmodPython code') self.p.append('') - self.o['code in generate function'].append(''' bool perlmodPython = Config_getBool(PERLMOD_PYTHON);''') - self.o['code in generate function'].append(''' if (perlmodPython) {''') generateList = [] for file in files: ff = self.createPythonName(file) @@ -87,16 +90,76 @@ def __init__(self,inputdir,out,debug): print('generateList',generateList) self.o['code in generate function'].append(''' if (!(''' + '''\n && '''.join(generateList) + '''))''') self.o['code in generate function'].append(''' return;''') - self.o['code in generate function'].append(''' }''') self.p += self.o['code in generate function'] self.p.append('''}''') self.p.append('') self.p.append('''void generatePerlMod()''') self.p.append('''{''') self.p.append('''}''') + self.p.append('') + self.p.append(''' bool perlmodPython = Config_getBool(PERLMOD_PYTHON);''') + self.p.append(''' if (perlmodPython) {''') + self.o['Makefile'].append(''' makefileStream <<''') + mk = [] + mk.append('''# python2cpp init''') + mk.append('''python2cpp_init:''') + mk.append('''\trm -rf input_python_files''') + mk.append('''\tmkdir -p input_python_files''') + for file in files: + mk.append('''\tcd input_python_files; ln -s ../{f} {f}'''.format(f=file)) + mk.append('') + mk.append('''# if you want to add python file into perlmodgen.cpp , you can use it.''') + mk.append('''# first of all, you add your py in input_python_files directory''') + mk.append('''python2cpp_run:''') + mk.append('''\t# please change ??? to location of src/perlmodgen.cpp''') + mk.append('''\t# output filename : perlmodgen.cpp.mod''') + mk.append('''\tpython3 put2cpp.py --inputdir=input_python_files --perlmodgen=???''') + self.o['Makefile'].append('\n'.join([self.line2cpp(6,item) for item in mk]) + ';') + self.p += self.o['Makefile'] + self.p.append(''' }''') with open(self.out ,"w") as f: print('write:',self.out) f.write('\n'.join(self.p)) + startRe = re.compile('^\s*//\s+perlmodPython\s+PerlModGenerator\s+(?P[^<>]+)\s*') + endRe = re.compile('^\s*//\s+perlmodPython\s+PerlModGenerator\s+(?P[^<>]+)\s*') + if self.perlmodgen: + pmg = [] + lines = [] + with open(self.perlmodgen,'r', encoding='utf-8', errors='ignore') as f: + lines = f.readlines() + flag = 0 + startKey = '' + endKey = '-' + for line in lines: + line = line.rstrip() + grpStart = startRe.search(line) + grpEnd = endRe.search(line) + if grpStart: + if flag == 1: + print('error: already you were in perlmodpython pair') + print(' !! please chek ~ pair') + quit(4) + print('start [',grpStart.group('key').strip(),']',line) + startKey = grpStart.group('key').strip() + flag = 1 + pmg.append(line) + elif grpEnd: + if flag == 0: + print('error: already you were out of perlmodpython pair') + print(' !! please chek ~ pair') + quit(4) + print('end [',grpEnd.group('key').strip(),']',line) + endKey = grpEnd.group('key').strip() + flag = 0 + pmg += self.o[endKey] + pmg.append(line) + else: + if flag == 0: + pmg.append(line) + with open(self.perlmodgen + '.mod','w') as f: + print('! output perlmodgen file:',self.perlmodgen + '.mod') + s = "\n".join(pmg) + f.write(s) def createPythonName(self,file): if not file: @@ -105,7 +168,14 @@ def createPythonName(self,file): fileList = list(file2) ff = 'Python' + fileList[0].upper() + ''.join(fileList[1:]) return ff - + + def line2cpp(self,indent,line): + line = line.rstrip() + line = line.replace('\\','\\\\') + line = line.replace("'", "\\'") + line = line.replace('"', '\\"') + return ' '*indent + '"' + line + str('\\n') + '"' + if (__name__ == "__main__"): parser = argparse.ArgumentParser( prog=sys.argv[0], @@ -113,20 +183,26 @@ def createPythonName(self,file): 'put python code into cpp code and edit perlmodgen.cpp to add python code' ) parser.add_argument( '--debug', '-d' , action='store_const' , const=1 , help='debug on') - parser.add_argument( '--inputdir', + parser.add_argument( '--inputdir', + metavar="", + type=str, + default='input_python_files', + help='input directory with python code. this python code will be inserted in cpp') + parser.add_argument( '--perlmodgen', metavar="", type=str, - default='input', - help='input directory') - parser.add_argument( '--out', + default='./perlmodgen.cpp', + help='location of perlmodgen.cpp. python codes in inputdir will be updated.') + parser.add_argument( '--out', metavar="", type=str, - default='out.cpp', + default='out.mod', help='insert python code into cpp (perlmodgen.cpp)') args = parser.parse_args() debug = args.debug print('inputdir:',args.inputdir) - S = Solution(args.inputdir,args.out,args.debug) + print('input location of perlmodegen.cpp:',args.perlmodgen) + S = Solution(args.inputdir,args.out,args.perlmodgen,args.debug) From 7a86f21df5c4ab04aeca560532200bd92278b5cc Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Mon, 25 Mar 2024 22:23:19 +0900 Subject: [PATCH 04/10] Change Makefile - make code2cpp - doxy2py.pl / sample.py / put2cpp.py - generate new perlmodgen.cpp.mod. you need to copy it to perlmodgen.cpp. - make python - run doxy2py.pl -> make DoxyDocs.py from Doxydocs.pm - run sample.py -> print something from DoxyDocs.py --- src/perlmodgen.cpp | 198 ++++++++++++++++++++++++++++++++++++++------- src/put2cpp.py | 50 ++++++++---- 2 files changed, 204 insertions(+), 44 deletions(-) diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 2effd43617f..0a33a8b99e2 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1410,7 +1410,9 @@ class PerlModGenerator QCString pathDoxyLatexStructurePL; QCString pathDoxyRules; // perlmodPython PerlModGenerator path define - QCString pathPythonPut2cpp; + QCString pathPythonPut2cpp_py; + QCString pathPythonSample_py; + QCString pathPythonDoxy2py_pl; // perlmodPython PerlModGenerator path define QCString pathMakefile; @@ -1439,7 +1441,9 @@ class PerlModGenerator bool generateDoxyLatexStructurePL(); bool generateDoxyRules(); // perlmodPython PerlModGenerator declare function - bool generatePythonPut2cpp(); + bool generatePythonPut2cpp_py(); + bool generatePythonSample_py(); + bool generatePythonDoxy2py_pl(); // perlmodPython PerlModGenerator declare function bool generateMakefile(); bool generatePerlModOutput(); @@ -2516,10 +2520,10 @@ bool PerlModGenerator::generateDoxyRules() } // perlmodPython PerlModGenerator file creation code -bool PerlModGenerator::generatePythonPut2cpp() +bool PerlModGenerator::generatePythonPut2cpp_py() { std::ofstream pythonStream; - if (!createOutputFile(pythonStream, pathPythonPut2cpp)) + if (!createOutputFile(pythonStream, pathPythonPut2cpp_py)) return false; pythonStream << @@ -2529,7 +2533,18 @@ bool PerlModGenerator::generatePythonPut2cpp() "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,out,perlmodgen,debug):\n" + " \'\'\'\n" + " This is init funciton \"\"\" test \"\"\"\n" + " \'\'\'\n" " self.inputdir = inputdir\n" " self.out = out\n" " self.perlmodgen = perlmodgen\n" @@ -2626,19 +2641,24 @@ bool PerlModGenerator::generatePythonPut2cpp() " self.p.append(\'\'\' if (perlmodPython) {\'\'\')\n" " self.o[\'Makefile\'].append(\'\'\' makefileStream <<\'\'\')\n" " mk = []\n" - " mk.append(\'\'\'# python2cpp init\'\'\')\n" - " mk.append(\'\'\'python2cpp_init:\'\'\')\n" - " mk.append(\'\'\'\\trm -rf input_python_files\'\'\')\n" - " mk.append(\'\'\'\\tmkdir -p input_python_files\'\'\')\n" - " for file in files:\n" - " mk.append(\'\'\'\\tcd input_python_files; ln -s ../{f} {f}\'\'\'.format(f=file))\n" " mk.append(\'\')\n" - " mk.append(\'\'\'# if you want to add python file into perlmodgen.cpp , you can use it.\'\'\')\n" - " mk.append(\'\'\'# first of all, you add your py in input_python_files directory\'\'\')\n" - " mk.append(\'\'\'python2cpp_run:\'\'\')\n" - " mk.append(\'\'\'\\t# please change ??? to location of src/perlmodgen.cpp\'\'\')\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_python_files --perlmodgen=???\'\'\')\n" + " mk.append(\'\'\'\\tpython3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp\'\'\')\n" + " mk.append(\'\')\n" + " mk.append(\'\'\'# run python code with DoxyDocs\'\'\')\n" + " mk.append(\'\'\'python:\'\'\')\n" + " mk.append(\'\'\'\\tperl doxy2py.pl\'\'\')\n" + " mk.append(\'\'\'\\tpython3 sample.py\'\'\')\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" @@ -2687,14 +2707,20 @@ bool PerlModGenerator::generatePythonPut2cpp() " 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(\'.py\',\'\')\n" + " file2 = file.replace(\'.\',\'_\')\n" " fileList = list(file2)\n" " ff = \'Python\' + fileList[0].upper() + \'\'.join(fileList[1:])\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" @@ -2711,8 +2737,8 @@ bool PerlModGenerator::generatePythonPut2cpp() " parser.add_argument( \'--inputdir\',\n" " metavar=\"\",\n" " type=str,\n" - " default=\'input_python_files\',\n" - " help=\'input directory with python code. this python code will be inserted in cpp\')\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" @@ -2735,6 +2761,107 @@ bool PerlModGenerator::generatePythonPut2cpp() return true; } +bool PerlModGenerator::generatePythonSample_py() +{ + std::ofstream pythonStream; + if (!createOutputFile(pythonStream, pathPythonSample_py)) + return false; + + pythonStream << + "import DoxyDocs\n" + "\n" + "docs = DoxyDocs.D\n" + "for k,v in docs.items():\n" + " for k1,v2 in v.items():\n" + " print(k,k1)\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() @@ -2764,18 +2891,25 @@ bool PerlModGenerator::generateMakefile() if (perlmodPython) { // perlmodPython PerlModGenerator Makefile makefileStream << - "# python2cpp init\n" - "python2cpp_init:\n" - " rm -rf input_python_files\n" - " mkdir -p input_python_files\n" - " cd input_python_files; ln -s ../put2cpp.py put2cpp.py\n" "\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_python_files directory\n" - "python2cpp_run:\n" - " # please change ??? to location of src/perlmodgen.cpp\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 ../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_python_files --perlmodgen=???\n"; + " python3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp\n" + "\n" + "# run python code with DoxyDocs\n" + "python:\n" + " perl doxy2py.pl\n" + " python3 sample.py\n" + "\n"; // perlmodPython PerlModGenerator Makefile } @@ -3174,8 +3308,12 @@ void PerlModGenerator::generate() bool perlmodPython = Config_getBool(PERLMOD_PYTHON); if (perlmodPython) { // perlmodPython PerlModGenerator code in generate function - pathPythonPut2cpp = perlModAbsPath + "/put2cpp.py"; - if (!(generatePythonPut2cpp())) + pathPythonPut2cpp_py = perlModAbsPath + "/put2cpp.py"; + pathPythonSample_py = perlModAbsPath + "/sample.py"; + pathPythonDoxy2py_pl = perlModAbsPath + "/doxy2py.pl"; + if (!(generatePythonPut2cpp_py() + && generatePythonSample_py() + && generatePythonDoxy2py_pl())) return; // perlmodPython PerlModGenerator code in generate function } diff --git a/src/put2cpp.py b/src/put2cpp.py index c73669f3da8..35ea52156a4 100644 --- a/src/put2cpp.py +++ b/src/put2cpp.py @@ -4,7 +4,18 @@ import os class Solution: + ''' + we replace several points. + - path define + - declare function + - file creation code + - code in generate function + - Makefile + ''' def __init__(self,inputdir,out,perlmodgen,debug): + ''' + This is init funciton """ test """ + ''' self.inputdir = inputdir self.out = out self.perlmodgen = perlmodgen @@ -101,19 +112,24 @@ def __init__(self,inputdir,out,perlmodgen,debug): self.p.append(''' if (perlmodPython) {''') self.o['Makefile'].append(''' makefileStream <<''') mk = [] - mk.append('''# python2cpp init''') - mk.append('''python2cpp_init:''') - mk.append('''\trm -rf input_python_files''') - mk.append('''\tmkdir -p input_python_files''') - for file in files: - mk.append('''\tcd input_python_files; ln -s ../{f} {f}'''.format(f=file)) mk.append('') - mk.append('''# if you want to add python file into perlmodgen.cpp , you can use it.''') - mk.append('''# first of all, you add your py in input_python_files directory''') - mk.append('''python2cpp_run:''') - mk.append('''\t# please change ??? to location of src/perlmodgen.cpp''') + mk.append('''# code2cpp''') + mk.append('''code2cpp:''') + mk.append('''\trm -rf input_perlmodgen_files''') + mk.append('''\tmkdir -p input_perlmodgen_files''') + for file in files: + mk.append('''\tcd input_perlmodgen_files; ln -s ../{f} {f}'''.format(f=file)) + mk.append('''\t# if you want to add python file into perlmodgen.cpp , you can use it.''') + mk.append('''\t# first of all, you add your py in input_perlmodgen_files directory''') + mk.append('''\t# please change ../../../../src/perlmodgen.cpp to location of src/perlmodgen.cpp''') mk.append('''\t# output filename : perlmodgen.cpp.mod''') - mk.append('''\tpython3 put2cpp.py --inputdir=input_python_files --perlmodgen=???''') + mk.append('''\tpython3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp''') + mk.append('') + mk.append('''# run python code with DoxyDocs''') + mk.append('''python:''') + mk.append('''\tperl doxy2py.pl''') + mk.append('''\tpython3 sample.py''') + mk.append('') self.o['Makefile'].append('\n'.join([self.line2cpp(6,item) for item in mk]) + ';') self.p += self.o['Makefile'] self.p.append(''' }''') @@ -162,14 +178,20 @@ def __init__(self,inputdir,out,perlmodgen,debug): f.write(s) def createPythonName(self,file): + ''' + create new path name + ''' if not file: return file - file2 = file.replace('.py','') + file2 = file.replace('.','_') fileList = list(file2) ff = 'Python' + fileList[0].upper() + ''.join(fileList[1:]) return ff def line2cpp(self,indent,line): + ''' + change characters for C++ + ''' line = line.rstrip() line = line.replace('\\','\\\\') line = line.replace("'", "\\'") @@ -186,8 +208,8 @@ def line2cpp(self,indent,line): parser.add_argument( '--inputdir', metavar="", type=str, - default='input_python_files', - help='input directory with python code. this python code will be inserted in cpp') + default='input_perlmodgen_files', + help='input directory with python code. files of this directory will be inserted in cpp') parser.add_argument( '--perlmodgen', metavar="", type=str, From 8cbe4f6ad323214daa418847b02c1b6b0c62a3fd Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Mon, 1 Apr 2024 15:10:45 +0900 Subject: [PATCH 05/10] make markdown file with classes and their members table after 'make python' - make python - run doxy2py.pl -> make DoxyDocs.py from Doxydocs.pm - run sample.py --outfile=output.md -> output.md makes documents for classes and their member functions - you can see the result with markdown viwer. --- src/perlmodgen.cpp | 181 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 175 insertions(+), 6 deletions(-) diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 0a33a8b99e2..d25e37ff7fa 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -2657,7 +2657,7 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " mk.append(\'\'\'# run python code with DoxyDocs\'\'\')\n" " mk.append(\'\'\'python:\'\'\')\n" " mk.append(\'\'\'\\tperl doxy2py.pl\'\'\')\n" - " mk.append(\'\'\'\\tpython3 sample.py\'\'\')\n" + " mk.append(\'\'\'\\tpython3 sample.py --outfile=output.md\'\'\')\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" @@ -2769,11 +2769,180 @@ bool PerlModGenerator::generatePythonSample_py() 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.tabsize = 2\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" + "\n" + " for k,v in self.D[\'classes\'].items():\n" + " self.print(0,\'\')\n" + " self.print(0,\'## Function Lists of {c} class\'.format(c=v[\'name\']))\n" + " self.print(1,\'| Accessibility | Function | Description | Parameters | param input | param output | Returns | return Description |\')\n" + " self.print(1,\'|-------|-------|----------|-------------|-------|-----|----|-------|\')\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(1,\'\'\'|{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" + "\n" + "\n" + " def print(self,indent=0,text=\'\'):\n" + " spaces = \' \'* (self.tabsize * indent)\n" + " if self.of:\n" + " print(spaces,text,sep=\'\',file=self.of)\n" + " else:\n" + " print(spaces,text,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 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" - "docs = DoxyDocs.D\n" - "for k,v in docs.items():\n" - " for k1,v2 in v.items():\n" - " print(k,k1)\n"; + " ddc = DoxyDocsClass(doxydocs=DoxyDocs.D,outfile=args.outfile,debug=args.debug)\n" + " ddc.run()\n"; return true; } @@ -2908,7 +3077,7 @@ bool PerlModGenerator::generateMakefile() "# run python code with DoxyDocs\n" "python:\n" " perl doxy2py.pl\n" - " python3 sample.py\n" + " python3 sample.py --outfile=output.md\n" "\n"; // perlmodPython PerlModGenerator Makefile } From fc6f90b3b11b5b21eb7baa15412a0074367416f9 Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Mon, 1 Apr 2024 22:24:14 +0900 Subject: [PATCH 06/10] add plantuml in ```make python_doc``` - problems - python : show member function 6 times. so you need to change it in case of python. I can not find which is python. --- src/perlmodgen.cpp | 55 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 44 insertions(+), 11 deletions(-) diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index d25e37ff7fa..995c0174127 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -2655,7 +2655,11 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " mk.append(\'\'\'\\tpython3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp\'\'\')\n" " mk.append(\'\')\n" " mk.append(\'\'\'# run python code with DoxyDocs\'\'\')\n" - " mk.append(\'\'\'python:\'\'\')\n" + " mk.append(\'\'\'python_doc:\'\'\')\n" + " mk.append(\'\'\'\\t# if you want to get plantuml without running java ,\'\'\')\n" + " mk.append(\'\'\'\\t# 1. set PLANTUML_JAR_PATH = ./plantuml.jar in Doxygile\'\'\')\n" + " mk.append(\'\'\'\\t# 2. do \'touch plantuml.jar\' \'\'\')\n" + " mk.append(\'\'\'\\t# 3. run \'doxygen\' then your DoxyDocs.pm will include plantuml.\'\'\')\n" " mk.append(\'\'\'\\tperl doxy2py.pl\'\'\')\n" " mk.append(\'\'\'\\tpython3 sample.py --outfile=output.md\'\'\')\n" " mk.append(\'\')\n" @@ -2811,12 +2815,24 @@ bool PerlModGenerator::generatePythonSample_py() " 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" + " # plantuml\n" + " for k,v in self.D[\'classes\'].items():\n" + " plantuml = self.getPlantuml(doc=v.get(\'detailed\',{}).get(\'doc\',{}))\n" + " cnt = 0\n" + " for p in plantuml:\n" + " cnt += 1\n" + " self.print(0,\'\')\n" + " self.print(0,\"\"\"- ```puml plantmul-{c}.png\"\"\".format(c=cnt))\n" + " self.print(2,\'@startuml\')\n" + " self.print(2,p)\n" + " self.print(2,\'@enduml\')\n" + " self.print(2,\'```\')\n" "\n" " for k,v in self.D[\'classes\'].items():\n" " self.print(0,\'\')\n" " self.print(0,\'## Function Lists of {c} class\'.format(c=v[\'name\']))\n" - " self.print(1,\'| Accessibility | Function | Description | Parameters | param input | param output | Returns | return Description |\')\n" - " self.print(1,\'|-------|-------|----------|-------------|-------|-----|----|-------|\')\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" @@ -2833,15 +2849,16 @@ bool PerlModGenerator::generatePythonSample_py() " #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(1,\'\'\'|{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(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" "\n" "\n" - " def print(self,indent=0,text=\'\'):\n" - " spaces = \' \'* (self.tabsize * indent)\n" - " if self.of:\n" - " print(spaces,text,sep=\'\',file=self.of)\n" - " else:\n" - " print(spaces,text,sep=\'\')\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" @@ -2913,6 +2930,18 @@ bool PerlModGenerator::generatePythonSample_py() " 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" @@ -3075,7 +3104,11 @@ bool PerlModGenerator::generateMakefile() " python3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp\n" "\n" "# run python code with DoxyDocs\n" - "python:\n" + "python_doc:\n" + " # if you want to get plantuml without running java ,\n" + " # 1. set PLANTUML_JAR_PATH = ./plantuml.jar in Doxygile\n" + " # 2. do \'touch plantuml.jar\'\n" + " # 3. run \'doxygen\' then your DoxyDocs.pm will include plantuml.\n" " perl doxy2py.pl\n" " python3 sample.py --outfile=output.md\n" "\n"; From 4fed80617816b7f4e81029604b8cde7c4dc4a090 Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Tue, 2 Apr 2024 19:20:34 +0900 Subject: [PATCH 07/10] add README.md for PERLMOD_PYTHON --- src/perlmodgen.cpp | 102 ++++++++++++++++++++++++++++++++------------- 1 file changed, 74 insertions(+), 28 deletions(-) diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 995c0174127..876223a1b94 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -1411,6 +1411,7 @@ class PerlModGenerator QCString pathDoxyRules; // perlmodPython PerlModGenerator path define QCString pathPythonPut2cpp_py; + QCString pathPythonREADME_md; QCString pathPythonSample_py; QCString pathPythonDoxy2py_pl; // perlmodPython PerlModGenerator path define @@ -1442,6 +1443,7 @@ class PerlModGenerator bool generateDoxyRules(); // perlmodPython PerlModGenerator declare function bool generatePythonPut2cpp_py(); + bool generatePythonREADME_md(); bool generatePythonSample_py(); bool generatePythonDoxy2py_pl(); // perlmodPython PerlModGenerator declare function @@ -2541,12 +2543,12 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " - code in generate function\n" " - Makefile\n" " \'\'\'\n" - " def __init__(self,inputdir,out,perlmodgen,debug):\n" + " def __init__(self,inputdir,outlog,perlmodgen,debug):\n" " \'\'\'\n" " This is init funciton \"\"\" test \"\"\"\n" " \'\'\'\n" " self.inputdir = inputdir\n" - " self.out = out\n" + " self.outlog = outlog\n" " self.perlmodgen = perlmodgen\n" " self.debug = debug\n" " if self.perlmodgen and not os.path.exists(self.perlmodgen):\n" @@ -2554,6 +2556,7 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " 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" @@ -2652,22 +2655,25 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " 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\'\'\')\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# if you want to get plantuml without running java ,\'\'\')\n" - " mk.append(\'\'\'\\t# 1. set PLANTUML_JAR_PATH = ./plantuml.jar in Doxygile\'\'\')\n" - " mk.append(\'\'\'\\t# 2. do \'touch plantuml.jar\' \'\'\')\n" - " mk.append(\'\'\'\\t# 3. run \'doxygen\' then your DoxyDocs.pm will include plantuml.\'\'\')\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.out ,\"w\") as f:\n" - " print(\'write:\',self.out)\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" @@ -2719,6 +2725,7 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " 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" @@ -2748,23 +2755,58 @@ bool PerlModGenerator::generatePythonPut2cpp_py() " type=str,\n" " default=\'./perlmodgen.cpp\',\n" " help=\'location of perlmodgen.cpp. python codes in inputdir will be updated.\')\n" - " parser.add_argument( \'--out\',\n" + " parser.add_argument( \'--outlog\',\n" " metavar=\"\",\n" " type=str,\n" - " default=\'out.mod\',\n" - " help=\'insert python code into cpp (perlmodgen.cpp)\')\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.out,args.perlmodgen,args.debug)\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; @@ -2781,7 +2823,7 @@ bool PerlModGenerator::generatePythonSample_py() " analyze classes as example. it will print table for class with markdown format\n" " \'\'\'\n" " def __init__(self,doxydocs={},outfile=\'\',debug=False):\n" - " self.tabsize = 2\n" + " self.plantumlCnt = 0\n" " self.ret = \'
\' # or \'\\\\n\'\n" "\n" " self.D = doxydocs\n" @@ -2815,22 +2857,19 @@ bool PerlModGenerator::generatePythonSample_py() " 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" - " # plantuml\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" - " cnt = 0\n" " for p in plantuml:\n" - " cnt += 1\n" - " self.print(0,\'\')\n" - " self.print(0,\"\"\"- ```puml plantmul-{c}.png\"\"\".format(c=cnt))\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" - "\n" - " for k,v in self.D[\'classes\'].items():\n" - " self.print(0,\'\')\n" - " self.print(0,\'## Function Lists of {c} class\'.format(c=v[\'name\']))\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" @@ -2850,6 +2889,7 @@ bool PerlModGenerator::generatePythonSample_py() " #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" @@ -3095,22 +3135,26 @@ bool PerlModGenerator::generateMakefile() " 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\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" - " # if you want to get plantuml without running java ,\n" - " # 1. set PLANTUML_JAR_PATH = ./plantuml.jar in Doxygile\n" - " # 2. do \'touch plantuml.jar\'\n" - " # 3. run \'doxygen\' then your DoxyDocs.pm will include plantuml.\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 } @@ -3511,9 +3555,11 @@ void PerlModGenerator::generate() 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; From 9de0eeac786d981102b516c98e9cc43645db1c6a Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Tue, 2 Apr 2024 19:41:54 +0900 Subject: [PATCH 08/10] rm git config --- gitconfig | 25 ------------------------- 1 file changed, 25 deletions(-) delete mode 100644 gitconfig diff --git a/gitconfig b/gitconfig deleted file mode 100644 index bffabece51a..00000000000 --- a/gitconfig +++ /dev/null @@ -1,25 +0,0 @@ -[user] - email = cheoljoo@gmail.com - name = Charles.lee -[core] - repositoryformatversion = 0 - filemode = true - bare = false - logallrefupdates = true -[remote "origin"] - url = https://github.com/cheoljoo/doxygen.git - fetch = +refs/heads/*:refs/remotes/origin/* -[branch "master"] - remote = origin - merge = refs/heads/master -[branch "clean"] - remote = origin - merge = refs/heads/clean -[remote "upstream"] - url = https://github.com/doxygen/doxygen.git - fetch = +refs/heads/*:refs/remotes/upstream/* -[credential] - helper = store -[branch "perlmod_enum_type"] - remote = origin - merge = refs/heads/perlmod_enum_type From 9de7e8562c8ac4c78aa02eb4837b4b2e3946cf64 Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Tue, 2 Apr 2024 19:45:04 +0900 Subject: [PATCH 09/10] rm put2cpp.py --- src/put2cpp.py | 230 ------------------------------------------------- 1 file changed, 230 deletions(-) delete mode 100644 src/put2cpp.py diff --git a/src/put2cpp.py b/src/put2cpp.py deleted file mode 100644 index 35ea52156a4..00000000000 --- a/src/put2cpp.py +++ /dev/null @@ -1,230 +0,0 @@ -import sys -import argparse -import re -import os - -class Solution: - ''' - we replace several points. - - path define - - declare function - - file creation code - - code in generate function - - Makefile - ''' - def __init__(self,inputdir,out,perlmodgen,debug): - ''' - This is init funciton """ test """ - ''' - self.inputdir = inputdir - self.out = out - self.perlmodgen = perlmodgen - self.debug = debug - if self.perlmodgen and not os.path.exists(self.perlmodgen): - print('error: not exist file :', self.perlmodgen) - print(' !! set --perlmodgen option with the location of perlmodgen.cpp') - quit(4) - files = os.listdir(self.inputdir) - self.p = [] - self.o = {} - self.o['path define'] = [] - self.o['declare function'] = [] - self.o['file creation code'] = [] - self.o['code in generate function'] = [] - self.o['Makefile'] = [] - self.p.append('''class PerlModGenerator''') - self.p.append('''{''') - self.p.append(''' QCString pathDoxyRules;''') - self.p.append(''' // perlmodPython code''') - for file in files: - self.o['path define'].append(''' QCString path{f};'''.format(f=self.createPythonName(file))) - self.p += self.o['path define'] - self.p.append(''' QCString pathMakefile;''') - self.p.append('') - self.p.append(''' bool generateDoxyRules();''') - self.p.append(''' // perlmodPython code''') - for file in files: - self.o['declare function'].append(''' bool generate{f}();'''.format(f=self.createPythonName(file))) - self.p += self.o['declare function'] - self.p.append(''' bool generateMakefile();''') - self.p.append('''}''') - self.p.append('') - - self.p.append('''bool PerlModGenerator::generateDoxyRules()''') - self.p.append('''{''') - self.p.append('''}''') - self.p.append('') - self.p.append('''// perlmodPython code''') - self.p.append('') - for file in files: - filepath = self.inputdir+'/'+file - ff = self.createPythonName(file) - cpp = [] - with open(filepath,'r', encoding='utf-8', errors='ignore') as f: - lines = f.readlines() - #bs = ' \ ' - #bs = bs.replace(' ','') - for line in lines: - cpp.append(self.line2cpp(4,line)) - self.o['file creation code'].append('''bool PerlModGenerator::generate{ff}()'''.format(ff=ff)) - self.o['file creation code'].append('''{''') - self.o['file creation code'].append(''' std::ofstream pythonStream;''') - self.o['file creation code'].append(''' if (!createOutputFile(pythonStream, path{ff}))'''.format(ff=ff)) - self.o['file creation code'].append(''' return false;''') - self.o['file creation code'].append('') - self.o['file creation code'].append(''' pythonStream <<''') - self.o['file creation code'].append('\n'.join(cpp) + ';') - self.o['file creation code'].append('') - self.o['file creation code'].append(''' return true;''') - self.o['file creation code'].append('''}''') - self.o['file creation code'].append('') - self.p += self.o['file creation code'] - self.p.append('''bool PerlModGenerator::generateMakefile()''') - self.p.append('''{''') - self.p.append('''}''') - self.p.append('') - - self.p.append('''void PerlModGenerator::generate()''') - self.p.append('''{''') - self.p.append(''' bool perlmodLatex = Config_getBool(PERLMOD_LATEX);''') - self.p.append('') - self.p.append(''' if (perlmodLatex) {''') - self.p.append(''' }''') - self.p.append('') - self.p.append(' // perlmodPython code') - self.p.append('') - generateList = [] - for file in files: - ff = self.createPythonName(file) - self.o['code in generate function'].append(''' path{ff} = perlModAbsPath + "/{f}";'''.format(f=file,ff=ff)) - generateList.append('generate' + ff + '()') - print('generateList',generateList) - self.o['code in generate function'].append(''' if (!(''' + '''\n && '''.join(generateList) + '''))''') - self.o['code in generate function'].append(''' return;''') - self.p += self.o['code in generate function'] - self.p.append('''}''') - self.p.append('') - self.p.append('''void generatePerlMod()''') - self.p.append('''{''') - self.p.append('''}''') - self.p.append('') - self.p.append(''' bool perlmodPython = Config_getBool(PERLMOD_PYTHON);''') - self.p.append(''' if (perlmodPython) {''') - self.o['Makefile'].append(''' makefileStream <<''') - mk = [] - mk.append('') - mk.append('''# code2cpp''') - mk.append('''code2cpp:''') - mk.append('''\trm -rf input_perlmodgen_files''') - mk.append('''\tmkdir -p input_perlmodgen_files''') - for file in files: - mk.append('''\tcd input_perlmodgen_files; ln -s ../{f} {f}'''.format(f=file)) - mk.append('''\t# if you want to add python file into perlmodgen.cpp , you can use it.''') - mk.append('''\t# first of all, you add your py in input_perlmodgen_files directory''') - mk.append('''\t# please change ../../../../src/perlmodgen.cpp to location of src/perlmodgen.cpp''') - mk.append('''\t# output filename : perlmodgen.cpp.mod''') - mk.append('''\tpython3 put2cpp.py --inputdir=input_perlmodgen_files --perlmodgen=../../../../src/perlmodgen.cpp''') - mk.append('') - mk.append('''# run python code with DoxyDocs''') - mk.append('''python:''') - mk.append('''\tperl doxy2py.pl''') - mk.append('''\tpython3 sample.py''') - mk.append('') - self.o['Makefile'].append('\n'.join([self.line2cpp(6,item) for item in mk]) + ';') - self.p += self.o['Makefile'] - self.p.append(''' }''') - with open(self.out ,"w") as f: - print('write:',self.out) - f.write('\n'.join(self.p)) - startRe = re.compile('^\s*//\s+perlmodPython\s+PerlModGenerator\s+(?P[^<>]+)\s*') - endRe = re.compile('^\s*//\s+perlmodPython\s+PerlModGenerator\s+(?P[^<>]+)\s*') - if self.perlmodgen: - pmg = [] - lines = [] - with open(self.perlmodgen,'r', encoding='utf-8', errors='ignore') as f: - lines = f.readlines() - flag = 0 - startKey = '' - endKey = '-' - for line in lines: - line = line.rstrip() - grpStart = startRe.search(line) - grpEnd = endRe.search(line) - if grpStart: - if flag == 1: - print('error: already you were in perlmodpython pair') - print(' !! please chek ~ pair') - quit(4) - print('start [',grpStart.group('key').strip(),']',line) - startKey = grpStart.group('key').strip() - flag = 1 - pmg.append(line) - elif grpEnd: - if flag == 0: - print('error: already you were out of perlmodpython pair') - print(' !! please chek ~ pair') - quit(4) - print('end [',grpEnd.group('key').strip(),']',line) - endKey = grpEnd.group('key').strip() - flag = 0 - pmg += self.o[endKey] - pmg.append(line) - else: - if flag == 0: - pmg.append(line) - with open(self.perlmodgen + '.mod','w') as f: - print('! output perlmodgen file:',self.perlmodgen + '.mod') - s = "\n".join(pmg) - f.write(s) - - def createPythonName(self,file): - ''' - create new path name - ''' - if not file: - return file - file2 = file.replace('.','_') - fileList = list(file2) - ff = 'Python' + fileList[0].upper() + ''.join(fileList[1:]) - return ff - - def line2cpp(self,indent,line): - ''' - change characters for C++ - ''' - line = line.rstrip() - line = line.replace('\\','\\\\') - line = line.replace("'", "\\'") - line = line.replace('"', '\\"') - return ' '*indent + '"' + line + str('\\n') + '"' - -if (__name__ == "__main__"): - parser = argparse.ArgumentParser( - prog=sys.argv[0], - description= - 'put python code into cpp code and edit perlmodgen.cpp to add python code' - ) - parser.add_argument( '--debug', '-d' , action='store_const' , const=1 , help='debug on') - parser.add_argument( '--inputdir', - metavar="", - type=str, - default='input_perlmodgen_files', - help='input directory with python code. files of this directory will be inserted in cpp') - parser.add_argument( '--perlmodgen', - metavar="", - type=str, - default='./perlmodgen.cpp', - help='location of perlmodgen.cpp. python codes in inputdir will be updated.') - parser.add_argument( '--out', - metavar="", - type=str, - default='out.mod', - help='insert python code into cpp (perlmodgen.cpp)') - - args = parser.parse_args() - debug = args.debug - - print('inputdir:',args.inputdir) - print('input location of perlmodegen.cpp:',args.perlmodgen) - S = Solution(args.inputdir,args.out,args.perlmodgen,args.debug) - From 78d256a6a20c193f90837e4302b91083e67f84ee Mon Sep 17 00:00:00 2001 From: "Charles.Lee" Date: Thu, 4 Apr 2024 09:04:08 +0900 Subject: [PATCH 10/10] change config msg for PERLMOD_PYTHON --- src/config.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/src/config.xml b/src/config.xml index 96182500b1c..cfe00533440 100644 --- a/src/config.xml +++ b/src/config.xml @@ -3510,7 +3510,6 @@ If set to \c NO, doxygen will warn if a database file is already found and not m If the \c PERLMOD_PYTHON tag is set to \c YES, doxygen will generate the necessary \c Makefile rules, \c Python scripts and code to be able to generate print and markdown output from the Perl module output. - experiment is using mako python library. ]]> pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy