Compare commits
497 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
742f84576e | ||
|
|
ba81662d6a | ||
|
|
f669ac1265 | ||
|
|
b8a97b1afc | ||
|
|
4eb0ed386c | ||
|
|
ece225c355 | ||
|
|
69d97a3f3e | ||
|
|
dcecaae3af | ||
|
|
1c261ef371 | ||
|
|
ea89e66a46 | ||
|
|
dd03c19be2 | ||
|
|
08e6d320df | ||
|
|
446163c6de | ||
|
|
abd503b5a2 | ||
|
|
2e1c08cbfa | ||
|
|
7bdadadea1 | ||
|
|
bc33a4d0d4 | ||
|
|
188bc5d16f | ||
|
|
3fd0385160 | ||
|
|
5f3f55133e | ||
|
|
47b8e12bc7 | ||
|
|
cc97129e64 | ||
|
|
e40e282837 | ||
|
|
eba0fa58bf | ||
|
|
1c0fdd6a17 | ||
|
|
43eb62576c | ||
|
|
d43a799389 | ||
|
|
4d716555af | ||
|
|
7c65d22452 | ||
|
|
1b8867537e | ||
|
|
b91a11980b | ||
|
|
e80a9824f6 | ||
|
|
140b22dc63 | ||
|
|
60169b914a | ||
|
|
fbe381638a | ||
|
|
6dcb44c391 | ||
|
|
54c7c5a463 | ||
|
|
d5bcee14f5 | ||
|
|
0064b742d3 | ||
|
|
9f88f3b79e | ||
|
|
b95d030032 | ||
|
|
f4f3f82954 | ||
|
|
5e8892ee7c | ||
|
|
42b1e6a559 | ||
|
|
e1bcfcfc05 | ||
|
|
069e35565f | ||
|
|
880b560a39 | ||
|
|
8becc83c05 | ||
|
|
b5ef62194d | ||
|
|
a87c287fa6 | ||
|
|
18f5deee82 | ||
|
|
53545a0015 | ||
|
|
f662eaeccc | ||
|
|
1e6377abaa | ||
|
|
516db26c05 | ||
|
|
2df55cf6ee | ||
|
|
251475197d | ||
|
|
802069b4e5 | ||
|
|
d07543926f | ||
|
|
5665efd9d7 | ||
|
|
ea7f3fe51c | ||
|
|
c6569b63e5 | ||
|
|
930c60ae4a | ||
|
|
869cdd2fb0 | ||
|
|
f7d0adad1b | ||
|
|
d25e2adfb6 | ||
|
|
cb3a24bcd2 | ||
|
|
6540c56672 | ||
|
|
efc94a7fd5 | ||
|
|
683e81c57b | ||
|
|
f548927b74 | ||
|
|
53522908c8 | ||
|
|
43cdc8420c | ||
|
|
45ad0f8c20 | ||
|
|
59c9783393 | ||
|
|
611a6bb80a | ||
|
|
ee46fdb5b1 | ||
|
|
7c33c949cb | ||
|
|
e9e7fae40e | ||
|
|
ac05b07f10 | ||
|
|
aff027b735 | ||
|
|
14f1697428 | ||
|
|
a3381f1f79 | ||
|
|
1b7d331e41 | ||
|
|
df34293e74 | ||
|
|
fe27acc3ef | ||
|
|
35632abea3 | ||
|
|
ea247c5814 | ||
|
|
928a116666 | ||
|
|
2a99cafbf2 | ||
|
|
2196486454 | ||
|
|
f99bd79ce8 | ||
|
|
ddaced1b78 | ||
|
|
3e8845ab58 | ||
|
|
d5be1e0479 | ||
|
|
babc39c6a2 | ||
|
|
5c35ebeffa | ||
|
|
5fbc608c90 | ||
|
|
0c7808a24b | ||
|
|
4aadbdaed2 | ||
|
|
195a7e354b | ||
|
|
c03e832c7b | ||
|
|
73515c96d8 | ||
|
|
e7c0d59809 | ||
|
|
556caea308 | ||
|
|
6d54902a08 | ||
|
|
fb32cea5b5 | ||
|
|
69cd443999 | ||
|
|
cc61c5321e | ||
|
|
7821f099bf | ||
|
|
4b0ad6ec48 | ||
|
|
416c580a45 | ||
|
|
0b3488c265 | ||
|
|
f0f5ae6dc9 | ||
|
|
f61ce3919b | ||
|
|
67c6497e2a | ||
|
|
9bcb2479ac | ||
|
|
8a9b038d56 | ||
|
|
eed4721ef0 | ||
|
|
b76c866c9d | ||
|
|
255a4a327e | ||
|
|
811db81a86 | ||
|
|
29b61c07b0 | ||
|
|
f8c1ee90ce | ||
|
|
d9c86d56bb | ||
|
|
cddf63f111 | ||
|
|
ca91e6a677 | ||
|
|
a48fde95a3 | ||
|
|
aed4ba4310 | ||
|
|
57ee88059d | ||
|
|
c8dccbe438 | ||
|
|
8a071090e0 | ||
|
|
cbf76e6575 | ||
|
|
83d2cb4f82 | ||
|
|
497d4dd7f9 | ||
|
|
d48f1fa292 | ||
|
|
7744ae5912 | ||
|
|
92b7168363 | ||
|
|
8fc97c263b | ||
|
|
d190315909 | ||
|
|
987740f7e9 | ||
|
|
2e143071d9 | ||
|
|
388141aae6 | ||
|
|
80811ebf44 | ||
|
|
208c4fb8ba | ||
|
|
38a5fddb9d | ||
|
|
f844a5080a | ||
|
|
a11a013d16 | ||
|
|
f34cb567e4 | ||
|
|
6cb330b06c | ||
|
|
04cf375725 | ||
|
|
b66686a869 | ||
|
|
31776a51a7 | ||
|
|
f1b7257e73 | ||
|
|
be7078aa7e | ||
|
|
931aed6d78 | ||
|
|
dc6fe77612 | ||
|
|
b387150d4f | ||
|
|
9b09b13bf9 | ||
|
|
d8693c7afa | ||
|
|
019dd3e478 | ||
|
|
b01a2f5abd | ||
|
|
087a9cdd2e | ||
|
|
b33bf954bb | ||
|
|
f7cdc7da0c | ||
|
|
cf14f84652 | ||
|
|
6289840a74 | ||
|
|
770cccda49 | ||
|
|
aa02c0f15d | ||
|
|
ee137b6ffd | ||
|
|
206ca6040e | ||
|
|
16f5670c83 | ||
|
|
0fc1af7180 | ||
|
|
55714bbcad | ||
|
|
6f144c20cd | ||
|
|
f23bd3818f | ||
|
|
d3ea763d6b | ||
|
|
91222f631f | ||
|
|
aceb344856 | ||
|
|
f11ea8d07e | ||
|
|
a4e3bf848b | ||
|
|
e74c1057a4 | ||
|
|
6cc046c65c | ||
|
|
c97a070e98 | ||
|
|
b4c0bf3322 | ||
|
|
e998cb634e | ||
|
|
c8017a1f42 | ||
|
|
6d84942746 | ||
|
|
818f145b62 | ||
|
|
f92c22ce7e | ||
|
|
69b362b9d2 | ||
|
|
1fe7ca3db8 | ||
|
|
cc32674b0f | ||
|
|
cf16b57f66 | ||
|
|
411163f750 | ||
|
|
7f3da655c0 | ||
|
|
76e786d961 | ||
|
|
7e1f1a725c | ||
|
|
c63a0c2f58 | ||
|
|
04a7e092a9 | ||
|
|
309065bcbf | ||
|
|
20ae3febef | ||
|
|
e95d33031c | ||
|
|
3fd62d0b02 | ||
|
|
dc0ddcfa9f | ||
|
|
7a13b14c15 | ||
|
|
adf0550571 | ||
|
|
ba6259f08a | ||
|
|
d8bb2ad3ae | ||
|
|
afe4a29fd1 | ||
|
|
1203dd639b | ||
|
|
aadad6aa8c | ||
|
|
8ac0440bb3 | ||
|
|
d2fca3b980 | ||
|
|
d6b4019614 | ||
|
|
a6eb951361 | ||
|
|
dce5bdd31d | ||
|
|
0b999bd726 | ||
|
|
774437f7bb | ||
|
|
c0673b8128 | ||
|
|
0bc8a63ccf | ||
|
|
192f4507e3 | ||
|
|
2d22adcd2a | ||
|
|
4c4b92fdd4 | ||
|
|
2a727d1c39 | ||
|
|
35693f5433 | ||
|
|
bf459b4090 | ||
|
|
728f1ce1e3 | ||
|
|
7b8021de02 | ||
|
|
60593cde21 | ||
|
|
f9292d61da | ||
|
|
9388ce6a46 | ||
|
|
cb19475409 | ||
|
|
09b51badd4 | ||
|
|
fddd5fda47 | ||
|
|
5b0a6f05ed | ||
|
|
51f91a27e2 | ||
|
|
09018d1214 | ||
|
|
de12b22c97 | ||
|
|
d1ae7f5fe2 | ||
|
|
201d32f6ae | ||
|
|
6a441b1c6b | ||
|
|
0afa15f2db | ||
|
|
85eb44da02 | ||
|
|
4856c7a61b | ||
|
|
1b4cc933e7 | ||
|
|
d64acb038b | ||
|
|
b5def640ed | ||
|
|
7e35b4c675 | ||
|
|
e5e3066b3d | ||
|
|
e1af21bf88 | ||
|
|
8c9d08e46b | ||
|
|
e4acfb4831 | ||
|
|
a8101c2231 | ||
|
|
a3ce426613 | ||
|
|
161d02cd98 | ||
|
|
101400bea3 | ||
|
|
1ff9fea378 | ||
|
|
3f4538a60e | ||
|
|
142d7c4f3a | ||
|
|
2afe0ebbe9 | ||
|
|
bc71a62199 | ||
|
|
1e85ce4a84 | ||
|
|
39951a5099 | ||
|
|
9cbb6f3125 | ||
|
|
2dbd3e2534 | ||
|
|
f871a51e5b | ||
|
|
6ab3c68ebb | ||
|
|
7243ccd44c | ||
|
|
2a96fa1a2d | ||
|
|
c05620dddb | ||
|
|
917977ae13 | ||
|
|
2b8338f537 | ||
|
|
e75b5e012c | ||
|
|
78e194d8c1 | ||
|
|
c594e07c8c | ||
|
|
a3ed079828 | ||
|
|
976ce16ac2 | ||
|
|
5faeb12a74 | ||
|
|
acc463eb76 | ||
|
|
3b7459ffbc | ||
|
|
cfb19a697a | ||
|
|
ceec43db67 | ||
|
|
229fa39436 | ||
|
|
2496eb22cb | ||
|
|
d0a45bceca | ||
|
|
7180fae453 | ||
|
|
e1a1b5980e | ||
|
|
53d410a6ee | ||
|
|
a56b38694c | ||
|
|
600b60b441 | ||
|
|
aa7208b602 | ||
|
|
0092b3ece6 | ||
|
|
d01c1e867d | ||
|
|
dd3c8dfac8 | ||
|
|
7c9c5a9a76 | ||
|
|
8f9a55c5ca | ||
|
|
ea0b61aa6d | ||
|
|
b94e7159b8 | ||
|
|
2eabca8267 | ||
|
|
afbe434b59 | ||
|
|
2a50799873 | ||
|
|
77727ad500 | ||
|
|
e89f1fe5a8 | ||
|
|
503e7eceb5 | ||
|
|
c15eba8f62 | ||
|
|
e2f83d5106 | ||
|
|
937b5cca12 | ||
|
|
1d438d5d76 | ||
|
|
22a34be21a | ||
|
|
17a492444e | ||
|
|
9a714a903d | ||
|
|
69a99fc97f | ||
|
|
8beb74689c | ||
|
|
6be7da0305 | ||
|
|
8a08fe213c | ||
|
|
205b17aea0 | ||
|
|
864172ea50 | ||
|
|
e01e14075c | ||
|
|
e9596e1bbc | ||
|
|
db9305c230 | ||
|
|
4572d101cf | ||
|
|
41506911c1 | ||
|
|
b722224863 | ||
|
|
b585b8ecd1 | ||
|
|
52e8ae9cb6 | ||
|
|
6d6d0c2d12 | ||
|
|
383640cb7e | ||
|
|
e5ef27dfbf | ||
|
|
96741fc08b | ||
|
|
dc41f495be | ||
|
|
b278d64d0c | ||
|
|
b5e32844f5 | ||
|
|
4179d2e515 | ||
|
|
815ba9d553 | ||
|
|
0d294f49f9 | ||
|
|
a195cfc792 | ||
|
|
d3c9168ebf | ||
|
|
4d153b8d99 | ||
|
|
bf8d224064 | ||
|
|
b7ad2c969a | ||
|
|
d78643160c | ||
|
|
221b38c766 | ||
|
|
e8bd9b21b5 | ||
|
|
c2f0d04a35 | ||
|
|
54ebcd91cb | ||
|
|
07411327b6 | ||
|
|
094ad1a17b | ||
|
|
c362848b86 | ||
|
|
47a8dfbd93 | ||
|
|
73b8443d7b | ||
|
|
48a7929254 | ||
|
|
2c1abf1519 | ||
|
|
e27e066ccc | ||
|
|
621e933f63 | ||
|
|
885974a84e | ||
|
|
b1d1af2153 | ||
|
|
cb94be5b3c | ||
|
|
5a202e96fd | ||
|
|
b80edee225 | ||
|
|
af3e2fc6ce | ||
|
|
795007f3f8 | ||
|
|
ea3c5fa758 | ||
|
|
30acf11055 | ||
|
|
48e653a546 | ||
|
|
a2d8aefb21 | ||
|
|
ae893be79b | ||
|
|
d846811fb9 | ||
|
|
791080107f | ||
|
|
7d22ed1249 | ||
|
|
8150edbc43 | ||
|
|
5acbfeffa5 | ||
|
|
3b763e3460 | ||
|
|
6dd5f4295d | ||
|
|
ac7b0bc9a2 | ||
|
|
1733938eb4 | ||
|
|
e5c9ed4b80 | ||
|
|
175b6747ea | ||
|
|
f45170850c | ||
|
|
466eb65a44 | ||
|
|
bdce0e12c7 | ||
|
|
57f9a0a844 | ||
|
|
988d969de7 | ||
|
|
17960d286f | ||
|
|
26ac68e98e | ||
|
|
0729dd798b | ||
|
|
c65dee1df9 | ||
|
|
92888338f4 | ||
|
|
44192c88f5 | ||
|
|
8d24243d4f | ||
|
|
7c4d4dec5c | ||
|
|
9823677983 | ||
|
|
ec6a5712e5 | ||
|
|
ef85b2109f | ||
|
|
8cfeb2ce7d | ||
|
|
35563373a6 | ||
|
|
f23164a17b | ||
|
|
70033cb0f3 | ||
|
|
da102d3d5a | ||
|
|
5568b43b22 | ||
|
|
52b27b6e56 | ||
|
|
99ec268dd9 | ||
|
|
d304c0919f | ||
|
|
6f3a11ade3 | ||
|
|
52ffa0b675 | ||
|
|
03ee8edda1 | ||
|
|
5da30e6608 | ||
|
|
0fb0af5b32 | ||
|
|
f5fcc57a06 | ||
|
|
6dc3e29535 | ||
|
|
d35db6e925 | ||
|
|
fbf0839c73 | ||
|
|
6f885efb7f | ||
|
|
df5b391f27 | ||
|
|
4a1a3013f4 | ||
|
|
524b965665 | ||
|
|
a3ebe24eb7 | ||
|
|
cae0977a01 | ||
|
|
ecf94d812d | ||
|
|
807a50dae4 | ||
|
|
cf57a3ead0 | ||
|
|
39b2ff4a72 | ||
|
|
eced026aeb | ||
|
|
d574b2796f | ||
|
|
730d09a76c | ||
|
|
b521b39498 | ||
|
|
1cae0503e7 | ||
|
|
e4d3e609f8 | ||
|
|
4c86c1a75a | ||
|
|
2f55055c75 | ||
|
|
3e711ebe7f | ||
|
|
61e634a86c | ||
|
|
afd4aa5d1f | ||
|
|
4b5383f1c7 | ||
|
|
95d91562ec | ||
|
|
a43c351e25 | ||
|
|
77a90256ed | ||
|
|
6393ae7621 | ||
|
|
6b3742fa56 | ||
|
|
492bc044fc | ||
|
|
84ff2f8371 | ||
|
|
54f26ea06e | ||
|
|
e10f3a19d3 | ||
|
|
21a5dbbb52 | ||
|
|
f67d2c5a4c | ||
|
|
6cf83bb381 | ||
|
|
6b9c81e8c4 | ||
|
|
f4decae77f | ||
|
|
e47f0c5166 | ||
|
|
778b65b48c | ||
|
|
d1dbb0b378 | ||
|
|
adfd003532 | ||
|
|
f17302439e | ||
|
|
63d2f5c57d | ||
|
|
478db63b30 | ||
|
|
127588699e | ||
|
|
29c10542b1 | ||
|
|
ab33312872 | ||
|
|
5c9fd471a7 | ||
|
|
dd15c93f51 | ||
|
|
4003ececb2 | ||
|
|
ff3cae9db4 | ||
|
|
af44646a77 | ||
|
|
1345bc8fe6 | ||
|
|
5d3a5a335f | ||
|
|
4d877d411b | ||
|
|
c1154682b5 | ||
|
|
99c4b0acd0 | ||
|
|
80520c075d | ||
|
|
17cf9f006a | ||
|
|
a8034b2fb5 | ||
|
|
7999251353 | ||
|
|
2111af8c0c | ||
|
|
6f7745c46a | ||
|
|
ba42285172 | ||
|
|
dff2d5996b | ||
|
|
08b17daec9 | ||
|
|
a7cf236ba5 | ||
|
|
f22197d494 | ||
|
|
af8af45f39 | ||
|
|
4b112cf9c0 | ||
|
|
733bc89a47 | ||
|
|
17baceb807 | ||
|
|
86487ace10 | ||
|
|
a7422e5bb3 | ||
|
|
b64418c2e9 | ||
|
|
8e895bd797 | ||
|
|
6562f645fe | ||
|
|
80ebf60ec5 | ||
|
|
d569001f32 | ||
|
|
12318b5c31 | ||
|
|
de55106961 | ||
|
|
edca735f2a | ||
|
|
b076de6f81 | ||
|
|
6ddc59bc5b | ||
|
|
ba4a3c16f3 | ||
|
|
de0fb2eba8 |
4
.flake8
@@ -1,4 +0,0 @@
|
||||
[flake8]
|
||||
ignore = E133,E221,E226,E228,E241,W503
|
||||
max-line-length = 99
|
||||
exclude = docs/*
|
||||
99
.github/workflows/build.yml
vendored
@@ -1,99 +0,0 @@
|
||||
name: Build
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
buildAssets:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
architecture: x64
|
||||
|
||||
- name: Install Packages (apt)
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install qttools5-dev-tools latexmk texlive texlive-latex-extra
|
||||
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Packages (pip)
|
||||
run: pip install -r docs/source/requirements.txt
|
||||
|
||||
- name: Build Assets
|
||||
run: python pkgutils.py qtlrelease sample manual
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: |
|
||||
novelwriter/assets/sample.zip
|
||||
novelwriter/assets/manual.pdf
|
||||
novelwriter/assets/i18n/*.qm
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
|
||||
buildLinux:
|
||||
needs: buildAssets
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.11"]
|
||||
linux-tag: ["manylinux_2_24_x86_64", "manylinux_2_28_x86_64"]
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
architecture: x64
|
||||
|
||||
- name: Install Packages (pip)
|
||||
run: pip install python-appimage
|
||||
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: novelwriter/assets
|
||||
|
||||
- name: Build AppImage
|
||||
run: python pkgutils.py build-appimage --linux-tag ${{ matrix.linux-tag }} --python-version ${{ matrix.python-version }}
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: AppImage-${{ matrix.python-version }}-${{ matrix.linux-tag }}
|
||||
path: dist_appimage
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
|
||||
buildMac:
|
||||
needs: buildAssets
|
||||
runs-on: macos-12
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: novelwriter/assets
|
||||
|
||||
- name: Build App Bundle
|
||||
run: ./setup/macos/build.sh
|
||||
|
||||
- name: Upload DMG
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MacOS-DMG
|
||||
path: dist_macos
|
||||
if-no-files-found: error
|
||||
retention-days: 1
|
||||
39
.github/workflows/build_assets.yml
vendored
Normal file
@@ -0,0 +1,39 @@
|
||||
name: BuildAssets
|
||||
|
||||
on: workflow_call
|
||||
|
||||
jobs:
|
||||
buildAssets:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
architecture: x64
|
||||
|
||||
- name: Install Packages (apt)
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install qttools5-dev-tools latexmk texlive texlive-latex-extra
|
||||
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Install Packages (pip)
|
||||
run: pip install -r docs/source/requirements.txt
|
||||
|
||||
- name: Build Assets
|
||||
run: |
|
||||
python pkgutils.py build-assets
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: |
|
||||
novelwriter/assets/manual.pdf
|
||||
novelwriter/assets/sample.zip
|
||||
novelwriter/assets/i18n/*.qm
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
43
.github/workflows/build_linux.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: BuildLinux
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
buildAssets:
|
||||
uses: ./.github/workflows/build_assets.yml
|
||||
|
||||
buildLinux-AppImage:
|
||||
needs: buildAssets
|
||||
runs-on: ubuntu-latest
|
||||
env:
|
||||
PYTHON_VERSION: "3.12"
|
||||
LINUX_TAG: "manylinux_2_28_x86_64"
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
architecture: x64
|
||||
|
||||
- name: Install Packages (pip)
|
||||
run: pip install python-appimage
|
||||
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: novelwriter/assets
|
||||
|
||||
- name: Build AppImage
|
||||
run: python pkgutils.py build-appimage --linux-tag $LINUX_TAG --python-version $PYTHON_VERSION
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Linux-AppImage
|
||||
path: dist_appimage
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
64
.github/workflows/build_mac.yml
vendored
Normal file
@@ -0,0 +1,64 @@
|
||||
name: BuildMacOS
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
buildAssets:
|
||||
uses: ./.github/workflows/build_assets.yml
|
||||
|
||||
buildMac-AMD64:
|
||||
needs: buildAssets
|
||||
# Stay on macos-12 due to https://github.com/create-dmg/create-dmg/issues/143
|
||||
runs-on: macos-12
|
||||
env:
|
||||
PYTHON_VERSION: "3.12"
|
||||
PACKAGE_ARCH: x86_64
|
||||
MINICONDA_ARCH: x86_64
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: novelwriter/assets
|
||||
|
||||
- name: Build App Bundle
|
||||
run: ./setup/macos/build.sh $PYTHON_VERSION $PACKAGE_ARCH $MINICONDA_ARCH
|
||||
|
||||
- name: Upload DMG
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MacOS-AMD64-DMG
|
||||
path: dist_macos
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
|
||||
buildMac-M1:
|
||||
needs: buildAssets
|
||||
runs-on: macos-14
|
||||
env:
|
||||
PYTHON_VERSION: "3.12"
|
||||
PACKAGE_ARCH: aarch64
|
||||
MINICONDA_ARCH: arm64
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: novelwriter/assets
|
||||
|
||||
- name: Build App Bundle
|
||||
run: ./setup/macos/build.sh $PYTHON_VERSION $PACKAGE_ARCH $MINICONDA_ARCH
|
||||
|
||||
- name: Upload DMG
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: MacOS-M1-DMG
|
||||
path: dist_macos
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
37
.github/workflows/build_win.yml
vendored
Normal file
@@ -0,0 +1,37 @@
|
||||
name: BuildWindows
|
||||
|
||||
on: workflow_dispatch
|
||||
|
||||
jobs:
|
||||
buildAssets:
|
||||
uses: ./.github/workflows/build_assets.yml
|
||||
|
||||
buildWin64:
|
||||
needs: buildAssets
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
architecture: x64
|
||||
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Download Artifacts
|
||||
uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: nw-assets
|
||||
path: novelwriter/assets
|
||||
|
||||
- name: Build Setup Installer
|
||||
run: python pkgutils.py build-win-exe
|
||||
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: Win-Setup
|
||||
path: dist/*.exe
|
||||
if-no-files-found: error
|
||||
retention-days: 14
|
||||
32
.github/workflows/i18n.yml
vendored
Normal file
@@ -0,0 +1,32 @@
|
||||
name: i18n
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- i18n/*
|
||||
|
||||
jobs:
|
||||
buildI18n:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
architecture: x64
|
||||
- name: Install Packages (apt)
|
||||
run: |
|
||||
sudo apt update
|
||||
sudo apt install qttools5-dev-tools
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
- name: Build Assets
|
||||
run: python pkgutils.py qtlrelease
|
||||
- name: Upload Artifacts
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: nw-i18n
|
||||
path: |
|
||||
novelwriter/assets/i18n/*.qm
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
8
.github/workflows/syntax.yml
vendored
@@ -4,11 +4,11 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
|
||||
jobs:
|
||||
checkSyntax:
|
||||
@@ -22,9 +22,9 @@ jobs:
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
- name: Install flake8
|
||||
run: pip install flake8 flake8-pep585
|
||||
run: pip install -r requirements-dev.txt
|
||||
- name: Syntax Check
|
||||
run: |
|
||||
flake8 --version
|
||||
flake8 novelwriter --count --show-source --statistics
|
||||
flake8 tests --count --show-source --statistics
|
||||
flake8 tests --count --show-source --statistics --extend-ignore ANN
|
||||
|
||||
17
.github/workflows/test_linux.yml
vendored
@@ -4,17 +4,18 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
|
||||
jobs:
|
||||
testLinux:
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"]
|
||||
python-version: ["3.9", "3.10", "3.11", "3.12"]
|
||||
fail-fast: false
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Python Setup
|
||||
@@ -32,10 +33,14 @@ jobs:
|
||||
run: |
|
||||
pip install -U -r requirements.txt -r tests/requirements.txt
|
||||
- name: Run Build Commands
|
||||
run: python pkgutils.py qtlrelease sample
|
||||
run: |
|
||||
python pkgutils.py qtlrelease
|
||||
python pkgutils.py sample
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --cov=novelwriter --timeout=60
|
||||
python -m pytest -v --cov=novelwriter --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v3
|
||||
uses: codecov/codecov-action@v4
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
14
.github/workflows/test_mac.yml
vendored
@@ -4,20 +4,20 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
|
||||
jobs:
|
||||
testMac:
|
||||
runs-on: macos-latest
|
||||
runs-on: macos-13
|
||||
steps:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
python-version: "3.12"
|
||||
architecture: x64
|
||||
- name: Install Packages (brew)
|
||||
run: |
|
||||
@@ -30,6 +30,8 @@ jobs:
|
||||
- name: Run Tests
|
||||
run: |
|
||||
export QT_QPA_PLATFORM=offscreen
|
||||
pytest -v --cov=novelwriter --timeout=60
|
||||
python -m pytest -v --cov=novelwriter --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v3
|
||||
uses: codecov/codecov-action@v4
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
12
.github/workflows/test_win.yml
vendored
@@ -4,11 +4,11 @@ on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
- dev
|
||||
- release
|
||||
|
||||
jobs:
|
||||
testWin:
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
- name: Python Setup
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
python-version: "3.12"
|
||||
architecture: x64
|
||||
- name: Checkout Source
|
||||
uses: actions/checkout@v4
|
||||
@@ -26,6 +26,8 @@ jobs:
|
||||
pip install -U -r requirements.txt -r tests/requirements.txt
|
||||
- name: Run Tests
|
||||
run: |
|
||||
pytest -v --cov=novelwriter --timeout=60
|
||||
python -m pytest -v --cov=novelwriter --timeout=60
|
||||
- name: Upload to Codecov
|
||||
uses: codecov/codecov-action@v3
|
||||
uses: codecov/codecov-action@v4
|
||||
env:
|
||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||
|
||||
378
CHANGELOG.md
@@ -1,5 +1,383 @@
|
||||
# novelWriter Changelog
|
||||
|
||||
## Version 2.5 [2024-07-10]
|
||||
|
||||
### Release Notes
|
||||
|
||||
The 2.5 release fixes a number of minor issues from the RC 1 pre-release, and updates most
|
||||
translation files. Polish has also been added.
|
||||
|
||||
See the website for complete [Release Notes](https://novelwriter.io/releases/release_2_5.html).
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Fix an issue with unresponsiveness when switching from Outline View to Tree View with a keyboard
|
||||
shortcut. Issue #1949. PR #1954.
|
||||
* Fix an issue with switching focus between editor and viewer when the viewer is hidden.
|
||||
Issue #1950. PR #1954.
|
||||
* Fix an issue with first line indentation where it would sometimes indent first paragraph when it
|
||||
should not. Issue #1965. PR #1971.
|
||||
|
||||
**Usability**
|
||||
|
||||
* Remove the "Apply" button from Preferences as changing theme does not updated the Preferences
|
||||
dialog, which is unexpected behaviour. The Preferences dialog is now also consistent with other
|
||||
settings dialogs. Issue #1951. PR #1954.
|
||||
* Improved the error messages when opening a project fails. Issue #1944. PR #1956.
|
||||
* Make sure the Project Name is selected and in focus when switching to the New Project Form on the
|
||||
Welcome dialog. Issue #1967. PR #1968.
|
||||
|
||||
**Improvements**
|
||||
|
||||
* Add first line indentation to Manuscript previews. Issue #1961. PR #1962.
|
||||
|
||||
**Internationalisation**
|
||||
|
||||
* Norwegian and US English translations updated by @vkbo. PR #1955.
|
||||
* German translation updated by Myian (@HeyMyian). PR #1955.
|
||||
* Italian translation updated by Lou Cyper (loucyper1). PR #1955.
|
||||
* Dutch translation updated by Martijn van der Kleijn (mvdkleijn). PR #1955.
|
||||
* Chinese translation updated by @longqzh. PR #1955.
|
||||
* Portuguese translation updated by Oli Maia. PR #1955.
|
||||
* Japanese translation updated by @hebekeg. PR #1955.
|
||||
* French translation updated by Albert Aribaud (@aaribaud). PR #1955.
|
||||
* Polish translation added by Anna Maria Polak (@Nauthiz). PR #1955.
|
||||
|
||||
**Packaging**
|
||||
|
||||
* Rewrote the packaging utilities script. Windows builds are now created in GitHub actions, which
|
||||
is needed for signed packages when this is enabled. PRs #1958 and #1959.
|
||||
|
||||
**Documentation**
|
||||
|
||||
* Updated the documentation for 2.5. PR #1928.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.5 RC 1 [2024-06-22]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a release candidate of the next release version, and is intended for testing purposes.
|
||||
Please be careful when using this version on live writing projects, and make sure you take frequent
|
||||
backups.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* The Status bar LEDs are now properly updated when the theme changes. Issue #1893. PR #1906.
|
||||
* All HTML tags are now properly closed at the end of each paragraph in HTML output. After
|
||||
shortcodes were introduced, it was possible to leave formatting tags open. Issue #1919. PR #1926.
|
||||
|
||||
**Improvements**
|
||||
|
||||
* Move the first line indent setting from being an Open Document feature to a general build
|
||||
settings feature that also applies to HTML, and make it visible in the Manuscript build tool
|
||||
preview. Issue #1839 and #1858. PR #1898.
|
||||
* Make sure the document in the editor is saved before the same document is opened in the viewer.
|
||||
Issue #1884. PR #1902.
|
||||
* The project name now appears before "novelWriter" in the main window title, which improves the
|
||||
task bar label on at least Linux Mint Cinnamon, and Windows. Issue #1910. PR #1911.
|
||||
* Dialogue highlighting now only applies to novel documents, not notes. It is also possible to
|
||||
apply it to HTML and ODT manuscripts, and it also shows up in the preview and in the document
|
||||
viewer. Issue #1774. PR #1908.
|
||||
* The Welcome dialog and other tools that use the project name to generate files of folder names
|
||||
are now less restrictive on what characters it allows in the file or folder names. Issue #1917.
|
||||
PR #1922.
|
||||
* Last used folder paths are now remembered individually for each tool or feature that requires
|
||||
path input from the user. Issues #1930 and #1933. PR #1934.
|
||||
* The Manuscript preview will now show line height as set in build settings. Issue #1920. PR #1935.
|
||||
* Global search now refreshes if any of the search option buttons are toggled, and the search
|
||||
result will show the complete word if the search term only matches part of a word. Issue #1830.
|
||||
PR #1936.
|
||||
* When a new note is created from a reference tag in the editor, the syntax highlighting is
|
||||
properly updated to indicate the tag is now valid. Issue #1916. PR #1938.
|
||||
* The `Ctrl+E` shortcut now toggles focus between editor and viewer instead of just going to the
|
||||
editor. The header text colour changes to indicate which panel has focus. This should make it
|
||||
easier to scroll the content of the viewer without having to click it with the mouse first.
|
||||
Issue #1387. PRs #1940 and #1941.
|
||||
|
||||
**Code Improvements**
|
||||
|
||||
* Change how dialogs are handled in memory, and drop the calls to deleteLater for the underlying Qt
|
||||
object as it caused problems in some cases. Instead, the dialog is disconnected from the parent
|
||||
object, which seems to let the Python and Qt garbage collectors to kick in.
|
||||
PRs #1899. #1913 and #1921.
|
||||
* Overload the reject call for dialogs rather to call close, which the default implementation does
|
||||
not. This simplifies the logic when closing dialogs, as reject() is also a slot, which close() is
|
||||
not. Issue #1915. PR #1918.
|
||||
* Processing of dialogue highlighting has been added to the Tokenizer class, and the RegEx handling
|
||||
moved to a separate factory class. PR #1908.
|
||||
* The progress bar widgets have been moved to a single module, and test coverage added. PR #1937.
|
||||
|
||||
**Packaging**
|
||||
|
||||
* The Windows installer is now built with Inno Setup 6.3, and uses zip compression rather than
|
||||
lzma. It also properly sets the undelete icon, and the undelete process is better at cleaning up
|
||||
files. PR #1932.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.5 Beta 1 [2024-05-26]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a beta release of the next release version, and is intended for testing purposes. Please be
|
||||
careful when using this version on live writing projects, and make sure you take frequent backups.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**General Changes**
|
||||
|
||||
* novelWriter now requires Python 3.9 and Qt 5.15 as a minimum. That means Ubuntu 20.04 and older
|
||||
are no longer supported for the Debian packages. Users on Ubuntu 20.04 and equivalent Linux
|
||||
distros must use the AppImage. PRs #1826 and #1833.
|
||||
|
||||
**Major Features**
|
||||
|
||||
* Status and Importance icons can now be assigned a shape in addition to a colour. Issue #1786.
|
||||
PRs #1810 and #1819.
|
||||
* Footnotes have been added. They use a modified comment format for specifying the footnote text,
|
||||
and a shortcode for inserting the footnote into the text. They are linked via a key. If the
|
||||
footnote is inserted via the **Insert** menu, a unique key is generated. Issue #342. PR #1832.
|
||||
* Comments in general now support formatting, so format tags work just like in regular text. This
|
||||
was needed for footnotes, but has been expanded to include all comments. PR #1832.
|
||||
* Two new themes have been added. Dracula is available as a set for both the GUI and the editor.
|
||||
Snazzy Light is available for syntax only, but works well with the default light GUI theme.
|
||||
PR #1840.
|
||||
* Character dialogue highlighting has been completely redesigned. The highlighting rule now
|
||||
specifically relates to dialogue, and not just quoted text in general. To that effect, more rules
|
||||
for detecting what is and isn't dialogue has been added. This is designed to support difference
|
||||
between dialogue conventions in different languages. Issues #1770 and #1771. PR #1864.
|
||||
* The font settings in Preferences now considers the full range of font options, in particular font
|
||||
style and weight. The changes include the font size in these settings, so the additional setting
|
||||
for font size has been removed. Use the font dialog to pick size as well. Due to this removal,
|
||||
the font size has been reset to default and must be set again by the user. Issue #1733. PR #1881.
|
||||
* The document viewer and the manuscript preview now uses a completely new class to generate the
|
||||
formatted text. The old method used an outdated HTML format as the go-between, which restricted
|
||||
what formatting could be applied. The main noticeable change to users at the moment should be the
|
||||
size of headings, that now match the size in the editor. Issue #1882. PR #1892.
|
||||
|
||||
**Improvements**
|
||||
|
||||
* The default dark theme has been redesigned to match the GUI theme a little better, and is now
|
||||
also consistent with the default light themes. PRs #1836 and #1840.
|
||||
* Special comments now have a different text colour than plain comments. PR #1836.
|
||||
* The various Tomorrow themes are now a little more consistent in what colours are used for which
|
||||
components. More variation has also been added. PR #1840.
|
||||
* The Tango theme has been updated. PR #1840.
|
||||
* The last cursor position is now always saved when a document is closed in the editor, even if the
|
||||
content has not been changed. PR #1849.
|
||||
* The settings for first line indent have now been extended to allow setting how deep the indents
|
||||
are and whether or not to indent the first paragraph after a heading or break. The settings have
|
||||
also moved from being Open Document specific to the general formatting tab for manuscripts.
|
||||
PR #1857.
|
||||
* Preserving in-paragraph line breaks is now a general Manuscript setting that applies to all
|
||||
output formats. PR #1891.
|
||||
* The Manuscript builds now also uses the full font settings of the selected output font, not just
|
||||
the font family and size option. Since the size option has been merged into the general font
|
||||
choice, the separate font size setting has been dropped and users must set it again. PR #1891.
|
||||
* It is now possible to disable the usage of the font selection dialog from your operating system.
|
||||
At least on Linux Gnome desktops, the system's font dialog lacks a lot of the selection options
|
||||
available in the font dialog provided with Qt. PR #1891.
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Fixed an issue where Manuscript dialogs would be left open if the project was closed. PR #1844.
|
||||
* First line indents are no longer reset after a comment. Issue #1852. PR #1857.
|
||||
|
||||
**Packaging**
|
||||
|
||||
* Minimal zip file release packages can no longer be built from the package utility script. The zip
|
||||
file needed for building the Windows installer is still available. PR #1826.
|
||||
* Added build packages for AARCH64 on MacOS. It seems some dependencies still prevents it from
|
||||
being installed cleanly without requiring some virtualisation feature, but it works. PR #1829.
|
||||
* AppImages are now released with Python 3.12. PR #1829.
|
||||
|
||||
**Other Changes**
|
||||
|
||||
* A new GUI theme setting for error text has been added. It is used when error messages need to be
|
||||
displayed on the GUI. PR #1880.
|
||||
|
||||
**Code Improvements**
|
||||
|
||||
* The behaviour of dialogs across various platforms has been unified and improved a little to
|
||||
ensure more consistent behaviour. It is mostly related to modality and z-order. There are still
|
||||
limitations due to platform restrictions, like non-modal dialogs being stuck on top on Linux
|
||||
Wayland. PR #1844.
|
||||
* Some GUI components have been improved and refactored to rely more on signals and slots rather
|
||||
than reaching into each other's classes and calling methods. This is a little more robust.
|
||||
PR #1849.
|
||||
* The text tokenizer used to parse the formatting codes in novelWriter has been refactored and
|
||||
improved. In particular, multi-line paragraphs are now processed during the second pass of
|
||||
tokenization rather than when the final format is applied. This allows a much more compact format
|
||||
of the token data, and avoid potential inconsistencies between the various output formats.
|
||||
PR #1885.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.4.4 [2024-06-12]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a patch release that fixes a usage issue when setting document label from an unsaved
|
||||
document, fixes a rare chance of a crash when closing the Manuscript tool, and updates the
|
||||
Portuguese translation.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Backported some memory improvements from the upcoming 2.5 release. This also fixes a potential,
|
||||
but low probability crash in the Manuscript tool. If the tool is closed during the milliseconds
|
||||
long window when the clock on the yellow label is updated, the app can crash with a segmentation
|
||||
fault. PRs #1903 and #1905.
|
||||
* Fixed an issue where changing a document's label to match the document heading would suggest the
|
||||
wrong title if the document was open in the editor, but in an unsaved state. An easy condition to
|
||||
encounter when creating a new document and setting the heading first. Issue #1914. PR #1923.
|
||||
|
||||
**Internationalisation**
|
||||
|
||||
* Portuguese translation updated by Oli Maia. PR #1904.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.4.3 [2024-05-20]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a patch release that fixes issues with the document font in the editor, viewer and
|
||||
manuscript preview on some Linux distros, and also fixes a potential crash on Windows when using
|
||||
the spell check dictionary install tool.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Fixed a crash in the dictionaries install tool on Windows if the config folder reported by the
|
||||
third party Enchant spell checker tool didn't already exist prior to adding new dictionaries.
|
||||
The folder is now created when the tool is opened if it doesn't exist. Issue #1874. PR #1876.
|
||||
* Fixed issues when setting a different text font for the editor and viewer, and related issues
|
||||
with the preview in the Manuscript Build tool, on certain platforms. Changing the font and
|
||||
setting non-standard font sizes produced unexpected results when reloading. The issue seems to be
|
||||
related to Qt 5.15.3, but that is not fully confirmed. However, the only place so far where the
|
||||
issue is observed is on Mint 21.3. Issues #1862 and #1875. PR #1877.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.4.2 [2024-05-18]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a patch release that fixes two minor font issues and updates the Dutch and Chinese
|
||||
translations.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Change the preview widget in the Manuscript Build tool to use the document font only for the
|
||||
document itself, not the yellow heading stating the age of the previewed text. PR #1863.
|
||||
* Fixes the syntax highlighter so that it is re-initialised when the document editor is
|
||||
re-initialised, so that changes to document font size regenerates the heading font sizes as well.
|
||||
Issue #1865. PR #1866.
|
||||
|
||||
**Internationalisation**
|
||||
|
||||
* Dutch translation updated by Martijn van der Kleijn (@mvdkleijn). PR #1872.
|
||||
* Chinese translation updated by @longqzh. PR #1872.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.4.1 [2024-05-06]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This is a patch release that fixes a number of minor issues with the Manuscript Build tool. The
|
||||
only critical fix is related to a potential crash when deleting a build entry when its settings
|
||||
dialog is still open.
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Fixed an issue that could crash novelWriter if a build settings entry was deleted from the
|
||||
Manuscript tool while its settings window was open. PR #1845.
|
||||
|
||||
**Improvements**
|
||||
|
||||
* Changed the font used for the document editor and viewer header and footer from the one used for
|
||||
the document text to the one used for the user interface. Issue #1842. PR #1843.
|
||||
* Added a save document step in the editor before running a manuscript build or a preview job. This
|
||||
ensures that the text in the editor is included in the manuscript. Issue #1835. PR #1846.
|
||||
* Restore preview panel scroll bar position after updating the preview on the Manuscript tool.
|
||||
Issue #1837. PR #1846.
|
||||
* Close all non-modal dialogs when a project is closed. PR #1848.
|
||||
|
||||
**Code Improvements**
|
||||
|
||||
* Fixed an issue with the Build Settings dialog that blocks the garbage collector from deleting the
|
||||
dialog after it's been closed. PR #1843.
|
||||
* Remove some deprecated translation entries from the translation files. PR #1850.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.4 [2024-04-20]
|
||||
|
||||
### Release Notes
|
||||
|
||||
This release adds a new global search feature. The tool is still relatively basic, and will likely
|
||||
be extended in later releases.
|
||||
|
||||
Among new text editing features is the ability to highlight text using `[m]text[/m]` shortcodes.
|
||||
The code `[m]` is for "mark", which is the equivalent code in HTML.
|
||||
|
||||
A second feature added for text editing is the ability to add an alternatively formatted scene
|
||||
heading by adding a `!` to the markup, like for chapters and main titles. This allows to
|
||||
distinguish between two scene formatting styles, `### Title` and `###! Title`, which can for
|
||||
instance be used for soft and hard scene breaks.
|
||||
|
||||
The **Manuscript Build** tool has also been extended with multiple new formatting options.
|
||||
|
||||
See the website for complete [Release Notes](https://novelwriter.io/releases/release_2_4.html).
|
||||
|
||||
### Detailed Changelog
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* Fixed background colour on some widgets on the new Project Search tool. PR #1800.
|
||||
* Fixed a bug when using bold/italic/strike through toggle on an existing text selection in the
|
||||
editor. Issue #1807. PR #1808.
|
||||
* An index out of bounds error in the word counter has been fixed. It could only be triggered by a
|
||||
single line only containing a ">" character. Issues #1816 and #1825. PR #1817.
|
||||
* Fixed an issue where not all theme colours were completely reset before changing theme. PR #1820.
|
||||
* Shortcodes are no longer passed to the spell checker. PR #1823.
|
||||
|
||||
**Improvements**
|
||||
|
||||
* Made placeholder text for search read as "Search for" and "Replace with". PR #1799.
|
||||
* The initial count for adding chapter and scenes to new project in the Welcome dialog has been
|
||||
changed to 0. The user must now select to add chapters and scenes. Issue #1811. PR #1815.
|
||||
|
||||
**Documentation**
|
||||
|
||||
* Updated the documentation for 2.4 features. PR #1818.
|
||||
|
||||
**Internationalisation**
|
||||
|
||||
* Norwegian and US English translations updated by Veronica Berglyd Olsen (@vkbo).
|
||||
PRs #1799 and #1814.
|
||||
* Latin American Spanish translation updated by Tommy Marplatt (@tmarplatt). PR #1814.
|
||||
* Italian translation updated by Lou Cyper (loucyper1). PR #1814.
|
||||
* Japanese translation updated by @hebekeg. PR #1814.
|
||||
* French translation updated by Albert Aribaud (@aaribaud). PR #1821.
|
||||
* German translation updated by Myian (@HeyMyian). PR #1821.
|
||||
|
||||
----
|
||||
|
||||
## Version 2.4 RC 1 [2024-04-06]
|
||||
|
||||
### Release Notes
|
||||
|
||||
@@ -1,45 +1,44 @@
|
||||
# Contributing Guide
|
||||
|
||||
When contributing to this repository, please first discuss the change you wish to make via the
|
||||
issue tracker or the discussions page with the owner of this repository. 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.
|
||||
When contributing to this repository, please first discuss the change you wish to make with the
|
||||
owner. Either via the issue tracker or on the discussions page. 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.
|
||||
|
||||
The following contributions are welcome:
|
||||
**The following contributions are welcome:**
|
||||
|
||||
* Bugfixes for new or existing bugs. Please also report new bugs in the issue tracker even if you
|
||||
also provide a fix. It makes it easier to keep track of what has been fixed and when.
|
||||
* Translations via the [crowdin project page](https://crowdin.com/project/novelwriter).
|
||||
* Translations made 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.
|
||||
|
||||
Please do not:
|
||||
**Please do not:**
|
||||
|
||||
* Make a pull request that restructures or reformats existing code. If you think some parts of the
|
||||
* Make a pull request that restructures or reformats existing code. If you think some part 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
|
||||
## Picking the Correct Branch for a Pull Request
|
||||
|
||||
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.
|
||||
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 copy of the `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.
|
||||
As of April 2024, releases are made from the `release` branch. If you are submitting a fix to a
|
||||
current release you must do so from the `release` branch. If you make such a fix on the `main`
|
||||
branch, **it cannot be included in a patch release**. This also applies to the documentation for
|
||||
the latest release published on the main website.
|
||||
|
||||
Also check the following:
|
||||
**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.
|
||||
folder, although it doesn't check everything. The same check is also run on pull requests.
|
||||
* 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
|
||||
* Do not submit files that were not actively changed but have otherwise been modified. This is
|
||||
mostly an issue with translation files. The language tool may update all files in the `i18n`
|
||||
folder.
|
||||
|
||||
@@ -68,14 +67,14 @@ style guide, but with a few exceptions. Some key points are listed below.
|
||||
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.
|
||||
avoided by going to 99, then that is generally preferable.
|
||||
* 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.
|
||||
|
||||
**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 novelWriter source code does too.
|
||||
* The exception to the above is for constants. They should always be in upper snake case, like PEP8
|
||||
states.
|
||||
|
||||
@@ -83,19 +82,29 @@ style guide, but with a few exceptions. Some key points are listed below.
|
||||
|
||||
* 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.
|
||||
* All common line wrapping methods are allowed in the code, but avoid deep indentations.
|
||||
* 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.
|
||||
|
||||
**Type Annotation**
|
||||
|
||||
* All functions must be properly type annotated, and a return type stated in all cases.
|
||||
* Do not use `List`, `Dict`, `Tuple`, etc, annotations that were deprecated in Python 3.9. You can
|
||||
install the `flake8-pep585` extension to make sure you don't forget. This is also checked by the
|
||||
syntax action run on pull requests.
|
||||
* If annotations require a more recent Python version than the minimum version stated in the
|
||||
project's `pyproject.toml`, hide it under an `if TYPE_CHECKING` condition so that the code can
|
||||
still run on older versions. It's OK to require a more recent version for development.
|
||||
|
||||
### 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:
|
||||
The `.flake8` file in the root of this project has the following settings for that matches the
|
||||
required code style:
|
||||
|
||||
```conf
|
||||
[flake8]
|
||||
ignore = E133,E221,E226,E228,E241,W503
|
||||
@@ -115,7 +124,7 @@ command will give you a detailed description of the code lines that do not confo
|
||||
Two of the ignored errors are due to the relaxed restriction on column alignment, these are the
|
||||
E221 and E241 error codes.
|
||||
|
||||
The code E226 is ignored becuse it doesn't actually follow the
|
||||
The code E226 is ignored because 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 `-`.
|
||||
|
||||
59
CREDITS.md
@@ -2,69 +2,74 @@
|
||||
|
||||
## Main Developer
|
||||
|
||||
* Veronica Berglyd Olsen (@vkbo)
|
||||
* Veronica Berglyd Olsen
|
||||
|
||||
## Contributors
|
||||
|
||||
* Concept: Marian Lückhof (@Number042)
|
||||
* Internationalisation: Bruno Meneguello (@bkmeneguello)
|
||||
* Setup and Packaging: Rachel Powers (@Ryex)
|
||||
* Early Concept: Marian Lückhof
|
||||
* Internationalisation: Bruno Meneguello
|
||||
* Setup and Packaging: Rachel Powers
|
||||
|
||||
For other contributions, see the project's [Contributors](https://github.com/vkbo/novelWriter/graphs/contributors) page.
|
||||
|
||||
## Artwork
|
||||
|
||||
The artwork on the Welcome dialog was created by [Louis Durrant](https://louisdurrant.art).
|
||||
The artwork on the Welcome dialog was created by Louis Durrant.
|
||||
|
||||
## Translations
|
||||
|
||||
The default language is English (UK) with English (US) as an option. These are the original
|
||||
translators for the languages currently available:
|
||||
|
||||
* Dutch: Martijn van der Kleijn (@mvdkleijn)
|
||||
* French: Jan Lüdke (@jyhelle)
|
||||
* German: Myian (@heymyian)
|
||||
* Italian: Riccardo Mangili
|
||||
* Japanese: hebekeg (@hebekeg)
|
||||
* Latin American Spanish: Tommy Marplatt (@tmarplatt)
|
||||
* Norwegian: Veronica Berglyd Olsen (@vkbo)
|
||||
* Portuguese: Bruno Meneguello (@bkmeneguello)
|
||||
* Simplified Chinese: Qianzhi Long (@longqzh)
|
||||
* **Dutch:** Martijn van der Kleijn (mvdkleijn)
|
||||
* **French:** Jan Lüdke (jyhelle)
|
||||
* **German:** Myian (HeyMyian)
|
||||
* **Italian:** Riccardo Mangili
|
||||
* **Japanese:** hebekeg
|
||||
* **Latin American Spanish:** Tommy Marplatt (tmarplatt)
|
||||
* **Norwegian:** Veronica Berglyd Olsen (vkbo)
|
||||
* **Polish:** Anna Maria Polak (Nauthiz)
|
||||
* **Portuguese:** Bruno Meneguello (bkmeneguello)
|
||||
* **Simplified Chinese:** Qianzhi Long (longqzh)
|
||||
|
||||
Additional larger translation contributions:
|
||||
|
||||
* French: Albert Aribaud (@aaribaud)
|
||||
* **French:** Albert Aribaud (aaribaud)
|
||||
* **Portuguese:** Oli Maia (olimaia)
|
||||
|
||||
Translations are managed on [Crowdin](https://crowdin.com/project/novelwriter), and more
|
||||
contributions are listed on the project's [Members](https://crowdin.com/project/novelwriter/members) page.
|
||||
contributions are listed on the project's Members page.
|
||||
|
||||
## Libraries
|
||||
|
||||
The following libraries are dependencies of novelWriter:
|
||||
|
||||
* [Qt5](https://www.qt.io) by Qt Company
|
||||
* [PyQt5](https://www.riverbankcomputing.com/software/pyqt) by Riverbank Computing
|
||||
* [Enchant](https://abiword.github.io/enchant) by Dom Lachowicz
|
||||
* [PyEnchant](https://pyenchant.github.io/pyenchant) by Dimitri Merejkowsky
|
||||
* **Qt5** by Qt Company
|
||||
* **PyQt5** by Riverbank Computing
|
||||
* **Enchant** by Dom Lachowicz
|
||||
* **PyEnchant** by Dimitri Merejkowsky
|
||||
|
||||
## Assets
|
||||
|
||||
Some of the assets bundled with novelWriter were adapted from the following sources:
|
||||
|
||||
* [Typicons](https://github.com/stephenhutchings/typicons.font) icons by Stephen Hutchings (CC BY-SA 4.0)
|
||||
* [Tomorrow](https://github.com/chriskempson/base16) syntax themes by Chris Kempson (MIT License)
|
||||
* [Owl](https://github.com/sdras/night-owl-vscode-theme) syntax themes by Sarah Drasner (MIT License)
|
||||
* [Solarized](https://github.com/altercation/solarized) themes by Ethan Schoonover (MIT License)
|
||||
* **Typicons** icons by Stephen Hutchings (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 (MIT License)
|
||||
* **Cyberpunk Night** theme by Anders Lemvigh (CC BY-SA 4.0)
|
||||
* **Dracula** theme by Zeno Rocha (MIT License)
|
||||
* **Snazzy Light** theme by Florian Reuschel (MIT License)
|
||||
|
||||
## Fonts
|
||||
|
||||
The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are
|
||||
used on buttons and icons.
|
||||
|
||||
* Pridi by Cadson Demak (Open Font License, Version 1.1)
|
||||
* Source Sans Pro by Paul D. Hunt (SIL Open Font License)
|
||||
* **Pridi** by Cadson Demak (Open Font License, Version 1.1)
|
||||
* **Source Sans Pro** by Paul D. Hunt (SIL Open Font License)
|
||||
|
||||
## Special Mentions
|
||||
|
||||
Additional thanks to @johnblommers who was an early user and who has provided a lot of very useful
|
||||
Additional thanks to John Blommers who was an early user and who has provided a lot of very useful
|
||||
feedback over the years.
|
||||
|
||||
10
README.md
@@ -31,9 +31,9 @@ documentation.
|
||||
|
||||
## Implementation
|
||||
|
||||
novelWriter is written with Python 3 (3.8+) using Qt5 and PyQt5 (5.10+), and is released on Linux,
|
||||
Windows and macOS. It can in principle run on any Operating System that also supports Qt, PyQt and
|
||||
Python.
|
||||
novelWriter is written with Python 3 (3.9+) using Qt5 and PyQt5 (5.15 only), and is released on
|
||||
Linux, Windows and macOS. It can in principle run on any Operating System that also supports Qt,
|
||||
PyQt and Python.
|
||||
|
||||
## Project Contributions
|
||||
|
||||
@@ -49,6 +49,10 @@ code, please also read the full
|
||||
|
||||
Project credits are available in [CREDITS.md](https://github.com/vkbo/novelWriter/blob/main/CREDITS.md).
|
||||
|
||||
**Note:** As of April 2024 only pre-releases are made from the `main` branch. Full releases are
|
||||
made from the `release` branch. So if you're submitting a fix to a current release, **including
|
||||
changes to documentation**, they must be made to the `release` branch.
|
||||
|
||||
### Translations
|
||||
|
||||
New translations are always welcome. This project uses Crowdin to maintain translations, and you
|
||||
|
||||
|
Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 72 KiB |
|
Before Width: | Height: | Size: 154 KiB After Width: | Height: | Size: 152 KiB |
|
Before Width: | Height: | Size: 128 KiB After Width: | Height: | Size: 103 KiB |
BIN
docs/source/images/fig_manuscript_build_outline.png
Normal file
|
After Width: | Height: | Size: 151 KiB |
|
Before Width: | Height: | Size: 241 KiB After Width: | Height: | Size: 243 KiB |
|
Before Width: | Height: | Size: 137 KiB After Width: | Height: | Size: 135 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 35 KiB |
|
Before Width: | Height: | Size: 147 KiB After Width: | Height: | Size: 185 KiB |
|
Before Width: | Height: | Size: 273 KiB After Width: | Height: | Size: 280 KiB |
|
Before Width: | Height: | Size: 124 KiB After Width: | Height: | Size: 123 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 542 KiB After Width: | Height: | Size: 530 KiB |
|
Before Width: | Height: | Size: 562 KiB |
BIN
docs/source/images/screenshot_light.png
Normal file
|
After Width: | Height: | Size: 540 KiB |
@@ -17,14 +17,12 @@ storage for robustness.
|
||||
:width: 500
|
||||
|
||||
The project storage is suitable for version control software, and also well suited for file
|
||||
synchronisation tools. All text is saved as plain text files with a meta data header. The core
|
||||
project structure is stored in a single project XML file. Other meta data is saved as JSON files.
|
||||
See the :ref:`a_breakdown_storage` section for more details.
|
||||
synchronisation tools. All text is saved as plain text files, and your project data as standard
|
||||
data formats in XML and JSON. See :ref:`a_storage` 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
|
||||
as well. novelWriter can be run directly from the Python source, or installed from packages or with
|
||||
pip. See :ref:`a_started` for more details.
|
||||
Any operating system that has Python 3 and 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 as well.
|
||||
See :ref:`a_started` for more details.
|
||||
|
||||
**Useful Links**
|
||||
|
||||
@@ -53,7 +51,6 @@ pip. See :ref:`a_started` for more details.
|
||||
int_overview
|
||||
int_started
|
||||
int_howto
|
||||
int_customise
|
||||
int_glossary
|
||||
|
||||
.. toctree::
|
||||
@@ -83,6 +80,7 @@ pip. See :ref:`a_started` for more details.
|
||||
:caption: Additional Details
|
||||
:hidden:
|
||||
|
||||
more_customise
|
||||
more_projectformat
|
||||
more_counting
|
||||
|
||||
|
||||
@@ -16,13 +16,21 @@ This is a list of hopefully helpful little tips on how to get the most out of no
|
||||
Managing the Project
|
||||
====================
|
||||
|
||||
.. dropdown:: Create a Project from a Template
|
||||
:animate: fade-in-slide-down
|
||||
|
||||
On the Welcome dialog's **Create New Project** form, you can select to "Prefill Project" from
|
||||
the content of a different project. This feature is most useful if you copy a project you have
|
||||
dedicated to be a template project. If you have a structure and settings you want to use for
|
||||
every new project, this is the best solution.
|
||||
|
||||
.. dropdown:: Merge Multiple Documents Into One
|
||||
:animate: fade-in-slide-down
|
||||
|
||||
If you need to merge a set of documents in your project into a single document, you can achieve
|
||||
this by first making a new folder for just that purpose, and drag all the files you want merged
|
||||
into this folder. Then you can right click the folder, select :guilabel:`Transform` and
|
||||
:guilabel:`Merge Documents in Folder`.
|
||||
If you need to merge a selection of documents in your project into a single document, you can
|
||||
achieve this by first making a new folder for just that purpose, and drag all the documents you
|
||||
want merged into this folder. Then you can right click the folder, select :guilabel:`Transform`
|
||||
and :guilabel:`Merge Documents in Folder`.
|
||||
|
||||
In the dialog that pops up, the documents will be in the same order as in the folder, but you
|
||||
can rearrange them here of you wish. See :ref:`a_ui_tree_split_merge` for more details.
|
||||
@@ -31,12 +39,29 @@ Managing the Project
|
||||
Layout Tricks
|
||||
=============
|
||||
|
||||
.. dropdown:: Align Paragraphs with Line Breaks
|
||||
:animate: fade-in-slide-down
|
||||
|
||||
If you have line breaks in you paragraphs, and also want to apply additional text alignment or
|
||||
indentation, you must apply the alignment tags to the first line.
|
||||
|
||||
For example, this will centre the two lines.
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
>> Line one is centred. <<
|
||||
Line two is also centred.
|
||||
|
||||
This text is not centred, because it is a new paragraph.
|
||||
|
||||
See :ref:`a_fmt_align` for more details.
|
||||
|
||||
.. dropdown:: Create a Simple Table
|
||||
:animate: fade-in-slide-down
|
||||
|
||||
The formatting tools available in novelWriter don't allow for complex structures like tables.
|
||||
However, the editor does render tabs in a similar way that regular word processors do. You can
|
||||
set the width of a tab in :guilabel:`Preferences`.
|
||||
set the width of a tab in **Preferences**.
|
||||
|
||||
The tab key should have the same distance in the editor as in the viewer, so you can align text
|
||||
in columns using the tab key, and it should look the same when viewed next to the editor.
|
||||
@@ -44,6 +69,15 @@ Layout Tricks
|
||||
This is most suitable for your notes, as the result in exported documents cannot be guaranteed
|
||||
to match. Especially if you don't use the same font in your manuscript as in the editor.
|
||||
|
||||
.. dropdown:: Turn Off First Line Indent for a Paragraph
|
||||
:animate: fade-in-slide-down
|
||||
|
||||
If you have first line indent enabled, but have a specific paragraph that you don't want
|
||||
indented, you can disable the indentation by explicitly add text alignment. Aligned paragraphs
|
||||
are not indented. For instance by adding ``<<`` to the end to left-align it,
|
||||
|
||||
See :ref:`a_fmt_align` for more details.
|
||||
|
||||
|
||||
Organising Your Text
|
||||
====================
|
||||
@@ -58,26 +92,19 @@ Organising Your Text
|
||||
such text. Separating chapter and scene files also allows you to make scene files child
|
||||
documents of the chapter.
|
||||
|
||||
.. versionadded:: 2.0
|
||||
|
||||
.. dropdown:: Distinguishing Soft and Hard Scene Breaks
|
||||
:animate: fade-in-slide-down
|
||||
|
||||
Depending on your writing style, you may need to separate between soft and hard scene breaks
|
||||
within chapters. Like for instance if you switch point-of-view character often.
|
||||
|
||||
In such cases you may want to use a scene heading for hard scene breaks and a section heading
|
||||
for soft scene breaks. The :guilabel:`Build Manuscript` tool will let you add separate
|
||||
formatting for the two when you generate your manuscript. You can for instance add the common
|
||||
"``* * *``" for hard breaks and select to hide section breaks, which will just insert an empty
|
||||
paragraph in their place. See :ref:`a_manuscript_settings` for more details.
|
||||
|
||||
Keep in mind that this is not what the section heading is intended for, so the app will not
|
||||
understand the section heading as a scene, but it will be formatted correctly in the manuscript.
|
||||
In such cases you may want to use different scene headings for hard and soft scene breaks. The
|
||||
**Build Manuscript** tool will let you define a different format for scenes using the ``###``
|
||||
and ``###!`` heading codes when you generate your manuscript. You can for instance add the
|
||||
common "``* * *``" for hard breaks and select to soft scene breaks, which will just insert an
|
||||
empty paragraph in their place. See :ref:`a_manuscript_settings` for more details.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
You can now distinguish between soft and hard scene breaks with a modified scene header. See
|
||||
:ref:`a_manuscript_settings_head_hard` for more details.
|
||||
|
||||
|
||||
Other Tools
|
||||
|
||||
@@ -1,51 +1,67 @@
|
||||
.. _a_intro:
|
||||
|
||||
************
|
||||
Key Features
|
||||
************
|
||||
********
|
||||
Overview
|
||||
********
|
||||
|
||||
.. _Snowflake: https://www.advancedfictionwriting.com/articles/snowflake-method/
|
||||
.. _Markdown: https://en.wikipedia.org/wiki/Markdown
|
||||
|
||||
At its 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 also allows for some extended formatting codes
|
||||
using a shortcode format. See :ref:`a_fmt_shortcodes` for more details.
|
||||
At its core, novelWriter is a multi-document plain text editor. The idea is to let you edit your
|
||||
text without having to deal with formatting until you generate a draft document or manuscript.
|
||||
Instead, you can focus on the writing right from the start.
|
||||
|
||||
Of course, you probably need *some* formatting for your text. At the very least you need emphasis.
|
||||
Most people are familiar with adding emphasis using ``_underscores_`` and ``**asterisks**``. This
|
||||
formatting standard comes from Markdown_ and is supported by novelWriter. It also uses Markdown
|
||||
formatting for defining document headings. If you need more specialised formatting, additional
|
||||
formatting options are available using a shortcode format. See :ref:`a_fmt_shortcodes` for more
|
||||
details.
|
||||
|
||||
.. admonition:: Limitations
|
||||
|
||||
novelWriter is designed for writing fiction, so the formatting features available are limited to
|
||||
those relevant for this purpose. It is **not** suitable for technical writing, and it is **not**
|
||||
a full-featured Markdown editor.
|
||||
those relevant for this purpose. It is *not* suitable for technical writing, and it is *not* a
|
||||
full-featured Markdown editor.
|
||||
|
||||
It is also not intended as a tool to organise research for writing, and therefore lacks
|
||||
It is also not intended as a tool for organising research for writing, and therefore lacks
|
||||
formatting features you may need for this purpose. The notes feature in novelWriter is mainly
|
||||
intended for character profiles and plot outlines.
|
||||
|
||||
Your novel project is organised as a collection of separate plain text documents instead of a
|
||||
single, large document. The idea is to make it easier to reorganise your project structure without
|
||||
having to cut and paste text between chapters.
|
||||
Your novel project in novelWriter is organised as a collection of separate plain text documents
|
||||
instead of a single, large document. The idea is to make it easier to reorganise your project
|
||||
structure without having to cut and paste text between chapters and scenes.
|
||||
|
||||
There are two kinds of documents in your project: :term:`Novel Documents` are documents that are
|
||||
part of your story. The other kind of documents are :term:`Project Notes`. These are intended for
|
||||
part of your story. The other kind of documents are :term:`Project Notes`, which are intended for
|
||||
your notes about your characters, your world building, and so on.
|
||||
|
||||
You can at any point split the individual documents by their headings up into multiple documents,
|
||||
or merge multiple documents into single documents. This makes it easier to use variations of the
|
||||
or merge multiple documents into a single document. This makes it easier to use variations of the
|
||||
Snowflake_ method for writing. You can start by writing larger structure-focused documents, like
|
||||
one per act for instance, and later effortlessly split these up into chapters or scenes.
|
||||
for instance one document per act, and later effortlessly split these up into chapters or scenes.
|
||||
|
||||
|
||||
.. _a_intro_features:
|
||||
|
||||
Key Features
|
||||
============
|
||||
|
||||
Below are some key features of novelWriter.
|
||||
|
||||
**Focus on writing**
|
||||
The aim of the user interface is to let you focus on writing instead of spending time formatting
|
||||
text. Formatting is therefore limited to a small set of formatting tags for simple things like
|
||||
text emphasis and paragraph alignment. When you really want to focus on just writing, you can
|
||||
switch the editor into :guilabel:`Focus Mode` where only the text editor panel itself is
|
||||
visible, and the project structure view is hidden away.
|
||||
text emphasis and paragraph alignment. Additional shortcodes are available for special
|
||||
formatting cases.
|
||||
|
||||
When you really want to focus on just writing, you can switch the editor into **Focus Mode**
|
||||
where only the text editor panel itself is visible, and the project structure view is hidden
|
||||
away.
|
||||
|
||||
**Keep an eye on your notes**
|
||||
The main window can optionally show a document viewer to the right of the editor. This view
|
||||
panel is intended for displaying another scene document, your character notes, plot notes, or any
|
||||
The main window can optionally show a document viewer to the right of the editor. The viewer
|
||||
is intended for displaying another scene document, your character notes, plot notes, or any
|
||||
other document you may need to reference while writing. It is not intended as a preview panel
|
||||
for the document you're editing, but if you wish, you can also use it for this purpose.
|
||||
|
||||
@@ -58,36 +74,42 @@ Below are some key features of novelWriter.
|
||||
later split them into multiple documents based on chapter and scene headings.
|
||||
|
||||
**Multi-novel project support**
|
||||
You can have multiple Novel type root folders in a project. This allows you to keep a series of
|
||||
individual novels with the same characters and world building in the same project, and create
|
||||
manuscripts for them individually.
|
||||
The main parts of your project is split up into top level special folders called "Root" folders.
|
||||
Your main story text lives in the "Novel" root folder. You can have multiple such folders in a
|
||||
project, and rename them to whatever you want. This allows you to keep a series of individual
|
||||
novels with the same characters and world building in the same project, and create manuscripts
|
||||
for them individually.
|
||||
|
||||
**Keep track of your story elements**
|
||||
All notes in your project can be assigned a :term:`tag` that you can :term:`reference` from any
|
||||
other document or note. In fact, you can add a new tag under each heading of a note if you need
|
||||
to be able to reference specific sections of it.
|
||||
All notes in your project can be assigned a :term:`tag` that you can then :term:`reference` from
|
||||
any other document or note. In fact, you can add a new tag under each heading of a note if you
|
||||
need to be able to reference specific sections of it, or you want to keep several topics in the
|
||||
same note.
|
||||
|
||||
**Get an overview of your story**
|
||||
In the :guilabel:`Outline View` on the main window you can see an outline of all the chapters,
|
||||
scenes, and sections of your project. If they have any references in them, these are listed in
|
||||
additional columns. You can also add a synopsis to each chapter or scene, which can be listed
|
||||
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 an
|
||||
alternative view to the project tree.
|
||||
It is not the documents themselves that define the chapters and scenes of your story, but the
|
||||
headings that separate them. In the **Outline View** on the main window you can see an outline
|
||||
of all the chapter and scene headings of each novel root folder in your project. If they have
|
||||
any references in them, like which character is in what chapter and scene, these are listed in
|
||||
additional columns.
|
||||
|
||||
You can also add a synopsis to each chapter or scene, 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 **Novel View** as an alternative view to the project tree.
|
||||
|
||||
**Get an overview of your story elements**
|
||||
Under the document viewer panel you will find a series of tabs that shows the different story
|
||||
elements you have created tags for. The tabs are sorted into Characters, Plots, etc, depending
|
||||
on which categories you are using in your story. This panel can be hidden to free up space when
|
||||
you don't need it.
|
||||
Under the document viewer panel you will find a series of tabs that show the different story
|
||||
elements you have created tags for. The tabs are sorted into **Characters**, **Plots**, etc,
|
||||
depending on which categories you are using in your story. This panel can be hidden to free up
|
||||
space when you don't need it.
|
||||
|
||||
**Assembling your manuscript**
|
||||
Whether you want to assemble a manuscript, or export all your notes, or generate an outline of
|
||||
your chapters and scenes with a synopsis, you can use the :guilabel:`Build Manuscript` tool to
|
||||
your chapters and scenes with a synopsis included, you can use the **Build Manuscript** tool to
|
||||
do so. 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.
|
||||
and how it is formatted. You can send the result to a printer or PDF, or generate 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:
|
||||
@@ -95,7 +117,7 @@ Below are some key features of novelWriter.
|
||||
Screenshots
|
||||
===========
|
||||
|
||||
.. figure:: images/screenshot_default.png
|
||||
.. figure:: images/screenshot_light.png
|
||||
:class: dark-light
|
||||
|
||||
novelWriter with light colour theme
|
||||
|
||||
@@ -1,28 +1,22 @@
|
||||
.. _a_overview:
|
||||
.. _a_reading:
|
||||
|
||||
********
|
||||
Overview
|
||||
********
|
||||
******************
|
||||
What to Read First
|
||||
******************
|
||||
|
||||
.. only:: html
|
||||
The documentation of novelWriter is quite extensive. There are a lot of features to get used to,
|
||||
but you don't need all of them to get started.
|
||||
|
||||
.. image:: images/python_powered.png
|
||||
:align: right
|
||||
:width: 220
|
||||
The chapters below labelled "Essential Information" are the ones you need to know to use the
|
||||
application correctly. By "correctly", it is meant: in a way so novelWriter understands the basic
|
||||
structure of your text. It collects a lot of information from your text and uses it to display the
|
||||
structure of it in various ways to help you get an overview of your writing.
|
||||
|
||||
novelWriter is built as a cross-platform application using `Python 3 <https://www.python.org/>`_ as
|
||||
the programming language, and `Qt 5 <https://www.qt.io/>`_ framework for the user interface.
|
||||
The chapters labelled "Recommended Reading" includes additional information on how the different
|
||||
parts if the application work and what the features do.
|
||||
|
||||
novelWriter is built for Linux first, so this is where it works best. However, it also runs fine
|
||||
on Windows and MacOS due to the cross-platform framework it's built on. The author of the
|
||||
application doesn't own a Mac, so on-going Mac support is dependent on user feedback and user
|
||||
contributions.
|
||||
|
||||
Spell checking in novelWriter is provided by a third party library called
|
||||
`Enchant <https://abiword.github.io/enchant/>`_. Please see the section on :ref:`a_custom_dict` for
|
||||
how to install spell checking languages.
|
||||
|
||||
For install instructions for novelWriter, see :ref:`a_started`.
|
||||
The "Optional" and "Lookup" chapters contain additional information or lookup tables that are not
|
||||
essential for using the application.
|
||||
|
||||
|
||||
Using novelWriter
|
||||
@@ -82,8 +76,8 @@ meta data for it to extract.
|
||||
the application interface.
|
||||
|
||||
:ref:`a_manuscript` - Recommended Reading
|
||||
This chapter explains how the :guilabel:`Manuscript Build` tool works, how you can control the
|
||||
way chapter titles are formatted, and how scene and section breaks are handled.
|
||||
This chapter explains how the **Manuscript Build** tool works, how you can control the way
|
||||
chapter titles are formatted, and how scene and section breaks are handled.
|
||||
|
||||
|
||||
Additional Details & Technical Topics
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
.. _a_started:
|
||||
|
||||
***************
|
||||
Getting Started
|
||||
***************
|
||||
**********************
|
||||
Setup and Installation
|
||||
**********************
|
||||
|
||||
.. _Enchant: https://abiword.github.io/enchant/
|
||||
.. _GitHub: https://github.com/vkbo/novelWriter
|
||||
@@ -15,8 +15,8 @@ Getting Started
|
||||
.. _AppImage: https://appimage.org/
|
||||
|
||||
Ready-made packages and installers for novelWriter are available for all major platforms, including
|
||||
Linux, Windows and MacOS, from the `Downloads page`_. See below for install instructions for each
|
||||
platform.
|
||||
Linux, Windows and MacOS, from the `Downloads page`_. See below for install additional instructions
|
||||
for each platform.
|
||||
|
||||
You can also install novelWriter from the Python Package Index (PyPi_). See :ref:`a_started_pip`.
|
||||
Installing from PyPi does not set up icon launchers, so you will either have to do this yourself,
|
||||
@@ -44,7 +44,7 @@ multiple installations has been known to cause problems.
|
||||
The novelWriter installer is not signed because Microsoft doesn't currently provide a way for
|
||||
non-profit open source projects to properly sign their installers. The novelWriter project
|
||||
doesn't have the funding to pay for commercial software signing certificates. You will therefore
|
||||
see an additional warning about this when you download the installer.
|
||||
see an additional warning about this when you download and run the installer.
|
||||
|
||||
|
||||
.. _a_started_linux:
|
||||
@@ -56,6 +56,7 @@ A Debian package can be downloaded from the `Downloads page`_, or from the Relea
|
||||
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.
|
||||
The Launchpad packages `are signed by the author <https://launchpad.net/~vkbo>`__.
|
||||
|
||||
|
||||
Ubuntu
|
||||
|
||||
@@ -8,8 +8,8 @@ This is an overview of how words and other counts of your text are performed. Th
|
||||
should be relatively standard, and are compared to Libre Office Writer rules.
|
||||
|
||||
The counts provided in the app on the raw text is meant to be approximate. For more accurate
|
||||
counts, you need to build your manuscript in the :guilabel:`Manuscript Tool` and check the counts
|
||||
on the generated preview.
|
||||
counts, you need to build your manuscript in the **Manuscript Tool** and check the counts on the
|
||||
generated preview.
|
||||
|
||||
|
||||
Text Word Counts and Stats
|
||||
@@ -31,11 +31,11 @@ After the above preparation of the text, the following counts are available.
|
||||
**Character Count**
|
||||
The character count is the sum of characters per line, including leading and in-text white space
|
||||
characters, but excluding trailing white space characters. Shortcodes in the text are not
|
||||
included, but Markdown codes are. Only headers and text are counted.
|
||||
included, but Markdown codes are. Only headings and text are counted.
|
||||
|
||||
**Word Count**
|
||||
The words count is the sum of blocks of continuous character per line separated by any number of
|
||||
white space characters or dashes. Only headers and text are counted.
|
||||
white space characters or dashes. Only headings and text are counted.
|
||||
|
||||
**Paragraph Count**
|
||||
The paragraph count is the number of text blocks separated by one or more empty line. A line
|
||||
@@ -45,10 +45,10 @@ After the above preparation of the text, the following counts are available.
|
||||
Manuscript Counts
|
||||
=================
|
||||
|
||||
These are the rules for the counts available for a manuscript in the :guilabel:`Manuscript Tool`.
|
||||
The rules have been tuned to agree with LibreOffice Writer, but will vary slightly depending on the
|
||||
content of your text. LibreOffice Writer also counts the text in the page header, which the
|
||||
Manuscript Tool does not.
|
||||
These are the rules for the counts available for a manuscript in the **Manuscript Tool**. The rules
|
||||
have been tuned to agree with LibreOffice Writer, but will vary slightly depending on the content
|
||||
of your text. LibreOffice Writer also counts the text in the page header, which the **Manuscript
|
||||
Tool** does not.
|
||||
|
||||
The content of each line is counted after all formatting has been processed, so the result will be
|
||||
more accurate than the counts for text documents elsewhere in the app. The following rules apply:
|
||||
@@ -63,36 +63,36 @@ more accurate than the counts for text documents elsewhere in the app. The follo
|
||||
|
||||
The following counts are available:
|
||||
|
||||
**Header Count**
|
||||
The number of headers in the manuscript.
|
||||
**Headings**
|
||||
The number of headings in the manuscript.
|
||||
|
||||
**Paragraph Count**
|
||||
**Paragraphs**
|
||||
The number of body text paragraphs in the manuscript.
|
||||
|
||||
**Total Word Count**
|
||||
**Words**
|
||||
The number of words in the manuscript, including any comments and meta data text.
|
||||
|
||||
**Text Word Count**
|
||||
**Words in Text**
|
||||
The number of words in body text paragraphs, excluding all other text.
|
||||
|
||||
**Header Word Count**
|
||||
The number of words in headers, including inserted formatting like chapter numbers, etc.
|
||||
**Words in Headings**
|
||||
The number of words in headings, including inserted formatting like chapter numbers, etc.
|
||||
|
||||
**Total Character Count**
|
||||
The number of characters on all lines, including any comments and meta data text. Paragraph
|
||||
**Characters**
|
||||
The number of characters in all lines, including any comments and meta data text. Paragraph
|
||||
breaks are not counted, but in-paragraph hard line breaks are.
|
||||
|
||||
**Text Character Count**
|
||||
**Character in Text**
|
||||
The number of characters in body text paragraphs. Paragraph breaks are not counted, but
|
||||
in-paragraph hard line breaks are.
|
||||
|
||||
**Header Character Count**
|
||||
**Characters in Headings**
|
||||
The number of characters in headings.
|
||||
|
||||
**Text Words Character Count**
|
||||
**Character in Text, No Spaces**
|
||||
The number of characters in body text paragraphs considered part of a word or punctuation. That
|
||||
is, white space characters are not counted.
|
||||
|
||||
**Header Words Character Count**
|
||||
The number of characters in headers considered part of a word or punctuation. That is, white
|
||||
**Character in Headings, No Spaces**
|
||||
The number of characters in headings considered part of a word or punctuation. That is, white
|
||||
space characters are not counted.
|
||||
|
||||
@@ -34,10 +34,10 @@ and add dictionaries yourself.
|
||||
|
||||
**Install Tool**
|
||||
|
||||
A small tool to assist with this can be found under :guilabel:`Tools > Add Dictionaries`. It will
|
||||
import spell checking dictionaries from Free Office or Libre Office extensions. The dictionaries
|
||||
are then installed in the install location for the Enchant library and should thus work for any
|
||||
application that uses Enchant for spell checking.
|
||||
A small tool to assist with this can be found under **Tools > Add Dictionaries**. It will import
|
||||
spell checking dictionaries from Free Office or Libre Office extensions. The dictionaries are then
|
||||
installed in the install location for the Enchant library and should thus work for any application
|
||||
that uses Enchant for spell checking.
|
||||
|
||||
**Manual Install**
|
||||
|
||||
@@ -81,14 +81,14 @@ modify it as you like.
|
||||
`novelwriter/assets/icons <https://github.com/vkbo/novelWriter/tree/main/novelwriter/assets/icons>`_.
|
||||
|
||||
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`.
|
||||
file, otherwise you may not be able to distinguish them in **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, just ``themes`` for GUI themes, and ``icons`` for icon 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
|
||||
Once the files are copied there, they should show up in **Preferences** with the label you
|
||||
set as ``name`` inside the file.
|
||||
|
||||
.. versionadded:: 2.0
|
||||
@@ -131,9 +131,12 @@ A GUI theme ``.conf`` file consists of the following settings:
|
||||
linkvisited = 100, 100, 100
|
||||
|
||||
[GUI]
|
||||
statusnone = 100, 100, 100
|
||||
statussaved = 100, 100, 100
|
||||
statusunsaved = 100, 100, 100
|
||||
helptext = 0, 0, 0
|
||||
fadedtext = 128, 128, 128
|
||||
errortext = 255, 0, 0
|
||||
statusnone = 120, 120, 120
|
||||
statussaved = 2, 133, 37
|
||||
statusunsaved = 200, 15, 39
|
||||
|
||||
In the Main section you must at least define the ``name`` and ``icontheme`` settings. The
|
||||
``icontheme`` settings should correspond to one of the internal icon themes, either
|
||||
@@ -143,7 +146,11 @@ setting must match the icon theme's folder name.
|
||||
The Palette values correspond to the Qt enum values for ``QPalette::ColorRole``, see the
|
||||
`Qt documentation <https://doc.qt.io/qt-5.15/qpalette.html#ColorRole-enum>`_ for more details. The
|
||||
colour values are RGB numbers on the format ``r, g, b`` where each is an integer from ``0`` to
|
||||
``255``. Omitted values are not loaded and will use default values.
|
||||
``255``. Omitted values are not loaded and will use default values. If the ``helptext`` colour is
|
||||
not defined, it is computed as a colour between the ``window`` and ``windowtext`` colour.
|
||||
|
||||
.. versionadded:: 2.5
|
||||
The ``fadedtext`` and ``errortext`` theme colour entries were added.
|
||||
|
||||
|
||||
Custom Syntax Theme
|
||||
@@ -168,12 +175,13 @@ A syntax theme ``.conf`` file consists of the following settings:
|
||||
headertext = 0, 0, 0
|
||||
headertag = 0, 0, 0
|
||||
emphasis = 0, 0, 0
|
||||
straightquotes = 0, 0, 0
|
||||
doublequotes = 0, 0, 0
|
||||
singlequotes = 0, 0, 0
|
||||
dialog = 0, 0, 0
|
||||
altdialog = 0, 0, 0
|
||||
note = 0, 0, 0
|
||||
hidden = 0, 0, 0
|
||||
shortcode = 0, 0, 0
|
||||
keyword = 0, 0, 0
|
||||
tag = 0, 0, 0
|
||||
value = 0, 0, 0
|
||||
optional = 0, 0, 0
|
||||
spellcheckline = 0, 0, 0
|
||||
@@ -190,10 +198,14 @@ Omitted syntax colours default to black, except ``background`` which defaults to
|
||||
``texthighlight`` which defaults to white with half transparency.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
The `shortcode` syntax colour entry was added.
|
||||
The ``shortcode`` syntax colour entry was added.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
The `optional` syntax colour entry was added.
|
||||
The ``optional`` syntax colour entry was added.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
The `texthighlight` syntax colour entry was added.
|
||||
The ``texthighlight`` syntax colour entry was added.
|
||||
|
||||
.. versionadded:: 2.5
|
||||
The ``dialog``, ``altdialog``, ``note`` and ``tag`` syntax colour entries were added.
|
||||
``straightquotes``, ``doublequotes`` and ``singlequotes`` were removed.
|
||||
@@ -4,9 +4,11 @@
|
||||
Building the Manuscript
|
||||
***********************
|
||||
|
||||
.. _Pandoc: https://pandoc.org/
|
||||
|
||||
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:`Manuscript Build` tool.
|
||||
You can activate it from the sidebar, the :guilabel:`Tools` menu, or by pressing :kbd:`F5`.
|
||||
from the text in your project. All of this is handled by the **Manuscript Build** tool. You can
|
||||
activate it from the sidebar, the **Tools** menu, or by pressing :kbd:`F5`.
|
||||
|
||||
.. versionadded:: 2.1
|
||||
This tool is new for version 2.1. A simpler tool was used for earlier versions. The simpler tool
|
||||
@@ -20,40 +22,60 @@ The Manuscript Build Tool
|
||||
=========================
|
||||
|
||||
.. figure:: images/fig_manuscript_build.png
|
||||
:width: 80%
|
||||
|
||||
The :guilabel:`Manuscript Build` tool main window.
|
||||
The **Manuscript Build** tool main window.
|
||||
|
||||
The main window of the :guilabel:`Manuscript Build` tool contains a list of all the builds you have
|
||||
The main window of the **Manuscript Build** tool contains a list of all the builds you have
|
||||
defined, a selection of settings, and a few buttons to generate preview, open the print dialog, or
|
||||
run the build to create a manuscript document.
|
||||
|
||||
|
||||
Outline and Word Counts
|
||||
-----------------------
|
||||
|
||||
.. figure:: images/fig_manuscript_build_outline.png
|
||||
:width: 80%
|
||||
|
||||
The **Manuscript Build** tool main window with the **Outline** visible.
|
||||
|
||||
The **Outline** tab on the left lets you navigate the headings in the preview document. It will
|
||||
show up to scene level headings for novel documents, and level 2 headings for notes.
|
||||
|
||||
A collapsible panel of word and character counts are also available below the preview document.
|
||||
These are calculated from the text you have included in the document, and are more accurate counts
|
||||
than what's available in the project tree since they are counted *after formatting*.
|
||||
|
||||
For a detailed description on how they are counted, see :ref:`a_counting`.
|
||||
|
||||
|
||||
.. _a_manuscript_settings:
|
||||
|
||||
Build Settings
|
||||
==============
|
||||
|
||||
Each build definition can be edited by opening it in the :guilabel:`Manuscript Build Settings`
|
||||
dialog, either by double-clicking or by selecting it and pressing the edit button in the toolbar.
|
||||
Each build definition can be edited by opening it in the **Manuscript Build Settings** dialog,
|
||||
either by double-clicking or by selecting it and pressing the edit button in the toolbar.
|
||||
|
||||
.. tip::
|
||||
You can keep the :guilabel:`Manuscript Build Settings` dialog open while testing the different
|
||||
options, and just hit the :guilabel:`Apply` button. You can test the result of your settings
|
||||
by pressing the :guilabel:`Preview` button in the main :guilabel:`Manuscript Build` window.
|
||||
When you're happy with the result, you can close the settings.
|
||||
You can keep the **Manuscript Build Settings** dialog open while testing the different options,
|
||||
and just hit the :guilabel:`Apply` button. You can test the result of your settings by pressing
|
||||
the :guilabel:`Preview` button in the main **Manuscript Build** window. When you're happy with
|
||||
the result, you can close the settings.
|
||||
|
||||
|
||||
Document Selection
|
||||
------------------
|
||||
|
||||
.. figure:: images/fig_build_settings_selections.png
|
||||
:width: 80%
|
||||
|
||||
The :guilabel:`Selections` page of the :guilabel:`Manuscript Build Settings` dialog.
|
||||
The **Selections** page of the **Manuscript Build Settings** dialog.
|
||||
|
||||
The :guilabel:`Selections` page of the :guilabel:`Manuscript Build Settings` dialog allows you to
|
||||
fine tune which documents are included in the build. They are indicated by a green arrow icon in
|
||||
the last column. On the right you have some filter options for selecting content of a specific
|
||||
type, and a set of switches for which root folders to include.
|
||||
The **Selections** page of the **Manuscript Build Settings** dialog allows you to fine tune which
|
||||
documents are included in the build. They are indicated by a green arrow icon in the last column.
|
||||
On the right you have some filter options for selecting content of a specific type, and a set of
|
||||
switches for which root folders to include.
|
||||
|
||||
You can override the result of these filters by marking one or more documents and selecting to
|
||||
explicitly include or exclude them by using the buttons below the tree view. The last button can be
|
||||
@@ -69,13 +91,14 @@ Formatting Headings
|
||||
-------------------
|
||||
|
||||
.. figure:: images/fig_build_settings_headings.png
|
||||
:width: 80%
|
||||
|
||||
The :guilabel:`Headings` page of the :guilabel:`Manuscript Build Settings` dialog.
|
||||
The **Headings** page of the **Manuscript Build Settings** dialog.
|
||||
|
||||
The :guilabel:`Headings` page of the :guilabel:`Manuscript Build Settings` dialog allows you to set
|
||||
how the headings in your :term:`Novel Documents` are formatted. By default, the title is just
|
||||
copied as-is, indicated by the ``{Title}`` format. You can change this to for instance add chapter
|
||||
numbers and scene numbers, or insert character names, like shown in the figure above.
|
||||
The **Headings** page of the **Manuscript Build Settings** dialog allows you to set how the
|
||||
headings in your :term:`Novel Documents` are formatted. By default, the title is just copied as-is,
|
||||
indicated by the ``{Title}`` format. You can change this to for instance add chapter numbers and
|
||||
scene numbers, or insert character names, like shown in the figure above.
|
||||
|
||||
Clicking the edit button next to a format will copy the formatting string into the edit box where
|
||||
it can be modified, and where a syntax highlighter will help indicate which parts are automatically
|
||||
@@ -86,7 +109,7 @@ Any text you add that isn't highlighted in colours will remain in your formatted
|
||||
``{Title}`` will always be replaced by the text in the heading from your documents.
|
||||
|
||||
You can preview the result of these format strings by clicking :guilabel:`Apply`, and then clicking
|
||||
:guilabel:`Preview` in the :guilabel:`Manuscript Build` tool main window.
|
||||
:guilabel:`Preview` in the **Manuscript Build** tool main window.
|
||||
|
||||
|
||||
Scene Separators
|
||||
@@ -107,10 +130,9 @@ be treated as a separator.
|
||||
Hard and Soft Scenes
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
If you wish to distinguish between so-called soft and hard scene breaks, where a hard scene break
|
||||
is understood as a scene break that changes point-of-view character, you can use the modified scene
|
||||
heading format in your text. You can then give these headings a different formatting in the
|
||||
:guilabel:`Headings` settings.
|
||||
If you wish to distinguish between so-called soft and hard scene breaks, you can use the
|
||||
alternative scene heading format in your text. You can then give these headings a different
|
||||
formatting in the **Headings** settings.
|
||||
|
||||
See :ref:`a_fmt_head` for more info on how to format headings in your text.
|
||||
|
||||
@@ -118,10 +140,9 @@ See :ref:`a_fmt_head` for more info on how to format headings in your text.
|
||||
Output Settings
|
||||
---------------
|
||||
|
||||
The :guilabel:`Content`, :guilabel:`Format` and :guilabel:`Output` pages of the
|
||||
:guilabel:`Manuscript Build Settings` dialog control a number of other settings for the output.
|
||||
Some of these only apply to specific output formats, which is indicated by the section headings on
|
||||
the settings pages.
|
||||
The **Content**, **Format** and **Output** pages of the **Manuscript Build Settings** dialog
|
||||
control a number of other settings for the output. Some of these only apply to specific output
|
||||
formats, which is indicated by the section headings on the settings pages.
|
||||
|
||||
|
||||
.. _a_manuscript_build:
|
||||
@@ -130,12 +151,13 @@ Building Manuscript Documents
|
||||
=============================
|
||||
|
||||
.. figure:: images/fig_build_build.png
|
||||
:width: 80%
|
||||
|
||||
The :guilabel:`Manuscript Build` dialog used for writing the actual manuscript documents.
|
||||
The **Manuscript Build** dialog used for writing the actual manuscript documents.
|
||||
|
||||
When you press the :guilabel:`Build` button on the :guilabel:`Build Manuscript` tool main window, a
|
||||
special file dialog opens up. This is where you pick your desired output format and where to write
|
||||
the file.
|
||||
When you press the :guilabel:`Build` button on the **Build Manuscript** tool main window, a special
|
||||
file dialog opens up. This is where you pick your desired output format and where to write the
|
||||
file.
|
||||
|
||||
On the left side of the dialog is a list of all the available file formats, and on the right, a
|
||||
list of the documents which are included based on the build definition you selected. You can choose
|
||||
@@ -157,7 +179,7 @@ Open Document Format
|
||||
|
||||
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
|
||||
is suitable for further processing by document conversion tools like Pandoc_, for importing in
|
||||
word processors, or for printing from browser.
|
||||
|
||||
novelWriter Markup
|
||||
@@ -198,4 +220,4 @@ on the print dialog.
|
||||
|
||||
.. note::
|
||||
The paper format should in all cases default to whatever your system default is. If you want to
|
||||
change it, you have to select it from the :guilabel:`Print Preview` dialog.
|
||||
change it, you have to select it from the **Print Preview** dialog.
|
||||
|
||||
@@ -1,96 +1,122 @@
|
||||
.. _a_proj:
|
||||
|
||||
**************
|
||||
Novel Projects
|
||||
**************
|
||||
*****************
|
||||
Managing Projects
|
||||
*****************
|
||||
|
||||
New projects can be created from the :guilabel:`Project` menu by selecting
|
||||
:guilabel:`Create or Open Project`. This will open the :guilabel:`Welcome` dialog, where you can
|
||||
select the :guilabel:`New` button that will assist you in creating a new project.
|
||||
Your text in novelWriter is organised into projects. Each project is meant to contain one novel
|
||||
and associated notes. If you have multiple novels in a series, with the same characters and shared
|
||||
notes, it is also possible to keep all of them in the same project.
|
||||
|
||||
.. _a_proj_new:
|
||||
|
||||
Creating Project
|
||||
================
|
||||
|
||||
New projects can be created from the **Project** menu by selecting **Create or Open Project**. This
|
||||
will open the **Welcome** dialog, where you can select the :guilabel:`New` button that will assist
|
||||
you in creating a new project. This dialog is also displayed when you start novelWriter.
|
||||
|
||||
A novelWriter project requires a dedicated folder for storing its files on the local file system.
|
||||
If you're interested in the details, you can have a look at the chapter :ref:`a_storage`.
|
||||
|
||||
A list of recently opened projects is maintained, and displayed in the :guilabel:`Welcome`
|
||||
dialog. A project can be removed from this list by selecting it and pressing the :kbd:`Del` key or
|
||||
by right-clicking it and selecting the :guilabel:`Remove Project` option.
|
||||
A list of recently opened projects is maintained, and displayed in the **Welcome** dialog. A
|
||||
project can be removed from this list by selecting it and pressing the :kbd:`Del` key or by
|
||||
right-clicking it and selecting the **Remove Project** option.
|
||||
|
||||
.. figure:: images/fig_welcome.jpg
|
||||
|
||||
The project list (left) and new project form (right) of the :guilabel:`Welcome` dialog.
|
||||
|
||||
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's
|
||||
novel text, including word counts, and a table of contents with word and page counts, is available
|
||||
through the :guilabel:`Novel Details` dialog.
|
||||
Project-specific settings are available in **Project Settings** in the **Project** menu. See
|
||||
further details below in the :ref:`a_proj_settings` section.
|
||||
|
||||
Details about the project's novel text, including word counts, and a table of contents with word
|
||||
and page counts, is available through the **Novel Details** dialog. Statistics about the project
|
||||
is also available in the **Manuscript Build** tool.
|
||||
|
||||
|
||||
Template Projects
|
||||
-----------------
|
||||
|
||||
From the Welcome dialog you can also create a new from another existing project. If you have a
|
||||
specific structure you want to use for all your new projects, you can create a dedicated project to
|
||||
be used as a template, and select to copy an existing project from the :guilabel:"Prefill Project"
|
||||
option from the **New Project** form.
|
||||
|
||||
|
||||
.. _a_proj_roots:
|
||||
|
||||
Project Roots
|
||||
=============
|
||||
Project Structure
|
||||
=================
|
||||
|
||||
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 :term:`novel documents` go into a root folder of type :guilabel:`Novel`. :term:`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.
|
||||
The :term:`novel documents` go into a root folder of type **Novel**. :term:`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
|
||||
the project tree tool bar.
|
||||
|
||||
Each root folder has one or more :term:`reference` :term:`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
|
||||
listed below. However, aside from the **Novel** folder, no restrictions are applied by the
|
||||
application on what you put in them. You can use them however you want.
|
||||
|
||||
The root folder system is closely connected to how the Tags and References system works. For more
|
||||
details, see the :ref:`a_references` chapter.
|
||||
|
||||
:guilabel:`Novel`
|
||||
|
||||
Root Folder Types
|
||||
-----------------
|
||||
|
||||
**Novel**
|
||||
This is the root folder type for 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`
|
||||
**Plot**
|
||||
This is the root folder type where main plots can be outlined. It is optional, but adding at
|
||||
least brief notes can be useful in order to tag plot elements for the :guilabel:`Outline View`.
|
||||
Tags in this folder can be references using the ``@plot`` keyword.
|
||||
least 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`
|
||||
**Characters**
|
||||
Character notes go in this root folder type. These are especially important if you want to use
|
||||
the :guilabel:`Outline View` to see which character appears where, which part of the story is
|
||||
told from a specific character's point-of-view, or focusing on a particular character's
|
||||
storyline. The character names can also be inserted into for instance chapter titles when you
|
||||
create your manuscript. Tags in this type of folder can be referenced using the ``@pov`` keyword
|
||||
for point-of-view characters, ``@focus`` for a focus character, or the ``@char`` keyword for any
|
||||
the **Outline View** to see which character appears where, which part of the story is told from
|
||||
a specific character's point-of-view, or focusing on a particular character's storyline.
|
||||
|
||||
The character names can also be inserted into for instance chapter titles when you create your
|
||||
manuscript. Tags in this type of 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 character present.
|
||||
|
||||
:guilabel:`Locations`
|
||||
**Locations**
|
||||
The locations folder type is for various scene locations that you want to track. Tags in this
|
||||
folder can be references using the ``@location`` keyword.
|
||||
|
||||
:guilabel:`Timeline`
|
||||
**Timeline**
|
||||
If the story has multiple plot timelines or jumps in time within the same plot, this folder type
|
||||
can be used to track this. Tags in this type of folder can be references using the ``@time``
|
||||
keyword.
|
||||
|
||||
:guilabel:`Objects`
|
||||
Important objects in the story, for instance objects that change hands often, can be tracked
|
||||
here. Tags in this type of folder can be references using the ``@object`` keyword.
|
||||
**Objects**
|
||||
Important objects in the story, for instance physical objects that change hands often, can be
|
||||
tracked here. Tags in this type of folder can be references using the ``@object`` keyword.
|
||||
|
||||
:guilabel:`Entities`
|
||||
**Entities**
|
||||
Does your plot have many powerful organisations or companies? Or other entities that are part of
|
||||
the plot? They can be organised here. Tags in this type of folder can be references using the
|
||||
``@entity`` keyword.
|
||||
|
||||
:guilabel:`Custom`
|
||||
**Custom**
|
||||
The custom root folder type can be used for tracking anything else not covered by the above
|
||||
options. Tags in this folder type can be references using the ``@custom`` keyword.
|
||||
|
||||
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_references_references`.
|
||||
The root folders are closely tied to the tags and reference system. Each folder type corresponds to
|
||||
the categories of tags that can be used to reference them. For more information about the tags
|
||||
listed, see :ref:`a_references_references`.
|
||||
|
||||
.. note::
|
||||
You can rename root folders to whatever you want. However, this doesn't change the reference
|
||||
@@ -105,12 +131,11 @@ information about the tags listed, see :ref:`a_references_references`.
|
||||
Deleted Documents
|
||||
-----------------
|
||||
|
||||
Deleted documents will be moved into a special :guilabel:`Trash` root folder. Documents in the
|
||||
trash folder can then be deleted permanently, either individually, or by emptying the trash from
|
||||
the menu. Documents in the trash folder are removed from the :term:`project index` and cannot be
|
||||
referenced.
|
||||
Deleted documents are moved into a special **Trash** root folder. Documents in the trash folder can
|
||||
then be deleted permanently, either individually, or by emptying the trash from the menu. Documents
|
||||
in the trash folder are removed from the :term:`project index` and cannot be referenced.
|
||||
|
||||
A document or a folder can be moved to trash from the :guilabel:`Project` menu, or by pressing
|
||||
A document or a folder can be moved to trash from the **Project** menu, or by pressing
|
||||
:kbd:`Ctrl+Shift+Del`. Root folders can only be removed when they are empty.
|
||||
|
||||
|
||||
@@ -119,13 +144,34 @@ A document or a folder can be moved to trash from the :guilabel:`Project` menu,
|
||||
Archived Documents
|
||||
------------------
|
||||
|
||||
If you don't want to delete a document, or put it in the :guilabel:`Trash` folder where it may be
|
||||
deleted accidentally, but still want it out of your main project tree, you can create an
|
||||
:guilabel:`Archive` root folder and move it there.
|
||||
If you don't want to delete a document, or put it in the **Trash** folder where it may be deleted
|
||||
accidentally, but still want it out of your main project tree, you can create an **Archive** root
|
||||
folder instead and move it there. It has the same effect as moving it to **Trash**, but it is safe
|
||||
from deletion.
|
||||
|
||||
You can drag any document to this folder and preserve its settings. The document will always be
|
||||
excluded from the :guilabel:`Build Manuscript` tool. It is also removed from the
|
||||
:term:`project index`, so the tags and references defined in it will not show up anywhere else.
|
||||
excluded from the **Build Manuscript** tool. It is also removed from the :term:`project index`, so
|
||||
the tags and references defined in it will not show up anywhere else.
|
||||
|
||||
|
||||
.. _a_proj_roots_dirs:
|
||||
|
||||
Using Folders in the Project Tree
|
||||
---------------------------------
|
||||
|
||||
Regular folders, those that are not root folders, have no structural significance to the project.
|
||||
When novelWriter is processing the documents in a project, like for instance when you create a
|
||||
manuscript from it, these folders are ignored. Only the order of the documents themselves matter.
|
||||
|
||||
The folders are there purely as a way for you to organise the documents in meaningful sections and
|
||||
to be able to collapse and hide them in the project tree when you're not working on those
|
||||
documents.
|
||||
|
||||
.. versionadded:: 2.0
|
||||
As of version 2.0 it is possible to 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_roots_orphaned:
|
||||
@@ -143,8 +189,8 @@ previously have been located in the project. The project loading routine will tr
|
||||
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
|
||||
it to the correct root folder type. If it cannot figure out which root folder is correct, the
|
||||
document will be added to the :guilabel:`Novel` root folder. Finally, if the :guilabel:`Novel`
|
||||
folder is missing, one will be created.
|
||||
document will be added to the **Novel** root folder. Finally, if a **Novel** does not exist, one
|
||||
will be created.
|
||||
|
||||
If the title of the document can be recovered, the word "Recovered:" will be added as a prefix to
|
||||
indicate that it may need further attention. If the title cannot be determined, the document will
|
||||
@@ -157,15 +203,16 @@ Project Lockfile
|
||||
----------------
|
||||
|
||||
To prevent lost documents caused by file conflicts when novelWriter projects are synchronised via
|
||||
file synchronisation tools, a project lockfile is written to the project storage folder. If you try
|
||||
to open a project which has such a file present, you will be presented with a warning, and some
|
||||
information about where else novelWriter thinks the project is also open. You will be given the
|
||||
option to ignore this warning, and continue opening the project at your own risk.
|
||||
file synchronisation tools, a project lockfile is written to the project storage folder when a
|
||||
project is open. If you try to open a project which already has such a file present, you will be
|
||||
presented with a warning, and some information about where else novelWriter thinks the project is
|
||||
also open. You will be given the option to ignore this warning, and continue opening the project at
|
||||
your own risk.
|
||||
|
||||
.. note::
|
||||
If, for some reason, novelWriter crashes, the lock file may remain even if there are no other
|
||||
instances keeping the project open. In such a case it is safe to ignore the lock file warning
|
||||
when re-opening the project.
|
||||
If, for some reason, novelWriter or your computer crashes, the lock file may remain even if
|
||||
there are no other instances keeping the project open. In such a case it is safe to ignore the
|
||||
lock file warning when re-opening the project.
|
||||
|
||||
.. warning::
|
||||
If you choose to ignore the warning and continue opening the project, and multiple instances of
|
||||
@@ -175,52 +222,31 @@ option to ignore this warning, and continue opening the project at your own risk
|
||||
novelWriter will try to resolve project inconsistencies the next time you open the project.
|
||||
|
||||
|
||||
.. _a_proj_roots_dirs:
|
||||
|
||||
Using Folders in the Project Tree
|
||||
---------------------------------
|
||||
|
||||
Folders, aside from root folders, have no structural significance to the project. When novelWriter
|
||||
is processing the documents in a project, like for instance when you create a manuscript from it,
|
||||
these folders are ignored. Only the order of the documents themselves matter.
|
||||
|
||||
The folders are there purely as a way for you to organise the documents in meaningful sections and
|
||||
to be able to collapse and hide them in the project tree when you're not working on those
|
||||
documents.
|
||||
|
||||
.. versionadded:: 2.0
|
||||
As of version 2.0 it is possible to 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:
|
||||
|
||||
Project Documents
|
||||
=================
|
||||
|
||||
New documents can be created from the toolbar in the :guilabel:`Project Tree`, or by pressing
|
||||
:kbd:`Ctrl+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.
|
||||
New documents can be created from the toolbar in the project tree, or by pressing :kbd:`Ctrl+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`.
|
||||
You can always rename an item by selecting **Rename Item** from the **Project** menu, or by
|
||||
pressing :kbd:`F2` when a document or folder is selected.
|
||||
|
||||
Other settings for project items are available from the context menu that you can activate by
|
||||
right-clicking on an item in the tree. The :guilabel:`Transform` submenu includes options for
|
||||
converting, splitting, or merging items. See :ref:`a_ui_tree_split_merge` for more details on the
|
||||
latter two.
|
||||
Other settings for project documents and folders are available from the context menu that you can
|
||||
activate by right-clicking on an it in the tree. The **Transform** submenu includes options for
|
||||
converting, splitting, or merging documents. See :ref:`a_ui_tree_split_merge` for more details on
|
||||
the latter two.
|
||||
|
||||
|
||||
Document Templates
|
||||
------------------
|
||||
|
||||
If you wish to create template documents to be used when creating new project documents, like for
|
||||
instance a character note template, you can add a :guilabel:`Templates` root folder to your
|
||||
project. Any document added to this root folder will show up in the :guilabel:`Add Item` menu in
|
||||
the project tree toolbar. When selected, a new document is created with its content copied from the
|
||||
chosen template.
|
||||
instance a character note template, you can add a **Templates** root folder to your project. Any
|
||||
document added to this root folder will show up in the **Add Item** menu in the project tree
|
||||
toolbar. When selected, a new document is created with its content copied from the chosen template.
|
||||
|
||||
.. versionadded:: 2.3
|
||||
|
||||
@@ -233,8 +259,8 @@ Word Counts
|
||||
A character, word and paragraph count is maintained for each document, as well as for each section
|
||||
of a document following a :term:`heading<headings>`. 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 :guilabel:`Project Tree` for any document selected in the
|
||||
project or novel trees.
|
||||
shown in the details panel below the project tree for any document selected in the project or novel
|
||||
trees.
|
||||
|
||||
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.
|
||||
@@ -242,7 +268,7 @@ 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
|
||||
the values in the project tree, which again depend on an up to date :term:`project index`. If the
|
||||
counts seem wrong, a full project word recount can be initiated by rebuilding the project's index.
|
||||
Either from the :guilabel:`Tools` menu, or by pressing :kbd:`F9`.
|
||||
Either from the **Tools** menu, or by pressing :kbd:`F9`.
|
||||
|
||||
The rules for how the counts are made is covered in more detail in :ref:`a_counting`.
|
||||
|
||||
@@ -252,33 +278,36 @@ The rules for how the counts are made is covered in more detail in :ref:`a_count
|
||||
Project Settings
|
||||
================
|
||||
|
||||
The :guilabel:`Project Settings` can be accessed from the :guilabel:`Project` menu, or by pressing
|
||||
The **Project Settings** can be accessed from the **Project** menu, or by pressing
|
||||
:kbd:`Ctrl+Shift+,`. This will open a dialog box, with a set of tabs.
|
||||
|
||||
|
||||
Settings Tab
|
||||
------------
|
||||
|
||||
The :guilabel:`Settings` tab holds the project name, title, and author settings.
|
||||
The **Settings** tab holds the project name, author, and language settings.
|
||||
|
||||
The :guilabel:`Project Name` can be edited here. It is used for the GUI (main window title) and for
|
||||
generating backup files. So keep in mind that if you do change this setting, the backup file names
|
||||
will change too.
|
||||
The **Project Name** can be edited here. It is used for the main window title and for generating
|
||||
backup files. So keep in mind that if you do change this setting, the backup file names will change
|
||||
too.
|
||||
|
||||
You can also change the :guilabel:`Authors` and :guilabel:`Project Language` setting. These are
|
||||
only used when building the manuscript, for some formats.
|
||||
You can also change the **Authors** and **Project Language** setting. These are only used when
|
||||
building the manuscript, for some formats. The language setting is also used when inserting text
|
||||
into documents in the viewer, like for instance labels for keywords and special comments.
|
||||
|
||||
If your project is in a different language than your main spell checking language is set to, you
|
||||
can override the default setting here. The project language can also be changed from the
|
||||
:guilabel:`Tools` menu. You can also override the automatic backup setting if you wish.
|
||||
can override the default setting here. The project language can also be changed from the **Tools**
|
||||
menu.
|
||||
|
||||
You can also override the automatic backup setting for the project if you wish.
|
||||
|
||||
|
||||
Status and Importance Tabs
|
||||
--------------------------
|
||||
|
||||
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.
|
||||
Each document or folder of type **Novel** can be given a "Status" label accompanied by a coloured
|
||||
icon with an optional shape selected from a list of pre-defined shapes. Each document or folder of
|
||||
the remaining types can be given an "Importance" label with the same customisation options.
|
||||
|
||||
These labels are there purely for your 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
|
||||
@@ -316,22 +345,22 @@ Backup
|
||||
======
|
||||
|
||||
An automatic backup system is built into novelWriter. In order to use it, a backup path to where
|
||||
the backup files are to be stored must be provided in :guilabel:`Preferences`.
|
||||
the backup files are to be stored must be provided in **Preferences**. The path defaults to a
|
||||
folder named "Backups" in your home directory.
|
||||
|
||||
Backups can be run automatically when a project is closed, which also implies it is run when the
|
||||
application itself is closed. Backups are date stamped zip files of the 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`.
|
||||
in a subfolder of the backup path. The subfolder will have the same name as the **Project Name** as
|
||||
defined in :ref:`a_proj_settings`.
|
||||
|
||||
The backup feature, when configured, can also be run manually from the :guilabel:`Tools` menu.
|
||||
It is also possible to disable automated backups for a given project in
|
||||
:guilabel:`Project Settings`.
|
||||
The backup feature, when configured, can also be run manually from the **Tools** menu. It is also
|
||||
possible to disable automated backups for a given project in **Project Settings**.
|
||||
|
||||
.. note::
|
||||
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 name and path of the backups.
|
||||
Without it, the backup will not run at all, but it will produce a warning message.
|
||||
For the backup to be able to run, the **Project Name** must be set in **Project Settings**. This
|
||||
value is used to generate the name and path of the backups. Without it, the backup will not run
|
||||
at all, but it will produce a warning message.
|
||||
|
||||
|
||||
.. _a_proj_stats:
|
||||
@@ -344,9 +373,8 @@ total word counts of your novel documents and notes at the end of the session, p
|
||||
session lasted either more than 5 minutes, or that the total word count changed. For more details
|
||||
about the log file, see :ref:`a_storage`.
|
||||
|
||||
A tool to view the content of the log file is available in the :guilabel:`Tools` menu under
|
||||
:guilabel:`Writing Statistics`. You can also launch it by pressing :kbd:`F6`, or find it on the
|
||||
sidebar.
|
||||
A tool to view the content of the log file is available in the **Tools** menu under **Writing
|
||||
Statistics**. You can also launch it by pressing :kbd:`F6`, or find it on the sidebar.
|
||||
|
||||
The tool will show a list of all your sessions, and a set of filters to apply to the data. You can
|
||||
also export the filtered data to a JSON file or to a CSV file that can be opened by a spreadsheet
|
||||
@@ -356,4 +384,4 @@ application like for instance Libre Office Calc or Excel.
|
||||
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`.
|
||||
in **Preferences**.
|
||||
|
||||
@@ -16,9 +16,9 @@ this chapter hopes to explain in more detail how to use this tags and references
|
||||
|
||||
.. tip::
|
||||
If you find the Tags and Reference system difficult to follow just from reading this chapter,
|
||||
you can create a new project in the :guilabel:`Welcome` dialog's New project form and select
|
||||
"Create an example project" from the "Pre-fill project" option. The example project contains
|
||||
several examples of tags and references.
|
||||
you can create a new project in the **Welcome** dialog's New project form and select "Create an
|
||||
example project" from the "Pre-fill project" option. The example project contains several
|
||||
examples of tags and references.
|
||||
|
||||
|
||||
.. _a_references_metadata:
|
||||
@@ -68,7 +68,7 @@ You can only set **one** tag per heading, and the tag has to be unique across **
|
||||
the project.
|
||||
|
||||
After a tag has been defined, it can be referenced in novel documents, or cross-referenced in other
|
||||
notes. Tags will also show up in the :guilabel:`Outline View` and in the references panel under the
|
||||
notes. Tags will also show up in the **Outline View** and in the references panel under the
|
||||
document viewer when a document is open in the viewer.
|
||||
|
||||
The syntax highlighter will indicate to you that the keyword is correctly used and that the tag is
|
||||
@@ -79,7 +79,7 @@ that valid tags do.
|
||||
The tag is the only part of these notes that novelWriter uses. The rest of the document content is
|
||||
there for you to use in whatever way you wish. Of course, the content of the documents can be added
|
||||
to the manuscript, or an outline document. If you want to compile a single document of all your
|
||||
notes, you can do this from the :guilabel:`Manuscript Build` tool.
|
||||
notes, you can do this from the **Manuscript Build** tool.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
Tags are no longer case sensitive. The tags are by default displayed with the capitalisation you
|
||||
@@ -117,8 +117,8 @@ How to Use References
|
||||
=====================
|
||||
|
||||
Each heading of any level in your project can contain references to tags set in project notes. The
|
||||
references are gathered by the indexer and used to generate the :guilabel:`Outline View`, among
|
||||
other things.
|
||||
references are gathered by the indexer and used to generate the **Outline View**, among other
|
||||
things.
|
||||
|
||||
References are set as a :term:`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
|
||||
@@ -126,70 +126,69 @@ reference 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.
|
||||
**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.
|
||||
focus is not a point-of-view character. The target must be a note tag in a **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.
|
||||
Other characters in the current section. The target must be a note tag in a **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.
|
||||
The plot or subplot advanced in the current section. The target must be a note tag in a **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.
|
||||
The timelines touched by the current section. The target must be a note tag in a **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.
|
||||
**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.
|
||||
Objects present in the current section. The target must be a note tag in a **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.
|
||||
Entities present in the current section. The target must be a note tag in an **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.
|
||||
Custom references in the current section. The target must be a note tag in a **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.
|
||||
|
||||
.. note::
|
||||
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.
|
||||
:kbd:`F9` to regenerate it, or select **Rebuild Index** from the **Tools** menu. In general, the
|
||||
index for a document is regenerated when it is saved, so this shouldn't normally be necessary.
|
||||
|
||||
.. tip::
|
||||
If you add a reference in the editor to a tag that doesn't yet exist, you can right-click it and
|
||||
select :guilabel:`Create Note for Tag`. This will generate a new project note automatically with
|
||||
the new tag defined. In order for this to be possible, a root folder for that category of
|
||||
references must already exist.
|
||||
select **Create Note for Tag**. This will generate a new project note automatically with the new
|
||||
tag defined. In order for this to be possible, a root folder for that category of references
|
||||
must already exist.
|
||||
|
||||
One note can also reference another note in the same way novel documents do. When the note is
|
||||
opened in the document viewer, the references become clickable links, making it easier to follow
|
||||
connections in the plot. You can follow links in the document editor by clicking them with the
|
||||
mouse while holding down the :kbd:`Ctrl` key. Clicked links are always opened in the view panel.
|
||||
|
||||
Project notes don't show up in the :guilabel:`Outline View`, so referencing between notes is only
|
||||
Project notes don't show up in the **Outline View**, 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:`Manuscript Build` tool, the cross-references become clickable links in the exported
|
||||
HTML document as well.
|
||||
**Manuscript Build** tool, the cross-references become clickable links in the exported HTML
|
||||
document as well.
|
||||
|
||||
Example of a novel document with references to characters and plots:
|
||||
|
||||
@@ -217,7 +216,7 @@ character ``@`` on a new line. It will first suggest tag or reference keywords f
|
||||
after the ``:`` has been added, suggest references from the list of tags you have already defined.
|
||||
|
||||
You can use the auto-completer to add multiple references with a ``,`` between them, and even type
|
||||
new ones. New references can be created by right-clicking on them and selecting
|
||||
:guilabel:`Create Note for Tag` from the menu.
|
||||
new ones. New references can be created by right-clicking on them and selecting **Create Note for
|
||||
Tag** from the menu.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
@@ -6,14 +6,13 @@ Novel Structure
|
||||
|
||||
This chapter covers the structure of a novel project.
|
||||
|
||||
There are two different types of documents in a project, :guilabel:`Novel Documents` and
|
||||
:guilabel:`Project Notes`. Active 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, where they
|
||||
become inactive.
|
||||
There are two different types of documents in a project, **Novel Documents** and **Project Notes**.
|
||||
Active novel documents can only live in a **Novel** type root folder. You can also move them to
|
||||
**Archive** and **Trash** of course, where they become inactive.
|
||||
|
||||
The :guilabel:`Project Tree` can distinguish between the different heading levels of the novel
|
||||
documents using coloured icons, and optionally add emphasis on the label, set in
|
||||
:guilabel:`Preferences`.
|
||||
The project tree can distinguish between the different heading levels of the novel documents using
|
||||
coloured icons, and optionally add emphasis on the label, set in **Preferences** for easier
|
||||
identification.
|
||||
|
||||
|
||||
.. _a_struct_heads:
|
||||
@@ -29,40 +28,41 @@ title. See also the :ref:`a_fmt` section for more details about the markup synta
|
||||
|
||||
.. note::
|
||||
The heading levels are not only important when generating the manuscript, they are also used by
|
||||
the indexer when building the outline tree in the :guilabel:`Outline View` as well as in the
|
||||
:guilabel:`Novel Tree`. Each heading also starts a new region where new Tags and References
|
||||
can be defined. See :ref:`a_references` for more details.
|
||||
the indexer when building the outline tree in the **Outline View** as well as in the **Novel
|
||||
Tree**. Each heading also starts a new region where new Tags and References can be defined. See
|
||||
:ref:`a_references` for more details.
|
||||
|
||||
The syntax for the four basic heading types, and the two special types, is listed in section
|
||||
The syntax for the four basic heading types, and the three special types, is listed in section
|
||||
:ref:`a_fmt_head`. The meaning of the four levels for the structure of your novel is as follows:
|
||||
|
||||
**Heading Level 1: Partition**
|
||||
This heading level signifies that the text refers to a top level partition. This is useful when
|
||||
This heading level signifies that the text refers to a top level heading. 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 heading level ``#!`` covered in :ref:`a_fmt_head`.
|
||||
|
||||
**Heading Level 2: Chapter**
|
||||
This heading 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.
|
||||
This heading level signifies a chapter. 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.
|
||||
|
||||
**Heading Level 3: Scene**
|
||||
This heading 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.
|
||||
This heading level signifies a scene. 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. If you
|
||||
need to distinguish between hard and soft scene breaks, there is an alternative format for
|
||||
scenes you can use for this distinction. The formatting is covered in :ref:`a_fmt_head`. See
|
||||
also :ref:`a_struct_heads_scenes`.
|
||||
|
||||
**Heading Level 4: Section**
|
||||
This heading level signifies a sub-scene level partition, usually called a "section" in the
|
||||
This heading level can be used to split up a scene, usually called a "section" in the
|
||||
documentation and the user interface. These can be useful if you want to change 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.
|
||||
wish, and you can filter them out of the final manuscript.
|
||||
|
||||
Page breaks are automatically added before partition and chapter headings when you build your
|
||||
project to a format that supports page breaks. If you want page breaks in other places, you have to
|
||||
specify them manually. See :ref:`a_fmt_break`.
|
||||
Page breaks can be automatically added before partition, chapter and scene headings from the
|
||||
**Manuscript Build** tool when you build your project to a format that supports page breaks. 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 headings when building the manuscript. For
|
||||
@@ -76,9 +76,9 @@ specify them manually. See :ref:`a_fmt_break`.
|
||||
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 heading format code with an ``!`` in order
|
||||
to render it as a document title that is excluded from any automatic Table of Content in a
|
||||
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 heading 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:
|
||||
|
||||
.. code-block:: md
|
||||
@@ -102,7 +102,7 @@ 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 can add an ``!`` to the level 2 heading formatting code to tell
|
||||
the build tool to skip these chapters.
|
||||
the build tool to skip these chapters when adding numbers.
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
@@ -110,13 +110,31 @@ the build tool to skip these chapters.
|
||||
|
||||
Chapter Text
|
||||
|
||||
There is a separate formatting feature for such chapter titles in the :guilabel:`Manuscript Build`
|
||||
tool as well. See the :ref:`a_manuscript` 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.
|
||||
There is a separate formatting feature for such chapter titles in the **Manuscript Build** tool as
|
||||
well. See the :ref:`a_manuscript` page for more details. When building a document of a format that
|
||||
supports page breaks, also unnumbered chapters can 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_heads_scenes:
|
||||
|
||||
Hard and Soft Scene Breaks
|
||||
--------------------------
|
||||
|
||||
If you need two different ways to style scenes in your manuscript, like if you want to insert
|
||||
different scene separators for soft and hard scene breaks, there is an alternative scene format
|
||||
available for scene headings with a ``!`` added to the formatting code.
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
### Soft Scene Transition
|
||||
|
||||
A soft scene break.
|
||||
|
||||
###! Hard Scene Transition
|
||||
|
||||
A hard scene break.
|
||||
|
||||
There is a separate formatting feature for these titles in the **Manuscript Build** tool.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
|
||||
@@ -15,10 +15,9 @@ file locations are described in this chapter.
|
||||
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 general configuration of novelWriter, including everything that is in **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:
|
||||
|
||||
@@ -40,9 +39,8 @@ 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`` value.
|
||||
list of recent projects form the **Welcome** dialog. Custom themes should also be saved here. The
|
||||
system paths are provided by the Qt QStandardPaths_ class and its ``AppDataLocation`` value.
|
||||
|
||||
The standard paths are:
|
||||
|
||||
@@ -56,3 +54,12 @@ 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.
|
||||
|
||||
The Application Data location also holds several folders:
|
||||
|
||||
``cache``
|
||||
This folder is used to save the preview data for the **Manuscript Build** tool.
|
||||
|
||||
``icons``, ``syntax`` and ``themes``
|
||||
These folders are empty by default, but this is where the user can store custom theme files.
|
||||
See :ref:`a_custom` for more details.
|
||||
|
||||
@@ -39,11 +39,9 @@ The following Python packages are needed to run all features of novelWriter:
|
||||
* ``PyQt5`` – needed for connecting with the Qt5 libraries.
|
||||
* ``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.
|
||||
|
||||
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.
|
||||
PyQt/Qt must be at least 5.15.0. 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:
|
||||
@@ -55,7 +53,7 @@ source, dependencies can still be installed from PyPi with:
|
||||
.. note::
|
||||
On Linux distros, the Qt library is usually split up into multiple packages. In some cases,
|
||||
secondary dependencies may not be installed automatically. For novelWriter, the library files
|
||||
for renderring the SVG icons may be left out and needs to be installed manually. This is the
|
||||
for rendering the SVG icons may be left out and needs to be installed manually. This is the
|
||||
case on for instance Arch Linux.
|
||||
|
||||
|
||||
@@ -159,6 +157,5 @@ You can also build a PDF manual from the documentation using the ``pkgutils.py``
|
||||
python pkgutils.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.
|
||||
assets folder and made available in the **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.
|
||||
|
||||
@@ -55,10 +55,10 @@ string. The documents are saved with a filename assembled from this handle and t
|
||||
``.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 in the editor, 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.
|
||||
up in the project XML file, select **Show File Details** from the **Document** menu when having the
|
||||
document open in the editor, 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
|
||||
@@ -109,7 +109,7 @@ The Project Index
|
||||
|
||||
Between writing sessions, the project index is saved in a JSON file in ``meta/index.json``.
|
||||
This file is not critical. If it is lost, it can be completely rebuilt from within novelWriter from
|
||||
the :guilabel:`Tools` menu.
|
||||
the **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
|
||||
@@ -125,8 +125,8 @@ the index. If this too fails, you have likely encountered a bug.
|
||||
Build Definitions
|
||||
-----------------
|
||||
|
||||
The build definitions from the :guilabel:`Manuscript Build` tool are kept in the
|
||||
``meta/builds.json`` file. If this file is lost, all custom build definitions are lost too.
|
||||
The build definitions from the **Manuscript Build** tool are kept in the ``meta/builds.json`` file.
|
||||
If this file is lost, all custom build definitions are lost too.
|
||||
|
||||
|
||||
Cached GUI Options
|
||||
@@ -144,17 +144,17 @@ Custom Word List
|
||||
----------------
|
||||
|
||||
A file named ``meta/userdict.json`` 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.
|
||||
spell checking purposes. The content of the file can be edited from the **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/sessions.jsonl`` 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.
|
||||
and word counts of each writing session on the given project. The file is used by the **Writing
|
||||
Statistics** tool. If this file is lost, the history it contains is also lost, but it has otherwise
|
||||
no impact on the project.
|
||||
|
||||
Each session is recorded as a JSON object on a single line of the file. Each session record is
|
||||
appended tot he file.
|
||||
|
||||
@@ -21,14 +21,15 @@ GUI Layout and Design
|
||||
The user interface of novelWriter is intended to be as minimalistic as practically possible, while
|
||||
at the same time provide useful features needed for writing a novel.
|
||||
|
||||
The main window does not have an editor toolbar like many other applications do. This reduces
|
||||
clutter, and since the documents are formatted with style tags, it is more or less redundant.
|
||||
Still, a small formatting toolbar can be popped out by clicking the three dots in the header of the
|
||||
document editor to give quick access to standard formatting codes.
|
||||
The main window does not by default have an editor toolbar like many other applications do. This
|
||||
reduces clutter, and since the documents are formatted with style tags, it is not needed most of
|
||||
the time. Still, a small formatting toolbar can be popped out by clicking the left-most button in
|
||||
the header of the document editor. It gives quick access to standard formatting codes.
|
||||
|
||||
Most formatting features supported are available through convenient keyboard shortcuts. They are
|
||||
also available in the main menu, so you don't have to look up formatting codes every time you need
|
||||
them. For reference, a list of all shortcuts can be found in the :ref:`a_kb` chapter.
|
||||
also available in the main menu under **Format**, so you don't have to look up formatting codes
|
||||
every time you need them. For reference, a list of all shortcuts can be found in the :ref:`a_kb`
|
||||
chapter.
|
||||
|
||||
.. note::
|
||||
novelWriter is not intended to be a full office type word processor. It doesn't support images,
|
||||
@@ -37,13 +38,13 @@ them. For reference, a list of all shortcuts can be found in the :ref:`a_kb` cha
|
||||
simple features.
|
||||
|
||||
On the left side 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 Manuscript` tool, and a set of
|
||||
views you can switch between, a quick link to the **Build Manuscript** tool, and a set of
|
||||
project-related tools and quick access to settings at the bottom.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
A number of new formatting options were added in 2.2 to allow for some special formatting cases.
|
||||
At the same time, a small formatting toolbar was added in the editor. It is hidden by default,
|
||||
but can be opened by pressing the three dots icon in the top right corner.
|
||||
At the same time, a small formatting toolbar was added to the editor. It is hidden by default,
|
||||
but can be opened by pressing the button in the top right corner of the editor header.
|
||||
|
||||
|
||||
Project Tree and Editor View
|
||||
@@ -53,19 +54,19 @@ Project Tree and Editor View
|
||||
|
||||
A screenshot of the Project Tree and Editor View.
|
||||
|
||||
When in :guilabel:`Project Tree View` mode, the main work area of the main window is split in two,
|
||||
or optionally three, panels. The left-most panel contains the project tree and all the documents in
|
||||
your project. The second panel is the document editor.
|
||||
When the application is in **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 side contains 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 purpose if you wish if you need to check that the
|
||||
formatting tags behave as you expected. The main purpose of the viewer is for viewing your notes
|
||||
next to your editor while you're writing.
|
||||
preview window, although you can use it for this purpose if you wish. For instance if you need to
|
||||
check that the formatting tags behave as you expect. However, 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's 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.
|
||||
The editor also has a **Focus Mode** you can toggle either from the menu, from the icon in the
|
||||
editor's header, or by pressing :kbd:`F8`. When **Focus Mode** is enabled, all the user interface
|
||||
elements other than the document editor itself are hidden away.
|
||||
|
||||
|
||||
Novel View and Editor View
|
||||
@@ -73,31 +74,32 @@ Novel View and Editor View
|
||||
|
||||
.. figure:: images/fig_novel_tree_view.png
|
||||
|
||||
A screenshot of the Novel Tree View.
|
||||
A screenshot of the Novel Tree and Editor View.
|
||||
|
||||
When in :guilabel:`Novel Tree View` mode, the project tree is replaced by an overview of your novel
|
||||
structure for a specific Novel :term:`root folder`. Instead of showing individual documents, the
|
||||
tree now shows all headings of your novel text. This includes multiple headings within the same
|
||||
document.
|
||||
When the application is in **Novel Tree View** mode, the project tree is replaced by an overview of
|
||||
your novel structure for a specific Novel :term:`root folder`. 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 in the same document.
|
||||
Each heading is indented according to the heading level, not its parent/child relationship to other
|
||||
elements of your project. 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 in the same document.
|
||||
|
||||
If you have multiple "Novel" type root folders, the header of the novel view becomes a dropdown
|
||||
If you have multiple **Novel** type root folders, the header of the novel view becomes a dropdown
|
||||
box. You can then switch between them by clicking the :guilabel:`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 triggered, or you manually press :kbd:`Ctrl+S` to save changes. (You can
|
||||
adjust the auto-save interval in :guilabel:`Preferences`.) You can also regenerate the whole novel
|
||||
view by pressing the refresh button in the novel view header.
|
||||
adjust the auto-save interval in **Preferences**.) You can also regenerate the whole novel view by
|
||||
pressing the refresh button in the novel view header.
|
||||
|
||||
It is possible to show an optional third column in the novel view. The settings are available from
|
||||
the menu button in the toolbar.
|
||||
|
||||
If you click the arrow icon to the right of each item, a tooltip will pop out showing you all the
|
||||
If you click the triangular icon to the right of each item, a tooltip will pop out showing all the
|
||||
meta data collected for that heading.
|
||||
|
||||
|
||||
@@ -108,9 +110,9 @@ Novel Outline View
|
||||
|
||||
A screenshot of the 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.
|
||||
When the application is in **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.
|
||||
@@ -122,18 +124,44 @@ Colour Themes
|
||||
|
||||
By default, novelWriter will use the colour theme provided by the Qt library, which is determined
|
||||
by the Fusion_ style setting. You can also choose between a standard dark and light theme that have
|
||||
neutral colours from :guilabel:`Preferences`. Other colour themes are also available. More themes
|
||||
can be contributed to novelWriter on GitHub.
|
||||
neutral colours from **Preferences**.
|
||||
|
||||
If you wish, you *can* create your own colour themes, and even have them added to the application.
|
||||
See :ref:`a_custom_theme` for more details.
|
||||
|
||||
Switching the GUI colour theme does not affect the colours of the editor and viewer. They have
|
||||
separate colour selectable from the "Document colour theme" setting in :guilabel:`Preferences`.
|
||||
They are separated because there are a lot more options to choose from for the editor and viewer.
|
||||
separate colour selectable from the "Document colour theme" setting in **Preferences**. They are
|
||||
separated because there are a lot more options to choose from for the editor and viewer.
|
||||
|
||||
.. note::
|
||||
If you switch between light and dark mode on the GUI, you should also switch editor theme to
|
||||
match, otherwise icons may be hard to see in the editor and viewer.
|
||||
|
||||
|
||||
Project Search
|
||||
--------------
|
||||
|
||||
A global search tool is available from the side bar. It allows you to search through your entire
|
||||
project. The tool does not provide a replace feature. There is a search and replace tool available
|
||||
in the document editor that acts on the open document.
|
||||
|
||||
.. versionadded:: 2.4
|
||||
|
||||
|
||||
Switching Focus
|
||||
---------------
|
||||
|
||||
If the project or novel view does not have focus, pressing :kbd:`Ctrl+T` switches focus to
|
||||
whichever of the two is visible. If one of them already has focus, the key press will switch
|
||||
between them instead.
|
||||
|
||||
Likewise, pressing :kbd:`Ctrl+E` with switch focus to the document editor or viewer, or if any of
|
||||
them already have focus, it will switch focus between them,
|
||||
|
||||
These two shortcuts makes it possible to jump between all these GUI elements without having to
|
||||
reach for the mouse or touchpad.
|
||||
|
||||
|
||||
.. _a_breakdown_project:
|
||||
|
||||
Project Layout
|
||||
@@ -152,12 +180,12 @@ within those documents.
|
||||
|
||||
An illustration of how heading levels correspond to the novel structure.
|
||||
|
||||
The four heading levels (**H1** to **H4**) are treated as follows:
|
||||
The four heading levels, **Level 1** to **Level 4**, are treated as follows:
|
||||
|
||||
* **H1** is used for the novel 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.
|
||||
* **Level 1** is used for the novel title, and for partitions.
|
||||
* **Level 2** is used for chapter tiles.
|
||||
* **Level 3** is used for scene titles -- optionally replaced by separators.
|
||||
* **Level 4** 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.
|
||||
|
||||
@@ -178,25 +206,25 @@ Building a Manuscript
|
||||
=====================
|
||||
|
||||
The project can at any time be assembled into a range of different formats through the
|
||||
:guilabel:`Build Manuscript` tool. Natively, novelWriter supports `Open Document`_, HTML5, and
|
||||
**Build Manuscript** 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. The Open Document format
|
||||
is supported by most Office type applications. In addition, printing is also possible. Print to PDF
|
||||
is supported by most office type applications. In addition, printing is also possible. Print to PDF
|
||||
is available from the print dialog.
|
||||
|
||||
In addition, you can export the content of the project to a JSON file. This is useful if you want
|
||||
to write your own custom processing script in for instance Python, as the entire novel can be read
|
||||
into a Python dictionary with a couple of lines of code. The JSON file can be populated with either
|
||||
HTML formatted text, or with the raw text as typed into the novel documents.
|
||||
For advanced processing, you can export the content of the project to a JSON file. This is useful
|
||||
if you want to write your own custom processing script in for instance Python, as the entire novel
|
||||
can be read into a Python dictionary with a couple of lines of code. The JSON file can be populated
|
||||
with either HTML formatted text, or with the raw text as typed into the novel documents.
|
||||
|
||||
See :ref:`a_manuscript` for more details.
|
||||
|
||||
.. versionadded:: 2.1
|
||||
You can now define multiple build definitions in the :guilabel:`Build Manuscript` tool. This
|
||||
allows you to define specific settings for various types of draft documents, outline documents,
|
||||
and manuscript formats. See :ref:`a_manuscript` for more details.
|
||||
You can now define multiple build definitions in the **Build Manuscript** tool. This allows you
|
||||
to define specific settings for various types of draft documents, outline documents, and
|
||||
manuscript formats. See :ref:`a_manuscript` for more details.
|
||||
|
||||
|
||||
.. _a_breakdown_storage:
|
||||
|
||||
@@ -10,7 +10,7 @@ values and allowing for some text formatting. The syntax is based on Markdown, b
|
||||
(bold) and strike through text, as well as four levels of headings. For some further complex
|
||||
formatting needs, a set of shortcodes can be used.
|
||||
|
||||
In addition to formatting codes, novelWriter allows for comments, a synopsis tag, and a set of
|
||||
In addition to formatting codes, novelWriter allows for comments, a synopsis tag, and a number of
|
||||
keyword and value sets used for :term:`tags<tag>` and :term:`references<reference>`. There are also
|
||||
some codes that apply to whole paragraphs. See :ref:`a_fmt_text` for more details.
|
||||
|
||||
@@ -35,7 +35,7 @@ have a distinct colour, and the references themselves will get a colour if they
|
||||
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 from :guilabel:`Preferences`.
|
||||
can select them from **Preferences**.
|
||||
|
||||
|
||||
.. _a_fmt_head:
|
||||
@@ -54,6 +54,9 @@ correctly to produce the intended result. See :ref:`a_struct_heads` for more det
|
||||
|
||||
``# Title Text``
|
||||
Heading level one. For novel documents, the level indicates the start of a new partition.
|
||||
Partitions are for when you want to split your story into "Part 1", "Part 2", etc. You can also
|
||||
choose to use them for splitting the text up into acts, and then hide these headings in your
|
||||
manuscript.
|
||||
|
||||
``## Title Text``
|
||||
Heading level two. For novel documents, the level indicates the start of a new chapter. Chapter
|
||||
@@ -62,16 +65,17 @@ correctly to produce the intended result. See :ref:`a_struct_heads` for more det
|
||||
``### Title Text``
|
||||
Heading level three. For novel documents, the 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.
|
||||
can use the title field as a working title for your scenes if you wish, but you must provide a
|
||||
minimal title.
|
||||
|
||||
``#### Title Text``
|
||||
Heading level four. For novel documents, the level indicates the start of a new section. Section
|
||||
titles can be replaced by separators or ignored completely when building the manuscript.
|
||||
|
||||
For headings level one through three, adding a ``!`` modifies its meaning:
|
||||
For headings level one through three, adding a ``!`` modifies the meaning of the heading:
|
||||
|
||||
``#! Title Text``
|
||||
This tells the build tool that the level one heading is intended to be used for the novel's or
|
||||
This tells the build tool that the level one heading is intended to be used for the novel or
|
||||
notes folder'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.
|
||||
@@ -82,9 +86,10 @@ For headings level one through three, adding a ``!`` modifies its meaning:
|
||||
:ref:`a_struct_heads_unnum` for more details.
|
||||
|
||||
``###! Title Text``
|
||||
This is an alternative scene heading that can be formatted differently in the
|
||||
:guilabel:`Manuscript Build` tool. It is intended for separating "soft" and "hard" scene breaks.
|
||||
Otherwise, it behaves identically to a regular scene heading.
|
||||
This is an alternative scene heading that can be formatted differently in the **Manuscript
|
||||
Build** tool. It is intended for separating "soft" and "hard" scene breaks. Aside from this, it
|
||||
behaves identically to a regular scene heading. See :ref:`a_struct_heads_scenes` for more
|
||||
details.
|
||||
|
||||
.. note::
|
||||
The space after the ``#`` or ``!`` character is mandatory. The syntax highlighter will change
|
||||
@@ -106,8 +111,8 @@ In addition, the editor supports a few additional types of white spaces:
|
||||
* Thin spaces are also supported, and can be inserted with :kbd:`Ctrl+K`, :kbd:`Shift+Space`.
|
||||
* Non-breaking thin space can be inserted with :kbd:`Ctrl+K`, :kbd:`Ctrl+Space`.
|
||||
|
||||
These are all insert features, and the :guilabel:`Insert` menu has more. The keyboard shortcuts for
|
||||
them are also listed in :ref:`a_kb_ins`.
|
||||
These are all insert features, and the **Insert** menu has more. The keyboard shortcuts for them
|
||||
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.
|
||||
@@ -120,8 +125,8 @@ background, depending on the selected theme.
|
||||
|
||||
.. _a_fmt_emph:
|
||||
|
||||
Text Emphasis
|
||||
=============
|
||||
Text Emphasis with Markdown
|
||||
===========================
|
||||
|
||||
A minimal set of Markdown text emphasis styles are supported for text paragraphs.
|
||||
|
||||
@@ -129,12 +134,12 @@ A minimal set of Markdown text emphasis styles are supported for text paragraphs
|
||||
The text is rendered as emphasised text (italicised).
|
||||
|
||||
``**text**``
|
||||
The text is rendered as strongly important text (bold).
|
||||
The text is rendered as strongly emphasised text (bold).
|
||||
|
||||
``~~text~~``
|
||||
Strike through text.
|
||||
|
||||
In Markdown guides it is often recommended to differentiate between strong importance and emphasis
|
||||
In Markdown guides it is often recommended to differentiate between strong emphasis 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
|
||||
@@ -151,7 +156,7 @@ In addition, the following rules apply:
|
||||
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.
|
||||
5. Text emphasis can only be used in plain paragraphs. Comments, titles, and meta data tags don't
|
||||
5. Text emphasis can only be used in comments and paragraphs. Headings and meta data tags don't
|
||||
allow for formatting, and any formatting markup will be rendered as-is.
|
||||
|
||||
.. tip::
|
||||
@@ -163,8 +168,8 @@ In addition, the following rules apply:
|
||||
|
||||
.. _a_fmt_shortcodes:
|
||||
|
||||
Extended Formatting with Shortcodes
|
||||
===================================
|
||||
Formatting with Shortcodes
|
||||
==========================
|
||||
|
||||
For additional formatting options, you can use shortcodes. Shortcodes is a form of in-line codes
|
||||
that can be used to change the format of the text that follows and opening code, and last until
|
||||
@@ -182,14 +187,22 @@ solved with simple Markdown-like formatting codes. Available shortcodes are list
|
||||
"``[i]text[/i]``", "Text is rendered as italicised text."
|
||||
"``[s]text[/s]``", "Text is rendered as strike through text."
|
||||
"``[u]text[/u]``", "Text is rendered as underlined text."
|
||||
"``[m]text[/m]``", "Text is rendered as highlighted text."
|
||||
"``[sup]text[/sup]``", "Text is rendered as superscript text."
|
||||
"``[sub]text[/sub]``", "Text is rendered as subscript text."
|
||||
|
||||
Unlike Markdown style codes, these can be used anywhere within a paragraph. Even in the middle of a
|
||||
word if you need to. You can also freely combine them to form more complex formatting.
|
||||
|
||||
The shortcodes are available from the :guilabel:`Format` menu and in the editor toolbar, which can
|
||||
be activated by clicking the three dots in the editor header.
|
||||
The shortcodes are available from the **Format** menu and in the editor toolbar, which can be
|
||||
activated by clicking the left-most icon button in the editor header.
|
||||
|
||||
.. note::
|
||||
|
||||
Shortcodes are not processed until you generate a preview or generate a manuscript document. So
|
||||
there is no highlighting of the text between the formatting markers. There is also no check that
|
||||
your markers make sense. You must ensure that you have both the opening and closing formatting
|
||||
markers where you want them.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
@@ -199,30 +212,38 @@ be activated by clicking the three dots in the editor header.
|
||||
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.
|
||||
In addition to the above formatting features, novelWriter also allows for comments in documents.
|
||||
The text of a comment is always 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
|
||||
in a special manner 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.
|
||||
The first word of a comment, followed by a colon, can be one of a small set of modifiers that
|
||||
indicates the comment is intended for a specific purpose. For instance, if the comment starts with
|
||||
``Synopsis:``, the comment is treated in a special manner 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 ...``
|
||||
The different styles of comments are as follows:
|
||||
|
||||
``% Your comment text ...``
|
||||
This is a comment. The text is not rendered by default (this can be overridden), seen in the
|
||||
document viewer, or counted towards word counts.
|
||||
document viewer, or counted towards word counts. It is intended for you to make notes in your
|
||||
text for your own sake, whatever that may be, that isn't part of the story text. This is the
|
||||
general format of a comment.
|
||||
|
||||
``%Synopsis: text ...``
|
||||
``%Synopsis: Your synopsis text ...``
|
||||
This is a synopsis comment. It is generally treated in the same way as a regular comment, except
|
||||
that it is also captured by the indexing algorithm and displayed in the :ref:`a_ui_outline`. It
|
||||
can also be filtered separately when building the project to for instance generate an outline
|
||||
document of the whole project.
|
||||
|
||||
``%Short: text ...``
|
||||
``%Short: Your short description ...``
|
||||
This is a short description comment. It is identical to the synopsis comment (they are
|
||||
interchangeable), but is intended to be used for project notes. The text shows up in the
|
||||
Reference panel below the document viewer in the last column labelled
|
||||
:guilabel:`Short Description`.
|
||||
Reference panel below the document viewer in the last column labelled **Short Description**.
|
||||
|
||||
``%Footnote.<key>: Your footnote text ...``
|
||||
This is a special comment assigned to a footnote marker. See :ref:`a_fmt_footnote` for how to
|
||||
use them in your text.
|
||||
|
||||
.. note::
|
||||
Only one comment can be flagged as a synopsis or short comment for each heading. If multiple
|
||||
@@ -230,29 +251,87 @@ indicate this by altering the colour of the word.
|
||||
ignored.
|
||||
|
||||
|
||||
.. _a_fmt_footnote:
|
||||
|
||||
Footnotes
|
||||
=========
|
||||
|
||||
Footnotes are added with a shortcode, paired with a matching comment for the actual footnote text.
|
||||
The matching is done with a key that links the two. If you insert a footnote from the **Insert**
|
||||
menu, a unique key is generated for you.
|
||||
|
||||
The insert feature will add the footnote shortcode marker at the position of your cursor in the
|
||||
text, and create the associated footnote comment right after the paragraph, and move the cursor
|
||||
there so you can immediately start typing the footnote text.
|
||||
|
||||
The footnote comment can be anywhere in the document, so if you wish to move them to, say, the
|
||||
bottom of the text, you are free to do so.
|
||||
|
||||
Footnote keys are only required to be unique within a document, so if you copy, move or merge text,
|
||||
you must make sure the keys are not duplicated. If you use the automatically generated keys from
|
||||
the **Insert** menu, they are unique among all indexed documents. They are not guaranteed to be
|
||||
unique against footnotes in the Archive or Trash folder though, but the chance of accidentally
|
||||
generating the same key twice in a project is relatively small in the first place (1 in 810 000).
|
||||
|
||||
This is what a footnote inserted into a paragraph may look like when completed:
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
This is a text paragraph with a footnote[footnote:fn1] in the middle.
|
||||
|
||||
%Footnote.fn1: This is the text of the footnote.
|
||||
|
||||
.. versionadded:: 2.5
|
||||
|
||||
|
||||
.. _a_fmt_ignore:
|
||||
|
||||
Ignored Text
|
||||
============
|
||||
|
||||
If you want to completely ignore some of the text in your documents, but are not ready to delete
|
||||
it, you can add ``%~`` before the text paragraph or line. This will cause novelWriter to skip the
|
||||
text entirely when generating previews or building manuscripts.
|
||||
|
||||
This is a better way of removing text than converting them to regular comments, as you may want to
|
||||
include regular comments in your previews or draft manuscript.
|
||||
|
||||
You can toggle the ignored text feature on and off for a paragraph by pressing :kbd:`Ctrl+Shift+D`
|
||||
on your keyboard with your cursor somewhere in the paragraph.
|
||||
|
||||
Example:
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
%~ This text is ignored.
|
||||
|
||||
This text is a regular paragraph.
|
||||
|
||||
|
||||
.. _a_fmt_tags:
|
||||
|
||||
Tags and References
|
||||
===================
|
||||
|
||||
The document editor supports a set of keywords used for setting tags, and making references between
|
||||
documents.
|
||||
documents based on those tags.
|
||||
|
||||
Tags use the keyword ``@tag:`` to define a tag. 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.
|
||||
You must use the keyword ``@tag:`` to define a tag. 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.
|
||||
|
||||
``@tag: value``
|
||||
A tag keyword followed by the tag value, like for instance the name of a character.
|
||||
|
||||
References can be set anywhere within a section, and are collected according to their category.
|
||||
References are in the form:
|
||||
References are on the form:
|
||||
|
||||
``@keyword: value``
|
||||
``@keyword: value1, value2, ..., valueN``
|
||||
A reference keyword followed by a value, or a comma separated list of values.
|
||||
|
||||
Tags and references are covered in detail in the :ref:`a_references` chapter. The keywords can be
|
||||
inserted at the cursor position in the editor via the :guilabel:`Insert` menu. If you start typing
|
||||
an ``@`` on a new line, and auto-complete menu will also pop up suggesting keywords.
|
||||
inserted at the cursor position in the editor via the **Insert** menu. If you start typing an ``@``
|
||||
on a new line, and auto-complete menu will also pop up suggesting keywords.
|
||||
|
||||
|
||||
.. _a_fmt_align:
|
||||
@@ -260,8 +339,8 @@ an ``@`` on a new line, and auto-complete menu will also pop up suggesting keywo
|
||||
Paragraph Alignment and Indentation
|
||||
===================================
|
||||
|
||||
All documents have the text by default aligned to the left or justified, depending on your
|
||||
settings in :guilabel:`Preferences`.
|
||||
All documents have the text by default aligned to the left or justified, depending on your setting
|
||||
in **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
|
||||
@@ -291,11 +370,49 @@ Examples:
|
||||
from the manuscript build tool as long as the format supports paragraph alignment.
|
||||
|
||||
|
||||
Alignment with Line Breaks
|
||||
--------------------------
|
||||
|
||||
If you have line breaks in the paragraph, like for instance when you are writing verses, the
|
||||
alignment markers must be applied to the first line. Markers on the other lines are ignored. The
|
||||
markers for the first line are used for all the other lines.
|
||||
|
||||
For the following text, all lines will be centred, not just the first:
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
>> I am the very model of a modern Major-General <<
|
||||
I've information vegetable, animal, and mineral
|
||||
I know the kings of England, and I quote the fights historical
|
||||
From Marathon to Waterloo, in order categorical
|
||||
|
||||
|
||||
Alignment with First Line Indent
|
||||
--------------------------------
|
||||
|
||||
If you have first line indent enabled in your Manuscript build settings, you probably want to
|
||||
disable it for text in verses. Adding any alignment tags will cause the first line indent to be
|
||||
switched off for that paragraph.
|
||||
|
||||
The following text will always be aligned against the left margin:
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
I am the very model of a modern Major-General <<
|
||||
I've information vegetable, animal, and mineral
|
||||
I know the kings of England, and I quote the fights historical
|
||||
From Marathon to Waterloo, in order categorical
|
||||
|
||||
|
||||
.. _a_fmt_break:
|
||||
|
||||
Vertical Space and Page Breaks
|
||||
==============================
|
||||
|
||||
You can apply page breaks to partition, chapter and scene headings for novel documents from the
|
||||
**Manuscript Build** tool. If you need to add a page break or additional vertical spacing in other
|
||||
places, there are special codes available for this purpose.
|
||||
|
||||
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.
|
||||
@@ -303,13 +420,8 @@ paragraphs when building the project. To add additional space between paragraphs
|
||||
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 manuscript build tool will insert a page break before all headings of level one and
|
||||
for all headings 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.
|
||||
|
||||
If you want page breaks for scenes and sections, you must add them manually.
|
||||
If you need to add a page break somewhere, put the text ``[new page]`` on a line by itself before
|
||||
the text you wish to start on a new page.
|
||||
|
||||
.. note::
|
||||
The page break code is applied to the text that follows it. It adds a "page break before" mark
|
||||
@@ -325,8 +437,8 @@ If you want page breaks for scenes and sections, you must add them manually.
|
||||
[vspace:2]
|
||||
|
||||
This is another text paragraph, but there will be two empty paragraphs
|
||||
in-between them.
|
||||
between them.
|
||||
|
||||
[new page]
|
||||
|
||||
This text will always start on a new page if the build format has pages.
|
||||
This text will start on a new page if the build format has pages.
|
||||
|
||||
@@ -8,7 +8,7 @@ This chapter covers in more detail the different project views available in nove
|
||||
|
||||
.. figure:: images/fig_project_tree_detailed.png
|
||||
|
||||
The Project Tree as it appears when loading a sample project.
|
||||
The **Project Content** tree as it appears when loading a sample project.
|
||||
|
||||
|
||||
.. _a_ui_tree:
|
||||
@@ -21,33 +21,32 @@ 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.
|
||||
label is not the same as the heading 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 heading 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 sub-documents. If the counts seem incorrect, they can be updated
|
||||
by rebuilding the :term:`project index` from the :guilabel:`Tools` menu, or by pressing
|
||||
:kbd:`F9`.
|
||||
by rebuilding the :term:`project index` from the **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 Manuscript` tool, you can
|
||||
include or exclude documents based on this flag. You can change this value from the
|
||||
considered an active part of it. When you run the **Build Manuscript** tool, you can include or
|
||||
exclude documents based on this flag. You can change this value from the right-click
|
||||
:term:`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 on how to uses these labels. You can
|
||||
change these labels from the :term:`context menu`.
|
||||
select these labels from the :term:`context menu`, and define them in **Project Settings**.
|
||||
|
||||
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.
|
||||
At the top of the project 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
|
||||
:term:`root folders<root folder>` in your project. Selecting one will move to that position in
|
||||
@@ -55,7 +54,8 @@ At the top of the tree, you will find a set of buttons.
|
||||
* 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+N`.
|
||||
folders and template documents. You can also activate this dropdown menu by pressing
|
||||
:kbd:`Ctrl+N`.
|
||||
* The last button is a menu of further actions you can apply to the project tree.
|
||||
|
||||
Below the project tree you will find a small details panel showing the full information of the
|
||||
@@ -73,10 +73,10 @@ addition to the word count.
|
||||
Splitting and Merging Documents
|
||||
-------------------------------
|
||||
|
||||
Under the :guilabel:`Transform` submenu in the context menu of an item in the project tree, you
|
||||
will find several options on how to change a document or folder. This includes changing between
|
||||
document and note, but also splitting them into multiple documents, or merging child items into a
|
||||
single document.
|
||||
Under the **Transform** submenu in the context menu of an item in the project tree, you will find
|
||||
several options on how to change a document or folder. This includes changing between document and
|
||||
note, but also splitting them into multiple documents, or merging child items into a single
|
||||
document.
|
||||
|
||||
|
||||
Splitting Documents
|
||||
@@ -84,12 +84,12 @@ Splitting Documents
|
||||
|
||||
.. figure:: images/fig_project_split_tool.png
|
||||
|
||||
The :guilabel:`Split Document` dialog.
|
||||
The **Split Document** dialog.
|
||||
|
||||
The :guilabel:`Split Document by Heading` option will open a dialog that allows you to split the
|
||||
selected document into multiple new documents based on the headings it contains. You can select at
|
||||
which heading level the split is to be performed from the dropdown box. The list box will preview
|
||||
which headings will be split into new documents.
|
||||
The **Split Document by Headings** option will open a dialog that allows you to split the selected
|
||||
document into multiple new documents based on the headings it contains. You can select at which
|
||||
heading level the split is to be performed from the dropdown box. The list box will preview which
|
||||
headings will be split into new documents.
|
||||
|
||||
You are given the option to create a folder for these new documents, and whether or not to create a
|
||||
hierarchy of documents. That is, put sections under scenes, and scenes under chapters.
|
||||
@@ -103,18 +103,18 @@ Merging Documents
|
||||
|
||||
.. figure:: images/fig_project_merge_tool.png
|
||||
|
||||
The :guilabel:`Merge Documents` dialog.
|
||||
The **Merge Documents** dialog.
|
||||
|
||||
You have two options for merging documents that are child elements of another document. You can
|
||||
either :guilabel:`Merge Child Items into Self` and :guilabel:`Merge Child Items into New`. The
|
||||
first option will pull all content of child items and merge them into the parent document, while
|
||||
the second option will create a new document in the process.
|
||||
either **Merge Child Items into Self** and **Merge Child Items into New**. The first option will
|
||||
pull all content of child items and merge them into the parent document, while the second option
|
||||
will create a new document in the process.
|
||||
|
||||
When merging documents in a folder, you only have the latter process is possible, so only the
|
||||
choice :guilabel:`Merge Documents in Folder` is available.
|
||||
choice **Merge Documents in Folder** is available.
|
||||
|
||||
In either case, the :guilabel:`Merge Documents` dialog will let you exclude documents you don't
|
||||
want to include, and it also lets you reorder them if you wish.
|
||||
In either case, the **Merge Documents** dialog will let you exclude documents you don't want to
|
||||
include, and it also lets you reorder them if you wish.
|
||||
|
||||
|
||||
.. _a_ui_tree_status:
|
||||
@@ -124,14 +124,14 @@ 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, and novelWriter doesn't use them for anything. To
|
||||
modify the labels, go to their respective tabs in :guilabel:`Project Settings`.
|
||||
modify the labels, go to their respective tabs in **Project Settings**.
|
||||
|
||||
The "Status" flag is intended to tag a :term:`novel document<novel documents>` as for instance a
|
||||
draft or as completed, and the "Importance" flag is intended to tag character notes, or other
|
||||
:term:`project notes`, as for instance a main, major, or minor character or story element.
|
||||
|
||||
Whether a document uses a "Status" or "Importance" flag depends on which :term:`root folder` it
|
||||
lives in. If it's in a Novel type folder, it uses the "Status" flag, otherwise it uses an
|
||||
lives in. If it's in a **Novel** type folder, it uses the "Status" flag, otherwise it uses an
|
||||
"Importance" flag.
|
||||
|
||||
|
||||
@@ -142,7 +142,7 @@ 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 :guilabel:`Manuscript Build` tool.
|
||||
your manuscript in the **Manuscript Build** tool.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
You can now select multiple items in the project tree by holding down the :kbd:`Ctrl` or
|
||||
@@ -150,14 +150,15 @@ your manuscript in the :guilabel:`Manuscript Build` tool.
|
||||
|
||||
You can drag and drop documents and regular folders, but not root folders. If you select multiple
|
||||
items, they can only be dragged and dropped if they are siblings. That is, they have the same
|
||||
parent item in the project. This is due to the way drag and drop is implemented in the user
|
||||
interface framework novelWriter is built upon.
|
||||
parent item in the project. This limitation is due to the way drag and drop is implemented in the
|
||||
user interface framework novelWriter is built upon.
|
||||
|
||||
Documents and their folders can be rearranged freely within their root folders. If you move a Novel
|
||||
document out of a Novel folder, it will be converted to a project note. Notes can be moved freely
|
||||
between all root folders, but keep in mind that if you move a note into a Novel type 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.
|
||||
Documents and their folders can be rearranged freely within their root folders. If you move a
|
||||
**Novel Document** out of a **Novel** folder, it will be converted to a **Project Note**. Notes can
|
||||
be moved freely between all root folders, but keep in mind that if you move a note into a **Novel**
|
||||
type root folder, its "Importance" setting will be switched with a "Status" setting. See
|
||||
:ref:`a_ui_tree_status`. The old value will not be overwritten though, and should be restored if
|
||||
you move it back at some point.
|
||||
|
||||
Root folders in the project tree cannot be dragged and dropped at all. If you want to reorder them,
|
||||
you can move them up or down with respect to each other from the arrow buttons at the top of the
|
||||
@@ -175,8 +176,8 @@ The Novel Tree View
|
||||
|
||||
An alternative way to view the project structure is the novel view. You can switch to this view by
|
||||
selecting the :guilabel:`Novel View` button in the sidebar. This view is a simplified version of
|
||||
the view in the :guilabel:`Outline View`. It is convenient when you want to browse the structure
|
||||
of the story itself rather than the document files.
|
||||
the view in the **Outline View**. 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 view, or add any new documents, as that would
|
||||
@@ -194,14 +195,14 @@ The Novel Outline View
|
||||
|
||||
A screenshot of the Novel Outline View.
|
||||
|
||||
The project's :guilabel:`Novel Outline View` is available as another view option from the sidebar.
|
||||
The outline provides an overview of the novel structure, displaying a tree hierarchy of the
|
||||
elements of the novel, that is, the level 1 to 4 headings representing partitions, chapters, scenes
|
||||
and sections.
|
||||
The project's **Novel Outline View** is available as another view option from the sidebar. 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 the heading is defined. Double-clicking an entry will open the corresponding document
|
||||
in the editor and switch to :guilabel:`Project Tree View` mode.
|
||||
in the editor and switch to **Project Tree View** mode.
|
||||
|
||||
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.
|
||||
@@ -217,7 +218,7 @@ the menu button in the toolbar. The order of the columns can also be rearranged
|
||||
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 **Title** column cannot be disabled or moved.
|
||||
|
||||
The information viewed in the outline is based on the :term:`project index`. While novelWriter does
|
||||
its best to keep the index up to date when contents change, you can always rebuild it manually by
|
||||
@@ -226,5 +227,5 @@ 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`.
|
||||
The **Synopsis** column of the outline view takes its information from a specially formatted
|
||||
comment. See :ref:`a_fmt_comm`.
|
||||
|
||||
@@ -20,22 +20,22 @@ Main Window Shortcuts
|
||||
:header: "Shortcut", "Description"
|
||||
|
||||
":kbd:`F1`", "Open the online user manual"
|
||||
":kbd:`F5`", "Open the :guilabel:`Build Manuscript` tool"
|
||||
":kbd:`F6`", "Open the :guilabel:`Writing Statistics` tool"
|
||||
":kbd:`F8`", "Toggle :guilabel:`Focus Mode`"
|
||||
":kbd:`F5`", "Open the **Build Manuscript** tool"
|
||||
":kbd:`F6`", "Open the **Writing Statistics** tool"
|
||||
":kbd:`F8`", "Toggle **Focus Mode**"
|
||||
":kbd:`F9`", "Re-build the project's index"
|
||||
":kbd:`F11`", "Toggle full screen mode"
|
||||
":kbd:`Ctrl+,`", "Open the :guilabel:`Preferences` dialog"
|
||||
":kbd:`Ctrl+E`", "Switch focus to the document editor"
|
||||
":kbd:`Ctrl+,`", "Open the **Preferences** dialog"
|
||||
":kbd:`Ctrl+E`", "Switch or toggle focus for the editor or viewer"
|
||||
":kbd:`Ctrl+T`", "Switch or toggle focus for the project tree or novel view"
|
||||
":kbd:`Ctrl+Q`", "Exit novelWriter"
|
||||
":kbd:`Ctrl+Shift+,`", "Open the :guilabel:`Project Settings` dialog"
|
||||
":kbd:`Ctrl+Shift+,`", "Open the **Project Settings** dialog"
|
||||
":kbd:`Ctrl+Shift+O`", "Open the Welcome dialog to open or create a project"
|
||||
":kbd:`Ctrl+Shift+S`", "Save the current project"
|
||||
":kbd:`Ctrl+Shift+T`", "Switch focus to the outline view"
|
||||
":kbd:`Ctrl+Shift+W`", "Close the current project"
|
||||
":kbd:`Shift+F1`", "Open the local user manual (PDF) if it is available"
|
||||
":kbd:`Shift+F6`", "Open the :guilabel:`Project Details` dialog"
|
||||
":kbd:`Shift+F6`", "Open the **Project Details** dialog"
|
||||
|
||||
|
||||
.. _a_kb_tree:
|
||||
@@ -53,8 +53,8 @@ Project Tree Shortcuts
|
||||
":kbd:`Alt+Left`", "Jump to the parent item in the tree"
|
||||
":kbd:`Alt+Right`", "Jump to the first child item in the project tree"
|
||||
":kbd:`Ctrl+.`", "Open the context menu on the selected item"
|
||||
":kbd:`Ctrl+L`", "Open the :guilabel:`Quick Links` menu"
|
||||
":kbd:`Ctrl+N`", "Open the :guilabel:`Create New Item` menu"
|
||||
":kbd:`Ctrl+L`", "Open the **Quick Links** menu"
|
||||
":kbd:`Ctrl+N`", "Open the **Create New Item** menu"
|
||||
":kbd:`Ctrl+O`", "Open the selected document in the editor"
|
||||
":kbd:`Ctrl+R`", "Open the selected document in the viewer"
|
||||
":kbd:`Ctrl+Up`", "Move selected item one step up in the tree"
|
||||
@@ -75,11 +75,12 @@ Text Search Shortcuts
|
||||
:header: "Shortcut", "Description"
|
||||
|
||||
":kbd:`F3`", "Find the next occurrence of the search word"
|
||||
":kbd:`Ctrl+F`", "Open the search bar and search for the selected word, if any is selected"
|
||||
":kbd:`Ctrl+F`", "Open search and look for the selected word"
|
||||
":kbd:`Ctrl+G`", "Find the next occurrence of the search word"
|
||||
":kbd:`Ctrl+H`", "Open the search tool and populate with the selected word (Mac :kbd:`Cmd+=`)"
|
||||
":kbd:`Ctrl+Shift+1`", "Replace selected occurrence of the search word, and move to the next"
|
||||
":kbd:`Ctrl+H`", "Open replace and look for the selected word (Mac :kbd:`Cmd+=`)"
|
||||
":kbd:`Ctrl+Shift+1`", "Replace selected occurrence, and move to the next"
|
||||
":kbd:`Ctrl+Shift+G`", "Find the previous occurrence of the search word"
|
||||
":kbd:`Ctrl+Shift+F`", "Open project search and look for the selected word"
|
||||
":kbd:`Shift+F3`", "Find the previous occurrence of the search word"
|
||||
|
||||
|
||||
@@ -91,8 +92,8 @@ Text Formatting Shortcuts
|
||||
|
||||
":kbd:`Ctrl+'`", "Wrap selected text, or word under cursor, in single quotes"
|
||||
":kbd:`Ctrl+""`", "Wrap selected text, or word under cursor, in double quotes"
|
||||
":kbd:`Ctrl+/`", "Toggle block format as comment for block under cursor, or selected text"
|
||||
":kbd:`Ctrl+0`", "Remove block formatting for block under cursor, or selected text"
|
||||
":kbd:`Ctrl+/`", "Toggle comment format for block or selected text"
|
||||
":kbd:`Ctrl+0`", "Remove format for block or selected text"
|
||||
":kbd:`Ctrl+1`", "Change block format to heading level 1"
|
||||
":kbd:`Ctrl+2`", "Change block format to heading level 2"
|
||||
":kbd:`Ctrl+3`", "Change block format to heading level 3"
|
||||
@@ -102,11 +103,11 @@ Text Formatting Shortcuts
|
||||
":kbd:`Ctrl+7`", "Change block alignment to right-aligned"
|
||||
":kbd:`Ctrl+8`", "Add a left margin to the block"
|
||||
":kbd:`Ctrl+9`", "Add a right margin to the block"
|
||||
":kbd:`Ctrl+B`", "Format selected text, or word under cursor, with strong emphasis (bold)"
|
||||
":kbd:`Ctrl+B`", "Format selected text, or word under cursor, with bold"
|
||||
":kbd:`Ctrl+D`", "Format selected text, or word under cursor, with strike through"
|
||||
":kbd:`Ctrl+I`", "Format selected text, or word under cursor, with emphasis (italic)"
|
||||
":kbd:`Ctrl+Shift+/`", "Remove block formatting for block under cursor, or selected text"
|
||||
":kbd:`Ctrl+Shift+D`", "Toggle block format as ignored text for block under cursor, or selected text"
|
||||
":kbd:`Ctrl+I`", "Format selected text, or word under cursor, with italic"
|
||||
":kbd:`Ctrl+Shift+/`", "Remove format for block or selected text"
|
||||
":kbd:`Ctrl+Shift+D`", "Toggle ignored text format for block or selected text"
|
||||
|
||||
|
||||
Other Editor Shortcuts
|
||||
|
||||
@@ -11,7 +11,7 @@ Typographical Notes
|
||||
|
||||
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
|
||||
thin spaces, etc. All these symbols are available from the **Insert** menu, and via
|
||||
keyboard shortcuts. See :ref:`a_kb_ins`.
|
||||
|
||||
This chapter provides some additional information on how novelWriter handles these symbols.
|
||||
@@ -43,22 +43,22 @@ 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 :guilabel:`Preferences`.
|
||||
settings can be found in **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
|
||||
:guilabel:`Preferences` if this feature isn't wanted.
|
||||
**Preferences** if this feature isn't wanted.
|
||||
|
||||
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
|
||||
are not using the chosen quote symbols. Two convenience functions in the **Format** menu
|
||||
can be used to re-format a selected section of text with the correct quote symbols.
|
||||
|
||||
|
||||
Single and Double Prime
|
||||
------------------------
|
||||
|
||||
Both single and double prime symbols are available in the :guilabel:`Insert` menu. These symbols
|
||||
Both single and double prime symbols are available in the **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 rendered similarly by the font, but they have different
|
||||
@@ -79,7 +79,7 @@ right single quotation marks, depending on the font. There is a Wikipedia articl
|
||||
`Modifier letter apostrophe`_ with more details.
|
||||
|
||||
.. note::
|
||||
On export with the :guilabel:`Build Manuscript` tool, these apostrophes will be replaced
|
||||
On export with the **Build Manuscript** tool, these apostrophes will be replaced
|
||||
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 syntax highlighting.
|
||||
|
||||
|
||||
@@ -23,13 +23,14 @@ having it selected. This will open the document in the document editor. The edit
|
||||
Markdown-like syntax for some features, and a novelWriter-specific syntax for others. The syntax
|
||||
format is described in the :ref:`a_fmt` chapter.
|
||||
|
||||
The editor has a maximise button (toggles the :guilabel:`Focus Mode`) and a close button in the
|
||||
The editor has a maximise button, which toggles the **Focus Mode**, and a close button in the
|
||||
top--right corner. On the top--left side you will find a tools button that opens a toolbar with a
|
||||
few buttons for applying text formatting, and a search button to open the search dialog.
|
||||
few buttons for applying text formatting, a drop down menu for navigating between headings, and a
|
||||
search button to open the search dialog.
|
||||
|
||||
Both the document editor and viewer will show the label of the currently open document in the
|
||||
header at the top of the edit or view panel. Optionally, the full project path to the document can
|
||||
be shown. This can be set in :guilabel:`Preferences`.
|
||||
be shown. This can be set in **Preferences**.
|
||||
|
||||
.. tip::
|
||||
Clicking on the document title bar will select the document in the project tree and thus reveal
|
||||
@@ -42,10 +43,10 @@ the label and pressing :kbd:`Ctrl+Return`. You can also control-click them with
|
||||
Editor Auto-Completer
|
||||
---------------------
|
||||
|
||||
If you type the character ``@`` on a new line, a menu will appear showing the different available
|
||||
keywords. The list will shorten as you type. Once a keyword command has been selected or typed, the
|
||||
editor may suggest further content based on your project content. See :ref:`a_references_completer`
|
||||
for more details.
|
||||
If you type the character ``@`` on a new line, a pop-up menu will appear showing the different
|
||||
available keywords. The list will shorten as you type. Once a keyword command has been selected or
|
||||
typed, the editor may suggest further options based on your project content. See
|
||||
:ref:`a_references_completer` for more details.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
|
||||
@@ -60,9 +61,9 @@ Viewing a Document
|
||||
A screenshot of the Document Viewer panel.
|
||||
|
||||
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+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.
|
||||
viewer. To view a document, press :kbd:`Ctrl+R`, or select **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 the one currently being edited.
|
||||
However, If you *are* viewing the same document, pressing :kbd:`Ctrl+R` again will update the
|
||||
@@ -75,19 +76,20 @@ 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.
|
||||
browser. The left-most button is a dropdown menu for quickly navigation between headings in the
|
||||
document.
|
||||
|
||||
At the bottom of the view panel there is a :guilabel:`References` panel. (If it is hidden, click
|
||||
the button on the left side of the footer area to reveal it.) This panel contains a References tab
|
||||
with links to all documents referring back to the one you're currently viewing, if any has been
|
||||
defined. If you have created root folders and tags for various story elements like characters and
|
||||
plot points, these will appear as additional tabs in this panel.
|
||||
At the bottom of the view panel there is a **References** panel. (If it is hidden, click the button
|
||||
on the left side of the footer area to reveal it.) This panel contains a References tab with links
|
||||
to all documents referring back to the one you're currently viewing, if any has been defined. If
|
||||
you have created root folders and tags for various story elements like characters and plot points,
|
||||
these will appear as additional tabs in this panel.
|
||||
|
||||
.. note::
|
||||
The :guilabel:`References` panel relies on an up-to-date :term:`index<project index>` of the
|
||||
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`.
|
||||
The **References** panel relies on an up-to-date :term:`index<project 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 **Rebuild Index** from the **Tools** menu, or by
|
||||
pressing :kbd:`F9`.
|
||||
|
||||
.. versionadded:: 2.2
|
||||
The reference panel was redesigned and the additional tabs added.
|
||||
@@ -131,8 +133,7 @@ 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.
|
||||
auto-replace feature from **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
|
||||
|
||||
2177
i18n/nw_base.ts
2415
i18n/nw_de_DE.ts
2419
i18n/nw_en_US.ts
2437
i18n/nw_es_419.ts
2439
i18n/nw_fr_FR.ts
2405
i18n/nw_it_IT.ts
2491
i18n/nw_ja_JP.ts
2409
i18n/nw_nb_NO.ts
2409
i18n/nw_nl_NL.ts
4988
i18n/nw_pl_PL.ts
Normal file
5331
i18n/nw_pt_BR.ts
4265
i18n/nw_zh_CN.ts
@@ -47,19 +47,3 @@ 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")
|
||||
|
||||
@@ -23,16 +23,21 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
import getopt
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from PyQt5.QtWidgets import QApplication, QErrorMessage
|
||||
|
||||
from novelwriter.error import exceptionHandler, logException
|
||||
from novelwriter.config import Config
|
||||
from novelwriter.error import exceptionHandler
|
||||
from novelwriter.shared import SharedData
|
||||
|
||||
if TYPE_CHECKING: # pragma: no cover
|
||||
from novelwriter.guimain import GuiMain
|
||||
|
||||
# Package Meta
|
||||
# ============
|
||||
|
||||
@@ -42,9 +47,9 @@ __license__ = "GPLv3"
|
||||
__author__ = "Veronica Berglyd Olsen"
|
||||
__maintainer__ = "Veronica Berglyd Olsen"
|
||||
__email__ = "code@vkbo.net"
|
||||
__version__ = "2.4rc1"
|
||||
__hexversion__ = "0x020400c1"
|
||||
__date__ = "2024-04-06"
|
||||
__version__ = "2.5"
|
||||
__hexversion__ = "0x020500f0"
|
||||
__date__ = "2024-07-10"
|
||||
__status__ = "Stable"
|
||||
__domain__ = "novelwriter.io"
|
||||
|
||||
@@ -60,7 +65,7 @@ CONFIG = Config()
|
||||
SHARED = SharedData()
|
||||
|
||||
|
||||
def main(sysArgs: list | None = None):
|
||||
def main(sysArgs: list | None = None) -> GuiMain | None:
|
||||
"""Parse command line, set up logging, and launch main GUI."""
|
||||
if sysArgs is None:
|
||||
sysArgs = sys.argv[1:]
|
||||
@@ -157,19 +162,19 @@ def main(sysArgs: list | None = None):
|
||||
# Check Packages and Versions
|
||||
errorData = []
|
||||
errorCode = 0
|
||||
if sys.hexversion < 0x030800f0:
|
||||
if sys.hexversion < 0x030900f0:
|
||||
errorData.append(
|
||||
"At least Python 3.8 is required, found %s" % CONFIG.verPyString
|
||||
"At least Python 3.9 is required, found %s" % CONFIG.verPyString
|
||||
)
|
||||
errorCode |= 0x04
|
||||
if CONFIG.verQtValue < 0x050a00:
|
||||
if CONFIG.verQtValue < 0x050f00:
|
||||
errorData.append(
|
||||
"At least Qt5 version 5.10 is required, found %s" % CONFIG.verQtString
|
||||
"At least Qt5 version 5.15.0 is required, found %s" % CONFIG.verQtString
|
||||
)
|
||||
errorCode |= 0x08
|
||||
if CONFIG.verPyQtValue < 0x050a00:
|
||||
if CONFIG.verPyQtValue < 0x050f00:
|
||||
errorData.append(
|
||||
"At least PyQt5 version 5.10 is required, found %s" % CONFIG.verPyQtString
|
||||
"At least PyQt5 version 5.15.0 is required, found %s" % CONFIG.verPyQtString
|
||||
)
|
||||
errorCode |= 0x10
|
||||
|
||||
@@ -193,50 +198,46 @@ def main(sysArgs: list | None = None):
|
||||
# Finish initialising config
|
||||
CONFIG.initConfig(confPath, dataPath)
|
||||
|
||||
if CONFIG.osDarwin:
|
||||
if sys.platform == "darwin":
|
||||
try:
|
||||
from Foundation import NSBundle # type: ignore
|
||||
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:
|
||||
pass # Quietly ignore error
|
||||
elif sys.platform == "win32":
|
||||
try:
|
||||
import ctypes
|
||||
appID = f"io.novelwriter.{__version__}"
|
||||
ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(appID) # type: ignore
|
||||
except Exception:
|
||||
logger.error("Failed to set application name")
|
||||
logException()
|
||||
pass # Quietly ignore error
|
||||
|
||||
# Import GUI (after dependency checks), and launch
|
||||
from novelwriter.guimain import GuiMain
|
||||
|
||||
if testMode:
|
||||
nwGUI = GuiMain()
|
||||
return nwGUI
|
||||
# Only used for testing where the test framework creates the app
|
||||
CONFIG.loadConfig()
|
||||
return GuiMain()
|
||||
|
||||
else:
|
||||
nwApp = QApplication([CONFIG.appName, (f"-style={qtStyle}")])
|
||||
nwApp.setApplicationName(CONFIG.appName)
|
||||
nwApp.setApplicationVersion(__version__)
|
||||
nwApp.setOrganizationDomain(__domain__)
|
||||
nwApp.setOrganizationName(__domain__)
|
||||
nwApp.setDesktopFileName(CONFIG.appName)
|
||||
app = QApplication([CONFIG.appName, (f"-style={qtStyle}")])
|
||||
app.setApplicationName(CONFIG.appName)
|
||||
app.setApplicationVersion(__version__)
|
||||
app.setOrganizationDomain(__domain__)
|
||||
app.setOrganizationName(__domain__)
|
||||
app.setDesktopFileName(CONFIG.appName)
|
||||
|
||||
# Connect the exception handler before making the main GUI
|
||||
sys.excepthook = exceptionHandler
|
||||
# Connect the exception handler before making the main GUI
|
||||
sys.excepthook = exceptionHandler
|
||||
|
||||
# Run Config steps that require the QApplication
|
||||
CONFIG.initLocalisation(nwApp)
|
||||
CONFIG.setTextFont(CONFIG.textFont, CONFIG.textSize) # Makes sure these are valid
|
||||
# Run Config steps that require the QApplication
|
||||
CONFIG.loadConfig()
|
||||
CONFIG.initLocalisation(app)
|
||||
|
||||
# Launch main GUI
|
||||
nwGUI = GuiMain()
|
||||
nwGUI.postLaunchTasks(cmdOpen)
|
||||
# Launch main GUI
|
||||
nwGUI = GuiMain()
|
||||
nwGUI.postLaunchTasks(cmdOpen)
|
||||
|
||||
sys.exit(nwApp.exec())
|
||||
|
||||
# END Function main
|
||||
sys.exit(app.exec())
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"Synopsis": "Synopsis",
|
||||
"Short Description": "Short Description",
|
||||
"Footnotes": "Footnotes",
|
||||
"Comment": "Comment",
|
||||
"Notes": "Notes",
|
||||
"Tag": "Tag",
|
||||
|
||||
116
novelwriter/assets/i18n/project_pl_PL.json
Normal file
@@ -0,0 +1,116 @@
|
||||
{
|
||||
"Synopsis": "Streszczenie",
|
||||
"Short Description": "Krótki opis",
|
||||
"Comment": "Komentarz",
|
||||
"Notes": "Notatki",
|
||||
"Tag": "Znacznik",
|
||||
"Point of View": "Punkt widzenia",
|
||||
"Focus": "Skupienie",
|
||||
"Characters": "Postacie",
|
||||
"Plot": "Fabuła",
|
||||
"Timeline": "Oś czasu",
|
||||
"Locations": "Miejsca",
|
||||
"Objects": "Obiekty",
|
||||
"Entities": "Podmioty",
|
||||
"Custom": "Różne",
|
||||
"0": "zero",
|
||||
"1": "pierwszy",
|
||||
"2": "drugi",
|
||||
"3": "trzeci",
|
||||
"4": "czwarty",
|
||||
"5": "piąty",
|
||||
"6": "szósty",
|
||||
"7": "siódmy",
|
||||
"8": "ósmy",
|
||||
"9": "dziewiąty",
|
||||
"10": "dziesiąty",
|
||||
"11": "jedenasty",
|
||||
"12": "dwunasty",
|
||||
"13": "trzynasty",
|
||||
"14": "czternasty",
|
||||
"15": "piętnasty",
|
||||
"16": "szesnasty",
|
||||
"17": "siedemnasty",
|
||||
"18": "osiemnasty",
|
||||
"19": "dziewiętnasty",
|
||||
"20": "dwudziesty",
|
||||
"21": "dwudziesty pierwszy",
|
||||
"22": "dwudziesty drugi",
|
||||
"23": "dwudziesty Trzeci",
|
||||
"24": "dwudziesty czwarty",
|
||||
"25": "dwudziesty piąty",
|
||||
"26": "dwudziesty szósty",
|
||||
"27": "dwudziesty siódmy",
|
||||
"28": "dwudziesty ósmy",
|
||||
"29": "dwudziesty dziewiąty",
|
||||
"30": "trzydziesty",
|
||||
"31": "trzydziesty pierwszy",
|
||||
"32": "trzydziesty drugi",
|
||||
"33": "trzydziesty trzeci",
|
||||
"34": "trzydziesty czwarty",
|
||||
"35": "trzydziesty piąty",
|
||||
"36": "trzydziesty szósty",
|
||||
"37": "trzydziesty siódmy",
|
||||
"38": "trzydziesty ósmy",
|
||||
"39": "trzydziesty dziewiaty",
|
||||
"40": "czterdziesty",
|
||||
"41": "czterdziesty pierwszy",
|
||||
"42": "czterdziesty drugi",
|
||||
"43": "czterdziesty Trzeci",
|
||||
"44": "czterdziesty czwarty",
|
||||
"45": "czterdziesty piąty",
|
||||
"46": "czterdziesty szósty",
|
||||
"47": "czterdziesty siódmy",
|
||||
"48": "czterdziesty ósmy",
|
||||
"49": "czterdziesty dziewiąty",
|
||||
"50": "pięćdziesiąty",
|
||||
"51": "pięćdziesiąty pierwszy",
|
||||
"52": "pięćdziesiąty drugi",
|
||||
"53": "pięćdziesiąty trzeci",
|
||||
"54": "pięćdziesiąty czwarty",
|
||||
"55": "pięćdziesiąty piąty",
|
||||
"56": "pięćdziesiąty szósty",
|
||||
"57": "pięćdziesiąty siódmy",
|
||||
"58": "pięćdziesiąty ósmy",
|
||||
"59": "pięćdziesiąty dziewiąty",
|
||||
"60": "sześćdziesiąty",
|
||||
"61": "sześćdziesiąty pierwszy",
|
||||
"62": "sześćdziesiąty drugi",
|
||||
"63": "sześćdziesiąty trzeci",
|
||||
"64": "sześćdziesiąty czwarty",
|
||||
"65": "sześćdziesiąty piąty",
|
||||
"66": "sześćdziesiąty szósty",
|
||||
"67": "sześćdziesiąty siódmy",
|
||||
"68": "sześćdziesiąty ósmy",
|
||||
"69": "sześćdziesiąty dziewiąty",
|
||||
"70": "siedemdziesiąty",
|
||||
"71": "siedemdziesiąty pierwszy",
|
||||
"72": "siedemdziesiąty drugi",
|
||||
"73": "siedemdziesiąty trzeci",
|
||||
"74": "siedemdziesiąty czwarty",
|
||||
"75": "siedemdziesiąty piąty",
|
||||
"76": "siedemdziesiąty szósty",
|
||||
"77": "siedemdziesiąty siódmy",
|
||||
"78": "siedemdziesiąty ósmy",
|
||||
"79": "siedemdziesiąty dziewiąty",
|
||||
"80": "osiemdziesiąty",
|
||||
"81": "osiemdziesiąty pierwszy",
|
||||
"82": "osiemdziesiąty drugi",
|
||||
"83": "osiemdziesiąty trzeci",
|
||||
"84": "osiemdziesiąty czwarty",
|
||||
"85": "osiemdziesiąty piąty",
|
||||
"86": "osiemdziesiąty szósty",
|
||||
"87": "osiemdziesiąty siódmy",
|
||||
"88": "osiemdziesiąty ósmy",
|
||||
"89": "osiemdziesiąty dziewiąty",
|
||||
"90": "dziewięćdziesiąty",
|
||||
"91": "dziewięćdziesiąty pierwszy",
|
||||
"92": "dziewięćdziesiąty drugi",
|
||||
"93": "dziewięćdziesiąty trzeci",
|
||||
"94": "dziewięćdziesiąty czwarty",
|
||||
"95": "dziewięćdziesiąty piąty",
|
||||
"96": "dziewięćdziesiąty szósty",
|
||||
"97": "dziewięćdziesiąty siódmy",
|
||||
"98": "dziewięćdziesiąty ósmy",
|
||||
"99": "dziewięćdziesiąty dziewiąty"
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"Synopsis": "Sinopse",
|
||||
"Short Description": "Descrição breve",
|
||||
"Comment": "Comentários",
|
||||
"Comment": "Comentário",
|
||||
"Notes": "Notas",
|
||||
"Tag": "Etiqueta",
|
||||
"Point of View": "Ponto de vista",
|
||||
@@ -30,87 +30,87 @@
|
||||
"14": "Quatorze",
|
||||
"15": "Quinze",
|
||||
"16": "Dezesseis",
|
||||
"17": "Dezesete",
|
||||
"17": "Dezessete",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"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",
|
||||
"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"
|
||||
"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"
|
||||
}
|
||||
|
||||
@@ -59,6 +59,7 @@ fmt_strike-md = nw_tb-strike-md.svg
|
||||
fmt_subscript = nw_tb-subscript.svg
|
||||
fmt_superscript = nw_tb-superscript.svg
|
||||
fmt_underline = nw_tb-underline.svg
|
||||
font = nw_font.svg
|
||||
forward = typ_chevron-right.svg
|
||||
import = mixed_import.svg
|
||||
list = typ_th-list.svg
|
||||
@@ -78,6 +79,7 @@ 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
|
||||
quote = nw_quote.svg
|
||||
refresh = typ_refresh.svg
|
||||
remove = typ_minus.svg
|
||||
revert = typ_refresh-flipped.svg
|
||||
|
||||
4
novelwriter/assets/icons/typicons_dark/nw_font.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m2.5744 5.8208v-4.2853h-1.4527v-1.0064h4.1067v1.0064h-1.4527v4.2853z" fill="#aeaeae" stroke-width="1.1503"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 267 B |
4
novelwriter/assets/icons/typicons_dark/nw_quote.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m1.3715 3.0659q-0.32092-0.25674-0.44928-0.44928-0.12836-0.19255-0.12837-0.44928 0-0.42361 0.28241-0.69319 0.28241-0.28241 0.68035-0.28241 0.25674 0 0.44928 0.10269 0.19255 0.089858 0.3466 0.23106 0.24391 0.4878 0.24391 1.0141 0 0.42361-0.14121 0.82157-0.12837 0.38511-0.37227 0.71886-0.23106 0.33377-0.55199 0.61618-0.30808 0.26958-0.65467 0.46213l-0.25674-0.41078q0.29525-0.21822 0.57766-0.53914 0.28241-0.33375 0.46213-0.73171zm2.7598 0q-0.32092-0.25674-0.44928-0.44928-0.12837-0.19255-0.12837-0.44928 0-0.42361 0.28241-0.69319 0.28241-0.28241 0.68035-0.28241 0.25674 0 0.44928 0.10269 0.19255 0.089858 0.3466 0.23106 0.24391 0.4878 0.24391 1.0141 0 0.42361-0.14121 0.82157-0.12837 0.38511-0.37227 0.71886-0.23106 0.33377-0.55199 0.61618-0.30808 0.26958-0.65467 0.46213l-0.25674-0.41078q0.29525-0.21822 0.57766-0.53914 0.28241-0.33375 0.46213-0.73171z" fill="#aeaeae" fill-opacity=".78039" stroke-width="1.8194"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -59,6 +59,7 @@ fmt_strike-md = nw_tb-strike-md.svg
|
||||
fmt_subscript = nw_tb-subscript.svg
|
||||
fmt_superscript = nw_tb-superscript.svg
|
||||
fmt_underline = nw_tb-underline.svg
|
||||
font = nw_font.svg
|
||||
forward = typ_chevron-right.svg
|
||||
import = mixed_import.svg
|
||||
list = typ_th-list.svg
|
||||
@@ -78,6 +79,7 @@ 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
|
||||
quote = nw_quote.svg
|
||||
refresh = typ_refresh.svg
|
||||
remove = typ_minus.svg
|
||||
revert = typ_refresh-flipped.svg
|
||||
|
||||
4
novelwriter/assets/icons/typicons_light/nw_font.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m2.5744 5.8208v-4.2853h-1.4527v-1.0064h4.1067v1.0064h-1.4527v4.2853z" fill-opacity=".78039" stroke-width="1.1503"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 274 B |
4
novelwriter/assets/icons/typicons_light/nw_quote.svg
Normal file
@@ -0,0 +1,4 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24" height="24" version="1.1" viewBox="0 0 6.35 6.35" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="m1.3715 3.0659q-0.32092-0.25674-0.44928-0.44928-0.12836-0.19255-0.12837-0.44928 0-0.42361 0.28241-0.69319 0.28241-0.28241 0.68035-0.28241 0.25674 0 0.44928 0.10269 0.19255 0.089858 0.3466 0.23106 0.24391 0.4878 0.24391 1.0141 0 0.42361-0.14121 0.82157-0.12837 0.38511-0.37227 0.71886-0.23106 0.33377-0.55199 0.61618-0.30808 0.26958-0.65467 0.46213l-0.25674-0.41078q0.29525-0.21822 0.57766-0.53914 0.28241-0.33375 0.46213-0.73171zm2.7598 0q-0.32092-0.25674-0.44928-0.44928-0.12837-0.19255-0.12837-0.44928 0-0.42361 0.28241-0.69319 0.28241-0.28241 0.68035-0.28241 0.25674 0 0.44928 0.10269 0.19255 0.089858 0.3466 0.23106 0.24391 0.4878 0.24391 1.0141 0 0.42361-0.14121 0.82157-0.12837 0.38511-0.37227 0.71886-0.23106 0.33377-0.55199 0.61618-0.30808 0.26958-0.65467 0.46213l-0.25674-0.41078q0.29525-0.21822 0.57766-0.53914 0.28241-0.33375 0.46213-0.73171z" fill-opacity=".78039" stroke-width="1.8194"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.0 KiB |
@@ -12,15 +12,17 @@ link = 77, 077, 255
|
||||
headertext = 255, 255, 255
|
||||
headertag = 50, 0, 180
|
||||
emphasis = 0, 255, 255
|
||||
straightquotes = 7, 27, 219
|
||||
doublequotes = 0, 255, 0
|
||||
singlequotes = 0, 140, 255
|
||||
dialog = 0, 255, 0
|
||||
altdialog = 0, 140, 255
|
||||
note = 150, 150, 150
|
||||
hidden = 77, 77, 100
|
||||
shortcode = 255, 255, 0
|
||||
keyword = 255, 100, 255
|
||||
tag = 255, 150, 10
|
||||
value = 255, 150, 10
|
||||
spellcheckline = 242, 72, 23
|
||||
errorline = 186, 218, 4
|
||||
replacetag = 0, 0, 180
|
||||
modifier = 144, 142, 176
|
||||
optional = 180, 180, 180
|
||||
texthighlight = 255, 255, 132, 96
|
||||
|
||||
@@ -6,23 +6,37 @@ url = https://github.com/vkbo/novelWriter
|
||||
license = CC BY-SA 4.0
|
||||
licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
|
||||
|
||||
##
|
||||
# Colours:
|
||||
# Background = 2a2a2a : 42, 42, 42
|
||||
# Foreground = cccccc : 204, 204, 204
|
||||
# Comment = 969696 : 150, 150, 150
|
||||
# Red = e64250 : 230, 66, 80
|
||||
# Orange = f99157 : 249, 145, 87
|
||||
# Yellow = ffff84 : 255, 255, 132
|
||||
# Green = 99cc99 : 153, 204, 153
|
||||
# Blue = 288ed7 : 102, 153, 204
|
||||
# Purple = 8c56d7 : 140, 86, 215
|
||||
##
|
||||
|
||||
[Syntax]
|
||||
background = 54, 54, 54
|
||||
text = 199, 207, 208
|
||||
link = 184, 200, 0
|
||||
headertext = 0, 155, 200
|
||||
headertag = 0, 105, 135
|
||||
emphasis = 200, 120, 0
|
||||
straightquotes = 200, 46, 0
|
||||
doublequotes = 184, 200, 0
|
||||
singlequotes = 136, 200, 0
|
||||
background = 42, 42, 42
|
||||
text = 204, 204, 204
|
||||
link = 102, 153, 204
|
||||
headertext = 153, 204, 153
|
||||
headertag = 153, 204, 153, 160
|
||||
emphasis = 249, 145, 87
|
||||
dialog = 102, 153, 204
|
||||
altdialog = 102, 153, 204
|
||||
note = 255, 255, 216
|
||||
hidden = 150, 150, 150
|
||||
shortcode = 0, 155, 200
|
||||
keyword = 200, 46, 0
|
||||
value = 184, 200, 0
|
||||
optional = 0, 155, 200
|
||||
spellcheckline = 200, 46, 0
|
||||
errorline = 46, 200, 0
|
||||
replacetag = 0, 184, 46
|
||||
modifier = 200, 120, 0
|
||||
texthighlight = 136, 200, 0, 96
|
||||
shortcode = 153, 204, 153
|
||||
keyword = 230, 66, 80
|
||||
tag = 153, 204, 153
|
||||
value = 102, 153, 204
|
||||
optional = 153, 204, 153
|
||||
spellcheckline = 230, 66, 80
|
||||
errorline = 153, 204, 153
|
||||
replacetag = 153, 204, 153
|
||||
modifier = 153, 204, 153
|
||||
texthighlight = 255, 255, 132, 96
|
||||
|
||||
@@ -6,23 +6,37 @@ url = https://github.com/vkbo/novelWriter
|
||||
license = CC BY-SA 4.0
|
||||
licenseurl = https://creativecommons.org/licenses/by-sa/4.0/
|
||||
|
||||
##
|
||||
# Colours:
|
||||
# Background = ffffff : 255, 255, 255
|
||||
# Foreground = 000000 : 0, 0, 0
|
||||
# Comment = 646464 : 100, 100, 100
|
||||
# Red = c83232 : 200, 50, 50
|
||||
# Orange = ae6e1e : 174, 110, 30
|
||||
# Yellow = 969600 : 150, 150, 0
|
||||
# Green = 006400 : 0, 100, 0
|
||||
# Blue = 0000c8 : 0, 0, 200
|
||||
# Purple = 6400ae : 100, 0, 174
|
||||
##
|
||||
|
||||
[Syntax]
|
||||
background = 255, 255, 255
|
||||
text = 0, 0, 0
|
||||
link = 0, 0, 200
|
||||
headertext = 0, 100, 0
|
||||
headertag = 50, 100, 50
|
||||
emphasis = 150, 110, 30
|
||||
straightquotes = 200, 0, 0
|
||||
doublequotes = 0, 0, 200
|
||||
singlequotes = 0, 0, 200
|
||||
headertag = 0, 100, 0, 160
|
||||
emphasis = 174, 110, 30
|
||||
dialog = 0, 0, 200
|
||||
altdialog = 0, 0, 200
|
||||
note = 100, 100, 0
|
||||
hidden = 100, 100, 100
|
||||
shortcode = 0, 100, 0
|
||||
keyword = 200, 50, 50
|
||||
value = 50, 150, 50
|
||||
tag = 0, 100, 0
|
||||
value = 0, 0, 200
|
||||
optional = 0, 100, 0
|
||||
spellcheckline = 200, 0, 0
|
||||
errorline = 0, 150, 0
|
||||
replacetag = 0, 150, 0
|
||||
modifier = 150, 110, 30
|
||||
spellcheckline = 200, 50, 50
|
||||
errorline = 0, 100, 0
|
||||
replacetag = 0, 100, 0
|
||||
modifier = 0, 100, 0
|
||||
texthighlight = 150, 150, 0, 96
|
||||
|
||||
44
novelwriter/assets/syntax/dracula.conf
Normal file
@@ -0,0 +1,44 @@
|
||||
[Main]
|
||||
name = Dracula
|
||||
author = Veronica Berglyd Olsen (adaptation)
|
||||
credit = Zeno Rocha
|
||||
url = https://draculatheme.com
|
||||
license = MIT
|
||||
licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE
|
||||
|
||||
##
|
||||
# Colours:
|
||||
# Background = 282a36 : 40, 42, 54
|
||||
# Foreground = f8f8f2 : 248, 248, 242
|
||||
# Comment = 6272a4 : 98, 114, 164
|
||||
# Cyan = 8be9fd : 139, 233, 253
|
||||
# Green = 50fa7b : 80, 250, 123
|
||||
# Orange = ffb86c : 255, 184, 108
|
||||
# Pink = ff79c6 : 255, 121, 198
|
||||
# Purple = bd93f9 : 189, 147, 249
|
||||
# Red = ff5555 : 255, 85, 85
|
||||
# Yellow = f1fa8c : 241, 250, 140
|
||||
##
|
||||
|
||||
[Syntax]
|
||||
# See: https://spec.draculatheme.com/
|
||||
background = 40, 42, 54
|
||||
text = 248, 248, 242
|
||||
link = 255, 121, 198
|
||||
headertext = 189, 147, 249
|
||||
headertag = 189, 147, 249, 160
|
||||
emphasis = 255, 184, 108
|
||||
dialog = 80, 250, 123
|
||||
altdialog = 241, 250, 140
|
||||
note = 255, 204, 233
|
||||
hidden = 98, 114, 164
|
||||
shortcode = 139, 233, 253
|
||||
keyword = 255, 121, 198
|
||||
tag = 255, 184, 108
|
||||
value = 255, 184, 108
|
||||
optional = 80, 250, 123
|
||||
spellcheckline = 255, 85, 85
|
||||
errorline = 80, 250, 123
|
||||
replacetag = 241, 250, 140
|
||||
modifier = 139, 233, 253
|
||||
texthighlight = 241, 250, 140, 96
|
||||
@@ -11,14 +11,15 @@ background = 54, 54, 54
|
||||
text = 200, 200, 200
|
||||
link = 200, 200, 200
|
||||
headertext = 225, 225, 225
|
||||
headertag = 225, 225, 225
|
||||
headertag = 225, 225, 225, 160
|
||||
emphasis = 200, 200, 200
|
||||
straightquotes = 200, 200, 200
|
||||
doublequotes = 200, 200, 200
|
||||
singlequotes = 200, 200, 200
|
||||
dialog = 200, 200, 200
|
||||
altdialog = 200, 200, 200
|
||||
note = 200, 200, 200
|
||||
hidden = 150, 150, 150
|
||||
shortcode = 225, 225, 225
|
||||
keyword = 225, 225, 225
|
||||
tag = 200, 200, 200
|
||||
value = 200, 200, 200
|
||||
optional = 225, 225, 225
|
||||
spellcheckline = 200, 46, 0
|
||||
|
||||
@@ -11,14 +11,15 @@ background = 255, 255, 255
|
||||
text = 20, 20, 20
|
||||
link = 20, 20, 20
|
||||
headertext = 0, 0, 0
|
||||
headertag = 0, 0, 0
|
||||
headertag = 0, 0, 0, 160
|
||||
emphasis = 20, 20, 20
|
||||
straightquotes = 20, 20, 20
|
||||
doublequotes = 20, 20, 20
|
||||
singlequotes = 20, 20, 20
|
||||
dialog = 20, 20, 20
|
||||
altdialog = 20, 20, 20
|
||||
note = 20, 20, 20
|
||||
hidden = 100, 100, 100
|
||||
shortcode = 0, 0, 0
|
||||
keyword = 0, 0, 0
|
||||
tag = 20, 20, 20
|
||||
value = 20, 20, 20
|
||||
optional = 0, 0, 0
|
||||
spellcheckline = 200, 0, 0
|
||||
|
||||
@@ -31,18 +31,19 @@ background = 251, 251, 251
|
||||
text = 64, 63, 82
|
||||
link = 40, 142, 215
|
||||
headertext = 40, 142, 215
|
||||
headertag = 40, 142, 215
|
||||
headertag = 40, 142, 215, 160
|
||||
emphasis = 224, 175, 5
|
||||
straightquotes = 222, 61, 58
|
||||
doublequotes = 8, 145, 106
|
||||
singlequotes = 255, 235, 149
|
||||
dialog = 8, 145, 106
|
||||
altdialog = 218, 170, 1
|
||||
note = 128, 118, 75
|
||||
hidden = 152, 159, 177
|
||||
shortcode = 40, 142, 215
|
||||
keyword = 222, 61, 58
|
||||
value = 150, 74, 193
|
||||
tag = 150, 74, 193
|
||||
value = 224, 175, 5
|
||||
optional = 40, 142, 215
|
||||
spellcheckline = 222, 61, 58
|
||||
errorline = 8, 145, 106
|
||||
replacetag = 42, 162, 152
|
||||
modifier = 224, 175, 5
|
||||
modifier = 8, 145, 106
|
||||
texthighlight = 218, 170, 1, 96
|
||||
|
||||
@@ -31,18 +31,19 @@ background = 1, 22, 39
|
||||
text = 214, 222, 235
|
||||
link = 130, 170, 255
|
||||
headertext = 130, 170, 255
|
||||
headertag = 130, 170, 255
|
||||
headertag = 130, 170, 255, 160
|
||||
emphasis = 236, 196, 141
|
||||
straightquotes = 247, 140, 108
|
||||
doublequotes = 173, 219, 103
|
||||
singlequotes = 255, 235, 149
|
||||
dialog = 173, 219, 103
|
||||
altdialog = 255, 235, 149
|
||||
note = 255, 249, 202
|
||||
hidden = 99, 119, 119
|
||||
shortcode = 130, 170, 255
|
||||
keyword = 247, 140, 108
|
||||
value = 199, 146, 234
|
||||
tag = 199, 146, 234
|
||||
value = 255, 235, 149
|
||||
optional = 130, 170, 255
|
||||
spellcheckline = 247, 140, 108
|
||||
errorline = 173, 219, 103
|
||||
replacetag = 127, 219, 202
|
||||
modifier = 236, 196, 141
|
||||
modifier = 173, 219, 103
|
||||
texthighlight = 255, 235, 149, 96
|
||||
|
||||
42
novelwriter/assets/syntax/snazzy.conf
Normal file
@@ -0,0 +1,42 @@
|
||||
[Main]
|
||||
name = Snazzy Light
|
||||
author = Veronica Berglyd Olsen (adaptation)
|
||||
credit = Florian Reuschel (color theme)
|
||||
url = https://github.com/loilo/vscode-snazzy-light
|
||||
license = MIT License
|
||||
licenseurl = https://github.com/loilo/vscode-snazzy-light/blob/master/LICENSE
|
||||
|
||||
##
|
||||
# Colours:
|
||||
# Background = fafbfc : 250, 251, 252
|
||||
# Foreground = 565869 : 86, 88, 105
|
||||
# Comment = 9194a2 : 145, 148, 162
|
||||
# Yellow = cf9c00 : 207, 156, 0
|
||||
# Red = ff5c57 : 255, 92, 87
|
||||
# Pink = f767bb : 247, 103, 187
|
||||
# Blue = 09a1ed : 9, 161, 237
|
||||
# Cyan = 13bbb7 : 19, 187, 183
|
||||
# Green = 2dae58 : 45, 174, 88
|
||||
##
|
||||
|
||||
[Syntax]
|
||||
background = 250, 251, 252
|
||||
text = 86, 88, 105
|
||||
link = 9, 161, 237
|
||||
headertext = 45, 174, 88
|
||||
headertag = 45, 174, 88, 160
|
||||
emphasis = 19, 187, 183
|
||||
dialog = 207, 156, 0
|
||||
altdialog = 207, 156, 0
|
||||
note = 120, 187, 185
|
||||
hidden = 145, 148, 162
|
||||
shortcode = 247, 103, 187
|
||||
keyword = 9, 161, 237
|
||||
tag = 45, 174, 88
|
||||
value = 9, 161, 237
|
||||
optional = 207, 156, 0
|
||||
spellcheckline = 255, 92, 87
|
||||
errorline = 45, 174, 88
|
||||
replacetag = 19, 187, 183
|
||||
modifier = 247, 103, 187
|
||||
texthighlight = 207, 156, 0, 96
|
||||
@@ -13,12 +13,13 @@ link = 38, 139, 210
|
||||
headertext = 147, 161, 161
|
||||
headertag = 42, 161, 152
|
||||
emphasis = 38, 139, 210
|
||||
straightquotes = 211, 54, 130
|
||||
doublequotes = 42, 161, 152
|
||||
singlequotes = 42, 161, 152
|
||||
dialog = 42, 161, 152
|
||||
altdialog = 42, 161, 152
|
||||
note = 101, 161, 156
|
||||
hidden = 147, 161, 161
|
||||
shortcode = 147, 161, 161
|
||||
keyword = 133, 153, 0
|
||||
tag = 203, 75, 22
|
||||
value = 203, 75, 22
|
||||
optional = 147, 161, 161
|
||||
spellcheckline = 203, 75, 22
|
||||
|
||||
@@ -13,12 +13,13 @@ link = 38, 139, 210
|
||||
headertext = 88, 110, 117
|
||||
headertag = 42, 161, 152
|
||||
emphasis = 38, 139, 210
|
||||
straightquotes = 211, 54, 130
|
||||
doublequotes = 42, 161, 152
|
||||
singlequotes = 42, 161, 152
|
||||
dialog = 42, 161, 152
|
||||
altdialog = 42, 161, 152
|
||||
note = 27, 102, 96
|
||||
hidden = 88, 110, 117
|
||||
shortcode = 88, 110, 117
|
||||
keyword = 133, 153, 0
|
||||
tag = 203, 75, 22
|
||||
value = 203, 75, 22
|
||||
optional = 88, 110, 117
|
||||
spellcheckline = 203, 75, 22
|
||||
|
||||
@@ -2,22 +2,38 @@
|
||||
name = Tango
|
||||
author = Veronica Berglyd Olsen (adaptation)
|
||||
|
||||
##
|
||||
# Colours:
|
||||
# Background = 30302f : 48, 48, 47
|
||||
# Foreground = eeeeec : 238, 238, 236
|
||||
# Comment = 8f8f8d : 143, 143, 141
|
||||
# Red = ef2929 : 239, 41, 41
|
||||
# Orange = c4a000 : 196, 160, 0
|
||||
# Yellow = fce94f : 252, 233, 79
|
||||
# Green = 8ae234 : 138, 226, 52
|
||||
# Cyan = 34e2e2 : 52, 226, 226
|
||||
# Blue = 3465a4 : 114, 159, 207
|
||||
# Purple = ad7fa8 : 173, 127, 168
|
||||
##
|
||||
|
||||
[Syntax]
|
||||
background = 48, 48, 47
|
||||
text = 238, 238, 236
|
||||
link = 115, 159, 207
|
||||
headertext = 115, 159, 207
|
||||
headertag = 52, 101, 164
|
||||
link = 114, 159, 207
|
||||
headertext = 114, 159, 207
|
||||
headertag = 114, 159, 207, 160
|
||||
emphasis = 196, 160, 0
|
||||
straightquotes = 239, 41, 41
|
||||
doublequotes = 138, 226, 52
|
||||
singlequotes = 252, 233, 79
|
||||
dialog = 138, 226, 52
|
||||
altdialog = 252, 233, 79
|
||||
note = 252, 242, 164
|
||||
hidden = 143, 143, 141
|
||||
shortcode = 115, 159, 207
|
||||
shortcode = 114, 159, 207
|
||||
keyword = 239, 41, 41
|
||||
value = 173, 127, 168
|
||||
optional = 115, 159, 207
|
||||
tag = 173, 127, 168
|
||||
value = 239, 41, 41
|
||||
optional = 114, 159, 207
|
||||
spellcheckline = 239, 41, 41
|
||||
errorline = 138, 226, 52
|
||||
replacetag = 51, 226, 226
|
||||
modifier = 196, 160, 0
|
||||
replacetag = 52, 226, 226
|
||||
modifier = 114, 159, 207
|
||||
texthighlight = 252, 233, 79, 96
|
||||
|
||||
@@ -31,15 +31,16 @@ background = 255, 255, 255
|
||||
text = 77, 77, 76
|
||||
link = 66, 113, 174
|
||||
headertext = 66, 113, 174
|
||||
headertag = 66, 113, 174
|
||||
headertag = 66, 113, 174, 160
|
||||
emphasis = 245, 135, 31
|
||||
straightquotes = 240, 40, 41
|
||||
doublequotes = 113, 140, 0
|
||||
singlequotes = 234, 183, 0
|
||||
dialog = 113, 140, 0
|
||||
altdialog = 234, 183, 0
|
||||
note = 115, 90, 0
|
||||
hidden = 142, 144, 140
|
||||
shortcode = 66, 113, 174
|
||||
keyword = 240, 40, 41
|
||||
value = 137, 89, 168
|
||||
tag = 137, 89, 168
|
||||
value = 234, 183, 0
|
||||
optional = 66, 113, 174
|
||||
spellcheckline = 240, 40, 41
|
||||
errorline = 113, 140, 0
|
||||
|
||||
@@ -29,17 +29,18 @@ licenseurl = https://github.com/chriskempson/tomorrow-theme/blob/master/LICENSE.
|
||||
[Syntax]
|
||||
background = 29, 31, 33
|
||||
text = 197, 200, 198
|
||||
link = 129, 162, 190
|
||||
link = 197, 200, 198, 160
|
||||
headertext = 129, 162, 190
|
||||
headertag = 129, 162, 190
|
||||
headertag = 94, 119, 139
|
||||
emphasis = 222, 147, 95
|
||||
straightquotes = 204, 102, 102
|
||||
doublequotes = 181, 189, 104
|
||||
singlequotes = 240, 198, 116
|
||||
dialog = 181, 189, 104
|
||||
altdialog = 240, 198, 116
|
||||
note = 240, 219, 178
|
||||
hidden = 150, 152, 150
|
||||
shortcode = 129, 162, 190
|
||||
keyword = 204, 102, 102
|
||||
value = 178, 148, 187
|
||||
tag = 178, 148, 187
|
||||
value = 240, 198, 116
|
||||
optional = 129, 162, 190
|
||||
spellcheckline = 204, 102, 102
|
||||
errorline = 181, 189, 104
|
||||
|
||||
@@ -31,15 +31,16 @@ background = 0, 36, 81
|
||||
text = 255, 255, 255
|
||||
link = 187, 218, 255
|
||||
headertext = 187, 218, 255
|
||||
headertag = 187, 218, 255
|
||||
headertag = 187, 218, 255, 160
|
||||
emphasis = 255, 197, 143
|
||||
straightquotes = 255, 157, 164
|
||||
doublequotes = 209, 241, 169
|
||||
singlequotes = 255, 238, 173
|
||||
dialog = 209, 241, 169
|
||||
altdialog = 255, 238, 173
|
||||
note = 255, 247, 214
|
||||
hidden = 114, 133, 183
|
||||
shortcode = 187, 218, 255
|
||||
keyword = 255, 157, 164
|
||||
value = 235, 187, 255
|
||||
tag = 235, 187, 255
|
||||
value = 255, 238, 173
|
||||
optional = 187, 218, 255
|
||||
spellcheckline = 255, 157, 164
|
||||
errorline = 209, 241, 169
|
||||
|
||||
@@ -31,15 +31,16 @@ background = 0, 0, 0
|
||||
text = 234, 234, 234
|
||||
link = 122, 166, 218
|
||||
headertext = 122, 166, 218
|
||||
headertag = 122, 166, 218
|
||||
headertag = 122, 166, 218, 160
|
||||
emphasis = 231, 140, 69
|
||||
straightquotes = 213, 78, 83
|
||||
doublequotes = 185, 202, 74
|
||||
singlequotes = 231, 197, 71
|
||||
dialog = 185, 202, 74
|
||||
altdialog = 231, 197, 71
|
||||
note = 231, 214, 150
|
||||
hidden = 150, 152, 150
|
||||
shortcode = 122, 166, 218
|
||||
keyword = 213, 78, 83
|
||||
value = 195, 151, 216
|
||||
tag = 195, 151, 216
|
||||
value = 231, 197, 71
|
||||
optional = 122, 166, 218
|
||||
spellcheckline = 213, 78, 83
|
||||
errorline = 185, 202, 74
|
||||
|
||||
@@ -31,15 +31,16 @@ background = 45, 45, 45
|
||||
text = 204, 204, 204
|
||||
link = 102, 153, 204
|
||||
headertext = 102, 153, 204
|
||||
headertag = 102, 153, 204
|
||||
headertag = 102, 153, 204, 160
|
||||
emphasis = 249, 145, 57
|
||||
straightquotes = 242, 119, 122
|
||||
doublequotes = 153, 204, 153
|
||||
singlequotes = 255, 204, 102
|
||||
dialog = 153, 204, 153
|
||||
altdialog = 255, 204, 102
|
||||
note = 255, 230, 179
|
||||
hidden = 153, 153, 153
|
||||
shortcode = 102, 153, 204
|
||||
keyword = 242, 119, 122
|
||||
value = 204, 153, 204
|
||||
tag = 204, 153, 204
|
||||
value = 255, 204, 102
|
||||
optional = 102, 153, 204
|
||||
spellcheckline = 242, 119, 122
|
||||
errorline = 153, 204, 153
|
||||
|
||||
@@ -1,81 +1,92 @@
|
||||
<!DOCTYPE html public "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<body>
|
||||
|
||||
<h3>Main Developer</h3>
|
||||
<p>Veronica Berglyd Olsen (<a href="https://github.com/vkbo">@vkbo</a>)</p>
|
||||
|
||||
<p>Veronica Berglyd Olsen</p>
|
||||
|
||||
<h3>Contributors</h3>
|
||||
|
||||
<p>
|
||||
• <b>Concept:</b> Marian Lückhof (<a href="https://github.com/Number042">@Number042</a>)<br>
|
||||
• <b>Internationalisation:</b> Bruno Meneguello (<a href="https://github.com/bkmeneguello">@bkmeneguello</a>)<br>
|
||||
• <b>Setup and Packaging:</b> Rachel Powers (<a href="https://github.com/Ryex">@Ryex</a>)
|
||||
</p>
|
||||
<ul>
|
||||
<li><b>Early Concept:</b> Marian Lückhof</li>
|
||||
<li><b>Internationalisation:</b> Bruno Meneguello</li>
|
||||
<li><b>Setup and Packaging:</b> Rachel Powers</li>
|
||||
</ul>
|
||||
|
||||
<p>For other contributions, see the project's
|
||||
<a href="https://github.com/vkbo/novelWriter/graphs/contributors">Contributors</a> page.</p>
|
||||
|
||||
<h3>Artwork</h3>
|
||||
|
||||
<p>The artwork on the Welcome dialog was created by <a href="https://louisdurrant.art">Louis Durrant</a>.</p>
|
||||
<p>The artwork on the Welcome dialog was created by Louis Durrant.</p>
|
||||
|
||||
<h3>Translations</h3>
|
||||
|
||||
<p>The default language is English (UK) with English (US) as an option. These are the original
|
||||
translators for the languages currently available:</p>
|
||||
<p>
|
||||
• <b>Dutch:</b> Martijn van der Kleijn (<a href="https://github.com/mvdkleijn">@mvdkleijn</a>)<br>
|
||||
• <b>French:</b> Jan Lüdke (<a href="https://github.com/jyhelle">@jyhelle</a>)<br>
|
||||
• <b>German:</b> Myian (<a href="https://github.com/heymyian">@heymyian</a>)<br>
|
||||
• <b>Italian:</b> Riccardo Mangili<br>
|
||||
• <b>Japanese:</b> hebekeg (<a href="https://github.com/hebekeg">@hebekeg</a>)<br>
|
||||
• <b>Latin American Spanish:</b> Tommy Marplatt (<a href="https://github.com/tmarplatt">@tmarplatt</a>)<br>
|
||||
• <b>Norwegian:</b> Veronica Berglyd Olsen (<a href="https://github.com/vkbo">@vkbo</a>)<br>
|
||||
• <b>Portuguese:</b> Bruno Meneguello (<a href="https://github.com/bkmeneguello">@bkmeneguello</a>)<br>
|
||||
• <b>Simplified Chinese:</b> Qianzhi Long (<a href="https://github.com/longqzh">@longqzh</a>)
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><b>Dutch:</b> Martijn van der Kleijn (mvdkleijn)</li>
|
||||
<li><b>French:</b> Jan Lüdke (jyhelle)</li>
|
||||
<li><b>German:</b> Myian (HeyMyian)</li>
|
||||
<li><b>Italian:</b> Riccardo Mangili</li>
|
||||
<li><b>Japanese:</b> hebekeg</li>
|
||||
<li><b>Latin American Spanish:</b> Tommy Marplatt (tmarplatt)</li>
|
||||
<li><b>Norwegian:</b> Veronica Berglyd Olsen (vkbo)</li>
|
||||
<li><b>Polish:</b> Anna Maria Polak (Nauthiz)</li>
|
||||
<li><b>Portuguese:</b> Bruno Meneguello (bkmeneguello)</li>
|
||||
<li><b>Simplified Chinese:</b> Qianzhi Long (longqzh)</li>
|
||||
</ul>
|
||||
|
||||
<p>Additional larger translation contributions:</p>
|
||||
<p>
|
||||
• <b>French:</b> Albert Aribaud (<a href="https://github.com/aaribaud">@aaribaud</a>)
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><b>French:</b> Albert Aribaud (aaribaud)</li>
|
||||
<li><b>Portuguese:</b> Oli Maia (olimaia)</li>
|
||||
</ul>
|
||||
|
||||
<p>Translations are managed on <a href="https://crowdin.com/project/novelwriter">Crowdin</a>, and
|
||||
more contributions are listed on the project's <a href="https://crowdin.com/project/novelwriter/members">Members</a> page.</p>
|
||||
more contributions are listed on the project's Members page.</p>
|
||||
|
||||
<h3>Libraries</h3>
|
||||
|
||||
<p>The following libraries are dependencies of novelWriter:</p>
|
||||
<p>
|
||||
• <a href="https://www.qt.io">Qt5</a> by Qt Company<br>
|
||||
• <a href="https://www.riverbankcomputing.com/software/pyqt">PyQt5</a> by Riverbank Computing<br>
|
||||
• <a href="https://abiword.github.io/enchant">Enchant</a> by Dom Lachowicz<br>
|
||||
• <a href="https://pyenchant.github.io/pyenchant">PyEnchant</a> by Dimitri Merejkowsky
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><b>Qt5</b> by Qt Company</li>
|
||||
<li><b>PyQt5</b> by Riverbank Computing</li>
|
||||
<li><b>Enchant</b> by Dom Lachowicz</li>
|
||||
<li><b>PyEnchant</b> by Dimitri Merejkowsky</li>
|
||||
</ul>
|
||||
|
||||
<h3>Assets</h3>
|
||||
|
||||
<p>Some of the assets bundled with novelWriter were adapted from the following sources:</p>
|
||||
<p>
|
||||
• <a href="https://github.com/stephenhutchings/typicons.font">Typicons</a> icons by Stephen Hutchings (CC BY-SA 4.0)<br>
|
||||
• <a href="https://github.com/chriskempson/base16">Tomorrow</a> syntax themes by Chris Kempson (MIT License)<br>
|
||||
• <a href="https://github.com/sdras/night-owl-vscode-theme">Owl</a> syntax themes by Sarah Drasner (MIT License)<br>
|
||||
• <a href="https://github.com/altercation/solarized">Solarized</a> themes by Ethan Schoonover (MIT License)
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><b>Typicons</b> icons by Stephen Hutchings (CC BY-SA 4.0)</li>
|
||||
<li><b>Tomorrow</b> syntax themes by Chris Kempson (MIT License)</li>
|
||||
<li><b>Owl</b> syntax themes by Sarah Drasner (MIT License)</li>
|
||||
<li><b>Solarized</b> themes by Ethan Schoonover (MIT License)</li>
|
||||
<li><b>Cyberpunk Night</b> theme by Anders Lemvigh (CC BY-SA 4.0)</li>
|
||||
<li><b>Dracula</b> theme by Zeno Rocha (MIT License)</li>
|
||||
<li><b>Snazzy Light</b> theme by Florian Reuschel (MIT License)</li>
|
||||
</ul>
|
||||
|
||||
<h3>Fonts</h3>
|
||||
|
||||
<p>The font used for the main novelWriter logo, mimetype and text banners is Pridi. Other fonts are
|
||||
used on buttons and icons.</p>
|
||||
<p>
|
||||
• Pridi by Cadson Demak (Open Font License, Version 1.1)<br>
|
||||
• Source Sans Pro by Paul D. Hunt (SIL Open Font License)
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li><b>Pridi</b> by Cadson Demak (Open Font License, Version 1.1)</li>
|
||||
<li><b>Source Sans Pro</b> by Paul D. Hunt (SIL Open Font License)</li>
|
||||
</ul>
|
||||
|
||||
<h3>Special Mentions</h3>
|
||||
|
||||
<p>Additional thanks to <a href="https://github.com/johnblommers">@johnblommers</a> who was an early user and who has provided a lot
|
||||
of very useful feedback over the years.</p>
|
||||
<p>Additional thanks to John Blommers who was an early user and who has provided a lot of very
|
||||
useful feedback over the years.</p>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -24,6 +24,9 @@ link = 77, 77, 255
|
||||
linkvisited = 50, 0, 80
|
||||
|
||||
[GUI]
|
||||
helptext = 97, 97, 97
|
||||
fadedtext = 97, 97, 97
|
||||
errortext = 255, 77, 77
|
||||
statusnone = 50, 50, 50
|
||||
statussaved = 77, 255, 77
|
||||
statusunsaved = 255, 77, 77
|
||||
|
||||
@@ -26,6 +26,8 @@ linkvisited = 102, 153, 204
|
||||
|
||||
[GUI]
|
||||
helptext = 164, 164, 164
|
||||
fadedtext = 148, 148, 148
|
||||
errortext = 255, 164, 164
|
||||
statusnone = 150, 152, 150
|
||||
statussaved = 39, 135, 78
|
||||
statusunsaved = 138, 32, 32
|
||||
|
||||
@@ -26,6 +26,8 @@ linkvisited = 66, 113, 174
|
||||
|
||||
[GUI]
|
||||
helptext = 92, 92, 92
|
||||
fadedtext = 108, 108, 108
|
||||
errortext = 255, 92, 92
|
||||
statusnone = 120, 120, 120
|
||||
statussaved = 200, 15, 39
|
||||
statusunsaved = 2, 133, 37
|
||||
|
||||
48
novelwriter/assets/themes/dracula.conf
Normal file
@@ -0,0 +1,48 @@
|
||||
[Main]
|
||||
name = Dracula
|
||||
description = A dark theme with bright colours
|
||||
author = Veronica Berglyd Olsen (adaptation)
|
||||
credit = Zeno Rocha
|
||||
url = https://draculatheme.com
|
||||
license = MIT
|
||||
licenseurl = https://github.com/dracula/dracula-theme/blob/main/LICENSE
|
||||
icontheme = typicons_dark
|
||||
|
||||
##
|
||||
# Colours:
|
||||
# Background = 282a36 : 40, 42, 54
|
||||
# Foreground = f8f8f2 : 248, 248, 242
|
||||
# Current Line = 44475A : 68, 71, 90
|
||||
# Comment = 6272a4 : 98, 114, 164
|
||||
# Cyan = 8be9fd : 139, 233, 253
|
||||
# Green = 50fa7b : 80, 250, 123
|
||||
# Orange = ffb86c : 255, 184, 108
|
||||
# Pink = ff79c6 : 255, 121, 198
|
||||
# Purple = bd93f9 : 189, 147, 249
|
||||
# Red = ff5555 : 255, 85, 85
|
||||
# Yellow = f1fa8c : 241, 250, 140
|
||||
##
|
||||
|
||||
[Palette]
|
||||
window = 68, 71, 90
|
||||
windowtext = 248, 248, 242
|
||||
base = 40, 42, 54
|
||||
alternatebase = 51, 54, 69
|
||||
text = 248, 248, 242
|
||||
tooltipbase = 241, 250, 140
|
||||
tooltiptext = 40, 42, 54
|
||||
button = 80, 83, 105
|
||||
buttontext = 248, 248, 242
|
||||
brighttext = 68, 71, 90
|
||||
highlight = 166, 129, 218
|
||||
highlightedtext = 248, 248, 242
|
||||
link = 139, 233, 253
|
||||
linkvisited = 139, 233, 253
|
||||
|
||||
[GUI]
|
||||
helptext = 204, 172, 249
|
||||
fadedtext = 98, 114, 164
|
||||
errortext = 255, 85, 85
|
||||
statusnone = 98, 114, 164
|
||||
statussaved = 80, 250, 123
|
||||
statusunsaved = 255, 85, 85
|
||||
@@ -25,6 +25,8 @@ linkvisited = 38, 139, 210
|
||||
|
||||
[GUI]
|
||||
helptext = 166, 161, 149
|
||||
fadedtext = 166, 161, 149
|
||||
errortext = 255, 161, 149
|
||||
statusnone = 88, 110, 117
|
||||
statussaved = 42, 161, 152
|
||||
statusunsaved = 203, 75, 22
|
||||
|
||||
@@ -25,6 +25,8 @@ linkvisited = 38, 139, 210
|
||||
|
||||
[GUI]
|
||||
helptext = 78, 91, 95
|
||||
fadedtext = 78, 91, 95
|
||||
errortext = 255, 91, 95
|
||||
statusnone = 88, 110, 117
|
||||
statussaved = 42, 161, 152
|
||||
statusunsaved = 203, 75, 22
|
||||
|
||||
@@ -24,30 +24,32 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
from __future__ import annotations
|
||||
|
||||
import json
|
||||
import uuid
|
||||
import logging
|
||||
import unicodedata
|
||||
import uuid
|
||||
import xml.etree.ElementTree as ET
|
||||
|
||||
from typing import TYPE_CHECKING, Any, Literal
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
from configparser import ConfigParser
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from typing import TYPE_CHECKING, Any, Literal, TypeVar
|
||||
from urllib.parse import urljoin
|
||||
from urllib.request import pathname2url
|
||||
|
||||
from PyQt5.QtGui import QColor, QDesktopServices
|
||||
from PyQt5.QtCore import QCoreApplication, QUrl
|
||||
from PyQt5.QtGui import QColor, QDesktopServices, QFont, QFontInfo
|
||||
|
||||
from novelwriter.enum import nwItemClass, nwItemType, nwItemLayout
|
||||
from novelwriter.error import logException
|
||||
from novelwriter.constants import nwConst, nwLabels, nwUnicode, trConst
|
||||
from novelwriter.enum import nwItemClass, nwItemLayout, nwItemType
|
||||
from novelwriter.error import logException
|
||||
|
||||
if TYPE_CHECKING: # pragma: no cover
|
||||
from typing import TypeGuard # Requires Python 3.10
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
_Type = TypeVar("_Type")
|
||||
|
||||
|
||||
##
|
||||
# Checker Functions
|
||||
@@ -172,6 +174,11 @@ def isItemLayout(value: Any) -> TypeGuard[str]:
|
||||
return isinstance(value, str) and value in nwItemLayout.__members__
|
||||
|
||||
|
||||
def isListInstance(data: Any, check: type[_Type]) -> TypeGuard[list[_Type]]:
|
||||
"""Check that all items of a list is of a given type."""
|
||||
return isinstance(data, list) and all(isinstance(item, check) for item in data)
|
||||
|
||||
|
||||
def hexToInt(value: Any, default: int = 0) -> int:
|
||||
"""Convert a hex string to an integer."""
|
||||
if isinstance(value, str):
|
||||
@@ -272,6 +279,13 @@ def simplified(text: str) -> str:
|
||||
return " ".join(str(text).strip().split())
|
||||
|
||||
|
||||
def elide(text: str, length: int) -> str:
|
||||
"""Elide a piece of text to a maximum length."""
|
||||
if len(text) > (cut := max(4, length)):
|
||||
return f"{text[:cut-4].rstrip()} ..."
|
||||
return text
|
||||
|
||||
|
||||
def yesNo(value: int | bool | None) -> Literal["yes", "no"]:
|
||||
"""Convert a boolean evaluated variable to a yes or no."""
|
||||
return "yes" if value else "no"
|
||||
@@ -387,6 +401,16 @@ def cssCol(col: QColor, alpha: int | None = None) -> str:
|
||||
return f"rgba({col.red()}, {col.green()}, {col.blue()}, {alpha or col.alpha()})"
|
||||
|
||||
|
||||
def describeFont(font: QFont) -> str:
|
||||
"""Describe a font in a way that can be displayed on the GUI."""
|
||||
if isinstance(font, QFont):
|
||||
info = QFontInfo(font)
|
||||
family = info.family()
|
||||
styles = [v for v in info.styleName().split() if v not in family]
|
||||
return " ".join([f"{info.pointSize()} pt", family] + styles)
|
||||
return "Error"
|
||||
|
||||
|
||||
##
|
||||
# Encoder Functions
|
||||
##
|
||||
@@ -449,7 +473,7 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
|
||||
|
||||
indentations = ["\n"]
|
||||
|
||||
def indentChildren(elem, level):
|
||||
def indentChildren(elem: ET.Element, level: int) -> None:
|
||||
chLevel = level + 1
|
||||
try:
|
||||
chIndent = indentations[chLevel]
|
||||
@@ -472,6 +496,8 @@ def xmlIndent(tree: ET.Element | ET.ElementTree) -> None:
|
||||
if last is not None:
|
||||
last.tail = indentations[level]
|
||||
|
||||
return
|
||||
|
||||
if len(tree):
|
||||
indentChildren(tree, 0)
|
||||
tree.tail = "\n"
|
||||
@@ -497,12 +523,11 @@ def readTextFile(path: str | Path) -> str:
|
||||
|
||||
|
||||
def makeFileNameSafe(text: str) -> str:
|
||||
"""Return a filename safe string.
|
||||
"""Return a filename-safe string.
|
||||
See: https://unicode.org/reports/tr15/#Norm_Forms
|
||||
"""
|
||||
text = unicodedata.normalize("NFKC", text).strip()
|
||||
allowed = (" ", ".", "-", "_")
|
||||
return "".join(c for c in text if c.isalnum() or c in allowed)
|
||||
return "".join(c for c in text if c.isprintable() and c not in r'\/:*?"<>|')
|
||||
|
||||
|
||||
def getFileSize(path: Path) -> int:
|
||||
@@ -534,8 +559,9 @@ class NWConfigParser(ConfigParser):
|
||||
helper functions, and support for lists.
|
||||
"""
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self) -> None:
|
||||
super().__init__()
|
||||
return
|
||||
|
||||
def rdStr(self, section: str, option: str, default: str) -> str:
|
||||
"""Read string value."""
|
||||
@@ -586,5 +612,3 @@ class NWConfigParser(ConfigParser):
|
||||
for i in range(min(len(data), len(result))):
|
||||
result[i] = checkInt(data[i].strip(), result[i])
|
||||
return result
|
||||
|
||||
# END Class NWConfigParser
|
||||
|
||||
@@ -5,6 +5,7 @@ novelWriter – Config Class
|
||||
File History:
|
||||
Created: 2018-09-22 [0.0.1] Config
|
||||
Created: 2022-11-09 [2.0rc2] RecentProjects
|
||||
Created: 2024-06-16 [2.5rc1] RecentPaths
|
||||
|
||||
This file is a part of novelWriter
|
||||
Copyright 2018–2024, Veronica Berglyd Olsen
|
||||
@@ -24,24 +25,24 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
import sys
|
||||
import json
|
||||
import logging
|
||||
import sys
|
||||
|
||||
from time import time
|
||||
from pathlib import Path
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
from time import time
|
||||
|
||||
from PyQt5.QtGui import QFontDatabase
|
||||
from PyQt5.QtCore import (
|
||||
PYQT_VERSION, PYQT_VERSION_STR, QT_VERSION, QT_VERSION_STR, QLibraryInfo,
|
||||
QLocale, QStandardPaths, QSysInfo, QTranslator
|
||||
)
|
||||
from PyQt5.QtGui import QFont, QFontDatabase
|
||||
from PyQt5.QtWidgets import QApplication
|
||||
|
||||
from novelwriter.error import formatException, logException
|
||||
from novelwriter.common import NWConfigParser, checkInt, checkPath, formatTimeStamp
|
||||
from novelwriter.common import NWConfigParser, checkInt, checkPath, describeFont, formatTimeStamp
|
||||
from novelwriter.constants import nwFiles, nwUnicode
|
||||
from novelwriter.error import formatException, logException
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -103,18 +104,19 @@ class Config:
|
||||
# User Settings
|
||||
# =============
|
||||
|
||||
self._recentObj = RecentProjects(self)
|
||||
self._recentProjects = RecentProjects(self)
|
||||
self._recentPaths = RecentPaths(self)
|
||||
|
||||
# General GUI Settings
|
||||
self.guiLocale = self._qLocale.name()
|
||||
self.guiTheme = "default" # GUI theme
|
||||
self.guiSyntax = "default_light" # Syntax theme
|
||||
self.guiFont = "" # Defaults to system default font in theme class
|
||||
self.guiFontSize = 11 # Is overridden if system default is loaded
|
||||
self.guiScale = 1.0 # Set automatically by Theme class
|
||||
self.hideVScroll = False # Hide vertical scroll bars on main widgets
|
||||
self.hideHScroll = False # Hide horizontal scroll bars on main widgets
|
||||
self.lastNotes = "0x0" # The latest release notes that have been shown
|
||||
self.guiLocale = self._qLocale.name()
|
||||
self.guiTheme = "default" # GUI theme
|
||||
self.guiSyntax = "default_light" # Syntax theme
|
||||
self.guiFont = QFont() # Main GUI font
|
||||
self.guiScale = 1.0 # Set automatically by Theme class
|
||||
self.hideVScroll = False # Hide vertical scroll bars on main widgets
|
||||
self.hideHScroll = False # Hide horizontal scroll bars on main widgets
|
||||
self.lastNotes = "0x0" # The latest release notes that have been shown
|
||||
self.nativeFont = True # Use native font dialog
|
||||
|
||||
# Size Settings
|
||||
self._mainWinSize = [1200, 650] # Last size of the main GUI window
|
||||
@@ -132,40 +134,42 @@ class Config:
|
||||
self.askBeforeBackup = True # Flag for asking before running automatic backup
|
||||
|
||||
# Text Editor Settings
|
||||
self.textFont = "" # Editor font
|
||||
self.textSize = 12 # Editor font size
|
||||
self.textWidth = 700 # Editor text width
|
||||
self.textMargin = 40 # Editor/viewer text margin
|
||||
self.tabWidth = 40 # Editor tabulator width
|
||||
self.textFont = QFont() # Editor font
|
||||
self.textWidth = 700 # Editor text width
|
||||
self.textMargin = 40 # Editor/viewer text margin
|
||||
self.tabWidth = 40 # Editor tabulator width
|
||||
|
||||
self.focusWidth = 800 # Focus Mode text width
|
||||
self.hideFocusFooter = False # Hide document footer in Focus Mode
|
||||
self.showFullPath = True # Show full document path in editor header
|
||||
self.autoSelect = True # Auto-select word when applying format with no selection
|
||||
self.focusWidth = 800 # Focus Mode text width
|
||||
self.hideFocusFooter = False # Hide document footer in Focus Mode
|
||||
self.showFullPath = True # Show full document path in editor header
|
||||
self.autoSelect = True # Auto-select word when applying format with no selection
|
||||
|
||||
self.doJustify = False # Justify text
|
||||
self.showTabsNSpaces = False # Show tabs and spaces in editor
|
||||
self.showLineEndings = False # Show line endings in editor
|
||||
self.showMultiSpaces = True # Highlight multiple spaces in the text
|
||||
self.doJustify = False # Justify text
|
||||
self.showTabsNSpaces = False # Show tabs and spaces in editor
|
||||
self.showLineEndings = False # Show line endings in editor
|
||||
self.showMultiSpaces = True # Highlight multiple spaces in the text
|
||||
|
||||
self.doReplace = True # Enable auto-replace as you type
|
||||
self.doReplaceSQuote = True # Smart single quotes
|
||||
self.doReplaceDQuote = True # Smart double quotes
|
||||
self.doReplaceDash = True # Replace multiple hyphens with dashes
|
||||
self.doReplaceDots = True # Replace three dots with ellipsis
|
||||
self.doReplace = True # Enable auto-replace as you type
|
||||
self.doReplaceSQuote = True # Smart single quotes
|
||||
self.doReplaceDQuote = True # Smart double quotes
|
||||
self.doReplaceDash = True # Replace multiple hyphens with dashes
|
||||
self.doReplaceDots = True # Replace three dots with ellipsis
|
||||
|
||||
self.autoScroll = False # Typewriter-like scrolling
|
||||
self.autoScrollPos = 30 # Start point for typewriter-like scrolling
|
||||
self.scrollPastEnd = True # Scroll past end of document, and centre cursor
|
||||
self.autoScroll = False # Typewriter-like scrolling
|
||||
self.autoScrollPos = 30 # Start point for typewriter-like scrolling
|
||||
self.scrollPastEnd = True # Scroll past end of document, and centre cursor
|
||||
|
||||
self.highlightQuotes = True # Highlight text in quotes
|
||||
self.allowOpenSQuote = False # Allow open-ended single quotes
|
||||
self.allowOpenDQuote = True # Allow open-ended double quotes
|
||||
self.highlightEmph = True # Add colour to text emphasis
|
||||
self.dialogStyle = 2 # Quote type to use for dialogue
|
||||
self.allowOpenDial = True # Allow open-ended dialogue quotes
|
||||
self.narratorBreak = "" # Symbol to use for narrator break
|
||||
self.dialogLine = "" # Symbol to use for dialogue line
|
||||
self.altDialogOpen = "" # Alternative dialog symbol, open
|
||||
self.altDialogClose = "" # Alternative dialog symbol, close
|
||||
self.highlightEmph = True # Add colour to text emphasis
|
||||
|
||||
self.stopWhenIdle = True # Stop the status bar clock when the user is idle
|
||||
self.userIdleTime = 300 # Time of inactivity to consider user idle
|
||||
self.incNotesWCount = True # The status bar word count includes notes
|
||||
self.stopWhenIdle = True # Stop the status bar clock when the user is idle
|
||||
self.userIdleTime = 300 # Time of inactivity to consider user idle
|
||||
self.incNotesWCount = True # The status bar word count includes notes
|
||||
|
||||
# User-Selected Symbol Settings
|
||||
self.fmtApostrophe = nwUnicode.U_RSQUO
|
||||
@@ -178,7 +182,6 @@ class Config:
|
||||
self.fmtPadThin = False
|
||||
|
||||
# User Paths
|
||||
self._lastPath = self._homePath # The user's last used path
|
||||
self._backupPath = self._backPath # Backup path to use, can be none
|
||||
|
||||
# Spell Checking Settings
|
||||
@@ -251,7 +254,7 @@ class Config:
|
||||
|
||||
@property
|
||||
def recentProjects(self) -> RecentProjects:
|
||||
return self._recentObj
|
||||
return self._recentProjects
|
||||
|
||||
@property
|
||||
def mainWinSize(self) -> list[int]:
|
||||
@@ -341,7 +344,7 @@ class Config:
|
||||
self._outlnPanePos = [int(x/self.guiScale) for x in pos]
|
||||
return
|
||||
|
||||
def setLastPath(self, path: str | Path) -> None:
|
||||
def setLastPath(self, key: str, path: str | Path) -> None:
|
||||
"""Set the last used path. Only the folder is saved, so if the
|
||||
path is not a folder, the parent of the path is used instead.
|
||||
"""
|
||||
@@ -350,8 +353,7 @@ class Config:
|
||||
if not path.is_dir():
|
||||
path = path.parent
|
||||
if path.is_dir():
|
||||
self._lastPath = path
|
||||
logger.debug("Last path updated: %s" % self._lastPath)
|
||||
self._recentPaths.setPath(key, path)
|
||||
return
|
||||
|
||||
def setBackupPath(self, path: Path | str) -> None:
|
||||
@@ -359,23 +361,53 @@ class Config:
|
||||
self._backupPath = checkPath(path, self._backPath)
|
||||
return
|
||||
|
||||
def setTextFont(self, family: str | None, pointSize: int = 12) -> None:
|
||||
def setGuiFont(self, value: QFont | str | None) -> None:
|
||||
"""Update the GUI's font style from settings."""
|
||||
if isinstance(value, QFont):
|
||||
self.guiFont = value
|
||||
elif value and isinstance(value, str):
|
||||
self.guiFont = QFont()
|
||||
self.guiFont.fromString(value)
|
||||
else:
|
||||
font = QFont()
|
||||
fontDB = QFontDatabase()
|
||||
if self.osWindows and "Arial" in fontDB.families():
|
||||
# On Windows we default to Arial if possible
|
||||
font.setFamily("Arial")
|
||||
font.setPointSize(10)
|
||||
else:
|
||||
font = fontDB.systemFont(QFontDatabase.SystemFont.GeneralFont)
|
||||
self.guiFont = font
|
||||
logger.debug("GUI font set to: %s", describeFont(font))
|
||||
|
||||
QApplication.setFont(self.guiFont)
|
||||
|
||||
return
|
||||
|
||||
def setTextFont(self, value: QFont | str | None) -> None:
|
||||
"""Set the text font if it exists. If it doesn't, or is None,
|
||||
set to default font.
|
||||
"""
|
||||
fontDB = QFontDatabase()
|
||||
fontFam = fontDB.families()
|
||||
self.textSize = pointSize
|
||||
if family is None or family not in fontFam:
|
||||
logger.warning("Unknown font '%s'", family)
|
||||
if self.osWindows and "Arial" in fontFam:
|
||||
self.textFont = "Arial"
|
||||
elif self.osDarwin and "Helvetica" in fontFam:
|
||||
self.textFont = "Helvetica"
|
||||
else:
|
||||
self.textFont = fontDB.systemFont(QFontDatabase.SystemFont.GeneralFont).family()
|
||||
if isinstance(value, QFont):
|
||||
self.textFont = value
|
||||
elif value and isinstance(value, str):
|
||||
self.textFont = QFont()
|
||||
self.textFont.fromString(value)
|
||||
else:
|
||||
self.textFont = family
|
||||
fontDB = QFontDatabase()
|
||||
fontFam = fontDB.families()
|
||||
if self.osWindows and "Arial" in fontFam:
|
||||
font = QFont()
|
||||
font.setFamily("Arial")
|
||||
font.setPointSize(12)
|
||||
elif self.osDarwin and "Helvetica" in fontFam:
|
||||
font = QFont()
|
||||
font.setFamily("Helvetica")
|
||||
font.setPointSize(12)
|
||||
else:
|
||||
font = fontDB.systemFont(QFontDatabase.SystemFont.GeneralFont)
|
||||
self.textFont = font
|
||||
logger.debug("Text font set to: %s", describeFont(font))
|
||||
return
|
||||
|
||||
##
|
||||
@@ -390,6 +422,10 @@ class Config:
|
||||
"""Un-scale fixed gui sizes by the screen scale factor."""
|
||||
return int(value/self.guiScale)
|
||||
|
||||
def homePath(self) -> Path:
|
||||
"""The user's home folder."""
|
||||
return self._homePath
|
||||
|
||||
def dataPath(self, target: str | None = None) -> Path:
|
||||
"""Return a path in the data folder."""
|
||||
if isinstance(target, str):
|
||||
@@ -402,11 +438,12 @@ class Config:
|
||||
return self._appPath / "assets" / target
|
||||
return self._appPath / "assets"
|
||||
|
||||
def lastPath(self) -> Path:
|
||||
def lastPath(self, key: str) -> Path:
|
||||
"""Return the last path used by the user, if it exists."""
|
||||
if isinstance(self._lastPath, Path):
|
||||
if self._lastPath.is_dir():
|
||||
return self._lastPath
|
||||
if path := self._recentPaths.getPath(key):
|
||||
asPath = Path(path)
|
||||
if asPath.is_dir():
|
||||
return asPath
|
||||
return self._homePath
|
||||
|
||||
def backupPath(self) -> Path:
|
||||
@@ -480,7 +517,6 @@ class Config:
|
||||
logger.debug("Data Path: %s", self._dataPath)
|
||||
logger.debug("App Root: %s", self._appRoot)
|
||||
logger.debug("App Path: %s", self._appPath)
|
||||
logger.debug("Last Path: %s", self._lastPath)
|
||||
logger.debug("PDF Manual: %s", self.pdfDocs)
|
||||
|
||||
# If the config and data folders don't exist, create them
|
||||
@@ -495,13 +531,8 @@ class Config:
|
||||
(self._dataPath / "syntax").mkdir(exist_ok=True)
|
||||
(self._dataPath / "themes").mkdir(exist_ok=True)
|
||||
|
||||
# Check if config file exists, and load it. If not, we save defaults
|
||||
if (self._confPath / nwFiles.CONF_FILE).is_file():
|
||||
self.loadConfig()
|
||||
else:
|
||||
self.saveConfig()
|
||||
|
||||
self._recentObj.loadCache()
|
||||
self._recentPaths.loadCache()
|
||||
self._recentProjects.loadCache()
|
||||
self._checkOptionalPackages()
|
||||
|
||||
logger.debug("Config instance initialised")
|
||||
@@ -541,6 +572,14 @@ class Config:
|
||||
|
||||
conf = NWConfigParser()
|
||||
cnfPath = self._confPath / nwFiles.CONF_FILE
|
||||
|
||||
if not cnfPath.exists():
|
||||
# Initial file, so we just create one from defaults
|
||||
self.setGuiFont(None)
|
||||
self.setTextFont(None)
|
||||
self.saveConfig()
|
||||
return True
|
||||
|
||||
try:
|
||||
with open(cnfPath, mode="r", encoding="utf-8") as inFile:
|
||||
conf.read_file(inFile)
|
||||
@@ -554,15 +593,14 @@ class Config:
|
||||
|
||||
# Main
|
||||
sec = "Main"
|
||||
self.setGuiFont(conf.rdStr(sec, "font", ""))
|
||||
self.guiTheme = conf.rdStr(sec, "theme", self.guiTheme)
|
||||
self.guiSyntax = conf.rdStr(sec, "syntax", self.guiSyntax)
|
||||
self.guiFont = conf.rdStr(sec, "font", self.guiFont)
|
||||
self.guiFontSize = conf.rdInt(sec, "fontsize", self.guiFontSize)
|
||||
self.guiLocale = conf.rdStr(sec, "localisation", self.guiLocale)
|
||||
self.hideVScroll = conf.rdBool(sec, "hidevscroll", self.hideVScroll)
|
||||
self.hideHScroll = conf.rdBool(sec, "hidehscroll", self.hideHScroll)
|
||||
self.lastNotes = conf.rdStr(sec, "lastnotes", self.lastNotes)
|
||||
self._lastPath = conf.rdPath(sec, "lastpath", self._lastPath)
|
||||
self.nativeFont = conf.rdBool(sec, "nativefont", self.nativeFont)
|
||||
|
||||
# Sizes
|
||||
sec = "Sizes"
|
||||
@@ -584,8 +622,7 @@ class Config:
|
||||
|
||||
# Editor
|
||||
sec = "Editor"
|
||||
self.textFont = conf.rdStr(sec, "textfont", self.textFont)
|
||||
self.textSize = conf.rdInt(sec, "textsize", self.textSize)
|
||||
self.setTextFont(conf.rdStr(sec, "textfont", ""))
|
||||
self.textWidth = conf.rdInt(sec, "width", self.textWidth)
|
||||
self.textMargin = conf.rdInt(sec, "margin", self.textMargin)
|
||||
self.tabWidth = conf.rdInt(sec, "tabwidth", self.tabWidth)
|
||||
@@ -614,9 +651,12 @@ class Config:
|
||||
self.showMultiSpaces = conf.rdBool(sec, "showmultispaces", self.showMultiSpaces)
|
||||
self.incNotesWCount = conf.rdBool(sec, "incnoteswcount", self.incNotesWCount)
|
||||
self.showFullPath = conf.rdBool(sec, "showfullpath", self.showFullPath)
|
||||
self.highlightQuotes = conf.rdBool(sec, "highlightquotes", self.highlightQuotes)
|
||||
self.allowOpenSQuote = conf.rdBool(sec, "allowopensquote", self.allowOpenSQuote)
|
||||
self.allowOpenDQuote = conf.rdBool(sec, "allowopendquote", self.allowOpenDQuote)
|
||||
self.dialogStyle = conf.rdInt(sec, "dialogstyle", self.dialogStyle)
|
||||
self.allowOpenDial = conf.rdBool(sec, "allowopendial", self.allowOpenDial)
|
||||
self.narratorBreak = conf.rdStr(sec, "narratorbreak", self.narratorBreak)
|
||||
self.altDialogOpen = conf.rdStr(sec, "altdialogopen", self.altDialogOpen)
|
||||
self.altDialogClose = conf.rdStr(sec, "altdialogclose", self.altDialogClose)
|
||||
self.dialogLine = conf.rdStr(sec, "dialogline", self.dialogLine)
|
||||
self.highlightEmph = conf.rdBool(sec, "highlightemph", self.highlightEmph)
|
||||
self.stopWhenIdle = conf.rdBool(sec, "stopwhenidle", self.stopWhenIdle)
|
||||
self.userIdleTime = conf.rdInt(sec, "useridletime", self.userIdleTime)
|
||||
@@ -662,15 +702,14 @@ class Config:
|
||||
}
|
||||
|
||||
conf["Main"] = {
|
||||
"font": self.guiFont.toString(),
|
||||
"theme": str(self.guiTheme),
|
||||
"syntax": str(self.guiSyntax),
|
||||
"font": str(self.guiFont),
|
||||
"fontsize": str(self.guiFontSize),
|
||||
"localisation": str(self.guiLocale),
|
||||
"hidevscroll": str(self.hideVScroll),
|
||||
"hidehscroll": str(self.hideHScroll),
|
||||
"lastnotes": str(self.lastNotes),
|
||||
"lastpath": str(self._lastPath),
|
||||
"nativefont": str(self.nativeFont),
|
||||
}
|
||||
|
||||
conf["Sizes"] = {
|
||||
@@ -692,8 +731,7 @@ class Config:
|
||||
}
|
||||
|
||||
conf["Editor"] = {
|
||||
"textfont": str(self.textFont),
|
||||
"textsize": str(self.textSize),
|
||||
"textfont": self.textFont.toString(),
|
||||
"width": str(self.textWidth),
|
||||
"margin": str(self.textMargin),
|
||||
"tabwidth": str(self.tabWidth),
|
||||
@@ -722,9 +760,12 @@ class Config:
|
||||
"showmultispaces": str(self.showMultiSpaces),
|
||||
"incnoteswcount": str(self.incNotesWCount),
|
||||
"showfullpath": str(self.showFullPath),
|
||||
"highlightquotes": str(self.highlightQuotes),
|
||||
"allowopensquote": str(self.allowOpenSQuote),
|
||||
"allowopendquote": str(self.allowOpenDQuote),
|
||||
"dialogstyle": str(self.dialogStyle),
|
||||
"allowopendial": str(self.allowOpenDial),
|
||||
"narratorbreak": str(self.narratorBreak),
|
||||
"altdialogopen": str(self.altDialogOpen),
|
||||
"altdialogclose": str(self.altDialogClose),
|
||||
"dialogline": str(self.dialogLine),
|
||||
"highlightemph": str(self.highlightEmph),
|
||||
"stopwhenidle": str(self.stopWhenIdle),
|
||||
"useridletime": str(self.userIdleTime),
|
||||
@@ -769,7 +810,7 @@ class Config:
|
||||
"""Pack a list of items into a comma-separated string for saving
|
||||
to the config file.
|
||||
"""
|
||||
return ", ".join([str(inVal) for inVal in data])
|
||||
return ", ".join(str(inVal) for inVal in data)
|
||||
|
||||
def _checkOptionalPackages(self) -> None:
|
||||
"""Check optional packages used by some features."""
|
||||
@@ -783,8 +824,6 @@ class Config:
|
||||
logger.debug("Checking package 'pyenchant': OK")
|
||||
return
|
||||
|
||||
# END Class Config
|
||||
|
||||
|
||||
class RecentProjects:
|
||||
|
||||
@@ -854,4 +893,55 @@ class RecentProjects:
|
||||
self.saveCache()
|
||||
return
|
||||
|
||||
# END Class RecentProjects
|
||||
|
||||
class RecentPaths:
|
||||
|
||||
KEYS = ["default", "project", "import", "outline", "stats"]
|
||||
|
||||
def __init__(self, config: Config) -> None:
|
||||
self._conf = config
|
||||
self._data = {}
|
||||
return
|
||||
|
||||
def setPath(self, key: str, path: Path | str) -> None:
|
||||
"""Set a path for a given key, and save the cache."""
|
||||
if key in self.KEYS:
|
||||
self._data[key] = str(path)
|
||||
self.saveCache()
|
||||
return
|
||||
|
||||
def getPath(self, key: str) -> str | None:
|
||||
"""Get a path for a given key, or return None."""
|
||||
return self._data.get(key)
|
||||
|
||||
def loadCache(self) -> bool:
|
||||
"""Load the cache file for recent paths."""
|
||||
self._data = {}
|
||||
cacheFile = self._conf.dataPath(nwFiles.RECENT_PATH)
|
||||
if cacheFile.is_file():
|
||||
try:
|
||||
with open(cacheFile, mode="r", encoding="utf-8") as inFile:
|
||||
data = json.load(inFile)
|
||||
if isinstance(data, dict):
|
||||
for key, path in data.items():
|
||||
if key in self.KEYS and isinstance(path, str):
|
||||
self._data[key] = path
|
||||
except Exception:
|
||||
logger.error("Could not load recent paths cache")
|
||||
logException()
|
||||
return False
|
||||
return True
|
||||
|
||||
def saveCache(self) -> bool:
|
||||
"""Save the cache dictionary of recent paths."""
|
||||
cacheFile = self._conf.dataPath(nwFiles.RECENT_PATH)
|
||||
cacheTemp = cacheFile.with_suffix(".tmp")
|
||||
try:
|
||||
with open(cacheTemp, mode="w+", encoding="utf-8") as outFile:
|
||||
json.dump(self._data, outFile, indent=2)
|
||||
cacheTemp.replace(cacheFile)
|
||||
except Exception:
|
||||
logger.error("Could not save recent paths cache")
|
||||
logException()
|
||||
return False
|
||||
return True
|
||||
|
||||