diff --git a/nw/core/tohtml.py b/nw/core/tohtml.py index 5586575d..a205f6b1 100644 --- a/nw/core/tohtml.py +++ b/nw/core/tohtml.py @@ -78,6 +78,9 @@ class ToHtml(Tokenizer): html entities replacement. """ # Control characters must always be replaced + # This affects alignment and indenting code, so the Tokenizer + # must take this into account when parsing for markup using + # angle brackets. self._trMap = str.maketrans({ "<" : "<", ">" : ">", @@ -181,6 +184,11 @@ class ToHtml(Tokenizer): if tStyle & self.A_Z_TOPMRG: aStyle.append("margin-top: 0;") + if tStyle & self.A_IND_L: + aStyle.append("margin-left: %dpx;" % self.mainConf.tabWidth) + if tStyle & self.A_IND_R: + aStyle.append("margin-right: %dpx;" % self.mainConf.tabWidth) + if len(aStyle) > 0: hStyle = " style='%s'" % (" ".join(aStyle)) else: diff --git a/nw/core/tokenizer.py b/nw/core/tokenizer.py index 97e52717..19d09bc3 100644 --- a/nw/core/tokenizer.py +++ b/nw/core/tokenizer.py @@ -24,6 +24,7 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . """ +import nw import logging import re @@ -82,6 +83,7 @@ class Tokenizer(): self.theProject = theProject self.theParent = theProject.theParent + self.mainConf = nw.CONFIG # Data Variables self.theText = "" # The raw text to be tokenized @@ -97,14 +99,15 @@ class Tokenizer(): self.textFont = "Serif" # Output text font self.textSize = 11 # Output text size self.textFixed = False # Fixed width text - self.lineHeight = 1.15 # Line height + self.lineHeight = 1.15 # Line height in units of em + self.blockIndent = 4.00 # Block indent in units of em self.doJustify = False # Justify text self.doBodyText = True # Include body text self.doSynopsis = False # Also process synopsis comments self.doComments = False # Also process comments self.doKeywords = False # Also process keywords like tags and references - ## Title Margins + ## Margins self.marginTitle = (1.000, 0.500) self.marginHead1 = (1.000, 0.500) self.marginHead2 = (0.834, 0.500) @@ -188,7 +191,11 @@ class Tokenizer(): return def setLineHeight(self, lineHeight): - self.lineHeight = float(lineHeight) + self.lineHeight = min(max(float(lineHeight), 0.5), 5.0) + return + + def setBlockIndent(self, blockIndent): + self.blockIndent = min(max(float(blockIndent), 0.0), 10.0) return def setJustify(self, doJustify): @@ -451,29 +458,29 @@ class Tokenizer(): indRight = False if aLine.startswith(">>"): tagRight = True - aLine = aLine[2:].lstrip() + aLine = aLine[2:].lstrip(" ") elif aLine.startswith(">>"): tagRight = True - aLine = aLine[8:].lstrip() + aLine = aLine[8:].lstrip(" ") elif aLine.startswith(">"): indLeft = True - aLine = aLine[1:].lstrip() + aLine = aLine[1:].lstrip(" ") elif aLine.startswith(">"): indLeft = True - aLine = aLine[4:].lstrip() + aLine = aLine[4:].lstrip(" ") if aLine.endswith("<<"): tagLeft = True - aLine = aLine[:-2].rstrip() + aLine = aLine[:-2].rstrip(" ") elif aLine.endswith("<<"): tagLeft = True - aLine = aLine[:-8].rstrip() + aLine = aLine[:-8].rstrip(" ") elif aLine.endswith("<"): indRight = True - aLine = aLine[:-1].rstrip() + aLine = aLine[:-1].rstrip(" ") elif aLine.endswith("<"): indRight = True - aLine = aLine[:-4].rstrip() + aLine = aLine[:-4].rstrip(" ") textAlign = defAlign if tagLeft and tagRight: diff --git a/nw/core/toodt.py b/nw/core/toodt.py index f5770c9f..b6dd08fc 100644 --- a/nw/core/toodt.py +++ b/nw/core/toodt.py @@ -99,19 +99,20 @@ class ToOdt(Tokenizer): self.headerText = "" # Internal - self._fontFamily = "'Liberation Sans'" - self._fontPitch = "variable" - self._fSizeTitle = "30pt" - self._fSizeHead1 = "24pt" - self._fSizeHead2 = "20pt" - self._fSizeHead3 = "16pt" - self._fSizeHead4 = "14pt" - self._fSizeHead = "14pt" - self._fSizeText = "12pt" - self._lineHeight = "115%" - self._textAlign = "left" - self._dLanguage = "en" - self._dCountry = "GB" + self._fontFamily = "'Liberation Sans'" + self._fontPitch = "variable" + self._fSizeTitle = "30pt" + self._fSizeHead1 = "24pt" + self._fSizeHead2 = "20pt" + self._fSizeHead3 = "16pt" + self._fSizeHead4 = "14pt" + self._fSizeHead = "14pt" + self._fSizeText = "12pt" + self._lineHeight = "115%" + self._blockIndent = "1.693cm" + self._textAlign = "left" + self._dLanguage = "en" + self._dCountry = "GB" ## Text Margings in Units of em self._mTopTitle = "0.423cm" @@ -222,8 +223,9 @@ class ToOdt(Tokenizer): self._colMetaTx = "#813709" self._opaMetaTx = "100%" - self._lineHeight = f"{round(100 * self.lineHeight):d}%" - self._textAlign = "justify" if self.doJustify else "left" + self._lineHeight = f"{round(100 * self.lineHeight):d}%" + self._blockIndent = self._emToCm(self.blockIndent) + self._textAlign = "justify" if self.doJustify else "left" # Document Header # =============== @@ -356,6 +358,11 @@ class ToOdt(Tokenizer): if tStyle & self.A_Z_TOPMRG: oStyle.setMarginTop("0.000cm") + if tStyle & self.A_IND_L: + oStyle.setMarginLeft(self._blockIndent) + if tStyle & self.A_IND_R: + oStyle.setMarginRight(self._blockIndent) + # Process Text Types if tType == self.T_EMPTY: if len(thisPar) > 1 and parStyle is not None: @@ -515,7 +522,7 @@ class ToOdt(Tokenizer): def _formatKeywords(self, tText): """Apply formatting to keywords. """ - isValid, theBits, thePos = self.theParent.theIndex.scanThis("@"+tText) + isValid, theBits, _ = self.theParent.theIndex.scanThis("@"+tText) if not isValid or not theBits: return "" @@ -1008,6 +1015,8 @@ class ODTParagraphStyle(): self._pAttr = { "margin-top": ["fo", None], "margin-bottom": ["fo", None], + "margin-left": ["fo", None], + "margin-right": ["fo", None], "line-height": ["fo", None], "text-align": ["fo", None], "break-before": ["fo", None], @@ -1064,6 +1073,14 @@ class ODTParagraphStyle(): self._pAttr["margin-bottom"][1] = str(theValue) return + def setMarginLeft(self, theValue): + self._pAttr["margin-left"][1] = str(theValue) + return + + def setMarginRight(self, theValue): + self._pAttr["margin-right"][1] = str(theValue) + return + def setLineHeight(self, theValue): self._pAttr["line-height"][1] = str(theValue) return @@ -1142,13 +1159,13 @@ class ODTParagraphStyle(): """Check if there are new settings in refStyle that differ from those in the current object. """ - for aName, (aNm, aVal) in refStyle._mAttr.items(): + for aName, (_, aVal) in refStyle._mAttr.items(): if aVal is not None and aVal != self._mAttr[aName][1]: return True - for aName, (aNm, aVal) in refStyle._pAttr.items(): + for aName, (_, aVal) in refStyle._pAttr.items(): if aVal is not None and aVal != self._pAttr[aName][1]: return True - for aName, (aNm, aVal) in refStyle._tAttr.items(): + for aName, (_, aVal) in refStyle._tAttr.items(): if aVal is not None and aVal != self._tAttr[aName][1]: return True return False