diff --git a/.github/workflows/benchmarks-jmh.yml b/.github/workflows/benchmarks-jmh.yml index a5f909a4..505d97ed 100644 --- a/.github/workflows/benchmarks-jmh.yml +++ b/.github/workflows/benchmarks-jmh.yml @@ -41,6 +41,9 @@ jobs: java-version: '17' cache: maven + - name: Install graph-compose-fonts (the benchmarks render with the bundled families) + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact (graph-compose + test-jar) run: ./mvnw -B -ntp -DskipTests install -pl . diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c2cf8a7d..f173235b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -99,6 +99,12 @@ jobs: java-version: '17' cache: maven + - name: Install graph-compose-fonts (consumed by the examples / benchmarks modules) + # The engine itself does not depend on the fonts artifact, but the + # examples and benchmarks modules render with the bundled families, so + # install graph-compose-fonts into the local repo before building them. + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact run: ./mvnw -B -ntp -DskipTests install -pl . @@ -202,6 +208,12 @@ jobs: java-version: '17' cache: maven + - name: Install graph-compose-fonts (consumed by the examples / benchmarks modules) + # The engine itself does not depend on the fonts artifact, but the + # examples and benchmarks modules render with the bundled families, so + # install graph-compose-fonts into the local repo before building them. + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact run: ./mvnw -B -ntp -DskipTests install -pl . @@ -264,6 +276,12 @@ jobs: benchmark-current-speed-${{ github.ref_name }}- benchmark-current-speed- + - name: Install graph-compose-fonts (consumed by the examples / benchmarks modules) + # The engine itself does not depend on the fonts artifact, but the + # examples and benchmarks modules render with the bundled families, so + # install graph-compose-fonts into the local repo before building them. + run: ./mvnw -B -ntp -f fonts/pom.xml -DskipTests install + - name: Install root artifact run: ./mvnw -B -ntp -DskipTests install -pl . diff --git a/.github/workflows/publish-fonts.yml b/.github/workflows/publish-fonts.yml new file mode 100644 index 00000000..b85dfb52 --- /dev/null +++ b/.github/workflows/publish-fonts.yml @@ -0,0 +1,67 @@ +name: Publish fonts to Maven Central + +# Publishes the graph-compose-fonts companion artifact to Maven Central, +# independently of the engine. The bundled Google fonts change rarely, so +# they release on their OWN tag line (fonts-v*) — pushing an engine v* tag +# never touches them, and re-publishing fonts does not require an engine +# release. This mirrors publish.yml (Track D4) but targets fonts/pom.xml. +# +# Tagging: fonts-vX.Y.Z (e.g. fonts-v1.0.0). The fonts artifact carries its +# own independent version (see fonts/pom.xml) — keep it in sync with the tag. +# +# Human prerequisites are identical to publish.yml (GPG key + Central token +# secrets). See docs/contributing/release-process.md for the runbook. + +on: + push: + tags: + - 'fonts-v*' + workflow_dispatch: + inputs: + tag: + description: 'Existing fonts-v*-prefixed tag to (re-)publish' + required: true + type: string + +permissions: + contents: read + +jobs: + publish-fonts: + name: Publish ${{ github.ref_name }} to Maven Central + runs-on: ubuntu-latest + # Only ship plain semver tags (fonts-vX.Y.Z) to Central; pre-release + # suffixes ship nowhere from here. + if: | + github.event_name == 'workflow_dispatch' || + (!contains(github.ref, '-rc') && !contains(github.ref, '-alpha') && !contains(github.ref, '-beta') && !contains(github.ref, '-snapshot')) + env: + JAVA_TOOL_OPTIONS: -Djava.awt.headless=true + + steps: + - name: Check out repository at tag + uses: actions/checkout@v6 + with: + ref: ${{ github.event.inputs.tag || github.ref }} + + - name: Set up Temurin JDK 17 with Central credentials and GPG key + uses: actions/setup-java@v5 + with: + distribution: temurin + java-version: '17' + cache: maven + server-id: central + server-username: CENTRAL_USERNAME + server-password: CENTRAL_TOKEN + gpg-private-key: ${{ secrets.MAVEN_GPG_PRIVATE_KEY }} + gpg-passphrase: MAVEN_GPG_PASSPHRASE + + - name: Publish fonts to Maven Central + # Activates the fonts module's release profile (sources + javadoc + + # gpg sign + central-publishing) and flips gpg.skip=false. Blocks + # until Sonatype's validator confirms validation. + run: ./mvnw -B -ntp -f fonts/pom.xml -P release -Dgpg.skip=false deploy + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 4d3c4580..f7241141 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -86,13 +86,27 @@ jobs: # but failing here surfaces a clearer error. run: ./mvnw -B -ntp clean verify -pl . - - name: Publish to Maven Central + - name: Publish engine to Maven Central # Activates the release profile (sources + javadoc + gpg sign + # central-publishing) and flips gpg.skip=false. The deploy # phase invokes central-publishing-maven-plugin's upload goal # which blocks until Sonatype's validator confirms validation. + # The release profile also disables the tests-jar execution, so + # only the main + sources + javadoc + pom artefacts are uploaded. run: ./mvnw -B -ntp -P release -DskipTests -Dgpg.skip=false deploy env: CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} + + - name: Publish bundle to Maven Central + # The graph-compose-bundle convenience aggregate pins this engine + # version + a compatible graph-compose-fonts version. It tracks the + # engine line, so it ships on the same v* tag. pom-packaged → only a + # signed .pom is uploaded; engine + fonts resolve from the local repo + # (installed by the engine deploy above and the fonts step earlier). + run: ./mvnw -B -ntp -f bundle/pom.xml -P release -DskipTests -Dgpg.skip=false deploy + env: + CENTRAL_USERNAME: ${{ secrets.CENTRAL_USERNAME }} + CENTRAL_TOKEN: ${{ secrets.CENTRAL_TOKEN }} + MAVEN_GPG_PASSPHRASE: ${{ secrets.MAVEN_GPG_PASSPHRASE }} diff --git a/CHANGELOG.md b/CHANGELOG.md index 02945e00..5e1da015 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -237,6 +237,32 @@ Entries land here as they merge. node-label settings survive the toggle, `debug(none())` reliably disables everything — and disabled debug output stays byte-identical. +### Build & distribution + +- **Bundled Google fonts moved to a separate, independently-versioned + artifact** (`io.github.demchaav:graph-compose-fonts`). **Breaking for + consumers who use the bundled families.** The ~18 MB of curated Google fonts + no longer ship inside the `graph-compose` jar, so an engine upgrade never + re-downloads them and the engine artifact drops from ~40 MB to a few MB. The + public `FontName` constants and the `DefaultFonts` catalog are unchanged + (source- and binary-compatible), and the classpath layout `fonts/google/...` + is preserved byte-for-byte. To keep the bundled fonts, add + `io.github.demchaav:graph-compose-fonts` (its own version line, starting at + `1.0.0`) to your build, or depend on the new "batteries-included" + `io.github.demchaav:graph-compose-bundle` (engine + fonts at compatible + versions). With neither on the classpath, standard-14 documents render + unchanged and requesting a bundled family fails fast with a message that + names the missing dependency. See + [docs/migration/v1.8.0-fonts.md](docs/migration/v1.8.0-fonts.md). +- **Leaner Maven Central publication.** The release build no longer attaches or + uploads the `-tests` classifier jar (it stays a local-only build aid for the + benchmarks module), and with the fonts gone the `-sources.jar` no longer + carries font binaries either. The published artifact set is now just the + engine bytecode plus the small template assets. +- **`graph-compose-fonts` releases on its own `fonts-v*` tag** via a dedicated + publish workflow, so the font set ships only when it actually changes, + independent of the engine's `v*` release cadence. + ### Bug fixes - **A stray non-drawing element no longer breaks a whole SVG icon.** A diff --git a/README.md b/README.md index 8940ff26..08e35959 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,25 @@ Sits between **iText** (low-level page primitives) and **JasperReports** (XML-te dependencies { implementation("io.github.demchaav:graph-compose:1.7.1") } ``` +> **Bundled fonts (from v1.8.0).** The curated Google fonts no longer ship +> inside the engine jar — they live in an independently-versioned +> companion artifact so an engine upgrade never re-downloads ~18 MB of +> fonts. Pure-text and standard-14 documents need nothing extra; to use the +> bundled families, add: +> +> ```xml +> +> io.github.demchaav +> graph-compose-fonts +> 1.0.0 +> +> ``` +> +> Prefer a single "batteries-included" coordinate? Depend on +> `io.github.demchaav:graph-compose-bundle` (same version as `graph-compose` +> above) to pull the engine + fonts together. Full details and upgrade steps: +> the [v1.8.0 fonts migration note](./docs/migration/v1.8.0-fonts.md). + > **Distribution** — Maven Central is the canonical channel from **v1.6.6** onwards > (`io.github.demchaav:graph-compose:`). Hosted Javadocs auto-publish to > [javadoc.io/doc/io.github.demchaav/graph-compose](https://javadoc.io/doc/io.github.demchaav/graph-compose) diff --git a/aggregator/pom.xml b/aggregator/pom.xml index 34675b2f..bac1dc18 100644 --- a/aggregator/pom.xml +++ b/aggregator/pom.xml @@ -22,8 +22,38 @@ mvn -f aggregator/pom.xml versions:set -DnewVersion=X # bump all modules + + + true + + 1.0.0 + + + .. + ../fonts + ../bundle ../examples ../benchmarks diff --git a/benchmarks/pom.xml b/benchmarks/pom.xml index b48aff3a..09f4afc6 100644 --- a/benchmarks/pom.xml +++ b/benchmarks/pom.xml @@ -54,6 +54,18 @@ ${graphcompose.version} + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + + + io.github.demchaav + graph-compose-bundle + + 1.7.1 + pom + + GraphCompose Bundle + Batteries-included aggregate: the GraphCompose engine plus the bundled Google fonts at compatible versions. + https://github.com/DemchaAV/GraphCompose + + + + MIT License + https://opensource.org/licenses/MIT + repo + + + + + + DemchaAV + Artem Demchyshyn + demchishynartem@gmail.com + https://github.com/DemchaAV + + Lead Developer + Architect + + UTC 0 + + + + + scm:git:https://github.com/DemchaAV/GraphCompose.git + scm:git:ssh://git@github.com/DemchaAV/GraphCompose.git + https://github.com/DemchaAV/GraphCompose/tree/main + + + + UTF-8 + + + 1.0.0 + + 3.2.8 + 0.10.0 + + true + + + + + + io.github.demchaav + graph-compose + ${project.version} + + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + + + + + + + release + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + ${gpg.skip} + + --pinentry-mode + loopback + + + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.plugin.version} + true + + central + false + validated + + + + + + + diff --git a/docs/contributing/release-process.md b/docs/contributing/release-process.md index cbdd7eef..83d5f57f 100644 --- a/docs/contributing/release-process.md +++ b/docs/contributing/release-process.md @@ -46,7 +46,7 @@ The shell setup and exact PowerShell commands live in the `graphcompose-release- The script's Step 1–4 mutates these. The agent only confirms the *current state is one the script can transition from*: -- [ ] The version lives in four sites that must stay in lockstep: the standalone library `pom.xml`, the reactor `aggregator/pom.xml`, and the inherited `` version of `examples/pom.xml` and `benchmarks/pom.xml` (the children no longer pin their own `` — they inherit from `graph-compose-build`, and declare `${project.version}` rather than a literal). All four read the same value: either the in-flight develop value or already the target. `VersionConsistencyGuardTest` asserts they agree; `cut-release.ps1` Step 1 moves all four (plus the README) together. Bumping by hand outside the script — or `mvn versions:set` on a single pom — is what previously left benchmarks on the prior release; if you must bump outside the script, use `mvn -f aggregator/pom.xml versions:set -DnewVersion=`. +- [ ] The engine version lives in **five** sites that must stay in lockstep: the standalone library `pom.xml`, the reactor `aggregator/pom.xml`, the inherited `` version of `examples/pom.xml` and `benchmarks/pom.xml` (the children no longer pin their own `` — they inherit from `graph-compose-build`, and declare `${project.version}` rather than a literal), and the standalone `bundle/pom.xml` (`graph-compose-bundle`, whose `graph-compose` dep is `${project.version}`). All five read the same value: either the in-flight develop value or already the target. `VersionConsistencyGuardTest` asserts they agree; `cut-release.ps1` Step 1 moves all five (plus the README) together. Note `mvn -f aggregator/pom.xml versions:set` only rewrites the aggregator + its inheriting children — it does **not** touch the standalone `pom.xml` or `bundle/pom.xml`, so prefer the script. **`fonts/pom.xml` (`graph-compose-fonts`) is intentionally NOT in this set** — it carries an independent version line (see §2.D) and must be free to diverge from the engine. - [ ] `examples/src/main/java/com/demcha/examples/support/ShowcaseMetadata.java` `GH_BASE` points to `/blob/develop`. The script flips it to `/blob/v` and regenerates `web/examples.json`. ### E. Tag must not exist @@ -60,11 +60,11 @@ The script's Step 1–4 mutates these. The agent only confirms the *current stat Running `pwsh ./scripts/cut-release.ps1 -Version ` performs: 1. **Pre-flight** — re-checks all of A above (branch, clean tree, in-sync, no existing tag). -2. **Bump versions** to `` across the library `pom.xml`, the `aggregator/pom.xml`, the inherited `` refs in `examples/pom.xml` and `benchmarks/pom.xml`, **and** the README Maven + Gradle install snippets — all in one pass, so `VersionConsistencyGuardTest` stays green at Step 5. +2. **Bump versions** to `` across the library `pom.xml`, the `aggregator/pom.xml`, the inherited `` refs in `examples/pom.xml` and `benchmarks/pom.xml`, the standalone `bundle/pom.xml` (`graph-compose-bundle`), **and** the README Maven + Gradle install snippets — all in one pass, so `VersionConsistencyGuardTest` stays green at Step 5. (`fonts/pom.xml` is left alone — it versions independently; see §2.D.) 3. **Date the CHANGELOG** — flips `## v — Planned` to `## v`. 4. **Switch ShowcaseMetadata GH_BASE** from `/blob/develop` to `/blob/v` and regenerate `web/examples.json`. 5. **`mvnw verify -pl .`** — full sanity build (skip with `-SkipVerify` only if you just ran it). -6. **Commit** as `Release v`. Files committed: the library `pom.xml`, `aggregator/pom.xml`, `examples/pom.xml`, `benchmarks/pom.xml`, `README.md` (install snippets), `CHANGELOG.md`, `ShowcaseMetadata.java`, `web/examples.json`, `web/index.html`, and `web/showcase/`. `examples/README.md` and any other docs are NOT touched by the script — fix those pre-release. +6. **Commit** as `Release v`. Files committed: the library `pom.xml`, `aggregator/pom.xml`, `examples/pom.xml`, `benchmarks/pom.xml`, `bundle/pom.xml`, `README.md` (install snippets), `CHANGELOG.md`, `ShowcaseMetadata.java`, `web/examples.json`, `web/index.html`, and `web/showcase/`. `examples/README.md` and any other docs are NOT touched by the script — fix those pre-release. 7. **Annotated tag** `v` (`git tag -a -m "Release v"`). 8. **Push** `develop` and the tag to `origin` (skip with `-SkipPush`). @@ -100,6 +100,38 @@ Run within 1 hour of the tag push. Independent steps can run in parallel. The release is **done** only when steps 1–7 are all green; step 9 adds Maven Central availability once the D-track of v1.6.6 has shipped. +### 2.D The fonts artifact and the bundle (since v1.8.0) + +The bundled Google fonts ship as a **separate, independently-versioned** +artifact, `io.github.demchaav:graph-compose-fonts` (under `fonts/`), and there +is a convenience aggregate `io.github.demchaav:graph-compose-bundle` (under +`bundle/`). + +- **The bundle tracks the engine line.** `cut-release.ps1` Step 1 bumps + `bundle/pom.xml` in lockstep with the engine (its `` and, via + `${project.version}`, its `graph-compose` dependency). `VersionConsistencyGuardTest` + enforces `bundle == engine`. The engine `v` tag's + [`publish.yml`](../../.github/workflows/publish.yml) deploys the engine **and** + the bundle. Nothing extra to do for the bundle at release time. +- **The fonts artifact is NOT bumped by the engine release.** It carries its own + version line (started at `1.0.0`) and is bumped **only when the font set + changes**. `cut-release.ps1` deliberately does not touch `fonts/pom.xml`, and + the version guard deliberately does not require it to equal the engine version. +- **Cutting a fonts release** (only when fonts change): bump `fonts/pom.xml` + ``, push a `fonts-vX.Y.Z` tag. That tag triggers + [`publish-fonts.yml`](../../.github/workflows/publish-fonts.yml), which deploys + only `graph-compose-fonts` to Central. Then bump + `` in `aggregator/pom.xml` (inherited by + examples + benchmarks) and `bundle/pom.xml` to the new fonts version so those + consumers pin it. The engine `pom.xml` does **not** carry this property — the + engine has no dependency on the fonts artifact (its tests read the fonts from + the sibling module's source via ``). +- **No fonts bootstrap for the engine.** Because the engine does not depend on + the fonts artifact, `./mvnw clean verify -pl .` builds standalone without the + fonts jar being published or installed. Only the consumer modules (examples, + benchmarks) need `graph-compose-fonts` in the local repo — their CI jobs run + `./mvnw -f fonts/pom.xml install` before building. + --- ## 2.C One-time Maven Central setup (maintainer) diff --git a/docs/font-coverage.md b/docs/font-coverage.md index 08a25147..6ae5c24e 100644 --- a/docs/font-coverage.md +++ b/docs/font-coverage.md @@ -57,9 +57,16 @@ for the full set (`dot`, `arrow`, `chevron`, `diamond`, `star`, `checkmark`, ### 2. Use a font that covers the range -`FontName.JETBRAINS_MONO` is bundled for monospaced code and data. For broader -Unicode coverage, register a custom font family that includes the glyphs you -need and select it through `DocumentTextStyle.fontName(...)`. +The curated Google families — `FontName.JETBRAINS_MONO` for monospaced code and +data, plus the serif / sans / Thai families with broader Unicode coverage — ship +in the separate `io.github.demchaav:graph-compose-fonts` artifact since v1.8.0. +Add it (or the `graph-compose-bundle` aggregate) to use them; without it on the +classpath the engine renders with the standard-14 fonts only, and asking for a +bundled family fails fast with a message naming the dependency. See the +[v1.8.0 fonts migration note](migration/v1.8.0-fonts.md). + +For glyphs no bundled family covers, register a custom font family that includes +them and select it through `DocumentTextStyle.fontName(...)`. ### 3. Stay inside WinAnsi diff --git a/docs/migration/v1.8.0-fonts.md b/docs/migration/v1.8.0-fonts.md new file mode 100644 index 00000000..f6903bc2 --- /dev/null +++ b/docs/migration/v1.8.0-fonts.md @@ -0,0 +1,86 @@ +# Migration: bundled fonts split out in v1.8.0 + +In v1.8.0 the curated Google font binaries that used to ship inside the +`graph-compose` jar moved into a separate, independently-versioned artifact: + +| Artifact | Coordinate | Version line | +|---|---|---| +| Engine (lean) | `io.github.demchaav:graph-compose` | `1.8.x` | +| Bundled fonts | `io.github.demchaav:graph-compose-fonts` | own line, from `1.0.0` | +| Batteries-included aggregate | `io.github.demchaav:graph-compose-bundle` | tracks the engine | + +## Why + +The fonts were ~18 MB and were re-shipped on **every** engine release (and +duplicated again inside the `-sources.jar`), even though the font set changes +very rarely. Splitting them out keeps the engine artifact small, stops an engine +upgrade from re-downloading fonts, and lets the fonts release on their own +cadence. + +## What stays the same + +- The public `FontName` constants (`FontName.LATO`, `FontName.POPPINS`, …) and + the `DefaultFonts` catalog are **unchanged** — your code compiles and links + without edits (source- and binary-compatible). +- The classpath resource layout (`fonts/google/{family}/{file}.ttf`) is + preserved byte-for-byte, so once `graph-compose-fonts` is on the classpath the + bundled families resolve exactly as before. +- Standard-14 PDF fonts (Helvetica, Times, Courier) are built into PDF and need + no artifact at all. + +## What you need to do + +Pick one: + +### Option A — keep using the bundled fonts (most common) + +Add the fonts artifact next to the engine: + +```xml + + io.github.demchaav + graph-compose + 1.8.0 + + + io.github.demchaav + graph-compose-fonts + 1.0.0 + +``` + +```kotlin +dependencies { + implementation("io.github.demchaav:graph-compose:1.8.0") + implementation("io.github.demchaav:graph-compose-fonts:1.0.0") +} +``` + +You now pin the two independently: bumping the engine does not change your fonts +version, and vice-versa. + +### Option B — one coordinate, batteries included + +Depend on the bundle, which pulls a compatible engine + fonts pair: + +```xml + + io.github.demchaav + graph-compose-bundle + 1.8.0 + +``` + +### Option C — standard-14 only / your own fonts + +If you only render with the standard-14 families or register your own fonts via +`FontFamilyDefinition`, you need neither extra artifact. Requesting a bundled +Google family without `graph-compose-fonts` on the classpath fails fast with an +`IllegalArgumentException` that names the missing dependency. + +## Notes + +- `graph-compose-fonts` carries its own version line and ships on a `fonts-v*` + git tag, separate from the engine's `v*` releases. +- The font binaries remain under the SIL Open Font License (each family bundles + its `OFL.txt`). diff --git a/docs/troubleshooting.md b/docs/troubleshooting.md index 4b08cdaa..067ef763 100644 --- a/docs/troubleshooting.md +++ b/docs/troubleshooting.md @@ -73,8 +73,8 @@ More: [examples/README](../examples/README.md). **Build fails copying fonts — `The cloud file provider is not running`.** The checkout lives in a cloud-synced folder (OneDrive / Dropbox / iCloud) -and the font resources under `src/main/resources/fonts/` are dehydrated -placeholders. Make sure the sync client is running and the files are +and the font resources under `fonts/src/main/resources/fonts/` (the +`graph-compose-fonts` module, since v1.8.0) are dehydrated placeholders. Make sure the sync client is running and the files are downloaded locally ("Always keep on this device"), or move the checkout outside the synced folder. diff --git a/examples/pom.xml b/examples/pom.xml index 0626462a..f75dcc5f 100644 --- a/examples/pom.xml +++ b/examples/pom.xml @@ -44,6 +44,18 @@ ${graphcompose.version} + + + io.github.demchaav + graph-compose-fonts + ${graphcompose.fonts.version} + + diff --git a/fonts/pom.xml b/fonts/pom.xml new file mode 100644 index 00000000..136d7a40 --- /dev/null +++ b/fonts/pom.xml @@ -0,0 +1,198 @@ + + + 4.0.0 + + + io.github.demchaav + graph-compose-fonts + 1.0.0 + + GraphCompose Fonts + Bundled Google font binaries for GraphCompose, packaged as an independently-versioned companion artifact. + https://github.com/DemchaAV/GraphCompose + + + + + MIT License + https://opensource.org/licenses/MIT + repo + + + SIL Open Font License 1.1 + https://openfontlicense.org + repo + Applies to the bundled font binaries under fonts/google/**; each family includes its own OFL.txt. + + + + + + DemchaAV + Artem Demchyshyn + demchishynartem@gmail.com + https://github.com/DemchaAV + + Lead Developer + Architect + + UTC 0 + + + + + scm:git:https://github.com/DemchaAV/GraphCompose.git + scm:git:ssh://git@github.com/DemchaAV/GraphCompose.git + https://github.com/DemchaAV/GraphCompose/tree/main + + + + UTF-8 + 17 + + 3.15.0 + 3.5.0 + 3.4.0 + 3.12.0 + 3.2.8 + 0.10.0 + + + true + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven.compiler.plugin.version} + + ${maven.compiler.release} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + + + + + + release + + + + org.apache.maven.plugins + maven-source-plugin + ${maven.source.plugin.version} + + + attach-sources + package + + jar-no-fork + + + + + fonts/** + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven.javadoc.plugin.version} + + + attach-javadocs + package + + jar + + + none + false + true + + + + + + org.apache.maven.plugins + maven-gpg-plugin + ${maven.gpg.plugin.version} + + + sign-artifacts + verify + + sign + + + ${gpg.skip} + + --pinentry-mode + loopback + + + + + + + org.sonatype.central + central-publishing-maven-plugin + ${central.publishing.plugin.version} + true + + central + false + validated + + + + + + + diff --git a/fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java b/fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java new file mode 100644 index 00000000..07f6f42d --- /dev/null +++ b/fonts/src/main/java/com/demcha/compose/fonts/GraphComposeFonts.java @@ -0,0 +1,44 @@ +package com.demcha.compose.fonts; + +/** + * Marker and metadata for the {@code graph-compose-fonts} companion artifact. + * + *

