novelWriter 2.6.2__py3-none-any.whl → 2.7__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 (348) hide show
  1. novelwriter/__init__.py +98 -75
  2. novelwriter/assets/i18n/nw_cs_CZ.qm +0 -0
  3. novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  4. novelwriter/assets/i18n/nw_en_US.qm +0 -0
  5. novelwriter/assets/i18n/nw_es_419.qm +0 -0
  6. novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  7. novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  8. novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  9. novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  10. novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  11. novelwriter/assets/i18n/nw_pl_PL.qm +0 -0
  12. novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  13. novelwriter/assets/i18n/nw_ru_RU.qm +0 -0
  14. novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  15. novelwriter/assets/i18n/project_de_DE.json +3 -1
  16. novelwriter/assets/i18n/project_en_GB.json +2 -0
  17. novelwriter/assets/i18n/project_en_US.json +2 -0
  18. novelwriter/assets/i18n/project_it_IT.json +2 -0
  19. novelwriter/assets/i18n/project_ja_JP.json +2 -0
  20. novelwriter/assets/i18n/project_nb_NO.json +2 -0
  21. novelwriter/assets/i18n/project_nn_NO.json +5 -0
  22. novelwriter/assets/i18n/project_pl_PL.json +2 -0
  23. novelwriter/assets/i18n/project_pt_BR.json +2 -0
  24. novelwriter/assets/i18n/project_ru_RU.json +2 -0
  25. novelwriter/assets/i18n/project_zh_CN.json +2 -0
  26. novelwriter/assets/icons/font_awesome.icons +109 -0
  27. novelwriter/assets/icons/material_filled_bold.icons +109 -0
  28. novelwriter/assets/icons/material_filled_normal.icons +109 -0
  29. novelwriter/assets/icons/material_filled_thin.icons +109 -0
  30. novelwriter/assets/icons/material_rounded_bold.icons +109 -0
  31. novelwriter/assets/icons/material_rounded_normal.icons +109 -0
  32. novelwriter/assets/icons/material_rounded_thin.icons +109 -0
  33. novelwriter/assets/icons/remix_filled.icons +109 -0
  34. novelwriter/assets/icons/remix_outline.icons +109 -0
  35. novelwriter/assets/images/splash.png +0 -0
  36. novelwriter/assets/manual.pdf +0 -0
  37. novelwriter/assets/{manual_fr_FR.pdf → manual_fr.pdf} +0 -0
  38. novelwriter/assets/sample.zip +0 -0
  39. novelwriter/assets/syntax/cyberpunk_night.conf +1 -1
  40. novelwriter/assets/syntax/snazzy.conf +3 -3
  41. novelwriter/assets/text/credits_en.htm +12 -6
  42. novelwriter/assets/themes/cyberpunk_night.conf +23 -7
  43. novelwriter/assets/themes/default_dark.conf +20 -4
  44. novelwriter/assets/themes/default_light.conf +21 -5
  45. novelwriter/assets/themes/dracula.conf +20 -4
  46. novelwriter/assets/themes/snazzy.conf +48 -0
  47. novelwriter/assets/themes/solarized_dark.conf +24 -8
  48. novelwriter/assets/themes/solarized_light.conf +22 -6
  49. novelwriter/common.py +43 -27
  50. novelwriter/config.py +201 -139
  51. novelwriter/constants.py +92 -56
  52. novelwriter/core/buildsettings.py +26 -17
  53. novelwriter/core/coretools.py +52 -41
  54. novelwriter/core/docbuild.py +20 -13
  55. novelwriter/core/document.py +2 -2
  56. novelwriter/core/index.py +166 -432
  57. novelwriter/core/indexdata.py +406 -0
  58. novelwriter/core/item.py +50 -32
  59. novelwriter/core/itemmodel.py +43 -38
  60. novelwriter/core/novelmodel.py +225 -0
  61. novelwriter/core/options.py +1 -1
  62. novelwriter/core/project.py +24 -25
  63. novelwriter/core/projectdata.py +47 -29
  64. novelwriter/core/projectxml.py +18 -8
  65. novelwriter/core/sessions.py +32 -15
  66. novelwriter/core/spellcheck.py +4 -3
  67. novelwriter/core/status.py +12 -15
  68. novelwriter/core/storage.py +1 -1
  69. novelwriter/core/tree.py +55 -13
  70. novelwriter/dialogs/about.py +19 -22
  71. novelwriter/dialogs/docmerge.py +23 -24
  72. novelwriter/dialogs/docsplit.py +26 -26
  73. novelwriter/dialogs/editlabel.py +19 -20
  74. novelwriter/dialogs/preferences.py +143 -69
  75. novelwriter/dialogs/projectsettings.py +51 -54
  76. novelwriter/dialogs/quotes.py +14 -19
  77. novelwriter/dialogs/wordlist.py +25 -30
  78. novelwriter/enum.py +8 -0
  79. novelwriter/error.py +16 -16
  80. novelwriter/extensions/configlayout.py +24 -20
  81. novelwriter/extensions/eventfilters.py +9 -5
  82. novelwriter/extensions/modified.py +34 -15
  83. novelwriter/extensions/novelselector.py +18 -5
  84. novelwriter/extensions/pagedsidebar.py +39 -49
  85. novelwriter/extensions/progressbars.py +10 -8
  86. novelwriter/extensions/statusled.py +6 -13
  87. novelwriter/extensions/switch.py +31 -41
  88. novelwriter/extensions/switchbox.py +8 -3
  89. novelwriter/extensions/versioninfo.py +4 -4
  90. novelwriter/formats/shared.py +1 -1
  91. novelwriter/formats/todocx.py +14 -10
  92. novelwriter/formats/tohtml.py +7 -5
  93. novelwriter/formats/tokenizer.py +37 -33
  94. novelwriter/formats/tomarkdown.py +6 -2
  95. novelwriter/formats/toodt.py +27 -22
  96. novelwriter/formats/toqdoc.py +19 -14
  97. novelwriter/formats/toraw.py +6 -2
  98. novelwriter/gui/doceditor.py +314 -305
  99. novelwriter/gui/dochighlight.py +46 -45
  100. novelwriter/gui/docviewer.py +102 -104
  101. novelwriter/gui/docviewerpanel.py +47 -51
  102. novelwriter/gui/editordocument.py +8 -5
  103. novelwriter/gui/itemdetails.py +15 -18
  104. novelwriter/gui/mainmenu.py +147 -146
  105. novelwriter/gui/noveltree.py +246 -406
  106. novelwriter/gui/outline.py +145 -76
  107. novelwriter/gui/projtree.py +139 -132
  108. novelwriter/gui/search.py +34 -31
  109. novelwriter/gui/sidebar.py +13 -18
  110. novelwriter/gui/statusbar.py +27 -21
  111. novelwriter/gui/theme.py +554 -436
  112. novelwriter/guimain.py +56 -38
  113. novelwriter/shared.py +32 -23
  114. novelwriter/splash.py +74 -0
  115. novelwriter/text/comments.py +70 -0
  116. novelwriter/text/patterns.py +4 -4
  117. novelwriter/tools/dictionaries.py +20 -29
  118. novelwriter/tools/lipsum.py +18 -18
  119. novelwriter/tools/manusbuild.py +39 -42
  120. novelwriter/tools/manuscript.py +114 -127
  121. novelwriter/tools/manussettings.py +129 -102
  122. novelwriter/tools/noveldetails.py +60 -72
  123. novelwriter/tools/welcome.py +57 -75
  124. novelwriter/tools/writingstats.py +112 -102
  125. novelwriter/types.py +5 -7
  126. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/METADATA +6 -6
  127. novelwriter-2.7.dist-info/RECORD +162 -0
  128. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/WHEEL +1 -1
  129. novelWriter-2.6.2.dist-info/RECORD +0 -363
  130. novelwriter/assets/icons/typicons_dark/README.md +0 -29
  131. novelwriter/assets/icons/typicons_dark/icons.conf +0 -134
  132. novelwriter/assets/icons/typicons_dark/mixed_copy.svg +0 -4
  133. novelwriter/assets/icons/typicons_dark/mixed_document-chapter.svg +0 -12
  134. novelwriter/assets/icons/typicons_dark/mixed_document-new.svg +0 -6
  135. novelwriter/assets/icons/typicons_dark/mixed_document-note.svg +0 -12
  136. novelwriter/assets/icons/typicons_dark/mixed_document-scene.svg +0 -12
  137. novelwriter/assets/icons/typicons_dark/mixed_document-section.svg +0 -12
  138. novelwriter/assets/icons/typicons_dark/mixed_document-title.svg +0 -12
  139. novelwriter/assets/icons/typicons_dark/mixed_edit.svg +0 -4
  140. novelwriter/assets/icons/typicons_dark/mixed_import.svg +0 -5
  141. novelwriter/assets/icons/typicons_dark/mixed_input-checked.svg +0 -5
  142. novelwriter/assets/icons/typicons_dark/mixed_input-none.svg +0 -5
  143. novelwriter/assets/icons/typicons_dark/mixed_input-unchecked.svg +0 -5
  144. novelwriter/assets/icons/typicons_dark/mixed_margin-bottom.svg +0 -6
  145. novelwriter/assets/icons/typicons_dark/mixed_margin-left.svg +0 -6
  146. novelwriter/assets/icons/typicons_dark/mixed_margin-right.svg +0 -6
  147. novelwriter/assets/icons/typicons_dark/mixed_margin-top.svg +0 -6
  148. novelwriter/assets/icons/typicons_dark/mixed_search-replace.svg +0 -6
  149. novelwriter/assets/icons/typicons_dark/mixed_size-height.svg +0 -6
  150. novelwriter/assets/icons/typicons_dark/mixed_size-width.svg +0 -6
  151. novelwriter/assets/icons/typicons_dark/nw_deco-h0.svg +0 -4
  152. novelwriter/assets/icons/typicons_dark/nw_deco-h1.svg +0 -4
  153. novelwriter/assets/icons/typicons_dark/nw_deco-h2-narrow.svg +0 -4
  154. novelwriter/assets/icons/typicons_dark/nw_deco-h2.svg +0 -4
  155. novelwriter/assets/icons/typicons_dark/nw_deco-h3-narrow.svg +0 -4
  156. novelwriter/assets/icons/typicons_dark/nw_deco-h3.svg +0 -4
  157. novelwriter/assets/icons/typicons_dark/nw_deco-h4-narrow.svg +0 -4
  158. novelwriter/assets/icons/typicons_dark/nw_deco-h4.svg +0 -4
  159. novelwriter/assets/icons/typicons_dark/nw_deco-note.svg +0 -4
  160. novelwriter/assets/icons/typicons_dark/nw_deco-noveltree-more.svg +0 -4
  161. novelwriter/assets/icons/typicons_dark/nw_font.svg +0 -4
  162. novelwriter/assets/icons/typicons_dark/nw_panel.svg +0 -4
  163. novelwriter/assets/icons/typicons_dark/nw_quote.svg +0 -4
  164. novelwriter/assets/icons/typicons_dark/nw_search-case.svg +0 -4
  165. novelwriter/assets/icons/typicons_dark/nw_search-preserve.svg +0 -4
  166. novelwriter/assets/icons/typicons_dark/nw_search-regex.svg +0 -4
  167. novelwriter/assets/icons/typicons_dark/nw_search-word.svg +0 -4
  168. novelwriter/assets/icons/typicons_dark/nw_tb-bold-md.svg +0 -4
  169. novelwriter/assets/icons/typicons_dark/nw_tb-bold.svg +0 -6
  170. novelwriter/assets/icons/typicons_dark/nw_tb-italic-md.svg +0 -4
  171. novelwriter/assets/icons/typicons_dark/nw_tb-italic.svg +0 -6
  172. novelwriter/assets/icons/typicons_dark/nw_tb-mark.svg +0 -7
  173. novelwriter/assets/icons/typicons_dark/nw_tb-strike-md.svg +0 -4
  174. novelwriter/assets/icons/typicons_dark/nw_tb-strike.svg +0 -6
  175. novelwriter/assets/icons/typicons_dark/nw_tb-subscript.svg +0 -7
  176. novelwriter/assets/icons/typicons_dark/nw_tb-superscript.svg +0 -7
  177. novelwriter/assets/icons/typicons_dark/nw_tb-underline.svg +0 -7
  178. novelwriter/assets/icons/typicons_dark/nw_toolbar.svg +0 -5
  179. novelwriter/assets/icons/typicons_dark/typ_arrow-down-thick-grey.svg +0 -4
  180. novelwriter/assets/icons/typicons_dark/typ_arrow-forward.svg +0 -4
  181. novelwriter/assets/icons/typicons_dark/typ_arrow-maximise.svg +0 -4
  182. novelwriter/assets/icons/typicons_dark/typ_arrow-minimise.svg +0 -4
  183. novelwriter/assets/icons/typicons_dark/typ_arrow-repeat-grey.svg +0 -4
  184. novelwriter/assets/icons/typicons_dark/typ_book-grey.svg +0 -4
  185. novelwriter/assets/icons/typicons_dark/typ_book.svg +0 -6
  186. novelwriter/assets/icons/typicons_dark/typ_bookmark.svg +0 -4
  187. novelwriter/assets/icons/typicons_dark/typ_calendar.svg +0 -4
  188. novelwriter/assets/icons/typicons_dark/typ_cancel-grey.svg +0 -4
  189. novelwriter/assets/icons/typicons_dark/typ_cancel.svg +0 -4
  190. novelwriter/assets/icons/typicons_dark/typ_chart-bar-grey.svg +0 -4
  191. novelwriter/assets/icons/typicons_dark/typ_chevron-down.svg +0 -4
  192. novelwriter/assets/icons/typicons_dark/typ_chevron-left.svg +0 -4
  193. novelwriter/assets/icons/typicons_dark/typ_chevron-right.svg +0 -4
  194. novelwriter/assets/icons/typicons_dark/typ_chevron-up.svg +0 -4
  195. novelwriter/assets/icons/typicons_dark/typ_cog.svg +0 -4
  196. novelwriter/assets/icons/typicons_dark/typ_delete-full.svg +0 -4
  197. novelwriter/assets/icons/typicons_dark/typ_delete.svg +0 -4
  198. novelwriter/assets/icons/typicons_dark/typ_directions-full.svg +0 -4
  199. novelwriter/assets/icons/typicons_dark/typ_document-add.svg +0 -4
  200. novelwriter/assets/icons/typicons_dark/typ_document-text.svg +0 -8
  201. novelwriter/assets/icons/typicons_dark/typ_document.svg +0 -4
  202. novelwriter/assets/icons/typicons_dark/typ_export-grey.svg +0 -4
  203. novelwriter/assets/icons/typicons_dark/typ_export.svg +0 -4
  204. novelwriter/assets/icons/typicons_dark/typ_eye.svg +0 -4
  205. novelwriter/assets/icons/typicons_dark/typ_flag.svg +0 -4
  206. novelwriter/assets/icons/typicons_dark/typ_folder-open.svg +0 -4
  207. novelwriter/assets/icons/typicons_dark/typ_folder.svg +0 -5
  208. novelwriter/assets/icons/typicons_dark/typ_globe-grey.svg +0 -4
  209. novelwriter/assets/icons/typicons_dark/typ_key.svg +0 -4
  210. novelwriter/assets/icons/typicons_dark/typ_lightbulb-full.svg +0 -4
  211. novelwriter/assets/icons/typicons_dark/typ_location.svg +0 -4
  212. novelwriter/assets/icons/typicons_dark/typ_media-pause-grey.svg +0 -4
  213. novelwriter/assets/icons/typicons_dark/typ_media-record-outline.svg +0 -4
  214. novelwriter/assets/icons/typicons_dark/typ_media-record.svg +0 -4
  215. novelwriter/assets/icons/typicons_dark/typ_minus.svg +0 -4
  216. novelwriter/assets/icons/typicons_dark/typ_pencil.svg +0 -5
  217. novelwriter/assets/icons/typicons_dark/typ_pin-outline.svg +0 -4
  218. novelwriter/assets/icons/typicons_dark/typ_pin.svg +0 -4
  219. novelwriter/assets/icons/typicons_dark/typ_plus.svg +0 -4
  220. novelwriter/assets/icons/typicons_dark/typ_puzzle-outline.svg +0 -4
  221. novelwriter/assets/icons/typicons_dark/typ_puzzle.svg +0 -4
  222. novelwriter/assets/icons/typicons_dark/typ_refresh-flipped.svg +0 -4
  223. novelwriter/assets/icons/typicons_dark/typ_refresh.svg +0 -4
  224. novelwriter/assets/icons/typicons_dark/typ_search-grey.svg +0 -4
  225. novelwriter/assets/icons/typicons_dark/typ_search.svg +0 -4
  226. novelwriter/assets/icons/typicons_dark/typ_star.svg +0 -4
  227. novelwriter/assets/icons/typicons_dark/typ_stopwatch-grey.svg +0 -4
  228. novelwriter/assets/icons/typicons_dark/typ_th-dot-menu.svg +0 -4
  229. novelwriter/assets/icons/typicons_dark/typ_th-dot-more.svg +0 -4
  230. novelwriter/assets/icons/typicons_dark/typ_th-list-grey.svg +0 -4
  231. novelwriter/assets/icons/typicons_dark/typ_th-list.svg +0 -9
  232. novelwriter/assets/icons/typicons_dark/typ_times.svg +0 -4
  233. novelwriter/assets/icons/typicons_dark/typ_trash.svg +0 -5
  234. novelwriter/assets/icons/typicons_dark/typ_unfold-hidden.svg +0 -4
  235. novelwriter/assets/icons/typicons_dark/typ_unfold-visible.svg +0 -4
  236. novelwriter/assets/icons/typicons_dark/typ_user.svg +0 -5
  237. novelwriter/assets/icons/typicons_dark/typ_warning-full.svg +0 -4
  238. novelwriter/assets/icons/typicons_light/README.md +0 -29
  239. novelwriter/assets/icons/typicons_light/icons.conf +0 -134
  240. novelwriter/assets/icons/typicons_light/mixed_copy.svg +0 -4
  241. novelwriter/assets/icons/typicons_light/mixed_document-chapter.svg +0 -12
  242. novelwriter/assets/icons/typicons_light/mixed_document-new.svg +0 -6
  243. novelwriter/assets/icons/typicons_light/mixed_document-note.svg +0 -12
  244. novelwriter/assets/icons/typicons_light/mixed_document-scene.svg +0 -12
  245. novelwriter/assets/icons/typicons_light/mixed_document-section.svg +0 -12
  246. novelwriter/assets/icons/typicons_light/mixed_document-title.svg +0 -12
  247. novelwriter/assets/icons/typicons_light/mixed_edit.svg +0 -4
  248. novelwriter/assets/icons/typicons_light/mixed_import.svg +0 -5
  249. novelwriter/assets/icons/typicons_light/mixed_input-checked.svg +0 -5
  250. novelwriter/assets/icons/typicons_light/mixed_input-none.svg +0 -5
  251. novelwriter/assets/icons/typicons_light/mixed_input-unchecked.svg +0 -5
  252. novelwriter/assets/icons/typicons_light/mixed_margin-bottom.svg +0 -6
  253. novelwriter/assets/icons/typicons_light/mixed_margin-left.svg +0 -6
  254. novelwriter/assets/icons/typicons_light/mixed_margin-right.svg +0 -6
  255. novelwriter/assets/icons/typicons_light/mixed_margin-top.svg +0 -6
  256. novelwriter/assets/icons/typicons_light/mixed_search-replace.svg +0 -6
  257. novelwriter/assets/icons/typicons_light/mixed_size-height.svg +0 -6
  258. novelwriter/assets/icons/typicons_light/mixed_size-width.svg +0 -6
  259. novelwriter/assets/icons/typicons_light/nw_deco-h0.svg +0 -4
  260. novelwriter/assets/icons/typicons_light/nw_deco-h1.svg +0 -4
  261. novelwriter/assets/icons/typicons_light/nw_deco-h2-narrow.svg +0 -4
  262. novelwriter/assets/icons/typicons_light/nw_deco-h2.svg +0 -4
  263. novelwriter/assets/icons/typicons_light/nw_deco-h3-narrow.svg +0 -4
  264. novelwriter/assets/icons/typicons_light/nw_deco-h3.svg +0 -4
  265. novelwriter/assets/icons/typicons_light/nw_deco-h4-narrow.svg +0 -4
  266. novelwriter/assets/icons/typicons_light/nw_deco-h4.svg +0 -4
  267. novelwriter/assets/icons/typicons_light/nw_deco-note.svg +0 -4
  268. novelwriter/assets/icons/typicons_light/nw_deco-noveltree-more.svg +0 -4
  269. novelwriter/assets/icons/typicons_light/nw_font.svg +0 -4
  270. novelwriter/assets/icons/typicons_light/nw_panel.svg +0 -4
  271. novelwriter/assets/icons/typicons_light/nw_quote.svg +0 -4
  272. novelwriter/assets/icons/typicons_light/nw_search-case.svg +0 -4
  273. novelwriter/assets/icons/typicons_light/nw_search-preserve.svg +0 -4
  274. novelwriter/assets/icons/typicons_light/nw_search-regex.svg +0 -4
  275. novelwriter/assets/icons/typicons_light/nw_search-word.svg +0 -4
  276. novelwriter/assets/icons/typicons_light/nw_tb-bold-md.svg +0 -4
  277. novelwriter/assets/icons/typicons_light/nw_tb-bold.svg +0 -6
  278. novelwriter/assets/icons/typicons_light/nw_tb-italic-md.svg +0 -4
  279. novelwriter/assets/icons/typicons_light/nw_tb-italic.svg +0 -6
  280. novelwriter/assets/icons/typicons_light/nw_tb-mark.svg +0 -7
  281. novelwriter/assets/icons/typicons_light/nw_tb-strike-md.svg +0 -4
  282. novelwriter/assets/icons/typicons_light/nw_tb-strike.svg +0 -6
  283. novelwriter/assets/icons/typicons_light/nw_tb-subscript.svg +0 -7
  284. novelwriter/assets/icons/typicons_light/nw_tb-superscript.svg +0 -7
  285. novelwriter/assets/icons/typicons_light/nw_tb-underline.svg +0 -7
  286. novelwriter/assets/icons/typicons_light/nw_toolbar.svg +0 -5
  287. novelwriter/assets/icons/typicons_light/typ_arrow-down-thick-grey.svg +0 -4
  288. novelwriter/assets/icons/typicons_light/typ_arrow-forward.svg +0 -4
  289. novelwriter/assets/icons/typicons_light/typ_arrow-maximise.svg +0 -4
  290. novelwriter/assets/icons/typicons_light/typ_arrow-minimise.svg +0 -4
  291. novelwriter/assets/icons/typicons_light/typ_arrow-repeat-grey.svg +0 -4
  292. novelwriter/assets/icons/typicons_light/typ_book-grey.svg +0 -4
  293. novelwriter/assets/icons/typicons_light/typ_book.svg +0 -6
  294. novelwriter/assets/icons/typicons_light/typ_bookmark.svg +0 -4
  295. novelwriter/assets/icons/typicons_light/typ_calendar.svg +0 -4
  296. novelwriter/assets/icons/typicons_light/typ_cancel-grey.svg +0 -4
  297. novelwriter/assets/icons/typicons_light/typ_cancel.svg +0 -4
  298. novelwriter/assets/icons/typicons_light/typ_chart-bar-grey.svg +0 -4
  299. novelwriter/assets/icons/typicons_light/typ_chevron-down.svg +0 -4
  300. novelwriter/assets/icons/typicons_light/typ_chevron-left.svg +0 -4
  301. novelwriter/assets/icons/typicons_light/typ_chevron-right.svg +0 -4
  302. novelwriter/assets/icons/typicons_light/typ_chevron-up.svg +0 -4
  303. novelwriter/assets/icons/typicons_light/typ_cog.svg +0 -4
  304. novelwriter/assets/icons/typicons_light/typ_delete-full.svg +0 -4
  305. novelwriter/assets/icons/typicons_light/typ_delete.svg +0 -4
  306. novelwriter/assets/icons/typicons_light/typ_directions-full.svg +0 -4
  307. novelwriter/assets/icons/typicons_light/typ_document-add.svg +0 -4
  308. novelwriter/assets/icons/typicons_light/typ_document-text.svg +0 -5
  309. novelwriter/assets/icons/typicons_light/typ_document.svg +0 -4
  310. novelwriter/assets/icons/typicons_light/typ_export-grey.svg +0 -4
  311. novelwriter/assets/icons/typicons_light/typ_export.svg +0 -4
  312. novelwriter/assets/icons/typicons_light/typ_eye.svg +0 -4
  313. novelwriter/assets/icons/typicons_light/typ_flag.svg +0 -4
  314. novelwriter/assets/icons/typicons_light/typ_folder-open.svg +0 -4
  315. novelwriter/assets/icons/typicons_light/typ_folder.svg +0 -5
  316. novelwriter/assets/icons/typicons_light/typ_globe-grey.svg +0 -4
  317. novelwriter/assets/icons/typicons_light/typ_key.svg +0 -4
  318. novelwriter/assets/icons/typicons_light/typ_lightbulb-full.svg +0 -4
  319. novelwriter/assets/icons/typicons_light/typ_location.svg +0 -4
  320. novelwriter/assets/icons/typicons_light/typ_media-pause-grey.svg +0 -4
  321. novelwriter/assets/icons/typicons_light/typ_media-record-outline.svg +0 -4
  322. novelwriter/assets/icons/typicons_light/typ_media-record.svg +0 -4
  323. novelwriter/assets/icons/typicons_light/typ_minus.svg +0 -4
  324. novelwriter/assets/icons/typicons_light/typ_pencil.svg +0 -5
  325. novelwriter/assets/icons/typicons_light/typ_pin-outline.svg +0 -4
  326. novelwriter/assets/icons/typicons_light/typ_pin.svg +0 -4
  327. novelwriter/assets/icons/typicons_light/typ_plus.svg +0 -4
  328. novelwriter/assets/icons/typicons_light/typ_puzzle-outline.svg +0 -4
  329. novelwriter/assets/icons/typicons_light/typ_puzzle.svg +0 -4
  330. novelwriter/assets/icons/typicons_light/typ_refresh-flipped.svg +0 -4
  331. novelwriter/assets/icons/typicons_light/typ_refresh.svg +0 -4
  332. novelwriter/assets/icons/typicons_light/typ_search-grey.svg +0 -4
  333. novelwriter/assets/icons/typicons_light/typ_search.svg +0 -4
  334. novelwriter/assets/icons/typicons_light/typ_star.svg +0 -4
  335. novelwriter/assets/icons/typicons_light/typ_stopwatch-grey.svg +0 -4
  336. novelwriter/assets/icons/typicons_light/typ_th-dot-menu.svg +0 -4
  337. novelwriter/assets/icons/typicons_light/typ_th-dot-more.svg +0 -4
  338. novelwriter/assets/icons/typicons_light/typ_th-list-grey.svg +0 -4
  339. novelwriter/assets/icons/typicons_light/typ_th-list.svg +0 -9
  340. novelwriter/assets/icons/typicons_light/typ_times.svg +0 -4
  341. novelwriter/assets/icons/typicons_light/typ_trash.svg +0 -5
  342. novelwriter/assets/icons/typicons_light/typ_unfold-hidden.svg +0 -4
  343. novelwriter/assets/icons/typicons_light/typ_unfold-visible.svg +0 -4
  344. novelwriter/assets/icons/typicons_light/typ_user.svg +0 -5
  345. novelwriter/assets/icons/typicons_light/typ_warning-full.svg +0 -4
  346. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/entry_points.txt +0 -0
  347. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info/licenses}/LICENSE.md +0 -0
  348. {novelWriter-2.6.2.dist-info → novelwriter-2.7.dist-info}/top_level.txt +0 -0
