- Refactoring: Avoid unnecessary addEventListener false; change internal

jPicker function to class (used with `new`)
- Linting (ESLint): Add `valid-jsdoc` rule and make fixes; but turn off for
  now due to <https://github.com/eslint/eslint/issues/11036> and
  <https://github.com/eslint/eslint/issues/11037>
- Docs (JSDoc): Add some Markdown for variables, line breaks; tighten checks
  for overly generic types (though allow for `.Function` as in
  `jQuery.Function`) and avoid one previously missed instance
This commit is contained in:
Brett Zamir
2018-10-30 23:25:20 +08:00
parent 9b9c900ede
commit aef7b095ef
47 changed files with 1664 additions and 1441 deletions

View File

@@ -24,6 +24,27 @@
"prefer-const": 2, "prefer-const": 2,
"no-extra-semi": 2, "no-extra-semi": 2,
"quote-props": [2, "as-needed"], "quote-props": [2, "as-needed"],
"object-curly-spacing": ["error", "never"] "object-curly-spacing": ["error", "never"],
"valid-jsdoc": ["off", {
"prefer": {
"arg": "param",
"argument": "param",
"return": "returns",
"virtual": "abstract"
},
"preferType": {
"Boolean": "boolean",
"Number": "number",
"String": "string",
"object": "Object",
"array": "Array"
},
"requireReturn": true,
"requireReturnType": true,
"requireParamType": true,
"matchDescription": "^([A-Z][\\s\\S]*[.`?!])?$",
"requireParamDescription": false,
"requireReturnDescription": false
}]
} }
} }

View File

@@ -1,10 +1,18 @@
# ? # ?
- Refactoring: Avoid unnecessary addEventListener `false`; change internal
jPicker function to class (used with `new`)
- Linting (ESLint): Add `valid-jsdoc` rule and make fixes; but turn off for
now due to <https://github.com/eslint/eslint/issues/11036> and
<https://github.com/eslint/eslint/issues/11037>
- Linting (ESLint compat): Add eslint-plugin-compat to get browser support - Linting (ESLint compat): Add eslint-plugin-compat to get browser support
warnings warnings
- Docs (README): Indicate minimal polyfills needed for older browsers - Docs (README): Indicate minimal polyfills needed for older browsers
(IE <= 11, IE Mobile, Opera Mini, Blackberry Browser <= 10, (IE <= 11, IE Mobile, Opera Mini, Blackberry Browser <= 10,
Android Browser 4.4.3-4.4.4) Android Browser 4.4.3-4.4.4)
- Docs (JSDoc): Add some Markdown for variables, line breaks; tighten checks
for overly generic types (though allow for `.Function` as in
`jQuery.Function`) and avoid one previously missed instance
- Docs (3.0.0): Clarify - Docs (3.0.0): Clarify
- Docs (ReleaseInstructions): Clarify need for npm permissions to publish - Docs (ReleaseInstructions): Clarify need for npm permissions to publish
- npm: Update devDeps - npm: Update devDeps

12
dist/canvg.js vendored
View File

@@ -397,7 +397,7 @@ var canvg = (function (exports) {
} }
}]; }];
/** /**
* A class to parse color values * A class to parse color values.
*/ */
var RGBColor = var RGBColor =
@@ -489,7 +489,7 @@ var canvg = (function (exports) {
return '#' + r + g + b; return '#' + r + g + b;
} }
/** /**
* help * Offers a bulleted list of help.
* @returns {HTMLUListElement} * @returns {HTMLUListElement}
*/ */
@@ -516,7 +516,7 @@ var canvg = (function (exports) {
var listItem = document.createElement('li'); var listItem = document.createElement('li');
var listColor = new RGBColor(examples[_i]); var listColor = new RGBColor(examples[_i]);
var exampleDiv = document.createElement('div'); var exampleDiv = document.createElement('div');
exampleDiv.style.cssText = "margin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";"); exampleDiv.style.cssText = "\nmargin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";");
exampleDiv.append('test'); exampleDiv.append('test');
var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex());
listItem.append(exampleDiv, listItemValue); listItem.append(exampleDiv, listItemValue);
@@ -862,6 +862,7 @@ var canvg = (function (exports) {
/** /**
* @function module:canvg.setStackBlurCanvasRGBA * @function module:canvg.setStackBlurCanvasRGBA
* @param {module:canvg.StackBlurCanvasRGBA} cb Will be passed the canvas ID, x, y, width, height, blurRadius * @param {module:canvg.StackBlurCanvasRGBA} cb Will be passed the canvas ID, x, y, width, height, blurRadius
* @returns {undefined}
*/ */
var setStackBlurCanvasRGBA = function setStackBlurCanvasRGBA(cb) { var setStackBlurCanvasRGBA = function setStackBlurCanvasRGBA(cb) {
@@ -883,7 +884,8 @@ var canvg = (function (exports) {
*/ */
/** /**
* If called with no arguments, it will replace all `<svg>` elements on the page with `<canvas>` elements * If called with no arguments, it will replace all `<svg>` elements on the page
* with `<canvas>` elements.
* @function module:canvg.canvg * @function module:canvg.canvg
* @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element
* @param {string|XMLDocument} s: svg string, url to svg file, or xml document * @param {string|XMLDocument} s: svg string, url to svg file, or xml document
@@ -936,7 +938,7 @@ var canvg = (function (exports) {
}; };
/** /**
* @param {module:canvg.CanvgOptions} opts * @param {module:canvg.CanvgOptions} opts
* @returns {object} * @returns {Object}
* @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur)
*/ */

View File

@@ -397,7 +397,7 @@ var svgEditorExtension_server_moinsave = (function () {
} }
}]; }];
/** /**
* A class to parse color values * A class to parse color values.
*/ */
var RGBColor = var RGBColor =
@@ -489,7 +489,7 @@ var svgEditorExtension_server_moinsave = (function () {
return '#' + r + g + b; return '#' + r + g + b;
} }
/** /**
* help * Offers a bulleted list of help.
* @returns {HTMLUListElement} * @returns {HTMLUListElement}
*/ */
@@ -516,7 +516,7 @@ var svgEditorExtension_server_moinsave = (function () {
var listItem = document.createElement('li'); var listItem = document.createElement('li');
var listColor = new RGBColor(examples[_i]); var listColor = new RGBColor(examples[_i]);
var exampleDiv = document.createElement('div'); var exampleDiv = document.createElement('div');
exampleDiv.style.cssText = "margin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";"); exampleDiv.style.cssText = "\nmargin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";");
exampleDiv.append('test'); exampleDiv.append('test');
var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex());
listItem.append(exampleDiv, listItemValue); listItem.append(exampleDiv, listItemValue);
@@ -860,7 +860,8 @@ var svgEditorExtension_server_moinsave = (function () {
*/ */
/** /**
* If called with no arguments, it will replace all `<svg>` elements on the page with `<canvas>` elements * If called with no arguments, it will replace all `<svg>` elements on the page
* with `<canvas>` elements.
* @function module:canvg.canvg * @function module:canvg.canvg
* @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element
* @param {string|XMLDocument} s: svg string, url to svg file, or xml document * @param {string|XMLDocument} s: svg string, url to svg file, or xml document
@@ -913,7 +914,7 @@ var svgEditorExtension_server_moinsave = (function () {
}; };
/** /**
* @param {module:canvg.CanvgOptions} opts * @param {module:canvg.CanvgOptions} opts
* @returns {object} * @returns {Object}
* @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur)
*/ */

View File

@@ -397,7 +397,7 @@ var svgEditorExtension_server_opensave = (function () {
} }
}]; }];
/** /**
* A class to parse color values * A class to parse color values.
*/ */
var RGBColor = var RGBColor =
@@ -489,7 +489,7 @@ var svgEditorExtension_server_opensave = (function () {
return '#' + r + g + b; return '#' + r + g + b;
} }
/** /**
* help * Offers a bulleted list of help.
* @returns {HTMLUListElement} * @returns {HTMLUListElement}
*/ */
@@ -516,7 +516,7 @@ var svgEditorExtension_server_opensave = (function () {
var listItem = document.createElement('li'); var listItem = document.createElement('li');
var listColor = new RGBColor(examples[_i]); var listColor = new RGBColor(examples[_i]);
var exampleDiv = document.createElement('div'); var exampleDiv = document.createElement('div');
exampleDiv.style.cssText = "margin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";"); exampleDiv.style.cssText = "\nmargin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";");
exampleDiv.append('test'); exampleDiv.append('test');
var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex());
listItem.append(exampleDiv, listItemValue); listItem.append(exampleDiv, listItemValue);
@@ -860,7 +860,8 @@ var svgEditorExtension_server_opensave = (function () {
*/ */
/** /**
* If called with no arguments, it will replace all `<svg>` elements on the page with `<canvas>` elements * If called with no arguments, it will replace all `<svg>` elements on the page
* with `<canvas>` elements.
* @function module:canvg.canvg * @function module:canvg.canvg
* @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element
* @param {string|XMLDocument} s: svg string, url to svg file, or xml document * @param {string|XMLDocument} s: svg string, url to svg file, or xml document
@@ -913,7 +914,7 @@ var svgEditorExtension_server_opensave = (function () {
}; };
/** /**
* @param {module:canvg.CanvgOptions} opts * @param {module:canvg.CanvgOptions} opts
* @returns {object} * @returns {Object}
* @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur)
*/ */

View File

@@ -135,6 +135,7 @@ var svgEditorExtension_storage = (function () {
* content into storage) * content into storage)
* 2. Use localStorage to set SVG contents (potentially too large to allow in cookies) * 2. Use localStorage to set SVG contents (potentially too large to allow in cookies)
* 3. Use localStorage (where available) or cookies to set preferences. * 3. Use localStorage (where available) or cookies to set preferences.
* @returns {undefined}
*/ */
@@ -177,7 +178,7 @@ var svgEditorExtension_storage = (function () {
} }
} }
} }
}, false); });
} }
var loaded = false; var loaded = false;

View File

@@ -86,7 +86,7 @@ var svgEditorExtension_xdomain_messaging = (function () {
} }
e.source.postMessage(JSON.stringify(message), '*'); e.source.postMessage(JSON.stringify(message), '*');
}, false); });
} catch (err) { } catch (err) {
console.log('Error with xdomain message listener: ' + err); console.log('Error with xdomain message listener: ' + err);
} }

498
dist/index-es.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