This artifact carries the bundled Google font binaries that the engine's + * {@code com.demcha.compose.font.DefaultFonts} catalog resolves from the + * classpath. The fonts were split out of the core {@code graph-compose} jar in + * the engine's v1.8.0 cycle so that the engine stays lean and the two release on + * independent cadences — upgrading the engine never re-downloads the fonts.

+ * + *

There is no API to call here: simply having this jar on the classpath makes + * the bundled families available. The font descriptors and the public + * {@code FontName} constants live in the engine, not in this module, so this + * class intentionally depends on nothing from the engine.

+ * + * @author Artem Demchyshyn + * @since 1.0.0 + */ +public final class GraphComposeFonts { + + /** + * Classpath resource prefix under which the bundled font families are + * packaged (for example {@code fonts/google/lato/Lato-Regular.ttf}). This + * layout is preserved byte-for-byte from the pre-split engine jar. + */ + public static final String RESOURCE_ROOT = "fonts/google/"; + + private GraphComposeFonts() { + } + + /** + * Reports whether the bundled font binaries are reachable on the current + * classpath. A {@code true} result means this artifact (or an equivalent + * resource set) is present and the engine's bundled Google families will + * resolve; {@code false} means only the standard-14 PDF fonts are available. + * + * @return {@code true} if the bundled font resources are on the classpath + */ + public static boolean isAvailable() { + return GraphComposeFonts.class.getClassLoader() + .getResource(RESOURCE_ROOT + "lato/Lato-Regular.ttf") != null; + } +} diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Bold.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Italic.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf b/fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf rename to fonts/src/main/resources/fonts/google/alegreyasans/AlegreyaSans-Regular.ttf diff --git a/src/main/resources/fonts/google/alegreyasans/OFL.txt b/fonts/src/main/resources/fonts/google/alegreyasans/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/alegreyasans/OFL.txt rename to fonts/src/main/resources/fonts/google/alegreyasans/OFL.txt diff --git a/src/main/resources/fonts/google/andika/Andika-Bold.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-Bold.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-Bold.ttf diff --git a/src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/andika/Andika-Italic.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-Italic.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-Italic.ttf diff --git a/src/main/resources/fonts/google/andika/Andika-Regular.ttf b/fonts/src/main/resources/fonts/google/andika/Andika-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/andika/Andika-Regular.ttf rename to fonts/src/main/resources/fonts/google/andika/Andika-Regular.ttf diff --git a/src/main/resources/fonts/google/andika/OFL.txt b/fonts/src/main/resources/fonts/google/andika/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/andika/OFL.txt rename to fonts/src/main/resources/fonts/google/andika/OFL.txt diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-Bold.ttf diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-Italic.ttf diff --git a/src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf b/fonts/src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf rename to fonts/src/main/resources/fonts/google/arsenal/Arsenal-Regular.ttf diff --git a/src/main/resources/fonts/google/arsenal/OFL.txt b/fonts/src/main/resources/fonts/google/arsenal/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/arsenal/OFL.txt rename to fonts/src/main/resources/fonts/google/arsenal/OFL.txt diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Bold.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Italic.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf b/fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf rename to fonts/src/main/resources/fonts/google/asapcondensed/AsapCondensed-Regular.ttf diff --git a/src/main/resources/fonts/google/asapcondensed/OFL.txt b/fonts/src/main/resources/fonts/google/asapcondensed/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/asapcondensed/OFL.txt rename to fonts/src/main/resources/fonts/google/asapcondensed/OFL.txt diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Bold.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Italic.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf b/fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf rename to fonts/src/main/resources/fonts/google/baijamjuree/BaiJamjuree-Regular.ttf diff --git a/src/main/resources/fonts/google/baijamjuree/OFL.txt b/fonts/src/main/resources/fonts/google/baijamjuree/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/baijamjuree/OFL.txt rename to fonts/src/main/resources/fonts/google/baijamjuree/OFL.txt diff --git a/src/main/resources/fonts/google/barlow/Barlow-Bold.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-Bold.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-Bold.ttf diff --git a/src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/barlow/Barlow-Italic.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-Italic.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-Italic.ttf diff --git a/src/main/resources/fonts/google/barlow/Barlow-Regular.ttf b/fonts/src/main/resources/fonts/google/barlow/Barlow-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/barlow/Barlow-Regular.ttf rename to fonts/src/main/resources/fonts/google/barlow/Barlow-Regular.ttf diff --git a/src/main/resources/fonts/google/barlow/OFL.txt b/fonts/src/main/resources/fonts/google/barlow/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/barlow/OFL.txt rename to fonts/src/main/resources/fonts/google/barlow/OFL.txt diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Bold.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Italic.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf b/fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf rename to fonts/src/main/resources/fonts/google/barlowcondensed/BarlowCondensed-Regular.ttf diff --git a/src/main/resources/fonts/google/barlowcondensed/OFL.txt b/fonts/src/main/resources/fonts/google/barlowcondensed/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/barlowcondensed/OFL.txt rename to fonts/src/main/resources/fonts/google/barlowcondensed/OFL.txt diff --git a/src/main/resources/fonts/google/carlito/Carlito-Bold.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-Bold.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-Bold.ttf diff --git a/src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/carlito/Carlito-Italic.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-Italic.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-Italic.ttf diff --git a/src/main/resources/fonts/google/carlito/Carlito-Regular.ttf b/fonts/src/main/resources/fonts/google/carlito/Carlito-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/carlito/Carlito-Regular.ttf rename to fonts/src/main/resources/fonts/google/carlito/Carlito-Regular.ttf diff --git a/src/main/resources/fonts/google/carlito/OFL.txt b/fonts/src/main/resources/fonts/google/carlito/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/carlito/OFL.txt rename to fonts/src/main/resources/fonts/google/carlito/OFL.txt diff --git a/src/main/resources/fonts/google/cousine/Cousine-Bold.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-Bold.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-Bold.ttf diff --git a/src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/cousine/Cousine-Italic.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-Italic.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-Italic.ttf diff --git a/src/main/resources/fonts/google/cousine/Cousine-Regular.ttf b/fonts/src/main/resources/fonts/google/cousine/Cousine-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/cousine/Cousine-Regular.ttf rename to fonts/src/main/resources/fonts/google/cousine/Cousine-Regular.ttf diff --git a/src/main/resources/fonts/google/cousine/LICENSE.txt b/fonts/src/main/resources/fonts/google/cousine/LICENSE.txt similarity index 100% rename from src/main/resources/fonts/google/cousine/LICENSE.txt rename to fonts/src/main/resources/fonts/google/cousine/LICENSE.txt diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Bold.ttf diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Italic.ttf diff --git a/src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf b/fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf rename to fonts/src/main/resources/fonts/google/crimsontext/CrimsonText-Regular.ttf diff --git a/src/main/resources/fonts/google/crimsontext/OFL.txt b/fonts/src/main/resources/fonts/google/crimsontext/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/crimsontext/OFL.txt rename to fonts/src/main/resources/fonts/google/crimsontext/OFL.txt diff --git a/src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-Bold.ttf diff --git a/src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-Italic.ttf diff --git a/src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf b/fonts/src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf rename to fonts/src/main/resources/fonts/google/firasans/FiraSans-Regular.ttf diff --git a/src/main/resources/fonts/google/firasans/OFL.txt b/fonts/src/main/resources/fonts/google/firasans/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/firasans/OFL.txt rename to fonts/src/main/resources/fonts/google/firasans/OFL.txt diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Bold.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Italic.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf b/fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf rename to fonts/src/main/resources/fonts/google/firasanscondensed/FiraSansCondensed-Regular.ttf diff --git a/src/main/resources/fonts/google/firasanscondensed/OFL.txt b/fonts/src/main/resources/fonts/google/firasanscondensed/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/firasanscondensed/OFL.txt rename to fonts/src/main/resources/fonts/google/firasanscondensed/OFL.txt diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Bold.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Italic.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf b/fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf rename to fonts/src/main/resources/fonts/google/gentiumplus/GentiumPlus-Regular.ttf diff --git a/src/main/resources/fonts/google/gentiumplus/OFL.txt b/fonts/src/main/resources/fonts/google/gentiumplus/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/gentiumplus/OFL.txt rename to fonts/src/main/resources/fonts/google/gentiumplus/OFL.txt diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Bold.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Italic.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf b/fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf rename to fonts/src/main/resources/fonts/google/ibmplexmono/IBMPlexMono-Regular.ttf diff --git a/src/main/resources/fonts/google/ibmplexmono/OFL.txt b/fonts/src/main/resources/fonts/google/ibmplexmono/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ibmplexmono/OFL.txt rename to fonts/src/main/resources/fonts/google/ibmplexmono/OFL.txt diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Bold.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Italic.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf b/fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf rename to fonts/src/main/resources/fonts/google/ibmplexserif/IBMPlexSerif-Regular.ttf diff --git a/src/main/resources/fonts/google/ibmplexserif/OFL.txt b/fonts/src/main/resources/fonts/google/ibmplexserif/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ibmplexserif/OFL.txt rename to fonts/src/main/resources/fonts/google/ibmplexserif/OFL.txt diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Bold.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Italic.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf b/fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf rename to fonts/src/main/resources/fonts/google/jetbrainsmono/JetBrainsMono-Regular.ttf diff --git a/src/main/resources/fonts/google/jetbrainsmono/OFL.txt b/fonts/src/main/resources/fonts/google/jetbrainsmono/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/jetbrainsmono/OFL.txt rename to fonts/src/main/resources/fonts/google/jetbrainsmono/OFL.txt diff --git a/src/main/resources/fonts/google/kanit/Kanit-Bold.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-Bold.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-Bold.ttf diff --git a/src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/kanit/Kanit-Italic.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-Italic.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-Italic.ttf diff --git a/src/main/resources/fonts/google/kanit/Kanit-Regular.ttf b/fonts/src/main/resources/fonts/google/kanit/Kanit-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/kanit/Kanit-Regular.ttf rename to fonts/src/main/resources/fonts/google/kanit/Kanit-Regular.ttf diff --git a/src/main/resources/fonts/google/kanit/OFL.txt b/fonts/src/main/resources/fonts/google/kanit/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/kanit/OFL.txt rename to fonts/src/main/resources/fonts/google/kanit/OFL.txt diff --git a/src/main/resources/fonts/google/lato/Lato-Bold.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-Bold.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-Bold.ttf diff --git a/src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/lato/Lato-Italic.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-Italic.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-Italic.ttf diff --git a/src/main/resources/fonts/google/lato/Lato-Regular.ttf b/fonts/src/main/resources/fonts/google/lato/Lato-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/lato/Lato-Regular.ttf rename to fonts/src/main/resources/fonts/google/lato/Lato-Regular.ttf diff --git a/src/main/resources/fonts/google/lato/OFL.txt b/fonts/src/main/resources/fonts/google/lato/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/lato/OFL.txt rename to fonts/src/main/resources/fonts/google/lato/OFL.txt diff --git a/src/main/resources/fonts/google/poppins/OFL.txt b/fonts/src/main/resources/fonts/google/poppins/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/poppins/OFL.txt rename to fonts/src/main/resources/fonts/google/poppins/OFL.txt diff --git a/src/main/resources/fonts/google/poppins/Poppins-Bold.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-Bold.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-Bold.ttf diff --git a/src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/poppins/Poppins-Italic.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-Italic.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-Italic.ttf diff --git a/src/main/resources/fonts/google/poppins/Poppins-Regular.ttf b/fonts/src/main/resources/fonts/google/poppins/Poppins-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/poppins/Poppins-Regular.ttf rename to fonts/src/main/resources/fonts/google/poppins/Poppins-Regular.ttf diff --git a/src/main/resources/fonts/google/prompt/OFL.txt b/fonts/src/main/resources/fonts/google/prompt/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/prompt/OFL.txt rename to fonts/src/main/resources/fonts/google/prompt/OFL.txt diff --git a/src/main/resources/fonts/google/prompt/Prompt-Bold.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-Bold.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-Bold.ttf diff --git a/src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/prompt/Prompt-Italic.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-Italic.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-Italic.ttf diff --git a/src/main/resources/fonts/google/prompt/Prompt-Regular.ttf b/fonts/src/main/resources/fonts/google/prompt/Prompt-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/prompt/Prompt-Regular.ttf rename to fonts/src/main/resources/fonts/google/prompt/Prompt-Regular.ttf diff --git a/src/main/resources/fonts/google/ptsans/OFL.txt b/fonts/src/main/resources/fonts/google/ptsans/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ptsans/OFL.txt rename to fonts/src/main/resources/fonts/google/ptsans/OFL.txt diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Bold.ttf diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Italic.ttf diff --git a/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf b/fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf rename to fonts/src/main/resources/fonts/google/ptsans/PT_Sans-Web-Regular.ttf diff --git a/src/main/resources/fonts/google/ptserif/OFL.txt b/fonts/src/main/resources/fonts/google/ptserif/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/ptserif/OFL.txt rename to fonts/src/main/resources/fonts/google/ptserif/OFL.txt diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Bold.ttf diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Italic.ttf diff --git a/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf b/fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf rename to fonts/src/main/resources/fonts/google/ptserif/PT_Serif-Web-Regular.ttf diff --git a/src/main/resources/fonts/google/sarabun/OFL.txt b/fonts/src/main/resources/fonts/google/sarabun/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/sarabun/OFL.txt rename to fonts/src/main/resources/fonts/google/sarabun/OFL.txt diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-Bold.ttf diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-Italic.ttf diff --git a/src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf b/fonts/src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf rename to fonts/src/main/resources/fonts/google/sarabun/Sarabun-Regular.ttf diff --git a/src/main/resources/fonts/google/spectral/OFL.txt b/fonts/src/main/resources/fonts/google/spectral/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/spectral/OFL.txt rename to fonts/src/main/resources/fonts/google/spectral/OFL.txt diff --git a/src/main/resources/fonts/google/spectral/Spectral-Bold.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-Bold.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-Bold.ttf diff --git a/src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/spectral/Spectral-Italic.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-Italic.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-Italic.ttf diff --git a/src/main/resources/fonts/google/spectral/Spectral-Regular.ttf b/fonts/src/main/resources/fonts/google/spectral/Spectral-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/spectral/Spectral-Regular.ttf rename to fonts/src/main/resources/fonts/google/spectral/Spectral-Regular.ttf diff --git a/src/main/resources/fonts/google/taviraj/OFL.txt b/fonts/src/main/resources/fonts/google/taviraj/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/taviraj/OFL.txt rename to fonts/src/main/resources/fonts/google/taviraj/OFL.txt diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-Bold.ttf diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-Italic.ttf diff --git a/src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf b/fonts/src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf rename to fonts/src/main/resources/fonts/google/taviraj/Taviraj-Regular.ttf diff --git a/src/main/resources/fonts/google/tinos/LICENSE.txt b/fonts/src/main/resources/fonts/google/tinos/LICENSE.txt similarity index 100% rename from src/main/resources/fonts/google/tinos/LICENSE.txt rename to fonts/src/main/resources/fonts/google/tinos/LICENSE.txt diff --git a/src/main/resources/fonts/google/tinos/Tinos-Bold.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-Bold.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-Bold.ttf diff --git a/src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/tinos/Tinos-Italic.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-Italic.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-Italic.ttf diff --git a/src/main/resources/fonts/google/tinos/Tinos-Regular.ttf b/fonts/src/main/resources/fonts/google/tinos/Tinos-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/tinos/Tinos-Regular.ttf rename to fonts/src/main/resources/fonts/google/tinos/Tinos-Regular.ttf diff --git a/src/main/resources/fonts/google/trirong/OFL.txt b/fonts/src/main/resources/fonts/google/trirong/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/trirong/OFL.txt rename to fonts/src/main/resources/fonts/google/trirong/OFL.txt diff --git a/src/main/resources/fonts/google/trirong/Trirong-Bold.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-Bold.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-Bold.ttf diff --git a/src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/trirong/Trirong-Italic.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-Italic.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-Italic.ttf diff --git a/src/main/resources/fonts/google/trirong/Trirong-Regular.ttf b/fonts/src/main/resources/fonts/google/trirong/Trirong-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/trirong/Trirong-Regular.ttf rename to fonts/src/main/resources/fonts/google/trirong/Trirong-Regular.ttf diff --git a/src/main/resources/fonts/google/ubuntu/UFL.txt b/fonts/src/main/resources/fonts/google/ubuntu/UFL.txt similarity index 100% rename from src/main/resources/fonts/google/ubuntu/UFL.txt rename to fonts/src/main/resources/fonts/google/ubuntu/UFL.txt diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Bold.ttf diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Italic.ttf diff --git a/src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf b/fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf rename to fonts/src/main/resources/fonts/google/ubuntu/Ubuntu-Regular.ttf diff --git a/src/main/resources/fonts/google/volkhov/OFL.txt b/fonts/src/main/resources/fonts/google/volkhov/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/volkhov/OFL.txt rename to fonts/src/main/resources/fonts/google/volkhov/OFL.txt diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-Bold.ttf diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-Italic.ttf diff --git a/src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf b/fonts/src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf rename to fonts/src/main/resources/fonts/google/volkhov/Volkhov-Regular.ttf diff --git a/src/main/resources/fonts/google/zillaslab/OFL.txt b/fonts/src/main/resources/fonts/google/zillaslab/OFL.txt similarity index 100% rename from src/main/resources/fonts/google/zillaslab/OFL.txt rename to fonts/src/main/resources/fonts/google/zillaslab/OFL.txt diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Bold.ttf diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-BoldItalic.ttf diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Italic.ttf diff --git a/src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf b/fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf similarity index 100% rename from src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf rename to fonts/src/main/resources/fonts/google/zillaslab/ZillaSlab-Regular.ttf diff --git a/pom.xml b/pom.xml index 1f773f12..e7c68527 100644 --- a/pom.xml +++ b/pom.xml @@ -67,6 +67,7 @@ 3.15.0 3.6.3 3.2.8 + 3.5.0 3.12.0 3.4.0 3.5.6 @@ -216,6 +217,16 @@ + ch.qos.logback logback-classic @@ -282,6 +293,26 @@ + + + + src/test/resources + + + + ${project.basedir}/fonts/src/main/resources + + + org.apache.maven.plugins maven-jar-plugin - 3.5.0 + ${maven.jar.plugin.version} + attach-test-jar test-jar + + + + fonts/** + + @@ -448,6 +495,28 @@ release + + + org.apache.maven.plugins + maven-jar-plugin + ${maven.jar.plugin.version} + + + attach-test-jar + none + + + org.apache.maven.plugins maven-source-plugin diff --git a/scripts/cut-release.ps1 b/scripts/cut-release.ps1 index b047502b..5d3a1910 100644 --- a/scripts/cut-release.ps1 +++ b/scripts/cut-release.ps1 @@ -423,14 +423,24 @@ try { Note ("tag {0}: available OK" -f $tag) Step 1 "Bump versions to $Version (poms + README install snippets)" - # All four version sites must move together or VersionConsistencyGuardTest - # fails the verify gate below: the standalone library pom.xml (the published - # JitPack artifact), the reactor aggregator, and the examples/benchmarks - # children whose inherited version tracks the aggregator. + # All ENGINE-LINE version sites must move together or + # VersionConsistencyGuardTest fails the verify gate below: the standalone + # library pom.xml (the published artifact), the reactor aggregator, the + # examples/benchmarks children whose inherited version tracks the + # aggregator, and the standalone bundle aggregate (graph-compose-bundle). + # NOTE: graph-compose-fonts is deliberately absent — it carries an + # INDEPENDENT version line (currently 1.0.0) and ships on its own fonts-v* + # tag, so an engine release must never rewrite it. Its first is + # 1.0.0, not the engine version, so even a stray reactor bump would skip it. Update-PomVersion (Join-Path $repoRoot 'pom.xml') $Version Update-PomVersion (Join-Path $repoRoot 'aggregator/pom.xml') $Version Update-PomVersion (Join-Path $repoRoot 'examples/pom.xml') $Version Update-PomVersion (Join-Path $repoRoot 'benchmarks/pom.xml') $Version + # Bundle tracks the engine line: its project bumps here; its + # graph-compose dep is ${project.version} (follows automatically) and its + # graph-compose-fonts dep is ${graphcompose.fonts.version} (stays pinned — + # the bump regex does not touch the $-prefixed property reference). + Update-PomVersion (Join-Path $repoRoot 'bundle/pom.xml') $Version Update-ReadmeInstallVersion (Join-Path $repoRoot 'README.md') $Version Update-IndexHtmlVersion (Join-Path $repoRoot 'web/index.html') $Version # The Next.js site/ and the docs->site/public mirror were retired when the static diff --git a/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java b/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java index 4f9321b6..b40c424e 100644 --- a/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java +++ b/src/main/java/com/demcha/compose/font/FontFamilyDefinition.java @@ -325,11 +325,29 @@ public InputStream openStream() { String normalizedPath = resourcePath.startsWith("/") ? resourcePath : "/" + resourcePath; InputStream inputStream = FontFamilyDefinition.class.getResourceAsStream(normalizedPath); if (inputStream == null) { - throw new IllegalArgumentException("Classpath font resource not found: " + normalizedPath); + throw new IllegalArgumentException(missingResourceMessage(normalizedPath)); } return inputStream; } + /** + * Builds the not-found message. For a bundled Google-font resource the + * likely cause is that the separately-versioned font artifact is not on + * the classpath (the fonts moved out of the core jar in v1.8.0), so the + * message points at the fix instead of a bare path. + */ + private static String missingResourceMessage(String normalizedPath) { + if (normalizedPath.startsWith("/fonts/google/")) { + return "Bundled font resource not found: " + normalizedPath + + ". The bundled Google fonts ship in a separate artifact since v1.8.0 — " + + "add the dependency io.github.demchaav:graph-compose-fonts (or the " + + "io.github.demchaav:graph-compose-bundle aggregate) to your build to use " + + "them, or register your own font with FontFamilyDefinition. " + + "See https://github.com/DemchaAV/GraphCompose/blob/main/docs/migration/v1.8.0-fonts.md"; + } + return "Classpath font resource not found: " + normalizedPath; + } + @Override public String description() { return resourcePath; diff --git a/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java b/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java index 317eaec4..6e6d4b75 100644 --- a/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java +++ b/src/test/java/com/demcha/compose/font/FontLibraryIntegrationTest.java @@ -11,6 +11,7 @@ import java.util.List; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; class FontLibraryIntegrationTest { @@ -36,7 +37,10 @@ void shouldExposeBundledGoogleFontsInEngineComposerHarness() throws Exception { @Test void shouldRegisterCustomFontFamilyFromFilePaths() throws Exception { FontName customFamily = FontName.of("Brand Sans"); - Path fontsRoot = Path.of("src", "main", "resources", "fonts", "google", "lato"); + // The bundled fonts moved to the graph-compose-fonts module in v1.8.0. + // This test exercises file-based registration, so it reads the real TTFs + // from that module's resources (engine test cwd is the repo root). + Path fontsRoot = Path.of("fonts", "src", "main", "resources", "fonts", "google", "lato"); try (EngineComposerHarness composer = com.demcha.compose.testsupport.EngineComposerHarness.pdf() .registerFontFamily( @@ -62,4 +66,32 @@ void shouldRegisterCustomFontFamilyFromFilePaths() throws Exception { assertThat(fonts.getFont(customFamily, WordFont.class)).isPresent(); } } + + @Test + void shouldMaterializeStandard14FontsWithoutBundledFontsArtifact() { + // The standard-14 families embed nothing and need no PDF document and no + // graph-compose-fonts jar — this is the baseline an engine-only consumer + // (no bundled fonts on the classpath) still gets. + FontLibrary standard = DefaultFonts.standardLibrary(); + + assertThat(standard.getFont(FontName.HELVETICA, PdfFont.class)).isPresent(); + assertThat(standard.getFont(FontName.TIMES_ROMAN, PdfFont.class)).isPresent(); + assertThat(standard.getFont(FontName.COURIER, PdfFont.class)).isPresent(); + } + + @Test + void shouldGiveActionableErrorWhenBundledFontResourceMissing() { + // Simulates the bundled fonts being absent (graph-compose-fonts not on + // the classpath): a fonts/google/... resource that cannot be found must + // point the caller at the companion artifact, not just print a raw path. + FontFamilyDefinition missing = FontFamilyDefinition + .classpath(FontName.of("Missing Family"), "fonts/google/__missing__/Missing-Regular.ttf") + .build(); + FontFamilyDefinition.FontBinarySource regular = missing.fontSourceSet().orElseThrow().regular(); + + assertThatThrownBy(regular::openStream) + .isInstanceOf(IllegalArgumentException.class) + .hasMessageContaining("graph-compose-fonts") + .hasMessageContaining("fonts/google/__missing__/Missing-Regular.ttf"); + } } diff --git a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java index 2d54c1d0..e5ceeebc 100644 --- a/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java +++ b/src/test/java/com/demcha/documentation/VersionConsistencyGuardTest.java @@ -58,6 +58,30 @@ void everyModuleResolvesToTheRootProjectVersion() throws Exception { assertThat(effectiveVersion(PROJECT_ROOT.resolve("benchmarks/pom.xml"))) .describedAs("benchmarks must inherit the root version (%s)", root) .isEqualTo(root); + assertThat(effectiveVersion(PROJECT_ROOT.resolve("bundle/pom.xml"))) + .describedAs("bundle (graph-compose-bundle) tracks the engine line and must equal the root version (%s)", root) + .isEqualTo(root); + + // NOTE: fonts/pom.xml (graph-compose-fonts) is intentionally NOT checked + // here. It carries an independent version line (it ships on its own + // fonts-v* tag and is bumped only when the font set changes), so it must + // be free to diverge from the engine version. + } + + @Test + void bundledFontsVersionAgreesAcrossModules() throws Exception { + // graph-compose-fonts carries an independent version line. The engine + // does NOT depend on the fonts artifact (its tests read the fonts from + // the sibling module's source), so the ${graphcompose.fonts.version} + // property that pins the artifact lives only in the modules that consume + // it: the aggregator (inherited by examples + benchmarks) and the bundle. + // This guards the PR-7.1 drift class: those must always agree, even + // though they differ from the engine version line. + String aggregator = fontsVersionProperty(PROJECT_ROOT.resolve("aggregator/pom.xml")); + + assertThat(fontsVersionProperty(PROJECT_ROOT.resolve("bundle/pom.xml"))) + .describedAs("bundle graphcompose.fonts.version must match the aggregator's (%s)", aggregator) + .isEqualTo(aggregator); } @Test @@ -202,6 +226,15 @@ private static boolean declaresOwnVersion(Path pom) throws Exception { return directChild(parse(pom).getDocumentElement(), "version") != null; } + private static String fontsVersionProperty(Path pom) throws IOException { + Matcher matcher = Pattern.compile("([^<]+)") + .matcher(Files.readString(pom)); + assertThat(matcher.find()) + .describedAs("expected a property in %s", pom) + .isTrue(); + return matcher.group(1).trim(); + } + private static String effectiveVersion(Path pom) throws Exception { Element project = parse(pom).getDocumentElement();