Added header anchor tags option to the html generator, and line numbers to the tokens list
This commit is contained in:
+21
-16
@@ -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> " % nwLabels.KEY_NAME[theBits[0]]
|
retText += "<span class='tags'>%s:</span> " % 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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user