Skip to content

Commit

Permalink
Merge branch 'release' into i18n/update_translations
Browse files Browse the repository at this point in the history
  • Loading branch information
vkbo authored Apr 16, 2024
2 parents d304c09 + 175b674 commit d846811
Show file tree
Hide file tree
Showing 7 changed files with 114 additions and 30 deletions.
25 changes: 21 additions & 4 deletions novelwriter/gui/dochighlight.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@

SPELLRX = QRegularExpression(r"\b[^\s\-\+\/–—\[\]:]+\b")
SPELLRX.setPatternOptions(QRegularExpression.UseUnicodePropertiesOption)
SPELLSC = QRegularExpression(nwRegEx.FMT_SC)
SPELLSC.setPatternOptions(QRegularExpression.UseUnicodePropertiesOption)
SPELLSV = QRegularExpression(nwRegEx.FMT_SV)
SPELLSV.setPatternOptions(QRegularExpression.UseUnicodePropertiesOption)

BLOCK_NONE = 0
BLOCK_TEXT = 1
Expand All @@ -53,7 +57,8 @@

class GuiDocHighlighter(QSyntaxHighlighter):

__slots__ = ("_tItem", "_tHandle", "_spellCheck", "_spellErr", "_hRules", "_hStyles")
__slots__ = ("_tHandle", "_isInactive", "_spellCheck", "_spellErr",
"_hRules", "_hStyles", "_rxRules")

def __init__(self, document: QTextDocument) -> None:
super().__init__(document)
Expand All @@ -67,6 +72,7 @@ def __init__(self, document: QTextDocument) -> None:

self._hRules: list[tuple[str, dict]] = []
self._hStyles: dict[str, QTextCharFormat] = {}
self._rxRules: list[tuple[QRegularExpression, dict[str, QTextCharFormat]]] = []

self.initHighlighter()

Expand Down Expand Up @@ -218,11 +224,11 @@ def initHighlighter(self) -> None:
))

# Build a QRegExp for each highlight pattern
self.rxRules = []
self._rxRules = []
for regEx, regRules in self._hRules:
hReg = QRegularExpression(regEx)
hReg.setPatternOptions(QRegularExpression.UseUnicodePropertiesOption)
self.rxRules.append((hReg, regRules))
self._rxRules.append((hReg, regRules))

return

Expand Down Expand Up @@ -358,7 +364,7 @@ def highlightBlock(self, text: str) -> None:

# Regular Text
self.setCurrentBlockState(BLOCK_TEXT)
for rX, xFmt in self.rxRules:
for rX, xFmt in self._rxRules:
rxItt = rX.globalMatch(text, 0)
while rxItt.hasNext():
rxMatch = rxItt.next()
Expand Down Expand Up @@ -439,6 +445,17 @@ def spellCheck(self, text: str) -> list[tuple[int, int]]:
"""Run the spell checker and cache the result, and return the
list of spell check errors.
"""
if "[" in text:
# Strip shortcodes
for rX in [SPELLSC, SPELLSV]:
rxItt = rX.globalMatch(text, 0)
while rxItt.hasNext():
rxMatch = rxItt.next()
xPos = rxMatch.capturedStart(0)
xLen = rxMatch.capturedLength(0)
xEnd = rxMatch.capturedEnd(0)
text = text[:xPos] + " "*xLen + text[xEnd:]

self._spellErrors = []
rxSpell = SPELLRX.globalMatch(text.replace("_", " "), 0)
while rxSpell.hasNext():
Expand Down
12 changes: 6 additions & 6 deletions novelwriter/gui/outline.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@
from novelwriter.error import logException
from novelwriter.common import checkInt, formatFileFilter, makeFileNameSafe
from novelwriter.constants import nwHeaders, trConst, nwKeyWords, nwLabels
from novelwriter.extensions.configlayout import NColourLabel
from novelwriter.extensions.novelselector import NovelSelector
from novelwriter.types import (
QtAlignLeftTop, QtAlignRight, QtAlignRightTop, QtDecoration, QtUserRole
Expand Down Expand Up @@ -209,19 +210,18 @@ def __init__(self, outlineView: GuiOutlineView) -> None:

logger.debug("Create: GuiOutlineToolBar")

iSz = SHARED.theme.baseIconSize
mPx = CONFIG.pxInt(12)

self.setMovable(False)
self.setIconSize(iSz)
self.setIconSize(1.4*SHARED.theme.baseIconSize)
self.setContentsMargins(0, 0, 0, 0)

stretch = QWidget(self)
stretch.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Expanding)

