novelWriter 2.5b1__py3-none-any.whl → 2.5rc1__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.5b1.dist-info → novelWriter-2.5rc1.dist-info}/METADATA +1 -1
- {novelWriter-2.5b1.dist-info → novelWriter-2.5rc1.dist-info}/RECORD +61 -61
- {novelWriter-2.5b1.dist-info → novelWriter-2.5rc1.dist-info}/WHEEL +1 -1
- novelwriter/__init__.py +3 -3
- novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
- novelwriter/assets/i18n/project_pt_BR.json +74 -74
- novelwriter/assets/manual.pdf +0 -0
- novelwriter/assets/sample.zip +0 -0
- novelwriter/assets/themes/cyberpunk_night.conf +1 -0
- novelwriter/assets/themes/default_dark.conf +1 -0
- novelwriter/assets/themes/default_light.conf +1 -0
- novelwriter/assets/themes/dracula.conf +1 -0
- novelwriter/assets/themes/solarized_dark.conf +1 -0
- novelwriter/assets/themes/solarized_light.conf +1 -0
- novelwriter/common.py +2 -3
- novelwriter/config.py +67 -15
- novelwriter/constants.py +8 -10
- novelwriter/core/buildsettings.py +5 -3
- novelwriter/core/coretools.py +3 -1
- novelwriter/core/docbuild.py +1 -0
- novelwriter/core/tohtml.py +69 -29
- novelwriter/core/tokenizer.py +83 -14
- novelwriter/core/toodt.py +48 -21
- novelwriter/core/toqdoc.py +25 -9
- novelwriter/dialogs/about.py +10 -15
- novelwriter/dialogs/docmerge.py +16 -16
- novelwriter/dialogs/docsplit.py +16 -16
- novelwriter/dialogs/editlabel.py +6 -8
- novelwriter/dialogs/preferences.py +94 -68
- novelwriter/dialogs/projectsettings.py +10 -10
- novelwriter/dialogs/quotes.py +9 -5
- novelwriter/dialogs/wordlist.py +6 -6
- novelwriter/enum.py +4 -5
- novelwriter/extensions/configlayout.py +23 -4
- novelwriter/extensions/modified.py +22 -3
- novelwriter/extensions/{circularprogress.py → progressbars.py} +26 -3
- novelwriter/extensions/statusled.py +28 -22
- novelwriter/gui/doceditor.py +20 -11
- novelwriter/gui/dochighlight.py +30 -39
- novelwriter/gui/docviewer.py +21 -14
- novelwriter/gui/mainmenu.py +11 -11
- novelwriter/gui/outline.py +3 -3
- novelwriter/gui/projtree.py +19 -28
- novelwriter/gui/search.py +10 -1
- novelwriter/gui/statusbar.py +25 -29
- novelwriter/gui/theme.py +3 -0
- novelwriter/guimain.py +91 -84
- novelwriter/shared.py +10 -8
- novelwriter/text/patterns.py +113 -0
- novelwriter/tools/dictionaries.py +2 -8
- novelwriter/tools/lipsum.py +8 -12
- novelwriter/tools/manusbuild.py +9 -9
- novelwriter/tools/manuscript.py +10 -5
- novelwriter/tools/manussettings.py +7 -3
- novelwriter/tools/noveldetails.py +10 -10
- novelwriter/tools/welcome.py +10 -10
- novelwriter/tools/writingstats.py +3 -3
- novelwriter/types.py +5 -2
- novelwriter/extensions/simpleprogress.py +0 -53
- {novelWriter-2.5b1.dist-info → novelWriter-2.5rc1.dist-info}/LICENSE.md +0 -0
- {novelWriter-2.5b1.dist-info → novelWriter-2.5rc1.dist-info}/entry_points.txt +0 -0
- {novelWriter-2.5b1.dist-info → novelWriter-2.5rc1.dist-info}/top_level.txt +0 -0
@@ -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=GYdc7rDpW0764jkkbmX8iziTEnMHeHhcqgH4pHPr5Ng,7553
|
2
|
+
novelwriter/common.py,sha256=sJK-MpM6bnZbhp0D8nRLRqL0HlnogGKDQozRhAZv6FU,18236
|
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
|
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=b6RwIFtLCOFoETmNSnHP2QvaWJ6qRoiBPYLMLBoi8m4,53363
|
8
|
+
novelwriter/shared.py,sha256=PPbEe8S2TRzEvXii8s8U4R0371ACpeMFdKmAkO-On4g,15540
|
9
|
+
novelwriter/types.py,sha256=tV-XFc10wsk7zH__S2dEuEfidI6_adgOetpAVbnmJmI,4691
|
10
|
+
novelwriter/assets/manual.pdf,sha256=SfYdeBc57qUYB84p1HtAZ9gMl08DRdqePCvAzGRHl3M,2692539
|
11
|
+
novelwriter/assets/sample.zip,sha256=bio1FbkHrclw5cJkdgawV-urSO96Qf2eIARB-m60980,27808
|
12
12
|
novelwriter/assets/i18n/nw_de_DE.qm,sha256=PPBpHJ3M0jL0t4xSY8zr3CKaO0umGW4K4Tb7bj0gtlA,97532
|
13
13
|
novelwriter/assets/i18n/nw_en_US.qm,sha256=sZKjLkT2CcPhGAS3WUgKm9XO3ugbBrx2zbwVyhP7vSE,90470
|
14
14
|
novelwriter/assets/i18n/nw_es_419.qm,sha256=8saaQ1As_hOgBI-oyEIqV5KCmLaMg_ldkOT9Q1uJmaY,99857
|
@@ -17,7 +17,7 @@ novelwriter/assets/i18n/nw_it_IT.qm,sha256=mRgsonFCjm6bgG2sldQtMrRDAfqNIpiq9ebp1
|
|
17
17
|
novelwriter/assets/i18n/nw_ja_JP.qm,sha256=kbZKcnRDKralChIDOqsnK8Sn0NdcjlTDf03fOLVPxxY,74895
|
18
18
|
novelwriter/assets/i18n/nw_nb_NO.qm,sha256=cuQLRkvGXIFYsK7a4j1wxKY3H7JQIfjObkVvFbVFt-Q,92928
|
19
19
|
novelwriter/assets/i18n/nw_nl_NL.qm,sha256=4RcFVAWj3PGT4jeivxLEp85HfiSr3FvFCnlmjQRXSRc,96814
|
20
|
-
novelwriter/assets/i18n/nw_pt_BR.qm,sha256=
|
20
|
+
novelwriter/assets/i18n/nw_pt_BR.qm,sha256=JNs3XUrVyq2qNxlwSu4em8J8qUi_Wfp_Wom3JtwXWSE,98636
|
21
21
|
novelwriter/assets/i18n/nw_zh_CN.qm,sha256=3q2cSsY3kT7dRggXq-fj8Sank88V_G2RKzjXQY5-3nA,67445
|
22
22
|
novelwriter/assets/i18n/project_de_DE.json,sha256=85ud9rxRHyXm85QDmW_LKcUE8h0L1Bvukaf5Tjt-wpg,2818
|
23
23
|
novelwriter/assets/i18n/project_en_GB.json,sha256=7c9W2YJAELCSwx4zN_2qYZ3xsGncinCrGNhaj_FVkxk,2511
|
@@ -29,7 +29,7 @@ novelwriter/assets/i18n/project_ja_JP.json,sha256=8P03f2D9o2TlSxFU5ugRa-DJDeDZr_
|
|
29
29
|
novelwriter/assets/i18n/project_nb_NO.json,sha256=e8E9c188KRPJfgZa298hDiaLEuhjHMxbRMaIF8HaVew,2298
|
30
30
|
novelwriter/assets/i18n/project_nl_NL.json,sha256=qUEEjLMRtvt9VuNmjb_qOVCXqUCENHskCEyp5YlPMc4,2683
|
31
31
|
novelwriter/assets/i18n/project_nn_NO.json,sha256=7ZfmtFWHcDMiLVqdOEDHQWHbpoC_bv5ESmf_-CoYiks,2250
|
32
|
-
novelwriter/assets/i18n/project_pt_BR.json,sha256=
|
32
|
+
novelwriter/assets/i18n/project_pt_BR.json,sha256=FDxIeSlf3v8AcrWfgwk7UOMRDmb2hWdDoabsBq5rkL8,2763
|
33
33
|
novelwriter/assets/i18n/project_ru_RU.json,sha256=F4QkD6VVDCtGdil7uoXCmuczvUpe9tv-1L-3Eyc8sKE,3699
|
34
34
|
novelwriter/assets/i18n/project_zh_CN.json,sha256=cfl0TsnbISYUvygOw015y0x0REDG97xR0yjyJ85Jm34,2322
|
35
35
|
novelwriter/assets/icons/none.svg,sha256=NRN9vMzohg7Ner71GwPthrCG0uA81TpY8UmKb8-L-pM,251
|
@@ -260,16 +260,16 @@ novelwriter/assets/syntax/tomorrow_night_bright.conf,sha256=h8_775Ed8hl2XhfCoxAY
|
|
260
260
|
novelwriter/assets/syntax/tomorrow_night_eighties.conf,sha256=stO_xH5RzMN0jaZeYr53LVXbpqSmIXALBFGVLlJBDLA,1557
|
261
261
|
novelwriter/assets/text/credits_en.htm,sha256=FLmgB5HLLWyKPBfJp-_P86cb6s9pOGu7OnIpEYpAJqo,4361
|
262
262
|
novelwriter/assets/text/lipsum.txt,sha256=sGA6AC_p4jrUifxLxy3cSODeRwkpBNXDPGgX6YRTm2s,62937
|
263
|
-
novelwriter/assets/themes/cyberpunk_night.conf,sha256=
|
263
|
+
novelwriter/assets/themes/cyberpunk_night.conf,sha256=FvG_YVfEnMwJV1XUDEdpi9qoHQ5sdyVEaR_Y3WfWNA8,923
|
264
264
|
novelwriter/assets/themes/default.conf,sha256=K0LZ64lODpCtUg3pISTAP4UKvEYMvPkmIYN9RDEaWwk,72
|
265
|
-
novelwriter/assets/themes/default_dark.conf,sha256=
|
266
|
-
novelwriter/assets/themes/default_light.conf,sha256=
|
267
|
-
novelwriter/assets/themes/dracula.conf,sha256=
|
268
|
-
novelwriter/assets/themes/solarized_dark.conf,sha256=
|
269
|
-
novelwriter/assets/themes/solarized_light.conf,sha256=
|
270
|
-
novelwriter/core/buildsettings.py,sha256=
|
271
|
-
novelwriter/core/coretools.py,sha256=
|
272
|
-
novelwriter/core/docbuild.py,sha256=
|
265
|
+
novelwriter/assets/themes/default_dark.conf,sha256=obPCLVOXL1Zp973DbbROldyQOoUPGWlPKLbetZqMZe8,989
|
266
|
+
novelwriter/assets/themes/default_light.conf,sha256=zNjrtkRs2hLEcefFt3uys2-tei3Lxdth-yThO9InNz4,992
|
267
|
+
novelwriter/assets/themes/dracula.conf,sha256=pUvu7FS1nRPj3PyU3NZMR0WSb5sIa0oLpSa2XTzsh98,1425
|
268
|
+
novelwriter/assets/themes/solarized_dark.conf,sha256=7dDjs8aiFuAjl--hqMJQEExrfCgAapiPY82CL6aAo-I,916
|
269
|
+
novelwriter/assets/themes/solarized_light.conf,sha256=psCPVWcjAKB5y8H_E_h5zYUifxh5YpdFdBzxFofIHa0,918
|
270
|
+
novelwriter/core/buildsettings.py,sha256=cx-yjeja6VeYUdVZwNhLr6Ka_EXT8xCTwzQtv1Cmrec,22689
|
271
|
+
novelwriter/core/coretools.py,sha256=mItCKIHMMu1zrW3q2-FhF_lVfzjOKhbPtTEaXLt6U-o,21048
|
272
|
+
novelwriter/core/docbuild.py,sha256=h1jCFgkzyuoDgusjvuctBQpyDdNWBCHL2CNwQN0aEeM,14236
|
273
273
|
novelwriter/core/document.py,sha256=T8FlxyEMlR3t2HNE92InseWUMylWFTMnr2fP-Ge5LQc,12130
|
274
274
|
novelwriter/core/index.py,sha256=soGv-bDdAHk77ubqr1OfftGtyB1aJAJNODyfOq2nZm8,48450
|
275
275
|
novelwriter/core/item.py,sha256=0p_o3eCf8ZK30MiUR1rd1fDXb63lqNB4lHZeLMA6Wys,17635
|
@@ -281,57 +281,57 @@ novelwriter/core/sessions.py,sha256=V9eBXaUMcXTZjYXR5dgi6E14COIlcLIkNwS6pDrn75U,
|
|
281
281
|
novelwriter/core/spellcheck.py,sha256=MwkRPp3MJa2X-6yRWX6Rc-sq2vLsbLnjNnyUpAbRFiE,7176
|
282
282
|
novelwriter/core/status.py,sha256=pxW43PfS8rRjsNe3N406YSMOzSxOLCV5YrPH0Tw7YqQ,11498
|
283
283
|
novelwriter/core/storage.py,sha256=cu3V1YzdUJECW_QEXj9F2991ZKfYJHbCVynmPmMmLn8,20775
|
284
|
-
novelwriter/core/tohtml.py,sha256=
|
285
|
-
novelwriter/core/tokenizer.py,sha256=
|
284
|
+
novelwriter/core/tohtml.py,sha256=NxM4c52q2ZFNW-XdHOI9L5lqTSiw9J5KZAELhdmN_9I,19211
|
285
|
+
novelwriter/core/tokenizer.py,sha256=6aUIdbF_u2nXEJn7YY5tpIVISXlvy-Y_w6T07on9t2I,47631
|
286
286
|
novelwriter/core/tomarkdown.py,sha256=sZG64PLyTjDuIxnPQVMdcMSF-obsp4C06B1dUKhlbHU,7925
|
287
|
-
novelwriter/core/toodt.py,sha256=
|
288
|
-
novelwriter/core/toqdoc.py,sha256
|
287
|
+
novelwriter/core/toodt.py,sha256=Hrb6FJkwf2wwcKE6f7lw5o0PZqKsf1TWqvJbrJWrijU,62529
|
288
|
+
novelwriter/core/toqdoc.py,sha256=tt34SuQ6phh-8huOJfbwt4Velkq9lo6z2LJUVeze1W4,15537
|
289
289
|
novelwriter/core/tree.py,sha256=mmOB7kN0tjWda_AdT1WuZyFrewuc6uRAlqCfX6opwek,18681
|
290
|
-
novelwriter/dialogs/about.py,sha256=
|
291
|
-
novelwriter/dialogs/docmerge.py,sha256=
|
292
|
-
novelwriter/dialogs/docsplit.py,sha256=
|
293
|
-
novelwriter/dialogs/editlabel.py,sha256=
|
294
|
-
novelwriter/dialogs/preferences.py,sha256=
|
295
|
-
novelwriter/dialogs/projectsettings.py,sha256=
|
296
|
-
novelwriter/dialogs/quotes.py,sha256=
|
297
|
-
novelwriter/dialogs/wordlist.py,sha256=
|
298
|
-
novelwriter/extensions/
|
299
|
-
novelwriter/extensions/configlayout.py,sha256=_ihrLuwjqd0ZtuuKJjKpqzk7tuDX7o4y26cDPyAHkl8,9438
|
290
|
+
novelwriter/dialogs/about.py,sha256=0iBYkifACc5vZj4KwG0G2Dll_Wp4acAHUfNTto74MFU,4755
|
291
|
+
novelwriter/dialogs/docmerge.py,sha256=HtJvmu56CGb_G27XGRgF3kl0jPR_14SBVsOKv_UyVX8,6286
|
292
|
+
novelwriter/dialogs/docsplit.py,sha256=nPb7U68vtZ5yuJtUIr-2yTWCfADCtK4T1h7LgL0Hx8c,9281
|
293
|
+
novelwriter/dialogs/editlabel.py,sha256=cs8ztrK1Gi3lEZozvs978dNAR6rnlV8cWr9dZArD51I,2963
|
294
|
+
novelwriter/dialogs/preferences.py,sha256=yC2m-eLAo9p0a8b0ffxOolL9-AHF58EtlkSTYEMOUMg,38490
|
295
|
+
novelwriter/dialogs/projectsettings.py,sha256=hyRuOYk0FLPkZm8F8e-tx6-1dMRmp3PV8GZYojYpIlc,27635
|
296
|
+
novelwriter/dialogs/quotes.py,sha256=JCgoz9I8HepxYYVBXOzQac6aFpzNMF4CRdw4CnAnuNM,4727
|
297
|
+
novelwriter/dialogs/wordlist.py,sha256=yuQebLRuasVk2QUm2zWGn7ZzuWM4lFGyXz0egQPyILw,8511
|
298
|
+
novelwriter/extensions/configlayout.py,sha256=fHZb8xCCahzQRuP2Y0a36W8i9W1CfgmvBKyh_YKrtf4,9982
|
300
299
|
novelwriter/extensions/eventfilters.py,sha256=mTU_sMQPOEocRfvLcwQyXUpkm314tH32WsID61ss1CI,2522
|
301
|
-
novelwriter/extensions/modified.py,sha256=
|
300
|
+
novelwriter/extensions/modified.py,sha256=kXntkvw1ZWeRxseZyA444bV3O9RbmbErtaDDafu0DwY,5756
|
302
301
|
novelwriter/extensions/novelselector.py,sha256=etVtoDkHGJIP4ab__vStJQCREKYt5sWLfK1vyuO3hLI,3794
|
303
302
|
novelwriter/extensions/pagedsidebar.py,sha256=Brgl_d8KXnWWJov-sTkj9tMQu7Xrz8v7rXcnvpAaRK8,7232
|
304
|
-
novelwriter/extensions/
|
305
|
-
novelwriter/extensions/statusled.py,sha256=
|
303
|
+
novelwriter/extensions/progressbars.py,sha256=BpJHycboSNGYWIfAEMqIy1Qxf32Cg8TeWM3hogzakTs,4628
|
304
|
+
novelwriter/extensions/statusled.py,sha256=omaAm_-wpQr7Hw65rlJYWX3mvI0TBx1rpQDWk_3e6rI,2690
|
306
305
|
novelwriter/extensions/switch.py,sha256=4kXJ3EHEhaivj1D69iBi46hkkPBGAt-Rt5EjVK3V4Aw,4299
|
307
306
|
novelwriter/extensions/switchbox.py,sha256=5tCiFWkT9WF9xh2c__BnNAJHFLw2nRso3fJZfwzDqRE,4198
|
308
307
|
novelwriter/extensions/versioninfo.py,sha256=R2_U6B678be0WNxbnhUntpxR5PnZVGf6eeyENp-S-Xo,5035
|
309
|
-
novelwriter/gui/doceditor.py,sha256=
|
310
|
-
novelwriter/gui/dochighlight.py,sha256=
|
311
|
-
novelwriter/gui/docviewer.py,sha256=
|
308
|
+
novelwriter/gui/doceditor.py,sha256=_V_hbCnNZJ9LbPsktPWl64uAoOPixBbsZF1xabPQdfs,113640
|
309
|
+
novelwriter/gui/dochighlight.py,sha256=4JNWQkfaEc0p-EvRRkbBWwQdrFqVotgremzu2WWw9hA,19463
|
310
|
+
novelwriter/gui/docviewer.py,sha256=iNjjj-1YXXbHySTo94NDvdyTfzV_OJtNOjF4J7qWXvU,32198
|
312
311
|
novelwriter/gui/docviewerpanel.py,sha256=Bh-WT2iSBqhMSxBgWKqNjJ2Erx_Y4BzsXLY_2RkMbMw,19852
|
313
312
|
novelwriter/gui/editordocument.py,sha256=5_v-gwZ9-CwJHGs7lFUGdY3paR7F1PW2FjD6_fbq5wY,4087
|
314
313
|
novelwriter/gui/itemdetails.py,sha256=0U3hghK4Vue3AwtLBRY6YJMN3vOCjatvvzXhJDn4UXo,9688
|
315
|
-
novelwriter/gui/mainmenu.py,sha256=
|
314
|
+
novelwriter/gui/mainmenu.py,sha256=PaJjO38DQ72UL9hMyvSbh2I1daxOZBSbJhNsov771fw,38908
|
316
315
|
novelwriter/gui/noveltree.py,sha256=rAU_f6efrt5uAsew6jGqo3X3E3ggrZaoQh2prm13wD8,27635
|
317
|
-
novelwriter/gui/outline.py,sha256=
|
318
|
-
novelwriter/gui/projtree.py,sha256=
|
319
|
-
novelwriter/gui/search.py,sha256=
|
316
|
+
novelwriter/gui/outline.py,sha256=hAS6DCPhQtAUrIP4a2qBFa-Rm1fYDS-ijqnEZ2UIbic,42231
|
317
|
+
novelwriter/gui/projtree.py,sha256=PUw0NcRqGHpYm1WTqUHflSSekigNJrqEs-Un0oCbGH0,77270
|
318
|
+
novelwriter/gui/search.py,sha256=HnS0_vOg15f3woXeZ8MS_ZAblx9aFIuN7BSa195tY1M,13262
|
320
319
|
novelwriter/gui/sidebar.py,sha256=jBkOinx69lwt4m1GovQ7nF44lF-g_SOk3yTT96KlbFY,6212
|
321
|
-
novelwriter/gui/statusbar.py,sha256
|
322
|
-
novelwriter/gui/theme.py,sha256=
|
320
|
+
novelwriter/gui/statusbar.py,sha256=-rF6bIJXGKFRswVKWE1c5In5x3sX4iXMfp0AGxZxt0c,9053
|
321
|
+
novelwriter/gui/theme.py,sha256=M1ZbEKAZcU-INROiYyanUsDFNHcAZurArpEDvmg8870,31974
|
323
322
|
novelwriter/text/counting.py,sha256=tkWKWS_scPYmBG8xLpIL1KLIjyF2HOlkrloQa5PZmDc,4304
|
324
|
-
novelwriter/
|
325
|
-
novelwriter/tools/
|
326
|
-
novelwriter/tools/
|
327
|
-
novelwriter/tools/
|
328
|
-
novelwriter/tools/
|
329
|
-
novelwriter/tools/
|
330
|
-
novelwriter/tools/
|
331
|
-
novelwriter/tools/
|
332
|
-
|
333
|
-
novelWriter-2.
|
334
|
-
novelWriter-2.
|
335
|
-
novelWriter-2.
|
336
|
-
novelWriter-2.
|
337
|
-
novelWriter-2.
|
323
|
+
novelwriter/text/patterns.py,sha256=sEBPf9buLtJvYeoYquZzDcSC6gfKBHIUPGbD31y5H-g,3843
|
324
|
+
novelwriter/tools/dictionaries.py,sha256=92GNCSEOK1EI7t2DiayT8p7nzKW7LwxJJz98F6kn3Vg,9243
|
325
|
+
novelwriter/tools/lipsum.py,sha256=NcmoxWzrbEybh_w1FzxuxHmeTr8N03OrxjxsPWEbae4,4794
|
326
|
+
novelwriter/tools/manusbuild.py,sha256=c3NdpkAqUPTKN2BpGX_xleFtZPi1G8uv80XBZEp27Bw,14071
|
327
|
+
novelwriter/tools/manuscript.py,sha256=77BaTqfytdrqgUxnCLUUVPxx1wScu289xfyBhcHGX-M,37955
|
328
|
+
novelwriter/tools/manussettings.py,sha256=Uz7QpCb2l_SftpQ5N7x0qHdq41-6fvTRHv7bxWvDLWg,56145
|
329
|
+
novelwriter/tools/noveldetails.py,sha256=xNpTf5-hFu-K_flPhMLug6tNboKvDWV7OEetpHx6Lsc,18481
|
330
|
+
novelwriter/tools/welcome.py,sha256=XTTqVqeojZW8hoA6b4nusq4cJ4d1ISoHVPYrEjO4lR0,27759
|
331
|
+
novelwriter/tools/writingstats.py,sha256=f5nbmE5V9VsQ8qi_DlvfF5yVIupEbVDavtuMbTzU7IA,22753
|
332
|
+
novelWriter-2.5rc1.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
|
333
|
+
novelWriter-2.5rc1.dist-info/METADATA,sha256=mkaYvtyWGejmUtcwGSmtZlfMcUqrIK4jvejIQ84T4zw,2533
|
334
|
+
novelWriter-2.5rc1.dist-info/WHEEL,sha256=cpQTJ5IWu9CdaPViMhC9YzF8gZuS5-vlfoFihTBC86A,91
|
335
|
+
novelWriter-2.5rc1.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
|
336
|
+
novelWriter-2.5rc1.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
|
337
|
+
novelWriter-2.5rc1.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.5rc1"
|
51
|
+
__hexversion__ = "0x020500c1"
|
52
|
+
__date__ = "2024-06-22"
|
53
53
|
__status__ = "Stable"
|
54
54
|
__domain__ = "novelwriter.io"
|
55
55
|
|
Binary file
|
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"Synopsis": "Sinopse",
|
3
3
|
"Short Description": "Descrição breve",
|
4
|
-
"Comment": "
|
4
|
+
"Comment": "Comentário",
|
5
5
|
"Notes": "Notas",
|
6
6
|
"Tag": "Etiqueta",
|
7
7
|
"Point of View": "Ponto de vista",
|
@@ -30,87 +30,87 @@
|
|
30
30
|
"14": "Quatorze",
|
31
31
|
"15": "Quinze",
|
32
32
|
"16": "Dezesseis",
|
33
|
-
"17": "
|
33
|
+
"17": "Dezessete",
|
34
34
|
"18": "Dezoito",
|
35
35
|
"19": "Dezenove",
|
36
36
|
"20": "Vinte",
|
37
|
-
"21": "Vinte e
|
38
|
-
"22": "Vinte e
|
39
|
-
"23": "Vinte e
|
40
|
-
"24": "Vinte e
|
41
|
-
"25": "Vinte e
|
42
|
-
"26": "Vinte e
|
43
|
-
"27": "Vinte e
|
44
|
-
"28": "Vinte e
|
45
|
-
"29": "Vinte e
|
37
|
+
"21": "Vinte e um",
|
38
|
+
"22": "Vinte e dois",
|
39
|
+
"23": "Vinte e três",
|
40
|
+
"24": "Vinte e quatro",
|
41
|
+
"25": "Vinte e cinco",
|
42
|
+
"26": "Vinte e seis",
|
43
|
+
"27": "Vinte e sete",
|
44
|
+
"28": "Vinte e oito",
|
45
|
+
"29": "Vinte e nove",
|
46
46
|
"30": "Trinta",
|
47
|
-
"31": "Trinta e
|
48
|
-
"32": "Trinta e
|
49
|
-
"33": "Trinta e
|
50
|
-
"34": "Trinta e
|
51
|
-
"35": "Trinta e
|
52
|
-
"36": "Trinta e
|
53
|
-
"37": "Trinta e
|
54
|
-
"38": "Trinta e
|
55
|
-
"39": "Trinta e
|
47
|
+
"31": "Trinta e um",
|
48
|
+
"32": "Trinta e dois",
|
49
|
+
"33": "Trinta e três",
|
50
|
+
"34": "Trinta e quatro",
|
51
|
+
"35": "Trinta e cinco",
|
52
|
+
"36": "Trinta e seis",
|
53
|
+
"37": "Trinta e sete",
|
54
|
+
"38": "Trinta e oito",
|
55
|
+
"39": "Trinta e nove",
|
56
56
|
"40": "Quarenta",
|
57
|
-
"41": "Quarenta e
|
58
|
-
"42": "Quarenta e
|
59
|
-
"43": "Quarenta e
|
60
|
-
"44": "Quarenta e
|
61
|
-
"45": "Quarenta e
|
62
|
-
"46": "Quarenta e
|
63
|
-
"47": "Quarenta e
|
64
|
-
"48": "Quarenta e
|
65
|
-
"49": "Quarenta e
|
57
|
+
"41": "Quarenta e um",
|
58
|
+
"42": "Quarenta e dois",
|
59
|
+
"43": "Quarenta e três",
|
60
|
+
"44": "Quarenta e quatro",
|
61
|
+
"45": "Quarenta e cinco",
|
62
|
+
"46": "Quarenta e seis",
|
63
|
+
"47": "Quarenta e sete",
|
64
|
+
"48": "Quarenta e oito",
|
65
|
+
"49": "Quarenta e nove",
|
66
66
|
"50": "Cinquenta",
|
67
|
-
"51": "Cinquenta e
|
68
|
-
"52": "Cinquenta e
|
69
|
-
"53": "Cinquenta e
|
70
|
-
"54": "Cinquenta e
|
71
|
-
"55": "Cinquenta e
|
72
|
-
"56": "Cinquenta e
|
73
|
-
"57": "Cinquenta e
|
74
|
-
"58": "Cinquenta e
|
75
|
-
"59": "Cinquenta e
|
67
|
+
"51": "Cinquenta e um",
|
68
|
+
"52": "Cinquenta e dois",
|
69
|
+
"53": "Cinquenta e três",
|
70
|
+
"54": "Cinquenta e quatro",
|
71
|
+
"55": "Cinquenta e cinco",
|
72
|
+
"56": "Cinquenta e seis",
|
73
|
+
"57": "Cinquenta e sete",
|
74
|
+
"58": "Cinquenta e oito",
|
75
|
+
"59": "Cinquenta e nove",
|
76
76
|
"60": "Sessenta",
|
77
|
-
"61": "Sessenta e
|
78
|
-
"62": "Sessenta e
|
79
|
-
"63": "Sessenta e
|
80
|
-
"64": "Sessenta e
|
81
|
-
"65": "Sessenta e
|
82
|
-
"66": "Sessenta e
|
83
|
-
"67": "Sessenta e
|
84
|
-
"68": "Sessenta e
|
85
|
-
"69": "Sessenta e
|
77
|
+
"61": "Sessenta e um",
|
78
|
+
"62": "Sessenta e dois",
|
79
|
+
"63": "Sessenta e três",
|
80
|
+
"64": "Sessenta e quatro",
|
81
|
+
"65": "Sessenta e cinco",
|
82
|
+
"66": "Sessenta e seis",
|
83
|
+
"67": "Sessenta e sete",
|
84
|
+
"68": "Sessenta e oito",
|
85
|
+
"69": "Sessenta e nove",
|
86
86
|
"70": "Setenta",
|
87
|
-
"71": "Setenta e
|
88
|
-
"72": "Setenta e
|
89
|
-
"73": "Setenta e
|
90
|
-
"74": "Setenta e
|
91
|
-
"75": "Setenta e
|
92
|
-
"76": "Setenta e
|
93
|
-
"77": "Setenta e
|
94
|
-
"78": "Setenta e
|
95
|
-
"79": "Setenta e
|
87
|
+
"71": "Setenta e um",
|
88
|
+
"72": "Setenta e dois",
|
89
|
+
"73": "Setenta e três",
|
90
|
+
"74": "Setenta e quatro",
|
91
|
+
"75": "Setenta e cinco",
|
92
|
+
"76": "Setenta e seis",
|
93
|
+
"77": "Setenta e sete",
|
94
|
+
"78": "Setenta e oito",
|
95
|
+
"79": "Setenta e nove",
|
96
96
|
"80": "Oitenta",
|
97
|
-
"81": "Oitenta e
|
98
|
-
"82": "Oitenta e
|
99
|
-
"83": "Oitenta e
|
100
|
-
"84": "Oitenta e
|
101
|
-
"85": "Oitenta e
|
102
|
-
"86": "Oitenta e
|
103
|
-
"87": "Oitenta e
|
104
|
-
"88": "Oitenta e
|
105
|
-
"89": "Oitenta e
|
97
|
+
"81": "Oitenta e um",
|
98
|
+
"82": "Oitenta e dois",
|
99
|
+
"83": "Oitenta e três",
|
100
|
+
"84": "Oitenta e quatro",
|
101
|
+
"85": "Oitenta e cinco",
|
102
|
+
"86": "Oitenta e seis",
|
103
|
+
"87": "Oitenta e sete",
|
104
|
+
"88": "Oitenta e oito",
|
105
|
+
"89": "Oitenta e nove",
|
106
106
|
"90": "Noventa",
|
107
|
-
"91": "Noventa e
|
108
|
-
"92": "Noventa e
|
109
|
-
"93": "Noventa e
|
110
|
-
"94": "Noventa e
|
111
|
-
"95": "Noventa e
|
112
|
-
"96": "Noventa e
|
113
|
-
"97": "Noventa e
|
114
|
-
"98": "Noventa e
|
115
|
-
"99": "Noventa e
|
107
|
+
"91": "Noventa e um",
|
108
|
+
"92": "Noventa e dois",
|
109
|
+
"93": "Noventa e três",
|
110
|
+
"94": "Noventa e quatro",
|
111
|
+
"95": "Noventa e cinco",
|
112
|
+
"96": "Noventa e seis",
|
113
|
+
"97": "Noventa e sete",
|
114
|
+
"98": "Noventa e oito",
|
115
|
+
"99": "Noventa e nove"
|
116
116
|
}
|
novelwriter/assets/manual.pdf
CHANGED
Binary file
|
novelwriter/assets/sample.zip
CHANGED
Binary file
|
novelwriter/common.py
CHANGED
@@ -523,12 +523,11 @@ def readTextFile(path: str | Path) -> str:
|
|
523
523
|
|
524
524
|
|
525
525
|
def makeFileNameSafe(text: str) -> str:
|
526
|
-
"""Return a filename
|
526
|
+
"""Return a filename-safe string.
|
527
527
|
See: https://unicode.org/reports/tr15/#Norm_Forms
|
528
528
|
"""
|
529
529
|
text = unicodedata.normalize("NFKC", text).strip()
|
530
|
-
|
531
|
-
return "".join(c for c in text if c.isalnum() or c in allowed)
|
530
|
+
return "".join(c for c in text if c.isprintable() and c not in r'\/:*?"<>|')
|
532
531
|
|
533
532
|
|
534
533
|
def getFileSize(path: Path) -> int:
|
novelwriter/config.py
CHANGED
@@ -5,6 +5,7 @@ novelWriter – Config Class
|
|
5
5
|
File History:
|
6
6
|
Created: 2018-09-22 [0.0.1] Config
|
7
7
|
Created: 2022-11-09 [2.0rc2] RecentProjects
|
8
|
+
Created: 2024-06-16 [2.5rc1] RecentPaths
|
8
9
|
|
9
10
|
This file is a part of novelWriter
|
10
11
|
Copyright 2018–2024, Veronica Berglyd Olsen
|
@@ -103,7 +104,8 @@ class Config:
|
|
103
104
|
# User Settings
|
104
105
|
# =============
|
105
106
|
|
106
|
-
self.
|
107
|
+
self._recentProjects = RecentProjects(self)
|
108
|
+
self._recentPaths = RecentPaths(self)
|
107
109
|
|
108
110
|
# General GUI Settings
|
109
111
|
self.guiLocale = self._qLocale.name()
|
@@ -180,7 +182,6 @@ class Config:
|
|
180
182
|
self.fmtPadThin = False
|
181
183
|
|
182
184
|
# User Paths
|
183
|
-
self._lastPath = self._homePath # The user's last used path
|
184
185
|
self._backupPath = self._backPath # Backup path to use, can be none
|
185
186
|
|
186
187
|
# Spell Checking Settings
|
@@ -253,7 +254,7 @@ class Config:
|
|
253
254
|
|
254
255
|
@property
|
255
256
|
def recentProjects(self) -> RecentProjects:
|
256
|
-
return self.
|
257
|
+
return self._recentProjects
|
257
258
|
|
258
259
|
@property
|
259
260
|
def mainWinSize(self) -> list[int]:
|
@@ -343,7 +344,7 @@ class Config:
|
|
343
344
|
self._outlnPanePos = [int(x/self.guiScale) for x in pos]
|
344
345
|
return
|
345
346
|
|
346
|
-
def setLastPath(self, path: str | Path) -> None:
|
347
|
+
def setLastPath(self, key: str, path: str | Path) -> None:
|
347
348
|
"""Set the last used path. Only the folder is saved, so if the
|
348
349
|
path is not a folder, the parent of the path is used instead.
|
349
350
|
"""
|
@@ -352,8 +353,7 @@ class Config:
|
|
352
353
|
if not path.is_dir():
|
353
354
|
path = path.parent
|
354
355
|
if path.is_dir():
|
355
|
-
self.
|
356
|
-
logger.debug("Last path updated: %s" % self._lastPath)
|
356
|
+
self._recentPaths.setPath(key, path)
|
357
357
|
return
|
358
358
|
|
359
359
|
def setBackupPath(self, path: Path | str) -> None:
|
@@ -438,11 +438,12 @@ class Config:
|
|
438
438
|
return self._appPath / "assets" / target
|
439
439
|
return self._appPath / "assets"
|
440
440
|
|
441
|
-
def lastPath(self) -> Path:
|
441
|
+
def lastPath(self, key: str) -> Path:
|
442
442
|
"""Return the last path used by the user, if it exists."""
|
443
|
-
if
|
444
|
-
|
445
|
-
|
443
|
+
if path := self._recentPaths.getPath(key):
|
444
|
+
asPath = Path(path)
|
445
|
+
if asPath.is_dir():
|
446
|
+
return asPath
|
446
447
|
return self._homePath
|
447
448
|
|
448
449
|
def backupPath(self) -> Path:
|
@@ -516,7 +517,6 @@ class Config:
|
|
516
517
|
logger.debug("Data Path: %s", self._dataPath)
|
517
518
|
logger.debug("App Root: %s", self._appRoot)
|
518
519
|
logger.debug("App Path: %s", self._appPath)
|
519
|
-
logger.debug("Last Path: %s", self._lastPath)
|
520
520
|
logger.debug("PDF Manual: %s", self.pdfDocs)
|
521
521
|
|
522
522
|
# If the config and data folders don't exist, create them
|
@@ -531,7 +531,8 @@ class Config:
|
|
531
531
|
(self._dataPath / "syntax").mkdir(exist_ok=True)
|
532
532
|
(self._dataPath / "themes").mkdir(exist_ok=True)
|
533
533
|
|
534
|
-
self.
|
534
|
+
self._recentPaths.loadCache()
|
535
|
+
self._recentProjects.loadCache()
|
535
536
|
self._checkOptionalPackages()
|
536
537
|
|
537
538
|
logger.debug("Config instance initialised")
|
@@ -600,7 +601,6 @@ class Config:
|
|
600
601
|
self.hideHScroll = conf.rdBool(sec, "hidehscroll", self.hideHScroll)
|
601
602
|
self.lastNotes = conf.rdStr(sec, "lastnotes", self.lastNotes)
|
602
603
|
self.nativeFont = conf.rdBool(sec, "nativefont", self.nativeFont)
|
603
|
-
self._lastPath = conf.rdPath(sec, "lastpath", self._lastPath)
|
604
604
|
|
605
605
|
# Sizes
|
606
606
|
sec = "Sizes"
|
@@ -710,7 +710,6 @@ class Config:
|
|
710
710
|
"hidehscroll": str(self.hideHScroll),
|
711
711
|
"lastnotes": str(self.lastNotes),
|
712
712
|
"nativefont": str(self.nativeFont),
|
713
|
-
"lastpath": str(self._lastPath),
|
714
713
|
}
|
715
714
|
|
716
715
|
conf["Sizes"] = {
|
@@ -811,7 +810,7 @@ class Config:
|
|
811
810
|
"""Pack a list of items into a comma-separated string for saving
|
812
811
|
to the config file.
|
813
812
|
"""
|
814
|
-
return ", ".join(
|
813
|
+
return ", ".join(str(inVal) for inVal in data)
|
815
814
|
|
816
815
|
def _checkOptionalPackages(self) -> None:
|
817
816
|
"""Check optional packages used by some features."""
|
@@ -893,3 +892,56 @@ class RecentProjects:
|
|
893
892
|
logger.debug("Removed recent: %s", path)
|
894
893
|
self.saveCache()
|
895
894
|
return
|
895
|
+
|
896
|
+
|
897
|
+
class RecentPaths:
|
898
|
+
|
899
|
+
KEYS = ["default", "project", "import", "outline", "stats"]
|
900
|
+
|
901
|
+
def __init__(self, config: Config) -> None:
|
902
|
+
self._conf = config
|
903
|
+
self._data = {}
|
904
|
+
return
|
905
|
+
|
906
|
+
def setPath(self, key: str, path: Path | str) -> None:
|
907
|
+
"""Set a path for a given key, and save the cache."""
|
908
|
+
if key in self.KEYS:
|
909
|
+
self._data[key] = str(path)
|
910
|
+
self.saveCache()
|
911
|
+
return
|
912
|
+
|
913
|
+
def getPath(self, key: str) -> str | None:
|
914
|
+
"""Get a path for a given key, or return None."""
|
915
|
+
return self._data.get(key)
|
916
|
+
|
917
|
+
def loadCache(self) -> bool:
|
918
|
+
"""Load the cache file for recent paths."""
|
919
|
+
self._data = {}
|
920
|
+
cacheFile = self._conf.dataPath(nwFiles.RECENT_PATH)
|
921
|
+
if cacheFile.is_file():
|
922
|
+
try:
|
923
|
+
with open(cacheFile, mode="r", encoding="utf-8") as inFile:
|
924
|
+
data = json.load(inFile)
|
925
|
+
if isinstance(data, dict):
|
926
|
+
for key, path in data.items():
|
927
|
+
if key in self.KEYS and isinstance(path, str):
|
928
|
+
self._data[key] = path
|
929
|
+
except Exception:
|
930
|
+
logger.error("Could not load recent paths cache")
|
931
|
+
logException()
|
932
|
+
return False
|
933
|
+
return True
|
934
|
+
|
935
|
+
def saveCache(self) -> bool:
|
936
|
+
"""Save the cache dictionary of recent paths."""
|
937
|
+
cacheFile = self._conf.dataPath(nwFiles.RECENT_PATH)
|
938
|
+
cacheTemp = cacheFile.with_suffix(".tmp")
|
939
|
+
try:
|
940
|
+
with open(cacheTemp, mode="w+", encoding="utf-8") as outFile:
|
941
|
+
json.dump(self._data, outFile, indent=2)
|
942
|
+
cacheTemp.replace(cacheFile)
|
943
|
+
except Exception:
|
944
|
+
logger.error("Could not save recent paths cache")
|
945
|
+
logException()
|
946
|
+
return False
|
947
|
+
return True
|