@@ -30,20 +30,24 @@ import logging
30
30
  import re
31
31
  import shutil
32
32
 
33
- from collections.abc import Iterable
34
33
  from functools import partial
35
34
  from pathlib import Path
35
+ from typing import TYPE_CHECKING
36
36
  from zipfile import ZipFile, is_zipfile
37
37
 
38
- from PyQt5.QtCore import QCoreApplication
38
+ from PyQt6.QtCore import QCoreApplication
39
39
 
40
40
  from novelwriter import CONFIG, SHARED
41
41
  from novelwriter.common import isHandle, minmax, simplified
42
42
  from novelwriter.constants import nwConst, nwFiles, nwItemClass, nwStats
43
- from novelwriter.core.item import NWItem
44
43
  from novelwriter.core.project import NWProject
45
44
  from novelwriter.core.storage import NWStorageCreate
46
45
 
46
+ if TYPE_CHECKING:
47
+ from collections.abc import Iterable
48
+
49
+ from novelwriter.core.item import NWItem
50
+
47
51
  logger = logging.getLogger(__name__)
48
52
 
49
53
 
@@ -284,7 +288,7 @@ class DocDuplicator:
284
288
  class DocSearch:
285
289
 
286
290
  def __init__(self) -> None:
287
- self._regEx = re.compile("")
291
+ self._regEx = re.compile(r"")
288
292
  self._opts = re.UNICODE | re.IGNORECASE
