diff --git a/novelwriter/common.py b/novelwriter/common.py index 181a79a1..44463ca6 100644 --- a/novelwriter/common.py +++ b/novelwriter/common.py @@ -279,6 +279,16 @@ def simplified(text: str) -> str: return " ".join(str(text).strip().split()) +def compact(text: str) -> str: + """Compact a string by removing spaces.""" + return "".join(str(text).split()) + + +def uniqueCompact(text: str) -> str: + """Return a unique, compact and sorted string.""" + return "".join(sorted(set(compact(text)))) + + def elide(text: str, length: int) -> str: """Elide a piece of text to a maximum length.""" if len(text) > (cut := max(4, length)): diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index f433529e..519f6b73 100644 --- a/novelwriter/dialogs/preferences.py +++ b/novelwriter/dialogs/preferences.py @@ -34,7 +34,7 @@ from PyQt5.QtWidgets import ( ) from novelwriter import CONFIG, SHARED -from novelwriter.common import describeFont +from novelwriter.common import describeFont, uniqueCompact from novelwriter.constants import nwUnicode from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.configlayout import NColourLabel, NScrollableForm @@ -952,8 +952,8 @@ class GuiPreferences(NDialog): # Text Highlighting dialogueStyle = self.dialogStyle.currentData() allowOpenDial = self.allowOpenDial.isChecked() - narratorBreak = self.narratorBreak.text() - dialogueLine = self.dialogLine.text() + narratorBreak = self.narratorBreak.text().strip() + dialogueLine = self.dialogLine.text().strip() altDialogOpen = self.altDialogOpen.text() altDialogClose = self.altDialogClose.text() highlightEmph = self.highlightEmph.isChecked() @@ -983,8 +983,8 @@ class GuiPreferences(NDialog): CONFIG.doReplaceDQuote = self.doReplaceDQuote.isChecked() CONFIG.doReplaceDash = self.doReplaceDash.isChecked() CONFIG.doReplaceDots = self.doReplaceDots.isChecked() - CONFIG.fmtPadBefore = self.fmtPadBefore.text().strip() - CONFIG.fmtPadAfter = self.fmtPadAfter.text().strip() + CONFIG.fmtPadBefore = uniqueCompact(self.fmtPadBefore.text()) + CONFIG.fmtPadAfter = uniqueCompact(self.fmtPadAfter.text()) CONFIG.fmtPadThin = self.fmtPadThin.isChecked() # Quotation Style diff --git a/tests/test_base/test_base_common.py b/tests/test_base/test_base_common.py index b46007b5..faf48dd3 100644 --- a/tests/test_base/test_base_common.py +++ b/tests/test_base/test_base_common.py @@ -32,12 +32,12 @@ from PyQt5.QtGui import QColor, QDesktopServices, QFontDatabase from novelwriter.common import ( NWConfigParser, checkBool, checkFloat, checkInt, checkIntTuple, checkPath, - checkString, checkStringNone, checkUuid, cssCol, describeFont, elide, - formatFileFilter, formatInt, formatTime, formatTimeStamp, formatVersion, - fuzzyTime, getFileSize, hexToInt, isHandle, isItemClass, isItemLayout, - isItemType, isListInstance, isTitleTag, jsonEncode, makeFileNameSafe, - minmax, numberToRoman, openExternalPath, readTextFile, simplified, - transferCase, xmlIndent, yesNo + checkString, checkStringNone, checkUuid, compact, cssCol, describeFont, + elide, formatFileFilter, formatInt, formatTime, formatTimeStamp, + formatVersion, fuzzyTime, getFileSize, hexToInt, isHandle, isItemClass, + isItemLayout, isItemType, isListInstance, isTitleTag, jsonEncode, + makeFileNameSafe, minmax, numberToRoman, openExternalPath, readTextFile, + simplified, transferCase, uniqueCompact, xmlIndent, yesNo ) from tests.mocked import causeOSError @@ -346,6 +346,27 @@ def testBaseCommon_simplified(): assert simplified("\tHello\n\r\tWorld") == "Hello World" +@pytest.mark.base +def testBaseCommon_compact(): + """Test the compact function.""" + assert compact("! ! !") == "!!!" + assert compact("1\t2\t3") == "123" + assert compact("1\n2\n3") == "123" + assert compact("1\r2\r3") == "123" + assert compact("1\u00a02\u00a03") == "123" + + +@pytest.mark.base +def testBaseCommon_uniqueCompact(): + """Test the uniqueCompact function.""" + assert uniqueCompact("! ! !") == "!" + assert uniqueCompact("1\t2\t3") == "123" + assert uniqueCompact("1\n2\n3") == "123" + assert uniqueCompact("1\r2\r3") == "123" + assert uniqueCompact("1\u00a02\u00a03") == "123" + assert uniqueCompact("3 2 1") == "123" + + @pytest.mark.base def testBaseCommon_elide(): """Test the elide function.""" diff --git a/tests/test_dialogs/test_dlg_preferences.py b/tests/test_dialogs/test_dlg_preferences.py index 1d186d83..036621df 100644 --- a/tests/test_dialogs/test_dlg_preferences.py +++ b/tests/test_dialogs/test_dlg_preferences.py @@ -379,7 +379,7 @@ def testDlgPreferences_Settings(qtbot, monkeypatch, nwGUI, tstPaths): assert CONFIG.doReplaceDQuote is False assert CONFIG.doReplaceDash is False assert CONFIG.doReplaceDots is False - assert CONFIG.fmtPadBefore == "!?:" + assert CONFIG.fmtPadBefore == "!:?" assert CONFIG.fmtPadAfter == "¡¿" assert CONFIG.fmtPadThin is True