Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git
D .github/ISSUE_TEMPLATE/bug_report.md
1
---
2
name: Bug report
3
about: Create a report to help us improve
4
title: ''
5
labels: bug
6
assignees: ''
7
8
---
9
10
**Description**
11
A concise problem description.
12
13
**Replicate**
14
Exact and complete steps to reproduce the problem 100% of the time:
15
16
1. Open '...'
17
1. Click '....'
18
1. Click '....'
19
20
**Expected**
21
Describe the expected behaviour.
22
23
**Actual**
24
Describe the actual behaviour.
25
26
**Screenshots**
27
Add screenshots to show the problem, if applicable.
28
29
**Environment**
30
 - Operating System: (Windows, Linux, Mac)
31
 - Application: e.g., 1.7.16
32
33
**Details**
34
Add additional information, if applicable.
351
M .gitignore
22
*.bin
33
*.exe
4
*.app
45
/*.jar
56
build
...
1415
tex
1516
spell
16
keenwrite.github.io
1717
keenwrite.build_artifacts.txt
1818
todo
M BUILD.md
77
Download and install the following software packages:
88
9
* [JDK 20](https://bell-sw.com/pages/downloads) (Full JDK + JavaFX)
10
* [Gradle 8.1.1](https://gradle.org/releases)
9
* [JDK 21](https://bell-sw.com/pages/downloads) (Full JDK + JavaFX)
10
* [Gradle 8.3](https://gradle.org/releases)
1111
* [Git 2.40.1](https://git-scm.com/downloads)
1212
* [warp v0.4.0-alpha](https://github.com/Reisz/warp/releases/tag/v0.4.0)
1313
1414
Note: The forked warp packer release fixes a bug in the main branch.
1515
1616
## Repository
1717
1818
Clone the repository as follows:
1919
20
    git clone https://github.com/DaveJarvis/keenwrite.git
20
    git clone https://gitlab.com/DaveJarvis/KeenWrite.git
2121
2222
The repository is cloned.
...
101101
After installing `scripts/build-template`, build release binaries as follows:
102102
103
    git tag -a 2.0.0 -m "Release name"
103
    git tag -a 4.0.0 -m "Release name"
104104
    git push origin --tags
105105
    ./release.sh
M README.md
1
![Total Downloads](https://img.shields.io/github/downloads/DaveJarvis/keenwrite/total?color=blue&label=Total%20Downloads&style=flat) ![Release Downloads](https://img.shields.io/github/downloads/DaveJarvis/keenwrite/latest/total?color=purple&label=Release%20Downloads&style=flat) ![Released](https://img.shields.io/github/release-date/DaveJarvis/keenwrite?color=red&style=flat&label=Released) ![Version](https://img.shields.io/github/v/release/DaveJarvis/keenwrite?style=flat&label=Release)
2
31
# ![Logo](docs/images/app-title.png)
42
...
3432
On other platforms, such as MacOS, start the application as follows:
3533
36
1. Download the *Full version* of the Java Runtime Environment, [JRE 20](https://bell-sw.com/pages/downloads).
34
1. Download the *Full version* of the Java Runtime Environment, [JRE 21](https://bell-sw.com/pages/downloads).
3735
   * JavaFX, which is bundled with BellSoft's *Full version*, is required.
3836
1. Install the JRE (include JRE's `bin` directory in the `PATH` environment variable).
M build.gradle
1616
plugins {
1717
  id 'application'
18
  id 'org.openjfx.javafxplugin' version '0.0.14'
18
  id 'org.openjfx.javafxplugin' version '0.1.0'
1919
  id 'com.palantir.git-version' version '3.0.0'
20
  id "com.github.spotbugs" version "5.0.14"
20
  id "com.github.spotbugs" version "5.1.3"
2121
}
2222
2323
spotbugs {
2424
  excludeFilter.set(
25
      file("${projectDir}/bug-filter.xml")
25
      file( "${projectDir}/bug-filter.xml" )
2626
  )
2727
}
...
5454
  if ('windows' == targetOs) {
5555
    os = ["win"]
56
  } else if ('macos' == targetOs) {
57
    os = ["mac"]
5658
  } else {
5759
    os = [targetOs]
...
7678
7779
java {
78
  sourceCompatibility = 20
79
  targetCompatibility = 20
80
  sourceCompatibility = 21
81
  targetCompatibility = 21
8082
}
8183
8284
javafx {
83
  version = '20'
85
  version = '21'
8486
  modules = ['javafx.base', 'javafx.controls', 'javafx.graphics', 'javafx.swing']
8587
  configuration = 'compileOnly'
8688
}
8789
8890
dependencies {
8991
  def v_junit = '5.9.3'
90
  def v_flexmark = '0.64.6'
92
  def v_flexmark = '0.64.8'
9193
  def v_jackson = '2.15.2'
92
  def v_echosvg = '0.3.1'
93
  def v_picocli = '4.7.4'
94
  def v_echosvg = '1.0'
95
  def v_picocli = '4.7.5'
9496
9597
  // JavaFX
9698
  implementation 'org.controlsfx:controlsfx:11.1.2'
97
  implementation 'org.fxmisc.richtext:richtextfx:0.11.0'
98
  implementation 'org.fxmisc.flowless:flowless:0.7.0'
99
  implementation 'org.fxmisc.richtext:richtextfx:0.11.1'
100
  implementation 'org.fxmisc.flowless:flowless:0.7.1'
99101
  implementation 'org.fxmisc.wellbehaved:wellbehavedfx:0.3.3'
100
  implementation 'com.miglayout:miglayout-javafx:11.0'
102
  implementation 'com.miglayout:miglayout-javafx:11.1'
101103
  implementation 'com.dlsc.preferencesfx:preferencesfx-core:11.16.0'
102104
  implementation 'com.panemu:tiwulfx-dock:0.2'
...
111113
112114
  // YAML
113
  implementation 'org.yaml:snakeyaml:2.0'
115
  implementation 'org.yaml:snakeyaml:2.2'
114116
  implementation "com.fasterxml.jackson.core:jackson-core:${v_jackson}"
115117
  implementation "com.fasterxml.jackson.core:jackson-databind:${v_jackson}"
116118
  implementation "com.fasterxml.jackson.core:jackson-annotations:${v_jackson}"
117119
  implementation "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${v_jackson}"
118120
119121
  // HTML parsing and rendering
120122
  implementation 'org.jsoup:jsoup:1.16.1'
121
  // TODO: https://github.com/flyingsaucerproject/flyingsaucer/pull/170
122
  //implementation 'org.xhtmlrenderer:flying-saucer-core:9.1.22'
123
  implementation 'org.xhtmlrenderer:flying-saucer-core:9.3.1'
123124
124125
  // R
125
  implementation 'org.apache.commons:commons-compress:1.23.0'
126
  implementation 'org.apache.commons:commons-compress:1.24.0'
126127
  implementation 'org.codehaus.plexus:plexus-utils:4.0.0'
127128
  implementation 'org.renjin:renjin-script-engine:3.5-beta76'
...
165166
  }
166167
167
  testImplementation 'org.testfx:testfx-junit5:4.0.16-alpha'
168
  testImplementation 'org.testfx:testfx-junit5:4.0.17'
168169
  testImplementation "org.junit.jupiter:junit-jupiter-api:${v_junit}"
169170
  testImplementation "org.junit.jupiter:junit-jupiter-params:${v_junit}"
M container/Containerfile
8787
  fc-cache -f -v && \
8888
  mkdir -p tex && \
89
  rsync \
90
    --recursive --links --times \
91
    --info=progress2,remove,symsafe,flist,del \
92
    --human-readable --del \
93
    rsync://contextgarden.net/minimals/current/modules/ modules && \
94
  rsync \
95
    -rlt --exclude=/VERSION --del modules/*/ tex/texmf-modules && \
89
  #rsync \
90
    #--recursive --links --times \
91
    #--info=progress2,remove,symsafe,flist,del \
92
    #--human-readable --del \
93
    #rsync://contextgarden.net/minimals/current/modules/ modules && \
94
  #rsync \
95
    #-rlt --exclude=/VERSION --del modules/*/ tex/texmf-modules && \
9696
  sh install.sh && \