289
293
  self._words = False
290
294
  self._escape = True
@@ -379,10 +383,12 @@ class ProjectBuilder:
379
383
  """Build or copy a project from a data dictionary."""
380
384
  if isinstance(data, dict):
381
385
  path = data.get("path", None) or None
382
- if isinstance(path, (str, Path)):
386
+ if author := data.get("author"):
387
+ CONFIG.setLastAuthor(author)
388
+ if isinstance(path, str | Path):
383
389
  self._path = Path(path).resolve()
384
- if data.get("sample", False):
385
- return self._extractSampleProject(self._path)
390
+ if data.get("sample"):
391
+ return self._extractSampleProject(self._path, data)
386
392
  elif data.get("template"):
387
393
  return self._copyProject(self._path, data)
388
394
  else:
@@ -412,20 +418,21 @@ class ProjectBuilder:
412
418
 
413
419
  self._path = project.storage.storagePath
414
420
 
415
- lblNewProject = self.tr("New Project")
416
- lblTitlePage = self.tr("Title Page")
421
+ trName = self.tr("New Project")
422
+ trAuthor = self.tr("Author Name")
423
+ trTitlePage = self.tr("Title Page")
417
424
 
418
425
  # Settings
419
426
  project.data.setUuid(None)
420
- project.data.setName(data.get("name", lblNewProject))
421
- project.data.setAuthor(data.get("author", ""))
427
+ project.data.setName(data.get("name", trName))
428
+ project.data.setAuthor(data.get("author", trAuthor))
422
429
  project.data.setLanguage(CONFIG.guiLocale)
