Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git
M build.gradle
7878
]
7979
80
def javaVersionFull = new File( "java.version" ).text
81
def (javaVersion, javaUpdate) = javaVersionFull.tokenize( '+' )
82
8083
java {
81
  sourceCompatibility = 22
82
  targetCompatibility = 22
84
  sourceCompatibility = javaVersion
85
  targetCompatibility = javaVersion
8386
}
8487
8588
javafx {
86
  version = '21'
89
  version = javaVersion
8790
  modules = ['javafx.base', 'javafx.controls', 'javafx.graphics', 'javafx.swing']
8891
  configuration = 'compileOnly'
...
265268
tasks.withType( JavaCompile ).configureEach {
266269
  options.encoding = 'UTF-8'
267
  options.compilerArgs += '--enable-preview'
268270
}
269271
M installer.sh
2121
readonly OPT_JAVA=$(cat << END_OF_ARGS
2222
-Dprism.order=sw \
23
--enable-preview \
2423
--add-opens=javafx.controls/javafx.scene.control=ALL-UNNAMED \
2524
--add-opens=javafx.controls/javafx.scene.control.skin=ALL-UNNAMED \
...
3635
END_OF_ARGS
3736
)
37
38
readonly JAVA_VERSION=$(cat java.version)
3839
3940
ARG_JAVA_OS="linux"
4041
ARG_JAVA_ARCH="amd64"
41
ARG_JAVA_VERSION="21.0.2"
42
ARG_JAVA_UPDATE="14"
42
ARG_JAVA_VERSION=${JAVA_VERSION%+*}
43
ARG_JAVA_UPDATE=${JAVA_VERSION#*+}
44
4345
ARG_JAVA_DIR="java"
4446
A java.version
1
23+38
12
M src/main/java/com/keenwrite/MainPane.java
504504
  public void newTextEditor() {
505505
    final String key = "file.default.document.";
506
    final String prefix = Constants.get( STR."\{key}prefix" );
507
    final String suffix = Constants.get( STR."\{key}suffix" );
506
    final String prefix = Constants.get( String.format( "%s%s", key, "prefix" ) );
507
    final String suffix = Constants.get( String.format( "%s%s", key, "suffix" ) );
508508
509
    File file = new File( STR."\{prefix}.\{suffix}" );
509
    File file = new File( String.format( "%s.%s", prefix, suffix ) );
510510
    int i = 0;
511511
512512
    while( file.exists() && i++ < 100 ) {
513
      file = new File( STR."\{prefix}-\{i}.\{suffix}" );
513
      file = new File( String.format( "%s-%s.%s", prefix, i, suffix ) );
514514
    }
515515
M src/main/java/com/keenwrite/cmdline/Arguments.java
347347
348348
    final var jsonNode = node.getValue();
349
    final var keyName = STR."\{parent}.\{node.getKey()}";
349
    final var keyName = String.format( "%s.%s", parent, node.getKey() );
350350
351351
    if( jsonNode.isValueNode() ) {
M src/main/java/com/keenwrite/collections/InterpolatingMap.java
1111
import java.util.concurrent.ConcurrentHashMap;
1212
13
import static java.lang.String.format;
1314
import static java.util.regex.Matcher.quoteReplacement;
1415
...
9697
        if( mapValue.contains( mOperator.apply( keyName ) ) ) {
9798
          throw new IllegalStateException(
98
            STR."Mapped value '\{mapValue}' may not contain its key name '\{keyName}'" );
99
            format(
100
              "Mapped value '%s' may not contain its key name '%s'",
101
              mapValue,
102
              keyName
103
            )
104
          );
99105
        }
100106
M src/main/java/com/keenwrite/commands/ConcatenateCommand.java
1717
import static com.keenwrite.events.StatusEvent.clue;
1818
import static com.keenwrite.util.FileWalker.walk;
19
import static java.lang.String.format;
1920
import static java.lang.System.lineSeparator;
2021
import static java.nio.charset.StandardCharsets.UTF_8;
...
5657
5758
  public String call() throws IOException {
58
    final var glob = STR."**/*.\{mExtension}";
59
    final var glob = format( "**/*.%s", mExtension );
5960
    final var files = new ArrayList<Path>();
6061
    final var text = new StringBuilder( DOCUMENT_LENGTH );
M src/main/java/com/keenwrite/constants/Constants.java
271271
   */
272272
  private static File getFile( final String suffix ) {
273
    return new File( get( STR."file.default.\{suffix}" ) );
273
    return new File( get( String.format( "file.default.%s", suffix ) ) );
274274
  }
275275
M src/main/java/com/keenwrite/editors/definition/DefinitionEditor.java
231231
  private Button createButton(
232232
    final String msgKey, final EventHandler<ActionEvent> eventHandler ) {
233
    final var keyPrefix = STR."\{Constants.ACTION_PREFIX}definition.\{msgKey}";
234
    final var button = new Button( get( STR."\{keyPrefix}.text" ) );
235
    final var graphic = createGraphic( get( STR."\{keyPrefix}.icon" ) );
233
    final var keyPrefix = Constants.ACTION_PREFIX + "definition." + msgKey;
234
    final var button = new Button( get( keyPrefix + ".text" ) );
235
    final var graphic = createGraphic( get( keyPrefix + ".icon" ) );
236236
237237
    button.setOnAction( eventHandler );
238238
    button.setGraphic( graphic );
239
    button.setTooltip( new Tooltip( get( STR."\{keyPrefix}.tooltip" ) ) );
239
    button.setTooltip( new Tooltip( get( keyPrefix + ".tooltip" ) ) );
240240
241241
    return button;
...
429429
    final var items = menu.getItems();
430430
431
    addMenuItem( items, STR."\{ACTION_PREFIX}definition.create.text" )
431
    addMenuItem( items, ACTION_PREFIX + "definition.create.text" )
432432
      .setOnAction( _ -> createDefinition() );
433
    addMenuItem( items, STR."\{ACTION_PREFIX}definition.rename.text" )
433
    addMenuItem( items, ACTION_PREFIX + "definition.rename.text" )
434434
      .setOnAction( _ -> renameDefinition() );
435
    addMenuItem( items, STR."\{ACTION_PREFIX}definition.delete.text" )
435
    addMenuItem( items, ACTION_PREFIX + "definition.delete.text" )
436436
      .setOnAction( _ -> deleteSelectedItem() );
437
    addMenuItem( items, STR."\{ACTION_PREFIX}definition.insert.text" )
437
    addMenuItem( items, ACTION_PREFIX + "definition.insert.text" )
438438
      .setOnAction( _ -> insertSelectedItem() );
439439
M src/main/java/com/keenwrite/preferences/PreferencesController.java
374374
375375
  private Node label( final Key key, final String... values ) {
376
    return new Label( get( STR."\{key.toString()}.desc", (Object[]) values ) );
376
    return new Label( get( String.format( "%s%s", key.toString(), ".desc" ), (Object[]) values ) );
377377
  }
378378
379379
  private String title( final Key key ) {
380
    return get( STR."\{key.toString()}.title" );
380
    return get( String.format( "%s%s", key.toString(), ".title" ) );
381381
  }
382382
M src/main/java/com/keenwrite/processors/html/PreformattedProcessor.java
3333
  @Override
3434
  public String apply( final String t ) {
35
    return STR."<pre>\{t}</pre>";
35
    return String.format( "<pre>%s</pre>", t );
3636
  }
3737
}
M src/main/java/com/keenwrite/processors/markdown/extensions/fences/parsers/OpeningParser.java
1414
import java.util.regex.Pattern;
1515
16
import static java.lang.String.format;
1617
import static java.util.regex.Pattern.UNICODE_CHARACTER_CLASS;
1718
import static java.util.regex.Pattern.compile;
...
6162
        // When no regular CSS definition (id or class), use key/value pairs.
6263
        if( cssDef == null ) {
63
          cssAttrKey = STR."data-\{pairMatcher.group( "k" )}";
64
          cssAttrKey = format( "data-%s", pairMatcher.group( "k" ) );
6465
          cssAttrVal = pairMatcher.group( "v" );
6566
        }
M src/main/java/com/keenwrite/processors/markdown/extensions/references/AnchorXrefNode.java
99
import org.jetbrains.annotations.NotNull;
1010
11
import static java.lang.String.format;
12
1113
/**
1214
 * Responsible for writing HTML anchor cross-references in the form
...
2224
  AnchorXrefNode( final String type, final String id ) {
2325
    mTypeName = type;
24
    mIdName = STR. "#\{ id }" ;
26
    mIdName = format( "#%s", id );
2527
  }
2628
M src/main/java/com/keenwrite/processors/markdown/extensions/references/BasedSequenceNameParser.java
99
import java.util.regex.Pattern;
1010
11
import static java.lang.String.format;
12
1113
class BasedSequenceNameParser extends BasedSequenceParser {
12
  private static final String REGEX = STR. "#\{ REGEX_INNER }" ;
14
  private static final String REGEX = format( "#%s", REGEX_INNER );
1315
  private static final Pattern PATTERN = asPattern( REGEX );
1416
M src/main/java/com/keenwrite/processors/markdown/extensions/references/BasedSequenceXrefParser.java
1111
1212
import static com.keenwrite.processors.markdown.extensions.common.EmptyNode.EMPTY_NODE;
13
import static java.lang.String.format;
1314
1415
class BasedSequenceXrefParser extends BasedSequenceParser {
15
  private static final String REGEX = STR. "\\[@\{ REGEX_INNER }]" ;
16
  private static final String REGEX = format( "\\[@%s]", REGEX_INNER );
1617
  private static final Pattern PATTERN = asPattern( REGEX );
1718
M src/main/java/com/keenwrite/processors/markdown/extensions/references/CrossReferenceNode.java
77
import com.vladsch.flexmark.html.HtmlWriter;
88
9
import static java.lang.String.format;
10
911
/**
1012
 * Responsible for generating anchor links, either named or cross-referenced.
...
2729
    final var attr = getRefAttrName();
2830
29
    final var clazz = STR. "class=\"\{ attr }\"" ;
30
    final var dataType = STR. "data-type=\"\{ type }\"" ;
31
    final var refId = STR. "\{ attr }=\"\{ id }\"" ;
31
    final var clazz = format( "class=\"%s\"", attr );
32
    final var dataType = format( "data-type=\"%s\"", type );
33
    final var refId = format( "%s=\"%s\"", attr, id );
3234
33
    html.raw( STR. "<a \{ clazz } \{ dataType } \{ refId } />" );
35
    html.raw( format( "<a %s %s %s />", clazz, dataType, refId ) );
3436
  }
3537
}
M src/main/java/com/keenwrite/spelling/impl/Lexicon.java
133133
134134
  private static void status( final String s, final long count ) {
135
    clue( STR."Main.status.lexicon.\{s}", count );
135
    clue( format( "Main.status.lexicon.%s", s ), count );
136136
  }
137137
}
M src/main/java/com/keenwrite/typesetting/GuestTypesetter.java
3333
3434
  private static final String TYPESETTER_VERSION =
35
    STR."\{TYPESETTER_EXE} --version > /dev/null";
35
    String.format( "%s%s", TYPESETTER_EXE, " --version > /dev/null" );
3636
3737
  public GuestTypesetter( final Mutator mutator ) {
...
100100
        manager.run(
101101
          input -> gobble( input, s -> exitCode.append( s.trim() ) ),
102
          STR."\{TYPESETTER_VERSION}; echo $?"
102
          String.format( "%s%s", TYPESETTER_VERSION, "; echo $?" )
103103
        );
104104
M src/main/java/com/keenwrite/typesetting/Typesetter.java
1919
import static com.keenwrite.events.StatusEvent.clue;
2020
import static com.keenwrite.util.Time.toElapsedTime;
21
import static java.lang.String.*;
2122
import static java.lang.String.format;
2223
import static java.lang.System.currentTimeMillis;
...
165166
    final var prefix = "Main.status.typeset.";
166167
167
    clue( STR."\{prefix}began", outputPath );
168
    clue( format( "%s%s", prefix, "began" ), outputPath );
168169
169170
    final var time = currentTimeMillis();
170171
    final var success = typesetter.call();
171172
    final var suffix = success ? "success" : "failure";
172173
173
    clue( STR."\{prefix}ended.\{suffix}", outputPath, since( time ) );
174
    clue( format( "%sended.%s", prefix, suffix ), outputPath, since( time ) );
174175
  }
175176
...
188189
189190
    args.add(
190
      format( "--arguments=themesdir=%s,imagesdir=%s,cachesdir=%s",
191
              themesPath, imagesPath, cachesPath )
191
      format(
192
        "--arguments=themesdir=%s,imagesdir=%s,cachesdir=%s",
193
        themesPath, imagesPath, cachesPath
194
      )
192195
    );
193196
    args.add( format( "--path='%s'", themesPath ) );
M src/main/java/com/keenwrite/typesetting/installer/panes/AbstractDownloadPane.java
2222
import static com.keenwrite.io.downloads.DownloadManager.downloadAsync;
2323
import static com.keenwrite.io.downloads.DownloadManager.toFilename;
24
import static java.lang.String.*;
2425
2526
/**
...
3536
3637
  public AbstractDownloadPane() {
37
    mUri = getUri( STR."\{getPrefix()}.download.link.url" );
38
    mUri = getUri( format( "%s%s", getPrefix(), ".download.link.url" ) );
3839
    mFilename = toFilename( mUri );
3940
    final var directory = USER_DATA_DIR;
4041
    mTarget = toFile( directory.resolve( mFilename ) );
41
    final var source = labelf( STR."\{getPrefix()}.paths", mFilename, directory );
42
    mStatus = labelf( STR."\{getPrefix()}\{STATUS}.progress", 0, 0 );
42
    final var source = labelf(
43
      format( "%s%s", getPrefix(), ".paths" ), mFilename, directory
44
    );
45
    mStatus = labelf( format( "%s%s.progress", getPrefix(), STATUS ), 0, 0 );
4346
4447
    final var border = new BorderPane();
...
7376
      final var suffix = checksumOk ? ".ok" : ".no";
7477
75
      updateStatus( STR."\{STATUS}.checksum\{suffix}", mFilename );
78
      updateStatus( format( "%s.checksum%s", STATUS, suffix ), mFilename );
7679
      disableNext( !checksumOk );
7780
    }
...
99102
  @Override
100103
  protected String getHeaderKey() {
101
    return STR."\{getPrefix()}.header";
104
    return format( "%s%s", getPrefix(), ".header" );
102105
  }
103106
...
112115
  protected void onDownloadSucceeded(
113116
    final String threadName, final ObservableMap<Object, Object> properties ) {
114
    updateStatus( STR."\{STATUS}.success" );
117
    updateStatus( format( "%s%s", STATUS, ".success" ) );
115118
    properties.remove( threadName );
116119
    disableNext( false );
117120
  }
118121
119122
  protected void onDownloadFailed(
120123
    final String threadName, final ObservableMap<Object, Object> properties ) {
121
    updateStatus( STR."\{STATUS}.failure" );
124
    updateStatus( format( "%s%s", STATUS, ".failure" ) );
122125
    properties.remove( threadName );
123126
  }
M src/main/java/com/keenwrite/typesetting/installer/panes/InstallerPane.java
216216
217217
  static Hyperlink hyperlink( final String prefix ) {
218
    final var label = get( STR."\{prefix}.lbl" );
219
    final var url = get( STR."\{prefix}.url" );
218
    final var label = get( String.format( "%s%s", prefix, ".lbl" ) );
219
    final var url = get( String.format( "%s%s", prefix, ".url" ) );
220220
    final var link = new Hyperlink( label );
221221
M src/main/java/com/keenwrite/typesetting/installer/panes/UnixManagerInstallPane.java
8787
    final var node = super.createButtonBar();
8888
    final var layout = new BorderPane();
89
    final var copyButton = button( STR."\{PREFIX}.copy.began" );
89
    final var copyButton = button( format( "%s%s", PREFIX, ".copy.began" ) );
9090
9191
    // Change the label to indicate clipboard is updated.
9292
    copyButton.setOnAction( _ -> {
9393
      SystemClipboard.write( mCommands.getText() );
94
      copyButton.setText( get( STR."\{PREFIX}.copy.ended" ) );
94
      copyButton.setText( get( format( "%s%s", PREFIX, ".copy.ended" ) ) );
9595
    } );
9696
...
108108
  @Override
109109
  protected String getHeaderKey() {
110
    return STR."\{PREFIX}.header";
110
    return format( "%s%s", PREFIX, ".header" );
111111
  }
112112
...
134134
    final var comboBox = new ComboBox<UnixOsCommand>();
135135
    final var items = comboBox.getItems();
136
    final var prefix = STR."\{PREFIX}.command";
137
    final var distros = getInt( STR."\{prefix}.distros", 14 );
136
    final var prefix = format( "%s%s", PREFIX, ".command" );
137
    final var distros = getInt( format( "%s%s", prefix, ".distros" ), 14 );
138138
139139
    for( int i = 1; i <= distros; i++ ) {
140140
      final var suffix = format( ".%02d", i );
141
      final var name = get( STR."\{prefix}.os.name\{suffix}" );
142
      final var command = get( STR."\{prefix}.os.text\{suffix}" );
141
      final var name = get( format( "%s.os.name%s", prefix, suffix ) );
142
      final var command = get( format( "%s.os.text%s", prefix, suffix ) );
143143
144144
      items.add( new UnixOsCommand( name, command ) );
M src/main/java/com/keenwrite/typesetting/installer/panes/WindowsManagerInstallPane.java
4141
4242
    final var titledPane = titledPane( "Output", mCommands );
43
    append( mCommands, get( STR."\{PREFIX}.status.running" ) );
43
    append( mCommands, get( String.format( "%s%s", PREFIX, ".status.running" ) ) );
4444
4545
    final var stepsPane = new VBox();
4646
    final var steps = stepsPane.getChildren();
47
    steps.add( label( STR."\{PREFIX}.step.0" ) );
47
    steps.add( label( String.format( "%s%s", PREFIX, ".step.0" ) ) );
4848
    steps.add( spacer() );
49
    steps.add( label( STR."\{PREFIX}.step.1" ) );
50
    steps.add( label( STR."\{PREFIX}.step.2" ) );
51
    steps.add( label( STR."\{PREFIX}.step.3" ) );
49
    steps.add( label( String.format( "%s%s", PREFIX, ".step.1" ) ) );
50
    steps.add( label( String.format( "%s%s", PREFIX, ".step.2" ) ) );
51
    steps.add( label( String.format( "%s%s", PREFIX, ".step.3" ) ) );
5252
    steps.add( spacer() );
5353
    steps.add( titledPane );
...
7272
7373
    final var binary = properties.get( WIN_BIN );
74
    final var key = STR."\{PREFIX}.status";
74
    final var key = String.format( "%s%s", PREFIX, ".status" );
7575
7676
    if( binary instanceof File exe ) {
7777
      final var task = createTask( () -> {
7878
        final var exit = mContainer.install( exe );
7979
8080
        // Remove the installer after installation is finished.
8181
        properties.remove( thread );
8282
8383
        final var msg = exit == 0
84
          ? get( STR."\{key}.success" )
85
          : get( STR."\{key}.failure", exit );
84
          ? get( String.format( "%s%s", key, ".success" ) )
85
          : get( String.format( "%s%s", key, ".failure" ), exit );
8686
8787
        append( mCommands, msg );
...
9696
    }
9797
    else {
98
      append( mCommands, get( STR."\{PREFIX}.unknown", binary ) );
98
      append( mCommands, get( String.format( "%s%s", PREFIX, ".unknown" ), binary ) );
9999
    }
100100
  }
101101
102102
  @Override
103103
  public String getHeaderKey() {
104
    return STR."\{PREFIX}.header";
104
    return String.format( "%s%s", PREFIX, ".header" );
105105
  }
106106
}
M src/main/java/com/keenwrite/ui/actions/Action.java
4848
     */
4949
    public Builder setId( final String id ) {
50
      final var prefix = STR."\{ACTION_PREFIX}\{id}.";
51
      final var text = STR."\{prefix}text";
52
      final var icon = STR."\{prefix}icon";
53
      final var accelerator = STR."\{prefix}accelerator";
50
      final var prefix = String.format( "%s%s.", ACTION_PREFIX, id );
51
      final var text = String.format( "%s%s", prefix, "text" );
52
      final var icon = String.format( "%s%s", prefix, "icon" );
53
      final var accelerator = String.format( "%s%s", prefix, "accelerator" );
5454
      final var builder = setText( text ).setIcon( icon );
5555
...
172172
173173
    if( mAccelerator != null ) {
174
      tooltip += STR." (\{mAccelerator.getDisplayText()}\{')'}";
174
      tooltip += String.format( " (%s)", mAccelerator.getDisplayText() );
175175
    }
176176
M src/main/java/com/keenwrite/ui/actions/GuiCommands.java
604604
    final var alert = new Alert( INFORMATION );
605605
    final var prefix = "Dialog.about.";
606
    alert.setTitle( get( STR."\{prefix}title", APP_TITLE ) );
607
    alert.setHeaderText( get( STR."\{prefix}header", APP_TITLE ) );
608
    alert.setContentText( get( STR."\{prefix}content",
606
    alert.setTitle( get( String.format( "%s%s", prefix, "title" ), APP_TITLE ) );
607
    alert.setHeaderText( get( String.format( "%s%s", prefix, "header" ), APP_TITLE ) );
608
    alert.setContentText( get( String.format( "%s%s", prefix, "content" ),
609609
                               APP_YEAR,
610610
                               APP_VERSION ) );
M src/main/java/com/keenwrite/ui/dialogs/ExportDialog.java
326326
327327
  private Label createLabel( final String key ) {
328
    final var label = new Label( STR."\{get( key )}:" );
328
    final var label = new Label( String.format( "%s%s", get( key ), ":" ) );
329329
    final var font = label.getFont();
330330
    final var upscale = new Font( font.getName(), 14 );
M src/main/java/com/keenwrite/ui/dialogs/HyperlinkDialog.java
2626
   */
2727
  public HyperlinkDialog( final Window owner, final HyperlinkModel model ) {
28
    super( owner, STR."\{PREFIX}title" );
28
    super( owner, String.format( "%s%s", PREFIX, "title" ) );
2929
3030
    mModel = model;
...
3737
    addInputField(
3838
      "text",
39
      STR."\{PREFIX}label.text", STR."\{PREFIX}prompt.text",
39
      String.format( "%s%s", PREFIX, "label.text" ), String.format( "%s%s", PREFIX, "prompt.text" ),
4040
      mModel.getText(),
4141
      ( _, _, n ) -> mModel.setText( n )
4242
    );
4343
    addInputField(
4444
      "url",
45
      STR."\{PREFIX}label.url", STR."\{PREFIX}prompt.url",
45
      String.format( "%s%s", PREFIX, "label.url" ), String.format( "%s%s", PREFIX, "prompt.url" ),
4646
      mModel.getUrl(),
4747
      ( _, _, n ) -> mModel.setUrl( n )
4848
    );
4949
    addInputField(
5050
      "title",
51
      STR."\{PREFIX}label.title", STR."\{PREFIX}prompt.title",
51
      String.format( "%s%s", PREFIX, "label.title" ), String.format( "%s%s", PREFIX, "prompt.title" ),
5252
      mModel.getTitle(),
5353
      ( _, _, n ) -> mModel.setTitle( n )
M src/main/java/com/keenwrite/ui/dialogs/ImageDialog.java
1717
1818
  public ImageDialog( final Window owner, final ImageModel model ) {
19
    super( owner, STR."\{PREFIX}title" );
19
    super( owner, String.format( "%s%s", PREFIX, "title" ) );
2020
2121
    mModel = model;
...
2828
    addInputField(
2929
      "url",
30
      STR."\{PREFIX}label.url", STR."\{PREFIX}prompt.url",
30
      String.format( "%s%s", PREFIX, "label.url" ),
31
      String.format( "%s%s", PREFIX, "prompt.url" ),
3132
      mModel.getUrl(),
3233
      ( _, _, n ) -> mModel.setUrl( n )
3334
    );
3435
    addInputField(
3536
      "text",
36
      STR."\{PREFIX}label.text", STR."\{PREFIX}prompt.text",
37
      String.format( "%s%s", PREFIX, "label.text" ),
38
      String.format( "%s%s", PREFIX, "prompt.text" ),
3739
      mModel.getText(),
3840
      ( _, _, n ) -> mModel.setText( n )
3941
    );
4042
    addInputField(
4143
      "title",
42
      STR."\{PREFIX}label.title", STR."\{PREFIX}prompt.title",
44
      String.format( "%s%s", PREFIX, "label.title" ),
45
      String.format( "%s%s", PREFIX, "prompt.title" ),
4346
      mModel.getTitle(),
4447
      ( _, _, n ) -> mModel.setTitle( n )
M src/main/java/com/keenwrite/ui/dialogs/OpenUrlDialog.java
2222
  private static final String PREFIX = "Dialog.open_url.";
2323
  private static final String DOWNLOAD = "Main.status.url.request.";
24
  private static final String STATUS = STR."\{DOWNLOAD}status.";
24
  private static final String STATUS = String.format(
25
    "%s%s", DOWNLOAD, "status."
26
  );
2527
2628
  private final Path mParent;
...
3436
   */
3537
  public OpenUrlDialog( final Window owner, final Path parent ) {
36
    super( owner, STR."\{PREFIX}title" );
38
    super( owner, String.format( "%s%s", PREFIX, "title" ) );
3739
3840
    mParent = parent;
...
4547
    addInputField(
4648
      "url",
47
      STR."\{PREFIX}label.url", STR."\{PREFIX}prompt.url",
49
      String.format( "%s%s", PREFIX, "label.url" ),
50
      String.format( "%s%s", PREFIX, "prompt.url" ),
4851
      mUrl,
4952
      ( _, _, n ) -> mUrl = sanitize( n )
...
5861
  private File download( final String reference ) {
5962
    try {
60
      clue( STR."\{DOWNLOAD}fetch", reference );
63
      clue( String.format( "%s%s", DOWNLOAD, "fetch" ), reference );
6164
6265
      final var uri = new URI( reference );
6366
      final var path = toFile( uri );
6467
      final var basedir = path.getName();
6568
      final var file = mParent.resolve( basedir ).toFile();
6669
6770
      if( file.exists() ) {
68
        clue( STR."\{DOWNLOAD}exists", file );
71
        clue( String.format( "%s%s", DOWNLOAD, "exists" ), file );
6972
      }
7073
      else {
7174
        final var task = downloadAsync( uri, file, ( progress, bytes ) -> {
7275
          final var suffix = progress < 0 ? "bytes" : "progress";
7376
74
          clue( STR."\{STATUS}\{suffix}", progress, bytes );
77
          clue( String.format( "%s%s", STATUS, suffix ), progress, bytes );
7578
        } );
7679
7780
        task.setOnSucceeded( _ -> {
78
          clue( STR."\{DOWNLOAD}success", file );
81
          clue( String.format( "%s%s", DOWNLOAD, "success" ), file );
7982
8083
          // Only after the download succeeds can we open the file.
8184
          FileOpenEvent.fire( file.toURI() );
8285
        } );
83
        task.setOnFailed( _ -> clue( STR."\{DOWNLOAD}failure", uri ) );
86
        task.setOnFailed( _ -> clue(
87
          String.format( "%s%s", DOWNLOAD, "failure" ), uri )
88
        );
8489
      }
8590
M src/main/java/com/keenwrite/ui/models/HyperlinkModel.java
66
77
import com.vladsch.flexmark.ast.Link;
8
import org.renjin.gnur.format;
89
910
/**
...
5556
  public String toString() {
5657
    final String format = hasText()
57
      ? STR."[%s]\{hasTitle() ? "(%s \"%s\")" : "(%s%s)"}"
58
      ? "[%s]" + (hasTitle() ? "(%s \"%s\")" : "(%s%s)")
5859
      : "%s%s%s";
5960
M src/main/java/com/keenwrite/ui/models/ImageModel.java
55
package com.keenwrite.ui.models;
66
7
import org.renjin.gnur.format;
8
79
/**
810
 * Represents the model for an image: text, url, and title.
...
2830
  public String toString() {
2931
    final String format = hasText()
30
      ? STR."![%s]\{hasTitle() ? "(%s \"%s\")" : "(%s%s)"}"
32
      ? "![%s]" + (hasTitle() ? "(%s \"%s\")" : "(%s%s)")
3133
      : "![%s](%s)%s";
3234
M src/main/java/com/keenwrite/util/FileWalker.java
77
import java.util.function.Consumer;
88
9
import static java.lang.String.format;
910
import static java.nio.file.FileSystems.getDefault;
1011
...
2930
    final Path path, final String glob, final Consumer<Path> c )
3031
    throws IOException {
31
    final var matcher = getDefault().getPathMatcher( STR."glob:\{glob}" );
32
    final var pattern = format( "glob:%s", glob );
33
    final var matcher = getDefault().getPathMatcher( pattern );
3234
3335
    try( final var walk = Files.walk( path, 10 ) ) {
M src/test/java/com/keenwrite/io/MediaTypeSnifferTest.java
2121
    final var dir = pkgName.replace( '.', '/' );
2222
23
    final var urls = clazz.getClassLoader().getResources( STR."\{dir}/images" );
23
    final var urls = clazz.getClassLoader().getResources( String.format( "%s%s", dir, "/images" ) );
2424
    assertTrue( urls.hasMoreElements() );
2525
...
3434
        final var actualExtension = valueFrom( media ).getExtension();
3535
        final var expectedExtension = getExtension( image.toString() );
36
        System.out.println( STR."\{image} -> \{media}" );
36
        System.out.println( String.format( "%s%s", image, " -> \{media}" ) );
3737
3838
        assertEquals( expectedExtension, actualExtension );
M src/test/java/com/keenwrite/processors/markdown/extensions/images/ImageLinkExtensionTest.java
3232
  private static final String URI_FILE = "kitten";
3333
  private static final String URI_PATH = UIR_DIR + '/' + URI_FILE;
34
  private static final String PATH_KITTEN_PNG = STR."\{URI_PATH}.png";
35
  private static final String PATH_KITTEN_JPG = STR."\{URI_PATH}.jpg";
34
  private static final String PATH_KITTEN_PNG = String.format(
35
    "%s%s", URI_PATH, ".png" );
36
  private static final String PATH_KITTEN_JPG = String.format(
37
    "%s%s", URI_PATH, ".jpg" );
3638
37
  /** Web server that doles out images. */
39
  /**
40
   * Web server that doles out images.
41
   */
3842
  private static final String PLACEHOLDER = "loremflickr.com";
3943
4044
  private static final Map<String, String> IMAGES = new LinkedHashMap<>();
4145
4246
  static {
4347
    add( PATH_KITTEN_PNG, URI_PATH );
4448
    add( PATH_KITTEN_PNG, URI_FILE );
4549
    add( PATH_KITTEN_PNG, PATH_KITTEN_PNG );
4650
    add( PATH_KITTEN_JPG, PATH_KITTEN_JPG );
47
    add( STR."//\{PLACEHOLDER}/200/200", STR."//\{PLACEHOLDER}/200/200" );
48
    add( STR."ftp://\{PLACEHOLDER}/200/200",  STR."ftp://\{PLACEHOLDER}/200/200" );
49
    add( STR."http://\{PLACEHOLDER}/200/200", STR."http://\{PLACEHOLDER}/200/200" );
50
    add( STR."https://\{PLACEHOLDER}/200/200", STR."https://\{PLACEHOLDER}/200/200" );
51
    add( format( "//%s/200/200", PLACEHOLDER ),
52
         format( "//%s/200/200", PLACEHOLDER ) );
53
    add( format( "ftp://%s/200/200", PLACEHOLDER ),
54
         format( "ftp://%s/200/200", PLACEHOLDER ) );
55
    add( format( "http://%s/200/200", PLACEHOLDER ),
56
         format( "http://%s/200/200", PLACEHOLDER ) );
57
    add( format( "https://%s/200/200", PLACEHOLDER ),
58
         format( "https://%s/200/200", PLACEHOLDER ) );
5159
  }
5260