]> git.llucax.com Git - software/bife/bife++.git/commitdiff
Added a sample parser.
authorLeandro Lucarella <llucax@gmail.com>
Fri, 15 Aug 2003 05:45:22 +0000 (05:45 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Fri, 15 Aug 2003 05:45:22 +0000 (05:45 +0000)
Makefile
parser.cpp [new file with mode: 0644]
parser.h [new file with mode: 0644]
parser_test.cpp [new file with mode: 0644]
test.xml [new file with mode: 0644]

index e03f97c43631e44a95b252a9f067398b5a4a21f8..09e9010545c4caa188f0280c75e2135d08749eb1 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -1,14 +1,18 @@
 
-CPPFLAGS=-g3 -Wall -DDEBUG
-#CPPFLAGS=-O3 -Wall
+CPPFLAGS=-g3 -Wall -I/usr/include/libxml++-1.0 -I/usr/include/libxml2 -DDEBUG
+#CPPFLAGS=-O3 -Wall -I/usr/include/libxml++-1.0 -I/usr/include/libxml2
 
-TAGETS=hit.o ghit.o chit.o widget.o container.o fallback.o string.o translate.o
+LDFLAGS=-lxml++-0.1 #-lxml
+
+TAGETS=hit.o ghit.o chit.o widget.o container.o fallback.o string.o translate.o parser.o
 
 all: main
 
 main: $(TAGETS)
 
+parser_test: $(TAGETS)
+
 hit.o: hit.h hit.cpp
 
 clean:
-       @rm -f *.o main
+       @rm -f *.o main parser_test
diff --git a/parser.cpp b/parser.cpp
new file mode 100644 (file)
index 0000000..766c5b1
--- /dev/null
@@ -0,0 +1,126 @@
+// vim: set expandtab tabstop=4 shiftwidth=4:
+
+#include "parser.h"
+#include <sstream>
+
+using std::stringstream;
+using namespace bife;
+
+#ifdef DEBUG
+#include <iostream>
+using std::cerr;
+using std::endl;
+#endif
+
+void Parser::on_start_document(void) {
+#ifdef DEBUG
+    cerr << "In Parser::on_start_document();" << endl;
+#endif
+}
+
+void Parser::on_end_document(void) {
+#ifdef DEBUG
+    cerr << "In Parser::on_end_document();" << endl;
+#endif
+}
+
+void Parser::on_start_element(const string& name, const AttributeMap& attrs) {
+#ifdef DEBUG
+    cerr << "In Parser::on_start_element(name = '" << name << "', attrs = [";
+    if (attrs.size()) {
+        Hash::const_iterator last = attrs.end();
+        last--;
+        for (Hash::const_iterator i = attrs.begin(); i != last; i++) { //last; i++) {
+            cerr << i->first << ": '" << i->second << "', ";
+        }
+        cerr << last->first << ": '" << last->second << "'";
+    }
+    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();
+*/
+}
+
+void Parser::on_end_element(const string& name) {
+#ifdef DEBUG
+    cerr << "In Parser::on_end_element('" << name << "');" << endl;
+#endif
+}
+
+void Parser::on_characters(const string& chars) {
+#ifdef DEBUG
+    cerr << "In Parser::on_characters('" << chars << "');" << endl;
+#endif
+}
+
+void Parser::on_comment(const string& text) {
+#ifdef DEBUG
+    cerr << "In Parser::on_comment('" << text << "');" << endl;
+#endif
+}
+
+void Parser::on_warning(const string& warn) {
+#ifdef DEBUG
+    cerr << "In Parser::on_warning('" << warn << "');" << endl;
+#endif
+}
+
+void Parser::on_error(const string& error) {
+#ifdef DEBUG
+    cerr << "In Parser::on_error('" << error << "');" << endl;
+#endif
+}
+
+void Parser::on_fatal_error(const string& error) {
+#ifdef DEBUG
+    cerr << "In Parser::on_fatal_error('" << error << "');" << endl;
+#endif
+}
+
+void Parser::on_validity_error(const string& error) {
+#ifdef DEBUG
+    cerr << "In Parser::on_validity_error('" << error << "');" << endl;
+#endif
+}
+
+void Parser::on_validity_warning(const string& warn) {
+#ifdef DEBUG
+    cerr << "In Parser::on_validity_warning('" << warn << "');" << endl;
+#endif
+}
+
+Parser::Parser(void): root(NULL) {
+#ifdef DEBUG
+    cerr << "In Parser::Parser();" << endl;
+#endif
+}
+
+//Parser::Parser(const Hash& attrs): attrs(attrs) {
+//#ifdef DEBUG
+//    cerr << "In Parser::Parser(attrs = {" /* TODO << attrs */ << "});" << endl;
+//#endif
+//}
+
+Parser::~Parser(void) {
+#ifdef DEBUG
+    cerr << "In Parser destructor." << endl;
+#endif
+}
+/*
+Parser::operator string(void) const {
+    stringstream out;
+    return out.str();
+}
+*/
diff --git a/parser.h b/parser.h
new file mode 100644 (file)
index 0000000..4eb8e79
--- /dev/null
+++ b/parser.h
@@ -0,0 +1,142 @@
+// vim: set expandtab tabstop=4 shiftwidth=4:
+
+#ifndef BIFE_PARSER_H
+#define BIFE_PARSER_H
+
+#include "hit.h"
+#include "hash.h"
+#include "widget.h"
+#include <libxml++/libxml++.h>
+#include <string>
+#include <stack>
+
+namespace bife {
+
+    using std::string;
+
+    /**
+     * Base Widget Class.
+     *
+     * @todo 
+     */
+    class Parser: public xmlpp::SaxParser {
+        // Typedefs.
+        protected:
+            typedef std::stack<Widget*> WidgetStack;
+
+        // Attributes.
+        public:
+            /// Widget attributes.
+            Widget* root;
+
+            /// Stack TODO.
+            WidgetStack stack;
+
+            // TODO Fallback.
+
+        // Methods.
+        protected:
+            /**
+             * Start document handler.
+             */
+            virtual void on_start_document(void);
+
+            /**
+             * End document handler.
+             */
+            virtual void on_end_document(void);
+
+            /**
+             * Start element handler.
+             *
+             * @param  name  Element name.
+             * @param  attrs Element attributes.
+             */
+            virtual void on_start_element(const string&, const AttributeMap&);
+
+            /**
+             * End element handler.
+             *
+             * @param name Element name.
+             */
+            virtual void on_end_element(const string&);
+
+            /**
+             * Character handler.
+             *
+             * @param chars Characters.
+             */
+            virtual void on_characters(const string&);
+
+            /**
+             * Comment handler.
+             *
+             * @param text Comment text.
+             */
+            virtual void on_comment(const string&);
+
+            /**
+             * Warning handler.
+             *
+             * @param warn Warning description.
+             */
+            virtual void on_warning(const string&);
+
+            /**
+             * Error handler.
+             *
+             * @param error Error description.
+             */
+            virtual void on_error(const string&);
+
+            /**
+             * Fatal error handler.
+             *
+             * @param error Fatal error description.
+             */
+            virtual void on_fatal_error(const string&);
+
+            /**
+             * Validity error handler.
+             *
+             * @param error Validity error description.
+             */
+            virtual void on_validity_error(const string&);
+
+            /**
+             * Validity warning handler.
+             *
+             * @param warn Validity warning description.
+             */
+            virtual void on_validity_warning(const string&);
+
+        public:
+            /**
+             * Constructor.
+             */
+            Parser(void);
+
+            /**
+             * Constructor.
+             *
+             * @param fallback Fallback.
+             */
+            //Parser(const Fallback&); TODO
+
+            /**
+             * Destructor.
+             */
+            virtual ~Parser(void);
+
+            /**
+             * Renders the widget using a HIT template.
+             *
+             * @param  hit HIT template to use to render de widget.
+             * @return Rendered widget.
+             */
+            //virtual operator string(void) const;
+    };
+
+}
+
+#endif
diff --git a/parser_test.cpp b/parser_test.cpp
new file mode 100644 (file)
index 0000000..7a073ce
--- /dev/null
@@ -0,0 +1,30 @@
+// vim: set expandtab tabstop=4 shiftwidth=4:
+
+//#include "chit.h"
+#include "parser.h"
+#include <sstream>
+#include <iostream>
+#include <string>
+
+using namespace std;
+using namespace bife;
+
+int main(int argc, char* argv[]) {
+    string file;
+    if (argc < 2) {
+        file = "test.xml";
+    } else {
+        file = argv[1];
+    }
+    //CHIT tpl;
+    cout << "Parser example:" << endl;
+    cout << "===============" << endl;
+    try {
+        Parser parser;
+        parser.parse_file(file);
+    } catch (exception e) {
+        cerr << "Error: " << e.what() << endl;
+        return 1;
+    }
+    return 0;
+}
diff --git a/test.xml b/test.xml
new file mode 100644 (file)
index 0000000..a6bbbf1
--- /dev/null
+++ b/test.xml
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="ISO-8859-1" ?>
+<PAGE title="BIFE - Build It FastEr">
+    <SECTION title="Bienvenido a BIFE!" test="1">
+        <BIFE/> es un <EM>framework</EM> basado en la idea de
+        <LINK url="http://www.lunix.com.ar/Bif.php" desc="Build It Fast">Bif</LINK>
+        de separar la lógica, el contenidos y el diseño de una aplicación
+        <LINK url="http://www.php.net/" desc="PHP Hypertext Preprocesor">PHP</LINK>
+        (típicamente una página web) pero con fuerte énfasis en la velocidad y la
+        simplicidad.<BR/>
+        <BIFE/> también está fuertemente influido por los
+        <LINK url="http://www.lugmen.org.ar/" desc="hooks">hooks</LINK>
+        por lo que no deben extrañarse al encontrar similitudes, como la
+        simplicidad, velocidad, atomicidad y el mismo conceptos de separación
+        de lógica, contenidos y diseño.<BR/>
+        La idea es simple, el diseño se genera con <EM>templates</EM> (modulares
+        tipo hooks), el contenido a través de XML (simple) y de la lógica se
+        encarga el PHP (transformar el XML según los templates con un poco de
+        magia en el medio).
+    </SECTION>
+    <SECTION title="Objetivos">
+        Los objetivos de BIFE son estos (en orden de importancia):
+        <UL>
+            <LI>BIFE debe ser rápido.</LI>
+            <LI>BIFE debe ser simple.</LI>
+            <LI>BIFE debe ser modular.</LI>
+            <LI>BIFE debe ser fácil para el creador de contenidos (XML).</LI>
+        </UL>
+    </SECTION>
+    <SECTION title="El corazón de BIFE">
+        <BIFE/> es modular. <BIFE/> en sí (el corazón) consiste en 4 clases,
+        3 de ellas abstractas. Cada tag XML es mapeado por el
+        <CLASS name="Parser"/> (única clase no abstracta) a un
+        objeto <CLASS name="Widget"/> (cuya clase coincide con el tag). A su
+        vez, ese <CLASS name="Widget"/> puede ser un
+        <CLASS name="Container"/> (en cuyo caso además de tener atributos,
+        tiene un contenido). De no encontrar una clase para ese tag XML, el
+        <CLASS name="Parser"/> puede usar un objeto <CLASS name="Fallback"/>
+        que se encargue de resolver el problema.
+        <BIFE/> ni siquiera depende de un sistema de templates particular, la
+        única limitación consiste en usar el mismo objeto template para
+        dibujar todos los <CLASS name="Widget"/>.<BR/>
+        Recordamos que todas estas clases (exceptuando a
+        <CLASS name="Parser"/>) son abstractas. Es por esto que para usar
+        <BIFE/> es necesario implementarlas antes.
+    </SECTION>
+    <SECTION title="Implementación simple de BIFE">
+        <BIFE/>, el corazón, es un framework abstracto y sin una
+        implementación no sirve de mucho. A modo de ejemplo, y para darle
+        funcionalidad básica (web) se implementó el módulo
+        <MODULE name="Base"/>, que consiste sólo de 2 clases:
+        <CLASS name="Link"/> y <CLASS name="Translate"/>.
+        <CLASS name="Link"/> es un <CLASS name="Container"/> (a su vez un
+        <CLASS name="Widget"/>) que se encarga de generar hipervínculos a
+        otras páginas y provee métodos útiles para usar en otros widgets
+        que a su vez necesiten generar links.<BR/>
+        <CLASS name="Translate"/> es un <CLASS name="Fallback"/> que
+        traduce por medio de templates los tags XML. De no encontrar un
+        template para ese tag, simplemente copia el tag entero (tag, atributos
+        y contenido) a la salida. Esto es suficiente para hacer un sitio web
+        simple, de hecho esta página está hecha con este módulo.<BR/>
+        Este módulo depende de <CLASS name="HIT" package="HTML_Template"/>
+        (Hooks vs IT), un sistema de templates muy rápido y simple hecho
+        especialmente para <BIFE/> que combina lo mejor de los hooks con el
+        sistema de templates <LINK
+        url="http://pear.php.net/manual/en/package.html.php#package.html.html-template-it"
+        desc="Integrated Templates">IT</LINK>.
+    </SECTION>
+    <SECTION title="El Futuro">
+        La idea es que en el futuro hayan muchos widgets para bajar y
+        y armar una pagina web (o similar) solo escribiendo el XML (y
+        probablemente los templates).
+        Sería bueno que los widgets usen a su vez otras biblioteca de PHP (como
+        <LINK url="http://pear.php.net/">PEAR</LINK>) para hacer el trabajo
+        <EM>sucio</EM>, de manera tal que los widgets se limiten a actuar de
+        nexo entre entre el HTML (o la salida que sea), el XML y la lógica
+        (realizada en su mayor parte por una biblioteca general).
+    </SECTION>
+</PAGE>