Add field value insertion to all formats
This commit is contained in:
@@ -127,16 +127,11 @@ class NWBuildDocument:
|
|||||||
makeObj = ToQTextDocument(self._project)
|
makeObj = ToQTextDocument(self._project)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
makeObj.initDocument()
|
makeObj.initDocument()
|
||||||
|
|
||||||
self._outline = True
|
self._outline = True
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
|
|
||||||
self._error = None
|
self._error = None
|
||||||
self._cache = makeObj
|
self._cache = makeObj
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
def iterBuildDocument(self, path: Path, bFormat: nwBuildFmt) -> Iterable[tuple[int, bool]]:
|
def iterBuildDocument(self, path: Path, bFormat: nwBuildFmt) -> Iterable[tuple[int, bool]]:
|
||||||
@@ -152,18 +147,14 @@ class NWBuildDocument:
|
|||||||
makeObj = ToOdt(self._project, bFormat == nwBuildFmt.FODT)
|
makeObj = ToOdt(self._project, bFormat == nwBuildFmt.FODT)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
makeObj.initDocument()
|
makeObj.initDocument()
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
|
|
||||||
elif bFormat in (nwBuildFmt.HTML, nwBuildFmt.J_HTML):
|
elif bFormat in (nwBuildFmt.HTML, nwBuildFmt.J_HTML):
|
||||||
makeObj = ToHtml(self._project)
|
makeObj = ToHtml(self._project)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
makeObj.initDocument()
|
makeObj.initDocument()
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
if not self._build.getBool("html.preserveTabs"):
|
if not self._build.getBool("html.preserveTabs"):
|
||||||
makeObj.replaceTabs()
|
makeObj.replaceTabs()
|
||||||
@@ -171,9 +162,7 @@ class NWBuildDocument:
|
|||||||
elif bFormat in (nwBuildFmt.STD_MD, nwBuildFmt.EXT_MD):
|
elif bFormat in (nwBuildFmt.STD_MD, nwBuildFmt.EXT_MD):
|
||||||
makeObj = ToMarkdown(self._project, bFormat == nwBuildFmt.EXT_MD)
|
makeObj = ToMarkdown(self._project, bFormat == nwBuildFmt.EXT_MD)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
if self._build.getBool("format.replaceTabs"):
|
if self._build.getBool("format.replaceTabs"):
|
||||||
makeObj.replaceTabs(nSpaces=4, spaceChar=" ")
|
makeObj.replaceTabs(nSpaces=4, spaceChar=" ")
|
||||||
@@ -181,9 +170,7 @@ class NWBuildDocument:
|
|||||||
elif bFormat in (nwBuildFmt.NWD, nwBuildFmt.J_NWD):
|
elif bFormat in (nwBuildFmt.NWD, nwBuildFmt.J_NWD):
|
||||||
makeObj = ToRaw(self._project)
|
makeObj = ToRaw(self._project)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
if self._build.getBool("format.replaceTabs"):
|
if self._build.getBool("format.replaceTabs"):
|
||||||
makeObj.replaceTabs(nSpaces=4, spaceChar=" ")
|
makeObj.replaceTabs(nSpaces=4, spaceChar=" ")
|
||||||
@@ -192,18 +179,14 @@ class NWBuildDocument:
|
|||||||
makeObj = ToDocX(self._project)
|
makeObj = ToDocX(self._project)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
makeObj.initDocument()
|
makeObj.initDocument()
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
|
|
||||||
elif bFormat == nwBuildFmt.PDF:
|
elif bFormat == nwBuildFmt.PDF:
|
||||||
makeObj = ToQTextDocument(self._project)
|
makeObj = ToQTextDocument(self._project)
|
||||||
filtered = self._setupBuild(makeObj)
|
filtered = self._setupBuild(makeObj)
|
||||||
makeObj.initDocument()
|
makeObj.initDocument()
|
||||||
|
|
||||||
yield from self._iterBuild(makeObj, filtered)
|
yield from self._iterBuild(makeObj, filtered)
|
||||||
|
|
||||||
makeObj.closeDocument()
|
makeObj.closeDocument()
|
||||||
|
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -192,6 +192,7 @@ class ToDocX(Tokenizer):
|
|||||||
self._files: dict[str, DocXXmlFile] = {}
|
self._files: dict[str, DocXXmlFile] = {}
|
||||||
self._styles: dict[str, DocXParStyle] = {}
|
self._styles: dict[str, DocXParStyle] = {}
|
||||||
self._usedNotes: dict[str, int] = {}
|
self._usedNotes: dict[str, int] = {}
|
||||||
|
self._usedFields: list[tuple[ET.Element, str]] = []
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -440,6 +441,8 @@ class ToDocX(Tokenizer):
|
|||||||
fLink = ""
|
fLink = ""
|
||||||
elif fFmt == TextFmt.FNOTE:
|
elif fFmt == TextFmt.FNOTE:
|
||||||
xNode = self._generateFootnote(fData)
|
xNode = self._generateFootnote(fData)
|
||||||
|
elif fFmt == TextFmt.FIELD:
|
||||||
|
xNode = self._generateField(fData)
|
||||||
elif fFmt == TextFmt.STRIP:
|
elif fFmt == TextFmt.STRIP:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -510,6 +513,15 @@ class ToDocX(Tokenizer):
|
|||||||
return xR
|
return xR
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _generateField(self, key: str) -> ET.Element | None:
|
||||||
|
"""Generate a data field XML object."""
|
||||||
|
if key and (field := key.partition(":")[2]):
|
||||||
|
xR = ET.Element(_wTag("r"))
|
||||||
|
xT = xmlSubElem(xR, _wTag("t"), "0")
|
||||||
|
self._usedFields.append((xT, field))
|
||||||
|
return xR
|
||||||
|
return None
|
||||||
|
|
||||||
def _generateStyles(self) -> None:
|
def _generateStyles(self) -> None:
|
||||||
"""Generate usable styles."""
|
"""Generate usable styles."""
|
||||||
styles: list[DocXParStyle] = []
|
styles: list[DocXParStyle] = []
|
||||||
@@ -920,6 +932,12 @@ class ToDocX(Tokenizer):
|
|||||||
|
|
||||||
pars.append(par)
|
pars.append(par)
|
||||||
|
|
||||||
|
# Replace fields if there are stats available
|
||||||
|
if self._usedFields and self._counts:
|
||||||
|
for xField, field in self._usedFields:
|
||||||
|
if (value := self._counts.get(field)) is not None:
|
||||||
|
xField.text = f"{value:n}"
|
||||||
|
|
||||||
# Write Paragraphs
|
# Write Paragraphs
|
||||||
for par in pars:
|
for par in pars:
|
||||||
par.toXml(xBody)
|
par.toXml(xBody)
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ class ToHtml(Tokenizer):
|
|||||||
self._trMap = {}
|
self._trMap = {}
|
||||||
self._cssStyles = True
|
self._cssStyles = True
|
||||||
self._usedNotes: dict[str, int] = {}
|
self._usedNotes: dict[str, int] = {}
|
||||||
|
self._usedFields: list[tuple[int, str]] = []
|
||||||
self.setReplaceUnicode(False)
|
self.setReplaceUnicode(False)
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -250,7 +251,15 @@ class ToHtml(Tokenizer):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def closeDocument(self) -> None:
|
def closeDocument(self) -> None:
|
||||||
"""Append the footnotes in the buffer."""
|
"""Run close document tasks."""
|
||||||
|
# Replace fields if there are stats available
|
||||||
|
if self._usedFields and self._counts:
|
||||||
|
pages = len(self._pages)
|
||||||
|
for doc, field in self._usedFields:
|
||||||
|
if doc >= 0 and doc < pages and (value := self._counts.get(field)) is not None:
|
||||||
|
self._pages[doc] = self._pages[doc].replace(f"{{{{{field}}}}}", f"{value:n}")
|
||||||
|
|
||||||
|
# Add footnotes
|
||||||
if self._usedNotes:
|
if self._usedNotes:
|
||||||
footnotes = self._localLookup("Footnotes")
|
footnotes = self._localLookup("Footnotes")
|
||||||
|
|
||||||
@@ -416,6 +425,10 @@ class ToHtml(Tokenizer):
|
|||||||
tags.append((pos, f"<sup><a href='#footnote_{index}'>{index}</a></sup>"))
|
tags.append((pos, f"<sup><a href='#footnote_{index}'>{index}</a></sup>"))
|
||||||
else:
|
else:
|
||||||
tags.append((pos, "<sup>ERR</sup>"))
|
tags.append((pos, "<sup>ERR</sup>"))
|
||||||
|
elif fmt == TextFmt.FIELD:
|
||||||
|
if field := data.partition(":")[2]:
|
||||||
|
self._usedFields.append((len(self._pages), field))
|
||||||
|
tags.append((pos, f"{{{{{field}}}}}"))
|
||||||
|
|
||||||
# Check all format types and close any tag that is still open. This
|
# Check all format types and close any tag that is still open. This
|
||||||
# ensures that unclosed tags don't spill over to the next paragraph.
|
# ensures that unclosed tags don't spill over to the next paragraph.
|
||||||
|
|||||||
@@ -86,6 +86,7 @@ class ToMarkdown(Tokenizer):
|
|||||||
super().__init__(project)
|
super().__init__(project)
|
||||||
self._extended = extended
|
self._extended = extended
|
||||||
self._usedNotes: dict[str, int] = {}
|
self._usedNotes: dict[str, int] = {}
|
||||||
|
self._usedFields: list[tuple[int, str]] = []
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -150,7 +151,15 @@ class ToMarkdown(Tokenizer):
|
|||||||
return
|
return
|
||||||
|
|
||||||
def closeDocument(self) -> None:
|
def closeDocument(self) -> None:
|
||||||
"""Append the footnotes in the buffer."""
|
"""Run close document tasks."""
|
||||||
|
# Replace fields if there are stats available
|
||||||
|
if self._usedFields and self._counts:
|
||||||
|
pages = len(self._pages)
|
||||||
|
for doc, field in self._usedFields:
|
||||||
|
if doc >= 0 and doc < pages and (value := self._counts.get(field)) is not None:
|
||||||
|
self._pages[doc] = self._pages[doc].replace(f"{{{{{field}}}}}", f"{value:n}")
|
||||||
|
|
||||||
|
# Add footnotes
|
||||||
if self._usedNotes:
|
if self._usedNotes:
|
||||||
tags = EXT_MD if self._extended else STD_MD
|
tags = EXT_MD if self._extended else STD_MD
|
||||||
footnotes = self._localLookup("Footnotes")
|
footnotes = self._localLookup("Footnotes")
|
||||||
@@ -196,6 +205,10 @@ class ToMarkdown(Tokenizer):
|
|||||||
md = f"[{index}]"
|
md = f"[{index}]"
|
||||||
else:
|
else:
|
||||||
md = "[ERR]"
|
md = "[ERR]"
|
||||||
|
elif fmt == TextFmt.FIELD:
|
||||||
|
if field := data.partition(":")[2]:
|
||||||
|
self._usedFields.append((len(self._pages), field))
|
||||||
|
md = f"{{{{{field}}}}}"
|
||||||
else:
|
else:
|
||||||
md = tags.get(fmt, "")
|
md = tags.get(fmt, "")
|
||||||
temp = f"{temp[:pos]}{md}{temp[pos:]}"
|
temp = f"{temp[:pos]}{md}{temp[pos:]}"
|
||||||
|
|||||||
@@ -630,6 +630,8 @@ class ToOdt(Tokenizer):
|
|||||||
fLink = ""
|
fLink = ""
|
||||||
elif fFmt == TextFmt.FNOTE:
|
elif fFmt == TextFmt.FNOTE:
|
||||||
xNode = self._generateFootnote(fData)
|
xNode = self._generateFootnote(fData)
|
||||||
|
elif fFmt == TextFmt.FIELD:
|
||||||
|
xNode = self._generateField(fData)
|
||||||
elif fFmt == TextFmt.STRIP:
|
elif fFmt == TextFmt.STRIP:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
@@ -725,6 +727,16 @@ class ToOdt(Tokenizer):
|
|||||||
return xNote
|
return xNote
|
||||||
return None
|
return None
|
||||||
|
|
||||||
|
def _generateField(self, key: str) -> ET.Element | None:
|
||||||
|
"""Generate a data field XML object."""
|
||||||
|
if key and (field := key.partition(":")[2]):
|
||||||
|
xField = ET.Element(_mkTag("text", "user-field-get"), attrib={
|
||||||
|
_mkTag("text", "name"): f"Manuscript{field[:1].upper()}{field[1:]}",
|
||||||
|
})
|
||||||
|
xField.text = "0"
|
||||||
|
return xField
|
||||||
|
return None
|
||||||
|
|
||||||
def _emToCm(self, value: float) -> str:
|
def _emToCm(self, value: float) -> str:
|
||||||
"""Converts an em value to centimetres."""
|
"""Converts an em value to centimetres."""
|
||||||
return f"{value*2.54/72*self._fontSize:.3f}cm"
|
return f"{value*2.54/72*self._fontSize:.3f}cm"
|
||||||
|
|||||||
Reference in New Issue
Block a user