novelWriter 2.5.1__py3-none-any.whl → 2.5.3__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: novelWriter
3
- Version: 2.5.1
3
+ Version: 2.5.3
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
@@ -23,8 +24,8 @@ Classifier: Topic :: Text Editors
23
24
  Requires-Python: >=3.9
24
25
  Description-Content-Type: text/markdown
25
26
  License-File: LICENSE.md
26
- Requires-Dist: pyqt5 >=5.15
27
- Requires-Dist: pyenchant >=3.0.0
27
+ Requires-Dist: pyqt5>=5.15
28
+ Requires-Dist: pyenchant>=3.0.0
28
29
 
29
30
  <img src="https://raw.githubusercontent.com/vkbo/novelWriter/main/setup/novelwriter_text.png">
30
31
 
@@ -1,4 +1,4 @@
1
- novelwriter/__init__.py,sha256=vYFXHDZoxu12zt7mAW1DuW9_JOAzTnBbagm6dSEa9Ok,7552
1
+ novelwriter/__init__.py,sha256=Xw_5nsng19Co6cRmSNqylgg6icULBKm3u9Gm3feuWM8,7552
2
2
  novelwriter/common.py,sha256=qg7jqTVqLOk4zlhKkFoLgYfBdtrBweZYkZeNn7OXX5k,18494
3
3
  novelwriter/config.py,sha256=cUL4S-JOKhxEes--NxCiV84NpanvVbcbW_K5v74dS3w,39081
4
4
  novelwriter/constants.py,sha256=y-UjNZxtU2lzn0Ji9lKiNU3233RmoJuK-3JWHT6GIvc,21368
@@ -7,9 +7,9 @@ novelwriter/error.py,sha256=iIx1OzyXTT7Ngk2mXW_5c0YqVdFBD0NIkUFgAXNNBlM,6813
7
7
  novelwriter/guimain.py,sha256=i3qIrDKlwsaF0BgaTzldHWPOozs1wYpmvwQTVro06_c,53662
8
8
  novelwriter/shared.py,sha256=LMgMXZK28LJUnRDbcTqTp4ZDVCKBt3EJYZMnIdu4R18,15906
9
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
12
- novelwriter/assets/i18n/nw_de_DE.qm,sha256=__e0mtl0hfBX61eICSrJhR4mY0r7W9IkI5fYCwvLrYw,100554
10
+ novelwriter/assets/manual.pdf,sha256=BxGP5FpA2LtJCaz_DEMaLExW9FNLXalYP28fLfBKmaI,2733563
11
+ novelwriter/assets/sample.zip,sha256=IYTSbrleoKfOB4xtUWdTmMQntjDWhMOd2QSKFYGhjR0,27805
12
+ novelwriter/assets/i18n/nw_de_DE.qm,sha256=tyew6MnnKP9s5zEkwO_MiLJ2EH2sOO21BPaDnP5ebRU,100540
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
15
15
  novelwriter/assets/i18n/nw_fr_FR.qm,sha256=mB2TCRNjttTFoC34iGbri5OVt2ygCNtxPS5g48CA-HA,103616
@@ -18,9 +18,10 @@ novelwriter/assets/i18n/nw_ja_JP.qm,sha256=ILDwq_8kHCiorjZabSbUYer9xB9q7hf-NQyAl
18
18
  novelwriter/assets/i18n/nw_nb_NO.qm,sha256=g2raFt2Lw5RcE0IJM1_f7GJsqt8G_uSv7m6sD6zFe_0,95946
19
19
  novelwriter/assets/i18n/nw_nl_NL.qm,sha256=SnEtdqHaSb8xWA4-EpnWxXD_uK8BeBs44I32AwlST3M,99906
20
20
  novelwriter/assets/i18n/nw_pl_PL.qm,sha256=Em13jYHYnTbLZp_JaodgZntmcpxBrvbitOZhM8ZQXig,98702
