From f2265abf327649758f384de05b37d1073c176e08 Mon Sep 17 00:00:00 2001 From: "Veronica K. B. Olsen" <1619840+vkbo@users.noreply.github.com> Date: Thu, 7 Nov 2019 20:00:19 +0100 Subject: [PATCH] Finished the GUI option for spell check provider --- README.md | 9 +++---- nw/config.py | 2 +- nw/gui/dialogs/configeditor.py | 44 +++++++++++++++++++++++++++------- nw/gui/elements/doceditor.py | 10 +++++--- 4 files changed, 48 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index cc01bd40..067e4f6b 100644 --- a/README.md +++ b/README.md @@ -47,8 +47,7 @@ For the apt package manager on Debian systems, the following Python3 packages ar These are optional, but recommended: -* `python3-enchant` for spell checking -* `python3-pycountry` for translating language codes to language names +* `python3-enchant` for better spell checking * `python3-latexcodec` for escaping unicode characters in LaTeX export * `python3-pandoc` for additional exports to Word, Open Office, eBooks, etc. @@ -64,12 +63,14 @@ python3 -m pip install pyqt5 python3 -m pip install appdirs python3 -m pip install lxml python3 -m pip install pyenchant -python3 -m pip install pycountry python3 -m pip install latexcodec python3 -m pip install pypandoc ``` On Windows,`pyenchant` may cause problems. -I'm looking for a good alternative for spell checking. +If no external spell checking tool is installed, novelWriter will use a basic spell checker based on standard Python package `difflib`. +Currently, only English dictionaries are available, but more can be added to the `nw/assets/dict` folder. +See the RADME.md file in that folder for how to generate more dictionaries. +This option is both slow and limited. Note: On Windows, make sure Python3 is in your PATH if you want to launch novelWriter from command line. You can also right click the `novelWriter.py` file, create a shortcut, then right click again, select "Properties" and change the target to your python executable and `novelWriter.py`. diff --git a/nw/config.py b/nw/config.py index e090ddbc..42c11bcb 100644 --- a/nw/config.py +++ b/nw/config.py @@ -536,7 +536,7 @@ class Config: """ try: - import pyenchant + import enchant self.hasEnchant = True logger.debug("Checking package pyenchant: Ok") except: diff --git a/nw/gui/dialogs/configeditor.py b/nw/gui/dialogs/configeditor.py index fe615430..bc809282 100644 --- a/nw/gui/dialogs/configeditor.py +++ b/nw/gui/dialogs/configeditor.py @@ -27,7 +27,7 @@ from PyQt5.QtWidgets import ( QFileDialog ) -from nw.tools import NWSpellCheck +from nw.tools import NWSpellCheck, NWSpellSimple, NWSpellEnchant from nw.constants import nwAlert, nwQuotes logger = logging.getLogger(__name__) @@ -158,6 +158,7 @@ class GuiConfigEditGeneral(QWidget): self.spellLangForm = QGridLayout(self) self.spellLang.setLayout(self.spellLangForm) + self.spellLangList = QComboBox(self) self.spellToolList = QComboBox(self) self.spellToolList.addItem("Internal (difflib)", NWSpellCheck.SP_INTERNAL) self.spellToolList.addItem("Spell Enchant (pyenchant)", NWSpellCheck.SP_ENCHANT) @@ -169,12 +170,11 @@ class GuiConfigEditGeneral(QWidget): theModel.item(idEnchant).setEnabled(self.mainConf.hasEnchant) theModel.item(idSymSpell).setEnabled(self.mainConf.hasSymSpell) - self.spellLangList = QComboBox(self) - for spTag, spName in self.theParent.docEditor.theDict.listDictionaries(): - self.spellLangList.addItem(spName, spTag) - spellIdx = self.spellLangList.findData(self.mainConf.spellLanguage) - if spellIdx != -1: - self.spellLangList.setCurrentIndex(spellIdx) + self.spellToolList.currentIndexChanged.connect(self._doUpdateSpellTool) + toolIdx = self.spellToolList.findData(self.mainConf.spellTool) + if toolIdx != -1: + self.spellToolList.setCurrentIndex(toolIdx) + self._doUpdateSpellTool(0) self.spellLangForm.addWidget(QLabel("Provider"), 0, 0) self.spellLangForm.addWidget(self.spellToolList, 0, 1) @@ -243,8 +243,8 @@ class GuiConfigEditGeneral(QWidget): self.outerBox.addWidget(self.guiLook, 0, 0) self.outerBox.addWidget(self.spellLang, 1, 0) self.outerBox.addWidget(self.autoSave, 2, 0) - self.outerBox.addWidget(self.projBackup, 3, 0) - self.outerBox.setColumnStretch(2, 1) + self.outerBox.addWidget(self.projBackup, 3, 0, 1, 2) + self.outerBox.setColumnStretch(1, 1) self.outerBox.setRowStretch(4, 1) self.setLayout(self.outerBox) @@ -311,6 +311,32 @@ class GuiConfigEditGeneral(QWidget): anItem.setFlags(anItem.flags() ^ Qt.ItemIsEnabled) return theModel + def _doUpdateSpellTool(self, currIdx): + spellTool = self.spellToolList.currentData() + self._updateLanguageList(spellTool) + return + + def _updateLanguageList(self, spellTool): + """Updates the list of available spell checking dictionaries + available for the selected spell check tool. It will try to + preserve the language choice, if the language exists in the + updated list. + """ + if spellTool == NWSpellCheck.SP_ENCHANT: + theDict = NWSpellEnchant() + else: + theDict = NWSpellSimple() + + self.spellLangList.clear() + for spTag, spName in theDict.listDictionaries(): + self.spellLangList.addItem(spName, spTag) + + spellIdx = self.spellLangList.findData(self.mainConf.spellLanguage) + if spellIdx != -1: + self.spellLangList.setCurrentIndex(spellIdx) + + return + # END Class GuiConfigEditGeneral class GuiConfigEditEditor(QWidget): diff --git a/nw/gui/elements/doceditor.py b/nw/gui/elements/doceditor.py index 4decc7f5..30db23d0 100644 --- a/nw/gui/elements/doceditor.py +++ b/nw/gui/elements/doceditor.py @@ -64,10 +64,9 @@ class GuiDocEditor(QTextEdit): self.qDocument = self.document() self.qDocument.setDocumentMargin(self.mainConf.textMargin) self.qDocument.contentsChange.connect(self._docChange) - self._setupSpellChecking() + # Syntax self.hLight = GuiDocHighlighter(self.qDocument, self.theParent) - self.hLight.setDict(self.theDict) # Context Menu self.setContextMenuPolicy(Qt.CustomContextMenu) @@ -138,7 +137,8 @@ class GuiDocEditor(QTextEdit): created, and when the user changes the main editor preferences. """ - # Reload dictionaries + # Reload spell check and dictionaries + self._setupSpellChecking() self.setDictionaries() # Set font @@ -727,11 +727,15 @@ class GuiDocEditor(QTextEdit): """Create the spell checking object based on the spellTool setting in config. """ + if self.mainConf.spellTool == "enchant": from nw.tools.spellenchant import NWSpellEnchant self.theDict = NWSpellEnchant() else: self.theDict = NWSpellSimple() + + self.hLight.setDict(self.theDict) + return # END Class GuiDocEditor