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.
Files changed (153) hide show
  1. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/METADATA +1 -1
  2. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/RECORD +141 -129
  3. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/WHEEL +1 -1
  4. novelwriter/__init__.py +11 -6
  5. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  6. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  7. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  8. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  9. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  10. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  11. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  12. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  13. novelwriter/assets/i18n/project_de_DE.json +1 -0
  14. novelwriter/assets/i18n/project_en_US.json +1 -0
  15. novelwriter/assets/i18n/project_es_419.json +11 -0
  16. novelwriter/assets/i18n/project_fr_FR.json +11 -0
  17. novelwriter/assets/i18n/project_it_IT.json +11 -0
  18. novelwriter/assets/i18n/project_ja_JP.json +2 -1
  19. novelwriter/assets/i18n/project_nb_NO.json +1 -0
  20. novelwriter/assets/i18n/project_zh_CN.json +11 -0
  21. novelwriter/assets/icons/typicons_dark/icons.conf +9 -2
  22. novelwriter/assets/icons/typicons_dark/mixed_import.svg +5 -0
  23. novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +4 -0
  24. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +3 -1
  25. novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +4 -0
  26. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +3 -1
  27. novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +4 -0
  28. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +3 -1
  29. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +4 -2
  30. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +4 -2
  31. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +4 -2
  32. novelwriter/assets/icons/typicons_dark/typ_document-add-col.svg +8 -0
  33. novelwriter/assets/icons/typicons_dark/typ_document-add.svg +4 -0
  34. novelwriter/assets/icons/typicons_dark/typ_document.svg +4 -0
  35. novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +4 -0
  36. novelwriter/assets/icons/typicons_light/icons.conf +9 -2
  37. novelwriter/assets/icons/typicons_light/mixed_import.svg +5 -0
  38. novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +4 -0
  39. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +3 -1
  40. novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +4 -0
  41. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +3 -1
  42. novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +4 -0
  43. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +3 -1
  44. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +4 -2
  45. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +4 -2
  46. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +4 -2
  47. novelwriter/assets/icons/typicons_light/typ_document-add-col.svg +8 -0
  48. novelwriter/assets/icons/typicons_light/typ_document-add.svg +4 -0
  49. novelwriter/assets/icons/typicons_light/typ_document.svg +4 -0
  50. novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +4 -0
  51. novelwriter/assets/images/novelwriter-text-dark.svg +4 -0
  52. novelwriter/assets/images/novelwriter-text-light.svg +4 -0
  53. novelwriter/assets/images/welcome-dark.jpg +0 -0
  54. novelwriter/assets/images/welcome-light.jpg +0 -0
  55. novelwriter/assets/manual.pdf +0 -0
  56. novelwriter/assets/sample.zip +0 -0
  57. novelwriter/assets/syntax/default_dark.conf +1 -0
  58. novelwriter/assets/syntax/default_light.conf +1 -0
  59. novelwriter/assets/syntax/grey_dark.conf +1 -0
  60. novelwriter/assets/syntax/grey_light.conf +1 -0
  61. novelwriter/assets/syntax/light_owl.conf +1 -0
  62. novelwriter/assets/syntax/night_owl.conf +1 -0
  63. novelwriter/assets/syntax/solarized_dark.conf +1 -0
  64. novelwriter/assets/syntax/solarized_light.conf +1 -0
  65. novelwriter/assets/syntax/tomorrow.conf +1 -0
  66. novelwriter/assets/syntax/tomorrow_night.conf +1 -0
  67. novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
  68. novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
  69. novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
  70. novelwriter/assets/text/credits_en.htm +4 -2
  71. novelwriter/assets/themes/default_dark.conf +2 -2
  72. novelwriter/assets/themes/default_light.conf +2 -2
  73. novelwriter/common.py +64 -66
  74. novelwriter/config.py +39 -44
  75. novelwriter/constants.py +39 -17
  76. novelwriter/core/buildsettings.py +8 -8
  77. novelwriter/core/coretools.py +194 -155
  78. novelwriter/core/docbuild.py +7 -4
  79. novelwriter/core/document.py +7 -7
  80. novelwriter/core/index.py +90 -57
  81. novelwriter/core/item.py +23 -5
  82. novelwriter/core/options.py +11 -10
  83. novelwriter/core/project.py +72 -47
  84. novelwriter/core/projectdata.py +3 -16
  85. novelwriter/core/projectxml.py +14 -42
  86. novelwriter/core/sessions.py +4 -3
  87. novelwriter/core/spellcheck.py +6 -4
  88. novelwriter/core/status.py +5 -4
  89. novelwriter/core/storage.py +179 -141
  90. novelwriter/core/tohtml.py +6 -4
  91. novelwriter/core/tokenizer.py +74 -46
  92. novelwriter/core/tomd.py +2 -2
  93. novelwriter/core/toodt.py +41 -31
  94. novelwriter/core/tree.py +5 -4
  95. novelwriter/dialogs/about.py +88 -179
  96. novelwriter/dialogs/docmerge.py +30 -20
  97. novelwriter/dialogs/docsplit.py +33 -22
  98. novelwriter/dialogs/editlabel.py +20 -8
  99. novelwriter/dialogs/preferences.py +562 -725
  100. novelwriter/dialogs/{projsettings.py → projectsettings.py} +301 -270
  101. novelwriter/dialogs/quotes.py +47 -36
  102. novelwriter/dialogs/wordlist.py +128 -59
  103. novelwriter/enum.py +25 -22
  104. novelwriter/error.py +2 -2
  105. novelwriter/extensions/circularprogress.py +12 -12
  106. novelwriter/extensions/configlayout.py +185 -146
  107. novelwriter/extensions/{wheeleventfilter.py → eventfilters.py} +15 -5
  108. novelwriter/extensions/modified.py +81 -0
  109. novelwriter/extensions/novelselector.py +27 -13
  110. novelwriter/extensions/pagedsidebar.py +15 -20
  111. novelwriter/extensions/simpleprogress.py +8 -9
  112. novelwriter/extensions/statusled.py +9 -9
  113. novelwriter/extensions/switch.py +32 -64
  114. novelwriter/extensions/switchbox.py +2 -7
  115. novelwriter/extensions/versioninfo.py +153 -0
  116. novelwriter/gui/doceditor.py +250 -214
  117. novelwriter/gui/dochighlight.py +66 -94
  118. novelwriter/gui/docviewer.py +71 -98
  119. novelwriter/gui/docviewerpanel.py +140 -47
  120. novelwriter/gui/editordocument.py +3 -3
  121. novelwriter/gui/itemdetails.py +9 -9
  122. novelwriter/gui/mainmenu.py +47 -46
  123. novelwriter/gui/noveltree.py +53 -61
  124. novelwriter/gui/outline.py +100 -76
  125. novelwriter/gui/projtree.py +193 -67
  126. novelwriter/gui/sidebar.py +9 -8
  127. novelwriter/gui/statusbar.py +49 -7
  128. novelwriter/gui/theme.py +65 -74
  129. novelwriter/guimain.py +173 -330
  130. novelwriter/shared.py +68 -30
  131. novelwriter/tools/dictionaries.py +7 -8
  132. novelwriter/tools/lipsum.py +34 -28
  133. novelwriter/tools/manusbuild.py +3 -4
  134. novelwriter/tools/manuscript.py +25 -32
  135. novelwriter/tools/manussettings.py +194 -225
  136. novelwriter/tools/noveldetails.py +525 -0
  137. novelwriter/tools/welcome.py +802 -0
  138. novelwriter/tools/writingstats.py +26 -13
  139. novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +0 -8
  140. novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +0 -8
  141. novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +0 -8
  142. novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +0 -8
  143. novelwriter/assets/images/wizard-back.jpg +0 -0
  144. novelwriter/assets/text/gplv3_en.htm +0 -641
  145. novelwriter/assets/text/release_notes.htm +0 -17
  146. novelwriter/dialogs/projdetails.py +0 -525
  147. novelwriter/dialogs/projload.py +0 -298
  148. novelwriter/dialogs/updates.py +0 -182
  149. novelwriter/extensions/pageddialog.py +0 -130
  150. novelwriter/tools/projwizard.py +0 -478
  151. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/LICENSE.md +0 -0
  152. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/entry_points.txt +0 -0
  153. {novelWriter-2.2rc1.dist-info → novelWriter-2.3b1.dist-info}/top_level.txt +0 -0
