added DOM query class
authorkonrad <konrad@6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33>
Sat, 24 Jan 2009 14:42:47 +0000 (14:42 +0000)
committerkonrad <konrad@6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33>
Sat, 24 Jan 2009 14:42:47 +0000 (14:42 +0000)
git-svn-id: https://silmor.de/svn/softmagic/smoke/trunk@246 6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33

src/domquery.cpp [new file with mode: 0644]
src/domquery.h [new file with mode: 0644]
src/smoke.pro

diff --git a/src/domquery.cpp b/src/domquery.cpp
new file mode 100644 (file)
index 0000000..04ed351
--- /dev/null
@@ -0,0 +1,55 @@
+//
+// C++ Implementation: domquery
+//
+// Description: 
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2009
+//
+// Copyright: See README/COPYING files that come with this distribution
+//
+//
+
+#include "domquery.h"
+
+MDomQuery::MDomQuery(const QDomElement&start,QString path)
+{
+       //split query
+       QStringList ql=path.split("/",QString::SkipEmptyParts);
+       //determine start mode and initialize list
+       MDomNodeList ndlst;
+       if(path.startsWith("//")){
+               QDomDocument doc=start.ownerDocument();
+               if(ql.size()<1){
+                       qDebug("MDomQuery: // query must not be empty!");
+                       return;
+               }
+               if(ql[0]=="*"){
+                       qDebug("MDomQuery: // query must not start with wildcard *.");
+                       return;
+               }
+               ndlst=doc.elementsByTagName(ql[0]);
+               ql.removeFirst();
+       }else 
+       if(path.startsWith("/")){
+               QDomElement root=start.ownerDocument().documentElement();
+               if(ql.size()<1){
+                       //hmm, guess what the user really wanted (assume "/ *" )
+                       m_result<<root;
+                       return;
+               }
+               if(ql[0]=="*"){
+                       ndlst<<root;
+               }else{
+                       if(root.tagName()==ql[0])ndlst<<root;
+               }
+               ql.removeFirst();
+       }else{
+               ndlst<<start;
+       }
+       
+       
+}
+
+QString MDomQuery::toString()const{}
+QStringList MDomQuery::toStringList()const{}
diff --git a/src/domquery.h b/src/domquery.h
new file mode 100644 (file)
index 0000000..404ed9e
--- /dev/null
@@ -0,0 +1,78 @@
+//
+// C++ Interface: domquery
+//
+// Description: 
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2009
+//
+// Copyright: See README/COPYING files that come with this distribution
+//
+//
+
+#ifndef MAGICSMOKE_DOMQUERY_H
+#define MAGICSMOKE_DOMQUERY_H
+
+
+#include <QDomElement>
+#include <QList>
+#include <QStringList>
+
+/**Helper class: more flexible version of QDomNodeList*/
+class MDomNodeList:public QList<QDomNode>
+{
+       public:
+               MDomNodeList(){}
+               MDomNodeList(const MDomNodeList&l):QList<QDomNode>(l){}
+               MDomNodeList(const QList<QDomNode>&l):QList<QDomNode>(l){}
+               MDomNodeList(const QDomNodeList&l){for(int i=0;i<l.size();i++)append(l.at(i));}
+};
+
+
+/**DOM Query Class
+
+It uses a simplified version of the XPath syntax: 
+
+Namespaces/Prefixes are ignored. It is recommended to use patternist for cases in which namespaces matter.
+
+The search path uses slash "/" to separate elements, the last item in the search path may start with "@" to match an attribute instead of an element. The special names "*" and "@*" may be used to match any element or attribute. If the search path starts with a slash "/", the search starts at the document root irrespective of what element was fed to the query object (the first item matched against the root element). If the search path starts with a double slash "//" the search considers all positions in the document as valid starting points (using all elements that match the first item to start the search, the first item must not be "*" in that case). If there is no slash at the start of the path the search begins exactly at the supplied element (the first item matched against child elements of the supplied element).
+
+When casting to QString or QStringList the query object uses the method text() of the QDomElement to generate the content of the element. For attributes it simply returns the value.
+
+Examples:
+<table>
+<tr><td>mouse</td><td>return all child elements of the current element that are called "mouse"</td></tr>
+<tr><td>\@mouse</td><td>return all attribute nodes of the current element that are called "mouse"</td></tr>
+<tr><td>*</td><td>returns all child elements of the current element</td></tr>
+<tr><td>\@*</td><td>returns all attributes of the current element</td></tr>
+<tr><td>/<!-- -->*</td><td>returns the root element of the document irrespective of name</td></tr>
+<tr><td>/mouse</td><td>returns the root element of the document if it has the tag name "mouse" or an empty list</td></tr>
+<tr><td>/<!-- -->*<!-- -->/mouse</td><td>returns all elements directly below the root element that are called "mouse"</td></tr>
+<tr><td>//mouse</td><td>returns all elements in the document that are called "mouse"</td></tr>
+<tr><td>mouse/\@trap/door</td><td>syntax error, attributes cannot have children</td></tr>
+</table>
+*/
+class MDomQuery
+{
+       public:
+               /**creates the query object and executes the query*/
+               MDomQuery(const QDomElement&start,QString path);
+               
+               /**returns the search result as a single string, if there were multiple matches, they are separated by spaces*/
+               QString toString()const;
+               /**returns the search result as a list of strings, one string element per match*/
+               QStringList toStringList()const;
+               /**returns the result as a list of DOM nodes*/
+               MDomNodeList toNodeList()const{return m_result;}
+               
+               /**cast to QString: see toString()*/
+               operator QString()const{return toString();}
+               /**cast to QStringList: see toStringList()*/
+               operator QStringList()const{return toStringList();}
+               /**cast to DOM node list: see toNodeList()*/
+               operator MDomNodeList()const{return m_result;}
+       private:
+               MDomNodeList m_result;
+};
+
+#endif
index 0e79167..b05c470 100644 (file)
@@ -50,7 +50,8 @@ SOURCES = \
        office.cpp \
        centbox.cpp \
        moneylog.cpp \
-       autoupdate.cpp
+       autoupdate.cpp \
+       domquery.cpp
 
 HEADERS = \
        keygen.h \
@@ -79,7 +80,8 @@ HEADERS = \
        office.h \
        centbox.h \
        moneylog.h \
-       autoupdate.h
+       autoupdate.h \
+       domquery.h
        
 #some PHP files are listed in this file to scan them for translatable items
 #use genphpscan.sh to regenerate it.