XML: add HTML features
[scilab.git] / scilab / modules / xml / src / cpp / XMLDocument.hxx
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) 2012 - Scilab Enterprises - Calixte DENIZET
4  *
5  * This file must be used under the terms of the CeCILL.
6  * This source file is licensed as described in the file COPYING, which
7  * you should have received as part of this distribution.  The terms
8  * are also available at
9  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
10  *
11  */
12
13 #ifndef __XMLDOCUMENT_HXX__
14 #define __XMLDOCUMENT_HXX__
15
16 #include <cstdio>
17 #include <list>
18 #include <cstring>
19 #include <string>
20
21 #include "dynlib_xml_scilab.h"
22
23 extern "C"
24 {
25 #include "xml.h"
26 #ifndef XML_XPATH_CHECKNS
27 #define XML_XPATH_CHECKNS
28 #endif
29 }
30
31 #include "XMLObject.hxx"
32
33 namespace org_modules_xml
34 {
35 class XMLElement;
36 class XMLObject;
37 class XMLXPath;
38 class XMLValidation;
39
40 /**
41  * @file
42  * @author Calixte DENIZET <calixte.denizet@scilab.org>
43  *
44  * Class to wrap a xmlDoc
45  * @see http://xmlsoft.org/html/libxml-tree.html#xmlDoc
46  */
47 class XML_SCILAB_IMPEXP XMLDocument: public XMLObject
48 {
49     static std::list < XMLDocument * >&openDocs;
50     xmlDoc *document;
51
52 public:
53     /**
54      * Gets the list of open docs
55      * @return the list
56      */
57     static const std::list < XMLDocument * >&getOpenDocuments();
58
59     /**
60      * Closes all the open documents
61      */
62     static void closeAllDocuments();
63
64     /**
65      * Builds a document with a given path (can be an url)
66      * @param path the document path
67      * @param validate a boolean to indicate if the document must be validated in using a DTD
68      * @param error a pointer to a string which will receive the error message
69      */
70             XMLDocument(const char *path, bool validate, std::string * error, const char * encoding = 0, const bool html = false);
71
72     /**
73      * Builds a document with a given code
74      * @param xmlCode the XML code
75      * @param validate a boolean to indicate if the document must be validated in using a DTD
76      * @param error a pointer to a string which will receive the error message
77      */
78     XMLDocument(const std::string & xmlCode, bool validate, std::string * error, const char * encoding = 0, const bool html = false);
79
80     /**
81      * Builds a simple document
82      * @param uri the document uri
83      * @param version the xml version
84      */
85     XMLDocument(char *uri, char *version);
86
87     ~XMLDocument();
88
89     void *getRealXMLPointer() const;
90
91     /**
92      * @return the xmlDoc behind this XMLDocument
93      */
94     xmlDoc *getRealDocument() const
95     {
96         return document;
97     }
98
99     /**
100      * @param filename the file where to write xml
101      * @param indent if true, the xml is indented
102      * @return true if all is ok
103      */
104     bool saveToFile(const std::string & filename, const bool indent) const;
105
106     /**
107      * @param filename the file where to write xml
108      * @param indent if true, the xml is indented
109      * @return true if all is ok
110      */
111     bool saveToHTMLFile(const std::string & filename, const bool indent) const;
112
113     /**
114      * @return the document root
115      */
116     const XMLElement *getRoot() const;
117
118     /**
119      * @param value the root to set
120      */
121     void setRoot(const XMLElement & value) const;
122
123     /**
124      * Replaces the root element by the root of the xmlCode/
125      * @param xmlCode the XML code
126      * @param error a pointer to a string which will receive the error message
127      */
128     void setRoot(const std::string & xmlCode, std::string * error) const;
129
130     /**
131      * @return the document URL
132      */
133     const char *getDocumentURL() const;
134
135     /**
136      * @param value the document URL to set
137      */
138     void setDocumentURL(const std::string & value) const;
139
140     /**
141      * Makes an XPath query on the document
142      * @param query the XPath query
143      * @param namespaces an a matrix nx2 containing mapping between prefix and href
144      * @param length the number of namespaces
145      * @param the node from where start the query
146      * @param error a pointer to a string which will receive the error message
147      * @return a pointer on a XPath object
148      */
149     const XMLXPath *makeXPathQuery(const char *query, char **namespaces, int length, const XMLElement * e, std::string * error);
150
151     const XMLObject *getXMLObjectParent() const;
152     const std::string dump(bool indent) const;
153     const std::string dumpHTML(bool indent) const;
154     const std::string toString() const;
155
156 private:
157     /**
158      * Error function for the XML parser
159      * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc
160      */
161     static void errorFunction(void *ctx, const char *msg, ...);
162
163     /**
164      * Error function which does nothing for the XML parser
165      * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlGenericErrorFunc
166      */
167     static void errorFunctionWithoutOutput(void *ctx, const char *msg, ...)
168     {
169     }
170
171     /**
172      * Error function used when the XPath query is compiled/
173      * @see http://xmlsoft.org/html/libxml-xmlerror.html#xmlStructuredErrorFunc
174      */
175     static void errorXPathFunction(void *ctx, xmlError * error);
176
177     /**
178      * Reads and parses a document given in a file.
179      * @param filename the file name
180      * @param encoding the file encoding
181      * @param validate a boolean to indicate if the document must be validated in using a DTD
182      * @param error a string where to write the parsing errors
183      * @return a pointer on a xmlDoc
184      */
185     static xmlDoc *readDocument(const char *filename, const char * encoding, bool validate, std::string * error);
186
187     /**
188      * Read and parse a document given in a string.
189      * @param xmlCode the XML code
190      * @param validate a boolean to indicate if the document must be validated in using a DTD
191      * @param error a string where to write the parsing errors
192      * @return a pointer on a xmlDoc
193      */
194     static xmlDoc *readDocument(const std::string & xmlCode, const char * encoding, bool validate, std::string * error);
195
196     /**
197      * Reads and parses a document given in a file.
198      * @param filename the file name
199      * @param validate a boolean to indicate if the document must be validated in using a DTD
200      * @param error a string where to write the parsing errors
201      * @return a pointer on a xmlDoc
202      */
203     static xmlDoc *readHTMLDocument(const char *filename, const char * encoding, std::string * error);
204
205     /**
206      * Read and parse a document given in a string.
207      * @param xmlCode the XML code
208      * @param validate a boolean to indicate if the document must be validated in using a DTD
209      * @param error a string where to write the parsing errors
210      * @return a pointer on a xmlDoc
211      */
212     static xmlDoc *readHTMLDocument(const std::string & xmlCode, const char * encoding, std::string * error);
213
214     /**
215      * Initializes the context
216      * @param error a string where to write the parsing errors
217      * @param validate a boolean to indicate if the document must be validated in using a DTD
218      * @return a pointer on a context
219      */
220     static xmlParserCtxt *initContext(std::string * error, bool validate);
221
222     /**
223      * Initializes the context
224      * @param error a string where to write the parsing errors
225      * @param validate a boolean to indicate if the document must be validated in using a DTD
226      * @return a pointer on a context
227      */
228     static htmlParserCtxt *initHTMLContext(std::string * error);
229
230     static std::string * errorBuffer;
231     static std::string * errorXPathBuffer;
232 };
233 }
234
235 #endif