# -*- coding: utf-8 -*- """novelWriter HTML Text Converter novelWriter – HTML Text Converter =================================== Extends the Tokenizer class to write HTML File History: Created: 2019-05-07 [0.0.1] """ import logging import re import nw from nw.convert.tokenizer import Tokenizer from nw.constants import nwUnicode, nwLabels logger = logging.getLogger(__name__) class ToHtml(Tokenizer): def __init__(self, theProject, theParent): Tokenizer.__init__(self, theProject, theParent) self.forPreview = False return def setPreview(self, forPreview, doComments): """If we're using this class to generate markdown preview, we need to make a few changes to formatting, which is selected by this flag. """ self.forPreview = forPreview if forPreview: self.doKeywords = True self.doComments = doComments return def doAutoReplace(self): Tokenizer.doAutoReplace(self) if self.forPreview: tabFmt = " "*8 else: tabFmt = " " repDict = { "<" : "<", ">" : ">", "&" : "&", "\t" : tabFmt, nwUnicode.U_ENDASH : nwUnicode.H_ENDASH, nwUnicode.U_EMDASH : nwUnicode.H_EMDASH, nwUnicode.U_HELLIP : nwUnicode.H_HELLIP, nwUnicode.U_NBSP : nwUnicode.H_NBSP, } xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL) self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText) return def doConvert(self): htmlTags = { self.FMT_B_B : "", self.FMT_B_E : "", self.FMT_I_B : "", self.FMT_I_E : "", self.FMT_U_B : "", self.FMT_U_E : "", } self.theResult = "" thisPar = [] for tType, tText, tFormat, tAlign in self.theTokens: aStyle = [] if tAlign == self.A_CENTRE: aStyle.append("text-align: center;") if len(aStyle) > 0: hStyle = " style='%s'" % (" ".join(aStyle)) else: hStyle = "" if tType == self.T_EMPTY: if len(thisPar) > 0: tTemp = "".join(thisPar) self.theResult += "
%s
\n" % (hStyle,tTemp.rstrip()) thisPar = [] elif tType == self.T_HEAD1: self.theResult += "%s
\n" % (hStyle,tText) elif tType == self.T_SKIP: self.theResult += "\n" elif tType == self.T_TEXT: tTemp = tText for xPos, xLen, xFmt in reversed(tFormat): tTemp = tTemp[:xPos]+htmlTags[xFmt]+tTemp[xPos+xLen:] if tText.endswith(" "): thisPar.append(tTemp.rstrip()+"
@%s\n" % tText tText = "@"+tText isValid, theBits, thePos = self.theParent.theIndex.scanThis(tText) if not isValid or not theBits: return "" retText = "" refTags = [] if theBits[0] in nwLabels.KEY_NAME: retText += " " % nwLabels.KEY_NAME[theBits[0]] for tTag in theBits[1:]: refTags.append("%s" % ( theBits[0][1:], tTag, tTag )) retText += ", ".join(refTags) return "
%s
\n" % tText # END Class ToHtml