KTextAddons

grammalecteresultjob.cpp
1/*
2 SPDX-FileCopyrightText: 2019-2025 Laurent Montel <montel@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#include "grammalecteresultjob.h"
8#include "textgrammarcheck_debug.h"
9
10#include <QFileInfo>
11#include <QTemporaryFile>
12using namespace TextGrammarCheck;
13GrammalecteResultJob::GrammalecteResultJob(QObject *parent)
14 : QObject(parent)
15{
16}
17
18GrammalecteResultJob::~GrammalecteResultJob() = default;
19
20void GrammalecteResultJob::start()
21{
22 if (canStart()) {
23 mProcess = new QProcess(this);
24
25 auto file = new QTemporaryFile(this);
26 file->open();
27 file->setPermissions(QFile::ReadUser);
28 file->write(mText.toUtf8());
29 file->close();
30
31 mProcess->setProgram(mPythonPath);
32 QStringList args;
33 args.reserve(6);
34 args << mGrammarlecteCliPath;
35 if (!mArguments.isEmpty()) {
36 args << QStringLiteral("-on") << mArguments;
37 }
38 args << QStringLiteral("-f") << file->fileName() << QStringLiteral("-j");
39 mProcess->setArguments(args);
40 connect(mProcess, &QProcess::finished, this, &GrammalecteResultJob::slotFinished);
41 connect(mProcess, &QProcess::errorOccurred, this, &GrammalecteResultJob::receivedError);
42 connect(mProcess, &QProcess::readyReadStandardError, this, &GrammalecteResultJob::receivedStdErr);
43 connect(mProcess, &QProcess::readyReadStandardOutput, this, &GrammalecteResultJob::receivedStandardOutput);
44
45 mProcess->start();
46 if (!mProcess->waitForStarted()) {
47 qCWarning(TEXTGRAMMARCHECK_LOG) << "Impossible to start grammarresultjob";
48 Q_EMIT error(ErrorType::Unknown);
50 }
51 } else {
52 if (mErrorType != ErrorType::TextIsEmpty) {
53 Q_EMIT error(mErrorType);
54 }
56 }
57}
58
59void GrammalecteResultJob::receivedStandardOutput()
60{
61 mResult += QString::fromUtf8(mProcess->readAllStandardOutput());
62}
63
64void GrammalecteResultJob::receivedError()
65{
66 mLastError += mProcess->errorString();
67}
68
69void GrammalecteResultJob::receivedStdErr()
70{
71 mLastError += QLatin1StringView(mProcess->readAllStandardError());
72}
73
74void GrammalecteResultJob::slotFinished(int exitCode, QProcess::ExitStatus exitStatus)
75{
76 if (exitStatus != 0 || exitCode != 0) {
77 qCWarning(TEXTGRAMMARCHECK_LOG) << "Error during running GrammarResultJob: " << mLastError;
78 } else {
79 Q_EMIT finished(mResult);
80 }
82}
83
84QStringList GrammalecteResultJob::arguments() const
85{
86 return mArguments;
87}
88
89void GrammalecteResultJob::setArguments(const QStringList &arguments)
90{
91 mArguments = arguments;
92}
93
94QString GrammalecteResultJob::grammarlecteCliPath() const
95{
96 return mGrammarlecteCliPath;
97}
98
99void GrammalecteResultJob::setGrammarlecteCliPath(const QString &grammarlecteCliPath)
100{
101 mGrammarlecteCliPath = grammarlecteCliPath;
102}
103
104QString GrammalecteResultJob::pythonPath() const
105{
106 return mPythonPath;
107}
108
109void GrammalecteResultJob::setPythonPath(const QString &pythonPath)
110{
111 mPythonPath = pythonPath;
112}
113
114static bool hasNotEmptyText(const QString &text)
115{
116 for (int i = 0, total = text.length(); i < total; ++i) {
117 if (!text.at(i).isSpace()) {
118 return true;
119 }
120 }
121 return false;
122}
123
124bool GrammalecteResultJob::canStart()
125{
126 if (!hasNotEmptyText(mText)) {
127 mErrorType = ErrorType::TextIsEmpty;
128 return false;
129 }
130 if (mGrammarlecteCliPath.isEmpty()) {
131 mErrorType = ErrorType::GrammalecteMissing;
132 return false;
133 }
134 if (mPythonPath.isEmpty()) {
135 mErrorType = ErrorType::PythonPathMissing;
136 return false;
137 }
138 if (!QFileInfo::exists(mPythonPath)) {
139 mErrorType = ErrorType::PythonPathNotExist;
140 return false;
141 }
142 if (!QFileInfo::exists(mGrammarlecteCliPath)) {
143 mErrorType = ErrorType::GrammarlectCliNotExist;
144 return false;
145 }
146 return true;
147}
148
149QString GrammalecteResultJob::text() const
150{
151 return mText;
152}
153
154void GrammalecteResultJob::setText(const QString &text)
155{
156 mText = text;
157}
158
159#include "moc_grammalecteresultjob.cpp"
bool isSpace(char32_t ucs4)
bool exists() const const
void reserve(qsizetype size)
Q_EMITQ_EMIT
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void deleteLater()
void errorOccurred(QProcess::ProcessError error)
void finished(int exitCode, QProcess::ExitStatus exitStatus)
void readyReadStandardError()
void readyReadStandardOutput()
const QChar at(qsizetype position) const const
QString fromUtf8(QByteArrayView str)
qsizetype length() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Jan 24 2025 11:49:24 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.