aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/texteditor/storagesettings.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/texteditor/storagesettings.cpp')
-rw-r--r--src/plugins/texteditor/storagesettings.cpp52
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