21
- novelwriter/assets/i18n/nw_pt_BR.qm,sha256=EXqtpkEPafPipTd0rCBN6cQ5SlqVyeMPwyMfgpTKjMs,101680
21
+ novelwriter/assets/i18n/nw_pt_BR.qm,sha256=zGC7PbMD6NlbNYmZ2IiV8B9xxdTE7yBpaFhSeaBQSzU,101706
22
+ novelwriter/assets/i18n/nw_ru_RU.qm,sha256=DOaPZyREPxMrOuLLs1Sboj43QA6HfK6okU8WJGue5wE,98115
22
23
  novelwriter/assets/i18n/nw_zh_CN.qm,sha256=poSDKRXapJ8zHBmiRdA85KcIN1nm6gnowDMlpoJwAKE,69647
23
- novelwriter/assets/i18n/project_de_DE.json,sha256=85ud9rxRHyXm85QDmW_LKcUE8h0L1Bvukaf5Tjt-wpg,2818
24
+ novelwriter/assets/i18n/project_de_DE.json,sha256=fuEYohM2xm0mLXmibbU0TISr0BCZb2yOiBLCUmKhDJQ,2810
24
25
  novelwriter/assets/i18n/project_en_GB.json,sha256=7c9W2YJAELCSwx4zN_2qYZ3xsGncinCrGNhaj_FVkxk,2511
25
26
  novelwriter/assets/i18n/project_en_US.json,sha256=EcQAVEiQgRL3qobuzkPTfOWIxAc3Om-tA7nXUFFXEdI,2483
26
27
  novelwriter/assets/i18n/project_es_419.json,sha256=Z6CAhc0hzekUZFDM-0ykRRsckJG4c2AETy4Xa_f2T7s,2730
@@ -32,7 +33,7 @@ novelwriter/assets/i18n/project_nl_NL.json,sha256=qUEEjLMRtvt9VuNmjb_qOVCXqUCENH
32
33
  novelwriter/assets/i18n/project_nn_NO.json,sha256=7ZfmtFWHcDMiLVqdOEDHQWHbpoC_bv5ESmf_-CoYiks,2250
33
34
  novelwriter/assets/i18n/project_pl_PL.json,sha256=msXu3rNhJ19ytVespoXQ95nZ-mFis5rlLeCPK4A3zS8,3461
34
35
  novelwriter/assets/i18n/project_pt_BR.json,sha256=FDxIeSlf3v8AcrWfgwk7UOMRDmb2hWdDoabsBq5rkL8,2763
35
- novelwriter/assets/i18n/project_ru_RU.json,sha256=F4QkD6VVDCtGdil7uoXCmuczvUpe9tv-1L-3Eyc8sKE,3699
36
+ novelwriter/assets/i18n/project_ru_RU.json,sha256=Lq8msxzjhkFHXPJAmEEyjoFOUV28CLJXmayY3h3jiAo,4075
36
37
  novelwriter/assets/i18n/project_zh_CN.json,sha256=cfl0TsnbISYUvygOw015y0x0REDG97xR0yjyJ85Jm34,2322
37
38
  novelwriter/assets/icons/none.svg,sha256=NRN9vMzohg7Ner71GwPthrCG0uA81TpY8UmKb8-L-pM,251
38
39
  novelwriter/assets/icons/novelwriter.ico,sha256=OJRIeeUcmS7Di51NA3uF5_Ov4V8T47gQ9qWv6C7qDeA,171059
@@ -260,12 +261,12 @@ novelwriter/assets/syntax/tomorrow_night.conf,sha256=mWPneIV_6tszLEK4-Eo-kcJmUbr
260
261
  novelwriter/assets/syntax/tomorrow_night_blue.conf,sha256=L42gcekFfNpCCB45m9Lhzmz8Y6Lvbpik3AADi_1Aao8,1549
261
262
  novelwriter/assets/syntax/tomorrow_night_bright.conf,sha256=h8_775Ed8hl2XhfCoxAY2kT43vi-UvG8UHik1aI4eRw,1554
262
263
  novelwriter/assets/syntax/tomorrow_night_eighties.conf,sha256=stO_xH5RzMN0jaZeYr53LVXbpqSmIXALBFGVLlJBDLA,1557
