From 144ba66d9d7f55946d29b1e1c531dfe78588f3bd Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Wed, 20 Mar 2024 23:44:25 +0100 Subject: [PATCH] Remove redundant variables in tokenizer --- novelwriter/core/tohtml.py | 14 ++++---- novelwriter/core/tokenizer.py | 31 +++++++---------- novelwriter/tools/manuscript.py | 3 ++ tests/test_core/test_core_tohtml.py | 22 ++++++------ tests/test_core/test_core_tokenizer.py | 47 +++----------------------- tests/test_core/test_core_tomd.py | 3 -- 6 files changed, 38 insertions(+), 82 deletions(-) diff --git a/novelwriter/core/tohtml.py b/novelwriter/core/tohtml.py index ed791223..ad548aa6 100644 --- a/novelwriter/core/tohtml.py +++ b/novelwriter/core/tohtml.py @@ -232,8 +232,8 @@ class ToHtml(Tokenizer): else: hStyle = "" - if self._linkHeadings and self._nwItem: - tHH = f"{self._nwItem.itemHandle}:T{nHead:04d}" + if self._linkHeadings and self._handle: + tHH = f"{self._handle}:T{nHead:04d}" aNm = f"" else: tHH = "" @@ -257,31 +257,31 @@ class ToHtml(Tokenizer): tHead = tText.replace(nwHeadFmt.BR, "
") lines.append(f"

{aNm}{tHead}

\n") if tHH: - self._navMap[tHH] = f"TT {tHead}" + self._navMap[tHH] = f"TT:{tHead}" elif tType == self.T_HEAD1: tHead = tText.replace(nwHeadFmt.BR, "
") lines.append(f"<{h1}{h1Cl}{hStyle}>{aNm}{tHead}\n") if tHH: - self._navMap[tHH] = f"H1 {tHead}" + self._navMap[tHH] = f"H1:{tHead}" elif tType == self.T_HEAD2: tHead = tText.replace(nwHeadFmt.BR, "
") lines.append(f"<{h2}{hStyle}>{aNm}{tHead}\n") if tHH: - self._navMap[tHH] = f"H2 {tHead}" + self._navMap[tHH] = f"H2:{tHead}" elif tType == self.T_HEAD3: tHead = tText.replace(nwHeadFmt.BR, "
") lines.append(f"<{h3}{hStyle}>{aNm}{tHead}\n") if tHH: - self._navMap[tHH] = f"H3 {tHead}" + self._navMap[tHH] = f"H3:{tHead}" elif tType == self.T_HEAD4: tHead = tText.replace(nwHeadFmt.BR, "
") lines.append(f"<{h4}{hStyle}>{aNm}{tHead}\n") if tHH: - self._navMap[tHH] = f"H4 {tHead}" + self._navMap[tHH] = f"H4:{tHead}" elif tType == self.T_SEP: lines.append(f"

{tText}

\n") diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index 15de37be..dd30cfc6 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -118,7 +118,7 @@ class Tokenizer(ABC): # Data Variables self._text = "" # The raw text to be tokenized - self._nwItem = None # The NWItem currently being processed + self._handle = None # The item handle currently being processed self._result = "" # The result of the last document self._counts = {} # Counter data @@ -176,9 +176,7 @@ class Tokenizer(ABC): self._noSep = True # Flag to indicate that we don't want a scene separator # This File - self._isNone = False # Document has unknown layout self._isNovel = False # Document is a novel document - self._isNote = False # Document is a project note self._isFirst = True # Document is the first in a set # Error Handling @@ -417,24 +415,21 @@ class Tokenizer(ABC): return True - def setText(self, tHandle: str, text: str | None = None) -> bool: + def setText(self, tHandle: str, text: str | None = None) -> None: """Set the text for the tokenizer from a handle. If text is not - set, load it from the file. + set, its is loaded from the file. """ - self._nwItem = self._project.tree[tHandle] - if self._nwItem is None: - return False + self._text = "" + self._handle = None + if nwItem := self._project.tree[tHandle]: + if text is None: + text = self._project.storage.getDocument(tHandle).readDocument() or "" - if text is None: - text = self._project.storage.getDocument(tHandle).readDocument() or "" + self._text = text + self._handle = tHandle + self._isNovel = nwItem.itemLayout == nwItemLayout.DOCUMENT - self._text = text - - self._isNone = self._nwItem.itemLayout == nwItemLayout.NO_LAYOUT - self._isNovel = self._nwItem.itemLayout == nwItemLayout.DOCUMENT - self._isNote = self._nwItem.itemLayout == nwItemLayout.NOTE - - return True + return def doPreProcessing(self) -> None: """Run trough the various replace dictionaries.""" @@ -470,7 +465,7 @@ class Tokenizer(ABC): """ self._tokens = [] if self._isNovel: - self._hFormatter.setHandle(self._nwItem.itemHandle if self._nwItem else None) + self._hFormatter.setHandle(self._handle) nHead = 0 breakNext = False diff --git a/novelwriter/tools/manuscript.py b/novelwriter/tools/manuscript.py index b213acb2..906b37d5 100644 --- a/novelwriter/tools/manuscript.py +++ b/novelwriter/tools/manuscript.py @@ -707,6 +707,7 @@ class _OutlineWidget(QWidget): root = self.listView.invisibleRootItem() parent = root + indent = False for anchor, text in data.items(): level = OUTLINE_MAP.get(text[:2], -1) text = text[3:] @@ -724,7 +725,9 @@ class _OutlineWidget(QWidget): parent = item elif parent: parent.addChild(item) + indent = True + self.listView.setIndentation(SHARED.theme.baseIconSize if indent else CONFIG.pxInt(4)) self._outline = data return diff --git a/tests/test_core/test_core_tohtml.py b/tests/test_core/test_core_tohtml.py index 9f656ca4..30aefd0a 100644 --- a/tests/test_core/test_core_tohtml.py +++ b/tests/test_core/test_core_tohtml.py @@ -38,7 +38,6 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # =================== html._isNovel = True - html._isNote = False html._isFirst = True # Header 1 @@ -87,33 +86,33 @@ def testCoreToHtml_ConvertHeaders(mockGUI): # ================== html._isNovel = False - html._isNote = True html._isFirst = True + html._handle = "0000000000000" html.setLinkHeadings(True) # Header 1 html._text = "# Heading One\n" html.tokenizeText() html.doConvert() - assert html.result == "

Heading One

\n" + assert html.result == "

Heading One

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

Heading Two

\n" + assert html.result == "

Heading Two

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

Heading Three

\n" + assert html.result == "

Heading Three

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

Heading Four

\n" + assert html.result == "

Heading Four

\n" # Title html._text = "#! Heading One\n" @@ -121,14 +120,14 @@ def testCoreToHtml_ConvertHeaders(mockGUI): html.doConvert() assert html.result == ( "

" - "Heading One

\n" + "Heading One\n" ) # Unnumbered html._text = "##! Heading Two\n" html.tokenizeText() html.doConvert() - assert html.result == "

Heading Two

\n" + assert html.result == "

Heading Two

\n" # END Test testCoreToHtml_ConvertHeaders @@ -140,7 +139,6 @@ def testCoreToHtml_ConvertParagraphs(mockGUI): html = ToHtml(project) html._isNovel = True - html._isNote = False html._isFirst = True # Paragraphs @@ -269,7 +267,7 @@ def testCoreToHtml_ConvertDirect(mockGUI): html = ToHtml(project) html._isNovel = True - html._isNote = False + html._handle = "0000000000000" html.setLinkHeadings(True) # Special Titles @@ -283,7 +281,7 @@ def testCoreToHtml_ConvertDirect(mockGUI): html.doConvert() assert html.result == ( "

" - "A Title

\n" + "A Title\n" ) # Unnumbered @@ -294,7 +292,7 @@ def testCoreToHtml_ConvertDirect(mockGUI): html.doConvert() assert html.result == ( "

" - "Prologue

\n" + "Prologue\n" ) # Separators diff --git a/tests/test_core/test_core_tokenizer.py b/tests/test_core/test_core_tokenizer.py index 30558c9c..68ecfdf7 100644 --- a/tests/test_core/test_core_tokenizer.py +++ b/tests/test_core/test_core_tokenizer.py @@ -199,16 +199,16 @@ def testCoreToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath): ) # Set Text - assert tokens.setText("stuff") is False - assert tokens.setText(C.hSceneDoc) is True + tokens.setText("stuff") + assert tokens._text == "" + + tokens.setText(C.hSceneDoc) assert tokens._text == docText - assert tokens.setText(C.hSceneDoc, docText) is True + tokens.setText(C.hSceneDoc, docText) assert tokens._text == docText - assert tokens._isNone is False assert tokens._isNovel is True - assert tokens._isNote is False # Pre Processing tokens.doPreProcessing() @@ -259,7 +259,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._isFirst = True tokens._text = "#! Novel Title\n" @@ -272,7 +271,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._isFirst = True tokens._text = "#! Note Title\n" @@ -288,7 +286,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._isFirst = True tokens._text = "# Novel Title\n" @@ -301,7 +298,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._isFirst = True tokens._text = "# Note Title\n" @@ -317,7 +313,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._noBreak = False tokens._text = "## Chapter One\n" @@ -330,7 +325,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._text = "## Heading 2\n" tokens.tokenizeText() @@ -345,7 +339,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._text = "### Scene One\n" tokens.tokenizeText() @@ -357,7 +350,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._text = "### Heading 3\n" tokens.tokenizeText() @@ -372,7 +364,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._text = "#### A Section\n" tokens.tokenizeText() @@ -384,7 +375,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._text = "#### Heading 4\n" tokens.tokenizeText() @@ -399,7 +389,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._isFirst = False tokens._text = "#! Title\n" @@ -412,7 +401,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._isFirst = False tokens._text = "#! Title\n" @@ -428,7 +416,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Story File tokens._isNovel = True - tokens._isNote = False tokens._text = "##! Prologue\n" tokens.tokenizeText() @@ -440,7 +427,6 @@ def testCoreToken_HeaderFormat(mockGUI): # Note File tokens._isNovel = False - tokens._isNote = True tokens._text = "##! Prologue\n" tokens.tokenizeText() @@ -479,7 +465,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Novel Docs tokens._isNovel = True - tokens._isNote = False # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_NONE @@ -499,7 +484,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Note Docs tokens._isNovel = False - tokens._isNote = True # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_NONE @@ -530,7 +514,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Novel Docs tokens._isNovel = True - tokens._isNote = False # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_CENTRE @@ -550,7 +533,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Note Docs tokens._isNovel = False - tokens._isNote = True # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_NONE @@ -581,7 +563,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Novel Docs tokens._isNovel = True - tokens._isNote = False # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_PBB @@ -601,7 +582,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Note Docs tokens._isNovel = False - tokens._isNote = True # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_NONE @@ -632,7 +612,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Novel Docs tokens._isNovel = True - tokens._isNote = False # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_CENTRE | Tokenizer.A_PBB @@ -652,7 +631,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Note Docs tokens._isNovel = False - tokens._isNote = True # First Document is False assert processStyle("# Title\n", False) == Tokenizer.A_NONE @@ -673,7 +651,6 @@ def testCoreToken_HeaderStyle(mockGUI): # Check Separation # ================ tokens._isNovel = True - tokens._isNote = False # Title Styles tokens.setTitleStyle(True, True) @@ -1310,8 +1287,6 @@ def testCoreToken_ProcessHeaders(mockGUI): # Story Files ## - tokens._isNone = False - tokens._isNote = False tokens._isNovel = True # Titles @@ -1530,8 +1505,6 @@ def testCoreToken_CountStats(mockGUI, ipsumText): project.data.setLanguage("en") project._loadProjectLocalisation() tokens = BareTokenizer(project) - tokens._isNone = False - tokens._isNote = False tokens._isNovel = True # Short Text @@ -1740,8 +1713,6 @@ def testCoreToken_SceneSeparators(mockGUI): project.data.setLanguage("en") project._loadProjectLocalisation() md = ToMarkdown(project) - md._isNone = False - md._isNote = False md._isNovel = True # Separator Handling, Titles @@ -1858,8 +1829,6 @@ def testCoreToken_SceneSeparators(mockGUI): # Requires a fresh builder class md = ToMarkdown(project) md.setExtendedMarkdown() - md._isNone = False - md._isNote = False md._isNovel = True md._text = ( @@ -1919,8 +1888,6 @@ def testCoreToken_HeaderVisibility(mockGUI): # Novel Files # =========== - md._isNone = False - md._isNote = False md._isNovel = True # Show All @@ -1973,8 +1940,6 @@ def testCoreToken_HeaderVisibility(mockGUI): # Note Files # ========== - md._isNone = False - md._isNote = True md._isNovel = False # Hide All @@ -2015,8 +1980,6 @@ def testCoreToken_CounterHandling(mockGUI): project.data.setLanguage("en") project._loadProjectLocalisation() md = ToMarkdown(project) - md._isNone = False - md._isNote = False md._isNovel = True # Counter Handling, Novel Titles diff --git a/tests/test_core/test_core_tomd.py b/tests/test_core/test_core_tomd.py index c67caf63..2192517f 100644 --- a/tests/test_core/test_core_tomd.py +++ b/tests/test_core/test_core_tomd.py @@ -35,7 +35,6 @@ def testCoreToMarkdown_ConvertHeaders(mockGUI): toMD = ToMarkdown(project) toMD._isNovel = True - toMD._isNote = False toMD._isFirst = True # Header 1 @@ -84,7 +83,6 @@ def testCoreToMarkdown_ConvertParagraphs(mockGUI): toMD = ToMarkdown(project) toMD._isNovel = True - toMD._isNote = False toMD._isFirst = True # Text for Extended Markdown @@ -200,7 +198,6 @@ def testCoreToMarkdown_ConvertDirect(mockGUI): toMD = ToMarkdown(project) toMD._isNovel = True - toMD._isNote = False # Special Titles # ==============