mirror of
https://bitbucket.org/smil3y/kde-playground.git
synced 2025-02-23 18:32:51 +00:00
227 lines
5.2 KiB
C++
227 lines
5.2 KiB
C++
/*
|
|
This file is part of KHelpcenter.
|
|
|
|
Copyright (c) 2003 Cornelius Schumacher <schumacher@kde.org>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*/
|
|
|
|
#include "formatter.h"
|
|
|
|
#include <KLocale>
|
|
#include <KGlobal>
|
|
#include <KDebug>
|
|
#include <KConfig>
|
|
#include <KConfigGroup>
|
|
#include <KStandardDirs>
|
|
|
|
#include <QFile>
|
|
#include <QTextStream>
|
|
|
|
using namespace KHC;
|
|
|
|
Formatter::Formatter()
|
|
: mHasTemplate( false )
|
|
{
|
|
}
|
|
|
|
Formatter:: ~Formatter()
|
|
{
|
|
}
|
|
|
|
bool Formatter::readTemplates()
|
|
{
|
|
KConfigGroup cfg(KGlobal::config(), "Templates");
|
|
QString mainTemplate = cfg.readEntry( "MainTemplate" );
|
|
|
|
if ( mainTemplate.isEmpty() )
|
|
{
|
|
mainTemplate = KStandardDirs::locate( "appdata", "maintemplate" );
|
|
}
|
|
|
|
if ( mainTemplate.isEmpty() )
|
|
{
|
|
kWarning() << "Main template file name is empty." ;
|
|
return false;
|
|
}
|
|
|
|
QFile f( mainTemplate );
|
|
if ( !f.open( QIODevice::ReadOnly ) )
|
|
{
|
|
kWarning() << "Unable to open main template file '" << mainTemplate
|
|
<< "'." << endl;
|
|
return false;
|
|
}
|
|
|
|
QTextStream ts( &f );
|
|
QString line;
|
|
enum State { IDLE, SINGLELINE, MULTILINE };
|
|
State state = IDLE;
|
|
QString symbol;
|
|
QString endMarker;
|
|
QString value;
|
|
while( !( line = ts.readLine() ).isNull() ) {
|
|
switch ( state ) {
|
|
case IDLE:
|
|
if ( !line.isEmpty() && !line.startsWith( '#' ) )
|
|
{
|
|
int pos = line.indexOf( "<<" );
|
|
if ( pos >= 0 )
|
|
{
|
|
state = MULTILINE;
|
|
symbol = line.left( pos ).trimmed();
|
|
endMarker = line.mid( pos + 2 ).trimmed();
|
|
} else {
|
|
state = SINGLELINE;
|
|
symbol = line.trimmed();
|
|
}
|
|
}
|
|
break;
|
|
case SINGLELINE:
|
|
mSymbols.insert( symbol, line );
|
|
state = IDLE;
|
|
break;
|
|
case MULTILINE:
|
|
if ( line.startsWith( endMarker ) )
|
|
{
|
|
mSymbols.insert( symbol, value );
|
|
value = "";
|
|
state = IDLE;
|
|
}
|
|
else
|
|
{
|
|
value += line + '\n';
|
|
}
|
|
break;
|
|
default:
|
|
kError() << "Formatter::readTemplates(): Illegal state: "
|
|
<< static_cast<int>(state) << endl;
|
|
break;
|
|
}
|
|
}
|
|
|
|
f.close();
|
|
|
|
QStringList requiredSymbols;
|
|
requiredSymbols << "HEADER" << "FOOTER";
|
|
|
|
bool success = true;
|
|
QStringList::ConstIterator it2;
|
|
for( it2 = requiredSymbols.constBegin(); it2 != requiredSymbols.constEnd(); ++it2 )
|
|
{
|
|
if ( !mSymbols.contains( *it2 ) )
|
|
{
|
|
success = false;
|
|
kError() << "Symbol '" << *it2 << "' is missing from main template file."
|
|
<< endl;
|
|
}
|
|
}
|
|
|
|
if ( success ) mHasTemplate = true;
|
|
return success;
|
|
}
|
|
|
|
QString Formatter::header( const QString &title )
|
|
{
|
|
QString s;
|
|
if ( mHasTemplate )
|
|
{
|
|
s = mSymbols[ "HEADER" ];
|
|
s.replace( "--TITLE:--", title );
|
|
} else {
|
|
s = QLatin1String("<html><head><title>") + title + QLatin1String("</title></head>\n<body>\n");
|
|
}
|
|
return s;
|
|
}
|
|
|
|
QString Formatter::footer()
|
|
{
|
|
if ( mHasTemplate )
|
|
{
|
|
return mSymbols[ "FOOTER" ];
|
|
} else {
|
|
return QLatin1String("</body></html>");
|
|
}
|
|
}
|
|
|
|
QString Formatter::separator()
|
|
{
|
|
return "<hr>";
|
|
}
|
|
|
|
QString Formatter::docTitle( const QString &title )
|
|
{
|
|
return QLatin1String("<h3><font color=\"red\">") + title + QLatin1String("</font></h3>");
|
|
}
|
|
|
|
QString Formatter::sectionHeader( const QString §ion )
|
|
{
|
|
return QLatin1String("<h2><font color=\"blue\">") + section + QLatin1String("</font></h2>");
|
|
}
|
|
|
|
QString Formatter::processResult( const QString &data )
|
|
{
|
|
QString result;
|
|
|
|
enum { Header, BodyTag, Body, Footer };
|
|
|
|
int state = Header;
|
|
|
|
for( int i = 0; i < data.length(); ++i )
|
|
{
|
|
QChar c = data[i];
|
|
switch ( state )
|
|
{
|
|
case Header:
|
|
if ( c == QLatin1Char('<') && data.mid( i, 5 ).toLower() == QLatin1String("<body") )
|
|
{
|
|
state = BodyTag;
|
|
i += 4;
|
|
}
|
|
break;
|
|
case BodyTag:
|
|
if ( c == '>' ) state = Body;
|
|
break;
|
|
case Body:
|
|
if ( c == QLatin1Char('<') && data.mid( i, 7 ).toLower() == QLatin1String("</body>") )
|
|
{
|
|
state = Footer;
|
|
} else {
|
|
result.append( c );
|
|
}
|
|
break;
|
|
case Footer:
|
|
break;
|
|
default:
|
|
result.append( c );
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ( state == Header ) return data;
|
|
else return result;
|
|
}
|
|
|
|
QString Formatter::paragraph( const QString &str )
|
|
{
|
|
return QLatin1String("<p>") + str + QLatin1String("</p>");
|
|
}
|
|
|
|
QString Formatter::title( const QString &title )
|
|
{
|
|
return QLatin1String("<h2>") + title + QLatin1String("</h2>");
|
|
}
|
|
|
|
// vim:ts=2:sw=2:et
|