263
- novelwriter/assets/text/credits_en.htm,sha256=jeEMRXuD-ZpGgRPtS3oZQ4HdIe6pwSnB3ZifvYiZLjU,2904
264
+ novelwriter/assets/text/credits_en.htm,sha256=wZgQGDQgIvd_2aT6oaJB88jOUjhtWYbn9tA6IfoGq3k,2958
264
265
  novelwriter/assets/text/lipsum.txt,sha256=sGA6AC_p4jrUifxLxy3cSODeRwkpBNXDPGgX6YRTm2s,62937
265
266
  novelwriter/assets/themes/cyberpunk_night.conf,sha256=FvG_YVfEnMwJV1XUDEdpi9qoHQ5sdyVEaR_Y3WfWNA8,923
266
267
  novelwriter/assets/themes/default.conf,sha256=K0LZ64lODpCtUg3pISTAP4UKvEYMvPkmIYN9RDEaWwk,72
267
268
  novelwriter/assets/themes/default_dark.conf,sha256=obPCLVOXL1Zp973DbbROldyQOoUPGWlPKLbetZqMZe8,989
268
- novelwriter/assets/themes/default_light.conf,sha256=zNjrtkRs2hLEcefFt3uys2-tei3Lxdth-yThO9InNz4,992
269
+ novelwriter/assets/themes/default_light.conf,sha256=2a4SXzlbZpyV9EX3BuFSRFYuLuzu4hapa_3iwez6yAc,992
269
270
  novelwriter/assets/themes/dracula.conf,sha256=pUvu7FS1nRPj3PyU3NZMR0WSb5sIa0oLpSa2XTzsh98,1425
270
271
  novelwriter/assets/themes/solarized_dark.conf,sha256=7dDjs8aiFuAjl--hqMJQEExrfCgAapiPY82CL6aAo-I,916
271
272
  novelwriter/assets/themes/solarized_light.conf,sha256=psCPVWcjAKB5y8H_E_h5zYUifxh5YpdFdBzxFofIHa0,918
@@ -283,8 +284,8 @@ novelwriter/core/sessions.py,sha256=V9eBXaUMcXTZjYXR5dgi6E14COIlcLIkNwS6pDrn75U,
283
284
  novelwriter/core/spellcheck.py,sha256=MwkRPp3MJa2X-6yRWX6Rc-sq2vLsbLnjNnyUpAbRFiE,7176
284
285
  novelwriter/core/status.py,sha256=FW20GK6_gxsYCiD7ZDg_gGIgp6yw3y1PS5mBN5HlARo,11592
285
286
  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
287
+ novelwriter/core/tohtml.py,sha256=ldJRk2J2RQ5IHPNUtVWCLy64QkVbOm2WfyMcSln-YUg,19211
288
+ novelwriter/core/tokenizer.py,sha256=M4hbOqPtaeLFFPwVlQs03eHgSDHEWjZKw3_zzWtgqB0,47975
288
289
  novelwriter/core/tomarkdown.py,sha256=sZG64PLyTjDuIxnPQVMdcMSF-obsp4C06B1dUKhlbHU,7925
289
290
  novelwriter/core/toodt.py,sha256=Hrb6FJkwf2wwcKE6f7lw5o0PZqKsf1TWqvJbrJWrijU,62529
290
291
  novelwriter/core/toqdoc.py,sha256=p8_4WwwXcnEuPw2XsU4Xq76YTyT2JMk7NQR1arCjVd8,15500
@@ -309,14 +310,14 @@ novelwriter/extensions/switchbox.py,sha256=5tCiFWkT9WF9xh2c__BnNAJHFLw2nRso3fJZf
309
310
  novelwriter/extensions/versioninfo.py,sha256=R2_U6B678be0WNxbnhUntpxR5PnZVGf6eeyENp-S-Xo,5035
310
311
  novelwriter/gui/doceditor.py,sha256=Cv9_sMKpSozKrIPusvcLDzlgD6rr8JxDHkzIoApOfMc,113720
