From 86361af2d5d6be4e30910da8e2a1d8d26bb3d753 Mon Sep 17 00:00:00 2001 From: Andrea Diamantini Date: Wed, 29 Sep 2010 21:29:44 +0200 Subject: search --> opensearch dir --- src/opensearch/opensearchengine.cpp | 274 ++++++++++++++++++++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 src/opensearch/opensearchengine.cpp (limited to 'src/opensearch/opensearchengine.cpp') diff --git a/src/opensearch/opensearchengine.cpp b/src/opensearch/opensearchengine.cpp new file mode 100644 index 00000000..78e50980 --- /dev/null +++ b/src/opensearch/opensearchengine.cpp @@ -0,0 +1,274 @@ +/* ============================================================ +* +* This file is a part of the rekonq project +* +* Copyright (C) 2009 by Jakub Wieczorek +* Copyright (C) 2009 by Christian Franke +* Copyright (C) 2009 by Fredy Yanardi +* Copyright (C) 2010 by Lionel Chauvin +* Copyright (C) 2010 by Andrea Diamantini +* +* +* 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) version 3 or any later version +* accepted by the membership of KDE e.V. (or its successor approved +* by the membership of KDE e.V.), which shall act as a proxy +* defined in Section 14 of version 3 of the license. +* +* 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, see . +* +* ============================================================ */ + + +// Self Includes +#include "opensearchengine.h" + +// Qt Includes +#include +#include +#include +#include + + +OpenSearchEngine::OpenSearchEngine(QObject *) + : m_scriptEngine(0) +{ +} + + +OpenSearchEngine::~OpenSearchEngine() +{ + if (m_scriptEngine) + { + delete m_scriptEngine; + } +} + + +QString OpenSearchEngine::parseTemplate(const QString &searchTerm, const QString &searchTemplate) +{ + QString result = searchTemplate; + result.replace(QL1S("{count}"), QL1S("20")); + result.replace(QL1S("{startIndex}"), QL1S("0")); + result.replace(QL1S("{startPage}"), QL1S("0")); + // TODO - get setting from KDE + result.replace(QL1S("{language}"), QL1S("en-US")); + result.replace(QL1S("{inputEncoding}"), QL1S("UTF-8")); + result.replace(QL1S("{outputEncoding}"), QL1S("UTF-8")); + result.replace(QL1S("{searchTerms}"), searchTerm); + + return result; +} + + +QString OpenSearchEngine::name() const +{ + return m_name; +} + + +void OpenSearchEngine::setName(const QString &name) +{ + m_name = name; +} + + +QString OpenSearchEngine::description() const +{ + return m_description; +} + + +void OpenSearchEngine::setDescription(const QString &description) +{ + m_description = description; +} + + +QString OpenSearchEngine::searchUrlTemplate() const +{ + return m_searchUrlTemplate; +} + + +void OpenSearchEngine::setSearchUrlTemplate(const QString &searchUrlTemplate) +{ + m_searchUrlTemplate = searchUrlTemplate; +} + + +KUrl OpenSearchEngine::searchUrl(const QString &searchTerm) const +{ + if (m_searchUrlTemplate.isEmpty()) + { + return KUrl(); + } + + KUrl retVal = KUrl::fromEncoded(parseTemplate(searchTerm, m_searchUrlTemplate).toUtf8()); + + QList::const_iterator i; + for ( i = m_searchParameters.constBegin(); i != m_searchParameters.constEnd(); ++i) + { + retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second)); + } + + return retVal; +} + + +bool OpenSearchEngine::providesSuggestions() const +{ + return !m_suggestionsUrlTemplate.isEmpty(); +} + + +QString OpenSearchEngine::suggestionsUrlTemplate() const +{ + return m_suggestionsUrlTemplate; +} + + +void OpenSearchEngine::setSuggestionsUrlTemplate(const QString &suggestionsUrlTemplate) +{ + m_suggestionsUrlTemplate = suggestionsUrlTemplate; +} + + +KUrl OpenSearchEngine::suggestionsUrl(const QString &searchTerm) const +{ + if (m_suggestionsUrlTemplate.isEmpty()) + { + return KUrl(); + } + + KUrl retVal = KUrl::fromEncoded(parseTemplate(searchTerm, m_suggestionsUrlTemplate).toUtf8()); + + QList::const_iterator i; + for( i = m_suggestionsParameters.constBegin(); i != m_suggestionsParameters.constEnd(); ++i) + { + retVal.addQueryItem(i->first, parseTemplate(searchTerm, i->second)); + } + return retVal; +} + + +QList OpenSearchEngine::searchParameters() const +{ + return m_searchParameters; +} + + +void OpenSearchEngine::setSearchParameters(const QList &searchParameters) +{ + m_searchParameters = searchParameters; +} + + +QList OpenSearchEngine::suggestionsParameters() const +{ + return m_suggestionsParameters; +} + + +void OpenSearchEngine::setSuggestionsParameters(const QList &suggestionsParameters) +{ + m_suggestionsParameters = suggestionsParameters; +} + + +QString OpenSearchEngine::imageUrl() const +{ + return m_imageUrl; +} + + +void OpenSearchEngine::setImageUrl(const QString &imageUrl) +{ + m_imageUrl = imageUrl; +} + + +QImage OpenSearchEngine::image() const +{ + return m_image; +} + + +void OpenSearchEngine::setImage(const QImage &image) +{ + m_image = image; +} + + +bool OpenSearchEngine::isValid() const +{ + return (!m_name.isEmpty() && !m_searchUrlTemplate.isEmpty()); +} + + +bool OpenSearchEngine::operator==(const OpenSearchEngine &other) const +{ + return (m_name == other.m_name + && m_description == other.m_description + && m_imageUrl == other.m_imageUrl + && m_searchUrlTemplate == other.m_searchUrlTemplate + && m_suggestionsUrlTemplate == other.m_suggestionsUrlTemplate + && m_searchParameters == other.m_searchParameters + && m_suggestionsParameters == other.m_suggestionsParameters); +} + + +bool OpenSearchEngine::operator<(const OpenSearchEngine &other) const +{ + return (m_name < other.m_name); +} + + +QStringList OpenSearchEngine::parseSuggestion(const QByteArray &resp) +{ + QString response = QString::fromLocal8Bit(resp); + response = response.trimmed(); + + if (response.isEmpty()) + { + return QStringList(); + } + + if ( !response.startsWith(QL1C('[')) + || !response.endsWith(QL1C(']')) + ) + { + return QStringList(); + } + + if (!m_scriptEngine) + { + m_scriptEngine = new QScriptEngine(); + } + + // Evaluate the JSON response using QtScript. + if (!m_scriptEngine->canEvaluate(response)) + { + return QStringList(); + } + + QScriptValue responseParts = m_scriptEngine->evaluate(response); + + if (!responseParts.property(1).isArray()) + { + return QStringList(); + } + + QStringList suggestionsList; + qScriptValueToSequence(responseParts.property(1), suggestionsList); + + return suggestionsList; +} -- cgit v1.2.1