2024-05-05 21:25:12 +00:00
|
|
|
<div style="width: 100%; margin: 0 auto;">
|
|
|
|
<style>
|
|
|
|
.graph {
|
|
|
|
background-color: transparent;
|
|
|
|
padding: 20px;
|
|
|
|
border-radius: 10px;
|
|
|
|
display: flex;
|
|
|
|
justify-content: center;
|
|
|
|
align-items: center;
|
|
|
|
height: 100%;
|
|
|
|
}
|
|
|
|
#svg-container {
|
|
|
|
border: 1px solid black;
|
|
|
|
display: inline-block;
|
|
|
|
}
|
|
|
|
#controls {
|
|
|
|
margin-top: 10px;
|
|
|
|
}
|
|
|
|
</style>
|
|
|
|
<div id="controls">
|
|
|
|
<button id="zoom-in">Zoom In</button>
|
|
|
|
<button id="zoom-out">Zoom Out</button>
|
|
|
|
<button id="save-svg">Save</button>
|
|
|
|
<button id="save-png">Save as PNG</button>
|
|
|
|
</div>
|
|
|
|
<div id="svg-container">
|
|
|
|
<div id="graph" class="graph"></div>
|
|
|
|
</div>
|
|
|
|
|
|
|
|
<script src="https://github.com/mdaines/viz-js/releases/download/release-viz-3.2.4/viz-standalone.js"></script>
|
|
|
|
<script>
|
|
|
|
// Initialize the mermaid library and render our diagram
|
|
|
|
Viz.instance().then(function(viz) {
|
|
|
|
var svg = viz.renderSVGElement(`
|
|
|
|
{{svg_data}}
|
|
|
|
`);
|
|
|
|
svg.setAttribute("id", "svg-viewer"); // Ensure your SVG has the correct ID
|
|
|
|
document.getElementById("graph").appendChild(svg);
|
|
|
|
});
|
|
|
|
document.getElementById('zoom-in').addEventListener('click', function() {
|
|
|
|
zoomSVG(1.1); // Zoom in by 10%
|
|
|
|
});
|
|
|
|
|
|
|
|
document.getElementById('zoom-out').addEventListener('click', function() {
|
|
|
|
zoomSVG(0.9); // Zoom out by 10%
|
|
|
|
});
|
|
|
|
|
|
|
|
document.getElementById('save-svg').addEventListener('click', function() {
|
|
|
|
saveSVG();
|
|
|
|
});
|
|
|
|
|
|
|
|
function zoomSVG(factor) {
|
|
|
|
var svg = document.getElementById('svg-viewer');
|
2024-05-05 21:27:27 +00:00
|
|
|
// Get current width and height as integers
|
|
|
|
var currentWidth = parseInt(svg.getAttribute("width"), 10);
|
|
|
|
var currentHeight = parseInt(svg.getAttribute("height"), 10);
|
|
|
|
|
|
|
|
// Check if currentWidth and currentHeight are numbers. If not, log an error or set a default value.
|
|
|
|
if (isNaN(currentWidth) || isNaN(currentHeight)) {
|
|
|
|
console.error("Error: Current width or height of the SVG is not a valid number.");
|
|
|
|
// Optionally, set default values or return to avoid further execution
|
|
|
|
// currentWidth = 100; // Example default value
|
|
|
|
// currentHeight = 100; // Example default value
|
|
|
|
return; // Exit the function if values are not valid numbers
|
|
|
|
}
|
|
|
|
|
|
|
|
// Calculate new width and height by applying the zoom factor and rounding the result
|
|
|
|
var newWidth = Math.round(currentWidth * factor);
|
|
|
|
var newHeight = Math.round(currentHeight * factor);
|
|
|
|
|
|
|
|
// Set the new width and height on the SVG element
|
|
|
|
svg.setAttribute("width", newWidth);
|
|
|
|
svg.setAttribute("height", newHeight);
|
2024-05-05 21:25:12 +00:00
|
|
|
}
|
|
|
|
|
2024-05-05 21:27:27 +00:00
|
|
|
|
2024-05-05 21:25:12 +00:00
|
|
|
function saveSVG() {
|
|
|
|
var svg = document.getElementById('svg-viewer');
|
|
|
|
var serializer = new XMLSerializer();
|
|
|
|
var source = serializer.serializeToString(svg);
|
|
|
|
|
|
|
|
// Add name spaces.
|
|
|
|
if(!source.match(/^<svg[^>]+xmlns="http\:\/\/www\.w3\.org\/2000\/svg"/)){
|
|
|
|
source = source.replace(/^<svg/, '<svg xmlns="http://www.w3.org/2000/svg"');
|
|
|
|
}
|
|
|
|
if(!source.match(/^<svg[^>]+"http\:\/\/www\.w3\.org\/1999\/xlink"/)){
|
|
|
|
source = source.replace(/^<svg/, '<svg xmlns:xlink="http://www.w3.org/1999/xlink"');
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add xml declaration
|
|
|
|
source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
|
|
|
|
|
|
|
|
// Convert SVG source to URI data scheme.
|
|
|
|
var url = "data:image/svg+xml;charset=utf-8,"+encodeURIComponent(source);
|
|
|
|
|
|
|
|
// Create download link and click it to start download.
|
|
|
|
var downloadLink = document.createElement("a");
|
|
|
|
downloadLink.href = url;
|
|
|
|
downloadLink.download = "downloaded_svg.svg";
|
|
|
|
document.body.appendChild(downloadLink);
|
|
|
|
downloadLink.click();
|
|
|
|
document.body.removeChild(downloadLink);
|
|
|
|
}
|
|
|
|
document.getElementById('save-png').addEventListener('click', function() {
|
|
|
|
saveSVGAsPNG();
|
|
|
|
});
|
|
|
|
|
|
|
|
function saveSVGAsPNG() {
|
|
|
|
var svg = document.getElementById('svg-viewer');
|
|
|
|
var serializer = new XMLSerializer();
|
|
|
|
var source = serializer.serializeToString(svg);
|
|
|
|
|
|
|
|
// Fix potential namespace issues
|
|
|
|
if(!source.match(/^<svg[^>]+xmlns="http\:\/\/www\.w3\.org\/2000\/svg"/)){
|
|
|
|
source = source.replace(/^<svg/, '<svg xmlns="http://www.w3.org/2000/svg"');
|
|
|
|
}
|
|
|
|
if(!source.match(/^<svg[^>]+"http\:\/\/www\.w3\.org\/1999\/xlink"/)){
|
|
|
|
source = source.replace(/^<svg/, '<svg xmlns:xlink="http://www.w3.org/1999/xlink"');
|
|
|
|
}
|
|
|
|
source = '<?xml version="1.0" standalone="no"?>\r\n' + source;
|
|
|
|
|
|
|
|
// Convert SVG source to a data URL
|
|
|
|
var url = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(source);
|
|
|
|
|
|
|
|
// Create an Image to render the SVG
|
|
|
|
var img = new Image();
|
|
|
|
img.onload = function() {
|
|
|
|
// Once loaded, use the Image to render the SVG on a Canvas
|
|
|
|
var canvas = document.createElement('canvas');
|
|
|
|
canvas.width = img.width;
|
|
|
|
canvas.height = img.height;
|
|
|
|
var context = canvas.getContext('2d');
|
|
|
|
context.drawImage(img, 0, 0);
|
|
|
|
|
|
|
|
// Convert the Canvas to a data URL for PNG
|
|
|
|
var pngUrl = canvas.toDataURL("image/png");
|
|
|
|
|
|
|
|
// Create download link and click it to start download
|
|
|
|
var downloadLink = document.createElement("a");
|
|
|
|
downloadLink.href = pngUrl;
|
|
|
|
downloadLink.download = "downloaded_svg.png";
|
|
|
|
document.body.appendChild(downloadLink);
|
|
|
|
downloadLink.click();
|
|
|
|
document.body.removeChild(downloadLink);
|
|
|
|
};
|
|
|
|
img.src = url;
|
|
|
|
}
|
|
|
|
|
|
|
|
</script>
|
|
|
|
<div style="text-align: center;">
|
|
|
|
</div>
|
|
|
|
</div>
|