novelWriter 2.1.1__py3-none-any.whl → 2.2rc1__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 (109) hide show
  1. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/METADATA +3 -3
  2. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/RECORD +105 -76
  3. novelwriter/__init__.py +6 -24
  4. novelwriter/assets/i18n/project_de_DE.json +10 -0
  5. novelwriter/assets/i18n/project_en_GB.json +11 -0
  6. novelwriter/assets/i18n/project_en_US.json +10 -0
  7. novelwriter/assets/i18n/project_ja_JP.json +11 -1
  8. novelwriter/assets/i18n/project_nb_NO.json +10 -0
  9. novelwriter/assets/i18n/project_nn_NO.json +10 -0
  10. novelwriter/assets/icons/novelwriter.ico +0 -0
  11. novelwriter/assets/icons/novelwriter.svg +8 -183
  12. novelwriter/assets/icons/typicons_dark/icons.conf +17 -2
  13. novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +4 -0
  14. novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +4 -0
  15. novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +4 -0
  16. novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +4 -0
  17. novelwriter/assets/icons/typicons_dark/nw_panel.svg +4 -0
  18. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +4 -0
  19. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +4 -0
  20. novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +8 -0
  21. novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +8 -0
  22. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +4 -0
  23. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +5 -0
  24. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +5 -0
  25. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +5 -0
  26. novelwriter/assets/icons/typicons_dark/typ_eye.svg +4 -0
  27. novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +4 -0
  28. novelwriter/assets/icons/typicons_light/icons.conf +17 -2
  29. novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +4 -0
  30. novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +4 -0
  31. novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +4 -0
  32. novelwriter/assets/icons/typicons_light/nw_deco-note.svg +4 -0
  33. novelwriter/assets/icons/typicons_light/nw_panel.svg +4 -0
  34. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +4 -0
  35. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +4 -0
  36. novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +8 -0
  37. novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +8 -0
  38. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +4 -0
  39. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +5 -0
  40. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +5 -0
  41. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +5 -0
  42. novelwriter/assets/icons/typicons_light/typ_eye.svg +4 -0
  43. novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +4 -0
  44. novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
  45. novelwriter/assets/icons/x-novelwriter-project.svg +7 -206
  46. novelwriter/assets/manual.pdf +0 -0
  47. novelwriter/assets/sample.zip +0 -0
  48. novelwriter/assets/syntax/default_dark.conf +1 -0
  49. novelwriter/assets/syntax/default_light.conf +1 -0
  50. novelwriter/assets/syntax/grey_dark.conf +1 -0
  51. novelwriter/assets/syntax/grey_light.conf +1 -0
  52. novelwriter/assets/syntax/light_owl.conf +1 -0
  53. novelwriter/assets/syntax/night_owl.conf +1 -0
  54. novelwriter/assets/syntax/solarized_dark.conf +1 -0
  55. novelwriter/assets/syntax/solarized_light.conf +1 -0
  56. novelwriter/assets/syntax/tomorrow.conf +1 -0
  57. novelwriter/assets/syntax/tomorrow_night.conf +1 -0
  58. novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
  59. novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
  60. novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
  61. novelwriter/assets/text/credits_en.htm +7 -0
  62. novelwriter/assets/text/release_notes.htm +7 -37
  63. novelwriter/common.py +22 -1
  64. novelwriter/config.py +27 -42
  65. novelwriter/constants.py +45 -7
  66. novelwriter/core/buildsettings.py +40 -24
  67. novelwriter/core/coretools.py +8 -1
  68. novelwriter/core/docbuild.py +2 -6
  69. novelwriter/core/index.py +264 -175
  70. novelwriter/core/options.py +8 -3
  71. novelwriter/core/project.py +2 -2
  72. novelwriter/core/projectdata.py +3 -3
  73. novelwriter/core/tohtml.py +60 -59
  74. novelwriter/core/tokenizer.py +110 -70
  75. novelwriter/core/tomd.py +51 -38
  76. novelwriter/core/toodt.py +184 -147
  77. novelwriter/dialogs/preferences.py +75 -106
  78. novelwriter/dialogs/projsettings.py +101 -110
  79. novelwriter/dialogs/updates.py +25 -14
  80. novelwriter/enum.py +28 -3
  81. novelwriter/extensions/novelselector.py +1 -1
  82. novelwriter/gui/doceditor.py +1345 -1235
  83. novelwriter/gui/dochighlight.py +98 -62
  84. novelwriter/gui/docviewer.py +151 -340
  85. novelwriter/gui/docviewerpanel.py +457 -0
  86. novelwriter/gui/editordocument.py +126 -0
  87. novelwriter/gui/mainmenu.py +350 -300
  88. novelwriter/gui/noveltree.py +101 -125
  89. novelwriter/gui/outline.py +154 -171
  90. novelwriter/gui/projtree.py +480 -380
  91. novelwriter/gui/sidebar.py +106 -75
  92. novelwriter/gui/statusbar.py +1 -1
  93. novelwriter/gui/theme.py +114 -75
  94. novelwriter/guimain.py +353 -254
  95. novelwriter/shared.py +36 -3
  96. novelwriter/tools/dictionaries.py +268 -0
  97. novelwriter/tools/manusbuild.py +17 -6
  98. novelwriter/tools/manuscript.py +11 -3
  99. novelwriter/tools/manussettings.py +0 -14
  100. novelwriter/tools/projwizard.py +16 -2
  101. novelwriter/tools/writingstats.py +1 -1
  102. novelwriter/assets/icons/typicons_dark/typ_at.svg +0 -4
  103. novelwriter/assets/icons/typicons_dark/typ_th-menu.svg +0 -4
  104. novelwriter/assets/icons/typicons_light/typ_at.svg +0 -4
  105. novelwriter/assets/icons/typicons_light/typ_th-menu.svg +0 -4
  106. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/LICENSE.md +0 -0
  107. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/WHEEL +0 -0
  108. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/entry_points.txt +0 -0
  109. {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/top_level.txt +0 -0
novelwriter/core/tomd.py CHANGED
@@ -38,12 +38,12 @@ class ToMarkdown(Tokenizer):
38
38
  """Core: Markdown Document Writer
39
39
 
40
40
  Extend the Tokenizer class to writer Markdown output. It supports
41
- both Standard Markdown and GitHub Flavour Markdown (Extended). The
42
- class also supports concatenating novelWriter markup files.
41
+ both Standard Markdown and Extended Markdown. The class also
42
+ supports concatenating novelWriter markup files.
43
43
  """
44
44
 
45
45
  M_STD = 0 # Standard Markdown
46
- M_GH = 1 # GitHub Markdown
46
+ M_EXT = 1 # Extended Markdown
47
47
 
48
48
  def __init__(self, project: NWProject) -> None:
49
49
  super().__init__(project)
@@ -65,11 +65,13 @@ class ToMarkdown(Tokenizer):
65
65
  ##
66
66
 
67
67
  def setStandardMarkdown(self) -> None:
68
+ """Set the converter to use standard Markdown formatting."""
68
69
  self._genMode = self.M_STD
69
70
  return
70
71
 
71
- def setGitHubMarkdown(self) -> None:
72
- self._genMode = self.M_GH
72
+ def setExtendedMarkdown(self) -> None:
73
+ """Set the converter to use Extended Markdown formatting."""
74
+ self._genMode = self.M_EXT
73
75
  return
74
76
 
75
77
  ##
@@ -78,14 +80,12 @@ class ToMarkdown(Tokenizer):
78
80
 
79
81
  def getFullResultSize(self) -> int:
80
82
  """Return the size of the full Markdown result."""
81
- return sum([len(x) for x in self._fullMD])
83
+ return sum(len(x) for x in self._fullMD)
82
84
 
83
85
  def doConvert(self) -> None:
84
- """Convert the list of text tokens into a HTML document saved
85
- to theResult.
86
- """
86
+ """Convert the list of text tokens into a Markdown document."""
87
87
  if self._genMode == self.M_STD:
88
- # Standard
88
+ # Standard Markdown
89
89
  mdTags = {
90
90
  self.FMT_B_B: "**",
91
91
  self.FMT_B_E: "**",
@@ -93,9 +93,15 @@ class ToMarkdown(Tokenizer):
93
93
  self.FMT_I_E: "_",
94
94
  self.FMT_D_B: "",
95
95
  self.FMT_D_E: "",
96
+ self.FMT_U_B: "",
97
+ self.FMT_U_E: "",
98
+ self.FMT_SUP_B: "",
99
+ self.FMT_SUP_E: "",
100
+ self.FMT_SUB_B: "",
101
+ self.FMT_SUB_E: "",
96
102
  }
97
103
  else:
98
- # GitHub
104
+ # Extended Markdown
99
105
  mdTags = {
100
106
  self.FMT_B_B: "**",
101
107
  self.FMT_B_E: "**",
@@ -103,72 +109,79 @@ class ToMarkdown(Tokenizer):
103
109
  self.FMT_I_E: "_",
104
110
  self.FMT_D_B: "~~",
105
111
  self.FMT_D_E: "~~",
112
+ self.FMT_U_B: "",
113
+ self.FMT_U_E: "",
114
+ self.FMT_SUP_B: "^",
115
+ self.FMT_SUP_E: "^",
116
+ self.FMT_SUB_B: "~",
117
+ self.FMT_SUB_E: "~",
106
118
  }
107
119
 
108
120
  self._result = ""
109
121
 
110
- thisPar = []
111
- tmpResult = []
122
+ para = []
123
+ lines = []
112
124
 
113
125
  for tType, _, tText, tFormat, tStyle in self._tokens:
114
126
 
115
- # Process Text Type
116
127
  if tType == self.T_EMPTY:
117
- if len(thisPar) > 0:
118
- tTemp = (" \n".join(thisPar)).rstrip(" ")
119
- tmpResult.append(f"{tTemp}\n\n")
120
- thisPar = []
128
+ if len(para) > 0:
129
+ tTemp = (" \n".join(para)).rstrip(" ")
130
+ lines.append(f"{tTemp}\n\n")
131
+ para = []
121
132
 
122
133
  elif tType == self.T_TITLE:
123
134
  tHead = tText.replace(nwHeadFmt.BR, "\n")
124
- tmpResult.append(f"# {tHead}\n\n")
135
+ lines.append(f"# {tHead}\n\n")
125
136
 
126
137
  elif tType == self.T_UNNUM:
127
138
  tHead = tText.replace(nwHeadFmt.BR, "\n")
128
- tmpResult.append(f"## {tHead}\n\n")
139
+ lines.append(f"## {tHead}\n\n")
129
140
 
130
141
  elif tType == self.T_HEAD1:
131
142
  tHead = tText.replace(nwHeadFmt.BR, "\n")
132
- tmpResult.append(f"# {tHead}\n\n")
143
+ lines.append(f"# {tHead}\n\n")
133
144
 
134
145
  elif tType == self.T_HEAD2:
135
146
  tHead = tText.replace(nwHeadFmt.BR, "\n")
136
- tmpResult.append(f"## {tHead}\n\n")
147
+ lines.append(f"## {tHead}\n\n")
137
148
 
138
149
  elif tType == self.T_HEAD3:
139
150
  tHead = tText.replace(nwHeadFmt.BR, "\n")
140
- tmpResult.append(f"### {tHead}\n\n")
151
+ lines.append(f"### {tHead}\n\n")
141
152
 
142
153
  elif tType == self.T_HEAD4:
143
154
  tHead = tText.replace(nwHeadFmt.BR, "\n")
144
- tmpResult.append(f"#### {tHead}\n\n")
155
+ lines.append(f"#### {tHead}\n\n")
145
156
 
146
157
  elif tType == self.T_SEP:
147
- tmpResult.append("%s\n\n" % tText)
158
+ lines.append(f"{tText}\n\n")
148
159
 
149
160
  elif tType == self.T_SKIP:
150
- tmpResult.append("\n\n\n")
161
+ lines.append("\n\n\n")
151
162
 
152
163
  elif tType == self.T_TEXT:
153
164
  tTemp = tText
154
- for xPos, xLen, xFmt in reversed(tFormat):
155
- tTemp = tTemp[:xPos] + mdTags[xFmt] + tTemp[xPos+xLen:]
156
- thisPar.append(tTemp.rstrip())
165
+ for pos, fmt in reversed(tFormat):
166
+ tTemp = f"{tTemp[:pos]}{mdTags[fmt]}{tTemp[pos:]}"
167
+ para.append(tTemp.rstrip())
157
168
 
158
169
  elif tType == self.T_SYNOPSIS and self._doSynopsis:
159
- locName = self._localLookup("Synopsis")
160
- tmpResult.append(f"**{locName}:** {tText}\n\n")
170
+ label = self._localLookup("Synopsis")
171
+ lines.append(f"**{label}:** {tText}\n\n")
172
+
173
+ elif tType == self.T_SHORT and self._doSynopsis:
174
+ label = self._localLookup("Short Description")
175
+ lines.append(f"**{label}:** {tText}\n\n")
161
176
 
162
177
  elif tType == self.T_COMMENT and self._doComments:
163
- locName = self._localLookup("Comment")
164
- tmpResult.append(f"**{locName}:** {tText}\n\n")
178
+ label = self._localLookup("Comment")
179
+ lines.append(f"**{label}:** {tText}\n\n")
165
180
 
166
181
  elif tType == self.T_KEYWORD and self._doKeywords:
167
- tmpResult.append(self._formatKeywords(tText, tStyle))
168
-
169
- self._result = "".join(tmpResult)
170
- tmpResult = []
182
+ lines.append(self._formatKeywords(tText, tStyle))
171
183
 
184
+ self._result = "".join(lines)
172
185
  self._fullMD.append(self._result)
173
186
 
174
187
  return
@@ -200,7 +213,7 @@ class ToMarkdown(Tokenizer):
200
213
 
201
214
  result = ""
202
215
  if bits[0] in nwLabels.KEY_NAME:
203
- result += f"**{nwLabels.KEY_NAME[bits[0]]}:** "
216
+ result += f"**{self._localLookup(nwLabels.KEY_NAME[bits[0]])}:** "
204
217
  if len(bits) > 1:
205
218
  result += ", ".join(bits[1:])
206
219