#!/usr/bin/env --split-string=${JDK_HOME}/bin/java @Makeshift/java_arguments @Makeshift/java_javac_arguments \c [SS]
// This command runs directly from the present source file, it needs no compiling.
import Breccia.parser.plain.BrecciaCursor;
import Breccia.Web.imager.BreccianFileTranslator;
import Breccia.Web.imager.FileTranslator;
import Breccia.Web.imager.ImageMould;
import Breccia.XML.translator.BrecciaXCursor;
import java.io.IOException;
import java.io.PrintStream;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.List;
import wayic.Waybrec.parser.WaybrecCursor;
import wayic.Web.imager.ImagingOptions;
import wayic.Web.imager.Project;
import wayic.Web.imager.WaybreccianFileTranslator;
import static Breccia.Web.imager.ImagingCommands.image;
import static java.lang.System.err;
import static java.lang.System.exit;
/** A shell command to make a Web image.
*
* @see
* The `waycast-web-image` command
*/
public final class WaycastWebImageCommand implements AutoCloseable { // [AFN]
/** @param argsN Nominal arguments, aka options.
* @param argsP Positional arguments.
*/
private WaycastWebImageCommand( final List argsN, final List argsP ) {
opt.initialize( argsN );
final int n = argsP.size();
if( n != 1 ) {
err.println( commandName + ": Expecting 1 argument, found " + n );
exitWithUsage( err, 1 ); }
boundaryPath = Path.of(argsP.get(0)).toAbsolutePath().normalize(); }
/** Takes a `waycast-web-image` command from the shell and executes it.
*/
public static void main( final String[] arguments ) {
final var argsN = new ArrayList();
final var argsP = new ArrayList();
for( final String arg: arguments ) {
exitOnDemand( arg );
(arg.charAt(0) == '-' ? argsN : argsP).add( arg ); }
try( final var command = new WaycastWebImageCommand( argsN, argsP )) {
if( !command.run() ) exit( 1 ); }}
// ━━━ A u t o C l o s e a b l e ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
public @Override void close() { sourceXCursor.close(); }
//// P r i v a t e ////////////////////////////////////////////////////////////////////////////////////
private final Path boundaryPath;
private static final String commandName = "waycast-web-image";
private static void exitOnDemand( final String arg ) {
if( arg.equals("-?") || arg.equals("-help") ) exitWithUsage( System.out, 0 ); }
private static void exitWithUsage( final PrintStream sP, final int status ) {
sP.println( "Usage: " + commandName + " [] " );
sP.println( " " + commandName + " -help | -?" );
sP.println( "Options, one or more of:" );
sP.println( " -author-home-directory=" );
sP.println( " -centre-column=" );
sP.println( " -co-service-directory=" );
sP.println( " -exclude=" );
sP.println( " -fake" );
sP.println( " -force" );
sP.println( " -glyph-test-font= | none" );
sP.println( " -math" );
sP.println( " -reference-mapping=;;; [|| ;;;] ..." );
sP.println( " -speak" );
sP.println( " -stifle" );
sP.println( " -verbosity=0|1|2" );
exit( status ); }
private final ImagingOptions opt = new ImagingOptions( commandName );
/** @return True on success, false on failure.
*/
private boolean run() {
return image( commandName, boundaryPath, opt, new TranslatorMaker(), Project.outputDirectory ); }
private final BrecciaXCursor sourceXCursor = new BrecciaXCursor();
// ▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
private final class TranslatorMaker implements FileTranslator.Maker {
public @Override FileTranslator newTranslator( ImageMould> mould ) {
final var t = new BreccianFileTranslator<>( new BrecciaCursor(), sourceXCursor, mould );
final var tW = new WaybreccianFileTranslator( new WaybrecCursor(), sourceXCursor, mould, t,
opt );
return tW; }}}
// NOTES
// ─────
// AFN Atypical file naming is allowed here. ‘The compiler does not enforce the optional restriction
// defined at the end of JLS §7.6, that a type in a named package should exist in a file whose
// name is composed from the type name followed by the .java extension.’
//
//
//
// No longer, however, does this allowance extend to the package name. While in JDK releases
// prior to 22 “the launcher's source-file mode was permissive about which package, if any,
// was declared”, current releases enforce a correspondence between the declared package name
// and the file path. Failing this, the launcher aborts with “end of path to source file
// does not match its package name”.
//
// SS · Here the long form `--split-string` (as opposed to `-S`) enables Emacs to recognize this file
// as Java source code. See the note apropos of ‘source-launch files encoded with a shebang’ at
// `http://reluk.ca/project/Java/Emacs/jmt-mode.el`.
// Copyright © 2020-2024 Michael Allan. Licence MIT.