From 8ef1a12201ff0ae74e0a891eb7894bacab3fda31 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Thu, 8 Jun 2023 23:32:32 +0200 Subject: [PATCH] Use enums for build formats --- novelwriter/constants.py | 30 ++++++++++++++++++++---------- novelwriter/core/buildsettings.py | 23 ++++++++++++++--------- novelwriter/core/docbuild.py | 11 ++++++----- novelwriter/enum.py | 14 ++++++++++++++ novelwriter/tools/manusbuild.py | 15 ++++++++------- 5 files changed, 62 insertions(+), 31 deletions(-) diff --git a/novelwriter/constants.py b/novelwriter/constants.py index 48d10f51..dba2d2d0 100644 --- a/novelwriter/constants.py +++ b/novelwriter/constants.py @@ -25,7 +25,7 @@ along with this program. If not, see . from PyQt5.QtCore import QCoreApplication, QT_TRANSLATE_NOOP -from novelwriter.enum import nwItemClass, nwItemLayout, nwOutline +from novelwriter.enum import nwBuildFmt, nwItemClass, nwItemLayout, nwOutline def trConst(tString): @@ -205,15 +205,25 @@ class nwLabels: nwOutline.CUSTOM: KEY_NAME[nwKeyWords.CUSTOM_KEY], nwOutline.SYNOP: QT_TRANSLATE_NOOP("Constant", "Synopsis"), } - BUILD_FORMATS = { - "odt": (".odt", QT_TRANSLATE_NOOP("Constant", "Open Document (.odt)")), - "fodt": (".fodt", QT_TRANSLATE_NOOP("Constant", "Flat Open Document (.fodt)")), - "html": (".html", QT_TRANSLATE_NOOP("Constant", "novelWriter HTML (.html)")), - "nwd": (".nwd", QT_TRANSLATE_NOOP("Constant", "novelWriter Markdown (.nwd)")), - "md": (".md", QT_TRANSLATE_NOOP("Constant", "Standard Markdown (.md)")), - "md+": (".md", QT_TRANSLATE_NOOP("Constant", "Extended Markdown (.md)")), - "jhtml": (".json", QT_TRANSLATE_NOOP("Constant", "JSON + novelWriter HTML (.json)")), - "jnwd": (".json", QT_TRANSLATE_NOOP("Constant", "JSON + novelWriter Markdown (.json)")), + BUILD_FMT = { + nwBuildFmt.ODT: QT_TRANSLATE_NOOP("Constant", "Open Document (.odt)"), + nwBuildFmt.FODT: QT_TRANSLATE_NOOP("Constant", "Flat Open Document (.fodt)"), + nwBuildFmt.HTML: QT_TRANSLATE_NOOP("Constant", "novelWriter HTML (.html)"), + nwBuildFmt.NWD: QT_TRANSLATE_NOOP("Constant", "novelWriter Markup (.txt)"), + nwBuildFmt.STD_MD: QT_TRANSLATE_NOOP("Constant", "Standard Markdown (.md)"), + nwBuildFmt.EXT_MD: QT_TRANSLATE_NOOP("Constant", "Extended Markdown (.md)"), + nwBuildFmt.J_HTML: QT_TRANSLATE_NOOP("Constant", "JSON + novelWriter HTML (.json)"), + nwBuildFmt.J_NWD: QT_TRANSLATE_NOOP("Constant", "JSON + novelWriter Markup (.json)"), + } + BUILD_EXT = { + nwBuildFmt.ODT: ".odt", + nwBuildFmt.FODT: ".fodt", + nwBuildFmt.HTML: ".html", + nwBuildFmt.NWD: ".txt", + nwBuildFmt.STD_MD: ".md", + nwBuildFmt.EXT_MD: ".md", + nwBuildFmt.J_HTML: ".json", + nwBuildFmt.J_NWD: ".json", } # END Class nwLabels diff --git a/novelwriter/core/buildsettings.py b/novelwriter/core/buildsettings.py index 1d6606ee..6f12472b 100644 --- a/novelwriter/core/buildsettings.py +++ b/novelwriter/core/buildsettings.py @@ -34,11 +34,12 @@ from pathlib import Path from PyQt5.QtCore import QT_TRANSLATE_NOOP +from novelwriter.enum import nwBuildFmt +from novelwriter.error import logException from novelwriter.common import checkUuid, isHandle, jsonEncode -from novelwriter.constants import nwFiles, nwHeadFmt, nwLabels +from novelwriter.constants import nwFiles, nwHeadFmt from novelwriter.core.item import NWItem from novelwriter.core.project import NWProject -from novelwriter.error import logException logger = logging.getLogger(__name__) @@ -140,7 +141,7 @@ class BuildSettings: self._uuid = str(uuid.uuid4()) self._path = Path.home() self._build = "" - self._format = "odt" + self._format = nwBuildFmt.ODT self._skipRoot = set() self._excluded = set() self._included = set() @@ -175,7 +176,7 @@ class BuildSettings: return self._build @property - def lastFormat(self) -> str: + def lastFormat(self) -> nwBuildFmt: """The last used build format.""" return self._format @@ -252,10 +253,10 @@ class BuildSettings: self._changed = True return - def setLastFormat(self, key: str): + def setLastFormat(self, value: nwBuildFmt): """Set the last used build format.""" - if key in nwLabels.BUILD_FORMATS: - self._format = key + if isinstance(value, nwBuildFmt): + self._format = value self._changed = True return @@ -377,7 +378,7 @@ class BuildSettings: "uuid": self._uuid, "path": str(self._path), "build": self._build, - "format": self._format, + "format": self._format.name, "settings": self._settings.copy(), "content": { "included": list(self._included), @@ -398,7 +399,11 @@ class BuildSettings: self.setBuildID(data.get("uuid", "")) self.setLastPath(data.get("path", None)) self.setLastBuildName(data.get("build", "")) - self.setLastFormat(data.get("format", "odt")) + + buildFmt = str(data.get("build", "")) + if buildFmt in nwBuildFmt.__members__: + self.setLastFormat(nwBuildFmt[buildFmt]) + if isinstance(included, list): self._included = set([h for h in included if isHandle(h)]) if isinstance(excluded, list): diff --git a/novelwriter/core/docbuild.py b/novelwriter/core/docbuild.py index 125d47c5..de3ab546 100644 --- a/novelwriter/core/docbuild.py +++ b/novelwriter/core/docbuild.py @@ -31,6 +31,7 @@ from pathlib import Path from PyQt5.QtGui import QFont, QFontInfo from novelwriter import CONFIG +from novelwriter.enum import nwBuildFmt from novelwriter.error import formatException from novelwriter.core.tomd import ToMarkdown from novelwriter.core.toodt import ToOdt @@ -106,15 +107,15 @@ class NWBuildDocument: self._queue.append(item.itemHandle) return - def iterBuild(self, path: Path, bFormat: str) -> Iterable[tuple[int, bool]]: + def iterBuild(self, path: Path, bFormat: nwBuildFmt) -> Iterable[tuple[int, bool]]: """Wrapper for builders based on format.""" - if bFormat in ("odt", "fodt"): + if bFormat in (nwBuildFmt.ODT, nwBuildFmt.FODT): yield from self.iterBuildOpenDocument(path, bFormat == "fodt") - elif bFormat in ("html", "jhtml"): + elif bFormat in (nwBuildFmt.HTML, nwBuildFmt.J_HTML): yield from self.iterBuildHTML(path if bFormat == "html" else None) - elif bFormat in ("md", "md+"): + elif bFormat in (nwBuildFmt.STD_MD, nwBuildFmt.EXT_MD): yield from self.iterBuildMarkdown(path, bFormat == "md+") - elif bFormat in ("nwd", "jnwd"): + elif bFormat in (nwBuildFmt.NWD, nwBuildFmt.J_NWD): yield from self.iterBuildNovelWriter(path if bFormat == "nwd" else None) return diff --git a/novelwriter/enum.py b/novelwriter/enum.py index d2fcf61b..d96e4b2f 100644 --- a/novelwriter/enum.py +++ b/novelwriter/enum.py @@ -171,3 +171,17 @@ class nwOutline(Enum): SYNOP = 16 # END Enum nwOutline + + +class nwBuildFmt(Enum): + + ODT = 0 + FODT = 1 + HTML = 2 + NWD = 3 + STD_MD = 4 + EXT_MD = 5 + J_HTML = 6 + J_NWD = 7 + +# END Enum nwBuildFormat diff --git a/novelwriter/tools/manusbuild.py b/novelwriter/tools/manusbuild.py index 7468fe51..f00f3bd0 100644 --- a/novelwriter/tools/manusbuild.py +++ b/novelwriter/tools/manusbuild.py @@ -36,10 +36,11 @@ from PyQt5.QtWidgets import ( ) from novelwriter import CONFIG +from novelwriter.enum import nwBuildFmt from novelwriter.common import makeFileNameSafe from novelwriter.constants import nwLabels -from novelwriter.core.docbuild import NWBuildDocument from novelwriter.core.item import NWItem +from novelwriter.core.docbuild import NWBuildDocument from novelwriter.core.buildsettings import BuildSettings if TYPE_CHECKING: @@ -91,9 +92,9 @@ class GuiManuscriptBuild(QDialog): self.listFormats = QListWidget() self.listFormats.setIconSize(QSize(iPx, iPx)) current = None - for key, (_, label) in nwLabels.BUILD_FORMATS.items(): + for key in nwBuildFmt: item = QListWidgetItem() - item.setText(label) + item.setText(nwLabels.BUILD_FMT[key]) item.setData(self.D_KEY, key) self.listFormats.addItem(item) if key == self._build.lastFormat: @@ -275,7 +276,7 @@ class GuiManuscriptBuild(QDialog): def _runBuild(self) -> bool: """Run the currently selected build.""" selFormat = self._getSelectedFormat() - if not selFormat or selFormat not in nwLabels.BUILD_FORMATS: + if not isinstance(selFormat, nwBuildFmt): return False lastName = self.buildName.text().strip() @@ -283,7 +284,7 @@ class GuiManuscriptBuild(QDialog): self._doResetBuildName() lastPath = self._build.lastPath - selExt = nwLabels.BUILD_FORMATS[selFormat][0] + selExt = nwLabels.BUILD_EXT[selFormat] selName = Path(makeFileNameSafe(lastName)).with_suffix(selExt) self.buildProgress.setValue(0) @@ -308,11 +309,11 @@ class GuiManuscriptBuild(QDialog): return True - def _getSelectedFormat(self) -> str | None: + def _getSelectedFormat(self) -> nwBuildFmt | None: """Get the currently selected format.""" items = self.listFormats.selectedItems() if items and isinstance(items[0], QListWidgetItem): - return str(items[0].data(self.D_KEY)) + return items[0].data(self.D_KEY) return None def _saveSettings(self):