"""
novelWriter – HTML Text Converter
=================================
File History:
Created: 2019-05-07 [0.0.1]
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see ",
self.FMT_D_E: "",
}
if self._isNovel and self._genMode != self.M_PREVIEW:
# For story files, we bump the titles one level up
h1Cl = " class='title'"
h1 = "h1"
h2 = "h1"
h3 = "h2"
h4 = "h3"
else:
h1Cl = ""
h1 = "h1"
h2 = "h2"
h3 = "h3"
h4 = "h4"
self._result = ""
para = []
pStyle = None
lines = []
for tType, tLine, tText, tFormat, tStyle in self._tokens:
# Replace < and > with HTML entities
if tFormat:
# If we have formatting, we must recompute the locations
cText = []
i = 0
for c in tText:
if c == "<":
cText.append("<")
tFormat = [[a + 3 if a > i else a, b, c] for a, b, c in tFormat]
i += 4
elif c == ">":
cText.append(">")
tFormat = [[a + 3 if a > i else a, b, c] for a, b, c in tFormat]
i += 4
else:
cText.append(c)
i += 1
tText = "".join(cText)
else:
# If we don't have formatting, we can do a plain replace
tText = tText.replace("<", "<").replace(">", ">")
# Styles
aStyle = []
if tStyle is not None and self._cssStyles:
if tStyle & self.A_LEFT:
aStyle.append("text-align: left;")
elif tStyle & self.A_RIGHT:
aStyle.append("text-align: right;")
elif tStyle & self.A_CENTRE:
aStyle.append("text-align: center;")
elif tStyle & self.A_JUSTIFY:
aStyle.append("text-align: justify;")
if tStyle & self.A_PBB:
aStyle.append("page-break-before: always;")
if tStyle & self.A_PBA:
aStyle.append("page-break-after: always;")
if tStyle & self.A_Z_BTMMRG:
aStyle.append("margin-bottom: 0;")
if tStyle & self.A_Z_TOPMRG:
aStyle.append("margin-top: 0;")
if tStyle & self.A_IND_L:
aStyle.append(f"margin-left: {CONFIG.tabWidth:d}px;")
if tStyle & self.A_IND_R:
aStyle.append(f"margin-right: {CONFIG.tabWidth:d}px;")
if len(aStyle) > 0:
stVals = " ".join(aStyle)
hStyle = f" style='{stVals}'"
else:
hStyle = ""
if self._linkHeaders:
aNm = f""
else:
aNm = ""
# Process Text Type
if tType == self.T_EMPTY:
if pStyle is None:
pStyle = ""
if len(para) > 1 and self._cssStyles:
pClass = " class='break'"
else:
pClass = ""
if len(para) > 0:
tTemp = "
".join(para)
lines.append(f"
{tTemp.rstrip()}
\n") para = [] pStyle = None elif tType == self.T_TITLE: tHead = tText.replace(nwHeadFmt.BR, "{tText}
\n") elif tType == self.T_SKIP: lines.append(f"\n") elif tType == self.T_TEXT: tTemp = tText if pStyle is None: pStyle = hStyle for xPos, xLen, xFmt in reversed(tFormat): tTemp = tTemp[:xPos] + htmlTags[xFmt] + tTemp[xPos+xLen:] para.append(stripEscape(tTemp.rstrip())) elif tType == self.T_SYNOPSIS and self._doSynopsis: lines.append(self._formatSynopsis(tText)) elif tType == self.T_COMMENT and self._doComments: lines.append(self._formatComments(tText)) elif tType == self.T_KEYWORD and self._doKeywords: tTemp = f"
{self._formatKeywords(tText)}
\n" lines.append(tTemp) self._result = "".join(lines) if self._genMode != self.M_PREVIEW: self._fullHTML.append(self._result) return def saveHtml5(self, path: str | Path) -> None: """Save the data to an HTML file.""" with open(path, mode="w", encoding="utf-8") as fObj: fObj.write(( "\n" "\n" "\n" "\n" "{sSynop}: {text}
\n" else: sSynop = self._localLookup("Synopsis") return f"{sSynop}: {text}
\n" def _formatComments(self, text: str) -> str: """Apply HTML formatting to comments.""" if self._genMode == self.M_PREVIEW: return f"{text}
\n" else: sComm = self._localLookup("Comment") return f"{sComm}: {text}
\n" def _formatKeywords(self, text: str) -> str: """Apply HTML formatting to keywords.""" valid, bits, _ = self._project.index.scanThis("@"+text) if not valid or not bits: return "" result = "" tags = [] if bits[0] in nwLabels.KEY_NAME: result += f" " if len(bits) > 1: if bits[0] == nwKeyWords.TAG_KEY: result += f"{bits[1]}" else: if self._genMode == self.M_PREVIEW: for tTag in bits[1:]: tags.append(f"{tTag}") result += ", ".join(tags) else: for tTag in bits[1:]: tags.append(f"{tTag}") result += ", ".join(tags) return result # END Class ToHtml