| ] | ||
| +def javaVersionFull = new File( "java.version" ).text | ||
| +def (javaVersion, javaUpdate) = javaVersionFull.tokenize( '+' ) | ||
| + | ||
| java { | ||
| - sourceCompatibility = 22 | ||
| - targetCompatibility = 22 | ||
| + sourceCompatibility = javaVersion | ||
| + targetCompatibility = javaVersion | ||
| } | ||
| javafx { | ||
| - version = '21' | ||
| + version = javaVersion | ||
| modules = ['javafx.base', 'javafx.controls', 'javafx.graphics', 'javafx.swing'] | ||
| configuration = 'compileOnly' | ||
| tasks.withType( JavaCompile ).configureEach { | ||
| options.encoding = 'UTF-8' | ||
| - options.compilerArgs += '--enable-preview' | ||
| } | ||
| readonly OPT_JAVA=$(cat << END_OF_ARGS | ||
| -Dprism.order=sw \ | ||
| ---enable-preview \ | ||
| --add-opens=javafx.controls/javafx.scene.control=ALL-UNNAMED \ | ||
| --add-opens=javafx.controls/javafx.scene.control.skin=ALL-UNNAMED \ | ||
| END_OF_ARGS | ||
| ) | ||
| + | ||
| +readonly JAVA_VERSION=$(cat java.version) | ||
| ARG_JAVA_OS="linux" | ||
| ARG_JAVA_ARCH="amd64" | ||
| -ARG_JAVA_VERSION="21.0.2" | ||
| -ARG_JAVA_UPDATE="14" | ||
| +ARG_JAVA_VERSION=${JAVA_VERSION%+*} | ||
| +ARG_JAVA_UPDATE=${JAVA_VERSION#*+} | ||
| + | ||
| ARG_JAVA_DIR="java" | ||
| +23+38 | ||
| public void newTextEditor() { | ||
| final String key = "file.default.document."; | ||
| - final String prefix = Constants.get( STR."\{key}prefix" ); | ||
| - final String suffix = Constants.get( STR."\{key}suffix" ); | ||
| + final String prefix = Constants.get( String.format( "%s%s", key, "prefix" ) ); | ||
| + final String suffix = Constants.get( String.format( "%s%s", key, "suffix" ) ); | ||
| - File file = new File( STR."\{prefix}.\{suffix}" ); | ||
| + File file = new File( String.format( "%s.%s", prefix, suffix ) ); | ||
| int i = 0; | ||
| while( file.exists() && i++ < 100 ) { | ||
| - file = new File( STR."\{prefix}-\{i}.\{suffix}" ); | ||
| + file = new File( String.format( "%s-%s.%s", prefix, i, suffix ) ); | ||
| } | ||
| final var jsonNode = node.getValue(); | ||
| - final var keyName = STR."\{parent}.\{node.getKey()}"; | ||
| + final var keyName = String.format( "%s.%s", parent, node.getKey() ); | ||
| if( jsonNode.isValueNode() ) { |
| import java.util.concurrent.ConcurrentHashMap; | ||
| +import static java.lang.String.format; | ||
| import static java.util.regex.Matcher.quoteReplacement; | ||
| if( mapValue.contains( mOperator.apply( keyName ) ) ) { | ||
| throw new IllegalStateException( | ||
| - STR."Mapped value '\{mapValue}' may not contain its key name '\{keyName}'" ); | ||
| + format( | ||
| + "Mapped value '%s' may not contain its key name '%s'", | ||
| + mapValue, | ||
| + keyName | ||
| + ) | ||
| + ); | ||
| } | ||
| import static com.keenwrite.events.StatusEvent.clue; | ||
| import static com.keenwrite.util.FileWalker.walk; | ||
| +import static java.lang.String.format; | ||
| import static java.lang.System.lineSeparator; | ||
| import static java.nio.charset.StandardCharsets.UTF_8; | ||
| public String call() throws IOException { | ||
| - final var glob = STR."**/*.\{mExtension}"; | ||
| + final var glob = format( "**/*.%s", mExtension ); | ||
| final var files = new ArrayList<Path>(); | ||
| final var text = new StringBuilder( DOCUMENT_LENGTH ); | ||
| */ | ||
| private static File getFile( final String suffix ) { | ||
| - return new File( get( STR."file.default.\{suffix}" ) ); | ||
| + return new File( get( String.format( "file.default.%s", suffix ) ) ); | ||
| } | ||
| private Button createButton( | ||
| final String msgKey, final EventHandler<ActionEvent> eventHandler ) { | ||
| - final var keyPrefix = STR."\{Constants.ACTION_PREFIX}definition.\{msgKey}"; | ||
| - final var button = new Button( get( STR."\{keyPrefix}.text" ) ); | ||
| - final var graphic = createGraphic( get( STR."\{keyPrefix}.icon" ) ); | ||
| + final var keyPrefix = Constants.ACTION_PREFIX + "definition." + msgKey; | ||
| + final var button = new Button( get( keyPrefix + ".text" ) ); | ||
| + final var graphic = createGraphic( get( keyPrefix + ".icon" ) ); | ||
| button.setOnAction( eventHandler ); | ||
| button.setGraphic( graphic ); | ||
| - button.setTooltip( new Tooltip( get( STR."\{keyPrefix}.tooltip" ) ) ); | ||
| + button.setTooltip( new Tooltip( get( keyPrefix + ".tooltip" ) ) ); | ||
| return button; | ||
| final var items = menu.getItems(); | ||
| - addMenuItem( items, STR."\{ACTION_PREFIX}definition.create.text" ) | ||
| + addMenuItem( items, ACTION_PREFIX + "definition.create.text" ) | ||
| .setOnAction( _ -> createDefinition() ); | ||
| - addMenuItem( items, STR."\{ACTION_PREFIX}definition.rename.text" ) | ||
| + addMenuItem( items, ACTION_PREFIX + "definition.rename.text" ) | ||
| .setOnAction( _ -> renameDefinition() ); | ||
| - addMenuItem( items, STR."\{ACTION_PREFIX}definition.delete.text" ) | ||
| + addMenuItem( items, ACTION_PREFIX + "definition.delete.text" ) | ||
| .setOnAction( _ -> deleteSelectedItem() ); | ||
| - addMenuItem( items, STR."\{ACTION_PREFIX}definition.insert.text" ) | ||
| + addMenuItem( items, ACTION_PREFIX + "definition.insert.text" ) | ||
| .setOnAction( _ -> insertSelectedItem() ); | ||
| private Node label( final Key key, final String... values ) { | ||
| - return new Label( get( STR."\{key.toString()}.desc", (Object[]) values ) ); | ||
| + return new Label( get( String.format( "%s%s", key.toString(), ".desc" ), (Object[]) values ) ); | ||
| } | ||
| private String title( final Key key ) { | ||
| - return get( STR."\{key.toString()}.title" ); | ||
| + return get( String.format( "%s%s", key.toString(), ".title" ) ); | ||
| } | ||
| @Override | ||
| public String apply( final String t ) { | ||
| - return STR."<pre>\{t}</pre>"; | ||
| + return String.format( "<pre>%s</pre>", t ); | ||
| } | ||
| } |
| import java.util.regex.Pattern; | ||
| +import static java.lang.String.format; | ||
| import static java.util.regex.Pattern.UNICODE_CHARACTER_CLASS; | ||
| import static java.util.regex.Pattern.compile; | ||
| // When no regular CSS definition (id or class), use key/value pairs. | ||
| if( cssDef == null ) { | ||
| - cssAttrKey = STR."data-\{pairMatcher.group( "k" )}"; | ||
| + cssAttrKey = format( "data-%s", pairMatcher.group( "k" ) ); | ||
| cssAttrVal = pairMatcher.group( "v" ); | ||
| } | ||
| import org.jetbrains.annotations.NotNull; | ||
| +import static java.lang.String.format; | ||
| + | ||
| /** | ||
| * Responsible for writing HTML anchor cross-references in the form | ||
| AnchorXrefNode( final String type, final String id ) { | ||
| mTypeName = type; | ||
| - mIdName = STR. "#\{ id }" ; | ||
| + mIdName = format( "#%s", id ); | ||
| } | ||
| import java.util.regex.Pattern; | ||
| +import static java.lang.String.format; | ||
| + | ||
| class BasedSequenceNameParser extends BasedSequenceParser { | ||
| - private static final String REGEX = STR. "#\{ REGEX_INNER }" ; | ||
| + private static final String REGEX = format( "#%s", REGEX_INNER ); | ||
| private static final Pattern PATTERN = asPattern( REGEX ); | ||
| import static com.keenwrite.processors.markdown.extensions.common.EmptyNode.EMPTY_NODE; | ||
| +import static java.lang.String.format; | ||
| class BasedSequenceXrefParser extends BasedSequenceParser { | ||
| - private static final String REGEX = STR. "\\[@\{ REGEX_INNER }]" ; | ||
| + private static final String REGEX = format( "\\[@%s]", REGEX_INNER ); | ||
| private static final Pattern PATTERN = asPattern( REGEX ); | ||
| import com.vladsch.flexmark.html.HtmlWriter; | ||
| +import static java.lang.String.format; | ||
| + | ||
| /** | ||
| * Responsible for generating anchor links, either named or cross-referenced. | ||
| final var attr = getRefAttrName(); | ||
| - final var clazz = STR. "class=\"\{ attr }\"" ; | ||
| - final var dataType = STR. "data-type=\"\{ type }\"" ; | ||
| - final var refId = STR. "\{ attr }=\"\{ id }\"" ; | ||
| + final var clazz = format( "class=\"%s\"", attr ); | ||
| + final var dataType = format( "data-type=\"%s\"", type ); | ||
| + final var refId = format( "%s=\"%s\"", attr, id ); | ||
| - html.raw( STR. "<a \{ clazz } \{ dataType } \{ refId } />" ); | ||
| + html.raw( format( "<a %s %s %s />", clazz, dataType, refId ) ); | ||
| } | ||
| } | ||
| private static void status( final String s, final long count ) { | ||
| - clue( STR."Main.status.lexicon.\{s}", count ); | ||
| + clue( format( "Main.status.lexicon.%s", s ), count ); | ||
| } | ||
| } |
| private static final String TYPESETTER_VERSION = | ||
| - STR."\{TYPESETTER_EXE} --version > /dev/null"; | ||
| + String.format( "%s%s", TYPESETTER_EXE, " --version > /dev/null" ); | ||
| public GuestTypesetter( final Mutator mutator ) { | ||
| manager.run( | ||
| input -> gobble( input, s -> exitCode.append( s.trim() ) ), | ||
| - STR."\{TYPESETTER_VERSION}; echo $?" | ||
| + String.format( "%s%s", TYPESETTER_VERSION, "; echo $?" ) | ||
| ); | ||
| import static com.keenwrite.events.StatusEvent.clue; | ||
| import static com.keenwrite.util.Time.toElapsedTime; | ||
| +import static java.lang.String.*; | ||
| import static java.lang.String.format; | ||
| import static java.lang.System.currentTimeMillis; | ||
| final var prefix = "Main.status.typeset."; | ||
| - clue( STR."\{prefix}began", outputPath ); | ||
| + clue( format( "%s%s", prefix, "began" ), outputPath ); | ||
| final var time = currentTimeMillis(); | ||
| final var success = typesetter.call(); | ||
| final var suffix = success ? "success" : "failure"; | ||
| - clue( STR."\{prefix}ended.\{suffix}", outputPath, since( time ) ); | ||
| + clue( format( "%sended.%s", prefix, suffix ), outputPath, since( time ) ); | ||
| } | ||
| args.add( | ||
| - format( "--arguments=themesdir=%s,imagesdir=%s,cachesdir=%s", | ||
| - themesPath, imagesPath, cachesPath ) | ||
| + format( | ||
| + "--arguments=themesdir=%s,imagesdir=%s,cachesdir=%s", | ||
| + themesPath, imagesPath, cachesPath | ||
| + ) | ||
| ); | ||
| args.add( format( "--path='%s'", themesPath ) ); | ||
| import static com.keenwrite.io.downloads.DownloadManager.downloadAsync; | ||
| import static com.keenwrite.io.downloads.DownloadManager.toFilename; | ||
| +import static java.lang.String.*; | ||
| /** | ||
| public AbstractDownloadPane() { | ||
| - mUri = getUri( STR."\{getPrefix()}.download.link.url" ); | ||
| + mUri = getUri( format( "%s%s", getPrefix(), ".download.link.url" ) ); | ||
| mFilename = toFilename( mUri ); | ||
| final var directory = USER_DATA_DIR; | ||
| mTarget = toFile( directory.resolve( mFilename ) ); | ||
| - final var source = labelf( STR."\{getPrefix()}.paths", mFilename, directory ); | ||
| - mStatus = labelf( STR."\{getPrefix()}\{STATUS}.progress", 0, 0 ); | ||
| + final var source = labelf( | ||
| + format( "%s%s", getPrefix(), ".paths" ), mFilename, directory | ||
| + ); | ||
| + mStatus = labelf( format( "%s%s.progress", getPrefix(), STATUS ), 0, 0 ); | ||
| final var border = new BorderPane(); | ||
| final var suffix = checksumOk ? ".ok" : ".no"; | ||
| - updateStatus( STR."\{STATUS}.checksum\{suffix}", mFilename ); | ||
| + updateStatus( format( "%s.checksum%s", STATUS, suffix ), mFilename ); | ||
| disableNext( !checksumOk ); | ||
| } | ||
| @Override | ||
| protected String getHeaderKey() { | ||
| - return STR."\{getPrefix()}.header"; | ||
| + return format( "%s%s", getPrefix(), ".header" ); | ||
| } | ||
| protected void onDownloadSucceeded( | ||
| final String threadName, final ObservableMap<Object, Object> properties ) { | ||
| - updateStatus( STR."\{STATUS}.success" ); | ||
| + updateStatus( format( "%s%s", STATUS, ".success" ) ); | ||
| properties.remove( threadName ); | ||
| disableNext( false ); | ||
| } | ||
| protected void onDownloadFailed( | ||
| final String threadName, final ObservableMap<Object, Object> properties ) { | ||
| - updateStatus( STR."\{STATUS}.failure" ); | ||
| + updateStatus( format( "%s%s", STATUS, ".failure" ) ); | ||
| properties.remove( threadName ); | ||
| } | ||
| static Hyperlink hyperlink( final String prefix ) { | ||
| - final var label = get( STR."\{prefix}.lbl" ); | ||
| - final var url = get( STR."\{prefix}.url" ); | ||
| + final var label = get( String.format( "%s%s", prefix, ".lbl" ) ); | ||
| + final var url = get( String.format( "%s%s", prefix, ".url" ) ); | ||
| final var link = new Hyperlink( label ); | ||
| final var node = super.createButtonBar(); | ||
| final var layout = new BorderPane(); | ||
| - final var copyButton = button( STR."\{PREFIX}.copy.began" ); | ||
| + final var copyButton = button( format( "%s%s", PREFIX, ".copy.began" ) ); | ||
| // Change the label to indicate clipboard is updated. | ||
| copyButton.setOnAction( _ -> { | ||
| SystemClipboard.write( mCommands.getText() ); | ||
| - copyButton.setText( get( STR."\{PREFIX}.copy.ended" ) ); | ||
| + copyButton.setText( get( format( "%s%s", PREFIX, ".copy.ended" ) ) ); | ||
| } ); | ||
| @Override | ||
| protected String getHeaderKey() { | ||
| - return STR."\{PREFIX}.header"; | ||
| + return format( "%s%s", PREFIX, ".header" ); | ||
| } | ||
| final var comboBox = new ComboBox<UnixOsCommand>(); | ||
| final var items = comboBox.getItems(); | ||
| - final var prefix = STR."\{PREFIX}.command"; | ||
| - final var distros = getInt( STR."\{prefix}.distros", 14 ); | ||
| + final var prefix = format( "%s%s", PREFIX, ".command" ); | ||
| + final var distros = getInt( format( "%s%s", prefix, ".distros" ), 14 ); | ||
| for( int i = 1; i <= distros; i++ ) { | ||
| final var suffix = format( ".%02d", i ); | ||
| - final var name = get( STR."\{prefix}.os.name\{suffix}" ); | ||
| - final var command = get( STR."\{prefix}.os.text\{suffix}" ); | ||
| + final var name = get( format( "%s.os.name%s", prefix, suffix ) ); | ||
| + final var command = get( format( "%s.os.text%s", prefix, suffix ) ); | ||
| items.add( new UnixOsCommand( name, command ) ); | ||
| final var titledPane = titledPane( "Output", mCommands ); | ||
| - append( mCommands, get( STR."\{PREFIX}.status.running" ) ); | ||
| + append( mCommands, get( String.format( "%s%s", PREFIX, ".status.running" ) ) ); | ||
| final var stepsPane = new VBox(); | ||
| final var steps = stepsPane.getChildren(); | ||
| - steps.add( label( STR."\{PREFIX}.step.0" ) ); | ||
| + steps.add( label( String.format( "%s%s", PREFIX, ".step.0" ) ) ); | ||
| steps.add( spacer() ); | ||
| - steps.add( label( STR."\{PREFIX}.step.1" ) ); | ||
| - steps.add( label( STR."\{PREFIX}.step.2" ) ); | ||
| - steps.add( label( STR."\{PREFIX}.step.3" ) ); | ||
| + steps.add( label( String.format( "%s%s", PREFIX, ".step.1" ) ) ); | ||
| + steps.add( label( String.format( "%s%s", PREFIX, ".step.2" ) ) ); | ||
| + steps.add( label( String.format( "%s%s", PREFIX, ".step.3" ) ) ); | ||
| steps.add( spacer() ); | ||
| steps.add( titledPane ); | ||
| final var binary = properties.get( WIN_BIN ); | ||
| - final var key = STR."\{PREFIX}.status"; | ||
| + final var key = String.format( "%s%s", PREFIX, ".status" ); | ||
| if( binary instanceof File exe ) { | ||
| final var task = createTask( () -> { | ||
| final var exit = mContainer.install( exe ); | ||
| // Remove the installer after installation is finished. | ||
| properties.remove( thread ); | ||
| final var msg = exit == 0 | ||
| - ? get( STR."\{key}.success" ) | ||
| - : get( STR."\{key}.failure", exit ); | ||
| + ? get( String.format( "%s%s", key, ".success" ) ) | ||
| + : get( String.format( "%s%s", key, ".failure" ), exit ); | ||
| append( mCommands, msg ); | ||
| } | ||
| else { | ||
| - append( mCommands, get( STR."\{PREFIX}.unknown", binary ) ); | ||
| + append( mCommands, get( String.format( "%s%s", PREFIX, ".unknown" ), binary ) ); | ||
| } | ||
| } | ||
| @Override | ||
| public String getHeaderKey() { | ||
| - return STR."\{PREFIX}.header"; | ||
| + return String.format( "%s%s", PREFIX, ".header" ); | ||
| } | ||
| } | ||
| */ | ||
| public Builder setId( final String id ) { | ||
| - final var prefix = STR."\{ACTION_PREFIX}\{id}."; | ||
| - final var text = STR."\{prefix}text"; | ||
| - final var icon = STR."\{prefix}icon"; | ||
| - final var accelerator = STR."\{prefix}accelerator"; | ||
| + final var prefix = String.format( "%s%s.", ACTION_PREFIX, id ); | ||
| + final var text = String.format( "%s%s", prefix, "text" ); | ||
| + final var icon = String.format( "%s%s", prefix, "icon" ); | ||
| + final var accelerator = String.format( "%s%s", prefix, "accelerator" ); | ||
| final var builder = setText( text ).setIcon( icon ); | ||
| if( mAccelerator != null ) { | ||
| - tooltip += STR." (\{mAccelerator.getDisplayText()}\{')'}"; | ||
| + tooltip += String.format( " (%s)", mAccelerator.getDisplayText() ); | ||
| } | ||
| final var alert = new Alert( INFORMATION ); | ||
| final var prefix = "Dialog.about."; | ||
| - alert.setTitle( get( STR."\{prefix}title", APP_TITLE ) ); | ||
| - alert.setHeaderText( get( STR."\{prefix}header", APP_TITLE ) ); | ||
| - alert.setContentText( get( STR."\{prefix}content", | ||
| + alert.setTitle( get( String.format( "%s%s", prefix, "title" ), APP_TITLE ) ); | ||
| + alert.setHeaderText( get( String.format( "%s%s", prefix, "header" ), APP_TITLE ) ); | ||
| + alert.setContentText( get( String.format( "%s%s", prefix, "content" ), | ||
| APP_YEAR, | ||
| APP_VERSION ) ); |
| private Label createLabel( final String key ) { | ||
| - final var label = new Label( STR."\{get( key )}:" ); | ||
| + final var label = new Label( String.format( "%s%s", get( key ), ":" ) ); | ||
| final var font = label.getFont(); | ||
| final var upscale = new Font( font.getName(), 14 ); |
| */ | ||
| public HyperlinkDialog( final Window owner, final HyperlinkModel model ) { | ||
| - super( owner, STR."\{PREFIX}title" ); | ||
| + super( owner, String.format( "%s%s", PREFIX, "title" ) ); | ||
| mModel = model; | ||
| addInputField( | ||
| "text", | ||
| - STR."\{PREFIX}label.text", STR."\{PREFIX}prompt.text", | ||
| + String.format( "%s%s", PREFIX, "label.text" ), String.format( "%s%s", PREFIX, "prompt.text" ), | ||
| mModel.getText(), | ||
| ( _, _, n ) -> mModel.setText( n ) | ||
| ); | ||
| addInputField( | ||
| "url", | ||
| - STR."\{PREFIX}label.url", STR."\{PREFIX}prompt.url", | ||
| + String.format( "%s%s", PREFIX, "label.url" ), String.format( "%s%s", PREFIX, "prompt.url" ), | ||
| mModel.getUrl(), | ||
| ( _, _, n ) -> mModel.setUrl( n ) | ||
| ); | ||
| addInputField( | ||
| "title", | ||
| - STR."\{PREFIX}label.title", STR."\{PREFIX}prompt.title", | ||
| + String.format( "%s%s", PREFIX, "label.title" ), String.format( "%s%s", PREFIX, "prompt.title" ), | ||
| mModel.getTitle(), | ||
| ( _, _, n ) -> mModel.setTitle( n ) | ||
| public ImageDialog( final Window owner, final ImageModel model ) { | ||
| - super( owner, STR."\{PREFIX}title" ); | ||
| + super( owner, String.format( "%s%s", PREFIX, "title" ) ); | ||
| mModel = model; | ||
| addInputField( | ||
| "url", | ||
| - STR."\{PREFIX}label.url", STR."\{PREFIX}prompt.url", | ||
| + String.format( "%s%s", PREFIX, "label.url" ), | ||
| + String.format( "%s%s", PREFIX, "prompt.url" ), | ||
| mModel.getUrl(), | ||
| ( _, _, n ) -> mModel.setUrl( n ) | ||
| ); | ||
| addInputField( | ||
| "text", | ||
| - STR."\{PREFIX}label.text", STR."\{PREFIX}prompt.text", | ||
| + String.format( "%s%s", PREFIX, "label.text" ), | ||
| + String.format( "%s%s", PREFIX, "prompt.text" ), | ||
| mModel.getText(), | ||
| ( _, _, n ) -> mModel.setText( n ) | ||
| ); | ||
| addInputField( | ||
| "title", | ||
| - STR."\{PREFIX}label.title", STR."\{PREFIX}prompt.title", | ||
| + String.format( "%s%s", PREFIX, "label.title" ), | ||
| + String.format( "%s%s", PREFIX, "prompt.title" ), | ||
| mModel.getTitle(), | ||
| ( _, _, n ) -> mModel.setTitle( n ) | ||
| private static final String PREFIX = "Dialog.open_url."; | ||
| private static final String DOWNLOAD = "Main.status.url.request."; | ||
| - private static final String STATUS = STR."\{DOWNLOAD}status."; | ||
| + private static final String STATUS = String.format( | ||
| + "%s%s", DOWNLOAD, "status." | ||
| + ); | ||
| private final Path mParent; | ||
| */ | ||
| public OpenUrlDialog( final Window owner, final Path parent ) { | ||
| - super( owner, STR."\{PREFIX}title" ); | ||
| + super( owner, String.format( "%s%s", PREFIX, "title" ) ); | ||
| mParent = parent; | ||
| addInputField( | ||
| "url", | ||
| - STR."\{PREFIX}label.url", STR."\{PREFIX}prompt.url", | ||
| + String.format( "%s%s", PREFIX, "label.url" ), | ||
| + String.format( "%s%s", PREFIX, "prompt.url" ), | ||
| mUrl, | ||
| ( _, _, n ) -> mUrl = sanitize( n ) | ||
| private File download( final String reference ) { | ||
| try { | ||
| - clue( STR."\{DOWNLOAD}fetch", reference ); | ||
| + clue( String.format( "%s%s", DOWNLOAD, "fetch" ), reference ); | ||
| final var uri = new URI( reference ); | ||
| final var path = toFile( uri ); | ||
| final var basedir = path.getName(); | ||
| final var file = mParent.resolve( basedir ).toFile(); | ||
| if( file.exists() ) { | ||
| - clue( STR."\{DOWNLOAD}exists", file ); | ||
| + clue( String.format( "%s%s", DOWNLOAD, "exists" ), file ); | ||
| } | ||
| else { | ||
| final var task = downloadAsync( uri, file, ( progress, bytes ) -> { | ||
| final var suffix = progress < 0 ? "bytes" : "progress"; | ||
| - clue( STR."\{STATUS}\{suffix}", progress, bytes ); | ||
| + clue( String.format( "%s%s", STATUS, suffix ), progress, bytes ); | ||
| } ); | ||
| task.setOnSucceeded( _ -> { | ||
| - clue( STR."\{DOWNLOAD}success", file ); | ||
| + clue( String.format( "%s%s", DOWNLOAD, "success" ), file ); | ||
| // Only after the download succeeds can we open the file. | ||
| FileOpenEvent.fire( file.toURI() ); | ||
| } ); | ||
| - task.setOnFailed( _ -> clue( STR."\{DOWNLOAD}failure", uri ) ); | ||
| + task.setOnFailed( _ -> clue( | ||
| + String.format( "%s%s", DOWNLOAD, "failure" ), uri ) | ||
| + ); | ||
| } | ||
| import com.vladsch.flexmark.ast.Link; | ||
| +import org.renjin.gnur.format; | ||
| /** | ||
| public String toString() { | ||
| final String format = hasText() | ||
| - ? STR."[%s]\{hasTitle() ? "(%s \"%s\")" : "(%s%s)"}" | ||
| + ? "[%s]" + (hasTitle() ? "(%s \"%s\")" : "(%s%s)") | ||
| : "%s%s%s"; | ||
| package com.keenwrite.ui.models; | ||
| +import org.renjin.gnur.format; | ||
| + | ||
| /** | ||
| * Represents the model for an image: text, url, and title. | ||
| public String toString() { | ||
| final String format = hasText() | ||
| - ? STR."![%s]\{hasTitle() ? "(%s \"%s\")" : "(%s%s)"}" | ||
| + ? "![%s]" + (hasTitle() ? "(%s \"%s\")" : "(%s%s)") | ||
| : "%s"; | ||
| import java.util.function.Consumer; | ||
| +import static java.lang.String.format; | ||
| import static java.nio.file.FileSystems.getDefault; | ||
| final Path path, final String glob, final Consumer<Path> c ) | ||
| throws IOException { | ||
| - final var matcher = getDefault().getPathMatcher( STR."glob:\{glob}" ); | ||
| + final var pattern = format( "glob:%s", glob ); | ||
| + final var matcher = getDefault().getPathMatcher( pattern ); | ||
| try( final var walk = Files.walk( path, 10 ) ) { | ||
| final var dir = pkgName.replace( '.', '/' ); | ||
| - final var urls = clazz.getClassLoader().getResources( STR."\{dir}/images" ); | ||
| + final var urls = clazz.getClassLoader().getResources( String.format( "%s%s", dir, "/images" ) ); | ||
| assertTrue( urls.hasMoreElements() ); | ||
| final var actualExtension = valueFrom( media ).getExtension(); | ||
| final var expectedExtension = getExtension( image.toString() ); | ||
| - System.out.println( STR."\{image} -> \{media}" ); | ||
| + System.out.println( String.format( "%s%s", image, " -> \{media}" ) ); | ||
| assertEquals( expectedExtension, actualExtension ); | ||
| private static final String URI_FILE = "kitten"; | ||
| private static final String URI_PATH = UIR_DIR + '/' + URI_FILE; | ||
| - private static final String PATH_KITTEN_PNG = STR."\{URI_PATH}.png"; | ||
| - private static final String PATH_KITTEN_JPG = STR."\{URI_PATH}.jpg"; | ||
| + private static final String PATH_KITTEN_PNG = String.format( | ||
| + "%s%s", URI_PATH, ".png" ); | ||
| + private static final String PATH_KITTEN_JPG = String.format( | ||
| + "%s%s", URI_PATH, ".jpg" ); | ||
| - /** Web server that doles out images. */ | ||
| + /** | ||
| + * Web server that doles out images. | ||
| + */ | ||
| private static final String PLACEHOLDER = "loremflickr.com"; | ||
| private static final Map<String, String> IMAGES = new LinkedHashMap<>(); | ||
| static { | ||
| add( PATH_KITTEN_PNG, URI_PATH ); | ||
| add( PATH_KITTEN_PNG, URI_FILE ); | ||
| add( PATH_KITTEN_PNG, PATH_KITTEN_PNG ); | ||
| add( PATH_KITTEN_JPG, PATH_KITTEN_JPG ); | ||
| - add( STR."//\{PLACEHOLDER}/200/200", STR."//\{PLACEHOLDER}/200/200" ); | ||
| - add( STR."ftp://\{PLACEHOLDER}/200/200", STR."ftp://\{PLACEHOLDER}/200/200" ); | ||
| - add( STR."http://\{PLACEHOLDER}/200/200", STR."http://\{PLACEHOLDER}/200/200" ); | ||
| - add( STR."https://\{PLACEHOLDER}/200/200", STR."https://\{PLACEHOLDER}/200/200" ); | ||
| + add( format( "//%s/200/200", PLACEHOLDER ), | ||
| + format( "//%s/200/200", PLACEHOLDER ) ); | ||
| + add( format( "ftp://%s/200/200", PLACEHOLDER ), | ||
| + format( "ftp://%s/200/200", PLACEHOLDER ) ); | ||
| + add( format( "http://%s/200/200", PLACEHOLDER ), | ||
| + format( "http://%s/200/200", PLACEHOLDER ) ); | ||
| + add( format( "https://%s/200/200", PLACEHOLDER ), | ||
| + format( "https://%s/200/200", PLACEHOLDER ) ); | ||
| } | ||
| Author | DaveJarvis <email> |
|---|---|
| Date | 2024-10-04 01:59:58 GMT-0700 |
| Commit | 579e02e38b25927ee96119830f651904227a10a6 |
| Parent | deeb0b7 |
| Delta | 151 lines added, 104 lines removed, 47-line increase |