diff options
Diffstat (limited to 'src/plugins/texteditor/storagesettings.cpp')
-rw-r--r-- | src/plugins/texteditor/storagesettings.cpp | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/src/plugins/texteditor/storagesettings.cpp b/src/plugins/texteditor/storagesettings.cpp index a1c4645b0c..9554fa6e77 100644 --- a/src/plugins/texteditor/storagesettings.cpp +++ b/src/plugins/texteditor/storagesettings.cpp @@ -25,8 +25,10 @@ #include "storagesettings.h" +#include <utils/hostosinfo.h> #include <utils/settingsutils.h> +#include <QRegularExpression> #include <QSettings> #include <QString> @@ -36,13 +38,18 @@ static const char cleanWhitespaceKey[] = "cleanWhitespace"; static const char inEntireDocumentKey[] = "inEntireDocument"; static const char addFinalNewLineKey[] = "addFinalNewLine"; static const char cleanIndentationKey[] = "cleanIndentation"; +static const char skipTrailingWhitespaceKey[] = "skipTrailingWhitespace"; +static const char ignoreFileTypesKey[] = "ignoreFileTypes"; static const char groupPostfix[] = "StorageSettings"; +static const char defaultTrailingWhitespaceBlacklist[] = "*.md, *.MD, Makefile"; StorageSettings::StorageSettings() - : m_cleanWhitespace(true), + : m_ignoreFileTypes(defaultTrailingWhitespaceBlacklist), + m_cleanWhitespace(true), m_inEntireDocument(false), m_addFinalNewLine(true), - m_cleanIndentation(true) + m_cleanIndentation(true), + m_skipTrailingWhitespace(true) { } @@ -63,6 +70,8 @@ void StorageSettings::toMap(const QString &prefix, QVariantMap *map) const map->insert(prefix + QLatin1String(inEntireDocumentKey), m_inEntireDocument); map->insert(prefix + QLatin1String(addFinalNewLineKey), m_addFinalNewLine); map->insert(prefix + QLatin1String(cleanIndentationKey), m_cleanIndentation); + map->insert(prefix + QLatin1String(skipTrailingWhitespaceKey), m_skipTrailingWhitespace); + map->insert(prefix + QLatin1String(ignoreFileTypesKey), m_ignoreFileTypes.toLatin1().data()); } void StorageSettings::fromMap(const QString &prefix, const QVariantMap &map) @@ -75,6 +84,41 @@ void StorageSettings::fromMap(const QString &prefix, const QVariantMap &map) map.value(prefix + QLatin1String(addFinalNewLineKey), m_addFinalNewLine).toBool(); m_cleanIndentation = map.value(prefix + QLatin1String(cleanIndentationKey), m_cleanIndentation).toBool(); + m_skipTrailingWhitespace = + map.value(prefix + QLatin1String(skipTrailingWhitespaceKey), m_skipTrailingWhitespace).toBool(); + m_ignoreFileTypes = + map.value(prefix + QLatin1String(ignoreFileTypesKey), m_ignoreFileTypes).toString(); +} + +bool StorageSettings::removeTrailingWhitespace(const QString &fileName) const +{ + // if the user has elected not to trim trailing whitespace altogether, then + // early out here + if (!m_skipTrailingWhitespace) { + return true; + } + + const QString ignoreFileTypesRegExp(R"(\s*((?>\*\.)?[\w\d\.\*]+)[,;]?\s*)"); + + // use the ignore-files regex to extract the specified file patterns + QRegularExpression re(ignoreFileTypesRegExp); + QRegularExpressionMatchIterator iter = re.globalMatch(m_ignoreFileTypes); + + while (iter.hasNext()) { + QRegularExpressionMatch match = iter.next(); + QString pattern = match.captured(1); + + QRegularExpression patternRegExp(QRegularExpression::wildcardToRegularExpression(pattern)); + QRegularExpressionMatch patternMatch = patternRegExp.match(fileName); + if (patternMatch.hasMatch()) { + // if the filename has a pattern we want to ignore, then we need to return + // false ("don't remove trailing whitespace") + return false; + } + } + + // the supplied pattern does not match, so we want to remove trailing whitespace + return true; } bool StorageSettings::equals(const StorageSettings &ts) const @@ -82,7 +126,9 @@ bool StorageSettings::equals(const StorageSettings &ts) const return m_addFinalNewLine == ts.m_addFinalNewLine && m_cleanWhitespace == ts.m_cleanWhitespace && m_inEntireDocument == ts.m_inEntireDocument - && m_cleanIndentation == ts.m_cleanIndentation; + && m_cleanIndentation == ts.m_cleanIndentation + && m_skipTrailingWhitespace == ts.m_skipTrailingWhitespace + && m_ignoreFileTypes == ts.m_ignoreFileTypes; } } // namespace TextEditor |