From ffd3ae5c321d3d2837fc4009b9ea27430484be53 Mon Sep 17 00:00:00 2001 From: Haug Juergen Date: Thu, 13 Apr 2023 14:14:18 +0200 Subject: [PATCH 1/3] Improved svg links - do not open external links --- .../plantuml/eclipse/svg/PlantUmlSvgView.java | 269 +++++++++--------- 1 file changed, 136 insertions(+), 133 deletions(-) diff --git a/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/PlantUmlSvgView.java b/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/PlantUmlSvgView.java index 08e866671..f18fbf66e 100644 --- a/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/PlantUmlSvgView.java +++ b/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/PlantUmlSvgView.java @@ -1,133 +1,136 @@ -package net.sourceforge.plantuml.eclipse.svg; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.jface.action.Action; -import org.eclipse.jface.action.IContributionManager; -import org.eclipse.jface.preference.IPreferenceStore; -import org.eclipse.jface.resource.ImageDescriptor; -import org.eclipse.swt.SWT; -import org.eclipse.swt.browser.Browser; -import org.eclipse.swt.browser.LocationEvent; -import org.eclipse.swt.browser.LocationListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.PlatformUI; -import org.eclipse.ui.browser.IWebBrowser; -import org.eclipse.ui.browser.IWorkbenchBrowserSupport; - -import net.sourceforge.plantuml.eclipse.Activator; -import net.sourceforge.plantuml.eclipse.imagecontrol.ILinkSupport; -import net.sourceforge.plantuml.eclipse.views.AbstractPlantUmlView; -import net.sourceforge.plantuml.util.DiagramData; - -public class PlantUmlSvgView extends AbstractPlantUmlView implements ILinkSupport { - - private Browser browser; - - private Svg2HtmlConverter svg2HtmlConverter; - - @Override - protected void createDiagramControl(final Composite parent) { - final GridLayout layout = new GridLayout(); - layout.marginWidth = 0; - layout.marginHeight = 0; - parent.setLayout(layout); - browser = new Browser(parent, SWT.NONE); - browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); - browser.setJavascriptEnabled(true); - browser.addLocationListener(new LocationListener() { - @Override - public void changing(final LocationEvent event) { - openLink(event.location); - } - - @Override - public void changed(final LocationEvent event) { - } - }); - svg2HtmlConverter = new SvgMustache2HtmlConverter(); - } - - @Override - public void dispose() { - browser = null; - super.dispose(); - } - - /** - * Passing the focus request to the viewer's control. - */ - @Override - public void setFocus() { - if (isValidControl(browser)) { - browser.setFocus(); - } - } - - protected void updateSvg2HtmlConverter() { - if (svg2HtmlConverter instanceof SvgMustache2HtmlConverter) { - final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); - final String templateUrlPreference = SvgPreferencePage.getTemplateUrlPreference(preferenceStore); - ((SvgMustache2HtmlConverter) svg2HtmlConverter).setTemplateUrl(templateUrlPreference); - } - } - - private String diagramHtml = null; - - @Override - protected void updateDiagram(final DiagramData diagramData, final IProgressMonitor monitor) { - final String svg = diagramData.getSvg(0); - updateSvg2HtmlConverter(); - this.diagramHtml = svg2HtmlConverter.convert2Html(svg); - setDiagramViewStatus(ViewStatus.DIAGRAM_VIEW_DATA, diagramHtml); - asyncExec(() -> { - if (isValidControl(browser) && shouldUpdateView(diagramData)) { - browser.setText(diagramHtml); - setDiagramViewStatus(ViewStatus.DIAGRAM_VIEW, diagramHtml); - } - }); - } - - @Override - public Object getLink(final int x, final int y) { - return null; - } - - // - - @Override - protected void addViewActions(final IContributionManager toolBarManager) { - super.addViewActions(toolBarManager); - addActions(toolBarManager, new Action("Open in external browser", ImageDescriptor.createFromFile(this.getClass(), "/icons/external_browser.png")) { - @Override - public void run() { - openInBrowser(true); - } - }); - } - - private final int browserStyle = IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR | IWorkbenchBrowserSupport.STATUS; - - protected void openInBrowser(final boolean external) { - if (this.diagramHtml != null) { - try { - final IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport(); - final IWebBrowser extBrowser = (external ? browserSupport.getExternalBrowser() - : browserSupport.createBrowser(browserStyle, toString(), getPartName(), getTitle())); - final Path tempFile = Files.createTempFile(getClass().getSimpleName(), ".html"); - Files.write(tempFile, this.diagramHtml.getBytes()); - extBrowser.openURL(tempFile.toUri().toURL()); - } catch (final PartInitException e) { - // couldn't open browser - } catch (final IOException e) { - // couldn't write to temp file - } - } - } -} +package net.sourceforge.plantuml.eclipse.svg; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jface.action.Action; +import org.eclipse.jface.action.IContributionManager; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.jface.resource.ImageDescriptor; +import org.eclipse.swt.SWT; +import org.eclipse.swt.browser.Browser; +import org.eclipse.swt.browser.LocationEvent; +import org.eclipse.swt.browser.LocationListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.ui.PartInitException; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.browser.IWebBrowser; +import org.eclipse.ui.browser.IWorkbenchBrowserSupport; + +import net.sourceforge.plantuml.eclipse.Activator; +import net.sourceforge.plantuml.eclipse.imagecontrol.ILinkSupport; +import net.sourceforge.plantuml.eclipse.views.AbstractPlantUmlView; +import net.sourceforge.plantuml.util.DiagramData; + +public class PlantUmlSvgView extends AbstractPlantUmlView implements ILinkSupport { + + private Browser browser; + + private Svg2HtmlConverter svg2HtmlConverter; + + @Override + protected void createDiagramControl(final Composite parent) { + final GridLayout layout = new GridLayout(); + layout.marginWidth = 0; + layout.marginHeight = 0; + parent.setLayout(layout); + browser = new Browser(parent, SWT.NONE); + browser.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true)); + browser.setJavascriptEnabled(true); + browser.addLocationListener(new LocationListener() { + @Override + public void changing(final LocationEvent event) { + openLink(event.location); + if(!"about:blank".equals(event.location)) { + event.doit = false; + } + } + + @Override + public void changed(final LocationEvent event) { + } + }); + svg2HtmlConverter = new SvgMustache2HtmlConverter(); + } + + @Override + public void dispose() { + browser = null; + super.dispose(); + } + + /** + * Passing the focus request to the viewer's control. + */ + @Override + public void setFocus() { + if (isValidControl(browser)) { + browser.setFocus(); + } + } + + protected void updateSvg2HtmlConverter() { + if (svg2HtmlConverter instanceof SvgMustache2HtmlConverter) { + final IPreferenceStore preferenceStore = Activator.getDefault().getPreferenceStore(); + final String templateUrlPreference = SvgPreferencePage.getTemplateUrlPreference(preferenceStore); + ((SvgMustache2HtmlConverter) svg2HtmlConverter).setTemplateUrl(templateUrlPreference); + } + } + + private String diagramHtml = null; + + @Override + protected void updateDiagram(final DiagramData diagramData, final IProgressMonitor monitor) { + final String svg = diagramData.getSvg(0); + updateSvg2HtmlConverter(); + this.diagramHtml = svg2HtmlConverter.convert2Html(svg); + setDiagramViewStatus(ViewStatus.DIAGRAM_VIEW_DATA, diagramHtml); + asyncExec(() -> { + if (isValidControl(browser) && shouldUpdateView(diagramData)) { + browser.setText(diagramHtml); + setDiagramViewStatus(ViewStatus.DIAGRAM_VIEW, diagramHtml); + } + }); + } + + @Override + public Object getLink(final int x, final int y) { + return null; + } + + // + + @Override + protected void addViewActions(final IContributionManager toolBarManager) { + super.addViewActions(toolBarManager); + addActions(toolBarManager, new Action("Open in external browser", ImageDescriptor.createFromFile(this.getClass(), "/icons/external_browser.png")) { + @Override + public void run() { + openInBrowser(true); + } + }); + } + + private final int browserStyle = IWorkbenchBrowserSupport.LOCATION_BAR | IWorkbenchBrowserSupport.NAVIGATION_BAR | IWorkbenchBrowserSupport.STATUS; + + protected void openInBrowser(final boolean external) { + if (this.diagramHtml != null) { + try { + final IWorkbenchBrowserSupport browserSupport = PlatformUI.getWorkbench().getBrowserSupport(); + final IWebBrowser extBrowser = (external ? browserSupport.getExternalBrowser() + : browserSupport.createBrowser(browserStyle, toString(), getPartName(), getTitle())); + final Path tempFile = Files.createTempFile(getClass().getSimpleName(), ".html"); + Files.write(tempFile, this.diagramHtml.getBytes()); + extBrowser.openURL(tempFile.toUri().toURL()); + } catch (final PartInitException e) { + // couldn't open browser + } catch (final IOException e) { + // couldn't write to temp file + } + } + } +} From 97debace50adb0bca8179dc406d01fc644b744f0 Mon Sep 17 00:00:00 2001 From: Haug Juergen Date: Thu, 13 Apr 2023 14:14:30 +0200 Subject: [PATCH 2/3] Minor improvements svg --- .../plantuml/eclipse/svg/AbstractSvg2HtmlConverter.java | 2 +- .../plantuml/eclipse/svg/SvgMustache2HtmlConverter.java | 2 +- .../templates/interactive-svg-template.mustache | 7 ++++++- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/AbstractSvg2HtmlConverter.java b/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/AbstractSvg2HtmlConverter.java index 985c593c8..64709da63 100644 --- a/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/AbstractSvg2HtmlConverter.java +++ b/bundles/net.sourceforge.plantuml.svg/src/net/sourceforge/plantuml/eclipse/svg/AbstractSvg2HtmlConverter.java @@ -5,7 +5,7 @@ public abstract class AbstractSvg2HtmlConverter implements Svg2HtmlConverter { protected AbstractSvg2HtmlConverter() { } - protected final String idAttrPrefix = " context = getTemplateContext(svg); final String converted = template.execute(context); - return converted; + return converted.replace("\r\n", "\n"); } catch (final Exception e) { return "" + e.getMessage() + ""; } diff --git a/bundles/net.sourceforge.plantuml.svg/templates/interactive-svg-template.mustache b/bundles/net.sourceforge.plantuml.svg/templates/interactive-svg-template.mustache index 95522525c..f047fab63 100644 --- a/bundles/net.sourceforge.plantuml.svg/templates/interactive-svg-template.mustache +++ b/bundles/net.sourceforge.plantuml.svg/templates/interactive-svg-template.mustache @@ -1,6 +1,11 @@ + - +