Merge pull request #87 from vkbo/non_breaking_space
Non-breaking space support
This commit is contained in:
+3
-3
@@ -19,7 +19,7 @@ from os import path, mkdir, makedirs, getcwd
|
|||||||
from appdirs import user_config_dir
|
from appdirs import user_config_dir
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
|
||||||
from nw.constants import nwFiles
|
from nw.constants import nwFiles, nwUnicode
|
||||||
from nw.common import splitVersionNumber
|
from nw.common import splitVersionNumber
|
||||||
|
|
||||||
from PyQt5.Qt import PYQT_VERSION_STR
|
from PyQt5.Qt import PYQT_VERSION_STR
|
||||||
@@ -87,8 +87,8 @@ class Config:
|
|||||||
self.doReplaceDots = True
|
self.doReplaceDots = True
|
||||||
self.wordCountTimer = 5.0
|
self.wordCountTimer = 5.0
|
||||||
|
|
||||||
self.fmtSingleQuotes = ["\u2018","\u2019"]
|
self.fmtSingleQuotes = [nwUnicode.U_LSQUO,nwUnicode.U_RSQUO]
|
||||||
self.fmtDoubleQuotes = ["\u201c","\u201d"]
|
self.fmtDoubleQuotes = [nwUnicode.U_LDQUO,nwUnicode.U_RDQUO]
|
||||||
|
|
||||||
self.spellLanguage = "en_GB"
|
self.spellLanguage = "en_GB"
|
||||||
|
|
||||||
|
|||||||
+70
-22
@@ -142,26 +142,74 @@ class nwQuotes():
|
|||||||
"\u300e", # Left white corner bracket
|
"\u300e", # Left white corner bracket
|
||||||
"\u300f", # Right white corner bracket
|
"\u300f", # Right white corner bracket
|
||||||
]
|
]
|
||||||
HTML = {
|
|
||||||
"\u0022" : """,
|
|
||||||
"\u0027" : "'",
|
|
||||||
"\u00ab" : "«",
|
|
||||||
"\u00bb" : "»",
|
|
||||||
"\u2018" : "‘",
|
|
||||||
"\u2019" : "’",
|
|
||||||
"\u201a" : "‚",
|
|
||||||
"\u201b" : "‛",
|
|
||||||
"\u201c" : "“",
|
|
||||||
"\u201d" : "”",
|
|
||||||
"\u201e" : "„",
|
|
||||||
"\u201f" : "‟",
|
|
||||||
"\u2039" : "‹",
|
|
||||||
"\u203a" : "›",
|
|
||||||
"\u2e42" : "⹂",
|
|
||||||
"\u300c" : "「",
|
|
||||||
"\u300d" : "」",
|
|
||||||
"\u300e" : "『",
|
|
||||||
"\u300f" : "』",
|
|
||||||
}
|
|
||||||
|
|
||||||
# END Class nwQuotes
|
# END Class nwQuotes
|
||||||
|
|
||||||
|
class nwUnicode:
|
||||||
|
"""Suppoted unicode character constants and translation maps.
|
||||||
|
"""
|
||||||
|
|
||||||
|
# Unicode Constants
|
||||||
|
|
||||||
|
## Quotation Marks
|
||||||
|
U_QUOT = "\u0022" # Quotation mark
|
||||||
|
U_APOS = "\u0027" # Apostrophe
|
||||||
|
U_LAQUO = "\u00ab" # Left-pointing double angle quotation mark
|
||||||
|
U_RAQUO = "\u00bb" # Right-pointing double angle quotation mark
|
||||||
|
U_LSQUO = "\u2018" # Left single quotation mark
|
||||||
|
U_RSQUO = "\u2019" # Right single quotation mark
|
||||||
|
U_SBQUO = "\u201a" # Single low-9 quotation mark
|
||||||
|
U_SUQUO = "\u201b" # Single high-reversed-9 quotation mark
|
||||||
|
U_LDQUO = "\u201c" # Left double quotation mark
|
||||||
|
U_RDQUO = "\u201d" # Right double quotation mark
|
||||||
|
U_BDQUO = "\u201e" # Double low-9 quotation mark
|
||||||
|
U_UDQUO = "\u201f" # Double high-reversed-9 quotation mark
|
||||||
|
U_LSAQUO = "\u2039" # Single left-pointing angle quotation mark
|
||||||
|
U_RSAQUO = "\u203a" # Single right-pointing angle quotation mark
|
||||||
|
U_BDRQUO = "\u2e42" # Double low-reversed-9 quotation mark
|
||||||
|
U_LCQUO = "\u300c" # Left corner bracket
|
||||||
|
U_RCQUO = "\u300d" # Right corner bracket
|
||||||
|
U_LWCQUO = "\u300e" # Left white corner bracket
|
||||||
|
U_RECQUO = "\u300f" # Right white corner bracket
|
||||||
|
|
||||||
|
## Punctuation
|
||||||
|
U_ENDASH = "\u2013" # Short dash
|
||||||
|
U_EMDASH = "\u2014" # Long dash
|
||||||
|
U_HELLIP = "\u2026" # Ellipsis
|
||||||
|
|
||||||
|
## Other
|
||||||
|
U_NBSP = "\u00a0" # Non-breaking space
|
||||||
|
U_PARA = "\u2029" # Paragraph separator
|
||||||
|
|
||||||
|
# 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("<!DOCTYPE html>\n")
|
||||||
self.outFile.write("<html>\n")
|
self.outFile.write("<html>\n")
|
||||||
self.outFile.write("<head>\n")
|
self.outFile.write("<head>\n")
|
||||||
self.outFile.write("<style>\n")
|
self.outFile.write(" <meta charset='utf-8'>\n")
|
||||||
self.outFile.write(" #page {\n")
|
self.outFile.write(" <style>\n")
|
||||||
self.outFile.write(" margin: 40px auto;\n")
|
self.outFile.write(" #page {\n")
|
||||||
self.outFile.write(" max-width: 769px;\n")
|
self.outFile.write(" margin: 40px auto;\n")
|
||||||
self.outFile.write(" }\n")
|
self.outFile.write(" max-width: 769px;\n")
|
||||||
self.outFile.write(" .comment {\n")
|
self.outFile.write(" }\n")
|
||||||
self.outFile.write(" background-color: #fbfabd;\n")
|
self.outFile.write(" .comment {\n")
|
||||||
self.outFile.write(" border: 1px solid #b4b000;\n")
|
self.outFile.write(" background-color: #fbfabd;\n")
|
||||||
self.outFile.write(" margin: 10px 20px;\n")
|
self.outFile.write(" border: 1px solid #b4b000;\n")
|
||||||
self.outFile.write(" padding: 6px;\n")
|
self.outFile.write(" margin: 10px 20px;\n")
|
||||||
self.outFile.write(" }\n")
|
self.outFile.write(" padding: 6px;\n")
|
||||||
self.outFile.write("</style>\n")
|
self.outFile.write(" }\n")
|
||||||
|
self.outFile.write(" </style>\n")
|
||||||
self.outFile.write("</head>\n")
|
self.outFile.write("</head>\n")
|
||||||
self.outFile.write("<body>\n")
|
self.outFile.write("<body>\n")
|
||||||
self.outFile.write("<article id='page'>\n")
|
self.outFile.write("<article id='page'>\n")
|
||||||
|
|||||||
@@ -138,6 +138,7 @@ class TextFile():
|
|||||||
self.theConv.tokenizeText()
|
self.theConv.tokenizeText()
|
||||||
self.theConv.doHeaders()
|
self.theConv.doHeaders()
|
||||||
self.theConv.doConvert()
|
self.theConv.doConvert()
|
||||||
|
self.theConv.doPostProcessing()
|
||||||
|
|
||||||
if self.theConv.theResult is not None and self.outFile is not None:
|
if self.theConv.theResult is not None and self.outFile is not None:
|
||||||
self.outFile.write(self.theConv.theResult)
|
self.outFile.write(self.theConv.theResult)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import re
|
|||||||
import nw
|
import nw
|
||||||
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
from nw.convert.tokenizer import Tokenizer
|
||||||
|
from nw.constants import nwUnicode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -28,13 +29,13 @@ class ToHtml(Tokenizer):
|
|||||||
Tokenizer.doAutoReplace(self)
|
Tokenizer.doAutoReplace(self)
|
||||||
|
|
||||||
repDict = {
|
repDict = {
|
||||||
"<" : "<",
|
"<" : "<",
|
||||||
">" : ">",
|
">" : ">",
|
||||||
"&" : "&",
|
"&" : "&",
|
||||||
"\u2013" : "&endash;",
|
nwUnicode.U_ENDASH : nwUnicode.H_ENDASH,
|
||||||
"\u2014" : "$emdash;",
|
nwUnicode.U_EMDASH : nwUnicode.H_EMDASH,
|
||||||
"\u2500" : "$emdash;",
|
nwUnicode.U_HELLIP : nwUnicode.H_HELLIP,
|
||||||
"\u2026" : "…",
|
nwUnicode.U_NBSP : nwUnicode.H_NBSP,
|
||||||
}
|
}
|
||||||
xRep = re.compile("|".join([re.escape(k) for k in repDict.keys()]), flags=re.DOTALL)
|
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)
|
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText)
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import re
|
|||||||
import nw
|
import nw
|
||||||
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
from nw.convert.tokenizer import Tokenizer
|
||||||
|
from nw.constants import nwUnicode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -26,6 +27,20 @@ class ToLaTeX(Tokenizer):
|
|||||||
self.texCodecFail = False
|
self.texCodecFail = False
|
||||||
return
|
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):
|
def doConvert(self):
|
||||||
|
|
||||||
texTags = {
|
texTags = {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import re
|
|||||||
import nw
|
import nw
|
||||||
|
|
||||||
from nw.convert.tokenizer import Tokenizer
|
from nw.convert.tokenizer import Tokenizer
|
||||||
|
from nw.constants import nwUnicode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -25,6 +26,17 @@ class ToText(Tokenizer):
|
|||||||
Tokenizer.__init__(self, theProject, theParent)
|
Tokenizer.__init__(self, theProject, theParent)
|
||||||
return
|
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):
|
def doConvert(self):
|
||||||
"""Converts the tokenized text into plain text.
|
"""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)
|
self.theText = xRep.sub(lambda x: repDict[x.group(0)], self.theText)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def doPostProcessing(self):
|
||||||
|
return
|
||||||
|
|
||||||
def tokenizeText(self):
|
def tokenizeText(self):
|
||||||
"""Scan the text for either lines starting with specific characters that indicate headers,
|
"""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
|
comments, commands etc, or just contains plain text. in the case of plain text, apply the
|
||||||
|
|||||||
+38
-7
@@ -23,7 +23,7 @@ from nw.project.document import NWDoc
|
|||||||
from nw.gui.dochighlight import GuiDocHighlighter
|
from nw.gui.dochighlight import GuiDocHighlighter
|
||||||
from nw.gui.wordcounter import WordCounter
|
from nw.gui.wordcounter import WordCounter
|
||||||
from nw.tools.spellcheck import NWSpellCheck
|
from nw.tools.spellcheck import NWSpellCheck
|
||||||
from nw.constants import nwFiles
|
from nw.constants import nwFiles, nwUnicode
|
||||||
from nw.enum import nwDocAction, nwAlert
|
from nw.enum import nwDocAction, nwAlert
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
@@ -218,7 +218,14 @@ class GuiDocEditor(QTextEdit):
|
|||||||
return self.docChanged
|
return self.docChanged
|
||||||
|
|
||||||
def getText(self):
|
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
|
return theText
|
||||||
|
|
||||||
def setCursorPosition(self, thePosition):
|
def setCursorPosition(self, thePosition):
|
||||||
@@ -316,9 +323,26 @@ class GuiDocEditor(QTextEdit):
|
|||||||
to know whether we had a selection prior to triggering the _docChange slot, as we do not
|
to know whether we had a selection prior to triggering the _docChange slot, as we do not
|
||||||
want to trigger autoreplace on selections. Autoreplace on selections messes with undo/redo
|
want to trigger autoreplace on selections. Autoreplace on selections messes with undo/redo
|
||||||
history.
|
history.
|
||||||
|
We also need to intercept the Shift key modifier for certain key combinations that modifies
|
||||||
|
standard keys like enter and space. However, we don't want to spend a lot of time in this
|
||||||
|
function as it is triggered on every keypress when typing.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
self.hasSelection = self.textCursor().hasSelection()
|
self.hasSelection = self.textCursor().hasSelection()
|
||||||
QTextEdit.keyPressEvent(self, keyEvent)
|
|
||||||
|
if keyEvent.modifiers() == Qt.ShiftModifier:
|
||||||
|
theKey = keyEvent.key()
|
||||||
|
if theKey == Qt.Key_Return:
|
||||||
|
self._insertHardBreak()
|
||||||
|
elif theKey == Qt.Key_Enter:
|
||||||
|
self._insertHardBreak()
|
||||||
|
elif theKey == Qt.Key_Space:
|
||||||
|
self._insertNonBreakingSpace()
|
||||||
|
else:
|
||||||
|
QTextEdit.keyPressEvent(self, keyEvent)
|
||||||
|
else:
|
||||||
|
QTextEdit.keyPressEvent(self, keyEvent)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
##
|
##
|
||||||
@@ -332,6 +356,13 @@ class GuiDocEditor(QTextEdit):
|
|||||||
theCursor.endEditBlock()
|
theCursor.endEditBlock()
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def _insertNonBreakingSpace(self):
|
||||||
|
theCursor = self.textCursor()
|
||||||
|
theCursor.beginEditBlock()
|
||||||
|
theCursor.insertText(nwUnicode.U_NBSP)
|
||||||
|
theCursor.endEditBlock()
|
||||||
|
return
|
||||||
|
|
||||||
def _openSpellContext(self):
|
def _openSpellContext(self):
|
||||||
self._openContextMenu(self.cursorRect().center())
|
self._openContextMenu(self.cursorRect().center())
|
||||||
return
|
return
|
||||||
@@ -442,15 +473,15 @@ class GuiDocEditor(QTextEdit):
|
|||||||
|
|
||||||
elif self.mainConf.doReplaceDash and theTwo == "--":
|
elif self.mainConf.doReplaceDash and theTwo == "--":
|
||||||
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2)
|
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2)
|
||||||
theCursor.insertText("\u2013")
|
theCursor.insertText(nwUnicode.U_ENDASH)
|
||||||
|
|
||||||
elif self.mainConf.doReplaceDash and theTwo == "\u2013-":
|
elif self.mainConf.doReplaceDash and theTwo == nwUnicode.U_ENDASH+"-":
|
||||||
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2)
|
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 2)
|
||||||
theCursor.insertText("\u2014")
|
theCursor.insertText(nwUnicode.U_EMDASH)
|
||||||
|
|
||||||
elif self.mainConf.doReplaceDots and theThree == "...":
|
elif self.mainConf.doReplaceDots and theThree == "...":
|
||||||
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 3)
|
theCursor.movePosition(QTextCursor.Left, QTextCursor.KeepAnchor, 3)
|
||||||
theCursor.insertText("\u2026")
|
theCursor.insertText(nwUnicode.U_HELLIP)
|
||||||
|
|
||||||
return
|
return
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import nw
|
|||||||
from PyQt5.QtCore import Qt, QRegularExpression
|
from PyQt5.QtCore import Qt, QRegularExpression
|
||||||
from PyQt5.QtGui import QColor, QTextCharFormat, QFont, QSyntaxHighlighter, QBrush
|
from PyQt5.QtGui import QColor, QTextCharFormat, QFont, QSyntaxHighlighter, QBrush
|
||||||
|
|
||||||
|
from nw.constants import nwUnicode
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
class GuiDocHighlighter(QSyntaxHighlighter):
|
class GuiDocHighlighter(QSyntaxHighlighter):
|
||||||
@@ -87,6 +89,7 @@ class GuiDocHighlighter(QSyntaxHighlighter):
|
|||||||
"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"),
|
"trailing" : self._makeFormat(self.colTrail,"background"),
|
||||||
|
"nobreak" : 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),
|
||||||
@@ -145,6 +148,13 @@ class GuiDocHighlighter(QSyntaxHighlighter):
|
|||||||
}
|
}
|
||||||
))
|
))
|
||||||
|
|
||||||
|
# Non-breaking Space
|
||||||
|
self.hRules.append((
|
||||||
|
"[\u00a0]+", {
|
||||||
|
0 : self.hStyles["nobreak"],
|
||||||
|
}
|
||||||
|
))
|
||||||
|
|
||||||
# Markdown
|
# Markdown
|
||||||
self.hRules.append((
|
self.hRules.append((
|
||||||
r"(?<![\w|\\])([\*]{2})(?!\s)(?m:(.+?))(?<![\s|\\])(\1)(?!\w)", {
|
r"(?<![\w|\\])([\*]{2})(?!\s)(?m:(.+?))(?<![\s|\\])(\1)(?!\w)", {
|
||||||
|
|||||||
@@ -106,6 +106,7 @@ class GuiDocViewer(QTextBrowser):
|
|||||||
aDoc.doAutoReplace()
|
aDoc.doAutoReplace()
|
||||||
aDoc.tokenizeText()
|
aDoc.tokenizeText()
|
||||||
aDoc.doConvert()
|
aDoc.doConvert()
|
||||||
|
aDoc.doPostProcessing()
|
||||||
self.setHtml(aDoc.theResult)
|
self.setHtml(aDoc.theResult)
|
||||||
if self.theHandle == tHandle:
|
if self.theHandle == tHandle:
|
||||||
self.verticalScrollBar().setValue(sPos)
|
self.verticalScrollBar().setValue(sPos)
|
||||||
|
|||||||
@@ -100,7 +100,8 @@ class NWDoc():
|
|||||||
self.makeAlert(["Could not save document.",str(e)], nwAlert.ERROR)
|
self.makeAlert(["Could not save document.",str(e)], nwAlert.ERROR)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if path.isfile(docTemp): unlink(docTemp)
|
if path.isfile(docTemp):
|
||||||
|
unlink(docTemp)
|
||||||
|
|
||||||
self.theParent.statusBar.setStatus("Saved Document: %s" % self.theItem.itemName)
|
self.theParent.statusBar.setStatus("Saved Document: %s" % self.theItem.itemName)
|
||||||
|
|
||||||
|
|||||||
@@ -18,4 +18,4 @@ This one is a bit longer. “It also has some dialogue in it” she said, before
|
|||||||
|
|
||||||
Let’s auto-replace this A with <A>, and this C with <C>. While <E> is just <E>.
|
Let’s auto-replace this A with <A>, and this C with <C>. While <E> is just <E>.
|
||||||
|
|
||||||
|
Let’s also add some text with a non-breaking space in it, like right here!
|
||||||
|
|||||||
@@ -13,6 +13,3 @@ With many cheerful facts about the square of the hypotenuse
|
|||||||
With many cheerful facts about the square of the hypotenuse
|
With many cheerful facts about the square of the hypotenuse
|
||||||
With many cheerful facts about the square of the hypotenuse
|
With many cheerful facts about the square of the hypotenuse
|
||||||
With many cheerful facts about the square of the hypotepotenuse
|
With many cheerful facts about the square of the hypotepotenuse
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
<?xml version='1.0' encoding='utf-8'?>
|
<?xml version='1.0' encoding='utf-8'?>
|
||||||
<novelWriterXML appVersion="0.3.2" fileVersion="1.0" timeStamp="2019-10-28 21:42:26">
|
<novelWriterXML appVersion="0.3.2" fileVersion="1.0" timeStamp="2019-10-29 14:42:48">
|
||||||
<project>
|
<project>
|
||||||
<name>Sample Project</name>
|
<name>Sample Project</name>
|
||||||
<title>Sample Project</title>
|
<title>Sample Project</title>
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
<spellCheck>True</spellCheck>
|
<spellCheck>True</spellCheck>
|
||||||
<lastEdited>ba8a28a246524</lastEdited>
|
<lastEdited>ba8a28a246524</lastEdited>
|
||||||
<lastViewed>ba8a28a246524</lastViewed>
|
<lastViewed>ba8a28a246524</lastViewed>
|
||||||
<lastWordCount>859</lastWordCount>
|
<lastWordCount>873</lastWordCount>
|
||||||
<autoReplace>
|
<autoReplace>
|
||||||
<A>B</A>
|
<A>B</A>
|
||||||
<B>E</B>
|
<B>E</B>
|
||||||
@@ -79,10 +79,10 @@
|
|||||||
<status>Notes</status>
|
<status>Notes</status>
|
||||||
<expanded>False</expanded>
|
<expanded>False</expanded>
|
||||||
<layout>SCENE</layout>
|
<layout>SCENE</layout>
|
||||||
<charCount>713</charCount>
|
<charCount>787</charCount>
|
||||||
<wordCount>132</wordCount>
|
<wordCount>146</wordCount>
|
||||||
<paraCount>6</paraCount>
|
<paraCount>7</paraCount>
|
||||||
<cursorPos>72</cursorPos>
|
<cursorPos>152</cursorPos>
|
||||||
</item>
|
</item>
|
||||||
<item handle="bc0cbd2a407f3" order="2" parent="e7ded148d6e4a">
|
<item handle="bc0cbd2a407f3" order="2" parent="e7ded148d6e4a">
|
||||||
<name>Another Scene</name>
|
<name>Another Scene</name>
|
||||||
@@ -103,10 +103,10 @@
|
|||||||
<status>Finished</status>
|
<status>Finished</status>
|
||||||
<expanded>False</expanded>
|
<expanded>False</expanded>
|
||||||
<layout>UNNUMBERED</layout>
|
<layout>UNNUMBERED</layout>
|
||||||
<charCount>626</charCount>
|
<charCount>630</charCount>
|
||||||
<wordCount>101</wordCount>
|
<wordCount>101</wordCount>
|
||||||
<paraCount>3</paraCount>
|
<paraCount>3</paraCount>
|
||||||
<cursorPos>583</cursorPos>
|
<cursorPos>648</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