novelWriter 2.5.1__py3-none-any.whl → 2.6b1__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.5.1.dist-info → novelWriter-2.6b1.dist-info}/METADATA +2 -1
 - {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/RECORD +61 -56
 - {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/WHEEL +1 -1
 - novelwriter/__init__.py +3 -3
 - novelwriter/assets/i18n/project_en_GB.json +1 -0
 - novelwriter/assets/icons/typicons_dark/icons.conf +1 -0
 - novelwriter/assets/icons/typicons_dark/mixed_copy.svg +4 -0
 - novelwriter/assets/icons/typicons_light/icons.conf +1 -0
 - novelwriter/assets/icons/typicons_light/mixed_copy.svg +4 -0
 - novelwriter/assets/manual.pdf +0 -0
 - novelwriter/assets/sample.zip +0 -0
 - novelwriter/assets/themes/default_light.conf +2 -2
 - novelwriter/common.py +63 -0
 - novelwriter/config.py +10 -3
 - novelwriter/constants.py +153 -60
 - novelwriter/core/buildsettings.py +66 -39
 - novelwriter/core/coretools.py +34 -22
 - novelwriter/core/docbuild.py +130 -169
 - novelwriter/core/index.py +29 -18
 - novelwriter/core/item.py +2 -2
 - novelwriter/core/options.py +4 -1
 - novelwriter/core/spellcheck.py +9 -14
 - novelwriter/dialogs/preferences.py +45 -32
 - novelwriter/dialogs/projectsettings.py +3 -3
 - novelwriter/enum.py +29 -23
 - novelwriter/extensions/configlayout.py +24 -11
 - novelwriter/extensions/modified.py +13 -1
 - novelwriter/extensions/pagedsidebar.py +5 -5
 - novelwriter/formats/shared.py +155 -0
 - novelwriter/formats/todocx.py +1195 -0
 - novelwriter/formats/tohtml.py +452 -0
 - novelwriter/{core → formats}/tokenizer.py +483 -485
 - novelwriter/formats/tomarkdown.py +217 -0
 - novelwriter/{core → formats}/toodt.py +270 -320
 - novelwriter/formats/toqdoc.py +436 -0
 - novelwriter/formats/toraw.py +91 -0
 - novelwriter/gui/doceditor.py +240 -193
 - novelwriter/gui/dochighlight.py +96 -84
 - novelwriter/gui/docviewer.py +56 -30
 - novelwriter/gui/docviewerpanel.py +3 -3
 - novelwriter/gui/editordocument.py +17 -2
 - novelwriter/gui/itemdetails.py +8 -4
 - novelwriter/gui/mainmenu.py +121 -60
 - novelwriter/gui/noveltree.py +35 -37
 - novelwriter/gui/outline.py +186 -238
 - novelwriter/gui/projtree.py +142 -131
 - novelwriter/gui/sidebar.py +7 -6
 - novelwriter/gui/theme.py +5 -4
 - novelwriter/guimain.py +43 -155
 - novelwriter/shared.py +14 -4
 - novelwriter/text/counting.py +2 -0
 - novelwriter/text/patterns.py +155 -59
 - novelwriter/tools/manusbuild.py +1 -1
 - novelwriter/tools/manuscript.py +121 -78
 - novelwriter/tools/manussettings.py +403 -260
 - novelwriter/tools/welcome.py +4 -4
 - novelwriter/tools/writingstats.py +3 -3
 - novelwriter/types.py +16 -6
 - novelwriter/core/tohtml.py +0 -530
 - novelwriter/core/tomarkdown.py +0 -252
 - novelwriter/core/toqdoc.py +0 -419
 - {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/LICENSE.md +0 -0
 - {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/entry_points.txt +0 -0
 - {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/top_level.txt +0 -0
 
| 
         @@ -1,6 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            Metadata-Version: 2.1
         
     | 
| 
       2 
2 
     | 
    
         
             
            Name: novelWriter
         
     | 
| 
       3 
     | 
    
         
            -
            Version: 2. 
     | 
| 
      
 3 
     | 
    
         
            +
            Version: 2.6b1
         
     | 
| 
       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
         
     | 
| 
         @@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3.9 
     | 
|
| 
       13 
13 
     | 
    
         
             
            Classifier: Programming Language :: Python :: 3.10
         
     | 
| 
       14 
14 
     | 
    
         
             
            Classifier: Programming Language :: Python :: 3.11
         
     | 
| 
       15 
15 
     | 
    
         
             
            Classifier: Programming Language :: Python :: 3.12
         
     | 
| 
      
 16 
     | 
    
         
            +
            Classifier: Programming Language :: Python :: 3.13
         
     | 
| 
       16 
17 
     | 
    
         
             
            Classifier: Programming Language :: Python :: Implementation :: CPython
         
     | 
| 
       17 
18 
     | 
    
         
             
            Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
         
     | 
| 
       18 
19 
     | 
    
         
             
            Classifier: Development Status :: 5 - Production/Stable
         
     | 
| 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            novelwriter/__init__.py,sha256= 
     | 
| 
       2 
     | 
    
         
            -
            novelwriter/common.py,sha256= 
     | 
| 
       3 
     | 
    
         
            -
            novelwriter/config.py,sha256= 
     | 
| 
       4 
     | 
    
         
            -
            novelwriter/constants.py,sha256= 
     | 
| 
       5 
     | 
    
         
            -
            novelwriter/enum.py,sha256= 
     | 
| 
      
 1 
     | 
    
         
            +
            novelwriter/__init__.py,sha256=V5sVfjFKEzWnXaXjc8cFLgQK-084cQc9qfz_a0hoceo,7552
         
     | 
| 
      
 2 
     | 
    
         
            +
            novelwriter/common.py,sha256=cONkyYFIt4YMTkMaZR7CWlTR0BvU_U7ObBjM1tfpJO0,20012
         
     | 
| 
      
 3 
     | 
    
         
            +
            novelwriter/config.py,sha256=nGRx3CGa3wmqLQ60A6xv3w6tBwfSclZPyI4a14BzhY8,39396
         
     | 
| 
      
 4 
     | 
    
         
            +
            novelwriter/constants.py,sha256=_hKNHfkVSOK7Oo-9RyRLXxVqh1Pv1h0qU_g6NbiAxRQ,25494
         
     | 
| 
      
 5 
     | 
    
         
            +
            novelwriter/enum.py,sha256=nbH8gSn7onAMCuWSZJLvUIzwqmx_EovCtmJK_r7ynys,3618
         
     | 
| 
       6 
6 
     | 
    
         
             
            novelwriter/error.py,sha256=iIx1OzyXTT7Ngk2mXW_5c0YqVdFBD0NIkUFgAXNNBlM,6813
         
     | 
| 
       7 
     | 
    
         
            -
            novelwriter/guimain.py,sha256= 
     | 
| 
       8 
     | 
    
         
            -
            novelwriter/shared.py,sha256= 
     | 
| 
       9 
     | 
    
         
            -
            novelwriter/types.py,sha256= 
     | 
| 
       10 
     | 
    
         
            -
            novelwriter/assets/manual.pdf,sha256= 
     | 
| 
       11 
     | 
    
         
            -
            novelwriter/assets/sample.zip,sha256= 
     | 
| 
      
 7 
     | 
    
         
            +
            novelwriter/guimain.py,sha256=ep-RcerUivTj-SMkNxALKcXkNlPa538SbOhSkg2EtHE,49220
         
     | 
| 
      
 8 
     | 
    
         
            +
            novelwriter/shared.py,sha256=VJe-CuGy-WWYBeMumpg7KzuOAHxAZLMQIds_3ZPY6vU,16202
         
     | 
| 
      
 9 
     | 
    
         
            +
            novelwriter/types.py,sha256=60gJAuZSISbssBy6YrNIg8BlPOGoyH4IIxS99Dh8ZOg,4889
         
     | 
| 
      
 10 
     | 
    
         
            +
            novelwriter/assets/manual.pdf,sha256=jNIxkqqNArtDHkWnlJ0_TlPnbJFVLhUkHN0Xr1G_ph0,2734203
         
     | 
| 
      
 11 
     | 
    
         
            +
            novelwriter/assets/sample.zip,sha256=veIizPN-WbN6wEmowrXWraE39uup-DU2T_LmveVyTIE,28032
         
     | 
| 
       12 
12 
     | 
    
         
             
            novelwriter/assets/i18n/nw_de_DE.qm,sha256=__e0mtl0hfBX61eICSrJhR4mY0r7W9IkI5fYCwvLrYw,100554
         
     | 
| 
       13 
13 
     | 
    
         
             
            novelwriter/assets/i18n/nw_en_US.qm,sha256=Mueo40jL6hBXcV0Vxac-Jd-GAsLASSqEV_7W96sFkZ8,93304
         
     | 
| 
       14 
14 
     | 
    
         
             
            novelwriter/assets/i18n/nw_es_419.qm,sha256=eHiRXnf86BPH5MGvJuo8bR_nBaf-HULE-nRW76o9-yU,103131
         
     | 
| 
         @@ -21,7 +21,7 @@ novelwriter/assets/i18n/nw_pl_PL.qm,sha256=Em13jYHYnTbLZp_JaodgZntmcpxBrvbitOZhM 
     | 
|
| 
       21 
21 
     | 
    
         
             
            novelwriter/assets/i18n/nw_pt_BR.qm,sha256=EXqtpkEPafPipTd0rCBN6cQ5SlqVyeMPwyMfgpTKjMs,101680
         
     | 
| 
       22 
22 
     | 
    
         
             
            novelwriter/assets/i18n/nw_zh_CN.qm,sha256=poSDKRXapJ8zHBmiRdA85KcIN1nm6gnowDMlpoJwAKE,69647
         
     | 
| 
       23 
23 
     | 
    
         
             
            novelwriter/assets/i18n/project_de_DE.json,sha256=85ud9rxRHyXm85QDmW_LKcUE8h0L1Bvukaf5Tjt-wpg,2818
         
     | 
| 
       24 
     | 
    
         
            -
            novelwriter/assets/i18n/project_en_GB.json,sha256= 
     | 
| 
      
 24 
     | 
    
         
            +
            novelwriter/assets/i18n/project_en_GB.json,sha256=CvBOO8kaW0k7NlwvxFi62Br9HYKJKQLDk1nQfvXOj48,2537
         
     | 
| 
       25 
25 
     | 
    
         
             
            novelwriter/assets/i18n/project_en_US.json,sha256=EcQAVEiQgRL3qobuzkPTfOWIxAc3Om-tA7nXUFFXEdI,2483
         
     | 
| 
       26 
26 
     | 
    
         
             
            novelwriter/assets/i18n/project_es_419.json,sha256=Z6CAhc0hzekUZFDM-0ykRRsckJG4c2AETy4Xa_f2T7s,2730
         
     | 
| 
       27 
27 
     | 
    
         
             
            novelwriter/assets/i18n/project_fr_FR.json,sha256=CBojo05gdhxev5pFg889ENe_CKOHSDv3oj8SmkBFqGg,2788
         
     | 
| 
         @@ -40,7 +40,8 @@ novelwriter/assets/icons/novelwriter.svg,sha256=Ad_SgOdXSDJtFR3DLCx6Afme15I78r38 
     | 
|
| 
       40 
40 
     | 
    
         
             
            novelwriter/assets/icons/x-novelwriter-project.ico,sha256=MXdZSYi3j95aIsT5bZo6CkhxmS75cThP9O_38UR7sjg,170697
         
     | 
| 
       41 
41 
     | 
    
         
             
            novelwriter/assets/icons/x-novelwriter-project.svg,sha256=VHf1aClkA91tZVYb3LFk9bi_Dw25QBVSjUJAjSD-YX4,5143
         
     | 
| 
       42 
42 
     | 
    
         
             
            novelwriter/assets/icons/typicons_dark/README.md,sha256=6ZxJq-19PNrMdeuVeVg84aLjxhr9oF7dLwuMFVGQyq0,1065
         
     | 
| 
       43 
     | 
    
         
            -
            novelwriter/assets/icons/typicons_dark/icons.conf,sha256= 
     | 
| 
      
 43 
     | 
    
         
            +
            novelwriter/assets/icons/typicons_dark/icons.conf,sha256=hKOFfIU_vhgoqCzkl9tovzDCHOHUdTAGeRrVXzXvHq0,4525
         
     | 
| 
      
 44 
     | 
    
         
            +
            novelwriter/assets/icons/typicons_dark/mixed_copy.svg,sha256=lUcY81wxepOd1XaPZb47oRmrsX3ZIHCLOEUBDPQyYoU,633
         
     | 
| 
       44 
45 
     | 
    
         
             
            novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg,sha256=POP_Cs3bkkKAmrS_fTgjj90eyNK0bipNGgOhDDlXKu0,1650
         
     | 
| 
       45 
46 
     | 
    
         
             
            novelwriter/assets/icons/typicons_dark/mixed_document-new.svg,sha256=EIVU3_ecC0d6rpCHXBfKoA_mWJyilqe7iA6XLQb9oRw,1849
         
     | 
| 
       46 
47 
     | 
    
         
             
            novelwriter/assets/icons/typicons_dark/mixed_document-note.svg,sha256=OaPRbvkA7h4GA4mnFXJRORv80h2nAsJTmlIR8Msrwt8,1650
         
     | 
| 
         @@ -140,7 +141,8 @@ novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg,sha256=IvVXmxlkrTy 
     | 
|
| 
       140 
141 
     | 
    
         
             
            novelwriter/assets/icons/typicons_dark/typ_user.svg,sha256=00gZEDr59B1A7A4o0w5VjCJOHnQHANsgXBhnB_VTMU4,733
         
     | 
| 
       141 
142 
     | 
    
         
             
            novelwriter/assets/icons/typicons_dark/typ_warning-full.svg,sha256=zqqV82C37dWH_yHoSuPo-BLsErg0sl8_VlB6fzXL4VE,970
         
     | 
| 
       142 
143 
     | 
    
         
             
            novelwriter/assets/icons/typicons_light/README.md,sha256=nyGvWLJ8cusLYP8YsjX_l213NkDE_GHrwctZ-I_JQUg,1066
         
     | 
| 
       143 
     | 
    
         
            -
            novelwriter/assets/icons/typicons_light/icons.conf,sha256= 
     | 
| 
      
 144 
     | 
    
         
            +
            novelwriter/assets/icons/typicons_light/icons.conf,sha256=H9kBuYsmOFzSqZ7TZ1WjCQXV2SYtMXSaQ5jzr2lrvQ8,4528
         
     | 
| 
      
 145 
     | 
    
         
            +
            novelwriter/assets/icons/typicons_light/mixed_copy.svg,sha256=ojZVpxuFzlJFGEav5vg8Kr4SgDxffu0awEe3De5iB6U,636
         
     | 
| 
       144 
146 
     | 
    
         
             
            novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg,sha256=kXNwPbeKR3eupIrqtDQrNGq5sL8vdExLfPMrMX2sEsw,1650
         
     | 
| 
       145 
147 
     | 
    
         
             
            novelwriter/assets/icons/typicons_light/mixed_document-new.svg,sha256=u0YYfp6hTUEYLsrPleUqYocaG2hl62w-B85INvkm6S4,1825
         
     | 
| 
       146 
148 
     | 
    
         
             
            novelwriter/assets/icons/typicons_light/mixed_document-note.svg,sha256=XpKQ2Fj7J3I3BT9mAQkjk_A4eP7uy94vPeDBA62fOYI,1650
         
     | 
| 
         @@ -265,75 +267,78 @@ novelwriter/assets/text/lipsum.txt,sha256=sGA6AC_p4jrUifxLxy3cSODeRwkpBNXDPGgX6Y 
     | 
|
| 
       265 
267 
     | 
    
         
             
            novelwriter/assets/themes/cyberpunk_night.conf,sha256=FvG_YVfEnMwJV1XUDEdpi9qoHQ5sdyVEaR_Y3WfWNA8,923
         
     | 
| 
       266 
268 
     | 
    
         
             
            novelwriter/assets/themes/default.conf,sha256=K0LZ64lODpCtUg3pISTAP4UKvEYMvPkmIYN9RDEaWwk,72
         
     | 
| 
       267 
269 
     | 
    
         
             
            novelwriter/assets/themes/default_dark.conf,sha256=obPCLVOXL1Zp973DbbROldyQOoUPGWlPKLbetZqMZe8,989
         
     | 
| 
       268 
     | 
    
         
            -
            novelwriter/assets/themes/default_light.conf,sha256= 
     | 
| 
      
 270 
     | 
    
         
            +
            novelwriter/assets/themes/default_light.conf,sha256=2a4SXzlbZpyV9EX3BuFSRFYuLuzu4hapa_3iwez6yAc,992
         
     | 
| 
       269 
271 
     | 
    
         
             
            novelwriter/assets/themes/dracula.conf,sha256=pUvu7FS1nRPj3PyU3NZMR0WSb5sIa0oLpSa2XTzsh98,1425
         
     | 
| 
       270 
272 
     | 
    
         
             
            novelwriter/assets/themes/solarized_dark.conf,sha256=7dDjs8aiFuAjl--hqMJQEExrfCgAapiPY82CL6aAo-I,916
         
     | 
| 
       271 
273 
     | 
    
         
             
            novelwriter/assets/themes/solarized_light.conf,sha256=psCPVWcjAKB5y8H_E_h5zYUifxh5YpdFdBzxFofIHa0,918
         
     | 
| 
       272 
     | 
    
         
            -
            novelwriter/core/buildsettings.py,sha256= 
     | 
| 
       273 
     | 
    
         
            -
            novelwriter/core/coretools.py,sha256= 
     | 
| 
       274 
     | 
    
         
            -
            novelwriter/core/docbuild.py,sha256= 
     | 
| 
      
 274 
     | 
    
         
            +
            novelwriter/core/buildsettings.py,sha256=YAx1P-Vop4UssOjckon0IYLSgpTDVz5kYQFjjt0uIb4,24092
         
     | 
| 
      
 275 
     | 
    
         
            +
            novelwriter/core/coretools.py,sha256=H-6OUsKEfLyaHASzVxStN-WUiAgDQu8teiaioqwI7vE,21212
         
     | 
| 
      
 276 
     | 
    
         
            +
            novelwriter/core/docbuild.py,sha256=3nBvYXLB5CImrJIvllHt3rMaHOkIL4QNUhGD7j28WOg,13704
         
     | 
| 
       275 
277 
     | 
    
         
             
            novelwriter/core/document.py,sha256=T8FlxyEMlR3t2HNE92InseWUMylWFTMnr2fP-Ge5LQc,12130
         
     | 
| 
       276 
     | 
    
         
            -
            novelwriter/core/index.py,sha256= 
     | 
| 
       277 
     | 
    
         
            -
            novelwriter/core/item.py,sha256= 
     | 
| 
       278 
     | 
    
         
            -
            novelwriter/core/options.py,sha256= 
     | 
| 
      
 278 
     | 
    
         
            +
            novelwriter/core/index.py,sha256=eSV3-8seQ2NRPbojP1miDQvdQuohhTlmLgBjmdV50tc,48870
         
     | 
| 
      
 279 
     | 
    
         
            +
            novelwriter/core/item.py,sha256=bkruFkLlvUgyrH92BESFWAH0XFdTdwRYqsy8HIwYwAM,17633
         
     | 
| 
      
 280 
     | 
    
         
            +
            novelwriter/core/options.py,sha256=HmN2-yOj5IkwMLzEOLM0IyCA4wNMNv3Nf53EBgtiPkE,7457
         
     | 
| 
       279 
281 
     | 
    
         
             
            novelwriter/core/project.py,sha256=tdD6GrwicCttvlM2jt0Tx8A9VpfFi5g4sTsM2h497R4,22066
         
     | 
| 
       280 
282 
     | 
    
         
             
            novelwriter/core/projectdata.py,sha256=bt-LDNJsM2K4VwTcyZU_V2KOUZJFRKrNXNIwbU1v3Eo,9799
         
     | 
| 
       281 
283 
     | 
    
         
             
            novelwriter/core/projectxml.py,sha256=dbgm2ryPCOa1BFsFay-6vEK2itE8TWYRUiwCBpPp59g,22013
         
     | 
| 
       282 
284 
     | 
    
         
             
            novelwriter/core/sessions.py,sha256=V9eBXaUMcXTZjYXR5dgi6E14COIlcLIkNwS6pDrn75U,4405
         
     | 
| 
       283 
     | 
    
         
            -
            novelwriter/core/spellcheck.py,sha256= 
     | 
| 
      
 285 
     | 
    
         
            +
            novelwriter/core/spellcheck.py,sha256=RBaqQaQtxi1e20zi7Jn3VUzHvfY3mGZh4Z7SY19csTc,7151
         
     | 
| 
       284 
286 
     | 
    
         
             
            novelwriter/core/status.py,sha256=FW20GK6_gxsYCiD7ZDg_gGIgp6yw3y1PS5mBN5HlARo,11592
         
     | 
| 
       285 
287 
     | 
    
         
             
            novelwriter/core/storage.py,sha256=mNM9EMW0VRMwEkmTKnzotPVdJk4tJDDUNAHNH9yG5mw,20926
         
     | 
| 
       286 
     | 
    
         
            -
            novelwriter/core/tohtml.py,sha256=NxM4c52q2ZFNW-XdHOI9L5lqTSiw9J5KZAELhdmN_9I,19211
         
     | 
| 
       287 
     | 
    
         
            -
            novelwriter/core/tokenizer.py,sha256=Q7sfWpJxTSkcnj3SiSmQGr8JTXUlH-TGkwzfKe1pfsk,47712
         
     | 
| 
       288 
     | 
    
         
            -
            novelwriter/core/tomarkdown.py,sha256=sZG64PLyTjDuIxnPQVMdcMSF-obsp4C06B1dUKhlbHU,7925
         
     | 
| 
       289 
     | 
    
         
            -
            novelwriter/core/toodt.py,sha256=Hrb6FJkwf2wwcKE6f7lw5o0PZqKsf1TWqvJbrJWrijU,62529
         
     | 
| 
       290 
     | 
    
         
            -
            novelwriter/core/toqdoc.py,sha256=p8_4WwwXcnEuPw2XsU4Xq76YTyT2JMk7NQR1arCjVd8,15500
         
     | 
| 
       291 
288 
     | 
    
         
             
            novelwriter/core/tree.py,sha256=mmOB7kN0tjWda_AdT1WuZyFrewuc6uRAlqCfX6opwek,18681
         
     | 
| 
       292 
289 
     | 
    
         
             
            novelwriter/dialogs/about.py,sha256=0iBYkifACc5vZj4KwG0G2Dll_Wp4acAHUfNTto74MFU,4755
         
     | 
| 
       293 
290 
     | 
    
         
             
            novelwriter/dialogs/docmerge.py,sha256=HtJvmu56CGb_G27XGRgF3kl0jPR_14SBVsOKv_UyVX8,6286
         
     | 
| 
       294 
291 
     | 
    
         
             
            novelwriter/dialogs/docsplit.py,sha256=nPb7U68vtZ5yuJtUIr-2yTWCfADCtK4T1h7LgL0Hx8c,9281
         
     | 
| 
       295 
292 
     | 
    
         
             
            novelwriter/dialogs/editlabel.py,sha256=cs8ztrK1Gi3lEZozvs978dNAR6rnlV8cWr9dZArD51I,2963
         
     | 
| 
       296 
     | 
    
         
            -
            novelwriter/dialogs/preferences.py,sha256= 
     | 
| 
       297 
     | 
    
         
            -
            novelwriter/dialogs/projectsettings.py,sha256= 
     | 
| 
      
 293 
     | 
    
         
            +
            novelwriter/dialogs/preferences.py,sha256=ss5b4X0Ol96ntWVbyKTf5p9vl1iaw9rIAMlX-wqsMqM,38737
         
     | 
| 
      
 294 
     | 
    
         
            +
            novelwriter/dialogs/projectsettings.py,sha256=Hr_0bXTGJUS6VAD6jK-jAp9kJ93-CFEcQwfauScWIQE,27539
         
     | 
| 
       298 
295 
     | 
    
         
             
            novelwriter/dialogs/quotes.py,sha256=JCgoz9I8HepxYYVBXOzQac6aFpzNMF4CRdw4CnAnuNM,4727
         
     | 
| 
       299 
296 
     | 
    
         
             
            novelwriter/dialogs/wordlist.py,sha256=yuQebLRuasVk2QUm2zWGn7ZzuWM4lFGyXz0egQPyILw,8511
         
     | 
| 
       300 
     | 
    
         
            -
            novelwriter/extensions/configlayout.py,sha256 
     | 
| 
      
 297 
     | 
    
         
            +
            novelwriter/extensions/configlayout.py,sha256=-dAAkA7B5HiuxaJWGXgBNvqNW-a4fS2buE1jc_kDQk0,10719
         
     | 
| 
       301 
298 
     | 
    
         
             
            novelwriter/extensions/eventfilters.py,sha256=mTU_sMQPOEocRfvLcwQyXUpkm314tH32WsID61ss1CI,2522
         
     | 
| 
       302 
     | 
    
         
            -
            novelwriter/extensions/modified.py,sha256= 
     | 
| 
      
 299 
     | 
    
         
            +
            novelwriter/extensions/modified.py,sha256=Skr0ke2NYH6YCuu-L98mNCg0NLlXmy5tfSruV4td-ns,6015
         
     | 
| 
       303 
300 
     | 
    
         
             
            novelwriter/extensions/novelselector.py,sha256=etVtoDkHGJIP4ab__vStJQCREKYt5sWLfK1vyuO3hLI,3794
         
     | 
| 
       304 
     | 
    
         
            -
            novelwriter/extensions/pagedsidebar.py,sha256= 
     | 
| 
      
 301 
     | 
    
         
            +
            novelwriter/extensions/pagedsidebar.py,sha256=CbQlW5pTQhhiTN5py158AxY1ttw4hFAh8JlBWDwof4A,7248
         
     | 
| 
       305 
302 
     | 
    
         
             
            novelwriter/extensions/progressbars.py,sha256=BpJHycboSNGYWIfAEMqIy1Qxf32Cg8TeWM3hogzakTs,4628
         
     | 
| 
       306 
303 
     | 
    
         
             
            novelwriter/extensions/statusled.py,sha256=QdgkMSMKMfQRM9kiEXCuH-wbrq_AH9Sh8zBvYfvJE6Q,2943
         
     | 
| 
       307 
304 
     | 
    
         
             
            novelwriter/extensions/switch.py,sha256=4kXJ3EHEhaivj1D69iBi46hkkPBGAt-Rt5EjVK3V4Aw,4299
         
     | 
| 
       308 
305 
     | 
    
         
             
            novelwriter/extensions/switchbox.py,sha256=5tCiFWkT9WF9xh2c__BnNAJHFLw2nRso3fJZfwzDqRE,4198
         
     | 
| 
       309 
306 
     | 
    
         
             
            novelwriter/extensions/versioninfo.py,sha256=R2_U6B678be0WNxbnhUntpxR5PnZVGf6eeyENp-S-Xo,5035
         
     | 
| 
       310 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       311 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       312 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       313 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       314 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       315 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       316 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       317 
     | 
    
         
            -
            novelwriter/ 
     | 
| 
       318 
     | 
    
         
            -
            novelwriter/gui/ 
     | 
| 
       319 
     | 
    
         
            -
            novelwriter/gui/ 
     | 
| 
      
 307 
     | 
    
         
            +
            novelwriter/formats/shared.py,sha256=aXmOpXIOvpA8cTI2hV3OFMEmTEs6JYUd3aAUGcniipI,4580
         
     | 
| 
      
 308 
     | 
    
         
            +
            novelwriter/formats/todocx.py,sha256=2a22VHA59f7Lcr4onpSRgsYD5KOhECLlytFNEb_miZQ,40157
         
     | 
| 
      
 309 
     | 
    
         
            +
            novelwriter/formats/tohtml.py,sha256=m-EL0Blu1sY9Z2YGlZJdSVPP6sszemiLxhuY2sPguYU,17219
         
     | 
| 
      
 310 
     | 
    
         
            +
            novelwriter/formats/tokenizer.py,sha256=9dN-PDcyNd2roEvslB9_yRJtH2xuwtq1eXXt9hNhwEo,48219
         
     | 
| 
      
 311 
     | 
    
         
            +
            novelwriter/formats/tomarkdown.py,sha256=Y1zSkdfFiMzdrEoYAvd5a48_XrCKLT35CiAplS2lY20,6891
         
     | 
| 
      
 312 
     | 
    
         
            +
            novelwriter/formats/toodt.py,sha256=oYy55jrWxilze-1dGQTrI9-647_q6d00Rdn1dYSPkx4,61157
         
     | 
| 
      
 313 
     | 
    
         
            +
            novelwriter/formats/toqdoc.py,sha256=O-iY9-mnwz9kNv4NU9NELya6XxqvSPkE9jMOsfUnvIE,16031
         
     | 
| 
      
 314 
     | 
    
         
            +
            novelwriter/formats/toraw.py,sha256=ySpdePg3_qAZGrDcNPYy1CYOp9EsERo1yIx5S4nfdhk,2817
         
     | 
| 
      
 315 
     | 
    
         
            +
            novelwriter/gui/doceditor.py,sha256=fx_L1EqnB2eafcXjqTkJrM_fHVdGBlLFGERe8BL0MG8,115098
         
     | 
| 
      
 316 
     | 
    
         
            +
            novelwriter/gui/dochighlight.py,sha256=es-UCYry-ks--tfscaqzN7_xn5Xvm-wGiBJVEj3Q4D4,19655
         
     | 
| 
      
 317 
     | 
    
         
            +
            novelwriter/gui/docviewer.py,sha256=4rzmEA6piNjHUXrmApT0b102qkQt_8UlUz7RH8fjpqM,33282
         
     | 
| 
      
 318 
     | 
    
         
            +
            novelwriter/gui/docviewerpanel.py,sha256=eZ0aV1m3z8ynMpUy3LCoecdokxouqL47tGmlocfNo4g,20037
         
     | 
| 
      
 319 
     | 
    
         
            +
            novelwriter/gui/editordocument.py,sha256=pCTp6fZT05BhTRwKlw60rQwsv1bVTIlV3_HiztamPeY,4698
         
     | 
| 
      
 320 
     | 
    
         
            +
            novelwriter/gui/itemdetails.py,sha256=lr_5IEEz0U7dMBgi8GqRV47IsCTNg2sCdMxls8hSuJE,9851
         
     | 
| 
      
 321 
     | 
    
         
            +
            novelwriter/gui/mainmenu.py,sha256=d-v36BSm5xQFVeteqC9ZXl1z4I5MK22XoMLTcxsZtL4,41495
         
     | 
| 
      
 322 
     | 
    
         
            +
            novelwriter/gui/noveltree.py,sha256=CXz1mCO3OFZfeJ3NmZoN6OE2fhuGGSdfEI6UfA5auLY,27131
         
     | 
| 
      
 323 
     | 
    
         
            +
            novelwriter/gui/outline.py,sha256=hhN5GNIowCTTG-OREadL4zBkP22WE0CTnIiHAUkS7P0,38432
         
     | 
| 
      
 324 
     | 
    
         
            +
            novelwriter/gui/projtree.py,sha256=32XS_JhOUC2O4YSjrb34-g4_gAY8jhUx01etuhgQ_bA,78289
         
     | 
| 
       320 
325 
     | 
    
         
             
            novelwriter/gui/search.py,sha256=HnS0_vOg15f3woXeZ8MS_ZAblx9aFIuN7BSa195tY1M,13262
         
     | 
| 
       321 
     | 
    
         
            -
            novelwriter/gui/sidebar.py,sha256= 
     | 
| 
      
 326 
     | 
    
         
            +
            novelwriter/gui/sidebar.py,sha256=Yl86aZSVXDlbo6xXkolr8LlnoNKImKf8CrrlI3o7c9I,6261
         
     | 
| 
       322 
327 
     | 
    
         
             
            novelwriter/gui/statusbar.py,sha256=-rF6bIJXGKFRswVKWE1c5In5x3sX4iXMfp0AGxZxt0c,9053
         
     | 
| 
       323 
     | 
    
         
            -
            novelwriter/gui/theme.py,sha256= 
     | 
| 
       324 
     | 
    
         
            -
            novelwriter/text/counting.py,sha256= 
     | 
| 
       325 
     | 
    
         
            -
            novelwriter/text/patterns.py,sha256= 
     | 
| 
      
 328 
     | 
    
         
            +
            novelwriter/gui/theme.py,sha256=M4XM6-DCxPHOzLEMke19-Z79_qiE6AZb5TuKuxCdXyM,31990
         
     | 
| 
      
 329 
     | 
    
         
            +
            novelwriter/text/counting.py,sha256=b88S7V8xWOgkq7dfuCeciX0qpxu94k0G071VqP6VNvE,4382
         
     | 
| 
      
 330 
     | 
    
         
            +
            novelwriter/text/patterns.py,sha256=W_Hft6U4vv0dz5rsTGBf1rZZg6uvFzEsTfGBaKOvl_o,7206
         
     | 
| 
       326 
331 
     | 
    
         
             
            novelwriter/tools/dictionaries.py,sha256=92GNCSEOK1EI7t2DiayT8p7nzKW7LwxJJz98F6kn3Vg,9243
         
     | 
| 
       327 
332 
     | 
    
         
             
            novelwriter/tools/lipsum.py,sha256=NcmoxWzrbEybh_w1FzxuxHmeTr8N03OrxjxsPWEbae4,4794
         
     | 
| 
       328 
     | 
    
         
            -
            novelwriter/tools/manusbuild.py,sha256= 
     | 
| 
       329 
     | 
    
         
            -
            novelwriter/tools/manuscript.py,sha256= 
     | 
| 
       330 
     | 
    
         
            -
            novelwriter/tools/manussettings.py,sha256= 
     | 
| 
      
 333 
     | 
    
         
            +
            novelwriter/tools/manusbuild.py,sha256=ClJw3zdAerfyFKFpKuwm0TgzHdOSSugqasV7gHQm_i0,14079
         
     | 
| 
      
 334 
     | 
    
         
            +
            novelwriter/tools/manuscript.py,sha256=i9w23boR7H2vZNFI6hzATmhtWLfw3MMWDcsu_cNkrF4,40052
         
     | 
| 
      
 335 
     | 
    
         
            +
            novelwriter/tools/manussettings.py,sha256=sw7ipbEt5gYG8Bm7qwrdDRpT96xId_-XbduvnmS8WCA,60959
         
     | 
| 
       331 
336 
     | 
    
         
             
            novelwriter/tools/noveldetails.py,sha256=xNpTf5-hFu-K_flPhMLug6tNboKvDWV7OEetpHx6Lsc,18481
         
     | 
| 
       332 
     | 
    
         
            -
            novelwriter/tools/welcome.py,sha256= 
     | 
| 
       333 
     | 
    
         
            -
            novelwriter/tools/writingstats.py,sha256= 
     | 
| 
       334 
     | 
    
         
            -
            novelWriter-2. 
     | 
| 
       335 
     | 
    
         
            -
            novelWriter-2. 
     | 
| 
       336 
     | 
    
         
            -
            novelWriter-2. 
     | 
| 
       337 
     | 
    
         
            -
            novelWriter-2. 
     | 
| 
       338 
     | 
    
         
            -
            novelWriter-2. 
     | 
| 
       339 
     | 
    
         
            -
            novelWriter-2. 
     | 
| 
      
 337 
     | 
    
         
            +
            novelwriter/tools/welcome.py,sha256=DsXNeudXe_PXsMv4R8zJ38rGQ60iqguZQ-g5lB8oJu8,27993
         
     | 
| 
      
 338 
     | 
    
         
            +
            novelwriter/tools/writingstats.py,sha256=456kR-EniRE5jNJSTE8ba3A1MrvavqF88Kt2k3OiFTM,22767
         
     | 
| 
      
 339 
     | 
    
         
            +
            novelWriter-2.6b1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
         
     | 
| 
      
 340 
     | 
    
         
            +
            novelWriter-2.6b1.dist-info/METADATA,sha256=gQlm_A2KI6X8sUV5-JtBfgvP0gwEI2WctQ2XWXwcIdI,2583
         
     | 
| 
      
 341 
     | 
    
         
            +
            novelWriter-2.6b1.dist-info/WHEEL,sha256=a7TGlA-5DaHMRrarXjVbQagU3Man_dCnGIWMJr5kRWo,91
         
     | 
| 
      
 342 
     | 
    
         
            +
            novelWriter-2.6b1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
         
     | 
| 
      
 343 
     | 
    
         
            +
            novelWriter-2.6b1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
         
     | 
| 
      
 344 
     | 
    
         
            +
            novelWriter-2.6b1.dist-info/RECORD,,
         
     | 
    
        novelwriter/__init__.py
    CHANGED
    
    | 
         @@ -47,9 +47,9 @@ __license__    = "GPLv3" 
     | 
|
| 
       47 
47 
     | 
    
         
             
            __author__     = "Veronica Berglyd Olsen"
         
     | 
| 
       48 
48 
     | 
    
         
             
            __maintainer__ = "Veronica Berglyd Olsen"
         
     | 
| 
       49 
49 
     | 
    
         
             
            __email__      = "code@vkbo.net"
         
     | 
| 
       50 
     | 
    
         
            -
            __version__    = "2. 
     | 
| 
       51 
     | 
    
         
            -
            __hexversion__ = " 
     | 
| 
       52 
     | 
    
         
            -
            __date__       = "2024- 
     | 
| 
      
 50 
     | 
    
         
            +
            __version__    = "2.6b1"
         
     | 
| 
      
 51 
     | 
    
         
            +
            __hexversion__ = "0x020600b1"
         
     | 
| 
      
 52 
     | 
    
         
            +
            __date__       = "2024-11-12"
         
     | 
| 
       53 
53 
     | 
    
         
             
            __status__     = "Stable"
         
     | 
| 
       54 
54 
     | 
    
         
             
            __domain__     = "novelwriter.io"
         
     | 
| 
       55 
55 
     | 
    
         | 
| 
         @@ -0,0 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <?xml version="1.0" encoding="UTF-8"?>
         
     | 
| 
      
 2 
     | 
    
         
            +
            <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
         
     | 
| 
      
 3 
     | 
    
         
            +
             <path d="m7.8824 2c-1.2988 0-2.3529 1.0541-2.3529 2.3529v2.3529h-1.1765c-1.2988 0-2.3529 1.0541-2.3529 2.3529v10.588c0 1.2988 1.0541 2.3529 2.3529 2.3529h10.588c1.2988 0 2.3529-1.0541 2.3529-2.3529v-1.1765h2.3529c1.2988 0 2.3529-1.0541 2.3529-2.3529v-11.765c0-1.2988-1.0541-2.3529-2.3529-2.3529zm0 2.3529h11.765v11.765h-2.3529v-7.0588c0-1.2988-1.0541-2.3529-2.3529-2.3529h-7.0588zm-3.5294 4.7059h10.588c0.32353 0 0-0.32353 0 0v10.588h-10.588v-9.8943z" fill="#69c" stroke-width="1.1765"/>
         
     | 
| 
      
 4 
     | 
    
         
            +
            </svg>
         
     | 
| 
         @@ -0,0 +1,4 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            <?xml version="1.0" encoding="UTF-8"?>
         
     | 
| 
      
 2 
     | 
    
         
            +
            <svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
         
     | 
| 
      
 3 
     | 
    
         
            +
             <path d="m7.8824 2c-1.2988 0-2.3529 1.0541-2.3529 2.3529v2.3529h-1.1765c-1.2988 0-2.3529 1.0541-2.3529 2.3529v10.588c0 1.2988 1.0541 2.3529 2.3529 2.3529h10.588c1.2988 0 2.3529-1.0541 2.3529-2.3529v-1.1765h2.3529c1.2988 0 2.3529-1.0541 2.3529-2.3529v-11.765c0-1.2988-1.0541-2.3529-2.3529-2.3529zm0 2.3529h11.765v11.765h-2.3529v-7.0588c0-1.2988-1.0541-2.3529-2.3529-2.3529h-7.0588zm-3.5294 4.7059h10.588c0.32353 0 0-0.32353 0 0v10.588h-10.588v-9.8943z" fill="#4271ae" stroke-width="1.1765"/>
         
     | 
| 
      
 4 
     | 
    
         
            +
            </svg>
         
     | 
    
        novelwriter/assets/manual.pdf
    CHANGED
    
    | 
         Binary file 
     | 
    
        novelwriter/assets/sample.zip
    CHANGED
    
    | 
         Binary file 
     | 
    
        novelwriter/common.py
    CHANGED
    
    | 
         @@ -29,6 +29,7 @@ import unicodedata 
     | 
|
| 
       29 
29 
     | 
    
         
             
            import uuid
         
     | 
| 
       30 
30 
     | 
    
         
             
            import xml.etree.ElementTree as ET
         
     | 
| 
       31 
31 
     | 
    
         | 
| 
      
 32 
     | 
    
         
            +
            from collections.abc import Callable
         
     | 
| 
       32 
33 
     | 
    
         
             
            from configparser import ConfigParser
         
     | 
| 
       33 
34 
     | 
    
         
             
            from datetime import datetime
         
     | 
| 
       34 
35 
     | 
    
         
             
            from pathlib import Path
         
     | 
| 
         @@ -204,6 +205,14 @@ def checkIntTuple(value: int, valid: tuple | list | set, default: int) -> int: 
     | 
|
| 
       204 
205 
     | 
    
         
             
                return default
         
     | 
| 
       205 
206 
     | 
    
         | 
| 
       206 
207 
     | 
    
         | 
| 
      
 208 
     | 
    
         
            +
            def firstFloat(*args: Any) -> float:
         
     | 
| 
      
 209 
     | 
    
         
            +
                """Return the first value that is a float."""
         
     | 
| 
      
 210 
     | 
    
         
            +
                for arg in args:
         
     | 
| 
      
 211 
     | 
    
         
            +
                    if isinstance(arg, float):
         
     | 
| 
      
 212 
     | 
    
         
            +
                        return arg
         
     | 
| 
      
 213 
     | 
    
         
            +
                return 0.0
         
     | 
| 
      
 214 
     | 
    
         
            +
             
     | 
| 
      
 215 
     | 
    
         
            +
             
     | 
| 
       207 
216 
     | 
    
         
             
            ##
         
     | 
| 
       208 
217 
     | 
    
         
             
            #  Formatting Functions
         
     | 
| 
       209 
218 
     | 
    
         
             
            ##
         
     | 
| 
         @@ -406,6 +415,10 @@ def numberToRoman(value: int, toLower: bool = False) -> str: 
     | 
|
| 
       406 
415 
     | 
    
         
             
                return roman.lower() if toLower else roman
         
     | 
| 
       407 
416 
     | 
    
         | 
| 
       408 
417 
     | 
    
         | 
| 
      
 418 
     | 
    
         
            +
            ##
         
     | 
| 
      
 419 
     | 
    
         
            +
            #  Qt Helpers
         
     | 
| 
      
 420 
     | 
    
         
            +
            ##
         
     | 
| 
      
 421 
     | 
    
         
            +
             
     | 
| 
       409 
422 
     | 
    
         
             
            def cssCol(col: QColor, alpha: int | None = None) -> str:
         
     | 
| 
       410 
423 
     | 
    
         
             
                """Convert a QColor object to an rgba entry to use in CSS."""
         
     | 
| 
       411 
424 
     | 
    
         
             
                return f"rgba({col.red()}, {col.green()}, {col.blue()}, {alpha or col.alpha()})"
         
     | 
| 
         @@ -421,6 +434,13 @@ def describeFont(font: QFont) -> str: 
     | 
|
| 
       421 
434 
     | 
    
         
             
                return "Error"
         
     | 
| 
       422 
435 
     | 
    
         | 
| 
       423 
436 
     | 
    
         | 
| 
      
 437 
     | 
    
         
            +
            def qtLambda(func: Callable, *args: Any, **kwargs: Any) -> Callable:
         
     | 
| 
      
 438 
     | 
    
         
            +
                """A replacement for Python lambdas that works for Qt slots."""
         
     | 
| 
      
 439 
     | 
    
         
            +
                def wrapper(*a_: Any) -> None:
         
     | 
| 
      
 440 
     | 
    
         
            +
                    func(*args, **kwargs)
         
     | 
| 
      
 441 
     | 
    
         
            +
                return wrapper
         
     | 
| 
      
 442 
     | 
    
         
            +
             
     | 
| 
      
 443 
     | 
    
         
            +
             
     | 
| 
       424 
444 
     | 
    
         
             
            ##
         
     | 
| 
       425 
445 
     | 
    
         
             
            #  Encoder Functions
         
     | 
| 
       426 
446 
     | 
    
         
             
            ##
         
     | 
| 
         @@ -472,6 +492,10 @@ def jsonEncode(data: dict | list | tuple, n: int = 0, nmax: int = 0) -> str: 
     | 
|
| 
       472 
492 
     | 
    
         
             
                return "".join(buffer)
         
     | 
| 
       473 
493 
     | 
    
         | 
| 
       474 
494 
     | 
    
         | 
| 
      
 495 
     | 
    
         
            +
            ##
         
     | 
| 
      
 496 
     | 
    
         
            +
            #  XML Helpers
         
     | 
| 
      
 497 
     | 
    
         
            +
            ##
         
     | 
| 
      
 498 
     | 
    
         
            +
             
     | 
| 
       475 
499 
     | 
    
         
             
            def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
         
     | 
| 
       476 
500 
     | 
    
         
             
                """A modified version of the XML indent function in the standard
         
     | 
| 
       477 
501 
     | 
    
         
             
                library. It behaves more closely to how the one from lxml does.
         
     | 
| 
         @@ -515,6 +539,45 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None: 
     | 
|
| 
       515 
539 
     | 
    
         
             
                return
         
     | 
| 
       516 
540 
     | 
    
         | 
| 
       517 
541 
     | 
    
         | 
| 
      
 542 
     | 
    
         
            +
            def xmlElement(
         
     | 
| 
      
 543 
     | 
    
         
            +
                tag: str,
         
     | 
| 
      
 544 
     | 
    
         
            +
                text: str | int | float | bool | None = None,
         
     | 
| 
      
 545 
     | 
    
         
            +
                *,
         
     | 
| 
      
 546 
     | 
    
         
            +
                attrib: dict | None = None,
         
     | 
| 
      
 547 
     | 
    
         
            +
                tail: str | None = None,
         
     | 
| 
      
 548 
     | 
    
         
            +
            ) -> ET.Element:
         
     | 
| 
      
 549 
     | 
    
         
            +
                """A custom implementation of Element with more arguments."""
         
     | 
| 
      
 550 
     | 
    
         
            +
                xSub = ET.Element(tag, attrib=attrib or {})
         
     | 
| 
      
 551 
     | 
    
         
            +
                if text is not None:
         
     | 
| 
      
 552 
     | 
    
         
            +
                    if isinstance(text, bool):
         
     | 
| 
      
 553 
     | 
    
         
            +
                        xSub.text = str(text).lower()
         
     | 
| 
      
 554 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 555 
     | 
    
         
            +
                        xSub.text = str(text)
         
     | 
| 
      
 556 
     | 
    
         
            +
                if tail is not None:
         
     | 
| 
      
 557 
     | 
    
         
            +
                    xSub.tail = tail
         
     | 
| 
      
 558 
     | 
    
         
            +
                return xSub
         
     | 
| 
      
 559 
     | 
    
         
            +
             
     | 
| 
      
 560 
     | 
    
         
            +
             
     | 
| 
      
 561 
     | 
    
         
            +
            def xmlSubElem(
         
     | 
| 
      
 562 
     | 
    
         
            +
                parent: ET.Element,
         
     | 
| 
      
 563 
     | 
    
         
            +
                tag: str,
         
     | 
| 
      
 564 
     | 
    
         
            +
                text: str | int | float | bool | None = None,
         
     | 
| 
      
 565 
     | 
    
         
            +
                *,
         
     | 
| 
      
 566 
     | 
    
         
            +
                attrib: dict | None = None,
         
     | 
| 
      
 567 
     | 
    
         
            +
                tail: str | None = None,
         
     | 
| 
      
 568 
     | 
    
         
            +
            ) -> ET.Element:
         
     | 
| 
      
 569 
     | 
    
         
            +
                """A custom implementation of SubElement with more arguments."""
         
     | 
| 
      
 570 
     | 
    
         
            +
                xSub = ET.SubElement(parent, tag, attrib=attrib or {})
         
     | 
| 
      
 571 
     | 
    
         
            +
                if text is not None:
         
     | 
| 
      
 572 
     | 
    
         
            +
                    if isinstance(text, bool):
         
     | 
| 
      
 573 
     | 
    
         
            +
                        xSub.text = str(text).lower()
         
     | 
| 
      
 574 
     | 
    
         
            +
                    else:
         
     | 
| 
      
 575 
     | 
    
         
            +
                        xSub.text = str(text)
         
     | 
| 
      
 576 
     | 
    
         
            +
                if tail is not None:
         
     | 
| 
      
 577 
     | 
    
         
            +
                    xSub.tail = tail
         
     | 
| 
      
 578 
     | 
    
         
            +
                return xSub
         
     | 
| 
      
 579 
     | 
    
         
            +
             
     | 
| 
      
 580 
     | 
    
         
            +
             
     | 
| 
       518 
581 
     | 
    
         
             
            ##
         
     | 
| 
       519 
582 
     | 
    
         
             
            #  File and File System Functions
         
     | 
| 
       520 
583 
     | 
    
         
             
            ##
         
     | 
    
        novelwriter/config.py
    CHANGED
    
    | 
         @@ -161,8 +161,9 @@ class Config: 
     | 
|
| 
       161 
161 
     | 
    
         | 
| 
       162 
162 
     | 
    
         
             
                    self.dialogStyle     = 2        # Quote type to use for dialogue
         
     | 
| 
       163 
163 
     | 
    
         
             
                    self.allowOpenDial   = True     # Allow open-ended dialogue quotes
         
     | 
| 
       164 
     | 
    
         
            -
                    self.narratorBreak   = ""       # Symbol to use for narrator break
         
     | 
| 
       165 
164 
     | 
    
         
             
                    self.dialogLine      = ""       # Symbol to use for dialogue line
         
     | 
| 
      
 165 
     | 
    
         
            +
                    self.narratorBreak   = ""       # Symbol to use for narrator break
         
     | 
| 
      
 166 
     | 
    
         
            +
                    self.narratorDialog  = ""       # Symbol for alternating between dialogue and narrator
         
     | 
| 
       166 
167 
     | 
    
         
             
                    self.altDialogOpen   = ""       # Alternative dialog symbol, open
         
     | 
| 
       167 
168 
     | 
    
         
             
                    self.altDialogClose  = ""       # Alternative dialog symbol, close
         
     | 
| 
       168 
169 
     | 
    
         
             
                    self.highlightEmph   = True     # Add colour to text emphasis
         
     | 
| 
         @@ -252,6 +253,10 @@ class Config: 
     | 
|
| 
       252 
253 
     | 
    
         
             
                def hasError(self) -> bool:
         
     | 
| 
       253 
254 
     | 
    
         
             
                    return self._hasError
         
     | 
| 
       254 
255 
     | 
    
         | 
| 
      
 256 
     | 
    
         
            +
                @property
         
     | 
| 
      
 257 
     | 
    
         
            +
                def locale(self) -> QLocale:
         
     | 
| 
      
 258 
     | 
    
         
            +
                    return self._dLocale
         
     | 
| 
      
 259 
     | 
    
         
            +
             
     | 
| 
       255 
260 
     | 
    
         
             
                @property
         
     | 
| 
       256 
261 
     | 
    
         
             
                def recentProjects(self) -> RecentProjects:
         
     | 
| 
       257 
262 
     | 
    
         
             
                    return self._recentProjects
         
     | 
| 
         @@ -653,10 +658,11 @@ class Config: 
     | 
|
| 
       653 
658 
     | 
    
         
             
                    self.showFullPath    = conf.rdBool(sec, "showfullpath", self.showFullPath)
         
     | 
| 
       654 
659 
     | 
    
         
             
                    self.dialogStyle     = conf.rdInt(sec, "dialogstyle", self.dialogStyle)
         
     | 
| 
       655 
660 
     | 
    
         
             
                    self.allowOpenDial   = conf.rdBool(sec, "allowopendial", self.allowOpenDial)
         
     | 
| 
      
 661 
     | 
    
         
            +
                    self.dialogLine      = conf.rdStr(sec, "dialogline", self.dialogLine)
         
     | 
| 
       656 
662 
     | 
    
         
             
                    self.narratorBreak   = conf.rdStr(sec, "narratorbreak", self.narratorBreak)
         
     | 
| 
      
 663 
     | 
    
         
            +
                    self.narratorDialog  = conf.rdStr(sec, "narratordialog", self.narratorDialog)
         
     | 
| 
       657 
664 
     | 
    
         
             
                    self.altDialogOpen   = conf.rdStr(sec, "altdialogopen", self.altDialogOpen)
         
     | 
| 
       658 
665 
     | 
    
         
             
                    self.altDialogClose  = conf.rdStr(sec, "altdialogclose", self.altDialogClose)
         
     | 
| 
       659 
     | 
    
         
            -
                    self.dialogLine      = conf.rdStr(sec, "dialogline", self.dialogLine)
         
     | 
| 
       660 
666 
     | 
    
         
             
                    self.highlightEmph   = conf.rdBool(sec, "highlightemph", self.highlightEmph)
         
     | 
| 
       661 
667 
     | 
    
         
             
                    self.stopWhenIdle    = conf.rdBool(sec, "stopwhenidle", self.stopWhenIdle)
         
     | 
| 
       662 
668 
     | 
    
         
             
                    self.userIdleTime    = conf.rdInt(sec, "useridletime", self.userIdleTime)
         
     | 
| 
         @@ -762,10 +768,11 @@ class Config: 
     | 
|
| 
       762 
768 
     | 
    
         
             
                        "showfullpath":    str(self.showFullPath),
         
     | 
| 
       763 
769 
     | 
    
         
             
                        "dialogstyle":     str(self.dialogStyle),
         
     | 
| 
       764 
770 
     | 
    
         
             
                        "allowopendial":   str(self.allowOpenDial),
         
     | 
| 
      
 771 
     | 
    
         
            +
                        "dialogline":      str(self.dialogLine),
         
     | 
| 
       765 
772 
     | 
    
         
             
                        "narratorbreak":   str(self.narratorBreak),
         
     | 
| 
      
 773 
     | 
    
         
            +
                        "narratordialog":  str(self.narratorDialog),
         
     | 
| 
       766 
774 
     | 
    
         
             
                        "altdialogopen":   str(self.altDialogOpen),
         
     | 
| 
       767 
775 
     | 
    
         
             
                        "altdialogclose":  str(self.altDialogClose),
         
     | 
| 
       768 
     | 
    
         
            -
                        "dialogline":      str(self.dialogLine),
         
     | 
| 
       769 
776 
     | 
    
         
             
                        "highlightemph":   str(self.highlightEmph),
         
     | 
| 
       770 
777 
     | 
    
         
             
                        "stopwhenidle":    str(self.stopWhenIdle),
         
     | 
| 
       771 
778 
     | 
    
         
             
                        "useridletime":    str(self.userIdleTime),
         
     |