423
430
  project.setDefaultStatusImport()
424
431
  project.session.startSession()
425
432
 
426
433
  # Add Root Folders
427
434
  hNovelRoot = project.newRoot(nwItemClass.NOVEL)
428
- hTitlePage = project.newFile(lblTitlePage, hNovelRoot)
435
+ hTitlePage = project.newFile(trTitlePage, hNovelRoot)
429
436
 
430
437
  # Generate Title Page
431
438
  aDoc = project.storage.getDocument(hTitlePage)
@@ -442,25 +449,21 @@ class ProjectBuilder:
442
449
  "\n"
443
450
  ">> {count}: [field:{field}] <<\n"
444
451
  ).format(
445
- author=project.data.author or "None",
446
- address=self.tr("Address"),
447
- title=project.data.name or "None",
452
+ author=project.data.author or trAuthor,
453
+ address=self.tr("Address Line"),
454
+ title=project.data.name or trName,
448
455
  by=self.tr("By"),
449
456
  count=self.tr("Word Count"),
450
457
  field=nwStats.WORDS_TEXT,
451
458
  ))
452
459
 
453
- # Create a project structure based on selected root folders
454
- # and a number of chapters and scenes selected in the
455
- # wizard's custom page.
456
-
457
460
  # Create chapters and scenes
