Added support for hard line breaks, with higlighting and export support

This commit is contained in:
Veronica K. B. Olsen
2019-10-28 21:30:46 +01:00
parent 59e5a584f2
commit 57bc837056
7 changed files with 38 additions and 20 deletions
+6 -2
View File
@@ -67,7 +67,8 @@ class ToHtml(Tokenizer):
if tType == self.T_EMPTY: if tType == self.T_EMPTY:
if len(thisPar) > 0: if len(thisPar) > 0:
self.theResult += "<p%s>%s</p>\n" % (hStyle," ".join(thisPar)) tTemp = "".join(thisPar)
self.theResult += "<p%s>%s</p>\n" % (hStyle,tTemp.rstrip())
thisPar = [] thisPar = []
elif tType == self.T_HEAD1: elif tType == self.T_HEAD1:
@@ -92,7 +93,10 @@ class ToHtml(Tokenizer):
tTemp = tText tTemp = tText
for xPos, xLen, xFmt in reversed(tFormat): for xPos, xLen, xFmt in reversed(tFormat):
tTemp = tTemp[:xPos]+htmlTags[xFmt]+tTemp[xPos+xLen:] tTemp = tTemp[:xPos]+htmlTags[xFmt]+tTemp[xPos+xLen:]
thisPar.append(tTemp) if tText.endswith(" "):
thisPar.append(tTemp.rstrip()+"<br/>")
else:
thisPar.append(tTemp.rstrip()+" ")
elif tType == self.T_COMMENT and self.doComments: elif tType == self.T_COMMENT and self.doComments:
self.theResult += "<div class='comment'>%s</div>\n" % tText self.theResult += "<div class='comment'>%s</div>\n" % tText
+4 -1
View File
@@ -95,7 +95,10 @@ class ToLaTeX(Tokenizer):
self.theResult += "\\bigskip\n\n" self.theResult += "\\bigskip\n\n"
elif tType == self.T_TEXT: elif tType == self.T_TEXT:
thisPar.append(self._escapeUnicode(tText)) if tText.endswith(" "):
thisPar.append(self._escapeUnicode(tText.rstrip())+"\\newline")
else:
thisPar.append(self._escapeUnicode(tText.rstrip()))
elif tType == self.T_PBREAK: elif tType == self.T_PBREAK:
self.theResult += "\\newpage\n\n" self.theResult += "\\newpage\n\n"
+2 -1
View File
@@ -80,7 +80,8 @@ class ToText(Tokenizer):
# indicating a new paragraph. # indicating a new paragraph.
if tType == self.T_EMPTY: if tType == self.T_EMPTY:
if len(thisPar) > 0: if len(thisPar) > 0:
self.theResult += "%s\n\n" % " ".join(thisPar) tTemp = " ".join(thisPar)
self.theResult += "%s\n\n" % tTemp.rstrip())
thisPar = [] thisPar = []
elif tType == self.T_HEAD1: elif tType == self.T_HEAD1:
+1 -2
View File
@@ -171,10 +171,9 @@ class Tokenizer():
self.theTokens = [] self.theTokens = []
for aLine in self.theText.splitlines(): for aLine in self.theText.splitlines():
aLine = aLine.strip()
# Tag lines starting with specific characters # Tag lines starting with specific characters
if len(aLine) == 0: if len(aLine.strip()) == 0:
self.theTokens.append((self.T_EMPTY,"",None,self.A_LEFT)) self.theTokens.append((self.T_EMPTY,"",None,self.A_LEFT))
elif aLine[0] == "%": elif aLine[0] == "%":
self.theTokens.append((self.T_COMMENT,aLine[1:].strip(),None,self.A_LEFT)) self.theTokens.append((self.T_COMMENT,aLine[1:].strip(),None,self.A_LEFT))
+13 -2
View File
@@ -13,8 +13,8 @@
import logging import logging
import nw import nw
from PyQt5.QtCore import QRegularExpression from PyQt5.QtCore import Qt, QRegularExpression
from PyQt5.QtGui import QColor, QTextCharFormat, QFont, QSyntaxHighlighter from PyQt5.QtGui import QColor, QTextCharFormat, QFont, QSyntaxHighlighter, QBrush
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@@ -71,6 +71,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
self.colSpell = QColor(*self.theTheme.colSpell) self.colSpell = QColor(*self.theTheme.colSpell)
self.colTagErr = QColor(*self.theTheme.colTagErr) self.colTagErr = QColor(*self.theTheme.colTagErr)
self.colRepTag = QColor(*self.theTheme.colRepTag) self.colRepTag = QColor(*self.theTheme.colRepTag)
self.colTrail = QColor(*self.theTheme.colEmph,64)
self.hStyles = { self.hStyles = {
"header1" : self._makeFormat(self.colHead, "bold",1.8), "header1" : self._makeFormat(self.colHead, "bold",1.8),
@@ -85,6 +86,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
"italic" : self._makeFormat(self.colEmph, "italic"), "italic" : self._makeFormat(self.colEmph, "italic"),
"strike" : self._makeFormat(self.colEmph, "strike"), "strike" : self._makeFormat(self.colEmph, "strike"),
"underline" : self._makeFormat(self.colEmph, "underline"), "underline" : self._makeFormat(self.colEmph, "underline"),
"trailing" : self._makeFormat(self.colTrail,"background"),
"dialogue1" : self._makeFormat(self.colDialN), "dialogue1" : self._makeFormat(self.colDialN),
"dialogue2" : self._makeFormat(self.colDialD), "dialogue2" : self._makeFormat(self.colDialD),
"dialogue3" : self._makeFormat(self.colDialS), "dialogue3" : self._makeFormat(self.colDialS),
@@ -136,6 +138,13 @@ class GuiDocHighlighter(QSyntaxHighlighter):
} }
)) ))
# Trailing Spaces, 2+
self.hRules.append((
r"[ ]{2,}$", {
0 : self.hStyles["trailing"],
}
))
# Markdown # Markdown
self.hRules.append(( self.hRules.append((
r"(?<![\w|\\])([\*]{2})(?!\s)(?m:(.+?))(?<![\s|\\])(\1)(?!\w)", { r"(?<![\w|\\])([\*]{2})(?!\s)(?m:(.+?))(?<![\s|\\])(\1)(?!\w)", {
@@ -283,6 +292,8 @@ class GuiDocHighlighter(QSyntaxHighlighter):
theFormat.setFontStrikeOut(True) theFormat.setFontStrikeOut(True)
if "underline" in fmtStyle: if "underline" in fmtStyle:
theFormat.setFontUnderline(True) theFormat.setFontUnderline(True)
if "background" in fmtStyle:
theFormat.setBackground(QBrush(fmtCol,Qt.SolidPattern))
if fmtSize is not None: if fmtSize is not None:
theFormat.setFontPointSize(round(fmtSize*self.mainConf.textSize)) theFormat.setFontPointSize(round(fmtSize*self.mainConf.textSize))
+4 -4
View File
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="0.3.1" fileVersion="1.0" timeStamp="2019-10-23 21:21:02"> <novelWriterXML appVersion="0.3.2" fileVersion="1.0" timeStamp="2019-10-28 21:28:10">
<project> <project>
<name>Sample Project</name> <name>Sample Project</name>
<title>Sample Project</title> <title>Sample Project</title>
@@ -10,7 +10,7 @@
<settings> <settings>
<spellCheck>True</spellCheck> <spellCheck>True</spellCheck>
<lastEdited>ba8a28a246524</lastEdited> <lastEdited>ba8a28a246524</lastEdited>
<lastViewed>636b6aa9b697b</lastViewed> <lastViewed>ba8a28a246524</lastViewed>
<lastWordCount>859</lastWordCount> <lastWordCount>859</lastWordCount>
<autoReplace> <autoReplace>
<A>B</A> <A>B</A>
@@ -103,10 +103,10 @@
<status>Finished</status> <status>Finished</status>
<expanded>False</expanded> <expanded>False</expanded>
<layout>UNNUMBERED</layout> <layout>UNNUMBERED</layout>
<charCount>614</charCount> <charCount>628</charCount>
<wordCount>101</wordCount> <wordCount>101</wordCount>
<paraCount>3</paraCount> <paraCount>3</paraCount>
<cursorPos>633</cursorPos> <cursorPos>583</cursorPos>
</item> </item>
<item handle="96b68994dfa3d" order="4" parent="e7ded148d6e4a"> <item handle="96b68994dfa3d" order="4" parent="e7ded148d6e4a">
<name>A Note on Ipsums</name> <name>A Note on Ipsums</name>