1 /*
2  * This source file is part of libRocket, the HTML/CSS Interface Middleware
3  *
4  * For the latest information, see http://www.librocket.com
5  *
6  * Copyright (c) 2008-2010 CodePoint Ltd, Shift Technology Ltd
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a copy
9  * of this software and associated documentation files (the "Software"), to deal
10  * in the Software without restriction, including without limitation the rights
11  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12  * copies of the Software, and to permit persons to whom the Software is
13  * furnished to do so, subject to the following conditions:
14  *
15  * The above copyright notice and this permission notice shall be included in
16  * all copies or substantial portions of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24  * THE SOFTWARE.
25  *
26  */
27 
28 #ifndef ROCKETCOREXMLPARSER_H
29 #define ROCKETCOREXMLPARSER_H
30 
31 #include <stack>
32 #include "Header.h"
33 #include "BaseXMLParser.h"
34 
35 namespace Rocket {
36 namespace Core {
37 
38 class DocumentHeader;
39 class Element;
40 class XMLNodeHandler;
41 
42 /**
43 	Rocket's XML parsing engine. The factory creates an instance of this class for each RML parse.
44 
45 	@author Lloyd Weehuizen
46  */
47 
48 class ROCKETCORE_API XMLParser : public BaseXMLParser
49 {
50 public:
51 	XMLParser(Element* root);
52 	~XMLParser();
53 
54 	/// Registers a custom node handler to be used to a given tag.
55 	/// @param[in] tag The tag the custom parser will handle.
56 	/// @param[in] handler The custom handler.
57 	/// @return The registered XML node handler.
58 	static XMLNodeHandler* RegisterNodeHandler(const String& tag, XMLNodeHandler* handler);
59 	/// Releases all registered node handlers. This is called internally.
60 	static void ReleaseHandlers();
61 
62 	/// Returns the XML document's header.
63 	/// @return The document header.
64 	DocumentHeader* GetDocumentHeader();
65 	/// Returns the source URL of this parse.
66 	/// @return The URL of the parsing stream.
67 	const URL& GetSourceURL() const;
68 
69 	// The parse stack.
70 	struct ParseFrame
71 	{
72 		// Tag being parsed.
73 		String tag;
74 
75 		// Element representing this frame.
76 		Element* element;
77 
78 		// Handler used for this frame.
79 		XMLNodeHandler* node_handler;
80 
81 		// The default handler used for this frame's children.
82 		XMLNodeHandler* child_handler;
83 	};
84 
85 	/// Pushes an element handler onto the parse stack for parsing child elements.
86 	/// @param[in] tag The tag the handler was registered with.
87 	/// @return True if an appropriate handler was found and pushed onto the stack, false if not.
88 	bool PushHandler(const String& tag);
89 	/// Pushes the default element handler onto the parse stack.
90 	void PushDefaultHandler();
91 
92 	/// Access the current parse frame.
93 	/// @return The parser's current parse frame.
94 	const ParseFrame* GetParseFrame() const;
95 
96 protected:
97 	/// Called when the parser finds the beginning of an element tag.
98 	virtual void HandleElementStart(const String& name, const XMLAttributes& attributes);
99 	/// Called when the parser finds the end of an element tag.
100 	virtual void HandleElementEnd(const String& name);
101 	/// Called when the parser encounters data.
102 	virtual void HandleData(const String& data);
103 
104 private:
105 	// The header of the document being parsed.
106 	DocumentHeader* header;
107 
108 	// The active node handler.
109 	XMLNodeHandler* active_handler;
110 
111 	// The parser stack.
112 	typedef std::stack< ParseFrame > ParserStack;
113 	ParserStack stack;
114 };
115 
116 }
117 }
118 
119 #endif
120