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.
- {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/METADATA +1 -1
 - {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.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 +27 -25
 - 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 +48 -43
 - novelwriter/tools/manussettings.py +27 -29
 - novelwriter/tools/welcome.py +4 -5
 - {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/LICENSE.md +0 -0
 - {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/WHEEL +0 -0
 - {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.dist-info}/entry_points.txt +0 -0
 - {novelWriter-2.4rc1.dist-info → novelWriter-2.4.1.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=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= 
     | 
| 
       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=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= 
     | 
| 
      
 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=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= 
     | 
| 
       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=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= 
     | 
| 
      
 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.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. 
     | 
| 
       46 
     | 
    
         
            -
            __hexversion__ = " 
     | 
| 
       47 
     | 
    
         
            -
            __date__       = "2024- 
     | 
| 
      
 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 
     | 
    
        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:
         
     |