311
312
  novelwriter/gui/dochighlight.py,sha256=4JNWQkfaEc0p-EvRRkbBWwQdrFqVotgremzu2WWw9hA,19463
312
- novelwriter/gui/docviewer.py,sha256=DzCyIwJusRAF8Uw93pAQEgk8PJ6H_yaH9TGFzPmcie8,32280
313
+ novelwriter/gui/docviewer.py,sha256=eXnUE-q_hrwIaJ7FBJf5XrTiQOkWz_r_oAsoYe9w3PI,32251
313
314
  novelwriter/gui/docviewerpanel.py,sha256=CCCzSc-Ol5jCmoEfpZ-RD-tcwzkyM7g_iBSQNeljGgE,20040
314
315
  novelwriter/gui/editordocument.py,sha256=5_v-gwZ9-CwJHGs7lFUGdY3paR7F1PW2FjD6_fbq5wY,4087
315
316
  novelwriter/gui/itemdetails.py,sha256=0U3hghK4Vue3AwtLBRY6YJMN3vOCjatvvzXhJDn4UXo,9688
316
317
  novelwriter/gui/mainmenu.py,sha256=PaJjO38DQ72UL9hMyvSbh2I1daxOZBSbJhNsov771fw,38908
317
318
  novelwriter/gui/noveltree.py,sha256=rAU_f6efrt5uAsew6jGqo3X3E3ggrZaoQh2prm13wD8,27635
318
319
  novelwriter/gui/outline.py,sha256=Id6hSEe1iLls6qPckX-b3U21rPOOndlfe7r4VsNC3G8,42312
319
- novelwriter/gui/projtree.py,sha256=iMsMf8IcaV3Dvsbx3thWvWffHFqM5kTWP2AC69Fsvg0,78027
320
+ novelwriter/gui/projtree.py,sha256=GF7StUyPpgp-mcnG2AQIOta7o4gjBuDn69-9piYmtbU,78380
320
321
  novelwriter/gui/search.py,sha256=HnS0_vOg15f3woXeZ8MS_ZAblx9aFIuN7BSa195tY1M,13262
321
322
  novelwriter/gui/sidebar.py,sha256=jBkOinx69lwt4m1GovQ7nF44lF-g_SOk3yTT96KlbFY,6212
322
323
  novelwriter/gui/statusbar.py,sha256=-rF6bIJXGKFRswVKWE1c5In5x3sX4iXMfp0AGxZxt0c,9053
@@ -326,14 +327,14 @@ novelwriter/text/patterns.py,sha256=sEBPf9buLtJvYeoYquZzDcSC6gfKBHIUPGbD31y5H-g,
326
327
  novelwriter/tools/dictionaries.py,sha256=92GNCSEOK1EI7t2DiayT8p7nzKW7LwxJJz98F6kn3Vg,9243
327
328
  novelwriter/tools/lipsum.py,sha256=NcmoxWzrbEybh_w1FzxuxHmeTr8N03OrxjxsPWEbae4,4794
328
329
  novelwriter/tools/manusbuild.py,sha256=c3NdpkAqUPTKN2BpGX_xleFtZPi1G8uv80XBZEp27Bw,14071
329
- novelwriter/tools/manuscript.py,sha256=77BaTqfytdrqgUxnCLUUVPxx1wScu289xfyBhcHGX-M,37955
330
+ novelwriter/tools/manuscript.py,sha256=UgLSm6TFfftSc_cttzaic6Y06pwdMOMmSBhVWzdCSYA,38009
330
331
  novelwriter/tools/manussettings.py,sha256=Uz7QpCb2l_SftpQ5N7x0qHdq41-6fvTRHv7bxWvDLWg,56145
331
332
  novelwriter/tools/noveldetails.py,sha256=xNpTf5-hFu-K_flPhMLug6tNboKvDWV7OEetpHx6Lsc,18481
332
333
  novelwriter/tools/welcome.py,sha256=KLSlBTih_HOTJ3nmyv4IU4ec8XNJDL5AwXMZ6amqmIw,28027
333
334
  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,,