# Novel Selector
self.novelLabel = QLabel(self.tr("Outline of"), self)
self.novelLabel.setContentsMargins(0, 0, mPx, 0)
self.novelLabel = NColourLabel(
self.tr("Outline of"), parent=self, scale=NColourLabel.HEADER_SCALE, bold=True
)
self.novelLabel.setContentsMargins(0, 0, CONFIG.pxInt(12), 0)

self.novelValue = NovelSelector(self)
self.novelValue.setIncludeAll(True)
Expand Down
47 changes: 33 additions & 14 deletions pkgutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -675,8 +675,10 @@ def makeMinimalPackage(targetOS: int) -> None:
# Make Debian Package (build-deb)
##

def makeDebianPackage(signKey: str | None = None, sourceBuild: bool = False,
distName: str = "unstable", buildName: str = "") -> str:
def makeDebianPackage(
signKey: str | None = None, sourceBuild: bool = False,
distName: str = "unstable", buildName: str = "", oldSetuptools: bool = False
) -> str:
"""Build a Debian package."""
print("")
print("Build Debian Package")
Expand Down Expand Up @@ -778,11 +780,27 @@ def makeDebianPackage(signKey: str | None = None, sourceBuild: bool = False,
))
print("Wrote: setup.py")

setupCfg = readFile("pyproject.toml").replace(
"setup/description_pypi.md", "data/description_short.txt"
)
writeFile(f"{outDir}/pyproject.toml", setupCfg)
print("Wrote: pyproject.toml")
if oldSetuptools:
# This is needed for Ubuntu up to 22.04
setupCfg = readFile("setup/launchpad_setup.cfg").replace(
"file: setup/description_pypi.md", "file: data/description_short.txt"
)
writeFile(f"{outDir}/setup.cfg", setupCfg)
print("Wrote: setup.cfg")

writeFile(f"{outDir}/pyproject.toml", (
"[build-system]\n"
"requires = [\"setuptools\"]\n"
"build-backend = \"setuptools.build_meta\"\n"
))
print("Wrote: pyproject.toml")

else:
pyProject = readFile("pyproject.toml").replace(
"setup/description_pypi.md", "data/description_short.txt"
)
writeFile(f"{outDir}/pyproject.toml", pyProject)
print("Wrote: pyproject.toml")

# Copy/Write Debian Files
# =======================
Expand Down Expand Up @@ -860,15 +878,15 @@ def makeForLaunchpad(doSign: bool = False, isFirst: bool = False) -> None:
bldNum = "0"

distLoop = [
("20.04", "focal"),
("22.04", "jammy"),
("23.10", "mantic"),
("24.04", "noble"),
("20.04", "focal", True),
("22.04", "jammy", True),
("23.10", "mantic", False),
("24.04", "noble", False),
]

print("Building Ubuntu packages for:")
print("")
for distNum, codeName in distLoop:
for distNum, codeName, _ in distLoop:
print(f" * Ubuntu {distNum} {codeName.title()}")
print("")

Expand All @@ -881,13 +899,14 @@ def makeForLaunchpad(doSign: bool = False, isFirst: bool = False) -> None:
print("")

dputCmd = []
for distNum, codeName in distLoop:
for distNum, codeName, oldSetup in distLoop:
buildName = f"ubuntu{distNum}.{bldNum}"
dCmd = makeDebianPackage(
signKey=signKey,
sourceBuild=True,
distName=codeName,
buildName=buildName
buildName=buildName,
oldSetuptools=oldSetup,
)
dputCmd.append(dCmd)

