You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kvirc/src/kvilib/ext/kvi_cmdformatter.cpp

243 lines
5.7 KiB

//=============================================================================
//
// File : kvi_cmdformatter.cpp
// Creation date : Tue Jun 12 2001 03:08:12 CEST by Szymon Stefanek
//
// This file is part of the KVirc irc client distribution
// Copyright (C) 2001-2007 Szymon Stefanek (pragma at kvirc dot net)
//
// 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 opinion) 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.
//
//=============================================================================
#define __KVILIB__
#include "kvi_cmdformatter.h"
namespace KviCommandFormatter
{
bool hasLeadingChars(KviStr ** array,char c)
{
if(!(*array))return false; // can't have more leading chars
bool bGotIt = false;
while(*array)
{
if(*((*array)->ptr()) == c)
{
// found at least one such leading char
bGotIt = true;
} else {
// we pretend this line to be empty
KviStr tmp = *(*array);
tmp.stripWhiteSpace();
if(tmp.hasData())return false;
*(*array) = ""; // set it to empty also in the main buffer
}
array++;
}
return bGotIt;
}
bool hasLeadingChars(TQStringList &list,const TQChar &c)
{
bool bGotIt = false;
for(TQStringList::Iterator it = list.begin();it != list.end();++it)
{
if((*it).length() < 1)continue;
if((*it).at(0) == c)
{
// found at least one such leading char
bGotIt = true;
} else {
// we pretend this line to be empty
TQString tmp = *it;
#ifdef COMPILE_USE_QT4
tmp = tmp.trimmed();
#else
tmp = tmp.stripWhiteSpace();
#endif
if(!tmp.isEmpty())return false;
*it = ""; // set it to empty also in the main buffer
}
}
return bGotIt;
}
void trimLeading(KviStr ** array)
{
while(*array)
{
if((*array)->hasData())(*array)->cutLeft(1);
array++;
}
}
void trimLeading(TQStringList &list)
{
for(TQStringList::Iterator it = list.begin();it != list.end();++it)
{
(*it).remove(0,1);
}
}
void addLeading(KviStr ** array,char c)
{
while(*array)
{
if((*array)->hasData())(*array)->prepend(c);
array++;
}
}
void addLeading(TQStringList &list,const TQChar & c)
{
for(TQStringList::Iterator it = list.begin();it != list.end();++it)
{
(*it).prepend(c);
}
}
void unindent(KviStr &buffer)
{
// we can format correctly up to 65536 lines (that's really enough)
int realLen;
KviStr ** array = buffer.splitToArray('\n',65536,&realLen);
if(array)
{
while(hasLeadingChars(array,'\t') || hasLeadingChars(array,' '))trimLeading(array);
buffer.joinFromArray(array,"\n",true);
KviStr::freeArray(array);
}
}
void unindent(TQString &buffer)
{
#ifdef COMPILE_USE_QT4
TQStringList list = buffer.split("\n",TQString::KeepEmptyParts);
#else
TQStringList list = TQStringList::split("\n",buffer,true);
#endif
while(hasLeadingChars(list,TQChar('\t')) || hasLeadingChars(list,TQChar(' ')))trimLeading(list);
//buffer = list.join("\n"); join implementation sux :D
// we WANT the last newline
buffer = "";
for(TQStringList::Iterator it = list.begin();it != list.end();++it)
{
buffer.append(*it);
buffer.append(TQChar('\n'));
}
}
void bufferFromBlock(KviStr &buffer)
{
buffer.stripWhiteSpace();
if((*(buffer.ptr()) == '{') && buffer.lastCharIs('}'))
{
// leading and trailing { must be stripped
buffer.cutLeft(1);
buffer.cutRight(1);
}
unindent(buffer);
buffer.stripWhiteSpace();
}
void bufferFromBlock(TQString &buffer)
{
#ifdef COMPILE_USE_QT4
buffer = buffer.trimmed();
#else
buffer = buffer.stripWhiteSpace();
#endif
if(buffer.isEmpty())return;
if((buffer.at(0) == TQChar('{')) && buffer.endsWith(TQChar('}')))
{
buffer.remove(0,1);
buffer.remove(buffer.length() - 1,1);
while((buffer.length() > 0) && ((buffer.at(0) == TQChar('\n')) || (buffer.at(0) == TQChar('\r'))))
buffer.remove(0,1);
}
unindent(buffer);
#ifdef COMPILE_USE_QT4
buffer = buffer.trimmed();
#else
buffer = buffer.stripWhiteSpace();
#endif
}
void indent(KviStr &buffer)
{
// we can format correctly up to 65536 lines (that's really enough)
int realLen;
KviStr ** array = buffer.splitToArray('\n',65536,&realLen);
if(array)
{
addLeading(array,'\t');
buffer.joinFromArray(array,"\n",true);
KviStr::freeArray(array);
}
}
void indent(TQString &buffer)
{
#ifdef COMPILE_USE_QT4
TQStringList list = buffer.split("\n",TQString::KeepEmptyParts);
#else
TQStringList list = TQStringList::split("\n",buffer,true);
#endif
addLeading(list,TQChar('\t'));
//buffer = list.join("\n"); join implementation sux :D
// we WANT the last newline
buffer = "";
for(TQStringList::Iterator it = list.begin();it != list.end();++it)
{
buffer.append(*it);
buffer.append(TQChar('\n'));
}
}
void blockFromBuffer(KviStr &buffer)
{
indent(buffer);
buffer.prepend("{\n");
buffer.stripRightWhiteSpace();
buffer.ensureLastCharIs('\n');
buffer.append("}\n");
}
void blockFromBuffer(TQString &buffer)
{
indent(buffer);
buffer.prepend("{\n");
KviTQString::stripRightWhiteSpace(buffer);
KviTQString::ensureLastCharIs(buffer,'\n');
buffer.append("}\n");
}
};
// FIXME: #warning "move popups and events to this formatting stuff!"