C++ Bibliothek, die Html Dateien generieren kann



  • Hi!
    Ich habe die Nase voll von std::cout.setwXXX und was weiß ich noch! Ich brauche eine Bibliothek mit der Tabellen leicht zu erstellen sind. Eine html Ausgabe wäre ganz in Ordnung. Gibt es so was?



  • Wenns nur Tabellen sein sollen, dann schreib halt die paar td und tr selber in die Datei.



  • Ich denke mal, DAS wird dir gefallen. 😃

    Cheers!



  • ==Fidelio== schrieb:

    Ich denke mal, DAS wird dir gefallen. 😃

    Cheers!

    Naja. Mit Open Office geht das. Aber mit Excel hab ich es noch nicht ausprobiert zu öffnen...


  • Administrator

    khalderon schrieb:

    Naja. Mit Open Office geht das. Aber mit Excel hab ich es noch nicht ausprobiert zu öffnen...

    Sollte mit Excel funktionieren. Ist zwar nicht ganz so perfekt beim Öffnen von CSV-Dateien wie OpenOffice, aber hatte noch nie Probleme.

    Aber wieso erstellst du dir nicht kurz eine kleine Bibliothek?

    class CCell
    {
        // Attributes //
    private:
        std::string m_Value;
    
        // Methods //
    public:
        void set_value_string(std::string Value) { m_Value = Value; };
        std::string const& get_value_string() const { return m_Value; };
    
        template<typename T>
        void set_value(T Value) { m_Value = (std::stringstream() << Value).str(); };
    }
    
    std::ostream operator <<(std::ostream& rOutput, CCell const& rCell)
    {
        rOutput << "<td>" << rCell.get_value_string() << "</td>";
        return rOutput;
    }
    
    class CRow
    {
        // Attributes //
    private:
        std::vector<CCell> m_CellVector;
    
        // ...
    }
    
    std::ostream operator <<(std::ostream& rOutput, CRow const& rRow)
    {
        rOutput << "<tr>" << /* ... */ << "</tr>";
        return rOutput;
    }
    
    class CTable
    {
        // Attributes //
    private:
        std::vector<CRow> m_RowVector;
    
        // ...
    }
    
    std::ostream operator <<(std::ostream& rOutput, CTable const& rTable)
    {
        rOutput << "<table>" << /* ... */ << "</table>";
        return rOutput;
    }
    

    Ich denke das Prinzip dürfte klar sein und in 30 Minuten hast du die paar Klassen fertig. Zudem ist es eine gute Übung 😉

    Grüssli



  • Um HTML-Code generieren zu lassen kann ich dir auch die Boost HTML Library empfehlen:

    document doc;
    ptr_element_t table(new element("table"));
    ptr_element_t tr(new element("tr"));
    ptr_element_t td(new element("td"));
    td->setValue("Zelleninhalt");
    tr->addChild(td);
    table->addChild(tr)
    
    doc.addChild(table)
    cout << doc.as_string() << endl;
    

    Mit etwas Übung (und ein paar eigenen Helper-Funktionen) kann man damit ganz einfach kleinere Webseiten basteln.

    Greeetz Kessi



  • KessiMC schrieb:

    Um HTML-Code generieren zu lassen kann ich dir auch die Boost HTML Library empfehlen:

    document doc;
    ptr_element_t table(new element("table"));
    ptr_element_t tr(new element("tr"));
    ptr_element_t td(new element("td"));
    td->setValue("Zelleninhalt");
    tr->addChild(td);
    table->addChild(tr)
    
    doc.addChild(table)
    cout << doc.as_string() << endl;
    

    Mit etwas Übung (und ein paar eigenen Helper-Funktionen) kann man damit ganz einfach kleinere Webseiten basteln.

    Greeetz Kessi

    Hey! Ich wusste nicht dass es boost::html gibt. Wo ist das denn zu finden?
    Dravere, deine Vorgehensweise finde ich ganz gut, aber ich war mich zu faul um etwas selbstständig zu basteln.



  • Das wäre dann hier:
    http://www.ibusy.com/articles/software-development/boost-html-library.html

    Ist im normalen Boost-Paket nicht dabei, wird lediglich unter der Boost-Lizenz vertrieben.

    greeetz
    Kessi



  • Hallo wieder!
    Hab mir die Bibliothek selbst gebastelt.
    Man benutzt sie bspw. so:

    #include "html_table.hpp"
    
    int main()
    {
    	using namespace ZM::Html;
    	Table t("testing");
    	t.add_row()
    		.add_heading("Column 1").add_heading("Days").add_heading("Balance");
    	t.add_row()
    		.add_cell("hi").add_cell("test").add_cell("okay");
    	t.add_row()
    		.add_cell("next").add_cell(23).add_cell(-32.032);
    	t.add_row()
    		.add_cell("this is a long cell...");
    }
    

    Daraus kriegt man eine html Datei, nämlich:

    <html>
    	<head><title>testing</title></head>
    	<body>
    		<table border="1" cellpadding="5">
    			<tr><th>Column 1</th><th>Days</th><th>Balance</th></tr>
    			<tr><td>hi</td><td>test</td><td>okay</td></tr>
    
    			<tr><td>next</td><td>23</td><td>-32.032</td></tr>
    			<tr><td>this is a long cell...</td></tr>
    		</table>
    	</body>
    </html>
    

    Die Schnittstelle sieht so aus:

    #ifndef GUARD_HTML_TABLE
    #define GUARD_HTML_TABLE 1
    
    namespace ZM
    {
    
    	namespace Html
    	{
    
    		class Table
    		{
    			struct impl;
    			impl* pimpl;
    			Table(const Table&);
    			Table& operator=(const Table&);
    
    		public:
    			Table(const char* name);
    			~Table();
    
    			class Row
    			{
    				friend class Table;
    				Table& t;
    				Row(Table&);
    
    			public:
    				~Row();
    				class Cell
    				{
    					friend class Row;
    					Row& r;
    					Cell(Row&, const char*);
    					Cell(Row&, int);
    					Cell(Row&, double);
    					~Cell();
    				};
    
    				class Heading
    				{
    					friend class Row;
    					Row& r;
    					Heading(Row&, const char*);
    					~Heading();
    				};
    
    				Row& add_heading(const char*);
    				Row& add_cell(const char*);
    				Row& add_cell(int);
    				Row& add_cell(double);
    			};
    
    			Row add_row();
    		};
    
    	}
    
    }
    
    #endif
    


  • khalderon schrieb:

    ...

    Und wo genau liegt das Problem?


  • Administrator

    drakon schrieb:

    Und wo genau liegt das Problem?

    Wahrscheinlich nirgends. Er/sie ist nur so vorbildlich und präsentiert die Lösung, falls jemand über die Forensuche wieder auf das Problem stösst 😉

    Grüssli



  • Eine weitere gute Bibliothek zum Erstellen von HTML-Code ist cgicc: http://www.gnu.org/software/cgicc/.



  • leute,
    das gefreut mich das mein boost.html library in deutschland auch benutz ist.


Log in to reply