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;