novelWriter 2.4rc1__py3-none-any.whl → 2.4.1__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 (48) hide show
  1. {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/METADATA +1 -1
  2. {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/RECORD +48 -48
  3. novelwriter/__init__.py +13 -6
  4. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  5. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  6. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  7. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  8. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  9. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  10. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  11. novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  12. novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  13. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  14. novelwriter/assets/manual.pdf +0 -0
  15. novelwriter/assets/sample.zip +0 -0
  16. novelwriter/common.py +5 -2
  17. novelwriter/config.py +4 -0
  18. novelwriter/core/buildsettings.py +7 -7
  19. novelwriter/core/docbuild.py +2 -2
  20. novelwriter/core/projectxml.py +1 -1
  21. novelwriter/core/spellcheck.py +3 -3
  22. novelwriter/core/tokenizer.py +3 -3
  23. novelwriter/core/toodt.py +1 -1
  24. novelwriter/dialogs/preferences.py +1 -1
  25. novelwriter/dialogs/projectsettings.py +2 -2
  26. novelwriter/dialogs/wordlist.py +2 -2
  27. novelwriter/error.py +1 -1
  28. novelwriter/gui/doceditor.py +27 -25
  29. novelwriter/gui/dochighlight.py +22 -5
  30. novelwriter/gui/docviewer.py +3 -3
  31. novelwriter/gui/mainmenu.py +2 -2
  32. novelwriter/gui/noveltree.py +1 -1
  33. novelwriter/gui/outline.py +9 -9
  34. novelwriter/gui/projtree.py +1 -1
  35. novelwriter/gui/search.py +2 -2
  36. novelwriter/gui/theme.py +15 -5
  37. novelwriter/guimain.py +2 -2
  38. novelwriter/shared.py +16 -4
  39. novelwriter/text/counting.py +1 -0
  40. novelwriter/tools/dictionaries.py +2 -2
  41. novelwriter/tools/manusbuild.py +12 -11
  42. novelwriter/tools/manuscript.py +48 -43
  43. novelwriter/tools/manussettings.py +27 -29
  44. novelwriter/tools/welcome.py +4 -5
  45. {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/LICENSE.md +0 -0
  46. {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/WHEEL +0 -0
  47. {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/entry_points.txt +0 -0
  48. {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelWriter
3
- Version: 2.4rc1
3
+ Version: 2.4.1
4
4
  Summary: A markdown-like text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
6
  License: GNU General Public License v3
@@ -1,24 +1,24 @@
1
- novelwriter/__init__.py,sha256=gPJGUpR72TL3DUdELpLxpobESk-1BSaPJAkBc3NhSAY,7593
2
- novelwriter/common.py,sha256=mLy2OhEF2Ad9I-NQcPkNsJ6yqN6AOtB0ThhIdEnIY5I,17376
3
- novelwriter/config.py,sha256=HCZF0wE2iI4oOB-Trd9lB4VefgzHhvh0rUbOyUJukLU,35740
1
+ novelwriter/__init__.py,sha256=VtDemSGMjXbDNaryCq50iLeWntpICLjlDPNRcXqHPFs,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=6NLRdTtqylbKJyrGes9yHOwpa24N7A2VFgnaJ6o0YnM,7263
7
- novelwriter/guimain.py,sha256=aBPAeGNqCeFhXRXgm96sm_8M_JK_v3ghUI1BM5wj0Do,53461
8
- novelwriter/shared.py,sha256=OS83rH3zFar0sEPTXAdq13LKNGDKNOaYhf1VZ513wGg,14278
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=zhm9pfvpEc9rDPQzE7KW1kU9n6IMlxLK1Pc9m1Ul_18,2605816
11
- novelwriter/assets/sample.zip,sha256=TTC6YpYhFs8wdJ9FNd8IFrZAc_o4It7UjT5luciEA6k,27361
12
- novelwriter/assets/i18n/nw_de_DE.qm,sha256=oUV9VMrFuS14SLfe49xe53_o4KfnBUqdwSF5m6AXQb8,95974
13
- novelwriter/assets/i18n/nw_en_US.qm,sha256=rCB443fatkLrRxsd3hVSn6VoX19SpNqR0zv4O1_wm1c,88824
14
- novelwriter/assets/i18n/nw_es_419.qm,sha256=-4pEroJn4WDR3LeTO4XEvMKOxNrR4-ve-qKgq8FPWn8,98227
15
- novelwriter/assets/i18n/nw_fr_FR.qm,sha256=-Purmgg9FcXme_VI39akAMw2GMPi0xTozzhyOXlED5Q,98674
16
- novelwriter/assets/i18n/nw_it_IT.qm,sha256=eJkz6DdSa3KGm7HUBxUuW07z18ZIckpLrU9F1YGewdQ,98500
17
- novelwriter/assets/i18n/nw_ja_JP.qm,sha256=TXxc0jQErWEljuoFB3TUCWywoNRd90WUUmGrul-gtUc,73429
18
- novelwriter/assets/i18n/nw_nb_NO.qm,sha256=buzXAzjbLAZTinX60tD_wHMR9cxlc6uIEuaYVqgQy9Q,91346
19
- novelwriter/assets/i18n/nw_nl_NL.qm,sha256=2og-KUjwTLI5wlCARIQv320h39-3cllJUruK3M1hV_A,95182
20
- novelwriter/assets/i18n/nw_pt_BR.qm,sha256=JvZ2tXyDdhlfnm25zIq13pcxbvnch5cGte44ENix3LE,103080
21
- novelwriter/assets/i18n/nw_zh_CN.qm,sha256=2sgQgLwMig9h2VGgcJExjrmzaIb0BFwyCyqmY7RpLPM,71433
10
+ novelwriter/assets/manual.pdf,sha256=0bUs25-k9yYEmGN_ewDhu1uDeiura4vxtKL-JaAGePw,2691280
11
+ novelwriter/assets/sample.zip,sha256=di-PLXbCqee6yDFwNrTjRJV621zM3XmRqM7GtvFR6aM,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=YYHRQdi1aCwpvqc-RdF-uGZR9mXBtRHAohThSbtGYr8,93011
20
+ novelwriter/assets/i18n/nw_pt_BR.qm,sha256=2pW_7MFG152nN3Yc721qvvcG01XSRTVe21BvvqdBQvk,79257
21
+ novelwriter/assets/i18n/nw_zh_CN.qm,sha256=vfFnDRqurhO4_rkNww4psJY1dVOwx6jxUAOAoYNDc6w,57700
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=mNJ8v5Rn-lXiqtlFYQ8bzAtQ7JsibktPFiiiTXidHpQ,22385
263
+ novelwriter/core/buildsettings.py,sha256=SVRYtmsneUlidzoHlmXebgpVPW7ZTei8mwTfVug3o4E,22423
264
264
  novelwriter/core/coretools.py,sha256=mNrFL7R3dAAQhe3aGT9QTha4rX4XXF5JOlmXykNCJh0,21467
265
- novelwriter/core/docbuild.py,sha256=vn47y9aYf7lsu-A5vmlmSjlWxI82X6at5rB-fEH0pl0,13844
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=o4sn_Hzn3A-DMlHevjieWoTMaJKJW60HYOWbVfaambs,21936
272
+ novelwriter/core/projectxml.py,sha256=0qylTwEsgoKRlSmDyBgOU4XpGvA3nPMipYs1dNkc-hA,21948
273
273
  novelwriter/core/sessions.py,sha256=k13qaHO0oAyKBlMrhDogO0dFoAROBA8WNgUULGtIhIA,4431
274
- novelwriter/core/spellcheck.py,sha256=AfNOymVlJULF6tSz9ldAj5gyY_k1fHyKzsTivXxQJXg,7235
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=XHjsZVlBt-S5jNyN-i7FrkYenwxFT3-NBNjB-qmazIA,40974
278
+ novelwriter/core/tokenizer.py,sha256=mwcwUojDL7DW8W4wbXZbtnyPnOdN9soJb11dShrdtbk,40993
279
279
  novelwriter/core/tomd.py,sha256=xk5r3oyHkz6LOouiPaQLGVJWp6bT0HLe3upr4JmWjG4,7386
280
- novelwriter/core/toodt.py,sha256=_kTNpeLVIeJYpIwH6ludMF1cNlIGv8fZN0sLAAJP_DM,58628
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=oKFjox-ku4uJdQ8Bm3eDlTuXUZ02Cv7Fky8DR-5CqSQ,36432
287
- novelwriter/dialogs/projectsettings.py,sha256=-uJl9nEPJgr17IjifzxOp5IW3fdg5ZKytym3dOc-yDo,25752
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=LcqqIeU5-y_u1Le_FYcUKfNNABFweu9QiejnpphqgNs,8634
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=255ABHnUOL8SSMbwFxlGwEDYPolhiZaVWni7tYNA5OQ,113649
302
- novelwriter/gui/dochighlight.py,sha256=eWBxFm-jU8I3hu8jZg_v0r5tZf3Nsz4PxNOkbQO3r08,16579
303
- novelwriter/gui/docviewer.py,sha256=8p_T7e_NbZ7fLrBiE1_XWeW-iHLzJ5an2hPldn4trUw,33089
301
+ novelwriter/gui/doceditor.py,sha256=INnIlhwe517h1Q1MluaEksin2INn4cIduGSWhowGCOs,113802
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=63rvJgvqFtMQGDR0d_p-Z7zSTHyW6ioATlO6U_61MTg,38693
308
- novelwriter/gui/noveltree.py,sha256=-XlISrM8y69_HgKHSWsXRSlLTyjQE9x1XG22A4D_5tg,27966
309
- novelwriter/gui/outline.py,sha256=XuM-zG74iwPgshqXUQ4ACsPIw_Z-3KNae5iMRX4VCdU,42265
310
- novelwriter/gui/projtree.py,sha256=euhQoitT5g49za8elmb_w5kpGqWCIZVZndiToC3qs54,77867
311
- novelwriter/gui/search.py,sha256=KJuGMh-V3o8t4bqLvaw2wkDrZyoz0hOALQtYgjSyZAg,12980
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=B8HzV7yP1jyRKwYlvPj3fU-JHeZrUsrpUFZuqmtmYnk,32354
315
- novelwriter/text/counting.py,sha256=TTQoXgK_RThdOkDcM1B3u0X80HxFgKLgvhBgZkNLefM,4236
316
- novelwriter/tools/dictionaries.py,sha256=wnlVjRVBAghRXZhN1pBgoXN5qC7Qp7inQ8EG2uyOHMk,9215
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=wo7Th5nYWmg4h7Wfg7WYrXg_qGgoN-uX41nOue1lXSU,13946
319
- novelwriter/tools/manuscript.py,sha256=Ql4KtzefNr-2LXyNT3vVOnEneOZbXkrkjTA3NXZ08Sc,40043
320
- novelwriter/tools/manussettings.py,sha256=4V9M2SaDuvjszYx6oXQVEHW5FmNtYAnNAo5gdSDKX3Q,55781
318
+ novelwriter/tools/manusbuild.py,sha256=80kRr4OfvW2lqjhLpnAWO8HiTX7Y3HSivcjT48v_KUE,14101
319
+ novelwriter/tools/manuscript.py,sha256=KbaeQaF4dKC2Zs5O1aIprFJL3oKE6h2j1dDR9cm_aL0,40218
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=3lysgIhIu8DCux3XhTqT2Boc4s5qx9spVvmI48lS2d8,27993
322
+ novelwriter/tools/welcome.py,sha256=BxORHBPjqumEVNZC7SytE3kUasx01GMOKS5QQSagP-M,27954
323
323
  novelwriter/tools/writingstats.py,sha256=IubrbbLB_Qlnwp9B3muKkeD84xtckPvmTax7E4LnI5g,22797
324
- novelWriter-2.4rc1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
325
- novelWriter-2.4rc1.dist-info/METADATA,sha256=aPPGvSD_mgrSCGxhnQ_psHjEbc6a3A5ROIlpdIhH_Ec,2583
326
- novelWriter-2.4rc1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
327
- novelWriter-2.4rc1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
328
- novelWriter-2.4rc1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
329
- novelWriter-2.4rc1.dist-info/RECORD,,
324
+ novelWriter-2.4.1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
325
+ novelWriter-2.4.1.dist-info/METADATA,sha256=YIcyEXmUSxGL1ibrWZPbaaHKSDy77G1IwIP12GPVgrk,2582
326
+ novelWriter-2.4.1.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
327
+ novelWriter-2.4.1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
328
+ novelWriter-2.4.1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
329
+ novelWriter-2.4.1.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.4rc1"
46
- __hexversion__ = "0x020400c1"
47
- __date__ = "2024-04-06"
50
+ __version__ = "2.4.1"
51
+ __hexversion__ = "0x020401f0"
52
+ __date__ = "2024-05-06"
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
Binary file
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.fmtHardScene": (str, ""),
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.hideHardScene": (bool, False),
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.fmtHardScene": QT_TRANSLATE_NOOP("Builds", "Hard Scene Format"),
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 = Path.home()
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 Path.home()
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 = Path.home()
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)
@@ -306,8 +306,8 @@ class NWBuildDocument:
306
306
  self._build.getBool("headings.hideScene")
307
307
  )
308
308
  bldObj.setHardSceneFormat(
309
- self._build.getStr("headings.fmtHardScene"),
310
- self._build.getBool("headings.hideHardScene")
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"),
@@ -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
  """
@@ -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
@@ -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
- # (Hard) Scene Headings
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)
@@ -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(Path.home()), filter=ffilter
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(Path.home())
210
+ self, self.tr("Export File"), str(CONFIG.homePath())
211
211
  )
212
212
  if path:
213
213
  try:
novelwriter/error.py CHANGED
@@ -54,7 +54,7 @@ def logException() -> None:
54
54
  return
55
55
 
56
56
 
57
- def formatException(exc) -> str:
57
+ def formatException(exc: BaseException) -> str:
58
58
  """Format an exception as a string the same way the default
59
59
  exception handler does.
60
60
  """