novelWriter 2.3.1__py3-none-any.whl → 2.4__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 (119) hide show
  1. {novelWriter-2.3.1.dist-info → novelWriter-2.4.dist-info}/METADATA +5 -6
  2. {novelWriter-2.3.1.dist-info → novelWriter-2.4.dist-info}/RECORD +114 -107
  3. novelwriter/__init__.py +17 -10
  4. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  5. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  6. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  7. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  8. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  9. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  10. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  11. novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  12. novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  13. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  14. novelwriter/assets/icons/none.svg +4 -0
  15. novelwriter/assets/icons/typicons_dark/icons.conf +4 -0
  16. novelwriter/assets/icons/typicons_dark/nw_tb-mark.svg +7 -0
  17. novelwriter/assets/icons/typicons_dark/typ_refresh-flipped.svg +1 -1
  18. novelwriter/assets/icons/typicons_dark/typ_refresh.svg +1 -1
  19. novelwriter/assets/icons/typicons_dark/typ_search-grey.svg +4 -0
  20. novelwriter/assets/icons/typicons_dark/typ_times.svg +1 -1
  21. novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +4 -0
  22. novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +4 -0
  23. novelwriter/assets/icons/typicons_light/icons.conf +4 -0
  24. novelwriter/assets/icons/typicons_light/nw_tb-mark.svg +7 -0
  25. novelwriter/assets/icons/typicons_light/typ_refresh-flipped.svg +1 -1
  26. novelwriter/assets/icons/typicons_light/typ_refresh.svg +1 -1
  27. novelwriter/assets/icons/typicons_light/typ_search-grey.svg +4 -0
  28. novelwriter/assets/icons/typicons_light/typ_times.svg +1 -1
  29. novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +4 -0
  30. novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +4 -0
  31. novelwriter/assets/manual.pdf +0 -0
  32. novelwriter/assets/sample.zip +0 -0
  33. novelwriter/assets/syntax/default_dark.conf +1 -0
  34. novelwriter/assets/syntax/default_light.conf +1 -0
  35. novelwriter/assets/syntax/grey_dark.conf +1 -0
  36. novelwriter/assets/syntax/grey_light.conf +1 -0
  37. novelwriter/assets/syntax/light_owl.conf +1 -0
  38. novelwriter/assets/syntax/night_owl.conf +1 -0
  39. novelwriter/assets/syntax/solarized_dark.conf +1 -0
  40. novelwriter/assets/syntax/solarized_light.conf +1 -0
  41. novelwriter/assets/syntax/tomorrow.conf +1 -0
  42. novelwriter/assets/syntax/tomorrow_night.conf +1 -0
  43. novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
  44. novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
  45. novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
  46. novelwriter/assets/text/credits_en.htm +25 -23
  47. novelwriter/common.py +12 -4
  48. novelwriter/config.py +47 -16
  49. novelwriter/constants.py +5 -6
  50. novelwriter/core/buildsettings.py +64 -44
  51. novelwriter/core/coretools.py +97 -13
  52. novelwriter/core/docbuild.py +74 -7
  53. novelwriter/core/document.py +24 -3
  54. novelwriter/core/index.py +31 -112
  55. novelwriter/core/project.py +10 -15
  56. novelwriter/core/projectxml.py +1 -1
  57. novelwriter/core/sessions.py +2 -2
  58. novelwriter/core/spellcheck.py +3 -3
  59. novelwriter/core/status.py +6 -5
  60. novelwriter/core/storage.py +8 -2
  61. novelwriter/core/tohtml.py +22 -25
  62. novelwriter/core/tokenizer.py +417 -233
  63. novelwriter/core/tomd.py +17 -8
  64. novelwriter/core/toodt.py +386 -351
  65. novelwriter/core/tree.py +8 -8
  66. novelwriter/dialogs/about.py +9 -11
  67. novelwriter/dialogs/docmerge.py +17 -14
  68. novelwriter/dialogs/docsplit.py +20 -19
  69. novelwriter/dialogs/editlabel.py +5 -4
  70. novelwriter/dialogs/preferences.py +32 -40
  71. novelwriter/dialogs/projectsettings.py +31 -28
  72. novelwriter/dialogs/quotes.py +10 -9
  73. novelwriter/dialogs/wordlist.py +17 -14
  74. novelwriter/enum.py +17 -14
  75. novelwriter/error.py +14 -12
  76. novelwriter/extensions/circularprogress.py +12 -8
  77. novelwriter/extensions/configlayout.py +1 -3
  78. novelwriter/extensions/modified.py +51 -2
  79. novelwriter/extensions/pagedsidebar.py +16 -14
  80. novelwriter/extensions/simpleprogress.py +3 -1
  81. novelwriter/extensions/statusled.py +3 -1
  82. novelwriter/extensions/switch.py +10 -9
  83. novelwriter/extensions/switchbox.py +14 -13
  84. novelwriter/extensions/versioninfo.py +1 -1
  85. novelwriter/gui/doceditor.py +433 -496
  86. novelwriter/gui/dochighlight.py +54 -33
  87. novelwriter/gui/docviewer.py +162 -175
  88. novelwriter/gui/docviewerpanel.py +20 -37
  89. novelwriter/gui/editordocument.py +15 -4
  90. novelwriter/gui/itemdetails.py +51 -54
  91. novelwriter/gui/mainmenu.py +37 -16
  92. novelwriter/gui/noveltree.py +31 -37
  93. novelwriter/gui/outline.py +120 -98
  94. novelwriter/gui/projtree.py +61 -67
  95. novelwriter/gui/search.py +362 -0
  96. novelwriter/gui/sidebar.py +36 -45
  97. novelwriter/gui/statusbar.py +14 -14
  98. novelwriter/gui/theme.py +107 -32
  99. novelwriter/guimain.py +209 -202
  100. novelwriter/shared.py +31 -6
  101. novelwriter/text/counting.py +138 -0
  102. novelwriter/tools/dictionaries.py +15 -14
  103. novelwriter/tools/lipsum.py +20 -17
  104. novelwriter/tools/manusbuild.py +43 -35
  105. novelwriter/tools/manuscript.py +381 -104
  106. novelwriter/tools/manussettings.py +262 -125
  107. novelwriter/tools/noveldetails.py +20 -18
  108. novelwriter/tools/welcome.py +52 -49
  109. novelwriter/tools/writingstats.py +61 -55
  110. novelwriter/types.py +90 -0
  111. novelwriter/core/__init__.py +0 -3
  112. novelwriter/dialogs/__init__.py +0 -3
  113. novelwriter/extensions/__init__.py +0 -3
  114. novelwriter/gui/__init__.py +0 -3
  115. novelwriter/tools/__init__.py +0 -3
  116. {novelWriter-2.3.1.dist-info → novelWriter-2.4.dist-info}/LICENSE.md +0 -0
  117. {novelWriter-2.3.1.dist-info → novelWriter-2.4.dist-info}/WHEEL +0 -0
  118. {novelWriter-2.3.1.dist-info → novelWriter-2.4.dist-info}/entry_points.txt +0 -0
  119. {novelWriter-2.3.1.dist-info → novelWriter-2.4.dist-info}/top_level.txt +0 -0
