diff --git a/novelwriter/dialogs/preferences.py b/novelwriter/dialogs/preferences.py index 9dfdc05f..6723cd4a 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, uniqueCompact +from novelwriter.common import compact, describeFont, uniqueCompact from novelwriter.constants import nwUnicode from novelwriter.dialogs.quotes import GuiQuoteSelect from novelwriter.extensions.configlayout import NColourLabel, NScrollableForm @@ -133,7 +133,7 @@ class GuiPreferences(NDialog): """Build the settings form.""" section = 0 iSz = SHARED.theme.baseIconSize - boxFixed = 5*SHARED.theme.textNWidth + boxFixed = 6*SHARED.theme.textNWidth minWidth = CONFIG.pxInt(200) fontWidth = CONFIG.pxInt(162) @@ -568,13 +568,13 @@ class GuiPreferences(NDialog): ) self.dialogLine = QLineEdit(self) - self.dialogLine.setMaxLength(1) + self.dialogLine.setMaxLength(4) self.dialogLine.setFixedWidth(boxFixed) self.dialogLine.setAlignment(QtAlignCenter) self.dialogLine.setText(CONFIG.dialogLine) self.mainForm.addRow( - self.tr("Dialogue line symbol"), self.dialogLine, - self.tr("Lines starting with this symbol are dialogue.") + self.tr("Dialogue line symbols"), self.dialogLine, + self.tr("Lines starting with these symbols are always dialogue.") ) self.narratorBreak = QLineEdit(self) @@ -953,9 +953,9 @@ class GuiPreferences(NDialog): dialogueStyle = self.dialogStyle.currentData() allowOpenDial = self.allowOpenDial.isChecked() narratorBreak = self.narratorBreak.text().strip() - dialogueLine = self.dialogLine.text().strip() - altDialogOpen = self.altDialogOpen.text() - altDialogClose = self.altDialogClose.text() + dialogueLine = uniqueCompact(self.dialogLine.text()) + altDialogOpen = compact(self.altDialogOpen.text()) + altDialogClose = compact(self.altDialogClose.text()) highlightEmph = self.highlightEmph.isChecked() showMultiSpaces = self.showMultiSpaces.isChecked() diff --git a/novelwriter/text/patterns.py b/novelwriter/text/patterns.py index e09bd883..aa4468ae 100644 --- a/novelwriter/text/patterns.py +++ b/novelwriter/text/patterns.py @@ -26,6 +26,7 @@ from __future__ import annotations import re from novelwriter import CONFIG +from novelwriter.common import compact, uniqueCompact from novelwriter.constants import nwRegEx @@ -88,11 +89,11 @@ class RegExPatterns: symO = "" symC = "" if CONFIG.dialogStyle in (1, 3): - symO += CONFIG.fmtSQuoteOpen - symC += CONFIG.fmtSQuoteClose + symO += CONFIG.fmtSQuoteOpen.strip()[:1] + symC += CONFIG.fmtSQuoteClose.strip()[:1] if CONFIG.dialogStyle in (2, 3): - symO += CONFIG.fmtDQuoteOpen - symC += CONFIG.fmtDQuoteClose + symO += CONFIG.fmtDQuoteOpen.strip()[:1] + symC += CONFIG.fmtDQuoteClose.strip()[:1] rxEnd = "|$" if CONFIG.allowOpenDial else "" return re.compile(f"\\B[{symO}].*?(?:[{symC}]\\B{rxEnd})", re.UNICODE) @@ -102,8 +103,8 @@ class RegExPatterns: def altDialogStyle(self) -> re.Pattern | None: """Dialogue alternative rule based on user settings.""" if CONFIG.altDialogOpen and CONFIG.altDialogClose: - symO = re.escape(CONFIG.altDialogOpen) - symC = re.escape(CONFIG.altDialogClose) + symO = re.escape(compact(CONFIG.altDialogOpen)) + symC = re.escape(compact(CONFIG.altDialogClose)) return re.compile(f"\\B{symO}.*?{symC}\\B", re.UNICODE) return None @@ -132,7 +133,7 @@ class DialogParser: """Init parser settings. Must be called when config changes.""" punct = re.escape("!?.,:;") self._quotes = REGEX_PATTERNS.dialogStyle - self._dialog = CONFIG.dialogLine + self._dialog = uniqueCompact(CONFIG.dialogLine) self._narrator = CONFIG.narratorBreak.strip()[:1] self._break = re.compile( f"({self._narrator}\\s?.*?\\s?(?:{self._narrator}[{punct}]?|$))", re.UNICODE