diff --git a/novelwriter/core/buildsettings.py b/novelwriter/core/buildsettings.py index 3a7665c8..4081b6dc 100644 --- a/novelwriter/core/buildsettings.py +++ b/novelwriter/core/buildsettings.py @@ -80,6 +80,7 @@ SETTINGS_TEMPLATE = { "format.rightMargin": (float, 2.0), "odt.addColours": (bool, True), "odt.pageHeader": (str, nwHeadFmt.ODT_AUTO), + "odt.pageCountOffset": (int, 0), "html.addStyles": (bool, True), } @@ -127,6 +128,7 @@ SETTINGS_LABELS = { "odt": QT_TRANSLATE_NOOP("Builds", "Open Document (.odt)"), "odt.addColours": QT_TRANSLATE_NOOP("Builds", "Add Highlight Colours"), "odt.pageHeader": QT_TRANSLATE_NOOP("Builds", "Page Header"), + "odt.pageCountOffset": QT_TRANSLATE_NOOP("Builds", "Page Counter Offset"), "html": QT_TRANSLATE_NOOP("Builds", "HTML (.html)"), "html.addStyles": QT_TRANSLATE_NOOP("Builds", "Add CSS Styles"), diff --git a/novelwriter/core/docbuild.py b/novelwriter/core/docbuild.py index e45c5f06..35bfa79d 100644 --- a/novelwriter/core/docbuild.py +++ b/novelwriter/core/docbuild.py @@ -284,7 +284,9 @@ class NWBuildDocument: if isinstance(bldObj, ToOdt): bldObj.setColourHeaders(self._build.getBool("odt.addColours")) bldObj.setLanguage(self._project.data.language) - bldObj.setHeaderFormat(self._build.getStr("odt.pageHeader")) + bldObj.setHeaderFormat( + self._build.getStr("odt.pageHeader"), self._build.getInt("odt.pageCountOffset") + ) scale = nwLabels.UNIT_SCALE.get(self._build.getStr("format.pageUnit"), 1.0) pW, pH = nwLabels.PAPER_SIZE.get(self._build.getStr("format.pageSize"), (-1.0, -1.0)) diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index e173c9de..97201f70 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -137,6 +137,7 @@ class ToOdt(Tokenizer): self._textFixed = False self._colourHead = False self._headerFormat = "" + self._pageOffset = 0 # Internal self._fontFamily = "'Liberation Serif'" @@ -222,9 +223,10 @@ class ToOdt(Tokenizer): self._mDocRight = f"{right/10.0:.3f}cm" return - def setHeaderFormat(self, format: str) -> None: + def setHeaderFormat(self, format: str, offset: int) -> None: """Set the document header format.""" self._headerFormat = format.strip() + self._pageOffset = offset return ## @@ -1023,9 +1025,10 @@ class ToOdt(Tokenizer): }) xPar.text = pre if page: - xTail = ET.SubElement(xPar, _mkTag("text", "page-number"), attrib={ - _mkTag("text", "select-page"): "current" - }) + attrib = {_mkTag("text", "select-page"): "current"} + if self._pageOffset > 0: + attrib = {_mkTag("text", "page-adjust"): str(0 - self._pageOffset)} + xTail = ET.SubElement(xPar, _mkTag("text", "page-number"), attrib=attrib) xTail.text = "2" xTail.tail = post else: diff --git a/novelwriter/tools/manussettings.py b/novelwriter/tools/manussettings.py index 701fe2e4..b62d0491 100644 --- a/novelwriter/tools/manussettings.py +++ b/novelwriter/tools/manussettings.py @@ -1210,6 +1210,7 @@ class _OutputTab(NScrollableForm): self._build = build iPx = SHARED.theme.baseIconSize + spW = 6*SHARED.theme.textNWidth # Open Document self.addGroupLabel(self._build.getLabel("odt")) @@ -1227,6 +1228,13 @@ class _OutputTab(NScrollableForm): button=self.btnPageHeader, stretch=(1, 1) ) + self.odtPageCountOffset = QSpinBox(self) + self.odtPageCountOffset.setMinimum(0) + self.odtPageCountOffset.setMaximum(999) + self.odtPageCountOffset.setSingleStep(1) + self.odtPageCountOffset.setMinimumWidth(spW) + self.addRow(self._build.getLabel("odt.pageCountOffset"), self.odtPageCountOffset) + # HTML Document self.addGroupLabel(self._build.getLabel("html")) @@ -1242,6 +1250,7 @@ class _OutputTab(NScrollableForm): """Populate the widgets.""" self.odtAddColours.setChecked(self._build.getBool("odt.addColours")) self.odtPageHeader.setText(self._build.getStr("odt.pageHeader")) + self.odtPageCountOffset.setValue(self._build.getInt("odt.pageCountOffset")) self.htmlAddStyles.setChecked(self._build.getBool("html.addStyles")) return @@ -1249,6 +1258,7 @@ class _OutputTab(NScrollableForm): """Save choices back into build object.""" self._build.setValue("odt.addColours", self.odtAddColours.isChecked()) self._build.setValue("odt.pageHeader", self.odtPageHeader.text()) + self._build.setValue("odt.pageCountOffset", self.odtPageCountOffset.value()) self._build.setValue("html.addStyles", self.htmlAddStyles.isChecked()) return diff --git a/tests/reference/coreToOdt_SaveFlat_document.fodt b/tests/reference/coreToOdt_SaveFlat_document.fodt index e684d070..29f75d9e 100644 --- a/tests/reference/coreToOdt_SaveFlat_document.fodt +++ b/tests/reference/coreToOdt_SaveFlat_document.fodt @@ -1,13 +1,13 @@ - 2023-10-20T22:51:30 - novelWriter/2.2-alpha1 + 2024-01-28T15:48:36 + novelWriter/2.3a3 Jane Smith 1234 P42DT12H34M56S Test Project - 2023-10-20T22:51:30 + 2024-01-28T15:48:36 Jane Smith @@ -76,7 +76,7 @@ - Test Project / Jane Smith / 2 + Test Project / Jane Smith / 2 diff --git a/tests/test_core/test_core_toodt.py b/tests/test_core/test_core_toodt.py index 3ab402e1..c9039236 100644 --- a/tests/test_core/test_core_toodt.py +++ b/tests/test_core/test_core_toodt.py @@ -693,7 +693,7 @@ def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths): assert odt._dLanguage == "nb" odt.setColourHeaders(True) assert odt._colourHead is True - odt.setHeaderFormat(nwHeadFmt.ODT_AUTO) + odt.setHeaderFormat(nwHeadFmt.ODT_AUTO, 1) assert odt._headerFormat == nwHeadFmt.ODT_AUTO odt.setPageLayout(148, 210, 20, 18, 17, 15) @@ -741,7 +741,7 @@ def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths): odt._isNovel = True # Set a format without page number - odt.setHeaderFormat(f"{nwHeadFmt.ODT_PROJECT} - {nwHeadFmt.ODT_AUTHOR}") + odt.setHeaderFormat(f"{nwHeadFmt.ODT_PROJECT} - {nwHeadFmt.ODT_AUTHOR}", 0) odt._text = ( "## Chapter One\n\n"