summaryrefslogtreecommitdiff
path: root/board.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'board.cpp')
-rw-r--r--board.cpp96
1 files changed, 85 insertions, 11 deletions
diff --git a/board.cpp b/board.cpp
index 4883ebc..3acf03b 100644
--- a/board.cpp
+++ b/board.cpp
@@ -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()) {