From 0eb7185d40a378ab4ab8a55a2d3933bf679866c1 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Wed, 30 Nov 2022 15:14:37 -0700 Subject: [PATCH 01/48] feat: add a macos build script Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- macos/Info.plist | 60 ++++++++++++++++++++++++++ macos/Info.plist.in | 60 ++++++++++++++++++++++++++ macos/build.sh | 92 ++++++++++++++++++++++++++++++++++++++++ macos/generate_icns.sh | 19 +++++++++ macos/generate_plist.py | 26 ++++++++++++ macos/novelwriter.icns | Bin 0 -> 77254 bytes 6 files changed, 257 insertions(+) create mode 100644 macos/Info.plist create mode 100644 macos/Info.plist.in create mode 100644 macos/build.sh create mode 100755 macos/generate_icns.sh create mode 100644 macos/generate_plist.py create mode 100644 macos/novelwriter.icns diff --git a/macos/Info.plist b/macos/Info.plist new file mode 100644 index 00000000..835ea503 --- /dev/null +++ b/macos/Info.plist @@ -0,0 +1,60 @@ + + + + + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True + CFBundleDevelopmentRegion + English + CFBundleExecutable + novelwriter + CFBundleGetInfoString + novelWriter: A markdown-like text editor for planning and writing novels. + CFBundleIconFile + novelwriter.icns + CFBundleIdentifier + io.novelwriter.novelWriter + CFBundleName + novelWriter + CFBundleInfoDictionaryVersion + 6.0 + CFBundleShortVersionString + 2.0.1 + CFBundleSignature + ???? + CFBundleVersion + 2.0.1 + CFBundlePackageType + APPL + NSHumanReadableCopyright + © 2018–2022, Veronica Berglyd Olsen + IFMajorVersion + 0 + IFMinorVersion + 1 + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + nwx + + CFBundleTypeName + novelWriter Project + CFBundleTypeOSTypes + + TEXT + utxt + TUTX + **** + + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + + \ No newline at end of file diff --git a/macos/Info.plist.in b/macos/Info.plist.in new file mode 100644 index 00000000..f5ab4d2c --- /dev/null +++ b/macos/Info.plist.in @@ -0,0 +1,60 @@ + + + + + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True + CFBundleDevelopmentRegion + English + CFBundleExecutable + {MACOSX_BUNDLE_EXACUTABLE_NAME} + CFBundleGetInfoString + {MACOSX_BUNDLE_INFO_STRING} + CFBundleIconFile + {MACOSX_BUNDLE_ICON_FILE} + CFBundleIdentifier + {MACOSX_BUNDLE_IDENTIFIER} + CFBundleName + {MACOSX_BUNDLE_NAME} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleShortVersionString + {MACOSX_BUNDLE_SHORT_VERSION} + CFBundleSignature + ???? + CFBundleVersion + {MACOSX_BUNDLE_VERSION} + CFBundlePackageType + APPL + NSHumanReadableCopyright + {MACOSX_BUNDLE_COPYRIGHT} + IFMajorVersion + 0 + IFMinorVersion + 1 + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + nwx + + CFBundleTypeName + novelWriter Project + CFBundleTypeOSTypes + + TEXT + utxt + TUTX + **** + + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + + \ No newline at end of file diff --git a/macos/build.sh b/macos/build.sh new file mode 100644 index 00000000..9259d3a7 --- /dev/null +++ b/macos/build.sh @@ -0,0 +1,92 @@ +#! /bin/bash + +# use RAM disk if possible +if [ -d /dev/shm ]; then + TEMP_BASE=/dev/shm +else + TEMP_BASE=/tmp +fi + +BUILD_DIR=$(mktemp -d "$TEMP_BASE/novelWriter-build-XXXXXX") + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +cleanup () { + if [ -d "$BUILD_DIR" ]; then + rm -rf "$BUILD_DIR" + fi +} + +trap cleanup EXIT + +OLD_CWD="$(pwd)" + +VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/../novelwriter/__init__.py)" + + +pushd "$BUILD_DIR"/ || exit 1 + +# install Miniconda, a self-contained Python distribution +wget https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh +bash Miniconda3-latest-MacOSX-x86_64.sh -b -p ~/miniconda -f +rm Miniconda3-latest-MacOSX-x86_64.sh +export PATH="$HOME/miniconda/bin:$PATH" + +# create conda env +conda create -n novelWriter python --yes +source activate novelWriter + +# install dependencies +pip install -r "$SCRIPT_DIR/../requirements.txt" + +# leave conda env +source deactivate + +# create .app Framework +mkdir -p novelWriter.app/Contents/ +mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWriter.app/Contents/Resources/novelWriter +mv $SCRIPT_DIR/../macos/Info.plist novelWriter.app/Contents/Info.plist + +# copy Miniconda env +cp -R ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ + +# copy Pext +cp -R $SCRIPT_DIR/../* novelWriter.app/Contents/Resources/novelWriter/ + + +# create entry script +cat > novelWriter.app/Contents/MacOS/novelWriter <<\EOF +#!/bin/bash +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +$DIR/../Resources/bin/python -sE $DIR/../Resources/novelWriter/novelwriter $@ +EOF + +# make executable +chmod a+x novelWriter.app/Contents/MacOS/novelWriter + +# remove bloat +pushd novelWriter.app/Contents/Resources || exit 1 + +# cleanup commands HERE +find . -type d -iname '__pycache__' -print0 | xargs -0 rm -r + +#remove web engine +rm lib/python3.7/site-packages/PyQt5/QtWebEngine* || true +rm -r lib/python3.7/site-packages/PyQt5/Qt/translations/qtwebengine* || true +rm lib/python3.7/site-packages/PyQt5/Qt/resources/qtwebengine* || true +rm -r lib/python3.7/site-packages/PyQt5/Qt/qml/QtWebEngine* || true +rm -r lib/python3.7/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true +rm lib/python3.7/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true +rm lib/python3.7/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true + +popd || exit 1 +popd || exit 1 + + +# generate .dmg + +brew install create-dmg +# "--skip-jenkins" is a temporary workaround for https://github.com/create-dmg/create-dmg/issues/72 +create-dmg --skip-jenkins --volname "novelWriter $VERSION" --volicon $SCRIPT_DIR/../macos/novelwriter.icns \ + --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon novelWriter.app 200 190 --hide-extension novelWriter.app \ + --app-drop-link 600 185 novelWriter-"${VERSION}".dmg "$BUILD_DIR"/ diff --git a/macos/generate_icns.sh b/macos/generate_icns.sh new file mode 100755 index 00000000..ef4747dc --- /dev/null +++ b/macos/generate_icns.sh @@ -0,0 +1,19 @@ +#! /usr/bin/env bash + +if ! command -v png2icns &> /dev/null +then + echo "png2icns cound not be found, it is required. Please install a package like icnsutils or libicns." + exit +fi + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +mkdir -p $SCRIPT_DIR/icons + +for size in 16x16 32x32 48x48 128x128 256x256; do + cp $SCRIPT_DIR/../setup/data/hicolor/$size/apps/novelwriter.png $SCRIPT_DIR/icons/icon_${size}px.png +done + +png2icns $SCRIPT_DIR/novelwriter.icns $SCRIPT_DIR/icons/icon_*px.png + +rm -r $SCRIPT_DIR/icons \ No newline at end of file diff --git a/macos/generate_plist.py b/macos/generate_plist.py new file mode 100644 index 00000000..2f6e3c26 --- /dev/null +++ b/macos/generate_plist.py @@ -0,0 +1,26 @@ +import os + +SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) + +SETTINGS = { + "MACOSX_BUNDLE_COPYRIGHT": "© 2018–2022, Veronica Berglyd Olsen ", + "MACOSX_BUNDLE_IDENTIFIER": "io.novelwriter.novelWriter", + "MACOSX_BUNDLE_NAME": "novelWriter", + "MACOSX_BUNDLE_EXACUTABLE_NAME": "novelwriter", + "MACOSX_BUNDLE_ICON_FILE": "novelwriter.icns", + "MACOSX_BUNDLE_INFO_STRING": "novelWriter: A markdown-like text editor for planning and writing novels.", + "MACOSX_BUNDLE_SHORT_VERSION": "2.0.1", # Must be purely numerical + "MACOSX_BUNDLE_VERSION": "2.0.1", # Must be purely numerical +} + +if __name__ == "__main__": + + template_filename = os.path.join(SCRIPT_DIR, "Info.plist.in") + with open(template_filename, "r") as tmfile: + template = tmfile.read() + + plist = template.format(**SETTINGS) + + plist_filename = os.path.join(SCRIPT_DIR, "Info.plist") + with open(plist_filename, "w") as plistfile: + plistfile.write(plist) diff --git a/macos/novelwriter.icns b/macos/novelwriter.icns new file mode 100644 index 0000000000000000000000000000000000000000..8a05c8e916738c6ed6e4b5f3a618927429414dd4 GIT binary patch literal 77254 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 li%OX|FGRI Date: Thu, 1 Dec 2022 01:17:14 -0700 Subject: [PATCH 02/48] feat: cleanup build script use python 3.10 use curl over wget (pre-installed) ensure enchant is installed cleanup better to limit app bundle size fix Info.plist Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- macos/Info.plist | 2 +- macos/build.sh | 69 +++++++++++++++++++++++++++++++++++++----------- 2 files changed, 54 insertions(+), 17 deletions(-) mode change 100644 => 100755 macos/build.sh diff --git a/macos/Info.plist b/macos/Info.plist index 835ea503..6db23257 100644 --- a/macos/Info.plist +++ b/macos/Info.plist @@ -29,7 +29,7 @@ CFBundlePackageType APPL NSHumanReadableCopyright - © 2018–2022, Veronica Berglyd Olsen + © 2018–2022, Veronica Berglyd Olsen <code@vkbo.net> IFMajorVersion 0 IFMinorVersion diff --git a/macos/build.sh b/macos/build.sh old mode 100644 new mode 100755 index 9259d3a7..8956f22d --- a/macos/build.sh +++ b/macos/build.sh @@ -19,6 +19,8 @@ cleanup () { trap cleanup EXIT +echo "Building in: $BUILD_DIR" + OLD_CWD="$(pwd)" VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/../novelwriter/__init__.py)" @@ -26,39 +28,61 @@ VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/. pushd "$BUILD_DIR"/ || exit 1 +echo "Downloading Miniconda ..." # install Miniconda, a self-contained Python distribution -wget https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh +curl -LO https://repo.continuum.io/miniconda/Miniconda3-latest-MacOSX-x86_64.sh bash Miniconda3-latest-MacOSX-x86_64.sh -b -p ~/miniconda -f rm Miniconda3-latest-MacOSX-x86_64.sh export PATH="$HOME/miniconda/bin:$PATH" +echo "Creating conda env ..." # create conda env -conda create -n novelWriter python --yes +conda create -n novelWriter -c conda-forge python=3.10 --yes source activate novelWriter +echo "installing dictionaries ..." +conda install -c conda-forge enchant hunspell-en --yes + +echo "installing python deps ..." # install dependencies pip install -r "$SCRIPT_DIR/../requirements.txt" # leave conda env -source deactivate +conda deactivate +echo "Building app bundle ..." # create .app Framework mkdir -p novelWriter.app/Contents/ mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWriter.app/Contents/Resources/novelWriter -mv $SCRIPT_DIR/../macos/Info.plist novelWriter.app/Contents/Info.plist +cp $SCRIPT_DIR/../macos/Info.plist novelWriter.app/Contents/Info.plist +echo "Copying miniconda env to bundle ..." # copy Miniconda env cp -R ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ -# copy Pext -cp -R $SCRIPT_DIR/../* novelWriter.app/Contents/Resources/novelWriter/ +echo "Copying novelWriter to bundle ..." +# copy novelWriter + +FILES_COPY=( + "CHANGELOG.md" "MANIFEST.in" "CREDITS.md" "LICENSE.md" + "CONTRIBUTING.md" "CODE_OF_CONDUCT.md" "i18n" "novelwriter" + "novelWriter.py" +) + +for file in "${FILES_COPY[@]}"; do + echo "Copying $SCRIPT_DIR/../$file ..." + cp -R $SCRIPT_DIR/../$file novelWriter.app/Contents/Resources/novelWriter/ +done + +cp $SCRIPT_DIR/../macos/novelwriter.icns novelWriter.app/Contents/Resources/ +#cp -R $SCRIPT_DIR/../* novelWriter.app/Contents/Resources/novelWriter/ # create entry script cat > novelWriter.app/Contents/MacOS/novelWriter <<\EOF #!/bin/bash DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -$DIR/../Resources/bin/python -sE $DIR/../Resources/novelWriter/novelwriter $@ +$DIR/../Resources/bin/python -sE $DIR/../Resources/novelWriter/novelWriter.py $@ EOF # make executable @@ -67,26 +91,39 @@ chmod a+x novelWriter.app/Contents/MacOS/novelWriter # remove bloat pushd novelWriter.app/Contents/Resources || exit 1 +echo "Cleaning unused files from bundle ..." # cleanup commands HERE find . -type d -iname '__pycache__' -print0 | xargs -0 rm -r +rm -rf pkgs +rm -rf cmake +rm -rf share/{gtk-,}doc + +rm -rf lib/python3.1/ + #remove web engine -rm lib/python3.7/site-packages/PyQt5/QtWebEngine* || true -rm -r lib/python3.7/site-packages/PyQt5/Qt/translations/qtwebengine* || true -rm lib/python3.7/site-packages/PyQt5/Qt/resources/qtwebengine* || true -rm -r lib/python3.7/site-packages/PyQt5/Qt/qml/QtWebEngine* || true -rm -r lib/python3.7/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true -rm lib/python3.7/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true -rm lib/python3.7/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true +rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true +rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true +rm lib/python3.*/site-packages/PyQt5/Qt/resources/qtwebengine* || true +rm -r lib/python3.*/site-packages/PyQt5/Qt/qml/QtWebEngine* || true +rm -r lib/python3.*/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true +rm lib/python3.*/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true +rm lib/python3.*/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true popd || exit 1 popd || exit 1 - +echo "Packageing App" # generate .dmg brew install create-dmg # "--skip-jenkins" is a temporary workaround for https://github.com/create-dmg/create-dmg/issues/72 -create-dmg --skip-jenkins --volname "novelWriter $VERSION" --volicon $SCRIPT_DIR/../macos/novelwriter.icns \ +create-dmg --volname "novelWriter $VERSION" --volicon $SCRIPT_DIR/../macos/novelwriter.icns \ --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon novelWriter.app 200 190 --hide-extension novelWriter.app \ --app-drop-link 600 185 novelWriter-"${VERSION}".dmg "$BUILD_DIR"/ + +pushd $BUILD_DIR || exit 1 +zip -qr novelWriter.app.zip novelWriter.app +popd || exit 1 + +mv $BUILD_DIR/novelWriter.app.zip novelWriter.app.zip \ No newline at end of file From faf302c6d89789157d64e2178431267d4b64cc07 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:11:21 -0700 Subject: [PATCH 03/48] feat: add github workflow to build for macos Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 66 +++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 .github/workflows/build.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..550e2910 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,66 @@ +name: Build + +on: + push: + tags: + - '*' + branches: + - 'macos-appbundle' + +jobs: + build: + strategy: + fail-fast: false + matrix: + include: + - os: macos-12 + name: macos + runs-on: ${{ matrix.os }} + + steps: + ## + # PREPARE + ## + - name: Checkout + uses: actions/checkout@v3 + with: + submodules: 'true' + + - name: Set short version + shell: bash + run: | + ver_short=`git rev-parse --short HEAD` + echo "VERSION=$ver_short" >> $GITHUB_ENV + + - name: Install Dependencies (macOS) + if: runner.os == 'macOS' + run: | + brew update + brew install create-dmg + + ## + # BUILD + ## + + - name: Build (macOS) + if: runner.os == 'macOS' + run: | + ./macos/build.sh + + ## + # UPLOAD BUILDS + ## + + - name: Upload binary zip (macOS) + if: runner.os == 'macOS' + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip + path: novelWriter.app.zip + + - name: Upload dmg (macOS) + if: runner.os == 'macOS' + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg + path: novelWriter-${{ env.VERSION }}.dmg From 8a9a52da5709e42c11e9e27743b67c6f6a8f0612 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 02:26:26 -0700 Subject: [PATCH 04/48] fix: pull the version from the python file Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 550e2910..f6c1dd2c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -30,7 +30,9 @@ jobs: shell: bash run: | ver_short=`git rev-parse --short HEAD` - echo "VERSION=$ver_short" >> $GITHUB_ENV + ver_novelwriter=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py` + echo "VERSION=$ver_novelwriter" >> $GITHUB_ENV + echo "VERSION_SHORT=$ver_short" >> $GITHUB_ENV - name: Install Dependencies (macOS) if: runner.os == 'macOS' From b29b6d6eefc9fd63c3bd0b3a23da373e0893ec5c Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 03:01:43 -0700 Subject: [PATCH 05/48] fix: don't remove the python symlink Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- macos/build.sh | 2 -- 1 file changed, 2 deletions(-) diff --git a/macos/build.sh b/macos/build.sh index 8956f22d..328c8820 100755 --- a/macos/build.sh +++ b/macos/build.sh @@ -99,8 +99,6 @@ rm -rf pkgs rm -rf cmake rm -rf share/{gtk-,}doc -rm -rf lib/python3.1/ - #remove web engine rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true From 682986d9b9a569e8a11a183ea3b8d97fe4cf1098 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 03:30:42 -0700 Subject: [PATCH 06/48] fix: add entitlements Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- macos/App.entitlements | 10 ++++++++++ macos/build.sh | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 macos/App.entitlements diff --git a/macos/App.entitlements b/macos/App.entitlements new file mode 100644 index 00000000..40dc976a --- /dev/null +++ b/macos/App.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.cs.disable-library-validation + + com.apple.security.cs.allow-dyld-environment-variables + + + \ No newline at end of file diff --git a/macos/build.sh b/macos/build.sh index 328c8820..79acc276 100755 --- a/macos/build.sh +++ b/macos/build.sh @@ -88,6 +88,8 @@ EOF # make executable chmod a+x novelWriter.app/Contents/MacOS/novelWriter +sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter" + # remove bloat pushd novelWriter.app/Contents/Resources || exit 1 @@ -111,7 +113,10 @@ rm lib/python3.*/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true popd || exit 1 popd || exit 1 -echo "Packageing App" +echo "Packageing App ..." + + + # generate .dmg brew install create-dmg From a228c4b32ab20c377adf990b808c215c387c3f34 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:49:41 -0700 Subject: [PATCH 07/48] Squashed commit of the following: commit a1f358b6f0a193be7d3d72fa4082fa09701ebe16 Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 11:48:38 2022 -0700 fix: reneable the res of the build Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit 8ed02b09aeb9c302e30023fcbf73c8b5e3bbc8ff Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 11:41:19 2022 -0700 fix: install qt for tools Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit d68dc29d49f1a2547912fc97867126f4fc6d96c4 Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 11:32:07 2022 -0700 fix: add tex-gyre to texlive install Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit ff654a2a914cd00c867088baf147f8ccd70a185c Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 11:08:46 2022 -0700 fix: add required latex pkgs Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit 1a4babc11c274f69c6c04edddfc5011f9162759e Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 10:17:31 2022 -0700 fix: install sphinx via pip3 Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit 4b602b0955fabc2b5067bae46c3408dab0f0dd72 Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 10:05:46 2022 -0700 fix: ensure sphinx is properly installed Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit 59ad26f434d6c5391c2448724aa44587c2cf7a46 Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 09:59:40 2022 -0700 feat: install scheme-basic texlive pkg run setup.py in proper dir Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> commit 16cd50307fbd4519fd6ebdc719e78e99eb37d02b Author: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu Dec 1 09:54:42 2022 -0700 feat: build manual, translations, and sample project zip Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 61 ++++++++++++++++++++++++++++--------- macos/build.sh | 9 ++++-- 2 files changed, 53 insertions(+), 17 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index f6c1dd2c..0d4e17b8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ on: tags: - '*' branches: - - 'macos-appbundle' + - 'macos-docs-build' jobs: build: @@ -15,6 +15,12 @@ jobs: include: - os: macos-12 name: macos + qt_ver: 5 + qt_host: mac + qt_version: '5.15.2' + qt_modules: '' + qt_tools: '' + runs-on: ${{ matrix.os }} steps: @@ -33,12 +39,37 @@ jobs: ver_novelwriter=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py` echo "VERSION=$ver_novelwriter" >> $GITHUB_ENV echo "VERSION_SHORT=$ver_short" >> $GITHUB_ENV + + - name: Install Qt (Linux) + if: runner.os == 'Linux' && matrix.qt_ver != 6 + run: | + sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5 + + - name: Install Qt (macOS, AppImage & Windows MSVC) + if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' || (runner.os == 'Windows' && matrix.msystem == '') + uses: jurplel/install-qt-action@v3 + with: + version: ${{ matrix.qt_version }} + host: ${{ matrix.qt_host }} + target: 'desktop' + arch: ${{ matrix.qt_arch }} + modules: ${{ matrix.qt_modules }} + tools: ${{ matrix.qt_tools }} + cache: true + + - name: Setup TeX Live + uses: teatimeguest/setup-texlive-action@v2 + with: + packages: >- + scheme-basic + collection-latexextra + latexmk + tex-gyre - name: Install Dependencies (macOS) if: runner.os == 'macOS' run: | - brew update - brew install create-dmg + pip3 install sphinx ## # BUILD @@ -53,16 +84,16 @@ jobs: # UPLOAD BUILDS ## - - name: Upload binary zip (macOS) - if: runner.os == 'macOS' - uses: actions/upload-artifact@v3 - with: - name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip - path: novelWriter.app.zip + # - name: Upload binary zip (macOS) + # if: runner.os == 'macOS' + # uses: actions/upload-artifact@v3 + # with: + # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip + # path: novelWriter.app.zip - - name: Upload dmg (macOS) - if: runner.os == 'macOS' - uses: actions/upload-artifact@v3 - with: - name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg - path: novelWriter-${{ env.VERSION }}.dmg + # - name: Upload dmg (macOS) + # if: runner.os == 'macOS' + # uses: actions/upload-artifact@v3 + # with: + # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg + # path: novelWriter-${{ env.VERSION }}.dmg diff --git a/macos/build.sh b/macos/build.sh index 79acc276..4faa875e 100755 --- a/macos/build.sh +++ b/macos/build.sh @@ -25,6 +25,13 @@ OLD_CWD="$(pwd)" VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/../novelwriter/__init__.py)" +pushd "$SCRIPT_DIR/../" || exit 1 + +python3 setup.py manual qtlrelease sample + +ls -lah . + +popd || exit 1 pushd "$BUILD_DIR"/ || exit 1 @@ -115,8 +122,6 @@ popd || exit 1 echo "Packageing App ..." - - # generate .dmg brew install create-dmg From 82dd1c46cf9a61425dde0c0d6aeffa4acf1d804c Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 11:50:20 -0700 Subject: [PATCH 08/48] fix: force build on this branch for testing Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 0d4e17b8..fa3d9290 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -5,7 +5,7 @@ on: tags: - '*' branches: - - 'macos-docs-build' + - 'macos-appbundle' jobs: build: @@ -84,16 +84,16 @@ jobs: # UPLOAD BUILDS ## - # - name: Upload binary zip (macOS) - # if: runner.os == 'macOS' - # uses: actions/upload-artifact@v3 - # with: - # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip - # path: novelWriter.app.zip + - name: Upload binary zip (macOS) + if: runner.os == 'macOS' + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip + path: novelWriter.app.zip - # - name: Upload dmg (macOS) - # if: runner.os == 'macOS' - # uses: actions/upload-artifact@v3 - # with: - # name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg - # path: novelWriter-${{ env.VERSION }}.dmg + - name: Upload dmg (macOS) + if: runner.os == 'macOS' + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg + path: novelWriter-${{ env.VERSION }}.dmg From b7e7a087f8185f36be46715c6d962e262a6f5781 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Thu, 1 Dec 2022 15:53:51 -0700 Subject: [PATCH 09/48] fix: remove codesign for now, only build on tags Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 2 -- macos/build.sh | 3 ++- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fa3d9290..e34ab056 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -4,8 +4,6 @@ on: push: tags: - '*' - branches: - - 'macos-appbundle' jobs: build: diff --git a/macos/build.sh b/macos/build.sh index 4faa875e..b04491aa 100755 --- a/macos/build.sh +++ b/macos/build.sh @@ -95,7 +95,8 @@ EOF # make executable chmod a+x novelWriter.app/Contents/MacOS/novelWriter -sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter" +#do codesigning +#sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter" # remove bloat pushd novelWriter.app/Contents/Resources || exit 1 From f912d55177c6c1f3f7580e9531a55b550076960d Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 8 Jan 2023 21:08:21 -0700 Subject: [PATCH 10/48] refactor: move plist gen into setup.py Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 15 +-- macos/Info.plist | 60 ------------ macos/Info.plist.in | 60 ------------ macos/generate_plist.py | 26 ------ setup.py | 116 ++++++++++++++++++++++++ {macos => setup/macos}/App.entitlements | 0 {macos => setup/macos}/build.sh | 30 +++--- {macos => setup/macos}/generate_icns.sh | 2 +- {macos => setup/macos}/novelwriter.icns | Bin 9 files changed, 139 insertions(+), 170 deletions(-) delete mode 100644 macos/Info.plist delete mode 100644 macos/Info.plist.in delete mode 100644 macos/generate_plist.py rename {macos => setup/macos}/App.entitlements (100%) rename {macos => setup/macos}/build.sh (82%) rename {macos => setup/macos}/generate_icns.sh (95%) rename {macos => setup/macos}/novelwriter.icns (100%) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e34ab056..1f66fb62 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -76,22 +76,17 @@ jobs: - name: Build (macOS) if: runner.os == 'macOS' run: | - ./macos/build.sh + ./setup/macos/build.sh ## # UPLOAD BUILDS ## - - name: Upload binary zip (macOS) + - name: Upload binary zip / dmg (macOS) if: runner.os == 'macOS' uses: actions/upload-artifact@v3 with: name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip - path: novelWriter.app.zip - - - name: Upload dmg (macOS) - if: runner.os == 'macOS' - uses: actions/upload-artifact@v3 - with: - name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.dmg - path: novelWriter-${{ env.VERSION }}.dmg + path: | + dist_macos/novelWriter-${{ env.VERSION }}.zip + dist_macos/novelWriter-${{ env.VERSION }}.dmg diff --git a/macos/Info.plist b/macos/Info.plist deleted file mode 100644 index 6db23257..00000000 --- a/macos/Info.plist +++ /dev/null @@ -1,60 +0,0 @@ - - - - - NSPrincipalClass - NSApplication - NSHighResolutionCapable - True - CFBundleDevelopmentRegion - English - CFBundleExecutable - novelwriter - CFBundleGetInfoString - novelWriter: A markdown-like text editor for planning and writing novels. - CFBundleIconFile - novelwriter.icns - CFBundleIdentifier - io.novelwriter.novelWriter - CFBundleName - novelWriter - CFBundleInfoDictionaryVersion - 6.0 - CFBundleShortVersionString - 2.0.1 - CFBundleSignature - ???? - CFBundleVersion - 2.0.1 - CFBundlePackageType - APPL - NSHumanReadableCopyright - © 2018–2022, Veronica Berglyd Olsen <code@vkbo.net> - IFMajorVersion - 0 - IFMinorVersion - 1 - CFBundleDocumentTypes - - - CFBundleTypeExtensions - - nwx - - CFBundleTypeName - novelWriter Project - CFBundleTypeOSTypes - - TEXT - utxt - TUTX - **** - - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - - \ No newline at end of file diff --git a/macos/Info.plist.in b/macos/Info.plist.in deleted file mode 100644 index f5ab4d2c..00000000 --- a/macos/Info.plist.in +++ /dev/null @@ -1,60 +0,0 @@ - - - - - NSPrincipalClass - NSApplication - NSHighResolutionCapable - True - CFBundleDevelopmentRegion - English - CFBundleExecutable - {MACOSX_BUNDLE_EXACUTABLE_NAME} - CFBundleGetInfoString - {MACOSX_BUNDLE_INFO_STRING} - CFBundleIconFile - {MACOSX_BUNDLE_ICON_FILE} - CFBundleIdentifier - {MACOSX_BUNDLE_IDENTIFIER} - CFBundleName - {MACOSX_BUNDLE_NAME} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleShortVersionString - {MACOSX_BUNDLE_SHORT_VERSION} - CFBundleSignature - ???? - CFBundleVersion - {MACOSX_BUNDLE_VERSION} - CFBundlePackageType - APPL - NSHumanReadableCopyright - {MACOSX_BUNDLE_COPYRIGHT} - IFMajorVersion - 0 - IFMinorVersion - 1 - CFBundleDocumentTypes - - - CFBundleTypeExtensions - - nwx - - CFBundleTypeName - novelWriter Project - CFBundleTypeOSTypes - - TEXT - utxt - TUTX - **** - - CFBundleTypeRole - Viewer - LSHandlerRank - Alternate - - - - \ No newline at end of file diff --git a/macos/generate_plist.py b/macos/generate_plist.py deleted file mode 100644 index 2f6e3c26..00000000 --- a/macos/generate_plist.py +++ /dev/null @@ -1,26 +0,0 @@ -import os - -SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) - -SETTINGS = { - "MACOSX_BUNDLE_COPYRIGHT": "© 2018–2022, Veronica Berglyd Olsen ", - "MACOSX_BUNDLE_IDENTIFIER": "io.novelwriter.novelWriter", - "MACOSX_BUNDLE_NAME": "novelWriter", - "MACOSX_BUNDLE_EXACUTABLE_NAME": "novelwriter", - "MACOSX_BUNDLE_ICON_FILE": "novelwriter.icns", - "MACOSX_BUNDLE_INFO_STRING": "novelWriter: A markdown-like text editor for planning and writing novels.", - "MACOSX_BUNDLE_SHORT_VERSION": "2.0.1", # Must be purely numerical - "MACOSX_BUNDLE_VERSION": "2.0.1", # Must be purely numerical -} - -if __name__ == "__main__": - - template_filename = os.path.join(SCRIPT_DIR, "Info.plist.in") - with open(template_filename, "r") as tmfile: - template = tmfile.read() - - plist = template.format(**SETTINGS) - - plist_filename = os.path.join(SCRIPT_DIR, "Info.plist") - with open(plist_filename, "w") as plistfile: - plistfile.write(plist) diff --git a/setup.py b/setup.py index 75bcd2b1..dced8caa 100755 --- a/setup.py +++ b/setup.py @@ -71,6 +71,25 @@ def extractVersion(): return numVers, hexVers, relDate +def extractCopyright(): + """Extract the novelWriter copyright notice without having to import + anything else from the main package. + """ + copyright = "Unknown" + initFile = os.path.join("novelwriter", "__init__.py") + try: + with open(initFile, mode="r", encoding="utf-8") as inFile: + for aLine in inFile: + if aLine.startswith("__copyright__"): + copyright = (aLine).partition("=")[2].strip().strip('"') + except Exception as exc: + print("Could not read file: %s" % initFile) + print(str(exc)) + + print("novelWriter copyright: %s " % (copyright)) + + return copyright + def compactVersion(numVers): """Make the version number more compact.""" @@ -395,6 +414,98 @@ def buildQtI18nTS(sysArgs): return +## +# Generage MacOS PList +## + +def genMacOSPlist(): + + # Set Up Folder + # ============= + + numVers, _, _ = extractVersion() + pkgVers = compactVersion(numVers) + + outDir = "setup/macos" + + macosBundleName = "novelWriter" + macosBundleExeName = "novelWriter" + macosBundleInfo = "novelWriter: A markdown-like text editor for planning and writing novels." + macosBundleIcon = "novelwriter.icns" + macosBundleIdent = "io.novelwriter.novelWriter" + macosBundleSVers = pkgVers + macosBundleVers = numVers + macosBundleCopyright = extractCopyright() + + # These keys are no longer used but are present for compatability + macosBundleVersMajor, macosBundleVersMinor, _ = pkgVers.split(".") + + + plistXML = ( + "\n" + "\n" + "\n" + "\n" + "NSPrincipalClass\n" + "NSApplication\n" + "NSHighResolutionCapable\n" + "True\n" + "CFBundleDevelopmentRegion\n" + "English\n" + "CFBundleExecutable\n" + f"{macosBundleExeName}\n" + "CFBundleGetInfoString\n" + f"{macosBundleInfo}\n" + "CFBundleIconFile\n" + f"{macosBundleIcon}\n" + "CFBundleIdentifier\n" + f"{macosBundleIdent}\n" + "CFBundleName\n" + f"{macosBundleName}\n" + "CFBundleInfoDictionaryVersion\n" + "6.0\n" + "CFBundleShortVersionString\n" + f"{macosBundleSVers}\n" + "CFBundleSignature\n" + "????\n" + "CFBundleVersion\n" + f"{macosBundleVers}\n" + "CFBundlePackageType\n" + "APPL\n" + "NSHumanReadableCopyright\n" + f"{macosBundleCopyright}\n" + "IFMajorVersion\n" + f"{macosBundleVersMajor}\n" + "IFMinorVersion\n" + f"{macosBundleVersMinor}\n" + "CFBundleDocumentTypes\n" + " \n" + " \n" + " CFBundleTypeExtensions\n" + " \n" + " nwx\n" + " \n" + " CFBundleTypeName\n" + " novelWriter Project\n" + " CFBundleTypeOSTypes\n" + " \n" + " TEXT\n" + " utxt\n" + " TUTX\n" + " ****\n" + " \n" + " CFBundleTypeRole\n" + " Viewer\n" + " LSHandlerRank\n" + " Alternate\n" + " \n" + " \n" + "\n" + "\n" + ) + + writeFile(f"{outDir}/Info.plist", plistXML) + ## # Sample Project ZIP File Builder (sample) @@ -1862,6 +1973,7 @@ if __name__ == "__main__": " The files to be updated must be provided as arguments.", " qtlrelease Build the language files for internationalisation.", " clean-assets Delete assets built by manual, sample and qtlrelease.", + " gen-plist Generates an Info.plist for use in a MacOS Bundle", "", "Python Packaging:", "", @@ -1943,6 +2055,10 @@ if __name__ == "__main__": if "clean-assets" in sys.argv: sys.argv.remove("clean-assets") cleanBuiltAssets() + + if "gen-plist" in sys.argv: + sys.argv.remove("gen-plist") + genMacOSPlist() # Python Packaging # ================ diff --git a/macos/App.entitlements b/setup/macos/App.entitlements similarity index 100% rename from macos/App.entitlements rename to setup/macos/App.entitlements diff --git a/macos/build.sh b/setup/macos/build.sh similarity index 82% rename from macos/build.sh rename to setup/macos/build.sh index b04491aa..9fd91acc 100755 --- a/macos/build.sh +++ b/setup/macos/build.sh @@ -11,6 +11,10 @@ BUILD_DIR=$(mktemp -d "$TEMP_BASE/novelWriter-build-XXXXXX") SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +SRC_DIR="$SCRIPT_DIR/../.." + +RLS_DIR="$SRC_DIR/dist_macos" + cleanup () { if [ -d "$BUILD_DIR" ]; then rm -rf "$BUILD_DIR" @@ -23,11 +27,11 @@ echo "Building in: $BUILD_DIR" OLD_CWD="$(pwd)" -VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SCRIPT_DIR/../novelwriter/__init__.py)" +VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SRC_DIR/novelwriter/__init__.py)" -pushd "$SCRIPT_DIR/../" || exit 1 +pushd "$SRC_DIR" || exit 1 -python3 setup.py manual qtlrelease sample +python3 setup.py manual qtlrelease sample gen-plist ls -lah . @@ -52,7 +56,7 @@ conda install -c conda-forge enchant hunspell-en --yes echo "installing python deps ..." # install dependencies -pip install -r "$SCRIPT_DIR/../requirements.txt" +pip install -r "$SRC_DIR/requirements.txt" # leave conda env conda deactivate @@ -61,7 +65,7 @@ echo "Building app bundle ..." # create .app Framework mkdir -p novelWriter.app/Contents/ mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWriter.app/Contents/Resources/novelWriter -cp $SCRIPT_DIR/../macos/Info.plist novelWriter.app/Contents/Info.plist +cp $SRC_DIR/setup/macos/Info.plist novelWriter.app/Contents/Info.plist echo "Copying miniconda env to bundle ..." # copy Miniconda env @@ -77,13 +81,11 @@ FILES_COPY=( ) for file in "${FILES_COPY[@]}"; do - echo "Copying $SCRIPT_DIR/../$file ..." - cp -R $SCRIPT_DIR/../$file novelWriter.app/Contents/Resources/novelWriter/ + echo "Copying $SRC_DIR/$file ..." + cp -R $SRC_DIR/$file novelWriter.app/Contents/Resources/novelWriter/ done -cp $SCRIPT_DIR/../macos/novelwriter.icns novelWriter.app/Contents/Resources/ -#cp -R $SCRIPT_DIR/../* novelWriter.app/Contents/Resources/novelWriter/ - +cp $SRC_DIR/setup/macos/novelwriter.icns novelWriter.app/Contents/Resources/ # create entry script cat > novelWriter.app/Contents/MacOS/novelWriter <<\EOF @@ -123,16 +125,18 @@ popd || exit 1 echo "Packageing App ..." +mkdir -p $RLS_DIR + # generate .dmg brew install create-dmg # "--skip-jenkins" is a temporary workaround for https://github.com/create-dmg/create-dmg/issues/72 -create-dmg --volname "novelWriter $VERSION" --volicon $SCRIPT_DIR/../macos/novelwriter.icns \ +create-dmg --volname "novelWriter $VERSION" --volicon $SCR_DIR/setup/macos/novelwriter.icns \ --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon novelWriter.app 200 190 --hide-extension novelWriter.app \ - --app-drop-link 600 185 novelWriter-"${VERSION}".dmg "$BUILD_DIR"/ + --app-drop-link 600 185 $RLS_DIR/novelWriter-"${VERSION}"-macos.dmg "$BUILD_DIR"/ pushd $BUILD_DIR || exit 1 zip -qr novelWriter.app.zip novelWriter.app popd || exit 1 -mv $BUILD_DIR/novelWriter.app.zip novelWriter.app.zip \ No newline at end of file +mv $BUILD_DIR/novelWriter.app.zip $RLS_DIR/novelWriter-"${VERSION}"-macos.zip diff --git a/macos/generate_icns.sh b/setup/macos/generate_icns.sh similarity index 95% rename from macos/generate_icns.sh rename to setup/macos/generate_icns.sh index ef4747dc..ecc70255 100755 --- a/macos/generate_icns.sh +++ b/setup/macos/generate_icns.sh @@ -16,4 +16,4 @@ done png2icns $SCRIPT_DIR/novelwriter.icns $SCRIPT_DIR/icons/icon_*px.png -rm -r $SCRIPT_DIR/icons \ No newline at end of file +rm -r $SCRIPT_DIR/icons diff --git a/macos/novelwriter.icns b/setup/macos/novelwriter.icns similarity index 100% rename from macos/novelwriter.icns rename to setup/macos/novelwriter.icns From beb95c49fae20723810d9ca2d797be65199232d3 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Sun, 8 Jan 2023 22:57:53 -0700 Subject: [PATCH 11/48] fix: fit artifact uploads Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- .github/workflows/build.yml | 16 +++++++++++----- setup/macos/build.sh | 8 +++++--- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1f66fb62..70b32e66 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -82,11 +82,17 @@ jobs: # UPLOAD BUILDS ## - - name: Upload binary zip / dmg (macOS) + - name: Upload binary zip (macOS) if: runner.os == 'macOS' uses: actions/upload-artifact@v3 with: - name: novelWriter-${{ matrix.name }}-${{ env.VERSION }}.app.zip - path: | - dist_macos/novelWriter-${{ env.VERSION }}.zip - dist_macos/novelWriter-${{ env.VERSION }}.dmg + name: novelWriter-${{ env.VERSION }}-${{ matrix.name }}.app.zip + path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip + + - name: Upload dmg (macOS) + if: runner.os == 'macOS' + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ env.VERSION }}-${{ matrix.name }}.dmg + path: dist_macos/novelWriter-${{ env.VERSION }}.dmg + diff --git a/setup/macos/build.sh b/setup/macos/build.sh index 9fd91acc..e539b19d 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -15,6 +15,8 @@ SRC_DIR="$SCRIPT_DIR/../.." RLS_DIR="$SRC_DIR/dist_macos" +echo "Script Dir: $SCRIPT_DIR" + cleanup () { if [ -d "$BUILD_DIR" ]; then rm -rf "$BUILD_DIR" @@ -131,12 +133,12 @@ mkdir -p $RLS_DIR brew install create-dmg # "--skip-jenkins" is a temporary workaround for https://github.com/create-dmg/create-dmg/issues/72 -create-dmg --volname "novelWriter $VERSION" --volicon $SCR_DIR/setup/macos/novelwriter.icns \ +create-dmg --volname "novelWriter $VERSION" --volicon $SRC_DIR/setup/macos/novelwriter.icns \ --window-pos 200 120 --window-size 800 400 --icon-size 100 --icon novelWriter.app 200 190 --hide-extension novelWriter.app \ - --app-drop-link 600 185 $RLS_DIR/novelWriter-"${VERSION}"-macos.dmg "$BUILD_DIR"/ + --app-drop-link 600 185 $RLS_DIR/novelWriter-"${VERSION}".dmg "$BUILD_DIR"/ pushd $BUILD_DIR || exit 1 zip -qr novelWriter.app.zip novelWriter.app popd || exit 1 -mv $BUILD_DIR/novelWriter.app.zip $RLS_DIR/novelWriter-"${VERSION}"-macos.zip +mv $BUILD_DIR/novelWriter.app.zip $RLS_DIR/novelWriter-"${VERSION}".app.zip From 9d46dde1c58767db01c1e7ff5e2096a73d7c105a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 29 Jan 2023 11:53:08 +0100 Subject: [PATCH 12/48] Fix typo in 2.0 release notes --- CHANGELOG.md | 2 +- novelwriter/assets/text/release_notes.htm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 75b57823..cd8bae1a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -194,7 +194,7 @@ icons. They are technically no longer tree views, but rather a Table of Contents novel root folder. If you have multiple novel root folders, you can select which one to view. In the Novel Tree View, you now also have the option to hide or show a third column of data. -Currently, you can chose between "Point of View Character", "Focus Character" and "Novel Plot". If +Currently, you can choose between "Point of View Character", "Focus Character" and "Novel Plot". If you referenced more than one in the document, the column will only show the first entry, so make sure the most important one is listed first in your document if you use this feature. An arrow icon is also visible at the end of each row in the tree, and if you click on it, a tool tip should pop diff --git a/novelwriter/assets/text/release_notes.htm b/novelwriter/assets/text/release_notes.htm index 4dbba364..6f8d0bd0 100644 --- a/novelwriter/assets/text/release_notes.htm +++ b/novelwriter/assets/text/release_notes.htm @@ -70,7 +70,7 @@ document icons. They are technically no longer tree views, but rather a Table of specific novel root folder. If you have multiple novel root folders, you can select which one to view.

    In the Novel Tree View, you now also have the option to hide or show a third column of data. -Currently, you can chose between "Point of View Character", "Focus Character" and "Novel Plot". If +Currently, you can choose between "Point of View Character", "Focus Character" and "Novel Plot". If you referenced more than one in the document, the column will only show the first entry, so make sure the most important one is listed first in your document if you use this feature. An arrow icon is also visible at the end of each row in the tree, and if you click on it, a tool tip should pop From af1233925e8d3f1fe44532f3763ed7097db8acf4 Mon Sep 17 00:00:00 2001 From: Rachel Powers <508861+Ryex@users.noreply.github.com> Date: Tue, 31 Jan 2023 17:10:36 -0700 Subject: [PATCH 13/48] fix icns generation and bundle display name. while the icns *can* be generated on linux it is much preferable to generate it on macos it is checked in as a convience this commit fixes the appbundle not displaying the icon corrected and corrects the app being displayed as "python" in the top bar when the bundle is run Signed-off-by: Rachel Powers <508861+Ryex@users.noreply.github.com> --- setup.py | 4 ++ setup/macos/build.sh | 1 + setup/macos/generate_icns.sh | 75 +++++++++++++++++++++++++++++------ setup/macos/novelwriter.icns | Bin 77254 -> 157875 bytes 4 files changed, 68 insertions(+), 12 deletions(-) diff --git a/setup.py b/setup.py index dced8caa..574096ef 100755 --- a/setup.py +++ b/setup.py @@ -462,6 +462,8 @@ def genMacOSPlist(): f"{macosBundleIdent}\n" "CFBundleName\n" f"{macosBundleName}\n" + "CFBundleDisplayName\n" + f"{macosBundleName}\n" "CFBundleInfoDictionaryVersion\n" "6.0\n" "CFBundleShortVersionString\n" @@ -504,6 +506,8 @@ def genMacOSPlist(): "\n" ) + print(f"Writing Info.plist to {outDir}/Info.plist") + writeFile(f"{outDir}/Info.plist", plistXML) diff --git a/setup/macos/build.sh b/setup/macos/build.sh index e539b19d..96e261c3 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -100,6 +100,7 @@ EOF chmod a+x novelWriter.app/Contents/MacOS/novelWriter #do codesigning +#echo "Signing bundle ..." #sudo codesign --sign - --deep --force --entitlements "$SCRIPT_DIR/../macos/App.entitlements" --options runtime "novelWriter.app/Contents/MacOS/novelWriter" # remove bloat diff --git a/setup/macos/generate_icns.sh b/setup/macos/generate_icns.sh index ecc70255..0ca1d9c0 100755 --- a/setup/macos/generate_icns.sh +++ b/setup/macos/generate_icns.sh @@ -1,19 +1,70 @@ #! /usr/bin/env bash -if ! command -v png2icns &> /dev/null -then - echo "png2icns cound not be found, it is required. Please install a package like icnsutils or libicns." - exit -fi - SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) -mkdir -p $SCRIPT_DIR/icons +function generate_linux () { + echo "Generating on Linux ..." + if ! command -v png2icns &> /dev/null + then + echo "png2icns cound not be found, it is required. Please install a package like icnsutils or libicns." + exit + fi -for size in 16x16 32x32 48x48 128x128 256x256; do - cp $SCRIPT_DIR/../setup/data/hicolor/$size/apps/novelwriter.png $SCRIPT_DIR/icons/icon_${size}px.png -done + if ! command -v convert $> /dev/null + then + echo "convert could not be found, it is required. please install a imagemagick package." + exit + fi -png2icns $SCRIPT_DIR/novelwriter.icns $SCRIPT_DIR/icons/icon_*px.png + mkdir -p $SCRIPT_DIR/icons -rm -r $SCRIPT_DIR/icons + sizes=( 16 32 64 128 256 ) + for base in "${sizes[@]}"; do + let basex2=${base}*2 + size="${base}x${base}" + echo "Copying files for $size" + double=${basex2}x${basex2} + cp $SCRIPT_DIR/../data/hicolor/${size}/apps/novelwriter.png $SCRIPT_DIR/icons/icon_${size}.png + echo "Resizing ${size}@2x to $double from $size" + convert $SCRIPT_DIR/icons/icon_${size}.png -resize $double $SCRIPT_DIR/icons/icon_${size}@2x.png + done + + png2icns $SCRIPT_DIR/novelwriter.icns $SCRIPT_DIR/icons/icon_*.png + + rm -r $SCRIPT_DIR/icons + + echo "Done" +} + +function generate_macos () { + echo "Generating on MacOs ..." + mkdir -p $SCRIPT_DIR/icons + + echo "Building Iconset ..." + sizes=( 16 32 64 128 256 ) + for base in "${sizes[@]}"; do + let basex2=${base}*2 + size="${base}x${base}" + echo "Copying files for $size" + double=${basex2}x${basex2} + cp $SCRIPT_DIR/../data/hicolor/${size}/apps/novelwriter.png $SCRIPT_DIR/icons/icon_${size}.png + cp $SCRIPT_DIR/../data/hicolor/${size}/apps/novelwriter.png $SCRIPT_DIR/icons/icon_${size}@2x.png + echo "Resizing ${size}@2x to $double from $size" + sips -Z $basex2 $SCRIPT_DIR/icons/icon_${size}@2x.png + done + + rm -rf $SCRIPT_DIR/novelwriter.iconset + mv $SCRIPT_DIR/icons $SCRIPT_DIR/novelwriter.iconset + + echo "Generating icns ..." + iconutil -c icns $SCRIPT_DIR/novelwriter.iconset + + echo "Done" +} + +unameOut="$(uname -s)" +case "$unameOut" in + Linux*) generate_linux;; + Darwin*) generate_macos;; + *) echo "Unsupported OS" +esac diff --git a/setup/macos/novelwriter.icns b/setup/macos/novelwriter.icns index 8a05c8e916738c6ed6e4b5f3a618927429414dd4..884347bf73695ff11f4908e5532d21418d589554 100644 GIT binary patch literal 157875 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�ovVg@#_haBvVQ4tS&YL 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

    Oeks8tt!w{ubx?8b|;YPV8 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�g3tTrj7zwqK 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 li%OX|FGRI Date: Sat, 4 Feb 2023 16:29:23 +0100 Subject: [PATCH 14/48] Make sure title and author is always refreshed when project details dialog is opened (#1336) --- novelwriter/dialogs/projdetails.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/novelwriter/dialogs/projdetails.py b/novelwriter/dialogs/projdetails.py index bec2f400..cc010c5f 100644 --- a/novelwriter/dialogs/projdetails.py +++ b/novelwriter/dialogs/projdetails.py @@ -156,7 +156,7 @@ class GuiProjectDetailsMain(QWidget): # Header # ====== - self.bookTitle = QLabel(self.theProject.data.title) + self.bookTitle = QLabel("") bookFont = self.bookTitle.font() bookFont.setPointSizeF(2.2*fPt) bookFont.setWeight(QFont.Bold) @@ -164,9 +164,7 @@ class GuiProjectDetailsMain(QWidget): self.bookTitle.setAlignment(Qt.AlignHCenter) self.bookTitle.setWordWrap(True) - self.projName = QLabel( - self.tr("Working Title: {0}").format(self.theProject.data.name) - ) + self.projName = QLabel("") workFont = self.projName.font() workFont.setPointSizeF(0.8*fPt) workFont.setItalic(True) @@ -174,7 +172,7 @@ class GuiProjectDetailsMain(QWidget): self.projName.setAlignment(Qt.AlignHCenter) self.projName.setWordWrap(True) - self.bookAuthors = QLabel(self.tr("By {0}").format(self.theProject.data.author)) + self.bookAuthors = QLabel("") authFont = self.bookAuthors.font() authFont.setPointSizeF(1.2*fPt) self.bookAuthors.setFont(authFont) @@ -251,6 +249,10 @@ class GuiProjectDetailsMain(QWidget): nwCount = pIndex.getNovelWordCount() edTime = self.theProject.getCurrentEditTime() + self.bookTitle.setText(self.theProject.data.title or self.theProject.data.name) + self.projName.setText(self.tr("Project: {0}").format(self.theProject.data.name)) + self.bookAuthors.setText(self.tr("By {0}").format(self.theProject.data.author)) + self.wordCountVal.setText(f"{nwCount:n}") self.chapCountVal.setText(f"{hCounts[2]:n}") self.sceneCountVal.setText(f"{hCounts[3]:n}") From 4e815a5f86557a6700b97c633dacf64fb99a7ce4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 16:29:51 +0100 Subject: [PATCH 15/48] Make sure project name, title and author cannot be set to string "None" --- novelwriter/core/projectdata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/novelwriter/core/projectdata.py b/novelwriter/core/projectdata.py index 12176901..58667ee3 100644 --- a/novelwriter/core/projectdata.py +++ b/novelwriter/core/projectdata.py @@ -207,7 +207,7 @@ class NWProjectData: """Set a new project name. """ if value != self._name: - self._name = simplified(str(value)) + self._name = simplified(str(value or "")) self.theProject.setProjectChanged(True) return @@ -215,7 +215,7 @@ class NWProjectData: """Set a new novel title. """ if value != self._title: - self._title = simplified(str(value)) + self._title = simplified(str(value or "")) self.theProject.setProjectChanged(True) return @@ -223,7 +223,7 @@ class NWProjectData: """Set the author value. """ if value != self._title: - self._author = simplified(str(value)) + self._author = simplified(str(value or "")) self.theProject.setProjectChanged(True) return From a5d05ab77754eca99a6440ab3627ea4a55ba04ef Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 16:32:41 +0100 Subject: [PATCH 16/48] Improve time format of editing time on project details dialog (#1335) --- novelwriter/dialogs/projdetails.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/novelwriter/dialogs/projdetails.py b/novelwriter/dialogs/projdetails.py index cc010c5f..35d52345 100644 --- a/novelwriter/dialogs/projdetails.py +++ b/novelwriter/dialogs/projdetails.py @@ -34,7 +34,7 @@ from PyQt5.QtWidgets import ( QLineEdit, QSpinBox, QTreeWidget, QTreeWidgetItem, QVBoxLayout, QWidget ) -from novelwriter.common import numberToRoman +from novelwriter.common import formatTime, numberToRoman from novelwriter.custom import PagedDialog, QSwitch from novelwriter.constants import nwUnicode from novelwriter.gui.components import NovelSelector @@ -257,7 +257,7 @@ class GuiProjectDetailsMain(QWidget): self.chapCountVal.setText(f"{hCounts[2]:n}") self.sceneCountVal.setText(f"{hCounts[3]:n}") self.revCountVal.setText(f"{self.theProject.data.saveCount:n}") - self.editTimeVal.setText(f"{edTime//3600:02d}:{edTime%3600//60:02d}") + self.editTimeVal.setText(formatTime(edTime)) self.projPathVal.setText(str(self.theProject.storage.storagePath)) From 4ba3297d171546c5c183c5a089d332c18a632e2a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 16:45:53 +0100 Subject: [PATCH 17/48] Update base translation file --- i18n/nw_base.ts | 88 ++++++++++++++++++++++++------------------------- 1 file changed, 44 insertions(+), 44 deletions(-) diff --git a/i18n/nw_base.ts b/i18n/nw_base.ts index 9d384af0..6b455964 100644 --- a/i18n/nw_base.ts +++ b/i18n/nw_base.ts @@ -4,72 +4,72 @@ Common - + in the future - + just now - + a minute ago - + {0} minutes ago - + an hour ago - + {0} hours ago - + a day ago - + {0} days ago - + a week ago - + {0} weeks ago - + a month ago - + {0} months ago - + a year ago - + {0} years ago @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents - + Title - + Words - + Pages - + Page - + Progress - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. - + Start counting page numbers from this page. - + Assume a new chapter or partition always start on an odd numbered page. - + Words per page - + Count pages from - + Clear double pages - + END - + Untitled @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - - - - - By {0} - - - - + Words - + Chapters - + Scenes - + Revisions - + Editing Time - + Path + + + Project: {0} + + + + + By {0} + + GuiProjectEditMain From 74ead29433aedbe5170f900c16fc33669f97dd82 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 19:33:04 +0100 Subject: [PATCH 18/48] Move MacOS plist info back to a template file, and simplify stuff in setup.py --- .gitignore | 1 + setup.py | 113 ++++---------------------------- setup/macos/App.entitlements | 2 +- setup/macos/Info.plist.template | 62 ++++++++++++++++++ 4 files changed, 78 insertions(+), 100 deletions(-) create mode 100644 setup/macos/Info.plist.template diff --git a/.gitignore b/.gitignore index e12c3f96..20079fdc 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ setup.iss /novelwriter.desktop /novelWriter.pyw +/setup/macos/Info.plist # Translations /novelwriter/assets/i18n/*.qm diff --git a/setup.py b/setup.py index 574096ef..b54f3797 100755 --- a/setup.py +++ b/setup.py @@ -71,25 +71,6 @@ def extractVersion(): return numVers, hexVers, relDate -def extractCopyright(): - """Extract the novelWriter copyright notice without having to import - anything else from the main package. - """ - copyright = "Unknown" - initFile = os.path.join("novelwriter", "__init__.py") - try: - with open(initFile, mode="r", encoding="utf-8") as inFile: - for aLine in inFile: - if aLine.startswith("__copyright__"): - copyright = (aLine).partition("=")[2].strip().strip('"') - except Exception as exc: - print("Could not read file: %s" % initFile) - print(str(exc)) - - print("novelWriter copyright: %s " % (copyright)) - - return copyright - def compactVersion(numVers): """Make the version number more compact.""" @@ -414,102 +395,36 @@ def buildQtI18nTS(sysArgs): return + ## # Generage MacOS PList ## def genMacOSPlist(): - - # Set Up Folder - # ============= - + """Set necessary values for .plist file. + """ numVers, _, _ = extractVersion() pkgVers = compactVersion(numVers) - outDir = "setup/macos" - macosBundleName = "novelWriter" - macosBundleExeName = "novelWriter" - macosBundleInfo = "novelWriter: A markdown-like text editor for planning and writing novels." - macosBundleIcon = "novelwriter.icns" - macosBundleIdent = "io.novelwriter.novelWriter" - macosBundleSVers = pkgVers - macosBundleVers = numVers - macosBundleCopyright = extractCopyright() + copyrightYear = datetime.datetime.now().year # These keys are no longer used but are present for compatability - macosBundleVersMajor, macosBundleVersMinor, _ = pkgVers.split(".") + pkgVersMaj, pkgVersMin, _ = pkgVers.split(".") - - plistXML = ( - "\n" - "\n" - "\n" - "\n" - "NSPrincipalClass\n" - "NSApplication\n" - "NSHighResolutionCapable\n" - "True\n" - "CFBundleDevelopmentRegion\n" - "English\n" - "CFBundleExecutable\n" - f"{macosBundleExeName}\n" - "CFBundleGetInfoString\n" - f"{macosBundleInfo}\n" - "CFBundleIconFile\n" - f"{macosBundleIcon}\n" - "CFBundleIdentifier\n" - f"{macosBundleIdent}\n" - "CFBundleName\n" - f"{macosBundleName}\n" - "CFBundleDisplayName\n" - f"{macosBundleName}\n" - "CFBundleInfoDictionaryVersion\n" - "6.0\n" - "CFBundleShortVersionString\n" - f"{macosBundleSVers}\n" - "CFBundleSignature\n" - "????\n" - "CFBundleVersion\n" - f"{macosBundleVers}\n" - "CFBundlePackageType\n" - "APPL\n" - "NSHumanReadableCopyright\n" - f"{macosBundleCopyright}\n" - "IFMajorVersion\n" - f"{macosBundleVersMajor}\n" - "IFMinorVersion\n" - f"{macosBundleVersMinor}\n" - "CFBundleDocumentTypes\n" - " \n" - " \n" - " CFBundleTypeExtensions\n" - " \n" - " nwx\n" - " \n" - " CFBundleTypeName\n" - " novelWriter Project\n" - " CFBundleTypeOSTypes\n" - " \n" - " TEXT\n" - " utxt\n" - " TUTX\n" - " ****\n" - " \n" - " CFBundleTypeRole\n" - " Viewer\n" - " LSHandlerRank\n" - " Alternate\n" - " \n" - " \n" - "\n" - "\n" + plistXML = readFile(f"{outDir}/Info.plist.template").format( + macosBundleSVers=pkgVers, + macosBundleVers=numVers, + macosBundleVersMajor=pkgVersMaj, + macosBundleVersMinor=pkgVersMin, + macosBundleCopyright=f"Copyright 2018–{copyrightYear}, Veronica Berglyd Olsen", ) print(f"Writing Info.plist to {outDir}/Info.plist") - writeFile(f"{outDir}/Info.plist", plistXML) + return + ## # Sample Project ZIP File Builder (sample) @@ -2059,7 +1974,7 @@ if __name__ == "__main__": if "clean-assets" in sys.argv: sys.argv.remove("clean-assets") cleanBuiltAssets() - + if "gen-plist" in sys.argv: sys.argv.remove("gen-plist") genMacOSPlist() diff --git a/setup/macos/App.entitlements b/setup/macos/App.entitlements index 40dc976a..8274a218 100644 --- a/setup/macos/App.entitlements +++ b/setup/macos/App.entitlements @@ -7,4 +7,4 @@ com.apple.security.cs.allow-dyld-environment-variables - \ No newline at end of file + diff --git a/setup/macos/Info.plist.template b/setup/macos/Info.plist.template new file mode 100644 index 00000000..d239a050 --- /dev/null +++ b/setup/macos/Info.plist.template @@ -0,0 +1,62 @@ + + + + + NSPrincipalClass + NSApplication + NSHighResolutionCapable + True + CFBundleDevelopmentRegion + English + CFBundleExecutable + novelWriter + CFBundleGetInfoString + novelWriter: A markdown-like text editor for planning and writing novels. + CFBundleIconFile + novelwriter.icns + CFBundleIdentifier + io.novelwriter.novelWriter + CFBundleName + novelWriter + CFBundleDisplayName + novelWriter + CFBundleInfoDictionaryVersion + 6.0 + CFBundleShortVersionString + {macosBundleSVers} + CFBundleSignature + ???? + CFBundleVersion + {macosBundleVers} + CFBundlePackageType + APPL + NSHumanReadableCopyright + {macosBundleCopyright} + IFMajorVersion + {macosBundleVersMajor} + IFMinorVersion + {macosBundleVersMinor} + CFBundleDocumentTypes + + + CFBundleTypeExtensions + + nwx + + CFBundleTypeName + novelWriter Project + CFBundleTypeOSTypes + + TEXT + utxt + TUTX + **** + + CFBundleTypeRole + Viewer + LSHandlerRank + Alternate + + + + From 0e529fd72f549494e15e7be216f7b506c23e1090 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 19:33:12 +0100 Subject: [PATCH 19/48] Rewrite macOS build workflow and make some changes to build script --- .github/workflows/build.yml | 98 ------------------------------- .github/workflows/build_macos.yml | 81 +++++++++++++++++++++++++ setup/macos/build.sh | 32 +++++++++- 3 files changed, 110 insertions(+), 101 deletions(-) delete mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/build_macos.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 70b32e66..00000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,98 +0,0 @@ -name: Build - -on: - push: - tags: - - '*' - -jobs: - build: - strategy: - fail-fast: false - matrix: - include: - - os: macos-12 - name: macos - qt_ver: 5 - qt_host: mac - qt_version: '5.15.2' - qt_modules: '' - qt_tools: '' - - runs-on: ${{ matrix.os }} - - steps: - ## - # PREPARE - ## - - name: Checkout - uses: actions/checkout@v3 - with: - submodules: 'true' - - - name: Set short version - shell: bash - run: | - ver_short=`git rev-parse --short HEAD` - ver_novelwriter=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py` - echo "VERSION=$ver_novelwriter" >> $GITHUB_ENV - echo "VERSION_SHORT=$ver_short" >> $GITHUB_ENV - - - name: Install Qt (Linux) - if: runner.os == 'Linux' && matrix.qt_ver != 6 - run: | - sudo apt-get -y install qtbase5-dev qtchooser qt5-qmake qtbase5-dev-tools libqt5core5a libqt5network5 libqt5gui5 - - - name: Install Qt (macOS, AppImage & Windows MSVC) - if: runner.os == 'Linux' && matrix.qt_ver == 6 || runner.os == 'macOS' || (runner.os == 'Windows' && matrix.msystem == '') - uses: jurplel/install-qt-action@v3 - with: - version: ${{ matrix.qt_version }} - host: ${{ matrix.qt_host }} - target: 'desktop' - arch: ${{ matrix.qt_arch }} - modules: ${{ matrix.qt_modules }} - tools: ${{ matrix.qt_tools }} - cache: true - - - name: Setup TeX Live - uses: teatimeguest/setup-texlive-action@v2 - with: - packages: >- - scheme-basic - collection-latexextra - latexmk - tex-gyre - - - name: Install Dependencies (macOS) - if: runner.os == 'macOS' - run: | - pip3 install sphinx - - ## - # BUILD - ## - - - name: Build (macOS) - if: runner.os == 'macOS' - run: | - ./setup/macos/build.sh - - ## - # UPLOAD BUILDS - ## - - - name: Upload binary zip (macOS) - if: runner.os == 'macOS' - uses: actions/upload-artifact@v3 - with: - name: novelWriter-${{ env.VERSION }}-${{ matrix.name }}.app.zip - path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip - - - name: Upload dmg (macOS) - if: runner.os == 'macOS' - uses: actions/upload-artifact@v3 - with: - name: novelWriter-${{ env.VERSION }}-${{ matrix.name }}.dmg - path: dist_macos/novelWriter-${{ env.VERSION }}.dmg - diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml new file mode 100644 index 00000000..2f40f0f9 --- /dev/null +++ b/.github/workflows/build_macos.yml @@ -0,0 +1,81 @@ +name: Packaging + +on: + push: + tags: + - "*" + pull_request: + branches: + - patch + +jobs: + buildAssets: + runs-on: ubuntu-latest + steps: + - name: Python Setup + uses: actions/setup-python@v4 + with: + python-version: 3 + architecture: x64 + + - name: Install Packages (apt) + run: | + sudo apt update + sudo apt install qttools5-dev-tools python3-sphinx latexmk texlive texlive-latex-extra + + - name: Checkout Source + uses: actions/checkout@v3 + + - name: Run Build Commands + run: python setup.py qtlrelease sample manual + + - name: Upload Artifacts + uses: actions/upload-artifact@v3 + with: + name: nw-assets-${{ github.sha }} + path: | + novelwriter/assets/sample.zip + novelwriter/assets/manual.pdf + novelwriter/assets/i18n/*.qm + if-no-files-found: error + retention-days: 1 + + buildMac: + needs: buildAssets + strategy: + fail-fast: false + runs-on: macos-12 + steps: + - name: Checkout + uses: actions/checkout@v3 + + - name: Get Version + shell: bash + run: | + NW_VERSION=`awk '/^__version__/{print substr($NF,2,length($NF)-2)}' novelwriter/__init__.py` + echo "novelWriter Version: $NW_VERSION" + echo "VERSION=$NW_VERSION" >> $GITHUB_ENV + + - name: Download Artifact + uses: actions/download-artifact@v3 + with: + name: nw-assets-${{ github.sha }} + path: novelwriter/assets + + - name: Build + run: | + ./setup/macos/build.sh + + - name: Upload ZIP + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ env.VERSION }}-macos.app.zip + path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip + retention-days: 1 + + - name: Upload DMG + uses: actions/upload-artifact@v3 + with: + name: novelWriter-${{ env.VERSION }}-macos.dmg + path: dist_macos/novelWriter-${{ env.VERSION }}.dmg + retention-days: 1 diff --git a/setup/macos/build.sh b/setup/macos/build.sh index 96e261c3..29a73e57 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -33,7 +33,33 @@ VERSION="$(awk '/^__version__/{print substr($NF,2,length($NF)-2)}' $SRC_DIR/nove pushd "$SRC_DIR" || exit 1 -python3 setup.py manual qtlrelease sample gen-plist +python3 setup.py gen-plist +if [ -f $SRC_DIR/setup/macos/Info.plist ]; then + echo "Found: setup/macos/Info.plist" +else + echo "Missing: setup/macos/Info.plist" + exit 1 +fi + +# Check that other assets are present +if [ -f $SRC_DIR/novelwriter/assets/sample.zip ]; then + echo "Found: novelwriter/assets/sample.zip" +else + echo "Missing: novelwriter/assets/sample.zip" + exit 1 +fi +if [ -f $SRC_DIR/novelwriter/assets/manual.pdf ]; then + echo "Found: novelwriter/assets/manual.pdf" +else + echo "Missing: novelwriter/assets/manual.pdf" + exit 1 +fi +if [ -f $SRC_DIR/novelwriter/assets/i18n/nw_en_US.qm ]; then + echo "Found: novelwriter/assets/i18n/nw_en_US.qm" +else + echo "Missing: novelwriter/assets/i18n/nw_en_US.qm" + exit 1 +fi ls -lah . @@ -78,7 +104,7 @@ echo "Copying novelWriter to bundle ..." FILES_COPY=( "CHANGELOG.md" "MANIFEST.in" "CREDITS.md" "LICENSE.md" - "CONTRIBUTING.md" "CODE_OF_CONDUCT.md" "i18n" "novelwriter" + "CONTRIBUTING.md" "CODE_OF_CONDUCT.md" "novelwriter" "novelWriter.py" ) @@ -114,7 +140,7 @@ rm -rf pkgs rm -rf cmake rm -rf share/{gtk-,}doc -#remove web engine +# remove web engine rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true rm lib/python3.*/site-packages/PyQt5/Qt/resources/qtwebengine* || true From 8a5ff3ab852bffeb491d2cd8440ba1db01338c8a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 19:47:10 +0100 Subject: [PATCH 20/48] Turn off short retention time for now --- .github/workflows/build_macos.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml index 2f40f0f9..b7a2f5e9 100644 --- a/.github/workflows/build_macos.yml +++ b/.github/workflows/build_macos.yml @@ -71,11 +71,11 @@ jobs: with: name: novelWriter-${{ env.VERSION }}-macos.app.zip path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip - retention-days: 1 + # retention-days: 1 - name: Upload DMG uses: actions/upload-artifact@v3 with: name: novelWriter-${{ env.VERSION }}-macos.dmg path: dist_macos/novelWriter-${{ env.VERSION }}.dmg - retention-days: 1 + # retention-days: 1 From b4813f904a6b1ceb8479dc9f2366729086981e4c Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 20:45:15 +0100 Subject: [PATCH 21/48] Try the preserve symlinks flag in mac bundle build --- setup/macos/build.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/setup/macos/build.sh b/setup/macos/build.sh index 29a73e57..dce6b6e3 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -96,12 +96,9 @@ mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWri cp $SRC_DIR/setup/macos/Info.plist novelWriter.app/Contents/Info.plist echo "Copying miniconda env to bundle ..." -# copy Miniconda env -cp -R ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ +cp -R --preserve=links ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ echo "Copying novelWriter to bundle ..." -# copy novelWriter - FILES_COPY=( "CHANGELOG.md" "MANIFEST.in" "CREDITS.md" "LICENSE.md" "CONTRIBUTING.md" "CODE_OF_CONDUCT.md" "novelwriter" From 44f624faf41aa5f56b976bb9179073a5f32846ec Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 20:54:51 +0100 Subject: [PATCH 22/48] Try the -a option instead --- setup/macos/build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup/macos/build.sh b/setup/macos/build.sh index dce6b6e3..30770bb4 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -96,7 +96,7 @@ mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWri cp $SRC_DIR/setup/macos/Info.plist novelWriter.app/Contents/Info.plist echo "Copying miniconda env to bundle ..." -cp -R --preserve=links ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ +cp -a ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ echo "Copying novelWriter to bundle ..." FILES_COPY=( From cc48f8f8aa067483c64db88d73cdb2f94d544c66 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 22:27:16 +0100 Subject: [PATCH 23/48] Try removeing the python3.1 folder --- setup/macos/build.sh | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/setup/macos/build.sh b/setup/macos/build.sh index 30770bb4..743be05a 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -137,14 +137,17 @@ rm -rf pkgs rm -rf cmake rm -rf share/{gtk-,}doc +# Remove the files from the 3.1 symlink +rm -rf lib/python3.1 + # remove web engine -rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true -rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true -rm lib/python3.*/site-packages/PyQt5/Qt/resources/qtwebengine* || true -rm -r lib/python3.*/site-packages/PyQt5/Qt/qml/QtWebEngine* || true -rm -r lib/python3.*/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true -rm lib/python3.*/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true -rm lib/python3.*/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true +rm lib/python3.10/site-packages/PyQt5/QtWebEngine* || true +rm -r lib/python3.10/site-packages/PyQt5/Qt/translations/qtwebengine* || true +rm lib/python3.10/site-packages/PyQt5/Qt/resources/qtwebengine* || true +rm -r lib/python3.10/site-packages/PyQt5/Qt/qml/QtWebEngine* || true +rm -r lib/python3.10/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true +rm lib/python3.10/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true +rm lib/python3.10/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true popd || exit 1 popd || exit 1 From 1d90ab9fc12413d16a71fb54d4499dc8e180ad85 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 23:12:14 +0100 Subject: [PATCH 24/48] Reverting som changes that didn't matter --- setup/macos/build.sh | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/setup/macos/build.sh b/setup/macos/build.sh index 743be05a..e3e8e2ff 100755 --- a/setup/macos/build.sh +++ b/setup/macos/build.sh @@ -96,7 +96,7 @@ mkdir novelWriter.app/Contents/MacOS novelWriter.app/Contents/Resources novelWri cp $SRC_DIR/setup/macos/Info.plist novelWriter.app/Contents/Info.plist echo "Copying miniconda env to bundle ..." -cp -a ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ +cp -R ~/miniconda/envs/novelWriter/* novelWriter.app/Contents/Resources/ echo "Copying novelWriter to bundle ..." FILES_COPY=( @@ -141,13 +141,13 @@ rm -rf share/{gtk-,}doc rm -rf lib/python3.1 # remove web engine -rm lib/python3.10/site-packages/PyQt5/QtWebEngine* || true -rm -r lib/python3.10/site-packages/PyQt5/Qt/translations/qtwebengine* || true -rm lib/python3.10/site-packages/PyQt5/Qt/resources/qtwebengine* || true -rm -r lib/python3.10/site-packages/PyQt5/Qt/qml/QtWebEngine* || true -rm -r lib/python3.10/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true -rm lib/python3.10/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true -rm lib/python3.10/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true +rm lib/python3.*/site-packages/PyQt5/QtWebEngine* || true +rm -r lib/python3.*/site-packages/PyQt5/Qt/translations/qtwebengine* || true +rm lib/python3.*/site-packages/PyQt5/Qt/resources/qtwebengine* || true +rm -r lib/python3.*/site-packages/PyQt5/Qt/qml/QtWebEngine* || true +rm -r lib/python3.*/site-packages/PyQt5/Qt/plugins/webview/libqtwebview* || true +rm lib/python3.*/site-packages/PyQt5/Qt/libexec/QtWebEngineProcess* || true +rm lib/python3.*/site-packages/PyQt5/Qt/lib/libQt5WebEngine* || true popd || exit 1 popd || exit 1 From 652ce3848bce2f2f95062844679cf345b5d6bc94 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 23:34:00 +0100 Subject: [PATCH 25/48] Try out using environment in workflow --- .github/workflows/build_macos.yml | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml index b7a2f5e9..bfa44366 100644 --- a/.github/workflows/build_macos.yml +++ b/.github/workflows/build_macos.yml @@ -2,15 +2,18 @@ name: Packaging on: push: - tags: - - "*" + branches: + - main + - patch pull_request: branches: + - main - patch jobs: buildAssets: runs-on: ubuntu-latest + environment: Release steps: - name: Python Setup uses: actions/setup-python@v4 @@ -45,6 +48,7 @@ jobs: strategy: fail-fast: false runs-on: macos-12 + environment: Release steps: - name: Checkout uses: actions/checkout@v3 From 6b1183392fd8e9e3185b051ff99d73acb31dc0e2 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sat, 4 Feb 2023 23:44:03 +0100 Subject: [PATCH 26/48] Try using workflow_dispatch instead --- .github/workflows/build_macos.yml | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml index bfa44366..afeb6966 100644 --- a/.github/workflows/build_macos.yml +++ b/.github/workflows/build_macos.yml @@ -1,19 +1,10 @@ name: Packaging -on: - push: - branches: - - main - - patch - pull_request: - branches: - - main - - patch +on: workflow_dispatch jobs: buildAssets: runs-on: ubuntu-latest - environment: Release steps: - name: Python Setup uses: actions/setup-python@v4 @@ -48,7 +39,6 @@ jobs: strategy: fail-fast: false runs-on: macos-12 - environment: Release steps: - name: Checkout uses: actions/checkout@v3 From 5f6f8533368fae23ea73449a9a95bfb49f60c957 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 5 Feb 2023 00:00:47 +0100 Subject: [PATCH 27/48] Only run packaging workflow on certain tags --- .github/workflows/build_macos.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build_macos.yml index afeb6966..9d486298 100644 --- a/.github/workflows/build_macos.yml +++ b/.github/workflows/build_macos.yml @@ -1,6 +1,10 @@ name: Packaging -on: workflow_dispatch +on: + push: + tags: + - v** + - tt** jobs: buildAssets: From cdbfcafc38ee6705d2960e05ac73c86c340b0bf0 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 5 Feb 2023 00:16:30 +0100 Subject: [PATCH 28/48] Make patch workflow match main --- .github/workflows/{build_macos.yml => build.yml} | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) rename .github/workflows/{build_macos.yml => build.yml} (96%) diff --git a/.github/workflows/build_macos.yml b/.github/workflows/build.yml similarity index 96% rename from .github/workflows/build_macos.yml rename to .github/workflows/build.yml index 9d486298..57581b02 100644 --- a/.github/workflows/build_macos.yml +++ b/.github/workflows/build.yml @@ -1,10 +1,6 @@ -name: Packaging +name: Build -on: - push: - tags: - - v** - - tt** +on: workflow_dispatch jobs: buildAssets: From 6d45194253bc287d2143e5cd947ffc572da7b111 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 5 Feb 2023 14:13:21 +0100 Subject: [PATCH 29/48] Update completed translations and add Russian project file --- i18n/nw_de_DE.ts | 88 ++++++++--------- i18n/nw_en_US.ts | 88 ++++++++--------- i18n/nw_es_419.ts | 88 ++++++++--------- i18n/nw_fr_FR.ts | 90 +++++++++--------- i18n/nw_nb_NO.ts | 88 ++++++++--------- i18n/nw_nl_NL.ts | 90 +++++++++--------- novelwriter/assets/i18n/project_ru_RU.json | 105 +++++++++++++++++++++ 7 files changed, 371 insertions(+), 266 deletions(-) create mode 100644 novelwriter/assets/i18n/project_ru_RU.json diff --git a/i18n/nw_de_DE.ts b/i18n/nw_de_DE.ts index 6cd62475..0463c653 100644 --- a/i18n/nw_de_DE.ts +++ b/i18n/nw_de_DE.ts @@ -4,72 +4,72 @@ Common - + in the future in der Zukunft - + just now gerade eben - + a minute ago vor einer Minute - + {0} minutes ago {0} Minuten her - + an hour ago eine Stunde her - + {0} hours ago {0} Stunden her - + a day ago einen Tag her - + {0} days ago {0} Tage her - + a week ago eine Woche her - + {0} weeks ago {0} Wochen her - + a month ago einen Monat her - + {0} months ago {0} Monate her - + a year ago ein Jahr her - + {0} years ago {0} Jahre her @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents Inhaltsverzeichnis - + Title Name - + Words Wörter - + Pages Seiten - + Page Seite - + Progress Fortschritt - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. Üblicherweise sind ca. 350 Wörter auf einer Buchseite (5 x 8 Zoll, 11 pt). - + Start counting page numbers from this page. Ab dieser Seite mit arabischen Ziffern beginnen zu zählen. - + Assume a new chapter or partition always start on an odd numbered page. Angenommen ein neues Kapitel oder neuer Teil beginnt immer auf einer ungeraden Seite. - + Words per page Wörter pro Seite - + Count pages from Seiten zählen ab - + Clear double pages Leere linke Seiten auslassen - + END ENDE - + Untitled Ohne Titel @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Arbeitstitel: {0} - - - - By {0} - Von {0} - - - + Words Wörter - + Chapters Kapitel - + Scenes Szenen - + Revisions Revisionen - + Editing Time Bearbeitungszeit - + Path Pfad + + + Project: {0} + Projekt: {0} + + + + By {0} + Von {0} + GuiProjectEditMain diff --git a/i18n/nw_en_US.ts b/i18n/nw_en_US.ts index 40b5694d..55ae7e4a 100644 --- a/i18n/nw_en_US.ts +++ b/i18n/nw_en_US.ts @@ -4,72 +4,72 @@ Common - + in the future in the future - + just now just now - + a minute ago a minute ago - + {0} minutes ago {0} minutes ago - + an hour ago an hour ago - + {0} hours ago {0} hours ago - + a day ago a day ago - + {0} days ago {0} days ago - + a week ago a week ago - + {0} weeks ago {0} weeks ago - + a month ago a month ago - + {0} months ago {0} months ago - + a year ago a year ago - + {0} years ago {0} years ago @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents Table of Contents - + Title Title - + Words Words - + Pages Pages - + Page Page - + Progress Progress - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. Typical word count for a 5 by 8 inch book page with 11 pt font is 350. - + Start counting page numbers from this page. Start counting page numbers from this page. - + Assume a new chapter or partition always start on an odd numbered page. Assume a new chapter or partition always start on an odd numbered page. - + Words per page Words per page - + Count pages from Count pages from - + Clear double pages Clear double pages - + END END - + Untitled Untitled @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Working Title: {0} - - - - By {0} - By {0} - - - + Words Words - + Chapters Chapters - + Scenes Scenes - + Revisions Revisions - + Editing Time Editing Time - + Path Path + + + Project: {0} + Project: {0} + + + + By {0} + By {0} + GuiProjectEditMain diff --git a/i18n/nw_es_419.ts b/i18n/nw_es_419.ts index 68af1721..6c15bc07 100644 --- a/i18n/nw_es_419.ts +++ b/i18n/nw_es_419.ts @@ -4,72 +4,72 @@ Common - + in the future en el futuro - + just now ahora mismo - + a minute ago hace un minuto - + {0} minutes ago hace {0} minutos - + an hour ago hace una hora - + {0} hours ago hace {0} horas - + a day ago hace un día - + {0} days ago hace {0} días - + a week ago hace una semana - + {0} weeks ago hace {0} semanas - + a month ago hace un mes - + {0} months ago hace {0} meses - + a year ago hace un año - + {0} years ago hace {0} años @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents Tabla de Contenido - + Title Título - + Words Palabras - + Pages Páginas - + Page Página - + Progress Progreso - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. El total de palabras característico para una página de libro de 12cm por 20cm con una fuente a 11pt es de 350. - + Start counting page numbers from this page. Comenzar a contar los números de página a partir de esta página. - + Assume a new chapter or partition always start on an odd numbered page. Dar por sentado que un capítulo o partición nueva siempre comenzará en una página impar. - + Words per page Palabras por página - + Count pages from Contar páginas desde - + Clear double pages Eliminar páginas dobles - + END FIN - + Untitled Sin Título @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Título Provisional: {0} - - - - By {0} - Por {0} - - - + Words Palabras - + Chapters Capítulos - + Scenes Escenas - + Revisions Revisiones - + Editing Time Tiempo de Edición - + Path Ruta + + + Project: {0} + Proyecto: {0} + + + + By {0} + Por {0} + GuiProjectEditMain diff --git a/i18n/nw_fr_FR.ts b/i18n/nw_fr_FR.ts index e3345f58..71246a99 100644 --- a/i18n/nw_fr_FR.ts +++ b/i18n/nw_fr_FR.ts @@ -4,72 +4,72 @@ Common - + in the future dans le futur - + just now maintenant - + a minute ago il y a une minute - + {0} minutes ago il y a {0} minutes - + an hour ago il y a une heure - + {0} hours ago il y a {0} heures - + a day ago hier - + {0} days ago il y a {0} jours - + a week ago il y a une semaine - + {0} weeks ago il y a {0} semaines - + a month ago il y a un mois - + {0} months ago il y a {0} mois - + a year ago il y a un an - + {0} years ago il y a {0} ans @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents Table des matières - + Title Titre - + Words Mots - + Pages Pages - + Page Page - + Progress Progression - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. Le nombre de mots moyen pour une page de livre de format 13 X 20 cm avec une police en taille 11pt est de 350. - + Start counting page numbers from this page. Commencer à compter les pages depuis cette page. - + Assume a new chapter or partition always start on an odd numbered page. On suppose qu'un nouveau chapitre ou une nouvelle partie débute sur une page de droite, numérotée impaire. - + Words per page Mots par page - + Count pages from Compter les pages depuis - + Clear double pages Ignorer les doubles pages - + END FIN - + Untitled Sans titre @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Titre de travail : {0} - - - - By {0} - Par {0} - - - + Words Mots - + Chapters Chapitres - + Scenes Scènes - + Revisions Révisions - + Editing Time Durée d'édition - + Path Chemin + + + Project: {0} + Projet : {0} + + + + By {0} + Par {0} + GuiProjectEditMain @@ -3782,7 +3782,7 @@ Could not open project with path: {0} - + N'a pas pu ouvrir le projet avec le chemin : {0} diff --git a/i18n/nw_nb_NO.ts b/i18n/nw_nb_NO.ts index 55401fd7..32ebc590 100644 --- a/i18n/nw_nb_NO.ts +++ b/i18n/nw_nb_NO.ts @@ -4,72 +4,72 @@ Common - + in the future i fremtiden - + just now nå nettopp - + a minute ago for et minutt siden - + {0} minutes ago for {0} minutter siden - + an hour ago for en time siden - + {0} hours ago for {0} timer siden - + a day ago for en dag siden - + {0} days ago for {0} dager siden - + a week ago for en uke siden - + {0} weeks ago for {0} uker siden - + a month ago for en måned siden - + {0} months ago for {0} måneder siden - + a year ago for et år siden - + {0} years ago for {0} år siden @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents Innholdsfortegnelse - + Title Tittel - + Words Ord - + Pages Sider - + Page Side - + Progress Fremdrift - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. Typisk antall ord for en 5 x 8 tommers bokside med 11 pt tekst er 350. - + Start counting page numbers from this page. Begynn sidetall fra denne siden. - + Assume a new chapter or partition always start on an odd numbered page. Beregn at nye kapitler og partisjoner alltid starter på en høyreside. - + Words per page Ord per side - + Count pages from Tell sider fra - + Clear double pages Tøm doble sider - + END SLUTT - + Untitled Uten tittel @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Arbeidstittel: {0} - - - - By {0} - Av {0} - - - + Words Ord - + Chapters Kapitler - + Scenes Scener - + Revisions Revisjoner - + Editing Time Redigeringstid - + Path Filbane + + + Project: {0} + Prosjekt: {0} + + + + By {0} + Av {0} + GuiProjectEditMain diff --git a/i18n/nw_nl_NL.ts b/i18n/nw_nl_NL.ts index bc3d3738..249938ab 100644 --- a/i18n/nw_nl_NL.ts +++ b/i18n/nw_nl_NL.ts @@ -4,72 +4,72 @@ Common - + in the future in de toekomst - + just now zojuist - + a minute ago een minuut geleden - + {0} minutes ago {0} minuten geleden - + an hour ago een uur geleden - + {0} hours ago {0} uur geleden - + a day ago een dag geleden - + {0} days ago {0} dagen geleden - + a week ago een week geleden - + {0} weeks ago {0} weken geleden - + a month ago een maand geleden - + {0} months ago {0} maanden geleden - + a year ago een jaar geleden - + {0} years ago {0} jaren geleden @@ -2884,72 +2884,72 @@ GuiProjectDetailsContents - + Table of Contents Inhoudsopgave - + Title Titel - + Words Woorden - + Pages Pagina's - + Page Pagina - + Progress Voortgang - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. Typische woord telling voor een 5 bij 8 inch boek pagina met 11 pt lettertype is 350. - + Start counting page numbers from this page. Begin met het tellen van paginanummers vanaf deze pagina. - + Assume a new chapter or partition always start on an odd numbered page. Neem aan dat een nieuw hoofdstuk of partitie altijd op een oneven genummerde pagina begint. - + Words per page Woorden per pagina - + Count pages from Pagina's tellen vanaf - + Clear double pages Dubbele pagina's wissen - + END EINDE - + Untitled Naamloos @@ -2957,45 +2957,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Werktitel: {0} - - - - By {0} - Door {0} - - - + Words Woorden - + Chapters Hoofdstukken - + Scenes Scènes - + Revisions Revisies - + Editing Time Bewerk tijd - + Path Pad + + + Project: {0} + Project: {0} + + + + By {0} + Door {0} + GuiProjectEditMain @@ -3782,7 +3782,7 @@ Could not open project with path: {0} - + Kon project niet openen met pad: {0} diff --git a/novelwriter/assets/i18n/project_ru_RU.json b/novelwriter/assets/i18n/project_ru_RU.json new file mode 100644 index 00000000..9bebab4d --- /dev/null +++ b/novelwriter/assets/i18n/project_ru_RU.json @@ -0,0 +1,105 @@ +{ + "Synopsis": "Сводка", + "Comment": "Комментарий", + "Notes": "Заметки", + "0": "Ноль", + "1": "Один", + "2": "Два", + "3": "Три", + "4": "Четыре", + "5": "Пять", + "6": "Шесть", + "7": "Семь", + "8": "Восемь", + "9": "Девять", + "10": "Десять", + "11": "Одиннадцать", + "12": "Двенадцать", + "13": "Тринадцать", + "14": "Четырнадцать", + "15": "Пятнадцать", + "16": "Шестнадцать", + "17": "Семнадцать", + "18": "Восемнадцатая", + "19": "Девятнадцать", + "20": "Двадцать", + "21": "Двадцать один", + "22": "Двадцать два", + "23": "Двадцать три", + "24": "Двадцать четыре", + "25": "Двадцать пять", + "26": "Двадцать шесть", + "27": "Двадцать семь", + "28": "Двадцать восемь", + "29": "Двадцать девять", + "30": "Тридцать", + "31": "Тридцать один", + "32": "Тридцать два", + "33": "Тридцать три", + "34": "Тридцать четыре", + "35": "Тридцать пятая", + "36": "Тридцать пять", + "37": "Тридцать семь", + "38": "Тридцать восемь", + "39": "Тридцать девять", + "40": "Сорок", + "41": "Сорок один", + "42": "Сорок два", + "43": "Сорок три", + "44": "Сорок четыре", + "45": "Сорок пять", + "46": "Сорок шесть", + "47": "Сорок семь", + "48": "Сорок восемь", + "49": "Сорок девять", + "50": "Пятьдесят", + "51": "Пятьдесят один", + "52": "Пятьдесят два", + "53": "Пятьдесят три", + "54": "Пятьдесят четыре", + "55": "Пятьдесят пять", + "56": "Пятьдесят шесть", + "57": "Пятьдесят семь", + "58": "Пятьдесят восемь", + "59": "Пятьдесят девять", + "60": "Шестьдесят", + "61": "Шестьдесят один", + "62": "Шестьдесят два", + "63": "Шестьдесят три", + "64": "Шестьдесят четыре", + "65": "Шестьдесят пять", + "66": "Шестьдесят шесть", + "67": "Шестьдесят семь", + "68": "Шестьдесят восемь", + "69": "Шестьдесят девять", + "70": "Семьдесят", + "71": "Семьдесят один", + "72": "Семьдесят два", + "73": "Семьдесят три", + "74": "Семьдесят четыре", + "75": "Семьдесят пять", + "76": "Семьдесят шесть", + "77": "Семьдесят семь", + "78": "Семьдесят восемь", + "79": "Семьдесят девять", + "80": "Восемьдесят", + "81": "Восемьдесят один", + "82": "Восемьдесят два", + "83": "Восемьдесят три", + "84": "Восемьдесят четыре", + "85": "Восемьдесят пять", + "86": "Восемьдесят шесть", + "87": "Восемьдесят семь", + "88": "Восемьдесят восемь", + "89": "Восемьдесят девять", + "90": "Девяносто", + "91": "Девяносто один", + "92": "Девяносто два", + "93": "Девяносто три", + "94": "Девяносто четыре", + "95": "Девяносто пять", + "96": "Девяносто шесть", + "97": "Девяносто семь", + "98": "Девяносто восемь", + "99": "Девяносто девять" +} From 492d94ee6e19a519638ff6145cd37d09e964e057 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 5 Feb 2023 18:12:50 +0100 Subject: [PATCH 30/48] Check that content path exists before returning it from storage class (#1317) --- novelwriter/core/storage.py | 10 +++++++++- tests/test_core/test_core_tree.py | 1 + 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/novelwriter/core/storage.py b/novelwriter/core/storage.py index d1cb0b87..2cd4c3d9 100644 --- a/novelwriter/core/storage.py +++ b/novelwriter/core/storage.py @@ -79,8 +79,16 @@ class NWStorage: @property def contentPath(self): + """Return the path used for project content. The folder must + already exist, otherwise this property is None. + """ if self._runtimePath is not None: - return self._runtimePath / "content" + contentPath = self._runtimePath / "content" + if contentPath.is_dir(): + return contentPath + else: + logger.error("Path not found: %s", contentPath) + return None return None ## diff --git a/tests/test_core/test_core_tree.py b/tests/test_core/test_core_tree.py index 7b9d02da..0a6ab099 100644 --- a/tests/test_core/test_core_tree.py +++ b/tests/test_core/test_core_tree.py @@ -469,6 +469,7 @@ def testCoreTree_ToCFile(monkeypatch, mockGUI, mockItems, tmpPath): assert theTree.writeToCFile() is False theProject._storage._runtimePath = tmpPath + (tmpPath / "content").mkdir() assert theTree.writeToCFile() is True pathA = str(Path("content") / "c000000000001.nwd") From 5b200616076b8c1a924e0899d87bbc41927a58be Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:01:46 +0100 Subject: [PATCH 31/48] Only insert line break for block formats if the block already has text (#1349, #1350) --- novelwriter/gui/doceditor.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 99104c00..87c9e7cc 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1750,6 +1750,7 @@ class GuiDocEditor(QTextEdit): # Remove existing format first, if any theText = theBlock.text() + hasText = len(theText) > 0 if theText.startswith("@"): logger.error("Cannot apply block format to keyword/value line") return False @@ -1855,7 +1856,7 @@ class GuiDocEditor(QTextEdit): posS = theCursor.selectionStart() theCursor.removeSelectedText() theCursor.setPosition(posS) - if posS > 0: + if posS > 0 and hasText: theCursor.insertBlock() theCursor.insertText(theText) if posO - cOffset >= 0: From aa3fe961589477f97d74a833cc7635d7a38760b4 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:07:52 +0100 Subject: [PATCH 32/48] Add some comments to explain what's going on in the block formatting --- novelwriter/gui/doceditor.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/novelwriter/gui/doceditor.py b/novelwriter/gui/doceditor.py index 87c9e7cc..361b236e 100644 --- a/novelwriter/gui/doceditor.py +++ b/novelwriter/gui/doceditor.py @@ -1856,11 +1856,17 @@ class GuiDocEditor(QTextEdit): posS = theCursor.selectionStart() theCursor.removeSelectedText() theCursor.setPosition(posS) + if posS > 0 and hasText: + # If the block already had text, we must insert a new block + # first before we can add back the text to it. theCursor.insertBlock() + theCursor.insertText(theText) + if posO - cOffset >= 0: theCursor.setPosition(posO - cOffset) + theCursor.endEditBlock() self.setTextCursor(theCursor) From fd14c682a9e2d97e5ef2b7ee9784541d7ef44f49 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:16:49 +0100 Subject: [PATCH 33/48] Allow more than one item in extra column --- novelwriter/gui/noveltree.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index eae204c1..34db4f54 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -741,7 +741,7 @@ class GuiNovelTree(QTreeWidget): if refData: toolText = ", ".join(refData) - return refData[0], f"{refName}: {toolText}" + return toolText, f"{refName}: {toolText}" return "", "" From cf742a89c04ecdc375397343a0b265da73ec7014 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:49:47 +0100 Subject: [PATCH 34/48] Add a menu entry to change column size for last column in novel tree --- novelwriter/core/options.py | 2 +- novelwriter/gui/noveltree.py | 55 ++++++++++++++++++++++++++++++------ 2 files changed, 47 insertions(+), 10 deletions(-) diff --git a/novelwriter/core/options.py b/novelwriter/core/options.py index 2432e0c9..900701f6 100644 --- a/novelwriter/core/options.py +++ b/novelwriter/core/options.py @@ -59,7 +59,7 @@ VALID_MAP = { "widthCol3", "widthCol4", "wordsPerPage", "countFrom", "clearDouble", }, "GuiWordList": {"winWidth", "winHeight"}, - "GuiNovelView": {"lastCol"}, + "GuiNovelView": {"lastCol", "lastColSize"}, } diff --git a/novelwriter/gui/noveltree.py b/novelwriter/gui/noveltree.py index 34db4f54..920dccf2 100644 --- a/novelwriter/gui/noveltree.py +++ b/novelwriter/gui/noveltree.py @@ -34,12 +34,13 @@ from time import time from PyQt5.QtGui import QFont, QPalette from PyQt5.QtCore import Qt, QSize, pyqtSlot, pyqtSignal from PyQt5.QtWidgets import ( - QAbstractItemView, QActionGroup, QFrame, QHBoxLayout, QHeaderView, QMenu, - QSizePolicy, QToolButton, QToolTip, QTreeWidget, QTreeWidgetItem, - QVBoxLayout, QWidget + QAbstractItemView, QActionGroup, QFrame, QHBoxLayout, QHeaderView, + QInputDialog, QMenu, QSizePolicy, QToolButton, QToolTip, QTreeWidget, + QTreeWidgetItem, QVBoxLayout, QWidget ) from novelwriter.enum import nwDocMode, nwItemClass, nwOutline +from novelwriter.common import minmax from novelwriter.constants import nwHeaders, nwKeyWords, nwLabels, trConst from novelwriter.gui.components import NovelSelector @@ -126,20 +127,28 @@ class GuiNovelView(QWidget): lastCol = self.theProject.options.getEnum( "GuiNovelView", "lastCol", NovelTreeColumn, NovelTreeColumn.HIDDEN ) + lastColSize = self.theProject.options.getInt( + "GuiNovelView", "lastColSize", 25 + ) self.clearProject() + self.novelBar.buildNovelRootMenu() self.novelBar.setLastColType(lastCol, doRefresh=False) self.novelBar.setCurrentRoot(lastNovel) self.novelBar.setEnabled(True) + self.novelTree.setLastColSize(lastColSize) + return def closeProjectTasks(self): """Run closing project tasks. """ lastColType = self.novelTree.lastColType + lastColSize = self.novelTree.lastColSize self.theProject.options.setValue("GuiNovelView", "lastCol", lastColType) + self.theProject.options.setValue("GuiNovelView", "lastColSize", lastColSize) return def setTreeFocus(self): @@ -233,6 +242,10 @@ class GuiNovelToolBar(QWidget): self._addLastColAction(NovelTreeColumn.FOCUS, self.tr("Focus Character")) self._addLastColAction(NovelTreeColumn.PLOT, self.tr("Novel Plot")) + self.mLastCol.addSeparator() + self.aLastColSize = self.mLastCol.addAction(self.tr("Column Size")) + self.aLastColSize.triggered.connect(self._selectLastColumnSize) + self.tbMore = QToolButton(self) self.tbMore.setToolTip(self.tr("More Options")) self.tbMore.setIconSize(QSize(iPx, iPx)) @@ -339,6 +352,19 @@ class GuiNovelToolBar(QWidget): self.novelView.novelTree.refreshTree(rootHandle=rootHandle, overRide=True) return + @pyqtSlot() + def _selectLastColumnSize(self): + """Set the maximum width for the last column. + """ + oldSize = self.novelView.novelTree.lastColSize + newSize, isOk = QInputDialog.getInt( + self, self.tr("Column Size"), self.tr("Maximum column size in %"), oldSize, 15, 75, 5 + ) + if isOk: + self.novelView.novelTree.setLastColSize(newSize) + self._refreshNovelTree() + return + ## # Internal Functions ## @@ -379,10 +405,11 @@ class GuiNovelTree(QTreeWidget): self.theProject = novelView.mainGui.theProject # Internal Variables - self._treeMap = {} - self._lastBuild = 0 - self._lastCol = NovelTreeColumn.POV - self._actHandle = None + self._treeMap = {} + self._lastBuild = 0 + self._lastCol = NovelTreeColumn.POV + self._lastColSize = 0.25 + self._actHandle = None # Cached Strings self._povLabel = trConst(nwLabels.KEY_NAME[nwKeyWords.POV_KEY]) @@ -470,6 +497,10 @@ class GuiNovelTree(QTreeWidget): def lastColType(self): return self._lastCol + @property + def lastColSize(self): + return int(self._lastColSize * 100) + ## # Class Methods ## @@ -552,6 +583,12 @@ class GuiNovelTree(QTreeWidget): self.refreshTree(rootHandle=lastNovel, overRide=True) return + def setLastColSize(self, colSize): + """Set the column size in integer values between 15 and 75. + """ + self._lastColSize = minmax(colSize, 15, 75)/100.0 + return + def setActiveHandle(self, tHandle): """Highlight the rows associated with a given handle. """ @@ -619,7 +656,7 @@ class GuiNovelTree(QTreeWidget): newW = event.size().width() oldW = event.oldSize().width() if newW != oldW: - eliW = int(0.25 * newW) + eliW = int(self._lastColSize * newW) fMetric = self.fontMetrics() for i in range(self.topLevelItemCount()): trItem = self.topLevelItem(i) @@ -709,7 +746,7 @@ class GuiNovelTree(QTreeWidget): trItem.setData(self.C_MORE, Qt.DecorationRole, self._pMore) # Custom column - mW = int(0.25 * self.viewport().width()) + mW = int(self._lastColSize * self.viewport().width()) lastText, toolTip = self._getLastColumnText(tHandle, sTitle) elideText = self.fontMetrics().elidedText(lastText, Qt.ElideRight, mW) trItem.setText(self.C_EXTRA, elideText) From c1f1013cfda3070cc1ca40e8aa5bca757dc2591f Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:55:37 +0100 Subject: [PATCH 35/48] Improve test coverage --- tests/test_gui/test_gui_noveltree.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/test_gui/test_gui_noveltree.py b/tests/test_gui/test_gui_noveltree.py index 313d720e..e74e4ebb 100644 --- a/tests/test_gui/test_gui_noveltree.py +++ b/tests/test_gui/test_gui_noveltree.py @@ -27,7 +27,7 @@ from tools import C, buildTestProject from PyQt5.QtGui import QFocusEvent from PyQt5.QtCore import Qt, QEvent -from PyQt5.QtWidgets import QToolTip +from PyQt5.QtWidgets import QInputDialog, QToolTip from novelwriter.enum import nwWidget, nwItemType from novelwriter.gui.noveltree import NovelTreeColumn @@ -82,6 +82,8 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): # Populate Tree # ============= + novelView.setTreeFocus() + nwGUI.projStack.setCurrentIndex(nwGUI.idxNovelView) nwGUI.rebuildIndex() novelTree._populateTree(rootHandle=None) @@ -172,6 +174,11 @@ def testGuiNovelTree_TreeItems(qtbot, monkeypatch, nwGUI, projPath, mockRnd): spSize = nwGUI.splitMain.sizes() nwGUI.splitMain.setSizes([spSize[0] + 10, spSize[1] - 10]) + # Resize the last column + with monkeypatch.context() as mp: + mp.setattr(QInputDialog, "getInt", lambda *a, **k: (40, True)) + novelBar._selectLastColumnSize() + # Item Meta # ========= From 7fe85ddfde94cc648781b3586bef8ff17b07c921 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 20:59:26 +0100 Subject: [PATCH 36/48] Update base translation file --- i18n/nw_base.ts | 75 ++++++++++++++++++++++++++++--------------------- 1 file changed, 43 insertions(+), 32 deletions(-) diff --git a/i18n/nw_base.ts b/i18n/nw_base.ts index 6b455964..6777e15d 100644 --- a/i18n/nw_base.ts +++ b/i18n/nw_base.ts @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status - + Line: {0} ({1}) - + Words: {0} ({1}) - + Document size is {0} bytes - + Words: {0} selected - + Character count: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label - + Search document - + Toggle Focus Mode - + Close the document @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search - + Replace - + Case Sensitive - + Whole Words Only - + RegEx Mode - + Loop Search - + Search Next File - + Preserve Case - + Close Search - + Find in current document - + Find and replace in current document @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} - + Novel Root - + Refresh - + Last Column - + Hidden - + Point of View Character - + Focus Character - + Novel Plot - + + + Column Size + + + + More Options + + + Maximum column size in % + + GuiNovelTree - + No meta data From 6ed7c6f5a76a8ff5aa23f1255c4327c3d95fc5d6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Fri, 10 Feb 2023 21:50:10 +0100 Subject: [PATCH 37/48] Update version and changelog --- CHANGELOG.md | 66 +++++++++++++++++++++++++++++++++-------- novelwriter/__init__.py | 6 ++-- sample/nwProject.nwx | 4 +-- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd8bae1a..906787ec 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,45 @@ # novelWriter Changelog +## Version 2.0.5 [2023-02-12] + +### Release Notes + +This is a patch release that fixes a number of minor bugs and usability issues. The Project Details +dialog now properly updates when another project is opened, and the "Total editing time" value has +a less ambiguous time format. The editor no longer inserts blank lines if block formats are applied +to an empty line. The optional last column in the Novel Tree will now show all items of the +selected type, not only the first, and the column size can be adjusted from the same menu where the +column content is selected. + +### Detailed Changelog + +**Bugfixes** + +* Fixed an issue where the Title, Project Name and Author values of the Project Dialog would not + refresh when a project was closed and another opened. The issue is with the Qt library and + caching of the dialog, but novelWriter forces a refresh of the labels. These three were + previously missing though. Issue #1336. PR #1339. +* Add a check to the data storage class that a path exists before it is returned to other classes + that uses them for file I/O. Issue #1317. PR #1342. + +**Usability Fixes** + +* The "Total editing time" label on the Project Details dialog now uses the same time format as the + status bar. That is, HH:MM:SS for times less than 24 hours, and D-HH:MM:SS for times from 24 + hours and above. Issue #1335. PR #1339. +* Fixed an issue where applying block formatting to an empty line would insert a blank line before + it. This is a consequence of the change from #1175. The line break is now only added if the line + is _not_ blank. Issues #1349 and #1350. PR #1354. +* The optional third column in the Novel Tree now shows all references for the selected category + instead of just the first one. The maximum width of the column can also be selected from the + Novel Tree config menu. Issue #1351. PR #1355. + +**Packaging** + +* Added App Bundle and DMG packages for MacOS. Contributed by @Ryex. PRs #1276 and #1340. + +---- + ## Version 2.0.4 [2023-01-29] ### Release Notes @@ -11,8 +51,8 @@ installed and imported. **Bugfixes** -* Fix an issue with the version check against PyQt5, which was imported from the wrong package when - running novelWriter with PyQt5 version 5.15.8, released 2023-01-28. Issue #1324. PR #1325. +* Fixed an issue with the version check against PyQt5, which was imported from the wrong package + when running novelWriter with PyQt5 version 5.15.8, released 2023-01-28. Issue #1324. PR #1325. ---- @@ -32,15 +72,15 @@ dialog box, replacing the Credits section on the main About tab. **Bugfixes** -* Fix an issue with one of the active icons for the project tree. The SVG paths were not properly +* Fixed an issue with one of the active icons for the project tree. The SVG paths were not properly joined. Issue #1297. PR #1299. -* Fix an issue where the new open project routine for 2.0 would not check that a project exists +* Fixed an issue where the new open project routine for 2.0 would not check that a project exists before trying to open it. This resulted in the open process creating all the expected folders in the designated location before realising there was no project there. Issue #1300. PR #1301. -* Fix an issue with the convert folder to document or note functionality was no longer working. The - context menu entries were actually just calling the function for converting a file. Issue #1305. - PR #1306. -* Fix an issue where the app may crash if an item is added as a child of an item that exists, but +* Fixed an issue with the convert folder to document or note functionality was no longer working. + The context menu entries were actually just calling the function for converting a file. + Issue #1305. PR #1306. +* Fixed an issue where the app may crash if an item is added as a child of an item that exists, but has invalid settings such that it is rejected by the project tree builder function when the project is opened. Now, only items with a parent item that has already been added will be allowed into the project tree. The issue was caused by an invalid project file, and is not likely to @@ -52,7 +92,7 @@ dialog box, replacing the Credits section on the main About tab. * The CREDITS.md file has been updated, and its content is now also available in a "Credits" tab in the About dialog in the app. The old credits section of the "About" tab has been removed. PR #1298. -* Fix a usability issue where double-clicking an entry in the Outline that belongs to a document +* Fixed a usability issue where double-clicking an entry in the Outline that belongs to a document that is already open in the editor does nothing. Now, the app switches view to the editor when the heading is clicked. Issue #1291. PR #1306. * Change how the editing of status and importance labels work in Project Settings. The form at the @@ -83,7 +123,7 @@ highlighting preferences were changed. It also fixes an issue that broke the Fre **Bugfixes** -* Fix an issue where changing the Highlighting Preferences for highlighting quotes, emphasis, and +* Fixed an issue where changing the Highlighting Preferences for highlighting quotes, emphasis, and multiple or trailing spaces would not reload the syntax highlighter in the editor. The changes would only take effect after restarting the app. Issue #1274. PR #1278. @@ -105,7 +145,7 @@ updated to include the icon theme setting. The patch also updates the French tra **Bugfixes** -* Fix an issue where starting the app with a custom GUI theme enabled would not load any icons at +* Fixed an issue where starting the app with a custom GUI theme enabled would not load any icons at all if the `icontheme` setting isn't specified. The app now loads the `typicons_light` theme by default if no icon theme is set. Issue #1263. PR #1264. @@ -248,7 +288,7 @@ _These Release Notes also include the changes from 2.0 pre-releases._ **Code Improvements** -* Fix an issue with circular imports mainly triggered from the test suite. PR #1166. +* Fixed an issue with circular imports mainly triggered from the test suite. PR #1166. * Instead of assigning headers in a document a key by its line number, the headings are now assigned sequential keys. This makes it easier to detect actual meta data changes, which would otherwise be triggered by a change of line number as well. PR #1241. @@ -386,7 +426,7 @@ Interface. PR #1146. **Bugfixes** -* Fix a typo in the Lorem Ipsum tool and set a max width for the views bar. PR #1065. +* Fixed a typo in the Lorem Ipsum tool and set a max width for the views bar. PR #1065. * The language set in the Build Tool is now properly exported to Open Document files. Previously, it would be set to English regardless of the user's selection. Issue #1073. PR #1077. * Since the text editor cursor extends to the right of its position in the window, it would diff --git a/novelwriter/__init__.py b/novelwriter/__init__.py index b1621a76..e330d5ab 100644 --- a/novelwriter/__init__.py +++ b/novelwriter/__init__.py @@ -59,9 +59,9 @@ __license__ = "GPLv3" __author__ = "Veronica Berglyd Olsen" __maintainer__ = "Veronica Berglyd Olsen" __email__ = "code@vkbo.net" -__version__ = "2.0.4" -__hexversion__ = "0x020004f0" -__date__ = "2023-01-29" +__version__ = "2.0.5" +__hexversion__ = "0x020005f0" +__date__ = "2023-02-12" __status__ = "Stable" __domain__ = "novelwriter.io" __url__ = "https://novelwriter.io" diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 95b57f16..8e735bdc 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Sample Project Sample Project Jane Smith From ee550c22130759ce3bbcce3bf45f3962a0b69475 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 08:31:55 +0100 Subject: [PATCH 38/48] Update translations --- i18n/nw_de_DE.ts | 75 ++++++++++++--------- i18n/nw_en_US.ts | 75 ++++++++++++--------- i18n/nw_es_419.ts | 75 ++++++++++++--------- i18n/nw_nb_NO.ts | 75 ++++++++++++--------- i18n/nw_pt_BR.ts | 165 ++++++++++++++++++++++++---------------------- 5 files changed, 260 insertions(+), 205 deletions(-) diff --git a/i18n/nw_de_DE.ts b/i18n/nw_de_DE.ts index 0463c653..42520e2a 100644 --- a/i18n/nw_de_DE.ts +++ b/i18n/nw_de_DE.ts @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status Status - + Line: {0} ({1}) Zeile: {0} ({1}) - + Words: {0} ({1}) Wörter: {0} ({1}) - + Document size is {0} bytes Dateigröße: {0} bytes - + Words: {0} selected Wörter: {0} markiert - + Character count: {0} Zeichenanzahl: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label Name des Dokuments ändern - + Search document Dokument durchsuchen - + Toggle Focus Mode Ablenkungsfrei ein/aus - + Close the document Dokument schließen @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search Suchen - + Replace Ersetzen - + Case Sensitive Groß-/Kleinschreibung beachten - + Whole Words Only Nur ganze Wörter - + RegEx Mode RegEx-Modus - + Loop Search Suche am Anfang fortsetzen - + Search Next File Nächstes Dokument durchsuchen - + Preserve Case Groß-/Kleinschreibung beibehalten - + Close Search Suche schließen - + Find in current document Im geöffneten Dokument suchen - + Find and replace in current document Im geöffneten Dokument suchen und ersetzen @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} Gliederung für {0} - + Novel Root Hauptordner für den Roman - + Refresh Aktualisieren - + Last Column Letzte Spalte - + Hidden Ausblenden - + Point of View Character Erzählperspektive - + Focus Character Figur im Mittelpunkt - + Novel Plot Romanhandlung - + + + Column Size + Spaltenbreite + + + More Options Weitere Optionen + + + Maximum column size in % + Maximale Spaltenbreite in % + GuiNovelTree - + No meta data Keine Meta-Daten diff --git a/i18n/nw_en_US.ts b/i18n/nw_en_US.ts index 55ae7e4a..dc1986fc 100644 --- a/i18n/nw_en_US.ts +++ b/i18n/nw_en_US.ts @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status Status - + Line: {0} ({1}) Line: {0} ({1}) - + Words: {0} ({1}) Words: {0} ({1}) - + Document size is {0} bytes Document size is {0} bytes - + Words: {0} selected Words: {0} selected - + Character count: {0} Character count: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label Edit document label - + Search document Search document - + Toggle Focus Mode Toggle Focus Mode - + Close the document Close the document @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search Search - + Replace Replace - + Case Sensitive Case Sensitive - + Whole Words Only Whole Words Only - + RegEx Mode RegEx Mode - + Loop Search Loop Search - + Search Next File Search Next File - + Preserve Case Preserve Case - + Close Search Close Search - + Find in current document Find in current document - + Find and replace in current document Find and replace in current document @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} Outline of {0} - + Novel Root Novel Root - + Refresh Refresh - + Last Column Last Column - + Hidden Hidden - + Point of View Character Point of View Character - + Focus Character Focus Character - + Novel Plot Novel Plot - + + + Column Size + Column Size + + + More Options More Options + + + Maximum column size in % + Maximum column size in % + GuiNovelTree - + No meta data No meta data diff --git a/i18n/nw_es_419.ts b/i18n/nw_es_419.ts index 6c15bc07..bf5ca215 100644 --- a/i18n/nw_es_419.ts +++ b/i18n/nw_es_419.ts @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status Estado - + Line: {0} ({1}) Línea: {0} ({1}) - + Words: {0} ({1}) Palabras: {0} ({1}) - + Document size is {0} bytes El tamaño del documento es de {0} bytes - + Words: {0} selected Palabras: {0} seleccionadas - + Character count: {0} Total de caracteres: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label Editar el rótulo del documento - + Search document Buscar en el documento - + Toggle Focus Mode Alternar el Modo Enfocado - + Close the document Cerrar el documento @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search Buscar - + Replace Reemplazar - + Case Sensitive Sensibilidad a Mayúsculas y Minúsculas - + Whole Words Only Sólo Palabras Enteras - + RegEx Mode Modo ExReg - + Loop Search Reiniciar la Búsqueda - + Search Next File Buscar en el Siguiente Archivo - + Preserve Case Conservar Mayúsculas y Minúsculas - + Close Search Cerrar la Búsqueda - + Find in current document Buscar en el documento actual - + Find and replace in current document Buscar y reemplazar en el documento actual @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} Estructura de {0} - + Novel Root Raíz de la Novela - + Refresh Actualizar - + Last Column Última Columna - + Hidden Ocultar - + Point of View Character Personaje Vehículo del Punto de Vista - + Focus Character Personaje bajo Enfoque - + Novel Plot Argumento de la Novela - + + + Column Size + Tamaño de Columna + + + More Options Más Opciones + + + Maximum column size in % + Tamaño de columna máximo en % + GuiNovelTree - + No meta data Sin metadatos diff --git a/i18n/nw_nb_NO.ts b/i18n/nw_nb_NO.ts index 32ebc590..33c46f86 100644 --- a/i18n/nw_nb_NO.ts +++ b/i18n/nw_nb_NO.ts @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status Status - + Line: {0} ({1}) Linje: {0} ({1}) - + Words: {0} ({1}) Ord: {0} ({1}) - + Document size is {0} bytes Dokumentet er {0} byte - + Words: {0} selected Ord: {0} valgt - + Character count: {0} Antall tegn: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label Endre dokumentnavn - + Search document Søk i dokumentet - + Toggle Focus Mode Slå av/på "Fokus-modus" - + Close the document Lukk dokumentet @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search Søk - + Replace Erstatt - + Case Sensitive Skill store/små bokstaver - + Whole Words Only Kun hele ord - + RegEx Mode RegEx-modus - + Loop Search Søk rundt - + Search Next File Søk i neste file - + Preserve Case Behold store/små bokstaver - + Close Search Lukk søk - + Find in current document Søk i det åpne dokumentet - + Find and replace in current document Søk og erstatt i det åpne dokumentet @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} Innhold i {0} - + Novel Root Roman-mappe - + Refresh Oppdatér - + Last Column Siste kolonne - + Hidden Skjult - + Point of View Character Synsvinkel-karakter - + Focus Character Fokus-karakter - + Novel Plot Roman-plott - + + + Column Size + Kolonnebredde + + + More Options Flere valg + + + Maximum column size in % + Maksimal kolonnebredde i % + GuiNovelTree - + No meta data Ingen meta-data diff --git a/i18n/nw_pt_BR.ts b/i18n/nw_pt_BR.ts index b91f0a94..9dcaf7c8 100644 --- a/i18n/nw_pt_BR.ts +++ b/i18n/nw_pt_BR.ts @@ -4,72 +4,72 @@ Common - + in the future no futuro - + just now agora - + a minute ago um minuto atrás - + {0} minutes ago {0} minutos atrás - + an hour ago uma hora atrás - + {0} hours ago {0} horas atrás - + a day ago um dia atrás - + {0} days ago {0} dias atrás - + a week ago uma semana atrás - + {0} weeks ago {0} semanas atrás - + a month ago um mês atrás - + {0} months ago {0} meses atrás - + a year ago um ano atrás - + {0} years ago {0} anos atrás @@ -757,32 +757,32 @@ GuiDocEditFooter - + Status Estado - + Line: {0} ({1}) Linha: {0} ({1}) - + Words: {0} ({1}) Palavras: {0} ({1}) - + Document size is {0} bytes O tamanho do documento é {0} bytes - + Words: {0} selected Palavras: {0} selecionadas - + Character count: {0} Contagem de carecteres: {0} @@ -790,22 +790,22 @@ GuiDocEditHeader - + Edit document label Editar etiqueta do documento - + Search document Procurar no documento - + Toggle Focus Mode Alternar o "Modo Foco" - + Close the document Fechar o documento @@ -813,58 +813,58 @@ GuiDocEditSearch - - + + Search Pesquisa - + Replace Substituir - + Case Sensitive Diferenciar Maiúsculas e Minúsculas - + Whole Words Only Apenas Palavras Inteiras - + RegEx Mode Expressão Regular - + Loop Search Pesquisa do Início - + Search Next File Busca no Próximo Arquivo - + Preserve Case Preserva Maiúsculas e Minúsculas - + Close Search Fechar a Busca - + Find in current document Encontrar no documento atual - + Find and replace in current document Encontrar e substituir no documento atual @@ -2050,55 +2050,66 @@ GuiNovelToolBar - + Outline of {0} Esboço de {0} - + Novel Root Raiz do Livro - + Refresh Atualizar - + Last Column Última Coluna - + Hidden Oculto - + Point of View Character Ponto de Vista do Personagem - + Focus Character Personagem em Foco - + Novel Plot Enredo do Livro - + + + Column Size + Tamanho da coluna + + + More Options Mais Opções + + + Maximum column size in % + Tamanho máximo da coluna em % + GuiNovelTree - + No meta data Sem metadados @@ -2884,72 +2895,72 @@ GuiProjectDetailsContents - + Table of Contents Sumário - + Title Título - + Words Palavras - + Pages Páginas - + Page Página - + Progress Progresso - + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. Contagem de palavras típica para uma página de livro de 5 por 8 polegadas com a fonte de 11 pt é 350. - + Start counting page numbers from this page. Inicia a contagem de numero de páginas à partir dessa página. - + Assume a new chapter or partition always start on an odd numbered page. Assume que um capítulo ou partição sempre começa em uma página com numeração ímpar. - + Words per page Palavras por página - + Count pages from Contar páginas à partir da página - + Clear double pages Eliminar páginas duplas - + END FIM - + Untitled Sem Título @@ -2957,45 +2968,45 @@ GuiProjectDetailsMain - - Working Title: {0} - Nome do projeto - - - - By {0} - Por {0} - - - + Words Palavras - + Chapters Capítulos - + Scenes Cenas - + Revisions Revisões - + Editing Time Tempo de Edição - + Path Caminho + + + Project: {0} + Projeto: {0} + + + + By {0} + Por {0} + GuiProjectEditMain @@ -3782,7 +3793,7 @@ Could not open project with path: {0} - + Não foi possível abrir o projeto com o caminho: {0} From c2dd579eb484080cd1d05b8e54cf39827878ca9a Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 08:32:02 +0100 Subject: [PATCH 39/48] Add Italian translation --- CREDITS.md | 1 + i18n/nw_it_IT.ts | 4480 ++++++++++++++++++++ novelwriter/assets/i18n/project_it_IT.json | 105 + novelwriter/assets/text/credits_en.htm | 1 + 4 files changed, 4587 insertions(+) create mode 100644 i18n/nw_it_IT.ts create mode 100644 novelwriter/assets/i18n/project_it_IT.json diff --git a/CREDITS.md b/CREDITS.md index 16e1dbba..4d30b0a3 100644 --- a/CREDITS.md +++ b/CREDITS.md @@ -20,6 +20,7 @@ translators for the languages currently available: * Dutch: Martijn van der Kleijn (@mvdkleijn) * French: Jan Lüdke (@jyhelle) * German: Myian (@heymyian) +* Italian: Riccardo Mangili * Latin American Spanish: Tommy Marplatt (@tmarplatt) * Norwegian: Veronica Berglyd Olsen (@vkbo) * Portuguese: Bruno Meneguello (@bkmeneguello) diff --git a/i18n/nw_it_IT.ts b/i18n/nw_it_IT.ts new file mode 100644 index 00000000..e01cb77a --- /dev/null +++ b/i18n/nw_it_IT.ts @@ -0,0 +1,4480 @@ + + + + + Common + + + in the future + in futuro + + + + just now + ora + + + + a minute ago + un minuto fa + + + + {0} minutes ago + {0} minuti fa + + + + an hour ago + un ora fa + + + + {0} hours ago + {0} ore fa + + + + a day ago + un giorno fa + + + + {0} days ago + {0} giorni fa + + + + a week ago + una settimana fa + + + + {0} weeks ago + {0} settimane fa + + + + a month ago + un mese fa + + + + {0} months ago + {0} mesi fa + + + + a year ago + un anno fa + + + + {0} years ago + {0} anni fa + + + + Constant + + + + + None + Nessuno + + + + Novel + Romanzo + + + + + Plot + Trama + + + + + Characters + Personaggi + + + + + Locations + Luoghi + + + + + Timeline + Sequenza temporale + + + + + Objects + Oggetti + + + + + Entities + Entità + + + + + Custom + Personalizzato + + + + Archive + Archivio + + + + Trash + Cestino + + + + + Novel Document + Documento del romanzo + + + + + Project Note + Nota del progetto + + + + Root Folder + Cartella principale + + + + Folder + Cartella + + + + Novel Title Page + Pagina del titolo del romanzo + + + + Novel Chapter + Capitolo del romanzo + + + + Novel Scene + Scena del romanzo + + + + Novel Section + Sezione del romanzo + + + + Tag + Etichetta + + + + Point of View + Punto di vista + + + + + Focus + Focus + + + + Title + Titolo + + + + Level + Livello + + + + Document + Documento + + + + Line + Righe + + + + Chars + Caratteri + + + + Words + Parole + + + + Pars + Paragrafi + + + + POV + POV + + + + Synopsis + Sommario + + + + Straight single quotation mark + Virgoletta singola diritta + + + + Straight double quotation mark + Virgolette doppie diritte + + + + Left single quotation mark + Virgoletta singola a sinistra + + + + Right single quotation mark + Virgoletta singola a destra + + + + Single low-9 quotation mark + Singola virgoletta bassa 9 + + + + Single high-reversed-9 quotation mark + Singola virgoletta alta inversa-9 + + + + Left double quotation mark + Virgolette doppie a sinistra + + + + Right double quotation mark + Virgolette doppie a destra + + + + Double low-9 quotation mark + Doppie virgolette basse 9 + + + + Double high-reversed-9 quotation mark + Doppie virgolette alte inverse 9 + + + + Double low-reversed-9 quotation mark + Doppie virgolette basse inverse 9 + + + + Single left-pointing angle quotation mark + Virgoletta singola ad angolo sinistro (<) + + + + Single right-pointing angle quotation mark + Virgoletta singola ad angolo destro (>) + + + + Double left-pointing angle quotation mark + Virgolette doppie ad angolo sinistro (<<) + + + + Double right-pointing angle quotation mark + Virgolette doppie ad angolo destro (>>) + + + + Left corner bracket + Staffa angolare sinistra + + + + Right corner bracket + Staffa angolare destra + + + + Left white corner bracket + Staffa angolare bianca sinistra + + + + Right white corner bracket + Staffa angolare bianca destra + + + + GuiAbout + + + + About novelWriter + A proposito di novelWriter + + + + About + Informazioni + + + + Release + Versione + + + + Credits + Riconoscimenti + + + + Licence + Licenza + + + + Website: {0} + Sito web: {0} + + + + novelWriter is a markdown-like text editor designed for organising and writing novels. It is written in Python 3 with a Qt5 GUI, using PyQt5. + novelWriter è un editor di testo basato su markdown progettato per organizzare e scrivere romanzi. È scritto in Python 3 con una GUI Qt5, usando PyQt5. + + + + novelWriter is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. + novelWriter è software libero: è possibile redistribuirlo e/o modificarlo secondo i termini della GNU General Public License come pubblicata dalla Free Software Foundation, o la versione 3 della Licenza, o (a scelta) una versione successiva. + + + + novelWriter is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + novelWriter è distribuito nella speranza che sia utile, ma SENZA ALCUNA GARANZIA; senza neppure la garanzia implicita di COMMERCIABILITÀ o di APPLICABILITÀ PER UNO SCOPO PARTICOLARE. + + + + See the Licence tab for the full licence text, or visit the GNU website at {0} for more details. + Vedere la scheda Licenza per il testo completo della licenza, o visitare il sito web GNU a {0} per maggiori dettagli. + + + + GuiBuildNovel + + + Build Novel Project + Costruisci il progetto del romanzo + + + + Title Formats for Novel Files + Formati del titolo per i file del romanzo + + + + Formatting Codes: + Codici di formattazione: + + + + {0} for the title as set in the document + {0} per il titolo come impostato nel documento + + + + {0} for chapter number (1, 2, 3) + {0} per il numero del capitolo (1, 2, 3) + + + + {0} for chapter number as a word (one, two) + {0} per il numero di capitolo come parola (uno, due) + + + + {0} for chapter number in upper case Roman + {0} per il numero di capitolo in maiuscolo Romano + + + + {0} for chapter number in lower case Roman + {0} per il numero di capitolo in minuscolo Romano + + + + {0} for scene number within chapter + {0} per il numero di scena all'interno del capitolo + + + + {0} for scene number within novel + {0} per il numero di scena all'interno del romanzo + + + + Leave blank to skip this heading, or set to a static text, like for instance '{0}', to make a separator. The separator will be centred automatically and only appear between sections of the same type. + Lasciare vuoto per saltare questa intestazione, o impostare su un testo statico, come ad esempio '{0}', per creare un separatore. Il separatore sarà centrato automaticamente e apparirà solo tra sezioni dello stesso tipo. + + + + Not Set + Non impostato + + + + Title + Titolo + + + + Chapter + Capitolo + + + + Unnumbered + Senza numerazione + + + + Scene + Scena + + + + Section + Sezione + + + + Language + Lingua + + + + Hide scene + Nascondi scena + + + + Hide section + Nascondi sezione + + + + Font Options + Opzioni carattere + + + + Font family + Famiglia carattere + + + + Font size + Dimensione carattere + + + + Line height + Altezza riga + + + + Justify text + Giustifica il testo + + + + Disable styling + Disabilita lo stile + + + + Styling Options + Opzioni di stile + + + + Include Options + Opzioni di inclusione + + + + Include synopsis + Includi sinossi + + + + Include comments + Includi commenti + + + + Include keywords + Includi parole chiavi + + + + Include body text + Includi corpo testo + + + + Root Filter Options + Opzioni Filtro Radice + + + + File Filter Options + Opzioni Filtro File + + + + Include novel files + Includi i files del romanzo + + + + Include note files + Includi i file delle note + + + + Include inactive files + Includi i file inattivi + + + + Export Options + Opzioni di esportazione + + + + Replace tabs with spaces + Sostituisci le tabulazioni con gli spazi + + + + Replace Unicode in HTML + Sostituisci Unicode in HTML + + + + Build Preview + Genera anteprima + + + + Print + Stampa + + + + Print Preview + Anteprima di stampa + + + + Print to PDF + Stampa come PDF + + + + Save As + Salva come + + + + Open Document (.odt) + Apri documento (.odt) + + + + Flat Open Document (.fodt) + Apri documento piatto (.fodt) + + + + novelWriter HTML (.htm) + novelWriter HTML (.htm) + + + + novelWriter Markdown (.nwd) + novelWriter Markdown (.nwd) + + + + Standard Markdown (.md) + Standard Markdown (.md) + + + + GitHub Markdown (.md) + GitHub Markdown (.md) + + + + JSON + novelWriter HTML (.json) + JSON + novelWriter HTML (.json) + + + + JSON + novelWriter Markdown (.json) + JSON + novelWriter Markdown (.json) + + + + Close + Chiudi + + + + Failed to generate preview. The result is too big. + Impossibile generare l'anteprima. Il risultato è troppo grande. + + + + There were problems when building the project: + Ci sono stati problemi durante la costruzione del progetto: + + + + Open Document + Documento Aperto + + + + Flat Open Document + Documento Aperto Piatto + + + + Plain HTML + HTML Semplice + + + + novelWriter Markdown + novelWriter Markdown + + + + Standard Markdown + Standard Markdown + + + + GitHub Markdown + GitHub Markdown + + + + JSON + novelWriter HTML + JSON + novelWriter HTML + + + + JSON + novelWriter Markdown + JSON + novelWriter Markdown + + + + PDF + PDF + + + + Save Document As + Salva documento come + + + + {0} file successfully written to: + {0} file scritto correttamente in: + + + + Failed to write {0} file. {1} + Scrittura file {0} non riuscita. {1} + + + + GuiBuildNovelDocView + + + This area will show the content of the document to be exported or printed. Press the "Build Preview" button to generate content. + Questa area mostrerà il contenuto del documento da esportare o stampare. Premi il pulsante "Crea Anteprima" per generare il contenuto. + + + + Unknown + Sconosciuto + + + + Build Time: + Data di compilazione: + + + + GuiDocEditFooter + + + Status + Stato + + + + Line: {0} ({1}) + Riga: {0} ({1}) + + + + Words: {0} ({1}) + Parole: {0} ({1}) + + + + Document size is {0} bytes + La dimensione del documento è {0} byte + + + + Words: {0} selected + Parole: {0} selezionate + + + + Character count: {0} + Conteggio caratteri: {0} + + + + GuiDocEditHeader + + + Edit document label + Modifica etichetta del documento + + + + Search document + Cerca nel documento + + + + Toggle Focus Mode + Attiva/Disattiva modalità Focus + + + + Close the document + Chiudi il documento + + + + GuiDocEditSearch + + + + Search + Cerca + + + + Replace + Sostituisci + + + + Case Sensitive + Considera maiuscole/minuscole + + + + Whole Words Only + Solo parole intere + + + + RegEx Mode + Modalità RegEx + + + + Loop Search + Ricerca a ciclo continuo + + + + Search Next File + Cerca nel file successivo + + + + Preserve Case + Non considerare maiuscole/minuscole + + + + Close Search + Chiudi ricerca + + + + Find in current document + Trova nel documento corrente + + + + Find and replace in current document + Trova e sostituisci nel documento corrente + + + + GuiDocEditor + + + The document you are trying to open is too big. The document size is {0} MB. The maximum size allowed is {1} MB. + Il documento che stai cercando di aprire è troppo grande. La dimensione del documento è {0} MB. La dimensione massima consentita è {1} MB. + + + + Opened Document: {0} + Documento aperto: {0} + + + + The text you are trying to add is too big. The text size is {0} MB. The maximum size allowed is {1} MB. + Il testo che stai cercando di aggiungere è troppo grande. La dimensione del testo è {0} MB. La dimensione massima consentita è {1} MB. + + + + File Changed on Disk + File modificato sul disco + + + + This document has been changed outside of novelWriter while it was open. Overwrite the file on disk? + Questo documento è stato cambiato al di fuori di novelWriter mentre era aperto. Sovrascrivere il file su disco? + + + + Could not save document. + Impossibile salvare il documento. + + + + Saved Document: {0} + Documento salvato: {0} + + + + Spell checking requires the package PyEnchant. It does not appear to be installed. + Il controllo ortografico richiede il pacchetto PyEnchant. Non sembra essere installato. + + + + Spell check complete + Controllo ortografico completo + + + + File Location + Posizione del file + + + + The currently open file is saved in: + Il file attualmente aperto è salvato in: + + + + The document has grown too big and you cannot add more text to it. The maximum size of a single novelWriter document is {0} MB. + Il documento è diventato troppo grande e non puoi aggiungere altro testo. La dimensione massima di un singolo documento di novelWriter è {0} MB. + + + + Follow Tag + Segui i Tag + + + + Cut + Taglia + + + + Copy + Copia + + + + Paste + Incolla + + + + Select All + Seleziona tutto + + + + Select Word + Seleziona parola + + + + Select Paragraph + Seleziona paragrafo + + + + Spelling Suggestion(s) + Suggerimento(i) ortografico(i) + + + + No Suggestions + Nessun suggerimento + + + + Add Word to Dictionary + Aggiungi parola al dizionario + + + + Please select some text before calling replace quotes. + Per favore seleziona del testo prima di chiedere il cambio di virgolette. + + + + GuiDocMerge + + + Merge Documents + Unisci i documenti + + + + Documents to Merge + Documenti da unire + + + + Drag and drop items to change the order, or uncheck to exclude. + Trascina e rilascia gli elementi per cambiare l'ordine, o deseleziona per escludere. + + + + Move merged items to Trash + Sposta gli elementi uniti nel cestino + + + + GuiDocSplit + + + Split Document + Dividi il documento + + + + Document Headers + Intestazioni del documento + + + + Select the maximum level to split into files. + Seleziona il livello massimo da dividere in file separati. + + + + Split on Header Level 1 (Title) + Dividi sul livello d'intestazione 1 (Titolo) + + + + Split up to Header Level 2 (Chapter) + Dividi sul livello d'intestazione 2 (Capitolo) + + + + Split up to Header Level 3 (Scene) + Dividi sul livello d'intestazione 3 (Scena) + + + + Split up to Header Level 4 (Section) + Dividi sul livello d'intestazione 4 (Sezione) + + + + Split into a new folder + Dividi in una nuova cartella + + + + Create document hierarchy + Crea gerarchia dei documenti + + + + Move split document to Trash + Sposta il documento diviso nel cestino + + + + GuiDocViewFooter + + + Show/hide the references panel + Mostra/nascondi il pannello dei riferimenti + + + + Activate to freeze the content of the references panel when changing document + Attiva per bloccare il contenuto del pannello dei riferimenti quando si cambia il documento + + + + Show comments + Visualizza commenti + + + + Show synopsis comments + Mostra i commenti relativi alla sinossi + + + + References + Riferimenti + + + + Sticky + Post-it + + + + Comments + Commenti + + + + Synopsis + Sinossi + + + + GuiDocViewHeader + + + Go backward + Muovi indietro + + + + Go forward + Muovi avanti + + + + Reload the document + Ricarica il documento + + + + Close the document + Chiudi il documento + + + + GuiDocViewer + + + An error occurred while generating the preview. + Si è verificato un errore durante la generazione dell'anteprima. + + + + Copy + Copia + + + + Select All + Seleziona tutto + + + + Select Word + Seleziona parola + + + + Select Paragraph + Seleziona paragrafo + + + + GuiEditLabel + + + Item Label + Etichetta dell'elemento + + + + Label + Etichetta + + + + GuiItemDetails + + + Label + Etichetta + + + + Status + Stato + + + + Class + Classe + + + + Usage + Utilizzo + + + + Characters + Caratteri + + + + Words + Parole + + + + Paragraphs + Paragrafi + + + + GuiLipsum + + + Insert Placeholder Text + Inserisci testo segnaposto + + + + Insert Lorem Ipsum Text + Inserisci testo Lorem Ipsum + + + + Number of paragraphs + Numero dei paragrafi + + + + Randomise order + Ordine casuale + + + + Insert + Inserisci + + + + GuiMain + + + You are running an untested development version of novelWriter. Please be careful when working on a live project and make sure you take regular backups. + Stai eseguendo una versione di sviluppo non testata di novelWriter. Fai attenzione quando lavori su un progetto live e assicurati di eseguire dei backup regolari. + + + + novelWriter is ready ... + novelWriter è pronto... + + + + Cannot create a new project when another project is open. + Impossibile creare un nuovo progetto quando un altro progetto è aperto. + + + + A project already exists in that location. Please choose another folder. + Un progetto esiste già in quella posizione. Si prega di scegliere un'altra cartella. + + + + Close Project + Chiudi progetto + + + + Close the current project? + Chiudere il progetto attuale? + + + + + Changes are saved automatically. + Le modifiche vengono salvate automaticamente. + + + + Backup Project + Backup del progetto + + + + Backup the current project? + Eseguire il backup del progetto corrente? + + + + The project was locked by the computer '{0}' ({1} {2}), last active on {3}. + Il progetto è stato bloccato dal computer '{0}' ({1} {2}), ultimo attivo su {3}. + + + + Project Locked + Progetto bloccato + + + + The project is already open by another instance of novelWriter, and is therefore locked. Override lock and continue anyway? + Il progetto è già aperto da un'altra istanza di novelWriter, ed è quindi bloccato. Scavalcare il blocco e continuare comunque? + + + + Note: If the program or the computer previously crashed, the lock can safely be overridden. However, overriding it is not recommended if the project is open in another instance of novelWriter. Doing so may corrupt the project. + Nota: Se il programma o il computer in precedenza si è bloccato, il blocco può essere superato in modo sicuro. Tuttavia, non è consigliabile sovrascrivere se il progetto è aperto in un'altra istanza di novelWriter. Facendolo si potrebbe danneggiare il progetto. + + + + The project index is outdated or broken. Rebuilding index. + L'indice del progetto è obsoleto o rotto. Ricostruzione dell'indice. + + + + Text files ({0}) + File di testo ({0}) + + + + Markdown files ({0}) + File Markdown ({0}) + + + + novelWriter files ({0}) + file di novelWriter ({0}) + + + + All files ({0}) + Tutti i file ({0}) + + + + Import File + Importa file + + + + Could not read file. The file must be an existing text file. + Impossibile leggere il file. Il file deve essere un file di testo esistente. + + + + Please open a document to import the text file into. + Si prega di aprire un documento in cui importare il file di testo. + + + + Import Document + Importa documento + + + + Importing the file will overwrite the current content of the document. Do you want to proceed? + L'importazione del file sovrascriverà il contenuto corrente del documento. Vuoi procedere? + + + + Indexing completed in {0} ms + Indicizzazione completata in {0} ms + + + + The project index has been successfully rebuilt. + L'indice del progetto è stato ricostruito con successo. + + + + Some changes will not be applied until novelWriter has been restarted. + Alcune modifiche non saranno applicate fino al riavvio di novelWriter. + + + + Information + Informazioni + + + + Warning + Attenzione + + + + Error + Errore + + + + This is a bug! + Questo è un bug! + + + + Internal Error + Errore interno + + + + Exit + Esci + + + + Do you want to exit novelWriter? + Vuoi uscire da novelWriter? + + + + Could not find the reference for tag '{0}'. It either doesn't exist, or the index is out of date. The index can be updated from the Tools menu, or by pressing {1}. + Impossibile trovare il riferimento per il tag '{0}'. O non esiste, o l'indice è obsoleto. L'indice può essere aggiornato dal menu Strumenti, o premendo {1}. + + + + GuiMainMenu + + + &Project + &Progetto + + + + New Project + Nuovo progetto + + + + Open Project + Apri progetto + + + + Save Project + Salva progetto + + + + Close Project + Chiudi progetto + + + + Project Settings + Impostazioni del progetto + + + + Project Details + Dettagli del progetto + + + + Rename Item + Rinomina l'elemento + + + + Delete Item + Elimina l'elemento + + + + Empty Trash + Svuota il cestino + + + + Exit + Esci + + + + &Document + &Documento + + + + Open Document + Apri documento + + + + Save Document + Salva documento + + + + Close Document + Chiudi documento + + + + View Document + Visualizza documento + + + + Close Document View + Chiudi visualizzazione documento + + + + Show File Details + Mostra dettagli del file + + + + Import Text from File + Importa testo da file + + + + &Edit + &Modifica + + + + Undo + Annulla + + + + Redo + Ripristina + + + + Cut + Taglia + + + + Copy + Copia + + + + Paste + Incolla + + + + Select All + Seleziona tutto + + + + Select Paragraph + Seleziona paragrafo + + + + &View + &Visualizza + + + + Go to Project Tree + Vai all'albero del progetto + + + + Go to Document Editor + Vai all'editor dei documenti + + + + Go to Document Viewer + Vai al visualizzatore documenti + + + + Go to Outline + Vai allo schema riassuntivo + + + + Navigate Backward + Naviga indietro + + + + Navigate Forward + Naviga avanti + + + + Focus Mode + Modalità Focus + + + + Full Screen Mode + Modalità a schermo intero + + + + &Insert + &Inserisci + + + + Dashes + Trattini + + + + Short Dash + Trattino breve + + + + Long Dash + Trattino lungo + + + + Horizontal Bar + Barra orizzontale + + + + Figure Dash + Simbolo 'Tilde' + + + + Quote Marks + Marcatori di citazione + + + + Left Single Quote + Virgoletta singola a sinistra + + + + Right Single Quote + Virgoletta singola a destra + + + + Left Double Quote + Virgolette doppie a sinistra + + + + Right Double Quote + Virgolette doppie a destra + + + + Alternative Apostrophe + Apostrofo alternativo + + + + General Punctuation + Punteggiatura generica + + + + Ellipsis + Ellisse + + + + Prime + Apostrofo + + + + Double Prime + Doppie virgolette + + + + White Spaces + Spazi bianchi + + + + Non-Breaking Space + Spaziatura larga + + + + Thin Space + Spaziatura sottile + + + + Thin Non-Breaking Space + Spaziatura media + + + + Other Symbols + Altri simboli + + + + List Bullet + Elenco puntato + + + + Hyphen Bullet + Elenco listato + + + + Flower Mark + Asterisco a forma di fiore + + + + Per Mille + Per mille + + + + Degree Symbol + Simbolo di grado + + + + Minus Sign + Segno meno + + + + Times Sign + Segno di moltiplicazione + + + + Division Sign + Segno di divisione + + + + Tags and References + Etichette e riferimenti + + + + Special Comments + Commenti speciali + + + + Synopsis Comment + Commenti relativi alla sinossi + + + + Page Break and Space + Interruzioni di pagina e spaziature + + + + Page Break + Interruzione di pagina + + + + Vertical Space (Single) + Spazio verticale (Singolo) + + + + Vertical Space (Multi) + Spazio verticale (Multiplo) + + + + Placeholder Text + Testo segnaposto + + + + &Format + &Formato + + + + Emphasis + Corsivo + + + + Strong Emphasis + Grassetto + + + + Strikethrough + Barrato + + + + Wrap Double Quotes + Doppie virgolette automatiche + + + + Wrap Single Quotes + Singole virgolette automatiche + + + + Header 1 (Partition) + Titolo 1 (Partizione) + + + + Header 2 (Chapter) + Titolo 2 (Capitolo) + + + + Header 3 (Scene) + Titolo 3 (Scena) + + + + Header 4 (Section) + Titolo 4 (Sezione) + + + + Novel Title + Titolo del romanzo + + + + Unnumbered Chapter + Capitolo non numerato + + + + Align Left + Allineamento a sinistra + + + + Align Centre + Centrato + + + + Align Right + Allineamento a destra + + + + Indent Left + Rientro a sinistra + + + + Indent Right + Rientro a destra + + + + Toggle Comment + Attiva/Disattiva commento + + + + Remove Block Format + Rimuovi il formato blocco + + + + Convert Single Quotes + Converti in virgolette singole + + + + Convert Double Quotes + Converti in virgolette doppie + + + + Remove In-Paragraph Breaks + Rimuovi le interruzioni di paragrafo + + + + &Search + &Cerca + + + + Find + Trova + + + + Replace + Sostituisci + + + + Find Next + Trova successivo + + + + Find Previous + Trova precedente + + + + Replace Next + Sostituisci successivo + + + + &Tools + &Strumenti + + + + Check Spelling + Controllo ortografico + + + + Re-Run Spell Check + Riavvia il controllo ortografico + + + + Project Word List + Elenco delle parole del progetto + + + + Rebuild Index + Ricostruisci l'indice + + + + Backup Project + Crea una copia di backup + + + + Build Novel Project + Costruisci il progetto del romanzo + + + + Writing Statistics + Statistiche di scrittura + + + + Preferences + Preferenze + + + + &Help + &Aiuto + + + + About novelWriter + A proposito di novelWriter + + + + About Qt5 + A proposito di Qt5 + + + + User Manual (Online) + Manuale utente (Online) + + + + User Manual (PDF) + Manuale utente (PDF) + + + + Report an Issue (GitHub) + Segnala un problema (GitHub) + + + + Ask a Question (GitHub) + Fai una domanda (GitHub) + + + + The novelWriter Website + Il sito web di novelWriter + + + + Check for New Release + Controlla per aggiornamenti + + + + GuiMainStatus + + + + None + Nessuno + + + + Editor + Editor + + + + Project + Progetto + + + + Session Time + Durata della sessione + + + + Words: {0} ({1}) + Parole: {0} ({1}) + + + + Project word count (session change) + Conteggio parole del progetto (modifica sessione) + + + + Novel word count (session change) + Conteggio parole del romanzo (modifica sessione) + + + + GuiNovelToolBar + + + Outline of {0} + Schema di {0} + + + + Novel Root + Radice del romanzo + + + + Refresh + Aggiorna + + + + Last Column + Ultima colonna + + + + Hidden + Nascosto + + + + Point of View Character + Personaggio con punto di vista + + + + Focus Character + Personaggio oggetto del focus + + + + Novel Plot + Trama del romanzo + + + + + Column Size + Dimensione della colonna + + + + More Options + Altre opzioni + + + + Maximum column size in % + Dimensione massima della colonna in % + + + + GuiNovelTree + + + No meta data + Nessun metadato + + + + GuiOutlineDetails + + + + + + Title + Titolo + + + + Chapter + Capitolo + + + + Scene + Scena + + + + Section + Sezione + + + + Document + Documento + + + + Status + Stato + + + + Characters + Caratteri + + + + Words + Parole + + + + Paragraphs + Paragrafi + + + + Synopsis + Sinossi + + + + Title Details + Dettagli Titolo + + + + Reference Tags + Riferimenti + + + + GuiOutlineHeaderMenu + + + Select Columns + Seleziona colonne + + + + GuiOutlineToolBar + + + Outline of + Struttura di + + + + Refresh + Aggiorna + + + + GuiPreferences + + + Preferences + Preferenze + + + + General + Generale + + + + Projects + Progetti + + + + Documents + Documenti + + + + Editor + Editor + + + + Highlighting + Evidenziazione + + + + Automation + Automatismi + + + + Quotes + Citazioni + + + + GuiPreferencesAutomation + + + Automatic Features + Funzionalità automatiche + + + + Auto-select word under cursor + Seleziona automaticamente la parola sotto il cursore + + + + Apply formatting to word under cursor if no selection is made. + Applica la formattazione alla parola sotto il cursore se non viene effettuata alcuna selezione. + + + + Auto-replace text as you type + Sostituisci automaticamente il testo mentre digiti + + + + Allow the editor to replace symbols as you type. + Consenti all'editor di sostituire i simboli durante la digitazione. + + + + Replace as You Type + Sostituisci mentre scrivi + + + + Auto-replace single quotes + Sostituisci automaticamente le virgolette singole + + + + + Try to guess which is an opening or a closing quote. + Prova a indovinare quale sia l'inizio o la fine di una citazione. + + + + Auto-replace double quotes + Sostituisci automaticamente le virgolette doppie + + + + Auto-replace dashes + Sostituisci automaticamente i trattini + + + + Double and triple hyphens become short and long dashes. + I trattini doppi e tripli diventano brevi e lunghi trattini. + + + + Auto-replace dots + Sostituisci automaticamente i puntini + + + + Three consecutive dots become ellipsis. + Tre punti consecutivi diventano puntini di sospensione. + + + + Automatic Padding + Riempimenti automatici + + + + Insert non-breaking space before + Inserisci uno spazio prima di + + + + Automatically add space before any of these symbols. + Aggiungi automaticamente spazio prima di uno di questi simboli. + + + + Insert non-breaking space after + Inserisci uno spazio dopo di + + + + Automatically add space after any of these symbols. + Aggiungi automaticamente spazio dopo uno di questi simboli. + + + + Use thin space instead + Usa invece uno spazio sottile + + + + Inserts a thin space instead of a regular space. + Inserisce uno spazio sottile invece di uno spazio regolare. + + + + GuiPreferencesDocuments + + + Text Style + Stile del testo + + + + Font family + Famiglia carattere + + + + + + + Applies to both document editor and viewer. + Si applica sia all'editor di documenti che al visualizzatore. + + + + Font size + Dimensione carattere + + + + pt + pt + + + + Text Flow + Flusso del testo + + + + Maximum text width in "Normal Mode" + Larghezza massima del testo in "Modalità normale" + + + + Set to 0 to disable this feature. + Impostare a 0 per disabilitare questa funzione. + + + + + + + px + px + + + + Maximum text width in "Focus Mode" + Larghezza massima del testo in "Modalità Focus" + + + + The maximum width cannot be disabled. + La larghezza massima non può essere disabilitata. + + + + Hide document footer in "Focus Mode" + Nascondi piè di pagina del documento in "Modalità Focus" + + + + Hide the information bar in the document editor. + Nascondi la barra delle informazioni nell'editor dei documenti. + + + + Justify the text margins + Giustifica i margini del testo + + + + Minimum text margin + Dimensione minima del margine del testo + + + + Tab width + Larghezza di tabulazione + + + + The width of a tab key press in the editor and viewer. + La larghezza ottenibile con una pressione sul tasto TAB nell'editor e nel visualizzatore. + + + + GuiPreferencesEditor + + + Spell Checking + Controllo ortografico + + + + None + Nessuno + + + + Not installed + Non installato + + + + Spell check language + Lingua per il controllo ortografico + + + + Available languages are determined by your system. + Le lingue disponibili sono determinate dal tuo sistema. + + + + Big document limit + Dimensione massima del documento + + + + Full spell checking is disabled above this limit. + Il controllo ortografico completo è disabilitato al di sopra di questo limite. + + + + kB + kB + + + + Word Count + Conteggio delle parole + + + + Word count interval + Intervallo di conteggio delle parole + + + + seconds + secondi + + + + Include project notes in status bar word count + Includi le note del progetto nel conteggio delle parole della barra di stato + + + + Writing Guides + Guide di scrittura + + + + Show tabs and spaces + Mostra tabulazioni e spazi + + + + Show line endings + Mostra terminazioni di riga + + + + Scroll Behaviour + Comportamento di scorrimento + + + + Scroll past end of the document + Scorri alla fine del documento + + + + Set to 0 to disable this feature. + Impostare a 0 per disabilitare questa funzione. + + + + lines + righe + + + + Typewriter style scrolling when you type + Scorrimento stile macchina da scrivere quando si digita + + + + Keeps the cursor at a fixed vertical position. + Mantiene il cursore in posizione verticale fissa. + + + + Minimum position for Typewriter scrolling + Posizione minima per lo scorrimento della macchina da scrivere + + + + Percentage of the editor height from the top. + Percentuale dell'altezza dell'editor dall'alto. + + + + GuiPreferencesGeneral + + + Look and Feel + Personalizza l'aspetto + + + + Main GUI language + Lingua principale + + + + + + Requires restart to take effect. + Richiede il riavvio per avere effetto. + + + + Main GUI theme + Tema principale dell'interfaccia + + + + General colour theme and icons. + Colore del tema generale e delle icone. + + + + Editor theme + Tema dell'editor + + + + Colour theme for the editor and viewer. + Colore del tema per l'editor ed il visualizzatore. + + + + Font family + Famiglia carattere + + + + Font size + Dimensione carattere + + + + pt + pt + + + + GUI Settings + Impostazioni della GUI + + + + Emphasise partition and chapter labels + Sottolineare le etichette delle partizioni e dei capitoli + + + + Makes them stand out in the project tree. + Li fa risaltare nell'albero del progetto. + + + + Show full path in document header + Mostra il percorso completo nell'intestazione del documento + + + + Add the parent folder names to the header. + Aggiunge i nomi delle cartelle di livello superiore all'intestazione. + + + + Hide vertical scroll bars in main windows + Nascondi le barre di scorrimento verticali nelle finestre principali + + + + + Scrolling available with mouse wheel and keys only. + Scorrimento disponibile solo con la rotellina del mouse e i tasti. + + + + Hide horizontal scroll bars in main windows + Nascondi le barre di scorrimento orizzontali nelle finestre principali + + + + GuiPreferencesProjects + + + Automatic Save + Salvataggio automatico + + + + Save document interval + Intervallo di salvataggio del documento + + + + How often the document is automatically saved. + Quante volte il documento viene salvato automaticamente. + + + + + seconds + secondi + + + + Save project interval + Intervallo di salvataggio del progetto + + + + How often the project is automatically saved. + Quante volte il progetto viene salvato automaticamente. + + + + Project Backup + Backup del progetto + + + + Browse + Sfoglia + + + + Backup storage location + Posizione di archiviazione del backup + + + + + Path: {0} + Percorso: {0} + + + + Run backup when the project is closed + Esegui il backup quando il progetto è chiuso + + + + Can be overridden for individual projects in Project Settings. + Può essere sovrascritto per singoli progetti nelle Impostazioni del progetto. + + + + Ask before running backup + Chiedi prima di eseguire il backup + + + + If off, backups will run in the background. + Se disattivato, i backup verranno eseguiti in background. + + + + Session Timer + Timer della sessione + + + + Pause the session timer when not writing + Metti in pausa il timer di sessione quando non si scrive + + + + Also pauses when the application window does not have focus. + Inoltre si interrompe quando la finestra dell'applicazione non ha focus. + + + + Editor inactive time before pausing timer + Tempo d'inattività dell'editor prima di mettere in pausa il timer + + + + User activity includes typing and changing the content. + L'attività dell'utente include la digitazione e la modifica del contenuto. + + + + minutes + minuti + + + + Backup Directory + Percorso di backup + + + + GuiPreferencesQuotes + + + Quotation Style + Stile delle citazioni + + + + Single quote open style + Singola virgoletta aperta + + + + The symbol to use for a leading single quote. + Il simbolo da usare per una singola virgoletta iniziale. + + + + Single quote close style + Singola virgoletta chiusa + + + + The symbol to use for a trailing single quote. + Il simbolo da usare per una singola virgoletta finale. + + + + Double quote open style + Doppie virgolette aperte + + + + The symbol to use for a leading double quote. + Il simbolo da usare per avere doppie virgolette iniziali. + + + + Double quote close style + Doppie virgolette chiuse + + + + The symbol to use for a trailing double quote. + Il simbolo da usare per avere doppie virgolette finali. + + + + GuiPreferencesSyntax + + + Quotes & Dialogue + Citazioni & Dialoghi + + + + Highlight text wrapped in quotes + Evidenzia il testo racchiuso tra virgolette + + + + + + Applies to the document editor only. + Si applica solo all'editor dei documenti. + + + + Allow open-ended single quotes + Consenti di aprire e chiudere le singole virgolette + + + + Highlight single-quoted line with no closing quote. + Evidenzia la riga con virgoletta singola senza virgoletta di chiusura. + + + + Allow open-ended double quotes + Consenti di aprire e chiudere le doppie virgolette + + + + Highlight double-quoted line with no closing quote. + Evidenzia la riga con virgolette doppie senza virgolette di chiusura. + + + + Text Emphasis + Enfasi sul testo + + + + Add highlight colour to emphasised text + Aggiungi un colore per evidenziare ed enfatizzare il testo + + + + Text Errors + Errori di testo + + + + Highlight multiple or trailing spaces + Evidenzia spazi multipli o finali + + + + GuiProjectDetails + + + Project Details + Dettagli del progetto + + + + Overview + Panoramica + + + + Contents + Contenuti + + + + GuiProjectDetailsContents + + + Table of Contents + Tavola dei contenuti + + + + Title + Titolo + + + + Words + Parole + + + + Pages + Pagine + + + + Page + Pagina + + + + Progress + Avanzamento + + + + Typical word count for a 5 by 8 inch book page with 11 pt font is 350. + Il tipico conteggio delle parole per una pagina dil libro da 5 x 8 pollici con carattere 11 pt è 350. + + + + Start counting page numbers from this page. + Inizia il conteggio dei numeri di pagina da questa pagina. + + + + Assume a new chapter or partition always start on an odd numbered page. + Si suppone che un nuovo capitolo o partizione inizi sempre su una pagina con numero dispari. + + + + Words per page + Parole per pagina + + + + Count pages from + Conta le pagine da + + + + Clear double pages + Cancella le pagine doppie + + + + END + FINE + + + + Untitled + Senza titolo + + + + GuiProjectDetailsMain + + + Words + Parole + + + + Chapters + Capitoli + + + + Scenes + Scene + + + + Revisions + Revisioni + + + + Editing Time + Tempo di lavorazione + + + + Path + Percorso + + + + Project: {0} + Progetto: {0} + + + + By {0} + Scritto da {0} + + + + GuiProjectEditMain + + + Project Settings + Impostazioni del progetto + + + + Project name + Nome del progetto + + + + Should be set only once. + Dovrebbe essere impostato una sola volta. + + + + Novel title + Titolo del romanzo + + + + + Change whenever you want! + Cambia quando vuoi! + + + + Author(s) + Autore(i) + + + + Default + Predefinito + + + + Spell check language + Lingua controllo ortografico + + + + + Overrides main preferences. + Sovrascrive le preferenze principali. + + + + No backup on close + Nessun backup alla chiusura + + + + GuiProjectEditReplace + + + Text Replace List for Preview and Export + Elenco di sostituzione del testo per anteprima ed esportazione + + + + Keyword + Parola chiave + + + + Replace With + Sostituisci con + + + + Select item to edit + Seleziona e modifica + + + + Save + Salva + + + + GuiProjectEditStatus + + + Novel File Status Levels + Livelli di avanzamento dei file del romanzo + + + + Note File Importance Levels + Livelli di importanza dei file delle note + + + + Label + Etichetta + + + + Usage + Utilizzo + + + + Select item to edit + Seleziona e modifica + + + + Colour + Colore + + + + Save + Salva + + + + Select Colour + Seleziona colore + + + + New Item + Nuovo elemento + + + + Cannot delete a status item that is in use. + Impossibile eliminare un elemento di stato in uso. + + + + Not in use + Non utilizzato + + + + Used once + Usato una volta + + + + Used by {0} items + Usato da {0} elementi + + + + GuiProjectLoad + + + + Open Project + Apri progetto + + + + Working Title + Titolo provvisorio + + + + Words + Parole + + + + Last Opened + Ultimo file aperto + + + + Recently Opened Projects + Progetti aperti di recente + + + + Path + Percorso + + + + New + Nuovo + + + + Remove + Rimuovi + + + + novelWriter Project File ({0}) + File di progetto di novelWriter ({0}) + + + + All files ({0}) + Tutti i file ({0}) + + + + Remove Entry + Rimuovi voce + + + + Remove '{0}' from the recent projects list? The project files will not be deleted. + Rimuovere '{0}' dalla lista dei progetti recenti? I file del progetto non verranno eliminati. + + + + GuiProjectSettings + + + Project Settings + Impostazioni del progetto + + + + Settings + Impostazioni + + + + Status + Stato + + + + Importance + Importanza + + + + Auto-Replace + Auto - sostituisci + + + + GuiProjectToolBar + + + Project Content + Contenuto del progetto + + + + Quick Links + Collegamenti rapidi + + + + Move Up + Sposta su + + + + Move Down + Sposta giù + + + + Add Item + Aggiungi elemento + + + + Expand All + Espandi tutto + + + + Collapse All + Collassa tutto + + + + Undo Move + Annulla azione + + + + Empty Trash + Svuota il cestino + + + + More Options + Altre opzioni + + + + GuiProjectTree + + + Active + Attivo + + + + Inactive + Inattivo + + + + Did not find anywhere to add the file or folder! + Non è stato trovato alcun posto dove aggiungere il file o la cartella! + + + + Cannot add new files or folders to the Trash folder. + Impossibile aggiungere nuovi file o cartelle alla cartella Cestino. + + + + New Note + Nuova nota + + + + New Chapter + Nuovo capitolo + + + + New Scene + Nuova scena + + + + New Document + Nuovo documento + + + + New Folder + Nuova cartella + + + + There is currently no Trash folder in this project. + Al momento non c'è una cartella Cestino in questo progetto. + + + + The Trash folder is already empty. + La cartella Cestino è già vuota. + + + + + Empty Trash + Svuota il cestino + + + + Permanently delete {0} file(s) from Trash? + Eliminare definitivamente {0} file(s) dal cestino? + + + + + Delete + Elimina + + + + Move '{0}' to Trash? + Spostare '{0}' nel Cestino? + + + + Root folders can only be deleted when they are empty. + Le cartelle radice possono essere eliminate solo quando sono vuote. + + + + Permanently delete '{0}'? + Eliminare definitivamente '{0}'? + + + + Open Document + Apri documento + + + + View Document + Visualizza documento + + + + Change Label + Cambia etichetta + + + + Toggle Active + Attiva/Disattiva + + + + Set Status to ... + Imposta lo stato a ... + + + + Set Importance to ... + Imposta importanza a ... + + + + Transform + Trasforma + + + + + + + Convert to {0} + Converti in {0} + + + + Merge Child Items into Self + Fondi elementi figli + + + + Merge Child Items into New + Fondi elementi figli in uno nuovo + + + + Merge Documents in Folder + Fondi i documenti nella cartella + + + + Split Document by Headers + Dividi il documento per intestazioni + + + + Expand All + Espandi tutto + + + + Collapse All + Collassa tutto + + + + Delete Permanently + Elimina definitivamente + + + + Move to Trash + Sposta nel Cestino + + + + Convert Folder + Converti la cartella + + + + Do you want to convert the folder to a {0}? This action cannot be reversed. + Vuoi convertire la cartella in un {0}? Questa azione non può essere annullata. + + + + No documents selected for merging. + Nessun documento selezionato per la fusione. + + + + Merged + Uniti + + + + + Could not write document content. + Impossibile scrivere il contenuto del documento. + + + + + There is nowhere to add item with name '{0}'. + Non c'è nessun posto dove aggiungere un elemento con il nome '{0}. + + + + GuiSideBar + + + Project + Progetto + + + + Project Tree View + Vista ad albero del progetto + + + + Novel + Romanzo + + + + Novel Tree View + Vista ad albero del romanzo + + + + Outline + Struttura + + + + Novel Outline View + Vista della struttura del romanzo + + + + Build + Compila + + + + Build Novel Project + Compila il progetto del romanzo + + + + Details + Dettagli + + + + Project Details + Dettagli del progetto + + + + Stats + Statistiche + + + + Writing Statistics + Statistiche di scrittura + + + + Settings + Opzioni + + + + GuiUpdates + + + Check for Updates + Controlla aggiornamenti + + + + Current Release + Versione attuale + + + + + novelWriter {0} released on {1} + novelWriter {0} rilasciato il {1} + + + + Latest Release + Ultima versione + + + + Checking ... + Controllo in corso... + + + + Download: {0} + Scaricamento: {0} + + + + GuiWordList + + + + Project Word List + Elenco delle parole del progetto + + + + Cannot add a blank word. + Impossibile aggiungere una parola vuota. + + + + The word '{0}' is already in the word list. + La parola '{0}' è già nella lista delle parole. + + + + GuiWritingStats + + + Writing Statistics + Statistiche di scrittura + + + + Session Start + Avvii di sessione + + + + Length + Durata + + + + Idle + Inattività + + + + Words + Parole + + + + Histogram + Istogramma + + + + Sum Totals + Totalizzazioni + + + + Total Time: + Tempo totale: + + + + Idle Time: + Tempo d'inattività: + + + + Filtered Time: + Tempo filtrato: + + + + Novel Word Count: + Conteggio parole del romanzo: + + + + Notes Word Count: + Conteggio parole delle note: + + + + Total Word Count: + Conteggio parole totali: + + + + Filters + Filtri + + + + Count novel files + Conteggio file del romanzo + + + + Count note files + Conteggio file delle note + + + + Hide zero word count + Nascondi il conteggio parole se a zero + + + + Hide negative word count + Nascondi il conteggio parole se negativo + + + + Group entries by day + Raggruppa le voci per giorno + + + + Show idle time + Mostra tempo d'inattività + + + + Word count cap for the histogram + Max n° di parole per l'istogramma + + + + Save As + Salva come + + + + JSON Data File (.json) + File di dati JSON (.json) + + + + CSV Data File (.csv) + File di dati CSV (.csv) + + + + JSON Data File + File di dati JSON + + + + CSV Data File + File di dati CSV + + + + Save Data As + Salva dati come + + + + {0} file successfully written to: + {0} file scritto correttamente in: + + + + Failed to write {0} file. + Scrittura file {0} non riuscita. + + + + Failed to read session log file. + Impossibile leggere il file di log della sessione. + + + + NWProject + + + Could not delete document file. + Impossibile eliminare il file del documento. + + + + Could not open project with path: {0} + Impossibile aprire il progetto con il percorso: {0} + + + + Unknown + Sconosciuto + + + + Project file does not appear to be a novelWriterXML file. + Il file del progetto non sembra essere un file novelWriterXML. + + + + Unknown or unsupported novelWriter project file format. The project cannot be opened by this version of novelWriter. The file was saved with novelWriter version {0}. + Formato file di progetto di novelWriter sconosciuto o non supportato. Il progetto non può essere aperto da questa versione di novelWriter. Il file è stato salvato con la versione {0} di novelWriter. + + + + Failed to parse project xml. + Impossibile analizzare il progetto xml. + + + + File Version + Versione del file + + + + The file format of your project is about to be updated. If you proceed, older versions of novelWriter will no longer be able to open this project. Continue? + Il formato del file del tuo progetto sta per essere aggiornato. Scegliendo di procedere, le versioni più vecchie di novelWriter non saranno più in grado di aprire questo progetto. Continuare? + + + + Version Conflict + Conflitto di versione + + + + This project was saved by a newer version of novelWriter, version {0}. This is version {1}. If you continue to open the project, some attributes and settings may not be preserved, but the overall project should be fine. Continue opening the project? + Questo progetto è stato salvato da una versione più recente di novelWriter, versione {0}. Questa è la versione {1}. Se si continua ad aprire il progetto, alcuni attributi e impostazioni potrebbero non essere preservati, ma il progetto complessivo dovrebbe andare bene. Continuare ad aprire il progetto? + + + + Opened Project: {0} + Progetto aperto: {0} + + + + There is no project open. + Non c'è nessun progetto aperto. + + + + Failed to save project. + Salvataggio del progetto non riuscito. + + + + Saved Project: {0} + Progetto salvato: {0} + + + + Backing up project ... + Crea una copia di backup ... + + + + Cannot backup project because no valid backup path is set. Please set a valid backup location in Preferences. + Impossibile eseguire il backup del progetto perché non è stato impostato alcun percorso di backup valido. Impostare una posizione di backup valida nelle Preferenze. + + + + Cannot backup project because no project name is set. Please set a Project Name in Project Settings. + Impossibile eseguire il backup del progetto perché nessun nome del progetto è impostato. Si prega di impostare un nome del progetto nelle impostazioni del progetto. + + + + Could not create backup folder. + Impossibile creare la cartella di backup. + + + + Backup from {0} + Backup da {0} + + + + Backup archive file written to: {0} + Archivio di backup del file scritto su: {0} + + + + Could not write backup archive. + Impossibile scrivere l'archivio di backup. + + + + Project backed up to '{0}' + Eseguito il backup del progetto su '{0}' + + + + + New + Nuovo + + + + Note + Nota + + + + Draft + Bozza + + + + Finished + Finito + + + + Minor + Minore + + + + Major + Maggiore + + + + Main + Principale + + + + Found {0} orphaned file(s) in project folder. + Trovato {0} file(s) orfani nella cartella del progetto. + + + + Recovered + Ripristinato + + + + [{0}] {1} + [{0}] {1} + + + + Recovered File {0} + Ripristinato il file {0} + + + + One or more orphaned files could not be added back into the project. Make sure at least a Novel root folder exists. + Uno o più file orfani non possono essere aggiunti di nuovo al progetto. Assicurati che esista almeno una cartella radice del romanzo. + + + + NovelSelector + + + All Novel Folders + Tutte le cartelle del romanzo + + + + ProjWizardCustomPage + + + Custom Project Options + Opzioni del progetto personalizzate + + + + Select which additional elements to populate the project with. You can skip making chapters and add only scenes by setting the number of chapters to 0. + Seleziona gli elementi aggiuntivi con cui allestire il progetto. È possibile saltare i capitoli e aggiungere solo scene impostando il numero di capitoli a 0. + + + + Add a folder for plot notes + Aggiungi una cartella per le note sulla trama + + + + Add a folder for character notes + Aggiunge una cartella per le note sui personaggi + + + + Add a folder for location notes + Aggiungi una cartella per le note sulle località + + + + Add example notes to the above + Aggiungi note di esempio alle precedenti + + + + Add chapters to the novel folder + Aggiungi capitoli alla cartella romanzo + + + + Add scenes to each chapter + Aggiungi scene ad ogni capitolo + + + + ProjWizardFinalPage + + + Summary + Riepilogo + + + + Project Name: {0} + Nome del progetto: {0} + + + + Project Path: {0} + Percorso del progetto: {0} + + + + Fill the project with a minimal set of items + Riempi il progetto con un insieme minimo di elementi + + + + Fill the project with example files + Riempi il progetto con file di esempio + + + + Add a folder for plot notes + Aggiunta una cartella per le note sulla trama + + + + Add a folder for character notes + Aggiunta una cartella per le note sui personaggi + + + + Add a folder for location notes + Aggiunta una cartella per le note sulle località + + + + Add example notes to the above + Aggiunte note di esempio alle precedenti + + + + Add {0} chapters to the novel folder + Aggiunti {0} capitoli alla cartella del romanzo + + + + Add {0} scenes to each chapter + Aggiunte {0} scene ad ogni capitolo + + + + Add {0} scenes + Aggiunte {0} scene + + + + You have selected the following: + Hai selezionato quanto segue: + + + + Press '{0}' to create the new project. + Premi '{0}' per creare il nuovo progetto. + + + + Done + Fatto + + + + Finish + Termina + + + + ProjWizardFolderPage + + + + Select Project Folder + Seleziona la cartella del progetto + + + + Select a location to store the project. A new project folder will be created in the selected location. + Selezionare una posizione per archiviare il progetto. Verrà creata una nuova cartella del progetto nella posizione selezionata. + + + + Required + Necessario + + + + Project Path + Percorso del progetto + + + + Error: A project folder cannot be created using this path. + Errore: non è possibile creare una cartella del progetto usando questo percorso. + + + + Error: The selected path already exists. + Errore: il percorso selezionato esiste già. + + + + ProjWizardIntroPage + + + Create New Project + Crea un nuovo progetto + + + + Provide at least a project name. The project name should not be changed beyond this point as it is used for generating file names for for instance backups. The other fields are optional and can be changed at any time in Project Settings. + Fornire almeno un nome del progetto. Il nome del progetto non deve essere cambiato oltre questo punto in quanto è usato per generare nomi di file, ad esempio per i backup. Gli altri campi sono opzionali e possono essere modificati in qualsiasi momento nelle impostazioni del progetto. + + + + Side image by {0}, {1} + L'immagine a lato è di {0}, {1} + + + + Required + Necessario + + + + + Optional + Facoltativo + + + + Project Name + Nome del progetto + + + + Novel Title + Titolo del romanzo + + + + Author(s) + Autore(i) + + + + ProjWizardPopulatePage + + + Populate Project + Allestisci il progetto + + + + Choose how to pre-fill the project. Either with a minimal set of starter items, an example project explaining and showing many of the features, or show further custom options on the next page. + Scegli come pre-compilare il progetto. O con un set minimo di elementi per iniziare, un progetto di esempio che spiega e mostra molte delle caratteristiche, oppure mostra ulteriori opzioni personalizzate nella pagina successiva. + + + + Fill the project with a minimal set of items + Allestisci il progetto con un insieme minimo di elementi + + + + Fill the project with example files + Allestisci il progetto con file di esempio + + + + Show detailed options for filling the project + Mostra le opzioni dettagliate per allestire il progetto + + + + ProjectBuilder + + + New Project + Nuovo progetto + + + + New Chapter + Nuovo capitolo + + + + New Scene + Nuova scena + + + + Title Page + Pagina del titolo + + + + By + Di + + + + Summary of the chapter. + Riassunto del capitolo. + + + + Summary of the scene. + Riassunto della scena. + + + + Chapter {0} + Capitolo {0} + + + + + Scene {0} + Scena {0} + + + + Main Plot + Trama principale + + + + Protagonist + Protagonista + + + + Main Location + Località principale + + + + Failed to create a new example project. + Impossibile creare un nuovo progetto di esempio. + + + + Failed to create a new example project. Could not find the necessary files. They seem to be missing from this installation. + Impossibile creare un nuovo progetto di esempio. Impossibile trovare i file necessari. Sembrano mancanti da questa installazione. + + + + QDialogButtonBox + + + OK + OK + + + + QGnomeTheme + + + &OK + &OK + + + + &Save + &Salva + + + + &Cancel + &Cancella + + + + &Close + &Chiudi + + + + Close without Saving + Chiudi senza salvare + + + + QPlatformTheme + + + OK + OK + + + + Save + Salva + + + + Save All + Salva tutto + + + + Open + Apri + + + + &Yes + &Sì + + + + Yes to &All + Sì a &tutto + + + + &No + &No + + + + N&o to All + N&o a tutto + + + + Abort + Interrompi + + + + Retry + Riprova + + + + Ignore + Ignora + + + + Close + Chiudi + + + + Cancel + Cancella + + + + Discard + Scarta + + + + Help + Aiuto + + + + Apply + Applica + + + + Reset + Ripristina + + + + Restore Defaults + Ripristina predefiniti + + + + QWizard + + + Go Back + Torna indietro + + + + < &Back + < &Indietro + + + + Continue + Continua + + + + &Next + &Successivo + + + + &Next > + &Successivo > + + + + Commit + Esegui + + + + Done + Fatto + + + + &Finish + &Termina + + + + + Cancel + Cancella + + + + Help + Aiuto + + + + &Help + &Aiuto + + + + Tokenizer + + + Synopsis + Sinossi + + + + Document '{0}' is too big ({1} MB). Skipping. + Il documento '{0}' è troppo grande ({1} MB). Saltare. + + + + ERROR + ERRORE + + + diff --git a/novelwriter/assets/i18n/project_it_IT.json b/novelwriter/assets/i18n/project_it_IT.json new file mode 100644 index 00000000..e9f9bcaa --- /dev/null +++ b/novelwriter/assets/i18n/project_it_IT.json @@ -0,0 +1,105 @@ +{ + "Synopsis": "Sinossi", + "Comment": "Commento", + "Notes": "Note", + "0": "Zero", + "1": "Uno", + "2": "Due", + "3": "Tre", + "4": "Quattro", + "5": "Cinque", + "6": "Sei", + "7": "Sette", + "8": "Otto", + "9": "Nove", + "10": "Dieci", + "11": "Undici", + "12": "Dodici", + "13": "Tredici", + "14": "Quattordici", + "15": "Quindici", + "16": "Sedici", + "17": "Diciassette", + "18": "Diciotto", + "19": "Diciannove", + "20": "Venti", + "21": "Ventuno", + "22": "Ventidue", + "23": "Ventitré", + "24": "Ventiquattro", + "25": "Venticinque", + "26": "Ventisei", + "27": "Ventisette", + "28": "Ventotto", + "29": "Ventinove", + "30": "Trenta", + "31": "Trentuno", + "32": "Trentadue", + "33": "Trentatré", + "34": "Trentaquattro", + "35": "Trentacinque", + "36": "Trentasei", + "37": "Trentasette", + "38": "Trentotto", + "39": "Trentanove", + "40": "Quaranta", + "41": "Quarantuno", + "42": "Quarantadue", + "43": "Quarantatré", + "44": "Quarantaquattro", + "45": "Quarantacinque", + "46": "Quarantasei", + "47": "Quarantasette", + "48": "Quarantotto", + "49": "Quarantanove", + "50": "Cinquanta", + "51": "Cinquantuno", + "52": "Cinquantadue", + "53": "Cinquantatré", + "54": "Cinquantaquattro", + "55": "Cinquantacinque", + "56": "Cinquantasei", + "57": "Cinquantasette", + "58": "Cinquantotto", + "59": "Cinquantanove", + "60": "Sessanta", + "61": "Sessantuno", + "62": "Sessantadue", + "63": "Sessantatre", + "64": "Sessantaquattro", + "65": "Sessantacinque", + "66": "Sessantasei", + "67": "Sessantasette", + "68": "Sessantotto", + "69": "Sessantanove", + "70": "Settanta", + "71": "Settantuno", + "72": "Settantadue", + "73": "Settantatré", + "74": "Settantaquattro", + "75": "Settantacinque", + "76": "Settantasei", + "77": "Settantasette", + "78": "Settantotto", + "79": "Settantanove", + "80": "Ottanta", + "81": "Ottantuno", + "82": "Ottantadue", + "83": "Ottantatré", + "84": "Ottantaquattro", + "85": "Ottantacinque", + "86": "Ottantasei", + "87": "Ottantasette", + "88": "Ottantotto", + "89": "Ottantanove", + "90": "Novanta", + "91": "Novantuno", + "92": "Novantadue", + "93": "Novantatré", + "94": "Novantaquattro", + "95": "Novantacinque", + "96": "Novantasei", + "97": "Novantasette", + "98": "Novantotto", + "99": "Novantanove" +} diff --git a/novelwriter/assets/text/credits_en.htm b/novelwriter/assets/text/credits_en.htm index 26cd3dab..c696781d 100644 --- a/novelwriter/assets/text/credits_en.htm +++ b/novelwriter/assets/text/credits_en.htm @@ -25,6 +25,7 @@ translators for the languages currently available:

      Dutch: Martijn van der Kleijn (@mvdkleijn)
      French: Jan Lüdke (@jyhelle)
      German: Myian (@heymyian)
      + Italian: Riccardo Mangili
      Latin American Spanish: Tommy Marplatt (@tmarplatt)
      Norwegian: Veronica Berglyd Olsen (@vkbo)
      Portuguese: Bruno Meneguello (@bkmeneguello)
      From 4b7a4e078979cb5efd789783eb2695a4c96413d6 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 08:36:30 +0100 Subject: [PATCH 40/48] Fix capitalisation in Portuguese translation --- i18n/nw_pt_BR.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i18n/nw_pt_BR.ts b/i18n/nw_pt_BR.ts index 9dcaf7c8..7a3d9602 100644 --- a/i18n/nw_pt_BR.ts +++ b/i18n/nw_pt_BR.ts @@ -2093,7 +2093,7 @@ Column Size - Tamanho da coluna + Tamanho da Coluna
      From cce1ef54d817377ef39c0f34eff9db478dc13d8d Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 12:54:05 +0100 Subject: [PATCH 41/48] Fix Open Document warning on settings.xml and bump version to 1.3 --- novelwriter/core/toodt.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index 968d7b87..f4740f13 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -65,7 +65,7 @@ def _mkTag(nsName, tagName, nsMap=XML_NS): # Mimetype and Version X_MIME = "application/vnd.oasis.opendocument.text" -X_VERS = "1.2" +X_VERS = "1.3" # Text Formatting Tags TAG_BR = _mkTag("text", "line-break") @@ -503,9 +503,8 @@ class ToOdt(Tokenizer): etree.SubElement(xMani, mFile, attrib={mPath: "styles.xml", mType: "text/xml"}) oRoot = _mkTag("office", "document-settings", nsMap=OFFICE_NS) - oSett = _mkTag("office", "settings", nsMap=OFFICE_NS) - xSett = etree.Element(oRoot, nsmap=OFFICE_NS) - etree.SubElement(xSett, oSett) + oVers = _mkTag("office", "version", nsMap=OFFICE_NS) + xSett = etree.Element(oRoot, nsmap=OFFICE_NS, attrib={oVers: X_VERS}) with ZipFile(savePath, mode="w") as outFile: outFile.writestr("mimetype", X_MIME) From 5796d55531a9d31aeffc7aaab3ab686fa75efecb Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 13:27:43 +0100 Subject: [PATCH 42/48] Title elements should be paragraph, not heading to be valid ODF --- novelwriter/core/toodt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index f4740f13..11658441 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -408,7 +408,7 @@ class ToOdt(Tokenizer): elif tType == self.T_TITLE: tHead = tText.replace(r"\\", "\n") - self._addTextPar("Title", oStyle, tHead, isHead=True) + self._addTextPar("Title", oStyle, tHead, isHead=False) elif tType == self.T_UNNUM: tHead = tText.replace(r"\\", "\n") From c39e37c799fd31529bdd5782f51de729801aa414 Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 14:44:01 +0100 Subject: [PATCH 43/48] Add more meta data to supporet adding fields in LibreOffice --- novelwriter/core/toodt.py | 33 +++++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index 11658441..a874fcfd 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -44,12 +44,13 @@ XML_NS = { "text": "urn:oasis:names:tc:opendocument:xmlns:text:1.0", "meta": "urn:oasis:names:tc:opendocument:xmlns:meta:1.0", "fo": "urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0", + "dc": "http://purl.org/dc/elements/1.1/", } MANI_NS = { "manifest": "urn:oasis:names:tc:opendocument:xmlns:manifest:1.0" } OFFICE_NS = { - "office": XML_NS["office"] + "office": "urn:oasis:names:tc:opendocument:xmlns:office:1.0", } @@ -328,13 +329,37 @@ class ToOdt(Tokenizer): self._xText = etree.SubElement(self._xBody, _mkTag("office", "text")) - # Meta Data + timeStamp = datetime.now().isoformat(sep="T", timespec="seconds") + + # Office Meta Data xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "creation-date")) - xMeta.text = datetime.now().isoformat(sep="T", timespec="seconds") + xMeta.text = timeStamp xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "generator")) xMeta.text = f"novelWriter/{novelwriter.__version__}" + xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "initial-creator")) + xMeta.text = self.theProject.data.author + + xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "editing-cycles")) + xMeta.text = str(self.theProject.data.saveCount) + + # Format is: PnYnMnDTnHnMnS + # https://www.w3.org/TR/2004/REC-xmlschema-2-20041028/#duration + eT = self.theProject.data.editTime + xMeta = etree.SubElement(self._xMeta, _mkTag("meta", "editing-duration")) + xMeta.text = f"P{eT//86400:d}DT{eT%86400//3600:d}H{eT%3600//60:d}M{eT%60:d}S" + + # Dublin Core Meta Data + xMeta = etree.SubElement(self._xMeta, _mkTag("dc", "title")) + xMeta.text = self.theProject.data.title or self.theProject.data.name + + xMeta = etree.SubElement(self._xMeta, _mkTag("dc", "date")) + xMeta.text = timeStamp + + xMeta = etree.SubElement(self._xMeta, _mkTag("dc", "creator")) + xMeta.text = self.theProject.data.author + self._pageStyles() self._defaultStyles() self._useableStyles() @@ -408,7 +433,7 @@ class ToOdt(Tokenizer): elif tType == self.T_TITLE: tHead = tText.replace(r"\\", "\n") - self._addTextPar("Title", oStyle, tHead, isHead=False) + self._addTextPar("Title", oStyle, tHead, isHead=False) # Title must be text:p elif tType == self.T_UNNUM: tHead = tText.replace(r"\\", "\n") From 7638db21ec71bc51df83509a87842d517e3d11bc Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 15:12:39 +0100 Subject: [PATCH 44/48] Fix tests --- novelwriter/core/toodt.py | 2 +- .../coreToOdt_SaveFlat_document.fodt | 14 +++++++++---- .../reference/coreToOdt_SaveFull_content.xml | 2 +- .../reference/coreToOdt_SaveFull_manifest.xml | 4 ++-- tests/reference/coreToOdt_SaveFull_meta.xml | 12 ++++++++--- .../reference/coreToOdt_SaveFull_settings.xml | 4 +--- tests/reference/coreToOdt_SaveFull_styles.xml | 4 ++-- .../guiBuild_Tool_Step1_Lorem_Ipsum.fodt | 14 +++++++++---- .../guiBuild_Tool_Step2_Lorem_Ipsum.fodt | 20 ++++++++++++------- .../guiBuild_Tool_Step3_Lorem_Ipsum.fodt | 20 ++++++++++++------- tests/test_core/test_core_toodt.py | 17 ++++++++++++---- tests/test_tools/test_tools_build.py | 8 ++++---- tests/tools.py | 1 + 13 files changed, 80 insertions(+), 42 deletions(-) diff --git a/novelwriter/core/toodt.py b/novelwriter/core/toodt.py index a874fcfd..2f6e1f0b 100644 --- a/novelwriter/core/toodt.py +++ b/novelwriter/core/toodt.py @@ -262,7 +262,7 @@ class ToOdt(Tokenizer): # =============== if self._headerText == "": - theTitle = self.theProject.data.title + theTitle = self.theProject.data.title or self.theProject.data.name theAuth = self.theProject.data.author self._headerText = f"{theTitle} / {theAuth} /" diff --git a/tests/reference/coreToOdt_SaveFlat_document.fodt b/tests/reference/coreToOdt_SaveFlat_document.fodt index a6436607..6e879a5c 100644 --- a/tests/reference/coreToOdt_SaveFlat_document.fodt +++ b/tests/reference/coreToOdt_SaveFlat_document.fodt @@ -1,8 +1,14 @@ - + - 2022-01-02T19:56:15 - novelWriter/1.6-alpha0 + 2023-02-12T15:10:11 + novelWriter/2.0.4 + Jane Smith + 1234 + P42DT12H34M56S + Test Project + 2023-02-12T15:10:11 + Jane Smith @@ -66,7 +72,7 @@ - / / 2 + Test Project / Jane Smith / 2 diff --git a/tests/reference/coreToOdt_SaveFull_content.xml b/tests/reference/coreToOdt_SaveFull_content.xml index bb1eb27c..4e191f7c 100644 --- a/tests/reference/coreToOdt_SaveFull_content.xml +++ b/tests/reference/coreToOdt_SaveFull_content.xml @@ -1,5 +1,5 @@ - + diff --git a/tests/reference/coreToOdt_SaveFull_manifest.xml b/tests/reference/coreToOdt_SaveFull_manifest.xml index df81d9bc..f939a7b3 100644 --- a/tests/reference/coreToOdt_SaveFull_manifest.xml +++ b/tests/reference/coreToOdt_SaveFull_manifest.xml @@ -1,6 +1,6 @@ - - + + diff --git a/tests/reference/coreToOdt_SaveFull_meta.xml b/tests/reference/coreToOdt_SaveFull_meta.xml index f280ad49..79930faa 100644 --- a/tests/reference/coreToOdt_SaveFull_meta.xml +++ b/tests/reference/coreToOdt_SaveFull_meta.xml @@ -1,7 +1,13 @@ - + - 2021-08-13T18:54:46 - novelWriter/1.5-alpha0 + 2023-02-12T15:09:03 + novelWriter/2.0.4 + Jane Smith + 1234 + P42DT12H34M56S + Test Project + 2023-02-12T15:09:03 + Jane Smith diff --git a/tests/reference/coreToOdt_SaveFull_settings.xml b/tests/reference/coreToOdt_SaveFull_settings.xml index 96545148..7b5218f2 100644 --- a/tests/reference/coreToOdt_SaveFull_settings.xml +++ b/tests/reference/coreToOdt_SaveFull_settings.xml @@ -1,4 +1,2 @@ - - - + diff --git a/tests/reference/coreToOdt_SaveFull_styles.xml b/tests/reference/coreToOdt_SaveFull_styles.xml index c0c1bc7d..5319adf2 100644 --- a/tests/reference/coreToOdt_SaveFull_styles.xml +++ b/tests/reference/coreToOdt_SaveFull_styles.xml @@ -1,5 +1,5 @@ - + @@ -59,7 +59,7 @@ - / / 2 + Test Project / Jane Smith / 2 diff --git a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt b/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt index d76fd988..d327ee5b 100644 --- a/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt +++ b/tests/reference/guiBuild_Tool_Step1_Lorem_Ipsum.fodt @@ -1,8 +1,14 @@ - + - 2022-01-02T19:51:47 - novelWriter/1.6-alpha0 + 2023-02-12T14:52:03 + novelWriter/2.0.4 + lipsum.com + 38 + P0DT0H31M40S + Lorem Ipsum + 2023-02-12T14:52:03 + lipsum.com @@ -87,7 +93,7 @@ - Lorem Ipsum + Lorem Ipsum By lipsum.com “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…” “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…” diff --git a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt b/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt index 52049d2a..d179c99d 100644 --- a/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt +++ b/tests/reference/guiBuild_Tool_Step2_Lorem_Ipsum.fodt @@ -1,8 +1,14 @@ - + - 2022-01-02T19:52:00 - novelWriter/1.6-alpha0 + 2023-02-12T15:00:22 + novelWriter/2.0.4 + lipsum.com + 38 + P0DT0H31M40S + Lorem Ipsum + 2023-02-12T15:00:22 + lipsum.com @@ -99,7 +105,7 @@ - Lorem Ipsum + Lorem Ipsum By lipsum.com “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…” “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…” @@ -180,19 +186,19 @@ Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis. Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue. Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo. - Notes: Characters + Notes: Characters Nobody Owens Tag: Bod Plot: Main Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque. - Notes: Plot + Notes: Plot Main Plot Tag: Main Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. - Notes: World + Notes: World Ancient Europe Tag: Europe Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. diff --git a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt b/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt index 0cf7403d..ca391d27 100644 --- a/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt +++ b/tests/reference/guiBuild_Tool_Step3_Lorem_Ipsum.fodt @@ -1,8 +1,14 @@ - + - 2022-01-02T19:52:33 - novelWriter/1.6-alpha0 + 2023-02-12T15:01:25 + novelWriter/2.0.4 + lipsum.com + 38 + P0DT0H31M40S + Lorem Ipsum + 2023-02-12T15:01:25 + lipsum.com @@ -99,7 +105,7 @@ - Lorem Ipsum + Lorem Ipsum By lipsum.com “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…” “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…” @@ -180,19 +186,19 @@ Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis. Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue. Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo. - Notes: Characters + Notes: Characters Nobody Owens Tag: Bod Plot: Main Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque. - Notes: Plot + Notes: Plot Main Plot Tag: Main Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. - Notes: World + Notes: World Ancient Europe Tag: Europe Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. diff --git a/tests/test_core/test_core_toodt.py b/tests/test_core/test_core_toodt.py index 22ea18be..fedfbcf3 100644 --- a/tests/test_core/test_core_toodt.py +++ b/tests/test_core/test_core_toodt.py @@ -25,7 +25,7 @@ import zipfile from lxml import etree from shutil import copyfile -from tools import cmpFiles +from tools import ODT_IGNORE, cmpFiles from novelwriter.core.toodt import ToOdt, ODTParagraphStyle, ODTTextStyle, XMLParagraph, _mkTag from novelwriter.core.project import NWProject @@ -37,6 +37,7 @@ XML_NS = [ ' xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"', ' xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0"', ' xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"', + ' xmlns:dc="http://purl.org/dc/elements/1.1/"' ] @@ -304,7 +305,7 @@ def testCoreToOdt_Convert(mockGUI): assert theDoc.getErrors() == [] assert xmlToText(theDoc._xText) == ( '' - 'Title' + 'Title' '' ) @@ -615,6 +616,10 @@ def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths): """Test the document save functions. """ theProject = NWProject(mockGUI) + theProject.data.setAuthor("Jane Smith") + theProject.data.setName("Test Project") + theProject.data.setSaveCount(1234) + theProject.data.setEditTime(3674096) theDoc = ToOdt(theProject, isFlat=True) theDoc._isNovel = True @@ -641,7 +646,7 @@ def testCoreToOdt_SaveFlat(mockGUI, fncPath, tstPaths): assert flatFile.exists() copyfile(flatFile, testFile) - assert cmpFiles(testFile, compFile, [4, 5]) + assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE) # END Test testCoreToOdt_SaveFlat @@ -651,6 +656,10 @@ def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths): """Test the document save functions. """ theProject = NWProject(mockGUI) + theProject.data.setAuthor("Jane Smith") + theProject.data.setName("Test Project") + theProject.data.setSaveCount(1234) + theProject.data.setEditTime(3674096) theDoc = ToOdt(theProject, isFlat=False) theDoc._isNovel = True @@ -719,7 +728,7 @@ def testCoreToOdt_SaveFull(mockGUI, fncPath, tstPaths): assert cmpFiles(maniFile, maniComp) assert cmpFiles(settFile, settComp) assert cmpFiles(contFile, contComp) - assert cmpFiles(metaFile, metaComp, [4, 5]) + assert cmpFiles(metaFile, metaComp, ignoreStart=ODT_IGNORE) assert cmpFiles(stylFile, stylComp) # END Test testCoreToOdt_SaveFull diff --git a/tests/test_tools/test_tools_build.py b/tests/test_tools/test_tools_build.py index 259e0924..e8dd5dce 100644 --- a/tests/test_tools/test_tools_build.py +++ b/tests/test_tools/test_tools_build.py @@ -23,7 +23,7 @@ import pytest from shutil import copyfile -from tools import cmpFiles, getGuiItem +from tools import ODT_IGNORE, cmpFiles, getGuiItem from PyQt5.QtCore import Qt from PyQt5.QtWidgets import QAction, QFileDialog @@ -103,7 +103,7 @@ def testToolBuild_Main(qtbot, monkeypatch, nwGUI, prjLipsum, tstPaths): testFile = tstPaths.outDir / "guiBuild_Tool_Step1_Lorem_Ipsum.fodt" compFile = tstPaths.refDir / "guiBuild_Tool_Step1_Lorem_Ipsum.fodt" copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [4, 5]) + assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE) # Change Title Formats and Flip Switches nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%") @@ -147,7 +147,7 @@ def testToolBuild_Main(qtbot, monkeypatch, nwGUI, prjLipsum, tstPaths): testFile = tstPaths.outDir / "guiBuild_Tool_Step2_Lorem_Ipsum.fodt" compFile = tstPaths.refDir / "guiBuild_Tool_Step2_Lorem_Ipsum.fodt" copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [4, 5]) + assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE) # Replace Tabs with Spaces qtbot.mouseClick(nwBuild.replaceTabs, Qt.LeftButton) @@ -181,7 +181,7 @@ def testToolBuild_Main(qtbot, monkeypatch, nwGUI, prjLipsum, tstPaths): testFile = tstPaths.outDir / "guiBuild_Tool_Step3_Lorem_Ipsum.fodt" compFile = tstPaths.refDir / "guiBuild_Tool_Step3_Lorem_Ipsum.fodt" copyfile(projFile, testFile) - assert cmpFiles(testFile, compFile, [4, 5]) + assert cmpFiles(testFile, compFile, ignoreStart=ODT_IGNORE) # Putline Mode nwBuild.fmtChapter.setText(r"Chapter %chw%: %title%") diff --git a/tests/tools.py b/tests/tools.py index fa5107a5..dd6443fd 100644 --- a/tests/tools.py +++ b/tests/tools.py @@ -27,6 +27,7 @@ from pathlib import Path from PyQt5.QtWidgets import qApp XML_IGNORE = (" Date: Sun, 12 Feb 2023 16:03:43 +0100 Subject: [PATCH 45/48] Update changelog and release notes --- CHANGELOG.md | 30 ++++++++++++++++++----- novelwriter/assets/text/release_notes.htm | 12 +++++++++ sample/nwProject.nwx | 4 +-- 3 files changed, 38 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 906787ec..9913126e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,12 +4,17 @@ ### Release Notes -This is a patch release that fixes a number of minor bugs and usability issues. The Project Details -dialog now properly updates when another project is opened, and the "Total editing time" value has -a less ambiguous time format. The editor no longer inserts blank lines if block formats are applied -to an empty line. The optional last column in the Novel Tree will now show all items of the -selected type, not only the first, and the column size can be adjusted from the same menu where the -column content is selected. +This is a patch release that fixes a number of minor bugs and usability issues. + +The Project Details dialog now properly updates when another project is opened, and the "Total +editing time" value has a less ambiguous time format. The editor no longer inserts blank lines if +block formats are applied to an empty line. The optional last column in the Novel Tree will now +show all items of the selected type, not only the first, and the column size can be adjusted from +the same menu where the column content is selected. The Open Document build output has been updated +to ODF 1.3 extended format, and passes validation. + +An Italian translation has been added, and Russian is currently available for project builds. A +full translation into Russian is on its way. ### Detailed Changelog @@ -21,6 +26,8 @@ column content is selected. previously missing though. Issue #1336. PR #1339. * Add a check to the data storage class that a path exists before it is returned to other classes that uses them for file I/O. Issue #1317. PR #1342. +* Fixed some issues with the Open Document build format as the produced document wasn't compliant + with the standard. It is now compliant with ODF 1.3 extended format. Issue #1359. PR #1360. **Usability Fixes** @@ -33,6 +40,17 @@ column content is selected. * The optional third column in the Novel Tree now shows all references for the selected category instead of just the first one. The maximum width of the column can also be selected from the Novel Tree config menu. Issue #1351. PR #1355. +* The Open Document produced by the build tool now has the necessary title and author meta data set + so that it can be used in LibreOffice. Other meta data has also been added. Issue #1359. + PR #1360. + +**Internationalisation** + +* Existing translations for US English, Norwegian, Brazilian Portuguese, Latin American Spanish, + and German have been updated. French and Dutch are partially updated. PR #1341. +* Russian project variables have been added. Full translation is forthcoming. Contributed by + Aleksey (@SKYnv). PR #1341. +* A complete Italian translation has been added. Contributed by Riccardo Mangili. PR #1341. **Packaging** diff --git a/novelwriter/assets/text/release_notes.htm b/novelwriter/assets/text/release_notes.htm index 6f8d0bd0..984fe27b 100644 --- a/novelwriter/assets/text/release_notes.htm +++ b/novelwriter/assets/text/release_notes.htm @@ -114,5 +114,17 @@ dialog box, replacing the Credits section on the main About tab.

      This is a patch release that fixes a bug where novelWriter would crash if PyQt5 version 5.15.8 was installed and imported.

      +

      Patch 2.0.5 – 12 February 2023

      + +

      This is a patch release that fixes a number of minor bugs and usability issues.

      +

      The Project Details dialog now properly updates when another project is opened, and the "Total +editing time" value has a less ambiguous time format. The editor no longer inserts blank lines if +block formats are applied to an empty line. The optional last column in the Novel Tree will now +show all items of the selected type, not only the first, and the column size can be adjusted from +the same menu where the column content is selected. The Open Document build output has been updated +to ODF 1.3 extended format, and passes validation.

      +

      An Italian translation has been added, and Russian is currently available for project builds. A +full translation into Russian is on its way.

      + diff --git a/sample/nwProject.nwx b/sample/nwProject.nwx index 8e735bdc..feb7e7b0 100644 --- a/sample/nwProject.nwx +++ b/sample/nwProject.nwx @@ -1,6 +1,6 @@ - - + + Sample Project Sample Project Jane Smith From c42f2e755ce0ac1ae7b5908afdd43122cdfbe9bd Mon Sep 17 00:00:00 2001 From: Veronica Berglyd Olsen <1619840+vkbo@users.noreply.github.com> Date: Sun, 12 Feb 2023 16:07:36 +0100 Subject: [PATCH 46/48] Make ODT tests ignore version number --- tests/tools.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/tools.py b/tests/tools.py index dd6443fd..a9933bc4 100644 --- a/tests/tools.py +++ b/tests/tools.py @@ -27,7 +27,7 @@ from pathlib import Path from PyQt5.QtWidgets import qApp XML_IGNORE = (" Date: Sun, 12 Feb 2023 17:30:26 +0100 Subject: [PATCH 47/48] Fix broken doc build test --- ...uildDocBuild_OpenDocument_Lorem_Ipsum.fodt | 20 ++++++++++++------- tests/test_mbuild/test_mbuild_docbuild.py | 4 ++-- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt b/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt index 06ec355e..ba183f64 100644 --- a/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt +++ b/tests/reference/mBuildDocBuild_OpenDocument_Lorem_Ipsum.fodt @@ -1,8 +1,14 @@ - + - 2023-01-11T10:54:59 - novelWriter/2.0.3 + 2023-02-12T17:28:07 + novelWriter/2.0.5 + lipsum.com + 38 + P0DT0H31M40S + Lorem Ipsum + 2023-02-12T17:28:07 + lipsum.com @@ -99,7 +105,7 @@ - Lorem Ipsum + Lorem Ipsum By lipsum.com “Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit…” “There is no one who loves pain itself, who seeks after it and wants to have it, simply because it is pain…” @@ -180,19 +186,19 @@ Donec luctus lectus efficitur, blandit nisi vitae, dignissim tellus. Pellentesque euismod pharetra augue gravida hendrerit. Quisque nisi mi, mattis ac nisi non, maximus malesuada ante. Nulla lobortis, diam eu ornare ornare, tellus enim feugiat arcu, non vestibulum tortor nunc eu justo. Integer blandit felis justo, eu semper est scelerisque vel. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nam ultricies, nisi vel elementum commodo, nisl dolor tincidunt magna, sed varius est nunc at lectus. Aliquam dolor tortor, sodales placerat ultricies quis, sodales quis sapien. Duis ullamcorper sollicitudin risus at mattis. Integer consequat et nunc at condimentum. Pellentesque cursus congue augue, non suscipit lectus sodales ut. Nam a mi bibendum, blandit nisl eu, accumsan nunc. Aliquam a ex mauris. Sed nec sem quis arcu dignissim tempus eget et turpis. Ut sed ex nec ipsum ultrices lobortis. Pellentesque rhoncus pharetra eros, non mollis nisi pretium non. Mauris accumsan quis odio quis euismod. Maecenas ultrices, augue et aliquam tincidunt, erat tellus ornare ligula, quis ultrices turpis nibh vel justo. Fusce gravida odio tellus. In a congue diam. Mauris consequat ex id leo lacinia dictum. Fusce id sem sodales, ultrices sapien ac, convallis orci. Donec gravida nunc sit amet nisi hendrerit, sed porta enim aliquam. In hac habitasse platea dictumst. Cras a orci felis. Curabitur non felis nec urna maximus auctor ut ut nisi. Curabitur at turpis eleifend, blandit eros at, molestie odio. Phasellus euismod neque augue. Integer egestas maximus leo eu facilisis. Nunc rhoncus dignissim lectus eu lacinia. Praesent lacinia urna porttitor aliquam condimentum. Nulla eu eros dictum, dictum nunc vitae, sagittis nibh. Integer ante neque, consequat nec sollicitudin id, consectetur vitae dolor. Nullam volutpat sem orci, quis viverra magna auctor a. Suspendisse potenti. Maecenas commodo sed neque pellentesque vehicula. Sed luctus nisl risus, elementum semper purus interdum vel. Ut pulvinar, massa sit amet venenatis placerat, nunc lacus hendrerit odio, non aliquet nunc risus eu lectus. Maecenas feugiat semper ligula, id lobortis sem porta eu. Integer posuere elit magna, at mollis eros bibendum et. Ut imperdiet purus vel nulla aliquam maximus. Morbi sodales purus tellus, a rhoncus sem rutrum sit amet. Quisque risus sem, laoreet nec convallis nec, rutrum vitae justo. - Notes: Characters + Notes: Characters Nobody Owens Tag: Bod Plot: Main Pellentesque nec erat ut nulla posuere commodo. Curabitur nisi augue, imperdiet et porta imperdiet, efficitur id leo. Cras finibus arcu at nibh commodo congue. Proin suscipit placerat condimentum. Aenean ante enim, cursus id lorem a, blandit venenatis nibh. Maecenas suscipit porta elit, sit amet porta felis porttitor eu. Sed a dui nibh. Phasellus sed faucibus dui. Pellentesque felis nulla, ultrices non efficitur quis, rutrum id mi. Mauris tempus auctor nisl, in bibendum enim pellentesque sit amet. Proin nunc lacus, imperdiet nec posuere ac, interdum non lectus. Suspendisse faucibus est auctor orci mollis luctus. Praesent quis sodales neque. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec sodales rutrum mattis. In in sem ornare, consequat nulla ac, convallis arcu. Duis ac metus id felis commodo commodo sit amet eget diam. Curabitur rhoncus lacinia leo at sodales. Etiam finibus porta diam a viverra. Praesent nisi urna, volutpat sit amet odio at, vehicula vehicula leo. In non enim eget nisl luctus commodo. Pellentesque pellentesque at lectus at luctus. Quisque nec felis bibendum, lacinia libero ut, lacinia eros. Integer finibus ultricies nibh sit amet placerat. Nullam scelerisque velit et tortor congue vestibulum a at nisi. Vivamus sodales ut turpis a convallis. In dignissim nibh at luctus sodales. Etiam sit amet rhoncus massa. Phasellus ligula magna, sollicitudin non imperdiet sit amet, volutpat vel magna. Nunc vestibulum tempor lectus, sit amet porta nunc hendrerit in. Curabitur non odio sit amet massa tincidunt facilisis. Integer et luctus nunc, eget euismod leo. Praesent faucibus metus sed purus convallis scelerisque. Fusce viverra lorem et placerat malesuada. In at elit malesuada, ullamcorper risus vitae, sodales dolor. Donec quis elementum lectus. Quisque eu eros at dui imperdiet euismod ut id neque. - Notes: Plot + Notes: Plot Main Plot Tag: Main Suspendisse vulputate malesuada pellentesque. Aenean sollicitudin cursus mi, vitae ultricies felis ullamcorper eu. Duis luctus risus mi, in accumsan velit cursus ut. Vestibulum eleifend leo in magna eleifend fermentum. Proin nec ornare elit. Phasellus nec interdum risus. In a volutpat augue, quis egestas justo. Morbi porta mauris mattis bibendum imperdiet. Mauris ut erat eu lorem malesuada egestas vel vel urna. Maecenas ac semper quam. Maecenas aliquet metus non interdum mattis. Proin consectetur molestie ligula. Aliquam sollicitudin pulvinar urna a pellentesque. Suspendisse ultrices, est mattis scelerisque porta, nisi nisi laoreet nisl, non condimentum quam ante a velit. Proin scelerisque justo augue, nec laoreet ligula egestas at. Etiam enim quam, ultrices non accumsan hendrerit, elementum vel ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Nam efficitur odio libero, in vestibulum arcu aliquam at. Cras non vehicula augue. Integer lobortis, est vitae aliquam facilisis, metus ligula aliquet eros, at porttitor sem tortor eget massa. Aliquam varius scelerisque neque sed gravida. Aenean eleifend lorem id ante elementum sollicitudin. Proin commodo massa a quam volutpat, mollis fermentum turpis efficitur. - Notes: World + Notes: World Ancient Europe Tag: Europe Vivamus sodales risus ac accumsan posuere. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nunc vel enim felis. Vestibulum dignissim massa nunc, a auctor magna eleifend et. Proin dignissim sodales erat vitae convallis. Aliquam id tellus dui. Curabitur sollicitudin scelerisque ex sit amet posuere. Nam rutrum felis id rhoncus feugiat. Duis sagittis quam quis purus efficitur, quis rutrum odio iaculis. Maecenas semper ante turpis, at vulputate mi consectetur non. Sed rutrum nibh turpis, quis rhoncus purus ornare quis. Vestibulum at rutrum mauris. Integer dolor nisi, tincidunt eget vehicula ac, ultricies at ligula. diff --git a/tests/test_mbuild/test_mbuild_docbuild.py b/tests/test_mbuild/test_mbuild_docbuild.py index a8aae938..ca1dea4b 100644 --- a/tests/test_mbuild/test_mbuild_docbuild.py +++ b/tests/test_mbuild/test_mbuild_docbuild.py @@ -24,7 +24,7 @@ import pytest from shutil import copyfile from mock import causeException, causeOSError -from tools import cmpFiles +from tools import ODT_IGNORE, cmpFiles from novelwriter.core.project import NWProject from novelwriter.mbuild.docbuild import NWBuildDocument @@ -85,7 +85,7 @@ def testMBuildDocBuild_OpenDocument(monkeypatch, mockGUI, prjLipsum, fncPath, ts assert error == [] copyfile(docFile, tstFile) - assert cmpFiles(tstFile, cmpFile, ignoreStart=" Date: Sun, 12 Feb 2023 17:30:40 +0100 Subject: [PATCH 48/48] Enable short retention time for build --- .github/workflows/build.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 57581b02..ba52ed3c 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -65,11 +65,12 @@ jobs: with: name: novelWriter-${{ env.VERSION }}-macos.app.zip path: dist_macos/novelWriter-${{ env.VERSION }}.app.zip - # retention-days: 1 + retention-days: 1 - name: Upload DMG uses: actions/upload-artifact@v3 with: name: novelWriter-${{ env.VERSION }}-macos.dmg path: dist_macos/novelWriter-${{ env.VERSION }}.dmg - # retention-days: 1 + retention-days: 1 +