Work on filtering dialog. add clang-format to support script beautify.

This commit is contained in:
Martin Rotter 2020-07-02 15:09:46 +02:00
parent e0415a8060
commit c608210e3c
11 changed files with 298 additions and 160 deletions

View File

@ -175,7 +175,10 @@ win32 {
lib.path = $$PREFIX
lib.CONFIG = no_check_exist
INSTALLS += target lib
clng.files = ../../resources/scripts/clang-format/clang-format.exe
clng.path = $$PREFIX
INSTALLS += target lib clng
INSTALL_HEADERS_PREFIX = $$quote($$PREFIX/include/librssguard)
}

Binary file not shown.

View File

@ -4,6 +4,7 @@
#include "core/messagefilter.h"
#include "definitions/definitions.h"
#include "exceptions/filteringexception.h"
#include "miscellaneous/application.h"
#include "services/abstract/cacheforserviceroot.h"
#include "services/abstract/feed.h"
@ -147,23 +148,31 @@ void FeedDownloader::updateOneFeed(Feed* feed) {
tmr.restart();
FilteringAction decision = msg_filter->filterMessage(&filter_engine);
try {
FilteringAction decision = msg_filter->filterMessage(&filter_engine);
qDebug().nospace() << "Running filter script, it took " << tmr.nsecsElapsed() / 1000 << " microseconds.";
qDebug().nospace() << "Running filter script, it took " << tmr.nsecsElapsed() / 1000 << " microseconds.";
switch (decision) {
case FilteringAction::Accept:
switch (decision) {
case FilteringAction::Accept:
// Message is normally accepted, it could be tweaked by the filter.
continue;
// Message is normally accepted, it could be tweaked by the filter.
continue;
case FilteringAction::Ignore:
case FilteringAction::Ignore:
// Remove the message, we do not want it.
msgs.removeAt(i--);
break;
// Remove the message, we do not want it.
msgs.removeAt(i--);
break;
}
}
catch (const FilteringException& ex) {
qCritical("Error when evaluating filtering JS function: '%s'. Accepting message.", qPrintable(ex.message()));
continue;
}
// If we reach this point. Then we ignore the message which is by now
// already removed, go to next message.
break;
}
}

View File

