multiple fixes related to all nodejs features

This commit is contained in:
Martin Rotter 2024-04-25 13:24:52 +02:00
parent 32e8f1f2a0
commit d1b9039bba
12 changed files with 103 additions and 93 deletions

View File

@ -107,7 +107,7 @@ void WebBrowser::createConnections() {
connect(qApp->web()->readability(), &Readability::errorOnHtmlReadabiliting, this, &WebBrowser::readabilityFailed); connect(qApp->web()->readability(), &Readability::errorOnHtmlReadabiliting, this, &WebBrowser::readabilityFailed);
connect(qApp->web()->articleParse(), &ArticleParse::articleParsed, this, &WebBrowser::setFullArticleHtml); connect(qApp->web()->articleParse(), &ArticleParse::articleParsed, this, &WebBrowser::setFullArticleHtml);
connect(qApp->web()->articleParse(), &ArticleParse::errorOnArticlePArsing, this, &WebBrowser::fullArticleFailed); connect(qApp->web()->articleParse(), &ArticleParse::errorOnArticleParsing, this, &WebBrowser::fullArticleFailed);
} }
void WebBrowser::updateUrl(const QUrl& url) { void WebBrowser::updateUrl(const QUrl& url) {
@ -306,13 +306,13 @@ void WebBrowser::newWindowRequested(WebViewer* viewer) {
qApp->mainForm()->tabWidget()->addBrowser(false, false, browser); qApp->mainForm()->tabWidget()->addBrowser(false, false, browser);
} }
void WebBrowser::setReadabledHtml(QObject* sndr, const QString& better_html) { void WebBrowser::setReadabledHtml(const QObject* sndr, const QString& better_html) {
if (sndr == this && !better_html.isEmpty()) { if (sndr == this && !better_html.isEmpty()) {
m_webView->setReadabledHtml(better_html, m_webView->url()); m_webView->setReadabledHtml(better_html, m_webView->url());
} }
} }
void WebBrowser::readabilityFailed(QObject* sndr, const QString& error) { void WebBrowser::readabilityFailed(const QObject* sndr, const QString& error) {
if (sndr == this && !error.isEmpty()) { if (sndr == this && !error.isEmpty()) {
m_webView->setReadabledHtml(error, m_webView->url()); m_webView->setReadabledHtml(error, m_webView->url());
} }
@ -344,7 +344,7 @@ Message WebBrowser::messageFromExtractor(const QJsonDocument& extracted_data) co
return msg; return msg;
} }
void WebBrowser::setFullArticleHtml(QObject* sndr, const QString& url, const QString& json_answer) { void WebBrowser::setFullArticleHtml(const QObject* sndr, const QString& url, const QString& json_answer) {
if (sndr == this && !json_answer.isEmpty()) { if (sndr == this && !json_answer.isEmpty()) {
QJsonDocument json_doc = QJsonDocument::fromJson(json_answer.toUtf8()); QJsonDocument json_doc = QJsonDocument::fromJson(json_answer.toUtf8());
@ -385,7 +385,7 @@ void WebBrowser::setFullArticleHtml(QObject* sndr, const QString& url, const QSt
} }
} }
void WebBrowser::fullArticleFailed(QObject* sndr, const QString& error) { void WebBrowser::fullArticleFailed(const QObject* sndr, const QString& error) {
if (sndr == this && !error.isEmpty()) { if (sndr == this && !error.isEmpty()) {
m_webView->setReadabledHtml(error, m_webView->url()); m_webView->setReadabledHtml(error, m_webView->url());
} }

View File

@ -76,11 +76,11 @@ class RSSGUARD_DLLSPEC WebBrowser : public TabContent {
void readabilePage(); void readabilePage();
void getFullArticle(); void getFullArticle();
void setReadabledHtml(QObject* sndr, const QString& better_html); void setReadabledHtml(const QObject* sndr, const QString& better_html);
void readabilityFailed(QObject* sndr, const QString& error); void readabilityFailed(const QObject* sndr, const QString& error);
void setFullArticleHtml(QObject* sndr, const QString &url, const QString& json_answer); void setFullArticleHtml(const QObject* sndr, const QString& url, const QString& json_answer);
void fullArticleFailed(QObject* sndr, const QString& error); void fullArticleFailed(const QObject* sndr, const QString& error);
signals: signals:
void windowCloseRequested(); void windowCloseRequested();

View File

@ -1369,19 +1369,25 @@ void Application::fillCmdArgumentsParser(QCommandLineParser& parser) {
QSL("[url-1 ... url-n]")); QSL("[url-1 ... url-n]"));
} }
void Application::onNodeJsPackageUpdateError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) { void Application::onNodeJsPackageUpdateError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
Q_UNUSED(sndr)
qApp->showGuiMessage(Notification::Event::NodePackageFailedToUpdate, qApp->showGuiMessage(Notification::Event::NodePackageFailedToUpdate,
{{}, {tr("Node.js"),
tr("Packages %1 were NOT updated because of error: %2.") tr("Packages were NOT updated because of error: %2. Affected packages:\n%1")
.arg(NodeJs::packagesToString(pkgs), error), .arg(NodeJs::packagesToString(pkgs), error),
QSystemTrayIcon::MessageIcon::Critical}); QSystemTrayIcon::MessageIcon::Critical});
} }
void Application::onNodeJsPackageInstalled(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) { void Application::onNodeJsPackageInstalled(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(sndr)
if (!already_up_to_date) { if (!already_up_to_date) {
qApp->showGuiMessage(Notification::Event::NodePackageUpdated, qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
{{}, {tr("Node.js"),
tr("Packages %1 were updated.").arg(NodeJs::packagesToString(pkgs)), tr("These packages were installed/updated:\n%1").arg(NodeJs::packagesToString(pkgs)),
QSystemTrayIcon::MessageIcon::Information}); QSystemTrayIcon::MessageIcon::Information});
} }
} }

