Compare commits

...

664 Commits
v1.5 ... 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
491 changed files with 72418 additions and 41368 deletions

View File

@@ -4,21 +4,23 @@ on:
push:
branches:
- main
- patch
pull_request:
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
@@ -27,5 +29,5 @@ jobs:
flake8 tests --count --select=E9,F63,F7,F82 --show-source --statistics
- name: Coding Style Violations
run: |
flake8 novelwriter --count --max-line-length=99 --ignore E221,E226,E228,E241 --show-source --statistics
flake8 tests --count --max-line-length=99 --ignore E221,E226,E228,E241 --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

@@ -4,28 +4,30 @@ on:
push:
branches:
- main
- patch
pull_request:
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 (apt)
run: |
sudo apt update
sudo apt install libenchant-dev qttools5-dev-tools
sudo apt install libenchant-dev qttools5-dev-tools aspell-en
- name: Checkout Source
uses: actions/checkout@v2
uses: actions/checkout@v3
- name: Install Dependencies (pip)
run: |
pip install --upgrade pip
@@ -38,4 +40,4 @@ jobs:
export QT_QPA_PLATFORM=offscreen
pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3

View File

@@ -4,24 +4,26 @@ on:
push:
branches:
- main
- patch
pull_request:
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
@@ -33,4 +35,4 @@ jobs:
export QT_QPA_PLATFORM=offscreen
pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3

View File

@@ -4,21 +4,23 @@ on:
push:
branches:
- main
- patch
pull_request:
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
@@ -28,4 +30,4 @@ jobs:
run: |
pytest -v --cov=novelwriter --timeout=60
- name: Upload to Codecov
uses: codecov/codecov-action@v1
uses: codecov/codecov-action@v3

1
.gitignore vendored
View File

