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.
Files changed (64) hide show
  1. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/METADATA +2 -1
  2. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/RECORD +61 -56
  3. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/WHEEL +1 -1
  4. novelwriter/__init__.py +3 -3
  5. novelwriter/assets/i18n/project_en_GB.json +1 -0
  6. novelwriter/assets/icons/typicons_dark/icons.conf +1 -0
  7. novelwriter/assets/icons/typicons_dark/mixed_copy.svg +4 -0
  8. novelwriter/assets/icons/typicons_light/icons.conf +1 -0
  9. novelwriter/assets/icons/typicons_light/mixed_copy.svg +4 -0
  10. novelwriter/assets/manual.pdf +0 -0
  11. novelwriter/assets/sample.zip +0 -0
  12. novelwriter/assets/themes/default_light.conf +2 -2
  13. novelwriter/common.py +63 -0
  14. novelwriter/config.py +10 -3
  15. novelwriter/constants.py +153 -60
  16. novelwriter/core/buildsettings.py +66 -39
  17. novelwriter/core/coretools.py +34 -22
  18. novelwriter/core/docbuild.py +130 -169
  19. novelwriter/core/index.py +29 -18
  20. novelwriter/core/item.py +2 -2
  21. novelwriter/core/options.py +4 -1
  22. novelwriter/core/spellcheck.py +9 -14
  23. novelwriter/dialogs/preferences.py +45 -32
  24. novelwriter/dialogs/projectsettings.py +3 -3
  25. novelwriter/enum.py +29 -23
  26. novelwriter/extensions/configlayout.py +24 -11
  27. novelwriter/extensions/modified.py +13 -1
  28. novelwriter/extensions/pagedsidebar.py +5 -5
  29. novelwriter/formats/shared.py +155 -0
  30. novelwriter/formats/todocx.py +1195 -0
  31. novelwriter/formats/tohtml.py +452 -0
  32. novelwriter/{core → formats}/tokenizer.py +483 -485
  33. novelwriter/formats/tomarkdown.py +217 -0
  34. novelwriter/{core → formats}/toodt.py +270 -320
  35. novelwriter/formats/toqdoc.py +436 -0
  36. novelwriter/formats/toraw.py +91 -0
  37. novelwriter/gui/doceditor.py +240 -193
  38. novelwriter/gui/dochighlight.py +96 -84
  39. novelwriter/gui/docviewer.py +56 -30
  40. novelwriter/gui/docviewerpanel.py +3 -3
  41. novelwriter/gui/editordocument.py +17 -2
  42. novelwriter/gui/itemdetails.py +8 -4
  43. novelwriter/gui/mainmenu.py +121 -60
  44. novelwriter/gui/noveltree.py +35 -37
  45. novelwriter/gui/outline.py +186 -238
  46. novelwriter/gui/projtree.py +142 -131
  47. novelwriter/gui/sidebar.py +7 -6
  48. novelwriter/gui/theme.py +5 -4
  49. novelwriter/guimain.py +43 -155
  50. novelwriter/shared.py +14 -4
  51. novelwriter/text/counting.py +2 -0
  52. novelwriter/text/patterns.py +155 -59
  53. novelwriter/tools/manusbuild.py +1 -1
  54. novelwriter/tools/manuscript.py +121 -78
  55. novelwriter/tools/manussettings.py +403 -260
  56. novelwriter/tools/welcome.py +4 -4
  57. novelwriter/tools/writingstats.py +3 -3
  58. novelwriter/types.py +16 -6
  59. novelwriter/core/tohtml.py +0 -530
  60. novelwriter/core/tomarkdown.py +0 -252
  61. novelwriter/core/toqdoc.py +0 -419
  62. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/LICENSE.md +0 -0
  63. {novelWriter-2.5.1.dist-info → novelWriter-2.6b1.dist-info}/entry_points.txt +0 -0
  64. {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.5.1
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=vYFXHDZoxu12zt7mAW1DuW9_JOAzTnBbagm6dSEa9Ok,7552
2
- novelwriter/common.py,sha256=qg7jqTVqLOk4zlhKkFoLgYfBdtrBweZYkZeNn7OXX5k,18494
3
- novelwriter/config.py,sha256=cUL4S-JOKhxEes--NxCiV84NpanvVbcbW_K5v74dS3w,39081
4
- novelwriter/constants.py,sha256=y-UjNZxtU2lzn0Ji9lKiNU3233RmoJuK-3JWHT6GIvc,21368
5
- novelwriter/enum.py,sha256=c1IS9rmpWMtqnMzftpWoQFtfRqcK9VMTO0vbMsf7pLM,3501
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=i3qIrDKlwsaF0BgaTzldHWPOozs1wYpmvwQTVro06_c,53662
8
- novelwriter/shared.py,sha256=LMgMXZK28LJUnRDbcTqTp4ZDVCKBt3EJYZMnIdu4R18,15906
9
- novelwriter/types.py,sha256=tV-XFc10wsk7zH__S2dEuEfidI6_adgOetpAVbnmJmI,4691
10
- novelwriter/assets/manual.pdf,sha256=yuVhyRjEjBMV21AX75Y7-e2pDEwXoBBcK2F19JD9B2c,2723685
11
- novelwriter/assets/sample.zip,sha256=esBK85OoJRv4odOE6QFuQqV1qfPVMT_6J39gaW2Q4ns,27805
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=7c9W2YJAELCSwx4zN_2qYZ3xsGncinCrGNhaj_FVkxk,2511
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=9sQ88muSh0xjI7_xYBcgjR5Kh2qRf_DVvlKemDkQCp0,4492
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=TnqiHJ4CnvKqT4_5BPmsqJdTUKtDswlwL8c2xjYNLlw,4495
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=zNjrtkRs2hLEcefFt3uys2-tei3Lxdth-yThO9InNz4,992
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=cx-yjeja6VeYUdVZwNhLr6Ka_EXT8xCTwzQtv1Cmrec,22689
273
- novelwriter/core/coretools.py,sha256=mItCKIHMMu1zrW3q2-FhF_lVfzjOKhbPtTEaXLt6U-o,21048
274
- novelwriter/core/docbuild.py,sha256=h1jCFgkzyuoDgusjvuctBQpyDdNWBCHL2CNwQN0aEeM,14236
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=soGv-bDdAHk77ubqr1OfftGtyB1aJAJNODyfOq2nZm8,48450
277
- novelwriter/core/item.py,sha256=0p_o3eCf8ZK30MiUR1rd1fDXb63lqNB4lHZeLMA6Wys,17635
278
- novelwriter/core/options.py,sha256=8yAQoTkDhTCZY7EGg29Fq7Lj4n4Hd2i-Kx7TlgnausM,7372
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=MwkRPp3MJa2X-6yRWX6Rc-sq2vLsbLnjNnyUpAbRFiE,7176
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=HSH8JrJUi3r_bBiTkkLtLUbsCIZpMI3LECOWDHpqhMU,38050
297
- novelwriter/dialogs/projectsettings.py,sha256=EfMcfCDGn59XuzkJGuuKhS9UFdYTNIxTJPEiQB71zGg,27525
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=rQfK0kAwSZn30WEtqJKP8RoNWOjVP4C3gYTAXXkm5u0,10443
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=kXntkvw1ZWeRxseZyA444bV3O9RbmbErtaDDafu0DwY,5756
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=Brgl_d8KXnWWJov-sTkj9tMQu7Xrz8v7rXcnvpAaRK8,7232
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/gui/doceditor.py,sha256=Cv9_sMKpSozKrIPusvcLDzlgD6rr8JxDHkzIoApOfMc,113720
311
- novelwriter/gui/dochighlight.py,sha256=4JNWQkfaEc0p-EvRRkbBWwQdrFqVotgremzu2WWw9hA,19463
312
- novelwriter/gui/docviewer.py,sha256=DzCyIwJusRAF8Uw93pAQEgk8PJ6H_yaH9TGFzPmcie8,32280
313
- novelwriter/gui/docviewerpanel.py,sha256=CCCzSc-Ol5jCmoEfpZ-RD-tcwzkyM7g_iBSQNeljGgE,20040
314
- novelwriter/gui/editordocument.py,sha256=5_v-gwZ9-CwJHGs7lFUGdY3paR7F1PW2FjD6_fbq5wY,4087
315
- novelwriter/gui/itemdetails.py,sha256=0U3hghK4Vue3AwtLBRY6YJMN3vOCjatvvzXhJDn4UXo,9688
316
- novelwriter/gui/mainmenu.py,sha256=PaJjO38DQ72UL9hMyvSbh2I1daxOZBSbJhNsov771fw,38908
317
- novelwriter/gui/noveltree.py,sha256=rAU_f6efrt5uAsew6jGqo3X3E3ggrZaoQh2prm13wD8,27635
318
- novelwriter/gui/outline.py,sha256=Id6hSEe1iLls6qPckX-b3U21rPOOndlfe7r4VsNC3G8,42312
319
- novelwriter/gui/projtree.py,sha256=iMsMf8IcaV3Dvsbx3thWvWffHFqM5kTWP2AC69Fsvg0,78027
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=jBkOinx69lwt4m1GovQ7nF44lF-g_SOk3yTT96KlbFY,6212
326
+ novelwriter/gui/sidebar.py,sha256=Yl86aZSVXDlbo6xXkolr8LlnoNKImKf8CrrlI3o7c9I,6261
322
327
  novelwriter/gui/statusbar.py,sha256=-rF6bIJXGKFRswVKWE1c5In5x3sX4iXMfp0AGxZxt0c,9053
323
- novelwriter/gui/theme.py,sha256=M1ZbEKAZcU-INROiYyanUsDFNHcAZurArpEDvmg8870,31974
324
- novelwriter/text/counting.py,sha256=tkWKWS_scPYmBG8xLpIL1KLIjyF2HOlkrloQa5PZmDc,4304
325
- novelwriter/text/patterns.py,sha256=sEBPf9buLtJvYeoYquZzDcSC6gfKBHIUPGbD31y5H-g,3843
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=c3NdpkAqUPTKN2BpGX_xleFtZPi1G8uv80XBZEp27Bw,14071
329
- novelwriter/tools/manuscript.py,sha256=77BaTqfytdrqgUxnCLUUVPxx1wScu289xfyBhcHGX-M,37955
330
- novelwriter/tools/manussettings.py,sha256=Uz7QpCb2l_SftpQ5N7x0qHdq41-6fvTRHv7bxWvDLWg,56145
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=KLSlBTih_HOTJ3nmyv4IU4ec8XNJDL5AwXMZ6amqmIw,28027
333
- novelwriter/tools/writingstats.py,sha256=f5nbmE5V9VsQ8qi_DlvfF5yVIupEbVDavtuMbTzU7IA,22753
334
- novelWriter-2.5.1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
335
- novelWriter-2.5.1.dist-info/METADATA,sha256=3Q60pUI0VndtXaFOSOuyw1dqmgz0xEZOfD16QGub_SQ,2532
336
- novelWriter-2.5.1.dist-info/WHEEL,sha256=Wyh-_nZ0DJYolHNn1_hMa4lM7uDedD_RGVwbmTjyItk,91
337
- novelWriter-2.5.1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
338
- novelWriter-2.5.1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
339
- novelWriter-2.5.1.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (75.4.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
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.5.1"
51
- __hexversion__ = "0x020501f0"
52
- __date__ = "2024-07-28"
50
+ __version__ = "2.6b1"
51
+ __hexversion__ = "0x020600b1"
52
+ __date__ = "2024-11-12"
53
53
  __status__ = "Stable"
54
54
  __domain__ = "novelwriter.io"
55
55
 
@@ -14,6 +14,7 @@
14
14
  "Objects": "Objects",
15
15
  "Entities": "Entities",
16
16
  "Custom": "Custom",
17
+ "New Page": "New Page",
17
18
  "0": "Zero",
18
19
  "1": "One",
19
20
  "2": "Two",
@@ -44,6 +44,7 @@ cls_template = mixed_document-new.svg
44
44
  cls_timeline = typ_calendar.svg
45
45
  cls_trash = typ_trash.svg
46
46
  cls_world = typ_location.svg
47
+ copy = mixed_copy.svg
47
48
  cross = typ_times.svg
48
49
  document = typ_document.svg
49
50
  down = typ_chevron-down.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="#69c" stroke-width="1.1765"/>
4
+ </svg>
@@ -44,6 +44,7 @@ cls_template = mixed_document-new.svg
44
44
  cls_timeline = typ_calendar.svg
45
45
  cls_trash = typ_trash.svg
46
46
  cls_world = typ_location.svg
47
+ copy = mixed_copy.svg
47
48
  cross = typ_times.svg
48
49
  document = typ_document.svg
49
50
  down = typ_chevron-down.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>
Binary file
Binary file
@@ -29,5 +29,5 @@ helptext = 92, 92, 92
29
29
  fadedtext = 108, 108, 108
30
30
  errortext = 255, 92, 92
31
31
  statusnone = 120, 120, 120
32
- statussaved = 200, 15, 39
33
- statusunsaved = 2, 133, 37
32
+ statussaved = 2, 133, 37
33
+ statusunsaved = 200, 15, 39
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),