Clean up old heading format usage

This commit is contained in:
Veronica Berglyd Olsen
2023-05-24 00:50:05 +02:00
parent cd81ea5fbb
commit a1837d8153
6 changed files with 61 additions and 95 deletions
+4 -2
View File
@@ -208,7 +208,7 @@ class nwLabels:
# END Class nwLabels # END Class nwLabels
class nwHeadingFormats: class nwHeadFmt:
TITLE = "{Title}" TITLE = "{Title}"
CH_NUM = "{Chapter}" CH_NUM = "{Chapter}"
@@ -218,7 +218,9 @@ class nwHeadingFormats:
SC_NUM = "{Scene}" SC_NUM = "{Scene}"
SC_ABS = "{Scene:Abs}" SC_ABS = "{Scene:Abs}"
# END Class nwHeadingFormats ALL = [TITLE, CH_NUM, CH_WORD, CH_ROMU, CH_ROML, SC_NUM, SC_ABS]
# END Class nwHeadFmt
class nwQuotes: class nwQuotes:
+4 -4
View File
@@ -36,7 +36,7 @@ from pathlib import Path
from PyQt5.QtCore import QT_TRANSLATE_NOOP from PyQt5.QtCore import QT_TRANSLATE_NOOP
from novelwriter.common import checkUuid, isHandle, jsonEncode from novelwriter.common import checkUuid, isHandle, jsonEncode
from novelwriter.constants import nwConst, nwFiles, nwHeadingFormats from novelwriter.constants import nwConst, nwFiles, nwHeadFmt
from novelwriter.core.item import NWItem from novelwriter.core.item import NWItem
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.error import logException from novelwriter.error import logException
@@ -52,9 +52,9 @@ SETTINGS_TEMPLATE = {
"filter.includeNovel": (bool, True), "filter.includeNovel": (bool, True),
"filter.includeNotes": (bool, False), "filter.includeNotes": (bool, False),
"filter.includeInactive": (bool, False), "filter.includeInactive": (bool, False),
"headings.fmtTitle": (str, nwHeadingFormats.TITLE), "headings.fmtTitle": (str, nwHeadFmt.TITLE),
"headings.fmtChapter": (str, nwHeadingFormats.TITLE), "headings.fmtChapter": (str, nwHeadFmt.TITLE),
"headings.fmtUnnumbered": (str, nwHeadingFormats.TITLE), "headings.fmtUnnumbered": (str, nwHeadFmt.TITLE),
"headings.fmtScene": (str, "* * *"), "headings.fmtScene": (str, "* * *"),
"headings.fmtSection": (str, ""), "headings.fmtSection": (str, ""),
"headings.hideScene": (bool, False), "headings.hideScene": (bool, False),
+16 -16
View File
@@ -35,7 +35,7 @@ from PyQt5.QtCore import QCoreApplication, QRegularExpression
from novelwriter.enum import nwItemLayout, nwItemType from novelwriter.enum import nwItemLayout, nwItemType
from novelwriter.common import numberToRoman, checkInt from novelwriter.common import numberToRoman, checkInt
from novelwriter.constants import nwConst, nwHeadingFormats, nwRegEx, nwUnicode from novelwriter.constants import nwConst, nwHeadFmt, nwRegEx, nwUnicode
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -126,11 +126,11 @@ class Tokenizer(ABC):
self._marginMeta = (0.000, 0.584) self._marginMeta = (0.000, 0.584)
# Title Formats # Title Formats
self._fmtTitle = "%title%" # Formatting for titles self._fmtTitle = nwHeadFmt.TITLE # Formatting for titles
self._fmtChapter = "%title%" # Formatting for numbered chapters self._fmtChapter = nwHeadFmt.TITLE # Formatting for numbered chapters
self._fmtUnNum = "%title%" # Formatting for unnumbered chapters self._fmtUnNum = nwHeadFmt.TITLE # Formatting for unnumbered chapters
self._fmtScene = "%title%" # Formatting for scenes self._fmtScene = nwHeadFmt.TITLE # Formatting for scenes
self._fmtSection = "%title%" # Formatting for sections self._fmtSection = nwHeadFmt.TITLE # Formatting for sections
self._hideScene = False # Do not include scene headers self._hideScene = False # Do not include scene headers
self._hideSection = False # Do not include section headers self._hideSection = False # Do not include section headers
@@ -751,19 +751,19 @@ class HeadingFormatter:
def apply(self, hFormat: str, text: str): def apply(self, hFormat: str, text: str):
"""Apply formatting to a specific heading. """Apply formatting to a specific heading.
""" """
hFormat = hFormat.replace(nwHeadingFormats.TITLE, text) hFormat = hFormat.replace(nwHeadFmt.TITLE, text)
hFormat = hFormat.replace(nwHeadingFormats.CH_NUM, str(self._chCount)) hFormat = hFormat.replace(nwHeadFmt.CH_NUM, str(self._chCount))
hFormat = hFormat.replace(nwHeadingFormats.SC_NUM, str(self._scChCount)) hFormat = hFormat.replace(nwHeadFmt.SC_NUM, str(self._scChCount))
hFormat = hFormat.replace(nwHeadingFormats.SC_ABS, str(self._scAbsCount)) hFormat = hFormat.replace(nwHeadFmt.SC_ABS, str(self._scAbsCount))
if nwHeadingFormats.CH_WORD in hFormat: if nwHeadFmt.CH_WORD in hFormat:
chWord = self._project.localLookup(self._chCount) chWord = self._project.localLookup(self._chCount)
hFormat = hFormat.replace(nwHeadingFormats.CH_WORD, chWord) hFormat = hFormat.replace(nwHeadFmt.CH_WORD, chWord)
if nwHeadingFormats.CH_ROML in hFormat: if nwHeadFmt.CH_ROML in hFormat:
chRom = numberToRoman(self._chCount, True) chRom = numberToRoman(self._chCount, True)
hFormat = hFormat.replace(nwHeadingFormats.CH_ROML, chRom) hFormat = hFormat.replace(nwHeadFmt.CH_ROML, chRom)
if nwHeadingFormats.CH_ROMU in hFormat: if nwHeadFmt.CH_ROMU in hFormat:
chRom = numberToRoman(self._chCount, False) chRom = numberToRoman(self._chCount, False)
hFormat = hFormat.replace(nwHeadingFormats.CH_ROMU, chRom) hFormat = hFormat.replace(nwHeadFmt.CH_ROMU, chRom)
return hFormat return hFormat
+10 -24
View File
@@ -41,7 +41,7 @@ from PyQt5.QtWidgets import (
) )
from novelwriter import CONFIG from novelwriter import CONFIG
from novelwriter.constants import nwConst, nwHeadingFormats from novelwriter.constants import nwConst, nwHeadFmt
from novelwriter.core.buildsettings import BuildSettings, FilterMode from novelwriter.core.buildsettings import BuildSettings, FilterMode
from novelwriter.extensions.switch import NSwitch from novelwriter.extensions.switch import NSwitch
from novelwriter.extensions.switchbox import NSwitchBox from novelwriter.extensions.switchbox import NSwitchBox
@@ -706,13 +706,13 @@ class GuiBuildHeadingsTab(QWidget):
self.aInsScNum = self.menuInsert.addAction(self.tr("Scene Number (In Chapter)")) self.aInsScNum = self.menuInsert.addAction(self.tr("Scene Number (In Chapter)"))
self.aInsScAbs = self.menuInsert.addAction(self.tr("Scene Number (Absolute)")) self.aInsScAbs = self.menuInsert.addAction(self.tr("Scene Number (Absolute)"))
self.aInsTitle.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.TITLE)) self.aInsTitle.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.TITLE))
self.aInsChNum.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.CH_NUM)) self.aInsChNum.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.CH_NUM))
self.aInsChWord.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.CH_WORD)) self.aInsChWord.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.CH_WORD))
self.aInsChRomU.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.CH_ROMU)) self.aInsChRomU.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.CH_ROMU))
self.aInsChRomL.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.CH_ROML)) self.aInsChRomL.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.CH_ROML))
self.aInsScNum.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.SC_NUM)) self.aInsScNum.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.SC_NUM))
self.aInsScAbs.triggered.connect(lambda: self._insertIntoForm(nwHeadingFormats.SC_ABS)) self.aInsScAbs.triggered.connect(lambda: self._insertIntoForm(nwHeadFmt.SC_ABS))
self.btnInsert = QPushButton(self.tr("Insert")) self.btnInsert = QPushButton(self.tr("Insert"))
self.btnInsert.setMenu(self.menuInsert) self.btnInsert.setMenu(self.menuInsert)
@@ -845,31 +845,17 @@ class GuiHeadingSyntax(QSyntaxHighlighter):
def __init__(self, document: QTextDocument, mainTheme: GuiTheme): def __init__(self, document: QTextDocument, mainTheme: GuiTheme):
super().__init__(document) super().__init__(document)
self._valid = [
nwHeadingFormats.TITLE.lower(),
nwHeadingFormats.CH_NUM.lower(),
nwHeadingFormats.CH_WORD.lower(),
nwHeadingFormats.CH_ROMU.lower(),
nwHeadingFormats.CH_ROML.lower(),
nwHeadingFormats.SC_NUM.lower(),
nwHeadingFormats.SC_ABS.lower(),
]
self._fmtSymbol = QTextCharFormat() self._fmtSymbol = QTextCharFormat()
self._fmtSymbol.setForeground(QColor(*mainTheme.colHead)) self._fmtSymbol.setForeground(QColor(*mainTheme.colHead))
self._fmtFormat = QTextCharFormat() self._fmtFormat = QTextCharFormat()
self._fmtFormat.setForeground(QColor(*mainTheme.colEmph)) self._fmtFormat.setForeground(QColor(*mainTheme.colEmph))
return return
def highlightBlock(self, text: str): def highlightBlock(self, text: str):
"""Add syntax highlighting to the text block. """Add syntax highlighting to the text block.
""" """
check = text.lower() for heading in nwHeadFmt.ALL:
for heading in self._valid: pos = text.find(heading)
pos = check.find(heading)
if pos >= 0: if pos >= 0:
chars = len(heading) chars = len(heading)
self.setFormat(pos, chars, self._fmtSymbol) self.setFormat(pos, chars, self._fmtSymbol)
-22
View File
@@ -30,28 +30,6 @@ from tools import ODT_IGNORE, cmpFiles
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.docbuild import NWBuildDocument from novelwriter.core.docbuild import NWBuildDocument
# BUILD_CONF = {
# "format.fmtTitle": "Title: %title%",
# "format.fmtChapter": "Chapter: %title%",
# "format.fmtUnnumbered": "%title%",
# "format.fmtScene": "Scene: %title%",
# "format.fmtSection": "Section: %title%",
# "format.buildLang": "en_GB",
# "format.hideScene": False,
# "format.hideSection": False,
# "format.textFont": "Arial",
# "format.textSize": 12,
# "format.lineHeight": 1.5,
# "format.justifyText": True,
# "format.noStyling": False,
# "format.replaceUCode": False,
# "filter.includeSynopsis": True,
# "filter.includeComments": True,
# "filter.includeKeywords": True,
# "filter.includeBody": True,
# "process.replaceTabs": True,
# }
BUILD_CONF = { BUILD_CONF = {
"name": "Test Build", "name": "Test Build",
"uuid": "f8796eee-e234-4e8a-8355-b2709177e53c", "uuid": "f8796eee-e234-4e8a-8355-b2709177e53c",
+27 -27
View File
@@ -20,10 +20,10 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
""" """
import pytest import pytest
from novelwriter.constants import nwHeadingFormats
from tools import C, buildTestProject, readFile from tools import C, buildTestProject, readFile
from novelwriter.constants import nwHeadFmt
from novelwriter.core.project import NWProject from novelwriter.core.project import NWProject
from novelwriter.core.tokenizer import Tokenizer, stripEscape from novelwriter.core.tokenizer import Tokenizer, stripEscape
@@ -41,11 +41,11 @@ def testCoreToken_Setters(mockGUI):
theToken = BareTokenizer(theProject) theToken = BareTokenizer(theProject)
# Verify defaults # Verify defaults
assert theToken._fmtTitle == "%title%" assert theToken._fmtTitle == nwHeadFmt.TITLE
assert theToken._fmtChapter == "%title%" assert theToken._fmtChapter == nwHeadFmt.TITLE
assert theToken._fmtUnNum == "%title%" assert theToken._fmtUnNum == nwHeadFmt.TITLE
assert theToken._fmtScene == "%title%" assert theToken._fmtScene == nwHeadFmt.TITLE
assert theToken._fmtSection == "%title%" assert theToken._fmtSection == nwHeadFmt.TITLE
assert theToken._textFont == "Serif" assert theToken._textFont == "Serif"
assert theToken._textSize == 11 assert theToken._textSize == 11
assert theToken._textFixed is False assert theToken._textFixed is False
@@ -68,11 +68,11 @@ def testCoreToken_Setters(mockGUI):
assert theToken._doKeywords is False assert theToken._doKeywords is False
# Set new values # Set new values
theToken.setTitleFormat("T: %title%") theToken.setTitleFormat(f"T: {nwHeadFmt.TITLE}")
theToken.setChapterFormat("C: %title%") theToken.setChapterFormat(f"C: {nwHeadFmt.TITLE}")
theToken.setUnNumberedFormat("U: %title%") theToken.setUnNumberedFormat(f"U: {nwHeadFmt.TITLE}")
theToken.setSceneFormat("S: %title%", True) theToken.setSceneFormat(f"S: {nwHeadFmt.TITLE}", True)
theToken.setSectionFormat("X: %title%", True) theToken.setSectionFormat(f"X: {nwHeadFmt.TITLE}", True)
theToken.setFont("Monospace", 10, True) theToken.setFont("Monospace", 10, True)
theToken.setLineHeight(2.0) theToken.setLineHeight(2.0)
theToken.setBlockIndent(6.0) theToken.setBlockIndent(6.0)
@@ -91,11 +91,11 @@ def testCoreToken_Setters(mockGUI):
theToken.setKeywords(True) theToken.setKeywords(True)
# Check new values # Check new values
assert theToken._fmtTitle == "T: %title%" assert theToken._fmtTitle == f"T: {nwHeadFmt.TITLE}"
assert theToken._fmtChapter == "C: %title%" assert theToken._fmtChapter == f"C: {nwHeadFmt.TITLE}"
assert theToken._fmtUnNum == "U: %title%" assert theToken._fmtUnNum == f"U: {nwHeadFmt.TITLE}"
assert theToken._fmtScene == "S: %title%" assert theToken._fmtScene == f"S: {nwHeadFmt.TITLE}"
assert theToken._fmtSection == "X: %title%" assert theToken._fmtSection == f"X: {nwHeadFmt.TITLE}"
assert theToken._textFont == "Monospace" assert theToken._textFont == "Monospace"
assert theToken._textSize == 10 assert theToken._textSize == 10
assert theToken._textFixed is True assert theToken._textFixed is True
@@ -918,7 +918,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H1: Title, First Page # H1: Title, First Page
assert theToken._isFirst is True assert theToken._isFirst is True
theToken._theText = "# Part One\n" theToken._theText = "# Part One\n"
theToken.setTitleFormat(f"T: {nwHeadingFormats.TITLE}") theToken.setTitleFormat(f"T: {nwHeadFmt.TITLE}")
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -929,7 +929,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H1: Title, Not First Page # H1: Title, Not First Page
assert theToken._isFirst is False assert theToken._isFirst is False
theToken._theText = "# Part One\n" theToken._theText = "# Part One\n"
theToken.setTitleFormat(f"T: {nwHeadingFormats.TITLE}") theToken.setTitleFormat(f"T: {nwHeadFmt.TITLE}")
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -942,7 +942,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H2: Chapter # H2: Chapter
theToken._theText = "## Chapter One\n" theToken._theText = "## Chapter One\n"
theToken.setChapterFormat(f"C: {nwHeadingFormats.TITLE}") theToken.setChapterFormat(f"C: {nwHeadFmt.TITLE}")
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -952,7 +952,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H2: Unnumbered Chapter # H2: Unnumbered Chapter
theToken._theText = "##! Prologue\n" theToken._theText = "##! Prologue\n"
theToken.setUnNumberedFormat(f"U: {nwHeadingFormats.TITLE}") theToken.setUnNumberedFormat(f"U: {nwHeadFmt.TITLE}")
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -962,7 +962,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H2: Chapter Word Number # H2: Chapter Word Number
theToken._theText = "## Chapter\n" theToken._theText = "## Chapter\n"
theToken.setChapterFormat(f"Chapter {nwHeadingFormats.CH_WORD}") theToken.setChapterFormat(f"Chapter {nwHeadFmt.CH_WORD}")
theToken._hFormatter._chCount = 0 theToken._hFormatter._chCount = 0
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
@@ -973,7 +973,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H2: Chapter Roman Number Upper Case # H2: Chapter Roman Number Upper Case
theToken._theText = "## Chapter\n" theToken._theText = "## Chapter\n"
theToken.setChapterFormat(f"Chapter {nwHeadingFormats.CH_ROMU}") theToken.setChapterFormat(f"Chapter {nwHeadFmt.CH_ROMU}")
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -983,7 +983,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H2: Chapter Roman Number Lower Case # H2: Chapter Roman Number Lower Case
theToken._theText = "## Chapter\n" theToken._theText = "## Chapter\n"
theToken.setChapterFormat(f"Chapter {nwHeadingFormats.CH_ROML}") theToken.setChapterFormat(f"Chapter {nwHeadFmt.CH_ROML}")
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -996,7 +996,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H3: Scene w/Title # H3: Scene w/Title
theToken._theText = "### Scene One\n" theToken._theText = "### Scene One\n"
theToken.setSceneFormat(f"S: {nwHeadingFormats.TITLE}", False) theToken.setSceneFormat(f"S: {nwHeadFmt.TITLE}", False)
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [
@@ -1060,7 +1060,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H3: Scene w/Absolute Number # H3: Scene w/Absolute Number
theToken._theText = "### A Scene\n" theToken._theText = "### A Scene\n"
theToken.setSceneFormat(f"Scene {nwHeadingFormats.SC_ABS}", False) theToken.setSceneFormat(f"Scene {nwHeadFmt.SC_ABS}", False)
theToken._hFormatter._scAbsCount = 0 theToken._hFormatter._scAbsCount = 0
theToken._hFormatter._scChCount = 0 theToken._hFormatter._scChCount = 0
theToken.tokenizeText() theToken.tokenizeText()
@@ -1072,7 +1072,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H3: Scene w/Chapter Number # H3: Scene w/Chapter Number
theToken._theText = "### A Scene\n" theToken._theText = "### A Scene\n"
theToken.setSceneFormat(f"Scene {nwHeadingFormats.CH_NUM}.{nwHeadingFormats.SC_NUM}", False) theToken.setSceneFormat(f"Scene {nwHeadFmt.CH_NUM}.{nwHeadFmt.SC_NUM}", False)
theToken._hFormatter._scAbsCount = 0 theToken._hFormatter._scAbsCount = 0
theToken._hFormatter._scChCount = 1 theToken._hFormatter._scChCount = 1
theToken.tokenizeText() theToken.tokenizeText()
@@ -1107,7 +1107,7 @@ def testCoreToken_ProcessHeaders(mockGUI):
# H4: Section w/Format # H4: Section w/Format
theToken._theText = "#### A Section\n" theToken._theText = "#### A Section\n"
theToken.setSectionFormat(f"X: {nwHeadingFormats.TITLE}", False) theToken.setSectionFormat(f"X: {nwHeadFmt.TITLE}", False)
theToken.tokenizeText() theToken.tokenizeText()
theToken.doHeaders() theToken.doHeaders()
assert theToken._theTokens == [ assert theToken._theTokens == [