9797
  rm -f $DOWNLOAD_DIR/*.zip && \
...
108108
  find \
109109
    /usr/share/inkscape \
110
    -type f -not -iname "*.xml" -exec rm {} \; && \
110
    -type f -not -iname \*.xml -exec rm {} \; && \
111111
  find \
112112
    $CONTEXT_HOME \
A container/README.md
1
# Overview
2
3
This document describes how to maintain the containerized typesetting system.
4
Broadly, the container is built locally then deployed to a web server capable
5
of serving static web pages.
6
7
## Installation wizard
8
9
The installation wizard is responsible for installing the containerization
10
software and the container image. The container manager class loads the
11
image from a URL. That URL is defined in the `messages.properties` file.
12
13
# Upgrade
14
15
Upgrade the containerization software as follows:
16
17
1. Edit `src/main/resources/com/keenwrite/messages.properties`.
18
1. Set `Wizard.typesetter.container.version` to the latest version.
19
1. Set `Wizard.typesetter.container.checksum` to the Windows version checksum.
20
1. Set `Wizard.typesetter.container.image.version` to the latest image version.
21
1. Save the file.
22
23
The containerization software versions are changed.
24
25
# Publish
26
27
Publish the changes to the container image as follows:
28
29
``` bash
30
./manage.sh --build
31
./manage.sh --export
32
./manage.sh --publish
33
```
34
35
The container image is published.
36
137
M container/manage.sh
99
source ../scripts/build-template
1010
11
readonly BUILD_DIR=build
12
readonly PROPERTIES="${SCRIPT_DIR}/../src/main/resources/bootstrap.properties"
11
# Reads the value of a property from a properties file.
12
#
13
# $1 - The key name to obtain.
14
function property {
15
  grep "^${1}" "${PROPERTIES}" | cut -d'=' -f2
16
}
1317
14
# Read the properties file to get the container version.
15
while IFS='=' read -r key value
16
do
17
  key=$(echo $key | tr '.' '_')
18
  eval ${key}=\${value}
19
done < "${PROPERTIES}"
18
readonly BUILD_DIR=build
19
readonly PROPERTIES="${SCRIPT_DIR}/../src/main/resources/com/keenwrite/messages.properties"
2020
2121
readonly CONTAINER_EXE=podman
22
readonly CONTAINER_SHORTNAME=typesetter
23
readonly CONTAINER_VERSION=${container_version}
22
readonly CONTAINER_SHORTNAME=$(property Wizard.typesetter.container.image.name)
23
readonly CONTAINER_VERSION=$(property Wizard.typesetter.container.image.version)
2424
readonly CONTAINER_NETWORK=host
25
readonly CONTAINER_FILE="${CONTAINER_SHORTNAME}"
25
readonly CONTAINER_FILE="${CONTAINER_SHORTNAME}-${CONTAINER_VERSION}"
2626
readonly CONTAINER_ARCHIVE_FILE="${CONTAINER_FILE}.tar"
2727
readonly CONTAINER_ARCHIVE_PATH="${BUILD_DIR}/${CONTAINER_ARCHIVE_FILE}"
2828
readonly CONTAINER_COMPRESSED_FILE="${CONTAINER_ARCHIVE_FILE}.gz"
2929
readonly CONTAINER_COMPRESSED_PATH="${BUILD_DIR}/${CONTAINER_ARCHIVE_FILE}.gz"
30
readonly CONTAINER_IMAGE_FILE="${BUILD_DIR}/${CONTAINER_FILE}"
3031
readonly CONTAINER_DIR_SOURCE="/root/source"
3132
readonly CONTAINER_DIR_TARGET="/root/target"
3233
readonly CONTAINER_DIR_IMAGES="/root/images"
3334
readonly CONTAINER_DIR_FONTS="/root/fonts"
34
readonly CONTAINER_REPO=ghcr.io
3535
3636
ARG_CONTAINER_NAME="${CONTAINER_SHORTNAME}:${CONTAINER_VERSION}"
3737
ARG_CONTAINER_COMMAND="context --version"
3838
ARG_MOUNTPOINT_SOURCE=""
3939
ARG_MOUNTPOINT_TARGET="."
4040
ARG_MOUNTPOINT_IMAGES=""
4141
ARG_MOUNTPOINT_FONTS="${HOME}/.fonts"
42
ARG_ACCESS_TOKEN=""
4342
4443
DEPENDENCIES=(
...
5655
  "i,images,Set mount point for image files (to typeset)"
5756
  "f,fonts,Set mount point for font files (during typesetting)"
58
  "k,token,Set personal access token (to publish)"
5957
  "l,load,Load container (${CONTAINER_COMPRESSED_PATH})"
60
  "p,publish,Publish the container (after logging in)"
58
  "p,publish,Publish the container"
6159
  "r,run,Run a command in the container (\"${ARG_CONTAINER_COMMAND}\")"
62
  "v,version,Set container version to publish (${CONTAINER_VERSION})"
6360
  "x,export,Save container (${CONTAINER_COMPRESSED_PATH})"
6461
)
...
9895
  # Show what commands are run while building, but not the commands' output.
9996
  ${CONTAINER_EXE} build \
100
    --network=${CONTAINER_NETWORK} \
97
    --network="${CONTAINER_NETWORK}" \
10198
    --squash \
102
    -t ${ARG_CONTAINER_NAME} . | \
99
    -t "${ARG_CONTAINER_NAME}" . | \
103100
  grep ^STEP
104101
}
105102
106103
# ---------------------------------------------------------------------------
107104
# Publishes the container to the repository.
108105
# ---------------------------------------------------------------------------
109106
utile_publish() {
110
  local -r username=$(git config user.name | tr '[A-Z]' '[a-z]')
111
  local -r repo="${CONTAINER_REPO}/${username}/${ARG_CONTAINER_NAME}"
112
113
  if [ ! -z ${ARG_ACCESS_TOKEN} ]; then
114
    echo ${ARG_ACCESS_TOKEN} | \
115
      ${CONTAINER_EXE} login ghcr.io -u $(git config user.name) --password-stdin
116
117
    $log "Tagging"
118
119
    ${CONTAINER_EXE} tag ${ARG_CONTAINER_NAME} ${repo}
107
  local -r TOKEN_FILE="token.txt"
120108
121
    $log "Pushing ${ARG_CONTAINER_NAME} to ${CONTAINER_REPO}"
109
  if [[ -f "${TOKEN_FILE}" ]]; then
110
    local -r repository=$(cat ${TOKEN_FILE})
111
    local -r remote_file="${CONTAINER_SHORTNAME}:${CONTAINER_VERSION}"
112
    local -r remote_path="${repository}/${remote_file}"
122113
123
    ${CONTAINER_EXE} push ${repo}
114
    $log "Publishing to ${remote_path}"
124115
125
    $log "Published ${ARG_CONTAINER_NAME} to ${CONTAINER_REPO}"
116
    # Path to the repository.
117
    scp -q "${CONTAINER_IMAGE_FILE}" "${remote_path}"
126118
  else
127
    error "Provide a personal access token (-k TOKEN) to publish."
119
    error "Create ${TOKEN_FILE} with publish credentials"
128120
  fi
129121
}
...
232224
    gzip "${CONTAINER_ARCHIVE_PATH}"
233225
234
    $log "Saved ${CONTAINER_SHORTNAME} image"
226
    $log "Renaming to ${CONTAINER_IMAGE_FILE}"
227
    mv "${CONTAINER_COMPRESSED_PATH}" "${CONTAINER_IMAGE_FILE}"
228
229
    $log "Saved ${CONTAINER_IMAGE_FILE} image"
235230
  fi
236231
}
...
265260
    -d|--delete)
266261
    do_delete=utile_delete
267
    ;;
268
    -k|--token)
269
    if [ ! -z "${2+x}" ]; then
270
      ARG_ACCESS_TOKEN="$2"
271
      consume=2
272
    fi
273262
    ;;
274263
    -l|--load)
...
301290
    if [ ! -z "${2+x}" ]; then
302291
      ARG_MOUNTPOINT_SOURCE="$2"
303
      consume=2
304
    fi
305
    ;;
306
    -v|--version)
307
    if [ ! -z "${2+x}" ]; then
308
      ARG_CONTAINER_NAME="${CONTAINER_SHORTNAME}:$2"
309292
      consume=2
310293
    fi
D images/kitten.jpg
11
D images/kitten.png
11
M installer.sh
3131
ARG_JAVA_OS="linux"
3232
ARG_JAVA_ARCH="amd64"
33
ARG_JAVA_VERSION="20.0.1"
34
ARG_JAVA_UPDATE="10"
33
ARG_JAVA_VERSION="21"
34
ARG_JAVA_UPDATE="37"
3535
ARG_JAVA_DIR="java"
3636
...
4444
  "gradle,https://gradle.org"
4545
  "warp-packer,https://github.com/Reisz/warp/releases"
46
  "linux-x64.warp-packer,https://github.com/dgiagio/warp/releases"
4647
  "tar,https://www.gnu.org/software/tar"
4748
  "wine,https://www.winehq.org"
4849
  "unzip,http://infozip.sourceforge.net"
4950
)
5051
5152
ARGUMENTS+=(
5253
  "a,arch,Target operating system architecture (amd64)"
53
  "o,os,Target operating system (linux, windows, mac)"
54
  "o,os,Target operating system (linux, windows, macos)"
5455
  "u,update,Java update version number (${ARG_JAVA_UPDATE})"
5556
  "v,version,Full Java version (${ARG_JAVA_VERSION})"
...
9495
    do_create_launch_script=utile_create_launch_script_windows
9596
    do_brand_windows=utile_brand_windows
97
  elif [ "${ARG_JAVA_OS}" = "macos" ]; then
98
    APP_EXTENSION="app"
9699
  fi
97100
}
...
128131
  local -r java_vm="jre"
129132
  local -r java_version="${ARG_JAVA_VERSION}+${ARG_JAVA_UPDATE}"
130
  local -r url_java="https://download.bell-sw.com/java/${java_version}/bellsoft-${java_vm}${java_version}-${ARG_JAVA_OS}-${ARG_JAVA_ARCH}-full.${ARCHIVE_EXT}"
131133
132
  local -r file_java="${java_vm}-${java_version}-${ARG_JAVA_OS}-${ARG_JAVA_ARCH}.${ARCHIVE_EXT}"
134
  java_os="${ARG_JAVA_OS}"
135
  java_arch="${ARG_JAVA_ARCH}"
136
  archive_ext=""
137
138
  if [ "${ARG_JAVA_OS}" = "macos" ]; then
139
    archive_ext=".jre"
140
  fi
141
142
  local -r url_java="https://download.bell-sw.com/java/${java_version}/bellsoft-${java_vm}${java_version}-${java_os}-${java_arch}-full.${ARCHIVE_EXT}"
143
144
  local -r file_java="${java_vm}-${java_version}-${java_os}-${java_arch}.${ARCHIVE_EXT}"
133145
  local -r path_java="/tmp/${file_java}"
134146
...
142154
  $ARCHIVE_APP "${path_java}"
143155
144
  local -r dir_java="${java_vm}-${ARG_JAVA_VERSION}-full"
156
  local -r dir_java="${java_vm}-${ARG_JAVA_VERSION}-full${archive_ext}"
145157
146158
  $log "Rename ${dir_java} to ${ARG_JAVA_DIR}"
...
227239
# ---------------------------------------------------------------------------
228240
utile_create_launcher() {
241
  packer=warp-packer
242
  packer_opt_pack="pack"
243
  packer_opt_input="input-dir"
244
229245
  local -r FILE_APP_NAME="${APP_NAME}.${APP_EXTENSION}"
230246
  $log "Create ${FILE_APP_NAME}"
231247
232
  # Warp-packer does not seem to overwrite the file.
248
  # Warp-packer does not overwrite the file.
233249
  rm -f "${FILE_APP_NAME}"
234250
235251
  # Download uses amd64, but warp-packer differs.
236252
  if [ "${ARG_JAVA_ARCH}" = "amd64" ]; then
237253
    ARG_JAVA_ARCH="x64"
238254
  fi
239255
240
  warp-packer \
241
    pack \
256
  # The warp-packer fork that fixes Windows doesn't support MacOS.
257
  if [ "${ARG_JAVA_OS}" = "macos" ]; then
258
    packer=linux-x64.warp-packer
259
    packer_opt_pack=""
260
    packer_opt_input="input_dir"
261
  fi
262
263
  ${packer} \
264
    ${packer_opt_pack} \
242265
    --arch "${ARG_JAVA_OS}-${ARG_JAVA_ARCH}" \
243
    --input-dir "${ARG_DIR_DIST}" \
266
    --${packer_opt_input} "${ARG_DIR_DIST}" \
244267
    --exec "${FILE_DIST_EXEC}" \
245268
    --output "${FILE_APP_NAME}" > /dev/null
D keenwrite.sh
1
#!/usr/bin/env bash
2
3
SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &> /dev/null && pwd)
4
5
java \
6
  --add-opens=javafx.controls/javafx.scene.control=ALL-UNNAMED \
7
  --add-opens=javafx.controls/javafx.scene.control.skin=ALL-UNNAMED \
8
  --add-opens=javafx.graphics/javafx.scene.text=ALL-UNNAMED \
9
  --add-opens=javafx.graphics/com.sun.javafx.css=ALL-UNNAMED \
10
  --add-opens=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED \
11
  --add-opens=javafx.graphics/com.sun.javafx.text=ALL-UNNAMED \
12
  --add-exports=javafx.base/com.sun.javafx.event=ALL-UNNAMED \
13
  --add-exports=javafx.graphics/com.sun.javafx.application=ALL-UNNAMED \
14
  --add-exports=javafx.graphics/com.sun.javafx.geom=ALL-UNNAMED \
15
  --add-exports=javafx.graphics/com.sun.javafx.text=ALL-UNNAMED \
16
  --add-exports=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED \
17
  --add-exports=javafx.graphics/com.sun.javafx.scene.text=ALL-UNNAMED \
18
  --add-exports=javafx.graphics/com.sun.javafx.scene.traversal=ALL-UNNAMED \
19
  -jar ${SCRIPT_DIR}/keenwrite.jar $@
20
211
D libs/flying-saucer-core-9.1.23.jar
Binary file
M libs/keenquotes.jar
Binary file
M release.sh
3030
  mv "build/libs/${application_title,,}.jar" .
3131
32
  $log "Build Windows installer binary"
33
  ${BIN_INSTALLER} -o windows
34
3532
  $log "Build Linux installer binary"
3633
  ${BIN_INSTALLER} -o linux
34
35
  $log "Build MacOS installer binary"
36
  ${BIN_INSTALLER} -o macos
37
38
  $log "Build Windows installer binary"
39
  ${BIN_INSTALLER} -o windows
3740
}
3841
M src/main/java/com/keenwrite/Bootstrap.java
3434
  public static final String APP_TITLE;
3535
  public static final String APP_VERSION;
36
  public static final String CONTAINER_VERSION;
3736
3837
  public static final String APP_TITLE_ABBR = "kwr";
...
4544
4645
  static {
47
    // There's no way to know what container version is compatible. This
48
    // value will cause a failure when downloading the container,
49
    var containerVersion = "1.0.0";
5046
    var appVersion = "0.0.0";
5147
    var appTitle = "KeenWrite";
5248
5349
    try( final var in = openResource( PATH_BOOTSTRAP ) ) {
5450
      sP.load( in );
5551
5652
      appTitle = sP.getProperty( "application.title" );
57
      containerVersion = sP.getProperty( "container.version" );
5853
    } catch( final Exception ex ) {
5954
      final var fmt = "Unable to load %s resource, applying defaults.%n";
6055
      clue( ex, fmt, PATH_BOOTSTRAP );
6156
    }
6257
63
    CONTAINER_VERSION = containerVersion;
6458
    APP_TITLE = appTitle;
6559
    APP_TITLE_LOWERCASE = APP_TITLE.toLowerCase();
M src/main/java/com/keenwrite/MainScene.java
2626
import static com.keenwrite.ui.actions.ApplicationBars.*;
2727
import static javafx.application.Platform.runLater;
28
import static javafx.scene.input.KeyCode.*;
29
import static javafx.scene.input.KeyEvent.KEY_PRESSED;
28
import static javafx.scene.input.KeyCode.SCROLL_LOCK;
3029
import static javafx.scene.input.KeyEvent.KEY_RELEASED;
3130
...
191190
  private Scene createScene( final Parent parent ) {
192191
    final var scene = new Scene( parent );
193
194
    // After the app loses focus, when the user switches back using Alt+Tab,
195
    // the menu is sometimes engaged. See MainApp::initStage().
196
    //
197
    // JavaFX Bug: https://bugs.openjdk.java.net/browse/JDK-8090647
198
    scene.addEventHandler( KEY_PRESSED, event -> {
199
      // Only consume lone ALT key press events. If the modifier is used in
200
      // combination with another key, don't consume the event. First check
201
      // if ALT is down before getting the key code as a micro-optimization.
202
      if( event.isAltDown() ) {
203
        if( event.getCode() == ALT || event.getCode() == ALT_GRAPH ) {
204
          event.consume();
205
        }
206
      }
207
    } );
208192
209193
    // Update the synchronized scrolling status when user presses scroll lock.
M src/main/java/com/keenwrite/cmdline/ColourScheme.java
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
15
package com.keenwrite.cmdline;
26
M src/main/java/com/keenwrite/collections/CircularQueue.java
22
package com.keenwrite.collections;
33
4
import org.jetbrains.annotations.NotNull;
5
46
import java.util.*;
57
...
180182
   */