novelwriter/core/tomd.py CHANGED
@@ -27,7 +27,7 @@ import logging
27
27
 
28
28
  from pathlib import Path
29
29
 
30
- from novelwriter.constants import nwHeadFmt, nwLabels
30
+ from novelwriter.constants import nwHeadFmt, nwLabels, nwUnicode
31
31
  from novelwriter.core.project import NWProject
32
32
  from novelwriter.core.tokenizer import Tokenizer
33
33
 
@@ -49,6 +49,7 @@ class ToMarkdown(Tokenizer):
49
49
  super().__init__(project)
50
50
  self._genMode = self.M_STD
51
51
  self._fullMD: list[str] = []
52
+ self._preserveBreaks = True
52
53
  return
53
54
 
54
55
  ##
@@ -74,6 +75,11 @@ class ToMarkdown(Tokenizer):
74
75
  self._genMode = self.M_EXT
75
76
  return
76
77
 
78
+ def setPreserveBreaks(self, state: bool) -> None:
79
+ """Preserve line breaks in paragraphs."""
80
+ self._preserveBreaks = state
81
+ return
82
+
77
83
  ##
78
84
  # Class Methods
79
85
  ##
@@ -95,11 +101,14 @@ class ToMarkdown(Tokenizer):
95
101
  self.FMT_D_E: "",
96
102
  self.FMT_U_B: "",
97
103
  self.FMT_U_E: "",
104
+ self.FMT_M_B: "",
105
+ self.FMT_M_E: "",
98
106
  self.FMT_SUP_B: "",
99
107
  self.FMT_SUP_E: "",
100
108
  self.FMT_SUB_B: "",
101
109
  self.FMT_SUB_E: "",
102
110
  }
111
+ cSkip = ""
103
112
  else:
104
113
  # Extended Markdown
105
114
  mdTags = {
@@ -111,22 +120,26 @@ class ToMarkdown(Tokenizer):
111
120
  self.FMT_D_E: "~~",
112
121
  self.FMT_U_B: "",
113
122
  self.FMT_U_E: "",
123
+ self.FMT_M_B: "==",
124
+ self.FMT_M_E: "==",
114
125
  self.FMT_SUP_B: "^",
115
126
  self.FMT_SUP_E: "^",
116
127
  self.FMT_SUB_B: "~",
117
128
  self.FMT_SUB_E: "~",
118
129
  }
130
+ cSkip = nwUnicode.U_MMSP
119
131
 
120
132
  self._result = ""
121
133
 
122
134
  para = []
123
135
  lines = []
136
+ lineSep = " \n" if self._preserveBreaks else " "
124
137
 
125
138
  for tType, _, tText, tFormat, tStyle in self._tokens:
126
139
 
127
140
  if tType == self.T_EMPTY:
128
- if len(para) > 0:
129
- tTemp = (" \n".join(para)).rstrip(" ")
141
+ if para:
142
+ tTemp = (lineSep.join(para)).rstrip(" ")
130
143
  lines.append(f"{tTemp}\n\n")
131
144
  para = []
132
145
 
@@ -134,10 +147,6 @@ class ToMarkdown(Tokenizer):
134
147
  tHead = tText.replace(nwHeadFmt.BR, "\n")
135
148
  lines.append(f"# {tHead}\n\n")
136
149
 
137
- elif tType == self.T_UNNUM:
138
- tHead = tText.replace(nwHeadFmt.BR, "\n")
139
- lines.append(f"## {tHead}\n\n")
140
-
141
150
  elif tType == self.T_HEAD1:
142
151
  tHead = tText.replace(nwHeadFmt.BR, "\n")
143
152
  lines.append(f"# {tHead}\n\n")
@@ -158,7 +167,7 @@ class ToMarkdown(Tokenizer):
158
167
  lines.append(f"{tText}\n\n")
159
168
 
160
169
  elif tType == self.T_SKIP:
161
- lines.append("\n\n\n")
170
+ lines.append(f"{cSkip}\n\n")
162
171
 
163
172
  elif tType == self.T_TEXT:
164
173
  tTemp = tText