SequenceDiagram/web/scripts/interface/URLExporter.mjs

68 lines
1.2 KiB
JavaScript

function toCappedFixed(v, cap) {
const s = v.toString();
const p = s.indexOf('.');
if(p === -1 || s.length - p - 1 <= cap) {
return s;
}
return v.toFixed(cap);
}
function valid(v = null) {
return v !== null && !Number.isNaN(v);
}
export default class URLExporter {
constructor(base = '') {
this.base = base;
}
setBase(base) {
this.base = base;
}
_convertCode(code) {
return code
.split('\n')
.map(encodeURIComponent)
.filter((ln) => ln !== '')
.join('/');
}
_convertWidthHeight(width, height) {
let opts = '';
if(valid(width)) {
opts += 'w' + toCappedFixed(Math.max(width, 0), 4);
}
if(valid(height)) {
opts += 'h' + toCappedFixed(Math.max(height, 0), 4);
}
return opts + '/';
}
_convertZoom(zoom) {
if(zoom === 1) {
return '';
}
return 'z' + toCappedFixed(Math.max(zoom, 0), 4) + '/';
}
_convertSize({height, width, zoom}) {
if(valid(width) || valid(height)) {
return this._convertWidthHeight(width, height);
}
if(valid(zoom)) {
return this._convertZoom(zoom);
}
return '';
}
getURL(code, size = {}) {
return (
this.base +
this._convertSize(size) +
this._convertCode(code) +
'.svg'
);
}
}