@@ -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–2023, Veronica Berglyd Olsen
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._title:
227
+ if value != self._author:
241
228
  self._author = simplified(str(value or ""))
242
229
  self._project.setProjectChanged(True)
243
230
  return
@@ -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–2023, Veronica Berglyd Olsen
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 = "1" # The current project file format 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
- PARSED_BACKUP = 2
69
- CANNOT_PARSE = 3
70
- NOT_NWX_FILE = 4
71
- UNKNOWN_VERSION = 5
72
- PARSED_OK = 6
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 section of settings.
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
- saveFile = self._path / nwFiles.PROJ_FILE
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(tempFile, encoding="utf-8", xml_declaration=True)
568
- except Exception as exc:
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
@@ -3,10 +3,10 @@ novelWriter – Project Session Log Class
3
3
  =======================================
4
4
 
5
5
  File History:
6
- Created: 2023-06-11 [2.1b1]
6
+ Created: 2023-06-11 [2.1b1] NWSessionLog
7
7
 
8
8
  This file is a part of novelWriter
9
- Copyright 2018–2023, Veronica Berglyd Olsen
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, Iterator
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
@@ -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–2023, Veronica Berglyd Olsen
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, Iterator
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
 
@@ -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–2023, Veronica Berglyd Olsen
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, ItemsView, Iterator, KeysView, Literal, ValuesView
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