1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228
|
/*
SPDX-FileCopyrightText: 2008 Cédric Pasteur <cedric.pasteur@free.fr>
SPDX-License-Identifier: LGPL-2.0-or-later
*/
#include "isourceformatter.h"
#include <KLocalizedString>
#include <QDebug>
#include <QDebugStateSaver>
#include <QVariant>
#include <QMimeType>
#include <algorithm>
namespace KDevelop
{
SettingsWidget::SettingsWidget(QWidget *parent)
: QWidget(parent)
{
}
SettingsWidget::~SettingsWidget()
{
}
ISourceFormatter::~ISourceFormatter()
{
}
QString ISourceFormatter::usageHint() const
{
return QString();
}
SourceFormatterStyle::SourceFormatterStyle()
{
}
SourceFormatterStyle::SourceFormatterStyle(const QString &name)
: m_usePreview(false)
, m_name(name)
{
}
void SourceFormatterStyle::setContent(const QString &content)
{
m_content = content;
}
void SourceFormatterStyle::setCaption(const QString &caption)
{
m_caption = caption;
}
QString SourceFormatterStyle::content() const
{
return m_content;
}
QString SourceFormatterStyle::description() const
{
return m_description;
}
void SourceFormatterStyle::setDescription(const QString &desc)
{
m_description = desc;
}
bool SourceFormatterStyle::usePreview() const
{
return m_usePreview;
}
void SourceFormatterStyle::setUsePreview(bool use)
{
m_usePreview = use;
}
void SourceFormatterStyle::setMimeTypes(const SourceFormatterStyle::MimeList& types)
{
m_mimeTypes = types;
}
void SourceFormatterStyle::setMimeTypes(const QStringList& types)
{
for (auto& t : types) {
auto items = t.split(QLatin1Char('|'));
if (items.size() != 2 || items.at(0).isEmpty() || items.at(1).isEmpty()) {
// An empty MIME type name is invalid and not useful.
// Language names are displayed in a combobox. So an empty language name is unacceptable.
qWarning() << "Skipping invalid Mime/Highlight pair in MimeTypes config entry for"
<< *this << ':' << t;
continue;
}
m_mimeTypes << MimeHighlightPair{items.at(0), items.at(1)};
}
}
void SourceFormatterStyle::setOverrideSample(const QString &sample)
{
m_overrideSample = sample;
}
QString SourceFormatterStyle::overrideSample() const
{
return m_overrideSample;
}
SourceFormatterStyle::MimeList SourceFormatterStyle::mimeTypes() const
{
return m_mimeTypes;
}
QVariant SourceFormatterStyle::mimeTypesVariant() const
{
QStringList result;
result.reserve(m_mimeTypes.size());
for ( const auto& item: m_mimeTypes ) {
result << item.mimeType + QLatin1Char('|') + item.highlightMode;
}
return QVariant::fromValue(result);
}
bool SourceFormatterStyle::supportsLanguage(const QString &language) const
{
for ( const auto& item: m_mimeTypes ) {
if ( item.highlightMode == language ) {
return true;
}
}
return false;
}
QString SourceFormatterStyle::modeForMimetype(const QMimeType& mime) const
{
const auto mimeTypes = this->mimeTypes();
for (const auto& item : mimeTypes) {
if (mime.inherits(item.mimeType)) {
return item.highlightMode;
}
}
return QString();
}
void SourceFormatterStyle::copyDataFrom(const SourceFormatterStyle& other)
{
m_usePreview = other.m_usePreview;
m_content = other.m_content;
m_mimeTypes = other.m_mimeTypes;
m_overrideSample = other.m_overrideSample;
}
QDebug operator<<(QDebug dbg, const SourceFormatterStyle& style)
{
QDebugStateSaver saver(dbg);
// For a given formatter, a style is uniquely identified by its name. But style names never appear in
// the UI, only in config files. Style captions feature prominently in the UI. However, multiple styles
// can have equal captions. Print both the name and the caption to allow quick and easy style
// recognition by caption and reliable identification by name.
dbg.nospace() << "SourceFormatterStyle{name=" << style.name() << ", caption=" << style.caption() << '}';
return dbg;
}
SourceFormatterStyle ISourceFormatter::predefinedStyle(const QString& name) const
{
const auto styles = predefinedStyles();
const auto it = std::find_if(styles.cbegin(), styles.cend(), [&name](const SourceFormatterStyle& style) {
return style.name() == name;
});
return it == styles.cend() ? SourceFormatterStyle{name} : *it;
}
QString ISourceFormatter::optionMapToString(const QMap<QString, QVariant> &map)
{
QString options;
QMap<QString, QVariant>::const_iterator it = map.constBegin();
for (; it != map.constEnd(); ++it) {
options += it.key() + QLatin1Char('=') + it.value().toString() + QLatin1Char(',');
}
return options;
}
QMap<QString, QVariant> ISourceFormatter::stringToOptionMap(const QString &options)
{
QMap<QString, QVariant> map;
const auto pairs = QStringView{options}.split(QLatin1Char(','), Qt::SkipEmptyParts);
for (const auto pair : pairs) {
const int pos = pair.indexOf(QLatin1Char('='));
if (pos == -1) {
qWarning() << "Skipping invalid option without '=' in a source formatter style's Content config entry:"
<< pair;
continue;
}
map.insert(pair.first(pos).toString(), pair.sliced(pos + 1).toString());
}
return map;
}
SourceFormatterStyle::MimeList ISourceFormatter::mimeTypesSupportedByBuiltInStyles()
{
static const SourceFormatterStyle::MimeList list = {
{QStringLiteral("text/x-c++src"), QStringLiteral("C++")},
{QStringLiteral("text/x-csrc"), QStringLiteral("C")},
{QStringLiteral("text/x-chdr"), QStringLiteral("C")},
{QStringLiteral("text/x-c++hdr"), QStringLiteral("C++")},
{QStringLiteral("text/x-java"), QStringLiteral("Java")},
{QStringLiteral("text/x-csharp"), QStringLiteral("C#")},
{QStringLiteral("text/x-objcsrc"), QStringLiteral("Objective-C")},
{QStringLiteral("text/x-objc++src"), QStringLiteral("Objective-C++")},
};
return list;
}
QString ISourceFormatter::missingExecutableMessage(const QString &name)
{
return i18n("The executable %1 cannot be found. Please make sure"
" it is installed and can be executed. <br />"
"The plugin will not work until you fix this problem.", QLatin1String("<b>") + name + QLatin1String("</b>"));
}
}
#include "moc_isourceformatter.cpp"
|