Compare commits

...

161 Commits
v2.2b1 ... v2.2

Author SHA1 Message Date
Veronica Berglyd Olsen
b6282772ae Release 2.2 (#1641) 2023-12-17 17:00:05 +01:00
Veronica Berglyd Olsen
bfecebc047 Update release notes 2023-12-17 16:56:43 +01:00
Veronica Berglyd Olsen
186737a170 Update file history info 2023-12-13 22:07:53 +01:00
Veronica Berglyd Olsen
f32383ea99 Update changelog 2023-12-13 21:25:26 +01:00
Veronica Berglyd Olsen
4097949c44 Update translations 2023-12-13 21:24:50 +01:00
Veronica Berglyd Olsen
10feafeab4 Bump version for release 2.2 2023-12-10 22:21:25 +01:00
Veronica Berglyd Olsen
399a867836 Update docs with 2.2 features (#1640) 2023-12-10 22:18:03 +01:00
Veronica Berglyd Olsen
6f3702f2df Update docs organising section 2023-12-10 22:12:59 +01:00
Veronica Berglyd Olsen
7dc9e65f68 Update docs using novelWriter section 2023-12-10 21:53:04 +01:00
Veronica Berglyd Olsen
1740bbedbd Update docs introduction section 2023-12-10 18:39:29 +01:00
Veronica Berglyd Olsen
8585334a51 Update buttons in viewer and editor (#1638) 2023-12-04 09:12:30 +01:00
Veronica Berglyd Olsen
553b76cafc Update en_US and nb_NO translations 2023-12-03 18:58:01 +01:00
Veronica Berglyd Olsen
c04e1035a7 Merge branch 'main' into gui_fixes 2023-12-03 18:48:26 +01:00
Veronica Berglyd Olsen
dfbb61a37e Add viewer panel importance info (#1639) 2023-12-03 18:47:09 +01:00
Veronica Berglyd Olsen
cb485c5c86 Revert deleting the view button in viewer panel, but keep the double click change 2023-12-03 18:37:47 +01:00
Veronica Berglyd Olsen
62a94850a6 Add tooltips to all entries in the viewer panel and update translation file 2023-12-03 18:24:55 +01:00
Veronica Berglyd Olsen
99c00f8b93 Update tests 2023-12-03 18:20:23 +01:00
Veronica Berglyd Olsen
cbb000a18f Drop the view column in the viewer panel 2023-12-03 18:18:00 +01:00
Veronica Berglyd Olsen
847d8ab726 Add importance column to document viewer panel (#1620) 2023-12-03 18:15:16 +01:00
Veronica Berglyd Olsen
9f1e2d322e Re-order formats menu to be consistent with toolbar 2023-12-03 17:55:12 +01:00
Veronica Berglyd Olsen
b7c657141f Update translations 2023-12-03 17:43:28 +01:00
Veronica Berglyd Olsen
023f6bed01 Update base translation file 2023-12-03 17:34:08 +01:00
Veronica Berglyd Olsen
fff6ba98bc Rename emph and strong to italic and bold for consistency and add tooltips to editor toolbar 2023-12-03 17:33:15 +01:00
Veronica Berglyd Olsen
776eedc5f2 Drop the markdown/shortcode toggle feature from editor toolbar and update icons (#1636, #1637) 2023-12-03 16:56:36 +01:00
Veronica Berglyd Olsen
f2eaaa09b6 Turn viewer footer button and label into text buttons (#1628) 2023-12-03 16:10:09 +01:00
Veronica Berglyd Olsen
60b0a4c901 Update extensions (#1634) 2023-11-29 22:35:02 +01:00
Veronica Berglyd Olsen
a6d346fcb6 Clean up and fix minor issues with GUI extensions 2023-11-29 22:21:56 +01:00
Veronica Berglyd Olsen
78a75d5719 Fix some minor issues (#1632) 2023-11-29 21:59:36 +01:00
Veronica Berglyd Olsen
f59317c2b5 Remove alternative apostrophe from auto select logic because it is already a letter 2023-11-29 21:55:07 +01:00
Veronica Berglyd Olsen
b203bcdcff Include apostrophes when auto selecting in editor (#1624) 2023-11-29 21:48:09 +01:00
Veronica Berglyd Olsen
a31f42b04c Clean up novel view and improve coverage 2023-11-29 21:24:07 +01:00
Veronica Berglyd Olsen
ce666d9d7a Scroll novel view when looping through documents (#1555) 2023-11-29 20:55:05 +01:00
Veronica Berglyd Olsen
ef93b41240 Clean up alert boxes and update event filters (#1631) 2023-11-29 16:12:08 +01:00
Veronica Berglyd Olsen
1118f01c91 Combine all event filters in one module, and apply the status tip filter to the sidebar as well 2023-11-29 16:05:58 +01:00
Veronica Berglyd Olsen
b526315084 Clean up some redundant code and fix annotations 2023-11-29 16:05:14 +01:00
Veronica Berglyd Olsen
1d1dae0c7e Remove caching of the alert object in the shared instance 2023-11-29 16:03:48 +01:00
Veronica Berglyd Olsen
1edfcfcd91 Add debug comment 2023-11-29 08:10:16 +01:00
Veronica Berglyd Olsen
82e9fb0c44 Fix minor optimisation issue 2023-11-29 08:06:56 +01:00
Veronica Berglyd Olsen
1b8d424b27 Filter menu status tips (#1630) 2023-11-29 00:05:06 +01:00
Veronica Berglyd Olsen
4ab2b04e6b Add an event filter to remove status tip updates 2023-11-28 23:57:41 +01:00
Veronica Berglyd Olsen
d291995c0e Add deleteLater to temporary widgets (#1629) 2023-11-28 23:27:36 +01:00
Veronica Berglyd Olsen
54510951de Rename lipsum button 2023-11-28 23:21:35 +01:00
Veronica Berglyd Olsen
52d1d87985 Add the new flag to the command line help 2023-11-28 23:20:49 +01:00
Veronica Berglyd Olsen
62847e55f0 Rewrite how lipsum text is inserted 2023-11-28 23:14:23 +01:00
Veronica Berglyd Olsen
bf6cefa840 Update dialog handling of all dialogs 2023-11-28 22:12:30 +01:00
Veronica Berglyd Olsen
4e1fa01562 Add widget diff info to help debug memory issues 2023-11-28 17:29:34 +01:00
Veronica Berglyd Olsen
83c9fb96e9 Add memory usage debug info for status bar 2023-11-28 16:44:01 +01:00
Veronica Berglyd Olsen
ff7f27ff97 Add closeEvents to dialogs and set the deleteLater command 2023-11-28 16:29:21 +01:00
Veronica Berglyd Olsen
50a9b5b5e2 Fix some annotations and add deleteLater to non-modal dialogs 2023-11-27 21:43:13 +01:00
Veronica Berglyd Olsen
4fa20273f7 Clean up dialogs 2023-11-27 17:10:29 +01:00
Veronica Berglyd Olsen
93b36406f1 Make sure context menus are deleted after use 2023-11-27 16:30:21 +01:00
Veronica Berglyd Olsen
a0e6f9cf82 Fix various bugs and minor issues (#1626) 2023-11-27 16:17:01 +01:00
Veronica Berglyd Olsen
1f9b6d7624 Fix icons not updating on theme switch in viewer panel 2023-11-27 16:08:34 +01:00
Veronica Berglyd Olsen
ccc444f355 Fix section sizes for viewer panel (#1627) 2023-11-27 16:08:00 +01:00
Veronica Berglyd Olsen
ba0198407f Change panel label back to "References" 2023-11-27 07:42:25 +01:00
Veronica Berglyd Olsen
918b077252 Drop the space in front of Synopsis and Short comments inserts 2023-11-26 22:12:23 +01:00
Veronica Berglyd Olsen
b348ba6aff Update Main GUI launch test 2023-11-26 22:02:01 +01:00
Veronica Berglyd Olsen
e521a30612 Remove warning for alpha releases 2023-11-26 21:43:32 +01:00
Veronica Berglyd Olsen
2e2ab5ad6f Update project load dialog 2023-11-26 21:40:51 +01:00
Veronica Berglyd Olsen
47781f981f Fix wrong keyboard shortcut for Short comment insert 2023-11-26 21:40:05 +01:00
Veronica Berglyd Olsen
0676056968 Update translations (#1625) 2023-11-26 20:58:25 +01:00
Veronica Berglyd Olsen
65562ae790 Update base translation, US English, Norwegian, and Japanese 2023-11-26 16:20:14 +01:00
Veronica Berglyd Olsen
623f74019f Fix wrong PR mentioned in changelog 2023-11-26 15:09:43 +01:00
Veronica Berglyd Olsen
55e0dc3030 Release 2.2 RC1 (#1615) 2023-11-26 14:31:53 +01:00
Veronica Berglyd Olsen
9af7ff447b Update changelog 2023-11-26 14:29:53 +01:00
Veronica Berglyd Olsen
c71a5c0997 Merge branch 'dev' into release_2.2rc1 2023-11-26 14:03:05 +01:00
Veronica Berglyd Olsen
efea1a3140 Merge branch 'main' into dev 2023-11-26 14:02:11 +01:00
Veronica Berglyd Olsen
1fcae908ec Add "short description" feature, replace "summary" (#1622) 2023-11-26 14:01:49 +01:00
Veronica Berglyd Olsen
b9b4969b85 Rename once again, and use short instead for short descriptions of notes 2023-11-26 13:58:00 +01:00
Veronica Berglyd Olsen
f919149c58 Rename "brief" to "summary" (#1621) 2023-11-26 00:02:43 +01:00
Veronica Berglyd Olsen
6fd4417350 Fix variable name and test 2023-11-25 23:57:12 +01:00
Veronica Berglyd Olsen
bedd71b105 Add a summary entry to the insert menu (#1619) 2023-11-25 23:51:30 +01:00
Veronica Berglyd Olsen
53aa970427 Rename "brief" to "summary" 2023-11-25 23:42:05 +01:00
Veronica Berglyd Olsen
9fc815abe1 Add project note briefs (#1618) 2023-11-25 19:01:15 +01:00
Veronica Berglyd Olsen
b17b5d32c2 Allow double-clicking in viewer panel 2023-11-25 18:53:11 +01:00
Veronica Berglyd Olsen
05e63cb01e Make the columns in the viewer panel resizeable 2023-11-25 18:45:06 +01:00
Veronica Berglyd Olsen
519e5857d1 Add a column to viewer panel to show the brief 2023-11-25 18:23:09 +01:00
Veronica Berglyd Olsen
6a6b05c338 Update tokenizer and converters 2023-11-25 18:12:45 +01:00
Veronica Berglyd Olsen
8ed85363e2 Add test coverage and update the highlighter 2023-11-25 17:50:59 +01:00
Veronica Berglyd Olsen
887b4379b2 Add comment style processing to the index class 2023-11-25 17:50:25 +01:00
Veronica Berglyd Olsen
3a030c9acb Fix Ctrl+Del regression (#1616) 2023-11-25 16:31:37 +01:00
Veronica Berglyd Olsen
e216f80d64 Revert previous change of keyboard shortcut for item delete in tree made in #1590 2023-11-25 16:27:40 +01:00
Veronica Berglyd Olsen
74c5a66a4c Fix typos in changelog 2023-11-25 16:24:27 +01:00
Veronica Berglyd Olsen
8738bc562e Update alpha version warning, and drop the translation 2023-11-23 23:53:22 +01:00
Veronica Berglyd Olsen
c6f06866bd Bump version for 2.2 RC1 2023-11-23 20:44:47 +01:00
Veronica Berglyd Olsen
b7eede22da Add a context menu entry to set item name from heading (#1614) 2023-11-23 20:39:28 +01:00
Veronica Berglyd Olsen
e02d2b9298 Add annotations import to all test source files 2023-11-23 20:35:17 +01:00
Veronica Berglyd Olsen
de11ea389a Add test coverage of editor context menu 2023-11-23 20:25:18 +01:00
Veronica Berglyd Olsen
3f842c2fbe Add a context menu option to rename a document from any title within it 2023-11-23 19:40:17 +01:00
Veronica Berglyd Olsen
d35dfda92f Change set selection from doc header to use a signal/slot set 2023-11-23 19:04:35 +01:00
Veronica Berglyd Olsen
84eff433fb Clean up Qt enums in doc viewer 2023-11-23 18:52:42 +01:00
Veronica Berglyd Olsen
8c3c85f259 Clean up Qt enums in doc editor 2023-11-23 18:36:08 +01:00
Veronica Berglyd Olsen
39e1c54c33 Add a button to open manuscript build folder (#1613) 2023-11-23 16:55:22 +01:00
Veronica Berglyd Olsen
2998f2c363 Update tests 2023-11-23 16:45:14 +01:00
Veronica Berglyd Olsen
4bd830f0d6 Add an "Open Folder" button to build dialog (#1554) 2023-11-23 16:45:08 +01:00
Veronica Berglyd Olsen
30b4e5511a Add a common function to open file paths externally 2023-11-23 16:43:56 +01:00
Veronica Berglyd Olsen
4f9aab3c81 Add multi selection to project tree (#1612) 2023-11-22 19:00:25 +01:00
Veronica Berglyd Olsen
445414d126 Improve test coverage of project tree 2023-11-22 18:48:10 +01:00
Veronica Berglyd Olsen
62ea54e1ed Add test coverage of tree context menu class 2023-11-22 18:08:34 +01:00
Veronica Berglyd Olsen
ea0358b2ed Move project tree context menu to a separate class 2023-11-22 18:08:07 +01:00
Veronica Berglyd Olsen
d7730fb7c2 Clean up a few bits 2023-11-22 00:12:14 +01:00
Veronica Berglyd Olsen
40f6a108ed Add a multi-select context menu and handlers 2023-11-22 00:03:51 +01:00
Veronica Berglyd Olsen
33a30f3875 Remove tree undo and fix drop on root issue 2023-11-21 23:13:12 +01:00
Veronica Berglyd Olsen
f75ed33cec Add a working implementation of multi-item move 2023-11-21 22:26:10 +01:00
Veronica Berglyd Olsen
1a2bd7d640 Update Qt enums and set selection to multi select 2023-11-21 20:26:19 +01:00
Veronica Berglyd Olsen
afc04514a0 Add a tool to download spell check dictionaries (#1611) 2023-11-20 18:22:09 +01:00
Veronica Berglyd Olsen
d741a75de8 Clean up and add test coverage 2023-11-20 18:14:00 +01:00
Veronica Berglyd Olsen
71d17da483 Complete new Add Dictionaries tool 2023-11-20 17:26:12 +01:00
Veronica Berglyd Olsen
e00e64dc46 Copy changes from download_dicts branch 2023-11-20 17:24:49 +01:00
Veronica Berglyd Olsen
c585c87633 Remove two annotations in tests that block using older pytest versions 2023-11-18 21:12:09 +01:00
Veronica Berglyd Olsen
40c07973ce Disable hidden tab feature for older Qt libs 2023-11-18 21:04:35 +01:00
Veronica Berglyd Olsen
2fca22359b Improve cursor visibility features (#1608) 2023-11-18 15:59:48 +01:00
Veronica Berglyd Olsen
83187c517f Ensure cursor is visible after showing or closing the document viewer (#1302) 2023-11-18 15:56:03 +01:00
Veronica Berglyd Olsen
208b9334e1 Ensure cursor is visible after switching focus mode (#1478) 2023-11-18 15:43:51 +01:00
Veronica Berglyd Olsen
17fc370609 Fix some typos 2023-11-18 14:14:10 +01:00
Veronica Berglyd Olsen
ab35d1a0bf Add a new document viewer panel for tags and references (#1606) 2023-11-17 23:30:11 +01:00
Veronica Berglyd Olsen
69ccb1560c Update index test 2023-11-17 23:20:16 +01:00
Veronica Berglyd Olsen
d4560b3be8 Add test coverage of document viewer panel 2023-11-17 23:01:59 +01:00
Veronica Berglyd Olsen
fca941b726 Merge branch 'dev' into new_ref_panel 2023-11-17 21:39:30 +01:00
Veronica Berglyd Olsen
eda9a076d6 Clean up config and improve project tree test coverage (#1607) 2023-11-17 21:38:42 +01:00
Veronica Berglyd Olsen
1279b0e5b7 Fix bug from project tree test 2023-11-17 21:33:22 +01:00
Veronica Berglyd Olsen
16a56d6f60 Improve test coverage of project tree 2023-11-17 21:28:44 +01:00
Veronica Berglyd Olsen
c501e12c9d Remove deprecated config fields and update tests 2023-11-17 16:35:05 +01:00
Veronica Berglyd Olsen
dd05f6532a Update document viewer tests 2023-11-17 16:22:59 +01:00
Veronica Berglyd Olsen
1098354fca Fix broken test 2023-11-17 07:55:43 +01:00
Veronica Berglyd Olsen
f81c9aa319 Clean up document viewer class 2023-11-17 00:06:29 +01:00
Veronica Berglyd Olsen
9d662a0d40 Rename index signal function 2023-11-16 22:31:41 +01:00
Veronica Berglyd Olsen
123d9df170 Rewrite and improve the index event signal feature 2023-11-16 19:12:01 +01:00
Veronica Berglyd Olsen
844240b5b8 Fix broken tests 2023-11-16 00:23:59 +01:00
Veronica Berglyd Olsen
3d17d8e08c Clean up the viewer panel code a bit 2023-11-15 22:09:18 +01:00
Veronica Berglyd Olsen
f51223e7c3 Rename the tab count function just to be safe 2023-11-15 21:58:41 +01:00
Veronica Berglyd Olsen
b94e012f8f Fix bug with clearing class tag lists 2023-11-15 21:46:32 +01:00
Veronica Berglyd Olsen
2fc8e43e71 Connect the edit and view buttons 2023-11-15 21:38:45 +01:00
Veronica Berglyd Olsen
565350fcfb Clean up tree item updates 2023-11-15 21:14:40 +01:00
Veronica Berglyd Olsen
e82d5277c0 Add signal for re-indexed document 2023-11-15 21:03:12 +01:00
Veronica Berglyd Olsen
6b9d92e75a Add handlers for document label change 2023-11-15 20:13:23 +01:00
Veronica Berglyd Olsen
8508248f12 Add signal for processing tag changes 2023-11-15 20:12:17 +01:00
Veronica Berglyd Olsen
2cb6020cac Added tags changed signal 2023-11-15 18:11:37 +01:00
Veronica Berglyd Olsen
3f8220f350 Added tag data to viewer panels 2023-11-15 18:11:15 +01:00
Veronica Berglyd Olsen
f5901a4c8c Added new icons for the viewer panel 2023-11-15 18:10:29 +01:00
Veronica Berglyd Olsen
f4be38dd65 Populate the back reference panel 2023-11-14 23:56:51 +01:00
Veronica Berglyd Olsen
4d7ef63e83 Connect the new viewer panel and add icon for it 2023-11-14 22:41:39 +01:00
Veronica Berglyd Olsen
1d89e4935f Merge branch 'dev' into new_ref_panel 2023-11-14 11:06:04 +01:00
Veronica Berglyd Olsen
51337ae4e5 Increase button padding in sidebar by 2px 2023-11-14 10:48:47 +01:00
Veronica Berglyd Olsen
66dfe25e17 Fix bug in sidebar tooltip 2023-11-13 22:46:30 +01:00
Veronica Berglyd Olsen
c5322341ec Bring back the "Scroll past end" setting (#1605) 2023-11-13 22:13:39 +01:00
Veronica Berglyd Olsen
a5755c47e5 Add types to the Preferences dialog, and update tests 2023-11-13 22:09:38 +01:00
Veronica Berglyd Olsen
68af4aec86 Add back the scroll past end setting 2023-11-13 22:09:07 +01:00
Veronica Berglyd Olsen
0b35227756 Fix some usability issues in the UI (#1601) 2023-11-12 21:45:18 +01:00
Veronica Berglyd Olsen
a5b2e47098 Don't block auto-replace on keyword lines, and only show completer on single keypresses 2023-11-12 21:27:24 +01:00
Veronica Berglyd Olsen
a3f9d88271 Remove 2 px margin on sidebar 2023-11-12 20:59:00 +01:00
Veronica Berglyd Olsen
28b3046e51 Update editor code history 2023-11-12 20:55:31 +01:00
Veronica Berglyd Olsen
e7ea9d45e5 Improve how formatting is applied in the editor (#1600) 2023-11-12 20:45:37 +01:00
Veronica Berglyd Olsen
45b278f999 Fix an outdated comment 2023-11-12 20:38:38 +01:00
Veronica Berglyd Olsen
37e0319598 Clean up code a bit 2023-11-12 20:38:03 +01:00
Veronica Berglyd Olsen
7cf7eb4a48 Fix test coverage 2023-11-12 20:21:35 +01:00
Veronica Berglyd Olsen
597b788254 Implement a new word auto select feature that is more careful with punctuation 2023-11-12 20:11:31 +01:00
Veronica Berglyd Olsen
e4206bdcc0 Make autoselect and formatting selection a bit smarter 2023-11-12 19:44:24 +01:00
Veronica Berglyd Olsen
5f80a6b400 Update PyPi info 2023-11-12 15:33:05 +01:00
Veronica Berglyd Olsen
09022ba41a Add post-release fixes 2023-11-12 15:31:53 +01:00
Veronica Berglyd Olsen
fa32ef248b Add a basic doc viewer panel class 2023-11-09 17:49:29 +01:00
198 changed files with 13670 additions and 9970 deletions

View File

@@ -1,5 +1,173 @@
# novelWriter Changelog
## Version 2.2 [2023-12-17]
### Release Notes
This release comes with a number of new features. These are some highlights.
In addition to the common Markdown style formatting for bold, italic and strike through, a set of
new shortcodes have been added. The shortcodes are far more flexible than the Markdown style
syntax, and can be used for more complex formatting cases. Like when you need to add multiple,
overlapping formats, or add emphasis to just a part of a word. The shortcodes also allow for
underline, subscript and superscript, which the Markdown syntax does not. The new formats are
available in the "Format" menu, and in a new toolbar in the editor that can be enabled by clicking
the three dots in the top--left corner. The shortcode format was chosen because it can later be
extended to include other requested features as well. Please have a look at the documentation for
more details about the new shortcodes.
The Tags and References system has been improved. The tags themselves are no longer case sensitive
when you use them in references, but they are still displayed as you typed them in the tag
definition when they are displayed in the user interface. Starting to type the `@` symbol in the
text editor, on a new line, will now open an auto-completer menu which will display available
options. It may not display all of your tags if you have a lot of them, but starting to type more
characters will filter the list down further.
You can now automatically create a note file for a new tag that you have added to a reference list
in a document, but is not yet defined in a project note. So, for instance, if you come up with a
new character while writing, and add a new tag to your `@char` references, you can right-click the
new tag and create a new note for that entry directly. In addition, it is now also possible to
right-click a heading in an open document and set the item label in the project tree to match the
heading.
In addition to the changes in the editor, the "References" panel below the document viewer has also
been completely redesigned. It now shows all the references to the document you are viewing as a
list, with a lot more details than before. In addition, tabs in the panel will appear to show all
the tags you have defined in your notes, sorted as one tab per category. Like for instance
Characters, Locations, Objects, etc. You can also give each note a short description comment on the
same format as the summary comments for chapters and scenes. The short description comment can be
added from the "Insert" menu under "Special Comments".
The last major change in this release is the new multi-select feature in the project tree. You can
now select multiple documents and folders using the mouse while pressing `Ctrl` or `Shift`. By
right-clicking the selected items, you can perform a limited set of operations on all of them, like
changing active status, and the status or importance labels. You can also drag and drop multiple
items under the condition that all the selected items are in the same folder, at the same level.
This restriction is in place due to limitations in the framework novelWriter is based on. But this
should help in cases where multiple documents need to be moved in and out of folders or between
folders. Note that adding the multi-select feature meant that the undo feature of the project tree
had to be removed. It may be added back later.
_These Release Notes also include the changes from the 2.2 Beta 1 and 2.2 RC 1 releases._
### Detailed Changelog
**Bugfixes**
* Fix column widths for columns with no text in the viewer panel lists, and fix an issues where
icons were not updated on theme switch. Issue #1627. PR #1626.
* Fix auto-selection of words with apostrophes. Issue #1624. PR #1632.
**Usability**
* Use `Ctrl+K, H` for inserting short description comments (alias to synopsis), drop the space
after the `%` symbol when inserting special comments, add a browse icon to the open open project
dialog, and remove the popup warning for Alpha releases. PR #1626.
* Menu entries no longer clear the status bar message when they are hovered. This was caused by a
status tip feature in Qt, which prints a blank message to the status bar. PR #1630.
* The novel view panel now scrolls to bring the current document into view when iteratively
searching through documents in the project. Issue #1555. PR #1632.
* The progress bar on the Manuscript Build dialog now stays for 3 seconds after completion instead
of 1 second. PR #1634.
* The document viewer panel now shows the importance label next to each entry, and double-clicking
an entry will open it in the viewer. All entries also now show the content in tooltips so that
the columns can be shrunk to only view the icon if there is too little space. Issue #16220.
PR #1639.
* The editor toolbar no longer uses the same buttons for markdown and shortcodes style formatting.
They have each received their separate buttons. Some additional space has been added between the
two types of buttons to visually separate them. Issues #1636 and #1637. PR #1638.
* Convert the Synopsis and Comment buttons in the document viewer footer to buttons with both icon
and text, and drop the label. Issue #1628. PR #1638.
**Internationalisation**
* Updated US English, Norwegian, Japanese, Latin American Spanish, French, and Italian
translations. PRs #1625 and #1641.
**Documentation**
* The documentation has been updated to cover new features in 2.2. PR #1640.
**Code Improvements**
* Improve memory usage by making sure C++ objects are deleted when they are no longer used. There
is an issue between the Python and Qt side of things where objects are left in memory and not
properly garbage collected when they run out of scope. A number of deferred delete calls have
been added that seems to solve most of these cases. A `--meminfo` flag has been added to the
command line arguments to provide diagnostic data to help debug such issues. PR #1629.
* Improve handling of alert boxes and their memory clean up, and refactor event filters. PR #1631.
* Clean up unused methods in GUI extensions. PR #1634.
----
## Version 2.2 RC 1 [2023-11-26]
### Release Notes
This is a release candidate of the next release version, and is intended for testing purposes.
Please be careful when using this version on live writing projects, and make sure you take frequent
backups.
Please check the changelog for an overview of changes. The full release notes will be added to the
final release.
### Detailed Changelog
**Bugfixes**
* Revert the change of keyboard shortcut to delete a project tree item made in 2.2 Beta 1 as it
blocks certain features in the editor. This is a regression. PR 1616.
**Features**
* The old References panel under the Document Viewer has been replaced with a completely new widget
with a lot more features. The Back-references panel is still there, but is now a scrollable list
with a lot more information. In addition, tabs for each category of tags are available when there
are tags defined for them. These panels list all available tags, with a good deal of information
about them that may be useful to the writer, as well as buttons to open them in the viewer or
editor. Issues #925 and #998. PR #1606.
* Multi-select is now possible in the project tree, with some limitations. Drag and drop is only
permitted if the selected items have the same parent item. Any other drag and drop selection will
be cancelled and the user notified. A new context menu has been added for the case when multiple
items are selected, with a reduced set of options that can be collectively applied to them.
Issues #1549 and #1592. PR #1612.
* The "Scroll Past End" setting in Preferences has been added back in. It is slightly different
than the old one, as this one uses the Qt Plain Text Editor implementation, which has some side
effects some users may want to avoid. Issue #1602. PR #1605.
* For Windows users, there is now an "Add Dictionaries" tool in the Tools menu where new spell
check dictionaries can be added. Links are provided to sources for these dictionaries, and a file
selector tool to import the files into novelWriter. Issue #982. PR #1611.
* You can now update the name of a document by right-clicking on any heading inside the document
and select "Set as Document Name". This will open the Rename dialog with the text of the heading
pre-filled. Issue #1503. PR #1614.
* A new special comment, called "Short" can be added to Project Notes. They are identical to
Synopsis comments, and are in fact just an alias for them. The "Short Description" will be
displayed alongside the tags in the new panel under the Document Viewer. Issues #1617 and #1621.
PRs #1617, #1619 and #1622.
**Usability**
* The feature to auto select word under cursor no longer uses the default Qt implementation, and
has instead been implemented by iterating backward and forward in the text to find the nearest
word boundaries. It will stop on characters that aren't Unicode alphanumeric as per Python's
definition. Toggling markup will also move the cursor to after the markup if it was already at
the end of the word. Otherwise it remains within the word at the same position. The word is not
selected after formatting if it wasn't selected before. If no selection was made, and no word is
auto selected, the formatting tags are inserted in-place with the cursor in the middle.
Issues #1333 and #1598. PR #1600.
* The auto complete context menu is now only triggered on actual user input consisting of adding or
removing a single character. PR #1601.
* Various improvements to the visibility of the cursor when the dimensions of the editor changes
have been added. Like for instance keeping the cursor visible when opening or closing the Viewer
panel, or toggling Focus Mode. Issues #1302 and #1478. PR #1608.
* The Manuscript Build dialog now has a button to open the output folder. Issue #1554. PR #1613.
**Code Improvements**
* Improve test coverage. PR #1607.
----
## Version 2.2 Beta 1 [2023-11-11]
### Release Notes
@@ -32,14 +200,14 @@ final release.
that tag will appear in the menu. On selection, it will create a note in the first root folder of
the correct kind, and set the title and tag to match the undefined reference, making it instantly
defined. Issues #1580 and #823. PR #1582.
* Shortcodes have been added to the Document Editor. Shorcodes are HTML-like syntax, but uses
* Shortcodes have been added to the Document Editor. Shortcodes are HTML-like syntax, but uses
square brackets instead of angular brackets. So `[b]text[/b]` will make the word "text" appear as
bold. Shortcodes currently support bold, italic, striketrough, underline, superscript and
bold. Shortcodes currently support bold, italic, strike trough, underline, superscript and
subscript text. The first three are complimentary to the Markdown-like syntax that. The benefit
of the shortcode emphasis syntax, however, is that it does not care about word boundaries, and
can therefore be used any place in the text. Including in the middle of words. Issues #1337 and
#1444. PRs #1540 and #1583.
* A show/hide toolbar has been added to the editor where toolbuttons for formatting options are
* A show/hide toolbar has been added to the editor where tool buttons for formatting options are
available. The toolbar is hidden by default, but can be activated from a three dots icon in the
top left corner of the editor. Issue #1585. PR #1584.
* Build Definitions in the Manuscript Build tool can now be re-ordered, and the order is preserved
@@ -48,26 +216,26 @@ final release.
**Usability**
* The Settings menu in the sidebar now always pops out to the right and upwards from the bottom of
the icon. The previous behaviour was not guaranteed to stay in the vissible area of the screen.
the icon. The previous behaviour was not guaranteed to stay in the visible area of the screen.
PR #1520.
* The right click action on a misspelled word now uses the actual spell checker data for lookup.
Previously, the spell checker would underline a word that was misspelled, but the right click
action actually had no way of reading where the error line was, so it had to guess again what
word the user was clicking. Since these two parts of the code used different logic, they
sometimes produced different results. The spell checker now saves the location of each spell
check error, and the right click action retrieves this data when genrating suggestions, which
check error, and the right click action retrieves this data when generating suggestions, which
should eliminate the problem of picking the correct word boundaries. Issue #1532. PR #1525.
* The language of a project is not set in the New Project Wizard and in Project Settings. It is no
longer defined in the Build Settings panel. Issue #1588. PR #1589.
* The way switching focus and view in the main GUi has changed. Pressing `Ctrl+T` will now switch
* The way switching focus and view in the main GUI has changed. Pressing `Ctrl+T` will now switch
focus to the Project or Novel Tree if focus is elsewhere, or if either have focus already, it
will switch view to the other tree. Pressing `Ctrl+E` will switch focus and view to the Document
Editor. Pressing `Ctrl+Shift+T` will do the same for the Outline View. The old Alt-based shorcuts
have been removed. Issues #1310 and #1291. PR #1590.
Editor. Pressing `Ctrl+Shift+T` will do the same for the Outline View. The old Alt-based
shortcuts have been removed. Issues #1310 and #1291. PR #1590.
**User Interface**
* The labels under the sidebar buttons have been removed. The tooltips have the necessary
* The labels under the sidebar buttons have been removed. The tool tips have the necessary
information. PR #1520.
**Other Improvements**
@@ -105,7 +273,7 @@ changes have been fixed as well. See the full changelog for more details.
Qt 5.15.8. In particular, it is possible to drop items on the root level, and it's possible to
move root items to other locations. Neither should be possible and will severely mess up the
project if done. Issue #1569. PR #1570.
* Add a custom autoscroll feature when dragging an item in the project tree to near the top or
* Add a custom auto-scroll feature when dragging an item in the project tree to near the top or
bottom. This is actually a default feature of the tree widget in the Qt library, but this too is
broken in some versions of Qt 5.15.x. The default feature has been permanently disabled and
replaced by a custom written feature that behaves similarly. Issue #1561. PR #1571.
@@ -327,7 +495,7 @@ This is a patch release that fixes a few issues and adds a Japanese translation.
The issues were mostly related to spell checking. In particular, issues with finding the word
boundary when using underscore characters for italics markup. These issues should now be resolved.
In addition, escaped markup characters are now renderred properly in HTML and ODT build formats.
In addition, escaped markup characters are now rendered properly in HTML and ODT build formats.
A few usability improvements have also been made. The Add Item menu in the project tree no longer
shows the options to create Novel Documents when an item in the tree is selected that cannot hold
@@ -487,7 +655,7 @@ This is a patch release that fixes a few bugs and usability issues. The editing
importance labels in Project Settings should now be a bit more intuitive. Opening a document from
the Outline View that is already open in the editor should now switch to the editor view. The
convert folder to note or document feature in the project tree has also been fixed. Some icons have
been updated and a renderring issue with one of them fixed. Chinese, Norwegian, US English, German
been updated and a rendering issue with one of them fixed. Chinese, Norwegian, US English, German
and Spanish translations have been updated as well. A new credits tab has been added to the About
dialog box, replacing the Credits section on the main About tab.
@@ -757,7 +925,7 @@ opened, a request to update the file format will show up.
PR #1212.
* The GUI theme now determines which icon theme is to be loaded. It is no longer a separate
setting. The icon theme can also be reloaded without restart. Issue #1172. PR #1212.
* The block formating features in the Format menu now also works on empty lines. Issue #1178.
* The block formatting features in the Format menu now also works on empty lines. Issue #1178.
PR #1214.
* There is now a Format menu entry and shortcut code for synopsis comments. Issue #1177. PR #1214.
* The split document dialog now has the option to move teh source document to trash. Issue #1179.
@@ -794,7 +962,7 @@ opened, a request to update the file format will show up.
correct type information. PR #1197.
* Saving and loading of XML data is now handled by a separate set of reader and writer classes. The
reader class is capable of reading all file formats that have been used thus far. The various
data classes have been improved, and a new XML file formart version 1.5 added. Issue #1189.
data classes have been improved, and a new XML file format version 1.5 added. Issue #1189.
PRs #1221 and #1232.
* The index is now automatically rebuilt when the project file format is updated. Issue #1235.
PR #1236.
@@ -987,8 +1155,8 @@ final release.
setting is preserved. Previously, the Importance setting would overwrite it during the
conversion. PR #1030.
* Item labels, Status labels, and other labels on the GUI are now run through a "simplify" function
before being accepted. This functions strips out all whitespaces and consecutive whitespaces and
replace them with single plain whitespaces. This is a safer format to store in XML, and also
before being accepted. This functions strips out all white spaces and consecutive white spaces
and replace them with single plain white spaces. This is a safer format to store in XML, and also
makes sure there aren't invisible characters floating around in the labels. PR #1038.
* Due to the changes to how drag and drop works, there are no longer any restrictions on folders
and documents. Only root folders remain restricted in terms of moving. Root folders can only be
@@ -1494,7 +1662,7 @@ checking enabled if there is something wrong with the spell check package.
**Bugfixes**
* When the HTML converter replaced grater than or smaller than symbols with the corresponding HTML
entities. the poisition of the formatting tags following in the text would be shifted, but the
entities. the position of the formatting tags following in the text would be shifted, but the
positions were not updated. This is now solved by updating these positions when such a symbol is
encountered. This issue has been backported from 1.6 development. Issue #929.
* If the pyenchant package is installed, but the underlying enchant library is broken in one way or
@@ -1659,7 +1827,7 @@ backups.
the case. Having two alternative spell checkers complicated the code a great deal, and the
internal spell checker also required full word lists to be distributed with novelWriter. PR #875.
* Added a setting in Preferences to change how the word count on the status bar is calculated. The
new setting allows the project notes to be filetred out, leaving only the word count for novel
new setting allows the project notes to be filtered out, leaving only the word count for novel
files. Feature request #857. PR #882.
**Installation and Packaging**
@@ -1678,7 +1846,7 @@ backups.
**Internationalisation**
* The US English and Nowregian translation files have been updated. PR #884.
* The US English and Norwegian translation files have been updated. PR #884.
**Documentation**
@@ -1709,7 +1877,7 @@ careful when using this version on live writing projects, and make sure you take
**Internationalisation**
* The US English and Nowregian translation files have been updated. PR #870.
* The US English and Norwegian translation files have been updated. PR #870.
**Documentation**
@@ -2297,7 +2465,7 @@ buttons were blocked when they shouldn't. This release resolves these issues.
This release is mainly focused on the Build Novel Project tool. Completely new export classes have
been written to support Open Document and Markdown exports. In addition, the way document layouts
are handled have been automated a little to assist the user in keeping header levels and document
layout flags in sync. The third new additoion is the ability to record and log idle time during a
layout flags in sync. The third new addition is the ability to record and log idle time during a
writing session to improve the writing statistics information as requested by several users.
Finally, it is now possible to directly edit the project dictionary via a new, simple GUI dialog.
@@ -2390,7 +2558,7 @@ _These Release Notes also include the changes from 1.2 Beta 1 and RC 1._
the index on next load. For earlier versions of novelWriter before 1.1.1, it would also cause a
crash. Invalid keywords are now rejected during indexing. Issue #688. PR #689.
* The "Empty Trash" option was no longer working due to an earlier fix that added a requirement
that the project tree has focus to allow the emptying to procede. Since the Empty Trash feature
that the project tree has focus to allow the emptying to proceed. Since the Empty Trash feature
opens a dialog, the tree loses focus, and the deletions are therefore ignored. The focus check is
no longer considered when emptying the trash. Issue #701. PR #702.
@@ -2450,7 +2618,7 @@ _The Release Notes have been moved and merged into the 1.2 RC 1 notes._
* A full Markdown exporter has been written and added for the Build Novel Project tool. This too
replaces a Qt feature that was used to save the content of the preview window into a markdown
file. The exporter allows for both standard markdown and GitHub flavour markdown. The only
relevant difference being that the latter allows strikethrough text. Issue #617. PR #650.
relevant difference being that the latter allows strike through text. Issue #617. PR #650.
* The Build Novel Project tool now has a "Line height" property that is applied to the preview, and
to the HTML5 and Open Document export formats. Discussion #653. Issue #654. PR #660.
* The Build Novel Project tool now has an option to convert Unicode characters to HTML entities on
@@ -2531,7 +2699,7 @@ but is still lacking in functionality compared to Enchant.
exclude negative word counts is active. Previously, the entries with negative counts were
filtered out, but the change in count was still applied to the next line, altering the value.
Now, the GUI will instead just drop the lines that are negative and keep the other lines
unchanged. This is more intutitive, but it also means that the total count now longer matches the
unchanged. This is more intuitive, but it also means that the total count now longer matches the
sum of the lines. PR #659.
* The keyboard shortcut for deleting entries in the project tree has been changed from `Ctrl+Del`
to `Ctrl+Shift+Del`. The `Ctrl+Del` shortcut is thus free to be used exclusively by the editor to
@@ -2544,7 +2712,7 @@ but is still lacking in functionality compared to Enchant.
given a significant speed improvement by caching the imported dictionary as a Python `set`
instead of a `list`. The `set` has a hashed key lookup algorithm that is significantly faster.
PR #668.
* Sessions shortar than 5 minutes, and with no word count changes, are no longer recorded in the
* Sessions shorter than 5 minutes, and with no word count changes, are no longer recorded in the
session stats log file. PR #685.
**Installation**
@@ -3009,7 +3177,7 @@ issues are discovered, the next release will be the final version 1.0 release.
* The tests for the core classes of novelWriter have been completely rewritten. Every class or
source file of the core functionality (everything handling the actual project data and documents,
as well as the meta data) is now covered by its own testmodule with a 100% coverage for each
as well as the meta data) is now covered by its own test module with a 100% coverage for each
module. PR #512.
* Likewise, the base tests have been rewritten to cover the `Config` class, the `main` function
that launches the app, and the error handling class. The structure matches the core tests from
@@ -3041,7 +3209,7 @@ The "Typewriter Mode" of the editor has been improved. Essentially, this feature
scroll. It tries to keep the cursor stationary in the vertical direction, and will try to scroll
the document up when the cursor skips to a new line while typing (or down in case of backspaces).
This is similar to the way a typewriter scrolls the paper when hitting the return key. It improves
the writing experience as the current active line will stay at the same eye heightlevel on the
the writing experience as the current active line will stay at the same eye height level on the
screen.
Previously, the feature would lock the cursor to a given vertical position defined by the user.
@@ -3089,7 +3257,7 @@ Switching main GUI theme still requires a restart.
handled by the various tools, but they shouldn't even trigger when there is no project or
document to perform the action on. PR #492.
* Clarify the message of the Close Project and Exit novelWriter dialogs. Previously, it may have
seemed to some users that clicking "No" would allow the closing to procede without saving
seemed to some users that clicking "No" would allow the closing to proceed without saving
changes. This is not true as changes are saved automatically when editing a project. The dialog
text should now make this clearer. Issue #494, PR #495.
@@ -3134,7 +3302,7 @@ Switching main GUI theme still requires a restart.
**User Interface**
* An option has been added in Preferences to hide horizontal or vertical scroll bars on the main
GUI. These optons will hide scroll bars on the Project Tree, Document Editor, Document Viewer,
GUI. These options will hide scroll bars on the Project Tree, Document Editor, Document Viewer,
Outline Tab and on the controls of the Build Novel Project tool. Scroll bars take up space, and
as long as the project doesn't contain very long documents, scrolling with the mouse wheel is
enough. The feature is of course entirely optional. PRs #468 and #469.
@@ -3154,7 +3322,7 @@ Switching main GUI theme still requires a restart.
* When applying a format from the format menu to a selection of multiple paragraphs (or lines),
only the first paragraph (or line) receives the formatting. The editor doesn't allow markdown
formatting to span multiple lines. Issue #451, PR #475.
* The syntax highlighter no longer uses the same colour to highlight strikethrough text as for
* The syntax highlighter no longer uses the same colour to highlight strike through text as for
emphasised text. The colour is intended to stand out, which makes little sense for such text.
Instead, the highlighter uses the same colour as for comments. PR #476.
@@ -3305,7 +3473,7 @@ Switching main GUI theme still requires a restart.
**Code Improvements**
* Minor improvemenmts have been made to the core project classes to improve encapsulation and
* Minor improvements have been made to the core project classes to improve encapsulation and
better ensure consistency between the different data structures that store the novel project in
memory. PR #447.
* Some unused or redundant code has been removed, and in some places, functions have been merged to
@@ -3322,9 +3490,9 @@ Switching main GUI theme still requires a restart.
**Bugfixes**
* If the horizontal scroll bar appeared at the bottom of the document editor or viewer, for
instance if a long, un-wrapable line was entered, the scroll bar would sit on top of the document
footer. The footer bar now properly moves out of the way when the horizontal scroll bar appears.
Issue #433, PR #434.
instance if a long, un-wrappable line was entered, the scroll bar would sit on top of the
document footer. The footer bar now properly moves out of the way when the horizontal scroll bar
appears. Issue #433, PR #434.
**New Features**
@@ -3446,7 +3614,7 @@ Switching main GUI theme still requires a restart.
leading line break. This was previously handled entirely by the Qt library, which does this for
some reason. Issue #395, PR #405.
* A chapter heading in a file with a different layout than `Unnumbered` can now also be flagged as
an unnumbered chapter heading by adding an asterisk to the begfinning of the title text. This
an unnumbered chapter heading by adding an asterisk to the beginning of the title text. This
only affects the number assignment and counter when running the Build Novel Project tool. The
rest of the app ignores the asterisk. Issue #402, PR #406.
@@ -3461,7 +3629,7 @@ Switching main GUI theme still requires a restart.
create a copy of the example project from the source code. Either from the `sample` folder in the
source, or from a `sample.zip` file generated by the `setup.py` script and saved to the
`nw/assets` folder. PR #366.
* When the user clicked cancel on the colour dialog in Project Settins, the icon would be reset to
* When the user clicked cancel on the colour dialog in Project Settings, the icon would be reset to
black. Instead, the colour should remain unchanged. A check that the user actually selected a
colour has now been added. Issue #395, PR #403.
@@ -3537,7 +3705,7 @@ planned by GitHub. See their [notes](https://github.com/github/renaming) for mor
[novelwriter.readthedocs.io](https://novelwriter.readthedocs.io/) has been rewritten. It was
drifting out of sync with the development of the code. In addition, many improvements have been
made to the reStructuredText formatting of the documentation source by providing better
cross-reference linking and highlightings. The main repository README file has been updated to
cross-reference linking and highlighting. The main repository README file has been updated to
match. PRs #375, #382, and #384.
* The main `setup.py` script has been updated to also build documentation for the Qt Assistant when
given a `qthelp` flag. The compiled help files are copied into the `nw/assets/help` folder, and
@@ -3635,7 +3803,7 @@ longer be read by an earlier version due to the change of how autoReplace settin
has been removed from the main window status bar. PR #348.
* The document editor footer can optionally be hidden in Distraction Free mode. PR #351.
* The Italic and Bold menu entries have been renamed to Emphasis and Strong Emphasis, which is more
in line with what they represent in Markdown and HTML. They are still renderred as Italic and
in line with what they represent in Markdown and HTML. They are still rendered as Italic and
Bold in the document viewer, but the HTML export is using the `<em>` and `<strong>` tags.
PR #350.
* Due to several issues with the formatting of emphasised text using `*`, `**`, and `***` wrappers,
@@ -3648,9 +3816,9 @@ longer be read by an earlier version due to the change of how autoReplace settin
for emphasis and strong is commonly recommended when writing Markdown anyway, so it is a sensible
compromise between speed and flexibility. This PR partially reverses PR #310. Issue #353,
PR #355.
* The syntax highlighter now properly highlights overlapping formattings, including emphasised text
* The syntax highlighter now properly highlights overlapping formatting, including emphasised text
inside of highlighted quotes. PR #355.
* The colour highlighting of emphasis, strong and strikethrough, can now be switch off in
* The colour highlighting of emphasis, strong and strike through, can now be switch off in
Preferences. The syntax highlighter will still apply the italic, bold and strike effects.
PR #357.
* The project path in the Details tab of Project Settings can now be selected and copied to
@@ -3681,7 +3849,7 @@ longer be read by an earlier version due to the change of how autoReplace settin
visible in the tree. It is called when you for instance click the header of an open document. It
was also activated when opening a document from the tree view with either double-click by mouse,
or by using the Enter key. This meant that the tree view would often move, which made it hard to
mouse click on items after eachother since you ended up chasing a moving target. This feature is
mouse click on items after each other since you ended up chasing a moving target. This feature is
now disabled for document open. In addition, the scroll into view feature has been added to the
search/replace call to move into the next document when reaching the end of the current document.
This was requested in Issue #332. PR #334.
@@ -3692,7 +3860,7 @@ longer be read by an earlier version due to the change of how autoReplace settin
**Documentation**
* The documentation has been updated to clarify the correct formatting for italic, bold and
strikethrough formatting tags. Issue #220, PR #338.
strike through formatting tags. Issue #220, PR #338.
----
@@ -3711,11 +3879,11 @@ longer be read by an earlier version due to the change of how autoReplace settin
* Underline text formatting has been removed. It is not standard HTML5, nor Markdown, and was
previously implemented using the double underscore notation that in standard Markdown is
renderred as bold text. Instead, novelWriter now renders a single `*` or `_` wrapping a piece of
rendered as bold text. Instead, novelWriter now renders a single `*` or `_` wrapping a piece of
text _within_ a paragraphs as italicised text, and a double `**` or `__` as bold text. The
keyboard shortcuts and automatic features _only_ support the `*` notation. A triple set of `***`
are treated as both bold and italicised. PR #310.
* Strikethrough formatting has been added back into novelWriter using the standard Markdown `~~`
* Strike through formatting has been added back into novelWriter using the standard Markdown `~~`
wrapping. PR #310.
* Added support for thin spaces and non-breaking thin spaces. PR #319.
* The `Ctrl+Z` key sequence (undo) would not go through the wrapper function for document action
@@ -3732,7 +3900,7 @@ longer be read by an earlier version due to the change of how autoReplace settin
PR #309.
* The text emphasis functions, either selected from the menu or via keyboard shortcuts, will now
try to respond to the command in a more meaningful way. That is, the text editor will try to
toggle the bold or italics features independently of eachother on the selected text. A menu entry
toggle the bold or italics features independently of each other on the selected text. A menu entry
to apply both at the same time has also been added. PR #310.
* The document editor search tool has been completely rewritten. It now appears as a search box at
the top of the document, and has a number of toggle switches added to it. You can modify the
@@ -4102,7 +4270,7 @@ that I can spend more time using it than creating it.
**Additional thanks** to @countjocular for PRs #173 and #174, and to @johnblommers for all the
helpful feedback and issue reports for the new features added in this, and previous releases.
### Noteable Changes
### Notable Changes
* The Timeline View dialog is now gone. Instead, the main window area has been split into two tabs.
The first, the "Editor", contains the Document Editor and Viewer panels. The second, the
@@ -4253,7 +4421,7 @@ helpful feedback and issue reports for the new features added in this, and previ
**Bug Fixes**
* Fixed an issue when closing the import file dialog without selecting a file, the import would
procede, but fail on file not found. The import is now cancelled when there is no file selected.
proceed, but fail on file not found. The import is now cancelled when there is no file selected.
PR #149.
* Fixed an issue with markdown export where it did not take into account hard line breaks. Issue
#151, PR #152.
@@ -4663,7 +4831,7 @@ This is the initial release of a working version of novelWriter, but with very l
capabilities. So far, the following has been implemented:
* A document tree with a set of pre-defined root folders of a given set of classes for different
purposes for novel writing. That is, a root item for the novel itself, one for charcaters, plot
purposes for novel writing. That is, a root item for the novel itself, one for characters, plot
elements, timeline, locations, objects, and a custom one.
* A plain text editor with a simplified markdown format that allows for four levels of titles, and
bold, italics and underline text.
@@ -4671,7 +4839,7 @@ capabilities. So far, the following has been implemented:
* It also allows for keyword/value sets staring with the character `@`. These will later be used
to link documents together as tags point to other documents. For instance, a scene file can
point the keyword `@POV:name` to a character file with the keyword `@THIS:name`.
* The text editor has a set of autoreplace features:
* The text editor has a set of auto replace features:
* Dashes are made by combining two or three hyphens.
* Three dots are replaced with the ellipsis.
* Straight quotes with your quote format of choice.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 127 KiB

After

Width:  |  Height:  |  Size: 154 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 241 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 137 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 273 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 133 KiB

After

Width:  |  Height:  |  Size: 124 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 534 KiB

After

Width:  |  Height:  |  Size: 542 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 539 KiB

After

Width:  |  Height:  |  Size: 562 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 379 KiB

After

Width:  |  Height:  |  Size: 335 KiB

View File

@@ -7,7 +7,7 @@ Customisations
.. _Enchant: https://abiword.github.io/enchant
.. _Free Desktop: https://cgit.freedesktop.org/libreoffice/dictionaries/tree/
There are a few ways you can customise novelWriter youself. Currently, you can add new GUI themes,
There are a few ways you can customise novelWriter yourself. Currently, you can add new GUI themes,
your own syntax themes, and install additional dictionaries.
@@ -22,23 +22,35 @@ may not load all installed spell check dictionaries automatically.
Linux and MacOS
---------------
On Linux and MacOS, you generally only have to install hunspell or aspell dictionaries on your
system like you do for other applications. See your distro or OS documentation for how to do this.
These dictionaries should show up as available spell check languages in novelWriter.
On Linux and MacOS, you generally only have to install hunspell, aspell or myspell dictionaries on
your system like you do for other applications. See your distro or OS documentation for how to do
this. These dictionaries should show up as available spell check languages in novelWriter.
Windows
-------
For Windows, English is included with the installation. For other languages you have to download
and add dictionaries yourself. You can find the various dictionaries on the `Free Desktop`_
website. You should find a folder for your language, if it is available at all, and download the
files ending with ``.aff`` and ``.dic``. These files must then be copied to the following location:
and add dictionaries yourself.
**Install Tool**
A small tool to assist with this can be found under :guilabel:`Tools > Add Dictionaries`. It will
import spell checking dictionaries from Free Office or Libre Office extensions. The dictionaries
are then installed in the install location for the Enchant library.
**Manual Install**
If you prefer to do this manually or want to use a different source than the ones mentioned above,
You need to get compatible dictionary files for your language. You need two files files ending with
``.aff`` and ``.dic``. These files must then be copied to the following location:
``C:\Users\<USER>\AppData\Local\enchant\hunspell``
This assumes your user profile is stored at ``C:\Users\<USER>``. The last one or two folders may
not exist, so you may need to create them.
You can find the various dictionaries on the `Free Desktop`_ website.
.. note::
The Free Desktop link points to a repository, and what may look like file links inside the
dictionary folder are actually links to web pages. If you right-click and download those, you
@@ -53,7 +65,7 @@ not exist, so you may need to create them.
Syntax and GUI Themes
=====================
Adding your own GUI and syntax themes is relatively easy, altough it requires that you manually
Adding your own GUI and syntax themes is relatively easy, although it requires that you manually
edit config files with colour values. The themes are defined by simple plain text config files with
meta data and colour settings.
@@ -136,7 +148,7 @@ Omitted values are not loaded and will use default values.
Custom Syntax Theme
-------------------
A syntax theme ``.conf`` file consists of the follwing settings:
A syntax theme ``.conf`` file consists of the following settings:
.. code-block:: cfg

View File

@@ -9,8 +9,8 @@ Tips & Tricks
This is a list of hopefully helpful little tips on how to get the most out of novelWriter.
.. note::
This section will be expanded over time, and if you would like to have something added, feel
free to contribute, or start a discussion on the project's `Discussions Page`_.
This section will be expanded over time. If you would like to have something added, feel free to
contribute, or start a discussion on the project's `Discussions Page`_.
Managing the Project

View File

@@ -13,8 +13,8 @@ formatting features available are limited to those relevant for this purpose. It
for technical writing, and it is *not* a full-featured Markdown editor.
Your novel project is organised as a collection of separate plain text documents instead of a
single, large document. The idea here is to make it easier to reorganise your project structure
without having to cut and paste text between chapters.
single, large document. The idea is to make it easier to reorganise your project structure without
having to cut and paste text between chapters.
There are two kinds of documents in your project: :term:`Novel Documents` are documents that are
part of your story. The other kind of documents are :term:`Project Notes`. These are intended for
@@ -22,17 +22,17 @@ your notes about your characters, your world building, and so on.
You can at any point split the individual documents by their headers up into multiple documents, or
merge multiple documents into single documents. This makes it easier to use variations of the
Snowflake_ method for writing. You can focus on writing larger structure-focused documents, like
Snowflake_ method for writing. You can start by writing larger structure-focused documents, like
one per act for instance, and later effortlessly split these up into scenes by their headers.
Below are some key features of novelWriter.
**Focus on writing**
The aim of the user interface is to let the user focus on writing instead of spending time
formatting text. Formatting is therefore limited to a small set of formatting tags for simple
things like text emphasis and paragraph alignment. When you really want to focus on just
writing, you can switch the editor into :guilabel:`Focus Mode` where only the text editor panel
itself is visible, and the project structure view is hidden away.
The aim of the user interface is to let you focus on writing instead of spending time formatting
text. Formatting is therefore limited to a small set of formatting tags for simple things like
text emphasis and paragraph alignment. When you really want to focus on just writing, you can
switch the editor into :guilabel:`Focus Mode` where only the text editor panel itself is
visible, and the project structure view is hidden away.
**Keep an eye on your notes**
The main window can optionally show a document viewer to the right of the editor. This view
@@ -45,8 +45,8 @@ Below are some key features of novelWriter.
build the project into a manuscript, they are all glued together in the top-to-bottom order in
which they appear in the project tree. You can use as few text documents as you like, but
splitting the project up into chapters and scenes means you can easily reorder them using the
drag-and-drop feature. You can also start out with a few documents and then later split them
into multiple documents based on their headers.
drag-and-drop feature of the project tree. You can also start out with a few documents and then
later split them into multiple documents based on their headers.
**Multi-novel project support**
As of novelWriter 2.0, you can have multiple Novel type root folders in a project. This allows
@@ -56,9 +56,9 @@ Below are some key features of novelWriter.
**Keep track of your plot elements**
All notes in your project can be assigned a :term:`tag` that you can :term:`reference` from any
other document or note. In fact, you can add a new tag under each heading of a note if you need
to be able to reference specific sections of ot.
to be able to reference specific sections of it.
**Get an overview of your plot elements**
**Get an overview of your story**
In the :guilabel:`Outline View` on the main window you can see an outline of all the chapters,
scenes, and sections of your project. If they have any references in them, these are listed in
additional columns. You can also add a synopsis to each chapter or scene, which can be listed
@@ -66,6 +66,12 @@ Below are some key features of novelWriter.
subset of the outline information is also available in the :guilabel:`Novel View` as an
alternative view to the project tree.
**Get an overview of your story elements**
Under the document viewer panel you will find a series of tabs that shows the different story
elements you have created tags for. The tabs are sorted into Characters, Plots, etc, depending
on which categories you are using in your story. This panel can be hidden when you don't need it
to free up space.
**Building your manuscript**
Whether you want to assemble a manuscript, or export all your notes, or generate an outline of
your chapters and scenes with a synopsis, you can use the :guilabel:`Build Manuscript` tool to
@@ -83,9 +89,9 @@ Screenshots
.. figure:: images/screenshot_default.png
:class: dark-light
novelWriter with default theme
novelWriter with light colour theme
.. figure:: images/screenshot_dark.png
:class: dark-light
novelWriter with dark theme
novelWriter with dark colour theme

View File

@@ -36,15 +36,15 @@ read on.
This chapter explains the basics of how the application works and what it can and cannot do.
:ref:`a_ui_project` – Recommended Reading
This chapter will give you a more detailed explanation of how you can use the user interface components
to organise and view your project work.
This chapter will give you a more detailed explanation of how you can use the user interface
components to organise and view your project work.
:ref:`a_ui_writing` – Recommended Reading
This chapter will give you a more detailed explanation of how the text editor and viewer work.
:ref:`a_fmt` – Essential Information
This chapter covers how you should format your text. The editor is plain text, so text
formatting requires some basic markup. The structure of your novel is also inferred by how you
formatting requires some basic markup. The structure of your novel is also inferred from how you
use headings. Tags and references are implemented by special keywords.
:ref:`a_kb` – Optional / Lookup
@@ -55,7 +55,7 @@ read on.
:ref:`a_typ` – Optional
This chapter gives you an overview of the special typographical symbols available in
novelWriter. The auto-replace feature can handle the insertion of standard quote symbols for
your language, and other special characters. If you use any symbols aside from these. their
your language, and other special characters. If you use any symbols aside from these, their
intended use is explained here.
:ref:`a_prjfmt` – Optional

View File

@@ -14,8 +14,8 @@ Getting Started
.. _Releases: https://github.com/vkbo/novelWriter/releases
.. _AppImage: https://appimage.org/
Package installers for novelWriter are available for all major platforms, including Linux, Windows
and MacOS. See below for install instructions for each platform.
Ready-made packages and installers for novelWriter are available for all major platforms, including
Linux, Windows and MacOS. See below for install instructions for each platform.
You can also install novelWriter from the Python Package Index (PyPi). See :ref:`a_started_pip`.
Installing from PyPi does not set up icon launchers, so you will either have to do this yourself,

View File

@@ -5,7 +5,7 @@ Novel Projects
**************
New projects can be created from the :guilabel:`Project` menu by selecting :guilabel:`New Project`.
This will open the :guilabel:`New Project Wizard` that will assist you in creating a barebone
This will open the :guilabel:`New Project Wizard` that will assist you in creating a bare bone
project suited to your needs.
A novelWriter project requires a dedicated folder for storing its files on the local file system.
@@ -41,7 +41,7 @@ to reference them from other documents and notes. The intended usage of each typ
listed below. However, aside from the :guilabel:`Novel` folder, no restrictions are applied by the
application on what you put in them. You can use them however you want.
The root folder system is closesly connected to how the Tags and References system works. For more
The root folder system is closely connected to how the Tags and References system works. For more
details, see the :ref:`a_references` chapter.
:guilabel:`Novel`

View File

@@ -28,7 +28,7 @@ Metadata in novelWriter
The structure of your novelWriter project is inferred from the :term:`headings` within the
documents, not the documents themselves. See :ref:`a_struct_heads` for more details. Therefore,
metadata is also associated with headings, and not documents.
metadata is also associated with headings, and not the documents directly.
If you split your project into separate documents for each scene, this distinction may not matter.
However, there are several benefits to using documents at a larger structural scale when starting
@@ -51,9 +51,8 @@ by using the ``@tags`` :term:`keyword`. The full format of a tag is ``@tag: tagn
``tagname`` is an identifier of your choosing. You can only set *one* tag per heading, and the tag
has to be unique across all documents in the project.
.. note::
In version 2.2, tags will be made case insensitive, but as of novelWriter 2.1 they are not. You
should however avoid using tags that are only distinguished by case.
.. versionadded:: 2.2
Tags are now case insensitive.
After the tags have been defined, they can then be referenced in the novel documents, or
cross-referenced in other notes. they will also show up in the :guilabel:`Outline View` and in the
@@ -64,10 +63,10 @@ allowed, that is, the tag is unique. Duplicate tags should be detected as long a
to date. An invalid tag should have a green wiggly line under it, and will not receive the syntax
colour that valid tags do.
The tag is the only part of these notes that the novelWriter uses. The rest of the document content
is there for the writer to use in whatever way they wish. Of course, the content of the documents
can be added to the manuscript, or an outline document. If you want to compile a single document of
all your notes, you can do this from the :guilabel:`Manuscript Build` tool.
The tag is the only part of these notes that novelWriter uses. The rest of the document content is
there for you to use in whatever way you wish. Of course, the content of the documents can be added
to the manuscript, or an outline document. If you want to compile a single document of all your
notes, you can do this from the :guilabel:`Manuscript Build` tool.
Example of a heading with a tag for a character of the story:
@@ -81,10 +80,13 @@ Example of a heading with a tag for a character of the story:
When this is done in a document in a :term:`Root Folder` of type "Characters", the tag is
automatically treated as an available character in your project, and you will be able to reference
it in any of your other documents using the reference keywords for characters.
it in any of your other documents using the reference keywords for characters. It will also show up
in the Character tab in the Reference panel below the document viewer, and in the reference
auto-completer menu in the editor when you fill in references. See :ref:`a_ui_view` and
:ref:`a_references_completer`.
It is the root folder type that defines what category of story elements the tag is indexed under.
See the :ref:`a_proj_roots` section for an overview of availabe root folder types. They are also
See the :ref:`a_proj_roots` section for an overview of available root folder types. They are also
covered in the next section.
@@ -148,6 +150,12 @@ that the tags referenced exist.
In general, the index for a document is regenerated when it is saved, so this shouldn't normally
be necessary.
.. tip::
If you add a reference in the editor to a tag that doesn't yet exist, you can right-click it and
select :guilabel:`Create Note for Tag`. This will generate a new project note automatically with
the new tag defined. In order for this to be possible, a root folder for that category of
references must already exist.
One note can also reference another note in the same way novel documents do. When the note is
opened in the document viewer, the references become clickable links, making it easier to follow
connections in the plot. You can follow links in the document editor by clicking them with the
@@ -176,3 +184,19 @@ Example of a novel document with references to characters and plots:
@plot: Main
Once upon a time ...
.. _a_references_completer:
The References Auto-Completer
-----------------------------
An auto-completer context menu will show up automatically in the document editor when you type the
character ``@`` on a new line. It will first suggest tag or reference keywords for you to add, and
after the ``:`` has been added, suggest references from the list of tags you have already defined.
You can use the auto-completer to add multiple references with a ``,`` between them, and even type
new ones. New references can be created by right-clicking on them and selecting
:guilabel:`Create Note for Tag` from the menu.
.. versionadded:: 2.2

View File

@@ -23,6 +23,7 @@ at the same time provide useful features needed for writing a novel.
The main window does not have an editor toolbar like many other applications do. This reduces
clutter, and since the documents are formatted with style tags, it is more or less redundant.
Most formatting features supported are available through convenient keyboard shortcuts. They are
also available in the main menu, so you don't have to look up formatting codes every time you need
them. For reference, a list of all shortcuts can be found in the :ref:`a_kb` chapter.
@@ -36,13 +37,18 @@ On the left side of the main window, you will find a sidebar. This bar has butto
views you can switch between, a quick link to the :guilabel:`Build Manuscript` tool, and a set of
project-related tools and quick access to settings at the bottom.
.. versionadded:: 2.2
A number of new formatting options were added in 2.2 to allow for some special formatting cases.
At the same time, a small formatting toolbar was added in the editor. It is hidden by default,
but can be opened by pressing the three dots icon in the top right corner.
Project Tree View
-----------------
Project Tree and Editor View
----------------------------
.. figure:: images/fig_project_tree_view.png
A screenshot of the Project Tree View.
A screenshot of the Project Tree and Editor View.
When in :guilabel:`Project Tree View` mode, the main work area of the main window is split in two,
or optionally three, panels. The left-most panel contains the project tree and all the documents in
@@ -59,8 +65,8 @@ the editor's header, or by pressing :kbd:`F8`. When :guilabel:`Focus Mode` is en
interface elements other than the document editor itself are hidden away.
Novel Tree View
---------------
Novel Tree and Editor View
--------------------------
.. figure:: images/fig_novel_tree_view.png
@@ -134,7 +140,7 @@ This is a brief introduction to how you structure your writing projects. All of
covered in more detail later.
The main point of novelWriter is that you are free to organise your project documents as you wish
into subfolders or subdocuments, and split the text between these documents in whatever way suits
into sub-folders or sub-documents, and split the text between these documents in whatever way suits
you. All that matters to novelWriter is the linear order the documents appear at in the project
tree (top to bottom). The chapters, scenes and sections of the novel are determined by the headings
within those documents.
@@ -153,8 +159,8 @@ The four heading levels (**H1** to **H4**) are treated as follows:
The project tree will select an icon for the document based on the first heading in it.
This header level structure is only taken into account for :term:`novel documents`. For
:term:`project notes`, the header levels have no structural meaning, and the user is free to do
whatever they want. See :ref:`a_struct` and :ref:`a_references` for more details.
:term:`project notes`, the header levels have no structural meaning, and you are free to use them
however you want. See :ref:`a_struct` and :ref:`a_references` for more details.
.. versionadded:: 2.0
You can add documents as child items of other documents. This is often more useful than adding
@@ -173,8 +179,9 @@ The project can at any time be assembled into a range of different formats throu
various flavours of Markdown.
The HTML5 format is suitable for conversion by a number of other tools like Pandoc_, or for
importing into word processors if the Open Document format isn't suitable. In addition, printing
is also possible. Print to PDF is available from the print dialog.
importing into word processors if the Open Document format isn't suitable. The Open Document format
is supported by most Office type applications. In addition, printing is also possible. Print to PDF
is available from the print dialog.
In addition, you can export the content of the project to a JSON file. This is useful if you want
to write your own custom processing script in for instance Python, as the entire novel can be read

View File

@@ -7,7 +7,8 @@ Formatting Your Text
The novelWriter text editor is a plain text editor that uses formatting codes for setting meta data
values and allowing for some text formatting. The syntax is based on Markdown, but novelWriter is
*not* a Markdown editor. It supports basic formatting like emphasis (italic), strong importance
(bold) and strikethrough text, as well as four levels of headings.
(bold) and strike through text, as well as four levels of headings. Form some further complex
formatting needs, a set of shortcodes can be used.
In addition to formatting codes, novelWriter allows for comments, a synopsis tag, and a set of
keyword and value sets used for :term:`tags<tag>` and :term:`references<reference>`. There are also
@@ -20,7 +21,7 @@ Syntax Highlighting
===================
The editor has a syntax highlighter feature that is meant to help you know when you've used the
formtatting tags or other features correctly. It will change the colour and font size of your
formatting tags or other features correctly. It will change the colour and font size of your
headings, change the text colour of emphasised text, and it can also show you where you have
dialogue in your text.
@@ -94,7 +95,7 @@ A text paragraph is indicated by a blank line. That is, you need two line breaks
fragments of text into two paragraphs. Single line breaks are treated as line breaks within a
paragraph.
In addition, the editor supports a few additional types of whitespaces:
In addition, the editor supports a few additional types of white spaces:
* A non-breaking space can be inserted with :kbd:`Ctrl+K`, :kbd:`Space`.
* Thin spaces are also supported, and can be inserted with :kbd:`Ctrl+K`, :kbd:`Shift+Space`.
@@ -126,7 +127,7 @@ A minimal set of text emphasis styles are supported for text paragraphs.
The text is rendered as strongly important text (bold).
``~~text~~``
Strikethrough text.
Strike through text.
In Markdown guides it is often recommended to differentiate between strong importance and emphasis
by using ``**`` for strong and ``_`` for emphasis, although Markdown generally also supports ``__``
@@ -136,8 +137,8 @@ recommendation.
In addition, the following rules apply:
1. The emphasis and strikethrough formatting tags do not allow spaces between the words and the tag
itself. That is, ``**text**`` is valid, ``**text **`` is not.
1. The emphasis and strike through formatting tags do not allow spaces between the words and the
tag itself. That is, ``**text**`` is valid, ``**text **`` is not.
2. More generally, the delimiters must be on the outer edge of words. That is, ``some **text in
bold** here`` is valid, ``some** text in bold** here`` is not.
3. If using both ``**`` and ``_`` to wrap the same text, the underscore must be the *inner*
@@ -146,7 +147,7 @@ In addition, the following rules apply:
4. Text emphasis does not span past line breaks. If you need to add emphasis to multiple lines or
paragraphs, you must apply it to each of them in turn.
5. Text emphasis can only be used in plain paragraphs. Comments, titles, and meta data tags don't
allow for formatting, and any formatting markup will be renderred as-is.
allow for formatting, and any formatting markup will be rendered as-is.
.. tip::
novelWriter supports standard escape syntax for the emphasis markup characters in case the
@@ -155,6 +156,39 @@ In addition, the following rules apply:
markup.
.. _a_fmt_shortcodes:
Extended Formatting with Shortcodes
===================================
For additional formatting options, you can use shortcodes. Shortcodes is a form of in-line codes
that can be used to change the format of the text that follows and opening code, and last until
that formatting region is ended with a closing code.
These shortcodes are intended for special formatting cases, or more complex cases that cannot be
solved with simple Markdown-like formatting codes. Available shortcodes are listed below.
.. csv-table:: Shortcodes Formats
:header: "Syntax", "Description"
:widths: 40, 60
:class: "tight-table"
"``[b]text[/b]``", "Text is rendered as bold text."
"``[i]text[/i]``", "Text is rendered as italicised text."
"``[s]text[/s]``", "Text is rendered as strike through text."
"``[u]text[/u]``", "Text is rendered as underlined text."
"``[sup]text[/sup]``", "Text is rendered as superscript text."
"``[sub]text[/sub]``", "Text is rendered as subscript text."
Unlike Markdown style codes, these can be used anywhere within a paragraph. Even in the middle of a
word if you need to. You can also freely combine them to form more complex formatting.
The shortcodes are available from the :guilabel:`Format` menu and in the editor toolbar, which can
be activated by clicking the three dots in the editor header.
.. versionadded:: 2.2
.. _a_fmt_comm:
Comments and Synopsis
@@ -169,19 +203,25 @@ in a special manner and will show up in the :ref:`a_ui_outline` in a dedicated c
``synopsis`` is not case sensitive. If it is correctly formatted, the syntax highlighter will
indicate this by altering the colour of the word.
``% text...``
``% text ...``
This is a comment. The text is not rendered by default (this can be overridden), seen in the
document viewer, or counted towards word counts.
``% Synopsis: text...``
``%Synopsis: text ...``
This is a synopsis comment. It is generally treated in the same way as a regular comment, except
that it is also captured by the indexing algorithm and displayed in the :ref:`a_ui_outline`. It
can also be filtered separately when building the project to for instance generate an outline
document of the whole project.
``%Short: text ...``
This is a short description comment. It is identical to the synopsis comment, but is intended to
be used for project notes. The text shows up in the Reference panel below the document viewer in
the last column labelled :guilabel:`Short Description`.
.. note::
Only one comment can be flagged as a synopsis comment for each heading. If multiple comments are
flagged as synopsis comments, the last one will be used and the rest ignored.
Only one comment can be flagged as a synopsis or short comment for each heading. If multiple
comments are flagged as synopsis or short comments, the last one will be used and the rest
ignored.
.. _a_fmt_tags:
@@ -204,8 +244,9 @@ References are in the form:
``@keyword: value``
A reference keyword followed by a value, or a comma separated list of values.
Tags andreferences are covered in detail in the :ref:`a_references` chapter. The keywords can be
inserted at the cursor position in the editor via the :guilabel:`Insert` menu.
Tags and references are covered in detail in the :ref:`a_references` chapter. The keywords can be
inserted at the cursor position in the editor via the :guilabel:`Insert` menu. If you start typing
an ``@`` on a new line, and auto-complete menu will also pop up suggesting keywords.
.. _a_fmt_align:

View File

@@ -28,7 +28,7 @@ the project, and has four columns.
**Column 2**
The second column shows the word count of the document, or the sum of words of the child items
for folders and documents with subdocuments. If the counts seem incorrect, they can be updated
for folders and documents with sub-documents. If the counts seem incorrect, they can be updated
by rebuilding the :term:`project index` from the :guilabel:`Tools` menu, or by pressing
:kbd:`F9`.
@@ -62,6 +62,11 @@ Below the project tree you will find a small details panel showing the full info
currently selected item. This panel also includes the latest paragraph and character counts in
addition to the word count.
.. tip::
If you want to set the label of a document to be the same as a header within it, you can
right-click a header in the document when it is open in the editor and select
:guilabel:`Set as Document Name` from the context menu.
.. _a_ui_tree_split_merge:
@@ -73,6 +78,7 @@ will find several options on how to change a document or folder. This includes c
document and note, but also splitting them into multiple documents, or merging child items into a
single document.
Splitting Documents
^^^^^^^^^^^^^^^^^^^
@@ -91,6 +97,7 @@ hierarchy of documents. That is, put sections under scenes, and scenes under cha
The source document *is not* deleted in the process, but you have the option to let the tool move
the source document to the :guilabel:`Trash` folder.
Merging Documents
^^^^^^^^^^^^^^^^^
@@ -137,10 +144,14 @@ The project tree allows drag & drop to a certain extent to allow you to reorder
folders. Moving a document in the project tree will affect the text's position when you assemble
your manuscript in the :guilabel:`Manuscript Build` tool.
Drag & drop has only limited support for moving documents. In general, bulk actions are not
allowed. This is deliberate to avoid accidentally messing up your project. If you make a mistake,
the last move action can be undone by pressing :kbd:`Ctrl+Shift+Z` or from the menu icon in the
project tree's toolbar.
.. versionadded:: 2.2
You can now select multiple items in the project tree by holding down the :kbd:`Ctrl` or
:kbd:`Shift` key while selecting items.
You can drag and drop documents and regular folders, but not root folders. If you select multiple
items, they can only be dragged and dropped if they are siblings. That is, they have the same
parent item in the project. This is due to the way drag and drop is implemented in the user
interface framework novelWriter is built upon.
Documents and their folders can be rearranged freely within their root folders. If you move a Novel
document out of a Novel folder, it will be converted to a project note. Notes can be moved freely
@@ -149,8 +160,8 @@ folder, its "Importance" setting will be switched with a "Status" setting. See
:ref:`a_ui_tree_status`. The old value will not be overwritten though, and should be restored if
you move it back at some point.
Root folders in the project tree cannot be dragged & dropped at all. If you want to reorder them,
you can move them up or down with respect to eachother from the arrow buttons at the top of the
Root folders in the project tree cannot be dragged and dropped at all. If you want to reorder them,
you can move them up or down with respect to each other from the arrow buttons at the top of the
project tree, or by pressing :kbd:`Ctrl+Shift+Up` or :kbd:`Ctrl+Shift+Down` when they are selected.

View File

@@ -46,21 +46,21 @@ Project Tree Shortcuts
.. csv-table::
:header: "Shortcut", "Description"
":kbd:`F2`", "Edit the label of the selected item"
":kbd:`Return`", "Open the selected document in the editor"
":kbd:`Alt+Up`", "Jump or go to the previous item at same level in the tree"
":kbd:`Alt+Down`", "Jump or go to the next item at same level in the tree"
":kbd:`Alt+Left`", "Jump to the parent item in the tree"
":kbd:`Alt+Right`", "Jump to the first child item in the project tree"
":kbd:`Ctrl+.`", "Open the context menu on the selected item"
":kbd:`Ctrl+L`", "Open the :guilabel:`Quick Links` menu"
":kbd:`Ctrl+N`", "Open the :guilabel:`Create New Item` menu"
":kbd:`Ctrl+O`", "Open selected document"
":kbd:`Ctrl+R`", "Open the selected document in the viewer"
":kbd:`Ctrl+Up`", "Move selected item one step up in the tree"
":kbd:`Ctrl+Down`", "Move selected item one step down in the tree"
":kbd:`Ctrl+Del`", "Move the selected item to Trash"
":kbd:`Ctrl+Shift+Z`", "Undo the last move of a project item, if possible"
":kbd:`F2`", "Edit the label of the selected item"
":kbd:`Return`", "Open the selected document in the editor"
":kbd:`Alt+Up`", "Jump or go to the previous item at same level in the tree"
":kbd:`Alt+Down`", "Jump or go to the next item at same level in the tree"
":kbd:`Alt+Left`", "Jump to the parent item in the tree"
":kbd:`Alt+Right`", "Jump to the first child item in the project tree"
":kbd:`Ctrl+.`", "Open the context menu on the selected item"
":kbd:`Ctrl+L`", "Open the :guilabel:`Quick Links` menu"
":kbd:`Ctrl+N`", "Open the :guilabel:`Create New Item` menu"
":kbd:`Ctrl+O`", "Open selected document"
":kbd:`Ctrl+R`", "Open the selected document in the viewer"
":kbd:`Ctrl+Up`", "Move selected item one step up in the tree"
":kbd:`Ctrl+Down`", "Move selected item one step down in the tree"
":kbd:`Ctrl+Shift+Del`", "Move the selected item to Trash"
":kbd:`Ctrl+Shift+Z`", "Undo the last move of a project item, if possible"
.. _a_kb_editor:
@@ -90,6 +90,8 @@ Text Formatting Shortcuts
.. csv-table::
:header: "Shortcut", "Description"
":kbd:`Ctrl+'`", "Wrap selected text, or word under cursor, in single quotes"
":kbd:`Ctrl+""`", "Wrap selected text, or word under cursor, in double quotes"
":kbd:`Ctrl+/`", "Toggle block format as comment"
":kbd:`Ctrl+0`", "Remove block formatting for block under cursor"
":kbd:`Ctrl+1`", "Change block format to header level 1"
@@ -102,10 +104,8 @@ Text Formatting Shortcuts
":kbd:`Ctrl+8`", "Add a left margin to the block"
":kbd:`Ctrl+9`", "Add a right margin to the block"
":kbd:`Ctrl+B`", "Format selected text, or word under cursor, with strong emphasis (bold)"
":kbd:`Ctrl+D`", "Strikethrough selected text, or word under cursor"
":kbd:`Ctrl+D`", "Strike through selected text, or word under cursor"
":kbd:`Ctrl+I`", "Format selected text, or word under cursor, with emphasis (italic)"
":kbd:`Ctrl+'`", "Wrap selected text, or word under cursor, in single quotes"
":kbd:`Ctrl+""`", "Wrap selected text, or word under cursor, in double quotes"
":kbd:`Ctrl+Shift+/`", "Remove block formatting for block under cursor"
@@ -127,10 +127,10 @@ Other Editor Shortcuts
":kbd:`Ctrl+X`", "Cut selected text to clipboard"
":kbd:`Ctrl+Y`", "Redo latest undo"
":kbd:`Ctrl+Z`", "Undo latest changes"
":kbd:`Ctrl+Del`", "Delete the word after the cursor"
":kbd:`Ctrl+Backspace`", "Delete the word before the cursor"
":kbd:`Ctrl+Return`", "Open the tag or reference under the cursor in the viewer"
":kbd:`Ctrl+Del`", "Delete the word after the cursor"
":kbd:`Ctrl+F7`", "Toggle spell checking"
":kbd:`Ctrl+Return`", "Open the tag or reference under the cursor in the viewer"
":kbd:`Ctrl+Shift+A`", "Select all text in the current paragraph"
":kbd:`Ctrl+Shift+I`", "Import text to the current document from a text file"
@@ -147,39 +147,40 @@ a key or key combination for the inserted content.
.. csv-table::
:header: "Shortcut", "Description"
":kbd:`Ctrl+K`, :kbd:`−`", "Insert a short dash (en dash)"
":kbd:`Ctrl+K`, :kbd:`Space`", "Insert a non-breaking space"
":kbd:`Ctrl+K`, :kbd:`_`", "Insert a long dash (em dash)"
":kbd:`Ctrl+K`, :kbd:`Ctrl+_`", "Insert a horizontal bar (quotation dash)"
":kbd:`Ctrl+K`, :kbd:`.`", "Insert an ellipsis"
":kbd:`Ctrl+K`, :kbd:`'`", "Insert a modifier apostrophe"
":kbd:`Ctrl+K`, :kbd:`*`", "Insert a list bullet"
":kbd:`Ctrl+K`, :kbd:`%`", "Insert a per mille symbol"
":kbd:`Ctrl+K`, :kbd:`~`", "Insert a figure dash (same width as a number)"
":kbd:`Ctrl+K`, :kbd:`−`", "Insert a short dash (en dash)"
":kbd:`Ctrl+K`, :kbd:`1`", "Insert a left single quote"
":kbd:`Ctrl+K`, :kbd:`2`", "Insert a right single quote"
":kbd:`Ctrl+K`, :kbd:`3`", "Insert a left double quote"
":kbd:`Ctrl+K`, :kbd:`4`", "Insert a right double quote"
":kbd:`Ctrl+K`, :kbd:`'`", "Insert a modifier apostrophe"
":kbd:`Ctrl+K`, :kbd:`.`", "Insert an ellipsis"
":kbd:`Ctrl+K`, :kbd:`Ctrl+'`", "Insert a prime"
":kbd:`Ctrl+K`, :kbd:`Ctrl+""`", "Insert a double prime"
":kbd:`Ctrl+K`, :kbd:`Space`", "Insert a non-breaking space"
":kbd:`Ctrl+K`, :kbd:`Shift+Space`", "Insert a thin space"
":kbd:`Ctrl+K`, :kbd:`Ctrl+Space`", "Insert a thin non-breaking space"
":kbd:`Ctrl+K`, :kbd:`*`", "Insert a list bullet"
":kbd:`Ctrl+K`, :kbd:`Ctrl+−`", "Insert a hyphen bullet (alternative bullet)"
":kbd:`Ctrl+K`, :kbd:`Ctrl+*`", "Insert a flower mark (alternative bullet)"
":kbd:`Ctrl+K`, :kbd:`%`", "Insert a per mille symbol"
":kbd:`Ctrl+K`, :kbd:`Ctrl+O`", "Insert a degree symbol"
":kbd:`Ctrl+K`, :kbd:`Ctrl+X`", "Insert a times sign"
":kbd:`Ctrl+K`, :kbd:`Ctrl+D`", "Insert a division sign"
":kbd:`Ctrl+K`, :kbd:`G`", "Insert a ``@tag`` keyword"
":kbd:`Ctrl+K`, :kbd:`V`", "Insert a ``@pov`` keyword"
":kbd:`Ctrl+K`, :kbd:`F`", "Insert a ``@focus`` keyword"
":kbd:`Ctrl+K`, :kbd:`C`", "Insert a ``@char`` keyword"
":kbd:`Ctrl+K`, :kbd:`E`", "Insert an ``@entity`` keyword"
":kbd:`Ctrl+K`, :kbd:`F`", "Insert a ``@focus`` keyword"
":kbd:`Ctrl+K`, :kbd:`G`", "Insert a ``@tag`` keyword"
":kbd:`Ctrl+K`, :kbd:`H`", "Insert a short description comment"
":kbd:`Ctrl+K`, :kbd:`L`", "Insert a ``@location`` keyword"
":kbd:`Ctrl+K`, :kbd:`O`", "Insert an ``@object`` keyword"
":kbd:`Ctrl+K`, :kbd:`P`", "Insert a ``@plot`` keyword"
":kbd:`Ctrl+K`, :kbd:`S`", "Insert a synopsis comment"
":kbd:`Ctrl+K`, :kbd:`T`", "Insert a ``@time`` keyword"
":kbd:`Ctrl+K`, :kbd:`L`", "Insert a ``@location`` keyword"
":kbd:`Ctrl+K`, :kbd:`O`", "Insert an ``@object`` keyword"
":kbd:`Ctrl+K`, :kbd:`E`", "Insert an ``@entity`` keyword"
":kbd:`Ctrl+K`, :kbd:`V`", "Insert a ``@pov`` keyword"
":kbd:`Ctrl+K`, :kbd:`X`", "Insert a ``@custom`` keyword"
":kbd:`Ctrl+K`, :kbd:`Ctrl+Space`", "Insert a thin non-breaking space"
":kbd:`Ctrl+K`, :kbd:`Ctrl+_`", "Insert a horizontal bar (quotation dash)"
":kbd:`Ctrl+K`, :kbd:`Ctrl+'`", "Insert a prime"
":kbd:`Ctrl+K`, :kbd:`Ctrl+""`", "Insert a double prime"
":kbd:`Ctrl+K`, :kbd:`Ctrl+*`", "Insert a flower mark (alternative bullet)"
":kbd:`Ctrl+K`, :kbd:`Ctrl+−`", "Insert a hyphen bullet (alternative bullet)"
":kbd:`Ctrl+K`, :kbd:`Ctrl+D`", "Insert a division sign"
":kbd:`Ctrl+K`, :kbd:`Ctrl+O`", "Insert a degree symbol"
":kbd:`Ctrl+K`, :kbd:`Ctrl+X`", "Insert a times sign"
":kbd:`Ctrl+K`, :kbd:`Shift+Space`", "Insert a thin space"
.. _a_kb_viewer:

View File

@@ -61,7 +61,7 @@ Single and Double Prime
Both single and double prime symbols are available in the :guilabel:`Insert` menu. These symbols
are the correct symbols to use for unit symbols for feet, inches, minutes, and seconds. The usage
of these is described in more detail on the Wikipedia Prime_ page. They look very similar to single
and double straight quotes, and may be renderred similarly by the font, but they have different
and double straight quotes, and may be rendered similarly by the font, but they have different
codes. Using these correctly will also prevent the auto-replace and dialogue highlighting features
misunderstanding their meaning in the text.
@@ -74,7 +74,7 @@ even if it is intended as an apostrophe. This also includes the syntax highlight
assume the first following apostrophe is the closing symbol of a single quoted region of text.
To get around this, an alternative apostrophe is available. It is a special Unicode character that
is not categorised as punctuation, but as a modifier. It is usually renderred the same way as the
is not categorised as punctuation, but as a modifier. It is usually rendered the same way as the
right single quotation marks, depending on the font. There is a Wikipedia article for the
`Modifier letter apostrophe`_ with more details.

View File

@@ -24,9 +24,8 @@ Markdown-like syntax for some features, and a novelWriter-specific syntax for ot
format is described in the :ref:`a_fmt` chapter.
The editor has a maximise button (toggles the :guilabel:`Focus Mode`) and a close button in the
top--right corner. On the top--left side you will find an edit button that opens the
:guilabel:`Item Label` dialog for the currently open document, and a search button to open the
search dialog.
top--right corner. On the top--left side you will find a tools button that opens a toolbar with a
few buttons for applying text formatting, and a search button to open the search dialog.
Both the document editor and viewer will show the label of the currently open document in the
header at the top of the edit or view panel. Optionally, the full project path to the document can
@@ -40,6 +39,18 @@ Any :term:`references<reference>` in the editor can be opened in the viewer by m
the label and pressing :kbd:`Ctrl+Return`. You can also control-click them with your mouse.
Editor Auto-Completer
---------------------
If you type the character ``@`` on a new line, a context menu will appear showing the different
available keywords. The list will shorten as you type. Once a keyword command has been selected or
typed, the editor may suggest further content based on your project content. See
:ref:`a_references_completer` for more details.
.. versionadded:: 2.2
The auto-completer feature was added.
.. _a_ui_view:
Viewing a Document
@@ -68,11 +79,10 @@ buttons, these can be used as well. They work just like the backward and forward
browser.
At the bottom of the view panel there is a :guilabel:`References` panel. (If it is hidden, click
the icon next to it to reveal it.) This panel will show links to all documents referring back to
the one you're currently viewing, if any has been defined. The :guilabel:`Sticky` button will
freeze the content of the panel to the current document, even if you navigate to another document.
This is convenient if you want to quickly look through all documents in the list in the
:guilabel:`References` panel without losing the list in the process.
the button on the left side of the footer area to reveal it.) This panel contains a References tab
with links to all documents referring back to the one you're currently viewing, if any has been
defined. If you have created root folders and tags for various story elements like characters and
plot points, these will appear as additional tabs in this panel.
.. note::
The :guilabel:`References` panel relies on an up-to-date :term:`index<project index>` of the
@@ -80,6 +90,9 @@ This is convenient if you want to quickly look through all documents in the list
the index can always be rebuilt by selecting :guilabel:`Rebuild Index` from the
:guilabel:`Tools` menu, or by pressing :kbd:`F9`.
.. versionadded:: 2.2
The reference panel was redesigned and the additional tabs added.
.. _a_ui_edit_search:

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -42,9 +42,9 @@ __license__ = "GPLv3"
__author__ = "Veronica Berglyd Olsen"
__maintainer__ = "Veronica Berglyd Olsen"
__email__ = "code@vkbo.net"
__version__ = "2.2-beta1"
__hexversion__ = "0x020200b1"
__date__ = "2023-11-12"
__version__ = "2.2"
__hexversion__ = "0x020200f0"
__date__ = "2023-12-17"
__status__ = "Stable"
__domain__ = "novelwriter.io"
@@ -76,6 +76,7 @@ def main(sysArgs: list | None = None):
"config=",
"data=",
"testmode",
"meminfo"
]
helpMsg = (
@@ -92,6 +93,7 @@ def main(sysArgs: list | None = None):
" -v, --version Print program version and exit.\n"
" --info Print additional runtime information.\n"
" --debug Print debug output. Includes --info.\n"
" --meminfo Show memory usage information in the status bar.\n"
" --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n"
" --config= Alternative config file.\n"
" --data= Alternative user data path.\n"
@@ -127,6 +129,7 @@ def main(sysArgs: list | None = None):
elif inOpt == "--info":
logLevel = logging.INFO
elif inOpt == "--debug":
CONFIG.isDebug = True
logLevel = logging.DEBUG
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
elif inOpt == "--style":
@@ -137,6 +140,8 @@ def main(sysArgs: list | None = None):
dataPath = inArg
elif inOpt == "--testmode":
testMode = True
elif inOpt == "--meminfo":
CONFIG.memInfo = True
# Setup Logging
pkgLogger = logging.getLogger(__package__)

View File

@@ -1,5 +1,6 @@
{
"Synopsis": "Synopsis",
"Short Description": "Short Description",
"Comment": "Comment",
"Notes": "Notes",
"Tag": "Tag",

View File

@@ -1,5 +1,6 @@
{
"Synopsis": "Synopsis",
"Short Description": "Short Description",
"Comment": "Comment",
"Notes": "Notes",
"Tag": "Tag",

View File

@@ -1,7 +1,18 @@
{
"Synopsis": "Sinopsis",
"Short Description": "Breve Descripción",
"Comment": "Comentario",
"Notes": "Notas",
"Tag": "Etiqueta",
"Point of View": "Punto de Vista",
"Focus": "Foco",
"Characters": "Personajes",
"Plot": "Argumento",
"Timeline": "Línea de Tiempo",
"Locations": "Lugares",
"Objects": "Objetos",
"Entities": "Entidades",
"Custom": "Otros",
"0": "Cero",
"1": "Uno",
"2": "Dos",

View File

@@ -1,7 +1,18 @@
{
"Synopsis": "Synopsis",
"Short Description": "Description sommaire",
"Comment": "Commentaire",
"Notes": "Notes",
"Tag": "Étiquette",
"Point of View": "Point de vue",
"Focus": "Focus",
"Characters": "Personnages",
"Plot": "Intrigue",
"Timeline": "Chronologie",
"Locations": "Lieux",
"Objects": "Objets",
"Entities": "Entités",
"Custom": "Personnalisé",
"0": "Zero",
"1": "Un",
"2": "Deux",

View File

@@ -1,7 +1,18 @@
{
"Synopsis": "Sinossi",
"Short Description": "Breve descrizione",
"Comment": "Commento",
"Notes": "Note",
"Tag": "Etichetta",
"Point of View": "Punto di vista",
"Focus": "Focus",
"Characters": "Personaggi",
"Plot": "Trama",
"Timeline": "Sequenza temporale",
"Locations": "Luoghi",
"Objects": "Oggetti",
"Entities": "Enti",
"Custom": "Personalizzato",
"0": "Zero",
"1": "Uno",
"2": "Due",

View File

@@ -1,6 +1,7 @@
{
"Synopsis": "あらすじ",
"Comment": "コメント",
"Short Description": "短い説明",
"Comment": "コメント ",
"Notes": "ノート",
"Tag": "タグ",
"Point of View": "視点",

View File

@@ -1,5 +1,6 @@
{
"Synopsis": "Sammendrag",
"Short Description": "Kort beskrivelse",
"Comment": "Kommentar",
"Notes": "Notat",
"Tag": "Knagg",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.0 KiB

After

Width:  |  Height:  |  Size: 167 KiB

View File

@@ -47,10 +47,11 @@ down = typ_chevron-down.svg
edit = typ_pencil.svg
export = typ_export.svg
fmt_bold = nw_tb-bold.svg
fmt_bold-md = nw_tb-bold-md.svg
fmt_italic = nw_tb-italic.svg
fmt_mode-md = nw_tb-markdown.svg
fmt_mode-sc = nw_tb-shortcode.svg
fmt_italic-md = nw_tb-italic-md.svg
fmt_strike = nw_tb-strike.svg
fmt_strike-md = nw_tb-strike-md.svg
fmt_subscript = nw_tb-subscript.svg
fmt_superscript = nw_tb-superscript.svg
fmt_underline = nw_tb-underline.svg
@@ -59,6 +60,7 @@ maximise = typ_arrow-maximise.svg
menu = typ_th-dot-menu.svg
minimise = typ_arrow-minimise.svg
noncheckable = mixed_input-none.svg
panel = nw_panel.svg
proj_chapter = mixed_document-chapter.svg
proj_details = typ_th-list-grey.svg
proj_document = typ_document-text.svg
@@ -68,7 +70,6 @@ proj_scene = mixed_document-scene.svg
proj_section = mixed_document-section.svg
proj_stats = typ_chart-bar-grey.svg
proj_title = mixed_document-title.svg
reference = typ_at.svg
refresh = typ_refresh.svg
remove = typ_minus.svg
revert = typ_refresh-flipped.svg
@@ -91,14 +92,21 @@ sticky-off = typ_pin-outline.svg
sticky-on = typ_pin.svg
unchecked = mixed_input-unchecked.svg
up = typ_chevron-up.svg
view = typ_eye.svg
view_build = typ_export-grey.svg
view_editor = mixed_edit.svg
view_novel = typ_book-grey.svg
view_outline = typ_puzzle-outline.svg
deco_doc_h0 = nw_deco-h0.svg
deco_doc_h0_n = nw_deco-h0.svg
deco_doc_h1 = nw_deco-h1.svg
deco_doc_h1_n = nw_deco-h1.svg
deco_doc_h2 = nw_deco-h2.svg
deco_doc_h2_n = nw_deco-h2-narrow.svg
deco_doc_h3 = nw_deco-h3.svg
deco_doc_h3_n = nw_deco-h3-narrow.svg
deco_doc_h4 = nw_deco-h4.svg
deco_doc_h4_n = nw_deco-h4-narrow.svg
deco_doc_more = nw_deco-noveltree-more.svg
deco_doc_nt_n = nw_deco-note.svg

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#d64848" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 225 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#69c" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#fff" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#ffff84" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 225 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m17.853 2.0017c-0.14248-0.00428-0.28548-1.936e-4 -0.42925 0.01171h-11.135c-2.3531-0.068148-4.4276 2.1102-4.2808 4.4518 0.00689 3.8473-0.014486 7.6959 0.00976 11.542 0.12963 2.1674 2.0751 4.0505 4.2711 3.9912 3.8794-0.0037 7.7592 0.0071 11.639-0.0059 2.3157-0.05864 4.2507-2.2581 4.0603-4.5591-0.0037-3.7862 0.0071-7.5728-0.0059-11.359-0.054966-2.1716-1.9914-4.0089-4.1286-4.0732zm-11.533 2.8514c0.10262-0.00515 0.20595 1.374e-4 0.30828 0.015613 2.2719-0.00131 4.5437 0.0026 6.8153-0.00195 1.5163 0.01818 3.0369-0.036922 4.5501 0.029275 0.83106 0.14317 1.246 1.0195 1.1395 1.7956-0.0023 1.7714-9.95e-4 3.543 0 5.3144h-14.271c-9.495e-4 -1.9468-0.0019-3.8929 0.00585-5.8394 0.049778-0.75434 0.73334-1.2775 1.4517-1.3135z" fill="#848484" stroke-width=".99912"/>
</svg>

After

Width:  |  Height:  |  Size: 912 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m1.3672 5.5562v-4.7625h1.6289q0.37252 0 0.68662 0.058435 0.32139 0.051131 0.55513 0.18991 0.24104 0.13878 0.37252 0.36522 0.13878 0.22644 0.13878 0.56975 0 0.1607-0.043826 0.32139t-0.12417 0.29948q-0.080349 0.13878-0.19721 0.24835-0.10957 0.10957-0.25565 0.1607v0.029218q0.18261 0.043827 0.33601 0.13878 0.1534 0.087653 0.27027 0.22644 0.11687 0.13878 0.18261 0.3287 0.065739 0.18261 0.065739 0.42365 0 0.36522-0.14608 0.62818-0.13878 0.26295-0.39444 0.43826-0.24835 0.168-0.58435 0.25565-0.33601 0.080349-0.72313 0.080349zm1.0737-2.8561h0.50401q0.39444 0 0.56975-0.1534 0.18261-0.1534 0.18261-0.40905 0-0.27757-0.18261-0.39444t-0.56244-0.11687h-0.51131zm0 2.0233h0.60626q0.88383 0 0.88383-0.64279 0-0.31408-0.21914-0.44557-0.21914-0.13878-0.6647-0.13878h-0.60626z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".54782"/>
</svg>

After

Width:  |  Height:  |  Size: 987 B

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m1.3672 5.5562v-4.7625h1.6289q0.37252 0 0.68662 0.058435 0.32139 0.051131 0.55513 0.18991 0.24104 0.13878 0.37252 0.36522 0.13878 0.22644 0.13878 0.56975 0 0.1607-0.043826 0.32139-0.043826 0.16069-0.12417 0.29948-0.080349 0.13878-0.19721 0.24835-0.10957 0.10957-0.25565 0.1607v0.029218q0.18261 0.043827 0.33601 0.13878 0.1534 0.087653 0.27027 0.22644 0.11687 0.13878 0.18261 0.3287 0.065739 0.18261 0.065739 0.42365 0 0.36522-0.14608 0.62818-0.13878 0.26295-0.39444 0.43826-0.24835 0.168-0.58435 0.25565-0.33601 0.080349-0.72313 0.080349zm1.0737-2.8561h0.50401q0.39444 0 0.56975-0.1534 0.18261-0.1534 0.18261-0.40905 0-0.27757-0.18261-0.39444-0.18261-0.11687-0.56244-0.11687h-0.51131zm0 2.0233h0.60626q0.88383 0 0.88383-0.64279 0-0.31408-0.21914-0.44557-0.21914-0.13878-0.6647-0.13878h-0.60626z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".54782"/>
<path d="m1.568 5.2917v-4.2333h1.4479q0.33113 0 0.61033 0.051942 0.28568 0.04545 0.49345 0.16881 0.21426 0.12336 0.33113 0.32464 0.12336 0.20128 0.12336 0.50644 0 0.14284-0.038957 0.28568-0.038956 0.14284-0.11037 0.2662-0.071421 0.12336-0.1753 0.22076-0.097396 0.097396-0.22724 0.14284v0.025972q0.16232 0.038957 0.29868 0.12336 0.13636 0.077914 0.24024 0.20128 0.10388 0.12336 0.16232 0.29218 0.058435 0.16232 0.058435 0.37658 0 0.32464-0.12985 0.55838-0.12336 0.23373-0.35061 0.38956-0.22076 0.14933-0.51942 0.22724-0.29868 0.071422-0.64278 0.071422zm0.9544-2.5388h0.44801q0.35061 0 0.50644-0.13636 0.16232-0.13636 0.16232-0.3636 0-0.24673-0.16232-0.35061-0.16232-0.10388-0.49995-0.10388h-0.4545zm0 1.7985h0.5389q0.78563 0 0.78563-0.57137 0-0.27918-0.19479-0.39606-0.19479-0.12336-0.59084-0.12336h-0.5389z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".48695"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#69c" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#69c" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1017 B

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.3084 5.5562 0.94666-4.7625h0.78646l-0.94666 4.7625z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".54615"/>
</svg>

After

Width:  |  Height:  |  Size: 277 B

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.3084 5.5562 0.94666-4.7625h0.78646l-0.94666 4.7625z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".54615"/>
<path d="m2.417 5.2917 0.84148-4.2333h0.69908l-0.84148 4.2333z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".48547"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#69c" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#69c" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 277 B

After

Width:  |  Height:  |  Size: 515 B

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<g fill="#aeaeae" stroke-width="1.1">
<path d="m0.79397 2.8846-0.29357-0.21175 0.28393-0.5005-0.51975-0.23582 0.11068-0.3465 0.55825 0.1155 0.062562-0.56787h0.37057l0.062562 0.57268 0.55343-0.12032 0.1155 0.3465-0.51975 0.23582 0.28393 0.5005-0.29356 0.21175-0.385-0.42832z"/>
<path d="m2.8219 3.15-0.09999 0.37496h0.86866l-0.09374-0.37496q-0.08749-0.30622-0.16873-0.64993-0.081241-0.34372-0.16248-0.66243h-0.024997q-0.074992 0.32496-0.15623 0.66868-0.074992 0.33747-0.16248 0.64369zm-1.4749 2.0623 1.2749-4.0746h1.1062l1.2749 4.0746h-0.97489l-0.24997-0.96865h-1.2437l-0.24997 0.96865z"/>
<path d="m4.7812 2.8846-0.29357-0.21175 0.28394-0.5005-0.51975-0.23582 0.11069-0.3465 0.55825 0.1155 0.062562-0.56787h0.37056l0.062562 0.57268 0.55343-0.12032 0.1155 0.3465-0.51975 0.23582 0.28393 0.5005-0.29356 0.21175-0.385-0.42832z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 988 B

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<g fill="#aeaeae" stroke-width="1.3799">
<path d="m0.52917 5.2683v-4.1866h1.0272v0.37972h-0.49167v3.4272h0.49167v0.37972z"/>
<path d="m2.9 2.9219-0.077889 0.29209h0.67667l-0.073022-0.29209q-0.068154-0.23854-0.13144-0.50628-0.063285-0.26775-0.12657-0.51601h-0.019472q-0.058417 0.25314-0.1217 0.52088-0.058417 0.26288-0.12657 0.50141zm-1.1489 1.6065 0.9931-3.174h0.86166l0.9931 3.174h-0.75942l-0.19472-0.75455h-0.96876l-0.19472 0.75455z"/>
<path d="m4.7937 5.2683v-0.37972h0.49654v-3.4272h-0.49654v-0.37972h1.0272v4.1866z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 684 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m3.1785 5.5562q-0.46361 0-0.89912-0.17561-0.42848-0.17561-0.75863-0.49873l0.47766-0.55492q0.24585 0.2318 0.56195 0.37931 0.3161 0.14049 0.63219 0.14049 0.39336 0 0.59707-0.16156t0.20371-0.42848q0-0.14049-0.056194-0.23883-0.04917-0.098341-0.14751-0.16858-0.091316-0.077267-0.22478-0.14049-0.12644-0.063219-0.28097-0.12644l-0.63219-0.27395q-0.16858-0.070243-0.33717-0.17561-0.16156-0.10537-0.29502-0.25288t-0.21775-0.34419q-0.077268-0.19668-0.077268-0.44956 0-0.27395 0.11239-0.50575 0.11941-0.23883 0.32312-0.41444t0.48468-0.27395q0.288-0.098341 0.62517-0.098341 0.40039 0 0.77268 0.16156 0.37229 0.15454 0.63921 0.42146l-0.41444 0.5198q-0.22478-0.18263-0.46361-0.288t-0.53385-0.10537q-0.33014 0-0.52683 0.14751-0.19668 0.14049-0.19668 0.39336 0 0.13346 0.056194 0.2318 0.063219 0.091316 0.16156 0.16858 0.10537 0.070244 0.23883 0.13346 0.13346 0.056194 0.27395 0.11239l0.62516 0.2599q0.20371 0.084291 0.37229 0.19668 0.16858 0.11239 0.288 0.2599 0.12644 0.14751 0.19668 0.34419 0.070244 0.18966 0.070244 0.44253 0 0.28097-0.11239 0.52683-0.11239 0.24585-0.33015 0.43551-0.21073 0.18263-0.5198 0.29502-0.30205 0.10536-0.68838 0.10536zm-2.3848-2.6458h4.7625v0.52917h-4.7625z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".52683"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m3.1785 5.5562q-0.46361 0-0.89912-0.17561-0.42848-0.17561-0.75863-0.49873l0.47766-0.55492q0.24585 0.2318 0.56195 0.37931 0.3161 0.14049 0.63219 0.14049 0.39336 0 0.59707-0.16156 0.20371-0.16156 0.20371-0.42848 0-0.14049-0.056194-0.23883-0.04917-0.098341-0.14751-0.16858-0.091316-0.077267-0.22478-0.14049-0.12644-0.063219-0.28097-0.12644l-0.63219-0.27395q-0.16858-0.070243-0.33717-0.17561-0.16156-0.10537-0.29502-0.25288-0.13346-0.14751-0.21775-0.34419-0.077268-0.19668-0.077268-0.44956 0-0.27395 0.11239-0.50575 0.11941-0.23883 0.32312-0.41444 0.20371-0.17561 0.48468-0.27395 0.288-0.098341 0.62517-0.098341 0.40039 0 0.77268 0.16156 0.37229 0.15454 0.63921 0.42146l-0.41444 0.5198q-0.22478-0.18263-0.46361-0.288-0.23883-0.10537-0.53385-0.10537-0.33014 0-0.52683 0.14751-0.19668 0.14049-0.19668 0.39336 0 0.13346 0.056194 0.2318 0.063219 0.091316 0.16156 0.16858 0.10537 0.070244 0.23883 0.13346 0.13346 0.056194 0.27395 0.11239l0.62516 0.2599q0.20371 0.084291 0.37229 0.19668 0.16858 0.11239 0.288 0.2599 0.12644 0.14751 0.19668 0.34419 0.070244 0.18966 0.070244 0.44253 0 0.28097-0.11239 0.52683-0.11239 0.24585-0.33015 0.43551-0.21073 0.18263-0.5198 0.29502-0.30205 0.10536-0.68838 0.10536zm-2.3848-2.6458h4.7625v0.52917h-4.7625z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".52683"/>
<path d="m3.1782 5.2917q-0.4121 0-0.79922-0.1561-0.38087-0.1561-0.67434-0.44331l0.42459-0.49326q0.21853 0.20604 0.49951 0.33716 0.28098 0.12488 0.56195 0.12488 0.34965 0 0.53073-0.14361 0.18108-0.14361 0.18108-0.38087 0-0.12488-0.04995-0.21229-0.043707-0.087414-0.13112-0.14985-0.08117-0.068682-0.1998-0.12488-0.11239-0.056194-0.24975-0.11239l-0.56195-0.24351q-0.14985-0.062438-0.29971-0.1561-0.14361-0.093662-0.26224-0.22478-0.11863-0.13112-0.19356-0.30595-0.068682-0.17483-0.068682-0.39961 0-0.24351 0.099902-0.44955 0.10614-0.21229 0.28722-0.36839 0.18108-0.1561 0.43083-0.24351 0.256-0.087414 0.55571-0.087414 0.3559 0 0.68683 0.14361 0.33092 0.13737 0.56819 0.37463l-0.36839 0.46204q-0.1998-0.16234-0.4121-0.256-0.21229-0.093662-0.47453-0.093662-0.29346 0-0.46829 0.13112-0.17483 0.12488-0.17483 0.34965 0 0.11863 0.04995 0.20604 0.056194 0.08117 0.14361 0.14985 0.093662 0.062439 0.21229 0.11863 0.11863 0.04995 0.24351 0.099902l0.5557 0.23102q0.18108 0.074925 0.33092 0.17483 0.14985 0.099902 0.256 0.23102 0.11239 0.13112 0.17483 0.30595 0.062439 0.16859 0.062439 0.39336 0 0.24975-0.099902 0.46829-0.099902 0.21853-0.29347 0.38712-0.18732 0.16234-0.46204 0.26224-0.26849 0.093653-0.61189 0.093653zm-2.1198-2.3518h4.2333v0.47037h-4.2333z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".46829"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#69c" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#69c" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.124 3.0221-0.16749 0.58257h1.2161l-0.16749-0.58257q-0.11651-0.37867-0.22575-0.77919-0.10195-0.40052-0.2039-0.79375h-0.029128q-0.10195 0.40052-0.2039 0.80103-0.10195 0.39323-0.21846 0.7719zm-1.5948 2.5342 1.5511-4.7625h0.99037l1.5511 4.7625h-0.88842l-0.37139-1.2889h-1.6021l-0.37139 1.2889z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".54616"/>
<path d="m4.101 5.5562v-2.3812h0.75354q0.18388 0 0.3353 0.032769 0.15503 0.029128 0.2668 0.098307 0.11538 0.065538 0.17667 0.17841 0.064898 0.11287 0.064898 0.27671 0 0.17113-0.086529 0.31676-0.086529 0.14564-0.24156 0.20026v0.014565q0.19469 0.043691 0.32088 0.18569 0.12979 0.13836 0.12979 0.37867 0 0.17841-0.068503 0.30948-0.068502 0.13107-0.19108 0.21846-0.11899 0.087383-0.28483 0.13107-0.16585 0.04005-0.36054 0.04005zm0.41823-1.3981h0.29925q0.24878 0 0.35693-0.091024 0.11177-0.091025 0.11177-0.24394 0-0.17477-0.11538-0.24759-0.11538-0.072819-0.34612-0.072819h-0.30646zm0 1.0705h0.35334q0.25959 0 0.4002-0.094666 0.14061-0.098307 0.14061-0.29856 0-0.18933-0.13701-0.27308-0.13701-0.087384-0.40381-0.087384h-0.35334z" fill="#69c" stroke-opacity=".78039" stroke-width=".27174"/>
<path d="m2.2992 3.0475-0.13958 0.48548h1.0134l-0.13958-0.48548q-0.097092-0.31556-0.18812-0.64932-0.084958-0.33377-0.16992-0.66146h-0.024273q-0.084958 0.33377-0.16992 0.66752-0.084958 0.32769-0.18205 0.64325zm-1.329 2.1118 1.2926-3.9688h0.82531l1.2926 3.9688h-0.74035l-0.30949-1.0741h-1.3351l-0.30949 1.0741z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".45513"/>
<path d="m3.9467 5.1593v-1.9843h0.62795q0.15323 0 0.27942 0.027308 0.12919 0.024273 0.22233 0.081922 0.09615 0.054615 0.14722 0.14868 0.054082 0.094058 0.054082 0.23059 0 0.14261-0.072107 0.26397-0.072108 0.12137-0.2013 0.16688v0.012137q0.16224 0.036409 0.2674 0.15474 0.10816 0.1153 0.10816 0.31556 0 0.14868-0.057086 0.2579-0.057085 0.10922-0.15923 0.18205-0.099158 0.072819-0.23736 0.10922-0.13821 0.033375-0.30045 0.033375zm0.34852-1.1651h0.24938q0.20732 0 0.29744-0.075853 0.093142-0.075854 0.093142-0.20328 0-0.14564-0.09615-0.20632-0.09615-0.060682-0.28843-0.060682h-0.25538zm0 0.89208h0.29445q0.21632 0 0.3335-0.078888 0.11718-0.081923 0.11718-0.2488 0-0.15778-0.11418-0.22757-0.11418-0.07282-0.33651-0.07282h-0.29445z" fill="#fff" stroke-opacity=".78039" stroke-width=".22645"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#69c" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#69c" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.124 3.0221-0.16749 0.58257h1.2161l-0.16749-0.58257q-0.11651-0.37867-0.22575-0.77919-0.10195-0.40052-0.2039-0.79375h-0.029128q-0.10195 0.40052-0.2039 0.80103-0.10195 0.39323-0.21846 0.7719zm-1.5948 2.5342 1.5511-4.7625h0.99037l1.5511 4.7625h-0.88842l-0.37139-1.2889h-1.6021l-0.37139 1.2889z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".54616"/>
<path d="m4.101 3.175v-2.3812h0.75352q0.18389 0 0.33531 0.032768 0.15503 0.029128 0.2668 0.098307 0.11538 0.065538 0.17667 0.17841 0.064898 0.11287 0.064898 0.27671 0 0.17113-0.086528 0.31676-0.086528 0.14564-0.24156 0.20026v0.014565q0.19469 0.043691 0.32088 0.1857 0.12979 0.13836 0.12979 0.37867 0 0.17841-0.068503 0.30948t-0.19108 0.21845q-0.11897 0.087382-0.28482 0.13107-0.16585 0.04005-0.36054 0.04005zm0.41824-1.3981h0.29924q0.24878 0 0.35693-0.091024 0.11177-0.091024 0.11177-0.24394 0-0.17477-0.11538-0.24759-0.11538-0.072818-0.34612-0.072818h-0.30646zm0 1.0705h0.35332q0.25959 0 0.4002-0.094666 0.14061-0.098307 0.14061-0.29855 0-0.18932-0.13701-0.27307-0.13701-0.087383-0.40381-0.087383h-0.35332z" fill="#69c" stroke-opacity=".78039" stroke-width=".27173"/>
<path d="m3.9467 3.175v-1.9843h0.62793q0.15324 0 0.27942 0.027307 0.12919 0.024274 0.22233 0.081922 0.09615 0.054615 0.14722 0.14868 0.054082 0.094058 0.054082 0.23059 0 0.14261-0.072107 0.26397-0.072107 0.12137-0.2013 0.16688v0.012138q0.16224 0.03641 0.2674 0.15475 0.10816 0.1153 0.10816 0.31556 0 0.14868-0.057086 0.2579-0.057085 0.10922-0.15923 0.18204-0.099142 0.072818-0.23735 0.10922-0.13821 0.033375-0.30045 0.033375zm0.34853-1.1651h0.24937q0.20732 0 0.29744-0.075853 0.093141-0.075853 0.093141-0.20328 0-0.14564-0.09615-0.20632-0.09615-0.060682-0.28843-0.060682h-0.25538zm0 0.89208h0.29443q0.21632 0 0.3335-0.078888 0.11718-0.081923 0.11718-0.24879 0-0.15777-0.11418-0.22756-0.11418-0.07282-0.33651-0.07282h-0.29443z" fill="#fff" stroke-opacity=".78039" stroke-width=".25475"/>
<path d="m2.2992 3.0475-0.13958 0.48548h1.0134l-0.13958-0.48548q-0.097092-0.31556-0.18812-0.64932-0.084958-0.33377-0.16992-0.66146h-0.024273q-0.084958 0.33377-0.16992 0.66753-0.084958 0.32769-0.18205 0.64325zm-1.329 2.1118 1.2926-3.9688h0.82531l1.2926 3.9688h-0.74035l-0.30949-1.0741h-1.3351l-0.30949 1.0741z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".45513"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#69c" stroke-width="1.1186"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#69c" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m3.1782 5.0271q-0.36231 0-0.6547-0.1017-0.28603-0.10806-0.49579-0.33689-0.2034-0.22883-0.31782-0.58479-0.10806-0.36231-0.10806-0.87717v-2.3328h0.73733v2.3899q0 0.33689 0.057206 0.57207 0.063563 0.22883 0.17162 0.36866 0.11441 0.13984 0.26697 0.2034 0.15255 0.057206 0.34324 0.057206 0.19068 0 0.3496-0.057206 0.15891-0.063564 0.27332-0.2034 0.11441-0.13984 0.17798-0.36866 0.063564-0.23519 0.063564-0.57207v-2.3899h0.70555v2.3328q0 0.51487-0.10806 0.87717-0.10806 0.35595-0.31782 0.58479-0.2034 0.22883-0.49579 0.33689-0.28603 0.1017-0.64835 0.1017z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".47673"/>
<rect x="1.0583" y="5.2917" width="4.2333" height=".52917" fill="#aeaeae" stroke-width="1.2172"/>
<path d="m3.1778 4.846q-0.32417 0-0.58578-0.090994-0.25592-0.096685-0.4436-0.30143-0.18199-0.20474-0.28436-0.52323-0.096684-0.32417-0.096684-0.78483v-2.0872h0.65971v2.1383q0 0.30143 0.051184 0.51185 0.056872 0.20474 0.15355 0.32985 0.10237 0.12512 0.23887 0.18199 0.13649 0.051184 0.30711 0.051184 0.17061 0 0.3128-0.051184 0.14218-0.056873 0.24455-0.18199 0.10237-0.12512 0.15924-0.32985 0.056873-0.21043 0.056873-0.51185v-2.1383h0.63128v2.0872q0 0.46067-0.096685 0.78483-0.096684 0.31848-0.28436 0.52323-0.18199 0.20474-0.4436 0.30143-0.25592 0.090994-0.5801 0.090994z" fill="#aeaeae" stroke-opacity=".78039" stroke-width=".42654"/>
<rect x="1.5875" y="5.0271" width="3.175" height=".39688" fill="#aeaeae" stroke-width=".91291"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#69c" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#69c" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 871 B

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12 2c-5.5138 0-10 4.4862-10 10s4.4862 10 10 10c2.02 0 3.965-0.59875 5.6238-1.73 0.57-0.39 0.7175-1.1675 0.32875-1.7375-0.38875-0.57125-1.165-0.715-1.7375-0.32875-1.2425 0.84875-2.7 1.2962-4.215 1.2962-4.1362 0-7.5-3.3638-7.5-7.5s3.3638-7.5 7.5-7.5 7.5 3.3638 7.5 7.5v0.625c0 0.69-0.56 1.25-1.25 1.25s-1.25-0.56-1.25-1.25v-3.75c0-0.69125-0.55875-1.25-1.25-1.25-0.55125 0-1.0062 0.3625-1.1725 0.86-0.725-0.53375-1.6112-0.86-2.5775-0.86-2.4125 0-4.375 1.9625-4.375 4.375s1.9625 4.375 4.375 4.375c1.3062 0 2.4688-0.5875 3.27-1.4988 0.685 0.90375 1.76 1.4988 2.98 1.4988 2.0675 0 3.75-1.6825 3.75-3.75v-0.625c0-5.5138-4.4862-10-10-10zm0 11.875c-1.0338 0-1.875-0.84125-1.875-1.875s0.84125-1.875 1.875-1.875 1.875 0.84125 1.875 1.875-0.84125 1.875-1.875 1.875z" fill="#69c" stroke-width="1.25"/>
</svg>

Before

Width:  |  Height:  |  Size: 944 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m22.803 11.373c-0.0913-0.1309-2.2682-3.2384-5.2724-5.3626-1.5576-1.1033-3.5222-1.7105-5.5309-1.7105-2.0075 0-3.9721 0.60721-5.5331 1.7105-3.0041 2.1241-5.1789 5.2317-5.2702 5.3626-0.2618 0.3773-0.2618 0.87781 0 1.2551 0.091301 0.1309 2.266 3.2384 5.2702 5.3626 1.5609 1.1022 3.5255 1.7094 5.5331 1.7094 2.0086 0 3.9732-0.60721 5.5309-1.7105 3.0041-2.1241 5.1811-5.2317 5.2724-5.3626 0.2629-0.3762 0.2629-0.87781 0-1.254zm-10.803 4.4771c-2.1274 0-3.85-1.727-3.85-3.85 0-2.1274 1.7226-3.85 3.85-3.85 2.123 0 3.85 1.7226 3.85 3.85 0 2.123-1.727 3.85-3.85 3.85zm2.2-3.85c0 1.2122-0.98781 2.2-2.2 2.2-1.2155 0-2.2-0.98781-2.2-2.2 0-1.2155 0.98451-2.2 2.2-2.2 1.2122 0 2.2 0.98451 2.2 2.2z" fill="#69c" stroke-width="1.1"/>
</svg>

After

Width:  |  Height:  |  Size: 872 B

View File

@@ -47,10 +47,11 @@ down = typ_chevron-down.svg
edit = typ_pencil.svg
export = typ_export.svg
fmt_bold = nw_tb-bold.svg
fmt_bold-md = nw_tb-bold-md.svg
fmt_italic = nw_tb-italic.svg
fmt_mode-md = nw_tb-markdown.svg
fmt_mode-sc = nw_tb-shortcode.svg
fmt_italic-md = nw_tb-italic-md.svg
fmt_strike = nw_tb-strike.svg
fmt_strike-md = nw_tb-strike-md.svg
fmt_subscript = nw_tb-subscript.svg
fmt_superscript = nw_tb-superscript.svg
fmt_underline = nw_tb-underline.svg
@@ -59,6 +60,7 @@ maximise = typ_arrow-maximise.svg
menu = typ_th-dot-menu.svg
minimise = typ_arrow-minimise.svg
noncheckable = mixed_input-none.svg
panel = nw_panel.svg
proj_chapter = mixed_document-chapter.svg
proj_details = typ_th-list-grey.svg
proj_document = typ_document-text.svg
@@ -68,7 +70,6 @@ proj_scene = mixed_document-scene.svg
proj_section = mixed_document-section.svg
proj_stats = typ_chart-bar-grey.svg
proj_title = mixed_document-title.svg
reference = typ_at.svg
refresh = typ_refresh.svg
remove = typ_minus.svg
revert = typ_refresh-flipped.svg
@@ -91,14 +92,21 @@ sticky-off = typ_pin-outline.svg
sticky-on = typ_pin.svg
unchecked = mixed_input-unchecked.svg
up = typ_chevron-up.svg
view = typ_eye.svg
view_build = typ_export-grey.svg
view_editor = mixed_edit.svg
view_novel = typ_book-grey.svg
view_outline = typ_puzzle-outline.svg
deco_doc_h0 = nw_deco-h0.svg
deco_doc_h0_n = nw_deco-h0.svg
deco_doc_h1 = nw_deco-h1.svg
deco_doc_h1_n = nw_deco-h1.svg
deco_doc_h2 = nw_deco-h2.svg
deco_doc_h2_n = nw_deco-h2-narrow.svg
deco_doc_h3 = nw_deco-h3.svg
deco_doc_h3_n = nw_deco-h3-narrow.svg
deco_doc_h4 = nw_deco-h4.svg
deco_doc_h4_n = nw_deco-h4-narrow.svg
deco_doc_more = nw_deco-noveltree-more.svg
deco_doc_nt_n = nw_deco-note.svg

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#c82829" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 225 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#4271ae" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 225 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#333" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 222 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="4" height="24" version="1.2" viewBox="0 0 4 24" xmlns="http://www.w3.org/2000/svg">
<rect y="1" width="4" height="22" rx="2" ry="2" fill="#ad8700" stroke-width="0"/>
</svg>

After

Width:  |  Height:  |  Size: 225 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m17.853 2.0017c-0.14248-0.00428-0.28548-1.936e-4 -0.42925 0.01171h-11.135c-2.3531-0.068148-4.4276 2.1102-4.2808 4.4518 0.00689 3.8473-0.014486 7.6959 0.00976 11.542 0.12963 2.1674 2.0751 4.0505 4.2711 3.9912 3.8794-0.0037 7.7592 0.0071 11.639-0.0059 2.3157-0.05864 4.2507-2.2581 4.0603-4.5591-0.0037-3.7862 0.0071-7.5728-0.0059-11.359-0.054966-2.1716-1.9914-4.0089-4.1286-4.0732zm-11.533 2.8514c0.10262-0.00515 0.20595 1.374e-4 0.30828 0.015613 2.2719-0.00131 4.5437 0.0026 6.8153-0.00195 1.5163 0.01818 3.0369-0.036922 4.5501 0.029275 0.83106 0.14317 1.246 1.0195 1.1395 1.7956-0.0023 1.7714-9.95e-4 3.543 0 5.3144h-14.271c-9.495e-4 -1.9468-0.0019-3.8929 0.00585-5.8394 0.049778-0.75434 0.73334-1.2775 1.4517-1.3135z" fill-opacity=".78039" stroke-width=".99912"/>
</svg>

After

Width:  |  Height:  |  Size: 919 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m1.3672 5.5562v-4.7625h1.6289q0.37252 0 0.68662 0.058435 0.32139 0.051131 0.55513 0.18991 0.24104 0.13878 0.37252 0.36522 0.13878 0.22644 0.13878 0.56975 0 0.1607-0.043826 0.32139t-0.12417 0.29948q-0.080349 0.13878-0.19721 0.24835-0.10957 0.10957-0.25565 0.1607v0.029218q0.18261 0.043827 0.33601 0.13878 0.1534 0.087653 0.27027 0.22644 0.11687 0.13878 0.18261 0.3287 0.065739 0.18261 0.065739 0.42365 0 0.36522-0.14608 0.62818-0.13878 0.26295-0.39444 0.43826-0.24835 0.168-0.58435 0.25565-0.33601 0.080349-0.72313 0.080349zm1.0737-2.8561h0.50401q0.39444 0 0.56975-0.1534 0.18261-0.1534 0.18261-0.40905 0-0.27757-0.18261-0.39444t-0.56244-0.11687h-0.51131zm0 2.0233h0.60626q0.88383 0 0.88383-0.64279 0-0.31408-0.21914-0.44557-0.21914-0.13878-0.6647-0.13878h-0.60626z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".54782"/>
</svg>

After

Width:  |  Height:  |  Size: 994 B

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m1.3672 5.5562v-4.7625h1.6289q0.37252 0 0.68662 0.058435 0.32139 0.051131 0.55513 0.18991 0.24104 0.13878 0.37252 0.36522 0.13878 0.22644 0.13878 0.56975 0 0.1607-0.043826 0.32139-0.043826 0.16069-0.12417 0.29948-0.080349 0.13878-0.19721 0.24835-0.10957 0.10957-0.25565 0.1607v0.029218q0.18261 0.043827 0.33601 0.13878 0.1534 0.087653 0.27027 0.22644 0.11687 0.13878 0.18261 0.3287 0.065739 0.18261 0.065739 0.42365 0 0.36522-0.14608 0.62818-0.13878 0.26295-0.39444 0.43826-0.24835 0.168-0.58435 0.25565-0.33601 0.080349-0.72313 0.080349zm1.0737-2.8561h0.50401q0.39444 0 0.56975-0.1534 0.18261-0.1534 0.18261-0.40905 0-0.27757-0.18261-0.39444-0.18261-0.11687-0.56244-0.11687h-0.51131zm0 2.0233h0.60626q0.88383 0 0.88383-0.64279 0-0.31408-0.21914-0.44557-0.21914-0.13878-0.6647-0.13878h-0.60626z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".54782"/>
<path d="m1.568 5.2917v-4.2333h1.4479q0.33113 0 0.61033 0.051942 0.28568 0.04545 0.49345 0.16881 0.21426 0.12336 0.33113 0.32464 0.12336 0.20128 0.12336 0.50644 0 0.14284-0.038957 0.28568-0.038956 0.14284-0.11037 0.2662-0.071421 0.12336-0.1753 0.22076-0.097396 0.097396-0.22724 0.14284v0.025972q0.16232 0.038957 0.29868 0.12336 0.13636 0.077914 0.24024 0.20128 0.10388 0.12336 0.16232 0.29218 0.058435 0.16232 0.058435 0.37658 0 0.32464-0.12985 0.55838-0.12336 0.23373-0.35061 0.38956-0.22076 0.14933-0.51942 0.22724-0.29868 0.071422-0.64278 0.071422zm0.9544-2.5388h0.44801q0.35061 0 0.50644-0.13636 0.16232-0.13636 0.16232-0.3636 0-0.24673-0.16232-0.35061-0.16232-0.10388-0.49995-0.10388h-0.4545zm0 1.7985h0.5389q0.78563 0 0.78563-0.57137 0-0.27918-0.19479-0.39606-0.19479-0.12336-0.59084-0.12336h-0.5389z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".48695"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#4271ae" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#4271ae" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.3084 5.5562 0.94666-4.7625h0.78646l-0.94666 4.7625z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".54615"/>
</svg>

After

Width:  |  Height:  |  Size: 284 B

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.3084 5.5562 0.94666-4.7625h0.78646l-0.94666 4.7625z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".54615"/>
<path d="m2.417 5.2917 0.84148-4.2333h0.69908l-0.84148 4.2333z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".48547"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#4271ae" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#4271ae" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 284 B

After

Width:  |  Height:  |  Size: 528 B

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<g fill-opacity=".78039" stroke-width="1.1">
<path d="m0.79397 2.8846-0.29357-0.21175 0.28393-0.5005-0.51975-0.23582 0.11068-0.3465 0.55825 0.1155 0.062562-0.56787h0.37057l0.062562 0.57268 0.55343-0.12032 0.1155 0.3465-0.51975 0.23582 0.28393 0.5005-0.29356 0.21175-0.385-0.42832z"/>
<path d="m2.8219 3.15-0.09999 0.37496h0.86866l-0.09374-0.37496q-0.08749-0.30622-0.16873-0.64993-0.081241-0.34372-0.16248-0.66243h-0.024997q-0.074992 0.32496-0.15623 0.66868-0.074992 0.33747-0.16248 0.64369zm-1.4749 2.0623 1.2749-4.0746h1.1062l1.2749 4.0746h-0.97489l-0.24997-0.96865h-1.2437l-0.24997 0.96865z"/>
<path d="m4.7812 2.8846-0.29357-0.21175 0.28394-0.5005-0.51975-0.23582 0.11069-0.3465 0.55825 0.1155 0.062562-0.56787h0.37056l0.062562 0.57268 0.55343-0.12032 0.1155 0.3465-0.51975 0.23582 0.28393 0.5005-0.29356 0.21175-0.385-0.42832z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 995 B

View File

@@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<g fill-opacity=".78039" stroke-width="1.3799">
<path d="m0.52917 5.2683v-4.1866h1.0272v0.37972h-0.49167v3.4272h0.49167v0.37972z"/>
<path d="m2.9 2.9219-0.077889 0.29209h0.67667l-0.073022-0.29209q-0.068154-0.23854-0.13144-0.50628-0.063285-0.26775-0.12657-0.51601h-0.019472q-0.058417 0.25314-0.1217 0.52088-0.058417 0.26288-0.12657 0.50141zm-1.1489 1.6065 0.9931-3.174h0.86166l0.9931 3.174h-0.75942l-0.19472-0.75455h-0.96876l-0.19472 0.75455z"/>
<path d="m4.7937 5.2683v-0.37972h0.49654v-3.4272h-0.49654v-0.37972h1.0272v4.1866z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 691 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m3.1785 5.5562q-0.46361 0-0.89912-0.17561-0.42848-0.17561-0.75863-0.49873l0.47766-0.55492q0.24585 0.2318 0.56195 0.37931 0.3161 0.14049 0.63219 0.14049 0.39336 0 0.59707-0.16156t0.20371-0.42848q0-0.14049-0.056194-0.23883-0.04917-0.098341-0.14751-0.16858-0.091316-0.077267-0.22478-0.14049-0.12644-0.063219-0.28097-0.12644l-0.63219-0.27395q-0.16858-0.070243-0.33717-0.17561-0.16156-0.10537-0.29502-0.25288t-0.21775-0.34419q-0.077268-0.19668-0.077268-0.44956 0-0.27395 0.11239-0.50575 0.11941-0.23883 0.32312-0.41444t0.48468-0.27395q0.288-0.098341 0.62517-0.098341 0.40039 0 0.77268 0.16156 0.37229 0.15454 0.63921 0.42146l-0.41444 0.5198q-0.22478-0.18263-0.46361-0.288t-0.53385-0.10537q-0.33014 0-0.52683 0.14751-0.19668 0.14049-0.19668 0.39336 0 0.13346 0.056194 0.2318 0.063219 0.091316 0.16156 0.16858 0.10537 0.070244 0.23883 0.13346 0.13346 0.056194 0.27395 0.11239l0.62516 0.2599q0.20371 0.084291 0.37229 0.19668 0.16858 0.11239 0.288 0.2599 0.12644 0.14751 0.19668 0.34419 0.070244 0.18966 0.070244 0.44253 0 0.28097-0.11239 0.52683-0.11239 0.24585-0.33015 0.43551-0.21073 0.18263-0.5198 0.29502-0.30205 0.10536-0.68838 0.10536zm-2.3848-2.6458h4.7625v0.52917h-4.7625z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".52683"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,4 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m3.1785 5.5562q-0.46361 0-0.89912-0.17561-0.42848-0.17561-0.75863-0.49873l0.47766-0.55492q0.24585 0.2318 0.56195 0.37931 0.3161 0.14049 0.63219 0.14049 0.39336 0 0.59707-0.16156 0.20371-0.16156 0.20371-0.42848 0-0.14049-0.056194-0.23883-0.04917-0.098341-0.14751-0.16858-0.091316-0.077267-0.22478-0.14049-0.12644-0.063219-0.28097-0.12644l-0.63219-0.27395q-0.16858-0.070243-0.33717-0.17561-0.16156-0.10537-0.29502-0.25288-0.13346-0.14751-0.21775-0.34419-0.077268-0.19668-0.077268-0.44956 0-0.27395 0.11239-0.50575 0.11941-0.23883 0.32312-0.41444 0.20371-0.17561 0.48468-0.27395 0.288-0.098341 0.62517-0.098341 0.40039 0 0.77268 0.16156 0.37229 0.15454 0.63921 0.42146l-0.41444 0.5198q-0.22478-0.18263-0.46361-0.288-0.23883-0.10537-0.53385-0.10537-0.33014 0-0.52683 0.14751-0.19668 0.14049-0.19668 0.39336 0 0.13346 0.056194 0.2318 0.063219 0.091316 0.16156 0.16858 0.10537 0.070244 0.23883 0.13346 0.13346 0.056194 0.27395 0.11239l0.62516 0.2599q0.20371 0.084291 0.37229 0.19668 0.16858 0.11239 0.288 0.2599 0.12644 0.14751 0.19668 0.34419 0.070244 0.18966 0.070244 0.44253 0 0.28097-0.11239 0.52683-0.11239 0.24585-0.33015 0.43551-0.21073 0.18263-0.5198 0.29502-0.30205 0.10536-0.68838 0.10536zm-2.3848-2.6458h4.7625v0.52917h-4.7625z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".52683"/>
<path d="m3.1782 5.2917q-0.4121 0-0.79922-0.1561-0.38087-0.1561-0.67434-0.44331l0.42459-0.49326q0.21853 0.20604 0.49951 0.33716 0.28098 0.12488 0.56195 0.12488 0.34965 0 0.53073-0.14361 0.18108-0.14361 0.18108-0.38087 0-0.12488-0.04995-0.21229-0.043707-0.087414-0.13112-0.14985-0.08117-0.068682-0.1998-0.12488-0.11239-0.056194-0.24975-0.11239l-0.56195-0.24351q-0.14985-0.062438-0.29971-0.1561-0.14361-0.093662-0.26224-0.22478-0.11863-0.13112-0.19356-0.30595-0.068682-0.17483-0.068682-0.39961 0-0.24351 0.099902-0.44955 0.10614-0.21229 0.28722-0.36839 0.18108-0.1561 0.43083-0.24351 0.256-0.087414 0.55571-0.087414 0.3559 0 0.68683 0.14361 0.33092 0.13737 0.56819 0.37463l-0.36839 0.46204q-0.1998-0.16234-0.4121-0.256-0.21229-0.093662-0.47453-0.093662-0.29346 0-0.46829 0.13112-0.17483 0.12488-0.17483 0.34965 0 0.11863 0.04995 0.20604 0.056194 0.08117 0.14361 0.14985 0.093662 0.062439 0.21229 0.11863 0.11863 0.04995 0.24351 0.099902l0.5557 0.23102q0.18108 0.074925 0.33092 0.17483 0.14985 0.099902 0.256 0.23102 0.11239 0.13112 0.17483 0.30595 0.062439 0.16859 0.062439 0.39336 0 0.24975-0.099902 0.46829-0.099902 0.21853-0.29347 0.38712-0.18732 0.16234-0.46204 0.26224-0.26849 0.093653-0.61189 0.093653zm-2.1198-2.3518h4.2333v0.47037h-4.2333z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".46829"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#4271ae" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#4271ae" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.124 3.0221-0.16749 0.58257h1.2161l-0.16749-0.58257q-0.11651-0.37867-0.22575-0.77919-0.10195-0.40052-0.2039-0.79375h-0.029128q-0.10195 0.40052-0.2039 0.80103-0.10195 0.39323-0.21846 0.7719zm-1.5948 2.5342 1.5511-4.7625h0.99037l1.5511 4.7625h-0.88842l-0.37139-1.2889h-1.6021l-0.37139 1.2889z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".54616"/>
<path d="m4.101 5.5562v-2.3812h0.75354q0.18388 0 0.3353 0.032769 0.15503 0.029128 0.2668 0.098307 0.11538 0.065538 0.17667 0.17841 0.064898 0.11287 0.064898 0.27671 0 0.17113-0.086529 0.31676-0.086529 0.14564-0.24156 0.20026v0.014565q0.19469 0.043691 0.32088 0.18569 0.12979 0.13836 0.12979 0.37867 0 0.17841-0.068503 0.30948-0.068502 0.13107-0.19108 0.21846-0.11899 0.087383-0.28483 0.13107-0.16585 0.04005-0.36054 0.04005zm0.41823-1.3981h0.29925q0.24878 0 0.35693-0.091024 0.11177-0.091025 0.11177-0.24394 0-0.17477-0.11538-0.24759-0.11538-0.072819-0.34612-0.072819h-0.30646zm0 1.0705h0.35334q0.25959 0 0.4002-0.094666 0.14061-0.098307 0.14061-0.29856 0-0.18933-0.13701-0.27308-0.13701-0.087384-0.40381-0.087384h-0.35334z" fill="#4271ae" stroke-opacity=".78039" stroke-width=".27174"/>
<path d="m2.2992 3.0475-0.13958 0.48548h1.0134l-0.13958-0.48548q-0.097092-0.31556-0.18812-0.64932-0.084958-0.33377-0.16992-0.66146h-0.024273q-0.084958 0.33377-0.16992 0.66752-0.084958 0.32769-0.18205 0.64325zm-1.329 2.1118 1.2926-3.9688h0.82531l1.2926 3.9688h-0.74035l-0.30949-1.0741h-1.3351l-0.30949 1.0741z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".45513"/>
<path d="m3.9467 5.1593v-1.9843h0.62795q0.15323 0 0.27942 0.027308 0.12919 0.024273 0.22233 0.081922 0.09615 0.054615 0.14722 0.14868 0.054082 0.094058 0.054082 0.23059 0 0.14261-0.072107 0.26397-0.072108 0.12137-0.2013 0.16688v0.012137q0.16224 0.036409 0.2674 0.15474 0.10816 0.1153 0.10816 0.31556 0 0.14868-0.057086 0.2579-0.057085 0.10922-0.15923 0.18205-0.099158 0.072819-0.23736 0.10922-0.13821 0.033375-0.30045 0.033375zm0.34852-1.1651h0.24938q0.20732 0 0.29744-0.075853 0.093142-0.075854 0.093142-0.20328 0-0.14564-0.09615-0.20632-0.09615-0.060682-0.28843-0.060682h-0.25538zm0 0.89208h0.29445q0.21632 0 0.3335-0.078888 0.11718-0.081923 0.11718-0.2488 0-0.15778-0.11418-0.22757-0.11418-0.07282-0.33651-0.07282h-0.29445z" stroke-opacity=".78039" stroke-width=".22645"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#4271ae" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#4271ae" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m2.124 3.0221-0.16749 0.58257h1.2161l-0.16749-0.58257q-0.11651-0.37867-0.22575-0.77919-0.10195-0.40052-0.2039-0.79375h-0.029128q-0.10195 0.40052-0.2039 0.80103-0.10195 0.39323-0.21846 0.7719zm-1.5948 2.5342 1.5511-4.7625h0.99037l1.5511 4.7625h-0.88842l-0.37139-1.2889h-1.6021l-0.37139 1.2889z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".54616"/>
<path d="m4.101 3.175v-2.3812h0.75352q0.18389 0 0.33531 0.032768 0.15503 0.029128 0.2668 0.098307 0.11538 0.065538 0.17667 0.17841 0.064898 0.11287 0.064898 0.27671 0 0.17113-0.086528 0.31676-0.086528 0.14564-0.24156 0.20026v0.014565q0.19469 0.043691 0.32088 0.1857 0.12979 0.13836 0.12979 0.37867 0 0.17841-0.068503 0.30948t-0.19108 0.21845q-0.11897 0.087382-0.28482 0.13107-0.16585 0.04005-0.36054 0.04005zm0.41824-1.3981h0.29924q0.24878 0 0.35693-0.091024 0.11177-0.091024 0.11177-0.24394 0-0.17477-0.11538-0.24759-0.11538-0.072818-0.34612-0.072818h-0.30646zm0 1.0705h0.35332q0.25959 0 0.4002-0.094666 0.14061-0.098307 0.14061-0.29855 0-0.18932-0.13701-0.27307-0.13701-0.087383-0.40381-0.087383h-0.35332z" fill="#4271ae" stroke-opacity=".78039" stroke-width=".27173"/>
<path d="m3.9467 3.175v-1.9843h0.62793q0.15324 0 0.27942 0.027307 0.12919 0.024274 0.22233 0.081922 0.09615 0.054615 0.14722 0.14868 0.054082 0.094058 0.054082 0.23059 0 0.14261-0.072107 0.26397-0.072107 0.12137-0.2013 0.16688v0.012138q0.16224 0.03641 0.2674 0.15475 0.10816 0.1153 0.10816 0.31556 0 0.14868-0.057086 0.2579-0.057085 0.10922-0.15923 0.18204-0.099142 0.072818-0.23735 0.10922-0.13821 0.033375-0.30045 0.033375zm0.34853-1.1651h0.24937q0.20732 0 0.29744-0.075853 0.093141-0.075853 0.093141-0.20328 0-0.14564-0.09615-0.20632-0.09615-0.060682-0.28843-0.060682h-0.25538zm0 0.89208h0.29443q0.21632 0 0.3335-0.078888 0.11718-0.081923 0.11718-0.24879 0-0.15777-0.11418-0.22756-0.11418-0.07282-0.33651-0.07282h-0.29443z" stroke-opacity=".78039" stroke-width=".25475"/>
<path d="m2.2992 3.0475-0.13958 0.48548h1.0134l-0.13958-0.48548q-0.097092-0.31556-0.18812-0.64932-0.084958-0.33377-0.16992-0.66146h-0.024273q-0.084958 0.33377-0.16992 0.66753-0.084958 0.32769-0.18205 0.64325zm-1.329 2.1118 1.2926-3.9688h0.82531l1.2926 3.9688h-0.74035l-0.30949-1.0741h-1.3351l-0.30949 1.0741z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".45513"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#4271ae" stroke-width="1.1186"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#4271ae" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
<path d="m3.1782 5.0271q-0.36231 0-0.6547-0.1017-0.28603-0.10806-0.49579-0.33689-0.2034-0.22883-0.31782-0.58479-0.10806-0.36231-0.10806-0.87717v-2.3328h0.73733v2.3899q0 0.33689 0.057206 0.57207 0.063563 0.22883 0.17162 0.36866 0.11441 0.13984 0.26697 0.2034 0.15255 0.057206 0.34324 0.057206 0.19068 0 0.3496-0.057206 0.15891-0.063564 0.27332-0.2034 0.11441-0.13984 0.17798-0.36866 0.063564-0.23519 0.063564-0.57207v-2.3899h0.70555v2.3328q0 0.51487-0.10806 0.87717-0.10806 0.35595-0.31782 0.58479-0.2034 0.22883-0.49579 0.33689-0.28603 0.1017-0.64835 0.1017z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".47673"/>
<rect x="1.0583" y="5.2917" width="4.2333" height=".52917" fill-opacity=".78039" stroke-width="1.2172"/>
<path d="m3.1778 4.846q-0.32417 0-0.58578-0.090994-0.25592-0.096685-0.4436-0.30143-0.18199-0.20474-0.28436-0.52323-0.096684-0.32417-0.096684-0.78483v-2.0872h0.65971v2.1383q0 0.30143 0.051184 0.51185 0.056872 0.20474 0.15355 0.32985 0.10237 0.12512 0.23887 0.18199 0.13649 0.051184 0.30711 0.051184 0.17061 0 0.3128-0.051184 0.14218-0.056873 0.24455-0.18199 0.10237-0.12512 0.15924-0.32985 0.056873-0.21043 0.056873-0.51185v-2.1383h0.63128v2.0872q0 0.46067-0.096685 0.78483-0.096684 0.31848-0.28436 0.52323-0.18199 0.20474-0.4436 0.30143-0.25592 0.090994-0.5801 0.090994z" fill-opacity=".78039" stroke-opacity=".78039" stroke-width=".42654"/>
<rect x="1.5875" y="5.0271" width="3.175" height=".39688" fill-opacity=".78039" stroke-width=".91291"/>
<path d="m4.9555 5.5562v-0.43195h0.54619v-3.8986h-0.54619v-0.43195h1.1299v4.7624z" fill="#4271ae" stroke-width="1.1186"/>
<path d="m0.26458 5.5562v-4.7624h1.1299v0.43195h-0.54083v3.8986h0.54083v0.43195z" fill="#4271ae" stroke-width="1.1186"/>
</svg>

Before

Width:  |  Height:  |  Size: 885 B

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,4 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m12 2c-5.5138 0-10 4.4862-10 10s4.4862 10 10 10c2.02 0 3.965-0.59875 5.6238-1.73 0.57-0.39 0.7175-1.1675 0.32875-1.7375-0.38875-0.57125-1.165-0.715-1.7375-0.32875-1.2425 0.84875-2.7 1.2962-4.215 1.2962-4.1362 0-7.5-3.3638-7.5-7.5s3.3638-7.5 7.5-7.5 7.5 3.3638 7.5 7.5v0.625c0 0.69-0.56 1.25-1.25 1.25s-1.25-0.56-1.25-1.25v-3.75c0-0.69125-0.55875-1.25-1.25-1.25-0.55125 0-1.0062 0.3625-1.1725 0.86-0.725-0.53375-1.6112-0.86-2.5775-0.86-2.4125 0-4.375 1.9625-4.375 4.375s1.9625 4.375 4.375 4.375c1.3062 0 2.4688-0.5875 3.27-1.4988 0.685 0.90375 1.76 1.4988 2.98 1.4988 2.0675 0 3.75-1.6825 3.75-3.75v-0.625c0-5.5138-4.4862-10-10-10zm0 11.875c-1.0338 0-1.875-0.84125-1.875-1.875s0.84125-1.875 1.875-1.875 1.875 0.84125 1.875 1.875-0.84125 1.875-1.875 1.875z" fill="#4271ae" stroke-width="1.25"/>
</svg>

Before

Width:  |  Height:  |  Size: 947 B

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24" height="24" version="1.2" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path d="m22.803 11.373c-0.0913-0.1309-2.2682-3.2384-5.2724-5.3626-1.5576-1.1033-3.5222-1.7105-5.5309-1.7105-2.0075 0-3.9721 0.60721-5.5331 1.7105-3.0041 2.1241-5.1789 5.2317-5.2702 5.3626-0.2618 0.3773-0.2618 0.87781 0 1.2551 0.091301 0.1309 2.266 3.2384 5.2702 5.3626 1.5609 1.1022 3.5255 1.7094 5.5331 1.7094 2.0086 0 3.9732-0.60721 5.5309-1.7105 3.0041-2.1241 5.1811-5.2317 5.2724-5.3626 0.2629-0.3762 0.2629-0.87781 0-1.254zm-10.803 4.4771c-2.1274 0-3.85-1.727-3.85-3.85 0-2.1274 1.7226-3.85 3.85-3.85 2.123 0 3.85 1.7226 3.85 3.85 0 2.123-1.727 3.85-3.85 3.85zm2.2-3.85c0 1.2122-0.98781 2.2-2.2 2.2-1.2155 0-2.2-0.98781-2.2-2.2 0-1.2155 0.98451-2.2 2.2-2.2 1.2122 0 2.2 0.98451 2.2 2.2z" fill="#4271ae" stroke-width="1.1"/>
</svg>

After

Width:  |  Height:  |  Size: 875 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 167 KiB

View File

@@ -2,14 +2,47 @@
<html>
<body>
<h2>Release Notes for 2.2 Beta 1</h2>
<p><i>Released on 11 November 2023</i></p>
<h2>Release Notes for 2.2</h2>
<p><i>Released on 17 December 2023</i></p>
<p>This is a beta release of the next release version, and is intended for testing purposes. Please
be careful when using this version on live writing projects, and make sure you take frequent
backups.</p>
<p>Please check the changelog for an overview of changes. The full release notes will be added to
the final release.</p>
<p>This release comes with a number of new features. These are some highlights.</p>
<p>In addition to the common Markdown style formatting for bold, italic and strike through, a set
of new shortcodes have been added. The shortcodes are far more flexible than the Markdown style
syntax, and can be used for more complex formatting cases. Like when you need to add multiple,
overlapping formats, or add emphasis to just a part of a word. The shortcodes also allow for
underline, subscript and superscript, which the Markdown syntax does not. The new formats are
available in the "Format" menu, and in a new toolbar in the editor that can be enabled by clicking
the three dots in the top–left corner. The shortcode format was chosen because it can later be
extended to include other requested features as well. Please have a look at the documentation for
more details about the new shortcodes.</p>
<p>The Tags and References system has been improved. The tags themselves are no longer case
sensitive when you use them in references, but they are still displayed as you typed them in the
tag definition when they are displayed in the user interface. Starting to type the '@' symbol in
the text editor, on a new line, will now open an auto-completer menu which will display available
options. It may not display all of your tags if you have a lot of them, but starting to type more
characters will filter the list down further.</p>
<p>You can now automatically create a note file for a new tag that you have added to a reference
list in a document, but is not yet defined in a project note. So, for instance, if you come up with
a new character while writing, and add a new tag to your '@char' references, you can right-click
the new tag and create a new note for that entry directly. In addition, it is now also possible to
right-click a heading in an open document and set the item label in the project tree to match the
heading.</p>
<p>In addition to the changes in the editor, the "References" panel below the document viewer has
also been completely redesigned. It now shows all the references to the document you are viewing as
a list, with a lot more details than before. In addition, tabs in the panel will appear to show all
the tags you have defined in your notes, sorted as one tab per category. Like for instance
Characters, Locations, Objects, etc. You can also give each note a short description comment on the
same format as the summary comments for chapters and scenes. The short description comment can be
added from the "Insert" menu under "Special Comments".</p>
<p>The last major change in this release is the new multi-select feature in the project tree. You
can now select multiple documents and folders using the mouse while pressing 'Ctrl' or 'Shift'. By
right-clicking the selected items, you can perform a limited set of operations on all of them, like
changing active status, and the status or importance labels. You can also drag and drop multiple
items under the condition that all the selected items are in the same folder, at the same level.
This restriction is in place due to limitations in the framework novelWriter is based on. But this
should help in cases where multiple documents need to be moved in and out of folders or between
folders. Note that adding the multi-select feature meant that the undo feature of the project tree
had to be removed. It may be added back later.</p>
<p><i>See also the <a href="https://github.com/vkbo/novelWriter/releases">Releases</a> page.</i></p>

View File

@@ -3,7 +3,7 @@ novelWriter – Common Functions
==============================
File History:
Created: 2019-05-12 [0.1]
Created: 2019-05-12 [0.1.0]
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -33,9 +33,11 @@ from typing import Any, Literal
from pathlib import Path
from datetime import datetime
from configparser import ConfigParser
from urllib.parse import urljoin
from urllib.request import pathname2url
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QWidget, qApp
from PyQt5.QtGui import QDesktopServices
from PyQt5.QtCore import QCoreApplication, QUrl
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
from novelwriter.error import logException
@@ -487,16 +489,22 @@ def makeFileNameSafe(text: str) -> str:
return "".join(c for c in text if c.isalnum() or c in allowed)
# =============================================================================================== #
# Other Functions
# =============================================================================================== #
def getFileSize(path: Path) -> int:
"""Return the size of a file."""
try:
return path.stat().st_size
except Exception:
return -1
def getGuiItem(objName: str) -> QWidget | None:
"""Returns a QtWidget based on its objectName."""
for qWidget in qApp.topLevelWidgets():
if qWidget.objectName() == objName:
return qWidget
return None
def openExternalPath(path: Path) -> bool:
"""Open a path by passing it to the desktop environment."""
if Path(path).exists():
QDesktopServices.openUrl(
QUrl(urljoin("file:", pathname2url(str(path))))
)
return True
return False
# =============================================================================================== #

View File

@@ -148,6 +148,7 @@ class Config:
self.autoScroll = False # Typewriter-like scrolling
self.autoScrollPos = 30 # Start point for typewriter-like scrolling
self.scrollPastEnd = True # Scroll past end of document, and centre cursor
self.wordCountTimer = 5.0 # Interval for word count update in seconds
self.incNotesWCount = True # The status bar word count includes notes
@@ -178,9 +179,9 @@ class Config:
self.spellLanguage = "en"
# State
self.showRefPanel = True # The reference panel for the viewer is visible
self.showViewerPanel = True # The panel for the viewer is visible
self.showEditToolBar = False # The document editor toolbar visibility
self.useShortcodes = False # Use shorcodes for basic formatting
self.useShortcodes = False # Use shortcodes for basic formatting
self.viewComments = True # Comments are shown in the viewer
self.viewSynopsis = True # Synopsis is shown in the viewer
@@ -224,6 +225,8 @@ class Config:
# Other System Info
self.hostName = QSysInfo.machineHostName()
self.kernelVer = QSysInfo.kernelVersion()
self.isDebug = False # True if running in debug mode
self.memInfo = False # True if displaying mem info in status bar
# Packages
self.hasEnchant = False # The pyenchant package
@@ -391,8 +394,7 @@ class Config:
return self._appPath / "assets"
def lastPath(self) -> Path:
"""Return the last path used by the user, but ensure it exists.
"""
"""Return the last path used by the user, if it exists."""
if isinstance(self._lastPath, Path):
if self._lastPath.is_dir():
return self._lastPath
@@ -400,9 +402,8 @@ class Config:
def backupPath(self) -> Path:
"""Return the backup path."""
if isinstance(self._backupPath, Path):
if self._backupPath.is_dir():
return self._backupPath
if isinstance(self._backupPath, Path) and self._backupPath.is_dir():
return self._backupPath
return self._backPath
def errorText(self) -> str:
@@ -577,6 +578,7 @@ class Config:
self.doReplaceDots = conf.rdBool(sec, "repdots", self.doReplaceDots)
self.autoScroll = conf.rdBool(sec, "autoscroll", self.autoScroll)
self.autoScrollPos = conf.rdInt(sec, "autoscrollpos", self.autoScrollPos)
self.scrollPastEnd = conf.rdBool(sec, "scrollpastend", self.scrollPastEnd)
self.fmtSQuoteOpen = conf.rdStr(sec, "fmtsquoteopen", self.fmtSQuoteOpen)
self.fmtSQuoteClose = conf.rdStr(sec, "fmtsquoteclose", self.fmtSQuoteClose)
self.fmtDQuoteOpen = conf.rdStr(sec, "fmtdquoteopen", self.fmtDQuoteOpen)
@@ -600,7 +602,7 @@ class Config:
# State
sec = "State"
self.showRefPanel = conf.rdBool(sec, "showrefpanel", self.showRefPanel)
self.showViewerPanel = conf.rdBool(sec, "showviewerpanel", self.showViewerPanel)
self.showEditToolBar = conf.rdBool(sec, "showedittoolbar", self.showEditToolBar)
self.useShortcodes = conf.rdBool(sec, "useshortcodes", self.useShortcodes)
self.viewComments = conf.rdBool(sec, "viewcomments", self.viewComments)
@@ -612,24 +614,6 @@ class Config:
self.searchNextFile = conf.rdBool(sec, "searchnextfile", self.searchNextFile)
self.searchMatchCap = conf.rdBool(sec, "searchmatchcap", self.searchMatchCap)
# Deprecated Settings or Locations as of 2.0
# ToDo: These will be loaded for a few minor releases until the users have converted them
self.guiFont = conf.rdStr("Main", "guifont", self.guiFont)
self.guiFontSize = conf.rdInt("Main", "guifontsize", self.guiFontSize)
self.guiLocale = conf.rdStr("Main", "guilang", self.guiLocale)
self._backupPath = conf.rdPath("Backup", "backuppath", self._backupPath)
self.backupOnClose = conf.rdBool("Backup", "backuponclose", self.backupOnClose)
self.askBeforeBackup = conf.rdBool("Backup", "askbeforebackup", self.askBeforeBackup)
fmtSingleQuotes = conf.rdStrList(sec, "fmtsinglequote", [])
fmtDoubleQuotes = conf.rdStrList(sec, "fmtdoublequote", [])
if isinstance(fmtSingleQuotes, list) and len(fmtSingleQuotes) == 2:
self.fmtSQuoteOpen = fmtSingleQuotes[0]
self.fmtSQuoteClose = fmtSingleQuotes[1]
if isinstance(fmtDoubleQuotes, list) and len(fmtDoubleQuotes) == 2:
self.fmtDQuoteOpen = fmtDoubleQuotes[0]
self.fmtDQuoteClose = fmtDoubleQuotes[1]
# Check Values
# ============
@@ -701,6 +685,7 @@ class Config:
"repdots": str(self.doReplaceDots),
"autoscroll": str(self.autoScroll),
"autoscrollpos": str(self.autoScrollPos),
"scrollpastend": str(self.scrollPastEnd),
"fmtsquoteopen": str(self.fmtSQuoteOpen),
"fmtsquoteclose": str(self.fmtSQuoteClose),
"fmtdquoteopen": str(self.fmtDQuoteOpen),
@@ -724,7 +709,7 @@ class Config:
}
conf["State"] = {
"showrefpanel": str(self.showRefPanel),
"showviewerpanel": str(self.showViewerPanel),
"showedittoolbar": str(self.showEditToolBar),
"useshortcodes": str(self.useShortcodes),
"viewcomments": str(self.viewComments),

View File

@@ -50,6 +50,9 @@ class nwConst:
URL_HELP = "https://github.com/vkbo/novelWriter/discussions"
URL_RELEASE = "https://github.com/vkbo/novelWriter/releases/latest"
# Requests
USER_AGENT = "Mozilla/5.0 (compatible; novelWriter (Python))"
# Gui Settings
STATUS_MSG_TIMEOUT = 15000 # milliseconds
@@ -153,6 +156,21 @@ class nwKeyWords:
# END Class nwKeyWords
class nwLists:
USER_CLASSES = [
nwItemClass.CHARACTER,
nwItemClass.PLOT,
nwItemClass.WORLD,
nwItemClass.TIMELINE,
nwItemClass.OBJECT,
nwItemClass.ENTITY,
nwItemClass.CUSTOM,
]
# END Class nwLists
class nwLabels:
CLASS_NAME = {
@@ -221,8 +239,8 @@ class nwLabels:
nwOutline.FOCUS: QT_TRANSLATE_NOOP("Constant", "Focus"),
nwOutline.CHAR: KEY_NAME[nwKeyWords.CHAR_KEY],
nwOutline.PLOT: KEY_NAME[nwKeyWords.PLOT_KEY],
nwOutline.TIME: KEY_NAME[nwKeyWords.TIME_KEY],
nwOutline.WORLD: KEY_NAME[nwKeyWords.WORLD_KEY],
nwOutline.TIME: KEY_NAME[nwKeyWords.TIME_KEY],
nwOutline.OBJECT: KEY_NAME[nwKeyWords.OBJECT_KEY],
nwOutline.ENTITY: KEY_NAME[nwKeyWords.ENTITY_KEY],
nwOutline.CUSTOM: KEY_NAME[nwKeyWords.CUSTOM_KEY],
@@ -327,8 +345,7 @@ class nwQuotes:
class nwUnicode:
"""Supported unicode character constants and their HTML equivalents.
"""
"""Supported unicode character constants and their HTML equivalents."""
# Unicode Constants
# =================

View File

@@ -349,7 +349,7 @@ class BuildSettings:
def buildItemFilter(
self, project: NWProject, withRoots: bool = False
) -> dict[str, tuple[bool, FilterMode]]:
"""Return a dictionary of item handles with filter decissions
"""Return a dictionary of item handles with filter decisions
applied.
"""
result: dict[str, tuple[bool, FilterMode]] = {}

View File

@@ -6,6 +6,7 @@ File History:
Created: 2022-10-02 [2.0rc1] DocMerger
Created: 2022-10-11 [2.0rc1] DocSplitter
Created: 2022-11-03 [2.0rc2] ProjectBuilder
Created: 2023-07-20 [2.1b1] DocDuplicator
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -406,6 +407,7 @@ class ProjectBuilder:
chSynop = self.tr("Summary of the chapter.")
scSynop = self.tr("Summary of the scene.")
bfNote = self.tr("A short description.")
# Create chapters
if numChapters > 0:
@@ -446,7 +448,11 @@ class ProjectBuilder:
aHandle = project.newFile(noteTitles[newRoot], rHandle)
ntTag = simplified(noteTitles[newRoot]).replace(" ", "")
aDoc = project.storage.getDocument(aHandle)
aDoc.writeDocument(f"# {noteTitles[newRoot]}\n\n@tag: {ntTag}\n\n")
aDoc.writeDocument(
f"# {noteTitles[newRoot]}\n\n"
f"@tag: {ntTag}\n\n"
f"% Short: {bfNote}\n\n"
)
# Also add the archive and trash folders
project.newRoot(nwItemClass.ARCHIVE)

View File

@@ -35,7 +35,8 @@ from time import time
from typing import TYPE_CHECKING, ItemsView, Iterable, Iterator
from pathlib import Path
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
from novelwriter import SHARED
from novelwriter.enum import nwComment, nwItemClass, nwItemType, nwItemLayout
from novelwriter.error import logException
from novelwriter.common import checkInt, isHandle, isItemClass, isTitleTag, jsonEncode
from novelwriter.constants import nwFiles, nwKeyWords, nwRegEx, nwUnicode, nwHeaders
@@ -112,6 +113,7 @@ class NWIndex:
self._itemIndex.clear()
self._indexChange = 0.0
self._rootChange = {}
SHARED.indexSignalProxy({"event": "clearIndex"})
return
def rebuildIndex(self) -> None:
@@ -121,16 +123,22 @@ class NWIndex:
if nwItem.isFileType():
tHandle = nwItem.itemHandle
theDoc = self._project.storage.getDocument(tHandle)
self.scanText(tHandle, theDoc.readDocument() or "")
self.scanText(tHandle, theDoc.readDocument() or "", blockSignal=True)
self._indexBroken = False
SHARED.indexSignalProxy({"event": "buildIndex"})
return
def deleteHandle(self, tHandle: str) -> None:
"""Delete all entries of a given document handle."""
logger.debug("Removing item '%s' from the index", tHandle)
for tTag in self._itemIndex.allItemTags(tHandle):
delTags = self._itemIndex.allItemTags(tHandle)
for tTag in delTags:
del self._tagsIndex[tTag]
del self._itemIndex[tHandle]
SHARED.indexSignalProxy({
"event": "updateTags",
"deleted": delTags,
})
return
def reIndexHandle(self, tHandle: str | None) -> bool:
@@ -138,14 +146,12 @@ class NWIndex:
moved from the archive or trash folders back into the active
project.
"""
if tHandle is None or not self._project.tree.checkType(tHandle, nwItemType.FILE):
return False
logger.debug("Re-indexing item '%s'", tHandle)
theDoc = self._project.storage.getDocument(tHandle)
self.scanText(tHandle, theDoc.readDocument() or "")
return True
if tHandle and self._project.tree.checkType(tHandle, nwItemType.FILE):
logger.debug("Re-indexing item '%s'", tHandle)
theDoc = self._project.storage.getDocument(tHandle)
self.scanText(tHandle, theDoc.readDocument() or "")
return True
return False
def indexChangedSince(self, checkTime: int | float) -> bool:
"""Check if the index has changed since a given time."""
@@ -200,6 +206,7 @@ class NWIndex:
self.reIndexHandle(fHandle)
self._indexChange = time()
SHARED.indexSignalProxy({"event": "buildIndex"})
logger.debug("Index loaded in %.3f ms", (time() - tStart)*1000)
@@ -238,7 +245,7 @@ class NWIndex:
# Index Building
##
def scanText(self, tHandle: str, text: str) -> bool:
def scanText(self, tHandle: str, text: str, blockSignal: bool = False) -> bool:
"""Scan a piece of text associated with a handle. This will
update the indices accordingly. This function takes the handle
and text as separate inputs as we want to primarily scan the
@@ -282,6 +289,11 @@ class NWIndex:
nowTime = time()
self._indexChange = nowTime
self._rootChange[tItem.itemRoot] = nowTime
if not blockSignal:
SHARED.indexSignalProxy({
"event": "scanText",
"handle": tHandle,
})
return True
@@ -289,7 +301,7 @@ class NWIndex:
# Internal Indexer Helpers
##
def _scanActive(self, tHandle: str, nwItem: NWItem, text: str, tags: dict) -> None:
def _scanActive(self, tHandle: str, nwItem: NWItem, text: str, tags: dict[str, bool]) -> None:
"""Scan an active document for meta data."""
nTitle = 0 # Line Number of the previous title
cTitle = TT_NONE # Tag of the current title
@@ -326,14 +338,9 @@ class NWIndex:
elif line.startswith("%"):
if cTitle != TT_NONE:
toCheck = line[1:].lstrip()
synTag = toCheck[:9].lower()
tLen = len(line)
cLen = len(toCheck)
cOff = tLen - cLen
if synTag == "synopsis:":
sText = line[cOff+9:].strip()
self._itemIndex.setHeadingSynopsis(tHandle, cTitle, sText)
cStyle, cText, _ = processComment(line)
if cStyle in (nwComment.SYNOPSIS, nwComment.SHORT):
self._itemIndex.setHeadingSynopsis(tHandle, cTitle, cText)
# Count words for remaining text after last heading
if pTitle != TT_NONE:
@@ -346,9 +353,21 @@ class NWIndex:
# Prune no longer used tags
for tTag, isActive in tags.items():
if not isActive:
logger.debug("Deleting removed tag '%s'", tTag)
updated = []
deleted = []
if isActive:
logger.debug("Added/updated tag '%s'", tTag)
updated.append(tTag)
else:
logger.debug("Removed tag '%s'", tTag)
del self._tagsIndex[tTag]
deleted.append(tTag)
if updated or deleted:
SHARED.indexSignalProxy({
"event": "updateTags",
"updated": updated,
"deleted": deleted,
})
return
@@ -385,7 +404,7 @@ class NWIndex:
return
def _indexKeyword(self, tHandle: str, line: str, sTitle: str,
itemClass: nwItemClass, tags: dict) -> None:
itemClass: nwItemClass, tags: dict[str, bool]) -> None:
"""Validate and save the information about a reference to a tag
in another file, or the setting of a tag in the file. A record
of active tags is updated so that no longer used tags can be
@@ -532,7 +551,7 @@ class NWIndex:
return 0
def getTableOfContents(
self, rHandle: str, maxDepth: int, skipExcl: bool = True
self, rHandle: str | None, maxDepth: int, skipExcl: bool = True
) -> list[tuple[str, int, str, int]]:
"""Generate a table of contents up to a maximum depth."""
tOrder = []
@@ -596,10 +615,8 @@ class NWIndex:
return tRefs
def getBackReferenceList(self, tHandle: str) -> dict[str, str]:
"""Build a list of files referring back to our file, specified
by tHandle.
"""
def getBackReferenceList(self, tHandle: str) -> dict[str, tuple[str, IndexHeading]]:
"""Build a dict of files referring back to our file."""
if tHandle is None or tHandle not in self._itemIndex:
return {}
@@ -611,20 +628,43 @@ class NWIndex:
for aHandle, sTitle, hItem in self._itemIndex.iterAllHeaders():
for aTag in hItem.references:
if aTag in tTags and aHandle not in tRefs:
tRefs[aHandle] = sTitle
tRefs[aHandle] = (sTitle, hItem)
return tRefs
def getTagSource(self, tagKey: str) -> tuple[str, str]:
def getTagSource(self, tagKey: str) -> tuple[str | None, str]:
"""Return the source location of a given tag."""
tHandle = self._tagsIndex.tagHandle(tagKey)
sTitle = self._tagsIndex.tagHeading(tagKey)
return tHandle, sTitle
def getTags(self, itemClass: nwItemClass) -> list[str]:
def getDocumentTags(self, tHandle: str | None) -> list[str]:
"""Return all tags used by a specific document."""
return self._itemIndex.allItemTags(tHandle) if tHandle else []
def getClassTags(self, itemClass: nwItemClass) -> list[str]:
"""Return all tags based on itemClass."""
return self._tagsIndex.filterTagNames(itemClass.name)
def getTagsData(self) -> Iterator[tuple[str, str, str, IndexItem | None, IndexHeading | None]]:
"""Return all known tags."""
for tag, data in self._tagsIndex.items():
iItem = self._itemIndex[data.get("handle")]
hItem = None if iItem is None else iItem[data.get("heading")]
yield tag, data.get("name", ""), data.get("class", ""), iItem, hItem
return
def getSingleTag(self, tagKey: str) -> tuple[str, str, IndexItem | None, IndexHeading | None]:
"""Return tag data for a specific tag."""
tName = self._tagsIndex.tagName(tagKey)
tClass = self._tagsIndex.tagClass(tagKey)
tHandle = self._tagsIndex.tagHandle(tagKey)
tHeading = self._tagsIndex.tagHeading(tagKey)
if tName and tClass and tHandle and tHeading:
iItem = self._itemIndex[tHandle]
return tName, tClass, iItem, None if iItem is None else iItem[tHeading]
return "", "", None, None
# END Class NWIndex
@@ -643,7 +683,7 @@ class TagsIndex:
__slots__ = ("_tags")
def __init__(self) -> None:
self._tags: dict[str, dict] = {}
self._tags: dict[str, dict[str, str]] = {}
return
def __contains__(self, tagKey: str) -> bool:
@@ -665,6 +705,10 @@ class TagsIndex:
self._tags = {}
return
def items(self) -> ItemsView:
"""Return a dictionary view of all tags."""
return self._tags.items()
def add(self, tagKey: str, tHandle: str, sTitle: str, itemClass: nwItemClass) -> None:
"""Add a key to the index and set all values."""
self._tags[tagKey.lower()] = {
@@ -676,7 +720,7 @@ class TagsIndex:
"""Get the display name of a given tag."""
return self._tags.get(tagKey.lower(), {}).get("name", "")
def tagHandle(self, tagKey: str) -> str:
def tagHandle(self, tagKey: str) -> str | None:
"""Get the handle of a given tag."""
return self._tags.get(tagKey.lower(), {}).get("handle", None)
@@ -937,6 +981,11 @@ class IndexItem:
# Properties
##
@property
def handle(self) -> str:
"""Return the item handle of the index item."""
return self._handle
@property
def item(self) -> NWItem:
"""Return the project item of the index item."""
@@ -1215,9 +1264,26 @@ class IndexHeading:
# =============================================================================================== #
# Simple Word Counter
# Text Processing Functions
# =============================================================================================== #
CLASSIFIERS = {
"short": nwComment.SHORT,
"synopsis": nwComment.SYNOPSIS,
}
def processComment(text: str) -> tuple[nwComment, str, int]:
"""Extract comment style and text. Should only be called on text
starting with a %.
"""
check = text[1:].lstrip()
classifier, _, content = check.partition(":")
if content and (clean := classifier.strip().lower()) in CLASSIFIERS:
return CLASSIFIERS[clean], content.strip(), text.find(":") + 1
return nwComment.PLAIN, check, 0
def countWords(text: str) -> tuple[int, int, int]:
"""Count words in a piece of text, skipping special syntax and
comments.

View File

@@ -3,7 +3,7 @@ novelWriter – Project Item Class
================================
File History:
Created: 2018-10-27 [0.0.1]
Created: 2018-10-27 [0.0.1] NWItem
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen

View File

@@ -3,8 +3,8 @@ novelWriter – Project Options Cache
===================================
File History:
Created: 2019-10-21 [0.3.1]
Rewritten: 2020-02-19 [0.4.5]
Created: 2019-10-21 [0.3.1] OptionState
Rewritten: 2020-02-19 [0.4.5] OptionState
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -69,6 +69,9 @@ VALID_MAP = {
"GuiManuscriptBuild": {
"winWidth", "winHeight", "fmtWidth", "sumWidth",
},
"GuiDocViewerPanel": {
"colWidths",
}
}

View File

@@ -3,7 +3,7 @@ novelWriter – Project Wrapper
=============================
File History:
Created: 2018-09-29 [0.0.1]
Created: 2018-09-29 [0.0.1] NWProject
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -45,7 +45,7 @@ from novelwriter.core.sessions import NWSessionLog
from novelwriter.core.projectxml import ProjectXMLReader, ProjectXMLWriter, XMLReadState
from novelwriter.core.projectdata import NWProjectData
from novelwriter.common import (
checkStringNone, formatInt, formatTimeStamp, hexToInt, makeFileNameSafe, minmax
checkStringNone, formatInt, formatTimeStamp, getFileSize, hexToInt, makeFileNameSafe, minmax
)
if TYPE_CHECKING: # pragma: no cover
@@ -80,7 +80,7 @@ class NWProject:
return
def __del__(self): # pragma: no cover
def __del__(self) -> None: # pragma: no cover
logger.debug("Delete: NWProject")
return
@@ -420,7 +420,7 @@ class NWProject:
timeStamp = formatTimeStamp(time(), fileSafe=True)
archName = baseDir / f"{cleanName} {timeStamp}.zip"
if self._storage.zipIt(archName, compression=2):
size = formatInt(archName.stat().st_size)
size = formatInt(getFileSize(archName))
if doNotify:
SHARED.info(
self.tr("Created a backup of your project of size {0}B.").format(size),

View File

@@ -3,7 +3,7 @@ novelWriter – Project Data Class
================================
File History:
Created: 2022-10-30 [2.0rc2]
Created: 2022-10-30 [2.0rc2] NWProjectData
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -170,7 +170,7 @@ class NWProjectData:
@property
def autoReplace(self) -> dict[str, str]:
"""Return the autoreplace dictionary."""
"""Return the auto-replace dictionary."""
return self._autoReplace
@property

View File

@@ -3,7 +3,7 @@ novelWriter – Project Session Log Class
=======================================
File History:
Created: 2023-06-11 [2.1b1]
Created: 2023-06-11 [2.1b1] NWSessionLog
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen

View File

@@ -3,7 +3,8 @@ novelWriter – Spell Check Classes
=================================
File History:
Created: 2019-06-11 [0.1.5]
Created: 2019-06-11 [0.1.5] NWSpellEnchant
Created: 2023-06-13 [2.1b1] UserDictionary
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -56,7 +57,7 @@ class NWSpellEnchant:
logger.debug("Ready: NWSpellEnchant")
return
def __del__(self): # pragma: no cover
def __del__(self) -> None: # pragma: no cover
logger.debug("Delete: NWSpellEnchant")
return

View File

@@ -3,8 +3,8 @@ novelWriter – Project Item Status Class
=======================================
File History:
Created: 2019-05-19 [0.1.3]
Rewritten: 2022-04-05 [2.0b1]
Created: 2019-05-19 [0.1.3] NWStatus
Rewritten: 2022-04-05 [2.0b1] NWStatus
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen

View File

@@ -3,7 +3,7 @@ novelWriter – HTML Text Converter
=================================
File History:
Created: 2019-05-07 [0.0.1]
Created: 2019-05-07 [0.0.1] ToHtml
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -287,7 +287,10 @@ class ToHtml(Tokenizer):
para.append(stripEscape(tTemp.rstrip()))
elif tType == self.T_SYNOPSIS and self._doSynopsis:
lines.append(self._formatSynopsis(tText))
lines.append(self._formatSynopsis(tText, True))
elif tType == self.T_SHORT and self._doSynopsis:
lines.append(self._formatSynopsis(tText, False))
elif tType == self.T_COMMENT and self._doComments:
lines.append(self._formatComments(tText))
@@ -454,9 +457,12 @@ class ToHtml(Tokenizer):
# Internal Functions
##
def _formatSynopsis(self, text: str) -> str:
def _formatSynopsis(self, text: str, synopsis: bool) -> str:
"""Apply HTML formatting to synopsis."""
sSynop = self._localLookup("Synopsis")
if synopsis:
sSynop = self._localLookup("Synopsis")
else:
sSynop = self._localLookup("Short Description")
if self._genMode == self.M_PREVIEW:
return f"<p class='comment'><span class='synopsis'>{sSynop}:</span> {text}</p>\n"
else:

View File

@@ -34,8 +34,9 @@ from pathlib import Path
from functools import partial
from PyQt5.QtCore import QCoreApplication, QRegularExpression
from novelwriter.core.index import processComment
from novelwriter.enum import nwItemLayout
from novelwriter.enum import nwComment, nwItemLayout
from novelwriter.common import formatTimeStamp, numberToRoman, checkInt
from novelwriter.constants import nwHeadFmt, nwRegEx, nwShortcode, nwUnicode
from novelwriter.core.project import NWProject
@@ -79,17 +80,18 @@ class Tokenizer(ABC):
# Block Type
T_EMPTY = 1 # Empty line (new paragraph)
T_SYNOPSIS = 2 # Synopsis comment
T_COMMENT = 3 # Comment line
T_KEYWORD = 4 # Command line
T_TITLE = 5 # Title
T_UNNUM = 6 # Unnumbered
T_HEAD1 = 7 # Header 1
T_HEAD2 = 8 # Header 2
T_HEAD3 = 9 # Header 3
T_HEAD4 = 10 # Header 4
T_TEXT = 11 # Text line
T_SEP = 12 # Scene separator
T_SKIP = 13 # Paragraph break
T_SHORT = 3 # Short description comment
T_COMMENT = 4 # Comment line
T_KEYWORD = 5 # Command line
T_TITLE = 6 # Title
T_UNNUM = 7 # Unnumbered
T_HEAD1 = 8 # Header 1
T_HEAD2 = 9 # Header 2
T_HEAD3 = 10 # Header 3
T_HEAD4 = 11 # Header 4
T_TEXT = 12 # Text line
T_SEP = 13 # Scene separator
T_SKIP = 14 # Paragraph break
# Block Style
A_NONE = 0x0000 # No special style
@@ -216,7 +218,7 @@ class Tokenizer(ABC):
return
def setChapterFormat(self, hFormat: str) -> None:
"""Set the chapert format pattern."""
"""Set the chapter format pattern."""
self._fmtChapter = hFormat.strip()
return
@@ -435,8 +437,8 @@ class Tokenizer(ABC):
if aLine[0] == "[":
# Parse special formatting line
# This must be a separate if statement, as it may not
# reach a continue statement and must thefore proceed to
# check other formats.
# reach a continue statement and must therefore proceed
# to check other formats.
if sLine in ("[newpage]", "[new page]"):
breakNext = True
@@ -461,17 +463,22 @@ class Tokenizer(ABC):
continue
if aLine[0] == "%":
cLine = aLine[1:].lstrip()
synTag = cLine[:9].lower()
if synTag == "synopsis:":
cStyle, cText, _ = processComment(aLine)
if cStyle == nwComment.SYNOPSIS:
self._tokens.append((
self.T_SYNOPSIS, nHead, cLine[9:].strip(), None, sAlign
self.T_SYNOPSIS, nHead, cText, None, sAlign
))
if self._doSynopsis and self._keepMarkdown:
tmpMarkdown.append("%s\n" % aLine)
elif cStyle == nwComment.SHORT:
self._tokens.append((
self.T_SHORT, nHead, cText, None, sAlign
))
if self._doSynopsis and self._keepMarkdown:
tmpMarkdown.append("%s\n" % aLine)
else:
self._tokens.append((
self.T_COMMENT, nHead, aLine[1:].strip(), None, sAlign
self.T_COMMENT, nHead, cText, None, sAlign
))
if self._doComments and self._keepMarkdown:
tmpMarkdown.append("%s\n" % aLine)

View File

@@ -3,7 +3,7 @@ novelWriter – Markdown Text Converter
=====================================
File History:
Created: 2021-02-06 [1.2b1]
Created: 2021-02-06 [1.2b1] ToMarkdown
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -170,6 +170,10 @@ class ToMarkdown(Tokenizer):
label = self._localLookup("Synopsis")
lines.append(f"**{label}:** {tText}\n\n")
elif tType == self.T_SHORT and self._doSynopsis:
label = self._localLookup("Short Description")
lines.append(f"**{label}:** {tText}\n\n")
elif tType == self.T_COMMENT and self._doComments:
label = self._localLookup("Comment")
lines.append(f"**{label}:** {tText}\n\n")

View File

@@ -195,7 +195,7 @@ class ToOdt(Tokenizer):
# Setters
##
def setLanguage(self, language: str) -> None:
def setLanguage(self, language: str | None) -> None:
"""Set language for the document."""
if language:
langBits = language.split("_")
@@ -481,7 +481,11 @@ class ToOdt(Tokenizer):
pFmt.append(tFormat)
elif tType == self.T_SYNOPSIS and self._doSynopsis:
tTemp, fTemp = self._formatSynopsis(tText)
tTemp, fTemp = self._formatSynopsis(tText, True)
self._addTextPar("Text_20_Meta", oStyle, tTemp, tFmt=fTemp)
elif tType == self.T_SHORT and self._doSynopsis:
tTemp, fTemp = self._formatSynopsis(tText, False)
self._addTextPar("Text_20_Meta", oStyle, tTemp, tFmt=fTemp)
elif tType == self.T_COMMENT and self._doComments:
@@ -552,9 +556,12 @@ class ToOdt(Tokenizer):
# Internal Functions
##
def _formatSynopsis(self, text: str) -> tuple[str, list[tuple[int, int]]]:
def _formatSynopsis(self, text: str, synopsis: bool) -> tuple[str, list[tuple[int, int]]]:
"""Apply formatting to synopsis lines."""
name = self._localLookup("Synopsis")
if synopsis:
name = self._localLookup("Synopsis")
else:
name = self._localLookup("Short Description")
rTxt = f"{name}: {text}"
rFmt = [(0, self.FMT_B_B), (len(name) + 1, self.FMT_B_E)]
return rTxt, rFmt

View File

@@ -3,7 +3,7 @@ novelWriter – Project Tree Class
================================
File History:
Created: 2020-05-07 [0.4.5]
Created: 2020-05-07 [0.4.5] NWTree
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen

View File

@@ -3,7 +3,7 @@ novelWriter – GUI About Box
===========================
File History:
Created: 2020-05-21 [0.5.2]
Created: 2020-05-21 [0.5.2] GuiAbout
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -28,7 +28,7 @@ import novelwriter
from datetime import datetime
from PyQt5.QtGui import QCursor
from PyQt5.QtGui import QCloseEvent, QCursor
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import (
qApp, QDialog, QDialogButtonBox, QHBoxLayout, QLabel, QTabWidget,
@@ -44,7 +44,7 @@ logger = logging.getLogger(__name__)
class GuiAbout(QDialog):
def __init__(self, parent: QWidget):
def __init__(self, parent: QWidget) -> None:
super().__init__(parent=parent)
logger.debug("Create: GuiAbout")
@@ -101,7 +101,7 @@ class GuiAbout(QDialog):
# OK Button
self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok)
self.buttonBox.accepted.connect(self._doClose)
self.buttonBox.accepted.connect(self.close)
self.outerBox.addLayout(self.innerBox)
self.outerBox.addWidget(self.buttonBox)
@@ -111,13 +111,12 @@ class GuiAbout(QDialog):
return
def __del__(self): # pragma: no cover
def __del__(self) -> None: # pragma: no cover
logger.debug("Delete: GuiAbout")
return
def populateGUI(self):
"""Populate tabs with text.
"""
def populateGUI(self) -> None:
"""Populate tabs with text."""
qApp.setOverrideCursor(QCursor(Qt.WaitCursor))
self._setStyleSheet()
self._fillAboutPage()
@@ -127,19 +126,27 @@ class GuiAbout(QDialog):
qApp.restoreOverrideCursor()
return
def showReleaseNotes(self):
"""Show the release notes.
"""
def showReleaseNotes(self) -> None:
"""Show the release notes."""
self.tabBox.setCurrentWidget(self.pageNotes)
return
##
# Events
##
def closeEvent(self, event: QCloseEvent) -> None:
"""Capture the close event and perform cleanup."""
event.accept()
self.deleteLater()
return
##
# Internal Functions
##
def _fillAboutPage(self):
"""Generate the content for the About page.
"""
def _fillAboutPage(self) -> None:
"""Generate the content for the About page."""
aboutMsg = (
"<h2>{title1}</h2>"
"<p>{copy}</p>"
@@ -181,9 +188,8 @@ class GuiAbout(QDialog):
return
def _fillNotesPage(self):
"""Load the content for the Release Notes page.
"""
def _fillNotesPage(self) -> None:
"""Load the content for the Release Notes page."""
docPath = CONFIG.assetPath("text") / "release_notes.htm"
docText = readTextFile(docPath)
if docText:
@@ -192,9 +198,8 @@ class GuiAbout(QDialog):
self.pageNotes.setHtml("Error loading release notes text ...")
return
def _fillCreditsPage(self):
"""Load the content for the Credits page.
"""
def _fillCreditsPage(self) -> None:
"""Load the content for the Credits page."""
docPath = CONFIG.assetPath("text") / "credits_en.htm"
docText = readTextFile(docPath)
if docText:
@@ -203,9 +208,8 @@ class GuiAbout(QDialog):
self.pageCredits.setHtml("Error loading credits text ...")
return
def _fillLicensePage(self):
"""Load the content for the Licence page.
"""
def _fillLicensePage(self) -> None:
"""Load the content for the Licence page."""
docPath = CONFIG.assetPath("text") / "gplv3_en.htm"
docText = readTextFile(docPath)
if docText:
@@ -214,9 +218,8 @@ class GuiAbout(QDialog):
self.pageLicense.setHtml("Error loading licence text ...")
return
def _setStyleSheet(self):
"""Set stylesheet for all browser tabs
"""
def _setStyleSheet(self) -> None:
"""Set stylesheet for all browser tabs."""
styleSheet = (
"h1, h2, h3, h4 {{"
" color: rgb({hColR},{hColG},{hColB});"
@@ -242,8 +245,4 @@ class GuiAbout(QDialog):
return
def _doClose(self):
self.close()
return
# END Class GuiAbout

View File

@@ -3,8 +3,8 @@ novelWriter – GUI Doc Merge Dialog
==================================
File History:
Created: 2020-01-23 [0.4.3]
Rewritten: 2022-10-06 [2.0rc1]
Created: 2020-01-23 [0.4.3] GuiDocMerge
Rewritten: 2022-10-06 [2.0rc1] GuiDocMerge
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -26,7 +26,8 @@ from __future__ import annotations
import logging
from PyQt5.QtCore import Qt, QSize
from PyQt5.QtGui import QCloseEvent
from PyQt5.QtCore import Qt, QSize, pyqtSlot
from PyQt5.QtWidgets import (
QAbstractItemView, QDialog, QDialogButtonBox, QGridLayout, QLabel,
QListWidget, QListWidgetItem, QVBoxLayout, QWidget
@@ -108,13 +109,12 @@ class GuiDocMerge(QDialog):
return
def __del__(self): # pragma: no cover
def __del__(self) -> None: # pragma: no cover
logger.debug("Delete: GuiDocMerge")
return
def getData(self):
"""Return the user's choices.
"""
def getData(self) -> dict:
"""Return the user's choices."""
finalItems = []
for i in range(self.listBox.count()):
item = self.listBox.item(i)
@@ -127,12 +127,22 @@ class GuiDocMerge(QDialog):
return self._data
##
# Slots
# Events
##
def _resetList(self):
"""Reset the content of the list box to its original state.
"""
def closeEvent(self, event: QCloseEvent) -> None:
"""Capture the close event and perform cleanup."""
event.accept()
self.deleteLater()
return
##
# Private Slots
##
@pyqtSlot()
def _resetList(self) -> None:
"""Reset the content of the list box to its original state."""
logger.debug("Resetting list box content")
sHandle = self._data.get("sHandle", None)
itemList = self._data.get("origItems", [])
@@ -143,9 +153,8 @@ class GuiDocMerge(QDialog):
# Internal Functions
##
def _loadContent(self, sHandle, itemList):
"""Load content from a given list of items.
"""
def _loadContent(self, sHandle: str, itemList: list[str]) -> None:
"""Load content from a given list of items."""
self._data = {}
self._data["sHandle"] = sHandle
self._data["origItems"] = itemList

View File

@@ -3,8 +3,8 @@ novelWriter – GUI Doc Split Dialog
==================================
File History:
Created: 2020-02-01 [0.4.3]
Rewritten: 2022-10-12 [2.0rc1]
Created: 2020-02-01 [0.4.3] GuiDocSplit
Rewritten: 2022-10-12 [2.0rc1] GuiDocSplit
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -26,10 +26,11 @@ from __future__ import annotations
import logging
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QCloseEvent
from PyQt5.QtCore import Qt, pyqtSlot
from PyQt5.QtWidgets import (
QDialog, QVBoxLayout, QComboBox, QListWidget, QAbstractItemView,
QListWidgetItem, QDialogButtonBox, QLabel, QGridLayout
QAbstractItemView, QComboBox, QDialog, QDialogButtonBox, QGridLayout,
QLabel, QListWidget, QListWidgetItem, QVBoxLayout, QWidget
)
from novelwriter import CONFIG, SHARED
@@ -45,7 +46,7 @@ class GuiDocSplit(QDialog):
LEVEL_ROLE = Qt.ItemDataRole.UserRole + 1
LABEL_ROLE = Qt.ItemDataRole.UserRole + 2
def __init__(self, parent, sHandle):
def __init__(self, parent: QWidget, sHandle: str) -> None:
super().__init__(parent=parent)
logger.debug("Create: GuiDocSplit")
@@ -138,11 +139,11 @@ class GuiDocSplit(QDialog):
return
def __del__(self): # pragma: no cover
def __del__(self) -> None: # pragma: no cover
logger.debug("Delete: GuiDocSplit")
return
def getData(self):
def getData(self) -> tuple[dict, list]:
"""Return the user's choices. Also save the users options for
the next time the dialog is used.
"""
@@ -167,6 +168,7 @@ class GuiDocSplit(QDialog):
self._data["docHierarchy"] = docHierarchy
self._data["moveToTrash"] = moveToTrash
logger.debug("Saving State: GuiDocSplit")
pOptions = SHARED.project.options
pOptions.setValue("GuiDocSplit", "spLevel", spLevel)
pOptions.setValue("GuiDocSplit", "intoFolder", intoFolder)
@@ -175,12 +177,22 @@ class GuiDocSplit(QDialog):
return self._data, self._text
##
# Slots
# Events
##
def _reloadList(self):
"""Reload the content of the list box.
"""
def closeEvent(self, event: QCloseEvent) -> None:
"""Capture the close event and perform cleanup."""
event.accept()
self.deleteLater()
return
##
# Private Slots
##
@pyqtSlot()
def _reloadList(self) -> None:
"""Reload the content of the list box."""
sHandle = self._data.get("sHandle", None)
self._loadContent(sHandle)
return
@@ -189,9 +201,8 @@ class GuiDocSplit(QDialog):
# Internal Functions
##
def _loadContent(self, sHandle):
"""Load content from a given source item.
"""
def _loadContent(self, sHandle: str) -> None:
"""Load content from a given source item."""
self._data = {}
self._data["sHandle"] = sHandle

View File

@@ -3,7 +3,7 @@ novelWriter – Edit Label Dialog
===============================
File History:
Created: 2022-06-11 [2.0rc1]
Created: 2022-06-11 [2.0rc1] GuiEditLabel
This file is a part of novelWriter
Copyright 2018–2023, Veronica Berglyd Olsen
@@ -26,7 +26,8 @@ from __future__ import annotations
import logging
from PyQt5.QtWidgets import (
QDialog, QVBoxLayout, QLineEdit, QLabel, QDialogButtonBox, QHBoxLayout
QDialog, QDialogButtonBox, QHBoxLayout, QLabel, QLineEdit, QVBoxLayout,
QWidget
)
from novelwriter import CONFIG
@@ -36,9 +37,10 @@ logger = logging.getLogger(__name__)
class GuiEditLabel(QDialog):
def __init__(self, parent, text=""):
def __init__(self, parent: QWidget, text: str = "") -> None:
super().__init__(parent=parent)
logger.debug("Create: GuiEditLabel")
self.setObjectName("GuiEditLabel")
self.setWindowTitle(self.tr("Item Label"))
@@ -70,16 +72,26 @@ class GuiEditLabel(QDialog):
self.setLayout(self.outerBox)
logger.debug("Ready: GuiEditLabel")
return
def __del__(self) -> None: # pragma: no cover
logger.debug("Delete: GuiEditLabel")
return
@property
def itemLabel(self):
def itemLabel(self) -> str:
return self.labelValue.text()
@classmethod
def getLabel(cls, parent, text):
def getLabel(cls, parent: QWidget, text: str) -> tuple[str, bool]:
"""Pop the dialog and return the result."""
cls = GuiEditLabel(parent, text=text)
cls.exec_()
return cls.itemLabel, cls.result() == QDialog.Accepted
label = cls.itemLabel
accepted = cls.result() == QDialog.Accepted
cls.deleteLater()
return label, accepted
# END Class GuiEditLabel

Some files were not shown because too many files have changed in this diff Show More