Compare commits
1587 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a51f0db6fa | ||
|
|
09eeb28257 | ||
|
|
956172af0c | ||
|
|
35ec8e0f12 | ||
|
|
8390615489 | ||
|
|
df499a9776 | ||
|
|
e027c4fd4c | ||
|
|
0dd9f49856 | ||
|
|
8853c73749 | ||
|
|
9cb97f6a15 | ||
|
|
f69641c0f8 | ||
|
|
1ac6e48c23 | ||
|
|
a3ad90f419 | ||
|
|
e5f04e5234 | ||
|
|
9d97e26fc1 | ||
|
|
e84b8d4d1d | ||
|
|
d0e4c9f822 | ||
|
|
378a805b02 | ||
|
|
6f465e28e2 | ||
|
|
1678cd5e96 | ||
|
|
44c6c136a2 | ||
|
|
5538b04d55 | ||
|
|
febf67179a | ||
|
|
0a5fa0d190 | ||
|
|
4fa6329eb6 | ||
|
|
3a77228aaa | ||
|
|
f26a745d0e | ||
|
|
55f7a91eaf | ||
|
|
b7373688e7 | ||
|
|
1b7814e891 | ||
|
|
039b2095f0 | ||
|
|
5c7c820fef | ||
|
|
11b6ed87d4 | ||
|
|
250a41a84a | ||
|
|
8c5ab9d626 | ||
|
|
281f878a79 | ||
|
|
77489d22cd | ||
|
|
fa880f5e2a | ||
|
|
f014d690ea | ||
|
|
7ece1123a7 | ||
|
|
ecff40dade | ||
|
|
d13e2531e8 | ||
|
|
47d2c20bfd | ||
|
|
18c3e9851e | ||
|
|
308a1649a5 | ||
|
|
09c414c991 | ||
|
|
af7b46f714 | ||
|
|
9a20eab1b2 | ||
|
|
444c168da5 | ||
|
|
61ab597499 | ||
|
|
62cf9b6184 | ||
|
|
9f4b9a4dde | ||
|
|
af991eb31b | ||
|
|
e6267f32b2 | ||
|
|
c83b36acfa | ||
|
|
b7f99ec95f | ||
|
|
1e2920641d | ||
|
|
a15d25370e | ||
|
|
7ce2fd29a6 | ||
|
|
e0ca2e7fb5 | ||
|
|
a2ea7b40e2 | ||
|
|
6560594c49 | ||
|
|
c095cc4bf0 | ||
|
|
8dbaa6bbd9 | ||
|
|
ebc6654069 | ||
|
|
992ed4f36c | ||
|
|
b0a0ca089f | ||
|
|
e52d8d9ff7 | ||
|
|
827ae921a4 | ||
|
|
e9b603d5a5 | ||
|
|
d93b3aa79f | ||
|
|
9b6ba891a4 | ||
|
|
8a9b79abd0 | ||
|
|
d4d23a140f | ||
|
|
e7ce13f647 | ||
|
|
74d71f24ca | ||
|
|
a1213f1e84 | ||
|
|
36cf5c1d76 | ||
|
|
fd85770d4d | ||
|
|
116ebd8243 | ||
|
|
612034f6be | ||
|
|
b05028e3c9 | ||
|
|
495209cd1a | ||
|
|
402cb09bb6 | ||
|
|
dbfda1e680 | ||
|
|
b03b723d25 | ||
|
|
5a8e8b2221 | ||
|
|
6a664037cf | ||
|
|
f556fde848 | ||
|
|
bbc5be0075 | ||
|
|
b587ab638c | ||
|
|
a1ddc6ce1d | ||
|
|
b46ad86c31 | ||
|
|
15fec91358 | ||
|
|
e2f3a44d96 | ||
|
|
eac7d9b9ee | ||
|
|
0c7fdc7013 | ||
|
|
03e173634f | ||
|
|
cb755ba820 | ||
|
|
8721d53ab2 | ||
|
|
47b57172eb | ||
|
|
9d3291aba6 | ||
|
|
6792c11a71 | ||
|
|
6f5539de90 | ||
|
|
9500c3bdb2 | ||
|
|
5999e72592 | ||
|
|
0b44cf9c0a | ||
|
|
f5a3280565 | ||
|
|
ee79d3d6d6 | ||
|
|
b024c0996d | ||
|
|
262a6c36b7 | ||
|
|
26f7bb4b32 | ||
|
|
42f2bf3628 | ||
|
|
6f6fe876e2 | ||
|
|
615ee2958a | ||
|
|
a75424e44b | ||
|
|
76a1421fde | ||
|
|
972ed25a8c | ||
|
|
21ab4e58f9 | ||
|
|
82b34d9d2c | ||
|
|
9cdf840d12 | ||
|
|
72cc0cf0aa | ||
|
|
c6d3f680cc | ||
|
|
8b4dac4e13 | ||
|
|
783a849e09 | ||
|
|
407e7fa69e | ||
|
|
2b8d51035d | ||
|
|
2e590b742f | ||
|
|
bd81ea0880 | ||
|
|
dfd9e15951 | ||
|
|
96b011cf70 | ||
|
|
3eee8442a7 | ||
|
|
da4f4b0801 | ||
|
|
717d516f6a | ||
|
|
e85bd56f60 | ||
|
|
a2f92c1223 | ||
|
|
9dd1a60629 | ||
|
|
5abc9784f1 | ||
|
|
f1100d4475 | ||
|
|
494b94430c | ||
|
|
5b7f2b2b55 | ||
|
|
f41db97860 | ||
|
|
0cfaf4f021 | ||
|
|
6fd7107675 | ||
|
|
a88a2f5b40 | ||
|
|
13b9e5a434 | ||
|
|
a760aff826 | ||
|
|
3a161e90f9 | ||
|
|
522acc479b | ||
|
|
cc2ef85afd | ||
|
|
9d283d2eae | ||
|
|
aeef8734b8 | ||
|
|
192806a46d | ||
|
|
e887ec6991 | ||
|
|
ea80fd3c71 | ||
|
|
6d1734b655 | ||
|
|
72f06620e9 | ||
|
|
aa963dea3d | ||
|
|
16e7df0526 | ||
|
|
4d5c1b2455 | ||
|
|
c1988bcc17 | ||
|
|
1784d9ce28 | ||
|
|
15fd4c51df | ||
|
|
fd92f1c588 | ||
|
|
80496ab1ed | ||
|
|
dbade05e46 | ||
|
|
e80536405e | ||
|
|
ea59379479 | ||
|
|
18878dd19b | ||
|
|
309a58cb18 | ||
|
|
64fbc2f4e9 | ||
|
|
dcb473137b | ||
|
|
3a90ee2b0d | ||
|
|
dc401278fb | ||
|
|
33eb3efb11 | ||
|
|
6d15bc5f14 | ||
|
|
04c4b9eda5 | ||
|
|
4a9ea459fa | ||
|
|
9b1c3fece2 | ||
|
|
f76fc95494 | ||
|
|
42f5ea205f | ||
|
|
28916afcce | ||
|
|
34193021e8 | ||
|
|
c7999831c9 | ||
|
|
8d7ebefa65 | ||
|
|
88183cdc39 | ||
|
|
52ede26f3d | ||
|
|
e1ecd3cd27 | ||
|
|
25c4330fd0 | ||
|
|
80ae810e1b | ||
|
|
719c2aada2 | ||
|
|
f2e3d95e98 | ||
|
|
c22354fe4d | ||
|
|
4862ac3857 | ||
|
|
e93e125a46 | ||
|
|
dc0f9abdbc | ||
|
|
455a065285 | ||
|
|
8b3ec4376d | ||
|
|
b69e4e91ac | ||
|
|
a5cbaa7f8c | ||
|
|
b0095b266d | ||
|
|
7b04d57605 | ||
|
|
2ee6adcf35 | ||
|
|
e89f004532 | ||
|
|
624787994a | ||
|
|
550896e795 | ||
|
|
2f926301e6 | ||
|
|
34dbf3557c | ||
|
|
ae856dda6a | ||
|
|
871cef8af9 | ||
|
|
6b16b7c3b7 | ||
|
|
93a79f3605 | ||
|
|
5ae96e4d44 | ||
|
|
85e48eb56a | ||
|
|
58f8f98c6f | ||
|
|
1da92e997c | ||
|
|
734f3d57bf | ||
|
|
6a6742275f | ||
|
|
815c0f1125 | ||
|
|
cfe11f7b54 | ||
|
|
efb7d12e1d | ||
|
|
caf8a75bbc | ||
|
|
e52f0a9e16 | ||
|
|
8775b360d8 | ||
|
|
54fea1d28e | ||
|
|
c40ace1290 | ||
|
|
f34d95edaa | ||
|
|
ac05dbc55b | ||
|
|
0f72c45fbc | ||
|
|
da820871fd | ||
|
|
1aec49f852 | ||
|
|
33b95b60e3 | ||
|
|
d232b22501 | ||
|
|
6c06845ed5 | ||
|
|
5f4a171dff | ||
|
|
38df693987 | ||
|
|
e24573f644 | ||
|
|
8fe25d4b43 | ||
|
|
5a4b7b7264 | ||
|
|
9b5b00fd2d | ||
|
|
d59c408e44 | ||
|
|
95b6949da8 | ||
|
|
b0e2dbf06e | ||
|
|
0aadb29ac7 | ||
|
|
559a1791e1 | ||
|
|
f5dcad8725 | ||
|
|
97724054ec | ||
|
|
30661130ca | ||
|
|
9c16b58325 | ||
|
|
aadc576d0a | ||
|
|
84db544704 | ||
|
|
49bce76c0d | ||
|
|
20945cfc0d | ||
|
|
05ad483f06 | ||
|
|
98e014f834 | ||
|
|
e316270b57 | ||
|
|
4fe34640f5 | ||
|
|
ca613e83e8 | ||
|
|
72e1180c84 | ||
|
|
a582d231e8 | ||
|
|
11ff9567c0 | ||
|
|
64c07e8910 | ||
|
|
6f257d9b27 | ||
|
|
928c25e742 | ||
|
|
3c49ccff53 | ||
|
|
5aa5640baa | ||
|
|
91961111d8 | ||
|
|
5fcfbf1c75 | ||
|
|
77ec0a9eed | ||
|
|
bbbad2b170 | ||
|
|
505385b060 | ||
|
|
07a5def0a9 | ||
|
|
91e6b0671e | ||
|
|
234a527f25 | ||
|
|
845a15229d | ||
|
|
ab482c4ede | ||
|
|
d619f4a012 | ||
|
|
84af87b155 | ||
|
|
3f4d85dcad | ||
|
|
02976c5f12 | ||
|
|
049190739f | ||
|
|
e11137a90f | ||
|
|
28ae292703 | ||
|
|
0e94b1ca88 | ||
|
|
dbf672224f | ||
|
|
1001140eec | ||
|
|
038c66258b | ||
|
|
bb8b0555ae | ||
|
|
1421ed3bf4 | ||
|
|
31a5761ba0 | ||
|
|
baafd5f83c | ||
|
|
4f44374f48 | ||
|
|
7403736ae1 | ||
|
|
9a0bda9884 | ||
|
|
84104f2267 | ||
|
|
5d6778be57 | ||
|
|
1f05e90266 | ||
|
|
3a7c3cec3f | ||
|
|
e8f7df9cb4 | ||
|
|
9b5d2b2c2b | ||
|
|
87f20622f9 | ||
|
|
417758a29a | ||
|
|
07c93bcb7d | ||
|
|
b96c1e9f09 | ||
|
|
747a1a212c | ||
|
|
428dce3e6e | ||
|
|
02dc7f5fe0 | ||
|
|
d9a59bccda | ||
|
|
23b73dd936 | ||
|
|
0859c14581 | ||
|
|
2bda53e971 | ||
|
|
0f3d598f8d | ||
|
|
e1c3a12d07 | ||
|
|
43bb5aab5c | ||
|
|
b80f5ba057 | ||
|
|
9c381c40a5 | ||
|
|
47c39e68b7 | ||
|
|
a24d37ffa4 | ||
|
|
03db815723 | ||
|
|
1aeb66d9af | ||
|
|
3efbc14d97 | ||
|
|
534614d037 | ||
|
|
479478490e | ||
|
|
f4eed2bf2c | ||
|
|
ba51fb4c46 | ||
|
|
bdc7e4dc10 | ||
|
|
25dec2ace8 | ||
|
|
7d99d6c40b | ||
|
|
ba88160deb | ||
|
|
08289d0675 | ||
|
|
a64c36221c | ||
|
|
bf2229538e | ||
|
|
922d66ff53 | ||
|
|
cfb6059027 | ||
|
|
c04715c9ef | ||
|
|
d82c739f01 | ||
|
|
7267490645 | ||
|
|
5adf21e87a | ||
|
|
e6b2732281 | ||
|
|
9c4b3dbc08 | ||
|
|
3d3ac0d05d | ||
|
|
9434fe2cd7 | ||
|
|
af55e57ba3 | ||
|
|
90fbfc30ad | ||
|
|
c48d415a9d | ||
|
|
874f4f7198 | ||
|
|
19c583f615 | ||
|
|
76e9c822c9 | ||
|
|
73b8e3e0fb | ||
|
|
5cba10151a | ||
|
|
01b66bc62e | ||
|
|
f14398392a | ||
|
|
3a7ed1f2f3 | ||
|
|
802d1b0132 | ||
|
|
d4878525ac | ||
|
|
e98e758b5f | ||
|
|
672e3680b7 | ||
|
|
53c1d1b7ee | ||
|
|
721d67ac0a | ||
|
|
2407b61830 | ||
|
|
f08345b15e | ||
|
|
20da33348c | ||
|
|
7e82461aba | ||
|
|
fcfe7507d6 | ||
|
|
90b50fe180 | ||
|
|
3ddbfb061b | ||
|
|
93194626c7 | ||
|
|
c23a1d224d | ||
|
|
2178391bcd | ||
|
|
c917fc9c9c | ||
|
|
15c54224e0 | ||
|
|
cc7ae316ad | ||
|
|
bf49b1ee50 | ||
|
|
bb2c78c0f6 | ||
|
|
069e3baf67 | ||
|
|
b30a4d26ae | ||
|
|
338d158bae | ||
|
|
895beb6aa1 | ||
|
|
67aff2550b | ||
|
|
82a5da391f | ||
|
|
3dc4d1443f | ||
|
|
073a9acfb3 | ||
|
|
b363259a72 | ||
|
|
211ab290d0 | ||
|
|
f9df358c4f | ||
|
|
0d01e108f1 | ||
|
|
8c4ecaeee2 | ||
|
|
4fa814a2fa | ||
|
|
bb85232ea7 | ||
|
|
469275eea5 | ||
|
|
ba0ce33cfc | ||
|
|
50f299171a | ||
|
|
5c04e79486 | ||
|
|
fb14e978cd | ||
|
|
3a455fa1a7 | ||
|
|
ad50ad9b0d | ||
|
|
7d7c2dba26 | ||
|
|
0b95804535 | ||
|
|
6ccbb358b9 | ||
|
|
cff464392a | ||
|
|
3a061eec3f | ||
|
|
538b722bdf | ||
|
|
ea61db9591 | ||
|
|
49ace054bd | ||
|
|
8040441757 | ||
|
|
88b2d61cec | ||
|
|
52683d5a21 | ||
|
|
b3eb276437 | ||
|
|
ed5c52859d | ||
|
|
c58868ed39 | ||
|
|
5a5a64e3a2 | ||
|
|
2cc8be5776 | ||
|
|
8d427f40c6 | ||
|
|
946656f8c5 | ||
|
|
37c3bb8cd2 | ||
|
|
6058423970 | ||
|
|
d162be3543 | ||
|
|
985179bbb9 | ||
|
|
db01d85f2e | ||
|
|
94068e777a | ||
|
|
0181bebd70 | ||
|
|
b8d557646a | ||
|
|
025463a28e | ||
|
|
f0bef18b63 | ||
|
|
77746f712f | ||
|
|
ad438e128a | ||
|
|
af39fb98a1 | ||
|
|
ef270bc069 | ||
|
|
0909bf7c36 | ||
|
|
5a6ef5efd3 | ||
|
|
272e7f6e24 | ||
|
|
46bb8e5bcc | ||
|
|
12a7ec7fe3 | ||
|
|
d07f5dc520 | ||
|
|
b88cdb7677 | ||
|
|
669eabc7e8 | ||
|
|
24112f6d8d | ||
|
|
3ff5dfce33 | ||
|
|
2f81aef0a3 | ||
|
|
29739ab210 | ||
|
|
4d9b94cfe6 | ||
|
|
85f63721e0 | ||
|
|
92924b3288 | ||
|
|
88976d6800 | ||
|
|
2873336dce | ||
|
|
de07546e3f | ||
|
|
ac14888e2a | ||
|
|
c28ac37df1 | ||
|
|
63068f1018 | ||
|
|
22099c1b56 | ||
|
|
eed59a96be | ||
|
|
865acfd7e9 | ||
|
|
d1b32f1ba1 | ||
|
|
77e50a6cee | ||
|
|
347d34bf83 | ||
|
|
94ba7a2f94 | ||
|
|
01be8be44f | ||
|
|
d584f57a3b | ||
|
|
b5b0074411 | ||
|
|
44926a4e9a | ||
|
|
8bdd09400a | ||
|
|
8ac30b036a | ||
|
|
ecc0585c87 | ||
|
|
007f2fbff4 | ||
|
|
1f66ed3e3b | ||
|
|
eb66b2c175 | ||
|
|
5d86cfb092 | ||
|
|
b9fcc43ca6 | ||
|
|
3cfc5d9a1a | ||
|
|
25427e8521 | ||
|
|
2425af4bfe | ||
|
|
4a4ed32fe6 | ||
|
|
f7e31bd452 | ||
|
|
adf7357155 | ||
|
|
a541c90690 | ||
|
|
217e184153 | ||
|
|
e14348a05b | ||
|
|
78b97ce8fb | ||
|
|
aeaaaaf3af | ||
|
|
63a3e56cdb | ||
|
|
cea22b6147 | ||
|
|
06d39ea352 | ||
|
|
b4ea5bc8d0 | ||
|
|
ad42a71427 | ||
|
|
46dce17dfe | ||
|
|
7a8c97225b | ||
|
|
5574d8d6c0 | ||
|
|
a166d9a4dd | ||
|
|
b863077bfe | ||
|
|
ae2b5d4403 | ||
|
|
301d81f987 | ||
|
|
15f59c1a4e | ||
|
|
9eaf240674 | ||
|
|
a71fa02b0c | ||
|
|
9add2aaa87 | ||
|
|
a5b2a06f84 | ||
|
|
ca48e37163 | ||
|
|
304d122342 | ||
|
|
7c7e4c2297 | ||
|
|
e2c10f52d2 | ||
|
|
c91f19f9f7 | ||
|
|
1d5c8566d1 | ||
|
|
badb768529 | ||
|
|
d965320b57 | ||
|
|
096c2dbc83 | ||
|
|
88cc4bd5a4 | ||
|
|
e8a0a6d5f9 | ||
|
|
864b06a0e7 | ||
|
|
ea09a53496 | ||
|
|
d6ca87868b | ||
|
|
14458c7184 | ||
|
|
12cfce758c | ||
|
|
9e9beea83c | ||
|
|
0a5c51ad4b | ||
|
|
9ee4d1b2cd | ||
|
|
d833692e27 | ||
|
|
b68280655f | ||
|
|
1e7d329962 | ||
|
|
b35c85e831 | ||
|
|
bb53b2530c | ||
|
|
9bc7250532 | ||
|
|
160c3d80f9 | ||
|
|
5538c3f995 | ||
|
|
c7e560ffc5 | ||
|
|
d9e3fd7a01 | ||
|
|
732f20a0f1 | ||
|
|
a8a34a4a37 | ||
|
|
821833df8e | ||
|
|
bd5a14b18e | ||
|
|
d96c8ddf85 | ||
|
|
5cdcda66a5 | ||
|
|
1a47bbaf8c | ||
|
|
64da2793ac | ||
|
|
31fac7bf45 | ||
|
|
147b9a4501 | ||
|
|
b588fdfe1a | ||
|
|
607f9409d2 | ||
|
|
e32eb21fbf | ||
|
|
8320aab1bf | ||
|
|
ca76cb2af3 | ||
|
|
e938ea8967 | ||
|
|
15ede5e14c | ||
|
|
4eec2926cb | ||
|
|
3f4356467e | ||
|
|
50db7fcddb | ||
|
|
d158de5d82 | ||
|
|
4cfbbf4c68 | ||
|
|
ebee9ff791 | ||
|
|
61f5425662 | ||
|
|
da13fbff08 | ||
|
|
b785128f4c | ||
|
|
3ed74f0b02 | ||
|
|
6aa13e318b | ||
|
|
fd2248de17 | ||
|
|
17c56440f2 | ||
|
|
b642e4437e | ||
|
|
2f547033cd | ||
|
|
72c5a9ee92 | ||
|
|
048e5faa1f | ||
|
|
c9f7fba7dd | ||
|
|
c5f92edaa8 | ||
|
|
d7a8cb1537 | ||
|
|
fedb064b1f | ||
|
|
cf7e1da96a | ||
|
|
e98e942f19 | ||
|
|
ac904ee9fc | ||
|
|
ddd8b60816 | ||
|
|
40e7055f16 | ||
|
|
7298e1f438 | ||
|
|
383364b165 | ||
|
|
8e0c42afa9 | ||
|
|
9c9408d78a | ||
|
|
d1a4fbf3ce | ||
|
|
d28e0743f0 | ||
|
|
bf3d89e550 | ||
|
|
34b5181f34 | ||
|
|
23fd6b815f | ||
|
|
bdde6a2080 | ||
|
|
37970bd446 | ||
|
|
f9ddcd2f8a | ||
|
|
8ddda4783d | ||
|
|
a04b44d890 | ||
|
|
89558481de | ||
|
|
99cc3635f7 | ||
|
|
6e3262f78e | ||
|
|
fbff421de8 | ||
|
|
cebe20964f | ||
|
|
203e353e92 | ||
|
|
8c4e5b99fe | ||
|
|
16ce55ba60 | ||
|
|
a2d33e9672 | ||
|
|
6317202626 | ||
|
|
4cbbae6d2f | ||
|
|
9e76498f65 | ||
|
|
1c7708babd | ||
|
|
ce4d3c0b5c | ||
|
|
7f43584ed5 | ||
|
|
7532fdb1fc | ||
|
|
3cdba90bb0 | ||
|
|
011291f225 | ||
|
|
045a595537 | ||
|
|
be703c1f46 | ||
|
|
45c4f3cb97 | ||
|
|
3fdea6e57a | ||
|
|
05aa656e75 | ||
|
|
f8ddff9bc3 | ||
|
|
7f2d51bd15 | ||
|
|
45def4b3b7 | ||
|
|
67c94314ed | ||
|
|
7f320d23ca | ||
|
|
6d097f0bcb | ||
|
|
d7f2fec8ad | ||
|
|
5ee857f6f4 | ||
|
|
07c92b4bc3 | ||
|
|
a0cdf44deb | ||
|
|
71419eeda3 | ||
|
|
85ea9f5b19 | ||
|
|
1a9efa4e1e | ||
|
|
ec07cebb51 | ||
|
|
8b603d15a5 | ||
|
|
074718aedc | ||
|
|
25038e6cbb | ||
|
|
537bf921d2 | ||
|
|
f06048384d | ||
|
|
56e96ec3aa | ||
|
|
95c9e9d695 | ||
|
|
cb587112da | ||
|
|
306edec32d | ||
|
|
c1c6a370a5 | ||
|
|
00b3c3e9d2 | ||
|
|
52efbcc89f | ||
|
|
9be2519406 | ||
|
|
59e10fbf0a | ||
|
|
79657a9d53 | ||
|
|
0401b8556d | ||
|
|
b0f939af32 | ||
|
|
7024254960 | ||
|
|
6ac9e1aec4 | ||
|
|
af3d0d2eb0 | ||
|
|
5afd402c8b | ||
|
|
5e2ab4f612 | ||
|
|
2f75d88694 | ||
|
|
00eea24e3f | ||
|
|
67d2e266fd | ||
|
|
32d6583ae3 | ||
|
|
e8bb130245 | ||
|
|
e71121f738 | ||
|
|
c17cec0574 | ||
|
|
f562937e81 | ||
|
|
508d92c3e8 | ||
|
|
299cde9cdf | ||
|
|
da2685131d | ||
|
|
9a484193eb | ||
|
|
1c45331b0a | ||
|
|
2a06db0a2b | ||
|
|
180deb106b | ||
|
|
662aab973c | ||
|
|
3f972250d0 | ||
|
|
15ec1496c5 | ||
|
|
be3376272e | ||
|
|
c852a5bda3 | ||
|
|
d65c5e93b6 | ||
|
|
07ac88bfd6 | ||
|
|
1386be23f4 | ||
|
|
18cadf8db5 | ||
|
|
cf83b6572e | ||
|
|
22662fd5eb | ||
|
|
3263ce5669 | ||
|
|
cbb527c464 | ||
|
|
9cd2bb232b | ||
|
|
dcfb353537 | ||
|
|
8313de692e | ||
|
|
3c8cb34b0a | ||
|
|
b9311e84ce | ||
|
|
50d0c1eb29 | ||
|
|
a9cd0b29d4 | ||
|
|
2037ef3eac | ||
|
|
0582b9718b | ||
|
|
bbed05b273 | ||
|
|
30f0e82fba | ||
|
|
bdef9a3955 | ||
|
|
f6845a9820 | ||
|
|
4b52f343c1 | ||
|
|
a00d0820cc | ||
|
|
cdc9ab4ad6 | ||
|
|
1fb9648c6c | ||
|
|
3403d98c72 | ||
|
|
2cf2eb9f55 | ||
|
|
b5e52b80a3 | ||
|
|
80911af4d2 | ||
|
|
7a80e6a55c | ||
|
|
7958cb530f | ||
|
|
95c79e1c23 | ||
|
|
eee0f5e4c9 | ||
|
|
a9368904e5 | ||
|
|
f7c768bb91 | ||
|
|
f2b93f90f7 | ||
|
|
7d5661443f | ||
|
|
460b350d85 | ||
|
|
669f013c96 | ||
|
|
1bf584f9bf | ||
|
|
97aebc5b84 | ||
|
|
cf7cd5502c | ||
|
|
cf08ba1d39 | ||
|
|
c41e0efc73 | ||
|
|
bb1a778277 | ||
|
|
c6973043e6 | ||
|
|
e5c715695e | ||
|
|
e92506dc07 | ||
|
|
62344376d7 | ||
|
|
8cf96c3102 | ||
|
|
16fa8679d0 | ||
|
|
b517276156 | ||
|
|
732450e163 | ||
|
|
df8e3dd82b | ||
|
|
75ddafd31d | ||
|
|
4f38a8d16c | ||
|
|
35746103c7 | ||
|
|
fb5347b8e4 | ||
|
|
6890b278ea | ||
|
|
9f667a0b35 | ||
|
|
36be7b0b33 | ||
|
|
1d16cc2a03 | ||
|
|
72fd2990e7 | ||
|
|
6d7ca2bb86 | ||
|
|
f10a8f9589 | ||
|
|
1881b3d32c | ||
|
|
1b89d0a4f0 | ||
|
|
671888b6ea | ||
|
|
50498a7462 | ||
|
|
ecd190987e | ||
|
|
2c000f6808 | ||
|
|
c472e40b2b | ||
|
|
0575f89ae9 | ||
|
|
e1dcfaa1e3 | ||
|
|
486af84107 | ||
|
|
8acbd8b978 | ||
|
|
7f9180e356 | ||
|
|
26912f226f | ||
|
|
0c286231cc | ||
|
|
991a61f2f6 | ||
|
|
edfd7c9770 | ||
|
|
ad62faaeea | ||
|
|
468903bbeb | ||
|
|
0723f44dc3 | ||
|
|
831bdabfc6 | ||
|
|
93a3eed530 | ||
|
|
307a52e7f4 | ||
|
|
3246f4bfcc | ||
|
|
fa4f4a8db4 | ||
|
|
cb797fe903 | ||
|
|
618461b1ff | ||
|
|
e2f08d3c76 | ||
|
|
f39cda729d | ||
|
|
b28d826d76 | ||
|
|
57ae559723 | ||
|
|
1d1be18689 | ||
|
|
141b5eb776 | ||
|
|
3f941bf9fd | ||
|
|
a48f302531 | ||
|
|
12d8872973 | ||
|
|
40ff865989 | ||
|
|
32e9c10702 | ||
|
|
804dd3bb7c | ||
|
|
9f2e3a66cd | ||
|
|
960d1967a3 | ||
|
|
ad025c3fe4 | ||
|
|
81212a108e | ||
|
|
8637a4eb12 | ||
|
|
0e4489d627 | ||
|
|
0bfb9d0700 | ||
|
|
efe759b94e | ||
|
|
9f89c1f7a4 | ||
|
|
530d92cc3f | ||
|
|
b0225515d2 | ||
|
|
d511c69ee7 | ||
|
|
6e1e40f13e | ||
|
|
70d3ee07bf | ||
|
|
e5477f314e | ||
|
|
80c4826253 | ||
|
|
e0de3ff191 | ||
|
|
239cff3dee | ||
|
|
6f9e3168b0 | ||
|
|
7d067f807d | ||
|
|
a7b43699ed | ||
|
|
7d11917d1c | ||
|
|
904ba9b1ca | ||
|
|
616fe35ed5 | ||
|
|
577a3c6c6a | ||
|
|
e937267eb0 | ||
|
|
2c1e1b94e7 | ||
|
|
60736ce04c | ||
|
|
03daa350f8 | ||
|
|
095cc38122 | ||
|
|
142d659b70 | ||
|
|
0826a2f8a3 | ||
|
|
a3819a7785 | ||
|
|
2314777b4b | ||
|
|
729e97a95d | ||
|
|
5ab60ca4a3 | ||
|
|
f1adff82a8 | ||
|
|
96b2d139c9 | ||
|
|
e1bc1222c4 | ||
|
|
0bff4a3d21 | ||
|
|
dfc775c925 | ||
|
|
dea304d1eb | ||
|
|
cfd80645e2 | ||
|
|
4b7f7887c8 | ||
|
|
9fc640aa59 | ||
|
|
d812aab173 | ||
|
|
39b58711c7 | ||
|
|
c6120fcf7c | ||
|
|
45b9215c87 | ||
|
|
394f6adf82 | ||
|
|
1a5076438d | ||
|
|
872b8e7902 | ||
|
|
0cad96fdca | ||
|
|
e9ef4fd091 | ||
|
|
4ce8b38acd | ||
|
|
24ab6f2d3b | ||
|
|
ba5e5f4bb5 | ||
|
|
6ef8611a0a | ||
|
|
486676baa5 | ||
|
|
542cbf13ff | ||
|
|
62630eb519 | ||
|
|
b1d597e63f | ||
|
|
887eee01fc | ||
|
|
f605f1fc75 | ||
|
|
cc8fc38734 | ||
|
|
5797b8655d | ||
|
|
fd4d663a1c | ||
|
|
88263d55f2 | ||
|
|
5c4398f948 | ||
|
|
9ff397dfbc | ||
|
|
1c9ebfd11c | ||
|
|
22e8d7ee71 | ||
|
|
35458a7e37 | ||
|
|
c1544ab374 | ||
|
|
d795eb6f5f | ||
|
|
ce8264b8f2 | ||
|
|
c6cbc8a8b1 | ||
|
|
6c79a1daba | ||
|
|
7867965989 | ||
|
|
348513a248 | ||
|
|
eb62253137 | ||
|
|
c4e87435dd | ||
|
|
9980d225f5 | ||
|
|
9c0f596c0d | ||
|
|
ff8cca6d8b | ||
|
|
0e5e263dea | ||
|
|
166732946e | ||
|
|
cccdab45dc | ||
|
|
190ca7cf2d | ||
|
|
009160b6bf | ||
|
|
851f67d86f | ||
|
|
b8be2277c4 | ||
|
|
14e266b938 | ||
|
|
94f070f096 | ||
|
|
0c28664ced | ||
|
|
754863e42c | ||
|
|
fb5e4a5f17 | ||
|
|
03e9fb93c7 | ||
|
|
3e77e24b1f | ||
|
|
d97809e4b0 | ||
|
|
551fd0aaf9 | ||
|
|
2fc36f8355 | ||
|
|
13cc2feb3f | ||
|
|
e2b62fc9f6 | ||
|
|
6b119cf4b8 | ||
|
|
88d198403e | ||
|
|
5ee39d7ecc | ||
|
|
e7102725bd | ||
|
|
bd28867804 | ||
|
|
0eb09a2136 | ||
|
|
470daf0036 | ||
|
|
fd28cbca4e | ||
|
|
6ecf0ecd88 | ||
|
|
c940d9d8a4 | ||
|
|
efef172658 | ||
|
|
e865b2c054 | ||
|
|
f8243f6934 | ||
|
|
746268c3ef | ||
|
|
48695651e1 | ||
|
|
45f726669e | ||
|
|
d473615ccf | ||
|
|
70425c77ea | ||
|
|
8520409459 | ||
|
|
1e48c6dcfe | ||
|
|
67a81400ff | ||
|
|
51431169dd | ||
|
|
2a0183c838 | ||
|
|
e222915a37 | ||
|
|
b698ccbc1d | ||
|
|
03a80beebe | ||
|
|
1c072e9f32 | ||
|
|
01576f941f | ||
|
|
4af80286d5 | ||
|
|
c9785bc57b | ||
|
|
81e72826ce | ||
|
|
71f9f3d230 | ||
|
|
500a01b46d | ||
|
|
8190c189e5 | ||
|
|
dea2ac22e1 | ||
|
|
1cae46a936 | ||
|
|
ac22838ded | ||
|
|
93875d667c | ||
|
|
41043e4dc1 | ||
|
|
2e8425d4b1 | ||
|
|
fcac28c69f | ||
|
|
a14b319ada | ||
|
|
6763ebdd66 | ||
|
|
421f2dd688 | ||
|
|
19b21a3e8a | ||
|
|
06dcaff806 | ||
|
|
f02bba5630 | ||
|
|
12fa295506 | ||
|
|
1054bbdf8b | ||
|
|
b47436ec59 | ||
|
|
856534cb81 | ||
|
|
3ee07c7da7 | ||
|
|
96fb892465 | ||
|
|
3a48a124e2 | ||
|
|
b391d47a40 | ||
|
|
a3c4d7c7b6 | ||
|
|
4ee5890d90 | ||
|
|
2ce1134b8b | ||
|
|
641ff441b5 | ||
|
|
7687259381 | ||
|
|
bd888451ec | ||
|
|
7484542af2 | ||
|
|
1e64a3f94c | ||
|
|
fd7319b295 | ||
|
|
923e00ad19 | ||
|
|
518be4e630 | ||
|
|
06a13557e3 | ||
|
|
72aa82c8ed | ||
|
|
b8a136e0ad | ||
|
|
38ba214327 | ||
|
|
c23ec06ce6 | ||
|
|
c495098582 | ||
|
|
499d095f81 | ||
|
|
2ed9367dc8 | ||
|
|
820e6fcfa3 | ||
|
|
f92ef05ee2 | ||
|
|
4b3795671d | ||
|
|
bff5ff79bd | ||
|
|
21056c5cb8 | ||
|
|
a4567939d6 | ||
|
|
e92ac2b30d | ||
|
|
90871d5859 | ||
|
|
cb299d145b | ||
|
|
6afc34e47e | ||
|
|
f6bcbbd962 | ||
|
|
55f1129a24 | ||
|
|
a2c48492ee | ||
|
|
cb0591fe5f | ||
|
|
2f269c3e17 | ||
|
|
d1a15f07d5 | ||
|
|
3cb0c95278 | ||
|
|
74910a6b56 | ||
|
|
5ab32326c1 | ||
|
|
7dc184f05f | ||
|
|
dbdb3931f4 | ||
|
|
56a5559024 | ||
|
|
8798afc41c | ||
|
|
e67c911c97 | ||
|
|
88d69f6fd4 | ||
|
|
99555f7dd0 | ||
|
|
b3ec77c631 | ||
|
|
d4c61e7ec9 | ||
|
|
48bbe288b7 | ||
|
|
3664266eed | ||
|
|
a1f7ab1562 | ||
|
|
5f95c745e2 | ||
|
|
1f735d8739 | ||
|
|
551fa28b27 | ||
|
|
909114e318 | ||
|
|
a4e55a0664 | ||
|
|
86e196808e | ||
|
|
0a4e15de31 | ||
|
|
cd1f52c6b5 | ||
|
|
b63449bffd | ||
|
|
93965138da | ||
|
|
fae1bd791f | ||
|
|
35855d2d71 | ||
|
|
c374534d9e | ||
|
|
f6c92dab24 | ||
|
|
03beae30ca | ||
|
|
4ee81501a9 | ||
|
|
3b92c3d75c | ||
|
|
814876f8df | ||
|
|
567d1ae104 | ||
|
|
7b7f028d74 | ||
|
|
0e53524f2e | ||
|
|
0f0e0951ec | ||
|
|
a172c4b725 | ||
|
|
9f979c02f8 | ||
|
|
1d59a67d6e | ||
|
|
5837a4602a | ||
|
|
e07a7ac496 | ||
|
|
de57d0b027 | ||
|
|
32bcb52f14 | ||
|
|
612ec06262 | ||
|
|
93dea90970 | ||
|
|
47ece1f285 | ||
|
|
64378419d0 | ||
|
|
00a201181d | ||
|
|
b3f9a14c85 | ||
|
|
065e3828b1 | ||
|
|
63e91f0ee5 | ||
|
|
182ef5c8f7 | ||
|
|
2f790140e0 | ||
|
|
a8bf247d01 | ||
|
|
e2b3e06077 | ||
|
|
43332d8752 | ||
|
|
b410ef5d08 | ||
|
|
1e97a9a872 | ||
|
|
26c49e7c22 | ||
|
|
b0f000acfd | ||
|
|
89269b848d | ||
|
|
7a55af405b | ||
|
|
a3343bc738 | ||
|
|
dd10486f27 | ||
|
|
a324ad2dd8 | ||
|
|
38b4653cb3 | ||
|
|
fdd9186ae9 | ||
|
|
81302e3ca5 | ||
|
|
cf99b4f8b9 | ||
|
|
12d39550a8 | ||
|
|
9c3e063635 | ||
|
|
bc0f3e343b | ||
|
|
d3eabd8d8f | ||
|
|
bfa8f97e7e | ||
|
|
4136328a36 | ||
|
|
2fd2c18dfc | ||
|
|
0a32f9405a | ||
|
|
7125e9ecd5 | ||
|
|
869e4a0b9d | ||
|
|
dc0e5c218f | ||
|
|
7fe3238339 | ||
|
|
f491f5bf49 | ||
|
|
17070b88d3 | ||
|
|
36fd23b264 | ||
|
|
fcd1d400f8 | ||
|
|
dbbec86a13 | ||
|
|
67bd23a027 | ||
|
|
f22a350938 | ||
|
|
2f0388d692 | ||
|
|
d7922c6330 | ||
|
|
b383142c14 | ||
|
|
c42b0caf0f | ||
|
|
6ba286087d | ||
|
|
c2e3fef7fc | ||
|
|
b9d344c7d9 | ||
|
|
320643d2da | ||
|
|
fe04c1af25 | ||
|
|
21d3ed61ef | ||
|
|
b7f27a2af0 | ||
|
|
2560b4d336 | ||
|
|
66282d4ed0 | ||
|
|
2152f54066 | ||
|
|
c89cb32871 | ||
|
|
59eaf9177e | ||
|
|
36aa58b38e | ||
|
|
2f4fccfb2c | ||
|
|
d251ebb995 | ||
|
|
0cc1573503 | ||
|
|
2ad3f2c1ab | ||
|
|
6cca26b914 | ||
|
|
0c946516e8 | ||
|
|
7b417929e6 | ||
|
|
c77ef4e4ce | ||
|
|
a9d90da5c8 | ||
|
|
4071c2ca43 | ||
|
|
58eaddf753 | ||
|
|
0a571502ce | ||
|
|
a850e5b74e | ||
|
|
71aa1fa113 | ||
|
|
24eef2dc0b | ||
|
|
5977c8c8e2 | ||
|
|
dcd4c19b21 | ||
|
|
464c7dae0a | ||
|
|
ad92e2e5eb | ||
|
|
254845d71f | ||
|
|
89ab97076c | ||
|
|
dd444ccc8a | ||
|
|
c9cab47ce0 | ||
|
|
b868477406 | ||
|
|
71ad3fc51d | ||
|
|
837ad7e39c | ||
|
|
898c589e2b | ||
|
|
49c90a4455 | ||
|
|
d315f37c88 | ||
|
|
799c1dc804 | ||
|
|
3d457e757d | ||
|
|
f74d575d6a | ||
|
|
d4e0bacde9 | ||
|
|
844c3ab26f | ||
|
|
97c884de42 | ||
|
|
6cc974a8e9 | ||
|
|
5f3822ac1a | ||
|
|
e9763f4ec6 | ||
|
|
e4d03f9581 | ||
|
|
8b0ac6e81e | ||
|
|
a73eba8916 | ||
|
|
c74d761a4b | ||
|
|
e60cc7b544 | ||
|
|
515e53b220 | ||
|
|
8948c3f435 | ||
|
|
3a1367a1d8 | ||
|
|
e114873e4c | ||
|
|
be8f98f6c7 | ||
|
|
5a685474ff | ||
|
|
185974a3ea | ||
|
|
6c87711595 | ||
|
|
35b8e389a3 | ||
|
|
51564d1adc | ||
|
|
88df06ee47 | ||
|
|
770c746444 | ||
|
|
47215ddb13 | ||
|
|
fb09066679 | ||
|
|
7591095f2a | ||
|
|
48575c09ca | ||
|
|
5fc01fe685 | ||
|
|
df94dd2cf5 | ||
|
|
ae53ce5544 | ||
|
|
1f0e6c0426 | ||
|
|
7f84c3c71c | ||
|
|
8a050810c1 | ||
|
|
4033f7a47d | ||
|
|
62cc64d912 | ||
|
|
290ca2178d | ||
|
|
b935f8a3f3 | ||
|
|
65e31115a1 | ||
|
|
19d536ea8b | ||
|
|
8aa2401134 | ||
|
|
4699d9404b | ||
|
|
b50132e255 | ||
|
|
8f1c4af9fa | ||
|
|
d5bd816676 | ||
|
|
8093528694 | ||
|
|
7b7bf5d390 | ||
|
|
8db140fe89 | ||
|
|
2e4148a9eb | ||
|
|
ed356ba85d | ||
|
|
cf79fef0bc | ||
|
|
d4b4451a48 | ||
|
|
2f57a4f86f | ||
|
|
31b665d344 | ||
|
|
6d56bc7c0c | ||
|
|
89cf28fade | ||
|
|
8087e8ad75 | ||
|
|
df19ced50c | ||
|
|
dba8865d75 | ||
|
|
d506cf2d2a | ||
|
|
5e30e1a2ee | ||
|
|
af6d96843d | ||
|
|
c0acc1d087 | ||
|
|
98e3343808 | ||
|
|
3c72f195ba | ||
|
|
f3f46858c9 | ||
|
|
861a847692 | ||
|
|
d4631229af | ||
|
|
a78f7d5789 | ||
|
|
fca5c77089 | ||
|
|
fe828a1c49 | ||
|
|
11e3573ebd | ||
|
|
ff1d625dc8 | ||
|
|
bd9691532f | ||
|
|
133b597093 | ||
|
|
d4d540bc33 | ||
|
|
d08322c1a3 | ||
|
|
ec1c664ed6 | ||
|
|
a3b46581b0 | ||
|
|
b115d4f02d | ||
|
|
6e64ede90b | ||
|
|
1917c2ce38 | ||
|
|
c06c2422a9 | ||
|
|
14d205f845 | ||
|
|
a57ce557e8 | ||
|
|
23c200f333 | ||
|
|
bf6a3adc06 | ||
|
|
60a8c8212c | ||
|
|
525c9c8fd8 | ||
|
|
08651685d4 | ||
|
|
3a60abaeee | ||
|
|
1e5d980b85 | ||
|
|
f9e97735e6 | ||
|
|
df36aceddb | ||
|
|
600e1cdbfb | ||
|
|
d0f11db700 | ||
|
|
27de8138f5 | ||
|
|
bc0cd2332c | ||
|
|
c1b5287ba0 | ||
|
|
a2a43b3996 | ||
|
|
6c07ecb700 | ||
|
|
2d3f848ab3 | ||
|
|
fdd188516b | ||
|
|
4c95b1d7ad | ||
|
|
19b7b51eea | ||
|
|
3c355e2d75 | ||
|
|
290c2f7b62 | ||
|
|
be7bcd03e1 | ||
|
|
0965f4213e | ||
|
|
bb9ca6e40f | ||
|
|
672ea6d6f2 | ||
|
|
ec189a4867 | ||
|
|
f67a50c064 | ||
|
|
a0fba34ff6 | ||
|
|
7ea45ac3d2 | ||
|
|
78a58617c1 | ||
|
|
f098aeb622 | ||
|
|
6904afc5e7 | ||
|
|
b079b30694 | ||
|
|
3e8a425684 | ||
|
|
b47c4c8f71 | ||
|
|
6d3097ae76 | ||
|
|
09e521c2c2 | ||
|
|
2439cf4633 | ||
|
|
f1b31f26d0 | ||
|
|
b1eca89a05 | ||
|
|
09bf2a0fe0 | ||
|
|
2d754641b5 | ||
|
|
871a0dfc6c | ||
|
|
3521d4a4f7 | ||
|
|
407f12760c | ||
|
|
479975fdff | ||
|
|
98fae8a6de | ||
|
|
2e94104ff8 | ||
|
|
039c13fc0a | ||
|
|
de266e8c88 | ||
|
|
ada99077a4 | ||
|
|
f5588f94db | ||
|
|
2a325ae4cc | ||
|
|
ac9345419e | ||
|
|
b3fb020dfa | ||
|
|
4b885a6e30 | ||
|
|
fa814d64de | ||
|
|
8aa376de25 | ||
|
|
14e7f2d986 | ||
|
|
f816f3d29b | ||
|
|
3db9987966 | ||
|
|
5e40bd5deb | ||
|
|
74a9ddbe47 | ||
|
|
188c2ae7ea | ||
|
|
e645c19761 | ||
|
|
baf9cab66c | ||
|
|
2fd940bcde | ||
|
|
f4988c5d86 | ||
|
|
b59b3a3a74 | ||
|
|
c677db70b4 | ||
|
|
9861f294b7 | ||
|
|
c7a42a1641 | ||
|
|
e2a721b209 | ||
|
|
66090e3926 | ||
|
|
60395fb16d | ||
|
|
54881facf8 | ||
|
|
9f2f131df9 | ||
|
|
70ab4122a3 | ||
|
|
7302fb951e | ||
|
|
dee8ccd8b3 | ||
|
|
40b2efb339 | ||
|
|
190e74b4d2 | ||
|
|
8bec08799e | ||
|
|
003b056301 | ||
|
|
97fd58f793 | ||
|
|
aa70d410f8 | ||
|
|
ab21a9238d | ||
|
|
be080b1463 | ||
|
|
f8ef3e6754 | ||
|
|
e4e8b939e2 | ||
|
|
020f122647 | ||
|
|
ab0626720a | ||
|
|
637c05466a | ||
|
|
08b98739f7 | ||
|
|
920a835344 | ||
|
|
88e27e315f | ||
|
|
7d3427474d | ||
|
|
d77183fd48 | ||
|
|
caa601c9aa | ||
|
|
b9a0152000 | ||
|
|
5c5e4e3464 | ||
|
|
044f987ecd | ||
|
|
295351d3e9 | ||
|
|
ab7ca411a4 | ||
|
|
c0dee497cd | ||
|
|
247e51478b | ||
|
|
a0540e0452 | ||
|
|
515d421dc0 | ||
|
|
6032f52798 | ||
|
|
05989fdc58 | ||
|
|
b62fafe520 | ||
|
|
4562a0130a | ||
|
|
6949481198 | ||
|
|
5654170278 | ||
|
|
735a324f5a | ||
|
|
2cb51f5b58 | ||
|
|
3baeef4f44 | ||
|
|
cada78ca4d | ||
|
|
a2929ef441 | ||
|
|
6c7c8b43b9 | ||
|
|
d0940708b0 | ||
|
|
af21f3c5d8 | ||
|
|
dd18040232 | ||
|
|
c72e3a1585 | ||
|
|
888a47e7a9 | ||
|
|
0df51d2d7c | ||
|
|
022945b0d1 | ||
|
|
0e62284671 | ||
|
|
704103f9f1 | ||
|
|
1f2ffe7e76 | ||
|
|
b763abdc76 | ||
|
|
af2fcbc059 | ||
|
|
0c4d278de2 | ||
|
|
9596d24cca | ||
|
|
a52b71ef43 | ||
|
|
216289455e | ||
|
|
019d8cf756 | ||
|
|
3a1c09f89c | ||
|
|
e9ed4a3f93 | ||
|
|
164d6b1b6c | ||
|
|
2307dfaaac | ||
|
|
3cecc1229f | ||
|
|
cca895e418 | ||
|
|
ddda934eed | ||
|
|
1d8c9ecfc4 | ||
|
|
1f20574520 | ||
|
|
da81bc3ba5 | ||
|
|
013fb58267 | ||
|
|
f4f2feae3c | ||
|
|
ffad6e47ec | ||
|
|
2b8f884c12 | ||
|
|
2df0d81d29 | ||
|
|
b02c4904a9 | ||
|
|
f73cdac9e2 | ||
|
|
de848511af | ||
|
|
9e294529cf | ||
|
|
96d6accbde | ||
|
|
86e276ea94 | ||
|
|
8566d62aee | ||
|
|
0ccc78e90a | ||
|
|
3c86207d63 | ||
|
|
c2a37c814d | ||
|
|
4727866b15 | ||
|
|
7a3c33fde3 | ||
|
|
087735a08f | ||
|
|
a3077d91ec | ||
|
|
649763f2b1 | ||
|
|
f9b988a232 | ||
|
|
ab45bcb121 | ||
|
|
e9190d01dc | ||
|
|
ba0e98fd4b | ||
|
|
40cc5b379b | ||
|
|
b1cb48aa9b | ||
|
|
82d9165d92 | ||
|
|
39d4ee9ad8 | ||
|
|
2cdd444e29 | ||
|
|
d492f0f41f | ||
|
|
943e085d37 | ||
|
|
0624f9103f | ||
|
|
cab1530afc | ||
|
|
90e63f1898 | ||
|
|
b2fdd92f9c | ||
|
|
91701b484a | ||
|
|
9fdae1ac45 | ||
|
|
b7766946d8 | ||
|
|
9486749345 | ||
|
|
a3bec4d5fc | ||
|
|
d8cc091f94 | ||
|
|
89ba4aeeaf | ||
|
|
a2f223a992 | ||
|
|
286efade59 | ||
|
|
4e7888259f | ||
|
|
8e3fa892e1 | ||
|
|
8de0c55b68 | ||
|
|
4c27d2600a | ||
|
|
59cfb14a19 | ||
|
|
6f7cf4f186 | ||
|
|
52454c50b7 | ||
|
|
c56219f5b4 | ||
|
|
99b6e1f93c | ||
|
|
6ff1549d2e | ||
|
|
1b05e8ddc9 | ||
|
|
4745877a63 | ||
|
|
c81c7f5a33 | ||
|
|
a23beddc66 | ||
|
|
045929681d | ||
|
|
cf0cf52298 | ||
|
|
1ff7c8bdd5 | ||
|
|
7254f766d5 | ||
|
|
83e07ec76c | ||
|
|
c3a1f25894 | ||
|
|
750d8b0a25 | ||
|
|
2e4558a5d3 | ||
|
|
3e5813323b | ||
|
|
ecd858251f | ||
|
|
ac0847ffe3 | ||
|
|
d1bf49790e | ||
|
|
815f24fbf5 | ||
|
|
d83352e16f | ||
|
|
8715ab9322 | ||
|
|
4df294f0a2 | ||
|
|
cbbe1b4f47 | ||
|
|
8ccd6a8ed3 | ||
|
|
cbd222fe30 | ||
|
|
1683567dda | ||
|
|
da2e40db4d | ||
|
|
e3c37f003b | ||
|
|
c9eebafb2d | ||
|
|
751da877ee | ||
|
|
14d19b5117 | ||
|
|
41d4c883a3 | ||
|
|
09504508d9 | ||
|
|
94c755a0e6 | ||
|
|
f21cff335b | ||
|
|
6947996c9a | ||
|
|
0756090081 | ||
|
|
95e03d2684 | ||
|
|
fab5833cdf | ||
|
|
a011c10d4d | ||
|
|
14584bef55 | ||
|
|
907a371bd4 | ||
|
|
a420c1749a | ||
|
|
c29e9bb68d | ||
|
|
fd965e6022 | ||
|
|
2e8d7a20d0 | ||
|
|
8084ed191e | ||
|
|
0b51e50c19 | ||
|
|
659e056eeb | ||
|
|
c70023c066 | ||
|
|
ba2bdf8ea4 | ||
|
|
57330bb2cd | ||
|
|
16fdef2d55 | ||
|
|
31928d5ebb | ||
|
|
8370b99302 | ||
|
|
13f98e1675 | ||
|
|
615804333e | ||
|
|
e1b9e113b1 | ||
|
|
dfbde3e41c | ||
|
|
034b4feff4 | ||
|
|
949439361e | ||
|
|
163b6b3725 | ||
|
|
bdc6addf81 | ||
|
|
fd7c1e24a3 | ||
|
|
a16ecbcebd | ||
|
|
0a1f6be4a5 | ||
|
|
98bf462e02 | ||
|
|
86fa59e5e1 | ||
|
|
1ddadeba5d | ||
|
|
2e1d5d4d13 | ||
|
|
31b29abf5f | ||
|
|
16c428dbd5 | ||
|
|
54bc6550ee | ||
|
|
a698cb6ef7 | ||
|
|
5f86ab27bb | ||
|
|
f0b2c08a9e | ||
|
|
3f8c705989 | ||
|
|
6f84574511 | ||
|
|
6a131977d3 | ||
|
|
4df0075b42 | ||
|
|
e3972c6205 | ||
|
|
4e949f542c | ||
|
|
af38fd3ba3 | ||
|
|
d00ac278c6 | ||
|
|
0e01303921 | ||
|
|
39eeaf06e5 | ||
|
|
7c2c4b26b3 | ||
|
|
2ea0703701 | ||
|
|
d425cdc27d | ||
|
|
799c833a66 | ||
|
|
96bc88d045 | ||
|
|
da7bbc2b20 | ||
|
|
7b4f6c3222 | ||
|
|
e3bc528647 | ||
|
|
29665203c0 | ||
|
|
7beb9afc36 | ||
|
|
2fcb3a0131 | ||
|
|
0a9749726f | ||
|
|
c1e6d9c633 | ||
|
|
4767d49e4d | ||
|
|
2bf7e8506c | ||
|
|
447966e3b8 | ||
|
|
adc17272dc | ||
|
|
6e54f34419 | ||
|
|
4b4051a823 | ||
|
|
5c4e230f69 | ||
|
|
2c191a9bd3 | ||
|
|
ed9313759b | ||
|
|
70a7a72baa | ||
|
|
4d69025250 | ||
|
|
9f9028b7ce | ||
|
|
e9be3242b2 | ||
|
|
6868b683d8 | ||
|
|
4934ec2ea1 | ||
|
|
211a06e9bc | ||
|
|
debca0a82d | ||
|
|
92da954229 | ||
|
|
91d96b162e | ||
|
|
0907bf195e | ||
|
|
f30b14a3da | ||
|
|
2030793a02 | ||
|
|
d09f561ef6 | ||
|
|
2d1bede57e | ||
|
|
a947ec10e4 | ||
|
|
fd04f94b76 | ||
|
|
6881446e67 | ||
|
|
bd0a9952ff | ||
|
|
c35255b82b | ||
|
|
5e71e7d04d | ||
|
|
cdf3c62d17 | ||
|
|
e7e2176e64 | ||
|
|
ecb9e92c48 | ||
|
|
053c2eb379 | ||
|
|
bde2810c08 | ||
|
|
692159219e | ||
|
|
71b194cbcb | ||
|
|
fb81c7e8e0 | ||
|
|
84878315d5 | ||
|
|
1bd675cce9 | ||
|
|
e77a0a9385 | ||
|
|
d63da05e87 | ||
|
|
dece58faf6 | ||
|
|
0bfc166899 | ||
|
|
3bc8006028 | ||
|
|
f6b7a35c81 | ||
|
|
5f17b28e05 | ||
|
|
138099f11d | ||
|
|
beb425bbd0 | ||
|
|
b5631aa1df | ||
|
|
2958881343 | ||
|
|
981e26e1b6 | ||
|
|
b5e11f2303 | ||
|
|
6a159aa631 | ||
|
|
4b14a4bc50 | ||
|
|
2ca4b15154 | ||
|
|
e02d602341 | ||
|
|
8d218db35f | ||
|
|
f96d78e9b8 | ||
|
|
28dd7e4ca7 | ||
|
|
14a0e6bd6e | ||
|
|
f2b2952909 | ||
|
|
adc82bea85 | ||
|
|
778adc2f39 | ||
|
|
a92895d09d | ||
|
|
dfb66cc41f | ||
|
|
065180e86c | ||
|
|
73cd7f7513 | ||
|
|
e2d5534959 | ||
|
|
a6cbdfc559 | ||
|
|
7c643ea698 | ||
|
|
39be3d0958 | ||
|
|
e693141f50 | ||
|
|
927dad4ff5 | ||
|
|
885caa52db | ||
|
|
88776b4e00 | ||
|
|
8b963f3fe4 | ||
|
|
4a4ac1d6c8 | ||
|
|
b5eef748b4 | ||
|
|
6ebe235dc3 | ||
|
|
bbde3159bb | ||
|
|
7e65aea6d9 | ||
|
|
e377675897 | ||
|
|
c3d40c9fb9 | ||
|
|
5efc61b155 | ||
|
|
323ab5498b | ||
|
|
b6e18e70bc | ||
|
|
1496d9d931 | ||
|
|
e0e35f5abf | ||
|
|
0b7e4d594e | ||
|
|
1bdf0b5500 | ||
|
|
acb6f1fc87 | ||
|
|
a57e8f3a5d | ||
|
|
4cb86b76e8 | ||
|
|
24f9511726 | ||
|
|
e4d160ee0b | ||
|
|
21d91193a2 | ||
|
|
4d7f925c5a | ||
|
|
ad5f3f2450 | ||
|
|
a84fc734ff | ||
|
|
3d5a5e4d86 | ||
|
|
2d14a74ec2 | ||
|
|
942a604b5b | ||
|
|
e5ea8074d2 | ||
|
|
2779c8e69f | ||
|
|
1d12014399 | ||
|
|
d4b26025ed | ||
|
|
597f177d5b |
12
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
# github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
|
||||
# patreon: # Replace with a single Patreon username
|
||||
# open_collective: # Replace with a single Open Collective username
|
||||
ko_fi: jadzia626
|
||||
# tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
|
||||
# community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
|
||||
# liberapay: # Replace with a single Liberapay username
|
||||
# issuehunt: # Replace with a single IssueHunt username
|
||||
# otechie: # Replace with a single Otechie username
|
||||
# custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']
|
||||
24
.github/pull_request_template.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
<!--
|
||||
Please check the following before you make a pull request:
|
||||
|
||||
* The branch you are making the pull request from (in your own fork) has a unique and descriptive
|
||||
name. Do not make a pull request directly from your copy of `main`.
|
||||
* If you are submitting translation files, only submit the files that you have added translations
|
||||
to, not the other .ts files that may have been updated in the process.
|
||||
* Make sure your contribution follows the style guide and other requirements mentioned in the
|
||||
CONTRIBUTING.md file in the repository.
|
||||
* Fill in the Summary section below, and if relevant, mention the issue numbers related to the PR.
|
||||
-->
|
||||
|
||||
**Summary:**
|
||||
|
||||
**Related Issue(s):**
|
||||
|
||||
**Reviewer's Checklist:**
|
||||
|
||||
* [ ] The header of all files contain a reference to the repository license
|
||||
* [ ] The overall test coverage is increased or remains the same as before
|
||||
* [ ] All tests are passing
|
||||
* [ ] All flake8 checks are passing and the style guide is followed
|
||||
* [ ] Documentation (as docstrings) is complete and understandable
|
||||
* [ ] Only files that have been actively changed are committed
|
||||
18
.github/workflows/syntax.yml
vendored
@@ -2,28 +2,32 @@ name: flake8
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
|
||||
jobs:
|
||||
checkSyntax:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v1
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3
|
||||
architecture: x64
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Install flake8
|
||||
run: pip install flake8
|
||||
- name: Syntax Error Check
|
||||
run: |
|
||||
flake8 nw --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||
flake8 novelwriter --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||
flake8 tests --count --select=E9,F63,F7,F82 --show-source --statistics
|
||||
- name: Coding Style Violations
|
||||
run: |
|
||||
flake8 nw --count --max-line-length=99 --ignore E203,E221,E226,E228,E241,E251,E261,E266,E302,E305 --show-source --statistics
|
||||
flake8 tests --count --max-line-length=99 --ignore E203,E221,E226,E228,E241,E251,E261,E266,E302,E305 --show-source --statistics
|
||||
flake8 novelwriter --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics
|
||||
flake8 tests --count --max-line-length=99 --ignore E133,E221,E226,E228,E241,W503 --show-source --statistics
|
||||
|
||||
43
.github/workflows/test_linux.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Linux
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
|
||||
jobs:
|
||||
testLinux:
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.7", "3.8", "3.9", "3.10", "3.11"]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
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 aspell-en
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v3
|
||||
- name: Install Dependencies (pip)
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install -r requirements-dev.txt
|
||||
- name: Run Build Commands
|
||||
run: python setup.py qtlrelease sample
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --cov=novelwriter --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v3
|
||||
33
.github/workflows/test_linux_3.6.yml
vendored
@@ -1,33 +0,0 @@
|
||||
name: Linux (3.6)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
|
||||
jobs:
|
||||
testLinux36:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.6
|
||||
architecture: x64
|
||||
- name: Install Packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install libenchant-dev qt5-default
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install pytest-timeout
|
||||
pip install pytest-qt
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --timeout=60
|
||||
33
.github/workflows/test_linux_3.7.yml
vendored
@@ -1,33 +0,0 @@
|
||||
name: Linux (3.7)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
|
||||
jobs:
|
||||
testLinux37:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.7
|
||||
architecture: x64
|
||||
- name: Install Packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install libenchant-dev qt5-default
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install pytest-timeout
|
||||
pip install pytest-qt
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --timeout=60
|
||||
37
.github/workflows/test_linux_3.8.yml
vendored
@@ -1,37 +0,0 @@
|
||||
name: Linux (3.8)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
|
||||
jobs:
|
||||
testLinux38:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.8
|
||||
architecture: x64
|
||||
- name: Install Packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install libenchant-dev qt5-default
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install pytest-timeout
|
||||
pip install pytest-cov
|
||||
pip install pytest-qt
|
||||
pip install codecov
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --cov=nw --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v1
|
||||
37
.github/workflows/test_linux_3.9.yml
vendored
@@ -1,37 +0,0 @@
|
||||
name: Linux (3.9)
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
|
||||
jobs:
|
||||
testLinux39:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
with:
|
||||
python-version: 3.9
|
||||
architecture: x64
|
||||
- name: Install Packages
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install libenchant-dev qt5-default
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install pytest-timeout
|
||||
pip install pytest-cov
|
||||
pip install pytest-qt
|
||||
pip install codecov
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --cov=nw --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v1
|
||||
28
.github/workflows/test_mac.yml
vendored
@@ -1,36 +1,38 @@
|
||||
name: macOS (3.8)
|
||||
name: macOS
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
|
||||
jobs:
|
||||
testMac38:
|
||||
testMac:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.8
|
||||
python-version: "3.10"
|
||||
architecture: x64
|
||||
- name: Install Packages
|
||||
run: |
|
||||
brew install enchant
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install pytest-timeout
|
||||
pip install pytest-cov
|
||||
pip install pytest-qt
|
||||
pip install codecov
|
||||
pip install -r requirements-dev.txt
|
||||
pip install pyobjc
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --cov=nw --timeout=60
|
||||
pytest -v --cov=novelwriter --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v1
|
||||
uses: codecov/codecov-action@v3
|
||||
|
||||
27
.github/workflows/test_win.yml
vendored
@@ -1,32 +1,33 @@
|
||||
name: Windows (3.8)
|
||||
name: Windows
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ main, dev ]
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
pull_request:
|
||||
branches: [ main, dev ]
|
||||
branches:
|
||||
- main
|
||||
- patch
|
||||
|
||||
jobs:
|
||||
testWin38:
|
||||
testWin:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v2
|
||||
uses: actions/setup-python@v4
|
||||
with:
|
||||
python-version: 3.8
|
||||
python-version: "3.10"
|
||||
architecture: x64
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v2
|
||||
uses: actions/checkout@v3
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
pip install pytest-timeout
|
||||
pip install pytest-cov
|
||||
pip install pytest-qt
|
||||
pip install codecov
|
||||
pip install -r requirements-dev.txt
|
||||
- name: Run Tests
|
||||
run: |
|
||||
pytest -v --cov=nw --timeout=60
|
||||
pytest -v --cov=novelwriter --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v1
|
||||
uses: codecov/codecov-action@v3
|
||||
|
||||
20
.gitignore
vendored
@@ -1,28 +1,41 @@
|
||||
# Setup/Install
|
||||
/MANIFEST
|
||||
/dist/
|
||||
/build/
|
||||
/deploy/
|
||||
/dist/
|
||||
/dist_*/
|
||||
*.spec
|
||||
*.egg-info
|
||||
setup.iss
|
||||
novelwriter.desktop
|
||||
/novelwriter.desktop
|
||||
/novelWriter.pyw
|
||||
|
||||
# Translations
|
||||
/novelwriter/assets/i18n/*.qm
|
||||
.qmake.stash
|
||||
i18n/*.qm
|
||||
i18n/*.qph
|
||||
|
||||
# Documentation
|
||||
/docs/build/
|
||||
/novelwriter/assets/help/
|
||||
/novelwriter/assets/manual.pdf
|
||||
*.qch
|
||||
*.qhc
|
||||
.~lock.*
|
||||
|
||||
# Python Temp
|
||||
__pycache__
|
||||
*.pyc
|
||||
|
||||
# Sample Project
|
||||
/nw/assets/sample.zip
|
||||
/novelwriter/assets/sample.zip
|
||||
/sample/cache
|
||||
/sample/meta
|
||||
/sample/versions
|
||||
*.bak
|
||||
*.lock
|
||||
ToC.txt
|
||||
|
||||
# PyTest
|
||||
/prof/
|
||||
@@ -38,3 +51,4 @@ __pycache__
|
||||
|
||||
# Coverage
|
||||
/.coverage
|
||||
/coverage.*
|
||||
|
||||
@@ -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
|
||||
|
||||
2403
CHANGELOG.md
@@ -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
|
||||
|
||||
164
CONTRIBUTING.md
@@ -1,106 +1,122 @@
|
||||
# Contributing
|
||||
# Contributing Guide
|
||||
|
||||
When contributing to this repository, please first discuss the change you wish to make via the
|
||||
issue tracker with the owner of this repository before making a change. If you just want to make a
|
||||
minor correction, like fix a typo or similar, feel free to just make a pull request directly.
|
||||
issue tracker or the discussions page with the owner of this repository. Especially if it is
|
||||
regarding new features. If you just want to make a minor correction, like fix a typo or similar,
|
||||
feel free to just make a pull request directly.
|
||||
|
||||
There is a code of conduct. Please follow it in all your interactions with the project.
|
||||
The following contributions are welcome:
|
||||
|
||||
## Pull Request Process
|
||||
* Bugfixes for new or existing bugs. Please also report new bugs in the issue tracker even if you
|
||||
also provide a fix. It makes it easier to keep track of what has been fixed and when.
|
||||
* Translations via the [crowdin project page](https://crowdin.com/project/novelwriter).
|
||||
* Improvements to the documentation. Particularly if the documentation is unclear. Please don't
|
||||
make any larger changes to the documentation without discussing if with the maintainer first.
|
||||
* Adaptations, installation or packaging features targeting specific operating systems.
|
||||
|
||||
1. Make sure your code passes all tests and conforms to the style guide. You can check that the code
|
||||
conforms by running `flake8` from the root of the project folder.
|
||||
2. Please provide a complete description of the changes in the pull request, and a summary that can
|
||||
be copied into the [CHANGELOG](CHANGELOG.md). Remember to reference any issue related by
|
||||
providing the issue number.
|
||||
3. Do not change the version number unless asked to do so. Version numbers are bumped in separate
|
||||
release pull requests by the maintainer.
|
||||
Please do not:
|
||||
|
||||
* Make a pull request that restructures or reformats existing code. If you think some parts of the
|
||||
code could be improved, please make an issue thread or start a discussion. The same applies to
|
||||
any text document in the repository.
|
||||
|
||||
## Pull Requests
|
||||
|
||||
This project follows the [OneFlow](https://www.endoflineblog.com/oneflow-a-git-branching-model-and-workflow)
|
||||
model. The `main` branch is the default branch. For general changes, please make a new branch in
|
||||
your own fork from the current `main` branch. Do not make pull requests from your own `main`
|
||||
branch.
|
||||
|
||||
**Note:** If your contribution is a bugfix for a specific version, please make a bugfix branch from
|
||||
the tag you want the fix to be applied to, not directly from the `main` branch. This is important.
|
||||
|
||||
Also check the following:
|
||||
|
||||
* Make sure your code passes all tests and conforms to the style guide. You can check that the
|
||||
code generally conforms by running the Python linting tool `flake8` from the root of the project
|
||||
folder, although it doesn't check everything. The same check is also run on pull requests by the
|
||||
maintainer.
|
||||
* Please provide a description of the changes in the pull request under the summary section of the
|
||||
pull request template, and reference any related issues by providing the issue number.
|
||||
* Do not change the version number.
|
||||
* Do not submit files that were not actively changed but have otherwise been modifed. This is
|
||||
mostly an issue with translation files. The language tool may update all files in the `i18n`
|
||||
folder.
|
||||
|
||||
## Code of Conduct
|
||||
|
||||
There is a code of conduct. Please follow it in all your interactions with the project.
|
||||
|
||||
### 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, gender identity and expression, level
|
||||
of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
everyone, regardless of age, body size, disability, ethnicity, gender identity and expression,
|
||||
level of experience, nationality, personal appearance, race, religion, or sexual identity and
|
||||
orientation.
|
||||
|
||||
Please see the [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md) file for the full text.
|
||||
|
||||
## Code Style Guide
|
||||
|
||||
The source code of novelWriter broadly follows the [PEP8](https://www.python.org/dev/peps/pep-0008/)
|
||||
style guide , but with a few modifications and exceptions.
|
||||
The source code of novelWriter broadly follows the [PEP8](https://www.python.org/dev/peps/pep-0008)
|
||||
style guide, but with a few exceptions. Some key points are listed below.
|
||||
|
||||
### Linting with flake8
|
||||
**Line Length:**
|
||||
|
||||
An excellent tool for checking Python code for errors and coding style is `flake8`.
|
||||
The documentation is available [here](https://flake8.pycqa.org/en/latest/).
|
||||
* Source code lines can extend to the upper limit of 99 characters allowed by PEP8. 79 characters
|
||||
is the recommended line length in PEP8, but this is often too restrictive. 99 characters are
|
||||
acceptable when that is more practical. Readability has priority. Generally, if a code statement
|
||||
requires multiple lines, the lines should wrap at 79 characters if possible. If wrapping can be
|
||||
avoided by going to 99, then that is generally preferrable.
|
||||
* For text files, the text should be wrapped at 99 character. The exception is markdown image tags
|
||||
and urls which can run past that limit.
|
||||
|
||||
The `setup.cfg` file in the root of this project has the following settings:
|
||||
**Variable and Function Names**
|
||||
|
||||
* PEP8 allows for camelCase for consistency with existing code. The Qt library uses camelCase, so
|
||||
the Python source code does too.
|
||||
* The exception to the above is for constants. They should always be in upper snake case, like PEP8
|
||||
states.
|
||||
|
||||
**Spaces, Indentation and Alignment**
|
||||
|
||||
* Only indentation by multiples of 4 spaces is allowed.
|
||||
* No trailing spaces should occur on any line in the source code, including empty lines.
|
||||
* Ideally, a function should end on the same indention level as it started. Exceptions are allowed
|
||||
if it makes the code easier to follow.
|
||||
* Aligning operators and attributes in columns with multiple spaces is not allowed by PEP8. The
|
||||
rule is relaxed a bit here. Alignment is allowed when populating large dictionaries or setting
|
||||
many class attributes. It does improve readability in such cases, but should not be overused.
|
||||
|
||||
### Linting with `flake8`
|
||||
|
||||
A good tool for checking Python code for errors and code style is `flake8`. The documentation is
|
||||
available [here](https://flake8.pycqa.org/en/latest/).
|
||||
|
||||
The `setup.cfg` file in the root of this project has the following settings for `flake8` that
|
||||
matches the above code style:
|
||||
```conf
|
||||
[flake8]
|
||||
ignore = E203,E221,E226,E228,E241,E251,E261,E266,E302,E305
|
||||
ignore = E133,E221,E226,E228,E241,W503
|
||||
max-line-length = 99
|
||||
exclude = docs/*
|
||||
```
|
||||
|
||||
The command line equivalent, with reporting, is:
|
||||
```bash
|
||||
flake8 . --count --ignore E203,E221,E226,E228,E241,E251,E261,E266,E302,E305 --max-line-length=99 --show-source --statistics
|
||||
flake8 . --count --ignore E133,E221,E226,E228,E241,W503 --max-line-length=99 --show-source --statistics
|
||||
```
|
||||
|
||||
Passing this check is required before contributions are merged into the `main` branch. This is
|
||||
checked automatically when you make a pull request. You can run the `flake8` command locally to
|
||||
check beforehand. The full command will give you a detailed description of the code lines that do
|
||||
not conform to the standard.
|
||||
Passing this check is required before contributions are merged. This is checked automatically when
|
||||
you make a pull request. You can run the `flake8` command locally to check beforehand. The full
|
||||
command will give you a detailed description of the code lines that do not conform to the standard.
|
||||
|
||||
## Ignored Errors
|
||||
Two of the ignored errors are due to the relaxed restriction on column alignment, these are the
|
||||
E221 and E241 error codes.
|
||||
|
||||
Some errors are ignored in novelWriter, for various reasons. In addition, novelWriter uses camelCase
|
||||
function and variable names due to this being the standard for the Qt libraries, and also because of
|
||||
the author's personal preferences.
|
||||
|
||||
The reason behind the other ignored error codes are listed below. Many of them are due to PEP8 not
|
||||
permitting column alignment as opposed to many other coding styles. I find them useful in regions of
|
||||
bulk value assignments. There's a reason why tables are more readable than lists. They should be
|
||||
used sparingly though.
|
||||
|
||||
The ignored errors are all `pycodestyle` errors, and they are documented
|
||||
[here](https://pycodestyle.pycqa.org/en/latest/intro.html#error-codes).
|
||||
|
||||
**E203:** whitespace before ‘:’
|
||||
**Reason:** Column alignment. It is natural to align dictionary columns along the `:` character.
|
||||
|
||||
**E221:** multiple spaces before operator
|
||||
**Reason:** Column alignment.
|
||||
|
||||
**E226:** missing whitespace around arithmetic operator
|
||||
**Reason:** This doesn't actually follow the PEP8 recommendation of grouping longer equations by
|
||||
operator precedence like `2*a + 3*b` instead of `a * a + 3 * b`. Generally, don't use spaces around
|
||||
`*`, `/` and `**`, but do use spaces around `+` and `-`. For appending strings, the spaces can be
|
||||
dropped. Don't use the `+` operator for appending multiple strings. Use formatting instead.
|
||||
|
||||
**E228** missing whitespace around modulo operator
|
||||
**Reason:** See reason for E226. Formatting `%` like `/` and `*` should be possible.
|
||||
|
||||
**E241:** multiple spaces after ‘,’
|
||||
**Reason:** Column alignment.
|
||||
|
||||
**E251:** unexpected spaces around keyword / parameter equals
|
||||
**Reason:** Column alignment.
|
||||
|
||||
**E261:** at least two spaces before inline comment
|
||||
**Reason:** With syntax highlighting, this one doesn't make much sense.
|
||||
|
||||
**E266:** too many leading ‘#’ for block comment
|
||||
**Reason:** In the source multiple `#`s is sometimes used to indicate importance or heading level,
|
||||
like markdown headers.
|
||||
|
||||
**E302:** expected 2 blank lines, found 0
|
||||
**Reason:** Applies to classes. Instead, end classes with a comment like `# END Class ClassName` to
|
||||
make it easier to see which class just ended. The double line break is then redundant.
|
||||
|
||||
**E305:** expected 2 blank lines after end of function or class
|
||||
**Reason:** Instead, _always_ end a function with a `return`, preferably indented at function
|
||||
level. The end of the function is then clear.
|
||||
The code E226 is ignored becuse it doesn't actually follow the
|
||||
[PEP8 recommendation](https://www.python.org/dev/peps/pep-0008/#other-recommendations)
|
||||
of grouping longer equations by operator precedence like `2*a + 3*b` instead of `a * a + 3 * b`.
|
||||
Generally, don't use spaces around `*`, `/` and `**`, but _do_ use spaces around `+` and `-`.
|
||||
The same applies to the modulo operator `%`, hence E228 is also ignored.
|
||||
|
||||
46
CREDITS.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Credits
|
||||
|
||||
## Main Developer
|
||||
|
||||
* Veronica Berglyd Olsen (@vkbo)
|
||||
|
||||
## Main Contributors
|
||||
|
||||
* Concept: Marian Lückhof (@Number042)
|
||||
* Internationalisation: Bruno Meneguello (@bkmeneguello)
|
||||
|
||||
## Translations
|
||||
|
||||
The default language is English (UK) with English (US) as an option.
|
||||
|
||||
* Dutch: Martijn van der Kleijn (@mvdkleijn)
|
||||
* French: Jan Lüdke (@jyhelle)
|
||||
* German: Myian (@heymyian)
|
||||
* Latin American Spanish: Tommy Marplatt (@tmarplatt)
|
||||
* Norwegian: Veronica Berglyd Olsen (@vkbo)
|
||||
* Portuguese: Bruno Meneguello (@bkmeneguello)
|
||||
* Simplified Chinese: Qianzhi Long (@longqzh)
|
||||
|
||||
## Libraries
|
||||
|
||||
The following libraries are dependencies of novelWriter:
|
||||
|
||||
* Qt5 by [Qt Company](https://www.qt.io/)
|
||||
* PyQt5 by [Riverbank Computing](https://www.riverbankcomputing.com/software/pyqt/)
|
||||
* lxml by [Martijn Faassen](https://lxml.de/)
|
||||
* Enchant by [Dom Lachowicz](https://abiword.github.io/enchant/)
|
||||
* PyEnchant by [Dimitri Merejkowsky](https://pyenchant.github.io/pyenchant/)
|
||||
|
||||
## Assets
|
||||
|
||||
Some of the assets bundled with novelWriter were adapted from the following sources:
|
||||
|
||||
* Typicons icons by [Stephen Hutchings](https://github.com/stephenhutchings/typicons.font) (CC BY-SA 4.0)
|
||||
* Tomorrow syntax themes by Chris Kempson (MIT License)
|
||||
* Owl syntax themes by Sarah Drasner (MIT License)
|
||||
* Solarized themes by Ethan Schoonover, added by @nullbasis (MIT License)
|
||||
|
||||
## Special Mentions
|
||||
|
||||
Additional thanks to @johnblommers who was an early user and who has provided a lot of very useful
|
||||
feedback over the years.
|
||||
@@ -1,4 +1,7 @@
|
||||
include setup.py
|
||||
include LICENSE.md
|
||||
include CREDITS.md
|
||||
include CHANGELOG.md
|
||||
recursive-include setup *
|
||||
recursive-include nw/assets *
|
||||
recursive-include novelwriter/assets *
|
||||
recursive-include sample *.nwx *.nwd
|
||||
|
||||
352
README.md
@@ -1,293 +1,191 @@
|
||||
# novelWriter
|
||||
|
||||
[/badge.svg?branch=main)](https://github.com/vkbo/novelWriter/actions)
|
||||
[/badge.svg?branch=main)](https://github.com/vkbo/novelWriter/actions)
|
||||
[/badge.svg?branch=main)](https://github.com/vkbo/novelWriter/actions)
|
||||
[/badge.svg?branch=main)](https://github.com/vkbo/novelWriter/actions)
|
||||
[/badge.svg?branch=main)](https://github.com/vkbo/novelWriter/actions)
|
||||
[/badge.svg?branch=main)](https://github.com/vkbo/novelWriter/actions)
|
||||
[](https://github.com/vkbo/novelWriter/actions/workflows/test_linux.yml)
|
||||
[](https://github.com/vkbo/novelWriter/actions/workflows/test_win.yml)
|
||||
[](https://github.com/vkbo/novelWriter/actions/workflows/test_mac.yml)
|
||||
[](https://github.com/vkbo/novelWriter/actions)
|
||||
[](https://codecov.io/gh/vkbo/novelWriter)
|
||||
[](https://novelwriter.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://novelwriter.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://github.com/vkbo/novelWriter/releases)
|
||||
[](https://pypi.org/project/novelWriter)
|
||||
[](https://pypi.org/project/novelWriter)
|
||||
[](https://crowdin.com/project/novelwriter)
|
||||
|
||||
<img align="left" style="margin: 0 16px 4px 0;" src="https://raw.githubusercontent.com/vkbo/novelWriter/main/setup/icons/scaled/icon-novelwriter-96.png">
|
||||
<img align="left" style="margin: 0 16px 4px 0;" src="https://raw.githubusercontent.com/vkbo/novelWriter/main/setup/novelwriter.png">
|
||||
|
||||
novelWriter is a Markdown-like text editor designed for writing novels and larger projects of many
|
||||
smaller plain text documents. It uses its own flavour of Markdown that supports a meta data syntax
|
||||
for comments, synopsis, and cross-referencing between files. It's designed to be a simple text
|
||||
editor that allows for easy organisation of text files and notes, built on plain text files for
|
||||
robustness.
|
||||
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's 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.
|
||||
|
||||
The plain text storage is suitable for version control software, and also well suited for file
|
||||
synchronisation tools. The core project structure is stored in a project XML file. Other meta data
|
||||
is primarily saved in JSON files.
|
||||
The project storage is suitable for version control software, and also well suited for file
|
||||
synchronisation tools. All text is saved as plain text files with a meta data header. The core
|
||||
project structure is stored in a single project XML file. Other meta data is primarily saved as
|
||||
JSON files.
|
||||
|
||||
The full documentation is available at
|
||||
[novelwriter.readthedocs.io](https://novelwriter.readthedocs.io/).
|
||||
[novelwriter.readthedocs.io](https://novelwriter.readthedocs.io).
|
||||
|
||||
The contributing guide is available in [CONTRIBUTING](CONTRIBUTING.md).
|
||||
|
||||
|
||||
### Development Status
|
||||
|
||||
The application is still under initial development, but all core features have now been added.
|
||||
The core functionality has been in place for a while, and novelWriter is being used for writing
|
||||
projects by the author and collaborators.
|
||||
|
||||
No new major features will be added at this time, until the application is stable. Until then,
|
||||
novelWriter is in a _beta_ state. Please report any issues you encounter via the repository's issue
|
||||
tracker.
|
||||
|
||||
You should be able to use novelWriter for real projects, but as with all software, please make
|
||||
regular backups of your data. There is a built in backup feature that can pack the entire project
|
||||
into a zip file each time the main window or the project is closed. Please check the documentation
|
||||
for further details.
|
||||
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 using Qt5 via PyQt5. It is developed on Linux, but it should
|
||||
in principle work fine on other operating systems as well as long as dependencies are met. The unit
|
||||
tests are run on the latest versions of Ubuntu Linux, Windows Server 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
|
||||
|
||||
# Installing and Running
|
||||
### Linux Mint, Ubuntu and Debian
|
||||
|
||||
novelWriter is available on [pypi.org](https://pypi.org/project/novelWriter/), and can be installed
|
||||
with:
|
||||
```bash
|
||||
pip install novelwriter
|
||||
```
|
||||
The Releases page has a `.deb` package that should install on Mint, Ubuntu and Debian.
|
||||
|
||||
To upgrade an existing installation, use:
|
||||
```bash
|
||||
pip install --upgrade novelwriter
|
||||
```
|
||||
You can also use the novelWriter [PPA](https://launchpad.net/~vkbo/+archive/ubuntu/novelwriter).
|
||||
For more details, check the [Getting Started](https://novelwriter.readthedocs.io/en/latest/int_started.html)
|
||||
section in the documentation.
|
||||
|
||||
Dependencies are installed automatically, but can generally be installed with:
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
### Windows 10+
|
||||
|
||||
Below are some brief instructions on how to get started on different operating systems.
|
||||
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
|
||||
|
||||
## Linux
|
||||
You can also download and install one of the minimal zip files from the
|
||||
[Releases](https://github.com/vkbo/novelWriter/releases) page or the
|
||||
[novelwriter.io](https://novelwriter.io/) website.
|
||||
The [Getting Started](https://novelwriter.readthedocs.io/en/latest/int_started.html) section of the
|
||||
documentation has detailed install instructions for these packages, and for installation via the
|
||||
Python Package Index.
|
||||
|
||||
Either download the source, or install with pip.
|
||||
## Project Contributions
|
||||
|
||||
If you run from source, install the dependencies via pip, or directly from the OS repo. There are
|
||||
very few dependencies, and they should be available in the standard repo. The Python packages
|
||||
needed are `pyqt5`, `lxml` and `pyenchant`.
|
||||
Please don't make feature pull requests without first having discussed them with the maintainer.
|
||||
You can make a feature request in the issue tracker, or if the idea isn't fully formed, start a
|
||||
discussion on the discussion page. Please also don't make pull requests to reformat or rewrite
|
||||
existing code unless there is a very good reason for doing so.
|
||||
|
||||
### Installing from Source
|
||||
Fixes and patches are welcome. Contributions related to packaging and installing novelWriter will
|
||||
also be appreciated, but please make an issue or a discussion topic first. Before contributing any
|
||||
code, please also read the full
|
||||
[Contributing Guide](https://github.com/vkbo/novelWriter/blob/main/CONTRIBUTING.md).
|
||||
|
||||
You can also install novelWriter from source with:
|
||||
```bash
|
||||
python3 setup.py sample
|
||||
sudo python3 setup.py install
|
||||
sudo python3 setup.py launcher
|
||||
```
|
||||
### Translations
|
||||
|
||||
The last line will install the application icons and set up a launcher for novelWriter. The method
|
||||
uses hardcoded paths, so it may or may not work for your Linux distro. If you have any issues,
|
||||
please submit a ticket so the script can be tuned.
|
||||
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.
|
||||
|
||||
The script may prompt you to choose which executable to configure if it finds more than one.
|
||||
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).
|
||||
|
||||
### Running from Source
|
||||
## Key Features
|
||||
|
||||
If you want to run directly from the source, the application can be started with:
|
||||
```bash
|
||||
./novelWriter.py
|
||||
```
|
||||
Some key features of novelWriter are listed below. The
|
||||
[documentation](https://novelwriter.readthedocs.io) has a lot more information.
|
||||
|
||||
You can also create a launcher for running directly from source with:
|
||||
```bash
|
||||
python3 setup.py xdg-install
|
||||
```
|
||||
This will install the launcher and icons for the current user. To install them system-wide, run the
|
||||
above command with `sudo` or as root.
|
||||
### Formatting Codes
|
||||
|
||||
For more install options, see [Build and Install novelWriter](setup/README.md).
|
||||
Although novelWriter is a plain text editor, it uses a Markdown-like syntax to allow for a minimal
|
||||
set of formatting that is useful for the specific task of writing novels.
|
||||
|
||||
| Code | Usage | Description |
|
||||
|------------|----------|-------------|
|
||||
| `#` | Prefix | Headings level 1 to 4. |
|
||||
| `_` | Wrapped | Emphasised (italicised) text. |
|
||||
| `**` | Wrapped | Strongly emphasised (bold) text. |
|
||||
| `~~` | Wrapped | Strikethrough text. |
|
||||
| `%` | Prefix | A comment; does not count towards the word count.<sup>1</sup> |
|
||||
| `@` | Prefix | The following text is parsed as a keyword/value command for meta data. |
|
||||
| `>` | Prefix | The paragraph is indented one tab width from the left. |
|
||||
| `<` | Suffix | The paragraph is indented one tab width from the right. |
|
||||
| `>>` | Prefix | The paragraph is right-aligned. |
|
||||
| `<<` | Suffix | The paragraph is left-aligned. |
|
||||
| `>>`, `<<` | Wrapped | The paragraph is centred. |
|
||||
|
||||
## macOS
|
||||
<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.
|
||||
|
||||
These instructions assume you're using brew, and have Python and pip set up. If not, see the
|
||||
[brew docs](https://docs.brew.sh/Homebrew-and-Python) for help.
|
||||
### Export Formats
|
||||
|
||||
Main requirements are installed via the requirements file. You also need to install the `pyobjc`
|
||||
package on macOS, so you must run:
|
||||
```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.
|
||||
```bash
|
||||
brew install enchant
|
||||
```
|
||||
|
||||
## Windows
|
||||
|
||||
On Windows, you may first need to install Python. See the [python.org](https://www.python.org/)
|
||||
website for download packages. It is recommended that you install the latest version of Python 3.8.
|
||||
|
||||
To install dependencies, run:
|
||||
```bash
|
||||
pip install --user -r requirements.txt
|
||||
```
|
||||
|
||||
**Note:** On Windows, make sure Python3 is in your PATH if you want to launch novelWriter from
|
||||
command line. You can also right click the `novelWriter.py` file, create a shortcut, then right
|
||||
click again, select "Properties" and change the target to your python executable and
|
||||
`novelWriter.py`.
|
||||
|
||||
It should look something like this:
|
||||
```
|
||||
C:\...\AppData\Local\Programs\Python\Python38\python.exe novelWriter.py
|
||||
```
|
||||
|
||||
You can also run the `make.py` script to generate a single executable, or an installer.
|
||||
See [Build and Install novelWriter](setup/README.md) for more details.
|
||||
|
||||
|
||||
## Package Versions
|
||||
|
||||
Exporting to Markdown requires PyQt/Qt 5.14. There are no known minimum for `lxml`, but the code
|
||||
was originally written with 4.2. The optional spell check library must be at least 3.0.0 to work
|
||||
with Windows 64 bit systems. On Linux, 2.0.0 also works fine.
|
||||
|
||||
If no external spell checking tool is installed, novelWriter will use a basic spell checker based
|
||||
on standard Python package `difflib`. Currently, only English dictionaries are available for this
|
||||
spell checker, but more can be added to the `nw/assets/dict` folder. See the
|
||||
[README](nw/assets/dict/README.md) file in that folder for how to generate more dictionaries. Note
|
||||
that the difflib-based option is both slow and limited.
|
||||
|
||||
## Debugging
|
||||
|
||||
If you need to debug novelWriter, you must run it from command line. It takes a few parameters,
|
||||
which can be listed with the switch `--help`. The `--info`, `--debug` or `--verbose` flags are
|
||||
particularly useful for increasing logging output for debugging.
|
||||
|
||||
|
||||
# Key Features
|
||||
|
||||
Some features of novelWriter are listed below. Consult the documentation for more information.
|
||||
|
||||
### Markdown Flavour
|
||||
|
||||
novelWriter is _not_ a full-feature Markdown editor. It allows for a minimal set of formatting
|
||||
needed for writing text documents for novels. These are currently limited to:
|
||||
|
||||
* Headings level 1 to 4 using the `#` syntax only.
|
||||
* Emphasised and strong text. These are rendered as italicised and bold.
|
||||
* Strikethrough text.
|
||||
* Hard line breaks using two or more spaces at the end of a line.
|
||||
|
||||
That is it. Features not supported in the editor are also not exported when using the export tool.
|
||||
|
||||
In addition, novelWriter adds the following, which is otherwise not supported by Markdown:
|
||||
|
||||
* A line starting with `%` is treated as a comment and not rendered on exports unless requested.
|
||||
Comments do not count towards the word count. If the first word of the comment is `synopsis:`,
|
||||
the comment is indexed and treated as the synopsis for the section of text under the same header.
|
||||
These synopsis comments can be used to build an outline and exported to external documents.
|
||||
* A set of meta data keyword/values starting with the character `@`. This is used for tagging
|
||||
and inter-linking documents, and can be used to generate a project outline.
|
||||
* Non-breaking spaces are supported as long as your system is using at least Qt 5.9. For earlier
|
||||
version, non-breaking spaces are converted to normal spaces when saving the document. This is
|
||||
done by the Qt library.
|
||||
* Thin spaces are also supported, as well as non-breaking thin spaces, with the same library
|
||||
version restriction as above.
|
||||
* Tabs can be used in the text, and should be properly aligned. The width of a tab in pixels can be
|
||||
changed in Preferences. Note that for the HTML format, most browsers will treat a tab as a space,
|
||||
so it may not show up like expected. If you import the HTML file to Libre Office, for instance,
|
||||
they should appear as expected.
|
||||
|
||||
The core export format of novelWriter is HTML5. You can also export the entire project as a single
|
||||
novelWriter Markdown-flavour document. In addition, other exports to Open Document, PDF, and plain
|
||||
text is offered through the Qt library, although with limitations to formatting.
|
||||
|
||||
The HTML format is well suited for file conversion tools and import into other text editors.
|
||||
The core export formats of novelWriter are Open Document and HTML5. Open Document is an open
|
||||
standard for office type documents that is supported by most office applications. See
|
||||
[Open Document > Application Support](https://en.wikipedia.org/wiki/OpenDocument#Application_support)
|
||||
for more details.
|
||||
|
||||
You can also export the entire project as a single novelWriter-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.
|
||||
|
||||
### Colour Themes
|
||||
|
||||
The editor has syntax highlighting for the features it supports, and includes a set of different
|
||||
syntax highlighting themes. The GUI also has an optional dark theme in addition to the default
|
||||
system theme.
|
||||
|
||||
New themes can easily be added to the `nw/assets/themes` folder. Have a look in the existing
|
||||
folders for examples of how to define the colours.
|
||||
|
||||
syntax highlighting themes. Optional GUI themes are also available, including dark themes.
|
||||
|
||||
### Easy Organising of Project Files
|
||||
|
||||
The structure of the project is shown on the left hand side of the main GUI. Project files are
|
||||
The structure of the project is shown on the left hand side of the main window. Project files are
|
||||
organised into root folders, indicating what class of file they are. The most important root folder
|
||||
is the Novel folder, which contains all of the files that makes up the finished novel. Each root
|
||||
folder can have subfolders. Folders have no impact on the final project structure, they are purely
|
||||
tools for organising the files in whatever way the user needs.
|
||||
is the `Novel` folder, which contains all of the files that make up the novel itself. Each root
|
||||
folder can have subfolders. Subfolders have no impact on the final project structure, they are
|
||||
there for you to organise your files in whatever way you want.
|
||||
|
||||
The editor supports four levels of headings, which determines what level the following text belongs
|
||||
The editor supports four levels of headings, which determine what level the following text belongs
|
||||
to. Headings of level one signify a book or partition title. Headings of level two signify the
|
||||
start of a new chapter. Headings of level three signify the start of a new scene. Headings of level
|
||||
four can be used internally in each scene to separate sections.
|
||||
four can be used internally in each scene to create separate sections.
|
||||
|
||||
Each novel file can be assigned a layout format, which shows up as a flag next to the item in the
|
||||
project tree. These are mostly to help the user track what they contain, but they also have some
|
||||
impact on the format of the exported document. See the documentation for further details.
|
||||
See the [documentation](https://novelwriter.readthedocs.io) for further details.
|
||||
|
||||
### Project Notes
|
||||
|
||||
#### Project Notes
|
||||
|
||||
Supporting note files can be added for the story plot, characters, locations, story timeline, etc.
|
||||
These have their separate root folders. These are optional files.
|
||||
|
||||
Supporting notes can be added for the story plot, characters, locations, story timeline, etc. These
|
||||
have their separate root folders and are optional to use.
|
||||
|
||||
### Visualisation of Story Elements
|
||||
|
||||
The different notes can be assigned tags, which other files can refer back to using the `@` meta
|
||||
keywords. This information can be used to display an outline of the story, showing where each scene
|
||||
connects to the plot, and which characters, etc. occur in them. In addition, the tags themselves
|
||||
are clickable in the document view pane, and control-clickable in the editor. They make it possible
|
||||
to quickly navigate between the documents while editing.
|
||||
The different notes can be assigned tags, which other files can refer back to using `@`-prefixed
|
||||
meta keywords. This information can be used to display an outline of the story, showing where each
|
||||
scene connects to the plot, and which characters, etc. occur in them. In addition, the tags
|
||||
themselves are clickable in the document view pane, and control-clickable in the editor. They make
|
||||
it possible to quickly navigate between the documents while writing.
|
||||
|
||||
## Installing or Running from Source
|
||||
|
||||
## Licenses
|
||||
If you want to run novelWriter directly from the source code, you must run the `novelWriter.py`
|
||||
file from command line.
|
||||
|
||||
This is Open Source software, and novelWriter is licensed under GPLv3. See the
|
||||
Dependencies can generally be installed from PyPi with:
|
||||
```bash
|
||||
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).
|
||||
|
||||
## Debugging
|
||||
|
||||
If you need to debug novelWriter, you must run it from the command line. It takes a few parameters,
|
||||
which can be listed with the switch `--help`. The `--info`, `--debug` or `--verbose` flags are
|
||||
particularly useful for increasing logging output for debugging.
|
||||
|
||||
## Licence
|
||||
|
||||
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](LICENSE.md) file.
|
||||
details, or consult the [LICENSE](https://github.com/vkbo/novelWriter/blob/main/LICENSE.md) file.
|
||||
|
||||
Bundled assets have the following licenses:
|
||||
Bundled assets and their licences are listed in
|
||||
[CREDITS](https://github.com/vkbo/novelWriter/blob/main/CREDITS.md).
|
||||
|
||||
* The Typicon-based icon themes by Stephen Hutchings are licensed under
|
||||
[CC BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/). The icons have been altered in
|
||||
size and colour for use with novelWriter, and some additional icons added. The original icon set
|
||||
is available at
|
||||
[stephenhutchings/typicons.font](https://github.com/stephenhutchings/typicons.font).
|
||||
* The Cantarell font by Dave Crossland is licensed under
|
||||
[OPEN FONT LICENSE Version 1.1](http://scripts.sil.org/OFL).
|
||||
It is available at [Google Fonts](https://fonts.google.com/specimen/Cantarell).
|
||||
* The Tomorrow syntax themes use colour schemes taken from Chris Kempson's collection of code
|
||||
editor themes, licensed with the
|
||||
[MIT License](https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.md),
|
||||
and the main repo is available at
|
||||
[chriskempson/tomorrow-theme](https://github.com/chriskempson/tomorrow-theme).
|
||||
* Likewise, the Owl syntax themes use colours from Sarah Drasner's code editor themes, licensed
|
||||
with the [MIT License](https://github.com/sdras/night-owl-vscode-theme/blob/master/LICENSE), and
|
||||
the main repo is available at
|
||||
[sdras/night-owl-vscode-theme](https://github.com/sdras/night-owl-vscode-theme).
|
||||
|
||||
|
||||
## Screenshot
|
||||
## Screenshots
|
||||
|
||||
**novelWriter with default system theme:**
|
||||

|
||||
|
||||
2119
docs/FileFormatSpec-1.5.fodt
Normal file
@@ -1,23 +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;
|
||||
}
|
||||
BIN
docs/source/_static/fileformatspec15.pdf
Normal file
BIN
docs/source/_static/novelwriter-dark.png
Normal file
|
After Width: | Height: | Size: 32 KiB |
BIN
docs/source/_static/novelwriter-light.png
Normal file
|
After Width: | Height: | Size: 23 KiB |
@@ -1,117 +1,88 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
#
|
||||
# Configuration file for the Sphinx documentation builder.
|
||||
#
|
||||
# This file does only contain a selection of the most common options. For a
|
||||
# full list see the documentation:
|
||||
# http://www.sphinx-doc.org/en/master/config
|
||||
|
||||
# -- Path setup --------------------------------------------------------------
|
||||
|
||||
# If extensions (or modules to document with autodoc) are in another directory,
|
||||
# add these directories to sys.path here. If the directory is relative to the
|
||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||
#
|
||||
# import sys
|
||||
# sys.path.insert(0, os.path.abspath("."))
|
||||
|
||||
# -- Imports -----------------------------------------------------------------
|
||||
|
||||
import os
|
||||
import time
|
||||
import sphinx_rtd_theme # noqa: F401
|
||||
import datetime
|
||||
|
||||
# -- Project information -----------------------------------------------------
|
||||
# -- Project Information -----------------------------------------------------
|
||||
|
||||
project = "novelWriter"
|
||||
copyright = "2018–2021, Veronica Berglyd Olsen"
|
||||
copyright = f"{datetime.date.today().year}, Veronica Berglyd Olsen"
|
||||
author = "Veronica Berglyd Olsen"
|
||||
|
||||
# The short X.Y version
|
||||
version = "1.0"
|
||||
# The full version, including alpha/beta/rc tags
|
||||
release = "1.0"
|
||||
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 ---------------------------------------------------
|
||||
# -- 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 -------------------------------------------------
|
||||
|
||||
# -- 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>"
|
||||
|
||||
# Custom sidebar templates, must be a dictionary that maps document names
|
||||
# to template names.
|
||||
# The default sidebars (for documents that don"t match any pattern) are
|
||||
# defined by theme itself. Builtin themes are using these templates by
|
||||
# default: ``["localtoc.html", "relations.html", "sourcelink.html",
|
||||
# "searchbox.html"]``.
|
||||
# html_sidebars = {}
|
||||
|
||||
|
||||
# -- Options for HTMLHelp output ---------------------------------------------
|
||||
# -- Options for HTMLHelp Output ---------------------------------------------
|
||||
|
||||
# Output file base name for HTML help builder.
|
||||
htmlhelp_basename = "novelWriterDoc"
|
||||
|
||||
|
||||
# -- Options for LaTeX output ------------------------------------------------
|
||||
# -- Options for LaTeX Output ------------------------------------------------
|
||||
|
||||
latex_elements = {
|
||||
# The paper size ("letterpaper" or "a4paper").
|
||||
#
|
||||
# "papersize": "letterpaper",
|
||||
|
||||
# The font size ("10pt", "11pt" or "12pt").
|
||||
#
|
||||
# "pointsize": "10pt",
|
||||
|
||||
# Additional stuff for the LaTeX preamble.
|
||||
#
|
||||
# "preamble": "",
|
||||
|
||||
# Latex figure (float) alignment
|
||||
#
|
||||
# "figure_align": "htbp",
|
||||
"papersize": "a4paper",
|
||||
"pointsize": "11pt",
|
||||
"preamble": (
|
||||
"\\usepackage[utf8]{inputenc}\n"
|
||||
"\\DeclareUnicodeCharacter{2212}{\\textendash}\n"
|
||||
),
|
||||
"figure_align": "htbp",
|
||||
}
|
||||
|
||||
# Grouping the document tree into LaTeX files. List of tuples
|
||||
# (source start file, target name, title,
|
||||
# author, documentclass [howto, manual, or own class]).
|
||||
latex_documents = [(
|
||||
master_doc, "novelWriter.tex", "novelWriter Documentation",
|
||||
master_doc, "manual.tex", "novelWriter Documentation",
|
||||
author, "manual"
|
||||
)]
|
||||
|
||||
|
||||
# -- Options for manual page output ------------------------------------------
|
||||
# -- Options for Man Page Output ---------------------------------------------
|
||||
|
||||
# One entry per manual page. List of tuples
|
||||
# (source start file, name, description, authors, manual section).
|
||||
@@ -119,8 +90,7 @@ man_pages = [(
|
||||
master_doc, "novelwriter", "novelWriter Documentation", [author], 1
|
||||
)]
|
||||
|
||||
|
||||
# -- Options for Texinfo output ----------------------------------------------
|
||||
# -- Options for Texinfo Output ----------------------------------------------
|
||||
|
||||
# Grouping the document tree into Texinfo files. List of tuples
|
||||
# (source start file, target name, title, author,
|
||||
@@ -130,8 +100,7 @@ texinfo_documents = [(
|
||||
"novelWriter", "Markdown-like editor for novels.", "Miscellaneous"
|
||||
)]
|
||||
|
||||
|
||||
# -- Options for Epub output -------------------------------------------------
|
||||
# -- Options for EPub Output -------------------------------------------------
|
||||
|
||||
# Bibliographic Dublin Core info.
|
||||
epub_title = project
|
||||
|
||||
|
Before Width: | Height: | Size: 22 KiB |
BIN
docs/source/images/novelwriter_logo.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
docs/source/images/python_powered.png
Normal file
|
After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 423 KiB After Width: | Height: | Size: 534 KiB |
|
Before Width: | Height: | Size: 431 KiB After Width: | Height: | Size: 539 KiB |
BIN
docs/source/images/screenshot_multi.png
Normal file
|
After Width: | Height: | Size: 379 KiB |
@@ -1,90 +1,90 @@
|
||||
#####################
|
||||
novelWriter |release|
|
||||
#####################
|
||||
#############################
|
||||
Documentation for novelWriter
|
||||
#############################
|
||||
|
||||
.. image:: https://github.com/vkbo/novelWriter/workflows/python%203.8/badge.svg?branch=main
|
||||
:target: https://github.com/vkbo/novelWriter/actions
|
||||
:alt: Python Tests
|
||||
.. image:: images/novelwriter_logo.png
|
||||
:align: right
|
||||
:width: 48
|
||||
|
||||
.. image:: https://codecov.io/gh/vkbo/novelWriter/branch/main/graph/badge.svg
|
||||
:target: https://codecov.io/gh/vkbo/novelWriter
|
||||
:alt: Code Coverage
|
||||
| **For Release:** |release|
|
||||
| **Last Updated:** |today|
|
||||
|
|
||||
|
||||
.. image:: https://readthedocs.org/projects/novelwriter/badge/?version=latest
|
||||
:target: https://novelwriter.readthedocs.io/en/latest/?badge=latest
|
||||
:alt: Documentation
|
||||
novelWriter is an open source plain text editor designed for writing novels assembled from many
|
||||
smaller text documents. It uses a minimal formatting syntax inspired by Markdown, and adds a meta
|
||||
data syntax for comments, synopsis, and cross-referencing. It is designed to be a simple text
|
||||
editor that allows for easy organisation of text and notes, using human readable text files as
|
||||
storage for robustness.
|
||||
|
||||
.. image:: https://img.shields.io/github/v/release/vkbo/novelwriter
|
||||
:target: https://github.com/vkbo/novelWriter/releases
|
||||
:alt: GitHub Release
|
||||
.. figure:: images/screenshot_multi.png
|
||||
:align: center
|
||||
:width: 500
|
||||
|
||||
.. image:: https://img.shields.io/pypi/v/novelwriter
|
||||
:target: https://pypi.org/project/novelWriter/
|
||||
:alt: PyPI
|
||||
|
||||
.. image:: https://img.shields.io/pypi/pyversions/novelwriter
|
||||
:target: https://pypi.org/project/novelWriter/
|
||||
:alt: Python Version
|
||||
|
||||
**Last Updated:** |today|
|
||||
|
||||
novelWriter is a markdown-like text editor designed for writing novels and larger projects of many
|
||||
smaller plain text documents. It uses its own flavour of markdown that supports a meta data syntax
|
||||
for comments, synopsis and cross-referencing between documents. The idea is to have a simple text
|
||||
editor which allows for easy organisation of text documents and notes, built on a plain text file
|
||||
project repository for robustness.
|
||||
|
||||
The plain text storage is suitable for version control software, and also well suited for file
|
||||
synchronisation tools. The core project structure is stored in a single project XML file. Other
|
||||
meta data is primarily saved as JSON files.
|
||||
The project storage is suitable for version control software, and also well suited for file
|
||||
synchronisation tools. All text is saved as plain text files with a meta data header. The core
|
||||
project structure is stored in a single project XML file. Other meta data is primarily saved as
|
||||
JSON files. See the :ref:`a_breakdown_storage` section for more details.
|
||||
|
||||
Any operating system that can run Python 3 and has the Qt 5 libraries should be able to run
|
||||
novelWriter. It runs fine on Linux, Windows and macOS, and users have tested it on other platforms
|
||||
too. novelWriter can be run directly from the Python source, or installed from the pip tool or via
|
||||
the provided setup script. A setup.exe is provided for Windows. See :ref:`a_started` for further
|
||||
details.
|
||||
as well. novelWriter can also be run directly from the Python source, or installed from packages or
|
||||
the pip tool. See :ref:`a_started` for more details.
|
||||
|
||||
.. note::
|
||||
Version 1.5 introduced a few changes that will require you to make some minor modifications to
|
||||
some of the headings in your project. It should be fairly quick and straightforward. Please see
|
||||
the :ref:`a_prjfmt_1_3` section for more details.
|
||||
|
||||
**Useful Links**
|
||||
|
||||
* Website: https://novelwriter.io
|
||||
* Documentation: https://novelwriter.readthedocs.io
|
||||
* Internationalisation: https://crowdin.com/project/novelwriter
|
||||
* Source Code: https://github.com/vkbo/novelWriter
|
||||
* Source Releases: https://github.com/vkbo/novelWriter/releases
|
||||
* Issue Tracker: https://github.com/vkbo/novelWriter/issues
|
||||
* Feature Discussions: https://github.com/vkbo/novelWriter/discussions
|
||||
* PyPi Project: https://pypi.org/project/novelWriter
|
||||
|
||||
* Social Media: https://fosstodon.org/@novelwriter
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: First Steps
|
||||
:maxdepth: 1
|
||||
:caption: Introduction
|
||||
:hidden:
|
||||
|
||||
int_introduction
|
||||
int_overview
|
||||
int_started
|
||||
int_interface
|
||||
int_typography
|
||||
|
||||
int_source
|
||||
int_customise
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Writing Novels
|
||||
|
||||
write_projects
|
||||
write_structure
|
||||
write_notes
|
||||
write_export
|
||||
: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: 1
|
||||
:caption: Under the Hood
|
||||
:hidden:
|
||||
|
||||
tech_technical
|
||||
|
||||
|
||||
Indices and Tables
|
||||
==================
|
||||
|
||||
* :ref:`genindex`
|
||||
* :ref:`modindex`
|
||||
* :ref:`search`
|
||||
tech_locations
|
||||
tech_storage
|
||||
tech_tests
|
||||
|
||||
65
docs/source/int_customise.rst
Normal 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.
|
||||
@@ -1,439 +0,0 @@
|
||||
.. _a_ui:
|
||||
|
||||
**************
|
||||
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.
|
||||
|
||||
.. _a_ui_tree:
|
||||
|
||||
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:
|
||||
|
||||
:guilabel:`Label`
|
||||
The first column shows the item icon and its label. The labels can be edited from the
|
||||
:guilabel:`Project` menu, or by pressing :kbd:`F2` or :kbd:`Ctrl`:kbd:`E`. The label is not the
|
||||
same as the title you set inside the document, but it will appear in the header above the
|
||||
document text itself.
|
||||
|
||||
:guilabel:`Words`
|
||||
The second column shows the word count of the document, or the sum of words in the child items
|
||||
if it is a folder. If the counts seem incorrect, they can be updated by rebuilding the project
|
||||
index from the :guilabel:`Tools` menu, or by pressing :kbd:`F9`.
|
||||
|
||||
:guilabel:`Inc`
|
||||
The third column indicates whether the document is included in the final project build or not.
|
||||
You may want to filter out documents that you no longer want to keep in the final manuscript,
|
||||
but want to keep in the project for reference.
|
||||
|
||||
:guilabel:`Flags`
|
||||
The fourth column shows various meta data flags for the item. The first is an icon indicating
|
||||
the importance or status of the document. These are colour coded status levels that you control
|
||||
and define yourself. They can be changed in :guilabel:`Project Settings` from the
|
||||
:guilabel:`Project` menu. The first character after the icon indicates the class of the item,
|
||||
that is ``N`` for **Novel**, ``C`` for **Character**, etc (see :ref:`a_struct_tags`). The second
|
||||
character indicates the document layout type (see :ref:`a_proj_roots`).
|
||||
|
||||
Below the project tree you will find a small details panel showing the full information of the
|
||||
currently selected item. This panel also includes the latest paragraph and character counts in
|
||||
addition to the word count.
|
||||
|
||||
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.
|
||||
|
||||
|
||||
.. _a_ui_tree_dnd:
|
||||
|
||||
Project Tree Drag and Drop
|
||||
--------------------------
|
||||
|
||||
The project tree allows drag and drop to a certain extent. This feature is primarily intended for
|
||||
rearranging the order of your documents within each root folder, and has only limited support for
|
||||
moving documents elsewhere in the project tree. In general, bulk actions are not allowed. This is
|
||||
deliberate to avoid accidentally messing up your project. The project tree has no undo function.
|
||||
|
||||
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` folder. Notes can be moved freely between root folders.
|
||||
|
||||
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.
|
||||
|
||||
Root folders in the project tree cannot be dragged and dropped at all. If you want to reorder them,
|
||||
you can move them up or down with respect to eachother from the :guilabel:`Tools` menu or the
|
||||
right-click context menu, or by pressing :kbd:`Ctrl`:kbd:`Shift` and the :kbd:`Up` or :kbd:`Down`
|
||||
key.
|
||||
|
||||
|
||||
.. _a_ui_edit:
|
||||
|
||||
Editing and Viewing Documents
|
||||
=============================
|
||||
|
||||
To edit a document, double-click it in the project tree, or press the :kbd:`Return` key while
|
||||
having it selected. This will open the document in the document editor. The editor uses a
|
||||
simplified markdown format. The format is described in the :ref:`a_ui_md` section below. The editor
|
||||
has a maximise button (activates :guilabel:`Distraction Free Mode`) and a close button in the
|
||||
top-right corner.
|
||||
|
||||
Any document in the project tree can also be viewed in parallel in a right hand side document
|
||||
viewer. To view a document, press :kbd:`Ctrl`:kbd:`R`, or select :guilabel:`View Document` in the
|
||||
menu. If you have a middle mouse button, middle-clicking on the document will also open it in the
|
||||
viewer. The document viewed does not have to be the same document currently being edited. However,
|
||||
If you *are* viewing the same document, pressing :kbd:`Ctrl`:kbd:`R` again will update the document
|
||||
with your latest changes. You can also press the reload button in the top-right corner of the view
|
||||
panel next to the close button to achieve the same thing.
|
||||
|
||||
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 the :guilabel:`Preferences` dialog from the :guilabel:`Tools` menu. Clicking on the document
|
||||
title bar will select and reveal its location in the project tree, making it easier to find in a
|
||||
large project.
|
||||
|
||||
Any reference to a tag in the editor can be opened in the viewer by moving the cursor to the label
|
||||
and pressing :kbd:`Ctrl`:kbd:`Return`. 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 that you can navigate with the
|
||||
arrow buttons in the top-left corner of the viewer. If your mouse has navigation buttons, these can
|
||||
be used as well.
|
||||
|
||||
At the bottom of the view panel there is a :guilabel:`References` panel. (If it is hidden, click
|
||||
the icon to reveal it.) This panel will show links to all documents referring back to it, if any
|
||||
has been defined. The :guilabel:`Sticky` button will freeze the content of the panel to the current
|
||||
document, even if you navigate to another document. This is convenient if you want to quickly look
|
||||
through all documents in the list in the :guilabel:`References` panel.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`References` panel relies on an up-to-date index of the project. If anything is
|
||||
missing, or seems wrong, the index can always be rebuilt by selecting :guilabel:`Rebuild Index`
|
||||
from the :guilabel:`Tools` menu, or by pressing :kbd:`F9`.
|
||||
|
||||
|
||||
.. _a_ui_edit_auto:
|
||||
|
||||
Auto-Replace as You Type
|
||||
========================
|
||||
|
||||
A few auto-replace features are supported by the editor. You can control every aspect of the
|
||||
auto-replace feature from :guilabel:`Preferences`.
|
||||
|
||||
.. tip::
|
||||
If you don't like auto-replacement, all symbols inserted by this feature are also available in
|
||||
the :guilabel:`Insert` menu, and via convenient :ref:`a_ui_shortcuts_ins`.
|
||||
|
||||
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, but this feature isn't always
|
||||
accurate.
|
||||
|
||||
.. tip::
|
||||
If the editor changes a symbol when you did not want it to change, pressing :kbd:`Ctrl`:kbd:`Z`
|
||||
immediately after the auto-replacement will undo it without undoing the character you typed.
|
||||
|
||||
|
||||
.. _a_ui_md:
|
||||
|
||||
Markdown Format
|
||||
===============
|
||||
|
||||
The document editor uses a simplified markdown format. That is, it supports basic formatting like
|
||||
emphasis (italic), strong importance (bold) and strikethrough text, as well as four levels of
|
||||
headings.
|
||||
|
||||
Some non-standard markdown features have been added. For instance, novelWriter allows for comments,
|
||||
a synopsis tag, and a set of keyword and value sets used for tags and references.
|
||||
|
||||
|
||||
.. _a_ui_md_head:
|
||||
|
||||
Headings
|
||||
--------
|
||||
|
||||
Four levels of headings are allowed. For documents of layout "Note", they are free to be used as
|
||||
you see fit, but for all other layouts used for the novel text itself, they indicate the structural
|
||||
level of the novel. See :ref:`a_struct_heads` for more details.
|
||||
|
||||
``# Title``
|
||||
Heading level one. If the document is a novel file, the header level indicates the start of a
|
||||
new partition. This heading level can also be used for the title page novel title.
|
||||
|
||||
``## Title``
|
||||
Heading level two. If the document is a novel file, the header level indicates the start of a
|
||||
new chapter.
|
||||
|
||||
``### Title``
|
||||
Heading level three. If the document is a novel file, the header level indicates the start of a
|
||||
new scene.
|
||||
|
||||
``#### Title``
|
||||
Heading level four. If the document is a novel file, the header level indicates the start of a
|
||||
new section.
|
||||
|
||||
.. note::
|
||||
The space after the ``#`` characters is mandatory. The syntax highlighter will change colour and
|
||||
font size when the heading is correctly formatted.
|
||||
|
||||
|
||||
.. _a_ui_md_emph:
|
||||
|
||||
Text Emphasis
|
||||
-------------
|
||||
|
||||
A minimal set of text emphasis styles are supported.
|
||||
|
||||
``_text_``
|
||||
The text is rendered as emphasised text (italicised).
|
||||
|
||||
``**text**``
|
||||
The text is rendered as strongly important text (bold).
|
||||
|
||||
``~~text~~``
|
||||
Strikethrough text.
|
||||
|
||||
In markdown guides it is often recommended to differentiate between strong importance and emphasis
|
||||
by using ``**`` for strong and ``_`` for emphasis, although markdown generally also supports ``__``
|
||||
for strong and ``*`` for emphasis. However, since the differentiation makes the highlighting and
|
||||
conversion significantly simpler and faster, in novelWriter this is a rule, not just a
|
||||
recommendation.
|
||||
|
||||
In addition, the following rules apply:
|
||||
|
||||
1. The emphasis and strikethrough formatting tags do not allow spaces between the words and the tag
|
||||
itself. That is, ``**text**`` is valid, ``**text **`` is not.
|
||||
2. More generally, the delimiters must be on the outer edge of words. That is, ``some **text in
|
||||
bold** here`` is valid, ``some** text in bold** here`` is not.
|
||||
3. If using both ``**`` and ``_`` to wrap the same text, the underscore must be the inner wrapper.
|
||||
This is due to the underscore also being a valid word character, so if they are on the outside,
|
||||
they violate rule 2.
|
||||
4. Text emphasis does not span past line breaks. If you need to add emphasis to multiple lines or
|
||||
paragraphs, you must apply it to each of them in turn.
|
||||
|
||||
|
||||
.. _a_ui_md_comm:
|
||||
|
||||
Comments and Synopsis
|
||||
---------------------
|
||||
|
||||
In addition to these standard markdown features, novelWriter also allows for comments in document.
|
||||
The text of the comment is ignored by the word counter and not exported or, optionally, hidden when
|
||||
viewing the document. If the first word of a comment is ``Synopsis:`` (with the colon), the comment
|
||||
is treated specially and will show up in the :ref:`a_ui_outline` in a dedicated column. The word
|
||||
``synopsis`` is not case sensitive. If it is correctly formatted, the syntax highlighter will
|
||||
indicate this by altering the colour of the word.
|
||||
|
||||
``% text...``
|
||||
A comment. The text is not exported by default (this can be overridden), seen in the Viewer, or
|
||||
counted towards word counts.
|
||||
|
||||
``% Synopsis: text...``
|
||||
A synopsis comment. It is generally treated in the same way as a regular comment, except that it
|
||||
is also captured by the indexing algorithm and displayed in the :ref:`a_ui_outline`. It can also
|
||||
be filtered separately when exporting the project to for instance generate an outline document
|
||||
of the whole project.
|
||||
|
||||
.. note::
|
||||
Only one comment can be flagged as a synopsis comment for each heading. If multiple comments are
|
||||
flagged as synopsis comments, the last one will be used.
|
||||
|
||||
|
||||
.. _a_ui_md_tags:
|
||||
|
||||
Tags and References
|
||||
-------------------
|
||||
|
||||
The document editor supports a minimal set of keywords used for setting tags, and making references
|
||||
between documents. The tags and references can be set once per section defined by a heading. Using
|
||||
them multiple times under the same heading will just override the previous setting.
|
||||
|
||||
``@keyword: value``
|
||||
A keyword argument followed by a value, or a comma separated list of values.
|
||||
|
||||
The available tag and reference keywords are listed in the :ref:`a_struct_tags` section. They can
|
||||
also be inserted at the cursor position in the editor via the :guilabel:`Insert` menu.
|
||||
|
||||
|
||||
.. _a_ui_md_add:
|
||||
|
||||
Additional Markdown and Non-Standard Features
|
||||
---------------------------------------------
|
||||
|
||||
The editor and viewer also supports markdown standard hard line breaks, and preserves non-breaking
|
||||
spaces if running with Qt 5.9 or higher. For older versions, the non-breaking spaces are lost when
|
||||
the document is saved. This is unfortunately hard-coded in the Qt text editor.
|
||||
|
||||
* A hard line break is achieved by leaving two or more spaces at the end of the line.
|
||||
Alternatively, the user can press :kbd:`Ctrl`:kbd:`K`, :kbd:`Return` to insert this.
|
||||
* A non-breaking space is inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Space`.
|
||||
* Thin spaces are also supported, and can be inserted with :kbd:`Ctrl`:kbd:`K`,
|
||||
:kbd:`Shift`:kbd:`Space`.
|
||||
* Non-breaking thin space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`.
|
||||
|
||||
These are all insert features, and the :guilabel:`Insert` menu has more. They are also listed
|
||||
in :ref:`a_ui_shortcuts_ins`.
|
||||
|
||||
Both hard line breaks and non-breaking spaces are highlighted by the syntax highlighter as an
|
||||
alternate coloured background, depending on the selected theme.
|
||||
|
||||
|
||||
.. _a_ui_outline:
|
||||
|
||||
Project Outline View
|
||||
====================
|
||||
|
||||
The project's Outline view is available as the second tab on the right hand side of the main window
|
||||
labelled :guilabel:`Outline`. The outline provides an overview of the novel structure, displaying a
|
||||
tree hierarchy of the elements of the novel, that is, the level 1 to 4 headings.
|
||||
|
||||
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.
|
||||
|
||||
.. 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 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.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`Title` column cannot be disabled or moved.
|
||||
|
||||
The information viewed in the outline is based on the project's main index. While novelWriter does
|
||||
its best to keep the index up to date when content changes, 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 :guilabel:`Synopsis` column of the outline view takes its information from a specially
|
||||
formatted comment. See :ref:`a_ui_md_comm`.
|
||||
|
||||
|
||||
.. _a_ui_shortcuts:
|
||||
|
||||
Keyboard Shortcuts
|
||||
==================
|
||||
|
||||
Most features are available as keyboard shortcuts. These are as follows:
|
||||
|
||||
.. csv-table:: Keyboard Shortcuts
|
||||
:header: "Shortcut", "Description"
|
||||
:widths: 30, 70
|
||||
:class: "tight-table"
|
||||
|
||||
":kbd:`Alt`:kbd:`1`", "Switch focus to the project tree."
|
||||
":kbd:`Alt`:kbd:`2`", "Switch focus to document editor."
|
||||
":kbd:`Alt`:kbd:`3`", "Switch focus to document viewer."
|
||||
":kbd:`Alt`:kbd:`Left`", "Move backward in the view history of the document viewer."
|
||||
":kbd:`Alt`:kbd:`Right`", "Move forward in the view history of the document viewer."
|
||||
":kbd:`Ctrl`:kbd:`.`", "Open menu to correct word under cursor."
|
||||
":kbd:`Ctrl`:kbd:`,`", "Open the :guilabel:`Preferences` dialog."
|
||||
":kbd:`Ctrl`:kbd:`/`", "Change block format to comment."
|
||||
":kbd:`Ctrl`:kbd:`-`", "Strikethrough selected text, or word under cursor."
|
||||
":kbd:`Ctrl`:kbd:`0`", "Remove block formatting for block under cursor."
|
||||
":kbd:`Ctrl`:kbd:`1`", "Change block format to header level 1."
|
||||
":kbd:`Ctrl`:kbd:`2`", "Change block format to header level 2."
|
||||
":kbd:`Ctrl`:kbd:`3`", "Change block format to header level 3."
|
||||
":kbd:`Ctrl`:kbd:`4`", "Change block format to header level 4."
|
||||
":kbd:`Ctrl`:kbd:`A`", "Select all text in the document."
|
||||
":kbd:`Ctrl`:kbd:`B`", "Format selected text, or word under cursor, with strong emphasis (bold)."
|
||||
":kbd:`Ctrl`:kbd:`C`", "Copy selected text to clipboard."
|
||||
":kbd:`Ctrl`:kbd:`D`", "Wrap selected text, or word under cursor, in double quotes."
|
||||
":kbd:`Ctrl`:kbd:`E`", "If in the project tree, edit a document or folder settings. (Same as :kbd:`F2`.)"
|
||||
":kbd:`Ctrl`:kbd:`F`", "Open the search bar and search for the selected word, if any is selected."
|
||||
":kbd:`Ctrl`:kbd:`G`", "Find next occurrence of search word in current document. (Same as :kbd:`F3`.)"
|
||||
":kbd:`Ctrl`:kbd:`H`", "Open the search and replace bar and search for the selected word, if any is selected. (On Mac, this is :kbd:`Cmd`:kbd:`=`.)"
|
||||
":kbd:`Ctrl`:kbd:`I`", "Format selected text, or word under cursor, with emphasis (italic)."
|
||||
":kbd:`Ctrl`:kbd:`K`", "Activate the insert commands. The commands are listed in :ref:`a_ui_shortcuts_ins`."
|
||||
":kbd:`Ctrl`:kbd:`N`", "Create new document."
|
||||
":kbd:`Ctrl`:kbd:`O`", "Open selected document."
|
||||
":kbd:`Ctrl`:kbd:`Q`", "Exit novelWriter."
|
||||
":kbd:`Ctrl`:kbd:`R`", "If in the project tree, open a document for viewing. If the editor has focus, open current document for viewing."
|
||||
":kbd:`Ctrl`:kbd:`S`", "Save the current document in the document editor."
|
||||
":kbd:`Ctrl`:kbd:`V`", "Paste text from clipboard to cursor position."
|
||||
":kbd:`Ctrl`:kbd:`W`", "Close the current document in the document editor."
|
||||
":kbd:`Ctrl`:kbd:`X`", "Cut selected text to clipboard."
|
||||
":kbd:`Ctrl`:kbd:`Y`", "Redo latest undo."
|
||||
":kbd:`Ctrl`:kbd:`Z`", "Undo latest changes."
|
||||
":kbd:`Ctrl`:kbd:`F7`", "Toggle spell checking."
|
||||
":kbd:`Ctrl`:kbd:`F10`", "Toggle automatic updating of project outline."
|
||||
":kbd:`Ctrl`:kbd:`Del`", "If in the project tree, move a document to trash, or delete a folder."
|
||||
":kbd:`Ctrl`:kbd:`Enter`", "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:`D`", "Wrap selected text, or word under cursor, in single quotes."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`G`", "Find previous occurrence of search word in current document. (Same as :kbd:`Shift`:kbd:`F3`.)"
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`I`", "Import text to the current document from a text file."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`N`", "Create new folder."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`O`", "Open a project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`R`", "Close the document viewer."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`S`", "Save the current project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`W`", "Close the current project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Z`", "Alternative sequence for redo last undo."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Up`", "Move item one step up in the project tree."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Down`", "Move item one step down in the project tree."
|
||||
":kbd:`F1`", "Open the documentation. This will either open the Qt Assistant, if available, or send you to the documentation website."
|
||||
":kbd:`F2`", "If in the project tree, edit a document or folder settings. (Same as :kbd:`Ctrl`:kbd:`E`)"
|
||||
":kbd:`F3`", "Find next occurrence of search word in current document. (Same as :kbd:`Ctrl`:kbd:`G`)"
|
||||
":kbd:`F5`", "Open the :guilabel:`Build Novel Project` dialog."
|
||||
":kbd:`F6`", "Open the :guilabel:`Writing Statistics` dialog."
|
||||
":kbd:`F7`", "Re-run spell checker."
|
||||
":kbd:`F8`", "Activate :guilabel:`Focus Mode`, hiding the project tree and document viewer."
|
||||
":kbd:`F9`", "Re-build the project index."
|
||||
":kbd:`F10`", "Re-build the project outline."
|
||||
":kbd:`F11`", "Activate full screen mode."
|
||||
":kbd:`Shift`:kbd:`F1`", "Open the online documentation in the system default browser."
|
||||
":kbd:`Shift`:kbd:`F3`", "Find previous occurrence of search word in current document. (Same as :kbd:`Ctrl`:kbd:`Shift`:kbd:`G`.)"
|
||||
":kbd:`Return`", "If in the project tree, open a document for editing."
|
||||
|
||||
.. note::
|
||||
On macOS, replace :kbd:`Ctrl` with :kbd:`Cmd`.
|
||||
|
||||
|
||||
.. _a_ui_shortcuts_ins:
|
||||
|
||||
Insert Shortcuts
|
||||
----------------
|
||||
|
||||
A set of insert features are also available through shortcuts, but they require a double
|
||||
combination of key sequences. The insert feature is activated with :kbd:`Ctrl`:kbd:`K`, followed by
|
||||
a key or combination for the inserted character or punctuation.
|
||||
|
||||
.. csv-table:: Keyboard Shortcuts
|
||||
:header: "Shortcut", "Description"
|
||||
:widths: 40, 60
|
||||
:class: "tight-table"
|
||||
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`-`", "Insert a short dash (en dash)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`_`", "Insert a long dash (em dash)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`.`", "Insert an ellipsis."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`1`", "Insert a left single quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`2`", "Insert a right single quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`3`", "Insert a left double quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`4`", "Insert a right double quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`'`", "Insert a modifier apostrophe."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Return`", "Insert a hard line break."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Space`", "Insert a non-breaking space."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Shift`:kbd:`Space`", "Insert a thin space."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`", "Insert a thin non-breaking space."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`G`", "Insert a @tag keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`V`", "Insert a @pov keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`C`", "Insert a @char keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`P`", "Insert a @plot keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`T`", "Insert a @time keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`L`", "Insert a @location keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`O`", "Insert a @object keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`E`", "Insert a @entity keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`X`", "Insert a @custom keyword."
|
||||
@@ -1,113 +1,66 @@
|
||||
.. _a_intro:
|
||||
|
||||
************
|
||||
Introduction
|
||||
Key Features
|
||||
************
|
||||
|
||||
novelWriter is a simple, multi-document plain text editor using a modified markdown syntax to apply
|
||||
simple formatting to the text. It is designed for writing novels, and allows for the component
|
||||
documents to be ordered freely to create the desired structure of the novel. More details about how
|
||||
projects are structured is covered on the :ref:`a_struct` page.
|
||||
.. _Snowflake : https://www.advancedfictionwriting.com/articles/snowflake-method/
|
||||
|
||||
In addition, the project can contain notes on the various plot elements, characters, locations,
|
||||
etc, that make up the story. These notes are organised in a set of category-specific top-level
|
||||
folders (root folders), and each entry can be tagged and cross-referenced from within the novel
|
||||
documents and notes. These tags make it possible to inter-link documents, and generate an overview
|
||||
of the entire novel project and how the various documents and plot elements are interconnected.
|
||||
This is covered on the :ref:`a_proj` and :ref:`a_notes` pages.
|
||||
At the core, novelWriter is a multi-document plain text editor. It uses a markup syntax inspired by
|
||||
Markdown to apply simple formatting to the text. It is designed for writing fiction, so the
|
||||
formatting features are limited to those relevant for this purpose. It is not suitable for
|
||||
technical writing.
|
||||
|
||||
These additional features are not standard in markdown, but are available through special meta
|
||||
keywords described in :ref:`a_struct_tags`. Syntax highlighting is provided to make it easier to
|
||||
verify that the markdown tags are used correctly.
|
||||
Your novel project is organised as a collection of separate plain text documents instead of a
|
||||
single, large document. The idea here is to make it easier to reorganise your project structure
|
||||
without having to cut and paste text.
|
||||
|
||||
An overview of the supported markdown syntax is covered on the :ref:`a_ui` page.
|
||||
You can at any point split documents by their header, or merge multiple documents into single
|
||||
documents. This makes it easier to use variations of the popular Snowflake_ method for writing.
|
||||
|
||||
Below are some key features of novelWriter.
|
||||
|
||||
.. _a_intro_design:
|
||||
**Focus on writing**
|
||||
The aim of the user interface is to let the user focus on writing instead of spending time
|
||||
formatting text. Formatting is therefore limited to a small set of formatting tags for simple
|
||||
things like text emphasis and paragraph alignment. When you really want to focus on just
|
||||
writing, you can switch the editor into :guilabel:`Focus Mode` where only the text editor window
|
||||
itself is vissible.
|
||||
|
||||
Design Philosophy
|
||||
=================
|
||||
**Keep an eye on your notes**
|
||||
The main window can optionally show a document viewer to the right of the editor. This view
|
||||
panel is intended for displaying another scene document, you character notes, plot notes, or any
|
||||
other document you may need to reference while writing.
|
||||
|
||||
The user interface of novelWriter is intended to be as minimalistic as practically possible, while
|
||||
at the same time provide a complete set of features needed for writing a novel.
|
||||
**Organise your documents how you like**
|
||||
You can split your novel project up into as many individual documents as you want to. When you
|
||||
build the project, they are all glued together in the top-to-bottom order in which they appear
|
||||
in the project tree. You can use as few text documents as you like, but splitting the project up
|
||||
into chapters and scenes means you can easily reorder them using the drag and drop feature. You
|
||||
can start out with a few documents and then later split the document into multiple documents
|
||||
based on its headers.
|
||||
|
||||
.. note::
|
||||
novelWriter is not intended to be a full office type word processor. It doesn't support images,
|
||||
links, tables, and other complex structures and objects often needed for such documents.
|
||||
Formatting is limited to headers, and bold, italicised and strikethrough text.
|
||||
**Keep track of your plot elements**
|
||||
All notes in your project can be assigned a *tag* you can *reference* from any other document or
|
||||
note. In fact, you can add a new tag under each heading of a note if you need to be able to
|
||||
reference a specific section. Note tags are organised into categories with specific reference
|
||||
keywords.
|
||||
|
||||
The main window does not have a toolbar like most other applications do. This reduces clutter, and
|
||||
since the documents are formatted with markdown tags, is more or less redundant. However, all
|
||||
formatting features supported are available through convenient keyboard shortcuts. They are also
|
||||
available in the main menu. A full list of shortcuts can be found in the :ref:`a_ui_shortcuts`
|
||||
section.
|
||||
**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.
|
||||
|
||||
In addition, novelWriter offers a :guilabel:`Distraction Free Mode` where all the user interface
|
||||
elements other than the document editor itself are hidden away.
|
||||
|
||||
The colour scheme of the user interface defaults to that of the host operating system. In addition,
|
||||
a dark theme is 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 contains the project
|
||||
tree and all the documents in your project. The second panel is the document editor, and the
|
||||
optional third panel is a document viewer which can view any document in your project.
|
||||
|
||||
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 as it appears in the text of the documents.
|
||||
|
||||
.. _Typicons: https://github.com/stephenhutchings/typicons.font
|
||||
|
||||
|
||||
.. _a_intro_project:
|
||||
|
||||
Project Layout
|
||||
==============
|
||||
|
||||
You are free to structure your project documents as you wish in 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
|
||||
the :ref:`a_struct` and :ref:`a_notes` pages 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 plain text file,
|
||||
HTML document, novelWriter flavoured markdown, standard markdown (requires Qt 5.14), and to a basic
|
||||
Open Document format.
|
||||
|
||||
In addition, printing and printing to PDF is also possible. The best supported export format is
|
||||
HTML, which can be imported or converted by a number of other tools like Pandoc, or simply imported
|
||||
into Libre Office Writer and similar word processors.
|
||||
|
||||
It is also possible to export the content of the project to a JSON file. This is useful if you want
|
||||
to write your own processing script in for instance Python as the entire novel can be read into a
|
||||
Python dictionary with a couple of lines of code.
|
||||
|
||||
A number of filter options can be applied to the produced document, allowing you to export a draft
|
||||
manuscript, a reference document of notes, an outline based on chapter and scene titles with a
|
||||
synopsis each, and so on. See the :ref:`a_export` page 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:
|
||||
@@ -115,7 +68,7 @@ formats.
|
||||
Screenshots
|
||||
===========
|
||||
|
||||
**novelWriter with default system theme:**
|
||||
**novelWriter with default theme:**
|
||||
|
||||
.. image:: images/screenshot_default.png
|
||||
:width: 800
|
||||
|
||||
92
docs/source/int_overview.rst
Normal file
@@ -0,0 +1,92 @@
|
||||
.. _a_overview:
|
||||
|
||||
********
|
||||
Overview
|
||||
********
|
||||
|
||||
.. only:: html
|
||||
|
||||
.. image:: images/python_powered.png
|
||||
:align: right
|
||||
:width: 220
|
||||
|
||||
novelWriter is built on `Python 3 <https://www.python.org/>`_, a cross platform programming
|
||||
language that doesn't require a compiler to build and run. That means that the code can run on your
|
||||
computer right out of the box, or from a zip file.
|
||||
|
||||
While it is developed for Linux primarily, it runs just fine on Windows as well. It also works fine
|
||||
on macOS, but the author is not a mac user, so support for mac is dependant on user feedback and
|
||||
contributions.
|
||||
|
||||
In order to run novelWriter, you also need a few additional packages. The user interface is built
|
||||
with `Qt 5 <https://www.qt.io/>`_, a cross platform library for building graphical user interface
|
||||
applications. It also uses a third party XML package. If you want spell checking, you also need the
|
||||
spell check package Enchant developed for AbiWord
|
||||
|
||||
For install instructions, see :ref:`a_started`.
|
||||
|
||||
For information on how to add spell check dictionaries, see :ref:`a_custom_dict`.
|
||||
|
||||
|
||||
Using novelWriter
|
||||
=================
|
||||
|
||||
In order to use novelWriter effectively, you need to know the basics of how it works. The following
|
||||
sections will explain the main principles. It starts with the basics, and gets more detailed as you
|
||||
read on.
|
||||
|
||||
:ref:`a_breakdown` – Essential Information
|
||||
This section explains the basics of how the application works and what it can and cannot do.
|
||||
|
||||
:ref:`a_ui` – Recommended Reading
|
||||
This section will give you a more detailed explanation of what the various elements on the user
|
||||
interface do and how you can use them more effectively.
|
||||
|
||||
:ref:`a_fmt` – Essential Information
|
||||
This section covers how you should format your text. The editor is plain text, so text
|
||||
formatting requires some basic markup. The structure of your novel is also inferred by how you
|
||||
use headings. Tags and references are implemented by simple codes.
|
||||
|
||||
:ref:`a_kb` – Optional / Lookup
|
||||
This section lists all the keyboard shortcuts in novelWriter and what they do. Most of the
|
||||
shortcuts are also listed next to the menu items inside the app, or in tool tips, so this
|
||||
section is mostly for reference.
|
||||
|
||||
:ref:`a_typ` – Optional
|
||||
This section gives you an overview of the special typographical symbols available in
|
||||
novelWriter. The auto-replace feature can handle the insertion of standard quote symbols for
|
||||
your language, and other special characters. If you use any symbols aside from these. their
|
||||
intended use is explained here.
|
||||
|
||||
:ref:`a_prjfmt` – Optional
|
||||
This section is more technical and has an overview of changes made to the way your project data
|
||||
is stored. The format has changed a bit from time to time, and sometimes the changes require
|
||||
that you make small modifications to your project. Everything you need to know is listed in this
|
||||
section.
|
||||
|
||||
|
||||
Organising Your Projects
|
||||
========================
|
||||
|
||||
In addition to manage a collection of plain text files, novelWriter can interpret and map the
|
||||
structure of your novel and show you additional information about its flow and content. In order
|
||||
to take advantage of these features, you must structure your text in a specific way and add some
|
||||
meta data for it to extract.
|
||||
|
||||
:ref:`a_proj` – Essential Information
|
||||
This section explains how you organise the content of your project, and how to set up automated
|
||||
backups of your work.
|
||||
|
||||
:ref:`a_struct` – Essential Information
|
||||
This section covers the way your novel's structure is encoded into the text documents. It
|
||||
explains how the different levels of headings are used, and how you can include information
|
||||
about characters, plot elements, and other meta data in your text.
|
||||
|
||||
:ref:`a_notes` - Recommended Reading
|
||||
This section briefly describes what novelWriter does with the note files you add to your
|
||||
project. Generally, the application doesn't do much with them at all aside from looking through
|
||||
them for tags you've set so that it knows which file to open when you click on a reference.
|
||||
|
||||
:ref:`a_export` - Recommended Reading
|
||||
This section explains in more detail how the build tool works. In particular how you can
|
||||
control the way chapter titles are formatted, and how scene and section breaks are handled.
|
||||
155
docs/source/int_source.rst
Normal file
@@ -0,0 +1,155 @@
|
||||
.. _a_source:
|
||||
|
||||
*******************
|
||||
Running from Source
|
||||
*******************
|
||||
|
||||
.. _main website: https://novelwriter.io
|
||||
.. _GitHub: https://github.com/vkbo/novelWriter/releases
|
||||
.. _PyPi: https://pypi.org/project/novelWriter/
|
||||
.. _Sphinx Docs: https://www.sphinx-doc.org/
|
||||
|
||||
This section describes various ways of running novelWriter directly from the source code, and how
|
||||
to build the various components like the translation files and documentation.
|
||||
|
||||
.. note::
|
||||
The text below assumes the command ``python`` corresponds to a Python 3 executable. Python 2 is
|
||||
now deprecated, but many systems still have both Python 2 and 3. For such systems, the command
|
||||
``python3`` may be needed instead. Likewise, ``pip`` may need to be replaced with ``pip3``.
|
||||
|
||||
|
||||
.. _a_source_depend:
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
novelWriter has been designed to rely on as few dependencies as possible. Aside from the packages
|
||||
needed to communicate with the Qt GUI libraries, only one package is required for handling the XML
|
||||
format of the main project file. Everything else is handled with standard Python libraries.
|
||||
|
||||
The following Python packages are needed to run novelWriter:
|
||||
|
||||
* ``PyQt5`` – needed for connecting with the Qt5 libraries.
|
||||
* ``lxml`` – needed for full XML support.
|
||||
* ``PyEnchant`` – needed for spell checking (optional).
|
||||
|
||||
PyQt/Qt should be at least 5.10, but ideally 5.13 or higher for all features to work. For instance,
|
||||
searching using regular expressions with full Unicode support requires 5.13. There is no known
|
||||
minimum version requirement for package ``lxml``, but the code was originally written with 4.2,
|
||||
which is therefore set as the minimum. It may work on lower versions. You have to test it.
|
||||
|
||||
If you want spell checking, you must install the ``PyEnchant`` package. The spell check library
|
||||
must be at least 3.0 to work with Windows. On Linux, 2.0 also works fine.
|
||||
|
||||
If you install from PyPi, these dependencies should be installed automatically. If you install from
|
||||
source, dependencies can still be installed from PyPi with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pip install -r requirements.txt
|
||||
|
||||
|
||||
.. _a_source_install:
|
||||
|
||||
Install from Source
|
||||
===================
|
||||
|
||||
You can download the latest version of novelWriter from the source repository on GitHub_ and run
|
||||
the setup manually. It is equivalent to what the ``pip install`` command does, and it installs
|
||||
novelWriter to the default location for Python packages.
|
||||
|
||||
This step requires that you have ``setuptools`` installed on your system. If you don't have it
|
||||
installed, it can usually be installed from your distro's repository. For Debian and Ubuntu this is
|
||||
achieved with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
sudo apt install python3-setuptools
|
||||
|
||||
The package is also available from PyPi:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pip install --user setuptools
|
||||
|
||||
With ``setuptools`` in place, novelWriter can be installed to the user space with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
python setup.py install --user
|
||||
|
||||
.. tip::
|
||||
|
||||
The main setup script has a number of options that may be useful to you. You can list them by
|
||||
running ``python setup.py help``.
|
||||
|
||||
|
||||
.. _a_source_i18n:
|
||||
|
||||
Building the Translation Files
|
||||
==============================
|
||||
|
||||
If you installed novelWriter from a package, the translation files should be pre-built and
|
||||
included. If you're running novelWriter from the source code, you will need to generate the files
|
||||
yourself. The files you need will be written to the ``novelwriter/assets/i18n`` folder, and will
|
||||
have the ``.qm`` file extension.
|
||||
|
||||
You can build the ``.qm`` files with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
python setup.py qtlrelease
|
||||
|
||||
This requires that the Qt Linguist tool is installed on your system. On Ubuntu and Debian, the
|
||||
needed package is called ``qttools5-dev-tools``.
|
||||
|
||||
.. note::
|
||||
If you want to improve novelWriter with translation files for another language, or update an
|
||||
existing translation, instructions for how to contribute can be found in the ``README.md`` file
|
||||
in the ``i18n`` folder of the source code.
|
||||
|
||||
|
||||
.. _a_source_sample:
|
||||
|
||||
Building the Example Project
|
||||
============================
|
||||
|
||||
In order to be able to create new projects from example files, you need a ``sample.zip`` file in
|
||||
the ``assets`` folder of the source. This file can be built from setup script by running:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
python setup.py sample
|
||||
|
||||
|
||||
.. _a_source_docs:
|
||||
|
||||
Building the Documentation
|
||||
==========================
|
||||
|
||||
A local copy of this documentation can be generated as HTML. This requires the following Python
|
||||
packages from PyPi:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pip install furo sphinx
|
||||
|
||||
The documentation can then be built from the root folder in the source code by running:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
make -C docs html
|
||||
|
||||
If successful, the documentation should be available in the ``docs/build/html`` folder and you can
|
||||
open the ``index.html`` file in your browser.
|
||||
|
||||
You can also build a PDF manual from the documentation using the setup script:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
python setup.py manual
|
||||
|
||||
This will build the documentation as a PDF using LaTeX. The file will then be copied into the
|
||||
assets folder and made available in the :guilabel:`Help` menu in novelWriter. The Sphinx build
|
||||
system has a few extra dependencies when building the PDF. Please check the `Sphinx Docs`_ for more
|
||||
details.
|
||||
@@ -4,213 +4,247 @@
|
||||
Getting Started
|
||||
***************
|
||||
|
||||
This is a brief guide to how you can get novelWriter running on your computer. These are the
|
||||
methods currently supported by the developer. Packages may also be available in other package
|
||||
managers, but those are not managed by the developer. A Windows installer file is also provided on
|
||||
the GitHub page and main website.
|
||||
.. _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/
|
||||
|
||||
As novelWriter matures, more options for how to install it and get it running will be added. For
|
||||
non-Windows users the install process is at the present time best suited for people used to working
|
||||
with the command line.
|
||||
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::
|
||||
The text below assumes the command ``python`` corresponds to a Python 3 executable. For
|
||||
operating systems with both Python 2 and 3, the command ``python3`` may be needed instead. On
|
||||
Linux, the scripts can also be made executable and run without the ``python`` command.
|
||||
|
||||
Please use the Ubuntu 20.04 (focal) packages for Debian. The newer Ubuntu packages use a
|
||||
different compression algorithm that Debian doesn't currently support.
|
||||
|
||||
|
||||
.. _a_started_install:
|
||||
|
||||
Installation
|
||||
============
|
||||
|
||||
You can download the latest version of novelWriter from the source repository on GitHub_. You can
|
||||
also install it directly from PyPi with ``pip install novelwriter``, or download the packages
|
||||
directly from the PyPi_ project page.
|
||||
|
||||
Latest version of novelWriter is |release|.
|
||||
|
||||
.. _GitHub: https://github.com/vkbo/novelWriter/releases
|
||||
.. _PyPi: https://pypi.org/project/novelWriter/
|
||||
|
||||
|
||||
.. _a_started_install_win:
|
||||
|
||||
Windows Installer
|
||||
AppImage Releases
|
||||
-----------------
|
||||
|
||||
You can run novelWriter directly from source on Windows, but a Windows installer is also provided
|
||||
for 64-bit Windows on the `main website`_ and GitHub_ page. This installer bundles all that is
|
||||
needed for novelWriter to run, including Python and the xml and Qt libraries.
|
||||
|
||||
.. _main website: https://novelwriter.io
|
||||
For other Linux distros than the ones mentioned above, the primary option is AppImage_. These are
|
||||
completely standalone images for the app that include the necessary environment to run novelWriter.
|
||||
They can of course be run on any Linux distro, if you prefer this to native packages.
|
||||
|
||||
|
||||
.. _a_started_install_source:
|
||||
.. _a_started_minimal:
|
||||
|
||||
Install from Source on Linux
|
||||
----------------------------
|
||||
Minimal Package Install
|
||||
=======================
|
||||
|
||||
For Linux systems, novelWriter can be installed from source with the provided ``setup.py`` script.
|
||||
To install novelWriter into the system's default Python install locations, run:
|
||||
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.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
python setup.py install
|
||||
|
||||
To set up the novelWriter desktop launcher, the icons and the project file association, run:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
python setup.py xdg-install
|
||||
|
||||
By default, these commands installs novelWriter and its icons for the current user only. To install
|
||||
for all users, run the script with the ``sudo`` command. Other options are also available. Run
|
||||
``python setup.py help`` for a full list of install options.
|
||||
These zip files don't include any dependencies, so you must install them separately.
|
||||
|
||||
|
||||
.. _a_started_depend:
|
||||
.. _a_started_minimal_windows:
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
novelWriter has been designed to rely on as few dependencies as possible. Aside from the package(s)
|
||||
needed to communicate with the Qt GUI libraries, only one package is required for handling the XML
|
||||
format of the main project file. Everything else is handled with standard Python libraries.
|
||||
|
||||
Optionally, a package can be installed to interface with the Enchant spell checking libaries, but
|
||||
this isn't strictly required. If no external spell checking library is available, novelWriter falls
|
||||
back to using the internal ``difflib`` of Python to check spelling. This is a much slower approach,
|
||||
and it is less sophisticated than full spell checking libaries, but if you only work with small
|
||||
files, the performance loss is not noticeable.
|
||||
|
||||
|
||||
.. _a_started_depend_packages:
|
||||
|
||||
Package Installation
|
||||
--------------------
|
||||
|
||||
If you already have Python installed, all you need to do is install the dependencies. To do this,
|
||||
you need to open your command line tool, find the folder where you extracted novelWriter, and run
|
||||
the following command:
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
pip install -r requirements.txt
|
||||
|
||||
This will install all the dependencies and recommended packages.
|
||||
|
||||
The following Python packages are required to run novelWriter:
|
||||
|
||||
* ``pyqt5``, needed for connecting with the Qt5 libraries.
|
||||
* ``lxml``, needed full XML support.
|
||||
|
||||
You can of course also install these packages from your operating system's package repository.
|
||||
|
||||
PyQt/Qt should be at least 5.2.1, but ideally 5.10 or higher for nearly all features to work.
|
||||
Exporting to standard Markdown, for instance, requires PyQt/Qt 5.14. Searching using regular
|
||||
expressions requires 5.3, and for full Unicode support, 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.
|
||||
|
||||
The spell checking extension is optional, but recommended:
|
||||
|
||||
* ``pyenchant``, needed for efficient spell checking.
|
||||
|
||||
The optional spell check library must be at least 3.0 to work with Windows. On Linux, 2.0 also
|
||||
works fine.
|
||||
|
||||
|
||||
.. _a_started_depend_docs:
|
||||
|
||||
Building the Documentation
|
||||
Minimal Package on Windows
|
||||
--------------------------
|
||||
|
||||
If you installed novelWriter from a package, the documentation should be included. If you're
|
||||
running novelWriter from the source code, a local copy of this documentation can be generated. It
|
||||
requires the following Python packages on Debian and Ubuntu.
|
||||
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.
|
||||
|
||||
* ``python3-sphinx``
|
||||
* ``python3-sphinxcontrib.qthelp``
|
||||
Make sure you select the "Add Python to PATH" option during installation, otherwise the ``python``
|
||||
command will not work in the command line window.
|
||||
|
||||
Or from PyPi:
|
||||
.. figure:: images/python_win_install.png
|
||||
:align: center
|
||||
:width: 500
|
||||
|
||||
.. code-block:: console
|
||||
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``.
|
||||
|
||||
pip install sphinx sphinxcontrib-qthelp
|
||||
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.
|
||||
|
||||
The documentation can then be built from the ``docs`` folder in the source code by running:
|
||||
Running ``windows_uninstall.bat`` will reverse the process if you wish to uninstall. After that,
|
||||
you can just delete the novelWriter folder.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
make html
|
||||
.. _a_started_minimal_linux:
|
||||
|
||||
If successful, the documentation should then be available in the ``docs/build/html`` folder.
|
||||
Minimal Package on Linux
|
||||
------------------------
|
||||
|
||||
The documentation can also be built for the Qt Assistant. To build the help packages from the
|
||||
documentation source, run the following from the root source folder:
|
||||
On Linux you need to install the following packages on Debian-based distros, including Ubuntu and
|
||||
Linux Mint:
|
||||
|
||||
.. code-block:: console
|
||||
.. code-block:: bash
|
||||
|
||||
python setup.py qthelp
|
||||
sudo apt install python3-pyqt5 python3-lxml python3-enchant
|
||||
|
||||
The setup script will copy the generated files into the ``nw/assets/help`` folder, and novelWriter
|
||||
will detect the presence of the files and redirect the menu help entry to open help locally instead
|
||||
of sending the user to the website. Pressing the :kbd:`F1` key will in any case try to open help
|
||||
locally first, then send you to the website as a fallback.
|
||||
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::
|
||||
In order for the local version of help to work, the Qt Assistant must be installed on the local
|
||||
computer. If it isn't available, or novelWriter cannot find it, the help feature will fall back
|
||||
to redirecting you to the documentation website.
|
||||
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_running:
|
||||
.. _a_started_pip:
|
||||
|
||||
Running from Source
|
||||
===================
|
||||
Install from PyPi
|
||||
=================
|
||||
|
||||
If all the required dependencies are met, you can run novelWriter from the command line:
|
||||
novelWriter is also available on the Python Package Index, or PyPi_. This install method works on
|
||||
all supported operating systems.
|
||||
|
||||
.. code-block:: console
|
||||
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.
|
||||
|
||||
python novelWriter.py
|
||||
To install novelWriter from PyPi, use the following command:
|
||||
|
||||
A few switches are supported from the command line, mostly to assist in debugging if an error is
|
||||
encountered. To list all options, run:
|
||||
.. code-block:: bash
|
||||
|
||||
.. code-block:: console
|
||||
pip install novelwriter
|
||||
|
||||
python novelWriter.py --help
|
||||
To upgrade an existing installation, use:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
.. _a_started_standalone:
|
||||
pip install --upgrade novelwriter
|
||||
|
||||
Building a Standalone Executable
|
||||
================================
|
||||
When installing via pip, novelWriter can be launched from command line with:
|
||||
|
||||
A standalone executable can be built with ``pyinstaller``, using the provided python script
|
||||
``make.py`` in the source folder. This script can install dependencies, build a standalone
|
||||
executable of novelWriter, or build a ``setup.exe`` file with Inno Setup.
|
||||
.. code-block:: bash
|
||||
|
||||
For a full list of the script's options, run ``python make.py help``.
|
||||
novelwriter
|
||||
|
||||
Make sure the install location for pip is in your PATH variable. This is not always the case by
|
||||
default.
|
||||
|
||||
.. _a_started_standalone_win:
|
||||
|
||||
Additional Instructions for Windows
|
||||
-----------------------------------
|
||||
|
||||
If you don't have Python installed, you can download it from the python.org website. The installers
|
||||
for Windows are available at https://www.python.org/downloads/windows/
|
||||
|
||||
novelWriter should work with Python 3.6 or higher, and the executable installer is the easiest to
|
||||
install.
|
||||
|
||||
Also, make sure you select the "Add Python to PATH" option.
|
||||
|
||||
.. image:: images/python_win_install.png
|
||||
:width: 600
|
||||
|
||||
Once Python is set up and running, you can either run novelWriter from the folder where you
|
||||
extracted it, or you can build an executable and run that from a desktop icon instead.
|
||||
.. note::
|
||||
On systems with both Python 2 and 3, you may have to replace the ``pip`` command with ``pip3``.
|
||||
|
||||
159
docs/source/project_export.rst
Normal file
@@ -0,0 +1,159 @@
|
||||
.. _a_export:
|
||||
|
||||
***********************
|
||||
Building the Manuscript
|
||||
***********************
|
||||
|
||||
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:
|
||||
|
||||
Header Formatting
|
||||
=================
|
||||
|
||||
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%``.
|
||||
|
||||
``%title%``
|
||||
This keyword will always be replaced with the title text you put after the ``#`` characters in
|
||||
your document.
|
||||
|
||||
``%ch%``
|
||||
This will be replaced by a chapter number. The number is incremented by one each time the build
|
||||
tool sees a new heading of level two in a document, unless the heading formatting code has the
|
||||
added ``!``. In the latter case, the counter is *not* incremented. This is useful for for
|
||||
instance Prologue and Epilogue chapters.
|
||||
|
||||
``%chw%``
|
||||
Behaves like ``%ch%``, but the number is represented as a number word. You can select between a
|
||||
number of different languages.
|
||||
|
||||
``%chi%``
|
||||
Begaves like ``%ch%``, but represented as a lower case Roman number from 1 to 4999.
|
||||
|
||||
``%chI%``
|
||||
Behaves like ``%ch%``, but represented as an upper case Roman number from 1 to 4999.
|
||||
|
||||
``%sc%``
|
||||
This is the number counter equivalent for scenes. These are incremented each time a heading of
|
||||
level three is encountered, but reset to 1 each time a chapter is encountered. They can thus be
|
||||
used for counting scenes within a chapter.
|
||||
|
||||
``%sca%``
|
||||
Behaves like ``%sc%``, but the number is *not* reset to 1 for each chapter. Instead it runs from
|
||||
1 from the beginning of the novel to produce an absolute scene count.
|
||||
|
||||
``\\``
|
||||
This inserts a line break within the title.
|
||||
|
||||
.. note::
|
||||
Header formatting only applies to novel documents. Headings in notes will be left as-is.
|
||||
|
||||
**Example**
|
||||
|
||||
* The format ``%title%`` just reproduces the title you set in the document.
|
||||
* The format ``Chapter %ch%: %title%`` produces something like "Chapter 1: My Chapter Title".
|
||||
* The format ``Scene %ch%.%sc%`` produces something like "Scene 1.2" for scene 2 in chapter 1.
|
||||
|
||||
|
||||
.. _a_export_scenes:
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
will always be treated as a separator.
|
||||
|
||||
|
||||
.. _a_export_files:
|
||||
|
||||
File Selection
|
||||
==============
|
||||
|
||||
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
|
||||
keywords and synopsis export and disable body text, thus getting a document with each heading
|
||||
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 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:
|
||||
|
||||
Printing
|
||||
========
|
||||
|
||||
The print button allows you to print the content in the preview window. You can either print to one
|
||||
of your system's printers, or print directly to 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.
|
||||
|
||||
Open Document Format
|
||||
The Build tool can produce either an ``.odt`` file, or an ``.fodt`` file. The latter is just a
|
||||
flat version of the document format as a single XML file. Most rich text editors support the
|
||||
former, and a few the latter.
|
||||
|
||||
novelWriter HTML
|
||||
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
|
||||
are stacked together in the order they appear in the project tree, with comments, tags, etc.
|
||||
included if they are selected. This is a useful format for exporting the project for later
|
||||
import back into novelWriter.
|
||||
|
||||
Standard/GitHub Markdown
|
||||
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 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 included.
|
||||
|
||||
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.
|
||||
72
docs/source/project_notes.rst
Normal file
@@ -0,0 +1,72 @@
|
||||
.. _a_notes:
|
||||
|
||||
*************
|
||||
Project Notes
|
||||
*************
|
||||
|
||||
novelWriter doesn't have a database and complicated forms for filling in details about plot
|
||||
elements, characters, and all sorts of additional information that isn't a part of the novel text
|
||||
itself. Instead, all such information is saved in notes that are written and maintained just like
|
||||
all other text in your project.
|
||||
|
||||
The relation between all these additional elements is extracted from the documents and notes by the
|
||||
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 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:
|
||||
|
||||
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 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
|
||||
to date. An invalid tag should have a green wiggly line under it, and will not receive the syntax
|
||||
colour that valid tags do.
|
||||
|
||||
The tag is the only part of these notes that the 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 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.
|
||||
|
||||
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 ...
|
||||
@@ -4,18 +4,21 @@
|
||||
Novel Projects
|
||||
**************
|
||||
|
||||
A novelWriter project requires a dedicated folder for storing its files on the local file system.
|
||||
See the :ref:`a_tech` page for further details on how files are organised.
|
||||
New projects can be created from the :guilabel:`Project` menu by selecting :guilabel:`New Project`.
|
||||
This will open the :guilabel:`New Project Wizard` that will assist you in creating a barebone
|
||||
project suited to your needs.
|
||||
|
||||
A new project can be created from the :guilabel:`Project` menu by selecting
|
||||
:guilabel:`New Project`. This will open the :guilabel:`New Project Wizard` that will assist you in
|
||||
creating a barebone project suited to your needs.
|
||||
A novelWriter project requires a dedicated folder for storing its files on the local file system.
|
||||
See :ref:`a_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.
|
||||
dialog. A project can be removed from this list by selecting it and pressing the :kbd:`Del` key or
|
||||
by clicking the :guilabel:`Remove` button.
|
||||
|
||||
The project specific settings are available in :guilabel:`Project Settings` in the
|
||||
:guilabel:`Project` menu. See further details below in the :ref:`a_proj_settings` section.
|
||||
Project-specific settings are available in :guilabel:`Project Settings` in the :guilabel:`Project`
|
||||
menu. See further details below in the :ref:`a_proj_settings` section. Details about the project,
|
||||
including word counts, and a table of contents with word and page counts, is available through the
|
||||
:guilabel:`Project Details` dialog.
|
||||
|
||||
|
||||
.. _a_proj_roots:
|
||||
@@ -23,34 +26,44 @@ The project specific settings are available in :guilabel:`Project Settings` in t
|
||||
Project Roots
|
||||
=============
|
||||
|
||||
Projects are structured into a set of top level folders called *root folders*. They are visible in
|
||||
Projects are structured into a set of top level folders called "Root Folders". They are visible in
|
||||
the project tree at the left side of the main window.
|
||||
|
||||
The core novel documents go into a root folder of type :guilabel:`Novel`. Other supporting
|
||||
documents go into the other root folders. These other root folder types are intended for your notes
|
||||
on the various elements of your story. Using these is of course entirely optional.
|
||||
The novel documents go into a root folder of type :guilabel:`Novel`. Project notes go into the
|
||||
other root folders. These other root folder types are intended for your notes on the various
|
||||
elements of your story. Using them is of course entirely optional.
|
||||
|
||||
A new project may not have all of the root folders present, but you can add the ones you want from
|
||||
:guilabel:`Create Root Folder` in the :guilabel:`Project` menu.
|
||||
the project tree tool bar.
|
||||
|
||||
The root folders are intended for the following use, but aside from the :guilabel:`Novel` folder,
|
||||
no restrictions are enforced by the application. You can use them however you want.
|
||||
Each root folder has one or more reference keyword associated with it that is used to reference
|
||||
them from other documents and notes. The intended usage of each type of root folder is listed
|
||||
below. However, aside from the :guilabel:`Novel` folder, no restrictions are applied by the
|
||||
application on what you put in them. You can use them however you want.
|
||||
|
||||
.. tip::
|
||||
You can make multiple root folders of each kind if you wish to split up your notes.
|
||||
|
||||
.. note::
|
||||
It is not the notes themselves that are referenced by the listed reference keywords, but tags
|
||||
set within the notes. See the examples below and in :ref:`a_struct_tags`.
|
||||
|
||||
:guilabel:`Novel`
|
||||
This is the root folder of all text that goes into the final novel. This class of documents have
|
||||
other rules and features than other documents in the project. See the :ref:`a_struct` page for
|
||||
more details.
|
||||
This is the root folder of all text that goes into the final novel or novels. This class of
|
||||
documents have other rules and features than the project notes. See :ref:`a_struct` for more
|
||||
details.
|
||||
|
||||
:guilabel:`Plot`
|
||||
This is the root folder where main plots can be outlined. It is optional, but adding at least
|
||||
dummy notes can be useful in order to tag plot elements for the Outline view. Tags in this
|
||||
brief notes can be useful in order to tag plot elements for the Outline View. Tags in this
|
||||
folder can be references using the ``@plot`` keyword.
|
||||
|
||||
:guilabel:`Characters`
|
||||
Character notes go in this root folder. These are especially important if one wants to use the
|
||||
Outline view to see which character appears where, and which part of the story is told from a
|
||||
specific character's point-of-view. Tags in this folder can be references using the ``@pov``
|
||||
keyword for point-of-view characters, or the ``@char`` keyword for other characters.
|
||||
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.
|
||||
|
||||
:guilabel:`Locations`
|
||||
The locations folder is for various scene locations that you want to track. Tags in this folder
|
||||
@@ -77,10 +90,31 @@ no restrictions are enforced by the application. You can use them however you wa
|
||||
The root folders correspond to the categories of tags that can be used to reference them. For more
|
||||
information about the tags listed, see :ref:`a_struct_tags`.
|
||||
|
||||
.. tip::
|
||||
You can rename root folders to whatever you want. The first character in the :guilabel:`Flags`
|
||||
column will still indicate what type they are, and so will the icon if you are using one of the
|
||||
Typicons icon sets.
|
||||
.. note::
|
||||
You can rename root folders to whatever you want. However, this doesn't change the reference
|
||||
keyword.
|
||||
|
||||
Example of a character note:
|
||||
|
||||
.. code-block:: none
|
||||
:linenos:
|
||||
|
||||
# Jane Doe
|
||||
|
||||
@tag: Jane
|
||||
|
||||
Some information about the character Jane Doe.
|
||||
|
||||
Example of a novel scene referencing the above character:
|
||||
|
||||
.. code-block:: none
|
||||
:linenos:
|
||||
|
||||
### Chapter 1, Scene 1
|
||||
|
||||
@pov: Jane
|
||||
|
||||
When Jane woke up that morning ...
|
||||
|
||||
|
||||
.. _a_proj_roots_del:
|
||||
@@ -93,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:`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 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
|
||||
@@ -124,7 +155,7 @@ file synchronisation tool that runs out of sync, there may be files in the proje
|
||||
aren't tracked in the core project file. These files, when discovered, are recovered and added back
|
||||
into the project if possible.
|
||||
|
||||
The discovered files are scanned for meta information that gives clues as to where the document may
|
||||
The discovered files are scanned for meta information that give clues as to where the document may
|
||||
previously have been located in the project. The project loading routines will try to put them back
|
||||
as close as possible to this location, if it still exists. Generally, it will be appended to the
|
||||
end of the folder where it previously was located. If that folder doesn't exist, it will try to add
|
||||
@@ -157,7 +188,8 @@ this warning, and continue opening the project at your own risk.
|
||||
If you choose to ignore the warning and continue opening the project, and multiple instances of
|
||||
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,
|
||||
lose any actual text unless both instances have the same document open in the editor, and
|
||||
novelWriter will try to resolve project inconsistencies the next time you open the project.
|
||||
|
||||
|
||||
.. _a_proj_roots_dirs:
|
||||
@@ -174,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 then need to add a
|
||||
chapter documents as the first item of your folder, and the scene documents as the following
|
||||
items.
|
||||
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:
|
||||
@@ -184,20 +217,15 @@ documents.
|
||||
Project Documents
|
||||
=================
|
||||
|
||||
New documents can be created from the :guilabel:`Document` menu, or by pressing :kbd:`Ctrl`:kbd:`N`
|
||||
while in the project tree. This will create a new, empty document, and open the :guilabel:`Item
|
||||
Settings` dialog where the document label and various other settings can be changed. This dialog
|
||||
can also be opened again later from either the :guilabel:`Project` menu, selecting :guilabel:`Edit
|
||||
Project Item`, or by pressing :kbd:`Ctrl`:kbd:`E` or :kbd:`F2` with the item selected.
|
||||
New documents can be created from the tool bar in the Project Tree, or by pressing
|
||||
:kbd:`Ctrl`:kbd:`N`. This will open the create new item menu and let you choose between a number of
|
||||
pre-defined documents and folders. You will be prompted for a label for the new item. You can
|
||||
always rename an item by selecting :guilabel:`Rename Item` from the :guilabel:`Project` menu, or by
|
||||
pressing :kbd:`F2`.
|
||||
|
||||
The layout of the document is also defined here. For Novel documents, the full list of layout
|
||||
options are available. For non-Novel documents, only :guilabel:`Note` is available. See
|
||||
:ref:`a_struct_layout` for more details.
|
||||
|
||||
You can also select whether the document is by default included when building the project. This
|
||||
setting can be overridden in the :guilabel:`Build Novel Project` tool if you wish to include them
|
||||
anyway. This is covered in the :ref:`a_export_files` section. You can also toggle the included
|
||||
state of a document from the right-click context menu.
|
||||
Other settings for project items are available from the context menu that you can activate by
|
||||
right-clicking on an item in the Project Tree. The :guilabel:`Transform` submenu includes options
|
||||
for converting, splitting, or merging items.
|
||||
|
||||
|
||||
.. _a_proj_files_counts:
|
||||
@@ -206,11 +234,11 @@ Word Counts
|
||||
-----------
|
||||
|
||||
A character, word and paragraph count is maintained for each document, as well as for each section
|
||||
of a document following a header. The word count, and change of words in the current session, is
|
||||
of a document following a header. The word count and change of words in the current session is
|
||||
displayed in the footer of any document open in the editor, and all stats are shown in the details
|
||||
panel below the project tree for any document selected in the project tree.
|
||||
panel below the project tree for any document selected in the project or novel tree.
|
||||
|
||||
The word counts are not updated in real time, but run in the background every five seconds for as
|
||||
The word counts are not updated in real time, but run in the background every few seconds for as
|
||||
long as the document is being actively edited.
|
||||
|
||||
A total project word count is displayed in the status bar. The total count depends on the sum of
|
||||
@@ -231,40 +259,37 @@ The :guilabel:`Project Settings` can be accessed from the :guilabel:`Project` me
|
||||
Settings Tab
|
||||
------------
|
||||
|
||||
The :guilabel:`Settings` tab holds the project title and author settings.
|
||||
The :guilabel:`Settings` tab holds the project name, title, and author settings.
|
||||
|
||||
The :guilabel:`Working Title` can be set to a different title than the :guilabel:`Book Title`. The
|
||||
difference between them is simply that the :guilabel:`Working Title` is used for the GUI (main
|
||||
window title) and for generating the backup files. The intention is that the :guilabel:`Working
|
||||
Title` should remain unchanged throughout the project, otherwise the name of exported files and
|
||||
backup files may change too.
|
||||
The :guilabel:`Project Name` can be set to a different value than the :guilabel:`Novel Title`. The
|
||||
difference between them is simply that the :guilabel:`Project Name` is used for the GUI (main
|
||||
window title) and for generating the backup files. The intention is that the
|
||||
:guilabel:`Project Name` should remain unchanged throughout the project's lifetime, otherwise the
|
||||
name of exported files and backup files may change too.
|
||||
|
||||
The :guilabel:`Book Title` and :guilabel:`Book Authors` settings are currently not used for
|
||||
anything, so setting then is just for the benefit of the author. Future features may be using them,
|
||||
and they are exported on some export formats in the :guilabel:`Build Novel Project` tool.
|
||||
The :guilabel:`Novel Title` and :guilabel:`Authors` settings are used when building the manuscript,
|
||||
for some formats.
|
||||
|
||||
|
||||
Details Tab
|
||||
-----------
|
||||
|
||||
This tab presents an overview of meta data for the project. It states where on your file system the
|
||||
project is saved, how may times it has been saved, how many folders and documents it contains, and
|
||||
how many words exist in the entire project.
|
||||
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
|
||||
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`.
|
||||
|
||||
.. note::
|
||||
The status or importance level currently in use by one or more documents cannot be deleted, but
|
||||
they can be edited.
|
||||
@@ -275,15 +300,16 @@ 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 also in this list. The syntax
|
||||
highlighter will add an alternate colour to text marching the syntax.
|
||||
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 matching the syntax, but it doesn't check if the
|
||||
text is in this list.
|
||||
|
||||
.. note::
|
||||
A keyword cannot contain any spaces. The angle brackets are added by default, and when used in
|
||||
the text are a part of the keyword to be replaced. This is to ensure that parts of the text
|
||||
aren't unintentionally replaced by the content of the list.
|
||||
A keyword cannot contain spaces. The angle brackets are added by default, and when used in the
|
||||
text are a part of the keyword to be replaced. This is to ensure that parts of the text aren't
|
||||
unintentionally replaced by the content of the list.
|
||||
|
||||
|
||||
.. _a_proj_backup:
|
||||
@@ -295,18 +321,19 @@ 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 is closed. Backups are date stamped zip files of the entire project folder, and are
|
||||
stored in a subfolder of the backup path with the same name as the project :guilabel:`Working
|
||||
Title` set in :ref:`a_proj_settings`.
|
||||
application itself is closed. Backups are date stamped zip files of the project files in the
|
||||
project folder (files not strictly a part of the project are ignored). The zip archives are stored
|
||||
in a subfolder of the backup path. The subfolder will have the same name as the
|
||||
:guilabel:`Project Name` as defined in :ref:`a_proj_settings`.
|
||||
|
||||
The backup feature, when configured, can also be run manually from the :guilabel:`Tools` menu.
|
||||
It is also possible to disable automated backup for a given project in :guilabel:`Project
|
||||
Settings`.
|
||||
It is also possible to disable automated backups for a given project in
|
||||
:guilabel:`Project Settings`.
|
||||
|
||||
.. note::
|
||||
For the backup to be able to run, the :guilabel:`Working Title` must be set in
|
||||
For the backup to be able to run, the :guilabel:`Project Name` must be set in
|
||||
:guilabel:`Project Settings`. This value is used to generate the folder name for the zip files.
|
||||
Without it, the backup will not run at all, but produce a warning message.
|
||||
Without it, the backup will not run at all, but it will produce a warning message.
|
||||
|
||||
|
||||
.. _a_proj_stats:
|
||||
@@ -315,13 +342,20 @@ Writing Statistics
|
||||
==================
|
||||
|
||||
When you work on a project, a log file records when you opened it, when you closed it, and the
|
||||
total word counts of your novel documents and notes at the end of the session. You can view this
|
||||
total word counts of your novel documents and notes at the end of the session, provided that the
|
||||
session lasted either more than 5 minutes, or that the total word count changed. You can view this
|
||||
file in the ``meta`` folder in the directory where you saved your project. The file is named
|
||||
``sessionStats.log``.
|
||||
|
||||
A tool to view the content of this file is available in the :guilabel:`Tools` menu under
|
||||
:guilabel:`Writing Statistics`. You can also launch it by pressing :kbd:`F6`.
|
||||
:guilabel:`Writing Statistics`. You can also launch it by pressing :kbd:`F6`, or find it on the
|
||||
Sidebar.
|
||||
|
||||
The tool will show a list of all your sessions, and a set of filters to apply to it. You can also
|
||||
export the filtered data to a JSON file or to a CSV file that can be opened by a spreadsheet
|
||||
The tool will show a list of all your sessions, and a set of filters to apply to the data. You can
|
||||
also export the filtered data to a JSON file or to a CSV file that can be opened by a spreadsheet
|
||||
application like for instance Libre Office Calc.
|
||||
|
||||
As of version 1.2, the log file also stores how much of the session time was spent idle. The
|
||||
definition of idle here is that the novelWriter main window loses focus, or the user hasn't made
|
||||
any changes to the currently open document in five minutes. The number of minutes can be altered in
|
||||
:guilabel:`Preferences`.
|
||||
208
docs/source/project_structure.rst
Normal file
@@ -0,0 +1,208 @@
|
||||
.. _a_struct:
|
||||
|
||||
***************
|
||||
Novel Structure
|
||||
***************
|
||||
|
||||
This section covers the structure of a novel project.
|
||||
|
||||
It concerns documents under the :guilabel:`Novel` type root folder only. There are some
|
||||
restrictions and features that only apply to these types of documents.
|
||||
|
||||
|
||||
.. _a_struct_heads:
|
||||
|
||||
Importance of Headings
|
||||
======================
|
||||
|
||||
Subfolders under root folders have no impact on the structure of the novel itself. The structure is
|
||||
instead dictated by the heading level of the headers within the documents.
|
||||
|
||||
Four levels of headings are supported, signified by the number of hashes (``#``) preceding the
|
||||
title. See also the :ref:`a_fmt` section for more details about the markdown syntax.
|
||||
|
||||
.. note::
|
||||
The header levels are not only important when generating the manuscript, they are also used by
|
||||
the indexer when building the outline tree in the Outline as well as the Novel Tree. Each
|
||||
heading also starts a new region where new references and tags can be defined.
|
||||
|
||||
The syntax for the four basic header types, and the two special header types, is listed in section
|
||||
:ref:`a_fmt_head`. The meaning of the four levels for the structure of your novel is as follows:
|
||||
|
||||
**Header Level 1: Partition**
|
||||
This header level signifies that the text refers to a top level partition. This is useful when
|
||||
you want to split the manuscript up into books, parts, or acts. These headings are not required.
|
||||
The novel title itself should use the special header level explained in :ref:`a_fmt_head`.
|
||||
|
||||
**Header Level 2: Chapter**
|
||||
This header level signifies a chapter level partition. Each time you want to start a new
|
||||
chapter, you must add such a heading. If you choose to split your manuscript up into one
|
||||
document per scene, you need a single chapter document with just the heading. You can of course
|
||||
also add a synopsis and reference keywords to the chapter document. If you want to open the
|
||||
chapter with a quote or other introductory text that isn't part of a scene, this is also where
|
||||
you'd put that text.
|
||||
|
||||
**Header Level 3: Scene**
|
||||
This header level signifies a scene level partition. You must provide a title text, but the
|
||||
title text can be replaced with a scene separator or just skipped entirely when you build your
|
||||
manuscript.
|
||||
|
||||
**Header Level 4: Section**
|
||||
This header level signifies a sub-scene level partition, usually called a "section" in the
|
||||
documentation and the user interface. These can be useful if you want to change tag references
|
||||
mid-scene, like if you change the point-of-view character. You are free to use sections as you
|
||||
wish, and you can filter them out of the final manuscript just like with scene titles.
|
||||
|
||||
Page breaks are automatically added before level 1 and 2 headers when you build your project to a
|
||||
format that supports page breaks, or when you print the document directly from the build tool. If
|
||||
you want page breaks in other places, you have to specify them manually. See :ref:`a_fmt_break`.
|
||||
|
||||
.. tip::
|
||||
There are multiple options of how to process novel titles when building the manuscript. For
|
||||
instance, chapter numbers can be applied automatically, and so can scene numbers if you want
|
||||
them in a draft manuscript. See the :ref:`a_export` page for more details.
|
||||
|
||||
|
||||
.. _a_struct_heads_title:
|
||||
|
||||
Novel Title and Front Matter
|
||||
----------------------------
|
||||
|
||||
It is recommended that you add a document at the very top of each Novel root folder with the novel
|
||||
title as the first line. You should modify the level 1 header format code with an ``!`` in order to
|
||||
render it as a document title that is excluded from any automatic Table of Content in a manuscript
|
||||
build document, like so:
|
||||
|
||||
``#! My Novel``
|
||||
|
||||
The title is by default centred on the page. You can add more text to the page as you wish, like
|
||||
for instance the author's name and details.
|
||||
|
||||
If you want an additional page of text after the title page, starting on a fresh page, you can add
|
||||
``[NEW PAGE]`` on a line by itself, and continue the text after it. This will insert a page break
|
||||
before the text. See also :ref:`a_fmt_break`.
|
||||
|
||||
|
||||
.. _a_struct_heads_unnum:
|
||||
|
||||
Unnumbered Chapter Headings
|
||||
---------------------------
|
||||
|
||||
If you use the automatic numbering feature for your chapters, but you want to keep some special
|
||||
chapters separate from this, you cam add a ``!`` to the level 2 header formatting code to tell the
|
||||
build tool to skip these chapters.
|
||||
|
||||
``##! Unnumbered Chapter Title``
|
||||
|
||||
There is a separate formatting feature for such chapters in the :guilabel:`Build Novel Project`
|
||||
tool as well. See the :ref:`a_export` page for more details. When building a document of a format
|
||||
that supports page breaks, also unnumbered chapters will have a page break added just like for
|
||||
normal chapters.
|
||||
|
||||
.. Note::
|
||||
Previously, you could also disable the automatic numbering of a chapter by adding an ``*`` as
|
||||
the first character of the chapter title itself. This feature has been dropped in favour of the
|
||||
current format in order to keep level 1 and 2 headers consistent. Please update your chapter
|
||||
headings if you've used this syntax.
|
||||
|
||||
|
||||
.. _a_struct_tags:
|
||||
|
||||
Note References
|
||||
===============
|
||||
|
||||
Each text partition, indicated by a heading of any level, can contain references to tags set in the
|
||||
project notes of the project. The references are gathered by the indexer and used to generate the
|
||||
Outline View. This section covers how to make references to tags. See :ref:`a_notes_tags` for how
|
||||
to define tags the references can point to.
|
||||
|
||||
References and tags are also clickable in the document editor and viewer, making it easy to
|
||||
navigate between reference notes while writing. Clicked links are always opened in the view panel.
|
||||
|
||||
References are set as a keyword and a list of corresponding tags. The valid keywords are listed
|
||||
below. The format of a reference line is ``@keyword: value1, [value2] ... [valueN]``. All keywords
|
||||
allow multiple values.
|
||||
|
||||
``@pov``
|
||||
The point-of-view character for the current section. The target must be a note tag in a
|
||||
:guilabel:`Character` type root folder.
|
||||
|
||||
``@focus``
|
||||
The character that has the focus for the current section. This can be used in cases where the
|
||||
focus is not a point-of-view character. The target must be a note tag in a :guilabel:`Character`
|
||||
type root folder.
|
||||
|
||||
``@char``
|
||||
Other characters in the current section. The target must be a note tag in a
|
||||
:guilabel:`Character` type root folder. This should not include the point-of-view or focus
|
||||
character if those references are used.
|
||||
|
||||
``@plot``
|
||||
The plot or subplot advanced in the current section. The target must be a note tag in a
|
||||
:guilabel:`Plot` type root folder.
|
||||
|
||||
``@time``
|
||||
The timelines touched by the current section. The target must be a note tag in a
|
||||
:guilabel:`Timeline` type root folder.
|
||||
|
||||
``@location``
|
||||
The location the current section takes place in. The target must be a note tag in a
|
||||
:guilabel:`Locations` type root folder.
|
||||
|
||||
``@object``
|
||||
Objects present in the current section. The target must be a note tag in a :guilabel:`Object`
|
||||
type root folder.
|
||||
|
||||
``@entity``
|
||||
Entities present in the current section. The target must be a note tag in a
|
||||
:guilabel:`Entities` type root folder.
|
||||
|
||||
``@custom``
|
||||
Custom references in the current section. The target must be a note tag in a :guilabel:`Custom`
|
||||
type root folder. The custom folder are for any other category of notes you may want to use.
|
||||
|
||||
The syntax highlighter will alert the user that the tags and references are used correctly, and
|
||||
that the tags referenced exist.
|
||||
|
||||
The highlighter may be mistaken if the index of defined tags is out of date. If so, press :kbd:`F9`
|
||||
to regenerate it, or select :guilabel:`Rebuild Index` from the :guilabel:`Tools` menu. In general,
|
||||
the index for a document is regenerated when it is saved, so this shouldn't normally be necessary.
|
||||
|
||||
Example of a novel document with references to characters and plots:
|
||||
|
||||
.. code-block:: none
|
||||
:linenos:
|
||||
|
||||
## Chapter 1
|
||||
|
||||
@pov: Jane
|
||||
|
||||
### Scene 1
|
||||
|
||||
@char: John, Sam
|
||||
@plot: Main
|
||||
|
||||
Once upon a time ...
|
||||
|
||||
|
||||
.. _a_struct_layout:
|
||||
|
||||
Document Layout
|
||||
===============
|
||||
|
||||
All documents in the project can have a layout format set. Previously, there were multiple layouts
|
||||
available to change how the documents where formatted on export. These have now been reduced to
|
||||
just two layouts: :guilabel:`Novel Document` and :guilabel:`Project Note`.
|
||||
|
||||
Novel documents can only live in a :guilabel:`Novel` type root folder. You can also move them to
|
||||
:guilabel:`Archive` and :guilabel:`Trash` of course. Project notes can be added anywhere in the
|
||||
project.
|
||||
|
||||
The project tree can distinguish between the different layouts and header levels of the documents
|
||||
using coloured icons, and optionally add emphasis on the label (See the :guilabel:`Preferences`.)
|
||||
For novel documents, the heading level of the first heading is recorded, and indicated by the icon.
|
||||
|
||||
.. tip::
|
||||
You can always start writing with a coarse setup with one or a few documents, and then later use
|
||||
the split tool to split the documents into separate chapter and scene documents. You can split a
|
||||
document on any of the four header levels.
|
||||
@@ -1 +1,4 @@
|
||||
sphinx_rtd_theme
|
||||
furo
|
||||
sphinx>=4.0
|
||||
pygments>=2.7
|
||||
docutils==0.17.1
|
||||
|
||||
56
docs/source/tech_locations.rst
Normal 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.
|
||||
159
docs/source/tech_storage.rst
Normal file
@@ -0,0 +1,159 @@
|
||||
.. _a_storage:
|
||||
|
||||
******************
|
||||
How Data is Stored
|
||||
******************
|
||||
|
||||
This section contains details of how novelWriter stores and handles the project data.
|
||||
|
||||
|
||||
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 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
|
||||
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.
|
||||
|
||||
If this file is lost or corrupted, the structure of the project is lost, although not the text
|
||||
itself. It is important to keep this file backed up, either through the built-in backup tool, or
|
||||
your own backup solution.
|
||||
|
||||
.. tip::
|
||||
The novelWriter project folder is structured so that it can easily be added to a version control
|
||||
system like git. If 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.
|
||||
|
||||
The project XML file is indent-formatted, and is suitable for diff tools and version control since
|
||||
most of the file will stay static, although a timesetamp is set in the meta section on line 2, and
|
||||
various meta data entries incremented, on each save.
|
||||
|
||||
|
||||
Project Documents
|
||||
=================
|
||||
|
||||
All the project documents are saved in a folder in the main project folder named ``content``. Each
|
||||
document has a file handle 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
|
||||
when having the document open, or look in the ``ToC.txt`` file in the root of the project folder.
|
||||
The ``ToC.txt`` file has a list of all documents in the project, referenced by their label, and
|
||||
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. This is particularly useful
|
||||
when using a versioning system.
|
||||
|
||||
Each document file contains a plain text version of the text from the editor. The file can in
|
||||
principle be edited in any text editor, and is suitable for diffing and version control if so
|
||||
desired. Just make sure the file remains in utf-8 encoding, otherwise unicode characters may
|
||||
become mangled when the file is opened in novelWriter again.
|
||||
|
||||
Editing these files is generally not recommended outside of special circumstances, whatever they
|
||||
may be. The reason for this is that the index will not be automatically updated when doing so,
|
||||
which means novelWriter doesn't know you've altered the file. If you do edit a file in this manner,
|
||||
you should rebuild the index when you next open the project in novelWriter.
|
||||
|
||||
The first lines of the file may contain some meta data starting with the characters ``%%~``. These
|
||||
lines are mainly there to restore some information if it is lost from the project file, and the
|
||||
information may be helpful if you do open the file in an external editor as it contains the
|
||||
document label and the document class and layout. The lines can be deleted without any consequences
|
||||
to the rest of the content of the file, and will be added back the next time the document is saved
|
||||
in novelWriter.
|
||||
|
||||
|
||||
The File Saving Process
|
||||
-----------------------
|
||||
|
||||
When saving the project file, or any of the documents, the data is first saved to a temporary file.
|
||||
If successful, the old data file is then removed, and the temporary file becomes the new file. This
|
||||
ensures that the previously saved data is only replaced when the new data has been successfully
|
||||
saved to the storage medium.
|
||||
|
||||
For the project XML file, a ``.bak`` file is in addition kept, which will always contain the
|
||||
previous version of the file, although when auto-save is enabled, they may have the same content.
|
||||
If the opening of a project file fails, novelWriter will automatically try to open the ``.bak``
|
||||
file instead.
|
||||
|
||||
|
||||
Project Meta Data
|
||||
=================
|
||||
|
||||
The project folder contains a subfolder named ``meta``, containing a number of files. The meta
|
||||
folder contains semi-important files. That is, they can be lost with only minor impact to the
|
||||
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 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
|
||||
-----------------
|
||||
|
||||
Between writing sessions, the project index is saved in a JSON file in ``meta/tagsIndex.json``.
|
||||
This file is not critical. If it is lost, it can be rebuilt from within novelWriter from the
|
||||
:guilabel:`Tools` menu.
|
||||
|
||||
The index is maintained and updated whenever a document or note is saved in the editor. It contains
|
||||
all references and tags in documents and notes, as well as the location of all headers in the
|
||||
project, and the word counts within each header section.
|
||||
|
||||
The integrity of the index is checked when the file is loaded. It is possible to corrupt the index
|
||||
if the file is manually edited and manipulated, so the check is important to avoid sudden crashes
|
||||
of novelWriter. If the file contains errors, novelWriter will automatically build it anew. If the
|
||||
check somehow fails and novelWriter keeps crashing, you can delete the file manually and rebuild
|
||||
the index. If this too fails, you have likely encountered a bug.
|
||||
|
||||
|
||||
Cached GUI Options
|
||||
------------------
|
||||
|
||||
A file named ``meta/guiOptions.json`` contains the latest state of various GUI buttons, switches,
|
||||
dialog window sizes, column sizes, etc, from the GUI. These are the GUI settings that are specific
|
||||
to the project. Global GUI settings are stored in the main config file.
|
||||
|
||||
The file is not critical, but if it is lost, all such GUI options will revert back to their default
|
||||
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
|
||||
-------------
|
||||
|
||||
The writing progress is saved in the ``meta/sessionStats.log`` file. This file records the length
|
||||
and word counts of each writing session on the given project. The file is used by the
|
||||
:guilabel:`Writing Statistics` tool. If this file is lost, the history it contains is also lost,
|
||||
but it has otherwise no impact on the project.
|
||||
|
||||
|
||||
Project Cache
|
||||
=============
|
||||
|
||||
The project ``cache`` folder contains non-critical files. If these files are lost, there is no
|
||||
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. The folder will be removed
|
||||
entirely in novelWriter 2.1.
|
||||
@@ -1,85 +0,0 @@
|
||||
.. _a_tech:
|
||||
|
||||
*********************
|
||||
Technical Information
|
||||
*********************
|
||||
|
||||
This section contains details of how novelWriter stores and handles the project data.
|
||||
|
||||
|
||||
How Data is Stored
|
||||
==================
|
||||
|
||||
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.
|
||||
|
||||
|
||||
Main Project File
|
||||
-----------------
|
||||
|
||||
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.
|
||||
|
||||
If this file is lost or corrupted, the structure of the project is lost. It is important to keep
|
||||
this file backed up, either through the built-in backup tool, or your own backup solution.
|
||||
|
||||
.. tip::
|
||||
The novelWriter project folder is structured so that it can easily be added to a version control
|
||||
system like git. If so, you may want to add a `.gitignore` file to exclude files with the
|
||||
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.
|
||||
|
||||
The project XML file is indent-formatted, suitable for diff tools and version control since most of
|
||||
the file will stay static, although a timesetamp is set in the meta section on line 2 each time the
|
||||
file is saved.
|
||||
|
||||
|
||||
Project Documents
|
||||
-----------------
|
||||
|
||||
The project documents are saved in a folder in the main project folder named ``content``. Each
|
||||
document has a file handle taken from the first 13 characters of a SHA256 hash of the system time
|
||||
when the document was first created. The documents are saved with a filename assembled from this
|
||||
hash and the file extension ``.nwd``.
|
||||
|
||||
If you wish to find the physical 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
|
||||
when having the document open, or look in the ``ToC.txt`` file in the root of the project folder.
|
||||
The ``ToC.txt`` file has a list of all document files in the project and 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. The file meta data in the
|
||||
project tree is mainly saved in the project XML file, although some basic meta data is added to the
|
||||
header of each document file.
|
||||
|
||||
Each document file contains a plain text version of the text from the editor. The file can in
|
||||
principle be edited in any text editor, and is suitable for diffing and version control if so
|
||||
desired. Just make sure the file remains in utf-8 encoding, otherwise unicode chatracters may
|
||||
become mangled when the file is opened in novelWriter again.
|
||||
|
||||
The first lines of the file may contain some meta data starting with the characters ``%%~``. These
|
||||
lines are mainly there to restore some information if it is lost from the project file, and the
|
||||
information may be helpful if you do open the file in an external editor as it contains the
|
||||
document label and the document class and layout. The lines can be deleted without any consequences
|
||||
to the rest of the content of the file, and will be added back the next time the document is saved
|
||||
in novelWriter.
|
||||
|
||||
|
||||
The File Saving Process
|
||||
-----------------------
|
||||
|
||||
When saving the project file, or any of the documents, the data is first saved to a temporary file.
|
||||
If successful, the old data file is removed, and the temporary file becomes the new file. This
|
||||
ensures that the previously saved data is only replaced when the new data has been successfully
|
||||
saved to the storage medium.
|
||||
|
||||
For the project XML file, a ``.bak`` file is in addition kept, which will always contain the
|
||||
previous version of the file, although when auto-save is enabled, they may have the same content.
|
||||
If the opening of a project file fails, novelWriter will automatically try to open the ``.bak``
|
||||
file instead.
|
||||
85
docs/source/tech_tests.rst
Normal file
@@ -0,0 +1,85 @@
|
||||
.. _a_pytest:
|
||||
|
||||
*************
|
||||
Running Tests
|
||||
*************
|
||||
|
||||
The novelWriter source code is well covered by tests. The test framework used for the development
|
||||
is ``pytest`` with the use of an extension for Qt.
|
||||
|
||||
|
||||
Dependencies
|
||||
============
|
||||
|
||||
The dependencies for running the tests can be installed with:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pip install -r requirements-dev.txt
|
||||
|
||||
This will install a couple of extra packages for coverage and test management. The minimum
|
||||
requirement is ``pytest`` and ``pytest-qt``.
|
||||
|
||||
|
||||
Simple Test Run
|
||||
===============
|
||||
|
||||
To run the tests, you simply need to execute the following from the root of the source folder:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
pytest
|
||||
|
||||
Since several of the tests involve opening up the novelWriter GUI, you may want to disable the GUI
|
||||
for the duration of the test run. Moving your mouse while the tests are running may otherwise
|
||||
interfere with the execution of some tests.
|
||||
|
||||
You can disable the renderring of the GUI by setting the flag ``export QT_QPA_PLATFORM=offscreen``,
|
||||
or alternatively run the tests with the ``xvfb`` package, like so:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
xvfb-run pytest
|
||||
|
||||
|
||||
Advanced Options
|
||||
================
|
||||
|
||||
Adding the flag ``-v`` to the ``pytest`` command will increase verbosity of the test execution.
|
||||
|
||||
You can also add coverage report generation. For instance to HTML:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
xvfb-run pytest -v --cov=novelwriter --cov-report=html
|
||||
|
||||
Other useful report formats are ``xml``, and ``term`` for terminal output.
|
||||
|
||||
You can also run tests per subpackage of novelWriter with the ``-m`` command. The available
|
||||
subpackage groups are ``base``, ``core``, and ``gui``. Consider for instance:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
xvfb-run pytest -v --cov=novelwriter --cov-report=html -m core
|
||||
|
||||
This will only run the tests of the "core" package, that is, all the classes that deal with the
|
||||
project data of a novelWriter project. The "gui" tests, likewise, will run the tests for the GUI
|
||||
components, and the "base" tests cover the bits in-between.
|
||||
|
||||
You can also filter the tests with the ``-k`` switch. The following will do the same as
|
||||
``-m core``:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
xvfb-run pytest -v --cov=novelwriter --cov-report=html -k testCore
|
||||
|
||||
All tests are named in such a way that you can filter them by adding more bits of the test names.
|
||||
They all start with the word "test". Then comes the group: "Core", "Base", "Dlg", "Tool", or "Gui".
|
||||
Finally comes the name of the class or module, which generally corresponds to a single source code
|
||||
file. For instance, running the following will run all tests for the document editor:
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
xvfb-run pytest -v --cov=novelwriter --cov-report=html -k testGuiEditor
|
||||
|
||||
To run a single test, simply add the full test name to the ``-k`` switch.
|
||||
209
docs/source/usage_breakdown.rst
Normal 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.
|
||||
|
||||
248
docs/source/usage_format.rst
Normal file
@@ -0,0 +1,248 @@
|
||||
.. _a_fmt:
|
||||
|
||||
********************
|
||||
Formatting Your Text
|
||||
********************
|
||||
|
||||
The novelWriter text editor is a plain text editor that uses formatting codes for setting meta data
|
||||
values and allowing for some text formatting. The syntax is based on Markdown, but novelWriter is
|
||||
*not* a Markdown editor. It supports basic formatting like emphasis (italic), strong importance
|
||||
(bold) and strikethrough text, as well as four levels of headings.
|
||||
|
||||
In addition to formatting codes, novelWriter allows for comments, a synopsis tag, and a set of
|
||||
keyword and value sets used for tags and references. There are also some codes that apply two whole
|
||||
paragraphs. See :ref:`a_fmt_text` below for more details.
|
||||
|
||||
|
||||
.. _a_fmt_hlight:
|
||||
|
||||
Syntax Highlighting
|
||||
===================
|
||||
|
||||
The editor has a syntax highlighter feature that is meant to help you know when you've used the
|
||||
formtatting tags or other features correctly. It will change the colour and font size of your
|
||||
headings, change the text colour of emphasised text, and it can also show you where you have
|
||||
dialogue in your text.
|
||||
|
||||
When you use the commands to set tags and references, these also change colour. Correct commands
|
||||
have a dedicated colour, and the references themselves will get a colour if they are valid. Invalid
|
||||
references will get a squiggly error line underneath. The same applies to duplicate tags.
|
||||
|
||||
There are a number of syntax highlighter colour themes available, both for light and dark GUIs. You
|
||||
can select them for :guilabel:`Preferences`.
|
||||
|
||||
|
||||
.. _a_fmt_head:
|
||||
|
||||
Headings
|
||||
========
|
||||
|
||||
Four levels of headings are allowed. For project notes, they are free to be used as you see fit.
|
||||
That is, novelWriter doesn't assign the different headings any particular meaning. However, for
|
||||
novel documents they indicate the structural level of the novel and must be used correctly to
|
||||
produce the intended result. See :ref:`a_struct_heads` for more details.
|
||||
|
||||
``# Title Text``
|
||||
Heading level one. For novel documents, the header level indicates the start of a new partition.
|
||||
|
||||
``## Title Text``
|
||||
Heading level two. For novel documents, the header level indicates the start of a new chapter.
|
||||
Chapter numbers can be inserted automatically when building the manuscript.
|
||||
|
||||
``### Title Text``
|
||||
Heading level three. For novel documents, the header level indicates the start of a new scene.
|
||||
Scene numbers or scene separators can be inserted automatically when building the manuscript,
|
||||
so you can use the title field as a working title for your scenes if you wish.
|
||||
|
||||
``#### Title Text``
|
||||
Heading level four. For novel documents, the header level indicates the start of a new section.
|
||||
Section titles can be replaced by separators or removed completely when building the manuscript.
|
||||
|
||||
For headers level one and two, adding a ``!`` modifies the behaviour of the heading:
|
||||
|
||||
``#! Title Text``
|
||||
This tells the build tool that the level one heading is intended to be used for the novel's
|
||||
main title, like for instance on the front page. When building the manuscript, this will use a
|
||||
different styling and will exclude the title from for instance a Table of Contents in Libre
|
||||
Office.
|
||||
|
||||
``##! Title Text``
|
||||
This tells the build tool to not assign a chapter number to this chapter title if automatic
|
||||
chapter numbers are being used. Such titles are useful for a prologue for instance. See
|
||||
:ref:`a_struct_heads_unnum` for more details.
|
||||
|
||||
.. note::
|
||||
The space after the ``#`` or ``!`` character is mandatory. The syntax highlighter will change
|
||||
colour and font size when the heading is correctly formatted.
|
||||
|
||||
|
||||
.. _a_fmt_text:
|
||||
|
||||
Text Paragraphs
|
||||
===============
|
||||
|
||||
A text paragraph is indicated by a blank line. That is, you need two line breaks to separate two
|
||||
fragments of text into two paragraphs. Single line breaks are treated as line breaks within a
|
||||
paragraph.
|
||||
|
||||
In addition, the editor supports a few additional types of whitespaces:
|
||||
|
||||
* A non-breaking space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Space`.
|
||||
* Thin spaces are also supported, and can be inserted with :kbd:`Ctrl`:kbd:`K`,
|
||||
:kbd:`Shift`:kbd:`Space`.
|
||||
* Non-breaking thin space can be inserted with :kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`.
|
||||
|
||||
These are all insert features, and the :guilabel:`Insert` menu has more. They are also listed
|
||||
in :ref:`a_kb_ins`.
|
||||
|
||||
Non-breaking spaces are highlighted by the syntax highlighter with an alternate coloured
|
||||
background, depending on the selected theme.
|
||||
|
||||
.. tip::
|
||||
Non-breaking spaces are for instance the correct type of space to separate a number from its
|
||||
unit. Generally, non-breaking spaces are used to prevent line wrapping algorithms from adding
|
||||
line breaks where they shouldn't.
|
||||
|
||||
|
||||
.. _a_fmt_emph:
|
||||
|
||||
Text Emphasis
|
||||
=============
|
||||
|
||||
A minimal set of text emphasis styles are supported.
|
||||
|
||||
``_text_``
|
||||
The text is rendered as emphasised text (italicised).
|
||||
|
||||
``**text**``
|
||||
The text is rendered as strongly important text (bold).
|
||||
|
||||
``~~text~~``
|
||||
Strikethrough text.
|
||||
|
||||
In markdown guides it is often recommended to differentiate between strong importance and emphasis
|
||||
by using ``**`` for strong and ``_`` for emphasis, although Markdown generally also supports ``__``
|
||||
for strong and ``*`` for emphasis. However, since the differentiation makes the highlighting and
|
||||
conversion significantly simpler and faster, in novelWriter this is a rule, not just a
|
||||
recommendation.
|
||||
|
||||
In addition, the following rules apply:
|
||||
|
||||
1. The emphasis and strikethrough formatting tags do not allow spaces between the words and the tag
|
||||
itself. That is, ``**text**`` is valid, ``**text **`` is not.
|
||||
2. More generally, the delimiters must be on the outer edge of words. That is, ``some **text in
|
||||
bold** here`` is valid, ``some** text in bold** here`` is not.
|
||||
3. If using both ``**`` and ``_`` to wrap the same text, the underscore must be the inner wrapper.
|
||||
This is due to the underscore also being a valid word character, so if they are on the outside,
|
||||
they violate rule 2.
|
||||
4. Text emphasis does not span past line breaks. If you need to add emphasis to multiple lines or
|
||||
paragraphs, you must apply it to each of them in turn.
|
||||
|
||||
|
||||
.. _a_fmt_comm:
|
||||
|
||||
Comments and Synopsis
|
||||
=====================
|
||||
|
||||
In addition to these standard Markdown features, novelWriter also allows for comments in documents.
|
||||
The text of a comment is ignored by the word counter. The text can also be filtered out when
|
||||
building the manuscript or viewing the document.
|
||||
|
||||
If the first word of a comment is ``Synopsis:`` (with the colon included), the comment is treated
|
||||
specially and will show up in the :ref:`a_ui_outline` in a dedicated column. The word ``synopsis``
|
||||
is not case sensitive. If it is correctly formatted, the syntax highlighter will indicate this by
|
||||
altering the colour of the word.
|
||||
|
||||
``% text...``
|
||||
This is a comment. The text is not renderred by default (this can be overridden), seen in the
|
||||
document viewer, or counted towards word counts.
|
||||
|
||||
``% Synopsis: text...``
|
||||
This is a synopsis comment. It is generally treated in the same way as a regular comment, except
|
||||
that it is also captured by the indexing algorithm and displayed in the :ref:`a_ui_outline`. It
|
||||
can also be filtered separately when building the project to for instance generate an outline
|
||||
document of the whole project.
|
||||
|
||||
.. note::
|
||||
Only one comment can be flagged as a synopsis comment for each heading. If multiple comments are
|
||||
flagged as synopsis comments, the last one will be used and the rest ignored.
|
||||
|
||||
|
||||
.. _a_fmt_tags:
|
||||
|
||||
Tags and References
|
||||
===================
|
||||
|
||||
The document editor supports a set of keywords used for setting tags, and making references between
|
||||
documents. The tag can be set once per section defined by a heading. Setting it multiple times
|
||||
under the same heading will just override the previous setting. References can be set anywhere
|
||||
within a section, and are collected according to their category.
|
||||
|
||||
``@keyword: value``
|
||||
A keyword argument followed by a value, or a comma separated list of values.
|
||||
|
||||
The available tag and reference keywords are listed in the :ref:`a_struct_tags` section. They can
|
||||
also be inserted at the cursor position in the editor via the :guilabel:`Insert` menu.
|
||||
|
||||
|
||||
.. _a_fmt_align:
|
||||
|
||||
Paragraph Alignment and Indentation
|
||||
===================================
|
||||
|
||||
All documents have the text by default aligned to the left or justified, depending on your
|
||||
Preferences.
|
||||
|
||||
You can override the default text alignment on individual paragraphs by specifying alignment tags.
|
||||
These tags are double angle brackets. Either ``>>`` or ``<<``. You put them either before or after
|
||||
the paragraph, and they will "push" the text towards the edge the brackets point towards. This
|
||||
should be fairly intuitive.
|
||||
|
||||
Indentation uses a similar syntax. But here you use a single ``>`` or ``<`` to push the text away
|
||||
from the edge.
|
||||
|
||||
Examples:
|
||||
|
||||
.. csv-table:: Text Alignment and Indentation
|
||||
:header: "Syntax", "Description"
|
||||
:widths: 40, 60
|
||||
:class: "tight-table"
|
||||
|
||||
"``>> Right aligned text``", "The text paragraph is right-aligned."
|
||||
"``Left aligned text <<``", "The text paragraph is left-aligned."
|
||||
"``>> Centred text <<``", "The text paragraph is centred."
|
||||
"``> Left indented text``", "The text has an increased left margin."
|
||||
"``Right indented text <``", "The text has an increased right margin."
|
||||
"``> Left/right indented text <``", "The text has an both margins increased."
|
||||
|
||||
.. note::
|
||||
The text editor will not show the alignment and indentation live. But the viewer will show them
|
||||
when you open the document there. It will of course also be reflected in the document generated
|
||||
from the build tool as long as the format supports paragraph alignment.
|
||||
|
||||
|
||||
.. _a_fmt_break:
|
||||
|
||||
Vertical Space and Page Breaks
|
||||
==============================
|
||||
|
||||
Adding more than one line break between paragraphs will *not* increase the space between those
|
||||
paragraphs when building the project. To add additional space between paragraphs, add the text
|
||||
``[VSPACE]`` on a line of its own, and the build tool will insert a blank paragraph in its place.
|
||||
|
||||
If you need multiple blank paragraphs just add a colon and a number to the above code. For
|
||||
instance, writing ``[VSPACE:3]`` will insert three blank paragraphs.
|
||||
|
||||
Normally, the build tool will insert a page break before all headers of level one and for all
|
||||
headers of level two for novel documents, i.e. chapters, but not for project notes.
|
||||
|
||||
If you need to add a page break somewhere else, put the text ``[NEW PAGE]`` on a line by itself
|
||||
before the text you wish to start on a new page.
|
||||
|
||||
Page breaks are automatically added to partition, chapter and unnumbered chapter headers of novel
|
||||
documents. If you want such breaks for scenes and sections, you must add them manually.
|
||||
|
||||
.. note::
|
||||
The page break code is applied to the text that follows it. It adds a "page break before" mark
|
||||
to the text when exporting to HTML or Open Document. This means that a ``[NEW PAGE]`` which has
|
||||
no text following it, it will not result in a page break.
|
||||
271
docs/source/usage_interface.rst
Normal file
@@ -0,0 +1,271 @@
|
||||
.. _a_ui:
|
||||
|
||||
******************
|
||||
The User Interface
|
||||
******************
|
||||
|
||||
.. _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:
|
||||
|
||||
The Project Tree
|
||||
================
|
||||
|
||||
The main window contains a project tree in the left-most panel. It shows the entire structure of
|
||||
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. 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 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 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. You can change these labels from the
|
||||
context menu.
|
||||
|
||||
Right-clicking an item in the project tree will open a context menu under the cursor, displaying
|
||||
a selection of actions that can be performed on the selected item.
|
||||
|
||||
At the top of the tree, you will find a set of buttons.
|
||||
|
||||
* The first button is a quick links button that will show you a dropdown menu of all the root
|
||||
folders in your project. Selecting one will move to that position in the tree. You can also
|
||||
activate this menu by pressing :kbd:`Ctrl`:kbd:`L`.
|
||||
* The next two buttons can be used to move items up and down in the project tree. This is the only
|
||||
way to move root folders.
|
||||
* The next button opens a dropdown menu for adding new items to the tree. This includes root
|
||||
folders. You can also activate this dropdown menu by pressing :kbd:`Ctrl`:kbd:`N`.
|
||||
* The last button is a menu of further actions on the entire project tree.
|
||||
|
||||
.. tip::
|
||||
Under the :guilabel:`Transform` submenu in the context menu of an item, you will find several
|
||||
options on how to change a document or folder. This includes changing between document and note,
|
||||
splitting them into multiple documents, or merging child items into a single document.
|
||||
|
||||
Below the project tree you will find a small details panel showing the full information of the
|
||||
currently selected item. This panel also includes the latest paragraph and character counts in
|
||||
addition to the word count.
|
||||
|
||||
|
||||
.. _a_ui_tree_novel:
|
||||
|
||||
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 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 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:
|
||||
|
||||
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. The app doesn't do anything with them at all. To
|
||||
modify the labels, go to their respective tabs in :guilabel:`Project Settings`.
|
||||
|
||||
The "Status" flag is intended to tag a Novel document as for instance a draft or as completed, and
|
||||
the "Importance" flag is intended to tag character notes, or other notes, as for instance a main,
|
||||
major or minor character.
|
||||
|
||||
Whether a document uses a "Status" or "Importance" flag depends on which root folder it lives in.
|
||||
If it's in the :guilabel:`Novel` folder, it uses the "Status" flag, otherwise it uses an
|
||||
"Importance" flag. Some folders, like :guilabel:`Trash` and :guilabel:`Archive` allow both.
|
||||
|
||||
|
||||
.. _a_ui_tree_dnd:
|
||||
|
||||
Project Tree Drag & Drop
|
||||
------------------------
|
||||
|
||||
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. 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 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:
|
||||
|
||||
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.
|
||||
|
||||
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 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`.
|
||||
|
||||
.. tip::
|
||||
Clicking on the document title bar will select the document in the project tree and reveal its
|
||||
location, making it easier to locate in a large project.
|
||||
|
||||
Any tag reference in the editor can be opened in the viewer by moving the cursor to the label and
|
||||
pressing :kbd:`Ctrl`:kbd:`Return`. You can also control-click them with your mouse. In the viewer,
|
||||
the references become clickable links. Clicking them will replace the content of the viewer with
|
||||
the content of the document the reference points to.
|
||||
|
||||
The document viewer keeps a history of viewed documents, which you can navigate with the arrow
|
||||
buttons in the top–left corner of the viewer. If your mouse has backward and forward navigation
|
||||
buttons, these can be used as well. They work just like the backward and forward features in a
|
||||
browser.
|
||||
|
||||
At the bottom of the view panel there is a :guilabel:`References` panel. (If it is hidden, click
|
||||
the icon to reveal it.) This panel will show links to all documents referring back to the one
|
||||
you're currently viewing, if any has been defined. The :guilabel:`Sticky` button will freeze the
|
||||
content of the panel to the current document, even if you navigate to another document. This is
|
||||
convenient if you want to quickly look through all documents in the list in the
|
||||
:guilabel:`References` panel without losing the list in the process.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`References` panel relies on an up-to-date index of the project. The index is
|
||||
maintained automatically. However, if anything is missing, or seems wrong, the index can always
|
||||
be rebuilt by selecting :guilabel:`Rebuild Index` from the :guilabel:`Tools` menu, or by
|
||||
pressing :kbd:`F9`.
|
||||
|
||||
|
||||
.. _a_ui_edit_search:
|
||||
|
||||
Search & Replace
|
||||
----------------
|
||||
|
||||
The document editor has a search and replace tool that can be activated with :kbd:`Ctrl`:kbd:`F`
|
||||
for search mode or :kbd:`Ctrl`:kbd:`H` for search and replace mode.
|
||||
|
||||
Pressing :kbd:`Return` while in the search box will search for the next occurrence of the word, and
|
||||
:kbd:`Shift`:kbd:`Return` for the previous. Pressing :kbd:`Return` in the replace box, will replace
|
||||
the highlighted text and move to the next result.
|
||||
|
||||
There are a number of settings for the search tool available as toggle switches above the search
|
||||
box. They allow you to search for, in order: matched case only, whole word results only, search
|
||||
using regular expressions, loop search when reaching the end of the document, and move to the next
|
||||
document when reaching the end. There is also a switch that will try to match the case of the word
|
||||
when the replacement is made. That is, it will try to keep the word upper, lower, or capitalised to
|
||||
match the word being replaced.
|
||||
|
||||
The regular expression search is somewhat dependant on which version of Qt your system has. If you
|
||||
have Qt 5.13 or higher, there is better support for unicode symbols in the search.
|
||||
|
||||
|
||||
.. _a_ui_edit_auto:
|
||||
|
||||
Auto-Replace as You Type
|
||||
========================
|
||||
|
||||
A few auto-replace features are supported by the editor. You can control every aspect of the
|
||||
auto-replace feature from :guilabel:`Preferences`. You can also disable this feature entirely if
|
||||
you wish.
|
||||
|
||||
.. tip::
|
||||
If you don't like auto-replacement, all symbols inserted by this feature are also available in
|
||||
the :guilabel:`Insert` menu, and via convenient :ref:`a_kb_ins`. You may also be using a
|
||||
`Compose Key`_ setup, which means you may not need the auto-replace feature.
|
||||
|
||||
The editor is able to replace two and three hyphens with short and long dashes, triple points with
|
||||
ellipsis, and replace straight single and double quotes with user-defined quote symbols. It will
|
||||
also try to determine whether to use the opening or closing symbol, although this feature isn't
|
||||
always accurate. Especially distinguishing between closing single quote and apostrophe can be
|
||||
tricky for languages that use the same symbol for these, like English does.
|
||||
|
||||
.. tip::
|
||||
If the auto-replace feature changes a symbol when you did not want it to change, pressing
|
||||
:kbd:`Ctrl`:kbd:`Z` immediately after the auto-replacement will undo it without undoing the
|
||||
character you typed.
|
||||
|
||||
|
||||
.. _a_ui_outline:
|
||||
|
||||
Project Outline View
|
||||
====================
|
||||
|
||||
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 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.
|
||||
|
||||
The information viewed in the outline is based on the project's main index. While novelWriter does
|
||||
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 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`.
|
||||
133
docs/source/usage_projectformat.rst
Normal file
@@ -0,0 +1,133 @@
|
||||
.. _a_prjfmt:
|
||||
|
||||
**********************
|
||||
Project Format Changes
|
||||
**********************
|
||||
|
||||
.. _File Format Spec 1.5: _static/fileformatspec15.pdf
|
||||
.. _documentation: https://novelwriter.readthedocs.io
|
||||
|
||||
Most of the changes to the file formats over the history of novelWriter have no impact on the
|
||||
user-side of things. The project files are generally updated automatically. However, some of the
|
||||
changes require minor actions from the user.
|
||||
|
||||
The key changes in the formats are listed below, as well as the user actions required, where
|
||||
applicable.
|
||||
|
||||
.. only:: not html
|
||||
|
||||
A full project file format specification is available in the online documentation_.
|
||||
|
||||
.. caution::
|
||||
|
||||
When you update a project from one format version to the next, the project can no longer be
|
||||
opened by a version of novelWriter prior to the version where the new file format was
|
||||
introduced. You will get a notification about any updates to your project file format and will
|
||||
have the option to decline the upgrade.
|
||||
|
||||
.. only:: html
|
||||
|
||||
**For Developers**
|
||||
|
||||
A full description of the current file format is available in the `File Format Spec 1.5`_
|
||||
document, available as a PDF. This document is intended for contributors to novelWriter, those
|
||||
building project conversion tools, either to or from tne novelWriter format, and for those who
|
||||
wish to make their own templating system.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_5:
|
||||
|
||||
Format 1.5 Changes
|
||||
==================
|
||||
|
||||
This project format was introduced in novelWriter version 2.0 RC 2.
|
||||
|
||||
This is a modification of the 1.4 format. It makes the XML more consistent in that meta data have
|
||||
been moved to their respective section nodes as attributes, and key/value settings now have a
|
||||
consistent format. Logical flags are saved as yes/no instead of Python True/False, and the main
|
||||
heading of the document is now saved to the item rather than in the index. The conversion is done
|
||||
automatically the first time a project is loaded. No user action is required.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_4:
|
||||
|
||||
Format 1.4 Changes
|
||||
==================
|
||||
|
||||
This project format was introduced in novelWriter version 2.0 RC 1. Since this was a release
|
||||
candidate, it is unlikely that your project uses it, but it may be the case if you've installed a
|
||||
pre-release.
|
||||
|
||||
This format changes the way project items (folders, documents and notes) are stored. It is a more
|
||||
compact format that is simpler and faster to parse, and easier to extend. The conversion is done
|
||||
automatically the first time a project is loaded. No user action is required.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_3:
|
||||
|
||||
Format 1.3 Changes
|
||||
==================
|
||||
|
||||
This project format was introduced in novelWriter version 1.5.
|
||||
|
||||
With this format, the number of document layouts was reduced from 8 to 2. The conversion of
|
||||
document layouts is performed automatically when the project is opened.
|
||||
|
||||
Due to the reduction of layouts, some features that were previously controlled by these layouts
|
||||
will be lost. These features are instead now controlled by syntax codes, so to recover these
|
||||
features, some minor modification must be made to select documents by the user.
|
||||
|
||||
The manual changes the user must make should be very few as they apply to document layouts that
|
||||
should be used only a few places in any given project. These are as follows:
|
||||
|
||||
**Title Pages**
|
||||
|
||||
* The formatting of the level one title on the title page must be changed from ``# Title Text`` to
|
||||
``#! Title Text`` in order to retain the previous functionality. See :ref:`a_fmt_head`.
|
||||
* Any text that was previously centred on the page must be manually centred using the new text
|
||||
alignment feature. See :ref:`a_fmt_align`.
|
||||
|
||||
**Unnumbered Chapters**
|
||||
|
||||
* Since the specific layout for unnumbered chapters has been dropped, such chapters must all use
|
||||
the ``##! Chapter Name`` formatting code instead of ``## Chapter Name``. This also includes
|
||||
chapters marked by an asterisk: ``## *Chapter Name``, as this feature has also been dropped.
|
||||
See :ref:`a_fmt_head`.
|
||||
|
||||
**Plain Pages**
|
||||
|
||||
* The layout named "Plain Page" has also been removed. The only feature of this layout was that it
|
||||
ensured that the content always started on a fresh page. In the new format, fresh pages can be
|
||||
set anywhere in the text with the ``[NEW PAGE]`` code. See :ref:`a_fmt_break`.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_2:
|
||||
|
||||
Format 1.2 Changes
|
||||
==================
|
||||
|
||||
This project format was introduced in novelWriter version 0.10.
|
||||
|
||||
With this format, the way auto-replace entries were stored in the main project XML file changed.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_1:
|
||||
|
||||
Format 1.1 Changes
|
||||
==================
|
||||
|
||||
This project format was introduced in novelWriter version 0.7.
|
||||
|
||||
With this format, the ``content`` folder was introduced in the project storage. Previously, all
|
||||
novelWriter documents were saved in a series of folders numbered from ``data_0`` to ``data_f``.
|
||||
|
||||
It also reduces the number of meta data and cache files. These files are automatically deleted if
|
||||
an old project is opened. This was also when the Table of Contents file was introduced.
|
||||
|
||||
|
||||
.. _a_prjfmt_1_0:
|
||||
|
||||
Format 1.0 Changes
|
||||
==================
|
||||
|
||||
This is the original file format and project structure. It was in use up to version 0.6.3.
|
||||
146
docs/source/usage_shortcuts.rst
Normal file
@@ -0,0 +1,146 @@
|
||||
.. _a_kb:
|
||||
|
||||
******************
|
||||
Keyboard Shortcuts
|
||||
******************
|
||||
|
||||
Most features in novelWriter are available as keyboard shortcuts. This is a reference list if these
|
||||
shortcuts. Most of them are also listed in the application.
|
||||
|
||||
|
||||
.. _a_kb_main:
|
||||
|
||||
Main Shortcuts
|
||||
==============
|
||||
|
||||
The main shorcuts are as follows:
|
||||
|
||||
.. csv-table:: Keyboard Shortcuts
|
||||
:header: "Shortcut", "Description"
|
||||
:widths: 22, 78
|
||||
:class: "tight-table"
|
||||
|
||||
":kbd:`F1`", "Open the online user manual."
|
||||
":kbd:`F2`", "If in the project tree, edit an item's label."
|
||||
":kbd:`F3`", "Find next occurrence of search word in current document."
|
||||
":kbd:`F5`", "Open the :guilabel:`Build Novel Project` dialog."
|
||||
":kbd:`F6`", "Open the :guilabel:`Writing Statistics` dialog."
|
||||
":kbd:`F7`", "Re-run spell checker."
|
||||
":kbd:`F8`", "Toggle :guilabel:`Focus Mode`."
|
||||
":kbd:`F9`", "Re-build the project index."
|
||||
":kbd:`F11`", "Toggle full screen mode."
|
||||
":kbd:`Return`", "If in the project tree, open a document for editing."
|
||||
":kbd:`Alt`:kbd:`1`", "Switch focus to the project tree. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`1`."
|
||||
":kbd:`Alt`:kbd:`2`", "Switch focus to document editor. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`2`."
|
||||
":kbd:`Alt`:kbd:`3`", "Switch focus to document viewer. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`3`."
|
||||
":kbd:`Alt`:kbd:`4`", "Switch focus to outline view. On Windows, use :kbd:`Ctrl`:kbd:`Alt`:kbd:`4`."
|
||||
":kbd:`Alt`:kbd:`Left`", "Move backward in the view history of the document viewer."
|
||||
":kbd:`Alt`:kbd:`Right`", "Move forward in the view history of the document viewer."
|
||||
":kbd:`Ctrl`:kbd:`.`", "Open the context menu in the project tree or the document editor."
|
||||
":kbd:`Ctrl`:kbd:`,`", "Open the :guilabel:`Preferences` dialog."
|
||||
":kbd:`Ctrl`:kbd:`/`", "Toggle block format as comment."
|
||||
":kbd:`Ctrl`:kbd:`0`", "Remove block formatting for block under cursor."
|
||||
":kbd:`Ctrl`:kbd:`1`", "Change block format to header level 1."
|
||||
":kbd:`Ctrl`:kbd:`2`", "Change block format to header level 2."
|
||||
":kbd:`Ctrl`:kbd:`3`", "Change block format to header level 3."
|
||||
":kbd:`Ctrl`:kbd:`4`", "Change block format to header level 4."
|
||||
":kbd:`Ctrl`:kbd:`5`", "Change block alignment to left-aligned."
|
||||
":kbd:`Ctrl`:kbd:`6`", "Change block alignment to centred."
|
||||
":kbd:`Ctrl`:kbd:`7`", "Change block alignment to right-aligned."
|
||||
":kbd:`Ctrl`:kbd:`8`", "Add a left margin to the block."
|
||||
":kbd:`Ctrl`:kbd:`9`", "Add a right margin to the block."
|
||||
":kbd:`Ctrl`:kbd:`A`", "Select all text in the document."
|
||||
":kbd:`Ctrl`:kbd:`B`", "Format selected text, or word under cursor, with strong emphasis (bold)."
|
||||
":kbd:`Ctrl`:kbd:`C`", "Copy selected text to clipboard."
|
||||
":kbd:`Ctrl`:kbd:`D`", "Strikethrough selected text, or word under cursor."
|
||||
":kbd:`Ctrl`:kbd:`F`", "Open the search bar and search for the selected word, if any is selected."
|
||||
":kbd:`Ctrl`:kbd:`G`", "Find next occurrence of search word in current document."
|
||||
":kbd:`Ctrl`:kbd:`H`", "Open the search and replace tool and search for the selected word, if any is selected. (On Mac, this is :kbd:`Cmd`:kbd:`=`.)"
|
||||
":kbd:`Ctrl`:kbd:`I`", "Format selected text, or word under cursor, with emphasis (italic)."
|
||||
":kbd:`Ctrl`:kbd:`K`", "Activate the insert commands. The commands are listed in :ref:`a_kb_ins`."
|
||||
":kbd:`Ctrl`:kbd:`L`", "Open the :guilabel:`Quick Links` menu in the Project Tree."
|
||||
":kbd:`Ctrl`:kbd:`N`", "Open the Create New Item menu in the Project Tree."
|
||||
":kbd:`Ctrl`:kbd:`O`", "Open selected document."
|
||||
":kbd:`Ctrl`:kbd:`Q`", "Exit novelWriter."
|
||||
":kbd:`Ctrl`:kbd:`R`", "If in the project tree, open a document for viewing. If in the editor, open current document for viewing."
|
||||
":kbd:`Ctrl`:kbd:`S`", "Save the current document in the document editor."
|
||||
":kbd:`Ctrl`:kbd:`V`", "Paste text from clipboard to cursor position."
|
||||
":kbd:`Ctrl`:kbd:`W`", "Close the current document in the document editor."
|
||||
":kbd:`Ctrl`:kbd:`X`", "Cut selected text to clipboard."
|
||||
":kbd:`Ctrl`:kbd:`Y`", "Redo latest undo."
|
||||
":kbd:`Ctrl`:kbd:`Z`", "Undo latest changes."
|
||||
":kbd:`Ctrl`:kbd:`F7`", "Toggle spell checking."
|
||||
":kbd:`Ctrl`:kbd:`Up`", "Move item one step up in the project tree."
|
||||
":kbd:`Ctrl`:kbd:`Down`", "Move item one step down in the project tree."
|
||||
":kbd:`Ctrl`:kbd:`Del`", "Delete next word in editor."
|
||||
":kbd:`Ctrl`:kbd:`Backspace`", "Delete previous word in editor."
|
||||
":kbd:`Ctrl`:kbd:`'`", "Wrap selected text, or word under cursor, in single quotes."
|
||||
":kbd:`Ctrl`:kbd:`""`", "Wrap selected text, or word under cursor, in double quotes."
|
||||
":kbd:`Ctrl`:kbd:`Return`", "Open the tag or reference under the cursor in the Viewer."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`,`", "Open the :guilabel:`Project Settings` dialog."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`/`", "Remove block formatting for block under cursor."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`1`", "Replace occurrence of search word in current document, and search for next occurrence."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`A`", "Select all text in current paragraph."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`G`", "Find previous occurrence of search word in current document."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`I`", "Import text to the current document from a text file."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`O`", "Open a project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`R`", "Close the document viewer."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`S`", "Save the current project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`W`", "Close the current project."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Z`", "Undo move of project tree item."
|
||||
":kbd:`Ctrl`:kbd:`Shift`:kbd:`Del`", "If in the project tree, move an item to Trash."
|
||||
":kbd:`Shift`:kbd:`F1`", "Open the local user manual (PDF) if it is available."
|
||||
":kbd:`Shift`:kbd:`F3`", "Find previous occurrence of search word in current document."
|
||||
":kbd:`Shift`:kbd:`F6`", "Open the :guilabel:`Project Details` dialog."
|
||||
|
||||
.. note::
|
||||
On macOS, replace :kbd:`Ctrl` with :kbd:`Cmd`.
|
||||
|
||||
|
||||
.. _a_kb_ins:
|
||||
|
||||
Insert Shortcuts
|
||||
================
|
||||
|
||||
A set of insert features are also available through shortcuts, but they require a double
|
||||
combination of key sequences. The insert feature is activated with :kbd:`Ctrl`:kbd:`K`, followed by
|
||||
a key or key combination for the inserted content.
|
||||
|
||||
.. csv-table:: Keyboard Shortcuts
|
||||
:header: "Shortcut", "Description"
|
||||
:widths: 30, 70
|
||||
:class: "tight-table"
|
||||
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`−`", "Insert a short dash (en dash)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`_`", "Insert a long dash (em dash)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`_`", "Insert a horizontal bar (quotation dash)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`~`", "Insert a figure dash (same width as a number)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`1`", "Insert a left single quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`2`", "Insert a right single quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`3`", "Insert a left double quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`4`", "Insert a right double quote."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`'`", "Insert a modifier apostrophe."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`.`", "Insert an ellipsis."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`'`", "Insert a prime."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`""`", "Insert a double prime."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Space`", "Insert a non-breaking space."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Shift`:kbd:`Space`", "Insert a thin space."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`Space`", "Insert a thin non-breaking space."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`*`", "Insert a list bullet."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`−`", "Insert a hyphen bullet (alternative bullet)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`*`", "Insert a flower mark (alternative bullet)."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`%`", "Insert a per mille symbol."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`O`", "Insert a degree symbol."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`X`", "Insert a times sign."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`Ctrl`:kbd:`D`", "Insert a division sign."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`G`", "Insert a ``@tag`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`V`", "Insert a ``@pov`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`F`", "Insert a ``@focus`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`C`", "Insert a ``@char`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`P`", "Insert a ``@plot`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`S`", "Insert a synopsis comment."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`T`", "Insert a ``@time`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`L`", "Insert a ``@location`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`O`", "Insert an ``@object`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`E`", "Insert an ``@entity`` keyword."
|
||||
":kbd:`Ctrl`:kbd:`K`, :kbd:`X`", "Insert a ``@custom`` keyword."
|
||||
@@ -4,10 +4,15 @@
|
||||
Typographical Notes
|
||||
*******************
|
||||
|
||||
.. _Prime: https://en.wikipedia.org/wiki/Prime_(symbol)
|
||||
.. _thin space: https://en.wikipedia.org/wiki/Thin_space
|
||||
.. _Quotation Mark: https://en.wikipedia.org/wiki/Quotation_mark
|
||||
.. _Modifier letter apostrophe: https://en.wikipedia.org/wiki/Modifier_letter_apostrophe
|
||||
|
||||
novelWriter has some support for typographical symbols that are not usually easily available in
|
||||
many text editors. This includes for instance the proper unicode quotation marks, dashes, ellipsis,
|
||||
thin spaces, etc. All these symbols are available from the :guilabel:`Insert` menu, and via
|
||||
keyboard shortcuts. See :ref:`a_ui_shortcuts_ins`.
|
||||
keyboard shortcuts. See :ref:`a_kb_ins`.
|
||||
|
||||
This chapter provides some additional information on how novelWriter handles these symbols.
|
||||
|
||||
@@ -17,7 +22,7 @@ This chapter provides some additional information on how novelWriter handles the
|
||||
Special Notes on Symbols
|
||||
========================
|
||||
|
||||
Some additional notes on these symbols.
|
||||
This section contains additional notes on the available special symbols.
|
||||
|
||||
|
||||
Dashes and Ellipsis
|
||||
@@ -28,45 +33,56 @@ automatically to short and long dashes, and three dots to ellipsis. The last aut
|
||||
always be reverted with the undo command :kbd:`Ctrl`:kbd:`Z`, reverting the text to what you typed
|
||||
before the automatic replacement occurred.
|
||||
|
||||
In addition, "Figure Dash" is available. The Figure Dash is a dash that has the same width as the
|
||||
numbers of the same font, for most fonts. It helps to align numbers nicely in columns when you need
|
||||
to use a dash in them.
|
||||
|
||||
|
||||
Single and Double Quotes
|
||||
------------------------
|
||||
|
||||
All the different quotation marks listed on the `Quotation Mark`_ Wikipedia page are available, and
|
||||
can be selected as auto-replaced symbols for straight single and double quote key strokes. The
|
||||
settings can be found in the :guilabel:`Preferences`.
|
||||
settings can be found in :guilabel:`Preferences`.
|
||||
|
||||
Ordinarily, text wrapped in quotes are highlighted by the editor. This is meant as a convenience
|
||||
for highlighting dialogue between characters. This feature can be disabled in the
|
||||
for highlighting dialogue between characters. This feature can be disabled in
|
||||
:guilabel:`Preferences` if this feature isn't wanted.
|
||||
|
||||
The editor distinguishes between text wrapped in straight quotes and with the user-selected double
|
||||
quote symbols. This is to help the writer recognise which parts of the text are not using the
|
||||
chosen quote symbols. Two convenience functions in the :guilabel:`Format` menu can be used to
|
||||
re-format a selected section of text with the correct quote symbols.
|
||||
|
||||
.. _Quotation Mark: https://en.wikipedia.org/wiki/Quotation_mark
|
||||
The editor distinguishes between text wrapped in regular straight double quotes and the
|
||||
user-selected double quote symbols. This is to help the writer recognise which parts of the text
|
||||
are not using the chosen quote symbols. Two convenience functions in the :guilabel:`Format` menu
|
||||
can be used to re-format a selected section of text with the correct quote symbols.
|
||||
|
||||
|
||||
Modifier Letter Apostrophes
|
||||
---------------------------
|
||||
Single and Double Prime
|
||||
------------------------
|
||||
|
||||
Both single and double prime symbols are available in the :guilabel:`Insert` menu. These symbols
|
||||
are the correct symbols to use for unit symbols for feet, inches, minutes and seconds. The usage of
|
||||
these is described in more detail on the Wikipedia Prime_ page. They look very similar to single
|
||||
and double straight quotes, and may be renderred similarly by the font, but they have different
|
||||
codes. Using these correctly will also prevent the auto-replace and dialogue highlighting features
|
||||
misunderstanding their meaning in the text.
|
||||
|
||||
|
||||
Modifier Letter Apostrophe
|
||||
--------------------------
|
||||
|
||||
The auto-replace feature will consider any right-facing single straight quote as a quote symbol,
|
||||
even if it's intended as an apostrophe. This also includes the syntax highlighter, which may assume
|
||||
the first following apostrophe is the closing symbol of a single quoted region of text.
|
||||
even if it is intended as an apostrophe. This also includes the syntax highlighter, which may
|
||||
assume the first following apostrophe is the closing symbol of a single quoted region of text.
|
||||
|
||||
To get around this, an alternative apostrophe is available. It is a special Unicode character that
|
||||
is not categorised as punctuation, but as a modifier. It is usually renderred the same way as right
|
||||
single quotation marks, but not always, depending on the font. There is a Wikipedia article for the
|
||||
is not categorised as punctuation, but as a modifier. It is usually renderred the same way as the
|
||||
right single quotation marks, depending on the font. There is a Wikipedia article for the
|
||||
`Modifier letter apostrophe`_ with more details.
|
||||
|
||||
.. note::
|
||||
On export with the :guilabel:`Build Novel Project` tool, these apostrophes will be replaced
|
||||
automatically with the corresponding right hand quote symbols as is generally recommended.
|
||||
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
|
||||
---------------------
|
||||
@@ -82,6 +98,4 @@ All non-breaking spaces are highlighted with a differently coloured background t
|
||||
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. For plain text, they are exported as regular spaces.
|
||||
|
||||
.. _thin space: https://en.wikipedia.org/wiki/Thin_space
|
||||
format.
|
||||
@@ -1,156 +0,0 @@
|
||||
.. _a_export:
|
||||
|
||||
******************
|
||||
Exporting Projects
|
||||
******************
|
||||
|
||||
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`.
|
||||
|
||||
|
||||
.. _a_export_headers:
|
||||
|
||||
Header Formatting
|
||||
=================
|
||||
|
||||
The titles for the five types of titles (the chapter headings come in a numbered and unnumbered
|
||||
version) of story structure can be formatted collectively in the export tool. This is done through
|
||||
a series of keyword–replace steps. They are all on the format ``%keyword%``.
|
||||
|
||||
``%title%``
|
||||
This keyword will always be replaced with the title text you put after the ``#`` characters in
|
||||
your document.
|
||||
|
||||
``%ch%``
|
||||
This is replaced by a chapter number. The number is incremented by one each time the build tool
|
||||
sees a new heading of level two in a document with layout :guilabel:`Chapter`. If the document
|
||||
has layout :guilabel:`Unnumbered`, the counter is *not* incremented. The latter is useful for
|
||||
for instance Prologue and Epilogue chapters.
|
||||
|
||||
``%chw%``
|
||||
This is like ``%ch%``, but the number is expressed as a word like for instance "One", "Two",
|
||||
etc.
|
||||
|
||||
``%chi%``
|
||||
This is also like ``%ch%``, but the number is represented as a lower case Roman number.
|
||||
|
||||
``%chI%``
|
||||
This is also like ``%ch%``, but the number is represented as an upper case Roman number.
|
||||
|
||||
``%sc%``
|
||||
This is the number counter equivalent for scenes. These are incremented each time a heading of
|
||||
level three is encountered, but reset to 1 each time a chapter is encountered. They can thus be
|
||||
used for counting scenes within a chapter.
|
||||
|
||||
``%sca%``
|
||||
This is like ``%sc%``, but the number is *not* reset to 1 for each chapter. Instead it runs from
|
||||
1 from the beginning of the novel.
|
||||
|
||||
``\\``
|
||||
This inserts a line break within the title.
|
||||
|
||||
.. note::
|
||||
Header formatting only applies to novel documents. Headings in notes will be left as-is on
|
||||
export. However, heading levels 1 through 4 are converted to the correct heading level in the
|
||||
respective output formats.
|
||||
|
||||
**Example**
|
||||
|
||||
* The format ``%title%`` just reproduces the title you set in the document.
|
||||
* The format ``Chapter %ch%: %title%`` produces something like "Chapter 1: My Chapter Title".
|
||||
* The format ``Scene %ch%.%sc%`` produces something like "Scene 1.2" for scene 2 in chapter 1.
|
||||
|
||||
|
||||
.. _a_export_scenes:
|
||||
|
||||
Scene Separators
|
||||
================
|
||||
|
||||
If you don't want any titles for your scenes (or for your sections if you have them), you can leave
|
||||
the boxes empty. If so, an empty paragraph will be inserted between the scenes or sections instead.
|
||||
|
||||
Alternatively, if you want a separator between them, like the common ``* * *``, you can also enter
|
||||
that in the box. In fact, if the format is a piece of static text, it will always be treated as a
|
||||
separator.
|
||||
|
||||
|
||||
.. _a_export_files:
|
||||
|
||||
File Selection
|
||||
==============
|
||||
|
||||
Which documents and notes are selected for export can be controlled from the options on the left
|
||||
side of the dialog window. The switch for :guilabel:`Include novel files` will select any document
|
||||
that isn't classified as a note. The switch for :guilabel:`Include note files` will select any
|
||||
document that *is* a note. This is allows for exporting just the novel, just your notes, or both,
|
||||
as you see fit.
|
||||
|
||||
In addition, you can select to export the synopsis comments, regular comments, keywords, and even
|
||||
exclude the body text itself.
|
||||
|
||||
.. tip::
|
||||
If you for instance want to export a document with an outline of the novel, you can enable
|
||||
keywords and synopsis export and disable body text, thus getting a document with each heading
|
||||
followed by the tags and references and the synopsis.
|
||||
|
||||
If you need to exclude specific documents from your exports, like draft documents or documents you
|
||||
want to take out of your manuscript, but don't want to delete, you can un-check the
|
||||
:guilabel:`Include when building project` option for each document in the project tree. An included
|
||||
document has a checkmark after the status icon in the :guilabel:`Flags` column. The
|
||||
:guilabel:`Build Novel Project` tool has a switch to ignore this flag if you need to collectively
|
||||
override these settings.
|
||||
|
||||
|
||||
.. _a_export_formats:
|
||||
|
||||
Export Formats
|
||||
==============
|
||||
|
||||
Currently, six formats are supported for exporting.
|
||||
|
||||
OpenDocument Format
|
||||
This produces an open document ``.odt`` file. The document produced has very little formatting,
|
||||
and may require further editing afterwards. For a better formatted office document, you may get
|
||||
a better result with exporting to HTML and then import that HTML document into your office word
|
||||
processor. They are generally very good at importing HTML documents.
|
||||
|
||||
PDF Format
|
||||
The PDF export is just a shortcut for print to file. For a better PDF result, you may instead
|
||||
want to export to HTML, and use a word processor to convert the HTML document to PDF.
|
||||
|
||||
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. It is generally the best formatted
|
||||
export option and supports all features of novelWriter since it is entirely geenrated by the
|
||||
application and doesn't depend on Qt library features.
|
||||
|
||||
novelWriter Markdown
|
||||
This is simply a concatenation of the project documents selected by the filters. The documents
|
||||
are stacked together in the order they appear in the project tree, with comments, tags, etc.
|
||||
included if they are selected. This is a useful format for exporting the project for later
|
||||
import back into novelWriter.
|
||||
|
||||
Standard Markdown
|
||||
If you have Qt 5.14 or higher, the option to export to plain markdown is available. This feature
|
||||
uses Qt's own markdown export feature.
|
||||
|
||||
Plain Text
|
||||
The plain text export format writes a simple ``.txt`` file without any formatting at all.
|
||||
|
||||
|
||||
.. _a_export_options:
|
||||
|
||||
Additional Export Options
|
||||
=========================
|
||||
|
||||
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
|
||||
accompanying css styles are exported.
|
||||
|
||||
The text body is saved in a two-level list. The outer list contains one entry per exported file, in
|
||||
the order they appear in the project tree. Each file is then split up into a list as well, with one
|
||||
entry per paragraph in the document.
|
||||
|
||||
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.
|
||||
@@ -1,47 +0,0 @@
|
||||
.. _a_notes:
|
||||
|
||||
*************
|
||||
Project Notes
|
||||
*************
|
||||
|
||||
novelWriter doesn't have a database and complicated forms to fill in all details about plot
|
||||
elements, characters, and all sorts of additional information that isn't a part of the novel text
|
||||
itself. Instead, all such information is saved in notes. The relation between all these additional
|
||||
elements is extracted from these documents by the project indexer based on the tags and references
|
||||
you set.
|
||||
|
||||
These notes are not required, but making at least minimal files for each such 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.
|
||||
|
||||
|
||||
.. _a_notes_tags:
|
||||
|
||||
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.
|
||||
|
||||
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
|
||||
to date. An invalid tag should have a green wiggly line under it, and will not receive the syntax
|
||||
colour that valid tags do.
|
||||
|
||||
The tag is the only part of these notes that the 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.
|
||||
|
||||
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.
|
||||
|
||||
.. 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 in the exported
|
||||
HTML document as well.
|
||||
@@ -1,227 +0,0 @@
|
||||
.. _a_struct:
|
||||
|
||||
***************
|
||||
Novel Structure
|
||||
***************
|
||||
|
||||
This section covers the structure of a novel project.
|
||||
|
||||
It concerns documents under the :guilabel:`Novel` type root folder only. There are some
|
||||
restrictions and features that only apply to these types of documents.
|
||||
|
||||
|
||||
.. _a_struct_heads:
|
||||
|
||||
Importance of Headings
|
||||
======================
|
||||
|
||||
Subfolders under root folders have no impact on the structure of the novel itself. The structure is
|
||||
instead dictated by the heading level of the headers within the documents.
|
||||
|
||||
Four levels of headings are supported, signified by the number of hashes preceding the title. See
|
||||
also the :ref:`a_ui_md` section for more details about the markdown syntax.
|
||||
|
||||
.. note::
|
||||
The header levels are not only important when generating the exported novel file, they are also
|
||||
used by the indexer when building the outline tree in the :guilabel:`Outline` tab. Each heading
|
||||
also starts a new region where new references to tags can be set.
|
||||
|
||||
The different header levels are interpreted as specific section types of the novel in the following
|
||||
way:
|
||||
|
||||
``# Header1``
|
||||
Header level one signifies that the text refers to either the novel title or the name of a top
|
||||
level partition useful when you want to split the manuscript up into books, parts, or acts.
|
||||
|
||||
``## Header2``
|
||||
Header level two signifies a chapter level partition. Each time you want to start a new chapter,
|
||||
you must add such a heading. If you choose to split your manuscript up into one document per
|
||||
scene, you need a single chapter document with just the heading. You can of course also add a
|
||||
synopsis and reference keywords to the chapter document. If you want to open the chapter with a
|
||||
quote or other introductory text that isn't part of a scene, this is also where you'd put that
|
||||
text.
|
||||
|
||||
``### Header3``
|
||||
Header level three signifies a scene level partition. You must provide a title text, but the
|
||||
title text can be replaced with a scene separator or just skipped entirely when you export your
|
||||
manuscript.
|
||||
|
||||
``#### Header4``
|
||||
Header level four signifies a sub-scene level partition, usually called just a section in the
|
||||
documentation and 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 the titles out of the final manuscript just like with scene titles.
|
||||
|
||||
.. tip::
|
||||
There are multiple options of how to process novel titles when exporting the manuscript. For
|
||||
instance, chapter numbers can be applied automatically, and so can scene numbers if you want
|
||||
them in a draft manuscript. See the :ref:`a_export` page for more details.
|
||||
|
||||
|
||||
.. _a_struct_heads_unnum:
|
||||
|
||||
Unnumbered Chapter Headings
|
||||
---------------------------
|
||||
|
||||
If you use layout types for your documents, the automatic numbering feature for your chapters is
|
||||
controlled by whether you use the :guilabel:`Chapter` or :guilabel:`Unnumbered` layout type for
|
||||
your document. However, if you have a different document layout where this isn't practical, you can
|
||||
also switch off chapter numbering for a chapter by making the first character of the chapter title
|
||||
an ``*``. Like so:
|
||||
|
||||
``## *Unnumbered Chapter Title``
|
||||
|
||||
The leading asterisk is only considered by the :guilabel:`Build Novel Project` tool, and will be
|
||||
removed before inserted at the location of the ``%title%`` label. See the :ref:`a_export` page for
|
||||
more details.
|
||||
|
||||
.. note::
|
||||
If you need the first character of the title to be an actual asterisk, you must escape it:
|
||||
``\*``.
|
||||
|
||||
|
||||
.. _a_struct_tags:
|
||||
|
||||
Tag References
|
||||
==============
|
||||
|
||||
Each text partition indicated by a heading of any level, can contain references to tags set in the
|
||||
supporting notes of the project. The references are gathered by the indexer and used to generate
|
||||
the outline view on the :guilabel:`Outline` tab of how the different parts of the novel are
|
||||
connected.
|
||||
|
||||
References and tags are also clickable in the document editor and viewer, making it easy to
|
||||
navigate between reference notes while writing. Clicked links are always opened in the view panel.
|
||||
|
||||
References are set as a keyword and a list of corresponding tags. The valid keywords are listed
|
||||
below. The format of a reference line is ``@keyword: value1, [value2] ... [valueN]``. All keywords
|
||||
allow multiple values.
|
||||
|
||||
``@pov``
|
||||
The point-of-view character for the current section. The target must be a note tag in the
|
||||
:guilabel:`Character` type root folder.
|
||||
|
||||
``@char``
|
||||
Other characters in the current section. The target must be a note tag in a
|
||||
:guilabel:`Character` type root folder. This should not include the point-of-view character(s).
|
||||
|
||||
``@plot``
|
||||
The plot or subplot advanced in the current section. The target must be a note tag in a
|
||||
:guilabel:`Plot` type root folder.
|
||||
|
||||
``@time``
|
||||
The timelines touched by the current section. The target must be a note tag in a
|
||||
:guilabel:`Timeline` type root folder.
|
||||
|
||||
``@location``
|
||||
The location the current section takes place in. The target must be a note tag in a
|
||||
:guilabel:`Locations` type root folder.
|
||||
|
||||
``@object``
|
||||
Objects present in the current section. The target must be a note tag in an :guilabel:`Object`
|
||||
type root folder.
|
||||
|
||||
``@entity``
|
||||
Entities present in the current section. The target must be a note tag in an
|
||||
:guilabel:`Entities` type root folder.
|
||||
|
||||
``@custom``
|
||||
Custom references in the current section. The target must be a note tag in a :guilabel:`Custom`
|
||||
type root folder.
|
||||
|
||||
The syntax highlighter will alert the user that the tags and references are used correctly, and
|
||||
that the tags referenced exist.
|
||||
|
||||
The highlighter may be mistaken if the index of defined tags is out of date. If so, press :kbd:`F9`
|
||||
to regenerate it, or select :guilabel:`Rebuild Index` from the :guilabel:`Tools` menu. In general,
|
||||
the index for a document is regenerated when it is saved, so this shouldn't normally be necessary.
|
||||
|
||||
|
||||
.. _a_struct_layout:
|
||||
|
||||
Novel Document Layout
|
||||
=====================
|
||||
|
||||
All documents in a novelWriter project can have a layout format set. These layouts are important
|
||||
when the project is exported as they indicate how to treat the content in terms of formatting,
|
||||
headings, and page breaks. The layout for each document is indicated as the last set of characters
|
||||
in the :guilabel:`Flags` column of the project tree.
|
||||
|
||||
Not all layout types are actually treated differently, they also help to indicate what each
|
||||
document is for in your project. The :guilabel:`Book` layout is a generic novel document layout
|
||||
that is formatted identically to :guilabel:`Chapter` and :guilabel:`Scene` layout documents, but
|
||||
may help to indicate what each document does in your project.
|
||||
|
||||
You can for instance lay out your project using :guilabel:`Book` documents for each act, and then
|
||||
later split those into chapter or scene documents by using the :guilabel:`Split Document` tool.
|
||||
Scenes can also be contained within :guilabel:`Chapter` type documents, but you lose the drag and
|
||||
drop feature that comes with having them in separate documents if you organise them this way.
|
||||
|
||||
Some layouts *do* have implications on how the project is exported. Documents with layout
|
||||
:guilabel:`Title Page` and :guilabel:`Partition` have all headings and text centred, while the
|
||||
:guilabel:`Unnumbered` layout disables the automatic chapter numbering feature for everything
|
||||
contained within it. The latter is convenient for Prologue and Epilogue type chapters.
|
||||
|
||||
The above layout formats are only usable in the Novel root folder. Documents that are not a part of
|
||||
the novel itself should have the Note layout. These documents are not getting any special
|
||||
formatting, and it is possible to collectively filter them out during export. Notes can be used
|
||||
anywhere in the project, also in the Novel root folder.
|
||||
|
||||
Below is an overview of all available layout formats.
|
||||
|
||||
:guilabel:`Title Page`
|
||||
The title page layout. The title should be formatted as a heading level one. All text is
|
||||
automatically centred on exports.
|
||||
|
||||
:guilabel:`Plain Page`
|
||||
A plain page layout useful for instance for front matter pages. Heading levels are ignored for
|
||||
this layout format, and so are formatting options like :guilabel:`Justify Text`. The page is
|
||||
exported with a page break before it.
|
||||
|
||||
:guilabel:`Book`
|
||||
This is the generic novel format that in principle can be used for all novel documents. Since
|
||||
the internal structure of the novel is controlled by the heading levels, this layout will
|
||||
produce the same result as a collection of :guilabel:`Partition`, :guilabel:`Chapter` and
|
||||
:guilabel:`Scene` layout documents. However, it does not provide the functionality of the
|
||||
:guilabel:`Unnumbered` layout format by default, but this can still be achieved by prefixing the
|
||||
chapter title with a ``*``.
|
||||
|
||||
:guilabel:`Partition`
|
||||
A partition can be used to split the novel into parts. Partition titles are indicated with a
|
||||
level one heading. You can also add text and meta data to the page. The :guilabel:`Partition`
|
||||
layout will in addition force a page break before the heading, and centre all content on the
|
||||
page.
|
||||
|
||||
:guilabel:`Chapter`
|
||||
Signifies the start of a new chapter. If the text itself is contained in scene documents, these
|
||||
documents should only contain the title, comments, synopsis, and tag references for characters,
|
||||
plot, etc. The heading for chapters should be level two. If you need an opening text, like a
|
||||
quote or other leading text before the first scene, this is also where you'd want to add this
|
||||
text.
|
||||
|
||||
:guilabel:`Unnumbered`
|
||||
Same as :guilabel:`Chapter`, but when exporting the documents and automatic chapter numbering is
|
||||
enabled, documents with this layout will not increment the chapter number. It also has a
|
||||
separate title formatting setting. This makes the layout suitable for Prologue and Epilogue type
|
||||
chapters.
|
||||
|
||||
:guilabel:`Scene`
|
||||
Used for scenes. This document should have a header of level three. Further sections can have
|
||||
headers of level four, but there are no layout specifically for sections.
|
||||
|
||||
:guilabel:`Note`
|
||||
A generic document that is optionally ignored when the novel is exported. Use this layout for
|
||||
descriptions of content in the supporting root folders. Notes can also be added to the
|
||||
:guilabel:`Novel` root folder if you need to insert notes there. Note headers receive no special
|
||||
formatting when building the project. They are always exported as-is.
|
||||
|
||||
.. note::
|
||||
The layout granularity is entirely optional. In principle, you can write the entire novel in a
|
||||
single document with layout :guilabel:`Book`. You can also have a single document per chapter if
|
||||
that suits you better. The :guilabel:`Outline` will show your structure of chapters and scenes
|
||||
regardless of how your documents are organised.
|
||||
|
||||
.. tip::
|
||||
You can always start writing with a coarse layout with one or a few documents, and then later
|
||||
use the split tool to automatically split the documents into separate chapter and scene
|
||||
documents.
|
||||
140
i18n/README.md
Normal file
@@ -0,0 +1,140 @@
|
||||
# novelWriter Internationalisation (i18n)
|
||||
|
||||
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.
|
||||
|
||||
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.
|
||||
|
||||
To verify a language file translated through the Crowdin tool, download and extract it into the
|
||||
`i18n` folder in the novelWriter source and follow the instructions in
|
||||
[Generate an Updated Translation File](#generate-an-updated-translation-file) below.
|
||||
|
||||
|
||||
# Translation Guidelines
|
||||
|
||||
When contributing translations, keep the following things in mind.
|
||||
|
||||
* For descriptive labels and dialog boxes, make sure you do _not_ change the meaning of the text
|
||||
when you translate it from English. The user must receive the same instructions or information
|
||||
regardless of language. This is improtant, otherwise the documentation will be inconsistent with
|
||||
the user interface and it will become a lot more difficult to handle user issues and questions.
|
||||
* If you think a label or description is misleading or incomplete, please file an issue report. The
|
||||
correct way to handle such changes is to change the text in the code first, which will then be
|
||||
forwarded to _all_ translators such that the GUI is consistent across all languages.
|
||||
* For very short labels, like button labels. it may be fine to replace the word with a similar
|
||||
word, but only as long as the user understands what it is supposed to do. Some buttons and tabs
|
||||
have limited space. If necessary, it is OK to use abbreviations.
|
||||
|
||||
|
||||
# Direct Approach Using Qt Linguist
|
||||
|
||||
Here you will find instructions for translating novelWriter to a new language directly using Qt
|
||||
Linguist, or updating the translations for an already existing supported language.
|
||||
|
||||
There are two areas relevant to localisation:
|
||||
|
||||
* The Qt5 GUI translation files, which consists of `nw_XX.ts` files. This is the bulk of the
|
||||
translation work.
|
||||
* The `project_XX.json` files. See [Project Localisation](#project-localisation) below.
|
||||
|
||||
The `XX` in the file name corresponds to the language and country code for the translation. For
|
||||
instance `en_GB` for British English.
|
||||
|
||||
|
||||
## Qt5 GUI Localisation
|
||||
|
||||
You will need the translation tool Qt 5 Linguist on your system.
|
||||
|
||||
For Ubuntu/Debian, run:
|
||||
```bash
|
||||
sudo apt install qttools5-dev-tools
|
||||
```
|
||||
|
||||
See also [Qt Linguist Manual: Translators](https://doc.qt.io/qt-5/linguist-translators.html).
|
||||
|
||||
|
||||
### Workflow
|
||||
|
||||
Here's an overview of the localisation workflow:
|
||||
|
||||
1. First, create a new branch off of `main`, and there, generate a new `nw_XX.ts` translation file.
|
||||
1. Load the translation file in Qt Linguist. Translate and save your changes.
|
||||
1. Generate the `nw_XX.qm` file.
|
||||
1. Run the application and verify your changes. Iterate from step 2.
|
||||
1. Once finished, commit your changes and submit your pull request.
|
||||
|
||||
When you want to translate new changes, again create a new branch off of `main` and re-generate the
|
||||
translation file. Continue from step 2.
|
||||
|
||||
|
||||
### Generate an Updated Translation File
|
||||
|
||||
The `i18n` folder at the root of the repository contains the `nw_XX.ts` translation files.
|
||||
|
||||
Whether to add a new language to the translation framework, or to update the file against the
|
||||
current source code, you must first run the `qtlupdate` command:
|
||||
```bash
|
||||
python3 setup.py qtlupdate i18n/nw_XX.ts
|
||||
```
|
||||
|
||||
The file name must be in the correct format. All translation files must be located in the `i18n`
|
||||
folder, start with `nw_` and end with `.ts`. In between goes the language and country code. It must
|
||||
be a valid ISO language code, otherwise novelWriter will not accept the file.
|
||||
|
||||
For instance, the French translation uses the language code `fr_FR`, so its translation file will
|
||||
be `nw_fr_FR.ts`
|
||||
|
||||
|
||||
### Edit the Translation File in Qt Linguist
|
||||
|
||||
The `i18n/nw_XX.ts` file can be edited with the Qt Linguist application provided by Qt 5. This is
|
||||
by far easier than manually editing the `.ts` file.
|
||||
|
||||
Please select "English" and "United Kingdom" as the _source_ language if prompted by Qt Linguist.
|
||||
|
||||
|
||||
### Verify Your Translation
|
||||
|
||||
The application does not use `.ts` files directly. The `novelwriter/assets/i18n/nw_XX.qm` files are
|
||||
the actual files used to translate the GUI into another language other than the default British
|
||||
English. These files are not generated by default, but they can be built with:
|
||||
```bash
|
||||
python3 setup.py qtlrelease
|
||||
```
|
||||
|
||||
You can now test the translation in novelWriter. The Preferences dialog should list the newly added
|
||||
language, so go ahead and select it.
|
||||
|
||||
|
||||
### Missing QtBase Translations
|
||||
|
||||
The default Qt dialogs also have translations, for instance for standard buttons like "Yes", "No",
|
||||
"Ok", "Cancel", etc. Generally, these translation files are installed with the Qt libraries on your
|
||||
system, and novelWriter will collect those translations from there. However, these translations are
|
||||
missing for many languages.
|
||||
|
||||
As a starting point, there is no need to translate any entries in the `.ts` files that are under
|
||||
elements starting with the letter "Q", like "QPlatformTheme", "QWizard", etc. If these turn up in
|
||||
English in novelWriter after activating a translation, it means they are probably missing in the Qt
|
||||
library, and you may also need to translate these.
|
||||
|
||||
These additional translation entries are generated from a file named `i18n/qtbase.py`, which is not
|
||||
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 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_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
4513
i18n/nw_de_DE.ts
Normal file
4513
i18n/nw_en_US.ts
Normal file
4513
i18n/nw_es_419.ts
Normal file
4523
i18n/nw_fr_FR.ts
Normal file
4513
i18n/nw_nb_NO.ts
Normal file
4513
i18n/nw_nl_NL.ts
Normal file
4513
i18n/nw_pt_BR.ts
Normal file
4513
i18n/nw_zh_CN.ts
Normal file
7
i18n/pylupdate6/README.md
Normal 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
|
||||
22
i18n/pylupdate6/__init__.py
Normal 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"]
|
||||
90
i18n/pylupdate6/lupdate.py
Normal 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()
|
||||
362
i18n/pylupdate6/python_source.py
Normal 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
|
||||
29
i18n/pylupdate6/source_file.py
Normal 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 = []
|
||||
390
i18n/pylupdate6/translation_file.py
Normal 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>
|
||||
'''
|
||||
51
i18n/pylupdate6/translations.py
Normal 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
@@ -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)
|
||||
65
i18n/qtbase.py
Normal file
@@ -0,0 +1,65 @@
|
||||
"""
|
||||
Qt Base Translation File
|
||||
========================
|
||||
|
||||
This file causes Qt Linguist to generate translation entries for the Qt
|
||||
elements that need translation in novelWriter for those languages who do
|
||||
not yet have a qtbase_xx.qm file shipped with Qt.
|
||||
|
||||
If a qtbase_xx.qm file already exists, do not add a translation for the
|
||||
entries generated from this file.
|
||||
"""
|
||||
|
||||
from PyQt5.QtCore import QT_TRANSLATE_NOOP
|
||||
|
||||
# QDialogButtonBox
|
||||
# ================
|
||||
|
||||
QT_TRANSLATE_NOOP("QDialogButtonBox", "OK")
|
||||
|
||||
# QGnomeTheme
|
||||
# ===========
|
||||
|
||||
QT_TRANSLATE_NOOP("QGnomeTheme", "&OK")
|
||||
QT_TRANSLATE_NOOP("QGnomeTheme", "&Save")
|
||||
QT_TRANSLATE_NOOP("QGnomeTheme", "&Cancel")
|
||||
QT_TRANSLATE_NOOP("QGnomeTheme", "&Close")
|
||||
QT_TRANSLATE_NOOP("QGnomeTheme", "Close without Saving")
|
||||
|
||||
# QPlatformTheme
|
||||
# ==============
|
||||
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "OK")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Save")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Save All")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Open")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "&Yes")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Yes to &All")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "&No")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "N&o to All")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Abort")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Retry")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Ignore")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Close")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Cancel")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Discard")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Help")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Apply")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Reset")
|
||||
QT_TRANSLATE_NOOP("QPlatformTheme", "Restore Defaults")
|
||||
|
||||
# QWizard
|
||||
# =======
|
||||
|
||||
QT_TRANSLATE_NOOP("QWizard", "Go Back")
|
||||
QT_TRANSLATE_NOOP("QWizard", "< &Back")
|
||||
QT_TRANSLATE_NOOP("QWizard", "Continue")
|
||||
QT_TRANSLATE_NOOP("QWizard", "&Next")
|
||||
QT_TRANSLATE_NOOP("QWizard", "&Next >")
|
||||
QT_TRANSLATE_NOOP("QWizard", "Commit")
|
||||
QT_TRANSLATE_NOOP("QWizard", "Done")
|
||||
QT_TRANSLATE_NOOP("QWizard", "&Finish")
|
||||
QT_TRANSLATE_NOOP("QWizard", "Cancel")
|
||||
QT_TRANSLATE_NOOP("QWizard", "Cancel")
|
||||
QT_TRANSLATE_NOOP("QWizard", "Help")
|
||||
QT_TRANSLATE_NOOP("QWizard", "&Help")
|
||||
333
make.py
@@ -1,333 +0,0 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
This make script is intended for building distributable packages of
|
||||
novelWriter. These are either:
|
||||
|
||||
* A single file executable named dist/novelWriter(.exe). This is a
|
||||
quite slow option, and the file is fairly big.
|
||||
* A single directory named dist/novelWriter with a novelWriter(.exe),
|
||||
and all dependecies included.
|
||||
* The latter can be combined with a build stage of a setup.exe file if
|
||||
on Windows. This requires Inno Setup to be installed and in path.
|
||||
|
||||
In addition, providing the pip otion will cause the script to try to
|
||||
install all dependencies needed for runing the build, and for running
|
||||
novelWriter itself.
|
||||
"""
|
||||
|
||||
import os
|
||||
import sys
|
||||
import shutil
|
||||
import subprocess
|
||||
|
||||
OS_NONE = 0
|
||||
OS_LINUX = 1
|
||||
OS_WIN = 2
|
||||
OS_DARWIN = 3
|
||||
|
||||
# =============================================================================================== #
|
||||
# Package Installer
|
||||
# =============================================================================================== #
|
||||
|
||||
def installPackages(hostOS):
|
||||
"""Install package dependencies both for this script and for running
|
||||
novelWriter itself.
|
||||
"""
|
||||
print("")
|
||||
print("Installing Dependencies")
|
||||
print("#######################")
|
||||
print("")
|
||||
|
||||
installQueue = ["pip", "pyinstaller", "-r requirements.txt"]
|
||||
if hostOS == OS_DARWIN:
|
||||
installQueue.append("pyobjc")
|
||||
|
||||
pyCmd = [sys.executable, "-m"]
|
||||
pipCmd = ["pip", "install", "--user", "--upgrade"]
|
||||
for stepCmd in installQueue:
|
||||
pkgCmd = stepCmd.split(" ")
|
||||
try:
|
||||
subprocess.call(pyCmd + pipCmd + pkgCmd)
|
||||
except Exception as e:
|
||||
print("Failed with error:")
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
|
||||
return
|
||||
|
||||
# =============================================================================================== #
|
||||
# Run PyInstaller on Package
|
||||
# =============================================================================================== #
|
||||
|
||||
def freezePackage(buildWindowed, oneFile, makeSetup, hostOS):
|
||||
"""Run PyInstaller to freeze the packages. This assumes all
|
||||
dependencies are already in place.
|
||||
"""
|
||||
import PyInstaller.__main__ # noqa: E402
|
||||
|
||||
print("")
|
||||
print("Running PyInstaller")
|
||||
print("###################")
|
||||
print("")
|
||||
|
||||
if hostOS == OS_WIN:
|
||||
dotDot = ";"
|
||||
else:
|
||||
dotDot = ":"
|
||||
|
||||
sys.modules["FixTk"] = None
|
||||
instOpt = [
|
||||
"--name=novelWriter",
|
||||
"--clean",
|
||||
"--add-data=%s%s%s" % (os.path.join("nw", "assets"), dotDot, "assets"),
|
||||
"--icon=%s" % os.path.join("nw", "assets", "icons", "novelwriter.ico"),
|
||||
"--exclude-module=PyQt5.QtQml",
|
||||
"--exclude-module=PyQt5.QtBluetooth",
|
||||
"--exclude-module=PyQt5.QtDBus",
|
||||
"--exclude-module=PyQt5.QtMultimedia",
|
||||
"--exclude-module=PyQt5.QtMultimediaWidgets",
|
||||
"--exclude-module=PyQt5.QtNetwork",
|
||||
"--exclude-module=PyQt5.QtNetworkAuth",
|
||||
"--exclude-module=PyQt5.QtNfc",
|
||||
"--exclude-module=PyQt5.QtQuick",
|
||||
"--exclude-module=PyQt5.QtQuickWidgets",
|
||||
"--exclude-module=PyQt5.QtRemoteObjects",
|
||||
"--exclude-module=PyQt5.QtSensors",
|
||||
"--exclude-module=PyQt5.QtSerialPort",
|
||||
"--exclude-module=PyQt5.QtSql",
|
||||
"--exclude-module=FixTk",
|
||||
"--exclude-module=tcl",
|
||||
"--exclude-module=tk",
|
||||
"--exclude-module=_tkinter",
|
||||
"--exclude-module=tkinter",
|
||||
"--exclude-module=Tkinter",
|
||||
]
|
||||
|
||||
if buildWindowed:
|
||||
instOpt.append("--windowed")
|
||||
|
||||
if oneFile and not makeSetup:
|
||||
instOpt.append("--onefile")
|
||||
else:
|
||||
instOpt.append("--onedir")
|
||||
|
||||
instOpt.append("novelWriter.py")
|
||||
|
||||
# Make sample.zip first
|
||||
try:
|
||||
subprocess.call([sys.executable, "setup.py", "sample"])
|
||||
except Exception as e:
|
||||
print("Failed with error:")
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
|
||||
PyInstaller.__main__.run(instOpt)
|
||||
|
||||
if not oneFile:
|
||||
# These files are not needed, and take up a fair bit of space.
|
||||
delFiles = []
|
||||
if hostOS == OS_WIN:
|
||||
delFiles = [
|
||||
"Qt5DBus.dll",
|
||||
"Qt5Network.dll",
|
||||
"Qt5Qml.dll",
|
||||
"Qt5QmlModels.dll",
|
||||
"Qt5Quick.dll",
|
||||
"Qt5Quick3D.dll",
|
||||
"Qt5Quick3DAssetImport.dll",
|
||||
"Qt5Quick3DRender.dll",
|
||||
"Qt5Quick3DRuntimeRender.dll",
|
||||
"Qt5Quick3DUtils.dll",
|
||||
"Qt5Sql.dll"
|
||||
]
|
||||
elif hostOS == OS_LINUX:
|
||||
delFiles = [
|
||||
"libQt5DBus.so.5",
|
||||
"libQt5Network.so.5",
|
||||
"libQt5Qml.so.5",
|
||||
"libQt5QmlModels.so.5",
|
||||
"libQt5Quick.so.5",
|
||||
"libQt5Quick3D.so.5",
|
||||
"libQt5Quick3DAssetImport.so.5",
|
||||
"libQt5Quick3DRender.so.5",
|
||||
"libQt5Quick3DRuntimeRender.so.5",
|
||||
"libQt5Quick3DUtils.so.5",
|
||||
"libQt5Sql.so.5"
|
||||
]
|
||||
distDir = os.path.join(os.getcwd(), "dist", "novelWriter")
|
||||
for delFile in delFiles:
|
||||
delPath = os.path.join(distDir, delFile)
|
||||
if os.path.isfile(delPath):
|
||||
print("Deleting file: %s" % delPath)
|
||||
os.unlink(delPath)
|
||||
|
||||
print("")
|
||||
print("Build Finished")
|
||||
print("")
|
||||
print("The novelWriter executable should be in the folder named 'dist'")
|
||||
print("")
|
||||
|
||||
return
|
||||
|
||||
# =============================================================================================== #
|
||||
# Inno Setup Builder
|
||||
# =============================================================================================== #
|
||||
|
||||
def innoSetup():
|
||||
"""Run the Inno Setup tool to build a setup.exe file for Windows.
|
||||
"""
|
||||
print("")
|
||||
print("Running Inno Setup")
|
||||
print("##################")
|
||||
print("")
|
||||
|
||||
# Read the iss template
|
||||
issData = ""
|
||||
with open(os.path.join("setup", "win_setup.iss"), mode="r") as inFile:
|
||||
issData = inFile.read()
|
||||
|
||||
import nw # noqa: E402
|
||||
issData = issData.replace(r"%%version%%", nw.__version__)
|
||||
issData = issData.replace(r"%%dir%%", os.getcwd())
|
||||
|
||||
with open("setup.iss", mode="w+") as outFile:
|
||||
outFile.write(issData)
|
||||
|
||||
try:
|
||||
subprocess.call(["iscc", "setup.iss"])
|
||||
except Exception as e:
|
||||
print("Inno Setup failed with error:")
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
|
||||
return
|
||||
|
||||
# =============================================================================================== #
|
||||
# Clean Build and Dist Folders
|
||||
# =============================================================================================== #
|
||||
|
||||
def cleanInstall():
|
||||
"""Recursively delete the 'build' and 'dist' folders.
|
||||
"""
|
||||
print("")
|
||||
print("Cleaning up build environment ...")
|
||||
|
||||
buildDir = os.path.join(os.getcwd(), "build")
|
||||
if os.path.isdir(buildDir):
|
||||
try:
|
||||
shutil.rmtree(buildDir)
|
||||
print("Deleted folder 'build'")
|
||||
except Exception as e:
|
||||
print("Error: Cannot delete 'build' folder.")
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("Folder 'build' not found")
|
||||
|
||||
distDir = os.path.join(os.getcwd(), "dist")
|
||||
if os.path.isdir(distDir):
|
||||
try:
|
||||
shutil.rmtree(distDir)
|
||||
print("Deleted folder 'dist'")
|
||||
except Exception as e:
|
||||
print("Error: Cannot delete 'dist' folder.")
|
||||
print(str(e))
|
||||
sys.exit(1)
|
||||
else:
|
||||
print("Folder 'dist' not found")
|
||||
|
||||
print("")
|
||||
|
||||
return
|
||||
|
||||
# =============================================================================================== #
|
||||
# Process Build Steps
|
||||
# =============================================================================================== #
|
||||
|
||||
if __name__ == "__main__":
|
||||
"""Parse command line options and run the commands.
|
||||
"""
|
||||
# Detect OS
|
||||
if sys.platform.startswith("linux"):
|
||||
hostOS = OS_LINUX
|
||||
elif sys.platform.startswith("darwin"):
|
||||
hostOS = OS_DARWIN
|
||||
elif sys.platform.startswith("win32"):
|
||||
hostOS = OS_WIN
|
||||
elif sys.platform.startswith("cygwin"):
|
||||
hostOS = OS_WIN
|
||||
else:
|
||||
hostOS = OS_NONE
|
||||
|
||||
# Flags and Variables
|
||||
buildWindowed = True
|
||||
oneFile = False
|
||||
makeSetup = False
|
||||
doFreeze = False
|
||||
|
||||
helpMsg = (
|
||||
"\n"
|
||||
"novelWriter Make Tool\n"
|
||||
"=====================\n"
|
||||
"This tool provides build commands for distibuting novelWriter as a\n"
|
||||
"package. The available options are as follows:\n"
|
||||
"\n"
|
||||
"help Print the help message.\n"
|
||||
"freeze Freeze the package and produces a folder of all\n"
|
||||
" dependencies using pyinstaller.\n"
|
||||
"onefile Build a standalone executable with all dependencies\n"
|
||||
" bundled. Implies 'freeze', cannot be used with 'setup'.\n"
|
||||
"pip Run pip to install all package dependencies for\n"
|
||||
" novelWriter and this build tool.\n"
|
||||
"setup Build a setup.exe installer for Windows. This option\n"
|
||||
" automaticall disables the 'onefile' option.\n"
|
||||
"clean This will attempt to delete the 'build' and 'dist'\n"
|
||||
" folders in the current folder.\n"
|
||||
)
|
||||
|
||||
if "help" in sys.argv or len(sys.argv) <= 1:
|
||||
print(helpMsg)
|
||||
sys.exit(0)
|
||||
|
||||
if not os.path.isfile(os.path.join(os.getcwd(), "novelWriter.py")):
|
||||
print("Error: This script must be run in the root folder of novelWriter.")
|
||||
sys.exit(1)
|
||||
|
||||
if not os.path.isdir(os.path.join(os.getcwd(), "nw")):
|
||||
print("Error: This script must be run in the root folder of novelWriter.")
|
||||
sys.exit(1)
|
||||
|
||||
if "clean" in sys.argv:
|
||||
sys.argv.remove("clean")
|
||||
cleanInstall()
|
||||
|
||||
if "pip" in sys.argv:
|
||||
sys.argv.remove("pip")
|
||||
installPackages(hostOS)
|
||||
|
||||
if "freeze" in sys.argv:
|
||||
sys.argv.remove("freeze")
|
||||
doFreeze = True
|
||||
|
||||
if "onefile" in sys.argv:
|
||||
sys.argv.remove("onefile")
|
||||
doFreeze = True
|
||||
oneFile = True
|
||||
|
||||
if "setup" in sys.argv:
|
||||
sys.argv.remove("setup")
|
||||
if hostOS == OS_WIN:
|
||||
oneFile = False
|
||||
makeSetup = True
|
||||
else:
|
||||
print("Error: Argument 'setup' for Inno Setup is Windows only.")
|
||||
sys.exit(1)
|
||||
|
||||
if doFreeze:
|
||||
freezePackage(buildWindowed, oneFile, makeSetup, hostOS)
|
||||
|
||||
if makeSetup:
|
||||
innoSetup()
|
||||
|
||||
# END Main
|
||||
@@ -1,16 +1,21 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
novelWriter – Start Script
|
||||
==========================
|
||||
"""
|
||||
import os
|
||||
import sys
|
||||
|
||||
try:
|
||||
import PyQt5.QtWidgets # noqa: F401
|
||||
import PyQt5.QtGui # noqa: F401
|
||||
import PyQt5.QtCore # noqa: F401
|
||||
import PyQt5.QtWidgets # noqa: F401
|
||||
import PyQt5.QtGui # noqa: F401
|
||||
import PyQt5.QtCore # noqa: F401
|
||||
except Exception:
|
||||
print("ERROR: Failed to load dependency python3-pyqt5")
|
||||
print("ERROR: Failed to load dependency PyQt5")
|
||||
sys.exit(1)
|
||||
|
||||
os.curdir = os.path.abspath(os.path.dirname(__file__))
|
||||
|
||||
if __name__ == "__main__":
|
||||
import nw
|
||||
nw.main(sys.argv[1:])
|
||||
import novelwriter
|
||||
novelwriter.main(sys.argv[1:])
|
||||
|
||||
260
novelwriter/__init__.py
Normal file
@@ -0,0 +1,260 @@
|
||||
"""
|
||||
novelWriter – Init File
|
||||
=======================
|
||||
Application initialisation
|
||||
|
||||
File History:
|
||||
Created: 2018-09-22 [0.0.1]
|
||||
|
||||
This file is a part of novelWriter
|
||||
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
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
|
||||
import sys
|
||||
import getopt
|
||||
import logging
|
||||
|
||||
from PyQt5.QtWidgets import QApplication, QErrorMessage
|
||||
|
||||
from novelwriter.error import exceptionHandler, logException
|
||||
from novelwriter.config import Config
|
||||
|
||||
##
|
||||
# Version Scheme
|
||||
# ================
|
||||
# Generally follows PEP 440
|
||||
# Hex Version:
|
||||
# - Digit 1,2 : Major Version (01-ff)
|
||||
# - Digit 3,4 : Minor Version (01-ff)
|
||||
# - Digit 5,6 : Patch Version (01-ff)
|
||||
# - Digit 7 : Release Type (a: aplha, b: beta, c: candidate, f: final)
|
||||
# - Digit 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.0 1.2.0 Final release
|
||||
# 0x010201f0 : 1.2.1 1.2.1 Patch release
|
||||
##
|
||||
|
||||
__package__ = "novelwriter"
|
||||
__copyright__ = "Copyright 2018–2022, Veronica Berglyd Olsen"
|
||||
__license__ = "GPLv3"
|
||||
__author__ = "Veronica Berglyd Olsen"
|
||||
__maintainer__ = "Veronica Berglyd Olsen"
|
||||
__email__ = "code@vkbo.net"
|
||||
__version__ = "2.0"
|
||||
__hexversion__ = "0x020000f0"
|
||||
__date__ = "2022-11-28"
|
||||
__status__ = "Stable"
|
||||
__domain__ = "novelwriter.io"
|
||||
__url__ = "https://novelwriter.io"
|
||||
__sourceurl__ = "https://github.com/vkbo/novelWriter"
|
||||
__issuesurl__ = "https://github.com/vkbo/novelWriter/issues"
|
||||
__helpurl__ = "https://github.com/vkbo/novelWriter/discussions"
|
||||
__releaseurl__ = "https://github.com/vkbo/novelWriter/releases/latest"
|
||||
__docurl__ = "https://novelwriter.readthedocs.io"
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
##
|
||||
# Main Program
|
||||
##
|
||||
|
||||
# Load the main config as a global object
|
||||
CONFIG = Config()
|
||||
|
||||
|
||||
def main(sysArgs=None):
|
||||
"""Parse command line, set up logging, and launch main GUI.
|
||||
"""
|
||||
if sysArgs is None:
|
||||
sysArgs = sys.argv[1:]
|
||||
|
||||
# Valid Input Options
|
||||
shortOpt = "hv"
|
||||
longOpt = [
|
||||
"help",
|
||||
"version",
|
||||
"info",
|
||||
"debug",
|
||||
"style=",
|
||||
"config=",
|
||||
"data=",
|
||||
"testmode",
|
||||
]
|
||||
|
||||
helpMsg = (
|
||||
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"
|
||||
"MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
|
||||
"GNU General Public Licence for more details.\n"
|
||||
"\n"
|
||||
"Usage:\n"
|
||||
" -h, --help Print this message.\n"
|
||||
" -v, --version Print program version and exit.\n"
|
||||
" --info Print additional runtime information.\n"
|
||||
" --debug Print debug output. Includes --info.\n"
|
||||
" --style= Sets Qt5 style flag. Defaults to 'Fusion'.\n"
|
||||
" --config= Alternative config file.\n"
|
||||
" --data= Alternative user data path.\n"
|
||||
)
|
||||
|
||||
# Defaults
|
||||
logLevel = logging.WARN
|
||||
logFormat = "{levelname:8} {message:}"
|
||||
confPath = None
|
||||
dataPath = None
|
||||
testMode = False
|
||||
qtStyle = "Fusion"
|
||||
cmdOpen = None
|
||||
|
||||
# Parse Options
|
||||
try:
|
||||
inOpts, inRemain = getopt.getopt(sysArgs, shortOpt, longOpt)
|
||||
except getopt.GetoptError as exc:
|
||||
print(helpMsg)
|
||||
print(f"ERROR: {str(exc)}")
|
||||
sys.exit(2)
|
||||
|
||||
if len(inRemain) > 0:
|
||||
cmdOpen = inRemain[0]
|
||||
|
||||
for inOpt, inArg in inOpts:
|
||||
if inOpt in ("-h", "--help"):
|
||||
print(helpMsg)
|
||||
sys.exit(0)
|
||||
elif inOpt in ("-v", "--version"):
|
||||
print("novelWriter Version %s [%s]" % (__version__, __date__))
|
||||
sys.exit(0)
|
||||
elif inOpt == "--info":
|
||||
logLevel = logging.INFO
|
||||
elif inOpt == "--debug":
|
||||
logLevel = logging.DEBUG
|
||||
logFormat = "[{asctime:}] {filename:>17}:{lineno:<4d} {levelname:8} {message:}"
|
||||
elif inOpt == "--style":
|
||||
qtStyle = inArg
|
||||
elif inOpt == "--config":
|
||||
confPath = inArg
|
||||
elif inOpt == "--data":
|
||||
dataPath = inArg
|
||||
elif inOpt == "--testmode":
|
||||
testMode = True
|
||||
|
||||
# Set Logging
|
||||
cHandle = logging.StreamHandler()
|
||||
cHandle.setFormatter(logging.Formatter(fmt=logFormat, style="{"))
|
||||
|
||||
pkgLogger = logging.getLogger(__package__)
|
||||
pkgLogger.addHandler(cHandle)
|
||||
pkgLogger.setLevel(logLevel)
|
||||
|
||||
logger.info("Starting novelWriter %s (%s) %s", __version__, __hexversion__, __date__)
|
||||
|
||||
# Check Packages and Versions
|
||||
errorData = []
|
||||
errorCode = 0
|
||||
if sys.hexversion < 0x030700f0:
|
||||
errorData.append(
|
||||
"At least Python 3.7 is required, found %s" % CONFIG.verPyString
|
||||
)
|
||||
errorCode |= 0x04
|
||||
if CONFIG.verQtValue < 51000:
|
||||
errorData.append(
|
||||
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
|
||||
)
|
||||
errorCode |= 0x08
|
||||
if CONFIG.verPyQtValue < 51000:
|
||||
errorData.append(
|
||||
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
|
||||
)
|
||||
errorCode |= 0x10
|
||||
|
||||
try:
|
||||
import lxml # noqa: F401
|
||||
except ImportError:
|
||||
errorData.append("Python module 'lxml' is missing")
|
||||
errorCode |= 0x20
|
||||
|
||||
if errorData:
|
||||
errApp = QApplication([])
|
||||
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> - %s</p>"
|
||||
"<p>Shutting down ...</p>"
|
||||
) % (
|
||||
"<br> - ".join(errorData)
|
||||
))
|
||||
for errLine in errorData:
|
||||
logger.critical(errLine)
|
||||
errApp.exec_()
|
||||
sys.exit(errorCode)
|
||||
|
||||
# Finish initialising config
|
||||
CONFIG.initConfig(confPath, dataPath)
|
||||
|
||||
if CONFIG.osDarwin:
|
||||
try:
|
||||
from Foundation import NSBundle
|
||||
bundle = NSBundle.mainBundle()
|
||||
info = bundle.localizedInfoDictionary() or bundle.infoDictionary()
|
||||
info["CFBundleName"] = "novelWriter"
|
||||
except Exception:
|
||||
logger.error("Failed to set application name")
|
||||
logException()
|
||||
|
||||
elif CONFIG.osWindows:
|
||||
try:
|
||||
import ctypes
|
||||
appID = f"io.novelwriter.{__version__}"
|
||||
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appID)
|
||||
except Exception:
|
||||
logger.error("Failed to set application name")
|
||||
logException()
|
||||
|
||||
# Import GUI (after dependency checks), and launch
|
||||
from novelwriter.guimain import GuiMain
|
||||
if testMode:
|
||||
nwGUI = GuiMain()
|
||||
return nwGUI
|
||||
|
||||
else:
|
||||
nwApp = QApplication([CONFIG.appName, (f"-style={qtStyle}")])
|
||||
nwApp.setApplicationName(CONFIG.appName)
|
||||
nwApp.setApplicationVersion(__version__)
|
||||
nwApp.setOrganizationDomain(__domain__)
|
||||
|
||||
# Connect the exception handler before making the main GUI
|
||||
sys.excepthook = exceptionHandler
|
||||
|
||||
# Launch main GUI
|
||||
CONFIG.initLocalisation(nwApp)
|
||||
nwGUI = GuiMain()
|
||||
nwGUI.postLaunchTasks(cmdOpen)
|
||||
|
||||
sys.exit(nwApp.exec_())
|
||||
|
||||
# END Function main
|
||||
105
novelwriter/assets/i18n/project_de_DE.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Synopsis": "Synopsis",
|
||||
"Comment": "Kommentar",
|
||||
"Notes": "Notizen",
|
||||
"0": "Null",
|
||||
"1": "Eins",
|
||||
"2": "Zwei",
|
||||
"3": "Drei",
|
||||
"4": "Vier",
|
||||
"5": "Fünf",
|
||||
"6": "Sechs",
|
||||
"7": "Sieben",
|
||||
"8": "Acht",
|
||||
"9": "Neun",
|
||||
"10": "Zehn",
|
||||
"11": "Elf",
|
||||
"12": "Zwölf",
|
||||
"13": "Dreizehen",
|
||||
"14": "Vierzehn",
|
||||
"15": "Fünfzehn",
|
||||
"16": "Sechzehn",
|
||||
"17": "Siebzehn",
|
||||
"18": "Achtzehn",
|
||||
"19": "Neunzehn",
|
||||
"20": "Zwanzig",
|
||||
"21": "Einundzwanzig",
|
||||
"22": "Zweiundzwanzig",
|
||||
"23": "Dreiundzwanzig",
|
||||
"24": "Vierundzwanzig",
|
||||
"25": "Fünfundzwanzig",
|
||||
"26": "Sechsundzwanzig",
|
||||
"27": "Siebenundzwanzig",
|
||||
"28": "Achtundzwanzig",
|
||||
"29": "Neunundzwanzig",
|
||||
"30": "Dreißig",
|
||||
"31": "Einunddreißig",
|
||||
"32": "Zweiunddreißig",
|
||||
"33": "Dreiunddreißig",
|
||||
"34": "Vierunddreißig",
|
||||
"35": "Fünfunddreißig",
|
||||
"36": "Sechsunddreißig",
|
||||
"37": "Siebenunddreißig",
|
||||
"38": "Achtunddreißig",
|
||||
"39": "Neununddreißig",
|
||||
"40": "Vierzig",
|
||||
"41": "Einundvierzig",
|
||||
"42": "Zweiundvierzig",
|
||||
"43": "Dreiundvierzig",
|
||||
"44": "Vierundvierzig",
|
||||
"45": "Fünfundvierzig",
|
||||
"46": "Sechsundvierzig",
|
||||
"47": "Siebenundvierzig",
|
||||
"48": "Achtundvierzig",
|
||||
"49": "Neunundvierzig",
|
||||
"50": "Fünfzig",
|
||||
"51": "Einundfünfzig",
|
||||
"52": "Zweiundfünfzig",
|
||||
"53": "Dreiundfünfzig",
|
||||
"54": "Vierundfünfzig",
|
||||
"55": "Fünfundfünfzig",
|
||||
"56": "Sechsundfünfzig",
|
||||
"57": "Siebenundfünfzig",
|
||||
"58": "Achtundfünfzig",
|
||||
"59": "Neunundfünfzig",
|
||||
"60": "Sechzig",
|
||||
"61": "Einundsechzig",
|
||||
"62": "Zweiundsechzig",
|
||||
"63": "Dreiundsechzig",
|
||||
"64": "Vierundsechzig",
|
||||
"65": "Fünfundsechzig",
|
||||
"66": "Sechsundsechzig",
|
||||
"67": "Siebenundsechzig",
|
||||
"68": "Achtundsechzig",
|
||||
"69": "Neunundsechzig",
|
||||
"70": "Siebzig",
|
||||
"71": "Einundsiebzig",
|
||||
"72": "Zweiundsiebzig",
|
||||
"73": "Dreiundsiebzig",
|
||||
"74": "Vierundsiebzig",
|
||||
"75": "Fünfundsiebzig",
|
||||
"76": "Sechsundsiebzig",
|
||||
"77": "Siebenundsiebzig",
|
||||
"78": "Achtundsiebzig",
|
||||
"79": "Neunundsiebzig",
|
||||
"80": "Achtzig",
|
||||
"81": "Einundachtzig",
|
||||
"82": "Zweiundachtzig",
|
||||
"83": "Dreiundachtzig",
|
||||
"84": "Vierundachtzig",
|
||||
"85": "Fünfundachtzig",
|
||||
"86": "Sechsundachtzig",
|
||||
"87": "Siebenundachtzig",
|
||||
"88": "Achtundachtzig",
|
||||
"89": "Neunundachtzig",
|
||||
"90": "Neunzig",
|
||||
"91": "Einundneunzig",
|
||||
"92": "Zweiundneunzig",
|
||||
"93": "Dreiundneunzig",
|
||||
"94": "Vierundneunzig",
|
||||
"95": "Fünfundneunzig",
|
||||
"96": "Sechsundneunzig",
|
||||
"97": "Siebenundneunzig",
|
||||
"98": "Achtundneunzig",
|
||||
"99": "Neunundneunzig"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_en_GB.json
Normal 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"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_en_US.json
Normal 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"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_es_419.json
Normal 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"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_fr_FR.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Synopsis": "Synopsis",
|
||||
"Comment": "Commentaire",
|
||||
"Notes": "Notes",
|
||||
"0": "Zero",
|
||||
"1": "Un",
|
||||
"2": "Deux",
|
||||
"3": "Trois",
|
||||
"4": "Quatre",
|
||||
"5": "Cinq",
|
||||
"6": "Six",
|
||||
"7": "Sept",
|
||||
"8": "Huit",
|
||||
"9": "Neuf",
|
||||
"10": "Dix",
|
||||
"11": "Onze",
|
||||
"12": "Douze",
|
||||
"13": "Treize",
|
||||
"14": "Quatorze",
|
||||
"15": "Quinze",
|
||||
"16": "Seize",
|
||||
"17": "Dix-sept",
|
||||
"18": "Dix-huit",
|
||||
"19": "Dix-neuf",
|
||||
"20": "Vingt",
|
||||
"21": "Vingt et un",
|
||||
"22": "Vingt-deux",
|
||||
"23": "Vingt-trois",
|
||||
"24": "Vingt-quatre",
|
||||
"25": "Vingt-cinq",
|
||||
"26": "Vingt-six",
|
||||
"27": "Vingt-sept",
|
||||
"28": "Vingt-huit",
|
||||
"29": "Vingt-neuf",
|
||||
"30": "Trente",
|
||||
"31": "Trente et un",
|
||||
"32": "Trente-deux",
|
||||
"33": "Trente-trois",
|
||||
"34": "Trente-quatre",
|
||||
"35": "Trente-cinq",
|
||||
"36": "Trente-six",
|
||||
"37": "Trente-sept",
|
||||
"38": "Trente-huit",
|
||||
"39": "Trente-neuf",
|
||||
"40": "Quarante",
|
||||
"41": "Quarante et un",
|
||||
"42": "Quarante-deux",
|
||||
"43": "Quarante-trois",
|
||||
"44": "Quarante-quatre",
|
||||
"45": "Quarante-cinq",
|
||||
"46": "Quarante-six",
|
||||
"47": "Quarante-sept",
|
||||
"48": "Quarante-huit",
|
||||
"49": "Quarante-neuf",
|
||||
"50": "Cinquante",
|
||||
"51": "Cinquante et un",
|
||||
"52": "Cinquante-deux",
|
||||
"53": "Cinquante-trois",
|
||||
"54": "Cinquante-quatre",
|
||||
"55": "Cinquante-cinq",
|
||||
"56": "Cinquante-six",
|
||||
"57": "Cinquante-sept",
|
||||
"58": "Cinquante-huit",
|
||||
"59": "Cinquante-neuf",
|
||||
"60": "Soixante",
|
||||
"61": "Soixante et un",
|
||||
"62": "Soixante-deux",
|
||||
"63": "Soixante-trois",
|
||||
"64": "Soixante-quatre",
|
||||
"65": "Soixante-cinq",
|
||||
"66": "Soixante-six",
|
||||
"67": "Soixante-sept",
|
||||
"68": "Soixante-huit",
|
||||
"69": "Soixante-neuf",
|
||||
"70": "Soixante-dix",
|
||||
"71": "Soixante et onze",
|
||||
"72": "Soixante-douze",
|
||||
"73": "Soixante-treize",
|
||||
"74": "Soixante-quatorze",
|
||||
"75": "Soixante-quinze",
|
||||
"76": "Soixante-seize",
|
||||
"77": "Soixante-dix-sept",
|
||||
"78": "Soixante-dix-huit",
|
||||
"79": "Soixante-dix-neuf",
|
||||
"80": "Quatre-vingts",
|
||||
"81": "Quatre-vingt-un",
|
||||
"82": "Quatre-vingt-deux",
|
||||
"83": "Quatre-vingt-trois",
|
||||
"84": "Quatre-vingt-quatre",
|
||||
"85": "Quatre-vingt-cinq",
|
||||
"86": "Quatre-vingt-six",
|
||||
"87": "Quatre-vingt-sept",
|
||||
"88": "Quatre-vingt-huit",
|
||||
"89": "Quatre-vingt-neuf",
|
||||
"90": "Quatre-vingt-dix",
|
||||
"91": "Quatre-vingt-onze",
|
||||
"92": "Quatre-vingt-douze",
|
||||
"93": "Quatre-vingt-treize",
|
||||
"94": "Quatre-vingt-quatorze",
|
||||
"95": "Quatre-vingt-quinze",
|
||||
"96": "Quatre-vingt-seize",
|
||||
"97": "Quatre-vingt-dix-sept",
|
||||
"98": "Quatre-vingt-dix-huit",
|
||||
"99": "Quatre-vingt-dix-neuf"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_nb_NO.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Synopsis": "Sammendrag",
|
||||
"Comment": "Kommentar",
|
||||
"Notes": "Notat",
|
||||
"0": "null",
|
||||
"1": "én",
|
||||
"2": "to",
|
||||
"3": "tre",
|
||||
"4": "fire",
|
||||
"5": "fem",
|
||||
"6": "seks",
|
||||
"7": "sju",
|
||||
"8": "åtte",
|
||||
"9": "ni",
|
||||
"10": "ti",
|
||||
"11": "elleve",
|
||||
"12": "tolv",
|
||||
"13": "tretten",
|
||||
"14": "fjorten",
|
||||
"15": "femten",
|
||||
"16": "seksten",
|
||||
"17": "sytten",
|
||||
"18": "atten",
|
||||
"19": "nitten",
|
||||
"20": "tjue",
|
||||
"21": "tjueén",
|
||||
"22": "tjueto",
|
||||
"23": "tjuetre",
|
||||
"24": "tjuefire",
|
||||
"25": "tjuefem",
|
||||
"26": "tjueseks",
|
||||
"27": "tjuesju",
|
||||
"28": "tjueåtte",
|
||||
"29": "tjueni",
|
||||
"30": "tretti",
|
||||
"31": "trettién",
|
||||
"32": "trettito",
|
||||
"33": "trettitre",
|
||||
"34": "trettifire",
|
||||
"35": "trettifem",
|
||||
"36": "trettiseks",
|
||||
"37": "trettisju",
|
||||
"38": "trettiåtte",
|
||||
"39": "trettini",
|
||||
"40": "førti",
|
||||
"41": "førtién",
|
||||
"42": "førtito",
|
||||
"43": "førtitre",
|
||||
"44": "førtifire",
|
||||
"45": "førtifem",
|
||||
"46": "førtiseks",
|
||||
"47": "førtisju",
|
||||
"48": "førtiåtte",
|
||||
"49": "førtini",
|
||||
"50": "femti",
|
||||
"51": "femtién",
|
||||
"52": "femtito",
|
||||
"53": "femtitre",
|
||||
"54": "femtifire",
|
||||
"55": "femtifem",
|
||||
"56": "femtiseks",
|
||||
"57": "femtisju",
|
||||
"58": "femtiåtte",
|
||||
"59": "femtini",
|
||||
"60": "seksti",
|
||||
"61": "sekstién",
|
||||
"62": "sekstito",
|
||||
"63": "sekstitre",
|
||||
"64": "sekstifire",
|
||||
"65": "sekstifem",
|
||||
"66": "sekstiseks",
|
||||
"67": "sekstisju",
|
||||
"68": "sekstiåtte",
|
||||
"69": "sekstini",
|
||||
"70": "sytti",
|
||||
"71": "syttién",
|
||||
"72": "syttito",
|
||||
"73": "syttitre",
|
||||
"74": "syttifire",
|
||||
"75": "syttifem",
|
||||
"76": "syttiseks",
|
||||
"77": "syttisju",
|
||||
"78": "syttiåtte",
|
||||
"79": "syttini",
|
||||
"80": "åtti",
|
||||
"81": "åttién",
|
||||
"82": "åttito",
|
||||
"83": "åttitre",
|
||||
"84": "åttifire",
|
||||
"85": "åttifem",
|
||||
"86": "åttiseks",
|
||||
"87": "åttisju",
|
||||
"88": "åttiåtte",
|
||||
"89": "åttini",
|
||||
"90": "nitti",
|
||||
"91": "nittién",
|
||||
"92": "nittito",
|
||||
"93": "nittitre",
|
||||
"94": "nittifire",
|
||||
"95": "nittifem",
|
||||
"96": "nittiseks",
|
||||
"97": "nittisju",
|
||||
"98": "nittiåtte",
|
||||
"99": "nittini"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_nl_NL.json
Normal 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"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_nn_NO.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Synopsis": "Samandrag",
|
||||
"Comment": "Kommentar",
|
||||
"Notes": "Notat",
|
||||
"0": "null",
|
||||
"1": "ein",
|
||||
"2": "to",
|
||||
"3": "tre",
|
||||
"4": "fire",
|
||||
"5": "fem",
|
||||
"6": "seks",
|
||||
"7": "sju",
|
||||
"8": "åtte",
|
||||
"9": "ni",
|
||||
"10": "ti",
|
||||
"11": "elleve",
|
||||
"12": "tolv",
|
||||
"13": "tretten",
|
||||
"14": "fjorten",
|
||||
"15": "femten",
|
||||
"16": "seksten",
|
||||
"17": "sytten",
|
||||
"18": "atten",
|
||||
"19": "nitten",
|
||||
"20": "tjue",
|
||||
"21": "tjueein",
|
||||
"22": "tjueto",
|
||||
"23": "tjuetre",
|
||||
"24": "tjuefire",
|
||||
"25": "tjuefem",
|
||||
"26": "tjueseks",
|
||||
"27": "tjuesju",
|
||||
"28": "tjueåtte",
|
||||
"29": "tjueni",
|
||||
"30": "tretti",
|
||||
"31": "trettiein",
|
||||
"32": "trettito",
|
||||
"33": "trettitre",
|
||||
"34": "trettifire",
|
||||
"35": "trettifem",
|
||||
"36": "trettiseks",
|
||||
"37": "trettisju",
|
||||
"38": "trettiåtte",
|
||||
"39": "trettini",
|
||||
"40": "førti",
|
||||
"41": "førtiein",
|
||||
"42": "førtito",
|
||||
"43": "førtitre",
|
||||
"44": "førtifire",
|
||||
"45": "førtifem",
|
||||
"46": "førtiseks",
|
||||
"47": "førtisju",
|
||||
"48": "førtiåtte",
|
||||
"49": "førtini",
|
||||
"50": "femti",
|
||||
"51": "femtiein",
|
||||
"52": "femtito",
|
||||
"53": "femtitre",
|
||||
"54": "femtifire",
|
||||
"55": "femtifem",
|
||||
"56": "femtiseks",
|
||||
"57": "femtisju",
|
||||
"58": "femtiåtte",
|
||||
"59": "femtini",
|
||||
"60": "seksti",
|
||||
"61": "sekstiein",
|
||||
"62": "sekstito",
|
||||
"63": "sekstitre",
|
||||
"64": "sekstifire",
|
||||
"65": "sekstifem",
|
||||
"66": "sekstiseks",
|
||||
"67": "sekstisju",
|
||||
"68": "sekstiåtte",
|
||||
"69": "sekstini",
|
||||
"70": "sytti",
|
||||
"71": "syttiein",
|
||||
"72": "syttito",
|
||||
"73": "syttitre",
|
||||
"74": "syttifire",
|
||||
"75": "syttifem",
|
||||
"76": "syttiseks",
|
||||
"77": "syttisju",
|
||||
"78": "syttiåtte",
|
||||
"79": "syttini",
|
||||
"80": "åtti",
|
||||
"81": "åttiein",
|
||||
"82": "åttito",
|
||||
"83": "åttitre",
|
||||
"84": "åttifire",
|
||||
"85": "åttifem",
|
||||
"86": "åttiseks",
|
||||
"87": "åttisju",
|
||||
"88": "åttiåtte",
|
||||
"89": "åttini",
|
||||
"90": "nitti",
|
||||
"91": "nittiein",
|
||||
"92": "nittito",
|
||||
"93": "nittitre",
|
||||
"94": "nittifire",
|
||||
"95": "nittifem",
|
||||
"96": "nittiseks",
|
||||
"97": "nittisju",
|
||||
"98": "nittiåtte",
|
||||
"99": "nittini"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_pt_BR.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Synopsis": "Sinopse",
|
||||
"Comment": "Comentários",
|
||||
"Notes": "Notas",
|
||||
"0": "Zero",
|
||||
"1": "Um",
|
||||
"2": "Dois",
|
||||
"3": "Três",
|
||||
"4": "Quatro",
|
||||
"5": "Cinco",
|
||||
"6": "Seis",
|
||||
"7": "Sete",
|
||||
"8": "Oito",
|
||||
"9": "Nove",
|
||||
"10": "Dez",
|
||||
"11": "Onze",
|
||||
"12": "Doze",
|
||||
"13": "Treze",
|
||||
"14": "Quatorze",
|
||||
"15": "Quinze",
|
||||
"16": "Dezesseis",
|
||||
"17": "Dezesete",
|
||||
"18": "Dezoito",
|
||||
"19": "Dezenove",
|
||||
"20": "Vinte",
|
||||
"21": "Vinte e Um",
|
||||
"22": "Vinte e Dois",
|
||||
"23": "Vinte e Três",
|
||||
"24": "Vinte e Quatro",
|
||||
"25": "Vinte e Cinco",
|
||||
"26": "Vinte e Seis",
|
||||
"27": "Vinte e Sete",
|
||||
"28": "Vinte e Oito",
|
||||
"29": "Vinte e Nove",
|
||||
"30": "Trinta",
|
||||
"31": "Trinta e Um",
|
||||
"32": "Trinta e Dois",
|
||||
"33": "Trinta e Três",
|
||||
"34": "Trinta e Quatro",
|
||||
"35": "Trinta e Cinco",
|
||||
"36": "Trinta e Seis",
|
||||
"37": "Trinta e Sete",
|
||||
"38": "Trinta e Oito",
|
||||
"39": "Trinta e Nove",
|
||||
"40": "Quarenta",
|
||||
"41": "Quarenta e Um",
|
||||
"42": "Quarenta e Dois",
|
||||
"43": "Quarenta e Três",
|
||||
"44": "Quarenta e Quatro",
|
||||
"45": "Quarenta e Cinco",
|
||||
"46": "Quarenta e Seis",
|
||||
"47": "Quarenta e Sete",
|
||||
"48": "Quarenta e Oito",
|
||||
"49": "Quarenta e Nove",
|
||||
"50": "Cinquenta",
|
||||
"51": "Cinquenta e Um",
|
||||
"52": "Cinquenta e Dois",
|
||||
"53": "Cinquenta e Três",
|
||||
"54": "Cinquenta e Quatro",
|
||||
"55": "Cinquenta e Cinco",
|
||||
"56": "Cinquenta e Seis",
|
||||
"57": "Cinquenta e Sete",
|
||||
"58": "Cinquenta e Oito",
|
||||
"59": "Cinquenta e Nove",
|
||||
"60": "Sessenta",
|
||||
"61": "Sessenta e Um",
|
||||
"62": "Sessenta e Dois",
|
||||
"63": "Sessenta e Três",
|
||||
"64": "Sessenta e Quatro",
|
||||
"65": "Sessenta e Cinco",
|
||||
"66": "Sessenta e Seis",
|
||||
"67": "Sessenta e Sete",
|
||||
"68": "Sessenta e Oito",
|
||||
"69": "Sessenta e Nove",
|
||||
"70": "Setenta",
|
||||
"71": "Setenta e Um",
|
||||
"72": "Setenta e Dois",
|
||||
"73": "Setenta e Três",
|
||||
"74": "Setenta e Quatro",
|
||||
"75": "Setenta e Cinco",
|
||||
"76": "Setenta e Seis",
|
||||
"77": "Setenta e Sete",
|
||||
"78": "Setenta e Oito",
|
||||
"79": "Setenta e Nove",
|
||||
"80": "Oitenta",
|
||||
"81": "Oitenta e Um",
|
||||
"82": "Oitenta e Dois",
|
||||
"83": "Oitenta e Três",
|
||||
"84": "Oitenta e Quatro",
|
||||
"85": "Oitenta e Cinco",
|
||||
"86": "Oitenta e Seis",
|
||||
"87": "Oitenta e Sete",
|
||||
"88": "Oitenta e Oito",
|
||||
"89": "Oitenta e Nove",
|
||||
"90": "Noventa",
|
||||
"91": "Noventa e Um",
|
||||
"92": "Noventa e Dois",
|
||||
"93": "Noventa e Três",
|
||||
"94": "Noventa e Quatro",
|
||||
"95": "Noventa e Cinco",
|
||||
"96": "Noventa e Seis",
|
||||
"97": "Noventa e Sete",
|
||||
"98": "Noventa e Oito",
|
||||
"99": "Noventa e Nove"
|
||||
}
|
||||
105
novelwriter/assets/i18n/project_zh_CN.json
Normal file
@@ -0,0 +1,105 @@
|
||||
{
|
||||
"Synopsis": "概要",
|
||||
"Comment": "注释",
|
||||
"Notes": "笔记",
|
||||
"0": "零",
|
||||
"1": "一",
|
||||
"2": "二",
|
||||
"3": "三",
|
||||
"4": "四",
|
||||
"5": "五",
|
||||
"6": "六",
|
||||
"7": "七",
|
||||
"8": "八",
|
||||
"9": "九",
|
||||
"10": "十",
|
||||
"11": "十一",
|
||||
"12": "十二",
|
||||
"13": "十三",
|
||||
"14": "十四",
|
||||
"15": "十五",
|
||||
"16": "十六",
|
||||
"17": "十七",
|
||||
"18": "十八",
|
||||
"19": "十九",
|
||||
"20": "二十",
|
||||
"21": "二十一",
|
||||
"22": "二十二",
|
||||
"23": "二十三",
|
||||
"24": "二十四",
|
||||
"25": "二十五",
|
||||
"26": "二十六",
|
||||
"27": "二十七",
|
||||
"28": "二十八",
|
||||
"29": "二十九",
|
||||
"30": "三十",
|
||||
"31": "三十一",
|
||||
"32": "三十二",
|
||||
"33": "三十三",
|
||||
"34": "三十四",
|
||||
"35": "三十五",
|
||||
"36": "三十六",
|
||||
"37": "三十七",
|
||||
"38": "三十八",
|
||||
"39": "三十九",
|
||||
"40": "四十",
|
||||
"41": "四十一",
|
||||
"42": "四十二",
|
||||
"43": "四十三",
|
||||
"44": "四十四",
|
||||
"45": "四十五",
|
||||
"46": "四十六",
|
||||
"47": "四十七",
|
||||
"48": "四十八",
|
||||
"49": "四十九",
|
||||
"50": "五十",
|
||||
"51": "五十一",
|
||||
"52": "五十二",
|
||||
"53": "五十三",
|
||||
"54": "五十四",
|
||||
"55": "五十五",
|
||||
"56": "五十六",
|
||||
"57": "五十七",
|
||||
"58": "五十八",
|
||||
"59": "五十九",
|
||||
"60": "六十",
|
||||
"61": "六十一",
|
||||
"62": "六十二",
|
||||
"63": "六十三",
|
||||
"64": "六十四",
|
||||
"65": "六十五",
|
||||
"66": "六十六",
|
||||
"67": "六十七",
|
||||
"68": "六十八",
|
||||
"69": "六十九",
|
||||
"70": "七十",
|
||||
"71": "七十一",
|
||||
"72": "七十二",
|
||||
"73": "七十三",
|
||||
"74": "七十四",
|
||||
"75": "七十五",
|
||||
"76": "七十六",
|
||||
"77": "七十七",
|
||||
"78": "七十八",
|
||||
"79": "七十九",
|
||||
"80": "八十",
|
||||
"81": "八十一",
|
||||
"82": "八十二",
|
||||
"83": "八十三",
|
||||
"84": "八十四",
|
||||
"85": "八十五",
|
||||
"86": "八十六",
|
||||
"87": "八十七",
|
||||
"88": "八十八",
|
||||
"89": "八十九",
|
||||
"90": "九十",
|
||||
"91": "九十一",
|
||||
"92": "九十二",
|
||||
"93": "九十三",
|
||||
"94": "九十四",
|
||||
"95": "九十五",
|
||||
"96": "九十六",
|
||||
"97": "九十七",
|
||||
"98": "九十八",
|
||||
"99": "九十九"
|
||||
}
|
||||
BIN
novelwriter/assets/icons/novelwriter.ico
Normal file
|
After Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 6.3 KiB After Width: | Height: | Size: 6.3 KiB |
29
novelwriter/assets/icons/typicons_dark/README.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# Typicons for Dark Backgrounds
|
||||
|
||||
This theme is based on Typicons. All files are prefixed, depending on whether they are based
|
||||
directly on original Typicons, redesigned, or designed from scratch.
|
||||
|
||||
## Typicons Icons
|
||||
|
||||
The files have a `typ_` prefix. These are colourised and rescaled Typicons, but with no other
|
||||
modifications.
|
||||
|
||||
Copyright: Stephen Hutchings
|
||||
Source: https://github.com/stephenhutchings/typicons.font
|
||||
License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
|
||||
## Original Icons
|
||||
|
||||
The files have a `nw_` prefix. These are made completely from scratch for novelWriter and are not
|
||||
using any design elements from Typicons.
|
||||
|
||||
Copyright: Veronica Berglyd Olsen
|
||||
License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
|
||||
## Mixed Icons
|
||||
|
||||
The files have a `mixed_` prefix. These are redesigned from Typicons components, modified from
|
||||
Typicons, or consist of a mix of Typicons and new elements.
|
||||
|
||||
Copyright: Stephen Hutchings, Veronica Berglyd Olsen
|
||||
License: [CC BY-SA 4.0](https://creativecommons.org/licenses/by-sa/4.0/)
|
||||
86
novelwriter/assets/icons/typicons_dark/icons.conf
Normal file
@@ -0,0 +1,86 @@
|
||||
##
|
||||
# Icons: Typicons Dark
|
||||
# Source: https://github.com/stephenhutchings/typicons.font
|
||||
# Credit: Stephen Hutchings
|
||||
# Modified: Veronica Berglyd Olsen
|
||||
# Additions: hash.svg
|
||||
##
|
||||
|
||||
[Main]
|
||||
name = Typicons Dark
|
||||
description = Colourised icons for dark GUI theme based on Typicons.
|
||||
author = Veronica Berglyd Olsen (adaptation)
|
||||
credit = Stephen Hutchings (icon design)
|
||||
url = https://github.com/stephenhutchings/typicons.font
|
||||
license = CC BY-SA 4.0
|
||||
licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
|
||||
|
||||
[Map]
|
||||
add = typ_plus.svg
|
||||
backward = typ_chevron-left.svg
|
||||
bookmark = typ_bookmark.svg
|
||||
bullet-off = typ_media-record-outline.svg
|
||||
bullet-on = typ_media-record.svg
|
||||
checked = mixed_input-checked.svg
|
||||
close = typ_times.svg
|
||||
cls_archive = typ_delete.svg
|
||||
cls_character = typ_user.svg
|
||||
cls_custom = typ_star.svg
|
||||
cls_entity = typ_flag.svg
|
||||
cls_none = typ_cancel.svg
|
||||
cls_novel = typ_book.svg
|
||||
cls_object = typ_key.svg
|
||||
cls_plot = typ_puzzle.svg
|
||||
cls_timeline = typ_calendar.svg
|
||||
cls_trash = typ_trash.svg
|
||||
cls_world = typ_location.svg
|
||||
cross = typ_times.svg
|
||||
down = typ_chevron-down.svg
|
||||
edit = typ_pencil.svg
|
||||
forward = typ_chevron-right.svg
|
||||
maximise = typ_arrow-maximise.svg
|
||||
menu = typ_th-menu.svg
|
||||
minimise = typ_arrow-minimise.svg
|
||||
noncheckable = mixed_input-none.svg
|
||||
proj_chapter = mixed_document-chapter.svg
|
||||
proj_details = typ_th-list-grey.svg
|
||||
proj_document = typ_document-text.svg
|
||||
proj_folder = typ_folder.svg
|
||||
proj_note = mixed_document-note.svg
|
||||
proj_scene = mixed_document-scene.svg
|
||||
proj_section = mixed_document-section.svg
|
||||
proj_stats = typ_chart-bar-grey.svg
|
||||
proj_title = mixed_document-title.svg
|
||||
reference = typ_at.svg
|
||||
refresh = typ_refresh.svg
|
||||
remove = typ_minus.svg
|
||||
search = typ_search.svg
|
||||
search_cancel = typ_cancel-grey.svg
|
||||
search_case = nw_search-case.svg
|
||||
search_loop = typ_arrow-repeat-grey.svg
|
||||
search_preserve = nw_search-preserve.svg
|
||||
search_project = typ_arrow-down-thick-grey.svg
|
||||
search_regex = nw_search-regex.svg
|
||||
search_replace = mixed_search-replace.svg
|
||||
search_word = nw_search-word.svg
|
||||
settings = typ_cog.svg
|
||||
status_idle = typ_media-pause-grey.svg
|
||||
status_lang = typ_globe-grey.svg
|
||||
status_lines = typ_th-list-grey.svg
|
||||
status_stats = typ_chart-bar-grey.svg
|
||||
status_time = typ_stopwatch-grey.svg
|
||||
sticky-off = typ_pin-outline.svg
|
||||
sticky-on = typ_pin.svg
|
||||
unchecked = mixed_input-unchecked.svg
|
||||
up = typ_chevron-up.svg
|
||||
view_build = typ_export.svg
|
||||
view_editor = mixed_edit.svg
|
||||
view_novel = typ_book-grey.svg
|
||||
view_outline = typ_puzzle-outline.svg
|
||||
|
||||
deco_doc_h0 = nw_deco-h0.svg
|
||||
deco_doc_h1 = nw_deco-h1.svg
|
||||
deco_doc_h2 = nw_deco-h2.svg
|
||||
deco_doc_h3 = nw_deco-h3.svg
|
||||
deco_doc_h4 = nw_deco-h4.svg
|
||||
deco_doc_more = nw_deco-noveltree-more.svg
|
||||
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#d64848;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#ffff84;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#6699cc;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#999999;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2161">
|
||||
<metadata
|
||||
id="metadata2167">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs2165" />
|
||||
<path
|
||||
id="rect12986"
|
||||
style="display:inline;opacity:0.95;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:1.88635;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 19.333984 C 4.6660156 20.007428 5.2152275 20.554687 5.8886719 20.554688 L 18.111328 20.554688 C 18.784774 20.554688 19.333984 20.007428 19.333984 19.333984 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="rect935"
|
||||
style="fill:#99cc99;fill-opacity:1;stroke-width:0;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:0.2"
|
||||
d="M 5.8886719 3.4453125 C 5.2152275 3.4453125 4.6660156 3.9925712 4.6660156 4.6660156 L 4.6660156 6 L 4.6660156 7.1894531 L 4.6660156 10.058594 L 19.333984 10.058594 L 19.333984 7.1894531 L 19.333984 6 L 19.333984 4.6660156 C 19.333984 3.9925712 18.784774 3.4453125 18.111328 3.4453125 L 5.8886719 3.4453125 z " />
|
||||
<path
|
||||
id="path2157"
|
||||
style="display:inline;fill:#595959;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281,13.222656 C 6.7739949,13.222656 6.5,13.49665 6.5,13.833984 c 0,0.337332 0.2739949,0.611328 0.6113281,0.611328 h 9.7773439 c 0.337334,1e-6 0.611328,-0.273996 0.611328,-0.611328 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z m 0,3.666016 C 6.7739949,16.888672 6.5,17.162666 6.5,17.5 c 0,0.337334 0.2739949,0.611328 0.6113281,0.611328 H 16.888672 C 17.226006,18.111328 17.5,17.837334 17.5,17.5 c 0,-0.337334 -0.273994,-0.611328 -0.611328,-0.611328 z" />
|
||||
<path
|
||||
id="path902"
|
||||
style="display:inline;fill:#848484;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 5.8886719,1 C 3.8671165,1 2.2226562,2.6444602 2.2226562,4.6660156 V 19.333984 C 2.2226563,21.355538 3.8671165,23 5.8886719,23 H 18.111328 c 2.021556,0 3.666016,-1.644462 3.666016,-3.666016 V 4.6660156 C 21.777344,2.6444602 20.132884,1 18.111328,1 Z m 0,2.4453125 H 18.111328 c 0.673446,0 1.222656,0.5472587 1.222656,1.2207031 V 19.333984 c 0,0.673444 -0.54921,1.220704 -1.222656,1.220704 H 5.8886719 c -0.6734444,-10e-7 -1.2226563,-0.54726 -1.2226563,-1.220704 V 4.6660156 c 0,-0.6734444 0.5492119,-1.2207031 1.2226563,-1.2207031 z" />
|
||||
<path
|
||||
id="path2157-0"
|
||||
style="display:inline;fill:#ffffff;fill-opacity:1;stroke-width:1.22222"
|
||||
d="M 7.1113281 5.8886719 C 6.7739949 5.8886719 6.5 6.1626667 6.5 6.5 C 6.5 6.837334 6.7739949 7.1113281 7.1113281 7.1113281 L 16.888672 7.1113281 C 17.226006 7.1113281 17.5 6.837334 17.5 6.5 C 17.5 6.1626667 17.226006 5.8886719 16.888672 5.8886719 L 7.1113281 5.8886719 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
52
novelwriter/assets/icons/typicons_dark/mixed_edit.svg
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
version="1.2"
|
||||
width="24"
|
||||
height="24"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg7536"
|
||||
sodipodi:docname="mixed_edit.svg"
|
||||
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/">
|
||||
<sodipodi:namedview
|
||||
id="namedview1259"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:pageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
showgrid="false"
|
||||
inkscape:zoom="34.625"
|
||||
inkscape:cx="8.7364621"
|
||||
inkscape:cy="11.98556"
|
||||
inkscape:window-width="2560"
|
||||
inkscape:window-height="1330"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg7536" />
|
||||
<metadata
|
||||
id="metadata7542">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs7540" />
|
||||
<path
|
||||
id="path7534"
|
||||
style="display:inline;fill:#aeaeae;fill-opacity:1;stroke-width:1.10527"
|
||||
d="M 19.160156 0 C 18.73463 0 18.312122 0.160533 17.988281 0.484375 L 14.052734 4.421875 L 4.1054688 4.421875 C 3.4953635 4.421875 3 4.9141801 3 5.5253906 L 3 17.037109 L 3 18.429688 L 3 22.894531 C 3 23.505741 3.4953635 24 4.1054688 24 L 18.474609 24 C 19.084713 24 19.578125 23.505741 19.578125 22.894531 L 19.578125 18.429688 L 19.578125 17.037109 L 19.578125 9.9472656 L 23.515625 6.0117188 C 23.839466 5.6878766 24 5.2623116 24 4.8378906 C 24 4.4134695 23.839466 3.9918109 23.515625 3.6679688 L 20.332031 0.484375 C 20.008189 0.160533 19.584576 0 19.160156 0 z M 19.160156 2.4394531 L 21.560547 4.8398438 L 20.130859 6.2695312 L 17.730469 3.8691406 L 19.160156 2.4394531 z M 16.949219 4.6503906 L 19.349609 7.0507812 L 12.394531 14.005859 L 9.9941406 11.605469 L 16.949219 4.6503906 z M 5.2109375 6.6308594 L 11.841797 6.6308594 L 8.328125 10.146484 C 8.0042828 10.470327 7.7997073 11.043101 7.6328125 11.570312 C 7.4559704 12.122943 7.421875 12.737735 7.421875 13.195312 L 7.421875 16.578125 L 10.804688 16.578125 C 11.262267 16.578125 12.02928 16.467813 12.541016 16.257812 C 13.053858 16.047812 13.530778 15.874623 13.853516 15.550781 L 17.369141 12.158203 L 17.369141 17.037109 L 17.369141 18.429688 L 17.369141 21.789062 L 5.2109375 21.789062 L 5.2109375 18.429688 L 5.2109375 17.037109 L 5.2109375 6.6308594 z M 9.5644531 12.525391 L 11.505859 14.435547 L 9.6308594 14.369141 L 9.5644531 12.525391 z " />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
version="1.2"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2287">
|
||||
<defs
|
||||
id="defs2291" />
|
||||
<metadata
|
||||
id="metadata2281">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
d="m17.714 22h-11.429c-2.3629 0-4.2857-1.9229-4.2857-4.2857v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h7.1429c0.79 0 1.4286 0.64 1.4286 1.4286 0 0.78857-0.63857 1.4286-1.4286 1.4286h-7.1429c-0.78857 0-1.4286 0.64143-1.4286 1.4286v11.429c0 0.78714 0.64 1.4286 1.4286 1.4286h11.429c0.78857 0 1.4286-0.64143 1.4286-1.4286v-4.2857c0-0.78857 0.63857-1.4286 1.4286-1.4286s1.4286 0.64 1.4286 1.4286v4.2857c0 2.3629-1.9229 4.2857-4.2857 4.2857z"
|
||||
fill="#848484"
|
||||
stroke-width="1.4286"
|
||||
id="path2283" />
|
||||
<path
|
||||
d="m19.02 3.3503c-0.60933 0.010623-1.2003 0.31545-1.5586 0.86719l-5.0977 7.8477-2.3672-3.6445c-0.57329-0.88278-1.7442-1.1319-2.627-0.55859-0.88278 0.57329-1.1319 1.7461-0.55859 2.6289l3.9199 6.0391c0.38514 0.59307 1.0409 0.88965 1.6973 0.85352 0.03023-2.78e-4 0.05972-0.0041 0.08984-0.0059 0.0556-0.0057 0.11074-0.0088 0.16602-0.01953 0.52104-0.07621 1.0077-0.36147 1.3184-0.83984l6.6445-10.23c0.57329-0.88278 0.32419-2.0556-0.55859-2.6289-0.33104-0.21498-0.70276-0.31497-1.0684-0.30859z"
|
||||
fill="#9c9"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="1.111"
|
||||
id="path2285" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
44
novelwriter/assets/icons/typicons_dark/mixed_input-none.svg
Normal file
@@ -0,0 +1,44 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
version="1.2"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg2931">
|
||||
<defs
|
||||
id="defs2935" />
|
||||
<metadata
|
||||
id="metadata2925">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
d="m2 17.714v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h11.429c2.3629 0 4.2857 1.9229 4.2857 4.2857v7.1429c0 0.79-0.64 1.4286-1.4286 1.4286-0.78857 0-1.4286-0.63857-1.4286-1.4286v-7.1429c0-0.78857-0.64143-1.4286-1.4286-1.4286h-11.429c-0.78714 0-1.4286 0.64-1.4286 1.4286v11.429c0 0.78857 0.64143 1.4286 1.4286 1.4286h4.2857c0.78857 0 1.4286 0.63857 1.4286 1.4286s-0.64 1.4286-1.4286 1.4286h-4.2857c-2.3629 0-4.2857-1.9229-4.2857-4.2857zm15.714 4.2857h-11.429c-2.3629 0-4.2857-1.9229-4.2857-4.2857v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h7.1429c0.79 0 1.4286 0.64 1.4286 1.4286 0 0.78857-0.63857 1.4286-1.4286 1.4286h-7.1429c-0.78857 0-1.4286 0.64143-1.4286 1.4286v11.429c0 0.78714 0.64 1.4286 1.4286 1.4286h11.429c0.78857 0 1.4286-0.64143 1.4286-1.4286v-4.2857c0-0.78857 0.63857-1.4286 1.4286-1.4286s1.4286 0.64 1.4286 1.4286v4.2857c0 2.3629-1.9229 4.2857-4.2857 4.2857z"
|
||||
fill="#848484"
|
||||
stroke-width="1.4286"
|
||||
id="path2927" />
|
||||
<rect
|
||||
x="7"
|
||||
y="10.1"
|
||||
width="10"
|
||||
height="3.8"
|
||||
rx="1.9"
|
||||
ry="1.9"
|
||||
fill="#f99157"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="1.111"
|
||||
id="rect2929" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.8 KiB |
@@ -0,0 +1,39 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
width="24"
|
||||
height="24"
|
||||
version="1.2"
|
||||
viewBox="0 0 24 24"
|
||||
id="svg3574">
|
||||
<defs
|
||||
id="defs3578" />
|
||||
<metadata
|
||||
id="metadata3568">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<path
|
||||
d="m17.714 22h-11.429c-2.3629 0-4.2857-1.9229-4.2857-4.2857v-11.429c0-2.3629 1.9229-4.2857 4.2857-4.2857h7.1429c0.79 0 1.4286 0.64 1.4286 1.4286 0 0.78857-0.63857 1.4286-1.4286 1.4286h-7.1429c-0.78857 0-1.4286 0.64143-1.4286 1.4286v11.429c0 0.78714 0.64 1.4286 1.4286 1.4286h11.429c0.78857 0 1.4286-0.64143 1.4286-1.4286v-4.2857c0-0.78857 0.63857-1.4286 1.4286-1.4286s1.4286 0.64 1.4286 1.4286v4.2857c0 2.3629-1.9229 4.2857-4.2857 4.2857z"
|
||||
fill="#848484"
|
||||
stroke-width="1.4286"
|
||||
id="path3570" />
|
||||
<path
|
||||
d="m17.99 3.3379c-0.48501 0.025418-0.96034 0.23584-1.3125 0.62695l-4.6777 5.1953-1.332-1.4785c-0.70433-0.78223-1.9014-0.84495-2.6836-0.14062-0.78223 0.70433-0.84495 1.9014-0.14062 2.6836l1.5996 1.7754-1.5977 1.7754c-0.70433 0.78223-0.64161 1.9793 0.14062 2.6836 0.78223 0.70433 1.9773 0.64161 2.6816-0.14062l1.332-1.4785 1.332 1.4785c0.70433 0.78224 1.9014 0.84495 2.6836 0.14062 0.78223-0.70433 0.84495-1.9014 0.14062-2.6836l-1.5996-1.7754 4.9453-5.4922c0.70433-0.78223 0.64161-1.9793-0.14062-2.6836-0.39112-0.35216-0.88608-0.51175-1.3711-0.48633z"
|
||||
fill="#d64848"
|
||||
stroke-linecap="round"
|
||||
stroke-linejoin="round"
|
||||
stroke-width="1.111"
|
||||
id="path3572" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |