From 53a4725d62b5d319bf6631b4b127be727e2145e4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 2 Mar 2024 17:50:36 +0100 Subject: [PATCH 1/4] Incorporate header formatting into main tokenizer function --- novelwriter/core/tokenizer.py | 171 ++++++++++++++-------------------- 1 file changed, 68 insertions(+), 103 deletions(-) diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index 67871dfb..f34e54b3 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -169,7 +169,7 @@ class Tokenizer(ABC): # Instance Variables self._hFormatter = HeadingFormatter(self._project) - self._skipSeparator = False # Flag to indicate that we skip the scene separator + self._skipSep = False # Flag to indicate that we skip the scene separator # This File self._isNone = False # Document has unknown layout @@ -457,9 +457,12 @@ class Tokenizer(ABC): 5: The style of the block, self.A_* """ self._tokens = [] - tmpMarkdown = [] + if self._isNovel: + self._hFormatter.setHandle(self._nwItem.itemHandle if self._nwItem else None) + nHead = 0 breakNext = False + tmpMarkdown = [] for aLine in self._text.splitlines(): sLine = aLine.strip().lower() @@ -546,32 +549,76 @@ class Tokenizer(ABC): elif aLine[:2] == "# ": nHead += 1 + tText = aLine[2:].strip() + tStyle = self.A_NONE + if self._isNovel: + tText = self._hFormatter.apply(self._fmtTitle, tText, nHead) + tStyle = self._titleStyle + self._skipSep = True + self._hFormatter.resetScene() + self._tokens.append(( - self.T_HEAD1, nHead, aLine[2:].strip(), [], self.A_NONE + self.T_HEAD1, nHead, tText, [], tStyle )) if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) elif aLine[:3] == "## ": nHead += 1 + tText = aLine[3:].strip() + tStyle = self.A_NONE + if self._isNovel: + self._hFormatter.incChapter() + tText = self._hFormatter.apply(self._fmtChapter, tText, nHead) + tStyle = self._chapterStyle + self._skipSep = True + self._hFormatter.resetScene() + self._tokens.append(( - self.T_HEAD2, nHead, aLine[3:].strip(), [], self.A_NONE + self.T_HEAD2, nHead, tText, [], tStyle )) if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) elif aLine[:4] == "### ": nHead += 1 + tText = aLine[4:].strip() + tType = self.T_HEAD3 + tStyle = self.A_NONE + if self._isNovel: + self._hFormatter.incScene() + tText = self._hFormatter.apply(self._fmtScene, tText, nHead) + tStyle = self._sceneStyle + if tText == "": + tType = self.T_EMPTY if self._skipSep or self._hideScene else self.T_SKIP + tStyle = self.A_NONE + elif tText == self._fmtScene: + tText = "" if self._skipSep else tText + tType = self.T_EMPTY if self._skipSep else self.T_SEP + tStyle = self.A_NONE if self._skipSep else self.A_CENTRE + self._skipSep = False + self._tokens.append(( - self.T_HEAD3, nHead, aLine[4:].strip(), [], self.A_NONE + tType, nHead, tText, [], tStyle )) if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) elif aLine[:5] == "#### ": nHead += 1 + tText = aLine[5:].strip() + tType = self.T_HEAD4 + tStyle = self.A_NONE + if self._isNovel: + tText = self._hFormatter.apply(self._fmtSection, tText, nHead) + if tText == "": + tType = self.T_EMPTY if self._hideSection else self.T_SKIP + elif tText == self._fmtSection: + tType = self.T_SEP + tStyle = self.A_CENTRE + self._tokens.append(( - self.T_HEAD4, nHead, aLine[5:].strip(), [], self.A_NONE + tType, nHead, tText, [], tStyle )) if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) @@ -583,13 +630,26 @@ class Tokenizer(ABC): )) if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) + if self._isNovel: + # For new titles, we reset all counters + self._skipSep = True + self._hFormatter.resetAll() elif aLine[:4] == "##! ": nHead += 1 + tText = aLine[4:].strip() + tType = self.T_HEAD2 + tStyle = self.A_NONE + if self._isNovel: + tText = self._hFormatter.apply(self._fmtUnNum, tText, nHead) + tType = self.T_UNNUM + tStyle = self._chapterStyle + self._skipSep = True + self._hFormatter.resetScene() + # If we're not in a novel section, we just treat this as a regular H2 - tStyle = self.T_UNNUM if self._isNovel else self.T_HEAD2 self._tokens.append(( - tStyle, nHead, aLine[4:].strip(), [], self.A_NONE + tType, nHead, tText, [], tStyle )) if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) @@ -691,101 +751,6 @@ class Tokenizer(ABC): """ if not self._isNovel: return False - - self._hFormatter.setHandle(self._nwItem.itemHandle if self._nwItem else None) - - for n, token in enumerate(self._tokens): - - if token[0] == self.T_TITLE: # Title - # For new titles, we reset all counters - self._skipSeparator = True - self._hFormatter.resetAll() - - elif token[0] == self.T_HEAD1: # Partition - - tTemp = self._hFormatter.apply(self._fmtTitle, token[2], token[1]) - self._tokens[n] = ( - token[0], token[1], tTemp, [], self._titleStyle - ) - - # Set scene variables - self._skipSeparator = True - self._hFormatter.resetScene() - - elif token[0] in (self.T_HEAD2, self.T_UNNUM): # Chapter, Unnumbered - - # Numbered or Unnumbered - if token[0] == self.T_UNNUM: - tTemp = self._hFormatter.apply(self._fmtUnNum, token[2], token[1]) - else: - self._hFormatter.incChapter() - tTemp = self._hFormatter.apply(self._fmtChapter, token[2], token[1]) - - # Format the chapter header - self._tokens[n] = ( - token[0], token[1], tTemp, [], self._chapterStyle - ) - - # Set scene variables - self._skipSeparator = True - self._hFormatter.resetScene() - - elif token[0] == self.T_HEAD3: # Scene - - self._hFormatter.incScene() - - tTemp = self._hFormatter.apply(self._fmtScene, token[2], token[1]) - if tTemp == "" and self._hideScene: - self._tokens[n] = ( - self.T_EMPTY, token[1], "", [], self.A_NONE - ) - elif tTemp == "" and not self._hideScene: - self._tokens[n] = ( - self.T_EMPTY if self._skipSeparator else self.T_SKIP, token[1], - "", [], self.A_NONE if self._skipSeparator else token[4] - ) - elif tTemp == self._fmtScene: - self._tokens[n] = ( - self.T_EMPTY if self._skipSeparator else self.T_SEP, token[1], - "" if self._skipSeparator else tTemp, [], - self.A_NONE if self._skipSeparator else self.A_CENTRE - ) - else: - self._tokens[n] = ( - token[0], token[1], tTemp, [], self._sceneStyle - ) - - self._skipSeparator = False - - elif token[0] == self.T_HEAD4: # Section - - tTemp = self._hFormatter.apply(self._fmtSection, token[2], token[1]) - if tTemp == "" and self._hideSection: - self._tokens[n] = ( - self.T_EMPTY, token[1], "", [], self.A_NONE - ) - elif tTemp == "" and not self._hideSection: - self._tokens[n] = ( - self.T_SKIP, token[1], "", [], token[4] - ) - elif tTemp == self._fmtSection: - self._tokens[n] = ( - self.T_SEP, token[1], tTemp, [], token[4] | self.A_CENTRE - ) - else: - self._tokens[n] = ( - token[0], token[1], tTemp, [], token[4] - ) - - if n == 0 and self._noBreak: - # Make sure again that the token array doesn't start with a page break - self._noBreak = False - if self._tokens[0][4] & self.A_PBB: - token = self._tokens[0] - self._tokens[0] = ( - token[0], token[1], token[2], token[3], token[4] & ~self.A_PBB - ) - return True def countStats(self) -> dict[str, int]: From 24ea5f2f2b6922c138482fbf2828ff30dd4e29e0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 2 Mar 2024 17:51:03 +0100 Subject: [PATCH 2/4] Update tests --- tests/test_core/test_core_tokenizer.py | 16 ++++++++-------- tests/test_core/test_core_toodt.py | 1 + 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/test_core/test_core_tokenizer.py b/tests/test_core/test_core_tokenizer.py index e3d16863..f2a8d827 100644 --- a/tests/test_core/test_core_tokenizer.py +++ b/tests/test_core/test_core_tokenizer.py @@ -1437,7 +1437,7 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene wo/Format, first tokens._text = "### Scene One\n" tokens.setSceneFormat("", False) - tokens._skipSeparator = True + tokens._skipSep = True tokens.tokenizeText() tokens.doHeaders() assert tokens._tokens == [ @@ -1448,7 +1448,7 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene wo/Format, not first tokens._text = "### Scene One\n" tokens.setSceneFormat("", False) - tokens._skipSeparator = False + tokens._skipSep = False tokens.tokenizeText() tokens.doHeaders() assert tokens._tokens == [ @@ -1459,7 +1459,7 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene Separator, first tokens._text = "### Scene One\n" tokens.setSceneFormat("* * *", False) - tokens._skipSeparator = True + tokens._skipSep = True tokens.tokenizeText() tokens.doHeaders() assert tokens._tokens == [ @@ -1470,7 +1470,7 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene Separator, not first tokens._text = "### Scene One\n" tokens.setSceneFormat("* * *", False) - tokens._skipSeparator = False + tokens._skipSep = False tokens.tokenizeText() tokens.doHeaders() assert tokens._tokens == [ @@ -1546,18 +1546,18 @@ def testCoreToken_ProcessHeaders(mockGUI): ] # Check the first scene detector, plain text - tokens._skipSeparator = True + tokens._skipSep = True tokens._text = "Some text ...\n" tokens.tokenizeText() tokens.doHeaders() - assert tokens._skipSeparator is True + assert tokens._skipSep is True # Check the first scene detector, text plus scene - tokens._skipSeparator = True + tokens._skipSep = True tokens._text = "Some text ...\n\n### Scene\n\nText" tokens.tokenizeText() tokens.doHeaders() - assert tokens._skipSeparator is False + assert tokens._skipSep is False # END Test testCoreToken_ProcessHeaders diff --git a/tests/test_core/test_core_toodt.py b/tests/test_core/test_core_toodt.py index ccfb3cce..8c4863e7 100644 --- a/tests/test_core/test_core_toodt.py +++ b/tests/test_core/test_core_toodt.py @@ -551,6 +551,7 @@ def testCoreToOdt_ConvertParagraphs(mockGUI): "> Left indent\n\n" "Right indent <\n\n" ) + odt.setSceneFormat(nwHeadFmt.TITLE, False) odt.setKeywords(True) odt.tokenizeText() odt.initDocument() From 37f56a34f421654315d591e6eb752af9920475c2 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 2 Mar 2024 18:21:55 +0100 Subject: [PATCH 3/4] Remove the header processing function and add comments to the tokenizer --- novelwriter/core/docbuild.py | 1 - novelwriter/core/tokenizer.py | 97 +++++++++++++++++++------- novelwriter/text/counting.py | 1 - tests/test_core/test_core_tohtml.py | 15 ---- tests/test_core/test_core_tokenizer.py | 86 +++-------------------- tests/test_core/test_core_toodt.py | 11 --- 6 files changed, 80 insertions(+), 131 deletions(-) diff --git a/novelwriter/core/docbuild.py b/novelwriter/core/docbuild.py index e43816f8..f36d7345 100644 --- a/novelwriter/core/docbuild.py +++ b/novelwriter/core/docbuild.py @@ -352,7 +352,6 @@ class NWBuildDocument: bldObj.setText(tHandle) bldObj.doPreProcessing() bldObj.tokenizeText() - bldObj.doHeaders() if self._count: bldObj.countStats() if convert: diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index f34e54b3..d2281734 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -169,7 +169,7 @@ class Tokenizer(ABC): # Instance Variables self._hFormatter = HeadingFormatter(self._project) - self._skipSep = False # Flag to indicate that we skip the scene separator + self._noSep = False # Flag to indicate that we don't want a scene separator # This File self._isNone = False # Document has unknown layout @@ -486,10 +486,11 @@ class Tokenizer(ABC): # ================= if aLine[0] == "[": - # Parse special formatting line - # This must be a separate if statement, as it may not - # reach a continue statement and must therefore proceed - # to check other formats. + # Special Formats + # =============== + # Parse special formatting line. This must be a separate if + # statement, as it may not reach a continue statement and must + # therefore proceed to check other formats. if sLine in ("[newpage]", "[new page]"): breakNext = True @@ -514,8 +515,12 @@ class Tokenizer(ABC): continue if aLine[0] == "%": + # Comments + # ======== + # All style comments are processed and the exact type exact + # style extracted. Ignored comments on the '%~' format are + # skipped completely. if aLine[1] == "~": - # Completely ignore the paragraph continue cStyle, cText, _ = processComment(aLine) @@ -539,6 +544,11 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) elif aLine[0] == "@": + # Keywords + # ======== + # Only valid keyword lines are parsed, and any ignored keywords + # are automatically skipped. + valid, bits, _ = self._project.index.scanThis(aLine) if valid and bits and bits[0] not in self._skipKeywords: self._tokens.append(( @@ -548,13 +558,19 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) elif aLine[:2] == "# ": + # Partition Headers + # ================= + # Partition headers are only formatted in novel documents, and + # otherwise unchanged. Scene separators are disabled + # immediately after partitions, and scene numbers are reset. + nHead += 1 tText = aLine[2:].strip() tStyle = self.A_NONE if self._isNovel: tText = self._hFormatter.apply(self._fmtTitle, tText, nHead) tStyle = self._titleStyle - self._skipSep = True + self._noSep = True self._hFormatter.resetScene() self._tokens.append(( @@ -564,6 +580,14 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) elif aLine[:3] == "## ": + # Chapter Headers + # =============== + # Chapter headers are only formatted in novel documents, and + # otherwise unchanged. Chapter numbers are bumped before the + # heading is formatted. Scene separators are disabled + # immediately after chapter headers, and scene numbers are + # reset. + nHead += 1 tText = aLine[3:].strip() tStyle = self.A_NONE @@ -571,7 +595,7 @@ class Tokenizer(ABC): self._hFormatter.incChapter() tText = self._hFormatter.apply(self._fmtChapter, tText, nHead) tStyle = self._chapterStyle - self._skipSep = True + self._noSep = True self._hFormatter.resetScene() self._tokens.append(( @@ -581,6 +605,17 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) elif aLine[:4] == "### ": + # Scene Headers + # ============= + # Scene headers in novel documents are treated as centred + # separators if the formatting does not change the text. If the + # format is empty, the scene can be hidden or a blank paragraph + # (skip). When the scene title has static text or no text, it + # is always ignored if the noSep flag is set. This prevents + # separators immediately after other titles. Scene numbers are + # always incremented before formatting. For notes, the header + # is unchanged. + nHead += 1 tText = aLine[4:].strip() tType = self.T_HEAD3 @@ -590,13 +625,13 @@ class Tokenizer(ABC): tText = self._hFormatter.apply(self._fmtScene, tText, nHead) tStyle = self._sceneStyle if tText == "": - tType = self.T_EMPTY if self._skipSep or self._hideScene else self.T_SKIP + tType = self.T_EMPTY if self._noSep or self._hideScene else self.T_SKIP tStyle = self.A_NONE elif tText == self._fmtScene: - tText = "" if self._skipSep else tText - tType = self.T_EMPTY if self._skipSep else self.T_SEP - tStyle = self.A_NONE if self._skipSep else self.A_CENTRE - self._skipSep = False + tText = "" if self._noSep else tText + tType = self.T_EMPTY if self._noSep else self.T_SEP + tStyle = self.A_NONE if self._noSep else self.A_CENTRE + self._noSep = False self._tokens.append(( tType, nHead, tText, [], tStyle @@ -605,6 +640,13 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) elif aLine[:5] == "#### ": + # Section Headers + # =============== + # Section headers in novel docs are treated as centred + # separators if the formatting does not change the text. If the + # format is empty, the section can be hidden or a blank + # paragraph (skip). For notes, the header is unchanged. + nHead += 1 tText = aLine[5:].strip() tType = self.T_HEAD4 @@ -624,6 +666,12 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) elif aLine[:3] == "#! ": + # Main Title + # ========== + # Main titles are allowed in any document, and they are always + # centred and start on a new page. For novel documents, we also + # reset all counters when such a title is encountered. + nHead += 1 self._tokens.append(( self.T_TITLE, nHead, aLine[3:].strip(), [], self.A_PBB | self.A_CENTRE @@ -631,11 +679,15 @@ class Tokenizer(ABC): if self._keepMarkdown: tmpMarkdown.append("%s\n" % aLine) if self._isNovel: - # For new titles, we reset all counters - self._skipSep = True + self._noSep = True self._hFormatter.resetAll() elif aLine[:4] == "##! ": + # Unnumbered Chapter Header + # ========================= + # Unnumbered chapters are only meaningful in Novel docs, so if + # we're in a note, we convert them to a plain level 2 header. + nHead += 1 tText = aLine[4:].strip() tType = self.T_HEAD2 @@ -644,10 +696,9 @@ class Tokenizer(ABC): tText = self._hFormatter.apply(self._fmtUnNum, tText, nHead) tType = self.T_UNNUM tStyle = self._chapterStyle - self._skipSep = True + self._noSep = True self._hFormatter.resetScene() - # If we're not in a novel section, we just treat this as a regular H2 self._tokens.append(( tType, nHead, tText, [], tStyle )) @@ -655,6 +706,10 @@ class Tokenizer(ABC): tmpMarkdown.append("%s\n" % aLine) else: + # Text Lines + # ========== + # Anything remaining at this point is body text. If body text + # is not disabled, we proceed to process text formatting. if not self._doBodyText: # Skip all body text continue @@ -745,14 +800,6 @@ class Tokenizer(ABC): return - def doHeaders(self) -> bool: - """Apply formatting to the text headers for novel files. This - also applies chapter and scene numbering. - """ - if not self._isNovel: - return False - return True - def countStats(self) -> dict[str, int]: """Count stats on the tokenized text.""" titleCount = self._counts.get("titleCount", 0) diff --git a/novelwriter/text/counting.py b/novelwriter/text/counting.py index b381adea..2e3b0ed5 100644 --- a/novelwriter/text/counting.py +++ b/novelwriter/text/counting.py @@ -31,7 +31,6 @@ from novelwriter.constants import nwRegEx, nwUnicode RX_SC = re.compile(nwRegEx.FMT_SC) RX_LO = re.compile(r"(?i)(?{1,2}\s*|\s*<{1,2}$") def preProcessText(text: str, keepHeaders: bool = True) -> list[str]: diff --git a/tests/test_core/test_core_tohtml.py b/tests/test_core/test_core_tohtml.py index 3ccfecf3..b9be9f23 100644 --- a/tests/test_core/test_core_tohtml.py +++ b/tests/test_core/test_core_tohtml.py @@ -44,7 +44,6 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # Header 1 html._text = "# Partition\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == ( "

Partition

\n" @@ -53,7 +52,6 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # Header 2 html._text = "## Chapter Title\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == ( "

Chapter Title

\n" @@ -62,21 +60,18 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # Header 3 html._text = "### Scene Title\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Scene Title

\n" # Header 4 html._text = "#### Section Title\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Section Title

\n" # Title html._text = "#! Title\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == ( "

Title

\n" @@ -85,7 +80,6 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # Unnumbered html._text = "##! Prologue\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Prologue

\n" @@ -100,35 +94,30 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # Header 1 html._text = "# Heading One\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Heading One

\n" # Header 2 html._text = "## Heading Two\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Heading Two

\n" # Header 3 html._text = "### Heading Three\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Heading Three

\n" # Header 4 html._text = "#### Heading Four\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Heading Four

\n" # Title html._text = "#! Heading One\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == ( "

" @@ -138,7 +127,6 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # Unnumbered html._text = "##! Heading Two\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == "

Heading Two

\n" @@ -245,7 +233,6 @@ def testCoreToHtml_ConvertParagraphs(mockGUI): html.setKeywords(True) html._text = "## Chapter\n\n@pov: Bod\n@plot: Main\n@location: Europe\n\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == ( "

Chapter

\n" @@ -477,7 +464,6 @@ def testCoreToHtml_SpecialCases(mockGUI): html._noBreak = False html._text = "## Heading <1>\n" html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == ( "

Heading <1>

\n" @@ -551,7 +537,6 @@ def testCoreToHtml_Complex(mockGUI, fncPath): html._text = docText[i] html.doPreProcessing() html.tokenizeText() - html.doHeaders() html.doConvert() assert html.result == resText[i] diff --git a/tests/test_core/test_core_tokenizer.py b/tests/test_core/test_core_tokenizer.py index f2a8d827..af220f0b 100644 --- a/tests/test_core/test_core_tokenizer.py +++ b/tests/test_core/test_core_tokenizer.py @@ -276,7 +276,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "# Novel Title\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Novel Title", [], Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -290,7 +289,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "# Note Title\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Note Title", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -307,7 +305,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "## Chapter One\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "Chapter One", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -320,7 +317,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "## Heading 2\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "Heading 2", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -336,7 +332,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "### Scene One\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD3, 1, "Scene One", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -349,7 +344,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "### Heading 3\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD3, 1, "Heading 3", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -365,7 +359,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "#### A Section\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD4, 1, "A Section", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -378,7 +371,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "#### Heading 4\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD4, 1, "Heading 4", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -395,7 +387,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "#! Title\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_TITLE, 1, "Title", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -409,7 +400,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "#! Title\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_TITLE, 1, "Title", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -425,7 +415,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "##! Prologue\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_UNNUM, 1, "Prologue", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -438,7 +427,6 @@ def testCoreToken_HeaderFormat(mockGUI): tokens._text = "##! Prologue\n" tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "Prologue", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -459,7 +447,6 @@ def testCoreToken_HeaderStyle(mockGUI): tokens._isFirst = first tokens._noBreak = first tokens.tokenizeText() - tokens.doHeaders() return tokens._tokens[0][4] # No Styles @@ -1120,7 +1107,6 @@ def testCoreToken_SpecialFormat(mockGUI): "# Title Two\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == correctResp # Command w/Space @@ -1131,7 +1117,6 @@ def testCoreToken_SpecialFormat(mockGUI): "# Title Two\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == correctResp # Trailing Spaces @@ -1142,7 +1127,6 @@ def testCoreToken_SpecialFormat(mockGUI): "# Title Two\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == correctResp # Single Empty Paragraph @@ -1154,7 +1138,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1175,7 +1158,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1193,7 +1175,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1213,7 +1194,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1230,7 +1210,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1247,7 +1226,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1268,7 +1246,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1288,7 +1265,6 @@ def testCoreToken_SpecialFormat(mockGUI): "Some text to go here ...\n\n" ) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "Title One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1313,17 +1289,6 @@ def testCoreToken_ProcessHeaders(mockGUI): project._loadProjectLocalisation() tokens = BareTokenizer(project) - # Nothing - tokens._text = "Some text ...\n" - assert tokens.doHeaders() is False - tokens._isNone = True - assert tokens.doHeaders() is False - tokens._isNone = False - assert tokens.doHeaders() is False - tokens._isNote = True - assert tokens.doHeaders() is False - tokens._isNote = False - ## # Story Files ## @@ -1340,7 +1305,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "# Part One\n" tokens.setTitleFormat(f"T: {nwHeadFmt.TITLE}") tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "T: Part One", [], Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1351,7 +1315,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "# Part One\n" tokens.setTitleFormat(f"T: {nwHeadFmt.TITLE}") tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD1, 1, "T: Part One", [], Tokenizer.A_PBB | Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1364,7 +1327,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "## Chapter One\n" tokens.setChapterFormat(f"C: {nwHeadFmt.TITLE}") tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "C: Chapter One", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1374,7 +1336,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "##! Prologue\n" tokens.setUnNumberedFormat(f"U: {nwHeadFmt.TITLE}") tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_UNNUM, 1, "U: Prologue", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1385,7 +1346,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens.setChapterFormat(f"Chapter {nwHeadFmt.CH_WORD}") tokens._hFormatter._chCount = 0 tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "Chapter One", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1395,7 +1355,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "## Chapter\n" tokens.setChapterFormat(f"Chapter {nwHeadFmt.CH_ROMU}") tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "Chapter II", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1405,7 +1364,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "## Chapter\n" tokens.setChapterFormat(f"Chapter {nwHeadFmt.CH_ROML}") tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD2, 1, "Chapter iii", [], Tokenizer.A_PBB), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1418,7 +1376,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "### Scene One\n" tokens.setSceneFormat(f"S: {nwHeadFmt.TITLE}", False) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD3, 1, "S: Scene One", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1428,7 +1385,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "### Scene One\n" tokens.setSceneFormat("", True) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1437,9 +1393,8 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene wo/Format, first tokens._text = "### Scene One\n" tokens.setSceneFormat("", False) - tokens._skipSep = True + tokens._noSep = True tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1448,9 +1403,8 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene wo/Format, not first tokens._text = "### Scene One\n" tokens.setSceneFormat("", False) - tokens._skipSep = False + tokens._noSep = False tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_SKIP, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1459,9 +1413,8 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene Separator, first tokens._text = "### Scene One\n" tokens.setSceneFormat("* * *", False) - tokens._skipSep = True + tokens._noSep = True tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1470,9 +1423,8 @@ def testCoreToken_ProcessHeaders(mockGUI): # H3: Scene Separator, not first tokens._text = "### Scene One\n" tokens.setSceneFormat("* * *", False) - tokens._skipSep = False + tokens._noSep = False tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_SEP, 1, "* * *", [], Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1484,7 +1436,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._hFormatter._scAbsCount = 0 tokens._hFormatter._scChCount = 0 tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD3, 1, "Scene 1", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1496,7 +1447,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._hFormatter._scAbsCount = 0 tokens._hFormatter._scChCount = 1 tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD3, 1, "Scene 3.2", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1509,7 +1459,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "#### A Section\n" tokens.setSectionFormat("", True) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1519,7 +1468,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "#### A Section\n" tokens.setSectionFormat("", False) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_SKIP, 1, "", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1529,7 +1477,6 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "#### A Section\n" tokens.setSectionFormat(f"X: {nwHeadFmt.TITLE}", False) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_HEAD4, 1, "X: A Section", [], Tokenizer.A_NONE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), @@ -1539,25 +1486,22 @@ def testCoreToken_ProcessHeaders(mockGUI): tokens._text = "#### A Section\n" tokens.setSectionFormat("* * *", False) tokens.tokenizeText() - tokens.doHeaders() assert tokens._tokens == [ (Tokenizer.T_SEP, 1, "* * *", [], Tokenizer.A_CENTRE), (Tokenizer.T_EMPTY, 1, "", [], Tokenizer.A_NONE), ] # Check the first scene detector, plain text - tokens._skipSep = True + tokens._noSep = True tokens._text = "Some text ...\n" tokens.tokenizeText() - tokens.doHeaders() - assert tokens._skipSep is True + assert tokens._noSep is True # Check the first scene detector, text plus scene - tokens._skipSep = True + tokens._noSep = True tokens._text = "Some text ...\n\n### Scene\n\nText" tokens.tokenizeText() - tokens.doHeaders() - assert tokens._skipSep is False + assert tokens._noSep is False # END Test testCoreToken_ProcessHeaders @@ -1580,7 +1524,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens._text = "## A Chapter Title\n\n" tokens._counts = {} tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert tokens._tokens[0][2] == "A Chapter Title" assert tokens.textStats == { @@ -1596,7 +1539,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setChapterFormat(f"C {nwHeadFmt.CH_NUM}: {nwHeadFmt.TITLE}") tokens._hFormatter.resetAll() tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert tokens._tokens[0][2] == "C 1: A Chapter Title" assert tokens.textStats == { @@ -1611,7 +1553,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens._text = "Some text\non two lines.\n\nWith a second paragraph.\n\n" tokens._counts = {} tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert tokens.textStats == { "titleCount": 0, "paragraphCount": 2, @@ -1626,7 +1567,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setChapterFormat(nwHeadFmt.TITLE) tokens.setSceneFormat("* * *", False) tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert [t[2] for t in tokens._tokens] == [ "Chapter", "", "", "", "Text", "", "* * *", "", "Text", "" @@ -1646,7 +1586,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setSceneFormat("* * *", False) tokens.setSynopsis(True) tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert [t[2] for t in tokens._tokens] == [ "Chapter", "", "", "", "Stuff", "", "Text", "" @@ -1666,7 +1605,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setSceneFormat("* * *", False) tokens.setSynopsis(True) tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert [t[2] for t in tokens._tokens] == [ "Chapter", "", "", "", "Stuff", "", "Text", "" @@ -1686,7 +1624,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setSceneFormat("* * *", False) tokens.setComments(True) tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert [t[2] for t in tokens._tokens] == [ "Chapter", "", "", "", "Stuff", "", "Text", "" @@ -1706,7 +1643,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setSceneFormat("* * *", False) tokens.setKeywords(True) tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert [t[2] for t in tokens._tokens] == [ "Chapter", "", "", "", "pov: Jane", "", "Text", "" @@ -1769,7 +1705,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): tokens.setKeywords(True) tokens.tokenizeText() - tokens.doHeaders() tokens.countStats() assert tokens.textStats == { "titleCount": 4, "paragraphCount": 5, @@ -1816,7 +1751,6 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI): # Static Separator md.setSceneFormat("* * *", False) md.tokenizeText() - md.doHeaders() md.doConvert() assert md.result == ( "# T: Title One\n\n" @@ -1832,7 +1766,6 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI): # Scene Title Formatted md.setSceneFormat(f"S: {nwHeadFmt.TITLE}", False) md.tokenizeText() - md.doHeaders() md.doConvert() assert md.result == ( "# T: Title One\n\n" @@ -1870,7 +1803,6 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI): # Static Separator md.setSceneFormat("* * *", False) md.tokenizeText() - md.doHeaders() md.doConvert() assert md.result == ( "# T: Title One\n\n" @@ -1887,7 +1819,6 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI): # Scene Title Formatted md.setSceneFormat(f"S: {nwHeadFmt.TITLE}", False) md.tokenizeText() - md.doHeaders() md.doConvert() assert md.result == ( "# T: Title One\n\n" @@ -1938,7 +1869,6 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI): # Two Novel Format md.tokenizeText() - md.doHeaders() md.doConvert() assert md.result == ( "# Novel One\n\n" diff --git a/tests/test_core/test_core_toodt.py b/tests/test_core/test_core_toodt.py index 8c4863e7..eaa808f9 100644 --- a/tests/test_core/test_core_toodt.py +++ b/tests/test_core/test_core_toodt.py @@ -246,7 +246,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI): # Header 1 odt._text = "# Title\n" odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -260,7 +259,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI): # Header 2 odt._text = "## Chapter\n" odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -274,7 +272,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI): # Header 3 odt._text = "### Scene\n" odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -288,7 +285,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI): # Header 4 odt._text = "#### Section\n" odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -303,7 +299,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI): odt._isFirst = True odt._text = "#! Title\n" odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -317,7 +312,6 @@ def testCoreToOdt_ConvertHeaders(mockGUI): # Unnumbered chapter odt._text = "##! Prologue\n" odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -507,7 +501,6 @@ def testCoreToOdt_ConvertParagraphs(mockGUI): odt._text = "### Scene One\n\nText\n\n### Scene Two\n\nText" odt.setSceneFormat("* * *", False) odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -525,7 +518,6 @@ def testCoreToOdt_ConvertParagraphs(mockGUI): odt._text = "### Scene One\n\nText\n\n### Scene Two\n\nText" odt.setSceneFormat("", False) odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -613,7 +605,6 @@ def testCoreToOdt_ConvertParagraphs(mockGUI): "Text\n\n" ) odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -738,7 +729,6 @@ def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths): "Text\n\n" ) odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() @@ -778,7 +768,6 @@ def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths): "Text\n\n" ) odt.tokenizeText() - odt.doHeaders() odt.initDocument() odt.doConvert() odt.closeDocument() From 20c996e87e75c6291787bb6cd576c886f6fc15a7 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 2 Mar 2024 18:23:36 +0100 Subject: [PATCH 4/4] Remove colons from Manuscript GUI --- novelwriter/tools/manuscript.py | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py index 393b0e0a..f2d0117a 100644 --- a/novelwriter/tools/manuscript.py +++ b/novelwriter/tools/manuscript.py @@ -968,10 +968,10 @@ class _StatsWidget(QWidget): """Build the minimal stats page.""" mPx = CONFIG.pxInt(8) - self.lblWordCount = QLabel(self.tr("Words:")) + self.lblWordCount = QLabel(self.tr("Words")) self.minWordCount = QLabel(self) - self.lblCharCount = QLabel(self.tr("Characters:")) + self.lblCharCount = QLabel(self.tr("Characters")) self.minCharCount = QLabel(self) # Assemble @@ -1010,12 +1010,12 @@ class _StatsWidget(QWidget): self.maxParCount.setAlignment(alignRight) self.leftForm = QFormLayout() - self.leftForm.addRow(self.tr("Words:"), self.maxTotalWords) - self.leftForm.addRow(self.tr("Header Words:"), self.maxHeaderWords) - self.leftForm.addRow(self.tr("Body Text Words:"), self.maxTextWords) + self.leftForm.addRow(self.tr("Words"), self.maxTotalWords) + self.leftForm.addRow(self.tr("Header Words"), self.maxHeaderWords) + self.leftForm.addRow(self.tr("Body Text Words"), self.maxTextWords) self.leftForm.addRow("", QLabel(self)) - self.leftForm.addRow(self.tr("Headers:"), self.maxTitleCount) - self.leftForm.addRow(self.tr("Paragraphs:"), self.maxParCount) + self.leftForm.addRow(self.tr("Headers"), self.maxTitleCount) + self.leftForm.addRow(self.tr("Paragraphs"), self.maxParCount) self.leftForm.setHorizontalSpacing(hPx) self.leftForm.setVerticalSpacing(vPx) @@ -1037,12 +1037,12 @@ class _StatsWidget(QWidget): self.maxTextWordChars.setAlignment(alignRight) self.rightForm = QFormLayout() - self.rightForm.addRow(self.tr("Characters:"), self.maxTotalChars) - self.rightForm.addRow(self.tr("Header Characters:"), self.maxHeaderChars) - self.rightForm.addRow(self.tr("Body Text Characters:"), self.maxTextChars) - self.rightForm.addRow(self.tr("Characters, No Spaces:"), self.maxTotalWordChars) - self.rightForm.addRow(self.tr("Header Characters, No Spaces:"), self.maxHeaderWordChars) - self.rightForm.addRow(self.tr("Body Text Characters, No Spaces:"), self.maxTextWordChars) + self.rightForm.addRow(self.tr("Characters"), self.maxTotalChars) + self.rightForm.addRow(self.tr("Header Characters"), self.maxHeaderChars) + self.rightForm.addRow(self.tr("Body Text Characters"), self.maxTextChars) + self.rightForm.addRow(self.tr("Characters, No Spaces"), self.maxTotalWordChars) + self.rightForm.addRow(self.tr("Header Characters, No Spaces"), self.maxHeaderWordChars) + self.rightForm.addRow(self.tr("Body Text Characters, No Spaces"), self.maxTextWordChars) self.rightForm.setHorizontalSpacing(hPx) self.rightForm.setVerticalSpacing(vPx)