1
0
mirror of https://github.com/octoleo/plantuml.git synced 2024-11-28 15:56:31 +00:00

Add a new !pragma svginterface to control INTERACTIVE mode on SVG output

This commit is contained in:
Martin Ross 2022-02-16 12:39:48 -05:00
parent 2ca7dca0e3
commit 9c79c1256c
5 changed files with 36 additions and 45 deletions

View File

@ -43,10 +43,7 @@ import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.EmptyImageBuilder;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.SpriteContainerEmpty;
import net.sourceforge.plantuml.*;
import net.sourceforge.plantuml.api.ImageDataSimple;
import net.sourceforge.plantuml.core.ImageData;
import net.sourceforge.plantuml.cucadiagram.Display;
@ -90,7 +87,7 @@ public class GraphicsSudoku {
public ImageData writeImageSvg(OutputStream os) throws IOException {
final UGraphicSvg ug = new UGraphicSvg(HColorUtils.WHITE, true, new Dimension2DDouble(0, 0),
new ColorMapperIdentity(), false, 1.0, null, null, 0, "none", FileFormat.SVG.getDefaultStringBounder(),
LengthAdjust.defaultValue());
LengthAdjust.defaultValue(), new Pragma());
drawInternal(ug);
ug.writeToStream(os, null, -1); // dpi param is not used
return ImageDataSimple.ok();

View File

@ -62,6 +62,7 @@ import javax.xml.transform.TransformerException;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import net.sourceforge.plantuml.Pragma;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Comment;
import org.w3c.dom.Document;
@ -129,7 +130,8 @@ public class SvgGraphics {
private final boolean svgDimensionStyle;
private final LengthAdjust lengthAdjust;
private final boolean INTERACTIVE = false;
private final Pragma pragma;
private final boolean INTERACTIVE;
final protected void ensureVisible(double x, double y) {
if (x > maxX) {
@ -141,7 +143,7 @@ public class SvgGraphics {
}
public SvgGraphics(String backcolor, boolean svgDimensionStyle, Dimension2D minDim, double scale, String hover,
long seed, String preserveAspectRatio, LengthAdjust lengthAdjust, DarkStrategy darkStrategy) {
long seed, String preserveAspectRatio, LengthAdjust lengthAdjust, DarkStrategy darkStrategy, Pragma pragma) {
try {
this.lengthAdjust = lengthAdjust;
this.svgDimensionStyle = svgDimensionStyle;
@ -149,6 +151,7 @@ public class SvgGraphics {
this.document = getDocument();
this.backcolor = backcolor;
this.preserveAspectRatio = preserveAspectRatio;
this.pragma = pragma;
ensureVisible(minDim.getWidth(), minDim.getHeight());
this.root = getRootNode();
@ -164,6 +167,12 @@ public class SvgGraphics {
if (hover != null)
defs.appendChild(getPathHover(hover));
if (!pragma.isDefine("svginteractive"))
INTERACTIVE = false;
else {
INTERACTIVE = Boolean.valueOf(pragma.getValue("svginteractive"));
}
if (INTERACTIVE) {
final Element styles = getStylesForInteractiveMode();
if (styles != null)

View File

@ -54,6 +54,7 @@ import java.util.Set;
import javax.xml.transform.TransformerException;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.Pragma;
import net.sourceforge.plantuml.graphic.FontConfiguration;
import net.sourceforge.plantuml.graphic.UDrawable;
import net.sourceforge.plantuml.security.SImageIO;
@ -159,7 +160,7 @@ public class FontChecker {
private String getSvgImage(char c) throws IOException, TransformerException {
final SvgGraphics svg = new SvgGraphics(null, true, new Dimension2DDouble(0, 0), 1.0, null, 42, "none",
LengthAdjust.defaultValue(), DarkStrategy.IGNORE_DARK_COLOR);
LengthAdjust.defaultValue(), DarkStrategy.IGNORE_DARK_COLOR, new Pragma());
svg.setStrokeColor("black");
svg.svgImage(getBufferedImage(c), 0, 0);
final ByteArrayOutputStream os = new ByteArrayOutputStream();

View File

@ -51,24 +51,7 @@ import java.util.Set;
import javax.swing.ImageIcon;
import net.sourceforge.plantuml.AnimatedGifEncoder;
import net.sourceforge.plantuml.AnnotatedWorker;
import net.sourceforge.plantuml.CMapData;
import net.sourceforge.plantuml.ColorParam;
import net.sourceforge.plantuml.CornerParam;
import net.sourceforge.plantuml.Dimension2DDouble;
import net.sourceforge.plantuml.EmptyImageBuilder;
import net.sourceforge.plantuml.FileFormat;
import net.sourceforge.plantuml.FileFormatOption;
import net.sourceforge.plantuml.FileUtils;
import net.sourceforge.plantuml.ISkinParam;
import net.sourceforge.plantuml.LineParam;
import net.sourceforge.plantuml.OptionFlags;
import net.sourceforge.plantuml.Scale;
import net.sourceforge.plantuml.SvgCharSizeHack;
import net.sourceforge.plantuml.TitledDiagram;
import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.UseStyle;
import net.sourceforge.plantuml.*;
import net.sourceforge.plantuml.anim.AffineTransformation;
import net.sourceforge.plantuml.anim.Animation;
import net.sourceforge.plantuml.api.ImageDataComplex;
@ -272,7 +255,7 @@ public class ImageBuilder {
/ 96.0;
if (scaleFactor <= 0)
throw new IllegalStateException("Bad scaleFactor");
UGraphic ug = createUGraphic(fileFormatOption, dim, animationArg, dx, dy, scaleFactor);
UGraphic ug = createUGraphic(fileFormatOption, dim, animationArg, dx, dy, scaleFactor, titledDiagram.getPragma());
maybeDrawBorder(ug, dim);
if (randomPixel) {
drawRandomPoint(ug);
@ -401,12 +384,12 @@ public class ImageBuilder {
}
private UGraphic createUGraphic(FileFormatOption option, final Dimension2D dim, Animation animationArg, double dx,
double dy, double scaleFactor) {
double dy, double scaleFactor, Pragma pragma) {
switch (option.getFileFormat()) {
case PNG:
return createUGraphicPNG(scaleFactor, dim, animationArg, dx, dy, option.getWatermark());
case SVG:
return createUGraphicSVG(scaleFactor, dim);
return createUGraphicSVG(scaleFactor, dim, pragma);
case EPS:
return new UGraphicEps(backcolor, colorMapper, stringBounder, EpsStrategy.getDefault2());
case EPS_TEXT:
@ -432,14 +415,14 @@ public class ImageBuilder {
}
}
private UGraphic createUGraphicSVG(double scaleFactor, Dimension2D dim) {
private UGraphic createUGraphicSVG(double scaleFactor, Dimension2D dim, Pragma pragma) {
final String hoverPathColorRGB = getHoverPathColorRGB();
final LengthAdjust lengthAdjust = skinParam == null ? LengthAdjust.defaultValue() : skinParam.getlengthAdjust();
final String preserveAspectRatio = getPreserveAspectRatio();
final boolean svgDimensionStyle = skinParam == null || skinParam.svgDimensionStyle();
final String svgLinkTarget = getSvgLinkTarget();
final UGraphicSvg ug = new UGraphicSvg(backcolor, svgDimensionStyle, dim, colorMapper, false, scaleFactor,
svgLinkTarget, hoverPathColorRGB, seed, preserveAspectRatio, stringBounder, lengthAdjust);
svgLinkTarget, hoverPathColorRGB, seed, preserveAspectRatio, stringBounder, lengthAdjust, pragma);
return ug;
}

View File

@ -41,6 +41,7 @@ import java.util.Map;
import javax.xml.transform.TransformerException;
import net.sourceforge.plantuml.Pragma;
import net.sourceforge.plantuml.Url;
import net.sourceforge.plantuml.graphic.StringBounder;
import net.sourceforge.plantuml.posimo.DotPath;
@ -89,10 +90,10 @@ public class UGraphicSvg extends AbstractUGraphic<SvgGraphics> implements ClipCo
public UGraphicSvg(HColor defaultBackground, boolean svgDimensionStyle, Dimension2D minDim, ColorMapper colorMapper,
boolean textAsPath, double scale, String linkTarget, String hover, long seed, String preserveAspectRatio,
StringBounder stringBounder, LengthAdjust lengthAdjust) {
StringBounder stringBounder, LengthAdjust lengthAdjust, Pragma pragma) {
this(defaultBackground, minDim, colorMapper,
new SvgGraphics(colorMapper.toSvg(defaultBackground), svgDimensionStyle, minDim, scale, hover, seed,
preserveAspectRatio, lengthAdjust, DarkStrategy.IGNORE_DARK_COLOR),
preserveAspectRatio, lengthAdjust, DarkStrategy.IGNORE_DARK_COLOR, pragma),
textAsPath, linkTarget, stringBounder);
if (defaultBackground instanceof HColorGradient) {
final SvgGraphics svg = getGraphicObject();