diff --git a/.classpath b/.classpath
index c09662b..8c4724e 100644
--- a/.classpath
+++ b/.classpath
@@ -2,7 +2,7 @@
-
-
+
+
diff --git a/.gitattributes b/.gitattributes
deleted file mode 100644
index f91f646..0000000
--- a/.gitattributes
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# https://help.github.com/articles/dealing-with-line-endings/
-#
-# Linux start script should use lf
-/gradlew text eol=lf
-
-# These are Windows script files and should use crlf
-*.bat text eol=crlf
-
-# Binary files should be left untouched
-*.jar binary
-
diff --git a/.gitignore b/.gitignore
index 0d33b1c..84c048a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1 @@
/build/
-/dist/
-
-# Ignore Gradle project-specific cache directory
-.gradle
-
-# Ignore Gradle build output directory
-build
-
-# Ignore Kotlin plugin data
-.kotlin
diff --git a/AGENTS.md b/AGENTS.md
deleted file mode 100644
index 37cef69..0000000
--- a/AGENTS.md
+++ /dev/null
@@ -1,44 +0,0 @@
-# AGENTS.md
-
-## Repo: ex-thumbnailator
-
-XQuery module for BaseX 10+ wrapping thumbnailator Java library.
-
-## Quick start
-
-- **Build**: `tools/build.xq` → `dist/thumbnailator-8.0.1.xar`
-- **Test**: `src/test/test.xqm` (`%unit:test` functions)
-- **Sample**: `src/test/sample.xq`
-
-## API
-
-| Function | Returns |
-|----------|---------|
-| `thumbnails:size($src, $w, $h)` | `xs:base64Binary` |
-| `thumbnails:scale($src, $x, $y)` | `xs:base64Binary` |
-| `thumbnails:task($src, $task)` | `xs:base64Binary` |
-| `thumbnails:validate($src)` | `empty-sequence()` or error |
-| `thumbnails:validation-report($src)` | `element(report)` |
-
-Inputs from `fetch:binary()`, outputs via `file:write-binary()`.
-
-## XML schema
-
-- Root: `` (not ``)
-- Either `` or `` required
-- `constrain@exif="true"` default: swaps dimensions for portrait, ignores `flip`
-
-## Structure
-
-```
-src/main/ # XQuery, JARs, XSD, basex.xml, expath-pkg.xml
-src/java/ # Thumbs.java (BaseX QueryModule)
-src/test/ # test.xqm, sample.xq, test tasks
-tools/ # build.xq
-dist/ # built xar package
-```
-
-## Setup
-
-- BaseX 10+, Java 17
-- JARs: `thumbnailator-0.4.13.jar`, `thumbhelper-8.0.0.jar`
diff --git a/gradle.properties b/gradle.properties
deleted file mode 100644
index 377538c..0000000
--- a/gradle.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-# This file was generated by the Gradle 'init' task.
-# https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties
-
-org.gradle.configuration-cache=true
-
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
deleted file mode 100644
index 7260a8a..0000000
--- a/gradle/libs.versions.toml
+++ /dev/null
@@ -1,12 +0,0 @@
-# This file was generated by the Gradle 'init' task.
-# https://docs.gradle.org/current/userguide/version_catalogs.html#sec::toml-dependencies-format
-
-[versions]
-commons-math3 = "3.6.1"
-guava = "33.5.0-jre"
-junit = "4.13.2"
-
-[libraries]
-commons-math3 = { module = "org.apache.commons:commons-math3", version.ref = "commons-math3" }
-guava = { module = "com.google.guava:guava", version.ref = "guava" }
-junit = { module = "junit:junit", version.ref = "junit" }
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index d997cfc..0000000
Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index c61a118..0000000
--- a/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip
-networkTimeout=10000
-validateDistributionUrl=true
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
diff --git a/gradlew b/gradlew
deleted file mode 100755
index 739907d..0000000
--- a/gradlew
+++ /dev/null
@@ -1,248 +0,0 @@
-#!/bin/sh
-
-#
-# Copyright © 2015 the original authors.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# https://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-#
-# SPDX-License-Identifier: Apache-2.0
-#
-
-##############################################################################
-#
-# Gradle start up script for POSIX generated by Gradle.
-#
-# Important for running:
-#
-# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
-# noncompliant, but you have some other compliant shell such as ksh or
-# bash, then to run this script, type that shell name before the whole
-# command line, like:
-#
-# ksh Gradle
-#
-# Busybox and similar reduced shells will NOT work, because this script
-# requires all of these POSIX shell features:
-# * functions;
-# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
-# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
-# * compound commands having a testable exit status, especially «case»;
-# * various built-in commands including «command», «set», and «ulimit».
-#
-# Important for patching:
-#
-# (2) This script targets any POSIX shell, so it avoids extensions provided
-# by Bash, Ksh, etc; in particular arrays are avoided.
-#
-# The "traditional" practice of packing multiple parameters into a
-# space-separated string is a well documented source of bugs and security
-# problems, so this is (mostly) avoided, by progressively accumulating
-# options in "$@", and eventually passing that to Java.
-#
-# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
-# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
-# see the in-line comments for details.
-#
-# There are tweaks for specific operating systems such as AIX, CygWin,
-# Darwin, MinGW, and NonStop.
-#
-# (3) This script is generated from the Groovy template
-# https://github.com/gradle/gradle/blob/2d6327017519d23b96af35865dc997fcb544fb40/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
-# within the Gradle project.
-#
-# You can find Gradle at https://github.com/gradle/gradle/.
-#
-##############################################################################
-
-# Attempt to set APP_HOME
-
-# Resolve links: $0 may be a link
-app_path=$0
-
-# Need this for daisy-chained symlinks.
-while
- APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
- [ -h "$app_path" ]
-do
- ls=$( ls -ld "$app_path" )
- link=${ls#*' -> '}
- case $link in #(
- /*) app_path=$link ;; #(
- *) app_path=$APP_HOME$link ;;
- esac
-done
-
-# This is normally unused
-# shellcheck disable=SC2034
-APP_BASE_NAME=${0##*/}
-# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
-APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD=maximum
-
-warn () {
- echo "$*"
-} >&2
-
-die () {
- echo
- echo "$*"
- echo
- exit 1
-} >&2
-
-# OS specific support (must be 'true' or 'false').
-cygwin=false
-msys=false
-darwin=false
-nonstop=false
-case "$( uname )" in #(
- CYGWIN* ) cygwin=true ;; #(
- Darwin* ) darwin=true ;; #(
- MSYS* | MINGW* ) msys=true ;; #(
- NONSTOP* ) nonstop=true ;;
-esac
-
-
-
-# Determine the Java command to use to start the JVM.
-if [ -n "$JAVA_HOME" ] ; then
- if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
- # IBM's JDK on AIX uses strange locations for the executables
- JAVACMD=$JAVA_HOME/jre/sh/java
- else
- JAVACMD=$JAVA_HOME/bin/java
- fi
- if [ ! -x "$JAVACMD" ] ; then
- die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-else
- JAVACMD=java
- if ! command -v java >/dev/null 2>&1
- then
- die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-
-Please set the JAVA_HOME variable in your environment to match the
-location of your Java installation."
- fi
-fi
-
-# Increase the maximum file descriptors if we can.
-if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
- case $MAX_FD in #(
- max*)
- # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
- MAX_FD=$( ulimit -H -n ) ||
- warn "Could not query maximum file descriptor limit"
- esac
- case $MAX_FD in #(
- '' | soft) :;; #(
- *)
- # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
- # shellcheck disable=SC2039,SC3045
- ulimit -n "$MAX_FD" ||
- warn "Could not set maximum file descriptor limit to $MAX_FD"
- esac
-fi
-
-# Collect all arguments for the java command, stacking in reverse order:
-# * args from the command line
-# * the main class name
-# * -classpath
-# * -D...appname settings
-# * --module-path (only if needed)
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
-
-# For Cygwin or MSYS, switch paths to Windows format before running java
-if "$cygwin" || "$msys" ; then
- APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
-
- JAVACMD=$( cygpath --unix "$JAVACMD" )
-
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- for arg do
- if
- case $arg in #(
- -*) false ;; # don't mess with options #(
- /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
- [ -e "$t" ] ;; #(
- *) false ;;
- esac
- then
- arg=$( cygpath --path --ignore --mixed "$arg" )
- fi
- # Roll the args list around exactly as many times as the number of
- # args, so each arg winds up back in the position where it started, but
- # possibly modified.
- #
- # NB: a `for` loop captures its iteration list before it begins, so
- # changing the positional parameters here affects neither the number of
- # iterations, nor the values presented in `arg`.
- shift # remove old arg
- set -- "$@" "$arg" # push replacement arg
- done
-fi
-
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
-
-# Collect all arguments for the java command:
-# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
-# and any embedded shellness will be escaped.
-# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
-# treated as '${Hostname}' itself on the command line.
-
-set -- \
- "-Dorg.gradle.appname=$APP_BASE_NAME" \
- -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
- "$@"
-
-# Stop when "xargs" is not available.
-if ! command -v xargs >/dev/null 2>&1
-then
- die "xargs is not available"
-fi
-
-# Use "xargs" to parse quoted args.
-#
-# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
-#
-# In Bash we could simply go:
-#
-# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
-# set -- "${ARGS[@]}" "$@"
-#
-# but POSIX shell has neither arrays nor command substitution, so instead we
-# post-process each arg (as a line of input to sed) to backslash-escape any
-# character that might be a shell metacharacter, then use eval to reverse
-# that process (while maintaining the separation between arguments), and wrap
-# the whole thing up as a single "set" statement.
-#
-# This will of course break if any of these variables contains a newline or
-# an unmatched quote.
-#
-
-eval "set -- $(
- printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
- xargs -n1 |
- sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
- tr '\n' ' '
- )" '"$@"'
-
-exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
deleted file mode 100644
index c4bdd3a..0000000
--- a/gradlew.bat
+++ /dev/null
@@ -1,93 +0,0 @@
-@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 with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-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
-
-goto fail
-
-: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
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if %ERRORLEVEL% equ 0 goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-set EXIT_CODE=%ERRORLEVEL%
-if %EXIT_CODE% equ 0 set EXIT_CODE=1
-if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
-exit /b %EXIT_CODE%
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/lib/BaseX107.jar b/lib/BaseX107.jar
new file mode 100644
index 0000000..3aa13e8
Binary files /dev/null and b/lib/BaseX107.jar differ
diff --git a/lib/BaseX924.jar b/lib/BaseX924.jar
new file mode 100644
index 0000000..a105b27
Binary files /dev/null and b/lib/BaseX924.jar differ
diff --git a/lib/BaseX945.jar b/lib/BaseX945.jar
new file mode 100644
index 0000000..e61c572
Binary files /dev/null and b/lib/BaseX945.jar differ
diff --git a/xar/thumbnailator-0.4.20.jar b/lib/thumbnailator-0.4.20.jar
similarity index 100%
rename from xar/thumbnailator-0.4.20.jar
rename to lib/thumbnailator-0.4.20.jar
diff --git a/package.xml b/package.xml
index 9556a1e..ff77096 100644
--- a/package.xml
+++ b/package.xml
@@ -1,17 +1,71 @@
-
-
- https://github.com/expkg-zone58/ex-thumbnailator
- Create a thumbnail from a file path.
- coobird
- Andy Bunce
- https://github.com/coobird/thumbnailator
- Library
- image
- resize
- graphic
-
-
-
-
-
+
+
+
+ https://github.com/expkg-zone58/ex-thumbnailator
+ Create a thumbnail from a file path.
+ coobird
+ Andy Bunce
+ https://github.com/coobird/thumbnailator
+ Library
+ image
+ resize
+ graphic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/readme.md
similarity index 100%
rename from README.md
rename to readme.md
diff --git a/settings.gradle.kts b/settings.gradle.kts
deleted file mode 100644
index d453ad3..0000000
--- a/settings.gradle.kts
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * The settings file is used to specify which projects to include in your build.
- * For more detailed information on multi-project builds, please refer to https://docs.gradle.org/9.4.1/userguide/multi_project_builds.html in the Gradle documentation.
- */
-
-plugins {
- // Apply the foojay-resolver plugin to allow automatic download of JDKs
- id("org.gradle.toolchains.foojay-resolver-convention") version "1.0.0"
-}
-
-rootProject.name = "ex-thumbnailator"
-include("xar")
diff --git a/src/main/basex.xml b/src/main/basex.xml
index accee82..9b56556 100644
--- a/src/main/basex.xml
+++ b/src/main/basex.xml
@@ -1,5 +1,5 @@
thumbhelper-8.0.0.jar
- thumbnailator-0.4.13.jar
- org.expkgzone58.image.Thumbs
+ thumbnailator-0.4.13.jar
+ org.expkgzone58.image.Thumbs
diff --git a/tools/buildx.xqm b/tools/buildx.xqm
index 461cefd..12b283c 100644
--- a/tools/buildx.xqm
+++ b/tools/buildx.xqm
@@ -8,11 +8,10 @@
module namespace build = 'quodatum.utils.build';
declare default function namespace 'quodatum.utils.build';
declare namespace pkg="http://expath.org/ns/pkg";
-
(:~
: file paths below $src
: $src typically from resolve-uri
- : @return sequences of relative file paths "ff.txt" "..."
+ : @return sequences of relative file paths "content/ebnf/CR-xquery-31-20141218.ebnf" "..."
:)
declare function files($src as xs:string) as xs:string*
{
@@ -31,14 +30,10 @@ declare %updating function write-xqdoc($path,$src,$dest){
return switch($type)
case "application/xquery"
- return try{
- file:write(
+ return file:write(
fn:resolve-uri($path || ".xml",$dest),
inspect:xqdoc($url)
)
- }catch *{
- ()
- }
default
return ()
diff --git a/xar/build.gradle.kts b/xar/build.gradle.kts
deleted file mode 100644
index 75226dd..0000000
--- a/xar/build.gradle.kts
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * This file was generated by the Gradle 'init' task.
- *
- * This generated file contains a sample Java library project to get you started.
- * For more details on building Java & JVM projects, please refer to https://docs.gradle.org/9.4.1/userguide/building_java_projects.html in the Gradle documentation.
- */
-
-plugins {
- // Apply the java-library plugin for API and implementation separation.
- `java-library`
-}
-
-repositories {
- // Use Maven Central for resolving dependencies.
- mavenCentral()
-}
-
-dependencies {
- // Source: https://mvnrepository.com/artifact/net.coobird/thumbnailator
- implementation("net.coobird:thumbnailator:0.4.21")
- // Source: https://mvnrepository.com/artifact/org.basex/basex
- implementation("org.basex:basex:10.7")
- // Use JUnit test framework.
- testImplementation(libs.junit)
-
-
- // This dependency is used internally, and not exposed to consumers on their own compile classpath.
- implementation(libs.guava)
-}
-
-// Apply a specific Java toolchain to ease working on different environments.
-java {
- toolchain {
- languageVersion = JavaLanguageVersion.of(11)
- }
-}
diff --git a/xar/src/main/java/org/expkgzone58/image/Thumbs.java b/xar/src/main/java/org/expkgzone58/image/Thumbs.java
deleted file mode 100644
index 78d9959..0000000
--- a/xar/src/main/java/org/expkgzone58/image/Thumbs.java
+++ /dev/null
@@ -1,266 +0,0 @@
-package org.expkgzone58.image;
-
-import static org.basex.query.QueryError.IOERR_X;
-
-import java.awt.Dimension;
-import java.awt.Font;
-import java.awt.image.BufferedImage;
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-import javax.imageio.ImageIO;
-
-import org.basex.data.Data;
-import org.basex.io.IOContent;
-import org.basex.query.QueryException;
-import org.basex.query.QueryModule;
-//import org.basex.query.func.fn.FnTrace;
-import org.basex.query.value.item.B64Lazy;
-import org.basex.query.value.node.ANode;
-import org.basex.util.Token;
-
-import net.coobird.thumbnailator.ThumbnailParameter;
-import net.coobird.thumbnailator.Thumbnailator;
-import net.coobird.thumbnailator.builders.ThumbnailParameterBuilder;
-import net.coobird.thumbnailator.filters.Canvas;
-import net.coobird.thumbnailator.filters.Caption;
-import net.coobird.thumbnailator.filters.Colorize;
-import net.coobird.thumbnailator.filters.Flip;
-import net.coobird.thumbnailator.filters.ImageFilter;
-import net.coobird.thumbnailator.filters.Pipeline;
-import net.coobird.thumbnailator.filters.Rotation;
-import net.coobird.thumbnailator.filters.Watermark;
-import net.coobird.thumbnailator.geometry.AbsoluteSize;
-import net.coobird.thumbnailator.geometry.Position;
-import net.coobird.thumbnailator.geometry.Positions;
-import net.coobird.thumbnailator.geometry.Region;
-import net.coobird.thumbnailator.tasks.StreamThumbnailTask;
-
-/*
- * BaseX Thumbnailator interface
- * @author andy bunce
- * @copyright Quodatum Ltd
- * @date 2017
- * @licence Apache 2
- */
-public class Thumbs extends QueryModule{
-
- public B64Lazy size(final B64Lazy inputStream, final int width, final int height)
- throws IOException, QueryException {
- ByteArrayInputStream is = new ByteArrayInputStream(inputStream.binary(null));
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ThumbnailParameterBuilder builder = new ThumbnailParameterBuilder();
- builder.size(width, height);
- StreamThumbnailTask task = new StreamThumbnailTask(builder.build(), is, os);
- Thumbnailator.createThumbnail(task);
- return new B64Lazy(new IOContent(os.toByteArray()), IOERR_X);
- }
-
- public B64Lazy scale(final B64Lazy inputStream,
- final double xscale, final double yscale)
- throws IOException, QueryException {
- ByteArrayInputStream is = new ByteArrayInputStream(inputStream.binary(null));
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ThumbnailParameterBuilder builder = new ThumbnailParameterBuilder();
- builder.scale(xscale, yscale);
- StreamThumbnailTask task = new StreamThumbnailTask(builder.build(), is, os);
- Thumbnailator.createThumbnail(task);
- return new B64Lazy(new IOContent(os.toByteArray()), IOERR_X);
- }
-
- public B64Lazy task(final B64Lazy inputStream, final ANode thumbnail)
- throws IOException, QueryException {
- ByteArrayInputStream is = new ByteArrayInputStream(inputStream.binary(null));
- ByteArrayOutputStream os = new ByteArrayOutputStream();
- ThumbnailParameter param = fromNode(thumbnail);
- StreamThumbnailTask task = new StreamThumbnailTask(param, is, os);
- Thumbnailator.createThumbnail(task);
- return new B64Lazy(new IOContent(os.toByteArray()), IOERR_X);
- }
-
- // build parameters from XML
- ThumbnailParameter fromNode(final ANode node) throws QueryException, IOException {
- ThumbnailParameterBuilder builder = new ThumbnailParameterBuilder();
- for(final ANode element : node.childIter()) {
-
- if (element.kind() == Data.ELEM) {
- String name = Token.string(element.name());
- // FnTrace.trace(name.getBytes(), "element: ".getBytes(), queryContext);
- switch (name) {
-
- case "size":
- size(builder, element);
- break;
-
- case "scale":
- scale(builder, element);
- break;
-
- case "region":
- region(builder, element);
- break;
-
- case "constrain":
- constrain(builder, element);
- break;
-
- case "filters":
- List filters = filters(element);
- builder.filters(filters);
- break;
-
- case "output":
- String format = Utils.attrib(element, "format",
- ThumbnailParameter.ORIGINAL_FORMAT);
- builder.format(format);
-
- break;
- default:
- break;
- }
- }
- }
- return builder.build();
- }
-
- void region(final ThumbnailParameterBuilder builder, final ANode node)
- throws QueryException {
-
- int width = Utils.attrib(node,"width", 80);
- int height = Utils.attrib(node,"height", 80);
- Dimension d = new Dimension(width, height);
- Position pos = Utils.position(node, "position", Positions.CENTER);
- Region r = new Region(pos, new AbsoluteSize(d));
- builder.region(r);
- }
-
- void constrain(final ThumbnailParameterBuilder builder, final ANode node)
- throws QueryException {
-
- boolean aspect = Utils.attrib(node, "aspect", true);
- builder.keepAspectRatio(aspect);
- // FnTrace.trace(Boolean.toString(aspect).getBytes(), "constrain: ".getBytes(), queryContext);
- boolean exif = Utils.attrib(node, "exif", true);
- builder.useExifOrientation(exif);
-
- boolean fit = Utils.attrib(node, "fit", true);
- builder.fitWithinDimensions(fit);
- }
-
- void size(final ThumbnailParameterBuilder builder, final ANode node)
- throws QueryException {
- int width = Utils.attrib(node, "width", 80);
- int height = Utils.attrib(node, "height", 80);
- builder.size(width, height);
- }
-
- void scale(final ThumbnailParameterBuilder builder, final ANode node)
- throws QueryException {
- double x = Utils.attrib(node, "x", 0.5f);
- double y = Utils.attrib(node, "y", 0.5f);
- builder.scale(x, y);
- }
-
- List filters(final ANode filters) throws QueryException, IOException {
- Pipeline pipeline = new Pipeline();
- for(final ANode node : filters.childIter()) {
- if (node.kind() == Data.ELEM) {
- switch (Token.string(node.name())) {
-
- case "canvas": // @width @height @color @position
- canvas(pipeline, node);
- break;
-
- case "caption": //@color @position text()
- caption(pipeline, node);
- break;
-
- case "colorize": //@color @alpha
- colorize(pipeline, node);
- break;
-
- case "flip": //@axis
- flip(pipeline, node);
- break;
-
- case "rotate": //@angle
- rotate(pipeline, node);
- break;
-
- case "watermark": //@src @alpha @position
- watermark(pipeline, node);
- break;
-
- default:
- break;
- }
- }
- }
- return pipeline.getFilters();
- }
-
- private void watermark(final Pipeline pipeline, final ANode node)
- throws IOException, QueryException {
- ImageFilter filter;
- Position pos;
- String src = Utils.attrib(node, "src", "");
- pos = Utils.position(node, "position", Positions.BOTTOM_RIGHT);
- BufferedImage watermarkImg = ImageIO.read(new File(src));
- filter = new Watermark(pos, watermarkImg, Utils.attrib(node, "alpha", 0.5f));
- pipeline.add(filter);
- }
-
- private void rotate(final Pipeline pipeline, final ANode node)
- throws QueryException {
- double angle = (double) Utils.attrib(node, "angle", 0);
- pipeline.add(Rotation.newRotator(angle));
- }
-
- private void flip(final Pipeline pipeline, final ANode node) throws QueryException {
- ImageFilter filter;
- String axis = Utils.attrib(node, "axis", "vertical");
- // FnTrace.trace(axis.getBytes(), "FLIP: ".getBytes(), queryContext);
- filter = axis.equalsIgnoreCase("vertical") ? Flip.VERTICAL : Flip.HORIZONTAL;
- pipeline.add(filter);
- }
-
- private void colorize(final Pipeline pipeline, final ANode node) throws QueryException {
- ImageFilter filter;
- String color;
- color = Utils.attrib(node, "color", "black");
- filter = new Colorize(Utils.stringToColor(color),
- Utils.attrib(node, "alpha", 0.0f));
- pipeline.add(filter);
- }
-
- private void canvas(final Pipeline pipeline, final ANode node) throws QueryException {
- ImageFilter filter;
- String color;
- Position pos;
- int width = Utils.attrib(node, "width", 80);
- int height = Utils.attrib(node, "height", 80);
- color = Utils.attrib(node, "color", "black");
- pos = Utils.position(node, "position", Positions.CENTER);
- filter = new Canvas(width, height, pos, false, Utils.stringToColor(color));
- pipeline.add(filter);
- }
-
- private void caption(final Pipeline pipeline, final ANode node) throws QueryException {
- ImageFilter filter;
- String color;
- Position pos;
- String text = Token.string(node.string());
- color = Utils.attrib(node, "color", "black");
- pos = Utils.position(node, "position", Positions.TOP_CENTER);
- String fontName = Utils.attrib(node, "font", "SansSerif");
- int size = Utils.attrib(node, "size", 14);
- int insets = Utils.attrib(node, "insets", 0);
- Font font = new Font(fontName, Font.PLAIN, size);
- filter = new Caption(text, font , Utils.stringToColor(color),
- pos, insets);
- pipeline.add(filter);
- }
-}
diff --git a/xar/src/main/java/org/expkgzone58/image/Utils.java b/xar/src/main/java/org/expkgzone58/image/Utils.java
deleted file mode 100644
index 4c0869d..0000000
--- a/xar/src/main/java/org/expkgzone58/image/Utils.java
+++ /dev/null
@@ -1,73 +0,0 @@
-package org.expkgzone58.image;
-
-import java.awt.Color;
-import java.lang.reflect.Field;
-import java.nio.charset.StandardCharsets;
-
-import org.basex.query.QueryException;
-import org.basex.query.value.item.Bln;
-import org.basex.query.value.item.Dbl;
-import org.basex.query.value.item.Int;
-import org.basex.query.value.item.Item;
-import org.basex.query.value.node.ANode;
-import org.basex.util.Token;
-
-import net.coobird.thumbnailator.geometry.Position;
-import net.coobird.thumbnailator.geometry.Positions;
-
-public final class Utils {
- private Utils() {
- };
- // get value from attribute with default
- public static String attrib(final ANode element, final String name, final String def)
- throws QueryException {
- byte[] at = element.attribute(name.getBytes(StandardCharsets.UTF_8));
- return (at == null) ? def : Token.string(at);
- }
-
- public static float attrib(final ANode element, final String name, final float def)
- throws QueryException {
- byte[] at = element.attribute(name.getBytes(StandardCharsets.UTF_8));
- return (at == null) ? def : (float) Dbl.parse(at, null);
- }
-
- public static int attrib(final ANode element, final String name, final int def)
- throws QueryException {
- byte[] at = element.attribute(name.getBytes(StandardCharsets.UTF_8));
- return (at == null) ? def : Token.toInt(at);
- }
-
- public static boolean attrib(final ANode element, final String name, final boolean def)
- throws QueryException {
- byte[] at = element.attribute(name.getBytes(StandardCharsets.UTF_8));
- return (boolean) ((at == null) ? def : Bln.parse(at));
- }
-
- // e.g. TOP_LEFT
- public static Position position(final ANode element, final String name, final Position def) {
- byte[] at = element.attribute(name.getBytes(StandardCharsets.UTF_8));
- return (at == null) ? def : Positions.valueOf(Token.string(at));
- }
-
- public static Color stringToColor(final String value) {
- if (value == null) {
- return Color.black;
- }
- try {
- // get color by hex or octal value
- return Color.decode(value);
- } catch (NumberFormatException nfe) {
- // if we can't decode lets try to get it by name
- try {
- // try to get a color by name using reflection
- final Field f = Color.class.getField(value);
-
- return (Color) f.get(null);
- } catch (Exception ce) {
- // if we can't get any color return black
- return Color.black;
- }
- }
- }
-
-}
diff --git a/xar/src/test/java/org/example/LibraryTest.java b/xar/src/test/java/org/example/LibraryTest.java
deleted file mode 100644
index 392309c..0000000
--- a/xar/src/test/java/org/example/LibraryTest.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * This source file was generated by the Gradle 'init' task
- */
-package org.example;
-
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-public class LibraryTest {
- @Test public void someLibraryMethodReturnsTrue() {
- Library classUnderTest = new Library();
- assertTrue("someLibraryMethod should return 'true'", classUnderTest.someLibraryMethod());
- }
-}