File indexing completed on 2024-05-05 05:51:22

0001 /* This file is part of the KDE project
0002  *
0003  *  SPDX-FileCopyrightText: 2019 Dominik Haumann <dhaumann@kde.org>
0004  *
0005  *  SPDX-License-Identifier: LGPL-2.0-or-later
0006  */
0007 #include "kateexternaltool.h"
0008 
0009 #include "hostprocess.h"
0010 
0011 #include <KConfigGroup>
0012 #include <KLocalizedString>
0013 #include <QStandardPaths>
0014 
0015 namespace
0016 {
0017 QString toString(KateExternalTool::SaveMode saveMode)
0018 {
0019     switch (saveMode) {
0020     case KateExternalTool::SaveMode::None:
0021         return QStringLiteral("None");
0022     case KateExternalTool::SaveMode::CurrentDocument:
0023         return QStringLiteral("CurrentDocument");
0024     case KateExternalTool::SaveMode::AllDocuments:
0025         return QStringLiteral("AllDocuments");
0026     }
0027     Q_ASSERT(false); // you forgot a case above
0028     return QStringLiteral("None");
0029 }
0030 
0031 KateExternalTool::SaveMode toSaveMode(const QString &mode)
0032 {
0033     if (mode == QStringLiteral("None")) {
0034         return KateExternalTool::SaveMode::None;
0035     }
0036     if (mode == QStringLiteral("CurrentDocument")) {
0037         return KateExternalTool::SaveMode::CurrentDocument;
0038     }
0039     if (mode == QStringLiteral("AllDocuments")) {
0040         return KateExternalTool::SaveMode::AllDocuments;
0041     }
0042     return KateExternalTool::SaveMode::None;
0043 }
0044 
0045 QString toString(KateExternalTool::OutputMode outputMode)
0046 {
0047     switch (outputMode) {
0048     case KateExternalTool::OutputMode::Ignore:
0049         return QStringLiteral("Ignore");
0050     case KateExternalTool::OutputMode::InsertAtCursor:
0051         return QStringLiteral("InsertAtCursor");
0052     case KateExternalTool::OutputMode::ReplaceSelectedText:
0053         return QStringLiteral("ReplaceSelectedText");
0054     case KateExternalTool::OutputMode::ReplaceCurrentDocument:
0055         return QStringLiteral("ReplaceCurrentDocument");
0056     case KateExternalTool::OutputMode::AppendToCurrentDocument:
0057         return QStringLiteral("AppendToCurrentDocument");
0058     case KateExternalTool::OutputMode::InsertInNewDocument:
0059         return QStringLiteral("InsertInNewDocument");
0060     case KateExternalTool::OutputMode::CopyToClipboard:
0061         return QStringLiteral("CopyToClipboard");
0062     case KateExternalTool::OutputMode::DisplayInPane:
0063         return QStringLiteral("DisplayInPane");
0064     }
0065     Q_ASSERT(false); // you forgot a case above
0066     return QStringLiteral("Ignore");
0067 }
0068 
0069 KateExternalTool::OutputMode toOutputMode(const QString &mode)
0070 {
0071     if (mode == QStringLiteral("Ignore")) {
0072         return KateExternalTool::OutputMode::Ignore;
0073     }
0074     if (mode == QStringLiteral("InsertAtCursor")) {
0075         return KateExternalTool::OutputMode::InsertAtCursor;
0076     }
0077     if (mode == QStringLiteral("ReplaceSelectedText")) {
0078         return KateExternalTool::OutputMode::ReplaceSelectedText;
0079     }
0080     if (mode == QStringLiteral("ReplaceCurrentDocument")) {
0081         return KateExternalTool::OutputMode::ReplaceCurrentDocument;
0082     }
0083     if (mode == QStringLiteral("AppendToCurrentDocument")) {
0084         return KateExternalTool::OutputMode::AppendToCurrentDocument;
0085     }
0086     if (mode == QStringLiteral("InsertInNewDocument")) {
0087         return KateExternalTool::OutputMode::InsertInNewDocument;
0088     }
0089     if (mode == QStringLiteral("CopyToClipboard")) {
0090         return KateExternalTool::OutputMode::CopyToClipboard;
0091     }
0092     if (mode == QStringLiteral("DisplayInPane")) {
0093         return KateExternalTool::OutputMode::DisplayInPane;
0094     }
0095     return KateExternalTool::OutputMode::Ignore;
0096 }
0097 
0098 KateExternalTool::Trigger toTrigger(const QString &trigger)
0099 {
0100     if (trigger == QStringLiteral("None")) {
0101         return KateExternalTool::Trigger::None;
0102     }
0103     if (trigger == QStringLiteral("BeforeSave")) {
0104         return KateExternalTool::Trigger::BeforeSave;
0105     }
0106     if (trigger == QStringLiteral("AfterSave")) {
0107         return KateExternalTool::Trigger::AfterSave;
0108     }
0109     return KateExternalTool::Trigger::None;
0110 }
0111 
0112 QString toString(KateExternalTool::Trigger trigger)
0113 {
0114     if (trigger == KateExternalTool::Trigger::None) {
0115         return QStringLiteral("None");
0116     }
0117     if (trigger == KateExternalTool::Trigger::BeforeSave) {
0118         return QStringLiteral("BeforeSave");
0119     }
0120     if (trigger == KateExternalTool::Trigger::AfterSave) {
0121         return QStringLiteral("AfterSave");
0122     }
0123     return QStringLiteral("None");
0124 }
0125 }
0126 
0127 bool KateExternalTool::checkExec() const
0128 {
0129     return !safeExecutableName(executable).isEmpty();
0130 }
0131 
0132 bool KateExternalTool::matchesMimetype(const QString &mt) const
0133 {
0134     return mimetypes.contains(mt);
0135 }
0136 
0137 void KateExternalTool::load(const KConfigGroup &cg)
0138 {
0139     category = cg.readEntry("category", "");
0140     name = cg.readEntry("name", "");
0141     icon = cg.readEntry("icon", "");
0142     executable = cg.readEntry("executable", "");
0143     arguments = cg.readEntry("arguments", "");
0144     input = cg.readEntry("input", "");
0145     workingDir = cg.readEntry("workingDir", "");
0146     mimetypes = cg.readEntry("mimetypes", QStringList());
0147     actionName = cg.readEntry("actionName");
0148     cmdname = cg.readEntry("cmdname");
0149     saveMode = toSaveMode(cg.readEntry("save", "None"));
0150     reload = cg.readEntry("reload", false);
0151     outputMode = toOutputMode(cg.readEntry("output", "Ignore"));
0152     trigger = toTrigger(cg.readEntry("trigger", "None"));
0153 
0154     hasexec = executable.contains(QLatin1Char('$')) ? std::nullopt : std::optional<bool>(checkExec());
0155 }
0156 
0157 template<class Value>
0158 static inline void writeEntryMaybe(KConfigGroup &cg, const char *key, const Value &value)
0159 {
0160     if (value.isEmpty()) {
0161         cg.deleteEntry(key);
0162     } else {
0163         cg.writeEntry(key, value);
0164     }
0165 }
0166 
0167 void KateExternalTool::save(KConfigGroup &cg) const
0168 {
0169     writeEntryMaybe(cg, "category", category);
0170     writeEntryMaybe(cg, "name", name);
0171     writeEntryMaybe(cg, "icon", icon);
0172     writeEntryMaybe(cg, "executable", executable);
0173     writeEntryMaybe(cg, "arguments", arguments);
0174     writeEntryMaybe(cg, "input", input);
0175     writeEntryMaybe(cg, "workingDir", workingDir);
0176     writeEntryMaybe(cg, "mimetypes", mimetypes);
0177     writeEntryMaybe(cg, "actionName", actionName);
0178     writeEntryMaybe(cg, "cmdname", cmdname);
0179     writeEntryMaybe(cg, "save", toString(saveMode));
0180     writeEntryMaybe(cg, "output", toString(outputMode));
0181     writeEntryMaybe(cg, "trigger", toString(trigger));
0182 
0183     // a logical value is never empty
0184     cg.writeEntry("reload", reload);
0185 }
0186 
0187 QString KateExternalTool::translatedName() const
0188 {
0189     return name.isEmpty() ? QString() : i18nc("External tool name", name.toUtf8().data());
0190 }
0191 
0192 QString KateExternalTool::translatedCategory() const
0193 {
0194     return category.isEmpty() ? QString() : i18nc("External tool category", category.toUtf8().data());
0195 }
0196 
0197 bool operator==(const KateExternalTool &lhs, const KateExternalTool &rhs)
0198 {
0199     return lhs.category == rhs.category && lhs.name == rhs.name && lhs.icon == rhs.icon && lhs.executable == rhs.executable && lhs.arguments == rhs.arguments
0200         && lhs.input == rhs.input && lhs.workingDir == rhs.workingDir && lhs.mimetypes == rhs.mimetypes && lhs.actionName == rhs.actionName
0201         && lhs.cmdname == rhs.cmdname && lhs.saveMode == rhs.saveMode && lhs.reload == rhs.reload && lhs.outputMode == rhs.outputMode
0202         && lhs.trigger == rhs.trigger;
0203 }
0204 
0205 // kate: space-indent on; indent-width 4; replace-tabs on;