first attempt at HTML output for Wob-Files
authorkonrad <konrad@6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33>
Thu, 24 Dec 2009 19:23:20 +0000 (19:23 +0000)
committerkonrad <konrad@6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33>
Thu, 24 Dec 2009 19:23:20 +0000 (19:23 +0000)
git-svn-id: https://silmor.de/svn/softmagic/smoke/trunk@351 6e3c4bff-ac9f-4ac1-96c5-d2ea494d3e33

wob/magicsmoke.wolf
woc/htmlout.cpp [new file with mode: 0644]
woc/htmlout.h [new file with mode: 0644]
woc/processor.cpp
woc/processor.h
woc/woc.pro

index e898b9b..be0a76a 100644 (file)
@@ -33,7 +33,7 @@
                        userName="Session::currentUserName()"
                        init="new Session($this)"/>
        </PHPServerOutput>
-       <!-- HtmlOutput sourceDir="doc" subDir="wob"/ -->
+       <HtmlOutput sourceDir="doc" subDir="wob" clean="yes"/>
        
        <!-- load and parse class definitions -->
        <Include file="basics.wolf"/>
diff --git a/woc/htmlout.cpp b/woc/htmlout.cpp
new file mode 100644 (file)
index 0000000..05bfadf
--- /dev/null
@@ -0,0 +1,226 @@
+//
+// C++ Implementation: qtout
+//
+// Description: 
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2009
+//
+// Copyright: See README/COPYING files that come with this distribution
+//
+//
+
+#include "htmlout.h"
+
+#include <QDir>
+#include <QDomElement>
+
+WocHtmlOut::WocHtmlOut(QDomElement&el)
+{
+       qDebug("Info: creating Html Output Generator.");
+       m_basedir=WocProcessor::instance()->baseDir()+"/"+el.attribute("sourceDir",".");
+       m_subdir=el.attribute("subDir","htmlwob");
+       bool clean=str2bool(el.attribute("clean","0"));
+       //cleanup directory (remove normal files, assume remainder is harmless)
+       QDir d(m_basedir+"/"+m_subdir);
+       if(d.exists() && clean){
+               QStringList ent=d.entryList(QDir::Files);
+               for(int i=0;i<ent.size();i++)
+                       d.remove(ent[i]);
+       }
+       //get/create directory
+       if(!d.exists())QDir(".").mkpath(m_basedir+"/"+m_subdir);
+       
+       //create index file
+       m_index.setFileName(m_basedir+"/"+m_subdir+"/index.html");
+       if(!m_index.open(QIODevice::WriteOnly|QIODevice::Truncate)){
+               qDebug("Error: cannot create HTML index file %s.",m_index.fileName().toAscii().data());
+               emit errorFound();
+               return;
+       }
+       m_index.write(QByteArray("<html>\n<head>\n"));
+       m_index.write(QByteArray("<title>Project Index</title>\n"));
+       
+       m_index.write(QByteArray("</head><body>\n"));
+       //TODO: write project info
+}
+
+WocHtmlOut::~WocHtmlOut(){}
+
+void WocHtmlOut::finalize()
+{
+       //TODO: write index table content
+       m_index.write(QByteArray("<h2>Classes</h2>\n<ul>\n"));
+       QStringList sl=WocProcessor::instance()->classNames();
+       QString s;
+       qSort(sl);
+       for(int i=0;i<sl.size();i++)
+               s+="<li><a href=\"class-"+sl[i]+".html\">"+sl[i]+"</a></li>\n";
+       m_index.write(s.toAscii());
+       
+       m_index.write(QByteArray("</ul>\n<h2>Transactions</h2>\n<ul>"));
+       sl=WocProcessor::instance()->transactionNames();
+       s="";
+       qSort(sl);
+       for(int i=0;i<sl.size();i++)
+               s+="<li><a href=\"trn-"+sl[i]+".html\">"+sl[i]+"</a></li>\n";
+       m_index.write(s.toAscii());
+       
+       m_index.write(QByteArray("</ul>\n<h2>Tables</h2>\n<ul>"));
+       sl=WocProcessor::instance()->tableNames();
+       s="";
+       qSort(sl);
+       for(int i=0;i<sl.size();i++)
+               s+="<li><a href=\"table-"+sl[i]+".html\">"+sl[i]+"</a></li>\n";
+       m_index.write(s.toAscii());
+       
+       m_index.write(QByteArray("</ul>\n"));
+       
+       m_index.write(QByteArray("\n</body></html>\n"));
+       m_index.close();
+}
+
+void WocHtmlOut::newTable(const WocTable&tbl)
+{
+       QString cn=tbl.name();
+       QFile htm(m_basedir+"/"+m_subdir+"/table-"+cn+".html");
+       if(!htm.open(QIODevice::WriteOnly|QIODevice::Truncate)){
+               qDebug("Error: cannot create html file for table %s.",cn.toAscii().data());
+               emit errorFound();
+               return;
+       }
+       //lead in
+       htm.write(QString("<html><title>Table "+cn+"</title><body>\n").toAscii());
+       
+       QString hcd;
+       //table declaration
+       hcd+="<h1>Table "+cn+"</h1>\n";
+       hcd+="<table frame=\"1\" border=\"1\"><tr><td><b>Column Name</b></td><td><b>Type</b></td><td><b>Properties</b></td></tr>\n";
+       QStringList cl=tbl.columns();
+       for(int i=0;i<cl.size();i++){
+               hcd+="<tr><td>"+cl[i]+"</td><td>"+tbl.columnType(cl[i])+"</td><td>";
+               if(tbl.columnIsPrimary(cl[i]))
+                       hcd+="Primary-Key ";
+               if(tbl.columnIsNull(cl[i]))
+                       hcd+="NULL-able ";
+               if(tbl.columnHasDefault(cl[i]))
+                       hcd+="default=\""+tbl.columnDefault(cl[i])+"\" ";
+               if(tbl.columnIsForeign(cl[i])){
+                       QStringList cf=tbl.columnForeign(cl[i]).split(":");
+                       hcd+="Foreign-Key=<a href=\"table-"+cf[0]+".html\">"+cf[0]+"("+cf[1]+")</a> ";
+               }
+               if(tbl.columnIsIndexed(cl[i]))
+                       hcd+="Indexed ";
+               if(tbl.columnIsUnique(cl[i]))
+                       hcd+="Unique";
+               hcd+="</td></tr>\n";
+       }
+       hcd+="</table>\n";
+       
+       //enums
+       for(int i=0;i<cl.size();i++){
+               QList<QPair<QString,int> >lst=tbl.columnEnums(cl[i]);
+               if(lst.size()>0){
+                       hcd+="<h2>Enum for column "+cl[i]+"</h2>\n<ul>\n";
+                       for(int j=0;j<lst.size();j++)
+                               hcd+="<li>"+lst[j].first+"="+QString::number(lst[j].second)+"</li>\n";
+                       hcd+="</ul>\n";
+               }
+       }
+       
+       hcd+="</body></html>\n";
+       htm.write(hcd.toAscii());
+}
+
+void WocHtmlOut::newClass(const WocClass&cls)
+{
+       QString cn=cls.name();
+       QFile htm(m_basedir+"/"+m_subdir+"/class-"+cn+".html");
+       if(!htm.open(QIODevice::WriteOnly|QIODevice::Truncate)){
+               qDebug("Error: cannot create html file for class %s.",cn.toAscii().data());
+               emit errorFound();
+               return;
+       }
+       //lead in
+       htm.write(QString("<html><title>Class "+cn+"</title><body>\n").toAscii());
+       
+       QString hcd;
+       //class declaration
+       hcd+="<h1>";
+       if(cls.isAbstract())hcd+="Abstract ";
+       hcd+="Class "+cn+"</h1>\n";
+       
+       //enums
+       classEnums(cls,htm);
+       
+       //properties
+       classProperties(cls,htm);
+       
+       //TODO: mappings
+       
+       //lead out
+       htm.write(QByteArray("</body></html>\n"));
+}
+
+void WocHtmlOut::classEnums(const WocClass&cls,QFile&hdr)
+{
+       QStringList k=cls.enumTypes();
+       if(k.size()==0)return;
+       QString hcd="<h2>Enums</h2>\n";
+       for(int i=0;i<k.size();i++){
+               //type
+               hcd+="<h3>enum "+k[i]+"</h3>\n";
+               hcd+="<table frame=\"1\" border=\"1\">";
+               hcd+="<tr><td><b>Symbol</b></td><td><b>Value</b></td></tr>\n";
+               QList<QPair<QString,int> >ev=cls.enumValues(k[i]);
+               for(int j=0;j<ev.size();j++){
+                       hcd+="<tr><td>"+ev[j].first+"</td><td>"+QString::number(ev[j].second)+"</td></tr>\n";
+               }
+               hcd+="</table>\n";
+       }
+       hdr.write(hcd.toAscii());
+}
+
+void WocHtmlOut::classProperties(const WocClass&cls,QFile&hdr)
+{
+       QStringList k=cls.propertyNames();
+       if(k.size()==0)return;
+       QString hcd;
+       //declare members
+       hcd="<h2>Properties</h2>\n";
+       for(int i=0;i<k.size();i++){
+               hcd+=k[i]+"<br/>\n";
+       }
+       //write
+       hdr.write(hcd.toAscii());
+}
+
+void WocHtmlOut::newTransaction(const WocTransaction&trn)
+{
+       QString cn=trn.name();
+       QFile htm(m_basedir+"/"+m_subdir+"/trn-"+cn+".html");
+       if(!htm.open(QIODevice::WriteOnly|QIODevice::Truncate)){
+               qDebug("Error: cannot create HTML file for transaction %s.",cn.toAscii().data());
+               emit errorFound();
+               return;
+       }
+       //basics
+       QStringList in=trn.inputNames();
+       QStringList out=trn.outputNames();
+       //lead in
+       QString hcd;
+       hcd="<html><title>Transaction "+cn+"</title><body>\n<h1>Transaction "+cn+"</h1>\n";
+       hcd+="<h2>Inputs:</h2>\n<ul>\n";
+       for(int i=0;i<in.size();i++){
+               hcd+="<li>"+in[i]+": "+trn.inputType(in[i])+"</li>\n";
+               //TODO: link class types
+       }
+       hcd+="</ul>\n<h2>Outputs:</h2>\n<ul>\n";
+       for(int i=0;i<out.size();i++){
+               hcd+="<li>"+out[i]+": "+trn.outputType(out[i])+"</li>\n";
+               //TODO: link class types
+       }
+       hcd+="</ul>\n";
+       hcd+="</body></html>\n";
+       htm.write(hcd.toAscii());
+}
diff --git a/woc/htmlout.h b/woc/htmlout.h
new file mode 100644 (file)
index 0000000..4b2dab0
--- /dev/null
@@ -0,0 +1,47 @@
+//
+// C++ Interface: qtout
+//
+// Description: 
+//
+//
+// Author: Konrad Rosenbaum <konrad@silmor.de>, (C) 2009
+//
+// Copyright: See README/COPYING files that come with this distribution
+//
+//
+
+#ifndef WOC_HTMLOUT_H
+#define WOC_HTMLOUT_H
+
+#include "processor.h"
+
+#include <QFile>
+
+class QDomElement;
+
+class WocHtmlOut:public WocOutput
+{
+       public:
+               WocHtmlOut(QDomElement&);
+               ~WocHtmlOut();
+       protected:
+               virtual void finalize();
+               virtual void newClass(const WocClass&);
+               virtual void newTable(const WocTable&);
+               virtual void newTransaction(const WocTransaction&);
+       private:
+               QString m_basedir,m_subdir;
+               QFile m_index;
+               
+               /**helper: generate enums for classes*/
+               void classEnums(const WocClass&,QFile&);
+               /**helper: generate properties*/
+               void classProperties(const WocClass&,QFile&);
+               /**helper: generate constructors/deserializer/copiers*/
+               void classDeserializer(const WocClass&,QFile&);
+               /**helper: generate serializers*/
+               void classSerializers(const WocClass&,QFile&);
+               
+};
+
+#endif
index 0e3b88d..23223dd 100644 (file)
@@ -14,6 +14,7 @@
 
 #include "phpout.h"
 #include "qtout.h"
