]> git.llucax.com Git - software/bife/bife++.git/commitdiff
First parser implementation that creates the widgets tree.
authorLeandro Lucarella <llucax@gmail.com>
Sun, 17 Aug 2003 00:58:34 +0000 (00:58 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Sun, 17 Aug 2003 00:58:34 +0000 (00:58 +0000)
parser.cpp
parser.h
parser_test.cpp

index 766c5b1281f36e6a1620819505f4f46b94552053..9f4cfee87d71dc1600d02fd62438925c85f926f1 100644 (file)
@@ -1,5 +1,9 @@
 // vim: set expandtab tabstop=4 shiftwidth=4:
 
+// FIXME - ver tema de fallback.
+#include "translate.h"
+
+#include "string.h"
 #include "parser.h"
 #include <sstream>
 
@@ -37,32 +41,48 @@ void Parser::on_start_element(const string& name, const AttributeMap& attrs) {
     }
     cerr  << "]);" << endl;
 #endif
-/*
-    stringstream out;
-    out << "widget = attributes: [";
-    if (attrs.size()) {
-        Hash::const_iterator last = attrs.end();
-        last--;
-        for (Hash::const_iterator i = attrs.begin(); i != last; i++) { //last; i++) {
-            out << i->first << ": '" << i->second << "', ";
-        }
-        out << last->first << ": '" << last->second << "'";
-    }
-    out << "]);" << endl;
-    return out.str();
-*/
+    stack.push(new Translate(name, attrs));
 }
 
 void Parser::on_end_element(const string& name) {
 #ifdef DEBUG
     cerr << "In Parser::on_end_element('" << name << "');" << endl;
 #endif
+    Widget* cur = stack.top();
+    stack.pop();
+    // If is the last widget, it's the root widget.
+    if (stack.empty()) {
+        root = cur;
+    // If is not the last widget, we add it as content of his parent.
+    } else {
+        Container* par = dynamic_cast<Container*>(stack.top());
+        // If the parent is a Container, we add curent widget as content.
+        if (par) {
+            par->append(cur);
+        // If not, we raise an exception TODO
+        } else {
+            throw "Trying to add content to a non-container widget.";
+        }
+    }
 }
 
 void Parser::on_characters(const string& chars) {
 #ifdef DEBUG
     cerr << "In Parser::on_characters('" << chars << "');" << endl;
 #endif
+    if (!stack.empty()) {
+        Container* cur = dynamic_cast<Container*>(stack.top());
+        // If we are in a Container, we add curent string widget as content.
+        if (cur) {
+            cur->append(new String(chars));
+        // If not, we raise an exception TODO
+        } else {
+            throw "Trying to add content to a non-container widget.";
+        }
+    } else {
+        // FIXME - investigar si tiene sentido.
+        throw "Characters with no tags!!!?!?!?!";
+    }
 }
 
 void Parser::on_comment(const string& text) {
index 4eb8e79eba12d0b7132c5bc5c105dcbd0f9839ff..f79264664294f9c5ac08ee114f55da2d0dbd89e9 100644 (file)
--- a/parser.h
+++ b/parser.h
@@ -25,14 +25,14 @@ namespace bife {
             typedef std::stack<Widget*> WidgetStack;
 
         // Attributes.
-        public:
-            /// Widget attributes.
-            Widget* root;
-
+        protected:
             /// Stack TODO.
             WidgetStack stack;
 
             // TODO Fallback.
+        public:
+            /// Widget attributes.
+            Widget* root;
 
         // Methods.
         protected:
index 7a073ce1d68548dbc1dc83091803fe7dacac9572..705b165f07596caec48552fac76c265a632c27fc 100644 (file)
@@ -1,6 +1,6 @@
 // vim: set expandtab tabstop=4 shiftwidth=4:
 
-//#include "chit.h"
+#include "chit.h"
 #include "parser.h"
 #include <sstream>
 #include <iostream>
@@ -16,12 +16,14 @@ int main(int argc, char* argv[]) {
     } else {
         file = argv[1];
     }
-    //CHIT tpl;
+    CHIT tpl;
     cout << "Parser example:" << endl;
     cout << "===============" << endl;
     try {
         Parser parser;
         parser.parse_file(file);
+        // Text is returned in utf-8 encoding.
+        cout << parser.root->render(tpl) << endl;
     } catch (exception e) {
         cerr << "Error: " << e.what() << endl;
         return 1;