181183
  @Override
184
  @NotNull
182185
  public Iterator<E> iterator() {
183186
    return new Iterator<>() {
M src/main/java/com/keenwrite/collections/InterpolatingMap.java
7070
   * contain the key name, including the original sigils.
7171
   *
72
   * @param value    Value containing zero or more key references.
72
   * @param value Value containing zero or more key references.
7373
   * @return The given value with all embedded key references interpolated.
7474
   */
M src/main/java/com/keenwrite/constants/Constants.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.constants;
36
M src/main/java/com/keenwrite/constants/GraphicsConstants.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.constants;
36
M src/main/java/com/keenwrite/dom/DocumentConverter.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.dom;
36
M src/main/java/com/keenwrite/dom/DocumentParser.java
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
15
package com.keenwrite.dom;
26
M src/main/java/com/keenwrite/editors/TextDefinition.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors;
36
M src/main/java/com/keenwrite/editors/TextEditor.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors;
36
M src/main/java/com/keenwrite/editors/TextResource.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors;
36
M src/main/java/com/keenwrite/editors/common/ScrollEventHandler.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.common;
36
M src/main/java/com/keenwrite/editors/common/VariableNameInjector.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.common;
36
M src/main/java/com/keenwrite/editors/definition/DefinitionEditor.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.definition;
36
M src/main/java/com/keenwrite/editors/definition/DefinitionTreeItem.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.definition;
36
M src/main/java/com/keenwrite/editors/definition/RootTreeItem.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.definition;
36
M src/main/java/com/keenwrite/editors/definition/TreeItemMapper.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.definition;
36
M src/main/java/com/keenwrite/editors/definition/TreeTransformer.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.definition;
36
M src/main/java/com/keenwrite/editors/markdown/HyperlinkModel.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.markdown;
36
M src/main/java/com/keenwrite/editors/markdown/LinkVisitor.java
1
/*
2
 * Copyright 2020-2021 White Magic Software, Ltd.
3
 *
4
 * All rights reserved.
5
 *
6
 * Redistribution and use in source and binary forms, with or without
7
 * modification, are permitted provided that the following conditions are met:
8
 *
9
 *  o Redistributions of source code must retain the above copyright
10
 *    notice, this list of conditions and the following disclaimer.
11
 *
12
 *  o Redistributions in binary form must reproduce the above copyright
13
 *    notice, this list of conditions and the following disclaimer in the
14
 *    documentation and/or other materials provided with the distribution.
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
152
 *
16
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
 * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3
 * SPDX-License-Identifier: MIT
274
 */
285
package com.keenwrite.editors.markdown;
M src/main/java/com/keenwrite/editors/markdown/MarkdownEditor.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.editors.markdown;
36
M src/main/java/com/keenwrite/events/AppEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/CaretMovedEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/CaretNavigationEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/DocumentChangedEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/ExportFailedEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/FileOpenEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/FocusEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/HyperlinkOpenEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/InsertDefinitionEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/ParseHeadingEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/ScrollLockEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/StatusEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/TextDefinitionFocusEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/TextEditorFocusEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/WordCountEvent.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events;
36
M src/main/java/com/keenwrite/events/spelling/LexiconEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events.spelling;
36
M src/main/java/com/keenwrite/events/spelling/LexiconLoadedEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events.spelling;
36
M src/main/java/com/keenwrite/events/workspace/WorkspaceEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events.workspace;
36
M src/main/java/com/keenwrite/events/workspace/WorkspaceLoadedEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.events.workspace;
36
M src/main/java/com/keenwrite/exceptions/MissingFileException.java
1
/* Copyright 2020-2021 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.exceptions;
36
M src/main/java/com/keenwrite/io/MediaTypeSniffer.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io;
36
M src/main/java/com/keenwrite/io/UserDataDir.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io;
36
M src/main/java/com/keenwrite/io/Zip.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io;
36
M src/main/java/com/keenwrite/io/downloads/DownloadManager.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io.downloads;
36
M src/main/java/com/keenwrite/io/downloads/events/DownloadConnectionFailedEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io.downloads.events;
36
M src/main/java/com/keenwrite/io/downloads/events/DownloadEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io.downloads.events;
36
M src/main/java/com/keenwrite/io/downloads/events/DownloadFailedEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io.downloads.events;
36
M src/main/java/com/keenwrite/io/downloads/events/DownloadStartedEvent.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io.downloads.events;
36
M src/main/java/com/keenwrite/preferences/PreferencesController.java
8686
8787
  /**
88
   * Creates the preferences dialog based using
89
   * {@link SkeletonStorageHandler} and
88
   * Creates the preferences dialog using {@link SkeletonStorageHandler} and
9089
   * numerous {@link Category} objects.
9190
   *
M src/main/java/com/keenwrite/preview/ImageReplacedElementFactory.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.preview;
36
M src/main/java/com/keenwrite/processors/XhtmlProcessor.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.processors;
36
M src/main/java/com/keenwrite/spelling/impl/Lexicon.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.spelling.impl;
36
M src/main/java/com/keenwrite/typesetting/HostTypesetter.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting;
36
M src/main/java/com/keenwrite/typesetting/Typesetter.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting;
36
M src/main/java/com/keenwrite/typesetting/containerization/ContainerManager.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.containerization;
36
...
3033
   * Requests that the container manager load an image into the container.
3134
   *
32
   * @param name The full container name of the image to pull.
3335
   * @param processor Processes the command output (in a separate thread).
3436
   * @throws CommandNotFoundException The container executable was not found.
3537
   */
36
  void pull( StreamProcessor processor, String name )
38
  void load( StreamProcessor processor )
3739
    throws CommandNotFoundException;
3840
M src/main/java/com/keenwrite/typesetting/containerization/Podman.java
22
package com.keenwrite.typesetting.containerization;
33
4
import com.keenwrite.Messages;
45
import com.keenwrite.io.CommandNotFoundException;
56
import com.keenwrite.io.SysFile;
67
78
import java.io.File;
89
import java.nio.file.Files;
910
import java.nio.file.Path;
1011
import java.util.LinkedList;
1112
import java.util.List;
1213
13
import static com.keenwrite.Bootstrap.CONTAINER_VERSION;
1414
import static com.keenwrite.events.StatusEvent.clue;
1515
import static com.keenwrite.io.SysFile.toFile;
...
3434
    );
3535
  private static final SysFile MANAGER = new SysFile( BINARY );
36
37
  public static final String CONTAINER_SHORTNAME = "typesetter";
38
  public static final String CONTAINER_NAME =
39
    format( "%s:%s", CONTAINER_SHORTNAME, CONTAINER_VERSION );
4036
4137
  private final List<String> mMountPoints = new LinkedList<>();
...
104100
105101
  @Override
106
  public void pull( final StreamProcessor processor, final String name )
102
  public void load( final StreamProcessor processor )
107103
    throws CommandNotFoundException {
108
    podman( processor, "pull", "ghcr.io/davejarvis/" + name );
104
    final var url = Messages.get( "Wizard.typesetter.container.image.url" );
105
106
    podman( processor, "load", "-i", url );
109107
  }
110108
...
125123
    final StreamProcessor processor,
126124
    final String... args ) throws CommandNotFoundException {
125
    final var tag = Messages.get( "Wizard.typesetter.container.image.tag" );
126
127127
    final var options = new LinkedList<String>();
128128
    options.add( "run" );
129129
    options.add( "--rm" );
130130
    options.add( "--network=host" );
131131
    options.addAll( mMountPoints );
132132
    options.add( "-t" );
133
    options.add( CONTAINER_NAME );
133
    options.add( tag );
134134
    options.add( "/bin/sh" );
135135
    options.add( "-lc" );
M src/main/java/com/keenwrite/typesetting/installer/TypesetterInstaller.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/AbstractDownloadPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/InstallerPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/IntroductionPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/ManagerInitializationPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/TypesetterImageDownloadPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
4
import static com.keenwrite.typesetting.containerization.Podman.CONTAINER_NAME;
7
import com.keenwrite.typesetting.containerization.ContainerManager;
58
69
/**
...
1518
      PREFIX + ".correct",
1619
      PREFIX + ".missing",
17
      (container, processor) -> container.pull( processor, CONTAINER_NAME ),
20
      ContainerManager::load,
1821
      45
1922
    );
M src/main/java/com/keenwrite/typesetting/installer/panes/TypesetterThemesDownloadPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/UniversalManagerInstallPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/UnixManagerInstallPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/WindowsManagerDownloadPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/typesetting/installer/panes/WindowsManagerInstallPane.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.typesetting.installer.panes;
36
M src/main/java/com/keenwrite/ui/clipboard/Clipboard.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.ui.clipboard;
36
M src/main/java/com/keenwrite/ui/controls/SearchBar.java
166166
  }
167167
168
  private void addAll( final Node... nodes ) {
169
    getChildren().addAll( nodes );
170
  }
171
168172
  /**
169173
   * Creates a vertical bar, used to divide the search results from the
170174
   * application status message.
171175
   *
172176
   * @return A vertical separator.
173177
   */
174
  private Node createSeparatorVertical() {
178
  private static Node createSeparatorVertical() {
175179
    return new Separator( VERTICAL );
176180
  }
...
183187
   * @return A new {@link Node} having about 10px of space.
184188
   */
185
  private Node createSpacer( final int width ) {
189
  private static Node createSpacer( final int width ) {
186190
    final var spacer = new Region();
187191
    spacer.setPrefWidth( width );
188192
    VBox.setVgrow( spacer, ALWAYS );
189193
    return spacer;
190194
  }
191195
192
  private Node getIcon( final String id ) {
196
  private static Node getIcon( final String id ) {
193197
    return createGraphic( getMessageValue( id, "icon" ) );
194198
  }
195199
196
  private String getMessageValue( final String id, final String suffix ) {
200
  private static String getMessageValue( final String id,
201
                                         final String suffix ) {
197202
    return get( format( MESSAGE_KEY, id, suffix ) );
198
  }
199
200
  private void addAll( final Node... nodes ) {
201
    getChildren().addAll( nodes );
202203
  }
203204
}
M src/main/java/com/keenwrite/ui/dialogs/ExportDialog.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.ui.dialogs;
36
M src/main/java/com/keenwrite/ui/dialogs/ExportSettings.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.ui.dialogs;
36
M src/main/java/com/keenwrite/util/RangeValidator.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.util;
36
M src/main/resources/bootstrap.properties
11
application.title=KeenWrite
2
container.version=3.0.0
32
M src/main/resources/com/keenwrite/messages.properties
321321
Wizard.typesetter.name=ConTeXt
322322
Wizard.typesetter.container.name=Podman
323
Wizard.typesetter.container.version=4.5.1
324
Wizard.typesetter.container.checksum=883c9901d1eedb3a130256574afa270656e4d322dce0bb880808d9d7776eff8a
325
Wizard.typesetter.themes.version=1.8.3
326
Wizard.typesetter.themes.checksum=983b8d3c4051c6c002b8111ea786ebc83d5496ab5f8d734e96413c59304b2a75
323
Wizard.typesetter.container.version=4.6.2
324
Wizard.typesetter.container.checksum=a51acef00b17cce83dd4d364817af32dd5e541db8d2d13063ae73742744ba3ad
325
Wizard.typesetter.container.image.name=typesetter
326
Wizard.typesetter.container.image.version=3.0.1
327
Wizard.typesetter.container.image.tag=${Wizard.typesetter.container.image.name}:${Wizard.typesetter.container.image.version}
328
Wizard.typesetter.container.image.url=https://repository.keenwrite.com/containers/${Wizard.typesetter.container.image.tag}
329
Wizard.typesetter.themes.version=1.8.4
330
Wizard.typesetter.themes.checksum=b30dd800df89c1d06b2446469e62c12252434946f950a874e1ca225719ba4efc
327331
328332
Wizard.container.install.command=Installing container using: ''{0}''
...
450454
Wizard.typesetter.all.5.download.themes.header=Download ${Wizard.typesetter.name} themes
451455
Wizard.typesetter.all.5.download.themes.download.link.lbl=repository
452
Wizard.typesetter.all.5.download.themes.download.link.url=https://github.com/DaveJarvis/keenwrite-themes/releases/download/${Wizard.typesetter.themes.version}/theme-pack.zip
456
Wizard.typesetter.all.5.download.themes.download.link.url=https://gitlab.com/DaveJarvis/keenwrite-themes/-/releases/${Wizard.typesetter.themes.version}/downloads/theme-pack.zip
453457
Wizard.typesetter.all.5.download.themes.paths=Downloading {0} into {1}.
454458
Wizard.typesetter.all.5.download.themes.status.bytes=Downloaded {0} bytes (size unknown).
M src/test/java/com/keenwrite/io/UserDataDirTest.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io;
36
M src/test/java/com/keenwrite/io/downloads/DownloadManagerTest.java
1
/* Copyright 2022 White Magic Software, Ltd. -- All rights reserved. */
1
/* Copyright 2023 White Magic Software, Ltd. -- All rights reserved.
2
 *
3
 * SPDX-License-Identifier: MIT
4
 */
25
package com.keenwrite.io.downloads;
36
A www/LICENSE
1
MIT License
2
3
Copyright (c) 2022 KeenWrite
4
5
Permission is hereby granted, free of charge, to any person obtaining a copy
6
of this software and associated documentation files (the "Software"), to deal
7
in the Software without restriction, including without limitation the rights
8
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
copies of the Software, and to permit persons to whom the Software is
10
furnished to do so, subject to the following conditions:
11
12
The above copyright notice and this permission notice shall be included in all
13
copies or substantial portions of the Software.
14
15
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
SOFTWARE.
122
A www/README.md
11
2
![KeenWrite logo](images/logo/icon.png)
3
4
A www/images/icons/apple.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   viewBox="0 0 157.33104 75"
4
   version="1.1"
5
   id="svg1"
6
   width="157.33104"
7
   height="75"
8
   xmlns="http://www.w3.org/2000/svg"
9
   xmlns:svg="http://www.w3.org/2000/svg">
10
  <defs
11
     id="defs1" />
12
  <!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. -->
13
  <path
14
     d="m 56.86155,15.62503 c 0,-1.72852 -1.39648,-3.125 -3.125,-3.125 -1.72852,0 -3.125,1.39648 -3.125,3.125 V 39.3262 l -7.16797,-7.16797 c -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 -1.2207,1.22071 -1.2207,3.20313 0,4.42383 l 12.5,12.5 c 1.22071,1.2207 3.20313,1.2207 4.42383,0 l 12.5,-12.5 c 1.2207,-1.2207 1.2207,-3.20312 0,-4.42383 -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 l -7.1582,7.16797 z m -21.875,31.25 c -3.44727,0 -6.25,2.80273 -6.25,6.25 v 3.125 c 0,3.44727 2.80273,6.25 6.25,6.25 h 37.5 c 3.44727,0 6.25,-2.80273 6.25,-6.25 v -3.125 c 0,-3.44727 -2.80273,-6.25 -6.25,-6.25 h -9.91211 l -4.42383,4.42383 c -2.4414,2.4414 -6.39648,2.4414 -8.83789,0 l -4.41406,-4.42383 z m 35.9375,10.15625 c -1.29883,0 -2.34375,-1.04492 -2.34375,-2.34375 0,-1.29883 1.04492,-2.34375 2.34375,-2.34375 1.29883,0 2.34375,1.04492 2.34375,2.34375 0,1.29883 -1.04492,2.34375 -2.34375,2.34375 z"
15
     id="path16323"
16
     style="fill:#000000;fill-opacity:1;stroke-width:0.0976562" />
17
  <path
18
     d="m 121.70706,38.92224 c -0.0223,-4.09673 1.83069,-7.18881 5.58138,-9.46601 -2.0986,-3.00277 -5.26882,-4.65486 -9.45485,-4.97858 -3.96277,-0.31256 -8.29392,2.31069 -9.87903,2.31069 -1.67441,0 -5.51439,-2.19906 -8.52833,-2.19906 -6.22882,0.10046 -12.84832,4.96742 -12.84832,14.86877 q 0,4.38696 1.60743,9.06415 c 1.42883,4.09673 6.58602,14.1432 11.96646,13.97576 2.81303,-0.067 4.79998,-1.99813 8.46136,-1.99813 3.54976,0 5.39161,1.99813 8.52834,1.99813 5.4251,-0.0781 10.09112,-9.20927 11.45298,-13.31716 -7.27811,-3.42696 -6.88742,-10.04647 -6.88742,-10.25856 z m -6.31811,-18.32922 c 3.04743,-3.61673 2.76836,-6.90974 2.67906,-8.09299 -2.69022,0.15627 -5.80463,1.83069 -7.5795,3.89579 -1.95348,2.21023 -3.10325,4.9451 -2.85767,8.02602 2.91348,0.22325 5.57021,-1.27256 7.75811,-3.82882 z"
19
     id="path5811"
20
     style="fill:#000000;fill-opacity:1;stroke-width:0.111627" />
21
</svg>
122
A www/images/icons/java.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   viewBox="0 0 157.33104 75"
4
   version="1.1"
5
   id="svg1"
6
   width="157.33104"
7
   height="75"
8
   xmlns="http://www.w3.org/2000/svg"
9
   xmlns:svg="http://www.w3.org/2000/svg">
10
  <defs
11
     id="defs1" />
12
  <!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. -->
13
  <path
14
     d="m 53.68516,15.625 c 0,-1.72852 -1.39648,-3.125 -3.125,-3.125 -1.72852,0 -3.125,1.39648 -3.125,3.125 V 39.32617 L 40.26719,32.1582 c -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 -1.2207,1.22071 -1.2207,3.20313 0,4.42383 l 12.5,12.5 c 1.22071,1.2207 3.20313,1.2207 4.42383,0 l 12.5,-12.5 c 1.2207,-1.2207 1.2207,-3.20312 0,-4.42383 -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 l -7.1582,7.16797 z m -21.875,31.25 c -3.44727,0 -6.25,2.80273 -6.25,6.25 v 3.125 c 0,3.44727 2.80273,6.25 6.25,6.25 h 37.5 c 3.44727,0 6.25,-2.80273 6.25,-6.25 v -3.125 c 0,-3.44727 -2.80273,-6.25 -6.25,-6.25 h -9.91211 l -4.42383,4.42383 c -2.4414,2.4414 -6.39648,2.4414 -8.83789,0 L 41.72227,46.875 Z m 35.9375,10.15625 c -1.29883,0 -2.34375,-1.04492 -2.34375,-2.34375 0,-1.29883 1.04492,-2.34375 2.34375,-2.34375 1.29883,0 2.34375,1.04492 2.34375,2.34375 0,1.29883 -1.04492,2.34375 -2.34375,2.34375 z"
15
     id="path16474"
16
     style="fill:#000000;fill-opacity:1;stroke-width:0.0976562" />
17
  <path
18
     d="m 121.74171,43.05624 c 0.95702,-0.65429 2.28513,-1.22069 2.28513,-1.22069 0,0 -3.77925,0.68359 -7.53897,0.99608 -4.59954,0.38086 -9.54088,0.45898 -12.02132,0.12695 -5.86906,-0.78124 3.22261,-2.93941 3.22261,-2.93941 0,0 -3.52534,-0.23437 -7.87099,1.85544 -5.12688,2.48044 12.69515,3.61324 21.92354,1.18163 z m -8.33973,-3.13473 c -1.85545,-4.16986 -8.11513,-7.83192 0,-14.23809 C 123.52489,17.69525 118.33355,12.5 118.33355,12.5 c 2.09959,8.25185 -7.38271,10.75181 -10.8104,15.8787 -2.33395,3.50581 1.14256,7.26553 5.87883,11.54281 z m 11.19126,-17.2068 c 0.01,0 -17.10915,4.27729 -8.93543,13.69123 2.41208,2.7734 -0.63476,5.27336 -0.63476,5.27336 0,0 6.12297,-3.16402 3.3105,-7.11904 -2.62691,-3.69136 -4.63861,-5.52727 6.25969,-11.84555 z m -0.5957,26.41567 a 1.190414,1.190414 0 0 1 -0.19531,0.2539 c 12.52914,-3.29097 7.91982,-11.61117 1.93357,-9.50183 a 1.6923604,1.6923604 0 0 0 -0.80077,0.61523 6.879792,6.879792 0 0 1 1.0742,-0.29297 c 3.02731,-0.63475 7.37296,4.05268 -2.01169,8.92567 z m 4.60541,6.0839 c 0,0 1.416,1.1621 -1.55272,2.07029 -5.65422,1.70896 -23.51531,2.22653 -28.47618,0.0684 -1.78709,-0.77147 1.56248,-1.85544 2.61715,-2.08005 1.09374,-0.23437 1.72849,-0.19531 1.72849,-0.19531 -1.98239,-1.39646 -12.82209,2.74411 -5.50773,3.92573 19.94504,3.24215 36.3667,-1.45506 31.19099,-3.78901 z m -21.83174,-4.04291 c -7.68545,2.1484 4.67767,6.58194 14.4627,2.39254 a 18.15308,18.15308 0 0 1 -2.75387,-1.34764 c -4.36518,0.83007 -6.38664,0.88866 -10.35143,0.43945 -3.27144,-0.37109 -1.3574,-1.48435 -1.3574,-1.48435 z m 17.55836,9.49206 c -7.68545,1.44529 -17.16774,1.27928 -22.7829,0.35156 0,-0.01 1.15232,0.94725 7.07022,1.3281 9.00378,0.57617 22.83173,-0.32226 23.15399,-4.58001 0,0 -0.62499,1.6113 -7.44131,2.90035 z M 120.07181,46.9722 c -5.78117,1.11327 -9.13074,1.08397 -13.3592,0.64453 -3.27144,-0.3418 -1.13279,-1.92381 -1.13279,-1.92381 -8.47645,2.81247 4.70696,5.99602 16.55251,2.52927 a 5.89543,5.89543 0 0 1 -2.06052,-1.24999 z"
19
     id="path5936"
20
     style="fill:#000000;fill-opacity:1;stroke-width:0.097655" />
21
</svg>
122
A www/images/icons/linux.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   viewBox="0 0 157.33104 75"
4
   version="1.1"
5
   id="svg1"
6
   width="157.33104"
7
   height="75"
8
   xmlns="http://www.w3.org/2000/svg"
9
   xmlns:svg="http://www.w3.org/2000/svg">
10
  <defs
11
     id="defs1" />
12
  <!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. -->
13
  <path
14
     d="m 111.9104,24.539926 c 0.0976,0.0488 0.17577,0.166 0.29295,0.166 0.10741,0 0.27341,-0.039 0.28318,-0.14647 0.0196,-0.13671 -0.18553,-0.22459 -0.31248,-0.28318 -0.166,-0.0684 -0.38082,-0.0976 -0.53706,-0.01 -0.039,0.0195 -0.0781,0.0684 -0.0586,0.10741 0.0293,0.12695 0.22459,0.10742 0.332,0.166 z m -2.13849,0.166 c 0.11718,0 0.1953,-0.11718 0.29294,-0.166 0.10742,-0.0586 0.30271,-0.039 0.34177,-0.15624 0.0195,-0.0391 -0.0195,-0.0879 -0.0586,-0.10741 -0.15623,-0.0879 -0.37106,-0.0586 -0.53706,0.01 -0.12694,0.0586 -0.33201,0.14647 -0.31248,0.28318 0.01,0.0976 0.17577,0.14647 0.27342,0.13671 z m 21.59,27.22431 c -0.35153,-0.3906 -0.51753,-1.13273 -0.70306,-1.92368 -0.17577,-0.79095 -0.38083,-1.64048 -1.02531,-2.18731 -0.12694,-0.10742 -0.25388,-0.20506 -0.39059,-0.28318 -0.12694,-0.0781 -0.26365,-0.14648 -0.40036,-0.1953 0.89836,-2.66579 0.54683,-5.32182 -0.3613,-7.72397 -1.11318,-2.9392 -3.05638,-5.50735 -4.54063,-7.26502 -1.66979,-2.09944 -3.29075,-4.09146 -3.26146,-7.03067 0.0488,-4.48205 0.49801,-12.81143 -7.40172,-12.8212 -9.99918,-0.0196 -7.49938,10.09682 -7.6068,13.20203 -0.166,2.28497 -0.62495,4.08169 -2.19708,6.31784 -1.84555,2.19708 -4.442986,5.74171 -5.673356,9.44257 -0.58588,1.7479 -0.8593,3.5251 -0.60541,5.20465 -0.63472,0.56636 -1.11319,1.43543 -1.62096,1.97249 -0.41012,0.41989 -1.00578,0.57612 -1.66002,0.81048 -0.65424,0.23436 -1.36708,0.58589 -1.8065,1.4159 -0.20506,0.38083 -0.27341,0.79095 -0.27341,1.21084 0,0.38083 0.0586,0.77142 0.11718,1.15225 0.11717,0.79095 0.24412,1.53307 0.0781,2.03108 -0.50777,1.40613 -0.57613,2.38261 -0.21483,3.09544 0.37106,0.71283 1.11319,1.02531 1.96273,1.20108 1.68931,0.35153 3.98405,0.26365 5.79054,1.2206 1.933426,1.01554 3.896156,1.37684 5.458526,1.01554 1.13271,-0.25389 2.06037,-0.93742 2.52908,-1.97249 1.22061,-0.01 2.56815,-0.5273 4.71641,-0.64448 1.45496,-0.11718 3.28098,0.51753 5.38041,0.40035 0.0586,0.2246 0.13671,0.44919 0.24412,0.65425 v 0.01 c 0.81048,1.63072 2.32403,2.37285 3.93522,2.2459 1.62097,-0.12694 3.32981,-1.07413 4.71641,-2.72438 1.32802,-1.60143 3.51533,-2.26544 4.97029,-3.14427 0.7226,-0.43941 1.30849,-0.98624 1.35731,-1.78696 0.039,-0.80071 -0.42965,-1.68931 -1.51355,-2.90015 z m -19.16833,-30.90565 c 0.95695,-2.16779 3.33957,-2.12873 4.29652,-0.0391 0.63471,1.38661 0.35153,3.01733 -0.41989,3.94499 -0.15623,-0.0781 -0.57612,-0.25388 -1.23036,-0.47847 0.10741,-0.11718 0.30271,-0.26365 0.38082,-0.44919 0.46872,-1.15224 -0.0195,-2.6365 -0.88859,-2.66579 -0.71284,-0.0488 -1.35731,1.0546 -1.15225,2.24591 -0.40036,-0.1953 -0.91789,-0.34177 -1.26943,-0.42965 -0.0976,-0.67378 -0.0293,-1.42567 0.28318,-2.12874 z m -3.97428,-1.12295 c 0.98625,0 2.03108,1.3866 1.86508,3.27122 -0.34177,0.0976 -0.6933,0.24412 -0.99601,0.44918 0.11718,-0.86907 -0.32224,-1.96274 -0.93742,-1.91391 -0.82025,0.0684 -0.95696,2.07014 -0.17577,2.74392 0.0977,0.0781 0.18553,-0.0195 -0.57613,0.53706 -1.52331,-1.42566 -1.0253,-5.08747 0.82025,-5.08747 z m -1.32802,5.92724 c 0.60542,-0.44918 1.32802,-0.97648 1.37685,-1.0253 0.45894,-0.42965 1.31825,-1.3866 2.72438,-1.3866 0.6933,0 1.52331,0.22459 2.52909,0.86906 0.61518,0.40036 1.10342,0.42966 2.20684,0.90813 0.82025,0.34177 1.33778,0.94719 1.02531,1.7772 -0.25389,0.6933 -1.07413,1.40613 -2.21661,1.76743 -1.0839,0.35153 -1.93344,1.56237 -3.73016,1.45496 -0.38083,-0.0196 -0.68354,-0.0977 -0.93742,-0.20507 -0.78119,-0.34176 -1.19131,-1.01554 -1.95297,-1.46472 -0.83977,-0.46871 -1.28896,-1.01554 -1.43543,-1.49401 -0.13671,-0.47848 0,-0.87884 0.41012,-1.20108 z m 0.32224,32.61449 c -0.26365,3.42745 -4.28675,3.35909 -7.352896,1.75766 -2.91968,-1.54284 -6.69866,-0.63471 -7.47009,-2.13849 -0.23435,-0.45895 -0.23435,-1.24013 0.25389,-2.57791 v -0.0195 c 0.23435,-0.74213 0.0586,-1.56237 -0.0586,-2.33379 -0.11718,-0.76166 -0.17577,-1.46472 0.0879,-1.95297 0.34177,-0.65424 0.83002,-0.8886 1.4452,-1.10342 1.00578,-0.3613 1.15225,-0.33201 1.9139,-0.96672 0.53707,-0.55659 0.92766,-1.25966 1.39637,-1.75766 0.49801,-0.53707 0.97648,-0.79095 1.72837,-0.67378 0.79095,0.11718 1.474486,0.66401 2.138496,1.56237 l 1.9139,3.47628 c 0.92766,1.9432 4.20863,4.72617 4.00357,6.72796 z m -0.1367,-2.52909 c -0.40036,-0.64448 -0.93743,-1.32801 -1.40614,-1.9139 0.6933,0 1.38661,-0.21483 1.63073,-0.86907 0.22459,-0.60542 0,-1.45496 -0.7226,-2.43144 -1.31825,-1.7772 -3.73992,-3.17357 -3.73992,-3.17357 -1.31825,-0.82024 -2.06038,-1.82602 -2.40215,-2.91968 -0.34176,-1.09366 -0.29294,-2.2752 -0.0293,-3.43721 0.50777,-2.23614 1.81626,-4.4137 2.65603,-5.78077 0.22459,-0.16601 0.0781,0.31247 -0.84954,2.03108 -0.83,1.57214 -2.382606,5.20465 -0.25388,8.04621 0.0586,-2.02132 0.53706,-4.08169 1.34754,-6.00536 1.17178,-2.67556 3.64228,-7.31385 3.83757,-11.00495 0.10742,0.0781 0.44919,0.31247 0.60543,0.40036 0.44918,0.26365 0.79095,0.65424 1.23036,1.00577 1.21084,0.97648 2.78298,0.89836 4.14028,0.11718 0.60542,-0.34177 1.09366,-0.73236 1.55261,-0.87883 0.96672,-0.30271 1.73814,-0.83978 2.17755,-1.46473 0.75189,2.96851 2.50956,7.25526 3.63251,9.34493 0.59566,1.11319 1.78697,3.46651 2.3045,6.30807 0.32224,-0.01 0.68354,0.039 1.06437,0.13671 1.34754,-3.48604 -1.14249,-7.24549 -2.27521,-8.29033 -0.45894,-0.44918 -0.47847,-0.64448 -0.25388,-0.63471 1.23037,1.09366 2.85133,3.29074 3.43722,5.76124 0.27341,1.13272 0.32223,2.31426 0.039,3.48604 1.60143,0.66401 3.50557,1.7479 2.9978,3.39815 -0.21483,-0.01 -0.31248,0 -0.41013,0 0.31248,-0.98624 -0.38082,-1.7186 -2.22637,-2.54861 -1.91391,-0.83978 -3.51534,-0.83978 -3.73993,1.2206 -1.18154,0.41012 -1.78696,1.43543 -2.08967,2.66579 -0.27341,1.09366 -0.35153,2.41191 -0.42965,3.89617 -0.0488,0.75189 -0.35154,1.75766 -0.66401,2.83179 -3.1345,2.23615 -7.48961,3.21263 -11.16118,0.70307 z m 25.13463,-1.12295 c -0.0879,1.64049 -4.0231,1.94319 -6.17136,4.54063 -1.28895,1.53308 -2.87085,2.38262 -4.25746,2.49003 -1.38661,0.10741 -2.58768,-0.46871 -3.29074,-1.88461 -0.45895,-1.08389 -0.23436,-2.25567 0.10741,-3.54462 0.3613,-1.38661 0.89836,-2.81227 0.96672,-3.96452 0.0781,-1.48425 0.166,-2.78297 0.41012,-3.77898 0.25388,-1.00578 0.64448,-1.67955 1.33778,-2.06038 0.0293,-0.0195 0.0684,-0.0293 0.0976,-0.0488 0.0781,1.28895 0.71284,2.59744 1.83579,2.88062 1.23037,0.32223 2.9978,-0.73237 3.74969,-1.59167 0.87884,-0.0293 1.53308,-0.0879 2.20685,0.49801 0.96672,0.83001 0.6933,2.95874 1.66978,4.06216 1.03507,1.13272 1.36708,1.90414 1.33778,2.40215 z m -24.93934,-27.77114 c 0.1953,0.18553 0.45895,0.43942 0.78119,0.6933 0.64448,0.50777 1.54284,1.03507 2.6658,1.03507 1.13271,0 2.19708,-0.57612 3.10521,-1.0546 0.47847,-0.25388 1.06436,-0.68353 1.44519,-1.01554 0.38083,-0.332 0.57612,-0.61518 0.30271,-0.64447 -0.27342,-0.0293 -0.25389,0.25388 -0.58589,0.498 -0.42965,0.31248 -0.94719,0.7226 -1.35731,0.95695 -0.7226,0.41012 -1.90414,0.99601 -2.91968,0.99601 -1.01554,0 -1.82602,-0.46871 -2.43144,-0.94718 -0.30271,-0.24412 -0.55659,-0.48824 -0.75189,-0.67378 -0.14647,-0.1367 -0.18553,-0.44918 -0.41989,-0.47847 -0.13671,-0.01 -0.17577,0.3613 0.166,0.63471 z"
15
     id="path6061"
16
     style="fill:#000000;fill-opacity:1;stroke-width:0.097648" />
17
  <path
18
     d="m 52.578354,15.625006 c 0,-1.72852 -1.39648,-3.125 -3.125,-3.125 -1.72852,0 -3.125,1.39648 -3.125,3.125 v 23.70117 l -7.16797,-7.16797 c -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 -1.2207,1.22071 -1.2207,3.20313 0,4.42383 l 12.5,12.5 c 1.22071,1.2207 3.20313,1.2207 4.42383,0 l 12.5,-12.5 c 1.2207,-1.2207 1.2207,-3.20312 0,-4.42383 -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 l -7.1582,7.16797 z m -21.875,31.25 c -3.44727,0 -6.25,2.80273 -6.25,6.25 v 3.125 c 0,3.44727 2.80273,6.25 6.25,6.25 h 37.5 c 3.44727,0 6.25,-2.80273 6.25,-6.25 v -3.125 c 0,-3.44727 -2.80273,-6.25 -6.25,-6.25 h -9.91211 l -4.42383,4.42383 c -2.4414,2.4414 -6.39648,2.4414 -8.83789,0 l -4.41406,-4.42383 z m 35.9375,10.15625 c -1.29883,0 -2.34375,-1.04492 -2.34375,-2.34375 0,-1.29883 1.04492,-2.34375 2.34375,-2.34375 1.29883,0 2.34375,1.04492 2.34375,2.34375 0,1.29883 -1.04492,2.34375 -2.34375,2.34375 z"
19
     id="path15448"
20
     style="fill:#000000;fill-opacity:1;stroke-width:0.0976562" />
21
</svg>
122
A www/images/icons/windows.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   viewBox="0 0 157.33104 75"
4
   version="1.1"
5
   id="svg1"
6
   width="157.33104"
7
   height="75"
8
   xmlns="http://www.w3.org/2000/svg"
9
   xmlns:svg="http://www.w3.org/2000/svg">
10
  <defs
11
     id="defs1" />
12
  <!--! Font Awesome Free 6.4.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2023 Fonticons, Inc. -->
13
  <path
14
     d="M 83.66552,19.38616 104.15659,16.5625 V 36.36161 H 83.66552 Z m 0,36.22768 20.49107,2.82366 V 38.88393 H 83.66552 Z m 22.74554,3.125 L 133.66552,62.5 V 38.88393 h -27.25446 z m 0,-42.47768 v 20.10045 h 27.25446 V 12.5 Z"
15
     id="path6186"
16
     style="fill:#000000;fill-opacity:1;stroke-width:0.111607" />
17
  <path
18
     d="m 51.79052,15.625 c 0,-1.72852 -1.39648,-3.125 -3.125,-3.125 -1.72852,0 -3.125,1.39648 -3.125,3.125 V 39.32617 L 38.37255,32.1582 c -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 -1.2207,1.22071 -1.2207,3.20313 0,4.42383 l 12.5,12.5 c 1.22071,1.2207 3.20313,1.2207 4.42383,0 l 12.5,-12.5 c 1.2207,-1.2207 1.2207,-3.20312 0,-4.42383 -1.2207,-1.2207 -3.20312,-1.2207 -4.42383,0 l -7.1582,7.16797 z m -21.875,31.25 c -3.44727,0 -6.25,2.80273 -6.25,6.25 v 3.125 c 0,3.44727 2.80273,6.25 6.25,6.25 h 37.5 c 3.44727,0 6.25,-2.80273 6.25,-6.25 v -3.125 c 0,-3.44727 -2.80273,-6.25 -6.25,-6.25 h -9.91211 l -4.42383,4.42383 c -2.4414,2.4414 -6.39648,2.4414 -8.83789,0 L 39.82763,46.875 Z m 35.9375,10.15625 c -1.29883,0 -2.34375,-1.04492 -2.34375,-2.34375 0,-1.29883 1.04492,-2.34375 2.34375,-2.34375 1.29883,0 2.34375,1.04492 2.34375,2.34375 0,1.29883 -1.04492,2.34375 -2.34375,2.34375 z"
19
     id="path16036"
20
     style="fill:#000000;fill-opacity:1;stroke-width:0.0976562" />
21
</svg>
122
A www/images/logo/icon.png
Binary file
A www/images/logo/icon.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<svg
3
   height="493.14542"
4
   viewBox="0 0 500.05118 493.14542"
5
   width="500.05118"
6
   version="1.1"
7
   id="svg37"
8
   sodipodi:docname="logo-icon.svg"
9
   inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)"
10
   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
11
   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
12
   xmlns="http://www.w3.org/2000/svg"
13
   xmlns:svg="http://www.w3.org/2000/svg"
14
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
15
   xmlns:cc="http://creativecommons.org/ns#"
16
   xmlns:dc="http://purl.org/dc/elements/1.1/">
17
  <sodipodi:namedview
18
     id="namedview18"
19
     pagecolor="#ffffff"
20
     bordercolor="#666666"
21
     borderopacity="1.0"
22
     inkscape:showpageshadow="2"
23
     inkscape:pageopacity="0.0"
24
     inkscape:pagecheckerboard="0"
25
     inkscape:deskcolor="#d1d1d1"
26
     showgrid="false"
27
     inkscape:zoom="2.1352728"
28
     inkscape:cx="250.3193"
29
     inkscape:cy="246.57271"
30
     inkscape:current-layer="svg37" />
31
  <metadata
32
     id="metadata43">
33
    <rdf:RDF>
34
      <cc:Work
35
         rdf:about="">
36
        <dc:format>image/svg+xml</dc:format>
37
        <dc:type
38
           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
39
      </cc:Work>
40
    </rdf:RDF>
41
  </metadata>
42
  <defs
43
     id="defs41">
44
    <linearGradient
45
       id="a"
46
       gradientTransform="matrix(-8.7796153,42.985832,-42.985832,-8.7796153,514.83476,136.06192)"
47
       gradientUnits="userSpaceOnUse"
48
       x1="0.152358"
49
       x2="0.96880901"
50
       y1="-0.044911999"
51
       y2="-0.049470998">
52
      <stop
53
         offset="0"
54
         stop-color="#ec706a"
55
         id="stop2" />
56
      <stop
57
         offset="1"
58
         stop-color="#ecd980"
59
         id="stop4" />
60
    </linearGradient>
61
  </defs>
62
  <g
63
     id="g485"
64
     transform="matrix(2.5605898,1.4612315,-1.4612315,2.5605898,-947.38048,-777.17055)">
65
    <path
66
       style="fill:url(#a);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.226;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
67
       paint-order="stroke"
68
       d="m 496.76229,150.80474 c -4.25368,20.68081 3.28191,25.95476 3.28191,25.95476 v 0 c 0,0 3.00963,-13.19543 8.64082,-10.76172 v 0 c 4.83401,2.08299 1.12516,10.97002 1.12516,10.97002 v 0 c 0,0 31.78993,-30.5076 7.60484,-40.99434 v 0 c 0,0 -5.30287,-2.76791 -10.69842,-0.65209 v 0 c -3.94735,1.54891 -7.94375,5.71058 -9.95431,15.48337"
69
       stroke-linecap="round"
70
       id="path14-3" />
71
    <path
72
       d="m 530.80335,138.63592 -10.99206,-16.95952 1.75995,-6.49966 10.01483,2.71233 z"
73
       fill="#126d95"
74
       id="path9" />
75
    <path
76
       d="m 533.0598,112.36676 -0.91739,3.38458 -9.99361,-2.70665 0.91739,-3.38458 z"
77
       fill="#126d95"
78
       id="path11" />
79
    <g
80
       fill="#51a9cf"
81
       id="g19"
82
       transform="translate(-295.50101,-692.52836)">
83
      <path
84
         d="m 834.01973,741.0381 c -1.68105,0.0185 -3.22054,1.13771 -3.68367,2.84981 -0.56186,2.07405 0.665,4.21099 2.73743,4.77241 l -13.96475,51.52944 -9.99361,-2.70665 c 8.36013,-31.46487 4.99411,-51.98144 4.99411,-51.98144 14.99782,-11.92097 23.67,-25.56577 27.63101,-32.97331 z"
85
         id="path13" />
86
      <path
87
         d="m 818.56767,802.18881 -0.9174,3.38458 -10.03996,-2.72957 0.91314,-3.37522 z"
88
         id="path15" />
89
      <path
90
         d="m 817.07405,807.70594 -1.75995,6.49966 -18.03534,9.08805 9.78412,-18.31044 z"
91
         id="path17" />
92
    </g>
93
    <path
94
       d="m 540.69709,49.12083 7.72577,-28.52932 c -0.3195,8.40427 0.28451,24.55036 7.21678,42.41047 0,0 -11.89603,16.50235 -21.99788,47.3763 l -10.03442,-2.71758 13.96533,-51.5284 c 2.08221,0.56405 4.21039,-0.66603 4.77182,-2.73844 0.45427,-1.67248 -0.26571,-3.38317 -1.64739,-4.27302"
95
       fill="#126d95"
96
       id="path21" />
97
    <text
98
       transform="translate(-295.73751,-689.6407)"
99
       id="text25" />
100
  </g>
101
</svg>
1102
A www/images/logo/title.svg
1
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
2
<!-- Created with Inkscape (http://www.inkscape.org/) -->
3
4
<svg
5
   width="300"
6
   height="71.784302"
7
   viewBox="0 0 79.374996 18.99293"
8
   version="1.1"
9
   id="svg1"
10
   xmlns:xlink="http://www.w3.org/1999/xlink"
11
   xmlns="http://www.w3.org/2000/svg"
12
   xmlns:svg="http://www.w3.org/2000/svg">
13
  <defs
14
     id="defs1">
15
    <linearGradient
16
       xlink:href="#a"
17
       id="linearGradient347"
18
       gradientUnits="userSpaceOnUse"
19
       gradientTransform="matrix(-5.2145621,25.530992,-25.530992,-5.2145621,762.29957,221.94944)"
20
       x1="0.152358"
21
       y1="-0.044911999"
22
       x2="0.96880901"
23
       y2="-0.049470998" />
24
    <linearGradient
25
       id="a"
26
       gradientTransform="matrix(-5.2145621,25.530992,-25.530992,-5.2145621,762.29957,221.94944)"
27
       gradientUnits="userSpaceOnUse"
28
       x1="0.152358"
29
       x2="0.96880901"
30
       y1="-0.044911999"
31
       y2="-0.049470998">
32
      <stop
33
         offset="0"
34
         stop-color="#ec706a"
35
         id="stop2" />
36
      <stop
37
         offset="1"
38
         stop-color="#ecd980"
39
         id="stop4" />
40
    </linearGradient>
41
  </defs>
42
  <g
43
     id="layer1"
44
     transform="matrix(0.76997495,0,0,0.76997495,-41.151955,-104.91711)">
45
    <g
46
       id="g3650"
47
       transform="matrix(0.26458333,0,0,0.26458333,-70.48435,95.775023)">
48
      <path
49
         style="fill:url(#linearGradient347);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:0.72817;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
50
         paint-order="stroke"
51
         d="m 751.56561,230.70578 c -2.52643,12.28316 1.94926,15.41557 1.94926,15.41557 v 0 c 0,0 1.78754,-7.83729 5.13213,-6.39182 v 0 c 2.87111,1.23717 0.66827,6.51553 0.66827,6.51553 v 0 c 0,0 18.8813,-18.11967 4.51682,-24.34816 v 0 c 0,0 -3.14959,-1.64397 -6.35422,-0.3873 v 0 c -2.34448,0.91995 -4.71811,3.39174 -5.91226,9.19618"
52
         stroke-linecap="round"
53
         id="path14" />
54
      <path
55
         d="m 771.78395,223.47824 -6.52862,-10.07293 1.0453,-3.86041 5.94821,1.61096 z"
56
         fill="#126d95"
57
         id="path9"
58
         style="stroke-width:0.59394" />
59
      <path
60
         d="m 773.12415,207.87594 -0.54488,2.01024 -5.9356,-1.60759 0.54487,-2.01024 z"
61
         fill="#126d95"
62
         id="path11"
63
         style="stroke-width:0.59394" />
64
      <g
65
         fill="#51a9cf"
66
         id="g19"
67
         transform="matrix(0.5939397,0,0,0.5939397,281.00899,-270.18322)">
68
        <path
69
           d="m 834.01973,741.0381 c -1.68105,0.0185 -3.22054,1.13771 -3.68367,2.84981 -0.56186,2.07405 0.665,4.21099 2.73743,4.77241 l -13.96475,51.52944 -9.99361,-2.70665 c 8.36013,-31.46487 4.99411,-51.98144 4.99411,-51.98144 14.99782,-11.92097 23.67,-25.56577 27.63101,-32.97331 z"
70
           id="path13" />
71
        <path
72
           d="m 818.56767,802.18881 -0.9174,3.38458 -10.03996,-2.72957 0.91314,-3.37522 z"
73
           id="path15" />
74
        <path
75
           d="m 817.07405,807.70594 -1.75995,6.49966 -18.03534,9.08805 9.78412,-18.31044 z"
76
           id="path17" />
77
      </g>
78
      <path
79
         d="m 777.66024,170.31167 4.58864,-16.94469 c -0.18977,4.99163 0.16898,14.58143 4.28633,25.18926 0,0 -7.06553,9.8014 -13.06542,28.13866 l -5.95984,-1.61407 8.29457,-30.60477 c 1.23671,0.33502 2.50072,-0.39558 2.83417,-1.62646 0.26981,-0.99336 -0.15781,-2.0094 -0.97845,-2.53792"
80
         fill="#126d95"
81
         id="path21"
82
         style="stroke-width:0.59394" />
83
    </g>
84
    <g
85
       style="font-style:italic;font-weight:800;font-size:133.333px;font-family:'Merriweather Sans';letter-spacing:0;word-spacing:0;fill:#51a9cf"
86
       id="g35"
87
       transform="matrix(0.15714654,0,0,0.15714654,50.302906,133.11748)">
88
      <text
89
         x="16.133343"
90
         y="130.6234"
91
         id="text29"><tspan
92
           x="16.133343"
93
           y="130.6234"
94
           id="tspan27">KeenWr</tspan></text>
95
      <text
96
         x="552.53137"
97
         y="130.6234"
98
         id="text33"><tspan
99
           x="552.53137"
100
           y="130.6234"
101
           id="tspan31">te</tspan></text>
102
    </g>
103
  </g>
104
</svg>
1105
A www/index.html
1
<!DOCTYPE html>
2
<html lang="en">
3
<head>
4
  <title>KeenWrite</title>
5
  <meta charset="UTF-8">
6
  <meta name="description" content="cross-platform, open-source desktop editor">
7
  <meta name="keywords" content="markdown, text, editor, software">
8
  <meta name="robots" content="index, follow">
9
  <style>
10
/* ************************************************************************ 
11
 *
12
 * Page
13
 *
14
 * ************************************************************************ */
15
:root {
16
  --accent-colour: #ec706a;
17
  --link-colour: #8cc6de;
18
}
19
20
body {
21
  /* Ensure the page doesn't extend full screen on large monitors. */
22
	max-width: 1000px; 
23
	margin: 0 auto;
24
25
  background: #363636;
26
  color: #eaeaea;
27
}
28
29
/* Text alignment. */
30
header, nav, footer {
31
  text-align: center;
32
}
33
34
/* ************************************************************************ 
35
 * Header
36
 * ************************************************************************ */
37
38
header {
39
  /* Avoid being flush with top of page, put space between the title and
40
   * the download buttons, ensure any text won't be flush with edges.
41
   */
42
  margin: 2em;
43
}
44
45
header p {
46
  line-height: 1.5em;
47
}
48
49
/* Ensure the application title is large enough. */
50
header > img.title {
51
  width: 100%;
52
  height: 72pt;
53
}
54
55
/* ************************************************************************ 
56
 * Download buttons
57
 * ************************************************************************ */
58
59
main {
60
  /* Arrange the buttons in a responsive, 2 x 2 grid. */
61
  display: grid;
62
  grid-template-rows: 1fr 1fr;
63
  grid-template-columns: max-content max-content;
64
  justify-content: center;
65
}
66
67
/* Make hyperlinks resemble buttons. */
68
a.download {
69
  display: inline-block;
70
71
  /* Separate the buttons from one another. */
72
  margin-top: 2em;
73
  margin-left: 1em;
74
  margin-right: 1em;
75
76
  /* Fancy buttons. */
77
  border-radius: 1em;
78
  background: var( --accent-colour );
79
}
80
81
a.download:hover {
82
  background: var( --link-colour );
83
}
84
85
img.download {
86
  /* Replace icon black with another colour. */
87
  filter: invert(6%)
88
    sepia(58%) saturate(857%) hue-rotate(158deg) brightness(91%) contrast(91%);
89
}
90
91
/* ************************************************************************ 
92
 * Navigation
93
 * ************************************************************************ */
94
95
nav {
96
  /* Don't crowd navigation links against the download buttons. */
97
  margin-top: 4em;
98
}
99
100
nav ul {
101
  /* Remove the bullets */
102
  list-style: none;
103
  padding: 0;
104
  margin: 0;
105
}
106
107
nav li {
108
  /* Put navigation items along a single line. */
109
  display: inline;
110
}
111
112
nav li:not(:last-child)::after {
113
  /* Separate navigation items with a bar. */
114
  content: " | ";
115
}
116
117
nav a, nav a:visited {
118
  color: var( --link-colour );
119
}
120
121
nav a:link:hover, nav a:visited:hover {
122
  color: var( --accent-colour );
123
}
124
125
/* ************************************************************************ 
126
 * Footer
127
 * ************************************************************************ */
128
129
/* Align and center footer along bottom of page. */
130
footer {
131
  position: fixed;
132
  bottom: 1em;
133
  left: 50%;
134
  transform: translateX(-50%);
135
  width: 100%;
136
}
137
  </style>
138
</head>
139
<body>
140
<header>
141
  <img src="images/logo/title.svg" alt="KeenWrite" class="title">
142
  <p>
143
  A free, cross-platform, open-source desktop text editor.
144
  </p>
145
</header>
146
<main>
147
  <a href="https://gitlab.com/DaveJarvis/KeenWrite/-/releases/permalink/latest/keenwrite.bin"
148
     class="download"
149
     title="Download for 64-bit Linux (x86)"
150
     aria-label="Download for Linux"><img
151
       src="images/icons/linux.svg"
152
       alt="Download for Linux"
153
       class="download"></a>
154
  <a href="https://gitlab.com/DaveJarvis/KeenWrite/-/releases/permalink/latest/keenwrite.jar"
155
     class="download"
156
     title="Download for Java virtual machine"
157
     aria-label="Download for Java"><img
158
       src="images/icons/java.svg"
159
       alt="Download for Java"
160
       class="download"></a>
161
  <a href="https://gitlab.com/DaveJarvis/KeenWrite/-/releases/permalink/latest/keenwrite.exe"
162
     class="download"
163
     title="Download for 64-bit Windows (x86)"
164
     aria-label="Download for Windows"><img
165
       src="images/icons/windows.svg"
166
       alt="Download for Windows"
167
       class="download"></a>
168
  <a href="https://gitlab.com/DaveJarvis/KeenWrite/-/releases/permalink/latest/keenwrite.app"
169
     class="download"
170
     title="Download for 64-bit MacOS (x86)"
171
     aria-label="Download for MacOS"><img
172
       src="images/icons/apple.svg"
173
       alt="Download for MacOS"
174
       class="download"></a>
175
</main>
176
<nav>
177
  <ul>
178
    <li><a href="https://www.youtube.com/playlist?list=PLB-WIt1cZYLm1MMx2FBG9KWzPIoWZMKu_">Tutorials</a></li>
179
    <li><a href="https://gitlab.com/DaveJarvis/KeenWrite">Sources</a></li>
180
    <li><a href="https://gitlab.com/DaveJarvis/KeenWrite/issues">Issues</a></li>
181
    <li><a href="https://gitlab.com/DaveJarvis/KeenWrite/-/blob/main/docs/README.md">Documentation</a></li>
182
  </ul>
183
</nav>
184
<footer>
185
  &copy; 2023, White Magic Software, Ltd.
186
</footer>
187
</body>
188
</html>
189
1190