@ -3,6 +3,7 @@
#include "core/messagefilter.h"
#include "core/message.h"
#include "exceptions/filteringexception.h"
#include <QJSEngine>
@ -43,15 +44,19 @@ FilteringAction MessageFilter::filterMessage(QJSEngine* engine) {
QJSValue filter_func = engine->evaluate(m_script);
if (filter_func.isError()) {
qCritical("Error when evaluating script from filter '%d'. Error is: '%s'", id(), qPrintable(filter_func.toString()));
return FilteringAction::Accept;
QJSValue::ErrorType error = filter_func.errorType();
QString message = filter_func.toString();
throw FilteringException(error, message);
}
auto filter_output = engine->evaluate(QSL("filterMessage()"));
if (filter_output.isError()) {
qCritical("Error when calling filtering function '%d'. Error is: '%s'", id(), qPrintable(filter_output.toString()));
return FilteringAction::Accept;
QJSValue::ErrorType error = filter_output.errorType();
QString message = filter_output.toString();
throw FilteringException(error, message);
}
return FilteringAction(filter_output.toInt());

View File

@ -8,7 +8,6 @@
class ApplicationException {
public:
explicit ApplicationException(QString message = QString());
virtual ~ApplicationException() = default;
QString message() const;

View File

@ -0,0 +1,6 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#include "exceptions/filteringexception.h"
FilteringException::FilteringException(QJSValue::ErrorType js_error, QString message)
: ApplicationException(message), m_errorType(js_error) {}

View File

@ -0,0 +1,18 @@
// For license of this file, see <project-root-folder>/LICENSE.md.
#ifndef FILTERINGEXCEPTION_H
#define FILTERINGEXCEPTION_H
#include "exceptions/applicationexception.h"
#include <QJSValue>
class FilteringException : public ApplicationException {
public:
explicit FilteringException(QJSValue::ErrorType js_error, QString message = QString());
private:
QJSValue::ErrorType m_errorType;
};
#endif // FILTERINGEXCEPTION_H

View File

@ -8,7 +8,6 @@
class IOException : public ApplicationException {
public:
explicit IOException(const QString& message = QString());
virtual ~IOException() = default;
};
#endif // IOEXCEPTION_H

View File

@ -6,6 +6,7 @@
#include "gui/dialogs/formmessagefiltersmanager.h"
#include "core/messagefilter.h"
#include "exceptions/filteringexception.h"
#include "gui/guiutilities.h"
#include "miscellaneous/application.h"
#include "miscellaneous/feedreader.h"
@ -38,6 +39,7 @@ FormMessageFiltersManager::FormMessageFiltersManager(FeedReader* reader, const Q
connect(m_ui.m_btnTest, &QPushButton::clicked, this, &FormMessageFiltersManager::testFilter);
initializeTestingMessage();
loadFilter();
}
FormMessageFiltersManager::~FormMessageFiltersManager() {
@ -95,6 +97,12 @@ void FormMessageFiltersManager::loadFilter() {
}
void FormMessageFiltersManager::testFilter() {
// TODO: Add button to beautify JavaScript code, call clang-format and distribute
// it under windows. On other platforms, just try to call and raise messagebox
// error with "install clang-format" if not found.
// then call like this with qt process api.
// echo "script-code" | ./clang-format.exe --assume-filename="script.js" --style="Chromium"
// Perform per-message filtering.
QJSEngine filter_engine;
QSqlDatabase database = qApp->database()->connection(metaObject()->className());
@ -113,8 +121,37 @@ void FormMessageFiltersManager::testFilter() {
msg_obj.setMessage(&msg);
auto* fltr = selectedFilter();
FilteringAction decision = fltr->filterMessage(&filter_engine);
int aa = 5;
try {
FilteringAction decision = fltr->filterMessage(&filter_engine);
m_ui.m_txtErrors->setTextColor(decision == FilteringAction::Accept ? Qt::GlobalColor::darkGreen : Qt::GlobalColor::red);
QString answer = tr("Message will be %1.\n").arg(decision == FilteringAction::Accept
? tr("accepted")
: tr("rejected"));
answer += tr("Output (modified) message is:\n"
" Title = '%1'\n"
" URL = '%2'\n"
" Author = '%3'\n"
" Is read/important = '%4/%5'\n"
" Created on = '%6'\n"
" Contents = '%7'").arg(msg.m_title, msg.m_url, msg.m_author,
msg.m_isRead ? tr("yes") : tr("no"),
msg.m_isImportant ? tr("yes") : tr("no"),
QString::number(msg.m_created.toMSecsSinceEpoch()),
msg.m_contents);
m_ui.m_txtErrors->setPlainText(answer);
}
catch (const FilteringException& ex) {
m_ui.m_txtErrors->setTextColor(Qt::GlobalColor::red);
m_ui.m_txtErrors->setPlainText(tr("JavaScript-based filter contains errors: '%1'.").arg(ex.message()));
}
// See output.
m_ui.m_tcMessage->setCurrentIndex(1);
}
void FormMessageFiltersManager::showFilter(MessageFilter* filter) {
@ -131,6 +168,8 @@ void FormMessageFiltersManager::showFilter(MessageFilter* filter) {
m_ui.m_gbDetails->setEnabled(true);
}
// See message.
m_ui.m_tcMessage->setCurrentIndex(0);
m_loadingFilter = false;
}

View File

@ -50,19 +50,6 @@
</item>
<item row="0" column="1">
<layout class="QFormLayout" name="formLayout_3">
<item row="1" column="0" colspan="2">
<widget class="QTreeView" name="m_treeFeeds">
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
</size>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox"/>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
@ -73,6 +60,54 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox"/>
</item>
<item row="1" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QTreeView" name="m_treeFeeds">
<property name="minimumSize">
<size>
<width>0</width>
<height>150</height>
</size>
</property>
</widget>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QPushButton" name="pushButton">
<property name="text">
<string>&amp;Check all</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="pushButton_2">
<property name="text">
<string>&amp;Uncheck all</string>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</item>
</layout>
</item>
<item row="1" column="0" colspan="2">
@ -147,108 +182,154 @@
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBox_2">
<property name="title">
<string>Sample message</string>
<widget class="QTabWidget" name="m_tcMessage">
<property name="currentIndex">
<number>0</number>
</property>
<layout class="QFormLayout" name="formLayout_2">
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="m_cbSampleRead">
<property name="text">
<string>Read</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="m_cbSampleImportant">
<property name="text">
<string>Important</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Title</string>
</property>
<property name="buddy">
<cstring>m_txtSampleTitle</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="m_txtSampleTitle"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>URL</string>
</property>
<property name="buddy">
<cstring>m_txtSampleUrl</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="m_txtSampleUrl"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Author</string>
</property>
<property name="buddy">
<cstring>m_txtSampleAuthor</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="m_txtSampleAuthor"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Created on</string>
</property>
<property name="buddy">
<cstring>m_txtSampleCreatedOn</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="m_txtSampleCreatedOn"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Contents</string>
</property>
<property name="buddy">
<cstring>m_txtSampleContents</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPlainTextEdit" name="m_txtSampleContents"/>
</item>
</layout>
<widget class="QWidget" name="m_tabSample">
<attribute name="title">
<string>Sample message</string>
</attribute>
<layout class="QFormLayout" name="formLayout_2">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item row="0" column="0" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_4">
<item>
<widget class="QCheckBox" name="m_cbSampleRead">
<property name="text">
<string>Read</string>
</property>
</widget>
</item>
<item>
<widget class="QCheckBox" name="m_cbSampleImportant">
<property name="text">
<string>Important</string>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_4">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_4">
<property name="text">
<string>Title</string>
</property>
<property name="buddy">
<cstring>m_txtSampleTitle</cstring>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLineEdit" name="m_txtSampleTitle"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_6">
<property name="text">
<string>URL</string>
</property>
<property name="buddy">
<cstring>m_txtSampleUrl</cstring>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="m_txtSampleUrl"/>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_7">
<property name="text">
<string>Author</string>
</property>
<property name="buddy">
<cstring>m_txtSampleAuthor</cstring>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLineEdit" name="m_txtSampleAuthor"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_8">
<property name="text">
<string>Created on</string>
</property>
<property name="buddy">
<cstring>m_txtSampleCreatedOn</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QLineEdit" name="m_txtSampleCreatedOn"/>
</item>
<item row="5" column="0">
<widget class="QLabel" name="label_5">
<property name="text">
<string>Contents</string>
</property>
<property name="buddy">
<cstring>m_txtSampleContents</cstring>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QPlainTextEdit" name="m_txtSampleContents"/>
</item>
</layout>
</widget>
<widget class="QWidget" name="m_tabScriptOutput">
<attribute name="title">
<string>Script output</string>
</attribute>
<layout class="QHBoxLayout" name="horizontalLayout_6">
<property name="leftMargin">
<number>3</number>
</property>
<property name="topMargin">
<number>3</number>
</property>
<property name="rightMargin">
<number>3</number>
</property>
<property name="bottomMargin">
<number>3</number>
</property>
<item>
<widget class="QTextEdit" name="m_txtErrors">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
</item>
</layout>
@ -265,7 +346,7 @@
<item>
<widget class="QPushButton" name="m_btnDetailedHelp">
<property name="text">
<string>&amp;Detailed &amp;help</string>
<string>Detailed &amp;help</string>
</property>
</widget>
</item>
@ -284,32 +365,6 @@
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_3">
<property name="text">
<string>Test output</string>
</property>
<property name="buddy">
<cstring>m_txtErrors</cstring>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QPlainTextEdit" name="m_txtErrors">
<property name="enabled">
<bool>false</bool>
</property>
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch>
<verstretch>1</verstretch>
</sizepolicy>
</property>
<property name="readOnly">
<bool>false</bool>
</property>
</widget>
</item>
</layout>
</widget>
</item>
@ -334,10 +389,13 @@
<tabstop>m_btnRemoveSelected</tabstop>
<tabstop>comboBox</tabstop>
<tabstop>m_treeFeeds</tabstop>
<tabstop>pushButton</tabstop>
<tabstop>pushButton_2</tabstop>
<tabstop>m_txtTitle</tabstop>
<tabstop>m_txtScript</tabstop>
<tabstop>m_btnTest</tabstop>
<tabstop>m_btnDetailedHelp</tabstop>
<tabstop>m_tcMessage</tabstop>
<tabstop>m_cbSampleRead</tabstop>
<tabstop>m_cbSampleImportant</tabstop>
<tabstop>m_txtSampleTitle</tabstop>

View File

@ -44,6 +44,7 @@ HEADERS += core/feeddownloader.h \
dynamic-shortcuts/shortcutbutton.h \
dynamic-shortcuts/shortcutcatcher.h \
exceptions/applicationexception.h \
exceptions/filteringexception.h \
exceptions/ioexception.h \
gui/baselineedit.h \
gui/basetoolbar.h \
@ -189,6 +190,7 @@ SOURCES += core/feeddownloader.cpp \
dynamic-shortcuts/shortcutbutton.cpp \
dynamic-shortcuts/shortcutcatcher.cpp \
exceptions/applicationexception.cpp \
exceptions/filteringexception.cpp \
exceptions/ioexception.cpp \
gui/baselineedit.cpp \
gui/basetoolbar.cpp \