@@ -22,6 +22,7 @@ i18n/*.qph
/novelwriter/assets/manual.pdf
*.qch
*.qhc
.~lock.*
# Python Temp
__pycache__

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

@@ -9,8 +9,7 @@ The following contributions are welcome:
* 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.
* New translations. You can read more about contributing translations
[here](https://github.com/vkbo/novelWriter/blob/main/i18n/README.md).
* 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.
@@ -76,13 +75,13 @@ style guide, but with a few exceptions. Some key points are listed below.
**Variable and Function Names**
* PEP8 allows for camelCase for consistency with existing code. The Qt library uses camelCase, so
the Python the source code does too.
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 4 spaces is allowed.
* 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.
@@ -99,14 +98,14 @@ The `setup.cfg` file in the root of this project has the following settings for
matches the above code style:
```conf
[flake8]
ignore = E221,E226,E228,E241
ignore = E133,E221,E226,E228,E241,W503
max-line-length = 99
exclude = docs/*
```
The command line equivalent, with reporting, is:
```bash
flake8 . --count --ignore E221,E226,E228,E241 --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. This is checked automatically when

View File

@@ -11,7 +11,12 @@
## 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)
@@ -30,8 +35,7 @@ The following libraries are dependencies of novelWriter:
Some of the assets bundled with novelWriter were adapted from the following sources:
* Typicons icons by Stephen Hutchings (CC BY-SA 4.0)
* Cantarell font by Dave Crossland (OPEN FONT LICENSE Version 1.1)
* 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)

View File

@@ -9,6 +9,7 @@
[![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/novelwriter.png">
@@ -22,37 +23,43 @@ synchronisation tools. All text is saved as plain text files with a meta data he
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).
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
### Ubuntu and Debian
### Linux Mint, Ubuntu and Debian
The Releases page has a `.deb` package (from version 1.5rc1 and on) that should install on both
Debian and Ubuntu.
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 [Linux](https://novelwriter.readthedocs.io/en/latest/setup_linux.html)
setup chapter in the documentation.
For more details, check the [Getting Started](https://novelwriter.readthedocs.io/en/latest/int_started.html)
section in the documentation.
### Other Operating Systems
### Windows 10+
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
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 [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.
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
@@ -63,10 +70,18 @@ existing code unless there is a very good reason for doing so.
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 read the full [Contributing Guide](https://github.com/vkbo/novelWriter/blob/main/CONTRIBUTING.md).
code, please also read the full
[Contributing Guide](https://github.com/vkbo/novelWriter/blob/main/CONTRIBUTING.md).
New translations are always welcome. Please read the additional
[instructions](https://github.com/vkbo/novelWriter/blob/main/i18n/README.md) for further details.
### 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
@@ -92,18 +107,9 @@ set of formatting that is useful for the specific task of writing novels.
| `<<` | Suffix | The paragraph is left-aligned. |
| `>>`, `<<` | Wrapped | The paragraph is centred. |
<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:
* 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.
<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.
### Export Formats
@@ -112,7 +118,7 @@ standard for office type documents that is supported by most office applications
[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.
@@ -159,6 +165,8 @@ Dependencies can generally be installed from PyPi with:
pip install -r requirements.txt
```
On Linux, the dependencies are generally available in the standard package repository.
For more details on running or installing from source, see
[Other Setup Methods](https://novelwriter.readthedocs.io/en/latest/setup_other.html).
@@ -168,13 +176,13 @@ 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 and their licenses are listed in
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

@@ -10,54 +10,52 @@
import os
import time
import sphinx_rtd_theme # noqa: F401
import datetime
# -- 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.5"
# The full version, including alpha/beta/rc tags
release = "1.5"
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"
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,
}
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>"
# -- Options for HTMLHelp Output ---------------------------------------------

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

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,53 +1,37 @@
#####################
novelWriter |release|
#####################
#############################
Documentation for novelWriter
#############################
.. only:: html
.. image:: images/novelwriter_logo.png
:align: right
:width: 48
.. image:: https://github.com/vkbo/novelWriter/actions/workflows/test_linux.yml/badge.svg?branch=main
:target: https://github.com/vkbo/novelWriter/actions
:alt: Python Tests
| **For Release:** |release|
| **Last Updated:** |today|
|
.. image:: https://codecov.io/gh/vkbo/novelWriter/branch/main/graph/badge.svg
:target: https://codecov.io/gh/vkbo/novelWriter
:alt: Code Coverage
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
.. 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 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.
.. figure:: images/screenshot_multi.png
:align: center
:width: 500
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 also the :ref:`a_storage` section for more details.
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, installed from the pip tool.
You can also download a minimal archive package of novelWriter tailored for your operating system.
This package can be extracted anywhere on your computer, and a setup script can be run to create
the necessary icons and file associations. See 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 introduces a few changes that will require you to make a few minor modifications to
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.
@@ -55,56 +39,52 @@ further details.
* 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
setup_linux
setup_mac
setup_windows
setup_other
int_overview
int_started
int_source
int_customise
.. toctree::
:maxdepth: 2
:maxdepth: 1
:caption: Using novelWriter
:hidden:
usage_breakdown
usage_interface
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: 2
:maxdepth: 1
:caption: Under the Hood
:hidden:
tech_locations
tech_storage
tech_tests
Indices and Tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

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,138 +1,66 @@
.. _a_intro:
************
Introduction
Key Features
************
novelWriter is a simple, multi-document plain text editor using a markup syntax inspired by
markdown to apply simple formatting to the text. It is designed for writing novels, so the
formatting features are limited.
.. _Snowflake : https://www.advancedfictionwriting.com/articles/snowflake-method/
The idea is to let the user focus on writing instead of spending time messing with the formatting
of headers and text. Therefore you cannot change the look of the text in the editor window.
Instead, you provide formatting tags where they're needed, like for instance which text is a
header, where you want text bolded or italicised, and what alignment you want for paragraphs. The
actual formatting is then added to the text when you run the :guilabel:`Build Novel Project` tool.
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.
A document viewer to the right of the editor can also show a renderred version of any document if
you want to inspect the result, or just want to keep a second document open for reference when
you're writing.
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.
You can split your novel project up into as many individual files as you want to. The files are
glued together when you build the project, in the top-to-bottom order in which they appear in the
project tree. Splitting the project up into chapter and scene files means you can easily reorder
them using the drag and drop feature. More details about how projects are structured is covered in
:ref:`a_struct`.
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.
In addition to novel text documents, 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*. Each note can be assigned one or
more tags (one tag is allowed for each heading in the note), and these tags can be referenced from
within the novel documents and other notes.
Below are some key features of novelWriter.
These tags make it possible to inter-link documents, and you can also 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`.
**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.
These features 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.
**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.
An overview of the supported formatting syntax is covered in :ref:`a_ui`.
**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.
**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.
.. _a_intro_design:
**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.
Design Philosophy
=================
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.
.. 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.
.. tip::
If you do need to align information in rows and columns in your notes, you can achieve this with
tabs and line breaks. The tab stop width can be specified in :guilabel:`Preferences`.
The main window does not have a 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.
A full list of shortcuts can be found in the :ref:`a_kb` 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. Some other
light and dark colour 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. An
optional third panel is a document viewer which can view any document in your project independently
of what is open in the document editor. It is not intended as a preview window, although you can
use it for this. The main purpose of the viewer is 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 those 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.
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 Build tool, 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:
@@ -140,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.

View File

@@ -1,7 +1,7 @@
.. _a_other:
.. _a_source:
*******************
Other Setup Methods
Running from Source
*******************
.. _main website: https://novelwriter.io
@@ -9,17 +9,16 @@ Other Setup Methods
.. _PyPi: https://pypi.org/project/novelWriter/
.. _Sphinx Docs: https://www.sphinx-doc.org/
This section describes various other setup methods, and instructions for building needed files
when running novelWriter from the source code directly.
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. On Linux, the scripts can also be made executable and run
without the ``python`` command. Likewise, ``pip`` may need to be replaced with ``pip3``.
``python3`` may be needed instead. Likewise, ``pip`` may need to be replaced with ``pip3``.
.. _a_other_depend:
.. _a_source_depend:
Dependencies
============
@@ -34,10 +33,10 @@ The following Python packages are needed to run novelWriter:
* ``lxml`` – needed for full XML support.
* ``PyEnchant`` – needed for 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.
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.
@@ -45,48 +44,15 @@ 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
.. code-block:: bash
pip install -r requirements.txt
.. _a_other_pip:
.. _a_source_install:
Installing from PyPi
====================
novelWriter is available on the Python Package Index, or PyPi_.
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 on
how to get the Python environment set up.
To install novelWriter from PyPi, use the following command:
.. code-block:: console
pip install novelwriter
To upgrade an existing installation, use:
.. code-block:: console
pip install --upgrade novelwriter
When installing via pip, novelWriter can be launched from command line with:
.. code-block:: console
novelWriter
Make sure the install location for pip is in your PATH variable. This is not always the case by
default.
.. _a_other_source:
Installing from Source
======================
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
@@ -96,29 +62,29 @@ This step requires that you have ``setuptools`` installed on your system. If you
installed, it can usually be installed from your distro's repository. For Debian and Ubuntu this is
achieved with:
.. code-block:: console
.. code-block:: bash
sudo apt install python3-setuptools
The package is also available from PyPi:
.. code-block:: console
.. code-block:: bash
pip install --user setuptools
With ``setuptools`` in place, novelWriter can be installed to the user space with:
.. code-block:: console
.. 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``.
running ``python setup.py help``.
.. _a_other_i18n:
.. _a_source_i18n:
Building the Translation Files
==============================
@@ -130,48 +96,56 @@ have the ``.qm`` file extension.
You can build the ``.qm`` files with:
.. code-block:: console
.. 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`.
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.
existing translation, instructions for how to contribute can be found in the ``README.md`` file
in the ``i18n`` folder of the source code.
.. _a_other_docs:
.. _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 on Debian and Ubuntu.
packages from PyPi:
* ``python3-sphinx``
* ``python3-sphinx-rtd-theme``
.. code-block:: bash
Or from PyPi:
pip install furo sphinx
.. code-block:: console
The documentation can then be built from the root folder in the source code by running:
pip install sphinx sphinx-rtd-theme
.. code-block:: bash
The documentation can then be built from the ``docs`` folder in the source code by running:
.. code-block:: console
make html
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:: console
.. code-block:: bash
python setup.py manual

250
docs/source/int_started.rst Normal file
View File

@@ -0,0 +1,250 @@
.. _a_started:
***************
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
.. _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/
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`.
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.
.. 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::
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.
AppImage Releases
-----------------
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_minimal:
Minimal Package Install
=======================
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.
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 on
how to get the Python environment set up.
To install novelWriter from PyPi, use the following command:
.. code-block:: bash
pip install novelwriter
To upgrade an existing installation, use:
.. code-block:: bash
pip install --upgrade novelwriter
When installing via pip, novelWriter can be launched from command line with:
.. code-block:: bash
novelwriter
Make sure the install location for pip is in your PATH variable. This is not always the case by
default.
.. note::
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%``.
@@ -66,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 resulting in a gap in the text.
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
@@ -78,13 +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 enable or disable
inclusion of novel documents, and the switch for :guilabel:`Include note files` will do the same
for project notes. This allows for exporting just the novel, just your notes, or both, as you wish.
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
@@ -92,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 such document in the project tree. An
included document has a checkmark after in the third column of the project tree. 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,13 +108,17 @@ The print button allows you to print the content in the preview window. You can
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:
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
@@ -122,9 +126,9 @@ Open Document Format
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
@@ -133,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 for 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

@@ -6,9 +6,10 @@ Novel Projects
New projects can be created from the :guilabel:`Project` menu by selecting :guilabel:`New Project`.
This will open the :guilabel:`New Project Wizard` that will assist you in creating a barebone
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.
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
@@ -33,27 +34,34 @@ other root folders. These other root folder types are intended for your notes on
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.
Each root folder has one or more reference keyword associated with it that can be used to reference
content in your notes 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. 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
brief 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.
@@ -82,10 +90,32 @@ applied by the application. You can use them however you want.
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::
.. 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:
@@ -97,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
@@ -162,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:
@@ -179,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. Other ways to use folders is to make a folder for each act or part.
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:
@@ -189,21 +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:`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. The two options available are :guilabel:`Novel
Document` and :guilabel:`Project Note`. These behave differently when the project is built. A
project note is never treated as part of the novel, no matter where in the project it is located.
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:
@@ -212,7 +234,7 @@ 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.
@@ -237,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 them is just for the benefit of the author. Future features may use 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
@@ -257,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`.
@@ -279,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::
@@ -300,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 backups 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.
@@ -320,12 +342,14 @@ 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 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

View File

@@ -22,21 +22,19 @@ Four levels of headings are supported, signified by the number of hashes (``#``)
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 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 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**
**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 one code explained in
:ref:`a_fmt_head`.
The novel title itself should use the special header level explained in :ref:`a_fmt_head`.
**Header Level 2**
**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
@@ -44,19 +42,23 @@ The syntax for the four basic header types, and the two special header types, is
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**
**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 export your
title text can be replaced with a scene separator or just skipped entirely when you build your
manuscript.
**Header Level 4**
**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 can filter them out of the final manuscript just like with scene titles.
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 exporting the manuscript. For
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.
@@ -66,19 +68,19 @@ The syntax for the four basic header types, and the two special header types, is
Novel Title and Front Matter
----------------------------
It is recommended that you add a document at the very top of your project 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 an exported
document, like so:
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 when exported. You can add more text to the page as you
wish, like for instance the author's name and details.
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 inserted after the title page, starting on a fresh page, you can add
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
when the project is exported.
before the text. See also :ref:`a_fmt_break`.
.. _a_struct_heads_unnum:
@@ -93,7 +95,9 @@ 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.
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
@@ -104,14 +108,13 @@ tool as well. See the :ref:`a_export` page for more details.
.. _a_struct_tags:
Tag References
==============
Note 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.
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.
@@ -121,42 +124,42 @@ below. The format of a reference line is ``@keyword: value1, [value2] ... [value
allow multiple values.
``@pov``
The point-of-view character for the current section. The target must be a note tag in the
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 the
:guilabel:`Character` type root folder.
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 the
:guilabel:`Character` type root folder. This should not include the point-of-view character.
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 the
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 the
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 the
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 the :guilabel:`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 the
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. You can add more than one Custom folder, but they all use the same reference
keyword.
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.
@@ -165,6 +168,22 @@ The highlighter may be mistaken if the index of defined tags is out of date. If
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:
@@ -175,17 +194,15 @@ All documents in the project can have a layout format set. Previously, there wer
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 the :guilabel:`Novel` root folder. You can also move them to
:guilabel:`Outtakes` and :guilabel:`Trash` of course. Project notes can be added anywhere in the
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.
Depending on which icon theme you're using, the project tree can distinguish between the different
layouts and header levels of the documents to help indicate which are project notes and which are
novel documents containing a partition, chapter, or scene. If the icon theme you've selected
doesn't show a difference, you can still see the layout description in the details panel below the
project tree.
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 automatically split the documents into separate chapter and scene documents.
You can split a document on any of the four header levels.
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,133 +0,0 @@
.. _a_setup_linux:
**************
Setup on Linux
**************
.. _GitHub: https://github.com/vkbo/novelWriter/releases
.. _main website: https://novelwriter.io
.. _PPA: https://launchpad.net/~vkbo/+archive/ubuntu/novelwriter
.. _Pre-Release PPA: https://launchpad.net/~vkbo/+archive/ubuntu/novelwriter-pre
This is a brief guide to how you can get novelWriter running on a Linux computer.
There are currently install packages available for Ubuntu and Debian. For other distros it is
recommended that you download either the full source or the minimal package and extract it to a
practical location on your system and run the ``setup.py`` script.
Debian or Ubuntu
================
A general Debian package can be downloaded from the `main website`_. This package should work on
both Debian and Ubuntu.
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:: console
sudo add-apt-repository ppa:vkbo/novelwriter
sudo apt update
sudo apt install novelwriter
Debian
------
Since this is a pure Python package, the Launchpad PPA can in principle also be used on Debian.
However, the above command will fail to add the signing key.
Instead, run the following commands to add the repository and key:
.. code-block:: console
sudo mkdir -p /usr/local/share/keyrings/
sudo gpg --no-default-keyring --keyring /usr/local/share/novelwriter-keyring.gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F19F1FCE50043114
echo "deb [signed-by=/usr/local/share/keyrings/novelwriter-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:: console
sudo apt update
sudo apt install novelwriter
Pre-Releases
------------
There is also a `Pre-Release PPA`_ available with beta releases and release candidates of
novelWriter. For Ubuntu, run the following commands:
.. code-block:: console
sudo add-apt-repository ppa:vkbo/novelwriter-pre
sudo apt update
sudo apt install novelwriter
Minimal Zip File
================
A minimal zip file is provided for Linux. You can download the latest zip file from the release
page on GitHub_, or from the `main website`_. This zip file contains only the files actually needed
to run novelWriter, and none of the additional source files for tests and documentation. You can
extract the file to wherever you want, and run the steps below.
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: Create Launcher Icons
-----------------------------
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`` files added.
To set this up, run the following from inside the novelWriter folder at the final location:
.. code-block:: console
python3 setup.py xdg-install
This will only install the launcher and icons for the current user. To set up novelWriter for all
users, run:
.. code-block:: console
sudo python3 setup.py xdg-install
Uninstalling Icons
------------------
The steps taken by the ``xdg-install`` step can be reversed by running:
.. code-block:: console
python3 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,132 +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.
.. _a_setup_win_install:
Install novelWriter
===================
The recommended way to run novelWriter on Windows is to download the "Minimal Package" option from
the `main website`_, or from the GitHub_ releases page (it's the same download file).
This is a zip file containing only the files you need to run novelWriter on Windows. In order to
make it run on your system, you must first have Python installed (Step 1). Thereafter, a script
will do the rest of the job (Step 2).
.. _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: Installing novelWriter
------------------------------
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.
.. _a_setup_win_update:
Update novelWriter
==================
To update novelWriter, simply replace the folder containing the old version with the extracted
folder of the new version you've downloaded. After this, you may need to run the
``windows_install.bat`` script again to update icons.
.. tip::
As long as your system has all the dependencies installed, you can also run novelWriter directly
from the extracted folder by double-clicking the ``novelWriter.pyw`` file.
.. _a_setup_win_uninstall:
Uninstall novelWriter
=====================
If you installed novelWriter with the method described above, you can uninstall it again by
double-clicking 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.
After that, you can simply delete the novelWriter folder.
If you want to remove Python, it has its own uninstall tool. Just keep in mind that the Python
package manager may leave some files on your system.
.. _a_setup_win_manual:
Manual Approach
===============
If you want more control of what's happening during the install process, or want to do the steps
yourself, you can run the install steps below from a command line window from inside the folder
containing either the minimal package, or the extracted full source package.
.. code-block:: console
pip install --user -r requirements.txt
pip install --user pywin32
python setup.py win-install
The first command will install the three main dependencies of novelWriter using the
`Python Package Index`_ install tool. The packages are ``PyQt5`` for the GUI, ``lxml`` for handling
XML data files, and ``PyEnchant`` for spell checking.
The second command installs a Python tool for Windows that assists the setup script in installing
icons and setting a few registry keys.
The third command runs the setup script that creates the icons for your desktop and start menu, and
adds the necessary registry keys so you can also launch a project by double-clicking a novelWriter
project file from your file explorer.
The above steps can be reverted by running:
.. code-block:: console
python setup.py win-uninstall
pip uninstall pywin32
pip uninstall -r requirements.txt
.. _Python Package Index: https://pypi.org/
Windows Installer
-----------------
There used to be a Windows installer, but this 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.
.. _installer issue: https://github.com/vkbo/novelWriter/issues/640

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

@@ -13,14 +13,14 @@ 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.
@@ -33,7 +33,7 @@ your own backup solution.
The novelWriter project folder is structured so that it can easily be added to a version control
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, 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
@@ -44,9 +44,8 @@ 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, plus an incremented number. 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,7 +55,8 @@ 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
@@ -98,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
@@ -131,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
-------------
@@ -147,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

@@ -13,12 +13,12 @@ Dependencies
The dependencies for running the tests can be installed with:
.. code-block:: console
.. 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 just ``pytest`` and ``pytest-qt``.
requirement is ``pytest`` and ``pytest-qt``.
Simple Test Run
@@ -26,7 +26,7 @@ Simple Test Run
To run the tests, you simply need to execute the following from the root of the source folder:
.. code-block:: console
.. code-block:: bash
pytest
@@ -37,7 +37,7 @@ 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:: console
.. code-block:: bash
xvfb-run pytest
@@ -49,7 +49,7 @@ Adding the flag ``-v`` to the ``pytest`` command will increase verbosity of the
You can also add coverage report generation. For instance to HTML:
.. code-block:: console
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html
@@ -58,7 +58,7 @@ 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:: console
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html -m core
@@ -69,7 +69,7 @@ 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:: console
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html -k testCore
@@ -78,7 +78,7 @@ They all start with the word "test". Then comes the group: "Core", "Base", "Dlg"
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:: console
.. code-block:: bash
xvfb-run pytest -v --cov=novelwriter --cov-report=html -k testGuiEditor

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

@@ -4,49 +4,67 @@
Formatting Your Text
********************
The editor itself 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.
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 importance. 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.
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 exporting the manuscript.
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 exporting the manuscript,
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 exporting the
manuscript.
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 exporting, this will use a different
styling and will exclude the title from for instance a Table of Contents in Libre Office.
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
@@ -81,8 +99,9 @@ Non-breaking spaces are highlighted by the syntax highlighter with an alternate
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.
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:
@@ -102,7 +121,7 @@ A minimal set of text emphasis styles are supported.
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 ``__``
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.
@@ -125,9 +144,9 @@ In addition, the following rules apply:
Comments and Synopsis
=====================
In addition to these standard markdown features, novelWriter also allows for comments in documents.
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.
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``
@@ -135,13 +154,13 @@ is not case sensitive. If it is correctly formatted, the syntax highlighter will
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
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 exporting the project to for instance generate an outline
can also be filtered separately when building the project to for instance generate an outline
document of the whole project.
.. note::
@@ -154,9 +173,10 @@ altering the colour of the word.
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.
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.
@@ -188,12 +208,12 @@ Examples:
: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."
"``> Indented text``", "The text has an increased left margin."
"``Indented text <``", "The text has an increased right margin."
"``> Indented text <``", "The text has an both margins increased."
"``>> 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
@@ -207,7 +227,7 @@ Vertical Space and Page Breaks
==============================
Adding more than one line break between paragraphs will *not* increase the space between those
paragraphs when exporting the project. To add additional space between paragraphs, add the text
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
@@ -218,3 +238,11 @@ headers of level two for novel documents, i.e. chapters, but not for project not
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 Overview
***********************
******************
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,37 +16,49 @@ 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:
**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.
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.
**Column 2**
The second column shows the word count of the document, or the sum of words of the child items
for folders. 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`.
**Column 3**
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.
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.
**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. By default, both the icon and the
label text is shown, but you can turn off the text label from :guilabel:`Preferences`. If the
text label is off, the text will instead appear in a tooltip when you hover your mouse over the
icon.
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.
The label, status or importance setting, the layout, and the include flag can all be edited using
the :guilabel:`Item Settings` dialog box. The dialog can be opened from the :guilabel:`Project`
menu, or by pressing :kbd:`F2` with the item selected.
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
@@ -57,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, or add any new ones, 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:
@@ -72,8 +88,8 @@ 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 yourself. To modify the labels, go to their respective tabs
in :guilabel:`Project Settings`.
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,
@@ -81,7 +97,7 @@ 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:
@@ -89,27 +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
reordering your documents within each root folder. Moving a document in the project tree will also
put it in a different place when you build the novel project.
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.
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`.
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`.
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 & 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.
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:
@@ -119,32 +132,39 @@ 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
markdown-like syntax for some features, and a novelWriter-specific syntax for others. The syntax
format is described in the :ref:`a_fmt` section below. 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 Settings` dialog for the currently open
document, and a search button to open the search dialog.
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 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.
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`. 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 through with the
arrow buttons in the top–left corner of the viewer. If your mouse has back and forward navigation
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.
@@ -175,7 +195,7 @@ Pressing :kbd:`Return` while in the search box will search for the next occurren
the highlighted text and move to the next result.
There are a number of settings for the search tool available as toggle switches above the search
box. They allows you to search for, in order: matched case only, whole word results only, 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
@@ -199,8 +219,6 @@ you wish.
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.
.. _Compose Key: https://en.wikipedia.org/wiki/Compose_key
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
@@ -218,24 +236,26 @@ tricky for languages that use the same symbol for these, like English does.
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.
@@ -244,10 +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_fmt_comm`.

View File

@@ -4,20 +4,71 @@
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
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 vas introduces in novelWriter version 1.5.
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.
@@ -55,13 +106,9 @@ should be used only a few places in any given project. These are as follows:
Format 1.2 Changes
==================
This project format was introduces in novelWriter version 0.10.
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.
Opening an old project automatically converts the storage format up to and including version 1.1.1.
Format 1.2 projects can be opened without loss of information up until version 1.1.1, and if the
auto-replace is not being used, can still be opened in novelWriter as of version |release|.
.. _a_prjfmt_1_1:
@@ -69,7 +116,7 @@ auto-replace is not being used, can still be opened in novelWriter as of version
Format 1.1 Changes
==================
This project format was introduces in novelWriter version 0.7.
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``.
@@ -77,9 +124,6 @@ novelWriter documents were saved in a series of folders numbered from ``data_0``
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.
Format 1.1 projects can be opened without loss of information up until version 1.1.1, and if the
auto-replace is not being used, can still be opened in novelWriter as of version |release|.
.. _a_prjfmt_1_0:
@@ -87,6 +131,3 @@ Format 1.0 Changes
==================
This is the original file format and project structure. It was in use up to version 0.6.3.
Format 1.0 projects can be opened without loss of information up until version 1.1.1, and if the
auto-replace is not being used, can still be opened in novelWriter as of version |release|.

View File

@@ -4,7 +4,8 @@
Keyboard Shortcuts
******************
Most features in novelWriter are available as 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:
@@ -16,16 +17,26 @@ The main shorcuts are as follows:
.. csv-table:: Keyboard Shortcuts
:header: "Shortcut", "Description"
:widths: 30, 70
: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 menu to correct word under cursor."
":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."
@@ -42,16 +53,16 @@ The main shorcuts are as follows:
":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:`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:`N`", "Create new document."
":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 the editor has focus, open current document for viewing."
":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."
@@ -59,41 +70,28 @@ The main shorcuts are as follows:
":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:`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. (Same as :kbd:`Shift`:kbd:`F3`.)"
":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:`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 online user manual."
":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:`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. (Same as :kbd:`Ctrl`:kbd:`Shift`:kbd:`G`.)"
":kbd:`Shift`:kbd:`F3`", "Find previous occurrence of search word in current document."
":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`.
@@ -110,7 +108,7 @@ a key or key combination for the inserted content.
.. csv-table:: Keyboard Shortcuts
:header: "Shortcut", "Description"
:widths: 40, 60
:widths: 30, 70
:class: "tight-table"
":kbd:`Ctrl`:kbd:`K`, :kbd:`−`", "Insert a short dash (en dash)."
@@ -140,6 +138,7 @@ a key or key combination for the inserted content.
":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."

View File

@@ -4,6 +4,11 @@
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
@@ -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
@@ -49,8 +54,6 @@ user-selected double quote symbols. This is to help the writer recognise which p
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
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,63 +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 `novelwriter/assets/i18n`. The latter are JSON 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.
**Note**
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.
When making a new translation, or updating an existing one, only commit the `nw_XX.ts` you have
made changes to. The `qtlupdate` command mentioned below will likely modify all `nw_XX.ts`
slightly, but please _don't_ commit those changes to the pull request.
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.
## Qt GUI Localisation
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:
# 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 `novelwriter/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` file you just added in the
`i18n` folder is needed.
**Note**
These commands require that you have the tools Qt 5 Linguist and the PyQt5 tool `pylupdate5`
installed on your system.
For Ubuntu/Debian, run:
```bash
sudo apt install qttools5-dev-tools pyqt5-dev-tools
```
### Missing QtBase Translations
The default Qt dialogs also have translations, for instance for standard buttons like "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.
"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
@@ -68,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 `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

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

@@ -26,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,40 +0,0 @@
SOURCES += \
i18n/qtbase.py \
novelwriter/core/project.py \
novelwriter/core/tokenizer.py \
novelwriter/dialogs/about.py \
novelwriter/dialogs/docmerge.py \
novelwriter/dialogs/docsplit.py \
novelwriter/dialogs/itemeditor.py \
novelwriter/dialogs/preferences.py \
novelwriter/dialogs/projload.py \
novelwriter/dialogs/projsettings.py \
novelwriter/dialogs/updates.py \
novelwriter/dialogs/wordlist.py \
novelwriter/gui/custom.py \
novelwriter/gui/doceditor.py \
novelwriter/gui/docviewer.py \
novelwriter/gui/itemdetails.py \
novelwriter/gui/mainmenu.py \
novelwriter/gui/noveltree.py \
novelwriter/gui/outline.py \
novelwriter/gui/outlinedetails.py \
novelwriter/gui/projdetails.py \
novelwriter/gui/projtree.py \
novelwriter/gui/statusbar.py \
novelwriter/gui/theme.py \
novelwriter/tools/build.py \
novelwriter/tools/projwizard.py \
novelwriter/tools/writingstats.py \
novelwriter/common.py \
novelwriter/constants.py \
novelwriter/error.py \
novelwriter/guimain.py
TRANSLATIONS += \
i18n/nw_en_US.ts \
i18n/nw_fr.ts \
i18n/nw_nb_NO.ts \
i18n/nw_pt.ts \
i18n/nw_zh_CN.ts

View File

@@ -7,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
@@ -27,7 +27,6 @@ import sys
import getopt
import logging
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QErrorMessage
from novelwriter.error import exceptionHandler, logException
@@ -44,26 +43,25 @@ from novelwriter.config import Config
# - 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 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 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__ = "novelwriter"
__copyright__ = "Copyright 2018–2021, Veronica Berglyd Olsen"
__copyright__ = "Copyright 2018–2022, Veronica Berglyd Olsen"
__license__ = "GPLv3"
__author__ = "Veronica Berglyd Olsen"
__maintainer__ = "Veronica Berglyd Olsen"
__email__ = "code@vkbo.net"
__version__ = "1.5"
__hexversion__ = "0x010500f0"
__date__ = "2021-09-19"
__version__ = "2.0"
__hexversion__ = "0x020000f0"
__date__ = "2022-11-28"
__status__ = "Stable"
__domain__ = "novelwriter.io"
__url__ = "https://novelwriter.io"
@@ -73,32 +71,6 @@ __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__)
@@ -111,19 +83,18 @@ CONFIG = Config()
def main(sysArgs=None):
"""Parse command line, set 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=",
@@ -131,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"
@@ -144,14 +115,9 @@ 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
@@ -166,9 +132,9 @@ def main(sysArgs=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:
@@ -186,9 +152,6 @@ def main(sysArgs=None):
elif inOpt == "--debug":
logLevel = logging.DEBUG
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
elif inOpt == "--verbose":
logLevel = VERBOSE
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
elif inOpt == "--style":
qtStyle = inArg
elif inOpt == "--config":
@@ -198,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="{"))
@@ -214,33 +174,33 @@ def main(sysArgs=None):
# 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
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>"
@@ -248,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)
@@ -269,7 +229,7 @@ def main(sysArgs=None):
elif CONFIG.osWindows:
try:
import ctypes
appID = "io.novelwriter.%s" % __version__
appID = f"io.novelwriter.{__version__}"
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appID)
except Exception:
logger.error("Failed to set application name")
@@ -282,10 +242,9 @@ def main(sysArgs=None):
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
@@ -294,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

@@ -1,93 +0,0 @@
Copyright (c) 2009-2010, Understanding Limited (dave@understandinglimited.com)
This Font Software is licensed under the SIL Open Font License, Version 1.1.
This license is copied below, and is also available with a FAQ at:
http://scripts.sil.org/OFL
-----------------------------------------------------------
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
-----------------------------------------------------------
PREAMBLE
The goals of the Open Font License (OFL) are to stimulate worldwide
development of collaborative font projects, to support the font creation
efforts of academic and linguistic communities, and to provide a free and
open framework in which fonts may be shared and improved in partnership
with others.
The OFL allows the licensed fonts to be used, studied, modified and
redistributed freely as long as they are not sold by themselves. The
fonts, including any derivative works, can be bundled, embedded,
redistributed and/or sold with any software provided that any reserved
names are not used by derivative works. The fonts and derivatives,
however, cannot be released under any other type of license. The
requirement for fonts to remain under this license does not apply
to any document created using the fonts or their derivatives.
DEFINITIONS
"Font Software" refers to the set of files released by the Copyright
Holder(s) under this license and clearly marked as such. This may
include source files, build scripts and documentation.
"Reserved Font Name" refers to any names specified as such after the
copyright statement(s).
"Original Version" refers to the collection of Font Software components as
distributed by the Copyright Holder(s).
"Modified Version" refers to any derivative made by adding to, deleting,
or substituting -- in part or in whole -- any of the components of the
Original Version, by changing formats or by porting the Font Software to a
new environment.
"Author" refers to any designer, engineer, programmer, technical
writer or other person who contributed to the Font Software.
PERMISSION & CONDITIONS
Permission is hereby granted, free of charge, to any person obtaining
a copy of the Font Software, to use, study, copy, merge, embed, modify,
redistribute, and sell modified and unmodified copies of the Font
Software, subject to the following conditions:
1) Neither the Font Software nor any of its individual components,
in Original or Modified Versions, may be sold by itself.
2) Original or Modified Versions of the Font Software may be bundled,
redistributed and/or sold with any software, provided that each copy
contains the above copyright notice and this license. These can be
included either as stand-alone text files, human-readable headers or
in the appropriate machine-readable metadata fields within text or
binary files as long as those fields can be easily viewed by the user.
3) No Modified Version of the Font Software may use the Reserved Font
Name(s) unless explicit written permission is granted by the corresponding
Copyright Holder. This restriction only applies to the primary font name as
presented to the users.
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
Software shall not be used to promote, endorse or advertise any
Modified Version, except to acknowledge the contribution(s) of the
Copyright Holder(s) and the Author(s) or with their explicit written
permission.
5) The Font Software, modified or unmodified, in part or in whole,
must be distributed entirely under this license, and must not be
distributed under any other license. The requirement for fonts to
remain under this license does not apply to any document created
using the Font Software.
TERMINATION
This license becomes null and void if any of the above conditions are
not met.
DISCLAIMER
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
OTHER DEALINGS IN THE FONT SOFTWARE.

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

@@ -32,7 +32,7 @@
"27": "二十七",
"28": "二十八",
"29": "二十九",
"30": "三十",
"30": "三十",
"31": "三十一",
"32": "三十二",
"33": "三十三",
@@ -101,5 +101,5 @@
"96": "九十六",
"97": "九十七",
"98": "九十八",
"99": "九十九",
"99": "九十九"
}

View File

@@ -1,6 +0,0 @@
## License
All icons in the fallback folder are modified from the Typicons theme by
Stephen Hutchings, released under CC BY-SA 4.0.
See: https://github.com/stephenhutchings/typicons.font

View File

@@ -1,31 +0,0 @@
<?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="svg5808"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata5814">
<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="defs5812" />
<path
style="stroke-width:1.25;fill:#aeaeae;fill-opacity:1"
id="path5806"
d="m 19.5,9.5 h -5 v -5 C 14.5,3.12 13.38,2 12,2 10.62,2 9.5,3.12 9.5,4.5 l 0.08875,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 L 9.58875,14.41125 9.5,19.5 c 0,1.38 1.12,2.5 2.5,2.5 1.38,0 2.5,-1.12 2.5,-2.5 V 14.41125 L 19.5,14.5 C 20.88,14.5 22,13.38 22,12 22,10.62 20.88,9.5 19.5,9.5 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg5808">
<metadata
id="metadata5814">
<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="defs5812" />
<path
d="m 19.5,9.5 h -5 v -5 C 14.5,3.12 13.38,2 12,2 10.62,2 9.5,3.12 9.5,4.5 l 0.08875,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 L 9.58875,14.41125 9.5,19.5 c 0,1.38 1.12,2.5 2.5,2.5 1.38,0 2.5,-1.12 2.5,-2.5 V 14.41125 L 19.5,14.5 C 20.88,14.5 22,13.38 22,12 22,10.62 20.88,9.5 19.5,9.5 Z"
id="path5806"
style="stroke-width:1.25;fill:#000000;fill-opacity:0.77999997" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg10879"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata10885">
<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="defs10883" />
<path
style="stroke-width:1.5;fill:#aeaeae;fill-opacity:1"
id="path10877"
d="M 21,12 C 21,9.5145 19.992,7.2645 18.3645,5.6355 16.7355,4.008 14.4855,3 12,3 9.516,3 7.266,4.008 5.637,5.6355 4.008,7.2645 3,9.5145 3,12 3,14.484 4.008,16.734 5.637,18.363 7.266,19.992 9.516,21 12,21 14.4855,21 16.7355,19.992 18.3645,18.363 19.992,16.734 21,14.484 21,12 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg10879"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata10885">
<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="defs10883" />
<path
style="stroke-width:1.5;fill:#000000;fill-opacity:0.78039217"
id="path10877"
d="M 21,12 C 21,9.5145 19.992,7.2645 18.3645,5.6355 16.7355,4.008 14.4855,3 12,3 9.516,3 7.266,4.008 5.637,5.6355 4.008,7.2645 3,9.5145 3,12 3,14.484 4.008,16.734 5.637,18.363 7.266,19.992 9.516,21 12,21 14.4855,21 16.7355,19.992 18.3645,18.363 19.992,16.734 21,14.484 21,12 Z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg896">
<metadata
id="metadata902">
<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="defs900" />
<path
d="M 19.576035,3.3487939 C 18.237131,2.6038813 16.550693,3.0884898 15.809935,4.4246248 L 10.66893,13.676495 7.726664,10.734229 c -1.0813694,-1.0813704 -2.8342677,-1.0813704 -3.9156371,0 -1.0813693,1.081369 -1.0813693,2.834267 0,3.915637 l 5.538383,5.538383 c 0.523378,0.524762 1.2295221,0.812758 1.9578191,0.812758 l 0.383533,-0.02769 c 0.859834,-0.12046 1.614439,-0.636914 2.03674,-1.397057 L 20.650482,7.1148966 C 21.39401,5.777375 20.91217,4.0923218 19.576035,3.3487939 Z"
id="path894"
style="stroke-width:1.3846;fill:#aeaeae;fill-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg896">
<metadata
id="metadata902">
<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="defs900" />
<path
d="M 19.576035,3.3487939 C 18.237131,2.6038813 16.550693,3.0884898 15.809935,4.4246248 L 10.66893,13.676495 7.726664,10.734229 c -1.0813694,-1.0813704 -2.8342677,-1.0813704 -3.9156371,0 -1.0813693,1.081369 -1.0813693,2.834267 0,3.915637 l 5.538383,5.538383 c 0.523378,0.524762 1.2295221,0.812758 1.9578191,0.812758 l 0.383533,-0.02769 c 0.859834,-0.12046 1.614439,-0.636914 2.03674,-1.397057 L 20.650482,7.1148966 C 21.39401,5.777375 20.91217,4.0923218 19.576035,3.3487939 Z"
id="path894"
style="stroke-width:1.3846;fill:#000000;fill-opacity:0.77999997" />
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg8936"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata8942">
<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="defs8940" />
<path
style="fill:#aeaeae;fill-opacity:1;stroke-width:1.30056"
id="path8934"
d="m 19.0412,4.9586375 c -1.014432,-1.0157327 -2.663535,-1.0157327 -3.677967,0 L 12.000001,8.3218703 8.6367669,4.9586375 c -1.0144323,-1.0157327 -2.663535,-1.0157327 -3.6779673,0 -1.0157327,1.0157328 -1.0157327,2.6622343 0,3.6779673 L 8.3207319,11.999838 4.9587996,15.36307 c -1.0157327,1.015733 -1.0157327,2.662235 0,3.677968 0.5072161,0.508516 1.1730998,0.762124 1.8389836,0.762124 0.6658835,0 1.3317669,-0.253608 1.8389837,-0.762124 l 3.3632341,-3.363233 3.363232,3.363233 c 0.507216,0.508516 1.173099,0.762124 1.838984,0.762124 0.665882,0 1.331765,-0.253608 1.838983,-0.762124 1.015733,-1.015733 1.015733,-2.662235 0,-3.677968 L 15.679268,11.999838 19.0412,8.6366048 c 1.015733,-1.015733 1.015733,-2.6622345 0,-3.6779673 z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg8936">
<metadata
id="metadata8942">
<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="defs8940" />
<path
d="m 19.0412,4.9586375 c -1.014432,-1.0157327 -2.663535,-1.0157327 -3.677967,0 L 12.000001,8.3218703 8.6367669,4.9586375 c -1.0144323,-1.0157327 -2.663535,-1.0157327 -3.6779673,0 -1.0157327,1.0157328 -1.0157327,2.6622343 0,3.6779673 L 8.3207319,11.999838 4.9587996,15.36307 c -1.0157327,1.015733 -1.0157327,2.662235 0,3.677968 0.5072161,0.508516 1.1730998,0.762124 1.8389836,0.762124 0.6658835,0 1.3317669,-0.253608 1.8389837,-0.762124 l 3.3632341,-3.363233 3.363232,3.363233 c 0.507216,0.508516 1.173099,0.762124 1.838984,0.762124 0.665882,0 1.331765,-0.253608 1.838983,-0.762124 1.015733,-1.015733 1.015733,-2.662235 0,-3.677968 L 15.679268,11.999838 19.0412,8.6366048 c 1.015733,-1.015733 1.015733,-2.6622345 0,-3.6779673 z"
id="path8934"
style="fill:#000000;fill-opacity:0.78;stroke-width:1.30056" />
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg14474"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata14480">
<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="defs14478" />
<path
style="fill:#aeaeae;fill-opacity:1"
id="path14472"
d="M21 6.879l-3.879-3.879c-.293-.293-.678-.439-1.061-.439-.384 0-.767.146-1.06.439l-10.939 10.939c-.293.293-.558.727-.75 1.188-.192.463-.311.959-.311 1.373v4.5h4.5c.414 0 .908-.119 1.371-.311.463-.192.896-.457 1.189-.75l10.94-10.939c.293-.293.439-.678.439-1.061 0-.384-.146-.767-.439-1.06zm-15.232 8.182l8.293-8.293 1.232 1.232-8.293 8.293-1.232-1.232zm1.732 3.939h-1.5l-1-1v-1.5c0-.077.033-.305.158-.605.01-.02 2.967 2.938 2.967 2.938-.322.134-.548.167-.625.167zm1.439-.768l-1.232-1.232 8.293-8.293 1.232 1.232-8.293 8.293zm9-9l-3.172-3.172 1.293-1.293 3.17 3.172-1.291 1.293z" />
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg14474">
<metadata
id="metadata14480">
<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="defs14478" />
<path
d="M21 6.879l-3.879-3.879c-.293-.293-.678-.439-1.061-.439-.384 0-.767.146-1.06.439l-10.939 10.939c-.293.293-.558.727-.75 1.188-.192.463-.311.959-.311 1.373v4.5h4.5c.414 0 .908-.119 1.371-.311.463-.192.896-.457 1.189-.75l10.94-10.939c.293-.293.439-.678.439-1.061 0-.384-.146-.767-.439-1.06zm-15.232 8.182l8.293-8.293 1.232 1.232-8.293 8.293-1.232-1.232zm1.732 3.939h-1.5l-1-1v-1.5c0-.077.033-.305.158-.605.01-.02 2.967 2.938 2.967 2.938-.322.134-.548.167-.625.167zm1.439-.768l-1.232-1.232 8.293-8.293 1.232 1.232-8.293 8.293zm9-9l-3.172-3.172 1.293-1.293 3.17 3.172-1.291 1.293z"
id="path14472"
style="fill:#000000;fill-opacity:0.77999997" />
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg5204">
<metadata
id="metadata5210">
<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
id="rect928"
d="M 7.75 2 C 6.7805 2 6 2.7805 6 3.75 L 6 5.5 L 4.1621094 5.5 C 3.2410844 5.5 2.5 6.2805 2.5 7.25 C 2.5 8.2195 3.2410844 9 4.1621094 9 L 6 9 L 6 15 L 4.1621094 15 C 3.2410844 15 2.5 15.7805 2.5 16.75 C 2.5 17.7195 3.2410844 18.5 4.1621094 18.5 L 6 18.5 L 6 20.25 C 6 21.2195 6.7805 22 7.75 22 C 8.7195 22 9.5 21.2195 9.5 20.25 L 9.5 18.5 L 14.5 18.5 L 14.5 20.25 C 14.5 21.2195 15.2805 22 16.25 22 C 17.2195 22 18 21.2195 18 20.25 L 18 18.5 L 19.837891 18.5 C 20.758916 18.5 21.5 17.7195 21.5 16.75 C 21.5 15.7805 20.758916 15 19.837891 15 L 18 15 L 18 9 L 19.837891 9 C 20.758916 9 21.5 8.2195 21.5 7.25 C 21.5 6.2805 20.758916 5.5 19.837891 5.5 L 18 5.5 L 18 3.75 C 18 2.7805 17.2195 2 16.25 2 C 15.2805 2 14.5 2.7805 14.5 3.75 L 14.5 5.5 L 9.5 5.5 L 9.5 3.75 C 9.5 2.7805 8.7195 2 7.75 2 z M 9.5 9 L 14.5 9 L 14.5 15 L 9.5 15 L 9.5 9 z "
style="fill:#aeaeae;fill-opacity:1;stroke:none;stroke-width:1.7544229;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,31 +0,0 @@
<?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="svg5204">
<metadata
id="metadata5210">
<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
id="rect928"
d="M 7.75 2 C 6.7805 2 6 2.7805 6 3.75 L 6 5.5 L 4.1621094 5.5 C 3.2410844 5.5 2.5 6.2805 2.5 7.25 C 2.5 8.2195 3.2410844 9 4.1621094 9 L 6 9 L 6 15 L 4.1621094 15 C 3.2410844 15 2.5 15.7805 2.5 16.75 C 2.5 17.7195 3.2410844 18.5 4.1621094 18.5 L 6 18.5 L 6 20.25 C 6 21.2195 6.7805 22 7.75 22 C 8.7195 22 9.5 21.2195 9.5 20.25 L 9.5 18.5 L 14.5 18.5 L 14.5 20.25 C 14.5 21.2195 15.2805 22 16.25 22 C 17.2195 22 18 21.2195 18 20.25 L 18 18.5 L 19.837891 18.5 C 20.758916 18.5 21.5 17.7195 21.5 16.75 C 21.5 15.7805 20.758916 15 19.837891 15 L 18 15 L 18 9 L 19.837891 9 C 20.758916 9 21.5 8.2195 21.5 7.25 C 21.5 6.2805 20.758916 5.5 19.837891 5.5 L 18 5.5 L 18 3.75 C 18 2.7805 17.2195 2 16.25 2 C 15.2805 2 14.5 2.7805 14.5 3.75 L 14.5 5.5 L 9.5 5.5 L 9.5 3.75 C 9.5 2.7805 8.7195 2 7.75 2 z M 9.5 9 L 14.5 9 L 14.5 15 L 9.5 15 L 9.5 9 z "
style="fill:#000000;fill-opacity:0.78039216;stroke:none;stroke-width:1.7544229;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,56 +0,0 @@
<?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"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg7486"
sodipodi:docname="arrow-maximise.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)">
<metadata
id="metadata7492">
<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="defs7490" />
<sodipodi:namedview
inkscape:document-rotation="0"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1370"
id="namedview7488"
showgrid="false"
inkscape:zoom="38.125"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="2560"
inkscape:window-y="1"
inkscape:window-maximized="1"
inkscape:current-layer="svg7486" />
<path
d="m 15.75,2 c -0.69125,0 -1.25,0.56 -1.25,1.25 0,0.69 0.55875,1.25 1.25,1.25 h 1.9825 l -4.11625,4.11625 c -0.48875,0.48875 -0.48875,1.27875 0,1.7675 C 13.86,10.6275 14.18,10.75 14.5,10.75 c 0.32,0 0.64,-0.1225 0.88375,-0.36625 L 19.5,6.2675 V 8.25 c 0,0.69 0.55875,1.25 1.25,1.25 C 21.44125,9.5 22,8.94 22,8.25 V 2 Z M 8.61625,13.61625 4.5,17.7325 V 15.75 C 4.5,15.06 3.94125,14.5 3.25,14.5 2.55875,14.5 2,15.06 2,15.75 v 6.24875 H 3.245 L 8.25,22 C 8.94,22 9.5,21.44 9.5,20.75 9.5,20.06 8.94125,19.5 8.25,19.5 H 6.2675 l 4.11625,-4.115 c 0.48875,-0.48875 0.48875,-1.27875 0,-1.7675 C 9.895,13.12875 9.105,13.1275 8.61625,13.6163 Z M 5.75,12 C 6.44,12 7,11.44 7,10.75 V 7 h 3.75 C 11.44125,7 12,6.44 12,5.75 12,5.06 11.44125,4.5 10.75,4.5 H 4.50125 L 4.5,10.75 C 4.5,11.44 5.05875,12 5.75,12 Z m 12.5,0 C 17.55875,12 17,12.56 17,13.25 V 17 H 13.25 C 12.55875,17 12,17.56 12,18.25 c 0,0.69 0.55875,1.25 1.25,1.25 H 19.5 V 13.25 C 19.5,12.56 18.94125,12 18.25,12 Z"
id="path7484"
style="stroke-width:1.25;fill:#aeaeae;fill-opacity:1" />
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,56 +0,0 @@
<?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"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.2"
width="24"
height="24"
viewBox="0 0 24 24"
id="svg7486"
sodipodi:docname="arrow-maximise.svg"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)">
<metadata
id="metadata7492">
<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="defs7490" />
<sodipodi:namedview
inkscape:document-rotation="0"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="2560"
inkscape:window-height="1370"
id="namedview7488"
showgrid="false"
inkscape:zoom="38.125"
inkscape:cx="12"
inkscape:cy="12"
inkscape:window-x="2560"
inkscape:window-y="1"
inkscape:window-maximized="1"
inkscape:current-layer="svg7486" />
<path
d="m 15.75,2 c -0.69125,0 -1.25,0.56 -1.25,1.25 0,0.69 0.55875,1.25 1.25,1.25 h 1.9825 l -4.11625,4.11625 c -0.48875,0.48875 -0.48875,1.27875 0,1.7675 C 13.86,10.6275 14.18,10.75 14.5,10.75 c 0.32,0 0.64,-0.1225 0.88375,-0.36625 L 19.5,6.2675 V 8.25 c 0,0.69 0.55875,1.25 1.25,1.25 C 21.44125,9.5 22,8.94 22,8.25 V 2 Z M 8.61625,13.61625 4.5,17.7325 V 15.75 C 4.5,15.06 3.94125,14.5 3.25,14.5 2.55875,14.5 2,15.06 2,15.75 v 6.24875 H 3.245 L 8.25,22 C 8.94,22 9.5,21.44 9.5,20.75 9.5,20.06 8.94125,19.5 8.25,19.5 H 6.2675 l 4.11625,-4.115 c 0.48875,-0.48875 0.48875,-1.27875 0,-1.7675 C 9.895,13.12875 9.105,13.1275 8.61625,13.6163 Z M 5.75,12 C 6.44,12 7,11.44 7,10.75 V 7 h 3.75 C 11.44125,7 12,6.44 12,5.75 12,5.06 11.44125,4.5 10.75,4.5 H 4.50125 L 4.5,10.75 C 4.5,11.44 5.05875,12 5.75,12 Z m 12.5,0 C 17.55875,12 17,12.56 17,13.25 V 17 H 13.25 C 12.55875,17 12,17.56 12,18.25 c 0,0.69 0.55875,1.25 1.25,1.25 H 19.5 V 13.25 C 19.5,12.56 18.94125,12 18.25,12 Z"
id="path7484"
style="stroke-width:1.25;fill:#000000;fill-opacity:0.77999997" />
</svg>

Before

Width:  |  Height:  |  Size: 2.5 KiB

View File

@@ -1,55 +0,0 @@
<?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"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="arrow-minimise.svg"
id="svg8816"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata8822">
<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="defs8820" />
<sodipodi:namedview
inkscape:current-layer="svg8816"
inkscape:window-maximized="1"
inkscape:window-y="1"
inkscape:window-x="2560"
inkscape:cy="12"
inkscape:cx="12"
inkscape:zoom="38.125"
showgrid="false"
id="namedview8818"
inkscape:window-height="1370"
inkscape:window-width="2560"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="fill:#aeaeae;fill-opacity:1;stroke-width:1.24999"
id="path8814"
d="m 4.6514795,13.249863 c -0.6912284,0 -1.2499609,0.560009 -1.2499609,1.25002 0,0.69001 0.5587325,1.250019 1.2499609,1.250019 h 1.8311928 l -4.1161214,4.116314 c -0.4887347,0.488758 -0.4887347,1.27877 0,1.767528 C 2.6102933,21.877498 2.9302833,22 3.2502733,22 c 0.31999,0 0.63998,-0.122502 0.8837224,-0.366256 l 4.2673662,-4.267567 v 2.133784 c 0,0.69001 0.558733,1.250019 1.249961,1.250019 0.6912291,0 1.0987161,-0.560009 1.0987161,-1.250019 v -6.250098 z m 1.0987157,-2.500039 c 0.6899784,0 1.2499609,-0.560009 1.2499609,-1.2500188 V 6.9997658 h 2.4999218 c 0.6912291,0 1.2499611,-0.5600087 1.2499611,-1.2500195 0,-0.6900108 -0.558732,-1.2500195 -1.2499611,-1.2500195 H 4.5014842 l -0.00125,5.0000784 c 0,0.6900098 0.5587325,1.2500188 1.249961,1.2500188 z m 12.4996098,2.500039 c -0.691229,0 -1.249961,0.560009 -1.249961,1.25002 v 2.500039 h -2.499922 c -0.691229,0 -1.249961,0.560008 -1.249961,1.250019 0,0.690011 0.558732,1.25002 1.249961,1.25002 h 4.999844 v -5.000078 c 0,-0.690011 -0.558733,-1.25002 -1.249961,-1.25002 z M 19.866004,2.3659435 15.749883,6.4822577 V 4.4997268 c 0,-0.6900108 -0.558733,-1.2500195 -1.249961,-1.2500195 -0.691229,0 -1.249961,0.5600087 -1.249961,1.2500195 v 6.2500972 h 6.249805 c 0.689978,0 1.249961,-0.560009 1.249961,-1.2500188 0,-0.690011 -0.558733,-1.25002 -1.249961,-1.25002 h -1.982438 l 4.116121,-4.1150641 c 0.488735,-0.4887576 0.488735,-1.2787699 0,-1.7675276 -0.488735,-0.4887576 -1.27871,-0.4900076 -1.767445,-0.00125 z" />
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,55 +0,0 @@
<?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"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
sodipodi:docname="arrow-minimise.svg"
id="svg8816"
viewBox="0 0 24 24"
height="24"
width="24"
version="1.2">
<metadata
id="metadata8822">
<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="defs8820" />
<sodipodi:namedview
inkscape:current-layer="svg8816"
inkscape:window-maximized="1"
inkscape:window-y="1"
inkscape:window-x="2560"
inkscape:cy="12"
inkscape:cx="12"
inkscape:zoom="38.125"
showgrid="false"
id="namedview8818"
inkscape:window-height="1370"
inkscape:window-width="2560"
inkscape:pageshadow="2"
inkscape:pageopacity="0"
guidetolerance="10"
gridtolerance="10"
objecttolerance="10"
borderopacity="1"
bordercolor="#666666"
pagecolor="#ffffff" />
<path
style="fill:#000000;fill-opacity:0.77999997;stroke-width:1.24999"
id="path8814"
d="m 4.6514795,13.249863 c -0.6912284,0 -1.2499609,0.560009 -1.2499609,1.25002 0,0.69001 0.5587325,1.250019 1.2499609,1.250019 h 1.8311928 l -4.1161214,4.116314 c -0.4887347,0.488758 -0.4887347,1.27877 0,1.767528 C 2.6102933,21.877498 2.9302833,22 3.2502733,22 c 0.31999,0 0.63998,-0.122502 0.8837224,-0.366256 l 4.2673662,-4.267567 v 2.133784 c 0,0.69001 0.558733,1.250019 1.249961,1.250019 0.6912291,0 1.0987161,-0.560009 1.0987161,-1.250019 v -6.250098 z m 1.0987157,-2.500039 c 0.6899784,0 1.2499609,-0.560009 1.2499609,-1.2500188 V 6.9997658 h 2.4999218 c 0.6912291,0 1.2499611,-0.5600087 1.2499611,-1.2500195 0,-0.6900108 -0.558732,-1.2500195 -1.2499611,-1.2500195 H 4.5014842 l -0.00125,5.0000784 c 0,0.6900098 0.5587325,1.2500188 1.249961,1.2500188 z m 12.4996098,2.500039 c -0.691229,0 -1.249961,0.560009 -1.249961,1.25002 v 2.500039 h -2.499922 c -0.691229,0 -1.249961,0.560008 -1.249961,1.250019 0,0.690011 0.558732,1.25002 1.249961,1.25002 h 4.999844 v -5.000078 c 0,-0.690011 -0.558733,-1.25002 -1.249961,-1.25002 z M 19.866004,2.3659435 15.749883,6.4822577 V 4.4997268 c 0,-0.6900108 -0.558733,-1.2500195 -1.249961,-1.2500195 -0.691229,0 -1.249961,0.5600087 -1.249961,1.2500195 v 6.2500972 h 6.249805 c 0.689978,0 1.249961,-0.560009 1.249961,-1.2500188 0,-0.690011 -0.558733,-1.25002 -1.249961,-1.25002 h -1.982438 l 4.116121,-4.1150641 c 0.488735,-0.4887576 0.488735,-1.2787699 0,-1.7675276 -0.488735,-0.4887576 -1.27871,-0.4900076 -1.767445,-0.00125 z" />
</svg>

Before

Width:  |  Height:  |  Size: 3.0 KiB

View File

@@ -1,207 +0,0 @@
<?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"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="svg8"
version="1.1"
viewBox="0 0 270.93333 270.93334"
height="1024"
width="1024">
<defs
id="defs2">
<linearGradient
id="linearGradient2515">
<stop
style="stop-color:#f7f7f7;stop-opacity:1"
offset="0"
id="stop2511" />
<stop
style="stop-color:#e5e5e5;stop-opacity:1"
offset="1"
id="stop2513" />
</linearGradient>
<rect
x="60.484347"
y="205.79962"
width="130.57787"
height="65.785888"
id="rect852" />
<rect
id="rect1474"
height="28.631245"
width="177.70083"
y="18.019813"
x="13.463703" />
<rect
id="rect852-7"
height="65.785889"
width="130.57787"
y="205.79962"
x="60.484348" />
<rect
id="rect1544"
height="65.785889"
width="130.57787"
y="205.79962"
x="60.484348" />
<rect
x="60.484348"
y="205.79962"
width="130.57787"
height="65.785889"
id="rect1570" />
<rect
x="13.463703"
y="18.019813"
width="177.70083"
height="28.631245"
id="rect1587" />
<filter
id="filter1444"
style="color-interpolation-filters:sRGB">
<feFlood
id="feFlood1434"
result="flood"
flood-color="rgb(0,0,0)"
flood-opacity="0.498039" />
<feComposite
id="feComposite1436"
result="composite1"
operator="in"
in2="SourceGraphic"
in="flood" />
<feGaussianBlur
id="feGaussianBlur1438"
result="blur"
stdDeviation="3"
in="composite1" />
<feOffset
id="feOffset1440"
result="offset"
dy="6"
dx="6" />
<feComposite
id="feComposite1442"
result="composite2"
operator="over"
in2="offset"
in="SourceGraphic" />
</filter>
<filter
id="filter1456"
style="color-interpolation-filters:sRGB">
<feFlood
id="feFlood1446"
result="flood"
flood-color="rgb(0,0,0)"
flood-opacity="0.498039" />
<feComposite
id="feComposite1448"
result="composite1"
operator="in"
in2="SourceGraphic"
in="flood" />
<feGaussianBlur
id="feGaussianBlur1450"
result="blur"
stdDeviation="3"
in="composite1" />
<feOffset
id="feOffset1452"
result="offset"
dy="6"
dx="6" />
<feComposite
id="feComposite1454"
result="composite2"
operator="over"
in2="offset"
in="SourceGraphic" />
</filter>
<radialGradient
xlink:href="#linearGradient2515"
id="radialGradient2517"
cx="605.42725"
cy="623.97186"
fx="605.42725"
fy="623.97186"
r="410"
gradientTransform="matrix(2.4110274,1.7617596,-0.719517,0.98463462,-776.23441,-1372.7537)"
gradientUnits="userSpaceOnUse" />
</defs>
<metadata
id="metadata5">
<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>
<g
id="layer3"
style="display:inline">
<path
clip-path="none"
transform="scale(0.26458333)"
d="m 192,22 c -44.32,0 -80,35.680002 -80,80 v 820 c 0,44.32002 35.68,80 80,80 h 640 c 44.31999,0 80,-35.67998 80,-80 V 213.44727 L 720.55469,22 Z"
style="fill:url(#radialGradient2517);fill-opacity:1;stroke:#999999;stroke-width:20;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="rect1481" />
<path
id="path1490"
style="display:inline;fill:#e0e0e0;fill-opacity:1;stroke:#999999;stroke-width:5.29167;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 241.30037,56.474215 190.64713,5.8204593 V 35.307549 c 0,11.726333 9.44034,21.166666 21.16667,21.166666 z" />
<g
aria-label=".nwx"
transform="matrix(1.7893481,0,0,1.782571,-45.41919,-191.90571)"
id="text850"
style="font-size:5.64444px;line-height:1.25;font-family:'Fira Sans';-inkscape-font-specification:'Fira Sans, Normal';letter-spacing:0px;word-spacing:0px;white-space:pre;shape-inside:url(#rect852);display:inline;fill:#666666;fill-opacity:1">
<path
d="m 63.088865,241.76928 q 0,-1.36426 0.909505,-2.27376 0.930175,-0.93018 2.480467,-0.93018 1.550291,0 2.459796,0.93018 0.909504,0.9095 0.909504,2.27376 0,1.34359 -0.909504,2.27376 -0.909505,0.9095 -2.459796,0.9095 -1.550292,0 -2.480467,-0.9095 -0.909505,-0.93017 -0.909505,-2.27376 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.3333px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#666666;fill-opacity:1"
id="path856" />
<path
d="m 84.75161,226.78312 q -2.542479,0 -3.782712,2.14974 v 15.79231 h -5.973791 v -22.36554 h 5.601721 l 0.206705,2.56314 q 2.397785,-2.97656 6.428544,-2.97656 3.162595,0 5.105627,1.88103 1.943033,1.88102 1.963703,6.55256 v 14.34537 h -5.994461 v -14.26269 q 0,-2.14973 -0.930175,-2.91454 -0.909505,-0.76482 -2.625161,-0.76482 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.3333px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#666666;fill-opacity:1"
id="path858" />
<path
d="m 126.96089,222.35963 -5.68441,22.36554 h -5.00227 l -4.25814,-14.07665 -4.23746,14.07665 h -4.9816 l -5.705078,-22.36554 h 5.767088 l 2.95589,14.22134 4.05143,-14.22134 h 4.32014 l 4.09277,14.20067 2.91455,-14.20067 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.3333px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#666666;fill-opacity:1"
id="path860" />
<path
d="m 134.77436,222.35963 3.65869,6.65592 3.76204,-6.65592 h 6.3872 l -6.36653,10.93472 6.63525,11.43082 h -6.3872 l -4.01009,-7.04866 -3.94808,7.04866 h -6.42854 l 6.63525,-11.43082 -6.36654,-10.93472 z"
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:42.3333px;font-family:Roboto;-inkscape-font-specification:'Roboto, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;fill:#666666;fill-opacity:1"
id="path862" />
</g>
</g>
<g
id="g2509"
transform="matrix(1.2371037,0,0,1.2371037,206.3182,37.341857)">
<path
transform="matrix(0.16895991,0,0,0.18329422,-134.6942,-19.491243)"
id="rect1406-1"
style="display:inline;fill:#a11212;fill-opacity:1;stroke:#7e1b1b;stroke-width:9.99999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter1444)"
d="m 145.18984,56.414257 c -44.32,0 -79.999998,35.68 -79.999998,80.000003 v 199.99805 a 279.99999,279.99999 0 0 0 0,0.002 279.99999,279.99999 0 0 0 0,0.0195 v 199.98242 c 0,44.31999 35.679998,80 79.999998,80 44.32,0 80,-35.68001 80,-80 v -200 a 120,120 0 0 1 120,-120 120,120 0 0 1 120,120 v 282.83592 h 160 V 336.41621 a 279.99999,279.99999 0 0 0 -280,-280.000003 279.99999,279.99999 0 0 0 -0.81055,0 279.99999,279.99999 0 0 0 -133.46484,34.29688 c -14.4245,-20.75262 -38.42829,-34.29883 -65.72461,-34.29883 z M 376.65078,619.64082 c -0.62174,0.0972 -1.2172,0.22317 -1.7793,0.37696 0.5621,-0.15379 1.15756,-0.27973 1.7793,-0.37696 z m -1.7793,0.37696 c -0.5621,0.15378 -1.09071,0.33534 -1.58008,0.53906 0.48937,-0.20372 1.01798,-0.38528 1.58008,-0.53906 z m 338.85742,-0.37696 c 0.62174,0.0972 1.2172,0.22317 1.7793,0.37696 -0.5621,-0.15379 -1.15756,-0.27973 -1.7793,-0.37696 z m 1.7793,0.37696 c 0.5621,0.15378 1.09071,0.33534 1.58008,0.53906 -0.48938,-0.20372 -1.01798,-0.38528 -1.58008,-0.53906 z" />
<path
transform="matrix(0.16895991,0,0,0.18329422,-134.6942,-19.491243)"
id="path897"
style="display:inline;fill:#730d0d;fill-opacity:1;stroke:#590d0d;stroke-width:9.99999;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;filter:url(#filter1456)"
d="m 465.18984,619.25215 v 0.16406 h -85.58398 c -5.49302,0 -9.91602,2.2329 -9.91602,5.00586 0,0.52294 0.15913,1.02696 0.45117,1.5 h -0.44531 c 0.30916,2.03607 1.24102,3.99791 2.81641,5.57227 l 165.59961,165.49414 c 3.92061,3.91808 10.23371,3.91812 14.15429,0 L 717.86757,631.49434 c 1.57569,-1.57463 2.50725,-3.53578 2.81641,-5.57227 h -0.44531 c 0.29216,-0.47304 0.45117,-0.97706 0.45117,-1.5 0,-2.77296 -4.42304,-5.00586 -9.91602,-5.00586 h -85.58398 v -0.16406 z" />
<rect
style="display:inline;fill:#c32222;fill-opacity:1;stroke:none;stroke-width:1.75982;stroke-linejoin:round;stroke-opacity:1"
id="rect914"
width="6.7583966"
height="82.482399"
x="-118.27303"
y="1.2969339"
rx="3.3791983"
ry="3.6658845" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 9.7 KiB

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