diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
index 034648eff4b..e38727632b4 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -39,11 +39,11 @@ jobs:
steps:
- name: Checkout repository
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
- uses: github/codeql-action/init@v2
+ uses: github/codeql-action/init@v3
with:
languages: ${{ matrix.language }}
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -54,7 +54,7 @@ jobs:
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
# If this step fails, then you should remove it and run the build manually (see below)
- name: Autobuild
- uses: github/codeql-action/autobuild@v2
+ uses: github/codeql-action/autobuild@v3
# âšī¸ Command-line programs to run using the OS shell.
# đ https://git.io/JvXDl
@@ -68,4 +68,4 @@ jobs:
# make release
- name: Perform CodeQL Analysis
- uses: github/codeql-action/analyze@v2
+ uses: github/codeql-action/analyze@v3
diff --git a/.github/workflows/gradle-release-manual.yml b/.github/workflows/gradle-release-manual.yml
index 3688e8f0553..b641f8d7a23 100644
--- a/.github/workflows/gradle-release-manual.yml
+++ b/.github/workflows/gradle-release-manual.yml
@@ -150,16 +150,8 @@ jobs:
with:
java-version: '25'
distribution: 'temurin'
- cache: gradle
- cache-dependency-path: |
- build.gradle
- code/gradle/autobuild.gradle
- code/gradle/distribution.gradle
- code/gradle/release.gradle
- code/gradle/reporting.gradle
- code/gradle/plugins.gradle
-
- # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
+
+ # setup-gradle@v4 is the canonical Gradle cache for GitHub Actions.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
@@ -168,36 +160,31 @@ jobs:
cache-read-only: false
cache-overwrite-existing: true
- - uses: actions/cache@v4
- with:
- path: |
- ${{ github.workspace }}/build/jre
- ${{ github.workspace }}/build/libs
- key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- restore-keys: |
- ${{ matrix.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- ${{ matrix.os }}-gradle
-
- - name: Build the image
- if: success()
- run: ./gradlew clean build copyToOutput test compileSlowtest datatest pfinttest allReports buildDist prepareRelease pcgenRelease
-
- - name: Upload zip based release assets for all platforms
- uses: actions/upload-artifact@v4
- with:
- name: ${{ matrix.os }}-zip
- path: ${{ github.workspace }}/build/release/image-*.zip
+ - name: Compile and run unit tests
+ run: ./gradlew clean build
+
+ - name: Run data and integration tests
+ run: ./gradlew compileSlowtest datatest pfinttest
+
+ - name: Run static analysis reports
+ run: ./gradlew allReports
- - name: Upload DMG release asset for macos
+ - name: Build distribution zips
+ run: ./gradlew buildDist
+
+ - name: Build release artifacts
+ run: ./gradlew pcgenRelease
+
+ - name: Upload release artifacts as workflow artifacts
uses: actions/upload-artifact@v4
- if: matrix.os == 'macos-latest'
with:
- name: ${{ matrix.os }}-dmg
- path: ${{ github.workspace }}/build/release/*.dmg
+ name: ${{ matrix.release_suffix }}-release
+ path: ${{ github.workspace }}/build/release/*
+ if-no-files-found: error
- - name: Upload PKG release asset for macos
- uses: actions/upload-artifact@v4
- if: matrix.os == 'macos-latest'
+ - name: Attach release artifacts to GitHub Release
+ uses: softprops/action-gh-release@v2
with:
- name: ${{ matrix.os }}-pkg
- path: ${{ github.workspace }}/build/release/*.pkg
+ tag_name: ${{ inputs.tag_name }}
+ files: ${{ github.workspace }}/build/release/*
+ fail_on_unmatched_files: true
diff --git a/.github/workflows/gradle-release.yml b/.github/workflows/gradle-release.yml
index dd9c6081f9b..af86f675508 100644
--- a/.github/workflows/gradle-release.yml
+++ b/.github/workflows/gradle-release.yml
@@ -1,4 +1,4 @@
-name: Create Release with Manual Tag
+name: Create Release on Tag Push
on:
push:
@@ -120,16 +120,8 @@ jobs:
with:
java-version: '25'
distribution: 'temurin'
- cache: gradle
- cache-dependency-path: |
- build.gradle
- code/gradle/autobuild.gradle
- code/gradle/distribution.gradle
- code/gradle/release.gradle
- code/gradle/reporting.gradle
- code/gradle/plugins.gradle
-
- # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
+
+ # setup-gradle@v4 is the canonical Gradle cache for GitHub Actions.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
@@ -138,57 +130,31 @@ jobs:
cache-read-only: false
cache-overwrite-existing: true
- - uses: actions/cache@v4
- with:
- path: |
- ${{ github.workspace }}/build/jre
- ${{ github.workspace }}/build/libs
- key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- restore-keys: |
- ${{ matrix.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- ${{ matrix.os }}-gradle
-
- - name: Build the image
- if: success()
- run: ./gradlew clean build copyToOutput test compileSlowtest datatest pfinttest allReports buildDist prepareRelease pcgenRelease
-
- - name: Upload zip based release assets for all platforms
- uses: actions/upload-artifact@v4
- if: matrix.os == 'macos-latest'
- with:
- name: ${{ matrix.os }}-zip
- path: ${{ github.workspace }}/build/release/image-*.zip
+ - name: Compile and run unit tests
+ run: ./gradlew clean build
+
+ - name: Run data and integration tests
+ run: ./gradlew compileSlowtest datatest pfinttest
+
+ - name: Run static analysis reports
+ run: ./gradlew allReports
- - name: Upload DMG release asset for macos
+ - name: Build distribution zips
+ run: ./gradlew buildDist
+
+ - name: Build release artifacts
+ run: ./gradlew pcgenRelease
+
+ - name: Upload release artifacts as workflow artifacts
uses: actions/upload-artifact@v4
- if: matrix.os == 'macos-latest'
with:
- name: ${{ matrix.os }}-dmg
- path: ${{ github.workspace }}/build/release/*.dmg
+ name: ${{ matrix.release_suffix }}-release
+ path: ${{ github.workspace }}/build/release/*
+ if-no-files-found: error
- - name: Upload PKG release asset for macos
- uses: actions/upload-artifact@v4
- if: matrix.os == 'macos-latest'
+ - name: Attach release artifacts to GitHub Release
+ uses: softprops/action-gh-release@v2
with:
- name: ${{ matrix.os }}-pkg
- path: ${{ github.workspace }}/build/release/*.pkg
-
-# - name: Upload release assets for ubuntu
-# uses: actions/upload-artifact@v4
-# if: matrix.os == 'ubuntu-latest'
-# with:
-# name: ${{ matrix.os }}
-# path: ${{ github.workspace }}/build/jpackage/*.deb
-#
-# - name: Upload release assets for windows
-# uses: actions/upload-artifact@v4
-# if: matrix.os == 'windows-latest'
-# with:
-# name: ${{ matrix.os }}
-# path: ${{ github.workspace }}/build/jpackage/*.msi
-#
-# - name: Release - ${{ matrix.os }}
-# uses: softprops/action-gh-release@v2
-# with:
-# tag_name: ${{ needs.create_release.outputs.tag-name }}
-# files: ${{ github.workspace }}/build/release/pcgen-*.*
+ tag_name: ${{ inputs.tag_name || github.ref_name }}
+ files: ${{ github.workspace }}/build/release/*
+ fail_on_unmatched_files: true
diff --git a/.github/workflows/gradle-test.yml b/.github/workflows/gradle-test.yml
index 4034f333f3b..acc144d5617 100644
--- a/.github/workflows/gradle-test.yml
+++ b/.github/workflows/gradle-test.yml
@@ -22,39 +22,17 @@ jobs:
with:
java-version: '25'
distribution: 'temurin'
- cache: gradle
- cache-dependency-path: |
- build.gradle
- code/gradle/autobuild.gradle
- code/gradle/distribution.gradle
- code/gradle/release.gradle
- code/gradle/reporting.gradle
- code/gradle/plugins.gradle
- # Configure Gradle for optimal use in GitHub Actions, including caching of downloaded dependencies.
+ # setup-gradle@v4 is the canonical Gradle cache for GitHub Actions.
# See: https://github.com/gradle/actions/blob/main/setup-gradle/README.md
- name: Setup Gradle
uses: gradle/actions/setup-gradle@v4
- with:
- cache-disabled: false
- cache-read-only: false
- cache-overwrite-existing: true
-
- - uses: actions/cache@v4
- with:
- path: |
- ${{ github.workspace }}/build/jre
- ${{ github.workspace }}/build/libs
- key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- restore-keys: |
- ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
- ${{ runner.os }}-gradle
- name: Build with Gradle Wrapper
run: ./gradlew build
- - name: Run tests
- run: ./gradlew test itest datatest slowtest
+ - name: Run integration, data, and slow tests
+ run: ./gradlew itest datatest slowtest
- name: Publish Test Results
uses: EnricoMi/publish-unit-test-result-action@v2
diff --git a/.gitignore b/.gitignore
index 0c372a0bf96..d047a0e34f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -115,6 +115,7 @@ pcgen.iws
# Misc
jre/
+jdks/
mods/
code/manifest-tests
.DS_Store
diff --git a/AGENTS.md b/AGENTS.md
index 58083626f6b..31e14aac133 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -8,7 +8,7 @@ This document captures the concrete commands, structure, conventions, and gotcha
- Build tool: Gradle (via wrapper)
- Java toolchain: Java 25 (Temurin)
- UI: JavaFX; headless testing uses TestFX/Monocle
-- Packaging: jlink/jpackage with custom runtimes and native installers
+- Packaging: jlink (org.beryx.jlink 4.0.0) / jpackage with custom runtimes and native installers
Key entry point: `pcgen.system.Main` (code/src/java/pcgen/system/Main.java)
@@ -39,7 +39,7 @@ Always use the wrapper (./gradlew). Java 25 is required; Gradle will fetch depen
- ./gradlew tasks
- Build (default)
- ./gradlew build
-- Run unit tests (JUnit 5; headless JavaFX)
+- Run unit tests (JUnit 6; headless JavaFX)
- ./gradlew test
- Integration tests (defined source set)
- ./gradlew itest
@@ -60,12 +60,13 @@ Always use the wrapper (./gradlew). Java 25 is required; Gradle will fetch depen
- Run the app (ensures JavaFX modules for host platform)
- ./gradlew run
- Create native app image/installer via jpackage
- - ./gradlew jpackage
+ - ./gradlew fullJpackage
- Clean outputs and auxiliary folders (extended)
- - ./gradlew clean (also triggers cleanPlugins, cleanOutput, cleanJre, cleanMods, cleanMasterSheets)
+ - ./gradlew clean (also triggers cleanPlugins, cleanOutput, cleanJdks, cleanMods, cleanMasterSheets)
Notes
-- Some tasks trigger downloads of JDKs/JavaFX for all platforms (downloadJRE, downloadJavaFXModules) or host SDK (downloadJavaFXLocal/extractJavaFXLocal). CI caches build/jre and build/libs.
+- Some tasks trigger downloads of JDKs/JavaFX for all platforms (downloadJDKs, extractJDKs, downloadJavaFXMods) or host SDK (downloadJavaFXLocal/extractJavaFXLocal). CI caches build/jre and build/libs.
+- The `jre` task prepares all platform JDKs with JavaFX modules for runtime image creation.
- Runtime bundles expect assets in data/, system/, outputsheets/, preview/, vendordata/, homebrewdata/.
## Running From Source
@@ -90,7 +91,7 @@ Batch export path exists in Main.startupWithoutGUI(). Tests demonstrate usage in
## Testing Approach
-- JUnit 5 with Jupiter, xmlunit for XML comparisons, TestFX for JavaFX UI components.
+- JUnit 6 with Jupiter, xmlunit for XML comparisons, TestFX for JavaFX UI components.
- Source sets:
- test: code/src/utest + testcommon
- itest: code/src/itest + testcommon
@@ -103,9 +104,9 @@ Batch export path exists in Main.startupWithoutGUI(). Tests demonstrate usage in
## Code Quality and Style
-- Checkstyle config: code/standards/checkstyle.xml (enforced via reporting.gradle; toolVersion 12.1.2). Newline at EOF; 201 char line length; prohibits `System.exit` (use pcgen.util.GracefulExit.exit).
-- PMD: ruleset at code/standards/ruleset.xml (referenced from reporting.gradle).
-- SpotBugs: plugin 6.4.7; toolVersion 4.9.8; exclude filter code/standards/spotbugs_ignore.xml; ignoreFailures true; extra findsecbugs plugin.
+- Checkstyle config: code/standards/checkstyle.xml (enforced via reporting.gradle; toolVersion 13.2.0). Newline at EOF; 201 char line length; prohibits `System.exit` (use pcgen.util.GracefulExit.exit).
+- PMD: ruleset at code/standards/ruleset.xml (referenced from reporting.gradle); toolVersion 7.21.0; dependencies pmd-java 7.24.0 and pmd-ant 7.24.0.
+- SpotBugs: plugin 6.5.4; toolVersion 4.9.8; exclude filter code/standards/spotbugs_ignore.xml; ignoreFailures true; extra findsecbugs plugin.
- Aggregate quality task: ./gradlew allReports
Conventions/gotchas observed
@@ -177,10 +178,11 @@ Conventions/gotchas observed
- Java version and JavaFX module handling are intertwined across build.gradle and distribution tasks â changing one often requires adjusting tasks (run, test, JavaCompile, runtime/jpackage) and CI.
- The distribution relies on file layout in data/, outputsheets/, system/, preview/ â deletions or renames will break runtime validation in Main.validateEnvironment().
- GracefulExit should be used for controlled termination (tests hook the exit function).
+- Module compilation: PCGen-base and PCGen-Formula jars are placed on `--module-path` while all other dependencies are merged into the pcgen module via `--patch-module`. This means **no source file in the pcgen module may share a package with classes in PCGen-base or PCGen-Formula jars** (Java forbids split packages across modules). Currently conflicting packages (`pcgen.base.util`, `pcgen.base.format`) have been relocated to `pcgen.util` and `pcgen.format` respectively. If adding new classes whose package exists in either jar, place them in a non-overlapping package.
## Maintainer/Issue Tracking Context
- Primary docs: README.md (development setup, essential Gradle tasks)
- Issue tracker: Jira at https://pcgenorg.atlassian.net (CODE/DATA/etc.) as referenced in README and docs/faqpages/faqsubmittingabugreport.md
-This file documents only observed behavior and commands present in this repository as of the current state.
\ No newline at end of file
+This file documents only observed behavior and commands present in this repository as of the current state.
diff --git a/README.md b/README.md
index 86677ddba73..668778cdcc9 100644
--- a/README.md
+++ b/README.md
@@ -193,9 +193,12 @@ substitute `./gradlew` for `gradle` on the command line.
### Run Full Test Suite
Do this primarily __before__ pull requests.
-This is almost exactly the command Travis runs to verify, if it fails locally you will fail the build, and your PR will not be merged.
+This mirrors what GitHub Actions runs to verify a PR; if it fails locally your CI build will also fail and your PR will not be merged.
- ./gradlew clean build copyToOutput test compileSlowtest datatest pfinttest allReports buildDist
+ ./gradlew build
+ ./gradlew itest datatest slowtest
+
+`build` already runs the unit `test` task via the standard Java lifecycle, so it is not repeated. The second command runs the integration, data, and slow test suites.
### Clean All Build Files
./gradlew clean
diff --git a/build.gradle b/build.gradle
index bee5eb7eb90..cc397503894 100644
--- a/build.gradle
+++ b/build.gradle
@@ -13,11 +13,12 @@
import groovy.json.JsonSlurper
-import org.apache.commons.lang3.StringUtils
import org.apache.tools.ant.filters.FixCrLfFilter
import org.apache.tools.ant.taskdefs.condition.Os
import org.gradle.plugins.ide.idea.model.ProjectLibrary
+import de.undercouch.gradle.tasks.download.Download
+
/**
* Plugins without versions are ones that are bundled with Gradle at the version
* being used (should be through gradlew).
@@ -33,8 +34,7 @@ plugins {
id 'de.undercouch.download' version '5.7.0' // Shows download percentage
id 'com.github.ben-manes.versions' version '0.54.0' // Checks versions for plugins and dependencies
id 'com.dorongold.task-tree' version '4.0.1' // Prints the task dependency tree
- id 'org.openjfx.javafxplugin' version '0.1.0' // JavaFX support
- id 'org.beryx.runtime' version '2.0.1' // Creates custom runtimes
+ id 'org.beryx.jlink' version '4.0.0' // Creates custom runtimes with jlink
id 'jacoco' // Code coverage
}
@@ -48,9 +48,6 @@ group = 'net.sourceforge.pcgen'
// Description of this project
description = """PCGen"""
-// Default task if you just run ./gradlew
-defaultTasks 'build'
-
// Define properties for the build (directories)
ext {
// Where code gets compiled to
@@ -59,8 +56,8 @@ ext {
// Folder where exe / jar files are placed.
outputDir = layout.projectDirectory.dir("output")
- // Folder where the JREs are downloaded for building releases
- jresDir = layout.projectDirectory.dir("jre")
+ // Folder where the JDKs are downloaded for building releases
+ jdksDir = layout.projectDirectory.dir("jdks")
// Folder where the JavaFX mods are downloaded for building releases
modsDir = layout.projectDirectory.dir("mods")
@@ -88,14 +85,6 @@ java {
}
}
-/**
- * Set the version and the modules we want from JavaFX (not everything)
- */
-javafx {
- version = latestJavaVersion
- modules = [ 'javafx.controls', 'javafx.swing', 'javafx.fxml', 'javafx.graphics', 'javafx.web' ]
-}
-
application {
mainClass.set('pcgen.system.Main')
}
@@ -107,31 +96,12 @@ repositories {
// Maven Central as a default
mavenCentral()
- // Use Ant Ivy Plugin to reference our own hosted repos
- // for PCGen Base and PCGen Formula JARs
- //ivy {
- // TODO Enable HTTPS (e.g., add letsencrypt) for that location
- //url "http://pcgen.sourceforge.net/mvnrepo"
- //allowInsecureProtocol = true
- //patternLayout {
- //artifact "[organisation]/jars/[artifact]-[revision].[ext]"
- //}
- //}
ivy {
// TODO Enable HTTPS (e.g., add letsencrypt) for that location
name = 'fileRepo'
url = 'http://pc-gen.org/librepo/'
allowInsecureProtocol = true
}
- // Use Maven plugin to reference freehep (https://java.freehep.org/) artifact repository
- // TODO Which libs do we pull from here?
- /*
- maven {
- name = 'free'
- url = 'https://java.freehep.org/maven2'
- }
-
- */
maven {
name = 'local'
url = 'installers'
@@ -157,13 +127,21 @@ sourceSets {
srcDirs = ['code/src/resources']
}
}
- // Running regular tests
- test {
+ // Shared test utilities â compiled once, consumed by test/itest/slowtest.
+ testcommon {
java {
- srcDirs = ['code/src/utest', 'code/src/testcommon']
+ srcDirs = ['code/src/testcommon']
}
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
+ }
+ // Running regular tests
+ test {
+ java {
+ srcDirs = ['code/src/utest']
+ }
+ compileClasspath += sourceSets.main.output + sourceSets.testcommon.output
+ runtimeClasspath += sourceSets.main.output + sourceSets.testcommon.output
resources {
srcDirs = ['code/src/testResources']
}
@@ -171,27 +149,34 @@ sourceSets {
// Integration Tests
itest {
java {
- srcDirs = ['code/src/itest', 'code/src/testcommon']
+ srcDirs = ['code/src/itest']
}
resources {
srcDirs = ['code/src/testResources']
}
- compileClasspath += sourceSets.test.compileClasspath
- runtimeClasspath += sourceSets.test.runtimeClasspath
+ compileClasspath += sourceSets.test.output + sourceSets.test.compileClasspath
+ runtimeClasspath += sourceSets.test.output + sourceSets.test.runtimeClasspath
}
// Running Slow Tests
slowtest {
java {
- srcDirs = ['code/src/test', 'code/src/testcommon']
+ srcDirs = ['code/src/test']
}
resources {
srcDirs = ['code/src/testResources']
}
- compileClasspath += sourceSets.test.compileClasspath
- runtimeClasspath += sourceSets.test.runtimeClasspath
+ compileClasspath += sourceSets.test.output + sourceSets.test.compileClasspath
+ runtimeClasspath += sourceSets.test.output + sourceSets.test.runtimeClasspath
}
}
+// Make the testcommon source set use the same dependency configurations as test.
+configurations {
+ testcommonImplementation.extendsFrom testImplementation
+ testcommonRuntimeOnly.extendsFrom testRuntimeOnly
+ testcommonCompileOnly.extendsFrom testCompileOnly
+}
+
/* Copy 'master' outputsheets into different genre folders */
tasks.register("copyMasterSheets", Copy) {
def filesToCopy = copySpec {
@@ -233,22 +218,23 @@ tasks.register("cleanMasterSheets", Delete) {
*/
dependencies {
+ implementation fileTree(dir: 'mods/lib', include: ['javafx.*.jar'])
+
implementation 'commons-io:commons-io:2.22.0'
implementation 'org.springframework:spring-web:7.0.7'
implementation 'org.springframework:spring-beans:7.0.7'
implementation 'org.springframework:spring-core:7.0.7'
implementation 'org.apache.commons:commons-lang3:3.20.0'
- implementation 'xalan:serializer:2.7.3'
implementation('org.apache.xmlgraphics:fop:2.11') {
exclude group: 'xml-apis', module: 'xml-apis'
+ exclude group: 'xalan', module: 'xalan'
+ exclude group: 'xalan', module: 'serializer'
}
+ implementation 'net.sf.saxon:Saxon-HE:12.9'
implementation 'org.apache.commons:commons-collections4:4.5.0'
implementation 'org.scijava:jep:2.4.2'
implementation 'org.freemarker:freemarker:2.3.34'
implementation 'org.jdom:jdom2:2.0.6.1'
- implementation('xalan:xalan:2.7.3') {
- exclude group: 'xml-apis', module: 'xml-apis'
- }
implementation 'net.sourceforge.argparse4j:argparse4j:0.9.0'
implementation 'org.xmlunit:xmlunit-core:2.11.0'
implementation 'org.controlsfx:controlsfx:11.2.3'
@@ -268,11 +254,14 @@ dependencies {
compileOnly 'com.yuvimasory:orange-extensions:1.3.0'
compileOnly 'com.github.spotbugs:spotbugs-annotations:4.9.8'
- testImplementation 'org.junit.platform:junit-platform-runner:1.14.4'
- testImplementation 'org.junit.platform:junit-platform-launcher:6.0.3'
- testImplementation 'org.junit.jupiter:junit-jupiter-api:6.0.3'
- testImplementation 'org.junit.jupiter:junit-jupiter-params:6.0.3'
- testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:6.0.3'
+ testImplementation platform('org.junit:junit-bom:6.0.3')
+ testImplementation 'org.junit.platform:junit-platform-launcher'
+ testImplementation 'org.junit.jupiter:junit-jupiter-api'
+ testImplementation 'org.junit.jupiter:junit-jupiter-params'
+ testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
+ // JUnit 4 is still used by ~870 legacy tests; pulled in via vintage engine + junit jar.
+ testImplementation 'junit:junit:4.13.2'
+ testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
testImplementation 'org.hamcrest:hamcrest:3.0'
testImplementation 'org.testfx:testfx-junit5:4.0.18'
@@ -307,53 +296,74 @@ jar {
'Class-Path': classpath
}
- from {
- configurations.runtimeClasspath.collect {
- it.directory ? it : zipTree(it)
- }
- }
+ exclude 'META-INF/*.SF', 'META-INF/*.DSA', 'META-INF/*.RSA', 'META-INF/*.EC'
}
/**
- * Create a Java runtime built from Java modules
+ * Create a Java runtime built from Java modules using jlink
*/
-runtime {
- options = []
- modules = [
- 'jdk.httpserver',
- 'java.management',
- 'java.rmi',
- 'java.desktop',
- 'java.xml',
- 'java.sql',
- 'jdk.unsupported',
- 'java.prefs',
- 'java.logging',
- 'java.naming',
- 'jdk.xml.dom',
- 'jdk.unsupported.desktop',
- 'java.scripting',
- 'jdk.jfr',
- 'jdk.jsobject',
- 'javafx.controls',
- 'javafx.web',
- 'javafx.swing',
- 'javafx.fxml',
- 'javafx.graphics'
+jlink {
+ options = ['--strip-debug', '--no-header-files', '--no-man-pages']
+ forceMerge('PCGen-base', 'PCGen-Formula', 'jep', 'fop', 'Saxon-HE',
+ 'commons-lang3', 'commons-io', 'commons-collections4', 'spring',
+ 'freemarker', 'jdom2', 'argparse4j', 'xmlunit', 'controlsfx',
+ 'annotations', 'spotbugs', 'xmlresolver')
+
+ mergedModule {
+ additive = true
+ requires 'java.desktop'
+ requires 'java.logging'
+ requires 'java.naming'
+ requires 'java.prefs'
+ requires 'java.scripting'
+ requires 'java.sql'
+ requires 'java.xml'
+ requires 'java.management'
+ requires 'java.rmi'
+ requires 'jdk.httpserver'
+ requires 'jdk.unsupported'
+ requires 'jdk.xml.dom'
+ requires 'jdk.unsupported.desktop'
+ requires 'jdk.jfr'
+
+ // Exclude service providers that reference optional/missing dependencies
+ excludeProvides(servicePattern: 'reactor\\.blockhound\\..*')
+ excludeProvides(servicePattern: 'jakarta\\.servlet\\..*')
+ excludeProvides(servicePattern: 'io\\.micrometer\\..*')
+ // FOP service files list factory classes that don't directly implement the service interface
+ excludeProvides(service: 'org.apache.fop.render.intermediate.IFDocumentHandler')
+ excludeProvides(service: 'org.apache.fop.render.Renderer')
+ excludeProvides(service: 'org.apache.fop.fo.FOEventHandler')
+ }
+
+ // Cross-platform images: only register platforms whose JDK javac can run on this host.
+ // CI sets PCGEN_ALL_PLATFORMS=true to build all targets (using platform-specific runners).
+ def hostArch = System.getProperty("os.arch")
+ def allPlatforms = System.getenv("PCGEN_ALL_PLATFORMS") == "true"
+
+ def platformDefs = [
+ 'linux-x64' : jdksDir.dir("jdk_linux_x64").asFile.absolutePath,
+ 'linux-aarch64' : jdksDir.dir("jdk_linux_aarch64").asFile.absolutePath,
+ 'windows-x64' : jdksDir.dir("jdk_windows_x64").asFile.absolutePath,
+ 'mac-x64' : jdksDir.dir("jdk_mac_x64/Contents/Home").asFile.absolutePath,
+ 'mac-aarch64' : jdksDir.dir("jdk_mac_aarch64/Contents/Home").asFile.absolutePath,
]
- // We support Mac/Win/Linux x86-64, Mac/Linux aarch64
- targetPlatform('linux-x64', layout.projectDirectory.dir("jre/linux/jre_x64").asFile.absolutePath)
- targetPlatform('linux-aarch64', layout.projectDirectory.dir("jre/linux/jre_aarch64").asFile.absolutePath)
- targetPlatform('windows-x64', layout.projectDirectory.dir("jre/windows/jre_x64").asFile.absolutePath)
- targetPlatform('mac-x64', layout.projectDirectory.dir("jre/mac/jre_x64/Contents/Home").asFile.absolutePath)
- targetPlatform('mac-aarch64', layout.projectDirectory.dir("jre/mac/jre_aarch64/Contents/Home").asFile.absolutePath)
+ if (allPlatforms) {
+ platformDefs.each { name, jdk -> targetPlatform(name, jdk) }
+ } else if (Os.isFamily(Os.FAMILY_MAC)) {
+ def macPlatform = (hostArch == "aarch64") ? 'mac-aarch64' : 'mac-x64'
+ targetPlatform(macPlatform, platformDefs[macPlatform])
+ } else if (Os.isFamily(Os.FAMILY_UNIX)) {
+ def linuxPlatform = (hostArch == "aarch64") ? 'linux-aarch64' : 'linux-x64'
+ targetPlatform(linuxPlatform, platformDefs[linuxPlatform])
+ } else if (Os.isFamily(Os.FAMILY_WINDOWS)) {
+ targetPlatform('windows-x64', platformDefs['windows-x64'])
+ }
// Use the jpackage tool that comes with Java to build native installers
jpackage {
def licenseFile = layout.projectDirectory.file("code/LICENSE")
- installerOptions = ["--app-version", "${version.replaceAll('-SNAPSHOT', '')}", "--license-file", licenseFile.asFile.absolutePath]
-
def hostArchitecture = System.getProperty("os.arch")
def osFamily =
Os.isFamily(Os.FAMILY_MAC) ? "mac" :
@@ -362,71 +372,95 @@ runtime {
def targetPlatform = ["x86_64" : "x64",
"amd64" : "x64",
"aarch64" : "aarch64"]
- // formats a string such as "mac -aarch64", or "linux-x64"
targetPlatformName = "${osFamily}-${targetPlatform.get(hostArchitecture, "NOT SUPPORTED")}"
+ def appVersionStr = version.replaceAll('-SNAPSHOT', '').replaceAll(/[^0-9.].*/, '').replaceAll(/\.$/, '')
+ appVersion = appVersionStr
+ def opts = ["--license-file", licenseFile.asFile.absolutePath]
+
if (osFamily == "mac") {
- installerOptions += ["--mac-package-identifier", "PcGen", "--mac-package-name", "PcGen"]
+ opts += ["--mac-package-identifier", "PcGen", "--mac-package-name", "PcGen"]
resourceDir = layout.projectDirectory.dir("installers/mac-installer").asFile
}
- // This may seem weird but there's no LINUX family detection in the OS lib
else if (osFamily == "linux") {
- installerOptions += ['--linux-shortcut']
+ opts += ['--linux-shortcut']
}
+
+ installerOptions = opts
imageName = "PcGen"
}
}
-// Package up other files with the main program
+// Package up other files with the main program after jpackage creates the image
tasks.named("jpackageImage") {
- dependsOn tasks.named("runtime")
- doLast {
- copy {
- includeEmptyDirs = false
- from layout.buildDirectory.dir("install/pcgen")
- exclude "**/*.exe"
- exclude "**/*.bat"
- exclude "pcgen"
- exclude "**/lib/**"
- if (Os.isFamily(Os.FAMILY_MAC)) {
- into layout.buildDirectory.dir("jpackage/PcGen.app/Contents/app")
- } else {
- into layout.buildDirectory.dir("jpackage/PcGen")
- }
- }
+ dependsOn tasks.named("jlink")
+}
- // Mac OS X specific config for jpackage
- if (Os.isFamily(Os.FAMILY_MAC)) {
- copy {
- from layout.projectDirectory.dir("installers/mac-installer")
- include "MacDirLauncher"
- filePermissions {
- unix(0755)
- }
- into layout.buildDirectory.dir("jpackage/PcGen.app/Contents/MacOS")
- }
- ant.replace(file: layout.buildDirectory.file("jpackage/PcGen.app/Contents/Info.plist").get(),
- token: "CFBundleExecutable\n PcGen",
- value: "CFBundleExecutable\n MacDirLauncher")
+tasks.named("jlink") {
+ dependsOn "downloadJavaFXMods"
+}
+
+tasks.register("assembleJpackageImage", Copy) {
+ dependsOn tasks.named("jpackageImage"), tasks.named("installDist")
+ includeEmptyDirs = false
+ from layout.buildDirectory.dir("install/pcgen")
+ exclude "**/*.exe"
+ exclude "**/*.bat"
+ exclude "pcgen"
+ exclude "**/lib/**"
+ if (Os.isFamily(Os.FAMILY_MAC)) {
+ into layout.buildDirectory.dir("jpackage/PcGen.app/Contents/app")
+ } else {
+ into layout.buildDirectory.dir("jpackage/PcGen")
+ }
+ // jpackageImage wipes the output dir on rebuild; always re-copy
+ outputs.upToDateWhen { false }
+}
+
+if (Os.isFamily(Os.FAMILY_MAC)) {
+ tasks.register("patchMacJpackage", Copy) {
+ dependsOn tasks.named("assembleJpackageImage")
+ from layout.projectDirectory.dir("installers/mac-installer")
+ include "MacDirLauncher"
+ filePermissions {
+ unix(0755)
}
+ into layout.buildDirectory.dir("jpackage/PcGen.app/Contents/MacOS")
+ def plistFile = layout.buildDirectory.file("jpackage/PcGen.app/Contents/Info.plist")
+ doLast {
+ def plist = plistFile.get().asFile
+ def content = plist.text
+ content = content.replace(
+ "CFBundleExecutable\n PcGen",
+ "CFBundleExecutable\n MacDirLauncher")
+ plist.text = content
+ }
+ }
+
+ tasks.register("fullJpackage") {
+ dependsOn tasks.named("patchMacJpackage")
+ description = "Build the native application bundle with jpackage"
+ }
+} else {
+ tasks.register("fullJpackage") {
+ dependsOn tasks.named("assembleJpackageImage")
+ description = "Build the native application bundle with jpackage"
}
}
-// Create the Data Convertor JAR
+// Create the Data Convertor JAR.
+// This is a thin jar containing only a manifest that points at pcgen.jar
+// (and the rest of the runtime classpath) via Class-Path.
tasks.register("converterJar", Jar) {
dependsOn jar
manifest {
- attributes 'Implementation-Title': 'PCGen Data Converter', 'Implementation-Version': archiveVersion,
- 'Main-Class': 'pcgen.gui2.converter.PCGenDataConvert', 'Class-Path': 'pcgen.jar' + classpath
+ attributes 'Implementation-Title': 'PCGen Data Converter',
+ 'Implementation-Version': archiveVersion,
+ 'Main-Class': 'pcgen.gui2.converter.PCGenDataConvert',
+ 'Class-Path': 'pcgen.jar' + classpath
}
archiveClassifier.set('batch-convert')
- from {
- configurations.runtimeClasspath.collect { it.directory ? it : zipTree(it) }
- }
-
- from sourceSets.main.output
- include 'none'
}
tasks.named("assemble") {
@@ -485,13 +519,11 @@ tasks.register("cleanOutput", Delete) {
delete outputDir
}
-// TODO - Hook this into a clean phase properly
-tasks.register("cleanJre", Delete) {
- description = "Clean up things copied to the jre folder by the build"
- delete jresDir
+tasks.register("cleanJdks", Delete) {
+ description = "Clean up things copied to the jdks folder by the build"
+ delete jdksDir
}
-// TODO - Hook this into a clean phase properly
tasks.register("cleanMods", Delete) {
description="Clean up things copied to the mods folder by the build"
delete modsDir
@@ -518,168 +550,101 @@ tasks.named("build") {
mustRunAfter clean
}
-tasks.register("downloadJRE") {
- notCompatibleWithConfigurationCache("Gradle download extension not compatible")
-
- def major = project.ext.javaVersion
- def architectures = ['x64', 'aarch64']
- def osList = ['windows', 'mac', 'linux']
- def baseJreDir = project.ext.jresDir
-
- doLast {
- println("Downloading JDKs for use in creating the runtime bundles.")
-
- osList.each {
- def os = "${it}"
- def extension = (os == "windows" ? "zip" : "tar.gz")
-
- architectures.each {
- def arch = "${it}"
- // TODO We don't currently support Windows aarch64, but once Eclipse Adoptium does we should remove this line
- if (arch == "aarch64" && os == "windows") return
-
- def url = "https://api.adoptium.net/v3/binary/latest/${major}/ga/${os}/${arch}/jdk/hotspot/normal/eclipse"
- def jreDownloadDest = baseJreDir.file("${os}/jre_${arch}.${extension}")
- def jreDir = baseJreDir.dir("${os}/jre_${arch}").asFile
- def jreRelease = (os == "mac"
- ? baseJreDir.dir("${os}/jre_${arch}/Contents/Home/release").asFile
- : baseJreDir.dir("${os}/jre_${arch}/release").asFile)
- def outputDir = baseJreDir.dir("${os}/jre_${arch}")
- def shouldDownloadJDK = true
-
- try {
- if (jreRelease.exists()) {
- def props = new Properties()
- jreRelease.withInputStream { props.load(it) }
- def javaVersion = StringUtils.strip((String)props.get("JAVA_VERSION"), "\"")
- shouldDownloadJDK = !javaVersion.startsWith(major.toString())
- println "JDK ${major} ${arch.padLeft(7)} for ${os.padLeft(7)} found with version ${javaVersion} at ${jreDir}, ${shouldDownloadJDK ? "starting" : "skipping"} downloading"
- }
- } catch (e) {
- throw new GradleException("There was an error in :downloadJRE", e)
- }
+ext {
+ platforms = [
+ [os: 'linux', arch: 'x64', ext: 'tar.gz'],
+ [os: 'linux', arch: 'aarch64', ext: 'tar.gz'],
+ [os: 'mac', arch: 'x64', ext: 'tar.gz'],
+ [os: 'mac', arch: 'aarch64', ext: 'tar.gz'],
+ [os: 'windows', arch: 'x64', ext: 'zip'],
+ ]
+}
- if (!shouldDownloadJDK) {
- return
- } else if (jreDir.exists()) {
- println "Delete the previously downloaded JDK at ${jreDir} as outdated. JavaFX modules will be deleted from jdkDir/jmods."
- delete(jreDir)
- }
+platforms.each { p ->
+ tasks.register("downloadJdk_${p.os}_${p.arch}", Download) {
+ description = "Downloads JDK for ${p.os} ${p.arch}"
+ src "https://api.adoptium.net/v3/binary/latest/${javaVersion}/ga/${p.os}/${p.arch}/jdk/hotspot/normal/eclipse"
+ dest jdksDir.file("jdk_${p.os}_${p.arch}.${p.ext}")
+ onlyIfModified true
+ overwrite false
+ useETag true
+ tempAndMove true
+ }
+}
- println("Downloading Java ${major} ${arch} for ${os} from ${url}")
- download.run {
- src url
- dest jreDownloadDest.asFile.absolutePath
- overwrite false
- }
+tasks.register("downloadJDKs") {
+ description = "Downloads JDKs for all supported platforms"
+ dependsOn platforms.collect { "downloadJdk_${it.os}_${it.arch}" }
+}
- baseJreDir.dir("${os}")
- .asFileTree
- .matching { include "*.${extension}" }
- .each { simLib ->
- def archFile = baseJreDir.file("${os}/${simLib.name}")
-
- copy {
- println "* Unpack $simLib.name to ${outputDir}"
-
- if (extension == "zip") {
- from zipTree(archFile)
- } else {
- from tarTree(archFile)
- }
- into outputDir
- eachFile { FileCopyDetails fcd ->
- def relPath = fcd.relativePath
- def segments = relPath.segments
- fcd.relativePath = new RelativePath(!fcd.isDirectory(), segments[1..-1] as String[])
- }
- }
-
- delete(archFile)
- }
-
- file("${projectDir}/jre/${os}/jre_${arch}").list().each { f ->
- if (f.startsWith("jdk")) {
- file("${projectDir}/jre/${os}/jre_${arch}/" + f).deleteDir()
- }
- }
+platforms.each { p ->
+ tasks.register("extractJdk_${p.os}_${p.arch}", Copy) {
+ description = "Extracts JDK archive for ${p.os} ${p.arch}"
+ dependsOn "downloadJdk_${p.os}_${p.arch}"
+
+ def archiveFile = jdksDir.file("jdk_${p.os}_${p.arch}.${p.ext}")
+ def outDir = jdksDir.dir("jdk_${p.os}_${p.arch}")
+
+ from(p.ext == 'zip' ? zipTree(archiveFile) : tarTree(archiveFile))
+ into outDir
+
+ eachFile { FileCopyDetails fcd ->
+ def segments = fcd.relativePath.segments
+ if (segments.length > 1) {
+ fcd.relativePath = new RelativePath(!fcd.isDirectory(), segments[1..-1] as String[])
}
}
+ includeEmptyDirs = false
+
+ onlyIf { !outDir.asFile.directory }
}
}
-tasks.register("downloadJavaFXModules") {
- notCompatibleWithConfigurationCache("Gradle download extension not compatible")
-
- mustRunAfter downloadJRE
-
- // We support Windows/Mac/Linux - x64, and Mac/Linux - aarch64
- def jfxVersion = project.ext.latestJavaVersion
-
- def architectures = ['x64', 'aarch64']
- def osList = ["windows", "mac", "linux"]
- def baseJreDir = project.ext.jresDir
- def projectDirPath = projectDir.absolutePath
+tasks.register("extractJDKs") {
+ description = "Extracts all downloaded JDK archives"
+ dependsOn platforms.collect { "extractJdk_${it.os}_${it.arch}" }
+}
- inputs.property("jfxVersion", jfxVersion)
+platforms.each { p ->
+ def osPackage = (p.os == 'mac') ? 'osx' : p.os
+ def archSuffix = (p.arch == 'x64') ? '-x64' : '-aarch64'
+ def fileName = "openjfx-${latestJavaVersion}_${osPackage}${archSuffix}_bin-jmods.zip"
+ tasks.register("downloadJfxMods_${p.os}_${p.arch}", Download) {
+ description = "Downloads JavaFX jmods for ${p.os} ${p.arch}"
+ dependsOn "extractJdk_${p.os}_${p.arch}"
+ src "https://download2.gluonhq.com/openjfx/${latestJavaVersion}/${fileName}"
+ dest jdksDir.file("jfx_jmods_${p.os}_${p.arch}.zip")
+ overwrite false
+ useETag true
+ tempAndMove true
+ }
- doLast {
- println("Downloading JavaFX modules (.mods) for use in the runtime bundles.")
- // Downloads javafx .mods for custom runtime image. All platforms downloaded
- osList.each { os ->
- // Build the os part of the filename string. Gluon renamed the mac package to osx
- def osPackage = (os == "mac") ? "osx" : os
+ tasks.register("extractJfxMods_${p.os}_${p.arch}", Copy) {
+ description = "Extracts JavaFX jmods into JDK for ${p.os} ${p.arch}"
+ dependsOn "downloadJfxMods_${p.os}_${p.arch}"
- architectures.each { arch ->
- // build the architecture part of the download filename string
- def archAppend
- if (arch == "x64") {
- archAppend = "-x64"
- } else if (arch == "aarch64" && os != "windows") {
- archAppend = "-aarch64"
- } else {
- return
- }
+ def jmodsTarget = (p.os == 'mac')
+ ? jdksDir.dir("jdk_${p.os}_${p.arch}/Contents/Home/jmods")
+ : jdksDir.dir("jdk_${p.os}_${p.arch}/jmods")
- // URLs look like this: https://download2.gluonhq.com/openjfx/25.0.1/openjfx-25.0.1_osx-aarch64_bin-jmods.zip
- def url = "https://download2.gluonhq.com/openjfx/${jfxVersion}/openjfx-${jfxVersion}_${osPackage}${archAppend}_bin-jmods.zip"
- def jmodsZip = baseJreDir.file("${os}/jmods${arch}.zip")
-
- // If we don't already have the jmods, download them and unzip them to the correct place.
- if (!jmodsZip.asFile.exists()) {
- println("Downloading JavaFX mods ${jfxVersion} ${arch} for ${os} from ${url} to ${projectDirPath}/jre/${os}/")
-
- download.run {
- src url
- dest jmodsZip
- overwrite false
- }
-
- copy {
- def zipFile = jmodsZip
- def outputDir = (os == "mac")
- ? "${projectDirPath}/jre/${os}/jre_${arch}/Contents/Home/jmods"
- : "${projectDirPath}/jre/${os}/jre_${arch}/jmods"
-
- println "Unzipping ${zipFile} to ${outputDir}"
- from zipTree(zipFile)
- into outputDir
- eachFile { fcd ->
- def relPath = fcd.relativePath
- def segments = relPath.segments
- fcd.relativePath = new RelativePath(!fcd.isDirectory(), (segments[1..-1]) as String[])
- }
- includeEmptyDirs = false
- }
- } else {
- println("* ${jmodsZip} already exists")
- }
- }
+ from zipTree(jdksDir.file("jfx_jmods_${p.os}_${p.arch}.zip"))
+ into jmodsTarget
+ eachFile { fcd ->
+ def segments = fcd.relativePath.segments
+ fcd.relativePath = new RelativePath(!fcd.isDirectory(), segments[1..-1] as String[])
}
+ includeEmptyDirs = false
+
+ onlyIf { !jmodsTarget.asFile.directory || jmodsTarget.asFile.list()?.length == 0 }
}
}
+tasks.register("downloadJavaFXMods") {
+ description = "Downloads and extracts JavaFX jmods into each platform JDK"
+ dependsOn platforms.collect { "extractJfxMods_${it.os}_${it.arch}" }
+}
+
tasks.register("downloadJavaFXLocal", Download) {
description = "Downloads the JavaFX modules for the current platform to the 'mods' directory for local testing"
def supportedOS = [(Os.FAMILY_WINDOWS): "windows",
@@ -739,8 +704,9 @@ tasks.named("compileJava") {
dependsOn copyMasterSheets
}
-tasks.named("jre") {
- dependsOn downloadJRE, downloadJavaFXModules
+tasks.register("jre") {
+ description = "Prepares all platform JDKs with JavaFX modules for runtime image creation"
+ dependsOn downloadJavaFXMods
}
tasks.register("testCoverage", JacocoReport) {
@@ -762,9 +728,25 @@ tasks.register("testCoverage", JacocoReport) {
executionData.from = fileTree(dir: layout.buildDirectory.dir("jacoco")).include("*.exec")
}
+// https://docs.gradle.org/current/userguide/performance.html#a_run_tests_in_parallel
+def parallelTestForks = Runtime.runtime.availableProcessors().intdiv(2) ?: 1
+
tasks.named("test", Test) {
exclude 'test/pcgen/testsupport/**'
useJUnitPlatform()
+ maxParallelForks = parallelTestForks
+ // TestFX/Monocle setup â only the unit test source set has TestFX-based tests.
+ jvmArgs += [
+ '-Dtestfx.robot=glass',
+ '-Dtestfx.headless=true',
+ '-Dprism.order=sw',
+ // Workaround for TestFX modularity issue. https://github.com/TestFX/TestFX/issues/638
+ '--add-exports', 'javafx.graphics/com.sun.javafx.application=ALL-UNNAMED',
+ // Required for Monocle.
+ '--add-exports', 'javafx.graphics/com.sun.javafx.util=ALL-UNNAMED',
+ '--add-exports', 'javafx.base/com.sun.javafx.logging=ALL-UNNAMED',
+ '--add-opens', 'javafx.graphics/com.sun.glass.ui=ALL-UNNAMED',
+ ]
}
tasks.register("itest", Test) {
@@ -773,6 +755,7 @@ tasks.register("itest", Test) {
testClassesDirs = sourceSets.itest.output.classesDirs
classpath = sourceSets.itest.runtimeClasspath
systemProperties['jar.path'] = jar.getArchiveFile().get().getAsFile()
+ maxParallelForks = parallelTestForks
}
tasks.register("slowtest", Test) {
@@ -800,44 +783,23 @@ tasks.register("inttest", Test) {
include 'slowtest/pcgen/inttest/**/*Test.class'
}
-tasks.register("sfinttest", Test) {
- dependsOn jar
- testClassesDirs = sourceSets.slowtest.output.classesDirs
- classpath = sourceSets.slowtest.runtimeClasspath
- forkEvery = 1
- include 'slowtest/pcgen/inttest/game_starfinder/*Test.class'
-}
-
-tasks.register("pfinttest", Test) {
- dependsOn jar
- testClassesDirs = sourceSets.slowtest.output.classesDirs
- classpath = sourceSets.slowtest.runtimeClasspath
- forkEvery = 1
- include 'slowtest/pcgen/inttest/game_pathfinder/*Test.class'
-}
-
-tasks.register("rsrdinttest", Test) {
- dependsOn jar
- testClassesDirs = sourceSets.slowtest.output.classesDirs
- classpath = sourceSets.slowtest.runtimeClasspath
- forkEvery = 1
- include 'slowtest/pcgen/inttest/game_35e/*Test.class'
-}
-
-tasks.register("srdinttest", Test) {
- dependsOn jar
- testClassesDirs = sourceSets.slowtest.output.classesDirs
- classpath = sourceSets.slowtest.runtimeClasspath
- forkEvery = 1
- include 'slowtest/pcgen/inttest/game_3e/*Test.class'
-}
-
-tasks.register("msrdinttest", Test) {
- dependsOn jar
- testClassesDirs = sourceSets.slowtest.output.classesDirs
- classpath = sourceSets.slowtest.runtimeClasspath
- forkEvery = 1
- include 'slowtest/pcgen/inttest/game_modern/*Test.class'
+// Per-game-mode inttest variants. Each runs only the inttest classes for one
+// game directory under code/src/test/pcgen/inttest. CI references these names
+// (e.g. pfinttest) so the task names are stable.
+[
+ sfinttest : 'game_starfinder',
+ pfinttest : 'game_pathfinder',
+ rsrdinttest: 'game_35e',
+ srdinttest : 'game_3e',
+ msrdinttest: 'game_modern',
+].each { taskName, gameDir ->
+ tasks.register(taskName, Test) {
+ dependsOn jar
+ testClassesDirs = sourceSets.slowtest.output.classesDirs
+ classpath = sourceSets.slowtest.runtimeClasspath
+ forkEvery = 1
+ include "slowtest/pcgen/inttest/${gameDir}/*Test.class"
+ }
}
allprojects {
@@ -855,22 +817,13 @@ allprojects {
}
jvmArgs += [
'-Djava.awt.headless=true',
- '-Dtestfx.robot=glass',
- '-Dtestfx.headless=true',
- '-Dprism.order=sw',
- '-Dprism.verbose=true',
'-Djavafx.macosx.embedded=true',
'-Djava.security.manager=disallow',
"--module-path", layout.projectDirectory.dir("mods/lib"),
"--add-modules", "javafx.controls,javafx.web,javafx.swing,javafx.fxml,javafx.graphics",
- // Needed to fix issue with testfx test crashing due to issue with modularity of whole program. Slightly related issue. https://github.com/TestFX/TestFX/issues/638
- '--add-exports', 'javafx.graphics/com.sun.javafx.application=ALL-UNNAMED',
- // Next two needed to support monocle testing
- '--add-exports', 'javafx.graphics/com.sun.javafx.util=ALL-UNNAMED',
- '--add-exports', 'javafx.base/com.sun.javafx.logging=ALL-UNNAMED',
- '--add-opens', 'javafx.graphics/com.sun.glass.ui=ALL-UNNAMED',
+ '--enable-native-access=javafx.graphics',
]
}
@@ -879,11 +832,21 @@ allprojects {
options.fork = true
options.release = project.ext.javaVersion
+ def modsLibPath = layout.projectDirectory.dir("mods/lib").asFile.absolutePath
+ def depJars = configurations.runtimeClasspath.files.findAll {
+ !it.name.startsWith('javafx-')
+ }.collect { it.absolutePath }.join(File.pathSeparator)
+ def compileOnlyJars = configurations.compileClasspath.files.findAll {
+ it.name.contains('annotations') || it.name.contains('spotbugs')
+ }.collect { it.absolutePath }.join(File.pathSeparator)
+
doFirst {
if (name.toLowerCase().contains("test")) {
- options.compilerArgs << "--module-path" << layout.projectDirectory.dir("mods/lib").asFile.absolutePath
- //options.compilerArgs << "--add-modules" << "javafx.controls,javafx.web,javafx.swing,javafx.fxml" // Not sure why no javafx.graphics here
+ options.compilerArgs << "--module-path" << modsLibPath
options.compilerArgs << "--add-modules" << "javafx.controls,javafx.web,javafx.swing,javafx.fxml,javafx.graphics"
+ } else if (name == "compileJava") {
+ def modulePath = [modsLibPath, depJars, compileOnlyJars].findAll { it }.join(File.pathSeparator)
+ options.compilerArgs << "--module-path" << modulePath
}
println "Args for for $name are $options.allCompilerArgs"
}
@@ -976,5 +939,5 @@ tasks.register("allTasks") {
// you will also need to clean out output/ bin/
// This task is in the end, because other scripts contribute to the building process
tasks.named("clean") {
- dependsOn cleanPlugins, cleanOutput, cleanJre, cleanMods, cleanMasterSheets
+ dependsOn cleanPlugins, cleanOutput, cleanJdks, cleanMods, cleanMasterSheets
}
diff --git a/code/gradle/distribution.gradle b/code/gradle/distribution.gradle
index 42964dc8127..204706e0f4a 100644
--- a/code/gradle/distribution.gradle
+++ b/code/gradle/distribution.gradle
@@ -40,12 +40,6 @@ ext {
}
}
- programDistsImage = copySpec {
- from(layout.buildDirectory.dir("launch4j")) {
- include 'pcgen.exe'
- }
- }
-
programScriptImage = copySpec {
from('.') {
include 'pcgen_low_mem.bat'
@@ -75,12 +69,6 @@ ext {
include 'characters/*.pcg'
}
}
-
- jreImage = copySpec {
- from('.') {
- include 'jre/windows/**'
- }
- }
}
application {
@@ -93,7 +81,6 @@ application {
applicationDistribution.with(autobuildSpec)
applicationDistribution.with(charactersImage)
applicationDistribution.with(programScriptImage)
- applicationDistribution.with(programDistsImage)
}
tasks.named("run") {
@@ -113,25 +100,9 @@ tasks.named("run") {
}
tasks.named("installDist") {
- doLast{
- delete {
- delete fileTree(layout.buildDirectory.dir("install/pcgen/lib")) {
- include 'javafx-*'
- }
- }
- }
-}
-
-tasks.register("testZip", Zip) {
- dependsOn converterJar, copyToLibs, copyToOutput
- archiveClassifier.set('test')
- into(zipRootFolder) {
- with dataDistsImage
- with docsDistsImage
- with programDistsImage
- with libsDistsImage
- with autobuildSpec
- with charactersImage
+ def installLibDir = layout.buildDirectory.dir("install/pcgen/lib")
+ doLast {
+ installLibDir.get().asFile.listFiles()?.findAll { it.name.startsWith('javafx-') }?.each { it.delete() }
}
}
@@ -156,7 +127,6 @@ tasks.register("programZip", Zip) {
dependsOn converterJar
archiveClassifier.set('program')
into(zipRootFolder) {
- with programDistsImage
with programScriptImage
with autobuildSpec
}
@@ -172,6 +142,6 @@ tasks.register("libsZip", Zip) {
}
tasks.register("buildDist") {
- dependsOn dataZip, docsZip, programZip, libsZip, runtimeZip
+ dependsOn dataZip, docsZip, programZip, libsZip, jlinkZip
description = "Build the five zip files (docs, data, program, libs and full) which comprise the autobuild distribution."
}
diff --git a/code/gradle/release.gradle b/code/gradle/release.gradle
index c7ee590cbcd..8b1079210d6 100644
--- a/code/gradle/release.gradle
+++ b/code/gradle/release.gradle
@@ -22,245 +22,13 @@
apply from: "code/gradle/releaseUtils.groovy"
apply plugin: 'java'
-import org.apache.tools.ant.filters.FixCrLfFilter
import org.apache.tools.ant.taskdefs.condition.Os
-import org.gradle.api.internal.file.copy.DefaultCopySpec
ext {
// Work out the path to the release notes for our current version.
plainVerNum = version.replaceAll('-SNAPSHOT', '')
shortVerNum = plainVerNum.replaceAll(/\./, '')
releaseNotes = "${projectDir}/installers/release-notes/pcgen-release-notes-${shortVerNum}.html"
-
- nsisBaseFolder = layout.buildDirectory.dir("nsis/PCGen_${shortVerNum}_base")
- nsisOptionFolder = layout.buildDirectory.dir("nsis/PCGen_${shortVerNum}_opt")
-
- // specifications for what to copy to the NSIS base and optional folders
- baseLibs = copySpec {
- from(layout.buildDirectory.dir("libs")) {
- exclude 'pcgen-*.jar'
- exclude 'fop*.jar'
- exclude 'batik*.jar'
- }
- into ('/libs')
- } as DefaultCopySpec
-
- lib32 = copySpec {
- from(layout.buildDirectory.dir("image/pcgen-windows-x32/lib")) {
- exclude 'fop*.jar'
- exclude 'batik*.jar'
- }
- into('/lib32')
- } as DefaultCopySpec
-
- lib64 = copySpec {
- from(layout.buildDirectory.dir("image/pcgen-windows-x64/lib")) {
- exclude 'fop*.jar'
- exclude 'batik*.jar'
- exclude 'javafx*.jar'
- }
- into('/lib64')
- } as DefaultCopySpec
-
- pdfLibs = copySpec {
- from(layout.buildDirectory.dir("libs")) {
- include 'fop*.jar'
- include 'batik*.jar'
- }
- into ('/plugin/pdf/libs')
- } as DefaultCopySpec
-
- basePlugins = copySpec {
- from(layout.projectDirectory.dir("plugins")) {
- include '*plugins/**'
- include 'Random Names/**'
- include 'DoomsdayBook.jar'
- }
- into ('/plugins')
- } as DefaultCopySpec
-
- gmgenPlugins = copySpec {
- from(layout.projectDirectory.dir("plugins")) {
- exclude '*plugins/**'
- exclude 'Random Names/**'
- exclude 'DoomsdayBook.jar'
- }
- into ('/plugin/gmgen/plugins')
- } as DefaultCopySpec
-
- nonPdfOutput = copySpec {
- from(layout.projectDirectory.dir("outputsheets")) {
- exclude '**/pdf/**'
- }
- into ('/outputsheets')
- } as DefaultCopySpec
-
- pdfOutput = copySpec {
- from(layout.projectDirectory.dir("outputsheets")) {
- include '**/pdf/**'
- }
- into ('/plugin/pdf/outputsheets')
- } as DefaultCopySpec
-
- baseData = copySpec {
- from(layout.projectDirectory.dir("data")) {
- include 'customsources/**'
- include 'homebrew/**'
- }
- into ('/data')
- } as DefaultCopySpec
-
- optionalData = copySpec {
- from(layout.projectDirectory.dir("data")) {
- exclude 'customsources/**'
- exclude 'homebrew/**'
- }
- into ('/data')
- } as DefaultCopySpec
-
- List result = plainVerNum.replaceAll('-DEV', '').tokenize('.')
- installerVerNum = result[0].toInteger() + "." + result[1].toInteger() + "." + result[2].take(2).toInteger() + ".0"
-}
-
-// Generate the publisher/data list for the Windows installer script
-tasks.register("genDataList") {
-
- notCompatibleWithConfigurationCache("File manipulation involved in genDataList")
-
- inputs.dir layout.projectDirectory.dir("data")
-
- def dataNsh = layout.projectDirectory.file("installers/win-installer/includes/data.nsh")
- outputs.file dataNsh
-
- // TODO: find a way to move it to ext section.
- // The list of publishers - add an entry here to correct a reported missing publisher
- def publisherMap = ["12_to_midnight" : "12 to Midnight",
- "4_winds_fantasy_gaming" : "4 Winds Fantasy Gaming",
- "alderac_entertainment_group": "Alderac Entertainment Group",
- "alderac_ent_group" : "Alderac Entertainment Group",
- "alea_publishing_group" : "Alea Publishing Group",
- "alluria_publishing" : "Alluria Publishing",
- "ascension_games" : "Ascension Games",
- "atlas_games" : "Atlas Games",
- "auran_d20" : "Auran d20",
- "avalanche_press" : "Avalanche Press",
- "badaxe_games" : "Bad Axe Games",
- "bards_and_sages" : "Bards and Sages",
- "bastion_press" : "Bastion Press",
- "battlefield_press" : "Battlefield Press",
- "behemoth3" : "Behemoth3",
- "big_finger_games" : "Big Finger Games",
- "bloodstone_press" : "Bloodstone Press",
- "blue_devil_games" : "Blue Devil Games",
- "broken_ruler_games" : "Broken Ruler Games",
- "crafty_games" : "Crafty Games",
- "creativemountaingames" : "Creative Mountain Games",
- "distant_horizons_games" : "Distant Horizons Games",
- "doghouse_rules" : "Dog House Rules",
- "dragonwing_games" : "DragonWing Games",
- "dreamscarred_press" : "Dreamscarred Press",
- "en_publishing" : "EN Publishing",
- "everyman_gaming" : "Everyman Gaming",
- "fantasy_community_council" : "Fantasy Community Council",
- "fantasy_flight_games" : "Fantasy Flight Games",
- "gallantry_productions" : "Gallantry Productions",
- "goodman_games" : "Goodman Games",
- "green_ronin" : "Green Ronin",
- "kobold_press" : "Kobold Press",
- "legendary_games" : "Legendary Games",
- "lions_den_press" : "Lions Den Press",
- "lone_wanderer_entertainment": "Lone Wanderer Entertainment",
- "malhavoc_press" : "Malhavoc Press",
- "minotaur_games" : "Minotaur Games",
- "mongoose" : "Mongoose",
- "mongoose_publishing" : "Mongoose Publishing",
- "msrd" : "MSRD",
- "mythic_dream_studios" : "Mythic Dreams Studios",
- "necromancer_games" : "Necromancer Games",
- "nitehawk_interactive" : "Nitehawk Interactive Games",
- "pandahead" : "Pandahead",
- "paradigm_concepts" : "Paradigm Concepts Inc",
- "paizo" : "Paizo Publishing",
- "parents_basement_games" : "Parents Basement Games",
- "pcgen" : "PCGen OGL",
- "pfsrd_publishing" : "Open Game Network (d20pfsrd,",
- "pinnacle_entertainment" : "Pinnacle Entertainment",
- "reality_deviant" : "Reality Deviant Publications",
- "rite" : "Rite Publishing",
- "rite_publishing" : "Rite Publishing",
- "rpg_objects" : "RPG Objects",
- "sagaborn" : "Sagaborn",
- "secular_games" : "Secular Games",
- "silven_publishing" : "Silven Publishing",
- "silverthorne_games" : "Silverthorne Games",
- "skirmisher_publishing" : "Skirmisher Publishing LLC",
- "sovereign_press" : "Sovereign Press",
- "srd" : "SRD",
- "srd35" : "SRD35",
- "st_cooley_publishing" : "S T Cooley Publishing",
- "storm_bunny_studios" : "Storm Bunny Studios",
- "super_genius_games" : "Super Genius Games",
- "sword_and_sorcery_studios" : "Sword and Sorcery Studios",
- "swords_edge_publishing" : "Swords Edge Publishing",
- "the_game_mechanics" : "The Game Mechanics Inc",
- "vigilance_press" : "Vigilance Press",
- "wizards_of_the_coast" : "Wizards of the Coast",
- "lpj_design" : "Louis Porter Jr. Design",
- "tripod_machine" : "Tripod Machine",
- "total_party_kill_games" : "Total Party Kill Games",
- "starfinder" : "Starfinder"]
-
- doLast {
- project.delete(dataNsh)
- def out = new StringBuilder()
-
- // List of folder names to ignore.
- def ignoreList = ["homebrew", "zen_test", "customsources", "_universal", "_images", "publisher_logos"]
-
- // List of sections
- def sectionsIn = [msrd: "3 6", pcgen: "3 4 5", srd: "3 4", srd35: "3 5", necromancergames: "3 5", paizo: "3"]
-
- layout.projectDirectory.dir("data").asFile.eachDir {
- if (ignoreList.contains(it.name))
- {
- return
- }
- out.append("SubSection \"$it.name\"\n")
- def dir = it.name
- def subFolders = 0
- it.eachDir {
- if (ignoreList.contains(it.name))
- {
- return
- }
- def pubname = publisherMap.getOrDefault(it.name, it.name)
- def sectionIn = sectionsIn.getOrDefault(it.name, "")
-
- out.append("""\tSection "$pubname"
-\t\tSectionIn 1 2 ${sectionIn}
-\t\tSetOutPath "\$INSTDIR\\\${APPDIR}\\data\\${dir}\\${it.name}"
-\t\tFile /r "\${SrcDir}\\PCGen_\${SIMPVER}_opt\\data\\${dir}\\${it.name}\\*.*"
-\tSectionEnd
-
-""")
- subFolders++
- }
- if (subFolders == 0){
- def pubname = publisherMap.getOrDefault(it.name, it.name)
- out.append("""\tSection "$pubname"
-\t\tSectionIn 1 2
-\t\tSetOutPath "\$INSTDIR\\\${APPDIR}\\data\\${dir}"
-\t\tFile /r "\${SrcDir}\\PCGen_\${SIMPVER}_opt\\data\\${dir}\\*.*"
-\tSectionEnd
-
-""")
- }
- out.append("SubSectionEnd\n\n")
- }
-
- println("Writing data to: ${outputs.files.singleFile}")
- outputs.files.singleFile.text = out
- }
}
tasks.register("sourcesJar", Jar) {
@@ -272,11 +40,11 @@ tasks.register("sourcesJar", Jar) {
}
tasks.register("assembleArtifacts", Copy) {
- dependsOn build, runtimeZip, sourcesJar
+ dependsOn build, jlinkZip, sourcesJar
if (Os.isFamily(Os.FAMILY_MAC) || Os.isFamily(Os.FAMILY_UNIX))
{
- dependsOn jpackage
+ dependsOn fullJpackage
}
description = "Create the release artifacts and get them into the release folder."
@@ -351,7 +119,6 @@ tasks.register("checksum") {
}
}
-// genDataList removed as it causes release errors, 'genDataList'
tasks.register("prepareRelease") {
dependsOn build
description = """Prepare PCGen for release. This will update and commit the version, \
@@ -364,11 +131,10 @@ tasks.register("pcgenRelease") {
// Installer is placed in outputDir
}
-// Update the PCGen version to indicate a release, then commit the new version
+// Update the PCGen version to indicate a release. Commit the change manually.
tasks.register("updateVersionRelease") {
doLast {
unSnapshotVersion()
- commitFile(file("gradle.properties"), "Update version for release ${project.version}")
}
}
@@ -377,10 +143,9 @@ tasks.register("pcgenReleaseOfficial") {
description = "Release a new official version of PCGen."
}
-// Update the PCGen version for development of the next release, then commit the new version
+// Update the PCGen version for development of the next release. Commit the change manually.
tasks.register("updateVersionToNext") {
doLast {
updateVersion()
- commitFile(file("gradle.properties"), "Update version for dev work ${project.version}")
}
}
diff --git a/code/gradle/reporting.gradle b/code/gradle/reporting.gradle
index 5fdf70b4583..faee4ecd800 100644
--- a/code/gradle/reporting.gradle
+++ b/code/gradle/reporting.gradle
@@ -13,6 +13,10 @@ checkstyle {
sourceSets = []
}
+tasks.withType(Checkstyle).configureEach {
+ exclude '**/module-info.java'
+}
+
pmd {
// turn off the default rules
ruleSets = []
diff --git a/code/src/java/module-info.java b/code/src/java/module-info.java
new file mode 100644
index 00000000000..24f531f734b
--- /dev/null
+++ b/code/src/java/module-info.java
@@ -0,0 +1,81 @@
+module pcgen {
+ requires java.desktop;
+ requires java.logging;
+ requires java.naming;
+ requires java.net.http;
+ requires java.prefs;
+ requires java.scripting;
+ requires java.sql;
+ requires java.xml;
+ requires java.management;
+ requires java.rmi;
+ requires jdk.httpserver;
+ requires jdk.unsupported;
+ requires jdk.xml.dom;
+
+ requires javafx.controls;
+ requires javafx.fxml;
+ requires javafx.graphics;
+ requires javafx.swing;
+ requires javafx.web;
+
+ requires PCGen.base;
+ requires PCGen.Formula;
+
+ requires org.apache.commons.lang3;
+ requires org.apache.commons.io;
+ requires org.apache.commons.collections4;
+ requires freemarker;
+ requires org.jdom2;
+ requires net.sourceforge.argparse4j;
+ requires org.controlsfx.controls;
+ requires org.xmlunit;
+ requires org.apache.xmlgraphics.fop.core;
+ requires org.apache.xmlgraphics.fop.events;
+ requires org.apache.xmlgraphics.commons;
+ requires spring.web;
+ requires spring.beans;
+ requires spring.core;
+ requires Saxon.HE;
+ requires jep;
+
+ requires static org.jetbrains.annotations;
+ requires static com.github.spotbugs.annotations;
+
+ exports pcgen.core;
+ exports pcgen.gui2;
+ exports pcgen.gui3;
+ exports pcgen.io;
+ exports pcgen.persistence;
+ exports pcgen.pluginmgr;
+ exports pcgen.system;
+ exports pcgen.util;
+
+ opens pcgen.system;
+ opens pcgen.pluginmgr;
+ opens pcgen.core.bonus;
+ opens pcgen.core.prereq;
+ opens pcgen.cdom.facet;
+ opens pcgen.cdom.facet.analysis;
+ opens pcgen.cdom.facet.fact;
+ opens pcgen.cdom.facet.input;
+ opens pcgen.cdom.facet.model;
+ opens pcgen.cdom.formula.scope;
+ opens pcgen.cdom.reference;
+ opens pcgen.cdom.enumeration;
+ opens pcgen.persistence.lst;
+ opens pcgen.rules.persistence;
+ opens pcgen.rules.context;
+ opens pcgen.gui2.converter;
+ opens pcgen.gui3;
+ opens pcgen.gui3.application;
+ opens pcgen.gui3.behavior;
+ opens pcgen.gui3.component;
+ opens pcgen.gui3.core;
+ opens pcgen.gui3.dialog;
+ opens pcgen.gui3.preferences;
+ opens pcgen.gui3.preloader;
+ opens pcgen.gui3.utilty;
+ opens pcgen.io;
+ opens pcgen.util;
+}
diff --git a/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java b/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java
index 514fcdebb16..ddd1b30309e 100644
--- a/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java
+++ b/code/src/java/pcgen/cdom/choiceset/ReferenceChoiceSet.java
@@ -24,7 +24,7 @@
import java.util.Objects;
import java.util.Set;
-import pcgen.base.util.WeightedCollection;
+import pcgen.util.WeightedCollection;
import pcgen.cdom.base.CDOMReference;
import pcgen.cdom.base.Constants;
import pcgen.cdom.base.PrimitiveChoiceSet;
diff --git a/code/src/java/pcgen/cdom/facet/HitPointFacet.java b/code/src/java/pcgen/cdom/facet/HitPointFacet.java
index f64617c2e9f..4f49b8af533 100644
--- a/code/src/java/pcgen/cdom/facet/HitPointFacet.java
+++ b/code/src/java/pcgen/cdom/facet/HitPointFacet.java
@@ -17,7 +17,7 @@
*/
package pcgen.cdom.facet;
-import pcgen.base.util.RandomUtil;
+import pcgen.util.RandomUtil;
import pcgen.cdom.base.CDOMObject;
import pcgen.cdom.base.Constants;
import pcgen.cdom.content.HitDie;
diff --git a/code/src/java/pcgen/core/RollingMethods.java b/code/src/java/pcgen/core/RollingMethods.java
index a79063dfaed..8f18e2c311e 100644
--- a/code/src/java/pcgen/core/RollingMethods.java
+++ b/code/src/java/pcgen/core/RollingMethods.java
@@ -23,7 +23,7 @@
import java.util.Vector;
import java.util.stream.IntStream;
-import pcgen.base.util.RandomUtil;
+import pcgen.util.RandomUtil;
import pcgen.util.Logging;
import org.nfunk.jep.JEP;
diff --git a/code/src/java/pcgen/core/kit/KitGear.java b/code/src/java/pcgen/core/kit/KitGear.java
index 1d114254c7d..8a90e7cc996 100644
--- a/code/src/java/pcgen/core/kit/KitGear.java
+++ b/code/src/java/pcgen/core/kit/KitGear.java
@@ -25,7 +25,7 @@
import java.util.List;
import pcgen.base.formula.Formula;
-import pcgen.base.util.NamedFormula;
+import pcgen.util.NamedFormula;
import pcgen.cdom.base.CDOMReference;
import pcgen.cdom.base.Constants;
import pcgen.cdom.helper.EqModRef;
diff --git a/code/src/java/pcgen/base/format/HandedManager.java b/code/src/java/pcgen/format/HandedManager.java
similarity index 98%
rename from code/src/java/pcgen/base/format/HandedManager.java
rename to code/src/java/pcgen/format/HandedManager.java
index b1f0099c632..698fcdf3a5c 100644
--- a/code/src/java/pcgen/base/format/HandedManager.java
+++ b/code/src/java/pcgen/format/HandedManager.java
@@ -13,7 +13,7 @@
* this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
-package pcgen.base.format;
+package pcgen.format;
import java.util.Arrays;
import java.util.Optional;
diff --git a/code/src/java/pcgen/output/channel/compat/HandedCompat.java b/code/src/java/pcgen/output/channel/compat/HandedCompat.java
index 0915f0ff044..7c225360fa9 100644
--- a/code/src/java/pcgen/output/channel/compat/HandedCompat.java
+++ b/code/src/java/pcgen/output/channel/compat/HandedCompat.java
@@ -1,6 +1,6 @@
package pcgen.output.channel.compat;
-import pcgen.base.format.HandedManager;
+import pcgen.format.HandedManager;
import pcgen.base.util.FormatManager;
import pcgen.cdom.enumeration.CharID;
import pcgen.cdom.enumeration.Handed;
diff --git a/code/src/java/pcgen/rules/persistence/TokenSupport.java b/code/src/java/pcgen/rules/persistence/TokenSupport.java
index d1d89e07e76..a46cc957648 100644
--- a/code/src/java/pcgen/rules/persistence/TokenSupport.java
+++ b/code/src/java/pcgen/rules/persistence/TokenSupport.java
@@ -28,9 +28,9 @@
import pcgen.base.proxy.StagingInfo;
import pcgen.base.util.CaseInsensitiveMap;
import pcgen.base.util.DoubleKeyMapToList;
-import pcgen.base.util.ProxyUtilities;
+import pcgen.util.ProxyUtilities;
import pcgen.base.util.TripleKeyMapToList;
-import pcgen.base.util.WeightedCollection;
+import pcgen.util.WeightedCollection;
import pcgen.cdom.base.GroupDefinition;
import pcgen.cdom.base.Loadable;
import pcgen.rules.context.LoadContext;
diff --git a/code/src/java/pcgen/rules/persistence/token/AbstractToken.java b/code/src/java/pcgen/rules/persistence/token/AbstractToken.java
index 9fe9d46aec9..0b627d8ad84 100644
--- a/code/src/java/pcgen/rules/persistence/token/AbstractToken.java
+++ b/code/src/java/pcgen/rules/persistence/token/AbstractToken.java
@@ -26,7 +26,6 @@
import pcgen.rules.context.LoadContext;
import pcgen.util.Logging;
-import org.apache.xml.utils.XMLChar;
public abstract class AbstractToken
{
@@ -128,16 +127,24 @@ protected ParseResult checkNonEmpty(String value)
}
/**
- * Checks a string to see if any characters are invalid for inclusion in
+ * Checks a string to see if any characters are invalid for inclusion in
* XML strings.
- * @param value The string to check.
- * @return A parse result of success if the string uses only valid characters.
+ * @param c The character to check.
+ * @return {@code true} if the character is valid in XML.
*/
+ // XML 1.0 §2.2: valid chars are #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD]
+ private static boolean isValidXMLChar(char c)
+ {
+ return c == 0x9 || c == 0xA || c == 0xD
+ || (c >= 0x20 && c <= 0xD7FF)
+ || (c >= 0xE000 && c <= 0xFFFD);
+ }
+
protected ParseResult checkForInvalidXMLChars(String value)
{
for (char character : value.toCharArray())
{
- if (!XMLChar.isValid(character))
+ if (!isValidXMLChar(character))
{
return new ParseResult.Fail(
"Invalid XML character 0x" + Integer.toString(character, 16) + " in " + value);
diff --git a/code/src/java/pcgen/base/util/NamedFormula.java b/code/src/java/pcgen/util/NamedFormula.java
similarity index 98%
rename from code/src/java/pcgen/base/util/NamedFormula.java
rename to code/src/java/pcgen/util/NamedFormula.java
index 01458681e5e..f7301da55dc 100644
--- a/code/src/java/pcgen/base/util/NamedFormula.java
+++ b/code/src/java/pcgen/util/NamedFormula.java
@@ -15,7 +15,7 @@
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-package pcgen.base.util;
+package pcgen.util;
import pcgen.base.formula.Formula;
diff --git a/code/src/java/pcgen/base/util/ProxyUtilities.java b/code/src/java/pcgen/util/ProxyUtilities.java
similarity index 98%
rename from code/src/java/pcgen/base/util/ProxyUtilities.java
rename to code/src/java/pcgen/util/ProxyUtilities.java
index f3c6c0effab..6d5f48bb593 100644
--- a/code/src/java/pcgen/base/util/ProxyUtilities.java
+++ b/code/src/java/pcgen/util/ProxyUtilities.java
@@ -13,7 +13,7 @@
* this library; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
* Suite 330, Boston, MA 02111-1307 USA
*/
-package pcgen.base.util;
+package pcgen.util;
import pcgen.base.proxy.ItemProcessor;
import pcgen.base.proxy.ListProcessor;
diff --git a/code/src/java/pcgen/base/util/RandomUtil.java b/code/src/java/pcgen/util/RandomUtil.java
similarity index 97%
rename from code/src/java/pcgen/base/util/RandomUtil.java
rename to code/src/java/pcgen/util/RandomUtil.java
index 2b106e97c4f..2173f6108de 100644
--- a/code/src/java/pcgen/base/util/RandomUtil.java
+++ b/code/src/java/pcgen/util/RandomUtil.java
@@ -13,12 +13,10 @@
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-package pcgen.base.util;
+package pcgen.util;
import java.util.Random;
-import pcgen.util.Logging;
-
/**
* This class provides utility functions for random number generation.
*
diff --git a/code/src/java/pcgen/base/util/WeightedCollection.java b/code/src/java/pcgen/util/WeightedCollection.java
similarity index 99%
rename from code/src/java/pcgen/base/util/WeightedCollection.java
rename to code/src/java/pcgen/util/WeightedCollection.java
index b808a3708d3..6ec4b75e20f 100644
--- a/code/src/java/pcgen/base/util/WeightedCollection.java
+++ b/code/src/java/pcgen/util/WeightedCollection.java
@@ -16,7 +16,7 @@
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
-package pcgen.base.util;
+package pcgen.util;
import java.util.AbstractCollection;
import java.util.Collection;
@@ -26,6 +26,8 @@
import java.util.TreeSet;
import java.util.function.Predicate;
+import pcgen.base.util.ListSet;
+
import org.jetbrains.annotations.NotNull;
/**
diff --git a/code/src/java/pcgen/util/chooser/RandomChooser.java b/code/src/java/pcgen/util/chooser/RandomChooser.java
index bc4f54464cb..aa0bb7b1168 100644
--- a/code/src/java/pcgen/util/chooser/RandomChooser.java
+++ b/code/src/java/pcgen/util/chooser/RandomChooser.java
@@ -17,7 +17,7 @@
*/
package pcgen.util.chooser;
-import pcgen.base.util.RandomUtil;
+import pcgen.util.RandomUtil;
import pcgen.facade.core.ChooserFacade;
import pcgen.facade.core.InfoFacade;
import pcgen.facade.util.ListFacade;
diff --git a/code/src/java/pcgen/util/fop/FopTask.java b/code/src/java/pcgen/util/fop/FopTask.java
index 5a6c4c932ae..0f282a80253 100644
--- a/code/src/java/pcgen/util/fop/FopTask.java
+++ b/code/src/java/pcgen/util/fop/FopTask.java
@@ -64,7 +64,8 @@ public final class FopTask implements Runnable
private static final FopFactory FOP_FACTORY = createFopFactory();
private static FOUserAgent userAgent;
- private static final TransformerFactory TRANS_FACTORY = TransformerFactory.newInstance();
+ private static final TransformerFactory TRANS_FACTORY =
+ TransformerFactory.newInstance("net.sf.saxon.TransformerFactoryImpl", null);
private static FopFactory createFopFactory()
{
diff --git a/code/src/java/plugin/lsttokens/MovecloneLst.java b/code/src/java/plugin/lsttokens/MovecloneLst.java
index c9734c63eb6..9d3af4be5d9 100644
--- a/code/src/java/plugin/lsttokens/MovecloneLst.java
+++ b/code/src/java/plugin/lsttokens/MovecloneLst.java
@@ -21,7 +21,7 @@
import java.util.StringTokenizer;
import java.util.function.Function;
-import pcgen.base.util.WeightedCollection;
+import pcgen.util.WeightedCollection;
import pcgen.cdom.base.CDOMObject;
import pcgen.cdom.base.Constants;
import pcgen.cdom.base.Ungranted;
diff --git a/code/src/java/plugin/lsttokens/auto/EquipToken.java b/code/src/java/plugin/lsttokens/auto/EquipToken.java
index 372cb9fe6b9..8e8a2298736 100644
--- a/code/src/java/plugin/lsttokens/auto/EquipToken.java
+++ b/code/src/java/plugin/lsttokens/auto/EquipToken.java
@@ -24,7 +24,7 @@
import java.util.StringTokenizer;
import pcgen.base.util.HashMapToList;
-import pcgen.base.util.WeightedCollection;
+import pcgen.util.WeightedCollection;
import pcgen.cdom.base.CDOMObject;
import pcgen.cdom.base.CDOMReference;
import pcgen.cdom.base.ChooseDriver;
diff --git a/code/src/java/plugin/lsttokens/kit/basekit/LookupToken.java b/code/src/java/plugin/lsttokens/kit/basekit/LookupToken.java
index 82c62bb8053..94aa36ef6c2 100644
--- a/code/src/java/plugin/lsttokens/kit/basekit/LookupToken.java
+++ b/code/src/java/plugin/lsttokens/kit/basekit/LookupToken.java
@@ -24,7 +24,7 @@
import pcgen.base.formula.Formula;
import pcgen.base.text.ParsingSeparator;
-import pcgen.base.util.NamedFormula;
+import pcgen.util.NamedFormula;
import pcgen.cdom.base.FormulaFactory;
import pcgen.core.kit.KitGear;
import pcgen.rules.context.LoadContext;
diff --git a/code/src/java/plugin/lsttokens/race/StartfeatsToken.java b/code/src/java/plugin/lsttokens/race/StartfeatsToken.java
index b1998652c37..894da8a21a7 100644
--- a/code/src/java/plugin/lsttokens/race/StartfeatsToken.java
+++ b/code/src/java/plugin/lsttokens/race/StartfeatsToken.java
@@ -19,7 +19,7 @@
import java.util.Collection;
-import pcgen.base.util.WeightedCollection;
+import pcgen.util.WeightedCollection;
import pcgen.cdom.enumeration.ListKey;
import pcgen.core.Race;
import pcgen.core.bonus.Bonus;
diff --git a/code/src/utest/pcgen/core/RollingMethodsTest.java b/code/src/utest/pcgen/core/RollingMethodsTest.java
index 8e02ba20b02..c0162a3005d 100644
--- a/code/src/utest/pcgen/core/RollingMethodsTest.java
+++ b/code/src/utest/pcgen/core/RollingMethodsTest.java
@@ -6,7 +6,7 @@
import java.util.Random;
import java.util.stream.IntStream;
-import pcgen.base.util.RandomUtil;
+import pcgen.util.RandomUtil;
import org.junit.jupiter.api.Test;
diff --git a/code/src/utest/pcgen/persistence/lst/URIFactoryTest.java b/code/src/utest/pcgen/persistence/lst/URIFactoryTest.java
index a1f4a66d122..4f24fddf073 100644
--- a/code/src/utest/pcgen/persistence/lst/URIFactoryTest.java
+++ b/code/src/utest/pcgen/persistence/lst/URIFactoryTest.java
@@ -20,7 +20,7 @@ void testGetURI_WithValidRootAndOffset() throws URISyntaxException
String offset = "data/file.txt";
URIFactory uriFactory = new URIFactory(rootURI, offset);
- URI expected = new File(System.getProperty("user.dir"), "data/file.txt").toURI();
+ URI expected = new URI("file:" + System.getProperty("user.dir") + "/data/file.txt");
URI result = uriFactory.getURI();
assertEquals(expected, result);
diff --git a/code/src/utest/pcgen/base/util/NamedFormulaTest.java b/code/src/utest/pcgen/util/NamedFormulaTest.java
similarity index 98%
rename from code/src/utest/pcgen/base/util/NamedFormulaTest.java
rename to code/src/utest/pcgen/util/NamedFormulaTest.java
index bf7c46299ae..5e9dd69fa9e 100644
--- a/code/src/utest/pcgen/base/util/NamedFormulaTest.java
+++ b/code/src/utest/pcgen/util/NamedFormulaTest.java
@@ -15,7 +15,7 @@
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-package pcgen.base.util;
+package pcgen.util;
import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/code/src/utest/pcgen/base/util/WeightedCollectionTest.java b/code/src/utest/pcgen/util/WeightedCollectionTest.java
similarity index 99%
rename from code/src/utest/pcgen/base/util/WeightedCollectionTest.java
rename to code/src/utest/pcgen/util/WeightedCollectionTest.java
index 4d385526f0e..3b1d85c3ffc 100644
--- a/code/src/utest/pcgen/base/util/WeightedCollectionTest.java
+++ b/code/src/utest/pcgen/util/WeightedCollectionTest.java
@@ -15,7 +15,7 @@
* along with this library; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
*/
-package pcgen.base.util;
+package pcgen.util;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
@@ -23,6 +23,7 @@
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
+
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.AbstractCollection;
diff --git a/gradle.properties b/gradle.properties
index 448e819108e..31b1c1dc2c3 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,6 @@
-#version=6.09.06-SNAPSHOT
version=6.09.08.RC1
-localOnly = false
org.gradle.jvmargs=-Xmx4096m
-org.gradle.configuration-cache=false
+org.gradle.configuration-cache=true
org.gradle.configuration-cache.parallel=true
org.gradle.configuration-cache.problems=warn
diff --git a/gradlew.bat b/gradlew.bat
index aa5f10b069f..24c62d56f2d 100644
--- a/gradlew.bat
+++ b/gradlew.bat
@@ -1,82 +1,82 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-@rem SPDX-License-Identifier: Apache-2.0
-@rem
-
-@if "%DEBUG%"=="" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables, and ensure extensions are enabled
-setlocal EnableExtensions
-
-set DIRNAME=%~dp0
-if "%DIRNAME%"=="" set DIRNAME=.
-@rem This is normally unused
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if %ERRORLEVEL% equ 0 goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo. 1>&2
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
-echo. 1>&2
-echo Please set the JAVA_HOME variable in your environment to match the 1>&2
-echo location of your Java installation. 1>&2
-
-"%COMSPEC%" /c exit 1
-
-:execute
-@rem Setup the command line
-
-
-
-@rem Execute Gradle
-@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
-@rem which allows us to clear the local environment before executing the java command
-endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
-
-:exitWithErrorLevel
-@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
-"%COMSPEC%" /c exit %ERRORLEVEL%
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+@rem SPDX-License-Identifier: Apache-2.0
+@rem
+
+@if "%DEBUG%"=="" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables, and ensure extensions are enabled
+setlocal EnableExtensions
+
+set DIRNAME=%~dp0
+if "%DIRNAME%"=="" set DIRNAME=.
+@rem This is normally unused
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if %ERRORLEVEL% equ 0 goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo. 1>&2
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
+echo. 1>&2
+echo Please set the JAVA_HOME variable in your environment to match the 1>&2
+echo location of your Java installation. 1>&2
+
+"%COMSPEC%" /c exit 1
+
+:execute
+@rem Setup the command line
+
+
+
+@rem Execute Gradle
+@rem endlocal doesn't take effect until after the line is parsed and variables are expanded
+@rem which allows us to clear the local environment before executing the java command
+endlocal & "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* & call :exitWithErrorLevel
+
+:exitWithErrorLevel
+@rem Use "%COMSPEC%" /c exit to allow operators to work properly in scripts
+"%COMSPEC%" /c exit %ERRORLEVEL%
diff --git a/installers/mac-installer/MacDirLauncher b/installers/mac-installer/MacDirLauncher
index dc626978de2..4faa19dd6f4 100644
--- a/installers/mac-installer/MacDirLauncher
+++ b/installers/mac-installer/MacDirLauncher
@@ -1,5 +1,6 @@
#!/bin/bash
-cd "${0%/*}"
+DIR="${0%/*}"
+cd "$DIR/../app"
-./PcGen
\ No newline at end of file
+"$DIR/PcGen"
\ No newline at end of file
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_attack.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_attack.xslt
index 42fb2a9f665..90223b6fffc 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_attack.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_attack.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_bio_condensed.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_bio_condensed.xslt
index 206cf3cd37a..1c279433927 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_bio_condensed.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_bio_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_blank.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_blank.xslt
index 0be7cd10adc..68322aca1fc 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_blank.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_blank.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_class_features.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_class_features.xslt
index 1b9cb46c18a..7a8dc0edcf2 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_class_features.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_class_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_equipment.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_equipment.xslt
index 55123c5afeb..90e2deffe02 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_equipment.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_equipment.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_features.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_features.xslt
index fa657eb6b65..d2a1c1ab507 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_features.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_hp_defense.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_hp_defense.xslt
index 1473cd872d7..d123b583c6a 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_hp_defense.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_hp_defense.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_misc.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_misc.xslt
index 418d631d10c..fe01b587200 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_misc.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_misc.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_pc_header_row.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_pc_header_row.xslt
index 13dc54f9423..fde635a8b44 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_pc_header_row.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_pc_header_row.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_protection.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_protection.xslt
index c1bf09f4dcd..6f957a1a14f 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_protection.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_protection.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_psionics.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_psionics.xslt
index 5c4346191a5..0ba239484dd 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_psionics.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_psionics.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
xmlns:Psionics="my:Psionics"
xmlns:myAttribs="my:Attribs"
exclude-result-prefixes="myAttribs Psionics"
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_skills.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_skills.xslt
index fd0ba1642f8..b34893033c3 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_skills.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_skills.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_spells_condensed.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_spells_condensed.xslt
index d32a6695414..5f2d134c125 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_spells_condensed.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_spells_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_spells_list.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_spells_list.xslt
index 1ebe9952bbd..04c87db0574 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_spells_list.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_spells_list.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_stat_block.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_stat_block.xslt
index dddd3d1c2dd..5afba047ce6 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_stat_block.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_stat_block.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/common_sheet/block_weapons.xslt b/outputsheets/d20/4e/pdf/common_sheet/block_weapons.xslt
index 49ade4f8199..8b95d6391c9 100644
--- a/outputsheets/d20/4e/pdf/common_sheet/block_weapons.xslt
+++ b/outputsheets/d20/4e/pdf/common_sheet/block_weapons.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/4e/pdf/fantasy_common.xsl b/outputsheets/d20/4e/pdf/fantasy_common.xsl
index 95956ffff44..8297a4be73f 100644
--- a/outputsheets/d20/4e/pdf/fantasy_common.xsl
+++ b/outputsheets/d20/4e/pdf/fantasy_common.xsl
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
@@ -760,7 +760,7 @@
-
+
diff --git a/outputsheets/d20/4e/pdf/fantasy_master_common_blocks.xslt b/outputsheets/d20/4e/pdf/fantasy_master_common_blocks.xslt
index e584adea6fa..9a7ef032b69 100644
--- a/outputsheets/d20/4e/pdf/fantasy_master_common_blocks.xslt
+++ b/outputsheets/d20/4e/pdf/fantasy_master_common_blocks.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/4e/pdf/inc_pagedimensions.xslt b/outputsheets/d20/4e/pdf/inc_pagedimensions.xslt
index dd449082752..f4aad31f1cc 100644
--- a/outputsheets/d20/4e/pdf/inc_pagedimensions.xslt
+++ b/outputsheets/d20/4e/pdf/inc_pagedimensions.xslt
@@ -7,10 +7,10 @@
-
+
-
+
@@ -30,10 +30,10 @@
-
+
-
+
@@ -53,10 +53,10 @@
-
+
-
+
@@ -69,10 +69,10 @@
-
+
-
+
@@ -85,10 +85,10 @@
-
+
-
+
@@ -101,10 +101,10 @@
-
+
-
+
diff --git a/outputsheets/d20/4e/pdf/leadership.xsl b/outputsheets/d20/4e/pdf/leadership.xsl
index 3bc5fb2d50e..cb8df221729 100644
--- a/outputsheets/d20/4e/pdf/leadership.xsl
+++ b/outputsheets/d20/4e/pdf/leadership.xsl
@@ -3,7 +3,7 @@
version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
xmlns:math="http://exslt.org/math"
xmlns:myAttribs="my:Attribs"
xmlns:Leadership="my:Leadership"
@@ -26,7 +26,7 @@
-
+
Each attribute is a tag where the name of the tag is the name of the attribute.
All of the attributes of the tag will become attributes of the calling element,
@@ -54,7 +54,7 @@
-
+
@@ -76,7 +76,7 @@
@@ -89,7 +89,7 @@
-
+
@@ -265,7 +265,7 @@
-
+
@@ -286,7 +286,7 @@
-
+
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_attack.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_attack.xslt
index d408a715191..0d26a6fb803 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_attack.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_attack.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_bio_condensed.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_bio_condensed.xslt
index 2bbafe3ff9f..e01cc18b841 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_bio_condensed.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_bio_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_blank.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_blank.xslt
index 0be7cd10adc..68322aca1fc 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_blank.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_blank.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_class_features.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_class_features.xslt
index 59da4db39d9..f947da7e02b 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_class_features.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_class_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_equipment.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_equipment.xslt
index cb257983bc6..90566852230 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_equipment.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_equipment.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_features.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_features.xslt
index 03573ccd297..0cfaed1c8af 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_features.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_hp_defense.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_hp_defense.xslt
index a4ed67f4d32..6cdc93ba00d 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_hp_defense.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_hp_defense.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_misc.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_misc.xslt
index 8bdbaa16b54..42127528b5d 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_misc.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_misc.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_pc_header_row.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_pc_header_row.xslt
index b08bbb11831..f806c36ed72 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_pc_header_row.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_pc_header_row.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_protection.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_protection.xslt
index 0a442a4fd83..49e4ba73ac9 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_protection.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_protection.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_psionics.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_psionics.xslt
index 80d9f287764..75a5f090d6f 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_psionics.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_psionics.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
xmlns:Psionics="my:Psionics"
xmlns:myAttribs="my:Attribs"
exclude-result-prefixes="myAttribs Psionics"
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_skills.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_skills.xslt
index 90e11d2326d..517318ca507 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_skills.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_skills.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_spells_condensed.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_spells_condensed.xslt
index adeeaf4b65a..6ec9bae39fc 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_spells_condensed.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_spells_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_spells_list.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_spells_list.xslt
index bf7d901f315..abf1277ed3e 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_spells_list.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_spells_list.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_stat_block.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_stat_block.xslt
index bd126bc19bd..698b6d37f7c 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_stat_block.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_stat_block.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/common_sheet/block_weapons.xslt b/outputsheets/d20/5e/pdf/common_sheet/block_weapons.xslt
index 5bce9c6cf56..cb3d720974b 100644
--- a/outputsheets/d20/5e/pdf/common_sheet/block_weapons.xslt
+++ b/outputsheets/d20/5e/pdf/common_sheet/block_weapons.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/5e/pdf/fantasy_common.xsl b/outputsheets/d20/5e/pdf/fantasy_common.xsl
index 499f9ac8b44..7ba249c636b 100644
--- a/outputsheets/d20/5e/pdf/fantasy_common.xsl
+++ b/outputsheets/d20/5e/pdf/fantasy_common.xsl
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
@@ -814,7 +814,7 @@
-
+
diff --git a/outputsheets/d20/5e/pdf/fantasy_master_alt_largetext.xslt b/outputsheets/d20/5e/pdf/fantasy_master_alt_largetext.xslt
index e1b70e4f814..99a854ff11d 100644
--- a/outputsheets/d20/5e/pdf/fantasy_master_alt_largetext.xslt
+++ b/outputsheets/d20/5e/pdf/fantasy_master_alt_largetext.xslt
@@ -1,7 +1,7 @@
-
+
-
+
-
+
@@ -43,10 +43,10 @@
-
+
-
+
@@ -66,10 +66,10 @@
-
+
-
+
@@ -82,10 +82,10 @@
-
+
-
+
@@ -98,10 +98,10 @@
-
+
-
+
@@ -114,10 +114,10 @@
-
+
-
+
diff --git a/outputsheets/d20/5e/pdf/fantasy_master_common_blocks.xslt b/outputsheets/d20/5e/pdf/fantasy_master_common_blocks.xslt
index 03639d89e37..fcafc886dac 100644
--- a/outputsheets/d20/5e/pdf/fantasy_master_common_blocks.xslt
+++ b/outputsheets/d20/5e/pdf/fantasy_master_common_blocks.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/5e/pdf/fantasy_master_common_companion_box.xslt b/outputsheets/d20/5e/pdf/fantasy_master_common_companion_box.xslt
index 130bb3e1fa1..76ac7b7aae8 100644
--- a/outputsheets/d20/5e/pdf/fantasy_master_common_companion_box.xslt
+++ b/outputsheets/d20/5e/pdf/fantasy_master_common_companion_box.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/5e/pdf/fantasy_master_no_header.xslt b/outputsheets/d20/5e/pdf/fantasy_master_no_header.xslt
index 4ae469c8691..44b13caf97b 100644
--- a/outputsheets/d20/5e/pdf/fantasy_master_no_header.xslt
+++ b/outputsheets/d20/5e/pdf/fantasy_master_no_header.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/5e/pdf/fantasy_master_no_spells.xslt b/outputsheets/d20/5e/pdf/fantasy_master_no_spells.xslt
index e67092a0bc4..b3082f3c11a 100644
--- a/outputsheets/d20/5e/pdf/fantasy_master_no_spells.xslt
+++ b/outputsheets/d20/5e/pdf/fantasy_master_no_spells.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -63,10 +63,10 @@
-
+
-
+
@@ -86,10 +86,10 @@
-
+
-
+
@@ -102,10 +102,10 @@
-
+
-
+
@@ -118,10 +118,10 @@
-
+
-
+
@@ -134,10 +134,10 @@
-
+
-
+
diff --git a/outputsheets/d20/5e/pdf/fantasy_master_spell_list_only.xslt b/outputsheets/d20/5e/pdf/fantasy_master_spell_list_only.xslt
index f484908d790..7181aab1b88 100644
--- a/outputsheets/d20/5e/pdf/fantasy_master_spell_list_only.xslt
+++ b/outputsheets/d20/5e/pdf/fantasy_master_spell_list_only.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -51,10 +51,10 @@
-
+
-
+
@@ -74,10 +74,10 @@
-
+
-
+
@@ -90,10 +90,10 @@
-
+
-
+
@@ -106,10 +106,10 @@
-
+
-
+
@@ -122,10 +122,10 @@
-
+
-
+
diff --git a/outputsheets/d20/5e/pdf/inc_pagedimensions.xslt b/outputsheets/d20/5e/pdf/inc_pagedimensions.xslt
index dd449082752..f4aad31f1cc 100644
--- a/outputsheets/d20/5e/pdf/inc_pagedimensions.xslt
+++ b/outputsheets/d20/5e/pdf/inc_pagedimensions.xslt
@@ -7,10 +7,10 @@
-
+
-
+
@@ -30,10 +30,10 @@
-
+
-
+
@@ -53,10 +53,10 @@
-
+
-
+
@@ -69,10 +69,10 @@
-
+
-
+
@@ -85,10 +85,10 @@
-
+
-
+
@@ -101,10 +101,10 @@
-
+
-
+
diff --git a/outputsheets/d20/_common_blocks/block_attack.xslt b/outputsheets/d20/_common_blocks/block_attack.xslt
index d3c2fe7a391..f167b9efcfd 100644
--- a/outputsheets/d20/_common_blocks/block_attack.xslt
+++ b/outputsheets/d20/_common_blocks/block_attack.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_bio_condensed.xslt b/outputsheets/d20/_common_blocks/block_bio_condensed.xslt
index 00320f14d98..6315ccfcd40 100644
--- a/outputsheets/d20/_common_blocks/block_bio_condensed.xslt
+++ b/outputsheets/d20/_common_blocks/block_bio_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_blank.xslt b/outputsheets/d20/_common_blocks/block_blank.xslt
index 0be7cd10adc..68322aca1fc 100644
--- a/outputsheets/d20/_common_blocks/block_blank.xslt
+++ b/outputsheets/d20/_common_blocks/block_blank.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_class_features.xslt b/outputsheets/d20/_common_blocks/block_class_features.xslt
index 555f6469587..4667197fe22 100644
--- a/outputsheets/d20/_common_blocks/block_class_features.xslt
+++ b/outputsheets/d20/_common_blocks/block_class_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_equipment.xslt b/outputsheets/d20/_common_blocks/block_equipment.xslt
index 57d338c0d0d..0249e0ba201 100644
--- a/outputsheets/d20/_common_blocks/block_equipment.xslt
+++ b/outputsheets/d20/_common_blocks/block_equipment.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_features.xslt b/outputsheets/d20/_common_blocks/block_features.xslt
index 627412c2984..e0123b8554c 100644
--- a/outputsheets/d20/_common_blocks/block_features.xslt
+++ b/outputsheets/d20/_common_blocks/block_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_footer.xslt b/outputsheets/d20/_common_blocks/block_footer.xslt
index ff79a5c9087..ea8a9f20edb 100644
--- a/outputsheets/d20/_common_blocks/block_footer.xslt
+++ b/outputsheets/d20/_common_blocks/block_footer.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_hp_defense.xslt b/outputsheets/d20/_common_blocks/block_hp_defense.xslt
index b242ed0b408..743bff5671b 100644
--- a/outputsheets/d20/_common_blocks/block_hp_defense.xslt
+++ b/outputsheets/d20/_common_blocks/block_hp_defense.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_misc.xslt b/outputsheets/d20/_common_blocks/block_misc.xslt
index 561f8237b92..50a22220cbb 100644
--- a/outputsheets/d20/_common_blocks/block_misc.xslt
+++ b/outputsheets/d20/_common_blocks/block_misc.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_pc_header_row.xslt b/outputsheets/d20/_common_blocks/block_pc_header_row.xslt
index 3f38d7267a7..22a07970ece 100644
--- a/outputsheets/d20/_common_blocks/block_pc_header_row.xslt
+++ b/outputsheets/d20/_common_blocks/block_pc_header_row.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_protection.xslt b/outputsheets/d20/_common_blocks/block_protection.xslt
index 3952bc5ae63..8b92b51468f 100644
--- a/outputsheets/d20/_common_blocks/block_protection.xslt
+++ b/outputsheets/d20/_common_blocks/block_protection.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_psionics.xslt b/outputsheets/d20/_common_blocks/block_psionics.xslt
index 1cb26c66a0a..5273a462d2e 100644
--- a/outputsheets/d20/_common_blocks/block_psionics.xslt
+++ b/outputsheets/d20/_common_blocks/block_psionics.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
xmlns:Psionics="my:Psionics"
xmlns:myAttribs="my:Attribs"
exclude-result-prefixes="myAttribs Psionics"
diff --git a/outputsheets/d20/_common_blocks/block_skills.xslt b/outputsheets/d20/_common_blocks/block_skills.xslt
index 3f5b21faf87..4883cf674ab 100644
--- a/outputsheets/d20/_common_blocks/block_skills.xslt
+++ b/outputsheets/d20/_common_blocks/block_skills.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_spells_condensed.xslt b/outputsheets/d20/_common_blocks/block_spells_condensed.xslt
index 6865ff5b593..12e66a0e024 100644
--- a/outputsheets/d20/_common_blocks/block_spells_condensed.xslt
+++ b/outputsheets/d20/_common_blocks/block_spells_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_spells_list.xslt b/outputsheets/d20/_common_blocks/block_spells_list.xslt
index 3896701455c..e8758a91a27 100644
--- a/outputsheets/d20/_common_blocks/block_spells_list.xslt
+++ b/outputsheets/d20/_common_blocks/block_spells_list.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_stat_block.xslt b/outputsheets/d20/_common_blocks/block_stat_block.xslt
index 21487064106..22c706a28ce 100644
--- a/outputsheets/d20/_common_blocks/block_stat_block.xslt
+++ b/outputsheets/d20/_common_blocks/block_stat_block.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/_common_blocks/block_weapons.xslt b/outputsheets/d20/_common_blocks/block_weapons.xslt
index 7150dc0f439..52f355c30da 100644
--- a/outputsheets/d20/_common_blocks/block_weapons.xslt
+++ b/outputsheets/d20/_common_blocks/block_weapons.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_attack.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_attack.xslt
index a78ab2ade4d..b8c9201d5a5 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_attack.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_attack.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_bio_condensed.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_bio_condensed.xslt
index 00320f14d98..6315ccfcd40 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_bio_condensed.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_bio_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_blank.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_blank.xslt
index 0be7cd10adc..68322aca1fc 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_blank.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_blank.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_class_features.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_class_features.xslt
index 555f6469587..4667197fe22 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_class_features.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_class_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_equipment.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_equipment.xslt
index 57d338c0d0d..0249e0ba201 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_equipment.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_equipment.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_features.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_features.xslt
index 2b84af81eb3..0306a4e0e81 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_features.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_hp_defense.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_hp_defense.xslt
index b242ed0b408..743bff5671b 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_hp_defense.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_hp_defense.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_misc.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_misc.xslt
index 561f8237b92..50a22220cbb 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_misc.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_misc.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_pc_header_row.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_pc_header_row.xslt
index b5ce0657292..37dc02720fe 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_pc_header_row.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_pc_header_row.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_protection.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_protection.xslt
index 3952bc5ae63..8b92b51468f 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_protection.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_protection.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_psionics.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_psionics.xslt
index 1cb26c66a0a..5273a462d2e 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_psionics.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_psionics.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
xmlns:Psionics="my:Psionics"
xmlns:myAttribs="my:Attribs"
exclude-result-prefixes="myAttribs Psionics"
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_skills.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_skills.xslt
index 3f5b21faf87..4883cf674ab 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_skills.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_skills.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_condensed.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_condensed.xslt
index 5e94cb5958c..295c717b687 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_condensed.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_list.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_list.xslt
index 3896701455c..e8758a91a27 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_list.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_list.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_memorized.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_memorized.xslt
index 19100d66cb5..6b70cb410db 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_memorized.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_spells_memorized.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_stat_block.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_stat_block.xslt
index 21487064106..22c706a28ce 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_stat_block.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_stat_block.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/common_sheet/block_weapons.xslt b/outputsheets/d20/fantasy/pdf/common_sheet/block_weapons.xslt
index 7150dc0f439..52f355c30da 100644
--- a/outputsheets/d20/fantasy/pdf/common_sheet/block_weapons.xslt
+++ b/outputsheets/d20/fantasy/pdf/common_sheet/block_weapons.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy/pdf/fantasy_common.xsl b/outputsheets/d20/fantasy/pdf/fantasy_common.xsl
index e48d2ce6545..7c19dd98ec2 100644
--- a/outputsheets/d20/fantasy/pdf/fantasy_common.xsl
+++ b/outputsheets/d20/fantasy/pdf/fantasy_common.xsl
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
@@ -762,7 +762,7 @@
-
+
diff --git a/outputsheets/d20/fantasy/pdf/fantasy_master_alt_largetext.xslt b/outputsheets/d20/fantasy/pdf/fantasy_master_alt_largetext.xslt
index 61367d9ee53..a4d60fe6018 100644
--- a/outputsheets/d20/fantasy/pdf/fantasy_master_alt_largetext.xslt
+++ b/outputsheets/d20/fantasy/pdf/fantasy_master_alt_largetext.xslt
@@ -1,7 +1,7 @@
-
+
-
+
-
+
@@ -43,10 +43,10 @@
-
+
-
+
@@ -66,10 +66,10 @@
-
+
-
+
@@ -82,10 +82,10 @@
-
+
-
+
@@ -98,10 +98,10 @@
-
+
-
+
@@ -114,10 +114,10 @@
-
+
-
+
diff --git a/outputsheets/d20/fantasy/pdf/fantasy_master_common_blocks.xslt b/outputsheets/d20/fantasy/pdf/fantasy_master_common_blocks.xslt
index 4c802bb2d0b..a5be9b08473 100644
--- a/outputsheets/d20/fantasy/pdf/fantasy_master_common_blocks.xslt
+++ b/outputsheets/d20/fantasy/pdf/fantasy_master_common_blocks.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -73,10 +73,10 @@
-
+
-
+
@@ -96,10 +96,10 @@
-
+
-
+
@@ -112,10 +112,10 @@
-
+
-
+
@@ -128,10 +128,10 @@
-
+
-
+
@@ -144,10 +144,10 @@
-
+
-
+
diff --git a/outputsheets/d20/fantasy/pdf/fantasy_master_common_companion_box.xslt b/outputsheets/d20/fantasy/pdf/fantasy_master_common_companion_box.xslt
index 40e25707d10..16ee92a7078 100644
--- a/outputsheets/d20/fantasy/pdf/fantasy_master_common_companion_box.xslt
+++ b/outputsheets/d20/fantasy/pdf/fantasy_master_common_companion_box.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/fantasy/pdf/fantasy_master_no_header.xslt b/outputsheets/d20/fantasy/pdf/fantasy_master_no_header.xslt
index 90e560d88d6..0394c3a1a29 100644
--- a/outputsheets/d20/fantasy/pdf/fantasy_master_no_header.xslt
+++ b/outputsheets/d20/fantasy/pdf/fantasy_master_no_header.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/fantasy/pdf/fantasy_master_spell_list_only.xslt b/outputsheets/d20/fantasy/pdf/fantasy_master_spell_list_only.xslt
index 28446dbb625..8ff29bce62f 100644
--- a/outputsheets/d20/fantasy/pdf/fantasy_master_spell_list_only.xslt
+++ b/outputsheets/d20/fantasy/pdf/fantasy_master_spell_list_only.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@
-
+
-
+
@@ -135,10 +135,10 @@
-
+
-
+
diff --git a/outputsheets/d20/fantasy/pdf/inc_pagedimensions.xslt b/outputsheets/d20/fantasy/pdf/inc_pagedimensions.xslt
index dd449082752..f4aad31f1cc 100644
--- a/outputsheets/d20/fantasy/pdf/inc_pagedimensions.xslt
+++ b/outputsheets/d20/fantasy/pdf/inc_pagedimensions.xslt
@@ -7,10 +7,10 @@
-
+
-
+
@@ -30,10 +30,10 @@
-
+
-
+
@@ -53,10 +53,10 @@
-
+
-
+
@@ -69,10 +69,10 @@
-
+
-
+
@@ -85,10 +85,10 @@
-
+
-
+
@@ -101,10 +101,10 @@
-
+
-
+
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_attack.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_attack.xslt
index d3c2fe7a391..f167b9efcfd 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_attack.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_attack.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_bio_condensed.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_bio_condensed.xslt
index 00320f14d98..6315ccfcd40 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_bio_condensed.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_bio_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_blank.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_blank.xslt
index 0be7cd10adc..68322aca1fc 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_blank.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_blank.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_class_features.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_class_features.xslt
index 555f6469587..4667197fe22 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_class_features.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_class_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_equipment.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_equipment.xslt
index 57d338c0d0d..0249e0ba201 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_equipment.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_equipment.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_features.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_features.xslt
index 5fd19801e64..9a79647c6de 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_features.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_features.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_hp_defense.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_hp_defense.xslt
index b242ed0b408..743bff5671b 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_hp_defense.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_hp_defense.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_misc.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_misc.xslt
index 561f8237b92..50a22220cbb 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_misc.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_misc.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_pc_header_row.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_pc_header_row.xslt
index 3f38d7267a7..22a07970ece 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_pc_header_row.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_pc_header_row.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_protection.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_protection.xslt
index 3952bc5ae63..8b92b51468f 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_protection.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_protection.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_psionics.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_psionics.xslt
index 1cb26c66a0a..5273a462d2e 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_psionics.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_psionics.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
xmlns:Psionics="my:Psionics"
xmlns:myAttribs="my:Attribs"
exclude-result-prefixes="myAttribs Psionics"
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_skills.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_skills.xslt
index 3f5b21faf87..4883cf674ab 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_skills.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_skills.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_condensed.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_condensed.xslt
index 6865ff5b593..12e66a0e024 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_condensed.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_condensed.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_list.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_list.xslt
index 3896701455c..e8758a91a27 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_list.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_spells_list.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_stat_block.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_stat_block.xslt
index 21487064106..22c706a28ce 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_stat_block.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_stat_block.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_weapons.xslt b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_weapons.xslt
index 7150dc0f439..52f355c30da 100644
--- a/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_weapons.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/common_sheet/block_weapons.xslt
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
diff --git a/outputsheets/d20/fantasy_craft/pdf/fantasy_common.xsl b/outputsheets/d20/fantasy_craft/pdf/fantasy_common.xsl
index e48d2ce6545..7c19dd98ec2 100644
--- a/outputsheets/d20/fantasy_craft/pdf/fantasy_common.xsl
+++ b/outputsheets/d20/fantasy_craft/pdf/fantasy_common.xsl
@@ -4,7 +4,7 @@
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:fo="http://www.w3.org/1999/XSL/Format"
xmlns:str="http://xsltsl.sourceforge.net/string.html"
- xmlns:xalan="http://xml.apache.org/xalan"
+ xmlns:exsl="http://exslt.org/common"
>
@@ -762,7 +762,7 @@
-
+
diff --git a/outputsheets/d20/fantasy_craft/pdf/fantasy_master_common_blocks.xslt b/outputsheets/d20/fantasy_craft/pdf/fantasy_master_common_blocks.xslt
index 929e29de69e..cfd4ebb84d1 100644
--- a/outputsheets/d20/fantasy_craft/pdf/fantasy_master_common_blocks.xslt
+++ b/outputsheets/d20/fantasy_craft/pdf/fantasy_master_common_blocks.xslt
@@ -3,7 +3,7 @@
-
+
-
+
-
+
@@ -73,10 +73,10 @@
-
+
-
+
@@ -96,10 +96,10 @@
-
+
-
+
@@ -112,10 +112,10 @@
-
+
-
+
@@ -128,10 +128,10 @@
-
+
-
+
@@ -144,10 +144,10 @@
-
+
-
+
diff --git a/outputsheets/d20/modern/pdf/csheet_modern_std.xslt b/outputsheets/d20/modern/pdf/csheet_modern_std.xslt
index 038508c8a2c..e72bcb28958 100644
--- a/outputsheets/d20/modern/pdf/csheet_modern_std.xslt
+++ b/outputsheets/d20/modern/pdf/csheet_modern_std.xslt
@@ -9,7 +9,7 @@
-
+
-
+
-
+
@@ -64,10 +64,10 @@
-
+
-
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -103,10 +103,10 @@
-
+
-
+
@@ -119,10 +119,10 @@