Replace heading field with a general meta data field in the text block tuple
This commit is contained in:
@@ -119,18 +119,21 @@ class BlockFmt(Flag):
|
||||
An enum of flags that can be combined to format a text block.
|
||||
"""
|
||||
|
||||
NONE = 0x0000 # No special style
|
||||
LEFT = 0x0001 # Left aligned
|
||||
RIGHT = 0x0002 # Right aligned
|
||||
CENTRE = 0x0004 # Centred
|
||||
JUSTIFY = 0x0008 # Justified
|
||||
PBB = 0x0010 # Page break before
|
||||
PBA = 0x0020 # Page break after
|
||||
Z_TOPMRG = 0x0040 # Zero top margin
|
||||
Z_BTMMRG = 0x0080 # Zero bottom margin
|
||||
IND_L = 0x0100 # Left indentation
|
||||
IND_R = 0x0200 # Right indentation
|
||||
IND_T = 0x0400 # Text indentation
|
||||
NONE = 0x0000 # No special style
|
||||
LEFT = 0x0001 # Left aligned
|
||||
RIGHT = 0x0002 # Right aligned
|
||||
CENTRE = 0x0004 # Centred
|
||||
JUSTIFY = 0x0008 # Justified
|
||||
PBB = 0x0010 # Page break before
|
||||
PBA = 0x0020 # Page break after
|
||||
Z_TOP = 0x0040 # Zero top margin
|
||||
Z_BTM = 0x0080 # Zero bottom margin
|
||||
IND_L = 0x0100 # Left indentation
|
||||
IND_R = 0x0200 # Right indentation
|
||||
IND_T = 0x0400 # Text indentation
|
||||
|
||||
# Masks
|
||||
ALIGNED = LEFT | RIGHT | CENTRE | JUSTIFY
|
||||
|
||||
|
||||
# Types
|
||||
@@ -145,4 +148,4 @@ T_Note = tuple[str, T_Formats]
|
||||
|
||||
# A tokenized text block, consisting of:
|
||||
# type, header number, text, text formats, and block format
|
||||
T_Block = tuple[BlockTyp, int, str, T_Formats, BlockFmt]
|
||||
T_Block = tuple[BlockTyp, str, str, T_Formats, BlockFmt]
|
||||
|
||||
@@ -240,9 +240,9 @@ class ToDocX(Tokenizer):
|
||||
if tStyle & BlockFmt.PBA:
|
||||
par.setPageBreakAfter(True)
|
||||
|
||||
if tStyle & BlockFmt.Z_BTMMRG:
|
||||
if tStyle & BlockFmt.Z_BTM:
|
||||
par.setMarginBottom(0.0)
|
||||
if tStyle & BlockFmt.Z_TOPMRG:
|
||||
if tStyle & BlockFmt.Z_TOP:
|
||||
par.setMarginTop(0.0)
|
||||
|
||||
if tStyle & BlockFmt.IND_T:
|
||||
|
||||
@@ -157,9 +157,7 @@ class ToHtml(Tokenizer):
|
||||
h4 = "h4"
|
||||
|
||||
lines = []
|
||||
tHandle = self._handle
|
||||
|
||||
for tType, nHead, tText, tFmt, tStyle in self._blocks:
|
||||
for tType, tMeta, tText, tFmt, tStyle in self._blocks:
|
||||
|
||||
# Replace < and > with HTML entities
|
||||
if tFmt:
|
||||
@@ -200,9 +198,9 @@ class ToHtml(Tokenizer):
|
||||
if tStyle & BlockFmt.PBA:
|
||||
aStyle.append("page-break-after: always;")
|
||||
|
||||
if tStyle & BlockFmt.Z_BTMMRG:
|
||||
if tStyle & BlockFmt.Z_BTM:
|
||||
aStyle.append("margin-bottom: 0;")
|
||||
if tStyle & BlockFmt.Z_TOPMRG:
|
||||
if tStyle & BlockFmt.Z_TOP:
|
||||
aStyle.append("margin-top: 0;")
|
||||
|
||||
if tStyle & BlockFmt.IND_L:
|
||||
@@ -218,8 +216,8 @@ class ToHtml(Tokenizer):
|
||||
else:
|
||||
hStyle = ""
|
||||
|
||||
if self._linkHeadings and tHandle:
|
||||
aNm = f"<a name='{tHandle}:T{nHead:04d}'></a>"
|
||||
if self._linkHeadings and tMeta:
|
||||
aNm = f"<a name='{tMeta}'></a>"
|
||||
else:
|
||||
aNm = ""
|
||||
|
||||
@@ -257,7 +255,8 @@ class ToHtml(Tokenizer):
|
||||
lines.append(f"<p class='comment'{hStyle}>{self._formatText(tText, tFmt)}</p>\n")
|
||||
|
||||
elif tType == BlockTyp.KEYWORD:
|
||||
lines.append(f"<p class='meta'{hStyle}>{self._formatText(tText, tFmt)}</p>\n")
|
||||
tClass = f"meta meta-{tMeta}"
|
||||
lines.append(f"<p class='{tClass}'{hStyle}>{self._formatText(tText, tFmt)}</p>\n")
|
||||
|
||||
self._result = "".join(lines)
|
||||
self._fullHTML.append(self._result)
|
||||
|
||||
@@ -60,6 +60,7 @@ class ComStyle(NamedTuple):
|
||||
textClass: str = ""
|
||||
|
||||
|
||||
B_EMPTY: T_Block = (BlockTyp.EMPTY, "", "", [], BlockFmt.NONE)
|
||||
COMMENT_STYLE = {
|
||||
nwComment.PLAIN: ComStyle("Comment", "comment", "comment"),
|
||||
nwComment.IGNORE: ComStyle(),
|
||||
@@ -71,6 +72,13 @@ COMMENT_STYLE = {
|
||||
nwComment.STORY: ComStyle("", "modifier", "note"),
|
||||
}
|
||||
|
||||
# Lookups
|
||||
HEADINGS = [BlockTyp.TITLE, BlockTyp.HEAD1, BlockTyp.HEAD2, BlockTyp.HEAD3, BlockTyp.HEAD4]
|
||||
SKIP_INDENT = [
|
||||
BlockTyp.TITLE, BlockTyp.HEAD1, BlockTyp.HEAD2, BlockTyp.HEAD2, BlockTyp.HEAD3,
|
||||
BlockTyp.HEAD4, BlockTyp.SEP, BlockTyp.SKIP,
|
||||
]
|
||||
|
||||
|
||||
class Tokenizer(ABC):
|
||||
"""Core: Text Tokenizer Abstract Base Class
|
||||
@@ -81,18 +89,6 @@ class Tokenizer(ABC):
|
||||
subclasses.
|
||||
"""
|
||||
|
||||
# Masks
|
||||
M_ALIGNED = BlockFmt.LEFT | BlockFmt.RIGHT | BlockFmt.CENTRE | BlockFmt.JUSTIFY
|
||||
|
||||
# Lookups
|
||||
L_HEADINGS = [
|
||||
BlockTyp.TITLE, BlockTyp.HEAD1, BlockTyp.HEAD2, BlockTyp.HEAD3, BlockTyp.HEAD4,
|
||||
]
|
||||
L_SKIP_INDENT = [
|
||||
BlockTyp.TITLE, BlockTyp.HEAD1, BlockTyp.HEAD2, BlockTyp.HEAD2, BlockTyp.HEAD3,
|
||||
BlockTyp.HEAD4, BlockTyp.SEP, BlockTyp.SKIP,
|
||||
]
|
||||
|
||||
def __init__(self, project: NWProject) -> None:
|
||||
|
||||
self._project = project
|
||||
@@ -487,7 +483,7 @@ class Tokenizer(ABC):
|
||||
title = f"{trNotes}: {tItem.itemName}"
|
||||
self._blocks = []
|
||||
self._blocks.append((
|
||||
BlockTyp.TITLE, 1, title, [], textAlign
|
||||
BlockTyp.TITLE, f"{self._handle}:T0001", title, [], textAlign
|
||||
))
|
||||
if self._keepRaw:
|
||||
self._markdown.append(f"#! {title}\n\n")
|
||||
@@ -538,6 +534,13 @@ class Tokenizer(ABC):
|
||||
4: The internal formatting map of the text, TxtFmt.*
|
||||
5: The formats of the block, BlockFmt.*
|
||||
"""
|
||||
# Cache Flags
|
||||
isNovel = self._isNovel
|
||||
keepRaw = self._keepRaw
|
||||
doJustify = self._doJustify
|
||||
indentFirst = self._indentFirst
|
||||
firstIndent = self._firstIndent
|
||||
|
||||
if self._isNovel:
|
||||
self._hFormatter.setHandle(self._handle)
|
||||
|
||||
@@ -545,18 +548,15 @@ class Tokenizer(ABC):
|
||||
breakNext = False
|
||||
tmpMarkdown = []
|
||||
tHandle = self._handle or ""
|
||||
blocks: list[T_Block] = []
|
||||
tBlocks: list[T_Block] = [B_EMPTY]
|
||||
for aLine in self._text.splitlines():
|
||||
sLine = aLine.strip().lower()
|
||||
|
||||
# Check for blank lines
|
||||
if len(sLine) == 0:
|
||||
blocks.append((
|
||||
BlockTyp.EMPTY, nHead, "", [], BlockFmt.NONE
|
||||
))
|
||||
if self._keepRaw:
|
||||
if not sLine:
|
||||
tBlocks.append(B_EMPTY)
|
||||
if keepRaw:
|
||||
tmpMarkdown.append("\n")
|
||||
|
||||
continue
|
||||
|
||||
if breakNext:
|
||||
@@ -580,20 +580,20 @@ class Tokenizer(ABC):
|
||||
continue
|
||||
|
||||
elif sLine == "[vspace]":
|
||||
blocks.append(
|
||||
(BlockTyp.SKIP, nHead, "", [], sAlign)
|
||||
tBlocks.append(
|
||||
(BlockTyp.SKIP, "", "", [], sAlign)
|
||||
)
|
||||
continue
|
||||
|
||||
elif sLine.startswith("[vspace:") and sLine.endswith("]"):
|
||||
nSkip = checkInt(sLine[8:-1], 0)
|
||||
if nSkip >= 1:
|
||||
blocks.append(
|
||||
(BlockTyp.SKIP, nHead, "", [], sAlign)
|
||||
tBlocks.append(
|
||||
(BlockTyp.SKIP, "", "", [], sAlign)
|
||||
)
|
||||
if nSkip > 1:
|
||||
blocks += (nSkip - 1) * [
|
||||
(BlockTyp.SKIP, nHead, "", [], BlockFmt.NONE)
|
||||
tBlocks += (nSkip - 1) * [
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE)
|
||||
]
|
||||
continue
|
||||
|
||||
@@ -612,22 +612,22 @@ class Tokenizer(ABC):
|
||||
if cStyle == nwComment.PLAIN and not self._doComments:
|
||||
continue
|
||||
|
||||
if self._doJustify and not sAlign & self.M_ALIGNED:
|
||||
if doJustify and not sAlign & BlockFmt.ALIGNED:
|
||||
sAlign |= BlockFmt.JUSTIFY
|
||||
|
||||
if cStyle in (nwComment.SYNOPSIS, nwComment.SHORT, nwComment.PLAIN):
|
||||
bStyle = COMMENT_STYLE[cStyle]
|
||||
tLine, tFmt = self._formatComment(bStyle, cKey, cText)
|
||||
blocks.append((
|
||||
BlockTyp.COMMENT, nHead, tLine, tFmt, sAlign
|
||||
tBlocks.append((
|
||||
BlockTyp.COMMENT, "", tLine, tFmt, sAlign
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
elif cStyle == nwComment.FOOTNOTE:
|
||||
tLine, tFmt = self._extractFormats(cText, skip=TextFmt.FNOTE)
|
||||
self._footnotes[f"{tHandle}:{cKey}"] = (tLine, tFmt)
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
elif aLine.startswith("@"):
|
||||
@@ -637,12 +637,12 @@ class Tokenizer(ABC):
|
||||
# are automatically skipped.
|
||||
|
||||
if self._doKeywords:
|
||||
tLine, tFmt = self._formatMeta(aLine)
|
||||
tTag, tLine, tFmt = self._formatMeta(aLine)
|
||||
if tLine:
|
||||
blocks.append((
|
||||
BlockTyp.KEYWORD, nHead, tLine, tFmt, sAlign
|
||||
tBlocks.append((
|
||||
BlockTyp.KEYWORD, tTag[1:], tLine, tFmt, sAlign
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
elif aLine.startswith(("# ", "#! ")):
|
||||
@@ -661,7 +661,7 @@ class Tokenizer(ABC):
|
||||
tType = BlockTyp.HEAD1 if isPlain else BlockTyp.TITLE
|
||||
tStyle = BlockFmt.NONE if isPlain else self._titleStyle
|
||||
sHide = self._hidePart if isPlain else False
|
||||
if self._isNovel:
|
||||
if isNovel:
|
||||
if sHide:
|
||||
tText = ""
|
||||
tType = BlockTyp.EMPTY
|
||||
@@ -675,10 +675,10 @@ class Tokenizer(ABC):
|
||||
self._hFormatter.resetAll()
|
||||
self._noSep = True
|
||||
|
||||
blocks.append((
|
||||
tType, nHead, tText, [], tStyle
|
||||
tBlocks.append((
|
||||
tType, f"{tHandle}:T{nHead:04d}", tText, [], tStyle
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
elif aLine.startswith(("## ", "##! ")):
|
||||
@@ -698,7 +698,7 @@ class Tokenizer(ABC):
|
||||
tStyle = BlockFmt.NONE
|
||||
sHide = self._hideChapter if isPlain else self._hideUnNum
|
||||
tFormat = self._fmtChapter if isPlain else self._fmtUnNum
|
||||
if self._isNovel:
|
||||
if isNovel:
|
||||
if isPlain:
|
||||
self._hFormatter.incChapter()
|
||||
if sHide:
|
||||
@@ -710,10 +710,10 @@ class Tokenizer(ABC):
|
||||
self._hFormatter.resetScene()
|
||||
self._noSep = True
|
||||
|
||||
blocks.append((
|
||||
tType, nHead, tText, [], tStyle
|
||||
tBlocks.append((
|
||||
tType, f"{tHandle}:T{nHead:04d}", tText, [], tStyle
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
elif aLine.startswith(("### ", "###! ")):
|
||||
@@ -735,7 +735,7 @@ class Tokenizer(ABC):
|
||||
tStyle = BlockFmt.NONE
|
||||
sHide = self._hideScene if isPlain else self._hideHScene
|
||||
tFormat = self._fmtScene if isPlain else self._fmtHScene
|
||||
if self._isNovel:
|
||||
if isNovel:
|
||||
self._hFormatter.incScene()
|
||||
if sHide:
|
||||
tText = ""
|
||||
@@ -751,10 +751,10 @@ class Tokenizer(ABC):
|
||||
tStyle = BlockFmt.NONE if self._noSep else BlockFmt.CENTRE
|
||||
self._noSep = False
|
||||
|
||||
blocks.append((
|
||||
tType, nHead, tText, [], tStyle
|
||||
tBlocks.append((
|
||||
tType, f"{tHandle}:T{nHead:04d}", tText, [], tStyle
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
elif aLine.startswith("#### "):
|
||||
@@ -769,7 +769,7 @@ class Tokenizer(ABC):
|
||||
tText = aLine[5:].strip()
|
||||
tType = BlockTyp.HEAD4
|
||||
tStyle = BlockFmt.NONE
|
||||
if self._isNovel:
|
||||
if isNovel:
|
||||
if self._hideSection:
|
||||
tText = ""
|
||||
tType = BlockTyp.EMPTY
|
||||
@@ -781,10 +781,10 @@ class Tokenizer(ABC):
|
||||
tType = BlockTyp.SEP
|
||||
tStyle = BlockFmt.CENTRE
|
||||
|
||||
blocks.append((
|
||||
tType, nHead, tText, [], tStyle
|
||||
tBlocks.append((
|
||||
tType, f"{tHandle}:T{nHead:04d}", tText, [], tStyle
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
else:
|
||||
@@ -828,30 +828,28 @@ class Tokenizer(ABC):
|
||||
sAlign |= BlockFmt.IND_R
|
||||
|
||||
# Process formats
|
||||
tLine, tFmt = self._extractFormats(aLine, hDialog=self._isNovel)
|
||||
blocks.append((
|
||||
BlockTyp.TEXT, nHead, tLine, tFmt, sAlign
|
||||
tLine, tFmt = self._extractFormats(aLine, hDialog=isNovel)
|
||||
tBlocks.append((
|
||||
BlockTyp.TEXT, "", tLine, tFmt, sAlign
|
||||
))
|
||||
if self._keepRaw:
|
||||
if keepRaw:
|
||||
tmpMarkdown.append(f"{aLine}\n")
|
||||
|
||||
# If we have content, turn off the first page flag
|
||||
if self._isFirst and blocks:
|
||||
if self._isFirst and len(tBlocks) > 1:
|
||||
self._isFirst = False # First document has been processed
|
||||
|
||||
# Make sure the blocks array doesn't start with a page break
|
||||
# on the very first page, adding a blank first page.
|
||||
if blocks[0][4] & BlockFmt.PBB:
|
||||
cBlock = blocks[0]
|
||||
blocks[0] = (
|
||||
if tBlocks[1][4] & BlockFmt.PBB:
|
||||
cBlock = tBlocks[1]
|
||||
tBlocks[1] = (
|
||||
cBlock[0], cBlock[1], cBlock[2], cBlock[3], cBlock[4] & ~BlockFmt.PBB
|
||||
)
|
||||
|
||||
# Always add an empty line at the end of the file
|
||||
blocks.append((
|
||||
BlockTyp.EMPTY, nHead, "", [], BlockFmt.NONE
|
||||
))
|
||||
if self._keepRaw:
|
||||
tBlocks.append(B_EMPTY)
|
||||
if keepRaw:
|
||||
tmpMarkdown.append("\n")
|
||||
self._markdown.append("".join(tmpMarkdown))
|
||||
|
||||
@@ -860,24 +858,18 @@ class Tokenizer(ABC):
|
||||
# This second pass strips away consecutive blank lines, and
|
||||
# combines consecutive text lines into the same paragraph.
|
||||
# It also ensures that there isn't paragraph spacing between
|
||||
# meta data lines for formats that has spacing.
|
||||
|
||||
self._blocks = []
|
||||
pBlock: T_Block = (BlockTyp.EMPTY, 0, "", [], BlockFmt.NONE)
|
||||
nBlock: T_Block = (BlockTyp.EMPTY, 0, "", [], BlockFmt.NONE)
|
||||
# meta data lines for formats that have spacing.
|
||||
|
||||
lineSep = "\n" if self._keepBreaks else " "
|
||||
|
||||
pLines: list[T_Block] = []
|
||||
sBlocks: list[T_Block] = []
|
||||
for n, cBlock in enumerate(tBlocks[1:-1], 1):
|
||||
|
||||
tCount = len(blocks)
|
||||
for n, cBlock in enumerate(blocks):
|
||||
pBlock = tBlocks[n-1] # Look behind
|
||||
nBlock = tBlocks[n+1] # Look ahead
|
||||
|
||||
if n > 0:
|
||||
pBlock = blocks[n-1] # Look behind
|
||||
if n < tCount - 1:
|
||||
nBlock = blocks[n+1] # Look ahead
|
||||
|
||||
if cBlock[0] in self.L_SKIP_INDENT and not self._indentFirst:
|
||||
if cBlock[0] in SKIP_INDENT and not indentFirst:
|
||||
# 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
|
||||
@@ -891,10 +883,10 @@ class Tokenizer(ABC):
|
||||
# Adjust margins for lines in a list of keyword lines
|
||||
aStyle = cBlock[4]
|
||||
if pBlock[0] == BlockTyp.KEYWORD:
|
||||
aStyle |= BlockFmt.Z_TOPMRG
|
||||
aStyle |= BlockFmt.Z_TOP
|
||||
if nBlock[0] == BlockTyp.KEYWORD:
|
||||
aStyle |= BlockFmt.Z_BTMMRG
|
||||
self._blocks.append((
|
||||
aStyle |= BlockFmt.Z_BTM
|
||||
sBlocks.append((
|
||||
cBlock[0], cBlock[1], cBlock[2], cBlock[3], aStyle
|
||||
))
|
||||
|
||||
@@ -906,7 +898,7 @@ class Tokenizer(ABC):
|
||||
# Next block is not text, so we add the buffer to blocks
|
||||
nLines = len(pLines)
|
||||
cStyle = pLines[0][4]
|
||||
if self._firstIndent and not (self._noIndent or cStyle & self.M_ALIGNED):
|
||||
if firstIndent and not (self._noIndent or cStyle & BlockFmt.ALIGNED):
|
||||
# If paragraph indentation is enabled, not temporarily
|
||||
# turned off, and the block is not aligned, we add the
|
||||
# text indentation flag
|
||||
@@ -916,9 +908,9 @@ class Tokenizer(ABC):
|
||||
# The paragraph contains a single line, so we just save
|
||||
# that directly to the blocks list. If justify is
|
||||
# enabled, and there is no alignment, we apply it.
|
||||
if self._doJustify and not cStyle & self.M_ALIGNED:
|
||||
if doJustify and not cStyle & BlockFmt.ALIGNED:
|
||||
cStyle |= BlockFmt.JUSTIFY
|
||||
self._blocks.append((
|
||||
sBlocks.append((
|
||||
BlockTyp.TEXT, pLines[0][1], pLines[0][2], pLines[0][3], cStyle
|
||||
))
|
||||
elif nLines > 1:
|
||||
@@ -931,7 +923,7 @@ class Tokenizer(ABC):
|
||||
tLen = len(tTxt)
|
||||
tTxt += f"{aBlock[2]}{lineSep}"
|
||||
tFmt.extend((p+tLen, fmt, key) for p, fmt, key in aBlock[3])
|
||||
self._blocks.append((
|
||||
sBlocks.append((
|
||||
BlockTyp.TEXT, pLines[0][1], tTxt[:-1], tFmt, cStyle
|
||||
))
|
||||
|
||||
@@ -940,15 +932,16 @@ class Tokenizer(ABC):
|
||||
self._noIndent = False
|
||||
|
||||
else:
|
||||
self._blocks.append(cBlock)
|
||||
sBlocks.append(cBlock)
|
||||
|
||||
self._blocks = sBlocks
|
||||
|
||||
return
|
||||
|
||||
def buildOutline(self) -> None:
|
||||
"""Build an outline of the text up to level 3 headings."""
|
||||
tHandle = self._handle or ""
|
||||
isNovel = self._isNovel
|
||||
for tType, nHead, tText, _, _ in self._blocks:
|
||||
for tType, tKey, tText, _, _ in self._blocks:
|
||||
if tType == BlockTyp.TITLE:
|
||||
prefix = "TT"
|
||||
elif tType == BlockTyp.HEAD1:
|
||||
@@ -960,9 +953,8 @@ class Tokenizer(ABC):
|
||||
else:
|
||||
continue
|
||||
|
||||
key = f"{tHandle}:T{nHead:04d}"
|
||||
text = tText.replace(nwHeadFmt.BR, " ").replace("&", "&")
|
||||
self._outline[key] = f"{prefix}|{text}"
|
||||
self._outline[tKey] = f"{prefix}|{text}"
|
||||
|
||||
return
|
||||
|
||||
@@ -1006,7 +998,7 @@ class Tokenizer(ABC):
|
||||
allWordChars += nPWChars
|
||||
textWordChars += nPWChars
|
||||
|
||||
elif tType in self.L_HEADINGS:
|
||||
elif tType in HEADINGS:
|
||||
titleCount += 1
|
||||
allWords += nWords
|
||||
titleWords += nWords
|
||||
@@ -1089,14 +1081,16 @@ class Tokenizer(ABC):
|
||||
rFmt.extend((p + shift, f, d) for p, f, d in tFmt)
|
||||
return tTxt, rFmt
|
||||
|
||||
def _formatMeta(self, text: str) -> tuple[str, T_Formats]:
|
||||
"""Parse a meta line into a """
|
||||
def _formatMeta(self, text: str) -> tuple[str, str, T_Formats]:
|
||||
"""Apply formatting to a meta data line."""
|
||||
tag = ""
|
||||
txt = []
|
||||
fmt = []
|
||||
valid, bits, _ = self._project.index.scanThis(text)
|
||||
if valid and bits and bits[0] in nwLabels.KEY_NAME and bits[0] not in self._skipKeywords:
|
||||
tag = bits[0]
|
||||
pos = 0
|
||||
lbl = f"{self._localLookup(nwLabels.KEY_NAME[bits[0]])}:"
|
||||
lbl = f"{self._localLookup(nwLabels.KEY_NAME[tag])}:"
|
||||
end = len(lbl)
|
||||
fmt = [
|
||||
(pos, TextFmt.B_B, ""),
|
||||
@@ -1138,7 +1132,7 @@ class Tokenizer(ABC):
|
||||
txt.append(", ")
|
||||
pos += 2
|
||||
|
||||
return "".join(txt), fmt
|
||||
return tag, "".join(txt), fmt
|
||||
|
||||
def _extractFormats(
|
||||
self, text: str, skip: int = 0, hDialog: bool = False
|
||||
|
||||
@@ -154,7 +154,7 @@ class ToMarkdown(Tokenizer):
|
||||
lines.append(f"{self._formatText(tText, tFormat, mTags)}\n\n")
|
||||
|
||||
elif tType == BlockTyp.KEYWORD:
|
||||
end = " \n" if tStyle & BlockFmt.Z_BTMMRG else "\n\n"
|
||||
end = " \n" if tStyle & BlockFmt.Z_BTM else "\n\n"
|
||||
lines.append(f"{self._formatText(tText, tFormat, mTags)}{end}")
|
||||
|
||||
self._result = "".join(lines)
|
||||
|
||||
@@ -423,9 +423,9 @@ class ToOdt(Tokenizer):
|
||||
if tStyle & BlockFmt.PBA:
|
||||
oStyle.setBreakAfter("page")
|
||||
|
||||
if tStyle & BlockFmt.Z_BTMMRG:
|
||||
if tStyle & BlockFmt.Z_BTM:
|
||||
oStyle.setMarginBottom("0.000cm")
|
||||
if tStyle & BlockFmt.Z_TOPMRG:
|
||||
if tStyle & BlockFmt.Z_TOP:
|
||||
oStyle.setMarginTop("0.000cm")
|
||||
|
||||
if tStyle & BlockFmt.IND_L:
|
||||
|
||||
@@ -37,7 +37,7 @@ from PyQt5.QtPrintSupport import QPrinter
|
||||
from novelwriter.constants import nwHeadFmt, nwStyles, nwUnicode
|
||||
from novelwriter.core.project import NWProject
|
||||
from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt
|
||||
from novelwriter.formats.tokenizer import Tokenizer
|
||||
from novelwriter.formats.tokenizer import HEADINGS, Tokenizer
|
||||
from novelwriter.types import (
|
||||
QtAlignAbsolute, QtAlignCenter, QtAlignJustify, QtAlignLeft, QtAlignRight,
|
||||
QtPageBreakAfter, QtPageBreakBefore, QtTransparent, QtVAlignNormal,
|
||||
@@ -173,7 +173,7 @@ class ToQTextDocument(Tokenizer):
|
||||
cursor = QTextCursor(self._document)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.End)
|
||||
|
||||
for tType, nHead, tText, tFormat, tStyle in self._blocks:
|
||||
for tType, tMeta, tText, tFormat, tStyle in self._blocks:
|
||||
|
||||
bFmt = QTextBlockFormat(self._blockFmt)
|
||||
if tType in (BlockTyp.COMMENT, BlockTyp.KEYWORD):
|
||||
@@ -198,9 +198,9 @@ class ToQTextDocument(Tokenizer):
|
||||
if tStyle & BlockFmt.PBA:
|
||||
bFmt.setPageBreakPolicy(QtPageBreakAfter)
|
||||
|
||||
if tStyle & BlockFmt.Z_BTMMRG:
|
||||
if tStyle & BlockFmt.Z_BTM:
|
||||
bFmt.setBottomMargin(0.0)
|
||||
if tStyle & BlockFmt.Z_TOPMRG:
|
||||
if tStyle & BlockFmt.Z_TOP:
|
||||
bFmt.setTopMargin(0.0)
|
||||
|
||||
if tStyle & BlockFmt.IND_L:
|
||||
@@ -214,8 +214,8 @@ class ToQTextDocument(Tokenizer):
|
||||
newBlock(cursor, bFmt)
|
||||
self._insertFragments(tText, tFormat, cursor, self._charFmt)
|
||||
|
||||
elif tType in self.L_HEADINGS:
|
||||
bFmt, cFmt = self._genHeadStyle(tType, nHead, bFmt)
|
||||
elif tType in HEADINGS:
|
||||
bFmt, cFmt = self._genHeadStyle(tType, tMeta, bFmt)
|
||||
newBlock(cursor, bFmt)
|
||||
cursor.insertText(tText.replace(nwHeadFmt.BR, "\n"), cFmt)
|
||||
|
||||
@@ -254,7 +254,7 @@ class ToQTextDocument(Tokenizer):
|
||||
cursor = QTextCursor(self._document)
|
||||
cursor.movePosition(QTextCursor.MoveOperation.End)
|
||||
|
||||
bFmt, cFmt = self._genHeadStyle(BlockTyp.HEAD4, -1, self._blockFmt)
|
||||
bFmt, cFmt = self._genHeadStyle(BlockTyp.HEAD4, "", self._blockFmt)
|
||||
newBlock(cursor, bFmt)
|
||||
cursor.insertText(self._localLookup("Footnotes"), cFmt)
|
||||
|
||||
@@ -356,7 +356,7 @@ class ToQTextDocument(Tokenizer):
|
||||
|
||||
return
|
||||
|
||||
def _genHeadStyle(self, hType: BlockTyp, nHead: int, rFmt: QTextBlockFormat) -> T_TextStyle:
|
||||
def _genHeadStyle(self, hType: BlockTyp, hKey: str, rFmt: QTextBlockFormat) -> T_TextStyle:
|
||||
"""Generate a heading style set."""
|
||||
mTop, mBottom = self._mHead.get(hType, (0.0, 0.0))
|
||||
|
||||
@@ -369,8 +369,8 @@ class ToQTextDocument(Tokenizer):
|
||||
cFmt.setForeground(self._theme.head if hCol else self._theme.text)
|
||||
cFmt.setFontWeight(self._bold if self._boldHeads else self._normal)
|
||||
cFmt.setFontPointSize(self._sHead.get(hType, 1.0))
|
||||
if nHead >= 0:
|
||||
cFmt.setAnchorNames([f"{self._handle}:T{nHead:04d}"])
|
||||
if hKey:
|
||||
cFmt.setAnchorNames([hKey])
|
||||
cFmt.setAnchor(True)
|
||||
|
||||
return bFmt, cFmt
|
||||
|
||||
@@ -32,15 +32,15 @@ h4 {margin-top: 1.53em; margin-bottom: 0.65em;}
|
||||
<h1 class='title' style='text-align: center; page-break-before: always;'>Part: Act One</h1>
|
||||
<p style='text-align: center;'>“Fusce maximus felis libero”</p>
|
||||
<h1 style='page-break-before: always;'>Chapter: Chapter One</h1>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.</span></p>
|
||||
<p style='text-align: justify;'>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.</p>
|
||||
<h2>Scene: Scene One</h2>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.</span></p>
|
||||
<p style='text-align: justify;'>Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.</p>
|
||||
@@ -48,9 +48,9 @@ h4 {margin-top: 1.53em; margin-bottom: 0.65em;}
|
||||
<p style='text-align: justify;'>Integer vel libero ipsum. Donec varius aliquam libero, sit amet commodo urna hendrerit non. Nullam quis erat mollis nunc viverra volutpat tincidunt in odio. Nam vitae quam sem. Aliquam suscipit nulla non lorem pharetra semper. Ut suscipit erat eu ligula accumsan ultrices. Phasellus nisl tellus, placerat sed laoreet id, consectetur nec dolor. Sed fringilla ipsum id dapibus posuere. Aenean finibus pharetra tincidunt. Ut molestie malesuada nulla, id posuere lorem tincidunt eu. Aliquam tempor eros a est vulputate, scelerisque pulvinar ipsum fermentum. In hac habitasse platea dictumst.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Curabitur congue, justo quis interdum fermentum, tellus nulla imperdiet sapien, eu interdum enim tellus condimentum metus. Vivamus nunc velit, dignissim ut ultrices sit amet, ultricies quis enim. Donec ut vestibulum neque. Vivamus semper neque id ex ullamcorper varius. Fusce mattis nibh viverra lorem sagittis, et tempor arcu congue. Suspendisse sit amet felis sed urna facilisis mattis eget vitae arcu. Proin eu magna hendrerit, tristique sem maximus, placerat diam. Nulla tristique sed velit sit amet varius. Etiam vel ornare magna, in vulputate arcu. Cras velit orci, tincidunt sed volutpat cursus, bibendum vel sem. Nunc vulputate pharetra tortor, ac consectetur neque tincidunt sit amet. Nulla ornare mi sed mi dignissim ultricies. Ut tincidunt bibendum mauris, sed elementum ex vulputate vel. Mauris fermentum, felis nec vehicula congue, felis lorem facilisis erat, a dictum dolor augue vitae quam. Maecenas rutrum tortor nec consequat eleifend.</p>
|
||||
<h2>Scene: Scene Two</h2>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.</span></p>
|
||||
<p style='text-align: justify;'>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.</p>
|
||||
@@ -65,24 +65,24 @@ h4 {margin-top: 1.53em; margin-bottom: 0.65em;}
|
||||
<p style='text-align: justify; text-indent: 1.40em;'> The point of using Lorem Ipsum is that it has a more-or-less normal distribution of letters, as opposed to using 'Content here, content here', making it look like readable English.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'> Many desktop publishing packages and web page editors now use Lorem Ipsum as their default model text, and a search for 'lorem ipsum' will uncover many web sites still in their infancy. Various versions have evolved over the years, sometimes by accident, sometimes on purpose (injected humour and the like).</p>
|
||||
<h1 style='page-break-before: always;'>Chapter: Chapter Two</h1>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.</span></p>
|
||||
<p style='text-align: justify;'>Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.</p>
|
||||
<h2>Scene: Scene Three</h2>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</span></p>
|
||||
<p style='text-align: justify;'>Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Maecenas ullamcorper lacus nec turpis finibus aliquet eget rutrum augue. Integer lorem erat, faucibus non lacus lacinia, pulvinar egestas felis. Proin rutrum nunc eget nulla varius, id blandit mauris tincidunt. Donec sit amet ullamcorper nisi, ut efficitur mi. Aliquam aliquet, nulla eget rhoncus tristique, justo lorem consectetur dui, id ornare leo odio sed tellus. Curabitur interdum velit a turpis condimentum venenatis. Nunc rhoncus sem ac augue auctor, nec malesuada ex fringilla. Vestibulum egestas diam sed leo consectetur vulputate quis eget enim. Nam tincidunt metus sit amet maximus ullamcorper. Sed placerat velit vitae massa efficitur viverra. Etiam eleifend dignissim ante, sed luctus nisl tristique a. In vestibulum pharetra dolor in molestie. Vivamus auctor massa ac magna imperdiet, sit amet iaculis turpis finibus.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Aenean dapibus vulputate purus, sit amet tempor nunc suscipit consequat. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Mauris auctor congue eros, non pellentesque neque dapibus ac. Vestibulum non leo nec urna lacinia eleifend quis et diam. Praesent eu nisi magna. Nulla at magna massa. Suspendisse porta varius scelerisque. Duis at auctor dolor, non dapibus urna. Nunc venenatis feugiat magna non molestie. Aliquam non ornare ex. Quisque eu ultrices velit, quis pellentesque eros. Phasellus eleifend, elit id imperdiet aliquam, nulla quam molestie turpis, at egestas odio ante et tortor. Suspendisse fringilla condimentum justo, at aliquet odio aliquam ac.</p>
|
||||
<h2>Scene: Scene Four</h2>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.</span></p>
|
||||
<p style='text-align: justify;'>Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.</p>
|
||||
@@ -91,9 +91,9 @@ h4 {margin-top: 1.53em; margin-bottom: 0.65em;}
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Donec ipsum eros, vestibulum sit amet cursus eget, iaculis quis dolor. Pellentesque magna augue, tristique dapibus mi vitae, molestie venenatis enim. Nam malesuada, turpis volutpat rhoncus ullamcorper, justo est eleifend orci, ut luctus risus ex rutrum arcu. Sed mi elit, feugiat rhoncus ornare sed, porta id leo. Pellentesque feugiat nulla tincidunt erat suscipit, eu congue lacus hendrerit. Morbi pulvinar enim sed consequat auctor. Ut eleifend enim sem, vitae euismod ex ultricies sit amet. Curabitur eu efficitur nisi, suscipit finibus sapien. In sodales blandit erat, vestibulum pulvinar ante volutpat nec. Vivamus dictum non libero at molestie. Donec sit amet neque in ante convallis pretium. Nunc vel iaculis dui.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Phasellus eu nunc ut nunc faucibus laoreet. Aliquam at magna risus. Praesent lobortis, risus finibus semper varius, magna purus vestibulum eros, at pulvinar sapien enim a ex. In scelerisque malesuada ex, sit amet egestas neque condimentum sed. Praesent vulputate efficitur massa. Cras at accumsan ligula. In elementum lectus eget blandit dictum. Nam vitae libero ut justo eleifend rutrum ac nec arcu. Aliquam sodales in quam congue vestibulum. Aliquam in accumsan sapien. Quisque lobortis nisl nisi, vitae bibendum turpis efficitur sed. Vestibulum tempor nulla eget nisi convallis, blandit sagittis ipsum convallis. Donec odio nibh, ultrices quis odio in, mollis euismod libero.</p>
|
||||
<h2>Scene: Scene Five</h2>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>
|
||||
<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>
|
||||
<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</span></p>
|
||||
<p style='text-align: justify;'>Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.</p>
|
||||
@@ -102,19 +102,19 @@ h4 {margin-top: 1.53em; margin-bottom: 0.65em;}
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo.</p>
|
||||
<h1 class='title' style='text-align: center; page-break-before: always;'>Notes: Characters</h1>
|
||||
<h1>Nobody Owens</h1>
|
||||
<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_bod'>Bod</a></span> | <span style='color: #4271ae'>Nobody Owens</span></p>
|
||||
<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-tag' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_bod'>Bod</a></span> | <span style='color: #4271ae'>Nobody Owens</span></p>
|
||||
<p class='meta meta-plot' style='margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>
|
||||
<p style='text-align: justify;'>Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.</p>
|
||||
<h1 class='title' style='text-align: center; page-break-before: always;'>Notes: Plot</h1>
|
||||
<h1>Main Plot</h1>
|
||||
<p class='meta'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_main'>Main</a></span></p>
|
||||
<p class='meta meta-tag'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_main'>Main</a></span></p>
|
||||
<p style='text-align: justify;'>Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.</p>
|
||||
<h1 class='title' style='text-align: center; page-break-before: always;'>Notes: World</h1>
|
||||
<h1>Ancient Europe</h1>
|
||||
<p class='meta'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_europe'>Europe</a></span> | <span style='color: #4271ae'>Ancient Europe</span></p>
|
||||
<p class='meta meta-tag'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_europe'>Europe</a></span> | <span style='color: #4271ae'>Ancient Europe</span></p>
|
||||
<p style='text-align: justify;'>Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.</p>
|
||||
<p style='text-align: justify; text-indent: 1.40em;'>Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.</p>
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
"meta": {
|
||||
"projectName": "Lorem Ipsum",
|
||||
"novelAuthor": "lipsum.com",
|
||||
"buildTime": 1729670360,
|
||||
"buildTimeStr": "2024-10-23 09:59:20"
|
||||
"buildTime": 1729676162,
|
||||
"buildTimeStr": "2024-10-23 11:36:02"
|
||||
},
|
||||
"text": {
|
||||
"css": [
|
||||
@@ -42,17 +42,17 @@
|
||||
],
|
||||
[
|
||||
"<h1 style='page-break-before: always;'>Chapter: Chapter One</h1>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam.</span></p>",
|
||||
"<p style='text-align: justify;'>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque at aliquam quam. Praesent magna nunc, lacinia sit amet quam eget, aliquet ultrices justo. Morbi ornare enim et lorem rutrum finibus ut eu dolor. Aliquam a orci odio. Ut ultrices sem quis massa placerat, eget mollis nisl cursus. Cras vel sagittis justo. Ut non ultricies leo. Maecenas rutrum velit in est varius, et egestas massa pulvinar.</p>"
|
||||
],
|
||||
[
|
||||
"<h2>Scene: Scene One</h2>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur.</span></p>",
|
||||
"<p style='text-align: justify;'>Aenean ut placerat velit. Etiam laoreet ullamcorper risus, eget lobortis enim scelerisque non. Suspendisse id maximus nunc, et mollis sapien. Curabitur vel semper sapien, non pulvinar dolor. Etiam finibus nisi vel mi molestie consectetur. Donec quis ante nunc. Mauris ut leo ipsum. Vestibulum est neque, hendrerit nec neque a, ullamcorper lobortis tellus. Fusce sollicitudin purus quis congue bibendum. Aliquam condimentum ipsum tristique blandit tristique. Donec pulvinar neque ac suscipit malesuada.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Aliquam ut nisl arcu. Ut ultricies, lorem dignissim rutrum convallis, risus orci tempus lectus, congue feugiat sem lectus vitae odio. Duis sit amet justo finibus, hendrerit nulla at, ullamcorper enim. Praesent vel tellus sit amet tellus vulputate bibendum. Morbi eleifend sagittis sem, ac volutpat ante congue non. In hac habitasse platea dictumst. Morbi lobortis fermentum elit, dignissim sagittis ligula volutpat lacinia. Vestibulum eu interdum odio. Integer ac purus commodo metus congue tempor non at urna. Sed eget tortor vel quam viverra egestas. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Donec non convallis mauris, ac feugiat ex.</p>",
|
||||
@@ -62,9 +62,9 @@
|
||||
],
|
||||
[
|
||||
"<h2>Scene: Scene Two</h2>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci.</span></p>",
|
||||
"<p style='text-align: justify;'>Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Integer sapien nulla, dictum at lacus a, dignissim consectetur dolor. Nunc vel eleifend lacus, eu dapibus orci. Vestibulum facilisis bibendum aliquam. Aliquam posuere, turpis ac bibendum varius, sem tellus venenatis risus, in elementum massa enim ac lorem. Integer in sem ac diam blandit ultricies ut in nulla. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam sit amet erat est. Curabitur vitae cursus justo, sit amet placerat dolor. Vivamus eu felis hendrerit, tincidunt massa rutrum, maximus arcu. Pellentesque commodo justo odio, vel rutrum nulla tincidunt eu. Integer non neque condimentum, convallis diam non, varius ligula. Aliquam eget sapien mauris. Aenean pharetra nunc nisi, vel maximus ante tristique sit amet. Aliquam risus metus, interdum non odio eu, consectetur lacinia sapien.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Proin vitae gravida nisl. Integer viverra orci turpis, sit amet pretium ligula facilisis consequat. Nulla interdum commodo metus, mollis consequat dui tincidunt et. Proin consequat bibendum justo id commodo. Fusce fermentum nunc turpis, eu vestibulum risus feugiat ut. Sed scelerisque vel ligula ut interdum. Suspendisse ac blandit ligula, sagittis fringilla dolor. In tincidunt convallis diam et ornare. Aenean id dignissim est, ut rhoncus quam. Donec vitae nisl velit. In convallis nibh ut augue dignissim, eu elementum quam cursus. Phasellus in lectus lorem. Curabitur in pellentesque nisi, at gravida sapien. Sed cursus justo volutpat lacus placerat, sit amet dignissim turpis commodo. Aliquam vitae orci eget nulla posuere condimentum in ut felis.</p>",
|
||||
@@ -83,17 +83,17 @@
|
||||
],
|
||||
[
|
||||
"<h1 style='page-break-before: always;'>Chapter: Chapter Two</h1>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue.</span></p>",
|
||||
"<p style='text-align: justify;'>Curabitur a elit posuere, varius ex et, convallis neque. Phasellus sagittis pharetra sem vitae dapibus. Curabitur varius lorem non pulvinar congue. Vestibulum pharetra fermentum leo, sed faucibus eros placerat quis. In hac habitasse platea dictumst. Donec metus massa, rutrum quis consequat et, tincidunt ac felis. Duis mollis metus ac nunc tincidunt blandit. Ut aliquet velit eu odio pharetra condimentum. Integer rutrum lacus orci, id venenatis libero accumsan at.</p>"
|
||||
],
|
||||
[
|
||||
"<h2>Scene: Scene Three</h2>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos.</span></p>",
|
||||
"<p style='text-align: justify;'>Aenean ut libero ut lectus porttitor rhoncus vel et massa. Nam pretium, nibh et varius vehicula, urna metus blandit eros, euismod pharetra diam diam et libero. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Aenean tincidunt lacus vitae nibh elementum eleifend. Sed rutrum condimentum sem quis blandit. Duis imperdiet libero metus, quis convallis quam faucibus a. Nulla ligula est, semper quis sollicitudin et, pretium id justo. Curabitur pharetra risus eget consectetur commodo. Duis mattis arcu non est condimentum, id venenatis risus volutpat. Pellentesque aliquet mauris non mauris porttitor ultrices. Phasellus ut vestibulum mi. Suspendisse malesuada metus lorem, a malesuada orci rhoncus a. Praesent euismod convallis ante, lacinia tincidunt ex egestas id. Praesent sit amet efficitur sapien. Morbi tincidunt volutpat nunc sed dictum. Aliquam ultrices metus id fermentum lobortis.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Pellentesque id sagittis dui. Praesent ut nisi sit amet libero euismod ornare. Vestibulum vehicula, lorem eget aliquet imperdiet, eros nulla iaculis mi, vel bibendum est dui sed orci. Nullam vitae lorem rutrum, euismod lacus id, ullamcorper lectus. Duis nec commodo mi, a fringilla diam. Vestibulum molestie nibh tristique, viverra augue non, aliquet metus. Phasellus a tellus ac nisl tempor aliquet. Nulla vitae sapien rutrum augue ornare ultrices a quis nisi. Sed pulvinar tincidunt ex. Fusce vel sem vitae ante pellentesque lobortis.</p>",
|
||||
@@ -102,9 +102,9 @@
|
||||
],
|
||||
[
|
||||
"<h2>Scene: Scene Four</h2>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo.</span></p>",
|
||||
"<p style='text-align: justify;'>Nam tempor blandit magna laoreet aliquet. Vestibulum auctor posuere leo, ac gravida nisi rhoncus varius. Aenean posuere dolor vitae condimentum volutpat. Donec egestas volutpat risus, quis luctus justo. Nullam viverra dui et auctor pretium. Ut ullamcorper velit urna, sed imperdiet massa convallis a. Suspendisse efficitur, ipsum nec cursus pulvinar, eros urna posuere diam, nec elementum mi felis vitae sapien.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Duis efficitur metus pulvinar, molestie magna eget, feugiat dui. Fusce convallis vehicula ipsum convallis blandit. Duis eros risus, malesuada eu imperdiet in, hendrerit ac metus. Vestibulum id justo gravida, dignissim nibh non, iaculis diam. Fusce accumsan est ut massa porta ultricies. Nulla vitae justo in tortor laoreet mollis. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eu libero justo. Vivamus aliquet placerat est, et auctor eros posuere venenatis. Nunc quam diam, tincidunt ac aliquet in, fermentum sit amet lectus. Proin commodo tincidunt blandit. Quisque erat arcu, semper nec dui non, consectetur gravida ipsum. Nullam pretium consectetur elit at condimentum.</p>",
|
||||
@@ -115,9 +115,9 @@
|
||||
],
|
||||
[
|
||||
"<h2>Scene: Scene Five</h2>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Point of View:</span></strong> <span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>",
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-location' style='margin-top: 0;'><strong><span style='color: #f5871f'>Locations:</span></strong> <span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>",
|
||||
"<p class='comment' style='text-align: justify;'><strong><span style='color: #813709'>Synopsis:</span></strong> <span style='color: #813709'>Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.</span></p>",
|
||||
"<p style='text-align: justify;'>Praesent eget est porta, dictum ante in, egestas risus. Mauris risus mauris, consequat aliquam mauris et, feugiat iaculis ipsum. Aliquam arcu ipsum, fermentum ut arcu sed, lobortis euismod sem. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. In sed felis auctor, rhoncus dui ac, consequat dolor. Integer volutpat libero sed nisl aliquet varius. Suspendisse et lorem sapien. Proin id ultrices nibh, ac suscipit diam. Suspendisse placerat varius porttitor. Curabitur elementum sed enim ultrices imperdiet.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>In ut lobortis lacus, nec luctus arcu. Vivamus condimentum sapien a ipsum malesuada sodales. Donec et vestibulum risus. Integer dictum euismod eros id tincidunt. Aliquam sagittis leo vitae consequat fermentum. Donec maximus ex eu ex iaculis porta. Praesent pharetra lacinia risus, et eleifend diam commodo non. Sed feugiat ipsum ut orci sagittis, quis faucibus lectus blandit. Sed tellus quam, gravida vitae laoreet quis, tempus lobortis dui. Vivamus semper accumsan ullamcorper. Praesent tempus pretium eros, non elementum risus. Pellentesque odio quam, auctor quis ex non, vulputate egestas dolor. Nunc luctus enim ut justo sodales consectetur. Sed aliquet a mauris vel posuere.</p>",
|
||||
@@ -130,8 +130,8 @@
|
||||
],
|
||||
[
|
||||
"<h1>Nobody Owens</h1>",
|
||||
"<p class='meta' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_bod'>Bod</a></span> | <span style='color: #4271ae'>Nobody Owens</span></p>",
|
||||
"<p class='meta' style='margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-tag' style='margin-bottom: 0;'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_bod'>Bod</a></span> | <span style='color: #4271ae'>Nobody Owens</span></p>",
|
||||
"<p class='meta meta-plot' style='margin-top: 0;'><strong><span style='color: #f5871f'>Plot:</span></strong> <span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>",
|
||||
"<p style='text-align: justify;'>Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque.</p>"
|
||||
@@ -141,7 +141,7 @@
|
||||
],
|
||||
[
|
||||
"<h1>Main Plot</h1>",
|
||||
"<p class='meta'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_main'>Main</a></span></p>",
|
||||
"<p class='meta meta-tag'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_main'>Main</a></span></p>",
|
||||
"<p style='text-align: justify;'>Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur.</p>"
|
||||
],
|
||||
@@ -150,7 +150,7 @@
|
||||
],
|
||||
[
|
||||
"<h1>Ancient Europe</h1>",
|
||||
"<p class='meta'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_europe'>Europe</a></span> | <span style='color: #4271ae'>Ancient Europe</span></p>",
|
||||
"<p class='meta meta-tag'><strong><span style='color: #f5871f'>Tag:</span></strong> <span style='color: #4271ae'><a name='tag_europe'>Europe</a></span> | <span style='color: #4271ae'>Ancient Europe</span></p>",
|
||||
"<p style='text-align: justify;'>Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Aenean semper turpis quis varius rhoncus. Vivamus ac mi eget felis euismod vulputate. Nam eu tempus velit. Etiam ut est porta, finibus erat sit amet, consectetur felis. Nullam consequat felis ut lacus pharetra, in lobortis urna mollis. Nulla varius eros nec lorem rhoncus, sed venenatis risus ultrices. Phasellus pellentesque laoreet neque, ut ultricies lacus vulputate quis. In malesuada dui sit amet est interdum, eget consectetur mi gravida. Cras vel bibendum purus. Quisque commodo tempor arcu, non lacinia sem blandit eleifend. Quisque at neque gravida, porttitor metus a, suscipit diam. Quisque convallis sodales lacus et condimentum. Donec a suscipit diam. Pellentesque eget cursus neque.</p>",
|
||||
"<p style='text-align: justify; text-indent: 1.40em;'>Nunc ullamcorper magna quis elit condimentum rhoncus. Aenean dictum pulvinar dolor suscipit interdum. Aliquam elit massa, elementum nec cursus eu, maximus nec ipsum. Donec ullamcorper iaculis dolor eu commodo. Nunc eget tortor quis turpis consectetur varius. Vestibulum nec justo vel tellus venenatis condimentum. Duis auctor iaculis massa. Nunc risus magna, rutrum vitae eros non, tristique mollis enim.</p>"
|
||||
|
||||
@@ -71,7 +71,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Normal Text
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -81,7 +81,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Title
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TITLE, 0, "Hello World", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.TITLE, "", "Hello World", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -91,7 +91,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Heading Level 1
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.HEAD1, 0, "Hello World", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.HEAD1, "", "Hello World", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -101,7 +101,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Heading Level 2
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.HEAD2, 0, "Hello World", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.HEAD2, "", "Hello World", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -111,7 +111,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Heading Level 3
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.HEAD3, 0, "Hello World", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.HEAD3, "", "Hello World", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -121,7 +121,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Heading Level 4
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.HEAD4, 0, "Hello World", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.HEAD4, "", "Hello World", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -131,7 +131,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Separator
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.SEP, 0, "* * *", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.SEP, "", "* * *", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -141,7 +141,7 @@ def testFmtToDocX_ParagraphStyles(mockGUI):
|
||||
|
||||
# Empty Paragraph
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.SKIP, 0, "* * *", [], BlockFmt.NONE)]
|
||||
doc._blocks = [(BlockTyp.SKIP, "", "* * *", [], BlockFmt.NONE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -241,7 +241,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Left Align
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.LEFT)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.LEFT)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -251,7 +251,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Right Align
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.RIGHT)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.RIGHT)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -261,7 +261,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Center Align
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.CENTRE)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.CENTRE)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -271,7 +271,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Justify
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.JUSTIFY)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.JUSTIFY)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -281,7 +281,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Page Break Before
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.PBB)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.PBB)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -293,7 +293,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Page Break After
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.PBA)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.PBA)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -305,7 +305,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Zero Margins
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.Z_TOPMRG | BlockFmt.Z_BTMMRG)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.Z_TOP | BlockFmt.Z_BTM)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -316,7 +316,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# Indent
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.IND_L | BlockFmt.IND_R)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.IND_L | BlockFmt.IND_R)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
@@ -327,7 +327,7 @@ def testFmtToDocX_ParagraphFormatting(mockGUI):
|
||||
|
||||
# First Line Indent
|
||||
xTest = ET.Element(_wTag("body"))
|
||||
doc._blocks = [(BlockTyp.TEXT, 0, "Hello World", [], BlockFmt.IND_T)]
|
||||
doc._blocks = [(BlockTyp.TEXT, "", "Hello World", [], BlockFmt.IND_T)]
|
||||
doc.doConvert()
|
||||
doc._pars[-1].toXml(xTest)
|
||||
assert xmlToText(xTest) == (
|
||||
|
||||
@@ -232,7 +232,8 @@ def testFmtToHtml_ConvertParagraphs(mockGUI):
|
||||
html.tokenizeText()
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
"<p class='meta'><strong><span style='color: #f5871f'>Characters:</span></strong> "
|
||||
"<p class='meta meta-char'><strong><span style='color: #f5871f'>"
|
||||
"Characters:</span></strong> "
|
||||
"<span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span>, "
|
||||
"<span style='color: #4271ae'><a href='#tag_jane'>Jane</a></span></p>\n"
|
||||
)
|
||||
@@ -242,7 +243,7 @@ def testFmtToHtml_ConvertParagraphs(mockGUI):
|
||||
html.tokenizeText()
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
"<p class='meta'><strong><span style='color: #f5871f'>Tag:</span></strong> "
|
||||
"<p class='meta meta-tag'><strong><span style='color: #f5871f'>Tag:</span></strong> "
|
||||
"<span style='color: #4271ae'><a name='tag_bod'>Bod</a></span></p>\n"
|
||||
)
|
||||
|
||||
@@ -250,7 +251,7 @@ def testFmtToHtml_ConvertParagraphs(mockGUI):
|
||||
html.tokenizeText()
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
"<p class='meta'><strong><span style='color: #f5871f'>Tag:</span></strong> "
|
||||
"<p class='meta meta-tag'><strong><span style='color: #f5871f'>Tag:</span></strong> "
|
||||
"<span style='color: #4271ae'><a name='tag_bod'>Bod</a></span> | "
|
||||
"<span style='color: #4271ae'>Nobody Owens</span></p>\n"
|
||||
)
|
||||
@@ -263,13 +264,13 @@ def testFmtToHtml_ConvertParagraphs(mockGUI):
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
"<h1 style='page-break-before: always;'>Chapter</h1>\n"
|
||||
"<p class='meta' style='margin-bottom: 0;'>"
|
||||
"<p class='meta meta-pov' style='margin-bottom: 0;'>"
|
||||
"<strong><span style='color: #f5871f'>Point of View:</span></strong> "
|
||||
"<span style='color: #4271ae'><a href='#tag_bod'>Bod</a></span></p>\n"
|
||||
"<p class='meta' style='margin-bottom: 0; margin-top: 0;'>"
|
||||
"<p class='meta meta-plot' style='margin-bottom: 0; margin-top: 0;'>"
|
||||
"<strong><span style='color: #f5871f'>Plot:</span></strong> "
|
||||
"<span style='color: #4271ae'><a href='#tag_main'>Main</a></span></p>\n"
|
||||
"<p class='meta' style='margin-top: 0;'>"
|
||||
"<p class='meta meta-location' style='margin-top: 0;'>"
|
||||
"<strong><span style='color: #f5871f'>Locations:</span></strong> "
|
||||
"<span style='color: #4271ae'><a href='#tag_europe'>Europe</a></span></p>\n"
|
||||
)
|
||||
@@ -369,12 +370,14 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
html._handle = "0000000000000"
|
||||
html.setLinkHeadings(True)
|
||||
|
||||
tMeta = "0000000000000:T0001"
|
||||
|
||||
# Special Titles
|
||||
# ==============
|
||||
|
||||
# Title
|
||||
html._blocks = [
|
||||
(BlockTyp.TITLE, 1, "A Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TITLE, tMeta, "A Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -384,7 +387,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Unnumbered
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD2, 1, "Prologue", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, tMeta, "Prologue", [], BlockFmt.PBB),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -397,14 +400,14 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Separator
|
||||
html._blocks = [
|
||||
(BlockTyp.SEP, 1, "* * *", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.SEP, tMeta, "* * *", [], BlockFmt.CENTRE),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == "<p class='sep' style='text-align: center;'>* * *</p>\n"
|
||||
|
||||
# Skip
|
||||
html._blocks = [
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, tMeta, "", [], BlockFmt.NONE),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == "<p> </p>\n"
|
||||
@@ -417,7 +420,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
# Align Left
|
||||
html.setStyles(False)
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD1, 1, "A Title", [], BlockFmt.LEFT),
|
||||
(BlockTyp.HEAD1, tMeta, "A Title", [], BlockFmt.LEFT),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -428,7 +431,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Align Left
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD1, 1, "A Title", [], BlockFmt.LEFT),
|
||||
(BlockTyp.HEAD1, tMeta, "A Title", [], BlockFmt.LEFT),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -437,7 +440,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Align Right
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD1, 1, "A Title", [], BlockFmt.RIGHT),
|
||||
(BlockTyp.HEAD1, tMeta, "A Title", [], BlockFmt.RIGHT),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -446,7 +449,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Align Centre
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD1, 1, "A Title", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.HEAD1, tMeta, "A Title", [], BlockFmt.CENTRE),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -455,7 +458,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Align Justify
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD1, 1, "A Title", [], BlockFmt.JUSTIFY),
|
||||
(BlockTyp.HEAD1, tMeta, "A Title", [], BlockFmt.JUSTIFY),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -467,7 +470,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Page Break Always
|
||||
html._blocks = [
|
||||
(BlockTyp.HEAD1, 1, "A Title", [], BlockFmt.PBB | BlockFmt.PBA),
|
||||
(BlockTyp.HEAD1, tMeta, "A Title", [], BlockFmt.PBB | BlockFmt.PBA),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -480,7 +483,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Indent Left
|
||||
html._blocks = [
|
||||
(BlockTyp.TEXT, 1, "Some text ...", [], BlockFmt.IND_L),
|
||||
(BlockTyp.TEXT, tMeta, "Some text ...", [], BlockFmt.IND_L),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -489,7 +492,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Indent Right
|
||||
html._blocks = [
|
||||
(BlockTyp.TEXT, 1, "Some text ...", [], BlockFmt.IND_R),
|
||||
(BlockTyp.TEXT, tMeta, "Some text ...", [], BlockFmt.IND_R),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
@@ -498,7 +501,7 @@ def testFmtToHtml_ConvertDirect(mockGUI):
|
||||
|
||||
# Text Indent
|
||||
html._blocks = [
|
||||
(BlockTyp.TEXT, 1, "Some text ...", [], BlockFmt.IND_T),
|
||||
(BlockTyp.TEXT, tMeta, "Some text ...", [], BlockFmt.IND_T),
|
||||
]
|
||||
html.doConvert()
|
||||
assert html.result == (
|
||||
|
||||
@@ -37,6 +37,10 @@ from novelwriter.formats.toraw import ToRaw
|
||||
|
||||
from tests.tools import C, buildTestProject, readFile
|
||||
|
||||
TMH = "0123456789abc"
|
||||
TM1 = f"{TMH}:T0001"
|
||||
TM2 = f"{TMH}:T0002"
|
||||
|
||||
|
||||
class BareTokenizer(Tokenizer):
|
||||
def doConvert(self):
|
||||
@@ -209,14 +213,14 @@ def testFmtToken_TextOps(monkeypatch, mockGUI, mockRnd, fncPath):
|
||||
tokens.addRootHeading(C.hPlotRoot)
|
||||
assert tokens.allMarkdown[-1] == "#! Notes: Plot\n\n"
|
||||
assert tokens._blocks[-1] == (
|
||||
BlockTyp.TITLE, 1, "Notes: Plot", [], BlockFmt.CENTRE
|
||||
BlockTyp.TITLE, "0000000000009:T0001", "Notes: Plot", [], BlockFmt.CENTRE
|
||||
)
|
||||
|
||||
# Not First Page
|
||||
tokens.addRootHeading(C.hPlotRoot)
|
||||
assert tokens.allMarkdown[-1] == "#! Notes: Plot\n\n"
|
||||
assert tokens._blocks[-1] == (
|
||||
BlockTyp.TITLE, 1, "Notes: Plot", [], BlockFmt.CENTRE | BlockFmt.PBB
|
||||
BlockTyp.TITLE, "0000000000009:T0001", "Notes: Plot", [], BlockFmt.CENTRE | BlockFmt.PBB
|
||||
)
|
||||
|
||||
# Set Text
|
||||
@@ -265,6 +269,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
"""Test the tokenization of header formats in the Tokenizer class."""
|
||||
project = NWProject()
|
||||
tokens = ToRaw(project)
|
||||
tokens._handle = TMH
|
||||
|
||||
# Title
|
||||
# =====
|
||||
@@ -276,7 +281,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TITLE, 1, "Novel Title", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.TITLE, TM1, "Novel Title", [], BlockFmt.CENTRE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "#! Novel Title\n\n"
|
||||
|
||||
@@ -287,7 +292,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TITLE, 1, "Note Title", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.TITLE, TM1, "Note Title", [], BlockFmt.CENTRE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "#! Note Title\n\n"
|
||||
|
||||
@@ -301,7 +306,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Novel Title", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.HEAD1, TM1, "Novel Title", [], BlockFmt.CENTRE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "# Novel Title\n\n"
|
||||
|
||||
@@ -312,7 +317,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Note Title", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Note Title", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "# Note Title\n\n"
|
||||
|
||||
@@ -325,7 +330,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Chapter One", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "Chapter One", [], BlockFmt.PBB),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "## Chapter One\n\n"
|
||||
|
||||
@@ -335,7 +340,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Heading 2", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD2, TM1, "Heading 2", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "## Heading 2\n\n"
|
||||
|
||||
@@ -348,7 +353,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD3, 1, "Scene One", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM1, "Scene One", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "### Scene One\n\n"
|
||||
|
||||
@@ -358,7 +363,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD3, 1, "Heading 3", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM1, "Heading 3", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "### Heading 3\n\n"
|
||||
|
||||
@@ -371,7 +376,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD4, 1, "A Section", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD4, TM1, "A Section", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "#### A Section\n\n"
|
||||
|
||||
@@ -381,7 +386,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD4, 1, "Heading 4", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD4, TM1, "Heading 4", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "#### Heading 4\n\n"
|
||||
|
||||
@@ -395,7 +400,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TITLE, 1, "Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TITLE, TM1, "Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "#! Title\n\n"
|
||||
|
||||
@@ -406,7 +411,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TITLE, 1, "Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TITLE, TM1, "Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "#! Title\n\n"
|
||||
|
||||
@@ -419,7 +424,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Prologue", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "Prologue", [], BlockFmt.PBB),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "##! Prologue\n\n"
|
||||
|
||||
@@ -429,7 +434,7 @@ def testFmtToken_HeaderFormat(mockGUI):
|
||||
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Prologue", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD2, TM1, "Prologue", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "##! Prologue\n\n"
|
||||
|
||||
@@ -700,6 +705,7 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
"""Test the tokenization of meta formats in the Tokenizer class."""
|
||||
project = NWProject()
|
||||
tokens = ToRaw(project)
|
||||
tokens._handle = TMH
|
||||
|
||||
# Ignore Text
|
||||
tokens._text = "%~ Some text\n"
|
||||
@@ -718,7 +724,7 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
tokens._text = "% A comment\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.COMMENT, 0, "Comment: A comment", [
|
||||
BlockTyp.COMMENT, "", "Comment: A comment", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "comment"),
|
||||
(8, TextFmt.COL_E, ""), (8, TextFmt.B_E, ""),
|
||||
(9, TextFmt.COL_B, "comment"), (18, TextFmt.COL_E, ""),
|
||||
@@ -737,7 +743,7 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
tokens._text = "% synopsis: The synopsis\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.COMMENT, 0, "Synopsis: The synopsis", [
|
||||
BlockTyp.COMMENT, "", "Synopsis: The synopsis", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"),
|
||||
(9, TextFmt.COL_E, ""), (9, TextFmt.B_E, ""),
|
||||
(10, TextFmt.COL_B, "synopsis"), (22, TextFmt.COL_E, "")
|
||||
@@ -756,7 +762,7 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
tokens._text = "% short: A short description\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.COMMENT, 0, "Short Description: A short description", [
|
||||
BlockTyp.COMMENT, "", "Short Description: A short description", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "modifier"),
|
||||
(18, TextFmt.COL_E, ""), (18, TextFmt.B_E, ""),
|
||||
(19, TextFmt.COL_B, "synopsis"), (38, TextFmt.COL_E, ""),
|
||||
@@ -774,7 +780,7 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
tokens.setKeywords(True)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.KEYWORD, 0, "Characters: Bod", [
|
||||
BlockTyp.KEYWORD, "char", "Characters: Bod", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(11, TextFmt.COL_E, ""), (11, TextFmt.B_E, ""),
|
||||
(12, TextFmt.COL_B, "tag"), (12, TextFmt.HRF_B, "#tag_bod"),
|
||||
@@ -786,26 +792,26 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
tokens._text = "@pov: Bod\n@plot: Main\n@location: Europe\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.KEYWORD, 0, "Point of View: Bod", [
|
||||
BlockTyp.KEYWORD, "pov", "Point of View: Bod", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(14, TextFmt.COL_E, ""), (14, TextFmt.B_E, ""),
|
||||
(15, TextFmt.COL_B, "tag"), (15, TextFmt.HRF_B, "#tag_bod"),
|
||||
(18, TextFmt.HRF_E, ""), (18, TextFmt.COL_E, ""),
|
||||
], BlockFmt.Z_BTMMRG
|
||||
], BlockFmt.Z_BTM
|
||||
), (
|
||||
BlockTyp.KEYWORD, 0, "Plot: Main", [
|
||||
BlockTyp.KEYWORD, "plot", "Plot: Main", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(5, TextFmt.COL_E, ""), (5, TextFmt.B_E, ""),
|
||||
(6, TextFmt.COL_B, "tag"), (6, TextFmt.HRF_B, "#tag_main"),
|
||||
(10, TextFmt.HRF_E, ""), (10, TextFmt.COL_E, ""),
|
||||
], BlockFmt.Z_TOPMRG | BlockFmt.Z_BTMMRG
|
||||
], BlockFmt.Z_TOP | BlockFmt.Z_BTM
|
||||
), (
|
||||
BlockTyp.KEYWORD, 0, "Locations: Europe", [
|
||||
BlockTyp.KEYWORD, "location", "Locations: Europe", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(10, TextFmt.COL_E, ""), (10, TextFmt.B_E, ""),
|
||||
(11, TextFmt.COL_B, "tag"), (11, TextFmt.HRF_B, "#tag_europe"),
|
||||
(17, TextFmt.HRF_E, ""), (17, TextFmt.COL_E, ""),
|
||||
], BlockFmt.Z_TOPMRG
|
||||
], BlockFmt.Z_TOP
|
||||
)]
|
||||
assert tokens.allMarkdown[-1] == "@pov: Bod\n@plot: Main\n@location: Europe\n\n"
|
||||
|
||||
@@ -814,7 +820,7 @@ def testFmtToken_MetaFormat(mockGUI):
|
||||
tokens.setIgnoredKeywords("@plot, @location")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.KEYWORD, 0, "Point of View: Bod", [
|
||||
BlockTyp.KEYWORD, "pov", "Point of View: Bod", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(14, TextFmt.COL_E, ""), (14, TextFmt.B_E, ""),
|
||||
(15, TextFmt.COL_B, "tag"), (15, TextFmt.HRF_B, "#tag_bod"),
|
||||
@@ -844,14 +850,14 @@ def testFmtToken_MarginFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TEXT, 0, "Some regular text", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 0, "Some left-aligned text", [], BlockFmt.LEFT),
|
||||
(BlockTyp.TEXT, 0, "Some right-aligned text", [], BlockFmt.RIGHT),
|
||||
(BlockTyp.TEXT, 0, "Some centered text", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, 0, "Left-indented block", [], BlockFmt.IND_L),
|
||||
(BlockTyp.TEXT, 0, "Right-indented block", [], BlockFmt.IND_R),
|
||||
(BlockTyp.TEXT, 0, "Double-indented block", [], dblIndent),
|
||||
(BlockTyp.TEXT, 0, "Right-indent, right-aligned", [], rIndAlign),
|
||||
(BlockTyp.TEXT, "", "Some regular text", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Some left-aligned text", [], BlockFmt.LEFT),
|
||||
(BlockTyp.TEXT, "", "Some right-aligned text", [], BlockFmt.RIGHT),
|
||||
(BlockTyp.TEXT, "", "Some centered text", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, "", "Left-indented block", [], BlockFmt.IND_L),
|
||||
(BlockTyp.TEXT, "", "Right-indented block", [], BlockFmt.IND_R),
|
||||
(BlockTyp.TEXT, "", "Double-indented block", [], dblIndent),
|
||||
(BlockTyp.TEXT, "", "Right-indent, right-aligned", [], rIndAlign),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == (
|
||||
"Some regular text\n\n"
|
||||
@@ -976,13 +982,14 @@ def testFmtToken_Paragraphs(mockGUI):
|
||||
"""Test the splitting of paragraphs."""
|
||||
project = NWProject()
|
||||
tokens = BareTokenizer(project)
|
||||
tokens._handle = TMH
|
||||
|
||||
# Collapse empty lines
|
||||
tokens._text = "First paragraph\n\n\nSecond paragraph\n\n\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TEXT, 0, "First paragraph", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 0, "Second paragraph", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "First paragraph", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Second paragraph", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Combine multi-line paragraphs, keep breaks
|
||||
@@ -990,7 +997,7 @@ def testFmtToken_Paragraphs(mockGUI):
|
||||
tokens.setKeepLineBreaks(True)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TEXT, 0, "This is text\nspanning multiple\nlines", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "This is text\nspanning multiple\nlines", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Combine multi-line paragraphs, remove breaks
|
||||
@@ -998,7 +1005,7 @@ def testFmtToken_Paragraphs(mockGUI):
|
||||
tokens.setKeepLineBreaks(False)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TEXT, 0, "This is text spanning multiple lines", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "This is text spanning multiple lines", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Combine multi-line paragraphs, remove breaks, with formatting
|
||||
@@ -1007,7 +1014,7 @@ def testFmtToken_Paragraphs(mockGUI):
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(
|
||||
BlockTyp.TEXT, 0,
|
||||
BlockTyp.TEXT, "",
|
||||
"This is text spanning multiple lines",
|
||||
[
|
||||
(5, TextFmt.B_B, ""),
|
||||
@@ -1024,16 +1031,16 @@ def testFmtToken_Paragraphs(mockGUI):
|
||||
tokens.setKeepLineBreaks(False)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title", [], BlockFmt.NONE),
|
||||
(
|
||||
BlockTyp.TEXT, 1, "Text on two lines.", [
|
||||
BlockTyp.TEXT, "", "Text on two lines.", [
|
||||
(5, TextFmt.I_B, ""),
|
||||
(7, TextFmt.I_E, ""),
|
||||
], BlockFmt.NONE
|
||||
),
|
||||
(BlockTyp.HEAD2, 2, "Chapter", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD2, TM2, "Chapter", [], BlockFmt.NONE),
|
||||
(
|
||||
BlockTyp.TEXT, 2, "More text here.", [
|
||||
BlockTyp.TEXT, "", "More text here.", [
|
||||
(5, TextFmt.B_B, ""),
|
||||
(9, TextFmt.B_E, ""),
|
||||
(10, TextFmt.I_B, ""),
|
||||
@@ -1048,12 +1055,13 @@ def testFmtToken_TextFormat(mockGUI):
|
||||
"""Test the tokenization of text formats in the Tokenizer class."""
|
||||
project = NWProject()
|
||||
tokens = ToRaw(project)
|
||||
tokens._handle = TMH
|
||||
|
||||
# Text
|
||||
tokens._text = "Some plain text\non two lines\n\n\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TEXT, 0, "Some plain text\non two lines", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Some plain text\non two lines", [], BlockFmt.NONE),
|
||||
]
|
||||
assert tokens.allMarkdown[-1] == "Some plain text\non two lines\n\n\n\n"
|
||||
|
||||
@@ -1067,7 +1075,7 @@ def testFmtToken_TextFormat(mockGUI):
|
||||
tokens._text = "Some **bolded text** on this lines\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0, "Some bolded text on this lines",
|
||||
BlockTyp.TEXT, "", "Some bolded text on this lines",
|
||||
[
|
||||
(5, TextFmt.B_B, ""),
|
||||
(16, TextFmt.B_E, ""),
|
||||
@@ -1079,7 +1087,7 @@ def testFmtToken_TextFormat(mockGUI):
|
||||
tokens._text = "Some _italic text_ on this lines\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0, "Some italic text on this lines",
|
||||
BlockTyp.TEXT, "", "Some italic text on this lines",
|
||||
[
|
||||
(5, TextFmt.I_B, ""),
|
||||
(16, TextFmt.I_E, ""),
|
||||
@@ -1091,7 +1099,7 @@ def testFmtToken_TextFormat(mockGUI):
|
||||
tokens._text = "Some **_bold italic text_** on this lines\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0, "Some bold italic text on this lines",
|
||||
BlockTyp.TEXT, "", "Some bold italic text on this lines",
|
||||
[
|
||||
(5, TextFmt.B_B, ""),
|
||||
(5, TextFmt.I_B, ""),
|
||||
@@ -1105,7 +1113,7 @@ def testFmtToken_TextFormat(mockGUI):
|
||||
tokens._text = "Some ~~strikethrough text~~ on this lines\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0, "Some strikethrough text on this lines",
|
||||
BlockTyp.TEXT, "", "Some strikethrough text on this lines",
|
||||
[
|
||||
(5, TextFmt.D_B, ""),
|
||||
(23, TextFmt.D_E, ""),
|
||||
@@ -1117,7 +1125,7 @@ def testFmtToken_TextFormat(mockGUI):
|
||||
tokens._text = "Some **nested bold and _italic_ and ~~strikethrough~~ text** here\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0, "Some nested bold and italic and strikethrough text here",
|
||||
BlockTyp.TEXT, "", "Some nested bold and italic and strikethrough text here",
|
||||
[
|
||||
(5, TextFmt.B_B, ""),
|
||||
(21, TextFmt.I_B, ""),
|
||||
@@ -1149,13 +1157,14 @@ def testFmtToken_Dialogue(mockGUI):
|
||||
project = NWProject()
|
||||
tokens = BareTokenizer(project)
|
||||
tokens.setDialogueHighlight(True)
|
||||
tokens._handle = TMH
|
||||
tokens._isNovel = True
|
||||
|
||||
# Single quotes
|
||||
tokens._text = "Text with \u2018dialogue one,\u2019 and \u2018dialogue two.\u2019\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0,
|
||||
BlockTyp.TEXT, "",
|
||||
"Text with \u2018dialogue one,\u2019 and \u2018dialogue two.\u2019",
|
||||
[
|
||||
(10, TextFmt.COL_B, "dialog"),
|
||||
@@ -1170,7 +1179,7 @@ def testFmtToken_Dialogue(mockGUI):
|
||||
tokens._text = "Text with \u201cdialogue one,\u201d and \u201cdialogue two.\u201d\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0,
|
||||
BlockTyp.TEXT, "",
|
||||
"Text with \u201cdialogue one,\u201d and \u201cdialogue two.\u201d",
|
||||
[
|
||||
(10, TextFmt.COL_B, "dialog"),
|
||||
@@ -1185,7 +1194,7 @@ def testFmtToken_Dialogue(mockGUI):
|
||||
tokens._text = "Text with ::dialogue one,:: and ::dialogue two.::\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0,
|
||||
BlockTyp.TEXT, "",
|
||||
"Text with ::dialogue one,:: and ::dialogue two.::",
|
||||
[
|
||||
(10, TextFmt.COL_B, "altdialog"),
|
||||
@@ -1200,7 +1209,7 @@ def testFmtToken_Dialogue(mockGUI):
|
||||
tokens._text = "\u2013 Dialogue with a narrator break, \u2013he said,\u2013 see?\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0,
|
||||
BlockTyp.TEXT, "",
|
||||
"\u2013 Dialogue with a narrator break, \u2013he said,\u2013 see?",
|
||||
[
|
||||
(0, TextFmt.COL_B, "dialog"),
|
||||
@@ -1218,7 +1227,7 @@ def testFmtToken_Dialogue(mockGUI):
|
||||
tokens._text = "[i]\u201cDialogue text.\u201d[/i]\n"
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [(
|
||||
BlockTyp.TEXT, 0,
|
||||
BlockTyp.TEXT, "",
|
||||
"\u201cDialogue text.\u201d",
|
||||
[
|
||||
(0, TextFmt.I_B, ""),
|
||||
@@ -1235,15 +1244,15 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
"""Test the tokenization of special formats in the Tokenizer class."""
|
||||
project = NWProject()
|
||||
tokens = BareTokenizer(project)
|
||||
|
||||
tokens._handle = TMH
|
||||
tokens._isNovel = True
|
||||
|
||||
# New Page
|
||||
# ========
|
||||
|
||||
correctResp = [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.HEAD1, 2, "Title Two", [], BlockFmt.CENTRE | BlockFmt.PBB),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.HEAD1, TM2, "Title Two", [], BlockFmt.CENTRE | BlockFmt.PBB),
|
||||
]
|
||||
|
||||
# Command wo/Space
|
||||
@@ -1286,9 +1295,9 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Multiple Empty Paragraphs
|
||||
@@ -1302,9 +1311,9 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Three Skips
|
||||
@@ -1315,11 +1324,11 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Malformed Command, Case 1
|
||||
@@ -1330,8 +1339,8 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Malformed Command, Case 2
|
||||
@@ -1342,8 +1351,8 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Malformed Command, Case 3
|
||||
@@ -1354,8 +1363,8 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Empty Paragraph and Page Break
|
||||
@@ -1370,9 +1379,9 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.PBB),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.PBB),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Multiple Skip
|
||||
@@ -1384,11 +1393,11 @@ def testFmtToken_SpecialFormat(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.PBB),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 1, "Some text to go here ...", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.PBB),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Some text to go here ...", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
|
||||
@@ -1398,6 +1407,7 @@ def testFmtToken_TextIndent(mockGUI):
|
||||
project = NWProject()
|
||||
tokens = BareTokenizer(project)
|
||||
tokens.setSynopsis(True)
|
||||
tokens._handle = TMH
|
||||
|
||||
# No First Indent
|
||||
tokens.setFirstLineIndent(True, 1.0, False)
|
||||
@@ -1417,10 +1427,10 @@ def testFmtToken_TextIndent(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, 2, "Scene One", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 2, "First paragraph.", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 2, "Second paragraph.", [], BlockFmt.IND_T),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM2, "Scene One", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "First paragraph.", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Second paragraph.", [], BlockFmt.IND_T),
|
||||
]
|
||||
assert tokens._noIndent is False
|
||||
|
||||
@@ -1436,8 +1446,8 @@ def testFmtToken_TextIndent(mockGUI):
|
||||
(9, TextFmt.B_E, ""), (10, TextFmt.COL_B, "synopsis"), (24, TextFmt.COL_E, ""),
|
||||
]
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD3, 1, "Scene Two", [], BlockFmt.NONE),
|
||||
(BlockTyp.COMMENT, 1, "Synopsis: Stuff happens.", tFmt, BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM1, "Scene Two", [], BlockFmt.NONE),
|
||||
(BlockTyp.COMMENT, "", "Synopsis: Stuff happens.", tFmt, BlockFmt.NONE),
|
||||
]
|
||||
assert tokens._noIndent is True
|
||||
|
||||
@@ -1449,8 +1459,8 @@ def testFmtToken_TextIndent(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.TEXT, 0, "First paragraph.", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 0, "Second paragraph.", [], BlockFmt.IND_T),
|
||||
(BlockTyp.TEXT, "", "First paragraph.", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "Second paragraph.", [], BlockFmt.IND_T),
|
||||
]
|
||||
assert tokens._noIndent is False
|
||||
|
||||
@@ -1472,10 +1482,10 @@ def testFmtToken_TextIndent(mockGUI):
|
||||
)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "Title One", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, 2, "Scene One", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, 2, "First paragraph.", [], BlockFmt.IND_T),
|
||||
(BlockTyp.TEXT, 2, "Second paragraph.", [], BlockFmt.IND_T),
|
||||
(BlockTyp.HEAD1, TM1, "Title One", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM2, "Scene One", [], BlockFmt.NONE),
|
||||
(BlockTyp.TEXT, "", "First paragraph.", [], BlockFmt.IND_T),
|
||||
(BlockTyp.TEXT, "", "Second paragraph.", [], BlockFmt.IND_T),
|
||||
]
|
||||
assert tokens._noIndent is False
|
||||
|
||||
@@ -1488,6 +1498,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
project._loadProjectLocalisation()
|
||||
tokens = BareTokenizer(project)
|
||||
tokens._isNovel = True
|
||||
tokens._handle = TMH
|
||||
|
||||
# Titles
|
||||
# ======
|
||||
@@ -1498,7 +1509,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setPartitionFormat(f"T: {nwHeadFmt.TITLE}")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "T: Part One", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.HEAD1, TM1, "T: Part One", [], BlockFmt.CENTRE),
|
||||
]
|
||||
|
||||
# H1: Title, Not First Page
|
||||
@@ -1507,7 +1518,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setPartitionFormat(f"T: {nwHeadFmt.TITLE}")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD1, 1, "T: Part One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.HEAD1, TM1, "T: Part One", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
]
|
||||
|
||||
# Chapters
|
||||
@@ -1518,7 +1529,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setChapterFormat(f"C: {nwHeadFmt.TITLE}")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "C: Chapter One", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "C: Chapter One", [], BlockFmt.PBB),
|
||||
]
|
||||
|
||||
# H2: Unnumbered Chapter
|
||||
@@ -1526,7 +1537,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setUnNumberedFormat(f"U: {nwHeadFmt.TITLE}")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "U: Prologue", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "U: Prologue", [], BlockFmt.PBB),
|
||||
]
|
||||
|
||||
# H2: Chapter Word Number
|
||||
@@ -1535,7 +1546,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens._hFormatter._chCount = 0
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Chapter One", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "Chapter One", [], BlockFmt.PBB),
|
||||
]
|
||||
|
||||
# H2: Chapter Roman Number Upper Case
|
||||
@@ -1543,7 +1554,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setChapterFormat(f"Chapter {nwHeadFmt.CH_ROMU}")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Chapter II", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "Chapter II", [], BlockFmt.PBB),
|
||||
]
|
||||
|
||||
# H2: Chapter Roman Number Lower Case
|
||||
@@ -1551,7 +1562,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setChapterFormat(f"Chapter {nwHeadFmt.CH_ROML}")
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD2, 1, "Chapter iii", [], BlockFmt.PBB),
|
||||
(BlockTyp.HEAD2, TM1, "Chapter iii", [], BlockFmt.PBB),
|
||||
]
|
||||
|
||||
# Scenes
|
||||
@@ -1562,7 +1573,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setSceneFormat(f"S: {nwHeadFmt.TITLE}", False)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD3, 1, "S: Scene One", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM1, "S: Scene One", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# H3: Scene Hidden wo/Format
|
||||
@@ -1584,7 +1595,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens._noSep = False
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, TM1, "", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# H3: Scene Separator, first
|
||||
@@ -1600,7 +1611,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens._noSep = False
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.SEP, 1, "* * *", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.SEP, TM1, "* * *", [], BlockFmt.CENTRE),
|
||||
]
|
||||
|
||||
# H3: Scene w/Absolute Number
|
||||
@@ -1610,7 +1621,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens._hFormatter._scChCount = 0
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD3, 1, "Scene 1", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM1, "Scene 1", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# H3: Scene w/Chapter Number
|
||||
@@ -1620,7 +1631,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens._hFormatter._scChCount = 1
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD3, 1, "Scene 3.2", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD3, TM1, "Scene 3.2", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# Sections
|
||||
@@ -1637,7 +1648,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setSectionFormat("", False)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, TM1, "", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# H4: Section w/Format
|
||||
@@ -1645,7 +1656,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setSectionFormat(f"X: {nwHeadFmt.TITLE}", False)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.HEAD4, 1, "X: A Section", [], BlockFmt.NONE),
|
||||
(BlockTyp.HEAD4, TM1, "X: A Section", [], BlockFmt.NONE),
|
||||
]
|
||||
|
||||
# H4: Section Separator
|
||||
@@ -1653,7 +1664,7 @@ def testFmtToken_ProcessHeaders(mockGUI):
|
||||
tokens.setSectionFormat("* * *", False)
|
||||
tokens.tokenizeText()
|
||||
assert tokens._blocks == [
|
||||
(BlockTyp.SEP, 1, "* * *", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.SEP, TM1, "* * *", [], BlockFmt.CENTRE),
|
||||
]
|
||||
|
||||
# Check the first scene detector, plain text
|
||||
@@ -1707,7 +1718,7 @@ def testFmtToken_FormatMeta(mockGUI):
|
||||
tokens = BareTokenizer(project)
|
||||
|
||||
assert tokens._formatMeta("@tag: Jane | Jane Smith") == (
|
||||
"Tag: Jane | Jane Smith", [
|
||||
"@tag", "Tag: Jane | Jane Smith", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(4, TextFmt.COL_E, ""), (4, TextFmt.B_E, ""),
|
||||
(5, TextFmt.COL_B, "tag"), (5, TextFmt.ANM_B, "tag_jane"),
|
||||
@@ -1717,7 +1728,7 @@ def testFmtToken_FormatMeta(mockGUI):
|
||||
)
|
||||
|
||||
assert tokens._formatMeta("@char: Jane, John") == (
|
||||
"Characters: Jane, John", [
|
||||
"@char", "Characters: Jane, John", [
|
||||
(0, TextFmt.B_B, ""), (0, TextFmt.COL_B, "keyword"),
|
||||
(11, TextFmt.COL_E, ""), (11, TextFmt.B_E, ""),
|
||||
(12, TextFmt.COL_B, "tag"), (12, TextFmt.HRF_B, "#tag_jane"),
|
||||
|
||||
@@ -221,7 +221,7 @@ def testFmtToMarkdown_ConvertDirect(mockGUI):
|
||||
|
||||
# Title
|
||||
toMD._blocks = [
|
||||
(BlockTyp.TITLE, 1, "A Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
(BlockTyp.TITLE, "", "A Title", [], BlockFmt.PBB | BlockFmt.CENTRE),
|
||||
]
|
||||
toMD.doConvert()
|
||||
assert toMD.result == "# A Title\n\n"
|
||||
@@ -231,14 +231,14 @@ def testFmtToMarkdown_ConvertDirect(mockGUI):
|
||||
|
||||
# Separator
|
||||
toMD._blocks = [
|
||||
(BlockTyp.SEP, 1, "* * *", [], BlockFmt.CENTRE),
|
||||
(BlockTyp.SEP, "", "* * *", [], BlockFmt.CENTRE),
|
||||
]
|
||||
toMD.doConvert()
|
||||
assert toMD.result == "* * *\n\n"
|
||||
|
||||
# Skip
|
||||
toMD._blocks = [
|
||||
(BlockTyp.SKIP, 1, "", [], BlockFmt.NONE),
|
||||
(BlockTyp.SKIP, "", "", [], BlockFmt.NONE),
|
||||
]
|
||||
toMD.doConvert()
|
||||
assert toMD.result == "\n\n"
|
||||
|
||||
@@ -724,7 +724,7 @@ def testFmtToOdt_ConvertDirect(mockGUI):
|
||||
# Justified
|
||||
doc = ToOdt(project, isFlat=True)
|
||||
doc._blocks = [
|
||||
(BlockTyp.TEXT, 1, "This is a paragraph", [], BlockFmt.JUSTIFY),
|
||||
(BlockTyp.TEXT, "", "This is a paragraph", [], BlockFmt.JUSTIFY),
|
||||
]
|
||||
doc.initDocument()
|
||||
doc.doConvert()
|
||||
@@ -744,7 +744,7 @@ def testFmtToOdt_ConvertDirect(mockGUI):
|
||||
# Page Break After
|
||||
doc = ToOdt(project, isFlat=True)
|
||||
doc._blocks = [
|
||||
(BlockTyp.TEXT, 1, "This is a paragraph", [], BlockFmt.PBA),
|
||||
(BlockTyp.TEXT, "", "This is a paragraph", [], BlockFmt.PBA),
|
||||
]
|
||||
doc.initDocument()
|
||||
doc.doConvert()
|
||||
|
||||
@@ -410,8 +410,8 @@ def testFmtToQTextDocument_TextBlockFormats(mockGUI):
|
||||
doc.document.clear()
|
||||
|
||||
doc._blocks = [
|
||||
(BlockTyp.TEXT, 1, "This is justified", [], BlockFmt.JUSTIFY),
|
||||
(BlockTyp.TEXT, 1, "This has a page break", [], BlockFmt.PBA),
|
||||
(BlockTyp.TEXT, "", "This is justified", [], BlockFmt.JUSTIFY),
|
||||
(BlockTyp.TEXT, "", "This has a page break", [], BlockFmt.PBA),
|
||||
]
|
||||
doc.doConvert()
|
||||
assert doc.document.blockCount() == 2
|
||||
|
||||
Reference in New Issue
Block a user