335
+ novelWriter-2.5.3.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
336
+ novelWriter-2.5.3.dist-info/METADATA,sha256=ADeNRKWKkQDtlf-XyVKsOHPcX8hjmX1umCivlQppZcY,2581
337
+ novelWriter-2.5.3.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
338
+ novelWriter-2.5.3.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
339
+ novelWriter-2.5.3.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
340
+ novelWriter-2.5.3.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (75.6.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.5.3"
51
+ __hexversion__ = "0x020503f0"
52
+ __date__ = "2024-11-26"
53
53
  __status__ = "Stable"
54
54
  __domain__ = "novelwriter.io"
55
55
 
Binary file
Binary file
Binary file
@@ -5,9 +5,9 @@
5
5
  "Notes": "Notizen",
6
6
  "Tag": "Schlagwort",
7
7
  "Point of View": "Perspektive",
8
- "Focus": "Mittelpunkt",
8
+ "Focus": "Fokus",
9
9
  "Characters": "Charaktere",
10
- "Plot": "Handlungen",
10
+ "Plot": "Handlung",
11
11
  "Timeline": "Zeitleiste",
12
12
  "Locations": "Schauplätze",
13
13
  "Objects": "Objekte",
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "Synopsis": "Сводка",
3
+ "Short Description": "Краткое описание",
3
4
  "Comment": "Комментарий",
4
5
  "Notes": "Заметки",
6
+ "Tag": "Тэг",
7
+ "Point of View": "Точка зрения",
8
+ "Focus": "Фокус",
9
+ "Characters": "Персонажей",
10
+ "Plot": "Сюжет",
11
+ "Timeline": "Хронология",
12
+ "Locations": "Локации",
13
+ "Objects": "Объекты",
14
+ "Entities": "Сущности",
15
+ "Custom": "Другое",
5
16
  "0": "Ноль",
6
17
  "1": "Один",
7
18
  "2": "Два",
Binary file
Binary file
@@ -35,6 +35,7 @@ translators for the languages currently available:</p>
35
35
  <li><b>Norwegian:</b> Veronica Berglyd Olsen (vkbo)</li>
36
36
  <li><b>Polish:</b> Anna Maria Polak (Nauthiz)</li>
37
37
  <li><b>Portuguese:</b> Bruno Meneguello (bkmeneguello)</li>
38
+ <li><b>Russian:</b> Konstantin Tan (k1kimosha)</li>
38
39
  <li><b>Simplified Chinese:</b> Qianzhi Long (longqzh)</li>
39
40
  </ul>
40
41
 
@@ -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
@@ -299,10 +299,10 @@ class ToHtml(Tokenizer):
299
299
  "<head>\n"
300
300
  "<meta charset='utf-8'>\n"
301
301
  "<title>{title:s}</title>\n"
302
- "</head>\n"
303
302
  "<style>\n"
304
303
  "{style:s}\n"
305
304
  "</style>\n"
305
+ "</head>\n"
306
306
  "<body>\n"
307
307
  "<article>\n"
308
308
  "{body:s}\n"
@@ -832,7 +832,7 @@ class Tokenizer(ABC):
832
832
  sAlign |= self.A_IND_R
833
833
 
834
834
  # Process formats
835
- tLine, tFmt = self._extractFormats(aLine)
835
+ tLine, tFmt = self._extractFormats(aLine, hDialog=self._isNovel)
836
836
  tokens.append((
837
837
  self.T_TEXT, nHead, tLine, tFmt, sAlign
838
838
  ))
@@ -1098,8 +1098,13 @@ class Tokenizer(ABC):
1098
1098
  # Internal Functions
1099
1099
  ##
1100
1100
 
1101
- def _extractFormats(self, text: str, skip: int = 0) -> tuple[str, T_Formats]:
1102
- """Extract format markers from a text paragraph."""
1101
+ def _extractFormats(
1102
+ self, text: str, skip: int = 0, hDialog: bool = False
1103
+ ) -> tuple[str, T_Formats]:
1104
+ """Extract format markers from a text paragraph. In order to
1105
+ also process dialogue highlighting, the hDialog flag must be set
1106
+ to True. See issues #2011 and #2013.
1107
+ """
1103
1108
  temp: list[tuple[int, int, int, str]] = []
1104
1109
 
1105
1110
  # Match Markdown
@@ -1137,7 +1142,7 @@ class Tokenizer(ABC):
1137
1142
  ))