+#include "htmlout.h"
 
 #include "../src/domquery.h"
 
@@ -138,6 +139,10 @@ bool WocProcessor::processFile(QString fn)
                        new WocPHPServerOut(el);
                        if(m_error)return false;
                }else
+               if(tn=="HtmlOutput"){
+                       new WocHtmlOut(el);
+                       if(m_error)return false;
+               }else
                if(tn=="Version"){
                        if(el.hasAttribute("comm"))
                                m_verComm=el.attribute("comm");
@@ -277,6 +282,22 @@ QStringList WocProcessor::transactionNames()const
        return l;
 }
 
+QStringList WocProcessor::classNames()const
+{
+       QStringList l;
+       for(int i=0;i<m_classes.size();i++)
+               l<<m_classes[i].name();
+       return l;
+}
+
+QStringList WocProcessor::tableNames()const
+{
+       QStringList l;
+       for(int i=0;i<m_tables.size();i++)
+               l<<m_tables[i].name();
+       return l;
+}
+
 /******************************************************************************
  * WocOutput
  ******************************************************************************/
index da26967..2e87f51 100644 (file)
@@ -366,6 +366,10 @@ class WocProcessor:public QObject
                
                /**returns a list of transaction names*/
                QStringList transactionNames()const;
+               /**returns a list of class names*/
+               QStringList classNames()const;
+               /**returns a list of table names*/
+               QStringList tableNames()const;
        signals:
                void sfinalize();
                void newClass(const WocClass&);
index d6f4919..7e6a7ad 100644 (file)
@@ -15,9 +15,11 @@ SOURCES+= \
        woc.cpp \
        qtout.cpp \
        phpout.cpp \
+       htmlout.cpp \
        ../src/domquery.cpp
 HEADERS+= \
        processor.h \
        phpout.h \
        qtout.h \
+       htmlout.h \
        ../src/domquery.h
\ No newline at end of file