From fe17810c7d3872aad44b2ec29849c3e928a928b4 Mon Sep 17 00:00:00 2001
From: miha-q <>
Date: Sat, 3 Aug 2024 19:05:25 -0400
Subject: [PATCH] Sat Aug 3 07:05:25 PM EDT 2024
---
src/imports/dom-to-image.js | 769 +++++++++++++++++++++++++++++++++++
src/imports/istina-editor.js | 19 +-
src/imports/measure.png | Bin 0 -> 37362 bytes
src/{gui.html => index.html} | 389 +++++++++++++++---
src/src.zip | Bin 0 -> 125694 bytes
5 files changed, 1123 insertions(+), 54 deletions(-)
create mode 100644 src/imports/dom-to-image.js
create mode 100644 src/imports/measure.png
rename src/{gui.html => index.html} (68%)
create mode 100644 src/src.zip
diff --git a/src/imports/dom-to-image.js b/src/imports/dom-to-image.js
new file mode 100644
index 0000000..27201ac
--- /dev/null
+++ b/src/imports/dom-to-image.js
@@ -0,0 +1,769 @@
+(function (global) {
+ 'use strict';
+
+ var util = newUtil();
+ var inliner = newInliner();
+ var fontFaces = newFontFaces();
+ var images = newImages();
+
+ // Default impl options
+ var defaultOptions = {
+ // Default is to fail on error, no placeholder
+ imagePlaceholder: undefined,
+ // Default cache bust is false, it will use the cache
+ cacheBust: false
+ };
+
+ var domtoimage = {
+ toSvg: toSvg,
+ toPng: toPng,
+ toJpeg: toJpeg,
+ toBlob: toBlob,
+ toPixelData: toPixelData,
+ impl: {
+ fontFaces: fontFaces,
+ images: images,
+ util: util,
+ inliner: inliner,
+ options: {}
+ }
+ };
+
+ if (typeof module !== 'undefined')
+ module.exports = domtoimage;
+ else
+ global.domtoimage = domtoimage;
+
+
+ /**
+ * @param {Node} node - The DOM Node object to render
+ * @param {Object} options - Rendering options
+ * @param {Function} options.filter - Should return true if passed node should be included in the output
+ * (excluding node means excluding it's children as well). Not called on the root node.
+ * @param {String} options.bgcolor - color for the background, any valid CSS color value.
+ * @param {Number} options.width - width to be applied to node before rendering.
+ * @param {Number} options.height - height to be applied to node before rendering.
+ * @param {Object} options.style - an object whose properties to be copied to node's style before rendering.
+ * @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only),
+ defaults to 1.0.
+ * @param {String} options.imagePlaceholder - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch
+ * @param {Boolean} options.cacheBust - set to true to cache bust by appending the time to the request url
+ * @return {Promise} - A promise that is fulfilled with a SVG image data URL
+ * */
+ function toSvg(node, options) {
+ options = options || {};
+ copyOptions(options);
+ return Promise.resolve(node)
+ .then(function (node) {
+ return cloneNode(node, options.filter, true);
+ })
+ .then(embedFonts)
+ .then(inlineImages)
+ .then(applyOptions)
+ .then(function (clone) {
+ return makeSvgDataUri(clone,
+ options.width || util.width(node),
+ options.height || util.height(node)
+ );
+ });
+
+ function applyOptions(clone) {
+ if (options.bgcolor) clone.style.backgroundColor = options.bgcolor;
+
+ if (options.width) clone.style.width = options.width + 'px';
+ if (options.height) clone.style.height = options.height + 'px';
+
+ if (options.style)
+ Object.keys(options.style).forEach(function (property) {
+ clone.style[property] = options.style[property];
+ });
+
+ return clone;
+ }
+ }
+
+ /**
+ * @param {Node} node - The DOM Node object to render
+ * @param {Object} options - Rendering options, @see {@link toSvg}
+ * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data.
+ * */
+ function toPixelData(node, options) {
+ return draw(node, options || {})
+ .then(function (canvas) {
+ return canvas.getContext('2d').getImageData(
+ 0,
+ 0,
+ util.width(node),
+ util.height(node)
+ ).data;
+ });
+ }
+
+ /**
+ * @param {Node} node - The DOM Node object to render
+ * @param {Object} options - Rendering options, @see {@link toSvg}
+ * @return {Promise} - A promise that is fulfilled with a PNG image data URL
+ * */
+ function toPng(node, options) {
+ return draw(node, options || {})
+ .then(function (canvas) {
+ return canvas.toDataURL();
+ });
+ }
+
+ /**
+ * @param {Node} node - The DOM Node object to render
+ * @param {Object} options - Rendering options, @see {@link toSvg}
+ * @return {Promise} - A promise that is fulfilled with a JPEG image data URL
+ * */
+ function toJpeg(node, options) {
+ options = options || {};
+ return draw(node, options)
+ .then(function (canvas) {
+ return canvas.toDataURL('image/jpeg', options.quality || 1.0);
+ });
+ }
+
+ /**
+ * @param {Node} node - The DOM Node object to render
+ * @param {Object} options - Rendering options, @see {@link toSvg}
+ * @return {Promise} - A promise that is fulfilled with a PNG image blob
+ * */
+ function toBlob(node, options) {
+ return draw(node, options || {})
+ .then(util.canvasToBlob);
+ }
+
+ function copyOptions(options) {
+ // Copy options to impl options for use in impl
+ if(typeof(options.imagePlaceholder) === 'undefined') {
+ domtoimage.impl.options.imagePlaceholder = defaultOptions.imagePlaceholder;
+ } else {
+ domtoimage.impl.options.imagePlaceholder = options.imagePlaceholder;
+ }
+
+ if(typeof(options.cacheBust) === 'undefined') {
+ domtoimage.impl.options.cacheBust = defaultOptions.cacheBust;
+ } else {
+ domtoimage.impl.options.cacheBust = options.cacheBust;
+ }
+ }
+
+ function draw(domNode, options) {
+ return toSvg(domNode, options)
+ .then(util.makeImage)
+ .then(util.delay(100))
+ .then(function (image) {
+ var canvas = newCanvas(domNode);
+ canvas.getContext('2d').drawImage(image, 0, 0);
+ return canvas;
+ });
+
+ function newCanvas(domNode) {
+ var canvas = document.createElement('canvas');
+ canvas.width = options.width || util.width(domNode);
+ canvas.height = options.height || util.height(domNode);
+
+ if (options.bgcolor) {
+ var ctx = canvas.getContext('2d');
+ ctx.fillStyle = options.bgcolor;
+ ctx.fillRect(0, 0, canvas.width, canvas.height);
+ }
+
+ return canvas;
+ }
+ }
+
+ function cloneNode(node, filter, root) {
+ if (!root && filter && !filter(node)) return Promise.resolve();
+
+ return Promise.resolve(node)
+ .then(makeNodeCopy)
+ .then(function (clone) {
+ return cloneChildren(node, clone, filter);
+ })
+ .then(function (clone) {
+ return processClone(node, clone);
+ });
+
+ function makeNodeCopy(node) {
+ if (node instanceof HTMLCanvasElement) return util.makeImage(node.toDataURL());
+ return node.cloneNode(false);
+ }
+
+ function cloneChildren(original, clone, filter) {
+ var children = original.childNodes;
+ if (children.length === 0) return Promise.resolve(clone);
+
+ return cloneChildrenInOrder(clone, util.asArray(children), filter)
+ .then(function () {
+ return clone;
+ });
+
+ function cloneChildrenInOrder(parent, children, filter) {
+ var done = Promise.resolve();
+ children.forEach(function (child) {
+ done = done
+ .then(function () {
+ return cloneNode(child, filter);
+ })
+ .then(function (childClone) {
+ if (childClone) parent.appendChild(childClone);
+ });
+ });
+ return done;
+ }
+ }
+
+ function processClone(original, clone) {
+ if (!(clone instanceof Element)) return clone;
+
+ return Promise.resolve()
+ .then(cloneStyle)
+ .then(clonePseudoElements)
+ .then(copyUserInput)
+ .then(fixSvg)
+ .then(function () {
+ return clone;
+ });
+
+ function cloneStyle() {
+ copyStyle(window.getComputedStyle(original), clone.style);
+
+ function copyStyle(source, target) {
+ if (source.cssText) target.cssText = source.cssText;
+ else copyProperties(source, target);
+
+ function copyProperties(source, target) {
+ util.asArray(source).forEach(function (name) {
+ target.setProperty(
+ name,
+ source.getPropertyValue(name),
+ source.getPropertyPriority(name)
+ );
+ });
+ }
+ }
+ }
+
+ function clonePseudoElements() {
+ [':before', ':after'].forEach(function (element) {
+ clonePseudoElement(element);
+ });
+
+ function clonePseudoElement(element) {
+ var style = window.getComputedStyle(original, element);
+ var content = style.getPropertyValue('content');
+
+ if (content === '' || content === 'none') return;
+
+ var className = util.uid();
+ clone.className = clone.className + ' ' + className;
+ var styleElement = document.createElement('style');
+ styleElement.appendChild(formatPseudoElementStyle(className, element, style));
+ clone.appendChild(styleElement);
+
+ function formatPseudoElementStyle(className, element, style) {
+ var selector = '.' + className + ':' + element;
+ var cssText = style.cssText ? formatCssText(style) : formatCssProperties(style);
+ return document.createTextNode(selector + '{' + cssText + '}');
+
+ function formatCssText(style) {
+ var content = style.getPropertyValue('content');
+ return style.cssText + ' content: ' + content + ';';
+ }
+
+ function formatCssProperties(style) {
+
+ return util.asArray(style)
+ .map(formatProperty)
+ .join('; ') + ';';
+
+ function formatProperty(name) {
+ return name + ': ' +
+ style.getPropertyValue(name) +
+ (style.getPropertyPriority(name) ? ' !important' : '');
+ }
+ }
+ }
+ }
+ }
+
+ function copyUserInput() {
+ if (original instanceof HTMLTextAreaElement) clone.innerHTML = original.value;
+ if (original instanceof HTMLInputElement) clone.setAttribute("value", original.value);
+ }
+
+ function fixSvg() {
+ if (!(clone instanceof SVGElement)) return;
+ clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg');
+
+ if (!(clone instanceof SVGRectElement)) return;
+ ['width', 'height'].forEach(function (attribute) {
+ var value = clone.getAttribute(attribute);
+ if (!value) return;
+
+ clone.style.setProperty(attribute, value);
+ });
+ }
+ }
+ }
+
+ function embedFonts(node) {
+ return fontFaces.resolveAll()
+ .then(function (cssText) {
+ var styleNode = document.createElement('style');
+ node.appendChild(styleNode);
+ styleNode.appendChild(document.createTextNode(cssText));
+ return node;
+ });
+ }
+
+ function inlineImages(node) {
+ return images.inlineAll(node)
+ .then(function () {
+ return node;
+ });
+ }
+
+ function makeSvgDataUri(node, width, height) {
+ return Promise.resolve(node)
+ .then(function (node) {
+ node.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml');
+ return new XMLSerializer().serializeToString(node);
+ })
+ .then(util.escapeXhtml)
+ .then(function (xhtml) {
+ return '' + xhtml + '';
+ })
+ .then(function (foreignObject) {
+ return '';
+ })
+ .then(function (svg) {
+ return 'data:image/svg+xml;charset=utf-8,' + svg;
+ });
+ }
+
+ function newUtil() {
+ return {
+ escape: escape,
+ parseExtension: parseExtension,
+ mimeType: mimeType,
+ dataAsUrl: dataAsUrl,
+ isDataUrl: isDataUrl,
+ canvasToBlob: canvasToBlob,
+ resolveUrl: resolveUrl,
+ getAndEncode: getAndEncode,
+ uid: uid(),
+ delay: delay,
+ asArray: asArray,
+ escapeXhtml: escapeXhtml,
+ makeImage: makeImage,
+ width: width,
+ height: height
+ };
+
+ function mimes() {
+ /*
+ * Only WOFF and EOT mime types for fonts are 'real'
+ * see http://www.iana.org/assignments/media-types/media-types.xhtml
+ */
+ var WOFF = 'application/font-woff';
+ var JPEG = 'image/jpeg';
+
+ return {
+ 'woff': WOFF,
+ 'woff2': WOFF,
+ 'ttf': 'application/font-truetype',
+ 'eot': 'application/vnd.ms-fontobject',
+ 'png': 'image/png',
+ 'jpg': JPEG,
+ 'jpeg': JPEG,
+ 'gif': 'image/gif',
+ 'tiff': 'image/tiff',
+ 'svg': 'image/svg+xml'
+ };
+ }
+
+ function parseExtension(url) {
+ var match = /\.([^\.\/]*?)$/g.exec(url);
+ if (match) return match[1];
+ else return '';
+ }
+
+ function mimeType(url) {
+ var extension = parseExtension(url).toLowerCase();
+ return mimes()[extension] || '';
+ }
+
+ function isDataUrl(url) {
+ return url.search(/^(data:)/) !== -1;
+ }
+
+ function toBlob(canvas) {
+ return new Promise(function (resolve) {
+ var binaryString = window.atob(canvas.toDataURL().split(',')[1]);
+ var length = binaryString.length;
+ var binaryArray = new Uint8Array(length);
+
+ for (var i = 0; i < length; i++)
+ binaryArray[i] = binaryString.charCodeAt(i);
+
+ resolve(new Blob([binaryArray], {
+ type: 'image/png'
+ }));
+ });
+ }
+
+ function canvasToBlob(canvas) {
+ if (canvas.toBlob)
+ return new Promise(function (resolve) {
+ canvas.toBlob(resolve);
+ });
+
+ return toBlob(canvas);
+ }
+
+ function resolveUrl(url, baseUrl) {
+ var doc = document.implementation.createHTMLDocument();
+ var base = doc.createElement('base');
+ doc.head.appendChild(base);
+ var a = doc.createElement('a');
+ doc.body.appendChild(a);
+ base.href = baseUrl;
+ a.href = url;
+ return a.href;
+ }
+
+ function uid() {
+ var index = 0;
+
+ return function () {
+ return 'u' + fourRandomChars() + index++;
+
+ function fourRandomChars() {
+ /* see http://stackoverflow.com/a/6248722/2519373 */
+ return ('0000' + (Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4);
+ }
+ };
+ }
+
+ function makeImage(uri) {
+ return new Promise(function (resolve, reject) {
+ var image = new Image();
+ image.onload = function () {
+ resolve(image);
+ };
+ image.onerror = reject;
+ image.src = uri;
+ });
+ }
+
+ function getAndEncode(url) {
+ var TIMEOUT = 30000;
+ if(domtoimage.impl.options.cacheBust) {
+ // Cache bypass so we dont have CORS issues with cached images
+ // Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache
+ url += ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime();
+ }
+
+ return new Promise(function (resolve) {
+ var request = new XMLHttpRequest();
+
+ request.onreadystatechange = done;
+ request.ontimeout = timeout;
+ request.responseType = 'blob';
+ request.timeout = TIMEOUT;
+ request.open('GET', url, true);
+ request.send();
+
+ var placeholder;
+ if(domtoimage.impl.options.imagePlaceholder) {
+ var split = domtoimage.impl.options.imagePlaceholder.split(/,/);
+ if(split && split[1]) {
+ placeholder = split[1];
+ }
+ }
+
+ function done() {
+ if (request.readyState !== 4) return;
+
+ if (request.status !== 200) {
+ if(placeholder) {
+ resolve(placeholder);
+ } else {
+ fail('cannot fetch resource: ' + url + ', status: ' + request.status);
+ }
+
+ return;
+ }
+
+ var encoder = new FileReader();
+ encoder.onloadend = function () {
+ var content = encoder.result.split(/,/)[1];
+ resolve(content);
+ };
+ encoder.readAsDataURL(request.response);
+ }
+
+ function timeout() {
+ if(placeholder) {
+ resolve(placeholder);
+ } else {
+ fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url);
+ }
+ }
+
+ function fail(message) {
+ console.error(message);
+ resolve('');
+ }
+ });
+ }
+
+ function dataAsUrl(content, type) {
+ return 'data:' + type + ';base64,' + content;
+ }
+
+ function escape(string) {
+ return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1');
+ }
+
+ function delay(ms) {
+ return function (arg) {
+ return new Promise(function (resolve) {
+ setTimeout(function () {
+ resolve(arg);
+ }, ms);
+ });
+ };
+ }
+
+ function asArray(arrayLike) {
+ var array = [];
+ var length = arrayLike.length;
+ for (var i = 0; i < length; i++) array.push(arrayLike[i]);
+ return array;
+ }
+
+ function escapeXhtml(string) {
+ return string.replace(/#/g, '%23').replace(/\n/g, '%0A');
+ }
+
+ function width(node) {
+ var leftBorder = px(node, 'border-left-width');
+ var rightBorder = px(node, 'border-right-width');
+ return node.scrollWidth + leftBorder + rightBorder;
+ }
+
+ function height(node) {
+ var topBorder = px(node, 'border-top-width');
+ var bottomBorder = px(node, 'border-bottom-width');
+ return node.scrollHeight + topBorder + bottomBorder;
+ }
+
+ function px(node, styleProperty) {
+ var value = window.getComputedStyle(node).getPropertyValue(styleProperty);
+ return parseFloat(value.replace('px', ''));
+ }
+ }
+
+ function newInliner() {
+ var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g;
+
+ return {
+ inlineAll: inlineAll,
+ shouldProcess: shouldProcess,
+ impl: {
+ readUrls: readUrls,
+ inline: inline
+ }
+ };
+
+ function shouldProcess(string) {
+ return string.search(URL_REGEX) !== -1;
+ }
+
+ function readUrls(string) {
+ var result = [];
+ var match;
+ while ((match = URL_REGEX.exec(string)) !== null) {
+ result.push(match[1]);
+ }
+ return result.filter(function (url) {
+ return !util.isDataUrl(url);
+ });
+ }
+
+ function inline(string, url, baseUrl, get) {
+ return Promise.resolve(url)
+ .then(function (url) {
+ return baseUrl ? util.resolveUrl(url, baseUrl) : url;
+ })
+ .then(get || util.getAndEncode)
+ .then(function (data) {
+ return util.dataAsUrl(data, util.mimeType(url));
+ })
+ .then(function (dataUrl) {
+ return string.replace(urlAsRegex(url), '$1' + dataUrl + '$3');
+ });
+
+ function urlAsRegex(url) {
+ return new RegExp('(url\\([\'"]?)(' + util.escape(url) + ')([\'"]?\\))', 'g');
+ }
+ }
+
+ function inlineAll(string, baseUrl, get) {
+ if (nothingToInline()) return Promise.resolve(string);
+
+ return Promise.resolve(string)
+ .then(readUrls)
+ .then(function (urls) {
+ var done = Promise.resolve(string);
+ urls.forEach(function (url) {
+ done = done.then(function (string) {
+ return inline(string, url, baseUrl, get);
+ });
+ });
+ return done;
+ });
+
+ function nothingToInline() {
+ return !shouldProcess(string);
+ }
+ }
+ }
+
+ function newFontFaces() {
+ return {
+ resolveAll: resolveAll,
+ impl: {
+ readAll: readAll
+ }
+ };
+
+ function resolveAll() {
+ return readAll(document)
+ .then(function (webFonts) {
+ return Promise.all(
+ webFonts.map(function (webFont) {
+ return webFont.resolve();
+ })
+ );
+ })
+ .then(function (cssStrings) {
+ return cssStrings.join('\n');
+ });
+ }
+
+ function readAll() {
+ return Promise.resolve(util.asArray(document.styleSheets))
+ .then(getCssRules)
+ .then(selectWebFontRules)
+ .then(function (rules) {
+ return rules.map(newWebFont);
+ });
+
+ function selectWebFontRules(cssRules) {
+ return cssRules
+ .filter(function (rule) {
+ return rule.type === CSSRule.FONT_FACE_RULE;
+ })
+ .filter(function (rule) {
+ return inliner.shouldProcess(rule.style.getPropertyValue('src'));
+ });
+ }
+
+ function getCssRules(styleSheets) {
+ var cssRules = [];
+ styleSheets.forEach(function (sheet) {
+ try {
+ util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules));
+ } catch (e) {
+ console.log('Error while reading CSS rules from ' + sheet.href, e.toString());
+ }
+ });
+ return cssRules;
+ }
+
+ function newWebFont(webFontRule) {
+ return {
+ resolve: function resolve() {
+ var baseUrl = (webFontRule.parentStyleSheet || {}).href;
+ return inliner.inlineAll(webFontRule.cssText, baseUrl);
+ },
+ src: function () {
+ return webFontRule.style.getPropertyValue('src');
+ }
+ };
+ }
+ }
+ }
+
+ function newImages() {
+ return {
+ inlineAll: inlineAll,
+ impl: {
+ newImage: newImage
+ }
+ };
+
+ function newImage(element) {
+ return {
+ inline: inline
+ };
+
+ function inline(get) {
+ if (util.isDataUrl(element.src)) return Promise.resolve();
+
+ return Promise.resolve(element.src)
+ .then(get || util.getAndEncode)
+ .then(function (data) {
+ return util.dataAsUrl(data, util.mimeType(element.src));
+ })
+ .then(function (dataUrl) {
+ return new Promise(function (resolve, reject) {
+ element.onload = resolve;
+ element.onerror = reject;
+ element.src = dataUrl;
+ });
+ });
+ }
+ }
+
+ function inlineAll(node) {
+ if (!(node instanceof Element)) return Promise.resolve(node);
+
+ return inlineBackground(node)
+ .then(function () {
+ if (node instanceof HTMLImageElement)
+ return newImage(node).inline();
+ else
+ return Promise.all(
+ util.asArray(node.childNodes).map(function (child) {
+ return inlineAll(child);
+ })
+ );
+ });
+
+ function inlineBackground(node) {
+ var background = node.style.getPropertyValue('background');
+
+ if (!background) return Promise.resolve(node);
+
+ return inliner.inlineAll(background)
+ .then(function (inlined) {
+ node.style.setProperty(
+ 'background',
+ inlined,
+ node.style.getPropertyPriority('background')
+ );
+ })
+ .then(function () {
+ return node;
+ });
+ }
+ }
+ }
+})(this);
diff --git a/src/imports/istina-editor.js b/src/imports/istina-editor.js
index 12a78e1..f9d9156 100644
--- a/src/imports/istina-editor.js
+++ b/src/imports/istina-editor.js
@@ -247,8 +247,7 @@ IstinaEditor.highlightForQAnsel = function(txt)
"barrier",
"hvar",
"rand",
- "born",
- "bsample"
+ "born"
];
for (var i = 0; i < keywords.length; i++)
@@ -274,6 +273,20 @@ IstinaEditor.highlightForQAnsel = function(txt)
});
}
txt = txt.replaceAll
+ (
+ /(rx|ry|rz)[(].*?[)]/g,
+ x =>
+ {
+ var lhs = x.split("(")[0];
+ var rhs = x.split("(")[1].split(")")[0];
+ x = "" + lhs + "";
+ x += "(";
+ x += "" + rhs + "";
+ x += ")";
+ return x;
+ }
+ );
+ txt = txt.replaceAll
(
/[/][/].*?([<]div|[<]br|$)/g,
x =>
@@ -401,7 +414,7 @@ IstinaEditor.init = function()
txt = "";
for (var i = 0; i < linecount; i++)
{
- txt += (i + 1) + "
";
+ txt += "
" + (i + 1) + "
";
}
$(".istina-linecounter")[0].innerHTML = txt;
}
diff --git a/src/imports/measure.png b/src/imports/measure.png
new file mode 100644
index 0000000000000000000000000000000000000000..d44c75c82ae2da47a83c369c37f404453fae5e64
GIT binary patch
literal 37362
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
literal 0
HcmV?d00001
diff --git a/src/gui.html b/src/index.html
similarity index 68%
rename from src/gui.html
rename to src/index.html
index 1dd6937..2584723 100644
--- a/src/gui.html
+++ b/src/index.html
@@ -5,13 +5,9 @@
+