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.
- {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/METADATA +3 -3
- {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/RECORD +105 -76
- novelwriter/__init__.py +6 -24
- novelwriter/assets/i18n/project_de_DE.json +10 -0
- novelwriter/assets/i18n/project_en_GB.json +11 -0
- novelwriter/assets/i18n/project_en_US.json +10 -0
- novelwriter/assets/i18n/project_ja_JP.json +11 -1
- novelwriter/assets/i18n/project_nb_NO.json +10 -0
- novelwriter/assets/i18n/project_nn_NO.json +10 -0
- novelwriter/assets/icons/novelwriter.ico +0 -0
- novelwriter/assets/icons/novelwriter.svg +8 -183
- novelwriter/assets/icons/typicons_dark/icons.conf +17 -2
- novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_panel.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-markdown.svg +8 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-shortcode.svg +8 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +4 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +5 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +5 -0
- novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +5 -0
- novelwriter/assets/icons/typicons_dark/typ_eye.svg +4 -0
- novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +4 -0
- novelwriter/assets/icons/typicons_light/icons.conf +17 -2
- novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_deco-note.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_panel.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-markdown.svg +8 -0
- novelwriter/assets/icons/typicons_light/nw_tb-shortcode.svg +8 -0
- novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +4 -0
- novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +5 -0
- novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +5 -0
- novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +5 -0
- novelwriter/assets/icons/typicons_light/typ_eye.svg +4 -0
- novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +4 -0
- novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
- novelwriter/assets/icons/x-novelwriter-project.svg +7 -206
- novelwriter/assets/manual.pdf +0 -0
- novelwriter/assets/sample.zip +0 -0
- novelwriter/assets/syntax/default_dark.conf +1 -0
- novelwriter/assets/syntax/default_light.conf +1 -0
- novelwriter/assets/syntax/grey_dark.conf +1 -0
- novelwriter/assets/syntax/grey_light.conf +1 -0
- novelwriter/assets/syntax/light_owl.conf +1 -0
- novelwriter/assets/syntax/night_owl.conf +1 -0
- novelwriter/assets/syntax/solarized_dark.conf +1 -0
- novelwriter/assets/syntax/solarized_light.conf +1 -0
- novelwriter/assets/syntax/tomorrow.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_blue.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_bright.conf +1 -0
- novelwriter/assets/syntax/tomorrow_night_eighties.conf +1 -0
- novelwriter/assets/text/credits_en.htm +7 -0
- novelwriter/assets/text/release_notes.htm +7 -37
- novelwriter/common.py +22 -1
- novelwriter/config.py +27 -42
- novelwriter/constants.py +45 -7
- novelwriter/core/buildsettings.py +40 -24
- novelwriter/core/coretools.py +8 -1
- novelwriter/core/docbuild.py +2 -6
- novelwriter/core/index.py +264 -175
- novelwriter/core/options.py +8 -3
- novelwriter/core/project.py +2 -2
- novelwriter/core/projectdata.py +3 -3
- novelwriter/core/tohtml.py +60 -59
- novelwriter/core/tokenizer.py +110 -70
- novelwriter/core/tomd.py +51 -38
- novelwriter/core/toodt.py +184 -147
- novelwriter/dialogs/preferences.py +75 -106
- novelwriter/dialogs/projsettings.py +101 -110
- novelwriter/dialogs/updates.py +25 -14
- novelwriter/enum.py +28 -3
- novelwriter/extensions/novelselector.py +1 -1
- novelwriter/gui/doceditor.py +1345 -1235
- novelwriter/gui/dochighlight.py +98 -62
- novelwriter/gui/docviewer.py +151 -340
- novelwriter/gui/docviewerpanel.py +457 -0
- novelwriter/gui/editordocument.py +126 -0
- novelwriter/gui/mainmenu.py +350 -300
- novelwriter/gui/noveltree.py +101 -125
- novelwriter/gui/outline.py +154 -171
- novelwriter/gui/projtree.py +480 -380
- novelwriter/gui/sidebar.py +106 -75
- novelwriter/gui/statusbar.py +1 -1
- novelwriter/gui/theme.py +114 -75
- novelwriter/guimain.py +353 -254
- novelwriter/shared.py +36 -3
- novelwriter/tools/dictionaries.py +268 -0
- novelwriter/tools/manusbuild.py +17 -6
- novelwriter/tools/manuscript.py +11 -3
- novelwriter/tools/manussettings.py +0 -14
- novelwriter/tools/projwizard.py +16 -2
- novelwriter/tools/writingstats.py +1 -1
- novelwriter/assets/icons/typicons_dark/typ_at.svg +0 -4
- novelwriter/assets/icons/typicons_dark/typ_th-menu.svg +0 -4
- novelwriter/assets/icons/typicons_light/typ_at.svg +0 -4
- novelwriter/assets/icons/typicons_light/typ_th-menu.svg +0 -4
- {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/LICENSE.md +0 -0
- {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/WHEEL +0 -0
- {novelWriter-2.1.1.dist-info → novelWriter-2.2rc1.dist-info}/entry_points.txt +0 -0
- {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
|
42
|
-
|
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
|
-
|
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
|
72
|
-
|
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(
|
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
|
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
|
-
#
|
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
|
-
|
111
|
-
|
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(
|
118
|
-
tTemp = (" \n".join(
|
119
|
-
|
120
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
155
|
+
lines.append(f"#### {tHead}\n\n")
|
145
156
|
|
146
157
|
elif tType == self.T_SEP:
|
147
|
-
|
158
|
+
lines.append(f"{tText}\n\n")
|
148
159
|
|
149
160
|
elif tType == self.T_SKIP:
|
150
|
-
|
161
|
+
lines.append("\n\n\n")
|
151
162
|
|
152
163
|
elif tType == self.T_TEXT:
|
153
164
|
tTemp = tText
|
154
|
-
for
|
155
|
-
tTemp = tTemp[:
|
156
|
-
|
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
|
-
|
160
|
-
|
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
|
-
|
164
|
-
|
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
|
-
|
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
|
|