Merge pull request #704 from vkbo/french_space

French space padding
This commit is contained in:
Veronica Berglyd Olsen
2021-03-14 14:52:32 +01:00
committed by GitHub
10 changed files with 1187 additions and 881 deletions
+247 -203
View File
File diff suppressed because it is too large Load Diff
+254 -210
View File
File diff suppressed because it is too large Load Diff
+254 -210
View File
File diff suppressed because it is too large Load Diff
+254 -210
View File
File diff suppressed because it is too large Load Diff
+15
View File
@@ -164,6 +164,9 @@ class Config:
self.fmtApostrophe = nwUnicode.U_RSQUO self.fmtApostrophe = nwUnicode.U_RSQUO
self.fmtSingleQuotes = [nwUnicode.U_LSQUO, nwUnicode.U_RSQUO] self.fmtSingleQuotes = [nwUnicode.U_LSQUO, nwUnicode.U_RSQUO]
self.fmtDoubleQuotes = [nwUnicode.U_LDQUO, nwUnicode.U_RDQUO] self.fmtDoubleQuotes = [nwUnicode.U_LDQUO, nwUnicode.U_RDQUO]
self.fmtPadBefore = ""
self.fmtPadAfter = ""
self.fmtPadThin = False
## Spell Checking ## Spell Checking
self.spellTool = None self.spellTool = None
@@ -578,6 +581,15 @@ class Config:
self.fmtDoubleQuotes = self._parseLine( self.fmtDoubleQuotes = self._parseLine(
cnfParse, cnfSec, "fmtdoublequote", self.CNF_S_LST, self.fmtDoubleQuotes cnfParse, cnfSec, "fmtdoublequote", self.CNF_S_LST, self.fmtDoubleQuotes
) )
self.fmtPadBefore = self._parseLine(
cnfParse, cnfSec, "fmtpadbefore", self.CNF_STR, self.fmtPadBefore
)
self.fmtPadAfter = self._parseLine(
cnfParse, cnfSec, "fmtpadafter", self.CNF_STR, self.fmtPadAfter
)
self.fmtPadThin = self._parseLine(
cnfParse, cnfSec, "fmtpadthin", self.CNF_BOOL, self.fmtPadThin
)
self.spellTool = self._parseLine( self.spellTool = self._parseLine(
cnfParse, cnfSec, "spelltool", self.CNF_STR, self.spellTool cnfParse, cnfSec, "spelltool", self.CNF_STR, self.spellTool
) )
@@ -746,6 +758,9 @@ class Config:
cnfParse.set(cnfSec, "autoscrollpos", str(self.autoScrollPos)) cnfParse.set(cnfSec, "autoscrollpos", str(self.autoScrollPos))
cnfParse.set(cnfSec, "fmtsinglequote", self._packList(self.fmtSingleQuotes)) cnfParse.set(cnfSec, "fmtsinglequote", self._packList(self.fmtSingleQuotes))
cnfParse.set(cnfSec, "fmtdoublequote", self._packList(self.fmtDoubleQuotes)) cnfParse.set(cnfSec, "fmtdoublequote", self._packList(self.fmtDoubleQuotes))
cnfParse.set(cnfSec, "fmtpadbefore", str(self.fmtPadBefore))
cnfParse.set(cnfSec, "fmtpadafter", str(self.fmtPadAfter))
cnfParse.set(cnfSec, "fmtpadthin", str(self.fmtPadThin))
cnfParse.set(cnfSec, "spelltool", str(self.spellTool)) cnfParse.set(cnfSec, "spelltool", str(self.spellTool))
cnfParse.set(cnfSec, "spellcheck", str(self.spellLanguage)) cnfParse.set(cnfSec, "spellcheck", str(self.spellLanguage))
cnfParse.set(cnfSec, "showtabsnspaces", str(self.showTabsNSpaces)) cnfParse.set(cnfSec, "showtabsnspaces", str(self.showTabsNSpaces))
+59 -26
View File
@@ -98,10 +98,12 @@ class GuiDocEditor(QTextEdit):
self.queuePos = None # Used for delayed change of cursor position self.queuePos = None # Used for delayed change of cursor position
# Typography # Typography
self.typDQOpen = self.mainConf.fmtDoubleQuotes[0] self.typDQOpen = '"'
self.typDQClose = self.mainConf.fmtDoubleQuotes[1] self.typDQClose = '"'
self.typSQOpen = self.mainConf.fmtSingleQuotes[0] self.typSQOpen = "'"
self.typSQClose = self.mainConf.fmtSingleQuotes[1] self.typSQClose = "'"
self.typPadChar = " "
self.addPadding = False
# Core Elements and Signals # Core Elements and Signals
self.qDocument = self.document() self.qDocument = self.document()
@@ -197,6 +199,17 @@ class GuiDocEditor(QTextEdit):
self.nonWord += "".join(self.mainConf.fmtDoubleQuotes) self.nonWord += "".join(self.mainConf.fmtDoubleQuotes)
self.nonWord += "".join(self.mainConf.fmtSingleQuotes) self.nonWord += "".join(self.mainConf.fmtSingleQuotes)
# Typography
if self.mainConf.fmtPadThin:
self.typPadChar = nwUnicode.U_THNBSP
else:
self.typPadChar = nwUnicode.U_NBSP
self.typSQOpen = self.mainConf.fmtSingleQuotes[0]
self.typSQClose = self.mainConf.fmtSingleQuotes[1]
self.typDQOpen = self.mainConf.fmtDoubleQuotes[0]
self.typDQClose = self.mainConf.fmtDoubleQuotes[1]
# Reload spell check and dictionaries # Reload spell check and dictionaries
self._setupSpellChecking() self._setupSpellChecking()
self.setDictionaries() self.setDictionaries()
@@ -206,6 +219,7 @@ class GuiDocEditor(QTextEdit):
if self.mainConf.textFont is None: if self.mainConf.textFont is None:
# If none is defined, set the default back to config # If none is defined, set the default back to config
self.mainConf.textFont = self.qDocument.defaultFont().family() self.mainConf.textFont = self.qDocument.defaultFont().family()
theFont.setFamily(self.mainConf.textFont) theFont.setFamily(self.mainConf.textFont)
theFont.setPointSize(self.mainConf.textSize) theFont.setPointSize(self.mainConf.textSize)
self.setFont(theFont) self.setFont(theFont)
@@ -1202,7 +1216,7 @@ class GuiDocEditor(QTextEdit):
return return
def _docAutoReplace(self, theBlock): def _docAutoReplace(self, theBlock):
"""Autoreplace text elements based on main configuration. """Auto-replace text elements based on main configuration.
""" """
if not theBlock.isValid(): if not theBlock.isValid():
return return
@@ -1219,43 +1233,62 @@ class GuiDocEditor(QTextEdit):
theTwo = theText[thePos-2:thePos] theTwo = theText[thePos-2:thePos]
theThree = theText[thePos-3:thePos] theThree = theText[thePos-3:thePos]
if self.mainConf.doReplaceDQuote and theTwo == " \"": if not theOne: # Makes Neo sad
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 1) return
theCursor.insertText(self.typDQOpen)
elif self.mainConf.doReplaceDQuote and theOne == "\"": nDelete = 0
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 1) tInsert = theOne
if self.mainConf.doReplaceDQuote and theTwo == ' "':
nDelete = 1
tInsert = self.typDQOpen
elif self.mainConf.doReplaceDQuote and theOne == '"':
nDelete = 1
if thePos == 1: if thePos == 1:
theCursor.insertText(self.typDQOpen) tInsert = self.typDQOpen
else: else:
theCursor.insertText(self.typDQClose) tInsert = self.typDQClose
elif self.mainConf.doReplaceSQuote and theTwo == " '": elif self.mainConf.doReplaceSQuote and theTwo == " '":
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 1) nDelete = 1
theCursor.insertText(self.typSQOpen) tInsert = self.typSQOpen
elif self.mainConf.doReplaceSQuote and theOne == "'": elif self.mainConf.doReplaceSQuote and theOne == "'":
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 1) nDelete = 1
if thePos == 1: if thePos == 1:
theCursor.insertText(self.typSQOpen) tInsert = self.typSQOpen
else: else:
theCursor.insertText(self.typSQClose) tInsert = self.typSQClose
elif self.mainConf.doReplaceDash and theThree == "---": elif self.mainConf.doReplaceDash and theThree == "---":
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 3) nDelete = 3
theCursor.insertText(nwUnicode.U_EMDASH) tInsert = nwUnicode.U_EMDASH
elif self.mainConf.doReplaceDash and theTwo == "--": elif self.mainConf.doReplaceDash and theTwo == "--":
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2) nDelete = 2
theCursor.insertText(nwUnicode.U_ENDASH) tInsert = nwUnicode.U_ENDASH
elif self.mainConf.doReplaceDash and theTwo == nwUnicode.U_ENDASH+"-": elif self.mainConf.doReplaceDash and theTwo == nwUnicode.U_ENDASH + "-":
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2) nDelete = 2
theCursor.insertText(nwUnicode.U_EMDASH) tInsert = nwUnicode.U_EMDASH
elif self.mainConf.doReplaceDots and theThree == "...": elif self.mainConf.doReplaceDots and theThree == "...":
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 3) nDelete = 3
theCursor.insertText(nwUnicode.U_HELLIP) tInsert = nwUnicode.U_HELLIP
tCheck = tInsert
if tCheck in self.mainConf.fmtPadBefore:
nDelete = max(nDelete, 1)
tInsert = self.typPadChar + tInsert
if tCheck in self.mainConf.fmtPadAfter:
nDelete = max(nDelete, 1)
tInsert = tInsert + self.typPadChar
if nDelete > 0:
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, nDelete)
theCursor.insertText(tInsert)
return return
+92 -21
View File
@@ -61,6 +61,7 @@ class GuiPreferences(PagedDialog):
self.tabEditor = GuiPreferencesEditor(self.theParent) self.tabEditor = GuiPreferencesEditor(self.theParent)
self.tabSyntax = GuiPreferencesSyntax(self.theParent) self.tabSyntax = GuiPreferencesSyntax(self.theParent)
self.tabAuto = GuiPreferencesAutomation(self.theParent) self.tabAuto = GuiPreferencesAutomation(self.theParent)
self.tabQuote = GuiPreferencesQuotes(self.theParent)
self.addTab(self.tabGeneral, self.tr("General")) self.addTab(self.tabGeneral, self.tr("General"))
self.addTab(self.tabProjects, self.tr("Projects")) self.addTab(self.tabProjects, self.tr("Projects"))
@@ -68,6 +69,7 @@ class GuiPreferences(PagedDialog):
self.addTab(self.tabEditor, self.tr("Editor")) self.addTab(self.tabEditor, self.tr("Editor"))
self.addTab(self.tabSyntax, self.tr("Highlighting")) self.addTab(self.tabSyntax, self.tr("Highlighting"))
self.addTab(self.tabAuto, self.tr("Automation")) self.addTab(self.tabAuto, self.tr("Automation"))
self.addTab(self.tabQuote, self.tr("Quotes"))
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
self.buttonBox.accepted.connect(self._doSave) self.buttonBox.accepted.connect(self._doSave)
@@ -1034,6 +1036,95 @@ class GuiPreferencesAutomation(QWidget):
self.tr("Three consecutive dots become ellipsis.") self.tr("Three consecutive dots become ellipsis.")
) )
# Automatic Padding
# =================
self.mainForm.addGroupLabel(self.tr("Automatic Padding"))
## Pad Before
self.fmtPadBefore = QLineEdit()
self.fmtPadBefore.setMaxLength(32)
self.fmtPadBefore.setText(self.mainConf.fmtPadBefore)
self.mainForm.addRow(
self.tr("Insert non-breaking space before"),
self.fmtPadBefore,
self.tr("Automatically add space before any of the symbols."),
)
## Pad After
self.fmtPadAfter = QLineEdit()
self.fmtPadAfter.setMaxLength(32)
self.fmtPadAfter.setText(self.mainConf.fmtPadAfter)
self.mainForm.addRow(
self.tr("Insert non-breaking space after"),
self.fmtPadAfter,
self.tr("Automatically add space after any of the symbols."),
)
## Use Thin Space
self.fmtPadThin = QSwitch()
self.fmtPadThin.setChecked(self.mainConf.fmtPadThin)
self.fmtPadThin.setEnabled(self.mainConf.doReplace)
self.mainForm.addRow(
self.tr("Use thin space instead"),
self.fmtPadThin,
self.tr("Inserts a thinner space instead of regular space.")
)
return
def saveValues(self):
"""Save the values set for this tab.
"""
# Automatic Features
self.mainConf.autoSelect = self.autoSelect.isChecked()
self.mainConf.doReplace = self.doReplace.isChecked()
# Replace as You Type
self.mainConf.doReplaceSQuote = self.doReplaceSQuote.isChecked()
self.mainConf.doReplaceDQuote = self.doReplaceDQuote.isChecked()
self.mainConf.doReplaceDash = self.doReplaceDash.isChecked()
self.mainConf.doReplaceDots = self.doReplaceDots.isChecked()
# Automatic Padding
self.mainConf.fmtPadBefore = self.fmtPadBefore.text().strip()
self.mainConf.fmtPadAfter = self.fmtPadAfter.text().strip()
self.mainConf.fmtPadThin = self.fmtPadThin.isChecked()
self.mainConf.confChanged = True
return
##
# Slots
##
def _toggleAutoReplaceMain(self, theState):
"""Enables or disables switches controlled by the main auto
replace switch.
"""
self.doReplaceSQuote.setEnabled(theState)
self.doReplaceDQuote.setEnabled(theState)
self.doReplaceDash.setEnabled(theState)
self.doReplaceDots.setEnabled(theState)
self.fmtPadThin.setEnabled(theState)
return
# END Class GuiPreferencesAutomation
class GuiPreferencesQuotes(QWidget):
def __init__(self, theParent):
QWidget.__init__(self, theParent)
self.mainConf = nw.CONFIG
self.theParent = theParent
self.theTheme = theParent.theTheme
# The Form
self.mainForm = QConfigLayout()
self.mainForm.setHelpTextStyle(self.theTheme.helpText)
self.setLayout(self.mainForm)
# Quotation Style # Quotation Style
# =============== # ===============
self.mainForm.addGroupLabel(self.tr("Quotation Style")) self.mainForm.addGroupLabel(self.tr("Quotation Style"))
@@ -1113,16 +1204,6 @@ class GuiPreferencesAutomation(QWidget):
def saveValues(self): def saveValues(self):
"""Save the values set for this tab. """Save the values set for this tab.
""" """
# Automatic Features
self.mainConf.autoSelect = self.autoSelect.isChecked()
self.mainConf.doReplace = self.doReplace.isChecked()
# Replace as You Type
self.mainConf.doReplaceSQuote = self.doReplaceSQuote.isChecked()
self.mainConf.doReplaceDQuote = self.doReplaceDQuote.isChecked()
self.mainConf.doReplaceDash = self.doReplaceDash.isChecked()
self.mainConf.doReplaceDots = self.doReplaceDots.isChecked()
# Quotation Style # Quotation Style
self.mainConf.fmtSingleQuotes[0] = self.quoteSym["SO"].text() self.mainConf.fmtSingleQuotes[0] = self.quoteSym["SO"].text()
self.mainConf.fmtSingleQuotes[1] = self.quoteSym["SC"].text() self.mainConf.fmtSingleQuotes[1] = self.quoteSym["SC"].text()
@@ -1137,16 +1218,6 @@ class GuiPreferencesAutomation(QWidget):
# Slots # Slots
## ##
def _toggleAutoReplaceMain(self, theState):
"""Enables or disables switches controlled by the main auto
replace switch.
"""
self.doReplaceSQuote.setEnabled(theState)
self.doReplaceDQuote.setEnabled(theState)
self.doReplaceDash.setEnabled(theState)
self.doReplaceDots.setEnabled(theState)
return
def _getQuote(self, qType): def _getQuote(self, qType):
"""Dialog for single quote open. """Dialog for single quote open.
""" """
@@ -1156,4 +1227,4 @@ class GuiPreferencesAutomation(QWidget):
return return
# END Class GuiPreferencesAutomation # END Class GuiPreferencesQuotes
@@ -48,6 +48,9 @@ autoscroll = False
autoscrollpos = 30 autoscrollpos = 30
fmtsinglequote = , fmtsinglequote = ,
fmtdoublequote = “, ” fmtdoublequote = “, ”
fmtpadbefore =
fmtpadafter =
fmtpadthin = False
spelltool = internal spelltool = internal
spellcheck = en spellcheck = en
showtabsnspaces = False showtabsnspaces = False
@@ -48,6 +48,9 @@ autoscroll = True
autoscrollpos = 30 autoscrollpos = 30
fmtsinglequote = , fmtsinglequote = ,
fmtdoublequote = “, ” fmtdoublequote = “, ”
fmtpadbefore =
fmtpadafter =
fmtpadthin = False
spelltool = internal spelltool = internal
spellcheck = en spellcheck = en
showtabsnspaces = True showtabsnspaces = True
+6 -1
View File
@@ -229,9 +229,14 @@ def testGuiPreferences_Main(qtbot, monkeypatch, fncDir, outDir, refDir):
assert not tabAuto.doReplaceDash.isEnabled() assert not tabAuto.doReplaceDash.isEnabled()
assert not tabAuto.doReplaceDots.isEnabled() assert not tabAuto.doReplaceDots.isEnabled()
# Quotation Style
qtbot.wait(keyDelay)
tabQuote = nwPrefs.tabQuote
nwPrefs._tabBox.setCurrentWidget(tabQuote)
monkeypatch.setattr(QuotesDialog, "selectedQuote", "'") monkeypatch.setattr(QuotesDialog, "selectedQuote", "'")
monkeypatch.setattr(QuotesDialog, "exec_", lambda *args: QDialog.Accepted) monkeypatch.setattr(QuotesDialog, "exec_", lambda *args: QDialog.Accepted)
qtbot.mouseClick(tabAuto.btnDoubleStyleC, Qt.LeftButton) qtbot.mouseClick(tabQuote.btnDoubleStyleC, Qt.LeftButton)
# Save and Check Config # Save and Check Config
qtbot.mouseClick(nwPrefs.buttonBox.button(QDialogButtonBox.Ok), Qt.LeftButton) qtbot.mouseClick(nwPrefs.buttonBox.button(QDialogButtonBox.Ok), Qt.LeftButton)