View File

@ -218,8 +218,12 @@ class RSSGUARD_DLLSPEC Application : public SingleApplication {
void loadMessageToFeedAndArticleList(Feed* feed, const Message& message); void loadMessageToFeedAndArticleList(Feed* feed, const Message& message);
void fillCmdArgumentsParser(QCommandLineParser& parser); void fillCmdArgumentsParser(QCommandLineParser& parser);
void onNodeJsPackageUpdateError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error); void onNodeJsPackageUpdateError(const QObject* sndr,
void onNodeJsPackageInstalled(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date); const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error);
void onNodeJsPackageInstalled(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date);
void onCommitData(QSessionManager& manager); void onCommitData(QSessionManager& manager);
void onSaveState(QSessionManager& manager); void onSaveState(QSessionManager& manager);
void onAboutToQuit(); void onAboutToQuit();

View File

@ -110,7 +110,7 @@ NodeJs::PackageStatus NodeJs::packageStatus(const PackageMetadata& pkg) const {
} }
} }
void NodeJs::installUpdatePackages(const QList<PackageMetadata>& pkgs) { void NodeJs::installUpdatePackages(const QObject* sndr, const QList<PackageMetadata>& pkgs) {
QList<PackageMetadata> to_install; QList<PackageMetadata> to_install;
QStringList desc; QStringList desc;
@ -130,19 +130,17 @@ void NodeJs::installUpdatePackages(const QList<PackageMetadata>& pkgs) {
} }
} }
catch (const ApplicationException& ex) { catch (const ApplicationException& ex) {
emit packageError(pkgs, ex.message()); emit packageError(sndr, pkgs, ex.message());
return; return;
} }
} }
if (to_install.isEmpty()) { if (to_install.isEmpty()) {
qDebugNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(desc.join(QL1S(", "))) << "are up-to-date."; qDebugNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(desc.join(QL1S(", "))) << "are up-to-date.";
emit packageInstalledUpdated(sndr, pkgs, true);
emit packageInstalledUpdated(pkgs, true);
} }
else { else {
installPackages(pkgs); installPackages(sndr, pkgs);
} }
} }
@ -150,15 +148,20 @@ QString NodeJs::packagesToString(const QList<PackageMetadata>& pkgs) {
QStringList desc; QStringList desc;
for (const PackageMetadata& mt : pkgs) { for (const PackageMetadata& mt : pkgs) {
desc << QSL("%1@%2").arg(mt.m_name, mt.m_version); desc << QSL("\u2022 %1@%2").arg(mt.m_name, mt.m_version);
} }
return desc.join(QL1S(", ")); return desc.join(QL1S("\n"));
} }
void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) { void NodeJs::installPackages(const QObject* sndr, const QList<PackageMetadata>& pkgs) {
QStringList to_install; QStringList to_install;
qApp->showGuiMessage(Notification::Event::NodePackageUpdated,
GuiMessage(tr("Node.js"),
tr("Some packages are missing and will be installed or updated:\n%1")
.arg(packagesToString(pkgs))));
try { try {
for (const PackageMetadata& mt : pkgs) { for (const PackageMetadata& mt : pkgs) {
to_install.append(QSL("%1@%2").arg(mt.m_name, mt.m_version)); to_install.append(QSL("%1@%2").arg(mt.m_name, mt.m_version));
@ -169,32 +172,31 @@ void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) {
connect(proc, connect(proc,
QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished),
this, this,
[pkgs, this](int exit_code, QProcess::ExitStatus status) { [=](int exit_code, QProcess::ExitStatus status) {
QProcess* sndr = qobject_cast<QProcess*>(sender()); QProcess* proc_sndr = qobject_cast<QProcess*>(sender());
if (exit_code != EXIT_SUCCESS || status == QProcess::ExitStatus::CrashExit) { if (exit_code != EXIT_SUCCESS || status == QProcess::ExitStatus::CrashExit) {
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages" qCriticalNN << LOGSEC_NODEJS << "Error when installing packages\n"
<< QUOTE_W_SPACE_DOT(packagesToString(pkgs)) << packagesToString(pkgs) << "\nExit code:" << QUOTE_W_SPACE_DOT(exit_code)
<< " Exit code:" << QUOTE_W_SPACE_DOT(exit_code) << " Message:" << QUOTE_W_SPACE_DOT(proc_sndr->readAllStandardError());
<< " Message:" << QUOTE_W_SPACE_DOT(sndr->readAllStandardError());
emit packageError(pkgs, sndr->errorString()); emit packageError(sndr, pkgs, proc_sndr->errorString());
} }
else { else {
qDebugNN << LOGSEC_NODEJS << "Installed/updated packages" << QUOTE_W_SPACE(packagesToString(pkgs)); qDebugNN << LOGSEC_NODEJS << "Installed/updated packages" << QUOTE_W_SPACE(packagesToString(pkgs));
emit packageInstalledUpdated(pkgs, false); emit packageInstalledUpdated(sndr, pkgs, false);
} }
}); });
connect(proc, &QProcess::errorOccurred, this, [pkgs, this](QProcess::ProcessError error) { connect(proc, &QProcess::errorOccurred, this, [pkgs, this](QProcess::ProcessError error) {
QProcess* sndr = qobject_cast<QProcess*>(sender()); QProcess* sndr = qobject_cast<QProcess*>(sender());
qCriticalNN << LOGSEC_NODEJS << "Error when installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs)) qCriticalNN << LOGSEC_NODEJS << "Error when installing packages\n"
<< " Message:" << QUOTE_W_SPACE_DOT(error); << packagesToString(pkgs) << "\nMessage:" << QUOTE_W_SPACE_DOT(error);
emit packageError(pkgs, sndr->errorString()); emit packageError(sndr, pkgs, sndr->errorString());
}); });
qDebugNN << LOGSEC_NODEJS << "Installing packages" << QUOTE_W_SPACE_DOT(packagesToString(pkgs)); qDebugNN << LOGSEC_NODEJS << "Installing packages\n" << packagesToString(pkgs);
to_install.prepend(QSL("--production")); to_install.prepend(QSL("--production"));
to_install.prepend(QSL("install")); to_install.prepend(QSL("install"));
@ -208,6 +210,6 @@ void NodeJs::installPackages(const QList<PackageMetadata>& pkgs) {
qCriticalNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(to_install) qCriticalNN << LOGSEC_NODEJS << "Packages" << QUOTE_W_SPACE(to_install)
<< "were not installed, error:" << QUOTE_W_SPACE_DOT(ex.message()); << "were not installed, error:" << QUOTE_W_SPACE_DOT(ex.message());
emit packageError(pkgs, ex.message()); emit packageError(sndr, pkgs, ex.message());
} }
} }

View File

@ -61,15 +61,15 @@ class NodeJs : public QObject {
// If package IS installed but out-of-date, it is updated to desired versions. // If package IS installed but out-of-date, it is updated to desired versions.
// //
// NOTE: https://docs.npmjs.com/cli/v8/commands/npm-install // NOTE: https://docs.npmjs.com/cli/v8/commands/npm-install
void installUpdatePackages(const QList<PackageMetadata>& pkgs); void installUpdatePackages(const QObject* sndr, const QList<PackageMetadata>& pkgs);
void installPackages(const QList<PackageMetadata>& pkgs); void installPackages(const QObject* sndr, const QList<PackageMetadata>& pkgs);
static QString packagesToString(const QList<PackageMetadata>& pkgs); static QString packagesToString(const QList<PackageMetadata>& pkgs);
signals: signals:
void packageError(const QList<PackageMetadata>& pkgs, const QString& error); void packageError(const QObject* sndr, const QList<PackageMetadata>& pkgs, const QString& error);
void packageInstalledUpdated(const QList<PackageMetadata>& pkgs, bool already_up_to_date); void packageInstalledUpdated(const QObject* sndr, const QList<PackageMetadata>& pkgs, bool already_up_to_date);
private: private:
Settings* m_settings; Settings* m_settings;

View File

@ -106,7 +106,7 @@ void AdBlockManager::setEnabled(bool enabled) {
if (m_enabled) { if (m_enabled) {
if (!m_installing) { if (!m_installing) {
m_installing = true; m_installing = true;
qApp->nodejs()->installUpdatePackages({{QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION)}}); qApp->nodejs()->installUpdatePackages(this, {{QSL(CLIQZ_ADBLOCKED_PACKAGE), QSL(CLIQZ_ADBLOCKED_VERSION)}});
} }
} }
else { else {
@ -177,7 +177,9 @@ void AdBlockManager::showDialog() {
AdBlockDialog(qApp->mainFormWidget()).exec(); AdBlockDialog(qApp->mainFormWidget()).exec();
} }
void AdBlockManager::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) { void AdBlockManager::onPackageReady(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(already_up_to_date) Q_UNUSED(already_up_to_date)
bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) { bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
@ -201,7 +203,9 @@ void AdBlockManager::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs,
} }
} }
void AdBlockManager::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) { void AdBlockManager::onPackageError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) { bool concerns_adblock = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
return pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE); return pkg.m_name == QSL(CLIQZ_ADBLOCKED_PACKAGE);
}); });

