').append(btn.title);\n }\n } else if (btn.list) {\n // Add button to list\n button.addClass('push_button');\n $('#' + btn.list + '_opts').append(button);\n if (btn.isDefault) {\n $('#cur_' + btn.list).append(button.children().clone());\n const svgicon = btn.svgicon || btn.id;\n placementObj['#cur_' + btn.list] = svgicon;\n }\n } else if (btn.includeWith) {\n // Add to flyout menu / make flyout menu\n const opts = btn.includeWith;\n // opts.button, default, position\n refBtn = $(opts.button);\n\n flyoutHolder = refBtn.parent();\n // Create a flyout menu if there isn't one already\n let tlsId;\n if (!refBtn.parent().hasClass('tools_flyout')) {\n // Create flyout placeholder\n tlsId = refBtn[0].id.replace('tool_', 'tools_');\n showBtn = refBtn.clone()\n .attr('id', tlsId + '_show')\n .append($('
', {class: 'flyout_arrow_horiz'}));\n\n refBtn.before(showBtn);\n // Create a flyout div\n flyoutHolder = makeFlyoutHolder(tlsId, refBtn);\n }\n\n refData = Actions.getButtonData(opts.button);\n\n if (opts.isDefault) {\n placementObj['#' + tlsId + '_show'] = btn.id;\n }\n // TODO: Find way to set the current icon using the iconloader if this is not default\n\n // Include data for extension button as well as ref button\n const curH = holders['#' + flyoutHolder[0].id] = [{\n sel: '#' + id,\n fn: btn.events.click,\n icon: btn.id,\n key: btn.key,\n isDefault: Boolean(btn.includeWith && btn.includeWith.isDefault)\n }, refData];\n\n // {sel:'#tool_rect', fn: clickRect, evt: 'mouseup', key: 4, parent: '#tools_rect', icon: 'rect'}\n\n const pos = ('position' in opts) ? opts.position : 'last';\n const len = flyoutHolder.children().length;\n\n // Add at given position or end\n if (!isNaN(pos) && pos >= 0 && pos < len) {\n flyoutHolder.children().eq(pos).before(button);\n } else {\n flyoutHolder.append(button);\n curH.reverse();\n }\n }\n\n if (!svgicons) {\n button.append(icon);\n }\n\n if (!btn.list) {\n // Add given events to button\n $.each(btn.events, function (name, func) {\n if (name === 'click' && btn.type === 'mode') {\n // `touch.js` changes `touchstart` to `mousedown`,\n // so we must map extension click events as well\n if (isTouch() && name === 'click') {\n name = 'mousedown';\n }\n if (btn.includeWith) {\n button.bind(name, func);\n } else {\n button.bind(name, function () {\n if (toolButtonClick(button)) {\n func();\n }\n });\n }\n if (btn.key) {\n $(document).bind('keydown', btn.key, func);\n if (btn.title) {\n button.attr('title', btn.title + ' [' + btn.key + ']');\n }\n }\n } else {\n button.bind(name, func);\n }\n });\n }\n\n setupFlyouts(holders);\n });\n\n $.each(btnSelects, function () {\n addAltDropDown(this.elem, this.list, this.callback, {seticon: true});\n });\n\n if (svgicons) {\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n $.svgIcons(svgicons, {\n w: 24, h: 24,\n id_match: false,\n no_img: (!isWebkit()),\n fallback: fallbackObj,\n placement: placementObj,\n callback (icons) {\n // Non-ideal hack to make the icon match the current size\n // if (curPrefs.iconsize && curPrefs.iconsize !== 'm') {\n if (editor.pref('iconsize') !== 'm') {\n prepResize();\n }\n runCallback();\n resolve();\n }\n });\n });\n }\n }\n return runCallback();\n };\n\n /**\n * @param {string} color\n * @param {Float} opac\n * @param {string} type\n * @returns {module:jGraduate~Paint}\n */\n const getPaint = function (color, opac, type) {\n // update the editor's fill paint\n const opts = {alpha: opac};\n if (color.startsWith('url(#')) {\n let refElem = svgCanvas.getRefElem(color);\n if (refElem) {\n refElem = refElem.cloneNode(true);\n } else {\n refElem = $('#' + type + '_color defs *')[0];\n }\n opts[refElem.tagName] = refElem;\n } else if (color.startsWith('#')) {\n opts.solidColor = color.substr(1);\n } else {\n opts.solidColor = 'none';\n }\n return new $.jGraduate.Paint(opts);\n };\n\n // $('#text').focus(function () { textBeingEntered = true; });\n // $('#text').blur(function () { textBeingEntered = false; });\n\n // bind the selected event to our function that handles updates to the UI\n svgCanvas.bind('selected', selectedChanged);\n svgCanvas.bind('transition', elementTransition);\n svgCanvas.bind('changed', elementChanged);\n svgCanvas.bind('saved', saveHandler);\n svgCanvas.bind('exported', exportHandler);\n svgCanvas.bind('exportedPDF', function (win, data) {\n if (!data.output) { // Ignore Chrome\n return;\n }\n const {exportWindowName} = data;\n if (exportWindowName) {\n exportWindow = window.open('', exportWindowName); // A hack to get the window via JSON-able name without opening a new one\n }\n if (!exportWindow || exportWindow.closed) {\n /* await */ $.alert(uiStrings.notification.popupWindowBlocked);\n return;\n }\n exportWindow.location.href = data.output;\n });\n svgCanvas.bind('zoomed', zoomChanged);\n svgCanvas.bind('zoomDone', zoomDone);\n svgCanvas.bind(\n 'updateCanvas',\n /**\n * @param {external:Window} win\n * @param {PlainObject} centerInfo\n * @param {false} centerInfo.center\n * @param {module:math.XYObject} centerInfo.newCtr\n * @listens module:svgcanvas.SvgCanvas#event:updateCanvas\n * @returns {void}\n */\n function (win, {center, newCtr}) {\n updateCanvas(center, newCtr);\n }\n );\n svgCanvas.bind('contextset', contextChanged);\n svgCanvas.bind('extension_added', extAdded);\n svgCanvas.textActions.setInputElem($('#text')[0]);\n\n let str = '
';\n $.each(palette, function (i, item) {\n str += '
';\n });\n $('#palette').append(str);\n\n // Set up editor background functionality\n const colorBlocks = ['#FFF', '#888', '#000', 'chessboard'];\n str = '';\n $.each(colorBlocks, function (i, e) {\n if (e === 'chessboard') {\n str += '
';\n } else {\n str += '
';\n }\n });\n $('#bg_blocks').append(str);\n const blocks = $('#bg_blocks div');\n const curBg = 'cur_background';\n blocks.each(function () {\n const blk = $(this);\n blk.click(function () {\n blocks.removeClass(curBg);\n $(this).addClass(curBg);\n });\n });\n\n setBackground(editor.pref('bkgd_color'), editor.pref('bkgd_url'));\n\n $('#image_save_opts input').val([editor.pref('img_save')]);\n\n /**\n * @type {module:jQuerySpinButton.ValueCallback}\n */\n const changeRectRadius = function (ctl) {\n svgCanvas.setRectRadius(ctl.value);\n };\n\n /**\n * @type {module:jQuerySpinButton.ValueCallback}\n */\n const changeFontSize = function (ctl) {\n svgCanvas.setFontSize(ctl.value);\n };\n\n /**\n * @type {module:jQuerySpinButton.ValueCallback}\n */\n const changeStrokeWidth = function (ctl) {\n let val = ctl.value;\n if (val === 0 && selectedElement && ['line', 'polyline'].includes(selectedElement.nodeName)) {\n val = ctl.value = 1;\n }\n svgCanvas.setStrokeWidth(val);\n };\n\n /**\n * @type {module:jQuerySpinButton.ValueCallback}\n */\n const changeRotationAngle = function (ctl) {\n svgCanvas.setRotationAngle(ctl.value);\n $('#tool_reorient').toggleClass('disabled', Number.parseInt(ctl.value) === 0);\n };\n\n /**\n * @param {external:jQuery.fn.SpinButton} ctl Spin Button\n * @param {string} [val=ctl.value]\n * @returns {void}\n */\n const changeOpacity = function (ctl, val) {\n if (Utils.isNullish(val)) { val = ctl.value; }\n $('#group_opacity').val(val);\n if (!ctl || !ctl.handle) {\n $('#opac_slider').slider('option', 'value', val);\n }\n svgCanvas.setOpacity(val / 100);\n };\n\n /**\n * @param {external:jQuery.fn.SpinButton} ctl Spin Button\n * @param {string} [val=ctl.value]\n * @param {boolean} noUndo\n * @returns {void}\n */\n const changeBlur = function (ctl, val, noUndo) {\n if (Utils.isNullish(val)) { val = ctl.value; }\n $('#blur').val(val);\n let complete = false;\n if (!ctl || !ctl.handle) {\n $('#blur_slider').slider('option', 'value', val);\n complete = true;\n }\n if (noUndo) {\n svgCanvas.setBlurNoUndo(val);\n } else {\n svgCanvas.setBlur(val, complete);\n }\n };\n\n $('#stroke_style').change(function () {\n svgCanvas.setStrokeAttr('stroke-dasharray', $(this).val());\n operaRepaint();\n });\n\n $('#stroke_linejoin').change(function () {\n svgCanvas.setStrokeAttr('stroke-linejoin', $(this).val());\n operaRepaint();\n });\n\n // Lose focus for select elements when changed (Allows keyboard shortcuts to work better)\n $('select').change(function () { $(this).blur(); });\n\n // fired when user wants to move elements to another layer\n let promptMoveLayerOnce = false;\n $('#selLayerNames').change(async function () {\n const destLayer = this.options[this.selectedIndex].value;\n const confirmStr = uiStrings.notification.QmoveElemsToLayer.replace('%s', destLayer);\n /**\n * @param {boolean} ok\n * @returns {void}\n */\n const moveToLayer = function (ok) {\n if (!ok) { return; }\n promptMoveLayerOnce = true;\n svgCanvas.moveSelectedToLayer(destLayer);\n svgCanvas.clearSelection();\n populateLayers();\n };\n if (destLayer) {\n if (promptMoveLayerOnce) {\n moveToLayer(true);\n } else {\n const ok = await $.confirm(confirmStr);\n if (!ok) {\n return;\n }\n moveToLayer(true);\n }\n }\n });\n\n $('#font_family').change(function () {\n svgCanvas.setFontFamily(this.value);\n });\n\n $('#seg_type').change(function () {\n svgCanvas.setSegType($(this).val());\n });\n\n $('#text').bind('keyup input', function () {\n svgCanvas.setTextContent(this.value);\n });\n\n $('#image_url').change(function () {\n setImageURL(this.value);\n });\n\n $('#link_url').change(function () {\n if (this.value.length) {\n svgCanvas.setLinkURL(this.value);\n } else {\n svgCanvas.removeHyperlink();\n }\n });\n\n $('#g_title').change(function () {\n svgCanvas.setGroupTitle(this.value);\n });\n\n $('.attr_changer').change(function () {\n const attr = this.getAttribute('data-attr');\n let val = this.value;\n const valid = isValidUnit(attr, val, selectedElement);\n\n if (!valid) {\n this.value = selectedElement.getAttribute(attr);\n /* await */ $.alert(uiStrings.notification.invalidAttrValGiven);\n return false;\n }\n\n if (attr !== 'id' && attr !== 'class') {\n if (isNaN(val)) {\n val = svgCanvas.convertToNum(attr, val);\n } else if (curConfig.baseUnit !== 'px') {\n // Convert unitless value to one with given unit\n\n const unitData = getTypeMap();\n\n if (selectedElement[attr] || svgCanvas.getMode() === 'pathedit' || attr === 'x' || attr === 'y') {\n val *= unitData[curConfig.baseUnit];\n }\n }\n }\n\n // if the user is changing the id, then de-select the element first\n // change the ID, then re-select it with the new ID\n if (attr === 'id') {\n const elem = selectedElement;\n svgCanvas.clearSelection();\n elem.id = val;\n svgCanvas.addToSelection([elem], true);\n } else {\n svgCanvas.changeSelectedAttribute(attr, val);\n }\n this.blur();\n return true;\n });\n\n // Prevent selection of elements when shift-clicking\n $('#palette').mouseover(function () {\n const inp = $('
');\n $(this).append(inp);\n inp.focus().remove();\n });\n\n $('.palette_item').mousedown(function (evt) {\n // shift key or right click for stroke\n const picker = evt.shiftKey || evt.button === 2 ? 'stroke' : 'fill';\n let color = $(this).data('rgb');\n let paint;\n\n // Webkit-based browsers returned 'initial' here for no stroke\n if (color === 'none' || color === 'transparent' || color === 'initial') {\n color = 'none';\n paint = new $.jGraduate.Paint();\n } else {\n paint = new $.jGraduate.Paint({alpha: 100, solidColor: color.substr(1)});\n }\n\n paintBox[picker].setPaint(paint);\n svgCanvas.setColor(picker, color);\n\n if (color !== 'none' && svgCanvas.getPaintOpacity(picker) !== 1) {\n svgCanvas.setPaintOpacity(picker, 1.0);\n }\n updateToolButtonState();\n }).bind('contextmenu', function (e) { e.preventDefault(); });\n\n $('#toggle_stroke_tools').on('click', function () {\n $('#tools_bottom').toggleClass('expanded');\n });\n\n (function () {\n const wArea = workarea[0];\n\n let lastX = null, lastY = null,\n panning = false, keypan = false;\n\n $('#svgcanvas').bind('mousemove mouseup', function (evt) {\n if (panning === false) { return true; }\n\n wArea.scrollLeft -= (evt.clientX - lastX);\n wArea.scrollTop -= (evt.clientY - lastY);\n\n lastX = evt.clientX;\n lastY = evt.clientY;\n\n if (evt.type === 'mouseup') { panning = false; }\n return false;\n }).mousedown(function (evt) {\n if (evt.button === 1 || keypan === true) {\n panning = true;\n lastX = evt.clientX;\n lastY = evt.clientY;\n return false;\n }\n return true;\n });\n\n $(window).mouseup(function () {\n panning = false;\n });\n\n $(document).bind('keydown', 'space', function (evt) {\n svgCanvas.spaceKey = keypan = true;\n evt.preventDefault();\n }).bind('keyup', 'space', function (evt) {\n evt.preventDefault();\n svgCanvas.spaceKey = keypan = false;\n }).bind('keydown', 'shift', function (evt) {\n if (svgCanvas.getMode() === 'zoom') {\n workarea.css('cursor', zoomOutIcon);\n }\n }).bind('keyup', 'shift', function (evt) {\n if (svgCanvas.getMode() === 'zoom') {\n workarea.css('cursor', zoomInIcon);\n }\n });\n\n /**\n * @function module:SVGEditor.setPanning\n * @param {boolean} active\n * @returns {void}\n */\n editor.setPanning = function (active) {\n svgCanvas.spaceKey = keypan = active;\n };\n }());\n\n (function () {\n const button = $('#main_icon');\n const overlay = $('#main_icon span');\n const list = $('#main_menu');\n\n let onButton = false;\n let height = 0;\n let jsHover = true;\n let setClick = false;\n\n /*\n // Currently unused\n const hideMenu = function () {\n list.fadeOut(200);\n };\n */\n\n $(window).mouseup(function (evt) {\n if (!onButton) {\n button.removeClass('buttondown');\n // do not hide if it was the file input as that input needs to be visible\n // for its change event to fire\n if (evt.target.tagName !== 'INPUT') {\n list.fadeOut(200);\n } else if (!setClick) {\n setClick = true;\n $(evt.target).click(function () {\n list.css('margin-left', '-9999px').show();\n });\n }\n }\n onButton = false;\n }).mousedown(function (evt) {\n // $('.contextMenu').hide();\n const islib = $(evt.target).closest('div.tools_flyout, .contextMenu').length;\n if (!islib) {\n $('.tools_flyout:visible,.contextMenu').fadeOut(250);\n }\n });\n\n overlay.bind('mousedown', function () {\n if (!button.hasClass('buttondown')) {\n // Margin must be reset in case it was changed before;\n list.css('margin-left', 0).show();\n if (!height) {\n height = list.height();\n }\n // Using custom animation as slideDown has annoying 'bounce effect'\n list.css('height', 0).animate({\n height\n }, 200);\n onButton = true;\n } else {\n list.fadeOut(200);\n }\n button.toggleClass('buttondown buttonup');\n }).hover(function () {\n onButton = true;\n }).mouseout(function () {\n onButton = false;\n });\n\n const listItems = $('#main_menu li');\n\n // Check if JS method of hovering needs to be used (Webkit bug)\n listItems.mouseover(function () {\n jsHover = ($(this).css('background-color') === 'rgba(0, 0, 0, 0)');\n\n listItems.unbind('mouseover');\n if (jsHover) {\n listItems.mouseover(function () {\n this.style.backgroundColor = '#FFC';\n }).mouseout(function () {\n this.style.backgroundColor = 'transparent';\n return true;\n });\n }\n });\n }());\n // Made public for UI customization.\n // TODO: Group UI functions into a public editor.ui interface.\n /**\n * See {@link http://api.jquery.com/bind/#bind-eventType-eventData-handler}.\n * @callback module:SVGEditor.DropDownCallback\n * @param {external:jQuery.Event} ev See {@link http://api.jquery.com/Types/#Event}\n * @listens external:jQuery.Event\n * @returns {void|boolean} Calls `preventDefault()` and `stopPropagation()`\n */\n /**\n * @function module:SVGEditor.addDropDown\n * @param {Element|string} elem DOM Element or selector\n * @param {module:SVGEditor.DropDownCallback} callback Mouseup callback\n * @param {boolean} dropUp\n * @returns {void}\n */\n editor.addDropDown = function (elem, callback, dropUp) {\n if (!$(elem).length) { return; } // Quit if called on non-existent element\n const button = $(elem).find('button');\n const list = $(elem).find('ul').attr('id', $(elem)[0].id + '-list');\n if (dropUp) {\n $(elem).addClass('dropup');\n } else {\n // Move list to place where it can overflow container\n $('#option_lists').append(list);\n }\n list.find('li').bind('mouseup', callback);\n\n let onButton = false;\n $(window).mouseup(function (evt) {\n if (!onButton) {\n button.removeClass('down');\n list.hide();\n }\n onButton = false;\n });\n\n button.bind('mousedown', function () {\n if (!button.hasClass('down')) {\n if (!dropUp) {\n const pos = $(elem).position();\n list.css({\n top: pos.top + 24,\n left: pos.left - 10\n });\n }\n list.show();\n onButton = true;\n } else {\n list.hide();\n }\n button.toggleClass('down');\n }).hover(function () {\n onButton = true;\n }).mouseout(function () {\n onButton = false;\n });\n };\n\n editor.addDropDown('#font_family_dropdown', function () {\n $('#font_family').val($(this).text()).change();\n });\n\n editor.addDropDown('#opacity_dropdown', function () {\n if ($(this).find('div').length) { return; }\n const perc = Number.parseInt($(this).text().split('%')[0]);\n changeOpacity(false, perc);\n }, true);\n\n // For slider usage, see: http://jqueryui.com/demos/slider/\n $('#opac_slider').slider({\n start () {\n $('#opacity_dropdown li:not(.special)').hide();\n },\n stop () {\n $('#opacity_dropdown li').show();\n $(window).mouseup();\n },\n slide (evt, ui) {\n changeOpacity(ui);\n }\n });\n\n editor.addDropDown('#blur_dropdown', $.noop);\n\n let slideStart = false;\n $('#blur_slider').slider({\n max: 10,\n step: 0.1,\n stop (evt, ui) {\n slideStart = false;\n changeBlur(ui);\n $('#blur_dropdown li').show();\n $(window).mouseup();\n },\n start () {\n slideStart = true;\n },\n slide (evt, ui) {\n changeBlur(ui, null, slideStart);\n }\n });\n\n editor.addDropDown('#zoom_dropdown', function () {\n const item = $(this);\n const val = item.data('val');\n if (val) {\n zoomChanged(window, val);\n } else {\n changeZoom({value: Number.parseFloat(item.text())});\n }\n }, true);\n\n addAltDropDown('#stroke_linecap', '#linecap_opts', function () {\n setStrokeOpt(this, true);\n }, {dropUp: true});\n\n addAltDropDown('#stroke_linejoin', '#linejoin_opts', function () {\n setStrokeOpt(this, true);\n }, {dropUp: true});\n\n addAltDropDown('#tool_position', '#position_opts', function () {\n const letter = this.id.replace('tool_pos', '').charAt(0);\n svgCanvas.alignSelectedElements(letter, 'page');\n }, {multiclick: true});\n\n /*\n\n When a flyout icon is selected\n (if flyout) {\n - Change the icon\n - Make pressing the button run its stuff\n }\n - Run its stuff\n\n When its shortcut key is pressed\n - If not current in list, do as above\n , else:\n - Just run its stuff\n\n */\n\n // Unfocus text input when workarea is mousedowned.\n (function () {\n let inp;\n /**\n *\n * @returns {void}\n */\n const unfocus = function () {\n $(inp).blur();\n };\n\n $('#svg_editor').find('button, select, input:not(#text)').focus(function () {\n inp = this; // eslint-disable-line consistent-this\n uiContext = 'toolbars';\n workarea.mousedown(unfocus);\n }).blur(function () {\n uiContext = 'canvas';\n workarea.unbind('mousedown', unfocus);\n // Go back to selecting text if in textedit mode\n if (svgCanvas.getMode() === 'textedit') {\n $('#text').focus();\n }\n });\n }());\n\n /**\n *\n * @returns {void}\n */\n const clickFHPath = function () {\n if (toolButtonClick('#tool_fhpath')) {\n svgCanvas.setMode('fhpath');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickLine = function () {\n if (toolButtonClick('#tool_line')) {\n svgCanvas.setMode('line');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickSquare = function () {\n if (toolButtonClick('#tool_square')) {\n svgCanvas.setMode('square');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickRect = function () {\n if (toolButtonClick('#tool_rect')) {\n svgCanvas.setMode('rect');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickFHRect = function () {\n if (toolButtonClick('#tool_fhrect')) {\n svgCanvas.setMode('fhrect');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickCircle = function () {\n if (toolButtonClick('#tool_circle')) {\n svgCanvas.setMode('circle');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickEllipse = function () {\n if (toolButtonClick('#tool_ellipse')) {\n svgCanvas.setMode('ellipse');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickFHEllipse = function () {\n if (toolButtonClick('#tool_fhellipse')) {\n svgCanvas.setMode('fhellipse');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickImage = function () {\n if (toolButtonClick('#tool_image')) {\n svgCanvas.setMode('image');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickZoom = function () {\n if (toolButtonClick('#tool_zoom')) {\n svgCanvas.setMode('zoom');\n workarea.css('cursor', zoomInIcon);\n }\n };\n\n /**\n * @param {Float} multiplier\n * @returns {void}\n */\n const zoomImage = function (multiplier) {\n const res = svgCanvas.getResolution();\n multiplier = multiplier ? res.zoom * multiplier : 1;\n // setResolution(res.w * multiplier, res.h * multiplier, true);\n $('#zoom').val(multiplier * 100);\n svgCanvas.setZoom(multiplier);\n zoomDone();\n updateCanvas(true);\n };\n\n /**\n *\n * @returns {void}\n */\n const dblclickZoom = function () {\n if (toolButtonClick('#tool_zoom')) {\n zoomImage();\n setSelectMode();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickText = function () {\n if (toolButtonClick('#tool_text')) {\n svgCanvas.setMode('text');\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickPath = function () {\n if (toolButtonClick('#tool_path')) {\n svgCanvas.setMode('path');\n }\n };\n\n /**\n * Delete is a contextual tool that only appears in the ribbon if\n * an element has been selected.\n * @returns {void}\n */\n const deleteSelected = function () {\n if (!Utils.isNullish(selectedElement) || multiselected) {\n svgCanvas.deleteSelectedElements();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const cutSelected = function () {\n if (!Utils.isNullish(selectedElement) || multiselected) {\n svgCanvas.cutSelectedElements();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const copySelected = function () {\n if (!Utils.isNullish(selectedElement) || multiselected) {\n svgCanvas.copySelectedElements();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const pasteInCenter = function () {\n const zoom = svgCanvas.getZoom();\n const x = (workarea[0].scrollLeft + workarea.width() / 2) / zoom - svgCanvas.contentW;\n const y = (workarea[0].scrollTop + workarea.height() / 2) / zoom - svgCanvas.contentH;\n svgCanvas.pasteElements('point', x, y);\n };\n\n /**\n *\n * @returns {void}\n */\n const moveToTopSelected = function () {\n if (!Utils.isNullish(selectedElement)) {\n svgCanvas.moveToTopSelectedElement();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const moveToBottomSelected = function () {\n if (!Utils.isNullish(selectedElement)) {\n svgCanvas.moveToBottomSelectedElement();\n }\n };\n\n /**\n * @param {\"Up\"|\"Down\"} dir\n * @returns {void}\n */\n const moveUpDownSelected = function (dir) {\n if (!Utils.isNullish(selectedElement)) {\n svgCanvas.moveUpDownSelected(dir);\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const convertToPath = function () {\n if (!Utils.isNullish(selectedElement)) {\n svgCanvas.convertToPath();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const reorientPath = function () {\n if (!Utils.isNullish(selectedElement)) {\n path.reorient();\n }\n };\n\n /**\n *\n * @returns {Promise
} Resolves to `undefined`\n */\n const makeHyperlink = async function () {\n if (!Utils.isNullish(selectedElement) || multiselected) {\n const url = await $.prompt(uiStrings.notification.enterNewLinkURL, 'http://');\n if (url) {\n svgCanvas.makeHyperlink(url);\n }\n }\n };\n\n /**\n * @param {Float} dx\n * @param {Float} dy\n * @returns {void}\n */\n const moveSelected = function (dx, dy) {\n if (!Utils.isNullish(selectedElement) || multiselected) {\n if (curConfig.gridSnapping) {\n // Use grid snap value regardless of zoom level\n const multi = svgCanvas.getZoom() * curConfig.snappingStep;\n dx *= multi;\n dy *= multi;\n }\n svgCanvas.moveSelectedElements(dx, dy);\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const linkControlPoints = function () {\n $('#tool_node_link').toggleClass('push_button_pressed tool_button');\n const linked = $('#tool_node_link').hasClass('push_button_pressed');\n path.linkControlPoints(linked);\n };\n\n /**\n *\n * @returns {void}\n */\n const clonePathNode = function () {\n if (path.getNodePoint()) {\n path.clonePathNode();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const deletePathNode = function () {\n if (path.getNodePoint()) {\n path.deletePathNode();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const addSubPath = function () {\n const button = $('#tool_add_subpath');\n const sp = !button.hasClass('push_button_pressed');\n button.toggleClass('push_button_pressed tool_button');\n path.addSubPath(sp);\n };\n\n /**\n *\n * @returns {void}\n */\n const opencloseSubPath = function () {\n path.opencloseSubPath();\n };\n\n /**\n *\n * @returns {void}\n */\n const selectNext = function () {\n svgCanvas.cycleElement(1);\n };\n\n /**\n *\n * @returns {void}\n */\n const selectPrev = function () {\n svgCanvas.cycleElement(0);\n };\n\n /**\n * @param {0|1} cw\n * @param {Integer} step\n * @returns {void}\n */\n const rotateSelected = function (cw, step) {\n if (Utils.isNullish(selectedElement) || multiselected) { return; }\n if (!cw) { step *= -1; }\n const angle = Number.parseFloat($('#angle').val()) + step;\n svgCanvas.setRotationAngle(angle);\n updateContextPanel();\n };\n\n /**\n * @fires module:svgcanvas.SvgCanvas#event:ext_onNewDocument\n * @returns {Promise} Resolves to `undefined`\n */\n const clickClear = async function () {\n const [x, y] = curConfig.dimensions;\n const ok = await $.confirm(uiStrings.notification.QwantToClear);\n if (!ok) {\n return;\n }\n setSelectMode();\n svgCanvas.clear();\n svgCanvas.setResolution(x, y);\n updateCanvas(true);\n zoomImage();\n populateLayers();\n updateContextPanel();\n prepPaints();\n svgCanvas.runExtensions('onNewDocument');\n };\n\n /**\n *\n * @returns {false}\n */\n const clickBold = function () {\n svgCanvas.setBold(!svgCanvas.getBold());\n updateContextPanel();\n return false;\n };\n\n /**\n *\n * @returns {false}\n */\n const clickItalic = function () {\n svgCanvas.setItalic(!svgCanvas.getItalic());\n updateContextPanel();\n return false;\n };\n\n /**\n *\n * @returns {void}\n */\n const clickSave = function () {\n // In the future, more options can be provided here\n const saveOpts = {\n images: editor.pref('img_save'),\n round_digits: 6\n };\n svgCanvas.save(saveOpts);\n };\n\n let loadingURL;\n /**\n *\n * @returns {Promise} Resolves to `undefined`\n */\n const clickExport = async function () {\n const imgType = await $.select('Select an image type for export: ', [\n // See http://kangax.github.io/jstests/toDataUrl_mime_type_test/ for a useful list of MIME types and browser support\n // 'ICO', // Todo: Find a way to preserve transparency in SVG-Edit if not working presently and do full packaging for x-icon; then switch back to position after 'PNG'\n 'PNG',\n 'JPEG', 'BMP', 'WEBP', 'PDF'\n ], function () {\n const sel = $(this);\n if (sel.val() === 'JPEG' || sel.val() === 'WEBP') {\n if (!$('#image-slider').length) {\n $(`${uiStrings.ui.quality}\n \n
`).appendTo(sel.parent());\n }\n } else {\n $('#image-slider').parent().remove();\n }\n }); // todo: replace hard-coded msg with uiStrings.notification.\n if (!imgType) {\n return;\n }\n // Open placeholder window (prevents popup)\n let exportWindowName;\n\n /**\n *\n * @returns {void}\n */\n function openExportWindow () {\n const {loadingImage} = uiStrings.notification;\n if (curConfig.exportWindowType === 'new') {\n editor.exportWindowCt++;\n }\n exportWindowName = curConfig.canvasName + editor.exportWindowCt;\n let popHTML, popURL;\n if (loadingURL) {\n popURL = loadingURL;\n } else {\n popHTML = `\n \n \n ${loadingImage} \n \n ${loadingImage} \n `;\n if (typeof URL !== 'undefined' && URL.createObjectURL) {\n const blob = new Blob([popHTML], {type: 'text/html'});\n popURL = URL.createObjectURL(blob);\n } else {\n popURL = 'data:text/html;base64;charset=utf-8,' + Utils.encode64(popHTML);\n }\n loadingURL = popURL;\n }\n exportWindow = window.open(popURL, exportWindowName);\n }\n const chrome = isChrome();\n if (imgType === 'PDF') {\n if (!customExportPDF && !chrome) {\n openExportWindow();\n }\n svgCanvas.exportPDF(exportWindowName);\n } else {\n if (!customExportImage) {\n openExportWindow();\n }\n const quality = Number.parseInt($('#image-slider').val()) / 100;\n /* const results = */ await svgCanvas.rasterExport(imgType, quality, exportWindowName);\n }\n };\n\n /**\n * By default, svgCanvas.open() is a no-op. It is up to an extension\n * mechanism (opera widget, etc.) to call `setCustomHandlers()` which\n * will make it do something.\n * @returns {void}\n */\n const clickOpen = function () {\n svgCanvas.open();\n };\n\n /**\n *\n * @returns {void}\n */\n const clickImport = function () {\n /* */\n };\n\n /**\n *\n * @returns {void}\n */\n const clickUndo = function () {\n if (undoMgr.getUndoStackSize() > 0) {\n undoMgr.undo();\n populateLayers();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickRedo = function () {\n if (undoMgr.getRedoStackSize() > 0) {\n undoMgr.redo();\n populateLayers();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickGroup = function () {\n // group\n if (multiselected) {\n svgCanvas.groupSelectedElements();\n // ungroup\n } else if (selectedElement) {\n svgCanvas.ungroupSelectedElement();\n }\n };\n\n /**\n *\n * @returns {void}\n */\n const clickClone = function () {\n svgCanvas.cloneSelectedElements(20, 20);\n };\n\n /**\n *\n * @returns {void}\n */\n const clickAlign = function () {\n const letter = this.id.replace('tool_align', '').charAt(0);\n svgCanvas.alignSelectedElements(letter, $('#align_relative_to').val());\n };\n\n /**\n *\n * @returns {void}\n */\n const clickWireframe = function () {\n $('#tool_wireframe').toggleClass('push_button_pressed tool_button');\n workarea.toggleClass('wireframe');\n\n if (supportsNonSS) { return; }\n const wfRules = $('#wireframe_rules');\n if (!wfRules.length) {\n /* wfRules = */ $('').appendTo('head');\n } else {\n wfRules.empty();\n }\n\n updateWireFrame();\n };\n\n $('#svg_docprops_container, #svg_prefs_container').draggable({\n cancel: 'button,fieldset',\n containment: 'window'\n }).css('position', 'absolute');\n\n let docprops = false;\n let preferences = false;\n\n /**\n *\n * @returns {void}\n */\n const showDocProperties = function () {\n if (docprops) { return; }\n docprops = true;\n\n // This selects the correct radio button by using the array notation\n $('#image_save_opts input').val([editor.pref('img_save')]);\n\n // update resolution option with actual resolution\n const res = svgCanvas.getResolution();\n if (curConfig.baseUnit !== 'px') {\n res.w = convertUnit(res.w) + curConfig.baseUnit;\n res.h = convertUnit(res.h) + curConfig.baseUnit;\n }\n\n $('#canvas_width').val(res.w);\n $('#canvas_height').val(res.h);\n $('#canvas_title').val(svgCanvas.getDocumentTitle());\n\n $('#svg_docprops').show();\n };\n\n /**\n *\n * @returns {void}\n */\n const showPreferences = function () {\n if (preferences) { return; }\n preferences = true;\n $('#main_menu').hide();\n\n // Update background color with current one\n const canvasBg = curPrefs.bkgd_color;\n const url = editor.pref('bkgd_url');\n blocks.each(function () {\n const blk = $(this);\n const isBg = blk.data('bgcolor') === canvasBg;\n blk.toggleClass(curBg, isBg);\n });\n if (!canvasBg) { blocks.eq(0).addClass(curBg); }\n if (url) {\n $('#canvas_bg_url').val(url);\n }\n $('#grid_snapping_on').prop('checked', curConfig.gridSnapping);\n $('#grid_snapping_step').attr('value', curConfig.snappingStep);\n $('#grid_color').attr('value', curConfig.gridColor);\n\n $('#svg_prefs').show();\n };\n\n /**\n *\n * @returns {void}\n */\n const openHomePage = function () {\n window.open(homePage, '_blank');\n };\n\n /**\n *\n * @returns {void}\n */\n const hideSourceEditor = function () {\n $('#svg_source_editor').hide();\n editingsource = false;\n $('#svg_source_textarea').blur();\n };\n\n /**\n *\n * @returns {Promise} Resolves to `undefined`\n */\n const saveSourceEditor = async function () {\n if (!editingsource) { return; }\n\n const saveChanges = function () {\n svgCanvas.clearSelection();\n hideSourceEditor();\n zoomImage();\n populateLayers();\n updateTitle();\n prepPaints();\n };\n\n if (!svgCanvas.setSvgString($('#svg_source_textarea').val())) {\n const ok = await $.confirm(uiStrings.notification.QerrorsRevertToSource);\n if (!ok) {\n return;\n }\n saveChanges();\n return;\n }\n saveChanges();\n setSelectMode();\n };\n\n /**\n *\n * @returns {void}\n */\n const hideDocProperties = function () {\n $('#svg_docprops').hide();\n $('#canvas_width,#canvas_height').removeAttr('disabled');\n $('#resolution')[0].selectedIndex = 0;\n $('#image_save_opts input').val([editor.pref('img_save')]);\n docprops = false;\n };\n\n /**\n *\n * @returns {void}\n */\n const hidePreferences = function () {\n $('#svg_prefs').hide();\n preferences = false;\n };\n\n /**\n *\n * @returns {boolean} Whether there were problems saving the document properties\n */\n const saveDocProperties = function () {\n // set title\n const newTitle = $('#canvas_title').val();\n updateTitle(newTitle);\n svgCanvas.setDocumentTitle(newTitle);\n\n // update resolution\n const width = $('#canvas_width'), w = width.val();\n const height = $('#canvas_height'), h = height.val();\n\n if (w !== 'fit' && !isValidUnit('width', w)) {\n width.parent().addClass('error');\n /* await */ $.alert(uiStrings.notification.invalidAttrValGiven);\n return false;\n }\n\n width.parent().removeClass('error');\n\n if (h !== 'fit' && !isValidUnit('height', h)) {\n height.parent().addClass('error');\n /* await */ $.alert(uiStrings.notification.invalidAttrValGiven);\n return false;\n }\n\n height.parent().removeClass('error');\n\n if (!svgCanvas.setResolution(w, h)) {\n /* await */ $.alert(uiStrings.notification.noContentToFitTo);\n return false;\n }\n\n // Set image save option\n editor.pref('img_save', $('#image_save_opts :checked').val());\n updateCanvas();\n hideDocProperties();\n return true;\n };\n\n /**\n * Save user preferences based on current values in the UI.\n * @function module:SVGEditor.savePreferences\n * @returns {Promise}\n */\n const savePreferences = editor.savePreferences = async function () {\n // Set background\n const color = $('#bg_blocks div.cur_background').data('bgcolor') || '#FFF';\n setBackground(color, $('#canvas_bg_url').val());\n\n // set language\n const lang = $('#lang_select').val();\n if (lang && lang !== editor.pref('lang')) {\n const {langParam, langData} = await editor.putLocale(lang, goodLangs, curConfig);\n await setLang(langParam, langData);\n }\n\n // set icon size\n setIconSize($('#iconsize').val());\n\n // set grid setting\n curConfig.gridSnapping = $('#grid_snapping_on')[0].checked;\n curConfig.snappingStep = $('#grid_snapping_step').val();\n curConfig.gridColor = $('#grid_color').val();\n curConfig.showRulers = $('#show_rulers')[0].checked;\n\n $('#rulers').toggle(curConfig.showRulers);\n if (curConfig.showRulers) { updateRulers(); }\n curConfig.baseUnit = $('#base_unit').val();\n\n svgCanvas.setConfig(curConfig);\n\n updateCanvas();\n hidePreferences();\n };\n\n let resetScrollPos = $.noop;\n\n /**\n *\n * @returns {Promise} Resolves to `undefined`\n */\n const cancelOverlays = async function () {\n $('#dialog_box').hide();\n if (!editingsource && !docprops && !preferences) {\n if (curContext) {\n svgCanvas.leaveContext();\n }\n return;\n }\n\n if (editingsource) {\n if (origSource !== $('#svg_source_textarea').val()) {\n const ok = await $.confirm(uiStrings.notification.QignoreSourceChanges);\n if (ok) {\n hideSourceEditor();\n }\n } else {\n hideSourceEditor();\n }\n } else if (docprops) {\n hideDocProperties();\n } else if (preferences) {\n hidePreferences();\n }\n resetScrollPos();\n };\n\n const winWh = {width: $(window).width(), height: $(window).height()};\n\n // Fix for Issue 781: Drawing area jumps to top-left corner on window resize (IE9)\n if (isIE()) {\n resetScrollPos = function () {\n if (workarea[0].scrollLeft === 0 && workarea[0].scrollTop === 0) {\n workarea[0].scrollLeft = curScrollPos.left;\n workarea[0].scrollTop = curScrollPos.top;\n }\n };\n\n curScrollPos = {\n left: workarea[0].scrollLeft,\n top: workarea[0].scrollTop\n };\n\n $(window).resize(resetScrollPos);\n editor.ready(function () {\n // TODO: Find better way to detect when to do this to minimize\n // flickering effect\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n setTimeout(function () {\n resetScrollPos();\n resolve();\n }, 500);\n });\n });\n\n workarea.scroll(function () {\n curScrollPos = {\n left: workarea[0].scrollLeft,\n top: workarea[0].scrollTop\n };\n });\n }\n\n $(window).resize(function (evt) {\n $.each(winWh, function (type, val) {\n const curval = $(window)[type]();\n workarea[0]['scroll' + (type === 'width' ? 'Left' : 'Top')] -= (curval - val) / 2;\n winWh[type] = curval;\n });\n setFlyoutPositions();\n });\n\n workarea.scroll(function () {\n // TODO: jQuery's scrollLeft/Top() wouldn't require a null check\n if ($('#ruler_x').length) {\n $('#ruler_x')[0].scrollLeft = workarea[0].scrollLeft;\n }\n if ($('#ruler_y').length) {\n $('#ruler_y')[0].scrollTop = workarea[0].scrollTop;\n }\n });\n\n $('#url_notice').click(function () {\n /* await */ $.alert(this.title);\n });\n\n $('#change_image_url').click(promptImgURL);\n\n // added these event handlers for all the push buttons so they\n // behave more like buttons being pressed-in and not images\n (function () {\n const toolnames = [\n 'clear', 'open', 'save', 'source', 'delete',\n 'delete_multi', 'paste', 'clone', 'clone_multi',\n 'move_top', 'move_bottom'\n ];\n const curClass = 'tool_button_current';\n\n let allTools = '';\n\n $.each(toolnames, function (i, item) {\n allTools += (i ? ',' : '') + '#tool_' + item;\n });\n\n $(allTools).mousedown(function () {\n $(this).addClass(curClass);\n }).bind('mousedown mouseout', function () {\n $(this).removeClass(curClass);\n });\n\n $('#tool_undo, #tool_redo').mousedown(function () {\n if (!$(this).hasClass('disabled')) { $(this).addClass(curClass); }\n }).bind('mousedown mouseout', function () {\n $(this).removeClass(curClass);\n });\n }());\n\n // switch modifier key in tooltips if mac\n // NOTE: This code is not used yet until I can figure out how to successfully bind ctrl/meta\n // in Opera and Chrome\n if (isMac() && !window.opera) {\n const shortcutButtons = [\n 'tool_clear', 'tool_save', 'tool_source',\n 'tool_undo', 'tool_redo', 'tool_clone'\n ];\n let i = shortcutButtons.length;\n while (i--) {\n const button = document.getElementById(shortcutButtons[i]);\n if (button) {\n const {title} = button;\n const index = title.indexOf('Ctrl+');\n button.title = [\n title.substr(0, index),\n 'Cmd+',\n title.substr(index + 5)\n ].join('');\n }\n }\n }\n\n /**\n * @param {external:jQuery} elem\n * @todo Go back to the color boxes having white background-color and then setting\n * background-image to none.png (otherwise partially transparent gradients look weird)\n * @returns {void}\n */\n const colorPicker = function (elem) {\n const picker = elem.attr('id') === 'stroke_color' ? 'stroke' : 'fill';\n // const opacity = (picker == 'stroke' ? $('#stroke_opacity') : $('#fill_opacity'));\n const title = picker === 'stroke'\n ? uiStrings.ui.pick_stroke_paint_opacity\n : uiStrings.ui.pick_fill_paint_opacity;\n // let wasNone = false; // Currently unused\n const pos = elem.offset();\n let {paint} = paintBox[picker];\n $('#color_picker')\n .draggable({\n cancel: '.jGraduate_tabs, .jGraduate_colPick, .jGraduate_gradPick, .jPicker',\n containment: 'window'\n })\n .css(curConfig.colorPickerCSS || {left: pos.left - 140, bottom: 40})\n .jGraduate(\n {\n paint,\n window: {pickerTitle: title},\n images: {clientPath: curConfig.jGraduatePath},\n newstop: 'inverse'\n },\n function (p) {\n paint = new $.jGraduate.Paint(p);\n paintBox[picker].setPaint(paint);\n svgCanvas.setPaint(picker, paint);\n $('#color_picker').hide();\n },\n function () {\n $('#color_picker').hide();\n }\n );\n };\n\n /**\n * Paint box class.\n */\n class PaintBox {\n /**\n * @param {string|Element|external:jQuery} container\n * @param {\"fill\"} type\n */\n constructor (container, type) {\n const cur = curConfig[type === 'fill' ? 'initFill' : 'initStroke'];\n // set up gradients to be used for the buttons\n const svgdocbox = new DOMParser().parseFromString(\n `\n \n \n `,\n 'text/xml'\n );\n\n let docElem = svgdocbox.documentElement;\n docElem = $(container)[0].appendChild(document.importNode(docElem, true));\n docElem.setAttribute('width', 16.5);\n\n this.rect = docElem.firstElementChild;\n this.defs = docElem.getElementsByTagName('defs')[0];\n this.grad = this.defs.firstElementChild;\n this.paint = new $.jGraduate.Paint({solidColor: cur.color});\n this.type = type;\n }\n\n /**\n * @param {module:jGraduate~Paint} paint\n * @param {boolean} apply\n * @returns {void}\n */\n setPaint (paint, apply) {\n this.paint = paint;\n\n const ptype = paint.type;\n const opac = paint.alpha / 100;\n\n let fillAttr = 'none';\n switch (ptype) {\n case 'solidColor':\n fillAttr = (paint[ptype] !== 'none') ? '#' + paint[ptype] : paint[ptype];\n break;\n case 'linearGradient':\n case 'radialGradient': {\n this.grad.remove();\n this.grad = this.defs.appendChild(paint[ptype]);\n const id = this.grad.id = 'gradbox_' + this.type;\n fillAttr = 'url(#' + id + ')';\n break;\n }\n }\n\n this.rect.setAttribute('fill', fillAttr);\n this.rect.setAttribute('opacity', opac);\n\n if (apply) {\n svgCanvas.setColor(this.type, this._paintColor, true);\n svgCanvas.setPaintOpacity(this.type, this._paintOpacity, true);\n }\n }\n\n /**\n * @param {boolean} apply\n * @returns {void}\n */\n update (apply) {\n if (!selectedElement) { return; }\n\n const {type} = this;\n switch (selectedElement.tagName) {\n case 'use':\n case 'image':\n case 'foreignObject':\n // These elements don't have fill or stroke, so don't change\n // the current value\n return;\n case 'g':\n case 'a': {\n const childs = selectedElement.getElementsByTagName('*');\n\n let gPaint = null;\n for (let i = 0, len = childs.length; i < len; i++) {\n const elem = childs[i];\n const p = elem.getAttribute(type);\n if (i === 0) {\n gPaint = p;\n } else if (gPaint !== p) {\n gPaint = null;\n break;\n }\n }\n\n if (gPaint === null) {\n // No common color, don't update anything\n this._paintColor = null;\n return;\n }\n this._paintColor = gPaint;\n this._paintOpacity = 1;\n break;\n } default: {\n this._paintOpacity = Number.parseFloat(selectedElement.getAttribute(type + '-opacity'));\n if (Number.isNaN(this._paintOpacity)) {\n this._paintOpacity = 1.0;\n }\n\n const defColor = type === 'fill' ? 'black' : 'none';\n this._paintColor = selectedElement.getAttribute(type) || defColor;\n }\n }\n\n if (apply) {\n svgCanvas.setColor(type, this._paintColor, true);\n svgCanvas.setPaintOpacity(type, this._paintOpacity, true);\n }\n\n this._paintOpacity *= 100;\n\n const paint = getPaint(this._paintColor, this._paintOpacity, type);\n // update the rect inside #fill_color/#stroke_color\n this.setPaint(paint);\n }\n\n /**\n * @returns {void}\n */\n prep () {\n const ptype = this.paint.type;\n\n switch (ptype) {\n case 'linearGradient':\n case 'radialGradient': {\n const paint = new $.jGraduate.Paint({copy: this.paint});\n svgCanvas.setPaint(this.type, paint);\n break;\n }\n }\n }\n }\n PaintBox.ctr = 0;\n\n paintBox.fill = new PaintBox('#fill_color', 'fill');\n paintBox.stroke = new PaintBox('#stroke_color', 'stroke');\n\n $('#stroke_width').val(curConfig.initStroke.width);\n $('#group_opacity').val(curConfig.initOpacity * 100);\n\n // Use this SVG elem to test vectorEffect support\n const testEl = paintBox.fill.rect.cloneNode(false);\n testEl.setAttribute('style', 'vector-effect:non-scaling-stroke');\n const supportsNonSS = (testEl.style.vectorEffect === 'non-scaling-stroke');\n testEl.removeAttribute('style');\n const svgdocbox = paintBox.fill.rect.ownerDocument;\n // Use this to test support for blur element. Seems to work to test support in Webkit\n const blurTest = svgdocbox.createElementNS(NS.SVG, 'feGaussianBlur');\n if (blurTest.stdDeviationX === undefined) {\n $('#tool_blur').hide();\n }\n $(blurTest).remove();\n\n // Test for zoom icon support\n (function () {\n const pre = '-' + uaPrefix.toLowerCase() + '-zoom-';\n const zoom = pre + 'in';\n workarea.css('cursor', zoom);\n if (workarea.css('cursor') === zoom) {\n zoomInIcon = zoom;\n zoomOutIcon = pre + 'out';\n }\n workarea.css('cursor', 'auto');\n }());\n\n // Test for embedImage support (use timeout to not interfere with page load)\n setTimeout(function () {\n svgCanvas.embedImage('images/logo.png', function (datauri) {\n if (!datauri) {\n // Disable option\n $('#image_save_opts [value=embed]').attr('disabled', 'disabled');\n $('#image_save_opts input').val(['ref']);\n editor.pref('img_save', 'ref');\n $('#image_opt_embed').css('color', '#666').attr(\n 'title',\n uiStrings.notification.featNotSupported\n );\n }\n });\n }, 1000);\n\n $('#fill_color, #tool_fill .icon_label').click(function () {\n colorPicker($('#fill_color'));\n updateToolButtonState();\n });\n\n $('#stroke_color, #tool_stroke .icon_label').click(function () {\n colorPicker($('#stroke_color'));\n updateToolButtonState();\n });\n\n $('#group_opacityLabel').click(function () {\n $('#opacity_dropdown button').mousedown();\n $(window).mouseup();\n });\n\n $('#zoomLabel').click(function () {\n $('#zoom_dropdown button').mousedown();\n $(window).mouseup();\n });\n\n $('#tool_move_top').mousedown(function (evt) {\n $('#tools_stacking').show();\n evt.preventDefault();\n });\n\n $('.layer_button').mousedown(function () {\n $(this).addClass('layer_buttonpressed');\n }).mouseout(function () {\n $(this).removeClass('layer_buttonpressed');\n }).mouseup(function () {\n $(this).removeClass('layer_buttonpressed');\n });\n\n $('.push_button').mousedown(function () {\n if (!$(this).hasClass('disabled')) {\n $(this).addClass('push_button_pressed').removeClass('push_button');\n }\n }).mouseout(function () {\n $(this).removeClass('push_button_pressed').addClass('push_button');\n }).mouseup(function () {\n $(this).removeClass('push_button_pressed').addClass('push_button');\n });\n\n // ask for a layer name\n $('#layer_new').click(async function () {\n let uniqName,\n i = svgCanvas.getCurrentDrawing().getNumLayers();\n do {\n uniqName = uiStrings.layers.layer + ' ' + (++i);\n } while (svgCanvas.getCurrentDrawing().hasLayer(uniqName));\n\n const newName = await $.prompt(uiStrings.notification.enterUniqueLayerName, uniqName);\n if (!newName) { return; }\n if (svgCanvas.getCurrentDrawing().hasLayer(newName)) {\n /* await */ $.alert(uiStrings.notification.dupeLayerName);\n return;\n }\n svgCanvas.createLayer(newName);\n updateContextPanel();\n populateLayers();\n });\n\n /**\n *\n * @returns {void}\n */\n function deleteLayer () {\n if (svgCanvas.deleteCurrentLayer()) {\n updateContextPanel();\n populateLayers();\n // This matches what SvgCanvas does\n // TODO: make this behavior less brittle (svg-editor should get which\n // layer is selected from the canvas and then select that one in the UI)\n $('#layerlist tr.layer').removeClass('layersel');\n $('#layerlist tr.layer:first').addClass('layersel');\n }\n }\n\n /**\n *\n * @returns {Promise}\n */\n async function cloneLayer () {\n const name = svgCanvas.getCurrentDrawing().getCurrentLayerName() + ' copy';\n\n const newName = await $.prompt(uiStrings.notification.enterUniqueLayerName, name);\n if (!newName) { return; }\n if (svgCanvas.getCurrentDrawing().hasLayer(newName)) {\n /* await */ $.alert(uiStrings.notification.dupeLayerName);\n return;\n }\n svgCanvas.cloneLayer(newName);\n updateContextPanel();\n populateLayers();\n }\n\n /**\n *\n * @returns {void}\n */\n function mergeLayer () {\n if ($('#layerlist tr.layersel').index() === svgCanvas.getCurrentDrawing().getNumLayers() - 1) {\n return;\n }\n svgCanvas.mergeLayer();\n updateContextPanel();\n populateLayers();\n }\n\n /**\n * @param {Integer} pos\n * @returns {void}\n */\n function moveLayer (pos) {\n const total = svgCanvas.getCurrentDrawing().getNumLayers();\n\n let curIndex = $('#layerlist tr.layersel').index();\n if (curIndex > 0 || curIndex < total - 1) {\n curIndex += pos;\n svgCanvas.setCurrentLayerPosition(total - curIndex - 1);\n populateLayers();\n }\n }\n\n $('#layer_delete').click(deleteLayer);\n\n $('#layer_up').click(() => {\n moveLayer(-1);\n });\n\n $('#layer_down').click(() => {\n moveLayer(1);\n });\n\n $('#layer_rename').click(async function () {\n // const curIndex = $('#layerlist tr.layersel').prevAll().length; // Currently unused\n const oldName = $('#layerlist tr.layersel td.layername').text();\n const newName = await $.prompt(uiStrings.notification.enterNewLayerName, '');\n if (!newName) { return; }\n if (oldName === newName || svgCanvas.getCurrentDrawing().hasLayer(newName)) {\n /* await */ $.alert(uiStrings.notification.layerHasThatName);\n return;\n }\n\n svgCanvas.renameCurrentLayer(newName);\n populateLayers();\n });\n\n const SIDEPANEL_MAXWIDTH = 300;\n const SIDEPANEL_OPENWIDTH = 150;\n let sidedrag = -1, sidedragging = false, allowmove = false;\n\n /**\n * @param {Float} delta\n * @fires module:svgcanvas.SvgCanvas#event:ext_workareaResized\n * @returns {void}\n */\n const changeSidePanelWidth = function (delta) {\n const rulerX = $('#ruler_x');\n $('#sidepanels').width('+=' + delta);\n $('#layerpanel').width('+=' + delta);\n rulerX.css('right', Number.parseInt(rulerX.css('right')) + delta);\n workarea.css('right', Number.parseInt(workarea.css('right')) + delta);\n svgCanvas.runExtensions('workareaResized');\n };\n\n /**\n * @param {Event} evt\n * @returns {void}\n */\n const resizeSidePanel = function (evt) {\n if (!allowmove) { return; }\n if (sidedrag === -1) { return; }\n sidedragging = true;\n let deltaX = sidedrag - evt.pageX;\n const sideWidth = $('#sidepanels').width();\n if (sideWidth + deltaX > SIDEPANEL_MAXWIDTH) {\n deltaX = SIDEPANEL_MAXWIDTH - sideWidth;\n // sideWidth = SIDEPANEL_MAXWIDTH;\n } else if (sideWidth + deltaX < 2) {\n deltaX = 2 - sideWidth;\n // sideWidth = 2;\n }\n if (deltaX === 0) { return; }\n sidedrag -= deltaX;\n changeSidePanelWidth(deltaX);\n };\n\n /**\n * If width is non-zero, then fully close it; otherwise fully open it.\n * @param {boolean} close Forces the side panel closed\n * @returns {void}\n */\n const toggleSidePanel = function (close) {\n const dpr = window.devicePixelRatio || 1;\n const w = $('#sidepanels').width();\n const isOpened = (dpr < 1 ? w : w / dpr) > 2;\n const zoomAdjustedSidepanelWidth = (dpr < 1 ? 1 : dpr) * SIDEPANEL_OPENWIDTH;\n const deltaX = (isOpened || close ? 0 : zoomAdjustedSidepanelWidth) - w;\n changeSidePanelWidth(deltaX);\n };\n\n $('#sidepanel_handle')\n .mousedown(function (evt) {\n sidedrag = evt.pageX;\n $(window).mousemove(resizeSidePanel);\n allowmove = false;\n // Silly hack for Chrome, which always runs mousemove right after mousedown\n setTimeout(function () {\n allowmove = true;\n }, 20);\n })\n .mouseup(function (evt) {\n if (!sidedragging) { toggleSidePanel(); }\n sidedrag = -1;\n sidedragging = false;\n });\n\n $(window).mouseup(function () {\n sidedrag = -1;\n sidedragging = false;\n $('#svg_editor').unbind('mousemove', resizeSidePanel);\n });\n\n populateLayers();\n\n // function changeResolution (x,y) {\n // const {zoom} = svgCanvas.getResolution();\n // setResolution(x * zoom, y * zoom);\n // }\n\n const centerCanvas = () => {\n // this centers the canvas vertically in the workarea (horizontal handled in CSS)\n workarea.css('line-height', workarea.height() + 'px');\n };\n\n $(window).bind('load resize', centerCanvas);\n\n /**\n * @type {module:jQuerySpinButton.StepCallback}\n */\n function stepFontSize (elem, step) {\n const origVal = Number(elem.value);\n const sugVal = origVal + step;\n const increasing = sugVal >= origVal;\n if (step === 0) { return origVal; }\n\n if (origVal >= 24) {\n if (increasing) {\n return Math.round(origVal * 1.1);\n }\n return Math.round(origVal / 1.1);\n }\n if (origVal <= 1) {\n if (increasing) {\n return origVal * 2;\n }\n return origVal / 2;\n }\n return sugVal;\n }\n\n /**\n * @type {module:jQuerySpinButton.StepCallback}\n */\n function stepZoom (elem, step) {\n const origVal = Number(elem.value);\n if (origVal === 0) { return 100; }\n const sugVal = origVal + step;\n if (step === 0) { return origVal; }\n\n if (origVal >= 100) {\n return sugVal;\n }\n if (sugVal >= origVal) {\n return origVal * 2;\n }\n return origVal / 2;\n }\n\n // function setResolution (w, h, center) {\n // updateCanvas();\n // // w -= 0; h -= 0;\n // // $('#svgcanvas').css({width: w, height: h});\n // // $('#canvas_width').val(w);\n // // $('#canvas_height').val(h);\n // //\n // // if (center) {\n // // const wArea = workarea;\n // // const scrollY = h/2 - wArea.height()/2;\n // // const scrollX = w/2 - wArea.width()/2;\n // // wArea[0].scrollTop = scrollY;\n // // wArea[0].scrollLeft = scrollX;\n // // }\n // }\n\n $('#resolution').change(function () {\n const wh = $('#canvas_width,#canvas_height');\n if (!this.selectedIndex) {\n if ($('#canvas_width').val() === 'fit') {\n wh.removeAttr('disabled').val(100);\n }\n } else if (this.value === 'content') {\n wh.val('fit').attr('disabled', 'disabled');\n } else {\n const dims = this.value.split('x');\n $('#canvas_width').val(dims[0]);\n $('#canvas_height').val(dims[1]);\n wh.removeAttr('disabled');\n }\n });\n\n // Prevent browser from erroneously repopulating fields\n $('input,select').attr('autocomplete', 'off');\n\n const dialogSelectors = [\n '#tool_source_cancel', '#tool_docprops_cancel',\n '#tool_prefs_cancel', '.overlay'\n ];\n /* eslint-disable jsdoc/require-property */\n /**\n * Associate all button actions as well as non-button keyboard shortcuts.\n * @namespace {PlainObject} module:SVGEditor~Actions\n */\n const Actions = (function () {\n /* eslint-enable jsdoc/require-property */\n /**\n * @typedef {PlainObject} module:SVGEditor.ToolButton\n * @property {string} sel The CSS selector for the tool\n * @property {external:jQuery.Function} fn A handler to be attached to the `evt`\n * @property {string} evt The event for which the `fn` listener will be added\n * @property {module:SVGEditor.Key} [key] [key, preventDefault, NoDisableInInput]\n * @property {string} [parent] Selector\n * @property {boolean} [hidekey] Whether to show key value in title\n * @property {string} [icon] The button ID\n * @property {boolean} isDefault For flyout holders\n */\n /**\n *\n * @name module:SVGEditor~ToolButtons\n * @type {module:SVGEditor.ToolButton[]}\n */\n const toolButtons = [\n {sel: '#tool_select', fn: clickSelect, evt: 'click', key: ['V', true]},\n {sel: '#tool_fhpath', fn: clickFHPath, evt: 'click', key: ['Q', true]},\n {sel: '#tool_line', fn: clickLine, evt: 'click', key: ['L', true],\n parent: '#tools_line', prepend: true},\n {sel: '#tool_rect', fn: clickRect, evt: 'mouseup',\n key: ['R', true], parent: '#tools_rect', icon: 'rect'},\n {sel: '#tool_square', fn: clickSquare, evt: 'mouseup',\n parent: '#tools_rect', icon: 'square'},\n {sel: '#tool_fhrect', fn: clickFHRect, evt: 'mouseup',\n parent: '#tools_rect', icon: 'fh_rect'},\n {sel: '#tool_ellipse', fn: clickEllipse, evt: 'mouseup',\n key: ['E', true], parent: '#tools_ellipse', icon: 'ellipse'},\n {sel: '#tool_circle', fn: clickCircle, evt: 'mouseup',\n parent: '#tools_ellipse', icon: 'circle'},\n {sel: '#tool_fhellipse', fn: clickFHEllipse, evt: 'mouseup',\n parent: '#tools_ellipse', icon: 'fh_ellipse'},\n {sel: '#tool_path', fn: clickPath, evt: 'click', key: ['P', true]},\n {sel: '#tool_text', fn: clickText, evt: 'click', key: ['T', true]},\n {sel: '#tool_image', fn: clickImage, evt: 'mouseup'},\n {sel: '#tool_zoom', fn: clickZoom, evt: 'mouseup', key: ['Z', true]},\n {sel: '#tool_clear', fn: clickClear, evt: 'mouseup', key: ['N', true]},\n {sel: '#tool_save', fn () {\n if (editingsource) {\n saveSourceEditor();\n } else {\n clickSave();\n }\n }, evt: 'mouseup', key: ['S', true]},\n {sel: '#tool_export', fn: clickExport, evt: 'mouseup'},\n {sel: '#tool_open', fn: clickOpen, evt: 'mouseup', key: ['O', true]},\n {sel: '#tool_import', fn: clickImport, evt: 'mouseup'},\n {sel: '#tool_source', fn: showSourceEditor, evt: 'click', key: ['U', true]},\n {sel: '#tool_wireframe', fn: clickWireframe, evt: 'click', key: ['F', true]},\n {\n key: ['esc', false, false],\n fn () {\n if (dialogSelectors.every((sel) => {\n return $(sel + ':hidden').length;\n })) {\n svgCanvas.clearSelection();\n }\n },\n hidekey: true\n },\n {sel: dialogSelectors.join(','), fn: cancelOverlays, evt: 'click',\n key: ['esc', false, false], hidekey: true},\n {sel: '#tool_source_save', fn: saveSourceEditor, evt: 'click'},\n {sel: '#tool_docprops_save', fn: saveDocProperties, evt: 'click'},\n {sel: '#tool_docprops', fn: showDocProperties, evt: 'click'},\n {sel: '#tool_prefs_save', fn: savePreferences, evt: 'click'},\n {sel: '#tool_editor_prefs', fn: showPreferences, evt: 'click'},\n {sel: '#tool_editor_homepage', fn: openHomePage, evt: 'click'},\n {sel: '#tool_open', fn () { window.dispatchEvent(new CustomEvent('openImage')); }, evt: 'click'},\n {sel: '#tool_import', fn () { window.dispatchEvent(new CustomEvent('importImage')); }, evt: 'click'},\n {sel: '#tool_delete,#tool_delete_multi', fn: deleteSelected,\n evt: 'click', key: ['del/backspace', true]},\n {sel: '#tool_reorient', fn: reorientPath, evt: 'click'},\n {sel: '#tool_node_link', fn: linkControlPoints, evt: 'click'},\n {sel: '#tool_node_clone', fn: clonePathNode, evt: 'click'},\n {sel: '#tool_node_delete', fn: deletePathNode, evt: 'click'},\n {sel: '#tool_openclose_path', fn: opencloseSubPath, evt: 'click'},\n {sel: '#tool_add_subpath', fn: addSubPath, evt: 'click'},\n {sel: '#tool_move_top', fn: moveToTopSelected, evt: 'click', key: 'ctrl+shift+]'},\n {sel: '#tool_move_bottom', fn: moveToBottomSelected, evt: 'click', key: 'ctrl+shift+['},\n {sel: '#tool_topath', fn: convertToPath, evt: 'click'},\n {sel: '#tool_make_link,#tool_make_link_multi', fn: makeHyperlink, evt: 'click'},\n {sel: '#tool_undo', fn: clickUndo, evt: 'click'},\n {sel: '#tool_redo', fn: clickRedo, evt: 'click'},\n {sel: '#tool_clone,#tool_clone_multi', fn: clickClone, evt: 'click', key: ['D', true]},\n {sel: '#tool_group_elements', fn: clickGroup, evt: 'click', key: ['G', true]},\n {sel: '#tool_ungroup', fn: clickGroup, evt: 'click'},\n {sel: '#tool_unlink_use', fn: clickGroup, evt: 'click'},\n {sel: '[id^=tool_align]', fn: clickAlign, evt: 'click'},\n // these two lines are required to make Opera work properly with the flyout mechanism\n // {sel: '#tools_rect_show', fn: clickRect, evt: 'click'},\n // {sel: '#tools_ellipse_show', fn: clickEllipse, evt: 'click'},\n {sel: '#tool_bold', fn: clickBold, evt: 'mousedown'},\n {sel: '#tool_italic', fn: clickItalic, evt: 'mousedown'},\n {sel: '#sidepanel_handle', fn: toggleSidePanel, key: ['X']},\n {sel: '#copy_save_done', fn: cancelOverlays, evt: 'click'},\n\n // Shortcuts not associated with buttons\n\n {key: 'ctrl+left', fn () { rotateSelected(0, 1); }},\n {key: 'ctrl+right', fn () { rotateSelected(1, 1); }},\n {key: 'ctrl+shift+left', fn () { rotateSelected(0, 5); }},\n {key: 'ctrl+shift+right', fn () { rotateSelected(1, 5); }},\n {key: 'shift+O', fn: selectPrev},\n {key: 'shift+P', fn: selectNext},\n {key: [modKey + 'up', true], fn () { zoomImage(2); }},\n {key: [modKey + 'down', true], fn () { zoomImage(0.5); }},\n {key: [modKey + ']', true], fn () { moveUpDownSelected('Up'); }},\n {key: [modKey + '[', true], fn () { moveUpDownSelected('Down'); }},\n {key: ['up', true], fn () { moveSelected(0, -1); }},\n {key: ['down', true], fn () { moveSelected(0, 1); }},\n {key: ['left', true], fn () { moveSelected(-1, 0); }},\n {key: ['right', true], fn () { moveSelected(1, 0); }},\n {key: 'shift+up', fn () { moveSelected(0, -10); }},\n {key: 'shift+down', fn () { moveSelected(0, 10); }},\n {key: 'shift+left', fn () { moveSelected(-10, 0); }},\n {key: 'shift+right', fn () { moveSelected(10, 0); }},\n {key: ['alt+up', true], fn () { svgCanvas.cloneSelectedElements(0, -1); }},\n {key: ['alt+down', true], fn () { svgCanvas.cloneSelectedElements(0, 1); }},\n {key: ['alt+left', true], fn () { svgCanvas.cloneSelectedElements(-1, 0); }},\n {key: ['alt+right', true], fn () { svgCanvas.cloneSelectedElements(1, 0); }},\n {key: ['alt+shift+up', true], fn () { svgCanvas.cloneSelectedElements(0, -10); }},\n {key: ['alt+shift+down', true], fn () { svgCanvas.cloneSelectedElements(0, 10); }},\n {key: ['alt+shift+left', true], fn () { svgCanvas.cloneSelectedElements(-10, 0); }},\n {key: ['alt+shift+right', true], fn () { svgCanvas.cloneSelectedElements(10, 0); }},\n {key: 'a', fn () { svgCanvas.selectAllInCurrentLayer(); }},\n {key: modKey + 'a', fn () { svgCanvas.selectAllInCurrentLayer(); }},\n\n // Standard shortcuts\n {key: modKey + 'z', fn: clickUndo},\n {key: modKey + 'shift+z', fn: clickRedo},\n {key: modKey + 'y', fn: clickRedo},\n\n {key: modKey + 'x', fn: cutSelected},\n {key: modKey + 'c', fn: copySelected},\n {key: modKey + 'v', fn: pasteInCenter}\n ];\n\n // Tooltips not directly associated with a single function\n const keyAssocs = {\n '4/Shift+4': '#tools_rect_show',\n '5/Shift+5': '#tools_ellipse_show'\n };\n\n return {\n /** @lends module:SVGEditor~Actions */\n /**\n * @returns {void}\n */\n setAll () {\n const flyouts = {};\n const keyHandler = {}; // will contain the action for each pressed key\n\n toolButtons.forEach((opts) => {\n // Bind function to button\n let btn;\n if (opts.sel) {\n btn = $q(opts.sel);\n if (btn === null) { return true; } // Skip if markup does not exist\n if (opts.evt) {\n // `touch.js` changes `touchstart` to `mousedown`,\n // so we must map tool button click events as well\n if (isTouch() && opts.evt === 'click') {\n opts.evt = 'mousedown';\n }\n btn.addEventListener(opts.evt, opts.fn);\n }\n\n // Add to parent flyout menu, if able to be displayed\n if (opts.parent && $(opts.parent + '_show').length) {\n let fH = $(opts.parent);\n if (!fH.length) {\n fH = makeFlyoutHolder(opts.parent.substr(1));\n }\n if (opts.prepend) {\n btn.style.margin = 'initial';\n }\n fH[opts.prepend ? 'prepend' : 'append'](btn);\n\n if (!Array.isArray(flyouts[opts.parent])) {\n flyouts[opts.parent] = [];\n }\n flyouts[opts.parent].push(opts);\n }\n }\n\n // Bind function to shortcut key\n if (opts.key) {\n // Set shortcut based on options\n let keyval = opts.key;\n let pd = false;\n if (Array.isArray(opts.key)) {\n keyval = opts.key[0];\n if (opts.key.length > 1) { pd = opts.key[1]; }\n }\n keyval = String(keyval);\n const {fn} = opts;\n keyval.split('/').forEach((key) => { keyHandler[key] = {fn, pd}; });\n\n // Put shortcut in title\n if (opts.sel && !opts.hidekey && btn.title) {\n const newTitle = `${btn.title.split('[')[0]} (${keyval})`;\n keyAssocs[keyval] = opts.sel;\n // Disregard for menu items\n if (btn.closest('#main_menu') === null) {\n btn.title = newTitle;\n }\n }\n }\n return true;\n });\n // register the keydown event\n document.addEventListener('keydown', (e) => {\n // only track keyboard shortcuts for the body containing the SVG-Editor\n if (e.target.nodeName !== 'BODY') return;\n // normalize key\n const key = `${(e.metaKey) ? 'meta+' : ''}${(e.ctrlKey) ? 'ctrl+' : ''}${e.key.toLowerCase()}`;\n // return if no shortcut defined for this key\n if (!keyHandler[key]) return;\n // launch associated handler and preventDefault if necessary\n keyHandler[key].fn();\n if (keyHandler[key].pd) {\n e.preventDefault();\n }\n });\n\n // Setup flyouts\n setupFlyouts(flyouts);\n\n // Misc additional actions\n\n // Make 'return' keypress trigger the change event\n $('.attr_changer, #image_url').bind(\n 'keydown',\n 'return',\n function (evt) {\n $(this).change();\n evt.preventDefault();\n }\n );\n\n $(window).bind('keydown', 'tab', function (e) {\n if (uiContext === 'canvas') {\n e.preventDefault();\n selectNext();\n }\n }).bind('keydown', 'shift+tab', function (e) {\n if (uiContext === 'canvas') {\n e.preventDefault();\n selectPrev();\n }\n });\n\n $('#tool_zoom').dblclick(dblclickZoom);\n },\n /**\n * @returns {void}\n */\n setTitles () {\n $.each(keyAssocs, function (keyval, sel) {\n const menu = ($(sel).parents('#main_menu').length);\n\n $(sel).each(function () {\n let t;\n if (menu) {\n t = $(this).text().split(' [')[0];\n } else {\n t = this.title.split(' [')[0];\n }\n let keyStr = '';\n // Shift+Up\n $.each(keyval.split('/'), function (i, key) {\n const modBits = key.split('+');\n let mod = '';\n if (modBits.length > 1) {\n mod = modBits[0] + '+';\n key = modBits[1];\n }\n keyStr += (i ? '/' : '') + mod + (uiStrings['key_' + key] || key);\n });\n if (menu) {\n this.lastChild.textContent = t + ' [' + keyStr + ']';\n } else {\n this.title = t + ' [' + keyStr + ']';\n }\n });\n });\n },\n /**\n * @param {string} sel Selector to match\n * @returns {module:SVGEditor.ToolButton}\n */\n getButtonData (sel) {\n return Object.values(toolButtons).find((btn) => {\n return btn.sel === sel;\n });\n }\n };\n }());\n\n // Select given tool\n editor.ready(function () {\n let tool;\n const itool = curConfig.initTool,\n container = $('#tools_left, #svg_editor .tools_flyout'),\n /* eslint-disable unicorn/no-fn-reference-in-iterator */\n preTool = container.find('#tool_' + itool),\n regTool = container.find('#' + itool);\n /* eslint-enable unicorn/no-fn-reference-in-iterator */\n if (preTool.length) {\n tool = preTool;\n } else if (regTool.length) {\n tool = regTool;\n } else {\n tool = $('#tool_select');\n }\n tool.click().mouseup();\n\n if (curConfig.wireframe) {\n $('#tool_wireframe').click();\n }\n\n if (curConfig.showlayers) {\n toggleSidePanel();\n }\n\n $('#rulers').toggle(Boolean(curConfig.showRulers));\n\n if (curConfig.showRulers) {\n $('#show_rulers')[0].checked = true;\n }\n\n if (curConfig.baseUnit) {\n $('#base_unit').val(curConfig.baseUnit);\n }\n\n if (curConfig.gridSnapping) {\n $('#grid_snapping_on')[0].checked = true;\n }\n\n if (curConfig.snappingStep) {\n $('#grid_snapping_step').val(curConfig.snappingStep);\n }\n\n if (curConfig.gridColor) {\n $('#grid_color').val(curConfig.gridColor);\n }\n });\n\n // init SpinButtons\n $('#rect_rx').SpinButton({\n min: 0, max: 1000, stateObj, callback: changeRectRadius\n });\n $('#stroke_width').SpinButton({\n min: 0, max: 99, smallStep: 0.1, stateObj, callback: changeStrokeWidth\n });\n $('#angle').SpinButton({\n min: -180, max: 180, step: 5, stateObj, callback: changeRotationAngle\n });\n $('#font_size').SpinButton({\n min: 0.001, stepfunc: stepFontSize, stateObj, callback: changeFontSize\n });\n $('#group_opacity').SpinButton({\n min: 0, max: 100, step: 5, stateObj, callback: changeOpacity\n });\n $('#blur').SpinButton({\n min: 0, max: 10, step: 0.1, stateObj, callback: changeBlur\n });\n $('#zoom').SpinButton({\n min: 0.001, max: 10000, step: 50, stepfunc: stepZoom,\n stateObj, callback: changeZoom\n // Set default zoom\n }).val(\n svgCanvas.getZoom() * 100\n );\n\n $('#workarea').contextMenu(\n {\n menu: 'cmenu_canvas',\n inSpeed: 0\n },\n function (action, el, pos) {\n switch (action) {\n case 'delete':\n deleteSelected();\n break;\n case 'cut':\n cutSelected();\n break;\n case 'copy':\n copySelected();\n break;\n case 'paste':\n svgCanvas.pasteElements();\n break;\n case 'paste_in_place':\n svgCanvas.pasteElements('in_place');\n break;\n case 'group':\n case 'group_elements':\n svgCanvas.groupSelectedElements();\n break;\n case 'ungroup':\n svgCanvas.ungroupSelectedElement();\n break;\n case 'move_front':\n moveToTopSelected();\n break;\n case 'move_up':\n moveUpDownSelected('Up');\n break;\n case 'move_down':\n moveUpDownSelected('Down');\n break;\n case 'move_back':\n moveToBottomSelected();\n break;\n default:\n if (hasCustomHandler(action)) {\n getCustomHandler(action).call();\n }\n break;\n }\n }\n );\n\n /**\n * Implements {@see module:jQueryContextMenu.jQueryContextMenuListener}.\n * @param {\"dupe\"|\"delete\"|\"merge_down\"|\"merge_all\"} action\n * @param {external:jQuery} el\n * @param {{x: Float, y: Float, docX: Float, docY: Float}} pos\n * @returns {void}\n */\n const lmenuFunc = function (action, el, pos) {\n switch (action) {\n case 'dupe':\n /* await */ cloneLayer();\n break;\n case 'delete':\n deleteLayer();\n break;\n case 'merge_down':\n mergeLayer();\n break;\n case 'merge_all':\n svgCanvas.mergeAllLayers();\n updateContextPanel();\n populateLayers();\n break;\n }\n };\n\n $('#layerlist').contextMenu(\n {\n menu: 'cmenu_layers',\n inSpeed: 0\n },\n lmenuFunc\n );\n\n $('#layer_moreopts').contextMenu(\n {\n menu: 'cmenu_layers',\n inSpeed: 0,\n allowLeft: true\n },\n lmenuFunc\n );\n\n $('.contextMenu li').mousedown(function (ev) {\n ev.preventDefault();\n });\n\n $('#cmenu_canvas li').disableContextMenu();\n canvMenu.enableContextMenuItems('#delete,#cut,#copy');\n\n /**\n * @returns {void}\n */\n function enableOrDisableClipboard () {\n let svgeditClipboard;\n try {\n svgeditClipboard = localStorage.getItem('svgedit_clipboard');\n } catch (err) {}\n canvMenu[(svgeditClipboard ? 'en' : 'dis') + 'ableContextMenuItems'](\n '#paste,#paste_in_place'\n );\n }\n enableOrDisableClipboard();\n\n window.addEventListener('storage', function (e) {\n if (e.key !== 'svgedit_clipboard') { return; }\n\n enableOrDisableClipboard();\n });\n\n window.addEventListener('beforeunload', function (e) {\n // Suppress warning if page is empty\n if (undoMgr.getUndoStackSize() === 0) {\n editor.showSaveWarning = false;\n }\n\n // showSaveWarning is set to 'false' when the page is saved.\n if (!curConfig.no_save_warning && editor.showSaveWarning) {\n // Browser already asks question about closing the page\n e.returnValue = uiStrings.notification.unsavedChanges; // Firefox needs this when beforeunload set by addEventListener (even though message is not used)\n return uiStrings.notification.unsavedChanges;\n }\n return true;\n });\n\n /**\n * Expose the `uiStrings`.\n * @function module:SVGEditor.canvas.getUIStrings\n * @returns {module:SVGEditor.uiStrings}\n */\n editor.canvas.getUIStrings = function () {\n return uiStrings;\n };\n\n /**\n * @function module:SVGEditor.openPrep\n * @returns {boolean|Promise} Resolves to boolean indicating `true` if there were no changes\n * and `false` after the user confirms.\n */\n editor.openPrep = function () {\n $('#main_menu').hide();\n if (undoMgr.getUndoStackSize() === 0) {\n return true;\n }\n return $.confirm(uiStrings.notification.QwantToOpen);\n };\n\n /**\n *\n * @param {Event} e\n * @returns {void}\n */\n function onDragEnter (e) {\n e.stopPropagation();\n e.preventDefault();\n // and indicator should be displayed here, such as \"drop files here\"\n }\n\n /**\n *\n * @param {Event} e\n * @returns {void}\n */\n function onDragOver (e) {\n e.stopPropagation();\n e.preventDefault();\n }\n\n /**\n *\n * @param {Event} e\n * @returns {void}\n */\n function onDragLeave (e) {\n e.stopPropagation();\n e.preventDefault();\n // hypothetical indicator should be removed here\n }\n // Use HTML5 File API: http://www.w3.org/TR/FileAPI/\n // if browser has HTML5 File API support, then we will show the open menu item\n // and provide a file input to click. When that change event fires, it will\n // get the text contents of the file and send it to the canvas\n if (window.FileReader) {\n /**\n * @param {Event} e\n * @returns {void}\n */\n const importImage = function (e) {\n $.process_cancel(uiStrings.notification.loadingImage);\n e.stopPropagation();\n e.preventDefault();\n $('#workarea').removeAttr('style');\n $('#main_menu').hide();\n const file = (e.type === 'drop') ? e.dataTransfer.files[0] : this.files[0];\n if (!file) {\n $('#dialog_box').hide();\n return;\n }\n /* if (file.type === 'application/pdf') { // Todo: Handle PDF imports\n\n }\n else */\n if (!file.type.includes('image')) {\n return;\n }\n // Detected an image\n // svg handling\n let reader;\n if (file.type.includes('svg')) {\n reader = new FileReader();\n reader.onloadend = function (ev) {\n const newElement = svgCanvas.importSvgString(ev.target.result, true);\n svgCanvas.ungroupSelectedElement();\n svgCanvas.ungroupSelectedElement();\n svgCanvas.groupSelectedElements();\n svgCanvas.alignSelectedElements('m', 'page');\n svgCanvas.alignSelectedElements('c', 'page');\n // highlight imported element, otherwise we get strange empty selectbox\n svgCanvas.selectOnly([newElement]);\n $('#dialog_box').hide();\n };\n reader.readAsText(file);\n } else {\n // bitmap handling\n reader = new FileReader();\n reader.onloadend = function ({target: {result}}) {\n /**\n * Insert the new image until we know its dimensions.\n * @param {Float} width\n * @param {Float} height\n * @returns {void}\n */\n const insertNewImage = function (width, height) {\n const newImage = svgCanvas.addSVGElementFromJson({\n element: 'image',\n attr: {\n x: 0,\n y: 0,\n width,\n height,\n id: svgCanvas.getNextId(),\n style: 'pointer-events:inherit'\n }\n });\n svgCanvas.setHref(newImage, result);\n svgCanvas.selectOnly([newImage]);\n svgCanvas.alignSelectedElements('m', 'page');\n svgCanvas.alignSelectedElements('c', 'page');\n updateContextPanel();\n $('#dialog_box').hide();\n };\n // create dummy img so we know the default dimensions\n let imgWidth = 100;\n let imgHeight = 100;\n const img = new Image();\n img.style.opacity = 0;\n img.addEventListener('load', function () {\n imgWidth = img.offsetWidth || img.naturalWidth || img.width;\n imgHeight = img.offsetHeight || img.naturalHeight || img.height;\n insertNewImage(imgWidth, imgHeight);\n });\n img.src = result;\n };\n reader.readAsDataURL(file);\n }\n };\n\n workarea[0].addEventListener('dragenter', onDragEnter);\n workarea[0].addEventListener('dragover', onDragOver);\n workarea[0].addEventListener('dragleave', onDragLeave);\n workarea[0].addEventListener('drop', importImage);\n\n const open = $(' ').change(async function (e) {\n const ok = await editor.openPrep();\n if (!ok) { return; }\n svgCanvas.clear();\n if (this.files.length === 1) {\n $.process_cancel(uiStrings.notification.loadingImage);\n const reader = new FileReader();\n reader.onloadend = async function ({target}) {\n await loadSvgString(target.result);\n updateCanvas();\n };\n reader.readAsText(this.files[0]);\n }\n });\n $('#tool_open').show();\n $(window).on('openImage', () => open.click());\n\n const imgImport = $(' ').change(importImage);\n $('#tool_import').show();\n $(window).on('importImage', () => imgImport.click());\n }\n\n updateCanvas(true);\n // const revnums = 'svg-editor.js ($Rev$) ';\n // revnums += svgCanvas.getVersion();\n // $('#copyright')[0].setAttribute('title', revnums);\n\n const loadedExtensionNames = [];\n /**\n * @function module:SVGEditor.setLang\n * @param {string} lang The language code\n * @param {module:locale.LocaleStrings} allStrings See {@tutorial LocaleDocs}\n * @fires module:svgcanvas.SvgCanvas#event:ext_langReady\n * @fires module:svgcanvas.SvgCanvas#event:ext_langChanged\n * @returns {Promise} A Promise which resolves to `undefined`\n */\n const setLang = editor.setLang = async function (lang, allStrings) {\n editor.langChanged = true;\n editor.pref('lang', lang);\n $('#lang_select').val(lang);\n if (!allStrings) {\n return;\n }\n // Todo: Remove `allStrings.lang` property in locale in\n // favor of just `lang`?\n document.documentElement.lang = allStrings.lang; // lang;\n // Todo: Add proper RTL Support!\n // Todo: Use RTL detection instead and take out of locales?\n // document.documentElement.dir = allStrings.dir;\n $.extend(uiStrings, allStrings);\n\n // const notif = allStrings.notification; // Currently unused\n // $.extend will only replace the given strings\n const oldLayerName = $('#layerlist tr.layersel td.layername').text();\n const renameLayer = (oldLayerName === uiStrings.common.layer + ' 1');\n\n svgCanvas.setUiStrings(allStrings);\n Actions.setTitles();\n\n if (renameLayer) {\n svgCanvas.renameCurrentLayer(uiStrings.common.layer + ' 1');\n populateLayers();\n }\n\n // In case extensions loaded before the locale, now we execute a callback on them\n if (extsPreLang.length) {\n await Promise.all(extsPreLang.map((ext) => {\n loadedExtensionNames.push(ext.name);\n return ext.langReady({\n lang,\n uiStrings,\n importLocale: getImportLocale({defaultLang: lang, defaultName: ext.name})\n });\n }));\n extsPreLang.length = 0;\n } else {\n loadedExtensionNames.forEach((loadedExtensionName) => {\n svgCanvas.runExtension(\n loadedExtensionName,\n 'langReady',\n /** @type {module:svgcanvas.SvgCanvas#event:ext_langReady} */ {\n lang, uiStrings, importLocale: getImportLocale({defaultLang: lang, defaultName: loadedExtensionName})\n }\n );\n });\n }\n svgCanvas.runExtensions('langChanged', /** @type {module:svgcanvas.SvgCanvas#event:ext_langChanged} */ lang);\n\n // Update flyout tooltips\n setFlyoutTitles();\n\n // Copy title for certain tool elements\n const elems = {\n '#stroke_color': '#tool_stroke .icon_label, #tool_stroke .color_block',\n '#fill_color': '#tool_fill label, #tool_fill .color_block',\n '#linejoin_miter': '#cur_linejoin',\n '#linecap_butt': '#cur_linecap'\n };\n\n $.each(elems, function (source, dest) {\n $(dest).attr('title', $(source)[0].title);\n });\n\n // Copy alignment titles\n $('#multiselected_panel div[id^=tool_align]').each(function () {\n $('#tool_pos' + this.id.substr(10))[0].title = this.title;\n });\n };\n localeInit(\n /**\n * @implements {module:locale.LocaleEditorInit}\n */\n {\n /**\n * Gets an array of results from extensions with a `addLangData` method,\n * returning an object with a `data` property set to its locales (to be\n * merged with regular locales).\n * @param {string} langParam\n * @fires module:svgcanvas.SvgCanvas#event:ext_addLangData\n * @todo Can we forego this in favor of `langReady` (or forego `langReady`)?\n * @returns {module:locale.AddLangExtensionLocaleData[]}\n */\n addLangData (langParam) {\n return svgCanvas.runExtensions(\n 'addLangData',\n /**\n * @function\n * @type {module:svgcanvas.ExtensionVarBuilder}\n * @param {string} name\n * @returns {module:svgcanvas.SvgCanvas#event:ext_addLangData}\n */\n (name) => { // We pass in a function as we don't know the extension name here when defining this `addLangData` method\n return {\n lang: langParam,\n importLocale: getImportLocale({defaultLang: langParam, defaultName: name})\n };\n },\n true\n );\n },\n curConfig\n }\n );\n // Load extensions\n // Bit of a hack to run extensions in local Opera/IE9\n if (document.location.protocol === 'file:') {\n setTimeout(extAndLocaleFunc, 100);\n } else {\n // Returns a promise (if we wanted to fire 'extensions-loaded' event,\n // potentially useful to hide interface as some extension locales\n // are only available after this)\n extAndLocaleFunc();\n }\n};\n\n/**\n* @callback module:SVGEditor.ReadyCallback\n* @returns {Promise|void}\n*/\n/**\n* Queues a callback to be invoked when the editor is ready (or\n* to be invoked immediately if it is already ready--i.e.,\n* if `runCallbacks` has been run).\n* @function module:SVGEditor.ready\n* @param {module:SVGEditor.ReadyCallback} cb Callback to be queued to invoke\n* @returns {Promise} Resolves when all callbacks, including the supplied have resolved\n*/\neditor.ready = function (cb) { // eslint-disable-line promise/prefer-await-to-callbacks\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n if (isReady) {\n resolve(cb()); // eslint-disable-line node/callback-return, promise/prefer-await-to-callbacks\n return;\n }\n callbacks.push([cb, resolve, reject]);\n });\n};\n\n/**\n* Invokes the callbacks previous set by `svgEditor.ready`\n* @function module:SVGEditor.runCallbacks\n* @returns {Promise} Resolves to `undefined` if all callbacks succeeded and rejects otherwise\n*/\neditor.runCallbacks = async function () {\n try {\n await Promise.all(callbacks.map(([cb]) => {\n return cb(); // eslint-disable-line promise/prefer-await-to-callbacks\n }));\n } catch (err) {\n callbacks.forEach(([, , reject]) => {\n reject();\n });\n throw err;\n }\n callbacks.forEach(([, resolve]) => {\n resolve();\n });\n isReady = true;\n};\n\n/**\n * @function module:SVGEditor.loadFromString\n * @param {string} str The SVG string to load\n * @param {PlainObject} [opts={}]\n * @param {boolean} [opts.noAlert=false] Option to avoid alert to user and instead get rejected promise\n * @returns {Promise}\n */\neditor.loadFromString = function (str, {noAlert} = {}) {\n return editor.ready(async function () {\n try {\n await loadSvgString(str, {noAlert});\n } catch (err) {\n if (noAlert) {\n throw err;\n }\n }\n });\n};\n\n/**\n* Not presently in use.\n* @function module:SVGEditor.disableUI\n* @param {PlainObject} featList\n* @returns {void}\n*/\neditor.disableUI = function (featList) {\n // $(function () {\n // $('#tool_wireframe, #tool_image, #main_button, #tool_source, #sidepanels').remove();\n // $('#tools_top').css('left', 5);\n // });\n};\n\n/**\n * @callback module:SVGEditor.URLLoadCallback\n * @param {boolean} success\n * @returns {void}\n */\n/**\n * @function module:SVGEditor.loadFromURL\n * @param {string} url URL from which to load an SVG string via Ajax\n * @param {PlainObject} [opts={}] May contain properties: `cache`, `callback`\n * @param {boolean} [opts.cache]\n * @param {boolean} [opts.noAlert]\n * @returns {Promise} Resolves to `undefined` or rejects upon bad loading of\n * the SVG (or upon failure to parse the loaded string) when `noAlert` is\n * enabled\n */\neditor.loadFromURL = function (url, {cache, noAlert} = {}) {\n return editor.ready(function () {\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n $.ajax({\n url,\n dataType: 'text',\n cache: Boolean(cache),\n beforeSend () {\n $.process_cancel(uiStrings.notification.loadingImage);\n },\n success (str) {\n resolve(loadSvgString(str, {noAlert}));\n },\n error (xhr, stat, err) {\n if (xhr.status !== 404 && xhr.responseText) {\n resolve(loadSvgString(xhr.responseText, {noAlert}));\n return;\n }\n if (noAlert) {\n reject(new Error('URLLoadFail'));\n return;\n }\n $.alert(uiStrings.notification.URLLoadFail + ': \\n' + err);\n resolve();\n },\n complete () {\n $('#dialog_box').hide();\n }\n });\n });\n });\n};\n\n/**\n* @function module:SVGEditor.loadFromDataURI\n* @param {string} str The Data URI to base64-decode (if relevant) and load\n* @param {PlainObject} [opts={}]\n* @param {boolean} [opts.noAlert]\n* @returns {Promise} Resolves to `undefined` and rejects if loading SVG string fails and `noAlert` is enabled\n*/\neditor.loadFromDataURI = function (str, {noAlert} = {}) {\n return editor.ready(function () {\n let base64 = false;\n let pre = str.match(/^data:image\\/svg\\+xml;base64,/);\n if (pre) {\n base64 = true;\n } else {\n pre = str.match(/^data:image\\/svg\\+xml(?:;|;utf8)?,/);\n }\n if (pre) {\n pre = pre[0];\n }\n const src = str.slice(pre.length);\n return loadSvgString(base64 ? Utils.decode64(src) : decodeURIComponent(src), {noAlert});\n });\n};\n\n/**\n * @function module:SVGEditor.addExtension\n * @param {string} name Used internally; no need for i18n.\n * @param {module:svgcanvas.ExtensionInitCallback} init Config to be invoked on this module\n * @param {module:svgcanvas.ExtensionInitArgs} initArgs\n * @throws {Error} If called too early\n * @returns {Promise} Resolves to `undefined`\n*/\neditor.addExtension = function (name, init, initArgs) {\n // Note that we don't want this on editor.ready since some extensions\n // may want to run before then (like server_opensave).\n // $(function () {\n if (!svgCanvas) {\n throw new Error('Extension added too early');\n }\n return svgCanvas.addExtension.call(this, name, init, initArgs);\n // });\n};\n\n// Defer injection to wait out initial menu processing. This probably goes\n// away once all context menu behavior is brought to context menu.\neditor.ready(() => {\n injectExtendedContextMenuItemsIntoDom();\n});\n\nlet extensionsAdded = false;\nconst messageQueue = [];\n/**\n * @param {PlainObject} info\n * @param {any} info.data\n * @param {string} info.origin\n * @fires module:svgcanvas.SvgCanvas#event:message\n * @returns {void}\n */\nconst messageListener = ({data, origin}) => { // eslint-disable-line no-shadow\n // console.log('data, origin, extensionsAdded', data, origin, extensionsAdded);\n const messageObj = {data, origin};\n if (!extensionsAdded) {\n messageQueue.push(messageObj);\n } else {\n // Extensions can handle messages at this stage with their own\n // canvas `message` listeners\n svgCanvas.call('message', messageObj);\n }\n};\nwindow.addEventListener('message', messageListener);\n\n// Run init once DOM is loaded\n// jQuery(editor.init);\n\n(async () => {\ntry {\n // We wait a micro-task to let the svgEditor variable be defined for module checks\n await Promise.resolve();\n editor.init();\n} catch (err) {\n console.error(err); // eslint-disable-line no-console\n}\n})();\n\nexport default editor;\n","// Todo: Update: https://github.com/jeresig/jquery.hotkeys\n/*\n * jQuery Hotkeys Plugin\n * Copyright 2010, John Resig\n * Dual licensed under the MIT or GPL Version 2 licenses.\n *\n * http://github.com/jeresig/jquery.hotkeys\n *\n * Based upon the plugin by Tzury Bar Yochay:\n * http://github.com/tzuryby/hotkeys\n *\n * Original idea by:\n * Binny V A, http://www.openjs.com/scripts/events/keyboard_shortcuts/\n*/\n\n// We *do* want to allow the escape key within textareas (and possibly tab too), so add the condition `n.which !== 27`\n\nexport default function(b){b.hotkeys={version:\"0.8\",specialKeys:{8:\"backspace\",9:\"tab\",13:\"return\",16:\"shift\",17:\"ctrl\",18:\"alt\",19:\"pause\",20:\"capslock\",27:\"esc\",32:\"space\",33:\"pageup\",34:\"pagedown\",35:\"end\",36:\"home\",37:\"left\",38:\"up\",39:\"right\",40:\"down\",45:\"insert\",46:\"del\",96:\"0\",97:\"1\",98:\"2\",99:\"3\",100:\"4\",101:\"5\",102:\"6\",103:\"7\",104:\"8\",105:\"9\",106:\"*\",107:\"+\",109:\"-\",110:\".\",111:\"/\",112:\"f1\",113:\"f2\",114:\"f3\",115:\"f4\",116:\"f5\",117:\"f6\",118:\"f7\",119:\"f8\",120:\"f9\",121:\"f10\",122:\"f11\",123:\"f12\",144:\"numlock\",145:\"scroll\",191:\"/\",224:\"meta\",219:\"[\",221:\"]\"},shiftNums:{\"`\":\"~\",\"1\":\"!\",\"2\":\"@\",\"3\":\"#\",\"4\":\"$\",\"5\":\"%\",\"6\":\"^\",\"7\":\"&\",\"8\":\"*\",\"9\":\"(\",\"0\":\")\",\"-\":\"_\",\"=\":\"+\",\";\":\": \",\"'\":'\"',\",\":\"<\",\".\":\">\",\"/\":\"?\",\"\\\\\":\"|\"}};function a(d){if(typeof d.data!==\"string\"){return}var c=d.handler,e=d.data.toLowerCase().split(\" \");d.handler=function(n){if(this!==n.target&&(n.which !== 27 && (/textarea|select/i.test(n.target.nodeName)||n.target.type===\"text\"))){return}var h=n.type!==\"keypress\"&&b.hotkeys.specialKeys[n.which],o=String.fromCharCode(n.which).toLowerCase(),k,m=\"\",g={};if(n.altKey&&h!==\"alt\"){m+=\"alt+\"}if(n.ctrlKey&&h!==\"ctrl\"){m+=\"ctrl+\"}if(n.metaKey&&!n.ctrlKey&&h!==\"meta\"){m+=\"meta+\"}if(n.shiftKey&&h!==\"shift\"){m+=\"shift+\"}if(h){g[m+h]=true}else{g[m+o]=true;g[m+b.hotkeys.shiftNums[o]]=true;if(m===\"shift+\"){g[b.hotkeys.shiftNums[o]]=true}}for(var j=0,f=e.length;j Fast-repeat for keys and live updating as you type. |\n * | v1.8 | 12 Jan 2010 | Benjamin Thomas | Fixes for mouseout behavior. Added smallStep |\n * | v1.9 | 20 May 2018 | Brett Zamir | Avoid SVGEdit dependency via `stateObj` config; convert to ES6 module |\n * .\n *\n * @module jQuerySpinButton\n * @example\n // Create group of settings to initialise spinbutton(s). (Optional)\n const myOptions = {\n min: 0, // Set lower limit.\n max: 100, // Set upper limit.\n step: 1, // Set increment size.\n smallStep: 0.5, // Set shift-click increment size.\n stateObj: {tool_scale: 1}, // Object to allow passing in live-updating scale\n spinClass: mySpinBtnClass, // CSS class to style the spinbutton. (Class also specifies url of the up/down button image.)\n upClass: mySpinUpClass, // CSS class for style when mouse over up button.\n downClass: mySpinDnClass // CSS class for style when mouse over down button.\n };\n\n $(function () {\n // Initialise INPUT element(s) as SpinButtons: (passing options if desired)\n $('#myInputElement').SpinButton(myOptions);\n });\n */\n/**\n * @function module:jQuerySpinButton.jQuerySpinButton\n * @param {external:jQuery} $ The jQuery object to which to add the plug-in\n * @returns {external:jQuery}\n*/\nexport default function jQueryPluginSpinButton ($) {\n if (!$.loadingStylesheets) {\n $.loadingStylesheets = [];\n }\n const stylesheet = 'spinbtn/jQuery.SpinButton.css';\n if (!$.loadingStylesheets.includes(stylesheet)) {\n $.loadingStylesheets.push(stylesheet);\n }\n /**\n * @callback module:jQuerySpinButton.StepCallback\n * @param {external:jQuery} thisArg Value of `this`\n * @param {Float} i Value to adjust\n * @returns {Float}\n */\n /**\n * @callback module:jQuerySpinButton.ValueCallback\n * @param {external:jQuery.fn.SpinButton} thisArg Spin Button; check its `value` to see how it was changed.\n * @returns {void}\n */\n /**\n * @typedef {PlainObject} module:jQuerySpinButton.SpinButtonConfig\n * @property {Float} min Set lower limit\n * @property {Float} max Set upper limit.\n * @property {Float} step Set increment size.\n * @property {module:jQuerySpinButton.StepCallback} stepfunc Custom function to run when changing a value; called with `this` of object and the value to adjust and returns a float.\n * @property {module:jQuerySpinButton.ValueCallback} callback Called after value adjusted (with `this` of object)\n * @property {Float} smallStep Set shift-click increment size.\n * @property {PlainObject} stateObj Object to allow passing in live-updating scale\n * @property {Float} stateObj.tool_scale\n * @property {string} spinClass CSS class to style the spinbutton. (Class also specifies url of the up/down button image.)\n * @property {string} upClass CSS class for style when mouse over up button.\n * @property {string} downClass CSS class for style when mouse over down button.\n * @property {Float} page Value to be adjusted on page up/page down\n * @property {Float} reset Reset value when invalid value entered\n * @property {Float} delay Millisecond delay\n * @property {Float} interval Millisecond interval\n */\n /**\n * @function external:jQuery.fn.SpinButton\n * @param {module:jQuerySpinButton.SpinButtonConfig} cfg\n * @returns {external:jQuery}\n */\n $.fn.SpinButton = function (cfg) {\n cfg = cfg || {};\n\n /**\n *\n * @param {Element} el\n * @param {\"offsetLeft\"|\"offsetTop\"} prop\n * @returns {Integer}\n */\n function coord (el, prop) {\n const b = document.body;\n\n let c = el[prop];\n while ((el = el.offsetParent) && (el !== b)) {\n if (!$.browser.msie || (el.currentStyle.position !== 'relative')) {\n c += el[prop];\n }\n }\n\n return c;\n }\n\n return this.each(function () {\n this.repeating = false;\n\n // Apply specified options or defaults:\n // (Ought to refactor this some day to use $.extend() instead)\n this.spinCfg = {\n // min: cfg.min ? Number(cfg.min) : null,\n // max: cfg.max ? Number(cfg.max) : null,\n min: !isNaN(Number.parseFloat(cfg.min)) ? Number(cfg.min) : null, // Fixes bug with min:0\n max: !isNaN(Number.parseFloat(cfg.max)) ? Number(cfg.max) : null,\n step: cfg.step ? Number(cfg.step) : 1,\n stepfunc: cfg.stepfunc || false,\n page: cfg.page ? Number(cfg.page) : 10,\n upClass: cfg.upClass || 'up',\n downClass: cfg.downClass || 'down',\n reset: cfg.reset || this.value,\n delay: cfg.delay ? Number(cfg.delay) : 500,\n interval: cfg.interval ? Number(cfg.interval) : 100,\n _btn_width: 20,\n _direction: null,\n _delay: null,\n _repeat: null,\n callback: cfg.callback || null\n };\n\n // if a smallStep isn't supplied, use half the regular step\n this.spinCfg.smallStep = cfg.smallStep || this.spinCfg.step / 2;\n\n this.adjustValue = function (i) {\n let v;\n if (isNaN(this.value)) {\n v = this.spinCfg.reset;\n } else if (typeof this.spinCfg.stepfunc === 'function') {\n v = this.spinCfg.stepfunc(this, i);\n } else {\n // weirdest JavaScript bug ever: 5.1 + 0.1 = 5.199999999\n v = Number((Number(this.value) + Number(i)).toFixed(5));\n }\n if (this.spinCfg.min !== null) { v = Math.max(v, this.spinCfg.min); }\n if (this.spinCfg.max !== null) { v = Math.min(v, this.spinCfg.max); }\n this.value = v;\n if (typeof this.spinCfg.callback === 'function') {\n this.spinCfg.callback(this);\n }\n };\n\n $(this)\n .addClass(cfg.spinClass || 'spin-button')\n\n .mousemove(function (e) {\n // Determine which button mouse is over, or not (spin direction):\n const x = e.pageX || e.x;\n const y = e.pageY || e.y;\n const el = e.target;\n const scale = cfg.stateObj.tool_scale || 1;\n const height = $(el).height() / 2;\n\n const direction =\n (x > coord(el, 'offsetLeft') +\n el.offsetWidth * scale - this.spinCfg._btn_width)\n ? ((y < coord(el, 'offsetTop') + height * scale) ? 1 : -1)\n : 0;\n\n if (direction !== this.spinCfg._direction) {\n // Style up/down buttons:\n switch (direction) {\n case 1: // Up arrow:\n $(this).removeClass(this.spinCfg.downClass).addClass(this.spinCfg.upClass);\n break;\n case -1: // Down arrow:\n $(this).removeClass(this.spinCfg.upClass).addClass(this.spinCfg.downClass);\n break;\n default: // Mouse is elsewhere in the textbox\n $(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);\n }\n\n // Set spin direction:\n this.spinCfg._direction = direction;\n }\n })\n\n .mouseout(function () {\n // Reset up/down buttons to their normal appearance when mouse moves away:\n $(this).removeClass(this.spinCfg.upClass).removeClass(this.spinCfg.downClass);\n this.spinCfg._direction = null;\n window.clearInterval(this.spinCfg._repeat);\n window.clearTimeout(this.spinCfg._delay);\n })\n\n .mousedown(function (e) {\n if (e.button === 0 && this.spinCfg._direction !== 0) {\n // Respond to click on one of the buttons:\n const stepSize = e.shiftKey ? this.spinCfg.smallStep : this.spinCfg.step;\n\n const adjust = () => {\n this.adjustValue(this.spinCfg._direction * stepSize);\n };\n\n adjust();\n\n // Initial delay before repeating adjustment\n this.spinCfg._delay = window.setTimeout(() => {\n adjust();\n // Repeat adjust at regular intervals\n this.spinCfg._repeat = window.setInterval(adjust, this.spinCfg.interval);\n }, this.spinCfg.delay);\n }\n })\n\n .mouseup(function (e) {\n // Cancel repeating adjustment\n window.clearInterval(this.spinCfg._repeat);\n window.clearTimeout(this.spinCfg._delay);\n })\n\n .dblclick(function (e) {\n if ($.browser.msie) {\n this.adjustValue(this.spinCfg._direction * this.spinCfg.step);\n }\n })\n\n .keydown(function (e) {\n // Respond to up/down arrow keys.\n switch (e.keyCode) {\n case 38: this.adjustValue(this.spinCfg.step); break; // Up\n case 40: this.adjustValue(-this.spinCfg.step); break; // Down\n case 33: this.adjustValue(this.spinCfg.page); break; // PageUp\n case 34: this.adjustValue(-this.spinCfg.page); break; // PageDown\n }\n })\n\n /*\n http://unixpapa.com/js/key.html describes the current state-of-affairs for\n key repeat events:\n - Safari 3.1 changed their model so that keydown is reliably repeated going forward\n - Firefox and Opera still only repeat the keypress event, not the keydown\n */\n .keypress(function (e) {\n if (this.repeating) {\n // Respond to up/down arrow keys.\n switch (e.keyCode) {\n case 38: this.adjustValue(this.spinCfg.step); break; // Up\n case 40: this.adjustValue(-this.spinCfg.step); break; // Down\n case 33: this.adjustValue(this.spinCfg.page); break; // PageUp\n case 34: this.adjustValue(-this.spinCfg.page); break; // PageDown\n }\n // we always ignore the first keypress event (use the keydown instead)\n } else {\n this.repeating = true;\n }\n })\n\n // clear the 'repeating' flag\n .keyup(function (e) {\n this.repeating = false;\n switch (e.keyCode) {\n case 38: // Up\n case 40: // Down\n case 33: // PageUp\n case 34: // PageDown\n case 13: this.adjustValue(0); break; // Enter/Return\n }\n })\n\n .bind('mousewheel', function (e) {\n // Respond to mouse wheel in IE. (It returns up/dn motion in multiples of 120)\n if (e.wheelDelta >= 120) {\n this.adjustValue(this.spinCfg.step);\n } else if (e.wheelDelta <= -120) {\n this.adjustValue(-this.spinCfg.step);\n }\n\n e.preventDefault();\n })\n\n .change(function (e) {\n this.adjustValue(0);\n });\n\n if (this.addEventListener) {\n // Respond to mouse wheel in Firefox\n this.addEventListener('DOMMouseScroll', function (e) {\n if (e.detail > 0) {\n this.adjustValue(-this.spinCfg.step);\n } else if (e.detail < 0) {\n this.adjustValue(this.spinCfg.step);\n }\n\n e.preventDefault();\n });\n }\n });\n };\n return $;\n}\n","/**\n * @file jQuery Context Menu Plugin\n * Cory S.N. LaViska\n * A Beautiful Site ({@link https://abeautifulsite.net/})\n * Modified by Alexis Deveria\n *\n * More info: {@link https://abeautifulsite.net/2008/09/jquery-context-menu-plugin/}\n *\n * @module jQueryContextMenu\n * @todo Update to latest version and adapt (and needs jQuery update as well): {@link https://github.com/swisnl/jQuery-contextMenu}\n * @version 1.0.1\n *\n * @license (MIT OR GPL-2.0-or-later)\n *\n * This plugin is dual-licensed under the GNU General Public License\n * and the MIT License and is copyright A Beautiful Site, LLC.\n *\n*/\nimport {isMac} from '../../common/browser.js';\n\n/**\n* @callback module:jQueryContextMenu.jQueryContextMenuListener\n* @param {string} href The `href` value after the first character (for bypassing an initial `#`)\n* @param {external:jQuery} srcElement The wrapped jQuery srcElement\n* @param {{x: Float, y: Float, docX: Float, docY: Float}} coords\n* @returns {void}\n*/\n\n/**\n* @typedef {PlainObject} module:jQueryContextMenu.jQueryContextMenuConfig\n* @property {string} menu\n* @property {Float} inSpeed\n* @property {Float} outSpeed\n* @property {boolean} allowLeft\n*/\n\n/**\n* Adds {@link external:jQuery.fn.contextMenu},\n* {@link external:jQuery.fn.disableContextMenuItems},\n* {@link external:jQuery.fn.enableContextMenuItems},\n* {@link external:jQuery.fn.disableContextMenu},\n* {@link external:jQuery.fn.enableContextMenu},\n* {@link external:jQuery.fn.destroyContextMenu}.\n* @function module:jQueryContextMenu.jQueryContextMenu\n* @param {external:jQuery} $ The jQuery object to wrap (with `contextMenu`, `disableContextMenuItems`, `enableContextMenuItems`, `disableContextMenu`, `enableContextMenu`, `destroyContextMenu`)\n* @returns {external:jQuery}\n*/\nfunction jQueryContextMenu ($) {\n const win = $(window);\n const doc = $(document);\n\n $.extend($.fn, {\n /**\n * @memberof external:jQuery.fn\n * @param {module:jQueryContextMenu.jQueryContextMenuConfig} o\n * @param {module:jQueryContextMenu.jQueryContextMenuListener} listener\n * @returns {external:jQuery}\n */\n contextMenu (o, listener) {\n // Defaults\n if (o.menu === undefined) return false;\n if (o.inSpeed === undefined) o.inSpeed = 150;\n if (o.outSpeed === undefined) o.outSpeed = 75;\n // 0 needs to be -1 for expected results (no fade)\n if (o.inSpeed === 0) o.inSpeed = -1;\n if (o.outSpeed === 0) o.outSpeed = -1;\n // Loop each context menu\n $(this).each(function () {\n const el = $(this);\n const offset = $(el).offset();\n\n const menu = $('#' + o.menu);\n\n // Add contextMenu class\n menu.addClass('contextMenu');\n // Simulate a true right click\n $(this).bind('mousedown', function (evt) {\n $(this).mouseup(function (e) {\n const srcElement = $(this);\n srcElement.unbind('mouseup');\n\n if (!(evt.button === 2 || o.allowLeft ||\n (evt.ctrlKey && isMac()))) {\n return undefined;\n }\n e.stopPropagation();\n // Hide context menus that may be showing\n $('.contextMenu').hide();\n // Get this context menu\n\n if (el.hasClass('disabled')) return false;\n\n // Detect mouse position\n let x = e.pageX, y = e.pageY;\n\n const xOff = win.width() - menu.width(),\n yOff = win.height() - menu.height();\n\n if (x > xOff - 15) x = xOff - 15;\n if (y > yOff - 30) y = yOff - 30; // 30 is needed to prevent scrollbars in FF\n\n // Show the menu\n doc.unbind('click');\n menu.css({top: y, left: x}).fadeIn(o.inSpeed);\n // Hover events\n menu.find('A').mouseover(function () {\n menu.find('LI.hover').removeClass('hover');\n $(this).parent().addClass('hover');\n }).mouseout(function () {\n menu.find('LI.hover').removeClass('hover');\n });\n\n // Keyboard\n doc.keypress(function (ev) {\n switch (ev.keyCode) {\n case 38: // up\n if (!menu.find('LI.hover').length) {\n menu.find('LI:last').addClass('hover');\n } else {\n menu.find('LI.hover').removeClass('hover').prevAll('LI:not(.disabled)').eq(0).addClass('hover');\n if (!menu.find('LI.hover').length) menu.find('LI:last').addClass('hover');\n }\n break;\n case 40: // down\n if (!menu.find('LI.hover').length) {\n menu.find('LI:first').addClass('hover');\n } else {\n menu.find('LI.hover').removeClass('hover').nextAll('LI:not(.disabled)').eq(0).addClass('hover');\n if (!menu.find('LI.hover').length) menu.find('LI:first').addClass('hover');\n }\n break;\n case 13: // enter\n menu.find('LI.hover A').trigger('click');\n break;\n case 27: // esc\n doc.trigger('click');\n break;\n }\n });\n\n // When items are selected\n menu.find('A').unbind('mouseup');\n menu.find('LI:not(.disabled) A').mouseup(function () {\n doc.unbind('click').unbind('keypress');\n $('.contextMenu').hide();\n if (listener) {\n listener($(this).attr('href').substr(1), $(srcElement), {\n x: x - offset.left, y: y - offset.top, docX: x, docY: y\n });\n }\n return false;\n });\n\n // Hide bindings\n setTimeout(function () { // Delay for Mozilla\n doc.click(function () {\n doc.unbind('click').unbind('keypress');\n menu.fadeOut(o.outSpeed);\n return false;\n });\n }, 0);\n return undefined;\n });\n });\n\n // Disable text selection\n if ($.browser.mozilla) {\n $('#' + o.menu).each(function () { $(this).css({MozUserSelect: 'none'}); });\n } else if ($.browser.msie) {\n $('#' + o.menu).each(function () { $(this).bind('selectstart.disableTextSelect', function () { return false; }); });\n } else {\n $('#' + o.menu).each(function () { $(this).bind('mousedown.disableTextSelect', function () { return false; }); });\n }\n // Disable browser context menu (requires both selectors to work in IE/Safari + FF/Chrome)\n $(el).add($('UL.contextMenu')).bind('contextmenu', function () { return false; });\n });\n return $(this);\n },\n\n /**\n * Disable context menu items on the fly.\n * @memberof external:jQuery.fn\n * @param {void|string} o Comma-separated\n * @returns {external:jQuery}\n */\n disableContextMenuItems (o) {\n if (o === undefined) {\n // Disable all\n $(this).find('LI').addClass('disabled');\n return $(this);\n }\n $(this).each(function () {\n if (o !== undefined) {\n const d = o.split(',');\n for (const href of d) {\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n $(this).find('A[href=\"' + href + '\"]').parent().addClass('disabled');\n }\n }\n });\n return $(this);\n },\n\n /**\n * Enable context menu items on the fly.\n * @memberof external:jQuery.fn\n * @param {void|string} o Comma-separated\n * @returns {external:jQuery}\n */\n enableContextMenuItems (o) {\n if (o === undefined) {\n // Enable all\n $(this).find('LI.disabled').removeClass('disabled');\n return $(this);\n }\n $(this).each(function () {\n if (o !== undefined) {\n const d = o.split(',');\n for (const href of d) {\n // eslint-disable-next-line unicorn/no-fn-reference-in-iterator\n $(this).find('A[href=\"' + href + '\"]').parent().removeClass('disabled');\n }\n }\n });\n return $(this);\n },\n\n /**\n * Disable context menu(s).\n * @memberof external:jQuery.fn\n * @returns {external:jQuery}\n */\n disableContextMenu () {\n $(this).each(function () {\n $(this).addClass('disabled');\n });\n return $(this);\n },\n\n /**\n * Enable context menu(s).\n * @memberof external:jQuery.fn\n * @returns {external:jQuery}\n */\n enableContextMenu () {\n $(this).each(function () {\n $(this).removeClass('disabled');\n });\n return $(this);\n },\n\n /**\n * Destroy context menu(s).\n * @memberof external:jQuery.fn\n * @returns {external:jQuery}\n */\n destroyContextMenu () {\n // Destroy specified context menus\n $(this).each(function () {\n // Disable action\n $(this).unbind('mousedown').unbind('mouseup');\n });\n return $(this);\n }\n });\n return $;\n}\n\nexport default jQueryContextMenu;\n"],"names":["touchHandler","ev","changedTouches","first","type","screenX","screenY","clientX","clientY","simulatedEvent","MouseEvent","bubbles","cancelable","view","window","detail","ctrlKey","altKey","shiftKey","metaKey","button","relatedTarget","length","target","dispatchEvent","preventDefault","document","addEventListener","NS","HTML","MATH","SE","SVG","XLINK","XML","XMLNS","getReverseNS","reverseNS","Object","entries","forEach","name","URI","toLowerCase","SVGPathSeg","constructor","typeAsLetter","owningPathSegList","pathSegType","pathSegTypeAsLetter","_owningPathSegList","_segmentChanged","this","segmentChanged","prototype","classname","PATHSEG_UNKNOWN","PATHSEG_CLOSEPATH","PATHSEG_MOVETO_ABS","PATHSEG_MOVETO_REL","PATHSEG_LINETO_ABS","PATHSEG_LINETO_REL","PATHSEG_CURVETO_CUBIC_ABS","PATHSEG_CURVETO_CUBIC_REL","PATHSEG_CURVETO_QUADRATIC_ABS","PATHSEG_CURVETO_QUADRATIC_REL","PATHSEG_ARC_ABS","PATHSEG_ARC_REL","PATHSEG_LINETO_HORIZONTAL_ABS","PATHSEG_LINETO_HORIZONTAL_REL","PATHSEG_LINETO_VERTICAL_ABS","PATHSEG_LINETO_VERTICAL_REL","PATHSEG_CURVETO_CUBIC_SMOOTH_ABS","PATHSEG_CURVETO_CUBIC_SMOOTH_REL","PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS","PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL","SVGPathSegClosePath","toString","_asPathString","clone","undefined","SVGPathSegMovetoAbs","x","y","_x","_y","defineProperties","get","set","enumerable","SVGPathSegMovetoRel","SVGPathSegLinetoAbs","SVGPathSegLinetoRel","SVGPathSegCurvetoCubicAbs","x1","y1","x2","y2","_x1","_y1","_x2","_y2","SVGPathSegCurvetoCubicRel","SVGPathSegCurvetoQuadraticAbs","SVGPathSegCurvetoQuadraticRel","SVGPathSegArcAbs","r1","r2","angle","largeArcFlag","sweepFlag","_r1","_r2","_angle","_largeArcFlag","_sweepFlag","SVGPathSegArcRel","SVGPathSegLinetoHorizontalAbs","defineProperty","SVGPathSegLinetoHorizontalRel","SVGPathSegLinetoVerticalAbs","SVGPathSegLinetoVerticalRel","SVGPathSegCurvetoCubicSmoothAbs","SVGPathSegCurvetoCubicSmoothRel","SVGPathSegCurvetoQuadraticSmoothAbs","SVGPathSegCurvetoQuadraticSmoothRel","SVGPathElement","createSVGPathSegClosePath","createSVGPathSegMovetoAbs","createSVGPathSegMovetoRel","createSVGPathSegLinetoAbs","createSVGPathSegLinetoRel","createSVGPathSegCurvetoCubicAbs","createSVGPathSegCurvetoCubicRel","createSVGPathSegCurvetoQuadraticAbs","createSVGPathSegCurvetoQuadraticRel","createSVGPathSegArcAbs","createSVGPathSegArcRel","createSVGPathSegLinetoHorizontalAbs","createSVGPathSegLinetoHorizontalRel","createSVGPathSegLinetoVerticalAbs","createSVGPathSegLinetoVerticalRel","createSVGPathSegCurvetoCubicSmoothAbs","createSVGPathSegCurvetoCubicSmoothRel","createSVGPathSegCurvetoQuadraticSmoothAbs","createSVGPathSegCurvetoQuadraticSmoothRel","getPathSegAtLength","distance","isFinite","Error","measurementElement","createElementNS","setAttribute","getAttribute","lastPathSegment","pathSegList","numberOfItems","removeItem","getTotalLength","SVGPathSegList","pathElement","_pathElement","_list","_parsePath","_mutationObserverConfig","attributes","attributeFilter","_pathElementMutationObserver","MutationObserver","_updateListFromPathMutations","bind","observe","_checkPathSynchronizedToList","takeRecords","mutationRecords","hasPathMutations","record","attributeName","_writeListToPath","disconnect","_pathSegArrayAsString","pathSeg","clear","initialize","newItem","_checkValidIndex","index","isNaN","getItem","insertItemBefore","splice","replaceItem","item","appendItem","push","string","builder","appendSegment","source","_string","_currentIndex","_endIndex","_previousCommand","_skipOptionalSpaces","_isCurrentSpace","character","_skipOptionalSpacesOrDelimiter","charAt","hasMoreData","peekSegmentType","lookahead","_pathSegTypeFromChar","_nextCommandHelper","previousCommand","initialCommandIsMoveTo","command","_parseNumber","exponent","integer","frac","decimal","sign","expsign","startIndex","startIntPartIndex","scanIntPartIndex","multiplier","number","_parseArcFlag","flag","flagChar","parseSegment","points","arcAngle","arcLarge","arcSweep","pathSegArray","_pathSegList","normalizedPathSegList","animatedPathSegList","animatedNormalizedPathSegList","$","jQuery","userAgent","Boolean","createSVGRect","navigator","svg","isOpera_","opera","isWebkit_","includes","isGecko_","isIE_","isChrome_","isMac_","isTouch_","supportsSelectors_","querySelector","supportsXpath_","evaluate","supportsPathReplaceItem_","path","seglist","seg","err","supportsPathInsertItemBefore_","supportsGoodTextCharPos_","svgroot","svgcontent","documentElement","append","text","textContent","getStartPositionOfChar","remove","supportsPathBBox_","bbox","getBBox","height","supportsHVLineContainerBBox_","path2","g","width","supportsNonScalingStroke_","rect","retValue","cloneNode","alert","style","vectorEffect","supportsNativeSVGTransformLists_","rxform","transform","baseVal","t1","createSVGTransform","isSVGTransform","o","setMatrix","matrix","a","b","c","d","e","f","isWebkit","isGecko","isIE","isChrome","isMac","isTouch","supportsNonScalingStroke","jQueryPluginSVG","proxied","fn","attr","key","value","len","call","i","elem","namespaceURI","Array","isArray","obj","j","aname","val","transformToString","xform","m","join","cx","cy","K","listMap_","SVGTransformList","_elem","_xforms","_update","tstr","_init","str","re","match","replace","bits","split","valBits","valArr","letters","mtx","createSVGMatrix","values","Number","parseFloat","fname","toUpperCase","slice","_removeFromOtherLists","some","tl","code","newxforms","removeElementFromListMap","id","getTransformList","t","gradientTransform","patternTransform","wAttrs","hAttrs","unitAttrs","elementContainer_","typeMap_","getTypeMap","shortFloat","digits","getRoundDigits","toFixed","convertUnit","unit","getBaseUnit","setUnitAttr","convertToNum","substr","num","getWidth","getHeight","Math","sqrt","isValidUnit","selectedElement","keys","RegExp","test","result","getElement","isNullish","transformPoint","isIdentity","matrixMultiply","args","reduceRight","prev","m1","multiply","abs","hasMatrixTransform","tlist","transformBox","l","w","h","tr","bl","br","minx","min","maxx","max","miny","aabox","transformListToTransform","createSVGTransformFromMatrix","parseInt","temp","mtom","getMatrix","snapToAngle","snap","PI","dx","dy","atan2","dist","snapangle","round","cos","sin","rectsIntersect","KEYSTR","visElemsArr","editorContext_","domdoc_","domcontainer_","svgroot_","init","editorContext","getDOMDocument","getDOMContainer","getSVGRoot","dropXMLInternalSubset","toXml","encode64","input","encodeUTF8","btoa","output","floor","p","chr1","charCodeAt","chr2","chr3","enc1","enc2","enc3","enc4","decode64","atob","decodeUTF8","indexOf","String","fromCharCode","argString","decodeURIComponent","escape","unescape","encodeURIComponent","dataURLToObjectURL","dataurl","Uint8Array","Blob","URL","createObjectURL","arr","mime","bstr","n","u8arr","blob","blankPageObjectURL","text2xml","sXML","out","dXML","DOMParser","ActiveXObject","async","loadXML","parseFromString","e2","bboxToObj","walkTree","cbFn","nodeType","childNodes","walkTreePost","getUrlFromAttr","attrVal","startsWith","substring","getHref","getAttributeNS","setHref","setAttributeNS","findDefs","svgElement","getSVGContent","defs","getElementsByTagNameNS","ownerDocument","firstChild","insertBefore","nextSibling","getPathBBox","tot","bounds","start","P0","getCalc","P1","P2","P3","calc","b2ac","t2","apply","groupBBFix","selected","ref","data","ret","copy","matched","children","filter","find","issue","each","bb","elems","getStrokedBBox","geSelectedElements","elname","nodeName","extent","getExtentOfChar","getComputedTextLength","fo","closest","getPathDFromSegments","pathSegments","singleChar","pts","getPathDFromElement","rx","ry","tagName","r","getExtraAttributesForConvertToPath","attrs","getBBoxOfElementAsPath","addSVGElementFromJson","pathActions","element","eltrans","parentNode","before","resetOrientation","convertToPath","clearSelection","addToSelection","hstry","addCommandToHistory","batchCmd","BatchCommand","extend","addSubCommand","RemoveElementCommand","parent","InsertElementCommand","removeAttribute","getBBoxWithTransform","getRotationAngleFromTransformList","hasMatrixXForm","goodBb","hasAMatrixTransform","angleModulo90","bBoxCanBeOptimizedOverNativeGetBBox","getStrokeOffsetForBBox","sw","fullBb","maxX","maxY","minX","minY","offset","curBb","getVisibleElements","parentElement","contentElems","reverse","getStrokedBBoxDefaultVisible","toRad","N","getRotationAngle","getSelectedElements","getRefElem","getElem","singleNodeValue","assignAttributes","suspendLength","unitCheck","ns","removeAttributeNS","cleanupElement","defaults","opacity","stroke","snapToGrid","stepSize","getSnappingStep","regexEscape","preventClickDefault","img","click","html","ch","getHrefUser","setHrefUser","getRotationAngleUser","sel","querySelectorAll","contextMenuExtensions","injectExtendedContextMenuItemsIntoDom","menuItem","shortcut","label","injectExtendedContextMenuItemIntoDom","addScriptAtts","script","atts","prop","importSetGlobalDefault","url","config","importSetGlobal","returnDefault","global","glob","svgEditor","modules","importScript","importModule","Promise","all","map","u","resolve","reject","vector","random","createElement","scriptOnError","destructor","scriptOnLoad","removeEventListener","revokeObjectURL","src","defer","loader","href","toAbsoluteURL","head","coerce_types","jQueryPluginDBox","strings","ok","cancel","draggable","containment","css","box","btnHolder","dialogContent","dbox","msg","defaultVal","opts","changeListener","checkbox","toggleClass","empty","appendTo","ctrl","chkbx","hide","prependTo","div","tooltip","checked","opt","show","response","focus","confirm","process_cancel","prompt","defaultText","select","txt","HistoryEventTypes","BEFORE_APPLY","AFTER_APPLY","BEFORE_UNAPPLY","AFTER_UNAPPLY","Command","getText","handler","applyFunction","handleHistoryEvent","unapply","unapplyFunction","elements","MoveElementCommand","oldNextSibling","oldParent","newNextSibling","newParent","console","error","ChangeElementCommand","newValues","oldValues","bChangedTransform","rotate","stack","stackItem","assert","cmd","thisElems","isEmpty","historyEventHandler","handler_","undoStackPointer","undoStack","undoChangeStackPointer","undoableChangeStack","resetUndoStack","getUndoStackSize","getRedoStackSize","getNextUndoCommandText","getNextRedoCommandText","undo","redo","beginUndoableChange","attrName","finishUndoableChange","changeset","changes","segData","uiStrings","setUiStrings","strs","assign","ui","pathFuncs","linkControlPts","pathData","setLinkControlPoints","lcp","s","newseg","list","curSeg","ptObjToArr","segItem","getGripPt","altPt","pth","currentZoom","getCurrentZoom","getPointFromGrip","pt","imatrix","addPointGrip","pointGripContainer","getGripContainer","pointGrip","display","fill","cursor","pathNodeTooltip","appendChild","dblclick","setSegType","addCtrlGrip","pathCtrlPtTooltip","getCtrlLine","ctrlLine","getPointGrip","update","getControlPoints","cpt","segItems","segs","gpt","replacePathSeg","segList","getSegSelector","segLine","point","smoothControlPoints","ct1","ct2","nct1","createSVGPoint","nct2","anglea","angleb","angleBetween","angleDiff","newAnglea","newAngleb","Segment","ctrlpts","ptgrip","segsel","showCtrlPts","hasOwnProperty","selectCtrls","addGrip","full","move","curPts","next","nextPts","mate","itm","setLinked","anum","moveCtrl","setType","newType","Path","selected_pts","first_seg","segment","startI","nextSeg","prevSeg","startSeg","eachSeg","addSeg","newX","newY","p0x","p1x","p2x","p01x","p12x","p0y","p1y","p2y","p01y","p12y","deleteSeg","removePtFromSelection","pos","storeD","last_d","selectPt","movePts","dragctrl","selPt","cur","curX","curY","prevX","prevY","olditem","old","diffX","diffY","endChanges","ctrlNum","addPtsToSelection","inverse","resetD","indexes","sort","grips","closedSubpath","subpathIsClosed","clsd","getPath_","removePath_","newcx","newcy","oldcx","oldcy","getRotVals","theta","recalcRotatedPath","currentPath","oldbox","oldbbox","rvals","cVals1","cVals2","Rnc","setRotate","clearData","reorientGrads","utilsGetBBox","grad","pt1","pt2","gCoords","newgrad","getNextId","pathMap","convertPath","toRel","curx","cury","lastM","letter","pathDSegment","morePoints","lastPoint","pnt","newPoint","firstCtrl","subpath","hasMoved","mouseDown","evt","mouseTarget","startX","startY","curPt","getCurrentMode","cur_pt","dragging","parts","rubberBox","getRubberBox","setRubberBox","selectorManager","getRubberBandBox","mouseX","mouseY","stretchy","getGridSnapping","keep","drawnPath","getDrawnPath","FUZZ","clickOnPoint","px","py","getId","newpath","sSeg","absX","absY","endseg","setDrawnPath","setStarted","remapElement","newD","origD","toEditMode","contains","getContainer","getMouseTarget","last","lastx","lasty","xya","dAttr","curStyles","getOpacity","mouseMove","mpt","rbb","ptBb","pointGrip1","pointGrip2","ptX","ptY","altX","altY","lastX","lastY","mouseUp","lastPt","toSelectMode","setCurrentMode","selPath","addSubPath","on","reorient","zoomChange","getNodePoint","linkControlPoints","linkPoints","clonePathNode","selPts","nums","opencloseSubPath","openPt","startItem","closer","zSeg","deletePathNode","canDeleteNodes","cleanup","remItems","count","nprev","prevType","canvas","deleteSelectedElements","cp","smoothPolylineIntoPath","curpos","prevCtlPt","end","newpts","prevArr","v","moveNode","newValue","diff","fixEnd","Layer","group","svgElem","name_","group_","svgdoc","layerTitle","after","classes","CLASS_NAME","CLASS_REGEX","addLayerClass","getName","getGroup","activate","deactivate","setVisible","visible","expected","isVisible","setOpacity","appendChildren","child","getTitleElement","setName","hrService","previousName","title","changeElement","removeGroup","HistoryRecordingService","undoManager","undoManager_","currentBatchCommand_","batchCommandStack_","startBatchCommand","endBatchCommand","batchCommand","pop","addCommand_","moveElement","insertElement","removeElement","NO_HISTORY","copyElem","el","newEl","localName","fixedD","nodeValue","visElems","RandomizeModes","randIds","disabledElems","historyRecordingService","canvas_","undoMgr","findLayerNameInGroup","getNewLayerName","existingLayerNames","Drawing","optIdPrefix","svgElem_","obj_num","idPrefix","releasedNums","all_layers","layer_map","current_layer","nonce_","setNonce","getElem_","getSvgElem","getNonce","clearNonce","oldObjNum","restoreOldObjNum","releaseId","front","getNumLayers","hasLayer","getLayerName","getCurrentLayer","getLayerByName","layer","getCurrentLayerName","setCurrentLayerName","finalName","oldName","setCurrentLayerPosition","newpos","layerCount","oldpos","currentGroup","refGroup","identifyLayers","setCurrentLayer","mergeLayer","prevGroup","layerNextSibling","mergeAllLayers","deleteCurrentLayer","oldLayerGroup","numchildren","orphans","layernames","childgroups","createLayer","cloneLayer","getLayerVisibility","layerName","setLayerVisibility","bVisible","getLayerOpacity","setLayerOpacity","that","utilCopyElem","randomizeIds","enableRandomization","currentDrawing","leaveContext","getCurrentDrawing","newLayer","currentLayer","renameCurrentLayer","newName","drawing","newPos","prevVisibility","oldDisplay","moveSelectedToLayer","selElems","oldLayer","changeSVGContent","orig","elData","setCurrentGroup","setContext","parentsUntil","andSelf","siblings","opac","getCurrentGroup","REVERSE_NS","svgWhiteList_","circle","clipPath","desc","ellipse","feGaussianBlur","feMorphology","foreignObject","image","line","linearGradient","marker","mask","metadata","pattern","polygon","polyline","radialGradient","stop","switch","symbol","textPath","tspan","use","annotation","maction","math","menclose","merror","mfrac","mi","mmultiscripts","mn","mo","mover","mpadded","mphantom","mprescripts","mroot","mrow","mspace","msqrt","mstyle","msub","msubsup","msup","mtable","mtd","mtext","mtr","munder","munderover","none","semantics","svgWhiteListNS_","elt","attNS","att","sanitizeSvg","node","doc","allowedAttrs","allowedAttrsNS","seAttrs","attrLocalName","attrNsURI","props","styleAttrName","trim","styleAttrVal","hasChildNodes","remap","scalew","scaleh","doSnapping","finishUp","getDrawing","elName","chlist","mt","existing","tNew","tbox","gsvg","pstr","firstseg","currentpt","dstr","context_","updateClipPath","tx","ty","cpXform","newxlate","setTranslate","recalculateDimensions","k","noi","mxs","mNew","oldcenter","newcenter","initial","getStartTransform","gangle","rm","firstM","oldStartTransform","operation","tm","sm","tmn","childTlist","setStartTransform","e2t","t2n","s2","translateOrigin","scale","translateBack","setScale","T_M","mInv","M2","clipPathsDone","uses","useElem","usexlate","newRot","em","e2m","avg","roldt","rold","rnew","rnewInv","extrat","paint","gtlist","gmatrix","mStr","oldxlate","meq","meqInv","tspanChanges","svgFactory_","config_","selectorManager_","gripRadius","Selector","locked","selectorGroup","createSVGElement","selectorRect","gripCoords","nw","ne","se","reset","resize","showGrips","bShow","selectorGripsGroup","hasGrips","updateGripCursors","selectedBox","mgr","selectedGrips","selectorGrips","strokedBbox","nbox","nbax","nbay","nbaw","nbah","rot","svgRoot","rotm","maxy","dir","coords","rotateGripConnector","rotateGrip","dirArr","steps","shift","gripElement","SelectorManager","selectorParentGroup","rubberBandBox","selectors","selectorMap","initGroup","grip","imgPath","dimensions","canvasbg","overflow","svgContent","requestSelector","releaseSelector","log","UndoManager","postError","SvgCanvas","container","curConfig","show_outside_canvas","selectNew","importNode","clearSvgContentElement","xmlns","comment","createComment","idprefix","setIdPrefix","current_drawing_","draw","allProperties","shape","initFill","color","fill_paint","fill_opacity","initStroke","stroke_paint","stroke_opacity","stroke_width","stroke_dasharray","stroke_linejoin","stroke_linecap","initOpacity","font_size","font_family","curShape","selectedElements","getJsonFromSvgElement","retval","createTextNode","namespace","baseUnit","elementContainer","body","inch","ex","in","cm","mm","pc","unitsInit","saveOptions","round_digits","getSelectedElems","pathModule","utilsInit","snappingStep","gridSnapping","recalculateInit","startTransform","nsMap","eventType","EventTypes","cmdType","isApply","restoreRefElems","setUseData","stdDeviation","setBlurOffsets","getZoom","svgFactory","selectInit","jsonMap","arg","events","noCall","elemsToAdd","compareDocumentPosition","correspondingUseElement","started","rb","closed_subpath","currentMode","dp","refAttrs","opacAni","begin","dur","removedElements","childs","getElementsByTagName","encodableImages","importIds","curText","extensions","lastGoodImgUrl","currentResizeMode","curProperties","justSelected","curBBoxes","lastClickPoint","runExtension","action","vars","runExtensions","returnArray","nameFilter","ext","addExtension","extInitFunc","jq","importLocale","TypeError","argObj","getPrivateMethods","nonce","extObj","getIntersectionList","rubberBBox","resultList","getVisibleElementsAndBBoxes","groupSvgElem","replaceWith","prepareSvg","newDoc","ffClone","setRotationAngle","preventUndo","oldTransform","center","newTransform","changeSelectedAttribute","recalculateAllSelectedDimensions","logMatrix","rootSctm","selectOnly","removeFromSelection","elemsToRemove","newSelectedItems","selectAllInCurrentLayer","freehand","parameter","nextParameter","rStartX","rStartY","initBbox","sumDistance","controllPoint2","controllPoint1","bSpline","nextPos","getBsplinePoint","spline","p0","p1","p2","p3","t3","mousedown","spaceKey","rightClick","cloneSelectedElements","getScreenCTM","pageX","pageY","realX","realY","griptype","slist","iswebkit","delayedStroke","ele","stroke_","setTimeout","newImage","strokeW","textActions","extResult","event","start_x","start_y","mousemove","newList","intElem","foundInd","hasMatrix","left","top","sy","sx","square","rad","STEP_COUNT","mouse_x","mouse_y","pushGroupProperties","mouseup","tempJustSelected","factor","commaIndex","res","addedNew","cAni","aniDur","beginElement","to","setMode","originalEvent","workarea","rulerwidth","showRulers","editorFullW","editorFullH","editorW","editorH","workareaViewW","workareaViewH","wOffset","wOffsetLeft","wOffsetTop","delta","wheelDelta","wZoom","hZoom","ceil","zoomlevel","topLeftOld","newCtr","setZoom","curtext","textinput","selblock","blinker","textbb","allowDbl","chardata","setCursor","arguments","selectionEnd","selectionStart","charbb","setSelectionRange","setInterval","startPt","ptToScreen","endPt","visibility","setSelection","skipInput","startbb","endbb","getIndexFromPoint","charpos","getCharNumAtPosition","setCursorFromPoint","setEndSelectionFromPoint","i1","i2","screenToPt","xIn","yIn","selectAll","unbind","selectWord","ept","selectElem","clearInterval","blur","setInputElem","inputElem","getEndPositionOfChar","contentW","removeUnusedDefElems","defelemUses","numRemoved","alen","allEls","allLen","defelems","defelem","getIssues","issues","issueCodes","issueList","exportNoBlur","exportNoforeignObject","exportNoDashArray","content","getContext","exportNoText","descr","canvg","svgCanvasToString","nakedSvgs","svgToString","indent","unitRe","getResolution","vb","nsuris","uri","attrNames","mozAttrs","styleName","images","bOneLine","embedImage","Image","load","status","xhr","statusText","cvs","drawImage","urldata","toDataURL","setGoodImage","open","save","rasterExport","imgType","quality","exportWindowName","mimeType","canvgPath","contentH","dataURLType","datauri","bloburl","done","avoidEvent","toBlob","exportPDF","outputType","jsPDF","modularVersion","jspdfPath","orientation","format","docTitle","getDocumentTitle","setProperties","addSVG","getSvgString","uniquifyElems","ids","refElems","hrefs","attrnode","getAttributeNode","refid","oldid","newid","ownerElement","hreffers","hreffer","refElem","convertGradients","fillStrokeElems","convertToGroup","$elem","ts","unwrap","removeData","hasMore","dupeGrads","setSvgString","xmlString","firstElementChild","oldzoom","adoptNode","pa","percs","dim","importSvgString","useEl","uid","useExisting","parents","innerw","innerh","innervb","canvash","dr","propVal","cg","getContentElem","getRootElem","zoom","getSnapToGrid","getVersion","notification","common","setConfig","getTitle","setGroupTitle","prepend","tsNextSibling","setDocumentTitle","newTitle","oldTitle","getEditorNS","add","setResolution","visEls","moveSelectedElements","viewBox","getOffset","setBBoxZoom","spacer","calcZoom","newzoom","selectedElems","zoomLevel","getMode","getColor","setColor","addNonG","changeSelectedAttributeNoUndo","setGradient","duplicateGrad","findDuplicateGradient","existingGrads","radAttrs","og","gradAttrs","ogAttrs","stops","ostops","ostop","setPaint","jGraduate","Paint","setPaintOpacity","alpha","solidColor","setStrokePaint","setFillPaint","getStrokeWidth","setStrokeWidth","setStrokeAttr","getStyle","getFillOpacity","getStrokeOpacity","getPaintOpacity","getBlur","curCommand","filterHidden","finishChange","bCmd","setBlurNoUndo","setBlur","filterElem","stdDev","complete","elemId","newblur","getBold","setBold","getItalic","setItalic","getFontFamily","setFontFamily","setFontColor","getFontColor","getFontSize","setFontSize","setTextContent","setImageURL","setsize","curHref","setLinkURL","parentsA","setRectRadius","makeHyperlink","groupSelectedElements","removeHyperlink","ungroupSelectedElement","noXYElems","oldval","newrot","selectedCopy","cutSelectedElements","copySelectedElements","CLIPBOARD_ID","flashStorage","sessionStorage","localStorage","setItem","JSON","stringify","menu","enableContextMenuItems","pasteElements","clipb","parse","pasted","changedIDs","checkIDs","extChanges","removeID","clipBoardItem","ctrX","ctrY","urlArg","cmdStr","undoable","glist","gattrs","gfilter","gblur","newOpac","cblur","origCblur","suffix","chtlist","rgm","rcm","cangle","cbox","ceqm","coldc","sangle","trm","oldxform","newxform","chm","chmInv","gm","anchor","gNextSibling","moveToTopSelectedElement","moveToBottomSelectedElement","moveUpDownSelected","foundCur","toArray","copiedElements","alignSelectedElements","relativeTo","bboxes","MAX_VALUE","MIN_VALUE","curwidth","curheight","updateCanvas","bg","oldX","oldY","bgImg","new_x","new_y","old_x","old_y","d_x","d_y","setBackground","border","bgPattern","preserveAspectRatio","cycleElement","curElem","allElems","SVGEditTransformList","isOpera","fixIDs","svgEl","svgNum","force","idElems","newId","oldVal","newVal","toFixedNumeric","precision","langParam","setStrings","editor_","readLang","langData","more","addLangData","merge","tools","properties","layers","curve_segments","fitToContent","fit_to_all","fit_to_canvas","fit_to_layer_content","fit_to_sel","icon_large","icon_medium","icon_small","icon_xlarge","image_opt_embed","image_opt_ref","includedImages","included_images","largest_object","layersLabel","page","relativeToLabel","selLayerLabel","move_elems_to","selectedPredefined","select_predefined","selected_objects","smallest_object","straight_segments","svginfo_bg_url","editor_img_url","svginfo_bg_note","editor_bg_note","svginfo_change_background","background","svginfo_dim","doc_dims","svginfo_editor_prefs","editor_prefs","svginfo_height","svginfo_icons","icon_size","svginfo_image_props","image_props","svginfo_lang","language","svginfo_title","doc_title","svginfo_width","tool_docprops_cancel","tool_docprops_save","tool_source_cancel","tool_source_save","tool_prefs_cancel","tool_prefs_save","sidepanel_handle","tool_clear","new_doc","tool_docprops","docprops","tool_export","export_img","tool_import","import_doc","tool_open","open_doc","tool_save","save_doc","tool_editor_prefs","tool_editor_homepage","editor_homepage","svginfo_units_rulers","units_and_rulers","svginfo_rulers_onoff","show_rulers","svginfo_unit","base_unit","svginfo_grid_settings","grid","svginfo_snap_onoff","snapping_onoff","svginfo_snap_step","snapping_stepsize","svginfo_grid_color","grid_color","del","ariaLabels","tool_blur","tool_position","align_to_page","tool_font_family","zoom_panel","zoom_level","linejoin_miter","linecap_butt","tool_opacity","group_opacity","align_relative_to","circle_cx","circle_cy","circle_r","cornerRadiusLabel","corner_radius","ellipse_cx","ellipse_cy","ellipse_rx","ellipse_ry","fill_color","idLabel","image_height","image_url","image_width","layer_delete","layer_down","move_down","layer_new","new","layer_rename","rename","layer_moreopts","more_opts","layer_up","move_up","line_x1","line_x2","line_y1","line_y2","linecap_round","linecap_square","linejoin_bevel","linejoin_round","main_icon","main_menu","palette","palette_info","path_node_x","node_x","path_node_y","node_y","rect_height_tool","rect_height","rect_width_tool","rect_width","seg_type","selLayerNames","move_selected","selected_x","pos_x","selected_y","pos_y","stroke_color","stroke_style","text_contents","toggle_stroke_tools","tool_add_subpath","add_subpath","tool_alignbottom","align_bottom","tool_aligncenter","align_center","tool_alignleft","align_left","tool_alignmiddle","align_middle","tool_alignright","align_right","tool_aligntop","align_top","tool_angle","tool_bold","bold","tool_circle","mode_circle","tool_clone","tool_clone_multi","tool_delete","tool_delete_multi","tool_ellipse","mode_ellipse","tool_fhellipse","mode_fhellipse","tool_fhpath","mode_fhpath","tool_fhrect","mode_fhrect","tool_font_size","tool_group_elements","group_elements","tool_make_link","make_link","tool_link_url","set_link_url","tool_image","mode_image","tool_italic","italic","tool_line","mode_line","tool_move_bottom","move_bottom","tool_move_top","move_top","tool_node_clone","node_clone","tool_node_delete","node_delete","tool_node_link","node_link","tool_openclose_path","openclose_path","tool_path","mode_path","tool_rect","mode_rect","tool_redo","tool_reorient","reorient_path","tool_select","mode_select","tool_source","source_save","tool_square","mode_square","tool_text","mode_text","tool_topath","to_path","tool_undo","tool_ungroup","ungroup","tool_wireframe","wireframe_mode","tool_zoom","mode_zoom","url_notice","no_embed","_slicedToArray","_arrayWithHoles","Symbol","iterator","_arr","_n","_d","_e","_s","_i","_iterableToArrayLimit","_nonIterableRest","$q","Utils","editor","which","hotkeys","specialKeys","shiftNums","version","special","svgIcons","file","svgns","iconW","iconH","testImg","iconsMade","dataLoaded","loadAttempts","dataPre","dataEl","holder","svgz","contentDocument","getIcons","err1","useFallback","parser","ajax","dataType","success","responseText","noWait","isReady","getElementById","no_img","makeIcons","testSrc","alt","testIconAlt","setIcon","icon","setID","cl","alts","removeAttr","addIcon","id_match","toImage","fallback","tempHolder","fallback_path","imgsrc","class","XMLSerializer","serializeToString","placement","resizeSvgIcons","callback","regFile","getSvgIcon","uniqueClone","changeSel","size","widget","loadingStylesheets","options","jGraduateDefaults","pickerTitle","clientPath","newstop","mkElem","newparent","setAttrs","okCallback","cancelCallback","$this","$settings","idref","okClicked","cancelClicked","$win","addClass","colPicker","gradPicker","attrInput","curType","curGradient","gradalpha","isSolid","stopGroup","mkStop","inverted","inv","fx","fy","previewRect","MAX","beginCoord","endCoord","centerCoord","focusCoord","showFocus","colr","stopElem","pickerD","pathbg","selectStop","drag","curStop","dragColor","remDrags","stopOffset","stopMakerDiv","colorhandle","stopOpacity","stopColor","thisAlpha","bottom","jPicker","active","alphaSupport","clr","arg2","curS","newcolor","newopac","isRadial","attrval","change","cssName","delStop","remStop","scaleX","scaleY","cX","cY","xfStr","sX","stopMakerSVG","transPattern","patternUnits","transImg","bgImage","stopPropagation","mouseover","spreadMethodOpt","draggingCoord","onCoordDrag","fracx","fracy","grd","onCoordUp","lastfx","lastfy","slider","numstops","toggle","fX","fY","ellipVal","angleVal","sliders","radius","handle","ellip","dragSlider","stopSlider","isRad","xpos","SLIDERW","posx","setSlider","effects","speed","tabs","tab","removeClass","newGrad","curStops","SpinButton","cfg","coord","offsetParent","browser","msie","currentStyle","position","repeating","spinCfg","step","stepfunc","upClass","downClass","delay","interval","_btn_width","_direction","_delay","_repeat","smallStep","adjustValue","spinClass","stateObj","tool_scale","direction","offsetWidth","mouseout","clearTimeout","adjust","keydown","keyCode","keypress","keyup","win","contextMenu","listener","inSpeed","outSpeed","srcElement","allowLeft","hasClass","xOff","yOff","fadeIn","prevAll","eq","nextAll","trigger","docX","docY","fadeOut","mozilla","MozUserSelect","disableContextMenuItems","disableContextMenu","enableContextMenu","destroyContextMenu","Slider","bar","fireChangeEvents","context","changeEvents","changeEvent","off","timeout","setValuesFromMousePosition","barW","barH","locX","locY","rangeX","rangeY","changed","arrow","range","newMinX","newMaxX","newMinY","newMaxY","destroy","arrowW","arrowH","arrowOffsetX","arrowOffsetY","ColorValuePicker","picker","bindedHex","alphaPrecision","inputs","keyDown","hex","validateKey","red","setValueInRange","green","blue","hue","saturation","keyUp","ahex","colorChanged","List","Color","ColorMethods","rgbaToHex","nameLength","hexToRgba","newV","rgb","hsv","rgbToHsv","hsvToRgb","intToHex","validateHex","hexToInt","rgba","dec","q","commitCallback","liveCallback","settings","bindToInput","expandable","current","liveUpdate","isLessThanIE7","appVersion","filters","setColorMode","colorMode","rgbMap","rgbBar","mode","setBG","colorMapDiv","setImgLoc","colorMapL1","setAlpha","colorMapL2","colorBarDiv","colorBarL1","colorBarL2","colorBarL3","colorBarL4","colorBarL6","colorMap","colorBar","activeColorChanged","positionMapAndBarArrows","updatePreview","updateMapVisuals","updateBarVisuals","mapValueChanged","xy","colorBarValueChanged","sv","hv","hs","rg","activePreview","backgroundColor","colorMapL3","colorBarL5","hva","saturatedColor","hsa","valueColor","hValue","vValue","middle","setImg","backgroundImage","revertColor","commitColor","radioClicked","currentClicked","cancelButton","okButton","iconImageClicked","currentColorChanged","currentPreview","expandableColorChanged","va","iconColor","iconAlpha","updateInputColor","moveBarMouseDown","elementStartX","elementStartY","pageStartX","pageStartY","documentMouseMove","documentMouseUp","support","boxModel","quickPickClicked","attachIFrame","table","zIndex","slideDown","removeIFrame","slideUp","popup","onselectstart","controlHtml","localization","newColor","tooltips","colors","currentColor","buttons","radio","textbox","tbody","MapMaps","BarMaps","colorPicker","preview","quickList","quickHex","iconImage","moveBar","reduce","func","favicon","exportWindowCt","langChanged","showSaveWarning","storagePromptState","callbacks","defaultPrefs","lang","iconsize","bkgd_color","bkgd_url","img_save","save_notice_done","export_notice_done","defaultExtensions","defaultConfig","canvasName","canvas_expansion","colorPickerCSS","initTool","exportWindowType","wireframe","showlayers","no_save_warning","langPath","extPath","jGraduatePath","extIconsPath","gridColor","preventAllURLConfig","preventURLContentLoading","lockExtensions","noDefaultExtensions","showGrid","noStorageOnLoad","forceStorage","emptyStorageOnDecline","avoidClientSide","avoidClientSideDownload","avoidClientSideOpen","svgCanvas","customExportImage","customExportPDF","curPrefs","stylesheets","allowedOrigins","loadSvgString","noAlert","errorLoadingSVG","getImportLocale","defaultLang","defaultName","pref","mayBeEmpty","putLocale","givenParam","goodLangs","conf","userLanguage","loadContentAndPrefs","cookie","storage","cached","loadFromString","storeKey","preferenceForKey","cfgCfg","extendOrAdd","cfgObj","overwrite","allowInitialUserOverride","concat","setCustomHandlers","ready","exportImage","setupCurConfig","grep","search","searchParams","location","params","coerce","param","keys_last","deparam","has","pathConfig","loadFromDataURI","loadFromURL","iconId","forcedSize","extAndLocaleFunc","setLang","logo","select_node","fh_rect","fh_ellipse","pencil","pen","close_path","open_path","arrow_right","arrow_right_big","arrow_down","new_image","export","import","delete","go_up","go_down","context_menu","link_controls","unlink_use","c_radius","fontsize","align","eye","no_color","warning","globe_link","icons","tleft","minHeight","outerHeight","getStylesheetPriority","stylesheetFile","Infinity","setIconSize","shower","priorityA","priorityB","Set","idx","_ref","beforeDefault","afterDefault","faviconDefault","canvasDefault","_ref$image","imageDefault","acceptErrors","setupLink","stylesheetURL","_stylesheetURL2","_stylesheetURL2$","_options$favicon","_options2","_options2$before","_options2$after","_options2$canvas","_options2$image","addLink","link","rej","endsWith","rel","cnv","loadStylesheets","runCallbacks","extName","extname","imported","extensionsAdded","Actions","setAll","messageQueue","messageObj","setFlyoutPositions","outerWidth","uaPrefix","regex","someScript","selToscale","xl","hiddenPs","sides","scaleElements","cssResizeRules","ruleElem","styleStr","selector","rules","prefix","modKey","canvMenu","paintBox","resizeTimer","curScrollPos","exportWindow","defaultImageURL","zoomInIcon","zoomOutIcon","uiContext","opener","svgEditorReadyEvent","CustomEvent","setSelectMode","curr","origTitle","rIntervals","toggleHighlightLayer","layerNameToHighlight","curNames","numLayers","curName","populateLayers","layerlist","currentLayerName","layerTr","layerVis","row","vis","editingsource","origSource","showSourceEditor","forSaving","multiselected","operaRepaint","setStrokeOpt","changeElem","pre","toolButtonClick","noHiding","clickSelect","dataURI","promptImgURL","cancelDeletes","curhref","enterNewImgURL","updateRulers","scanvas","contentElem","isX","lentype","contentDim","$hcanvOrig","$hcanv","hcanv","rulerLen","totalLen","ctxArr","ctxArrNum","ctx","fillStyle","fillRect","uMulti","rawM","multi","bigInt","font","rulerD","labelPos","ctxNum","curD","moveTo","lineTo","decs","fillText","part","subD","lineNum","strokeStyle","wArea","cnvs","wOrig","hOrig","oldCtr","scrollLeft","scrollTop","oldCanY","oldCanX","newCanY","newCanX","ratio","scrollX","scrollY","scroll","storagePrompt","updateToolButtonState","bNoFill","bNoStroke","buttonsNeedingStroke","buttonsNeedingFillAndStroke","btn","nofill","nostroke","hasEnabled","updateContextPanel","isNode","menuItems","blurval","segType","noPath","panels","linkHref","curPanel","bv","setInputWidth","updateWireFrame","supportsNonSS","rule","curContext","updateTitle","zoomDone","zoomChanged","autoCenter","zInfo","changeZoom","ctl","delegate","prepPaints","prep","flyoutFuncs","setFlyoutTitles","allHolders","setupFlyouts","holders","holdSel","btnOpts","not","showSel","timer","def","idSel","_","isDefault","flyoutAction","flyoutIsSelected","currentOperation","tool","time","animate","is","makeFlyoutHolder","addAltDropDown","elemSel","listSel","dropUp","seticon","onButton","hover","multiclick","extsPreLang","gWidth","swidth","opacPerc","updateToolbar","editmode","togglePathEditMode","ang","isSvgElem","isLayer","wind","download","note","saveFromBrowser","defsFailOnSave","closed","popupWindowBlocked","noteTheseIssues","linkStr","cbCalled","resizeDone","langReady","loadedExtensionNames","runCallback","btnSelects","context_tools","contId","container_id","panel","defval","colnum","inp","spindata","svgicons","fallbackObj","altsObj","placementObj","cls","flyoutHolder","showBtn","refData","refBtn","svgicon","includeWith","tlsId","getButtonData","curH","blocks","curBg","changeOpacity","changeBlur","noUndo","promptMoveLayerOnce","destLayer","selectedIndex","confirmStr","QmoveElemsToLayer","moveToLayer","invalidAttrValGiven","unitData","panning","keypan","setPanning","overlay","jsHover","setClick","listItems","addDropDown","perc","slide","noop","slideStart","unfocus","clickFHPath","clickLine","clickSquare","clickRect","clickFHRect","clickCircle","clickEllipse","clickFHEllipse","clickImage","clickZoom","zoomImage","dblclickZoom","clickText","clickPath","deleteSelected","cutSelected","copySelected","pasteInCenter","moveToTopSelected","moveToBottomSelected","reorientPath","enterNewLinkURL","moveSelected","linked","sp","selectNext","selectPrev","rotateSelected","cw","clickClear","QwantToClear","clickBold","clickItalic","loadingURL","clickExport","openExportWindow","loadingImage","popHTML","popURL","chrome","clickOpen","clickImport","clickUndo","clickRedo","clickGroup","clickClone","clickAlign","clickWireframe","wfRules","preferences","showDocProperties","showPreferences","canvasBg","blk","isBg","openHomePage","hideSourceEditor","saveSourceEditor","saveChanges","QerrorsRevertToSource","hideDocProperties","hidePreferences","saveDocProperties","noContentToFitTo","savePreferences","resetScrollPos","cancelOverlays","QignoreSourceChanges","winWh","curval","curClass","allTools","shortcutButtons","pick_stroke_paint_opacity","pick_fill_paint_opacity","PaintBox","docElem","ctr","ptype","fillAttr","_paintColor","_paintOpacity","gPaint","defColor","getPaint","testEl","blurTest","deleteLayer","moveLayer","total","curIndex","stdDeviationX","featNotSupported","uniqName","enterUniqueLayerName","dupeLayerName","enterNewLayerName","layerHasThatName","sidedrag","sidedragging","allowmove","changeSidePanelWidth","rulerX","resizeSidePanel","deltaX","sideWidth","toggleSidePanel","close","dpr","devicePixelRatio","wh","dims","dialogSelectors","toolButtons","saveOpts","clickSave","every","hidekey","keyAssocs","flyouts","keyHandler","fH","margin","keyval","pd","setTitles","keyStr","modBits","mod","lastChild","itool","preTool","regTool","origVal","sugVal","increasing","handlerKey","getCustomHandler","lmenuFunc","enableOrDisableClipboard","svgeditClipboard","returnValue","unsavedChanges","getUIStrings","openPrep","QwantToOpen","FileReader","importImage","dataTransfer","files","reader","onloadend","newElement","readAsText","imgWidth","imgHeight","naturalWidth","offsetHeight","naturalHeight","insertNewImage","readAsDataURL","imgImport","allStrings","renameLayer","loadedExtensionName","dest","localeInit","protocol","cb","disableUI","featList","cache","beforeSend","stat","URLLoadFail","base64","initArgs","origin"],"mappings":"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"}
\ No newline at end of file
+{"version":3,"file":"index-es.min.js","sources":["../src/editor/touch.js","../src/common/namespaces.js","../src/common/svgpathseg.js","../src/common/browser.js","../src/common/jQuery.attr.js","../src/common/svgtransformlist.js","../src/common/units.js","../src/common/math.js","../src/common/utilities.js","../src/editor/contextmenu.js","../src/external/dynamic-import-polyfill/importModule.js","../src/external/deparam/deparam.esm.js","../src/svgcanvas/dbox.js","../src/svgcanvas/history.js","../src/svgcanvas/path.js","../src/common/layer.js","../src/svgcanvas/historyrecording.js","../src/svgcanvas/copy-elem.js","../src/svgcanvas/draw.js","../src/svgcanvas/sanitize.js","../src/svgcanvas/coords.js","../src/svgcanvas/recalculate.js","../src/svgcanvas/select.js","../src/svgcanvas/svgcanvas.js","../src/editor/svgicons/jQuery.svgIcons.js","../src/editor/jgraduate/jQuery.jGraduate.js","../src/editor/jgraduate/jQuery.jPicker.js","../src/editor/locale/locale.js","../src/external/load-stylesheets/index-es.js","../src/editor/svg-editor.js","../src/editor/js-hotkeys/jquery.hotkeys.min.js","../src/editor/spinbtn/jQuery.SpinButton.js","../src/editor/contextmenu/jQuery.contextMenu.js"],"sourcesContent":["// http://ross.posterous.com/2008/08/19/iphone-touch-events-in-javascript/\n/**\n *\n * @param {Event} ev\n * @returns {void}\n */\nfunction touchHandler (ev) {\n const {changedTouches} = ev,\n first = changedTouches[0];\n\n let type = '';\n switch (ev.type) {\n case 'touchstart': type = 'mousedown'; break;\n case 'touchmove': type = 'mousemove'; break;\n case 'touchend': type = 'mouseup'; break;\n default: return;\n }\n\n const {screenX, screenY, clientX, clientY} = first; // eslint-disable-line no-shadow\n const simulatedEvent = new MouseEvent(type, {\n // Event interface\n bubbles: true,\n cancelable: true,\n // UIEvent interface\n view: window,\n detail: 1, // click count\n // MouseEvent interface (customized)\n screenX, screenY, clientX, clientY,\n // MouseEvent interface (defaults) - these could be removed\n ctrlKey: false,\n altKey: false,\n shiftKey: false,\n metaKey: false,\n button: 0, // main button (usually left)\n relatedTarget: null\n });\n if (changedTouches.length < 2) {\n first.target.dispatchEvent(simulatedEvent);\n ev.preventDefault();\n }\n}\n\ndocument.addEventListener('touchstart', touchHandler, true);\ndocument.addEventListener('touchmove', touchHandler, true);\ndocument.addEventListener('touchend', touchHandler, true);\ndocument.addEventListener('touchcancel', touchHandler, true);\n","/**\n * Namespaces or tools therefor.\n * @module namespaces\n * @license MIT\n*/\n\n/**\n* Common namepaces constants in alpha order.\n* @enum {string}\n* @type {PlainObject}\n* @memberof module:namespaces\n*/\nexport const NS = {\n HTML: 'http://www.w3.org/1999/xhtml',\n MATH: 'http://www.w3.org/1998/Math/MathML',\n SE: 'http://svg-edit.googlecode.com',\n SVG: 'http://www.w3.org/2000/svg',\n XLINK: 'http://www.w3.org/1999/xlink',\n XML: 'http://www.w3.org/XML/1998/namespace',\n XMLNS: 'http://www.w3.org/2000/xmlns/' // see http://www.w3.org/TR/REC-xml-names/#xmlReserved\n};\n\n/**\n* @function module:namespaces.getReverseNS\n* @returns {string} The NS with key values switched and lowercase\n*/\nexport const getReverseNS = function () {\n const reverseNS = {};\n Object.entries(NS).forEach(([name, URI]) => {\n reverseNS[URI] = name.toLowerCase();\n });\n return reverseNS;\n};\n","/* eslint-disable import/unambiguous */\n/* globals SVGPathSeg, SVGPathSegMovetoRel, SVGPathSegMovetoAbs,\n SVGPathSegMovetoRel, SVGPathSegLinetoRel, SVGPathSegLinetoAbs,\n SVGPathSegLinetoHorizontalRel, SVGPathSegLinetoHorizontalAbs,\n SVGPathSegLinetoVerticalRel, SVGPathSegLinetoVerticalAbs,\n SVGPathSegClosePath, SVGPathSegCurvetoCubicRel,\n SVGPathSegCurvetoCubicAbs, SVGPathSegCurvetoCubicSmoothRel,\n SVGPathSegCurvetoCubicSmoothAbs, SVGPathSegCurvetoQuadraticRel,\n SVGPathSegCurvetoQuadraticAbs, SVGPathSegCurvetoQuadraticSmoothRel,\n SVGPathSegCurvetoQuadraticSmoothAbs, SVGPathSegArcRel, SVGPathSegArcAbs */\n/**\n* SVGPathSeg API polyfill\n* https://github.com/progers/pathseg\n*\n* This is a drop-in replacement for the `SVGPathSeg` and `SVGPathSegList` APIs\n* that were removed from SVG2 ({@link https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html}),\n* including the latest spec changes which were implemented in Firefox 43 and\n* Chrome 46.\n*/\n/* eslint-disable no-shadow, class-methods-use-this, jsdoc/require-jsdoc */\n// Linting: We avoid `no-shadow` as ESLint thinks these are still available globals\n// Linting: We avoid `class-methods-use-this` as this is a polyfill that must\n// follow the conventions\n(() => {\nif (!('SVGPathSeg' in window)) {\n // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSeg\n class SVGPathSeg {\n constructor (type, typeAsLetter, owningPathSegList) {\n this.pathSegType = type;\n this.pathSegTypeAsLetter = typeAsLetter;\n this._owningPathSegList = owningPathSegList;\n }\n // Notify owning PathSegList on any changes so they can be synchronized back to the path element.\n _segmentChanged () {\n if (this._owningPathSegList) {\n this._owningPathSegList.segmentChanged(this);\n }\n }\n }\n SVGPathSeg.prototype.classname = 'SVGPathSeg';\n\n SVGPathSeg.PATHSEG_UNKNOWN = 0;\n SVGPathSeg.PATHSEG_CLOSEPATH = 1;\n SVGPathSeg.PATHSEG_MOVETO_ABS = 2;\n SVGPathSeg.PATHSEG_MOVETO_REL = 3;\n SVGPathSeg.PATHSEG_LINETO_ABS = 4;\n SVGPathSeg.PATHSEG_LINETO_REL = 5;\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6;\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL = 7;\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8;\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9;\n SVGPathSeg.PATHSEG_ARC_ABS = 10;\n SVGPathSeg.PATHSEG_ARC_REL = 11;\n SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12;\n SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13;\n SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14;\n SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL = 15;\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;\n SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;\n SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;\n\n class SVGPathSegClosePath extends SVGPathSeg {\n constructor (owningPathSegList) {\n super(SVGPathSeg.PATHSEG_CLOSEPATH, 'z', owningPathSegList);\n }\n toString () { return '[object SVGPathSegClosePath]'; }\n _asPathString () { return this.pathSegTypeAsLetter; }\n clone () { return new SVGPathSegClosePath(undefined); }\n }\n\n class SVGPathSegMovetoAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y) {\n super(SVGPathSeg.PATHSEG_MOVETO_ABS, 'M', owningPathSegList);\n this._x = x;\n this._y = y;\n }\n toString () { return '[object SVGPathSegMovetoAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegMovetoAbs(undefined, this._x, this._y); }\n }\n Object.defineProperties(SVGPathSegMovetoAbs.prototype, {\n x: {\n get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true\n },\n y: {\n get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true\n }\n });\n\n class SVGPathSegMovetoRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y) {\n super(SVGPathSeg.PATHSEG_MOVETO_REL, 'm', owningPathSegList);\n this._x = x;\n this._y = y;\n }\n toString () { return '[object SVGPathSegMovetoRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegMovetoRel(undefined, this._x, this._y); }\n }\n Object.defineProperties(SVGPathSegMovetoRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegLinetoAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y) {\n super(SVGPathSeg.PATHSEG_LINETO_ABS, 'L', owningPathSegList);\n this._x = x;\n this._y = y;\n }\n toString () { return '[object SVGPathSegLinetoAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegLinetoAbs(undefined, this._x, this._y); }\n }\n Object.defineProperties(SVGPathSegLinetoAbs.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegLinetoRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y) {\n super(SVGPathSeg.PATHSEG_LINETO_REL, 'l', owningPathSegList);\n this._x = x;\n this._y = y;\n }\n toString () { return '[object SVGPathSegLinetoRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegLinetoRel(undefined, this._x, this._y); }\n }\n Object.defineProperties(SVGPathSegLinetoRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoCubicAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y, x1, y1, x2, y2) {\n super(SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS, 'C', owningPathSegList);\n this._x = x;\n this._y = y;\n this._x1 = x1;\n this._y1 = y1;\n this._x2 = x2;\n this._y2 = y2;\n }\n toString () { return '[object SVGPathSegCurvetoCubicAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoCubicAbs(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2); }\n }\n Object.defineProperties(SVGPathSegCurvetoCubicAbs.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n x1: {get () { return this._x1; }, set (x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true},\n y1: {get () { return this._y1; }, set (y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true},\n x2: {get () { return this._x2; }, set (x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true},\n y2: {get () { return this._y2; }, set (y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoCubicRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y, x1, y1, x2, y2) {\n super(SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL, 'c', owningPathSegList);\n this._x = x;\n this._y = y;\n this._x1 = x1;\n this._y1 = y1;\n this._x2 = x2;\n this._y2 = y2;\n }\n toString () { return '[object SVGPathSegCurvetoCubicRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoCubicRel(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2); }\n }\n Object.defineProperties(SVGPathSegCurvetoCubicRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n x1: {get () { return this._x1; }, set (x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true},\n y1: {get () { return this._y1; }, set (y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true},\n x2: {get () { return this._x2; }, set (x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true},\n y2: {get () { return this._y2; }, set (y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoQuadraticAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y, x1, y1) {\n super(SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS, 'Q', owningPathSegList);\n this._x = x;\n this._y = y;\n this._x1 = x1;\n this._y1 = y1;\n }\n toString () { return '[object SVGPathSegCurvetoQuadraticAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoQuadraticAbs(undefined, this._x, this._y, this._x1, this._y1); }\n }\n Object.defineProperties(SVGPathSegCurvetoQuadraticAbs.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n x1: {get () { return this._x1; }, set (x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true},\n y1: {get () { return this._y1; }, set (y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoQuadraticRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y, x1, y1) {\n super(SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL, 'q', owningPathSegList);\n this._x = x;\n this._y = y;\n this._x1 = x1;\n this._y1 = y1;\n }\n toString () { return '[object SVGPathSegCurvetoQuadraticRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoQuadraticRel(undefined, this._x, this._y, this._x1, this._y1); }\n }\n Object.defineProperties(SVGPathSegCurvetoQuadraticRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n x1: {get () { return this._x1; }, set (x1) { this._x1 = x1; this._segmentChanged(); }, enumerable: true},\n y1: {get () { return this._y1; }, set (y1) { this._y1 = y1; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegArcAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\n super(SVGPathSeg.PATHSEG_ARC_ABS, 'A', owningPathSegList);\n this._x = x;\n this._y = y;\n this._r1 = r1;\n this._r2 = r2;\n this._angle = angle;\n this._largeArcFlag = largeArcFlag;\n this._sweepFlag = sweepFlag;\n }\n toString () { return '[object SVGPathSegArcAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._r1 + ' ' + this._r2 + ' ' + this._angle + ' ' + (this._largeArcFlag ? '1' : '0') + ' ' + (this._sweepFlag ? '1' : '0') + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegArcAbs(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag); }\n }\n Object.defineProperties(SVGPathSegArcAbs.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n r1: {get () { return this._r1; }, set (r1) { this._r1 = r1; this._segmentChanged(); }, enumerable: true},\n r2: {get () { return this._r2; }, set (r2) { this._r2 = r2; this._segmentChanged(); }, enumerable: true},\n angle: {get () { return this._angle; }, set (angle) { this._angle = angle; this._segmentChanged(); }, enumerable: true},\n largeArcFlag: {get () { return this._largeArcFlag; }, set (largeArcFlag) { this._largeArcFlag = largeArcFlag; this._segmentChanged(); }, enumerable: true},\n sweepFlag: {get () { return this._sweepFlag; }, set (sweepFlag) { this._sweepFlag = sweepFlag; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegArcRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) {\n super(SVGPathSeg.PATHSEG_ARC_REL, 'a', owningPathSegList);\n this._x = x;\n this._y = y;\n this._r1 = r1;\n this._r2 = r2;\n this._angle = angle;\n this._largeArcFlag = largeArcFlag;\n this._sweepFlag = sweepFlag;\n }\n toString () { return '[object SVGPathSegArcRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._r1 + ' ' + this._r2 + ' ' + this._angle + ' ' + (this._largeArcFlag ? '1' : '0') + ' ' + (this._sweepFlag ? '1' : '0') + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegArcRel(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag); }\n }\n Object.defineProperties(SVGPathSegArcRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n r1: {get () { return this._r1; }, set (r1) { this._r1 = r1; this._segmentChanged(); }, enumerable: true},\n r2: {get () { return this._r2; }, set (r2) { this._r2 = r2; this._segmentChanged(); }, enumerable: true},\n angle: {get () { return this._angle; }, set (angle) { this._angle = angle; this._segmentChanged(); }, enumerable: true},\n largeArcFlag: {get () { return this._largeArcFlag; }, set (largeArcFlag) { this._largeArcFlag = largeArcFlag; this._segmentChanged(); }, enumerable: true},\n sweepFlag: {get () { return this._sweepFlag; }, set (sweepFlag) { this._sweepFlag = sweepFlag; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegLinetoHorizontalAbs extends SVGPathSeg {\n constructor (owningPathSegList, x) {\n super(SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS, 'H', owningPathSegList);\n this._x = x;\n }\n toString () { return '[object SVGPathSegLinetoHorizontalAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x; }\n clone () { return new SVGPathSegLinetoHorizontalAbs(undefined, this._x); }\n }\n Object.defineProperty(SVGPathSegLinetoHorizontalAbs.prototype, 'x', {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true});\n\n class SVGPathSegLinetoHorizontalRel extends SVGPathSeg {\n constructor (owningPathSegList, x) {\n super(SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL, 'h', owningPathSegList);\n this._x = x;\n }\n toString () { return '[object SVGPathSegLinetoHorizontalRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x; }\n clone () { return new SVGPathSegLinetoHorizontalRel(undefined, this._x); }\n }\n Object.defineProperty(SVGPathSegLinetoHorizontalRel.prototype, 'x', {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true});\n\n class SVGPathSegLinetoVerticalAbs extends SVGPathSeg {\n constructor (owningPathSegList, y) {\n super(SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS, 'V', owningPathSegList);\n this._y = y;\n }\n toString () { return '[object SVGPathSegLinetoVerticalAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._y; }\n clone () { return new SVGPathSegLinetoVerticalAbs(undefined, this._y); }\n }\n Object.defineProperty(SVGPathSegLinetoVerticalAbs.prototype, 'y', {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true});\n\n class SVGPathSegLinetoVerticalRel extends SVGPathSeg {\n constructor (owningPathSegList, y) {\n super(SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL, 'v', owningPathSegList);\n this._y = y;\n }\n toString () { return '[object SVGPathSegLinetoVerticalRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._y; }\n clone () { return new SVGPathSegLinetoVerticalRel(undefined, this._y); }\n }\n Object.defineProperty(SVGPathSegLinetoVerticalRel.prototype, 'y', {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true});\n\n class SVGPathSegCurvetoCubicSmoothAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y, x2, y2) {\n super(SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS, 'S', owningPathSegList);\n this._x = x;\n this._y = y;\n this._x2 = x2;\n this._y2 = y2;\n }\n toString () { return '[object SVGPathSegCurvetoCubicSmoothAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoCubicSmoothAbs(undefined, this._x, this._y, this._x2, this._y2); }\n }\n Object.defineProperties(SVGPathSegCurvetoCubicSmoothAbs.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n x2: {get () { return this._x2; }, set (x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true},\n y2: {get () { return this._y2; }, set (y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoCubicSmoothRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y, x2, y2) {\n super(SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL, 's', owningPathSegList);\n this._x = x;\n this._y = y;\n this._x2 = x2;\n this._y2 = y2;\n }\n toString () { return '[object SVGPathSegCurvetoCubicSmoothRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoCubicSmoothRel(undefined, this._x, this._y, this._x2, this._y2); }\n }\n Object.defineProperties(SVGPathSegCurvetoCubicSmoothRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true},\n x2: {get () { return this._x2; }, set (x2) { this._x2 = x2; this._segmentChanged(); }, enumerable: true},\n y2: {get () { return this._y2; }, set (y2) { this._y2 = y2; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoQuadraticSmoothAbs extends SVGPathSeg {\n constructor (owningPathSegList, x, y) {\n super(SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS, 'T', owningPathSegList);\n this._x = x;\n this._y = y;\n }\n toString () { return '[object SVGPathSegCurvetoQuadraticSmoothAbs]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoQuadraticSmoothAbs(undefined, this._x, this._y); }\n }\n Object.defineProperties(SVGPathSegCurvetoQuadraticSmoothAbs.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true}\n });\n\n class SVGPathSegCurvetoQuadraticSmoothRel extends SVGPathSeg {\n constructor (owningPathSegList, x, y) {\n super(SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL, 't', owningPathSegList);\n this._x = x;\n this._y = y;\n }\n toString () { return '[object SVGPathSegCurvetoQuadraticSmoothRel]'; }\n _asPathString () { return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; }\n clone () { return new SVGPathSegCurvetoQuadraticSmoothRel(undefined, this._x, this._y); }\n }\n Object.defineProperties(SVGPathSegCurvetoQuadraticSmoothRel.prototype, {\n x: {get () { return this._x; }, set (x) { this._x = x; this._segmentChanged(); }, enumerable: true},\n y: {get () { return this._y; }, set (y) { this._y = y; this._segmentChanged(); }, enumerable: true}\n });\n\n // Add createSVGPathSeg* functions to SVGPathElement.\n // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathElement.\n SVGPathElement.prototype.createSVGPathSegClosePath = function () { return new SVGPathSegClosePath(undefined); };\n SVGPathElement.prototype.createSVGPathSegMovetoAbs = function (x, y) { return new SVGPathSegMovetoAbs(undefined, x, y); };\n SVGPathElement.prototype.createSVGPathSegMovetoRel = function (x, y) { return new SVGPathSegMovetoRel(undefined, x, y); };\n SVGPathElement.prototype.createSVGPathSegLinetoAbs = function (x, y) { return new SVGPathSegLinetoAbs(undefined, x, y); };\n SVGPathElement.prototype.createSVGPathSegLinetoRel = function (x, y) { return new SVGPathSegLinetoRel(undefined, x, y); };\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function (x, y, x1, y1, x2, y2) { return new SVGPathSegCurvetoCubicAbs(undefined, x, y, x1, y1, x2, y2); };\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function (x, y, x1, y1, x2, y2) { return new SVGPathSegCurvetoCubicRel(undefined, x, y, x1, y1, x2, y2); };\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function (x, y, x1, y1) { return new SVGPathSegCurvetoQuadraticAbs(undefined, x, y, x1, y1); };\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function (x, y, x1, y1) { return new SVGPathSegCurvetoQuadraticRel(undefined, x, y, x1, y1); };\n SVGPathElement.prototype.createSVGPathSegArcAbs = function (x, y, r1, r2, angle, largeArcFlag, sweepFlag) { return new SVGPathSegArcAbs(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag); };\n SVGPathElement.prototype.createSVGPathSegArcRel = function (x, y, r1, r2, angle, largeArcFlag, sweepFlag) { return new SVGPathSegArcRel(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag); };\n SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function (x) { return new SVGPathSegLinetoHorizontalAbs(undefined, x); };\n SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function (x) { return new SVGPathSegLinetoHorizontalRel(undefined, x); };\n SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function (y) { return new SVGPathSegLinetoVerticalAbs(undefined, y); };\n SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function (y) { return new SVGPathSegLinetoVerticalRel(undefined, y); };\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function (x, y, x2, y2) { return new SVGPathSegCurvetoCubicSmoothAbs(undefined, x, y, x2, y2); };\n SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function (x, y, x2, y2) { return new SVGPathSegCurvetoCubicSmoothRel(undefined, x, y, x2, y2); };\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function (x, y) { return new SVGPathSegCurvetoQuadraticSmoothAbs(undefined, x, y); };\n SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function (x, y) { return new SVGPathSegCurvetoQuadraticSmoothRel(undefined, x, y); };\n\n if (!('getPathSegAtLength' in SVGPathElement.prototype)) {\n // Add getPathSegAtLength to SVGPathElement.\n // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-__svg__SVGPathElement__getPathSegAtLength\n // This polyfill requires SVGPathElement.getTotalLength to implement the distance-along-a-path algorithm.\n SVGPathElement.prototype.getPathSegAtLength = function (distance) {\n if (distance === undefined || !isFinite(distance)) {\n throw new Error('Invalid arguments.');\n }\n\n const measurementElement = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n measurementElement.setAttribute('d', this.getAttribute('d'));\n let lastPathSegment = measurementElement.pathSegList.numberOfItems - 1;\n\n // If the path is empty, return 0.\n if (lastPathSegment <= 0) {\n return 0;\n }\n\n do {\n measurementElement.pathSegList.removeItem(lastPathSegment);\n if (distance > measurementElement.getTotalLength()) {\n break;\n }\n lastPathSegment--;\n } while (lastPathSegment > 0);\n return lastPathSegment;\n };\n }\n\n window.SVGPathSeg = SVGPathSeg;\n window.SVGPathSegClosePath = SVGPathSegClosePath;\n window.SVGPathSegMovetoAbs = SVGPathSegMovetoAbs;\n window.SVGPathSegMovetoRel = SVGPathSegMovetoRel;\n window.SVGPathSegLinetoAbs = SVGPathSegLinetoAbs;\n window.SVGPathSegLinetoRel = SVGPathSegLinetoRel;\n window.SVGPathSegCurvetoCubicAbs = SVGPathSegCurvetoCubicAbs;\n window.SVGPathSegCurvetoCubicRel = SVGPathSegCurvetoCubicRel;\n window.SVGPathSegCurvetoQuadraticAbs = SVGPathSegCurvetoQuadraticAbs;\n window.SVGPathSegCurvetoQuadraticRel = SVGPathSegCurvetoQuadraticRel;\n window.SVGPathSegArcAbs = SVGPathSegArcAbs;\n window.SVGPathSegArcRel = SVGPathSegArcRel;\n window.SVGPathSegLinetoHorizontalAbs = SVGPathSegLinetoHorizontalAbs;\n window.SVGPathSegLinetoHorizontalRel = SVGPathSegLinetoHorizontalRel;\n window.SVGPathSegLinetoVerticalAbs = SVGPathSegLinetoVerticalAbs;\n window.SVGPathSegLinetoVerticalRel = SVGPathSegLinetoVerticalRel;\n window.SVGPathSegCurvetoCubicSmoothAbs = SVGPathSegCurvetoCubicSmoothAbs;\n window.SVGPathSegCurvetoCubicSmoothRel = SVGPathSegCurvetoCubicSmoothRel;\n window.SVGPathSegCurvetoQuadraticSmoothAbs = SVGPathSegCurvetoQuadraticSmoothAbs;\n window.SVGPathSegCurvetoQuadraticSmoothRel = SVGPathSegCurvetoQuadraticSmoothRel;\n}\n\n// Checking for SVGPathSegList in window checks for the case of an implementation without the\n// SVGPathSegList API.\n// The second check for appendItem is specific to Firefox 59+ which removed only parts of the\n// SVGPathSegList API (e.g., appendItem). In this case we need to re-implement the entire API\n// so the polyfill data (i.e., _list) is used throughout.\nif (!('SVGPathSegList' in window) || !('appendItem' in window.SVGPathSegList.prototype)) {\n // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSegList\n class SVGPathSegList {\n constructor (pathElement) {\n this._pathElement = pathElement;\n this._list = this._parsePath(this._pathElement.getAttribute('d'));\n\n // Use a MutationObserver to catch changes to the path's \"d\" attribute.\n this._mutationObserverConfig = {attributes: true, attributeFilter: ['d']};\n this._pathElementMutationObserver = new MutationObserver(this._updateListFromPathMutations.bind(this));\n this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\n }\n // Process any pending mutations to the path element and update the list as needed.\n // This should be the first call of all public functions and is needed because\n // MutationObservers are not synchronous so we can have pending asynchronous mutations.\n _checkPathSynchronizedToList () {\n this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords());\n }\n\n _updateListFromPathMutations (mutationRecords) {\n if (!this._pathElement) {\n return;\n }\n let hasPathMutations = false;\n mutationRecords.forEach((record) => {\n if (record.attributeName === 'd') {\n hasPathMutations = true;\n }\n });\n if (hasPathMutations) {\n this._list = this._parsePath(this._pathElement.getAttribute('d'));\n }\n }\n\n // Serialize the list and update the path's 'd' attribute.\n _writeListToPath () {\n this._pathElementMutationObserver.disconnect();\n this._pathElement.setAttribute('d', SVGPathSegList._pathSegArrayAsString(this._list));\n this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig);\n }\n\n // When a path segment changes the list needs to be synchronized back to the path element.\n segmentChanged (pathSeg) {\n this._writeListToPath();\n }\n\n clear () {\n this._checkPathSynchronizedToList();\n\n this._list.forEach((pathSeg) => {\n pathSeg._owningPathSegList = null;\n });\n this._list = [];\n this._writeListToPath();\n }\n\n initialize (newItem) {\n this._checkPathSynchronizedToList();\n\n this._list = [newItem];\n newItem._owningPathSegList = this;\n this._writeListToPath();\n return newItem;\n }\n\n _checkValidIndex (index) {\n if (isNaN(index) || index < 0 || index >= this.numberOfItems) {\n throw new Error('INDEX_SIZE_ERR');\n }\n }\n\n getItem (index) {\n this._checkPathSynchronizedToList();\n\n this._checkValidIndex(index);\n return this._list[index];\n }\n\n insertItemBefore (newItem, index) {\n this._checkPathSynchronizedToList();\n\n // Spec: If the index is greater than or equal to numberOfItems, then the new item is appended to the end of the list.\n if (index > this.numberOfItems) {\n index = this.numberOfItems;\n }\n if (newItem._owningPathSegList) {\n // SVG2 spec says to make a copy.\n newItem = newItem.clone();\n }\n this._list.splice(index, 0, newItem);\n newItem._owningPathSegList = this;\n this._writeListToPath();\n return newItem;\n }\n\n replaceItem (newItem, index) {\n this._checkPathSynchronizedToList();\n\n if (newItem._owningPathSegList) {\n // SVG2 spec says to make a copy.\n newItem = newItem.clone();\n }\n this._checkValidIndex(index);\n this._list[index] = newItem;\n newItem._owningPathSegList = this;\n this._writeListToPath();\n return newItem;\n }\n\n removeItem (index) {\n this._checkPathSynchronizedToList();\n\n this._checkValidIndex(index);\n const item = this._list[index];\n this._list.splice(index, 1);\n this._writeListToPath();\n return item;\n }\n\n appendItem (newItem) {\n this._checkPathSynchronizedToList();\n\n if (newItem._owningPathSegList) {\n // SVG2 spec says to make a copy.\n newItem = newItem.clone();\n }\n this._list.push(newItem);\n newItem._owningPathSegList = this;\n // TODO: Optimize this to just append to the existing attribute.\n this._writeListToPath();\n return newItem;\n }\n\n // This closely follows SVGPathParser::parsePath from Source/core/svg/SVGPathParser.cpp.\n _parsePath (string) {\n if (!string || !string.length) {\n return [];\n }\n\n const owningPathSegList = this; // eslint-disable-line consistent-this\n\n class Builder {\n constructor () {\n this.pathSegList = [];\n }\n appendSegment (pathSeg) {\n this.pathSegList.push(pathSeg);\n }\n }\n\n class Source {\n constructor (string) {\n this._string = string;\n this._currentIndex = 0;\n this._endIndex = this._string.length;\n this._previousCommand = SVGPathSeg.PATHSEG_UNKNOWN;\n\n this._skipOptionalSpaces();\n }\n _isCurrentSpace () {\n const character = this._string[this._currentIndex];\n return character <= ' ' && (character === ' ' || character === '\\n' || character === '\\t' || character === '\\r' || character === '\\f');\n }\n\n _skipOptionalSpaces () {\n while (this._currentIndex < this._endIndex && this._isCurrentSpace()) {\n this._currentIndex++;\n }\n return this._currentIndex < this._endIndex;\n }\n\n _skipOptionalSpacesOrDelimiter () {\n if (this._currentIndex < this._endIndex && !this._isCurrentSpace() && this._string.charAt(this._currentIndex) !== ',') {\n return false;\n }\n if (this._skipOptionalSpaces()) {\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === ',') {\n this._currentIndex++;\n this._skipOptionalSpaces();\n }\n }\n return this._currentIndex < this._endIndex;\n }\n\n hasMoreData () {\n return this._currentIndex < this._endIndex;\n }\n\n peekSegmentType () {\n const lookahead = this._string[this._currentIndex];\n return this._pathSegTypeFromChar(lookahead);\n }\n\n _pathSegTypeFromChar (lookahead) {\n switch (lookahead) {\n case 'Z':\n case 'z':\n return SVGPathSeg.PATHSEG_CLOSEPATH;\n case 'M':\n return SVGPathSeg.PATHSEG_MOVETO_ABS;\n case 'm':\n return SVGPathSeg.PATHSEG_MOVETO_REL;\n case 'L':\n return SVGPathSeg.PATHSEG_LINETO_ABS;\n case 'l':\n return SVGPathSeg.PATHSEG_LINETO_REL;\n case 'C':\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS;\n case 'c':\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL;\n case 'Q':\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS;\n case 'q':\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL;\n case 'A':\n return SVGPathSeg.PATHSEG_ARC_ABS;\n case 'a':\n return SVGPathSeg.PATHSEG_ARC_REL;\n case 'H':\n return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS;\n case 'h':\n return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL;\n case 'V':\n return SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS;\n case 'v':\n return SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL;\n case 'S':\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS;\n case 's':\n return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL;\n case 'T':\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS;\n case 't':\n return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL;\n default:\n return SVGPathSeg.PATHSEG_UNKNOWN;\n }\n }\n\n _nextCommandHelper (lookahead, previousCommand) {\n // Check for remaining coordinates in the current command.\n if ((lookahead === '+' || lookahead === '-' || lookahead === '.' || (lookahead >= '0' && lookahead <= '9')) && previousCommand !== SVGPathSeg.PATHSEG_CLOSEPATH) {\n if (previousCommand === SVGPathSeg.PATHSEG_MOVETO_ABS) {\n return SVGPathSeg.PATHSEG_LINETO_ABS;\n }\n if (previousCommand === SVGPathSeg.PATHSEG_MOVETO_REL) {\n return SVGPathSeg.PATHSEG_LINETO_REL;\n }\n return previousCommand;\n }\n return SVGPathSeg.PATHSEG_UNKNOWN;\n }\n\n initialCommandIsMoveTo () {\n // If the path is empty it is still valid, so return true.\n if (!this.hasMoreData()) {\n return true;\n }\n const command = this.peekSegmentType();\n // Path must start with moveTo.\n return command === SVGPathSeg.PATHSEG_MOVETO_ABS || command === SVGPathSeg.PATHSEG_MOVETO_REL;\n }\n\n // Parse a number from an SVG path. This very closely follows genericParseNumber(...) from Source/core/svg/SVGParserUtilities.cpp.\n // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF\n _parseNumber () {\n let exponent = 0;\n let integer = 0;\n let frac = 1;\n let decimal = 0;\n let sign = 1;\n let expsign = 1;\n\n const startIndex = this._currentIndex;\n\n this._skipOptionalSpaces();\n\n // Read the sign.\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === '+') {\n this._currentIndex++;\n } else if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === '-') {\n this._currentIndex++;\n sign = -1;\n }\n\n if (this._currentIndex === this._endIndex || ((this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') && this._string.charAt(this._currentIndex) !== '.')) {\n // The first character of a number must be one of [0-9+-.].\n return undefined;\n }\n\n // Read the integer part, build right-to-left.\n const startIntPartIndex = this._currentIndex;\n while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') {\n this._currentIndex++; // Advance to first non-digit.\n }\n\n if (this._currentIndex !== startIntPartIndex) {\n let scanIntPartIndex = this._currentIndex - 1;\n let multiplier = 1;\n while (scanIntPartIndex >= startIntPartIndex) {\n integer += multiplier * (this._string.charAt(scanIntPartIndex--) - '0');\n multiplier *= 10;\n }\n }\n\n // Read the decimals.\n if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === '.') {\n this._currentIndex++;\n\n // There must be a least one digit following the .\n if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') {\n return undefined;\n }\n while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') {\n frac *= 10;\n decimal += (this._string.charAt(this._currentIndex) - '0') / frac;\n this._currentIndex += 1;\n }\n }\n\n // Read the exponent part.\n if (this._currentIndex !== startIndex && this._currentIndex + 1 < this._endIndex && (this._string.charAt(this._currentIndex) === 'e' || this._string.charAt(this._currentIndex) === 'E') && (this._string.charAt(this._currentIndex + 1) !== 'x' && this._string.charAt(this._currentIndex + 1) !== 'm')) {\n this._currentIndex++;\n\n // Read the sign of the exponent.\n if (this._string.charAt(this._currentIndex) === '+') {\n this._currentIndex++;\n } else if (this._string.charAt(this._currentIndex) === '-') {\n this._currentIndex++;\n expsign = -1;\n }\n\n // There must be an exponent.\n if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') {\n return undefined;\n }\n\n while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') {\n exponent *= 10;\n exponent += (this._string.charAt(this._currentIndex) - '0');\n this._currentIndex++;\n }\n }\n\n let number = integer + decimal;\n number *= sign;\n\n if (exponent) {\n number *= 10 ** (expsign * exponent);\n }\n\n if (startIndex === this._currentIndex) {\n return undefined;\n }\n\n this._skipOptionalSpacesOrDelimiter();\n\n return number;\n }\n\n _parseArcFlag () {\n if (this._currentIndex >= this._endIndex) {\n return undefined;\n }\n let flag = false;\n const flagChar = this._string.charAt(this._currentIndex++);\n if (flagChar === '0') {\n flag = false;\n } else if (flagChar === '1') {\n flag = true;\n } else {\n return undefined;\n }\n\n this._skipOptionalSpacesOrDelimiter();\n return flag;\n }\n\n parseSegment () {\n const lookahead = this._string[this._currentIndex];\n let command = this._pathSegTypeFromChar(lookahead);\n if (command === SVGPathSeg.PATHSEG_UNKNOWN) {\n // Possibly an implicit command. Not allowed if this is the first command.\n if (this._previousCommand === SVGPathSeg.PATHSEG_UNKNOWN) {\n return null;\n }\n command = this._nextCommandHelper(lookahead, this._previousCommand);\n if (command === SVGPathSeg.PATHSEG_UNKNOWN) {\n return null;\n }\n } else {\n this._currentIndex++;\n }\n\n this._previousCommand = command;\n\n switch (command) {\n case SVGPathSeg.PATHSEG_MOVETO_REL:\n return new SVGPathSegMovetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\n case SVGPathSeg.PATHSEG_MOVETO_ABS:\n return new SVGPathSegMovetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\n case SVGPathSeg.PATHSEG_LINETO_REL:\n return new SVGPathSegLinetoRel(owningPathSegList, this._parseNumber(), this._parseNumber());\n case SVGPathSeg.PATHSEG_LINETO_ABS:\n return new SVGPathSegLinetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\n case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:\n return new SVGPathSegLinetoHorizontalRel(owningPathSegList, this._parseNumber());\n case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:\n return new SVGPathSegLinetoHorizontalAbs(owningPathSegList, this._parseNumber());\n case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:\n return new SVGPathSegLinetoVerticalRel(owningPathSegList, this._parseNumber());\n case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:\n return new SVGPathSegLinetoVerticalAbs(owningPathSegList, this._parseNumber());\n case SVGPathSeg.PATHSEG_CLOSEPATH:\n this._skipOptionalSpaces();\n return new SVGPathSegClosePath(owningPathSegList);\n case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: {\n const points = {x1: this._parseNumber(), y1: this._parseNumber(), x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegCurvetoCubicRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2);\n } case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: {\n const points = {x1: this._parseNumber(), y1: this._parseNumber(), x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegCurvetoCubicAbs(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2);\n } case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: {\n const points = {x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, points.x, points.y, points.x2, points.y2);\n } case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: {\n const points = {x2: this._parseNumber(), y2: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, points.x, points.y, points.x2, points.y2);\n } case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: {\n const points = {x1: this._parseNumber(), y1: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegCurvetoQuadraticRel(owningPathSegList, points.x, points.y, points.x1, points.y1);\n } case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: {\n const points = {x1: this._parseNumber(), y1: this._parseNumber(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegCurvetoQuadraticAbs(owningPathSegList, points.x, points.y, points.x1, points.y1);\n } case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:\n return new SVGPathSegCurvetoQuadraticSmoothRel(owningPathSegList, this._parseNumber(), this._parseNumber());\n case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:\n return new SVGPathSegCurvetoQuadraticSmoothAbs(owningPathSegList, this._parseNumber(), this._parseNumber());\n case SVGPathSeg.PATHSEG_ARC_REL: {\n const points = {x1: this._parseNumber(), y1: this._parseNumber(), arcAngle: this._parseNumber(), arcLarge: this._parseArcFlag(), arcSweep: this._parseArcFlag(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegArcRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.arcAngle, points.arcLarge, points.arcSweep);\n } case SVGPathSeg.PATHSEG_ARC_ABS: {\n const points = {x1: this._parseNumber(), y1: this._parseNumber(), arcAngle: this._parseNumber(), arcLarge: this._parseArcFlag(), arcSweep: this._parseArcFlag(), x: this._parseNumber(), y: this._parseNumber()};\n return new SVGPathSegArcAbs(owningPathSegList, points.x, points.y, points.x1, points.y1, points.arcAngle, points.arcLarge, points.arcSweep);\n } default:\n throw new Error('Unknown path seg type.');\n }\n }\n }\n\n const builder = new Builder();\n const source = new Source(string);\n\n if (!source.initialCommandIsMoveTo()) {\n return [];\n }\n while (source.hasMoreData()) {\n const pathSeg = source.parseSegment();\n if (!pathSeg) {\n return [];\n }\n builder.appendSegment(pathSeg);\n }\n\n return builder.pathSegList;\n }\n\n // STATIC\n static _pathSegArrayAsString (pathSegArray) {\n let string = '';\n let first = true;\n pathSegArray.forEach((pathSeg) => {\n if (first) {\n first = false;\n string += pathSeg._asPathString();\n } else {\n string += ' ' + pathSeg._asPathString();\n }\n });\n return string;\n }\n }\n\n SVGPathSegList.prototype.classname = 'SVGPathSegList';\n\n Object.defineProperty(SVGPathSegList.prototype, 'numberOfItems', {\n get () {\n this._checkPathSynchronizedToList();\n return this._list.length;\n },\n enumerable: true\n });\n\n // Add the pathSegList accessors to SVGPathElement.\n // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGAnimatedPathData\n Object.defineProperties(SVGPathElement.prototype, {\n pathSegList: {\n get () {\n if (!this._pathSegList) {\n this._pathSegList = new SVGPathSegList(this);\n }\n return this._pathSegList;\n },\n enumerable: true\n },\n // TODO: The following are not implemented and simply return SVGPathElement.pathSegList.\n normalizedPathSegList: {get () { return this.pathSegList; }, enumerable: true},\n animatedPathSegList: {get () { return this.pathSegList; }, enumerable: true},\n animatedNormalizedPathSegList: {get () { return this.pathSegList; }, enumerable: true}\n });\n window.SVGPathSegList = SVGPathSegList;\n}\n})();\n","/* globals jQuery */\n/**\n * Browser detection.\n * @module browser\n * @license MIT\n *\n * @copyright 2010 Jeff Schiller, 2010 Alexis Deveria\n */\n\n// Dependencies:\n// 1) jQuery (for $.alert())\n\nimport './svgpathseg.js';\nimport {NS} from './namespaces.js';\n\nconst $ = jQuery;\n\nconst supportsSVG_ = (function () {\nreturn Boolean(document.createElementNS && document.createElementNS(NS.SVG, 'svg').createSVGRect);\n}());\n\n/**\n * @function module:browser.supportsSvg\n * @returns {boolean}\n*/\nexport const supportsSvg = () => supportsSVG_;\n\nconst {userAgent} = navigator;\nconst svg = document.createElementNS(NS.SVG, 'svg');\n\n// Note: Browser sniffing should only be used if no other detection method is possible\nconst isOpera_ = Boolean(window.opera);\nconst isWebkit_ = userAgent.includes('AppleWebKit');\nconst isGecko_ = userAgent.includes('Gecko/');\nconst isIE_ = userAgent.includes('MSIE');\nconst isChrome_ = userAgent.includes('Chrome/');\nconst isWindows_ = userAgent.includes('Windows');\nconst isMac_ = userAgent.includes('Macintosh');\nconst isTouch_ = 'ontouchstart' in window;\n\nconst supportsSelectors_ = (function () {\nreturn Boolean(svg.querySelector);\n}());\n\nconst supportsXpath_ = (function () {\nreturn Boolean(document.evaluate);\n}());\n\n// segList functions (for FF1.5 and 2.0)\nconst supportsPathReplaceItem_ = (function () {\nconst path = document.createElementNS(NS.SVG, 'path');\npath.setAttribute('d', 'M0,0 10,10');\nconst seglist = path.pathSegList;\nconst seg = path.createSVGPathSegLinetoAbs(5, 5);\ntry {\n seglist.replaceItem(seg, 1);\n return true;\n} catch (err) {}\nreturn false;\n}());\n\nconst supportsPathInsertItemBefore_ = (function () {\nconst path = document.createElementNS(NS.SVG, 'path');\npath.setAttribute('d', 'M0,0 10,10');\nconst seglist = path.pathSegList;\nconst seg = path.createSVGPathSegLinetoAbs(5, 5);\ntry {\n seglist.insertItemBefore(seg, 1);\n return true;\n} catch (err) {}\nreturn false;\n}());\n\n// text character positioning (for IE9 and now Chrome)\nconst supportsGoodTextCharPos_ = (function () {\nconst svgroot = document.createElementNS(NS.SVG, 'svg');\nconst svgcontent = document.createElementNS(NS.SVG, 'svg');\ndocument.documentElement.append(svgroot);\nsvgcontent.setAttribute('x', 5);\nsvgroot.append(svgcontent);\nconst text = document.createElementNS(NS.SVG, 'text');\ntext.textContent = 'a';\nsvgcontent.append(text);\ntry { // Chrome now fails here\n const pos = text.getStartPositionOfChar(0).x;\n return (pos === 0);\n} catch (err) {\n return false;\n} finally {\n svgroot.remove();\n}\n}());\n\nconst supportsPathBBox_ = (function () {\nconst svgcontent = document.createElementNS(NS.SVG, 'svg');\ndocument.documentElement.append(svgcontent);\nconst path = document.createElementNS(NS.SVG, 'path');\npath.setAttribute('d', 'M0,0 C0,0 10,10 10,0');\nsvgcontent.append(path);\nconst bbox = path.getBBox();\nsvgcontent.remove();\nreturn (bbox.height > 4 && bbox.height < 5);\n}());\n\n// Support for correct bbox sizing on groups with horizontal/vertical lines\nconst supportsHVLineContainerBBox_ = (function () {\nconst svgcontent = document.createElementNS(NS.SVG, 'svg');\ndocument.documentElement.append(svgcontent);\nconst path = document.createElementNS(NS.SVG, 'path');\npath.setAttribute('d', 'M0,0 10,0');\nconst path2 = document.createElementNS(NS.SVG, 'path');\npath2.setAttribute('d', 'M5,0 15,0');\nconst g = document.createElementNS(NS.SVG, 'g');\ng.append(path, path2);\nsvgcontent.append(g);\nconst bbox = g.getBBox();\nsvgcontent.remove();\n// Webkit gives 0, FF gives 10, Opera (correctly) gives 15\nreturn (bbox.width === 15);\n}());\n\nconst supportsEditableText_ = (function () {\n// TODO: Find better way to check support for this\nreturn isOpera_;\n}());\n\nconst supportsGoodDecimals_ = (function () {\n// Correct decimals on clone attributes (Opera < 10.5/win/non-en)\nconst rect = document.createElementNS(NS.SVG, 'rect');\nrect.setAttribute('x', 0.1);\nconst crect = rect.cloneNode(false);\nconst retValue = (!crect.getAttribute('x').includes(','));\nif (!retValue) {\n // Todo: i18nize or remove\n $.alert(\n 'NOTE: This version of Opera is known to contain bugs in SVG-edit.\\n' +\n 'Please upgrade to the latest version in which the problems have been fixed.'\n );\n}\nreturn retValue;\n}());\n\nconst supportsNonScalingStroke_ = (function () {\nconst rect = document.createElementNS(NS.SVG, 'rect');\nrect.setAttribute('style', 'vector-effect:non-scaling-stroke');\nreturn rect.style.vectorEffect === 'non-scaling-stroke';\n}());\n\nlet supportsNativeSVGTransformLists_ = (function () {\nconst rect = document.createElementNS(NS.SVG, 'rect');\nconst rxform = rect.transform.baseVal;\nconst t1 = svg.createSVGTransform();\nrxform.appendItem(t1);\nconst r1 = rxform.getItem(0);\nconst isSVGTransform = (o) => {\n // https://developer.mozilla.org/en-US/docs/Web/API/SVGTransform\n return o && typeof o === 'object' && typeof o.setMatrix === 'function' && 'angle' in o;\n};\nreturn isSVGTransform(r1) && isSVGTransform(t1) &&\n r1.type === t1.type && r1.angle === t1.angle &&\n r1.matrix.a === t1.matrix.a &&\n r1.matrix.b === t1.matrix.b &&\n r1.matrix.c === t1.matrix.c &&\n r1.matrix.d === t1.matrix.d &&\n r1.matrix.e === t1.matrix.e &&\n r1.matrix.f === t1.matrix.f;\n}());\n\n// Public API\n\n/**\n * @function module:browser.isOpera\n * @returns {boolean}\n*/\nexport const isOpera = () => isOpera_;\n/**\n * @function module:browser.isWebkit\n * @returns {boolean}\n*/\nexport const isWebkit = () => isWebkit_;\n/**\n * @function module:browser.isGecko\n * @returns {boolean}\n*/\nexport const isGecko = () => isGecko_;\n/**\n * @function module:browser.isIE\n * @returns {boolean}\n*/\nexport const isIE = () => isIE_;\n/**\n * @function module:browser.isChrome\n * @returns {boolean}\n*/\nexport const isChrome = () => isChrome_;\n/**\n * @function module:browser.isWindows\n * @returns {boolean}\n*/\nexport const isWindows = () => isWindows_;\n/**\n * @function module:browser.isMac\n * @returns {boolean}\n*/\nexport const isMac = () => isMac_;\n/**\n * @function module:browser.isTouch\n * @returns {boolean}\n*/\nexport const isTouch = () => isTouch_;\n\n/**\n * @function module:browser.supportsSelectors\n * @returns {boolean}\n*/\nexport const supportsSelectors = () => supportsSelectors_;\n\n/**\n * @function module:browser.supportsXpath\n * @returns {boolean}\n*/\nexport const supportsXpath = () => supportsXpath_;\n\n/**\n * @function module:browser.supportsPathReplaceItem\n * @returns {boolean}\n*/\nexport const supportsPathReplaceItem = () => supportsPathReplaceItem_;\n\n/**\n * @function module:browser.supportsPathInsertItemBefore\n * @returns {boolean}\n*/\nexport const supportsPathInsertItemBefore = () => supportsPathInsertItemBefore_;\n\n/**\n * @function module:browser.supportsPathBBox\n * @returns {boolean}\n*/\nexport const supportsPathBBox = () => supportsPathBBox_;\n\n/**\n * @function module:browser.supportsHVLineContainerBBox\n * @returns {boolean}\n*/\nexport const supportsHVLineContainerBBox = () => supportsHVLineContainerBBox_;\n\n/**\n * @function module:browser.supportsGoodTextCharPos\n * @returns {boolean}\n*/\nexport const supportsGoodTextCharPos = () => supportsGoodTextCharPos_;\n\n/**\n* @function module:browser.supportsEditableText\n * @returns {boolean}\n*/\nexport const supportsEditableText = () => supportsEditableText_;\n\n/**\n * @function module:browser.supportsGoodDecimals\n * @returns {boolean}\n*/\nexport const supportsGoodDecimals = () => supportsGoodDecimals_;\n\n/**\n* @function module:browser.supportsNonScalingStroke\n* @returns {boolean}\n*/\nexport const supportsNonScalingStroke = () => supportsNonScalingStroke_;\n\n/**\n* @function module:browser.supportsNativeTransformLists\n* @returns {boolean}\n*/\nexport const supportsNativeTransformLists = () => supportsNativeSVGTransformLists_;\n\n/**\n * Set `supportsNativeSVGTransformLists_` to `false` (for unit testing).\n * @function module:browser.disableSupportsNativeTransformLists\n * @returns {void}\n*/\nexport const disableSupportsNativeTransformLists = () => {\n supportsNativeSVGTransformLists_ = false;\n};\n","/**\n * A jQuery module to work with SVG attributes.\n * @module jQueryAttr\n * @license MIT\n */\n\n/**\n* This fixes `$(...).attr()` to work as expected with SVG elements.\n* Does not currently use `*AttributeNS()` since we rarely need that.\n* Adds {@link external:jQuery.fn.attr}.\n* See {@link https://api.jquery.com/attr/} for basic documentation of `.attr()`.\n*\n* Additional functionality:\n* - When getting attributes, a string that's a number is returned as type number.\n* - If an array is supplied as the first parameter, multiple values are returned\n* as an object with values for each given attribute.\n* @function module:jQueryAttr.jQueryAttr\n* @param {external:jQuery} $ The jQuery object to which to add the plug-in\n* @returns {external:jQuery}\n*/\nexport default function jQueryPluginSVG ($) {\n const proxied = $.fn.attr,\n svgns = 'http://www.w3.org/2000/svg';\n /**\n * @typedef {PlainObject} module:jQueryAttr.Attributes\n */\n /**\n * @function external:jQuery.fn.attr\n * @param {string|string[]|PlainObject} key\n * @param {string} value\n * @returns {external:jQuery|module:jQueryAttr.Attributes}\n */\n $.fn.attr = function (key, value) {\n const len = this.length;\n if (!len) { return proxied.call(this, key, value); }\n for (let i = 0; i < len; ++i) {\n const elem = this[i];\n // set/get SVG attribute\n if (elem.namespaceURI === svgns) {\n // Setting attribute\n if (value !== undefined) {\n elem.setAttribute(key, value);\n } else if (Array.isArray(key)) {\n // Getting attributes from array\n const obj = {};\n let j = key.length;\n\n while (j--) {\n const aname = key[j];\n let attr = elem.getAttribute(aname);\n // This returns a number when appropriate\n if (attr || attr === '0') {\n attr = isNaN(attr) ? attr : (attr - 0);\n }\n obj[aname] = attr;\n }\n return obj;\n }\n if (typeof key === 'object') {\n // Setting attributes from object\n for (const [name, val] of Object.entries(key)) {\n elem.setAttribute(name, val);\n }\n // Getting attribute\n } else {\n let attr = elem.getAttribute(key);\n if (attr || attr === '0') {\n attr = isNaN(attr) ? attr : (attr - 0);\n }\n return attr;\n }\n } else {\n return proxied.call(this, key, value);\n }\n }\n return this;\n };\n return $;\n}\n","/**\n * Partial polyfill of `SVGTransformList`\n * @module SVGTransformList\n *\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Jeff Schiller\n */\n\nimport {NS} from './namespaces.js';\nimport {supportsNativeTransformLists} from './browser.js';\n\nconst svgroot = document.createElementNS(NS.SVG, 'svg');\n\n/**\n * Helper function to convert `SVGTransform` to a string.\n * @param {SVGTransform} xform\n * @returns {string}\n */\nfunction transformToString (xform) {\n const m = xform.matrix;\n let text = '';\n switch (xform.type) {\n case 1: // MATRIX\n text = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')';\n break;\n case 2: // TRANSLATE\n text = 'translate(' + m.e + ',' + m.f + ')';\n break;\n case 3: // SCALE\n if (m.a === m.d) {\n text = 'scale(' + m.a + ')';\n } else {\n text = 'scale(' + m.a + ',' + m.d + ')';\n }\n break;\n case 4: { // ROTATE\n let cx = 0;\n let cy = 0;\n // this prevents divide by zero\n if (xform.angle !== 0) {\n const K = 1 - m.a;\n cy = (K * m.f + m.b * m.e) / (K * K + m.b * m.b);\n cx = (m.e - m.b * cy) / K;\n }\n text = 'rotate(' + xform.angle + ' ' + cx + ',' + cy + ')';\n break;\n }\n }\n return text;\n}\n\n/**\n * Map of SVGTransformList objects.\n */\nlet listMap_ = {};\n\n/**\n* @interface module:SVGTransformList.SVGEditTransformList\n* @property {Integer} numberOfItems unsigned long\n*/\n/**\n* @function module:SVGTransformList.SVGEditTransformList#clear\n* @returns {void}\n*/\n/**\n* @function module:SVGTransformList.SVGEditTransformList#initialize\n* @param {SVGTransform} newItem\n* @returns {SVGTransform}\n*/\n/**\n* DOES NOT THROW DOMException, INDEX_SIZE_ERR.\n* @function module:SVGTransformList.SVGEditTransformList#getItem\n* @param {Integer} index unsigned long\n* @returns {SVGTransform}\n*/\n/**\n* DOES NOT THROW DOMException, INDEX_SIZE_ERR.\n* @function module:SVGTransformList.SVGEditTransformList#insertItemBefore\n* @param {SVGTransform} newItem\n* @param {Integer} index unsigned long\n* @returns {SVGTransform}\n*/\n/**\n* DOES NOT THROW DOMException, INDEX_SIZE_ERR.\n* @function module:SVGTransformList.SVGEditTransformList#replaceItem\n* @param {SVGTransform} newItem\n* @param {Integer} index unsigned long\n* @returns {SVGTransform}\n*/\n/**\n* DOES NOT THROW DOMException, INDEX_SIZE_ERR.\n* @function module:SVGTransformList.SVGEditTransformList#removeItem\n* @param {Integer} index unsigned long\n* @returns {SVGTransform}\n*/\n/**\n* @function module:SVGTransformList.SVGEditTransformList#appendItem\n* @param {SVGTransform} newItem\n* @returns {SVGTransform}\n*/\n/**\n* NOT IMPLEMENTED.\n* @ignore\n* @function module:SVGTransformList.SVGEditTransformList#createSVGTransformFromMatrix\n* @param {SVGMatrix} matrix\n* @returns {SVGTransform}\n*/\n/**\n* NOT IMPLEMENTED.\n* @ignore\n* @function module:SVGTransformList.SVGEditTransformList#consolidate\n* @returns {SVGTransform}\n*/\n\n/**\n* SVGTransformList implementation for Webkit.\n* These methods do not currently raise any exceptions.\n* These methods also do not check that transforms are being inserted. This is basically\n* implementing as much of SVGTransformList that we need to get the job done.\n* @implements {module:SVGTransformList.SVGEditTransformList}\n*/\nexport class SVGTransformList { // eslint-disable-line no-shadow\n /**\n * @param {Element} elem\n * @returns {SVGTransformList}\n */\n constructor (elem) {\n this._elem = elem || null;\n this._xforms = [];\n // TODO: how do we capture the undo-ability in the changed transform list?\n this._update = function () {\n let tstr = '';\n // /* const concatMatrix = */ svgroot.createSVGMatrix();\n for (let i = 0; i < this.numberOfItems; ++i) {\n const xform = this._list.getItem(i);\n tstr += transformToString(xform) + ' ';\n }\n this._elem.setAttribute('transform', tstr);\n };\n this._list = this;\n this._init = function () {\n // Transform attribute parser\n let str = this._elem.getAttribute('transform');\n if (!str) { return; }\n\n // TODO: Add skew support in future\n const re = /\\s*((scale|matrix|rotate|translate)\\s*\\(.*?\\))\\s*,?\\s*/;\n // const re = /\\s*(?(?:scale|matrix|rotate|translate)\\s*\\(.*?\\))\\s*,?\\s*/;\n let m = true;\n while (m) {\n m = str.match(re);\n str = str.replace(re, '');\n if (m && m[1]) {\n const x = m[1];\n const bits = x.split(/\\s*\\(/);\n const name = bits[0];\n const valBits = bits[1].match(/\\s*(.*?)\\s*\\)/);\n valBits[1] = valBits[1].replace(/(\\d)-/g, '$1 -');\n const valArr = valBits[1].split(/[, ]+/);\n const letters = 'abcdef'.split('');\n /*\n if (m && m.groups.xform) {\n const x = m.groups.xform;\n const [name, bits] = x.split(/\\s*\\(/);\n const valBits = bits.match(/\\s*(?.*?)\\s*\\)/);\n valBits.groups.nonWhitespace = valBits.groups.nonWhitespace.replace(\n /(?\\d)-/g, '$ -'\n );\n const valArr = valBits.groups.nonWhitespace.split(/[, ]+/);\n const letters = [...'abcdef'];\n */\n const mtx = svgroot.createSVGMatrix();\n Object.values(valArr).forEach(function (item, i) {\n valArr[i] = Number.parseFloat(item);\n if (name === 'matrix') {\n mtx[letters[i]] = valArr[i];\n }\n });\n const xform = svgroot.createSVGTransform();\n const fname = 'set' + name.charAt(0).toUpperCase() + name.slice(1);\n const values = name === 'matrix' ? [mtx] : valArr;\n\n if (name === 'scale' && values.length === 1) {\n values.push(values[0]);\n } else if (name === 'translate' && values.length === 1) {\n values.push(0);\n } else if (name === 'rotate' && values.length === 1) {\n values.push(0, 0);\n }\n xform[fname](...values);\n this._list.appendItem(xform);\n }\n }\n };\n this._removeFromOtherLists = function (item) {\n if (item) {\n // Check if this transform is already in a transformlist, and\n // remove it if so.\n Object.values(listMap_).some((tl) => {\n for (let i = 0, len = tl._xforms.length; i < len; ++i) {\n if (tl._xforms[i] === item) {\n tl.removeItem(i);\n return true;\n }\n }\n return false;\n });\n }\n };\n\n this.numberOfItems = 0;\n }\n /**\n * @returns {void}\n */\n clear () {\n this.numberOfItems = 0;\n this._xforms = [];\n }\n\n /**\n * @param {SVGTransform} newItem\n * @returns {void}\n */\n initialize (newItem) {\n this.numberOfItems = 1;\n this._removeFromOtherLists(newItem);\n this._xforms = [newItem];\n }\n\n /**\n * @param {Integer} index unsigned long\n * @throws {Error}\n * @returns {SVGTransform}\n */\n getItem (index) {\n if (index < this.numberOfItems && index >= 0) {\n return this._xforms[index];\n }\n const err = new Error('DOMException with code=INDEX_SIZE_ERR');\n err.code = 1;\n throw err;\n }\n\n /**\n * @param {SVGTransform} newItem\n * @param {Integer} index unsigned long\n * @returns {SVGTransform}\n */\n insertItemBefore (newItem, index) {\n let retValue = null;\n if (index >= 0) {\n if (index < this.numberOfItems) {\n this._removeFromOtherLists(newItem);\n const newxforms = new Array(this.numberOfItems + 1);\n // TODO: use array copying and slicing\n let i;\n for (i = 0; i < index; ++i) {\n newxforms[i] = this._xforms[i];\n }\n newxforms[i] = newItem;\n for (let j = i + 1; i < this.numberOfItems; ++j, ++i) {\n newxforms[j] = this._xforms[i];\n }\n this.numberOfItems++;\n this._xforms = newxforms;\n retValue = newItem;\n this._list._update();\n } else {\n retValue = this._list.appendItem(newItem);\n }\n }\n return retValue;\n }\n\n /**\n * @param {SVGTransform} newItem\n * @param {Integer} index unsigned long\n * @returns {SVGTransform}\n */\n replaceItem (newItem, index) {\n let retValue = null;\n if (index < this.numberOfItems && index >= 0) {\n this._removeFromOtherLists(newItem);\n this._xforms[index] = newItem;\n retValue = newItem;\n this._list._update();\n }\n return retValue;\n }\n\n /**\n * @param {Integer} index unsigned long\n * @throws {Error}\n * @returns {SVGTransform}\n */\n removeItem (index) {\n if (index < this.numberOfItems && index >= 0) {\n const retValue = this._xforms[index];\n const newxforms = new Array(this.numberOfItems - 1);\n let i;\n for (i = 0; i < index; ++i) {\n newxforms[i] = this._xforms[i];\n }\n for (let j = i; j < this.numberOfItems - 1; ++j, ++i) {\n newxforms[j] = this._xforms[i + 1];\n }\n this.numberOfItems--;\n this._xforms = newxforms;\n this._list._update();\n return retValue;\n }\n const err = new Error('DOMException with code=INDEX_SIZE_ERR');\n err.code = 1;\n throw err;\n }\n\n /**\n * @param {SVGTransform} newItem\n * @returns {SVGTransform}\n */\n appendItem (newItem) {\n this._removeFromOtherLists(newItem);\n this._xforms.push(newItem);\n this.numberOfItems++;\n this._list._update();\n return newItem;\n }\n}\n\n/**\n* @function module:SVGTransformList.resetListMap\n* @returns {void}\n*/\nexport const resetListMap = function () {\n listMap_ = {};\n};\n\n/**\n * Removes transforms of the given element from the map.\n * @function module:SVGTransformList.removeElementFromListMap\n * @param {Element} elem - a DOM Element\n * @returns {void}\n */\nexport let removeElementFromListMap = function (elem) { // eslint-disable-line import/no-mutable-exports\n if (elem.id && listMap_[elem.id]) {\n delete listMap_[elem.id];\n }\n};\n\n/**\n* Returns an object that behaves like a `SVGTransformList` for the given DOM element.\n* @function module:SVGTransformList.getTransformList\n* @param {Element} elem - DOM element to get a transformlist from\n* @todo The polyfill should have `SVGAnimatedTransformList` and this should use it\n* @returns {SVGAnimatedTransformList|SVGTransformList}\n*/\nexport const getTransformList = function (elem) {\n if (!supportsNativeTransformLists()) {\n const id = elem.id || 'temp';\n let t = listMap_[id];\n if (!t || id === 'temp') {\n listMap_[id] = new SVGTransformList(elem);\n listMap_[id]._init();\n t = listMap_[id];\n }\n return t;\n }\n if (elem.transform) {\n return elem.transform.baseVal;\n }\n if (elem.gradientTransform) {\n return elem.gradientTransform.baseVal;\n }\n if (elem.patternTransform) {\n return elem.patternTransform.baseVal;\n }\n\n return null;\n};\n\n/**\n* @callback module:SVGTransformList.removeElementFromListMap\n* @param {Element} elem\n* @returns {void}\n*/\n/**\n* Replace `removeElementFromListMap` for unit-testing.\n* @function module:SVGTransformList.changeRemoveElementFromListMap\n* @param {module:SVGTransformList.removeElementFromListMap} cb Passed a single argument `elem`\n* @returns {void}\n*/\n\nexport const changeRemoveElementFromListMap = function (cb) { // eslint-disable-line promise/prefer-await-to-callbacks\n removeElementFromListMap = cb;\n};\n","/**\n * Tools for working with units.\n * @module units\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Jeff Schiller\n */\n\nimport {NS} from './namespaces.js';\nimport {isNullish} from './utilities.js';\n\nconst wAttrs = ['x', 'x1', 'cx', 'rx', 'width'];\nconst hAttrs = ['y', 'y1', 'cy', 'ry', 'height'];\nconst unitAttrs = ['r', 'radius', ...wAttrs, ...hAttrs];\n// unused\n/*\nconst unitNumMap = {\n '%': 2,\n em: 3,\n ex: 4,\n px: 5,\n cm: 6,\n mm: 7,\n in: 8,\n pt: 9,\n pc: 10\n};\n*/\n// Container of elements.\nlet elementContainer_;\n\n// Stores mapping of unit type to user coordinates.\nlet typeMap_ = {};\n\n/**\n * @interface module:units.ElementContainer\n */\n/**\n * @function module:units.ElementContainer#getBaseUnit\n * @returns {string} The base unit type of the container ('em')\n */\n/**\n * @function module:units.ElementContainer#getElement\n * @returns {?Element} An element in the container given an id\n */\n/**\n * @function module:units.ElementContainer#getHeight\n * @returns {Float} The container's height\n */\n/**\n * @function module:units.ElementContainer#getWidth\n * @returns {Float} The container's width\n */\n/**\n * @function module:units.ElementContainer#getRoundDigits\n * @returns {Integer} The number of digits number should be rounded to\n */\n\n/* eslint-disable jsdoc/valid-types */\n/**\n * @typedef {PlainObject} module:units.TypeMap\n * @property {Float} em\n * @property {Float} ex\n * @property {Float} in\n * @property {Float} cm\n * @property {Float} mm\n * @property {Float} pt\n * @property {Float} pc\n * @property {Integer} px\n * @property {0} %\n */\n/* eslint-enable jsdoc/valid-types */\n\n/**\n * Initializes this module.\n *\n * @function module:units.init\n * @param {module:units.ElementContainer} elementContainer - An object implementing the ElementContainer interface.\n * @returns {void}\n */\nexport const init = function (elementContainer) {\n elementContainer_ = elementContainer;\n\n // Get correct em/ex values by creating a temporary SVG.\n const svg = document.createElementNS(NS.SVG, 'svg');\n document.body.append(svg);\n const rect = document.createElementNS(NS.SVG, 'rect');\n rect.setAttribute('width', '1em');\n rect.setAttribute('height', '1ex');\n rect.setAttribute('x', '1in');\n svg.append(rect);\n const bb = rect.getBBox();\n svg.remove();\n\n const inch = bb.x;\n typeMap_ = {\n em: bb.width,\n ex: bb.height,\n in: inch,\n cm: inch / 2.54,\n mm: inch / 25.4,\n pt: inch / 72,\n pc: inch / 6,\n px: 1,\n '%': 0\n };\n};\n\n/**\n* Group: Unit conversion functions.\n*/\n\n/**\n * @function module:units.getTypeMap\n * @returns {module:units.TypeMap} The unit object with values for each unit\n*/\nexport const getTypeMap = function () {\n return typeMap_;\n};\n\n/**\n* @typedef {GenericArray} module:units.CompareNumbers\n* @property {Integer} length 2\n* @property {Float} 0\n* @property {Float} 1\n*/\n\n/**\n* Rounds a given value to a float with number of digits defined in\n* `round_digits` of `saveOptions`\n*\n* @function module:units.shortFloat\n* @param {string|Float|module:units.CompareNumbers} val - The value (or Array of two numbers) to be rounded\n* @returns {Float|string} If a string/number was given, returns a Float. If an array, return a string\n* with comma-separated floats\n*/\nexport const shortFloat = function (val) {\n const digits = elementContainer_.getRoundDigits();\n if (!isNaN(val)) {\n return Number(Number(val).toFixed(digits));\n }\n if (Array.isArray(val)) {\n return shortFloat(val[0]) + ',' + shortFloat(val[1]);\n }\n return Number.parseFloat(val).toFixed(digits) - 0;\n};\n\n/**\n* Converts the number to given unit or baseUnit.\n* @function module:units.convertUnit\n* @param {string|Float} val\n* @param {\"em\"|\"ex\"|\"in\"|\"cm\"|\"mm\"|\"pt\"|\"pc\"|\"px\"|\"%\"} [unit]\n* @returns {Float}\n*/\nexport const convertUnit = function (val, unit) {\n unit = unit || elementContainer_.getBaseUnit();\n // baseVal.convertToSpecifiedUnits(unitNumMap[unit]);\n // const val = baseVal.valueInSpecifiedUnits;\n // baseVal.convertToSpecifiedUnits(1);\n return shortFloat(val / typeMap_[unit]);\n};\n\n/**\n* Sets an element's attribute based on the unit in its current value.\n*\n* @function module:units.setUnitAttr\n* @param {Element} elem - DOM element to be changed\n* @param {string} attr - Name of the attribute associated with the value\n* @param {string} val - Attribute value to convert\n* @returns {void}\n*/\nexport const setUnitAttr = function (elem, attr, val) {\n // if (!isNaN(val)) {\n // New value is a number, so check currently used unit\n // const oldVal = elem.getAttribute(attr);\n\n // Enable this for alternate mode\n // if (oldVal !== null && (isNaN(oldVal) || elementContainer_.getBaseUnit() !== 'px')) {\n // // Old value was a number, so get unit, then convert\n // let unit;\n // if (oldVal.substr(-1) === '%') {\n // const res = getResolution();\n // unit = '%';\n // val *= 100;\n // if (wAttrs.includes(attr)) {\n // val = val / res.w;\n // } else if (hAttrs.includes(attr)) {\n // val = val / res.h;\n // } else {\n // return val / Math.sqrt((res.w*res.w) + (res.h*res.h))/Math.sqrt(2);\n // }\n // } else {\n // if (elementContainer_.getBaseUnit() !== 'px') {\n // unit = elementContainer_.getBaseUnit();\n // } else {\n // unit = oldVal.substr(-2);\n // }\n // val = val / typeMap_[unit];\n // }\n //\n // val += unit;\n // }\n // }\n elem.setAttribute(attr, val);\n};\n\nconst attrsToConvert = {\n line: ['x1', 'x2', 'y1', 'y2'],\n circle: ['cx', 'cy', 'r'],\n ellipse: ['cx', 'cy', 'rx', 'ry'],\n foreignObject: ['x', 'y', 'width', 'height'],\n rect: ['x', 'y', 'width', 'height'],\n image: ['x', 'y', 'width', 'height'],\n use: ['x', 'y', 'width', 'height'],\n text: ['x', 'y']\n};\n\n/**\n* Converts all applicable attributes to the configured baseUnit.\n* @function module:units.convertAttrs\n* @param {Element} element - A DOM element whose attributes should be converted\n* @returns {void}\n*/\nexport const convertAttrs = function (element) {\n const elName = element.tagName;\n const unit = elementContainer_.getBaseUnit();\n const attrs = attrsToConvert[elName];\n if (!attrs) { return; }\n\n const len = attrs.length;\n for (let i = 0; i < len; i++) {\n const attr = attrs[i];\n const cur = element.getAttribute(attr);\n if (cur) {\n if (!isNaN(cur)) {\n element.setAttribute(attr, (cur / typeMap_[unit]) + unit);\n }\n // else {\n // Convert existing?\n // }\n }\n }\n};\n\n/**\n* Converts given values to numbers. Attributes must be supplied in\n* case a percentage is given.\n*\n* @function module:units.convertToNum\n* @param {string} attr - Name of the attribute associated with the value\n* @param {string} val - Attribute value to convert\n* @returns {Float} The converted number\n*/\nexport const convertToNum = function (attr, val) {\n // Return a number if that's what it already is\n if (!isNaN(val)) { return val - 0; }\n if (val.substr(-1) === '%') {\n // Deal with percentage, depends on attribute\n const num = val.substr(0, val.length - 1) / 100;\n const width = elementContainer_.getWidth();\n const height = elementContainer_.getHeight();\n\n if (wAttrs.includes(attr)) {\n return num * width;\n }\n if (hAttrs.includes(attr)) {\n return num * height;\n }\n return num * Math.sqrt((width * width) + (height * height)) / Math.sqrt(2);\n }\n const unit = val.substr(-2);\n const num = val.substr(0, val.length - 2);\n // Note that this multiplication turns the string into a number\n return num * typeMap_[unit];\n};\n\n/**\n* Check if an attribute's value is in a valid format.\n* @function module:units.isValidUnit\n* @param {string} attr - The name of the attribute associated with the value\n* @param {string} val - The attribute value to check\n* @param {Element} selectedElement\n* @returns {boolean} Whether the unit is valid\n*/\nexport const isValidUnit = function (attr, val, selectedElement) {\n if (unitAttrs.includes(attr)) {\n // True if it's just a number\n if (!isNaN(val)) {\n return true;\n }\n // Not a number, check if it has a valid unit\n val = val.toLowerCase();\n return Object.keys(typeMap_).some((unit) => {\n const re = new RegExp('^-?[\\\\d\\\\.]+' + unit + '$');\n return re.test(val);\n });\n }\n if (attr === 'id') {\n // if we're trying to change the id, make sure it's not already present in the doc\n // and the id value is valid.\n\n let result = false;\n // because getElem() can throw an exception in the case of an invalid id\n // (according to https://www.w3.org/TR/xml-id/ IDs must be a NCName)\n // we wrap it in an exception and only return true if the ID was valid and\n // not already present\n try {\n const elem = elementContainer_.getElement(val);\n result = (isNullish(elem) || elem === selectedElement);\n } catch (e) {}\n return result;\n }\n return true;\n};\n","/**\n * Mathematical utilities.\n * @module math\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Jeff Schiller\n */\n\n/**\n* @typedef {PlainObject} module:math.AngleCoord45\n* @property {Float} x - The angle-snapped x value\n* @property {Float} y - The angle-snapped y value\n* @property {Integer} a - The angle at which to snap\n*/\n\n/**\n* @typedef {PlainObject} module:math.XYObject\n* @property {Float} x\n* @property {Float} y\n*/\n\nimport {NS} from './namespaces.js';\nimport {getTransformList} from './svgtransformlist.js';\nimport {isNullish} from './utilities.js';\n\n// Constants\nconst NEAR_ZERO = 1e-14;\n\n// Throw away SVGSVGElement used for creating matrices/transforms.\nconst svg = document.createElementNS(NS.SVG, 'svg');\n\n/**\n * A (hopefully) quicker function to transform a point by a matrix\n * (this function avoids any DOM calls and just does the math).\n * @function module:math.transformPoint\n * @param {Float} x - Float representing the x coordinate\n * @param {Float} y - Float representing the y coordinate\n * @param {SVGMatrix} m - Matrix object to transform the point with\n * @returns {module:math.XYObject} An x, y object representing the transformed point\n*/\nexport const transformPoint = function (x, y, m) {\n return {x: m.a * x + m.c * y + m.e, y: m.b * x + m.d * y + m.f};\n};\n\n/**\n * Helper function to check if the matrix performs no actual transform\n * (i.e. exists for identity purposes).\n * @function module:math.isIdentity\n * @param {SVGMatrix} m - The matrix object to check\n * @returns {boolean} Indicates whether or not the matrix is 1,0,0,1,0,0\n*/\nexport const isIdentity = function (m) {\n return (m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && m.e === 0 && m.f === 0);\n};\n\n/**\n * This function tries to return a `SVGMatrix` that is the multiplication `m1 * m2`.\n * We also round to zero when it's near zero.\n * @function module:math.matrixMultiply\n * @param {...SVGMatrix} args - Matrix objects to multiply\n * @returns {SVGMatrix} The matrix object resulting from the calculation\n*/\nexport const matrixMultiply = function (...args) {\n const m = args.reduceRight((prev, m1) => {\n return m1.multiply(prev);\n });\n\n if (Math.abs(m.a) < NEAR_ZERO) { m.a = 0; }\n if (Math.abs(m.b) < NEAR_ZERO) { m.b = 0; }\n if (Math.abs(m.c) < NEAR_ZERO) { m.c = 0; }\n if (Math.abs(m.d) < NEAR_ZERO) { m.d = 0; }\n if (Math.abs(m.e) < NEAR_ZERO) { m.e = 0; }\n if (Math.abs(m.f) < NEAR_ZERO) { m.f = 0; }\n\n return m;\n};\n\n/**\n * See if the given transformlist includes a non-indentity matrix transform.\n * @function module:math.hasMatrixTransform\n * @param {SVGTransformList} [tlist] - The transformlist to check\n * @returns {boolean} Whether or not a matrix transform was found\n*/\nexport const hasMatrixTransform = function (tlist) {\n if (!tlist) { return false; }\n let num = tlist.numberOfItems;\n while (num--) {\n const xform = tlist.getItem(num);\n if (xform.type === 1 && !isIdentity(xform.matrix)) { return true; }\n }\n return false;\n};\n\n/**\n* @typedef {PlainObject} module:math.TransformedBox An object with the following values\n* @property {module:math.XYObject} tl - The top left coordinate\n* @property {module:math.XYObject} tr - The top right coordinate\n* @property {module:math.XYObject} bl - The bottom left coordinate\n* @property {module:math.XYObject} br - The bottom right coordinate\n* @property {PlainObject} aabox - Object with the following values:\n* @property {Float} aabox.x - Float with the axis-aligned x coordinate\n* @property {Float} aabox.y - Float with the axis-aligned y coordinate\n* @property {Float} aabox.width - Float with the axis-aligned width coordinate\n* @property {Float} aabox.height - Float with the axis-aligned height coordinate\n*/\n\n/**\n * Transforms a rectangle based on the given matrix.\n * @function module:math.transformBox\n * @param {Float} l - Float with the box's left coordinate\n * @param {Float} t - Float with the box's top coordinate\n * @param {Float} w - Float with the box width\n * @param {Float} h - Float with the box height\n * @param {SVGMatrix} m - Matrix object to transform the box by\n * @returns {module:math.TransformedBox}\n*/\nexport const transformBox = function (l, t, w, h, m) {\n const tl = transformPoint(l, t, m),\n tr = transformPoint((l + w), t, m),\n bl = transformPoint(l, (t + h), m),\n br = transformPoint((l + w), (t + h), m),\n\n minx = Math.min(tl.x, tr.x, bl.x, br.x),\n maxx = Math.max(tl.x, tr.x, bl.x, br.x),\n miny = Math.min(tl.y, tr.y, bl.y, br.y),\n maxy = Math.max(tl.y, tr.y, bl.y, br.y);\n\n return {\n tl,\n tr,\n bl,\n br,\n aabox: {\n x: minx,\n y: miny,\n width: (maxx - minx),\n height: (maxy - miny)\n }\n };\n};\n\n/**\n * This returns a single matrix Transform for a given Transform List\n * (this is the equivalent of `SVGTransformList.consolidate()` but unlike\n * that method, this one does not modify the actual `SVGTransformList`).\n * This function is very liberal with its `min`, `max` arguments.\n * @function module:math.transformListToTransform\n * @param {SVGTransformList} tlist - The transformlist object\n * @param {Integer} [min=0] - Optional integer indicating start transform position\n * @param {Integer} [max] - Optional integer indicating end transform position;\n * defaults to one less than the tlist's `numberOfItems`\n * @returns {SVGTransform} A single matrix transform object\n*/\nexport const transformListToTransform = function (tlist, min, max) {\n if (isNullish(tlist)) {\n // Or should tlist = null have been prevented before this?\n return svg.createSVGTransformFromMatrix(svg.createSVGMatrix());\n }\n min = min || 0;\n max = max || (tlist.numberOfItems - 1);\n min = Number.parseInt(min);\n max = Number.parseInt(max);\n if (min > max) { const temp = max; max = min; min = temp; }\n let m = svg.createSVGMatrix();\n for (let i = min; i <= max; ++i) {\n // if our indices are out of range, just use a harmless identity matrix\n const mtom = (i >= 0 && i < tlist.numberOfItems\n ? tlist.getItem(i).matrix\n : svg.createSVGMatrix());\n m = matrixMultiply(m, mtom);\n }\n return svg.createSVGTransformFromMatrix(m);\n};\n\n/**\n * Get the matrix object for a given element.\n * @function module:math.getMatrix\n * @param {Element} elem - The DOM element to check\n * @returns {SVGMatrix} The matrix object associated with the element's transformlist\n*/\nexport const getMatrix = function (elem) {\n const tlist = getTransformList(elem);\n return transformListToTransform(tlist).matrix;\n};\n\n/**\n * Returns a 45 degree angle coordinate associated with the two given\n * coordinates.\n * @function module:math.snapToAngle\n * @param {Integer} x1 - First coordinate's x value\n * @param {Integer} y1 - First coordinate's y value\n * @param {Integer} x2 - Second coordinate's x value\n * @param {Integer} y2 - Second coordinate's y value\n * @returns {module:math.AngleCoord45}\n*/\nexport const snapToAngle = function (x1, y1, x2, y2) {\n const snap = Math.PI / 4; // 45 degrees\n const dx = x2 - x1;\n const dy = y2 - y1;\n const angle = Math.atan2(dy, dx);\n const dist = Math.sqrt(dx * dx + dy * dy);\n const snapangle = Math.round(angle / snap) * snap;\n\n return {\n x: x1 + dist * Math.cos(snapangle),\n y: y1 + dist * Math.sin(snapangle),\n a: snapangle\n };\n};\n\n/**\n * Check if two rectangles (BBoxes objects) intersect each other.\n * @function module:math.rectsIntersect\n * @param {SVGRect} r1 - The first BBox-like object\n * @param {SVGRect} r2 - The second BBox-like object\n * @returns {boolean} True if rectangles intersect\n */\nexport const rectsIntersect = function (r1, r2) {\n return r2.x < (r1.x + r1.width) &&\n (r2.x + r2.width) > r1.x &&\n r2.y < (r1.y + r1.height) &&\n (r2.y + r2.height) > r1.y;\n};\n","/* eslint-disable node/no-unsupported-features/node-builtins */\n/* globals jQuery */\n/**\n * Miscellaneous utilities.\n * @module utilities\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Jeff Schiller\n */\n\nimport './svgpathseg.js';\nimport jQueryPluginSVG from './jQuery.attr.js'; // Needed for SVG attribute setting and array form with `attr`\nimport {NS} from './namespaces.js';\nimport {getTransformList} from './svgtransformlist.js';\nimport {setUnitAttr, getTypeMap} from './units.js';\nimport {\n hasMatrixTransform, transformListToTransform, transformBox\n} from './math.js';\nimport {\n isWebkit, supportsHVLineContainerBBox, supportsPathBBox, supportsXpath,\n supportsSelectors\n} from './browser.js';\n\n// Constants\nconst $ = jQueryPluginSVG(jQuery);\n\n// String used to encode base64.\nconst KEYSTR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n\n// Much faster than running getBBox() every time\nconst visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use,clipPath';\nconst visElemsArr = visElems.split(',');\n// const hidElems = 'defs,desc,feGaussianBlur,filter,linearGradient,marker,mask,metadata,pattern,radialGradient,stop,switch,symbol,title,textPath';\n\nlet editorContext_ = null;\nlet domdoc_ = null;\nlet domcontainer_ = null;\nlet svgroot_ = null;\n\n/**\n* Object with the following keys/values.\n* @typedef {PlainObject} module:utilities.SVGElementJSON\n* @property {string} element - Tag name of the SVG element to create\n* @property {PlainObject} attr - Has key-value attributes to assign to the new element. An `id` should be set so that {@link module:utilities.EditorContext#addSVGElementFromJson} can later re-identify the element for modification or replacement.\n* @property {boolean} [curStyles=false] - Indicates whether current style attributes should be applied first\n* @property {module:utilities.SVGElementJSON[]} [children] - Data objects to be added recursively as children\n* @property {string} [namespace=\"http://www.w3.org/2000/svg\"] - Indicate a (non-SVG) namespace\n*/\n\n/**\n * An object that creates SVG elements for the canvas.\n *\n * @interface module:utilities.EditorContext\n * @property {module:path.pathActions} pathActions\n */\n/**\n * @function module:utilities.EditorContext#getSVGContent\n * @returns {SVGSVGElement}\n */\n/**\n * Create a new SVG element based on the given object keys/values and add it\n * to the current layer.\n * The element will be run through `cleanupElement` before being returned.\n * @function module:utilities.EditorContext#addSVGElementFromJson\n * @param {module:utilities.SVGElementJSON} data\n * @returns {Element} The new element\n*/\n/**\n * @function module:utilities.EditorContext#getSelectedElements\n * @returns {Element[]} the array with selected DOM elements\n*/\n/**\n * @function module:utilities.EditorContext#getDOMDocument\n * @returns {HTMLDocument}\n*/\n/**\n * @function module:utilities.EditorContext#getDOMContainer\n * @returns {HTMLElement}\n*/\n/**\n * @function module:utilities.EditorContext#getSVGRoot\n * @returns {SVGSVGElement}\n*/\n/**\n * @function module:utilities.EditorContext#getBaseUnit\n * @returns {string}\n*/\n/**\n * @function module:utilities.EditorContext#getSnappingStep\n * @returns {Float|string}\n*/\n\n/**\n* @function module:utilities.init\n* @param {module:utilities.EditorContext} editorContext\n* @returns {void}\n*/\nexport const init = function (editorContext) {\n editorContext_ = editorContext;\n domdoc_ = editorContext.getDOMDocument();\n domcontainer_ = editorContext.getDOMContainer();\n svgroot_ = editorContext.getSVGRoot();\n};\n\n/**\n * Used to prevent the [Billion laughs attack]{@link https://en.wikipedia.org/wiki/Billion_laughs_attack}.\n * @function module:utilities.dropXMLInternalSubset\n * @param {string} str String to be processed\n * @returns {string} The string with entity declarations in the internal subset removed\n * @todo This might be needed in other places `parseFromString` is used even without LGTM flagging\n */\nexport const dropXMLInternalSubset = (str) => {\n return str.replace(/()/, '$1$2');\n // return str.replace(/(?\\?\\]>)/, '$$');\n};\n\n/**\n* Converts characters in a string to XML-friendly entities.\n* @function module:utilities.toXml\n* @example `&` becomes `&`\n* @param {string} str - The string to be converted\n* @returns {string} The converted string\n*/\nexport const toXml = function (str) {\n // ' is ok in XML, but not HTML\n // > does not normally need escaping, though it can if within a CDATA expression (and preceded by \"]]\")\n return str\n .replace(/&/g, '&')\n .replace(//g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, '''); // Note: `'` is XML only\n};\n\n/**\n* Converts XML entities in a string to single characters.\n* @function module:utilities.fromXml\n* @example `&` becomes `&`\n* @param {string} str - The string to be converted\n* @returns {string} The converted string\n*/\nexport function fromXml (str) {\n return $('
').html(str).text();\n}\n\n// This code was written by Tyler Akins and has been placed in the\n// public domain. It would be nice if you left this header intact.\n// Base64 code from Tyler Akins -- http://rumkin.com\n\n// schiller: Removed string concatenation in favour of Array.join() optimization,\n// also precalculate the size of the array needed.\n\n/**\n* Converts a string to base64.\n* @function module:utilities.encode64\n* @param {string} input\n* @returns {string} Base64 output\n*/\nexport function encode64 (input) {\n // base64 strings are 4/3 larger than the original string\n input = encodeUTF8(input); // convert non-ASCII characters\n // input = convertToXMLReferences(input);\n if (window.btoa) {\n return window.btoa(input); // Use native if available\n }\n const output = new Array(Math.floor((input.length + 2) / 3) * 4);\n\n let i = 0,\n p = 0;\n do {\n const chr1 = input.charCodeAt(i++);\n const chr2 = input.charCodeAt(i++);\n const chr3 = input.charCodeAt(i++);\n\n /* eslint-disable no-bitwise */\n const enc1 = chr1 >> 2;\n const enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);\n\n let enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);\n let enc4 = chr3 & 63;\n /* eslint-enable no-bitwise */\n\n if (Number.isNaN(chr2)) {\n enc3 = 64;\n enc4 = 64;\n } else if (Number.isNaN(chr3)) {\n enc4 = 64;\n }\n\n output[p++] = KEYSTR.charAt(enc1);\n output[p++] = KEYSTR.charAt(enc2);\n output[p++] = KEYSTR.charAt(enc3);\n output[p++] = KEYSTR.charAt(enc4);\n } while (i < input.length);\n\n return output.join('');\n}\n\n/**\n* Converts a string from base64.\n* @function module:utilities.decode64\n* @param {string} input Base64-encoded input\n* @returns {string} Decoded output\n*/\nexport function decode64 (input) {\n if (window.atob) {\n return decodeUTF8(window.atob(input));\n }\n\n // remove all characters that are not A-Z, a-z, 0-9, +, /, or =\n input = input.replace(/[^A-Za-z\\d+/=]/g, '');\n\n let output = '';\n let i = 0;\n\n do {\n const enc1 = KEYSTR.indexOf(input.charAt(i++));\n const enc2 = KEYSTR.indexOf(input.charAt(i++));\n const enc3 = KEYSTR.indexOf(input.charAt(i++));\n const enc4 = KEYSTR.indexOf(input.charAt(i++));\n\n /* eslint-disable no-bitwise */\n const chr1 = (enc1 << 2) | (enc2 >> 4);\n const chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);\n const chr3 = ((enc3 & 3) << 6) | enc4;\n /* eslint-enable no-bitwise */\n\n output += String.fromCharCode(chr1);\n\n if (enc3 !== 64) {\n output += String.fromCharCode(chr2);\n }\n if (enc4 !== 64) {\n output += String.fromCharCode(chr3);\n }\n } while (i < input.length);\n return decodeUTF8(output);\n}\n\n/**\n* @function module:utilities.decodeUTF8\n* @param {string} argString\n* @returns {string}\n*/\nexport function decodeUTF8 (argString) {\n return decodeURIComponent(escape(argString));\n}\n\n// codedread:does not seem to work with webkit-based browsers on OSX // Brettz9: please test again as function upgraded\n/**\n* @function module:utilities.encodeUTF8\n* @param {string} argString\n* @returns {string}\n*/\nexport const encodeUTF8 = function (argString) {\n return unescape(encodeURIComponent(argString));\n};\n\n/**\n * Convert dataURL to object URL.\n * @function module:utilities.dataURLToObjectURL\n * @param {string} dataurl\n * @returns {string} object URL or empty string\n */\nexport const dataURLToObjectURL = function (dataurl) {\n if (typeof Uint8Array === 'undefined' || typeof Blob === 'undefined' || typeof URL === 'undefined' || !URL.createObjectURL) {\n return '';\n }\n const arr = dataurl.split(','),\n mime = arr[0].match(/:(.*?);/)[1],\n bstr = atob(arr[1]);\n /*\n const [prefix, suffix] = dataurl.split(','),\n {groups: {mime}} = prefix.match(/:(?.*?);/),\n bstr = atob(suffix);\n */\n let n = bstr.length;\n const u8arr = new Uint8Array(n);\n while (n--) {\n u8arr[n] = bstr.charCodeAt(n);\n }\n const blob = new Blob([u8arr], {type: mime});\n return URL.createObjectURL(blob);\n};\n\n/**\n * Get object URL for a blob object.\n * @function module:utilities.createObjectURL\n * @param {Blob} blob A Blob object or File object\n * @returns {string} object URL or empty string\n */\nexport const createObjectURL = function (blob) {\n if (!blob || typeof URL === 'undefined' || !URL.createObjectURL) {\n return '';\n }\n return URL.createObjectURL(blob);\n};\n\n/**\n * @property {string} blankPageObjectURL\n */\nexport const blankPageObjectURL = (function () {\n if (typeof Blob === 'undefined') {\n return '';\n }\n const blob = new Blob(['SVG-edit '], {type: 'text/html'});\n return createObjectURL(blob);\n})();\n\n/**\n* Converts a string to use XML references (for non-ASCII).\n* @function module:utilities.convertToXMLReferences\n* @param {string} input\n* @returns {string} Decimal numeric character references\n*/\nexport const convertToXMLReferences = function (input) {\n let output = '';\n [...input].forEach((ch) => {\n const c = ch.charCodeAt();\n if (c <= 127) {\n output += ch;\n } else {\n output += `${c};`;\n }\n });\n return output;\n};\n\n/**\n* Cross-browser compatible method of converting a string to an XML tree.\n* Found this function [here]{@link http://groups.google.com/group/jquery-dev/browse_thread/thread/c6d11387c580a77f}.\n* @function module:utilities.text2xml\n* @param {string} sXML\n* @throws {Error}\n* @returns {XMLDocument}\n*/\nexport const text2xml = function (sXML) {\n if (sXML.includes(' `\n* - ` `\n* - ` `\n* @function module:utilities.getUrlFromAttr\n* @param {string} attrVal The attribute value as a string\n* @returns {string} String with just the URL, like \"someFile.svg#foo\"\n*/\nexport const getUrlFromAttr = function (attrVal) {\n if (attrVal) {\n // url('#somegrad')\n if (attrVal.startsWith('url(\"')) {\n return attrVal.substring(5, attrVal.indexOf('\"', 6));\n }\n // url('#somegrad')\n if (attrVal.startsWith(\"url('\")) {\n return attrVal.substring(5, attrVal.indexOf(\"'\", 6));\n }\n if (attrVal.startsWith('url(')) {\n return attrVal.substring(4, attrVal.indexOf(')'));\n }\n }\n return null;\n};\n\n/**\n* @function module:utilities.getHref\n* @param {Element} elem\n* @returns {string} The given element's `xlink:href` value\n*/\nexport let getHref = function (elem) { // eslint-disable-line import/no-mutable-exports\n return elem.getAttributeNS(NS.XLINK, 'href');\n};\n\n/**\n* Sets the given element's `xlink:href` value.\n* @function module:utilities.setHref\n* @param {Element} elem\n* @param {string} val\n* @returns {void}\n*/\nexport let setHref = function (elem, val) { // eslint-disable-line import/no-mutable-exports\n elem.setAttributeNS(NS.XLINK, 'xlink:href', val);\n};\n\n/**\n* @function module:utilities.findDefs\n* @returns {SVGDefsElement} The document's `` element, creating it first if necessary\n*/\nexport const findDefs = function () {\n const svgElement = editorContext_.getSVGContent();\n let defs = svgElement.getElementsByTagNameNS(NS.SVG, 'defs');\n if (defs.length > 0) {\n defs = defs[0];\n } else {\n defs = svgElement.ownerDocument.createElementNS(NS.SVG, 'defs');\n if (svgElement.firstChild) {\n // first child is a comment, so call nextSibling\n svgElement.insertBefore(defs, svgElement.firstChild.nextSibling);\n // svgElement.firstChild.nextSibling.before(defs); // Not safe\n } else {\n svgElement.append(defs);\n }\n }\n return defs;\n};\n\n// TODO(codedread): Consider moving the next to functions to bbox.js\n\n/**\n* Get correct BBox for a path in Webkit.\n* Converted from code found [here]{@link http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html}.\n* @function module:utilities.getPathBBox\n* @param {SVGPathElement} path - The path DOM element to get the BBox for\n* @returns {module:utilities.BBoxObject} A BBox-like object\n*/\nexport const getPathBBox = function (path) {\n const seglist = path.pathSegList;\n const tot = seglist.numberOfItems;\n\n const bounds = [[], []];\n const start = seglist.getItem(0);\n let P0 = [start.x, start.y];\n\n const getCalc = function (j, P1, P2, P3) {\n return function (t) {\n return 1 - (t ** 3) * P0[j] +\n 3 * 1 - (t ** 2) * t * P1[j] +\n 3 * (1 - t) * (t ** 2) * P2[j] +\n (t ** 3) * P3[j];\n };\n };\n\n for (let i = 0; i < tot; i++) {\n const seg = seglist.getItem(i);\n\n if (seg.x === undefined) { continue; }\n\n // Add actual points to limits\n bounds[0].push(P0[0]);\n bounds[1].push(P0[1]);\n\n if (seg.x1) {\n const P1 = [seg.x1, seg.y1],\n P2 = [seg.x2, seg.y2],\n P3 = [seg.x, seg.y];\n\n for (let j = 0; j < 2; j++) {\n const calc = getCalc(j, P1, P2, P3);\n\n const b = 6 * P0[j] - 12 * P1[j] + 6 * P2[j];\n const a = -3 * P0[j] + 9 * P1[j] - 9 * P2[j] + 3 * P3[j];\n const c = 3 * P1[j] - 3 * P0[j];\n\n if (a === 0) {\n if (b === 0) { continue; }\n const t = -c / b;\n if (t > 0 && t < 1) {\n bounds[j].push(calc(t));\n }\n continue;\n }\n const b2ac = (b ** 2) - 4 * c * a;\n if (b2ac < 0) { continue; }\n const t1 = (-b + Math.sqrt(b2ac)) / (2 * a);\n if (t1 > 0 && t1 < 1) { bounds[j].push(calc(t1)); }\n const t2 = (-b - Math.sqrt(b2ac)) / (2 * a);\n if (t2 > 0 && t2 < 1) { bounds[j].push(calc(t2)); }\n }\n P0 = P3;\n } else {\n bounds[0].push(seg.x);\n bounds[1].push(seg.y);\n }\n }\n\n const x = Math.min.apply(null, bounds[0]);\n const w = Math.max.apply(null, bounds[0]) - x;\n const y = Math.min.apply(null, bounds[1]);\n const h = Math.max.apply(null, bounds[1]) - y;\n return {\n x,\n y,\n width: w,\n height: h\n };\n};\n\n/**\n* Get the given/selected element's bounding box object, checking for\n* horizontal/vertical lines (see issue 717)\n* Note that performance is currently terrible, so some way to improve would\n* be great.\n* @param {Element} selected - Container or `` DOM element\n* @returns {DOMRect} Bounding box object\n*/\nfunction groupBBFix (selected) {\n if (supportsHVLineContainerBBox()) {\n try { return selected.getBBox(); } catch (e) {}\n }\n const ref = $.data(selected, 'ref');\n let matched = null;\n let ret, copy;\n\n if (ref) {\n copy = $(ref).children().clone().attr('visibility', 'hidden');\n $(svgroot_).append(copy);\n matched = copy.filter('line, path');\n } else {\n matched = $(selected).find('line, path');\n }\n\n let issue = false;\n if (matched.length) {\n matched.each(function () {\n const bb = this.getBBox();\n if (!bb.width || !bb.height) {\n issue = true;\n }\n });\n if (issue) {\n const elems = ref ? copy : $(selected).children();\n ret = getStrokedBBox(elems);\n } else {\n ret = selected.getBBox();\n }\n } else {\n ret = selected.getBBox();\n }\n if (ref) {\n copy.remove();\n }\n return ret;\n}\n\n/**\n* Get the given/selected element's bounding box object, convert it to be more\n* usable when necessary.\n* @function module:utilities.getBBox\n* @param {Element} elem - Optional DOM element to get the BBox for\n* @returns {module:utilities.BBoxObject} Bounding box object\n*/\nexport const getBBox = function (elem) {\n const selected = elem || editorContext_.geSelectedElements()[0];\n if (elem.nodeType !== 1) { return null; }\n const elname = selected.nodeName;\n\n let ret = null;\n switch (elname) {\n case 'text':\n if (selected.textContent === '') {\n selected.textContent = 'a'; // Some character needed for the selector to use.\n ret = selected.getBBox();\n selected.textContent = '';\n } else if (selected.getBBox) {\n ret = selected.getBBox();\n }\n break;\n case 'path':\n if (!supportsPathBBox()) {\n ret = getPathBBox(selected);\n } else if (selected.getBBox) {\n ret = selected.getBBox();\n }\n break;\n case 'g':\n case 'a':\n ret = groupBBFix(selected);\n break;\n default:\n\n if (elname === 'use') {\n ret = groupBBFix(selected); // , true);\n }\n if (elname === 'use' || (elname === 'foreignObject' && isWebkit())) {\n if (!ret) { ret = selected.getBBox(); }\n // This is resolved in later versions of webkit, perhaps we should\n // have a featured detection for correct 'use' behavior?\n // ——————————\n if (!isWebkit()) {\n const {x, y, width, height} = ret;\n const bb = {\n width,\n height,\n x: x + Number.parseFloat(selected.getAttribute('x') || 0),\n y: y + Number.parseFloat(selected.getAttribute('y') || 0)\n };\n ret = bb;\n }\n } else if (visElemsArr.includes(elname)) {\n if (selected) {\n try {\n ret = selected.getBBox();\n } catch (err) {\n // tspan (and textPath apparently) have no `getBBox` in Firefox: https://bugzilla.mozilla.org/show_bug.cgi?id=937268\n // Re: Chrome returning bbox for containing text element, see: https://bugs.chromium.org/p/chromium/issues/detail?id=349835\n const extent = selected.getExtentOfChar(0); // pos+dimensions of the first glyph\n const width = selected.getComputedTextLength(); // width of the tspan\n ret = {\n x: extent.x,\n y: extent.y,\n width,\n height: extent.height\n };\n }\n } else {\n // Check if element is child of a foreignObject\n const fo = $(selected).closest('foreignObject');\n if (fo.length) {\n if (fo[0].getBBox) {\n ret = fo[0].getBBox();\n }\n }\n }\n }\n }\n if (ret) {\n ret = bboxToObj(ret);\n }\n\n // get the bounding box from the DOM (which is in that element's coordinate system)\n return ret;\n};\n\n/**\n* @typedef {GenericArray} module:utilities.PathSegmentArray\n* @property {Integer} length 2\n* @property {\"M\"|\"L\"|\"C\"|\"Z\"} 0\n* @property {Float[]} 1\n*/\n\n/**\n* Create a path 'd' attribute from path segments.\n* Each segment is an array of the form: `[singleChar, [x,y, x,y, ...]]`\n* @function module:utilities.getPathDFromSegments\n* @param {module:utilities.PathSegmentArray[]} pathSegments - An array of path segments to be converted\n* @returns {string} The converted path d attribute.\n*/\nexport const getPathDFromSegments = function (pathSegments) {\n let d = '';\n\n $.each(pathSegments, function (j, [singleChar, pts]) {\n d += singleChar;\n for (let i = 0; i < pts.length; i += 2) {\n d += (pts[i] + ',' + pts[i + 1]) + ' ';\n }\n });\n\n return d;\n};\n\n/**\n* Make a path 'd' attribute from a simple SVG element shape.\n* @function module:utilities.getPathDFromElement\n* @param {Element} elem - The element to be converted\n* @returns {string} The path d attribute or `undefined` if the element type is unknown.\n*/\nexport const getPathDFromElement = function (elem) {\n // Possibly the cubed root of 6, but 1.81 works best\n let num = 1.81;\n let d, a, rx, ry;\n switch (elem.tagName) {\n case 'ellipse':\n case 'circle': {\n a = $(elem).attr(['rx', 'ry', 'cx', 'cy']);\n const {cx, cy} = a;\n ({rx, ry} = a);\n if (elem.tagName === 'circle') {\n ry = $(elem).attr('r');\n rx = ry;\n }\n\n d = getPathDFromSegments([\n ['M', [(cx - rx), (cy)]],\n ['C', [(cx - rx), (cy - ry / num), (cx - rx / num), (cy - ry), (cx), (cy - ry)]],\n ['C', [(cx + rx / num), (cy - ry), (cx + rx), (cy - ry / num), (cx + rx), (cy)]],\n ['C', [(cx + rx), (cy + ry / num), (cx + rx / num), (cy + ry), (cx), (cy + ry)]],\n ['C', [(cx - rx / num), (cy + ry), (cx - rx), (cy + ry / num), (cx - rx), (cy)]],\n ['Z', []]\n ]);\n break;\n } case 'path':\n d = elem.getAttribute('d');\n break;\n case 'line':\n a = $(elem).attr(['x1', 'y1', 'x2', 'y2']);\n d = 'M' + a.x1 + ',' + a.y1 + 'L' + a.x2 + ',' + a.y2;\n break;\n case 'polyline':\n d = 'M' + elem.getAttribute('points');\n break;\n case 'polygon':\n d = 'M' + elem.getAttribute('points') + ' Z';\n break;\n case 'rect': {\n const r = $(elem).attr(['rx', 'ry']);\n ({rx, ry} = r);\n const b = elem.getBBox();\n const {x, y} = b,\n w = b.width,\n h = b.height;\n num = 4 - num; // Why? Because!\n\n if (!rx && !ry) {\n // Regular rect\n d = getPathDFromSegments([\n ['M', [x, y]],\n ['L', [x + w, y]],\n ['L', [x + w, y + h]],\n ['L', [x, y + h]],\n ['L', [x, y]],\n ['Z', []]\n ]);\n } else {\n d = getPathDFromSegments([\n ['M', [x, y + ry]],\n ['C', [x, y + ry / num, x + rx / num, y, x + rx, y]],\n ['L', [x + w - rx, y]],\n ['C', [x + w - rx / num, y, x + w, y + ry / num, x + w, y + ry]],\n ['L', [x + w, y + h - ry]],\n ['C', [x + w, y + h - ry / num, x + w - rx / num, y + h, x + w - rx, y + h]],\n ['L', [x + rx, y + h]],\n ['C', [x + rx / num, y + h, x, y + h - ry / num, x, y + h - ry]],\n ['L', [x, y + ry]],\n ['Z', []]\n ]);\n }\n break;\n } default:\n break;\n }\n\n return d;\n};\n\n/**\n* Get a set of attributes from an element that is useful for convertToPath.\n* @function module:utilities.getExtraAttributesForConvertToPath\n* @param {Element} elem - The element to be probed\n* @returns {PlainObject<\"marker-start\"|\"marker-end\"|\"marker-mid\"|\"filter\"|\"clip-path\", string>} An object with attributes.\n*/\nexport const getExtraAttributesForConvertToPath = function (elem) {\n const attrs = {};\n // TODO: make this list global so that we can properly maintain it\n // TODO: what about @transform, @clip-rule, @fill-rule, etc?\n $.each(['marker-start', 'marker-end', 'marker-mid', 'filter', 'clip-path'], function () {\n const a = elem.getAttribute(this);\n if (a) {\n attrs[this] = a;\n }\n });\n return attrs;\n};\n\n/**\n* Get the BBox of an element-as-path.\n* @function module:utilities.getBBoxOfElementAsPath\n* @param {Element} elem - The DOM element to be probed\n* @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson\n* @param {module:path.pathActions} pathActions - If a transform exists, `pathActions.resetOrientation()` is used. See: canvas.pathActions.\n* @returns {DOMRect|false} The resulting path's bounding box object.\n*/\nexport const getBBoxOfElementAsPath = function (elem, addSVGElementFromJson, pathActions) {\n const path = addSVGElementFromJson({\n element: 'path',\n attr: getExtraAttributesForConvertToPath(elem)\n });\n\n const eltrans = elem.getAttribute('transform');\n if (eltrans) {\n path.setAttribute('transform', eltrans);\n }\n\n const {parentNode} = elem;\n if (elem.nextSibling) {\n elem.before(path);\n } else {\n parentNode.append(path);\n }\n\n const d = getPathDFromElement(elem);\n if (d) {\n path.setAttribute('d', d);\n } else {\n path.remove();\n }\n\n // Get the correct BBox of the new path, then discard it\n pathActions.resetOrientation(path);\n let bb = false;\n try {\n bb = path.getBBox();\n } catch (e) {\n // Firefox fails\n }\n path.remove();\n return bb;\n};\n\n/**\n* Convert selected element to a path.\n* @function module:utilities.convertToPath\n* @param {Element} elem - The DOM element to be converted\n* @param {module:utilities.SVGElementJSON} attrs - Apply attributes to new path. see canvas.convertToPath\n* @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson\n* @param {module:path.pathActions} pathActions - If a transform exists, pathActions.resetOrientation() is used. See: canvas.pathActions.\n* @param {module:draw.DrawCanvasInit#clearSelection|module:path.EditorContext#clearSelection} clearSelection - see [canvas.clearSelection]{@link module:svgcanvas.SvgCanvas#clearSelection}\n* @param {module:path.EditorContext#addToSelection} addToSelection - see [canvas.addToSelection]{@link module:svgcanvas.SvgCanvas#addToSelection}\n* @param {module:history} hstry - see history module\n* @param {module:path.EditorContext#addCommandToHistory|module:draw.DrawCanvasInit#addCommandToHistory} addCommandToHistory - see [canvas.addCommandToHistory]{@link module:svgcanvas~addCommandToHistory}\n* @returns {SVGPathElement|null} The converted path element or null if the DOM element was not recognized.\n*/\nexport const convertToPath = function (elem, attrs, addSVGElementFromJson, pathActions, clearSelection, addToSelection, hstry, addCommandToHistory) {\n const batchCmd = new hstry.BatchCommand('Convert element to Path');\n\n // Any attribute on the element not covered by the passed-in attributes\n attrs = $.extend({}, attrs, getExtraAttributesForConvertToPath(elem));\n\n const path = addSVGElementFromJson({\n element: 'path',\n attr: attrs\n });\n\n const eltrans = elem.getAttribute('transform');\n if (eltrans) {\n path.setAttribute('transform', eltrans);\n }\n\n const {id} = elem;\n const {parentNode} = elem;\n if (elem.nextSibling) {\n elem.before(path);\n } else {\n parentNode.append(path);\n }\n\n const d = getPathDFromElement(elem);\n if (d) {\n path.setAttribute('d', d);\n\n // Replace the current element with the converted one\n\n // Reorient if it has a matrix\n if (eltrans) {\n const tlist = getTransformList(path);\n if (hasMatrixTransform(tlist)) {\n pathActions.resetOrientation(path);\n }\n }\n\n const {nextSibling} = elem;\n batchCmd.addSubCommand(new hstry.RemoveElementCommand(elem, nextSibling, parent));\n batchCmd.addSubCommand(new hstry.InsertElementCommand(path));\n\n clearSelection();\n elem.remove();\n path.setAttribute('id', id);\n path.removeAttribute('visibility');\n addToSelection([path], true);\n\n addCommandToHistory(batchCmd);\n\n return path;\n }\n // the elem.tagName was not recognized, so no \"d\" attribute. Remove it, so we've haven't changed anything.\n path.remove();\n return null;\n};\n\n/**\n* Can the bbox be optimized over the native getBBox? The optimized bbox is the same as the native getBBox when\n* the rotation angle is a multiple of 90 degrees and there are no complex transforms.\n* Getting an optimized bbox can be dramatically slower, so we want to make sure it's worth it.\n*\n* The best example for this is a circle rotate 45 degrees. The circle doesn't get wider or taller when rotated\n* about it's center.\n*\n* The standard, unoptimized technique gets the native bbox of the circle, rotates the box 45 degrees, uses\n* that width and height, and applies any transforms to get the final bbox. This means the calculated bbox\n* is much wider than the original circle. If the angle had been 0, 90, 180, etc. both techniques render the\n* same bbox.\n*\n* The optimization is not needed if the rotation is a multiple 90 degrees. The default technique is to call\n* getBBox then apply the angle and any transforms.\n*\n* @param {Float} angle - The rotation angle in degrees\n* @param {boolean} hasAMatrixTransform - True if there is a matrix transform\n* @returns {boolean} True if the bbox can be optimized.\n*/\nfunction bBoxCanBeOptimizedOverNativeGetBBox (angle, hasAMatrixTransform) {\n const angleModulo90 = angle % 90;\n const closeTo90 = angleModulo90 < -89.99 || angleModulo90 > 89.99;\n const closeTo0 = angleModulo90 > -0.001 && angleModulo90 < 0.001;\n return hasAMatrixTransform || !(closeTo0 || closeTo90);\n}\n\n/**\n* Get bounding box that includes any transforms.\n* @function module:utilities.getBBoxWithTransform\n* @param {Element} elem - The DOM element to be converted\n* @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson\n* @param {module:path.pathActions} pathActions - If a transform exists, pathActions.resetOrientation() is used. See: canvas.pathActions.\n* @returns {module:utilities.BBoxObject|module:math.TransformedBox|DOMRect} A single bounding box object\n*/\nexport const getBBoxWithTransform = function (elem, addSVGElementFromJson, pathActions) {\n // TODO: Fix issue with rotated groups. Currently they work\n // fine in FF, but not in other browsers (same problem mentioned\n // in Issue 339 comment #2).\n\n let bb = getBBox(elem);\n\n if (!bb) {\n return null;\n }\n\n const tlist = getTransformList(elem);\n const angle = getRotationAngleFromTransformList(tlist);\n const hasMatrixXForm = hasMatrixTransform(tlist);\n\n if (angle || hasMatrixXForm) {\n let goodBb = false;\n if (bBoxCanBeOptimizedOverNativeGetBBox(angle, hasMatrixXForm)) {\n // Get the BBox from the raw path for these elements\n // TODO: why ellipse and not circle\n const elemNames = ['ellipse', 'path', 'line', 'polyline', 'polygon'];\n if (elemNames.includes(elem.tagName)) {\n goodBb = getBBoxOfElementAsPath(elem, addSVGElementFromJson, pathActions);\n bb = goodBb;\n } else if (elem.tagName === 'rect') {\n // Look for radius\n const rx = elem.getAttribute('rx');\n const ry = elem.getAttribute('ry');\n if (rx || ry) {\n goodBb = getBBoxOfElementAsPath(elem, addSVGElementFromJson, pathActions);\n bb = goodBb;\n }\n }\n }\n\n if (!goodBb) {\n const {matrix} = transformListToTransform(tlist);\n bb = transformBox(bb.x, bb.y, bb.width, bb.height, matrix).aabox;\n\n // Old technique that was exceedingly slow with large documents.\n //\n // Accurate way to get BBox of rotated element in Firefox:\n // Put element in group and get its BBox\n //\n // Must use clone else FF freaks out\n // const clone = elem.cloneNode(true);\n // const g = document.createElementNS(NS.SVG, 'g');\n // const parent = elem.parentNode;\n // parent.append(g);\n // g.append(clone);\n // const bb2 = bboxToObj(g.getBBox());\n // g.remove();\n }\n }\n return bb;\n};\n\n/**\n * @param {Element} elem\n * @returns {Float}\n * @todo This is problematic with large stroke-width and, for example, a single\n * horizontal line. The calculated BBox extends way beyond left and right sides.\n */\nfunction getStrokeOffsetForBBox (elem) {\n const sw = elem.getAttribute('stroke-width');\n return (!isNaN(sw) && elem.getAttribute('stroke') !== 'none') ? sw / 2 : 0;\n}\n\n/**\n * @typedef {PlainObject} BBox\n * @property {Integer} x The x value\n * @property {Integer} y The y value\n * @property {Float} width\n * @property {Float} height\n */\n\n/**\n* Get the bounding box for one or more stroked and/or transformed elements.\n* @function module:utilities.getStrokedBBox\n* @param {Element[]} elems - Array with DOM elements to check\n* @param {module:utilities.EditorContext#addSVGElementFromJson} addSVGElementFromJson - Function to add the path element to the current layer. See canvas.addSVGElementFromJson\n* @param {module:path.pathActions} pathActions - If a transform exists, pathActions.resetOrientation() is used. See: canvas.pathActions.\n* @returns {module:utilities.BBoxObject|module:math.TransformedBox|DOMRect} A single bounding box object\n*/\nexport const getStrokedBBox = function (elems, addSVGElementFromJson, pathActions) {\n if (!elems || !elems.length) { return false; }\n\n let fullBb;\n $.each(elems, function () {\n if (fullBb) { return; }\n if (!this.parentNode) { return; }\n fullBb = getBBoxWithTransform(this, addSVGElementFromJson, pathActions);\n });\n\n // This shouldn't ever happen...\n if (fullBb === undefined) { return null; }\n\n // fullBb doesn't include the stoke, so this does no good!\n // if (elems.length == 1) return fullBb;\n\n let maxX = fullBb.x + fullBb.width;\n let maxY = fullBb.y + fullBb.height;\n let minX = fullBb.x;\n let minY = fullBb.y;\n\n // If only one elem, don't call the potentially slow getBBoxWithTransform method again.\n if (elems.length === 1) {\n const offset = getStrokeOffsetForBBox(elems[0]);\n minX -= offset;\n minY -= offset;\n maxX += offset;\n maxY += offset;\n } else {\n $.each(elems, function (i, elem) {\n const curBb = getBBoxWithTransform(elem, addSVGElementFromJson, pathActions);\n if (curBb) {\n const offset = getStrokeOffsetForBBox(elem);\n minX = Math.min(minX, curBb.x - offset);\n minY = Math.min(minY, curBb.y - offset);\n // TODO: The old code had this test for max, but not min. I suspect this test should be for both min and max\n if (elem.nodeType === 1) {\n maxX = Math.max(maxX, curBb.x + curBb.width + offset);\n maxY = Math.max(maxY, curBb.y + curBb.height + offset);\n }\n }\n });\n }\n\n fullBb.x = minX;\n fullBb.y = minY;\n fullBb.width = maxX - minX;\n fullBb.height = maxY - minY;\n return fullBb;\n};\n\n/**\n* Get all elements that have a BBox (excludes ``, ``, etc).\n* Note that 0-opacity, off-screen etc elements are still considered \"visible\"\n* for this function.\n* @function module:utilities.getVisibleElements\n* @param {Element} parentElement - The parent DOM element to search within\n* @returns {Element[]} All \"visible\" elements.\n*/\nexport const getVisibleElements = function (parentElement) {\n if (!parentElement) {\n parentElement = $(editorContext_.getSVGContent()).children(); // Prevent layers from being included\n }\n\n const contentElems = [];\n $(parentElement).children().each(function (i, elem) {\n if (elem.getBBox) {\n contentElems.push(elem);\n }\n });\n return contentElems.reverse();\n};\n\n/**\n* Get the bounding box for one or more stroked and/or transformed elements.\n* @function module:utilities.getStrokedBBoxDefaultVisible\n* @param {Element[]} elems - Array with DOM elements to check\n* @returns {module:utilities.BBoxObject} A single bounding box object\n*/\nexport const getStrokedBBoxDefaultVisible = function (elems) {\n if (!elems) { elems = getVisibleElements(); }\n return getStrokedBBox(\n elems,\n editorContext_.addSVGElementFromJson,\n editorContext_.pathActions\n );\n};\n\n/**\n* Get the rotation angle of the given transform list.\n* @function module:utilities.getRotationAngleFromTransformList\n* @param {SVGTransformList} tlist - List of transforms\n* @param {boolean} toRad - When true returns the value in radians rather than degrees\n* @returns {Float} The angle in degrees or radians\n*/\nexport const getRotationAngleFromTransformList = function (tlist, toRad) {\n if (!tlist) { return 0; } // elements have no tlist\n const N = tlist.numberOfItems;\n for (let i = 0; i < N; ++i) {\n const xform = tlist.getItem(i);\n if (xform.type === 4) {\n return toRad ? xform.angle * Math.PI / 180.0 : xform.angle;\n }\n }\n return 0.0;\n};\n\n/**\n* Get the rotation angle of the given/selected DOM element.\n* @function module:utilities.getRotationAngle\n* @param {Element} [elem] - DOM element to get the angle for. Default to first of selected elements.\n* @param {boolean} [toRad=false] - When true returns the value in radians rather than degrees\n* @returns {Float} The angle in degrees or radians\n*/\nexport let getRotationAngle = function (elem, toRad) { // eslint-disable-line import/no-mutable-exports\n const selected = elem || editorContext_.getSelectedElements()[0];\n // find the rotation transform (if any) and set it\n const tlist = getTransformList(selected);\n return getRotationAngleFromTransformList(tlist, toRad);\n};\n\n/**\n* Get the reference element associated with the given attribute value.\n* @function module:utilities.getRefElem\n* @param {string} attrVal - The attribute value as a string\n* @returns {Element} Reference element\n*/\nexport const getRefElem = function (attrVal) {\n return getElem(getUrlFromAttr(attrVal).substr(1));\n};\n\n/**\n* Get a DOM element by ID within the SVG root element.\n* @function module:utilities.getElem\n* @param {string} id - String with the element's new ID\n* @returns {?Element}\n*/\nexport const getElem = (supportsSelectors())\n ? function (id) {\n // querySelector lookup\n return svgroot_.querySelector('#' + id);\n }\n : supportsXpath()\n ? function (id) {\n // xpath lookup\n return domdoc_.evaluate(\n 'svg:svg[@id=\"svgroot\"]//svg:*[@id=\"' + id + '\"]',\n domcontainer_,\n function () { return NS.SVG; },\n 9,\n null\n ).singleNodeValue;\n }\n : function (id) {\n // jQuery lookup: twice as slow as xpath in FF\n return $(svgroot_).find('[id=' + id + ']')[0];\n };\n\n/**\n* Assigns multiple attributes to an element.\n* @function module:utilities.assignAttributes\n* @param {Element} elem - DOM element to apply new attribute values to\n* @param {PlainObject} attrs - Object with attribute keys/values\n* @param {Integer} [suspendLength] - Milliseconds to suspend redraw\n* @param {boolean} [unitCheck=false] - Boolean to indicate the need to use units.setUnitAttr\n* @returns {void}\n*/\nexport const assignAttributes = function (elem, attrs, suspendLength, unitCheck) {\n for (const [key, value] of Object.entries(attrs)) {\n const ns = (key.substr(0, 4) === 'xml:'\n ? NS.XML\n : key.substr(0, 6) === 'xlink:' ? NS.XLINK : null);\n if (isNullish(value)) {\n if (ns) {\n elem.removeAttributeNS(ns, key);\n } else {\n elem.removeAttribute(key);\n }\n continue;\n }\n if (ns) {\n elem.setAttributeNS(ns, key, value);\n } else if (!unitCheck) {\n elem.setAttribute(key, value);\n } else {\n setUnitAttr(elem, key, value);\n }\n }\n};\n\n/**\n* Remove unneeded (default) attributes, making resulting SVG smaller.\n* @function module:utilities.cleanupElement\n* @param {Element} element - DOM element to clean up\n* @returns {void}\n*/\nexport const cleanupElement = function (element) {\n const defaults = {\n 'fill-opacity': 1,\n 'stop-opacity': 1,\n opacity: 1,\n stroke: 'none',\n 'stroke-dasharray': 'none',\n 'stroke-linejoin': 'miter',\n 'stroke-linecap': 'butt',\n 'stroke-opacity': 1,\n 'stroke-width': 1,\n rx: 0,\n ry: 0\n };\n\n if (element.nodeName === 'ellipse') {\n // Ellipse elements require rx and ry attributes\n delete defaults.rx;\n delete defaults.ry;\n }\n\n Object.entries(defaults).forEach(([attr, val]) => {\n if (element.getAttribute(attr) === String(val)) {\n element.removeAttribute(attr);\n }\n });\n};\n\n/**\n* Round value to for snapping.\n* @function module:utilities.snapToGrid\n* @param {Float} value\n* @returns {Integer}\n*/\nexport const snapToGrid = function (value) {\n const unit = editorContext_.getBaseUnit();\n let stepSize = editorContext_.getSnappingStep();\n if (unit !== 'px') {\n stepSize *= getTypeMap()[unit];\n }\n value = Math.round(value / stepSize) * stepSize;\n return value;\n};\n\n/**\n* Escapes special characters in a regular expression.\n* @function module:utilities.regexEscape\n* @param {string} str\n* @returns {string}\n*/\nexport const regexEscape = function (str) {\n // Originally from: http://phpjs.org/functions\n return String(str).replace(/[.\\\\+*?[^\\]$(){}=!<>|:-]/g, '\\\\$&');\n};\n\n/**\n * Prevents default browser click behaviour on the given element.\n * @function module:utilities.preventClickDefault\n * @param {Element} img - The DOM element to prevent the click on\n * @returns {void}\n */\nexport const preventClickDefault = function (img) {\n $(img).click(function (e) { e.preventDefault(); });\n};\n\n/**\n * @callback module:utilities.GetNextID\n * @returns {string} The ID\n */\n\n/**\n * Whether a value is `null` or `undefined`.\n * @param {any} val\n * @returns {boolean}\n */\nexport const isNullish = (val) => {\n return val === null || val === undefined;\n};\n\n/**\n* Overwrite methods for unit testing.\n* @function module:utilities.mock\n* @param {PlainObject} mockMethods\n* @param {module:utilities.getHref} mockMethods.getHref\n* @param {module:utilities.setHref} mockMethods.setHref\n* @param {module:utilities.getRotationAngle} mockMethods.getRotationAngle\n* @returns {void}\n*/\nexport const mock = ({\n getHref: getHrefUser, setHref: setHrefUser, getRotationAngle: getRotationAngleUser\n}) => {\n getHref = getHrefUser;\n setHref = setHrefUser;\n getRotationAngle = getRotationAngleUser;\n};\n\nexport const $q = (sel) => document.querySelector(sel);\nexport const $qq = (sel) => [...document.querySelectorAll(sel)];\n","/* globals jQuery */\n/**\n * Adds context menu functionality.\n * @module contextmenu\n * @license Apache-2.0\n * @author Adam Bender\n */\n// Dependencies:\n// 1) jQuery (for dom injection of context menus)\n\nconst $ = jQuery;\n\nlet contextMenuExtensions = {};\n\n/**\n * Signature depends on what the user adds; in the case of our uses with\n * SVGEditor, no parameters are passed nor anything expected for a return.\n * @callback module:contextmenu.MenuItemAction\n * @param {...args} args\n * @returns {any}\n*/\n\n/**\n* @typedef {PlainObject} module:contextmenu.MenuItem\n* @property {string} id\n* @property {string} label\n* @property {module:contextmenu.MenuItemAction} action\n*/\n\n/**\n* @param {module:contextmenu.MenuItem} menuItem\n* @returns {boolean}\n*/\nconst menuItemIsValid = function (menuItem) {\n return menuItem && menuItem.id && menuItem.label && menuItem.action && typeof menuItem.action === 'function';\n};\n\n/**\n* @function module:contextmenu.add\n* @param {module:contextmenu.MenuItem} menuItem\n* @throws {Error|TypeError}\n* @returns {void}\n*/\nexport const add = function (menuItem) {\n // menuItem: {id, label, shortcut, action}\n if (!menuItemIsValid(menuItem)) {\n throw new TypeError('Menu items must be defined and have at least properties: id, label, action, where action must be a function');\n }\n if (menuItem.id in contextMenuExtensions) {\n throw new Error('Cannot add extension \"' + menuItem.id + '\", an extension by that name already exists\"');\n }\n // Register menuItem action, see below for deferred menu dom injection\n console.log('Registered contextmenu item: {id:' + menuItem.id + ', label:' + menuItem.label + '}'); // eslint-disable-line no-console\n contextMenuExtensions[menuItem.id] = menuItem;\n // TODO: Need to consider how to handle custom enable/disable behavior\n};\n\n/**\n* @function module:contextmenu.hasCustomHandler\n* @param {string} handlerKey\n* @returns {boolean}\n*/\nexport const hasCustomHandler = function (handlerKey) {\n return Boolean(contextMenuExtensions[handlerKey]);\n};\n\n/**\n* @function module:contextmenu.getCustomHandler\n* @param {string} handlerKey\n* @returns {module:contextmenu.MenuItemAction}\n*/\nexport const getCustomHandler = function (handlerKey) {\n return contextMenuExtensions[handlerKey].action;\n};\n\n/**\n* @param {module:contextmenu.MenuItem} menuItem\n* @returns {void}\n*/\nconst injectExtendedContextMenuItemIntoDom = function (menuItem) {\n if (!Object.keys(contextMenuExtensions).length) {\n // all menuItems appear at the bottom of the menu in their own container.\n // if this is the first extension menu we need to add the separator.\n $('#cmenu_canvas').append(\"\");\n }\n const shortcut = menuItem.shortcut || '';\n $('#cmenu_canvas').append(\" \" +\n menuItem.label + \"\" +\n shortcut + ' ');\n};\n\n/**\n* @function module:contextmenu.injectExtendedContextMenuItemsIntoDom\n* @returns {void}\n*/\nexport const injectExtendedContextMenuItemsIntoDom = function () {\n Object.values(contextMenuExtensions).forEach((menuItem) => {\n injectExtendedContextMenuItemIntoDom(menuItem);\n });\n};\n/**\n* @function module:contextmenu.resetCustomMenus\n* @returns {void}\n*/\nexport const resetCustomMenus = function () { contextMenuExtensions = {}; };\n","/* eslint-disable jsdoc/require-file-overview */\n/**\n * Adapted from {@link https://github.com/uupaa/dynamic-import-polyfill/blob/master/importModule.js}.\n * @module importModule\n * @license MIT\n */\n\n/**\n * Converts a possible relative URL into an absolute one.\n * @param {string} url\n * @returns {string}\n */\nfunction toAbsoluteURL (url) {\n const a = document.createElement('a');\n a.setAttribute('href', url); // \n return a.cloneNode(false).href; // -> \"http://example.com/hoge.html\"\n}\n\n/**\n * Add any of the whitelisted attributes to the script tag.\n * @param {HTMLScriptElement} script\n * @param {PlainObject} atts\n * @returns {void}\n */\nfunction addScriptAtts (script, atts) {\n ['id', 'class', 'type'].forEach((prop) => {\n if (prop in atts) {\n script[prop] = atts[prop];\n }\n });\n}\n\n// Additions by Brett\n/**\n* @typedef {PlainObject} module:importModule.ImportConfig\n* @property {string} global The variable name to set on `window` (when not using the modular version)\n* @property {boolean} [returnDefault=false]\n*/\n\n/**\n* @function module:importModule.importSetGlobalDefault\n* @param {string|GenericArray} url\n* @param {module:importModule.ImportConfig} config\n* @returns {Promise} The value to which it resolves depends on the export of the targeted module.\n*/\nexport function importSetGlobalDefault (url, config) {\n return importSetGlobal(url, {...config, returnDefault: true});\n}\n/**\n* @function module:importModule.importSetGlobal\n* @param {string|string[]} url\n* @param {module:importModule.ImportConfig} config\n* @returns {Promise} The promise resolves to either an `ArbitraryModule` or\n* any other value depends on the export of the targeted module.\n*/\nexport async function importSetGlobal (url, {global: glob, returnDefault}) {\n // Todo: Replace calls to this function with `import()` when supported\n const modularVersion = !('svgEditor' in window) ||\n !window.svgEditor ||\n window.svgEditor.modules !== false;\n if (modularVersion) {\n return importModule(url, undefined, {returnDefault});\n }\n await importScript(url);\n return window[glob];\n}\n\n/**\n *\n * @author Brett Zamir (other items are from `dynamic-import-polyfill`)\n * @param {string|string[]} url\n * @param {PlainObject} [atts={}]\n * @returns {Promise} Resolves to `undefined` or rejects with an `Error` upon a\n * script loading error\n */\nexport function importScript (url, atts = {}) {\n if (Array.isArray(url)) {\n return Promise.all(url.map((u) => {\n return importScript(u, atts);\n }));\n }\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n const script = document.createElement('script');\n /**\n *\n * @returns {void}\n */\n function scriptOnError () {\n reject(new Error(`Failed to import: ${url}`));\n destructor();\n }\n /**\n *\n * @returns {void}\n */\n function scriptOnLoad () {\n resolve();\n destructor();\n }\n const destructor = () => {\n script.removeEventListener('error', scriptOnError);\n script.removeEventListener('load', scriptOnLoad);\n script.remove();\n script.src = '';\n };\n script.defer = 'defer';\n addScriptAtts(script, atts);\n script.addEventListener('error', scriptOnError);\n script.addEventListener('load', scriptOnLoad);\n script.src = url;\n\n document.head.append(script);\n });\n}\n\n/**\n*\n* @param {string|string[]} url\n* @param {PlainObject} [atts={}]\n* @param {PlainObject} opts\n* @param {boolean} [opts.returnDefault=false} = {}]\n* @returns {Promise} Resolves to value of loading module or rejects with\n* `Error` upon a script loading error.\n*/\nexport function importModule (url, atts = {}, {returnDefault = false} = {}) {\n if (Array.isArray(url)) {\n return Promise.all(url.map((u) => {\n return importModule(u, atts);\n }));\n }\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n const vector = '$importModule$' + Math.random().toString(32).slice(2);\n const script = document.createElement('script');\n /**\n *\n * @returns {void}\n */\n function scriptOnError () {\n reject(new Error(`Failed to import: ${url}`));\n destructor();\n }\n /**\n *\n * @returns {void}\n */\n function scriptOnLoad () {\n resolve(window[vector]);\n destructor();\n }\n const destructor = () => {\n delete window[vector];\n script.removeEventListener('error', scriptOnError);\n script.removeEventListener('load', scriptOnLoad);\n script.remove();\n URL.revokeObjectURL(script.src);\n script.src = '';\n };\n addScriptAtts(script, atts);\n script.defer = 'defer';\n script.type = 'module';\n script.addEventListener('error', scriptOnError);\n script.addEventListener('load', scriptOnLoad);\n const absURL = toAbsoluteURL(url);\n const loader = `import * as m from '${absURL.replace(/'/g, \"\\\\'\")}'; window.${vector} = ${returnDefault ? 'm.default || ' : ''}m;`; // export Module\n const blob = new Blob([loader], {type: 'text/javascript'});\n script.src = URL.createObjectURL(blob);\n\n document.head.append(script);\n });\n}\n\nexport default importModule;\n","/**\n * Created by alexey2baranov on 28.01.17.\n */\n/*\n An extraction of the deparam method from Ben Alman's jQuery BBQ\n http://benalman.com/projects/jquery-bbq-plugin/\n */\n\nconst coerce_types = {'true': !0, 'false': !1, 'null': null};\n\nfunction deparam (params, coerce) {\n // console.log(params)\n const obj = {};\n\n // Iterate over all name=value pairs.\n params.replace(/\\+/g, ' ').split('&').forEach(function (v) {\n const param = v.split('=');\n\n let\n key = decodeURIComponent(param[0]),\n // If key is more complex than 'foo', like 'a[]' or 'a[b][c]', split it\n // into its component parts.\n keys = key.split(']['),\n keys_last = keys.length - 1;\n\n // If the first keys part contains [ and the last ends with ], then []\n // are correctly balanced.\n if (/\\[/.test(keys[0]) && /\\]$/.test(keys[keys_last])) {\n // Remove the trailing ] from the last keys part.\n keys[keys_last] = keys[keys_last].replace(/\\]$/, '');\n\n // Split first keys part into two parts on the [ and add them back onto\n // the beginning of the keys array.\n keys = keys.shift().split('[').concat(keys);\n\n keys_last = keys.length - 1;\n } else {\n // Basic 'foo' style key.\n keys_last = 0;\n }\n\n // Are we dealing with a name=value pair, or just a name?\n if (param.length >= 2) {\n let val = decodeURIComponent(param.slice(1).join('='));\n\n // Coerce values.\n if (coerce) {\n val = val && !isNaN(val) ? +val // number\n : val === 'undefined' ? undefined // undefined\n : coerce_types[val] !== undefined ? coerce_types[val] // true, false, null\n : val; // string\n }\n\n if (keys_last) {\n let cur = obj;\n // Complex key, build deep object structure based on a few rules:\n // * The 'cur' pointer starts at the object top-level.\n // * [] = array push (n is set to array length), [n] = array if n is\n // numeric, otherwise object.\n // * If at the last keys part, set the value.\n // * For each keys part, if the current level is undefined create an\n // object or array based on the type of the next keys part.\n // * Move the 'cur' pointer to the next level.\n // * Rinse & repeat.\n for (let i = 0; i <= keys_last; i++) {\n key = keys[i] === '' ? cur.length : keys[i];\n cur = cur[key] = i < keys_last\n ? cur[key] || (keys[i + 1] && isNaN(keys[i + 1]) ? {} : [])\n : val;\n }\n\n } else {\n // Simple key, even simpler rules, since only scalars and shallow\n // arrays are allowed.\n\n if (Array.isArray(obj[key])) {\n // val is already an array, so push on the next value.\n obj[key].push(val);\n\n } else if (obj[key] !== undefined) {\n // val isn't an array, but since a second value has been specified,\n // convert val into an array.\n obj[key] = [obj[key], val];\n\n } else {\n // val is a scalar.\n obj[key] = val;\n }\n }\n\n } else if (key) {\n // No value was defined, so set something meaningful.\n obj[key] = coerce\n ? undefined\n : '';\n }\n });\n\n return obj;\n}\n\nexport default deparam;\n","/**\n * @module jQueryPluginDBox\n */\n/**\n* @param {external:jQuery} $\n* @param {PlainObject} [strings]\n* @param {PlainObject} [strings.ok]\n* @param {PlainObject} [strings.cancel]\n* @returns {external:jQuery}\n*/\nexport default function jQueryPluginDBox ($, {\n ok: okString = 'Ok',\n cancel: cancelString = 'Cancel'\n} = {}) {\n // This sets up alternative dialog boxes. They mostly work the same way as\n // their UI counterparts, expect instead of returning the result, a callback\n // needs to be included that returns the result as its first parameter.\n // In the future we may want to add additional types of dialog boxes, since\n // they should be easy to handle this way.\n $('#dialog_container').draggable({\n cancel: '#dialog_content, #dialog_buttons *',\n containment: 'window'\n }).css('position', 'absolute');\n\n const box = $('#dialog_box'),\n btnHolder = $('#dialog_buttons'),\n dialogContent = $('#dialog_content');\n\n /**\n * @typedef {PlainObject} module:jQueryPluginDBox.PromiseResultObject\n * @property {string|true} response\n * @property {boolean} checked\n */\n\n /**\n * Resolves to `false` (if cancelled), for prompts and selects\n * without checkboxes, it resolves to the value of the form control. For other\n * types without checkboxes, it resolves to `true`. For checkboxes, it resolves\n * to an object with the `response` key containing the same value as the previous\n * mentioned (string or `true`) and a `checked` (boolean) property.\n * @typedef {Promise} module:jQueryPluginDBox.ResultPromise\n */\n /**\n * @typedef {PlainObject} module:jQueryPluginDBox.SelectOption\n * @property {string} text\n * @property {string} value\n */\n /**\n * @typedef {PlainObject} module:jQueryPluginDBox.CheckboxInfo\n * @property {string} label Label for the checkbox\n * @property {string} value Value of the checkbox\n * @property {string} tooltip Tooltip on the checkbox label\n * @property {boolean} checked Whether the checkbox is checked by default\n */\n /**\n * Triggered upon a change of value for the select pull-down.\n * @callback module:jQueryPluginDBox.SelectChangeListener\n * @returns {void}\n */\n /**\n * Creates a dialog of the specified type with a given message\n * and any defaults and type-specific metadata. Returns a `Promise`\n * which resolves differently depending on whether the dialog\n * was cancelled or okayed (with the response and any checked state).\n * @param {\"alert\"|\"prompt\"|\"select\"|\"process\"} type\n * @param {string} msg\n * @param {string} [defaultVal]\n * @param {module:jQueryPluginDBox.SelectOption[]} [opts]\n * @param {module:jQueryPluginDBox.SelectChangeListener} [changeListener]\n * @param {module:jQueryPluginDBox.CheckboxInfo} [checkbox]\n * @returns {jQueryPluginDBox.ResultPromise}\n */\n function dbox (type, msg, defaultVal, opts, changeListener, checkbox) {\n dialogContent.html('' + msg.replace(/\\n/g, '
') + '
')\n .toggleClass('prompt', (type === 'prompt'));\n btnHolder.empty();\n\n const ok = $(' ').appendTo(btnHolder);\n\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n if (type !== 'alert') {\n $(' ')\n .appendTo(btnHolder)\n .click(function () {\n box.hide();\n resolve(false);\n });\n }\n\n let ctrl, chkbx;\n if (type === 'prompt') {\n ctrl = $(' ').prependTo(btnHolder);\n ctrl.val(defaultVal || '');\n ctrl.bind('keydown', 'return', function () { ok.click(); });\n } else if (type === 'select') {\n const div = $('');\n ctrl = $(`
`).appendTo(div);\n if (checkbox) {\n const label = $('').text(checkbox.label);\n chkbx = $(' ').appendTo(label);\n chkbx.val(checkbox.value);\n if (checkbox.tooltip) {\n label.attr('title', checkbox.tooltip);\n }\n chkbx.prop('checked', Boolean(checkbox.checked));\n div.append($('').append(label));\n }\n $.each(opts || [], function (opt, val) {\n if (typeof val === 'object') {\n ctrl.append($('
').val(val.value).html(val.text));\n } else {\n ctrl.append($(' ').html(val));\n }\n });\n dialogContent.append(div);\n if (defaultVal) {\n ctrl.val(defaultVal);\n }\n if (changeListener) {\n ctrl.bind('change', 'return', changeListener);\n }\n ctrl.bind('keydown', 'return', function () { ok.click(); });\n } else if (type === 'process') {\n ok.hide();\n }\n\n box.show();\n\n ok.click(function () {\n box.hide();\n const response = (type === 'prompt' || type === 'select') ? ctrl.val() : true;\n if (chkbx) {\n resolve({response, checked: chkbx.prop('checked')});\n return;\n }\n resolve(response);\n }).focus();\n\n if (type === 'prompt' || type === 'select') {\n ctrl.focus();\n }\n });\n }\n\n /**\n * @param {string} msg Message to alert\n * @returns {jQueryPluginDBox.ResultPromise}\n */\n $.alert = function (msg) {\n return dbox('alert', msg);\n };\n /**\n * @param {string} msg Message for which to ask confirmation\n * @returns {jQueryPluginDBox.ResultPromise}\n */\n $.confirm = function (msg) {\n return dbox('confirm', msg);\n };\n /**\n * @param {string} msg Message to indicate upon cancelable indicator\n * @returns {jQueryPluginDBox.ResultPromise}\n */\n $.process_cancel = function (msg) {\n return dbox('process', msg);\n };\n /**\n * @param {string} msg Message to accompany the prompt\n * @param {string} [defaultText=''] The default text to show for the prompt\n * @returns {jQueryPluginDBox.ResultPromise}\n */\n $.prompt = function (msg, defaultText = '') {\n return dbox('prompt', msg, defaultText);\n };\n $.select = function (msg, opts, changeListener, txt, checkbox) {\n return dbox('select', msg, txt, opts, changeListener, checkbox);\n };\n return $;\n}\n","/* eslint-disable no-console */\n/**\n * For command history tracking and undo functionality.\n * @module history\n * @license MIT\n * @copyright 2010 Jeff Schiller\n */\n\nimport {getHref, setHref, getRotationAngle, isNullish} from '../common/utilities.js';\nimport {removeElementFromListMap} from '../common/svgtransformlist.js';\n\n/**\n* Group: Undo/Redo history management.\n*/\nexport const HistoryEventTypes = {\n BEFORE_APPLY: 'before_apply',\n AFTER_APPLY: 'after_apply',\n BEFORE_UNAPPLY: 'before_unapply',\n AFTER_UNAPPLY: 'after_unapply'\n};\n\n/**\n* Base class for commands.\n*/\nclass Command {\n /**\n * @returns {string}\n */\n getText () {\n return this.text;\n }\n /**\n * @param {module:history.HistoryEventHandler} handler\n * @param {callback} applyFunction\n * @returns {void}\n */\n apply (handler, applyFunction) {\n handler && handler.handleHistoryEvent(HistoryEventTypes.BEFORE_APPLY, this);\n applyFunction(handler);\n handler && handler.handleHistoryEvent(HistoryEventTypes.AFTER_APPLY, this);\n }\n\n /**\n * @param {module:history.HistoryEventHandler} handler\n * @param {callback} unapplyFunction\n * @returns {void}\n */\n unapply (handler, unapplyFunction) {\n handler && handler.handleHistoryEvent(HistoryEventTypes.BEFORE_UNAPPLY, this);\n unapplyFunction();\n handler && handler.handleHistoryEvent(HistoryEventTypes.AFTER_UNAPPLY, this);\n }\n\n /**\n * @returns {Element[]} Array with element associated with this command\n * This function needs to be surcharged if multiple elements are returned.\n */\n elements () {\n return [this.elem];\n }\n\n /**\n * @returns {string} String with element associated with this command\n */\n type () {\n return this.constructor.name;\n }\n}\n\n// Todo: Figure out why the interface members aren't showing\n// up (with or without modules applied), despite our apparently following\n// http://usejsdoc.org/tags-interface.html#virtual-comments\n\n/**\n * An interface that all command objects must implement.\n * @interface module:history.HistoryCommand\n*/\n/**\n * Applies.\n *\n * @function module:history.HistoryCommand#apply\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void|true}\n */\n/**\n *\n * Unapplies.\n * @function module:history.HistoryCommand#unapply\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void|true}\n */\n/**\n * Returns the elements.\n * @function module:history.HistoryCommand#elements\n * @returns {Element[]}\n */\n/**\n * Gets the text.\n * @function module:history.HistoryCommand#getText\n * @returns {string}\n */\n/**\n * Gives the type.\n * @function module:history.HistoryCommand.type\n * @returns {string}\n */\n\n/**\n * @event module:history~Command#event:history\n * @type {module:history.HistoryCommand}\n */\n\n/**\n * An interface for objects that will handle history events.\n * @interface module:history.HistoryEventHandler\n */\n/**\n *\n * @function module:history.HistoryEventHandler#handleHistoryEvent\n * @param {string} eventType One of the HistoryEvent types\n * @param {module:history~Command#event:history} command\n * @listens module:history~Command#event:history\n * @returns {void}\n *\n */\n\n/**\n * History command for an element that had its DOM position changed.\n * @implements {module:history.HistoryCommand}\n*/\nexport class MoveElementCommand extends Command {\n /**\n * @param {Element} elem - The DOM element that was moved\n * @param {Element} oldNextSibling - The element's next sibling before it was moved\n * @param {Element} oldParent - The element's parent before it was moved\n * @param {string} [text] - An optional string visible to user related to this change\n */\n constructor (elem, oldNextSibling, oldParent, text) {\n super();\n this.elem = elem;\n this.text = text ? ('Move ' + elem.tagName + ' to ' + text) : ('Move ' + elem.tagName);\n this.oldNextSibling = oldNextSibling;\n this.oldParent = oldParent;\n this.newNextSibling = elem.nextSibling;\n this.newParent = elem.parentNode;\n }\n\n /**\n * Re-positions the element.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n apply (handler) {\n super.apply(handler, () => {\n this.elem = this.newParent.insertBefore(this.elem, this.newNextSibling);\n });\n }\n\n /**\n * Positions the element back to its original location.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n unapply (handler) {\n super.unapply(handler, () => {\n this.elem = this.oldParent.insertBefore(this.elem, this.oldNextSibling);\n });\n }\n}\n\n/**\n* History command for an element that was added to the DOM.\n* @implements {module:history.HistoryCommand}\n*/\nexport class InsertElementCommand extends Command {\n /**\n * @param {Element} elem - The newly added DOM element\n * @param {string} text - An optional string visible to user related to this change\n */\n constructor (elem, text) {\n super();\n this.elem = elem;\n this.text = text || ('Create ' + elem.tagName);\n this.parent = elem.parentNode;\n this.nextSibling = this.elem.nextSibling;\n }\n\n /**\n * Re-inserts the new element.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n apply (handler) {\n super.apply(handler, () => {\n this.elem = this.parent.insertBefore(this.elem, this.nextSibling);\n });\n }\n\n /**\n * Removes the element.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n unapply (handler) {\n super.unapply(handler, () => {\n this.parent = this.elem.parentNode;\n this.elem.remove();\n });\n }\n}\n\n/**\n* History command for an element removed from the DOM.\n* @implements {module:history.HistoryCommand}\n*/\nexport class RemoveElementCommand extends Command {\n /**\n * @param {Element} elem - The removed DOM element\n * @param {Node} oldNextSibling - The DOM element's nextSibling when it was in the DOM\n * @param {Element} oldParent - The DOM element's parent\n * @param {string} [text] - An optional string visible to user related to this change\n */\n constructor (elem, oldNextSibling, oldParent, text) {\n super();\n this.elem = elem;\n this.text = text || ('Delete ' + elem.tagName);\n this.nextSibling = oldNextSibling;\n this.parent = oldParent;\n\n // special hack for webkit: remove this element's entry in the svgTransformLists map\n removeElementFromListMap(elem);\n }\n\n /**\n * Re-removes the new element.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n apply (handler) {\n super.apply(handler, () => {\n removeElementFromListMap(this.elem);\n this.parent = this.elem.parentNode;\n this.elem.remove();\n });\n }\n\n /**\n * Re-adds the new element.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n unapply (handler) {\n super.unapply(handler, () => {\n removeElementFromListMap(this.elem);\n if (isNullish(this.nextSibling)) {\n if (window.console) {\n console.error('Reference element was lost');\n }\n }\n this.parent.insertBefore(this.elem, this.nextSibling); // Don't use `before` or `prepend` as `this.nextSibling` may be `null`\n });\n }\n}\n\n/**\n* @typedef {\"#text\"|\"#href\"|string} module:history.CommandAttributeName\n*/\n/**\n* @typedef {PlainObject} module:history.CommandAttributes\n*/\n\n/**\n* History command to make a change to an element.\n* Usually an attribute change, but can also be textcontent.\n* @implements {module:history.HistoryCommand}\n*/\nexport class ChangeElementCommand extends Command {\n /**\n * @param {Element} elem - The DOM element that was changed\n * @param {module:history.CommandAttributes} attrs - Attributes to be changed with the values they had *before* the change\n * @param {string} text - An optional string visible to user related to this change\n */\n constructor (elem, attrs, text) {\n super();\n this.elem = elem;\n this.text = text ? ('Change ' + elem.tagName + ' ' + text) : ('Change ' + elem.tagName);\n this.newValues = {};\n this.oldValues = attrs;\n for (const attr in attrs) {\n if (attr === '#text') {\n this.newValues[attr] = elem.textContent;\n } else if (attr === '#href') {\n this.newValues[attr] = getHref(elem);\n } else {\n this.newValues[attr] = elem.getAttribute(attr);\n }\n }\n }\n\n /**\n * Performs the stored change action.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n apply (handler) {\n super.apply(handler, () => {\n let bChangedTransform = false;\n Object.entries(this.newValues).forEach(([attr, value]) => {\n if (value) {\n if (attr === '#text') {\n this.elem.textContent = value;\n } else if (attr === '#href') {\n setHref(this.elem, value);\n } else {\n this.elem.setAttribute(attr, value);\n }\n } else if (attr === '#text') {\n this.elem.textContent = '';\n } else {\n this.elem.setAttribute(attr, '');\n this.elem.removeAttribute(attr);\n }\n\n if (attr === 'transform') { bChangedTransform = true; }\n });\n\n // relocate rotational transform, if necessary\n if (!bChangedTransform) {\n const angle = getRotationAngle(this.elem);\n if (angle) {\n const bbox = this.elem.getBBox();\n const cx = bbox.x + bbox.width / 2;\n const cy = bbox.y + bbox.height / 2;\n const rotate = ['rotate(', angle, ' ', cx, ',', cy, ')'].join('');\n if (rotate !== this.elem.getAttribute('transform')) {\n this.elem.setAttribute('transform', rotate);\n }\n }\n }\n });\n }\n\n /**\n * Reverses the stored change action.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n unapply (handler) {\n super.unapply(handler, () => {\n let bChangedTransform = false;\n Object.entries(this.oldValues).forEach(([attr, value]) => {\n if (value) {\n if (attr === '#text') {\n this.elem.textContent = value;\n } else if (attr === '#href') {\n setHref(this.elem, value);\n } else {\n this.elem.setAttribute(attr, value);\n }\n } else if (attr === '#text') {\n this.elem.textContent = '';\n } else {\n this.elem.removeAttribute(attr);\n }\n if (attr === 'transform') { bChangedTransform = true; }\n });\n // relocate rotational transform, if necessary\n if (!bChangedTransform) {\n const angle = getRotationAngle(this.elem);\n if (angle) {\n const bbox = this.elem.getBBox();\n const cx = bbox.x + bbox.width / 2,\n cy = bbox.y + bbox.height / 2;\n const rotate = ['rotate(', angle, ' ', cx, ',', cy, ')'].join('');\n if (rotate !== this.elem.getAttribute('transform')) {\n this.elem.setAttribute('transform', rotate);\n }\n }\n }\n // Remove transformlist to prevent confusion that causes bugs like 575.\n removeElementFromListMap(this.elem);\n });\n }\n}\n\n// TODO: create a 'typing' command object that tracks changes in text\n// if a new Typing command is created and the top command on the stack is also a Typing\n// and they both affect the same element, then collapse the two commands into one\n\n/**\n* History command that can contain/execute multiple other commands.\n* @implements {module:history.HistoryCommand}\n*/\nexport class BatchCommand extends Command {\n /**\n * @param {string} [text] - An optional string visible to user related to this change\n */\n constructor (text) {\n super();\n this.text = text || 'Batch Command';\n this.stack = [];\n }\n\n /**\n * Runs \"apply\" on all subcommands.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n apply (handler) {\n super.apply(handler, () => {\n this.stack.forEach((stackItem) => {\n console.assert(stackItem, 'stack item should not be null');\n stackItem && stackItem.apply(handler);\n });\n });\n }\n\n /**\n * Runs \"unapply\" on all subcommands.\n * @param {module:history.HistoryEventHandler} handler\n * @fires module:history~Command#event:history\n * @returns {void}\n */\n unapply (handler) {\n super.unapply(handler, () => {\n this.stack.forEach((stackItem) => {\n console.assert(stackItem, 'stack item should not be null');\n stackItem && stackItem.unapply(handler);\n });\n });\n }\n\n /**\n * Iterate through all our subcommands.\n * @returns {Element[]} All the elements we are changing\n */\n elements () {\n const elems = [];\n let cmd = this.stack.length;\n while (cmd--) {\n if (!this.stack[cmd]) continue;\n const thisElems = this.stack[cmd].elements();\n let elem = thisElems.length;\n while (elem--) {\n if (!elems.includes(thisElems[elem])) { elems.push(thisElems[elem]); }\n }\n }\n return elems;\n }\n\n /**\n * Adds a given command to the history stack.\n * @param {Command} cmd - The undo command object to add\n * @returns {void}\n */\n addSubCommand (cmd) {\n console.assert(cmd !== null, 'cmd should not be null');\n this.stack.push(cmd);\n }\n\n /**\n * @returns {boolean} Indicates whether or not the batch command is empty\n */\n isEmpty () {\n return !this.stack.length;\n }\n}\n\n/**\n*\n*/\nexport class UndoManager {\n /**\n * @param {module:history.HistoryEventHandler} historyEventHandler\n */\n constructor (historyEventHandler) {\n this.handler_ = historyEventHandler || null;\n this.undoStackPointer = 0;\n this.undoStack = [];\n\n // this is the stack that stores the original values, the elements and\n // the attribute name for begin/finish\n this.undoChangeStackPointer = -1;\n this.undoableChangeStack = [];\n }\n\n /**\n * Resets the undo stack, effectively clearing the undo/redo history.\n * @returns {void}\n */\n resetUndoStack () {\n this.undoStack = [];\n this.undoStackPointer = 0;\n }\n\n /**\n * @returns {Integer} Current size of the undo history stack\n */\n getUndoStackSize () {\n return this.undoStackPointer;\n }\n\n /**\n * @returns {Integer} Current size of the redo history stack\n */\n getRedoStackSize () {\n return this.undoStack.length - this.undoStackPointer;\n }\n\n /**\n * @returns {string} String associated with the next undo command\n */\n getNextUndoCommandText () {\n return this.undoStackPointer > 0 ? this.undoStack[this.undoStackPointer - 1].getText() : '';\n }\n\n /**\n * @returns {string} String associated with the next redo command\n */\n getNextRedoCommandText () {\n return this.undoStackPointer < this.undoStack.length ? this.undoStack[this.undoStackPointer].getText() : '';\n }\n\n /**\n * Performs an undo step.\n * @returns {void}\n */\n undo () {\n if (this.undoStackPointer > 0) {\n const cmd = this.undoStack[--this.undoStackPointer];\n cmd.unapply(this.handler_);\n }\n }\n\n /**\n * Performs a redo step.\n * @returns {void}\n */\n redo () {\n if (this.undoStackPointer < this.undoStack.length && this.undoStack.length > 0) {\n const cmd = this.undoStack[this.undoStackPointer++];\n cmd.apply(this.handler_);\n }\n }\n\n /**\n * Adds a command object to the undo history stack.\n * @param {Command} cmd - The command object to add\n * @returns {void}\n */\n addCommandToHistory (cmd) {\n // TODO: we MUST compress consecutive text changes to the same element\n // (right now each keystroke is saved as a separate command that includes the\n // entire text contents of the text element)\n // TODO: consider limiting the history that we store here (need to do some slicing)\n\n // if our stack pointer is not at the end, then we have to remove\n // all commands after the pointer and insert the new command\n if (this.undoStackPointer < this.undoStack.length && this.undoStack.length > 0) {\n this.undoStack = this.undoStack.splice(0, this.undoStackPointer);\n }\n this.undoStack.push(cmd);\n this.undoStackPointer = this.undoStack.length;\n }\n\n /**\n * This function tells the canvas to remember the old values of the\n * `attrName` attribute for each element sent in. The elements and values\n * are stored on a stack, so the next call to `finishUndoableChange()` will\n * pop the elements and old values off the stack, gets the current values\n * from the DOM and uses all of these to construct the undo-able command.\n * @param {string} attrName - The name of the attribute being changed\n * @param {Element[]} elems - Array of DOM elements being changed\n * @returns {void}\n */\n beginUndoableChange (attrName, elems) {\n const p = ++this.undoChangeStackPointer;\n let i = elems.length;\n const oldValues = new Array(i), elements = new Array(i);\n while (i--) {\n const elem = elems[i];\n if (isNullish(elem)) { continue; }\n elements[i] = elem;\n oldValues[i] = elem.getAttribute(attrName);\n }\n this.undoableChangeStack[p] = {\n attrName,\n oldValues,\n elements\n };\n }\n\n /**\n * This function returns a `BatchCommand` object which summarizes the\n * change since `beginUndoableChange` was called. The command can then\n * be added to the command history.\n * @returns {BatchCommand} Batch command object with resulting changes\n */\n finishUndoableChange () {\n const p = this.undoChangeStackPointer--;\n const changeset = this.undoableChangeStack[p];\n const {attrName} = changeset;\n const batchCmd = new BatchCommand('Change ' + attrName);\n let i = changeset.elements.length;\n while (i--) {\n const elem = changeset.elements[i];\n if (isNullish(elem)) { continue; }\n const changes = {};\n changes[attrName] = changeset.oldValues[i];\n if (changes[attrName] !== elem.getAttribute(attrName)) {\n batchCmd.addSubCommand(new ChangeElementCommand(elem, changes, attrName));\n }\n }\n this.undoableChangeStack[p] = null;\n return batchCmd;\n }\n}\n","/* globals jQuery */\n/**\n * Path functionality.\n * @module path\n * @license MIT\n *\n * @copyright 2011 Alexis Deveria, 2011 Jeff Schiller\n */\n\nimport '../common/svgpathseg.js';\nimport {NS} from '../common/namespaces.js';\nimport {getTransformList} from '../common/svgtransformlist.js';\nimport {shortFloat} from '../common/units.js';\nimport {ChangeElementCommand, BatchCommand} from './history.js';\nimport {\n transformPoint, getMatrix, snapToAngle, rectsIntersect,\n transformListToTransform\n} from '../common/math.js';\nimport {\n assignAttributes, getElem, getRotationAngle, getBBox,\n getRefElem, findDefs, snapToGrid, isNullish,\n getBBox as utilsGetBBox\n} from '../common/utilities.js';\nimport {\n supportsPathInsertItemBefore, supportsPathReplaceItem, isWebkit\n} from '../common/browser.js';\n\nconst $ = jQuery;\n\nconst segData = {\n 2: ['x', 'y'], // PATHSEG_MOVETO_ABS\n 4: ['x', 'y'], // PATHSEG_LINETO_ABS\n 6: ['x', 'y', 'x1', 'y1', 'x2', 'y2'], // PATHSEG_CURVETO_CUBIC_ABS\n 8: ['x', 'y', 'x1', 'y1'], // PATHSEG_CURVETO_QUADRATIC_ABS\n 10: ['x', 'y', 'r1', 'r2', 'angle', 'largeArcFlag', 'sweepFlag'], // PATHSEG_ARC_ABS\n 12: ['x'], // PATHSEG_LINETO_HORIZONTAL_ABS\n 14: ['y'], // PATHSEG_LINETO_VERTICAL_ABS\n 16: ['x', 'y', 'x2', 'y2'], // PATHSEG_CURVETO_CUBIC_SMOOTH_ABS\n 18: ['x', 'y'] // PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS\n};\n\n/**\n * @tutorial LocaleDocs\n * @typedef {module:locale.LocaleStrings|PlainObject} module:path.uiStrings\n * @property {PlainObject} ui\n*/\n\nconst uiStrings = {};\n/**\n* @function module:path.setUiStrings\n* @param {module:path.uiStrings} strs\n* @returns {void}\n*/\nexport const setUiStrings = function (strs) {\n Object.assign(uiStrings, strs.ui);\n};\n\nlet pathFuncs = [];\n\nlet linkControlPts = true;\n\n// Stores references to paths via IDs.\n// TODO: Make this cross-document happy.\nlet pathData = {};\n\n/**\n* @function module:path.setLinkControlPoints\n* @param {boolean} lcp\n* @returns {void}\n*/\nexport const setLinkControlPoints = function (lcp) {\n linkControlPts = lcp;\n};\n\n/**\n * @name module:path.path\n * @type {null|module:path.Path}\n * @memberof module:path\n*/\nexport let path = null; // eslint-disable-line import/no-mutable-exports\n\nlet editorContext_ = null;\n\n/**\n* @external MouseEvent\n*/\n\n/**\n* Object with the following keys/values.\n* @typedef {PlainObject} module:path.SVGElementJSON\n* @property {string} element - Tag name of the SVG element to create\n* @property {PlainObject} attr - Has key-value attributes to assign to the new element. An `id` should be set so that {@link module:utilities.EditorContext#addSVGElementFromJson} can later re-identify the element for modification or replacement.\n* @property {boolean} [curStyles=false] - Indicates whether current style attributes should be applied first\n* @property {module:path.SVGElementJSON[]} [children] - Data objects to be added recursively as children\n* @property {string} [namespace=\"http://www.w3.org/2000/svg\"] - Indicate a (non-SVG) namespace\n*/\n/**\n * @interface module:path.EditorContext\n * @property {module:select.SelectorManager} selectorManager\n * @property {module:svgcanvas.SvgCanvas} canvas\n */\n/**\n * @function module:path.EditorContext#call\n * @param {\"selected\"|\"changed\"} ev - String with the event name\n * @param {module:svgcanvas.SvgCanvas#event:selected|module:svgcanvas.SvgCanvas#event:changed} arg - Argument to pass through to the callback function. If the event is \"changed\", an array of `Element`s is passed; if \"selected\", a single-item array of `Element` is passed.\n * @returns {void}\n */\n/**\n * @function module:path.EditorContext#resetD\n * @param {SVGPathElement} p\n * @returns {void}\n*/\n/**\n * Note: This doesn't round to an integer necessarily.\n * @function module:path.EditorContext#round\n * @param {Float} val\n * @returns {Float} Rounded value to nearest value based on `currentZoom`\n */\n/**\n * @function module:path.EditorContext#clearSelection\n * @param {boolean} [noCall] - When `true`, does not call the \"selected\" handler\n * @returns {void}\n*/\n/**\n * @function module:path.EditorContext#addToSelection\n * @param {Element[]} elemsToAdd - An array of DOM elements to add to the selection\n * @param {boolean} showGrips - Indicates whether the resize grips should be shown\n * @returns {void}\n*/\n/**\n * @function module:path.EditorContext#addCommandToHistory\n * @param {Command} cmd\n * @returns {void}\n */\n/**\n * @function module:path.EditorContext#remapElement\n * @param {Element} selected - DOM element to be changed\n * @param {PlainObject} changes - Object with changes to be remapped\n * @param {SVGMatrix} m - Matrix object to use for remapping coordinates\n * @returns {void}\n */\n/**\n * @function module:path.EditorContext#addSVGElementFromJson\n * @param {module:path.SVGElementJSON} data\n * @returns {Element} The new element\n*/\n/**\n * @function module:path.EditorContext#getGridSnapping\n * @returns {boolean}\n */\n/**\n * @function module:path.EditorContext#getOpacity\n * @returns {Float}\n */\n/**\n * @function module:path.EditorContext#getSelectedElements\n * @returns {Element[]} the array with selected DOM elements\n*/\n/**\n * @function module:path.EditorContext#getContainer\n * @returns {Element}\n */\n/**\n * @function module:path.EditorContext#setStarted\n * @param {boolean} s\n * @returns {void}\n */\n/**\n * @function module:path.EditorContext#getRubberBox\n * @returns {SVGRectElement}\n*/\n/**\n * @function module:path.EditorContext#setRubberBox\n * @param {SVGRectElement} rb\n * @returns {SVGRectElement} Same as parameter passed in\n */\n/**\n * @function module:path.EditorContext#addPtsToSelection\n * @param {PlainObject} cfg\n * @param {boolean} cfg.closedSubpath\n * @param {SVGCircleElement[]} cfg.grips\n * @returns {void}\n */\n/**\n * @function module:path.EditorContext#endChanges\n * @param {PlainObject} cfg\n * @param {string} cfg.cmd\n * @param {Element} cfg.elem\n * @returns {void}\n*/\n/**\n * @function module:path.EditorContext#getCurrentZoom\n * @returns {Float} The current zoom level\n */\n/**\n * Returns the last created DOM element ID string.\n * @function module:path.EditorContext#getId\n * @returns {string}\n */\n/**\n * Creates and returns a unique ID string for a DOM element.\n * @function module:path.EditorContext#getNextId\n * @returns {string}\n*/\n/**\n * Gets the desired element from a mouse event.\n * @function module:path.EditorContext#getMouseTarget\n * @param {external:MouseEvent} evt - Event object from the mouse event\n * @returns {Element} DOM element we want\n */\n/**\n * @function module:path.EditorContext#getCurrentMode\n * @returns {string}\n */\n/**\n * @function module:path.EditorContext#setCurrentMode\n * @param {string} cm The mode\n * @returns {string} The same mode as passed in\n*/\n/**\n * @function module:path.EditorContext#getDrawnPath\n * @returns {SVGPathElement|null}\n */\n/**\n * @function module:path.EditorContext#setDrawnPath\n * @param {SVGPathElement|null} dp\n * @returns {SVGPathElement|null} The same value as passed in\n */\n/**\n * @function module:path.EditorContext#getSVGRoot\n * @returns {SVGSVGElement}\n*/\n\n/**\n* @function module:path.init\n* @param {module:path.EditorContext} editorContext\n* @returns {void}\n*/\nexport const init = function (editorContext) {\n editorContext_ = editorContext;\n\n pathFuncs = [0, 'ClosePath'];\n const pathFuncsStrs = [\n 'Moveto', 'Lineto', 'CurvetoCubic', 'CurvetoQuadratic', 'Arc',\n 'LinetoHorizontal', 'LinetoVertical', 'CurvetoCubicSmooth', 'CurvetoQuadraticSmooth'\n ];\n $.each(pathFuncsStrs, function (i, s) {\n pathFuncs.push(s + 'Abs');\n pathFuncs.push(s + 'Rel');\n });\n};\n\n/**\n* @function module:path.insertItemBefore\n* @param {Element} elem\n* @param {Segment} newseg\n* @param {Integer} index\n* @returns {void}\n*/\nexport const insertItemBefore = function (elem, newseg, index) {\n // Support insertItemBefore on paths for FF2\n const list = elem.pathSegList;\n\n if (supportsPathInsertItemBefore()) {\n list.insertItemBefore(newseg, index);\n return;\n }\n const len = list.numberOfItems;\n const arr = [];\n for (let i = 0; i < len; i++) {\n const curSeg = list.getItem(i);\n arr.push(curSeg);\n }\n list.clear();\n for (let i = 0; i < len; i++) {\n if (i === index) { // index + 1\n list.appendItem(newseg);\n }\n list.appendItem(arr[i]);\n }\n};\n\n/**\n* @function module:path.ptObjToArr\n* @todo See if this should just live in `replacePathSeg`\n* @param {string} type\n* @param {SVGPathSegMovetoAbs|SVGPathSegLinetoAbs|SVGPathSegCurvetoCubicAbs|SVGPathSegCurvetoQuadraticAbs|SVGPathSegArcAbs|SVGPathSegLinetoHorizontalAbs|SVGPathSegLinetoVerticalAbs|SVGPathSegCurvetoCubicSmoothAbs|SVGPathSegCurvetoQuadraticSmoothAbs} segItem\n* @returns {ArgumentsArray}\n*/\nexport const ptObjToArr = function (type, segItem) {\n const props = segData[type];\n return props.map((prop) => {\n return segItem[prop];\n });\n};\n\n/**\n* @function module:path.getGripPt\n* @param {Segment} seg\n* @param {module:math.XYObject} altPt\n* @returns {module:math.XYObject}\n*/\nexport const getGripPt = function (seg, altPt) {\n const {path: pth} = seg;\n let out = {\n x: altPt ? altPt.x : seg.item.x,\n y: altPt ? altPt.y : seg.item.y\n };\n\n if (pth.matrix) {\n const pt = transformPoint(out.x, out.y, pth.matrix);\n out = pt;\n }\n\n const currentZoom = editorContext_.getCurrentZoom();\n out.x *= currentZoom;\n out.y *= currentZoom;\n\n return out;\n};\n\n/**\n* @function module:path.getPointFromGrip\n* @param {module:math.XYObject} pt\n* @param {module:path.Path} pth\n* @returns {module:math.XYObject}\n*/\nexport const getPointFromGrip = function (pt, pth) {\n const out = {\n x: pt.x,\n y: pt.y\n };\n\n if (pth.matrix) {\n pt = transformPoint(out.x, out.y, pth.imatrix);\n out.x = pt.x;\n out.y = pt.y;\n }\n\n const currentZoom = editorContext_.getCurrentZoom();\n out.x /= currentZoom;\n out.y /= currentZoom;\n\n return out;\n};\n\n/**\n* Requires prior call to `setUiStrings` if `xlink:title`\n* to be set on the grip.\n* @function module:path.addPointGrip\n* @param {Integer} index\n* @param {Integer} x\n* @param {Integer} y\n* @returns {SVGCircleElement}\n*/\nexport const addPointGrip = function (index, x, y) {\n // create the container of all the point grips\n const pointGripContainer = getGripContainer();\n\n let pointGrip = getElem('pathpointgrip_' + index);\n // create it\n if (!pointGrip) {\n pointGrip = document.createElementNS(NS.SVG, 'circle');\n const atts = {\n id: 'pathpointgrip_' + index,\n display: 'none',\n r: 4,\n fill: '#0FF',\n stroke: '#00F',\n 'stroke-width': 2,\n cursor: 'move',\n style: 'pointer-events:all'\n };\n if ('pathNodeTooltip' in uiStrings) { // May be empty if running path.js without svg-editor\n atts['xlink:title'] = uiStrings.pathNodeTooltip;\n }\n assignAttributes(pointGrip, atts);\n pointGrip = pointGripContainer.appendChild(pointGrip);\n\n const grip = $('#pathpointgrip_' + index);\n grip.dblclick(function () {\n if (path) {\n path.setSegType();\n }\n });\n }\n if (x && y) {\n // set up the point grip element and display it\n assignAttributes(pointGrip, {\n cx: x,\n cy: y,\n display: 'inline'\n });\n }\n return pointGrip;\n};\n\n/**\n* @function module:path.getGripContainer\n* @returns {Element}\n*/\nexport const getGripContainer = function () {\n let c = getElem('pathpointgrip_container');\n if (!c) {\n const parentElement = getElem('selectorParentGroup');\n c = parentElement.appendChild(document.createElementNS(NS.SVG, 'g'));\n c.id = 'pathpointgrip_container';\n }\n return c;\n};\n\n/**\n* Requires prior call to `setUiStrings` if `xlink:title`\n* to be set on the grip.\n* @function module:path.addCtrlGrip\n* @param {string} id\n* @returns {SVGCircleElement}\n*/\nexport const addCtrlGrip = function (id) {\n let pointGrip = getElem('ctrlpointgrip_' + id);\n if (pointGrip) { return pointGrip; }\n\n pointGrip = document.createElementNS(NS.SVG, 'circle');\n const atts = {\n id: 'ctrlpointgrip_' + id,\n display: 'none',\n r: 4,\n fill: '#0FF',\n stroke: '#55F',\n 'stroke-width': 1,\n cursor: 'move',\n style: 'pointer-events:all'\n };\n if ('pathCtrlPtTooltip' in uiStrings) { // May be empty if running path.js without svg-editor\n atts['xlink:title'] = uiStrings.pathCtrlPtTooltip;\n }\n assignAttributes(pointGrip, atts);\n getGripContainer().append(pointGrip);\n return pointGrip;\n};\n\n/**\n* @function module:path.getCtrlLine\n* @param {string} id\n* @returns {SVGLineElement}\n*/\nexport const getCtrlLine = function (id) {\n let ctrlLine = getElem('ctrlLine_' + id);\n if (ctrlLine) { return ctrlLine; }\n\n ctrlLine = document.createElementNS(NS.SVG, 'line');\n assignAttributes(ctrlLine, {\n id: 'ctrlLine_' + id,\n stroke: '#555',\n 'stroke-width': 1,\n style: 'pointer-events:none'\n });\n getGripContainer().append(ctrlLine);\n return ctrlLine;\n};\n\n/**\n* @function module:path.getPointGrip\n* @param {Segment} seg\n* @param {boolean} update\n* @returns {SVGCircleElement}\n*/\nexport const getPointGrip = function (seg, update) {\n const {index} = seg;\n const pointGrip = addPointGrip(index);\n\n if (update) {\n const pt = getGripPt(seg);\n assignAttributes(pointGrip, {\n cx: pt.x,\n cy: pt.y,\n display: 'inline'\n });\n }\n\n return pointGrip;\n};\n\n/**\n* @function module:path.getControlPoints\n* @param {Segment} seg\n* @returns {PlainObject}\n*/\nexport const getControlPoints = function (seg) {\n const {item, index} = seg;\n if (!('x1' in item) || !('x2' in item)) { return null; }\n const cpt = {};\n /* const pointGripContainer = */ getGripContainer();\n\n // Note that this is intentionally not seg.prev.item\n const prev = path.segs[index - 1].item;\n\n const segItems = [prev, item];\n\n for (let i = 1; i < 3; i++) {\n const id = index + 'c' + i;\n\n const ctrlLine = cpt['c' + i + '_line'] = getCtrlLine(id);\n\n const pt = getGripPt(seg, {x: item['x' + i], y: item['y' + i]});\n const gpt = getGripPt(seg, {x: segItems[i - 1].x, y: segItems[i - 1].y});\n\n assignAttributes(ctrlLine, {\n x1: pt.x,\n y1: pt.y,\n x2: gpt.x,\n y2: gpt.y,\n display: 'inline'\n });\n\n cpt['c' + i + '_line'] = ctrlLine;\n\n // create it\n const pointGrip = cpt['c' + i] = addCtrlGrip(id);\n\n assignAttributes(pointGrip, {\n cx: pt.x,\n cy: pt.y,\n display: 'inline'\n });\n cpt['c' + i] = pointGrip;\n }\n return cpt;\n};\n\n/**\n* This replaces the segment at the given index. Type is given as number.\n* @function module:path.replacePathSeg\n* @param {Integer} type Possible values set during {@link module:path.init}\n* @param {Integer} index\n* @param {ArgumentsArray} pts\n* @param {SVGPathElement} elem\n* @returns {void}\n*/\nexport const replacePathSeg = function (type, index, pts, elem) {\n const pth = elem || path.elem;\n\n const func = 'createSVGPathSeg' + pathFuncs[type];\n const seg = pth[func](...pts);\n\n if (supportsPathReplaceItem()) {\n pth.pathSegList.replaceItem(seg, index);\n } else {\n const segList = pth.pathSegList;\n const len = segList.numberOfItems;\n const arr = [];\n for (let i = 0; i < len; i++) {\n const curSeg = segList.getItem(i);\n arr.push(curSeg);\n }\n segList.clear();\n for (let i = 0; i < len; i++) {\n if (i === index) {\n segList.appendItem(seg);\n } else {\n segList.appendItem(arr[i]);\n }\n }\n }\n};\n\n/**\n* @function module:path.getSegSelector\n* @param {Segment} seg\n* @param {boolean} update\n* @returns {SVGPathElement}\n*/\nexport const getSegSelector = function (seg, update) {\n const {index} = seg;\n let segLine = getElem('segline_' + index);\n if (!segLine) {\n const pointGripContainer = getGripContainer();\n // create segline\n segLine = document.createElementNS(NS.SVG, 'path');\n assignAttributes(segLine, {\n id: 'segline_' + index,\n display: 'none',\n fill: 'none',\n stroke: '#0FF',\n 'stroke-width': 2,\n style: 'pointer-events:none',\n d: 'M0,0 0,0'\n });\n pointGripContainer.append(segLine);\n }\n\n if (update) {\n const {prev} = seg;\n if (!prev) {\n segLine.setAttribute('display', 'none');\n return segLine;\n }\n\n const pt = getGripPt(prev);\n // Set start point\n replacePathSeg(2, 0, [pt.x, pt.y], segLine);\n\n const pts = ptObjToArr(seg.type, seg.item); // , true);\n for (let i = 0; i < pts.length; i += 2) {\n const point = getGripPt(seg, {x: pts[i], y: pts[i + 1]});\n pts[i] = point.x;\n pts[i + 1] = point.y;\n }\n\n replacePathSeg(seg.type, 1, pts, segLine);\n }\n return segLine;\n};\n\n/**\n * @typedef {PlainObject} Point\n * @property {Integer} x The x value\n * @property {Integer} y The y value\n */\n\n/**\n* Takes three points and creates a smoother line based on them.\n* @function module:path.smoothControlPoints\n* @param {Point} ct1 - Object with x and y values (first control point)\n* @param {Point} ct2 - Object with x and y values (second control point)\n* @param {Point} pt - Object with x and y values (third point)\n* @returns {Point[]} Array of two \"smoothed\" point objects\n*/\nexport const smoothControlPoints = function (ct1, ct2, pt) {\n // each point must not be the origin\n const x1 = ct1.x - pt.x,\n y1 = ct1.y - pt.y,\n x2 = ct2.x - pt.x,\n y2 = ct2.y - pt.y;\n\n if ((x1 !== 0 || y1 !== 0) && (x2 !== 0 || y2 !== 0)) {\n const\n r1 = Math.sqrt(x1 * x1 + y1 * y1),\n r2 = Math.sqrt(x2 * x2 + y2 * y2),\n nct1 = editorContext_.getSVGRoot().createSVGPoint(),\n nct2 = editorContext_.getSVGRoot().createSVGPoint();\n let anglea = Math.atan2(y1, x1),\n angleb = Math.atan2(y2, x2);\n if (anglea < 0) { anglea += 2 * Math.PI; }\n if (angleb < 0) { angleb += 2 * Math.PI; }\n\n const angleBetween = Math.abs(anglea - angleb),\n angleDiff = Math.abs(Math.PI - angleBetween) / 2;\n\n let newAnglea, newAngleb;\n if (anglea - angleb > 0) {\n newAnglea = angleBetween < Math.PI ? (anglea + angleDiff) : (anglea - angleDiff);\n newAngleb = angleBetween < Math.PI ? (angleb - angleDiff) : (angleb + angleDiff);\n } else {\n newAnglea = angleBetween < Math.PI ? (anglea - angleDiff) : (anglea + angleDiff);\n newAngleb = angleBetween < Math.PI ? (angleb + angleDiff) : (angleb - angleDiff);\n }\n\n // rotate the points\n nct1.x = r1 * Math.cos(newAnglea) + pt.x;\n nct1.y = r1 * Math.sin(newAnglea) + pt.y;\n nct2.x = r2 * Math.cos(newAngleb) + pt.x;\n nct2.y = r2 * Math.sin(newAngleb) + pt.y;\n\n return [nct1, nct2];\n }\n return undefined;\n};\n\n/**\n*\n*/\nexport class Segment {\n /**\n * @param {Integer} index\n * @param {SVGPathSeg} item\n * @todo Is `item` be more constrained here?\n */\n constructor (index, item) {\n this.selected = false;\n this.index = index;\n this.item = item;\n this.type = item.pathSegType;\n\n this.ctrlpts = [];\n this.ptgrip = null;\n this.segsel = null;\n }\n\n /**\n * @param {boolean} y\n * @returns {void}\n */\n showCtrlPts (y) {\n for (const i in this.ctrlpts) {\n if ({}.hasOwnProperty.call(this.ctrlpts, i)) {\n this.ctrlpts[i].setAttribute('display', y ? 'inline' : 'none');\n }\n }\n }\n\n /**\n * @param {boolean} y\n * @returns {void}\n */\n selectCtrls (y) {\n $('#ctrlpointgrip_' + this.index + 'c1, #ctrlpointgrip_' + this.index + 'c2')\n .attr('fill', y ? '#0FF' : '#EEE');\n }\n\n /**\n * @param {boolean} y\n * @returns {void}\n */\n show (y) {\n if (this.ptgrip) {\n this.ptgrip.setAttribute('display', y ? 'inline' : 'none');\n this.segsel.setAttribute('display', y ? 'inline' : 'none');\n // Show/hide all control points if available\n this.showCtrlPts(y);\n }\n }\n\n /**\n * @param {boolean} y\n * @returns {void}\n */\n select (y) {\n if (this.ptgrip) {\n this.ptgrip.setAttribute('stroke', y ? '#0FF' : '#00F');\n this.segsel.setAttribute('display', y ? 'inline' : 'none');\n if (this.ctrlpts) {\n this.selectCtrls(y);\n }\n this.selected = y;\n }\n }\n\n /**\n * @returns {void}\n */\n addGrip () {\n this.ptgrip = getPointGrip(this, true);\n this.ctrlpts = getControlPoints(this); // , true);\n this.segsel = getSegSelector(this, true);\n }\n\n /**\n * @param {boolean} full\n * @returns {void}\n */\n update (full) {\n if (this.ptgrip) {\n const pt = getGripPt(this);\n assignAttributes(this.ptgrip, {\n cx: pt.x,\n cy: pt.y\n });\n\n getSegSelector(this, true);\n\n if (this.ctrlpts) {\n if (full) {\n this.item = path.elem.pathSegList.getItem(this.index);\n this.type = this.item.pathSegType;\n }\n getControlPoints(this);\n }\n // this.segsel.setAttribute('display', y ? 'inline' : 'none');\n }\n }\n\n /**\n * @param {Integer} dx\n * @param {Integer} dy\n * @returns {void}\n */\n move (dx, dy) {\n const {item} = this;\n\n const curPts = this.ctrlpts\n ? [\n item.x += dx, item.y += dy,\n item.x1, item.y1, item.x2 += dx, item.y2 += dy\n ]\n : [item.x += dx, item.y += dy];\n\n replacePathSeg(\n this.type,\n this.index,\n // type 10 means ARC\n this.type === 10 ? ptObjToArr(this.type, item) : curPts\n );\n\n if (this.next && this.next.ctrlpts) {\n const next = this.next.item;\n const nextPts = [\n next.x, next.y,\n next.x1 += dx, next.y1 += dy, next.x2, next.y2\n ];\n replacePathSeg(this.next.type, this.next.index, nextPts);\n }\n\n if (this.mate) {\n // The last point of a closed subpath has a 'mate',\n // which is the 'M' segment of the subpath\n const {item: itm} = this.mate;\n const pts = [itm.x += dx, itm.y += dy];\n replacePathSeg(this.mate.type, this.mate.index, pts);\n // Has no grip, so does not need 'updating'?\n }\n\n this.update(true);\n if (this.next) { this.next.update(true); }\n }\n\n /**\n * @param {Integer} num\n * @returns {void}\n */\n setLinked (num) {\n let seg, anum, pt;\n if (num === 2) {\n anum = 1;\n seg = this.next;\n if (!seg) { return; }\n pt = this.item;\n } else {\n anum = 2;\n seg = this.prev;\n if (!seg) { return; }\n pt = seg.item;\n }\n\n const {item} = seg;\n item['x' + anum] = pt.x + (pt.x - this.item['x' + num]);\n item['y' + anum] = pt.y + (pt.y - this.item['y' + num]);\n\n const pts = [\n item.x, item.y,\n item.x1, item.y1,\n item.x2, item.y2\n ];\n\n replacePathSeg(seg.type, seg.index, pts);\n seg.update(true);\n }\n\n /**\n * @param {Integer} num\n * @param {Integer} dx\n * @param {Integer} dy\n * @returns {void}\n */\n moveCtrl (num, dx, dy) {\n const {item} = this;\n item['x' + num] += dx;\n item['y' + num] += dy;\n\n const pts = [\n item.x, item.y,\n item.x1, item.y1, item.x2, item.y2\n ];\n\n replacePathSeg(this.type, this.index, pts);\n this.update(true);\n }\n\n /**\n * @param {Integer} newType Possible values set during {@link module:path.init}\n * @param {ArgumentsArray} pts\n * @returns {void}\n */\n setType (newType, pts) {\n replacePathSeg(newType, this.index, pts);\n this.type = newType;\n this.item = path.elem.pathSegList.getItem(this.index);\n this.showCtrlPts(newType === 6);\n this.ctrlpts = getControlPoints(this);\n this.update(true);\n }\n}\n\n/**\n*\n*/\nexport class Path {\n /**\n * @param {SVGPathElement} elem\n * @throws {Error} If constructed without a path element\n */\n constructor (elem) {\n if (!elem || elem.tagName !== 'path') {\n throw new Error('svgedit.path.Path constructed without a element');\n }\n\n this.elem = elem;\n this.segs = [];\n this.selected_pts = [];\n path = this; // eslint-disable-line consistent-this\n\n this.init();\n }\n\n /**\n * Reset path data.\n * @returns {module:path.Path}\n */\n init () {\n // Hide all grips, etc\n\n // fixed, needed to work on all found elements, not just first\n $(getGripContainer()).find('*').each(function () {\n $(this).attr('display', 'none');\n });\n\n const segList = this.elem.pathSegList;\n const len = segList.numberOfItems;\n this.segs = [];\n this.selected_pts = [];\n this.first_seg = null;\n\n // Set up segs array\n for (let i = 0; i < len; i++) {\n const item = segList.getItem(i);\n const segment = new Segment(i, item);\n segment.path = this;\n this.segs.push(segment);\n }\n\n const {segs} = this;\n\n let startI = null;\n for (let i = 0; i < len; i++) {\n const seg = segs[i];\n const nextSeg = (i + 1) >= len ? null : segs[i + 1];\n const prevSeg = (i - 1) < 0 ? null : segs[i - 1];\n if (seg.type === 2) {\n if (prevSeg && prevSeg.type !== 1) {\n // New sub-path, last one is open,\n // so add a grip to last sub-path's first point\n const startSeg = segs[startI];\n startSeg.next = segs[startI + 1];\n startSeg.next.prev = startSeg;\n startSeg.addGrip();\n }\n // Remember that this is a starter seg\n startI = i;\n } else if (nextSeg && nextSeg.type === 1) {\n // This is the last real segment of a closed sub-path\n // Next is first seg after \"M\"\n seg.next = segs[startI + 1];\n\n // First seg after \"M\"'s prev is this\n seg.next.prev = seg;\n seg.mate = segs[startI];\n seg.addGrip();\n if (isNullish(this.first_seg)) {\n this.first_seg = seg;\n }\n } else if (!nextSeg) {\n if (seg.type !== 1) {\n // Last seg, doesn't close so add a grip\n // to last sub-path's first point\n const startSeg = segs[startI];\n startSeg.next = segs[startI + 1];\n startSeg.next.prev = startSeg;\n startSeg.addGrip();\n seg.addGrip();\n\n if (!this.first_seg) {\n // Open path, so set first as real first and add grip\n this.first_seg = segs[startI];\n }\n }\n } else if (seg.type !== 1) {\n // Regular segment, so add grip and its \"next\"\n seg.addGrip();\n\n // Don't set its \"next\" if it's an \"M\"\n if (nextSeg && nextSeg.type !== 2) {\n seg.next = nextSeg;\n seg.next.prev = seg;\n }\n }\n }\n return this;\n }\n\n /**\n * @callback module:path.PathEachSegCallback\n * @this module:path.Segment\n * @param {Integer} i The index of the seg being iterated\n * @returns {boolean|void} Will stop execution of `eachSeg` if returns `false`\n */\n /**\n * @param {module:path.PathEachSegCallback} fn\n * @returns {void}\n */\n eachSeg (fn) {\n const len = this.segs.length;\n for (let i = 0; i < len; i++) {\n const ret = fn.call(this.segs[i], i);\n if (ret === false) { break; }\n }\n }\n\n /**\n * @param {Integer} index\n * @returns {void}\n */\n addSeg (index) {\n // Adds a new segment\n const seg = this.segs[index];\n if (!seg.prev) { return; }\n\n const {prev} = seg;\n let newseg, newX, newY;\n switch (seg.item.pathSegType) {\n case 4: {\n newX = (seg.item.x + prev.item.x) / 2;\n newY = (seg.item.y + prev.item.y) / 2;\n newseg = this.elem.createSVGPathSegLinetoAbs(newX, newY);\n break;\n } case 6: { // make it a curved segment to preserve the shape (WRS)\n // https://en.wikipedia.org/wiki/De_Casteljau%27s_algorithm#Geometric_interpretation\n const p0x = (prev.item.x + seg.item.x1) / 2;\n const p1x = (seg.item.x1 + seg.item.x2) / 2;\n const p2x = (seg.item.x2 + seg.item.x) / 2;\n const p01x = (p0x + p1x) / 2;\n const p12x = (p1x + p2x) / 2;\n newX = (p01x + p12x) / 2;\n const p0y = (prev.item.y + seg.item.y1) / 2;\n const p1y = (seg.item.y1 + seg.item.y2) / 2;\n const p2y = (seg.item.y2 + seg.item.y) / 2;\n const p01y = (p0y + p1y) / 2;\n const p12y = (p1y + p2y) / 2;\n newY = (p01y + p12y) / 2;\n newseg = this.elem.createSVGPathSegCurvetoCubicAbs(newX, newY, p0x, p0y, p01x, p01y);\n const pts = [seg.item.x, seg.item.y, p12x, p12y, p2x, p2y];\n replacePathSeg(seg.type, index, pts);\n break;\n }\n }\n\n insertItemBefore(this.elem, newseg, index);\n }\n\n /**\n * @param {Integer} index\n * @returns {void}\n */\n deleteSeg (index) {\n const seg = this.segs[index];\n const list = this.elem.pathSegList;\n\n seg.show(false);\n const {next} = seg;\n if (seg.mate) {\n // Make the next point be the \"M\" point\n const pt = [next.item.x, next.item.y];\n replacePathSeg(2, next.index, pt);\n\n // Reposition last node\n replacePathSeg(4, seg.index, pt);\n\n list.removeItem(seg.mate.index);\n } else if (!seg.prev) {\n // First node of open path, make next point the M\n // const {item} = seg;\n const pt = [next.item.x, next.item.y];\n replacePathSeg(2, seg.next.index, pt);\n list.removeItem(index);\n } else {\n list.removeItem(index);\n }\n }\n\n /**\n * @param {Integer} index\n * @returns {void}\n */\n removePtFromSelection (index) {\n const pos = this.selected_pts.indexOf(index);\n if (pos === -1) {\n return;\n }\n this.segs[index].select(false);\n this.selected_pts.splice(pos, 1);\n }\n\n /**\n * @returns {void}\n */\n clearSelection () {\n this.eachSeg(function () {\n // 'this' is the segment here\n this.select(false);\n });\n this.selected_pts = [];\n }\n\n /**\n * @returns {void}\n */\n storeD () {\n this.last_d = this.elem.getAttribute('d');\n }\n\n /**\n * @param {Integer} y\n * @returns {Path}\n */\n show (y) {\n // Shows this path's segment grips\n this.eachSeg(function () {\n // 'this' is the segment here\n this.show(y);\n });\n if (y) {\n this.selectPt(this.first_seg.index);\n }\n return this;\n }\n\n /**\n * Move selected points.\n * @param {Integer} dx\n * @param {Integer} dy\n * @returns {void}\n */\n movePts (dx, dy) {\n let i = this.selected_pts.length;\n while (i--) {\n const seg = this.segs[this.selected_pts[i]];\n seg.move(dx, dy);\n }\n }\n\n /**\n * @param {Integer} dx\n * @param {Integer} dy\n * @returns {void}\n */\n moveCtrl (dx, dy) {\n const seg = this.segs[this.selected_pts[0]];\n seg.moveCtrl(this.dragctrl, dx, dy);\n if (linkControlPts) {\n seg.setLinked(this.dragctrl);\n }\n }\n\n /**\n * @param {?Integer} newType See {@link https://www.w3.org/TR/SVG/single-page.html#paths-InterfaceSVGPathSeg}\n * @returns {void}\n */\n setSegType (newType) {\n this.storeD();\n let i = this.selected_pts.length;\n let text;\n while (i--) {\n const selPt = this.selected_pts[i];\n\n // Selected seg\n const cur = this.segs[selPt];\n const {prev} = cur;\n if (!prev) { continue; }\n\n if (!newType) { // double-click, so just toggle\n text = 'Toggle Path Segment Type';\n\n // Toggle segment to curve/straight line\n const oldType = cur.type;\n\n newType = (oldType === 6) ? 4 : 6;\n }\n\n newType = Number(newType);\n\n const curX = cur.item.x;\n const curY = cur.item.y;\n const prevX = prev.item.x;\n const prevY = prev.item.y;\n let points;\n switch (newType) {\n case 6: {\n if (cur.olditem) {\n const old = cur.olditem;\n points = [curX, curY, old.x1, old.y1, old.x2, old.y2];\n } else {\n const diffX = curX - prevX;\n const diffY = curY - prevY;\n // get control points from straight line segment\n /*\n const ct1x = (prevX + (diffY/2));\n const ct1y = (prevY - (diffX/2));\n const ct2x = (curX + (diffY/2));\n const ct2y = (curY - (diffX/2));\n */\n // create control points on the line to preserve the shape (WRS)\n const ct1x = (prevX + (diffX / 3));\n const ct1y = (prevY + (diffY / 3));\n const ct2x = (curX - (diffX / 3));\n const ct2y = (curY - (diffY / 3));\n points = [curX, curY, ct1x, ct1y, ct2x, ct2y];\n }\n break;\n } case 4: {\n points = [curX, curY];\n\n // Store original prevve segment nums\n cur.olditem = cur.item;\n break;\n }\n }\n\n cur.setType(newType, points);\n }\n path.endChanges(text);\n }\n\n /**\n * @param {Integer} pt\n * @param {Integer} ctrlNum\n * @returns {void}\n */\n selectPt (pt, ctrlNum) {\n this.clearSelection();\n if (isNullish(pt)) {\n this.eachSeg(function (i) {\n // 'this' is the segment here.\n if (this.prev) {\n pt = i;\n }\n });\n }\n this.addPtsToSelection(pt);\n if (ctrlNum) {\n this.dragctrl = ctrlNum;\n\n if (linkControlPts) {\n this.segs[pt].setLinked(ctrlNum);\n }\n }\n }\n\n /**\n * Update position of all points.\n * @returns {Path}\n */\n update () {\n const {elem} = this;\n if (getRotationAngle(elem)) {\n this.matrix = getMatrix(elem);\n this.imatrix = this.matrix.inverse();\n } else {\n this.matrix = null;\n this.imatrix = null;\n }\n\n this.eachSeg(function (i) {\n this.item = elem.pathSegList.getItem(i);\n this.update();\n });\n\n return this;\n }\n\n /**\n * @param {string} text\n * @returns {void}\n */\n endChanges (text) {\n if (isWebkit()) { editorContext_.resetD(this.elem); }\n const cmd = new ChangeElementCommand(this.elem, {d: this.last_d}, text);\n editorContext_.endChanges({cmd, elem: this.elem});\n }\n\n /**\n * @param {Integer|Integer[]} indexes\n * @returns {void}\n */\n addPtsToSelection (indexes) {\n if (!Array.isArray(indexes)) { indexes = [indexes]; }\n indexes.forEach((index) => {\n const seg = this.segs[index];\n if (seg.ptgrip) {\n if (!this.selected_pts.includes(index) && index >= 0) {\n this.selected_pts.push(index);\n }\n }\n });\n this.selected_pts.sort();\n let i = this.selected_pts.length;\n const grips = [];\n grips.length = i;\n // Loop through points to be selected and highlight each\n while (i--) {\n const pt = this.selected_pts[i];\n const seg = this.segs[pt];\n seg.select(true);\n grips[i] = seg.ptgrip;\n }\n\n const closedSubpath = Path.subpathIsClosed(this.selected_pts[0]);\n editorContext_.addPtsToSelection({grips, closedSubpath});\n }\n\n // STATIC\n /**\n * @param {Integer} index\n * @returns {boolean}\n */\n static subpathIsClosed (index) {\n let clsd = false;\n // Check if subpath is already open\n path.eachSeg(function (i) {\n if (i <= index) { return true; }\n if (this.type === 2) {\n // Found M first, so open\n return false;\n }\n if (this.type === 1) {\n // Found Z first, so closed\n clsd = true;\n return false;\n }\n return true;\n });\n\n return clsd;\n }\n}\n\n/**\n* @function module:path.getPath_\n* @param {SVGPathElement} elem\n* @returns {module:path.Path}\n*/\nexport const getPath_ = function (elem) {\n let p = pathData[elem.id];\n if (!p) {\n p = pathData[elem.id] = new Path(elem);\n }\n return p;\n};\n\n/**\n* @function module:path.removePath_\n* @param {string} id\n* @returns {void}\n*/\nexport const removePath_ = function (id) {\n if (id in pathData) { delete pathData[id]; }\n};\n\nlet newcx, newcy, oldcx, oldcy, angle;\n\nconst getRotVals = function (x, y) {\n let dx = x - oldcx;\n let dy = y - oldcy;\n\n // rotate the point around the old center\n let r = Math.sqrt(dx * dx + dy * dy);\n let theta = Math.atan2(dy, dx) + angle;\n dx = r * Math.cos(theta) + oldcx;\n dy = r * Math.sin(theta) + oldcy;\n\n // dx,dy should now hold the actual coordinates of each\n // point after being rotated\n\n // now we want to rotate them around the new center in the reverse direction\n dx -= newcx;\n dy -= newcy;\n\n r = Math.sqrt(dx * dx + dy * dy);\n theta = Math.atan2(dy, dx) - angle;\n\n return {x: r * Math.cos(theta) + newcx,\n y: r * Math.sin(theta) + newcy};\n};\n\n// If the path was rotated, we must now pay the piper:\n// Every path point must be rotated into the rotated coordinate system of\n// its old center, then determine the new center, then rotate it back\n// This is because we want the path to remember its rotation\n\n/**\n* @function module:path.recalcRotatedPath\n* @todo This is still using ye olde transform methods, can probably\n* be optimized or even taken care of by `recalculateDimensions`\n* @returns {void}\n*/\nexport const recalcRotatedPath = function () {\n const currentPath = path.elem;\n angle = getRotationAngle(currentPath, true);\n if (!angle) { return; }\n // selectedBBoxes[0] = path.oldbbox;\n const oldbox = path.oldbbox; // selectedBBoxes[0],\n oldcx = oldbox.x + oldbox.width / 2;\n oldcy = oldbox.y + oldbox.height / 2;\n const box = getBBox(currentPath);\n newcx = box.x + box.width / 2;\n newcy = box.y + box.height / 2;\n\n // un-rotate the new center to the proper position\n const dx = newcx - oldcx,\n dy = newcy - oldcy,\n r = Math.sqrt(dx * dx + dy * dy),\n theta = Math.atan2(dy, dx) + angle;\n\n newcx = r * Math.cos(theta) + oldcx;\n newcy = r * Math.sin(theta) + oldcy;\n\n const list = currentPath.pathSegList;\n\n let i = list.numberOfItems;\n while (i) {\n i -= 1;\n const seg = list.getItem(i),\n type = seg.pathSegType;\n if (type === 1) { continue; }\n\n const rvals = getRotVals(seg.x, seg.y),\n points = [rvals.x, rvals.y];\n if (!isNullish(seg.x1) && !isNullish(seg.x2)) {\n const cVals1 = getRotVals(seg.x1, seg.y1);\n const cVals2 = getRotVals(seg.x2, seg.y2);\n points.splice(points.length, 0, cVals1.x, cVals1.y, cVals2.x, cVals2.y);\n }\n replacePathSeg(type, i, points);\n } // loop for each point\n\n /* box = */ getBBox(currentPath);\n // selectedBBoxes[0].x = box.x; selectedBBoxes[0].y = box.y;\n // selectedBBoxes[0].width = box.width; selectedBBoxes[0].height = box.height;\n\n // now we must set the new transform to be rotated around the new center\n const Rnc = editorContext_.getSVGRoot().createSVGTransform(),\n tlist = getTransformList(currentPath);\n Rnc.setRotate((angle * 180.0 / Math.PI), newcx, newcy);\n tlist.replaceItem(Rnc, 0);\n};\n\n// ====================================\n// Public API starts here\n\n/**\n* @function module:path.clearData\n* @returns {void}\n*/\nexport const clearData = function () {\n pathData = {};\n};\n\n// Making public for mocking\n/**\n* @function module:path.reorientGrads\n* @param {Element} elem\n* @param {SVGMatrix} m\n* @returns {void}\n*/\nexport const reorientGrads = function (elem, m) {\n const bb = utilsGetBBox(elem);\n for (let i = 0; i < 2; i++) {\n const type = i === 0 ? 'fill' : 'stroke';\n const attrVal = elem.getAttribute(type);\n if (attrVal && attrVal.startsWith('url(')) {\n const grad = getRefElem(attrVal);\n if (grad.tagName === 'linearGradient') {\n let x1 = grad.getAttribute('x1') || 0;\n let y1 = grad.getAttribute('y1') || 0;\n let x2 = grad.getAttribute('x2') || 1;\n let y2 = grad.getAttribute('y2') || 0;\n\n // Convert to USOU points\n x1 = (bb.width * x1) + bb.x;\n y1 = (bb.height * y1) + bb.y;\n x2 = (bb.width * x2) + bb.x;\n y2 = (bb.height * y2) + bb.y;\n\n // Transform those points\n const pt1 = transformPoint(x1, y1, m);\n const pt2 = transformPoint(x2, y2, m);\n\n // Convert back to BB points\n const gCoords = {\n x1: (pt1.x - bb.x) / bb.width,\n y1: (pt1.y - bb.y) / bb.height,\n x2: (pt2.x - bb.x) / bb.width,\n y2: (pt2.y - bb.y) / bb.height\n };\n\n const newgrad = grad.cloneNode(true);\n $(newgrad).attr(gCoords);\n\n newgrad.id = editorContext_.getNextId();\n findDefs().append(newgrad);\n elem.setAttribute(type, 'url(#' + newgrad.id + ')');\n }\n }\n }\n};\n\n/**\n* This is how we map paths to our preferred relative segment types.\n* @name module:path.pathMap\n* @type {GenericArray}\n*/\nconst pathMap = [\n 0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a',\n 'H', 'h', 'V', 'v', 'S', 's', 'T', 't'\n];\n\n/**\n * Convert a path to one with only absolute or relative values.\n * @todo move to pathActions.js\n * @function module:path.convertPath\n * @param {SVGPathElement} pth - the path to convert\n * @param {boolean} toRel - true of convert to relative\n * @returns {string}\n */\nexport const convertPath = function (pth, toRel) {\n const {pathSegList} = pth;\n const len = pathSegList.numberOfItems;\n let curx = 0, cury = 0;\n let d = '';\n let lastM = null;\n\n for (let i = 0; i < len; ++i) {\n const seg = pathSegList.getItem(i);\n // if these properties are not in the segment, set them to zero\n let x = seg.x || 0,\n y = seg.y || 0,\n x1 = seg.x1 || 0,\n y1 = seg.y1 || 0,\n x2 = seg.x2 || 0,\n y2 = seg.y2 || 0;\n\n const type = seg.pathSegType;\n let letter = pathMap[type][toRel ? 'toLowerCase' : 'toUpperCase']();\n\n switch (type) {\n case 1: // z,Z closepath (Z/z)\n d += 'z';\n if (lastM && !toRel) {\n curx = lastM[0];\n cury = lastM[1];\n }\n break;\n case 12: // absolute horizontal line (H)\n x -= curx;\n // Fallthrough\n case 13: // relative horizontal line (h)\n if (toRel) {\n y = 0;\n curx += x;\n letter = 'l';\n } else {\n y = cury;\n x += curx;\n curx = x;\n letter = 'L';\n }\n // Convert to \"line\" for easier editing\n d += pathDSegment(letter, [[x, y]]);\n break;\n case 14: // absolute vertical line (V)\n y -= cury;\n // Fallthrough\n case 15: // relative vertical line (v)\n if (toRel) {\n x = 0;\n cury += y;\n letter = 'l';\n } else {\n x = curx;\n y += cury;\n cury = y;\n letter = 'L';\n }\n // Convert to \"line\" for easier editing\n d += pathDSegment(letter, [[x, y]]);\n break;\n case 2: // absolute move (M)\n case 4: // absolute line (L)\n case 18: // absolute smooth quad (T)\n x -= curx;\n y -= cury;\n // Fallthrough\n case 5: // relative line (l)\n case 3: // relative move (m)\n case 19: // relative smooth quad (t)\n if (toRel) {\n curx += x;\n cury += y;\n } else {\n x += curx;\n y += cury;\n curx = x;\n cury = y;\n }\n if (type === 2 || type === 3) { lastM = [curx, cury]; }\n\n d += pathDSegment(letter, [[x, y]]);\n break;\n case 6: // absolute cubic (C)\n x -= curx; x1 -= curx; x2 -= curx;\n y -= cury; y1 -= cury; y2 -= cury;\n // Fallthrough\n case 7: // relative cubic (c)\n if (toRel) {\n curx += x;\n cury += y;\n } else {\n x += curx; x1 += curx; x2 += curx;\n y += cury; y1 += cury; y2 += cury;\n curx = x;\n cury = y;\n }\n d += pathDSegment(letter, [[x1, y1], [x2, y2], [x, y]]);\n break;\n case 8: // absolute quad (Q)\n x -= curx; x1 -= curx;\n y -= cury; y1 -= cury;\n // Fallthrough\n case 9: // relative quad (q)\n if (toRel) {\n curx += x;\n cury += y;\n } else {\n x += curx; x1 += curx;\n y += cury; y1 += cury;\n curx = x;\n cury = y;\n }\n d += pathDSegment(letter, [[x1, y1], [x, y]]);\n break;\n // eslint-disable-next-line sonarjs/no-duplicated-branches\n case 10: // absolute elliptical arc (A)\n x -= curx;\n y -= cury;\n // Fallthrough\n case 11: // relative elliptical arc (a)\n if (toRel) {\n curx += x;\n cury += y;\n } else {\n x += curx;\n y += cury;\n curx = x;\n cury = y;\n }\n d += pathDSegment(letter, [[seg.r1, seg.r2]], [\n seg.angle,\n (seg.largeArcFlag ? 1 : 0),\n (seg.sweepFlag ? 1 : 0)\n ], [x, y]);\n break;\n case 16: // absolute smooth cubic (S)\n x -= curx; x2 -= curx;\n y -= cury; y2 -= cury;\n // Fallthrough\n case 17: // relative smooth cubic (s)\n if (toRel) {\n curx += x;\n cury += y;\n } else {\n x += curx; x2 += curx;\n y += cury; y2 += cury;\n curx = x;\n cury = y;\n }\n d += pathDSegment(letter, [[x2, y2], [x, y]]);\n break;\n } // switch on path segment type\n } // for each segment\n return d;\n};\n\n/**\n * TODO: refactor callers in `convertPath` to use `getPathDFromSegments` instead of this function.\n * Legacy code refactored from `svgcanvas.pathActions.convertPath`.\n * @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})\n * @param {GenericArray>} points - x,y points\n * @param {GenericArray>} [morePoints] - x,y points\n * @param {Integer[]} [lastPoint] - x,y point\n * @returns {string}\n */\nfunction pathDSegment (letter, points, morePoints, lastPoint) {\n $.each(points, function (i, pnt) {\n points[i] = shortFloat(pnt);\n });\n let segment = letter + points.join(' ');\n if (morePoints) {\n segment += ' ' + morePoints.join(' ');\n }\n if (lastPoint) {\n segment += ' ' + shortFloat(lastPoint);\n }\n return segment;\n}\n\n/* eslint-disable jsdoc/require-property */\n/**\n* Group: Path edit functions.\n* Functions relating to editing path elements.\n* @namespace {PlainObject} pathActions\n* @memberof module:path\n*/\nexport const pathActions = (function () {\n /* eslint-enable jsdoc/require-property */\n let subpath = false;\n let newPoint, firstCtrl;\n\n let currentPath = null;\n let hasMoved = false;\n // No `editorContext_` yet but should be ok as is `null` by default\n // editorContext_.setDrawnPath(null);\n\n /**\n * This function converts a polyline (created by the fh_path tool) into\n * a path element and coverts every three line segments into a single bezier\n * curve in an attempt to smooth out the free-hand.\n * @function smoothPolylineIntoPath\n * @param {Element} element\n * @returns {Element}\n */\n const smoothPolylineIntoPath = function (element) {\n let i;\n const {points} = element;\n const N = points.numberOfItems;\n if (N >= 4) {\n // loop through every 3 points and convert to a cubic bezier curve segment\n //\n // NOTE: this is cheating, it means that every 3 points has the potential to\n // be a corner instead of treating each point in an equal manner. In general,\n // this technique does not look that good.\n //\n // I am open to better ideas!\n //\n // Reading:\n // - http://www.efg2.com/Lab/Graphics/Jean-YvesQueinecBezierCurves.htm\n // - https://www.codeproject.com/KB/graphics/BezierSpline.aspx?msg=2956963\n // - https://www.ian-ko.com/ET_GeoWizards/UserGuide/smooth.htm\n // - https://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/bezier-der.html\n let curpos = points.getItem(0), prevCtlPt = null;\n let d = [];\n d.push(['M', curpos.x, ',', curpos.y, ' C'].join(''));\n for (i = 1; i <= (N - 4); i += 3) {\n let ct1 = points.getItem(i);\n const ct2 = points.getItem(i + 1);\n const end = points.getItem(i + 2);\n\n // if the previous segment had a control point, we want to smooth out\n // the control points on both sides\n if (prevCtlPt) {\n const newpts = smoothControlPoints(prevCtlPt, ct1, curpos);\n if (newpts && newpts.length === 2) {\n const prevArr = d[d.length - 1].split(',');\n prevArr[2] = newpts[0].x;\n prevArr[3] = newpts[0].y;\n d[d.length - 1] = prevArr.join(',');\n ct1 = newpts[1];\n }\n }\n\n d.push([ct1.x, ct1.y, ct2.x, ct2.y, end.x, end.y].join(','));\n\n curpos = end;\n prevCtlPt = ct2;\n }\n // handle remaining line segments\n d.push('L');\n while (i < N) {\n const pt = points.getItem(i);\n d.push([pt.x, pt.y].join(','));\n i++;\n }\n d = d.join(' ');\n\n // create new path element\n element = editorContext_.addSVGElementFromJson({\n element: 'path',\n curStyles: true,\n attr: {\n id: editorContext_.getId(),\n d,\n fill: 'none'\n }\n });\n // No need to call \"changed\", as this is already done under mouseUp\n }\n return element;\n };\n\n return (/** @lends module:path.pathActions */ {\n /**\n * @param {MouseEvent} evt\n * @param {Element} mouseTarget\n * @param {Float} startX\n * @param {Float} startY\n * @returns {boolean|void}\n */\n mouseDown (evt, mouseTarget, startX, startY) {\n let id;\n if (editorContext_.getCurrentMode() === 'path') {\n let mouseX = startX; // Was this meant to work with the other `mouseX`? (was defined globally so adding `let` to at least avoid a global)\n let mouseY = startY; // Was this meant to work with the other `mouseY`? (was defined globally so adding `let` to at least avoid a global)\n\n const currentZoom = editorContext_.getCurrentZoom();\n let x = mouseX / currentZoom,\n y = mouseY / currentZoom,\n stretchy = getElem('path_stretch_line');\n newPoint = [x, y];\n\n if (editorContext_.getGridSnapping()) {\n x = snapToGrid(x);\n y = snapToGrid(y);\n mouseX = snapToGrid(mouseX);\n mouseY = snapToGrid(mouseY);\n }\n\n if (!stretchy) {\n stretchy = document.createElementNS(NS.SVG, 'path');\n assignAttributes(stretchy, {\n id: 'path_stretch_line',\n stroke: '#22C',\n 'stroke-width': '0.5',\n fill: 'none'\n });\n stretchy = getElem('selectorParentGroup').appendChild(stretchy);\n }\n stretchy.setAttribute('display', 'inline');\n\n let keep = null;\n let index;\n // if pts array is empty, create path element with M at current point\n const drawnPath = editorContext_.getDrawnPath();\n if (!drawnPath) {\n const dAttr = 'M' + x + ',' + y + ' '; // Was this meant to work with the other `dAttr`? (was defined globally so adding `var` to at least avoid a global)\n /* drawnPath = */ editorContext_.setDrawnPath(editorContext_.addSVGElementFromJson({\n element: 'path',\n curStyles: true,\n attr: {\n d: dAttr,\n id: editorContext_.getNextId(),\n opacity: editorContext_.getOpacity() / 2\n }\n }));\n // set stretchy line to first point\n stretchy.setAttribute('d', ['M', mouseX, mouseY, mouseX, mouseY].join(' '));\n index = subpath ? path.segs.length : 0;\n addPointGrip(index, mouseX, mouseY);\n } else {\n // determine if we clicked on an existing point\n const seglist = drawnPath.pathSegList;\n let i = seglist.numberOfItems;\n const FUZZ = 6 / currentZoom;\n let clickOnPoint = false;\n while (i) {\n i--;\n const item = seglist.getItem(i);\n const px = item.x, py = item.y;\n // found a matching point\n if (x >= (px - FUZZ) && x <= (px + FUZZ) &&\n y >= (py - FUZZ) && y <= (py + FUZZ)\n ) {\n clickOnPoint = true;\n break;\n }\n }\n\n // get path element that we are in the process of creating\n id = editorContext_.getId();\n\n // Remove previous path object if previously created\n removePath_(id);\n\n const newpath = getElem(id);\n let newseg;\n let sSeg;\n const len = seglist.numberOfItems;\n // if we clicked on an existing point, then we are done this path, commit it\n // (i, i+1) are the x,y that were clicked on\n if (clickOnPoint) {\n // if clicked on any other point but the first OR\n // the first point was clicked on and there are less than 3 points\n // then leave the path open\n // otherwise, close the path\n if (i <= 1 && len >= 2) {\n // Create end segment\n const absX = seglist.getItem(0).x;\n const absY = seglist.getItem(0).y;\n\n sSeg = stretchy.pathSegList.getItem(1);\n if (sSeg.pathSegType === 4) {\n newseg = drawnPath.createSVGPathSegLinetoAbs(absX, absY);\n } else {\n newseg = drawnPath.createSVGPathSegCurvetoCubicAbs(\n absX,\n absY,\n sSeg.x1 / currentZoom,\n sSeg.y1 / currentZoom,\n absX,\n absY\n );\n }\n\n const endseg = drawnPath.createSVGPathSegClosePath();\n seglist.appendItem(newseg);\n seglist.appendItem(endseg);\n } else if (len < 3) {\n keep = false;\n return keep;\n }\n $(stretchy).remove();\n\n // This will signal to commit the path\n // const element = newpath; // Other event handlers define own `element`, so this was probably not meant to interact with them or one which shares state (as there were none); I therefore adding a missing `var` to avoid a global\n /* drawnPath = */ editorContext_.setDrawnPath(null);\n editorContext_.setStarted(false);\n\n if (subpath) {\n if (path.matrix) {\n editorContext_.remapElement(newpath, {}, path.matrix.inverse());\n }\n\n const newD = newpath.getAttribute('d');\n const origD = $(path.elem).attr('d');\n $(path.elem).attr('d', origD + newD);\n $(newpath).remove();\n if (path.matrix) {\n recalcRotatedPath();\n }\n init();\n pathActions.toEditMode(path.elem);\n path.selectPt();\n return false;\n }\n // else, create a new point, update path element\n } else {\n // Checks if current target or parents are #svgcontent\n if (!$.contains(\n editorContext_.getContainer(),\n editorContext_.getMouseTarget(evt)\n )) {\n // Clicked outside canvas, so don't make point\n // console.log('Clicked outside canvas');\n return false;\n }\n\n const num = drawnPath.pathSegList.numberOfItems;\n const last = drawnPath.pathSegList.getItem(num - 1);\n const lastx = last.x, lasty = last.y;\n\n if (evt.shiftKey) {\n const xya = snapToAngle(lastx, lasty, x, y);\n ({x, y} = xya);\n }\n\n // Use the segment defined by stretchy\n sSeg = stretchy.pathSegList.getItem(1);\n if (sSeg.pathSegType === 4) {\n newseg = drawnPath.createSVGPathSegLinetoAbs(\n editorContext_.round(x),\n editorContext_.round(y)\n );\n } else {\n newseg = drawnPath.createSVGPathSegCurvetoCubicAbs(\n editorContext_.round(x),\n editorContext_.round(y),\n sSeg.x1 / currentZoom,\n sSeg.y1 / currentZoom,\n sSeg.x2 / currentZoom,\n sSeg.y2 / currentZoom\n );\n }\n\n drawnPath.pathSegList.appendItem(newseg);\n\n x *= currentZoom;\n y *= currentZoom;\n\n // set stretchy line to latest point\n stretchy.setAttribute('d', ['M', x, y, x, y].join(' '));\n index = num;\n if (subpath) { index += path.segs.length; }\n addPointGrip(index, x, y);\n }\n // keep = true;\n }\n\n return undefined;\n }\n\n // TODO: Make sure currentPath isn't null at this point\n if (!path) { return undefined; }\n\n path.storeD();\n\n ({id} = evt.target);\n let curPt;\n if (id.substr(0, 14) === 'pathpointgrip_') {\n // Select this point\n curPt = path.cur_pt = Number.parseInt(id.substr(14));\n path.dragging = [startX, startY];\n const seg = path.segs[curPt];\n\n // only clear selection if shift is not pressed (otherwise, add\n // node to selection)\n if (!evt.shiftKey) {\n if (path.selected_pts.length <= 1 || !seg.selected) {\n path.clearSelection();\n }\n path.addPtsToSelection(curPt);\n } else if (seg.selected) {\n path.removePtFromSelection(curPt);\n } else {\n path.addPtsToSelection(curPt);\n }\n } else if (id.startsWith('ctrlpointgrip_')) {\n path.dragging = [startX, startY];\n\n const parts = id.split('_')[1].split('c');\n curPt = Number(parts[0]);\n const ctrlNum = Number(parts[1]);\n path.selectPt(curPt, ctrlNum);\n }\n\n // Start selection box\n if (!path.dragging) {\n let rubberBox = editorContext_.getRubberBox();\n if (isNullish(rubberBox)) {\n rubberBox = editorContext_.setRubberBox(\n editorContext_.selectorManager.getRubberBandBox()\n );\n }\n const currentZoom = editorContext_.getCurrentZoom();\n assignAttributes(rubberBox, {\n x: startX * currentZoom,\n y: startY * currentZoom,\n width: 0,\n height: 0,\n display: 'inline'\n }, 100);\n }\n return undefined;\n },\n /**\n * @param {Float} mouseX\n * @param {Float} mouseY\n * @returns {void}\n */\n mouseMove (mouseX, mouseY) {\n const currentZoom = editorContext_.getCurrentZoom();\n hasMoved = true;\n const drawnPath = editorContext_.getDrawnPath();\n if (editorContext_.getCurrentMode() === 'path') {\n if (!drawnPath) { return; }\n const seglist = drawnPath.pathSegList;\n const index = seglist.numberOfItems - 1;\n\n if (newPoint) {\n // First point\n // if (!index) { return; }\n\n // Set control points\n const pointGrip1 = addCtrlGrip('1c1');\n const pointGrip2 = addCtrlGrip('0c2');\n\n // dragging pointGrip1\n pointGrip1.setAttribute('cx', mouseX);\n pointGrip1.setAttribute('cy', mouseY);\n pointGrip1.setAttribute('display', 'inline');\n\n const ptX = newPoint[0];\n const ptY = newPoint[1];\n\n // set curve\n // const seg = seglist.getItem(index);\n const curX = mouseX / currentZoom;\n const curY = mouseY / currentZoom;\n const altX = (ptX + (ptX - curX));\n const altY = (ptY + (ptY - curY));\n\n pointGrip2.setAttribute('cx', altX * currentZoom);\n pointGrip2.setAttribute('cy', altY * currentZoom);\n pointGrip2.setAttribute('display', 'inline');\n\n const ctrlLine = getCtrlLine(1);\n assignAttributes(ctrlLine, {\n x1: mouseX,\n y1: mouseY,\n x2: altX * currentZoom,\n y2: altY * currentZoom,\n display: 'inline'\n });\n\n if (index === 0) {\n firstCtrl = [mouseX, mouseY];\n } else {\n const last = seglist.getItem(index - 1);\n let lastX = last.x;\n let lastY = last.y;\n\n if (last.pathSegType === 6) {\n lastX += (lastX - last.x2);\n lastY += (lastY - last.y2);\n } else if (firstCtrl) {\n lastX = firstCtrl[0] / currentZoom;\n lastY = firstCtrl[1] / currentZoom;\n }\n replacePathSeg(6, index, [ptX, ptY, lastX, lastY, altX, altY], drawnPath);\n }\n } else {\n const stretchy = getElem('path_stretch_line');\n if (stretchy) {\n const prev = seglist.getItem(index);\n if (prev.pathSegType === 6) {\n const prevX = prev.x + (prev.x - prev.x2);\n const prevY = prev.y + (prev.y - prev.y2);\n replacePathSeg(6, 1, [mouseX, mouseY, prevX * currentZoom, prevY * currentZoom, mouseX, mouseY], stretchy);\n } else if (firstCtrl) {\n replacePathSeg(6, 1, [mouseX, mouseY, firstCtrl[0], firstCtrl[1], mouseX, mouseY], stretchy);\n } else {\n replacePathSeg(4, 1, [mouseX, mouseY], stretchy);\n }\n }\n }\n return;\n }\n // if we are dragging a point, let's move it\n if (path.dragging) {\n const pt = getPointFromGrip({\n x: path.dragging[0],\n y: path.dragging[1]\n }, path);\n const mpt = getPointFromGrip({\n x: mouseX,\n y: mouseY\n }, path);\n const diffX = mpt.x - pt.x;\n const diffY = mpt.y - pt.y;\n path.dragging = [mouseX, mouseY];\n\n if (path.dragctrl) {\n path.moveCtrl(diffX, diffY);\n } else {\n path.movePts(diffX, diffY);\n }\n } else {\n path.selected_pts = [];\n path.eachSeg(function (i) {\n const seg = this; // eslint-disable-line consistent-this\n if (!seg.next && !seg.prev) { return; }\n\n // const {item} = seg;\n const rubberBox = editorContext_.getRubberBox();\n const rbb = rubberBox.getBBox();\n\n const pt = getGripPt(seg);\n const ptBb = {\n x: pt.x,\n y: pt.y,\n width: 0,\n height: 0\n };\n\n const sel = rectsIntersect(rbb, ptBb);\n\n this.select(sel);\n // Note that addPtsToSelection is not being run\n if (sel) { path.selected_pts.push(seg.index); }\n });\n }\n },\n /**\n * @typedef module:path.keepElement\n * @type {PlainObject}\n * @property {boolean} keep\n * @property {Element} element\n */\n /**\n * @param {Event} evt\n * @param {Element} element\n * @param {Float} mouseX\n * @param {Float} mouseY\n * @returns {module:path.keepElement|void}\n */\n mouseUp (evt, element, mouseX, mouseY) {\n const drawnPath = editorContext_.getDrawnPath();\n // Create mode\n if (editorContext_.getCurrentMode() === 'path') {\n newPoint = null;\n if (!drawnPath) {\n element = getElem(editorContext_.getId());\n editorContext_.setStarted(false);\n firstCtrl = null;\n }\n\n return {\n keep: true,\n element\n };\n }\n\n // Edit mode\n const rubberBox = editorContext_.getRubberBox();\n if (path.dragging) {\n const lastPt = path.cur_pt;\n\n path.dragging = false;\n path.dragctrl = false;\n path.update();\n\n if (hasMoved) {\n path.endChanges('Move path point(s)');\n }\n\n if (!evt.shiftKey && !hasMoved) {\n path.selectPt(lastPt);\n }\n } else if (rubberBox && rubberBox.getAttribute('display') !== 'none') {\n // Done with multi-node-select\n rubberBox.setAttribute('display', 'none');\n\n if (rubberBox.getAttribute('width') <= 2 && rubberBox.getAttribute('height') <= 2) {\n pathActions.toSelectMode(evt.target);\n }\n\n // else, move back to select mode\n } else {\n pathActions.toSelectMode(evt.target);\n }\n hasMoved = false;\n return undefined;\n },\n /**\n * @param {Element} element\n * @returns {void}\n */\n toEditMode (element) {\n path = getPath_(element);\n editorContext_.setCurrentMode('pathedit');\n editorContext_.clearSelection();\n path.show(true).update();\n path.oldbbox = utilsGetBBox(path.elem);\n subpath = false;\n },\n /**\n * @param {Element} elem\n * @fires module:svgcanvas.SvgCanvas#event:selected\n * @returns {void}\n */\n toSelectMode (elem) {\n const selPath = (elem === path.elem);\n editorContext_.setCurrentMode('select');\n path.show(false);\n currentPath = false;\n editorContext_.clearSelection();\n\n if (path.matrix) {\n // Rotated, so may need to re-calculate the center\n recalcRotatedPath();\n }\n\n if (selPath) {\n editorContext_.call('selected', [elem]);\n editorContext_.addToSelection([elem], true);\n }\n },\n /**\n * @param {boolean} on\n * @returns {void}\n */\n addSubPath (on) {\n if (on) {\n // Internally we go into \"path\" mode, but in the UI it will\n // still appear as if in \"pathedit\" mode.\n editorContext_.setCurrentMode('path');\n subpath = true;\n } else {\n pathActions.clear(true);\n pathActions.toEditMode(path.elem);\n }\n },\n /**\n * @param {Element} target\n * @returns {void}\n */\n select (target) {\n if (currentPath === target) {\n pathActions.toEditMode(target);\n editorContext_.setCurrentMode('pathedit');\n // going into pathedit mode\n } else {\n currentPath = target;\n }\n },\n /**\n * @fires module:svgcanvas.SvgCanvas#event:changed\n * @returns {void}\n */\n reorient () {\n const elem = editorContext_.getSelectedElements()[0];\n if (!elem) { return; }\n const angl = getRotationAngle(elem);\n if (angl === 0) { return; }\n\n const batchCmd = new BatchCommand('Reorient path');\n const changes = {\n d: elem.getAttribute('d'),\n transform: elem.getAttribute('transform')\n };\n batchCmd.addSubCommand(new ChangeElementCommand(elem, changes));\n editorContext_.clearSelection();\n this.resetOrientation(elem);\n\n editorContext_.addCommandToHistory(batchCmd);\n\n // Set matrix to null\n getPath_(elem).show(false).matrix = null;\n\n this.clear();\n\n editorContext_.addToSelection([elem], true);\n editorContext_.call('changed', editorContext_.getSelectedElements());\n },\n\n /**\n * @param {boolean} remove Not in use\n * @returns {void}\n */\n clear (remove) {\n const drawnPath = editorContext_.getDrawnPath();\n currentPath = null;\n if (drawnPath) {\n const elem = getElem(editorContext_.getId());\n $(getElem('path_stretch_line')).remove();\n $(elem).remove();\n $(getElem('pathpointgrip_container')).find('*').attr('display', 'none');\n firstCtrl = null;\n editorContext_.setDrawnPath(null);\n editorContext_.setStarted(false);\n } else if (editorContext_.getCurrentMode() === 'pathedit') {\n this.toSelectMode();\n }\n if (path) { path.init().show(false); }\n },\n /**\n * @param {?(Element|SVGPathElement)} pth\n * @returns {false|void}\n */\n resetOrientation (pth) {\n if (isNullish(pth) || pth.nodeName !== 'path') { return false; }\n const tlist = getTransformList(pth);\n const m = transformListToTransform(tlist).matrix;\n tlist.clear();\n pth.removeAttribute('transform');\n const segList = pth.pathSegList;\n\n // Opera/win/non-EN throws an error here.\n // TODO: Find out why!\n // Presumed fixed in Opera 10.5, so commented out for now\n\n // try {\n const len = segList.numberOfItems;\n // } catch(err) {\n // const fixed_d = pathActions.convertPath(pth);\n // pth.setAttribute('d', fixed_d);\n // segList = pth.pathSegList;\n // const len = segList.numberOfItems;\n // }\n // let lastX, lastY;\n for (let i = 0; i < len; ++i) {\n const seg = segList.getItem(i);\n const type = seg.pathSegType;\n if (type === 1) { continue; }\n const pts = [];\n $.each(['', 1, 2], function (j, n) {\n const x = seg['x' + n], y = seg['y' + n];\n if (x !== undefined && y !== undefined) {\n const pt = transformPoint(x, y, m);\n pts.splice(pts.length, 0, pt.x, pt.y);\n }\n });\n replacePathSeg(type, i, pts, pth);\n }\n\n reorientGrads(pth, m);\n return undefined;\n },\n /**\n * @returns {void}\n */\n zoomChange () {\n if (editorContext_.getCurrentMode() === 'pathedit') {\n path.update();\n }\n },\n /**\n * @typedef {PlainObject} module:path.NodePoint\n * @property {Float} x\n * @property {Float} y\n * @property {Integer} type\n */\n /**\n * @returns {module:path.NodePoint}\n */\n getNodePoint () {\n const selPt = path.selected_pts.length ? path.selected_pts[0] : 1;\n\n const seg = path.segs[selPt];\n return {\n x: seg.item.x,\n y: seg.item.y,\n type: seg.type\n };\n },\n /**\n * @param {boolean} linkPoints\n * @returns {void}\n */\n linkControlPoints (linkPoints) {\n setLinkControlPoints(linkPoints);\n },\n /**\n * @returns {void}\n */\n clonePathNode () {\n path.storeD();\n\n const selPts = path.selected_pts;\n // const {segs} = path;\n\n let i = selPts.length;\n const nums = [];\n\n while (i--) {\n const pt = selPts[i];\n path.addSeg(pt);\n\n nums.push(pt + i);\n nums.push(pt + i + 1);\n }\n path.init().addPtsToSelection(nums);\n\n path.endChanges('Clone path node(s)');\n },\n /**\n * @returns {void}\n */\n opencloseSubPath () {\n const selPts = path.selected_pts;\n // Only allow one selected node for now\n if (selPts.length !== 1) { return; }\n\n const {elem} = path;\n const list = elem.pathSegList;\n\n // const len = list.numberOfItems;\n\n const index = selPts[0];\n\n let openPt = null;\n let startItem = null;\n\n // Check if subpath is already open\n path.eachSeg(function (i) {\n if (this.type === 2 && i <= index) {\n startItem = this.item;\n }\n if (i <= index) { return true; }\n if (this.type === 2) {\n // Found M first, so open\n openPt = i;\n return false;\n }\n if (this.type === 1) {\n // Found Z first, so closed\n openPt = false;\n return false;\n }\n return true;\n });\n\n if (isNullish(openPt)) {\n // Single path, so close last seg\n openPt = path.segs.length - 1;\n }\n\n if (openPt !== false) {\n // Close this path\n\n // Create a line going to the previous \"M\"\n const newseg = elem.createSVGPathSegLinetoAbs(startItem.x, startItem.y);\n\n const closer = elem.createSVGPathSegClosePath();\n if (openPt === path.segs.length - 1) {\n list.appendItem(newseg);\n list.appendItem(closer);\n } else {\n insertItemBefore(elem, closer, openPt);\n insertItemBefore(elem, newseg, openPt);\n }\n\n path.init().selectPt(openPt + 1);\n return;\n }\n\n // M 1,1 L 2,2 L 3,3 L 1,1 z // open at 2,2\n // M 2,2 L 3,3 L 1,1\n\n // M 1,1 L 2,2 L 1,1 z M 4,4 L 5,5 L6,6 L 5,5 z\n // M 1,1 L 2,2 L 1,1 z [M 4,4] L 5,5 L(M)6,6 L 5,5 z\n\n const seg = path.segs[index];\n\n if (seg.mate) {\n list.removeItem(index); // Removes last \"L\"\n list.removeItem(index); // Removes the \"Z\"\n path.init().selectPt(index - 1);\n return;\n }\n\n let lastM, zSeg;\n\n // Find this sub-path's closing point and remove\n for (let i = 0; i < list.numberOfItems; i++) {\n const item = list.getItem(i);\n\n if (item.pathSegType === 2) {\n // Find the preceding M\n lastM = i;\n } else if (i === index) {\n // Remove it\n list.removeItem(lastM);\n // index--;\n } else if (item.pathSegType === 1 && index < i) {\n // Remove the closing seg of this subpath\n zSeg = i - 1;\n list.removeItem(i);\n break;\n }\n }\n\n let num = (index - lastM) - 1;\n\n while (num--) {\n insertItemBefore(elem, list.getItem(lastM), zSeg);\n }\n\n const pt = list.getItem(lastM);\n\n // Make this point the new \"M\"\n replacePathSeg(2, lastM, [pt.x, pt.y]);\n\n // i = index; // i is local here, so has no effect; what was the intent for this?\n\n path.init().selectPt(0);\n },\n /**\n * @returns {void}\n */\n deletePathNode () {\n if (!pathActions.canDeleteNodes) { return; }\n path.storeD();\n\n const selPts = path.selected_pts;\n\n let i = selPts.length;\n while (i--) {\n const pt = selPts[i];\n path.deleteSeg(pt);\n }\n\n // Cleanup\n const cleanup = function () {\n const segList = path.elem.pathSegList;\n let len = segList.numberOfItems;\n\n const remItems = function (pos, count) {\n while (count--) {\n segList.removeItem(pos);\n }\n };\n\n if (len <= 1) { return true; }\n\n while (len--) {\n const item = segList.getItem(len);\n if (item.pathSegType === 1) {\n const prev = segList.getItem(len - 1);\n const nprev = segList.getItem(len - 2);\n if (prev.pathSegType === 2) {\n remItems(len - 1, 2);\n cleanup();\n break;\n } else if (nprev.pathSegType === 2) {\n remItems(len - 2, 3);\n cleanup();\n break;\n }\n } else if (item.pathSegType === 2) {\n if (len > 0) {\n const prevType = segList.getItem(len - 1).pathSegType;\n // Path has M M\n if (prevType === 2) {\n remItems(len - 1, 1);\n cleanup();\n break;\n // Entire path ends with Z M\n } else if (prevType === 1 && segList.numberOfItems - 1 === len) {\n remItems(len, 1);\n cleanup();\n break;\n }\n }\n }\n }\n return false;\n };\n\n cleanup();\n\n // Completely delete a path with 1 or 0 segments\n if (path.elem.pathSegList.numberOfItems <= 1) {\n pathActions.toSelectMode(path.elem);\n editorContext_.canvas.deleteSelectedElements();\n return;\n }\n\n path.init();\n path.clearSelection();\n\n // TODO: Find right way to select point now\n // path.selectPt(selPt);\n if (window.opera) { // Opera repaints incorrectly\n const cp = $(path.elem);\n cp.attr('d', cp.attr('d'));\n }\n path.endChanges('Delete path node(s)');\n },\n /* eslint-disable jsdoc/require-returns */\n // Can't seem to use `@borrows` here, so using `@see`\n /**\n * Smooth polyline into path.\n * @function module:path.pathActions.smoothPolylineIntoPath\n * @see module:path~smoothPolylineIntoPath\n */\n smoothPolylineIntoPath,\n /* eslint-enable jsdoc/require-returns */\n /**\n * @param {?Integer} v See {@link https://www.w3.org/TR/SVG/single-page.html#paths-InterfaceSVGPathSeg}\n * @returns {void}\n */\n setSegType (v) {\n path.setSegType(v);\n },\n /**\n * @param {string} attr\n * @param {Float} newValue\n * @returns {void}\n */\n moveNode (attr, newValue) {\n const selPts = path.selected_pts;\n if (!selPts.length) { return; }\n\n path.storeD();\n\n // Get first selected point\n const seg = path.segs[selPts[0]];\n const diff = {x: 0, y: 0};\n diff[attr] = newValue - seg.item[attr];\n\n seg.move(diff.x, diff.y);\n path.endChanges('Move path point');\n },\n /**\n * @param {Element} elem\n * @returns {void}\n */\n fixEnd (elem) {\n // Adds an extra segment if the last seg before a Z doesn't end\n // at its M point\n // M0,0 L0,100 L100,100 z\n const segList = elem.pathSegList;\n const len = segList.numberOfItems;\n let lastM;\n for (let i = 0; i < len; ++i) {\n const item = segList.getItem(i);\n if (item.pathSegType === 2) {\n lastM = item;\n }\n\n if (item.pathSegType === 1) {\n const prev = segList.getItem(i - 1);\n if (prev.x !== lastM.x || prev.y !== lastM.y) {\n // Add an L segment here\n const newseg = elem.createSVGPathSegLinetoAbs(lastM.x, lastM.y);\n insertItemBefore(elem, newseg, i);\n // Can this be done better?\n pathActions.fixEnd(elem);\n break;\n }\n }\n }\n if (isWebkit()) { editorContext_.resetD(elem); }\n },\n /* eslint-disable jsdoc/require-returns */\n // Can't seem to use `@borrows` here, so using `@see`\n /**\n * Convert a path to one with only absolute or relative values.\n * @function module:path.pathActions.convertPath\n * @see module:path.convertPath\n */\n convertPath\n /* eslint-enable jsdoc/require-returns */\n });\n})();\n// end pathActions\n","/* globals jQuery */\n/**\n * Provides tools for the layer concept.\n * @module layer\n * @license MIT\n *\n * @copyright 2011 Jeff Schiller, 2016 Flint O'Brien\n */\n\nimport {NS} from './namespaces.js';\nimport {toXml, walkTree, isNullish} from './utilities.js';\n\nconst $ = jQuery;\n\n/**\n * This class encapsulates the concept of a layer in the drawing. It can be constructed with\n * an existing group element or, with three parameters, will create a new layer group element.\n *\n * @example\n * const l1 = new Layer('name', group); // Use the existing group for this layer.\n * const l2 = new Layer('name', group, svgElem); // Create a new group and add it to the DOM after group.\n * const l3 = new Layer('name', null, svgElem); // Create a new group and add it to the DOM as the last layer.\n * @memberof module:layer\n */\nclass Layer {\n /**\n * @param {string} name - Layer name\n * @param {SVGGElement|null} group - An existing SVG group element or null.\n * If group and no svgElem, use group for this layer.\n * If group and svgElem, create a new group element and insert it in the DOM after group.\n * If no group and svgElem, create a new group element and insert it in the DOM as the last layer.\n * @param {SVGGElement} [svgElem] - The SVG DOM element. If defined, use this to add\n * a new layer to the document.\n */\n constructor (name, group, svgElem) {\n this.name_ = name;\n this.group_ = svgElem ? null : group;\n\n if (svgElem) {\n // Create a group element with title and add it to the DOM.\n const svgdoc = svgElem.ownerDocument;\n this.group_ = svgdoc.createElementNS(NS.SVG, 'g');\n const layerTitle = svgdoc.createElementNS(NS.SVG, 'title');\n layerTitle.textContent = name;\n this.group_.append(layerTitle);\n if (group) {\n $(group).after(this.group_);\n } else {\n svgElem.append(this.group_);\n }\n }\n\n addLayerClass(this.group_);\n walkTree(this.group_, function (e) {\n e.setAttribute('style', 'pointer-events:inherit');\n });\n\n this.group_.setAttribute('style', svgElem ? 'pointer-events:all' : 'pointer-events:none');\n }\n\n /**\n * Get the layer's name.\n * @returns {string} The layer name\n */\n getName () {\n return this.name_;\n }\n\n /**\n * Get the group element for this layer.\n * @returns {SVGGElement} The layer SVG group\n */\n getGroup () {\n return this.group_;\n }\n\n /**\n * Active this layer so it takes pointer events.\n * @returns {void}\n */\n activate () {\n this.group_.setAttribute('style', 'pointer-events:all');\n }\n\n /**\n * Deactive this layer so it does NOT take pointer events.\n * @returns {void}\n */\n deactivate () {\n this.group_.setAttribute('style', 'pointer-events:none');\n }\n\n /**\n * Set this layer visible or hidden based on 'visible' parameter.\n * @param {boolean} visible - If true, make visible; otherwise, hide it.\n * @returns {void}\n */\n setVisible (visible) {\n const expected = visible === undefined || visible ? 'inline' : 'none';\n const oldDisplay = this.group_.getAttribute('display');\n if (oldDisplay !== expected) {\n this.group_.setAttribute('display', expected);\n }\n }\n\n /**\n * Is this layer visible?\n * @returns {boolean} True if visible.\n */\n isVisible () {\n return this.group_.getAttribute('display') !== 'none';\n }\n\n /**\n * Get layer opacity.\n * @returns {Float} Opacity value.\n */\n getOpacity () {\n const opacity = this.group_.getAttribute('opacity');\n if (isNullish(opacity)) {\n return 1;\n }\n return Number.parseFloat(opacity);\n }\n\n /**\n * Sets the opacity of this layer. If opacity is not a value between 0.0 and 1.0,\n * nothing happens.\n * @param {Float} opacity - A float value in the range 0.0-1.0\n * @returns {void}\n */\n setOpacity (opacity) {\n if (typeof opacity === 'number' && opacity >= 0.0 && opacity <= 1.0) {\n this.group_.setAttribute('opacity', opacity);\n }\n }\n\n /**\n * Append children to this layer.\n * @param {SVGGElement} children - The children to append to this layer.\n * @returns {void}\n */\n appendChildren (children) {\n for (const child of children) {\n this.group_.append(child);\n }\n }\n\n /**\n * @returns {SVGTitleElement|null}\n */\n getTitleElement () {\n const len = this.group_.childNodes.length;\n for (let i = 0; i < len; ++i) {\n const child = this.group_.childNodes.item(i);\n if (child && child.tagName === 'title') {\n return child;\n }\n }\n return null;\n }\n\n /**\n * Set the name of this layer.\n * @param {string} name - The new name.\n * @param {module:history.HistoryRecordingService} hrService - History recording service\n * @returns {string|null} The new name if changed; otherwise, null.\n */\n setName (name, hrService) {\n const previousName = this.name_;\n name = toXml(name);\n // now change the underlying title element contents\n const title = this.getTitleElement();\n if (title) {\n $(title).empty();\n title.textContent = name;\n this.name_ = name;\n if (hrService) {\n hrService.changeElement(title, {'#text': previousName});\n }\n return this.name_;\n }\n return null;\n }\n\n /**\n * Remove this layer's group from the DOM. No more functions on group can be called after this.\n * @returns {SVGGElement} The layer SVG group that was just removed.\n */\n removeGroup () {\n const group = this.group_;\n this.group_.remove();\n this.group_ = undefined;\n return group;\n }\n}\n/**\n * @property {string} CLASS_NAME - class attribute assigned to all layer groups.\n */\nLayer.CLASS_NAME = 'layer';\n\n/**\n * @property {RegExp} CLASS_REGEX - Used to test presence of class Layer.CLASS_NAME\n */\nLayer.CLASS_REGEX = new RegExp('(\\\\s|^)' + Layer.CLASS_NAME + '(\\\\s|$)');\n\n/**\n * Add class `Layer.CLASS_NAME` to the element (usually `class='layer'`).\n *\n * @param {SVGGElement} elem - The SVG element to update\n * @returns {void}\n */\nfunction addLayerClass (elem) {\n const classes = elem.getAttribute('class');\n if (isNullish(classes) || !classes.length) {\n elem.setAttribute('class', Layer.CLASS_NAME);\n } else if (!Layer.CLASS_REGEX.test(classes)) {\n elem.setAttribute('class', classes + ' ' + Layer.CLASS_NAME);\n }\n}\n\nexport default Layer;\n","/**\n * HistoryRecordingService component of history.\n * @module history\n * @license MIT\n * @copyright 2016 Flint O'Brien\n */\n\nimport {\n BatchCommand, MoveElementCommand, InsertElementCommand, RemoveElementCommand,\n ChangeElementCommand\n} from './history.js';\n\n/**\n * History recording service.\n *\n * A self-contained service interface for recording history. Once injected, no other dependencies\n * or globals are required (example: UndoManager, command types, etc.). Easy to mock for unit tests.\n * Built on top of history classes in history.js.\n *\n * There is a simple start/end interface for batch commands.\n *\n * HistoryRecordingService.NO_HISTORY is a singleton that can be passed in to functions\n * that record history. This helps when the caller requires that no history be recorded.\n *\n * The following will record history: insert, batch, insert.\n * @example\n * hrService = new HistoryRecordingService(this.undoMgr);\n * hrService.insertElement(elem, text); // add simple command to history.\n * hrService.startBatchCommand('create two elements');\n * hrService.changeElement(elem, attrs, text); // add to batchCommand\n * hrService.changeElement(elem, attrs2, text); // add to batchCommand\n * hrService.endBatchCommand(); // add batch command with two change commands to history.\n * hrService.insertElement(elem, text); // add simple command to history.\n *\n * @example\n * // Note that all functions return this, so commands can be chained, like so:\n * hrService\n * .startBatchCommand('create two elements')\n * .insertElement(elem, text)\n * .changeElement(elem, attrs, text)\n * .endBatchCommand();\n *\n * @memberof module:history\n */\nclass HistoryRecordingService {\n /**\n * @param {history.UndoManager|null} undoManager - The undo manager.\n * A value of `null` is valid for cases where no history recording is required.\n * See singleton: {@link module:history.HistoryRecordingService.HistoryRecordingService.NO_HISTORY}\n */\n constructor (undoManager) {\n this.undoManager_ = undoManager;\n this.currentBatchCommand_ = null;\n this.batchCommandStack_ = [];\n }\n\n /**\n * Start a batch command so multiple commands can recorded as a single history command.\n * Requires a corresponding call to endBatchCommand. Start and end commands can be nested.\n *\n * @param {string} text - Optional string describing the batch command.\n * @returns {module:history.HistoryRecordingService}\n */\n startBatchCommand (text) {\n if (!this.undoManager_) { return this; }\n this.currentBatchCommand_ = new BatchCommand(text);\n this.batchCommandStack_.push(this.currentBatchCommand_);\n return this;\n }\n\n /**\n * End a batch command and add it to the history or a parent batch command.\n * @returns {module:history.HistoryRecordingService}\n */\n endBatchCommand () {\n if (!this.undoManager_) { return this; }\n if (this.currentBatchCommand_) {\n const batchCommand = this.currentBatchCommand_;\n this.batchCommandStack_.pop();\n const {length: len} = this.batchCommandStack_;\n this.currentBatchCommand_ = len ? this.batchCommandStack_[len - 1] : null;\n this.addCommand_(batchCommand);\n }\n return this;\n }\n\n /**\n * Add a `MoveElementCommand` to the history or current batch command.\n * @param {Element} elem - The DOM element that was moved\n * @param {Element} oldNextSibling - The element's next sibling before it was moved\n * @param {Element} oldParent - The element's parent before it was moved\n * @param {string} [text] - An optional string visible to user related to this change\n * @returns {module:history.HistoryRecordingService}\n */\n moveElement (elem, oldNextSibling, oldParent, text) {\n if (!this.undoManager_) { return this; }\n this.addCommand_(new MoveElementCommand(elem, oldNextSibling, oldParent, text));\n return this;\n }\n\n /**\n * Add an `InsertElementCommand` to the history or current batch command.\n * @param {Element} elem - The DOM element that was added\n * @param {string} [text] - An optional string visible to user related to this change\n * @returns {module:history.HistoryRecordingService}\n */\n insertElement (elem, text) {\n if (!this.undoManager_) { return this; }\n this.addCommand_(new InsertElementCommand(elem, text));\n return this;\n }\n\n /**\n * Add a `RemoveElementCommand` to the history or current batch command.\n * @param {Element} elem - The DOM element that was removed\n * @param {Element} oldNextSibling - The element's next sibling before it was removed\n * @param {Element} oldParent - The element's parent before it was removed\n * @param {string} [text] - An optional string visible to user related to this change\n * @returns {module:history.HistoryRecordingService}\n */\n removeElement (elem, oldNextSibling, oldParent, text) {\n if (!this.undoManager_) { return this; }\n this.addCommand_(new RemoveElementCommand(elem, oldNextSibling, oldParent, text));\n return this;\n }\n\n /**\n * Add a `ChangeElementCommand` to the history or current batch command.\n * @param {Element} elem - The DOM element that was changed\n * @param {module:history.CommandAttributes} attrs - An object with the attributes to be changed and the values they had *before* the change\n * @param {string} [text] - An optional string visible to user related to this change\n * @returns {module:history.HistoryRecordingService}\n */\n changeElement (elem, attrs, text) {\n if (!this.undoManager_) { return this; }\n this.addCommand_(new ChangeElementCommand(elem, attrs, text));\n return this;\n }\n\n /**\n * Private function to add a command to the history or current batch command.\n * @private\n * @param {Command} cmd\n * @returns {module:history.HistoryRecordingService|void}\n */\n addCommand_ (cmd) {\n if (!this.undoManager_) { return this; }\n if (this.currentBatchCommand_) {\n this.currentBatchCommand_.addSubCommand(cmd);\n } else {\n this.undoManager_.addCommandToHistory(cmd);\n }\n return undefined;\n }\n}\n/**\n * @memberof module:history.HistoryRecordingService\n * @property {module:history.HistoryRecordingService} NO_HISTORY - Singleton that can be passed to functions that record history, but the caller requires that no history be recorded.\n */\nHistoryRecordingService.NO_HISTORY = new HistoryRecordingService();\nexport default HistoryRecordingService;\n","/* globals jQuery */\n\nimport jQueryPluginSVG from '../common/jQuery.attr.js'; // Needed for SVG attribute setting and array form with `attr`\nimport {isWebkit} from '../common/browser.js';\nimport {convertPath} from './path.js';\nimport {preventClickDefault} from '../common/utilities.js';\n\n// Constants\nconst $ = jQueryPluginSVG(jQuery);\n\n/**\n * Create a clone of an element, updating its ID and its children's IDs when needed.\n * @function module:utilities.copyElem\n * @param {Element} el - DOM element to clone\n * @param {module:utilities.GetNextID} getNextId - The getter of the next unique ID.\n * @returns {Element} The cloned element\n */\nexport const copyElem = function (el, getNextId) {\n // manually create a copy of the element\n const newEl = document.createElementNS(el.namespaceURI, el.nodeName);\n $.each(el.attributes, function (i, attr) {\n if (attr.localName !== '-moz-math-font-style') {\n newEl.setAttributeNS(attr.namespaceURI, attr.nodeName, attr.value);\n }\n });\n // set the copied element's new id\n newEl.removeAttribute('id');\n newEl.id = getNextId();\n\n // Opera's \"d\" value needs to be reset for Opera/Win/non-EN\n // Also needed for webkit (else does not keep curved segments on clone)\n if (isWebkit() && el.nodeName === 'path') {\n const fixedD = convertPath(el);\n newEl.setAttribute('d', fixedD);\n }\n\n // now create copies of all children\n $.each(el.childNodes, function (i, child) {\n switch (child.nodeType) {\n case 1: // element node\n newEl.append(copyElem(child, getNextId));\n break;\n case 3: // text node\n newEl.textContent = child.nodeValue;\n break;\n default:\n break;\n }\n });\n\n if ($(el).data('gsvg')) {\n $(newEl).data('gsvg', newEl.firstChild);\n } else if ($(el).data('symbol')) {\n const ref = $(el).data('symbol');\n $(newEl).data('ref', ref).data('symbol', ref);\n } else if (newEl.tagName === 'image') {\n preventClickDefault(newEl);\n }\n\n return newEl;\n};\n","/* globals jQuery */\n/**\n * Tools for drawing.\n * @module draw\n * @license MIT\n * @copyright 2011 Jeff Schiller\n */\n\nimport Layer from '../common/layer.js';\nimport HistoryRecordingService from './historyrecording.js';\n\nimport {NS} from '../common/namespaces.js';\nimport {isOpera} from '../common/browser.js';\nimport {\n toXml, getElem\n} from '../common/utilities.js';\nimport {\n copyElem as utilCopyElem\n} from './copy-elem.js';\nimport {\n BatchCommand, RemoveElementCommand, MoveElementCommand, ChangeElementCommand\n} from './history.js';\n\nconst $ = jQuery;\n\nconst visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use'.split(',');\n\nconst RandomizeModes = {\n LET_DOCUMENT_DECIDE: 0,\n ALWAYS_RANDOMIZE: 1,\n NEVER_RANDOMIZE: 2\n};\nlet randIds = RandomizeModes.LET_DOCUMENT_DECIDE;\n// Array with current disabled elements (for in-group editing)\nlet disabledElems = [];\n\n/**\n * Get a HistoryRecordingService.\n * @param {module:history.HistoryRecordingService} [hrService] - if exists, return it instead of creating a new service.\n * @returns {module:history.HistoryRecordingService}\n */\nfunction historyRecordingService (hrService) {\n return hrService || new HistoryRecordingService(canvas_.undoMgr);\n}\n\n/**\n * Find the layer name in a group element.\n * @param {Element} group The group element to search in.\n * @returns {string} The layer name or empty string.\n */\nfunction findLayerNameInGroup (group) {\n return $('title', group).text() ||\n (isOpera() && group.querySelectorAll\n // Hack for Opera 10.60\n ? $(group.querySelectorAll('title')).text()\n : '');\n}\n\n/**\n * Given a set of names, return a new unique name.\n * @param {string[]} existingLayerNames - Existing layer names.\n * @returns {string} - The new name.\n */\nfunction getNewLayerName (existingLayerNames) {\n let i = 1;\n // TODO(codedread): What about internationalization of \"Layer\"?\n while (existingLayerNames.includes(('Layer ' + i))) { i++; }\n return 'Layer ' + i;\n}\n\n/**\n * This class encapsulates the concept of a SVG-edit drawing.\n */\nexport class Drawing {\n /**\n * @param {SVGSVGElement} svgElem - The SVG DOM Element that this JS object\n * encapsulates. If the svgElem has a se:nonce attribute on it, then\n * IDs will use the nonce as they are generated.\n * @param {string} [optIdPrefix=svg_] - The ID prefix to use.\n * @throws {Error} If not initialized with an SVG element\n */\n constructor (svgElem, optIdPrefix) {\n if (!svgElem || !svgElem.tagName || !svgElem.namespaceURI ||\n svgElem.tagName !== 'svg' || svgElem.namespaceURI !== NS.SVG) {\n throw new Error('Error: svgedit.draw.Drawing instance initialized without a element');\n }\n\n /**\n * The SVG DOM Element that represents this drawing.\n * @type {SVGSVGElement}\n */\n this.svgElem_ = svgElem;\n\n /**\n * The latest object number used in this drawing.\n * @type {Integer}\n */\n this.obj_num = 0;\n\n /**\n * The prefix to prepend to each element id in the drawing.\n * @type {string}\n */\n this.idPrefix = optIdPrefix || 'svg_';\n\n /**\n * An array of released element ids to immediately reuse.\n * @type {Integer[]}\n */\n this.releasedNums = [];\n\n /**\n * The z-ordered array of Layer objects. Each layer has a name\n * and group element.\n * The first layer is the one at the bottom of the rendering.\n * @type {Layer[]}\n */\n this.all_layers = [];\n\n /**\n * Map of all_layers by name.\n *\n * Note: Layers are ordered, but referenced externally by name; so, we need both container\n * types depending on which function is called (i.e. all_layers and layer_map).\n *\n * @type {PlainObject}\n */\n this.layer_map = {};\n\n /**\n * The current layer being used.\n * @type {Layer}\n */\n this.current_layer = null;\n\n /**\n * The nonce to use to uniquely identify elements across drawings.\n * @type {!string}\n */\n this.nonce_ = '';\n const n = this.svgElem_.getAttributeNS(NS.SE, 'nonce');\n // If already set in the DOM, use the nonce throughout the document\n // else, if randomizeIds(true) has been called, create and set the nonce.\n if (n && randIds !== RandomizeModes.NEVER_RANDOMIZE) {\n this.nonce_ = n;\n } else if (randIds === RandomizeModes.ALWAYS_RANDOMIZE) {\n this.setNonce(Math.floor(Math.random() * 100001));\n }\n }\n\n /**\n * @param {string} id Element ID to retrieve\n * @returns {Element} SVG element within the root SVGSVGElement\n */\n getElem_ (id) {\n if (this.svgElem_.querySelector) {\n // querySelector lookup\n return this.svgElem_.querySelector('#' + id);\n }\n // jQuery lookup: twice as slow as xpath in FF\n return $(this.svgElem_).find('[id=' + id + ']')[0];\n }\n\n /**\n * @returns {SVGSVGElement}\n */\n getSvgElem () {\n return this.svgElem_;\n }\n\n /**\n * @returns {!(string|Integer)} The previously set nonce\n */\n getNonce () {\n return this.nonce_;\n }\n\n /**\n * @param {!(string|Integer)} n The nonce to set\n * @returns {void}\n */\n setNonce (n) {\n this.svgElem_.setAttributeNS(NS.XMLNS, 'xmlns:se', NS.SE);\n this.svgElem_.setAttributeNS(NS.SE, 'se:nonce', n);\n this.nonce_ = n;\n }\n\n /**\n * Clears any previously set nonce.\n * @returns {void}\n */\n clearNonce () {\n // We deliberately leave any se:nonce attributes alone,\n // we just don't use it to randomize ids.\n this.nonce_ = '';\n }\n\n /**\n * Returns the latest object id as a string.\n * @returns {string} The latest object Id.\n */\n getId () {\n return this.nonce_\n ? this.idPrefix + this.nonce_ + '_' + this.obj_num\n : this.idPrefix + this.obj_num;\n }\n\n /**\n * Returns the next object Id as a string.\n * @returns {string} The next object Id to use.\n */\n getNextId () {\n const oldObjNum = this.obj_num;\n let restoreOldObjNum = false;\n\n // If there are any released numbers in the release stack,\n // use the last one instead of the next obj_num.\n // We need to temporarily use obj_num as that is what getId() depends on.\n if (this.releasedNums.length > 0) {\n this.obj_num = this.releasedNums.pop();\n restoreOldObjNum = true;\n } else {\n // If we are not using a released id, then increment the obj_num.\n this.obj_num++;\n }\n\n // Ensure the ID does not exist.\n let id = this.getId();\n while (this.getElem_(id)) {\n if (restoreOldObjNum) {\n this.obj_num = oldObjNum;\n restoreOldObjNum = false;\n }\n this.obj_num++;\n id = this.getId();\n }\n // Restore the old object number if required.\n if (restoreOldObjNum) {\n this.obj_num = oldObjNum;\n }\n return id;\n }\n\n /**\n * Releases the object Id, letting it be used as the next id in getNextId().\n * This method DOES NOT remove any elements from the DOM, it is expected\n * that client code will do this.\n * @param {string} id - The id to release.\n * @returns {boolean} True if the id was valid to be released, false otherwise.\n */\n releaseId (id) {\n // confirm if this is a valid id for this Document, else return false\n const front = this.idPrefix + (this.nonce_ ? this.nonce_ + '_' : '');\n if (typeof id !== 'string' || !id.startsWith(front)) {\n return false;\n }\n // extract the obj_num of this id\n const num = Number.parseInt(id.substr(front.length));\n\n // if we didn't get a positive number or we already released this number\n // then return false.\n if (typeof num !== 'number' || num <= 0 || this.releasedNums.includes(num)) {\n return false;\n }\n\n // push the released number into the released queue\n this.releasedNums.push(num);\n\n return true;\n }\n\n /**\n * Returns the number of layers in the current drawing.\n * @returns {Integer} The number of layers in the current drawing.\n */\n getNumLayers () {\n return this.all_layers.length;\n }\n\n /**\n * Check if layer with given name already exists.\n * @param {string} name - The layer name to check\n * @returns {boolean}\n */\n hasLayer (name) {\n return this.layer_map[name] !== undefined;\n }\n\n /**\n * Returns the name of the ith layer. If the index is out of range, an empty string is returned.\n * @param {Integer} i - The zero-based index of the layer you are querying.\n * @returns {string} The name of the ith layer (or the empty string if none found)\n */\n getLayerName (i) {\n return i >= 0 && i < this.getNumLayers() ? this.all_layers[i].getName() : '';\n }\n\n /**\n * @returns {SVGGElement|null} The SVGGElement representing the current layer.\n */\n getCurrentLayer () {\n return this.current_layer ? this.current_layer.getGroup() : null;\n }\n\n /**\n * Get a layer by name.\n * @param {string} name\n * @returns {SVGGElement} The SVGGElement representing the named layer or null.\n */\n getLayerByName (name) {\n const layer = this.layer_map[name];\n return layer ? layer.getGroup() : null;\n }\n\n /**\n * Returns the name of the currently selected layer. If an error occurs, an empty string\n * is returned.\n * @returns {string} The name of the currently active layer (or the empty string if none found).\n */\n getCurrentLayerName () {\n return this.current_layer ? this.current_layer.getName() : '';\n }\n\n /**\n * Set the current layer's name.\n * @param {string} name - The new name.\n * @param {module:history.HistoryRecordingService} hrService - History recording service\n * @returns {string|null} The new name if changed; otherwise, null.\n */\n setCurrentLayerName (name, hrService) {\n let finalName = null;\n if (this.current_layer) {\n const oldName = this.current_layer.getName();\n finalName = this.current_layer.setName(name, hrService);\n if (finalName) {\n delete this.layer_map[oldName];\n this.layer_map[finalName] = this.current_layer;\n }\n }\n return finalName;\n }\n\n /**\n * Set the current layer's position.\n * @param {Integer} newpos - The zero-based index of the new position of the layer. Range should be 0 to layers-1\n * @returns {{title: SVGGElement, previousName: string}|null} If the name was changed, returns {title:SVGGElement, previousName:string}; otherwise null.\n */\n setCurrentLayerPosition (newpos) {\n const layerCount = this.getNumLayers();\n if (!this.current_layer || newpos < 0 || newpos >= layerCount) {\n return null;\n }\n\n let oldpos;\n for (oldpos = 0; oldpos < layerCount; ++oldpos) {\n if (this.all_layers[oldpos] === this.current_layer) { break; }\n }\n // some unknown error condition (current_layer not in all_layers)\n if (oldpos === layerCount) { return null; }\n\n if (oldpos !== newpos) {\n // if our new position is below us, we need to insert before the node after newpos\n const currentGroup = this.current_layer.getGroup();\n const oldNextSibling = currentGroup.nextSibling;\n\n let refGroup = null;\n if (newpos > oldpos) {\n if (newpos < layerCount - 1) {\n refGroup = this.all_layers[newpos + 1].getGroup();\n }\n // if our new position is above us, we need to insert before the node at newpos\n } else {\n refGroup = this.all_layers[newpos].getGroup();\n }\n this.svgElem_.insertBefore(currentGroup, refGroup); // Ok to replace with `refGroup.before(currentGroup);`?\n\n this.identifyLayers();\n this.setCurrentLayer(this.getLayerName(newpos));\n\n return {\n currentGroup,\n oldNextSibling\n };\n }\n return null;\n }\n\n /**\n * @param {module:history.HistoryRecordingService} hrService\n * @returns {void}\n */\n mergeLayer (hrService) {\n const currentGroup = this.current_layer.getGroup();\n const prevGroup = $(currentGroup).prev()[0];\n if (!prevGroup) { return; }\n\n hrService.startBatchCommand('Merge Layer');\n\n const layerNextSibling = currentGroup.nextSibling;\n hrService.removeElement(currentGroup, layerNextSibling, this.svgElem_);\n\n while (currentGroup.firstChild) {\n const child = currentGroup.firstChild;\n if (child.localName === 'title') {\n hrService.removeElement(child, child.nextSibling, currentGroup);\n child.remove();\n continue;\n }\n const oldNextSibling = child.nextSibling;\n prevGroup.append(child);\n hrService.moveElement(child, oldNextSibling, currentGroup);\n }\n\n // Remove current layer's group\n this.current_layer.removeGroup();\n // Remove the current layer and set the previous layer as the new current layer\n const index = this.all_layers.indexOf(this.current_layer);\n if (index > 0) {\n const name = this.current_layer.getName();\n this.current_layer = this.all_layers[index - 1];\n this.all_layers.splice(index, 1);\n delete this.layer_map[name];\n }\n\n hrService.endBatchCommand();\n }\n\n /**\n * @param {module:history.HistoryRecordingService} hrService\n * @returns {void}\n */\n mergeAllLayers (hrService) {\n // Set the current layer to the last layer.\n this.current_layer = this.all_layers[this.all_layers.length - 1];\n\n hrService.startBatchCommand('Merge all Layers');\n while (this.all_layers.length > 1) {\n this.mergeLayer(hrService);\n }\n hrService.endBatchCommand();\n }\n\n /**\n * Sets the current layer. If the name is not a valid layer name, then this\n * function returns `false`. Otherwise it returns `true`. This is not an\n * undo-able action.\n * @param {string} name - The name of the layer you want to switch to.\n * @returns {boolean} `true` if the current layer was switched, otherwise `false`\n */\n setCurrentLayer (name) {\n const layer = this.layer_map[name];\n if (layer) {\n if (this.current_layer) {\n this.current_layer.deactivate();\n }\n this.current_layer = layer;\n this.current_layer.activate();\n return true;\n }\n return false;\n }\n\n /**\n * Deletes the current layer from the drawing and then clears the selection.\n * This function then calls the 'changed' handler. This is an undoable action.\n * @todo Does this actually call the 'changed' handler?\n * @returns {SVGGElement} The SVGGElement of the layer removed or null.\n */\n deleteCurrentLayer () {\n if (this.current_layer && this.getNumLayers() > 1) {\n const oldLayerGroup = this.current_layer.removeGroup();\n this.identifyLayers();\n return oldLayerGroup;\n }\n return null;\n }\n\n /**\n * Updates layer system and sets the current layer to the\n * top-most layer (last `` child of this drawing).\n * @returns {void}\n */\n identifyLayers () {\n this.all_layers = [];\n this.layer_map = {};\n const numchildren = this.svgElem_.childNodes.length;\n // loop through all children of SVG element\n const orphans = [], layernames = [];\n let layer = null;\n let childgroups = false;\n for (let i = 0; i < numchildren; ++i) {\n const child = this.svgElem_.childNodes.item(i);\n // for each g, find its layer name\n if (child && child.nodeType === 1) {\n if (child.tagName === 'g') {\n childgroups = true;\n const name = findLayerNameInGroup(child);\n if (name) {\n layernames.push(name);\n layer = new Layer(name, child);\n this.all_layers.push(layer);\n this.layer_map[name] = layer;\n } else {\n // if group did not have a name, it is an orphan\n orphans.push(child);\n }\n } else if (visElems.includes(child.nodeName)) {\n // Child is \"visible\" (i.e. not a or element), so it is an orphan\n orphans.push(child);\n }\n }\n }\n\n // If orphans or no layers found, create a new layer and add all the orphans to it\n if (orphans.length > 0 || !childgroups) {\n layer = new Layer(getNewLayerName(layernames), null, this.svgElem_);\n layer.appendChildren(orphans);\n this.all_layers.push(layer);\n this.layer_map[name] = layer;\n } else {\n layer.activate();\n }\n this.current_layer = layer;\n }\n\n /**\n * Creates a new top-level layer in the drawing with the given name and\n * makes it the current layer.\n * @param {string} name - The given name. If the layer name exists, a new name will be generated.\n * @param {module:history.HistoryRecordingService} hrService - History recording service\n * @returns {SVGGElement} The SVGGElement of the new layer, which is\n * also the current layer of this drawing.\n */\n createLayer (name, hrService) {\n if (this.current_layer) {\n this.current_layer.deactivate();\n }\n // Check for duplicate name.\n if (name === undefined || name === null || name === '' || this.layer_map[name]) {\n name = getNewLayerName(Object.keys(this.layer_map));\n }\n\n // Crate new layer and add to DOM as last layer\n const layer = new Layer(name, null, this.svgElem_);\n // Like to assume hrService exists, but this is backwards compatible with old version of createLayer.\n if (hrService) {\n hrService.startBatchCommand('Create Layer');\n hrService.insertElement(layer.getGroup());\n hrService.endBatchCommand();\n }\n\n this.all_layers.push(layer);\n this.layer_map[name] = layer;\n this.current_layer = layer;\n return layer.getGroup();\n }\n\n /**\n * Creates a copy of the current layer with the given name and makes it the current layer.\n * @param {string} name - The given name. If the layer name exists, a new name will be generated.\n * @param {module:history.HistoryRecordingService} hrService - History recording service\n * @returns {SVGGElement} The SVGGElement of the new layer, which is\n * also the current layer of this drawing.\n */\n cloneLayer (name, hrService) {\n if (!this.current_layer) { return null; }\n this.current_layer.deactivate();\n // Check for duplicate name.\n if (name === undefined || name === null || name === '' || this.layer_map[name]) {\n name = getNewLayerName(Object.keys(this.layer_map));\n }\n\n // Create new group and add to DOM just after current_layer\n const currentGroup = this.current_layer.getGroup();\n const layer = new Layer(name, currentGroup, this.svgElem_);\n const group = layer.getGroup();\n\n // Clone children\n const children = [...currentGroup.childNodes];\n children.forEach((child) => {\n if (child.localName === 'title') { return; }\n group.append(this.copyElem(child));\n });\n\n if (hrService) {\n hrService.startBatchCommand('Duplicate Layer');\n hrService.insertElement(group);\n hrService.endBatchCommand();\n }\n\n // Update layer containers and current_layer.\n const index = this.all_layers.indexOf(this.current_layer);\n if (index >= 0) {\n this.all_layers.splice(index + 1, 0, layer);\n } else {\n this.all_layers.push(layer);\n }\n this.layer_map[name] = layer;\n this.current_layer = layer;\n return group;\n }\n\n /**\n * Returns whether the layer is visible. If the layer name is not valid,\n * then this function returns `false`.\n * @param {string} layerName - The name of the layer which you want to query.\n * @returns {boolean} The visibility state of the layer, or `false` if the layer name was invalid.\n */\n getLayerVisibility (layerName) {\n const layer = this.layer_map[layerName];\n return layer ? layer.isVisible() : false;\n }\n\n /**\n * Sets the visibility of the layer. If the layer name is not valid, this\n * function returns `null`, otherwise it returns the `SVGElement` representing\n * the layer. This is an undo-able action.\n * @param {string} layerName - The name of the layer to change the visibility\n * @param {boolean} bVisible - Whether the layer should be visible\n * @returns {?SVGGElement} The SVGGElement representing the layer if the\n * `layerName` was valid, otherwise `null`.\n */\n setLayerVisibility (layerName, bVisible) {\n if (typeof bVisible !== 'boolean') {\n return null;\n }\n const layer = this.layer_map[layerName];\n if (!layer) { return null; }\n layer.setVisible(bVisible);\n return layer.getGroup();\n }\n\n /**\n * Returns the opacity of the given layer. If the input name is not a layer, `null` is returned.\n * @param {string} layerName - name of the layer on which to get the opacity\n * @returns {?Float} The opacity value of the given layer. This will be a value between 0.0 and 1.0, or `null`\n * if `layerName` is not a valid layer\n */\n getLayerOpacity (layerName) {\n const layer = this.layer_map[layerName];\n if (!layer) { return null; }\n return layer.getOpacity();\n }\n\n /**\n * Sets the opacity of the given layer. If the input name is not a layer,\n * nothing happens. If opacity is not a value between 0.0 and 1.0, then\n * nothing happens.\n * NOTE: this function exists solely to apply a highlighting/de-emphasis\n * effect to a layer. When it is possible for a user to affect the opacity\n * of a layer, we will need to allow this function to produce an undo-able\n * action.\n * @param {string} layerName - Name of the layer on which to set the opacity\n * @param {Float} opacity - A float value in the range 0.0-1.0\n * @returns {void}\n */\n setLayerOpacity (layerName, opacity) {\n if (typeof opacity !== 'number' || opacity < 0.0 || opacity > 1.0) {\n return;\n }\n const layer = this.layer_map[layerName];\n if (layer) {\n layer.setOpacity(opacity);\n }\n }\n\n /**\n * Create a clone of an element, updating its ID and its children's IDs when needed.\n * @param {Element} el - DOM element to clone\n * @returns {Element}\n */\n copyElem (el) {\n const that = this;\n const getNextIdClosure = function () { return that.getNextId(); };\n return utilCopyElem(el, getNextIdClosure);\n }\n}\n\n/**\n * Called to ensure that drawings will or will not have randomized ids.\n * The currentDrawing will have its nonce set if it doesn't already.\n * @function module:draw.randomizeIds\n * @param {boolean} enableRandomization - flag indicating if documents should have randomized ids\n * @param {draw.Drawing} currentDrawing\n * @returns {void}\n */\nexport const randomizeIds = function (enableRandomization, currentDrawing) {\n randIds = enableRandomization === false\n ? RandomizeModes.NEVER_RANDOMIZE\n : RandomizeModes.ALWAYS_RANDOMIZE;\n\n if (randIds === RandomizeModes.ALWAYS_RANDOMIZE && !currentDrawing.getNonce()) {\n currentDrawing.setNonce(Math.floor(Math.random() * 100001));\n } else if (randIds === RandomizeModes.NEVER_RANDOMIZE && currentDrawing.getNonce()) {\n currentDrawing.clearNonce();\n }\n};\n\n// Layer API Functions\n\n/**\n* Group: Layers.\n*/\n\n/**\n * @see {@link https://api.jquery.com/jQuery.data/}\n * @name external:jQuery.data\n */\n\n/**\n * @interface module:draw.DrawCanvasInit\n * @property {module:path.pathActions} pathActions\n * @property {external:jQuery.data} elData\n * @property {module:history.UndoManager} undoMgr\n */\n/**\n * @function module:draw.DrawCanvasInit#getCurrentGroup\n * @returns {Element}\n */\n/**\n * @function module:draw.DrawCanvasInit#setCurrentGroup\n * @param {Element} cg\n * @returns {void}\n*/\n/**\n * @function module:draw.DrawCanvasInit#getSelectedElements\n * @returns {Element[]} the array with selected DOM elements\n*/\n/**\n * @function module:draw.DrawCanvasInit#getSVGContent\n * @returns {SVGSVGElement}\n */\n/**\n * @function module:draw.DrawCanvasInit#getCurrentDrawing\n * @returns {module:draw.Drawing}\n */\n/**\n * @function module:draw.DrawCanvasInit#clearSelection\n * @param {boolean} [noCall] - When `true`, does not call the \"selected\" handler\n * @returns {void}\n*/\n/**\n * Run the callback function associated with the given event.\n * @function module:draw.DrawCanvasInit#call\n * @param {\"changed\"|\"contextset\"} ev - String with the event name\n * @param {module:svgcanvas.SvgCanvas#event:changed|module:svgcanvas.SvgCanvas#event:contextset} arg - Argument to pass through to the callback\n * function. If the event is \"changed\", a (single-item) array of `Element`s is\n * passed. If the event is \"contextset\", the arg is `null` or `Element`.\n * @returns {void}\n */\n/**\n * @function module:draw.DrawCanvasInit#addCommandToHistory\n * @param {Command} cmd\n * @returns {void}\n*/\n/**\n * @function module:draw.DrawCanvasInit#changeSVGContent\n * @returns {void}\n */\n\nlet canvas_;\n/**\n* @function module:draw.init\n* @param {module:draw.DrawCanvasInit} canvas\n* @returns {void}\n*/\nexport const init = function (canvas) {\n canvas_ = canvas;\n};\n\n/**\n* Updates layer system.\n* @function module:draw.identifyLayers\n* @returns {void}\n*/\nexport const identifyLayers = function () {\n leaveContext();\n canvas_.getCurrentDrawing().identifyLayers();\n};\n\n/**\n* Creates a new top-level layer in the drawing with the given name, sets the current layer\n* to it, and then clears the selection. This function then calls the 'changed' handler.\n* This is an undoable action.\n* @function module:draw.createLayer\n* @param {string} name - The given name\n* @param {module:history.HistoryRecordingService} hrService\n* @fires module:svgcanvas.SvgCanvas#event:changed\n* @returns {void}\n*/\nexport const createLayer = function (name, hrService) {\n const newLayer = canvas_.getCurrentDrawing().createLayer(\n name,\n historyRecordingService(hrService)\n );\n canvas_.clearSelection();\n canvas_.call('changed', [newLayer]);\n};\n\n/**\n * Creates a new top-level layer in the drawing with the given name, copies all the current layer's contents\n * to it, and then clears the selection. This function then calls the 'changed' handler.\n * This is an undoable action.\n * @function module:draw.cloneLayer\n * @param {string} name - The given name. If the layer name exists, a new name will be generated.\n * @param {module:history.HistoryRecordingService} hrService - History recording service\n * @fires module:svgcanvas.SvgCanvas#event:changed\n * @returns {void}\n */\nexport const cloneLayer = function (name, hrService) {\n // Clone the current layer and make the cloned layer the new current layer\n const newLayer = canvas_.getCurrentDrawing().cloneLayer(name, historyRecordingService(hrService));\n\n canvas_.clearSelection();\n leaveContext();\n canvas_.call('changed', [newLayer]);\n};\n\n/**\n* Deletes the current layer from the drawing and then clears the selection. This function\n* then calls the 'changed' handler. This is an undoable action.\n* @function module:draw.deleteCurrentLayer\n* @fires module:svgcanvas.SvgCanvas#event:changed\n* @returns {boolean} `true` if an old layer group was found to delete\n*/\nexport const deleteCurrentLayer = function () {\n let currentLayer = canvas_.getCurrentDrawing().getCurrentLayer();\n const {nextSibling} = currentLayer;\n const parent = currentLayer.parentNode;\n currentLayer = canvas_.getCurrentDrawing().deleteCurrentLayer();\n if (currentLayer) {\n const batchCmd = new BatchCommand('Delete Layer');\n // store in our Undo History\n batchCmd.addSubCommand(new RemoveElementCommand(currentLayer, nextSibling, parent));\n canvas_.addCommandToHistory(batchCmd);\n canvas_.clearSelection();\n canvas_.call('changed', [parent]);\n return true;\n }\n return false;\n};\n\n/**\n* Sets the current layer. If the name is not a valid layer name, then this function returns\n* false. Otherwise it returns true. This is not an undo-able action.\n* @function module:draw.setCurrentLayer\n* @param {string} name - The name of the layer you want to switch to.\n* @returns {boolean} true if the current layer was switched, otherwise false\n*/\nexport const setCurrentLayer = function (name) {\n const result = canvas_.getCurrentDrawing().setCurrentLayer(toXml(name));\n if (result) {\n canvas_.clearSelection();\n }\n return result;\n};\n\n/**\n* Renames the current layer. If the layer name is not valid (i.e. unique), then this function\n* does nothing and returns `false`, otherwise it returns `true`. This is an undo-able action.\n* @function module:draw.renameCurrentLayer\n* @param {string} newName - the new name you want to give the current layer. This name must\n* be unique among all layer names.\n* @fires module:svgcanvas.SvgCanvas#event:changed\n* @returns {boolean} Whether the rename succeeded\n*/\nexport const renameCurrentLayer = function (newName) {\n const drawing = canvas_.getCurrentDrawing();\n const layer = drawing.getCurrentLayer();\n if (layer) {\n const result = drawing.setCurrentLayerName(newName, historyRecordingService());\n if (result) {\n canvas_.call('changed', [layer]);\n return true;\n }\n }\n return false;\n};\n\n/**\n* Changes the position of the current layer to the new value. If the new index is not valid,\n* this function does nothing and returns false, otherwise it returns true. This is an\n* undo-able action.\n* @function module:draw.setCurrentLayerPosition\n* @param {Integer} newPos - The zero-based index of the new position of the layer. This should be between\n* 0 and (number of layers - 1)\n* @returns {boolean} `true` if the current layer position was changed, `false` otherwise.\n*/\nexport const setCurrentLayerPosition = function (newPos) {\n const drawing = canvas_.getCurrentDrawing();\n const result = drawing.setCurrentLayerPosition(newPos);\n if (result) {\n canvas_.addCommandToHistory(new MoveElementCommand(result.currentGroup, result.oldNextSibling, canvas_.getSVGContent()));\n return true;\n }\n return false;\n};\n\n/**\n* Sets the visibility of the layer. If the layer name is not valid, this function return\n* `false`, otherwise it returns `true`. This is an undo-able action.\n* @function module:draw.setLayerVisibility\n* @param {string} layerName - The name of the layer to change the visibility\n* @param {boolean} bVisible - Whether the layer should be visible\n* @returns {boolean} true if the layer's visibility was set, false otherwise\n*/\nexport const setLayerVisibility = function (layerName, bVisible) {\n const drawing = canvas_.getCurrentDrawing();\n const prevVisibility = drawing.getLayerVisibility(layerName);\n const layer = drawing.setLayerVisibility(layerName, bVisible);\n if (layer) {\n const oldDisplay = prevVisibility ? 'inline' : 'none';\n canvas_.addCommandToHistory(new ChangeElementCommand(layer, {display: oldDisplay}, 'Layer Visibility'));\n } else {\n return false;\n }\n\n if (layer === drawing.getCurrentLayer()) {\n canvas_.clearSelection();\n canvas_.pathActions.clear();\n }\n // call('changed', [selected]);\n return true;\n};\n\n/**\n* Moves the selected elements to layerName. If the name is not a valid layer name, then `false`\n* is returned. Otherwise it returns `true`. This is an undo-able action.\n* @function module:draw.moveSelectedToLayer\n* @param {string} layerName - The name of the layer you want to which you want to move the selected elements\n* @returns {boolean} Whether the selected elements were moved to the layer.\n*/\nexport const moveSelectedToLayer = function (layerName) {\n // find the layer\n const drawing = canvas_.getCurrentDrawing();\n const layer = drawing.getLayerByName(layerName);\n if (!layer) { return false; }\n\n const batchCmd = new BatchCommand('Move Elements to Layer');\n\n // loop for each selected element and move it\n const selElems = canvas_.getSelectedElements();\n let i = selElems.length;\n while (i--) {\n const elem = selElems[i];\n if (!elem) { continue; }\n const oldNextSibling = elem.nextSibling;\n // TODO: this is pretty brittle!\n const oldLayer = elem.parentNode;\n layer.append(elem);\n batchCmd.addSubCommand(new MoveElementCommand(elem, oldNextSibling, oldLayer));\n }\n\n canvas_.addCommandToHistory(batchCmd);\n\n return true;\n};\n\n/**\n* @function module:draw.mergeLayer\n* @param {module:history.HistoryRecordingService} hrService\n* @returns {void}\n*/\nexport const mergeLayer = function (hrService) {\n canvas_.getCurrentDrawing().mergeLayer(historyRecordingService(hrService));\n canvas_.clearSelection();\n leaveContext();\n canvas_.changeSVGContent();\n};\n\n/**\n* @function module:draw.mergeAllLayers\n* @param {module:history.HistoryRecordingService} hrService\n* @returns {void}\n*/\nexport const mergeAllLayers = function (hrService) {\n canvas_.getCurrentDrawing().mergeAllLayers(historyRecordingService(hrService));\n canvas_.clearSelection();\n leaveContext();\n canvas_.changeSVGContent();\n};\n\n/**\n* Return from a group context to the regular kind, make any previously\n* disabled elements enabled again.\n* @function module:draw.leaveContext\n* @fires module:svgcanvas.SvgCanvas#event:contextset\n* @returns {void}\n*/\nexport const leaveContext = function () {\n const len = disabledElems.length;\n if (len) {\n for (let i = 0; i < len; i++) {\n const elem = disabledElems[i];\n const orig = canvas_.elData(elem, 'orig_opac');\n if (orig !== 1) {\n elem.setAttribute('opacity', orig);\n } else {\n elem.removeAttribute('opacity');\n }\n elem.setAttribute('style', 'pointer-events: inherit');\n }\n disabledElems = [];\n canvas_.clearSelection(true);\n canvas_.call('contextset', null);\n }\n canvas_.setCurrentGroup(null);\n};\n\n/**\n* Set the current context (for in-group editing).\n* @function module:draw.setContext\n* @param {Element} elem\n* @fires module:svgcanvas.SvgCanvas#event:contextset\n* @returns {void}\n*/\nexport const setContext = function (elem) {\n leaveContext();\n if (typeof elem === 'string') {\n elem = getElem(elem);\n }\n\n // Edit inside this group\n canvas_.setCurrentGroup(elem);\n\n // Disable other elements\n $(elem).parentsUntil('#svgcontent').andSelf().siblings().each(function () {\n const opac = this.getAttribute('opacity') || 1;\n // Store the original's opacity\n canvas_.elData(this, 'orig_opac', opac);\n this.setAttribute('opacity', opac * 0.33);\n this.setAttribute('style', 'pointer-events: none');\n disabledElems.push(this);\n });\n\n canvas_.clearSelection();\n canvas_.call('contextset', canvas_.getCurrentGroup());\n};\n\n/**\n* @memberof module:draw\n* @class Layer\n* @see {@link module:layer.Layer}\n*/\nexport {Layer};\n","/**\n * Tools for SVG sanitization.\n * @module sanitize\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Jeff Schiller\n */\n\nimport {getReverseNS, NS} from '../common/namespaces.js';\nimport {isGecko} from '../common/browser.js';\nimport {getHref, setHref, getUrlFromAttr} from '../common/utilities.js';\n\nconst REVERSE_NS = getReverseNS();\n\n// Todo: Split out into core attributes, presentation attributes, etc. so consistent\n/**\n * This defines which elements and attributes that we support (or at least\n * don't remove).\n * @type {PlainObject}\n */\nconst svgWhiteList_ = {\n // SVG Elements\n a: ['class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'mask', 'opacity', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'xlink:href', 'xlink:title'],\n circle: ['class', 'clip-path', 'clip-rule', 'cx', 'cy', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'mask', 'opacity', 'r', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform'],\n clipPath: ['class', 'clipPathUnits', 'id'],\n defs: [],\n style: ['type'],\n desc: [],\n ellipse: ['class', 'clip-path', 'clip-rule', 'cx', 'cy', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'mask', 'opacity', 'requiredFeatures', 'rx', 'ry', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform'],\n feGaussianBlur: ['class', 'color-interpolation-filters', 'id', 'requiredFeatures', 'stdDeviation'],\n feMorphology: ['class', 'in', 'operator', 'radius'],\n filter: ['class', 'color-interpolation-filters', 'filterRes', 'filterUnits', 'height', 'id', 'primitiveUnits', 'requiredFeatures', 'width', 'x', 'xlink:href', 'y'],\n foreignObject: ['class', 'font-size', 'height', 'id', 'opacity', 'requiredFeatures', 'style', 'transform', 'width', 'x', 'y'],\n g: ['class', 'clip-path', 'clip-rule', 'id', 'display', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'font-family', 'font-size', 'font-style', 'font-weight', 'text-anchor'],\n image: ['class', 'clip-path', 'clip-rule', 'filter', 'height', 'id', 'mask', 'opacity', 'requiredFeatures', 'style', 'systemLanguage', 'transform', 'width', 'x', 'xlink:href', 'xlink:title', 'y'],\n line: ['class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'x1', 'x2', 'y1', 'y2'],\n linearGradient: ['class', 'id', 'gradientTransform', 'gradientUnits', 'requiredFeatures', 'spreadMethod', 'systemLanguage', 'x1', 'x2', 'xlink:href', 'y1', 'y2'],\n marker: ['id', 'class', 'markerHeight', 'markerUnits', 'markerWidth', 'orient', 'preserveAspectRatio', 'refX', 'refY', 'systemLanguage', 'viewBox'],\n mask: ['class', 'height', 'id', 'maskContentUnits', 'maskUnits', 'width', 'x', 'y'],\n metadata: ['class', 'id'],\n path: ['class', 'clip-path', 'clip-rule', 'd', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform'],\n pattern: ['class', 'height', 'id', 'patternContentUnits', 'patternTransform', 'patternUnits', 'requiredFeatures', 'style', 'systemLanguage', 'viewBox', 'width', 'x', 'xlink:href', 'y'],\n polygon: ['class', 'clip-path', 'clip-rule', 'id', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'id', 'class', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'points', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform'],\n polyline: ['class', 'clip-path', 'clip-rule', 'id', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'opacity', 'points', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform'],\n radialGradient: ['class', 'cx', 'cy', 'fx', 'fy', 'gradientTransform', 'gradientUnits', 'id', 'r', 'requiredFeatures', 'spreadMethod', 'systemLanguage', 'xlink:href'],\n rect: ['class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'height', 'id', 'mask', 'opacity', 'requiredFeatures', 'rx', 'ry', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'width', 'x', 'y'],\n stop: ['class', 'id', 'offset', 'requiredFeatures', 'stop-color', 'stop-opacity', 'style', 'systemLanguage'],\n svg: ['class', 'clip-path', 'clip-rule', 'filter', 'id', 'height', 'mask', 'preserveAspectRatio', 'requiredFeatures', 'style', 'systemLanguage', 'viewBox', 'width', 'x', 'xmlns', 'xmlns:se', 'xmlns:xlink', 'y'],\n switch: ['class', 'id', 'requiredFeatures', 'systemLanguage'],\n symbol: ['class', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'font-family', 'font-size', 'font-style', 'font-weight', 'id', 'opacity', 'preserveAspectRatio', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'transform', 'viewBox'],\n text: ['class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'font-family', 'font-size', 'font-style', 'font-weight', 'id', 'mask', 'opacity', 'requiredFeatures', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'text-anchor', 'transform', 'x', 'xml:space', 'y'],\n textPath: ['class', 'id', 'method', 'requiredFeatures', 'spacing', 'startOffset', 'style', 'systemLanguage', 'transform', 'xlink:href'],\n title: [],\n tspan: ['class', 'clip-path', 'clip-rule', 'dx', 'dy', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'font-family', 'font-size', 'font-style', 'font-weight', 'id', 'mask', 'opacity', 'requiredFeatures', 'rotate', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'systemLanguage', 'text-anchor', 'textLength', 'transform', 'x', 'xml:space', 'y'],\n use: ['class', 'clip-path', 'clip-rule', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'height', 'id', 'mask', 'stroke', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke-width', 'style', 'transform', 'width', 'x', 'xlink:href', 'y'],\n\n // MathML Elements\n annotation: ['encoding'],\n 'annotation-xml': ['encoding'],\n maction: ['actiontype', 'other', 'selection'],\n math: ['class', 'id', 'display', 'xmlns'],\n menclose: ['notation'],\n merror: [],\n mfrac: ['linethickness'],\n mi: ['mathvariant'],\n mmultiscripts: [],\n mn: [],\n mo: ['fence', 'lspace', 'maxsize', 'minsize', 'rspace', 'stretchy'],\n mover: [],\n mpadded: ['lspace', 'width', 'height', 'depth', 'voffset'],\n mphantom: [],\n mprescripts: [],\n mroot: [],\n mrow: ['xlink:href', 'xlink:type', 'xmlns:xlink'],\n mspace: ['depth', 'height', 'width'],\n msqrt: [],\n mstyle: ['displaystyle', 'mathbackground', 'mathcolor', 'mathvariant', 'scriptlevel'],\n msub: [],\n msubsup: [],\n msup: [],\n mtable: ['align', 'columnalign', 'columnlines', 'columnspacing', 'displaystyle', 'equalcolumns', 'equalrows', 'frame', 'rowalign', 'rowlines', 'rowspacing', 'width'],\n mtd: ['columnalign', 'columnspan', 'rowalign', 'rowspan'],\n mtext: [],\n mtr: ['columnalign', 'rowalign'],\n munder: [],\n munderover: [],\n none: [],\n semantics: []\n};\n\n// Produce a Namespace-aware version of svgWhitelist\nconst svgWhiteListNS_ = {};\nObject.entries(svgWhiteList_).forEach(function ([elt, atts]) {\n const attNS = {};\n Object.entries(atts).forEach(function ([i, att]) {\n if (att.includes(':')) {\n const v = att.split(':');\n attNS[v[1]] = NS[(v[0]).toUpperCase()];\n } else {\n attNS[att] = att === 'xmlns' ? NS.XMLNS : null;\n }\n });\n svgWhiteListNS_[elt] = attNS;\n});\n\n/**\n* Sanitizes the input node and its children.\n* It only keeps what is allowed from our whitelist defined above.\n* @function module:sanitize.sanitizeSvg\n* @param {Text|Element} node - The DOM element to be checked (we'll also check its children) or text node to be cleaned up\n* @returns {void}\n*/\nexport const sanitizeSvg = function (node) {\n // Cleanup text nodes\n if (node.nodeType === 3) { // 3 === TEXT_NODE\n // Trim whitespace\n node.nodeValue = node.nodeValue.replace(/^\\s+|\\s+$/g, '');\n // Remove if empty\n if (!node.nodeValue.length) {\n node.remove();\n }\n }\n\n // We only care about element nodes.\n // Automatically return for all non-element nodes, such as comments, etc.\n if (node.nodeType !== 1) { // 1 == ELEMENT_NODE\n return;\n }\n\n const doc = node.ownerDocument;\n const parent = node.parentNode;\n // can parent ever be null here? I think the root node's parent is the document...\n if (!doc || !parent) {\n return;\n }\n\n const allowedAttrs = svgWhiteList_[node.nodeName];\n const allowedAttrsNS = svgWhiteListNS_[node.nodeName];\n // if this element is supported, sanitize it\n if (typeof allowedAttrs !== 'undefined') {\n const seAttrs = [];\n let i = node.attributes.length;\n while (i--) {\n // if the attribute is not in our whitelist, then remove it\n // could use jQuery's inArray(), but I don't know if that's any better\n const attr = node.attributes.item(i);\n const attrName = attr.nodeName;\n const attrLocalName = attr.localName;\n const attrNsURI = attr.namespaceURI;\n // Check that an attribute with the correct localName in the correct namespace is on\n // our whitelist or is a namespace declaration for one of our allowed namespaces\n if (!({}.hasOwnProperty.call(allowedAttrsNS, attrLocalName) && attrNsURI === allowedAttrsNS[attrLocalName] && attrNsURI !== NS.XMLNS) &&\n !(attrNsURI === NS.XMLNS && REVERSE_NS[attr.value])) {\n // TODO(codedread): Programmatically add the se: attributes to the NS-aware whitelist.\n // Bypassing the whitelist to allow se: prefixes.\n // Is there a more appropriate way to do this?\n if (attrName.startsWith('se:') || attrName.startsWith('data-')) {\n seAttrs.push([attrName, attr.value]);\n }\n node.removeAttributeNS(attrNsURI, attrLocalName);\n }\n\n // Add spaces before negative signs where necessary\n if (isGecko()) {\n switch (attrName) {\n case 'transform':\n case 'gradientTransform':\n case 'patternTransform': {\n const val = attr.value.replace(/(\\d)-/g, '$1 -');\n // const val = attr.value.replace(/(?\\d)-/g, '$ -');\n node.setAttribute(attrName, val);\n break;\n }\n }\n }\n\n // For the style attribute, rewrite it in terms of XML presentational attributes\n if (attrName === 'style') {\n const props = attr.value.split(';');\n let p = props.length;\n while (p--) {\n const [name, val] = props[p].split(':');\n const styleAttrName = (name || '').trim();\n const styleAttrVal = (val || '').trim();\n // Now check that this attribute is supported\n if (allowedAttrs.includes(styleAttrName)) {\n node.setAttribute(styleAttrName, styleAttrVal);\n }\n }\n node.removeAttribute('style');\n }\n }\n\n Object.values(seAttrs).forEach(([att, val]) => {\n node.setAttributeNS(NS.SE, att, val);\n });\n\n // for some elements that have a xlink:href, ensure the URI refers to a local element\n // (but not for links)\n const href = getHref(node);\n if (href &&\n ['filter', 'linearGradient', 'pattern',\n 'radialGradient', 'textPath', 'use'].includes(node.nodeName)) {\n // TODO: we simply check if the first character is a #, is this bullet-proof?\n if (href[0] !== '#') {\n // remove the attribute (but keep the element)\n setHref(node, '');\n node.removeAttributeNS(NS.XLINK, 'href');\n }\n }\n\n // Safari crashes on a without a xlink:href, so we just remove the node here\n if (node.nodeName === 'use' && !getHref(node)) {\n node.remove();\n return;\n }\n // if the element has attributes pointing to a non-local reference,\n // need to remove the attribute\n Object.values(['clip-path', 'fill', 'filter', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'stroke'], function (attr) {\n let val = node.getAttribute(attr);\n if (val) {\n val = getUrlFromAttr(val);\n // simply check for first character being a '#'\n if (val && val[0] !== '#') {\n node.setAttribute(attr, '');\n node.removeAttribute(attr);\n }\n }\n });\n\n // recurse to children\n i = node.childNodes.length;\n while (i--) { sanitizeSvg(node.childNodes.item(i)); }\n // else (element not supported), remove it\n } else {\n // remove all children from this node and insert them before this node\n // TODO: in the case of animation elements this will hardly ever be correct\n const children = [];\n while (node.hasChildNodes()) {\n children.push(parent.insertBefore(node.firstChild, node));\n }\n\n // remove this node from the document altogether\n node.remove();\n\n // call sanitizeSvg on each of those children\n let i = children.length;\n while (i--) { sanitizeSvg(children[i]); }\n }\n};\n","/* globals jQuery */\n/**\n * Manipulating coordinates.\n * @module coords\n * @license MIT\n */\n\nimport '../common/svgpathseg.js';\nimport {\n snapToGrid, assignAttributes, getBBox, getRefElem, findDefs\n} from '../common/utilities.js';\nimport {\n transformPoint, transformListToTransform, matrixMultiply, transformBox\n} from '../common/math.js';\nimport {getTransformList} from '../common/svgtransformlist.js';\n\nconst $ = jQuery;\n\n// this is how we map paths to our preferred relative segment types\nconst pathMap = [\n 0, 'z', 'M', 'm', 'L', 'l', 'C', 'c', 'Q', 'q', 'A', 'a',\n 'H', 'h', 'V', 'v', 'S', 's', 'T', 't'\n];\n\n/**\n * @interface module:coords.EditorContext\n */\n/**\n * @function module:coords.EditorContext#getGridSnapping\n * @returns {boolean}\n */\n/**\n * @function module:coords.EditorContext#getDrawing\n * @returns {module:draw.Drawing}\n*/\n/**\n * @function module:coords.EditorContext#getSVGRoot\n * @returns {SVGSVGElement}\n*/\n\nlet editorContext_ = null;\n\n/**\n* @function module:coords.init\n* @param {module:svgcanvas.SvgCanvas#event:pointsAdded} editorContext\n* @returns {void}\n*/\nexport const init = function (editorContext) {\n editorContext_ = editorContext;\n};\n\n/**\n * Applies coordinate changes to an element based on the given matrix.\n * @name module:coords.remapElement\n * @type {module:path.EditorContext#remapElement}\n*/\nexport const remapElement = function (selected, changes, m) {\n const remap = function (x, y) { return transformPoint(x, y, m); },\n scalew = function (w) { return m.a * w; },\n scaleh = function (h) { return m.d * h; },\n doSnapping = editorContext_.getGridSnapping() && selected.parentNode.parentNode.localName === 'svg',\n finishUp = function () {\n if (doSnapping) {\n Object.entries(changes).forEach(([o, value]) => {\n changes[o] = snapToGrid(value);\n });\n }\n assignAttributes(selected, changes, 1000, true);\n },\n box = getBBox(selected);\n\n for (let i = 0; i < 2; i++) {\n const type = i === 0 ? 'fill' : 'stroke';\n const attrVal = selected.getAttribute(type);\n if (attrVal && attrVal.startsWith('url(')) {\n if (m.a < 0 || m.d < 0) {\n const grad = getRefElem(attrVal);\n const newgrad = grad.cloneNode(true);\n if (m.a < 0) {\n // flip x\n const x1 = newgrad.getAttribute('x1');\n const x2 = newgrad.getAttribute('x2');\n newgrad.setAttribute('x1', -(x1 - 1));\n newgrad.setAttribute('x2', -(x2 - 1));\n }\n\n if (m.d < 0) {\n // flip y\n const y1 = newgrad.getAttribute('y1');\n const y2 = newgrad.getAttribute('y2');\n newgrad.setAttribute('y1', -(y1 - 1));\n newgrad.setAttribute('y2', -(y2 - 1));\n }\n newgrad.id = editorContext_.getDrawing().getNextId();\n findDefs().append(newgrad);\n selected.setAttribute(type, 'url(#' + newgrad.id + ')');\n }\n\n // Not really working :(\n // if (selected.tagName === 'path') {\n // reorientGrads(selected, m);\n // }\n }\n }\n\n const elName = selected.tagName;\n if (elName === 'g' || elName === 'text' || elName === 'tspan' || elName === 'use') {\n // if it was a translate, then just update x,y\n if (m.a === 1 && m.b === 0 && m.c === 0 && m.d === 1 && (m.e !== 0 || m.f !== 0)) {\n // [T][M] = [M][T']\n // therefore [T'] = [M_inv][T][M]\n const existing = transformListToTransform(selected).matrix,\n tNew = matrixMultiply(existing.inverse(), m, existing);\n changes.x = Number.parseFloat(changes.x) + tNew.e;\n changes.y = Number.parseFloat(changes.y) + tNew.f;\n } else {\n // we just absorb all matrices into the element and don't do any remapping\n const chlist = getTransformList(selected);\n const mt = editorContext_.getSVGRoot().createSVGTransform();\n mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix, m));\n chlist.clear();\n chlist.appendItem(mt);\n }\n }\n\n // now we have a set of changes and an applied reduced transform list\n // we apply the changes directly to the DOM\n switch (elName) {\n case 'foreignObject':\n case 'rect':\n case 'image': {\n // Allow images to be inverted (give them matrix when flipped)\n if (elName === 'image' && (m.a < 0 || m.d < 0)) {\n // Convert to matrix\n const chlist = getTransformList(selected);\n const mt = editorContext_.getSVGRoot().createSVGTransform();\n mt.setMatrix(matrixMultiply(transformListToTransform(chlist).matrix, m));\n chlist.clear();\n chlist.appendItem(mt);\n } else {\n const pt1 = remap(changes.x, changes.y);\n changes.width = scalew(changes.width);\n changes.height = scaleh(changes.height);\n changes.x = pt1.x + Math.min(0, changes.width);\n changes.y = pt1.y + Math.min(0, changes.height);\n changes.width = Math.abs(changes.width);\n changes.height = Math.abs(changes.height);\n }\n finishUp();\n break;\n } case 'ellipse': {\n const c = remap(changes.cx, changes.cy);\n changes.cx = c.x;\n changes.cy = c.y;\n changes.rx = scalew(changes.rx);\n changes.ry = scaleh(changes.ry);\n changes.rx = Math.abs(changes.rx);\n changes.ry = Math.abs(changes.ry);\n finishUp();\n break;\n } case 'circle': {\n const c = remap(changes.cx, changes.cy);\n changes.cx = c.x;\n changes.cy = c.y;\n // take the minimum of the new selected box's dimensions for the new circle radius\n const tbox = transformBox(box.x, box.y, box.width, box.height, m);\n const w = tbox.tr.x - tbox.tl.x, h = tbox.bl.y - tbox.tl.y;\n changes.r = Math.min(w / 2, h / 2);\n\n if (changes.r) { changes.r = Math.abs(changes.r); }\n finishUp();\n break;\n } case 'line': {\n const pt1 = remap(changes.x1, changes.y1);\n const pt2 = remap(changes.x2, changes.y2);\n changes.x1 = pt1.x;\n changes.y1 = pt1.y;\n changes.x2 = pt2.x;\n changes.y2 = pt2.y;\n } // Fallthrough\n case 'text':\n case 'tspan':\n case 'use': {\n finishUp();\n break;\n } case 'g': {\n const gsvg = $(selected).data('gsvg');\n if (gsvg) {\n assignAttributes(gsvg, changes, 1000, true);\n }\n break;\n } case 'polyline':\n case 'polygon': {\n const len = changes.points.length;\n for (let i = 0; i < len; ++i) {\n const pt = changes.points[i];\n const {x, y} = remap(pt.x, pt.y);\n changes.points[i].x = x;\n changes.points[i].y = y;\n }\n\n // const len = changes.points.length;\n let pstr = '';\n for (let i = 0; i < len; ++i) {\n const pt = changes.points[i];\n pstr += pt.x + ',' + pt.y + ' ';\n }\n selected.setAttribute('points', pstr);\n break;\n } case 'path': {\n const segList = selected.pathSegList;\n let len = segList.numberOfItems;\n changes.d = [];\n for (let i = 0; i < len; ++i) {\n const seg = segList.getItem(i);\n changes.d[i] = {\n type: seg.pathSegType,\n x: seg.x,\n y: seg.y,\n x1: seg.x1,\n y1: seg.y1,\n x2: seg.x2,\n y2: seg.y2,\n r1: seg.r1,\n r2: seg.r2,\n angle: seg.angle,\n largeArcFlag: seg.largeArcFlag,\n sweepFlag: seg.sweepFlag\n };\n }\n\n len = changes.d.length;\n const firstseg = changes.d[0],\n currentpt = remap(firstseg.x, firstseg.y);\n changes.d[0].x = currentpt.x;\n changes.d[0].y = currentpt.y;\n for (let i = 1; i < len; ++i) {\n const seg = changes.d[i];\n const {type} = seg;\n // if absolute or first segment, we want to remap x, y, x1, y1, x2, y2\n // if relative, we want to scalew, scaleh\n if (type % 2 === 0) { // absolute\n const thisx = (seg.x !== undefined) ? seg.x : currentpt.x, // for V commands\n thisy = (seg.y !== undefined) ? seg.y : currentpt.y; // for H commands\n const pt = remap(thisx, thisy);\n const pt1 = remap(seg.x1, seg.y1);\n const pt2 = remap(seg.x2, seg.y2);\n seg.x = pt.x;\n seg.y = pt.y;\n seg.x1 = pt1.x;\n seg.y1 = pt1.y;\n seg.x2 = pt2.x;\n seg.y2 = pt2.y;\n seg.r1 = scalew(seg.r1);\n seg.r2 = scaleh(seg.r2);\n } else { // relative\n seg.x = scalew(seg.x);\n seg.y = scaleh(seg.y);\n seg.x1 = scalew(seg.x1);\n seg.y1 = scaleh(seg.y1);\n seg.x2 = scalew(seg.x2);\n seg.y2 = scaleh(seg.y2);\n seg.r1 = scalew(seg.r1);\n seg.r2 = scaleh(seg.r2);\n }\n } // for each segment\n\n let dstr = '';\n len = changes.d.length;\n for (let i = 0; i < len; ++i) {\n const seg = changes.d[i];\n const {type} = seg;\n dstr += pathMap[type];\n switch (type) {\n case 13: // relative horizontal line (h)\n case 12: // absolute horizontal line (H)\n dstr += seg.x + ' ';\n break;\n case 15: // relative vertical line (v)\n case 14: // absolute vertical line (V)\n dstr += seg.y + ' ';\n break;\n case 3: // relative move (m)\n case 5: // relative line (l)\n case 19: // relative smooth quad (t)\n case 2: // absolute move (M)\n case 4: // absolute line (L)\n case 18: // absolute smooth quad (T)\n dstr += seg.x + ',' + seg.y + ' ';\n break;\n case 7: // relative cubic (c)\n case 6: // absolute cubic (C)\n dstr += seg.x1 + ',' + seg.y1 + ' ' + seg.x2 + ',' + seg.y2 + ' ' +\n seg.x + ',' + seg.y + ' ';\n break;\n case 9: // relative quad (q)\n case 8: // absolute quad (Q)\n dstr += seg.x1 + ',' + seg.y1 + ' ' + seg.x + ',' + seg.y + ' ';\n break;\n case 11: // relative elliptical arc (a)\n case 10: // absolute elliptical arc (A)\n dstr += seg.r1 + ',' + seg.r2 + ' ' + seg.angle + ' ' + Number(seg.largeArcFlag) +\n ' ' + Number(seg.sweepFlag) + ' ' + seg.x + ',' + seg.y + ' ';\n break;\n case 17: // relative smooth cubic (s)\n case 16: // absolute smooth cubic (S)\n dstr += seg.x2 + ',' + seg.y2 + ' ' + seg.x + ',' + seg.y + ' ';\n break;\n }\n }\n\n selected.setAttribute('d', dstr);\n break;\n }\n }\n};\n","/* globals jQuery */\n/**\n * Recalculate.\n * @module recalculate\n * @license MIT\n */\n\nimport jQueryPluginSVG from '../common/jQuery.attr.js'; // Needed for SVG attribute setting and array form with `attr`\nimport {NS} from '../common/namespaces.js';\nimport {convertToNum} from '../common/units.js';\nimport {isWebkit} from '../common/browser.js';\nimport {getTransformList} from '../common/svgtransformlist.js';\nimport {getRotationAngle, getHref, getBBox, getRefElem, isNullish} from '../common/utilities.js';\nimport {BatchCommand, ChangeElementCommand} from './history.js';\nimport {remapElement} from './coords.js';\nimport {\n isIdentity, matrixMultiply, transformPoint, transformListToTransform,\n hasMatrixTransform\n} from '../common/math.js';\n\nconst $ = jQueryPluginSVG(jQuery);\n\nlet context_;\n\n/**\n* @interface module:recalculate.EditorContext\n*/\n/**\n * @function module:recalculate.EditorContext#getSVGRoot\n * @returns {SVGSVGElement} The root DOM element\n */\n/**\n * @function module:recalculate.EditorContext#getStartTransform\n * @returns {string}\n*/\n/**\n * @function module:recalculate.EditorContext#setStartTransform\n * @param {string} transform\n * @returns {void}\n */\n\n/**\n* @function module:recalculate.init\n* @param {module:recalculate.EditorContext} editorContext\n* @returns {void}\n*/\nexport const init = function (editorContext) {\n context_ = editorContext;\n};\n\n/**\n* Updates a ``s values based on the given translation of an element.\n* @function module:recalculate.updateClipPath\n* @param {string} attr - The clip-path attribute value with the clipPath's ID\n* @param {Float} tx - The translation's x value\n* @param {Float} ty - The translation's y value\n* @returns {void}\n*/\nexport const updateClipPath = function (attr, tx, ty) {\n const path = getRefElem(attr).firstChild;\n const cpXform = getTransformList(path);\n const newxlate = context_.getSVGRoot().createSVGTransform();\n newxlate.setTranslate(tx, ty);\n\n cpXform.appendItem(newxlate);\n\n // Update clipPath's dimensions\n recalculateDimensions(path);\n};\n\n/**\n* Decides the course of action based on the element's transform list.\n* @function module:recalculate.recalculateDimensions\n* @param {Element} selected - The DOM element to recalculate\n* @returns {Command} Undo command object with the resulting change\n*/\nexport const recalculateDimensions = function (selected) {\n if (isNullish(selected)) { return null; }\n\n // Firefox Issue - 1081\n if (selected.nodeName === 'svg' && navigator.userAgent.includes('Firefox/20')) {\n return null;\n }\n\n const svgroot = context_.getSVGRoot();\n const tlist = getTransformList(selected);\n\n // remove any unnecessary transforms\n if (tlist && tlist.numberOfItems > 0) {\n let k = tlist.numberOfItems;\n const noi = k;\n while (k--) {\n const xform = tlist.getItem(k);\n if (xform.type === 0) {\n tlist.removeItem(k);\n // remove identity matrices\n } else if (xform.type === 1) {\n if (isIdentity(xform.matrix)) {\n if (noi === 1) {\n // Overcome Chrome bug (though only when noi is 1) with\n // `removeItem` preventing `removeAttribute` from\n // subsequently working\n // See https://bugs.chromium.org/p/chromium/issues/detail?id=843901\n selected.removeAttribute('transform');\n return null;\n }\n tlist.removeItem(k);\n }\n // remove zero-degree rotations\n } else if (xform.type === 4) {\n if (xform.angle === 0) {\n tlist.removeItem(k);\n }\n }\n }\n // End here if all it has is a rotation\n if (tlist.numberOfItems === 1 &&\n getRotationAngle(selected)) { return null; }\n }\n\n // if this element had no transforms, we are done\n if (!tlist || tlist.numberOfItems === 0) {\n // Chrome apparently had a bug that requires clearing the attribute first.\n selected.setAttribute('transform', '');\n // However, this still next line currently doesn't work at all in Chrome\n selected.removeAttribute('transform');\n // selected.transform.baseVal.clear(); // Didn't help for Chrome bug\n return null;\n }\n\n // TODO: Make this work for more than 2\n if (tlist) {\n let mxs = [];\n let k = tlist.numberOfItems;\n while (k--) {\n const xform = tlist.getItem(k);\n if (xform.type === 1) {\n mxs.push([xform.matrix, k]);\n } else if (mxs.length) {\n mxs = [];\n }\n }\n if (mxs.length === 2) {\n const mNew = svgroot.createSVGTransformFromMatrix(matrixMultiply(mxs[1][0], mxs[0][0]));\n tlist.removeItem(mxs[0][1]);\n tlist.removeItem(mxs[1][1]);\n tlist.insertItemBefore(mNew, mxs[1][1]);\n }\n\n // combine matrix + translate\n k = tlist.numberOfItems;\n if (k >= 2 && tlist.getItem(k - 2).type === 1 && tlist.getItem(k - 1).type === 2) {\n const mt = svgroot.createSVGTransform();\n\n const m = matrixMultiply(\n tlist.getItem(k - 2).matrix,\n tlist.getItem(k - 1).matrix\n );\n mt.setMatrix(m);\n tlist.removeItem(k - 2);\n tlist.removeItem(k - 2);\n tlist.appendItem(mt);\n }\n }\n\n // If it still has a single [M] or [R][M], return null too (prevents BatchCommand from being returned).\n switch (selected.tagName) {\n // Ignore these elements, as they can absorb the [M]\n case 'line':\n case 'polyline':\n case 'polygon':\n case 'path':\n break;\n default:\n if ((tlist.numberOfItems === 1 && tlist.getItem(0).type === 1) ||\n (tlist.numberOfItems === 2 && tlist.getItem(0).type === 1 && tlist.getItem(0).type === 4)) {\n return null;\n }\n }\n\n // Grouped SVG element\n const gsvg = $(selected).data('gsvg');\n\n // we know we have some transforms, so set up return variable\n const batchCmd = new BatchCommand('Transform');\n\n // store initial values that will be affected by reducing the transform list\n let changes = {};\n let initial = null;\n let attrs = [];\n switch (selected.tagName) {\n case 'line':\n attrs = ['x1', 'y1', 'x2', 'y2'];\n break;\n case 'circle':\n attrs = ['cx', 'cy', 'r'];\n break;\n case 'ellipse':\n attrs = ['cx', 'cy', 'rx', 'ry'];\n break;\n case 'foreignObject':\n case 'rect':\n case 'image':\n attrs = ['width', 'height', 'x', 'y'];\n break;\n case 'use':\n case 'text':\n case 'tspan':\n attrs = ['x', 'y'];\n break;\n case 'polygon':\n case 'polyline': {\n initial = {};\n initial.points = selected.getAttribute('points');\n const list = selected.points;\n const len = list.numberOfItems;\n changes.points = new Array(len);\n for (let i = 0; i < len; ++i) {\n const pt = list.getItem(i);\n changes.points[i] = {x: pt.x, y: pt.y};\n }\n break;\n } case 'path':\n initial = {};\n initial.d = selected.getAttribute('d');\n changes.d = selected.getAttribute('d');\n break;\n } // switch on element type to get initial values\n\n if (attrs.length) {\n changes = $(selected).attr(attrs);\n $.each(changes, function (attr, val) {\n changes[attr] = convertToNum(attr, val);\n });\n } else if (gsvg) {\n // GSVG exception\n changes = {\n x: $(gsvg).attr('x') || 0,\n y: $(gsvg).attr('y') || 0\n };\n }\n\n // if we haven't created an initial array in polygon/polyline/path, then\n // make a copy of initial values and include the transform\n if (isNullish(initial)) {\n initial = $.extend(true, {}, changes);\n $.each(initial, function (attr, val) {\n initial[attr] = convertToNum(attr, val);\n });\n }\n // save the start transform value too\n initial.transform = context_.getStartTransform() || '';\n\n let oldcenter, newcenter;\n\n // if it's a regular group, we have special processing to flatten transforms\n if ((selected.tagName === 'g' && !gsvg) || selected.tagName === 'a') {\n const box = getBBox(selected);\n\n oldcenter = {x: box.x + box.width / 2, y: box.y + box.height / 2};\n newcenter = transformPoint(\n box.x + box.width / 2,\n box.y + box.height / 2,\n transformListToTransform(tlist).matrix\n );\n // let m = svgroot.createSVGMatrix();\n\n // temporarily strip off the rotate and save the old center\n const gangle = getRotationAngle(selected);\n if (gangle) {\n const a = gangle * Math.PI / 180;\n let s;\n if (Math.abs(a) > (1.0e-10)) {\n s = Math.sin(a) / (1 - Math.cos(a));\n } else {\n // TODO: This blows up if the angle is exactly 0!\n s = 2 / a;\n }\n for (let i = 0; i < tlist.numberOfItems; ++i) {\n const xform = tlist.getItem(i);\n if (xform.type === 4) {\n // extract old center through mystical arts\n const rm = xform.matrix;\n oldcenter.y = (s * rm.e + rm.f) / 2;\n oldcenter.x = (rm.e - s * rm.f) / 2;\n tlist.removeItem(i);\n break;\n }\n }\n }\n const N = tlist.numberOfItems;\n let tx = 0, ty = 0, operation = 0;\n\n let firstM;\n if (N) {\n firstM = tlist.getItem(0).matrix;\n }\n\n let oldStartTransform;\n // first, if it was a scale then the second-last transform will be it\n if (N >= 3 && tlist.getItem(N - 2).type === 3 &&\n tlist.getItem(N - 3).type === 2 && tlist.getItem(N - 1).type === 2) {\n operation = 3; // scale\n\n // if the children are unrotated, pass the scale down directly\n // otherwise pass the equivalent matrix() down directly\n const tm = tlist.getItem(N - 3).matrix,\n sm = tlist.getItem(N - 2).matrix,\n tmn = tlist.getItem(N - 1).matrix;\n\n const children = selected.childNodes;\n let c = children.length;\n while (c--) {\n const child = children.item(c);\n tx = 0;\n ty = 0;\n if (child.nodeType === 1) {\n const childTlist = getTransformList(child);\n\n // some children might not have a transform (, , etc)\n if (!childTlist) { continue; }\n\n const m = transformListToTransform(childTlist).matrix;\n\n // Convert a matrix to a scale if applicable\n // if (hasMatrixTransform(childTlist) && childTlist.numberOfItems == 1) {\n // if (m.b==0 && m.c==0 && m.e==0 && m.f==0) {\n // childTlist.removeItem(0);\n // const translateOrigin = svgroot.createSVGTransform(),\n // scale = svgroot.createSVGTransform(),\n // translateBack = svgroot.createSVGTransform();\n // translateOrigin.setTranslate(0, 0);\n // scale.setScale(m.a, m.d);\n // translateBack.setTranslate(0, 0);\n // childTlist.appendItem(translateBack);\n // childTlist.appendItem(scale);\n // childTlist.appendItem(translateOrigin);\n // }\n // }\n\n const angle = getRotationAngle(child);\n oldStartTransform = context_.getStartTransform();\n // const childxforms = [];\n context_.setStartTransform(child.getAttribute('transform'));\n if (angle || hasMatrixTransform(childTlist)) {\n const e2t = svgroot.createSVGTransform();\n e2t.setMatrix(matrixMultiply(tm, sm, tmn, m));\n childTlist.clear();\n childTlist.appendItem(e2t);\n // childxforms.push(e2t);\n // if not rotated or skewed, push the [T][S][-T] down to the child\n } else {\n // update the transform list with translate,scale,translate\n\n // slide the [T][S][-T] from the front to the back\n // [T][S][-T][M] = [M][T2][S2][-T2]\n\n // (only bringing [-T] to the right of [M])\n // [T][S][-T][M] = [T][S][M][-T2]\n // [-T2] = [M_inv][-T][M]\n const t2n = matrixMultiply(m.inverse(), tmn, m);\n // [T2] is always negative translation of [-T2]\n const t2 = svgroot.createSVGMatrix();\n t2.e = -t2n.e;\n t2.f = -t2n.f;\n\n // [T][S][-T][M] = [M][T2][S2][-T2]\n // [S2] = [T2_inv][M_inv][T][S][-T][M][-T2_inv]\n const s2 = matrixMultiply(t2.inverse(), m.inverse(), tm, sm, tmn, m, t2n.inverse());\n\n const translateOrigin = svgroot.createSVGTransform(),\n scale = svgroot.createSVGTransform(),\n translateBack = svgroot.createSVGTransform();\n translateOrigin.setTranslate(t2n.e, t2n.f);\n scale.setScale(s2.a, s2.d);\n translateBack.setTranslate(t2.e, t2.f);\n childTlist.appendItem(translateBack);\n childTlist.appendItem(scale);\n childTlist.appendItem(translateOrigin);\n // childxforms.push(translateBack);\n // childxforms.push(scale);\n // childxforms.push(translateOrigin);\n // logMatrix(translateBack.matrix);\n // logMatrix(scale.matrix);\n } // not rotated\n batchCmd.addSubCommand(recalculateDimensions(child));\n // TODO: If any have this group as a parent and are\n // referencing this child, then we need to impose a reverse\n // scale on it so that when it won't get double-translated\n // const uses = selected.getElementsByTagNameNS(NS.SVG, 'use');\n // const href = '#' + child.id;\n // let u = uses.length;\n // while (u--) {\n // const useElem = uses.item(u);\n // if (href == getHref(useElem)) {\n // const usexlate = svgroot.createSVGTransform();\n // usexlate.setTranslate(-tx,-ty);\n // getTransformList(useElem).insertItemBefore(usexlate,0);\n // batchCmd.addSubCommand( recalculateDimensions(useElem) );\n // }\n // }\n context_.setStartTransform(oldStartTransform);\n } // element\n } // for each child\n // Remove these transforms from group\n tlist.removeItem(N - 1);\n tlist.removeItem(N - 2);\n tlist.removeItem(N - 3);\n } else if (N >= 3 && tlist.getItem(N - 1).type === 1) {\n operation = 3; // scale\n const m = transformListToTransform(tlist).matrix;\n const e2t = svgroot.createSVGTransform();\n e2t.setMatrix(m);\n tlist.clear();\n tlist.appendItem(e2t);\n // next, check if the first transform was a translate\n // if we had [ T1 ] [ M ] we want to transform this into [ M ] [ T2 ]\n // therefore [ T2 ] = [ M_inv ] [ T1 ] [ M ]\n } else if ((N === 1 || (N > 1 && tlist.getItem(1).type !== 3)) &&\n tlist.getItem(0).type === 2) {\n operation = 2; // translate\n const T_M = transformListToTransform(tlist).matrix;\n tlist.removeItem(0);\n const mInv = transformListToTransform(tlist).matrix.inverse();\n const M2 = matrixMultiply(mInv, T_M);\n\n tx = M2.e;\n ty = M2.f;\n\n if (tx !== 0 || ty !== 0) {\n // we pass the translates down to the individual children\n const children = selected.childNodes;\n let c = children.length;\n\n const clipPathsDone = [];\n while (c--) {\n const child = children.item(c);\n if (child.nodeType === 1) {\n // Check if child has clip-path\n if (child.getAttribute('clip-path')) {\n // tx, ty\n const attr = child.getAttribute('clip-path');\n if (!clipPathsDone.includes(attr)) {\n updateClipPath(attr, tx, ty);\n clipPathsDone.push(attr);\n }\n }\n\n oldStartTransform = context_.getStartTransform();\n context_.setStartTransform(child.getAttribute('transform'));\n\n const childTlist = getTransformList(child);\n // some children might not have a transform (, , etc)\n if (childTlist) {\n const newxlate = svgroot.createSVGTransform();\n newxlate.setTranslate(tx, ty);\n if (childTlist.numberOfItems) {\n childTlist.insertItemBefore(newxlate, 0);\n } else {\n childTlist.appendItem(newxlate);\n }\n batchCmd.addSubCommand(recalculateDimensions(child));\n // If any have this group as a parent and are\n // referencing this child, then impose a reverse translate on it\n // so that when it won't get double-translated\n const uses = selected.getElementsByTagNameNS(NS.SVG, 'use');\n const href = '#' + child.id;\n let u = uses.length;\n while (u--) {\n const useElem = uses.item(u);\n if (href === getHref(useElem)) {\n const usexlate = svgroot.createSVGTransform();\n usexlate.setTranslate(-tx, -ty);\n getTransformList(useElem).insertItemBefore(usexlate, 0);\n batchCmd.addSubCommand(recalculateDimensions(useElem));\n }\n }\n context_.setStartTransform(oldStartTransform);\n }\n }\n }\n context_.setStartTransform(oldStartTransform);\n }\n // else, a matrix imposition from a parent group\n // keep pushing it down to the children\n } else if (N === 1 && tlist.getItem(0).type === 1 && !gangle) {\n operation = 1;\n const m = tlist.getItem(0).matrix,\n children = selected.childNodes;\n let c = children.length;\n while (c--) {\n const child = children.item(c);\n if (child.nodeType === 1) {\n oldStartTransform = context_.getStartTransform();\n context_.setStartTransform(child.getAttribute('transform'));\n const childTlist = getTransformList(child);\n\n if (!childTlist) { continue; }\n\n const em = matrixMultiply(m, transformListToTransform(childTlist).matrix);\n const e2m = svgroot.createSVGTransform();\n e2m.setMatrix(em);\n childTlist.clear();\n childTlist.appendItem(e2m, 0);\n\n batchCmd.addSubCommand(recalculateDimensions(child));\n context_.setStartTransform(oldStartTransform);\n\n // Convert stroke\n // TODO: Find out if this should actually happen somewhere else\n const sw = child.getAttribute('stroke-width');\n if (child.getAttribute('stroke') !== 'none' && !isNaN(sw)) {\n const avg = (Math.abs(em.a) + Math.abs(em.d)) / 2;\n child.setAttribute('stroke-width', sw * avg);\n }\n }\n }\n tlist.clear();\n // else it was just a rotate\n } else {\n if (gangle) {\n const newRot = svgroot.createSVGTransform();\n newRot.setRotate(gangle, newcenter.x, newcenter.y);\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(newRot, 0);\n } else {\n tlist.appendItem(newRot);\n }\n }\n if (tlist.numberOfItems === 0) {\n selected.removeAttribute('transform');\n }\n return null;\n }\n\n // if it was a translate, put back the rotate at the new center\n if (operation === 2) {\n if (gangle) {\n newcenter = {\n x: oldcenter.x + firstM.e,\n y: oldcenter.y + firstM.f\n };\n\n const newRot = svgroot.createSVGTransform();\n newRot.setRotate(gangle, newcenter.x, newcenter.y);\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(newRot, 0);\n } else {\n tlist.appendItem(newRot);\n }\n }\n // if it was a resize\n } else if (operation === 3) {\n const m = transformListToTransform(tlist).matrix;\n const roldt = svgroot.createSVGTransform();\n roldt.setRotate(gangle, oldcenter.x, oldcenter.y);\n const rold = roldt.matrix;\n const rnew = svgroot.createSVGTransform();\n rnew.setRotate(gangle, newcenter.x, newcenter.y);\n const rnewInv = rnew.matrix.inverse(),\n mInv = m.inverse(),\n extrat = matrixMultiply(mInv, rnewInv, rold, m);\n\n tx = extrat.e;\n ty = extrat.f;\n\n if (tx !== 0 || ty !== 0) {\n // now push this transform down to the children\n // we pass the translates down to the individual children\n const children = selected.childNodes;\n let c = children.length;\n while (c--) {\n const child = children.item(c);\n if (child.nodeType === 1) {\n oldStartTransform = context_.getStartTransform();\n context_.setStartTransform(child.getAttribute('transform'));\n const childTlist = getTransformList(child);\n const newxlate = svgroot.createSVGTransform();\n newxlate.setTranslate(tx, ty);\n if (childTlist.numberOfItems) {\n childTlist.insertItemBefore(newxlate, 0);\n } else {\n childTlist.appendItem(newxlate);\n }\n\n batchCmd.addSubCommand(recalculateDimensions(child));\n context_.setStartTransform(oldStartTransform);\n }\n }\n }\n\n if (gangle) {\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(rnew, 0);\n } else {\n tlist.appendItem(rnew);\n }\n }\n }\n // else, it's a non-group\n } else {\n // TODO: box might be null for some elements ( etc), need to handle this\n const box = getBBox(selected);\n\n // Paths (and possbly other shapes) will have no BBox while still in ,\n // but we still may need to recalculate them (see issue 595).\n // TODO: Figure out how to get BBox from these elements in case they\n // have a rotation transform\n\n if (!box && selected.tagName !== 'path') return null;\n\n let m; // = svgroot.createSVGMatrix();\n // temporarily strip off the rotate and save the old center\n const angle = getRotationAngle(selected);\n if (angle) {\n oldcenter = {x: box.x + box.width / 2, y: box.y + box.height / 2};\n newcenter = transformPoint(\n box.x + box.width / 2,\n box.y + box.height / 2,\n transformListToTransform(tlist).matrix\n );\n\n const a = angle * Math.PI / 180;\n const s = (Math.abs(a) > (1.0e-10))\n ? Math.sin(a) / (1 - Math.cos(a))\n // TODO: This blows up if the angle is exactly 0!\n : 2 / a;\n\n for (let i = 0; i < tlist.numberOfItems; ++i) {\n const xform = tlist.getItem(i);\n if (xform.type === 4) {\n // extract old center through mystical arts\n const rm = xform.matrix;\n oldcenter.y = (s * rm.e + rm.f) / 2;\n oldcenter.x = (rm.e - s * rm.f) / 2;\n tlist.removeItem(i);\n break;\n }\n }\n }\n\n // 2 = translate, 3 = scale, 4 = rotate, 1 = matrix imposition\n let operation = 0;\n const N = tlist.numberOfItems;\n\n // Check if it has a gradient with userSpaceOnUse, in which case\n // adjust it by recalculating the matrix transform.\n // TODO: Make this work in Webkit using transformlist.SVGTransformList\n if (!isWebkit()) {\n const fill = selected.getAttribute('fill');\n if (fill && fill.startsWith('url(')) {\n const paint = getRefElem(fill);\n let type = 'pattern';\n if (paint.tagName !== type) type = 'gradient';\n const attrVal = paint.getAttribute(type + 'Units');\n if (attrVal === 'userSpaceOnUse') {\n // Update the userSpaceOnUse element\n m = transformListToTransform(tlist).matrix;\n const gtlist = getTransformList(paint);\n const gmatrix = transformListToTransform(gtlist).matrix;\n m = matrixMultiply(m, gmatrix);\n const mStr = 'matrix(' + [m.a, m.b, m.c, m.d, m.e, m.f].join(',') + ')';\n paint.setAttribute(type + 'Transform', mStr);\n }\n }\n }\n\n // first, if it was a scale of a non-skewed element, then the second-last\n // transform will be the [S]\n // if we had [M][T][S][T] we want to extract the matrix equivalent of\n // [T][S][T] and push it down to the element\n if (N >= 3 && tlist.getItem(N - 2).type === 3 &&\n tlist.getItem(N - 3).type === 2 && tlist.getItem(N - 1).type === 2) {\n // Removed this so a with a given [T][S][T] would convert to a matrix.\n // Is that bad?\n // && selected.nodeName != 'use'\n operation = 3; // scale\n m = transformListToTransform(tlist, N - 3, N - 1).matrix;\n tlist.removeItem(N - 1);\n tlist.removeItem(N - 2);\n tlist.removeItem(N - 3);\n // if we had [T][S][-T][M], then this was a skewed element being resized\n // Thus, we simply combine it all into one matrix\n } else if (N === 4 && tlist.getItem(N - 1).type === 1) {\n operation = 3; // scale\n m = transformListToTransform(tlist).matrix;\n const e2t = svgroot.createSVGTransform();\n e2t.setMatrix(m);\n tlist.clear();\n tlist.appendItem(e2t);\n // reset the matrix so that the element is not re-mapped\n m = svgroot.createSVGMatrix();\n // if we had [R][T][S][-T][M], then this was a rotated matrix-element\n // if we had [T1][M] we want to transform this into [M][T2]\n // therefore [ T2 ] = [ M_inv ] [ T1 ] [ M ] and we can push [T2]\n // down to the element\n } else if ((N === 1 || (N > 1 && tlist.getItem(1).type !== 3)) &&\n tlist.getItem(0).type === 2) {\n operation = 2; // translate\n const oldxlate = tlist.getItem(0).matrix,\n meq = transformListToTransform(tlist, 1).matrix,\n meqInv = meq.inverse();\n m = matrixMultiply(meqInv, oldxlate, meq);\n tlist.removeItem(0);\n // else if this child now has a matrix imposition (from a parent group)\n // we might be able to simplify\n } else if (N === 1 && tlist.getItem(0).type === 1 && !angle) {\n // Remap all point-based elements\n m = transformListToTransform(tlist).matrix;\n switch (selected.tagName) {\n case 'line':\n changes = $(selected).attr(['x1', 'y1', 'x2', 'y2']);\n // Fallthrough\n case 'polyline':\n case 'polygon':\n changes.points = selected.getAttribute('points');\n if (changes.points) {\n const list = selected.points;\n const len = list.numberOfItems;\n changes.points = new Array(len);\n for (let i = 0; i < len; ++i) {\n const pt = list.getItem(i);\n changes.points[i] = {x: pt.x, y: pt.y};\n }\n }\n // Fallthrough\n case 'path':\n changes.d = selected.getAttribute('d');\n operation = 1;\n tlist.clear();\n break;\n default:\n break;\n }\n // if it was a rotation, put the rotate back and return without a command\n // (this function has zero work to do for a rotate())\n } else {\n // operation = 4; // rotation\n if (angle) {\n const newRot = svgroot.createSVGTransform();\n newRot.setRotate(angle, newcenter.x, newcenter.y);\n\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(newRot, 0);\n } else {\n tlist.appendItem(newRot);\n }\n }\n if (tlist.numberOfItems === 0) {\n selected.removeAttribute('transform');\n }\n return null;\n }\n\n // if it was a translate or resize, we need to remap the element and absorb the xform\n if (operation === 1 || operation === 2 || operation === 3) {\n remapElement(selected, changes, m);\n } // if we are remapping\n\n // if it was a translate, put back the rotate at the new center\n if (operation === 2) {\n if (angle) {\n if (!hasMatrixTransform(tlist)) {\n newcenter = {\n x: oldcenter.x + m.e,\n y: oldcenter.y + m.f\n };\n }\n const newRot = svgroot.createSVGTransform();\n newRot.setRotate(angle, newcenter.x, newcenter.y);\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(newRot, 0);\n } else {\n tlist.appendItem(newRot);\n }\n }\n // We have special processing for tspans: Tspans are not transformable\n // but they can have x,y coordinates (sigh). Thus, if this was a translate,\n // on a text element, also translate any tspan children.\n if (selected.tagName === 'text') {\n const children = selected.childNodes;\n let c = children.length;\n while (c--) {\n const child = children.item(c);\n if (child.tagName === 'tspan') {\n const tspanChanges = {\n x: $(child).attr('x') || 0,\n y: $(child).attr('y') || 0\n };\n remapElement(child, tspanChanges, m);\n }\n }\n }\n // [Rold][M][T][S][-T] became [Rold][M]\n // we want it to be [Rnew][M][Tr] where Tr is the\n // translation required to re-center it\n // Therefore, [Tr] = [M_inv][Rnew_inv][Rold][M]\n } else if (operation === 3 && angle) {\n const {matrix} = transformListToTransform(tlist);\n const roldt = svgroot.createSVGTransform();\n roldt.setRotate(angle, oldcenter.x, oldcenter.y);\n const rold = roldt.matrix;\n const rnew = svgroot.createSVGTransform();\n rnew.setRotate(angle, newcenter.x, newcenter.y);\n const rnewInv = rnew.matrix.inverse();\n const mInv = matrix.inverse();\n const extrat = matrixMultiply(mInv, rnewInv, rold, matrix);\n\n remapElement(selected, changes, extrat);\n if (angle) {\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(rnew, 0);\n } else {\n tlist.appendItem(rnew);\n }\n }\n }\n } // a non-group\n\n // if the transform list has been emptied, remove it\n if (tlist.numberOfItems === 0) {\n selected.removeAttribute('transform');\n }\n\n batchCmd.addSubCommand(new ChangeElementCommand(selected, initial));\n\n return batchCmd;\n};\n","/* globals jQuery */\n/**\n * DOM element selection box tools.\n * @module select\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Jeff Schiller\n */\n\nimport {isTouch, isWebkit} from '../common/browser.js'; // , isOpera\nimport {getRotationAngle, getBBox, getStrokedBBox, isNullish} from '../common/utilities.js';\nimport {transformListToTransform, transformBox, transformPoint} from '../common/math.js';\nimport {getTransformList} from '../common/svgtransformlist.js';\n\nconst $ = jQuery;\n\nlet svgFactory_;\nlet config_;\nlet selectorManager_; // A Singleton\nconst gripRadius = isTouch() ? 10 : 4;\n\n/**\n* Private class for DOM element selection boxes.\n*/\nexport class Selector {\n /**\n * @param {Integer} id - Internally identify the selector\n * @param {Element} elem - DOM element associated with this selector\n * @param {module:utilities.BBoxObject} [bbox] - Optional bbox to use for initialization (prevents duplicate `getBBox` call).\n */\n constructor (id, elem, bbox) {\n // this is the selector's unique number\n this.id = id;\n\n // this holds a reference to the element for which this selector is being used\n this.selectedElement = elem;\n\n // this is a flag used internally to track whether the selector is being used or not\n this.locked = true;\n\n // this holds a reference to the element that holds all visual elements of the selector\n this.selectorGroup = svgFactory_.createSVGElement({\n element: 'g',\n attr: {id: ('selectorGroup' + this.id)}\n });\n\n // this holds a reference to the path rect\n this.selectorRect = this.selectorGroup.appendChild(\n svgFactory_.createSVGElement({\n element: 'path',\n attr: {\n id: ('selectedBox' + this.id),\n fill: 'none',\n stroke: '#22C',\n 'stroke-width': '1',\n 'stroke-dasharray': '5,5',\n // need to specify this so that the rect is not selectable\n style: 'pointer-events:none'\n }\n })\n );\n\n // this holds a reference to the grip coordinates for this selector\n this.gripCoords = {\n nw: null,\n n: null,\n ne: null,\n e: null,\n se: null,\n s: null,\n sw: null,\n w: null\n };\n\n this.reset(this.selectedElement, bbox);\n }\n\n /**\n * Used to reset the id and element that the selector is attached to.\n * @param {Element} e - DOM element associated with this selector\n * @param {module:utilities.BBoxObject} bbox - Optional bbox to use for reset (prevents duplicate getBBox call).\n * @returns {void}\n */\n reset (e, bbox) {\n this.locked = true;\n this.selectedElement = e;\n this.resize(bbox);\n this.selectorGroup.setAttribute('display', 'inline');\n }\n\n /**\n * Show the resize grips of this selector.\n * @param {boolean} show - Indicates whether grips should be shown or not\n * @returns {void}\n */\n showGrips (show) {\n const bShow = show ? 'inline' : 'none';\n selectorManager_.selectorGripsGroup.setAttribute('display', bShow);\n const elem = this.selectedElement;\n this.hasGrips = show;\n if (elem && show) {\n this.selectorGroup.append(selectorManager_.selectorGripsGroup);\n Selector.updateGripCursors(getRotationAngle(elem));\n }\n }\n\n /**\n * Updates the selector to match the element's size.\n * @param {module:utilities.BBoxObject} [bbox] - BBox to use for resize (prevents duplicate getBBox call).\n * @returns {void}\n */\n resize (bbox) {\n const selectedBox = this.selectorRect,\n mgr = selectorManager_,\n selectedGrips = mgr.selectorGrips,\n selected = this.selectedElement,\n sw = selected.getAttribute('stroke-width'),\n currentZoom = svgFactory_.getCurrentZoom();\n let offset = 1 / currentZoom;\n if (selected.getAttribute('stroke') !== 'none' && !isNaN(sw)) {\n offset += (sw / 2);\n }\n\n const {tagName} = selected;\n if (tagName === 'text') {\n offset += 2 / currentZoom;\n }\n\n // loop and transform our bounding box until we reach our first rotation\n const tlist = getTransformList(selected);\n const m = transformListToTransform(tlist).matrix;\n\n // This should probably be handled somewhere else, but for now\n // it keeps the selection box correctly positioned when zoomed\n m.e *= currentZoom;\n m.f *= currentZoom;\n\n if (!bbox) {\n bbox = getBBox(selected);\n }\n // TODO: getBBox (previous line) already knows to call getStrokedBBox when tagName === 'g'. Remove this?\n // TODO: getBBox doesn't exclude 'gsvg' and calls getStrokedBBox for any 'g'. Should getBBox be updated?\n if (tagName === 'g' && !$.data(selected, 'gsvg')) {\n // The bbox for a group does not include stroke vals, so we\n // get the bbox based on its children.\n const strokedBbox = getStrokedBBox([selected.childNodes]);\n if (strokedBbox) {\n bbox = strokedBbox;\n }\n }\n\n // apply the transforms\n const l = bbox.x, t = bbox.y, w = bbox.width, h = bbox.height;\n // bbox = {x: l, y: t, width: w, height: h}; // Not in use\n\n // we need to handle temporary transforms too\n // if skewed, get its transformed box, then find its axis-aligned bbox\n\n // *\n offset *= currentZoom;\n\n const nbox = transformBox(l * currentZoom, t * currentZoom, w * currentZoom, h * currentZoom, m),\n {aabox} = nbox;\n let nbax = aabox.x - offset,\n nbay = aabox.y - offset,\n nbaw = aabox.width + (offset * 2),\n nbah = aabox.height + (offset * 2);\n\n // now if the shape is rotated, un-rotate it\n const cx = nbax + nbaw / 2,\n cy = nbay + nbah / 2;\n\n const angle = getRotationAngle(selected);\n if (angle) {\n const rot = svgFactory_.svgRoot().createSVGTransform();\n rot.setRotate(-angle, cx, cy);\n const rotm = rot.matrix;\n nbox.tl = transformPoint(nbox.tl.x, nbox.tl.y, rotm);\n nbox.tr = transformPoint(nbox.tr.x, nbox.tr.y, rotm);\n nbox.bl = transformPoint(nbox.bl.x, nbox.bl.y, rotm);\n nbox.br = transformPoint(nbox.br.x, nbox.br.y, rotm);\n\n // calculate the axis-aligned bbox\n const {tl} = nbox;\n let minx = tl.x,\n miny = tl.y,\n maxx = tl.x,\n maxy = tl.y;\n\n const {min, max} = Math;\n\n minx = min(minx, min(nbox.tr.x, min(nbox.bl.x, nbox.br.x))) - offset;\n miny = min(miny, min(nbox.tr.y, min(nbox.bl.y, nbox.br.y))) - offset;\n maxx = max(maxx, max(nbox.tr.x, max(nbox.bl.x, nbox.br.x))) + offset;\n maxy = max(maxy, max(nbox.tr.y, max(nbox.bl.y, nbox.br.y))) + offset;\n\n nbax = minx;\n nbay = miny;\n nbaw = (maxx - minx);\n nbah = (maxy - miny);\n }\n\n const dstr = 'M' + nbax + ',' + nbay +\n ' L' + (nbax + nbaw) + ',' + nbay +\n ' ' + (nbax + nbaw) + ',' + (nbay + nbah) +\n ' ' + nbax + ',' + (nbay + nbah) + 'z';\n selectedBox.setAttribute('d', dstr);\n\n const xform = angle ? 'rotate(' + [angle, cx, cy].join(',') + ')' : '';\n this.selectorGroup.setAttribute('transform', xform);\n\n // TODO(codedread): Is this needed?\n // if (selected === selectedElements[0]) {\n this.gripCoords = {\n nw: [nbax, nbay],\n ne: [nbax + nbaw, nbay],\n sw: [nbax, nbay + nbah],\n se: [nbax + nbaw, nbay + nbah],\n n: [nbax + (nbaw) / 2, nbay],\n w: [nbax, nbay + (nbah) / 2],\n e: [nbax + nbaw, nbay + (nbah) / 2],\n s: [nbax + (nbaw) / 2, nbay + nbah]\n };\n Object.entries(this.gripCoords).forEach(([dir, coords]) => {\n selectedGrips[dir].setAttribute('cx', coords[0]);\n selectedGrips[dir].setAttribute('cy', coords[1]);\n });\n\n // we want to go 20 pixels in the negative transformed y direction, ignoring scale\n mgr.rotateGripConnector.setAttribute('x1', nbax + (nbaw) / 2);\n mgr.rotateGripConnector.setAttribute('y1', nbay);\n mgr.rotateGripConnector.setAttribute('x2', nbax + (nbaw) / 2);\n mgr.rotateGripConnector.setAttribute('y2', nbay - (gripRadius * 5));\n\n mgr.rotateGrip.setAttribute('cx', nbax + (nbaw) / 2);\n mgr.rotateGrip.setAttribute('cy', nbay - (gripRadius * 5));\n // }\n }\n\n // STATIC methods\n /**\n * Updates cursors for corner grips on rotation so arrows point the right way.\n * @param {Float} angle - Current rotation angle in degrees\n * @returns {void}\n */\n static updateGripCursors (angle) {\n const dirArr = Object.keys(selectorManager_.selectorGrips);\n let steps = Math.round(angle / 45);\n if (steps < 0) { steps += 8; }\n while (steps > 0) {\n dirArr.push(dirArr.shift());\n steps--;\n }\n Object.values(selectorManager_.selectorGrips).forEach((gripElement, i) => {\n gripElement.setAttribute('style', ('cursor:' + dirArr[i] + '-resize'));\n });\n }\n}\n\n/**\n* Manage all selector objects (selection boxes).\n*/\nexport class SelectorManager {\n /**\n * Sets up properties and calls `initGroup`.\n */\n constructor () {\n // this will hold the element that contains all selector rects/grips\n this.selectorParentGroup = null;\n\n // this is a special rect that is used for multi-select\n this.rubberBandBox = null;\n\n // this will hold objects of type Selector (see above)\n this.selectors = [];\n\n // this holds a map of SVG elements to their Selector object\n this.selectorMap = {};\n\n // this holds a reference to the grip elements\n this.selectorGrips = {\n nw: null,\n n: null,\n ne: null,\n e: null,\n se: null,\n s: null,\n sw: null,\n w: null\n };\n\n this.selectorGripsGroup = null;\n this.rotateGripConnector = null;\n this.rotateGrip = null;\n\n this.initGroup();\n }\n\n /**\n * Resets the parent selector group element.\n * @returns {void}\n */\n initGroup () {\n // remove old selector parent group if it existed\n if (this.selectorParentGroup && this.selectorParentGroup.parentNode) {\n this.selectorParentGroup.remove();\n }\n\n // create parent selector group and add it to svgroot\n this.selectorParentGroup = svgFactory_.createSVGElement({\n element: 'g',\n attr: {id: 'selectorParentGroup'}\n });\n this.selectorGripsGroup = svgFactory_.createSVGElement({\n element: 'g',\n attr: {display: 'none'}\n });\n this.selectorParentGroup.append(this.selectorGripsGroup);\n svgFactory_.svgRoot().append(this.selectorParentGroup);\n\n this.selectorMap = {};\n this.selectors = [];\n this.rubberBandBox = null;\n\n // add the corner grips\n Object.keys(this.selectorGrips).forEach((dir) => {\n const grip = svgFactory_.createSVGElement({\n element: 'circle',\n attr: {\n id: ('selectorGrip_resize_' + dir),\n fill: '#22C',\n r: gripRadius,\n style: ('cursor:' + dir + '-resize'),\n // This expands the mouse-able area of the grips making them\n // easier to grab with the mouse.\n // This works in Opera and WebKit, but does not work in Firefox\n // see https://bugzilla.mozilla.org/show_bug.cgi?id=500174\n 'stroke-width': 2,\n 'pointer-events': 'all'\n }\n });\n\n $.data(grip, 'dir', dir);\n $.data(grip, 'type', 'resize');\n this.selectorGrips[dir] = this.selectorGripsGroup.appendChild(grip);\n });\n\n // add rotator elems\n this.rotateGripConnector = this.selectorGripsGroup.appendChild(\n svgFactory_.createSVGElement({\n element: 'line',\n attr: {\n id: ('selectorGrip_rotateconnector'),\n stroke: '#22C',\n 'stroke-width': '1'\n }\n })\n );\n\n this.rotateGrip = this.selectorGripsGroup.appendChild(\n svgFactory_.createSVGElement({\n element: 'circle',\n attr: {\n id: 'selectorGrip_rotate',\n fill: 'lime',\n r: gripRadius,\n stroke: '#22C',\n 'stroke-width': 2,\n style: 'cursor:url(' + config_.imgPath + 'rotate.png) 12 12, auto;'\n }\n })\n );\n $.data(this.rotateGrip, 'type', 'rotate');\n\n if ($('#canvasBackground').length) { return; }\n\n const [width, height] = config_.dimensions;\n const canvasbg = svgFactory_.createSVGElement({\n element: 'svg',\n attr: {\n id: 'canvasBackground',\n width,\n height,\n x: 0,\n y: 0,\n overflow: (isWebkit() ? 'none' : 'visible'), // Chrome 7 has a problem with this when zooming out\n style: 'pointer-events:none'\n }\n });\n\n const rect = svgFactory_.createSVGElement({\n element: 'rect',\n attr: {\n width: '100%',\n height: '100%',\n x: 0,\n y: 0,\n 'stroke-width': 1,\n stroke: '#000',\n fill: '#FFF',\n style: 'pointer-events:none'\n }\n });\n\n // Both Firefox and WebKit are too slow with this filter region (especially at higher\n // zoom levels) and Opera has at least one bug\n // if (!isOpera()) rect.setAttribute('filter', 'url(#canvashadow)');\n canvasbg.append(rect);\n svgFactory_.svgRoot().insertBefore(canvasbg, svgFactory_.svgContent());\n // Ok to replace above with `svgFactory_.svgContent().before(canvasbg);`?\n }\n\n /**\n *\n * @param {Element} elem - DOM element to get the selector for\n * @param {module:utilities.BBoxObject} [bbox] - Optional bbox to use for reset (prevents duplicate getBBox call).\n * @returns {Selector} The selector based on the given element\n */\n requestSelector (elem, bbox) {\n if (isNullish(elem)) { return null; }\n\n const N = this.selectors.length;\n // If we've already acquired one for this element, return it.\n if (typeof this.selectorMap[elem.id] === 'object') {\n this.selectorMap[elem.id].locked = true;\n return this.selectorMap[elem.id];\n }\n for (let i = 0; i < N; ++i) {\n if (this.selectors[i] && !this.selectors[i].locked) {\n this.selectors[i].locked = true;\n this.selectors[i].reset(elem, bbox);\n this.selectorMap[elem.id] = this.selectors[i];\n return this.selectors[i];\n }\n }\n // if we reached here, no available selectors were found, we create one\n this.selectors[N] = new Selector(N, elem, bbox);\n this.selectorParentGroup.append(this.selectors[N].selectorGroup);\n this.selectorMap[elem.id] = this.selectors[N];\n return this.selectors[N];\n }\n\n /**\n * Removes the selector of the given element (hides selection box).\n *\n * @param {Element} elem - DOM element to remove the selector for\n * @returns {void}\n */\n releaseSelector (elem) {\n if (isNullish(elem)) { return; }\n const N = this.selectors.length,\n sel = this.selectorMap[elem.id];\n if (!sel.locked) {\n // TODO(codedread): Ensure this exists in this module.\n console.log('WARNING! selector was released but was already unlocked'); // eslint-disable-line no-console\n }\n for (let i = 0; i < N; ++i) {\n if (this.selectors[i] && this.selectors[i] === sel) {\n delete this.selectorMap[elem.id];\n sel.locked = false;\n sel.selectedElement = null;\n sel.showGrips(false);\n\n // remove from DOM and store reference in JS but only if it exists in the DOM\n try {\n sel.selectorGroup.setAttribute('display', 'none');\n } catch (e) {}\n\n break;\n }\n }\n }\n\n /**\n * @returns {SVGRectElement} The rubberBandBox DOM element. This is the rectangle drawn by\n * the user for selecting/zooming\n */\n getRubberBandBox () {\n if (!this.rubberBandBox) {\n this.rubberBandBox = this.selectorParentGroup.appendChild(\n svgFactory_.createSVGElement({\n element: 'rect',\n attr: {\n id: 'selectorRubberBand',\n fill: '#22C',\n 'fill-opacity': 0.15,\n stroke: '#22C',\n 'stroke-width': 0.5,\n display: 'none',\n style: 'pointer-events:none'\n }\n })\n );\n }\n return this.rubberBandBox;\n }\n}\n\n/**\n * An object that creates SVG elements for the canvas.\n *\n * @interface module:select.SVGFactory\n */\n/**\n * @function module:select.SVGFactory#createSVGElement\n * @param {module:utilities.EditorContext#addSVGElementFromJson} jsonMap\n * @returns {SVGElement}\n */\n/**\n * @function module:select.SVGFactory#svgRoot\n * @returns {SVGSVGElement}\n */\n/**\n * @function module:select.SVGFactory#svgContent\n * @returns {SVGSVGElement}\n */\n/**\n * @function module:select.SVGFactory#getCurrentZoom\n * @returns {Float} The current zoom level\n */\n\n/**\n * @typedef {GenericArray} module:select.Dimensions\n * @property {Integer} length 2\n * @property {Float} 0 Width\n * @property {Float} 1 Height\n */\n/**\n * @typedef {PlainObject} module:select.Config\n * @property {string} imgPath\n * @property {module:select.Dimensions} dimensions\n */\n\n/**\n * Initializes this module.\n * @function module:select.init\n * @param {module:select.Config} config - An object containing configurable parameters (imgPath)\n * @param {module:select.SVGFactory} svgFactory - An object implementing the SVGFactory interface.\n * @returns {void}\n */\nexport const init = function (config, svgFactory) {\n config_ = config;\n svgFactory_ = svgFactory;\n selectorManager_ = new SelectorManager();\n};\n\n/**\n * @function module:select.getSelectorManager\n * @returns {module:select.SelectorManager} The SelectorManager instance.\n */\nexport const getSelectorManager = () => selectorManager_;\n","/* eslint-disable indent, unicorn/no-fn-reference-in-iterator */\n/* globals jQuery, jsPDF */\n/**\n * Numerous tools for working with the editor's \"canvas\".\n * @module svgcanvas\n *\n * @license MIT\n *\n * @copyright 2010 Alexis Deveria, 2010 Pavol Rusnak, 2010 Jeff Schiller\n *\n */\n\n/* Dependencies:\n1. Also expects jQuery UI for `svgCanvasToString` and\n`convertToGroup` use of `:data()` selector\n*/\n\n// Todo: Obtain/adapt latest jsPDF to utilize ES Module for `jsPDF`/avoid global\n\nimport '../common/svgpathseg.js';\nimport jQueryPluginSVG from '../common/jQuery.attr.js'; // Needed for SVG attribute setting and array form with `attr`\nimport jQueryPluginDBox from './dbox.js';\n\nimport * as pathModule from './path.js';\nimport * as hstry from './history.js';\nimport * as draw from './draw.js';\n// eslint-disable-next-line no-duplicate-imports\nimport {\n identifyLayers, createLayer, cloneLayer, deleteCurrentLayer,\n setCurrentLayer, renameCurrentLayer, setCurrentLayerPosition,\n setLayerVisibility, moveSelectedToLayer, mergeLayer, mergeAllLayers,\n leaveContext, setContext\n} from './draw.js';\nimport {sanitizeSvg} from './sanitize.js';\nimport {getReverseNS, NS} from '../common/namespaces.js';\nimport {importSetGlobal, importScript} from '../external/dynamic-import-polyfill/importModule.js';\nimport {\n text2xml, assignAttributes, cleanupElement, getElem, getUrlFromAttr,\n findDefs, getHref, setHref, getRefElem, getRotationAngle, getPathBBox,\n preventClickDefault, snapToGrid, walkTree, walkTreePost,\n getBBoxOfElementAsPath, convertToPath, toXml, encode64, decode64,\n dataURLToObjectURL, createObjectURL,\n getVisibleElements, dropXMLInternalSubset,\n init as utilsInit, getBBox as utilsGetBBox, getStrokedBBoxDefaultVisible,\n isNullish\n} from '../common/utilities.js';\nimport {\n transformPoint, matrixMultiply, hasMatrixTransform, transformListToTransform,\n getMatrix, snapToAngle, isIdentity, rectsIntersect, transformBox\n} from '../common/math.js';\nimport {\n convertToNum, convertAttrs, convertUnit, shortFloat, getTypeMap,\n init as unitsInit\n} from '../common/units.js';\nimport {\n isGecko, isChrome, isIE, isWebkit, supportsNonScalingStroke, supportsGoodTextCharPos\n} from '../common/browser.js'; // , supportsEditableText\nimport {\n getTransformList, resetListMap,\n SVGTransformList as SVGEditTransformList\n} from '../common/svgtransformlist.js';\nimport {\n remapElement,\n init as coordsInit\n} from './coords.js';\nimport {\n recalculateDimensions,\n init as recalculateInit\n} from './recalculate.js';\nimport {\n getSelectorManager,\n Selector,\n init as selectInit\n} from './select.js';\n\nlet $ = jQueryPluginSVG(jQuery);\nconst {\n MoveElementCommand, InsertElementCommand, RemoveElementCommand,\n ChangeElementCommand, BatchCommand, UndoManager, HistoryEventTypes\n} = hstry;\n\nif (!window.console) {\n window.console = {};\n window.console.log = function (str) { /* */ };\n window.console.dir = function (str) { /* */ };\n}\n\nif (window.opera) {\n window.console.log = function (str) { window.opera.postError(str); };\n window.console.dir = function (str) { /* */ };\n}\n\n// Reenable after fixing eslint-plugin-jsdoc to handle\n/**\n* The main SvgCanvas class that manages all SVG-related functions.\n* @memberof module:svgcanvas\n*\n* @borrows module:coords.remapElement as #remapElement\n* @borrows module:recalculate.recalculateDimensions as #recalculateDimensions\n*\n* @borrows module:utilities.cleanupElement as #cleanupElement\n* @borrows module:utilities.getStrokedBBoxDefaultVisible as #getStrokedBBox\n* @borrows module:utilities.getVisibleElements as #getVisibleElements\n* @borrows module:utilities.findDefs as #findDefs\n* @borrows module:utilities.getUrlFromAttr as #getUrlFromAttr\n* @borrows module:utilities.getHref as #getHref\n* @borrows module:utilities.setHref as #setHref\n* @borrows module:utilities.getRotationAngle as #getRotationAngle\n* @borrows module:utilities.getBBox as #getBBox\n* @borrows module:utilities.getElem as #getElem\n* @borrows module:utilities.getRefElem as #getRefElem\n* @borrows module:utilities.assignAttributes as #assignAttributes\n*\n* @borrows module:SVGTransformList.getTransformList as #getTransformList\n* @borrows module:math.matrixMultiply as #matrixMultiply\n* @borrows module:math.hasMatrixTransform as #hasMatrixTransform\n* @borrows module:math.transformListToTransform as #transformListToTransform\n* @borrows module:units.convertToNum as #convertToNum\n* @borrows module:sanitize.sanitizeSvg as #sanitizeSvg\n* @borrows module:path.pathActions.linkControlPoints as #linkControlPoints\n*/\nclass SvgCanvas {\n /**\n * @param {HTMLElement} container - The container HTML element that should hold the SVG root element\n * @param {module:SVGEditor.curConfig} config - An object that contains configuration data\n */\n constructor (container, config) {\n// Alias Namespace constants\n\n// Default configuration options\nconst curConfig = {\n show_outside_canvas: true,\n selectNew: true,\n dimensions: [640, 480]\n};\n\n// Update config with new one if given\nif (config) {\n $.extend(curConfig, config);\n}\n\n// Array with width/height of canvas\nconst {dimensions} = curConfig;\n\nconst canvas = this; // eslint-disable-line consistent-this\n\n// \"document\" element associated with the container (same as window.document using default svg-editor.js)\n// NOTE: This is not actually a SVG document, but an HTML document.\nconst svgdoc = container.ownerDocument;\n\n// This is a container for the document being edited, not the document itself.\n/**\n * @name module:svgcanvas~svgroot\n * @type {SVGSVGElement}\n */\nconst svgroot = svgdoc.importNode(\n text2xml(\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n '' +\n ' ' +\n ' ' +\n ' ' +\n ' '\n ).documentElement,\n true\n);\ncontainer.append(svgroot);\n\n/**\n * The actual element that represents the final output SVG element.\n * @name module:svgcanvas~svgcontent\n * @type {SVGSVGElement}\n */\nlet svgcontent = svgdoc.createElementNS(NS.SVG, 'svg');\n\n/**\n* This function resets the svgcontent element while keeping it in the DOM.\n* @function module:svgcanvas.SvgCanvas#clearSvgContentElement\n* @returns {void}\n*/\nconst clearSvgContentElement = canvas.clearSvgContentElement = function () {\n $(svgcontent).empty();\n\n // TODO: Clear out all other attributes first?\n $(svgcontent).attr({\n id: 'svgcontent',\n width: dimensions[0],\n height: dimensions[1],\n x: dimensions[0],\n y: dimensions[1],\n overflow: curConfig.show_outside_canvas ? 'visible' : 'hidden',\n xmlns: NS.SVG,\n 'xmlns:se': NS.SE,\n 'xmlns:xlink': NS.XLINK\n }).appendTo(svgroot);\n\n // TODO: make this string optional and set by the client\n const comment = svgdoc.createComment(' Created with SVG-edit - https://github.com/SVG-Edit/svgedit');\n svgcontent.append(comment);\n};\nclearSvgContentElement();\n\n// Prefix string for element IDs\nlet idprefix = 'svg_';\n\n/**\n* Changes the ID prefix to the given value.\n* @function module:svgcanvas.SvgCanvas#setIdPrefix\n* @param {string} p - String with the new prefix\n* @returns {void}\n*/\ncanvas.setIdPrefix = function (p) {\n idprefix = p;\n};\n\n/**\n* Current `draw.Drawing` object.\n* @type {module:draw.Drawing}\n* @name module:svgcanvas.SvgCanvas#current_drawing_\n*/\ncanvas.current_drawing_ = new draw.Drawing(svgcontent, idprefix);\n\n/**\n* Returns the current Drawing.\n* @name module:svgcanvas.SvgCanvas#getCurrentDrawing\n* @type {module:draw.DrawCanvasInit#getCurrentDrawing}\n*/\nconst getCurrentDrawing = canvas.getCurrentDrawing = function () {\n return canvas.current_drawing_;\n};\n\n/**\n* Float displaying the current zoom level (1 = 100%, .5 = 50%, etc.).\n* @type {Float}\n*/\nlet currentZoom = 1;\n\n// pointer to current group (for in-group editing)\nlet currentGroup = null;\n\n// Object containing data for the currently selected styles\nconst allProperties = {\n shape: {\n fill: (curConfig.initFill.color === 'none' ? '' : '#') + curConfig.initFill.color,\n fill_paint: null,\n fill_opacity: curConfig.initFill.opacity,\n stroke: '#' + curConfig.initStroke.color,\n stroke_paint: null,\n stroke_opacity: curConfig.initStroke.opacity,\n stroke_width: curConfig.initStroke.width,\n stroke_dasharray: 'none',\n stroke_linejoin: 'miter',\n stroke_linecap: 'butt',\n opacity: curConfig.initOpacity\n }\n};\n\nallProperties.text = $.extend(true, {}, allProperties.shape);\n$.extend(allProperties.text, {\n fill: '#000000',\n stroke_width: curConfig.text && curConfig.text.stroke_width,\n font_size: curConfig.text && curConfig.text.font_size,\n font_family: curConfig.text && curConfig.text.font_family\n});\n\n// Current shape style properties\nconst curShape = allProperties.shape;\n\n// Array with all the currently selected elements\n// default size of 1 until it needs to grow bigger\nlet selectedElements = [];\n\n/**\n* @typedef {PlainObject} module:svgcanvas.SVGAsJSON\n* @property {string} element\n* @property {PlainObject} attr\n* @property {module:svgcanvas.SVGAsJSON[]} children\n*/\n\n/**\n* @function module:svgcanvas.SvgCanvas#getContentElem\n* @param {Text|Element} data\n* @returns {module:svgcanvas.SVGAsJSON}\n*/\nconst getJsonFromSvgElement = this.getJsonFromSvgElement = function (data) {\n // Text node\n if (data.nodeType === 3) return data.nodeValue;\n\n const retval = {\n element: data.tagName,\n // namespace: nsMap[data.namespaceURI],\n attr: {},\n children: []\n };\n\n // Iterate attributes\n for (let i = 0, attr; (attr = data.attributes[i]); i++) {\n retval.attr[attr.name] = attr.value;\n }\n\n // Iterate children\n for (let i = 0, node; (node = data.childNodes[i]); i++) {\n retval.children[i] = getJsonFromSvgElement(node);\n }\n\n return retval;\n};\n\n/**\n* This should really be an intersection implementing all rather than a union.\n* @name module:svgcanvas.SvgCanvas#addSVGElementFromJson\n* @type {module:utilities.EditorContext#addSVGElementFromJson|module:path.EditorContext#addSVGElementFromJson}\n*/\nconst addSVGElementFromJson = this.addSVGElementFromJson = function (data) {\n if (typeof data === 'string') return svgdoc.createTextNode(data);\n\n let shape = getElem(data.attr.id);\n // if shape is a path but we need to create a rect/ellipse, then remove the path\n const currentLayer = getCurrentDrawing().getCurrentLayer();\n if (shape && data.element !== shape.tagName) {\n shape.remove();\n shape = null;\n }\n if (!shape) {\n const ns = data.namespace || NS.SVG;\n shape = svgdoc.createElementNS(ns, data.element);\n if (currentLayer) {\n (currentGroup || currentLayer).append(shape);\n }\n }\n if (data.curStyles) {\n assignAttributes(shape, {\n fill: curShape.fill,\n stroke: curShape.stroke,\n 'stroke-width': curShape.stroke_width,\n 'stroke-dasharray': curShape.stroke_dasharray,\n 'stroke-linejoin': curShape.stroke_linejoin,\n 'stroke-linecap': curShape.stroke_linecap,\n 'stroke-opacity': curShape.stroke_opacity,\n 'fill-opacity': curShape.fill_opacity,\n opacity: curShape.opacity / 2,\n style: 'pointer-events:inherit'\n }, 100);\n }\n assignAttributes(shape, data.attr, 100);\n cleanupElement(shape);\n\n // Children\n if (data.children) {\n data.children.forEach((child) => {\n shape.append(addSVGElementFromJson(child));\n });\n }\n\n return shape;\n};\n\ncanvas.getTransformList = getTransformList;\n\ncanvas.matrixMultiply = matrixMultiply;\ncanvas.hasMatrixTransform = hasMatrixTransform;\ncanvas.transformListToTransform = transformListToTransform;\n\n/**\n* @type {module:utilities.EditorContext#getBaseUnit}\n*/\nconst getBaseUnit = () => { return curConfig.baseUnit; };\n\n/**\n* Initialize from units.js.\n* Send in an object implementing the ElementContainer interface (see units.js).\n*/\nunitsInit(\n /**\n * @implements {module:units.ElementContainer}\n */\n {\n getBaseUnit,\n getElement: getElem,\n getHeight () { return svgcontent.getAttribute('height') / currentZoom; },\n getWidth () { return svgcontent.getAttribute('width') / currentZoom; },\n getRoundDigits () { return saveOptions.round_digits; }\n }\n);\n\ncanvas.convertToNum = convertToNum;\n\n/**\n* This should really be an intersection implementing all rather than a union.\n* @type {module:draw.DrawCanvasInit#getSVGContent|module:utilities.EditorContext#getSVGContent}\n*/\nconst getSVGContent = () => { return svgcontent; };\n\n/**\n* Should really be an intersection with all needing to apply rather than a union.\n* @name module:svgcanvas.SvgCanvas#getSelectedElements\n* @type {module:utilities.EditorContext#getSelectedElements|module:draw.DrawCanvasInit#getSelectedElements|module:path.EditorContext#getSelectedElements}\n*/\nconst getSelectedElements = this.getSelectedElems = function () {\n return selectedElements;\n};\n\nconst {pathActions} = pathModule;\n\n/**\n* This should actually be an intersection as all interfaces should be met.\n* @type {module:utilities.EditorContext#getSVGRoot|module:recalculate.EditorContext#getSVGRoot|module:coords.EditorContext#getSVGRoot|module:path.EditorContext#getSVGRoot}\n*/\nconst getSVGRoot = () => svgroot;\n\nutilsInit(\n /**\n * @implements {module:utilities.EditorContext}\n */\n {\n pathActions, // Ok since not modifying\n getSVGContent,\n addSVGElementFromJson,\n getSelectedElements,\n getDOMDocument () { return svgdoc; },\n getDOMContainer () { return container; },\n getSVGRoot,\n // TODO: replace this mostly with a way to get the current drawing.\n getBaseUnit,\n getSnappingStep () { return curConfig.snappingStep; }\n }\n);\n\ncanvas.findDefs = findDefs;\ncanvas.getUrlFromAttr = getUrlFromAttr;\ncanvas.getHref = getHref;\ncanvas.setHref = setHref;\n/* const getBBox = */ canvas.getBBox = utilsGetBBox;\ncanvas.getRotationAngle = getRotationAngle;\ncanvas.getElem = getElem;\ncanvas.getRefElem = getRefElem;\ncanvas.assignAttributes = assignAttributes;\n\nthis.cleanupElement = cleanupElement;\n\n/**\n* This should actually be an intersection not a union as all should apply.\n* @type {module:coords.EditorContext#getGridSnapping|module:path.EditorContext#getGridSnapping}\n*/\nconst getGridSnapping = () => { return curConfig.gridSnapping; };\n\ncoordsInit(\n /**\n * @implements {module:coords.EditorContext}\n */\n {\n getDrawing () { return getCurrentDrawing(); },\n getSVGRoot,\n getGridSnapping\n }\n);\nthis.remapElement = remapElement;\n\nrecalculateInit(\n /**\n * @implements {module:recalculate.EditorContext}\n */\n {\n getSVGRoot,\n getStartTransform () { return startTransform; },\n setStartTransform (transform) { startTransform = transform; }\n }\n);\nthis.recalculateDimensions = recalculateDimensions;\n\n// import from sanitize.js\nconst nsMap = getReverseNS();\ncanvas.sanitizeSvg = sanitizeSvg;\n\n/**\n* @name undoMgr\n* @memberof module:svgcanvas.SvgCanvas#\n* @type {module:history.HistoryEventHandler}\n*/\nconst undoMgr = canvas.undoMgr = new UndoManager({\n /**\n * @param {string} eventType One of the HistoryEvent types\n * @param {module:history.HistoryCommand} cmd Fulfills the HistoryCommand interface\n * @fires module:svgcanvas.SvgCanvas#event:changed\n * @returns {void}\n */\n handleHistoryEvent (eventType, cmd) {\n const EventTypes = HistoryEventTypes;\n // TODO: handle setBlurOffsets.\n if (eventType === EventTypes.BEFORE_UNAPPLY || eventType === EventTypes.BEFORE_APPLY) {\n canvas.clearSelection();\n } else if (eventType === EventTypes.AFTER_APPLY || eventType === EventTypes.AFTER_UNAPPLY) {\n const elems = cmd.elements();\n canvas.pathActions.clear();\n call('changed', elems);\n const cmdType = cmd.type();\n const isApply = (eventType === EventTypes.AFTER_APPLY);\n if (cmdType === 'MoveElementCommand') {\n const parent = isApply ? cmd.newParent : cmd.oldParent;\n if (parent === svgcontent) {\n draw.identifyLayers();\n }\n } else if (cmdType === 'InsertElementCommand' ||\n cmdType === 'RemoveElementCommand') {\n if (cmd.parent === svgcontent) {\n draw.identifyLayers();\n }\n if (cmdType === 'InsertElementCommand') {\n if (isApply) { restoreRefElems(cmd.elem); }\n } else if (!isApply) {\n restoreRefElems(cmd.elem);\n }\n if (cmd.elem && cmd.elem.tagName === 'use') {\n setUseData(cmd.elem);\n }\n } else if (cmdType === 'ChangeElementCommand') {\n // if we are changing layer names, re-identify all layers\n if (cmd.elem.tagName === 'title' &&\n cmd.elem.parentNode.parentNode === svgcontent\n ) {\n draw.identifyLayers();\n }\n const values = isApply ? cmd.newValues : cmd.oldValues;\n // If stdDeviation was changed, update the blur.\n if (values.stdDeviation) {\n canvas.setBlurOffsets(cmd.elem.parentNode, values.stdDeviation);\n }\n // This is resolved in later versions of webkit, perhaps we should\n // have a featured detection for correct 'use' behavior?\n // ——————————\n // Remove & Re-add hack for Webkit (issue 775)\n // if (cmd.elem.tagName === 'use' && isWebkit()) {\n // const {elem} = cmd;\n // if (!elem.getAttribute('x') && !elem.getAttribute('y')) {\n // const parent = elem.parentNode;\n // const sib = elem.nextSibling;\n // elem.remove();\n // parent.insertBefore(elem, sib);\n // // Ok to replace above with this? `sib.before(elem);`\n // }\n // }\n }\n }\n }\n});\n\n/**\n* This should really be an intersection applying to all types rather than a union.\n* @name module:svgcanvas~addCommandToHistory\n* @type {module:path.EditorContext#addCommandToHistory|module:draw.DrawCanvasInit#addCommandToHistory}\n*/\nconst addCommandToHistory = function (cmd) {\n canvas.undoMgr.addCommandToHistory(cmd);\n};\n\n/**\n* This should really be an intersection applying to all types rather than a union.\n* @name module:svgcanvas.SvgCanvas#getZoom\n* @type {module:path.EditorContext#getCurrentZoom|module:select.SVGFactory#getCurrentZoom}\n*/\nconst getCurrentZoom = this.getZoom = function () { return currentZoom; };\n\n/**\n* This method rounds the incoming value to the nearest value based on the `currentZoom`\n* @name module:svgcanvas.SvgCanvas#round\n* @type {module:path.EditorContext#round}\n*/\nconst round = this.round = function (val) {\n return Number.parseInt(val * currentZoom) / currentZoom;\n};\n\nselectInit(\n curConfig,\n /**\n * Export to select.js.\n * @implements {module:select.SVGFactory}\n */\n {\n createSVGElement (jsonMap) { return canvas.addSVGElementFromJson(jsonMap); },\n svgRoot () { return svgroot; },\n svgContent () { return svgcontent; },\n getCurrentZoom\n }\n);\n/**\n* This object manages selectors for us.\n* @name module:svgcanvas.SvgCanvas#selectorManager\n* @type {module:select.SelectorManager}\n*/\nconst selectorManager = this.selectorManager = getSelectorManager();\n\n/**\n* @name module:svgcanvas.SvgCanvas#getNextId\n* @type {module:path.EditorContext#getNextId}\n*/\nconst getNextId = canvas.getNextId = function () {\n return getCurrentDrawing().getNextId();\n};\n\n/**\n* @name module:svgcanvas.SvgCanvas#getId\n* @type {module:path.EditorContext#getId}\n*/\nconst getId = canvas.getId = function () {\n return getCurrentDrawing().getId();\n};\n\n/**\n* The \"implements\" should really be an intersection applying to all types rather than a union.\n* @name module:svgcanvas.SvgCanvas#call\n* @type {module:draw.DrawCanvasInit#call|module:path.EditorContext#call}\n*/\nconst call = function (ev, arg) {\n if (events[ev]) {\n return events[ev](window, arg);\n }\n return undefined;\n};\n\n/**\n* Clears the selection. The 'selected' handler is then optionally called.\n* This should really be an intersection applying to all types rather than a union.\n* @name module:svgcanvas.SvgCanvas#clearSelection\n* @type {module:draw.DrawCanvasInit#clearSelection|module:path.EditorContext#clearSelection}\n* @fires module:svgcanvas.SvgCanvas#event:selected\n*/\nconst clearSelection = this.clearSelection = function (noCall) {\n selectedElements.forEach((elem) => {\n if (isNullish(elem)) {\n return;\n }\n selectorManager.releaseSelector(elem);\n });\n selectedElements = [];\n\n if (!noCall) { call('selected', selectedElements); }\n};\n\n/**\n* Adds a list of elements to the selection. The 'selected' handler is then called.\n* @name module:svgcanvas.SvgCanvas#addToSelection\n* @type {module:path.EditorContext#addToSelection}\n* @fires module:svgcanvas.SvgCanvas#event:selected\n*/\nconst addToSelection = this.addToSelection = function (elemsToAdd, showGrips) {\n if (!elemsToAdd.length) { return; }\n // find the first null in our selectedElements array\n\n let j = 0;\n while (j < selectedElements.length) {\n if (isNullish(selectedElements[j])) {\n break;\n }\n ++j;\n }\n\n // now add each element consecutively\n let i = elemsToAdd.length;\n while (i--) {\n let elem = elemsToAdd[i];\n if (!elem) { continue; }\n const bbox = utilsGetBBox(elem);\n if (!bbox) { continue; }\n\n if (elem.tagName === 'a' && elem.childNodes.length === 1) {\n // Make \"a\" element's child be the selected element\n elem = elem.firstChild;\n }\n\n // if it's not already there, add it\n if (!selectedElements.includes(elem)) {\n selectedElements[j] = elem;\n\n // only the first selectedBBoxes element is ever used in the codebase these days\n // if (j === 0) selectedBBoxes[0] = utilsGetBBox(elem);\n j++;\n const sel = selectorManager.requestSelector(elem, bbox);\n\n if (selectedElements.length > 1) {\n sel.showGrips(false);\n }\n }\n }\n if (!selectedElements.length) {\n return;\n }\n call('selected', selectedElements);\n\n if (selectedElements.length === 1) {\n selectorManager.requestSelector(selectedElements[0]).showGrips(showGrips);\n }\n\n // make sure the elements are in the correct order\n // See: https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-compareDocumentPosition\n\n selectedElements.sort(function (a, b) {\n if (a && b && a.compareDocumentPosition) {\n return 3 - (b.compareDocumentPosition(a) & 6); // eslint-disable-line no-bitwise\n }\n if (isNullish(a)) {\n return 1;\n }\n return 0;\n });\n\n // Make sure first elements are not null\n while (isNullish(selectedElements[0])) {\n selectedElements.shift(0);\n }\n};\n\n/**\n* @type {module:path.EditorContext#getOpacity}\n*/\nconst getOpacity = function () {\n return curShape.opacity;\n};\n\n/**\n* @name module:svgcanvas.SvgCanvas#getMouseTarget\n* @type {module:path.EditorContext#getMouseTarget}\n*/\nconst getMouseTarget = this.getMouseTarget = function (evt) {\n if (isNullish(evt)) {\n return null;\n }\n let mouseTarget = evt.target;\n\n // if it was a , Opera and WebKit return the SVGElementInstance\n if (mouseTarget.correspondingUseElement) { mouseTarget = mouseTarget.correspondingUseElement; }\n\n // for foreign content, go up until we find the foreignObject\n // WebKit browsers set the mouse target to the svgcanvas div\n if ([NS.MATH, NS.HTML].includes(mouseTarget.namespaceURI) &&\n mouseTarget.id !== 'svgcanvas'\n ) {\n while (mouseTarget.nodeName !== 'foreignObject') {\n mouseTarget = mouseTarget.parentNode;\n if (!mouseTarget) { return svgroot; }\n }\n }\n\n // Get the desired mouseTarget with jQuery selector-fu\n // If it's root-like, select the root\n const currentLayer = getCurrentDrawing().getCurrentLayer();\n if ([svgroot, container, svgcontent, currentLayer].includes(mouseTarget)) {\n return svgroot;\n }\n\n const $target = $(mouseTarget);\n\n // If it's a selection grip, return the grip parent\n if ($target.closest('#selectorParentGroup').length) {\n // While we could instead have just returned mouseTarget,\n // this makes it easier to indentify as being a selector grip\n return selectorManager.selectorParentGroup;\n }\n\n while (mouseTarget.parentNode !== (currentGroup || currentLayer)) {\n mouseTarget = mouseTarget.parentNode;\n }\n\n //\n // // go up until we hit a child of a layer\n // while (mouseTarget.parentNode.parentNode.tagName == 'g') {\n // mouseTarget = mouseTarget.parentNode;\n // }\n // Webkit bubbles the mouse event all the way up to the div, so we\n // set the mouseTarget to the svgroot like the other browsers\n // if (mouseTarget.nodeName.toLowerCase() == 'div') {\n // mouseTarget = svgroot;\n // }\n\n return mouseTarget;\n};\n\n/**\n* @namespace {module:path.pathActions} pathActions\n* @memberof module:svgcanvas.SvgCanvas#\n* @see module:path.pathActions\n*/\ncanvas.pathActions = pathActions;\n/**\n* @type {module:path.EditorContext#resetD}\n*/\nfunction resetD (p) {\n p.setAttribute('d', pathActions.convertPath(p));\n}\npathModule.init(\n /**\n * @implements {module:path.EditorContext}\n */\n {\n selectorManager, // Ok since not changing\n canvas, // Ok since not changing\n call,\n resetD,\n round,\n clearSelection,\n addToSelection,\n addCommandToHistory,\n remapElement,\n addSVGElementFromJson,\n getGridSnapping,\n getOpacity,\n getSelectedElements,\n getContainer () {\n return container;\n },\n setStarted (s) {\n started = s;\n },\n getRubberBox () {\n return rubberBox;\n },\n setRubberBox (rb) {\n rubberBox = rb;\n return rubberBox;\n },\n /**\n * @param {PlainObject} ptsInfo\n * @param {boolean} ptsInfo.closedSubpath\n * @param {SVGCircleElement[]} ptsInfo.grips\n * @fires module:svgcanvas.SvgCanvas#event:pointsAdded\n * @fires module:svgcanvas.SvgCanvas#event:selected\n * @returns {void}\n */\n addPtsToSelection ({closedSubpath, grips}) {\n // TODO: Correct this:\n pathActions.canDeleteNodes = true;\n pathActions.closed_subpath = closedSubpath;\n call('pointsAdded', {closedSubpath, grips});\n call('selected', grips);\n },\n /**\n * @param {PlainObject} changes\n * @param {ChangeElementCommand} changes.cmd\n * @param {SVGPathElement} changes.elem\n * @fires module:svgcanvas.SvgCanvas#event:changed\n * @returns {void}\n */\n endChanges ({cmd, elem}) {\n addCommandToHistory(cmd);\n call('changed', [elem]);\n },\n getCurrentZoom,\n getId,\n getNextId,\n getMouseTarget,\n getCurrentMode () {\n return currentMode;\n },\n setCurrentMode (cm) {\n currentMode = cm;\n return currentMode;\n },\n getDrawnPath () {\n return drawnPath;\n },\n setDrawnPath (dp) {\n drawnPath = dp;\n return drawnPath;\n },\n getSVGRoot\n }\n);\n\n// Interface strings, usually for title elements\nconst uiStrings = {};\n\nconst visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use';\nconst refAttrs = ['clip-path', 'fill', 'filter', 'marker-end', 'marker-mid', 'marker-start', 'mask', 'stroke'];\n\nconst elData = $.data;\n\n// Animation element to change the opacity of any newly created element\nconst opacAni = document.createElementNS(NS.SVG, 'animate');\n$(opacAni).attr({\n attributeName: 'opacity',\n begin: 'indefinite',\n dur: 1,\n fill: 'freeze'\n}).appendTo(svgroot);\n\nconst restoreRefElems = function (elem) {\n // Look for missing reference elements, restore any found\n const attrs = $(elem).attr(refAttrs);\n Object.values(attrs).forEach((val) => {\n if (val && val.startsWith('url(')) {\n const id = getUrlFromAttr(val).substr(1);\n const ref = getElem(id);\n if (!ref) {\n findDefs().append(removedElements[id]);\n delete removedElements[id];\n }\n }\n });\n\n const childs = elem.getElementsByTagName('*');\n\n if (childs.length) {\n for (let i = 0, l = childs.length; i < l; i++) {\n restoreRefElems(childs[i]);\n }\n }\n};\n\n// (function () {\n// TODO For Issue 208: this is a start on a thumbnail\n// const svgthumb = svgdoc.createElementNS(NS.SVG, 'use');\n// svgthumb.setAttribute('width', '100');\n// svgthumb.setAttribute('height', '100');\n// setHref(svgthumb, '#svgcontent');\n// svgroot.append(svgthumb);\n// }());\n\n/**\n * @typedef {PlainObject} module:svgcanvas.SaveOptions\n * @property {boolean} apply\n * @property {\"embed\"} [image]\n * @property {Integer} round_digits\n */\n\n// Object to contain image data for raster images that were found encodable\nconst encodableImages = {},\n\n // Object with save options\n /**\n * @type {module:svgcanvas.SaveOptions}\n */\n saveOptions = {round_digits: 5},\n\n // Object with IDs for imported files, to see if one was already added\n importIds = {},\n\n // Current text style properties\n curText = allProperties.text,\n\n // Object to contain all included extensions\n extensions = {},\n\n // Map of deleted reference elements\n removedElements = {};\n\nlet\n // String with image URL of last loadable image\n lastGoodImgUrl = curConfig.imgPath + 'logo.png',\n\n // Boolean indicating whether or not a draw action has been started\n started = false,\n\n // String with an element's initial transform attribute value\n startTransform = null,\n\n // String indicating the current editor mode\n currentMode = 'select',\n\n // String with the current direction in which an element is being resized\n currentResizeMode = 'none',\n\n // Current general properties\n curProperties = curShape,\n\n // Array with selected elements' Bounding box object\n // selectedBBoxes = new Array(1),\n\n // The DOM element that was just selected\n justSelected = null,\n\n // DOM element for selection rectangle drawn by the user\n rubberBox = null,\n\n // Array of current BBoxes, used in getIntersectionList().\n curBBoxes = [],\n\n // Canvas point for the most recent right click\n lastClickPoint = null;\n\nthis.runExtension = function (name, action, vars) {\n return this.runExtensions(action, vars, false, (n) => n === name);\n};\n/**\n* @typedef {module:svgcanvas.ExtensionMouseDownStatus|module:svgcanvas.ExtensionMouseUpStatus|module:svgcanvas.ExtensionIDsUpdatedStatus|module:locale.ExtensionLocaleData[]|void} module:svgcanvas.ExtensionStatus\n* @tutorial ExtensionDocs\n*/\n/**\n* @callback module:svgcanvas.ExtensionVarBuilder\n* @param {string} name The name of the extension\n* @returns {module:svgcanvas.SvgCanvas#event:ext_addLangData}\n*/\n/**\n* @callback module:svgcanvas.ExtensionNameFilter\n* @param {string} name\n* @returns {boolean}\n*/\n/**\n* @todo Consider: Should this return an array by default, so extension results aren't overwritten?\n* @todo Would be easier to document if passing in object with key of action and vars as value; could then define an interface which tied both together\n* @function module:svgcanvas.SvgCanvas#runExtensions\n* @param {\"mouseDown\"|\"mouseMove\"|\"mouseUp\"|\"zoomChanged\"|\"IDsUpdated\"|\"canvasUpdated\"|\"toolButtonStateUpdate\"|\"selectedChanged\"|\"elementTransition\"|\"elementChanged\"|\"langReady\"|\"langChanged\"|\"addLangData\"|\"onNewDocument\"|\"workareaResized\"} action\n* @param {module:svgcanvas.SvgCanvas#event:ext_mouseDown|module:svgcanvas.SvgCanvas#event:ext_mouseMove|module:svgcanvas.SvgCanvas#event:ext_mouseUp|module:svgcanvas.SvgCanvas#event:ext_zoomChanged|module:svgcanvas.SvgCanvas#event:ext_IDsUpdated|module:svgcanvas.SvgCanvas#event:ext_canvasUpdated|module:svgcanvas.SvgCanvas#event:ext_toolButtonStateUpdate|module:svgcanvas.SvgCanvas#event:ext_selectedChanged|module:svgcanvas.SvgCanvas#event:ext_elementTransition|module:svgcanvas.SvgCanvas#event:ext_elementChanged|module:svgcanvas.SvgCanvas#event:ext_langReady|module:svgcanvas.SvgCanvas#event:ext_langChanged|module:svgcanvas.SvgCanvas#event:ext_addLangData|module:svgcanvas.SvgCanvas#event:ext_onNewDocument|module:svgcanvas.SvgCanvas#event:ext_workareaResized|module:svgcanvas.ExtensionVarBuilder} [vars]\n* @param {boolean} [returnArray]\n* @param {module:svgcanvas.ExtensionNameFilter} nameFilter\n* @returns {GenericArray|module:svgcanvas.ExtensionStatus|false} See {@tutorial ExtensionDocs} on the ExtensionStatus.\n*/\nconst runExtensions = this.runExtensions = function (action, vars, returnArray, nameFilter) {\n let result = returnArray ? [] : false;\n $.each(extensions, function (name, ext) {\n if (nameFilter && !nameFilter(name)) {\n return;\n }\n if (ext && action in ext) {\n if (typeof vars === 'function') {\n vars = vars(name); // ext, action\n }\n if (returnArray) {\n result.push(ext[action](vars));\n } else {\n result = ext[action](vars);\n }\n }\n });\n return result;\n};\n\n/**\n* @typedef {PlainObject} module:svgcanvas.ExtensionMouseDownStatus\n* @property {boolean} started Indicates that creating/editing has started\n*/\n/**\n* @typedef {PlainObject} module:svgcanvas.ExtensionMouseUpStatus\n* @property {boolean} keep Indicates if the current element should be kept\n* @property {boolean} started Indicates if editing should still be considered as \"started\"\n* @property {Element} element The element being affected\n*/\n/**\n* @typedef {PlainObject} module:svgcanvas.ExtensionIDsUpdatedStatus\n* @property {string[]} remove Contains string IDs (used by `ext-connector.js`)\n*/\n\n/**\n * @interface module:svgcanvas.ExtensionInitResponse\n * @property {module:SVGEditor.ContextTool[]|PlainObject} [context_tools]\n * @property {module:SVGEditor.Button[]|PlainObject} [buttons]\n * @property {string} [svgicons] The location of a local SVG or SVGz file\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#mouseDown\n * @param {module:svgcanvas.SvgCanvas#event:ext_mouseDown} arg\n * @returns {void|module:svgcanvas.ExtensionMouseDownStatus}\n */\n/**\n * @function module:svgcanvas.ExtensionInitResponse#mouseMove\n * @param {module:svgcanvas.SvgCanvas#event:ext_mouseMove} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#mouseUp\n * @param {module:svgcanvas.SvgCanvas#event:ext_mouseUp} arg\n * @returns {module:svgcanvas.ExtensionMouseUpStatus}\n */\n/**\n * @function module:svgcanvas.ExtensionInitResponse#zoomChanged\n * @param {module:svgcanvas.SvgCanvas#event:ext_zoomChanged} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#IDsUpdated\n * @param {module:svgcanvas.SvgCanvas#event:ext_IDsUpdated} arg\n * @returns {module:svgcanvas.ExtensionIDsUpdatedStatus}\n */\n/**\n * @function module:svgcanvas.ExtensionInitResponse#canvasUpdated\n * @param {module:svgcanvas.SvgCanvas#event:ext_canvasUpdated} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#toolButtonStateUpdate\n * @param {module:svgcanvas.SvgCanvas#event:ext_toolButtonStateUpdate} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#selectedChanged\n * @param {module:svgcanvas.SvgCanvas#event:ext_selectedChanged} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#elementTransition\n * @param {module:svgcanvas.SvgCanvas#event:ext_elementTransition} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#elementChanged\n * @param {module:svgcanvas.SvgCanvas#event:ext_elementChanged} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#langReady\n * @param {module:svgcanvas.SvgCanvas#event:ext_langReady} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#langChanged\n * @param {module:svgcanvas.SvgCanvas#event:ext_langChanged} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#addLangData\n * @param {module:svgcanvas.SvgCanvas#event:ext_addLangData} arg\n * @returns {Promise} Resolves to {@link module:locale.ExtensionLocaleData}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#onNewDocument\n * @param {module:svgcanvas.SvgCanvas#event:ext_onNewDocument} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#workareaResized\n * @param {module:svgcanvas.SvgCanvas#event:ext_workareaResized} arg\n * @returns {void}\n*/\n/**\n * @function module:svgcanvas.ExtensionInitResponse#callback\n * @this module:SVGEditor\n * @param {module:svgcanvas.SvgCanvas#event:ext_callback} arg\n * @returns {void}\n*/\n\n/**\n* @callback module:svgcanvas.ExtensionInitCallback\n* @this module:SVGEditor\n* @param {module:svgcanvas.ExtensionArgumentObject} arg\n* @returns {Promise} Resolves to [ExtensionInitResponse]{@link module:svgcanvas.ExtensionInitResponse} or `undefined`\n*/\n/**\n* @typedef {PlainObject} module:svgcanvas.ExtensionInitArgs\n* @property {external:jQuery} $\n* @property {module:SVGEditor~ImportLocale} importLocale\n*/\n/**\n* Add an extension to the editor.\n* @function module:svgcanvas.SvgCanvas#addExtension\n* @param {string} name - String with the ID of the extension. Used internally; no need for i18n.\n* @param {module:svgcanvas.ExtensionInitCallback} [extInitFunc] - Function supplied by the extension with its data\n* @param {module:svgcanvas.ExtensionInitArgs} initArgs\n* @fires module:svgcanvas.SvgCanvas#event:extension_added\n* @throws {TypeError|Error} `TypeError` if `extInitFunc` is not a function, `Error`\n* if extension of supplied name already exists\n* @returns {Promise} Resolves to `undefined`\n*/\nthis.addExtension = async function (name, extInitFunc, {$: jq, importLocale}) {\n if (typeof extInitFunc !== 'function') {\n throw new TypeError('Function argument expected for `svgcanvas.addExtension`');\n }\n if (name in extensions) {\n throw new Error('Cannot add extension \"' + name + '\", an extension by that name already exists.');\n }\n // Provide private vars/funcs here. Is there a better way to do this?\n /**\n * @typedef {module:svgcanvas.PrivateMethods} module:svgcanvas.ExtensionArgumentObject\n * @property {SVGSVGElement} svgroot See {@link module:svgcanvas~svgroot}\n * @property {SVGSVGElement} svgcontent See {@link module:svgcanvas~svgcontent}\n * @property {!(string|Integer)} nonce See {@link module:draw.Drawing#getNonce}\n * @property {module:select.SelectorManager} selectorManager\n * @property {module:SVGEditor~ImportLocale} importLocale\n */\n /**\n * @type {module:svgcanvas.ExtensionArgumentObject}\n * @see {@link module:svgcanvas.PrivateMethods} source for the other methods/properties\n */\n const argObj = $.extend(canvas.getPrivateMethods(), {\n $: jq,\n importLocale,\n svgroot,\n svgcontent,\n nonce: getCurrentDrawing().getNonce(),\n selectorManager\n });\n const extObj = await extInitFunc(argObj);\n if (extObj) {\n extObj.name = name;\n }\n\n extensions[name] = extObj;\n return call('extension_added', extObj);\n};\n\n/**\n* This method sends back an array or a NodeList full of elements that\n* intersect the multi-select rubber-band-box on the currentLayer only.\n*\n* We brute-force `getIntersectionList` for browsers that do not support it (Firefox).\n*\n* Reference:\n* Firefox does not implement `getIntersectionList()`, see {@link https://bugzilla.mozilla.org/show_bug.cgi?id=501421}.\n* @function module:svgcanvas.SvgCanvas#getIntersectionList\n* @param {SVGRect} rect\n* @returns {Element[]|NodeList} Bbox elements\n*/\nconst getIntersectionList = this.getIntersectionList = function (rect) {\n if (isNullish(rubberBox)) { return null; }\n\n const parent = currentGroup || getCurrentDrawing().getCurrentLayer();\n\n let rubberBBox;\n if (!rect) {\n rubberBBox = rubberBox.getBBox();\n const bb = svgcontent.createSVGRect();\n\n ['x', 'y', 'width', 'height', 'top', 'right', 'bottom', 'left'].forEach((o) => {\n bb[o] = rubberBBox[o] / currentZoom;\n });\n rubberBBox = bb;\n } else {\n rubberBBox = svgcontent.createSVGRect();\n rubberBBox.x = rect.x;\n rubberBBox.y = rect.y;\n rubberBBox.width = rect.width;\n rubberBBox.height = rect.height;\n }\n\n let resultList = null;\n if (!isIE()) {\n if (typeof svgroot.getIntersectionList === 'function') {\n // Offset the bbox of the rubber box by the offset of the svgcontent element.\n rubberBBox.x += Number.parseInt(svgcontent.getAttribute('x'));\n rubberBBox.y += Number.parseInt(svgcontent.getAttribute('y'));\n\n resultList = svgroot.getIntersectionList(rubberBBox, parent);\n }\n }\n\n if (isNullish(resultList) || typeof resultList.item !== 'function') {\n resultList = [];\n\n if (!curBBoxes.length) {\n // Cache all bboxes\n curBBoxes = getVisibleElementsAndBBoxes(parent);\n }\n let i = curBBoxes.length;\n while (i--) {\n if (!rubberBBox.width) { continue; }\n if (rectsIntersect(rubberBBox, curBBoxes[i].bbox)) {\n resultList.push(curBBoxes[i].elem);\n }\n }\n }\n\n // addToSelection expects an array, but it's ok to pass a NodeList\n // because using square-bracket notation is allowed:\n // https://www.w3.org/TR/DOM-Level-2-Core/ecma-script-binding.html\n return resultList;\n};\n\nthis.getStrokedBBox = getStrokedBBoxDefaultVisible;\n\nthis.getVisibleElements = getVisibleElements;\n\n/**\n* @typedef {PlainObject} ElementAndBBox\n* @property {Element} elem - The element\n* @property {module:utilities.BBoxObject} bbox - The element's BBox as retrieved from `getStrokedBBoxDefaultVisible`\n*/\n\n/**\n* Get all elements that have a BBox (excludes ``, ``, etc).\n* Note that 0-opacity, off-screen etc elements are still considered \"visible\"\n* for this function.\n* @function module:svgcanvas.SvgCanvas#getVisibleElementsAndBBoxes\n* @param {Element} parent - The parent DOM element to search within\n* @returns {ElementAndBBox[]} An array with objects that include:\n*/\nconst getVisibleElementsAndBBoxes = this.getVisibleElementsAndBBoxes = function (parent) {\n if (!parent) {\n parent = $(svgcontent).children(); // Prevent layers from being included\n }\n const contentElems = [];\n $(parent).children().each(function (i, elem) {\n if (elem.getBBox) {\n contentElems.push({elem, bbox: getStrokedBBoxDefaultVisible([elem])});\n }\n });\n return contentElems.reverse();\n};\n\n/**\n* Wrap an SVG element into a group element, mark the group as 'gsvg'.\n* @function module:svgcanvas.SvgCanvas#groupSvgElem\n* @param {Element} elem - SVG element to wrap\n* @returns {void}\n*/\nconst groupSvgElem = this.groupSvgElem = function (elem) {\n const g = document.createElementNS(NS.SVG, 'g');\n elem.replaceWith(g);\n $(g).append(elem).data('gsvg', elem)[0].id = getNextId();\n};\n\n// Set scope for these functions\n\n// Object to contain editor event names and callback functions\nconst events = {};\n\ncanvas.call = call;\n/**\n * Array of what was changed (elements, layers).\n * @event module:svgcanvas.SvgCanvas#event:changed\n * @type {Element[]}\n */\n/**\n * Array of selected elements.\n * @event module:svgcanvas.SvgCanvas#event:selected\n * @type {Element[]}\n */\n/**\n * Array of selected elements.\n * @event module:svgcanvas.SvgCanvas#event:transition\n * @type {Element[]}\n */\n/**\n * The Element is always `SVGGElement`?\n * If not `null`, will be the set current group element.\n * @event module:svgcanvas.SvgCanvas#event:contextset\n * @type {null|Element}\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:pointsAdded\n * @type {PlainObject}\n * @property {boolean} closedSubpath\n * @property {SVGCircleElement[]} grips Grips elements\n */\n\n/**\n * @event module:svgcanvas.SvgCanvas#event:zoomed\n * @type {PlainObject}\n * @property {Float} x\n * @property {Float} y\n * @property {Float} width\n * @property {Float} height\n * @property {0.5|2} factor\n * @see module:SVGEditor.BBoxObjectWithFactor\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:updateCanvas\n * @type {PlainObject}\n * @property {false} center\n * @property {module:math.XYObject} newCtr\n */\n/**\n * @typedef {PlainObject} module:svgcanvas.ExtensionInitResponsePlusName\n * @implements {module:svgcanvas.ExtensionInitResponse}\n * @property {string} name The extension's resolved ID (whether explicit or based on file name)\n */\n/**\n * Generalized extension object response of\n * [`init()`]{@link module:svgcanvas.ExtensionInitCallback}\n * along with the name of the extension.\n * @event module:svgcanvas.SvgCanvas#event:extension_added\n * @type {module:svgcanvas.ExtensionInitResponsePlusName|void}\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:extensions_added\n * @type {void}\n*/\n/**\n * @typedef {PlainObject} module:svgcanvas.Message\n * @property {any} data The data\n * @property {string} origin The origin\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:message\n * @type {module:svgcanvas.Message}\n */\n/**\n * SVG canvas converted to string.\n * @event module:svgcanvas.SvgCanvas#event:saved\n * @type {string}\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:setnonce\n * @type {!(string|Integer)}\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:unsetnonce\n * @type {void}\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:zoomDone\n * @type {void}\n*/\n/**\n * @event module:svgcanvas.SvgCanvas#event:cleared\n * @type {void}\n*/\n\n/**\n * @event module:svgcanvas.SvgCanvas#event:exported\n * @type {module:svgcanvas.ImageExportedResults}\n */\n/**\n * @event module:svgcanvas.SvgCanvas#event:exportedPDF\n * @type {module:svgcanvas.PDFExportedResults}\n */\n/**\n * Creating a cover-all class until {@link https://github.com/jsdoc3/jsdoc/issues/1545} may be supported.\n * `undefined` may be returned by {@link module:svgcanvas.SvgCanvas#event:extension_added} if the extension's `init` returns `undefined` It is also the type for the following events \"zoomDone\", \"unsetnonce\", \"cleared\", and \"extensions_added\".\n * @event module:svgcanvas.SvgCanvas#event:GenericCanvasEvent\n * @type {module:svgcanvas.SvgCanvas#event:selected|module:svgcanvas.SvgCanvas#event:changed|module:svgcanvas.SvgCanvas#event:contextset|module:svgcanvas.SvgCanvas#event:pointsAdded|module:svgcanvas.SvgCanvas#event:extension_added|module:svgcanvas.SvgCanvas#event:extensions_added|module:svgcanvas.SvgCanvas#event:message|module:svgcanvas.SvgCanvas#event:transition|module:svgcanvas.SvgCanvas#event:zoomed|module:svgcanvas.SvgCanvas#event:updateCanvas|module:svgcanvas.SvgCanvas#event:saved|module:svgcanvas.SvgCanvas#event:exported|module:svgcanvas.SvgCanvas#event:exportedPDF|module:svgcanvas.SvgCanvas#event:setnonce|module:svgcanvas.SvgCanvas#event:unsetnonce|void}\n */\n\n/**\n * The promise return, if present, resolves to `undefined`\n * (`extension_added`, `exported`, `saved`).\n * @typedef {Promise|void} module:svgcanvas.EventHandlerReturn\n*/\n\n/**\n* @callback module:svgcanvas.EventHandler\n* @param {external:Window} win\n* @param {module:svgcanvas.SvgCanvas#event:GenericCanvasEvent} arg\n* @listens module:svgcanvas.SvgCanvas#event:GenericCanvasEvent\n* @returns {module:svgcanvas.EventHandlerReturn}\n*/\n\n/**\n* Attaches a callback function to an event.\n* @function module:svgcanvas.SvgCanvas#bind\n* @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\n* @param {module:svgcanvas.EventHandler} f - The callback function to bind to the event\n* @returns {module:svgcanvas.EventHandler} The previous event\n*/\ncanvas.bind = function (ev, f) {\n const old = events[ev];\n events[ev] = f;\n return old;\n};\n\n/**\n* Runs the SVG Document through the sanitizer and then updates its paths.\n* @function module:svgcanvas.SvgCanvas#prepareSvg\n* @param {XMLDocument} newDoc - The SVG DOM document\n* @returns {void}\n*/\nthis.prepareSvg = function (newDoc) {\n this.sanitizeSvg(newDoc.documentElement);\n\n // convert paths into absolute commands\n const paths = [...newDoc.getElementsByTagNameNS(NS.SVG, 'path')];\n paths.forEach((path) => {\n path.setAttribute('d', pathActions.convertPath(path));\n pathActions.fixEnd(path);\n });\n};\n\n/**\n* Hack for Firefox bugs where text element features aren't updated or get\n* messed up. See issue 136 and issue 137.\n* This function clones the element and re-selects it.\n* @function module:svgcanvas~ffClone\n* @todo Test for this bug on load and add it to \"support\" object instead of\n* browser sniffing\n* @param {Element} elem - The (text) DOM element to clone\n* @returns {Element} Cloned element\n*/\nconst ffClone = function (elem) {\n if (!isGecko()) { return elem; }\n const clone = elem.cloneNode(true);\n elem.before(clone);\n elem.remove();\n selectorManager.releaseSelector(elem);\n selectedElements[0] = clone;\n selectorManager.requestSelector(clone).showGrips(true);\n return clone;\n};\n\n// `this.each` is deprecated, if any extension used this it can be recreated by doing this:\n// * @example $(canvas.getRootElem()).children().each(...)\n// * @function module:svgcanvas.SvgCanvas#each\n// this.each = function (cb) {\n// $(svgroot).children().each(cb);\n// };\n\n/**\n* Removes any old rotations if present, prepends a new rotation at the\n* transformed center.\n* @function module:svgcanvas.SvgCanvas#setRotationAngle\n* @param {string|Float} val - The new rotation angle in degrees\n* @param {boolean} preventUndo - Indicates whether the action should be undoable or not\n* @fires module:svgcanvas.SvgCanvas#event:changed\n* @returns {void}\n*/\nthis.setRotationAngle = function (val, preventUndo) {\n // ensure val is the proper type\n val = Number.parseFloat(val);\n const elem = selectedElements[0];\n const oldTransform = elem.getAttribute('transform');\n const bbox = utilsGetBBox(elem);\n const cx = bbox.x + bbox.width / 2, cy = bbox.y + bbox.height / 2;\n const tlist = getTransformList(elem);\n\n // only remove the real rotational transform if present (i.e. at index=0)\n if (tlist.numberOfItems > 0) {\n const xform = tlist.getItem(0);\n if (xform.type === 4) {\n tlist.removeItem(0);\n }\n }\n // find Rnc and insert it\n if (val !== 0) {\n const center = transformPoint(cx, cy, transformListToTransform(tlist).matrix);\n const Rnc = svgroot.createSVGTransform();\n Rnc.setRotate(val, center.x, center.y);\n if (tlist.numberOfItems) {\n tlist.insertItemBefore(Rnc, 0);\n } else {\n tlist.appendItem(Rnc);\n }\n } else if (tlist.numberOfItems === 0) {\n elem.removeAttribute('transform');\n }\n\n if (!preventUndo) {\n // we need to undo it, then redo it so it can be undo-able! :)\n // TODO: figure out how to make changes to transform list undo-able cross-browser?\n const newTransform = elem.getAttribute('transform');\n elem.setAttribute('transform', oldTransform);\n changeSelectedAttribute('transform', newTransform, selectedElements);\n call('changed', selectedElements);\n }\n // const pointGripContainer = getElem('pathpointgrip_container');\n // if (elem.nodeName === 'path' && pointGripContainer) {\n // pathActions.setPointContainerTransform(elem.getAttribute('transform'));\n // }\n const selector = selectorManager.requestSelector(selectedElements[0]);\n selector.resize();\n Selector.updateGripCursors(val);\n};\n\n/**\n* Runs `recalculateDimensions` on the selected elements,\n* adding the changes to a single batch command.\n* @function module:svgcanvas.SvgCanvas#recalculateAllSelectedDimensions\n* @fires module:svgcanvas.SvgCanvas#event:changed\n* @returns {void}\n*/\nconst recalculateAllSelectedDimensions = this.recalculateAllSelectedDimensions = function () {\n const text = (currentResizeMode === 'none' ? 'position' : 'size');\n const batchCmd = new BatchCommand(text);\n\n let i = selectedElements.length;\n while (i--) {\n const elem = selectedElements[i];\n // if (getRotationAngle(elem) && !hasMatrixTransform(getTransformList(elem))) { continue; }\n const cmd = recalculateDimensions(elem);\n if (cmd) {\n batchCmd.addSubCommand(cmd);\n }\n }\n\n if (!batchCmd.isEmpty()) {\n addCommandToHistory(batchCmd);\n call('changed', selectedElements);\n }\n};\n\n/**\n * Debug tool to easily see the current matrix in the browser's console.\n * @function module:svgcanvas~logMatrix\n * @param {SVGMatrix} m The matrix\n * @returns {void}\n */\nconst logMatrix = function (m) {\n console.log([m.a, m.b, m.c, m.d, m.e, m.f]); // eslint-disable-line no-console\n};\n\n// Root Current Transformation Matrix in user units\nlet rootSctm = null;\n\n/**\n* Group: Selection.\n*/\n\n// TODO: do we need to worry about selectedBBoxes here?\n\n/**\n* Selects only the given elements, shortcut for `clearSelection(); addToSelection()`.\n* @function module:svgcanvas.SvgCanvas#selectOnly\n* @param {Element[]} elems - an array of DOM elements to be selected\n* @param {boolean} showGrips - Indicates whether the resize grips should be shown\n* @returns {void}\n*/\nconst selectOnly = this.selectOnly = function (elems, showGrips) {\n clearSelection(true);\n addToSelection(elems, showGrips);\n};\n\n// TODO: could use slice here to make this faster?\n// TODO: should the 'selected' handler\n\n/**\n* Removes elements from the selection.\n* @function module:svgcanvas.SvgCanvas#removeFromSelection\n* @param {Element[]} elemsToRemove - An array of elements to remove from selection\n* @returns {void}\n*/\n/* const removeFromSelection = */ this.removeFromSelection = function (elemsToRemove) {\n if (isNullish(selectedElements[0])) { return; }\n if (!elemsToRemove.length) { return; }\n\n // find every element and remove it from our array copy\n const newSelectedItems = [],\n len = selectedElements.length;\n for (let i = 0; i < len; ++i) {\n const elem = selectedElements[i];\n if (elem) {\n // keep the item\n if (!elemsToRemove.includes(elem)) {\n newSelectedItems.push(elem);\n } else { // remove the item and its selector\n selectorManager.releaseSelector(elem);\n }\n }\n }\n // the copy becomes the master now\n selectedElements = newSelectedItems;\n};\n\n/**\n* Clears the selection, then adds all elements in the current layer to the selection.\n* @function module:svgcanvas.SvgCanvas#selectAllInCurrentLayer\n* @returns {void}\n*/\nthis.selectAllInCurrentLayer = function () {\n const currentLayer = getCurrentDrawing().getCurrentLayer();\n if (currentLayer) {\n currentMode = 'select';\n selectOnly($(currentGroup || currentLayer).children());\n }\n};\n\nlet drawnPath = null;\n\n// Mouse events\n(function () {\nconst freehand = {\n minx: null,\n miny: null,\n maxx: null,\n maxy: null\n};\nconst THRESHOLD_DIST = 0.8,\n STEP_COUNT = 10;\nlet dAttr = null,\n startX = null,\n startY = null,\n rStartX = null,\n rStartY = null,\n initBbox = {},\n sumDistance = 0,\n controllPoint2 = {x: 0, y: 0},\n controllPoint1 = {x: 0, y: 0},\n start = {x: 0, y: 0},\n end = {x: 0, y: 0},\n bSpline = {x: 0, y: 0},\n nextPos = {x: 0, y: 0},\n parameter,\n nextParameter;\n\nconst getBsplinePoint = function (t) {\n const spline = {x: 0, y: 0},\n p0 = controllPoint2,\n p1 = controllPoint1,\n p2 = start,\n p3 = end,\n S = 1.0 / 6.0,\n t2 = t * t,\n t3 = t2 * t;\n\n const m = [\n [-1, 3, -3, 1],\n [3, -6, 3, 0],\n [-3, 0, 3, 0],\n [1, 4, 1, 0]\n ];\n\n spline.x = S * (\n (p0.x * m[0][0] + p1.x * m[0][1] + p2.x * m[0][2] + p3.x * m[0][3]) * t3 +\n (p0.x * m[1][0] + p1.x * m[1][1] + p2.x * m[1][2] + p3.x * m[1][3]) * t2 +\n (p0.x * m[2][0] + p1.x * m[2][1] + p2.x * m[2][2] + p3.x * m[2][3]) * t +\n (p0.x * m[3][0] + p1.x * m[3][1] + p2.x * m[3][2] + p3.x * m[3][3])\n );\n spline.y = S * (\n (p0.y * m[0][0] + p1.y * m[0][1] + p2.y * m[0][2] + p3.y * m[0][3]) * t3 +\n (p0.y * m[1][0] + p1.y * m[1][1] + p2.y * m[1][2] + p3.y * m[1][3]) * t2 +\n (p0.y * m[2][0] + p1.y * m[2][1] + p2.y * m[2][2] + p3.y * m[2][3]) * t +\n (p0.y * m[3][0] + p1.y * m[3][1] + p2.y * m[3][2] + p3.y * m[3][3])\n );\n\n return {\n x: spline.x,\n y: spline.y\n };\n};\n/**\n * Follows these conditions:\n * - When we are in a create mode, the element is added to the canvas but the\n * action is not recorded until mousing up.\n * - When we are in select mode, select the element, remember the position\n * and do nothing else.\n * @param {MouseEvent} evt\n * @fires module:svgcanvas.SvgCanvas#event:ext_mouseDown\n * @returns {void}\n */\nconst mouseDown = function (evt) {\n if (canvas.spaceKey || evt.button === 1) { return; }\n\n const rightClick = evt.button === 2;\n\n if (evt.altKey) { // duplicate when dragging\n canvas.cloneSelectedElements(0, 0);\n }\n\n rootSctm = $('#svgcontent g')[0].getScreenCTM().inverse();\n\n const pt = transformPoint(evt.pageX, evt.pageY, rootSctm),\n mouseX = pt.x * currentZoom,\n mouseY = pt.y * currentZoom;\n\n evt.preventDefault();\n\n if (rightClick) {\n currentMode = 'select';\n lastClickPoint = pt;\n }\n\n // This would seem to be unnecessary...\n // if (!['select', 'resize'].includes(currentMode)) {\n // setGradient();\n // }\n\n let x = mouseX / currentZoom,\n y = mouseY / currentZoom;\n let mouseTarget = getMouseTarget(evt);\n\n if (mouseTarget.tagName === 'a' && mouseTarget.childNodes.length === 1) {\n mouseTarget = mouseTarget.firstChild;\n }\n\n // realX/y ignores grid-snap value\n const realX = x;\n rStartX = startX = x;\n const realY = y;\n rStartY = startY = y;\n\n if (curConfig.gridSnapping) {\n x = snapToGrid(x);\n y = snapToGrid(y);\n startX = snapToGrid(startX);\n startY = snapToGrid(startY);\n }\n\n // if it is a selector grip, then it must be a single element selected,\n // set the mouseTarget to that and update the mode to rotate/resize\n\n if (mouseTarget === selectorManager.selectorParentGroup && !isNullish(selectedElements[0])) {\n const grip = evt.target;\n const griptype = elData(grip, 'type');\n // rotating\n if (griptype === 'rotate') {\n currentMode = 'rotate';\n // resizing\n } else if (griptype === 'resize') {\n currentMode = 'resize';\n currentResizeMode = elData(grip, 'dir');\n }\n mouseTarget = selectedElements[0];\n }\n\n startTransform = mouseTarget.getAttribute('transform');\n\n const tlist = getTransformList(mouseTarget);\n switch (currentMode) {\n case 'select':\n started = true;\n currentResizeMode = 'none';\n if (rightClick) { started = false; }\n\n if (mouseTarget !== svgroot) {\n // if this element is not yet selected, clear selection and select it\n if (!selectedElements.includes(mouseTarget)) {\n // only clear selection if shift is not pressed (otherwise, add\n // element to selection)\n if (!evt.shiftKey) {\n // No need to do the call here as it will be done on addToSelection\n clearSelection(true);\n }\n addToSelection([mouseTarget]);\n justSelected = mouseTarget;\n pathActions.clear();\n }\n // else if it's a path, go into pathedit mode in mouseup\n\n if (!rightClick) {\n // insert a dummy transform so if the element(s) are moved it will have\n // a transform to use for its translate\n for (const selectedElement of selectedElements) {\n if (isNullish(selectedElement)) { continue; }\n const slist = getTransformList(selectedElement);\n if (slist.numberOfItems) {\n slist.insertItemBefore(svgroot.createSVGTransform(), 0);\n } else {\n slist.appendItem(svgroot.createSVGTransform());\n }\n }\n }\n } else if (!rightClick) {\n clearSelection();\n currentMode = 'multiselect';\n if (isNullish(rubberBox)) {\n rubberBox = selectorManager.getRubberBandBox();\n }\n rStartX *= currentZoom;\n rStartY *= currentZoom;\n // console.log('p',[evt.pageX, evt.pageY]);\n // console.log('c',[evt.clientX, evt.clientY]);\n // console.log('o',[evt.offsetX, evt.offsetY]);\n // console.log('s',[startX, startY]);\n\n assignAttributes(rubberBox, {\n x: rStartX,\n y: rStartY,\n width: 0,\n height: 0,\n display: 'inline'\n }, 100);\n }\n break;\n case 'zoom':\n started = true;\n if (isNullish(rubberBox)) {\n rubberBox = selectorManager.getRubberBandBox();\n }\n assignAttributes(rubberBox, {\n x: realX * currentZoom,\n y: realX * currentZoom,\n width: 0,\n height: 0,\n display: 'inline'\n }, 100);\n break;\n case 'resize': {\n started = true;\n startX = x;\n startY = y;\n\n // Getting the BBox from the selection box, since we know we\n // want to orient around it\n initBbox = utilsGetBBox($('#selectedBox0')[0]);\n const bb = {};\n $.each(initBbox, function (key, val) {\n bb[key] = val / currentZoom;\n });\n initBbox = bb;\n\n // append three dummy transforms to the tlist so that\n // we can translate,scale,translate in mousemove\n const pos = getRotationAngle(mouseTarget) ? 1 : 0;\n\n if (hasMatrixTransform(tlist)) {\n tlist.insertItemBefore(svgroot.createSVGTransform(), pos);\n tlist.insertItemBefore(svgroot.createSVGTransform(), pos);\n tlist.insertItemBefore(svgroot.createSVGTransform(), pos);\n } else {\n tlist.appendItem(svgroot.createSVGTransform());\n tlist.appendItem(svgroot.createSVGTransform());\n tlist.appendItem(svgroot.createSVGTransform());\n\n if (supportsNonScalingStroke()) {\n // Handle crash for newer Chrome and Safari 6 (Mobile and Desktop):\n // https://code.google.com/p/svg-edit/issues/detail?id=904\n // Chromium issue: https://code.google.com/p/chromium/issues/detail?id=114625\n // TODO: Remove this workaround once vendor fixes the issue\n const iswebkit = isWebkit();\n\n let delayedStroke;\n if (iswebkit) {\n delayedStroke = function (ele) {\n const stroke_ = ele.getAttribute('stroke');\n ele.removeAttribute('stroke');\n // Re-apply stroke after delay. Anything higher than 1 seems to cause flicker\n if (stroke_ !== null) setTimeout(function () { ele.setAttribute('stroke', stroke_); }, 0);\n };\n }\n mouseTarget.style.vectorEffect = 'non-scaling-stroke';\n if (iswebkit) { delayedStroke(mouseTarget); }\n\n const all = mouseTarget.getElementsByTagName('*'),\n len = all.length;\n for (let i = 0; i < len; i++) {\n if (!all[i].style) { // mathML\n continue;\n }\n all[i].style.vectorEffect = 'non-scaling-stroke';\n if (iswebkit) { delayedStroke(all[i]); }\n }\n }\n }\n break;\n }\n case 'fhellipse':\n case 'fhrect':\n case 'fhpath':\n start.x = realX;\n start.y = realY;\n controllPoint1 = {x: 0, y: 0};\n controllPoint2 = {x: 0, y: 0};\n started = true;\n dAttr = realX + ',' + realY + ' ';\n // Commented out as doing nothing now:\n // strokeW = parseFloat(curShape.stroke_width) === 0 ? 1 : curShape.stroke_width;\n addSVGElementFromJson({\n element: 'polyline',\n curStyles: true,\n attr: {\n points: dAttr,\n id: getNextId(),\n fill: 'none',\n opacity: curShape.opacity / 2,\n 'stroke-linecap': 'round',\n style: 'pointer-events:none'\n }\n });\n freehand.minx = realX;\n freehand.maxx = realX;\n freehand.miny = realY;\n freehand.maxy = realY;\n break;\n case 'image': {\n started = true;\n const newImage = addSVGElementFromJson({\n element: 'image',\n attr: {\n x,\n y,\n width: 0,\n height: 0,\n id: getNextId(),\n opacity: curShape.opacity / 2,\n style: 'pointer-events:inherit'\n }\n });\n setHref(newImage, lastGoodImgUrl);\n preventClickDefault(newImage);\n break;\n } case 'square':\n // TODO: once we create the rect, we lose information that this was a square\n // (for resizing purposes this could be important)\n // Fallthrough\n case 'rect':\n started = true;\n startX = x;\n startY = y;\n addSVGElementFromJson({\n element: 'rect',\n curStyles: true,\n attr: {\n x,\n y,\n width: 0,\n height: 0,\n id: getNextId(),\n opacity: curShape.opacity / 2\n }\n });\n break;\n case 'line': {\n started = true;\n const strokeW = Number(curShape.stroke_width) === 0 ? 1 : curShape.stroke_width;\n addSVGElementFromJson({\n element: 'line',\n curStyles: true,\n attr: {\n x1: x,\n y1: y,\n x2: x,\n y2: y,\n id: getNextId(),\n stroke: curShape.stroke,\n 'stroke-width': strokeW,\n 'stroke-dasharray': curShape.stroke_dasharray,\n 'stroke-linejoin': curShape.stroke_linejoin,\n 'stroke-linecap': curShape.stroke_linecap,\n 'stroke-opacity': curShape.stroke_opacity,\n fill: 'none',\n opacity: curShape.opacity / 2,\n style: 'pointer-events:none'\n }\n });\n break;\n } case 'circle':\n started = true;\n addSVGElementFromJson({\n element: 'circle',\n curStyles: true,\n attr: {\n cx: x,\n cy: y,\n r: 0,\n id: getNextId(),\n opacity: curShape.opacity / 2\n }\n });\n break;\n case 'ellipse':\n started = true;\n addSVGElementFromJson({\n element: 'ellipse',\n curStyles: true,\n attr: {\n cx: x,\n cy: y,\n rx: 0,\n ry: 0,\n id: getNextId(),\n opacity: curShape.opacity / 2\n }\n });\n break;\n case 'text':\n started = true;\n /* const newText = */ addSVGElementFromJson({\n element: 'text',\n curStyles: true,\n attr: {\n x,\n y,\n id: getNextId(),\n fill: curText.fill,\n 'stroke-width': curText.stroke_width,\n 'font-size': curText.font_size,\n 'font-family': curText.font_family,\n 'text-anchor': 'middle',\n 'xml:space': 'preserve',\n opacity: curShape.opacity\n }\n });\n // newText.textContent = 'text';\n break;\n case 'path':\n // Fall through\n case 'pathedit':\n startX *= currentZoom;\n startY *= currentZoom;\n pathActions.mouseDown(evt, mouseTarget, startX, startY);\n started = true;\n break;\n case 'textedit':\n startX *= currentZoom;\n startY *= currentZoom;\n textActions.mouseDown(evt, mouseTarget, startX, startY);\n started = true;\n break;\n case 'rotate':\n started = true;\n // we are starting an undoable change (a drag-rotation)\n canvas.undoMgr.beginUndoableChange('transform', selectedElements);\n break;\n default:\n // This could occur in an extension\n break;\n }\n\n /**\n * The main (left) mouse button is held down on the canvas area.\n * @event module:svgcanvas.SvgCanvas#event:ext_mouseDown\n * @type {PlainObject}\n * @property {MouseEvent} event The event object\n * @property {Float} start_x x coordinate on canvas\n * @property {Float} start_y y coordinate on canvas\n * @property {Element[]} selectedElements An array of the selected Elements\n */\n const extResult = runExtensions('mouseDown', /** @type {module:svgcanvas.SvgCanvas#event:ext_mouseDown} */ {\n event: evt,\n start_x: startX,\n start_y: startY,\n selectedElements\n }, true);\n\n $.each(extResult, function (i, r) {\n if (r && r.started) {\n started = true;\n }\n });\n};\n\n// in this function we do not record any state changes yet (but we do update\n// any elements that are still being created, moved or resized on the canvas)\n/**\n *\n * @param {MouseEvent} evt\n * @fires module:svgcanvas.SvgCanvas#event:transition\n * @fires module:svgcanvas.SvgCanvas#event:ext_mouseMove\n * @returns {void}\n */\nconst mouseMove = function (evt) {\n if (!started) { return; }\n if (evt.button === 1 || canvas.spaceKey) { return; }\n\n let i, xya, c, cx, cy, dx, dy, len, angle, box,\n selected = selectedElements[0];\n const\n pt = transformPoint(evt.pageX, evt.pageY, rootSctm),\n mouseX = pt.x * currentZoom,\n mouseY = pt.y * currentZoom,\n shape = getElem(getId());\n\n let realX = mouseX / currentZoom;\n let x = realX;\n let realY = mouseY / currentZoom;\n let y = realY;\n\n if (curConfig.gridSnapping) {\n x = snapToGrid(x);\n y = snapToGrid(y);\n }\n\n evt.preventDefault();\n let tlist;\n switch (currentMode) {\n case 'select': {\n // we temporarily use a translate on the element(s) being dragged\n // this transform is removed upon mousing up and the element is\n // relocated to the new location\n if (selectedElements[0] !== null) {\n dx = x - startX;\n dy = y - startY;\n\n if (curConfig.gridSnapping) {\n dx = snapToGrid(dx);\n dy = snapToGrid(dy);\n }\n\n /*\n // Commenting out as currently has no effect\n if (evt.shiftKey) {\n xya = snapToAngle(startX, startY, x, y);\n ({x, y} = xya);\n }\n */\n\n if (dx !== 0 || dy !== 0) {\n len = selectedElements.length;\n for (i = 0; i < len; ++i) {\n selected = selectedElements[i];\n if (isNullish(selected)) { break; }\n // if (i === 0) {\n // const box = utilsGetBBox(selected);\n // selectedBBoxes[i].x = box.x + dx;\n // selectedBBoxes[i].y = box.y + dy;\n // }\n\n // update the dummy transform in our transform list\n // to be a translate\n const xform = svgroot.createSVGTransform();\n tlist = getTransformList(selected);\n // Note that if Webkit and there's no ID for this\n // element, the dummy transform may have gotten lost.\n // This results in unexpected behaviour\n\n xform.setTranslate(dx, dy);\n if (tlist.numberOfItems) {\n tlist.replaceItem(xform, 0);\n } else {\n tlist.appendItem(xform);\n }\n\n // update our internal bbox that we're tracking while dragging\n selectorManager.requestSelector(selected).resize();\n }\n\n call('transition', selectedElements);\n }\n }\n break;\n } case 'multiselect': {\n realX *= currentZoom;\n realY *= currentZoom;\n assignAttributes(rubberBox, {\n x: Math.min(rStartX, realX),\n y: Math.min(rStartY, realY),\n width: Math.abs(realX - rStartX),\n height: Math.abs(realY - rStartY)\n }, 100);\n\n // for each selected:\n // - if newList contains selected, do nothing\n // - if newList doesn't contain selected, remove it from selected\n // - for any newList that was not in selectedElements, add it to selected\n const elemsToRemove = selectedElements.slice(), elemsToAdd = [],\n newList = getIntersectionList();\n\n // For every element in the intersection, add if not present in selectedElements.\n len = newList.length;\n for (i = 0; i < len; ++i) {\n const intElem = newList[i];\n // Found an element that was not selected before, so we should add it.\n if (!selectedElements.includes(intElem)) {\n elemsToAdd.push(intElem);\n }\n // Found an element that was already selected, so we shouldn't remove it.\n const foundInd = elemsToRemove.indexOf(intElem);\n if (foundInd !== -1) {\n elemsToRemove.splice(foundInd, 1);\n }\n }\n\n if (elemsToRemove.length > 0) {\n canvas.removeFromSelection(elemsToRemove);\n }\n\n if (elemsToAdd.length > 0) {\n canvas.addToSelection(elemsToAdd);\n }\n\n break;\n } case 'resize': {\n // we track the resize bounding box and translate/scale the selected element\n // while the mouse is down, when mouse goes up, we use this to recalculate\n // the shape's coordinates\n tlist = getTransformList(selected);\n const hasMatrix = hasMatrixTransform(tlist);\n box = hasMatrix ? initBbox : utilsGetBBox(selected);\n let left = box.x,\n top = box.y,\n {width, height} = box;\n dx = (x - startX);\n dy = (y - startY);\n\n if (curConfig.gridSnapping) {\n dx = snapToGrid(dx);\n dy = snapToGrid(dy);\n height = snapToGrid(height);\n width = snapToGrid(width);\n }\n\n // if rotated, adjust the dx,dy values\n angle = getRotationAngle(selected);\n if (angle) {\n const r = Math.sqrt(dx * dx + dy * dy),\n theta = Math.atan2(dy, dx) - angle * Math.PI / 180.0;\n dx = r * Math.cos(theta);\n dy = r * Math.sin(theta);\n }\n\n // if not stretching in y direction, set dy to 0\n // if not stretching in x direction, set dx to 0\n if (!currentResizeMode.includes('n') && !currentResizeMode.includes('s')) {\n dy = 0;\n }\n if (!currentResizeMode.includes('e') && !currentResizeMode.includes('w')) {\n dx = 0;\n }\n\n let // ts = null,\n tx = 0, ty = 0,\n sy = height ? (height + dy) / height : 1,\n sx = width ? (width + dx) / width : 1;\n // if we are dragging on the north side, then adjust the scale factor and ty\n if (currentResizeMode.includes('n')) {\n sy = height ? (height - dy) / height : 1;\n ty = height;\n }\n\n // if we dragging on the east side, then adjust the scale factor and tx\n if (currentResizeMode.includes('w')) {\n sx = width ? (width - dx) / width : 1;\n tx = width;\n }\n\n // update the transform list with translate,scale,translate\n const translateOrigin = svgroot.createSVGTransform(),\n scale = svgroot.createSVGTransform(),\n translateBack = svgroot.createSVGTransform();\n\n if (curConfig.gridSnapping) {\n left = snapToGrid(left);\n tx = snapToGrid(tx);\n top = snapToGrid(top);\n ty = snapToGrid(ty);\n }\n\n translateOrigin.setTranslate(-(left + tx), -(top + ty));\n if (evt.shiftKey) {\n if (sx === 1) {\n sx = sy;\n } else { sy = sx; }\n }\n scale.setScale(sx, sy);\n\n translateBack.setTranslate(left + tx, top + ty);\n if (hasMatrix) {\n const diff = angle ? 1 : 0;\n tlist.replaceItem(translateOrigin, 2 + diff);\n tlist.replaceItem(scale, 1 + diff);\n tlist.replaceItem(translateBack, Number(diff));\n } else {\n const N = tlist.numberOfItems;\n tlist.replaceItem(translateBack, N - 3);\n tlist.replaceItem(scale, N - 2);\n tlist.replaceItem(translateOrigin, N - 1);\n }\n\n selectorManager.requestSelector(selected).resize();\n\n call('transition', selectedElements);\n\n break;\n } case 'zoom': {\n realX *= currentZoom;\n realY *= currentZoom;\n assignAttributes(rubberBox, {\n x: Math.min(rStartX * currentZoom, realX),\n y: Math.min(rStartY * currentZoom, realY),\n width: Math.abs(realX - rStartX * currentZoom),\n height: Math.abs(realY - rStartY * currentZoom)\n }, 100);\n break;\n } case 'text': {\n assignAttributes(shape, {\n x,\n y\n }, 1000);\n break;\n } case 'line': {\n if (curConfig.gridSnapping) {\n x = snapToGrid(x);\n y = snapToGrid(y);\n }\n\n let x2 = x;\n let y2 = y;\n\n if (evt.shiftKey) {\n xya = snapToAngle(startX, startY, x2, y2);\n x2 = xya.x;\n y2 = xya.y;\n }\n\n shape.setAttribute('x2', x2);\n shape.setAttribute('y2', y2);\n break;\n } case 'foreignObject':\n // fall through\n case 'square':\n // fall through\n case 'rect':\n // fall through\n case 'image': {\n const square = (currentMode === 'square') || evt.shiftKey;\n let\n w = Math.abs(x - startX),\n h = Math.abs(y - startY);\n let newX, newY;\n if (square) {\n w = h = Math.max(w, h);\n newX = startX < x ? startX : startX - w;\n newY = startY < y ? startY : startY - h;\n } else {\n newX = Math.min(startX, x);\n newY = Math.min(startY, y);\n }\n\n if (curConfig.gridSnapping) {\n w = snapToGrid(w);\n h = snapToGrid(h);\n newX = snapToGrid(newX);\n newY = snapToGrid(newY);\n }\n\n assignAttributes(shape, {\n width: w,\n height: h,\n x: newX,\n y: newY\n }, 1000);\n\n break;\n } case 'circle': {\n c = $(shape).attr(['cx', 'cy']);\n ({cx, cy} = c);\n let rad = Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy));\n if (curConfig.gridSnapping) {\n rad = snapToGrid(rad);\n }\n shape.setAttribute('r', rad);\n break;\n } case 'ellipse': {\n c = $(shape).attr(['cx', 'cy']);\n ({cx, cy} = c);\n if (curConfig.gridSnapping) {\n x = snapToGrid(x);\n cx = snapToGrid(cx);\n y = snapToGrid(y);\n cy = snapToGrid(cy);\n }\n shape.setAttribute('rx', Math.abs(x - cx));\n const ry = Math.abs(evt.shiftKey ? (x - cx) : (y - cy));\n shape.setAttribute('ry', ry);\n break;\n }\n case 'fhellipse':\n case 'fhrect': {\n freehand.minx = Math.min(realX, freehand.minx);\n freehand.maxx = Math.max(realX, freehand.maxx);\n freehand.miny = Math.min(realY, freehand.miny);\n freehand.maxy = Math.max(realY, freehand.maxy);\n }\n // Fallthrough\n case 'fhpath': {\n // dAttr += + realX + ',' + realY + ' ';\n // shape.setAttribute('points', dAttr);\n end.x = realX; end.y = realY;\n if (controllPoint2.x && controllPoint2.y) {\n for (i = 0; i < STEP_COUNT - 1; i++) {\n parameter = i / STEP_COUNT;\n nextParameter = (i + 1) / STEP_COUNT;\n bSpline = getBsplinePoint(nextParameter);\n nextPos = bSpline;\n bSpline = getBsplinePoint(parameter);\n sumDistance += Math.sqrt((nextPos.x - bSpline.x) * (nextPos.x - bSpline.x) + (nextPos.y - bSpline.y) * (nextPos.y - bSpline.y));\n if (sumDistance > THRESHOLD_DIST) {\n sumDistance -= THRESHOLD_DIST;\n\n // Faster than completely re-writing the points attribute.\n const point = svgcontent.createSVGPoint();\n point.x = bSpline.x;\n point.y = bSpline.y;\n shape.points.appendItem(point);\n }\n }\n }\n controllPoint2 = {x: controllPoint1.x, y: controllPoint1.y};\n controllPoint1 = {x: start.x, y: start.y};\n start = {x: end.x, y: end.y};\n break;\n // update path stretch line coordinates\n} case 'path':\n // fall through\n case 'pathedit': {\n x *= currentZoom;\n y *= currentZoom;\n\n if (curConfig.gridSnapping) {\n x = snapToGrid(x);\n y = snapToGrid(y);\n startX = snapToGrid(startX);\n startY = snapToGrid(startY);\n }\n if (evt.shiftKey) {\n const {path} = pathModule;\n let x1, y1;\n if (path) {\n x1 = path.dragging ? path.dragging[0] : startX;\n y1 = path.dragging ? path.dragging[1] : startY;\n } else {\n x1 = startX;\n y1 = startY;\n }\n xya = snapToAngle(x1, y1, x, y);\n ({x, y} = xya);\n }\n\n if (rubberBox && rubberBox.getAttribute('display') !== 'none') {\n realX *= currentZoom;\n realY *= currentZoom;\n assignAttributes(rubberBox, {\n x: Math.min(rStartX * currentZoom, realX),\n y: Math.min(rStartY * currentZoom, realY),\n width: Math.abs(realX - rStartX * currentZoom),\n height: Math.abs(realY - rStartY * currentZoom)\n }, 100);\n }\n pathActions.mouseMove(x, y);\n\n break;\n } case 'textedit': {\n x *= currentZoom;\n y *= currentZoom;\n // if (rubberBox && rubberBox.getAttribute('display') !== 'none') {\n // assignAttributes(rubberBox, {\n // x: Math.min(startX, x),\n // y: Math.min(startY, y),\n // width: Math.abs(x - startX),\n // height: Math.abs(y - startY)\n // }, 100);\n // }\n\n textActions.mouseMove(mouseX, mouseY);\n\n break;\n } case 'rotate': {\n box = utilsGetBBox(selected);\n cx = box.x + box.width / 2;\n cy = box.y + box.height / 2;\n const m = getMatrix(selected),\n center = transformPoint(cx, cy, m);\n cx = center.x;\n cy = center.y;\n angle = ((Math.atan2(cy - y, cx - x) * (180 / Math.PI)) - 90) % 360;\n if (curConfig.gridSnapping) {\n angle = snapToGrid(angle);\n }\n if (evt.shiftKey) { // restrict rotations to nice angles (WRS)\n const snap = 45;\n angle = Math.round(angle / snap) * snap;\n }\n\n canvas.setRotationAngle(angle < -180 ? (360 + angle) : angle, true);\n call('transition', selectedElements);\n break;\n } default:\n break;\n }\n\n /**\n * The mouse has moved on the canvas area.\n * @event module:svgcanvas.SvgCanvas#event:ext_mouseMove\n * @type {PlainObject}\n * @property {MouseEvent} event The event object\n * @property {Float} mouse_x x coordinate on canvas\n * @property {Float} mouse_y y coordinate on canvas\n * @property {Element} selected Refers to the first selected element\n */\n runExtensions('mouseMove', /** @type {module:svgcanvas.SvgCanvas#event:ext_mouseMove} */ {\n event: evt,\n mouse_x: mouseX,\n mouse_y: mouseY,\n selected\n });\n}; // mouseMove()\n\n// - in create mode, the element's opacity is set properly, we create an InsertElementCommand\n// and store it on the Undo stack\n// - in move/resize mode, the element's attributes which were affected by the move/resize are\n// identified, a ChangeElementCommand is created and stored on the stack for those attrs\n// this is done in when we recalculate the selected dimensions()\n/**\n *\n * @param {MouseEvent} evt\n * @fires module:svgcanvas.SvgCanvas#event:zoomed\n * @fires module:svgcanvas.SvgCanvas#event:changed\n * @fires module:svgcanvas.SvgCanvas#event:ext_mouseUp\n * @returns {void}\n */\nconst mouseUp = function (evt) {\n if (evt.button === 2) { return; }\n const tempJustSelected = justSelected;\n justSelected = null;\n if (!started) { return; }\n const pt = transformPoint(evt.pageX, evt.pageY, rootSctm),\n mouseX = pt.x * currentZoom,\n mouseY = pt.y * currentZoom,\n x = mouseX / currentZoom,\n y = mouseY / currentZoom;\n\n let element = getElem(getId());\n let keep = false;\n\n const realX = x;\n const realY = y;\n\n // TODO: Make true when in multi-unit mode\n const useUnit = false; // (curConfig.baseUnit !== 'px');\n started = false;\n let attrs, t;\n switch (currentMode) {\n // intentionally fall-through to select here\n case 'resize':\n case 'multiselect':\n if (!isNullish(rubberBox)) {\n rubberBox.setAttribute('display', 'none');\n curBBoxes = [];\n }\n currentMode = 'select';\n // Fallthrough\n case 'select':\n if (!isNullish(selectedElements[0])) {\n // if we only have one selected element\n if (isNullish(selectedElements[1])) {\n // set our current stroke/fill properties to the element's\n const selected = selectedElements[0];\n switch (selected.tagName) {\n case 'g':\n case 'use':\n case 'image':\n case 'foreignObject':\n break;\n default:\n curProperties.fill = selected.getAttribute('fill');\n curProperties.fill_opacity = selected.getAttribute('fill-opacity');\n curProperties.stroke = selected.getAttribute('stroke');\n curProperties.stroke_opacity = selected.getAttribute('stroke-opacity');\n curProperties.stroke_width = selected.getAttribute('stroke-width');\n curProperties.stroke_dasharray = selected.getAttribute('stroke-dasharray');\n curProperties.stroke_linejoin = selected.getAttribute('stroke-linejoin');\n curProperties.stroke_linecap = selected.getAttribute('stroke-linecap');\n }\n\n if (selected.tagName === 'text') {\n curText.font_size = selected.getAttribute('font-size');\n curText.font_family = selected.getAttribute('font-family');\n }\n selectorManager.requestSelector(selected).showGrips(true);\n\n // This shouldn't be necessary as it was done on mouseDown...\n // call('selected', [selected]);\n }\n // always recalculate dimensions to strip off stray identity transforms\n recalculateAllSelectedDimensions();\n // if it was being dragged/resized\n if (realX !== rStartX || realY !== rStartY) {\n const len = selectedElements.length;\n for (let i = 0; i < len; ++i) {\n if (isNullish(selectedElements[i])) { break; }\n if (!selectedElements[i].firstChild) {\n // Not needed for groups (incorrectly resizes elems), possibly not needed at all?\n selectorManager.requestSelector(selectedElements[i]).resize();\n }\n }\n // no change in position/size, so maybe we should move to pathedit\n } else {\n t = evt.target;\n if (selectedElements[0].nodeName === 'path' && isNullish(selectedElements[1])) {\n pathActions.select(selectedElements[0]);\n // if it was a path\n // else, if it was selected and this is a shift-click, remove it from selection\n } else if (evt.shiftKey) {\n if (tempJustSelected !== t) {\n canvas.removeFromSelection([t]);\n }\n }\n } // no change in mouse position\n\n // Remove non-scaling stroke\n if (supportsNonScalingStroke()) {\n const elem = selectedElements[0];\n if (elem) {\n elem.removeAttribute('style');\n walkTree(elem, function (el) {\n el.removeAttribute('style');\n });\n }\n }\n }\n return;\n case 'zoom': {\n if (!isNullish(rubberBox)) {\n rubberBox.setAttribute('display', 'none');\n }\n const factor = evt.shiftKey ? 0.5 : 2;\n call('zoomed', {\n x: Math.min(rStartX, realX),\n y: Math.min(rStartY, realY),\n width: Math.abs(realX - rStartX),\n height: Math.abs(realY - rStartY),\n factor\n });\n return;\n } case 'fhpath': {\n // Check that the path contains at least 2 points; a degenerate one-point path\n // causes problems.\n // Webkit ignores how we set the points attribute with commas and uses space\n // to separate all coordinates, see https://bugs.webkit.org/show_bug.cgi?id=29870\n sumDistance = 0;\n controllPoint2 = {x: 0, y: 0};\n controllPoint1 = {x: 0, y: 0};\n start = {x: 0, y: 0};\n end = {x: 0, y: 0};\n const coords = element.getAttribute('points');\n const commaIndex = coords.indexOf(',');\n if (commaIndex >= 0) {\n keep = coords.includes(',', commaIndex + 1);\n } else {\n keep = coords.includes(' ', coords.indexOf(' ') + 1);\n }\n if (keep) {\n element = pathActions.smoothPolylineIntoPath(element);\n }\n break;\n } case 'line':\n attrs = $(element).attr(['x1', 'x2', 'y1', 'y2']);\n keep = (attrs.x1 !== attrs.x2 || attrs.y1 !== attrs.y2);\n break;\n case 'foreignObject':\n case 'square':\n case 'rect':\n case 'image':\n attrs = $(element).attr(['width', 'height']);\n // Image should be kept regardless of size (use inherit dimensions later)\n keep = (attrs.width || attrs.height) || currentMode === 'image';\n break;\n case 'circle':\n keep = (element.getAttribute('r') !== '0');\n break;\n case 'ellipse':\n attrs = $(element).attr(['rx', 'ry']);\n keep = (attrs.rx || attrs.ry);\n break;\n case 'fhellipse':\n if ((freehand.maxx - freehand.minx) > 0 &&\n (freehand.maxy - freehand.miny) > 0) {\n element = addSVGElementFromJson({\n element: 'ellipse',\n curStyles: true,\n attr: {\n cx: (freehand.minx + freehand.maxx) / 2,\n cy: (freehand.miny + freehand.maxy) / 2,\n rx: (freehand.maxx - freehand.minx) / 2,\n ry: (freehand.maxy - freehand.miny) / 2,\n id: getId()\n }\n });\n call('changed', [element]);\n keep = true;\n }\n break;\n case 'fhrect':\n if ((freehand.maxx - freehand.minx) > 0 &&\n (freehand.maxy - freehand.miny) > 0) {\n element = addSVGElementFromJson({\n element: 'rect',\n curStyles: true,\n attr: {\n x: freehand.minx,\n y: freehand.miny,\n width: (freehand.maxx - freehand.minx),\n height: (freehand.maxy - freehand.miny),\n id: getId()\n }\n });\n call('changed', [element]);\n keep = true;\n }\n break;\n case 'text':\n keep = true;\n selectOnly([element]);\n textActions.start(element);\n break;\n case 'path': {\n // set element to null here so that it is not removed nor finalized\n element = null;\n // continue to be set to true so that mouseMove happens\n started = true;\n\n const res = pathActions.mouseUp(evt, element, mouseX, mouseY);\n ({element} = res);\n ({keep} = res);\n break;\n } case 'pathedit':\n keep = true;\n element = null;\n pathActions.mouseUp(evt);\n break;\n case 'textedit':\n keep = false;\n element = null;\n textActions.mouseUp(evt, mouseX, mouseY);\n break;\n case 'rotate': {\n keep = true;\n element = null;\n currentMode = 'select';\n const batchCmd = canvas.undoMgr.finishUndoableChange();\n if (!batchCmd.isEmpty()) {\n addCommandToHistory(batchCmd);\n }\n // perform recalculation to weed out any stray identity transforms that might get stuck\n recalculateAllSelectedDimensions();\n call('changed', selectedElements);\n break;\n } default:\n // This could occur in an extension\n break;\n }\n\n /**\n * The main (left) mouse button is released (anywhere).\n * @event module:svgcanvas.SvgCanvas#event:ext_mouseUp\n * @type {PlainObject}\n * @property {MouseEvent} event The event object\n * @property {Float} mouse_x x coordinate on canvas\n * @property {Float} mouse_y y coordinate on canvas\n */\n const extResult = runExtensions('mouseUp', /** @type {module:svgcanvas.SvgCanvas#event:ext_mouseUp} */ {\n event: evt,\n mouse_x: mouseX,\n mouse_y: mouseY\n }, true);\n\n $.each(extResult, function (i, r) {\n if (r) {\n keep = r.keep || keep;\n ({element} = r);\n started = r.started || started;\n }\n });\n\n if (!keep && !isNullish(element)) {\n getCurrentDrawing().releaseId(getId());\n element.remove();\n element = null;\n\n t = evt.target;\n\n // if this element is in a group, go up until we reach the top-level group\n // just below the layer groups\n // TODO: once we implement links, we also would have to check for elements\n while (t && t.parentNode && t.parentNode.parentNode && t.parentNode.parentNode.tagName === 'g') {\n t = t.parentNode;\n }\n // if we are not in the middle of creating a path, and we've clicked on some shape,\n // then go to Select mode.\n // WebKit returns when the canvas is clicked, Firefox/Opera return
\n if ((currentMode !== 'path' || !drawnPath) &&\n t && t.parentNode &&\n t.parentNode.id !== 'selectorParentGroup' &&\n t.id !== 'svgcanvas' && t.id !== 'svgroot'\n ) {\n // switch into \"select\" mode if we've clicked on an element\n canvas.setMode('select');\n selectOnly([t], true);\n }\n } else if (!isNullish(element)) {\n /**\n * @name module:svgcanvas.SvgCanvas#addedNew\n * @type {boolean}\n */\n canvas.addedNew = true;\n\n if (useUnit) { convertAttrs(element); }\n\n let aniDur = 0.2;\n let cAni;\n if (opacAni.beginElement && Number.parseFloat(element.getAttribute('opacity')) !== curShape.opacity) {\n cAni = $(opacAni).clone().attr({\n to: curShape.opacity,\n dur: aniDur\n }).appendTo(element);\n try {\n // Fails in FF4 on foreignObject\n cAni[0].beginElement();\n } catch (e) {}\n } else {\n aniDur = 0;\n }\n\n // Ideally this would be done on the endEvent of the animation,\n // but that doesn't seem to be supported in Webkit\n setTimeout(function () {\n if (cAni) { cAni.remove(); }\n element.setAttribute('opacity', curShape.opacity);\n element.setAttribute('style', 'pointer-events:inherit');\n cleanupElement(element);\n if (currentMode === 'path') {\n pathActions.toEditMode(element);\n } else if (curConfig.selectNew) {\n selectOnly([element], true);\n }\n // we create the insert command that is stored on the stack\n // undo means to call cmd.unapply(), redo means to call cmd.apply()\n addCommandToHistory(new InsertElementCommand(element));\n\n call('changed', [element]);\n }, aniDur * 1000);\n }\n\n startTransform = null;\n};\n\nconst dblClick = function (evt) {\n const evtTarget = evt.target;\n const parent = evtTarget.parentNode;\n\n let mouseTarget = getMouseTarget(evt);\n const {tagName} = mouseTarget;\n\n if (tagName === 'text' && currentMode !== 'textedit') {\n const pt = transformPoint(evt.pageX, evt.pageY, rootSctm);\n textActions.select(mouseTarget, pt.x, pt.y);\n }\n\n // Do nothing if already in current group\n if (parent === currentGroup) { return; }\n\n if ((tagName === 'g' || tagName === 'a') &&\n getRotationAngle(mouseTarget)\n ) {\n // TODO: Allow method of in-group editing without having to do\n // this (similar to editing rotated paths)\n\n // Ungroup and regroup\n pushGroupProperties(mouseTarget);\n mouseTarget = selectedElements[0];\n clearSelection(true);\n }\n // Reset context\n if (currentGroup) {\n draw.leaveContext();\n }\n\n if ((parent.tagName !== 'g' && parent.tagName !== 'a') ||\n parent === getCurrentDrawing().getCurrentLayer() ||\n mouseTarget === selectorManager.selectorParentGroup\n ) {\n // Escape from in-group edit\n return;\n }\n draw.setContext(mouseTarget);\n};\n\n// prevent links from being followed in the canvas\nconst handleLinkInCanvas = function (e) {\n e.preventDefault();\n return false;\n};\n\n// Added mouseup to the container here.\n// TODO(codedread): Figure out why after the Closure compiler, the window mouseup is ignored.\n$(container).mousedown(mouseDown).mousemove(mouseMove).click(handleLinkInCanvas).dblclick(dblClick).mouseup(mouseUp);\n// $(window).mouseup(mouseUp);\n\n// TODO(rafaelcastrocouto): User preference for shift key and zoom factor\n$(container).bind(\n 'mousewheel DOMMouseScroll',\n /**\n * @param {Event} e\n * @fires module:svgcanvas.SvgCanvas#event:updateCanvas\n * @fires module:svgcanvas.SvgCanvas#event:zoomDone\n * @returns {void}\n */\n function (e) {\n if (!e.shiftKey) { return; }\n\n e.preventDefault();\n const evt = e.originalEvent;\n\n rootSctm = $('#svgcontent g')[0].getScreenCTM().inverse();\n\n const workarea = $('#workarea');\n const scrbar = 15;\n const rulerwidth = curConfig.showRulers ? 16 : 0;\n\n // mouse relative to content area in content pixels\n const pt = transformPoint(evt.pageX, evt.pageY, rootSctm);\n\n // full work area width in screen pixels\n const editorFullW = workarea.width();\n const editorFullH = workarea.height();\n\n // work area width minus scroll and ruler in screen pixels\n const editorW = editorFullW - scrbar - rulerwidth;\n const editorH = editorFullH - scrbar - rulerwidth;\n\n // work area width in content pixels\n const workareaViewW = editorW * rootSctm.a;\n const workareaViewH = editorH * rootSctm.d;\n\n // content offset from canvas in screen pixels\n const wOffset = workarea.offset();\n const wOffsetLeft = wOffset.left + rulerwidth;\n const wOffsetTop = wOffset.top + rulerwidth;\n\n const delta = (evt.wheelDelta) ? evt.wheelDelta : (evt.detail) ? -evt.detail : 0;\n if (!delta) { return; }\n\n let factor = Math.max(3 / 4, Math.min(4 / 3, (delta)));\n\n let wZoom, hZoom;\n if (factor > 1) {\n wZoom = Math.ceil(editorW / workareaViewW * factor * 100) / 100;\n hZoom = Math.ceil(editorH / workareaViewH * factor * 100) / 100;\n } else {\n wZoom = Math.floor(editorW / workareaViewW * factor * 100) / 100;\n hZoom = Math.floor(editorH / workareaViewH * factor * 100) / 100;\n }\n let zoomlevel = Math.min(wZoom, hZoom);\n zoomlevel = Math.min(10, Math.max(0.01, zoomlevel));\n if (zoomlevel === currentZoom) {\n return;\n }\n factor = zoomlevel / currentZoom;\n\n // top left of workarea in content pixels before zoom\n const topLeftOld = transformPoint(wOffsetLeft, wOffsetTop, rootSctm);\n\n // top left of workarea in content pixels after zoom\n const topLeftNew = {\n x: pt.x - (pt.x - topLeftOld.x) / factor,\n y: pt.y - (pt.y - topLeftOld.y) / factor\n };\n\n // top left of workarea in canvas pixels relative to content after zoom\n const topLeftNewCanvas = {\n x: topLeftNew.x * zoomlevel,\n y: topLeftNew.y * zoomlevel\n };\n\n // new center in canvas pixels\n const newCtr = {\n x: topLeftNewCanvas.x - rulerwidth + editorFullW / 2,\n y: topLeftNewCanvas.y - rulerwidth + editorFullH / 2\n };\n\n canvas.setZoom(zoomlevel);\n $('#zoom').val((zoomlevel * 100).toFixed(1));\n\n call('updateCanvas', {center: false, newCtr});\n call('zoomDone');\n }\n);\n}());\n\n/* eslint-disable jsdoc/require-property */\n/**\n* Group: Text edit functions\n* Functions relating to editing text elements.\n* @namespace {PlainObject} textActions\n* @memberof module:svgcanvas.SvgCanvas#\n*/\nconst textActions = canvas.textActions = (function () {\n/* eslint-enable jsdoc/require-property */\nlet curtext;\nlet textinput;\nlet cursor;\nlet selblock;\nlet blinker;\nlet chardata = [];\nlet textbb; // , transbb;\nlet matrix;\nlet lastX, lastY;\nlet allowDbl;\n\n/**\n *\n * @param {Integer} index\n * @returns {void}\n */\nfunction setCursor (index) {\n const empty = (textinput.value === '');\n $(textinput).focus();\n\n if (!arguments.length) {\n if (empty) {\n index = 0;\n } else {\n if (textinput.selectionEnd !== textinput.selectionStart) { return; }\n index = textinput.selectionEnd;\n }\n }\n\n const charbb = chardata[index];\n if (!empty) {\n textinput.setSelectionRange(index, index);\n }\n cursor = getElem('text_cursor');\n if (!cursor) {\n cursor = document.createElementNS(NS.SVG, 'line');\n assignAttributes(cursor, {\n id: 'text_cursor',\n stroke: '#333',\n 'stroke-width': 1\n });\n cursor = getElem('selectorParentGroup').appendChild(cursor);\n }\n\n if (!blinker) {\n blinker = setInterval(function () {\n const show = (cursor.getAttribute('display') === 'none');\n cursor.setAttribute('display', show ? 'inline' : 'none');\n }, 600);\n }\n\n const startPt = ptToScreen(charbb.x, textbb.y);\n const endPt = ptToScreen(charbb.x, (textbb.y + textbb.height));\n\n assignAttributes(cursor, {\n x1: startPt.x,\n y1: startPt.y,\n x2: endPt.x,\n y2: endPt.y,\n visibility: 'visible',\n display: 'inline'\n });\n\n if (selblock) { selblock.setAttribute('d', ''); }\n}\n\n/**\n *\n * @param {Integer} start\n * @param {Integer} end\n * @param {boolean} skipInput\n * @returns {void}\n */\nfunction setSelection (start, end, skipInput) {\n if (start === end) {\n setCursor(end);\n return;\n }\n\n if (!skipInput) {\n textinput.setSelectionRange(start, end);\n }\n\n selblock = getElem('text_selectblock');\n if (!selblock) {\n selblock = document.createElementNS(NS.SVG, 'path');\n assignAttributes(selblock, {\n id: 'text_selectblock',\n fill: 'green',\n opacity: 0.5,\n style: 'pointer-events:none'\n });\n getElem('selectorParentGroup').append(selblock);\n }\n\n const startbb = chardata[start];\n const endbb = chardata[end];\n\n cursor.setAttribute('visibility', 'hidden');\n\n const tl = ptToScreen(startbb.x, textbb.y),\n tr = ptToScreen(startbb.x + (endbb.x - startbb.x), textbb.y),\n bl = ptToScreen(startbb.x, textbb.y + textbb.height),\n br = ptToScreen(startbb.x + (endbb.x - startbb.x), textbb.y + textbb.height);\n\n const dstr = 'M' + tl.x + ',' + tl.y +\n ' L' + tr.x + ',' + tr.y +\n ' ' + br.x + ',' + br.y +\n ' ' + bl.x + ',' + bl.y + 'z';\n\n assignAttributes(selblock, {\n d: dstr,\n display: 'inline'\n });\n}\n\n/**\n *\n * @param {Float} mouseX\n * @param {Float} mouseY\n * @returns {Integer}\n */\nfunction getIndexFromPoint (mouseX, mouseY) {\n // Position cursor here\n const pt = svgroot.createSVGPoint();\n pt.x = mouseX;\n pt.y = mouseY;\n\n // No content, so return 0\n if (chardata.length === 1) { return 0; }\n // Determine if cursor should be on left or right of character\n let charpos = curtext.getCharNumAtPosition(pt);\n if (charpos < 0) {\n // Out of text range, look at mouse coords\n charpos = chardata.length - 2;\n if (mouseX <= chardata[0].x) {\n charpos = 0;\n }\n } else if (charpos >= chardata.length - 2) {\n charpos = chardata.length - 2;\n }\n const charbb = chardata[charpos];\n const mid = charbb.x + (charbb.width / 2);\n if (mouseX > mid) {\n charpos++;\n }\n return charpos;\n}\n\n/**\n *\n * @param {Float} mouseX\n * @param {Float} mouseY\n * @returns {void}\n */\nfunction setCursorFromPoint (mouseX, mouseY) {\n setCursor(getIndexFromPoint(mouseX, mouseY));\n}\n\n/**\n *\n * @param {Float} x\n * @param {Float} y\n * @param {boolean} apply\n * @returns {void}\n */\nfunction setEndSelectionFromPoint (x, y, apply) {\n const i1 = textinput.selectionStart;\n const i2 = getIndexFromPoint(x, y);\n\n const start = Math.min(i1, i2);\n const end = Math.max(i1, i2);\n setSelection(start, end, !apply);\n}\n\n/**\n *\n * @param {Float} xIn\n * @param {Float} yIn\n * @returns {module:math.XYObject}\n */\nfunction screenToPt (xIn, yIn) {\n const out = {\n x: xIn,\n y: yIn\n };\n\n out.x /= currentZoom;\n out.y /= currentZoom;\n\n if (matrix) {\n const pt = transformPoint(out.x, out.y, matrix.inverse());\n out.x = pt.x;\n out.y = pt.y;\n }\n\n return out;\n}\n\n/**\n *\n * @param {Float} xIn\n * @param {Float} yIn\n * @returns {module:math.XYObject}\n */\nfunction ptToScreen (xIn, yIn) {\n const out = {\n x: xIn,\n y: yIn\n };\n\n if (matrix) {\n const pt = transformPoint(out.x, out.y, matrix);\n out.x = pt.x;\n out.y = pt.y;\n }\n\n out.x *= currentZoom;\n out.y *= currentZoom;\n\n return out;\n}\n\n/*\n// Not currently in use\nfunction hideCursor () {\n if (cursor) {\n cursor.setAttribute('visibility', 'hidden');\n }\n}\n*/\n\n/**\n *\n * @param {Event} evt\n * @returns {void}\n */\nfunction selectAll (evt) {\n setSelection(0, curtext.textContent.length);\n $(this).unbind(evt);\n}\n\n/**\n *\n * @param {Event} evt\n * @returns {void}\n */\nfunction selectWord (evt) {\n if (!allowDbl || !curtext) { return; }\n\n const ept = transformPoint(evt.pageX, evt.pageY, rootSctm),\n mouseX = ept.x * currentZoom,\n mouseY = ept.y * currentZoom;\n const pt = screenToPt(mouseX, mouseY);\n\n const index = getIndexFromPoint(pt.x, pt.y);\n const str = curtext.textContent;\n const first = str.substr(0, index).replace(/[a-z\\d]+$/i, '').length;\n const m = str.substr(index).match(/^[a-z\\d]+/i);\n const last = (m ? m[0].length : 0) + index;\n setSelection(first, last);\n\n // Set tripleclick\n $(evt.target).click(selectAll);\n setTimeout(function () {\n $(evt.target).unbind('click', selectAll);\n }, 300);\n}\n\nreturn /** @lends module:svgcanvas.SvgCanvas#textActions */ {\n /**\n * @param {Element} target\n * @param {Float} x\n * @param {Float} y\n * @returns {void}\n */\n select (target, x, y) {\n curtext = target;\n textActions.toEditMode(x, y);\n },\n /**\n * @param {Element} elem\n * @returns {void}\n */\n start (elem) {\n curtext = elem;\n textActions.toEditMode();\n },\n /**\n * @param {external:MouseEvent} evt\n * @param {Element} mouseTarget\n * @param {Float} startX\n * @param {Float} startY\n * @returns {void}\n */\n mouseDown (evt, mouseTarget, startX, startY) {\n const pt = screenToPt(startX, startY);\n\n textinput.focus();\n setCursorFromPoint(pt.x, pt.y);\n lastX = startX;\n lastY = startY;\n\n // TODO: Find way to block native selection\n },\n /**\n * @param {Float} mouseX\n * @param {Float} mouseY\n * @returns {void}\n */\n mouseMove (mouseX, mouseY) {\n const pt = screenToPt(mouseX, mouseY);\n setEndSelectionFromPoint(pt.x, pt.y);\n },\n /**\n * @param {external:MouseEvent} evt\n * @param {Float} mouseX\n * @param {Float} mouseY\n * @returns {void}\n */\n mouseUp (evt, mouseX, mouseY) {\n const pt = screenToPt(mouseX, mouseY);\n\n setEndSelectionFromPoint(pt.x, pt.y, true);\n\n // TODO: Find a way to make this work: Use transformed BBox instead of evt.target\n // if (lastX === mouseX && lastY === mouseY\n // && !rectsIntersect(transbb, {x: pt.x, y: pt.y, width: 0, height: 0})) {\n // textActions.toSelectMode(true);\n // }\n\n if (\n evt.target !== curtext &&\n mouseX < lastX + 2 &&\n mouseX > lastX - 2 &&\n mouseY < lastY + 2 &&\n mouseY > lastY - 2\n ) {\n textActions.toSelectMode(true);\n }\n },\n /**\n * @function\n * @param {Integer} index\n * @returns {void}\n */\n setCursor,\n /**\n * @param {Float} x\n * @param {Float} y\n * @returns {void}\n */\n toEditMode (x, y) {\n allowDbl = false;\n currentMode = 'textedit';\n selectorManager.requestSelector(curtext).showGrips(false);\n // Make selector group accept clicks\n /* const selector = */ selectorManager.requestSelector(curtext); // Do we need this? Has side effect of setting lock, so keeping for now, but next line wasn't being used\n // const sel = selector.selectorRect;\n\n textActions.init();\n\n $(curtext).css('cursor', 'text');\n\n // if (supportsEditableText()) {\n // curtext.setAttribute('editable', 'simple');\n // return;\n // }\n\n if (!arguments.length) {\n setCursor();\n } else {\n const pt = screenToPt(x, y);\n setCursorFromPoint(pt.x, pt.y);\n }\n\n setTimeout(function () {\n allowDbl = true;\n }, 300);\n },\n /**\n * @param {boolean|Element} selectElem\n * @fires module:svgcanvas.SvgCanvas#event:selected\n * @returns {void}\n */\n toSelectMode (selectElem) {\n currentMode = 'select';\n clearInterval(blinker);\n blinker = null;\n if (selblock) { $(selblock).attr('display', 'none'); }\n if (cursor) { $(cursor).attr('visibility', 'hidden'); }\n $(curtext).css('cursor', 'move');\n\n if (selectElem) {\n clearSelection();\n $(curtext).css('cursor', 'move');\n\n call('selected', [curtext]);\n addToSelection([curtext], true);\n }\n if (curtext && !curtext.textContent.length) {\n // No content, so delete\n canvas.deleteSelectedElements();\n }\n\n $(textinput).blur();\n\n curtext = false;\n\n // if (supportsEditableText()) {\n // curtext.removeAttribute('editable');\n // }\n },\n /**\n * @param {Element} elem\n * @returns {void}\n */\n setInputElem (elem) {\n textinput = elem;\n // $(textinput).blur(hideCursor);\n },\n /**\n * @returns {void}\n */\n clear () {\n if (currentMode === 'textedit') {\n textActions.toSelectMode();\n }\n },\n /**\n * @param {Element} inputElem Not in use\n * @returns {void}\n */\n init (inputElem) {\n if (!curtext) { return; }\n let i, end;\n // if (supportsEditableText()) {\n // curtext.select();\n // return;\n // }\n\n if (!curtext.parentNode) {\n // Result of the ffClone, need to get correct element\n curtext = selectedElements[0];\n selectorManager.requestSelector(curtext).showGrips(false);\n }\n\n const str = curtext.textContent;\n const len = str.length;\n\n const xform = curtext.getAttribute('transform');\n\n textbb = utilsGetBBox(curtext);\n\n matrix = xform ? getMatrix(curtext) : null;\n\n chardata = [];\n chardata.length = len;\n textinput.focus();\n\n $(curtext).unbind('dblclick', selectWord).dblclick(selectWord);\n\n if (!len) {\n end = {x: textbb.x + (textbb.width / 2), width: 0};\n }\n\n for (i = 0; i < len; i++) {\n const start = curtext.getStartPositionOfChar(i);\n end = curtext.getEndPositionOfChar(i);\n\n if (!supportsGoodTextCharPos()) {\n const offset = canvas.contentW * currentZoom;\n start.x -= offset;\n end.x -= offset;\n\n start.x /= currentZoom;\n end.x /= currentZoom;\n }\n\n // Get a \"bbox\" equivalent for each character. Uses the\n // bbox data of the actual text for y, height purposes\n\n // TODO: Decide if y, width and height are actually necessary\n chardata[i] = {\n x: start.x,\n y: textbb.y, // start.y?\n width: end.x - start.x,\n height: textbb.height\n };\n }\n\n // Add a last bbox for cursor at end of text\n chardata.push({\n x: end.x,\n width: 0\n });\n setSelection(textinput.selectionStart, textinput.selectionEnd, true);\n }\n};\n}());\n\n/**\n* Group: Serialization.\n*/\n\n/**\n* Looks at DOM elements inside the `` to see if they are referred to,\n* removes them from the DOM if they are not.\n* @function module:svgcanvas.SvgCanvas#removeUnusedDefElems\n* @returns {Integer} The number of elements that were removed\n*/\nconst removeUnusedDefElems = this.removeUnusedDefElems = function () {\n const defs = svgcontent.getElementsByTagNameNS(NS.SVG, 'defs');\n if (!defs || !defs.length) { return 0; }\n\n // if (!defs.firstChild) { return; }\n\n const defelemUses = [];\n let numRemoved = 0;\n const attrs = ['fill', 'stroke', 'filter', 'marker-start', 'marker-mid', 'marker-end'];\n const alen = attrs.length;\n\n const allEls = svgcontent.getElementsByTagNameNS(NS.SVG, '*');\n const allLen = allEls.length;\n\n let i, j;\n for (i = 0; i < allLen; i++) {\n const el = allEls[i];\n for (j = 0; j < alen; j++) {\n const ref = getUrlFromAttr(el.getAttribute(attrs[j]));\n if (ref) {\n defelemUses.push(ref.substr(1));\n }\n }\n\n // gradients can refer to other gradients\n const href = getHref(el);\n if (href && href.startsWith('#')) {\n defelemUses.push(href.substr(1));\n }\n }\n\n const defelems = $(defs).find('linearGradient, radialGradient, filter, marker, svg, symbol');\n i = defelems.length;\n while (i--) {\n const defelem = defelems[i];\n const {id} = defelem;\n if (!defelemUses.includes(id)) {\n // Not found, so remove (but remember)\n removedElements[id] = defelem;\n defelem.remove();\n numRemoved++;\n }\n }\n\n return numRemoved;\n};\n\n/**\n* Main function to set up the SVG content for output.\n* @function module:svgcanvas.SvgCanvas#svgCanvasToString\n* @returns {string} The SVG image for output\n*/\nthis.svgCanvasToString = function () {\n // keep calling it until there are none to remove\n while (removeUnusedDefElems() > 0) {} // eslint-disable-line no-empty\n\n pathActions.clear(true);\n\n // Keep SVG-Edit comment on top\n $.each(svgcontent.childNodes, function (i, node) {\n if (i && node.nodeType === 8 && node.data.includes('Created with')) {\n svgcontent.firstChild.before(node);\n }\n });\n\n // Move out of in-group editing mode\n if (currentGroup) {\n draw.leaveContext();\n selectOnly([currentGroup]);\n }\n\n const nakedSvgs = [];\n\n // Unwrap gsvg if it has no special attributes (only id and style)\n $(svgcontent).find('g:data(gsvg)').each(function () {\n const attrs = this.attributes;\n let len = attrs.length;\n for (let i = 0; i < len; i++) {\n if (attrs[i].nodeName === 'id' || attrs[i].nodeName === 'style') {\n len--;\n }\n }\n // No significant attributes, so ungroup\n if (len <= 0) {\n const svg = this.firstChild;\n nakedSvgs.push(svg);\n $(this).replaceWith(svg);\n }\n });\n const output = this.svgToString(svgcontent, 0);\n\n // Rewrap gsvg\n if (nakedSvgs.length) {\n $(nakedSvgs).each(function () {\n groupSvgElem(this);\n });\n }\n\n return output;\n};\n\n/**\n* Sub function ran on each SVG element to convert it to a string as desired.\n* @function module:svgcanvas.SvgCanvas#svgToString\n* @param {Element} elem - The SVG element to convert\n* @param {Integer} indent - Number of spaces to indent this tag\n* @returns {string} The given element as an SVG tag\n*/\nthis.svgToString = function (elem, indent) {\n const out = [];\n const unit = curConfig.baseUnit;\n const unitRe = new RegExp('^-?[\\\\d\\\\.]+' + unit + '$');\n\n if (elem) {\n cleanupElement(elem);\n const attrs = [...elem.attributes];\n const childs = elem.childNodes;\n attrs.sort((a, b) => {\n return a.name > b.name ? -1 : 1;\n });\n\n for (let i = 0; i < indent; i++) { out.push(' '); }\n out.push('<'); out.push(elem.nodeName);\n if (elem.id === 'svgcontent') {\n // Process root element separately\n const res = getResolution();\n\n const vb = '';\n // TODO: Allow this by dividing all values by current baseVal\n // Note that this also means we should properly deal with this on import\n // if (curConfig.baseUnit !== 'px') {\n // const unit = curConfig.baseUnit;\n // const unitM = getTypeMap()[unit];\n // res.w = shortFloat(res.w / unitM);\n // res.h = shortFloat(res.h / unitM);\n // vb = ' viewBox=\"' + [0, 0, res.w, res.h].join(' ') + '\"';\n // res.w += unit;\n // res.h += unit;\n // }\n\n if (unit !== 'px') {\n res.w = convertUnit(res.w, unit) + unit;\n res.h = convertUnit(res.h, unit) + unit;\n }\n\n out.push(' width=\"' + res.w + '\" height=\"' + res.h + '\"' + vb + ' xmlns=\"' + NS.SVG + '\"');\n\n const nsuris = {};\n\n // Check elements for namespaces, add if found\n $(elem).find('*').andSelf().each(function () {\n // const el = this;\n // for some elements have no attribute\n const uri = this.namespaceURI;\n if (uri && !nsuris[uri] && nsMap[uri] && nsMap[uri] !== 'xmlns' && nsMap[uri] !== 'xml') {\n nsuris[uri] = true;\n out.push(' xmlns:' + nsMap[uri] + '=\"' + uri + '\"');\n }\n\n $.each(this.attributes, function (i, attr) {\n const u = attr.namespaceURI;\n if (u && !nsuris[u] && nsMap[u] !== 'xmlns' && nsMap[u] !== 'xml') {\n nsuris[u] = true;\n out.push(' xmlns:' + nsMap[u] + '=\"' + u + '\"');\n }\n });\n });\n\n let i = attrs.length;\n const attrNames = ['width', 'height', 'xmlns', 'x', 'y', 'viewBox', 'id', 'overflow'];\n while (i--) {\n const attr = attrs[i];\n const attrVal = toXml(attr.value);\n\n // Namespaces have already been dealt with, so skip\n if (attr.nodeName.startsWith('xmlns:')) { continue; }\n\n // only serialize attributes we don't use internally\n if (attrVal !== '' && !attrNames.includes(attr.localName)) {\n if (!attr.namespaceURI || nsMap[attr.namespaceURI]) {\n out.push(' ');\n out.push(attr.nodeName); out.push('=\"');\n out.push(attrVal); out.push('\"');\n }\n }\n }\n } else {\n // Skip empty defs\n if (elem.nodeName === 'defs' && !elem.firstChild) { return ''; }\n\n const mozAttrs = ['-moz-math-font-style', '_moz-math-font-style'];\n for (let i = attrs.length - 1; i >= 0; i--) {\n const attr = attrs[i];\n let attrVal = toXml(attr.value);\n // remove bogus attributes added by Gecko\n if (mozAttrs.includes(attr.localName)) { continue; }\n if (attrVal === 'null') {\n const styleName = attr.localName.replace(/-[a-z]/g, (s) => s[1].toUpperCase());\n if (Object.prototype.hasOwnProperty.call(elem.style, styleName)) { continue; }\n }\n if (attrVal !== '') {\n if (attrVal.startsWith('pointer-events')) { continue; }\n if (attr.localName === 'class' && attrVal.startsWith('se_')) { continue; }\n out.push(' ');\n if (attr.localName === 'd') { attrVal = pathActions.convertPath(elem, true); }\n if (!isNaN(attrVal)) {\n attrVal = shortFloat(attrVal);\n } else if (unitRe.test(attrVal)) {\n attrVal = shortFloat(attrVal) + unit;\n }\n\n // Embed images when saving\n if (saveOptions.apply &&\n elem.nodeName === 'image' &&\n attr.localName === 'href' &&\n saveOptions.images &&\n saveOptions.images === 'embed'\n ) {\n const img = encodableImages[attrVal];\n if (img) { attrVal = img; }\n }\n\n // map various namespaces to our fixed namespace prefixes\n // (the default xmlns attribute itself does not get a prefix)\n if (!attr.namespaceURI || attr.namespaceURI === NS.SVG || nsMap[attr.namespaceURI]) {\n out.push(attr.nodeName); out.push('=\"');\n out.push(attrVal); out.push('\"');\n }\n }\n }\n }\n\n if (elem.hasChildNodes()) {\n out.push('>');\n indent++;\n let bOneLine = false;\n\n for (let i = 0; i < childs.length; i++) {\n const child = childs.item(i);\n switch (child.nodeType) {\n case 1: // element node\n out.push('\\n');\n out.push(this.svgToString(child, indent));\n break;\n case 3: { // text node\n const str = child.nodeValue.replace(/^\\s+|\\s+$/g, '');\n if (str !== '') {\n bOneLine = true;\n out.push(String(toXml(str)));\n }\n break;\n } case 4: // cdata node\n out.push('\\n');\n out.push(new Array(indent + 1).join(' '));\n out.push('');\n break;\n case 8: // comment\n out.push('\\n');\n out.push(new Array(indent + 1).join(' '));\n out.push('');\n break;\n } // switch on node type\n }\n indent--;\n if (!bOneLine) {\n out.push('\\n');\n for (let i = 0; i < indent; i++) { out.push(' '); }\n }\n out.push(''); out.push(elem.nodeName); out.push('>');\n } else {\n out.push('/>');\n }\n }\n return out.join('');\n}; // end svgToString()\n\n/**\n * Function to run when image data is found.\n * @callback module:svgcanvas.ImageEmbeddedCallback\n * @param {string|false} result Data URL\n * @returns {void}\n */\n/**\n* Converts a given image file to a data URL when possible, then runs a given callback.\n* @function module:svgcanvas.SvgCanvas#embedImage\n* @param {string} src - The path/URL of the image\n* @returns {Promise} Resolves to a Data URL (string|false)\n*/\nthis.embedImage = function (src) {\n // Todo: Remove this Promise in favor of making an async/await `Image.load` utility\n return new Promise(function (resolve, reject) { // eslint-disable-line promise/avoid-new\n // load in the image and once it's loaded, get the dimensions\n $(new Image()).load(function (response, status, xhr) {\n if (status === 'error') {\n reject(new Error('Error loading image: ' + xhr.status + ' ' + xhr.statusText));\n return;\n }\n // create a canvas the same size as the raster image\n const cvs = document.createElement('canvas');\n cvs.width = this.width;\n cvs.height = this.height;\n // load the raster image into the canvas\n cvs.getContext('2d').drawImage(this, 0, 0);\n // retrieve the data: URL\n try {\n let urldata = ';svgedit_url=' + encodeURIComponent(src);\n urldata = cvs.toDataURL().replace(';base64', urldata + ';base64');\n encodableImages[src] = urldata;\n } catch (e) {\n encodableImages[src] = false;\n }\n lastGoodImgUrl = src;\n resolve(encodableImages[src]);\n }).attr('src', src);\n });\n};\n\n/**\n* Sets a given URL to be a \"last good image\" URL.\n* @function module:svgcanvas.SvgCanvas#setGoodImage\n* @param {string} val\n* @returns {void}\n*/\nthis.setGoodImage = function (val) {\n lastGoodImgUrl = val;\n};\n\n/**\n* Does nothing by default, handled by optional widget/extension.\n* @function module:svgcanvas.SvgCanvas#open\n* @returns {void}\n*/\nthis.open = function () {\n /* */\n};\n\n/**\n* Serializes the current drawing into SVG XML text and passes it to the 'saved' handler.\n* This function also includes the XML prolog. Clients of the `SvgCanvas` bind their save\n* function to the 'saved' event.\n* @function module:svgcanvas.SvgCanvas#save\n* @param {module:svgcanvas.SaveOptions} opts\n* @fires module:svgcanvas.SvgCanvas#event:saved\n* @returns {void}\n*/\nthis.save = function (opts) {\n // remove the selected outline before serializing\n clearSelection();\n // Update save options if provided\n if (opts) { $.extend(saveOptions, opts); }\n saveOptions.apply = true;\n\n // no need for doctype, see https://jwatt.org/svg/authoring/#doctype-declaration\n const str = this.svgCanvasToString();\n call('saved', str);\n};\n\n/**\n* @typedef {PlainObject} module:svgcanvas.IssuesAndCodes\n* @property {string[]} issueCodes The locale-independent code names\n* @property {string[]} issues The localized descriptions\n*/\n\n/**\n* Codes only is useful for locale-independent detection.\n* @returns {module:svgcanvas.IssuesAndCodes}\n*/\nfunction getIssues () {\n // remove the selected outline before serializing\n clearSelection();\n\n // Check for known CanVG issues\n const issues = [];\n const issueCodes = [];\n\n // Selector and notice\n const issueList = {\n feGaussianBlur: uiStrings.exportNoBlur,\n foreignObject: uiStrings.exportNoforeignObject,\n '[stroke-dasharray]': uiStrings.exportNoDashArray\n };\n const content = $(svgcontent);\n\n // Add font/text check if Canvas Text API is not implemented\n if (!('font' in $('')[0].getContext('2d'))) {\n issueList.text = uiStrings.exportNoText;\n }\n\n $.each(issueList, function (sel, descr) {\n if (content.find(sel).length) {\n issueCodes.push(sel);\n issues.push(descr);\n }\n });\n return {issues, issueCodes};\n}\n\nlet canvg;\n/**\n* @typedef {\"feGaussianBlur\"|\"foreignObject\"|\"[stroke-dasharray]\"|\"text\"} module:svgcanvas.IssueCode\n*/\n/**\n* @typedef {PlainObject} module:svgcanvas.ImageExportedResults\n* @property {string} datauri Contents as a Data URL\n* @property {string} bloburl May be the empty string\n* @property {string} svg The SVG contents as a string\n* @property {string[]} issues The localization messages of `issueCodes`\n* @property {module:svgcanvas.IssueCode[]} issueCodes CanVG issues found with the SVG\n* @property {\"PNG\"|\"JPEG\"|\"BMP\"|\"WEBP\"|\"ICO\"} type The chosen image type\n* @property {\"image/png\"|\"image/jpeg\"|\"image/bmp\"|\"image/webp\"} mimeType The image MIME type\n* @property {Float} quality A decimal between 0 and 1 (for use with JPEG or WEBP)\n* @property {string} exportWindowName A convenience for passing along a `window.name` to target a window on which the export could be added\n*/\n\n/**\n* Generates a PNG (or JPG, BMP, WEBP) Data URL based on the current image,\n* then calls \"exported\" with an object including the string, image\n* information, and any issues found.\n* @function module:svgcanvas.SvgCanvas#rasterExport\n* @param {\"PNG\"|\"JPEG\"|\"BMP\"|\"WEBP\"|\"ICO\"} [imgType=\"PNG\"]\n* @param {Float} [quality] Between 0 and 1\n* @param {string} [exportWindowName]\n* @param {PlainObject} [opts]\n* @param {boolean} [opts.avoidEvent]\n* @fires module:svgcanvas.SvgCanvas#event:exported\n* @todo Confirm/fix ICO type\n* @returns {Promise} Resolves to {@link module:svgcanvas.ImageExportedResults}\n*/\nthis.rasterExport = async function (imgType, quality, exportWindowName, opts = {}) {\n const type = imgType === 'ICO' ? 'BMP' : (imgType || 'PNG');\n const mimeType = 'image/' + type.toLowerCase();\n const {issues, issueCodes} = getIssues();\n const svg = this.svgCanvasToString();\n\n if (!canvg) {\n ({canvg} = await importSetGlobal(curConfig.canvgPath + 'canvg.js', {\n global: 'canvg'\n }));\n }\n if (!$('#export_canvas').length) {\n $('', {id: 'export_canvas'}).hide().appendTo('body');\n }\n const c = $('#export_canvas')[0];\n c.width = canvas.contentW;\n c.height = canvas.contentH;\n\n await canvg(c, svg);\n // Todo: Make async/await utility in place of `toBlob`, so we can remove this constructor\n return new Promise((resolve, reject) => { // eslint-disable-line promise/avoid-new\n const dataURLType = type.toLowerCase();\n const datauri = quality\n ? c.toDataURL('image/' + dataURLType, quality)\n : c.toDataURL('image/' + dataURLType);\n let bloburl;\n /**\n * Called when `bloburl` is available for export.\n * @returns {void}\n */\n function done () {\n const obj = {\n datauri, bloburl, svg, issues, issueCodes, type: imgType,\n mimeType, quality, exportWindowName\n };\n if (!opts.avoidEvent) {\n call('exported', obj);\n }\n resolve(obj);\n }\n if (c.toBlob) {\n c.toBlob((blob) => {\n bloburl = createObjectURL(blob);\n done();\n }, mimeType, quality);\n return;\n }\n bloburl = dataURLToObjectURL(datauri);\n done();\n });\n};\n/**\n * @external jsPDF\n */\n/**\n * @typedef {void|\"save\"|\"arraybuffer\"|\"blob\"|\"datauristring\"|\"dataurlstring\"|\"dataurlnewwindow\"|\"datauri\"|\"dataurl\"} external:jsPDF.OutputType\n * @todo Newer version to add also allows these `outputType` values \"bloburi\"|\"bloburl\" which return strings, so document here and for `outputType` of `module:svgcanvas.PDFExportedResults` below if added\n*/\n/**\n* @typedef {PlainObject} module:svgcanvas.PDFExportedResults\n* @property {string} svg The SVG PDF output\n* @property {string|ArrayBuffer|Blob|window} output The output based on the `outputType`;\n* if `undefined`, \"datauristring\", \"dataurlstring\", \"datauri\",\n* or \"dataurl\", will be a string (`undefined` gives a document, while the others\n* build as Data URLs; \"datauri\" and \"dataurl\" change the location of the current page); if\n* \"arraybuffer\", will return `ArrayBuffer`; if \"blob\", returns a `Blob`;\n* if \"dataurlnewwindow\", will change the current page's location and return a string\n* if in Safari and no window object is found; otherwise opens in, and returns, a new `window`\n* object; if \"save\", will have the same return as \"dataurlnewwindow\" if\n* `navigator.getUserMedia` support is found without `URL.createObjectURL` support; otherwise\n* returns `undefined` but attempts to save\n* @property {external:jsPDF.OutputType} outputType\n* @property {string[]} issues The human-readable localization messages of corresponding `issueCodes`\n* @property {module:svgcanvas.IssueCode[]} issueCodes\n* @property {string} exportWindowName\n*/\n\n/**\n* Generates a PDF based on the current image, then calls \"exportedPDF\" with\n* an object including the string, the data URL, and any issues found.\n* @function module:svgcanvas.SvgCanvas#exportPDF\n* @param {string} [exportWindowName] Will also be used for the download file name here\n* @param {external:jsPDF.OutputType} [outputType=\"dataurlstring\"]\n* @fires module:svgcanvas.SvgCanvas#event:exportedPDF\n* @returns {Promise} Resolves to {@link module:svgcanvas.PDFExportedResults}\n*/\nthis.exportPDF = async function (\n exportWindowName,\n outputType = isChrome() ? 'save' : undefined\n) {\n if (!window.jsPDF) {\n // Todo: Switch to `import()` when widely supported and available (also allow customization of path)\n await importScript([\n // We do not currently have these paths configurable as they are\n // currently global-only, so not Rolled-up\n 'jspdf/underscore-min.js',\n // 'jspdf/jspdf.min.js',\n '../../svgedit-myfix/editor/jspdf/jspdf-1.0.150.debug.js'\n ]);\n\n const modularVersion = !('svgEditor' in window) ||\n !window.svgEditor ||\n window.svgEditor.modules !== false;\n // Todo: Switch to `import()` when widely supported and available (also allow customization of path)\n await importScript(curConfig.jspdfPath + 'jspdf.plugin.svgToPdf.js', {\n type: modularVersion\n ? 'module'\n : 'text/javascript'\n });\n // await importModule('jspdf/jspdf.plugin.svgToPdf.js');\n }\n\n const res = getResolution();\n const orientation = res.w > res.h ? 'landscape' : 'portrait';\n const unit = 'pt'; // curConfig.baseUnit; // We could use baseUnit, but that is presumably not intended for export purposes\n\n // Todo: Give options to use predefined jsPDF formats like \"a4\", etc. from pull-down (with option to keep customizable)\n const doc = jsPDF({\n orientation,\n unit,\n format: [res.w, res.h]\n // , compressPdf: true\n });\n const docTitle = getDocumentTitle();\n doc.setProperties({\n title: docTitle /* ,\n subject: '',\n author: '',\n keywords: '',\n creator: '' */\n });\n const {issues, issueCodes} = getIssues();\n const svg = this.svgCanvasToString();\n doc.addSVG(svg, 0, 0);\n\n // doc.output('save'); // Works to open in a new\n // window; todo: configure this and other export\n // options to optionally work in this manner as\n // opposed to opening a new tab\n outputType = outputType || 'dataurlstring';\n const obj = {svg, issues, issueCodes, exportWindowName, outputType};\n obj.output = doc.output(outputType, outputType === 'save' ? (exportWindowName || 'svg.pdf') : undefined);\n call('exportedPDF', obj);\n return obj;\n};\n\n/**\n* Returns the current drawing as raw SVG XML text.\n* @function module:svgcanvas.SvgCanvas#getSvgString\n* @returns {string} The current drawing as raw SVG XML text.\n*/\nthis.getSvgString = function () {\n saveOptions.apply = false;\n return this.svgCanvasToString();\n};\n\n/**\n* This function determines whether to use a nonce in the prefix, when\n* generating IDs for future documents in SVG-Edit.\n* If you're controlling SVG-Edit externally, and want randomized IDs, call\n* this BEFORE calling `svgCanvas.setSvgString`.\n* @function module:svgcanvas.SvgCanvas#randomizeIds\n* @param {boolean} [enableRandomization] If true, adds a nonce to the prefix. Thus\n* `svgCanvas.randomizeIds() <==> svgCanvas.randomizeIds(true)`\n* @returns {void}\n*/\nthis.randomizeIds = function (enableRandomization) {\n if (arguments.length > 0 && enableRandomization === false) {\n draw.randomizeIds(false, getCurrentDrawing());\n } else {\n draw.randomizeIds(true, getCurrentDrawing());\n }\n};\n\n/**\n* Ensure each element has a unique ID.\n* @function module:svgcanvas.SvgCanvas#uniquifyElems\n* @param {Element} g - The parent element of the tree to give unique IDs\n* @returns {void}\n*/\nconst uniquifyElems = this.uniquifyElems = function (g) {\n const ids = {};\n // TODO: Handle markers and connectors. These are not yet re-identified properly\n // as their referring elements do not get remapped.\n //\n // \n // \n //\n // Problem #1: if svg_1 gets renamed, we do not update the polyline's se:connector attribute\n // Problem #2: if the polyline svg_7 gets renamed, we do not update the marker id nor the polyline's marker-end attribute\n const refElems = ['filter', 'linearGradient', 'pattern', 'radialGradient', 'symbol', 'textPath', 'use'];\n\n walkTree(g, function (n) {\n // if it's an element node\n if (n.nodeType === 1) {\n // and the element has an ID\n if (n.id) {\n // and we haven't tracked this ID yet\n if (!(n.id in ids)) {\n // add this id to our map\n ids[n.id] = {elem: null, attrs: [], hrefs: []};\n }\n ids[n.id].elem = n;\n }\n\n // now search for all attributes on this element that might refer\n // to other elements\n $.each(refAttrs, function (i, attr) {\n const attrnode = n.getAttributeNode(attr);\n if (attrnode) {\n // the incoming file has been sanitized, so we should be able to safely just strip off the leading #\n const url = getUrlFromAttr(attrnode.value),\n refid = url ? url.substr(1) : null;\n if (refid) {\n if (!(refid in ids)) {\n // add this id to our map\n ids[refid] = {elem: null, attrs: [], hrefs: []};\n }\n ids[refid].attrs.push(attrnode);\n }\n }\n });\n\n // check xlink:href now\n const href = getHref(n);\n // TODO: what if an or element refers to an element internally?\n if (href && refElems.includes(n.nodeName)) {\n const refid = href.substr(1);\n if (refid) {\n if (!(refid in ids)) {\n // add this id to our map\n ids[refid] = {elem: null, attrs: [], hrefs: []};\n }\n ids[refid].hrefs.push(n);\n }\n }\n }\n });\n\n // in ids, we now have a map of ids, elements and attributes, let's re-identify\n for (const oldid in ids) {\n if (!oldid) { continue; }\n const {elem} = ids[oldid];\n if (elem) {\n const newid = getNextId();\n\n // assign element its new id\n elem.id = newid;\n\n // remap all url() attributes\n const {attrs} = ids[oldid];\n let j = attrs.length;\n while (j--) {\n const attr = attrs[j];\n attr.ownerElement.setAttribute(attr.name, 'url(#' + newid + ')');\n }\n\n // remap all href attributes\n const hreffers = ids[oldid].hrefs;\n let k = hreffers.length;\n while (k--) {\n const hreffer = hreffers[k];\n setHref(hreffer, '#' + newid);\n }\n }\n }\n};\n\n/**\n* Assigns reference data for each use element.\n* @function module:svgcanvas.SvgCanvas#setUseData\n* @param {Element} parent\n* @returns {void}\n*/\nconst setUseData = this.setUseData = function (parent) {\n let elems = $(parent);\n\n if (parent.tagName !== 'use') {\n elems = elems.find('use');\n }\n\n elems.each(function () {\n const id = getHref(this).substr(1);\n const refElem = getElem(id);\n if (!refElem) { return; }\n $(this).data('ref', refElem);\n if (refElem.tagName === 'symbol' || refElem.tagName === 'svg') {\n $(this).data('symbol', refElem).data('ref', refElem);\n }\n });\n};\n\n/**\n* Converts gradients from userSpaceOnUse to objectBoundingBox.\n* @function module:svgcanvas.SvgCanvas#convertGradients\n* @param {Element} elem\n* @returns {void}\n*/\nconst convertGradients = this.convertGradients = function (elem) {\n let elems = $(elem).find('linearGradient, radialGradient');\n if (!elems.length && isWebkit()) {\n // Bug in webkit prevents regular *Gradient selector search\n elems = $(elem).find('*').filter(function () {\n return (this.tagName.includes('Gradient'));\n });\n }\n\n elems.each(function () {\n const grad = this; // eslint-disable-line consistent-this\n if ($(grad).attr('gradientUnits') === 'userSpaceOnUse') {\n // TODO: Support more than one element with this ref by duplicating parent grad\n const fillStrokeElems = $(svgcontent).find('[fill=\"url(#' + grad.id + ')\"],[stroke=\"url(#' + grad.id + ')\"]');\n if (!fillStrokeElems.length) { return; }\n\n // get object's bounding box\n const bb = utilsGetBBox(fillStrokeElems[0]);\n\n // This will occur if the element is inside a