***************************************************************************/
#include "kita_misc.h"
-#include "qcp932codec.h"
-#include "datinfo.h" /* struct RESDAT is defined. */
-#include "kita-utf8.h"
-#include "kita-utf16.h"
-#include "config_xt.h"
-#include "datmanager.h"
-
-#include <kurl.h>
-#include <klocale.h>
-#include <kdebug.h>
-#include <kdeversion.h>
-
-#include <qregexp.h>
-#include <qeucjpcodec.h>
-#include <qdir.h>
-#include <qmutex.h>
-#include <qdatetime.h>
-
-#define KITA_RESDIGIT 4
-
-
-namespace Kita
-{
- static QCp932Codec* qcpCodec = NULL;
- static QTextCodec* utf8Codec = NULL;
- static QTextCodec* eucCodec = NULL;
-
- static QString m_weekstr[ 7 ];
- static QString m_colonstr;
- static QString m_colonnamestr;
-
- /* fro convertURL */
- static int m_prevConvMode;
- static QString m_prevConvURL;
- static QString m_prevConvNewURL;
- static QString m_prevConvRefstr;
-
- /* for ParseMachiBBSOneLine */
- static QString m_machiSubject;
- static QString m_machiLine;
-}
-
-
-/*---------------------------------------------------*/
-
-/* Text codecs */
-
-
-QString Kita::qcpToUnicode( const QString& str )
-{
- if ( !Kita::qcpCodec ) Kita::qcpCodec = new QCp932Codec();
-
- return Kita::qcpCodec->toUnicode( str );
-}
-
-
-QString Kita::utf8ToUnicode( const QString& str )
-{
- if ( !Kita::utf8Codec ) Kita::utf8Codec = QTextCodec::codecForName( "utf8" );
-
- return Kita::utf8Codec->toUnicode( str );
-}
-
-
-QString Kita::eucToUnicode( const QString& str )
-{
- if ( !Kita::eucCodec ) Kita::eucCodec = QTextCodec::codecForName( "eucJP" );
-
- return Kita::eucCodec->toUnicode( str );
-}
-
-
-
-/*------------------------------------------------------------*/
-/*------------------------------------------------------------*/
-
-/* conversion of DAT */
-
-
-/* get HTML from raw data */
-QString Kita::datToHtml( const QString& rawData, int num )
-{
- QString retHTML, subject, titleHTML;
- RESDAT resdat;
-
- resdat.num = num;
- resdat.linestr = rawData;
- resdat.parsed = FALSE;
- parseResDat( resdat, subject );
- createTitleHTML( resdat, titleHTML );
-
- retHTML = "<div class=\"res_title\">" + titleHTML + "</div>";
- retHTML += "<div class=\"res_body\">" + resdat.bodyHTML + "</div>";
-
- return retHTML;
-}
-
-
-/* get plain text from raw data */
-/*
- This function replaces "<br>" to "\n", removes HTML tags and
- replaces special chars.
-*/
-void Kita::DatToText(
- /* input */
- const QString &rawData,
-
- /* output */
- QString& text
-)
-{
- text = QString::null;
-
- unsigned int startPos, pos;
- const QChar *chpt = rawData.unicode();
- unsigned int length = rawData.length();
-
- for ( unsigned int i = startPos = 0 ; i < length ; i++ ) {
-
- switch ( chpt[ i ].unicode() ) {
-
- case '<':
-
- /* " <br> " */
- if ( chpt[ i + 1 ] == 'b' && chpt[ i + 2 ] == 'r' && chpt[ i + 3 ] == '>' ) {
-
- unsigned int i2 = i - startPos;
- if ( i > 0 && chpt[ i - 1 ] == ' ' ) i2--; /* remove space before <br> */
- text += rawData.mid( startPos, i2 ) + '\n';
- startPos = i + 4;
- if ( chpt[ startPos ] == ' ' ) startPos++; /* remove space after <br> */
- i = startPos - 1;
- }
-
- /*----------------------------------------*/
+#include <QtCore/QRegExp>
+#include <QtGui/QFont>
- /* remove HTML tags <[^>]*> */
- else {
-
- if ( i - startPos ) text += rawData.mid( startPos, i - startPos );
- while ( chpt[ i ] != '>' && i < length ) i++;
- startPos = i + 1;
- }
-
- break;
-
-
- /*----------------------------------*/
-
- case '&':
-
- /* special char */
- {
- QString tmpstr;
- tmpstr = parseSpecialChar( chpt + i, pos );
-
- if ( tmpstr != QString::null ) {
- text += rawData.mid( startPos, i - startPos ) + tmpstr;
- startPos = i + pos;
- i = startPos - 1;
- }
- }
-
- break;
- }
- }
-
- text += rawData.mid( startPos );
-}
-
-
-/* parsing function for special char (such as ♥ */
-
-/* For example, if cdat = "&", then
-
- pos (= length of cdat) = 5,
- retstr = "&". */
-QString Kita::parseSpecialChar(
-
- /* input */
- const QChar *cdat,
-
- /* output */
- unsigned int& pos )
-{
- QString retstr = QString::null;
-
- if ( ( pos = isEqual( cdat , ">" ) ) ) retstr = ">";
- else if ( ( pos = isEqual( cdat , "<" ) ) ) retstr = "<";
- else if ( ( pos = isEqual( cdat , " " ) ) ) retstr = " ";
- else if ( ( pos = isEqual( cdat , "&" ) ) ) retstr = "&";
- else if ( ( pos = isEqual( cdat , """ ) ) ) retstr = "\"";
-
- else if ( ( pos = isEqual( cdat , "♥" ) ) )
- retstr = utf8ToUnicode( KITAUTF8_HEART );
-
- else if ( ( pos = isEqual( cdat , "♦" ) ) )
- retstr = utf8ToUnicode( KITAUTF8_DIA );
+#include <kurl.h>
- else if ( ( pos = isEqual( cdat , "♣" ) ) )
- retstr = utf8ToUnicode( KITAUTF8_CLUB );
+#include "boardmanager.h"
+#include "datmanager.h"
+#include "kita-utf16.h"
- else if ( ( pos = isEqual( cdat , "♠" ) ) )
- retstr = utf8ToUnicode( KITAUTF8_SPADE );
+using namespace Kita;
- return retstr;
-}
+/* fro convertURL */
+static int m_prevConvMode;
+static QString m_prevConvUrl;
+static QString m_prevConvNewUrl;
+static QString m_prevConvRefstr;
+/* for ParseMachiBBSOneLine */
+static QString m_machiSubject;
+static QString m_machiLine;
/*------------------------------------------------------------*/
/*------------------------------------------------------------*/
/* conversion of URL */
-KURL Kita::getDatURL( const KURL& url , QString& refstr )
+KUrl Kita::getDatUrl(const KUrl& url , QString& refstr)
{
- return convertURL( URLMODE_DAT, url, refstr );
+ return convertUrl(URLMODE_DAT, url, refstr);
}
-KURL Kita::getDatURL( const KURL& url )
+KUrl Kita::getDatUrl(const KUrl& url)
{
QString refstr;
- return convertURL( URLMODE_DAT, url, refstr );
+ return convertUrl(URLMODE_DAT, url, refstr);
}
-QString Kita::getThreadURL( const KURL& url, QString& refstr )
+QString getThreadUrl(const KUrl& url, QString& refstr)
{
- return convertURL( URLMODE_THREAD, url, refstr );
+ return convertUrl(URLMODE_THREAD, url, refstr);
}
-QString Kita::getThreadURL( const KURL& url )
+QString Kita::getThreadUrl(const KUrl& url)
{
QString refstr;
- return convertURL( URLMODE_THREAD, url, refstr );
-}
-
-QString Kita::getNewThreadWriteURL( const KURL& m_datURL )
-{
- int m_bbstype = Kita::BoardManager::type( m_datURL );
- QString m_bbscgi;
-
- /* set path of bbs.cgi */
- switch ( m_bbstype ) {
-
- case Kita::Board_JBBS: {
- QString cgipath = Kita::BoardManager::boardRoot( m_datURL )
- + "/bbs/write.cgi/" + Kita::BoardManager::boardID( m_datURL ) + "/";
-
- cgipath += "new/";
-
- m_bbscgi = cgipath;
- }
-
- break;
-
- case Kita::Board_MachiBBS: {
- QString cgipath = Kita::BoardManager::boardRoot( m_datURL )
- + "/bbs/write.cgi";
- m_bbscgi = cgipath;
- }
-
- break;
-
- default:
-
- m_bbscgi = Kita::BoardManager::boardRoot( m_datURL ) + "/test/bbs.cgi";
- }
-
- return m_bbscgi;
+ return convertUrl(URLMODE_THREAD, url, refstr);
}
-QString Kita::getWriteURL( const KURL& m_datURL )
+QString Kita::getWriteUrl(const KUrl& m_datUrl)
{
- int m_bbstype = Kita::BoardManager::type( m_datURL );
+ int m_bbstype = BoardManager::type(m_datUrl);
QString m_bbscgi;
/* set path of bbs.cgi */
- switch ( m_bbstype ) {
+ switch (m_bbstype) {
- case Kita::Board_JBBS: {
- QString cgipath = Kita::BoardManager::boardRoot( m_datURL )
- + "/bbs/write.cgi/" + Kita::BoardManager::boardID( m_datURL ) + "/";
+ case Board_JBBS: {
+ QString cgipath = BoardManager::boardRoot(m_datUrl)
+ + "/bbs/write.cgi/" + BoardManager::boardId(m_datUrl) + '/';
- cgipath += Kita::DatManager::threadID( m_datURL ) + "/";
+ cgipath += DatManager(m_datUrl).threadId() + '/';
m_bbscgi = cgipath;
}
break;
- case Kita::Board_MachiBBS: {
- QString cgipath = Kita::BoardManager::boardRoot( m_datURL )
+ case Board_MachiBBS: {
+ QString cgipath = BoardManager::boardRoot(m_datUrl)
+ "/bbs/write.cgi";
m_bbscgi = cgipath;
}
default:
- m_bbscgi = Kita::BoardManager::boardRoot( m_datURL ) + "/test/bbs.cgi";
+ m_bbscgi = BoardManager::boardRoot(m_datUrl) + "/test/bbs.cgi";
}
return m_bbscgi;
If mode = URLMODE_DAT, output is URL of dat file.
If mode = URLMODE_THREAD, output is URL of read.cgi .
- If url is NOT enrolled, return QString::null.
+ If url is NOT enrolled, return QString().
(ex.1)
refstr : 1-100
*/
-QString Kita::convertURL(
+QString Kita::convertUrl(
/* input */
int mode, /* if 0, output is dat URL. If 1, output is thread URL */
- const KURL& url ,
+ const KUrl& url ,
/* output */
- QString& refstr )
+ QString& refstr)
{
- refstr = QString::null;
+ refstr.clear();
- if ( url.isEmpty() ) return QString::null;
+ if (url.isEmpty()) return QString();
/* cache */
- if ( m_prevConvMode == mode && m_prevConvURL == url.prettyURL() ) {
+ if (m_prevConvMode == mode && m_prevConvUrl == url.prettyUrl()) {
refstr = m_prevConvRefstr;
- return m_prevConvNewURL;
+ return m_prevConvNewUrl;
}
/* Is board enrolled ? */
- BoardData* bdata = Kita::BoardManager::getBoardData( url );
- if ( bdata == NULL ) return QString::null;
+ BoardData* bdata = BoardManager::getBoardData(url);
+ if (bdata == 0) return QString();
- QString urlstr = url.prettyURL();
+ QString urlstr = url.prettyUrl();
/* get thread & reference */
- QString thread = QString::null;
- QString refBase = QString::null;;
+ QString thread;
+ QString refBase;
- if ( urlstr.contains( "/dat/" ) ) {
+ if (urlstr.contains("/dat/")) {
/* url = (hostname)/(rootPath)/(bbsPath)/dat/(thread_ID).(ext)#(refBase) */
- thread = url.filename().remove( bdata->ext() );
+ thread = url.fileName().remove(bdata->ext());
refBase = url.ref();
- } else if ( urlstr.contains( bdata->delimiter() ) ) {
+ } else if (urlstr.contains(bdata->delimiter())) {
QString tmpstr;
- switch ( bdata->type() ) {
+ switch (bdata->type()) {
/* machi BBS */
/* ex.) If url = http://kanto.machi.to/bbs/read.pl?BBS=kana&KEY=1096716679 ,
then, thread = 1096716679 */
case Board_MachiBBS:
- thread = url.queryItem( "KEY" );
- refBase = QString::null;
+ thread = url.queryItem("KEY");
+ refBase.clear();
break;
/* url = (hostname)/(rootPath)/(delimiter)/(bbsPath)/(thread_ID)/(refBase) */
default:
- tmpstr = urlstr.section( bdata->delimiter() + bdata->bbsPath(), 1, 1 );
- thread = tmpstr.section( '/', 1, 1 );
- refBase = tmpstr.section( '/', 2, 2 );
+ tmpstr = urlstr.section(bdata->delimiter() + bdata->bbsPath(), 1, 1);
+ thread = tmpstr.section('/', 1, 1);
+ refBase = tmpstr.section('/', 2, 2);
break;
}
}
- if ( thread == QString::null ) return QString::null;
+ if (thread.isEmpty()) return QString();
- if ( refBase != QString::null ) {
+ if (!refBase.isEmpty()) {
- if ( refBase.at( 0 ) == '-' ) refstr = "1" + refBase;
+ if (refBase.at(0) == '-') refstr = '1' + refBase;
else refstr = refBase;
}
/* create new URL */
- QString newURL;
- if ( mode == URLMODE_DAT ) newURL = bdata->basePath() + "dat/" + thread + bdata->ext();
+ QString newUrl;
+ if (mode == URLMODE_DAT) newUrl = bdata->basePath() + "dat/" + thread + bdata->ext();
else {
- newURL = bdata->cgiBasePath();
+ newUrl = bdata->cgiBasePath();
- switch ( bdata->type() ) {
+ switch (bdata->type()) {
case Board_MachiBBS:
- newURL += "&KEY=" + thread;
+ newUrl += "&KEY=" + thread;
break;
default:
- newURL += thread;
+ newUrl += thread;
break;
}
}
/* cache */
m_prevConvMode = mode;
- m_prevConvURL = url.prettyURL();
- m_prevConvNewURL = newURL;
+ m_prevConvUrl = url.prettyUrl();
+ m_prevConvNewUrl = newUrl;
m_prevConvRefstr = refstr;
- return newURL;
+ return newUrl;
}
* http://pc5.2ch.net/linux/dat/1089905503.dat
* -> http://pc5.2ch.net/test/offlaw.cgi?bbs=linux&key=1089905503
*/
-QString Kita::datToOfflaw( const KURL& datURL )
+QString Kita::datToOfflaw(const KUrl& datUrl)
{
/* TODO: not tested. */
- KURL url( datURL );
+ KUrl url(datUrl);
QString root = url.host();
- QStringList list = QStringList::split( ".", url.fileName() );
- if ( list.size() != 2 ) {
- return QString::null;
+ QStringList list = url.fileName().split('.');
+ if (list.size() != 2) {
+ return QString();
}
QString datName = list[ 0 ];
- url.cd( ".." );
- if ( url.fileName() != "dat" ) {
- return QString::null;
+ url.cd("..");
+ if (url.fileName() != "dat") {
+ return QString();
}
- url.cd( ".." );
+ url.cd("..");
QString board = url.fileName();
- return QString( "http://%1/test/offlaw.cgi?raw=0.0&bbs=%2&key=%3" ).arg( root ).arg( board ).arg( datName );
+ return QString("http://%1/test/offlaw.cgi?raw=0.0&bbs=%2&key=%3").arg(root).arg(board).arg(datName);
}
/* utilities */
-/* create directory recursively */
-bool Kita::mkdir( const QString& targetPath )
+uint Kita::datToSince(const KUrl& datUrl)
{
- QDir qdir( targetPath );
- if ( !qdir.exists() ) {
-
- QStringList pathList = QStringList::split( "/", targetPath );
- QString path = QString::null;
-
- for ( unsigned int i = 0; i < pathList.count(); ++i ) {
-
- path += "/" + pathList[ i ];
-
- qdir = path;
- if ( !qdir.exists() ) {
- if ( !qdir.mkdir( path ) ) return FALSE;
- }
- }
- }
-
- return TRUE;
+ return KUrl(datUrl).fileName().section('.', 0, 0).toInt();
}
-QString Kita::unescape( const QString& str )
-{
- QString ret = str;
- return ret.replace( "<", "<" ).replace( ">", ">" ).replace( "&", "&" );
-}
-
-
-uint Kita::datToSince( const KURL& datURL )
-{
- return KURL( datURL ).fileName().section( '.', 0, 0 ).toInt();
-}
-
-
-/* if cdat == str, return str.length() */
-int Kita::isEqual( const QChar *cdat, const QString& str )
-{
- int i = 0;
- while ( str.at( i ) != '\0' ) {
- if ( *cdat != str.at( i ) ) return 0;
- cdat++;i++;
- }
- return i;
-}
-
/* convert strings to positive number. */
/* if cdat is not number, return -1. */
/* For example, if cdat = "1234", then
ret = 1234. If cdat = "abcd", then
ret = -1. */
-int Kita::stringToPositiveNum( const QChar *cdat, const unsigned int length )
+int Kita::stringToPositiveNum(const QChar *cdat, const unsigned int length)
{
int ret = 0;
- for ( unsigned int i = 0 ; i < length ; i++ ) {
+ for (unsigned int i = 0 ; i < length ; i++) {
unsigned short c = cdat[ i ].unicode();
- if ( ( c < UTF16_0 || c > UTF16_9 ) && ( c < '0' || c > '9' ) ) return -1;
+ if ((c < UTF16_0 || c > UTF16_9) && (c < '0' || c > '9')) return -1;
ret *= 10;
- if ( c >= UTF16_0 ) ret += c - UTF16_0;
+ if (c >= UTF16_0) ret += c - UTF16_0;
else ret += c - '0';
}
/* internal parsing functions */
-QStringList Kita::parseSearchQuery( const QString& input )
+QStringList Kita::parseSearchQuery(const QString& input)
{
- QStringList tmp = QStringList::split( ' ', input );
+ QStringList tmp = input.split(' ');
QStringList ret_list;
- QRegExp truncSpace( "\\s*$" );
+ QRegExp truncSpace("\\s*$");
QStringList::iterator it = tmp.begin();
- for ( ; it != tmp.end(); ++it )
- ret_list += ( *it ).replace( truncSpace, "" );
+ for (; it != tmp.end(); ++it)
+ ret_list += (*it).remove(truncSpace);
return ret_list;
}
/* init parser. Don't forget to call this before parsing. */
void Kita::InitParseMachiBBS()
{
- m_machiSubject = QString::null;
- m_machiLine = QString::null;
+ m_machiSubject.clear();
+ m_machiLine.clear();
}
-QString Kita::ParseMachiBBSOneLine( const QString& inputLine, int& nextNum )
+QString Kita::ParseMachiBBSOneLine(const QString& inputLine, int& nextNum)
{
- QString ret = QString::null;
+ QString ret;
m_machiLine += inputLine;
int num = 0;
- QString name = QString::null;
- QString mail = QString::null;
- QString date = QString::null;
- QString time = QString::null;
- QString id = QString::null;
- QString host = QString::null;
- QString message = QString::null;
+ QString name;
+ QString mail;
+ QString date;
+ QString time;
+ QString id;
+ QString host;
+ QString message;
// Subject
- QRegExp title_regexp( "<title>(.*)</title>" );
+ QRegExp title_regexp("<title>(.*)</title>");
// pattern 1 (tokyo,kanagawa,...)
- QRegExp regexp ( "<dt>(\\d*) .*<font color=\"#......\"><b> (.*) </b></font> .* (..../../..).* (..:..:..) ID:([^<]*)<br><dd>(.*)" );
- QRegExp regexp2( "<dt>(\\d*) .*<a href=\"mailto:(.*)\"><b> (.*) </B></a> .* (..../../..).* (..:..:..) ID:([^<]*)<br><dd>(.*)" );
+ QRegExp regexp ("<dt>(\\d*) .*<font color=\"#......\"><b> (.*) </b></font> .* (..../../..).* (..:..:..) ID:([^<]*)<br><dd>(.*)");
+ QRegExp regexp2("<dt>(\\d*) .*<a href=\"mailto:(.*)\"><b> (.*) </B></a> .* (..../../..).* (..:..:..) ID:([^<]*)<br><dd>(.*)");
// pattern 2 (hokkaido,...)
- QRegExp regexp3( "<dt>(\\d*) .*<font color=\"#......\"><b> (.*) </b></font> .* (..../../..).* (..:..:..) ID:([^<]*) <font size=.>\\[ ([^ ]*) \\]</font><br><dd>(.*)" );
- QRegExp regexp4( "<dt>(\\d*) .*<a href=\"mailto:(.*)\"><b> (.*) </B></a> .* (..../../..).* (..:..:..) ID:([^<]*) <font size=.>\\[ ([^ ]*) \\]</font><br><dd>(.*)" );
+ QRegExp regexp3("<dt>(\\d*) .*<font color=\"#......\"><b> (.*) </b></font> .* (..../../..).* (..:..:..) ID:([^<]*) <font size=.>\\[ ([^ ]*) \\]</font><br><dd>(.*)");
+ QRegExp regexp4("<dt>(\\d*) .*<a href=\"mailto:(.*)\"><b> (.*) </B></a> .* (..../../..).* (..:..:..) ID:([^<]*) <font size=.>\\[ ([^ ]*) \\]</font><br><dd>(.*)");
/* abone */
- QRegExp regexp5( "<dt>(\\d*) .*<br><dd>.*" );
+ QRegExp regexp5("<dt>(\\d*) .*<br><dd>.*");
- if ( regexp.search( m_machiLine ) != -1 ) {
+ if (regexp.indexIn(m_machiLine) != -1) {
- num = regexp.cap( 1 ).toInt();
- name = regexp.cap( 2 );
- date = regexp.cap( 3 );
- time = regexp.cap( 4 );
- id = regexp.cap( 5 );
- message = regexp.cap( 6 );
+ num = regexp.cap(1).toInt();
+ name = regexp.cap(2);
+ date = regexp.cap(3);
+ time = regexp.cap(4);
+ id = regexp.cap(5);
+ message = regexp.cap(6);
- } else if ( regexp2.search( m_machiLine ) != -1 ) {
+ } else if (regexp2.indexIn(m_machiLine) != -1) {
- num = regexp2.cap( 1 ).toInt();
- mail = regexp2.cap( 2 );
- name = regexp2.cap( 3 );
- date = regexp2.cap( 4 );
- time = regexp2.cap( 5 );
- id = regexp2.cap( 6 );
- message = regexp2.cap( 7 );
+ num = regexp2.cap(1).toInt();
+ mail = regexp2.cap(2);
+ name = regexp2.cap(3);
+ date = regexp2.cap(4);
+ time = regexp2.cap(5);
+ id = regexp2.cap(6);
+ message = regexp2.cap(7);
- } else if ( regexp3.search( m_machiLine ) != -1 ) {
+ } else if (regexp3.indexIn(m_machiLine) != -1) {
- num = regexp3.cap( 1 ).toInt();
- name = regexp3.cap( 2 );
- date = regexp3.cap( 3 );
- time = regexp3.cap( 4 );
- id = regexp3.cap( 5 );
- host = regexp3.cap( 6 );
- message = regexp3.cap( 7 );
+ num = regexp3.cap(1).toInt();
+ name = regexp3.cap(2);
+ date = regexp3.cap(3);
+ time = regexp3.cap(4);
+ id = regexp3.cap(5);
+ host = regexp3.cap(6);
+ message = regexp3.cap(7);
- } else if ( regexp4.search( m_machiLine ) != -1 ) {
+ } else if (regexp4.indexIn(m_machiLine) != -1) {
- num = regexp4.cap( 1 ).toInt();
- mail = regexp4.cap( 2 );
- name = regexp4.cap( 3 );
- date = regexp4.cap( 4 );
- time = regexp4.cap( 5 );
- id = regexp4.cap( 6 );
- host = regexp4.cap( 7 );
- message = regexp4.cap( 8 );
+ num = regexp4.cap(1).toInt();
+ mail = regexp4.cap(2);
+ name = regexp4.cap(3);
+ date = regexp4.cap(4);
+ time = regexp4.cap(5);
+ id = regexp4.cap(6);
+ host = regexp4.cap(7);
+ message = regexp4.cap(8);
- } else if ( regexp5.search( m_machiLine ) != -1 ) { /* abone */
+ } else if (regexp5.indexIn(m_machiLine) != -1) { /* abone */
- num = regexp5.cap( 1 ).toInt();
- m_machiLine = QString::null;
- if ( num == nextNum ) return "abone<><><>abone<>";
- else return QString::null;
+ num = regexp5.cap(1).toInt();
+ m_machiLine.clear();
+ if (num == nextNum) return "abone<><><>abone<>";
+ else return QString();
- } else if ( title_regexp.search( m_machiLine ) != -1 ) { /* get title */
+ } else if (title_regexp.indexIn(m_machiLine) != -1) { /* get title */
- m_machiSubject = title_regexp.cap( 1 );
- m_machiLine = QString::null;
- return QString::null;
+ m_machiSubject = title_regexp.cap(1);
+ m_machiLine.clear();
+ return QString();
}
- else return QString::null;
+ else return QString();
- if ( num >= nextNum ) {
+ if (num >= nextNum) {
- if ( num != 1 ) m_machiSubject = QString::null;
- ret += name + "<><>" + date + " " + time + " ID:" + id;
- if ( host != QString::null ) ret += " HOST:" + host;
+ if (num != 1) m_machiSubject.clear();
+ ret += name + "<><>" + date + ' ' + time + " ID:" + id;
+ if (!host.isEmpty()) ret += " HOST:" + host;
ret += "<>" + message + "<>" + m_machiSubject;
nextNum = num;
}
- m_machiLine = QString::null;
+ m_machiLine.clear();
return ret;
}
/* for JBBS */
-QString Kita::ParseJBBSOneLine( const QString& line, int& nextNum )
+QString Kita::ParseJBBSOneLine(const QString& line, int& nextNum)
{
- QString ret = QString::null;
- QStringList list = QStringList::split( "<>", line, TRUE );
- if ( list.size() != 7 ) return QString::null;
+ QString ret;
+ QStringList list = line.split("<>");
+ if (list.size() != 7) return QString();
int num = list[ 0 ].toInt();
QString name = list[ 1 ];
QString subject = list[ 5 ];
QString id = list[ 6 ];
- if ( num < nextNum ) return QString::null;
+ if (num < nextNum) return QString();
/* remove tag */
- QRegExp rex( "<[^<]*>" );
- name.remove( rex );
+ QRegExp rex("<[^<]*>");
+ name.remove(rex);
/* remove week */
- rex = QRegExp( "\\(.*\\)" );
- date.remove( rex );
+ rex = QRegExp("\\(.*\\)");
+ date.remove(rex);
ret += name + "<>" + mail + "<>" + date + " ID:" + id + "<>" + body + "<>" + subject;
nextNum = num;
/* for Flash CGI/Mini Thread */
-QString Kita::ParseFlashCGIOneLine( const QString& line )
+QString Kita::ParseFlashCGIOneLine(const QString& line)
{
- QString ret = QString::null;
- QStringList list = QStringList::split( "<>", line, TRUE );
- if ( list.size() != 13 ) return QString::null;
+ QString ret;
+ QStringList list = line.split("<>");
+ if (list.size() != 13) return QString();
QString name = list[ 0 ];
QString mail = list[ 1 ];
QString host = list[ 7 ];
/* remove tag */
- QRegExp rex( "<[^<]*>" );
- name.remove( rex );
+ QRegExp rex("<[^<]*>");
+ name.remove(rex);
ret += name + "<>" + mail + "<>" + date + " ID:" + id;
- if ( host != QString::null ) ret += " HOST:" + host;
+ if (!host.isEmpty()) ret += " HOST:" + host;
ret += "<>" + body + "<>" + subject;
return ret;
/*-------------------------------------------------*/
/*-------------------------------------------------*/
-
-/* Main Parser */
-
-/*
- struct RESDAT is defined in datinfo.h.
- This function is called from Kita::DatToHtml() and DatInfo::parseDat()
-
- input:
-
- resdat.num ... number
- resdat.linestr ... raw line strings
-
- output:
-
- resdat.*
- subject
-*/
-bool Kita::parseResDat( RESDAT& resdat, QString& subject )
-{
- if ( resdat.parsed ) return TRUE;
-
- resdat.parsed = TRUE;
- resdat.broken = FALSE;
- resdat.anclist.clear();
-
- /* search the staring positions of each section to split raw data. */
- const QChar *chpt = resdat.linestr.unicode();
- unsigned int length = resdat.linestr.length();
- unsigned int section = 0;
- unsigned int sectionPos[ 5 ];
- for ( unsigned int i = 0 ; i < length ; i++ ) {
-
- /* sections are splitted by "<>" */
- if ( chpt[ i ] == '<' && chpt[ i + 1 ] == '>' ) {
- section++;
-
-
- if ( section >= 5 ) {
- resdat.broken = TRUE;
- return TRUE;
- }
-
- sectionPos[ section ] = i + 2;
- i++;
- }
- }
-
- /* broken data */
- if ( section != 4 ) {
- resdat.broken = TRUE;
- return TRUE;
- }
-
- // qDebug("[%d] %d %d %d %d",section, sectionPos[1],sectionPos[2],sectionPos[3],sectionPos[4] );
-
- /* name */
- length = sectionPos[ 1 ] - 2 ;
- parseName( resdat.linestr.mid( 0, length ), resdat );
-
- /* mail */
- length = sectionPos[ 2 ] - 2 - sectionPos[ 1 ];
- DatToText( resdat.linestr.mid( sectionPos[ 1 ], length ), resdat.address );
-
- /* date, ID, host */
- length = sectionPos[ 3 ] - 2 - sectionPos[ 2 ];
- parseDateId( resdat.linestr.mid( sectionPos[ 2 ], length ), resdat );
-
- /* body */
- length = sectionPos[ 4 ] - 2 - sectionPos[ 3 ];
- parseBody( resdat.linestr.mid( sectionPos[ 3 ], length ), resdat );
-
- /* subject */
- subject = resdat.linestr.mid( sectionPos[ 4 ] );
-
- return TRUE;
-}
-
-
-/* parse name */
-
-/* output:
-
- resdat.name
- resdat.nameHTML
-
-*/
-void Kita::parseName( const QString& rawStr, RESDAT& resdat )
-{
- unsigned int i = 0, pos;
- int refNum[ 2 ];
- QString linkurl, linkstr;
-
- DatToText( rawStr, resdat.name );
-
- const QChar * chpt = resdat.name.unicode();
- unsigned int length = resdat.name.length();
- resdat.nameHTML = QString::null;
-
- /* anchor */
- while ( parseResAnchor( chpt + i, length - i, linkstr, refNum, pos ) ) {
-
- linkurl = QString( "#%1" ).arg( refNum[ 0 ] );
- if ( refNum[ 1 ] ) linkurl += QString( "-%1" ).arg( refNum[ 1 ] );
-
- resdat.nameHTML += "<a href=\"" + linkurl + "\">";
- resdat.nameHTML += linkstr;
- resdat.nameHTML += "</a>";
-
- ANCNUM anctmp;
- if ( refNum[ 1 ] < refNum[ 0 ] ) refNum[ 1 ] = refNum[ 0 ];
- anctmp.from = refNum[ 0 ];
- anctmp.to = refNum[ 1 ];
- resdat.anclist += anctmp;
-
- i += pos;
- }
-
- /* non-digits strings */
- if ( i < length ) {
-
- resdat.nameHTML += "<span class=\"name_noaddr\">";
- resdat.nameHTML += resdat.name.mid( i );
- resdat.nameHTML += "</span>";
- }
-
-}
-
-
-/* parse date, ID, host */
-
-/* output :
-
- resdat.dateTime
- resdat.date
- resdat.id
- resdat.host
-
-*/
-void Kita::parseDateId( const QString& rawStr, RESDAT& resdat )
-{
- resdat.date = rawStr;
- resdat.id = QString::null;
- resdat.host = QString::null;
- resdat.be = QString::null;
- resdat.bepointmark = QString::null;
-
- const QChar *chpt = rawStr.unicode();
- unsigned int pos = 0, startpos = 0;
- unsigned int length = rawStr.length();
-
- while ( chpt[ pos ] != '\0' &&
- !( chpt[ pos ] == 'I' && chpt[ pos + 1 ] == 'D' ) &&
- !( chpt[ pos ] == 'B' && chpt[ pos + 1 ] == 'E' ) ) {
- pos++;
- }
- resdat.date = rawStr.left( pos );
-
- /* id */
- if ( chpt[ pos ] == 'I' && chpt[ pos + 1 ] == 'D' ) {
- pos += 3;
- startpos = pos;
- while ( chpt[ pos ] != ' ' && pos++ < length );
- resdat.id = rawStr.mid( startpos, pos - startpos );
- pos++;
- }
-
- // qDebug("date %s, ID %s", (const char*)resdat.date.local8Bit(), resdat.id.ascii() );
-
- if ( pos >= length ) return ;
-
- /* be */
- if ( chpt[ pos ] == 'B' && chpt[ pos + 1 ] == 'E' ) {
- pos += 3;
- startpos = pos;
- while ( chpt[ pos ] != '-' && pos++ < length );
- resdat.be = rawStr.mid( startpos, pos - startpos );
- pos++;
- if ( pos < length && chpt[ pos ] == '#') {
- startpos = pos;
- while ( chpt[ pos ] == '#' && pos++ < length );
- resdat.bepointmark = rawStr.mid( startpos, pos - startpos );
- }
- }
-
- if ( pos >= length ) return ;
-
- /* host */
- if ( chpt[ pos ] == 'H' && chpt[ pos + 1 ] == 'O' ) {
- pos += 5;
- startpos = pos;
- while ( chpt[ pos ] != ' ' && pos++ < length );
- resdat.host = rawStr.mid( startpos, pos - startpos );
- pos++;
- // qDebug("host %s", resdat.host.ascii());
- }
-}
-
-
-
-/* parse body */
-
-/* output :
-
- resdat.bodyHTML
-
-*/
-void Kita::parseBody( const QString &rawStr, RESDAT& resdat )
-{
- resdat.bodyHTML = QString::null;
-
- unsigned int startPos, pos;
- QString linkstr, linkurl;
- const QChar *chpt = rawStr.unicode();
- unsigned int length = rawStr.length();
-
- bool ancChain = FALSE;
-
- /* ancChain is chain for anchor. For examle, if anchor ">2"
- appeared, ancChain is set to TRUE. Moreover, if next strings
- are "=5", anchor for 5 is also set. Thus, we can obtain anchors
- for strings ">2=5" as follows:
-
- <a href="#2">>2</a><a href="#5">=5</a>
- */
-
- int offset = 0;
- if ( chpt[ 0 ] == ' ' ) offset = 1; /* remove one space after <> */
- for ( unsigned int i = startPos = offset ; i < length ; i++ ) {
-
- switch ( chpt[ i ].unicode() ) {
-
- case '<':
-
- /* " <br> " */
- if ( chpt[ i + 1 ] == 'b' && chpt[ i + 2 ] == 'r' && chpt[ i + 3 ] == '>' ) {
-
- /* reset anchor chain */
- ancChain = FALSE;
-
- unsigned int i2 = i - startPos;
- if ( i > 0 && chpt[ i - 1 ] == ' ' ) i2--; /* remove space before <br> */
- resdat.bodyHTML += rawStr.mid( startPos, i2 );
-
- resdat.bodyHTML += "<br>";
-
- startPos = i + 4;
- if ( chpt[ startPos ] == ' ' ) startPos++; /* remove space after <br> */
- i = startPos - 1;
- }
-
- /*----------------------------------------*/
-
- /* remove HTML tags <[^>]*> */
- else {
-
- if ( i - startPos ) resdat.bodyHTML += rawStr.mid( startPos, i - startPos );
- while ( chpt[ i ] != '>' && i < length ) i++;
- startPos = i + 1;
- }
-
- break;
-
- /*----------------------------------------*/
-
- case 'h': /* "http://" or "ttp://" or "tp:" */
- case 't':
-
- if ( parseLink( chpt + i, length - i, linkstr, linkurl, pos ) ) {
-
- resdat.bodyHTML += rawStr.mid( startPos, i - startPos );
- resdat.bodyHTML += "<a href=\"" + linkurl + "\">";
- resdat.bodyHTML += linkstr;
- resdat.bodyHTML += "</a>";
-
- startPos = i + pos;
- i = startPos - 1;
- }
-
- break;
-
- /*----------------------------------*/
-
- case '&':
-
- /* > */
- if ( chpt[ i + 1 ] == 'g' && chpt[ i + 2 ] == 't' && chpt[ i + 3 ] == ';' )
- ancChain = createResAnchor( rawStr, resdat, chpt, i, startPos );
-
- break;
-
- /*----------------------------------------*/
-
- /* unicode '>' */
- case UTF16_BRACKET:
-
- ancChain = createResAnchor( rawStr, resdat, chpt, i, startPos );
- break;
-
- /*----------------------------------*/
-
- default:
-
- if ( ancChain ) ancChain = createResAnchor( rawStr, resdat, chpt, i, startPos );
- }
- }
-
- resdat.bodyHTML += rawStr.mid( startPos );
-}
-
-
-
-/* parsing function for link */
-
-/* For example,
-
- cdat = "ttp://foo.com",
-
- then
-
- linkstr = "ttp://foo.com",
- linkurl = "http://foo.com",
- pos (= length of cdat) = 13,
-
- and return TRUE.
- */
-bool Kita::parseLink(
-
- /* input */
- const QChar *cdat, const unsigned int length,
-
- /* output */
- QString& linkstr, QString& linkurl, unsigned int& pos
-)
-{
-
- /*-----------------------------*/
-
- linkstr = QString::null;
- linkurl = QString::null;
-
- QString retlinkstr = QString::null;
- QString prefix = QString::null;
- QString scheme = QString::null;
-
- if ( isEqual( cdat , "http://" ) ) {
- prefix = "http://";
- scheme = "http://";
- } else if ( isEqual( cdat , "ttp://" ) ) {
- prefix = "ttp://";
- scheme = "http://";
- } else if ( isEqual( cdat , "tp://" ) ) {
- prefix = "tp://";
- scheme = "http://";
- } else if ( isEqual( cdat , "https://" ) ) {
- prefix = "https://";
- scheme = "https://";
- } else if ( isEqual( cdat , "ttps://" ) ) {
- prefix = "ttps://";
- scheme = "https://";
- } else if ( isEqual( cdat , "tps://" ) ) {
- prefix = "tps://";
- scheme = "https://";
- } else {
- return FALSE;
- }
-
- pos = prefix.length();
- while ( cdat[ pos ] >= '!' && cdat[ pos ] <= '~' &&
- cdat[ pos ] != ' ' && cdat[ pos ] != '<' && cdat[ pos ] != '>'
- && pos < length ) {
- retlinkstr += cdat[ pos++ ];
- }
- if ( pos > length ) return FALSE;
-
- if ( retlinkstr != QString::null ) DatToText( retlinkstr, linkstr );
-
- linkurl = scheme + linkstr;
- linkstr = prefix + linkstr;
-
- return TRUE;
-}
-
-
-
-/* parsing function for anchor (>>digits) */
-
-/* This fuction parses res anchor.
-
- For example, if cdat = ">12-20", then
-
- linkstr = ">12-20",
- refNum[0] = 12,
- refNum[1] = 20,
- pos (= length of cdat ) = 9,
- ret = TRUE;
-
-*/
-bool Kita::parseResAnchor(
-
- /* input */
- const QChar *cdat, const unsigned int length,
-
- /* output */
- QString& linkstr, int* refNum, unsigned int& pos )
-{
-
- struct LocalFunc {
- static bool isHYPHEN( unsigned short c )
- {
-
- /* UTF-16 */
- if ( c == '-'
- || ( c >= 0x2010 && c <= 0x2015 )
- || ( c == 0x2212 )
- || ( c == 0xFF0D ) /* UTF8: 0xEFBC8D */
- ) {
- return TRUE;
- }
-
- return FALSE;
- }
- };
-
- bool ret = FALSE;
- int i;
-
- if ( length == 0 ) return FALSE;
-
- linkstr = QString::null;
- refNum[ 0 ] = 0;
- refNum[ 1 ] = 0;
- pos = 0;
-
- /* check '>' twice */
- for ( i = 0;i < 2;i++ ) {
-
- if ( cdat[ pos ].unicode() == UTF16_BRACKET ) {
- linkstr += cdat[ pos ];
- pos++;
- } else if ( cdat[ pos ] == '&' && cdat[ pos + 1 ] == 'g' /* > */
- && cdat[ pos + 2 ] == 't' && cdat[ pos + 3 ] == ';' ) {
- linkstr += ">";
- pos += 4;
- }
-
- }
-
- /* check ',' */
- if ( !pos ) {
- if ( cdat[ pos ] == ',' || cdat[ pos ].unicode() == UTF16_COMMA ) {
- linkstr += ",";
- pos ++;
- }
- }
-
- /* check '=' */
- if ( !pos ) {
- if ( cdat[ pos ] == '=' || cdat[ pos ].unicode() == UTF16_EQ ) {
- linkstr += "=";
- pos ++;
- }
- }
-
- /* check digits */
- int hyphen = 0;
-
- for ( i = 0 ; i < KITA_RESDIGIT + 1 && pos < length ; i++, pos++ ) {
-
- unsigned short c = cdat[ pos ].unicode();
-
- if ( ( c < UTF16_0 || c > UTF16_9 )
- && ( c < '0' || c > '9' )
- && ( !LocalFunc::isHYPHEN( c )
- || ( i == 0 && LocalFunc::isHYPHEN( c ) )
- || ( hyphen && LocalFunc::isHYPHEN( c ) ) )
- ) break;
-
- linkstr += cdat[ pos ];
-
- if ( LocalFunc::isHYPHEN( c ) ) {
- hyphen = 1;
- i = -1;
- } else {
- if ( c >= UTF16_0 ) c = '0' + cdat[ pos ].unicode() - UTF16_0;
- refNum[ hyphen ] *= 10;
- refNum[ hyphen ] += c - '0';
- }
-
- ret = TRUE;
- }
-
- return ret;
-}
-
-
-
-/* create res anchor */
-/* This function is called from parseBody internally.
- See also parseBody. */
-bool Kita::createResAnchor( const QString &rawStr, RESDAT& resdat,
- const QChar *chpt, unsigned int &i, unsigned int &startPos )
-{
- QString linkstr, linkurl;
- int refNum[ 2 ];
- unsigned int pos;
- unsigned int length = rawStr.length();
-
- /* parse anchor */
- if ( !parseResAnchor( chpt + i, length - i, linkstr, refNum, pos ) ) {
-
- i += pos - 1;
- return FALSE;
- }
-
- /* create anchor */
- resdat.bodyHTML += rawStr.mid( startPos, i - startPos );
- linkurl = QString( "#%1" ).arg( refNum[ 0 ] );
- if ( refNum[ 1 ] ) linkurl += QString( "-%1" ).arg( refNum[ 1 ] );
-
- resdat.bodyHTML += "<a href=\"" + linkurl + "\">";
- resdat.bodyHTML += linkstr;
- resdat.bodyHTML += "</a>";
-
- /* add anchor to ancList */
- ANCNUM anctmp;
- if ( refNum[ 1 ] < refNum[ 0 ] ) refNum[ 1 ] = refNum[ 0 ];
- anctmp.from = refNum[ 0 ];
- anctmp.to = refNum[ 1 ];
- resdat.anclist += anctmp;
-
- startPos = i + pos;
- i = startPos - 1;
-
- return TRUE;
-}
-
-
-/* create HTML of title.
-
- struct RESDAT resdat should be parsed by parseResDat before calling this function.
-
- output: titleHTML
-
-*/
-void Kita::createTitleHTML( RESDAT& resdat, QString& titleHTML )
-{
- titleHTML = QString::null;
- if ( !resdat.parsed ) return ;
-
- bool showMailAddress = Kita::Config::showMailAddress();
- bool useTableTag = Kita::Config::useStyleSheet();
-
- if ( m_colonstr == QString::null ) {
- m_colonstr = utf8ToUnicode( KITAUTF8_COLON );
- m_colonnamestr = utf8ToUnicode( KITAUTF8_NAME );
- }
-
- if ( useTableTag ) titleHTML += "<table class=\"res_title\"><tr>";
-
- /* res number */
- if ( useTableTag ) titleHTML += "<td class=\"res_title_number\">";
- titleHTML += "<a href=\"#write" + QString().setNum( resdat.num ) + "\">";
- titleHTML += QString().setNum( resdat.num );
- titleHTML += "</a> ";
-
-
- /* name & mail address */
- if ( useTableTag ) titleHTML += "<td class=\"res_title_name\">";
- titleHTML += "<b>" + m_colonnamestr;
-
- /* show name with mail address */
- if ( showMailAddress ) {
-
- titleHTML += resdat.nameHTML;
- if ( resdat.address != QString::null ) titleHTML += " [" + resdat.address + "]";
-
- } else { /* don't show mail address */
-
- if ( resdat.address == QString::null ) {
-
- titleHTML += "<span class=\"name_noaddr\">";
- titleHTML += resdat.name;
- titleHTML += "</span>";
-
- } else {
-
- titleHTML += "<a href=\"mailto:" + resdat.address + "\"";
- titleHTML += " title=\"" + resdat.address + "\">";
- titleHTML += resdat.name;
- titleHTML += "</a>";
- }
- }
-
- titleHTML += "</b> ";
-
- /* date */
- if ( useTableTag ) titleHTML += "<td class=\"res_title_date\">";
- titleHTML += m_colonstr + resdat.date;
- if ( useTableTag ) titleHTML += "</td>";
-
- /* ID */
- if ( resdat.id != QString::null ) {
-
- if ( useTableTag ) titleHTML += "<td class=\"res_title_id\">";
- if ( resdat.id.contains( "???", TRUE ) >= 1 ) titleHTML += " ID:" + resdat.id;
- else titleHTML += " <a href=\"#idpop" + resdat.id + "\">ID</a>" + ":" + resdat.id;
- if ( useTableTag ) titleHTML += "</td>";
- }
-
- /* BE */
- if ( resdat.be != QString::null ) {
-
- if ( useTableTag ) titleHTML += "<td class=\"res_title_be\">";
- titleHTML += " <a href=\"#bepop" + resdat.be + "\">?" + resdat.bepointmark + "</a>";
- if ( useTableTag ) titleHTML += "</td>";
- }
-
- /* host */
- if ( resdat.host != QString::null ) {
-
- if ( useTableTag ) titleHTML += "<td class=\"res_title_host\">";
- titleHTML += " HOST:" + resdat.host;
- if ( useTableTag ) titleHTML += "</td>";
- }
-
- if ( useTableTag ) titleHTML += "</tr></table>";
-}
-
-
-QString Kita::getCategory( const QString& line )
+QString Kita::getCategory(const QString& line)
{
- QRegExp regexp( "<BR><BR><B>(.*)</B><BR>", FALSE );
- if ( regexp.search( line ) != -1 ) {
- return regexp.cap( 1 );
+ QRegExp regexp("<BR><BR><B>(.*)</B><BR>");
+ if (regexp.indexIn(line) != -1) {
+ return regexp.cap(1);
} else {
- return QString::null;
+ return QString();
}
}
-bool Kita::isBoardURL( const QString& url )
+bool Kita::isBoardUrl(const QString& url)
{
- QRegExp url_2ch( "http://.*\\.2ch\\.net/.*" );
- QRegExp url_bbspink( "http://.*\\.bbspink\\.com/.*" );
- QRegExp url_www_2ch( "http://www\\.2ch\\.net/.*" );
- QRegExp url_machibbs( "http://.*\\.machi\\.to/.*" );
+ QRegExp url_2ch("http://.*\\.2ch\\.net/.*");
+ QRegExp url_bbspink("http://.*\\.bbspink\\.com/.*");
+ QRegExp url_www_2ch("http://www\\.2ch\\.net/.*");
+ QRegExp url_machibbs("http://.*\\.machi\\.to/.*");
- if ( url.isEmpty() ) return FALSE;
+ if (url.isEmpty()) return false;
- if ( url_2ch.search( url ) == -1 && url_bbspink.search( url ) == -1
- && url_machibbs.search( url ) == -1 ) return FALSE;
- if ( url_www_2ch.search( url ) != -1 ) return FALSE;
+ if (url_2ch.indexIn(url) == -1 && url_bbspink.indexIn(url) == -1
+ && url_machibbs.indexIn(url) == -1) return false;
+ if (url_www_2ch.indexIn(url) != -1) return false;
- return TRUE;
+ return true;
}
-QString Kita::fontToString( const QFont& font )
+QString Kita::fontToString(const QFont& font)
{
- return font.family() + " " + QString::number( font.pointSize() );
+ return font.family() + ' ' + QString::number(font.pointSize());
}