From 93681f5b2e23f324174a6ecd72a7cb8a72feb62d Mon Sep 17 00:00:00 2001 From: Guido Ranzuglia granzuglia Date: Tue, 20 Sep 2011 09:11:23 +0000 Subject: [PATCH] added support for JSCode inside XML --- .../meshlabfilterXMLspecificationformat.xsd | 12 +++++- src/common/xmlfilterinfo.cpp | 41 ++++++++++++++++++- src/common/xmlfilterinfo.h | 6 +++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/common/script_system/meshlabfilterXMLspecificationformat.xsd b/src/common/script_system/meshlabfilterXMLspecificationformat.xsd index d395ba6d0..eeca9eddb 100644 --- a/src/common/script_system/meshlabfilterXMLspecificationformat.xsd +++ b/src/common/script_system/meshlabfilterXMLspecificationformat.xsd @@ -17,6 +17,8 @@ + + @@ -25,6 +27,7 @@ + @@ -39,7 +42,12 @@ - + + + + + + @@ -78,7 +86,7 @@ - + diff --git a/src/common/xmlfilterinfo.cpp b/src/common/xmlfilterinfo.cpp index 5c4cc1299..38ab62243 100644 --- a/src/common/xmlfilterinfo.cpp +++ b/src/common/xmlfilterinfo.cpp @@ -103,6 +103,25 @@ QString XMLFilterInfo::filterHelp( const QString& filterName) const return QString(); } +QString XMLFilterInfo::filterElement( const QString& filterName,const QString& filterElement) const +{ + //QString namesQuery = "doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name = \"" + filterName + "\"]/FILTER_HELP/string()"; + QString namesQuery = docMFIPluginFilterName(fileName,filterName) + "/" + filterElement + "/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() != 1) + throw ParsingException("There is not help tag for filter " + filterName); + return res[0]; + } + catch(QueryException q) + { + qDebug("Caught a QueryException %s",q.what()); + } + assert(0); + return QString(); +} + QString XMLFilterInfo::filterAttribute( const QString& filterName,const QString& attribute) const { @@ -255,7 +274,7 @@ QString XMLFilterInfo::filterParameterHelp( const QString& filterName,const QStr XMLFilterInfo::XMLMap XMLFilterInfo::filterParameterExtendedInfo( const QString& filterName,const QString& paramName ) const { //QString namesQuery = "for $x in doc(\"" + this->fileName + "\")/MESHLAB_FILTER_INTERFACE/PLUGIN/FILTER[@name=\"" + filterName + "\"]/PARAM[@name=\"" + paramName + "\"] return

type={data($x/@type)}|name={data($x/@name)}|defaultExpression={data($x/@defaultExpression)}|help={$x/PARAM_HELP}

/string()"; - QString namesQuery = "for $x in " + docMFIPluginFilterNameParamName(fileName,filterName,paramName) + " return

" + attrNameAttrVal(MLXMLElNames::paramType,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramName,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramDefExpr,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramIsImportant,"$x/") + externalSep() + MLXMLElNames::paramHelpTag + "={$x/" + MLXMLElNames::paramHelpTag + "}

/string()"; + QString namesQuery = "for $x in " + docMFIPluginFilterNameParamName(fileName,filterName,paramName) + " return

" + attrNameAttrVal(MLXMLElNames::paramType,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramName,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramDefExpr,"$x/") + externalSep() + attrNameAttrVal(MLXMLElNames::paramIsImportant,"$x/") + externalSep() + MLXMLElNames::paramHelpTag + "={$x/" + MLXMLElNames::paramHelpTag + "}"; try { XMLFilterInfo::XMLMap res; @@ -333,6 +352,26 @@ QString XMLFilterInfo::filterParameterAttribute( const QString& filterName,const return QString(); } +QString XMLFilterInfo::pluginAttribute(const QString& attribute ) const +{ + QString namesQuery = docMFIPlugin(fileName) + "/

" +attrVal(attribute)+"

/string()"; + try + { + QStringList res = query(namesQuery); + if (res.size() != 1) + throw ParsingException("Attribute " + attribute + " has not been specified for plugin."); + return res[0]; + } + catch(QueryException e) + { + qDebug("Caught a QueryException %s",e.what()); + } + + assert(0); + return QString(); +} + + QString XMLFilterInfo::pluginName() const { QString namesQuery = docMFIPlugin(fileName) + "/

" +attrVal(MLXMLElNames::pluginScriptName)+"

/string()"; diff --git a/src/common/xmlfilterinfo.h b/src/common/xmlfilterinfo.h index 59521404f..48d82db2c 100644 --- a/src/common/xmlfilterinfo.h +++ b/src/common/xmlfilterinfo.h @@ -52,6 +52,8 @@ namespace MLXMLElNames const QString pluginTag("PLUGIN"); const QString filterTag("FILTER"); const QString filterHelpTag("FILTER_HELP"); + const QString filterJSCodeTag("FILTER_JSCODE"); + const QString paramTag("PARAM"); const QString paramHelpTag("PARAM_HELP"); @@ -67,6 +69,8 @@ namespace MLXMLElNames const QString mfiVersion("mfiVersion"); const QString pluginScriptName("pluginName"); + const QString pluginAuthor("pluginAuthor"); + const QString pluginEmail("pluginEmail"); const QString filterName("filterName"); const QString filterScriptFunctName("filterFunction"); @@ -146,9 +150,11 @@ public: inline static void deleteXMLFileInfo(XMLFilterInfo* xmlInfo) {delete xmlInfo;} QString pluginName() const; + QString pluginAttribute(const QString& attribute ) const; QStringList filterNames() const; QString filterHelp(const QString& filterName) const; + QString filterElement(const QString& filterName,const QString& filterElement) const; //The function returns a QList>. Each map contains "type", "name" and "defaultExpression" of a single parameter. XMLMapList filterParameters(const QString& filterName) const;