458
461
  numChapters = data.get("chapters", 0)
459
462
  numScenes = data.get("scenes", 0)
460
463
 
461
- chSynop = self.tr("Summary of the chapter.")
462
- scSynop = self.tr("Summary of the scene.")
463
- bfNote = self.tr("A short description.")
464
+ trChSynop = self.tr("Summary of the chapter.")
465
+ trScSynop = self.tr("Summary of the scene.")
466
+ trNoteDesc = self.tr("A short description.")
464
467
 
465
468
  # Create chapters
466
469
  if numChapters > 0:
@@ -468,7 +471,7 @@ class ProjectBuilder:
468
471
  chTitle = self.tr("Chapter {0}").format(f"{ch+1:d}")
469
472
  cHandle = project.newFile(chTitle, hNovelRoot)
470
473
  aDoc = project.storage.getDocument(cHandle)
471
- aDoc.writeDocument(f"## {chTitle}\n\n%Synopsis: {chSynop}\n\n")
474
+ aDoc.writeDocument(f"## {chTitle}\n\n%Synopsis: {trChSynop}\n\n")
472
475
 
473
476
  # Create chapter scenes
474
477
  if numScenes > 0 and cHandle:
@@ -476,7 +479,7 @@ class ProjectBuilder:
476
479
  scTitle = self.tr("Scene {0}").format(f"{ch+1:d}.{sc+1:d}")
