Make sure the tokenizer can handle skipping separators also when there are no other headings (#1756)

This commit is contained in:
Veronica Berglyd Olsen
2024-03-14 22:00:53 +01:00
parent f78f59dc2a
commit b8af6d3990
2 changed files with 87 additions and 7 deletions
+3 -3
View File
@@ -173,7 +173,7 @@ class Tokenizer(ABC):
# Instance Variables
self._hFormatter = HeadingFormatter(self._project)
self._noSep = False # Flag to indicate that we don't want a scene separator
self._noSep = True # Flag to indicate that we don't want a scene separator
# This File
self._isNone = False # Document has unknown layout
@@ -219,7 +219,7 @@ class Tokenizer(ABC):
return self._result
@property
def allMarkdown(self) -> list:
def allMarkdown(self) -> list[str]:
"""The combined novelWriter Markdown text."""
return self._allMarkdown
@@ -229,7 +229,7 @@ class Tokenizer(ABC):
return self._counts
@property
def errData(self) -> list:
def errData(self) -> list[str]:
"""The error data."""
return self._errData
+84 -4
View File
@@ -62,7 +62,11 @@ def testCoreToken_Setters(mockGUI):
assert tokens._marginHead4 == (0.584, 0.500)
assert tokens._marginText == (0.000, 0.584)
assert tokens._marginMeta == (0.000, 0.584)
assert tokens._hideTitle is False
assert tokens._hideChapter is False
assert tokens._hideUnNum is False
assert tokens._hideScene is False
assert tokens._hideHScene is False
assert tokens._hideSection is False
assert tokens._linkHeaders is False
assert tokens._doBodyText is True
@@ -118,6 +122,7 @@ def testCoreToken_Setters(mockGUI):
assert tokens._hideChapter is True
assert tokens._hideUnNum is True
assert tokens._hideScene is True
assert tokens._hideHScene is True
assert tokens._hideSection is True
assert tokens._linkHeaders is True
assert tokens._doBodyText is False
@@ -125,6 +130,12 @@ def testCoreToken_Setters(mockGUI):
assert tokens._doComments is True
assert tokens._doKeywords is True
# Properties
assert tokens.result == ""
assert tokens.allMarkdown == []
assert tokens.textStats == {}
assert tokens.errData == []
# Check Limits
tokens.setLineHeight(0.0)
assert tokens._lineHeight == 0.5
@@ -1844,6 +1855,74 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI):
"Text\n\n"
)
# Show/Hide Headings
# ==================
md._text = (
"#! Novel\n\n"
"# Title One\n\n"
"##! Prologue\n\n"
"Text\n\n"
"## Chapter One\n\n"
"### Scene One\n\n"
"Text\n\n"
"### Scene Two\n\n"
"#### Section Two\n\n"
"Text\n\n"
"## Chapter Two\n\n"
"### Scene Three\n\n"
"Text\n\n"
"###! Scene Four\n\n"
"Text\n\n"
)
# Show All
md.setTitleFormat(nwHeadFmt.TITLE, False)
md.setChapterFormat(nwHeadFmt.TITLE, False)
md.setUnNumberedFormat(nwHeadFmt.TITLE, False)
md.setSceneFormat(nwHeadFmt.TITLE, False)
md.setHardSceneFormat(nwHeadFmt.TITLE, False)
md.setSectionFormat(nwHeadFmt.TITLE, False)
md.tokenizeText()
md.doConvert()
assert md.result == (
"# Novel\n\n"
"# Title One\n\n"
"## Prologue\n\n"
"Text\n\n"
"## Chapter One\n\n"
"### Scene One\n\n"
"Text\n\n"
"### Scene Two\n\n"
"#### Section Two\n\n"
"Text\n\n"
"## Chapter Two\n\n"
"### Scene Three\n\n"
"Text\n\n"
"### Scene Four\n\n"
"Text\n\n"
)
# Hide All
md.setTitleFormat(nwHeadFmt.TITLE, True)
md.setChapterFormat(nwHeadFmt.TITLE, True)
md.setUnNumberedFormat(nwHeadFmt.TITLE, True)
md.setSceneFormat(nwHeadFmt.TITLE, True)
md.setHardSceneFormat(nwHeadFmt.TITLE, True)
md.setSectionFormat(nwHeadFmt.TITLE, True)
md.tokenizeText()
md.doConvert()
assert md.result == (
"# Novel\n\n"
"Text\n\n"
"Text\n\n"
"Text\n\n"
"Text\n\n"
"Text\n\n"
)
# Counter Handling, Novel Titles
# ==============================
# This also checks that only numbered chapters bump the counter
@@ -1878,6 +1957,7 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI):
)
md.setTitleFormat(f"T: {nwHeadFmt.TITLE}")
md.setChapterFormat(f"C {nwHeadFmt.CH_NUM}: {nwHeadFmt.TITLE}")
md.setUnNumberedFormat(f"U: {nwHeadFmt.TITLE}")
md.setSceneFormat(
f"S {nwHeadFmt.CH_NUM}.{nwHeadFmt.SC_NUM} ({nwHeadFmt.SC_ABS}): {nwHeadFmt.TITLE}", False
)
@@ -1891,7 +1971,7 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI):
md.doConvert()
assert md.result == (
"# Novel One\n\n"
"## Prologue\n\n"
"## U: Prologue\n\n"
"Text\n\n"
"## C 1: Chapter One\n\n"
"### S 1.1 (1): Scene One\n\n"
@@ -1904,7 +1984,7 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI):
"### H 2.2 (4): Scene Four\n\n"
"Text\n\n"
"# Novel Two\n\n"
"## Prologue\n\n"
"## U: Prologue\n\n"
"Text\n\n"
"## C 1: Chapter One\n\n"
"### S 1.1 (1): Scene One\n\n"
@@ -1922,7 +2002,7 @@ def testCoreToken_HeaderCounterAndVisibility(mockGUI):
@pytest.mark.core
def testCoreIndex_HeadingFormatter(fncPath, mockRnd):
def testCoreToken_HeadingFormatter(fncPath, mockRnd):
"""Check the HeadingFormatter class."""
project = NWProject()
project.setProjectLang("en_GB")
@@ -2026,4 +2106,4 @@ def testCoreIndex_HeadingFormatter(fncPath, mockRnd):
cFormat = f"Chapter {nwHeadFmt.CH_NUM}, Scene {nwHeadFmt.SC_NUM} - {nwHeadFmt.CHAR_FOCUS}"
assert formatter.apply(cFormat, "Hi Bob", 0) == "Chapter 2, Scene 3 - Focus"
# END Test testCoreIndex_HeadingFormatter
# END Test testCoreToken_HeadingFormatter