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