477
480
  sHandle = project.newFile(scTitle, cHandle)
478
481
  aDoc = project.storage.getDocument(sHandle)
479
- aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {scSynop}\n\n")
482
+ aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {trScSynop}\n\n")
480
483
 
481
484
  # Create scenes (no chapters)
482
485
  elif numScenes > 0:
@@ -484,7 +487,7 @@ class ProjectBuilder:
484
487
  scTitle = self.tr("Scene {0}").format(f"{sc+1:d}")
485
488
  sHandle = project.newFile(scTitle, hNovelRoot)
486
489
  aDoc = project.storage.getDocument(sHandle)
487
- aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {scSynop}\n\n")
490
+ aDoc.writeDocument(f"### {scTitle}\n\n%Synopsis: {trScSynop}\n\n")
488
491
 
489
492
  # Create notes folders
490
493
  noteTitles = {
@@ -504,12 +507,12 @@ class ProjectBuilder:
504
507
  aDoc.writeDocument(
505
508
  f"# {noteTitles[newRoot]}\n\n"
506
509
  f"@tag: {ntTag}\n\n"
507
- f"%Short: {bfNote}\n\n"
510
+ f"%Short: {trNoteDesc}\n\n"
508
511
  )
509
512
 
510
513
  # Also add the archive and trash folders
511
514
  project.newRoot(nwItemClass.ARCHIVE)
512
- project.tree.trash # Triggers the creation of Trash
515
+ _ = project.tree.trash # Triggers the creation of Trash
513
516
 
514
517
  project.saveProject()
515
518
  project.closeProject()
@@ -559,23 +562,11 @@ class ProjectBuilder:
559
562
  return False
560
563
 
561
564
  # Open the copied project and update settings
562
- project = NWProject()
563
- project.openProject(dstPath)
564
- project.data.setUuid("") # Creates a fresh uuid
565
- project.data.setName(data.get("name", "None"))
566
- project.data.setAuthor(data.get("author", ""))
567
- project.data.setSpellCheck(True)
568
- project.data.setSpellLang(None)
569
- project.data.setDoBackup(True)
570
- project.data.setSaveCount(0)
571
- project.data.setAutoCount(0)
572
- project.data.setEditTime(0)
573
- project.saveProject()
574
- project.closeProject()
565
+ self._resetProject(dstPath, data)
575
566
 
576
567
  return True
577
568
 
578
- def _extractSampleProject(self, path: Path) -> bool:
569
+ def _extractSampleProject(self, path: Path, data: dict) -> bool:
579
570
  """Make a copy of the sample project by extracting the
580
571
  sample.zip file to the new path.
581
572
  """
@@ -589,6 +580,7 @@ class ProjectBuilder:
589
580
  if (sample := CONFIG.assetPath("sample.zip")).is_file():
590
581
  try:
591
582
  shutil.unpack_archive(sample, path)
583
+ self._resetProject(path, data)
592
584
  except Exception as exc:
593
585
  SHARED.error(self.tr("Failed to create a new example project."), exc=exc)
594
586
  return False
@@ -601,3 +593,22 @@ class ProjectBuilder:
601
593
  return False
602
594
 
603
595
  return True
596
+
597
+ def _resetProject(self, path: Path, data: dict) -> None:
598
+ """Open a project and reset/update its settings."""
599
+ project = NWProject()
600
+ project.openProject(path)
601
+ project.data.setUuid("") # Creates a fresh uuid
602
+ if name := data.get("name", ""):
603
+ project.data.setName(name)
604
+ if author := data.get("author", ""):
605
+ project.data.setAuthor(author)
606
+ project.data.setSpellCheck(True)
607
+ project.data.setSpellLang(None)
608
+ project.data.setDoBackup(True)
609
+ project.data.setSaveCount(0)
610
+ project.data.setAutoCount(0)
611
+ project.data.setEditTime(0)
612
+ project.saveProject()
613
+ project.closeProject()
614
+ return
@@ -25,26 +25,30 @@ from __future__ import annotations
25
25
 
26
26
  import logging
27
27
 
28
- from collections.abc import Iterable
29
- from pathlib import Path
28
+ from typing import TYPE_CHECKING
30
29
 
31
- from PyQt5.QtGui import QFont
30
+ from PyQt6.QtGui import QFont
32
31
 
33
32
  from novelwriter import CONFIG
34
33
  from novelwriter.constants import nwLabels
35
- from novelwriter.core.buildsettings import BuildSettings
36
34
  from novelwriter.core.item import NWItem
37
- from novelwriter.core.project import NWProject
38
- from novelwriter.enum import nwBuildFmt
35
+ from novelwriter.enum import nwBuildFmt, nwComment
39
36
  from novelwriter.error import formatException, logException
40
37
  from novelwriter.formats.todocx import ToDocX
41
38
  from novelwriter.formats.tohtml import ToHtml
42
- from novelwriter.formats.tokenizer import Tokenizer
43
39
  from novelwriter.formats.tomarkdown import ToMarkdown
44
40
  from novelwriter.formats.toodt import ToOdt
45
41
  from novelwriter.formats.toqdoc import ToQTextDocument
46
42
  from novelwriter.formats.toraw import ToRaw
47
43
 
44
+ if TYPE_CHECKING:
45
+ from collections.abc import Iterable
46
+ from pathlib import Path
47
+
48
+ from novelwriter.core.buildsettings import BuildSettings
49
+ from novelwriter.core.project import NWProject
50
+ from novelwriter.formats.tokenizer import Tokenizer
51
+
48
52
  logger = logging.getLogger(__name__)
49
53
 
50
54
 
@@ -56,8 +60,8 @@ class NWBuildDocument:
56
60
  """
57
61
 
58
62
  __slots__ = (
59
- "_project", "_build", "_queue", "_error", "_cache", "_count",
60
- "_outline",
63
+ "_build", "_cache", "_count", "_error", "_outline", "_project",
64
+ "_queue",
61
65
  )
62
66
 
63
67
  def __init__(self, project: NWProject, build: BuildSettings) -> None:
@@ -307,22 +311,25 @@ class NWBuildDocument:
307
311
  )
308
312
 
309
313
  bldObj.setBodyText(self._build.getBool("text.includeBodyText"))
310
- bldObj.setSynopsis(self._build.getBool("text.includeSynopsis"))
311
- bldObj.setComments(self._build.getBool("text.includeComments"))
312
314
  bldObj.setKeywords(self._build.getBool("text.includeKeywords"))
313
315
  bldObj.setIgnoredKeywords(self._build.getStr("text.ignoredKeywords"))
316
+ bldObj.setCommentType(nwComment.PLAIN, self._build.getBool("text.includeComments"))
317
+ bldObj.setCommentType(nwComment.SYNOPSIS, self._build.getBool("text.includeSynopsis"))
318
+ bldObj.setCommentType(nwComment.SHORT, self._build.getBool("text.includeSynopsis"))
319
+ bldObj.setCommentType(nwComment.STORY, self._build.getBool("text.includeStory"))
320
+ bldObj.setCommentType(nwComment.NOTE, self._build.getBool("text.includeNotes"))
314
321
 
315
322
  if isinstance(bldObj, ToHtml):
316
323
  bldObj.setStyles(self._build.getBool("html.addStyles"))
317
324
  bldObj.setReplaceUnicode(self._build.getBool("format.stripUnicode"))
318
325
 
319
- if isinstance(bldObj, (ToOdt, ToDocX)):
326
+ if isinstance(bldObj, ToOdt | ToDocX):
320
327
  bldObj.setHeaderFormat(
321
328
  self._build.getStr("doc.pageHeader"),
322
329
  self._build.getInt("doc.pageCountOffset"),
323
330
  )
324
331
 
325
- if isinstance(bldObj, (ToOdt, ToDocX, ToQTextDocument)):
332
+ if isinstance(bldObj, ToOdt | ToDocX | ToQTextDocument):
326
333
  scale = nwLabels.UNIT_SCALE.get(self._build.getStr("format.pageUnit"), 1.0)
327
334
  pW, pH = nwLabels.PAPER_SIZE.get(self._build.getStr("format.pageSize"), (-1.0, -1.0))
328
335
  bldObj.setPageLayout(
@@ -31,11 +31,11 @@ from time import time
31
31
  from typing import TYPE_CHECKING
32
32
 
33
33
  from novelwriter.common import formatTimeStamp, isHandle
34
- from novelwriter.core.item import NWItem
35
34
  from novelwriter.enum import nwItemClass, nwItemLayout
36
35
  from novelwriter.error import formatException, logException
37
36
 
38
- if TYPE_CHECKING: # pragma: no cover
37
+ if TYPE_CHECKING:
38
+ from novelwriter.core.item import NWItem
39
39
  from novelwriter.core.project import NWProject
40
40
 
41
41
  logger = logging.getLogger(__name__)