diff --git a/novelwriter/core/tohtml.py b/novelwriter/core/tohtml.py index 33e59789..a9ba0bb7 100644 --- a/novelwriter/core/tohtml.py +++ b/novelwriter/core/tohtml.py @@ -29,7 +29,6 @@ import logging from pathlib import Path from time import time -from novelwriter import CONFIG from novelwriter.common import formatTimeStamp from novelwriter.constants import nwHeadFmt, nwHtmlUnicode, nwKeyWords, nwLabels from novelwriter.core.project import NWProject @@ -184,7 +183,6 @@ class ToHtml(Tokenizer): if tStyle & self.A_PBB: aStyle.append("page-break-before: always;") - if tStyle & self.A_PBA: aStyle.append("page-break-after: always;") @@ -194,11 +192,13 @@ class ToHtml(Tokenizer): aStyle.append("margin-top: 0;") if tStyle & self.A_IND_L: - aStyle.append(f"margin-left: {CONFIG.tabWidth:d}px;") + aStyle.append(f"margin-left: {self._blockIndent:.2f}em;") if tStyle & self.A_IND_R: - aStyle.append(f"margin-right: {CONFIG.tabWidth:d}px;") + aStyle.append(f"margin-right: {self._blockIndent:.2f}em;") + if tStyle & self.A_IND_T: + aStyle.append(f"text-indent: {self._firstWidth:.2f}em;") - if len(aStyle) > 0: + if aStyle: stVals = " ".join(aStyle) hStyle = f" style='{stVals}'" else: diff --git a/novelwriter/core/tokenizer.py b/novelwriter/core/tokenizer.py index c8a942dc..314d14a8 100644 --- a/novelwriter/core/tokenizer.py +++ b/novelwriter/core/tokenizer.py @@ -852,6 +852,9 @@ class Tokenizer(ABC): nToken = tokens[n+1] # Look ahead if not self._indentFirst and cToken[0] in self.L_SKIP_INDENT: + # Unless the indentFirst flag is set, we set up the next + # paragraph to not be indented if we see a block of a + # specific type pIndent = False if cToken[0] == self.T_EMPTY: @@ -872,16 +875,27 @@ class Tokenizer(ABC): elif cToken[0] == self.T_TEXT: # Combine lines from the same paragraph pLines.append(cToken) + if nToken[0] != self.T_TEXT: + # Next token is not text, so we add the buffer to tokens nLines = len(pLines) cStyle = pLines[0][4] if self._firstIndent and pIndent and not cStyle & self.M_ALIGNED: + # If paragraph indentation is enabled, not temporarily + # turned off, and the block is not aligned, we add the + # text indentation flag cStyle |= self.A_IND_T + if nLines == 1: + # The paragraph contains a single line, so we just + # save that directly to the token list self._tokens.append(( self.T_TEXT, pLines[0][1], pLines[0][2], pLines[0][3], cStyle )) elif nLines > 1: + # The paragraph contains multiple lines, so we need to + # join them according to the line break policy, and + # recompute all the formatting markers tTxt = "" tFmt: T_Formats = [] for aToken in pLines: @@ -891,6 +905,8 @@ class Tokenizer(ABC): self._tokens.append(( self.T_TEXT, pLines[0][1], tTxt[:-1], tFmt, cStyle )) + + # Reset buffer and make sure text indent is on for next pass pLines = [] pIndent = True diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index 91c924d5..c901db86 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -469,6 +469,8 @@ class ToOdt(Tokenizer): # Process Text Types if tType == self.T_TEXT: + # Text indentation is processed here because there is a + # dedicated pre-defined style for it if tStyle & self.A_IND_T: self._addTextPar(xText, S_FIND, oStyle, tText, tFmt=tFormat) else: