]> git.llucax.com Git - software/bife/bife++.git/blob - parser.cpp
First parser implementation that creates the widgets tree.
[software/bife/bife++.git] / parser.cpp
1 // vim: set expandtab tabstop=4 shiftwidth=4:
2
3 // FIXME - ver tema de fallback.
4 #include "translate.h"
5
6 #include "string.h"
7 #include "parser.h"
8 #include <sstream>
9
10 using std::stringstream;
11 using namespace bife;
12
13 #ifdef DEBUG
14 #include <iostream>
15 using std::cerr;
16 using std::endl;
17 #endif
18
19 void Parser::on_start_document(void) {
20 #ifdef DEBUG
21     cerr << "In Parser::on_start_document();" << endl;
22 #endif
23 }
24
25 void Parser::on_end_document(void) {
26 #ifdef DEBUG
27     cerr << "In Parser::on_end_document();" << endl;
28 #endif
29 }
30
31 void Parser::on_start_element(const string& name, const AttributeMap& attrs) {
32 #ifdef DEBUG
33     cerr << "In Parser::on_start_element(name = '" << name << "', attrs = [";
34     if (attrs.size()) {
35         Hash::const_iterator last = attrs.end();
36         last--;
37         for (Hash::const_iterator i = attrs.begin(); i != last; i++) { //last; i++) {
38             cerr << i->first << ": '" << i->second << "', ";
39         }
40         cerr << last->first << ": '" << last->second << "'";
41     }
42     cerr  << "]);" << endl;
43 #endif
44     stack.push(new Translate(name, attrs));
45 }
46
47 void Parser::on_end_element(const string& name) {
48 #ifdef DEBUG
49     cerr << "In Parser::on_end_element('" << name << "');" << endl;
50 #endif
51     Widget* cur = stack.top();
52     stack.pop();
53     // If is the last widget, it's the root widget.
54     if (stack.empty()) {
55         root = cur;
56     // If is not the last widget, we add it as content of his parent.
57     } else {
58         Container* par = dynamic_cast<Container*>(stack.top());
59         // If the parent is a Container, we add curent widget as content.
60         if (par) {
61             par->append(cur);
62         // If not, we raise an exception TODO
63         } else {
64             throw "Trying to add content to a non-container widget.";
65         }
66     }
67 }
68
69 void Parser::on_characters(const string& chars) {
70 #ifdef DEBUG
71     cerr << "In Parser::on_characters('" << chars << "');" << endl;
72 #endif
73     if (!stack.empty()) {
74         Container* cur = dynamic_cast<Container*>(stack.top());
75         // If we are in a Container, we add curent string widget as content.
76         if (cur) {
77             cur->append(new String(chars));
78         // If not, we raise an exception TODO
79         } else {
80             throw "Trying to add content to a non-container widget.";
81         }
82     } else {
83         // FIXME - investigar si tiene sentido.
84         throw "Characters with no tags!!!?!?!?!";
85     }
86 }
87
88 void Parser::on_comment(const string& text) {
89 #ifdef DEBUG
90     cerr << "In Parser::on_comment('" << text << "');" << endl;
91 #endif
92 }
93
94 void Parser::on_warning(const string& warn) {
95 #ifdef DEBUG
96     cerr << "In Parser::on_warning('" << warn << "');" << endl;
97 #endif
98 }
99
100 void Parser::on_error(const string& error) {
101 #ifdef DEBUG
102     cerr << "In Parser::on_error('" << error << "');" << endl;
103 #endif
104 }
105
106 void Parser::on_fatal_error(const string& error) {
107 #ifdef DEBUG
108     cerr << "In Parser::on_fatal_error('" << error << "');" << endl;
109 #endif
110 }
111
112 void Parser::on_validity_error(const string& error) {
113 #ifdef DEBUG
114     cerr << "In Parser::on_validity_error('" << error << "');" << endl;
115 #endif
116 }
117
118 void Parser::on_validity_warning(const string& warn) {
119 #ifdef DEBUG
120     cerr << "In Parser::on_validity_warning('" << warn << "');" << endl;
121 #endif
122 }
123
124 Parser::Parser(void): root(NULL) {
125 #ifdef DEBUG
126     cerr << "In Parser::Parser();" << endl;
127 #endif
128 }
129
130 //Parser::Parser(const Hash& attrs): attrs(attrs) {
131 //#ifdef DEBUG
132 //    cerr << "In Parser::Parser(attrs = {" /* TODO << attrs */ << "});" << endl;
133 //#endif
134 //}
135
136 Parser::~Parser(void) {
137 #ifdef DEBUG
138     cerr << "In Parser destructor." << endl;
139 #endif
140 }
141 /*
142 Parser::operator string(void) const {
143     stringstream out;
144     return out.str();
145 }
146 */