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),
|