SvgAttributes.java
package pro.verron.asciidoc.converters.svg;
import org.jspecify.annotations.NonNull;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import static pro.verron.asciidoc.converters.svg.SvgAttribute.NONE;
import static pro.verron.asciidoc.converters.svg.SvgAttribute.attr;
/// An ordered, deduplicated collection of [SvgAttribute] instances.
///
/// [SvgAttribute#NONE] attributes are silently ignored when added. Attributes
/// are sorted by name to produce deterministic SVG output.
public class SvgAttributes
implements Iterable<SvgAttribute> {
SortedSet<SvgAttribute> set = new TreeSet<>();
/// Constructs an attribute set from the given attributes.
///
/// @param attributes initial attributes (none-values are ignored)
public SvgAttributes(SvgAttribute... attributes) {
addAll(attributes);
}
private void addAll(SvgAttribute[] attributes) {
for (SvgAttribute attr : attributes) {
if (!NONE.equals(attr)) {
set.add(attr);
}
}
}
@Override
public @NonNull Iterator<SvgAttribute> iterator() {
return set.iterator();
}
/// Adds an attribute with the given name and value.
///
/// @param name attribute name
/// @param value attribute value
public void add(String name, String value) {
set.add(attr(name, value));
}
/// Adds all attributes from another [SvgAttributes] instance.
///
/// @param opts attributes to add
public void addAll(SvgAttributes opts) {
addAll(opts.set);
}
private void addAll(Iterable<SvgAttribute> attributes) {
for (SvgAttribute attr : attributes) {
if (!NONE.equals(attr)) {
set.add(attr);
}
}
}
}