]> de.git.xonotic.org Git - xonotic/netradiant.git/blob - libs/xml/xmltextags.h
Merge branch 'master' of ssh://icculus.org/netradiant into icculus
[xonotic/netradiant.git] / libs / xml / xmltextags.h
1 /*
2 Copyright (C) 2006, Stefan Greven.
3 All Rights Reserved.
4
5 This file is part of GtkRadiant.
6
7 GtkRadiant is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 GtkRadiant is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GtkRadiant; if not, write to the Free Software
19 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
20 */
21
22 #if !defined(INCLUDED_XMLTEXTAGS_H)
23 #define INCLUDED_XMLTEXTAGS_H
24
25 #include <set>
26 #include <string/string.h>
27 #include <vector>
28
29 #include "iscriplib.h"
30
31 #include <libxml/xpath.h>
32 #include <libxml/xmlwriter.h>
33
34 enum NodeTagType
35 {
36   TAG,
37   EMPTY
38 };
39
40 enum NodeShaderType
41 {
42   SHADER,
43   TEXTURE
44 };
45
46 enum TextureType
47 {
48   STOCK,
49   CUSTOM
50 };
51
52 class XmlTagBuilder
53 {
54 private:
55   CopiedString m_savefilename;
56   xmlDocPtr doc;
57   xmlXPathContextPtr context;
58   xmlNodeSetPtr nodePtr;
59
60   xmlXPathObjectPtr XpathEval(const char* queryString)
61   {
62         xmlChar* expression = (xmlChar*)queryString;
63         xmlXPathObjectPtr result = xmlXPathEvalExpression(expression, context);
64         return result;
65   };
66
67   char* GetTagsXpathExpression(char* buffer, const char* shader, NodeTagType nodeTagType)
68   {
69         strcpy(buffer, "/root/*/*[@path='");
70         strcat(buffer, shader);
71         
72         switch(nodeTagType)
73         {
74         case TAG:
75                 strcat(buffer, "']/tag");
76                 break;
77         case EMPTY:
78                 strcat(buffer, "']");
79         };
80
81         return buffer;
82   }
83
84 public:
85   XmlTagBuilder();
86   ~XmlTagBuilder();
87
88   bool CreateXmlDocument();
89   bool OpenXmlDoc(const char* file, const char* savefile = 0);
90   bool SaveXmlDoc(const char* file);
91   bool SaveXmlDoc(void);
92   bool AddShaderNode(const char* shader, TextureType textureType, NodeShaderType nodeShaderType);
93   bool DeleteShaderNode(const char* shader);
94   bool CheckShaderTag(const char* shader);
95   bool CheckShaderTag(const char* shader, const char* content);
96   bool AddShaderTag(const char* shader, const char* content, NodeTagType nodeTagType);
97   bool DeleteTag(const char* tag);
98   int RenameShaderTag(const char* oldtag, CopiedString newtag);
99   bool DeleteShaderTag(const char* shader, const char* tag);
100   void GetShaderTags(const char* shader, std::vector<CopiedString>& tags);
101   void GetUntagged(std::set<CopiedString>& shaders);
102   void GetAllTags(std::set<CopiedString>& tags);
103   void TagSearch(const char* expression, std::set<CopiedString>& paths);
104 };
105
106 #endif