--- /dev/null
+//
+// 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());
+}