novelWriter 2.7rc1__tar.gz → 2.7.2__tar.gz

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 (237) hide show
  1. {novelwriter-2.7rc1 → novelwriter-2.7.2}/CHANGELOG.md +107 -0
  2. {novelwriter-2.7rc1 → novelwriter-2.7.2}/CREDITS.md +4 -0
  3. {novelwriter-2.7rc1 → novelwriter-2.7.2}/PKG-INFO +3 -4
  4. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelWriter.egg-info/PKG-INFO +3 -4
  5. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelWriter.egg-info/SOURCES.txt +2 -0
  6. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/__init__.py +3 -3
  7. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_cs_CZ.qm +0 -0
  8. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_de_DE.qm +0 -0
  9. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_en_US.qm +0 -0
  10. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_es_419.qm +0 -0
  11. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_fr_FR.qm +0 -0
  12. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_it_IT.qm +0 -0
  13. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_ja_JP.qm +0 -0
  14. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_nb_NO.qm +0 -0
  15. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_nl_NL.qm +0 -0
  16. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_pl_PL.qm +0 -0
  17. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_pt_BR.qm +0 -0
  18. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_ru_RU.qm +0 -0
  19. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/nw_zh_CN.qm +0 -0
  20. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_cs_CZ.json +2 -0
  21. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_de_DE.json +3 -1
  22. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_en_US.json +2 -0
  23. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_it_IT.json +2 -0
  24. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_ja_JP.json +2 -0
  25. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_nb_NO.json +2 -0
  26. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_nn_NO.json +5 -0
  27. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_pl_PL.json +2 -0
  28. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_pt_BR.json +2 -0
  29. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_ru_RU.json +2 -0
  30. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_zh_CN.json +2 -0
  31. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/manual.pdf +0 -0
  32. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/manual_fr.pdf +0 -0
  33. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/sample.zip +0 -0
  34. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/text/credits_en.htm +6 -0
  35. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/config.py +2 -2
  36. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/constants.py +16 -19
  37. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/buildsettings.py +1 -1
  38. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/index.py +24 -16
  39. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/indexdata.py +9 -3
  40. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/item.py +1 -1
  41. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/todocx.py +2 -2
  42. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/tokenizer.py +45 -39
  43. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/toqdoc.py +10 -8
  44. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/doceditor.py +8 -7
  45. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/docviewer.py +2 -0
  46. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/noveltree.py +1 -0
  47. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/manuscript.py +4 -7
  48. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/manussettings.py +33 -22
  49. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/types.py +1 -0
  50. {novelwriter-2.7rc1 → novelwriter-2.7.2}/pkgutils.py +6 -18
  51. {novelwriter-2.7rc1 → novelwriter-2.7.2}/pyproject.toml +4 -4
  52. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/appimage_launcher.sh +1 -1
  53. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/novelwriter.desktop +1 -1
  54. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/control +1 -7
  55. novelwriter-2.7.2/setup/icons/novelwriter.png +0 -0
  56. novelwriter-2.7.2/setup/icons/x-novelwriter-project.png +0 -0
  57. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/Info.plist.template +1 -1
  58. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/build.sh +4 -4
  59. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/make_pip.sh +1 -1
  60. {novelwriter-2.7rc1 → novelwriter-2.7.2}/LICENSE.md +0 -0
  61. {novelwriter-2.7rc1 → novelwriter-2.7.2}/MANIFEST.in +0 -0
  62. {novelwriter-2.7rc1 → novelwriter-2.7.2}/README.md +0 -0
  63. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelWriter.egg-info/dependency_links.txt +0 -0
  64. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelWriter.egg-info/entry_points.txt +0 -0
  65. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelWriter.egg-info/requires.txt +0 -0
  66. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelWriter.egg-info/top_level.txt +0 -0
  67. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_en_GB.json +0 -0
  68. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_es_419.json +0 -0
  69. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_fr_FR.json +0 -0
  70. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/i18n/project_nl_NL.json +0 -0
  71. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/font_awesome.icons +0 -0
  72. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/material_filled_bold.icons +0 -0
  73. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/material_filled_normal.icons +0 -0
  74. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/material_filled_thin.icons +0 -0
  75. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/material_rounded_bold.icons +0 -0
  76. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/material_rounded_normal.icons +0 -0
  77. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/material_rounded_thin.icons +0 -0
  78. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/none.svg +0 -0
  79. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/novelwriter.ico +0 -0
  80. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/novelwriter.svg +0 -0
  81. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/remix_filled.icons +0 -0
  82. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/remix_outline.icons +0 -0
  83. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/x-novelwriter-project.ico +0 -0
  84. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/icons/x-novelwriter-project.svg +0 -0
  85. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/images/novelwriter-text-dark.svg +0 -0
  86. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/images/novelwriter-text-light.svg +0 -0
  87. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/images/splash.png +0 -0
  88. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/images/welcome-dark.jpg +0 -0
  89. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/images/welcome-light.jpg +0 -0
  90. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/cyberpunk_night.conf +0 -0
  91. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/default_dark.conf +0 -0
  92. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/default_light.conf +0 -0
  93. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/dracula.conf +0 -0
  94. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/grey_dark.conf +0 -0
  95. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/grey_light.conf +0 -0
  96. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/light_owl.conf +0 -0
  97. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/night_owl.conf +0 -0
  98. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/snazzy.conf +0 -0
  99. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/solarized_dark.conf +0 -0
  100. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/solarized_light.conf +0 -0
  101. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/tango.conf +0 -0
  102. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/tomorrow.conf +0 -0
  103. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/tomorrow_night.conf +0 -0
  104. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/tomorrow_night_blue.conf +0 -0
  105. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/tomorrow_night_bright.conf +0 -0
  106. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/syntax/tomorrow_night_eighties.conf +0 -0
  107. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/text/lipsum.txt +0 -0
  108. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/cyberpunk_night.conf +0 -0
  109. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/default.conf +0 -0
  110. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/default_dark.conf +0 -0
  111. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/default_light.conf +0 -0
  112. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/dracula.conf +0 -0
  113. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/snazzy.conf +0 -0
  114. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/solarized_dark.conf +0 -0
  115. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/assets/themes/solarized_light.conf +0 -0
  116. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/common.py +0 -0
  117. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/coretools.py +0 -0
  118. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/docbuild.py +0 -0
  119. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/document.py +0 -0
  120. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/itemmodel.py +0 -0
  121. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/novelmodel.py +0 -0
  122. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/options.py +0 -0
  123. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/project.py +0 -0
  124. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/projectdata.py +0 -0
  125. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/projectxml.py +0 -0
  126. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/sessions.py +0 -0
  127. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/spellcheck.py +0 -0
  128. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/status.py +0 -0
  129. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/storage.py +0 -0
  130. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/core/tree.py +0 -0
  131. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/about.py +0 -0
  132. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/docmerge.py +0 -0
  133. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/docsplit.py +0 -0
  134. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/editlabel.py +0 -0
  135. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/preferences.py +0 -0
  136. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/projectsettings.py +0 -0
  137. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/quotes.py +0 -0
  138. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/dialogs/wordlist.py +0 -0
  139. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/enum.py +0 -0
  140. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/error.py +0 -0
  141. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/configlayout.py +0 -0
  142. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/eventfilters.py +0 -0
  143. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/modified.py +0 -0
  144. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/novelselector.py +0 -0
  145. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/pagedsidebar.py +0 -0
  146. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/progressbars.py +0 -0
  147. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/statusled.py +0 -0
  148. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/switch.py +0 -0
  149. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/switchbox.py +0 -0
  150. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/extensions/versioninfo.py +0 -0
  151. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/shared.py +0 -0
  152. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/tohtml.py +0 -0
  153. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/tomarkdown.py +0 -0
  154. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/toodt.py +0 -0
  155. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/formats/toraw.py +0 -0
  156. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/dochighlight.py +0 -0
  157. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/docviewerpanel.py +0 -0
  158. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/editordocument.py +0 -0
  159. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/itemdetails.py +0 -0
  160. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/mainmenu.py +0 -0
  161. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/outline.py +0 -0
  162. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/projtree.py +0 -0
  163. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/search.py +0 -0
  164. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/sidebar.py +0 -0
  165. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/statusbar.py +0 -0
  166. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/gui/theme.py +0 -0
  167. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/guimain.py +0 -0
  168. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/shared.py +0 -0
  169. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/splash.py +0 -0
  170. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/text/comments.py +0 -0
  171. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/text/counting.py +0 -0
  172. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/text/patterns.py +0 -0
  173. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/dictionaries.py +0 -0
  174. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/lipsum.py +0 -0
  175. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/manusbuild.py +0 -0
  176. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/noveldetails.py +0 -0
  177. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/welcome.py +0 -0
  178. {novelwriter-2.7rc1 → novelwriter-2.7.2}/novelwriter/tools/writingstats.py +0 -0
  179. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/128x128/apps/novelwriter.png +0 -0
  180. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/128x128/mimetypes/application-x-novelwriter-project.png +0 -0
  181. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/16x16/apps/novelwriter.png +0 -0
  182. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/16x16/mimetypes/application-x-novelwriter-project.png +0 -0
  183. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/24x24/apps/novelwriter.png +0 -0
  184. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/24x24/mimetypes/application-x-novelwriter-project.png +0 -0
  185. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/256x256/apps/novelwriter.png +0 -0
  186. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/256x256/mimetypes/application-x-novelwriter-project.png +0 -0
  187. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/32x32/apps/novelwriter.png +0 -0
  188. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/32x32/mimetypes/application-x-novelwriter-project.png +0 -0
  189. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/48x48/apps/novelwriter.png +0 -0
  190. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/48x48/mimetypes/application-x-novelwriter-project.png +0 -0
  191. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/512x512/apps/novelwriter.png +0 -0
  192. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/512x512/mimetypes/application-x-novelwriter-project.png +0 -0
  193. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/64x64/apps/novelwriter.png +0 -0
  194. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/64x64/mimetypes/application-x-novelwriter-project.png +0 -0
  195. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/scalable/apps/novelwriter.svg +0 -0
  196. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/hicolor/scalable/mimetypes/application-x-novelwriter-project.svg +0 -0
  197. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/novelwriter.png +0 -0
  198. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/data/x-novelwriter-project.xml +0 -0
  199. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/compat +0 -0
  200. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/copyright +0 -0
  201. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/install +0 -0
  202. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/py3dist-overrides +0 -0
  203. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/rules +0 -0
  204. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/debian/source/format +0 -0
  205. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/description_pypi.md +0 -0
  206. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/description_short.txt +0 -0
  207. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/icons/novelwriter.ico +0 -0
  208. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/icons/novelwriter.svg +0 -0
  209. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/icons/x-novelwriter-project.ico +0 -0
  210. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/icons/x-novelwriter-project.svg +0 -0
  211. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/iss_license.txt +0 -0
  212. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/App.entitlements +0 -0
  213. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_128x128.png +0 -0
  214. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_128x128@2x.png +0 -0
  215. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_16x16.png +0 -0
  216. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_16x16@2x.png +0 -0
  217. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_256x256.png +0 -0
  218. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_256x256@2x.png +0 -0
  219. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_32x32.png +0 -0
  220. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_32x32@2x.png +0 -0
  221. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_512x512.png +0 -0
  222. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/macos/novelwriter.iconset/icon_512x512@2x.png +0 -0
  223. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/make_clean.sh +0 -0
  224. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/make_release.sh +0 -0
  225. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/novelwriter.appdata.xml +0 -0
  226. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/novelwriter_readme.png +0 -0
  227. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/novelwriter_text.png +0 -0
  228. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/screenshot.png +0 -0
  229. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/signpath_logo.png +0 -0
  230. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/win_setup_embed.iss +0 -0
  231. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/windows/CMakeLists.txt +0 -0
  232. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/windows/launcher.rc +0 -0
  233. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/windows/main.cpp +0 -0
  234. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/windows/make.ps1 +0 -0
  235. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/windows/novelWriter.exe +0 -0
  236. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup/windows/novelWriter.ico +0 -0
  237. {novelwriter-2.7rc1 → novelwriter-2.7.2}/setup.cfg +0 -0
