novelWriter 2.5.1__py3-none-any.whl → 2.5.2__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.2
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
@@ -1,4 +1,4 @@
1
- novelwriter/__init__.py,sha256=vYFXHDZoxu12zt7mAW1DuW9_JOAzTnBbagm6dSEa9Ok,7552
1
+ novelwriter/__init__.py,sha256=vemA3ERUhjeVgO3BDRRw_WJPGdtiFt0DLbrn2gO3WKA,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,8 +7,8 @@ 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
10
+ novelwriter/assets/manual.pdf,sha256=Js2sAkX3shCh5xqRhXFL2aiMEeqbQzRqo1TXlwwbG_I,2739813
11
+ novelwriter/assets/sample.zip,sha256=KRzxNo7kIYdcYX4HZvcQhaz2ewmH9wJHcmMuKeATcNI,27805
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
@@ -284,7 +284,7 @@ novelwriter/core/spellcheck.py,sha256=MwkRPp3MJa2X-6yRWX6Rc-sq2vLsbLnjNnyUpAbRFi
284
284
  novelwriter/core/status.py,sha256=FW20GK6_gxsYCiD7ZDg_gGIgp6yw3y1PS5mBN5HlARo,11592
285
285
  novelwriter/core/storage.py,sha256=mNM9EMW0VRMwEkmTKnzotPVdJk4tJDDUNAHNH9yG5mw,20926
286
286
  novelwriter/core/tohtml.py,sha256=NxM4c52q2ZFNW-XdHOI9L5lqTSiw9J5KZAELhdmN_9I,19211
287
- novelwriter/core/tokenizer.py,sha256=Q7sfWpJxTSkcnj3SiSmQGr8JTXUlH-TGkwzfKe1pfsk,47712
287
+ novelwriter/core/tokenizer.py,sha256=M4hbOqPtaeLFFPwVlQs03eHgSDHEWjZKw3_zzWtgqB0,47975
288
288
  novelwriter/core/tomarkdown.py,sha256=sZG64PLyTjDuIxnPQVMdcMSF-obsp4C06B1dUKhlbHU,7925
289
289
  novelwriter/core/toodt.py,sha256=Hrb6FJkwf2wwcKE6f7lw5o0PZqKsf1TWqvJbrJWrijU,62529
290
290
  novelwriter/core/toqdoc.py,sha256=p8_4WwwXcnEuPw2XsU4Xq76YTyT2JMk7NQR1arCjVd8,15500
@@ -309,7 +309,7 @@ novelwriter/extensions/switchbox.py,sha256=5tCiFWkT9WF9xh2c__BnNAJHFLw2nRso3fJZf
309
309
  novelwriter/extensions/versioninfo.py,sha256=R2_U6B678be0WNxbnhUntpxR5PnZVGf6eeyENp-S-Xo,5035
310
310
  novelwriter/gui/doceditor.py,sha256=Cv9_sMKpSozKrIPusvcLDzlgD6rr8JxDHkzIoApOfMc,113720
311
311
  novelwriter/gui/dochighlight.py,sha256=4JNWQkfaEc0p-EvRRkbBWwQdrFqVotgremzu2WWw9hA,19463
312
- novelwriter/gui/docviewer.py,sha256=DzCyIwJusRAF8Uw93pAQEgk8PJ6H_yaH9TGFzPmcie8,32280
312
+ novelwriter/gui/docviewer.py,sha256=eXnUE-q_hrwIaJ7FBJf5XrTiQOkWz_r_oAsoYe9w3PI,32251
313
313
  novelwriter/gui/docviewerpanel.py,sha256=CCCzSc-Ol5jCmoEfpZ-RD-tcwzkyM7g_iBSQNeljGgE,20040
314
314
  novelwriter/gui/editordocument.py,sha256=5_v-gwZ9-CwJHGs7lFUGdY3paR7F1PW2FjD6_fbq5wY,4087
315
315
  novelwriter/gui/itemdetails.py,sha256=0U3hghK4Vue3AwtLBRY6YJMN3vOCjatvvzXhJDn4UXo,9688
@@ -326,14 +326,14 @@ novelwriter/text/patterns.py,sha256=sEBPf9buLtJvYeoYquZzDcSC6gfKBHIUPGbD31y5H-g,
326
326
  novelwriter/tools/dictionaries.py,sha256=92GNCSEOK1EI7t2DiayT8p7nzKW7LwxJJz98F6kn3Vg,9243
327
327
  novelwriter/tools/lipsum.py,sha256=NcmoxWzrbEybh_w1FzxuxHmeTr8N03OrxjxsPWEbae4,4794
328
328
  novelwriter/tools/manusbuild.py,sha256=c3NdpkAqUPTKN2BpGX_xleFtZPi1G8uv80XBZEp27Bw,14071
329
- novelwriter/tools/manuscript.py,sha256=77BaTqfytdrqgUxnCLUUVPxx1wScu289xfyBhcHGX-M,37955
329
+ novelwriter/tools/manuscript.py,sha256=UgLSm6TFfftSc_cttzaic6Y06pwdMOMmSBhVWzdCSYA,38009
330
330
  novelwriter/tools/manussettings.py,sha256=Uz7QpCb2l_SftpQ5N7x0qHdq41-6fvTRHv7bxWvDLWg,56145
331
331
  novelwriter/tools/noveldetails.py,sha256=xNpTf5-hFu-K_flPhMLug6tNboKvDWV7OEetpHx6Lsc,18481
332
332
  novelwriter/tools/welcome.py,sha256=KLSlBTih_HOTJ3nmyv4IU4ec8XNJDL5AwXMZ6amqmIw,28027
333
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,,
334
+ novelWriter-2.5.2.dist-info/LICENSE.md,sha256=2GirkkLrPfQqx7fACKRJjtKJUegKc8067erGvcDVQHM,32197
335
+ novelWriter-2.5.2.dist-info/METADATA,sha256=76vgcoOL-Qfwlxjkg274DhfbxHgJN_AjHJnNN26Tb5Y,2532
336
+ novelWriter-2.5.2.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
337
+ novelWriter-2.5.2.dist-info/entry_points.txt,sha256=YDUG1w361LtLsjD3YhxoTDTwM17JA5-nigjC6j5C74A,45
338
+ novelWriter-2.5.2.dist-info/top_level.txt,sha256=wFFEucjEeNC_Ap5ULBuEutg5a1Uc0-YO9uFT5L2naNI,12
339
+ novelWriter-2.5.2.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (71.1.0)
2
+ Generator: setuptools (75.1.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.2"
51
+ __hexversion__ = "0x020502f0"
52
+ __date__ = "2024-09-17"
53
53
  __status__ = "Stable"
54
54
  __domain__ = "novelwriter.io"
55
55
 
Binary file
Binary file
@@ -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
@@ -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()