View File

@ -69,8 +69,8 @@ class AdBlockManager : public QObject {
void processTerminated(); void processTerminated();
private slots: private slots:
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date); void onPackageReady(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error); void onPackageError(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status); void onServerProcessFinished(int exit_code, QProcess::ExitStatus exit_status);
private: private:

View File

@ -19,7 +19,9 @@ ArticleParse::ArticleParse(QObject* parent) : QObject{parent}, m_modulesInstalli
connect(qApp->nodejs(), &NodeJs::packageError, this, &ArticleParse::onPackageError); connect(qApp->nodejs(), &NodeJs::packageError, this, &ArticleParse::onPackageError);
} }
void ArticleParse::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) { void ArticleParse::onPackageReady(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(already_up_to_date) Q_UNUSED(already_up_to_date)
bool concerns_extractor = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) { bool concerns_extractor = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
@ -40,10 +42,12 @@ void ArticleParse::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bo
{true, true, false}); {true, true, false});
// Emit this just to allow the action again for user. // Emit this just to allow the action again for user.
emit articleParsed(nullptr, {}, tr("Packages for article-extractor are installed. You can now use this feature!")); emit errorOnArticleParsing(sndr, tr("Packages for article-extractor are installed. You can now use this feature!"));
} }
void ArticleParse::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) { void ArticleParse::onPackageError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
bool concerns_extractor = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) { bool concerns_extractor = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
return pkg.m_name == QSL(EXTRACTOR_PACKAGE); return pkg.m_name == QSL(EXTRACTOR_PACKAGE);
}); });
@ -61,8 +65,7 @@ void ArticleParse::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, co
{true, true, false}); {true, true, false});
// Emit this just to allow readability again for user. // Emit this just to allow readability again for user.
emit articleParsed(nullptr, emit errorOnArticleParsing(sndr,
{},
tr("Packages for article-extractor are NOT installed. There is error: %1").arg(error)); tr("Packages for article-extractor are NOT installed. There is error: %1").arg(error));
} }
@ -85,15 +88,8 @@ void ArticleParse::parseArticle(QObject* sndr, const QString& url) {
if (!m_modulesInstalling) { if (!m_modulesInstalling) {
// We make sure to update modules. // We make sure to update modules.
m_modulesInstalling = true; m_modulesInstalling = true;
qApp->nodejs()->installUpdatePackages(sndr,
qApp->showGuiMessage(Notification::Event::NodePackageUpdated, {{QSL(EXTRACTOR_PACKAGE), QSL(EXTRACTOR_VERSION)},
{tr("Node.js libraries not installed"),
tr("%1 will now install some needed libraries, this will take only a few seconds. "
"You will be notified when installation is complete.")
.arg(QSL(APP_NAME)),
QSystemTrayIcon::MessageIcon::Warning},
{true, true, false});
qApp->nodejs()->installUpdatePackages({{QSL(EXTRACTOR_PACKAGE), QSL(EXTRACTOR_VERSION)},
{QSL(FETCH_PACKAGE), QSL(FETCH_VERSION)}}); {QSL(FETCH_PACKAGE), QSL(FETCH_VERSION)}});
} }
@ -134,7 +130,7 @@ void ArticleParse::parseArticle(QObject* sndr, const QString& url) {
qApp->nodejs()->runScript(proc, m_scriptFilename, {url}); qApp->nodejs()->runScript(proc, m_scriptFilename, {url});
} }
void ArticleParse::onParsingFinished(QObject* sndr, void ArticleParse::onParsingFinished(const QObject *sndr,
const QString& url, const QString& url,
int exit_code, int exit_code,
QProcess::ExitStatus exit_status) { QProcess::ExitStatus exit_status) {
@ -145,7 +141,7 @@ void ArticleParse::onParsingFinished(QObject* sndr,
} }
else { else {
QString err = QString::fromUtf8(proc->readAllStandardError()); QString err = QString::fromUtf8(proc->readAllStandardError());
emit errorOnArticlePArsing(sndr, err); emit errorOnArticleParsing(sndr, err);
} }
proc->deleteLater(); proc->deleteLater();

View File

@ -17,13 +17,13 @@ class ArticleParse : public QObject {
void parseArticle(QObject* sndr, const QString& url); void parseArticle(QObject* sndr, const QString& url);
private slots: private slots:
void onParsingFinished(QObject* sndr, const QString& url, int exit_code, QProcess::ExitStatus exit_status); void onParsingFinished(const QObject* sndr, const QString& url, int exit_code, QProcess::ExitStatus exit_status);
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date); void onPackageReady(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error); void onPackageError(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
signals: signals:
void articleParsed(QObject* sndr, const QString& url, const QString& better_html); void articleParsed(const QObject* sndr, const QString& url, const QString& better_html);
void errorOnArticlePArsing(QObject* sndr, const QString& error); void errorOnArticleParsing(const QObject* sndr, const QString& error);
private: private:
bool m_modulesInstalling; bool m_modulesInstalling;

View File

@ -19,7 +19,9 @@ Readability::Readability(QObject* parent) : QObject{parent}, m_modulesInstalling
connect(qApp->nodejs(), &NodeJs::packageError, this, &Readability::onPackageError); connect(qApp->nodejs(), &NodeJs::packageError, this, &Readability::onPackageError);
} }
void Readability::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date) { void Readability::onPackageReady(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
bool already_up_to_date) {
Q_UNUSED(already_up_to_date) Q_UNUSED(already_up_to_date)
bool concerns_readability = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) { bool concerns_readability = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
@ -40,10 +42,12 @@ void Readability::onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, boo
{true, true, false}); {true, true, false});
// Emit this just to allow readability again for user. // Emit this just to allow readability again for user.
emit htmlReadabled(nullptr, tr("Packages for reader mode are installed. You can now use reader mode!")); emit errorOnHtmlReadabiliting(sndr, tr("Packages for reader mode are installed. You can now use reader mode!"));
} }
void Readability::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error) { void Readability::onPackageError(const QObject* sndr,
const QList<NodeJs::PackageMetadata>& pkgs,
const QString& error) {
bool concerns_readability = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) { bool concerns_readability = boolinq::from(pkgs).any([](const NodeJs::PackageMetadata& pkg) {
return pkg.m_name == QSL(READABILITY_PACKAGE); return pkg.m_name == QSL(READABILITY_PACKAGE);
}); });
@ -61,29 +65,22 @@ void Readability::onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, con
{true, true, false}); {true, true, false});
// Emit this just to allow readability again for user. // Emit this just to allow readability again for user.
emit htmlReadabled(nullptr, tr("Packages for reader mode are NOT installed. There is error: %1").arg(error)); emit errorOnHtmlReadabiliting(sndr, tr("Packages for reader mode are NOT installed. There is error: %1").arg(error));
} }
void Readability::makeHtmlReadable(QObject* sndr, const QString& html, const QString& base_url) { void Readability::makeHtmlReadable(QObject* sndr, const QString& html, const QString& base_url) {
if (!m_modulesInstalled) { if (!m_modulesInstalled) {
try { try {
NodeJs::PackageStatus stReadability = NodeJs::PackageStatus st_readability =
qApp->nodejs()->packageStatus({QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)}); qApp->nodejs()->packageStatus({QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)});
NodeJs::PackageStatus stJsdom = qApp->nodejs()->packageStatus({QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)}); NodeJs::PackageStatus st_jsdom = qApp->nodejs()->packageStatus({QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)});
if (stReadability != NodeJs::PackageStatus::UpToDate || stJsdom != NodeJs::PackageStatus::UpToDate) { if (st_readability != NodeJs::PackageStatus::UpToDate || st_jsdom != NodeJs::PackageStatus::UpToDate) {
if (!m_modulesInstalling) { if (!m_modulesInstalling) {
// We make sure to update modules. // We make sure to update modules.
m_modulesInstalling = true; m_modulesInstalling = true;
qApp->nodejs()->installUpdatePackages(sndr,
qApp->showGuiMessage(Notification::Event::NodePackageUpdated, {{QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)},
{tr("Node.js libraries not installed"),
tr("%1 will now install some needed libraries, this will take only a few seconds. "
"You will be notified when installation is complete.")
.arg(QSL(APP_NAME)),
QSystemTrayIcon::MessageIcon::Warning},
{true, true, false});
qApp->nodejs()->installUpdatePackages({{QSL(READABILITY_PACKAGE), QSL(READABILITY_VERSION)},
{QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)}}); {QSL(JSDOM_PACKAGE), QSL(JSDOM_VERSION)}});
} }
@ -104,7 +101,8 @@ void Readability::makeHtmlReadable(QObject* sndr, const QString& html, const QSt
qCriticalNN << LOGSEC_CORE << "Failed to check for Node.js package status:" << QUOTE_W_SPACE_DOT(ex.message()); qCriticalNN << LOGSEC_CORE << "Failed to check for Node.js package status:" << QUOTE_W_SPACE_DOT(ex.message());
// Emit this just to allow readability again for user. // Emit this just to allow readability again for user.
emit htmlReadabled(sndr, emit
errorOnHtmlReadabiliting(sndr,
tr("Node.js is not configured properly. Go to \"Settings\" -> \"Node.js\" and check " tr("Node.js is not configured properly. Go to \"Settings\" -> \"Node.js\" and check "
"if your Node.js is properly configured.")); "if your Node.js is properly configured."));
} }

View File

@ -18,12 +18,12 @@ class Readability : public QObject {
private slots: private slots:
void onReadabilityFinished(QObject* sndr, int exit_code, QProcess::ExitStatus exit_status); void onReadabilityFinished(QObject* sndr, int exit_code, QProcess::ExitStatus exit_status);
void onPackageReady(const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date); void onPackageReady(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, bool already_up_to_date);
void onPackageError(const QList<NodeJs::PackageMetadata>& pkgs, const QString& error); void onPackageError(const QObject* sndr, const QList<NodeJs::PackageMetadata>& pkgs, const QString& error);
signals: signals:
void htmlReadabled(QObject* sndr, const QString& better_html); void htmlReadabled(const QObject* sndr, const QString& better_html);
void errorOnHtmlReadabiliting(QObject* sndr, const QString& error); void errorOnHtmlReadabiliting(const QObject* sndr, const QString& error);
private: private:
bool m_modulesInstalling; bool m_modulesInstalling;