diff options
Diffstat (limited to 'board.cpp')
-rw-r--r-- | board.cpp | 96 |
1 files changed, 85 insertions, 11 deletions
@@ -1,5 +1,4 @@ #include <QtCore/QRegExp> -#include <QtCore/QDateTime> #include <QtCore/QDir> #include <QtCore/QDebug> #include <QtSql/QSqlQuery> @@ -12,6 +11,8 @@ #include "xmlrpcinterface.h" #include "board.h" +const QLatin1String Board::CURRENT_DB_VERSION("testing2"); + Board::Board(const QString& forumUrl, QObject *parent) : QObject(parent), _url(forumUrl), _slug(createSlug(forumUrl)), _db(QSqlDatabase::addDatabase("QSQLITE", _slug)), @@ -22,10 +23,21 @@ Board::Board(const QString& forumUrl, QObject *parent) : if (!_db.open()) { qWarning() << "Could not open database file" << _db.databaseName() << ":" << _db.lastError().text(); + _db.setDatabaseName(QDir::toNativeSeparators(getTempDbPathFor(_slug))); + if (!_db.open()) { + qWarning() << "Could not open temp database file" + << _db.databaseName() << ":" << _db.lastError().text(); + return; // Give up + } + } + if (!checkCompatibleDb()) { + qDebug() << "Database version incompatible, reinitializing"; + eraseDb(); + initializeDb(); } - initializeDb(); fetchConfigIfOutdated(); fetchForumsIfOutdated(); + initializeBbCode(); // TODO This might depend on board config } Board::~Board() @@ -85,17 +97,50 @@ void Board::setConfig(const QString &key, const QString &value) notifyConfigChanged(); } -int Board::rootForumId() const +QString Board::removeHtml(QString text) const { - QSqlQuery query(_db); - query.exec("SELECT forum_id FROM forums WHERE parent_id = -1"); - if (query.next()) { - return query.value(0).toInt(); + static const QRegExp regexp("<[a-zA-Z\\/][^>]*>"); + text.replace(regexp, ""); + return text; +} + +QString Board::removeBbcode(QString text) const +{ + static const QRegExp regexp("\\[[a-zA-Z\\/][^]]*\\]"); + text.replace(regexp, ""); + return text; +} + +QString Board::bbcodeToRichText(QString text) const +{ + typedef QPair<QRegExp, QString> Pair; // Workaround for ',' in Q_FOREACH + foreach (const Pair& pair, _bbcodes) { + text.replace(pair.first, pair.second); + } + + return text; +} + +QString Board::renderHumanDate(const QDateTime &dateTime) +{ + QDate date = dateTime.toLocalTime().date(); + QDate today = QDate::currentDate(); + if (date == today) { + return tr("Today"); + } else if (date.daysTo(today) == 1) { + return tr("Yesterday"); + } else if (date.daysTo(today) < 5) { + return QDate::longDayName(date.dayOfWeek(), QDate::StandaloneFormat); } else { - return -1; + return date.toString(Qt::DefaultLocaleShortDate); } } +QString Board::renderHumanTime(const QDateTime &dateTime) +{ + return dateTime.toLocalTime().time().toString(Qt::DefaultLocaleShortDate); +} + void Board::notifyConfigChanged() { emit configChanged(); @@ -150,6 +195,17 @@ QString Board::getDbPathFor(const QString &slug) return getDbDir() + "/" + slug + ".sqlite"; } +QString Board::getTempDbPathFor(const QString& slug) +{ + return QDir::tempPath() + "/" + slug + ".sqlite"; +} + +bool Board::checkCompatibleDb() +{ + QString version = getConfig("tapasboard_db_version"); + return version == CURRENT_DB_VERSION; +} + bool Board::initializeDb() { QSqlQuery q(_db); @@ -158,16 +214,20 @@ bool Board::initializeDb() return false; } - if (!q.exec("CREATE TABLE IF NOT EXISTS forums (forum_id INTEGER PRIMARY KEY, forum_name TEXT, description TEXT, parent_id INT, logo_url TEXT, new_post BOOL, is_protected BOOL, is_subscribed BOOL, can_subscribe BOOL, url TEXT, sub_only BOOL, sort_index INT UNIQUE)")) { + if (!q.exec("CREATE TABLE IF NOT EXISTS forums (forum_id INTEGER PRIMARY KEY, forum_name TEXT, description TEXT, parent_id INT, logo_url TEXT, new_post BOOL, is_protected BOOL, is_subscribed BOOL, can_subscribe BOOL, url TEXT, sub_only BOOL, sort_index INT)")) { qWarning() << "Could not create forums table:" << q.lastError().text(); return false; } if (!q.exec("CREATE INDEX IF NOT EXISTS forums_parent ON forums (parent_id)")) { - qWarning() << "Could not create forums table:" << q.lastError().text(); + qWarning() << "Could not create forums_parent index:" << q.lastError().text(); + return false; + } + if (!q.exec("CREATE UNIQUE INDEX IF NOT EXISTS forums_order ON forums (sort_index ASC)")) { + qWarning() << "Could not create forums_order index:" << q.lastError().text(); return false; } - if (!q.exec("CREATE TABLE IF NOT EXISTS topics (forum_id INTEGER, topic_id INTEGER PRIMARY KEY, topic_title TEXT, topic_author_id INTEGER, topic_author_name TEXT, is_subscribed BOOL, is_closed BOOL, icon_url TEXT, last_reply_time TEXT, new_post BOOL, last_update_time TEXT)")) { + if (!q.exec("CREATE TABLE IF NOT EXISTS topics (forum_id INTEGER, topic_id INTEGER PRIMARY KEY, topic_title TEXT, topic_author_id INTEGER, topic_author_name TEXT, is_subscribed BOOL, is_closed BOOL, icon_url TEXT, last_reply_time TEXT, reply_number INT, new_post BOOL, last_update_time TEXT)")) { qWarning() << "Could not create topics table:" << q.lastError().text(); return false; } @@ -258,6 +318,20 @@ void Board::executeActionFromQueue() } } +void Board::initializeBbCode() +{ + _bbcodes.clear(); + _bbcodes << qMakePair(QRegExp("\\[(/?[bius])\\]", Qt::CaseInsensitive), QString("<\\1>")); + + _bbcodes << qMakePair(QRegExp("\\[(/?)quote\\]", Qt::CaseInsensitive), QString("<\\1blockquote>")); + + _bbcodes << qMakePair(QRegExp("\\[url\\]([^[]*)\\[/url\\]", Qt::CaseInsensitive), QString("<a href=\"\\1\">\\1</a>")); + _bbcodes << qMakePair(QRegExp("\\[url=([^]]*)\\]", Qt::CaseInsensitive), QString("<a href=\"\\1\">")); + _bbcodes << qMakePair(QRegExp("\\[/url\\]", Qt::CaseInsensitive), QString("</a>")); + + _bbcodes << qMakePair(QRegExp("\n"), QString("<br>")); +} + void Board::fetchConfigIfOutdated() { if (_iface->isAccessible()) { |