Compare commits

...

873 Commits
v1.3 ... v2.0

Author SHA1 Message Date
Veronica Berglyd Olsen
a51f0db6fa Release 2.0 (#1261) 2022-11-28 17:27:38 +01:00
Veronica Berglyd Olsen
09eeb28257 Change the release data to today 2022-11-28 17:25:26 +01:00
Veronica Berglyd Olsen
956172af0c Make a minor change to the release notes 2022-11-28 17:23:24 +01:00
Veronica Berglyd Olsen
35ec8e0f12 Update release notes 2022-11-28 17:12:48 +01:00
Veronica Berglyd Olsen
8390615489 Bumped version and updated changelog 2022-11-28 10:59:41 +01:00
Veronica Berglyd Olsen
df499a9776 Update translations (#1254) 2022-11-28 10:35:38 +01:00
Veronica Berglyd Olsen
e027c4fd4c Update partial translations 2022-11-28 10:33:13 +01:00
Veronica Berglyd Olsen
0dd9f49856 Update completed translations 2022-11-27 17:15:04 +01:00
Veronica Berglyd Olsen
8853c73749 Remove some no longer needed strings from translations 2022-11-27 17:12:18 +01:00
Veronica Berglyd Olsen
9cb97f6a15 Merge branch 'main' into i18n 2022-11-27 17:11:08 +01:00
Veronica Berglyd Olsen
f69641c0f8 Simplify author setting (#1258) 2022-11-27 17:10:29 +01:00
Veronica Berglyd Olsen
1ac6e48c23 Update file format spec 2022-11-27 17:00:36 +01:00
Veronica Berglyd Olsen
a3ad90f419 Update tests 2022-11-27 16:57:11 +01:00
Veronica Berglyd Olsen
e5f04e5234 Reduce number of author entries in project to one 2022-11-27 16:55:54 +01:00
Veronica Berglyd Olsen
9d97e26fc1 Clean up the changelog a bit 2022-11-25 23:10:36 +01:00
Veronica Berglyd Olsen
e84b8d4d1d Fix versions in module docstrings, more 2022-11-25 22:57:05 +01:00
Veronica Berglyd Olsen
d0e4c9f822 Fix versions in module docstrings 2022-11-25 22:43:27 +01:00
Veronica Berglyd Olsen
378a805b02 Update German translation 2022-11-25 22:22:36 +01:00
Veronica Berglyd Olsen
6f465e28e2 Merge branch 'main' into i18n 2022-11-24 15:18:14 +01:00
Veronica Berglyd Olsen
1678cd5e96 Update docs (#1255) 2022-11-24 15:18:03 +01:00
Veronica Berglyd Olsen
44c6c136a2 Update docs, second round 2022-11-24 15:13:46 +01:00
Veronica Berglyd Olsen
5538b04d55 Update completed translations 2022-11-22 22:56:57 +01:00
Veronica Berglyd Olsen
febf67179a Fix minor GUI issues (#1253) 2022-11-22 13:19:12 +01:00
Veronica Berglyd Olsen
0a5fa0d190 Update main language file 2022-11-22 13:06:56 +01:00
Veronica Berglyd Olsen
4fa6329eb6 Fix tests and minor issues 2022-11-22 13:05:05 +01:00
Veronica Berglyd Olsen
3a77228aaa Fix retention of selected item of novel tree in the details panel 2022-11-22 12:54:26 +01:00
Veronica Berglyd Olsen
f26a745d0e Use novel selector for project details 2022-11-22 12:45:10 +01:00
Veronica Berglyd Olsen
55f7a91eaf Add a button to open the novel tree root selector 2022-11-22 12:33:32 +01:00
Veronica Berglyd Olsen
b7373688e7 Add a novel selector class (#1252) 2022-11-18 13:28:35 +01:00
Veronica Berglyd Olsen
1b7814e891 Disable tooltip when novel selector is idsabled 2022-11-18 02:07:30 +01:00
Veronica Berglyd Olsen
039b2095f0 Let the novel selector replace the novel tree label 2022-11-18 02:01:55 +01:00
Veronica Berglyd Olsen
5c7c820fef Add a combo box to novel tree 2022-11-18 01:03:44 +01:00
Veronica Berglyd Olsen
11b6ed87d4 Add the novel selector widget and use it for the outline 2022-11-18 00:44:58 +01:00
Veronica Berglyd Olsen
250a41a84a Move StatusLED class to new components module 2022-11-18 00:19:15 +01:00
Veronica Berglyd Olsen
8c5ab9d626 Update all translation files and add test (#1251) 2022-11-17 17:25:50 +01:00
Veronica Berglyd Olsen
281f878a79 Remove build language part of test as this is already done in workflow 2022-11-17 17:19:40 +01:00
Veronica Berglyd Olsen
77489d22cd Add test coverage of language files 2022-11-17 17:15:39 +01:00
Veronica Berglyd Olsen
fa880f5e2a Update all translation files 2022-11-17 16:40:13 +01:00
Veronica Berglyd Olsen
f014d690ea Add German trannslation (#1033 by @HeyMyian) 2022-11-17 16:25:49 +01:00
Veronica Berglyd Olsen
7ece1123a7 Merge branch 'main' into i18n-de_DE-created 2022-11-17 16:23:14 +01:00
Veronica Berglyd Olsen
ecff40dade Add file format specification (#1249) 2022-11-17 11:01:42 +01:00
Veronica Berglyd Olsen
d13e2531e8 Add a link to the file format spec in the docs (#1012) 2022-11-17 10:58:04 +01:00
Veronica Berglyd Olsen
47d2c20bfd Move the file format spec document into the source code 2022-11-17 10:57:19 +01:00
Veronica Berglyd Olsen
18c3e9851e Update docs for 2.0 (#1248) 2022-11-16 23:07:30 +01:00
Veronica Berglyd Olsen
308a1649a5 Update docs project section 2022-11-16 23:04:35 +01:00
Veronica Berglyd Olsen
09c414c991 Update docs usage section 2022-11-16 16:17:22 +01:00
Veronica Berglyd Olsen
af7b46f714 Update docs introduction section 2022-11-16 15:59:21 +01:00
Veronica Berglyd Olsen
9a20eab1b2 Update docs, index and build, and rename viewsbar to sidebar 2022-11-16 15:58:52 +01:00
Veronica Berglyd Olsen
444c168da5 Update closing project procedure, and editor scrolling (#1247) 2022-11-16 11:28:47 +01:00
Veronica Berglyd Olsen
61ab597499 Make go to line in editor work consistently with auto-scrolling 2022-11-16 11:21:16 +01:00
Veronica Berglyd Olsen
62cf9b6184 Sort out status leds and project closing (#1237) 2022-11-16 11:20:40 +01:00
Veronica Berglyd Olsen
9f4b9a4dde Update workflow actions (#1246) 2022-11-16 00:00:54 +01:00
Veronica Berglyd Olsen
af991eb31b Update actions for syntax workflow 2022-11-15 23:43:43 +01:00
Veronica Berglyd Olsen
e6267f32b2 Merge branch 'main' into actions 2022-11-15 23:43:17 +01:00
Veronica Berglyd Olsen
c83b36acfa Set a max column width for novel tree extra column (#1245) 2022-11-15 23:41:38 +01:00
Veronica Berglyd Olsen
b7f99ec95f Update workflow actions 2022-11-15 23:41:04 +01:00
Veronica Berglyd Olsen
1e2920641d Force a max width of extra column in novel view (#1238) 2022-11-15 23:27:54 +01:00
Veronica Berglyd Olsen
a15d25370e Improve project tree iterator 2022-11-15 21:49:15 +01:00
Veronica Berglyd Olsen
7ce2fd29a6 Improve document navigation (#1243) 2022-11-15 17:00:27 +01:00
Veronica Berglyd Olsen
e0ca2e7fb5 Update tests and remove unused functions in viewer 2022-11-15 16:50:41 +01:00
Veronica Berglyd Olsen
a2ea7b40e2 Don't reload document if opening the same (#1242) 2022-11-15 16:49:59 +01:00
Veronica Berglyd Olsen
6560594c49 Fix scrolling when moving to a specific line in editor (#1239) 2022-11-15 16:48:46 +01:00
Veronica Berglyd Olsen
c095cc4bf0 Auto-update novel item meta (#1241) 2022-11-14 20:25:03 +01:00
Veronica Berglyd Olsen
8dbaa6bbd9 Remove no longer needed index function 2022-11-14 18:59:47 +01:00
Veronica Berglyd Olsen
ebc6654069 Improve how the novel tree is refreshed 2022-11-14 18:45:36 +01:00
Veronica Berglyd Olsen
992ed4f36c Update tests 2022-11-14 17:56:31 +01:00
Veronica Berglyd Olsen
b0a0ca089f Rewrite index class to use sequential title keys rather than line numbers 2022-11-14 16:59:51 +01:00
Veronica Berglyd Olsen
e52d8d9ff7 Add novel tree method to refresh metadata for item 2022-11-14 16:59:04 +01:00
Veronica Berglyd Olsen
827ae921a4 Merge branch 'main' into i18n-de_DE-created 2022-11-13 10:52:13 +01:00
Veronica Berglyd Olsen
e9b603d5a5 Release 2.0 RC 2 (#1231) 2022-11-13 10:06:39 +01:00
Veronica Berglyd Olsen
d93b3aa79f Always save project when closing 2022-11-12 18:59:09 +01:00
Veronica Berglyd Olsen
9b6ba891a4 Merge branch 'main' into release_2.0rc2 2022-11-12 18:30:00 +01:00
Veronica Berglyd Olsen
8a9b79abd0 Improve tree class and auto-rebuild index (#1236) 2022-11-12 18:29:49 +01:00
Veronica Berglyd Olsen
d4d23a140f Update changelog 2022-11-12 18:29:20 +01:00
Veronica Berglyd Olsen
e7ce13f647 Rebuild index when opdating project (#1235) 2022-11-12 18:23:13 +01:00
Veronica Berglyd Olsen
74d71f24ca Improve the setOrder method in the NWTree class, and improve tests 2022-11-12 18:22:30 +01:00
Veronica Berglyd Olsen
a1213f1e84 Rename class project variable 2022-11-12 13:08:55 +01:00
Veronica Berglyd Olsen
36cf5c1d76 Merge new changes and update changelog 2022-11-11 17:24:04 +01:00
Veronica Berglyd Olsen
fd85770d4d Merge branch 'main' into release_2.0rc2 2022-11-11 17:22:20 +01:00
Veronica Berglyd Olsen
116ebd8243 Update Config and NWItem class (#1232) 2022-11-11 17:21:32 +01:00
Veronica Berglyd Olsen
612034f6be Make the item class non-dynamic, and cache formatting vars in editor 2022-11-11 17:09:03 +01:00
Veronica Berglyd Olsen
b05028e3c9 Split up the storage of quote symbols in config 2022-11-11 12:50:36 +01:00
Veronica Berglyd Olsen
495209cd1a Fix tests of XML files and version number (again) 2022-11-11 12:16:03 +01:00
Veronica Berglyd Olsen
402cb09bb6 Fix tests of XML files and version number 2022-11-10 18:26:08 +01:00
Veronica Berglyd Olsen
dbfda1e680 Update Norwegian and US English 2022-11-10 18:17:51 +01:00
Veronica Berglyd Olsen
b03b723d25 Update i18n file 2022-11-10 18:01:13 +01:00
Veronica Berglyd Olsen
5a8e8b2221 Release 2.0 RC 2 2022-11-10 17:58:13 +01:00
Veronica Berglyd Olsen
6a664037cf Block toolbars when there is no project (#1230) 2022-11-10 17:11:32 +01:00
Veronica Berglyd Olsen
f556fde848 Make some minor code fixes 2022-11-10 17:04:12 +01:00
Veronica Berglyd Olsen
bbc5be0075 Disable toolbars when no project is open 2022-11-10 16:32:17 +01:00
Veronica Berglyd Olsen
b587ab638c Make further config class updates (#1229) 2022-11-10 13:37:09 +01:00
Veronica Berglyd Olsen
a1ddc6ce1d Fix test file comparison filters 2022-11-10 13:24:13 +01:00
Veronica Berglyd Olsen
b46ad86c31 Clean up config file format, modify how projects are launched, and add broken theme setting handling 2022-11-10 13:20:26 +01:00
Veronica Berglyd Olsen
15fec91358 Clean up setters and getters in Config 2022-11-10 09:29:00 +01:00
Veronica Berglyd Olsen
e2f3a44d96 Fix pollution of recent cache from tests 2022-11-09 23:10:30 +01:00
Veronica Berglyd Olsen
eac7d9b9ee Refactor config class, and switch to pathlib (#1228) 2022-11-09 23:03:03 +01:00
Veronica Berglyd Olsen
0c7fdc7013 Fix windows vs posix path issue in test 2022-11-09 22:51:12 +01:00
Veronica Berglyd Olsen
03e173634f Switch to Path objects nearly everywhere 2022-11-09 22:43:48 +01:00
Veronica Berglyd Olsen
cb755ba820 Move recent cache out of config, and update all tests 2022-11-09 20:54:13 +01:00
Veronica Berglyd Olsen
8721d53ab2 Clean up the config class names and methods 2022-11-09 18:47:50 +01:00
Veronica Berglyd Olsen
47b57172eb Change lastPath to a Path object 2022-11-09 18:21:40 +01:00
Veronica Berglyd Olsen
9d3291aba6 Change assetPath to a Path object 2022-11-09 17:44:20 +01:00
Veronica Berglyd Olsen
6792c11a71 Change dataPath to a Path object 2022-11-09 00:25:50 +01:00
Veronica Berglyd Olsen
6f5539de90 Change confPath to a Path object 2022-11-09 00:09:40 +01:00
Veronica Berglyd Olsen
9500c3bdb2 Make some remaining project class bariables private 2022-11-08 23:09:08 +01:00
Veronica Berglyd Olsen
5999e72592 Add a storage class (#1225) 2022-11-08 22:46:50 +01:00
Veronica Berglyd Olsen
0b44cf9c0a Fix issues with variying file order in zip archive 2022-11-08 22:29:54 +01:00
Veronica Berglyd Olsen
f5a3280565 Add test coverage of storage class 2022-11-08 22:19:22 +01:00
Veronica Berglyd Olsen
ee79d3d6d6 Fix tests for core classes 2022-11-08 19:48:06 +01:00
Veronica Berglyd Olsen
b024c0996d Move zipping of project to storage class 2022-11-08 19:25:56 +01:00
Veronica Berglyd Olsen
262a6c36b7 Rename NWDoc class to NWDocument 2022-11-07 22:51:09 +01:00
Veronica Berglyd Olsen
26f7bb4b32 Change how spel checking and booleans in general are saved in the XML 2022-11-07 22:46:30 +01:00
Veronica Berglyd Olsen
42f2bf3628 Merge branch 'main' into storage_class 2022-11-07 12:24:19 +01:00
Veronica Berglyd Olsen
6f6fe876e2 Fix parameter missing in Python 3.7 2022-11-07 10:45:53 +01:00
Veronica Berglyd Olsen
615ee2958a Remove project path attribute from project class 2022-11-06 00:39:30 +01:00
Veronica Berglyd Olsen
a75424e44b Use storage class to return document objects 2022-11-06 00:29:43 +01:00
Veronica Berglyd Olsen
76a1421fde Remove project content attribute from project class 2022-11-06 00:15:24 +01:00
Veronica Berglyd Olsen
972ed25a8c Remove project cache attribute from project class 2022-11-05 23:33:50 +01:00
Veronica Berglyd Olsen
21ab4e58f9 Remove project meta attribute from project class 2022-11-05 23:29:25 +01:00
Veronica Berglyd Olsen
82b34d9d2c Move lock file code to storage class 2022-11-05 22:14:33 +01:00
Veronica Berglyd Olsen
9cdf840d12 Make some minor improvements to the xml reader 2022-11-05 21:37:10 +01:00
Veronica Berglyd Olsen
72cc0cf0aa Add project file format 1.5 2022-11-05 21:13:18 +01:00
Veronica Berglyd Olsen
c6d3f680cc Add a UUID to projects 2022-11-05 17:03:45 +01:00
Veronica Berglyd Olsen
8b4dac4e13 Split project data class back into a separate file 2022-11-05 16:24:57 +01:00
Veronica Berglyd Olsen
783a849e09 Remove the old legacy format code 2022-11-05 16:19:19 +01:00
Veronica Berglyd Olsen
407e7fa69e Add storage code to handle projecty structure and old projects 2022-11-05 16:15:26 +01:00
Veronica Berglyd Olsen
2b8d51035d Fix version requirements in debian build file 2022-11-03 23:48:30 +01:00
Veronica Berglyd Olsen
2e590b742f Move new project tool to core tools (resolves #1152) 2022-11-03 23:47:51 +01:00
Veronica Berglyd Olsen
bd81ea0880 Make project xml class and tests use pathlib instead of os 2022-11-03 22:17:25 +01:00
Veronica Berglyd Olsen
dfd9e15951 Use storage class to open and save project XML 2022-11-03 21:51:56 +01:00
Veronica Berglyd Olsen
96b011cf70 Rename doctools module to coretools 2022-11-03 21:41:57 +01:00
Veronica Berglyd Olsen
3eee8442a7 Make packing and unpacking item data consistent 2022-11-03 17:30:54 +01:00
Veronica Berglyd Olsen
da4f4b0801 Add prototyype storage class 2022-11-01 22:58:12 +01:00
Veronica Berglyd Olsen
717d516f6a Delegate responsibility for the index to the project class 2022-11-01 22:32:29 +01:00
Veronica Berglyd Olsen
e85bd56f60 Auto-open first document (#1223) 2022-11-01 19:23:35 +01:00
Veronica Berglyd Olsen
a2f92c1223 Auto-open first document on new project (#1219) 2022-11-01 19:15:32 +01:00
Veronica Berglyd Olsen
9dd1a60629 Fix bug with active icon on item details panel 2022-11-01 19:11:38 +01:00
Veronica Berglyd Olsen
5abc9784f1 Refactor project XML handling (#1221) 2022-11-01 18:44:59 +01:00
Veronica Berglyd Olsen
f1100d4475 Remove minimal project from test suite 2022-11-01 18:32:29 +01:00
Veronica Berglyd Olsen
494b94430c Fix tests broken by xml rewrite 2022-11-01 18:31:03 +01:00
Veronica Berglyd Olsen
5b7f2b2b55 Add test coverage of the project xml class 2022-11-01 17:14:57 +01:00
Veronica Berglyd Olsen
f41db97860 Clean up the content loading 2022-11-01 13:36:22 +01:00
Veronica Berglyd Olsen
0cfaf4f021 Drop the total word count value in the XML and rewrite how counts are handled 2022-11-01 12:21:16 +01:00
Veronica Berglyd Olsen
6fd7107675 Remove pre-generatiopn of status and importance items 2022-10-31 23:18:16 +01:00
Veronica Berglyd Olsen
a88a2f5b40 Change file format to save dictionaries consistently 2022-10-31 22:37:05 +01:00
Veronica Berglyd Olsen
13b9e5a434 Move project data class to project file 2022-10-31 21:25:40 +01:00
Veronica Berglyd Olsen
a760aff826 Complete the xml writer class 2022-10-31 20:05:20 +01:00
Veronica Berglyd Olsen
3a161e90f9 Complete loading project xml via data class 2022-10-31 18:11:46 +01:00
Veronica Berglyd Olsen
522acc479b Move status and importance to data class 2022-10-31 17:01:50 +01:00
Veronica Berglyd Olsen
cc2ef85afd CHange how current word counts are handled 2022-10-31 16:19:31 +01:00
Veronica Berglyd Olsen
9d283d2eae Move all remaining trivial project settings to the data class 2022-10-31 15:55:33 +01:00
Veronica Berglyd Olsen
aeef8734b8 Move the remaining project meta settings to project data class 2022-10-31 00:28:10 +01:00
Veronica Berglyd Olsen
192806a46d Fix or disable broken tests 2022-10-30 23:55:58 +01:00
Veronica Berglyd Olsen
e887ec6991 Move project name to project data class 2022-10-30 23:18:18 +01:00
Veronica Berglyd Olsen
ea80fd3c71 Complete the XML parsing 2022-10-30 22:51:31 +01:00
Veronica Berglyd Olsen
6d1734b655 Merge branch 'main' into xml_rw_class 2022-10-30 19:40:12 +01:00
Veronica Berglyd Olsen
72f06620e9 Add version and build info to AppImage build (#1218) 2022-10-30 17:59:08 +01:00
Veronica Berglyd Olsen
aa963dea3d Add version and build info to AppImage build (#1182) 2022-10-30 17:55:38 +01:00
Veronica Berglyd Olsen
16e7df0526 Allow moving split document to trash (#1217) 2022-10-30 17:21:29 +01:00
Veronica Berglyd Olsen
4d5c1b2455 Update split document tests 2022-10-30 17:14:28 +01:00
Veronica Berglyd Olsen
c1988bcc17 Fix bug where split document loses status or importance 2022-10-30 17:07:24 +01:00
Veronica Berglyd Olsen
1784d9ce28 Add move to trash switch on split dialog and processing (#1179) 2022-10-30 17:03:52 +01:00
Veronica Berglyd Olsen
15fd4c51df Fix bug with missing icons in outline view 2022-10-30 16:58:10 +01:00
Veronica Berglyd Olsen
fd92f1c588 Update active/inactive and status/importance icons (#1216) 2022-10-30 15:31:03 +01:00
Veronica Berglyd Olsen
80496ab1ed Improve active/inactive icons again 2022-10-30 15:16:39 +01:00
Veronica Berglyd Olsen
dbade05e46 Generate nicer status icons 2022-10-30 02:33:00 +02:00
Veronica Berglyd Olsen
e80536405e Replace active status icons in project tree 2022-10-30 01:21:07 +02:00
Veronica Berglyd Olsen
ea59379479 Add new checkbox icons 2022-10-30 01:20:31 +02:00
Veronica Berglyd Olsen
18878dd19b Change how item data is stored in the project tree 2022-10-29 17:55:45 +02:00
Veronica Berglyd Olsen
309a58cb18 Fix missing synopsis action in main window 2022-10-29 01:36:31 +02:00
Veronica Berglyd Olsen
64fbc2f4e9 Add format and insert features (#1214) 2022-10-29 01:33:42 +02:00
Veronica Berglyd Olsen
dcb473137b Update documentation and test with synopsis insert feature 2022-10-29 01:26:58 +02:00
Veronica Berglyd Olsen
3a90ee2b0d Add insert menu entry for synopsis comment (#1177) 2022-10-29 01:26:26 +02:00
Veronica Berglyd Olsen
dc401278fb Update tests 2022-10-29 01:05:41 +02:00
Veronica Berglyd Olsen
33eb3efb11 Remove restriction on formatting empty block (#1178) 2022-10-29 01:05:33 +02:00
Veronica Berglyd Olsen
6d15bc5f14 Fix help text in Preferences 2022-10-29 00:56:39 +02:00
Veronica Berglyd Olsen
04c4b9eda5 Update theme system (#1212) 2022-10-29 00:50:26 +02:00
Veronica Berglyd Olsen
4a9ea459fa Make some minor changes and update test coverage 2022-10-29 00:38:32 +02:00
Veronica Berglyd Olsen
9b1c3fece2 Update default themes and remove custom style sheet feature 2022-10-28 23:50:52 +02:00
Veronica Berglyd Olsen
f76fc95494 Complete coverage of themes classes 2022-10-28 23:26:25 +02:00
Veronica Berglyd Olsen
42f5ea205f Clean up GUI tests 2022-10-28 22:15:54 +02:00
Veronica Berglyd Olsen
28916afcce Add test coverage of GUI theme 2022-10-28 00:00:57 +02:00
Veronica Berglyd Olsen
34193021e8 Simplify the themes class a bit 2022-10-27 23:47:29 +02:00
Veronica Berglyd Olsen
c7999831c9 Remove icon setting from config, and let the theme control it 2022-10-26 22:01:04 +02:00
Veronica Berglyd Olsen
8d7ebefa65 Fix updating syntax colours (#1171) 2022-10-25 23:56:07 +02:00
Veronica Berglyd Olsen
88183cdc39 Add updateTheme functions to remaining GUI components 2022-10-25 23:42:43 +02:00
Veronica Berglyd Olsen
52ede26f3d Add updateTheme functions to most GUI components 2022-10-25 23:12:21 +02:00
Veronica Berglyd Olsen
e1ecd3cd27 Fix some code linter complaints in doc editor 2022-10-25 22:01:44 +02:00
Veronica Berglyd Olsen
25c4330fd0 Make icon theme a part of the GUI theme (solves #1172) 2022-10-25 21:27:55 +02:00
Veronica Berglyd Olsen
80ae810e1b Merge 1.6.6 (#1211) 2022-10-25 18:55:52 +02:00
Veronica Berglyd Olsen
719c2aada2 Merge branch 'main' into merge_1.6.6 2022-10-25 18:49:28 +02:00
Veronica Berglyd Olsen
f2e3d95e98 Merge branch 'main' into merge_1.6.6 2022-10-25 18:47:36 +02:00
Veronica Berglyd Olsen
c22354fe4d Release 1.6.6 (#1210) 2022-10-25 18:29:06 +02:00
Veronica Berglyd Olsen
4862ac3857 Bump the version number and update the changelog 2022-10-25 18:26:37 +02:00
Veronica Berglyd Olsen
e93e125a46 Allow lookup of tags with spaces (#1209) 2022-10-25 18:19:19 +02:00
Veronica Berglyd Olsen
dc0f9abdbc Fix lookup of tags with spaces (#1195) 2022-10-25 18:12:29 +02:00
Veronica Berglyd Olsen
455a065285 Updates to status and importance feature (#1207) 2022-10-25 17:18:45 +02:00
Veronica Berglyd Olsen
8b3ec4376d Merge branch 'main' into status_import 2022-10-25 17:12:37 +02:00
Veronica Berglyd Olsen
b69e4e91ac Add Python 3.11 (#1208) 2022-10-25 17:11:21 +02:00
Veronica Berglyd Olsen
a5cbaa7f8c Update requirements and add Python 3.11 to CI 2022-10-25 16:58:46 +02:00
Veronica Berglyd Olsen
b0095b266d Add checkmark for current active status or iumportance value (#1202) 2022-10-25 16:19:25 +02:00
Veronica Berglyd Olsen
7b04d57605 Refactor project settings test 2022-10-25 15:48:29 +02:00
Veronica Berglyd Olsen
2ee6adcf35 Clean up function mappings in project tree class 2022-10-25 15:47:40 +02:00
Veronica Berglyd Olsen
e89f004532 Add a manage labels option to project tree context menu (#1203) 2022-10-25 12:20:18 +02:00
Veronica Berglyd Olsen
624787994a Refactor the projhect tree context menu code 2022-10-25 08:17:18 +02:00
Veronica Berglyd Olsen
550896e795 Merge branch 'main' into xml_rw_class 2022-10-21 10:24:00 +02:00
Veronica Berglyd Olsen
2f926301e6 Update wizard custom page functionality (#1201) 2022-10-20 23:10:18 +02:00
Veronica Berglyd Olsen
34dbf3557c Turn off generating notes if all notes folders are off in the new project wizard (#1192) 2022-10-20 23:00:52 +02:00
Veronica Berglyd Olsen
ae856dda6a Rename exported status to active status (#1200) 2022-10-20 22:48:57 +02:00
Veronica Berglyd Olsen
871cef8af9 Add tooltip to active status icons and update build tool 2022-10-20 22:37:42 +02:00
Veronica Berglyd Olsen
6b16b7c3b7 Rename project file attribute 2022-10-20 18:28:32 +02:00
Veronica Berglyd Olsen
93a79f3605 Rename the access metods of the item class from exported to active 2022-10-20 18:14:40 +02:00
Veronica Berglyd Olsen
5ae96e4d44 Fix various issues in the code (#1197) 2022-10-20 12:30:00 +02:00
Veronica Berglyd Olsen
85e48eb56a Fix a few minor typing issues 2022-10-20 12:14:09 +02:00
Veronica Berglyd Olsen
58f8f98c6f Use constants for project and config file names 2022-10-20 12:13:29 +02:00
Veronica Berglyd Olsen
1da92e997c Fix project tree context menu labels (#1199) 2022-10-20 09:12:31 +02:00
Veronica Berglyd Olsen
734f3d57bf Rename statusBar to mainStatus in main GUI due to conflict with Qt method (#1190) 2022-10-20 00:26:18 +02:00
Veronica Berglyd Olsen
6a6742275f Clean up unused part of header check function in doc editor 2022-10-20 00:22:09 +02:00
Veronica Berglyd Olsen
815c0f1125 Add a bunch of None checks, even if many may be redundant 2022-10-20 00:21:51 +02:00
Veronica Berglyd Olsen
cfe11f7b54 Make the common module a little simpler 2022-10-19 22:10:23 +02:00
Veronica Berglyd Olsen
efb7d12e1d Remove verbose logging (#1191) 2022-10-19 16:21:23 +02:00
Veronica Berglyd Olsen
caf8a75bbc Fix a couple of issues discovered by pylance 2022-10-19 12:06:57 +02:00
Veronica Berglyd Olsen
e52f0a9e16 Remove verbose logging implementation 2022-10-19 08:29:02 +02:00
Veronica Berglyd Olsen
8775b360d8 Remove all verbose log entries 2022-10-19 08:27:11 +02:00
Veronica Berglyd Olsen
54fea1d28e Clean up common module, and fix a few typing issues (#1188) 2022-10-19 00:18:07 +02:00
Veronica Berglyd Olsen
c40ace1290 Fix a few weird dictionary lookups in the index 2022-10-19 00:04:31 +02:00
Veronica Berglyd Olsen
f34d95edaa Simplify the setText method of the Tokenizer class 2022-10-18 23:49:48 +02:00
Veronica Berglyd Olsen
ac05dbc55b Fix a potential bug 2022-10-18 23:46:08 +02:00
Veronica Berglyd Olsen
0f72c45fbc Update tests 2022-10-18 23:41:41 +02:00
Veronica Berglyd Olsen
da820871fd Simplify the check functions in common (#1185) and remove the checkIntRange function 2022-10-18 23:41:29 +02:00
Veronica Berglyd Olsen
1aec49f852 Fix missing data path issue when creating themes folders (#1184) 2022-10-18 21:01:23 +02:00
Veronica Berglyd Olsen
33b95b60e3 Fix missing data path issue (#1180) 2022-10-18 20:43:33 +02:00
Veronica Berglyd Olsen
d232b22501 Always index main heading (#1183) 2022-10-17 21:39:28 +02:00
Veronica Berglyd Olsen
6c06845ed5 Drop the error on level tag in index file 2022-10-17 21:31:57 +02:00
Veronica Berglyd Olsen
5f4a171dff Update lipsum test project 2022-10-17 21:18:42 +02:00
Veronica Berglyd Olsen
38df693987 Update tests 2022-10-17 21:15:52 +02:00
Veronica Berglyd Olsen
e24573f644 Clean out main header data in the index and make it set the item's value instead 2022-10-17 20:22:21 +02:00
Veronica Berglyd Olsen
8fe25d4b43 Update classes and functions to use the item as source of main heading instead of index 2022-10-17 20:15:45 +02:00
Veronica Berglyd Olsen
5a4b7b7264 Add a main heading variable to the NWItem class 2022-10-17 20:08:19 +02:00
Veronica Berglyd Olsen
9b5b00fd2d Release 2.0 RC 1 (#1169) 2022-10-17 16:40:08 +02:00
Veronica Berglyd Olsen
d59c408e44 Merge branch 'main' into release_2.0rc1 2022-10-17 13:34:04 +02:00
Veronica Berglyd Olsen
95b6949da8 Update readme with new minimum Qt version 2022-10-15 23:32:30 +02:00
Veronica Berglyd Olsen
b0e2dbf06e Merge branch 'main' into release_2.0rc1 2022-10-15 23:30:43 +02:00
Veronica Berglyd Olsen
0aadb29ac7 Update changelog 2022-10-15 23:29:12 +02:00
Veronica Berglyd Olsen
559a1791e1 Increase minimum Qt version to 5.10 (#1174) 2022-10-15 23:23:47 +02:00
Veronica Berglyd Olsen
f5dcad8725 Update references to Qt version in the docs 2022-10-15 23:14:34 +02:00
Veronica Berglyd Olsen
97724054ec Require at least Qt 5.10 instead 2022-10-15 23:05:43 +02:00
Veronica Berglyd Olsen
30661130ca Ignore coverage of lines of old Qt versions 2022-10-15 22:56:18 +02:00
Veronica Berglyd Olsen
9c16b58325 Fix document editor test 2022-10-15 22:50:07 +02:00
Veronica Berglyd Olsen
aadc576d0a Require at least Qt 5.9 2022-10-15 22:47:18 +02:00
Veronica Berglyd Olsen
84db544704 Update documentation screen shots 2022-10-15 19:59:02 +02:00
Veronica Berglyd Olsen
49bce76c0d Update changelog 2022-10-15 16:21:41 +02:00
Veronica Berglyd Olsen
20945cfc0d Merge branch 'main' into release_2.0rc1 2022-10-15 16:19:59 +02:00
Veronica Berglyd Olsen
05ad483f06 Update i18n (#1170) 2022-10-15 16:19:47 +02:00
Veronica Berglyd Olsen
98e014f834 Update translations for Norwegian and US English 2022-10-15 16:10:18 +02:00
Veronica Berglyd Olsen
e316270b57 Update base translation file 2022-10-15 16:09:59 +02:00
Veronica Berglyd Olsen
4fe34640f5 Bump version to 2.0 RC 1 and update changelog 2022-10-15 12:13:14 +02:00
Veronica Berglyd Olsen
ca613e83e8 Add a root folder filter to the Build Tool (#1168) 2022-10-14 22:55:09 +02:00
Veronica Berglyd Olsen
72e1180c84 Add a root folder filter to the build tool 2022-10-14 22:41:58 +02:00
Veronica Berglyd Olsen
a582d231e8 Make some minor GUI tweaks (#1167) 2022-10-14 22:16:44 +02:00
Veronica Berglyd Olsen
11ff9567c0 Make the novel combo box on project details always visible 2022-10-14 21:49:42 +02:00
Veronica Berglyd Olsen
64c07e8910 Change a few tooltip labels and remove focus mode checkbox in menu 2022-10-14 21:45:58 +02:00
Veronica Berglyd Olsen
6f257d9b27 Use the main menu entries in the view bar settings menu 2022-10-14 20:47:01 +02:00
Veronica Berglyd Olsen
928c25e742 Fix circular imports (#1166) 2022-10-14 19:45:05 +02:00
Veronica Berglyd Olsen
3c49ccff53 Move the custom gui module to the root of the project 2022-10-14 19:34:37 +02:00
Veronica Berglyd Olsen
5aa5640baa Make all imports in tests explicit 2022-10-14 19:25:21 +02:00
Veronica Berglyd Olsen
91961111d8 Add Quick Links to the Project Tree (#1165) 2022-10-14 17:43:23 +02:00
Veronica Berglyd Olsen
5fcfbf1c75 Add shortcut to docs, and fix broken link 2022-10-14 17:35:10 +02:00
Veronica Berglyd Olsen
77ec0a9eed Add a quick links dropdown menu to the project tree (#1137) 2022-10-14 17:30:28 +02:00
Veronica Berglyd Olsen
bbbad2b170 Add bookmark icon 2022-10-14 17:29:07 +02:00
Veronica Berglyd Olsen
505385b060 Update icons (#1164) 2022-10-14 10:31:25 +02:00
Veronica Berglyd Olsen
07a5def0a9 Change project details to use decoration graphics rather than icons, and delete the no longer used header icons 2022-10-14 10:20:30 +02:00
Veronica Berglyd Olsen
91e6b0671e Add header decoration function to the icon class 2022-10-14 10:19:31 +02:00
Veronica Berglyd Olsen
234a527f25 Add icon for Novel Section documents 2022-10-14 09:40:34 +02:00
Veronica Berglyd Olsen
845a15229d Remove unused icons 2022-10-14 09:37:50 +02:00
Veronica Berglyd Olsen
ab482c4ede Rewrite Split Tool (#1154) 2022-10-14 00:00:16 +02:00
Veronica Berglyd Olsen
d619f4a012 Add test coverage of splitter function in project tree 2022-10-13 23:48:52 +02:00
Veronica Berglyd Olsen
84af87b155 Add test for document splitter 2022-10-13 19:01:06 +02:00
Veronica Berglyd Olsen
3f4d85dcad Rewrite test for split dialog 2022-10-13 18:18:08 +02:00
Veronica Berglyd Olsen
02976c5f12 Add remaining logic to document splitter, and fix bug in recursive permanet delete 2022-10-13 17:11:43 +02:00
Veronica Berglyd Olsen
049190739f Merge branch 'main' into split_tool 2022-10-13 14:57:24 +02:00
Veronica Berglyd Olsen
e11137a90f Merge 1.6.5 (#1160) 2022-10-13 11:14:02 +02:00
Veronica Berglyd Olsen
28ae292703 Merge branch 'main' into merge_1.6.5 2022-10-13 11:07:24 +02:00
Veronica Berglyd Olsen
0e94b1ca88 Patch 1.6.5 (#1159) 2022-10-13 10:47:22 +02:00
Veronica Berglyd Olsen
dbf672224f Bump version to 1.6.5 and update changelog 2022-10-13 10:44:08 +02:00
Veronica Berglyd Olsen
1001140eec Fix preferences dialog window size issue #989 2022-10-13 10:25:38 +02:00
Veronica Berglyd Olsen
038c66258b Backport fix for #1150 2022-10-13 10:24:00 +02:00
Veronica Berglyd Olsen
bb8b0555ae Backport fix for #1149 2022-10-13 10:22:31 +02:00
Veronica Berglyd Olsen
1421ed3bf4 Turn off the old splitter tool test 2022-10-12 23:44:15 +02:00
Veronica Berglyd Olsen
31a5761ba0 Add the core code for the DocSplitter tool 2022-10-12 23:39:56 +02:00
Veronica Berglyd Olsen
baafd5f83c Rewrite the GuiDocSplit dialog 2022-10-12 22:36:06 +02:00
Veronica Berglyd Olsen
4f44374f48 Remove menu entry for split document 2022-10-11 23:41:39 +02:00
Veronica Berglyd Olsen
7403736ae1 Fix minor issues and clean up class inits (#1153) 2022-10-11 23:35:31 +02:00
Veronica Berglyd Olsen
9a0bda9884 Fix tab parents on settings dialogs 2022-10-11 23:27:45 +02:00
Veronica Berglyd Olsen
84104f2267 Include missing file from last commit 2022-10-11 23:18:37 +02:00
Veronica Berglyd Olsen
5d6778be57 Clean up class initialisation 2022-10-11 23:17:58 +02:00
Veronica Berglyd Olsen
1f05e90266 Remove the context menu in the main window (#1147) 2022-10-11 22:49:36 +02:00
Veronica Berglyd Olsen
3a7c3cec3f Reset idle time when creating a new project (#1149) 2022-10-11 22:44:06 +02:00
Veronica Berglyd Olsen
e8f7df9cb4 Add Shift+Enter to auto-replace (#1151) 2022-10-11 22:35:24 +02:00
Veronica Berglyd Olsen
9b5d2b2c2b Resolve issue #1150 2022-10-11 22:26:14 +02:00
Veronica Berglyd Olsen
87f20622f9 Rewrite Merge Tool (#1148) 2022-10-11 22:02:26 +02:00
Veronica Berglyd Olsen
417758a29a Add coverage of new function in project class 2022-10-11 21:48:40 +02:00
Veronica Berglyd Olsen
07c93bcb7d Update test coverage 2022-10-11 21:20:03 +02:00
Veronica Berglyd Olsen
b96c1e9f09 Add test coverage of doc tools 2022-10-10 16:35:13 +02:00
Veronica Berglyd Olsen
747a1a212c Make some minor improvements to code and tests 2022-10-10 15:48:45 +02:00
Veronica Berglyd Olsen
428dce3e6e Fix doc merge dialog test 2022-10-09 22:47:36 +02:00
Veronica Berglyd Olsen
02dc7f5fe0 Make a few more improvements to doc merge 2022-10-09 21:40:50 +02:00
Veronica Berglyd Olsen
d9a59bccda Don't allow merging root folders 2022-10-09 21:30:21 +02:00
Veronica Berglyd Olsen
23b73dd936 Update tests for project tree deleting items 2022-10-09 20:49:25 +02:00
Veronica Berglyd Olsen
0859c14581 Remove the old merge document menu entry 2022-10-09 19:23:55 +02:00
Veronica Berglyd Olsen
2bda53e971 Split up the project tree deleteItem function 2022-10-09 19:21:05 +02:00
Veronica Berglyd Olsen
0f3d598f8d Implement nre doc merge functionality in tree 2022-10-09 17:19:01 +02:00
Veronica Berglyd Olsen
e1c3a12d07 Redesign the Document Merge dialog box 2022-10-09 15:30:02 +02:00
Veronica Berglyd Olsen
43bb5aab5c Rename 1.7 to 2.0 (#1146) 2022-10-06 09:15:48 +02:00
Veronica Berglyd Olsen
b80f5ba057 Rename 1.7 to 2.0 2022-10-06 09:10:58 +02:00
Veronica Berglyd Olsen
9c381c40a5 Remove existing space when auto-inserting space (#1131) 2022-10-01 23:13:07 +02:00
Veronica Berglyd Olsen
47c39e68b7 Remove the no longer needed changes to the test 2022-10-01 22:44:11 +02:00
Veronica Berglyd Olsen
a24d37ffa4 Simplify the auto-insert space check code as this is efficient enough 2022-10-01 22:41:18 +02:00
Veronica Berglyd Olsen
03db815723 Update test coverage 2022-10-01 22:35:26 +02:00
Veronica Berglyd Olsen
1aeb66d9af Make sure existing space is stripped before inserting non-breaking space (#1061) 2022-10-01 22:35:00 +02:00
Veronica Berglyd Olsen
3efbc14d97 Update Project Details for multi-novel projects (#1130) 2022-10-01 22:11:21 +02:00
Veronica Berglyd Olsen
534614d037 Add a root folder combo box to the Project Details dialog 2022-10-01 22:02:24 +02:00
Veronica Berglyd Olsen
479478490e Update the index to generate a ToC for a specific root folder 2022-10-01 22:02:00 +02:00
Veronica Berglyd Olsen
f4eed2bf2c Add Expand/Collapse All functionality to project tree (#1129) 2022-10-01 21:25:19 +02:00
Veronica Berglyd Olsen
ba51fb4c46 Add Expand/Collapse All functionality to project tree 2022-10-01 21:17:47 +02:00
Veronica Berglyd Olsen
bdc7e4dc10 Convert folder to document or note (#1128) 2022-10-01 20:42:43 +02:00
Veronica Berglyd Olsen
25dec2ace8 Add test coverage of convert folder feature 2022-10-01 20:32:47 +02:00
Veronica Berglyd Olsen
7d99d6c40b Merge branch 'main' into convert_folder 2022-10-01 19:06:52 +02:00
Veronica Berglyd Olsen
ba88160deb Rough framework for XML reader/writer classes 2022-09-29 20:07:52 +02:00
Veronica Berglyd Olsen
08289d0675 Merge 1.6.4 (#1121) 2022-09-29 20:05:42 +02:00
Veronica Berglyd Olsen
a64c36221c Fix remaining merge conflict 2022-09-29 20:00:05 +02:00
Veronica Berglyd Olsen
bf2229538e Bring patch 1.6.4 changes into main 2022-09-29 19:59:21 +02:00
Veronica Berglyd Olsen
922d66ff53 Fix typo in release notes and changelog 2022-09-29 19:38:28 +02:00
Veronica Berglyd Olsen
cfb6059027 Add Ubunutu 22.10 to patch build 2022-09-29 19:34:20 +02:00
Veronica Berglyd Olsen
c04715c9ef Release 1.6.4 (#1120) 2022-09-29 19:27:02 +02:00
Veronica Berglyd Olsen
d82c739f01 Release 1.6.4 2022-09-29 19:23:41 +02:00
Veronica Berglyd Olsen
7267490645 Backport fix #1113 2022-09-29 14:33:12 +02:00
Veronica Berglyd Olsen
5adf21e87a Add integration test coverage of insert spaces issue 2022-09-29 14:25:42 +02:00
Veronica Berglyd Olsen
e6b2732281 Fix insert spaces crash (#1118) 2022-09-29 14:11:39 +02:00
Veronica Berglyd Olsen
9c4b3dbc08 Improve the tree change method 2022-09-29 14:09:03 +02:00
Veronica Berglyd Olsen
3d3ac0d05d Allow converting folder to file in project tree (#1071) 2022-09-19 13:33:56 +02:00
Veronica Berglyd Olsen
9434fe2cd7 Fix clipping of cursor due to no document margin (#1113) 2022-09-14 16:57:15 +02:00
Veronica Berglyd Olsen
af55e57ba3 Fix clipping of cursor due to 0 doc margin, issue #1112 2022-09-14 16:48:46 +02:00
Veronica Berglyd Olsen
90fbfc30ad Add Ubuntu 22.10 to setup builds 2022-09-14 13:33:09 +02:00
Veronica Berglyd Olsen
c48d415a9d Update context menu entries in project tree (#1111) 2022-09-11 19:12:49 +02:00
Veronica Berglyd Olsen
874f4f7198 Change a few other project tree context menu labels 2022-09-11 18:51:18 +02:00
Veronica Berglyd Olsen
19c583f615 Fix misleading deletion label in context menu for empty folders 2022-09-11 18:48:15 +02:00
Veronica Berglyd Olsen
76e9c822c9 Make adding new docs smarter (#1110) 2022-09-11 17:40:47 +02:00
Veronica Berglyd Olsen
73b8e3e0fb Use the new item checker functions instead of equal operator 2022-09-11 17:22:46 +02:00
Veronica Berglyd Olsen
5cba10151a Make the add new item feature a little smarter 2022-09-11 17:06:16 +02:00
Veronica Berglyd Olsen
01b66bc62e Add some type and layout checker functions to the item class 2022-09-11 17:04:21 +02:00
Veronica Berglyd Olsen
f14398392a Merge release 1.6.3 into main (#1104) 2022-08-18 22:57:15 +02:00
Veronica Berglyd Olsen
3a7ed1f2f3 Merge branch 'main' into patch_to_main 2022-08-18 22:53:46 +02:00
Veronica Berglyd Olsen
802d1b0132 Improve the build scripts (#1103) 2022-08-18 22:45:43 +02:00
Veronica Berglyd Olsen
d4878525ac Improve the package build pipeline 2022-08-18 22:38:32 +02:00
Veronica Berglyd Olsen
e98e758b5f Fix missing version bump 2022-08-18 22:36:46 +02:00
Veronica Berglyd Olsen
672e3680b7 Release 1.6.3 (#1102) 2022-08-18 20:38:42 +02:00
Veronica Berglyd Olsen
53c1d1b7ee Bumped version and update changelog 2022-08-17 23:49:37 +02:00
Veronica Berglyd Olsen
721d67ac0a Merge patches from 1.6.3 (#1101) 2022-08-17 23:32:43 +02:00
Veronica Berglyd Olsen
2407b61830 Fix typo in docstring and add reference to issue 2022-08-17 23:24:18 +02:00
Veronica Berglyd Olsen
f08345b15e Merge branch 'main' into merge_patches 2022-08-17 23:21:10 +02:00
Veronica Berglyd Olsen
20da33348c Block adding spaces before colon in certain meta data cases (#1099) 2022-08-17 23:09:17 +02:00
Veronica Berglyd Olsen
7e82461aba Fix comment in test 2022-08-17 23:05:26 +02:00
Veronica Berglyd Olsen
fcfe7507d6 Block adding spaces before colon (French language feature) in certain meta data cases 2022-08-17 23:01:03 +02:00
Veronica Berglyd Olsen
90b50fe180 Fix handling of empty spellcheck language string (#1098) 2022-08-17 22:34:45 +02:00
Veronica Berglyd Olsen
3ddbfb061b Make spell ckeck tests run on en_US 2022-08-17 22:29:27 +02:00
Veronica Berglyd Olsen
93194626c7 Add an additional ignore line on main editing test 2022-08-17 22:25:02 +02:00
Veronica Berglyd Olsen
c23a1d224d Install a generic English dictionary on Linux CI 2022-08-17 22:19:32 +02:00
Veronica Berglyd Olsen
2178391bcd Update tests of spell check classes 2022-08-17 21:49:59 +02:00
Veronica Berglyd Olsen
c917fc9c9c Fix issue #1096 and remove a couple of error ourputs 2022-08-17 21:49:41 +02:00
Veronica Berglyd Olsen
15c54224e0 Update the Outline View to be consistent with the Novel Tree (#1094) 2022-08-15 18:09:33 +02:00
Veronica Berglyd Olsen
cc7ae316ad Make some minor changes for consistency between similar classes 2022-08-15 16:08:25 +02:00
Veronica Berglyd Olsen
bf49b1ee50 Merge branch 'main' into outline_updates 2022-07-31 18:55:03 +02:00
Veronica Berglyd Olsen
bb2c78c0f6 Update tests 2022-07-31 18:50:43 +02:00
Veronica Berglyd Olsen
069e3baf67 Add functionality to load and save last selected outline novel, and fix a few inconsistencies 2022-07-31 18:40:16 +02:00
Veronica Berglyd Olsen
b30a4d26ae Appimage Distribution (#1092) 2022-07-15 16:53:37 +02:00
Veronica Berglyd Olsen
338d158bae Make some minor changes to the setup script 2022-07-15 16:39:12 +02:00
Veronica Berglyd Olsen
895beb6aa1 Revert change of spelling from UK to US 2022-07-15 16:36:45 +02:00
Veronica Berglyd Olsen
67aff2550b Change look of outline tree 2022-07-15 14:38:37 +02:00
Rachel Powers
82a5da391f - ensure dist_appimage removed during cleanup
- cleanup
2022-07-08 18:53:01 -07:00
Rachel Powers
3dc4d1443f ensure prefix matching of build-appimage args do not shadow normal setup
move defaults to pyhton 3.10 and manylinux2010 for better compatability
cleanup
2022-07-08 18:40:54 -07:00
Rachel Powers
073a9acfb3 add a method to automate the building of an Appimage package 2022-07-08 15:26:03 -07:00
Rachel Powers
b363259a72 fix spelling 2022-07-08 14:08:13 -07:00
Rachel Powers
211ab290d0 bring .desktop into compliance with Desktop Entry specification 1.1
validated with `desktop-file-validate`
2022-07-08 14:06:56 -07:00
Veronica Berglyd Olsen
f9df358c4f Add the Novel Tree meta data feature (#1088) 2022-06-15 20:46:45 +02:00
Veronica Berglyd Olsen
0d01e108f1 Improve test coverage 2022-06-15 20:37:19 +02:00
Veronica Berglyd Olsen
8c4ecaeee2 Fix tests 2022-06-15 20:01:45 +02:00
Veronica Berglyd Olsen
4fa814a2fa Remove no longer needed config settings, and change default text width 2022-06-15 19:51:13 +02:00
Veronica Berglyd Olsen
bb85232ea7 Add some fixes to keep novel tree active handle up to date 2022-06-15 19:47:04 +02:00
Veronica Berglyd Olsen
469275eea5 Add novel tree highlight of rows of current document 2022-06-15 19:39:07 +02:00
Veronica Berglyd Olsen
ba0ce33cfc Add a tool tip with meta data behind a button on each novel tree item 2022-06-15 19:17:24 +02:00
Veronica Berglyd Olsen
50f299171a Add some convenient tree widget settings to the different trees 2022-06-15 17:33:47 +02:00
Veronica Berglyd Olsen
5c04e79486 Merge branch 'main' into i18n-de_DE-created 2022-06-15 17:18:47 +02:00
Veronica Berglyd Olsen
fb14e978cd Merge branch 'patch' 2022-06-15 17:11:56 +02:00
Veronica Berglyd Olsen
3a455fa1a7 Fix build ODT language, and collapsing of view panel (#1087) 2022-06-15 17:10:35 +02:00
Veronica Berglyd Olsen
ad50ad9b0d Resolve issue #1085 2022-06-15 17:06:18 +02:00
Veronica Berglyd Olsen
7d7c2dba26 Resolve issue #1073 2022-06-15 17:05:48 +02:00
Veronica Berglyd Olsen
0b95804535 Update the novel tree GUI (#1084) 2022-06-15 16:52:42 +02:00
Veronica Berglyd Olsen
6ccbb358b9 Update tests 2022-06-15 16:46:44 +02:00
Veronica Berglyd Olsen
cff464392a Use the indenta decorators of the novel tree to indicate type 2022-06-15 16:15:29 +02:00
Veronica Berglyd Olsen
3a061eec3f Update novel tree menu processing and fix issue with reaload of document 2022-06-15 16:14:28 +02:00
Veronica Berglyd Olsen
538b722bdf Fix tests and a few other bits 2022-06-14 19:33:12 +02:00
Veronica Berglyd Olsen
ea61db9591 Simplify the novel outline tree 2022-06-14 00:14:51 +02:00
Veronica Berglyd Olsen
49ace054bd Make options class handle enums, and add plot column to novel tree 2022-06-12 20:18:24 +02:00
Veronica Berglyd Olsen
8040441757 Allow changing content of last column of the novel tree 2022-06-12 19:59:18 +02:00
Veronica Berglyd Olsen
88b2d61cec Update tests 2022-06-12 17:54:37 +02:00
Veronica Berglyd Olsen
52683d5a21 Add novel tree toolbar and connect actions 2022-06-12 17:47:32 +02:00
Veronica Berglyd Olsen
b3eb276437 Wrap the novel tree in an outer widget 2022-06-12 15:45:39 +02:00
Veronica Berglyd Olsen
ed5c52859d Simplify the conversion of very old project data (#1083) 2022-06-11 23:57:08 +02:00
Veronica Berglyd Olsen
c58868ed39 Simplify the conversion of very old project data 2022-06-11 23:54:20 +02:00
Veronica Berglyd Olsen
5a5a64e3a2 Replace the edit item dialog (#1082) 2022-06-11 18:54:08 +02:00
Veronica Berglyd Olsen
2cc8be5776 Rename the main GUI function for editing an item 2022-06-11 18:48:22 +02:00
Veronica Berglyd Olsen
8d427f40c6 Add a shortcut to open project tree context menu 2022-06-11 18:40:21 +02:00
Veronica Berglyd Olsen
946656f8c5 Add test for edit label dialog 2022-06-11 18:26:41 +02:00
Veronica Berglyd Olsen
37c3bb8cd2 Replace the item editor with the label editor dialog 2022-06-11 18:19:21 +02:00
Veronica Berglyd Olsen
6058423970 Add a new edit label dialog 2022-06-11 18:17:57 +02:00
Veronica Berglyd Olsen
d162be3543 Give main GUI objects better names (#1081) 2022-06-11 16:36:15 +02:00
Veronica Berglyd Olsen
985179bbb9 Rename main theme object 2022-06-11 16:29:49 +02:00
Veronica Berglyd Olsen
db01d85f2e Rename outline components 2022-06-11 15:59:08 +02:00
Veronica Berglyd Olsen
94068e777a Give main GUI elements more identifiable names 2022-06-11 15:49:45 +02:00
Veronica Berglyd Olsen
0181bebd70 Rename ambiguous theParent variable to mainGui 2022-06-11 15:33:32 +02:00
Veronica Berglyd Olsen
b8d557646a Update the Project Tree with major improvements (#1079) 2022-06-11 14:53:45 +02:00
Veronica Berglyd Olsen
025463a28e Improve project tree test coverage 2022-06-11 14:40:03 +02:00
Veronica Berglyd Olsen
f0bef18b63 Re-implement the tree context menu 2022-06-11 13:44:45 +02:00
Veronica Berglyd Olsen
77746f712f Fix inconsistend expand/collapse when tree items are moved 2022-06-11 12:33:37 +02:00
Veronica Berglyd Olsen
ad438e128a Merge branch 'main' into project_tree_updates 2022-06-07 23:41:48 +02:00
Veronica Berglyd Olsen
af39fb98a1 Clean up project tree code and add undo action to the menu 2022-06-07 23:38:17 +02:00
Veronica Berglyd Olsen
ef270bc069 Tweak project toolbar look, and fix shortcuts 2022-06-07 22:38:02 +02:00
Veronica Berglyd Olsen
0909bf7c36 Update code of conduct to v2.1 2022-06-07 10:34:27 +02:00
Veronica Berglyd Olsen
5a6ef5efd3 Add move buttons to project tree toolbar 2022-06-07 00:11:42 +02:00
Veronica Berglyd Olsen
272e7f6e24 Remove redundant menu entries 2022-06-06 22:17:24 +02:00
Veronica Berglyd Olsen
46bb8e5bcc Populate the add button menu in the project widget 2022-06-06 22:03:42 +02:00
Veronica Berglyd Olsen
12a7ec7fe3 Allow the project class to create new files 2022-06-06 22:02:44 +02:00
Veronica Berglyd Olsen
d07f5dc520 Wrap project tree in an outer widget with a toolbar 2022-06-06 15:50:46 +02:00
Veronica Berglyd Olsen
b88cdb7677 Make the project tree columns fixed 2022-06-06 14:11:59 +02:00
Veronica Berglyd Olsen
669eabc7e8 Handle actions in the project tree internally in the class 2022-06-06 13:46:54 +02:00
Veronica Berglyd Olsen
24112f6d8d Merge branch 'main' into i18n-de_DE-created 2022-06-06 13:27:48 +02:00
Veronica Berglyd Olsen
3ff5dfce33 Set build language for Open Document files (#1077) 2022-06-05 22:47:21 +02:00
Veronica Berglyd Olsen
2f81aef0a3 Set build language for Open Document files 2022-06-05 22:42:25 +02:00
Veronica Berglyd Olsen
29739ab210 Update the Outline View panel (#1063)
Add a top level widget that contains the entire Outline View.
Move the details panel code to the outline.py file.
Add a toolbar to the top of the Outline view with a dropdown box to select which Novel folder to view.
Add a refresh button to the tool bar.
Move the context menu for changing columns to a menu button on the tool bar.
Remove the Rebuild Outline and Auto-Update Outline options from the main menu.
2022-06-05 22:34:49 +02:00
Veronica Berglyd Olsen
4d9b94cfe6 Improve test coverage of Outline 2022-06-05 22:31:10 +02:00
Veronica Berglyd Olsen
85f63721e0 Allow showing all novel files in Outline 2022-06-05 18:43:09 +02:00
Veronica Berglyd Olsen
92924b3288 Make the new item function better at guessing header level of new files 2022-06-05 17:41:29 +02:00
Veronica Berglyd Olsen
88976d6800 Streamline how project item changes are reported 2022-06-05 17:25:39 +02:00
Veronica Berglyd Olsen
2873336dce Allow switching between root novel folders 2022-06-05 15:04:04 +02:00
Veronica Berglyd Olsen
de07546e3f Fix tests 2022-06-05 13:41:22 +02:00
Veronica Berglyd Olsen
ac14888e2a Merge branch 'main' into outline_view 2022-06-05 13:36:54 +02:00
Veronica Berglyd Olsen
c28ac37df1 Rewrite index class (#1074)
Rewrites the index class to use objects rather than dictionaries to store indexing information.
Moves the index instance into the main project class instead of the main GUI object.
Makes the project tree and project options classes private to the project class.
2022-06-05 13:21:45 +02:00
Veronica Berglyd Olsen
63068f1018 Add full test coverage of index class 2022-06-05 13:17:24 +02:00
Veronica Berglyd Olsen
22099c1b56 Make some minor improvements to handling of tags and references 2022-06-03 11:07:40 +02:00
Veronica Berglyd Olsen
eed59a96be Make some fixes to the index class, and improve test coverage 2022-05-30 00:28:43 +02:00
Veronica Berglyd Olsen
865acfd7e9 Clean up imports 2022-05-29 19:40:14 +02:00
Veronica Berglyd Olsen
d1b32f1ba1 Move the tags index into a wrapper class 2022-05-29 19:24:41 +02:00
Veronica Berglyd Olsen
77e50a6cee Move the item index into a wrapper class and combine the access functions 2022-05-29 18:58:32 +02:00
Veronica Berglyd Olsen
347d34bf83 Clean up the index code a bit and add index validation 2022-05-29 00:18:48 +02:00
Veronica Berglyd Olsen
94ba7a2f94 Use the new index instead of the old 2022-05-28 21:59:52 +02:00
Veronica Berglyd Olsen
01be8be44f Remove old tagsIndex 2022-05-28 20:16:27 +02:00
Veronica Berglyd Olsen
d584f57a3b Loading of new index now works 2022-05-28 19:45:33 +02:00
Veronica Berglyd Olsen
b5b0074411 Rewritten index storage using classes instead 2022-05-28 18:48:31 +02:00
Veronica Berglyd Olsen
44926a4e9a Also make tree and options properties of the project 2022-05-28 14:33:25 +02:00
Veronica Berglyd Olsen
8bdd09400a Move the project index into the project class 2022-05-28 14:11:58 +02:00
Veronica Berglyd Olsen
8ac30b036a Change how tag links are followed 2022-05-26 12:11:22 +02:00
Veronica Berglyd Olsen
ecc0585c87 Add a toolbar to the Outline view 2022-05-22 23:03:30 +02:00
Veronica Berglyd Olsen
007f2fbff4 Add a menu icon 2022-05-22 22:46:42 +02:00
Veronica Berglyd Olsen
1f66ed3e3b Reduce the list of tag classes in outline view when they are not used 2022-05-22 21:00:49 +02:00
Veronica Berglyd Olsen
eb66b2c175 Merge branch 'main' into outline_view 2022-05-22 18:15:36 +02:00
Veronica Berglyd Olsen
5d86cfb092 Improve GUI look and usability (#1069) 2022-05-22 18:11:25 +02:00
Veronica Berglyd Olsen
b9fcc43ca6 Move highlighting theme setting back to General tab in Preferences 2022-05-22 17:53:46 +02:00
Veronica Berglyd Olsen
3cfc5d9a1a Remove borders from all main GUI widgets 2022-05-22 17:45:54 +02:00
Veronica Berglyd Olsen
25427e8521 Add tooltips to views bar 2022-05-22 17:43:38 +02:00
Veronica Berglyd Olsen
2425af4bfe Add menu to view bar settings, and add build button 2022-05-22 17:00:45 +02:00
Veronica Berglyd Olsen
4a4ed32fe6 Add new view bar icons 2022-05-22 17:00:09 +02:00
Veronica Berglyd Olsen
f7e31bd452 Use "project name" consistently on the GUI 2022-05-22 16:23:49 +02:00
Veronica Berglyd Olsen
adf7357155 Merge branch 'main' into outline_view 2022-05-22 16:19:53 +02:00
Veronica Berglyd Olsen
a541c90690 Add icon name to xdg mime type just in case (#1068) 2022-05-22 15:58:09 +02:00
Veronica Berglyd Olsen
217e184153 Update new project creation (#1067) 2022-05-21 22:22:07 +02:00
Veronica Berglyd Olsen
e14348a05b Fix a few text labels on the wizard 2022-05-21 22:18:16 +02:00
Veronica Berglyd Olsen
78b97ce8fb Remove name as a required parameter for new root folders since no part of the GUI uses it 2022-05-21 22:10:25 +02:00
Veronica Berglyd Olsen
aeaaaaf3af Update test coverage 2022-05-21 21:55:19 +02:00
Veronica Berglyd Olsen
63a3e56cdb Fix ignored lines in XML comparison 2022-05-21 18:15:38 +02:00
Veronica Berglyd Olsen
cea22b6147 Clean up new project creation function 2022-05-21 17:58:47 +02:00
Veronica Berglyd Olsen
06d39ea352 Make tests not depend on minimal project settings 2022-05-21 17:33:58 +02:00
Veronica Berglyd Olsen
b4ea5bc8d0 Update minimal project content 2022-05-21 17:33:36 +02:00
Veronica Berglyd Olsen
ad42a71427 Fix tests 2022-05-21 16:57:09 +02:00
Veronica Berglyd Olsen
46dce17dfe Update new project generation to match wizard 2022-05-21 16:29:41 +02:00
Veronica Berglyd Olsen
7a8c97225b Add a summary page to the wizard 2022-05-21 15:47:21 +02:00
Veronica Berglyd Olsen
5574d8d6c0 Update and clarify the options on the Wizard 2022-05-21 15:11:33 +02:00
Veronica Berglyd Olsen
a166d9a4dd Add a Translation Guidelines section in i18n 2022-05-19 20:04:10 +02:00
Veronica Berglyd Olsen
b863077bfe Make minor changes post 1.7b1 release (#1065) 2022-05-17 20:52:50 +02:00
Veronica Berglyd Olsen
ae2b5d4403 Fix typo and set max width on views bar 2022-05-17 20:22:39 +02:00
Veronica Berglyd Olsen
301d81f987 Update various translation files 2022-05-17 20:22:16 +02:00
Veronica Berglyd Olsen
15f59c1a4e Release 1.7 Beta 1 (#1064) 2022-05-17 18:51:01 +02:00
Veronica Berglyd Olsen
9eaf240674 Release 1.7-beta1 2022-05-17 18:41:01 +02:00
Veronica Berglyd Olsen
a71fa02b0c Sort i18n credits on about and credits doc 2022-05-17 18:40:10 +02:00
Veronica Berglyd Olsen
9add2aaa87 Update the sample project to reflect new functionality 2022-05-17 17:51:40 +02:00
Veronica Berglyd Olsen
a5b2a06f84 Fix tests and add missing methods 2022-05-15 17:56:36 +02:00
Veronica Berglyd Olsen
ca48e37163 Move the outline view into a wrapper widget 2022-05-15 17:45:51 +02:00
Veronica Berglyd Olsen
304d122342 Add valid path check to the New Project Wizard (#1062) 2022-05-15 16:43:43 +02:00
Veronica Berglyd Olsen
7c7e4c2297 Disabled second wizard test on macOS as it too segfaults 2022-05-15 16:39:41 +02:00
Veronica Berglyd Olsen
e2c10f52d2 Disabled wizard test on macOS as it still segfaults 2022-05-15 16:37:09 +02:00
Veronica Berglyd Olsen
c91f19f9f7 Update wizard test coverage 2022-05-15 16:31:51 +02:00
Veronica Berglyd Olsen
1d5c8566d1 Check the sanity of paths during project wizard run (issue #1058) 2022-05-15 15:11:17 +02:00
Veronica Berglyd Olsen
badb768529 Add a "views" toolbar to the main GUI (#1057) 2022-05-14 19:12:02 +02:00
Veronica Berglyd Olsen
d965320b57 Fix broken test 2022-05-14 19:07:34 +02:00
Veronica Berglyd Olsen
096c2dbc83 Add Typicons link to credits 2022-05-14 19:03:51 +02:00
Veronica Berglyd Olsen
88cc4bd5a4 Add new icons for the views bar 2022-05-14 19:00:47 +02:00
Veronica Berglyd Olsen
e8a0a6d5f9 Connect the change of view methods to all relevant actions 2022-05-14 18:27:18 +02:00
Veronica Berglyd Olsen
864b06a0e7 Shift all view changing functionality to the new Views bar 2022-05-10 22:14:35 +02:00
Veronica Berglyd Olsen
ea09a53496 Add the GuiViewsBar class 2022-05-10 20:56:52 +02:00
Veronica Berglyd Olsen
d6ca87868b Add quick delete for empty folders (#1055) 2022-05-08 18:26:25 +02:00
Veronica Berglyd Olsen
14458c7184 Merge branch 'main' into delete_items 2022-05-08 18:23:04 +02:00
Veronica Berglyd Olsen
12cfce758c Force consistency of item settings (#1054) 2022-05-08 18:22:52 +02:00
Veronica Berglyd Olsen
9e9beea83c Fix outdated docstring in project tree class 2022-05-08 18:21:17 +02:00
Veronica Berglyd Olsen
0a5c51ad4b Make deleting empty folders bypass Trash 2022-05-08 18:07:21 +02:00
Veronica Berglyd Olsen
9ee4d1b2cd Reset meta data for folders 2022-05-08 17:52:36 +02:00
Veronica Berglyd Olsen
d833692e27 Merge branch 'main' into item_checks 2022-05-08 17:46:37 +02:00
Veronica Berglyd Olsen
b68280655f Add Mastodon link to main readme and docs 2022-04-28 19:17:16 +02:00
Veronica Berglyd Olsen
1e7d329962 Force conistency of ROOT item settings 2022-04-28 19:04:21 +02:00
Veronica Berglyd Olsen
b35c85e831 Allow deleting non-empty folders (#1048) 2022-04-23 21:44:37 +02:00
Veronica Berglyd Olsen
bb53b2530c Fix error messages when emptying trash 2022-04-23 21:41:14 +02:00
Veronica Berglyd Olsen
9bc7250532 Allow deleting non-empty folders 2022-04-23 21:33:11 +02:00
Veronica Berglyd Olsen
160c3d80f9 Fix the redundant spaces highlight option text in Preferences (#1046) 2022-04-23 20:14:13 +02:00
Veronica Berglyd Olsen
5538c3f995 Merge branch 'main' into issue_1043 2022-04-23 20:03:43 +02:00
Veronica Berglyd Olsen
c7e560ffc5 Allow documents to have child items (#1047) 2022-04-23 20:03:30 +02:00
Veronica Berglyd Olsen
d9e3fd7a01 Make some minor improvements to how expanded status is saved for items 2022-04-23 19:34:40 +02:00
Veronica Berglyd Olsen
732f20a0f1 Fix word count accounting and double click tree expansion 2022-04-23 19:00:11 +02:00
Veronica Berglyd Olsen
a8a34a4a37 Fix drag and drop word propagation 2022-04-23 18:03:03 +02:00
Veronica Berglyd Olsen
821833df8e Fix tests and drop unused function from NWTree class 2022-04-23 17:05:29 +02:00
Veronica Berglyd Olsen
bd5a14b18e Block drag and drop for ROOT items on the widget level, and drop the TRASH item type 2022-04-23 16:57:13 +02:00
Veronica Berglyd Olsen
d96c8ddf85 Remove all restrictions on drag and drop except in ROOT items 2022-04-23 16:21:20 +02:00
Veronica Berglyd Olsen
5cdcda66a5 Update data recursively when moving an item with child items 2022-04-23 16:09:50 +02:00
Veronica Berglyd Olsen
1a47bbaf8c Allow files to have child items 2022-04-23 15:53:14 +02:00
Veronica Berglyd Olsen
64da2793ac Allow file items to save expanded status 2022-04-23 15:38:53 +02:00
Veronica Berglyd Olsen
31fac7bf45 Make the test suite less spammy again 2022-04-23 15:28:26 +02:00
Veronica Berglyd Olsen
147b9a4501 Fix the redundant spaces highlight option text in Preferences: issue #1043 2022-04-23 15:17:20 +02:00
Veronica Berglyd Olsen
b588fdfe1a Use the random generator for item handles (#1044) 2022-04-20 22:00:34 +02:00
Veronica Berglyd Olsen
607f9409d2 Update tests 2022-04-20 21:50:07 +02:00
Veronica Berglyd Olsen
e32eb21fbf Add a mock random number generator for testing 2022-04-20 21:46:53 +02:00
Veronica Berglyd Olsen
8320aab1bf Use the same method to generate item handles as for status keys 2022-04-20 21:44:45 +02:00
Veronica Berglyd Olsen
ca76cb2af3 Make a couple of random, minor fixes 2022-04-20 17:15:55 +02:00
Veronica Berglyd Olsen
e938ea8967 Allow multiple roots of same class (#1031) 2022-04-17 19:35:51 +02:00
Veronica Berglyd Olsen
15ede5e14c Make better use of the new NWItem functions and do some cleanup 2022-04-17 19:15:00 +02:00
Veronica Berglyd Olsen
4eec2926cb Clean up unused code and add more comments 2022-04-17 18:38:25 +02:00
Veronica Berglyd Olsen
3f4356467e Relax moving restrictions in project tree, and improve test coverage of NWItem class 2022-04-17 18:32:22 +02:00
Veronica Berglyd Olsen
50db7fcddb Simplify updating an item after it has been moved 2022-04-17 17:49:47 +02:00
Veronica Berglyd Olsen
d158de5d82 Update test coverage 2022-04-17 17:00:43 +02:00
Veronica Berglyd Olsen
4cfbbf4c68 Remove max folder depth restriction, and simplify adding folders and files in the tree 2022-04-17 14:44:11 +02:00
Veronica Berglyd Olsen
ebee9ff791 Update tests 2022-04-16 20:56:52 +02:00
Veronica Berglyd Olsen
61f5425662 Update new item functions in project class 2022-04-16 20:55:54 +02:00
Veronica Berglyd Olsen
da13fbff08 Merge branch 'main' into multi_root 2022-04-16 18:49:46 +02:00
Veronica Berglyd Olsen
b785128f4c Make status and importance labels sortable again (#1040) 2022-04-16 18:40:10 +02:00
Veronica Berglyd Olsen
3ed74f0b02 Add test coverage of status and importance reordering 2022-04-16 18:35:26 +02:00
Veronica Berglyd Olsen
6aa13e318b Add sorting capability to status and importance labels 2022-04-16 18:17:01 +02:00
Veronica Berglyd Olsen
fd2248de17 Add up and down button icons 2022-04-16 17:44:54 +02:00
Veronica Berglyd Olsen
17c56440f2 Automatic indexing of un-indexed files (#1039)
* Downgrade rebuild index dialog from warning to info
* Don't flag index as broken if file is missing, just add it again
* Fix log warning
* Drop the return value in the index checker
2022-04-16 17:28:28 +02:00
Veronica Berglyd Olsen
b642e4437e Simplify text labels in XML (#1038) 2022-04-16 17:03:44 +02:00
Veronica Berglyd Olsen
2f547033cd Simplify all other strings in main project class 2022-04-16 17:00:08 +02:00
Veronica Berglyd Olsen
72c5a9ee92 Rename some internal variables in the NWItem class 2022-04-16 16:47:57 +02:00
Veronica Berglyd Olsen
048e5faa1f Also simplify item labels, due to XML limitations 2022-04-16 16:44:39 +02:00
Veronica Berglyd Olsen
c9f7fba7dd Re-implement the status and importance flags (#1034) 2022-04-16 16:32:48 +02:00
Veronica Berglyd Olsen
c5f92edaa8 Update the NWProject class test for status and import labels 2022-04-16 16:27:46 +02:00
Veronica Berglyd Olsen
d7a8cb1537 Rewrite NWStatus class tests 2022-04-16 15:38:13 +02:00
Veronica Berglyd Olsen
fedb064b1f Fix other tests 2022-04-16 15:01:55 +02:00
Veronica Berglyd Olsen
cf7e1da96a Fix display text issues in varuious GUI elements 2022-04-16 14:59:59 +02:00
Veronica Berglyd Olsen
e98e942f19 Replace key generator in the NWStatus class 2022-04-16 14:59:25 +02:00
Veronica Berglyd Olsen
ac904ee9fc Update sample project file 2022-04-05 23:15:18 +02:00
Veronica Berglyd Olsen
ddd8b60816 Complete the needed GUI class changes for the new NWStatus class 2022-04-05 23:13:39 +02:00
Veronica Berglyd Olsen
40e7055f16 Rewrite most of the NWStatus class 2022-04-05 22:08:14 +02:00
Veronica Berglyd Olsen
7298e1f438 Add two new utility functions to the common module 2022-04-05 22:07:20 +02:00
Myian
383364b165 Update nw_de_DE.ts 2022-04-05 20:28:27 +02:00
Myian
8e0c42afa9 Update about.py 2022-04-05 20:16:49 +02:00
Veronica K. B. Olsen
9c9408d78a Changing status or importance flags should still update hidden flags 2022-04-05 11:22:41 +02:00
Myian
d1a4fbf3ce Update CREDITS.md 2022-04-04 17:47:29 +02:00
Myian
d28e0743f0 Update about.py 2022-04-04 17:46:56 +02:00
Myian
bf3d89e550 Add files via upload 2022-04-04 17:33:52 +02:00
Veronica Berglyd Olsen
34b5181f34 Merge branch 'main' into multi_root 2022-04-03 22:53:45 +02:00
Veronica Berglyd Olsen
23fd6b815f Save both status and importance flags (#1030)
* Put the status icons in the status object itself
* Allow saving both status and importance values
* Update current tests
* Improve test coverage
* Update sample project file
2022-04-03 22:43:11 +02:00
Veronica Berglyd Olsen
bdde6a2080 Clean up handling of root and class info for items 2022-04-03 17:45:17 +02:00
Veronica Berglyd Olsen
37970bd446 Add root information to project file 2022-04-02 19:43:26 +02:00
Veronica Berglyd Olsen
f9ddcd2f8a Restructure the record of root items in the tree class 2022-04-02 19:13:54 +02:00
Veronica Berglyd Olsen
8ddda4783d Merge branch 'main' into multi_root 2022-04-02 17:42:37 +02:00
Veronica Berglyd Olsen
a04b44d890 Add Lorem Ipsum tool (#1028)
* Add a Lorem Ipsum dialog
* Add the Lorem Ipsum text and insert action
* Add test coverage
2022-04-02 17:41:35 +02:00
Veronica Berglyd Olsen
89558481de Merge branch 'main' into multi_root 2022-04-02 16:03:43 +02:00
Martijn
99cc3635f7 Add Dutch translation (#1027)
* Add @mvdkleijn as translator
* Update about.py
2022-03-23 19:22:44 +01:00
Veronica Berglyd Olsen
6e3262f78e Minor fixes and updates (#1026)
* Make the Tokenizer class an abstract class
* Fix error message when opening non-file project items
2022-03-20 17:00:29 +01:00
Veronica Berglyd Olsen
fbff421de8 Merge 1.6.2 (#1025) 2022-03-20 16:04:18 +01:00
Veronica Berglyd Olsen
cebe20964f Merge branch 'main' into merge_1.6.2 2022-03-20 15:59:12 +01:00
Veronica Berglyd Olsen
203e353e92 Release 1.6.2 (#1024) 2022-03-20 15:44:52 +01:00
Veronica Berglyd Olsen
8c4e5b99fe Only compute shasum of file if it exists (#1023) 2022-03-20 15:22:09 +01:00
Veronica Berglyd Olsen
16ce55ba60 Make sure empty files are indexed (#1022)
* Make sure also empty files are indexed
* Update comments
2022-03-20 15:09:46 +01:00
Veronica Berglyd Olsen
a2d33e9672 Merge 1.6.1 (#1019) 2022-03-16 23:15:39 +01:00
Veronica Berglyd Olsen
6317202626 Merge branch 'main' into merge_1.6.1 2022-03-16 23:11:59 +01:00
Veronica Berglyd Olsen
4cbbae6d2f Release 1.6.1 (#1018) 2022-03-16 23:01:14 +01:00
Veronica Berglyd Olsen
9e76498f65 Update Latin American Spanish translation (#1017) 2022-03-16 22:41:52 +01:00
Veronica Berglyd Olsen
1c7708babd Fix infinite search loop bug (#1016)
* Make sure the search loop in the editor cannot run infinitely
* Add test coverage of infinite search case
* Run GitHub actions against the patch branch
2022-03-16 22:34:29 +01:00
Veronica Berglyd Olsen
ce4d3c0b5c Update linting settings, and drop Ubuntu 18.04 releases (#1014)
* Add E133 and W503 to ignored list for flake8
* Drop making releases for Ubuntu 18.04
2022-03-15 22:07:33 +01:00
Veronica Berglyd Olsen
7f43584ed5 Merge bugfixes (#1009)
* Fix document margin recursion error (#1007)
* Fix project file icon path in Windows installer (#1006)
2022-02-24 21:19:12 +01:00
Veronica Berglyd Olsen
7532fdb1fc Fix project file icon path in Windows installer (#1006) 2022-02-24 21:08:42 +01:00
Veronica Berglyd Olsen
3cdba90bb0 Fix document margin recursion error (#1007) 2022-02-24 21:06:28 +01:00
Veronica Berglyd Olsen
011291f225 Drop support for Python 3.6 (#1004)
* Drop support for Python 3.6
* Remove unused time parsing function
* Use Python 3.7 datetime function for writing stats data conversion
* Test against Python 3.10 on macOS and Windows
2022-02-20 23:35:33 +01:00
Veronica Berglyd Olsen
045a595537 Implement project file format 1.4 (#993)
* Update the item class with more compact item storage format
* Bump version and file version
* Update tests
* Add explicit test coverage for format conversions for item class
* Update the documentation
2022-02-20 22:05:31 +01:00
Veronica Berglyd Olsen
be703c1f46 Merge Release 1.6 (#1003)
* Update Spanish translation
* Bumb version and update changelog and release notes
* Add a note in the changelog
2022-02-20 20:09:24 +01:00
Veronica Berglyd Olsen
45c4f3cb97 Add Out of Cheese Error (#1000)
* Add error dialog window title
* Add more error messages
2022-02-16 17:43:50 +01:00
Veronica Berglyd Olsen
3fdea6e57a Fix tests 2022-02-14 22:18:38 +01:00
Veronica Berglyd Olsen
05aa656e75 Remove checks for unique root 2022-02-14 22:18:16 +01:00
Veronica Berglyd Olsen
f8ddff9bc3 Update en_US, fr_FR, nb_NO and pt_BR (#992)
* Update en_US, fr_FR, nb_NO, pt_BR translations
* Add Dutch project localisation
2022-02-12 18:15:51 +01:00
Veronica Berglyd Olsen
7f2d51bd15 Make some corrections to the docs introduction section (#991) 2022-02-12 18:13:17 +01:00
Veronica Berglyd Olsen
45def4b3b7 Set a default editor font for Windows and macOS (#990)
* Set a specific default editor font for Windows and macOS as GUI font isn't suitable
* Fix wrong reference
2022-02-12 17:36:58 +01:00
Veronica Berglyd Olsen
67c94314ed Remove Ubuntu 21.04 release and add 22.04 (#987) 2022-02-06 23:47:37 +01:00
Veronica Berglyd Olsen
7f320d23ca Release 1.6 RC 1 (#986)
* Bump version, update changelog and base translation file
* Replace svg image for docs due to LaTeX build error
2022-02-06 23:27:10 +01:00
Veronica Berglyd Olsen
6d097f0bcb Add customisation help to docs (#984)
* Make sure user-defined themes folders exist in the data path
* Minor cleanup in shortcuts table
* Add details in docs on how to customise GUI and add dictionaries
* Add spell check reference in docs overview
2022-02-06 13:45:30 +01:00
Veronica Berglyd Olsen
d7f2fec8ad Fix typo in main README 2022-02-06 00:00:20 +01:00
Veronica Berglyd Olsen
5ee857f6f4 Add new docs theme, and restructure (#978)
* Change documentation theme to 'furo'
* Update docs source for new theme
* Update index and split introduction
* Add a Getting Started section to the docs
* Rename getting started docs file
* Reorganise setup instructions
* Update usage sections for consistency
* Update docs references in main README
* Show release in sidebar
2022-02-05 23:59:05 +01:00
Veronica Berglyd Olsen
07c92b4bc3 Simplify windows setup builder a bit (#983)
* Optimise setup file
* Shorten windows setup file name
2022-02-04 23:58:01 +01:00
Veronica Berglyd Olsen
a0cdf44deb Add a windows setup builder (#981)
* Add a package builder for windows install
* Remove old win installer build
* Update setup instructions
* Some minor clarifications to docs and README
2022-02-04 20:37:04 +01:00
Veronica Berglyd Olsen
71419eeda3 Update docs on install and project storage (#976)
* Add note to docs about Ubuntu repo on Debian (issue #956)
* Add section on project storage to docs (covers issue #960)
2022-01-25 18:29:23 +01:00
Veronica Berglyd Olsen
85ea9f5b19 Add automatic index rebuild (#975)
* Rebuild the index automatically if not all files are in the index on open
* Update tests
2022-01-25 17:41:34 +01:00
Veronica Berglyd Olsen
1a9efa4e1e Allow hiding scene and section titles in export builds (#974) 2022-01-23 15:57:51 +01:00
Veronica Berglyd Olsen
ec07cebb51 Handle IO error on document save (#961)
* Add try/except to document replace call
* Try the os.replace command 5 times
* Just use else condition on for loop instead
* Make the exceptions explicitly OSError
* Revert the os.replace loop, as this is not the issue
2022-01-19 19:13:08 +01:00
Veronica Berglyd Olsen
8b603d15a5 Add back in i18n instructions and revert changes to class labels (#970)
* Revert the duplicate class name labels since there was no real need
* Restore i18n instructions
2022-01-19 08:35:59 +01:00
Veronica Berglyd Olsen
074718aedc Clean up GUI text (#969)
* Remove all statustip entries in the menu
* Prune text in Preferences
* Fix class labels
* Remove some redundant tooltips
* Improve some labels and dialogs
* Remove some more tooltips and fix a typo
* Update base ts file
* Fix typo
2022-01-18 22:16:25 +01:00
Veronica Berglyd Olsen
25038e6cbb Add support for external translation tools (#968)
* Make some minor translation fixes
* Remove crowdin file and add import function for crowdin zip file
* Rename fallback project lang file to en_GB
* Update all i18n files from crowdin exports
* Fix tests
* Update docs
2022-01-18 19:17:20 +01:00
Veronica Berglyd Olsen
537bf921d2 Update Crowdin configuration file 2022-01-18 16:42:45 +01:00
Veronica Berglyd Olsen
f06048384d Add a base language file (#965) 2022-01-18 16:40:35 +01:00
Veronica Berglyd Olsen
56e96ec3aa Update Crowdin configuration file 2022-01-18 15:11:47 +01:00
Veronica Berglyd Olsen
95c9e9d695 Update Crowdin configuration file 2022-01-18 14:59:27 +01:00
Veronica Berglyd Olsen
cb587112da Update language files (#964) 2022-01-18 10:17:22 +01:00
Veronica Berglyd Olsen
306edec32d Remove dependency from i18n docs and fix JSON error in Chinese file (#963) 2022-01-18 09:44:49 +01:00
Veronica Berglyd Olsen
c1c6a370a5 Merge patch 1.5.5 (#955)
* Remove os.path.commonpath call (Issue #954)
* Bump version and update changelog and release notes
2022-01-05 16:24:34 +01:00
Veronica Berglyd Olsen
00b3c3e9d2 Release 1.6 Beta 1 (#953) 2022-01-04 22:52:18 +01:00
Veronica Berglyd Olsen
52efbcc89f Merge changes from 1.5.4 (#952)
* Backport fix to issue #950
* Bump version and update changelog and release notes
2022-01-04 21:12:32 +01:00
Veronica Berglyd Olsen
9be2519406 Resolve HTML render bug (#951)
* Fix bug breaking HTML rendering with angle brackets in other blocks than normal text
* Restore cursor if document viewer fails to load
* Improve test coverage
2022-01-04 20:52:36 +01:00
Veronica Berglyd Olsen
59e10fbf0a Make ODT export more LibreOffice friendly (#949)
* Make the ToODT class more LibreOffice friendly
* Update tests
2022-01-02 20:49:12 +01:00
Veronica Berglyd Olsen
79657a9d53 Fix line number update when searching (#947)
* Fix line position in footer not updating when searching
* Update and fix docstrings
2022-01-02 00:12:46 +01:00
Veronica Berglyd Olsen
0401b8556d Add result count to search and rewrite scroll past end feature (#946)
* Restore colours to dark theme search-replace icon
* Implement a working search result counter
* Disable scroll past end feature and clean up search/replace and update test
* Re-implement scroll past end feature as a static distance
* Stop the search box from resizing on every search
2022-01-01 19:36:04 +01:00
Veronica Berglyd Olsen
b0f939af32 Apply open document shortcuts to the tree that has focus (#945)
* Better handling of Enter/Return on GUI trees, resolves #913
* Update test
* Generalise open selected handle functions
* Improve test coverage
* Update docstring
2021-12-31 19:51:26 +01:00
Veronica Berglyd Olsen
7024254960 Simplify text width settings (#943)
* Remove the fixed text width switch, resolves #924
* Update tests
* Clean up code to set text width and add to viewer
2021-12-31 17:17:27 +01:00
Veronica Berglyd Olsen
6ac9e1aec4 Tighten up the item class (#937)
* Protect the attributes of the NWItem class
* Fix test coverage
* Add a type checker function to the tree class
2021-12-31 16:25:20 +01:00
Veronica Berglyd Olsen
af3d0d2eb0 Happy new year! (#941) 2021-12-31 15:56:43 +01:00
Veronica Berglyd Olsen
5afd402c8b Merge 1.5.3 fixes (#940)
* Resolve #918
* Resolve #935
* Bump version and update changelog and release notes
2021-12-31 14:58:17 +01:00
Veronica Berglyd Olsen
5e2ab4f612 Refactor core and base classes (#931)
* Improve the NWIndex class
* Improve the NWItem and NWDoc classes
* Make some optimisations in projects and update tests
* Minor changes to string formatting in main source file
* Add some more protection to core classes
* Make all converter class attributes private
2021-12-18 16:03:45 +01:00
Veronica Berglyd Olsen
2f75d88694 Merge hotfixes from 1.5.2 (#934)
* Backport fix for issue #929
* Make the spell check wrapper more robust, solves #933
* Bump version and update changelog and release notes
2021-12-12 17:30:38 +01:00
Veronica Berglyd Olsen
00eea24e3f Error logging and mutables as function defaults (#930)
* Remove mutable iterables as function defaults
* Improve error reporting and standardise how it's done
2021-11-10 00:32:01 +01:00
Veronica Berglyd Olsen
67d2e266fd Fix greater/lesser symbol bug in HTML conversion (#928)
* Fix issue with greater or lesser symbol in paragraph with formatting
* Add test coverage and make another fix to special case of mixing formats
2021-11-10 00:26:07 +01:00
Tommy Marplatt
32d6583ae3 Complete Latin American Spanish GUI localisation (es_419) (#927)
* Complete Latin American Spanish GUI localisation (es_419)
* LA Spanish localisation credits
2021-11-09 21:20:57 +01:00
Veronica Berglyd Olsen
e8bb130245 Code and GUI text cleanup (#926)
* Move int range checkers from options class to common file
* Improve error handling and reporting
* Make some minor improvements to init and test suite
* Fix 'trypewriter' to 'typewriter' typo
* Remove menu path description in dialog help text
* Improve the help text for entries in the Format menu
* Reword a couple of dialog messages
2021-11-07 18:17:17 +01:00
Veronica Berglyd Olsen
e71121f738 Fix docs build issues (#922)
* Remove python version in rtd config
* Try pinning docutils version
2021-10-31 23:42:25 +01:00
Veronica Berglyd Olsen
c17cec0574 Fix missing translation (#921)
* Fix missing translation of label
* Make some minor fixes to comments and logging
2021-10-31 23:10:29 +01:00
Veronica Berglyd Olsen
f562937e81 Add pylupdate6 tool to i18n (#920)
* Add the pylupdate code from PyQt6 source
* Fix linting errors in pylupdate6
* Update setup script, add readme and update debian copyright file
2021-10-31 22:43:00 +01:00
Tommy Marplatt
508d92c3e8 Improve the i18n readme (#917)
* Improve i18n readme.
* Make some minor clarifications and reformatting of the i18n readme file

Co-authored-by: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
2021-10-28 23:38:59 +02:00
Veronica Berglyd Olsen
299cde9cdf Improve handling of page breaks (#916)
* Remove page break from title and always allow for partition and chapter
* Move strip of format string into the Tokenizer class
* Fix page breaks in HTML for skip and sep
* Update documentation
* Update tests
* Allow page breaks before scene and section headers
* Never hide the scene header and instead default to skip line
2021-10-24 22:09:41 +02:00
Veronica Berglyd Olsen
da2685131d Update how translation files are built and added (#915)
* Fix wrapping of setup help text
* Fix wrong info in help description in setup
* Drop .pro file and generate lupdate arguments on the fly
* Generate lrelease arguments on the fly
* Update i18n readme file
2021-10-24 16:01:26 +02:00
Veronica Berglyd Olsen
9a484193eb Merge hotfixes from 1.5.1 (#914)
* Fix bug in translation source list and restore lost translations
* Fix shift focus to novel tree on Alt+1 when visible
* Bump version and update changelog and release notes
2021-10-23 16:23:01 +02:00
Veronica Berglyd Olsen
1c45331b0a Fix and optimise code (#904)
* Fix bug in early error reporting in main init
* Update docstrings and optimise code in GuiMain
* Update docstrings and optimise code in Config
* Update docstrings and optimise code in common module
* Update docstrings and optimise code in main project classes
* Update the OptionState class
* Update the spell checker class
* Update the file converter classes and extend tests
* Update the about, merge, split and item editor classes and extend tests
* Update item editor test
* Update about dialog tests
* Some minor test cleanup
* Fix typo and add clarification in contributing guide
2021-10-14 21:35:42 +02:00
Veronica Berglyd Olsen
2a06db0a2b Change how PPA key is added (#910) 2021-10-13 19:24:15 +02:00
Veronica Berglyd Olsen
180deb106b Add Python 3.10 to supported versions (#909)
* Add Python 3.10 to supported versions
* Make Python versions a string in action
2021-10-07 19:31:17 +02:00
Veronica Berglyd Olsen
662aab973c Fix error in debian setup instructions (#908) 2021-10-02 17:45:00 +02:00
Veronica Berglyd Olsen
3f972250d0 Post-release fixes and updates (#903)
* Add an extra pause to the windows scripts
* Update main readme
* Add mention of Linux Mint in docs
2021-09-19 16:04:34 +02:00
Veronica Berglyd Olsen
15ec1496c5 Update and reorganise themes (#893)
* Drop the subfolders for GUI themes
* Remove bundled font support
* Add safe file read function
* Allow loading themes from multiple locations
* Clean up unused variables
* Clean up icons class
* Merge icon theme icons
* Update icon theme class
* Remove guiDark config setting
* Fix tests
* Fix handling of default theme
* Update icon readmes
* Add test for getGuiItem common function
2021-09-19 14:09:20 +02:00
Veronica Berglyd Olsen
be3376272e Add selected words count feature (#899)
* Add a selected words counter in the document editor
* Update and extend test coverage
* Rename the functions to something more sensible
2021-09-19 13:59:36 +02:00
Veronica Berglyd Olsen
c852a5bda3 Add hash check on document read/write (#890)
* Add sha256sum function
* Add hash check to document class
* Make sha256sum test more thorough
* Handle exceptions in the sha256sum function directly
* Update test coverage
* Clarify title on dialog box
* Don't write blank lines in makeAlert
2021-09-19 13:55:54 +02:00
Veronica Berglyd Olsen
d65c5e93b6 Fix wrong format for version number 2021-09-19 13:54:14 +02:00
Veronica Berglyd Olsen
07ac88bfd6 Bump version to 1.6-alpha0 for next release cycle 2021-09-19 13:46:19 +02:00
Veronica Berglyd Olsen
1386be23f4 Setup fixes post 1.5 release (#902)
* The main version must now always include the patch number
* Fix bug in pip build script
* Fix bug in debian sha256 function call
2021-09-19 13:43:20 +02:00
Veronica Berglyd Olsen
18cadf8db5 Release 1.5 (#888)
* Bump version to 1.5 and update changelog and release notes
* Update changelog and release notes
2021-09-19 12:56:45 +02:00
Veronica Berglyd Olsen
cf83b6572e Update French translation (#901)
Co-authored-by: jyhelle <47108022+jyhelle@users.noreply.github.com>
2021-09-18 23:10:03 +02:00
Veronica Berglyd Olsen
22662fd5eb Dialog format error (#889)
* Remove redundant format tags in project class
* Be consistent about internal function mapping
2021-09-11 16:14:35 +02:00
Veronica Berglyd Olsen
3263ce5669 Package building fixes (#887)
* Fix a couple of errors in make scripts
* Fix snapshot versioning for launchpad
2021-09-11 14:30:58 +02:00
Veronica Berglyd Olsen
cbb527c464 Add a shasum function to setup and use it for all packages (#886) 2021-09-10 22:13:00 +02:00
Veronica Berglyd Olsen
9cd2bb232b Release 1.5 RC 1 (#885)
* Bump version and update release notes and changelog
* Delete old release notes
2021-09-10 18:41:40 +02:00
Veronica Berglyd Olsen
dcfb353537 Update en_US and nb_NO translations (#884)
* Update US English translation
* Update Norwegian translation
2021-09-10 17:46:30 +02:00
Veronica Berglyd Olsen
8313de692e Fix Project Details dialog update issue (#883)
* Move project details dialog to correct folder
* Add update functions that are run each time the project details dialog is opened
2021-09-10 01:06:40 +02:00
Veronica Berglyd Olsen
3c8cb34b0a Project tree status and total word count changes (#882)
* Fix some inconsistencies in source file docstrings
* Remove the option to show status text in project tree
* Change how total word counts are calculated and propagated
* Fix tests and improve coverage
* Add setting in preferences
* Add missing word count timer to config file
2021-09-10 00:38:45 +02:00
Veronica Berglyd Olsen
b9311e84ce Fix a few mistakes in the docs (#881) 2021-09-08 20:47:33 +02:00
Veronica Berglyd Olsen
50d0c1eb29 Add PPA support (#880)
* Clean up a few things in various setup function
* Add Launchpad-related setting to Debian build function
* Add signature feature to package builder and fix error in debian/copyright
* Update documentation
* Update README
2021-09-08 20:38:35 +02:00
Veronica Berglyd Olsen
a9cd0b29d4 Fix icon in main README 2021-09-01 23:46:00 +02:00
Veronica Berglyd Olsen
2037ef3eac Setup fixes and tweaks (#879)
* Fix transparency on some of the icons
* Rewrite the setup clean command
* Clean up setup script and remove no longer needed qthelp command
* Add bash scripts for common make build chains
* Update the description files and change how setup writes generated files
* Reduce the number of setup files added to minimal zip packages
2021-09-01 23:41:38 +02:00
Veronica Berglyd Olsen
0582b9718b Debian package builder (#876)
* Add debian build files
* Add debian package build code to setup script
* Update the licenses in debian/copyright
* Fix a typo in windows setup docs
* Remove duplicate files
* Add missing fallback icons to assets
2021-08-31 23:46:03 +02:00
Veronica Berglyd Olsen
bbed05b273 Merge patch 1.4.2 2021-08-31 00:04:40 +02:00
Veronica Berglyd Olsen
30f0e82fba Release 1.4.2 2021-08-30 23:36:42 +02:00
Veronica Berglyd Olsen
bdef9a3955 Fix smart quote issue (#874) 2021-08-30 23:23:47 +02:00
Veronica Berglyd Olsen
f6845a9820 Remove the difflib spellchecker (#875)
* Delete simple spell checker
* Clean up the spell checker code
* Update tests
* Delete the bundled dictionaries
* Update documentation
* Use set() for user word list
* Fix tests so they pass also without dictionaries installed
2021-08-30 22:39:27 +02:00
Veronica Berglyd Olsen
4b52f343c1 Packaging Updates (#873)
* Make setup-generated script names lower case
* Change how the manual.pdf file is handled
2021-08-29 16:27:59 +02:00
Veronica Berglyd Olsen
a00d0820cc Release 1.5 Beta 2 (#871)
* Bump version to 1.5b2 and update changelog and release notes
* Update sample project
2021-08-26 21:10:29 +02:00
Veronica Berglyd Olsen
cdc9ab4ad6 Update US English and Norwegian translations (#870)
* Fix typo in main menu
* Add missing source file to translation list
* Update en_US translation
* Update nb_NO translation
2021-08-26 18:46:55 +02:00
Veronica Berglyd Olsen
1fb9648c6c Drop grey icon themes (#869)
* Add settings translator for icon themes
* Rename `typicons_colour_*` to `typicons_*`
* Delete grey icon themes
* Delete outdated paragraph in main README
* Fix tests
2021-08-26 18:01:52 +02:00
Veronica Berglyd Olsen
3403d98c72 Rename package from 'nw' to 'novelwriter' (#868)
* Rename nw folder to novelwriter
* Rename nw to novelwriter in auxiliary files
* Rename nw to novelwriter in main app source
* Rename nw to novelwriter in tests
* Make setup script for pdf docs less spammy
2021-08-26 17:33:54 +02:00
Veronica Berglyd Olsen
2cf2eb9f55 Simplify the setup instructions for Windows (#865) 2021-08-25 23:24:00 +02:00
Veronica Berglyd Olsen
b5e52b80a3 Add a "Check for Updates" dialog (#863)
* Add basic dialog for Updates check
* Add GitHub API call and processing
* Finalise the update dialog
* Improve test coverage
2021-08-22 14:33:00 +02:00
Veronica Berglyd Olsen
80911af4d2 Release 1.5 Beta 1 (#858)
* Bump version to 1.5-beta1 and update changelog and release notes
2021-08-22 11:35:06 +02:00
Veronica Berglyd Olsen
7a80e6a55c Make Help select correct version of docs (#862) 2021-08-21 18:33:35 +02:00
Veronica Berglyd Olsen
7958cb530f Taskbar icon on windows (#861)
* Give app an unique ID when launching on Windows
* Improve test coverage
2021-08-21 17:10:19 +02:00
Veronica Berglyd Olsen
95c79e1c23 Documentation and ODT exporter updates (#859)
* Clean up a few things in the ODT exporter
* Remove local HTML docs and instead add PDF docs
* Update documentation
2021-08-20 17:16:14 +02:00
Veronica Berglyd Olsen
eee0f5e4c9 Include HTML docs in minimal installs (#856)
* Link to stable docs for stable release, otherwise latest docs
* Add build command to setup for making HTML docs
* Change the documentation menu entry to open either online or local HTML
* Update docs build instructions in docs
2021-08-18 00:13:28 +02:00
Veronica Berglyd Olsen
a9368904e5 GUI and code tweaks and fixes (#852)
* Improve format menu header descriptions
* Ensure that item status is parsed after item class from XML
* Fix column alignment in ToC.txt file
* Rename test variable and fix outdated docstring
* Fix ToC.txt underline
* Rename the Layout label on the item details panel
* Add option to emphasise H1 and H2 labels in the project tree
* Rename the main column of the novel tree to match project tree
* Use the same document icons in the outline as the project tree
* Move project tree settings to Project section of config file
2021-08-17 21:45:18 +02:00
Veronica Berglyd Olsen
f7c768bb91 Add project format documentation and popup box (#855)
* Add documentation of the various project file formats
* Add an info box  for updating to project format 1.3
* Add information on how to access the documentation
* Add a note on file format and rename a few things
* Fix some typos
2021-08-17 20:06:26 +02:00
Veronica Berglyd Olsen
f2b93f90f7 Fix a typo and fix section naming in docs 2021-08-16 18:12:09 +02:00
Veronica Berglyd Olsen
7d5661443f Improve Docs (#851)
* Split up the docs a bit more
* Improve documentation
2021-08-16 18:06:00 +02:00
Veronica Berglyd Olsen
460b350d85 Update docs and add menu entries for special titles (#850)
* Update Introduction chapter
* Update User Interface chapter
* Update Novel Projects chapter
* Update Novel Structure chapter
* Update Exporting Projects chapter
* Drop the asterisk notation for unnumbered chapters
* Add menu entries and tests for Novel Title and Unnumbered Chapter block formats
2021-08-15 23:30:11 +02:00
Veronica Berglyd Olsen
669f013c96 Fix issue with icons not updating when index is rebuilt (#849) 2021-08-15 21:40:45 +02:00
Veronica Berglyd Olsen
1bf584f9bf Add [NEW PAGE] page and [VSPACE] to Insert menu (#848)
* Add menu entries for inserting new page and vspace codes
* Update tests
2021-08-15 18:58:49 +02:00
Veronica Berglyd Olsen
97aebc5b84 Update Project Tree (#847)
* Rename index textCounts to fileMeta and add main header level
* Add new icons for document layouts
* Add function in NWItem to describe the item
* Use the icons and description in the project tree and details panel
* Remove flags column and add status column with optional full text
* Update handling and display of header level in editor
* Fix potential bug in project tree
* Update tests
2021-08-15 17:55:57 +02:00
Veronica Berglyd Olsen
cf7cd5502c Make PyQt5 minimum version requirement consistent (#846) 2021-08-15 10:21:37 +02:00
Veronica Berglyd Olsen
cf08ba1d39 ODT Export Fixes (#843)
* Fix issue with additional line breaks in ODT export
* Improve format handling in ToOdt, and remove some unused code
* Add test for tab in format
* Add class to write text formats to XML
* Simplify the XMLParagraph class a bit
* Correct a breach of ODT standard and add error checking
* Make some final corrections
2021-08-14 12:42:44 +02:00
Veronica Berglyd Olsen
c41e0efc73 Add a warning when opening novelWriter alpha version (#844) 2021-08-13 15:26:22 +02:00
Veronica Berglyd Olsen
bb1a778277 Merge Novel Layouts (#837)
* Merge novel layouts and simplify the Tokenizer class
* Fix core tests
* Delete auto-layout code
* Remove no longer needed item layouts
* Remove references to deleted item layouts in test
* Make some minor changes to Tokenizer class and update tests
* Update test reference files
* Update sample project
* Fix a few issues with the Tokenizer
* Centre some text in the sample documents
* Make some minor changes to how new projects are generated
* Add support for New Page and VSpace commands to the Tokenizer
* Remove Title and Page layouts and add codes for page break and vertical space
* Add document layout and fix some issues in index class with new title formats
* Update tests and reference files
* Bump the project file version and fix a minor issue in items class
* Update tests and test coverage
* Clean up some warnings and issues in tests
2021-08-02 23:44:35 +02:00
Veronica Berglyd Olsen
c6973043e6 Index Updates (#840)
* Improve the index keyword checker function
* Implement a more compact indented JSON encoder
* Remove timestamp from reference, novel and note indices
* Remove empty entries in reference index
* Merge novel and note indices into a single file index
2021-08-01 18:19:03 +02:00
Veronica Berglyd Olsen
e5c715695e Config class improvements (#826)
* Subclass ConfigParser
* Remove redundant variables and update tests
* Update file description
* Move NWConfigParser class to common.py
* Improve coverage of config class
* Use NWConfigParser also in themes.py
* Update config class file header
* Fix comment
* Update the usage of ConfigParser to recommended practice and extend tests
* Improve logging for info level a bit
2021-07-28 00:10:15 +02:00
Veronica Berglyd Olsen
e92506dc07 Bump version to 1.5-alpha0 for next release cycle 2021-07-28 00:05:42 +02:00
Veronica Berglyd Olsen
62344376d7 Bump version to 1.4.1, and update changelog and release notes 2021-07-27 23:46:15 +02:00
Veronica Berglyd Olsen
8cf96c3102 Make a clarification in the changelog 2021-07-27 23:31:04 +02:00
Veronica Berglyd Olsen
16fa8679d0 Bump version to 1.4 final, and update changelog and release notes 2021-07-27 23:30:44 +02:00
Veronica Berglyd Olsen
b517276156 Fix layout margins and z-order of some dialogs (#834)
* Fix layout margins on paged dialogs
* Make sure non-modal dialogs are only shown once and are on top
2021-07-26 16:40:20 +02:00
Veronica Berglyd Olsen
732450e163 Add CREDITS file and update README (#833)
* Add CREDITS file and update README
* Fix typo and add note in Libraries section of CREDITS
2021-07-25 16:50:12 +02:00
Veronica Berglyd Olsen
df8e3dd82b Update Contributing Guide (#832)
* Update Contributing Guide
* Minor improvements to README and CONTRIBUTING
2021-07-17 17:27:38 +02:00
Veronica Berglyd Olsen
75ddafd31d Update French translation (#829)
Co-authored-by: jyhelle <47108022+jyhelle@users.noreply.github.com>
2021-07-13 21:51:30 +02:00
Veronica Berglyd Olsen
4f38a8d16c Update the formatting section of the README (#828)
* Update the formatting section of the readme
* Use sup tags for footnotes in readme
2021-07-13 16:13:03 +02:00
Veronica Berglyd Olsen
35746103c7 i18n: Update en_US and nb_NO (#825)
* Update US English translation file
* Update Norwegian translation file
2021-07-13 15:37:24 +02:00
Veronica Berglyd Olsen
fb5347b8e4 Change the branching model (#827)
* Update workflows and add requirements-dev.txt
* Remove codecov from dev requirements
* Update readme and contributing guide
* Update PR template
2021-07-13 15:34:10 +02:00
Veronica Berglyd Olsen
6890b278ea Release 1.4 RC 1 (#824)
* Bump version to 1.4 RC 1
* Update changelog and release notes
2021-07-12 20:52:35 +02:00
Veronica Berglyd Olsen
9f667a0b35 Update code style to new standard 2021-07-05 16:28:44 +02:00
Veronica Berglyd Olsen
36be7b0b33 Test Coverage of the Editor (#787)
* Drop the _qDocument class variables
* Split up the current doceditor test file
* Add tests for editor init, load and save
* Add tests for editor meta functions and actions
* Add tests for editor insert functions
* Add tests for editor text manipulation and block formatting
* Fix code style
* Add text coverage for alignment and indent
2021-07-05 16:10:52 +02:00
Veronica Berglyd Olsen
1d16cc2a03 Move the coding of angle brackets in HTML to the innermost function in the chain (#821) 2021-07-04 18:05:26 +02:00
Veronica Berglyd Olsen
72fd2990e7 Merge branch 'main' into dev 2021-07-04 17:58:53 +02:00
Veronica Berglyd Olsen
6d7ca2bb86 Cleanup (#820)
* Update instructions and readmes
* Cleanup in base files
* Cleanup in core files
* Cleanup in gui files
* Cleanup in dialog files
* Cleanup in tools files
* Cleanup in test files
2021-07-04 17:57:54 +02:00
Veronica Berglyd Olsen
f10a8f9589 Update PR template 2021-07-04 17:56:40 +02:00
Veronica Berglyd Olsen
1881b3d32c Merge branch 'main' into dev 2021-07-02 10:25:56 +02:00
Veronica Berglyd Olsen
1b89d0a4f0 Logger messages (#818)
* Change the way logger messages are generated by using the printf-like method
* Use single quotes around log values that can be empty strings
* Fix bug in log message
2021-07-02 10:22:00 +02:00
용성지
671888b6ea add language support (Simplified Chinese - initial version) (#817)
* add translator's name in about dialog

* add new CN.ts

* Update nw_zh_CN.ts

* inital version (CN)

* add project_zh_CN.json

* Update project_zh_CN.json

* Revert changes to otherlanguage files

* Change case of first character in 'novelWriter' in Chinese translation

* Update about.py

Change the entry "Simplified Chinese" from English the local name of the language

Co-authored-by: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com>
2021-07-02 10:17:58 +02:00
Veronica Berglyd Olsen
50498a7462 Merge pull request #819 from vkbo/update_guides
Update guides
2021-07-01 20:28:41 +02:00
Veronica Berglyd Olsen
ecd190987e Add a pull request template 2021-07-01 20:23:21 +02:00
Veronica Berglyd Olsen
2c000f6808 Update contributing guide and i18n readme 2021-07-01 20:23:09 +02:00
Veronica Berglyd Olsen
c472e40b2b Fix workflow 2021-06-25 23:28:38 +02:00
Veronica Berglyd Olsen
0575f89ae9 Remove alignments in arguments for format statements 2021-06-25 23:20:15 +02:00
Veronica Berglyd Olsen
e1dcfaa1e3 Drop dictionary alignment by colon 2021-06-25 23:14:13 +02:00
Veronica Berglyd Olsen
486af84107 Merge pull request #816 from vkbo/style
Style
2021-06-25 21:56:03 +02:00
Veronica Berglyd Olsen
8acbd8b978 Update contributing guide with new restrictions 2021-06-25 21:48:50 +02:00
Veronica Berglyd Olsen
7f9180e356 Update workflow 2021-06-25 21:39:24 +02:00
Veronica Berglyd Olsen
26912f226f Add double space before in-line comments 2021-06-25 21:36:52 +02:00
Veronica Berglyd Olsen
0c286231cc Remove multiple hashes before comments 2021-06-25 21:11:25 +02:00
Veronica Berglyd Olsen
991a61f2f6 Remove encoding line and add spaces between classes and functions, tests 2021-06-25 21:04:48 +02:00
Veronica Berglyd Olsen
edfd7c9770 Remove encoding line and add spaces between classes and functions 2021-06-25 20:53:33 +02:00
Veronica Berglyd Olsen
ad62faaeea Fix broken links in docs 2021-06-13 20:03:53 +02:00
Veronica Berglyd Olsen
468903bbeb Merge pull request #812 from vkbo/release_1.4beta1
Release 1.4 Beta 1
2021-06-13 20:01:03 +02:00
Veronica Berglyd Olsen
0723f44dc3 Update changelog and release notes 2021-06-13 19:56:16 +02:00
Veronica Berglyd Olsen
831bdabfc6 Bumped version to 1.4-beta1 2021-06-13 19:12:10 +02:00
Veronica Berglyd Olsen
93a3eed530 Merge pull request #804 from vkbo/text_align
Text alignment and indent
2021-06-13 19:10:15 +02:00
Veronica Berglyd Olsen
307a52e7f4 Update documentation 2021-06-13 19:07:36 +02:00
Veronica Berglyd Olsen
3246f4bfcc Add tests for the menu functions 2021-06-13 18:46:35 +02:00
Veronica Berglyd Olsen
fa4f4a8db4 Make the comment format action a toggle feature 2021-06-13 18:32:11 +02:00
Veronica Berglyd Olsen
cb797fe903 Add menu entries for align and indent 2021-06-13 18:28:23 +02:00
Veronica Berglyd Olsen
618461b1ff Merge branch 'dev' into text_align 2021-06-13 17:59:47 +02:00
Veronica Berglyd Olsen
e2f08d3c76 Merge branch 'main' into dev 2021-06-13 17:58:49 +02:00
Veronica Berglyd Olsen
f39cda729d Merge pull request #811 from vkbo/release_1.3.3
Release 1.3.3
2021-06-13 17:13:54 +02:00
Veronica Berglyd Olsen
b28d826d76 Updated changelog and release notes 2021-06-13 17:11:19 +02:00
Veronica Berglyd Olsen
57ae559723 Merge pull request #810 from vkbo/wcount_when_delete
Update project word count when a file is permanently deleted
2021-06-13 16:57:31 +02:00
Veronica Berglyd Olsen
1d1be18689 Bumped version to 1.3.3 2021-06-13 16:56:29 +02:00
Veronica Berglyd Olsen
141b5eb776 Update project word count when a file is permanently deleted 2021-06-13 16:53:40 +02:00
Veronica Berglyd Olsen
3f941bf9fd Merge branch 'dev' into text_align 2021-06-11 00:11:40 +02:00
Veronica Berglyd Olsen
a48f302531 Merge branch 'main' into dev 2021-06-11 00:11:19 +02:00
Veronica Berglyd Olsen
12d8872973 Merge pull request #809 from vkbo/item_tags
Make XML parser for items less picky
2021-06-11 00:10:46 +02:00
Veronica Berglyd Olsen
40ff865989 Make XML parser for items less picky 2021-06-11 00:01:58 +02:00
Veronica Berglyd Olsen
32e9c10702 Fix word counter for align and indent tags 2021-06-10 23:38:11 +02:00
Veronica Berglyd Olsen
804dd3bb7c Merge branch 'dev' into text_align 2021-06-10 22:52:47 +02:00
Veronica Berglyd Olsen
9f2e3a66cd Merge branch 'main' into dev 2021-06-10 22:51:45 +02:00
Veronica Berglyd Olsen
960d1967a3 Merge pull request #808 from vkbo/focus_keys
Focus keys
2021-06-10 22:45:18 +02:00
Veronica Berglyd Olsen
ad025c3fe4 Merge branch 'main' into focus_keys 2021-06-10 22:42:40 +02:00
Veronica Berglyd Olsen
81212a108e Merge pull request #807 from vkbo/setup_win_encoding
Make the extractVersion function in setup a bit more robust
2021-06-10 22:42:30 +02:00
Veronica Berglyd Olsen
8637a4eb12 Merge branch 'main' into focus_keys 2021-06-10 22:35:55 +02:00
Veronica Berglyd Olsen
0e4489d627 Merge branch 'main' into setup_win_encoding 2021-06-10 22:33:04 +02:00
Veronica Berglyd Olsen
0bfb9d0700 Update docs 2021-06-10 22:18:51 +02:00
Veronica Berglyd Olsen
efe759b94e Change focus shortcuts on Window as they conflict with alt codes 2021-06-10 22:16:06 +02:00
Veronica Berglyd Olsen
9f89c1f7a4 Merge pull request #806 from vkbo/cleanup_alerts
Fix translations and refactor makeAlert calls
2021-06-10 22:10:32 +02:00
Veronica Berglyd Olsen
530d92cc3f Make the extractVersion function in setup a bit more robust 2021-06-10 22:08:26 +02:00
Veronica Berglyd Olsen
b0225515d2 Remove isinstance check in error reporting 2021-06-10 21:55:40 +02:00
Veronica Berglyd Olsen
d511c69ee7 Rewrap some alert messages 2021-06-10 21:51:52 +02:00
Veronica Berglyd Olsen
6e1e40f13e Fix translations and refactor makeAlert calls 2021-06-10 21:42:40 +02:00
Veronica Berglyd Olsen
70d3ee07bf Update sample project 2021-06-10 21:39:58 +02:00
Veronica Berglyd Olsen
e5477f314e Add support for indented paragraphs in exports 2021-06-10 21:38:58 +02:00
Veronica Berglyd Olsen
80c4826253 Added left/right indentation to Tokenizer class 2021-06-10 00:04:54 +02:00
Veronica Berglyd Olsen
e0de3ff191 Improve test coverage 2021-06-09 23:40:37 +02:00
Veronica Berglyd Olsen
239cff3dee Fix tests 2021-06-09 23:32:22 +02:00
Veronica Berglyd Olsen
6f9e3168b0 Fix default alignment 2021-06-09 23:05:16 +02:00
Veronica Berglyd Olsen
7d067f807d Add text alignment tags 2021-06-09 22:08:31 +02:00
Veronica Berglyd Olsen
a7b43699ed Merge pull request #802 from teymour-aldridge/patch-1
Remove redundant assignment.
2021-06-09 19:46:48 +02:00
Teymour Aldridge
7d11917d1c Remove redundant assignment. 2021-06-09 18:42:16 +01:00
Veronica Berglyd Olsen
904ba9b1ca Merge branch 'main' into dev 2021-05-30 12:27:30 +02:00
Veronica Berglyd Olsen
616fe35ed5 Merge pull request #797 from vkbo/release_1.3.2
Release 1.3.2
2021-05-30 12:17:58 +02:00
Veronica Berglyd Olsen
577a3c6c6a Bump version to 1.3.2 and update changelog 2021-05-30 12:14:41 +02:00
Veronica Berglyd Olsen
e937267eb0 Merge pull request #796 from vkbo/split_tool
Fix split tool dropping last line (#795)
2021-05-30 11:58:28 +02:00
Veronica Berglyd Olsen
2c1e1b94e7 Fix split tool dropping last line (#795) 2021-05-30 11:55:56 +02:00
Veronica Berglyd Olsen
60736ce04c Update readme 2021-05-25 19:23:34 +02:00
Veronica Berglyd Olsen
03daa350f8 Merge branch 'main' into dev 2021-05-23 16:37:24 +02:00
Veronica Berglyd Olsen
095cc38122 Merge pull request #786 from vkbo/allow_line_breaks
Allow line breaks
2021-05-23 16:35:09 +02:00
Veronica Berglyd Olsen
142d659b70 Fix an issue with markdown export 2021-05-23 16:31:06 +02:00
Veronica Berglyd Olsen
0826a2f8a3 Remove trailing space highlight and add highlight of redundant spaces 2021-05-23 16:17:05 +02:00
Veronica Berglyd Olsen
a3819a7785 Update docs 2021-05-23 15:20:26 +02:00
Veronica Berglyd Olsen
2314777b4b Add test coverage 2021-05-23 15:04:26 +02:00
Veronica Berglyd Olsen
729e97a95d Add function to clean up line breaks 2021-05-23 14:39:02 +02:00
Veronica Berglyd Olsen
5ab60ca4a3 Fix test 2021-05-23 13:15:09 +02:00
Veronica Berglyd Olsen
f1adff82a8 Remove hard line break menu entry 2021-05-23 13:13:03 +02:00
Veronica Berglyd Olsen
96b2d139c9 Allow line breaks in paragraphs 2021-05-23 13:08:10 +02:00
Veronica Berglyd Olsen
e1bc1222c4 Merge pull request #784 from vkbo/xdg_setup
Add entry in xdg-install to remove old desktop icon
2021-05-22 10:55:53 +02:00
Veronica Berglyd Olsen
0bff4a3d21 Add entry in xdg-install to remove old desktop icon 2021-05-22 10:50:21 +02:00
Veronica K. B. Olsen
dfc775c925 Fix merge from main 2021-05-17 20:28:36 +02:00
Veronica K. B. Olsen
dea304d1eb Merge branch 'main' into dev 2021-05-17 20:27:08 +02:00
Veronica Berglyd Olsen
cfd80645e2 Merge pull request #782 from vkbo/meta_stats
Clear handle when tree details panel is cleared
2021-05-17 20:25:36 +02:00
Veronica K. B. Olsen
4b7f7887c8 Clear handle when tree details panel is cleared 2021-05-17 20:07:56 +02:00
Veronica Berglyd Olsen
9fc640aa59 Merge pull request #780 from vkbo/class_cleanup
GUI Class Cleanup
2021-05-17 17:02:39 +02:00
Veronica K. B. Olsen
d812aab173 Update gitignore with versions files 2021-05-17 16:58:52 +02:00
Veronica K. B. Olsen
39b58711c7 Make some GuiItemDetails variables private 2021-05-17 16:58:07 +02:00
Veronica K. B. Olsen
c6120fcf7c Make some GuiDocViewer variables private 2021-05-17 16:57:49 +02:00
Veronica Berglyd Olsen
45b9215c87 Merge pull request #779 from vkbo/editor_cleanup
Editor Code Improvements
2021-05-16 19:02:57 +02:00
Veronica K. B. Olsen
394f6adf82 Remove no longer needed forward function 2021-05-16 17:35:33 +02:00
Veronica K. B. Olsen
1a5076438d Add a signal for updated word counts 2021-05-16 17:31:12 +02:00
Veronica K. B. Olsen
872b8e7902 Fix broken tests 2021-05-16 16:57:00 +02:00
Veronica K. B. Olsen
0cad96fdca Use an enum to pass values to the status bar LEDs 2021-05-16 16:43:44 +02:00
Veronica K. B. Olsen
e9ef4fd091 Make sure slots and signals are correct type 2021-05-16 16:26:03 +02:00
Veronica K. B. Olsen
4ce8b38acd Add editorDocumentChanged signal in GuiDocEditor 2021-05-16 00:41:44 +02:00
Veronica K. B. Olsen
24ab6f2d3b Make the editor dictionary internal 2021-05-16 00:19:40 +02:00
Veronica K. B. Olsen
ba5e5f4bb5 Make GuiDocEditor variables private 2021-05-15 23:57:31 +02:00
Veronica K. B. Olsen
6ef8611a0a Merge branch 'main' into dev 2021-05-08 21:41:36 +02:00
Veronica Berglyd Olsen
486676baa5 Merge pull request #777 from vkbo/release_1.3.1
Release 1.3.1
2021-05-06 22:26:25 +02:00
Veronica K. B. Olsen
542cbf13ff Update changelog and release notes 2021-05-06 22:23:22 +02:00
Veronica K. B. Olsen
62630eb519 Merge branch 'main' into release_1.3.1 2021-05-06 22:08:11 +02:00
Veronica Berglyd Olsen
b1d597e63f Merge pull request #776 from vkbo/issue769_handles_on_windows
Issue #769: Generating handles on Windows
2021-05-06 22:07:36 +02:00
Veronica Berglyd Olsen
887eee01fc Merge branch 'main' into issue769_handles_on_windows 2021-05-06 22:05:34 +02:00
Veronica K. B. Olsen
f605f1fc75 Solve an unwante error message when creating a new project 2021-05-06 22:02:59 +02:00
Veronica K. B. Olsen
cc8fc38734 Update the handle generator test 2021-05-06 21:58:35 +02:00
Veronica K. B. Olsen
5797b8655d {#769) Fix problem with handle collisions when generated rapidly in Windows 2021-05-06 21:58:08 +02:00
Veronica K. B. Olsen
fd4d663a1c Bump version to 1.3.1 2021-05-06 21:43:43 +02:00
Veronica Berglyd Olsen
88263d55f2 Merge pull request #774 from vkbo/issue773_qtranslate_filepath
Issue #773: Fix QTranslate() filePath issue
2021-05-06 12:52:58 +02:00
Veronica Berglyd Olsen
5c4398f948 Some more tweaks to Linux workflow 2021-05-06 12:50:00 +02:00
Veronica Berglyd Olsen
9ff397dfbc Build translation on Linux workflow 2021-05-06 12:44:58 +02:00
Veronica Berglyd Olsen
1c9ebfd11c Improve feedback and documentation for i18n 2021-05-06 12:33:15 +02:00
Veronica Berglyd Olsen
22e8d7ee71 (#773) Fix Qt 5.15 only call in Config 2021-05-06 10:35:16 +02:00
Veronica K. B. Olsen
35458a7e37 Fix wrong location of parameter in setup.cfg 2021-05-05 19:50:17 +02:00
Veronica Berglyd Olsen
c1544ab374 Merge pull request #760 from vkbo/doc_class
Non-Reusable Document Class
2021-05-02 19:53:20 +02:00
Veronica K. B. Olsen
d795eb6f5f Delete no longer needed test reference files 2021-05-02 19:47:39 +02:00
Veronica K. B. Olsen
ce8264b8f2 New split tool test 2021-05-02 19:47:04 +02:00
Veronica K. B. Olsen
c6cbc8a8b1 New merge tool test 2021-05-02 18:52:36 +02:00
Veronica K. B. Olsen
6c79a1daba Test terminology update 2021-05-02 17:48:28 +02:00
Veronica K. B. Olsen
7867965989 Alter the init logic of handles in NWDoc 2021-05-02 17:19:50 +02:00
Veronica K. B. Olsen
348513a248 Merge branch 'dev' into doc_class 2021-05-02 17:14:15 +02:00
Veronica K. B. Olsen
eb62253137 Merge branch 'main' into dev 2021-05-02 17:12:41 +02:00
Veronica K. B. Olsen
6b119cf4b8 Remove the return false on error in doc viewer 2021-04-25 23:58:11 +02:00
Veronica K. B. Olsen
88d198403e Update translations 2021-04-25 23:47:42 +02:00
Veronica K. B. Olsen
5ee39d7ecc Tighten up the use of item and nwdoc objects in editor class 2021-04-25 23:46:09 +02:00
Veronica K. B. Olsen
e7102725bd Update translations 2021-04-25 23:24:21 +02:00
Veronica K. B. Olsen
bd28867804 Update tests 2021-04-25 23:22:05 +02:00
Veronica K. B. Olsen
0eb09a2136 Move error reporting out of the NWDoc class 2021-04-25 23:21:51 +02:00
Veronica K. B. Olsen
470daf0036 Make NWDoc class non-reusable 2021-04-25 23:01:20 +02:00
Veronica K. B. Olsen
fd28cbca4e Merge branch 'main' into dev 2021-04-25 18:25:12 +02:00
Veronica Berglyd Olsen
e865b2c054 Merge pull request #758 from vkbo/class_cleanup
Class Cleanup
2021-04-25 18:02:25 +02:00
Veronica K. B. Olsen
f8243f6934 Update translation files 2021-04-25 17:52:07 +02:00
Veronica K. B. Olsen
746268c3ef GUI classes should only init with main GUI as parent 2021-04-25 17:50:11 +02:00
Veronica K. B. Olsen
48695651e1 Core classes should only init with project class and if needed access main gui via project 2021-04-25 17:39:52 +02:00
Veronica K. B. Olsen
45f726669e Remove the showStatus flag from document handling 2021-04-25 17:16:57 +02:00
Veronica K. B. Olsen
d473615ccf Rename open and save document to read and write in NWDoc 2021-04-25 17:10:12 +02:00
Veronica K. B. Olsen
1e48c6dcfe Merge branch 'main' into dev 2021-04-25 11:27:13 +02:00
Veronica K. B. Olsen
51431169dd Merge branch 'main' into dev 2021-04-23 22:02:59 +02:00
Veronica K. B. Olsen
81e72826ce Merge branch 'main' into dev 2021-04-18 18:18:05 +02:00
Veronica K. B. Olsen
8190c189e5 Merge branch 'testing' into dev 2021-04-18 17:33:54 +02:00
Veronica K. B. Olsen
06dcaff806 Merge branch 'testing' into dev 2021-04-06 17:49:28 +02:00
Veronica K. B. Olsen
4ee5890d90 Merge branch 'testing' into dev 2021-03-31 19:03:42 +02:00
Veronica K. B. Olsen
bd888451ec Merge branch 'testing' into dev 2021-03-29 18:52:36 +02:00
Veronica K. B. Olsen
fd7319b295 Merge branch 'testing' into dev 2021-03-29 18:39:36 +02:00
Veronica K. B. Olsen
06a13557e3 Merge branch 'testing' into dev 2021-03-28 18:15:40 +02:00
Veronica K. B. Olsen
e92ac2b30d Merge branch 'testing' into dev 2021-03-28 15:23:16 +02:00
Veronica K. B. Olsen
56a5559024 Merge branch 'testing' into dev 2021-03-21 17:18:43 +01:00
Veronica K. B. Olsen
3664266eed Merge branch 'testing' into dev 2021-03-17 22:58:28 +01:00
Veronica K. B. Olsen
909114e318 Merge branch 'testing' into dev 2021-03-17 21:13:51 +01:00
Veronica K. B. Olsen
03beae30ca Move dev branch to version 1.4-alpha0 2021-03-17 11:33:37 +01:00
716 changed files with 89081 additions and 424095 deletions

24
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,24 @@
<!--
Please check the following before you make a pull request:
* The branch you are making the pull request from (in your own fork) has a unique and descriptive
name. Do not make a pull request directly from your copy of `main`.
* If you are submitting translation files, only submit the files that you have added translations
to, not the other .ts files that may have been updated in the process.
* Make sure your contribution follows the style guide and other requirements mentioned in the
CONTRIBUTING.md file in the repository.
* Fill in the Summary section below, and if relevant, mention the issue numbers related to the PR.
-->
**Summary:**
**Related Issue(s):**
**Reviewer's Checklist:**
* [ ] The header of all files contain a reference to the repository license
* [ ] The overall test coverage is increased or remains the same as before
* [ ] All tests are passing
* [ ] All flake8 checks are passing and the style guide is followed
* [ ] Documentation (as docstrings) is complete and understandable
* [ ] Only files that have been actively changed are committed

View File

@@ -2,28 +2,32 @@ name: flake8
on:
push:
branches: [ main, testing, dev ]
branches:
- main
- patch
pull_request:
branches: [ main, testing, dev ]
branches:
- main
- patch
jobs:
checkSyntax:
runs-on: ubuntu-latest
steps:
- name: Python Setup
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: 3
architecture: x64
- name: Checkout Source
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install flake8
run: pip install flake8
- name: Syntax Error Check
run: |
flake8 nw --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 novelwriter --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 tests --count --select=E9,F63,F7,F82 --show-source --statistics
- name: Coding Style Violations
run: |
flake8 nw --count --max-line-length=99 --ignore E203,E221,E226,E228,E241,E251,E261,E266,E302,E305 --show-source --statistics
flake8 tests --count --max-line-length=99 --ignore E203,E221,E226,E228,E241,E251,E261,E266,E302,E305 --show-source --statistics
flake8 novelwriter --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics
flake8 tests --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics

View File

@@ -2,39 +2,42 @@ name: Linux
on:
push:
branches: [ main, testing, dev ]
branches:
- main
- patch
pull_request:
branches: [ main, testing, dev ]
branches:
- main
- patch
jobs:
testLinux:
strategy:
matrix:
python-version: [3.6, 3.7, 3.8, 3.9]
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
runs-on: ubuntu-latest
steps:
- name: Python Setup
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python-version }}
architecture: x64
- name: Install Packages
- name: Install Packages (apt)
run: |
sudo apt update
sudo apt install libenchant-dev qt5-default
sudo apt install libenchant-dev qttools5-dev-tools aspell-en
- name: Checkout Source
uses: actions/checkout@v2
- name: Install Dependencies
uses: actions/checkout@v3
- name: Install Dependencies (pip)
run: |
pip install --upgrade pip
pip install -r requirements.txt
pip install pytest-timeout
pip install pytest-cov
pip install pytest-qt
pip install codecov
pip install -r requirements-dev.txt
- name: Run Build Commands
run: python setup.py qtlrelease sample
- name: Run Tests
run: |
export QT_QPA_PLATFORM=offscreen
pytest -v --cov=nw --timeout=60
pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3

View File

@@ -2,36 +2,37 @@ name: macOS
on:
push:
branches: [ main, testing, dev ]
branches:
- main
- patch
pull_request:
branches: [ main, testing, dev ]
branches:
- main
- patch
jobs:
testMac:
runs-on: macos-latest
steps:
- name: Python Setup
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: 3.9
python-version: "3.10"
architecture: x64
- name: Install Packages
run: |
brew install enchant
- name: Checkout Source
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Dependencies
run: |
pip install --upgrade pip
pip install -r requirements.txt
pip install -r requirements-dev.txt
pip install pyobjc
pip install pytest-timeout
pip install pytest-cov
pip install pytest-qt
pip install codecov
- name: Run Tests
run: |
export QT_QPA_PLATFORM=offscreen
pytest -v --cov=nw --timeout=60
pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3

View File

@@ -2,31 +2,32 @@ name: Windows
on:
push:
branches: [ main, testing, dev ]
branches:
- main
- patch
pull_request:
branches: [ main, testing, dev ]
branches:
- main
- patch
jobs:
testWin:
runs-on: windows-latest
steps:
- name: Python Setup
uses: actions/setup-python@v2
uses: actions/setup-python@v4
with:
python-version: 3.9
python-version: "3.10"
architecture: x64
- name: Checkout Source
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Dependencies
run: |
pip install --upgrade pip
pip install -r requirements.txt
pip install pytest-timeout
pip install pytest-cov
pip install pytest-qt
pip install codecov
pip install -r requirements-dev.txt
- name: Run Tests
run: |
pytest -v --cov=nw --timeout=60
pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3

15
.gitignore vendored
View File

@@ -1,33 +1,38 @@
# Setup/Install
/MANIFEST
/dist/
/build/
/deploy/
/dist/
/dist_*/
*.spec
*.egg-info
setup.iss
novelwriter.desktop
novelWriter.pyw
/novelwriter.desktop
/novelWriter.pyw
# Translations
/nw/assets/i18n/*.qm
/novelwriter/assets/i18n/*.qm
.qmake.stash
i18n/*.qm
i18n/*.qph
# Documentation
/docs/build/
/novelwriter/assets/help/
/novelwriter/assets/manual.pdf
*.qch
*.qhc
.~lock.*
# Python Temp
__pycache__
*.pyc
# Sample Project
/nw/assets/sample.zip
/novelwriter/assets/sample.zip
/sample/cache
/sample/meta
/sample/versions
*.bak
*.lock
ToC.txt

View File

@@ -20,6 +20,5 @@ formats:
# Optionally set the version of Python and requirements required to build your docs
python:
version: 3.7
install:
- requirements: docs/source/requirements.txt

File diff suppressed because it is too large Load Diff

View File

@@ -2,75 +2,131 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
Examples of behavior that contributes to a positive environment for our
community include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior by participants include:
Examples of unacceptable behavior include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Publishing others' private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
## Enforcement Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official e-mail address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project leader at issues (at) novelwriter.io. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
reported to the community leaders responsible for enforcement at issues (at)
novelwriter.io. All complaints will be reviewed and investigated promptly and
fairly.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
## Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
### 1. Correction
**Community Impact**: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
**Consequence**: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
### 2. Warning
**Community Impact**: A violation through a single incident or series of
actions.
**Consequence**: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
### 3. Temporary Ban
**Community Impact**: A serious violation of community standards, including
sustained inappropriate behavior.
**Consequence**: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
### 4. Permanent Ban
**Community Impact**: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
**Consequence**: A permanent ban from any sort of public interaction within the
community.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
version 2.1, available at
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
Community Impact Guidelines were inspired by
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
For answers to common questions about this code of conduct, see the FAQ at
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
[https://www.contributor-covenant.org/translations][translations].
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
[Mozilla CoC]: https://github.com/mozilla/diversity
[FAQ]: https://www.contributor-covenant.org/faq
[translations]: https://www.contributor-covenant.org/translations

View File

@@ -1,39 +1,47 @@
# Contributing Guide
When contributing to this repository, please first discuss the change you wish to make via the
issue tracker or the discussions page with the owner of this repository before making a change. If
you just want to make a minor correction, like fix a typo or similar, feel free to just make a pull
request directly.
issue tracker or the discussions page with the owner of this repository. Especially if it is
regarding new features. If you just want to make a minor correction, like fix a typo or similar,
feel free to just make a pull request directly.
## Branching Structure
The following contributions are welcome:
There are three protected branches on this repository. They are used in the following way:
* Bugfixes for new or existing bugs. Please also report new bugs in the issue tracker even if you
also provide a fix. It makes it easier to keep track of what has been fixed and when.
* Translations via the [crowdin project page](https://crowdin.com/project/novelwriter).
* Improvements to the documentation. Particularly if the documentation is unclear. Please don't
make any larger changes to the documentation without discussing if with the maintainer first.
* Adaptations, installation or packaging features targeting specific operating systems.
* `main` – This is the Stable branch. It is used for releases and subsequent patches. No
development code should be merged into this branch starting from version 1.0.
* `dev` – This is the Unstable (development) branch. It is where new features are merged, and where
pre-releases are taken from.
* `testing` – This is the Testing branch. It is populated from the `dev` branch for pre-releases
that need a longer testing phase.
Please do not:
Stable releases and patches will be tagged in the `main` branch, pre-releases may be tagged from
either `testing` or `dev` branch.
* Make a pull request that restructures or reformats existing code. If you think some parts of the
code could be improved, please make an issue thread or start a discussion. The same applies to
any text document in the repository.
### What Branch to Use for Contributions
## Pull Requests
* If your contribution is a fix for the latest stable release, branch from the `main` branch.
* If your contribution is a fix for the latest testing release, branch from the `testing` branch.
* If your contribution is a new feature, branch from the `dev` branch.
This project follows the [OneFlow](https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow)
model. The `main` branch is the default branch. For general changes, please make a new branch in
your own fork from the current `main` branch. Do not make pull requests from your own `main`
branch.
## Pull Request Process
**Note:** If your contribution is a bugfix for a specific version, please make a bugfix branch from
the tag you want the fix to be applied to, not directly from the `main` branch. This is important.
1. Make sure your code passes all tests and conforms to the style guide. You can check that the
code conforms by running `flake8` from the root of the project folder.
2. Please provide a complete description of the changes in the pull request, and a summary that can
be copied into the [CHANGELOG](CHANGELOG.md). Remember to reference any issue related by
providing the issue number.
3. Do not change the version number. Version numbers are bumped in separate release pull requests
by the maintainer.
Also check the following:
* Make sure your code passes all tests and conforms to the style guide. You can check that the
code generally conforms by running the Python linting tool `flake8` from the root of the project
folder, although it doesn't check everything. The same check is also run on pull requests by the
maintainer.
* Please provide a description of the changes in the pull request under the summary section of the
pull request template, and reference any related issues by providing the issue number.
* Do not change the version number.
* Do not submit files that were not actively changed but have otherwise been modifed. This is
mostly an issue with translation files. The language tool may update all files in the `i18n`
folder.
## Code of Conduct
@@ -52,92 +60,63 @@ Please see the [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) file for the full text.
## Code Style Guide
The source code of novelWriter broadly follows the [PEP8](https://www.python.org/dev/peps/pep-0008)
style guide, but with a few modifications and exceptions listed below.
style guide, but with a few exceptions. Some key points are listed below.
### Line Length
**Line Length:**
For this project, source lines should stay within the 79 and 99 character limits described by PEP8.
79 characters is often too restrictive, so 99 character lines are acceptable when that is more
practical. Readability has priority. Generally, if a code statement requires multiple lines, the
lines should wrap at 79 characters, not 99. If wrapping can be avoided by going to 99, then that is
generally preferrable.
* Source code lines can extend to the upper limit of 99 characters allowed by PEP8. 79 characters
is the recommended line length in PEP8, but this is often too restrictive. 99 characters are
acceptable when that is more practical. Readability has priority. Generally, if a code statement
requires multiple lines, the lines should wrap at 79 characters if possible. If wrapping can be
avoided by going to 99, then that is generally preferrable.
* For text files, the text should be wrapped at 99 character. The exception is markdown image tags
and urls which can run past that limit.
For text files, the text should also be wrapped at 99 character. The exception is markdown image
tags and urls.
**Variable and Function Names**
Please do not submit pull requests that re-wrap existing source or text unless this has been
discussed beforehand.
* PEP8 allows for camelCase for consistency with existing code. The Qt library uses camelCase, so
the Python source code does too.
* The exception to the above is for constants. They should always be in upper snake case, like PEP8
states.
**Spaces, Indentation and Alignment**
* Only indentation by multiples of 4 spaces is allowed.
* No trailing spaces should occur on any line in the source code, including empty lines.
* Ideally, a function should end on the same indention level as it started. Exceptions are allowed
if it makes the code easier to follow.
* Aligning operators and attributes in columns with multiple spaces is not allowed by PEP8. The
rule is relaxed a bit here. Alignment is allowed when populating large dictionaries or setting
many class attributes. It does improve readability in such cases, but should not be overused.
### Linting with `flake8`
An excellent tool for checking Python code for errors and coding style is `flake8`. The
documentation is available [here](https://flake8.pycqa.org/en/latest/).
A good tool for checking Python code for errors and code style is `flake8`. The documentation is
available [here](https://flake8.pycqa.org/en/latest/).
The `setup.cfg` file in the root of this project has the following settings for `flake8` that
matches the coding standard:
matches the above code style:
```conf
[flake8]
ignore = E203,E221,E226,E228,E241,E251,E261,E266,E302,E305
ignore = E133,E221,E226,E228,E241,W503
max-line-length = 99
exclude = docs/*
```
The command line equivalent, with reporting, is:
```bash
flake8 . --count --ignore E203,E221,E226,E228,E241,E251,E261,E266,E302,E305 --max-line-length=99 --show-source --statistics
flake8 . --count --ignore E133,E221,E226,E228,E241,W503 --max-line-length=99 --show-source --statistics
```
Passing this check is required before contributions are merged into the `main` branch. This is
checked automatically when you make a pull request. You can run the `flake8` command locally to
check beforehand. The full command will give you a detailed description of the code lines that do
not conform to the standard.
Passing this check is required before contributions are merged. This is checked automatically when
you make a pull request. You can run the `flake8` command locally to check beforehand. The full
command will give you a detailed description of the code lines that do not conform to the standard.
## Ignored Errors
Two of the ignored errors are due to the relaxed restriction on column alignment, these are the
E221 and E241 error codes.
Some `flake8` error codes are ignored for this project for various reasons. The source also uses
camelCase function and variable names. This is the standard for the Qt libraries novelWriter
integrates with. It also happens to be the author's personal preferences.
The reason behind the other ignored error codes are listed below. Many of them are due to PEP8 not
permitting column alignment as opposed to many other coding styles, like for instance for Go. I
find them useful in regions of bulk value assignments. There's a reason why tables are more
readable than lists. They should be used sparingly though.
The ignored errors are all `pycodestyle` errors, and they are documented
[here](https://pycodestyle.pycqa.org/en/latest/intro.html#error-codes).
**E203:** whitespace before ‘:’
**Reason:** Column alignment.
**E221:** multiple spaces before operator
**Reason:** Column alignment.
**E226:** missing whitespace around arithmetic operator
**Reason:** This doesn't actually follow the PEP8 recommendation of grouping longer equations by
operator precedence like `2*a + 3*b` instead of `a * a + 3 * b`. Generally, don't use spaces around
`*`, `/` and `**`, but _do_ use spaces around `+` and `-`. For appending strings, the spaces can be
dropped. Don't use the `+` operator for appending multiple strings. Use formatting instead.
**E228** missing whitespace around modulo operator
**Reason:** See reason for E226. Formatting `%` like `/` and `*` should be possible.
**E241:** multiple spaces after ‘,’
**Reason:** Column alignment.
**E251:** unexpected spaces around keyword / parameter equals
**Reason:** Column alignment.
**E261:** at least two spaces before inline comment
**Reason:** With syntax highlighting, this one doesn't make much sense.
**E266:** too many leading ‘#’ for block comment
**Reason:** In the source multiple `#`s is sometimes used to indicate importance or heading level,
like markdown headers.
**E302:** expected 2 blank lines, found 0
**Reason:** Applies to classes. Instead, end classes with a comment like `# END Class ClassName` to
make it easier to see which class just ended. The double line break is then redundant.
**E305:** expected 2 blank lines after end of function or class
**Reason:** Instead, _always_ end a function with a `return`, preferably indented at function
level. The end of the function is then clear.
The code E226 is ignored becuse it doesn't actually follow the
[PEP8 recommendation](https://www.python.org/dev/peps/pep-0008/#other-recommendations)
of grouping longer equations by operator precedence like `2*a + 3*b` instead of `a * a + 3 * b`.
Generally, don't use spaces around `*`, `/` and `**`, but _do_ use spaces around `+` and `-`.
The same applies to the modulo operator `%`, hence E228 is also ignored.

46
CREDITS.md Normal file
View File

@@ -0,0 +1,46 @@
# Credits
## Main Developer
* Veronica Berglyd Olsen (@vkbo)
## Main Contributors
* Concept: Marian Lückhof (@Number042)
* Internationalisation: Bruno Meneguello (@bkmeneguello)
## Translations
The default language is English (UK) with English (US) as an option.
* Dutch: Martijn van der Kleijn (@mvdkleijn)
* French: Jan Lüdke (@jyhelle)
* German: Myian (@heymyian)
* Latin American Spanish: Tommy Marplatt (@tmarplatt)
* Norwegian: Veronica Berglyd Olsen (@vkbo)
* Portuguese: Bruno Meneguello (@bkmeneguello)
* Simplified Chinese: Qianzhi Long (@longqzh)
## Libraries
The following libraries are dependencies of novelWriter:
* Qt5 by [Qt Company](https://www.qt.io/)
* PyQt5 by [Riverbank Computing](https://www.riverbankcomputing.com/software/pyqt/)
* lxml by [Martijn Faassen](https://lxml.de/)
* Enchant by [Dom Lachowicz](https://abiword.github.io/enchant/)
* PyEnchant by [Dimitri Merejkowsky](https://pyenchant.github.io/pyenchant/)
## Assets
Some of the assets bundled with novelWriter were adapted from the following sources:
* Typicons icons by [Stephen Hutchings](https://github.com/stephenhutchings/typicons.font) (CC BY-SA 4.0)
* Tomorrow syntax themes by Chris Kempson (MIT License)
* Owl syntax themes by Sarah Drasner (MIT License)
* Solarized themes by Ethan Schoonover, added by @nullbasis (MIT License)
## Special Mentions
Additional thanks to @johnblommers who was an early user and who has provided a lot of very useful
feedback over the years.

View File

@@ -1,6 +1,7 @@
include setup.py
include LICENSE.md
include CREDITS.md
include CHANGELOG.md
recursive-include setup *
recursive-include nw/assets *
recursive-include novelwriter/assets *
recursive-include sample *.nwx *.nwd

209
README.md
View File

@@ -9,8 +9,9 @@
[![release](https://img.shields.io/github/v/release/vkbo/novelwriter)](https://github.com/vkbo/novelWriter/releases)
[![pypi](https://img.shields.io/pypi/v/novelwriter)](https://pypi.org/project/novelWriter)
[![python](https://img.shields.io/pypi/pyversions/novelwriter)](https://pypi.org/project/novelWriter)
[![Crowdin](https://badges.crowdin.net/novelwriter/localized.svg)](https://crowdin.com/project/novelwriter)
<img align="left" style="margin: 0 16px 4px 0;" src="https://raw.githubusercontent.com/vkbo/novelWriter/main/setup/icons/scaled/icon-novelwriter-96.png">
<img align="left" style="margin: 0 16px 4px 0;" src="https://raw.githubusercontent.com/vkbo/novelWriter/main/setup/novelwriter.png">
novelWriter is a plain text editor designed for writing novels assembled from many smaller text
documents. It uses a minimal formatting syntax inspired by Markdown, and adds a meta data syntax
@@ -18,68 +19,106 @@ for comments, synopsis, and cross-referencing. It's designed to be a simple text
for easy organisation of text and notes, using human readable text files as storage for robustness.
The project storage is suitable for version control software, and also well suited for file
synchronisation tools. All text is saved as plain text files with a meta data header, the core
project structure is stored in a single project XML file, and other meta data is primarily saved as
synchronisation tools. All text is saved as plain text files with a meta data header. The core
project structure is stored in a single project XML file. Other meta data is primarily saved as
JSON files.
The full documentation is available on [readthedocs.io](https://novelwriter.readthedocs.io).
The full documentation is available at
[novelwriter.readthedocs.io](https://novelwriter.readthedocs.io).
The full credits are listed in
[CREDITS.md](https://github.com/vkbo/novelWriter/blob/main/CREDITS.md).
You can also follow novelWriter on Mastodon at [fosstodon.org/@novelwriter](https://fosstodon.org/@novelwriter).
## Implementation
The application is written in Python 3 (3.6+) using Qt5 and PyQt5 (5.3+). It is developed on Linux,
but should in principle work fine on other operating systems as well as long as dependencies are
met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS.
The application is written with Python 3 (3.7+) using Qt5 and PyQt5 (5.10+). It is developed on
Linux, but should in principle work fine on other operating systems as well as long as dependencies
are met. It is regularly tested on Debian and Ubuntu Linux, Windows, and macOS.
## Installation
### Linux Mint, Ubuntu and Debian
The Releases page has a `.deb` package that should install on Mint, Ubuntu and Debian.
You can also use the novelWriter [PPA](https://launchpad.net/~vkbo/+archive/ubuntu/novelwriter).
For more details, check the [Getting Started](https://novelwriter.readthedocs.io/en/latest/int_started.html)
section in the documentation.
### Windows 10+
The Release page has a `setup.exe` file for Windows 10, that should also work on other Windows
versions. The installer includes Python 3.10 and the library dependencies.
### Other Install Options
You can also download and install one of the minimal zip files from the
[Releases](https://github.com/vkbo/novelWriter/releases) page or the
[novelwriter.io](https://novelwriter.io/) website.
The [Getting Started](https://novelwriter.readthedocs.io/en/latest/int_started.html) section of the
documentation has detailed install instructions for these packages, and for installation via the
Python Package Index.
## Project Contributions
Contributions to this project are welcome. However, please read the
[Contributing Guide](https://github.com/vkbo/novelWriter/blob/main/CONTRIBUTING.md) before
submitting larger additions or changes.
Please don't make feature pull requests without first having discussed them with the maintainer.
You can make a feature request in the issue tracker, or if the idea isn't fully formed, start a
discussion on the discussion page. Please also don't make pull requests to reformat or rewrite
existing code unless there is a very good reason for doing so.
If you want to help translating novelWriter into another language, please see the
[README](https://github.com/vkbo/novelWriter/blob/main/i18n/README.md) in the `nw/assets/i18n`
folder.
Fixes and patches are welcome. Contributions related to packaging and installing novelWriter will
also be appreciated, but please make an issue or a discussion topic first. Before contributing any
code, please also read the full
[Contributing Guide](https://github.com/vkbo/novelWriter/blob/main/CONTRIBUTING.md).
### Translations
New translations are always welcome. This project uses Crowdin to maintain translations, and you
can contribute translations at the [Crowdin project page](https://crowdin.com/project/novelwriter).
If you have any questions, feel free to post them to the
[Translations of novelWriter](https://github.com/vkbo/novelWriter/issues/93) issue thread.
For more details, and how to use Qt Linguist for translations, see the
[i18n instructions](https://github.com/vkbo/novelWriter/blob/main/i18n/README.md).
## Key Features
Some key features of novelWriter are listed below. Consult the
[documentation](https://novelwriter.readthedocs.io) for more information.
Some key features of novelWriter are listed below. The
[documentation](https://novelwriter.readthedocs.io) has a lot more information.
### Markdown Flavour
### Formatting Codes
Note that novelWriter is _not_ a proper Markdown editor. It is a plain text editor that uses
Markdown-like syntax to allow for a minimal set of formatting that is useful for the specific task
of writing novels. The formatting is currently limited to:
Although novelWriter is a plain text editor, it uses a Markdown-like syntax to allow for a minimal
set of formatting that is useful for the specific task of writing novels.
* Headings levels 1 to 4 using the `#` syntax only.
* Emphasised and strongly emphasised text. These are rendered as italicised and bold text.
* Strikethrough text.
* Hard line breaks using two or more spaces at the end of a line.
| Code | Usage | Description |
|------------|----------|-------------|
| `#` | Prefix | Headings level 1 to 4. |
| `_` | Wrapped | Emphasised (italicised) text. |
| `**` | Wrapped | Strongly emphasised (bold) text. |
| `~~` | Wrapped | Strikethrough text. |
| `%` | Prefix | A comment; does not count towards the word count.<sup>1</sup> |
| `@` | Prefix | The following text is parsed as a keyword/value command for meta data. |
| `>` | Prefix | The paragraph is indented one tab width from the left. |
| `<` | Suffix | The paragraph is indented one tab width from the right. |
| `>>` | Prefix | The paragraph is right-aligned. |
| `<<` | Suffix | The paragraph is left-aligned. |
| `>>`, `<<` | Wrapped | The paragraph is centred. |
That is it. Features not supported in the editor are also not exported when using the export tool.
<sup>1</sup> If the first word of the comment is `synopsis:`, the comment is indexed and treated as
the synopsis for the section of text where it occurs. These synopsis comments can be used to build
an outline and exported to external documents.
In addition, novelWriter adds the following syntax used for its additional features:
* A line starting with `%` is treated as a comment and not rendered on exports unless requested.
Comments do not count towards word counts and other statistics.
* If the first word of the comment is `synopsis:`, the comment is indexed and treated as the
synopsis for the section of text where it occurs. These synopsis comments can be used to build an
outline and exported to external documents.
* A set of meta data keyword/values starting with the character `@`. These are used for tagging
and inter-linking documents, and can also be included when generating a project outline.
* A variety of thin and non-breaking spaces are supported. Some of them depend on the system
running at least Qt 5.9. Earlier versions of Qt will unfortunately strip them out when saving.
* Tabs can be used in the text, and should be properly aligned in both editor and viewer. This can
be used to make simple tables and lists. Note that for HTML exports, most browsers will treat a
tab as a space, so it may not show up like expected. Open Document exports should produce the
expected result.
### Export Formats
The core export formats of novelWriter are Open Document and HTML5. Open Document is an open
standard for office type documents that is supported by most office applications. See
[Open Document > Application Support](https://en.wikipedia.org/wiki/OpenDocument#Application_support)
for more details.
You can also export the entire project as a single novelWriter-flavour document. These can later be
You can also export the entire project as a single novelWriter-markup document. These can later be
imported again into novelWriter. In addition, printing and export to PDF is offered through the Qt
library, although with limitations to formatting.
@@ -101,10 +140,7 @@ to. Headings of level one signify a book or partition title. Headings of level t
start of a new chapter. Headings of level three signify the start of a new scene. Headings of level
four can be used internally in each scene to create separate sections.
Each novel file can be assigned a layout format, which shows up as a flag next to the item in the
project tree. These are mostly to help the user track what they contain, but they also have some
impact on the format of the exported document. See the
[documentation](https://novelwriter.readthedocs.io) for further details.
See the [documentation](https://novelwriter.readthedocs.io) for further details.
### Project Notes
@@ -119,72 +155,20 @@ scene connects to the plot, and which characters, etc. occur in them. In additio
themselves are clickable in the document view pane, and control-clickable in the editor. They make
it possible to quickly navigate between the documents while writing.
## Standard Installation
For a regular installation, it is recommended that you download one of the minimal zip files from
the [Releases](https://github.com/vkbo/novelWriter/releases) page or the
[novelwriter.io](https://novelwriter.io/) website.
The [documentation](https://novelwriter.readthedocs.io/) has detailed install instructions for
[Linux](https://novelwriter.readthedocs.io/en/latest/setup_linux.html),
[Windows](https://novelwriter.readthedocs.io/en/latest/setup_windows.html), and
[macOS](https://novelwriter.readthedocs.io/en/latest/setup_mac.html).
They are pretty straightforward.
## Running from Source
## Installing or Running from Source
If you want to run novelWriter directly from the source code, you must run the `novelWriter.py`
file from command line.
**Note:** You may need to replace `python` with `python3` and `pip` with `pip3` in the instructions
below on some systems. You may also want to add the `--user` flag for `pip` to install in your user
space only.
### Dependencies
Dependencies can generally be installed from PyPi with:
```bash
pip install -r requirements.txt
```
### Additional Steps for Linux
On Linux, the dependencies are generally available in the standard package repository.
On Linux, you can most likely find the dependencies in your distribution's repository. On Ubuntu
and Debian, run:
```bash
sudo apt install python3-pyqt5 python3-lxml python3-enchant
```
If you want to set up a launcher and icons on Linux, you can run:
```bash
python setup.py xdg-install
```
### Additional Steps for macOS
First, make sure you have properly set up Python3 with Homebrew. If not, check their
[documentation](https://docs.brew.sh/Homebrew-and-Python).
In addition, the following steps are necessary to install all dependencies:
```bash
brew install enchant
pip3 install --user -r requirements.txt
pip3 install --user pyobjc
```
### Additional Steps for Windows
Windows does not by default come with Python installed. If you haven't installed it already, get it
from [python.org/downloads](https://www.python.org/downloads/). Remember to select "Add Python to
PATH" during the installation.
The script `windows_install.bat` in the `setup` folder can be used to create desktop and start menu
icons for novelWriter. The script will also install dependencies for you from PyPi.
## Internationalisation
If you install from source, you must build the translation files yourself if you want to switch to
a different GUI language than British English. This requires that you have the Qt translation
framework installed. Check the specific instruction in the README in the `i18n` source folder for
how to build the translation files.
For more details on running or installing from source, see
[Other Setup Methods](https://novelwriter.readthedocs.io/en/latest/setup_other.html).
## Debugging
@@ -192,31 +176,14 @@ If you need to debug novelWriter, you must run it from the command line. It take
which can be listed with the switch `--help`. The `--info`, `--debug` or `--verbose` flags are
particularly useful for increasing logging output for debugging.
## Licenses
## Licence
This is Open Source software, and novelWriter is licensed under GPLv3. See the
This is Open Source software, and novelWriter is licenced under GPLv3. See the
[GNU General Public License website](https://www.gnu.org/licenses/gpl-3.0.en.html) for more
details, or consult the [LICENSE](https://github.com/vkbo/novelWriter/blob/main/LICENSE.md) file.
Bundled assets have the following licenses:
* The Typicons-based icon themes by Stephen Hutchings are licensed under
[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/). The icons have been altered in
size and colour for use with novelWriter, and some additional icons added. The original icon set
is available at
[stephenhutchings/typicons.font](https://github.com/stephenhutchings/typicons.font).
* The Cantarell font by Dave Crossland is licensed under
[OPEN FONT LICENSE Version 1.1](http://scripts.sil.org/OFL).
It is available at [Google Fonts](https://fonts.google.com/specimen/Cantarell).
* The Tomorrow syntax themes use colour schemes taken from Chris Kempson's collection of code
editor themes, licensed with the
[MIT License](https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md),
and the main repo is available at
[chriskempson/tomorrow-theme](https://github.com/chriskempson/tomorrow-theme).
* Likewise, the Owl syntax themes use colours from Sarah Drasner's code editor themes, licensed
with the [MIT License](https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE), and
the main repo is available at
[sdras/night-owl-vscode-theme](https://github.com/sdras/night-owl-vscode-theme).
Bundled assets and their licences are listed in
[CREDITS](https://github.com/vkbo/novelWriter/blob/main/CREDITS.md).
## Screenshots

2119
docs/FileFormatSpec-1.5.fodt Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -1,27 +0,0 @@
/*
* Custom CSS Rules for Sphinx RTD Theme
*/
.kbd {
background-color: #eeeeee;
border: 1px solid #b4b4b4;
border-radius: 3px;
color: #333333;
display: inline-block;
font-size: 0.85em;
font-weight: 400;
line-height: 1;
padding: 2px 4px;
margin-left: 1px;
margin-right: 1px;
white-space: nowrap;
}
.tight-table td {
white-space: normal !important;
vertical-align: text-top;
}
pre span.go {
color: #333333 !important;
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View File

@@ -1,112 +1,88 @@
# -*- coding: utf-8 -*-
#
# Configuration file for the Sphinx documentation builder.
#
# This file does only contain a selection of the most common options. For a
# full list see the documentation:
# http://www.sphinx-doc.org/en/master/config
# -- Path setup --------------------------------------------------------------
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#
# import sys
# sys.path.insert(0, os.path.abspath("."))
# -- Imports -----------------------------------------------------------------
import os
import time
import sphinx_rtd_theme # noqa: F401
import datetime
# -- Project information -----------------------------------------------------
# -- Project Information -----------------------------------------------------
project = "novelWriter"
copyright = "2018–2021, Veronica Berglyd Olsen"
copyright = f"{datetime.date.today().year}, Veronica Berglyd Olsen"
author = "Veronica Berglyd Olsen"
# The short X.Y version
version = "1.3"
# The full version, including alpha/beta/rc tags
release = "1.3"
initFile = os.path.join(
os.path.dirname(__file__), os.pardir, os.pardir,
"novelwriter", "__init__.py"
)
with open(initFile) as inFile:
for aLine in inFile:
if aLine.startswith("__version__"):
release = aLine.split('"')[1].strip()
break
else:
release = "unknown"
# -- General configuration ---------------------------------------------------
version = release.split("-")[0]
# -- General Configuration ---------------------------------------------------
os.environ["TZ"] = "Europe/Oslo"
time.tzset()
# needs_sphinx = "1.0"
extensions = [
"sphinx_rtd_theme",
]
needs_sphinx = "4.0"
templates_path = ["_templates"]
source_suffix = ".rst"
master_doc = "index"
today_fmt = "%A, %d %B %Y at %H:%M"
language = None
language = "en"
exclude_patterns = []
pygments_style = None
pygments_style = "sphinx"
pygments_dark_style = "monokai"
# -- Options for HTML output -------------------------------------------------
html_theme = "sphinx_rtd_theme"
html_logo = "images/novelwriter.png"
html_theme_options = {
# Toc options
"collapse_navigation": True,
"sticky_navigation": True,
"navigation_depth": 3,
"includehidden": True,
"titles_only": False,
"logo_only": True,
}
# -- Options for HTML Output -------------------------------------------------
html_theme = "furo"
html_static_path = ["_static"]
html_css_files = [
"css/custom.css",
]
html_theme_options = {
"light_logo": "novelwriter-light.png",
"dark_logo": "novelwriter-dark.png",
}
html_title = f"<div style='text-align: center'>Documentation Version {release}</div>"
# Custom sidebar templates, must be a dictionary that maps document names
# to template names.
# The default sidebars (for documents that don"t match any pattern) are
# defined by theme itself. Builtin themes are using these templates by
# default: ``["localtoc.html", "relations.html", "sourcelink.html",
# "searchbox.html"]``.
# html_sidebars = {}
# -- Options for HTMLHelp output ---------------------------------------------
# -- Options for HTMLHelp Output ---------------------------------------------
# Output file base name for HTML help builder.
htmlhelp_basename = "novelWriterDoc"
# -- Options for LaTeX output ------------------------------------------------
# -- Options for LaTeX Output ------------------------------------------------
latex_elements = {
# The paper size ("letterpaper" or "a4paper").
#
# "papersize": "letterpaper",
# The font size ("10pt", "11pt" or "12pt").
#
# "pointsize": "10pt",
# Additional stuff for the LaTeX preamble.
#
# "preamble": "",
# Latex figure (float) alignment
#
# "figure_align": "htbp",
"papersize": "a4paper",
"pointsize": "11pt",
"preamble": (
"\\usepackage[utf8]{inputenc}\n"
"\\DeclareUnicodeCharacter{2212}{\\textendash}\n"
),
"figure_align": "htbp",
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [(
master_doc, "novelWriter.tex", "novelWriter Documentation",
master_doc, "manual.tex", "novelWriter Documentation",
author, "manual"
)]
# -- Options for manual page output ------------------------------------------
# -- Options for Man Page Output ---------------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
@@ -114,7 +90,7 @@ man_pages = [(
master_doc, "novelwriter", "novelWriter Documentation", [author], 1
)]
# -- Options for Texinfo output ----------------------------------------------
# -- Options for Texinfo Output ----------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
@@ -124,7 +100,7 @@ texinfo_documents = [(
"novelWriter", "Markdown-like editor for novels.", "Miscellaneous"
)]
# -- Options for Epub output -------------------------------------------------
# -- Options for EPub Output -------------------------------------------------
# Bibliographic Dublin Core info.
epub_title = project

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

View File

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 423 KiB

After

Width:  |  Height:  |  Size: 534 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 431 KiB

After

Width:  |  Height:  |  Size: 539 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 379 KiB

View File

@@ -1,93 +1,90 @@
#####################
novelWriter |release|
#####################
#############################
Documentation for novelWriter
#############################
.. image:: https://github.com/vkbo/novelWriter/workflows/python%203.8/badge.svg?branch=main
:target: https://github.com/vkbo/novelWriter/actions
:alt: Python Tests
.. image:: images/novelwriter_logo.png
:align: right
:width: 48
.. image:: https://codecov.io/gh/vkbo/novelWriter/branch/main/graph/badge.svg
:target: https://codecov.io/gh/vkbo/novelWriter
:alt: Code Coverage
| **For Release:** |release|
| **Last Updated:** |today|
|
.. image:: https://readthedocs.org/projects/novelwriter/badge/?version=latest
:target: https://novelwriter.readthedocs.io/en/latest/?badge=latest
:alt: Documentation
novelWriter is an open source plain text editor designed for writing novels assembled from many
smaller text documents. It uses a minimal formatting syntax inspired by Markdown, and adds a meta
data syntax for comments, synopsis, and cross-referencing. It is designed to be a simple text
editor that allows for easy organisation of text and notes, using human readable text files as
storage for robustness.
.. image:: https://img.shields.io/github/v/release/vkbo/novelwriter
:target: https://github.com/vkbo/novelWriter/releases
:alt: GitHub Release
.. figure:: images/screenshot_multi.png
:align: center
:width: 500
.. image:: https://img.shields.io/pypi/v/novelwriter
:target: https://pypi.org/project/novelWriter/
:alt: PyPI
.. image:: https://img.shields.io/pypi/pyversions/novelwriter
:target: https://pypi.org/project/novelWriter/
:alt: Python Version
**Last Updated:** |today|
novelWriter is a markdown-like text editor designed for writing novels and larger projects of many
smaller plain text documents. It uses its own flavour of markdown that supports a meta data syntax
for comments, synopsis and cross-referencing between documents. The idea is to have a simple text
editor which allows for easy organisation of text documents and notes, built on a plain text file
project repository for robustness.
The plain text storage is suitable for version control software, and also well suited for file
synchronisation tools. The core project structure is stored in a single project XML file. Other
meta data is primarily saved as JSON files.
The project storage is suitable for version control software, and also well suited for file
synchronisation tools. All text is saved as plain text files with a meta data header. The core
project structure is stored in a single project XML file. Other meta data is primarily saved as
JSON files. See the :ref:`a_breakdown_storage` section for more details.
Any operating system that can run Python 3 and has the Qt 5 libraries should be able to run
novelWriter. It runs fine on Linux, Windows and macOS, and users have tested it on other platforms
too. novelWriter can be run directly from the Python source, or installed from the pip tool or via
the provided setup script. See :ref:`a_started`, or one or the setup instructions for your
operating system for further details.
as well. novelWriter can also be run directly from the Python source, or installed from packages or
the pip tool. See :ref:`a_started` for more details.
.. note::
Version 1.5 introduced a few changes that will require you to make some minor modifications to
some of the headings in your project. It should be fairly quick and straightforward. Please see
the :ref:`a_prjfmt_1_3` section for more details.
**Useful Links**
* Website: https://novelwriter.io
* Documentation: https://novelwriter.readthedocs.io
* Internationalisation: https://crowdin.com/project/novelwriter
* Source Code: https://github.com/vkbo/novelWriter
* Source Releases: https://github.com/vkbo/novelWriter/releases
* Issue Tracker: https://github.com/vkbo/novelWriter/issues
* Feature Discussions: https://github.com/vkbo/novelWriter/discussions
* PyPi Project: https://pypi.org/project/novelWriter
* Social Media: https://fosstodon.org/@novelwriter
.. toctree::
:maxdepth: 2
:maxdepth: 1
:caption: Introduction
:hidden:
int_introduction
int_overview
int_started
setup_linux
setup_mac
setup_windows
int_source
int_customise
.. toctree::
:maxdepth: 2
:caption: Usage
:maxdepth: 1
:caption: Using novelWriter
:hidden:
usage_breakdown
usage_interface
usage_projects
usage_structure
usage_notes
usage_export
usage_format
usage_shortcuts
usage_typography
usage_projectformat
.. toctree::
:maxdepth: 2
:maxdepth: 1
:caption: Organising Your Project
:hidden:
project_overview
project_structure
project_notes
project_export
.. toctree::
:maxdepth: 1
:caption: Under the Hood
:hidden:
tech_technical
Indices and Tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
tech_locations
tech_storage
tech_tests

View File

@@ -0,0 +1,65 @@
.. _a_custom:
**************
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,
your own syntax themes, and install additional dictionaries.
.. _a_custom_dict:
Spell Check Dictionaries
========================
novelWriter uses Enchant_ as the spell checking tool. Depending on you operating system, it may or
may not load installed spell check dictionaries.
Linux
On Linux, you generally only have to install hunspell or aspell dictionaries on your system like
you do for other applications. See your distro's documentation for how to do this. These
dictionaries should then 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:
``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.
.. _a_custom_theme:
Syntax and GUI Themes
=====================
Adding your own GUI and syntax themes is relatively easy. The themes are defined by simple plain
text config files with meta data and colour settings.
In order to make your own versions, first copy one of the existing files to your local computer and
modify it as you like.
* The existing syntax themes are stored in
`novelwriter/assets/syntax <https://github.com/vkbo/novelWriter/tree/main/novelwriter/assets/syntax>`_.
* The existing GUI themes are stored in
`novelwriter/assets/themes <https://github.com/vkbo/novelWriter/tree/main/novelwriter/assets/themes>`_.
Remember to also change the name of your theme by modifying the ``name`` setting at the top of the
file, otherwise you may not be able to distinguish them in :guilabel:`Preferences`.
For novelWriter to be able to locate the custom theme files, you must copy them to the
:ref:`a_locations_data` location in your home or user area. There should be a folder there named
``syntax`` for syntax themes and just ``themes`` for GUI themes. These folders are created the
first time you start novelWriter.
Once the files are copied there, they should show up in :guilabel:`Preferences` with the label you
set as ``name`` inside the file.

View File

@@ -1,118 +1,66 @@
.. _a_intro:
************
Introduction
Key Features
************
novelWriter is a simple, multi-document plain text editor using a modified markdown syntax to apply
simple formatting to the text. It is designed for writing novels, and allows for the component
documents to be ordered freely to create the desired structure of the novel. More details about how
projects are structured is covered in :ref:`a_struct`.
.. _Snowflake : https://www.advancedfictionwriting.com/articles/snowflake-method/
In addition, the project can contain notes on the various plot elements, characters, locations,
etc, that make up the story. These notes are organised in a set of category-specific top-level
folders referred to as "root" folders, and each entry can be tagged and cross-referenced from
within the novel documents and notes. These tags make it possible to inter-link documents, and
generate an overview of the entire novel project and how the various documents and plot elements
are interconnected. The tag and reference syntax is covered in :ref:`a_proj` and :ref:`a_notes`.
At the core, novelWriter is a multi-document plain text editor. It uses a markup syntax inspired by
Markdown to apply simple formatting to the text. It is designed for writing fiction, so the
formatting features are limited to those relevant for this purpose. It is not suitable for
technical writing.
These additional features are not standard in markdown, but are available through special meta
keywords described in :ref:`a_struct_tags`. Syntax highlighting is provided to make it easier to
verify that the markdown tags are used correctly.
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.
An overview of the supported markdown syntax is covered in :ref:`a_ui`.
You can at any point split documents by their header, or merge multiple documents into single
documents. This makes it easier to use variations of the popular Snowflake_ method for writing.
Below are some key features of novelWriter.
.. _a_intro_design:
**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 window
itself is vissible.
Design Philosophy
=================
**Keep an eye on your notes**
The main window can optionally show a document viewer to the right of the editor. This view
panel is intended for displaying another scene document, you character notes, plot notes, or any
other document you may need to reference while writing.
The user interface of novelWriter is intended to be as minimalistic as practically possible, while
at the same time provide a complete set of features needed for writing a novel.
**Organise your documents how you like**
You can split your novel project up into as many individual documents as you want to. When you
build the project, 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 start out with a few documents and then later split the document into multiple documents
based on its headers.
.. note::
novelWriter is not intended to be a full office type word processor. It doesn't support images,
links, tables, and other complex structures and objects often needed for such documents.
Formatting is limited to headers, and bold, italicised and strikethrough text.
**Keep track of your plot elements**
All notes in your project can be assigned a *tag* you can *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 a specific section. Note tags are organised into categories with specific reference
keywords.
.. tip::
If you do need to align information in rows and columns in your notes, you can achieve this with
tabs and hard line breaks. The tab stop width can be specified in :guilabel:`Preferences` and
hard line breaks can be inserted by adding to spaces at the end of the line.
**Get an overview of your plot elements**
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 document, which can be listed here as
well. You have the option to add or remove columns of information from this outline. A subset of
the outline information is also available in the :guilabel:`Novel View` as a replacement for the
main project tree.
The main window does not have a toolbar like many other applications do. This reduces clutter, and
since the documents are formatted with markdown tags, is more or less redundant. However, all
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 the syntax every time until you've
memorised it. A full list of shortcuts can be found in the :ref:`a_ui_shortcuts` section.
In addition, novelWriter has a :guilabel:`Focus Mode` where all the user interface elements other
than the document editor itself are hidden away.
The colour scheme of the user interface defaults to that of the host operating system. In addition,
other light and dark themes are provided, and can be enabled in :guilabel:`Preferences` from the
:guilabel:`Tools` menu. A number of syntax highlighting themes are also available in
:guilabel:`Preferences`. A set of icon themes in colour and greyscale are also offered. The icons
are based on the Typicons_ icon set designed by Stephen Hutchings.
The main window is split in two, or optionally three, panels. The left-most panel contains the
project tree and all the documents in your project. The second panel is the document editor, and
the optional third panel is a document viewer which can view any document in your project
independently of the document editor. It is not intended as a preview window, although you can use
it for this, but for viewing your notes next to your editor while you're writing.
A second tab is also available on the main window. This is the :guilabel:`Outline` tab where the
entire novel structure can be displayed, with all the tags and references listed. Depending on how
you structure your novel documents, this outline can be quite different from your project tree.
Your project tree lists individual documents, your Outline tree lists the structure of the novel
itself in terms of partitions, chapters and scenes as it appears in the text of the documents.
.. _Typicons: https://github.com/stephenhutchings/typicons.font
.. _a_intro_project:
Project Layout
==============
You are free to organise your project documents as you wish into subfolders, and split the text
between 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.
The four heading levels (**H1** to **H4**) are treated as follows:
* **H1** is used for the book title, and for partitions.
* **H2** is used for chapter tiles.
* **H3** is used for scene titles – optionally replaced by separators.
* **H4** is for section titles within scenes, if such granularity is needed.
This header level structure is only taken into account for novel documents. For the 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_notes` for more details.
.. _a_intro_export:
Project Export
==============
The project can at any time be exported to a range of different formats through the
:guilabel:`Build Novel Project` tool. Natively, novelWriter supports export to Open Document,
HTML5, and various flavours of Markdown.
The HTML5 export 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
and printing to PDF is also possible.
It is also possible to export the content of the project to a JSON file. This is useful if you want
to write your own processing script in for instance Python as the entire novel can be read into a
Python dictionary with a couple of lines of code.
A number of filter options can be applied to the produced document, allowing you to export a draft
manuscript, a reference document of notes, an outline based on chapter and scene titles with a
synopsis each, and so on. See :ref:`a_export` for more details on export features and formats.
**Building your manuscript**
Whether you want to compile 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 Novel Project` tool.
The tool lets you select what information you want to include in the generated document, and how
it is formatted. You can send the result to a printer, a PDF, or to an Open Document file that
can be opened by most office type word processors. You can also generate the result as HTML, or
Markdown, both suitable for further conversion to other formats.
.. _a_intro_screenshots:
@@ -120,7 +68,7 @@ synopsis each, and so on. See :ref:`a_export` for more details on export feature
Screenshots
===========
**novelWriter with default system theme:**
**novelWriter with default theme:**
.. image:: images/screenshot_default.png
:width: 800

View File

@@ -0,0 +1,92 @@
.. _a_overview:
********
Overview
********
.. only:: html
.. image:: images/python_powered.png
:align: right
:width: 220
novelWriter is built on `Python 3 <https://www.python.org/>`_, a cross platform programming
language that doesn't require a compiler to build and run. That means that the code can run on your
computer right out of the box, or from a zip file.
While it is developed for Linux primarily, it runs just fine on Windows as well. It also works fine
on macOS, but the author is not a mac user, so support for mac is dependant on user feedback and
contributions.
In order to run novelWriter, you also need a few additional packages. The user interface is built
with `Qt 5 <https://www.qt.io/>`_, a cross platform library for building graphical user interface
applications. It also uses a third party XML package. If you want spell checking, you also need the
spell check package Enchant developed for AbiWord
For install instructions, see :ref:`a_started`.
For information on how to add spell check dictionaries, see :ref:`a_custom_dict`.
Using novelWriter
=================
In order to use novelWriter effectively, you need to know the basics of how it works. The following
sections will explain the main principles. It starts with the basics, and gets more detailed as you
read on.
:ref:`a_breakdown` – Essential Information
This section explains the basics of how the application works and what it can and cannot do.
:ref:`a_ui` – Recommended Reading
This section will give you a more detailed explanation of what the various elements on the user
interface do and how you can use them more effectively.
:ref:`a_fmt` – Essential Information
This section 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
use headings. Tags and references are implemented by simple codes.
:ref:`a_kb` – Optional / Lookup
This section lists all the keyboard shortcuts in novelWriter and what they do. Most of the
shortcuts are also listed next to the menu items inside the app, or in tool tips, so this
section is mostly for reference.
:ref:`a_typ` – Optional
This section 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
intended use is explained here.
:ref:`a_prjfmt` – Optional
This section is more technical and has an overview of changes made to the way your project data
is stored. The format has changed a bit from time to time, and sometimes the changes require
that you make small modifications to your project. Everything you need to know is listed in this
section.
Organising Your Projects
========================
In addition to manage a collection of plain text files, novelWriter can interpret and map the
structure of your novel and show you additional information about its flow and content. In order
to take advantage of these features, you must structure your text in a specific way and add some
meta data for it to extract.
:ref:`a_proj` – Essential Information
This section explains how you organise the content of your project, and how to set up automated
backups of your work.
:ref:`a_struct` – Essential Information
This section covers the way your novel's structure is encoded into the text documents. It
explains how the different levels of headings are used, and how you can include information
about characters, plot elements, and other meta data in your text.
:ref:`a_notes` - Recommended Reading
This section briefly describes what novelWriter does with the note files you add to your
project. Generally, the application doesn't do much with them at all aside from looking through
them for tags you've set so that it knows which file to open when you click on a reference.
:ref:`a_export` - Recommended Reading
This section explains in more detail how the build tool works. In particular how you can
control the way chapter titles are formatted, and how scene and section breaks are handled.

155
docs/source/int_source.rst Normal file
View File

@@ -0,0 +1,155 @@
.. _a_source:
*******************
Running from Source
*******************
.. _main website: https://novelwriter.io
.. _GitHub: https://github.com/vkbo/novelWriter/releases
.. _PyPi: https://pypi.org/project/novelWriter/
.. _Sphinx Docs: https://www.sphinx-doc.org/
This section describes various ways of running novelWriter directly from the source code, and how
to build the various components like the translation files and documentation.
.. note::
The text below assumes the command ``python`` corresponds to a Python 3 executable. Python 2 is
now deprecated, but many systems still have both Python 2 and 3. For such systems, the command
``python3`` may be needed instead. Likewise, ``pip`` may need to be replaced with ``pip3``.
.. _a_source_depend:
Dependencies
============
novelWriter has been designed to rely on as few dependencies as possible. Aside from the packages
needed to communicate with the Qt GUI libraries, only one package is required for handling the XML
format of the main project file. Everything else is handled with standard Python libraries.
The following Python packages are needed to run novelWriter:
* ``PyQt5`` – needed for connecting with the Qt5 libraries.
* ``lxml`` – needed for full XML support.
* ``PyEnchant`` – needed for spell checking (optional).
PyQt/Qt should be at least 5.10, but ideally 5.13 or higher for all features to work. For instance,
searching using regular expressions with full Unicode support requires 5.13. There is no known
minimum version requirement for package ``lxml``, but the code was originally written with 4.2,
which is therefore set as the minimum. It may work on lower versions. You have to test it.
If you want spell checking, you must install the ``PyEnchant`` package. The spell check library
must be at least 3.0 to work with Windows. On Linux, 2.0 also works fine.
If you install from PyPi, these dependencies should be installed automatically. If you install from
source, dependencies can still be installed from PyPi with:
.. code-block:: bash
pip install -r requirements.txt
.. _a_source_install:
Install from Source
===================
You can download the latest version of novelWriter from the source repository on GitHub_ and run
the setup manually. It is equivalent to what the ``pip install`` command does, and it installs
novelWriter to the default location for Python packages.
This step requires that you have ``setuptools`` installed on your system. If you don't have it
installed, it can usually be installed from your distro's repository. For Debian and Ubuntu this is
achieved with:
.. code-block:: bash
sudo apt install python3-setuptools
The package is also available from PyPi:
.. code-block:: bash
pip install --user setuptools
With ``setuptools`` in place, novelWriter can be installed to the user space with:
.. code-block:: bash
python setup.py install --user
.. tip::
The main setup script has a number of options that may be useful to you. You can list them by
running ``python setup.py help``.
.. _a_source_i18n:
Building the Translation Files
==============================
If you installed novelWriter from a package, the translation files should be pre-built and
included. If you're running novelWriter from the source code, you will need to generate the files
yourself. The files you need will be written to the ``novelwriter/assets/i18n`` folder, and will
have the ``.qm`` file extension.
You can build the ``.qm`` files with:
.. code-block:: bash
python setup.py qtlrelease
This requires that the Qt Linguist tool is installed on your system. On Ubuntu and Debian, the
needed package is called ``qttools5-dev-tools``.
.. note::
If you want to improve novelWriter with translation files for another language, or update an
existing translation, instructions for how to contribute can be found in the ``README.md`` file
in the ``i18n`` folder of the source code.
.. _a_source_sample:
Building the Example Project
============================
In order to be able to create new projects from example files, you need a ``sample.zip`` file in
the ``assets`` folder of the source. This file can be built from setup script by running:
.. code-block:: bash
python setup.py sample
.. _a_source_docs:
Building the Documentation
==========================
A local copy of this documentation can be generated as HTML. This requires the following Python
packages from PyPi:
.. code-block:: bash
pip install furo sphinx
The documentation can then be built from the root folder in the source code by running:
.. code-block:: bash
make -C docs html
If successful, the documentation should be available in the ``docs/build/html`` folder and you can
open the ``index.html`` file in your browser.
You can also build a PDF manual from the documentation using the setup script:
.. code-block:: bash
python setup.py manual
This will build the documentation as a PDF using LaTeX. The file will then be copied into the
assets folder and made available in the :guilabel:`Help` menu in novelWriter. The Sphinx build
system has a few extra dependencies when building the PDF. Please check the `Sphinx Docs`_ for more
details.

View File

@@ -4,166 +4,247 @@
Getting Started
***************
.. _brew docs: https://docs.brew.sh/Homebrew-and-Python
.. _Enchant: https://abiword.github.io/enchant/
.. _GitHub: https://github.com/vkbo/novelWriter
.. _macOS: https://github.com/vkbo/novelWriter/issues/867
.. _main website: https://novelwriter.io
.. _GitHub: https://github.com/vkbo/novelWriter/releases
.. _PPA: https://launchpad.net/~vkbo/+archive/ubuntu/novelwriter
.. _Pre-Release PPA: https://launchpad.net/~vkbo/+archive/ubuntu/novelwriter-pre
.. _PyPi: https://pypi.org/project/novelWriter/
.. _python.org: https://www.python.org/downloads/windows
.. _Releases: https://github.com/vkbo/novelWriter/releases
.. _RPM: https://github.com/vkbo/novelWriter/issues/907
.. _AppImage: https://appimage.org/
This section contains brief guides to how you can get novelWriter running on your computer. These
are the methods currently supported by the developer. Packages may also be available in other
package managers, but those are not managed by the developer. No installers are provided at this
time, but it is fairly straightforward to set up novelWriter with the provided install scripts.
If you are using Windows or a Debian-based Linux distribtuion, you can install novelWriter from
package installers. If you are on macOS, you have the option to run novelWriter from a standalone
folder. See :ref:`a_started_minimal`. This option is also available for Windows and Linux. The
third option is to install novelWriter from the Python Package Index. See :ref:`a_started_pip`.
As novelWriter matures, more options for how to install it and get it running will be added. For
non-Windows users the install process is at the present time best suited for people used to working
with the command line. But even if you're not, the install process is fairly straightforward.
Spell checking in novelWriter is provided by a third party library called Enchant_. Generally, it
should pull dictionaries from your operating system automatically. However, on Windows they must be
installed manually. See :ref:`a_custom_dict` for more details.
The next pages have specific install instructions for the various operating systems novelWriter can
run on. The instructions below are supplementary information, instructions for alterbative methods,
and additional build options.
.. admonition:: Help Wanted
:class: seealso
If you would like to help making more installers, the project is currently looking for people
who can help make releases for Red Hat-based Linux distros (RPM) and for macOS. See the issues
posted for RPM_ and macOS_ on GitHub_.
.. _a_started_windows:
Install on Windows
==================
You can install novelWriter with both Python and library dependencies embedded using the Windows
Installer (setup.exe) file from the `main website`_, or from the Releases_ page on GitHub.
Installing it should be straightforward.
If you have any issues, try uninstalling the previous version and making a fresh install. If you
already had a version installed via a different method, you should uninstall that first.
.. _a_started_linux:
Install on Linux
================
A Debian package can be downloaded from the `main website`_, or from the Releases_ page on GitHub.
This package should work on both Debian, Ubuntu and Linux Mint, at least.
If you prefer, you can also add the novelWriter repository on Launchpad to your package manager.
Ubuntu
------
You can add the Ubuntu PPA_ and install novelWriter with the following commands.
.. code-block:: bash
sudo add-apt-repository ppa:vkbo/novelwriter
sudo apt update
sudo apt install novelwriter
If you want pre-releases, add the ``ppa:vkbo/novelwriter-pre`` repository instead.
Debian and Mint
---------------
Since this is a pure Python package, the Launchpad PPA can in principle also be used on Debian or
Mint. However, the above command will fail to add the signing key.
Instead, run the following commands to add the repository and key:
.. code-block:: bash
sudo gpg --no-default-keyring --keyring /usr/share/keyrings/novelwriter-ppa-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F19F1FCE50043114
echo "deb [signed-by=/usr/share/keyrings/novelwriter-ppa-keyring.gpg] http://ppa.launchpad.net/vkbo/novelwriter/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/novelwriter.list
Then run the update and install commands as for Ubuntu:
.. code-block:: bash
sudo apt update
sudo apt install novelwriter
.. note::
The text below assumes the command ``python`` corresponds to a Python 3 executable. Python 2 is
now deprecated, but many systems still have both Python 2 and 3. For such systems, the command
``python3`` may be needed instead. On Linux, the scripts can also be made executable and run
without the ``python`` command. Likewise, ``pip`` may need to be replaced with ``pip3``.
Please use the Ubuntu 20.04 (focal) packages for Debian. The newer Ubuntu packages use a
different compression algorithm that Debian doesn't currently support.
.. _a_started_depend:
AppImage Releases
-----------------
Dependencies
============
novelWriter has been designed to rely on as few dependencies as possible. Aside from the packages
needed to communicate with the Qt GUI libraries, only one package is required for handling the XML
format of the main project file. Everything else is handled with standard Python libraries.
The following Python packages are needed to run novelWriter:
* ``pyqt5`` – needed for connecting with the Qt5 libraries.
* ``lxml`` – needed for full XML support.
* ``pyenchant`` – needed for efficient spell checking (optional).
PyQt/Qt should be at least 5.3, but ideally 5.10 or higher for nearly all features to work. For
instance, searching using regular expressions with full Unicode support requires 5.13. There is no
known minimum version requirement for package ``lxml``, but the code was originally written with
4.2, which is therefore set as the minimum. It may work on lower versions. You have to test it.
Optionally, a package can be installed to interface with the Enchant spell checking libaries, but
this isn't strictly required. If no external spell checking library is available, novelWriter falls
back to using the internal ``difflib`` of Python to check spelling. This is a slower and less
sophisticated spell checker than the full spell checking libaries. The spell check library must be
at least 3.0 to work with Windows. On Linux, 2.0 also works fine.
If you install from PyPi, these dependencies should be installed automatically. If you install from
source, dependencies can still be installed from PyPi with:
.. code-block:: console
pip install -r requirements.txt
For other Linux distros than the ones mentioned above, the primary option is AppImage_. These are
completely standalone images for the app that include the necessary environment to run novelWriter.
They can of course be run on any Linux distro, if you prefer this to native packages.
.. _a_started_install:
.. _a_started_minimal:
Installing via PyPi
===================
Minimal Package Install
=======================
The application is written in Python 3 using Qt5 via PyQt5. It is developed on Linux, but it should
in principle work fine on other operating systems as long as dependencies are met.
On the `main website`_ and on the Releases_ page on GitHub you will also find "Minimal Package"
install files for Windows, Linux and macOS. These are zip files of just the files you need to run
novelWriter on that specific platform.
You can download the latest version of novelWriter from the source repository on GitHub_.
novelWriter is also hosted on PyPi_, and can be installed on all operating systems that support Qt5
and Python 3. It is regularly tested on Linux, Windows and macOS. The latest version of novelWriter
is |release|.
These zip files don't include any dependencies, so you must install them separately.
.. _a_started_minimal_windows:
Minimal Package on Windows
--------------------------
First, make sure you have Python installed on your system. If you don't, you can download it from
`python.org`_. Python 3.7 or higher is required, but it is recommended that you install the latest
version.
Make sure you select the "Add Python to PATH" option during installation, otherwise the ``python``
command will not work in the command line window.
.. figure:: images/python_win_install.png
:align: center
:width: 500
When Python is installed, extract the novelWriter zip file and move the extracted folder to a
suitable location. You should probably not keep it on your desktop or in your downloads folder
where it may be accidentally deleted. Instead, move and rename it to for instance
``C:\novelWriter``.
After you've got the folder where you want it, open it and double-click the file named
``windows_install.bat``. This will open a command line window and run the setup script to install
dependencies, and add desktop and start menu icons.
Running ``windows_uninstall.bat`` will reverse the process if you wish to uninstall. After that,
you can just delete the novelWriter folder.
.. _a_started_minimal_linux:
Minimal Package on Linux
------------------------
On Linux you need to install the following packages on Debian-based distros, including Ubuntu and
Linux Mint:
.. code-block:: bash
sudo apt install python3-pyqt5 python3-lxml python3-enchant
On Fedora, you need the following packages:
.. code-block:: bash
sudo dnf install python3-qt5 python3-lxml python3-enchant
A standard desktop launcher can be installed via the main setup script. It will create the needed
desktop file and add it to the Applications menu. The necessary icons will also be installed, and a
file association with ``.nwx`` project files added.
To set this up, run the following from inside the extracted novelWriter folder:
.. code-block:: bash
python3 setup.py xdg-install
This installs icons for the current user. Run with ``sudo`` to install system-wide.
To uninstall the icons, run:
.. code-block:: bash
python3 setup.py xdg-uninstall
.. _a_started_minimal_mac:
Minimal Package on macOS
------------------------
These instructions assume you're using brew, and have Python and pip set up. If not, see the
`brew docs`_ for help. The main requirements for novelWriter are installed via the requirements
file. You also need to install the ``pyobjc`` package, so you should run:
.. code-block:: bash
pip3 install --user -r requirements.txt
pip3 install --user pyobjc
For spell checking you may also need to install the enchant package. It comes with a lot of default
dictionaries.
.. code-block:: bash
brew install enchant
With the dependencies in place, you can launch the ``novelWriter.py`` script directly to run
novelWriter.
.. note::
Right now there isn't a better integration with macOS available. Contributions from someone more
familiar with macOS would be very much appreciated. See the macOS_ issue on GitHub.
.. _a_started_pip:
Install from PyPi
=================
novelWriter is also available on the Python Package Index, or PyPi_. This install method works on
all supported operating systems.
To install from PyPi you must first have the ``python`` and ``pip`` commands available on your
system. If you don't, see specific instructions for your operating system in this documentation.
system. If you don't, see specific instructions for your operating system in this documentation on
how to get the Python environment set up.
To install novelWriter from PyPi, use the following command:
.. code-block:: console
.. code-block:: bash
pip install novelwriter
To upgrade an existing installation, use:
.. code-block:: console
.. code-block:: bash
pip install --upgrade novelwriter
When installing via pip, novelWriter can be launched from command line with:
.. code-block:: console
.. code-block:: bash
novelWriter
novelwriter
Make sure the install location for pip is in your PATH variable. This is not always the case by
default.
.. _a_started_i18n:
Building the Translation Files
==============================
If you installed novelWriter from a package, the translation files should be pre-built and
included. If you're running novelWriter from the source code, you will need to generate the files
yourself. The files you need will be written to the ``i18n`` folder, and will have the ``.qm`` file
extension.
You can build the ``.qm`` files with:
.. code-block:: console
python3 setup.py qtlrelease
This requires that the Python package ``pylupdate5`` to be installed.
.. note::
If you want to improve novelWriter with translation files for another language, or update an
existing translation, instructions for how to contribute can be found in the README file in the
``i18n`` folder of the source code.
.. _a_started_docs:
Building the Documentation
==========================
If you installed novelWriter from a package, the documentation should be bre-built and included. If
you're running novelWriter from the source code, a local copy of this documentation can be
generated. It requires the following Python packages on Debian and Ubuntu.
* ``python3-sphinx``
* ``python3-sphinx-rtd-theme``
* ``python3-sphinxcontrib.qthelp``
Or from PyPi:
.. code-block:: console
pip install sphinx sphinx-rtd-theme sphinxcontrib-qthelp
The documentation can then be built from the ``docs`` folder in the source code by running:
.. code-block:: console
make html
If successful, the documentation should be available in the ``docs/build/html`` folder and you can
open the ``index.html`` file in your browser.
The documentation can also be built for the Qt Assistant. To build the help packages from the
documentation source, run the following from the root source folder:
.. code-block:: console
python setup.py qthelp
The setup script will copy the generated files into the ``nw/assets/help`` folder, and novelWriter
will detect the presence of the files and redirect the menu help entry to open help locally instead
of sending the user to the website. Pressing the :kbd:`F1` key will in any case try to open help
locally first, then send you to the website as a fallback.
.. note::
In order for the local version of help to work, the Qt Assistant must be installed on the local
computer. If it isn't available, or novelWriter cannot find it, the help feature will fall back
to redirecting you to the documentation website.
On systems with both Python 2 and 3, you may have to replace the ``pip`` command with ``pip3``.

View File

@@ -1,11 +1,17 @@
.. _a_export:
******************
Exporting Projects
******************
***********************
Building the Manuscript
***********************
The novelWriter project can be exported in various formats using the build tool available from
:guilabel:`Build Novel Project` in the :guilabel:`Tools` menu, or by pressing :kbd:`F5`.
You can at any time build a manuscript, an outline of your notes, or any other type of document
from the text in your project. All of this is handled by the :guilabel:`Build Novel Project` tool.
You can activate it from the sidebar, the :guilabel:`Tools` menu, or by pressing :kbd:`F5`.
.. note::
This tool is scheduled to receive a full update in novelWriter 2.1, adding many new features
requested by users. See the `2.1 Milestone <https://github.com/vkbo/novelWriter/milestone/43>`_
for an overview.
.. _a_export_headers:
@@ -13,7 +19,7 @@ The novelWriter project can be exported in various formats using the build tool
Header Formatting
=================
The titles for the five types of titles (the chapter headings come in a numbered and unnumbered
The titles for the five types of headings (the chapter headings come in a numbered and unnumbered
version) of story structure can be formatted collectively in the build tool. This is done through
a series of keyword–replace steps. They are all on the format ``%keyword%``.
@@ -23,19 +29,19 @@ a series of keyword–replace steps. They are all on the format ``%keyword%``.
``%ch%``
This will be replaced by a chapter number. The number is incremented by one each time the build
tool sees a new heading of level two in a document with layout :guilabel:`Chapter`. If the
document has layout :guilabel:`Unnumbered`, the counter is *not* incremented. The latter is
useful for for instance Prologue and Epilogue chapters. Adding an asterisk (``*``) in front of
the title text of a level two heading will also disable the chapter counter for that heading.
tool sees a new heading of level two in a document, unless the heading formatting code has the
added ``!``. In the latter case, the counter is *not* incremented. This is useful for for
instance Prologue and Epilogue chapters.
``%chw%``
Behaves like ``%ch%``, but the number is represented as a number word.
Behaves like ``%ch%``, but the number is represented as a number word. You can select between a
number of different languages.
``%chi%``
Begaves like ``%ch%``, but the number is represented as a lower case Roman number.
Begaves like ``%ch%``, but represented as a lower case Roman number from 1 to 4999.
``%chI%``
Behaves like ``%ch%``, but the number is represented as an upper case Roman number.
Behaves like ``%ch%``, but represented as an upper case Roman number from 1 to 4999.
``%sc%``
This is the number counter equivalent for scenes. These are incremented each time a heading of
@@ -50,9 +56,7 @@ a series of keyword–replace steps. They are all on the format ``%keyword%``.
This inserts a line break within the title.
.. note::
Header formatting only applies to novel documents. Headings in notes will be left as-is on
export. However, heading levels 1 through 4 are converted to the correct heading level in the
respective output formats.
Header formatting only applies to novel documents. Headings in notes will be left as-is.
**Example**
@@ -68,7 +72,7 @@ Scene Separators
If you don't want any titles for your scenes (or for your sections if you have them), you can leave
the formatting boxes empty. If so, an empty paragraph will be inserted between the scenes or
sections instead.
sections instead, resulting in a gap in the text.
Alternatively, if you want a separator between them, like the common ``* * *``, you can enter the
desired separator text in the formatting box. In fact, if the format is a piece of static text, it
@@ -80,14 +84,9 @@ will always be treated as a separator.
File Selection
==============
Which documents and notes are selected for export can be controlled from the options on the left
side of the dialog window. The switch for :guilabel:`Include novel files` will select any document
that isn't classified as a note. The switch for :guilabel:`Include note files` will select any
document that *is* a note. This allows for exporting just the novel, just your notes, or both, as
you see fit.
In addition, you can select to export the synopsis comments, regular comments, keywords, and even
exclude the body text itself.
Which documents and notes are selected for the build can be controlled from the options on the left
side of the dialog window. In addition, you can select to include the synopsis comments, regular
comments, keywords, and even exclude the body text itself if you just want an outline.
.. tip::
If you for instance want to export a document with an outline of the novel, you can enable
@@ -95,11 +94,9 @@ exclude the body text itself.
followed by the tags and references and the synopsis.
If you need to exclude specific documents from your exports, like draft documents or documents you
want to take out of your manuscript, but don't want to delete, you can un-check the
:guilabel:`Include when building project` option for each document in the project tree. An included
document has a checkmark after the status icon in the :guilabel:`Flags` column. The
:guilabel:`Build Novel Project` tool has a switch to ignore this flag if you need to collectively
override these settings.
want to take out of your manuscript, but don't want to delete, you can set the documents as
"inactive" in the project tree. :guilabel:`Build Novel Project` tool has a switch to collectively
exclude inactive documents.
.. _a_export_print:
@@ -108,8 +105,12 @@ Printing
========
The print button allows you to print the content in the preview window. You can either print to one
of your system's printers, or print directly to file. You can also print to file from the regular
print dialog. The direct to file option is just a shortcut.
of your system's printers, or print directly to a file as PDF. You can also print to file from the
regular print dialog. The direct to file option is just a shortcut.
.. note::
The paper format should in all cases default to whatever your system default is. Of you want to
change it, you have to select it from the :guilabel:`Print Preview`` dialog.
.. _a_export_formats:
@@ -117,16 +118,17 @@ print dialog. The direct to file option is just a shortcut.
Export Formats
==============
Currently, six formats are supported for exporting.
Currently, six formats are supported.
Open Document Format
The Build tool can produce either an ``.odt`` file, or an ``.fodt`` file. The latter is just a
flat version of the document format as a single XML file.
flat version of the document format as a single XML file. Most rich text editors support the
former, and a few the latter.
novelWriter HTML
The HTML export format writes a single ``.htm`` file with minimal style formatting. The exported
HTML document is suitable for further processing by document conversion tools like Pandoc, for
importing in word processors, or for printing from browser.
The HTML format writes a single ``.htm`` file with minimal style formatting. The HTML document
is suitable for further processing by document conversion tools like Pandoc, for importing in
word processors, or for printing from browser.
novelWriter Markdown
This is simply a concatenation of the project documents selected by the filters. The documents
@@ -135,23 +137,23 @@ novelWriter Markdown
import back into novelWriter.
Standard/GitHub Markdown
The Markdown export format comes in both Standard and GitHub flavour. The *only* difference in
terms of novelWriter functionality is the support of strikethrough text, which is not supported
by the Standard flavour, but *is* supported by the GitHub flavour.
The Markdown format comes in both Standard and GitHub flavour. The *only* difference in terms of
novelWriter functionality is the support for strikethrough text, which is not supported by the
Standard flavour, but *is* supported by the GitHub flavour.
.. _a_export_options:
Additional Export Options
=========================
Additional Formats
==================
In addition to the above document formats, the novelWriter HTML and Markdown formats can also be
wrapped in a JSON file. These files will have a meta data entry and a body entry. For HTML, also
the accompanying css styles are exported.
the accompanying css styles are included.
The text body is saved in a two-level list. The outer list contains one entry per exported
document, in the order they appear in the project tree. Each document is then split up into a list
as well, with one entry per paragraph it contains.
The text body is saved in a two-level list. The outer list contains one entry per document, in the
order they appear in the project tree. Each document is then split up into a list as well, with one
entry per paragraph it contains.
These files are mainly intended for scripted post-processing for those who want that option. A JSON
file can be imported directly into a Python dict object or a PHP array, to mentions a few options.

View File

@@ -13,9 +13,9 @@ The relation between all these additional elements is extracted from the documen
project indexer, based on the tags and references you set within them.
Using notes is not required, but making at least minimal notes for each plot element, and adding a
tag to them, makes it possible to use the :guilabel:`Outline` feature to see how each element
intersects with each section of the novel itself, and adds clickable cross-references between
documents in the editor and viewer.
tag to them, makes it possible to use the Outline View to see how each element intersects with each
section of the novel itself, and adds clickable cross-references between documents in the editor
and viewer.
.. _a_notes_tags:
@@ -24,10 +24,10 @@ Tags in Notes
=============
Each new heading in a note can have a tag associated with it. The format of a tag is
``@tag: tagname``, where tagname is a unique identifier. Tags can then be referenced in the novel
documents, or cross-referenced in other notes, and will show up in the outline view and in the
back-reference panel when a document is being viewed. See :ref:`a_struct_tags` for how to reference
notes.
``@tag: tagname``, where tagname is a unique identifier of your choosing. Tags can then be
referenced in the novel documents, or cross-referenced in other notes, and will show up in the
Outline View and in the back-reference panel when a document is opened in the viewer. See
:ref:`a_struct_tags` for how to reference notes.
The syntax highlighter will alert the user that the keyword is correctly used and that the tag is
allowed, that is, the tag is unique. Duplicate tags should be detected as long as the index is up
@@ -36,15 +36,37 @@ colour that valid tags do.
The tag is the only part of these notes that the application 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 exported if you want to compile a single document of all your notes, or include them in an
outline.
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:`Build Novel Project` tool.
A note can also reference other notes in the same way novel documents do. When the note is opened
in the view panel, the references become clickable links, making it easier to follow connections in
the plot. Notes don't show up in the outline view though, so referencing between notes is only
meaningful if you want to be able to click-navigate between them.
One note can also reference another note in the same way novel documents do. When the note is
opened in the view panel, the references become clickable links, making it easier to follow
connections in the plot. Notes don't show up in the Outline View though, so referencing between
notes is only meaningful if you want to be able to click-navigate between them, or of course if you
just want to highlight that two notes are related.
.. tip::
If you cross-reference between notes and export your project as an HTML document using the
:guilabel:`Build Novel Project` tool, the cross-references become clickable links in the
exported HTML document.
Example of a project note with two headers, with separate tags, and with references to other notes:
.. code-block:: none
:linenos:
# Main Characters
## Jane Doe
@tag: Jane
@location: Earth
Something about Jane ...
## John Doh
@tag: John
@location: Mars
Something about John ...

View File

@@ -4,11 +4,12 @@
Novel Projects
**************
A new project 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 project suited to your needs. A novelWriter project requires a dedicated folder
for storing its files on the local file system. See :ref:`a_tech` for further details on how files
are organised.
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
project suited to your needs.
A novelWriter project requires a dedicated folder for storing its files on the local file system.
See :ref:`a_storage` for further details on how files are organised.
A list of recently opened projects is maintained, and displayed in the :guilabel:`Open Project`
dialog. A project can be removed from this list by selecting it and pressing the :kbd:`Del` key or
@@ -25,33 +26,42 @@ including word counts, and a table of contents with word and page counts, is ava
Project Roots
=============
Projects are structured into a set of top level folders called *root folders*. They are visible in
Projects are structured into a set of top level folders called "Root Folders". They are visible in
the project tree at the left side of the main window.
The core novel documents go into a root folder of type :guilabel:`Novel`. Other supporting
documents go into the other root folders. These other root folder types are intended for your notes
on the various elements of your story. Using them is of course entirely optional.
The novel documents go into a root folder of type :guilabel:`Novel`. Project notes go into the
other root folders. These other root folder types are intended for your notes on the various
elements of your story. Using them is of course entirely optional.
A new project may not have all of the root folders present, but you can add the ones you want from
:guilabel:`Create Root Folder` in the :guilabel:`Project` menu.
the project tree tool bar.
The root folders are intended for the following use, but aside from the :guilabel:`Novel` folder,
no restrictions are enforced by the application. You can use them however you want.
Each root folder has one or more reference keyword associated with it that is used to reference
them from other documents and notes. The intended usage of each type of root folder is 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.
.. tip::
You can make multiple root folders of each kind if you wish to split up your notes.
.. note::
It is not the notes themselves that are referenced by the listed reference keywords, but tags
set within the notes. See the examples below and in :ref:`a_struct_tags`.
:guilabel:`Novel`
This is the root folder of all text that goes into the final novel. This class of documents have
other rules and features than other documents in the project. See :ref:`a_struct` for more
This is the root folder of all text that goes into the final novel or novels. This class of
documents have other rules and features than the project notes. See :ref:`a_struct` for more
details.
:guilabel:`Plot`
This is the root folder where main plots can be outlined. It is optional, but adding at least
dummy notes can be useful in order to tag plot elements for the Outline view. Tags in this
brief notes can be useful in order to tag plot elements for the Outline View. Tags in this
folder can be references using the ``@plot`` keyword.
:guilabel:`Characters`
Character notes go in this root folder. These are especially important if one wants to use the
Outline view to see which character appears where, and which part of the story is told from a
specific character's point-of-view or focusing on a particular character's storyline. Tags in
Character notes go in this root folder. These are especially important if you want to use the
Outline View to see which character appears where, and which part of the story is told from a
specific character's point-of-view, or focusing on a particular character's storyline. Tags in
this folder can be referenced using the ``@pov`` keyword for point-of-view characters,
``@focus`` for a focus character, or the ``@char`` keyword for any other characters.
@@ -80,10 +90,31 @@ no restrictions are enforced by the application. You can use them however you wa
The root folders correspond to the categories of tags that can be used to reference them. For more
information about the tags listed, see :ref:`a_struct_tags`.
.. tip::
You can rename root folders to whatever you want. The first character in the :guilabel:`Flags`
column in the project tree will still indicate what type they are, and so will the icon if you
are using one of the optional icon sets.
.. note::
You can rename root folders to whatever you want. However, this doesn't change the reference
keyword.
Example of a character note:
.. code-block:: none
:linenos:
# Jane Doe
@tag: Jane
Some information about the character Jane Doe.
Example of a novel scene referencing the above character:
.. code-block:: none
:linenos:
### Chapter 1, Scene 1
@pov: Jane
When Jane woke up that morning ...
.. _a_proj_roots_del:
@@ -96,21 +127,18 @@ trash folder can then be deleted permanently, either individually, or by emptyin
the menu. Documents in the trash folder are removed from the project index and cannot be
referenced.
Folders and root folders can only be deleted when they are empty. Recursive deletion is not
supported. A document or a folder can be deleted from the :guilabel:`Project` menu, or by pressing
:kbd:`Ctrl`:kbd:`Shift`:kbd:`Del`.
A document or a folder can be deleted from the :guilabel:`Project` menu, or by pressing
:kbd:`Ctrl`:kbd:`Shift`:kbd:`Del`. Root folders can only be deleted when they are empty.
.. _a_proj_roots_out:
Archived Documents (Outtakes)
-----------------------------
Archived Documents
------------------
If you don't want to delete a document, or put it in the :guilabel:`Trash` folder where it may be
deleted, but still want it out of your main project tree, you can create an :guilabel:`Outtakes`
root folder from the :guilabel:`Project` menu. You are not allowed to move entire folders to this
root folder, only documents. If you need folders in it to organise your documents, you can of
course create new ones there.
deleted, but still want it out of your main project tree, you can create an :guilabel:`Archive`
root folder.
You can drag any document to this folder and preserve its settings. The document will always be
excluded from the :guilabel:`Build Novel Project` builds. It is also removed from the project
@@ -127,7 +155,7 @@ file synchronisation tool that runs out of sync, there may be files in the proje
aren't tracked in the core project file. These files, when discovered, are recovered and added back
into the project if possible.
The discovered files are scanned for meta information that gives clues as to where the document may
The discovered files are scanned for meta information that give clues as to where the document may
previously have been located in the project. The project loading routines will try to put them back
as close as possible to this location, if it still exists. Generally, it will be appended to the
end of the folder where it previously was located. If that folder doesn't exist, it will try to add
@@ -161,7 +189,7 @@ this warning, and continue opening the project at your own risk.
the project are in fact open, you are likely to cause inconsistencies and create diverging
project files, potentially resulting in loss of data and orphaned files. You are not likely to
lose any actual text unless both instances have the same document open in the editor, and
novelWriter will try to resolve inconsistencies the next time you open the project.
novelWriter will try to resolve project inconsistencies the next time you open the project.
.. _a_proj_roots_dirs:
@@ -178,9 +206,10 @@ and to be able to collapse and hide them in the project tree when you're not wor
documents.
.. tip::
You can use folders to sort your scene documents into chapters. You will still need to add a
chapter document as the first item of your chapter folder, and the scene documents as the
following items. Another way to use folders is to make a folder for each act.
You can add child documents to other documents. This is particularly useful when you create
chapters and scenes. If you add separate scene documents, you should also add separate chapter
documents, even if they only contain a chapter heading. You can then add scene documents as
child items to the chapters.
.. _a_proj_files:
@@ -188,20 +217,15 @@ documents.
Project Documents
=================
New documents can be created from the :guilabel:`Document` menu, or by pressing :kbd:`Ctrl`:kbd:`N`
while in the project tree. This will create a new, empty document, and open the :guilabel:`Item
Settings` dialog where the document label and various other settings can be changed. This dialog
can also be opened again later from either the :guilabel:`Project` menu, selecting :guilabel:`Edit
Project Item`, or by pressing :kbd:`Ctrl`:kbd:`E` or :kbd:`F2` with the item selected.
New documents can be created from the tool bar in the Project Tree, or by pressing
:kbd:`Ctrl`:kbd:`N`. This will open the create new item menu and let you choose between a number of
pre-defined documents and folders. You will be prompted for a label for the new item. You can
always rename an item by selecting :guilabel:`Rename Item` from the :guilabel:`Project` menu, or by
pressing :kbd:`F2`.
The layout of the document is also defined here. For Novel documents, the full list of layout
options are available. For non-Novel documents, only :guilabel:`Note` is available. See
:ref:`a_struct_layout` for more details.
You can also select whether the document is by default included when building the project. This
setting can be overridden in the :guilabel:`Build Novel Project` tool if you wish to include them
anyway. This is covered in the :ref:`a_export_files` section. You can also toggle the included
state of a document from the right-click context menu.
Other settings for project items are available from the context menu that you can activate by
right-clicking on an item in the Project Tree. The :guilabel:`Transform` submenu includes options
for converting, splitting, or merging items.
.. _a_proj_files_counts:
@@ -210,11 +234,11 @@ Word Counts
-----------
A character, word and paragraph count is maintained for each document, as well as for each section
of a document following a header. The word count, and change of words in the current session, is
of a document following a header. The word count and change of words in the current session is
displayed in the footer of any document open in the editor, and all stats are shown in the details
panel below the project tree for any document selected in the project or novel tree.
The word counts are not updated in real time, but run in the background every five seconds for as
The word counts are not updated in real time, but run in the background every few seconds for as
long as the document is being actively edited.
A total project word count is displayed in the status bar. The total count depends on the sum of
@@ -235,17 +259,16 @@ The :guilabel:`Project Settings` can be accessed from the :guilabel:`Project` me
Settings Tab
------------
The :guilabel:`Settings` tab holds the project title and author settings.
The :guilabel:`Settings` tab holds the project name, title, and author settings.
The :guilabel:`Working Title` can be set to a different title than the :guilabel:`Book Title`. The
difference between them is simply that the :guilabel:`Working Title` is used for the GUI (main
window title) and for generating the backup files. The intention is that the :guilabel:`Working
Title` should remain unchanged throughout the project, otherwise the name of exported files and
backup files may change too.
The :guilabel:`Project Name` can be set to a different value than the :guilabel:`Novel Title`. The
difference between them is simply that the :guilabel:`Project Name` is used for the GUI (main
window title) and for generating the backup files. The intention is that the
:guilabel:`Project Name` should remain unchanged throughout the project's lifetime, otherwise the
name of exported files and backup files may change too.
The :guilabel:`Book Title` and :guilabel:`Book Authors` settings are currently not used for
anything, so setting then is just for the benefit of the author. Future features may be using them,
and they are exported on some export formats in the :guilabel:`Build Novel Project` tool.
The :guilabel:`Novel Title` and :guilabel:`Authors` settings are used when building the manuscript,
for some formats.
If your project is in a different language than your main spell checking is set to, you can
override the default spell checking language here. You can also override the automatic backup
@@ -255,14 +278,14 @@ setting.
Status and Importance Tabs
--------------------------
Each document or folder of type :guilabel:`Novel` can be given a status level, signified by a
coloured icon, and each document or folder of the remaining types can be given an importance level.
These are colour coded icons and labels that can be applied to each document or folder.
Each document or folder of type :guilabel:`Novel` can be given a *Status*_* label accompanied by a
coloured icon, and each document or folder of the remaining types can be given an *Importance*
label.
These are purely there for the user's convenience, and you are not required to use them for any
other features to work. No other part of novelWriter accesses this information. The intention is to
use these to indicate at what stage of completion each novel document is, or how important the
content of a note is to the plot. You don't have to use them this way, that's just what they were
content of a note is to the story. You don't have to use them this way, that's just what they were
intended for, but you can make them whatever you want.
See also :ref:`a_ui_tree_status`.
@@ -277,10 +300,10 @@ Auto-Replace Tab
A set of automatically replaced keywords can be added in this tab. The keywords in the left column
will be replaced by the text in the right column when documents are opened in the viewer. They will
also be applied to exports.
also be applied to manuscript builds.
The auto-replace feature will replace text in angle brackets that are in this list. The syntax
highlighter will add an alternate colour to text marching the syntax, but it doesn't check if the
highlighter will add an alternate colour to text matching the syntax, but it doesn't check if the
text is in this list.
.. note::
@@ -298,16 +321,17 @@ An automatic backup system is built into novelWriter. In order to use it, a back
the backup files are to be stored must be provided in :guilabel:`Preferences`.
Backups can be run automatically when a project is closed, which also implies it is run when the
application itself is closed. Backups are date stamped zip files of the entire project folder, and
are stored in a subfolder of the backup path. The subfolder will have the same name as the project
:guilabel:`Working Title` set in :ref:`a_proj_settings`.
application itself is closed. Backups are date stamped zip files of the project files in the
project folder (files not strictly a part of the project are ignored). The zip archives are stored
in a subfolder of the backup path. The subfolder will have the same name as the
:guilabel:`Project Name` as defined in :ref:`a_proj_settings`.
The backup feature, when configured, can also be run manually from the :guilabel:`Tools` menu.
It is also possible to disable automated backup for a given project in :guilabel:`Project
Settings`.
It is also possible to disable automated backups for a given project in
:guilabel:`Project Settings`.
.. note::
For the backup to be able to run, the :guilabel:`Working Title` must be set in
For the backup to be able to run, the :guilabel:`Project Name` must be set in
:guilabel:`Project Settings`. This value is used to generate the folder name for the zip files.
Without it, the backup will not run at all, but it will produce a warning message.
@@ -318,18 +342,20 @@ Writing Statistics
==================
When you work on a project, a log file records when you opened it, when you closed it, and the
total word counts of your novel documents and notes at the end of the session. You can view this
total word counts of your novel documents and notes at the end of the session, provided that the
session lasted either more than 5 minutes, or that the total word count changed. You can view this
file in the ``meta`` folder in the directory where you saved your project. The file is named
``sessionStats.log``.
A tool to view the content of this file is available in the :guilabel:`Tools` menu under
:guilabel:`Writing Statistics`. You can also launch it by pressing :kbd:`F6`.
:guilabel:`Writing Statistics`. You can also launch it by pressing :kbd:`F6`, or find it on the
Sidebar.
The tool will show a list of all your sessions, and a set of filters to apply to it. You can also
export the filtered data to a JSON file or to a CSV file that can be opened by a spreadsheet
The tool will show a list of all your sessions, and a set of filters to apply to the data. You can
also export the filtered data to a JSON file or to a CSV file that can be opened by a spreadsheet
application like for instance Libre Office Calc.
As of version 1.2, the log file also stores how much of the session time was spent idle. The
definition of idle here is that the novelWriter main window loses focus, and the user hasn't made
definition of idle here is that the novelWriter main window loses focus, or the user hasn't made
any changes to the currently open document in five minutes. The number of minutes can be altered in
:guilabel:`Preferences`.

View File

@@ -0,0 +1,208 @@
.. _a_struct:
***************
Novel Structure
***************
This section covers the structure of a novel project.
It concerns documents under the :guilabel:`Novel` type root folder only. There are some
restrictions and features that only apply to these types of documents.
.. _a_struct_heads:
Importance of Headings
======================
Subfolders under root folders have no impact on the structure of the novel itself. The structure is
instead dictated by the heading level of the headers within the documents.
Four levels of headings are supported, signified by the number of hashes (``#``) preceding the
title. See also the :ref:`a_fmt` section for more details about the markdown syntax.
.. note::
The header levels are not only important when generating the manuscript, they are also used by
the indexer when building the outline tree in the Outline as well as the Novel Tree. Each
heading also starts a new region where new references and tags can be defined.
The syntax for the four basic header types, and the two special header types, is listed in section
:ref:`a_fmt_head`. The meaning of the four levels for the structure of your novel is as follows:
**Header Level 1: Partition**
This header level signifies that the text refers to a top level partition. This is useful when
you want to split the manuscript up into books, parts, or acts. These headings are not required.
The novel title itself should use the special header level explained in :ref:`a_fmt_head`.
**Header Level 2: Chapter**
This header level signifies a chapter level partition. Each time you want to start a new
chapter, you must add such a heading. If you choose to split your manuscript up into one
document per scene, you need a single chapter document with just the heading. You can of course
also add a synopsis and reference keywords to the chapter document. If you want to open the
chapter with a quote or other introductory text that isn't part of a scene, this is also where
you'd put that text.
**Header Level 3: Scene**
This header level signifies a scene level partition. You must provide a title text, but the
title text can be replaced with a scene separator or just skipped entirely when you build your
manuscript.
**Header Level 4: Section**
This header level signifies a sub-scene level partition, usually called a "section" in the
documentation and the user interface. These can be useful if you want to change tag references
mid-scene, like if you change the point-of-view character. You are free to use sections as you
wish, and you can filter them out of the final manuscript just like with scene titles.
Page breaks are automatically added before level 1 and 2 headers when you build your project to a
format that supports page breaks, or when you print the document directly from the build tool. If
you want page breaks in other places, you have to specify them manually. See :ref:`a_fmt_break`.
.. tip::
There are multiple options of how to process novel titles when building the manuscript. For
instance, chapter numbers can be applied automatically, and so can scene numbers if you want
them in a draft manuscript. See the :ref:`a_export` page for more details.
.. _a_struct_heads_title:
Novel Title and Front Matter
----------------------------
It is recommended that you add a document at the very top of each Novel root folder with the novel
title as the first line. You should modify the level 1 header format code with an ``!`` in order to
render it as a document title that is excluded from any automatic Table of Content in a manuscript
build document, like so:
``#! My Novel``
The title is by default centred on the page. You can add more text to the page as you wish, like
for instance the author's name and details.
If you want an additional page of text after the title page, starting on a fresh page, you can add
``[NEW PAGE]`` on a line by itself, and continue the text after it. This will insert a page break
before the text. See also :ref:`a_fmt_break`.
.. _a_struct_heads_unnum:
Unnumbered Chapter Headings
---------------------------
If you use the automatic numbering feature for your chapters, but you want to keep some special
chapters separate from this, you cam add a ``!`` to the level 2 header formatting code to tell the
build tool to skip these chapters.
``##! Unnumbered Chapter Title``
There is a separate formatting feature for such chapters in the :guilabel:`Build Novel Project`
tool as well. See the :ref:`a_export` page for more details. When building a document of a format
that supports page breaks, also unnumbered chapters will have a page break added just like for
normal chapters.
.. Note::
Previously, you could also disable the automatic numbering of a chapter by adding an ``*`` as
the first character of the chapter title itself. This feature has been dropped in favour of the
current format in order to keep level 1 and 2 headers consistent. Please update your chapter
headings if you've used this syntax.
.. _a_struct_tags:
Note References
===============
Each text partition, indicated by a heading of any level, can contain references to tags set in the
project notes of the project. The references are gathered by the indexer and used to generate the
Outline View. This section covers how to make references to tags. See :ref:`a_notes_tags` for how
to define tags the references can point to.
References and tags are also clickable in the document editor and viewer, making it easy to
navigate between reference notes while writing. Clicked links are always opened in the view panel.
References are set as a keyword and a list of corresponding tags. The valid keywords are listed
below. The format of a reference line is ``@keyword: value1, [value2] ... [valueN]``. All keywords
allow multiple values.
``@pov``
The point-of-view character for the current section. The target must be a note tag in a
:guilabel:`Character` type root folder.
``@focus``
The character that has the focus for the current section. This can be used in cases where the
focus is not a point-of-view character. The target must be a note tag in a :guilabel:`Character`
type root folder.
``@char``
Other characters in the current section. The target must be a note tag in a
:guilabel:`Character` type root folder. This should not include the point-of-view or focus
character if those references are used.
``@plot``
The plot or subplot advanced in the current section. The target must be a note tag in a
:guilabel:`Plot` type root folder.
``@time``
The timelines touched by the current section. The target must be a note tag in a
:guilabel:`Timeline` type root folder.
``@location``
The location the current section takes place in. The target must be a note tag in a
:guilabel:`Locations` type root folder.
``@object``
Objects present in the current section. The target must be a note tag in a :guilabel:`Object`
type root folder.
``@entity``
Entities present in the current section. The target must be a note tag in a
:guilabel:`Entities` type root folder.
``@custom``
Custom references in the current section. The target must be a note tag in a :guilabel:`Custom`
type root folder. The custom folder are for any other category of notes you may want to use.
The syntax highlighter will alert the user that the tags and references are used correctly, and
that the tags referenced exist.
The highlighter may be mistaken if the index of defined tags is out of date. If so, press :kbd:`F9`
to regenerate it, or select :guilabel:`Rebuild Index` from the :guilabel:`Tools` menu. In general,
the index for a document is regenerated when it is saved, so this shouldn't normally be necessary.
Example of a novel document with references to characters and plots:
.. code-block:: none
:linenos:
## Chapter 1
@pov: Jane
### Scene 1
@char: John, Sam
@plot: Main
Once upon a time ...
.. _a_struct_layout:
Document Layout
===============
All documents in the project can have a layout format set. Previously, there were multiple layouts
available to change how the documents where formatted on export. These have now been reduced to
just two layouts: :guilabel:`Novel Document` and :guilabel:`Project Note`.
Novel documents can only live in a :guilabel:`Novel` type root folder. You can also move them to
:guilabel:`Archive` and :guilabel:`Trash` of course. Project notes can be added anywhere in the
project.
The project tree can distinguish between the different layouts and header levels of the documents
using coloured icons, and optionally add emphasis on the label (See the :guilabel:`Preferences`.)
For novel documents, the heading level of the first heading is recorded, and indicated by the icon.
.. tip::
You can always start writing with a coarse setup with one or a few documents, and then later use
the split tool to split the documents into separate chapter and scene documents. You can split a
document on any of the four header levels.

View File

@@ -1 +1,4 @@
sphinx_rtd_theme
furo
sphinx>=4.0
pygments>=2.7
docutils==0.17.1

View File

@@ -1,110 +0,0 @@
.. _a_setup_linux:
**************
Setup on Linux
**************
.. _GitHub: https://github.com/vkbo/novelWriter/releases
.. _main website: https://novelwriter.io
This is a brief guide to how you can get novelWriter running on a Linux computer. There are
currently no install package of novelWriter for Linux, so it is recommended that you download
either the full source or minimal package and extract it to a practical location on your system and
run the ``setup.py`` script.
Running from Source
===================
To run novelWriter from source, download the latest source package from the release page on
GitHub_ or the `main website`_, or if you have git running on your computer, you can also clone the
repository.
Step 1: Installing Dependencies
-------------------------------
The dependencies of novelWriter are generally available from Linux distro repositories. For Debian
and Ubuntu, they can be installed with:
.. code-block:: console
sudo apt install python3-pyqt5 python3-lxml python3-enchant
If you prefer to install dependencies via PyPi, or the repository dependencies are out of date, you
can install them with:
.. code-block:: console
pip3 install --user -r requirements.txt
Step 2: Install Package (Optional)
----------------------------------
You can install novelWriter to the default location for Python packages using ``setuptools``. This
step is optional as you can also just put the novelWriter program folder wherever you like
yourself. For instance in ``/opt/novelWriter``, and then run Step 3 to set up icons and launcher.
To install novelWriter to the default location, it requires that you have ``setuptools`` installed
on your system. If you don't have it installed, it can usually be installed from your distro's
repository. For Debian and Ubuntu this is achieved with:
.. code-block:: console
sudo apt install python3-setuptools
The package is also available from PyPi:
.. code-block:: console
pip3 install --user setuptools
With ``setuptools`` in place, novelWriter can be installed to the user space with:
.. code-block:: console
./setup.py install --user
This should install novelWriter as ``~/.local/bin/novelWriter``. If you instead want to install for
all users, i.e. as ``/usr/local/bin/novelWriter``, run:
.. code-block:: console
sudo ./setup.py install
This is equivalent to what the ``pip`` installer does. It puts novelWriter in the location on your
system where Python packages are usually kept. This is not really the best suited location for a
GUI application like novelWriter, so you may instead copy the entire source to a suiteable location
yourself.
Step 3: Create Launcher Icons
-----------------------------
Regardless of where you extract or install the source files, you can set up a standard icon and a
launcher. To set up this desktop launcher, the needed icons, and the project file association,
run the following from inside the novelWriter folder at the installed or final location:
.. code-block:: console
./setup.py xdg-install
By default, this command installs the launcher and icons for the current user only. To install for
all users, run the script with the ``sudo`` command.
.. tip::
All options of the setup script can be listed with: ``./setup.py help``.
Uninstalling Icons
==================
The steps taken by the ``xdg-install`` step can be reversed by running:
.. code-block:: console
./setup.py xdg-uninstall
This will remove the desktop launcher and icons from the system. As above, whether this is done on
the current user, or system wide, depends on whether this command is called with ``sudo`` or not.

View File

@@ -1,74 +0,0 @@
.. _a_setup_mac:
**************
Setup on macOS
**************
.. _GitHub: https://github.com/vkbo/novelWriter/releases
.. _main website: https://novelwriter.io
.. _brew docs: https://docs.brew.sh/Homebrew-and-Python
This is a brief guide to how you can get novelWriter running on macOS. There are currently no
install package of novelWriter for macOS, so it is recommended that you download either the full
source or minimal package and extract it to a practical location on your system and
run it.
Running from Source
===================
To run novelWriter from source, download the latest source package from the release page on
GitHub_ or the `main website`_, or if you have git running on your computer, you can also clone the
repository.
Step 1: Installing Dependencies
-------------------------------
These instructions assume you're using brew, and have Python and pip set up. If not, see the
`brew docs`_ for help. Main requirements are installed via the requirements file. You also need to
install the ``pyobjc`` package, so you should run:
.. code-block:: console
pip3 install --user -r requirements.txt
pip3 install --user pyobjc
For spell checking you may also need to install the enchant package. It comes with a lot of default
dictionaries.
.. code-block:: console
brew install enchant
With the dependencies in place, you can launch the ``novelWriter.py`` script directly to run
novelWriter.
Step 2: Install Package (Optional)
----------------------------------
You can install novelWriter to the correct location for Python packages with:
.. code-block:: console
./setup.py install --user
This requires that the package ``setuptools`` is installed on your system. If not, it can be
installed with:
.. code-block:: console
pip3 install --user setuptools
This is method of install is equivalent to what the ``pip`` installer does. It puts novelWriter in
the location on your system where Python packages are usually kept. This is not really the best
suited location for a GUI application like novelWriter, so you may instead copy the entire source
to a suiteable location yourself.
After this, you should be able to launch novelWriter by running ``novelWriter`` in a command line
window.
.. note::
Right now there isn't a better integration with macOS available. Contributions from someone more
familiar with macOS would be very much appreciated.

View File

@@ -1,149 +0,0 @@
.. _a_setup_win:
****************
Setup on Windows
****************
This is a brief guide to how you can get novelWriter running on a Windows computer.
Unlike other operating systems, Windows does not come prepared with an environment to run Python
applications, so you must first install Python. After that, running novelWriter is straightforward.
.. tip::
If you have any problems, you can always open a question on the project's discussions_ page.
This requires a GitHub account.
.. _discussions: https://github.com/vkbo/novelWriter/discussions
.. _a_setup_win_installer:
Using the Installer
===================
The installer for Windows is no longer provided. See the `installer issue`_ for more info on why.
You can still create the installer yourself if you want to. It can be generated with the provided
``setup.py`` script. use the script's ``help`` command to get further instructions.
Please use the "Running from Source" option below instead. It has been improved and a script has
been added that does nearly the same thing.
.. _installer issue: https://github.com/vkbo/novelWriter/issues/640
.. _a_setup_win_source:
Running from Source
===================
To run novelWriter from source, download the latest source zip file from the release page on
GitHub_, or from the `main website`_. You can download the "Minimal Windows" zip file. It is a
minimal version of the source that contains only the files needed for running on Windows. You can
also download the full source if you wish.
In order to make novelWriter run on your system, you must first have Python installed (Step 1).
Thereafter, a script will do the rest of the job (Step 2). Alternatively, you can run this step
manually from the command prompt if you wish to.
.. tip::
If your system already has all the dependencies installed, you can run novelWriter directly from
the extracted folder by double-clicking the ``novelWriter.pyw`` file. However, running the
script also adds start icons.
.. _GitHub: https://github.com/vkbo/novelWriter/releases
.. _main website: https://novelwriter.io
Step 1: Installing Python
-------------------------
If you already have Python installed, you can skip this step. If you don't have it installed, you
can download it from the python.org_ website. novelWriter should work with Python 3.6 or higher,
but it is recommended that you install the latest version of Python.
Make sure you select the "Add Python to PATH" option during installation, otherwise the ``python``
command will not work in the command line window.
.. image:: images/python_win_install.png
:width: 600
.. _python.org: https://www.python.org/downloads/windows
Step 2: Dependencies and Icons
------------------------------
**Alternative A: By Script**
Open the folder where you extracted novelWriter, and double-click the file named
``windows_install.bat``. This should open a command line window and run the setup script to install
dependencies, and add desktop and start menu icons.
.. note::
If you downloaded the full source package, the file may be in the ``setup`` subfolder.
The script will also check that it can find Python on your system and alert you if it cannot run
it. If you are sure you have installed it, but the script cannot find it, you probably didn't
install it with the "Add Python to PATH" option mentioned in Step 1.
.. note::
If you upgrade Python to a newer version and the path to ``pythonw.exe`` has therefore changed,
you may need to run this script again. You can also run it to upgrade dependencies to the latest
version.
**Alternative B: Manual Installation**
The above alternative can also be run manually.
Open the windows command prompt. It can be launched by pressing the :kbd:`Win` key and typing "cmd".
The "Command Prompt" app should then be in the list of applications.
With the command prompt open, navigate to the folder where you extracted the novelWriter source,
and run the following commands:
.. code-block:: console
pip install --user pywin32 -r requirements.txt
python setup.py win-install
The first command will install the dependencies on your system from the `Python Package Index`_,
and the second command will create a desktop icon and a start menu icon. That should be all that
you need.
.. _Python Package Index: https://pypi.org/
Uninstalling
============
**Alternative A: By Script**
Open the folder where you keep the novelWriter files, and double-click the file named
``windows_uninstall.bat``. This should open a command line window and run the setup script to
remove the main dependency packages and remove desktop and start menu icons.
.. note::
If you downloaded the full source package, the file may be in the ``setup`` subfolder.
If you plan to also remove Python from your system, you must run the above script first as it needs
Python in order to run.
.. note::
Due to limitations of the ``pip`` installer, dependencies of the dependencies will not be
removed, only the ones the setup script directly installed.
**Alternative B: Manual Uninstallation**
Like for the install process, the script just runs two commands. You can of course run them
yourself if you wish. They are:
.. code-block:: console
python setup.py win-uninstall
pip uninstall -r requirements.txt
There may be other packages on your system installed by ``pip``. To list all packages, run:
.. code-block:: console
pip freeze --user

View File

@@ -0,0 +1,56 @@
.. _a_locations:
**************
File Locations
**************
.. _QStandardPaths: https://doc.qt.io/qt-5/qstandardpaths.html
novelWriter will create a few files on your system outside of the application folder itself. These
file locations are described in this document.
.. _a_locations_conf:
Configuration
=============
The general configuration of novelWriter, including everything that is in :guilabel:`Preferences`,
is saved in one central configuration file. The location of this file depends on your operating
system. The system paths are provided by the Qt QStandardPaths_ class and its ConfigLocation value.
The standard paths are:
* Linux: ``~/.config/novelwriter/novelwriter.conf``
* macOS: ``~/Library/Preferences/novelwriter/novelwriter.conf``
* Windows: ``C:\Users\<USER>\AppData\Local\novelwriter\novelwriter.conf``
Here, ``~`` corresponds to the user's home directory on Linux and macOS, and ``<USER>`` is the
user's username on Windows.
.. note::
These are the standard operating system defined locations. If your system has been set up in a
different way, these locations may also be different.
.. _a_locations_data:
Application Data
================
novelWriter also stores a bit of data that is generated by the user's actions. This includes the
list of recent projects form the :guilabel:`Open Project` dialog. Custom themes should also be
saved here. The system paths are provided by the Qt QStandardPaths_ class and its AppDataLocation.
The standard paths are:
* Linux: ``~/.local/share/novelwriter/``
* macOS: ``~/Library/Application Support/novelwriter/``
* Windows: ``C:\Users\<USER>\AppData\Roaming\novelwriter\``
Here, ``~`` corresponds to the user's home directory on Linux and macOS, and ``<USER>`` is the
user's username on Windows.
.. note::
These are the standard operating system defined locations. If your system has been set up in a
different way, these locations may also be different.

View File

@@ -1,26 +1,26 @@
.. _a_tech:
.. _a_storage:
*********************
Technical Information
*********************
******************
How Data is Stored
******************
This section contains details of how novelWriter stores and handles the project data.
How Project Data is Stored
==========================
Project Structure
=================
All novelWriter files are written with utf-8 encoding. Since Python automatically converts Unix
line endings to Windows line endings on Windows systems, novelWriter does not make any adaptations
to the formatting on Windows systems. This is handled entirely by the Python standard library.
Python also handles this fairly well when working on the same files on both Windows and Unix-based
operating systems.
Python also handles this when working on the same files on both Windows and Unix-based operating
systems.
Main Project File
-----------------
The project itself requires a dedicated folder for storing its files where novelWriter will create
The project itself requires a dedicated folder for storing its files, where novelWriter will create
its own "file system" where the folder and file hierarchy is described in a project XML file. This
is the main project file in the project's root folder with the name ``nwProject.nwx``. This file
also contains all the meta data required for the project, and a number of related project settings.
@@ -31,22 +31,21 @@ your own backup solution.
.. tip::
The novelWriter project folder is structured so that it can easily be added to a version control
system like git. If so, you may want to add a `.gitignore` file to exclude files with the
system like git. If you do so, you may want to add a `.gitignore` file to exclude files with the
extensions `.json` as JSON files are used to cache the index and various run-time settings and
are generally large files that change often. You'd also want to exclude the ``cache`` folder.
are generally large files that change often.
The project XML file is indent-formatted, suitable for diff tools and version control since most of
the file will stay static, although a timesetamp is set in the meta section on line 2 each time the
file is saved, and various meta data entries are incremented on each save.
The project XML file is indent-formatted, and is suitable for diff tools and version control since
most of the file will stay static, although a timesetamp is set in the meta section on line 2, and
various meta data entries incremented, on each save.
Project Documents
-----------------
=================
All the project documents are saved in a folder in the main project folder named ``content``. Each
document has a file handle taken from the first 13 characters of a SHA256 hash of the system time
when the document was first created. The documents are saved with a filename assembled from this
hash and the file extension ``.nwd``.
document has a file handle based on a 52 bit random number, represented as a hexadecimal string.
The documents are saved with a filename assembled from this handle and the file extension ``.nwd``.
If you wish to find the file system location of a document in the project, you can either look it
up in the project XML file, select :guilabel:`Show File Details` from the :guilabel:`Document` menu
@@ -56,13 +55,19 @@ where they are saved.
The reason for this cryptic file naming is to avoid issues with file naming conventions and
restrictions on different operating systems, and also to have a file name that does not depend on
what the user names the document within the project, or changes it to.
what the user names the document within the project, or changes it to. This is particularly useful
when using a versioning system.
Each document file contains a plain text version of the text from the editor. The file can in
principle be edited in any text editor, and is suitable for diffing and version control if so
desired. Just make sure the file remains in utf-8 encoding, otherwise unicode chatracters may
desired. Just make sure the file remains in utf-8 encoding, otherwise unicode characters may
become mangled when the file is opened in novelWriter again.
Editing these files is generally not recommended outside of special circumstances, whatever they
may be. The reason for this is that the index will not be automatically updated when doing so,
which means novelWriter doesn't know you've altered the file. If you do edit a file in this manner,
you should rebuild the index when you next open the project in novelWriter.
The first lines of the file may contain some meta data starting with the characters ``%%~``. These
lines are mainly there to restore some information if it is lost from the project file, and the
information may be helpful if you do open the file in an external editor as it contains the
@@ -75,7 +80,7 @@ The File Saving Process
-----------------------
When saving the project file, or any of the documents, the data is first saved to a temporary file.
If successful, the old data file is removed, and the temporary file becomes the new file. This
If successful, the old data file is then removed, and the temporary file becomes the new file. This
ensures that the previously saved data is only replaced when the new data has been successfully
saved to the storage medium.
@@ -93,8 +98,8 @@ folder contains semi-important files. That is, they can be lost with only minor
project.
If you use version control software on your project, you can exclude this folder, although you may
want to track the session log file. The JSON files within this folder can safely be ignored as they
will be automatically regenerated if lost.
want to track the session log file and the custom words list. The JSON files within this folder can
safely be ignored as they will be automatically regenerated if lost.
The Project Index
@@ -110,7 +115,7 @@ project, and the word counts within each header section.
The integrity of the index is checked when the file is loaded. It is possible to corrupt the index
if the file is manually edited and manipulated, so the check is important to avoid sudden crashes
of novelWriter. if the file contains errors, novelWriter will automatically build it anew. If the
of novelWriter. If the file contains errors, novelWriter will automatically build it anew. If the
check somehow fails and novelWriter keeps crashing, you can delete the file manually and rebuild
the index. If this too fails, you have likely encountered a bug.
@@ -126,6 +131,14 @@ The file is not critical, but if it is lost, all such GUI options will revert ba
settings.
Custom Word List
----------------
A file named ``meta/wordlist.txt`` contains all the custom words you've added to the project for
spell checking purposes. The content of the file can be edited from the :guilabel:`Tools` menu. If
you lose this file, all your custom spell check words will be lost too.
Session Stats
-------------
@@ -142,4 +155,5 @@ The project ``cache`` folder contains non-critical files. If these files are los
impact on the functionality of novelWriter or the history of the project. It contains temporary
files, like the preview document in the :guilabel:`Build Novel Project` tool.
It should be excluded from version control tools if such are used.
It should be excluded from version control tools if such are used. The folder will be removed
entirely in novelWriter 2.1.

View File

@@ -0,0 +1,85 @@
.. _a_pytest:
*************
Running Tests
*************
The novelWriter source code is well covered by tests. The test framework used for the development
is ``pytest`` with the use of an extension for Qt.
Dependencies
============
The dependencies for running the tests can be installed with:
.. code-block:: bash
pip install -r requirements-dev.txt
This will install a couple of extra packages for coverage and test management. The minimum
requirement is ``pytest`` and ``pytest-qt``.
Simple Test Run
===============
To run the tests, you simply need to execute the following from the root of the source folder:
.. code-block:: bash
pytest
Since several of the tests involve opening up the novelWriter GUI, you may want to disable the GUI
for the duration of the test run. Moving your mouse while the tests are running may otherwise
interfere with the execution of some tests.
You can disable the renderring of the GUI by setting the flag ``export QT_QPA_PLATFORM=offscreen``,
or alternatively run the tests with the ``xvfb`` package, like so:
.. code-block:: bash
xvfb-run pytest
Advanced Options
================
Adding the flag ``-v`` to the ``pytest`` command will increase verbosity of the test execution.
You can also add coverage report generation. For instance to HTML:
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html
Other useful report formats are ``xml``, and ``term`` for terminal output.
You can also run tests per subpackage of novelWriter with the ``-m`` command. The available
subpackage groups are ``base``, ``core``, and ``gui``. Consider for instance:
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html -m core
This will only run the tests of the "core" package, that is, all the classes that deal with the
project data of a novelWriter project. The "gui" tests, likewise, will run the tests for the GUI
components, and the "base" tests cover the bits in-between.
You can also filter the tests with the ``-k`` switch. The following will do the same as
``-m core``:
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html -k testCore
All tests are named in such a way that you can filter them by adding more bits of the test names.
They all start with the word "test". Then comes the group: "Core", "Base", "Dlg", "Tool", or "Gui".
Finally comes the name of the class or module, which generally corresponds to a single source code
file. For instance, running the following will run all tests for the document editor:
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html -k testGuiEditor
To run a single test, simply add the full test name to the ``-k`` switch.

View File

@@ -0,0 +1,209 @@
.. _a_breakdown:
************
How it Works
************
.. _Fusion: https://doc.qt.io/qt-6/gallery.html
.. _Pandoc: https://pandoc.org/
.. _Typicons: https://github.com/stephenhutchings/typicons.font
.. _Open Document: https://en.wikipedia.org/wiki/OpenDocument
The main features of novelWriter are listed in the :ref:`a_intro` section. Here, we go into some
more details on how they are implemented. This is intended as an overview. Later on in this
documentation, these features will be covered in even more detail.
.. _a_breakdown_design:
GUI Layout and Design
=====================
The user interface of novelWriter is intended to be as minimalistic as practically possible, while
at the same time provide a complete set of 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, is more or less redundant. However,
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` section.
.. note::
novelWriter is not intended to be a full office type word processor. It doesn't support images,
links, tables, and other complex structures and objects often needed for such documents.
Formatting is limited to headers, emphasis, text alignment, and a few other simple features.
On the left edge of the main window, you will find a sidebar. This bar has buttons for the standard
views you can switch between, a quick link to the :guilabel:`Build Novel Project` tool, and a set
of project-related tools as well as quick access to settings at the bottom.
Project Tree 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
your project. The second panel is the document editor. An optional third panel on the right is a
document viewer which can view any document in your project independently of what is open in the
document editor. This panel is not intended as a preview window, although you can use it for this
if you wish as it will apply the formatting tags you have specified. The main purpose of the viewer
is for viewing your notes next to your editor while you're writing.
The editor also has a :guilabel:`Focus Mode` you can toggle either from the menu, from the icon in
the editor header, or by pressing :kbd:`F8`. When :guilabel:`Focus Mode` is enabled, all the user
interface elements other than the document editor itself are hidden away.
Novel Tree View
---------------
When in :guilabel:`Novel Tree View` mode, the project tree is replaces by an overview of your novel
structure. Instead of showing individual documents, the tree now shows all headings of your novel
text. This includes multiple headings within the same document.
Each heading is indented according to the heading level. You can open and edit your novel documents
from this view as well. All headings contained in the currently open document should be highlighted
in the view to indicate which ones belong together.
If you have multiple Novel root folders, the header of the novel view becomes a droopdown box. You
can then switch between them by clicking the "Outline of ..." text. You can also click the novel
icon button next to it.
Generally, the novel view should update when you make changes to the novel structure, including
edits of the current document in the editor. The information is only updated when the automatic
save of the document is initiated though. You can adjust the aut-save interval in
:guilabel:`Preferences`. You can also regenerate the whole novel view by pressing the refresh
button at the top.
It is possible to show an optional third column in the novel view, The settings are available from
the menu button ath the top.
If you click the arrow icon to the right of each item, a tooltip will pop up showing you all the
meta data collected for that heading entry.
Novel Outline View
------------------
When in :guilabel:`Novel Outline View` mode, the tree, editor and viewer will be replaced by a
large table that shows the entire novel structure with all the tags and references listed. Pretty
much all collected meta data is available here in different columns.
You can select which novel root folder to display from the dropdown box, and you can select which
columns to show or hide from the menu button. You can also rearrange the columns by drag and drop.
The app will remember you column order and size between sessions, and for each individual project.
Colour Themes
-------------
The default colour theme of the user interface is the default theme from the Qt library. By
default, novelWriter is loaded with the Fusion_ style setting. (You can override this with the
``--style=`` setting when starting novelWriter.)
There is a standard dark theme provided as well, which is similar to the default Qt theme. Some
other light and dark colour themes are also provided. You can select which one you prefer from in
:guilabel:`Preferences` .
A number of syntax highlighting themes are also available in :guilabel:`Preferences`. These are
separate settings because there are a lot more options for syntax highlighting.
.. note::
If you switch to dark mode on the GUI, you should also switch syntax highlighting theme to
match, otherwise icons may be hard to see in the editor and viewer.
.. _a_breakdown_project:
Project Layout
==============
This is a brief introduction to how you structure your writing projects. All of this will be
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
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.
The four heading levels (**H1** to **H4**) are treated as follows:
* **H1** is used for the book title, and for partitions.
* **H2** is used for chapter tiles.
* **H3** is used for scene titles – optionally replaced by separators.
* **H4** is for section titles within scenes, if such granularity is needed.
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 novel documents. For the 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_notes` for more details.
.. note::
You can add documents as child items of other documents if you wish. This is often more useful
than adding folders, since you anyway may want to have the chapter heading in a separate
document from your individual scene documents.
.. _a_breakdown_export:
Building the Manuscript
=======================
The project can at any time be assembled into a range of different formats through the
:guilabel:`Build Novel Project` tool. Natively, novelWriter supports `Open Document`_, HTML5, and
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
and printing to PDF is also possible.
You can also export the content of the project to a JSON file. This is useful if you want to write
your own processing script in for instance Python, as the entire novel can be read into a Python
dictionary with a couple of lines of code. The JSON file can be populated either with HTML
formatted text, or with the raw text as typed into the novel documents. See :ref:`a_export_options`
for more details.
A number of filter options can be applied to the :guilabel:`Build Novel Project` tool, allowing you
to make a draft manuscript, a reference document of notes, an outline based on chapter and scene
titles with a synopsis each, and so on. See :ref:`a_export` for more details on build features and
formats.
.. _a_breakdown_storage:
Project Storage
===============
The files of a novelWriter project are stored in a dedicated project folder. The project structure
is kept in a file at the root of this folder called ``nwProject.nwx``. All the document files and
associated meta data is stored in the other folders below the project folder. For more technical
details about what all the files mean and how they're organised, see the :ref:`a_storage` section.
This way of storing data was chosen for several reasons. Firstly, all the text you add to your
project is saved directly to your project folder in separate files. Only the project structure and
the text you are currently editing is stored in memory at any given time. Secondly, having multiple
small files means it is very easy to sync them between computers with standard file synchronisation
tools. Thirdly, if you use version control software to track the changes to your project, the file
formats used for the files are well suited. Also the JSON documents have line breaks and indents,
which makes it easier to track them with version control software.
.. note::
Since novelWriter has to keep track of a bunch of files and folders when a project is open, it
may not run well on some virtual file systems. A file or folder must be accessible with exactly
the path it was saved or created with. An example where this is not the case is the way Google
Drive is mapped on Linux Gnome desktops using gvfs/gio.
.. caution::
You should not add additional files to the project folder yourself. Nor should you manually edit
files within it as a general rule. If you really must manually edit the text files, e.g. with
some automated task you want to perform, you need to rebuild the index when you open the project
again.
Editing text files in the ``content`` folder is less risky as they are just plain text. Editing
the main project XML file, however, may make the project file unreadable and you may crash
novelWriter and lose project structure information and project settings.

View File

@@ -0,0 +1,248 @@
.. _a_fmt:
********************
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.
In addition to formatting codes, novelWriter allows for comments, a synopsis tag, and a set of
keyword and value sets used for tags and references. There are also some codes that apply two whole
paragraphs. See :ref:`a_fmt_text` below for more details.
.. _a_fmt_hlight:
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
headings, change the text colour of emphasised text, and it can also show you where you have
dialogue in your text.
When you use the commands to set tags and references, these also change colour. Correct commands
have a dedicated colour, and the references themselves will get a colour if they are valid. Invalid
references will get a squiggly error line underneath. The same applies to duplicate tags.
There are a number of syntax highlighter colour themes available, both for light and dark GUIs. You
can select them for :guilabel:`Preferences`.
.. _a_fmt_head:
Headings
========
Four levels of headings are allowed. For project notes, they are free to be used as you see fit.
That is, novelWriter doesn't assign the different headings any particular meaning. However, for
novel documents they indicate the structural level of the novel and must be used correctly to
produce the intended result. See :ref:`a_struct_heads` for more details.
``# Title Text``
Heading level one. For novel documents, the header level indicates the start of a new partition.
``## Title Text``
Heading level two. For novel documents, the header level indicates the start of a new chapter.
Chapter numbers can be inserted automatically when building the manuscript.
``### Title Text``
Heading level three. For novel documents, the header level indicates the start of a new scene.
Scene numbers or scene separators can be inserted automatically when building the manuscript,
so you can use the title field as a working title for your scenes if you wish.
``#### Title Text``
Heading level four. For novel documents, the header level indicates the start of a new section.
Section titles can be replaced by separators or removed completely when building the manuscript.
For headers level one and two, adding a ``!`` modifies the behaviour of the heading:
``#! Title Text``
This tells the build tool that the level one heading is intended to be used for the novel's
main title, like for instance on the front page. When building the manuscript, this will use a
different styling and will exclude the title from for instance a Table of Contents in Libre
Office.
``##! Title Text``
This tells the build tool to not assign a chapter number to this chapter title if automatic
chapter numbers are being used. Such titles are useful for a prologue for instance. See
:ref:`a_struct_heads_unnum` for more details.
.. note::
The space after the ``#`` or ``!`` character is mandatory. The syntax highlighter will change
colour and font size when the heading is correctly formatted.
.. _a_fmt_text:
Text Paragraphs
===============
A text paragraph is indicated by a blank line. That is, you need two line breaks to separate two
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:
* A non-breaking space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Space`.
* Thin spaces are also supported, and can be inserted with :kbd:`Ctrl`:kbd:`K`,
:kbd:`Shift`:kbd:`Space`.
* Non-breaking thin space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`.
These are all insert features, and the :guilabel:`Insert` menu has more. They are also listed
in :ref:`a_kb_ins`.
Non-breaking spaces are highlighted by the syntax highlighter with an alternate coloured
background, depending on the selected theme.
.. tip::
Non-breaking spaces are for instance the correct type of space to separate a number from its
unit. Generally, non-breaking spaces are used to prevent line wrapping algorithms from adding
line breaks where they shouldn't.
.. _a_fmt_emph:
Text Emphasis
=============
A minimal set of text emphasis styles are supported.
``_text_``
The text is rendered as emphasised text (italicised).
``**text**``
The text is rendered as strongly important text (bold).
``~~text~~``
Strikethrough 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 ``__``
for strong and ``*`` for emphasis. However, since the differentiation makes the highlighting and
conversion significantly simpler and faster, in novelWriter this is a rule, not just a
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.
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 wrapper.
This is due to the underscore also being a valid word character, so if they are on the outside,
they violate rule 2.
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.
.. _a_fmt_comm:
Comments and Synopsis
=====================
In addition to these standard Markdown features, novelWriter also allows for comments in documents.
The text of a comment is ignored by the word counter. The text can also be filtered out when
building the manuscript or viewing the document.
If the first word of a comment is ``Synopsis:`` (with the colon included), the comment is treated
specially and will show up in the :ref:`a_ui_outline` in a dedicated column. The word ``synopsis``
is not case sensitive. If it is correctly formatted, the syntax highlighter will indicate this by
altering the colour of the word.
``% text...``
This is a comment. The text is not renderred by default (this can be overridden), seen in the
document viewer, or counted towards word counts.
``% 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.
.. 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.
.. _a_fmt_tags:
Tags and References
===================
The document editor supports a set of keywords used for setting tags, and making references between
documents. The tag can be set once per section defined by a heading. Setting it multiple times
under the same heading will just override the previous setting. References can be set anywhere
within a section, and are collected according to their category.
``@keyword: value``
A keyword argument followed by a value, or a comma separated list of values.
The available tag and reference keywords are listed in the :ref:`a_struct_tags` section. They can
also be inserted at the cursor position in the editor via the :guilabel:`Insert` menu.
.. _a_fmt_align:
Paragraph Alignment and Indentation
===================================
All documents have the text by default aligned to the left or justified, depending on your
Preferences.
You can override the default text alignment on individual paragraphs by specifying alignment tags.
These tags are double angle brackets. Either ``>>`` or ``<<``. You put them either before or after
the paragraph, and they will "push" the text towards the edge the brackets point towards. This
should be fairly intuitive.
Indentation uses a similar syntax. But here you use a single ``>`` or ``<`` to push the text away
from the edge.
Examples:
.. csv-table:: Text Alignment and Indentation
:header: "Syntax", "Description"
:widths: 40, 60
:class: "tight-table"
"``>> Right aligned text``", "The text paragraph is right-aligned."
"``Left aligned text <<``", "The text paragraph is left-aligned."
"``>> Centred text <<``", "The text paragraph is centred."
"``> Left indented text``", "The text has an increased left margin."
"``Right indented text <``", "The text has an increased right margin."
"``> Left/right indented text <``", "The text has an both margins increased."
.. note::
The text editor will not show the alignment and indentation live. But the viewer will show them
when you open the document there. It will of course also be reflected in the document generated
from the build tool as long as the format supports paragraph alignment.
.. _a_fmt_break:
Vertical Space and Page Breaks
==============================
Adding more than one line break between paragraphs will *not* increase the space between those
paragraphs when building the project. To add additional space between paragraphs, add the text
``[VSPACE]`` on a line of its own, and the build tool will insert a blank paragraph in its place.
If you need multiple blank paragraphs just add a colon and a number to the above code. For
instance, writing ``[VSPACE:3]`` will insert three blank paragraphs.
Normally, the build tool will insert a page break before all headers of level one and for all
headers of level two for novel documents, i.e. chapters, but not for project notes.
If you need to add a page break somewhere else, put the text ``[NEW PAGE]`` on a line by itself
before the text you wish to start on a new page.
Page breaks are automatically added to partition, chapter and unnumbered chapter headers of novel
documents. If you want such breaks for scenes and sections, you must add them manually.
.. note::
The page break code is applied to the text that follows it. It adds a "page break before" mark
to the text when exporting to HTML or Open Document. This means that a ``[NEW PAGE]`` which has
no text following it, it will not result in a page break.

View File

@@ -1,11 +1,13 @@
.. _a_ui:
**************
User Interface
**************
******************
The User Interface
******************
The user interface is kept as simple as possible to avoid distractions when writing. This page
lists all the main GUI elements, and explains what they do.
.. _Compose Key: https://en.wikipedia.org/wiki/Compose_key
This sections covers in more detail what all the information on the user interface is for, and how
you can organise your project, and how you use the editor, viewer and outline panel.
.. _a_ui_tree:
@@ -14,35 +16,50 @@ The Project Tree
================
The main window contains a project tree in the left-most panel. It shows the entire structure of
the project. It has four columns:
the project, and has four columns:
:guilabel:`Label`
The first column shows the item icon and its label. The labels can be edited from the
:guilabel:`Project` menu, or by pressing :kbd:`F2` or :kbd:`Ctrl`:kbd:`E`. The label is not the
same as the title you set inside the document, but it will appear in the header above the
document text itself.
**Column 1**
The first column shows the icon and label of each folder, document, or note in your project. The
label is not the same as the title you set inside the document. However, the document's label
will appear in the header above the document text itself so you know where in the project an
open document belongs. The icon is selected based on the type of item, and for novel documents,
the level of the first header in the document text.
:guilabel:`Words`
**Column 2**
The second column shows the word count of the document, or the sum of words of the child items
if it is a folder. If the counts seem incorrect, they can be updated by rebuilding the project
index from the :guilabel:`Tools` menu, or by pressing :kbd:`F9`.
for folders and documents with subdocuments. If the counts seem incorrect, they can be updated
by rebuilding the project index from the :guilabel:`Tools` menu, or by pressing :kbd:`F9`.
:guilabel:`Inc`
The third column indicates whether the document is included in the final project build or not.
You may want to filter out documents that you no longer want to keep in the final manuscript,
but want to keep in the project for reference.
**Column 3**
The third column indicates whether the document is considered active or inactive in the project.
You can use this flag to indicate that a document is still in the project, but should not be
considered an active part of it. When you run the :guilabel:`Build Novel Project` tool, you can
filter based on this flag. You can change this value from the context menu.
:guilabel:`Flags`
The fourth column shows various meta data flags for the item. The first is an icon indicating
the importance or status of the document. These are colour coded status levels that you control
and define yourself. They can be changed in :guilabel:`Project Settings` from the
:guilabel:`Project` menu. The first character after the icon indicates the class of the item,
that is ``N`` for **Novel**, ``C`` for **Character**, etc (see :ref:`a_struct_tags`). The
characters after the dot indicate the document layout type (see :ref:`a_proj_roots`).
**Column 4**
The fourth column shows the user-defined status or importance labels you've assigned to each
project item. See :ref:`a_ui_tree_status` for more details. You can change these labels from the
context menu.
Right-clicking an item in the project tree will open a context menu under the cursor, displaying
a selection of actions that can be performed on the selected item.
At the top of the tree, you will find a set of buttons.
* The first button is a quick links button that will show you a dropdown menu of all the root
folders in your project. Selecting one will move to that position in the tree. You can also
activate this menu by pressing :kbd:`Ctrl`:kbd:`L`.
* The next two buttons can be used to move items up and down in the project tree. This is the only
way to move root folders.
* The next button opens a dropdown menu for adding new items to the tree. This includes root
folders. You can also activate this dropdown menu by pressing :kbd:`Ctrl`:kbd:`N`.
* The last button is a menu of further actions on the entire project tree.
.. tip::
Under the :guilabel:`Transform` submenu in the context menu of an item, you will find several
options on how to change a document or folder. This includes changing between document and note,
splitting them into multiple documents, or merging child items into a single document.
Below the project tree you will find a small details panel showing the full information of the
currently selected item. This panel also includes the latest paragraph and character counts in
addition to the word count.
@@ -54,13 +71,15 @@ The Novel Tree
--------------
An alternative way to view the project structure is the novel tree. You can switch to this view by
selecting the :guilabel:`Novel` tab under the project tree. This view is a simplified version of
the view in the :guilabel:`Outline`. It is convenient when you want to browse the structure of the
story itself rather than the document files.
selecting the :guilabel:`Novel Tree View` button in the sidebar. This view is a simplified version
of the view in the :guilabel:`Outline`. It is convenient when you want to browse the structure of
the story itself rather than the document files.
.. note::
You cannot reorganise the entries in the novel tree as that would imply restructuring the
content of the document files.
You cannot reorganise the entries in the novel tree, or add any new documents, as that would
imply restructuring the content of the document files. Any editing must be done in the project
tree. However, you can add new headings to existing documents, or change references, which will
be updated in this view.
.. _a_ui_tree_status:
@@ -69,14 +88,16 @@ Document Importance and Status
------------------------------
Each document or folder in your project can have either a "Status" or "Importance" flag set. These
are flags that you control and define in their respective tabs in :guilabel:`Project Settings`. The
"Status" flag is intended to tag a Novel document as for instance a draft or as completed, and the
"Importance" flag is intended to tag character notes, or other notes, as for instance a main, major
or minor character.
are flags that you control and define yourself. The app doesn't do anything with them at all. To
modify the labels, go to their respective tabs in :guilabel:`Project Settings`.
The "Status" flag is intended to tag a Novel document as for instance a draft or as completed, and
the "Importance" flag is intended to tag character notes, or other notes, as for instance a main,
major or minor character.
Whether a document uses a "Status" or "Importance" flag depends on which root folder it lives in.
If it's in the :guilabel:`Novel` folder, it uses the "Status" flag, otherwise it uses an
"Importance" flag. Some folders, like :guilabel:`Trash` and :guilabel:`Outtakes` allow both.
"Importance" flag. Some folders, like :guilabel:`Trash` and :guilabel:`Archive` allow both.
.. _a_ui_tree_dnd:
@@ -84,25 +105,24 @@ If it's in the :guilabel:`Novel` folder, it uses the "Status" flag, otherwise it
Project Tree Drag & Drop
------------------------
The project tree allows drag & drop to a certain extent. This feature is primarily intended for
rearranging the order of your documents within each root folder, and has only limited support for
moving documents elsewhere in the project tree. 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`:kbd:`Shift`:kbd:`Z`.
The project tree allows drag & drop to a certain extent to allow you to reorder your documents and
folders. Moving a document in the project tree will affect the text's position when you assemble
your manuscript in the build tool.
Documents and their folders can be rearranged freely within their root folders. Novel documents
cannot be moved out of the :guilabel:`Novel` folder, except to :guilabel:`Trash` and the
:guilabel:`Outtakes` folders. Notes can be moved freely between all root folders, but keep in mind
that if you move a note into a :guilabel:`Novel`, its "Importance" setting will be reset to the
default "Status" setting. See :ref:`a_ui_tree_status`.
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`:kbd:`Shift`:kbd:`Z`.
Folders cannot be moved at all outside their root tree. Neither can a folder containing documents
be deleted. You must first delete the containing documents.
Documents and their folders can be rearranged freely within their root folders. If you move a Novel
documents out of a Novel folder, it will be converted to a project note. Notes can be moved freely
between all root folders, but keep in mind that if you move a note into a :guilabel:`Novel` root
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 and dropped at all. If you want to reorder them,
you can move them up or down with respect to eachother from the :guilabel:`Project` menu, the
right-click context menu, or by pressing :kbd:`Ctrl`:kbd:`Shift` and the :kbd:`Up` or :kbd:`Down`
key.
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
project tree, or by pressing :kbd:`Ctrl`:kbd:`Shift` and the :kbd:`Up` or :kbd:`Down` key.
.. _a_ui_edit:
@@ -112,31 +132,41 @@ Editing and Viewing Documents
To edit a document, double-click it in the project tree, or press the :kbd:`Return` key while
having it selected. This will open the document in the document editor. The editor uses a
simplified markdown format. The format is described in the :ref:`a_ui_md` section below. The editor
has a maximise button (toggles the :guilabel:`Focus Mode`) and a close button in the top-right
corner.
Markdown-like syntax for some features, and a novelWriter-specific syntax for others. The syntax
format is described in the :ref:`a_fmt` section.
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.
Any document in the project tree can also be viewed in parallel in a right hand side document
viewer. To view a document, press :kbd:`Ctrl`:kbd:`R`, or select :guilabel:`View Document` in the
menu. If you have a middle mouse button, middle-clicking on the document will also open it in the
viewer. The document viewed does not have to be the same document currently being edited. However,
If you *are* viewing the same document, pressing :kbd:`Ctrl`:kbd:`R` again will update the document
with your latest changes. You can also press the reload button in the top-right corner of the view
panel next to the close button to achieve the same thing.
menu or context menu. If you have a middle mouse button, middle-clicking on the document will also
open it in the viewer.
The document viewed does not have to be the same document as currently being edited. However, If
you *are* viewing the same document, pressing :kbd:`Ctrl`:kbd:`R` again will update the document
with your latest changes. You can also press the reload button in the top–right corner of the view
panel, next to the close button, to achieve the same thing.
Both the document editor and viewer will show the label of the document in the header at the top of
the edit or view panel. Optionally, the full project path to the document can be shown. This can be
set in :guilabel:`Preferences` from the :guilabel:`Tools` menu. Clicking on the document title bar
will select and reveal its location in the project tree, making it easier to locate in a large
project.
set in :guilabel:`Preferences`.
.. tip::
Clicking on the document title bar will select the document in the project tree and reveal its
location, making it easier to locate in a large project.
Any tag reference in the editor can be opened in the viewer by moving the cursor to the label and
pressing :kbd:`Ctrl`:kbd:`Return`. You can also control-click them with your mouse. In the viewer,
the references become clickable links. Clicking them will replace the content of the viewer with
the content of the document the reference points to. The document viewer keeps a history of viewed
documents, which you can navigate with the arrow buttons in the top-left corner of the viewer. If
your mouse has back and forward navigation buttons, these can be used as well. They work just like
the backward and forward features in a browser.
the content of the document the reference points to.
The document viewer keeps a history of viewed documents, which you can navigate with the arrow
buttons in the top–left corner of the viewer. If your mouse has backward and forward navigation
buttons, these can be used as well. They work just like the backward and forward features in a
browser.
At the bottom of the view panel there is a :guilabel:`References` panel. (If it is hidden, click
the icon to reveal it.) This panel will show links to all documents referring back to the one
@@ -157,15 +187,15 @@ convenient if you want to quickly look through all documents in the list in the
Search & Replace
----------------
The document editor has a search and replace bar that can be activated with :kbd:`Ctrl`:kbd:`F` for
search mode or :kbd:`Ctrl`:kbd:`H` for search/replace mode.
The document editor has a search and replace tool that can be activated with :kbd:`Ctrl`:kbd:`F`
for search mode or :kbd:`Ctrl`:kbd:`H` for search and replace mode.
Pressing :kbd:`Return` while in the search box will search for the next occurrence of the word, and
:kbd:`Shift`:kbd:`Return` for the previous. Pressing :kbd:`Return` in the replace box, will replace
the highlighted text and move to the next word.
the highlighted text and move to the next result.
There are a number of settings for the search bar available as toggle switches above the search
box. They allows you to search for, in order:,: matched case only, whole word results only, search
There are a number of settings for the search tool available as toggle switches above the search
box. They allow you to search for, in order: matched case only, whole word results only, search
using regular expressions, loop search when reaching the end of the document, and move to the next
document when reaching the end. There is also a switch that will try to match the case of the word
when the replacement is made. That is, it will try to keep the word upper, lower, or capitalised to
@@ -186,16 +216,14 @@ you wish.
.. tip::
If you don't like auto-replacement, all symbols inserted by this feature are also available in
the :guilabel:`Insert` menu, and via convenient :ref:`a_ui_shortcuts_ins`. You may also be using
a `Compose Key`_ setup, which means you may not need the auto-replace feature.
.. _Compose Key: https://en.wikipedia.org/wiki/Compose_key
the :guilabel:`Insert` menu, and via convenient :ref:`a_kb_ins`. You may also be using a
`Compose Key`_ setup, which means you may not need the auto-replace feature.
The editor is able to replace two and three hyphens with short and long dashes, triple points with
ellipsis, and replace straight single and double quotes with user-defined quote symbols. It will
also try to determine whether to use the opening or closing symbol, although this feature isn't
always accurate. Especially distinguishing between closing single quote and apostrophe can be
tricky for languages that use the same symbol for these.
tricky for languages that use the same symbol for these, like English does.
.. tip::
If the auto-replace feature changes a symbol when you did not want it to change, pressing
@@ -203,187 +231,31 @@ tricky for languages that use the same symbol for these.
character you typed.
.. _a_ui_md:
Markdown Format
===============
The document editor uses a simplified markdown format. That is, it supports basic formatting like
emphasis (italic), strong importance (bold) and strikethrough text, as well as four levels of
headings.
Some non-standard markdown features have been added. For instance, novelWriter allows for comments,
a synopsis tag, and a set of keyword and value sets used for tags and references.
.. _a_ui_md_head:
Headings
--------
Four levels of headings are allowed. For documents of layout ``Note``, they are free to be used as
you see fit, but for all other layouts used for the novel text itself, they indicate the structural
level of the novel. See :ref:`a_struct_heads` for more details.
``# Title``
Heading level one. If the document is a novel file, the header level indicates the start of a
new partition. This heading level can also be used for the title page's novel title.
``## Title``
Heading level two. If the document is a novel file, the header level indicates the start of a
new chapter. Chapter numbers can be inserted automatically when exporting the manuscript.
``### Title``
Heading level three. If the document is a novel file, the header level indicates the start of a
new scene. Scene numbers or scene separators can be inserted automatically when exporting the
manuscript, so you can use the title field as a working title for your scenes if you wish.
``#### Title``
Heading level four. If the document is a novel file, the header level indicates the start of a
new section. Section titles can be replaced by separators or removed when exporting the
manuscript, so you can use the title field as a working title for your sections if you wish.
.. note::
The space after the ``#`` characters is mandatory. The syntax highlighter will change colour and
font size when the heading is correctly formatted.
.. tip::
If you do use the automatic numbering feature for exports, you can tell the export tool to skip
assigning a number to a specific chapter by adding a ``*`` as the first character of the title
itself. See :ref:`a_struct_heads_unnum` for more details.
.. _a_ui_md_emph:
Text Emphasis
-------------
A minimal set of text emphasis styles are supported.
``_text_``
The text is rendered as emphasised text (italicised).
``**text**``
The text is rendered as strongly important text (bold).
``~~text~~``
Strikethrough 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 ``__``
for strong and ``*`` for emphasis. However, since the differentiation makes the highlighting and
conversion significantly simpler and faster, in novelWriter this is a rule, not just a
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.
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 wrapper.
This is due to the underscore also being a valid word character, so if they are on the outside,
they violate rule 2.
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.
.. _a_ui_md_comm:
Comments and Synopsis
---------------------
In addition to these standard markdown features, novelWriter also allows for comments in documents.
The text of a comment is ignored by the word counter. The text can also be filtered out when
exporting or viewing the document.
If the first word of a comment is ``Synopsis:`` (with the colon included), the comment is treated
specially and will show up in the :ref:`a_ui_outline` in a dedicated column. The word ``synopsis``
is not case sensitive. If it is correctly formatted, the syntax highlighter will indicate this by
altering the colour of the word.
``% text...``
This is a comment. The text is not exported by default (this can be overridden), seen in the
document viewer, or counted towards word counts.
``% 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 exporting the project to for instance generate an outline
document of the whole project.
.. 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.
.. _a_ui_md_tags:
Tags and References
-------------------
The document editor supports a minimal set of keywords used for setting tags, and making references
between documents. The tags and references can be set once per section defined by a heading. Using
them multiple times under the same heading will just override the previous setting.
``@keyword: value``
A keyword argument followed by a value, or a comma separated list of values.
The available tag and reference keywords are listed in the :ref:`a_struct_tags` section. They can
also be inserted at the cursor position in the editor via the :guilabel:`Insert` menu.
.. _a_ui_md_add:
Additional Markdown and Non-Standard Features
---------------------------------------------
The editor and viewer also support markdown standard hard line breaks, and preserve non-breaking
spaces if running with Qt 5.9 or higher. For older versions, the non-breaking spaces are lost when
the document is saved. This is unfortunately hard-coded into the Qt text editor.
* A hard line break can be achieved by leaving two or more spaces at the end of the line. This is
standard markdown syntax. Alternatively, the user can press :kbd:`Ctrl`:kbd:`K`, :kbd:`Return` to
insert this type of line break.
* A non-breaking space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Space`.
* Thin spaces are also supported, and can be inserted with :kbd:`Ctrl`:kbd:`K`,
:kbd:`Shift`:kbd:`Space`.
* Non-breaking thin space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`.
These are all insert features, and the :guilabel:`Insert` menu has more. They are also listed
in :ref:`a_ui_shortcuts_ins`.
Both hard line breaks and non-breaking spaces are highlighted by the syntax highlighter as an
alternate coloured background, depending on the selected theme.
.. tip::
Non-breaking spaces are the correct type of space to separate a number from its unit. Generally,
it prevents the line wrapping algorithms from adding line breaks where it shouldn't.
.. _a_ui_outline:
Project Outline View
====================
The project's Outline view is available as the second tab on the right hand side of the main window
labelled :guilabel:`Outline`. The outline provides an overview of the novel structure, displaying a
tree hierarchy of the elements of the novel, that is, the level 1 to 4 headings representing
partitions, chapters, scenes and sections.
The project's Outline view is available as another view option from the views bar. The outline
provides an overview of the novel structure, displaying a tree hierarchy of the elements of the
novel, that is, the level 1 to 4 headings representing partitions, chapters, scenes and sections.
The document containing the heading can also be displayed as a separate column, as well as the line
number where it occurs. Double-clicking an entry will open the corresponding document in the
editor.
You can select which novel folder to display from the dropdown menu. You can optionally also choose
to show a combination of all novel folders.
.. note::
Since the internal structure of the novel does not depend directly on the folder and document
structure of the project tree, these will not necessarily look the same, depending on how you
choose to organise your documents. See the :ref:`a_struct` page for more details.
Various meta data and information extracted from tags can be displayed in columns in the outline.
A default set of such columns is visible, but you can turn on or off more columns by right clicking
the header and selecting the columns you want to show. The order of the columns can also be
rearranged by dragging them to a different position.
A default set of such columns is visible, but you can turn on or off more columns from the menu
button in the toolbar. The order of the columns can also be rearranged by dragging them to a
different position. You column settings are saved between sessions on a per-project basis.
.. note::
The :guilabel:`Title` column cannot be disabled or moved.
@@ -392,146 +264,8 @@ The information viewed in the outline is based on the project's main index. Whil
its best to keep the index up to date when contents change, you can always rebuild it manually by
pressing :kbd:`F9` if something isn't right.
The outline view itself can be regenerated by pressing :kbd:`F10`. You can also enable automatic
updating in the :guilabel:`Tools` menu, which will trigger an update whenever the index is updated
and the :guilabel:`Outline` tab is active. You may want to disable this feature if your project is
very large,
The outline view itself can be regenerated by pressing the refresh button. By default, the content
is refreshed each time you switch to this view.
The :guilabel:`Synopsis` column of the outline view takes its information from a specially
formatted comment. See :ref:`a_ui_md_comm`.
.. _a_ui_shortcuts:
Keyboard Shortcuts
==================
Most features are available as keyboard shortcuts. These are as follows:
.. csv-table:: Keyboard Shortcuts
:header: "Shortcut", "Description"
:widths: 30, 70
:class: "tight-table"
":kbd:`Alt`:kbd:`1`", "Switch focus to the project tree."
":kbd:`Alt`:kbd:`2`", "Switch focus to document editor."
":kbd:`Alt`:kbd:`3`", "Switch focus to document viewer."
":kbd:`Alt`:kbd:`4`", "Switch focus to outline view."
":kbd:`Alt`:kbd:`Left`", "Move backward in the view history of the document viewer."
":kbd:`Alt`:kbd:`Right`", "Move forward in the view history of the document viewer."
":kbd:`Ctrl`:kbd:`.`", "Open menu to correct word under cursor."
":kbd:`Ctrl`:kbd:`,`", "Open the :guilabel:`Preferences` dialog."
":kbd:`Ctrl`:kbd:`/`", "Change block format to comment."
":kbd:`Ctrl`:kbd:`0`", "Remove block formatting for block under cursor."
":kbd:`Ctrl`:kbd:`1`", "Change block format to header level 1."
":kbd:`Ctrl`:kbd:`2`", "Change block format to header level 2."
":kbd:`Ctrl`:kbd:`3`", "Change block format to header level 3."
":kbd:`Ctrl`:kbd:`4`", "Change block format to header level 4."
":kbd:`Ctrl`:kbd:`A`", "Select all text in the document."
":kbd:`Ctrl`:kbd:`B`", "Format selected text, or word under cursor, with strong emphasis (bold)."
":kbd:`Ctrl`:kbd:`C`", "Copy selected text to clipboard."
":kbd:`Ctrl`:kbd:`D`", "Strikethrough selected text, or word under cursor."
":kbd:`Ctrl`:kbd:`E`", "If in the project tree, edit a document or folder settings. (Same as :kbd:`F2`.)"
":kbd:`Ctrl`:kbd:`F`", "Open the search bar and search for the selected word, if any is selected."
":kbd:`Ctrl`:kbd:`G`", "Find next occurrence of search word in current document. (Same as :kbd:`F3`.)"
":kbd:`Ctrl`:kbd:`H`", "Open the search and replace bar and search for the selected word, if any is selected. (On Mac, this is :kbd:`Cmd`:kbd:`=`.)"
":kbd:`Ctrl`:kbd:`I`", "Format selected text, or word under cursor, with emphasis (italic)."
":kbd:`Ctrl`:kbd:`K`", "Activate the insert commands. The commands are listed in :ref:`a_ui_shortcuts_ins`."
":kbd:`Ctrl`:kbd:`N`", "Create new document."
":kbd:`Ctrl`:kbd:`O`", "Open selected document."
":kbd:`Ctrl`:kbd:`Q`", "Exit novelWriter."
":kbd:`Ctrl`:kbd:`R`", "If in the project tree, open a document for viewing. If the editor has focus, open current document for viewing."
":kbd:`Ctrl`:kbd:`S`", "Save the current document in the document editor."
":kbd:`Ctrl`:kbd:`V`", "Paste text from clipboard to cursor position."
":kbd:`Ctrl`:kbd:`W`", "Close the current document in the document editor."
":kbd:`Ctrl`:kbd:`X`", "Cut selected text to clipboard."
":kbd:`Ctrl`:kbd:`Y`", "Redo latest undo."
":kbd:`Ctrl`:kbd:`Z`", "Undo latest changes."
":kbd:`Ctrl`:kbd:`F7`", "Toggle spell checking."
":kbd:`Ctrl`:kbd:`F10`", "Toggle automatic updating of project outline."
":kbd:`Ctrl`:kbd:`Up`", "Move item one step up in the project tree."
":kbd:`Ctrl`:kbd:`Down`", "Move item one step down in the project tree."
":kbd:`Ctrl`:kbd:`Del`", "Delete next word in editor."
":kbd:`Ctrl`:kbd:`Backspace`", "Delete previous word in editor."
":kbd:`Ctrl`:kbd:`'`", "Wrap selected text, or word under cursor, in single quotes."
":kbd:`Ctrl`:kbd:`""`", "Wrap selected text, or word under cursor, in double quotes."
":kbd:`Ctrl`:kbd:`Retrun`", "Open the tag or reference under the cursor in the Viewer."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`,`", "Open the :guilabel:`Project Settings` dialog."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`/`", "Remove block formatting for block under cursor."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`1`", "Replace occurrence of search word in current document, and search for next occurrence."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`A`", "Select all text in current paragraph."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`G`", "Find previous occurrence of search word in current document. (Same as :kbd:`Shift`:kbd:`F3`.)"
":kbd:`Ctrl`:kbd:`Shift`:kbd:`I`", "Import text to the current document from a text file."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`N`", "Create new folder."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`O`", "Open a project."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`R`", "Close the document viewer."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`S`", "Save the current project."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`W`", "Close the current project."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Z`", "Undo move of project tree item."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Del`", "If in the project tree, move a document to trash, or delete a folder."
":kbd:`F1`", "Open the documentation. This will either open the Qt Assistant, if available, or send you to the documentation website."
":kbd:`F2`", "If in the project tree, edit a document or folder settings. (Same as :kbd:`Ctrl`:kbd:`E`)"
":kbd:`F3`", "Find next occurrence of search word in current document. (Same as :kbd:`Ctrl`:kbd:`G`)"
":kbd:`F5`", "Open the :guilabel:`Build Novel Project` dialog."
":kbd:`F6`", "Open the :guilabel:`Writing Statistics` dialog."
":kbd:`F7`", "Re-run spell checker."
":kbd:`F8`", "Activate :guilabel:`Focus Mode`, hiding the project tree and document viewer."
":kbd:`F9`", "Re-build the project index."
":kbd:`F10`", "Re-build the project outline."
":kbd:`F11`", "Activate full screen mode."
":kbd:`Shift`:kbd:`F1`", "Open the online documentation in the system default browser."
":kbd:`Shift`:kbd:`F3`", "Find previous occurrence of search word in current document. (Same as :kbd:`Ctrl`:kbd:`Shift`:kbd:`G`.)"
":kbd:`Shift`:kbd:`F6`", "Open the :guilabel:`Project Details` dialog."
":kbd:`Return`", "If in the project tree, open a document for editing."
.. note::
On macOS, replace :kbd:`Ctrl` with :kbd:`Cmd`.
.. _a_ui_shortcuts_ins:
Insert Shortcuts
----------------
A set of insert features are also available through shortcuts, but they require a double
combination of key sequences. The insert feature is activated with :kbd:`Ctrl`:kbd:`K`, followed by
a key or key combination for the inserted content.
.. csv-table:: Keyboard Shortcuts
:header: "Shortcut", "Description"
:widths: 40, 60
:class: "tight-table"
":kbd:`Ctrl`:kbd:`K`, :kbd:`−`", "Insert a short dash (en dash)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`_`", "Insert a long dash (em dash)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`_`", "Insert a horizontal bar (quotation dash)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`~`", "Insert a figure dash (same width as a number)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`1`", "Insert a left single quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`2`", "Insert a right single quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`3`", "Insert a left double quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`4`", "Insert a right double quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`'`", "Insert a modifier apostrophe."
":kbd:`Ctrl`:kbd:`K`, :kbd:`.`", "Insert an ellipsis."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`'`", "Insert a prime."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`""`", "Insert a double prime."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Return`", "Insert a hard line break."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Space`", "Insert a non-breaking space."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Shift`:kbd:`Space`", "Insert a thin space."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`", "Insert a thin non-breaking space."
":kbd:`Ctrl`:kbd:`K`, :kbd:`*`", "Insert a list bullet."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`−`", "Insert a hyphen bullet (alternative bullet)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`*`", "Insert a flower mark (alternative bullet)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`%`", "Insert a per mille symbol."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`O`", "Insert a degree symbol."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`X`", "Insert a times sign."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`D`", "Insert a division sign."
":kbd:`Ctrl`:kbd:`K`, :kbd:`G`", "Insert a ``@tag`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`V`", "Insert a ``@pov`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`F`", "Insert a ``@focus`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`C`", "Insert a ``@char`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`P`", "Insert a ``@plot`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`T`", "Insert a ``@time`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`L`", "Insert a ``@location`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`O`", "Insert an ``@object`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`E`", "Insert an ``@entity`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`X`", "Insert a ``@custom`` keyword."
formatted comment. See :ref:`a_fmt_comm`.

View File

@@ -0,0 +1,133 @@
.. _a_prjfmt:
**********************
Project Format Changes
**********************
.. _File Format Spec 1.5: _static/fileformatspec15.pdf
.. _documentation: https://novelwriter.readthedocs.io
Most of the changes to the file formats over the history of novelWriter have no impact on the
user-side of things. The project files are generally updated automatically. However, some of the
changes require minor actions from the user.
The key changes in the formats are listed below, as well as the user actions required, where
applicable.
.. only:: not html
A full project file format specification is available in the online documentation_.
.. caution::
When you update a project from one format version to the next, the project can no longer be
opened by a version of novelWriter prior to the version where the new file format was
introduced. You will get a notification about any updates to your project file format and will
have the option to decline the upgrade.
.. only:: html
**For Developers**
A full description of the current file format is available in the `File Format Spec 1.5`_
document, available as a PDF. This document is intended for contributors to novelWriter, those
building project conversion tools, either to or from tne novelWriter format, and for those who
wish to make their own templating system.
.. _a_prjfmt_1_5:
Format 1.5 Changes
==================
This project format was introduced in novelWriter version 2.0 RC 2.
This is a modification of the 1.4 format. It makes the XML more consistent in that meta data have
been moved to their respective section nodes as attributes, and key/value settings now have a
consistent format. Logical flags are saved as yes/no instead of Python True/False, and the main
heading of the document is now saved to the item rather than in the index. The conversion is done
automatically the first time a project is loaded. No user action is required.
.. _a_prjfmt_1_4:
Format 1.4 Changes
==================
This project format was introduced in novelWriter version 2.0 RC 1. Since this was a release
candidate, it is unlikely that your project uses it, but it may be the case if you've installed a
pre-release.
This format changes the way project items (folders, documents and notes) are stored. It is a more
compact format that is simpler and faster to parse, and easier to extend. The conversion is done
automatically the first time a project is loaded. No user action is required.
.. _a_prjfmt_1_3:
Format 1.3 Changes
==================
This project format was introduced in novelWriter version 1.5.
With this format, the number of document layouts was reduced from 8 to 2. The conversion of
document layouts is performed automatically when the project is opened.
Due to the reduction of layouts, some features that were previously controlled by these layouts
will be lost. These features are instead now controlled by syntax codes, so to recover these
features, some minor modification must be made to select documents by the user.
The manual changes the user must make should be very few as they apply to document layouts that
should be used only a few places in any given project. These are as follows:
**Title Pages**
* The formatting of the level one title on the title page must be changed from ``# Title Text`` to
``#! Title Text`` in order to retain the previous functionality. See :ref:`a_fmt_head`.
* Any text that was previously centred on the page must be manually centred using the new text
alignment feature. See :ref:`a_fmt_align`.
**Unnumbered Chapters**
* Since the specific layout for unnumbered chapters has been dropped, such chapters must all use
the ``##! Chapter Name`` formatting code instead of ``## Chapter Name``. This also includes
chapters marked by an asterisk: ``## *Chapter Name``, as this feature has also been dropped.
See :ref:`a_fmt_head`.
**Plain Pages**
* The layout named "Plain Page" has also been removed. The only feature of this layout was that it
ensured that the content always started on a fresh page. In the new format, fresh pages can be
set anywhere in the text with the ``[NEW PAGE]`` code. See :ref:`a_fmt_break`.
.. _a_prjfmt_1_2:
Format 1.2 Changes
==================
This project format was introduced in novelWriter version 0.10.
With this format, the way auto-replace entries were stored in the main project XML file changed.
.. _a_prjfmt_1_1:
Format 1.1 Changes
==================
This project format was introduced in novelWriter version 0.7.
With this format, the ``content`` folder was introduced in the project storage. Previously, all
novelWriter documents were saved in a series of folders numbered from ``data_0`` to ``data_f``.
It also reduces the number of meta data and cache files. These files are automatically deleted if
an old project is opened. This was also when the Table of Contents file was introduced.
.. _a_prjfmt_1_0:
Format 1.0 Changes
==================
This is the original file format and project structure. It was in use up to version 0.6.3.

View File

@@ -0,0 +1,146 @@
.. _a_kb:
******************
Keyboard Shortcuts
******************
Most features in novelWriter are available as keyboard shortcuts. This is a reference list if these
shortcuts. Most of them are also listed in the application.
.. _a_kb_main:
Main Shortcuts
==============
The main shorcuts are as follows:
.. csv-table:: Keyboard Shortcuts
:header: "Shortcut", "Description"
:widths: 22, 78
:class: "tight-table"
":kbd:`F1`", "Open the online user manual."
":kbd:`F2`", "If in the project tree, edit an item's label."
":kbd:`F3`", "Find next occurrence of search word in current document."
":kbd:`F5`", "Open the :guilabel:`Build Novel Project` dialog."
":kbd:`F6`", "Open the :guilabel:`Writing Statistics` dialog."
":kbd:`F7`", "Re-run spell checker."
":kbd:`F8`", "Toggle :guilabel:`Focus Mode`."
":kbd:`F9`", "Re-build the project index."
":kbd:`F11`", "Toggle full screen mode."
":kbd:`Return`", "If in the project tree, open a document for editing."
":kbd:`Alt`:kbd:`1`", "Switch focus to the project tree. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`1`."
":kbd:`Alt`:kbd:`2`", "Switch focus to document editor. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`2`."
":kbd:`Alt`:kbd:`3`", "Switch focus to document viewer. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`3`."
":kbd:`Alt`:kbd:`4`", "Switch focus to outline view. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`4`."
":kbd:`Alt`:kbd:`Left`", "Move backward in the view history of the document viewer."
":kbd:`Alt`:kbd:`Right`", "Move forward in the view history of the document viewer."
":kbd:`Ctrl`:kbd:`.`", "Open the context menu in the project tree or the document editor."
":kbd:`Ctrl`:kbd:`,`", "Open the :guilabel:`Preferences` dialog."
":kbd:`Ctrl`:kbd:`/`", "Toggle block format as comment."
":kbd:`Ctrl`:kbd:`0`", "Remove block formatting for block under cursor."
":kbd:`Ctrl`:kbd:`1`", "Change block format to header level 1."
":kbd:`Ctrl`:kbd:`2`", "Change block format to header level 2."
":kbd:`Ctrl`:kbd:`3`", "Change block format to header level 3."
":kbd:`Ctrl`:kbd:`4`", "Change block format to header level 4."
":kbd:`Ctrl`:kbd:`5`", "Change block alignment to left-aligned."
":kbd:`Ctrl`:kbd:`6`", "Change block alignment to centred."
":kbd:`Ctrl`:kbd:`7`", "Change block alignment to right-aligned."
":kbd:`Ctrl`:kbd:`8`", "Add a left margin to the block."
":kbd:`Ctrl`:kbd:`9`", "Add a right margin to the block."
":kbd:`Ctrl`:kbd:`A`", "Select all text in the document."
":kbd:`Ctrl`:kbd:`B`", "Format selected text, or word under cursor, with strong emphasis (bold)."
":kbd:`Ctrl`:kbd:`C`", "Copy selected text to clipboard."
":kbd:`Ctrl`:kbd:`D`", "Strikethrough selected text, or word under cursor."
":kbd:`Ctrl`:kbd:`F`", "Open the search bar and search for the selected word, if any is selected."
":kbd:`Ctrl`:kbd:`G`", "Find next occurrence of search word in current document."
":kbd:`Ctrl`:kbd:`H`", "Open the search and replace tool and search for the selected word, if any is selected. (On Mac, this is :kbd:`Cmd`:kbd:`=`.)"
":kbd:`Ctrl`:kbd:`I`", "Format selected text, or word under cursor, with emphasis (italic)."
":kbd:`Ctrl`:kbd:`K`", "Activate the insert commands. The commands are listed in :ref:`a_kb_ins`."
":kbd:`Ctrl`:kbd:`L`", "Open the :guilabel:`Quick Links` menu in the Project Tree."
":kbd:`Ctrl`:kbd:`N`", "Open the Create New Item menu in the Project Tree."
":kbd:`Ctrl`:kbd:`O`", "Open selected document."
":kbd:`Ctrl`:kbd:`Q`", "Exit novelWriter."
":kbd:`Ctrl`:kbd:`R`", "If in the project tree, open a document for viewing. If in the editor, open current document for viewing."
":kbd:`Ctrl`:kbd:`S`", "Save the current document in the document editor."
":kbd:`Ctrl`:kbd:`V`", "Paste text from clipboard to cursor position."
":kbd:`Ctrl`:kbd:`W`", "Close the current document in the document editor."
":kbd:`Ctrl`:kbd:`X`", "Cut selected text to clipboard."
":kbd:`Ctrl`:kbd:`Y`", "Redo latest undo."
":kbd:`Ctrl`:kbd:`Z`", "Undo latest changes."
":kbd:`Ctrl`:kbd:`F7`", "Toggle spell checking."
":kbd:`Ctrl`:kbd:`Up`", "Move item one step up in the project tree."
":kbd:`Ctrl`:kbd:`Down`", "Move item one step down in the project tree."
":kbd:`Ctrl`:kbd:`Del`", "Delete next word in editor."
":kbd:`Ctrl`:kbd:`Backspace`", "Delete previous word in editor."
":kbd:`Ctrl`:kbd:`'`", "Wrap selected text, or word under cursor, in single quotes."
":kbd:`Ctrl`:kbd:`""`", "Wrap selected text, or word under cursor, in double quotes."
":kbd:`Ctrl`:kbd:`Return`", "Open the tag or reference under the cursor in the Viewer."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`,`", "Open the :guilabel:`Project Settings` dialog."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`/`", "Remove block formatting for block under cursor."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`1`", "Replace occurrence of search word in current document, and search for next occurrence."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`A`", "Select all text in current paragraph."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`G`", "Find previous occurrence of search word in current document."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`I`", "Import text to the current document from a text file."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`O`", "Open a project."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`R`", "Close the document viewer."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`S`", "Save the current project."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`W`", "Close the current project."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Z`", "Undo move of project tree item."
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Del`", "If in the project tree, move an item to Trash."
":kbd:`Shift`:kbd:`F1`", "Open the local user manual (PDF) if it is available."
":kbd:`Shift`:kbd:`F3`", "Find previous occurrence of search word in current document."
":kbd:`Shift`:kbd:`F6`", "Open the :guilabel:`Project Details` dialog."
.. note::
On macOS, replace :kbd:`Ctrl` with :kbd:`Cmd`.
.. _a_kb_ins:
Insert Shortcuts
================
A set of insert features are also available through shortcuts, but they require a double
combination of key sequences. The insert feature is activated with :kbd:`Ctrl`:kbd:`K`, followed by
a key or key combination for the inserted content.
.. csv-table:: Keyboard Shortcuts
:header: "Shortcut", "Description"
:widths: 30, 70
:class: "tight-table"
":kbd:`Ctrl`:kbd:`K`, :kbd:`−`", "Insert a short dash (en dash)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`_`", "Insert a long dash (em dash)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`_`", "Insert a horizontal bar (quotation dash)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`~`", "Insert a figure dash (same width as a number)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`1`", "Insert a left single quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`2`", "Insert a right single quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`3`", "Insert a left double quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`4`", "Insert a right double quote."
":kbd:`Ctrl`:kbd:`K`, :kbd:`'`", "Insert a modifier apostrophe."
":kbd:`Ctrl`:kbd:`K`, :kbd:`.`", "Insert an ellipsis."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`'`", "Insert a prime."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`""`", "Insert a double prime."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Space`", "Insert a non-breaking space."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Shift`:kbd:`Space`", "Insert a thin space."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`", "Insert a thin non-breaking space."
":kbd:`Ctrl`:kbd:`K`, :kbd:`*`", "Insert a list bullet."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`−`", "Insert a hyphen bullet (alternative bullet)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`*`", "Insert a flower mark (alternative bullet)."
":kbd:`Ctrl`:kbd:`K`, :kbd:`%`", "Insert a per mille symbol."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`O`", "Insert a degree symbol."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`X`", "Insert a times sign."
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`D`", "Insert a division sign."
":kbd:`Ctrl`:kbd:`K`, :kbd:`G`", "Insert a ``@tag`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`V`", "Insert a ``@pov`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`F`", "Insert a ``@focus`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`C`", "Insert a ``@char`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`P`", "Insert a ``@plot`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`S`", "Insert a synopsis comment."
":kbd:`Ctrl`:kbd:`K`, :kbd:`T`", "Insert a ``@time`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`L`", "Insert a ``@location`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`O`", "Insert an ``@object`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`E`", "Insert an ``@entity`` keyword."
":kbd:`Ctrl`:kbd:`K`, :kbd:`X`", "Insert a ``@custom`` keyword."

View File

@@ -1,250 +0,0 @@
.. _a_struct:
***************
Novel Structure
***************
This section covers the structure of a novel project.
It concerns documents under the :guilabel:`Novel` type root folder only. There are some
restrictions and features that only apply to these types of documents.
.. _a_struct_heads:
Importance of Headings
======================
Subfolders under root folders have no impact on the structure of the novel itself. The structure is
instead dictated by the heading level of the headers within the documents.
Four levels of headings are supported, signified by the number of hashes (``#``) preceding the
title. See also the :ref:`a_ui_md` section for more details about the markdown syntax.
.. note::
The header levels are not only important when generating the exported novel file, they are also
used by the indexer when building the outline tree in the :guilabel:`Outline` tab as well as the
:guilabel:`Novel` tab of the project tree. Each heading also starts a new region where new
references and tags can be defined.
The different header levels are interpreted as specific section types of the novel in the following
way:
``# Header1``
Header level one signifies that the text refers to either the novel title or the name of a top
level partition. The latter is useful when you want to split the manuscript up into books,
parts, or acts.
``## Header2``
Header level two signifies a chapter level partition. Each time you want to start a new chapter,
you must add such a heading. If you choose to split your manuscript up into one document per
scene, you need a single chapter document with just the heading. You can of course also add a
synopsis and reference keywords to the chapter document. If you want to open the chapter with a
quote or other introductory text that isn't part of a scene, this is also where you'd put that
text.
``### Header3``
Header level three signifies a scene level partition. You must provide a title text, but the
title text can be replaced with a scene separator or just skipped entirely when you export your
manuscript.
``#### Header4``
Header level four signifies a sub-scene level partition, usually called a "section" in the
documentation and the user interface. These can be useful if you want to change tag references
mid-scene, like if you change the point-of-view character. You are free to use sections as you
wish, and can filter them out of the final manuscript just like with scene titles.
.. tip::
There are multiple options of how to process novel titles when exporting the manuscript. For
instance, chapter numbers can be applied automatically, and so can scene numbers if you want
them in a draft manuscript. See the :ref:`a_export` page for more details.
.. _a_struct_heads_unnum:
Unnumbered Chapter Headings
---------------------------
If you use layout types for your documents, the automatic numbering feature for your chapters is
controlled by whether you use the :guilabel:`Chapter` or :guilabel:`Unnumbered` layout type for
your document. However, if you have a different document layout where this isn't practical, you can
also switch off chapter numbering for a chapter by making the first character of the chapter title
an asterisk (``*``). Like so:
``## *Unnumbered Chapter Title``
The leading asterisk is only considered by the :guilabel:`Build Novel Project` tool, and will be
removed before the title is inserted at the location of the ``%title%`` label. See the
:ref:`a_export` page for more details.
.. note::
If you need the first character of the title to be an actual asterisk, you must escape it:
``\*``.
.. _a_struct_tags:
Tag References
==============
Each text partition, indicated by a heading of any level, can contain references to tags set in the
supporting notes of the project. The references are gathered by the indexer and used to generate an
outline view on the :guilabel:`Outline` tab of how the different parts of the novel are connected.
This section covers how to set references to tags. See :ref:`a_notes_tags` for how to define tags
the references can point to.
References and tags are also clickable in the document editor and viewer, making it easy to
navigate between reference notes while writing. Clicked links are always opened in the view panel.
References are set as a keyword and a list of corresponding tags. The valid keywords are listed
below. The format of a reference line is ``@keyword: value1, [value2] ... [valueN]``. All keywords
allow multiple values.
``@pov``
The point-of-view character for the current section. The target must be a note tag in the
:guilabel:`Character` type root folder.
``@focus``
The character that has the focus for the current section. This can be used in cases where the
focus is not a point-of-view character. The target must be a note tag in the
:guilabel:`Character` type root folder.
``@char``
Other characters in the current section. The target must be a note tag in the
:guilabel:`Character` type root folder. This should not include the point-of-view character.
``@plot``
The plot or subplot advanced in the current section. The target must be a note tag in the
:guilabel:`Plot` type root folder.
``@time``
The timelines touched by the current section. The target must be a note tag in the
:guilabel:`Timeline` type root folder.
``@location``
The location the current section takes place in. The target must be a note tag in the
:guilabel:`Locations` type root folder.
``@object``
Objects present in the current section. The target must be a note tag in the :guilabel:`Object`
type root folder.
``@entity``
Entities present in the current section. The target must be a note tag in the
:guilabel:`Entities` type root folder.
``@custom``
Custom references in the current section. The target must be a note tag in a :guilabel:`Custom`
type root folder.
The syntax highlighter will alert the user that the tags and references are used correctly, and
that the tags referenced exist.
The highlighter may be mistaken if the index of defined tags is out of date. If so, press :kbd:`F9`
to regenerate it, or select :guilabel:`Rebuild Index` from the :guilabel:`Tools` menu. In general,
the index for a document is regenerated when it is saved, so this shouldn't normally be necessary.
.. _a_struct_layout:
Novel Document Layout
=====================
All documents in the project can have a layout format set. These layouts are important when the
project is exported as they indicate how to treat the content in terms of text formatting,
headings, and page breaks. The layout for each document is indicated as the last set of characters
in the :guilabel:`Flags` column of the project tree.
Not all layout types are actually treated differently, they also help to indicate what each
document is intended for in your project. The :guilabel:`Book` layout is a generic novel document
layout that is formatted identically to :guilabel:`Chapter` and :guilabel:`Scene` layout documents,
but may help to indicate what each document does in your project.
You can for instance lay out your project using :guilabel:`Book` documents for each act, and then
later split those into chapter or scene documents by using the :guilabel:`Split Document` tool.
Scenes can also be contained within :guilabel:`Chapter` type documents, but you lose the drag and
drop feature that comes with having them in separate documents if you organise them this way.
Some layouts *do* have implications on how the project is exported. Documents with layout
:guilabel:`Title Page` and :guilabel:`Partition` have all headings and text centred, while the
:guilabel:`Unnumbered` layout disables the automatic chapter numbering feature for everything
contained within it. The latter is convenient for Prologue and Epilogue type chapters.
The above layout formats are only usable in the Novel root folder. Documents that are not a part of
the novel itself should have the :guilabel:`Note` layout. These documents are not getting any
special formatting, and it is possible to collectively filter them out during export. Notes can be
used anywhere in the project, also in the :guilabel:`Novel` root folder.
Below is an overview of all available layout formats.
:guilabel:`Title Page`
The title page layout. The title should be formatted as a heading level one. All text is centred
on export.
:guilabel:`Plain Page`
A plain page layout useful for instance for front matter pages. Heading levels are ignored for
this layout format, and so are formatting options like :guilabel:`Justify Text`. The page is
exported with a page break before it.
:guilabel:`Book`
This is the generic novel format that in principle can be used for all novel documents. Since
the internal structure of the novel is controlled by the heading levels, this layout will
produce the same result as a collection of :guilabel:`Partition`, :guilabel:`Chapter` and
:guilabel:`Scene` layout documents. However, it does not provide the functionality of the
:guilabel:`Unnumbered` layout format by default, but this can still be achieved by prefixing the
chapter title with an asterisk (``*``). See :ref:`a_struct_heads_unnum` for more details.
:guilabel:`Partition`
A partition can be used to split the novel into parts. Partition titles are indicated with a
level one heading. You can also add text and meta data to the page. The :guilabel:`Partition`
layout will in addition force a page break before the heading, and centre all content on the
page.
:guilabel:`Chapter`
Signifies the start of a new chapter. If the text itself is contained in scene documents, these
documents should only contain the title, comments, synopsis, and tag references for characters,
plot, etc. The heading for chapters should be level two. If you need an opening text, like a
quote or other leading text before the first scene, this is also where you'd want to add this
text.
:guilabel:`Unnumbered`
Same as :guilabel:`Chapter`, but when exporting the project, and automatic chapter numbering is
enabled, documents with this layout will not increment and apply a chapter number. It also has a
separate title formatting setting. This makes the layout suitable for Prologue and Epilogue type
chapters.
:guilabel:`Scene`
Used for scenes. This document should have a header of level three. Further sections can have
headers of level four, but there are no layout specifically for sections.
:guilabel:`Note`
A generic document that is optionally ignored when the novel project is exported. Use this
layout for descriptions of content in the supporting root folders. Notes can also be added to
the :guilabel:`Novel` root folder if you need to insert notes there. Note headers receive no
special formatting when building the project. They are always exported as-is.
.. note::
The layout granularity is entirely optional. In principle, you can write the entire novel in a
single document with layout :guilabel:`Book`. You can also have a single document per chapter if
that suits you better. The :guilabel:`Outline` will show your structure of chapters and scenes
regardless of how your documents are organised. So will the novel tree.
.. tip::
You can always start writing with a coarse layout with one or a few documents, and then later
use the split tool to automatically split the documents into separate chapter and scene
documents. The split tool will try to select the correct layout for each of the new documents.
.. _a_struct_layout_auto:
Novel Layout Automation
-----------------------
When a document is saved from the document editor, novelWriter will check if the level of the first
header of the document matches the selected document layout. If the header level is inconsistent
with the layout, the layout will automatically be corrected if it can be unambiguously determined.
This means that for instance saving a document with header level three, when the layout is set to
:guilabel:`Chapter`, the layout will automatically be changed to :guilabel:`Scene`. If, however,
the layout was set to :guilabel:`Book`, no change will be made because the :guilabel:`Book` layout
is not associated with a specific header level.

View File

@@ -4,10 +4,15 @@
Typographical Notes
*******************
.. _Prime: https://en.wikipedia.org/wiki/Prime_(symbol)
.. _thin space: https://en.wikipedia.org/wiki/Thin_space
.. _Quotation Mark: https://en.wikipedia.org/wiki/Quotation_mark
.. _Modifier letter apostrophe: https://en.wikipedia.org/wiki/Modifier_letter_apostrophe
novelWriter has some support for typographical symbols that are not usually easily available in
many text editors. This includes for instance the proper unicode quotation marks, dashes, ellipsis,
thin spaces, etc. All these symbols are available from the :guilabel:`Insert` menu, and via
keyboard shortcuts. See :ref:`a_ui_shortcuts_ins`.
keyboard shortcuts. See :ref:`a_kb_ins`.
This chapter provides some additional information on how novelWriter handles these symbols.
@@ -17,7 +22,7 @@ This chapter provides some additional information on how novelWriter handles the
Special Notes on Symbols
========================
Some additional notes on the available symbols.
This section contains additional notes on the available special symbols.
Dashes and Ellipsis
@@ -29,8 +34,8 @@ always be reverted with the undo command :kbd:`Ctrl`:kbd:`Z`, reverting the text
before the automatic replacement occurred.
In addition, "Figure Dash" is available. The Figure Dash is a dash that has the same width as the
numbers of the same font, for most fonts. It helps to align numbers align nicely in columns when
you need to use a dash in them.
numbers of the same font, for most fonts. It helps to align numbers nicely in columns when you need
to use a dash in them.
Single and Double Quotes
@@ -44,12 +49,10 @@ Ordinarily, text wrapped in quotes are highlighted by the editor. This is meant
for highlighting dialogue between characters. This feature can be disabled in
:guilabel:`Preferences` if this feature isn't wanted.
The editor distinguishes between text wrapped in regular straight quotes and with the user-selected
double quote symbols. This is to help the writer recognise which parts of the text are not using
the chosen quote symbols. Two convenience functions in the :guilabel:`Format` menu can be used to
re-format a selected section of text with the correct quote symbols.
.. _Quotation Mark: https://en.wikipedia.org/wiki/Quotation_mark
The editor distinguishes between text wrapped in regular straight double quotes and the
user-selected double quote symbols. This is to help the writer recognise which parts of the text
are not using the chosen quote symbols. Two convenience functions in the :guilabel:`Format` menu
can be used to re-format a selected section of text with the correct quote symbols.
Single and Double Prime
@@ -62,8 +65,6 @@ and double straight quotes, and may be renderred similarly by the font, but they
codes. Using these correctly will also prevent the auto-replace and dialogue highlighting features
misunderstanding their meaning in the text.
.. _Prime: https://en.wikipedia.org/wiki/Prime_(symbol)
Modifier Letter Apostrophe
--------------------------
@@ -82,8 +83,6 @@ right single quotation marks, depending on the font. There is a Wikipedia articl
automatically with the corresponding right hand single quote symbol as is generally recommended.
Therefore it doesn't really matter if you only use them to correct highlighting.
.. _Modifier letter apostrophe: https://en.wikipedia.org/wiki/Modifier_letter_apostrophe
Special Space Symbols
---------------------
@@ -100,5 +99,3 @@ spot them in the text. The colour will depend on the selected colour theme.
The thin and non-breaking spaces are converted to their corresponding HTML codes on export to HTML
format.
.. _thin space: https://en.wikipedia.org/wiki/Thin_space

View File

@@ -1,50 +1,119 @@
# novelWriter Internationalisation
# novelWriter Internationalisation (i18n)
The `i18n` folder contains the translation files for the Qt5 GUI. There are two types of files
involved: the `nw_XX.ts` and the `nw_XX.qm` files. The `nw_XX.ts` files are located in the `i18n`
folder at the root of the repository, and the `nw_XX.qm` together with the `project_XX.json` files
are located in `nw/assets/i18n`. The latter are JSON files translation maps for the novelWriter
projects, used by the Build Novel Project tool.
The maintenance of translations has been moved to the Crowdin service. The translation strings can
be edited there at the [novelWriter project page](https://crowdin.com/project/novelwriter).
However, please read the Translation Guidelines section below.
## Qt GUI Localisation
You can still use the manual approach listed below, and then upload the file through the website's
interface. The translation strings for that language will then be updated and queued for approval.
The `.qm` files are the actual files used by the application to translate the GUI into another
language other than the default British English. The files are not generated by default. They can
be built with:
To verify a language file translated through the Crowdin tool, download and extract it into the
`i18n` folder in the novelWriter source and follow the instructions in
[Generate an Updated Translation File](#generate-an-updated-translation-file) below.
# Translation Guidelines
When contributing translations, keep the following things in mind.
* For descriptive labels and dialog boxes, make sure you do _not_ change the meaning of the text
when you translate it from English. The user must receive the same instructions or information
regardless of language. This is improtant, otherwise the documentation will be inconsistent with
the user interface and it will become a lot more difficult to handle user issues and questions.
* If you think a label or description is misleading or incomplete, please file an issue report. The
correct way to handle such changes is to change the text in the code first, which will then be
forwarded to _all_ translators such that the GUI is consistent across all languages.
* For very short labels, like button labels. it may be fine to replace the word with a similar
word, but only as long as the user understands what it is supposed to do. Some buttons and tabs
have limited space. If necessary, it is OK to use abbreviations.
# Direct Approach Using Qt Linguist
Here you will find instructions for translating novelWriter to a new language directly using Qt
Linguist, or updating the translations for an already existing supported language.
There are two areas relevant to localisation:
* The Qt5 GUI translation files, which consists of `nw_XX.ts` files. This is the bulk of the
translation work.
* The `project_XX.json` files. See [Project Localisation](#project-localisation) below.
The `XX` in the file name corresponds to the language and country code for the translation. For
instance `en_GB` for British English.
## Qt5 GUI Localisation
You will need the translation tool Qt 5 Linguist on your system.
For Ubuntu/Debian, run:
```bash
sudo apt install qttools5-dev-tools
```
See also [Qt Linguist Manual: Translators](https://doc.qt.io/qt-5/linguist-translators.html).
### Workflow
Here's an overview of the localisation workflow:
1. First, create a new branch off of `main`, and there, generate a new `nw_XX.ts` translation file.
1. Load the translation file in Qt Linguist. Translate and save your changes.
1. Generate the `nw_XX.qm` file.
1. Run the application and verify your changes. Iterate from step 2.
1. Once finished, commit your changes and submit your pull request.
When you want to translate new changes, again create a new branch off of `main` and re-generate the
translation file. Continue from step 2.
### Generate an Updated Translation File
The `i18n` folder at the root of the repository contains the `nw_XX.ts` translation files.
Whether to add a new language to the translation framework, or to update the file against the
current source code, you must first run the `qtlupdate` command:
```bash
python3 setup.py qtlupdate i18n/nw_XX.ts
```
The file name must be in the correct format. All translation files must be located in the `i18n`
folder, start with `nw_` and end with `.ts`. In between goes the language and country code. It must
be a valid ISO language code, otherwise novelWriter will not accept the file.
For instance, the French translation uses the language code `fr_FR`, so its translation file will
be `nw_fr_FR.ts`
### Edit the Translation File in Qt Linguist
The `i18n/nw_XX.ts` file can be edited with the Qt Linguist application provided by Qt 5. This is
by far easier than manually editing the `.ts` file.
Please select "English" and "United Kingdom" as the _source_ language if prompted by Qt Linguist.
### Verify Your Translation
The application does not use `.ts` files directly. The `novelwriter/assets/i18n/nw_XX.qm` files are
the actual files used to translate the GUI into another language other than the default British
English. These files are not generated by default, but they can be built with:
```bash
python3 setup.py qtlrelease
```
To add a new translation file, first add a new entry in the `novelWriter.pro` file under the
`TRANSLATIONS` variable. Please use the underscore syntax for file names as the importer expects
this format.
You can now test the translation in novelWriter. The Preferences dialog should list the newly added
language, so go ahead and select it.
After adding the entry in the `.pro` file, run:
```bash
python3 setup.py qtlupdate
```
This will build a new `i18n/nw_XX.ts` file for the language you just added. The file can then be
edited with the Qt 5 Linguist application provided by Qt. This is by far easier than manually
editing the `.ts` file. Please select "English" and "United Kingdom" as the source langauge when
prompted by Qt 5 Linguist.
When you're done editing, you can build the `nw/assets/i18n/nw_XX.qm` file and test it in
novelWriter. The Preferences dialog should list the newly added language, and you can select it and
test it.
Please do not submit the `.qm` files to the repository. Only the `.ts` files in the `i18n` folder
are needed.
**Note:** This requires that you have the tools Qt 5 Linguist and the PyQt5 tool `pylupdate5`
installed on your system.
### Missing QtBase Translations
The default Qt dialogs also have translations, for instance for standard buttons for "Yes", "No",
"Ok", "Cancel", etc. Generally, these translations files are installed with the Qt libraries on
your system, and novelWriter will collect those translations from there. However, these
translations are missing for many languages.
The default Qt dialogs also have translations, for instance for standard buttons like "Yes", "No",
"Ok", "Cancel", etc. Generally, these translation files are installed with the Qt libraries on your
system, and novelWriter will collect those translations from there. However, these translations are
missing for many languages.
As a starting point, there is no need to translate any entries in the `.ts` files that are under
elements starting with the letter "Q", like "QPlatformTheme", "QWizard", etc. If these turn up in
@@ -55,18 +124,17 @@ These additional translation entries are generated from a file named `i18n/qtbas
a file that novelWriter uses. It is there only to generate these additional entries for the `.ts`
files.
## Project Localisation
Projects can have a different language setting than the GUI itself. The files with format
`project_XX.json` in `nw/assets/i18n` are simple translation maps for text that goes into the
exported documents generated by the Build Novel Project tool.
`project_XX.json` in `novelwriter/assets/i18n` are simple translation maps for text that goes into
the exported documents generated by the Build Novel Project tool.
The files are loaded based on the language setting in the build tool. At the present time, no other
parts of the application use these files. Since these are used as replacement lookups, they are
maintained as plain JSON files. The main usage is to generate chapter headers as number words.
The files are loaded based on the language setting in the Build Novel Project tool. At the present
time, no other parts of the application use these files. Since these are used as replacement
lookups, they are maintained as plain JSON files. The main usage is to generate chapter headers as
number words.
Adding new translations for these files is easy. Just copy the `project_en.json` file, rename it to
the appropriate language coded filename, and edit it. Please use the underscore as separator if a
language needs to be localised to a specific country under a language. The importer will for
instance look for `en_US` first, then use `en` if it is not found. If there are no matching files,
the project falls back to using English.
Adding new translations for these files is easy. Just copy the `project_en_GB.json` file, rename it
to the appropriate language coded filename, and open it in a text editor and edit the content.

4513
i18n/nw_base.ts Normal file

File diff suppressed because it is too large Load Diff

4513
i18n/nw_de_DE.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4513
i18n/nw_es_419.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4523
i18n/nw_fr_FR.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4513
i18n/nw_nl_NL.ts Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

4513
i18n/nw_pt_BR.ts Normal file

File diff suppressed because it is too large Load Diff

4513
i18n/nw_zh_CN.ts Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,7 @@
# PyQt6 Linguist Tool
This is a copy of the `pylupdate` tool from PyQt6 version 6.2.1 from
[PyPi](https://pypi.org/project/PyQt6/).
The tool is stripped down to run for novelWriter.
PyQt6 is licensed under GPL 3.0

View File

@@ -0,0 +1,22 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
# The public API.
from .lupdate import lupdate
__all__ = ["lupdate"]

View File

@@ -0,0 +1,90 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
import fnmatch
import os
# from .designer_source import DesignerSource
from .python_source import PythonSource
from .translation_file import TranslationFile
from .user import UserException
def lupdate(
sources, translation_files, no_obsolete=False, no_summary=True, verbose=False, excludes=None
):
""" Update a sequence of translation (.ts) files from a sequence of Python
source (.py) files, Designer source (.ui) files or directories containing
source files.
"""
if excludes is None:
excludes = ()
# Read the .ts files.
translations = [
TranslationFile(ts, no_obsolete=no_obsolete, no_summary=no_summary, verbose=verbose)
for ts in translation_files
]
# Read the sources.
source_files = []
for source in sources:
if os.path.isdir(source):
for dirpath, _, filenames in os.walk(source):
for fn in filenames:
# Apply any exclusion patterns.
for exclude in excludes:
if fnmatch.fnmatch(fn, exclude):
fn = None
break
if fn is None:
continue
filename = os.path.join(dirpath, fn)
if filename.endswith('.py'):
source_files.append(PythonSource(filename=filename, verbose=verbose))
# UI file support is disabled
# elif filename.endswith('.ui'):
# source_files.append(
# DesignerSource(filename=filename,
# verbose=verbose))
elif verbose:
print("Ignoring", filename)
elif source.endswith('.py'):
source_files.append(PythonSource(filename=source, verbose=verbose))
# UI file support is disabled
# elif source.endswith('.ui'):
# source_files.append(
# DesignerSource(filename=source, verbose=verbose))
else:
raise UserException("{0} must be a directory or a .py or a .ui file".format(source))
# Update each translation for each source.
for t in translations:
for s in source_files:
t.update(s)
t.write()

View File

@@ -0,0 +1,362 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
import ast
import re
import tokenize
from .source_file import SourceFile
from .translations import Context, EmbeddedComments, Message
from .user import User, UserException
class PythonSource(SourceFile, User):
""" Encapsulate a Python source file. """
# The regular expression to extract a PEP 263 encoding.
_PEP_263 = re.compile(rb'^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)')
def __init__(self, **kwargs):
""" Initialise the object. """
super().__init__(**kwargs)
# Read the source file.
self.progress("Reading {0}...".format(self.filename))
with open(self.filename, 'rb') as f:
source = f.read()
# Implement universal newlines.
source = source.replace(b'\r\n', b'\n').replace(b'\r', b'\n')
# Try and extract a PEP 263 encoding.
encoding = 'UTF-8'
for line_nr, line in enumerate(source.split(b'\n')):
if line_nr > 1:
break
match = re.match(self._PEP_263, line)
if match:
encoding = match.group(1).decode('ascii')
break
# Decode the source according to the encoding.
try:
source = source.decode(encoding)
except LookupError:
raise UserException("Unsupported encoding '{0}'".format(encoding))
# Parse the source file.
self.progress("Parsing {0}...".format(self.filename))
try:
tree = ast.parse(source, filename=self.filename)
except SyntaxError as e:
raise UserException(
"Invalid syntax at line {0} of {1}:\n{2}".format(
e.lineno, e.filename, e.text.rstrip()
)
)
# Look for translation contexts and their contents.
visitor = Visitor(self)
visitor.visit(tree)
# Read the file again as a sequence of tokens so that we see the
# comments.
with open(self.filename, 'rb') as f:
current = None
for token in tokenize.tokenize(f.readline):
if token.type == tokenize.COMMENT:
# See if it is an embedded comment.
parts = token.string.split(' ', maxsplit=1)
if len(parts) == 2:
if parts[0] == '#:':
if current is None:
current = EmbeddedComments()
current.extra_comments.append(parts[1])
elif parts[0] == '#=':
if current is None:
current = EmbeddedComments()
current.message_id = parts[1]
elif parts[0] == '#~':
parts = parts[1].split(' ', maxsplit=1)
if len(parts) == 1:
parts.append('')
if current is None:
current = EmbeddedComments()
current.extras.append(parts)
elif token.type == tokenize.NL:
continue
elif current is not None:
# Associate the embedded comment with the line containing
# this token.
line_nr = token.start[0]
# See if there is a message on that line.
for context in self.contexts:
for message in context.messages:
if message.line_nr == line_nr:
break
else:
message = None
if message is not None:
message.embedded_comments = current
break
current = None
class Visitor(ast.NodeVisitor):
""" A visitor that extracts translation contexts. """
def __init__(self, source):
""" Initialise the visitor. """
self._source = source
self._context_stack = []
super().__init__()
def visit_Call(self, node):
""" Visit a call. """
# Parse the arguments if a translation function is being called.
call_args = None
if isinstance(node.func, ast.Attribute):
name = node.func.attr
if name == 'tr':
call_args = self._parse_tr(node)
elif name == 'translate':
call_args = self._parse_translate(node)
elif isinstance(node.func, ast.Name):
name = node.func.id
if name == 'QT_TR_NOOP':
call_args = self._parse_QT_TR_NOOP(node)
elif name == 'QT_TRANSLATE_NOOP':
call_args = self._parse_QT_TRANSLATE_NOOP(node)
# Update the context if the arguments are usable.
if call_args is not None and call_args.source != '':
call_args.context.messages.append(
Message(
self._source.filename, node.lineno,
call_args.source, call_args.disambiguation,
(call_args.numerus)
)
)
self.generic_visit(node)
def visit_ClassDef(self, node):
""" Visit a class. """
try:
name = self._context_stack[-1].name + '.' + node.name
except IndexError:
name = node.name
self._context_stack.append(Context(name))
self.generic_visit(node)
context = self._context_stack.pop()
if context.messages:
self._source.contexts.append(context)
def _get_current_context(self):
""" Return the current Context object if there is one. """
return self._context_stack[-1] if self._context_stack else None
@classmethod
def _get_first_str(cls, args):
""" Get the first of a list of arguments as a str. """
# Check that there is at least one argument.
if not args:
return None
return cls._get_str(args[0])
def _get_or_create_context(self, name):
""" Return the Context object for a name, creating it if necessary. """
for context in self._source.contexts:
if context.name == name:
return context
context = Context(name)
self._source.contexts.append(context)
return context
@staticmethod
def _get_str(node, allow_none=False):
""" Return the str from a node or None if it wasn't an appropriate
node.
"""
if isinstance(node, ast.Str):
return node.s
if isinstance(node, ast.Constant):
if isinstance(node.value, str):
return node.value
if allow_none and node.value is None:
return ''
return None
def _parse_QT_TR_NOOP(self, node):
""" Parse the arguments to QT_TR_NOOP(). """
# Ignore unless there is a current context.
context = self._get_current_context()
if context is None:
return None
call_args = self._parse_noop_without_context(node.args, node.keywords)
if call_args is None:
return None
call_args.context = context
return call_args
def _parse_QT_TRANSLATE_NOOP(self, node):
""" Parse the arguments to QT_TRANSLATE_NOOP(). """
# Get the context.
name = self._get_first_str(node.args)
if name is None:
return None
call_args = self._parse_noop_without_context(node.args[1:], node.keywords)
if call_args is None:
return None
call_args.context = self._get_or_create_context(name)
return call_args
def _parse_tr(self, node):
""" Parse the arguments to tr(). """
# Ignore unless there is a current context.
context = self._get_current_context()
if context is None:
return None
call_args = self._parse_without_context(node.args, node.keywords)
if call_args is None:
return None
call_args.context = context
return call_args
def _parse_translate(self, node):
""" Parse the arguments to translate(). """
# Get the context.
name = self._get_first_str(node.args)
if name is None:
return None
call_args = self._parse_without_context(node.args[1:], node.keywords)
if call_args is None:
return None
call_args.context = self._get_or_create_context(name)
return call_args
def _parse_without_context(self, args, keywords):
""" Parse arguments for a message source and optional disambiguation
and n.
"""
# The source is required.
source = self._get_first_str(args)
if source is None:
return None
if len(args) > 1:
disambiguation = self._get_str(args[1], allow_none=True)
else:
for kw in keywords:
if kw.arg == 'disambiguation':
disambiguation = self._get_str(kw.value, allow_none=True)
break
else:
disambiguation = ''
# Ignore if the disambiguation is specified but isn't a string.
if disambiguation is None:
return None
if len(args) > 2:
numerus = True
else:
numerus = 'n' in keywords
if len(args) > 3:
return None
return CallArguments(source, disambiguation, numerus)
def _parse_noop_without_context(self, args, keywords):
""" Parse arguments for a message source. """
# There must be exactly one positional argument.
if len(args) != 1 or len(keywords) != 0:
return None
source = self._get_str(args[0])
if source is None:
return None
return CallArguments(source)
class CallArguments:
""" Encapsulate the possible arguments of a translation function. """
def __init__(self, source, disambiguation='', numerus=False):
""" Initialise the object. """
self.context = None
self.source = source
self.disambiguation = disambiguation
self.numerus = numerus

View File

@@ -0,0 +1,29 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
class SourceFile:
""" The base class for any source file that provides translation contexts.
"""
def __init__(self, filename, **kwargs):
""" Initialise the object. """
super().__init__(**kwargs)
self.filename = filename
self.contexts = []

View File

@@ -0,0 +1,390 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
import os
from xml.etree import ElementTree
from .user import User, UserException
class TranslationFile(User):
""" Encapsulate a translation file. """
def __init__(self, ts_file, no_obsolete, no_summary, **kwargs):
""" Initialise the translation file. """
super().__init__(**kwargs)
if os.path.isfile(ts_file):
self.progress("Reading {0}...".format(ts_file))
try:
self._root = ElementTree.parse(ts_file).getroot()
except Exception as e:
raise UserException(
"{}: {}: {}".format(ts_file, "invalid translation file", str(e))
)
else:
self._root = ElementTree.fromstring(_EMPTY_TS)
self._ts_file = ts_file
self._no_obsolete = no_obsolete
self._no_summary = no_summary
self._updated_contexts = {}
# Create a dict of contexts keyed by the context name and having the
# list of message elements as the value.
self._contexts = {}
# Also create a dict of existing translations so that they can be
# re-used.
self._translations = {}
context_els = []
for context_el in self._root:
if context_el.tag != 'context':
continue
context_els.append(context_el)
name = ''
message_els = []
for el in context_el:
if el.tag == 'name':
name = el.text
elif el.tag == 'message':
message_els.append(el)
if name:
self._contexts[name] = message_els
for message_el in message_els:
source_el = message_el.find('source')
if source_el is None or not source_el.text:
continue
translation_el = message_el.find('translation')
if translation_el is None or not translation_el.text:
continue
self._translations[source_el.text] = translation_el.text
# Remove the context elements but keep everything else in the root
# (probably set by Linguist).
for context_el in context_els:
self._root.remove(context_el)
# Clear the summary statistics.
self._nr_new = 0
self._nr_new_duplicates = 0
self._nr_new_using_existing_translation = 0
self._nr_existing = 0
self._nr_kept_obsolete = 0
self._nr_discarded_obsolete = 0
self._nr_discarded_untranslated = 0
# Remember all new messages so we can make the summary less confusing
# than it otherwise might be.
self._new_message_els = []
def update(self, source):
""" Update the translation file from a SourceFile object. """
self.progress("Updating {0} from {1}...".format(self._ts_file, source.filename))
for context in source.contexts:
# Get the messages that we already know about for this context.
try:
message_els = self._contexts[context.name]
except KeyError:
message_els = []
# Get the messages that have already been updated.
updated_message_els = self._get_updated_message_els(context.name)
for message in context.messages:
message_el = self._find_message(message, message_els)
if message_el is not None:
# Move the message to the updated list.
message_els.remove(message_el)
self._add_message_el(message_el, updated_message_els)
else:
# See if this is a new message. If not then we just have
# another location for an existing message.
message_el = self._find_message(message, updated_message_els)
if message_el is None:
message_el = self._make_message_el(message)
updated_message_els.append(message_el)
self.progress("Added new message '{0}'".format(self.pretty(message.source)))
self._nr_new += 1
else:
self.progress("Updated message '{0}'".format(self.pretty(message.source)))
# Don't count another copy of a new message as an existing
# one.
if message_el in self._new_message_els:
self._nr_new_duplicates += 1
else:
self._nr_existing += 1
message_el.insert(0, self._make_location_el(message))
def write(self):
""" Write the translation file back to the filesystem. """
# If we are keeping obsolete messages then add them to the updated
# message elements list.
for name, message_els in self._contexts.items():
updated_message_els = None
for message_el in message_els:
source = self.pretty(message_el.find('source').text)
translation_el = message_el.find('translation')
if translation_el is not None and translation_el.text:
if self._no_obsolete:
self.progress("Discarded obsolete message '{0}'".format(source))
self._nr_discarded_obsolete += 1
else:
translation_el.set('type', 'vanished')
if updated_message_els is None:
updated_message_els = self._get_updated_message_els(name)
self._add_message_el(message_el, updated_message_els)
self.progress("Kept obsolete message '{0}'".format(source))
self._nr_kept_obsolete += 1
else:
self.progress("Discarded untranslated message '{0}'".format(source))
self._nr_discarded_untranslated += 1
# Created the sorted context elements.
for name in sorted(self._updated_contexts.keys()):
context_el = ElementTree.Element('context')
name_el = ElementTree.Element('name')
name_el.text = name
context_el.append(name_el)
context_el.extend(self._updated_contexts[name])
self._root.append(context_el)
self.progress("Writing {0}...".format(self._ts_file))
with open(self._ts_file, 'w', encoding='utf-8', newline='\n') as f:
f.write('<?xml version="1.0" encoding="utf-8"?>\n')
f.write('<!DOCTYPE TS>\n')
# Python v3.9 and later.
if hasattr(ElementTree, 'indent'):
ElementTree.indent(self._root)
ElementTree.ElementTree(self._root).write(f, encoding='unicode')
f.write('\n')
if not self._no_summary:
self._summary()
@staticmethod
def _add_message_el(message_el, updated_message_els):
""" Add a message element to a list of updated message elements. """
# Remove all the location elements.
for location_el in message_el.findall('location'):
message_el.remove(location_el)
# Add the message to the updated list.
updated_message_els.append(message_el)
@classmethod
def _find_message(cls, message, message_els):
""" Return the message element for a message from a list. """
for message_el in message_els:
source = ''
comment = ''
extra_comment = ''
extras = []
# Extract the data from the element.
for el in message_el:
if el.tag == 'source':
source = el.text
elif el.tag == 'comment':
comment = el.text
elif el.tag == 'extracomment':
extra_comment = el.text
elif el.tag.startswith('extra-'):
extras.append([el.tag[6:], el.text])
# Compare with the message.
if source != message.source:
continue
if comment != message.comment:
continue
if extra_comment != cls._get_message_extra_comments(message):
continue
if extras != message.embedded_comments.extras:
continue
return message_el
return None
@staticmethod
def _get_message_extra_comments(message):
""" Return a message's extra comments as they appear in a .ts file. """
return ' '.join(message.embedded_comments.extra_comments)
def _get_updated_message_els(self, name):
""" Return the list of updated message elements for a context. """
try:
updated_message_els = self._updated_contexts[name]
except KeyError:
updated_message_els = []
self._updated_contexts[name] = updated_message_els
return updated_message_els
def _make_location_el(self, message):
""" Return a 'location' element. """
return ElementTree.Element(
'location',
filename=os.path.relpath(
message.filename, start=os.path.dirname(os.path.abspath(self._ts_file))
),
line=str(message.line_nr)
)
def _make_message_el(self, message):
""" Return a 'message' element. """
attrs = {}
if message.embedded_comments.message_id:
attrs['id'] = message.embedded_comments.message_id
if message.numerus:
attrs['numerus'] = 'yes'
message_el = ElementTree.Element('message', attrs)
source_el = ElementTree.Element('source')
source_el.text = message.source
message_el.append(source_el)
if message.comment:
comment_el = ElementTree.Element('comment')
comment_el.text = message.comment
message_el.append(comment_el)
if message.embedded_comments.extra_comments:
extracomment_el = ElementTree.Element('extracomment')
extracomment_el.text = self._get_message_extra_comments(message)
message_el.append(extracomment_el)
translation_el = ElementTree.Element('translation', type='unfinished')
# Try and find another message with the same source and use its
# translation if it has one.
translation = self._translations.get(message.source)
if translation:
translation_el.text = translation
self.progress("Reused existing translation for '{0}'".format(
self.pretty(message.source))
)
self._nr_new_using_existing_translation += 1
if message.numerus:
translation_el.append(ElementTree.Element('numerusform'))
message_el.append(translation_el)
for field, value in message.embedded_comments.extras:
el = ElementTree.Element('extra-' + field)
el.text = value
message_el.append(el)
self._new_message_els.append(message_el)
return message_el
def _summary(self):
""" Display the summary of changes to the user. """
summary_lines = []
# Display a line of the summary and the heading if not already done.
def summary(line):
nonlocal summary_lines
if not summary_lines:
summary_lines.append("Summary of changes to {ts}:".format(ts=self._ts_file))
summary_lines.append(" " + line)
if self._nr_new:
if self._nr_new_duplicates:
summary("{0} new messages were added (and {1} duplicates)".format(
self._nr_new, self._nr_new_duplicates))
else:
summary("{0} new messages were added".format(self._nr_new))
if self._nr_new_using_existing_translation:
summary("{0} messages reused existing translations".format(
self._nr_new_using_existing_translation))
if self._nr_existing:
summary("{0} existing messages were found".format(
self._nr_existing))
if self._nr_kept_obsolete:
summary("{0} obsolete messages were kept".format(
self._nr_kept_obsolete))
if self._nr_discarded_obsolete:
summary("{0} obsolete messages were discarded".format(
self._nr_discarded_obsolete))
if self._nr_discarded_untranslated:
summary("{0} untranslated messages were discarded".format(
self._nr_discarded_untranslated))
if not summary_lines:
summary_lines.append("{ts} was unchanged".format(ts=self._ts_file))
print(os.linesep.join(summary_lines))
# The XML of an empty .ts file. This is what a current lupdate will create
# with an empty C++ source file.
_EMPTY_TS = '''<TS version="2.1">
</TS>
'''

View File

@@ -0,0 +1,51 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
class Context:
""" Encapsulate a message context. """
def __init__(self, name):
""" Initialise the context. """
self.name = name
self.messages = []
class EmbeddedComments:
""" Encapsulate information for a translator embedded in comments. """
def __init__(self):
""" Initialise the object. """
self.message_id = ''
self.extra_comments = []
self.extras = []
class Message:
""" Encapsulate a message. """
def __init__(self, filename, line_nr, source, comment, numerus):
""" Initialise the message. """
self.filename = filename
self.line_nr = line_nr
self.source = source
self.comment = comment
self.numerus = numerus
self.embedded_comments = EmbeddedComments()

47
i18n/pylupdate6/user.py Normal file
View File

@@ -0,0 +1,47 @@
# Copyright (c) 2021 Riverbank Computing Limited <info@riverbankcomputing.com>
#
# This file is part of PyQt6.
#
# This file may be used under the terms of the GNU General Public License
# version 3.0 as published by the Free Software Foundation and appearing in
# the file LICENSE included in the packaging of this file. Please review the
# following information to ensure the GNU General Public License version 3.0
# requirements will be met: http://www.gnu.org/copyleft/gpl.html.
#
# If you do not wish to use this file under the terms of the GPL version 3.0
# then you may purchase a commercial license. For more information contact
# info@riverbankcomputing.com.
#
# This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
# WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
class UserException(Exception):
""" Encapsulate an exception ultimate caused by the user. """
pass
class User:
""" A mixin that provides methods for communicating with the user. """
def __init__(self, verbose, **kwargs):
""" Initialise the object. """
super().__init__(**kwargs)
self._verbose = verbose
@staticmethod
def pretty(text):
""" Returns a pretty-fied version of some text suitable for displaying
to the user.
"""
return text.replace('\n', '\\n')
def progress(self, message):
""" Display a progress message. """
if self._verbose:
print(message)

View File

@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
"""
Qt Base Translation File
========================
@@ -27,14 +26,6 @@ QT_TRANSLATE_NOOP("QGnomeTheme", "&Cancel")
QT_TRANSLATE_NOOP("QGnomeTheme", "&Close")
QT_TRANSLATE_NOOP("QGnomeTheme", "Close without Saving")
# QGuiApplication
# ===============
QT_TRANSLATE_NOOP("QGuiApplication", (
"Translate this string to the string 'LTR' in left-to-right languages or to "
"'RTL' in right-to-left languages (such as Hebrew and Arabic) to get proper widget layout."
))
# QPlatformTheme
# ==============

View File

@@ -1,38 +0,0 @@
SOURCES += \
i18n/qtbase.py \
nw/core/document.py \
nw/core/project.py \
nw/core/tokenizer.py \
nw/dialogs/about.py \
nw/dialogs/docmerge.py \
nw/dialogs/docsplit.py \
nw/dialogs/itemeditor.py \
nw/dialogs/preferences.py \
nw/dialogs/projload.py \
nw/dialogs/projsettings.py \
nw/dialogs/wordlist.py \
nw/gui/custom.py \
nw/gui/doceditor.py \
nw/gui/docviewer.py \
nw/gui/itemdetails.py \
nw/gui/mainmenu.py \
nw/gui/noveltree.py \
nw/gui/outline.py \
nw/gui/outlinedetails.py \
nw/gui/projdetails.py \
nw/gui/projtree.py \
nw/gui/statusbar.py \
nw/gui/theme.py \
nw/tools/build.py \
nw/tools/projwizard.py \
nw/tools/writingstats.py \
nw/common.py \
nw/constants.py \
nw/error.py \
nw/guimain.py
TRANSLATIONS += \
i18n/nw_en_US.ts \
i18n/nw_fr.ts \
i18n/nw_nb_NO.ts \
i18n/nw_pt.ts

View File

@@ -1,5 +1,4 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
novelWriter – Start Script
==========================
@@ -8,9 +7,9 @@ import os
import sys
try:
import PyQt5.QtWidgets # noqa: F401
import PyQt5.QtGui # noqa: F401
import PyQt5.QtCore # noqa: F401
import PyQt5.QtWidgets # noqa: F401
import PyQt5.QtGui # noqa: F401
import PyQt5.QtCore # noqa: F401
except Exception:
print("ERROR: Failed to load dependency PyQt5")
sys.exit(1)
@@ -18,5 +17,5 @@ except Exception:
os.curdir = os.path.abspath(os.path.dirname(__file__))
if __name__ == "__main__":
import nw
nw.main(sys.argv[1:])
import novelwriter
novelwriter.main(sys.argv[1:])

View File

@@ -1,4 +1,3 @@
# -*- coding: utf-8 -*-
"""
novelWriter – Init File
=======================
@@ -8,7 +7,7 @@ File History:
Created: 2018-09-22 [0.0.1]
This file is a part of novelWriter
Copyright 2018–2021, Veronica Berglyd Olsen
Copyright 2018–2022, Veronica Berglyd Olsen
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -28,11 +27,10 @@ import sys
import getopt
import logging
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QErrorMessage
from nw.error import exceptionHandler, logException
from nw.config import Config
from novelwriter.error import exceptionHandler, logException
from novelwriter.config import Config
##
# Version Scheme
@@ -40,31 +38,30 @@ from nw.config import Config
# Generally follows PEP 440
# Hex Version:
# - Digit 1,2 : Major Version (01-ff)
# = Digit 3,4 : Minor Version (01-ff)
# - Digit 3,4 : Minor Version (01-ff)
# - Digit 5,6 : Patch Version (01-ff)
# = Digit 7 : Release Type (a: aplha, b: beta, c: candidate, f: final)
# - Digit 7 : Release Type (a: aplha, b: beta, c: candidate, f: final)
# - Digit 8 : Release Number (0-f)
#
# Example : Full Short Description
# -------------------------------------------------------------------------
# 0x010200a0 : 1.2-alpha0 1.2a0 Can be used for the dev branch
# 0x010200a1 : 1.2-alpha1 1.2a1 First alpha release
# 0x010200b1 : 1.2-beta1 1.2b1 First beta release
# 0x010200c1 : 1.2-rc1 1.2rc1 First release candidate
# 0x010200f0 : 1.2 1.2 Final release
# 0x010200f1 : 1.2-post1 1.2.post1 Post release, but not a code patch!
# 0x010201f0 : 1.2.1 1.2.1 Patch release
# Example : Full Short Description
# --------------------------------------------------------------------
# 0x010200a0 : 1.2-alpha0 1.2a0 Use while developing next release
# 0x010200a1 : 1.2-alpha1 1.2a1 First alpha release
# 0x010200b1 : 1.2-beta1 1.2b1 First beta release
# 0x010200c1 : 1.2-rc1 1.2rc1 First release candidate
# 0x010200f0 : 1.2.0 1.2.0 Final release
# 0x010201f0 : 1.2.1 1.2.1 Patch release
##
__package__ = "nw"
__copyright__ = "Copyright 2018–2021, Veronica Berglyd Olsen"
__package__ = "novelwriter"
__copyright__ = "Copyright 2018–2022, Veronica Berglyd Olsen"
__license__ = "GPLv3"
__author__ = "Veronica Berglyd Olsen"
__maintainer__ = "Veronica Berglyd Olsen"
__email__ = "code@vkbo.net"
__version__ = "1.3"
__hexversion__ = "0x010300f0"
__date__ = "2021-05-02"
__version__ = "2.0"
__hexversion__ = "0x020000f0"
__date__ = "2022-11-28"
__status__ = "Stable"
__domain__ = "novelwriter.io"
__url__ = "https://novelwriter.io"
@@ -74,31 +71,9 @@ __helpurl__ = "https://github.com/vkbo/novelWriter/discussions"
__releaseurl__ = "https://github.com/vkbo/novelWriter/releases/latest"
__docurl__ = "https://novelwriter.readthedocs.io"
##
# Logging
# =========
# Standard used for logging levels in novelWriter:
# CRITICAL Use for errors that result in termination of the program
# ERROR Use when an action fails, but execution continues
# WARNING When something unexpected, but non-critical happens
# INFO Any useful user information like open, save, exit initiated
# ----------- SPAM Threshold : Output above should be minimal -----------------
# DEBUG Use for descriptions of main program flow
# VERBOSE Use for outputting values and program flow details
##
# Add verbose logging level
VERBOSE = 5
logging.addLevelName(VERBOSE, "VERBOSE")
def logVerbose(self, message, *args, **kws):
if self.isEnabledFor(VERBOSE):
self._log(VERBOSE, message, args, **kws)
logging.Logger.verbose = logVerbose
# Initiating logging
logger = logging.getLogger(__name__)
##
# Main Program
##
@@ -106,20 +81,20 @@ logger = logging.getLogger(__name__)
# Load the main config as a global object
CONFIG = Config()
def main(sysArgs=None):
"""Parses command line, sets up logging, and launches main GUI.
"""Parse command line, set up logging, and launch main GUI.
"""
if sysArgs is None:
sysArgs = sys.argv[1:]
# Valid Input Options
shortOpt = "hv"
longOpt = [
longOpt = [
"help",
"version",
"info",
"debug",
"verbose",
"style=",
"config=",
"data=",
@@ -127,8 +102,8 @@ def main(sysArgs=None):
]
helpMsg = (
"novelWriter {version} ({date})\n"
"{copyright}\n"
f"novelWriter {__version__} ({__date__})\n"
f"{__copyright__}\n"
"\n"
"This program is distributed in the hope that it will be useful,\n"
"but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
@@ -140,31 +115,26 @@ def main(sysArgs=None):
" -v, --version Print program version and exit.\n"
" --info Print additional runtime information.\n"
" --debug Print debug output. Includes --info.\n"
" --verbose Increase verbosity of debug output. Includes --debug.\n"
" --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n"
" --config= Alternative config file.\n"
" --data= Alternative user data path.\n"
).format(
version = __version__,
copyright = __copyright__,
date = __date__,
)
# Defaults
logLevel = logging.WARN
logLevel = logging.WARN
logFormat = "{levelname:8} {message:}"
confPath = None
dataPath = None
testMode = False
qtStyle = "Fusion"
cmdOpen = None
confPath = None
dataPath = None
testMode = False
qtStyle = "Fusion"
cmdOpen = None
# Parse Options
try:
inOpts, inRemain = getopt.getopt(sysArgs, shortOpt, longOpt)
except getopt.GetoptError as E:
except getopt.GetoptError as exc:
print(helpMsg)
print("ERROR: %s" % str(E))
print(f"ERROR: {str(exc)}")
sys.exit(2)
if len(inRemain) > 0:
@@ -181,10 +151,7 @@ def main(sysArgs=None):
logLevel = logging.INFO
elif inOpt == "--debug":
logLevel = logging.DEBUG
logFormat = "[{asctime:}] {name:>22}:{lineno:<4d} {levelname:8} {message:}"
elif inOpt == "--verbose":
logLevel = VERBOSE
logFormat = "[{asctime:}] {name:>22}:{lineno:<4d} {levelname:8} {message:}"
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
elif inOpt == "--style":
qtStyle = inArg
elif inOpt == "--config":
@@ -194,9 +161,6 @@ def main(sysArgs=None):
elif inOpt == "--testmode":
testMode = True
# Set Config Options
CONFIG.cmdOpen = cmdOpen
# Set Logging
cHandle = logging.StreamHandler()
cHandle.setFormatter(logging.Formatter(fmt=logFormat, style="{"))
@@ -205,40 +169,38 @@ def main(sysArgs=None):
pkgLogger.addHandler(cHandle)
pkgLogger.setLevel(logLevel)
logger.info("Starting novelWriter %s (%s) %s" % (
__version__, __hexversion__, __date__
))
logger.info("Starting novelWriter %s (%s) %s", __version__, __hexversion__, __date__)
# Check Packages and Versions
errorData = []
errorCode = 0
if sys.hexversion < 0x030600f0:
if sys.hexversion < 0x030700f0:
errorData.append(
"At least Python 3.6.0 is required, found %s." % CONFIG.verPyString
"At least Python 3.7 is required, found %s" % CONFIG.verPyString
)
errorCode |= 4
if CONFIG.verQtValue < 50300:
errorCode |= 0x04
if CONFIG.verQtValue < 51000:
errorData.append(
"At least Qt5 version 5.3 is required, found %s." % CONFIG.verQtString
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
)
errorCode |= 8
if CONFIG.verPyQtValue < 50300:
errorCode |= 0x08
if CONFIG.verPyQtValue < 51000:
errorData.append(
"At least PyQt5 version 5.3 is required, found %s." % CONFIG.verPyQtString
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
)
errorCode |= 16
errorCode |= 0x10
try:
import lxml # noqa: F401
import lxml # noqa: F401
except ImportError:
errorData.append("Python module 'lxml' is missing.")
errorCode |= 32
errorData.append("Python module 'lxml' is missing")
errorCode |= 0x20
if errorData:
errApp = QApplication([])
errMsg = QErrorMessage()
errMsg.resize(500, 300)
errMsg.showMessage((
errDlg = QErrorMessage()
errDlg.resize(500, 300)
errDlg.showMessage((
"<h3>A critical error has been encountered</h3>"
"<p>novelWriter cannot start due to the following issues:<p>"
"<p>&nbsp;-&nbsp;%s</p>"
@@ -246,8 +208,8 @@ def main(sysArgs=None):
) % (
"<br>&nbsp;-&nbsp;".join(errorData)
))
for errMsg in errorData:
logger.critical(errMsg)
for errLine in errorData:
logger.critical(errLine)
errApp.exec_()
sys.exit(errorCode)
@@ -260,21 +222,29 @@ def main(sysArgs=None):
bundle = NSBundle.mainBundle()
info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
info["CFBundleName"] = "novelWriter"
except ImportError:
except Exception:
logger.error("Failed to set application name")
logException()
elif CONFIG.osWindows:
try:
import ctypes
appID = f"io.novelwriter.{__version__}"
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appID)
except Exception:
logger.error("Failed to set application name")
logException()
# Import GUI (after dependency checks), and launch
from nw.guimain import GuiMain
from novelwriter.guimain import GuiMain
if testMode:
nwGUI = GuiMain()
return nwGUI
else:
nwApp = QApplication([CONFIG.appName, ("-style=%s" % qtStyle)])
nwApp = QApplication([CONFIG.appName, (f"-style={qtStyle}")])
nwApp.setApplicationName(CONFIG.appName)
nwApp.setApplicationVersion(__version__)
nwApp.setWindowIcon(QIcon(CONFIG.appIcon))
nwApp.setOrganizationDomain(__domain__)
# Connect the exception handler before making the main GUI
@@ -283,9 +253,7 @@ def main(sysArgs=None):
# Launch main GUI
CONFIG.initLocalisation(nwApp)
nwGUI = GuiMain()
if not nwGUI.hasProject:
nwGUI.showProjectLoadDialog()
nwGUI.releaseNotes()
nwGUI.postLaunchTasks(cmdOpen)
sys.exit(nwApp.exec_())

View File

@@ -0,0 +1,105 @@
{
"Synopsis": "Synopsis",
"Comment": "Comment",
"Notes": "Notes",
"0": "Zero",
"1": "One",
"2": "Two",
"3": "Three",
"4": "Four",
"5": "Five",
"6": "Six",
"7": "Seven",
"8": "Eight",
"9": "Nine",
"10": "Ten",
"11": "Eleven",
"12": "Twelve",
"13": "Thirteen",
"14": "Fourteen",
"15": "Fifteen",
"16": "Sixteen",
"17": "Seventeen",
"18": "Eighteen",
"19": "Nineteen",
"20": "Twenty",
"21": "Twenty-One",
"22": "Twenty-Two",
"23": "Twenty-Three",
"24": "Twenty-Four",
"25": "Twenty-Five",
"26": "Twenty-Six",
"27": "Twenty-Seven",
"28": "Twenty-Eight",
"29": "Twenty-Nine",
"30": "Thirty",
"31": "Thirty-One",
"32": "Thirty-Two",
"33": "Thirty-Three",
"34": "Thirty-Four",
"35": "Thirty-Five",
"36": "Thirty-Six",
"37": "Thirty-Seven",
"38": "Thirty-Eight",
"39": "Thirty-Nine",
"40": "Forty",
"41": "Forty-One",
"42": "Forty-Two",
"43": "Forty-Three",
"44": "Forty-Four",
"45": "Forty-Five",
"46": "Forty-Six",
"47": "Forty-Seven",
"48": "Forty-Eight",
"49": "Forty-Nine",
"50": "Fifty",
"51": "Fifty-One",
"52": "Fifty-Two",
"53": "Fifty-Three",
"54": "Fifty-Four",
"55": "Fifty-Five",
"56": "Fifty-Six",
"57": "Fifty-Seven",
"58": "Fifty-Eight",
"59": "Fifty-Nine",
"60": "Sixty",
"61": "Sixty-One",
"62": "Sixty-Two",
"63": "Sixty-Three",
"64": "Sixty-Four",
"65": "Sixty-Five",
"66": "Sixty-Six",
"67": "Sixty-Seven",
"68": "Sixty-Eight",
"69": "Sixty-Nine",
"70": "Seventy",
"71": "Seventy-One",
"72": "Seventy-Two",
"73": "Seventy-Three",
"74": "Seventy-Four",
"75": "Seventy-Five",
"76": "Seventy-Six",
"77": "Seventy-Seven",
"78": "Seventy-Eight",
"79": "Seventy-Nine",
"80": "Eighty",
"81": "Eighty-One",
"82": "Eighty-Two",
"83": "Eighty-Three",
"84": "Eighty-Four",
"85": "Eighty-Five",
"86": "Eighty-Six",
"87": "Eighty-Seven",
"88": "Eighty-Eight",
"89": "Eighty-Nine",
"90": "Ninety",
"91": "Ninety-One",
"92": "Ninety-Two",
"93": "Ninety-Three",
"94": "Ninety-Four",
"95": "Ninety-Five",
"96": "Ninety-Six",
"97": "Ninety-Seven",
"98": "Ninety-Eight",
"99": "Ninety-Nine"
}

View File

@@ -0,0 +1,105 @@
{
"Synopsis": "Sinopsis",
"Comment": "Comentario",
"Notes": "Notas",
"0": "Cero",
"1": "Uno",
"2": "Dos",
"3": "Tres",
"4": "Cuatro",
"5": "Cinco",
"6": "Seis",
"7": "Siete",
"8": "Ocho",
"9": "Nueve",
"10": "Diez",
"11": "Once",
"12": "Doce",
"13": "Trece",
"14": "Catorce",
"15": "Quince",
"16": "Dieciséis",
"17": "Diecisiete",
"18": "Dieciocho",
"19": "Diecinueve",
"20": "Veinte",
"21": "Veintiuno",
"22": "Veintidós",
"23": "Veintitrés",
"24": "Veinticuatro",
"25": "Veinticinco",
"26": "Veintiséis",
"27": "Veintisiete",
"28": "Veintiocho",
"29": "Veintinueve",
"30": "Treinta",
"31": "Treinta y ",
"32": "Treinta y ",
"33": "Treinta y ",
"34": "Treinta y ",
"35": "Treinta y ",
"36": "Treinta y ",
"37": "Treinta y ",
"38": "Treinta y ",
"39": "Treinta y ",
"40": "Cuarenta",
"41": "Cuarenta y uno",
"42": "Cuarenta y dos",
"43": "Cuarenta y tres",
"44": "Cuarenta y cuatro",
"45": "Cuarenta y cinco",
"46": "Cuarenta y seis",
"47": "Cuarenta y siete",
"48": "Cuarenta y ocho",
"49": "Cuarenta y nueve",
"50": "Cincuenta",
"51": "Cincuenta y uno",
"52": "Cincuenta y dos",
"53": "Cincuenta y tres",
"54": "Cincuenta y cuatro",
"55": "Cincuenta y cinco",
"56": "Cincuenta y seis",
"57": "Cincuenta y siete",
"58": "Cincuenta y ocho",
"59": "Cincuenta y nueve",
"60": "Sesenta",
"61": "Sesenta y uno",
"62": "Sesenta y dos",
"63": "Sesenta y tres",
"64": "Sesenta y cuatro",
"65": "Sesenta y cinco",
"66": "Sesenta y seis",
"67": "Sesenta y siete",
"68": "Sesenta y ocho",
"69": "Sesenta y nueve",
"70": "Setenta",
"71": "Setenta y uno",
"72": "Setenta y dos",
"73": "Setenta y tres",
"74": "Setenta y cuatro",
"75": "Setenta y cinco",
"76": "Setenta y seis",
"77": "Setenta y siete",
"78": "Setenta y ocho",
"79": "Setenta y nueve",
"80": "Ochenta",
"81": "Ochenta y uno",
"82": "Ochenta y dos",
"83": "Ochenta y tres",
"84": "Ochenta y cuatro",
"85": "Ochenta y cinco",
"86": "Ochenta y seis",
"87": "Ochenta y siete",
"88": "Ochenta y ocho",
"89": "Ochenta y nueve",
"90": "Noventa",
"91": "Noventa y uno",
"92": "Noventa y dos",
"93": "Noventa y tres",
"94": "Noventa y cuatro",
"95": "Noventa y cinco",
"96": "Noventa y seis",
"97": "Noventa y siete",
"98": "Noventa y ocho",
"99": "Noventa y nueve"
}

View File

@@ -0,0 +1,105 @@
{
"Synopsis": "Synopsis",
"Comment": "Opmerking",
"Notes": "Notities",
"0": "nul",
"1": "één",
"2": "twee",
"3": "drie",
"4": "vier",
"5": "vijf",
"6": "zes",
"7": "zeven",
"8": "acht",
"9": "negen",
"10": "tien",
"11": "elf",
"12": "twaalf",
"13": "dertien",
"14": "veertien",
"15": "vijftien",
"16": "zestien",
"17": "zeventien",
"18": "achttien",
"19": "negentien",
"20": "twintig",
"21": "eenentwintig",
"22": "tweeëntwintig",
"23": "drieëntwintig",
"24": "vierentwintig",
"25": "vijfentwintig",
"26": "zesentwintig",
"27": "zevenentwintig",
"28": "achtentwintig",
"29": "negenentwintig",
"30": "dertig",
"31": "eenendertig",
"32": "tweeëndertig",
"33": "drieëndertig",
"34": "vierendertig",
"35": "vijfendertig",
"36": "zesendertig",
"37": "zevenendertig",
"38": "achtendertig",
"39": "negenendertig",
"40": "veertig",
"41": "eenenveertig",
"42": "tweeënveertig",
"43": "drieënveertig",
"44": "vierenveertig",
"45": "vijfenveertig",
"46": "zesenveertig",
"47": "zevenenveertig",
"48": "achtenveertig",
"49": "negenenveertig",
"50": "vijftig",
"51": "eenenvijftig",
"52": "tweeënvijftig",
"53": "drieënvijftig",
"54": "vierenvijftig",
"55": "vijfenvijftig",
"56": "zesenvijftig",
"57": "zevenenvijftig",
"58": "achtenvijftig",
"59": "negenenvijftig",
"60": "zestig",
"61": "eenenzestig",
"62": "tweeënzestig",
"63": "drieënzestig",
"64": "vierenzestig",
"65": "vijfenzestig",
"66": "zesenzestig",
"67": "zevenenzestig",
"68": "achtenzestig",
"69": "negenenzestig",
"70": "zeventig",
"71": "eenenzeventig",
"72": "tweeënzeventig",
"73": "drieënzeventig",
"74": "vierenzeventig",
"75": "vijfenzeventig",
"76": "zesenzeventig",
"77": "zevenenzeventig",
"78": "achtenzeventig",
"79": "negenenzeventig",
"80": "tachtig",
"81": "eenentachtig",
"82": "tweeëntachtig",
"83": "drieëntachtig",
"84": "vierentachtig",
"85": "vijfentachtig",
"86": "zesentachtig",
"87": "zevenentachtig",
"88": "achtentachtig",
"89": "negenentachtig",
"90": "negentig",
"91": "eenennegentig",
"92": "tweeënnegentig",
"93": "drieënnegentig",
"94": "vierennegentig",
"95": "vijfennegentig",
"96": "zesennegentig",
"97": "zevenennegentig",
"98": "achtennegentig",
"99": "negenennegentig"
}

View File

@@ -0,0 +1,105 @@
{
"Synopsis": "概要",
"Comment": "注释",
"Notes": "笔记",
"0": "零",
"1": "一",
"2": "二",
"3": "三",
"4": "四",
"5": "五",
"6": "六",
"7": "七",
"8": "八",
"9": "九",
"10": "十",
"11": "十一",
"12": "十二",
"13": "十三",
"14": "十四",
"15": "十五",
"16": "十六",
"17": "十七",
"18": "十八",
"19": "十九",
"20": "二十",
"21": "二十一",
"22": "二十二",
"23": "二十三",
"24": "二十四",
"25": "二十五",
"26": "二十六",
"27": "二十七",
"28": "二十八",
"29": "二十九",
"30": "三十",
"31": "三十一",
"32": "三十二",
"33": "三十三",
"34": "三十四",
"35": "三十五",
"36": "三十六",
"37": "三十七",
"38": "三十八",
"39": "三十九",
"40": "四十",
"41": "四十一",
"42": "四十二",
"43": "四十三",
"44": "四十四",
"45": "四十五",
"46": "四十六",
"47": "四十七",
"48": "四十八",
"49": "四十九",
"50": "五十",
"51": "五十一",
"52": "五十二",
"53": "五十三",
"54": "五十四",
"55": "五十五",
"56": "五十六",
"57": "五十七",
"58": "五十八",
"59": "五十九",
"60": "六十",
"61": "六十一",
"62": "六十二",
"63": "六十三",
"64": "六十四",
"65": "六十五",
"66": "六十六",
"67": "六十七",
"68": "六十八",
"69": "六十九",
"70": "七十",
"71": "七十一",
"72": "七十二",
"73": "七十三",
"74": "七十四",
"75": "七十五",
"76": "七十六",
"77": "七十七",
"78": "七十八",
"79": "七十九",
"80": "八十",
"81": "八十一",
"82": "八十二",
"83": "八十三",
"84": "八十四",
"85": "八十五",
"86": "八十六",
"87": "八十七",
"88": "八十八",
"89": "八十九",
"90": "九十",
"91": "九十一",
"92": "九十二",
"93": "九十三",
"94": "九十四",
"95": "九十五",
"96": "九十六",
"97": "九十七",
"98": "九十八",
"99": "九十九"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

View File

Before

Width:  |  Height:  |  Size: 6.3 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

View File

@@ -0,0 +1,29 @@
# Typicons for Dark Backgrounds
This theme is based on Typicons. All files are prefixed, depending on whether they are based
directly on original Typicons, redesigned, or designed from scratch.
## Typicons Icons
The files have a `typ_` prefix. These are colourised and rescaled Typicons, but with no other
modifications.
Copyright: Stephen Hutchings
Source: https://github.com/stephenhutchings/typicons.font
License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
## Original Icons
The files have a `nw_` prefix. These are made completely from scratch for novelWriter and are not
using any design elements from Typicons.
Copyright: Veronica Berglyd Olsen
License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
## Mixed Icons
The files have a `mixed_` prefix. These are redesigned from Typicons components, modified from
Typicons, or consist of a mix of Typicons and new elements.
Copyright: Stephen Hutchings, Veronica Berglyd Olsen
License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)

View File

@@ -0,0 +1,86 @@
##
# Icons: Typicons Dark
# Source: https://github.com/stephenhutchings/typicons.font
# Credit: Stephen Hutchings
# Modified: Veronica Berglyd Olsen
# Additions: hash.svg
##
[Main]
name = Typicons Dark
description = Colourised icons for dark GUI theme based on Typicons.
author = Veronica Berglyd Olsen (adaptation)
credit = Stephen Hutchings (icon design)
url = https://github.com/stephenhutchings/typicons.font
license = CC BY-SA 4.0
licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
[Map]
add = typ_plus.svg
backward = typ_chevron-left.svg
bookmark = typ_bookmark.svg
bullet-off = typ_media-record-outline.svg
bullet-on = typ_media-record.svg
checked = mixed_input-checked.svg
close = typ_times.svg
cls_archive = typ_delete.svg
cls_character = typ_user.svg
cls_custom = typ_star.svg
cls_entity = typ_flag.svg
cls_none = typ_cancel.svg
cls_novel = typ_book.svg
cls_object = typ_key.svg
cls_plot = typ_puzzle.svg
cls_timeline = typ_calendar.svg
cls_trash = typ_trash.svg
cls_world = typ_location.svg
cross = typ_times.svg
down = typ_chevron-down.svg
edit = typ_pencil.svg
forward = typ_chevron-right.svg
maximise = typ_arrow-maximise.svg
menu = typ_th-menu.svg
minimise = typ_arrow-minimise.svg
noncheckable = mixed_input-none.svg
proj_chapter = mixed_document-chapter.svg
proj_details = typ_th-list-grey.svg
proj_document = typ_document-text.svg
proj_folder = typ_folder.svg
proj_note = mixed_document-note.svg
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
search = typ_search.svg
search_cancel = typ_cancel-grey.svg
search_case = nw_search-case.svg
search_loop = typ_arrow-repeat-grey.svg
search_preserve = nw_search-preserve.svg
search_project = typ_arrow-down-thick-grey.svg
search_regex = nw_search-regex.svg
search_replace = mixed_search-replace.svg
search_word = nw_search-word.svg
settings = typ_cog.svg
status_idle = typ_media-pause-grey.svg
status_lang = typ_globe-grey.svg
status_lines = typ_th-list-grey.svg
status_stats = typ_chart-bar-grey.svg
status_time = typ_stopwatch-grey.svg
sticky-off = typ_pin-outline.svg
sticky-on = typ_pin.svg
unchecked = mixed_input-unchecked.svg
up = typ_chevron-up.svg
view_build = typ_export.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_h1 = nw_deco-h1.svg
deco_doc_h2 = nw_deco-h2.svg
deco_doc_h3 = nw_deco-h3.svg
deco_doc_h4 = nw_deco-h4.svg
deco_doc_more = nw_deco-noveltree-more.svg

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2161">
<metadata
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2165" />
<path
id="rect12986"
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="rect935"
style="fill:#d64848;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="path2157"
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
<path
id="path902"
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
<path
id="path2157-0"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2161">
<metadata
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2165" />
<path
id="rect12986"
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="rect935"
style="fill:#ffff84;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="path2157"
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
<path
id="path902"
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
<path
id="path2157-0"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2161">
<metadata
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2165" />
<path
id="rect12986"
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="rect935"
style="fill:#6699cc;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="path2157"
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
<path
id="path902"
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
<path
id="path2157-0"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2161">
<metadata
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2165" />
<path
id="rect12986"
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="rect935"
style="fill:#999999;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="path2157"
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
<path
id="path902"
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
<path
id="path2157-0"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg2161">
<metadata
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2165" />
<path
id="rect12986"
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="rect935"
style="fill:#99cc99;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
<path
id="path2157"
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
<path
id="path902"
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
<path
id="path2157-0"
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg7536"
sodipodi:docname="mixed_edit.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview1259"
pagecolor="#505050"
bordercolor="#eeeeee"
borderopacity="1"
inkscape:pageshadow="0"
inkscape:pageopacity="0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="34.625"
inkscape:cx="8.7364621"
inkscape:cy="11.98556"
inkscape:window-width="2560"
inkscape:window-height="1330"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg7536" />
<metadata
id="metadata7542">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs7540" />
<path
id="path7534"
style="display:inline;fill:#aeaeae;fill-opacity:1;stroke-width:1.10527"
d="M 19.160156 0 C 18.73463 0 18.312122 0.160533 17.988281 0.484375 L 14.052734 4.421875 L 4.1054688 4.421875 C 3.4953635 4.421875 3 4.9141801 3 5.5253906 L 3 17.037109 L 3 18.429688 L 3 22.894531 C 3 23.505741 3.4953635 24 4.1054688 24 L 18.474609 24 C 19.084713 24 19.578125 23.505741 19.578125 22.894531 L 19.578125 18.429688 L 19.578125 17.037109 L 19.578125 9.9472656 L 23.515625 6.0117188 C 23.839466 5.6878766 24 5.2623116 24 4.8378906 C 24 4.4134695 23.839466 3.9918109 23.515625 3.6679688 L 20.332031 0.484375 C 20.008189 0.160533 19.584576 0 19.160156 0 z M 19.160156 2.4394531 L 21.560547 4.8398438 L 20.130859 6.2695312 L 17.730469 3.8691406 L 19.160156 2.4394531 z M 16.949219 4.6503906 L 19.349609 7.0507812 L 12.394531 14.005859 L 9.9941406 11.605469 L 16.949219 4.6503906 z M 5.2109375 6.6308594 L 11.841797 6.6308594 L 8.328125 10.146484 C 8.0042828 10.470327 7.7997073 11.043101 7.6328125 11.570312 C 7.4559704 12.122943 7.421875 12.737735 7.421875 13.195312 L 7.421875 16.578125 L 10.804688 16.578125 C 11.262267 16.578125 12.02928 16.467813 12.541016 16.257812 C 13.053858 16.047812 13.530778 15.874623 13.853516 15.550781 L 17.369141 12.158203 L 17.369141 17.037109 L 17.369141 18.429688 L 17.369141 21.789062 L 5.2109375 21.789062 L 5.2109375 18.429688 L 5.2109375 17.037109 L 5.2109375 6.6308594 z M 9.5644531 12.525391 L 11.505859 14.435547 L 9.6308594 14.369141 L 9.5644531 12.525391 z " />
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
version="1.2"
viewBox="0 0 24 24"
id="svg2287">
<defs
id="defs2291" />
<metadata
id="metadata2281">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
d="m17.714 22h-11.429c-2.3629 0-4.2857-1.9229-4.2857-4.2857v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h7.1429c0.79 0 1.4286 0.64 1.4286 1.4286 0 0.78857-0.63857 1.4286-1.4286 1.4286h-7.1429c-0.78857 0-1.4286 0.64143-1.4286 1.4286v11.429c0 0.78714 0.64 1.4286 1.4286 1.4286h11.429c0.78857 0 1.4286-0.64143 1.4286-1.4286v-4.2857c0-0.78857 0.63857-1.4286 1.4286-1.4286s1.4286 0.64 1.4286 1.4286v4.2857c0 2.3629-1.9229 4.2857-4.2857 4.2857z"
fill="#848484"
stroke-width="1.4286"
id="path2283" />
<path
d="m19.02 3.3503c-0.60933 0.010623-1.2003 0.31545-1.5586 0.86719l-5.0977 7.8477-2.3672-3.6445c-0.57329-0.88278-1.7442-1.1319-2.627-0.55859-0.88278 0.57329-1.1319 1.7461-0.55859 2.6289l3.9199 6.0391c0.38514 0.59307 1.0409 0.88965 1.6973 0.85352 0.03023-2.78e-4 0.05972-0.0041 0.08984-0.0059 0.0556-0.0057 0.11074-0.0088 0.16602-0.01953 0.52104-0.07621 1.0077-0.36147 1.3184-0.83984l6.6445-10.23c0.57329-0.88278 0.32419-2.0556-0.55859-2.6289-0.33104-0.21498-0.70276-0.31497-1.0684-0.30859z"
fill="#9c9"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.111"
id="path2285" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
version="1.2"
viewBox="0 0 24 24"
id="svg2931">
<defs
id="defs2935" />
<metadata
id="metadata2925">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
d="m2 17.714v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h11.429c2.3629 0 4.2857 1.9229 4.2857 4.2857v7.1429c0 0.79-0.64 1.4286-1.4286 1.4286-0.78857 0-1.4286-0.63857-1.4286-1.4286v-7.1429c0-0.78857-0.64143-1.4286-1.4286-1.4286h-11.429c-0.78714 0-1.4286 0.64-1.4286 1.4286v11.429c0 0.78857 0.64143 1.4286 1.4286 1.4286h4.2857c0.78857 0 1.4286 0.63857 1.4286 1.4286s-0.64 1.4286-1.4286 1.4286h-4.2857c-2.3629 0-4.2857-1.9229-4.2857-4.2857zm15.714 4.2857h-11.429c-2.3629 0-4.2857-1.9229-4.2857-4.2857v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h7.1429c0.79 0 1.4286 0.64 1.4286 1.4286 0 0.78857-0.63857 1.4286-1.4286 1.4286h-7.1429c-0.78857 0-1.4286 0.64143-1.4286 1.4286v11.429c0 0.78714 0.64 1.4286 1.4286 1.4286h11.429c0.78857 0 1.4286-0.64143 1.4286-1.4286v-4.2857c0-0.78857 0.63857-1.4286 1.4286-1.4286s1.4286 0.64 1.4286 1.4286v4.2857c0 2.3629-1.9229 4.2857-4.2857 4.2857z"
fill="#848484"
stroke-width="1.4286"
id="path2927" />
<rect
x="7"
y="10.1"
width="10"
height="3.8"
rx="1.9"
ry="1.9"
fill="#f99157"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.111"
id="rect2929" />
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="24"
height="24"
version="1.2"
viewBox="0 0 24 24"
id="svg3574">
<defs
id="defs3578" />
<metadata
id="metadata3568">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<path
d="m17.714 22h-11.429c-2.3629 0-4.2857-1.9229-4.2857-4.2857v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h7.1429c0.79 0 1.4286 0.64 1.4286 1.4286 0 0.78857-0.63857 1.4286-1.4286 1.4286h-7.1429c-0.78857 0-1.4286 0.64143-1.4286 1.4286v11.429c0 0.78714 0.64 1.4286 1.4286 1.4286h11.429c0.78857 0 1.4286-0.64143 1.4286-1.4286v-4.2857c0-0.78857 0.63857-1.4286 1.4286-1.4286s1.4286 0.64 1.4286 1.4286v4.2857c0 2.3629-1.9229 4.2857-4.2857 4.2857z"
fill="#848484"
stroke-width="1.4286"
id="path3570" />
<path
d="m17.99 3.3379c-0.48501 0.025418-0.96034 0.23584-1.3125 0.62695l-4.6777 5.1953-1.332-1.4785c-0.70433-0.78223-1.9014-0.84495-2.6836-0.14062-0.78223 0.70433-0.84495 1.9014-0.14062 2.6836l1.5996 1.7754-1.5977 1.7754c-0.70433 0.78223-0.64161 1.9793 0.14062 2.6836 0.78223 0.70433 1.9773 0.64161 2.6816-0.14062l1.332-1.4785 1.332 1.4785c0.70433 0.78224 1.9014 0.84495 2.6836 0.14062 0.78223-0.70433 0.84495-1.9014 0.14062-2.6836l-1.5996-1.7754 4.9453-5.4922c0.70433-0.78223 0.64161-1.9793-0.14062-2.6836-0.39112-0.35216-0.88608-0.51175-1.3711-0.48633z"
fill="#d64848"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="1.111"
id="path3572" />
</svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -36,4 +36,4 @@
id="rect19553"
d="m 2.4766359,18.937425 v 2.585938 h 2.5605469 z"
style="display:inline;opacity:0.95;fill:#0a0a0a;fill-opacity:1;stroke:none;stroke-width:1.88249397;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@@ -1,31 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg5204"
viewBox="0 0 24 24"
version="1.2"
width="4"
height="24"
width="24"
version="1.2">
viewBox="0 0 4 24"
id="svg2161"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata5210">
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs5208" />
<path
style="stroke-width:1.25;fill:#aeaeae;fill-opacity:1"
id="path5202"
d="M 19.5,9.5 H 4.5 C 3.12,9.5 2,10.62 2,12 c 0,1.38 1.12,2.5 2.5,2.5 h 15 C 20.88,14.5 22,13.38 22,12 22,10.62 20.88,9.5 19.5,9.5 Z" />
id="defs2165" />
<rect
style="fill:#848484;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
id="rect1955"
width="4"
height="22"
x="0"
y="1"
rx="2"
ry="2" />
</svg>

Before

Width:  |  Height:  |  Size: 936 B

After

Width:  |  Height:  |  Size: 902 B

View File

@@ -1,31 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
id="svg5204"
viewBox="0 0 24 24"
version="1.2"
width="4"
height="24"
width="24"
version="1.2">
viewBox="0 0 4 24"
id="svg2161"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata5210">
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs5208" />
<path
style="stroke-width:1.25;fill:#aeaeae;fill-opacity:1"
id="path5202"
d="M 19.5,9.5 H 4.5 C 3.12,9.5 2,10.62 2,12 c 0,1.38 1.12,2.5 2.5,2.5 h 15 C 20.88,14.5 22,13.38 22,12 22,10.62 20.88,9.5 19.5,9.5 Z" />
id="defs2165" />
<rect
style="fill:#99cc99;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
id="rect1955"
width="4"
height="22"
x="0"
y="1"
rx="2"
ry="2" />
</svg>

Before

Width:  |  Height:  |  Size: 936 B

After

Width:  |  Height:  |  Size: 902 B

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.2"
width="20"
height="24"
viewBox="0 0 20 24"
id="svg2161"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<metadata
id="metadata2167">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs2165" />
<rect
style="fill:#d64848;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
id="rect1955"
width="4"
height="22"
x="16"
y="1"
rx="2"
ry="2" />
</svg>

After

Width:  |  Height:  |  Size: 905 B

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