498
dist/index-umd.js vendored

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -254,7 +254,7 @@
} }
}]; }];
/** /**
* A class to parse color values * A class to parse color values.
*/ */
var RGBColor = var RGBColor =
@@ -346,7 +346,7 @@
return '#' + r + g + b; return '#' + r + g + b;
} }
/** /**
* help * Offers a bulleted list of help.
* @returns {HTMLUListElement} * @returns {HTMLUListElement}
*/ */
@@ -373,7 +373,7 @@
var listItem = document.createElement('li'); var listItem = document.createElement('li');
var listColor = new RGBColor(examples[_i]); var listColor = new RGBColor(examples[_i]);
var exampleDiv = document.createElement('div'); var exampleDiv = document.createElement('div');
exampleDiv.style.cssText = "margin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";"); exampleDiv.style.cssText = "\nmargin: 3px;\nborder: 1px solid black;\nbackground: ".concat(listColor.toHex(), ";\ncolor: ").concat(listColor.toHex(), ";");
exampleDiv.append('test'); exampleDiv.append('test');
var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); var listItemValue = " ".concat(examples[_i], " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex());
listItem.append(exampleDiv, listItemValue); listItem.append(exampleDiv, listItemValue);

View File

@@ -271,7 +271,7 @@ export const supportsNonScalingStroke = () => supportsNonScalingStroke_;
export const supportsNativeTransformLists = () => supportsNativeSVGTransformLists_; export const supportsNativeTransformLists = () => supportsNativeSVGTransformLists_;
/** /**
* Set `supportsNativeSVGTransformLists_` to `false` (for unit testing) * Set `supportsNativeSVGTransformLists_` to `false` (for unit testing).
* @function module:browser.disableSupportsNativeTransformLists * @function module:browser.disableSupportsNativeTransformLists
* @returns {undefined} * @returns {undefined}
*/ */

View File

@@ -31,6 +31,7 @@ let canvasRGBA_ = canvasRGBA;
/** /**
* @function module:canvg.setStackBlurCanvasRGBA * @function module:canvg.setStackBlurCanvasRGBA
* @param {module:canvg.StackBlurCanvasRGBA} cb Will be passed the canvas ID, x, y, width, height, blurRadius * @param {module:canvg.StackBlurCanvasRGBA} cb Will be passed the canvas ID, x, y, width, height, blurRadius
* @returns {undefined}
*/ */
export const setStackBlurCanvasRGBA = (cb) => { export const setStackBlurCanvasRGBA = (cb) => {
canvasRGBA_ = cb; canvasRGBA_ = cb;
@@ -52,7 +53,8 @@ export const setStackBlurCanvasRGBA = (cb) => {
*/ */
/** /**
* If called with no arguments, it will replace all `<svg>` elements on the page with `<canvas>` elements * If called with no arguments, it will replace all `<svg>` elements on the page
* with `<canvas>` elements.
* @function module:canvg.canvg * @function module:canvg.canvg
* @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element
* @param {string|XMLDocument} s: svg string, url to svg file, or xml document * @param {string|XMLDocument} s: svg string, url to svg file, or xml document
@@ -102,7 +104,7 @@ export const canvg = function (target, s, opts) {
/** /**
* @param {module:canvg.CanvgOptions} opts * @param {module:canvg.CanvgOptions} opts
* @returns {object} * @returns {Object}
* @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur)
*/ */
function build (opts) { function build (opts) {

View File

@@ -189,7 +189,7 @@ const colorDefs = [
]; ];
/** /**
* A class to parse color values * A class to parse color values.
*/ */
export default class RGBColor { export default class RGBColor {
/** /**
@@ -253,7 +253,7 @@ export default class RGBColor {
} }
/** /**
* help * Offers a bulleted list of help.
* @returns {HTMLUListElement} * @returns {HTMLUListElement}
*/ */
getHelpXML () { getHelpXML () {
@@ -275,8 +275,8 @@ export default class RGBColor {
const listItem = document.createElement('li'); const listItem = document.createElement('li');
const listColor = new RGBColor(examples[i]); const listColor = new RGBColor(examples[i]);
const exampleDiv = document.createElement('div'); const exampleDiv = document.createElement('div');
exampleDiv.style.cssText = exampleDiv.style.cssText = `
`margin: 3px; margin: 3px;
border: 1px solid black; border: 1px solid black;
background: ${listColor.toHex()}; background: ${listColor.toHex()};
color: ${listColor.toHex()};` color: ${listColor.toHex()};`

View File

@@ -35,7 +35,12 @@ import {isMac} from '../browser.js';
*/ */
/** /**
* Adds {@link external:jQuery.fn.contextMenu}, {@link external:jQuery.fn.disableContextMenuItems}, {@link external:jQuery.fn.enableContextMenuItems}, {@link external:jQuery.fn.disableContextMenu}, {@link external:jQuery.fn.enableContextMenu}, {@link external:jQuery.fn.destroyContextMenu} * Adds {@link external:jQuery.fn.contextMenu},
* {@link external:jQuery.fn.disableContextMenuItems},
* {@link external:jQuery.fn.enableContextMenuItems},
* {@link external:jQuery.fn.disableContextMenu},
* {@link external:jQuery.fn.enableContextMenu},
* {@link external:jQuery.fn.destroyContextMenu}.
* @function module:jQueryContextMenu.jQueryContextMenu * @function module:jQueryContextMenu.jQueryContextMenu
* @param {external:jQuery} $ The jQuery object to wrap (with `contextMenu`, `disableContextMenuItems`, `enableContextMenuItems`, `disableContextMenu`, `enableContextMenu`, `destroyContextMenu`) * @param {external:jQuery} $ The jQuery object to wrap (with `contextMenu`, `disableContextMenuItems`, `enableContextMenuItems`, `disableContextMenu`, `enableContextMenu`, `destroyContextMenu`)
* @returns {external:jQuery} * @returns {external:jQuery}
@@ -170,7 +175,7 @@ function jQueryContextMenu ($) {
}, },
/** /**
* Disable context menu items on the fly * Disable context menu items on the fly.
* @memberof external:jQuery.fn * @memberof external:jQuery.fn
* @param {undefined|string} o Comma-separated * @param {undefined|string} o Comma-separated
* @returns {external:jQuery} * @returns {external:jQuery}
@@ -193,7 +198,7 @@ function jQueryContextMenu ($) {
}, },
/** /**
* Enable context menu items on the fly * Enable context menu items on the fly.
* @memberof external:jQuery.fn * @memberof external:jQuery.fn
* @param {undefined|string} o Comma-separated * @param {undefined|string} o Comma-separated
* @returns {external:jQuery} * @returns {external:jQuery}
@@ -216,7 +221,7 @@ function jQueryContextMenu ($) {
}, },
/** /**
* Disable context menu(s) * Disable context menu(s).
* @memberof external:jQuery.fn * @memberof external:jQuery.fn
* @returns {external:jQuery} * @returns {external:jQuery}
*/ */
@@ -228,7 +233,7 @@ function jQueryContextMenu ($) {
}, },
/** /**
* Enable context menu(s) * Enable context menu(s).
* @memberof external:jQuery.fn * @memberof external:jQuery.fn
* @returns {external:jQuery} * @returns {external:jQuery}
*/ */
@@ -240,7 +245,7 @@ function jQueryContextMenu ($) {
}, },
/** /**
* Destroy context menu(s) * Destroy context menu(s).
* @memberof external:jQuery.fn * @memberof external:jQuery.fn
* @returns {external:jQuery} * @returns {external:jQuery}
*/ */

View File

@@ -41,13 +41,14 @@ let editorContext_ = null;
/** /**
* @function module:coords.init * @function module:coords.init
* @param {module:coords.EditorContext} editorContext * @param {module:coords.EditorContext} editorContext
* @returns {undefined}
*/ */
export const init = function (editorContext) { export const init = function (editorContext) {
editorContext_ = editorContext; editorContext_ = editorContext;
}; };
/** /**
* Applies coordinate changes to an element based on the given matrix * Applies coordinate changes to an element based on the given matrix.
* @function module:coords.remapElement * @function module:coords.remapElement
* @implements {module:path.EditorContext#remapElement} * @implements {module:path.EditorContext#remapElement}
*/ */

View File

@@ -67,7 +67,7 @@ function getNewLayerName (existingLayerNames) {
} }
/** /**
* This class encapsulates the concept of a SVG-edit drawing * This class encapsulates the concept of a SVG-edit drawing.
*/ */
export class Drawing { export class Drawing {
/** /**
@@ -184,7 +184,7 @@ export class Drawing {
} }
/** /**
* Clears any previously set nonce * Clears any previously set nonce.
* @returns {undefined} * @returns {undefined}
*/ */
clearNonce () { clearNonce () {
@@ -276,7 +276,7 @@ export class Drawing {
} }
/** /**
* Check if layer with given name already exists * Check if layer with given name already exists.
* @param {string} name - The layer name to check * @param {string} name - The layer name to check
* @returns {boolean} * @returns {boolean}
*/ */
@@ -302,6 +302,7 @@ export class Drawing {
/** /**
* Get a layer by name. * Get a layer by name.
* @param {string} name
* @returns {SVGGElement} The SVGGElement representing the named layer or null. * @returns {SVGGElement} The SVGGElement representing the named layer or null.
*/ */
getLayerByName (name) { getLayerByName (name) {
@@ -663,7 +664,7 @@ export class Drawing {
} }
/** /**
* Create a clone of an element, updating its ID and its children's IDs when needed * Create a clone of an element, updating its ID and its children's IDs when needed.
* @param {Element} el - DOM element to clone * @param {Element} el - DOM element to clone
* @returns {Element} * @returns {Element}
*/ */
@@ -767,7 +768,7 @@ export const init = function (canvas) {
}; };
/** /**
* Updates layer system * Updates layer system.
* @function module:draw.identifyLayers * @function module:draw.identifyLayers
* @returns {undefined} * @returns {undefined}
*/ */
@@ -980,7 +981,7 @@ export const mergeAllLayers = function (hrService) {
/** /**
* Return from a group context to the regular kind, make any previously * Return from a group context to the regular kind, make any previously
* disabled elements enabled again * disabled elements enabled again.
* @function module:draw.leaveContext * @function module:draw.leaveContext
* @fires module:svgcanvas.SvgCanvas#event:contextset * @fires module:svgcanvas.SvgCanvas#event:contextset
* @returns {undefined} * @returns {undefined}
@@ -1006,7 +1007,7 @@ export const leaveContext = function () {
}; };
/** /**
* Set the current context (for in-group editing) * Set the current context (for in-group editing).
* @function module:draw.setContext * @function module:draw.setContext
* @param {Element} elem * @param {Element} elem
* @fires module:svgcanvas.SvgCanvas#event:contextset * @fires module:svgcanvas.SvgCanvas#event:contextset

View File

@@ -1,6 +1,6 @@
/* globals jQuery */ /* globals jQuery */
/** /**
* Attaches items to DOM for Embedded SVG support * Attaches items to DOM for Embedded SVG support.
* @module EmbeddedSVGEditDOM * @module EmbeddedSVGEditDOM
*/ */
import EmbeddedSVGEdit from './embedapi.js'; import EmbeddedSVGEdit from './embedapi.js';

View File

@@ -17,7 +17,7 @@ let cbid = 0;
*/ */
/** /**
* @param {string} d * @param {string} funcName
* @returns {module:EmbeddedSVGEdit.CallbackSetGetter} * @returns {module:EmbeddedSVGEdit.CallbackSetGetter}
*/ */
function getCallbackSetter (funcName) { function getCallbackSetter (funcName) {
@@ -34,7 +34,7 @@ function getCallbackSetter (funcName) {
/** /**
* Having this separate from messageListener allows us to * Having this separate from messageListener allows us to
* avoid using JSON parsing (and its limitations) in the case * avoid using JSON parsing (and its limitations) in the case
* of same domain control * of same domain control.
* @param {module:EmbeddedSVGEdit.EmbeddedSVGEdit} t The `this` value * @param {module:EmbeddedSVGEdit.EmbeddedSVGEdit} t The `this` value
* @param {JSON} data * @param {JSON} data
* @returns {undefined} * @returns {undefined}
@@ -89,9 +89,9 @@ function getMessageListener (t) {
} }
/** /**
* Embedded SVG-edit API * Embedded SVG-edit API.
* General usage: * General usage:
- Have an iframe somewhere pointing to a version of svg-edit > r1000 * - Have an iframe somewhere pointing to a version of svg-edit > r1000.
* @example * @example
// Initialize the magic with: // Initialize the magic with:
@@ -318,7 +318,7 @@ class EmbeddedSVGEdit {
} }
// Older IE may need a polyfill for addEventListener, but so it would for SVG // Older IE may need a polyfill for addEventListener, but so it would for SVG
window.addEventListener('message', getMessageListener(this), false); window.addEventListener('message', getMessageListener(this));
window.addEventListener('keydown', (e) => { window.addEventListener('keydown', (e) => {
const {key, keyCode, charCode, which} = e; const {key, keyCode, charCode, which} = e;
if (e.key === 'Backspace') { if (e.key === 'Backspace') {

View File

@@ -148,7 +148,8 @@ export default {
/** /**
* *
* @param {Element[]} [elem=selElems] Array of elements * @param {Element[]} [elems=selElems] Array of elements
* @returns {undefined}
*/ */
function findConnectors (elems = selElems) { function findConnectors (elems = selElems) {
const connectors = $(svgcontent).find(connSel); const connectors = $(svgcontent).find(connSel);

View File

@@ -101,6 +101,7 @@ export default {
* content into storage) * content into storage)
* 2. Use localStorage to set SVG contents (potentially too large to allow in cookies) * 2. Use localStorage to set SVG contents (potentially too large to allow in cookies)
* 3. Use localStorage (where available) or cookies to set preferences. * 3. Use localStorage (where available) or cookies to set preferences.
* @returns {undefined}
*/ */
function setupBeforeUnloadListener () { function setupBeforeUnloadListener () {
window.addEventListener('beforeunload', function (e) { window.addEventListener('beforeunload', function (e) {
@@ -135,7 +136,7 @@ export default {
} }
} }
} }
}, false); });
} }
let loaded = false; let loaded = false;

View File

@@ -40,7 +40,7 @@ export default {
message.error = err.message; message.error = err.message;
} }
e.source.postMessage(JSON.stringify(message), '*'); e.source.postMessage(JSON.stringify(message), '*');
}, false); });
} catch (err) { } catch (err) {
console.log('Error with xdomain message listener: ' + err); console.log('Error with xdomain message listener: ' + err);
} }

View File

@@ -21,7 +21,7 @@ export const HistoryEventTypes = {
// const removedElements = {}; // const removedElements = {};
/** /**
* Base class for commands * Base class for commands.
*/ */
class Command { class Command {
/** /**
@@ -97,7 +97,7 @@ class Command {
*/ */
/** /**
* History command for an element that had its DOM position changed * History command for an element that had its DOM position changed.
* @implements {module:history.HistoryCommand} * @implements {module:history.HistoryCommand}
* @param {Element} elem - The DOM element that was moved * @param {Element} elem - The DOM element that was moved
* @param {Element} oldNextSibling - The element's next sibling before it was moved * @param {Element} oldNextSibling - The element's next sibling before it was moved
@@ -119,7 +119,7 @@ export class MoveElementCommand extends Command {
} }
/** /**
* Re-positions the element * Re-positions the element.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -138,7 +138,7 @@ export class MoveElementCommand extends Command {
} }
/** /**
* Positions the element back to its original location * Positions the element back to its original location.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -165,7 +165,7 @@ export class MoveElementCommand extends Command {
MoveElementCommand.type = MoveElementCommand.prototype.type; MoveElementCommand.type = MoveElementCommand.prototype.type;
/** /**
* History command for an element that was added to the DOM * History command for an element that was added to the DOM.
* @implements {module:history.HistoryCommand} * @implements {module:history.HistoryCommand}
* *
* @param {Element} elem - The newly added DOM element * @param {Element} elem - The newly added DOM element
@@ -185,7 +185,7 @@ export class InsertElementCommand extends Command {
} }
/** /**
* Re-inserts the new element * Re-inserts the new element.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -203,7 +203,7 @@ export class InsertElementCommand extends Command {
} }
/** /**
* Removes the element * Removes the element.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -231,7 +231,7 @@ export class InsertElementCommand extends Command {
InsertElementCommand.type = InsertElementCommand.prototype.type; InsertElementCommand.type = InsertElementCommand.prototype.type;
/** /**
* History command for an element removed from the DOM * History command for an element removed from the DOM.
* @implements {module:history.HistoryCommand} * @implements {module:history.HistoryCommand}
* @param {Element} elem - The removed DOM element * @param {Element} elem - The removed DOM element
* @param {Node} oldNextSibling - The DOM element's nextSibling when it was in the DOM * @param {Node} oldNextSibling - The DOM element's nextSibling when it was in the DOM
@@ -254,7 +254,7 @@ export class RemoveElementCommand extends Command {
} }
/** /**
* Re-removes the new element * Re-removes the new element.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -274,7 +274,7 @@ export class RemoveElementCommand extends Command {
} }
/** /**
* Re-adds the new element * Re-adds the new element.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -343,7 +343,7 @@ export class ChangeElementCommand extends Command {
} }
/** /**
* Performs the stored change action * Performs the stored change action.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {true} * @returns {true}
@@ -397,7 +397,7 @@ export class ChangeElementCommand extends Command {
} }
/** /**
* Reverses the stored change action * Reverses the stored change action.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {true} * @returns {true}
@@ -464,7 +464,7 @@ ChangeElementCommand.type = ChangeElementCommand.prototype.type;
// and they both affect the same element, then collapse the two commands into one // and they both affect the same element, then collapse the two commands into one
/** /**
* History command that can contain/execute multiple other commands * History command that can contain/execute multiple other commands.
* @implements {module:history.HistoryCommand} * @implements {module:history.HistoryCommand}
*/ */
export class BatchCommand extends Command { export class BatchCommand extends Command {
@@ -482,7 +482,7 @@ export class BatchCommand extends Command {
} }
/** /**
* Runs "apply" on all subcommands * Runs "apply" on all subcommands.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -503,7 +503,7 @@ export class BatchCommand extends Command {
} }
/** /**
* Runs "unapply" on all subcommands * Runs "unapply" on all subcommands.
* @param {module:history.HistoryEventHandler} handler * @param {module:history.HistoryEventHandler} handler
* @fires module:history~Command#event:history * @fires module:history~Command#event:history
* @returns {undefined} * @returns {undefined}
@@ -523,7 +523,7 @@ export class BatchCommand extends Command {
} }
/** /**
* Iterate through all our subcommands * Iterate through all our subcommands.
* @returns {Element[]} All the elements we are changing * @returns {Element[]} All the elements we are changing
*/ */
elements () { elements () {
@@ -540,8 +540,9 @@ export class BatchCommand extends Command {
} }
/** /**
* Adds a given command to the history stack * Adds a given command to the history stack.
* @param {Command} cmd - The undo command object to add * @param {Command} cmd - The undo command object to add
* @returns {undefined}
*/ */
addSubCommand (cmd) { addSubCommand (cmd) {
this.stack.push(cmd); this.stack.push(cmd);
@@ -575,7 +576,7 @@ export class UndoManager {
} }
/** /**
* Resets the undo stack, effectively clearing the undo/redo history * Resets the undo stack, effectively clearing the undo/redo history.
* @returns {undefined} * @returns {undefined}
*/ */
resetUndoStack () { resetUndoStack () {
@@ -612,7 +613,7 @@ export class UndoManager {
} }
/** /**
* Performs an undo step * Performs an undo step.
* @returns {undefined} * @returns {undefined}
*/ */
undo () { undo () {
@@ -623,7 +624,7 @@ export class UndoManager {
} }
/** /**
* Performs a redo step * Performs a redo step.
* @returns {undefined} * @returns {undefined}
*/ */
redo () { redo () {
@@ -634,7 +635,7 @@ export class UndoManager {
} }
/** /**
* Adds a command object to the undo history stack * Adds a command object to the undo history stack.
* @param {Command} cmd - The command object to add * @param {Command} cmd - The command object to add
* @returns {undefined} * @returns {undefined}
*/ */
@@ -683,7 +684,7 @@ export class UndoManager {
/** /**
* This function returns a `BatchCommand` object which summarizes the * This function returns a `BatchCommand` object which summarizes the
* change since `beginUndoableChange` was called. The command can then * change since `beginUndoableChange` was called. The command can then
* be added to the command history * be added to the command history.
* @returns {BatchCommand} Batch command object with resulting changes * @returns {BatchCommand} Batch command object with resulting changes
*/ */
finishUndoableChange () { finishUndoableChange () {

View File

@@ -85,7 +85,7 @@ class HistoryRecordingService {
} }
/** /**
* Add a MoveElementCommand to the history or current batch command * Add a `MoveElementCommand` to the history or current batch command.
* @param {Element} elem - The DOM element that was moved * @param {Element} elem - The DOM element that was moved
* @param {Element} oldNextSibling - The element's next sibling before it was moved * @param {Element} oldNextSibling - The element's next sibling before it was moved
* @param {Element} oldParent - The element's parent before it was moved * @param {Element} oldParent - The element's parent before it was moved
@@ -99,7 +99,7 @@ class HistoryRecordingService {
} }
/** /**
* Add an InsertElementCommand to the history or current batch command * Add an `InsertElementCommand` to the history or current batch command.
* @param {Element} elem - The DOM element that was added * @param {Element} elem - The DOM element that was added
* @param {string} [text] - An optional string visible to user related to this change * @param {string} [text] - An optional string visible to user related to this change
* @returns {module:history.HistoryRecordingService} * @returns {module:history.HistoryRecordingService}
@@ -111,7 +111,7 @@ class HistoryRecordingService {
} }
/** /**
* Add a RemoveElementCommand to the history or current batch command * Add a `RemoveElementCommand` to the history or current batch command.
* @param {Element} elem - The DOM element that was removed * @param {Element} elem - The DOM element that was removed
* @param {Element} oldNextSibling - The element's next sibling before it was removed * @param {Element} oldNextSibling - The element's next sibling before it was removed
* @param {Element} oldParent - The element's parent before it was removed * @param {Element} oldParent - The element's parent before it was removed
@@ -125,7 +125,7 @@ class HistoryRecordingService {
} }
/** /**
* Add a ChangeElementCommand to the history or current batch command * Add a `ChangeElementCommand` to the history or current batch command.
* @param {Element} elem - The DOM element that was changed * @param {Element} elem - The DOM element that was changed
* @param {module:history.CommandAttributes} attrs - An object with the attributes to be changed and the values they had *before* the change * @param {module:history.CommandAttributes} attrs - An object with the attributes to be changed and the values they had *before* the change
* @param {string} [text] - An optional string visible to user related to this change * @param {string} [text] - An optional string visible to user related to this change

View File

@@ -8,12 +8,12 @@
* This fixes `$(...).attr()` to work as expected with SVG elements. * This fixes `$(...).attr()` to work as expected with SVG elements.
* Does not currently use `*AttributeNS()` since we rarely need that. * Does not currently use `*AttributeNS()` since we rarely need that.
* Adds {@link external:jQuery.fn.attr}. * Adds {@link external:jQuery.fn.attr}.
* See {@link https://api.jquery.com/attr/} for basic documentation of `.attr()` * See {@link https://api.jquery.com/attr/} for basic documentation of `.attr()`.
* *
* Additional functionality: * Additional functionality:
* - When getting attributes, a string that's a number is returned as type number. * - When getting attributes, a string that's a number is returned as type number.
* - If an array is supplied as the first parameter, multiple values are returned * - If an array is supplied as the first parameter, multiple values are returned
* as an object with values for each given attribute * as an object with values for each given attribute.
* @function module:jQueryAttr.jQueryAttr * @function module:jQueryAttr.jQueryAttr
* @param {external:jQuery} $ The jQuery object to which to add the plug-in * @param {external:jQuery} $ The jQuery object to which to add the plug-in
* @returns {external:jQuery} * @returns {external:jQuery}

View File

@@ -42,7 +42,9 @@ if (!window.console) {
} }
/** /**
* Adds {@link external:jQuery.jGraduate.Paint}, {@link external:jQuery.fn.jGraduateDefaults}, {@link external:jQuery.fn.jGraduate} * Adds {@link external:jQuery.jGraduate.Paint},
* {@link external:jQuery.fn.jGraduateDefaults},
* {@link external:jQuery.fn.jGraduate}.
* @function module:jGraduate.jGraduate * @function module:jGraduate.jGraduate
* @param {external:jQuery} $ The jQuery instance to wrap * @param {external:jQuery} $ The jQuery instance to wrap
* @returns {external:jQuery} * @returns {external:jQuery}

View File

@@ -60,250 +60,253 @@ const jPicker = function ($) {
/** /**
* Encapsulate slider functionality for the ColorMap and ColorBar - * Encapsulate slider functionality for the ColorMap and ColorBar -
* could be useful to use a jQuery UI draggable for this with certain extensions * could be useful to use a jQuery UI draggable for this with certain extensions.
* @param {external:jQuery} bar * @param {external:jQuery} bar
* @param {module:jPicker.SliderOptions} options * @param {module:jPicker.SliderOptions} options
* @returns {undefined}
*/ */
function Slider (bar, options) { class Slider {
const $this = this; constructor (bar, options) {
function fireChangeEvents (context) { const $this = this;
for (let i = 0; i < changeEvents.length; i++) { function fireChangeEvents (context) {
changeEvents[i].call($this, $this, context); for (let i = 0; i < changeEvents.length; i++) {
changeEvents[i].call($this, $this, context);
}
} }
} // bind the mousedown to the bar not the arrow for quick snapping to the clicked location
// bind the mousedown to the bar not the arrow for quick snapping to the clicked location function mouseDown (e) {
function mouseDown (e) { const off = bar.offset();
const off = bar.offset(); offset = {l: off.left | 0, t: off.top | 0};
offset = {l: off.left | 0, t: off.top | 0}; clearTimeout(timeout);
clearTimeout(timeout); // using setTimeout for visual updates - once the style is updated the browser will re-render internally allowing the next Javascript to run
// using setTimeout for visual updates - once the style is updated the browser will re-render internally allowing the next Javascript to run timeout = setTimeout(function () {
timeout = setTimeout(function () { setValuesFromMousePosition.call($this, e);
setValuesFromMousePosition.call($this, e); }, 0);
}, 0); // Bind mousemove and mouseup event to the document so it responds when dragged of of the bar - we will unbind these when on mouseup to save processing
// Bind mousemove and mouseup event to the document so it responds when dragged of of the bar - we will unbind these when on mouseup to save processing $(document).bind('mousemove', mouseMove).bind('mouseup', mouseUp);
$(document).bind('mousemove', mouseMove).bind('mouseup', mouseUp); e.preventDefault(); // don't try to select anything or drag the image to the desktop
e.preventDefault(); // don't try to select anything or drag the image to the desktop }
} // set the values as the mouse moves
// set the values as the mouse moves function mouseMove (e) {
function mouseMove (e) { clearTimeout(timeout);
clearTimeout(timeout); timeout = setTimeout(function () {
timeout = setTimeout(function () { setValuesFromMousePosition.call($this, e);
setValuesFromMousePosition.call($this, e); }, 0);
}, 0); e.stopPropagation();
e.stopPropagation(); e.preventDefault();
e.preventDefault(); return false;
return false; }
} // unbind the document events - they aren't needed when not dragging
// unbind the document events - they aren't needed when not dragging function mouseUp (e) {
function mouseUp (e) { $(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove);
$(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove); e.stopPropagation();
e.stopPropagation(); e.preventDefault();
e.preventDefault(); return false;
return false; }
} // calculate mouse position and set value within the current range
// calculate mouse position and set value within the current range function setValuesFromMousePosition (e) {
function setValuesFromMousePosition (e) { const barW = bar.w, // local copies for YUI compressor
const barW = bar.w, // local copies for YUI compressor barH = bar.h;
barH = bar.h; let locX = e.pageX - offset.l,
let locX = e.pageX - offset.l, locY = e.pageY - offset.t;
locY = e.pageY - offset.t; // keep the arrow within the bounds of the bar
// keep the arrow within the bounds of the bar if (locX < 0) locX = 0;
if (locX < 0) locX = 0; else if (locX > barW) locX = barW;
else if (locX > barW) locX = barW; if (locY < 0) locY = 0;
if (locY < 0) locY = 0; else if (locY > barH) locY = barH;
else if (locY > barH) locY = barH; val.call($this, 'xy', {x: ((locX / barW) * rangeX) + minX, y: ((locY / barH) * rangeY) + minY});
val.call($this, 'xy', {x: ((locX / barW) * rangeX) + minX, y: ((locY / barH) * rangeY) + minY}); }
} function draw () {
function draw () { const
const barW = bar.w,
barW = bar.w, barH = bar.h,
barH = bar.h, arrowW = arrow.w,
arrowW = arrow.w, arrowH = arrow.h;
arrowH = arrow.h; let arrowOffsetX = 0,
let arrowOffsetX = 0, arrowOffsetY = 0;
arrowOffsetY = 0; setTimeout(function () {
setTimeout(function () { if (rangeX > 0) { // range is greater than zero
if (rangeX > 0) { // range is greater than zero // constrain to bounds
// constrain to bounds if (x === maxX) arrowOffsetX = barW;
if (x === maxX) arrowOffsetX = barW; else arrowOffsetX = ((x / rangeX) * barW) | 0;
else arrowOffsetX = ((x / rangeX) * barW) | 0; }
if (rangeY > 0) { // range is greater than zero
// constrain to bounds
if (y === maxY) arrowOffsetY = barH;
else arrowOffsetY = ((y / rangeY) * barH) | 0;
}
// if arrow width is greater than bar width, center arrow and prevent horizontal dragging
if (arrowW >= barW) arrowOffsetX = (barW >> 1) - (arrowW >> 1); // number >> 1 - superfast bitwise divide by two and truncate (move bits over one bit discarding lowest)
else arrowOffsetX -= arrowW >> 1;
// if arrow height is greater than bar height, center arrow and prevent vertical dragging
if (arrowH >= barH) arrowOffsetY = (barH >> 1) - (arrowH >> 1);
else arrowOffsetY -= arrowH >> 1;
// set the arrow position based on these offsets
arrow.css({left: arrowOffsetX + 'px', top: arrowOffsetY + 'px'});
}, 0);
}
function val (name, value, context) {
const set = value !== undefined;
if (!set) {
if (name === undefined || name == null) name = 'xy';
switch (name.toLowerCase()) {
case 'x': return x;
case 'y': return y;
case 'xy':
default: return {x, y};
}
} }
if (rangeY > 0) { // range is greater than zero if (context != null && context === $this) return;
// constrain to bounds let changed = false;
if (y === maxY) arrowOffsetY = barH;
else arrowOffsetY = ((y / rangeY) * barH) | 0; let newX, newY;
} if (name == null) name = 'xy';
// if arrow width is greater than bar width, center arrow and prevent horizontal dragging
if (arrowW >= barW) arrowOffsetX = (barW >> 1) - (arrowW >> 1); // number >> 1 - superfast bitwise divide by two and truncate (move bits over one bit discarding lowest)
else arrowOffsetX -= arrowW >> 1;
// if arrow height is greater than bar height, center arrow and prevent vertical dragging
if (arrowH >= barH) arrowOffsetY = (barH >> 1) - (arrowH >> 1);
else arrowOffsetY -= arrowH >> 1;
// set the arrow position based on these offsets
arrow.css({left: arrowOffsetX + 'px', top: arrowOffsetY + 'px'});
}, 0);
}
function val (name, value, context) {
const set = value !== undefined;
if (!set) {
if (name === undefined || name == null) name = 'xy';
switch (name.toLowerCase()) { switch (name.toLowerCase()) {
case 'x': return x; case 'x':
case 'y': return y; newX = (value && ((value.x && value.x | 0) || value | 0)) || 0;
break;
case 'y':
newY = (value && ((value.y && value.y | 0) || value | 0)) || 0;
break;
case 'xy': case 'xy':
default: return {x, y}; default:
newX = (value && value.x && value.x | 0) || 0;
newY = (value && value.y && value.y | 0) || 0;
break;
} }
} if (newX != null) {
if (context != null && context === $this) return; if (newX < minX) newX = minX;
let changed = false; else if (newX > maxX) newX = maxX;
if (x !== newX) {
let newX, newY; x = newX;
if (name == null) name = 'xy'; changed = true;
switch (name.toLowerCase()) { }
case 'x':
newX = (value && ((value.x && value.x | 0) || value | 0)) || 0;
break;
case 'y':
newY = (value && ((value.y && value.y | 0) || value | 0)) || 0;
break;
case 'xy':
default:
newX = (value && value.x && value.x | 0) || 0;
newY = (value && value.y && value.y | 0) || 0;
break;
}
if (newX != null) {
if (newX < minX) newX = minX;
else if (newX > maxX) newX = maxX;
if (x !== newX) {
x = newX;
changed = true;
} }
} if (newY != null) {
if (newY != null) { if (newY < minY) newY = minY;
if (newY < minY) newY = minY; else if (newY > maxY) newY = maxY;
else if (newY > maxY) newY = maxY; if (y !== newY) {
if (y !== newY) { y = newY;
y = newY; changed = true;
changed = true; }
} }
changed && fireChangeEvents.call($this, context || $this);
} }
changed && fireChangeEvents.call($this, context || $this); function range (name, value) {
} const set = value !== undefined;
function range (name, value) { if (!set) {
const set = value !== undefined; if (name === undefined || name == null) name = 'all';
if (!set) { switch (name.toLowerCase()) {
if (name === undefined || name == null) name = 'all'; case 'minx': return minX;
case 'maxx': return maxX;
case 'rangex': return {minX, maxX, rangeX};
case 'miny': return minY;
case 'maxy': return maxY;
case 'rangey': return {minY, maxY, rangeY};
case 'all':
default: return {minX, maxX, rangeX, minY, maxY, rangeY};
}
}
let // changed = false,
newMinX,
newMaxX,
newMinY,
newMaxY;
if (name == null) name = 'all';
switch (name.toLowerCase()) { switch (name.toLowerCase()) {
case 'minx': return minX; case 'minx':
case 'maxx': return maxX; newMinX = (value && ((value.minX && value.minX | 0) || value | 0)) || 0;
case 'rangex': return {minX, maxX, rangeX}; break;
case 'miny': return minY; case 'maxx':
case 'maxy': return maxY; newMaxX = (value && ((value.maxX && value.maxX | 0) || value | 0)) || 0;
case 'rangey': return {minY, maxY, rangeY}; break;
case 'rangex':
newMinX = (value && value.minX && value.minX | 0) || 0;
newMaxX = (value && value.maxX && value.maxX | 0) || 0;
break;
case 'miny':
newMinY = (value && ((value.minY && value.minY | 0) || value | 0)) || 0;
break;
case 'maxy':
newMaxY = (value && ((value.maxY && value.maxY | 0) || value | 0)) || 0;
break;
case 'rangey':
newMinY = (value && value.minY && value.minY | 0) || 0;
newMaxY = (value && value.maxY && value.maxY | 0) || 0;
break;
case 'all': case 'all':
default: return {minX, maxX, rangeX, minY, maxY, rangeY}; default:
newMinX = (value && value.minX && value.minX | 0) || 0;
newMaxX = (value && value.maxX && value.maxX | 0) || 0;
newMinY = (value && value.minY && value.minY | 0) || 0;
newMaxY = (value && value.maxY && value.maxY | 0) || 0;
break;
}
if (newMinX != null && minX !== newMinX) {
minX = newMinX;
rangeX = maxX - minX;
}
if (newMaxX != null && maxX !== newMaxX) {
maxX = newMaxX;
rangeX = maxX - minX;
}
if (newMinY != null && minY !== newMinY) {
minY = newMinY;
rangeY = maxY - minY;
}
if (newMaxY != null && maxY !== newMaxY) {
maxY = newMaxY;
rangeY = maxY - minY;
} }
} }
let // changed = false, function bind (callback) {
newMinX, if (typeof callback === 'function') changeEvents.push(callback);
newMaxX,
newMinY,
newMaxY;
if (name == null) name = 'all';
switch (name.toLowerCase()) {
case 'minx':
newMinX = (value && ((value.minX && value.minX | 0) || value | 0)) || 0;
break;
case 'maxx':
newMaxX = (value && ((value.maxX && value.maxX | 0) || value | 0)) || 0;
break;
case 'rangex':
newMinX = (value && value.minX && value.minX | 0) || 0;
newMaxX = (value && value.maxX && value.maxX | 0) || 0;
break;
case 'miny':
newMinY = (value && ((value.minY && value.minY | 0) || value | 0)) || 0;
break;
case 'maxy':
newMaxY = (value && ((value.maxY && value.maxY | 0) || value | 0)) || 0;
break;
case 'rangey':
newMinY = (value && value.minY && value.minY | 0) || 0;
newMaxY = (value && value.maxY && value.maxY | 0) || 0;
break;
case 'all':
default:
newMinX = (value && value.minX && value.minX | 0) || 0;
newMaxX = (value && value.maxX && value.maxX | 0) || 0;
newMinY = (value && value.minY && value.minY | 0) || 0;
newMaxY = (value && value.maxY && value.maxY | 0) || 0;
break;
} }
if (newMinX != null && minX !== newMinX) { function unbind (callback) {
minX = newMinX; if (typeof callback !== 'function') return;
rangeX = maxX - minX; let i;
while ((i = changeEvents.includes(callback))) changeEvents.splice(i, 1);
} }
if (newMaxX != null && maxX !== newMaxX) { function destroy () {
maxX = newMaxX; // unbind all possible events and null objects
rangeX = maxX - minX; $(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove);
bar.unbind('mousedown', mouseDown);
bar = null;
arrow = null;
changeEvents = null;
} }
if (newMinY != null && minY !== newMinY) { let offset,
minY = newMinY; timeout,
rangeY = maxY - minY; x = 0,
} y = 0,
if (newMaxY != null && maxY !== newMaxY) { minX = 0,
maxY = newMaxY; maxX = 100,
rangeY = maxY - minY; rangeX = 100,
} minY = 0,
} maxY = 100,
function bind (callback) { rangeY = 100,
if (typeof callback === 'function') changeEvents.push(callback); arrow = bar.find('img:first'), // the arrow image to drag
} changeEvents = [];
function unbind (callback) {
if (typeof callback !== 'function') return;
let i;
while ((i = changeEvents.includes(callback))) changeEvents.splice(i, 1);
}
function destroy () {
// unbind all possible events and null objects
$(document).unbind('mouseup', mouseUp).unbind('mousemove', mouseMove);
bar.unbind('mousedown', mouseDown);
bar = null;
arrow = null;
changeEvents = null;
}
let offset,
timeout,
x = 0,
y = 0,
minX = 0,
maxX = 100,
rangeX = 100,
minY = 0,
maxY = 100,
rangeY = 100,
arrow = bar.find('img:first'), // the arrow image to drag
changeEvents = [];
$.extend(true, $this, // public properties, methods, and event bindings - these we need to access from other controls $.extend(true, $this, // public properties, methods, and event bindings - these we need to access from other controls
{ {
val, val,
range, range,
bind, bind,
unbind, unbind,
destroy destroy
} }
); );
// initialize this control // initialize this control
arrow.src = options.arrow && options.arrow.image; arrow.src = options.arrow && options.arrow.image;
arrow.w = (options.arrow && options.arrow.width) || arrow.width(); arrow.w = (options.arrow && options.arrow.width) || arrow.width();
arrow.h = (options.arrow && options.arrow.height) || arrow.height(); arrow.h = (options.arrow && options.arrow.height) || arrow.height();
bar.w = (options.map && options.map.width) || bar.width(); bar.w = (options.map && options.map.width) || bar.width();
bar.h = (options.map && options.map.height) || bar.height(); bar.h = (options.map && options.map.height) || bar.height();
// bind mousedown event // bind mousedown event
bar.bind('mousedown', mouseDown); bar.bind('mousedown', mouseDown);
bind.call($this, draw); bind.call($this, draw);
}
} }
// controls for all the input elements for the typing in color values // controls for all the input elements for the typing in color values
function ColorValuePicker (picker, color, bindedHex, alphaPrecision) { function ColorValuePicker (picker, color, bindedHex, alphaPrecision) {
@@ -1047,6 +1050,7 @@ const jPicker = function ($) {
* *
* @param {"h"|"s"|"v"|"r"|"g"|"b"|"a"} colorMode [description] * @param {"h"|"s"|"v"|"r"|"g"|"b"|"a"} colorMode [description]
* @throws {Error} Invalid mode * @throws {Error} Invalid mode
* @returns {undefined}
*/ */
function setColorMode (colorMode) { function setColorMode (colorMode) {
const {active} = color, // local copies for YUI compressor const {active} = color, // local copies for YUI compressor

View File

@@ -30,7 +30,7 @@ const svg = document.createElementNS(NS.SVG, 'svg');
/** /**
* A (hopefully) quicker function to transform a point by a matrix * A (hopefully) quicker function to transform a point by a matrix
* (this function avoids any DOM calls and just does the math) * (this function avoids any DOM calls and just does the math).
* @function module:math.transformPoint * @function module:math.transformPoint
* @param {Float} x - Float representing the x coordinate * @param {Float} x - Float representing the x coordinate
* @param {Float} y - Float representing the y coordinate * @param {Float} y - Float representing the y coordinate
@@ -43,7 +43,7 @@ export const transformPoint = function (x, y, m) {
/** /**
* Helper function to check if the matrix performs no actual transform * Helper function to check if the matrix performs no actual transform
* (i.e. exists for identity purposes) * (i.e. exists for identity purposes).
* @function module:math.isIdentity * @function module:math.isIdentity
* @param {SVGMatrix} m - The matrix object to check * @param {SVGMatrix} m - The matrix object to check
* @returns {boolean} Indicates whether or not the matrix is 1,0,0,1,0,0 * @returns {boolean} Indicates whether or not the matrix is 1,0,0,1,0,0
@@ -54,7 +54,7 @@ export const isIdentity = function (m) {
/** /**
* This function tries to return a `SVGMatrix` that is the multiplication `m1 * m2`. * This function tries to return a `SVGMatrix` that is the multiplication `m1 * m2`.
* We also round to zero when it's near zero * We also round to zero when it's near zero.
* @function module:math.matrixMultiply * @function module:math.matrixMultiply
* @param {...SVGMatrix} args - Matrix objects to multiply * @param {...SVGMatrix} args - Matrix objects to multiply
* @returns {SVGMatrix} The matrix object resulting from the calculation * @returns {SVGMatrix} The matrix object resulting from the calculation
@@ -75,7 +75,7 @@ export const matrixMultiply = function (...args) {
}; };
/** /**
* See if the given transformlist includes a non-indentity matrix transform * See if the given transformlist includes a non-indentity matrix transform.
* @function module:math.hasMatrixTransform * @function module:math.hasMatrixTransform
* @param {SVGTransformList} [tlist] - The transformlist to check * @param {SVGTransformList} [tlist] - The transformlist to check
* @returns {boolean} Whether or not a matrix transform was found * @returns {boolean} Whether or not a matrix transform was found
@@ -104,7 +104,7 @@ export const hasMatrixTransform = function (tlist) {
*/ */
/** /**
* Transforms a rectangle based on the given matrix * Transforms a rectangle based on the given matrix.
* @function module:math.transformBox * @function module:math.transformBox
* @param {Float} l - Float with the box's left coordinate * @param {Float} l - Float with the box's left coordinate
* @param {Float} t - Float with the box's top coordinate * @param {Float} t - Float with the box's top coordinate
@@ -142,7 +142,7 @@ export const transformBox = function (l, t, w, h, m) {
* This returns a single matrix Transform for a given Transform List * This returns a single matrix Transform for a given Transform List
* (this is the equivalent of `SVGTransformList.consolidate()` but unlike * (this is the equivalent of `SVGTransformList.consolidate()` but unlike
* that method, this one does not modify the actual `SVGTransformList`). * that method, this one does not modify the actual `SVGTransformList`).
* This function is very liberal with its `min`, `max` arguments * This function is very liberal with its `min`, `max` arguments.
* @function module:math.transformListToTransform * @function module:math.transformListToTransform
* @param {SVGTransformList} tlist - The transformlist object * @param {SVGTransformList} tlist - The transformlist object
* @param {Integer} [min=0] - Optional integer indicating start transform position * @param {Integer} [min=0] - Optional integer indicating start transform position
@@ -172,7 +172,7 @@ export const transformListToTransform = function (tlist, min, max) {
}; };
/** /**
* Get the matrix object for a given element * Get the matrix object for a given element.
* @function module:math.getMatrix * @function module:math.getMatrix
* @param {Element} elem - The DOM element to check * @param {Element} elem - The DOM element to check
* @returns {SVGMatrix} The matrix object associated with the element's transformlist * @returns {SVGMatrix} The matrix object associated with the element's transformlist
@@ -184,11 +184,11 @@ export const getMatrix = function (elem) {
/** /**
* Returns a 45 degree angle coordinate associated with the two given * Returns a 45 degree angle coordinate associated with the two given
* coordinates * coordinates.
* @function module:math.snapToAngle * @function module:math.snapToAngle
* @param {Integer} x1 - First coordinate's x value * @param {Integer} x1 - First coordinate's x value
* @param {Integer} x2 - Second coordinate's x value
* @param {Integer} y1 - First coordinate's y value * @param {Integer} y1 - First coordinate's y value
* @param {Integer} x2 - Second coordinate's x value
* @param {Integer} y2 - Second coordinate's y value * @param {Integer} y2 - Second coordinate's y value
* @returns {module:math.AngleCoord45} * @returns {module:math.AngleCoord45}
*/ */
@@ -208,7 +208,7 @@ export const snapToAngle = function (x1, y1, x2, y2) {
}; };
/** /**
* Check if two rectangles (BBoxes objects) intersect each other * Check if two rectangles (BBoxes objects) intersect each other.
* @function module:math.rectsIntersect * @function module:math.rectsIntersect
* @param {SVGRect} r1 - The first BBox-like object * @param {SVGRect} r1 - The first BBox-like object
* @param {SVGRect} r2 - The second BBox-like object * @param {SVGRect} r2 - The second BBox-like object

View File

@@ -344,7 +344,7 @@ export const getPointFromGrip = function (pt, path) {
/** /**
* Requires prior call to `setUiStrings` if `xlink:title` * Requires prior call to `setUiStrings` if `xlink:title`
* to be set on the grip * to be set on the grip.
* @function module:path.addPointGrip * @function module:path.addPointGrip
* @param {Integer} index * @param {Integer} index
* @param {Integer} x * @param {Integer} x
@@ -409,7 +409,7 @@ export const getGripContainer = function () {
/** /**
* Requires prior call to `setUiStrings` if `xlink:title` * Requires prior call to `setUiStrings` if `xlink:title`
* to be set on the grip * to be set on the grip.
* @function module:path.addCtrlGrip * @function module:path.addCtrlGrip
* @param {string} id * @param {string} id
* @returns {SVGCircleElement} * @returns {SVGCircleElement}
@@ -533,6 +533,7 @@ export const getControlPoints = function (seg) {
* @param {Integer} index * @param {Integer} index
* @param {ArgumentsArray} pts * @param {ArgumentsArray} pts
* @param {SVGPathElement} elem * @param {SVGPathElement} elem
* @returns {undefined}
*/ */
export const replacePathSeg = function (type, index, pts, elem) { export const replacePathSeg = function (type, index, pts, elem) {
const pth = elem || path.elem; const pth = elem || path.elem;
@@ -616,7 +617,7 @@ export const getSegSelector = function (seg, update) {
*/ */
/** /**
* Takes three points and creates a smoother line based on them * Takes three points and creates a smoother line based on them.
* @function module:path.smoothControlPoints * @function module:path.smoothControlPoints
* @param {Point} ct1 - Object with x and y values (first control point) * @param {Point} ct1 - Object with x and y values (first control point)
* @param {Point} ct2 - Object with x and y values (second control point) * @param {Point} ct2 - Object with x and y values (second control point)
@@ -854,6 +855,7 @@ export class Segment {
/** /**
* @param {Integer} newType Possible values set during {@link module:path.init} * @param {Integer} newType Possible values set during {@link module:path.init}
* @param {ArgumentsArray} pts * @param {ArgumentsArray} pts
* @returns {undefined}
*/ */
setType (newType, pts) { setType (newType, pts) {
replacePathSeg(newType, this.index, pts); replacePathSeg(newType, this.index, pts);
@@ -870,7 +872,7 @@ export class Segment {
*/ */
export class Path { export class Path {
/** /**
* @param {SVGPathElement} * @param {SVGPathElement} elem
* @throws {Error} If constructed without a path element * @throws {Error} If constructed without a path element
*/ */
constructor (elem) { constructor (elem) {
@@ -887,7 +889,7 @@ export class Path {
} }
/** /**
* Reset path data * Reset path data.
* @returns {module:path.Path} * @returns {module:path.Path}
*/ */
init () { init () {
@@ -1131,7 +1133,7 @@ export class Path {
} }
/** /**
* Move selected points * Move selected points.
* @param {Integer} dx * @param {Integer} dx
* @param {Integer} dy * @param {Integer} dy
* @returns {undefined} * @returns {undefined}
@@ -1252,7 +1254,7 @@ export class Path {
} }
/** /**
* Update position of all points * Update position of all points.
* @returns {Path} * @returns {Path}
*/ */
update () { update () {
@@ -1494,7 +1496,7 @@ const pathMap = [0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a',
'H', 'h', 'V', 'v', 'S', 's', 'T', 't']; 'H', 'h', 'V', 'v', 'S', 's', 'T', 't'];
/** /**
* Convert a path to one with only absolute or relative values * Convert a path to one with only absolute or relative values.
* @todo move to pathActions.js * @todo move to pathActions.js
* @function module:path.convertPath * @function module:path.convertPath
* @param {SVGPathElement} path - the path to convert * @param {SVGPathElement} path - the path to convert
@@ -1655,11 +1657,11 @@ export const convertPath = function (path, toRel) {
}; };
/** /**
* TODO: refactor callers in convertPath to use getPathDFromSegments instead of this function. * TODO: refactor callers in `convertPath` to use `getPathDFromSegments` instead of this function.
* Legacy code refactored from svgcanvas.pathActions.convertPath * Legacy code refactored from `svgcanvas.pathActions.convertPath`.
* @param {string} letter - path segment command (letter in potentially either case from {@link module:path.pathMap}; see [SVGPathSeg#pathSegTypeAsLetter]{@link https://www.w3.org/TR/SVG/single-page.html#paths-__svg__SVGPathSeg__pathSegTypeAsLetter}) * @param {string} letter - path segment command (letter in potentially either case from {@link module:path.pathMap}; see [SVGPathSeg#pathSegTypeAsLetter]{@link https://www.w3.org/TR/SVG/single-page.html#paths-__svg__SVGPathSeg__pathSegTypeAsLetter})
* @param {Integer[][]} points - x,y points * @param {GenericArray<Integer>[]} points - x,y points
* @param {Integer[][]} [morePoints] - x,y points * @param {GenericArray<Integer>[]} [morePoints] - x,y points
* @param {Integer[]} [lastPoint] - x,y point * @param {Integer[]} [lastPoint] - x,y point
* @returns {string} * @returns {string}
*/ */
@@ -1695,7 +1697,7 @@ export const pathActions = (function () {
/** /**
* This function converts a polyline (created by the fh_path tool) into * This function converts a polyline (created by the fh_path tool) into
* a path element and coverts every three line segments into a single bezier * a path element and coverts every three line segments into a single bezier
* curve in an attempt to smooth out the free-hand * curve in an attempt to smooth out the free-hand.
* @function smoothPolylineIntoPath * @function smoothPolylineIntoPath
* @param {Element} element * @param {Element} element
* @returns {Element} * @returns {Element}
@@ -2215,7 +2217,7 @@ export const pathActions = (function () {
subpath = false; subpath = false;
}, },
/** /**
* @param {Element} element * @param {Element} elem
* @fires module:svgcanvas.SvgCanvas#event:selected * @fires module:svgcanvas.SvgCanvas#event:selected
* @returns {undefined} * @returns {undefined}
*/ */
@@ -2614,6 +2616,7 @@ export const pathActions = (function () {
*/ */
smoothPolylineIntoPath, smoothPolylineIntoPath,
/** /**
* @param {?Integer} v See {@link https://www.w3.org/TR/SVG/single-page.html#paths-InterfaceSVGPathSeg}
* @returns {undefined} * @returns {undefined}
*/ */
setSegType (v) { setSegType (v) {

View File

@@ -49,7 +49,7 @@ export const init = function (editorContext) {
}; };
/** /**
* Updates a `<clipPath>`s values based on the given translation of an element * Updates a `<clipPath>`s values based on the given translation of an element.
* @function module:recalculate.updateClipPath * @function module:recalculate.updateClipPath
* @param {string} attr - The clip-path attribute value with the clipPath's ID * @param {string} attr - The clip-path attribute value with the clipPath's ID
* @param {Float} tx - The translation's x value * @param {Float} tx - The translation's x value
@@ -69,7 +69,7 @@ export const updateClipPath = function (attr, tx, ty) {
}; };
/** /**
* Decides the course of action based on the element's transform list * Decides the course of action based on the element's transform list.
* @function module:recalculate.recalculateDimensions * @function module:recalculate.recalculateDimensions
* @param {Element} selected - The DOM element to recalculate * @param {Element} selected - The DOM element to recalculate
* @returns {Command} Undo command object with the resulting change * @returns {Command} Undo command object with the resulting change

View File

@@ -20,7 +20,7 @@ let selectorManager_; // A Singleton
const gripRadius = isTouch() ? 10 : 4; const gripRadius = isTouch() ? 10 : 4;
/** /**
* Private class for DOM element selection boxes * Private class for DOM element selection boxes.
*/ */
export class Selector { export class Selector {
/** /**
@@ -76,9 +76,10 @@ export class Selector {
} }
/** /**
* Used to reset the id and element that the selector is attached to * Used to reset the id and element that the selector is attached to.
* @param {Element} e - DOM element associated with this selector * @param {Element} e - DOM element associated with this selector
* @param {module:utilities.BBoxObject} bbox - Optional bbox to use for reset (prevents duplicate getBBox call). * @param {module:utilities.BBoxObject} bbox - Optional bbox to use for reset (prevents duplicate getBBox call).
* @returns {undefined}
*/ */
reset (e, bbox) { reset (e, bbox) {
this.locked = true; this.locked = true;
@@ -88,8 +89,9 @@ export class Selector {
} }
/** /**
* Updates cursors for corner grips on rotation so arrows point the right way * Updates cursors for corner grips on rotation so arrows point the right way.
* @param {Float} angle - Current rotation angle in degrees * @param {Float} angle - Current rotation angle in degrees
* @returns {undefined}
*/ */
updateGripCursors (angle) { updateGripCursors (angle) {
let dir; let dir;
@@ -111,9 +113,9 @@ export class Selector {
} }
/** /**
* Show the resize grips of this selector * Show the resize grips of this selector.
*
* @param {boolean} show - Indicates whether grips should be shown or not * @param {boolean} show - Indicates whether grips should be shown or not
* @returns {undefined}
*/ */
showGrips (show) { showGrips (show) {
const bShow = show ? 'inline' : 'none'; const bShow = show ? 'inline' : 'none';
@@ -127,8 +129,9 @@ export class Selector {
} }
/** /**
* Updates the selector to match the element's size * Updates the selector to match the element's size.
* @param {module:utilities.BBoxObject} [bbox] - BBox to use for resize (prevents duplicate getBBox call). * @param {module:utilities.BBoxObject} [bbox] - BBox to use for resize (prevents duplicate getBBox call).
* @returns {undefined}
*/ */
resize (bbox) { resize (bbox) {
const selectedBox = this.selectorRect, const selectedBox = this.selectorRect,
@@ -261,7 +264,7 @@ export class Selector {
} }
/** /**
* Manage all selector objects (selection boxes) * Manage all selector objects (selection boxes).
*/ */
export class SelectorManager { export class SelectorManager {
constructor () { constructor () {
@@ -297,7 +300,8 @@ export class SelectorManager {
} }
/** /**
* Resets the parent selector group element * Resets the parent selector group element.
* @returns {undefined}
*/ */
initGroup () { initGroup () {
// remove old selector parent group if it existed // remove old selector parent group if it existed
@@ -440,9 +444,10 @@ export class SelectorManager {
} }
/** /**
* Removes the selector of the given element (hides selection box) * Removes the selector of the given element (hides selection box).
* *
* @param {Element} elem - DOM element to remove the selector for * @param {Element} elem - DOM element to remove the selector for
* @returns {undefined}
*/ */
releaseSelector (elem) { releaseSelector (elem) {
if (elem == null) { return; } if (elem == null) { return; }

View File

@@ -314,7 +314,7 @@ export default function ($) {
} }
e.preventDefault(); e.preventDefault();
}, false); });
} }
}); });
}; };

View File

@@ -355,7 +355,7 @@ function getImportLocale ({defaultLang, defaultName}) {
*/ */
/** /**
* Store and retrieve preferences * Store and retrieve preferences.
* @param {string} key The preference name to be retrieved or set * @param {string} key The preference name to be retrieved or set
* @param {string} [val] The value. If the value supplied is missing or falsey, no change to the preference will be made. * @param {string} [val] The value. If the value supplied is missing or falsey, no change to the preference will be made.
* @returns {string} If val is missing or falsey, the value of the previously stored preference will be returned. * @returns {string} If val is missing or falsey, the value of the previously stored preference will be returned.
@@ -619,7 +619,7 @@ editor.randomizeIds = function (arg) {
}; };
/** /**
* Auto-run after a Promise microtask * Auto-run after a Promise microtask.
* @returns {undefined} * @returns {undefined}
*/ */
editor.init = function () { editor.init = function () {
@@ -747,7 +747,7 @@ editor.init = function () {
})(); })();
/** /**
* Called internally * Called internally.
* @param {string|Element|external:jQuery} elem * @param {string|Element|external:jQuery} elem
* @param {string|external:jQuery} iconId * @param {string|external:jQuery} iconId
* @param {Float} forcedSize Not in use * @param {Float} forcedSize Not in use
@@ -1789,11 +1789,11 @@ editor.init = function () {
} }
/** /**
* This is a common function used when a tool has been clicked (chosen) * This is a common function used when a tool has been clicked (chosen).
* It does several common things: * It does several common things:
* - removes the `tool_button_current` class from whatever tool currently has it * - Removes the `tool_button_current` class from whatever tool currently has it.
* - hides any flyouts * - Hides any flyouts.
* - adds the `tool_button_current` class to the button passed in * - Adds the `tool_button_current` class to the button passed in.
* @function module:SVGEDitor.toolButtonClick * @function module:SVGEDitor.toolButtonClick
* @param {string|Element} button The DOM element or string selector representing the toolbar button * @param {string|Element} button The DOM element or string selector representing the toolbar button
* @param {boolean} noHiding Whether not to hide any flyouts * @param {boolean} noHiding Whether not to hide any flyouts
@@ -1835,7 +1835,7 @@ editor.init = function () {
}; };
/** /**
* Set a selected image's URL * Set a selected image's URL.
* @function module:SVGEditor.setImageURL * @function module:SVGEditor.setImageURL
* @param {string} url * @param {string} url
* @returns {undefined} * @returns {undefined}
@@ -2771,7 +2771,7 @@ editor.init = function () {
const allHolders = {}; const allHolders = {};
/** /**
* @param {Object.<string, module:SVGEditor.ToolButton>} holders Key is a selector * @param {GenericObject.<string, module:SVGEditor.ToolButton>} holders Key is a selector
* @returns {undefined} * @returns {undefined}
*/ */
const setupFlyouts = function (holders) { const setupFlyouts = function (holders) {
@@ -2800,7 +2800,7 @@ editor.init = function () {
if (opts.isDefault) { def = i; } if (opts.isDefault) { def = i; }
/** /**
* Clicking the icon in flyout should set this set's icon * Clicking the icon in flyout should set this set's icon.
* @param {Event} ev * @param {Event} ev
* @returns {undefined} * @returns {undefined}
*/ */
@@ -4472,7 +4472,7 @@ editor.init = function () {
}; };
/** /**
* Save user preferences based on current values in the UI * Save user preferences based on current values in the UI.
* @function module:SVGEditor.savePreferences * @function module:SVGEditor.savePreferences
* @returns {undefined} * @returns {undefined}
*/ */
@@ -5013,7 +5013,7 @@ editor.init = function () {
}; };
/** /**
* If width is non-zero, then fully close it, otherwise fully open it * If width is non-zero, then fully close it; otherwise fully open it.
* @param {boolean} close Forces the side panel closed * @param {boolean} close Forces the side panel closed
* @returns {undefined} * @returns {undefined}
*/ */
@@ -5628,10 +5628,10 @@ editor.init = function () {
e.returnValue = uiStrings.notification.unsavedChanges; // Firefox needs this when beforeunload set by addEventListener (even though message is not used) e.returnValue = uiStrings.notification.unsavedChanges; // Firefox needs this when beforeunload set by addEventListener (even though message is not used)
return uiStrings.notification.unsavedChanges; return uiStrings.notification.unsavedChanges;
} }
}, false); });
/** /**
* Expose the uiStrings * Expose the `uiStrings`.
* @function module:SVGEditor.canvas.getUIStrings * @function module:SVGEditor.canvas.getUIStrings
* @returns {module:SVGEditor.uiStrings} * @returns {module:SVGEditor.uiStrings}
*/ */
@@ -5752,10 +5752,10 @@ editor.init = function () {
} }
}; };
workarea[0].addEventListener('dragenter', onDragEnter, false); workarea[0].addEventListener('dragenter', onDragEnter);
workarea[0].addEventListener('dragover', onDragOver, false); workarea[0].addEventListener('dragover', onDragOver);
workarea[0].addEventListener('dragleave', onDragLeave, false); workarea[0].addEventListener('dragleave', onDragLeave);
workarea[0].addEventListener('drop', importImage, false); workarea[0].addEventListener('drop', importImage);
const open = $('<input type="file">').click(function () { const open = $('<input type="file">').click(function () {
const f = this; const f = this;
@@ -5861,9 +5861,9 @@ editor.init = function () {
*/ */
{ {
/** /**
* Gets an array of results from extensions with a `addLangData` method * Gets an array of results from extensions with a `addLangData` method,
* returning an object with a `data` property set to its locales (to be * returning an object with a `data` property set to its locales (to be
* merged with regular locales) * merged with regular locales).
* @param {string} langParam * @param {string} langParam
* @fires module:svgcanvas.SvgCanvas#event:ext-addLangData * @fires module:svgcanvas.SvgCanvas#event:ext-addLangData
* @todo Can we forego this in favor of `langReady` (or forego `langReady`)? * @todo Can we forego this in favor of `langReady` (or forego `langReady`)?
@@ -5875,8 +5875,7 @@ editor.init = function () {
/** /**
* @function * @function
* @type {module:svgcanvas.ExtensionVarBuilder} * @type {module:svgcanvas.ExtensionVarBuilder}
* @param {string} defaultLang * @param {string} name
* @param {string} defaultName
* @returns {module:svgcanvas.SvgCanvas#event:ext-addLangData} * @returns {module:svgcanvas.SvgCanvas#event:ext-addLangData}
*/ */
(name) => { // We pass in a function as we don't know the extension name here when defining this `addLangData` method (name) => { // We pass in a function as we don't know the extension name here when defining this `addLangData` method
@@ -5908,7 +5907,7 @@ editor.init = function () {
/** /**
* Queues a callback to be invoked when the editor is ready (or * Queues a callback to be invoked when the editor is ready (or
* to be invoked immediately if it is already ready--i.e., * to be invoked immediately if it is already ready--i.e.,
* if `svgEditor.runCallbacks` has been run) * if `svgEditor.runCallbacks` has been run).
* @param {module:SVGEditor.ReadyCallback} cb Callback to be queued to invoke * @param {module:SVGEditor.ReadyCallback} cb Callback to be queued to invoke
* @returns {undefined} * @returns {undefined}
*/ */
@@ -5942,7 +5941,7 @@ editor.loadFromString = function (str) {
}; };
/** /**
* Not presently in use * Not presently in use.
* @param {PlainObject} featList * @param {PlainObject} featList
* @returns {undefined} * @returns {undefined}
*/ */

View File

@@ -81,7 +81,7 @@ if (window.opera) {
} }
/** /**
* The main SvgCanvas class that manages all SVG-related functions * The main SvgCanvas class that manages all SVG-related functions.
* @memberof module:svgcanvas * @memberof module:svgcanvas
* *
* @borrows module:coords.remapElement as #remapElement * @borrows module:coords.remapElement as #remapElement
@@ -200,7 +200,7 @@ clearSvgContentElement();
let idprefix = 'svg_'; let idprefix = 'svg_';
/** /**
* Changes the ID prefix to the given value * Changes the ID prefix to the given value.
* @function module:svgcanvas.SvgCanvas#setIdPrefix * @function module:svgcanvas.SvgCanvas#setIdPrefix
* @param {string} p - String with the new prefix * @param {string} p - String with the new prefix
* @returns {undefined} * @returns {undefined}
@@ -303,7 +303,7 @@ const getJsonFromSvgElement = this.getJsonFromSvgElement = function (data) {
}; };
/** /**
* This should really be an intersection implementing all rather than a union * This should really be an intersection implementing all rather than a union.
* @function module:svgcanvas.SvgCanvas#addSVGElementFromJson * @function module:svgcanvas.SvgCanvas#addSVGElementFromJson
* @implements {module:utilities.EditorContext#addSVGElementFromJson|module:path.EditorContext#addSVGElementFromJson} * @implements {module:utilities.EditorContext#addSVGElementFromJson|module:path.EditorContext#addSVGElementFromJson}
*/ */
@@ -382,13 +382,13 @@ unitsInit(
canvas.convertToNum = convertToNum; canvas.convertToNum = convertToNum;
/** /**
* This should really be an intersection implementing all rather than a union * This should really be an intersection implementing all rather than a union.
* @implements {module:draw.DrawCanvasInit#getSVGContent|module:utilities.EditorContext#getSVGContent} * @implements {module:draw.DrawCanvasInit#getSVGContent|module:utilities.EditorContext#getSVGContent}
*/ */
const getSVGContent = () => { return svgcontent; }; const getSVGContent = () => { return svgcontent; };
/** /**
* Should really be an intersection with all needing to apply rather than a union * Should really be an intersection with all needing to apply rather than a union.
* @function module:svgcanvas.SvgCanvas#getSelectedElements * @function module:svgcanvas.SvgCanvas#getSelectedElements
* @implements {module:utilities.EditorContext#getSelectedElements|module:draw.DrawCanvasInit#getSelectedElements|module:path.EditorContext#getSelectedElements} * @implements {module:utilities.EditorContext#getSelectedElements|module:draw.DrawCanvasInit#getSelectedElements|module:path.EditorContext#getSelectedElements}
*/ */
@@ -399,7 +399,7 @@ const getSelectedElements = this.getSelectedElems = function () {
const pathActions = pathModule.pathActions; const pathActions = pathModule.pathActions;
/** /**
* This should actually be an intersection as all interfaces should be met * This should actually be an intersection as all interfaces should be met.
* @implements {module:utilities.EditorContext#getSVGRoot|module:recalculate.EditorContext#getSVGRoot|module:coords.EditorContext#getSVGRoot|module:path.EditorContext#getSVGRoot} * @implements {module:utilities.EditorContext#getSVGRoot|module:recalculate.EditorContext#getSVGRoot|module:coords.EditorContext#getSVGRoot|module:path.EditorContext#getSVGRoot}
*/ */
const getSVGRoot = () => svgroot; const getSVGRoot = () => svgroot;
@@ -435,7 +435,7 @@ canvas.assignAttributes = assignAttributes;
this.cleanupElement = cleanupElement; this.cleanupElement = cleanupElement;
/** /**
* This should actually be an intersection not a union as all should apply * This should actually be an intersection not a union as all should apply.
* @implements {module:coords.EditorContext|module:path.EditorContext} * @implements {module:coords.EditorContext|module:path.EditorContext}
*/ */
const getGridSnapping = () => { return curConfig.gridSnapping; }; const getGridSnapping = () => { return curConfig.gridSnapping; };
@@ -541,7 +541,7 @@ const undoMgr = canvas.undoMgr = new UndoManager({
}); });
/** /**
* This should really be an intersection applying to all types rather than a union * This should really be an intersection applying to all types rather than a union.
* @function module:svgcanvas~addCommandToHistory * @function module:svgcanvas~addCommandToHistory
* @implements {module:path.EditorContext#addCommandToHistory|module:draw.DrawCanvasInit#addCommandToHistory} * @implements {module:path.EditorContext#addCommandToHistory|module:draw.DrawCanvasInit#addCommandToHistory}
*/ */
@@ -550,7 +550,7 @@ const addCommandToHistory = function (cmd) {
}; };
/** /**
* This should really be an intersection applying to all types rather than a union * This should really be an intersection applying to all types rather than a union.
* @function module:svgcanvas.SvgCanvas#getZoom * @function module:svgcanvas.SvgCanvas#getZoom
* @implements {module:path.EditorContext#getCurrentZoom|module:select.SVGFactory#getCurrentZoom} * @implements {module:path.EditorContext#getCurrentZoom|module:select.SVGFactory#getCurrentZoom}
*/ */
@@ -602,7 +602,7 @@ const getId = canvas.getId = function () {
}; };
/** /**
* The "implements" should really be an intersection applying to all types rather than a union * The "implements" should really be an intersection applying to all types rather than a union.
* @function module:svgcanvas.SvgCanvas#call * @function module:svgcanvas.SvgCanvas#call
* @implements {module:draw.DrawCanvasInit#call|module:path.EditorContext#call} * @implements {module:draw.DrawCanvasInit#call|module:path.EditorContext#call}
* @param {"selected"|"changed"|"contextset"|"pointsAdded"|"extension_added"|"extensions_added"|"message"|"transition"|"zoomed"|"updateCanvas"|"zoomDone"|"saved"|"exported"|"exportedPDF"|"setnonce"|"unsetnonce"|"cleared"} ev - String with the event name * @param {"selected"|"changed"|"contextset"|"pointsAdded"|"extension_added"|"extensions_added"|"message"|"transition"|"zoomed"|"updateCanvas"|"zoomDone"|"saved"|"exported"|"exportedPDF"|"setnonce"|"unsetnonce"|"cleared"} ev - String with the event name
@@ -617,7 +617,7 @@ const call = function (ev, arg) {
/** /**
* Clears the selection. The 'selected' handler is then optionally called. * Clears the selection. The 'selected' handler is then optionally called.
* This should really be an intersection applying to all types rather than a union * This should really be an intersection applying to all types rather than a union.
* @function module:svgcanvas.SvgCanvas#clearSelection * @function module:svgcanvas.SvgCanvas#clearSelection
* @implements {module:draw.DrawCanvasInit#clearSelection|module:path.EditorContext#clearSelection} * @implements {module:draw.DrawCanvasInit#clearSelection|module:path.EditorContext#clearSelection}
* @fires module:svgcanvas.SvgCanvas#event:selected * @fires module:svgcanvas.SvgCanvas#event:selected
@@ -818,6 +818,7 @@ pathModule.init(
* @param {SVGCircleElement[]} grips * @param {SVGCircleElement[]} grips
* @fires module:svgcanvas.SvgCanvas#event:pointsAdded * @fires module:svgcanvas.SvgCanvas#event:pointsAdded
* @fires module:svgcanvas.SvgCanvas#event:selected * @fires module:svgcanvas.SvgCanvas#event:selected
* @returns {undefined}
*/ */
addPtsToSelection ({closedSubpath, grips}) { addPtsToSelection ({closedSubpath, grips}) {
// TODO: Correct this: // TODO: Correct this:
@@ -1114,7 +1115,7 @@ const runExtensions = this.runExtensions = function (action, vars, returnArray)
* @returns {Promise} Resolves to [ExtensionInitResponse]{@link module:svgcanvas.ExtensionInitResponse} or `undefined` * @returns {Promise} Resolves to [ExtensionInitResponse]{@link module:svgcanvas.ExtensionInitResponse} or `undefined`
*/ */
/** /**
* Add an extension to the editor * Add an extension to the editor.
* @function module:svgcanvas.SvgCanvas#addExtension * @function module:svgcanvas.SvgCanvas#addExtension
* @param {string} name - String with the ID of the extension. Used internally; no need for i18n. * @param {string} name - String with the ID of the extension. Used internally; no need for i18n.
* @param {module:svgcanvas.ExtensionInitCallback} [extInitFunc] - Function supplied by the extension with its data * @param {module:svgcanvas.ExtensionInitCallback} [extInitFunc] - Function supplied by the extension with its data
@@ -1167,7 +1168,7 @@ this.addExtension = async function (name, extInitFunc, importLocale) {
* We brute-force `getIntersectionList` for browsers that do not support it (Firefox). * We brute-force `getIntersectionList` for browsers that do not support it (Firefox).
* *
* Reference: * Reference:
* Firefox does not implement `getIntersectionList()`, see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=501421} * Firefox does not implement `getIntersectionList()`, see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=501421}.
* @function module:svgcanvas.SvgCanvas#getIntersectionList * @function module:svgcanvas.SvgCanvas#getIntersectionList
* @param {SVGRect} rect * @param {SVGRect} rect
* @returns {Element[]|NodeList} Bbox elements * @returns {Element[]|NodeList} Bbox elements
@@ -1240,7 +1241,7 @@ this.getVisibleElements = getVisibleElements;
/** /**
* Get all elements that have a BBox (excludes `<defs>`, `<title>`, etc). * Get all elements that have a BBox (excludes `<defs>`, `<title>`, etc).
* Note that 0-opacity, off-screen etc elements are still considered "visible" * Note that 0-opacity, off-screen etc elements are still considered "visible"
* for this function * for this function.
* @function module:svgcanvas.SvgCanvas#getVisibleElementsAndBBoxes * @function module:svgcanvas.SvgCanvas#getVisibleElementsAndBBoxes
* @param {Element} parent - The parent DOM element to search within * @param {Element} parent - The parent DOM element to search within
* @returns {ElementAndBBox[]} An array with objects that include: * @returns {ElementAndBBox[]} An array with objects that include:
@@ -1259,7 +1260,7 @@ const getVisibleElementsAndBBoxes = this.getVisibleElementsAndBBoxes = function
}; };
/** /**
* Wrap an SVG element into a group element, mark the group as 'gsvg' * Wrap an SVG element into a group element, mark the group as 'gsvg'.
* @function module:svgcanvas.SvgCanvas#groupSvgElem * @function module:svgcanvas.SvgCanvas#groupSvgElem
* @param {Element} elem - SVG element to wrap * @param {Element} elem - SVG element to wrap
* @returns {undefined} * @returns {undefined}
@@ -1390,7 +1391,7 @@ canvas.call = call;
*/ */
/** /**
* Attaches a callback function to an event * Attaches a callback function to an event.
* @function module:svgcanvas.SvgCanvas#bind * @function module:svgcanvas.SvgCanvas#bind
* @param {"changed"|"contextset"|"selected"|"pointsAdded"|"extension_added"|"extensions_added"|"message"|"transition"|"zoomed"|"updateCanvas"|"zoomDone"|"saved"|"exported"|"exportedPDF"|"setnonce"|"unsetnonce"|"cleared"} ev - String indicating the name of the event * @param {"changed"|"contextset"|"selected"|"pointsAdded"|"extension_added"|"extensions_added"|"message"|"transition"|"zoomed"|"updateCanvas"|"zoomDone"|"saved"|"exported"|"exportedPDF"|"setnonce"|"unsetnonce"|"cleared"} ev - String indicating the name of the event
* @param {module:svgcanvas.EventHandler} f - The callback function to bind to the event * @param {module:svgcanvas.EventHandler} f - The callback function to bind to the event
@@ -1449,7 +1450,7 @@ const ffClone = function (elem) {
/** /**
* Removes any old rotations if present, prepends a new rotation at the * Removes any old rotations if present, prepends a new rotation at the
* transformed center * transformed center.
* @function module:svgcanvas.SvgCanvas#setRotationAngle * @function module:svgcanvas.SvgCanvas#setRotationAngle
* @param {string|Float} val - The new rotation angle in degrees * @param {string|Float} val - The new rotation angle in degrees
* @param {boolean} preventUndo - Indicates whether the action should be undoable or not * @param {boolean} preventUndo - Indicates whether the action should be undoable or not
@@ -1505,7 +1506,7 @@ this.setRotationAngle = function (val, preventUndo) {
/** /**
* Runs `recalculateDimensions` on the selected elements, * Runs `recalculateDimensions` on the selected elements,
* adding the changes to a single batch command * adding the changes to a single batch command.
* @function module:svgcanvas.SvgCanvas#recalculateAllSelectedDimensions * @function module:svgcanvas.SvgCanvas#recalculateAllSelectedDimensions
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
* @returns {undefined} * @returns {undefined}
@@ -1531,7 +1532,7 @@ const recalculateAllSelectedDimensions = this.recalculateAllSelectedDimensions =
}; };
/** /**
* Debug tool to easily see the current matrix in the browser's console * Debug tool to easily see the current matrix in the browser's console.
* @function module:svgcanvas~logMatrix * @function module:svgcanvas~logMatrix
* @param {SVGMatrix} m The matrix * @param {SVGMatrix} m The matrix
* @returns {undefined} * @returns {undefined}
@@ -1550,7 +1551,7 @@ let rootSctm = null;
// TODO: do we need to worry about selectedBBoxes here? // TODO: do we need to worry about selectedBBoxes here?
/** /**
* Selects only the given elements, shortcut for clearSelection(); addToSelection() * Selects only the given elements, shortcut for `clearSelection(); addToSelection()`.
* @function module:svgcanvas.SvgCanvas#selectOnly * @function module:svgcanvas.SvgCanvas#selectOnly
* @param {Element[]} elems - an array of DOM elements to be selected * @param {Element[]} elems - an array of DOM elements to be selected
* @param {boolean} showGrips - Indicates whether the resize grips should be shown * @param {boolean} showGrips - Indicates whether the resize grips should be shown
@@ -1669,10 +1670,11 @@ const getBsplinePoint = function (t) {
}; };
}; };
/** /**
* Follows these conditions:
* - When we are in a create mode, the element is added to the canvas but the * - When we are in a create mode, the element is added to the canvas but the
* action is not recorded until mousing up. * action is not recorded until mousing up.
* - When we are in select mode, select the element, remember the position * - When we are in select mode, select the element, remember the position
* and do nothing else * and do nothing else.
* @param {MouseEvent} evt * @param {MouseEvent} evt
* @fires module:svgcanvas.SvgCanvas#event:ext-mouseDown * @fires module:svgcanvas.SvgCanvas#event:ext-mouseDown
* @returns {undefined} * @returns {undefined}
@@ -3254,7 +3256,7 @@ return /** @lends module:svgcanvas.SvgCanvas#textActions */ {
setEndSelectionFromPoint(pt.x, pt.y); setEndSelectionFromPoint(pt.x, pt.y);
}, },
/** /**
* @param {external:MouseEvent} * @param {external:MouseEvent} evt
* @param {Float} mouseX * @param {Float} mouseX
* @param {Float} mouseY * @param {Float} mouseY
* @returns {undefined} * @returns {undefined}
@@ -3498,7 +3500,7 @@ const removeUnusedDefElems = this.removeUnusedDefElems = function () {
}; };
/** /**
* Main function to set up the SVG content for output * Main function to set up the SVG content for output.
* @function module:svgcanvas.SvgCanvas#svgCanvasToString * @function module:svgcanvas.SvgCanvas#svgCanvasToString
* @returns {string} The SVG image for output * @returns {string} The SVG image for output
*/ */
@@ -3552,7 +3554,7 @@ this.svgCanvasToString = function () {
}; };
/** /**
* Sub function ran on each SVG element to convert it to a string as desired * Sub function ran on each SVG element to convert it to a string as desired.
* @function module:svgcanvas.SvgCanvas#svgToString * @function module:svgcanvas.SvgCanvas#svgToString
* @param {Element} elem - The SVG element to convert * @param {Element} elem - The SVG element to convert
* @param {Integer} indent - Number of spaces to indent this tag * @param {Integer} indent - Number of spaces to indent this tag
@@ -3732,7 +3734,7 @@ this.svgToString = function (elem, indent) {
* @returns {undefined} * @returns {undefined}
*/ */
/** /**
* Converts a given image file to a data URL when possible, then runs a given callback * Converts a given image file to a data URL when possible, then runs a given callback.
* @function module:svgcanvas.SvgCanvas#embedImage * @function module:svgcanvas.SvgCanvas#embedImage
* @param {string} src - The path/URL of the image * @param {string} src - The path/URL of the image
* @param {module:svgcanvas.ImageEmbeddedCallback} [callback] - Function to run when image data is found * @param {module:svgcanvas.ImageEmbeddedCallback} [callback] - Function to run when image data is found
@@ -3768,7 +3770,7 @@ this.embedImage = function (src, callback) {
}; };
/** /**
* Sets a given URL to be a "last good image" URL * Sets a given URL to be a "last good image" URL.
* @function module:svgcanvas.SvgCanvas#setGoodImage * @function module:svgcanvas.SvgCanvas#setGoodImage
* @param {string} val * @param {string} val
* @returns {undefined} * @returns {undefined}
@@ -3778,7 +3780,7 @@ this.setGoodImage = function (val) {
}; };
/** /**
* Does nothing by default, handled by optional widget/extension * Does nothing by default, handled by optional widget/extension.
* @function module:svgcanvas.SvgCanvas#open * @function module:svgcanvas.SvgCanvas#open
* @returns {undefined} * @returns {undefined}
*/ */
@@ -3807,7 +3809,14 @@ this.save = function (opts) {
}; };
/** /**
* Codes only is useful for locale-independent detection * @typedef {GenericObject} module:svgcanvas.IssuesAndCodes
* @property {string[]} issueCodes The locale-independent code names
* @property {string[]} issues The localized descriptions
*/
/**
* Codes only is useful for locale-independent detection.
* @returns {module:svgcanvas.IssuesAndCodes}
*/ */
function getIssues () { function getIssues () {
// remove the selected outline before serializing // remove the selected outline before serializing
@@ -3865,7 +3874,7 @@ let canvg;
/** /**
* Generates a PNG (or JPG, BMP, WEBP) Data URL based on the current image, * Generates a PNG (or JPG, BMP, WEBP) Data URL based on the current image,
* then calls "exported" with an object including the string, image * then calls "exported" with an object including the string, image
* information, and any issues found * information, and any issues found.
* @function module:svgcanvas.SvgCanvas#rasterExport * @function module:svgcanvas.SvgCanvas#rasterExport
* @param {"PNG"|"JPEG"|"BMP"|"WEBP"|"ICO"} [imgType="PNG"] * @param {"PNG"|"JPEG"|"BMP"|"WEBP"|"ICO"} [imgType="PNG"]
* @param {Float} [quality] Between 0 and 1 * @param {Float} [quality] Between 0 and 1
@@ -3960,7 +3969,7 @@ this.rasterExport = function (imgType, quality, exportWindowName, cb, opts = {})
*/ */
/** /**
* Generates a PDF based on the current image, then calls "exportedPDF" with * Generates a PDF based on the current image, then calls "exportedPDF" with
* an object including the string, the data URL, and any issues found * an object including the string, the data URL, and any issues found.
* @function module:svgcanvas.SvgCanvas#exportPDF * @function module:svgcanvas.SvgCanvas#exportPDF
* @param {string} [exportWindowName] Will also be used for the download file name here * @param {string} [exportWindowName] Will also be used for the download file name here
* @param {external:jsPDF.OutputType} [outputType="dataurlstring"] * @param {external:jsPDF.OutputType} [outputType="dataurlstring"]
@@ -4048,7 +4057,7 @@ this.getSvgString = function () {
* This function determines whether to use a nonce in the prefix, when * This function determines whether to use a nonce in the prefix, when
* generating IDs for future documents in SVG-Edit. * generating IDs for future documents in SVG-Edit.
* If you're controlling SVG-Edit externally, and want randomized IDs, call * If you're controlling SVG-Edit externally, and want randomized IDs, call
* this BEFORE calling svgCanvas.setSvgString * this BEFORE calling `svgCanvas.setSvgString`.
* @function module:svgcanvas.SvgCanvas#randomizeIds * @function module:svgcanvas.SvgCanvas#randomizeIds
* @param {boolean} [enableRandomization] If true, adds a nonce to the prefix. Thus * @param {boolean} [enableRandomization] If true, adds a nonce to the prefix. Thus
* `svgCanvas.randomizeIds() <==> svgCanvas.randomizeIds(true)` * `svgCanvas.randomizeIds() <==> svgCanvas.randomizeIds(true)`
@@ -4063,7 +4072,7 @@ this.randomizeIds = function (enableRandomization) {
}; };
/** /**
* Ensure each element has a unique ID * Ensure each element has a unique ID.
* @function module:svgcanvas.SvgCanvas#uniquifyElems * @function module:svgcanvas.SvgCanvas#uniquifyElems
* @param {Element} g - The parent element of the tree to give unique IDs * @param {Element} g - The parent element of the tree to give unique IDs
* @returns {undefined} * @returns {undefined}
@@ -4157,7 +4166,7 @@ const uniquifyElems = this.uniquifyElems = function (g) {
}; };
/** /**
* Assigns reference data for each use element * Assigns reference data for each use element.
* @function module:svgcanvas.SvgCanvas#setUseData * @function module:svgcanvas.SvgCanvas#setUseData
* @param {Element} parent * @param {Element} parent
* @returns {undefined} * @returns {undefined}
@@ -4181,7 +4190,7 @@ const setUseData = this.setUseData = function (parent) {
}; };
/** /**
* Converts gradients from userSpaceOnUse to objectBoundingBox * Converts gradients from userSpaceOnUse to objectBoundingBox.
* @function module:svgcanvas.SvgCanvas#convertGradients * @function module:svgcanvas.SvgCanvas#convertGradients
* @param {Element} elem * @param {Element} elem
* @returns {undefined} * @returns {undefined}
@@ -4259,7 +4268,7 @@ const convertGradients = this.convertGradients = function (elem) {
}; };
/** /**
* Converts selected/given `<use>` or child SVG element to a group * Converts selected/given `<use>` or child SVG element to a group.
* @function module:svgcanvas.SvgCanvas#convertToGroup * @function module:svgcanvas.SvgCanvas#convertToGroup
* @param {Element} elem * @param {Element} elem
* @fires module:svgcanvas.SvgCanvas#event:selected * @fires module:svgcanvas.SvgCanvas#event:selected
@@ -4831,7 +4840,7 @@ this.getVersion = function () {
}; };
/** /**
* Update interface strings with given values * Update interface strings with given values.
* @function module:svgcanvas.SvgCanvas#setUiStrings * @function module:svgcanvas.SvgCanvas#setUiStrings
* @param {module:path.uiStrings} strs - Object with strings (see the [locales API]{@link module:locale.LocaleStrings} and the [tutorial]{@tutorial LocaleDocs}) * @param {module:path.uiStrings} strs - Object with strings (see the [locales API]{@link module:locale.LocaleStrings} and the [tutorial]{@tutorial LocaleDocs})
* @returns {undefined} * @returns {undefined}
@@ -4842,7 +4851,7 @@ this.setUiStrings = function (strs) {
}; };
/** /**
* Update configuration options with given values * Update configuration options with given values.
* @function module:svgcanvas.SvgCanvas#setConfig * @function module:svgcanvas.SvgCanvas#setConfig
* @param {module:SVGEditor.Config} opts - Object with options * @param {module:SVGEditor.Config} opts - Object with options
* @returns {undefined} * @returns {undefined}
@@ -4870,7 +4879,7 @@ this.getTitle = function (elem) {
}; };
/** /**
* Sets the group/SVG's title content * Sets the group/SVG's title content.
* @function module:svgcanvas.SvgCanvas#setGroupTitle * @function module:svgcanvas.SvgCanvas#setGroupTitle
* @param {string} val * @param {string} val
* @todo Combine this with `setDocumentTitle` * @todo Combine this with `setDocumentTitle`
@@ -4916,7 +4925,7 @@ const getDocumentTitle = this.getDocumentTitle = function () {
/** /**
* Adds/updates a title element for the document with the given name. * Adds/updates a title element for the document with the given name.
* This is an undoable action * This is an undoable action.
* @function module:svgcanvas.SvgCanvas#setDocumentTitle * @function module:svgcanvas.SvgCanvas#setDocumentTitle
* @param {string} newTitle - String with the new title * @param {string} newTitle - String with the new title
* @returns {undefined} * @returns {undefined}
@@ -4951,7 +4960,7 @@ this.setDocumentTitle = function (newTitle) {
}; };
/** /**
* Returns the editor's namespace URL, optionally adding it to the root element * Returns the editor's namespace URL, optionally adding it to the root element.
* @function module:svgcanvas.SvgCanvas#getEditorNS * @function module:svgcanvas.SvgCanvas#getEditorNS
* @param {boolean} [add] - Indicates whether or not to add the namespace value * @param {boolean} [add] - Indicates whether or not to add the namespace value
* @returns {string} The editor's namespace URL * @returns {string} The editor's namespace URL
@@ -4964,10 +4973,10 @@ this.getEditorNS = function (add) {
}; };
/** /**
* Changes the document's dimensions to the given size * Changes the document's dimensions to the given size.
* @function module:svgcanvas.SvgCanvas#setResolution * @function module:svgcanvas.SvgCanvas#setResolution
* @param {Float|"fit"} x - Number with the width of the new dimensions in user units. * @param {Float|"fit"} x - Number with the width of the new dimensions in user units.
* Can also be the string "fit" to indicate "fit to content" * Can also be the string "fit" to indicate "fit to content".
* @param {Float} y - Number with the height of the new dimensions in user units. * @param {Float} y - Number with the height of the new dimensions in user units.
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
* @returns {boolean} Indicates if resolution change was successful. * @returns {boolean} Indicates if resolution change was successful.
@@ -5047,7 +5056,7 @@ this.getOffset = function () {
* @property {module:utilities.BBoxObject} bbox * @property {module:utilities.BBoxObject} bbox
*/ */
/** /**
* Sets the zoom level on the canvas-side based on the given value * Sets the zoom level on the canvas-side based on the given value.
* @function module:svgcanvas.SvgCanvas#setBBoxZoom * @function module:svgcanvas.SvgCanvas#setBBoxZoom
* @param {"selection"|"canvas"|"content"|"layer"|module:SVGEditor.BBoxObjectWithFactor} val - Bounding box object to zoom to or string indicating zoom option. Note: the object value type is defined in `svg-editor.js` * @param {"selection"|"canvas"|"content"|"layer"|module:SVGEditor.BBoxObjectWithFactor} val - Bounding box object to zoom to or string indicating zoom option. Note: the object value type is defined in `svg-editor.js`
* @param {Integer} editorW - The editor's workarea box's width * @param {Integer} editorW - The editor's workarea box's width
@@ -5170,7 +5179,7 @@ this.setBBoxZoom = function (val, editorW, editorH) {
*/ */
/** /**
* Sets the zoom to the given level * Sets the zoom to the given level.
* @function module:svgcanvas.SvgCanvas#setZoom * @function module:svgcanvas.SvgCanvas#setZoom
* @param {Float} zoomLevel - Float indicating the zoom level to change to * @param {Float} zoomLevel - Float indicating the zoom level to change to
* @fires module:svgcanvas.SvgCanvas#event:ext-zoomChanged * @fires module:svgcanvas.SvgCanvas#event:ext-zoomChanged
@@ -5197,7 +5206,7 @@ this.getMode = function () {
}; };
/** /**
* Sets the editor's mode to the given string * Sets the editor's mode to the given string.
* @function module:svgcanvas.SvgCanvas#setMode * @function module:svgcanvas.SvgCanvas#setMode
* @param {string} name - String with the new mode to change to * @param {string} name - String with the new mode to change to
* @returns {undefined} * @returns {undefined}
@@ -5228,7 +5237,7 @@ this.getColor = function (type) {
}; };
/** /**
* Change the current stroke/fill color/gradient value * Change the current stroke/fill color/gradient value.
* @function module:svgcanvas.SvgCanvas#setColor * @function module:svgcanvas.SvgCanvas#setColor
* @param {string} type - String indicating fill or stroke * @param {string} type - String indicating fill or stroke
* @param {string} val - The value to set the stroke attribute to * @param {string} val - The value to set the stroke attribute to
@@ -5273,7 +5282,7 @@ this.setColor = function (type, val, preventUndo) {
}; };
/** /**
* Apply the current gradient to selected element's fill or stroke * Apply the current gradient to selected element's fill or stroke.
* @function module:svgcanvas.SvgCanvas#setGradient * @function module:svgcanvas.SvgCanvas#setGradient
* @param {"fill"|"stroke"} type - String indicating "fill" or "stroke" to apply to an element * @param {"fill"|"stroke"} type - String indicating "fill" or "stroke" to apply to an element
* @returns {undefined} * @returns {undefined}
@@ -5297,7 +5306,7 @@ const setGradient = this.setGradient = function (type) {
}; };
/** /**
* Check if exact gradient already exists * Check if exact gradient already exists.
* @function module:svgcanvas~findDuplicateGradient * @function module:svgcanvas~findDuplicateGradient
* @param {SVGGradientElement} grad - The gradient DOM element to compare to others * @param {SVGGradientElement} grad - The gradient DOM element to compare to others
* @returns {SVGGradientElement} The existing gradient if found, `null` if not * @returns {SVGGradientElement} The existing gradient if found, `null` if not
@@ -5358,7 +5367,7 @@ const findDuplicateGradient = function (grad) {
}; };
/** /**
* Set a color/gradient to a fill/stroke * Set a color/gradient to a fill/stroke.
* @function module:svgcanvas.SvgCanvas#setPaint * @function module:svgcanvas.SvgCanvas#setPaint
* @param {"fill"|"stroke"} type - String with "fill" or "stroke" * @param {"fill"|"stroke"} type - String with "fill" or "stroke"
* @param {module:jGraduate.jGraduatePaintOptions} paint - The jGraduate paint object to apply * @param {module:jGraduate.jGraduatePaintOptions} paint - The jGraduate paint object to apply
@@ -5411,7 +5420,7 @@ this.getStrokeWidth = function () {
/** /**
* Sets the stroke width for the current selected elements. * Sets the stroke width for the current selected elements.
* When attempting to set a line's width to 0, this changes it to 1 instead * When attempting to set a line's width to 0, this changes it to 1 instead.
* @function module:svgcanvas.SvgCanvas#setStrokeWidth * @function module:svgcanvas.SvgCanvas#setStrokeWidth
* @param {Float} val - A Float indicating the new stroke width value * @param {Float} val - A Float indicating the new stroke width value
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
@@ -5448,7 +5457,7 @@ this.setStrokeWidth = function (val) {
}; };
/** /**
* Set the given stroke-related attribute the given value for selected elements * Set the given stroke-related attribute the given value for selected elements.
* @function module:svgcanvas.SvgCanvas#setStrokeAttr * @function module:svgcanvas.SvgCanvas#setStrokeAttr
* @param {string} attr - String with the attribute name * @param {string} attr - String with the attribute name
* @param {string|Float} val - String or number with the attribute value * @param {string|Float} val - String or number with the attribute value
@@ -5504,7 +5513,7 @@ this.getStyle = function () {
this.getOpacity = getOpacity; this.getOpacity = getOpacity;
/** /**
* Sets the given opacity to the current selected elements * Sets the given opacity on the current selected elements.
* @function module:svgcanvas.SvgCanvas#setOpacity * @function module:svgcanvas.SvgCanvas#setOpacity
* @param {string} val * @param {string} val
* @returns {undefined} * @returns {undefined}
@@ -5531,7 +5540,7 @@ this.getStrokeOpacity = function () {
}; };
/** /**
* Sets the current fill/stroke opacity * Sets the current fill/stroke opacity.
* @function module:svgcanvas.SvgCanvas#setPaintOpacity * @function module:svgcanvas.SvgCanvas#setPaintOpacity
* @param {string} type - String with "fill" or "stroke" * @param {string} type - String with "fill" or "stroke"
* @param {Float} val - Float with the new opacity value * @param {Float} val - Float with the new opacity value
@@ -5548,7 +5557,7 @@ this.setPaintOpacity = function (type, val, preventUndo) {
}; };
/** /**
* Gets the current fill/stroke opacity * Gets the current fill/stroke opacity.
* @function module:svgcanvas.SvgCanvas#getPaintOpacity * @function module:svgcanvas.SvgCanvas#getPaintOpacity
* @param {"fill"|"stroke"} type - String with "fill" or "stroke" * @param {"fill"|"stroke"} type - String with "fill" or "stroke"
* @returns {Float} Fill/stroke opacity * @returns {Float} Fill/stroke opacity
@@ -5558,7 +5567,7 @@ this.getPaintOpacity = function (type) {
}; };
/** /**
* Gets the `stdDeviation` blur value of the given element * Gets the `stdDeviation` blur value of the given element.
* @function module:svgcanvas.SvgCanvas#getBlur * @function module:svgcanvas.SvgCanvas#getBlur
* @param {Element} elem - The element to check the blur value for * @param {Element} elem - The element to check the blur value for
* @returns {string} stdDeviation blur attribute value * @returns {string} stdDeviation blur attribute value
@@ -5585,7 +5594,7 @@ let filter = null;
let filterHidden = false; let filterHidden = false;
/** /**
* Sets the `stdDeviation` blur value on the selected element without being undoable * Sets the `stdDeviation` blur value on the selected element without being undoable.
* @function module:svgcanvas.SvgCanvas#setBlurNoUndo * @function module:svgcanvas.SvgCanvas#setBlurNoUndo
* @param {Float} val - The new `stdDeviation` value * @param {Float} val - The new `stdDeviation` value
* @returns {undefined} * @returns {undefined}
@@ -5625,7 +5634,7 @@ function finishChange () {
/** /**
* Sets the `x`, `y`, `width`, `height` values of the filter element in order to * Sets the `x`, `y`, `width`, `height` values of the filter element in order to
* make the blur not be clipped. Removes them if not neeeded * make the blur not be clipped. Removes them if not neeeded.
* @function module:svgcanvas.SvgCanvas#setBlurOffsets * @function module:svgcanvas.SvgCanvas#setBlurOffsets
* @param {Element} filter - The filter DOM element to update * @param {Element} filter - The filter DOM element to update
* @param {Float} stdDev - The standard deviation value on which to base the offset size * @param {Float} stdDev - The standard deviation value on which to base the offset size
@@ -5652,7 +5661,7 @@ canvas.setBlurOffsets = function (filter, stdDev) {
}; };
/** /**
* Adds/updates the blur filter to the selected element * Adds/updates the blur filter to the selected element.
* @function module:svgcanvas.SvgCanvas#setBlur * @function module:svgcanvas.SvgCanvas#setBlur
* @param {Float} val - Float with the new `stdDeviation` blur value * @param {Float} val - Float with the new `stdDeviation` blur value
* @param {boolean} complete - Whether or not the action should be completed (to add to the undo manager) * @param {boolean} complete - Whether or not the action should be completed (to add to the undo manager)
@@ -5721,7 +5730,7 @@ canvas.setBlur = function (val, complete) {
}()); }());
/** /**
* Check whether selected element is bold or not * Check whether selected element is bold or not.
* @function module:svgcanvas.SvgCanvas#getBold * @function module:svgcanvas.SvgCanvas#getBold
* @returns {boolean} Indicates whether or not element is bold * @returns {boolean} Indicates whether or not element is bold
*/ */
@@ -5736,7 +5745,7 @@ this.getBold = function () {
}; };
/** /**
* Make the selected element bold or normal * Make the selected element bold or normal.
* @function module:svgcanvas.SvgCanvas#setBold * @function module:svgcanvas.SvgCanvas#setBold
* @param {boolean} b - Indicates bold (`true`) or normal (`false`) * @param {boolean} b - Indicates bold (`true`) or normal (`false`)
* @returns {undefined} * @returns {undefined}
@@ -5753,7 +5762,7 @@ this.setBold = function (b) {
}; };
/** /**
* Check whether selected element is italic or not * Check whether selected element is in italics or not.
* @function module:svgcanvas.SvgCanvas#getItalic * @function module:svgcanvas.SvgCanvas#getItalic
* @returns {boolean} Indicates whether or not element is italic * @returns {boolean} Indicates whether or not element is italic
*/ */
@@ -5767,9 +5776,9 @@ this.getItalic = function () {
}; };
/** /**
* Make the selected element italic or normal * Make the selected element italic or normal.
* @function module:svgcanvas.SvgCanvas#setItalic * @function module:svgcanvas.SvgCanvas#setItalic
* @param {boolean} b - Indicates italic (`true`) or normal (`false`) * @param {boolean} i - Indicates italic (`true`) or normal (`false`)
* @returns {undefined} * @returns {undefined}
*/ */
this.setItalic = function (i) { this.setItalic = function (i) {
@@ -5792,7 +5801,7 @@ this.getFontFamily = function () {
}; };
/** /**
* Set the new font family * Set the new font family.
* @function module:svgcanvas.SvgCanvas#setFontFamily * @function module:svgcanvas.SvgCanvas#setFontFamily
* @param {string} val - String with the new font family * @param {string} val - String with the new font family
* @returns {undefined} * @returns {undefined}
@@ -5806,7 +5815,7 @@ this.setFontFamily = function (val) {
}; };
/** /**
* Set the new font color * Set the new font color.
* @function module:svgcanvas.SvgCanvas#setFontColor * @function module:svgcanvas.SvgCanvas#setFontColor
* @param {string} val - String with the new font color * @param {string} val - String with the new font color
* @returns {undefined} * @returns {undefined}
@@ -5833,7 +5842,7 @@ this.getFontSize = function () {
}; };
/** /**
* Applies the given font size to the selected element * Applies the given font size to the selected element.
* @function module:svgcanvas.SvgCanvas#setFontSize * @function module:svgcanvas.SvgCanvas#setFontSize
* @param {Float} val - Float with the new font size * @param {Float} val - Float with the new font size
* @returns {undefined} * @returns {undefined}
@@ -5857,7 +5866,7 @@ this.getText = function () {
}; };
/** /**
* Updates the text element with the given string * Updates the text element with the given string.
* @function module:svgcanvas.SvgCanvas#setTextContent * @function module:svgcanvas.SvgCanvas#setTextContent
* @param {string} val - String with the new text * @param {string} val - String with the new text
* @returns {undefined} * @returns {undefined}
@@ -5870,7 +5879,7 @@ this.setTextContent = function (val) {
/** /**
* Sets the new image URL for the selected image element. Updates its size if * Sets the new image URL for the selected image element. Updates its size if
* a new URL is given * a new URL is given.
* @function module:svgcanvas.SvgCanvas#setImageURL * @function module:svgcanvas.SvgCanvas#setImageURL
* @param {string} val - String with the image URL/path * @param {string} val - String with the image URL/path
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
@@ -5947,7 +5956,8 @@ this.setLinkURL = function (val) {
}; };
/** /**
* Sets the `rx` and `ry` values to the selected `rect` element to change its corner radius * Sets the `rx` and `ry` values to the selected `rect` element
* to change its corner radius.
* @function module:svgcanvas.SvgCanvas#setRectRadius * @function module:svgcanvas.SvgCanvas#setRectRadius
* @param {string|Float} val - The new radius * @param {string|Float} val - The new radius
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
@@ -5967,7 +5977,7 @@ this.setRectRadius = function (val) {
}; };
/** /**
* Wraps the selected element(s) in an anchor element or converts group to one * Wraps the selected element(s) in an anchor element or converts group to one.
* @function module:svgcanvas.SvgCanvas#makeHyperlink * @function module:svgcanvas.SvgCanvas#makeHyperlink
* @param {string} url * @param {string} url
* @returns {undefined} * @returns {undefined}
@@ -6002,7 +6012,7 @@ this.setSegType = function (newType) {
}; };
/** /**
* Convert selected element to a path, or get the BBox of an element-as-path * Convert selected element to a path, or get the BBox of an element-as-path.
* @function module:svgcanvas.SvgCanvas#convertToPath * @function module:svgcanvas.SvgCanvas#convertToPath
* @todo (codedread): Remove the getBBox argument and split this function into two. * @todo (codedread): Remove the getBBox argument and split this function into two.
* @param {Element} elem - The DOM element to be converted * @param {Element} elem - The DOM element to be converted
@@ -6166,7 +6176,7 @@ const changeSelectedAttributeNoUndo = function (attr, newValue, elems) {
* subset to this function in the `elems` argument. * subset to this function in the `elems` argument.
* @function module:svgcanvas.SvgCanvas#changeSelectedAttribute * @function module:svgcanvas.SvgCanvas#changeSelectedAttribute
* @param {string} attr - String with the attribute name * @param {string} attr - String with the attribute name
* @param {string|Float} newValue - String or number with the new attribute value * @param {string|Float} val - String or number with the new attribute value
* @param {Element[]} elems - The DOM elements to apply the change to * @param {Element[]} elems - The DOM elements to apply the change to
* @returns {undefined} * @returns {undefined}
*/ */
@@ -6185,7 +6195,7 @@ const changeSelectedAttribute = this.changeSelectedAttribute = function (attr, v
/** /**
* Removes all selected elements from the DOM and adds the change to the * Removes all selected elements from the DOM and adds the change to the
* history stack * history stack.
* @function module:svgcanvas.SvgCanvas#deleteSelectedElements * @function module:svgcanvas.SvgCanvas#deleteSelectedElements
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
* @returns {undefined} * @returns {undefined}
@@ -6228,7 +6238,7 @@ this.deleteSelectedElements = function () {
/** /**
* Removes all selected elements from the DOM and adds the change to the * Removes all selected elements from the DOM and adds the change to the
* history stack. Remembers removed elements on the clipboard * history stack. Remembers removed elements on the clipboard.
* @function module:svgcanvas.SvgCanvas#cutSelectedElements * @function module:svgcanvas.SvgCanvas#cutSelectedElements
* @returns {undefined} * @returns {undefined}
*/ */
@@ -6238,7 +6248,7 @@ this.cutSelectedElements = function () {
}; };
/** /**
* Remembers the current selected elements on the clipboard * Remembers the current selected elements on the clipboard.
* @function module:svgcanvas.SvgCanvas#copySelectedElements * @function module:svgcanvas.SvgCanvas#copySelectedElements
* @returns {undefined} * @returns {undefined}
*/ */
@@ -6353,7 +6363,7 @@ this.pasteElements = function (type, x, y) {
}; };
/** /**
* Wraps all the selected elements in a group (`g`) element * Wraps all the selected elements in a group (`g`) element.
* @function module:svgcanvas.SvgCanvas#groupSelectedElements * @function module:svgcanvas.SvgCanvas#groupSelectedElements
* @param {"a"|"g"} [type="g"] - type of element to group into, defaults to `<g>` * @param {"a"|"g"} [type="g"] - type of element to group into, defaults to `<g>`
* @param {string} [urlArg] * @param {string} [urlArg]
@@ -6413,7 +6423,7 @@ this.groupSelectedElements = function (type, urlArg) {
/** /**
* Pushes all appropriate parent group properties down to its children, then * Pushes all appropriate parent group properties down to its children, then
* removes them from the group * removes them from the group.
* @function module:svgcanvas.SvgCanvas#pushGroupProperties * @function module:svgcanvas.SvgCanvas#pushGroupProperties
* @param {SVGAElement|SVGGElement} g * @param {SVGAElement|SVGGElement} g
* @param {boolean} undoable * @param {boolean} undoable
@@ -6600,7 +6610,7 @@ const pushGroupProperties = this.pushGroupProperties = function (g, undoable) {
/** /**
* Unwraps all the elements in a selected group (`g`) element. This requires * Unwraps all the elements in a selected group (`g`) element. This requires
* significant recalculations to apply group's transforms, etc. to its children * significant recalculations to apply group's transforms, etc. to its children.
* @function module:svgcanvas.SvgCanvas#ungroupSelectedElement * @function module:svgcanvas.SvgCanvas#ungroupSelectedElement
* @returns {undefined} * @returns {undefined}
*/ */
@@ -6671,7 +6681,7 @@ this.ungroupSelectedElement = function () {
/** /**
* Repositions the selected element to the bottom in the DOM to appear on top of * Repositions the selected element to the bottom in the DOM to appear on top of
* other elements * other elements.
* @function module:svgcanvas.SvgCanvas#moveToTopSelectedElement * @function module:svgcanvas.SvgCanvas#moveToTopSelectedElement
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
* @returns {undefined} * @returns {undefined}
@@ -6694,7 +6704,7 @@ this.moveToTopSelectedElement = function () {
/** /**
* Repositions the selected element to the top in the DOM to appear under * Repositions the selected element to the top in the DOM to appear under
* other elements * other elements.
* @function module:svgcanvas.SvgCanvas#moveToBottomSelectedElement * @function module:svgcanvas.SvgCanvas#moveToBottomSelectedElement
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
* @returns {undefined} * @returns {undefined}
@@ -6726,7 +6736,7 @@ this.moveToBottomSelectedElement = function () {
/** /**
* Moves the select element up or down the stack, based on the visibly * Moves the select element up or down the stack, based on the visibly
* intersecting elements * intersecting elements.
* @function module:svgcanvas.SvgCanvas#moveUpDownSelected * @function module:svgcanvas.SvgCanvas#moveUpDownSelected
* @param {"Up"|"Down"} dir - String that's either 'Up' or 'Down' * @param {"Up"|"Down"} dir - String that's either 'Up' or 'Down'
* @fires module:svgcanvas.SvgCanvas#event:changed * @fires module:svgcanvas.SvgCanvas#event:changed
@@ -6767,7 +6777,7 @@ this.moveUpDownSelected = function (dir) {
}; };
/** /**
* Moves selected elements on the X/Y axis * Moves selected elements on the X/Y axis.
* @function module:svgcanvas.SvgCanvas#moveSelectedElements * @function module:svgcanvas.SvgCanvas#moveSelectedElements
* @param {Float} dx - Float with the distance to move on the x-axis * @param {Float} dx - Float with the distance to move on the x-axis
* @param {Float} dy - Float with the distance to move on the y-axis * @param {Float} dy - Float with the distance to move on the y-axis
@@ -6838,7 +6848,7 @@ this.moveSelectedElements = function (dx, dy, undoable) {
/** /**
* Create deep DOM copies (clones) of all selected elements and move them slightly * Create deep DOM copies (clones) of all selected elements and move them slightly
* from their originals * from their originals.
* @function module:svgcanvas.SvgCanvas#cloneSelectedElements * @function module:svgcanvas.SvgCanvas#cloneSelectedElements
* @param {Float} x Float with the distance to move on the x-axis * @param {Float} x Float with the distance to move on the x-axis
* @param {Float} y Float with the distance to move on the y-axis * @param {Float} y Float with the distance to move on the y-axis
@@ -6879,7 +6889,7 @@ this.cloneSelectedElements = function (x, y) {
}; };
/** /**
* Aligns selected elements * Aligns selected elements.
* @function module:svgcanvas.SvgCanvas#alignSelectedElements * @function module:svgcanvas.SvgCanvas#alignSelectedElements
* @param {string} type - String with single character indicating the alignment type * @param {string} type - String with single character indicating the alignment type
* @param {"selected"|"largest"|"smallest"|"page"} relativeTo * @param {"selected"|"largest"|"smallest"|"page"} relativeTo
@@ -7001,7 +7011,7 @@ this.contentH = getResolution().h;
*/ */
/** /**
* Updates the editor canvas width/height/position after a zoom has occurred * Updates the editor canvas width/height/position after a zoom has occurred.
* @function module:svgcanvas.SvgCanvas#updateCanvas * @function module:svgcanvas.SvgCanvas#updateCanvas
* @param {Float} w - Float with the new width * @param {Float} w - Float with the new width
* @param {Float} h - Float with the new height * @param {Float} h - Float with the new height
@@ -7064,7 +7074,7 @@ this.updateCanvas = function (w, h) {
}; };
/** /**
* Set the background of the editor (NOT the actual document) * Set the background of the editor (NOT the actual document).
* @function module:svgcanvas.SvgCanvas#setBackground * @function module:svgcanvas.SvgCanvas#setBackground
* @param {string} color - String with fill color to apply * @param {string} color - String with fill color to apply
* @param {string} url - URL or path to image to use * @param {string} url - URL or path to image to use
@@ -7094,7 +7104,7 @@ this.setBackground = function (color, url) {
}; };
/** /**
* Select the next/previous element within the current layer * Select the next/previous element within the current layer.
* @function module:svgcanvas.SvgCanvas#cycleElement * @function module:svgcanvas.SvgCanvas#cycleElement
* @param {boolean} next - true = next and false = previous element * @param {boolean} next - true = next and false = previous element
* @fires module:svgcanvas.SvgCanvas#event:selected * @fires module:svgcanvas.SvgCanvas#event:selected

View File

@@ -94,6 +94,7 @@ $(function() {
/** /**
* @function module:jQuerySVGIcons.jQuerySVGIcons * @function module:jQuerySVGIcons.jQuerySVGIcons
* @param {external:jQuery} $ Its keys include all icon IDs and the values, the icon as a jQuery object * @param {external:jQuery} $ Its keys include all icon IDs and the values, the icon as a jQuery object
* @returns {external:jQuery} The enhanced jQuery object
*/ */
export default function ($) { export default function ($) {
const svgIcons = {}; const svgIcons = {};
@@ -102,27 +103,28 @@ export default function ($) {
/** /**
* @function external:jQuery.svgIcons * @function external:jQuery.svgIcons
* @param {string} file The location of a local SVG or SVGz file * @param {string} file The location of a local SVG or SVGz file
* @param {PlainObject} [options] * @param {PlainObject} [opts]
* @param {Float} [options.w] The icon widths * @param {Float} [opts.w] The icon widths
* @param {Float} [options.h] The icon heights * @param {Float} [opts.h] The icon heights
* @param {PlainObject.<string, string>} [options.fallback] List of raster images with each * @param {PlainObject.<string, string>} [opts.fallback] List of raster images with each
key being the SVG icon ID to replace, and the value the image file name key being the SVG icon ID to replace, and the value the image file name
* @param {string} [options.fallback_path] The path to use for all images * @param {string} [opts.fallback_path] The path to use for all images
listed under "fallback" listed under "fallback"
* @param {boolean} [options.replace] If set to `true`, HTML elements will be replaced by, * @param {boolean} [opts.replace] If set to `true`, HTML elements will be replaced by,
rather than include the SVG icon. rather than include the SVG icon.
* @param {PlainObject.<string, string>} [options.placement] List with selectors for keys and SVG icon ids * @param {PlainObject.<string, string>} [opts.placement] List with selectors for keys and SVG icon ids
as values. This provides a custom method of adding icons. as values. This provides a custom method of adding icons.
* @param {PlainObject.<string, module:jQuerySVGIcons.Size>} [options.resize] List with selectors for keys and numbers * @param {PlainObject.<string, module:jQuerySVGIcons.Size>} [opts.resize] List with selectors for keys and numbers
as values. This allows an easy way to resize specific icons. as values. This allows an easy way to resize specific icons.
* @param {module:jQuerySVGIcons.SVGIconsLoadedCallback} [options.callback] A function to call when all icons have been loaded. * @param {module:jQuerySVGIcons.SVGIconsLoadedCallback} [opts.callback] A function to call when all icons have been loaded.
* @param {boolean} [options.id_match=true] Automatically attempt to match SVG icon ids with * @param {boolean} [opts.id_match=true] Automatically attempt to match SVG icon ids with
corresponding HTML id corresponding HTML id
* @param {boolean} [options.no_img] Prevent attempting to convert the icon into an `<img>` * @param {boolean} [opts.no_img] Prevent attempting to convert the icon into an `<img>`
element (may be faster, help for browser consistency) element (may be faster, help for browser consistency)
* @param {boolean} [options.svgz] Indicate that the file is an SVGZ file, and thus not to * @param {boolean} [opts.svgz] Indicate that the file is an SVGZ file, and thus not to
parse as XML. SVGZ files add compression benefits, but getting data from parse as XML. SVGZ files add compression benefits, but getting data from
them fails in Firefox 2 and older. them fails in Firefox 2 and older.
* @returns {undefined}
*/ */
$.svgIcons = function (file, opts = {}) { $.svgIcons = function (file, opts = {}) {
const svgns = 'http://www.w3.org/2000/svg', const svgns = 'http://www.w3.org/2000/svg',

View File

@@ -337,7 +337,7 @@ export let removeElementFromListMap = function (elem) {
}; };
/** /**
* Returns an object that behaves like a `SVGTransformList` for the given DOM element * Returns an object that behaves like a `SVGTransformList` for the given DOM element.
* @function module:SVGTransformList.getTransformList * @function module:SVGTransformList.getTransformList
* @param {Element} elem - DOM element to get a transformlist from * @param {Element} elem - DOM element to get a transformlist from
* @todo The polyfill should have `SVGAnimatedTransformList` and this should use it * @todo The polyfill should have `SVGAnimatedTransformList` and this should use it
@@ -372,7 +372,7 @@ export const getTransformList = function (elem) {
* @param {Element} elem * @param {Element} elem
*/ */
/** /**
* For unit-testing * Replace `removeElementFromListMap` for unit-testing.
* @function module:SVGTransformList.changeRemoveElementFromListMap * @function module:SVGTransformList.changeRemoveElementFromListMap
* @param {module:SVGTransformList.removeElementFromListMap} cb Passed a single argument `elem` * @param {module:SVGTransformList.removeElementFromListMap} cb Passed a single argument `elem`
* @returns {undefined} * @returns {undefined}

View File

@@ -20,10 +20,10 @@
* This should only be used for objects known to be potentially arbitrary in form. * This should only be used for objects known to be potentially arbitrary in form.
* For those whose determination has not yet been made, simply use type `object` * For those whose determination has not yet been made, simply use type `object`
* (or type `?` if it may also be a primitive). * (or type `?` if it may also be a primitive).
* @typedef {object} ArbitraryObject * @typedef {Object} ArbitraryObject
*/ */
/** /**
* @typedef {object} ArbitraryModule * @typedef {Object} ArbitraryModule
*/ */
/** /**
* This should only be used for objects known to be potentially arbitrary in form, * This should only be used for objects known to be potentially arbitrary in form,

View File

@@ -144,8 +144,10 @@ export const shortFloat = function (val) {
}; };
/** /**
* Converts the number to given unit or baseUnit * Converts the number to given unit or baseUnit.
* @function module:units.convertUnit * @function module:units.convertUnit
* @param {string|Float} val
* @param {"em"|"ex"|"in"|"cm"|"mm"|"pt"|"pc"|"px"|"%"} [unit]
* @returns {Float} * @returns {Float}
*/ */
export const convertUnit = function (val, unit) { export const convertUnit = function (val, unit) {
@@ -212,7 +214,7 @@ const attrsToConvert = {
}; };
/** /**
* Converts all applicable attributes to the configured baseUnit * Converts all applicable attributes to the configured baseUnit.
* @function module:units.convertAttrs * @function module:units.convertAttrs
* @param {Element} element - A DOM element whose attributes should be converted * @param {Element} element - A DOM element whose attributes should be converted
* @returns {undefined} * @returns {undefined}
@@ -240,7 +242,7 @@ export const convertAttrs = function (element) {
/** /**
* Converts given values to numbers. Attributes must be supplied in * Converts given values to numbers. Attributes must be supplied in
* case a percentage is given * case a percentage is given.
* *
* @function module:units.convertToNum * @function module:units.convertToNum
* @param {string} attr - Name of the attribute associated with the value * @param {string} attr - Name of the attribute associated with the value
@@ -271,10 +273,11 @@ export const convertToNum = function (attr, val) {
}; };
/** /**
* Check if an attribute's value is in a valid format * Check if an attribute's value is in a valid format.
* @function module:units.isValidUnit * @function module:units.isValidUnit
* @param {string} attr - The name of the attribute associated with the value * @param {string} attr - The name of the attribute associated with the value
* @param {string} val - The attribute value to check * @param {string} val - The attribute value to check
* @param {Element} selectedElement
* @returns {boolean} Whether the unit is valid * @returns {boolean} Whether the unit is valid
*/ */
export const isValidUnit = function (attr, val, selectedElement) { export const isValidUnit = function (attr, val, selectedElement) {

View File

@@ -103,7 +103,7 @@ export const init = function (editorContext) {
}; };
/** /**
* Used to prevent the [Billion laughs attack]{@link https://en.wikipedia.org/wiki/Billion_laughs_attack} * Used to prevent the [Billion laughs attack]{@link https://en.wikipedia.org/wiki/Billion_laughs_attack}.
* @function module:utilities.dropXMLInteralSubset * @function module:utilities.dropXMLInteralSubset
* @param {string} str String to be processed * @param {string} str String to be processed
* @returns {string} The string with entity declarations in the internal subset removed * @returns {string} The string with entity declarations in the internal subset removed
@@ -145,7 +145,7 @@ export const fromXml = function (str) {
// also precalculate the size of the array needed. // also precalculate the size of the array needed.
/** /**
* Converts a string to base64 * Converts a string to base64.
* @function module:utilities.encode64 * @function module:utilities.encode64
* @param {string} input * @param {string} input
* @returns {string} Base64 output * @returns {string} Base64 output
@@ -188,7 +188,7 @@ export const encode64 = function (input) {
}; };
/** /**
* Converts a string from base64 * Converts a string from base64.
* @function module:utilities.decode64 * @function module:utilities.decode64
* @param {string} input Base64-encoded input * @param {string} input Base64-encoded input
* @returns {string} Decoded output * @returns {string} Decoded output
@@ -246,7 +246,7 @@ export const encodeUTF8 = function (argString) {
}; };
/** /**
* convert dataURL to object URL * Convert dataURL to object URL.
* @function module:utilities.dataURLToObjectURL * @function module:utilities.dataURLToObjectURL
* @param {string} dataurl * @param {string} dataurl
* @returns {string} object URL or empty string * @returns {string} object URL or empty string
@@ -267,7 +267,7 @@ export const dataURLToObjectURL = function (dataurl) {
}; };
/** /**
* get object URL for a blob object * Get object URL for a blob object.
* @function module:utilities.createObjectURL * @function module:utilities.createObjectURL
* @param {Blob} blob A Blob object or File object * @param {Blob} blob A Blob object or File object
* @returns {string} object URL or empty string * @returns {string} object URL or empty string
@@ -291,7 +291,7 @@ export const blankPageObjectURL = (function () {
})(); })();
/** /**
* Converts a string to use XML references (for non-ASCII) * Converts a string to use XML references (for non-ASCII).
* @function module:utilities.convertToXMLReferences * @function module:utilities.convertToXMLReferences
* @param {string} input * @param {string} input
* @returns {string} Decimal numeric character references * @returns {string} Decimal numeric character references
@@ -310,8 +310,8 @@ export const convertToXMLReferences = function (input) {
}; };
/** /**
* Cross-browser compatible method of converting a string to an XML tree * Cross-browser compatible method of converting a string to an XML tree.
* found this function [here]{@link http://groups.google.com/group/jquery-dev/browse_thread/thread/c6d11387c580a77f} * Found this function [here]{@link http://groups.google.com/group/jquery-dev/browse_thread/thread/c6d11387c580a77f}.
* @function module:utilities.text2xml * @function module:utilities.text2xml
* @param {string} sXML * @param {string} sXML
* @throws {Error} * @throws {Error}
@@ -364,7 +364,7 @@ export const bboxToObj = function ({x, y, width, height}) {
*/ */
/** /**
* Walks the tree and executes the callback on each element in a top-down fashion * Walks the tree and executes the callback on each element in a top-down fashion.
* @function module:utilities.walkTree * @function module:utilities.walkTree
* @param {Element} elem - DOM element to traverse * @param {Element} elem - DOM element to traverse
* @param {module:utilities.TreeWalker} cbFn - Callback function to run on each element * @param {module:utilities.TreeWalker} cbFn - Callback function to run on each element
@@ -381,7 +381,7 @@ export const walkTree = function (elem, cbFn) {
}; };
/** /**
* Walks the tree and executes the callback on each element in a depth-first fashion * Walks the tree and executes the callback on each element in a depth-first fashion.
* @function module:utilities.walkTreePost * @function module:utilities.walkTreePost
* @todo FIXME: Shouldn't this be calling walkTreePost? * @todo FIXME: Shouldn't this be calling walkTreePost?
* @param {Element} elem - DOM element to traverse * @param {Element} elem - DOM element to traverse
@@ -435,7 +435,7 @@ export let getHref = function (elem) {
}; };
/** /**
* Sets the given element's `xlink:href` value * Sets the given element's `xlink:href` value.
* @function module:utilities.setHref * @function module:utilities.setHref
* @param {Element} elem * @param {Element} elem
* @param {string} val * @param {string} val
@@ -471,7 +471,7 @@ export const findDefs = function () {
/** /**
* Get correct BBox for a path in Webkit. * Get correct BBox for a path in Webkit.
* Converted from code found [here]{@link http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html} * Converted from code found [here]{@link http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html}.
* @function module:utilities.getPathBBox * @function module:utilities.getPathBBox
* @param {SVGPathElement} path - The path DOM element to get the BBox for * @param {SVGPathElement} path - The path DOM element to get the BBox for
* @returns {module:utilities.BBoxObject} A BBox-like object * @returns {module:utilities.BBoxObject} A BBox-like object
@@ -595,7 +595,7 @@ function groupBBFix (selected) {
/** /**
* Get the given/selected element's bounding box object, convert it to be more * Get the given/selected element's bounding box object, convert it to be more
* usable when necessary * usable when necessary.
* @function module:utilities.getBBox * @function module:utilities.getBBox
* @param {Element} elem - Optional DOM element to get the BBox for * @param {Element} elem - Optional DOM element to get the BBox for
* @returns {module:utilities.BBoxObject} Bounding box object * @returns {module:utilities.BBoxObject} Bounding box object
@@ -808,7 +808,7 @@ export const getExtraAttributesForConvertToPath = function (elem) {
}; };
/** /**
* Get the BBox of an element-as-path * Get the BBox of an element-as-path.
* @function module:utilities.getBBoxOfElementAsPath * @function module:utilities.getBBoxOfElementAsPath
* @param {Element} elem - The DOM element to be probed * @param {Element} elem - The DOM element to be probed
* @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson * @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson
@@ -1027,7 +1027,7 @@ function getStrokeOffsetForBBox (elem) {
*/ */
/** /**
* Get the bounding box for one or more stroked and/or transformed elements * Get the bounding box for one or more stroked and/or transformed elements.
* @function module:utilities.getStrokedBBox * @function module:utilities.getStrokedBBox
* @param {Element[]} elems - Array with DOM elements to check * @param {Element[]} elems - Array with DOM elements to check
* @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson * @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson
@@ -1088,7 +1088,7 @@ export const getStrokedBBox = function (elems, addSVGElementFromJson, pathAction
/** /**
* Get all elements that have a BBox (excludes `<defs>`, `<title>`, etc). * Get all elements that have a BBox (excludes `<defs>`, `<title>`, etc).
* Note that 0-opacity, off-screen etc elements are still considered "visible" * Note that 0-opacity, off-screen etc elements are still considered "visible"
* for this function * for this function.
* @function module:utilities.getVisibleElements * @function module:utilities.getVisibleElements
* @param {Element} parent - The parent DOM element to search within * @param {Element} parent - The parent DOM element to search within
* @returns {Element[]} All "visible" elements. * @returns {Element[]} All "visible" elements.
@@ -1108,7 +1108,7 @@ export const getVisibleElements = function (parent) {
}; };
/** /**
* Get the bounding box for one or more stroked and/or transformed elements * Get the bounding box for one or more stroked and/or transformed elements.
* @function module:utilities.getStrokedBBoxDefaultVisible * @function module:utilities.getStrokedBBoxDefaultVisible
* @param {Element[]} elems - Array with DOM elements to check * @param {Element[]} elems - Array with DOM elements to check
* @returns {module:utilities.BBoxObject} A single bounding box object * @returns {module:utilities.BBoxObject} A single bounding box object
@@ -1142,7 +1142,7 @@ export const getRotationAngleFromTransformList = function (tlist, toRad) {
}; };
/** /**
* Get the rotation angle of the given/selected DOM element * Get the rotation angle of the given/selected DOM element.
* @function module:utilities.getRotationAngle * @function module:utilities.getRotationAngle
* @param {Element} [elem] - DOM element to get the angle for. Default to first of selected elements. * @param {Element} [elem] - DOM element to get the angle for. Default to first of selected elements.
* @param {boolean} [toRad=false] - When true returns the value in radians rather than degrees * @param {boolean} [toRad=false] - When true returns the value in radians rather than degrees
@@ -1156,7 +1156,7 @@ export let getRotationAngle = function (elem, toRad) {
}; };
/** /**
* Get the reference element associated with the given attribute value * Get the reference element associated with the given attribute value.
* @function module:utilities.getRefElem * @function module:utilities.getRefElem
* @param {string} attrVal - The attribute value as a string * @param {string} attrVal - The attribute value as a string
* @returns {Element} Reference element * @returns {Element} Reference element
@@ -1216,7 +1216,7 @@ export const assignAttributes = function (elem, attrs, suspendLength, unitCheck)
}; };
/** /**
* Remove unneeded (default) attributes, makes resulting SVG smaller * Remove unneeded (default) attributes, making resulting SVG smaller.
* @function module:utilities.cleanupElement * @function module:utilities.cleanupElement
* @param {Element} element - DOM element to clean up * @param {Element} element - DOM element to clean up
* @returns {undefined} * @returns {undefined}
@@ -1251,7 +1251,7 @@ export const cleanupElement = function (element) {
}; };
/** /**
* Round value to for snapping * Round value to for snapping.
* @function module:utilities.snapToGrid * @function module:utilities.snapToGrid
* @param {Float} value * @param {Float} value
* @returns {Integer} * @returns {Integer}
@@ -1267,7 +1267,7 @@ export const snapToGrid = function (value) {
}; };
/** /**
* Escapes special characters in a regular expression * Escapes special characters in a regular expression.
* @function module:utilities.regexEscape * @function module:utilities.regexEscape
* @param {string} str * @param {string} str
* @returns {string} * @returns {string}
@@ -1278,7 +1278,7 @@ export const regexEscape = function (str) {
}; };
/** /**
* Prevents default browser click behaviour on the given element * Prevents default browser click behaviour on the given element.
* @function module:utilities.preventClickDefault * @function module:utilities.preventClickDefault
* @param {Element} img - The DOM element to prevent the click on * @param {Element} img - The DOM element to prevent the click on
* @returns {undefined} * @returns {undefined}
@@ -1292,7 +1292,7 @@ export const preventClickDefault = function (img) {
* @returns {string} The ID * @returns {string} The ID
*/ */
/** /**
* Create a clone of an element, updating its ID and its children's IDs when needed * Create a clone of an element, updating its ID and its children's IDs when needed.
* @function module:utilities.copyElem * @function module:utilities.copyElem
* @param {Element} el - DOM element to clone * @param {Element} el - DOM element to clone
* @param {module:utilities.GetNextID} getNextId - The getter of the next unique ID. * @param {module:utilities.GetNextID} getNextId - The getter of the next unique ID.
@@ -1344,7 +1344,7 @@ export const copyElem = function (el, getNextId) {
}; };
/** /**
* Unit testing * Overwrite methods for unit testing.
* @function module:utilities.mock * @function module:utilities.mock
* @returns {undefined} * @returns {undefined}
*/ */

File diff suppressed because it is too large Load Diff

View File

@@ -20,8 +20,8 @@ let results = await Promise.all(fileMatchPatterns.map(async (fileMatchPattern) =
{ {
// We grab to the end of the line as the `line` result for `find-in-files` // We grab to the end of the line as the `line` result for `find-in-files`
// only grabs from the beginning of the file to the end of the match. // only grabs from the beginning of the file to the end of the match.
term: `(@[^{\\n]*{[^}\\n]*(\\bobject|\\barray\\b|function|\\bnumber|\\*)[^}\\n]*}|@.*{}).*`, term: `(@[^{\\n]*{[^}\\n]*(\\bobject|\\barray\\b|[^.]function|\\bnumber|\\*)[^}\\n]*}|@.*{}).*`,
flags: 'g' flags: 'gi'
}, },
fileMatchPattern, fileMatchPattern,
'([^n]|[^i]n|[^m]in|[^.]min).js$' '([^n]|[^i]n|[^m]in|[^.]min).js$'
@@ -73,8 +73,9 @@ function reduceFalseMatches (file, res) {
res.line = res.line.filter((line) => { res.line = res.line.filter((line) => {
return ![ return ![
'* @typedef {number} Float', '* @typedef {number} Float',
'* @typedef {object} ArbitraryObject', '* @typedef {Object} ArbitraryObject',
'* @typedef {object} ArbitraryModule', '* @typedef {Object} ArbitraryModule',
'* @typedef {Array} GenericArray',
'* @typedef {*} Any', '* @typedef {*} Any',
'* @param {...*} args Signature dependent on the function', '* @param {...*} args Signature dependent on the function',
'* @returns {*} Return dependent on the function' '* @returns {*} Return dependent on the function'

View File

@@ -124,10 +124,10 @@ Slide.prototype = {
const _t = this; const _t = this;
if (canTransition()) { if (canTransition()) {
const l = function (evt) { const l = function (evt) {
elem.parentNode.removeEventListener(transitionEnd, l, false); elem.parentNode.removeEventListener(transitionEnd, l);
_t._runAutos(); _t._runAutos();
}; };
elem.parentNode.addEventListener(transitionEnd, l, false); elem.parentNode.addEventListener(transitionEnd, l);
elem.classList.remove('to-build'); elem.classList.remove('to-build');
} else { } else {
setTimeout(function () { setTimeout(function () {
@@ -161,17 +161,17 @@ const SlideShow = function (slides) {
this.current = isNaN(this.current) ? 1 : this.current; this.current = isNaN(this.current) ? 1 : this.current;
const _t = this; const _t = this;
doc.addEventListener('keydown', doc.addEventListener('keydown',
function (e) { _t.handleKeys(e); }, false); function (e) { _t.handleKeys(e); });
doc.addEventListener('mousewheel', doc.addEventListener('mousewheel',
function (e) { _t.handleWheel(e); }, false); function (e) { _t.handleWheel(e); });
doc.addEventListener('DOMMouseScroll', doc.addEventListener('DOMMouseScroll',
function (e) { _t.handleWheel(e); }, false); function (e) { _t.handleWheel(e); });
doc.addEventListener('touchstart', doc.addEventListener('touchstart',
function (e) { _t.handleTouchStart(e); }, false); function (e) { _t.handleTouchStart(e); });
doc.addEventListener('touchend', doc.addEventListener('touchend',
function (e) { _t.handleTouchEnd(e); }, false); function (e) { _t.handleTouchEnd(e); });
window.addEventListener('popstate', window.addEventListener('popstate',
function (e) { _t.go(e.state); }, false); function (e) { _t.go(e.state); });
this._update(); this._update();
}; };
@@ -274,10 +274,10 @@ SlideShow.prototype = {
// Initialize // Initialize
/* const slideshow = */ new SlideShow(query('.slide')); // eslint-disable-line no-new /* const slideshow = */ new SlideShow(query('.slide')); // eslint-disable-line no-new
document.querySelector('#toggle-counter').addEventListener('click', toggleCounter, false); document.querySelector('#toggle-counter').addEventListener('click', toggleCounter);
document.querySelector('#toggle-size').addEventListener('click', toggleSize, false); document.querySelector('#toggle-size').addEventListener('click', toggleSize);
document.querySelector('#toggle-transitions').addEventListener('click', toggleTransitions, false); document.querySelector('#toggle-transitions').addEventListener('click', toggleTransitions);
document.querySelector('#toggle-gradients').addEventListener('click', toggleGradients, false); document.querySelector('#toggle-gradients').addEventListener('click', toggleGradients);
const counters = document.querySelectorAll('.counter'); const counters = document.querySelectorAll('.counter');
const slides = document.querySelectorAll('.slide'); const slides = document.querySelectorAll('.slide');

File diff suppressed because it is too large Load Diff

View File

@@ -8,6 +8,7 @@
* @param {Float} expected * @param {Float} expected
* @param {Float} maxDifference (the maximum inclusive difference allowed between the actual and expected numbers) * @param {Float} maxDifference (the maximum inclusive difference allowed between the actual and expected numbers)
* @param {string} [message] Defaults to structured message * @param {string} [message] Defaults to structured message
* @returns {undefined}
*/ */
function close (actual, expected, maxDifference, message) { function close (actual, expected, maxDifference, message) {
const actualDiff = (actual === expected) ? 0 : Math.abs(actual - expected), const actualDiff = (actual === expected) ? 0 : Math.abs(actual - expected),
@@ -26,6 +27,7 @@ function close (actual, expected, maxDifference, message) {
* @param {Float} expected * @param {Float} expected
* @param {Float} maxPercentDifference (the maximum inclusive difference percentage allowed between the actual and expected numbers) * @param {Float} maxPercentDifference (the maximum inclusive difference percentage allowed between the actual and expected numbers)
* @param {string} [message] Defaults to a structured message * @param {string} [message] Defaults to a structured message
* @returns {undefined}
*/ */
function closePercent (actual, expected, maxPercentDifference, message) { function closePercent (actual, expected, maxPercentDifference, message) {
let actualDiff, result; let actualDiff, result;
@@ -55,6 +57,7 @@ function closePercent (actual, expected, maxPercentDifference, message) {
* @param {Float} expected * @param {Float} expected
* @param {Float} minDifference (the minimum exclusive difference allowed between the actual and expected numbers) * @param {Float} minDifference (the minimum exclusive difference allowed between the actual and expected numbers)
* @param {string} [message] Defaults to structured message * @param {string} [message] Defaults to structured message
* @returns {undefined}
*/ */
function notClose (actual, expected, minDifference, message) { function notClose (actual, expected, minDifference, message) {
const actualDiff = Math.abs(actual - expected), const actualDiff = Math.abs(actual - expected),
@@ -73,6 +76,7 @@ function notClose (actual, expected, minDifference, message) {
* @param {Float} expected * @param {Float} expected
* @param {Float} minPercentDifference (the minimum exclusive difference percentage allowed between the actual and expected numbers) * @param {Float} minPercentDifference (the minimum exclusive difference percentage allowed between the actual and expected numbers)
* @param {string} [message] Defaults to a structured message * @param {string} [message] Defaults to a structured message
* @returns {undefined}
*/ */
function notClosePercent (actual, expected, minPercentDifference, message) { function notClosePercent (actual, expected, minPercentDifference, message) {
let actualDiff, result; let actualDiff, result;