Added header anchor tags option to the html generator, and line numbers to the tokens list

This commit is contained in:
Veronica K. B. Olsen
2020-05-25 23:30:55 +02:00
parent 3b7927f0ff
commit b3e4af1394
2 changed files with 65 additions and 49 deletions
+21 -16
View File
@@ -143,7 +143,7 @@ class ToHtml(Tokenizer):
parStyle = None parStyle = None
tmpResult = [] tmpResult = []
hasHardBreak = False hasHardBreak = False
for tType, tText, tFormat, tStyle in self.theTokens: for tType, tLine, tText, tFormat, tStyle in self.theTokens:
# Styles # Styles
aStyle = [] aStyle = []
@@ -174,6 +174,11 @@ class ToHtml(Tokenizer):
else: else:
hStyle = "" hStyle = ""
if self.linkHeaders:
aNm = "<a name='head_%s:T%06d'></a>" % (self.theHandle, tLine)
else:
aNm = ""
# Process TextType # Process TextType
if tType == self.T_EMPTY: if tType == self.T_EMPTY:
if parStyle is None: if parStyle is None:
@@ -191,23 +196,23 @@ class ToHtml(Tokenizer):
elif tType == self.T_TITLE: elif tType == self.T_TITLE:
tHead = tText.replace(r"\\", "<br/>") tHead = tText.replace(r"\\", "<br/>")
tmpResult.append("<h1 class='title'%s>%s</h1>\n" % (hStyle, tHead)) tmpResult.append("<h1 class='title'%s>%s%s</h1>\n" % (hStyle, aNm, tHead))
elif tType == self.T_HEAD1: elif tType == self.T_HEAD1:
tHead = tText.replace(r"\\", "<br/>") tHead = tText.replace(r"\\", "<br/>")
tmpResult.append("<%s%s>%s</%s>\n" % (h1, hStyle, tHead, h1)) tmpResult.append("<%s%s>%s%s</%s>\n" % (h1, hStyle, aNm, tHead, h1))
elif tType == self.T_HEAD2: elif tType == self.T_HEAD2:
tHead = tText.replace(r"\\", "<br/>") tHead = tText.replace(r"\\", "<br/>")
tmpResult.append("<%s%s>%s</%s>\n" % (h2, hStyle, tHead, h2)) tmpResult.append("<%s%s>%s%s</%s>\n" % (h2, hStyle, aNm, tHead, h2))
elif tType == self.T_HEAD3: elif tType == self.T_HEAD3:
tHead = tText.replace(r"\\", "<br/>") tHead = tText.replace(r"\\", "<br/>")
tmpResult.append("<%s%s>%s</%s>\n" % (h3, hStyle, tHead, h3)) tmpResult.append("<%s%s>%s%s</%s>\n" % (h3, hStyle, aNm, tHead, h3))
elif tType == self.T_HEAD4: elif tType == self.T_HEAD4:
tHead = tText.replace(r"\\", "<br/>") tHead = tText.replace(r"\\", "<br/>")
tmpResult.append("<%s%s>%s</%s>\n" % (h4, hStyle, tHead, h4)) tmpResult.append("<%s%s>%s%s</%s>\n" % (h4, hStyle, aNm, tHead, h4))
elif tType == self.T_SEP: elif tType == self.T_SEP:
tmpResult.append("<p class='sep'>%s</p>\n" % tText) tmpResult.append("<p class='sep'>%s</p>\n" % tText)
@@ -296,17 +301,17 @@ class ToHtml(Tokenizer):
refTags = [] refTags = []
if theBits[0] in nwLabels.KEY_NAME: if theBits[0] in nwLabels.KEY_NAME:
retText += "<span class='tags'>%s:</span>&nbsp;" % nwLabels.KEY_NAME[theBits[0]] retText += "<span class='tags'>%s:</span>&nbsp;" % nwLabels.KEY_NAME[theBits[0]]
if self.genMode == self.M_PREVIEW: if theBits[0] == nwKeyWords.TAG_KEY:
for tTag in theBits[1:]: retText += "<a name='tag_%s'>%s</a>" % (
refTags.append("<a href='#%s=%s'>%s</a>" % ( theBits[1], theBits[1]
theBits[0][1:], tTag, tTag )
))
retText += ", ".join(refTags)
else: else:
if theBits[0] == nwKeyWords.TAG_KEY: if self.genMode == self.M_PREVIEW:
retText += "<a name='tag_%s'/>%s" % ( for tTag in theBits[1:]:
theBits[1], theBits[1] refTags.append("<a href='#%s=%s'>%s</a>" % (
) theBits[0][1:], tTag, tTag
))
retText += ", ".join(refTags)
else: else:
for tTag in theBits[1:]: for tTag in theBits[1:]:
refTags.append("<a href='#tag_%s'>%s</a>" % ( refTags.append("<a href='#tag_%s'>%s</a>" % (
+44 -33
View File
@@ -102,6 +102,8 @@ class Tokenizer():
self.hideScene = False # Do not include scene headers self.hideScene = False # Do not include scene headers
self.hideSection = False # Do not include section headers self.hideSection = False # Do not include section headers
self.linkHeaders = False # Add an anchor before headers
# Instance Variables # Instance Variables
self.numChapter = 0 # Counter for chapter numbers self.numChapter = 0 # Counter for chapter numbers
self.numChScene = 0 # Counter for scene number within chapter self.numChScene = 0 # Counter for scene number within chapter
@@ -174,6 +176,10 @@ class Tokenizer():
self.hideSection = hideSection self.hideSection = hideSection
return return
def setLinkHeaders(self, linkHeaders):
self.linkHeaders = linkHeaders
return
def setBodyText(self, doBodyText): def setBodyText(self, doBodyText):
self.doBodyText = doBodyText self.doBodyText = doBodyText
return return
@@ -307,12 +313,14 @@ class Tokenizer():
self.theTokens = [] self.theTokens = []
self.theMarkdown = "" self.theMarkdown = ""
tmpMarkdown = [] tmpMarkdown = []
nLine = 0
for aLine in self.theText.splitlines(): for aLine in self.theText.splitlines():
nLine += 1
# Tag lines starting with specific characters # Tag lines starting with specific characters
if len(aLine.strip()) == 0: if len(aLine.strip()) == 0:
self.theTokens.append(( self.theTokens.append((
self.T_EMPTY, "", None, self.A_NONE self.T_EMPTY, nLine, "", None, self.A_NONE
)) ))
tmpMarkdown.append("\n") tmpMarkdown.append("\n")
@@ -320,45 +328,45 @@ class Tokenizer():
cLine = aLine[1:].strip() cLine = aLine[1:].strip()
if cLine.lower().startswith("synopsis:"): if cLine.lower().startswith("synopsis:"):
self.theTokens.append(( self.theTokens.append((
self.T_SYNOPSIS, cLine[9:].strip(), None, self.A_NONE self.T_SYNOPSIS, nLine, cLine[9:].strip(), None, self.A_NONE
)) ))
if self.doSynopsis: if self.doSynopsis:
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
else: else:
self.theTokens.append(( self.theTokens.append((
self.T_COMMENT, aLine[1:].strip(), None, self.A_NONE self.T_COMMENT, nLine, aLine[1:].strip(), None, self.A_NONE
)) ))
if self.doComments: if self.doComments:
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
elif aLine[0] == "@": elif aLine[0] == "@":
self.theTokens.append(( self.theTokens.append((
self.T_KEYWORD, aLine[1:].strip(), None, self.A_NONE self.T_KEYWORD, nLine, aLine[1:].strip(), None, self.A_NONE
)) ))
if self.doKeywords: if self.doKeywords:
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
elif aLine[:2] == "# ": elif aLine[:2] == "# ":
self.theTokens.append(( self.theTokens.append((
self.T_HEAD1, aLine[2:].strip(), None, self.A_NONE self.T_HEAD1, nLine, aLine[2:].strip(), None, self.A_NONE
)) ))
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
elif aLine[:3] == "## ": elif aLine[:3] == "## ":
self.theTokens.append(( self.theTokens.append((
self.T_HEAD2, aLine[3:].strip(), None, self.A_NONE self.T_HEAD2, nLine, aLine[3:].strip(), None, self.A_NONE
)) ))
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
elif aLine[:4] == "### ": elif aLine[:4] == "### ":
self.theTokens.append(( self.theTokens.append((
self.T_HEAD3, aLine[4:].strip(), None, self.A_NONE self.T_HEAD3, nLine, aLine[4:].strip(), None, self.A_NONE
)) ))
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
elif aLine[:5] == "#### ": elif aLine[:5] == "#### ":
self.theTokens.append(( self.theTokens.append((
self.T_HEAD4, aLine[5:].strip(), None, self.A_NONE self.T_HEAD4, nLine, aLine[5:].strip(), None, self.A_NONE
)) ))
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
@@ -383,13 +391,13 @@ class Tokenizer():
# sorted by position # sorted by position
fmtPos = sorted(fmtPos, key=itemgetter(0)) fmtPos = sorted(fmtPos, key=itemgetter(0))
self.theTokens.append(( self.theTokens.append((
self.T_TEXT, aLine, fmtPos, self.A_NONE self.T_TEXT, nLine, aLine, fmtPos, self.A_NONE
)) ))
tmpMarkdown.append("%s\n" % aLine) tmpMarkdown.append("%s\n" % aLine)
# Always add an empty line at the end # Always add an empty line at the end
self.theTokens.append(( self.theTokens.append((
self.T_EMPTY, "", None, self.A_NONE self.T_EMPTY, nLine, "", None, self.A_NONE
)) ))
tmpMarkdown.append("\n") tmpMarkdown.append("\n")
@@ -414,7 +422,8 @@ class Tokenizer():
tToken = self.theTokens[n] tToken = self.theTokens[n]
tType = tToken[0] tType = tToken[0]
tText = tToken[1] tLine = tToken[1]
tText = tToken[2]
# In case we see text before a scene, we reset the flag # In case we see text before a scene, we reset the flag
if tType == self.T_TEXT: if tType == self.T_TEXT:
@@ -426,7 +435,7 @@ class Tokenizer():
tText = self._formatHeading(self.fmtTitle, tText) tText = self._formatHeading(self.fmtTitle, tText)
self.theTokens[n] = ( self.theTokens[n] = (
tType, tText, None, self.A_NONE tType, tLine, tText, None, self.A_NONE
) )
elif tType == self.T_HEAD2: elif tType == self.T_HEAD2:
@@ -442,7 +451,7 @@ class Tokenizer():
# Format the chapter header # Format the chapter header
self.theTokens[n] = ( self.theTokens[n] = (
tType, tText, None, self.A_PBB tType, tLine, tText, None, self.A_PBB
) )
# Set scene variables # Set scene variables
@@ -459,29 +468,29 @@ class Tokenizer():
tTemp = self._formatHeading(self.fmtScene, tText) tTemp = self._formatHeading(self.fmtScene, tText)
if tTemp == "" and self.hideScene: if tTemp == "" and self.hideScene:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_EMPTY, "", None, self.A_NONE self.T_EMPTY, tLine, "", None, self.A_NONE
) )
elif tTemp == "" and not self.hideScene: elif tTemp == "" and not self.hideScene:
if self.firstScene: if self.firstScene:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_EMPTY, "", None, self.A_NONE self.T_EMPTY, tLine, "", None, self.A_NONE
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_SKIP, "", None, self.A_NONE self.T_SKIP, tLine, "", None, self.A_NONE
) )
elif tTemp == self.fmtScene: elif tTemp == self.fmtScene:
if self.firstScene: if self.firstScene:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_EMPTY, "", None, self.A_NONE self.T_EMPTY, tLine, "", None, self.A_NONE
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_SEP, tTemp, None, self.A_CENTRE self.T_SEP, tLine, tTemp, None, self.A_CENTRE
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
tType, tTemp, None, self.A_NONE tType, tLine, tTemp, None, self.A_NONE
) )
# Definitely no longer the first scene # Definitely no longer the first scene
@@ -494,19 +503,19 @@ class Tokenizer():
tTemp = self._formatHeading(self.fmtSection, tText) tTemp = self._formatHeading(self.fmtSection, tText)
if tTemp == "" and self.hideSection: if tTemp == "" and self.hideSection:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_EMPTY, "", None, self.A_NONE self.T_EMPTY, tLine, "", None, self.A_NONE
) )
elif tTemp == "" and not self.hideSection: elif tTemp == "" and not self.hideSection:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_SKIP, "", None, self.A_NONE self.T_SKIP, tLine, "", None, self.A_NONE
) )
elif tTemp == self.fmtSection: elif tTemp == self.fmtSection:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_SEP, tTemp, None, self.A_CENTRE self.T_SEP, tLine, tTemp, None, self.A_CENTRE
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
tType, tTemp, None, self.A_NONE tType, tLine, tTemp, None, self.A_NONE
) )
# For title page and partitions, we need to centre all text. # For title page and partitions, we need to centre all text.
@@ -516,20 +525,21 @@ class Tokenizer():
if self.isTitle or self.isPart: if self.isTitle or self.isPart:
for n, tToken in enumerate(self.theTokens): for n, tToken in enumerate(self.theTokens):
tType = tToken[0] tType = tToken[0]
tText = tToken[1] tLine = tToken[1]
tFormat = tToken[2] tText = tToken[2]
tFormat = tToken[3]
if tType == self.T_HEAD1: if tType == self.T_HEAD1:
if self.isTitle: if self.isTitle:
self.theTokens[n] = ( self.theTokens[n] = (
self.T_TITLE, tText, tFormat, self.A_PBB_NO | self.A_CENTRE self.T_TITLE, tLine, tText, tFormat, self.A_PBB_NO | self.A_CENTRE
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
tType, tText, tFormat, self.A_PBB | self.A_CENTRE tType, tLine, tText, tFormat, self.A_PBB | self.A_CENTRE
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
tType, tText, tFormat, self.A_CENTRE tType, tLine, tText, tFormat, self.A_CENTRE
) )
# Add a page break after the last entry # Add a page break after the last entry
@@ -537,7 +547,7 @@ class Tokenizer():
if n >= 0: if n >= 0:
tToken = self.theTokens[n] tToken = self.theTokens[n]
self.theTokens[n] = ( self.theTokens[n] = (
tToken[0], tToken[1], tToken[2], tToken[3] | self.A_PBA tToken[0], tToken[1], tToken[2], tToken[3], tToken[4] | self.A_PBA
) )
# A single page is always left-aligned and starts on a fresh # A single page is always left-aligned and starts on a fresh
@@ -545,15 +555,16 @@ class Tokenizer():
if self.isPage: if self.isPage:
for n, tToken in enumerate(self.theTokens): for n, tToken in enumerate(self.theTokens):
tType = tToken[0] tType = tToken[0]
tText = tToken[1] tLine = tToken[1]
tFormat = tToken[2] tText = tToken[2]
tFormat = tToken[3]
if n == 0: if n == 0:
self.theTokens[n] = ( self.theTokens[n] = (
tType, tText, tFormat, self.A_LEFT | self.A_PBB tType, tLine, tText, tFormat, self.A_LEFT | self.A_PBB
) )
else: else:
self.theTokens[n] = ( self.theTokens[n] = (
tType, tText, tFormat, self.A_LEFT tType, tLine, tText, tFormat, self.A_LEFT
) )
return return