summaryrefslogtreecommitdiffstats
path: root/kbabel/common/regexpextractor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kbabel/common/regexpextractor.cpp')
-rw-r--r--kbabel/common/regexpextractor.cpp271
1 files changed, 271 insertions, 0 deletions
diff --git a/kbabel/common/regexpextractor.cpp b/kbabel/common/regexpextractor.cpp
new file mode 100644
index 00000000..b69398c6
--- /dev/null
+++ b/kbabel/common/regexpextractor.cpp
@@ -0,0 +1,271 @@
+/* ****************************************************************************
+ This file is part of KBabel
+
+ Copyright (C) 2001 by Matthias Kiefer <matthias.kiefer@gmx.de>
+ 2002 by Stanislav Visnovsky <visnovsky@nenya.ms.mff.cuni.cz>
+
+ based on code of Andrea Rizzi <rizzi@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.
+
+ In addition, as a special exception, the copyright holders give
+ permission to link the code of this program with any edition of
+ the Qt library by Trolltech AS, Norway (or with modified versions
+ of Qt that use the same license as Qt), and distribute linked
+ combinations including the two. You must obey the GNU General
+ Public License in all respects for all of the code used other than
+ Qt. If you modify this file, you may extend this exception to
+ your version of the file, but you are not obligated to do so. If
+ you do not wish to do so, delete this exception statement from
+ your version.
+
+**************************************************************************** */
+#include "regexpextractor.h"
+
+#include <kdebug.h>
+#include <qregexp.h>
+
+using namespace KBabel;
+
+RegExpExtractor::RegExpExtractor(const QStringList& regexps) :
+ _regExpList( regexps )
+{
+ _string=QString::null;
+ _matches.setAutoDelete(true);
+}
+
+void RegExpExtractor::setString(QString string)
+{
+ _string=string;
+ processString();
+}
+
+uint RegExpExtractor::countMatches()
+{
+ return _matches.count();
+}
+
+QString RegExpExtractor::firstMatch()
+{
+ MatchedEntryInfo *ti = _matches.first();
+
+ if(ti)
+ return ti->extracted;
+
+ return QString::null;
+}
+
+QString RegExpExtractor::nextMatch()
+{
+ MatchedEntryInfo *ti=_matches.next();
+ if(!ti)
+ ti=_matches.first();
+
+ if(ti)
+ return ti->extracted;
+
+ return QString::null;
+}
+
+QString RegExpExtractor::match(uint tagnumber)
+{
+ MatchedEntryInfo *ti=_matches.at(tagnumber);
+ if(ti)
+ return ti->extracted;
+
+ return QString::null;
+}
+
+int RegExpExtractor::matchIndex(uint tagnumber)
+{
+ MatchedEntryInfo *ti=_matches.at(tagnumber);
+ if(ti)
+ return ti->index;
+
+ return -1;
+}
+
+QString RegExpExtractor::prevMatch()
+{
+ MatchedEntryInfo *ti=_matches.prev();
+ if(ti)
+ return ti->extracted;
+
+ return QString::null;
+}
+
+QString RegExpExtractor::lastMatch()
+{
+ MatchedEntryInfo *ti=_matches.last();
+ if(ti)
+ return ti->extracted;
+
+ return QString::null;
+}
+
+QStringList RegExpExtractor::matches()
+{
+ QStringList list;
+ MatchedEntryInfo *ti;
+ for(ti=_matches.first(); ti!=0; ti = _matches.next())
+ {
+ list.append(ti->extracted);
+ }
+
+ return list;
+}
+
+QString RegExpExtractor::plainString(bool keepPos)
+{
+ QString tmp=_string;
+
+ MatchedEntryInfo *ti;
+ for(ti=_matches.first(); ti != 0; ti=_matches.next())
+ {
+ uint len=ti->extracted.length();
+ QString s;
+ for(uint i=0; i<len; i++)
+ {
+ s+=' ';
+ }
+ tmp.replace(ti->index,len,s);
+
+ }
+ if(!keepPos)
+ {
+ tmp=tmp.simplifyWhiteSpace();
+ }
+
+ return tmp;
+}
+
+QString RegExpExtractor::matchesReplaced(const QString& replace)
+{
+ QString tmp=_string;
+
+ int posCorrection=0;
+ int replaceLen=replace.length();
+
+ MatchedEntryInfo *ti;
+ for(ti=_matches.first(); ti != 0; ti=_matches.next())
+ {
+ uint len=ti->extracted.length();
+ tmp.replace(ti->index + posCorrection,len,replace);
+
+ posCorrection+=(replaceLen-len);
+ }
+
+ return tmp;
+}
+
+void RegExpExtractor::processString()
+{
+ _matches.clear();
+
+ // if there is no regexp to be matched, quit
+ if( regExpList().empty() ) return;
+
+ QValueList<MatchedEntryInfo> tmpList;
+
+ bool found=false;
+ QString tmp=_string;
+ do
+ {
+ found=false;
+ QStringList::Iterator it;
+ for(it=_regExpList.begin();it!=_regExpList.end();++it)
+ {
+ int pos=-1;
+ QString tag;
+
+ QRegExp reg = QRegExp((*it));
+
+ pos = reg.search(tmp);
+ int len=reg.matchedLength();
+ if(pos>=0)
+ {
+ tag=tmp.mid(pos,len);
+ }
+
+ if(pos >= 0)
+ {
+ found=true;
+
+ MatchedEntryInfo ti;
+ ti.index=pos;
+ ti.extracted=tag;
+ tmpList.append(ti);
+
+ QString s;
+ for(uint i=0; i<tag.length(); i++)
+ {
+ s+=' ';
+ }
+ tmp.replace(pos,tag.length(),s);
+
+ break;
+ }
+ }
+ }
+ while( found );
+
+ uint num=tmpList.count();
+
+ for(uint i=0; i < num; i++)
+ {
+ uint n= 0;
+ uint min=_string.length();
+ uint counter=0;
+ QValueList<MatchedEntryInfo>::Iterator it;
+ for(it=tmpList.begin();it!=tmpList.end();++it)
+ {
+ if((*it).index < min)
+ {
+ min=(*it).index;
+ n=counter;
+ }
+
+ counter++;
+ }
+
+ it=tmpList.at(n);
+ MatchedEntryInfo *ti = new MatchedEntryInfo;
+ ti->index=(*it).index;
+ ti->extracted=(*it).extracted;
+ _matches.append(ti);
+ tmpList.remove(it);
+ }
+}
+
+QStringList RegExpExtractor::regExpList()
+{
+ return _regExpList;
+}
+
+void RegExpExtractor::setRegExpList( const QStringList& regexps )
+{
+ _regExpList = regexps;
+}
+
+void RegExpExtractor::addRegExpIdentifier(QString regExp)
+{
+ _regExpList.append(regExp);
+}
+
+void RegExpExtractor::deleteRegExpIdentifier(QString regExp)
+{
+ _regExpList.remove(regExp);
+}
+