@@ -1,5 +1,112 @@
1
1
  # novelWriter Changelog
2
2
 
3
+ ## Version 2.7.2 [2025-06-24]
4
+
5
+ ### Release Notes
6
+
7
+ This is a patch release that fixes several issues related to DocX and PDF manuscript documents,
8
+ improves how line breaks, alignment and indentation is processed, and fixes some issues with
9
+ displaying tags for novel documents on the user interface.
10
+
11
+ ### Detailed Changelog
12
+
13
+ **Bugfixes**
14
+
15
+ * Fixed an issue where escaped markup characters were not replaced properly in DocX and PDF
16
+ documents, and in previews. Issue #2410. PR #2411.
17
+ * Fixed an issue where titles with line breaks in them would have page breaks applied to both lines
18
+ for preview and PDF documents. Issue #2415. PR #2416.
19
+ * Fixed an issue where the justified text setting would not be properly applied to a paragraph in a
20
+ manuscript document if there was a line break in the paragraph, but single line breaks were set
21
+ to be ignored. Issue #2426. PR #2427.
22
+ * Fixed an issue where the "Tag" field of the Outline View details panel remained blank even if a
23
+ tag was set for the novel document. Issue #2428. PR #2429.
24
+
25
+ **Improvements**
26
+
27
+ * When comments are enabled in the viewer, story comments should also be visible. A separate filter
28
+ button will be added for this in 2.8. PR #2420.
29
+ * When a paragraph has line breaks in it, the alignment tag will now override first line
30
+ indentation even if the alignment tag is not on the first line. This is more consistent with the
31
+ alignment behaviour for multi-line paragraphs in general. Issue #2425. PR #2427.
32
+ * Tags will now be shown in the Novel View tooltip pop-out under the triangle button, together with
33
+ all the other meta data collected about a document or heading. PR #2429.
34
+
35
+ **Documentation**
36
+
37
+ * The documentation on how alignment and first line indentation works in conjunction with
38
+ in-paragraph line breaks, the setting to keep or ignore such line breaks, and the forced line
39
+ break shortcode, has been improved. Issue #2425. PR #2427.
40
+
41
+ ----
42
+
43
+ ## Version 2.7.1 [2025-06-09]
44
+
45
+ ### Release Notes
46
+
47
+ This is a patch release that fixes some issues with tags and references, an issue with the
48
+ auto-complete menu on Windows, and some issues with the AppImage on Linux. The Czech translation
49
+ for 2.7 has also been completed.
50
+
51
+ ### Detailed Changelog
52
+
53
+ **Bugfixes**
54
+
55
+ * Fix a bug where tags would be listed in the auto-complete menu for mentions even if the file
56
+ defining it had been moved to Archive or Trash. Issue #2387. PR #2389.
57
+ * Fixed a bug that seems to only have occurred on Windows where the auto-complete menu would hold
58
+ on to the return and arrow keys even when it was hidden. Issue #2386. PR #2389.
59
+
60
+ **Improvements**
61
+
62
+ * The auto-complete menu in the editor no longer shows any suggestions when defining the tag.
63
+ This never made sense anyway. PR #2389.
64
+
65
+ **Internationalisation**
66
+
67
+ * Updated the Czech. PR #2393.
68
+
69
+ **Packaging**
70
+
71
+ * Fixed an issue with the AppImage release where on some platforms `libxcb-cursor0` was missing.
72
+ The library is now included in the AppImage. Issue #2374. PR #2392.
73
+
74
+ ----
75
+
76
+ ## Version 2.7 [2025-06-01]
77
+
78
+ ### Release Notes
79
+
80
+ The 2.7 release updates the 2.7 RC 1 release and makes an improvement to the build settings tool.
81
+ It also updates most translations and updates the French version of the documentation.
82
+
83
+ See the website for complete [Release Notes](https://novelwriter.io/releases/release_2_7.html).
84
+
85
+ ### Detailed Changelog
86
+
87
+ **Improvement**
88
+
89
+ * The Manuscript Build Settings dialog now works on a copy of the settings so that if the dialog
90
+ box is closed without saving, all changes are discarded. It should also now detect any change
91
+ made to properly raise a confirmation prompt when closing without saving. Issue #2350. PR #2351.
92
+
93
+ **Documentation**
94
+
95
+ * The user documentation has been restructured, and the Getting Started section has been made less
96
+ technical. The install instructions have been moved out and into the main website. The technical
97
+ and in-depth parts of the documentation have been kept, but moved further back so that the
98
+ documentation can be read from the start and to the point where the user has enough information.
99
+ The larger sections have also been split up so that it should be easier to find the wanted
100
+ information directly from the menu. Issue #2345. PR #2355.
101
+
102
+ **Internationalisation**
103
+
104
+ * Updated US English, Japanese, Norwegian. German, Italian, Polish, Brazilian Portuguese and
105
+ Chinese translation files. PR #2353.
106
+ * French documentation updated by @Karduin. Issue #2360. PR #2361.
107
+
108
+ ----
109
+
3
110
  ## Version 2.7 RC 1 [2025-05-19]
4
111
 
5
112
  ### Release Notes
@@ -39,6 +39,10 @@ Additional larger translation contributions:
39
39
  * **French:** Albert Aribaud (aaribaud)
40
40
  * **Portuguese:** Oli Maia (olimaia)
41
41
 
42
+ Translations of the documentation:
43
+
44
+ * **French:** Jean-Michel Heras (Karduin)
45
+
42
46
  Translations are managed on [Crowdin](https://crowdin.com/project/novelwriter), and more
43
47
  contributions are listed on the project's Members page.
44
48
 
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: novelWriter
3
- Version: 2.7rc1
4
- Summary: A markdown-like text editor for planning and writing novels
3
+ Version: 2.7.2
4
+ Summary: A plain text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
- License: GNU General Public License v3
6
+ License-Expression: GPL-3.0
7
7
  Project-URL: Homepage, https://novelwriter.io
8
8
  Project-URL: Documentation, https://docs.novelwriter.io
9
9
  Project-URL: Repository, https://github.com/vkbo/novelWriter
@@ -14,7 +14,6 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: Implementation :: CPython
17
- Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
18
17
  Classifier: Development Status :: 5 - Production/Stable
19
18
  Classifier: Operating System :: OS Independent
20
19
  Classifier: Intended Audience :: End Users/Desktop
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: novelWriter
3
- Version: 2.7rc1
4
- Summary: A markdown-like text editor for planning and writing novels
3
+ Version: 2.7.2
4
+ Summary: A plain text editor for planning and writing novels
5
5
  Author-email: Veronica Berglyd Olsen <code@vkbo.net>
6
- License: GNU General Public License v3
6
+ License-Expression: GPL-3.0
7
7
  Project-URL: Homepage, https://novelwriter.io
8
8
  Project-URL: Documentation, https://docs.novelwriter.io
9
9
  Project-URL: Repository, https://github.com/vkbo/novelWriter
@@ -14,7 +14,6 @@ Classifier: Programming Language :: Python :: 3.11
14
14
  Classifier: Programming Language :: Python :: 3.12
15
15
  Classifier: Programming Language :: Python :: 3.13
16
16
  Classifier: Programming Language :: Python :: Implementation :: CPython
17
- Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
18
17
  Classifier: Development Status :: 5 - Production/Stable
19
18
  Classifier: Operating System :: OS Independent
20
19
  Classifier: Intended Audience :: End Users/Desktop
@@ -209,8 +209,10 @@ setup/debian/py3dist-overrides
209
209
  setup/debian/rules
210
210
  setup/debian/source/format
211
211
  setup/icons/novelwriter.ico
212
+ setup/icons/novelwriter.png
212
213
  setup/icons/novelwriter.svg
213
214
  setup/icons/x-novelwriter-project.ico
215
+ setup/icons/x-novelwriter-project.png
214
216
  setup/icons/x-novelwriter-project.svg
215
217
  setup/macos/App.entitlements
216
218
  setup/macos/Info.plist.template
@@ -49,9 +49,9 @@ __license__ = "GPLv3"
49
49
  __author__ = "Veronica Berglyd Olsen"
50
50
  __maintainer__ = "Veronica Berglyd Olsen"
51
51
  __email__ = "code@vkbo.net"
52
- __version__ = "2.7rc1"
53
- __hexversion__ = "0x020700c1"
54
- __date__ = "2025-05-19"
52
+ __version__ = "2.7.2"
53
+ __hexversion__ = "0x020702f0"
54
+ __date__ = "2025-06-24"
55
55
  __status__ = "Stable"
56
56
  __domain__ = "novelwriter.io"
57
57
 
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Krátký popis",
4
4
  "Footnotes": "Poznámky pod čarou",
5
5
  "Comment": "Komentář",
6
+ "Story Structure": "Struktura příběhu",
7
+ "Note": "Poznámka",
6
8
  "Notes": "Poznámka",
7
9
  "Tag": "Štítek",
8
10
  "Point of View": "Úhel pohledu",
@@ -1,8 +1,10 @@
1
1
  {
2
- "Synopsis": "Synopsis",
2
+ "Synopsis": "Zusammenfassung",
3
3
  "Short Description": "Kurzbeschreibung",
4
4
  "Footnotes": "Fußnoten",
5
5
  "Comment": "Kommentar",
6
+ "Story Structure": "Struktur",
7
+ "Note": "Notiz",
6
8
  "Notes": "Notizen",
7
9
  "Tag": "Schlagwort",
8
10
  "Point of View": "Perspektive",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Short Description",
4
4
  "Footnotes": "Footnotes",
5
5
  "Comment": "Comment",
6
+ "Story Structure": "Story Structure",
7
+ "Note": "Note",
6
8
  "Notes": "Notes",
7
9
  "Tag": "Tag",
8
10
  "Point of View": "Point of View",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Breve descrizione",
4
4
  "Footnotes": "Note a piè pagina",
5
5
  "Comment": "Commento",
6
+ "Story Structure": "Struttura della storia",
7
+ "Note": "Nota",
6
8
  "Notes": "Note",
7
9
  "Tag": "Etichetta",
8
10
  "Point of View": "Punto di vista",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "短い説明",
4
4
  "Footnotes": "脚注",
5
5
  "Comment": "コメント ",
6
+ "Story Structure": "ストーリー構造",
7
+ "Note": "ノート",
6
8
  "Notes": "ノート",
7
9
  "Tag": "タグ",
8
10
  "Point of View": "視点",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Kort beskrivelse",
4
4
  "Footnotes": "Fotnoter",
5
5
  "Comment": "Kommentar",
6
+ "Story Structure": "Tekst-element",
7
+ "Note": "Notat",
6
8
  "Notes": "Notat",
7
9
  "Tag": "Knagg",
8
10
  "Point of View": "Perspektiv",
@@ -1,6 +1,10 @@
1
1
  {
2
2
  "Synopsis": "Samandrag",
3
+ "Short Description": "Kort beskriving",
4
+ "Footnotes": "Fotnotar",
3
5
  "Comment": "Kommentar",
6
+ "Story Structure": "Tekst-element",
7
+ "Note": "Notat",
4
8
  "Notes": "Notat",
5
9
  "Tag": "Knagg",
6
10
  "Point of View": "Perspektiv",
@@ -12,6 +16,7 @@
12
16
  "Objects": "Objekt",
13
17
  "Entities": "Eining",
14
18
  "Custom": "Anna",
19
+ "New Page": "Ny side",
15
20
  "0": "null",
16
21
  "1": "ein",
17
22
  "2": "to",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Krótki opis",
4
4
  "Footnotes": "Przypisy",
5
5
  "Comment": "Komentarz",
6
+ "Story Structure": "Struktura opowieści",
7
+ "Note": "Notatka",
6
8
  "Notes": "Notatki",
7
9
  "Tag": "Znacznik",
8
10
  "Point of View": "Punkt widzenia",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "Descrição breve",
4
4
  "Footnotes": "Notas de rodapé",
5
5
  "Comment": "Comentário",
6
+ "Story Structure": "Estrutura narrativa",
7
+ "Note": "Nota",
6
8
  "Notes": "Notas",
7
9
  "Tag": "Etiqueta",
8
10
  "Point of View": "Ponto de vista",
@@ -1,6 +1,7 @@
1
1
  {
2
2
  "Synopsis": "Сводка",
3
3
  "Short Description": "Краткое описание",
4
+ "Footnotes": "Примечания",
4
5
  "Comment": "Комментарий",
5
6
  "Notes": "Заметки",
6
7
  "Tag": "Тэг",
@@ -13,6 +14,7 @@
13
14
  "Objects": "Объекты",
14
15
  "Entities": "Сущности",
15
16
  "Custom": "Другое",
17
+ "New Page": "Новая страница",
16
18
  "0": "Ноль",
17
19
  "1": "Один",
18
20
  "2": "Два",
@@ -3,6 +3,8 @@
3
3
  "Short Description": "简短描述",
4
4
  "Footnotes": "注释",
5
5
  "Comment": "注释",
6
+ "Story Structure": "故事结构",
7
+ "Note": "笔记",
6
8
  "Notes": "笔记",
7
9
  "Tag": "标签",
8
10
  "Point of View": "视角",
@@ -47,6 +47,12 @@ translators for the languages currently available:</p>
47
47
  <li><b>Portuguese:</b> Oli Maia (olimaia)</li>
48
48
  </ul>
49
49
 
50
+ <p>Translations of the documentation:</p>
51
+
52
+ <ul>
53
+ <li><b>French:</b> Jean-Michel Heras (Karduin)</li>
54
+ </ul>
55
+
50
56
  <p>Translations are managed on <a href="https://crowdin.com/project/novelwriter">Crowdin</a>, and
51
57
  more contributions are listed on the project's Members page.</p>
52
58
 
@@ -44,7 +44,7 @@ from novelwriter.common import (
44
44
  NWConfigParser, checkInt, checkPath, describeFont, fontMatcher,
45
45
  formatTimeStamp, processDialogSymbols, simplified
46
46
  )
47
- from novelwriter.constants import nwFiles, nwHtmlUnicode, nwQuotes, nwUnicode
47
+ from novelwriter.constants import nwFiles, nwQuotes, nwUnicode
48
48
  from novelwriter.error import formatException, logException
49
49
 
50
50
  if TYPE_CHECKING:
@@ -892,7 +892,7 @@ class Config:
892
892
  """
893
893
  self.splashMessage(f"Initialising {kind} font: {font.family()}")
894
894
  metrics = QFontMetrics(font)
895
- for char in nwHtmlUnicode.U_TO_H.keys():
895
+ for char in nwUnicode.UI_SYMBOLS:
896
896
  if not metrics.inFont(char): # type: ignore
897
897
  logger.warning("No glyph U+%04x in font", ord(char)) # pragma: no cover
898
898
  return
@@ -184,6 +184,10 @@ class nwKeyWords:
184
184
  POV_KEY, FOCUS_KEY, CHAR_KEY, PLOT_KEY, TIME_KEY, WORLD_KEY,
185
185
  OBJECT_KEY, ENTITY_KEY, CUSTOM_KEY,
186
186
  ]
187
+ CAN_LOOKUP: Final[list[str]] = [
188
+ POV_KEY, FOCUS_KEY, CHAR_KEY, PLOT_KEY, TIME_KEY, WORLD_KEY,
189
+ OBJECT_KEY, ENTITY_KEY, CUSTOM_KEY, STORY_KEY, MENTION_KEY,
190
+ ]
187
191
 
188
192
  # Set of Valid Keys
189
193
  VALID_KEYS: Final[set[str]] = set(ALL_KEYS)
@@ -582,21 +586,14 @@ class nwUnicode:
582
586
  U_TIMES = "\u00d7" # Multiplication sign
583
587
  U_DIVIDE = "\u00f7" # Division sign
584
588
 
585
- # Arrows
586
- U_UTRI = "\u25b2" # Up-pointing triangle
587
- U_UTRIS = "\u25b4" # Up-pointing triangle, small
588
- U_RTRI = "\u25b6" # Right-pointing triangle
589
- U_RTRIS = "\u25b8" # Right-pointing triangle, small
590
- U_DTRI = "\u25bc" # Down-pointing triangle
591
- U_DTRIS = "\u25be" # Down-pointing triangle, small
592
- U_LTRI = "\u25c0" # Left-pointing triangle
593
- U_LTRIS = "\u25c2" # Left-pointing triangle, small
594
-
595
589
  # Special
596
590
  U_UNKN = "\ufffd" # Unknown character
597
591
  U_NAC1 = "\ufffe" # Not a character
598
592
  U_NAC2 = "\uffff" # Not a character
599
593
 
594
+ # Placeholders
595
+ U_LBREAK = "\u21b2" # Downwards Arrow With Tip Leftwards
596
+
600
597
  # HTML Equivalents
601
598
  # ================
602
599
 
@@ -651,15 +648,15 @@ class nwUnicode:
651
648
  H_TIMES = "&times;"
652
649
  H_DIVIDE = "&divide;"
653
650
 
654
- # Arrows
655
- H_UTRI = "&#9650;"
656
- H_UTRIS = "&#9652;"
657
- H_RTRI = "&#9654;"
658
- H_RTRIS = "&#9656;"
659
- H_DTRI = "&#9660;"
660
- H_DTRIS = "&#9662;"
661
- H_LTRI = "&#9664;"
662
- H_LTRIS = "&#9666;"
651
+ # Unicode symbols expected to be used on the UI
652
+ UI_SYMBOLS: Final[list[str]] = [
653
+ U_QUOT, U_APOS, U_LAQUO, U_RAQUO, U_LSQUO, U_RSQUO, U_SBQUO, U_SUQUO,
654
+ U_LDQUO, U_RDQUO, U_BDQUO, U_UDQUO, U_LSAQUO, U_RSAQUO, U_BDRQUO,
655
+ U_LCQUO, U_RCQUO, U_LWCQUO, U_RWCQUO, U_FGDASH, U_ENDASH, U_EMDASH,
656
+ U_HBAR, U_HELLIP, U_MAPOS, U_PRIME, U_DPRIME, U_NBSP, U_THSP, U_THNBSP,
657
+ U_ENSP, U_EMSP, U_MMSP, U_CHECK, U_CROSS, U_BULL, U_TRBULL, U_HYBULL,
658
+ U_FLOWER, U_PERMIL, U_DEGREE, U_MINUS, U_TIMES, U_DIVIDE, U_LBREAK,
659
+ ]
663
660
 
664
661
 
665
662
  class nwHtmlUnicode:
@@ -390,7 +390,7 @@ class BuildSettings:
390
390
  def setValue(self, key: str, value: T_BuildValue) -> None:
391
391
  """Set a specific value for a build setting."""
392
392
  if (d := SETTINGS_TEMPLATE.get(key)) and len(d) == 2 and isinstance(value, d[0]):
393
- self._changed = value != self._settings[key]
393
+ self._changed |= (value != self._settings[key])
394
394
  self._settings[key] = value
395
395
  return
396
396
 
@@ -131,12 +131,6 @@ class Index:
131
131
  self._novelExtra = extra
132
132
  return
133
133
 
134
- def setItemClass(self, tHandle: str, itemClass: nwItemClass) -> None:
135
- """Update the class for all tags of a handle."""
136
- logger.info("Updating class for '%s'", tHandle)
137
- self._tagsIndex.updateClass(tHandle, itemClass.name)
138
- return
139
-
140
134
  ##
141
135
  # Public Methods
142
136
  ##
@@ -183,6 +177,16 @@ class Index:
183
177
  self.scanText(tHandle, self._project.storage.getDocumentText(tHandle))
184
178
  return
185
179
 
180
+ def refreshHandle(self, tHandle: str) -> None:
181
+ """Update the class for all tags of a handle."""
182
+ if item := self._project.tree[tHandle]:
183
+ logger.info("Updating class for '%s'", tHandle)
184
+ if item.isInactiveClass():
185
+ self.deleteHandle(tHandle)
186
+ else:
187
+ self._tagsIndex.updateClass(tHandle, item.itemClass.name)
188
+ return
189
+
186
190
  def indexChangedSince(self, checkTime: int | float) -> bool:
187
191
  """Check if the index has changed since a given time."""
188
192
  return self._indexChange > float(checkTime)
@@ -704,17 +708,19 @@ class Index:
704
708
  return 0, 0, 0
705
709
 
706
710
  def getReferences(self, tHandle: str, sTitle: str | None = None) -> dict[str, list[str]]:
707
- """Extract all references made in a file, and optionally title
708
- section.
711
+ """Extract all tags and references made in a file, and
712
+ optionally title section.
709
713
  """
710
- tRefs = {x: [] for x in nwKeyWords.VALID_KEYS}
714
+ refs = {x: [] for x in nwKeyWords.VALID_KEYS}
711
715
  for rTitle, hItem in self._itemIndex.iterItemHeaders(tHandle):
712
716
  if sTitle is None or sTitle == rTitle:
713
717
  for aTag, refTypes in hItem.references.items():
714
718
  for refType in refTypes:
715
- if refType in tRefs:
716
- tRefs[refType].append(self._tagsIndex.tagName(aTag))
717
- return tRefs
719
+ if refType in refs:
720
+ refs[refType].append(self._tagsIndex.tagName(aTag))
721
+ if tag := hItem.tag:
722
+ refs[nwKeyWords.TAG_KEY] = [self._tagsIndex.tagName(tag)]
723
+ return refs
718
724
 
719
725
  def getReferenceForHeader(self, tHandle: str, nHead: int, keyClass: str) -> list[str]:
720
726
  """Get the display names for a tags class for insertion into a
@@ -753,10 +759,12 @@ class Index:
753
759
  """Return all tags used by a specific document."""
754
760
  return self._itemIndex.allItemTags(tHandle) if tHandle else []
755
761
 
756
- def getClassTags(self, itemClass: nwItemClass | None) -> list[str]:
757
- """Return all tags based on itemClass."""
758
- name = None if itemClass is None else itemClass.name
759
- return self._tagsIndex.filterTagNames(name)
762
+ def getKeyWordTags(self, keyWord: str) -> list[str]:
763
+ """Return all tags usable for a specific keyword."""
764
+ if keyWord in nwKeyWords.CAN_LOOKUP:
765
+ itemClass = nwKeyWords.KEY_CLASS.get(keyWord)
766
+ return self._tagsIndex.filterTagNames(itemClass.name if itemClass else None)
767
+ return []
760
768
 
761
769
  def getTagsData(
762
770
  self, activeOnly: bool = True
@@ -342,20 +342,26 @@ class IndexHeading:
342
342
  ##
343
343
 
344
344
  def getReferences(self) -> dict[str, list[str]]:
345
- """Extract all references for this heading."""
345
+ """Extract all tags and references for this heading."""
346
346
  refs = {x: [] for x in nwKeyWords.VALID_KEYS}
347
347
  for tag, types in self._refs.items():
348
348
  for keyword in types:
349
349
  if keyword in refs and (name := self._cache.tags.tagName(tag)):
350
350
  refs[keyword].append(name)
351
+ if name := self._cache.tags.tagName(self._tag):
352
+ refs[nwKeyWords.TAG_KEY] = [name]
351
353
  return refs
352
354
 
353
355
  def getReferencesByKeyword(self, keyword: str) -> list[str]:
354
356
  """Extract all references for this heading."""
355
357
  refs = []
356
- for tag, types in self._refs.items():
357
- if keyword in types and (name := self._cache.tags.tagName(tag)):
358
+ if keyword == nwKeyWords.TAG_KEY:
359
+ if name := self._cache.tags.tagName(self._tag):
358
360
  refs.append(name)
361
+ else:
362
+ for tag, types in self._refs.items():
363
+ if keyword in types and (name := self._cache.tags.tagName(tag)):
364
+ refs.append(name)
359
365
  return refs
360
366
 
361
367
  ##
@@ -439,7 +439,7 @@ class NWItem:
439
439
  self.setClass(itemClass)
440
440
  if self._type == nwItemType.FILE:
441
441
  # Notify the index of the class change
442
- self._project.index.setItemClass(self._handle, itemClass)
442
+ self._project.index.refreshHandle(self._handle)
443
443
 
444
444
  if self._layout == nwItemLayout.NO_LAYOUT:
445
445
  # If no layout is set, pick one
@@ -37,7 +37,7 @@ from PyQt6.QtCore import QMargins, QSize
37
37
  from novelwriter import __version__
38
38
  from novelwriter.common import firstFloat, xmlElement, xmlSubElem
39
39
  from novelwriter.constants import nwHeadFmt, nwStyles
40
- from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt
40
+ from novelwriter.formats.shared import BlockFmt, BlockTyp, T_Formats, TextFmt, stripEscape
41
41
  from novelwriter.formats.tokenizer import Tokenizer
42
42
  from novelwriter.types import QtHexRgb
43
43
 
@@ -480,7 +480,7 @@ class ToDocX(Tokenizer):
480
480
  xmlSubElem(rPr, _wTag("color"), attrib={W_VAL: _docXCol(color)})
481
481
 
482
482
  if isinstance(text, str):
483
- for segment in RX_TEXT.split(text):
483
+ for segment in RX_TEXT.split(stripEscape(text)):
484
484
  if segment == "\n":
485
485
  xmlSubElem(xR, _wTag("br"))
486
486
  elif segment == "\t":