1138
1143
 
1139
1144
  # Match Dialogue
1140
- if self._rxDialogue:
1145
+ if self._rxDialogue and hDialog:
1141
1146
  for regEx, fmtB, fmtE in self._rxDialogue:
1142
1147
  rxItt = regEx.globalMatch(text, 0)
1143
1148
  while rxItt.hasNext():
@@ -1150,8 +1155,9 @@ class Tokenizer(ABC):
1150
1155
  formats = []
1151
1156
  for pos, n, fmt, key in reversed(sorted(temp, key=lambda x: x[0])):
1152
1157
  if fmt > 0:
1153
- result = result[:pos] + result[pos+n:]
1154
- formats = [(p-n, f, k) for p, f, k in formats]
1158
+ if n > 0:
1159
+ result = result[:pos] + result[pos+n:]
1160
+ formats = [(p-n if p > pos else p, f, k) for p, f, k in formats]
1155
1161
  formats.insert(0, (pos, fmt, key))
1156
1162
 
1157
1163
  return result, formats
@@ -229,15 +229,13 @@ class GuiDocViewer(QTextBrowser):
229
229
  QApplication.restoreOverrideCursor()
230
230
  return False
231
231
 
232
- # Refresh the tab stops
233
- self.setTabStopDistance(CONFIG.getTabWidth())
234
-
235
- # Must be before setHtml
232
+ # Must be before setDocument
236
233
  if updateHistory:
237
234
  self.docHistory.append(tHandle)
238
235
 
239
236
  self.setDocumentTitle(tHandle)
240
237
  self.setDocument(qDoc.document)
238
+ self.setTabStopDistance(CONFIG.getTabWidth())
241
239
 
242
240
  if self._docHandle == tHandle:
243
241
  # This is a refresh, so we set the scrollbar back to where it was
@@ -1000,7 +1000,9 @@ class GuiProjectTree(QTreeWidget):
1000
1000
 
1001
1001
  self.propagateCount(tHandle, 0)
1002
1002
 
1003
- trItemP = trItemS.parent()
1003
+ # If a non-root item ends up on root due to a bug, allow it
1004
+ # to still be deleted from invisible root (see #2108)
1005
+ trItemP = trItemS.parent() or self.invisibleRootItem()
1004
1006
  tIndex = trItemP.indexOfChild(trItemS)
1005
1007
  trItemP.takeChild(tIndex)
1006
1008
 
@@ -1315,9 +1317,11 @@ class GuiProjectTree(QTreeWidget):
1315
1317
  action is allowed, and update relevant data.
1316
1318
  """
1317
1319
  tItem = self.itemAt(event.pos())
1318
- dropOn = self.dropIndicatorPosition() == QAbstractItemView.DropIndicatorPosition.OnItem
1320
+ onItem = self.dropIndicatorPosition() == QAbstractItemView.DropIndicatorPosition.OnItem
1321
+ onView = self.dropIndicatorPosition() == QAbstractItemView.DropIndicatorPosition.OnViewport
1319
1322
  # Make sure nothing can be dropped on invisible root (see #1569)
1320
- if not tItem or tItem.parent() is None and not dropOn:
1323
+ # Make sure nothing can be dropped on the viewport (see #2108)
1324
+ if tItem is None or (tItem.parent() is None and not onItem) or onView:
1321
1325
  logger.error("Invalid drop location")
1322
1326
  event.ignore()
1323
1327
  return
@@ -823,6 +823,7 @@ class _PreviewWidget(QTextBrowser):
823
823
 
824
824
  document.setDocumentMargin(CONFIG.getTextMargin())
825
825
  self.setDocument(document)
826
+ self.setTabStopDistance(CONFIG.getTabWidth())
826
827
 
827
828
  self._docTime = int(time())
828
829
  self._updateBuildAge()