Dave Jarvis' Repositories

git clone https://repo.autonoma.ca/repo/keenwrite.git

Revises bracketed span node API

AuthorDaveJarvis <email>
Date2025-08-27 14:07:32 GMT-0700
Commitd3867737d1baa93e831b5367dc9297f436a9fa70
Parentabd6393
Delta24 lines added, 23 lines removed, 1-line increase
src/main/java/com/keenwrite/processors/markdown/extensions/spans/BracketedSpanNode.java
import org.jetbrains.annotations.NotNull;
+import java.util.List;
import java.util.Map;
public class BracketedSpanNode extends Node {
- private final String mClassName;
+ private final List<String> mClasses;
private final String mId;
private final Map<String, String> mAttributes;
private final BasedSequence mText;
public BracketedSpanNode(
- final String className,
- final String id,
+ final @NotNull List<String> classes,
+ final @NotNull String id,
final Map<String, String> attributes,
final BasedSequence text
) {
- this.mClassName = className;
+ this.mClasses = classes;
this.mId = id;
this.mAttributes = attributes;
html.raw( "<span" );
- if( mClassName != null ) {
- html.raw( " class=\"" ).raw( mClassName ).raw( "\"" );
+ if( !mClasses.isEmpty() ) {
+ html
+ .raw( " class=\"" )
+ .raw( String.join( " ", mClasses ) )
+ .raw( "\"" );
}
- if( mId != null ) {
+ if( !mId.isBlank() ) {
html.raw( " id=\"" ).raw( mId ).raw( "\"" );
}
src/main/java/com/keenwrite/processors/markdown/extensions/spans/BracketedSpanParser.java
import org.jetbrains.annotations.NotNull;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
import java.util.regex.Pattern;
public class BracketedSpanParser implements InlineParserExtension {
private static final Pattern ATTR_PATTERN = Pattern.compile(
- "(?:\\.([\\w-]+))|" +
- "(?:#([\\w-]+))|" +
+ "\\.([\\w-]+)|" +
+ "#([\\w-]+)|" +
"(\\w+)=\"((?:\\\\\"|[^\"])*)\""
);
final var content = input.subSequence( index + 1, closingBracket );
final var span = getBracketedSpan(
- input, braceStart, braceEnd,
- content
+ input, braceStart, braceEnd, content
);
final BasedSequence content
) {
- final var attrText =
- input.subSequence( braceStart + 1, braceEnd ).toString();
+ final var attrSeq = input.subSequence( braceStart + 1, braceEnd );
final var attrs = new HashMap<String, String>();
final var classes = new ArrayList<String>();
- String id = null;
+ String id = "";
- final var matcher = ATTR_PATTERN.matcher( attrText );
+ final var matcher = ATTR_PATTERN.matcher( attrSeq.toString() );
+
while( matcher.find() ) {
if( matcher.group( 1 ) != null ) {
classes.add( matcher.group( 1 ) );
}
else if( matcher.group( 2 ) != null ) {
id = matcher.group( 2 );
}
else if( matcher.group( 3 ) != null && matcher.group( 4 ) != null ) {
final var key = matcher.group( 3 );
- final var rawValue = matcher.group( 4 ).replace( "\\\"", "\"" );
- attrs.put( key, rawValue );
+ final var value = matcher.group( 4 ).replace( "\\\"", "\"" );
+
+ attrs.put( key, value );
}
}
- final var className = classes.isEmpty() ? null : String.join(
- " ",
- classes
- );
- return new BracketedSpanNode( className, id, attrs, content );
+ return new BracketedSpanNode( classes, id, attrs, content );
}