novelWriter 2.4rc1__py3-none-any.whl → 2.4.2__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.4rc1.dist-info → novelWriter-2.4.2.dist-info}/METADATA +1 -1
- {novelWriter-2.4rc1.dist-info → novelWriter-2.4.2.dist-info}/RECORD +48 -48
- novelwriter/__init__.py +13 -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_nl_NL.qm +0 -0
- novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
- novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
- novelwriter/assets/manual.pdf +0 -0
- novelwriter/assets/sample.zip +0 -0
- novelwriter/common.py +5 -2
- novelwriter/config.py +4 -0
- novelwriter/core/buildsettings.py +7 -7
- novelwriter/core/docbuild.py +2 -2
- novelwriter/core/projectxml.py +1 -1
- novelwriter/core/spellcheck.py +3 -3
- novelwriter/core/tokenizer.py +3 -3
- novelwriter/core/toodt.py +1 -1
- novelwriter/dialogs/preferences.py +1 -1
- novelwriter/dialogs/projectsettings.py +2 -2
- novelwriter/dialogs/wordlist.py +2 -2
- novelwriter/error.py +1 -1
- novelwriter/gui/doceditor.py +30 -27
- novelwriter/gui/dochighlight.py +22 -5
- novelwriter/gui/docviewer.py +3 -3
- novelwriter/gui/mainmenu.py +2 -2
- novelwriter/gui/noveltree.py +1 -1
- novelwriter/gui/outline.py +9 -9
- novelwriter/gui/projtree.py +1 -1
- novelwriter/gui/search.py +2 -2
- novelwriter/gui/theme.py +15 -5
- novelwriter/guimain.py +2 -2
- novelwriter/shared.py +16 -4
- novelwriter/text/counting.py +1 -0
- novelwriter/tools/dictionaries.py +2 -2
- novelwriter/tools/manusbuild.py +12 -11
- novelwriter/tools/manuscript.py +49 -44
- novelwriter/tools/manussettings.py +27 -29
- novelwriter/tools/welcome.py +4 -5
- {novelWriter-2.4rc1.dist-info → novelWriter-2.4.2.dist-info}/LICENSE.md +0 -0
- {novelWriter-2.4rc1.dist-info → novelWriter-2.4.2.dist-info}/WHEEL +0 -0
- {novelWriter-2.4rc1.dist-info → novelWriter-2.4.2.dist-info}/entry_points.txt +0 -0
- {novelWriter-2.4rc1.dist-info → novelWriter-2.4.2.dist-info}/top_level.txt +0 -0
@@ -1,24 +1,24 @@
|
|
1
|
-
novelwriter/__init__.py,sha256=
|
2
|
-
novelwriter/common.py,sha256=
|
3
|
-
novelwriter/config.py,sha256=
|
1
|
+
novelwriter/__init__.py,sha256=UmO-iWGbt0mkX0Qp5ec2ApSn1aDEmkgg-632e_ICZrU,7744
|
2
|
+
novelwriter/common.py,sha256=oarn4-2Ezm595b-dHD4MVrytxMFFB_QhITbTMIKD40M,17440
|
3
|
+
novelwriter/config.py,sha256=Y0c3-0xfmDE-IDcFYW0U_x_WGPMoU2T0sqtNZ8CT4zQ,35841
|
4
4
|
novelwriter/constants.py,sha256=UIxiF-23cB_gmRfxbQPYmObn8Ib-ygm46uOIG329RLY,19818
|
5
5
|
novelwriter/enum.py,sha256=MP-nz3vDRp4bWxXitqjdLWO2_RvrDAlRxngiMON9mb8,3305
|
6
|
-
novelwriter/error.py,sha256=
|
7
|
-
novelwriter/guimain.py,sha256=
|
8
|
-
novelwriter/shared.py,sha256=
|
6
|
+
novelwriter/error.py,sha256=rY3kHVkt7W0MM9iKOBkMY-9qhStlESGlyeOOXwT4BGM,7278
|
7
|
+
novelwriter/guimain.py,sha256=Be32lkJv1ZF-aOSOQTPBfcH7TFrk3KvpLBmwIl20eRc,53477
|
8
|
+
novelwriter/shared.py,sha256=t-0ZwgnT7KNHDtz4fBV-uPxh9P0Nw1R0Sj-VW4To6sc,14678
|
9
9
|
novelwriter/types.py,sha256=6aP2hZraPEolYqBgj5R_5bah3NgelASBfKol6yYOi4g,3316
|
10
|
-
novelwriter/assets/manual.pdf,sha256=
|
11
|
-
novelwriter/assets/sample.zip,sha256=
|
12
|
-
novelwriter/assets/i18n/nw_de_DE.qm,sha256=
|
13
|
-
novelwriter/assets/i18n/nw_en_US.qm,sha256=
|
14
|
-
novelwriter/assets/i18n/nw_es_419.qm,sha256
|
15
|
-
novelwriter/assets/i18n/nw_fr_FR.qm,sha256=-
|
16
|
-
novelwriter/assets/i18n/nw_it_IT.qm,sha256=
|
17
|
-
novelwriter/assets/i18n/nw_ja_JP.qm,sha256=
|
18
|
-
novelwriter/assets/i18n/nw_nb_NO.qm,sha256=
|
19
|
-
novelwriter/assets/i18n/nw_nl_NL.qm,sha256=
|
20
|
-
novelwriter/assets/i18n/nw_pt_BR.qm,sha256=
|
21
|
-
novelwriter/assets/i18n/nw_zh_CN.qm,sha256=
|
10
|
+
novelwriter/assets/manual.pdf,sha256=kMZhZUq4Nl-haKrsBVIjh75k55zEydBMjbUeKfUYKQ8,2691208
|
11
|
+
novelwriter/assets/sample.zip,sha256=1JF3NFAoBjJIhycpXLPzPTbfTDEiKznKN4O3uX8NI6U,27360
|
12
|
+
novelwriter/assets/i18n/nw_de_DE.qm,sha256=PPBpHJ3M0jL0t4xSY8zr3CKaO0umGW4K4Tb7bj0gtlA,97532
|
13
|
+
novelwriter/assets/i18n/nw_en_US.qm,sha256=sZKjLkT2CcPhGAS3WUgKm9XO3ugbBrx2zbwVyhP7vSE,90470
|
14
|
+
novelwriter/assets/i18n/nw_es_419.qm,sha256=8saaQ1As_hOgBI-oyEIqV5KCmLaMg_ldkOT9Q1uJmaY,99857
|
15
|
+
novelwriter/assets/i18n/nw_fr_FR.qm,sha256=-hpWyPhLqC-Ri8Zp9mCnfhc5CrCy1_p69E71pxxncuk,100316
|
16
|
+
novelwriter/assets/i18n/nw_it_IT.qm,sha256=mRgsonFCjm6bgG2sldQtMrRDAfqNIpiq9ebp1Sfl-gM,100250
|
17
|
+
novelwriter/assets/i18n/nw_ja_JP.qm,sha256=kbZKcnRDKralChIDOqsnK8Sn0NdcjlTDf03fOLVPxxY,74895
|
18
|
+
novelwriter/assets/i18n/nw_nb_NO.qm,sha256=cuQLRkvGXIFYsK7a4j1wxKY3H7JQIfjObkVvFbVFt-Q,92928
|
19
|
+
novelwriter/assets/i18n/nw_nl_NL.qm,sha256=4RcFVAWj3PGT4jeivxLEp85HfiSr3FvFCnlmjQRXSRc,96814
|
20
|
+
novelwriter/assets/i18n/nw_pt_BR.qm,sha256=2pW_7MFG152nN3Yc721qvvcG01XSRTVe21BvvqdBQvk,79257
|
21
|
+
novelwriter/assets/i18n/nw_zh_CN.qm,sha256=3q2cSsY3kT7dRggXq-fj8Sank88V_G2RKzjXQY5-3nA,67445
|
22
22
|
novelwriter/assets/i18n/project_de_DE.json,sha256=85ud9rxRHyXm85QDmW_LKcUE8h0L1Bvukaf5Tjt-wpg,2818
|
23
23
|
novelwriter/assets/i18n/project_en_GB.json,sha256=EcQAVEiQgRL3qobuzkPTfOWIxAc3Om-tA7nXUFFXEdI,2483
|
24
24
|
novelwriter/assets/i18n/project_en_US.json,sha256=EcQAVEiQgRL3qobuzkPTfOWIxAc3Om-tA7nXUFFXEdI,2483
|
@@ -260,33 +260,33 @@ novelwriter/assets/themes/default_dark.conf,sha256=L6xHLbgVb4E4SkQRSgCV7yEoxH9Rx
|
|
260
260
|
novelwriter/assets/themes/default_light.conf,sha256=o_FJRMidFo-DJYK8bB-jdelcD5qg7MwW4J8lL9nlZUY,928
|
261
261
|
novelwriter/assets/themes/solarized_dark.conf,sha256=HIP9icMtRljUmMH7PmU0IrcLGUSXVDaG97070Hc0UVM,852
|
262
262
|
novelwriter/assets/themes/solarized_light.conf,sha256=jUfaCnWXM4GAOI1eUioj_nP0RiMrnr8MEOprSg7qUU4,854
|
263
|
-
novelwriter/core/buildsettings.py,sha256=
|
263
|
+
novelwriter/core/buildsettings.py,sha256=SVRYtmsneUlidzoHlmXebgpVPW7ZTei8mwTfVug3o4E,22423
|
264
264
|
novelwriter/core/coretools.py,sha256=mNrFL7R3dAAQhe3aGT9QTha4rX4XXF5JOlmXykNCJh0,21467
|
265
|
-
novelwriter/core/docbuild.py,sha256=
|
265
|
+
novelwriter/core/docbuild.py,sha256=cvvIe3w3ptY3VE_ak3ppzVkBMvoGS5o0CdzS0ifAVRw,13842
|
266
266
|
novelwriter/core/document.py,sha256=ERU3GCZ1CHkIE3bV-NQ5G8HZlH5C4bWqa-OxyPgFu4w,12154
|
267
267
|
novelwriter/core/index.py,sha256=e-Iov2NyeeLWiWsx_UCD758UIw_6KGe1FZ-jegkRgmU,45951
|
268
268
|
novelwriter/core/item.py,sha256=6a-9Aty4_RIFE-90IxR8t19Fjyl_uHJAwz_TzUn8oRI,18104
|
269
269
|
novelwriter/core/options.py,sha256=6gMe3cXq4U-oSN3zSoGtfiCOW6hX9xtjDssrbZYrtGY,7397
|
270
270
|
novelwriter/core/project.py,sha256=dl8mx6uCjPUzb9H-pOcwYbDahQ6rxB5D-rkeb8CX-Kk,22718
|
271
271
|
novelwriter/core/projectdata.py,sha256=NYhTL6qIbJxJX98-_zZdV4LzI2-tqdWaMvGYi0Xi4WU,9826
|
272
|
-
novelwriter/core/projectxml.py,sha256=
|
272
|
+
novelwriter/core/projectxml.py,sha256=0qylTwEsgoKRlSmDyBgOU4XpGvA3nPMipYs1dNkc-hA,21948
|
273
273
|
novelwriter/core/sessions.py,sha256=k13qaHO0oAyKBlMrhDogO0dFoAROBA8WNgUULGtIhIA,4431
|
274
|
-
novelwriter/core/spellcheck.py,sha256=
|
274
|
+
novelwriter/core/spellcheck.py,sha256=FuTPjunG3DpXZzVrpSp3cHCJR1s72MYiSjOm6ok2ZiE,7256
|
275
275
|
novelwriter/core/status.py,sha256=TNeEapa-MLJexXPosoHs0UmHgZrK63vQEOegYOD8uuE,8769
|
276
276
|
novelwriter/core/storage.py,sha256=eJgGL0cvfeQHhGYjc6FiojJ-dnGU-IQJ6FOWa8hFzJQ,20880
|
277
277
|
novelwriter/core/tohtml.py,sha256=zybIc2qMAQhmWBNVVtcHRijmvqDK_DHidgAYwKUGQP0,17236
|
278
|
-
novelwriter/core/tokenizer.py,sha256=
|
278
|
+
novelwriter/core/tokenizer.py,sha256=mwcwUojDL7DW8W4wbXZbtnyPnOdN9soJb11dShrdtbk,40993
|
279
279
|
novelwriter/core/tomd.py,sha256=xk5r3oyHkz6LOouiPaQLGVJWp6bT0HLe3upr4JmWjG4,7386
|
280
|
-
novelwriter/core/toodt.py,sha256=
|
280
|
+
novelwriter/core/toodt.py,sha256=nPslo_bEsUaGWk0YCPaPHak41dXS9PpzNKClGOF_cA0,58662
|
281
281
|
novelwriter/core/tree.py,sha256=bwLJHhNkd2DOKoE-rIwfWwWgaYBlw9xZ8BaQeC0LUJw,18701
|
282
282
|
novelwriter/dialogs/about.py,sha256=6FF9ssrP8G9TNWYAoZ1Z-Bd0gBrJsc8uPBVAulyDd_U,4888
|
283
283
|
novelwriter/dialogs/docmerge.py,sha256=FzOmKQnKW8p1fc_z6pvDlP2LlJQgDG_BV355oB1MKzc,6148
|
284
284
|
novelwriter/dialogs/docsplit.py,sha256=q4kt_lIqrz6-5VpBnCZOeTfvwcZMORZtjO3qrGEynPg,9140
|
285
285
|
novelwriter/dialogs/editlabel.py,sha256=715nMbwexvqaxPRp2rJThyC3Sokp70zztpCg2ZxGKPw,2964
|
286
|
-
novelwriter/dialogs/preferences.py,sha256=
|
287
|
-
novelwriter/dialogs/projectsettings.py,sha256
|
286
|
+
novelwriter/dialogs/preferences.py,sha256=hQv70JmrQDTXDY5onrkeQVCZ1UiProi4i8c2xQsXTfk,36440
|
287
|
+
novelwriter/dialogs/projectsettings.py,sha256=IbZkb0oFU9C5PtQxtrY5DJSfdaUoeb_A2qhpZJWG4KY,25750
|
288
288
|
novelwriter/dialogs/quotes.py,sha256=iDtkACeCnaCQOTXQtW1H75BjeOJIm0SsrP4EzLsFq0E,4647
|
289
|
-
novelwriter/dialogs/wordlist.py,sha256=
|
289
|
+
novelwriter/dialogs/wordlist.py,sha256=EfjKQn_SZ8qUCXXw5WHgqe6hWLAn02cD23mWUTTaxkc,8646
|
290
290
|
novelwriter/extensions/circularprogress.py,sha256=H0btKccdnvVfijU8ZudYvv4AgrvPYvx7IgznIxASBY0,3856
|
291
291
|
novelwriter/extensions/configlayout.py,sha256=xHUE_HckNwJsfPKZ3hJjAKAYhxzQFRmNCmBrIh6QtTs,9253
|
292
292
|
novelwriter/extensions/eventfilters.py,sha256=XehDoXwsnCvI1D3uieuYu5J3kxZggdV6Teo7Z0xZw7E,2581
|
@@ -298,32 +298,32 @@ novelwriter/extensions/statusled.py,sha256=640phDm3ZcLvM9EC_uwVPjG9LD5W3pAjtoqU4
|
|
298
298
|
novelwriter/extensions/switch.py,sha256=sZBNX5Wj1qkVA6cHh04GjuWOTbejaatHgLZ5yGzXGv4,4346
|
299
299
|
novelwriter/extensions/switchbox.py,sha256=y6yuoCAZYYL7miaFlC8h5ymtuB0Xyk2AMmxAFYOYPDA,4210
|
300
300
|
novelwriter/extensions/versioninfo.py,sha256=eUJzO6eV6SFXgp71uxr9696rjUQctGm84CA7XqxFhGc,5120
|
301
|
-
novelwriter/gui/doceditor.py,sha256=
|
302
|
-
novelwriter/gui/dochighlight.py,sha256=
|
303
|
-
novelwriter/gui/docviewer.py,sha256=
|
301
|
+
novelwriter/gui/doceditor.py,sha256=9UVaPhA_FnroPK6_K-GraygJYojh208qiJd426g27pc,113840
|
302
|
+
novelwriter/gui/dochighlight.py,sha256=9-OP0YrMmljOCsdY-rqZe0G27gkBP7Fzk_R_f3iGGVE,17394
|
303
|
+
novelwriter/gui/docviewer.py,sha256=9KvGhEMLqmqibhdIgJ7lmoQ28oTnOfT08sdlBo4WV24,33107
|
304
304
|
novelwriter/gui/docviewerpanel.py,sha256=IcQGLN49MmVGfIPg-8IzLGKYn9DbJqfdXWG6jd_JaAI,20009
|
305
305
|
novelwriter/gui/editordocument.py,sha256=jxODONgq80Kf63lRezzbYtyEelaC-GpvgPEMKQ3m_sg,4116
|
306
306
|
novelwriter/gui/itemdetails.py,sha256=VIfWDtn9g0IRBYSDFT_AhZgluQ0d7sK5C14lENyvzHg,9774
|
307
|
-
novelwriter/gui/mainmenu.py,sha256=
|
308
|
-
novelwriter/gui/noveltree.py,sha256
|
309
|
-
novelwriter/gui/outline.py,sha256=
|
310
|
-
novelwriter/gui/projtree.py,sha256=
|
311
|
-
novelwriter/gui/search.py,sha256=
|
307
|
+
novelwriter/gui/mainmenu.py,sha256=iTXNqmhEZqVDA6XkIAhpIq-cc1fF5-rZVe2g9z7v8_c,38707
|
308
|
+
novelwriter/gui/noveltree.py,sha256=F-r6vdgCoIzxFwOI9kvsLEnz7nX2uOs30LOHHijN7NY,27988
|
309
|
+
novelwriter/gui/outline.py,sha256=q0d21UI2r4K4D9jPARKc3ibWsdpiEnartAHfwxE2AgY,42410
|
310
|
+
novelwriter/gui/projtree.py,sha256=21B1-NJFYf724oIH5xX0b35YX3YX-zxRcLdYopMdRy8,77888
|
311
|
+
novelwriter/gui/search.py,sha256=PYsSIhe77PCuXj1fRXb2_7GF1gxLDv_vyq8JsgW5UfY,12996
|
312
312
|
novelwriter/gui/sidebar.py,sha256=kidGGzXQ5RNQvKuH0kFh-lwoUSlkXffBucEoL15RMd4,6258
|
313
313
|
novelwriter/gui/statusbar.py,sha256=ru-4pyg8owWkwkXGgj5GEupfq9fbIykYwGpomwzaINk,9353
|
314
|
-
novelwriter/gui/theme.py,sha256=
|
315
|
-
novelwriter/text/counting.py,sha256=
|
316
|
-
novelwriter/tools/dictionaries.py,sha256=
|
314
|
+
novelwriter/gui/theme.py,sha256=P2EI79WMGulYBhkADqVOWW13DfFOOoCUeBf7Kxku-wM,32670
|
315
|
+
novelwriter/text/counting.py,sha256=tkWKWS_scPYmBG8xLpIL1KLIjyF2HOlkrloQa5PZmDc,4304
|
316
|
+
novelwriter/tools/dictionaries.py,sha256=Xy5or2yejJbUv9ptwqsz1-R4pxDYQATiHCZaqorUXdY,9231
|
317
317
|
novelwriter/tools/lipsum.py,sha256=d-qdRSrXLfTkTdzi7vhjeBlWawwGwWQ9Qd_zRSwzgpQ,4901
|
318
|
-
novelwriter/tools/manusbuild.py,sha256=
|
319
|
-
novelwriter/tools/manuscript.py,sha256=
|
320
|
-
novelwriter/tools/manussettings.py,sha256=
|
318
|
+
novelwriter/tools/manusbuild.py,sha256=80kRr4OfvW2lqjhLpnAWO8HiTX7Y3HSivcjT48v_KUE,14101
|
319
|
+
novelwriter/tools/manuscript.py,sha256=KdQl1xWVSzl9u1TQ1Jb-zWn3jZRwPuRCqh0DY3h1wHs,40236
|
320
|
+
novelwriter/tools/manussettings.py,sha256=ak4m6cKk8NAg2OmsQJv-x8Ui-jcUtZe-RkyzotXbqRM,55747
|
321
321
|
novelwriter/tools/noveldetails.py,sha256=KoENyz0hH3TlXfRCEJvRTZ0h7ruOgTIv85AgCl1Ur5o,18503
|
322
|
-
novelwriter/tools/welcome.py,sha256=
|
322
|
+
novelwriter/tools/welcome.py,sha256=BxORHBPjqumEVNZC7SytE3kUasx01GMOKS5QQSagP-M,27954
|
323
323
|
novelwriter/tools/writingstats.py,sha256=IubrbbLB_Qlnwp9B3muKkeD84xtckPvmTax7E4LnI5g,22797
|
324
|
-
novelWriter-2.
|
325
|
-
novelWriter-2.
|
326
|
-
novelWriter-2.
|
327
|
-
novelWriter-2.
|
328
|
-
novelWriter-2.
|
329
|
-
novelWriter-2.
|
324
|
+
novelWriter-2.4.2.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
|
325
|
+
novelWriter-2.4.2.dist-info/METADATA,sha256=tGVtHnZQbK2spACdq4VUc3ZGspEmvQO9jFT9Oe6t4Sg,2582
|
326
|
+
novelWriter-2.4.2.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
327
|
+
novelWriter-2.4.2.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
|
328
|
+
novelWriter-2.4.2.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
|
329
|
+
novelWriter-2.4.2.dist-info/RECORD,,
|
novelwriter/__init__.py
CHANGED
@@ -23,16 +23,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
23
23
|
"""
|
24
24
|
from __future__ import annotations
|
25
25
|
|
26
|
-
import sys
|
27
26
|
import getopt
|
28
27
|
import logging
|
28
|
+
import sys
|
29
|
+
|
30
|
+
from typing import TYPE_CHECKING
|
29
31
|
|
30
32
|
from PyQt5.QtWidgets import QApplication, QErrorMessage
|
31
33
|
|
32
|
-
from novelwriter.error import exceptionHandler, logException
|
33
34
|
from novelwriter.config import Config
|
35
|
+
from novelwriter.error import exceptionHandler, logException
|
34
36
|
from novelwriter.shared import SharedData
|
35
37
|
|
38
|
+
if TYPE_CHECKING: # pragma: no cover
|
39
|
+
from novelwriter.guimain import GuiMain
|
40
|
+
|
36
41
|
# Package Meta
|
37
42
|
# ============
|
38
43
|
|
@@ -42,9 +47,9 @@ __license__ = "GPLv3"
|
|
42
47
|
__author__ = "Veronica Berglyd Olsen"
|
43
48
|
__maintainer__ = "Veronica Berglyd Olsen"
|
44
49
|
__email__ = "code@vkbo.net"
|
45
|
-
__version__ = "2.
|
46
|
-
__hexversion__ = "
|
47
|
-
__date__ = "2024-
|
50
|
+
__version__ = "2.4.2"
|
51
|
+
__hexversion__ = "0x020402f0"
|
52
|
+
__date__ = "2024-05-18"
|
48
53
|
__status__ = "Stable"
|
49
54
|
__domain__ = "novelwriter.io"
|
50
55
|
|
@@ -60,7 +65,7 @@ CONFIG = Config()
|
|
60
65
|
SHARED = SharedData()
|
61
66
|
|
62
67
|
|
63
|
-
def main(sysArgs: list | None = None):
|
68
|
+
def main(sysArgs: list | None = None) -> GuiMain | None:
|
64
69
|
"""Parse command line, set up logging, and launch main GUI."""
|
65
70
|
if sysArgs is None:
|
66
71
|
sysArgs = sys.argv[1:]
|
@@ -239,4 +244,6 @@ def main(sysArgs: list | None = None):
|
|
239
244
|
|
240
245
|
sys.exit(nwApp.exec())
|
241
246
|
|
247
|
+
return None
|
248
|
+
|
242
249
|
# END Function main
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
novelwriter/assets/manual.pdf
CHANGED
Binary file
|
novelwriter/assets/sample.zip
CHANGED
Binary file
|
novelwriter/common.py
CHANGED
@@ -449,7 +449,7 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
|
|
449
449
|
|
450
450
|
indentations = ["\n"]
|
451
451
|
|
452
|
-
def indentChildren(elem, level):
|
452
|
+
def indentChildren(elem: ET.Element, level: int) -> None:
|
453
453
|
chLevel = level + 1
|
454
454
|
try:
|
455
455
|
chIndent = indentations[chLevel]
|
@@ -472,6 +472,8 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
|
|
472
472
|
if last is not None:
|
473
473
|
last.tail = indentations[level]
|
474
474
|
|
475
|
+
return
|
476
|
+
|
475
477
|
if len(tree):
|
476
478
|
indentChildren(tree, 0)
|
477
479
|
tree.tail = "\n"
|
@@ -534,8 +536,9 @@ class NWConfigParser(ConfigParser):
|
|
534
536
|
helper functions, and support for lists.
|
535
537
|
"""
|
536
538
|
|
537
|
-
def __init__(self):
|
539
|
+
def __init__(self) -> None:
|
538
540
|
super().__init__()
|
541
|
+
return
|
539
542
|
|
540
543
|
def rdStr(self, section: str, option: str, default: str) -> str:
|
541
544
|
"""Read string value."""
|
novelwriter/config.py
CHANGED
@@ -390,6 +390,10 @@ class Config:
|
|
390
390
|
"""Un-scale fixed gui sizes by the screen scale factor."""
|
391
391
|
return int(value/self.guiScale)
|
392
392
|
|
393
|
+
def homePath(self) -> Path:
|
394
|
+
"""The user's home folder."""
|
395
|
+
return self._homePath
|
396
|
+
|
393
397
|
def dataPath(self, target: str | None = None) -> Path:
|
394
398
|
"""Return a path in the data folder."""
|
395
399
|
if isinstance(target, str):
|
@@ -56,13 +56,13 @@ SETTINGS_TEMPLATE = {
|
|
56
56
|
"headings.fmtChapter": (str, nwHeadFmt.TITLE),
|
57
57
|
"headings.fmtUnnumbered": (str, nwHeadFmt.TITLE),
|
58
58
|
"headings.fmtScene": (str, "* * *"),
|
59
|
-
"headings.
|
59
|
+
"headings.fmtAltScene": (str, ""),
|
60
60
|
"headings.fmtSection": (str, ""),
|
61
61
|
"headings.hideTitle": (bool, False),
|
62
62
|
"headings.hideChapter": (bool, False),
|
63
63
|
"headings.hideUnnumbered": (bool, False),
|
64
64
|
"headings.hideScene": (bool, False),
|
65
|
-
"headings.
|
65
|
+
"headings.hideAltScene": (bool, False),
|
66
66
|
"headings.hideSection": (bool, True),
|
67
67
|
"headings.centerTitle": (bool, True),
|
68
68
|
"headings.centerChapter": (bool, False),
|
@@ -110,7 +110,7 @@ SETTINGS_LABELS = {
|
|
110
110
|
"headings.fmtChapter": QT_TRANSLATE_NOOP("Builds", "Chapter Format"),
|
111
111
|
"headings.fmtUnnumbered": QT_TRANSLATE_NOOP("Builds", "Unnumbered Format"),
|
112
112
|
"headings.fmtScene": QT_TRANSLATE_NOOP("Builds", "Scene Format"),
|
113
|
-
"headings.
|
113
|
+
"headings.fmtAltScene": QT_TRANSLATE_NOOP("Builds", "Alt. Scene Format"),
|
114
114
|
"headings.fmtSection": QT_TRANSLATE_NOOP("Builds", "Section Format"),
|
115
115
|
|
116
116
|
"text.grpContent": QT_TRANSLATE_NOOP("Builds", "Text Content"),
|
@@ -178,7 +178,7 @@ class BuildSettings:
|
|
178
178
|
def __init__(self) -> None:
|
179
179
|
self._name = ""
|
180
180
|
self._uuid = str(uuid.uuid4())
|
181
|
-
self._path =
|
181
|
+
self._path = CONFIG.homePath()
|
182
182
|
self._build = ""
|
183
183
|
self._order = 0
|
184
184
|
self._format = nwBuildFmt.ODT
|
@@ -220,7 +220,7 @@ class BuildSettings:
|
|
220
220
|
"""The last used build path."""
|
221
221
|
if self._path.is_dir():
|
222
222
|
return self._path
|
223
|
-
return
|
223
|
+
return CONFIG.homePath()
|
224
224
|
|
225
225
|
@property
|
226
226
|
def lastBuildName(self) -> str:
|
@@ -297,7 +297,7 @@ class BuildSettings:
|
|
297
297
|
if isinstance(path, Path) and path.is_dir():
|
298
298
|
self._path = path
|
299
299
|
else:
|
300
|
-
self._path =
|
300
|
+
self._path = CONFIG.homePath()
|
301
301
|
self._changed = True
|
302
302
|
return
|
303
303
|
|
@@ -382,7 +382,7 @@ class BuildSettings:
|
|
382
382
|
|
383
383
|
postponed = []
|
384
384
|
|
385
|
-
def allowRoot(rHandle):
|
385
|
+
def allowRoot(rHandle: str | None) -> None:
|
386
386
|
if rHandle in postponed and rHandle in result and rHandle is not None:
|
387
387
|
result[rHandle] = (True, FilterMode.ROOT)
|
388
388
|
postponed.remove(rHandle)
|
novelwriter/core/docbuild.py
CHANGED
@@ -306,8 +306,8 @@ class NWBuildDocument:
|
|
306
306
|
self._build.getBool("headings.hideScene")
|
307
307
|
)
|
308
308
|
bldObj.setHardSceneFormat(
|
309
|
-
self._build.getStr("headings.
|
310
|
-
self._build.getBool("headings.
|
309
|
+
self._build.getStr("headings.fmtAltScene"),
|
310
|
+
self._build.getBool("headings.hideAltScene")
|
311
311
|
)
|
312
312
|
bldObj.setSectionFormat(
|
313
313
|
self._build.getStr("headings.fmtSection"),
|
novelwriter/core/projectxml.py
CHANGED
@@ -449,7 +449,7 @@ class ProjectXMLReader:
|
|
449
449
|
result[xEntry.attrib["key"]] = checkString(xEntry.text, "")
|
450
450
|
return result
|
451
451
|
|
452
|
-
def _parseDictTagText(self, xItem) -> dict:
|
452
|
+
def _parseDictTagText(self, xItem: ET.Element) -> dict:
|
453
453
|
"""Parse a dictionary stored with key as the tag and the value
|
454
454
|
as the text property.
|
455
455
|
"""
|
novelwriter/core/spellcheck.py
CHANGED
@@ -74,7 +74,7 @@ class NWSpellEnchant:
|
|
74
74
|
# Setters
|
75
75
|
##
|
76
76
|
|
77
|
-
def setLanguage(self, language: str | None):
|
77
|
+
def setLanguage(self, language: str | None) -> None:
|
78
78
|
"""Load a dictionary for the language specified in the config.
|
79
79
|
If that fails, we load a mock dictionary so that lookups don't
|
80
80
|
crash. Note that enchant will allow loading an empty string as
|
@@ -182,10 +182,10 @@ class FakeEnchant:
|
|
182
182
|
def check(self, word: str) -> bool:
|
183
183
|
return True
|
184
184
|
|
185
|
-
def suggest(self, word) -> list[str]:
|
185
|
+
def suggest(self, word: str) -> list[str]:
|
186
186
|
return []
|
187
187
|
|
188
|
-
def add_to_session(self, word: str):
|
188
|
+
def add_to_session(self, word: str) -> None:
|
189
189
|
return
|
190
190
|
|
191
191
|
# END Class FakeEnchant
|
novelwriter/core/tokenizer.py
CHANGED
@@ -49,7 +49,7 @@ ESCAPES = {r"\*": "*", r"\~": "~", r"\_": "_", r"\[": "[", r"\]": "]", r"\ ": ""
|
|
49
49
|
RX_ESC = re.compile("|".join([re.escape(k) for k in ESCAPES.keys()]), flags=re.DOTALL)
|
50
50
|
|
51
51
|
|
52
|
-
def stripEscape(text) -> str:
|
52
|
+
def stripEscape(text: str) -> str:
|
53
53
|
"""Strip escaped Markdown characters from paragraph text."""
|
54
54
|
if "\\" in text:
|
55
55
|
return RX_ESC.sub(lambda x: ESCAPES[x.group(0)], text)
|
@@ -639,8 +639,8 @@ class Tokenizer(ABC):
|
|
639
639
|
tmpMarkdown.append(f"{aLine}\n")
|
640
640
|
|
641
641
|
elif aLine.startswith(("### ", "###! ")):
|
642
|
-
# (
|
643
|
-
#
|
642
|
+
# (Alternative) Scene Headings
|
643
|
+
# ============================
|
644
644
|
# Scene headings in novel documents are treated as centred
|
645
645
|
# separators if the formatting does not change the text. If the
|
646
646
|
# format is empty, the scene can be hidden or a blank paragraph
|
novelwriter/core/toodt.py
CHANGED
@@ -548,7 +548,7 @@ class ToOdt(Tokenizer):
|
|
548
548
|
oVers = _mkTag("office", "version")
|
549
549
|
xSett = ET.Element(oRoot, attrib={oVers: X_VERS})
|
550
550
|
|
551
|
-
def putInZip(name, xObj, zipObj):
|
551
|
+
def putInZip(name: str, xObj: ET.Element, zipObj: ZipFile) -> None:
|
552
552
|
with zipObj.open(name, mode="w") as fObj:
|
553
553
|
xml = ET.ElementTree(xObj)
|
554
554
|
xml.write(fObj, encoding="utf-8", xml_declaration=True)
|
@@ -795,7 +795,7 @@ class GuiPreferences(QDialog):
|
|
795
795
|
return
|
796
796
|
|
797
797
|
@pyqtSlot()
|
798
|
-
def _selectTextFont(self):
|
798
|
+
def _selectTextFont(self) -> None:
|
799
799
|
"""Open the QFontDialog and set a font for the font style."""
|
800
800
|
current = QFont()
|
801
801
|
current.setFamily(CONFIG.textFont)
|
@@ -257,17 +257,17 @@ class _SettingsPage(NScrollableForm):
|
|
257
257
|
)
|
258
258
|
|
259
259
|
# Project Language
|
260
|
+
projLang = data.language or CONFIG.guiLocale
|
260
261
|
self.projLang = NComboBox(self)
|
261
262
|
self.projLang.setMinimumWidth(xW)
|
262
263
|
for tag, language in CONFIG.listLanguages(CONFIG.LANG_PROJ):
|
263
264
|
self.projLang.addItem(language, tag)
|
265
|
+
self.projLang.setCurrentData(projLang, projLang)
|
264
266
|
self.addRow(
|
265
267
|
self.tr("Project language"), self.projLang,
|
266
268
|
self.tr("Only used when building the manuscript."),
|
267
269
|
stretch=(3, 2)
|
268
270
|
)
|
269
|
-
if (idx := self.projLang.findData(data.language)) != -1:
|
270
|
-
self.projLang.setCurrentIndex(idx)
|
271
271
|
|
272
272
|
# Spell Check Language
|
273
273
|
self.spellLang = NComboBox(self)
|
novelwriter/dialogs/wordlist.py
CHANGED
@@ -190,7 +190,7 @@ class GuiWordList(QDialog):
|
|
190
190
|
))
|
191
191
|
ffilter = formatFileFilter(["*.txt", "*"])
|
192
192
|
path, _ = QFileDialog.getOpenFileName(
|
193
|
-
self, self.tr("Import File"), str(
|
193
|
+
self, self.tr("Import File"), str(CONFIG.homePath()), filter=ffilter
|
194
194
|
)
|
195
195
|
if path:
|
196
196
|
try:
|
@@ -207,7 +207,7 @@ class GuiWordList(QDialog):
|
|
207
207
|
def _exportWords(self) -> None:
|
208
208
|
"""Export words to file."""
|
209
209
|
path, _ = QFileDialog.getSaveFileName(
|
210
|
-
self, self.tr("Export File"), str(
|
210
|
+
self, self.tr("Export File"), str(CONFIG.homePath())
|
211
211
|
)
|
212
212
|
if path:
|
213
213
|
try:
|