Added support for hard line breaks, with higlighting and export support
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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
@@ -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))
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user