novelWriter 2.2rc1__py3-none-any.whl → 2.3b1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/METADATA +1 -1
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/RECORD +141 -129
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/WHEEL +1 -1
- novelwriter/__init__.py +11 -6
- novelwriter/assets/i18n/nw_de_DE.qm +0 -0
- novelwriter/assets/i18n/nw_en_US.qm +0 -0
- novelwriter/assets/i18n/nw_es_419.qm +0 -0
- novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
- novelwriter/assets/i18n/nw_it_IT.qm +0 -0
- novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
- novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
- novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
- novelwriter/assets/i18n/project_de_DE.json +1 -0
- novelwriter/assets/i18n/project_en_US.json +1 -0
- novelwriter/assets/i18n/project_es_419.json +11 -0
- novelwriter/assets/i18n/project_fr_FR.json +11 -0
- novelwriter/assets/i18n/project_it_IT.json +11 -0
- novelwriter/assets/i18n/project_ja_JP.json +2 -1
- novelwriter/assets/i18n/project_nb_NO.json +1 -0
- novelwriter/assets/i18n/project_zh_CN.json +11 -0
- novelwriter/assets/icons/typicons_dark/icons.conf +9 -2
- novelwriter/assets/icons/typicons_dark/mixed_import.svg +5 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +3 -1
- novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +3 -1
- novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +3 -1
- novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +4 -2
- novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +4 -2
- novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +4 -2
- novelwriter/assets/icons/typicons_dark/typ_document-add-col.svg +8 -0
- novelwriter/assets/icons/typicons_dark/typ_document-add.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_document.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +4 -0
- novelwriter/assets/icons/typicons_light/icons.conf +9 -2
- novelwriter/assets/icons/typicons_light/mixed_import.svg +5 -0
- novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +3 -1
- novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +3 -1
- novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +3 -1
- novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +4 -2
- novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +4 -2
- novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +4 -2
- novelwriter/assets/icons/typicons_light/typ_document-add-col.svg +8 -0
- novelwriter/assets/icons/typicons_light/typ_document-add.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_document.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +4 -0
- novelwriter/assets/images/novelwriter-text-dark.svg +4 -0
- novelwriter/assets/images/novelwriter-text-light.svg +4 -0
- novelwriter/assets/images/welcome-dark.jpg +0 -0
- novelwriter/assets/images/welcome-light.jpg +0 -0
- novelwriter/assets/manual.pdf +0 -0
- novelwriter/assets/sample.zip +0 -0
- novelwriter/assets/syntax/default_dark.conf +1 -0
- novelwriter/assets/syntax/default_light.conf +1 -0
- novelwriter/assets/syntax/grey_dark.conf +1 -0
- novelwriter/assets/syntax/grey_light.conf +1 -0
- novelwriter/assets/syntax/light_owl.conf +1 -0
- novelwriter/assets/syntax/night_owl.conf +1 -0
- novelwriter/assets/syntax/solarized_dark.conf +1 -0
- novelwriter/assets/syntax/solarized_light.conf +1 -0
- novelwriter/assets/syntax/tomorrow.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
- novelwriter/assets/text/credits_en.htm +4 -2
- novelwriter/assets/themes/default_dark.conf +2 -2
- novelwriter/assets/themes/default_light.conf +2 -2
- novelwriter/common.py +64 -66
- novelwriter/config.py +39 -44
- novelwriter/constants.py +39 -17
- novelwriter/core/buildsettings.py +8 -8
- novelwriter/core/coretools.py +194 -155
- novelwriter/core/docbuild.py +7 -4
- novelwriter/core/document.py +7 -7
- novelwriter/core/index.py +90 -57
- novelwriter/core/item.py +23 -5
- novelwriter/core/options.py +11 -10
- novelwriter/core/project.py +72 -47
- novelwriter/core/projectdata.py +3 -16
- novelwriter/core/projectxml.py +14 -42
- novelwriter/core/sessions.py +4 -3
- novelwriter/core/spellcheck.py +6 -4
- novelwriter/core/status.py +5 -4
- novelwriter/core/storage.py +179 -141
- novelwriter/core/tohtml.py +6 -4
- novelwriter/core/tokenizer.py +74 -46
- novelwriter/core/tomd.py +2 -2
- novelwriter/core/toodt.py +41 -31
- novelwriter/core/tree.py +5 -4
- novelwriter/dialogs/about.py +88 -179
- novelwriter/dialogs/docmerge.py +30 -20
- novelwriter/dialogs/docsplit.py +33 -22
- novelwriter/dialogs/editlabel.py +20 -8
- novelwriter/dialogs/preferences.py +562 -725
- novelwriter/dialogs/{projsettings.py → projectsettings.py} +301 -270
- novelwriter/dialogs/quotes.py +47 -36
- novelwriter/dialogs/wordlist.py +128 -59
- novelwriter/enum.py +25 -22
- novelwriter/error.py +2 -2
- novelwriter/extensions/circularprogress.py +12 -12
- novelwriter/extensions/configlayout.py +185 -146
- novelwriter/extensions/{wheeleventfilter.py → eventfilters.py} +15 -5
- novelwriter/extensions/modified.py +81 -0
- novelwriter/extensions/novelselector.py +27 -13
- novelwriter/extensions/pagedsidebar.py +15 -20
- novelwriter/extensions/simpleprogress.py +8 -9
- novelwriter/extensions/statusled.py +9 -9
- novelwriter/extensions/switch.py +32 -64
- novelwriter/extensions/switchbox.py +2 -7
- novelwriter/extensions/versioninfo.py +153 -0
- novelwriter/gui/doceditor.py +250 -214
- novelwriter/gui/dochighlight.py +66 -94
- novelwriter/gui/docviewer.py +71 -98
- novelwriter/gui/docviewerpanel.py +140 -47
- novelwriter/gui/editordocument.py +3 -3
- novelwriter/gui/itemdetails.py +9 -9
- novelwriter/gui/mainmenu.py +47 -46
- novelwriter/gui/noveltree.py +53 -61
- novelwriter/gui/outline.py +100 -76
- novelwriter/gui/projtree.py +193 -67
- novelwriter/gui/sidebar.py +9 -8
- novelwriter/gui/statusbar.py +49 -7
- novelwriter/gui/theme.py +65 -74
- novelwriter/guimain.py +173 -330
- novelwriter/shared.py +68 -30
- novelwriter/tools/dictionaries.py +7 -8
- novelwriter/tools/lipsum.py +34 -28
- novelwriter/tools/manusbuild.py +3 -4
- novelwriter/tools/manuscript.py +25 -32
- novelwriter/tools/manussettings.py +194 -225
- novelwriter/tools/noveldetails.py +525 -0
- novelwriter/tools/welcome.py +802 -0
- novelwriter/tools/writingstats.py +26 -13
- novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +0 -8
- novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +0 -8
- novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +0 -8
- novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +0 -8
- novelwriter/assets/images/wizard-back.jpg +0 -0
- novelwriter/assets/text/gplv3_en.htm +0 -641
- novelwriter/assets/text/release_notes.htm +0 -17
- novelwriter/dialogs/projdetails.py +0 -525
- novelwriter/dialogs/projload.py +0 -298
- novelwriter/dialogs/updates.py +0 -182
- novelwriter/extensions/pageddialog.py +0 -130
- novelwriter/tools/projwizard.py +0 -478
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/LICENSE.md +0 -0
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/entry_points.txt +0 -0
- {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/top_level.txt +0 -0
novelwriter/core/projectdata.py
CHANGED
@@ -3,10 +3,10 @@ novelWriter – Project Data Class
|
|
3
3
|
================================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created: 2022-10-30 [2.0rc2]
|
6
|
+
Created: 2022-10-30 [2.0rc2] NWProjectData
|
7
7
|
|
8
8
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
9
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
10
|
|
11
11
|
This program is free software: you can redistribute it and/or modify
|
12
12
|
it under the terms of the GNU General Public License as published by
|
@@ -53,7 +53,6 @@ class NWProjectData:
|
|
53
53
|
# Project Meta
|
54
54
|
self._uuid = ""
|
55
55
|
self._name = ""
|
56
|
-
self._title = ""
|
57
56
|
self._author = ""
|
58
57
|
self._saveCount = 0
|
59
58
|
self._autoCount = 0
|
@@ -102,11 +101,6 @@ class NWProjectData:
|
|
102
101
|
"""Return the project name."""
|
103
102
|
return self._name
|
104
103
|
|
105
|
-
@property
|
106
|
-
def title(self) -> str:
|
107
|
-
"""Return the project title."""
|
108
|
-
return self._title
|
109
|
-
|
110
104
|
@property
|
111
105
|
def author(self) -> str:
|
112
106
|
"""Return the project author."""
|
@@ -228,16 +222,9 @@ class NWProjectData:
|
|
228
222
|
self._project.setProjectChanged(True)
|
229
223
|
return
|
230
224
|
|
231
|
-
def setTitle(self, value: str | None) -> None:
|
232
|
-
"""Set a new novel title."""
|
233
|
-
if value != self._title:
|
234
|
-
self._title = simplified(str(value or ""))
|
235
|
-
self._project.setProjectChanged(True)
|
236
|
-
return
|
237
|
-
|
238
225
|
def setAuthor(self, value: str | None) -> None:
|
239
226
|
"""Set the author value."""
|
240
|
-
if value != self.
|
227
|
+
if value != self._author:
|
241
228
|
self._author = simplified(str(value or ""))
|
242
229
|
self._project.setProjectChanged(True)
|
243
230
|
return
|
novelwriter/core/projectxml.py
CHANGED
@@ -8,7 +8,7 @@ Created: 2022-09-28 [2.0rc2] ProjectXMLReader
|
|
8
8
|
Created: 2022-10-31 [2.0rc2] ProjectXMLWriter
|
9
9
|
|
10
10
|
This file is a part of novelWriter
|
11
|
-
Copyright 2018–
|
11
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
12
12
|
|
13
13
|
This program is free software: you can redistribute it and/or modify
|
14
14
|
it under the terms of the GNU General Public License as published by
|
@@ -38,7 +38,6 @@ from novelwriter.common import (
|
|
38
38
|
checkBool, checkInt, checkString, checkStringNone, formatTimeStamp,
|
39
39
|
hexToInt, simplified, xmlIndent, yesNo
|
40
40
|
)
|
41
|
-
from novelwriter.constants import nwFiles
|
42
41
|
|
43
42
|
if TYPE_CHECKING: # pragma: no cover
|
44
43
|
from novelwriter.core.status import NWStatus
|
@@ -47,7 +46,7 @@ if TYPE_CHECKING: # pragma: no cover
|
|
47
46
|
logger = logging.getLogger(__name__)
|
48
47
|
|
49
48
|
FILE_VERSION = "1.5" # The current project file format version
|
50
|
-
FILE_REVISION = "
|
49
|
+
FILE_REVISION = "2" # The current project file format revision
|
51
50
|
HEX_VERSION = 0x0105
|
52
51
|
|
53
52
|
NUM_VERSION = {
|
@@ -65,12 +64,11 @@ class XMLReadState(Enum):
|
|
65
64
|
|
66
65
|
NO_ACTION = 0
|
67
66
|
NO_ERROR = 1
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
WAS_LEGACY = 7
|
67
|
+
CANNOT_PARSE = 2
|
68
|
+
NOT_NWX_FILE = 3
|
69
|
+
UNKNOWN_VERSION = 4
|
70
|
+
PARSED_OK = 5
|
71
|
+
WAS_LEGACY = 6
|
74
72
|
|
75
73
|
# END Class XMLReadState
|
76
74
|
|
@@ -107,7 +105,9 @@ class ProjectXMLReader:
|
|
107
105
|
the project or the content into their respective section nodes
|
108
106
|
as attributes. The id attribute was also added to the project.
|
109
107
|
|
110
|
-
Rev 1: Drops the titleFormat
|
108
|
+
Rev 1: Drops the titleFormat node from settings. 2.1 Beta 1.
|
109
|
+
Rev 2: Drops the title node from project and adds the TEMPLATE
|
110
|
+
class for items. 2.3 Beta 1.
|
111
111
|
"""
|
112
112
|
|
113
113
|
def __init__(self, path: str | Path) -> None:
|
@@ -172,23 +172,9 @@ class ProjectXMLReader:
|
|
172
172
|
xml = ET.parse(str(self._path))
|
173
173
|
self._state = XMLReadState.NO_ERROR
|
174
174
|
except Exception as exc:
|
175
|
-
# Trying to open backup file instead
|
176
175
|
logger.error("Failed to parse project XML", exc_info=exc)
|
177
176
|
self._state = XMLReadState.CANNOT_PARSE
|
178
|
-
|
179
|
-
backFile = self._path.with_suffix(".bak")
|
180
|
-
if backFile.is_file():
|
181
|
-
try:
|
182
|
-
xml = ET.parse(str(backFile))
|
183
|
-
self._state = XMLReadState.PARSED_BACKUP
|
184
|
-
logger.info("Backup project file parsed")
|
185
|
-
except Exception as exc:
|
186
|
-
logger.error("Failed to parse backup project XML", exc_info=exc)
|
187
|
-
self._state = XMLReadState.CANNOT_PARSE
|
188
|
-
return False
|
189
|
-
else:
|
190
|
-
self._state = XMLReadState.CANNOT_PARSE
|
191
|
-
return False
|
177
|
+
return False
|
192
178
|
|
193
179
|
xRoot = xml.getroot()
|
194
180
|
self._root = str(xRoot.tag)
|
@@ -248,8 +234,6 @@ class ProjectXMLReader:
|
|
248
234
|
for xItem in xSection:
|
249
235
|
if xItem.tag == "name":
|
250
236
|
data.setName(xItem.text)
|
251
|
-
elif xItem.tag == "title":
|
252
|
-
data.setTitle(xItem.text)
|
253
237
|
elif xItem.tag == "author":
|
254
238
|
data.setAuthor(xItem.text)
|
255
239
|
else:
|
@@ -521,7 +505,6 @@ class ProjectXMLWriter:
|
|
521
505
|
|
522
506
|
xProject = ET.SubElement(xRoot, "project", attrib=projAttr)
|
523
507
|
self._packSingleValue(xProject, "name", data.name)
|
524
|
-
self._packSingleValue(xProject, "title", data.title)
|
525
508
|
self._packSingleValue(xProject, "author", data.author)
|
526
509
|
|
527
510
|
# Save Project Settings
|
@@ -558,23 +541,12 @@ class ProjectXMLWriter:
|
|
558
541
|
xName.text = item["name"]
|
559
542
|
|
560
543
|
# Write the XML tree to file
|
561
|
-
|
562
|
-
tempFile = saveFile.with_suffix(".tmp")
|
563
|
-
backFile = saveFile.with_suffix(".bak")
|
544
|
+
tmp = self._path.with_suffix(".tmp")
|
564
545
|
try:
|
565
546
|
xml = ET.ElementTree(xRoot)
|
566
547
|
xmlIndent(xml)
|
567
|
-
xml.write(
|
568
|
-
|
569
|
-
self._error = exc
|
570
|
-
return False
|
571
|
-
|
572
|
-
# If we're here, the file was successfully saved,
|
573
|
-
# so let's sort out the temps and backups
|
574
|
-
try:
|
575
|
-
if saveFile.exists():
|
576
|
-
saveFile.replace(backFile)
|
577
|
-
tempFile.replace(saveFile)
|
548
|
+
xml.write(tmp, encoding="utf-8", xml_declaration=True)
|
549
|
+
tmp.replace(self._path)
|
578
550
|
except Exception as exc:
|
579
551
|
self._error = exc
|
580
552
|
return False
|
novelwriter/core/sessions.py
CHANGED
@@ -3,10 +3,10 @@ novelWriter – Project Session Log Class
|
|
3
3
|
=======================================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created:
|
6
|
+
Created: 2023-06-11 [2.1b1] NWSessionLog
|
7
7
|
|
8
8
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
9
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
10
|
|
11
11
|
This program is free software: you can redistribute it and/or modify
|
12
12
|
it under the terms of the GNU General Public License as published by
|
@@ -27,8 +27,9 @@ import json
|
|
27
27
|
import logging
|
28
28
|
|
29
29
|
from time import time
|
30
|
-
from typing import TYPE_CHECKING
|
30
|
+
from typing import TYPE_CHECKING
|
31
31
|
from pathlib import Path
|
32
|
+
from collections.abc import Iterator
|
32
33
|
|
33
34
|
from novelwriter.error import logException
|
34
35
|
from novelwriter.common import formatTimeStamp
|
novelwriter/core/spellcheck.py
CHANGED
@@ -3,10 +3,11 @@ novelWriter – Spell Check Classes
|
|
3
3
|
=================================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created: 2019-06-11 [0.1.5]
|
6
|
+
Created: 2019-06-11 [0.1.5] NWSpellEnchant
|
7
|
+
Created: 2023-06-13 [2.1b1] UserDictionary
|
7
8
|
|
8
9
|
This file is a part of novelWriter
|
9
|
-
Copyright 2018–
|
10
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
10
11
|
|
11
12
|
This program is free software: you can redistribute it and/or modify
|
12
13
|
it under the terms of the GNU General Public License as published by
|
@@ -26,8 +27,9 @@ from __future__ import annotations
|
|
26
27
|
import json
|
27
28
|
import logging
|
28
29
|
|
29
|
-
from typing import TYPE_CHECKING
|
30
|
+
from typing import TYPE_CHECKING
|
30
31
|
from pathlib import Path
|
32
|
+
from collections.abc import Iterator
|
31
33
|
|
32
34
|
from PyQt5.QtCore import QLocale
|
33
35
|
|
@@ -56,7 +58,7 @@ class NWSpellEnchant:
|
|
56
58
|
logger.debug("Ready: NWSpellEnchant")
|
57
59
|
return
|
58
60
|
|
59
|
-
def __del__(self): # pragma: no cover
|
61
|
+
def __del__(self) -> None: # pragma: no cover
|
60
62
|
logger.debug("Delete: NWSpellEnchant")
|
61
63
|
return
|
62
64
|
|
novelwriter/core/status.py
CHANGED
@@ -3,11 +3,11 @@ novelWriter – Project Item Status Class
|
|
3
3
|
=======================================
|
4
4
|
|
5
5
|
File History:
|
6
|
-
Created: 2019-05-19 [0.1.3]
|
7
|
-
Rewritten: 2022-04-05 [2.0b1]
|
6
|
+
Created: 2019-05-19 [0.1.3] NWStatus
|
7
|
+
Rewritten: 2022-04-05 [2.0b1] NWStatus
|
8
8
|
|
9
9
|
This file is a part of novelWriter
|
10
|
-
Copyright 2018–
|
10
|
+
Copyright 2018–2024, Veronica Berglyd Olsen
|
11
11
|
|
12
12
|
This program is free software: you can redistribute it and/or modify
|
13
13
|
it under the terms of the GNU General Public License as published by
|
@@ -27,7 +27,8 @@ from __future__ import annotations
|
|
27
27
|
import random
|
28
28
|
import logging
|
29
29
|
|
30
|
-
from typing import TYPE_CHECKING,
|
30
|
+
from typing import TYPE_CHECKING, Literal
|
31
|
+
from collections.abc import ItemsView, Iterator, KeysView, ValuesView
|
31
32
|
|
32
33
|
from PyQt5.QtGui import QIcon, QPainter, QPainterPath, QPixmap, QColor
|
33
34
|
from PyQt5.QtCore import QRectF, Qt
|