Extend HTML anchor to include handle
This commit is contained in:
@@ -171,6 +171,7 @@ class NWBuildDocument:
|
|||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
|
|
||||||
makeObj.setPreview(self._preview)
|
makeObj.setPreview(self._preview)
|
||||||
|
makeObj.setLinkHeadings(self._preview)
|
||||||
for i, tHandle in enumerate(self._queue):
|
for i, tHandle in enumerate(self._queue):
|
||||||
self._error = None
|
self._error = None
|
||||||
if filtered.get(tHandle, (False, 0))[0]:
|
if filtered.get(tHandle, (False, 0))[0]:
|
||||||
|
|||||||
@@ -55,6 +55,7 @@ class ToHtml(Tokenizer):
|
|||||||
self._genMode = self.M_EXPORT
|
self._genMode = self.M_EXPORT
|
||||||
self._cssStyles = True
|
self._cssStyles = True
|
||||||
self._fullHTML: list[str] = []
|
self._fullHTML: list[str] = []
|
||||||
|
self._navMap: dict[str, str] = {}
|
||||||
|
|
||||||
# Internals
|
# Internals
|
||||||
self._trMap = {}
|
self._trMap = {}
|
||||||
@@ -70,6 +71,10 @@ class ToHtml(Tokenizer):
|
|||||||
def fullHTML(self) -> list[str]:
|
def fullHTML(self) -> list[str]:
|
||||||
return self._fullHTML
|
return self._fullHTML
|
||||||
|
|
||||||
|
@property
|
||||||
|
def navigationMap(self) -> dict[str, str]:
|
||||||
|
return self._navMap
|
||||||
|
|
||||||
##
|
##
|
||||||
# Setters
|
# Setters
|
||||||
##
|
##
|
||||||
@@ -227,9 +232,11 @@ class ToHtml(Tokenizer):
|
|||||||
else:
|
else:
|
||||||
hStyle = ""
|
hStyle = ""
|
||||||
|
|
||||||
if self._linkHeaders:
|
if self._linkHeadings and self._nwItem:
|
||||||
aNm = f"<a name='T{nHead:04d}'></a>"
|
tHH = f"{self._nwItem.itemHandle}:T{nHead:04d}"
|
||||||
|
aNm = f"<a name='{tHH}'></a>"
|
||||||
else:
|
else:
|
||||||
|
tHH = ""
|
||||||
aNm = ""
|
aNm = ""
|
||||||
|
|
||||||
# Process Text Type
|
# Process Text Type
|
||||||
@@ -249,22 +256,32 @@ class ToHtml(Tokenizer):
|
|||||||
elif tType == self.T_TITLE:
|
elif tType == self.T_TITLE:
|
||||||
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
||||||
lines.append(f"<h1 class='title'{hStyle}>{aNm}{tHead}</h1>\n")
|
lines.append(f"<h1 class='title'{hStyle}>{aNm}{tHead}</h1>\n")
|
||||||
|
if tHH:
|
||||||
|
self._navMap[tHH] = f"TT {tHead}"
|
||||||
|
|
||||||
elif tType == self.T_HEAD1:
|
elif tType == self.T_HEAD1:
|
||||||
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
||||||
lines.append(f"<{h1}{h1Cl}{hStyle}>{aNm}{tHead}</{h1}>\n")
|
lines.append(f"<{h1}{h1Cl}{hStyle}>{aNm}{tHead}</{h1}>\n")
|
||||||
|
if tHH:
|
||||||
|
self._navMap[tHH] = f"H1 {tHead}"
|
||||||
|
|
||||||
elif tType == self.T_HEAD2:
|
elif tType == self.T_HEAD2:
|
||||||
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
||||||
lines.append(f"<{h2}{hStyle}>{aNm}{tHead}</{h2}>\n")
|
lines.append(f"<{h2}{hStyle}>{aNm}{tHead}</{h2}>\n")
|
||||||
|
if tHH:
|
||||||
|
self._navMap[tHH] = f"H2 {tHead}"
|
||||||
|
|
||||||
elif tType == self.T_HEAD3:
|
elif tType == self.T_HEAD3:
|
||||||
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
||||||
lines.append(f"<{h3}{hStyle}>{aNm}{tHead}</{h3}>\n")
|
lines.append(f"<{h3}{hStyle}>{aNm}{tHead}</{h3}>\n")
|
||||||
|
if tHH:
|
||||||
|
self._navMap[tHH] = f"H3 {tHead}"
|
||||||
|
|
||||||
elif tType == self.T_HEAD4:
|
elif tType == self.T_HEAD4:
|
||||||
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
tHead = tText.replace(nwHeadFmt.BR, "<br/>")
|
||||||
lines.append(f"<{h4}{hStyle}>{aNm}{tHead}</{h4}>\n")
|
lines.append(f"<{h4}{hStyle}>{aNm}{tHead}</{h4}>\n")
|
||||||
|
if tHH:
|
||||||
|
self._navMap[tHH] = f"H4 {tHead}"
|
||||||
|
|
||||||
elif tType == self.T_SEP:
|
elif tType == self.T_SEP:
|
||||||
lines.append(f"<p class='sep'{hStyle}>{tText}</p>\n")
|
lines.append(f"<p class='sep'{hStyle}>{tText}</p>\n")
|
||||||
|
|||||||
@@ -165,7 +165,7 @@ class Tokenizer(ABC):
|
|||||||
self._hideHScene = False # Do not include hard scene headings
|
self._hideHScene = False # Do not include hard scene headings
|
||||||
self._hideSection = False # Do not include section headings
|
self._hideSection = False # Do not include section headings
|
||||||
|
|
||||||
self._linkHeaders = False # Add an anchor before headings
|
self._linkHeadings = False # Add an anchor before headings
|
||||||
|
|
||||||
self._titleStyle = self.A_CENTRE | self.A_PBB
|
self._titleStyle = self.A_CENTRE | self.A_PBB
|
||||||
self._chapterStyle = self.A_PBB
|
self._chapterStyle = self.A_PBB
|
||||||
@@ -353,7 +353,7 @@ class Tokenizer(ABC):
|
|||||||
|
|
||||||
def setLinkHeadings(self, state: bool) -> None:
|
def setLinkHeadings(self, state: bool) -> None:
|
||||||
"""Enable or disable adding an anchor before headings."""
|
"""Enable or disable adding an anchor before headings."""
|
||||||
self._linkHeaders = state
|
self._linkHeadings = state
|
||||||
return
|
return
|
||||||
|
|
||||||
def setBodyText(self, state: bool) -> None:
|
def setBodyText(self, state: bool) -> None:
|
||||||
|
|||||||
@@ -732,7 +732,8 @@ class GuiDocViewHeader(QWidget):
|
|||||||
|
|
||||||
def setOutline(self, data: dict[int, tuple[str, int]]) -> None:
|
def setOutline(self, data: dict[int, tuple[str, int]]) -> None:
|
||||||
"""Set the document outline dataset."""
|
"""Set the document outline dataset."""
|
||||||
if data != self._docOutline:
|
tHandle = self._docHandle
|
||||||
|
if data != self._docOutline and tHandle:
|
||||||
self.outlineMenu.clear()
|
self.outlineMenu.clear()
|
||||||
entries = []
|
entries = []
|
||||||
minLevel = 5
|
minLevel = 5
|
||||||
@@ -744,7 +745,7 @@ class GuiDocViewHeader(QWidget):
|
|||||||
indent = " "*(level - minLevel)
|
indent = " "*(level - minLevel)
|
||||||
action = self.outlineMenu.addAction(f"{indent}{text}")
|
action = self.outlineMenu.addAction(f"{indent}{text}")
|
||||||
action.triggered.connect(
|
action.triggered.connect(
|
||||||
lambda _, title=title: self.docViewer.navigateTo(f"#{title}")
|
lambda _, title=title: self.docViewer.navigateTo(f"#{tHandle}:{title}")
|
||||||
)
|
)
|
||||||
self._docOutline = data
|
self._docOutline = data
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -653,7 +653,7 @@ class GuiMain(QMainWindow):
|
|||||||
self.docEditor.ensureCursorVisibleNoCentre()
|
self.docEditor.ensureCursorVisibleNoCentre()
|
||||||
|
|
||||||
if sTitle:
|
if sTitle:
|
||||||
self.docViewer.navigateTo(f"#{sTitle}")
|
self.docViewer.navigateTo(f"#{tHandle}:{sTitle}")
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -68,7 +68,7 @@ def testCoreToken_Setters(mockGUI):
|
|||||||
assert tokens._hideScene is False
|
assert tokens._hideScene is False
|
||||||
assert tokens._hideHScene is False
|
assert tokens._hideHScene is False
|
||||||
assert tokens._hideSection is False
|
assert tokens._hideSection is False
|
||||||
assert tokens._linkHeaders is False
|
assert tokens._linkHeadings is False
|
||||||
assert tokens._doBodyText is True
|
assert tokens._doBodyText is True
|
||||||
assert tokens._doSynopsis is False
|
assert tokens._doSynopsis is False
|
||||||
assert tokens._doComments is False
|
assert tokens._doComments is False
|
||||||
@@ -124,7 +124,7 @@ def testCoreToken_Setters(mockGUI):
|
|||||||
assert tokens._hideScene is True
|
assert tokens._hideScene is True
|
||||||
assert tokens._hideHScene is True
|
assert tokens._hideHScene is True
|
||||||
assert tokens._hideSection is True
|
assert tokens._hideSection is True
|
||||||
assert tokens._linkHeaders is True
|
assert tokens._linkHeadings is True
|
||||||
assert tokens._doBodyText is False
|
assert tokens._doBodyText is False
|
||||||
assert tokens._doSynopsis is True
|
assert tokens._doSynopsis is True
|
||||||
assert tokens._doComments is True
|
assert tokens._doComments is True
|
||||||
|
|||||||
Reference in New Issue
Block a user