diff --git a/runners/CMakeLists.txt b/runners/CMakeLists.txt --- a/runners/CMakeLists.txt +++ b/runners/CMakeLists.txt @@ -1,7 +1,7 @@ add_subdirectory(converter) add_subdirectory(datetime) add_subdirectory(katesessions) -# add_subdirectory(mediawiki) +add_subdirectory(mediawiki) add_subdirectory(spellchecker) add_subdirectory(characters) add_subdirectory(dictionary) diff --git a/runners/mediawiki/CMakeLists.txt b/runners/mediawiki/CMakeLists.txt --- a/runners/mediawiki/CMakeLists.txt +++ b/runners/mediawiki/CMakeLists.txt @@ -1,19 +1,23 @@ +add_definitions(-DTRANSLATION_DOMAIN="plasma_runner_mediawiki") + set(krunner_mediawiki_SRCS mediawikirunner.cpp mediawiki.cpp ) -kde4_add_plugin(krunner_mediawiki ${krunner_mediawiki_SRCS}) -target_link_libraries(krunner_mediawiki ${KDE4_PLASMA_LIBS} ${KDE4_KIO_LIBS} ${KDE4_SOLID_LIBS}) +add_library(krunner_mediawiki MODULE ${krunner_mediawiki_SRCS}) +target_link_libraries(krunner_mediawiki + KF5::Runner + KF5::I18n + Qt5::Network +) -install(TARGETS krunner_mediawiki DESTINATION ${PLUGIN_INSTALL_DIR} ) +install(TARGETS krunner_mediawiki DESTINATION ${KDE_INSTALL_PLUGINDIR} ) install(FILES plasma-runner-wikipedia.desktop plasma-runner-wikitravel.desktop plasma-runner-techbase.desktop - DESTINATION ${SERVICES_INSTALL_DIR}) - -# doesn't seem to work, maybe XML API is disabled -#install(FILES plasma-runner-userbase.desktop DESTINATION ${SERVICES_INSTALL_DIR}) - + plasma-runner-userbase.desktop + DESTINATION ${KDE_INSTALL_KSERVICES5DIR} +) diff --git a/runners/mediawiki/mediawiki.h b/runners/mediawiki/mediawiki.h --- a/runners/mediawiki/mediawiki.h +++ b/runners/mediawiki/mediawiki.h @@ -21,11 +21,13 @@ #ifndef MEDIAWIKI_H #define MEDIAWIKI_H +// Qt #include #include #include class QNetworkReply; +class QIODevice; /** * Searches MediaWiki based wikis like wikipedia and techbase. @@ -69,8 +71,8 @@ * a time. * @param parent The parent object */ - MediaWiki( QObject *parent=0 ); - virtual ~MediaWiki(); + explicit MediaWiki(QObject *parent = nullptr); + ~MediaWiki() override; /** * @returns a list of matches. @@ -108,14 +110,14 @@ */ void setTimeout( int millis ); -signals: +Q_SIGNALS: /** * Emitted when a search has been completed. * @param success true if the search was completed successfully. */ void finished( bool success ); -public slots: +public Q_SLOTS: /** * Search the wiki for the specified search term. */ @@ -126,8 +128,8 @@ */ void abort(); -private slots: - void finished( QNetworkReply *reply ); +private Q_SLOTS: + void onNetworkRequestFinished(QNetworkReply *reply); private: void findBase(); diff --git a/runners/mediawiki/mediawiki.cpp b/runners/mediawiki/mediawiki.cpp --- a/runners/mediawiki/mediawiki.cpp +++ b/runners/mediawiki/mediawiki.cpp @@ -20,16 +20,15 @@ #include "mediawiki.h" +// KF +#include +// Qt #include #include #include #include #include - -#include -#include - -#include +#include enum State { StateApiChanged, @@ -56,16 +55,17 @@ { d->state = StateApiChanged; // should be overwritten by the user - d->apiUrl = QUrl("http://en.wikipedia.org/w/api.php"); + d->apiUrl = QUrl(QStringLiteral("https://en.wikipedia.org/w/api.php")); //FIXME: at the moment KIO doesn't seem to work in threads d->manager = new QNetworkAccessManager( this ); + d->manager->setRedirectPolicy(QNetworkRequest::NoLessSafeRedirectPolicy); //d->manager = new KIO::AccessManager( this ); d->maxItems = 10; d->timeout = 30 * 1000; // 30 second - d->reply = 0; + d->reply = nullptr; d->userAgent = QByteArray("KDE Plasma Silk; MediaWikiRunner; 1.0"); - connect( d->manager, SIGNAL(finished(QNetworkReply*)), SLOT(finished(QNetworkReply*)) ); + connect(d->manager, &QNetworkAccessManager::finished, this, &MediaWiki::onNetworkRequestFinished); } MediaWiki::~MediaWiki() @@ -118,24 +118,26 @@ return; d->reply->abort(); - d->reply = 0; + d->reply = nullptr; } void MediaWiki::search( const QString &searchTerm ) { QUrl url = d->apiUrl; - url.addQueryItem( QString("action"), QString("query") ); - url.addQueryItem( QString("format"), QString("xml") ); - url.addQueryItem( QString("list"), QString("search") ); - url.addQueryItem( QString("srsearch"), searchTerm ); - url.addQueryItem( QString("srlimit"), QString::number(d->maxItems) ); + QUrlQuery urlQuery(url); + urlQuery.addQueryItem(QStringLiteral("action"), QStringLiteral("query")); + urlQuery.addQueryItem(QStringLiteral("format"), QStringLiteral("xml")); + urlQuery.addQueryItem(QStringLiteral("list"), QStringLiteral("search")); + urlQuery.addQueryItem(QStringLiteral("srsearch"), searchTerm ); + urlQuery.addQueryItem(QStringLiteral("srlimit"), QString::number(d->maxItems)); + url.setQuery(urlQuery); - kDebug() << "Constructed search URL" << url; + qDebug() << "Constructed search URL" << url; if ( d->state == StateReady ) { QNetworkRequest req(url); req.setRawHeader( QByteArray("User-Agent"), d->userAgent ); - kDebug() << "mediawiki User-Agent" << req.rawHeader(QByteArray("UserAgent")); + qDebug() << "mediawiki User-Agent" << req.rawHeader(QByteArray("UserAgent")); d->reply = d->manager->get( req ); QTimer::singleShot( d->timeout, this, SLOT(abort()) ); @@ -149,33 +151,35 @@ { // http://en.wikipedia.org/w/api.php?action=query&meta=siteinfo QUrl url = d->apiUrl; - url.addQueryItem( QString("action"), QString("query") ); - url.addQueryItem( QString("format"), QString("xml") ); - url.addQueryItem( QString("meta"), QString("siteinfo") ); + QUrlQuery urlQuery(url); + urlQuery.addQueryItem(QStringLiteral("action"), QStringLiteral("query")); + urlQuery.addQueryItem(QStringLiteral("format"), QStringLiteral("xml")); + urlQuery.addQueryItem(QStringLiteral("meta"), QStringLiteral("siteinfo")); + url.setQuery(urlQuery); - kDebug() << "Constructed base query URL" << url; + qDebug() << "Constructed base query URL" << url; QNetworkRequest req(url); req.setRawHeader( QByteArray("User-Agent"), d->userAgent ); d->reply = d->manager->get( req ); d->state = StateApiUpdating; } -void MediaWiki::finished( QNetworkReply *reply ) +void MediaWiki::onNetworkRequestFinished(QNetworkReply *reply) { if ( reply->error() != QNetworkReply::NoError ) { - kDebug() << "Request failed, " << reply->errorString(); + qDebug() << "Request failed, " << reply->errorString(); emit finished(false); return; } - kDebug() << "Request succeeded" << d->apiUrl; + qDebug() << "Request succeeded" << d->apiUrl; if ( d->state == StateApiUpdating ) { bool ok = processBaseResult( reply ); Q_UNUSED ( ok ); reply->deleteLater(); - reply= 0; + reply= nullptr; d->state = StateReady; QNetworkRequest req(d->query); @@ -187,7 +191,7 @@ emit finished( ok ); d->reply->deleteLater(); - d->reply = 0; + d->reply = nullptr; } } @@ -197,13 +201,13 @@ while ( !reader.atEnd() ) { QXmlStreamReader::TokenType tokenType = reader.readNext(); - // kDebug() << "Token" << int(tokenType); + // qDebug() << "Token" << int(tokenType); if ( tokenType == QXmlStreamReader::StartElement ) { - if ( reader.name() == QString("general") ) { + if (reader.name() == QLatin1String("general")) { QXmlStreamAttributes attrs = reader.attributes(); - d->baseUrl = QUrl( attrs.value( QString("base") ).toString() ); - return true; + d->baseUrl = QUrl(attrs.value(QStringLiteral("base")).toString()); + return true; } } else if ( tokenType == QXmlStreamReader::Invalid ) return false; @@ -219,24 +223,22 @@ QXmlStreamReader reader( source ); while ( !reader.atEnd() ) { QXmlStreamReader::TokenType tokenType = reader.readNext(); - // kDebug() << "Token" << int(tokenType); + // qDebug() << "Token" << int(tokenType); if ( tokenType == QXmlStreamReader::StartElement ) { - if ( reader.name() == QString("p") ) { + if (reader.name() == QLatin1String("p")) { QXmlStreamAttributes attrs = reader.attributes(); - Result r; - r.url = d->baseUrl.resolved( attrs.value( QString("title") ).toString() ); - r.title = attrs.value( QString("title") ).toString(); + Result r; + r.title = attrs.value(QStringLiteral("title")).toString(); + r.url = d->baseUrl.resolved(QUrl(r.title)); - kDebug() << "Got result: url=" << r.url << "title=" << r.title; + qDebug() << "Got result: url=" << r.url << "title=" << r.title; - d->results.prepend( r ); + d->results.prepend( r ); } } else if ( tokenType == QXmlStreamReader::Invalid ) { return false; } } return true; } - - diff --git a/runners/mediawiki/mediawikirunner.h b/runners/mediawiki/mediawikirunner.h --- a/runners/mediawiki/mediawikirunner.h +++ b/runners/mediawiki/mediawikirunner.h @@ -20,37 +20,30 @@ #ifndef MEDIAWIKIRUNNER_H #define MEDIAWIKIRUNNER_H -#include +// KF +#include +// Qt +#include -class KIcon; -#include -#include - -class QWaitCondition; - -#include "mediawiki.h" - -class MediaWikiRunner : public Plasma::AbstractRunner { +class MediaWikiRunner : public Plasma::AbstractRunner +{ Q_OBJECT - public: - MediaWikiRunner( QObject *parent, const QVariantList& args ); - ~MediaWikiRunner(); +public: + MediaWikiRunner(QObject *parent, const QVariantList &args); + ~MediaWikiRunner() override; - void match(Plasma::RunnerContext &context); - void run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match); + void match(Plasma::RunnerContext &context) override; + void run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match) override; - signals: - void done(); +private: + QString m_iconName; + QString m_name; + QString m_comment; + QUrl m_apiUrl; - private: - KIcon m_icon; - QString m_name; - QString m_comment; - QUrl m_apiUrl; + QNetworkConfigurationManager m_networkConfigurationManager; }; -K_EXPORT_PLASMA_RUNNER(mediawiki, MediaWikiRunner) - #endif diff --git a/runners/mediawiki/mediawikirunner.cpp b/runners/mediawiki/mediawikirunner.cpp --- a/runners/mediawiki/mediawikirunner.cpp +++ b/runners/mediawiki/mediawikirunner.cpp @@ -18,45 +18,45 @@ */ #include "mediawikirunner.h" + #include "mediawiki.h" +// KF +#include +#include +#include +// Qt #include -#include +#include #include +#include +#include -#include -#include -#include -#include -#include -#include -MediaWikiRunner::MediaWikiRunner(QObject *parent, const QVariantList& args) +MediaWikiRunner::MediaWikiRunner(QObject *parent, const QVariantList &args) : Plasma::AbstractRunner(parent, args) { - Q_UNUSED(args); - setObjectName("MediaWikiRunner"); + setObjectName(QStringLiteral("MediaWikiRunner")); - const QString constraint = QString("[X-KDE-PluginInfo-Name] == '%1'").arg(id()); - const KService::List offers = KServiceTypeTrader::self()->query("Plasma/Runner", constraint); + const QString constraint = QStringLiteral("[X-KDE-PluginInfo-Name] == '%1'").arg(id()); + const KService::List offers = KServiceTypeTrader::self()->query(QStringLiteral("Plasma/Runner"), constraint); foreach (const KPluginInfo &info, KPluginInfo::fromServices(offers)) { - QStringList _urls = info.property("X-Plasma-Args").toStringList(); - QString _u; - kDebug() << info.name() << info.property("X-Plasma-Args").toStringList() << _urls.count(); + const auto _urls = info.property(QStringLiteral("X-Plasma-Args")).toStringList(); + qDebug() << info.name() << _urls << _urls.count(); if (_urls.count()) { - m_apiUrl = _urls[0]; + m_apiUrl = QUrl(_urls[0]); } else { - kWarning() << "No X-Plasma-Args found in .desktop file"; + qWarning() << "No X-Plasma-Args found in .desktop file"; } m_name = info.name(); m_comment = info.comment(); - m_icon = KIcon(info.icon()); + m_iconName = info.icon(); } - addSyntax(Plasma::RunnerSyntax("wiki :q:", i18n("Searches %1 for :q:.", m_name))); + addSyntax(Plasma::RunnerSyntax(QStringLiteral("wiki :q:"), i18n("Searches %1 for :q:.", m_name))); setSpeed( SlowSpeed ); } @@ -69,20 +69,23 @@ void MediaWikiRunner::match(Plasma::RunnerContext &context) { // Check for networkconnection - if(Solid::Networking::status() == Solid::Networking::Unconnected) { + if (!m_networkConfigurationManager.isOnline() || + !m_apiUrl.isValid()) { return; } QString term = context.query(); + if (!context.singleRunnerQueryMode()) { - if (!term.startsWith("wiki ")) { + if (!term.startsWith(QLatin1String("wiki "))) { return; - } else { - term = term.remove("wiki "); } + + term.remove(0, 5); } - if (!m_apiUrl.isValid() || term.length() < 3) { - //kDebug() << "yours is too short" << term; + + if (term.length() < 3) { + //qDebug() << "yours is too short" << term; return; } @@ -105,10 +108,10 @@ mediawiki.setMaxItems(3); } mediawiki.setApiUrl( m_apiUrl ); - connect( &mediawiki, SIGNAL(finished(bool)), &loop, SLOT(quit()) ); + connect(&mediawiki, &MediaWiki::finished, &loop, &QEventLoop::quit); mediawiki.search(term); - kDebug() << "Wikisearch:" << m_name << term; + qDebug() << "Wikisearch:" << m_name << term; loop.exec(); @@ -119,27 +122,32 @@ qreal stepRelevance = 0.1; foreach(const MediaWiki::Result& res, mediawiki.results()) { - kDebug() << "Match:" << res.url << res.title; + qDebug() << "Match:" << res.url << res.title; Plasma::QueryMatch match(this); match.setType(Plasma::QueryMatch::PossibleMatch); - match.setIcon(m_icon); - match.setText(QString("%1: %2").arg(m_name, res.title)); + match.setIconName(m_iconName); + match.setText(QStringLiteral("%1: %2").arg(m_name, res.title)); match.setData(res.url); match.setRelevance(relevance); relevance +=stepRelevance; stepRelevance *=0.5; - context.addMatch(res.title, match); + context.addMatch(match); } } void MediaWikiRunner::run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &match) { Q_UNUSED(context) + const QString wikiurl = match.data().toUrl().toString(); - kDebug() << "Open MediaWiki page " << wikiurl; + qDebug() << "Open MediaWiki page " << wikiurl; if (!wikiurl.isEmpty()) { - KToolInvocation::invokeBrowser(wikiurl, ""); + QDesktopServices::openUrl(QUrl(wikiurl)); } } + +K_EXPORT_PLASMA_RUNNER(mediawiki, MediaWikiRunner) + +#include "mediawikirunner.moc" diff --git a/runners/mediawiki/plasma-runner-techbase.desktop b/runners/mediawiki/plasma-runner-techbase.desktop --- a/runners/mediawiki/plasma-runner-techbase.desktop +++ b/runners/mediawiki/plasma-runner-techbase.desktop @@ -106,4 +106,4 @@ X-KDE-PluginInfo-License=LGPL X-KDE-PluginInfo-EnabledByDefault=false -X-Plasma-Args=http://techbase.kde.org/api.php +X-Plasma-Args=https://techbase.kde.org/api.php diff --git a/runners/mediawiki/plasma-runner-userbase.desktop b/runners/mediawiki/plasma-runner-userbase.desktop --- a/runners/mediawiki/plasma-runner-userbase.desktop +++ b/runners/mediawiki/plasma-runner-userbase.desktop @@ -110,4 +110,4 @@ X-KDE-PluginInfo-License=LGPL X-KDE-PluginInfo-EnabledByDefault=true -X-Plasma-Args=http://userbase.kde.org/api.php +X-Plasma-Args=https://userbase.kde.org/api.php diff --git a/runners/mediawiki/plasma-runner-wikipedia.desktop b/runners/mediawiki/plasma-runner-wikipedia.desktop --- a/runners/mediawiki/plasma-runner-wikipedia.desktop +++ b/runners/mediawiki/plasma-runner-wikipedia.desktop @@ -115,4 +115,4 @@ X-KDE-PluginInfo-EnabledByDefault=false X-Plasma-AdvertiseSingleRunnerQueryMode=true -X-Plasma-Args=http://en.wikipedia.org/w/api.php +X-Plasma-Args=https://en.wikipedia.org/w/api.php diff --git a/runners/mediawiki/plasma-runner-wikitravel.desktop b/runners/mediawiki/plasma-runner-wikitravel.desktop --- a/runners/mediawiki/plasma-runner-wikitravel.desktop +++ b/runners/mediawiki/plasma-runner-wikitravel.desktop @@ -110,4 +110,4 @@ X-KDE-PluginInfo-License=LGPL X-KDE-PluginInfo-EnabledByDefault=false -X-Plasma-Args=http://wikitravel.org/wiki/en/api.php +X-Plasma-Args=https://wikitravel.org/wiki/en/api.php