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 '' + + foreignObject + ''; + }) + .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 @@ +