Adding non-breaking space support for editor and html, latex export
This commit is contained in:
+38
-30
@@ -149,7 +149,9 @@ class nwUnicode:
|
||||
"""Suppoted unicode character constants and translation maps.
|
||||
"""
|
||||
|
||||
# Quotation Marks
|
||||
# Unicode Constants
|
||||
|
||||
## Quotation Marks
|
||||
U_QUOT = "\u0022" # Quotation mark
|
||||
U_APOS = "\u0027" # Apostrophe
|
||||
U_LAQUO = "\u00ab" # Left-pointing double angle quotation mark
|
||||
@@ -170,38 +172,44 @@ class nwUnicode:
|
||||
U_LWCQUO = "\u300e" # Left white corner bracket
|
||||
U_RECQUO = "\u300f" # Right white corner bracket
|
||||
|
||||
# Punctuation
|
||||
U_NDASH = "\u2013" # Short dash
|
||||
U_MDASH = "\u2014" # Long dash
|
||||
## Punctuation
|
||||
U_ENDASH = "\u2013" # Short dash
|
||||
U_EMDASH = "\u2014" # Long dash
|
||||
U_HELLIP = "\u2026" # Ellipsis
|
||||
|
||||
# Other
|
||||
## Other
|
||||
U_NBSP = "\u00a0" # Non-breaking space
|
||||
U_PARA = "\u2029" # Paragraph separator
|
||||
|
||||
HTML = {
|
||||
U_QUOT : """,
|
||||
U_APOS : "'",
|
||||
U_LAQUO : "«",
|
||||
U_RAQUO : "»",
|
||||
U_LSQUO : "‘",
|
||||
U_RSQUO : "’",
|
||||
U_SBQUO : "‚",
|
||||
U_SUQUO : "‛",
|
||||
U_LDQUO : "“",
|
||||
U_RDQUO : "”",
|
||||
U_BDQUO : "„",
|
||||
U_UDQUO : "‟",
|
||||
U_LSAQUO : "‹",
|
||||
U_RSAQUO : "›",
|
||||
U_BDRQUO : "⹂",
|
||||
U_LCQUO : "「",
|
||||
U_RCQUO : "」",
|
||||
U_LWCQUO : "『",
|
||||
U_LWCQUO : "『",
|
||||
U_NDASH : "–",
|
||||
U_MDASH : "—",
|
||||
U_HELLIP : "…",
|
||||
U_NBSP : " ",
|
||||
}
|
||||
# HTML Equivalents
|
||||
|
||||
## Quotes
|
||||
H_QUOT = """
|
||||
H_APOS = "'"
|
||||
H_LAQUO = "«"
|
||||
H_RAQUO = "»"
|
||||
H_LSQUO = "‘"
|
||||
H_RSQUO = "’"
|
||||
H_SBQUO = "‚"
|
||||
H_SUQUO = "‛"
|
||||
H_LDQUO = "“"
|
||||
H_RDQUO = "”"
|
||||
H_BDQUO = "„"
|
||||
H_UDQUO = "‟"
|
||||
H_LSAQUO = "‹"
|
||||
H_RSAQUO = "›"
|
||||
H_BDRQUO = "⹂"
|
||||
H_LCQUO = "「"
|
||||
H_RCQUO = "」"
|
||||
H_LWCQUO = "『"
|
||||
H_LWCQUO = "『"
|
||||
|
||||
## Punctuation
|
||||
H_ENDASH = "–"
|
||||
H_EMDASH = "—"
|
||||
H_HELLIP = "…"
|
||||
|
||||
## Other
|
||||
H_NBSP = " "
|
||||
|
||||
# END Class nwUnicode
|
||||
|
||||
+13
-12
@@ -38,18 +38,19 @@ class HtmlFile(TextFile):
|
||||
self.outFile.write("<!DOCTYPE html>\n")
|
||||
self.outFile.write("<html>\n")
|
||||
self.outFile.write("<head>\n")
|
||||
self.outFile.write("<style>\n")
|
||||
self.outFile.write(" #page {\n")
|
||||
self.outFile.write(" margin: 40px auto;\n")
|
||||
self.outFile.write(" max-width: 769px;\n")
|
||||
self.outFile.write(" }\n")
|
||||
self.outFile.write(" .comment {\n")
|
||||
self.outFile.write(" background-color: #fbfabd;\n")
|
||||
self.outFile.write(" border: 1px solid #b4b000;\n")
|
||||
self.outFile.write(" margin: 10px 20px;\n")
|
||||
self.outFile.write(" padding: 6px;\n")
|
||||
self.outFile.write(" }\n")
|
||||
self.outFile.write("</style>\n")
|
||||
self.outFile.write(" <meta charset='utf-8'>\n")
|
||||
self.outFile.write(" <style>\n")
|
||||
self.outFile.write(" #page {\n")
|
||||
self.outFile.write(" margin: 40px auto;\n")
|
||||
self.outFile.write(" max-width: 769px;\n")
|
||||
self.outFile.write(" }\n")
|
||||
self.outFile.write(" .comment {\n")
|
||||
self.outFile.write(" background-color: #fbfabd;\n")
|
||||
self.outFile.write(" border: 1px solid #b4b000;\n")
|
||||
self.outFile.write(" margin: 10px 20px;\n")
|
||||
self.outFile.write(" padding: 6px;\n")
|
||||
self.outFile.write(" }\n")
|
||||
self.outFile.write(" </style>\n")
|
||||
self.outFile.write("</head>\n")
|
||||
self.outFile.write("<body>\n")
|
||||
self.outFile.write("<article id='page'>\n")
|
||||
|
||||
@@ -138,6 +138,7 @@ class TextFile():
|
||||
self.theConv.tokenizeText()
|
||||
self.theConv.doHeaders()
|
||||
self.theConv.doConvert()
|
||||
self.theConv.doPostProcessing()
|
||||
|
||||
if self.theConv.theResult is not None and self.outFile is not None:
|
||||
self.outFile.write(self.theConv.theResult)
|
||||
|
||||
@@ -15,6 +15,7 @@ import re
|
||||
import nw
|
||||
|
||||
from nw.convert.tokenizer import Tokenizer
|
||||
from nw.constants import nwUnicode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -28,13 +29,13 @@ class ToHtml(Tokenizer):
|
||||
Tokenizer.doAutoReplace(self)
|
||||
|
||||
repDict = {
|
||||
"<" : "<",
|
||||
">" : ">",
|
||||
"&" : "&",
|
||||
"\u2013" : "&endash;",
|
||||
"\u2014" : "$emdash;",
|
||||
"\u2500" : "$emdash;",
|
||||
"\u2026" : "…",
|
||||
"<" : "<",
|
||||
">" : ">",
|
||||
"&" : "&",
|
||||
nwUnicode.U_ENDASH : nwUnicode.H_ENDASH,
|
||||
nwUnicode.U_EMDASH : nwUnicode.H_EMDASH,
|
||||
nwUnicode.U_HELLIP : nwUnicode.H_HELLIP,
|
||||
nwUnicode.U_NBSP : nwUnicode.H_NBSP,
|
||||
}
|
||||
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL)
|
||||
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText)
|
||||
|
||||
@@ -16,6 +16,7 @@ import re
|
||||
import nw
|
||||
|
||||
from nw.convert.tokenizer import Tokenizer
|
||||
from nw.constants import nwUnicode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -26,6 +27,20 @@ class ToLaTeX(Tokenizer):
|
||||
self.texCodecFail = False
|
||||
return
|
||||
|
||||
def doPostProcessing(self):
|
||||
"""The latexcodec misses dashes and non-breaking spaces, so we do those here.
|
||||
"""
|
||||
|
||||
repDict = {
|
||||
nwUnicode.U_ENDASH : "--",
|
||||
nwUnicode.U_EMDASH : "---",
|
||||
nwUnicode.U_NBSP : "~",
|
||||
}
|
||||
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL)
|
||||
self.theResult = xRep.sub(lambda x: repDict[x.group(0)], self.theResult)
|
||||
|
||||
return
|
||||
|
||||
def doConvert(self):
|
||||
|
||||
texTags = {
|
||||
|
||||
@@ -16,6 +16,7 @@ import re
|
||||
import nw
|
||||
|
||||
from nw.convert.tokenizer import Tokenizer
|
||||
from nw.constants import nwUnicode
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -25,6 +26,17 @@ class ToText(Tokenizer):
|
||||
Tokenizer.__init__(self, theProject, theParent)
|
||||
return
|
||||
|
||||
def doAutoReplace(self):
|
||||
Tokenizer.doAutoReplace(self)
|
||||
|
||||
repDict = {
|
||||
nwUnicode.U_NBSP : " ",
|
||||
}
|
||||
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL)
|
||||
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText)
|
||||
|
||||
return
|
||||
|
||||
def doConvert(self):
|
||||
"""Converts the tokenized text into plain text.
|
||||
"""
|
||||
|
||||
@@ -149,6 +149,9 @@ class Tokenizer():
|
||||
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText)
|
||||
return
|
||||
|
||||
def doPostProcessing(self):
|
||||
return
|
||||
|
||||
def tokenizeText(self):
|
||||
"""Scan the text for either lines starting with specific characters that indicate headers,
|
||||
comments, commands etc, or just contains plain text. in the case of plain text, apply the
|
||||
|
||||
+11
-4
@@ -218,7 +218,14 @@ class GuiDocEditor(QTextEdit):
|
||||
return self.docChanged
|
||||
|
||||
def getText(self):
|
||||
theText = self.toPlainText()
|
||||
"""Get the text content of the current document. This method uses QTextEdit->toPlainText for
|
||||
Qt versions lower than 5.9, and the QDocument->toRawText for higher version. The latter
|
||||
preserves non-breaking spaces, which the former does not.
|
||||
"""
|
||||
if self.mainConf.verQtValue >= 50900:
|
||||
theText = self.qDocument.toRawText().replace(nwUnicode.U_PARA,"\n")
|
||||
else:
|
||||
theText = self.toPlainText()
|
||||
return theText
|
||||
|
||||
def setCursorPosition(self, thePosition):
|
||||
@@ -466,11 +473,11 @@ class GuiDocEditor(QTextEdit):
|
||||
|
||||
elif self.mainConf.doReplaceDash and theTwo == "--":
|
||||
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2)
|
||||
theCursor.insertText(nwUnicode.U_NDASH)
|
||||
theCursor.insertText(nwUnicode.U_ENDASH)
|
||||
|
||||
elif self.mainConf.doReplaceDash and theTwo == nwUnicode.U_NDASH+"-":
|
||||
elif self.mainConf.doReplaceDash and theTwo == nwUnicode.U_ENDASH+"-":
|
||||
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2)
|
||||
theCursor.insertText(nwUnicode.U_MDASH)
|
||||
theCursor.insertText(nwUnicode.U_EMDASH)
|
||||
|
||||
elif self.mainConf.doReplaceDots and theThree == "...":
|
||||
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 3)
|
||||
|
||||
@@ -106,6 +106,7 @@ class GuiDocViewer(QTextBrowser):
|
||||
aDoc.doAutoReplace()
|
||||
aDoc.tokenizeText()
|
||||
aDoc.doConvert()
|
||||
aDoc.doPostProcessing()
|
||||
self.setHtml(aDoc.theResult)
|
||||
if self.theHandle == tHandle:
|
||||
self.verticalScrollBar().setValue(sPos)
|
||||
|
||||
@@ -100,7 +100,8 @@ class NWDoc():
|
||||
self.makeAlert(["Could not save document.",str(e)], nwAlert.ERROR)
|
||||
return False
|
||||
|
||||
if path.isfile(docTemp): unlink(docTemp)
|
||||
if path.isfile(docTemp):
|
||||
unlink(docTemp)
|
||||
|
||||
self.theParent.statusBar.setStatus("Saved Document: %s" % self.theItem.itemName)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user