Expand Down
48 changes: 48 additions & 0 deletions setup/launchpad_setup.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
[metadata]
name = novelWriter
version = attr: novelwriter.__version__
author = Veronica Berglyd Olsen
author_email = code@vkbo.net
description = A markdown-like text editor for planning and writing novels
url = https://novelwriter.io
long_description = file: setup/description_pypi.md
long_description_content_type = text/markdown
license_files = LICENSE.md
license = GNU General Public License v3
classifiers =
Programming Language :: Python :: 3 :: Only
Programming Language :: Python :: 3.8
Programming Language :: Python :: 3.9
Programming Language :: Python :: 3.10
Programming Language :: Python :: 3.11
Programming Language :: Python :: 3.12
Programming Language :: Python :: Implementation :: CPython
License :: OSI Approved :: GNU General Public License v3 (GPLv3)
Development Status :: 5 - Production/Stable
Operating System :: OS Independent
Intended Audience :: End Users/Desktop
Natural Language :: English
Topic :: Text Editors
project_urls =
Bug Tracker = https://github.com/vkbo/novelWriter/issues
Documentation = https://docs.novelwriter.io
Source Code = https://github.com/vkbo/novelWriter

[options]
zip_safe = False
python_requires = >=3.8
include_package_data = True
packages = find_namespace:
install_requires =
pyqt5>=5.10
pyenchant>=3.0.0

[options.packages.find]
include = novelwriter*

[options.entry_points]
gui_scripts =
novelwriter = novelwriter:main

[bdist_wheel]
universal = 0
6 changes: 3 additions & 3 deletions tests/reference/guiEditor_Main_Final_0000000000011.nwd
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
%%~name: New Note
%%~path: 0000000000009/0000000000011
%%~kind: PLOT/NOTE
%%~hash: 8ff26f8a18ad6390c2ce725c441ab0c792a125cf
%%~date: 2023-08-25 18:15:35/2023-08-25 18:15:35
%%~hash: 3d3697638a70fc86cc023df6d42202a262d93905
%%~date: 2024-04-14 23:46:49/2024-04-14 23:46:49
# Main Plot

@tag: MainPlot

This is a file detailing the main plot.
This is a file [i]detailing[/i] the main plot.
4 changes: 2 additions & 2 deletions tests/reference/guiEditor_Main_Final_nwProject.nwx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<novelWriterXML appVersion="2.3a1" hexVersion="0x020300a1" fileVersion="1.5" fileRevision="2" timeStamp="2024-01-26 22:48:13">
<novelWriterXML appVersion="2.4rc1" hexVersion="0x020400c1" fileVersion="1.5" fileRevision="3" timeStamp="2024-04-14 23:46:11">
<project id="d0f3fe10-c6e6-4310-8bfd-181eb4224eed" saveCount="3" autoCount="2" editTime="3">
<name>New Project</name>
<author>Jane Doe</author>
Expand Down Expand Up @@ -54,7 +54,7 @@
<name status="s000000" import="i000004">Plot</name>
</item>
<item handle="0000000000011" parent="0000000000009" root="0000000000009" order="0" type="FILE" class="PLOT" layout="NOTE">
<meta expanded="no" heading="H1" charCount="48" wordCount="10" paraCount="1" cursorPos="69" />
<meta expanded="no" heading="H1" charCount="48" wordCount="10" paraCount="1" cursorPos="76" />
<name status="s000000" import="i000004" active="yes">New Note</name>
</item>
<item handle="000000000000a" parent="None" root="000000000000a" order="2" type="ROOT" class="CHARACTER">
Expand Down
2 changes: 1 addition & 1 deletion tests/test_gui/test_gui_guimain.py
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ def testGuiMain_Editing(qtbot, monkeypatch, nwGUI, projPath, tstPaths, mockRnd):
qtbot.keyClick(docEditor, c, delay=KEY_DELAY)
qtbot.keyClick(docEditor, Qt.Key_Return, delay=KEY_DELAY)
qtbot.keyClick(docEditor, Qt.Key_Return, delay=KEY_DELAY)
for c in "This is a file detailing the main plot.":
for c in "This is a file [i]detailing[/i] the main plot.":
qtbot.keyClick(docEditor, c, delay=KEY_DELAY)
qtbot.keyClick(docEditor, Qt.Key_Return, delay=KEY_DELAY)

Expand Down

0 comments on commit d846811

Please sign in to comment.