X-Git-Url: https://scm.cri.ensmp.fr/git/Faustine.git/blobdiff_plain/1059e1cc0c2ecfa237406949aa26155b6a5b9154..66f23d4fabf89ad09adbd4dfc15ac6b5b2b7da83:/interpreter/preprocessor/faust-0.9.47mr3/compiler/documentator/doc_autodoc.cpp diff --git a/interpreter/preprocessor/faust-0.9.47mr3/compiler/documentator/doc_autodoc.cpp b/interpreter/preprocessor/faust-0.9.47mr3/compiler/documentator/doc_autodoc.cpp new file mode 100644 index 0000000..3e905f0 --- /dev/null +++ b/interpreter/preprocessor/faust-0.9.47mr3/compiler/documentator/doc_autodoc.cpp @@ -0,0 +1,210 @@ +/************************************************************************ + ************************************************************************ + FAUST compiler + Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale + --------------------------------------------------------------------- + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + ************************************************************************ + ************************************************************************/ + + +#include +#include +#include +#include +#include + +#include "doc_autodoc.hh" +#include "tlib.hh" +#include "boxes.hh" +#include "doc.hh" + + +extern SourceReader gReader; +extern string gDocName; +extern map > gMetaDataSet; +extern map gDocMetadatasStringMap; + +map gDocAutodocStringMap; +set gDocAutodocKeySet; + +static void initDocAutodocKeySet(); + + + + +/***************************************************************************** + Public functions + *****************************************************************************/ + + +/** + * @brief Declare an automatic documentation. + * + * This function simulates a default documentation : + * if no tag was found in the input faust file, + * and yet the '-mdoc' option was called, + * then print a complete 'process' doc. + */ +void declareAutoDoc() +{ + Tree autodoc = nil; + Tree process = boxIdent("process"); + + /** Autodoc's "head", with title, author, date, and metadatas. */ + + /** The latex title macro is bound to the metadata "name" if it exists, + (corresponding to "declare name") or else just to the file name. */ + autodoc = cons(docTxt("\\title{"), autodoc); + if (gMetaDataSet.count(tree("name"))) { + autodoc = cons(docMtd(tree("name")), autodoc); + } else { + autodoc = cons(docTxt(gDocName.c_str()), autodoc); + } + autodoc = cons(docTxt("}\n"), autodoc); + + /** The latex author macro is bound to the metadata "author" if it exists, + (corresponding to "declare author") or else no author item is printed. */ + if (gMetaDataSet.count(tree("author"))) { + autodoc = cons(docTxt("\\author{"), autodoc); + autodoc = cons(docMtd(tree("author")), autodoc); + autodoc = cons(docTxt("}\n"), autodoc); + } + + /** The latex date macro is bound to the metadata "date" if it exists, + (corresponding to "declare date") or else to the today latex macro. */ + autodoc = cons(docTxt("\\date{"), autodoc); + if (gMetaDataSet.count(tree("date"))) { + autodoc = cons(docMtd(tree("date")), autodoc); + } else { + autodoc = cons(docTxt("\\today"), autodoc); + } + autodoc = cons(docTxt("}\n"), autodoc); + + /** The latex maketitle macro. */ + autodoc = cons(docTxt("\\maketitle\n"), autodoc); + + + /** Insert all declared metadatas in a latex tabular environment. */ + if (! gMetaDataSet.empty()) { + autodoc = cons(docTxt("\\begin{tabular}{ll}\n"), autodoc); + autodoc = cons(docTxt("\t\\hline\n"), autodoc); + for (map >::iterator i = gMetaDataSet.begin(); i != gMetaDataSet.end(); i++) { + string mtdkey = tree2str(i->first); + string mtdTranslatedKey = gDocMetadatasStringMap[mtdkey]; + if (mtdTranslatedKey.empty()) { + mtdTranslatedKey = mtdkey; + } + autodoc = cons(docTxt("\t\\textbf{"), autodoc); + autodoc = cons(docTxt(mtdTranslatedKey.c_str()), autodoc); + autodoc = cons(docTxt("} & "), autodoc); + autodoc = cons(docMtd(tree(mtdkey.c_str())), autodoc); + autodoc = cons(docTxt(" \\\\\n"), autodoc); + } + autodoc = cons(docTxt("\t\\hline\n"), autodoc); + autodoc = cons(docTxt("\\end{tabular}\n"), autodoc); + autodoc = cons(docTxt("\\bigskip\n"), autodoc); + } + + + /** Autodoc's "body", with equation and diagram of process, and notice and listing. */ + + string autoPresentationTxt = "\n\\bigskip\n" + gDocAutodocStringMap["thisdoc"] + "\n\n"; + autodoc = cons(docTxt(autoPresentationTxt.c_str()), autodoc); + + string autoEquationTxt = "\n" + gDocAutodocStringMap["autoeqntitle"] + "\n\n"; + autoEquationTxt += gDocAutodocStringMap["autoeqntext"] + "\n"; + autodoc = cons(docTxt(autoEquationTxt.c_str()), autodoc); + autodoc = cons(docEqn(process), autodoc); + + string autoDiagramTxt = "\n" + gDocAutodocStringMap["autodgmtitle"] + "\n\n"; + autoDiagramTxt += gDocAutodocStringMap["autodgmtext"] + "\n"; + autodoc = cons(docTxt(autoDiagramTxt.c_str()), autodoc); + autodoc = cons(docDgm(process), autodoc); + + string autoNoticeTxt = "\n" + gDocAutodocStringMap["autontctitle"] + "\n\n"; +// autoNoticeTxt += gDocAutodocStringMap["autontctext"] + "\n"; + autodoc = cons(docTxt(autoNoticeTxt.c_str()), autodoc); + autodoc = cons(docNtc(), autodoc); + + string autoListingTxt; + vector pathnames = gReader.listSrcFiles(); + if(pathnames.size() > 1) { + autoListingTxt = "\n" + gDocAutodocStringMap["autolsttitle2"] + "\n\n"; + autoListingTxt += gDocAutodocStringMap["autolsttext2"] + "\n"; + } else { + autoListingTxt = "\n" + gDocAutodocStringMap["autolsttitle1"] + "\n\n"; + autoListingTxt += gDocAutodocStringMap["autolsttext1"] + "\n"; + } + autodoc = cons(docTxt(autoListingTxt.c_str()), autodoc); + autodoc = cons(docLst(), autodoc); + + declareDoc(autodoc); +} + + +/** + * Dispatch initialization of autodoc container. + */ +void initDocAutodoc() +{ + initDocAutodocKeySet(); +} + + + +/***************************************************************************** + Static functions + *****************************************************************************/ + + +/** + * Initialize gDocAutodocKeySet, a set containing all the keywords. + */ +static void initDocAutodocKeySet() { + + gDocAutodocKeySet.insert("thisdoc"); + + gDocAutodocKeySet.insert("autoeqntitle"); + gDocAutodocKeySet.insert("autoeqntext"); + + gDocAutodocKeySet.insert("autodgmtitle"); + gDocAutodocKeySet.insert("autodgmtext"); + + gDocAutodocKeySet.insert("autontctitle"); + gDocAutodocKeySet.insert("autontctext"); + + gDocAutodocKeySet.insert("autolsttitle1"); + gDocAutodocKeySet.insert("autolsttext1"); + + gDocAutodocKeySet.insert("autolsttitle2"); + gDocAutodocKeySet.insert("autolsttext2"); +} + + +/** + * Simple trace function. + */ +static void printDocAutodocStringMapContent() { + bool trace = false; + if(trace) { + cout << "gDocAutodocStringMap.size() = " << gDocAutodocStringMap.size() << endl; + map::iterator it; + int i = 1; + for(it = gDocAutodocStringMap.begin(); it!=gDocAutodocStringMap.end(); ++it) + cout << i++ << ".\tgDocNoticeStringMap[" << it->first << "] \t= '" << it->second << "'" << endl; + } +} +