diff --git a/src/common/pluginmanager.cpp b/src/common/pluginmanager.cpp index 5df2da0c4..c3d0b1d95 100644 --- a/src/common/pluginmanager.cpp +++ b/src/common/pluginmanager.cpp @@ -323,7 +323,7 @@ void PluginManager::loadXMLPlugin( const QString& fileName ) if (pname != "") { QString plugnamespace = pluginNameSpace() + "." + pname; - pluginnamespaces << plugnamespace; + //pluginnamespaces << plugnamespace; scriptplugcode += pluginNameSpace() + "." + pname + " = { };\n"; QStringList filters = pluginfo->filterNames(); foreach(QString filter,filters) @@ -336,10 +336,13 @@ void PluginManager::loadXMLPlugin( const QString& fileName ) filterFunction = gen.funCodeGenerator(filter,*pluginfo); QString jname = pluginfo->filterAttribute(filter,MLXMLElNames::filterScriptFunctName); completename += "." + jname; - filterscriptnames << completename; + //filterscriptnames << completename; scriptplugcode += completename + " = " + filterFunction + "\n"; completename += "(" + gen.parNames(filter,*pluginfo) + ")"; - filtersign << completename; + LibraryElementInfo li; + li.completename = completename; + li.help = pluginfo->filterHelp(filter); + libinfolist << li; } } } diff --git a/src/common/pluginmanager.h b/src/common/pluginmanager.h index 247a85059..5432f59ca 100644 --- a/src/common/pluginmanager.h +++ b/src/common/pluginmanager.h @@ -30,6 +30,7 @@ #include "interfaces.h" #include "xmlfilterinfo.h" #include "scriptinterface.h" +#include "scriptsyntax.h" class QScriptEngine; /** @@ -89,9 +90,9 @@ public: static QString pluginNameSpace(); //highlight and autocomplete - QStringList pluginnamespaces; - QStringList filterscriptnames; - QStringList filtersign; + /*QStringList pluginnamespaces; + QStringList filterscriptnames;*/ + QList libinfolist; //Env env; //void updateDocumentScriptBindings(MeshDocument& doc); diff --git a/src/common/scriptsyntax.cpp b/src/common/scriptsyntax.cpp index fee717782..504b60a34 100644 --- a/src/common/scriptsyntax.cpp +++ b/src/common/scriptsyntax.cpp @@ -372,22 +372,22 @@ SyntaxTreeModel* MLScriptLanguage::functionsLibrary() return libraries; } -void MLScriptLanguage::addFunctionsLibrary( const QStringList& funsigns ) +void MLScriptLanguage::addLibrary( const QList& funsigns ) { if (libraries != NULL) { SyntaxTreeNode* root = libraries->getItem(QModelIndex()); - foreach(QString st,funsigns) + foreach(LibraryElementInfo st,funsigns) addBranch(st,root); } } -void MLScriptLanguage::addBranch( const QString& funname,SyntaxTreeNode* parent ) +void MLScriptLanguage::addBranch( const LibraryElementInfo& mi,SyntaxTreeNode* parent ) { - if (funname.isEmpty() || (parent == NULL)) + if (mi.completename.isEmpty() || (parent == NULL)) return; - QString st = funname; - QVector dt(3,QVariant(QString())); + QString st = mi.completename; + QVector dt(5,QVariant(QString())); int indexpoint = st.indexOf(wordsjoiner); if (indexpoint == -1) { @@ -396,12 +396,16 @@ void MLScriptLanguage::addBranch( const QString& funname,SyntaxTreeNode* parent { //is a member dt[0] = st; + dt[1] = mi.help; + dt[4] = QString::number(MLScriptLanguage::CONSTANT); } else { //is a function. I will add the name of the function and the signature for the tooltip dt[0] = st.left(indexpar); - dt[1] = st; + dt[1] = mi.help; + dt[3] = st; + dt[4] = QString::number(MLScriptLanguage::FUNCTION); } SyntaxTreeNode* ch = parent->findChild(dt); @@ -410,8 +414,8 @@ void MLScriptLanguage::addBranch( const QString& funname,SyntaxTreeNode* parent { parent->insertChildren(parent->childCount(),1,parent->columnCount()); ch = parent->child(parent->childCount() - 1); - ch->setData(0,dt[0]); - ch->setData(1,dt[1]); + for(int ii = 0;ii < 5;++ii) + ch->setData(ii,dt[ii]); } return; } @@ -424,16 +428,20 @@ void MLScriptLanguage::addBranch( const QString& funname,SyntaxTreeNode* parent tmp.remove(wordsjoiner); dt[0] = tmp; dt[2] = specificsep; + dt[4] = QString::number(MLScriptLanguage::NAMESPACE); SyntaxTreeNode* ch = parent->findChild(dt); //Search if the node is already in the tree if (ch == NULL) { parent->insertChildren(parent->childCount(),1,parent->columnCount()); ch = parent->child(parent->childCount() - 1); - ch->setData(0,dt[0]); - ch->setData(2,dt[2]); + for(int ii = 0;ii < 5;++ii) + ch->setData(ii,dt[ii]); } - addBranch(st,ch); + LibraryElementInfo minext; + minext.completename = st; + minext.help = mi.help; + addBranch(minext,ch); } } @@ -457,18 +465,20 @@ void MLScriptLanguage::initLibrary() delete libraries; QVector v; v.push_back("partial function ID"); - v.push_back("tooltip"); + v.push_back("help"); v.push_back("separator"); + v.push_back("signature"); + v.push_back("token"); SyntaxTreeNode* root = new SyntaxTreeNode(v,NULL); libraries = new SyntaxTreeModel(root,NULL); } -QStringList MLScriptLanguage::getExternalLibrariesFunctionsSignature() +QList MLScriptLanguage::getExternalLibrariesMembersInfo() const { - QStringList res; + QList res; QList liblist = this->scriptLibraryFiles(); for(int ii = 0;ii functionsSignatures()); + res.append(liblist[ii]->libraryMembersInfo()); return res; } @@ -547,7 +557,7 @@ JavaScriptLanguage::JavaScriptLanguage() //comp.setModel(&mod); } -const QList JavaScriptLanguage::scriptLibraryFiles() +const QList JavaScriptLanguage::scriptLibraryFiles() const { QList res; SGLMathLib* lib = new SGLMathLib(); @@ -589,22 +599,36 @@ SGLMathLib::SGLMathLib() } -QStringList SGLMathLib::functionsSignatures() const +QList SGLMathLib::libraryMembersInfo() const { QString code = libCode(); - QStringList res; + QList res; int index = 0; QRegExp parameter("\\w*"); QRegExp parameterlist(parameter.pattern() + "(\\s*,\\s*" + parameter.pattern() + ")*"); QRegExp namespacelist(parameter.pattern() + "(\\s*\\.\\s*" + parameter.pattern() + ")*\\$?"); - QRegExp exp(namespacelist.pattern() + "\\s*=\\s*function\\s*\\(" + parameterlist.pattern() + "\\)"); - while(index >= 0) + QRegExp help("/\\*([^*]|[\\r\\n]|(\\*+([^*/]|[\\r\\n])))*\\*+/"); + QRegExp exp("(" + help.pattern() + ")?" + "\\s*" + namespacelist.pattern() + "\\s*=\\s*function\\s*\\(" + parameterlist.pattern() + "\\)"); + int ii = 0; + do { index = code.indexOf(exp,index) + exp.matchedLength(); - QString fun = exp.cap(); - fun.remove(QRegExp("\\s*")).remove("=").remove("function"); - res << fun; - } + if (index >= 0) + { + QString fun = exp.cap(); + LibraryElementInfo mi; + int helpind = fun.indexOf(help); + if (helpind >= 0) + { + mi.help = help.cap(); + fun.remove(help.cap()); + } + fun.remove(QRegExp("\\s*")).remove("=").remove("function"); + mi.completename = fun; + res << mi; + ++ii; + } + }while(index >= 0); return res; } diff --git a/src/common/scriptsyntax.h b/src/common/scriptsyntax.h index 9859cf727..4586918e8 100644 --- a/src/common/scriptsyntax.h +++ b/src/common/scriptsyntax.h @@ -66,12 +66,18 @@ private: SyntaxTreeNode *rootItem; }; +struct LibraryElementInfo +{ + QString completename; + QString help; +}; + class ExternalLib { public: ExternalLib(const QString& filename); QString name; - virtual QStringList functionsSignatures() const = 0; + virtual QList libraryMembersInfo() const = 0; QString libCode() const; }; @@ -79,17 +85,19 @@ class SGLMathLib : public ExternalLib { public: SGLMathLib(); - QStringList functionsSignatures() const; + QList libraryMembersInfo() const; }; class MLScriptLanguage { public: + enum LANG_TOKEN {NAMESPACE,FUNCTION,CONSTANT}; + MLScriptLanguage(); ~MLScriptLanguage(); //a Library of functions is a list of functions expressed as NameSpace0.NameSpace1.----.NameSpaceN.fun(par0,par1,....,park) (if sep = "." openpar = "(") with NameSpace0 common to all the functions of a single library //the function will generate a SyntaxTree in order to easy manage SyntaxHighlighting and Auto-Completing. - void addFunctionsLibrary(const QStringList& funsigns); + void addLibrary(const QList& funsigns); const SyntaxTreeModel* functionsLibrary() const; SyntaxTreeModel* functionsLibrary(); QStringList reserved; @@ -108,14 +116,14 @@ public: QRegExp matchIdentifiersButNotReservedWords() const; QRegExp matchOnlyReservedWords() const; - virtual const QList scriptLibraryFiles() = 0; + virtual const QList scriptLibraryFiles() const = 0; QString getExternalLibrariesCode(); - QStringList getExternalLibrariesFunctionsSignature(); + QList getExternalLibrariesMembersInfo() const; //QStringList splitTextInWords(const QString& st) const; private: void initLibrary(); - void addBranch(const QString& funname,SyntaxTreeNode* parent); + void addBranch(const LibraryElementInfo& mi,SyntaxTreeNode* parent); SyntaxTreeModel* libraries; }; @@ -123,7 +131,7 @@ class JavaScriptLanguage : public MLScriptLanguage { public: JavaScriptLanguage(); - const QList scriptLibraryFiles(); + const QList scriptLibraryFiles() const; }; #endif \ No newline at end of file