From 31bca25b1cc669238f49f29b7033c125741176e9 Mon Sep 17 00:00:00 2001 From: JFH Date: Wed, 5 Aug 2020 19:58:06 +0200 Subject: [PATCH] Starting Branch to simplify Build process --- dist/canvg.js | 4915 --- dist/dom-polyfill.js | 165 - dist/extensions/closepath.png | Bin 0 -> 8036 bytes dist/extensions/closepath_icons.svg | 41 + dist/extensions/ext-arrows.js | 696 +- dist/extensions/ext-closepath.js | 2668 +- dist/extensions/ext-connector.js | 1323 +- dist/extensions/ext-eyedropper.js | 301 +- dist/extensions/ext-foreignobject.js | 621 +- dist/extensions/ext-grid.js | 372 +- dist/extensions/ext-helloworld.js | 278 +- dist/extensions/ext-imagelib.js | 1125 +- dist/extensions/ext-imagelib.xml | 14 + dist/extensions/ext-locale/arrows/en.js | 26 +- dist/extensions/ext-locale/arrows/fr.js | 26 +- dist/extensions/ext-locale/arrows/zh-CN.js | 26 +- dist/extensions/ext-locale/closepath/en.js | 22 +- dist/extensions/ext-locale/closepath/zh-CN.js | 22 +- dist/extensions/ext-locale/connector/en.js | 26 +- dist/extensions/ext-locale/connector/fr.js | 26 +- dist/extensions/ext-locale/connector/zh-CN.js | 26 +- dist/extensions/ext-locale/eyedropper/en.js | 19 +- .../extensions/ext-locale/eyedropper/zh-CN.js | 19 +- .../extensions/ext-locale/foreignobject/en.js | 34 +- .../ext-locale/foreignobject/zh-CN.js | 34 +- dist/extensions/ext-locale/grid/en.js | 19 +- dist/extensions/ext-locale/grid/zh-CN.js | 19 +- dist/extensions/ext-locale/helloworld/en.js | 21 +- .../extensions/ext-locale/helloworld/zh-CN.js | 21 +- dist/extensions/ext-locale/imagelib/de.js | 35 +- dist/extensions/ext-locale/imagelib/en.js | 39 +- dist/extensions/ext-locale/imagelib/fr.js | 35 +- dist/extensions/ext-locale/imagelib/pl.js | 35 +- dist/extensions/ext-locale/imagelib/pt-BR.js | 35 +- dist/extensions/ext-locale/imagelib/ro.js | 35 +- dist/extensions/ext-locale/imagelib/sk.js | 35 +- dist/extensions/ext-locale/imagelib/sl.js | 35 +- dist/extensions/ext-locale/imagelib/zh-CN.js | 35 +- dist/extensions/ext-locale/markers/en.js | 109 +- dist/extensions/ext-locale/markers/zh-CN.js | 109 +- dist/extensions/ext-locale/mathjax/en.js | 19 +- dist/extensions/ext-locale/mathjax/zh-CN.js | 19 +- dist/extensions/ext-locale/panning/en.js | 19 +- dist/extensions/ext-locale/panning/zh-CN.js | 19 +- dist/extensions/ext-locale/placemark/en.js | 102 +- dist/extensions/ext-locale/polygon/en.js | 25 +- dist/extensions/ext-locale/polygon/zh-CN.js | 25 +- .../ext-locale/server_moinsave/en.js | 15 +- .../ext-locale/server_moinsave/zh-CN.js | 15 +- .../ext-locale/server_opensave/en.js | 15 +- .../ext-locale/server_opensave/zh-CN.js | 15 +- dist/extensions/ext-locale/shapes/en.js | 51 +- dist/extensions/ext-locale/shapes/fr.js | 51 +- dist/extensions/ext-locale/shapes/zh-CN.js | 51 +- dist/extensions/ext-locale/star/en.js | 31 +- dist/extensions/ext-locale/star/zh-CN.js | 31 +- dist/extensions/ext-locale/storage/de.js | 31 +- dist/extensions/ext-locale/storage/en.js | 31 +- dist/extensions/ext-locale/storage/fr.js | 31 +- dist/extensions/ext-locale/storage/zh-CN.js | 28 +- dist/extensions/ext-locale/webappfind/en.js | 19 +- .../extensions/ext-locale/webappfind/zh-CN.js | 19 +- dist/extensions/ext-markers.js | 1352 +- dist/extensions/ext-mathjax.js | 625 +- dist/extensions/ext-overview_window.js | 306 +- dist/extensions/ext-panning.js | 167 +- dist/extensions/ext-panning.xml | 6 + dist/extensions/ext-php_savefile.js | 63 +- dist/extensions/ext-placemark.js | 1244 +- dist/extensions/ext-polygon.js | 596 +- dist/extensions/ext-server_moinsave.js | 5046 +-- dist/extensions/ext-server_opensave.js | 5467 +-- dist/extensions/ext-shapes.js | 797 +- dist/extensions/ext-shapes.xml | 10 + dist/extensions/ext-star.js | 498 +- dist/extensions/ext-storage.js | 700 +- dist/extensions/ext-webappfind.js | 273 +- dist/extensions/ext-xdomain-messaging.js | 158 +- dist/extensions/eyedropper-icon.xml | 34 + dist/extensions/eyedropper.png | Bin 0 -> 568 bytes dist/extensions/foreignobject-edit.png | Bin 0 -> 63624 bytes dist/extensions/foreignobject-icons.xml | 96 + dist/extensions/foreignobject-tool.png | Bin 0 -> 2937 bytes dist/extensions/grid-icon.xml | 30 + dist/extensions/grid.png | Bin 0 -> 2797 bytes dist/extensions/helloworld-icon.xml | 21 + dist/extensions/helloworld.png | Bin 0 -> 3048 bytes dist/extensions/imagelib.png | Bin 0 -> 6997 bytes dist/extensions/imagelib/index-es.html | 29 + dist/extensions/imagelib/index.html | 30 + dist/extensions/imagelib/index.js | 131 +- dist/extensions/imagelib/openclipart-es.html | 24 + dist/extensions/imagelib/openclipart.html | 25 + dist/extensions/imagelib/openclipart.js | 3747 +- dist/extensions/imagelib/smiley.svg | 12 + dist/extensions/markers-box.png | Bin 0 -> 9561 bytes dist/extensions/markers-box_o.png | Bin 0 -> 1764 bytes dist/extensions/markers-forwardslash.png | Bin 0 -> 2905 bytes dist/extensions/markers-icons.xml | 115 + dist/extensions/markers-leftarrow.png | Bin 0 -> 4856 bytes dist/extensions/markers-leftarrow_o.png | Bin 0 -> 5939 bytes dist/extensions/markers-mcircle.png | Bin 0 -> 35092 bytes dist/extensions/markers-mcircle_o.png | Bin 0 -> 7078 bytes .../markers-mkr_markers_dimension.png | Bin 0 -> 33259 bytes dist/extensions/markers-mkr_markers_label.png | Bin 0 -> 11682 bytes dist/extensions/markers-mkr_markers_off.png | Bin 0 -> 585 bytes dist/extensions/markers-nomarker.png | Bin 0 -> 625 bytes dist/extensions/markers-reverseslash.png | Bin 0 -> 2792 bytes dist/extensions/markers-rightarrow.png | Bin 0 -> 3957 bytes dist/extensions/markers-rightarrow_o.png | Bin 0 -> 6108 bytes dist/extensions/markers-star.png | Bin 0 -> 6090 bytes dist/extensions/markers-star_o.png | Bin 0 -> 28498 bytes dist/extensions/markers-textmarker.png | Bin 0 -> 137805 bytes dist/extensions/markers-triangle.png | Bin 0 -> 7251 bytes dist/extensions/markers-triangle_o.png | Bin 0 -> 2666 bytes dist/extensions/markers-verticalslash.png | Bin 0 -> 698 bytes dist/extensions/markers-xmark.png | Bin 0 -> 6458 bytes dist/extensions/mathjax-icons.xml | 11 + dist/extensions/mathjax.png | Bin 0 -> 7842 bytes dist/extensions/mathjax/MathJax.min.js | 19 + dist/extensions/mathjax/TeX-AMS-MML_SVG.js | 52 + dist/extensions/openpath.png | Bin 0 -> 7955 bytes dist/extensions/panning.png | Bin 0 -> 6624 bytes dist/extensions/placemark-icons.xml | 138 + dist/extensions/placemark.png | Bin 0 -> 1214 bytes dist/extensions/polygon-icons.svg | 14 + dist/extensions/polygon.png | Bin 0 -> 16482 bytes dist/extensions/shapelib/animal.json | 21 + dist/extensions/shapelib/arrow.json | 28 + dist/extensions/shapelib/dialog_balloon.json | 9 + dist/extensions/shapelib/electronics.json | 20 + dist/extensions/shapelib/flowchart.json | 25 + dist/extensions/shapelib/game.json | 13 + .../shapelib/license-MIT-raphael.txt | 12 + dist/extensions/shapelib/math.json | 9 + dist/extensions/shapelib/misc.json | 37 + dist/extensions/shapelib/music.json | 21 + dist/extensions/shapelib/object.json | 18 + dist/extensions/shapelib/raphael_1.json | 65 + dist/extensions/shapelib/raphael_2.json | 64 + dist/extensions/shapelib/symbol.json | 28 + dist/extensions/shapes.png | Bin 0 -> 8376 bytes dist/extensions/star-icons.svg | 14 + dist/extensions/star.png | Bin 0 -> 14036 bytes dist/extensions/webappfind-icon.svg | 23 + dist/extensions/webappfind.png | Bin 0 -> 97580 bytes dist/images/README.txt | 60 + dist/images/add_subpath.png | Bin 0 -> 35830 bytes dist/images/align-bottom.png | Bin 0 -> 161 bytes dist/images/align-bottom.svg | 277 + dist/images/align-center.png | Bin 0 -> 221 bytes dist/images/align-center.svg | 252 + dist/images/align-left.png | Bin 0 -> 175 bytes dist/images/align-left.svg | 235 + dist/images/align-middle.png | Bin 0 -> 194 bytes dist/images/align-middle.svg | 250 + dist/images/align-right.png | Bin 0 -> 173 bytes dist/images/align-right.svg | 233 + dist/images/align-top.png | Bin 0 -> 165 bytes dist/images/align-top.svg | 233 + dist/images/align.png | Bin 0 -> 149 bytes dist/images/angle.png | Bin 0 -> 487 bytes dist/images/arrow_right.png | Bin 0 -> 2133 bytes dist/images/arrow_right_big.png | Bin 0 -> 2138 bytes dist/images/blur.png | Bin 0 -> 8270 bytes dist/images/bold.png | Bin 0 -> 195 bytes dist/images/c_radius.png | Bin 0 -> 308 bytes dist/images/cancel.png | Bin 0 -> 1143 bytes dist/images/circle.png | Bin 0 -> 907 bytes dist/images/clear.png | Bin 0 -> 610 bytes dist/images/clone.png | Bin 0 -> 597 bytes dist/images/closepath.png | Bin 0 -> 8036 bytes dist/images/config.png | Bin 0 -> 549 bytes dist/images/config.svg | 1 + dist/images/conn.svg | 29 + dist/images/context_menu.png | Bin 0 -> 506 bytes dist/images/copy.png | Bin 0 -> 637 bytes dist/images/cut.png | Bin 0 -> 893 bytes dist/images/delete.png | Bin 0 -> 390 bytes dist/images/document-properties.png | Bin 0 -> 514 bytes dist/images/dropdown.gif | Bin 0 -> 49 bytes dist/images/ellipse.png | Bin 0 -> 733 bytes dist/images/export.png | Bin 0 -> 771 bytes dist/images/eye.png | Bin 0 -> 665 bytes dist/images/fhpath.png | Bin 0 -> 1082 bytes dist/images/fill.png | Bin 0 -> 644 bytes dist/images/flyouth.png | Bin 0 -> 99 bytes dist/images/flyup.gif | Bin 0 -> 48 bytes dist/images/fontsize.png | Bin 0 -> 474 bytes dist/images/freehand-circle.png | Bin 0 -> 1203 bytes dist/images/freehand-square.png | Bin 0 -> 1021 bytes dist/images/freehand-square.svg | 16 + dist/images/globe_link.png | Bin 0 -> 5630 bytes dist/images/go-down.png | Bin 0 -> 551 bytes dist/images/go-up.png | Bin 0 -> 559 bytes dist/images/group_elements.png | Bin 0 -> 398 bytes dist/images/height.png | Bin 0 -> 247 bytes dist/images/image.png | Bin 0 -> 799 bytes dist/images/import.png | Bin 0 -> 727 bytes dist/images/italic.png | Bin 0 -> 157 bytes dist/images/line.png | Bin 0 -> 898 bytes dist/images/linecap_butt.png | Bin 0 -> 1968 bytes dist/images/linecap_round.png | Bin 0 -> 2828 bytes dist/images/linecap_square.png | Bin 0 -> 1984 bytes dist/images/linejoin_bevel.png | Bin 0 -> 2438 bytes dist/images/linejoin_miter.png | Bin 0 -> 2367 bytes dist/images/linejoin_round.png | Bin 0 -> 2437 bytes dist/images/link_controls.png | Bin 0 -> 542 bytes dist/images/logo.png | Bin 0 -> 3281 bytes dist/images/logo.svg | 32 + dist/images/move_bottom.png | Bin 0 -> 664 bytes dist/images/move_top.png | Bin 0 -> 530 bytes dist/images/no_color.png | Bin 0 -> 156 bytes dist/images/node_clone.png | Bin 0 -> 526 bytes dist/images/node_delete.png | Bin 0 -> 557 bytes dist/images/none.png | Bin 0 -> 120 bytes dist/images/opacity.png | Bin 0 -> 511 bytes dist/images/open.png | Bin 0 -> 795 bytes dist/images/openpath.png | Bin 0 -> 7955 bytes dist/images/paste.png | Bin 0 -> 698 bytes dist/images/path.png | Bin 0 -> 788 bytes dist/images/polygon.png | Bin 0 -> 922 bytes dist/images/polygon.svg | 76 + dist/images/rect.png | Bin 0 -> 379 bytes dist/images/redo.png | Bin 0 -> 656 bytes dist/images/reorient.png | Bin 0 -> 646 bytes dist/images/rotate.png | Bin 0 -> 694 bytes dist/images/save.png | Bin 0 -> 825 bytes dist/images/select.png | Bin 0 -> 389 bytes dist/images/select_node.png | Bin 0 -> 731 bytes dist/images/sep.png | Bin 0 -> 71 bytes dist/images/shape_group_elements.png | Bin 0 -> 476 bytes dist/images/shape_ungroup.png | Bin 0 -> 575 bytes dist/images/source.png | Bin 0 -> 893 bytes dist/images/spinbtn_updn_big.png | Bin 0 -> 1240 bytes dist/images/square.png | Bin 0 -> 328 bytes dist/images/stroke.png | Bin 0 -> 174 bytes dist/images/svg_edit_icons.svg | 1035 + dist/images/svg_edit_icons.svgz | Bin 0 -> 5493 bytes dist/images/text.png | Bin 0 -> 600 bytes dist/images/text.svg | 157 + dist/images/to_path.png | Bin 0 -> 938 bytes dist/images/undo.png | Bin 0 -> 837 bytes dist/images/unlink_use.png | Bin 0 -> 3895 bytes dist/images/view-refresh.png | Bin 0 -> 727 bytes dist/images/warning.png | Bin 0 -> 758 bytes dist/images/width.png | Bin 0 -> 278 bytes dist/images/wireframe.png | Bin 0 -> 268 bytes dist/images/zoom.png | Bin 0 -> 1032 bytes dist/index-es.min.js | 142 - dist/index-es.min.js.map | 1 - dist/index-umd.js | 36622 --------------- dist/index-umd.min.js | 142 - dist/index-umd.min.js.map | 1 - .../index.html | 7 +- dist/{index-es.js => index.js} | 203 +- dist/jquery-ui-1.8.17.custom.min.js | 54 + dist/jquery.min.js | 4 + dist/jspdf.plugin.svgToPdf.js | 986 - dist/locale/README.txt | 18 + dist/locale/lang.af.js | 443 +- dist/locale/lang.ar.js | 443 +- dist/locale/lang.az.js | 443 +- dist/locale/lang.be.js | 443 +- dist/locale/lang.bg.js | 443 +- dist/locale/lang.ca.js | 443 +- dist/locale/lang.cs.js | 443 +- dist/locale/lang.cy.js | 443 +- dist/locale/lang.da.js | 443 +- dist/locale/lang.de.js | 443 +- dist/locale/lang.el.js | 443 +- dist/locale/lang.en.js | 443 +- dist/locale/lang.es.js | 443 +- dist/locale/lang.et.js | 443 +- dist/locale/lang.fa.js | 443 +- dist/locale/lang.fi.js | 443 +- dist/locale/lang.fr.js | 443 +- dist/locale/lang.fy.js | 443 +- dist/locale/lang.ga.js | 443 +- dist/locale/lang.gl.js | 443 +- dist/locale/lang.he.js | 443 +- dist/locale/lang.hi.js | 443 +- dist/locale/lang.hr.js | 443 +- dist/locale/lang.hu.js | 443 +- dist/locale/lang.hy.js | 443 +- dist/locale/lang.id.js | 443 +- dist/locale/lang.is.js | 443 +- dist/locale/lang.it.js | 443 +- dist/locale/lang.ja.js | 443 +- dist/locale/lang.ko.js | 443 +- dist/locale/lang.lt.js | 443 +- dist/locale/lang.lv.js | 443 +- dist/locale/lang.mk.js | 443 +- dist/locale/lang.ms.js | 443 +- dist/locale/lang.mt.js | 443 +- dist/locale/lang.nl.js | 443 +- dist/locale/lang.no.js | 443 +- dist/locale/lang.pl.js | 445 +- dist/locale/lang.pt-BR.js | 441 +- dist/locale/lang.pt-PT.js | 443 +- dist/locale/lang.ro.js | 441 +- dist/locale/lang.ru.js | 443 +- dist/locale/lang.sk.js | 443 +- dist/locale/lang.sl.js | 441 +- dist/locale/lang.sq.js | 443 +- dist/locale/lang.sr.js | 443 +- dist/locale/lang.sv.js | 443 +- dist/locale/lang.sw.js | 443 +- dist/locale/lang.test.js | 443 +- dist/locale/lang.th.js | 443 +- dist/locale/lang.tl.js | 443 +- dist/locale/lang.tr.js | 443 +- dist/locale/lang.uk.js | 443 +- dist/locale/lang.vi.js | 443 +- dist/locale/lang.yi.js | 443 +- dist/locale/lang.zh-CN.js | 443 +- dist/locale/lang.zh-HK.js | 443 +- dist/locale/lang.zh-TW.js | 443 +- dist/locale/locale.js | 398 + dist/redirect-on-lacking-support.js | 2612 -- dist/runtime.js | 748 + dist/svgcanvas-iife.js | 21682 --------- dist/svgcanvas-iife.min.js | 19 - dist/svgcanvas-iife.min.js.map | 1 - package-lock.json | 156 + package.json | 4 + rollup.config.js | 269 +- src/.DS_Store | Bin 0 -> 6148 bytes src/editor/.DS_Store | Bin 0 -> 8196 bytes src/editor/{svg-editor-es.html => index.html} | 3 +- src/{svgedit-config-es.js => editor/index.js} | 32 +- src/editor/jgraduate/.DS_Store | Bin 0 -> 6148 bytes src/editor/jgraduate/jQuery.jGraduate.js | 8 - src/editor/jgraduate/jQuery.jPicker.js | 14 +- src/editor/spinbtn/jQuery.SpinButton.js | 9 +- src/editor/svg-editor.html | 783 - src/editor/svg-editor.manifest | 156 - src/editor/{svg-editor.css => svgedit.css} | 0 src/editor/{svg-editor.js => svgedit.js} | 189 +- src/editor/xdomain-svg-editor.html | 783 - src/external/.DS_Store | Bin 0 -> 6148 bytes src/svgedit-config-iife.js | 36763 ---------------- src/xdomain-svgedit-config-es.js | 6 - src/xdomain-svgedit-config-iife.js | 36625 --------------- 344 files changed, 24742 insertions(+), 179621 deletions(-) delete mode 100644 dist/canvg.js delete mode 100644 dist/dom-polyfill.js create mode 100644 dist/extensions/closepath.png create mode 100644 dist/extensions/closepath_icons.svg create mode 100644 dist/extensions/ext-imagelib.xml mode change 100644 => 100755 dist/extensions/ext-locale/arrows/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/closepath/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/connector/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/eyedropper/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/foreignobject/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/grid/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/helloworld/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/markers/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/mathjax/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/panning/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/polygon/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/server_moinsave/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/server_opensave/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/shapes/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/star/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/storage/zh-CN.js mode change 100644 => 100755 dist/extensions/ext-locale/webappfind/zh-CN.js create mode 100644 dist/extensions/ext-panning.xml create mode 100644 dist/extensions/ext-shapes.xml create mode 100644 dist/extensions/eyedropper-icon.xml create mode 100644 dist/extensions/eyedropper.png create mode 100644 dist/extensions/foreignobject-edit.png create mode 100644 dist/extensions/foreignobject-icons.xml create mode 100644 dist/extensions/foreignobject-tool.png create mode 100644 dist/extensions/grid-icon.xml create mode 100644 dist/extensions/grid.png create mode 100644 dist/extensions/helloworld-icon.xml create mode 100644 dist/extensions/helloworld.png create mode 100644 dist/extensions/imagelib.png create mode 100644 dist/extensions/imagelib/index-es.html create mode 100644 dist/extensions/imagelib/index.html create mode 100644 dist/extensions/imagelib/openclipart-es.html create mode 100644 dist/extensions/imagelib/openclipart.html create mode 100644 dist/extensions/imagelib/smiley.svg create mode 100644 dist/extensions/markers-box.png create mode 100644 dist/extensions/markers-box_o.png create mode 100644 dist/extensions/markers-forwardslash.png create mode 100644 dist/extensions/markers-icons.xml create mode 100644 dist/extensions/markers-leftarrow.png create mode 100644 dist/extensions/markers-leftarrow_o.png create mode 100644 dist/extensions/markers-mcircle.png create mode 100644 dist/extensions/markers-mcircle_o.png create mode 100644 dist/extensions/markers-mkr_markers_dimension.png create mode 100644 dist/extensions/markers-mkr_markers_label.png create mode 100644 dist/extensions/markers-mkr_markers_off.png create mode 100644 dist/extensions/markers-nomarker.png create mode 100644 dist/extensions/markers-reverseslash.png create mode 100644 dist/extensions/markers-rightarrow.png create mode 100644 dist/extensions/markers-rightarrow_o.png create mode 100644 dist/extensions/markers-star.png create mode 100644 dist/extensions/markers-star_o.png create mode 100644 dist/extensions/markers-textmarker.png create mode 100644 dist/extensions/markers-triangle.png create mode 100644 dist/extensions/markers-triangle_o.png create mode 100644 dist/extensions/markers-verticalslash.png create mode 100644 dist/extensions/markers-xmark.png create mode 100644 dist/extensions/mathjax-icons.xml create mode 100644 dist/extensions/mathjax.png create mode 100644 dist/extensions/mathjax/MathJax.min.js create mode 100644 dist/extensions/mathjax/TeX-AMS-MML_SVG.js create mode 100644 dist/extensions/openpath.png create mode 100644 dist/extensions/panning.png create mode 100644 dist/extensions/placemark-icons.xml create mode 100644 dist/extensions/placemark.png create mode 100644 dist/extensions/polygon-icons.svg create mode 100644 dist/extensions/polygon.png create mode 100644 dist/extensions/shapelib/animal.json create mode 100644 dist/extensions/shapelib/arrow.json create mode 100644 dist/extensions/shapelib/dialog_balloon.json create mode 100644 dist/extensions/shapelib/electronics.json create mode 100644 dist/extensions/shapelib/flowchart.json create mode 100644 dist/extensions/shapelib/game.json create mode 100644 dist/extensions/shapelib/license-MIT-raphael.txt create mode 100644 dist/extensions/shapelib/math.json create mode 100644 dist/extensions/shapelib/misc.json create mode 100644 dist/extensions/shapelib/music.json create mode 100644 dist/extensions/shapelib/object.json create mode 100644 dist/extensions/shapelib/raphael_1.json create mode 100644 dist/extensions/shapelib/raphael_2.json create mode 100644 dist/extensions/shapelib/symbol.json create mode 100644 dist/extensions/shapes.png create mode 100644 dist/extensions/star-icons.svg create mode 100644 dist/extensions/star.png create mode 100644 dist/extensions/webappfind-icon.svg create mode 100644 dist/extensions/webappfind.png create mode 100644 dist/images/README.txt create mode 100644 dist/images/add_subpath.png create mode 100644 dist/images/align-bottom.png create mode 100644 dist/images/align-bottom.svg create mode 100644 dist/images/align-center.png create mode 100644 dist/images/align-center.svg create mode 100644 dist/images/align-left.png create mode 100644 dist/images/align-left.svg create mode 100644 dist/images/align-middle.png create mode 100644 dist/images/align-middle.svg create mode 100644 dist/images/align-right.png create mode 100644 dist/images/align-right.svg create mode 100644 dist/images/align-top.png create mode 100644 dist/images/align-top.svg create mode 100644 dist/images/align.png create mode 100644 dist/images/angle.png create mode 100644 dist/images/arrow_right.png create mode 100644 dist/images/arrow_right_big.png create mode 100644 dist/images/blur.png create mode 100644 dist/images/bold.png create mode 100644 dist/images/c_radius.png create mode 100644 dist/images/cancel.png create mode 100644 dist/images/circle.png create mode 100644 dist/images/clear.png create mode 100644 dist/images/clone.png create mode 100644 dist/images/closepath.png create mode 100644 dist/images/config.png create mode 100644 dist/images/config.svg create mode 100644 dist/images/conn.svg create mode 100644 dist/images/context_menu.png create mode 100644 dist/images/copy.png create mode 100644 dist/images/cut.png create mode 100644 dist/images/delete.png create mode 100644 dist/images/document-properties.png create mode 100644 dist/images/dropdown.gif create mode 100644 dist/images/ellipse.png create mode 100644 dist/images/export.png create mode 100644 dist/images/eye.png create mode 100644 dist/images/fhpath.png create mode 100644 dist/images/fill.png create mode 100644 dist/images/flyouth.png create mode 100644 dist/images/flyup.gif create mode 100644 dist/images/fontsize.png create mode 100644 dist/images/freehand-circle.png create mode 100644 dist/images/freehand-square.png create mode 100644 dist/images/freehand-square.svg create mode 100644 dist/images/globe_link.png create mode 100644 dist/images/go-down.png create mode 100644 dist/images/go-up.png create mode 100644 dist/images/group_elements.png create mode 100644 dist/images/height.png create mode 100644 dist/images/image.png create mode 100644 dist/images/import.png create mode 100644 dist/images/italic.png create mode 100644 dist/images/line.png create mode 100644 dist/images/linecap_butt.png create mode 100644 dist/images/linecap_round.png create mode 100644 dist/images/linecap_square.png create mode 100644 dist/images/linejoin_bevel.png create mode 100644 dist/images/linejoin_miter.png create mode 100644 dist/images/linejoin_round.png create mode 100644 dist/images/link_controls.png create mode 100644 dist/images/logo.png create mode 100644 dist/images/logo.svg create mode 100644 dist/images/move_bottom.png create mode 100644 dist/images/move_top.png create mode 100644 dist/images/no_color.png create mode 100755 dist/images/node_clone.png create mode 100755 dist/images/node_delete.png create mode 100644 dist/images/none.png create mode 100644 dist/images/opacity.png create mode 100644 dist/images/open.png create mode 100644 dist/images/openpath.png create mode 100644 dist/images/paste.png create mode 100644 dist/images/path.png create mode 100644 dist/images/polygon.png create mode 100644 dist/images/polygon.svg create mode 100644 dist/images/rect.png create mode 100644 dist/images/redo.png create mode 100644 dist/images/reorient.png create mode 100644 dist/images/rotate.png create mode 100644 dist/images/save.png create mode 100644 dist/images/select.png create mode 100644 dist/images/select_node.png create mode 100644 dist/images/sep.png create mode 100644 dist/images/shape_group_elements.png create mode 100644 dist/images/shape_ungroup.png create mode 100644 dist/images/source.png create mode 100644 dist/images/spinbtn_updn_big.png create mode 100644 dist/images/square.png create mode 100644 dist/images/stroke.png create mode 100644 dist/images/svg_edit_icons.svg create mode 100644 dist/images/svg_edit_icons.svgz create mode 100644 dist/images/text.png create mode 100644 dist/images/text.svg create mode 100644 dist/images/to_path.png create mode 100644 dist/images/undo.png create mode 100644 dist/images/unlink_use.png create mode 100644 dist/images/view-refresh.png create mode 100644 dist/images/warning.png create mode 100644 dist/images/width.png create mode 100644 dist/images/wireframe.png create mode 100644 dist/images/zoom.png delete mode 100644 dist/index-es.min.js delete mode 100644 dist/index-es.min.js.map delete mode 100644 dist/index-umd.js delete mode 100644 dist/index-umd.min.js delete mode 100644 dist/index-umd.min.js.map rename src/editor/xdomain-svg-editor-es.html => dist/index.html (99%) rename dist/{index-es.js => index.js} (99%) create mode 100644 dist/jquery-ui-1.8.17.custom.min.js create mode 100644 dist/jquery.min.js delete mode 100644 dist/jspdf.plugin.svgToPdf.js create mode 100644 dist/locale/README.txt mode change 100644 => 100755 dist/locale/lang.he.js create mode 100644 dist/locale/locale.js delete mode 100644 dist/redirect-on-lacking-support.js create mode 100644 dist/runtime.js delete mode 100644 dist/svgcanvas-iife.js delete mode 100644 dist/svgcanvas-iife.min.js delete mode 100644 dist/svgcanvas-iife.min.js.map create mode 100644 src/.DS_Store create mode 100644 src/editor/.DS_Store rename src/editor/{svg-editor-es.html => index.html} (99%) rename src/{svgedit-config-es.js => editor/index.js} (88%) create mode 100644 src/editor/jgraduate/.DS_Store delete mode 100644 src/editor/svg-editor.html delete mode 100644 src/editor/svg-editor.manifest rename src/editor/{svg-editor.css => svgedit.css} (100%) rename src/editor/{svg-editor.js => svgedit.js} (96%) delete mode 100644 src/editor/xdomain-svg-editor.html create mode 100644 src/external/.DS_Store delete mode 100644 src/svgedit-config-iife.js delete mode 100644 src/xdomain-svgedit-config-es.js delete mode 100644 src/xdomain-svgedit-config-iife.js diff --git a/dist/canvg.js b/dist/canvg.js deleted file mode 100644 index 23c96b60..00000000 --- a/dist/canvg.js +++ /dev/null @@ -1,4915 +0,0 @@ -var canvg = (function (exports) { - 'use strict'; - - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } - } - - function _construct(Parent, args, Class) { - if (_isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; - } - - function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } - - return object; - } - - function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); - - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); - - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - - return _get(target, property, receiver || target); - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * For parsing color values. - * @module RGBColor - * @author Stoyan Stefanov - * @see https://www.phpied.com/rgb-color-parser-in-javascript/ - * @license MIT - */ - var simpleColors = { - aliceblue: 'f0f8ff', - antiquewhite: 'faebd7', - aqua: '00ffff', - aquamarine: '7fffd4', - azure: 'f0ffff', - beige: 'f5f5dc', - bisque: 'ffe4c4', - black: '000000', - blanchedalmond: 'ffebcd', - blue: '0000ff', - blueviolet: '8a2be2', - brown: 'a52a2a', - burlywood: 'deb887', - cadetblue: '5f9ea0', - chartreuse: '7fff00', - chocolate: 'd2691e', - coral: 'ff7f50', - cornflowerblue: '6495ed', - cornsilk: 'fff8dc', - crimson: 'dc143c', - cyan: '00ffff', - darkblue: '00008b', - darkcyan: '008b8b', - darkgoldenrod: 'b8860b', - darkgray: 'a9a9a9', - darkgreen: '006400', - darkkhaki: 'bdb76b', - darkmagenta: '8b008b', - darkolivegreen: '556b2f', - darkorange: 'ff8c00', - darkorchid: '9932cc', - darkred: '8b0000', - darksalmon: 'e9967a', - darkseagreen: '8fbc8f', - darkslateblue: '483d8b', - darkslategray: '2f4f4f', - darkturquoise: '00ced1', - darkviolet: '9400d3', - deeppink: 'ff1493', - deepskyblue: '00bfff', - dimgray: '696969', - dodgerblue: '1e90ff', - feldspar: 'd19275', - firebrick: 'b22222', - floralwhite: 'fffaf0', - forestgreen: '228b22', - fuchsia: 'ff00ff', - gainsboro: 'dcdcdc', - ghostwhite: 'f8f8ff', - gold: 'ffd700', - goldenrod: 'daa520', - gray: '808080', - green: '008000', - greenyellow: 'adff2f', - honeydew: 'f0fff0', - hotpink: 'ff69b4', - indianred: 'cd5c5c', - indigo: '4b0082', - ivory: 'fffff0', - khaki: 'f0e68c', - lavender: 'e6e6fa', - lavenderblush: 'fff0f5', - lawngreen: '7cfc00', - lemonchiffon: 'fffacd', - lightblue: 'add8e6', - lightcoral: 'f08080', - lightcyan: 'e0ffff', - lightgoldenrodyellow: 'fafad2', - lightgrey: 'd3d3d3', - lightgreen: '90ee90', - lightpink: 'ffb6c1', - lightsalmon: 'ffa07a', - lightseagreen: '20b2aa', - lightskyblue: '87cefa', - lightslateblue: '8470ff', - lightslategray: '778899', - lightsteelblue: 'b0c4de', - lightyellow: 'ffffe0', - lime: '00ff00', - limegreen: '32cd32', - linen: 'faf0e6', - magenta: 'ff00ff', - maroon: '800000', - mediumaquamarine: '66cdaa', - mediumblue: '0000cd', - mediumorchid: 'ba55d3', - mediumpurple: '9370d8', - mediumseagreen: '3cb371', - mediumslateblue: '7b68ee', - mediumspringgreen: '00fa9a', - mediumturquoise: '48d1cc', - mediumvioletred: 'c71585', - midnightblue: '191970', - mintcream: 'f5fffa', - mistyrose: 'ffe4e1', - moccasin: 'ffe4b5', - navajowhite: 'ffdead', - navy: '000080', - oldlace: 'fdf5e6', - olive: '808000', - olivedrab: '6b8e23', - orange: 'ffa500', - orangered: 'ff4500', - orchid: 'da70d6', - palegoldenrod: 'eee8aa', - palegreen: '98fb98', - paleturquoise: 'afeeee', - palevioletred: 'd87093', - papayawhip: 'ffefd5', - peachpuff: 'ffdab9', - peru: 'cd853f', - pink: 'ffc0cb', - plum: 'dda0dd', - powderblue: 'b0e0e6', - purple: '800080', - red: 'ff0000', - rosybrown: 'bc8f8f', - royalblue: '4169e1', - saddlebrown: '8b4513', - salmon: 'fa8072', - sandybrown: 'f4a460', - seagreen: '2e8b57', - seashell: 'fff5ee', - sienna: 'a0522d', - silver: 'c0c0c0', - skyblue: '87ceeb', - slateblue: '6a5acd', - slategray: '708090', - snow: 'fffafa', - springgreen: '00ff7f', - steelblue: '4682b4', - tan: 'd2b48c', - teal: '008080', - thistle: 'd8bfd8', - tomato: 'ff6347', - turquoise: '40e0d0', - violet: 'ee82ee', - violetred: 'd02090', - wheat: 'f5deb3', - white: 'ffffff', - whitesmoke: 'f5f5f5', - yellow: 'ffff00', - yellowgreen: '9acd32' - }; // array of color definition objects - - var colorDefs = [{ - re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, - // re: /^rgb\((?\d{1,3}),\s*(?\d{1,3}),\s*(?\d{1,3})\)$/, - example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], - process: function process(_) { - for (var _len = arguments.length, bits = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bits[_key - 1] = arguments[_key]; - } - - return bits.map(function (b) { - return Number.parseInt(b); - }); - } - }, { - re: /^(\w{2})(\w{2})(\w{2})$/, - // re: /^(?\w{2})(?\w{2})(?\w{2})$/, - example: ['#00ff00', '336699'], - process: function process(_) { - for (var _len2 = arguments.length, bits = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - bits[_key2 - 1] = arguments[_key2]; - } - - return bits.map(function (b) { - return Number.parseInt(b, 16); - }); - } - }, { - re: /^(\w)(\w)(\w)$/, - // re: /^(?\w{1})(?\w{1})(?\w{1})$/, - example: ['#fb0', 'f0f'], - process: function process(_) { - for (var _len3 = arguments.length, bits = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - bits[_key3 - 1] = arguments[_key3]; - } - - return bits.map(function (b) { - return Number.parseInt(b + b, 16); - }); - } - }]; - /** - * A class to parse color values. - */ - - var RGBColor = /*#__PURE__*/function () { - /** - * @param {string} colorString - */ - function RGBColor(colorString) { - var _this = this; - - _classCallCheck(this, RGBColor); - - this.ok = false; // strip any leading # - - if (colorString.charAt(0) === '#') { - // remove # if any - colorString = colorString.substr(1, 6); - } - - colorString = colorString.replace(/ /g, ''); - colorString = colorString.toLowerCase(); // before getting into regexps, try simple matches - // and overwrite the input - - if (colorString in simpleColors) { - colorString = simpleColors[colorString]; - } // end of simple type-in colors - // search through the definitions to find a match - - - colorDefs.forEach(function (_ref) { - var re = _ref.re, - processor = _ref.process; - var bits = re.exec(colorString); - - if (bits) { - var _processor = processor.apply(void 0, _toConsumableArray(bits)), - _processor2 = _slicedToArray(_processor, 3), - r = _processor2[0], - g = _processor2[1], - b = _processor2[2]; - - Object.assign(_this, { - r: r, - g: g, - b: b - }); - _this.ok = true; - } - }); // validate/cleanup values - - this.r = this.r < 0 || isNaN(this.r) ? 0 : this.r > 255 ? 255 : this.r; - this.g = this.g < 0 || isNaN(this.g) ? 0 : this.g > 255 ? 255 : this.g; - this.b = this.b < 0 || isNaN(this.b) ? 0 : this.b > 255 ? 255 : this.b; - } // some getters - - /** - * @returns {string} - */ - - - _createClass(RGBColor, [{ - key: "toRGB", - value: function toRGB() { - return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; - } - /** - * @returns {string} - */ - - }, { - key: "toHex", - value: function toHex() { - var r = this.r.toString(16); - var g = this.g.toString(16); - var b = this.b.toString(16); - - if (r.length === 1) { - r = '0' + r; - } - - if (g.length === 1) { - g = '0' + g; - } - - if (b.length === 1) { - b = '0' + b; - } - - return '#' + r + g + b; - } - /** - * Offers a bulleted list of help. - * @returns {HTMLUListElement} - */ - - }], [{ - key: "getHelpXML", - value: function getHelpXML() { - var examples = [].concat(_toConsumableArray(colorDefs.flatMap(function (_ref2) { - var example = _ref2.example; - return example; - })), _toConsumableArray(Object.keys(simpleColors))); - var xml = document.createElement('ul'); - xml.setAttribute('id', 'rgbcolor-examples'); - xml.append.apply(xml, _toConsumableArray(examples.map(function (example) { - try { - var listItem = document.createElement('li'); - var listColor = new RGBColor(example); - var exampleDiv = document.createElement('div'); - exampleDiv.style.cssText = "\n margin: 3px;\n border: 1px solid black;\n background: ".concat(listColor.toHex(), ";\n color: ").concat(listColor.toHex(), ";"); - exampleDiv.append('test'); - var listItemValue = " ".concat(example, " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); - listItem.append(exampleDiv, listItemValue); - return listItem; - } catch (e) { - return ''; - } - }))); - return xml; - } - }]); - - return RGBColor; - }(); - - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function _typeof(obj) { - return typeof obj; - }; - } else { - _typeof = function _typeof(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - function _classCallCheck$1(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - /* eslint-disable no-bitwise, unicorn/prefer-query-selector */ - - /** - * StackBlur - a fast almost Gaussian Blur For Canvas - * - * In case you find this class useful - especially in commercial projects - - * I am not totally unhappy for a small donation to my PayPal account - * mario@quasimondo.de - * - * Or support me on flattr: - * {@link https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript}. - * - * @module StackBlur - * @author Mario Klingemann - * Contact: mario@quasimondo.com - * Website: {@link http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html} - * Twitter: @quasimondo - * - * @copyright (c) 2010 Mario Klingemann - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - /* eslint-disable max-len */ - - - var mulTable = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; - var shgTable = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; - /** - * @param {string|HTMLCanvasElement} canvas - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @throws {Error|TypeError} - * @returns {ImageData} See {@link https://html.spec.whatwg.org/multipage/canvas.html#imagedata} - */ - - - function getImageDataFromCanvas(canvas, topX, topY, width, height) { - if (typeof canvas === 'string') { - canvas = document.getElementById(canvas); - } - - if (!canvas || _typeof(canvas) !== 'object' || !('getContext' in canvas)) { - throw new TypeError('Expecting canvas with `getContext` method ' + 'in processCanvasRGB(A) calls!'); - } - - var context = canvas.getContext('2d'); - - try { - return context.getImageData(topX, topY, width, height); - } catch (e) { - throw new Error('unable to access image data: ' + e); - } - } - /** - * @param {HTMLCanvasElement} canvas - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @param {Float} radius - * @returns {undefined} - */ - - - function processCanvasRGBA(canvas, topX, topY, width, height, radius) { - if (isNaN(radius) || radius < 1) { - return; - } - - radius |= 0; - var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height); - imageData = processImageDataRGBA(imageData, topX, topY, width, height, radius); - canvas.getContext('2d').putImageData(imageData, topX, topY); - } - /** - * @param {ImageData} imageData - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @param {Float} radius - * @returns {ImageData} - */ - - - function processImageDataRGBA(imageData, topX, topY, width, height, radius) { - var pixels = imageData.data; - var x, y, i, p, yp, yi, yw, rSum, gSum, bSum, aSum, rOutSum, gOutSum, bOutSum, aOutSum, rInSum, gInSum, bInSum, aInSum, pr, pg, pb, pa, rbs; - var div = 2 * radius + 1; // const w4 = width << 2; - - var widthMinus1 = width - 1; - var heightMinus1 = height - 1; - var radiusPlus1 = radius + 1; - var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; - var stackStart = new BlurStack(); - var stack = stackStart; - var stackEnd; - - for (i = 1; i < div; i++) { - stack = stack.next = new BlurStack(); - - if (i === radiusPlus1) { - stackEnd = stack; - } - } - - stack.next = stackStart; - var stackIn = null; - var stackOut = null; - yw = yi = 0; - var mulSum = mulTable[radius]; - var shgSum = shgTable[radius]; - - for (y = 0; y < height; y++) { - rInSum = gInSum = bInSum = aInSum = rSum = gSum = bSum = aSum = 0; - rOutSum = radiusPlus1 * (pr = pixels[yi]); - gOutSum = radiusPlus1 * (pg = pixels[yi + 1]); - bOutSum = radiusPlus1 * (pb = pixels[yi + 2]); - aOutSum = radiusPlus1 * (pa = pixels[yi + 3]); - rSum += sumFactor * pr; - gSum += sumFactor * pg; - bSum += sumFactor * pb; - aSum += sumFactor * pa; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack.a = pa; - stack = stack.next; - } - - for (i = 1; i < radiusPlus1; i++) { - p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); - rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i); - gSum += (stack.g = pg = pixels[p + 1]) * rbs; - bSum += (stack.b = pb = pixels[p + 2]) * rbs; - aSum += (stack.a = pa = pixels[p + 3]) * rbs; - rInSum += pr; - gInSum += pg; - bInSum += pb; - aInSum += pa; - stack = stack.next; - } - - stackIn = stackStart; - stackOut = stackEnd; - - for (x = 0; x < width; x++) { - pixels[yi + 3] = pa = aSum * mulSum >> shgSum; - - if (pa !== 0) { - pa = 255 / pa; - pixels[yi] = (rSum * mulSum >> shgSum) * pa; - pixels[yi + 1] = (gSum * mulSum >> shgSum) * pa; - pixels[yi + 2] = (bSum * mulSum >> shgSum) * pa; - } else { - pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0; - } - - rSum -= rOutSum; - gSum -= gOutSum; - bSum -= bOutSum; - aSum -= aOutSum; - rOutSum -= stackIn.r; - gOutSum -= stackIn.g; - bOutSum -= stackIn.b; - aOutSum -= stackIn.a; - p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2; - rInSum += stackIn.r = pixels[p]; - gInSum += stackIn.g = pixels[p + 1]; - bInSum += stackIn.b = pixels[p + 2]; - aInSum += stackIn.a = pixels[p + 3]; - rSum += rInSum; - gSum += gInSum; - bSum += bInSum; - aSum += aInSum; - stackIn = stackIn.next; - rOutSum += pr = stackOut.r; - gOutSum += pg = stackOut.g; - bOutSum += pb = stackOut.b; - aOutSum += pa = stackOut.a; - rInSum -= pr; - gInSum -= pg; - bInSum -= pb; - aInSum -= pa; - stackOut = stackOut.next; - yi += 4; - } - - yw += width; - } - - for (x = 0; x < width; x++) { - gInSum = bInSum = aInSum = rInSum = gSum = bSum = aSum = rSum = 0; - yi = x << 2; - rOutSum = radiusPlus1 * (pr = pixels[yi]); - gOutSum = radiusPlus1 * (pg = pixels[yi + 1]); - bOutSum = radiusPlus1 * (pb = pixels[yi + 2]); - aOutSum = radiusPlus1 * (pa = pixels[yi + 3]); - rSum += sumFactor * pr; - gSum += sumFactor * pg; - bSum += sumFactor * pb; - aSum += sumFactor * pa; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack.a = pa; - stack = stack.next; - } - - yp = width; - - for (i = 1; i <= radius; i++) { - yi = yp + x << 2; - rSum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i); - gSum += (stack.g = pg = pixels[yi + 1]) * rbs; - bSum += (stack.b = pb = pixels[yi + 2]) * rbs; - aSum += (stack.a = pa = pixels[yi + 3]) * rbs; - rInSum += pr; - gInSum += pg; - bInSum += pb; - aInSum += pa; - stack = stack.next; - - if (i < heightMinus1) { - yp += width; - } - } - - yi = x; - stackIn = stackStart; - stackOut = stackEnd; - - for (y = 0; y < height; y++) { - p = yi << 2; - pixels[p + 3] = pa = aSum * mulSum >> shgSum; - - if (pa > 0) { - pa = 255 / pa; - pixels[p] = (rSum * mulSum >> shgSum) * pa; - pixels[p + 1] = (gSum * mulSum >> shgSum) * pa; - pixels[p + 2] = (bSum * mulSum >> shgSum) * pa; - } else { - pixels[p] = pixels[p + 1] = pixels[p + 2] = 0; - } - - rSum -= rOutSum; - gSum -= gOutSum; - bSum -= bOutSum; - aSum -= aOutSum; - rOutSum -= stackIn.r; - gOutSum -= stackIn.g; - bOutSum -= stackIn.b; - aOutSum -= stackIn.a; - p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2; - rSum += rInSum += stackIn.r = pixels[p]; - gSum += gInSum += stackIn.g = pixels[p + 1]; - bSum += bInSum += stackIn.b = pixels[p + 2]; - aSum += aInSum += stackIn.a = pixels[p + 3]; - stackIn = stackIn.next; - rOutSum += pr = stackOut.r; - gOutSum += pg = stackOut.g; - bOutSum += pb = stackOut.b; - aOutSum += pa = stackOut.a; - rInSum -= pr; - gInSum -= pg; - bInSum -= pb; - aInSum -= pa; - stackOut = stackOut.next; - yi += width; - } - } - - return imageData; - } - /** - * - */ - - - var BlurStack = - /** - * Set properties. - */ - function BlurStack() { - _classCallCheck$1(this, BlurStack); - - this.r = 0; - this.g = 0; - this.b = 0; - this.a = 0; - this.next = null; - }; - - /** - * Whether a value is `null` or `undefined`. - * @param {any} val - * @returns {boolean} - */ - - var isNullish = function isNullish(val) { - return val === null || val === undefined; - }; - /** - * @callback module:canvg.ForceRedraw - * @returns {boolean} - */ - - /** - * @typedef {PlainObject} module:canvg.CanvgOptions - * @property {boolean} ignoreMouse true => ignore mouse events - * @property {boolean} ignoreAnimation true => ignore animations - * @property {boolean} ignoreDimensions true => does not try to resize canvas - * @property {boolean} ignoreClear true => does not clear canvas - * @property {Integer} offsetX int => draws at a x offset - * @property {Integer} offsetY int => draws at a y offset - * @property {Integer} scaleWidth int => scales horizontally to width - * @property {Integer} scaleHeight int => scales vertically to height - * @property {module:canvg.ForceRedraw} forceRedraw function => will call the function on every frame, if it returns true, will redraw - * @property {boolean} log Adds log function - * @property {boolean} useCORS Whether to set CORS `crossOrigin` for the image to `Anonymous` - */ - - /** - * If called with no arguments, it will replace all `` elements on the page - * with `` elements. - * @function module:canvg.canvg - * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element - * @param {string|XMLDocument} s - svg string, url to svg file, or xml document - * @param {module:canvg.CanvgOptions} [opts] Optional hash of options - * @returns {Promise} All the function after the first render is completed with dom - */ - - - var canvg = function canvg(target, s, opts) { - // no parameters - if (isNullish(target) && isNullish(s) && isNullish(opts)) { - var svgTags = document.querySelectorAll('svg'); - return Promise.all(_toConsumableArray(svgTags).map(function (svgTag) { - var c = document.createElement('canvas'); - c.width = svgTag.clientWidth; - c.height = svgTag.clientHeight; - svgTag.before(c); - svgTag.remove(); - var div = document.createElement('div'); - div.append(svgTag); - return canvg(c, div.innerHTML); - })); - } - - if (typeof target === 'string') { - target = document.getElementById(target); - } // store class on canvas - - - if (!isNullish(target.svg)) target.svg.stop(); - var svg = build(opts || {}); // on i.e. 8 for flash canvas, we can't assign the property so check for it - - if (!(target.childNodes.length === 1 && target.childNodes[0].nodeName === 'OBJECT')) { - target.svg = svg; - } - - var ctx = target.getContext('2d'); - - if (typeof s.documentElement !== 'undefined') { - // load from xml doc - return svg.loadXmlDoc(ctx, s); - } - - if (s.substr(0, 1) === '<') { - // load from xml string - return svg.loadXml(ctx, s); - } // load from url - - - return svg.load(ctx, s); - }; - /* eslint-disable jsdoc/check-types */ - - /** - * @param {module:canvg.CanvgOptions} opts - * @returns {object} - * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) - */ - - function build(opts) { - /* eslint-enable jsdoc/check-types */ - var svg = { - opts: opts - }; - svg.FRAMERATE = 30; - svg.MAX_VIRTUAL_PIXELS = 30000; - - svg.log = function (msg) { - /* */ - }; - - if (svg.opts.log === true && typeof console !== 'undefined') { - svg.log = function (msg) { - console.log(msg); - }; // eslint-disable-line no-console - - } // globals - - - svg.init = function (ctx) { - var uniqueId = 0; - - svg.UniqueId = function () { - uniqueId++; - return 'canvg' + uniqueId; - }; - - svg.Definitions = {}; - svg.Styles = {}; - svg.Animations = []; - svg.Images = []; - svg.ctx = ctx; - svg.ViewPort = { - viewPorts: [], - Clear: function Clear() { - this.viewPorts = []; - }, - SetCurrent: function SetCurrent(width, height) { - this.viewPorts.push({ - width: width, - height: height - }); - }, - RemoveCurrent: function RemoveCurrent() { - this.viewPorts.pop(); - }, - Current: function Current() { - return this.viewPorts[this.viewPorts.length - 1]; - }, - width: function width() { - return this.Current().width; - }, - height: function height() { - return this.Current().height; - }, - ComputeSize: function ComputeSize(d) { - if (!isNullish(d) && typeof d === 'number') return d; - if (d === 'x') return this.width(); - if (d === 'y') return this.height(); - return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2); - } - }; - }; - - svg.init(); // images loaded - - svg.ImagesLoaded = function () { - return svg.Images.every(function (img) { - return img.loaded; - }); - }; // trim - - - svg.trim = function (s) { - return s.replace(/^\s+|\s+$/g, ''); - }; // compress spaces - - - svg.compressSpaces = function (s) { - return s.replace(/\s+/gm, ' '); - }; // ajax - // Todo: Replace with `fetch` and polyfill - - - svg.ajax = function (url, asynch) { - var AJAX = window.XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP'); - - if (asynch) { - return new Promise(function (resolve, reject) { - // eslint-disable-line promise/avoid-new - var req = AJAX.open('GET', url, true); - req.addEventListener('load', function () { - resolve(AJAX.responseText); - }); - AJAX.send(null); - }); - } - - AJAX.open('GET', url, false); - AJAX.send(null); - return AJAX.responseText; - }; // parse xml - - - svg.parseXml = function (xml) { - if (window.DOMParser) { - var parser = new DOMParser(); - return parser.parseFromString(xml, 'text/xml'); - } - - xml = xml.replace(/]*>/, ''); - var xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM'); - xmlDoc.async = 'false'; - xmlDoc.loadXML(xml); - return xmlDoc; - }; // text extensions - // get the text baseline - - - var textBaselineMapping = { - baseline: 'alphabetic', - 'before-edge': 'top', - 'text-before-edge': 'top', - middle: 'middle', - central: 'middle', - 'after-edge': 'bottom', - 'text-after-edge': 'bottom', - ideographic: 'ideographic', - alphabetic: 'alphabetic', - hanging: 'hanging', - mathematical: 'alphabetic' - }; - - svg.Property = /*#__PURE__*/function () { - function Property(name, value) { - _classCallCheck(this, Property); - - this.name = name; - this.value = value; - } - - _createClass(Property, [{ - key: "getValue", - value: function getValue() { - return this.value; - } - }, { - key: "hasValue", - value: function hasValue() { - return !isNullish(this.value) && this.value !== ''; - } // return the numerical value of the property - - }, { - key: "numValue", - value: function numValue() { - if (!this.hasValue()) return 0; - var n = Number.parseFloat(this.value); - - if (String(this.value).endsWith('%')) { - n /= 100.0; - } - - return n; - } - }, { - key: "valueOrDefault", - value: function valueOrDefault(def) { - if (this.hasValue()) return this.value; - return def; - } - }, { - key: "numValueOrDefault", - value: function numValueOrDefault(def) { - if (this.hasValue()) return this.numValue(); - return def; - } // color extensions - // augment the current color value with the opacity - - }, { - key: "addOpacity", - value: function addOpacity(opacityProp) { - var newValue = this.value; - - if (!isNullish(opacityProp.value) && opacityProp.value !== '' && typeof this.value === 'string') { - // can only add opacity to colors, not patterns - var color = new RGBColor(this.value); - - if (color.ok) { - newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')'; - } - } - - return new svg.Property(this.name, newValue); - } // definition extensions - // get the definition from the definitions table - - }, { - key: "getDefinition", - value: function getDefinition() { - var name = this.value.match(/#([^)'"]+)/); - - if (name) { - name = name[1]; - } - - if (!name) { - name = this.value; - } - - return svg.Definitions[name]; - } - }, { - key: "isUrlDefinition", - value: function isUrlDefinition() { - return this.value.startsWith('url('); - } - }, { - key: "getFillStyleDefinition", - value: function getFillStyleDefinition(e, opacityProp) { - var def = this.getDefinition(); // gradient - - if (!isNullish(def) && def.createGradient) { - return def.createGradient(svg.ctx, e, opacityProp); - } // pattern - - - if (!isNullish(def) && def.createPattern) { - if (def.getHrefAttribute().hasValue()) { - var pt = def.attribute('patternTransform'); - def = def.getHrefAttribute().getDefinition(); - - if (pt.hasValue()) { - def.attribute('patternTransform', true).value = pt.value; - } - } - - return def.createPattern(svg.ctx, e); - } - - return null; - } // length extensions - - }, { - key: "getDPI", - value: function getDPI(viewPort) { - return 96.0; // TODO: compute? - } - }, { - key: "getEM", - value: function getEM(viewPort) { - var em = 12; - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - if (fontSize.hasValue()) em = fontSize.toPixels(viewPort); - return em; - } - }, { - key: "getUnits", - value: function getUnits() { - return String(this.value).replace(/[\d.-]/g, ''); - } // get the length as pixels - - }, { - key: "toPixels", - value: function toPixels(viewPort, processPercent) { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('em')) return this.numValue() * this.getEM(viewPort); - if (s.endsWith('ex')) return this.numValue() * this.getEM(viewPort) / 2.0; - if (s.endsWith('px')) return this.numValue(); - if (s.endsWith('pt')) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0); - if (s.endsWith('pc')) return this.numValue() * 15; - if (s.endsWith('cm')) return this.numValue() * this.getDPI(viewPort) / 2.54; - if (s.endsWith('mm')) return this.numValue() * this.getDPI(viewPort) / 25.4; - if (s.endsWith('in')) return this.numValue() * this.getDPI(viewPort); - if (s.endsWith('%')) return this.numValue() * svg.ViewPort.ComputeSize(viewPort); - var n = this.numValue(); - if (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort); - return n; - } // time extensions - // get the time as milliseconds - - }, { - key: "toMilliseconds", - value: function toMilliseconds() { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('ms')) return this.numValue(); - if (s.endsWith('s')) return this.numValue() * 1000; - return this.numValue(); - } // angle extensions - // get the angle as radians - - }, { - key: "toRadians", - value: function toRadians() { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('deg')) return this.numValue() * (Math.PI / 180.0); - if (s.endsWith('grad')) return this.numValue() * (Math.PI / 200.0); - if (s.endsWith('rad')) return this.numValue(); - return this.numValue() * (Math.PI / 180.0); - } - }, { - key: "toTextBaseline", - value: function toTextBaseline() { - if (!this.hasValue()) return null; - return textBaselineMapping[this.value]; - } - }]); - - return Property; - }(); // fonts - - - svg.Font = { - Styles: 'normal|italic|oblique|inherit', - Variants: 'normal|small-caps|inherit', - Weights: 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit', - CreateFont: function CreateFont(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { - var f = !isNullish(inherit) ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); - return { - fontFamily: fontFamily || f.fontFamily, - fontSize: fontSize || f.fontSize, - fontStyle: fontStyle || f.fontStyle, - fontWeight: fontWeight || f.fontWeight, - fontVariant: fontVariant || f.fontVariant, - toString: function toString() { - return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' '); - } - }; - }, - Parse: function Parse(s) { - var _this = this; - - var f = {}; - var ds = svg.trim(svg.compressSpaces(s || '')).split(' '); - var set = { - fontSize: false, - fontStyle: false, - fontWeight: false, - fontVariant: false - }; - var ff = ''; - ds.forEach(function (d) { - if (!set.fontStyle && _this.Styles.includes(d)) { - if (d !== 'inherit') { - f.fontStyle = d; - } - - set.fontStyle = true; - } else if (!set.fontVariant && _this.Variants.includes(d)) { - if (d !== 'inherit') { - f.fontVariant = d; - } - - set.fontStyle = set.fontVariant = true; - } else if (!set.fontWeight && _this.Weights.includes(d)) { - if (d !== 'inherit') { - f.fontWeight = d; - } - - set.fontStyle = set.fontVariant = set.fontWeight = true; - } else if (!set.fontSize) { - if (d !== 'inherit') { - f.fontSize = d.split('/')[0]; - } - - set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; - } else if (d !== 'inherit') { - ff += d; - } - }); - - if (ff !== '') { - f.fontFamily = ff; - } - - return f; - } - }; // points and paths - - svg.ToNumberArray = function (s) { - var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' '); - return a.map(function (_a) { - return Number.parseFloat(_a); - }); - }; - - svg.Point = /*#__PURE__*/function () { - function _class(x, y) { - _classCallCheck(this, _class); - - this.x = x; - this.y = y; - } - - _createClass(_class, [{ - key: "angleTo", - value: function angleTo(p) { - return Math.atan2(p.y - this.y, p.x - this.x); - } - }, { - key: "applyTransform", - value: function applyTransform(v) { - var xp = this.x * v[0] + this.y * v[2] + v[4]; - var yp = this.x * v[1] + this.y * v[3] + v[5]; - this.x = xp; - this.y = yp; - } - }]); - - return _class; - }(); - - svg.CreatePoint = function (s) { - var a = svg.ToNumberArray(s); - return new svg.Point(a[0], a[1]); - }; - - svg.CreatePath = function (s) { - var a = svg.ToNumberArray(s); - var path = []; - - for (var i = 0; i < a.length; i += 2) { - path.push(new svg.Point(a[i], a[i + 1])); - } - - return path; - }; // bounding box - - - svg.BoundingBox = /*#__PURE__*/function () { - function _class2(x1, y1, x2, y2) { - _classCallCheck(this, _class2); - - // pass in initial points if you want - this.x1 = Number.NaN; - this.y1 = Number.NaN; - this.x2 = Number.NaN; - this.y2 = Number.NaN; - this.addPoint(x1, y1); - this.addPoint(x2, y2); - } - - _createClass(_class2, [{ - key: "x", - value: function x() { - return this.x1; - } - }, { - key: "y", - value: function y() { - return this.y1; - } - }, { - key: "width", - value: function width() { - return this.x2 - this.x1; - } - }, { - key: "height", - value: function height() { - return this.y2 - this.y1; - } - }, { - key: "addPoint", - value: function addPoint(x, y) { - if (!isNullish(x)) { - if (isNaN(this.x1) || isNaN(this.x2)) { - this.x1 = x; - this.x2 = x; - } - - if (x < this.x1) this.x1 = x; - if (x > this.x2) this.x2 = x; - } - - if (!isNullish(y)) { - if (isNaN(this.y1) || isNaN(this.y2)) { - this.y1 = y; - this.y2 = y; - } - - if (y < this.y1) this.y1 = y; - if (y > this.y2) this.y2 = y; - } - } - }, { - key: "addX", - value: function addX(x) { - this.addPoint(x, null); - } - }, { - key: "addY", - value: function addY(y) { - this.addPoint(null, y); - } - }, { - key: "addBoundingBox", - value: function addBoundingBox(bb) { - this.addPoint(bb.x1, bb.y1); - this.addPoint(bb.x2, bb.y2); - } - }, { - key: "addQuadraticCurve", - value: function addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) { - var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) - - var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) - - var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) - - var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) - - this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); - } - }, { - key: "addBezierCurve", - value: function addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { - var _this2 = this; - - // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html - var p0 = [p0x, p0y], - p1 = [p1x, p1y], - p2 = [p2x, p2y], - p3 = [p3x, p3y]; - this.addPoint(p0[0], p0[1]); - this.addPoint(p3[0], p3[1]); - - var _loop = function _loop(i) { - var f = function f(t) { - return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i]; - }; - - var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; - var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; - var c = 3 * p1[i] - 3 * p0[i]; - - if (a === 0) { - if (b === 0) return "continue"; - var t = -c / b; - - if (t > 0 && t < 1) { - if (i === 0) _this2.addX(f(t)); - if (i === 1) _this2.addY(f(t)); - } - - return "continue"; - } - - var b2ac = Math.pow(b, 2) - 4 * c * a; - if (b2ac < 0) return "continue"; - var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); - - if (t1 > 0 && t1 < 1) { - if (i === 0) _this2.addX(f(t1)); - if (i === 1) _this2.addY(f(t1)); - } - - var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); - - if (t2 > 0 && t2 < 1) { - if (i === 0) _this2.addX(f(t2)); - if (i === 1) _this2.addY(f(t2)); - } - }; - - for (var i = 0; i <= 1; i++) { - var _ret = _loop(i); - - if (_ret === "continue") continue; - } - } - }, { - key: "isPointInBox", - value: function isPointInBox(x, y) { - return this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2; - } - }]); - - return _class2; - }(); // transforms - - - svg.Transform = /*#__PURE__*/function () { - function _class3(v) { - var _this6 = this; - - _classCallCheck(this, _class3); - - this.Type = { - translate: function translate(s) { - _classCallCheck(this, translate); - - this.p = svg.CreatePoint(s); - - this.apply = function (ctx) { - ctx.translate(this.p.x || 0.0, this.p.y || 0.0); - }; - - this.unapply = function (ctx) { - ctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0); - }; - - this.applyToPoint = function (p) { - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - }; - }, - rotate: function rotate(s) { - _classCallCheck(this, rotate); - - var a = svg.ToNumberArray(s); - this.angle = new svg.Property('angle', a[0]); - this.cx = a[1] || 0; - this.cy = a[2] || 0; - - this.apply = function (ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(this.angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - }; - - this.unapply = function (ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(-1.0 * this.angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - }; - - this.applyToPoint = function (p) { - var _a = this.angle.toRadians(); - - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - p.applyTransform([Math.cos(_a), Math.sin(_a), -Math.sin(_a), Math.cos(_a), 0, 0]); - p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); - }; - }, - scale: function scale(s) { - _classCallCheck(this, scale); - - this.p = svg.CreatePoint(s); - - this.apply = function (ctx) { - ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); - }; - - this.unapply = function (ctx) { - ctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0); - }; - - this.applyToPoint = function (p) { - p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); - }; - }, - matrix: function matrix(s) { - _classCallCheck(this, matrix); - - this.m = svg.ToNumberArray(s); - - this.apply = function (ctx) { - ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); - }; - - this.applyToPoint = function (p) { - p.applyTransform(this.m); - }; - } - }; - Object.assign(this.Type, { - SkewBase: /*#__PURE__*/function (_this$Type$matrix) { - _inherits(SkewBase, _this$Type$matrix); - - var _super = _createSuper(SkewBase); - - function SkewBase(s) { - var _this3; - - _classCallCheck(this, SkewBase); - - _this3 = _super.call(this, s); - _this3.angle = new svg.Property('angle', s); - return _this3; - } - - return SkewBase; - }(this.Type.matrix) - }); - Object.assign(this.Type, { - skewX: /*#__PURE__*/function (_this$Type$SkewBase) { - _inherits(skewX, _this$Type$SkewBase); - - var _super2 = _createSuper(skewX); - - function skewX(s) { - var _this4; - - _classCallCheck(this, skewX); - - _this4 = _super2.call(this, s); - _this4.m = [1, 0, Math.tan(_this4.angle.toRadians()), 1, 0, 0]; - return _this4; - } - - return skewX; - }(this.Type.SkewBase), - skewY: /*#__PURE__*/function (_this$Type$SkewBase2) { - _inherits(skewY, _this$Type$SkewBase2); - - var _super3 = _createSuper(skewY); - - function skewY(s) { - var _this5; - - _classCallCheck(this, skewY); - - _this5 = _super3.call(this, s); - _this5.m = [1, Math.tan(_this5.angle.toRadians()), 0, 1, 0, 0]; - return _this5; - } - - return skewY; - }(this.Type.SkewBase) - }); - var data = svg.trim(svg.compressSpaces(v)).replace(/\)([a-zA-Z])/g, ') $1').replace(/\)(\s?,\s?)/g, ') ').split(/\s(?=[a-z])/); - this.transforms = data.map(function (d) { - var type = svg.trim(d.split('(')[0]); - var s = d.split('(')[1].replace(')', ''); - var transform = new _this6.Type[type](s); - transform.type = type; - return transform; - }); - } - - _createClass(_class3, [{ - key: "apply", - value: function apply(ctx) { - this.transforms.forEach(function (transform) { - transform.apply(ctx); - }); - } - }, { - key: "unapply", - value: function unapply(ctx) { - for (var i = this.transforms.length - 1; i >= 0; i--) { - this.transforms[i].unapply(ctx); - } - } - }, { - key: "applyToPoint", - value: function applyToPoint(p) { - this.transforms.forEach(function (transform) { - transform.applyToPoint(p); - }); - } - }]); - - return _class3; - }(); // aspect ratio - - - svg.AspectRatio = function (ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) { - // aspect ratio - https://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute - aspectRatio = svg.compressSpaces(aspectRatio); - aspectRatio = aspectRatio.replace(/^defer\s/, ''); // ignore defer - - var align = aspectRatio.split(' ')[0] || 'xMidYMid'; - var meetOrSlice = aspectRatio.split(' ')[1] || 'meet'; // calculate scale - - var scaleX = width / desiredWidth; - var scaleY = height / desiredHeight; - var scaleMin = Math.min(scaleX, scaleY); - var scaleMax = Math.max(scaleX, scaleY); - - if (meetOrSlice === 'meet') { - desiredWidth *= scaleMin; - desiredHeight *= scaleMin; - } - - if (meetOrSlice === 'slice') { - desiredWidth *= scaleMax; - desiredHeight *= scaleMax; - } - - refX = new svg.Property('refX', refX); - refY = new svg.Property('refY', refY); - - if (refX.hasValue() && refY.hasValue()) { - ctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y')); - } else { - // align - if (align.startsWith('xMid') && (meetOrSlice === 'meet' && scaleMin === scaleY || meetOrSlice === 'slice' && scaleMax === scaleY)) { - ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); - } - - if (align.endsWith('YMid') && (meetOrSlice === 'meet' && scaleMin === scaleX || meetOrSlice === 'slice' && scaleMax === scaleX)) { - ctx.translate(0, height / 2.0 - desiredHeight / 2.0); - } - - if (align.startsWith('xMax') && (meetOrSlice === 'meet' && scaleMin === scaleY || meetOrSlice === 'slice' && scaleMax === scaleY)) { - ctx.translate(width - desiredWidth, 0); - } - - if (align.endsWith('YMax') && (meetOrSlice === 'meet' && scaleMin === scaleX || meetOrSlice === 'slice' && scaleMax === scaleX)) { - ctx.translate(0, height - desiredHeight); - } - } // scale - - - if (align === 'none') ctx.scale(scaleX, scaleY);else if (meetOrSlice === 'meet') ctx.scale(scaleMin, scaleMin);else if (meetOrSlice === 'slice') ctx.scale(scaleMax, scaleMax); // translate - - ctx.translate(isNullish(minX) ? 0 : -minX, isNullish(minY) ? 0 : -minY); - }; // elements - - - svg.Element = {}; - svg.EmptyProperty = new svg.Property('EMPTY', ''); - - svg.Element.ElementBase = /*#__PURE__*/function () { - function _class4(node) { - var _this7 = this; - - _classCallCheck(this, _class4); - - // Argument from inheriting class - this.captureTextNodes = arguments[1]; // eslint-disable-line prefer-rest-params - - this.attributes = {}; - this.styles = {}; - this.children = []; - - if (!isNullish(node) && node.nodeType === 1) { - // ELEMENT_NODE - // add children - _toConsumableArray(node.childNodes).forEach(function (childNode) { - if (childNode.nodeType === 1) { - _this7.addChild(childNode, true); // ELEMENT_NODE - - } - - if (_this7.captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) { - var text = childNode.nodeValue || childNode.text || ''; - - if (svg.trim(svg.compressSpaces(text)) !== '') { - _this7.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE - - } - } - }); // add attributes - - - _toConsumableArray(node.attributes).forEach(function (_ref) { - var nodeName = _ref.nodeName, - nodeValue = _ref.nodeValue; - _this7.attributes[nodeName] = new svg.Property(nodeName, nodeValue); - }); // add tag styles - - - var styles = svg.Styles[node.nodeName]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - name = _ref3[0], - styleValue = _ref3[1]; - - _this7.styles[name] = styleValue; - }); - } // add class styles - - - if (this.attribute('class').hasValue()) { - var classes = svg.compressSpaces(this.attribute('class').value).split(' '); - classes.forEach(function (clss) { - styles = svg.Styles['.' + clss]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - name = _ref5[0], - styleValue = _ref5[1]; - - _this7.styles[name] = styleValue; - }); - } - - styles = svg.Styles[node.nodeName + '.' + clss]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref6) { - var _ref7 = _slicedToArray(_ref6, 2), - name = _ref7[0], - styleValue = _ref7[1]; - - _this7.styles[name] = styleValue; - }); - } - }); - } // add id styles - - - if (this.attribute('id').hasValue()) { - var _styles = svg.Styles['#' + this.attribute('id').value]; - - if (!isNullish(_styles)) { - Object.entries(_styles).forEach(function (_ref8) { - var _ref9 = _slicedToArray(_ref8, 2), - name = _ref9[0], - styleValue = _ref9[1]; - - _this7.styles[name] = styleValue; - }); - } - } // add inline styles - - - if (this.attribute('style').hasValue()) { - var _styles2 = this.attribute('style').value.split(';'); - - _styles2.forEach(function (style) { - if (svg.trim(style) !== '') { - var _style$split = style.split(':'), - name = _style$split.name, - value = _style$split.value; - - name = svg.trim(name); - value = svg.trim(value); - _this7.styles[name] = new svg.Property(name, value); - } - }); - } // add id - - - if (this.attribute('id').hasValue()) { - if (isNullish(svg.Definitions[this.attribute('id').value])) { - svg.Definitions[this.attribute('id').value] = this; - } - } - } - } // get or create attribute - - - _createClass(_class4, [{ - key: "attribute", - value: function attribute(name, createIfNotExists) { - var a = this.attributes[name]; - if (!isNullish(a)) return a; - - if (createIfNotExists === true) { - a = new svg.Property(name, ''); - this.attributes[name] = a; - } - - return a || svg.EmptyProperty; - } - }, { - key: "getHrefAttribute", - value: function getHrefAttribute() { - for (var a in this.attributes) { - if (a.endsWith(':href')) { - return this.attributes[a]; - } - } - - return svg.EmptyProperty; - } // get or create style, crawls up node tree - - }, { - key: "style", - value: function style(name, createIfNotExists, skipAncestors) { - var s = this.styles[name]; - if (!isNullish(s)) return s; - var a = this.attribute(name); - - if (!isNullish(a) && a.hasValue()) { - this.styles[name] = a; // move up to me to cache - - return a; - } - - if (skipAncestors !== true) { - var p = this.parent; - - if (!isNullish(p)) { - var ps = p.style(name); - - if (!isNullish(ps) && ps.hasValue()) { - return ps; - } - } - } - - if (createIfNotExists === true) { - s = new svg.Property(name, ''); - this.styles[name] = s; - } - - return s || svg.EmptyProperty; - } // base render - - }, { - key: "render", - value: function render(ctx) { - // don't render display=none - if (this.style('display').value === 'none') return; // don't render visibility=hidden - - if (this.style('visibility').value === 'hidden') return; - ctx.save(); - - if (this.attribute('mask').hasValue()) { - // mask - var mask = this.attribute('mask').getDefinition(); - if (!isNullish(mask)) mask.apply(ctx, this); - } else if (this.style('filter').hasValue()) { - // filter - var filter = this.style('filter').getDefinition(); - if (!isNullish(filter)) filter.apply(ctx, this); - } else { - this.setContext(ctx); - this.renderChildren(ctx); - this.clearContext(ctx); - } - - ctx.restore(); - } // base set context - - }, { - key: "setContext", - value: function setContext(ctx) {// OVERRIDE ME! - } // base clear context - - }, { - key: "clearContext", - value: function clearContext(ctx) {// OVERRIDE ME! - } // base render children - - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - this.children.forEach(function (child) { - child.render(ctx); - }); - } - }, { - key: "addChild", - value: function addChild(childNode, create) { - var child = create ? svg.CreateElement(childNode) : childNode; - child.parent = this; - - if (child.type !== 'title') { - this.children.push(child); - } - } - }]); - - return _class4; - }(); - - svg.Element.RenderedElementBase = /*#__PURE__*/function (_svg$Element$ElementB) { - _inherits(_class5, _svg$Element$ElementB); - - var _super4 = _createSuper(_class5); - - function _class5() { - _classCallCheck(this, _class5); - - return _super4.apply(this, arguments); - } - - _createClass(_class5, [{ - key: "setContext", - value: function setContext(ctx) { - // fill - if (this.style('fill').isUrlDefinition()) { - var fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity')); - if (!isNullish(fs)) ctx.fillStyle = fs; - } else if (this.style('fill').hasValue()) { - var fillStyle = this.style('fill'); - if (fillStyle.value === 'currentColor') fillStyle.value = this.style('color').value; - ctx.fillStyle = fillStyle.value === 'none' ? 'rgba(0,0,0,0)' : fillStyle.value; - } - - if (this.style('fill-opacity').hasValue()) { - var _fillStyle = new svg.Property('fill', ctx.fillStyle); - - _fillStyle = _fillStyle.addOpacity(this.style('fill-opacity')); - ctx.fillStyle = _fillStyle.value; - } // stroke - - - if (this.style('stroke').isUrlDefinition()) { - var _fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity')); - - if (!isNullish(_fs)) ctx.strokeStyle = _fs; - } else if (this.style('stroke').hasValue()) { - var strokeStyle = this.style('stroke'); - if (strokeStyle.value === 'currentColor') strokeStyle.value = this.style('color').value; - ctx.strokeStyle = strokeStyle.value === 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value; - } - - if (this.style('stroke-opacity').hasValue()) { - var _strokeStyle = new svg.Property('stroke', ctx.strokeStyle); - - _strokeStyle = _strokeStyle.addOpacity(this.style('stroke-opacity')); - ctx.strokeStyle = _strokeStyle.value; - } - - if (this.style('stroke-width').hasValue()) { - var newLineWidth = this.style('stroke-width').toPixels(); - ctx.lineWidth = newLineWidth === 0 ? 0.001 : newLineWidth; // browsers don't respect 0 - } - - if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value; - if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value; - if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value; - - if (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value !== 'none') { - var gaps = svg.ToNumberArray(this.style('stroke-dasharray').value); - - if (typeof ctx.setLineDash !== 'undefined') { - ctx.setLineDash(gaps); - } else if (typeof ctx.webkitLineDash !== 'undefined') { - ctx.webkitLineDash = gaps; - } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) { - ctx.mozDash = gaps; - } - - var offset = this.style('stroke-dashoffset').numValueOrDefault(1); - - if (typeof ctx.lineDashOffset !== 'undefined') { - ctx.lineDashOffset = offset; - } else if (typeof ctx.webkitLineDashOffset !== 'undefined') { - ctx.webkitLineDashOffset = offset; - } else if (typeof ctx.mozDashOffset !== 'undefined') { - ctx.mozDashOffset = offset; - } - } // font - - - if (typeof ctx.font !== 'undefined') { - ctx.font = svg.Font.CreateFont(this.style('font-style').value, this.style('font-variant').value, this.style('font-weight').value, this.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '', this.style('font-family').value).toString(); - } // transform - - - if (this.attribute('transform').hasValue()) { - var transform = new svg.Transform(this.attribute('transform').value); - transform.apply(ctx); - } // clip - - - if (this.style('clip-path', false, true).hasValue()) { - var clip = this.style('clip-path', false, true).getDefinition(); - if (!isNullish(clip)) clip.apply(ctx); - } // opacity - - - if (this.style('opacity').hasValue()) { - ctx.globalAlpha = this.style('opacity').numValue(); - } - } - }]); - - return _class5; - }(svg.Element.ElementBase); - - svg.Element.PathElementBase = /*#__PURE__*/function (_svg$Element$Rendered) { - _inherits(_class6, _svg$Element$Rendered); - - var _super5 = _createSuper(_class6); - - function _class6() { - _classCallCheck(this, _class6); - - return _super5.apply(this, arguments); - } - - _createClass(_class6, [{ - key: "path", - value: function path(ctx) { - if (!isNullish(ctx)) ctx.beginPath(); - return new svg.BoundingBox(); - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - this.path(ctx); - svg.Mouse.checkPath(this, ctx); - - if (ctx.fillStyle !== '') { - if (this.style('fill-rule').valueOrDefault('inherit') !== 'inherit') { - ctx.fill(this.style('fill-rule').value); - } else { - ctx.fill(); - } - } - - if (ctx.strokeStyle !== '') ctx.stroke(); - var markers = this.getMarkers(); - - if (!isNullish(markers)) { - if (this.style('marker-start').isUrlDefinition()) { - var marker = this.style('marker-start').getDefinition(); - marker.render(ctx, markers[0][0], markers[0][1]); - } - - if (this.style('marker-mid').isUrlDefinition()) { - var _marker = this.style('marker-mid').getDefinition(); - - for (var i = 1; i < markers.length - 1; i++) { - _marker.render(ctx, markers[i][0], markers[i][1]); - } - } - - if (this.style('marker-end').isUrlDefinition()) { - var _marker2 = this.style('marker-end').getDefinition(); - - _marker2.render(ctx, markers[markers.length - 1][0], markers[markers.length - 1][1]); - } - } - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - return this.path(); - } - }, { - key: "getMarkers", - value: function getMarkers() { - return null; - } - }]); - - return _class6; - }(svg.Element.RenderedElementBase); // svg element - - - svg.Element.svg = /*#__PURE__*/function (_svg$Element$Rendered2) { - _inherits(_class7, _svg$Element$Rendered2); - - var _super6 = _createSuper(_class7); - - function _class7() { - _classCallCheck(this, _class7); - - return _super6.apply(this, arguments); - } - - _createClass(_class7, [{ - key: "clearContext", - value: function clearContext(ctx) { - _get(_getPrototypeOf(_class7.prototype), "clearContext", this).call(this, ctx); - - svg.ViewPort.RemoveCurrent(); - } - }, { - key: "setContext", - value: function setContext(ctx) { - // initial values and defaults - ctx.strokeStyle = 'rgba(0,0,0,0)'; - ctx.lineCap = 'butt'; - ctx.lineJoin = 'miter'; - ctx.miterLimit = 4; - - if (typeof ctx.font !== 'undefined' && typeof window.getComputedStyle !== 'undefined') { - ctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font'); - } - - _get(_getPrototypeOf(_class7.prototype), "setContext", this).call(this, ctx); // create new view port - - - if (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0; - if (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0; - ctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y')); - var width = svg.ViewPort.width(); - var height = svg.ViewPort.height(); - if (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%'; - if (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%'; - - if (typeof this.root === 'undefined') { - width = this.attribute('width').toPixels('x'); - height = this.attribute('height').toPixels('y'); - var x = 0; - var y = 0; - - if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) { - x = -this.attribute('refX').toPixels('x'); - y = -this.attribute('refY').toPixels('y'); - } - - if (this.attribute('overflow').valueOrDefault('hidden') !== 'visible') { - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(width, y); - ctx.lineTo(width, height); - ctx.lineTo(x, height); - ctx.closePath(); - ctx.clip(); - } - } - - svg.ViewPort.SetCurrent(width, height); // viewbox - - if (this.attribute('viewBox').hasValue()) { - var viewBox = svg.ToNumberArray(this.attribute('viewBox').value); - var minX = viewBox[0]; - var minY = viewBox[1]; - width = viewBox[2]; - height = viewBox[3]; - svg.AspectRatio(ctx, this.attribute('preserveAspectRatio').value, svg.ViewPort.width(), width, svg.ViewPort.height(), height, minX, minY, this.attribute('refX').value, this.attribute('refY').value); - svg.ViewPort.RemoveCurrent(); - svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]); - } - } - }]); - - return _class7; - }(svg.Element.RenderedElementBase); // rect element - - - svg.Element.rect = /*#__PURE__*/function (_svg$Element$PathElem) { - _inherits(_class8, _svg$Element$PathElem); - - var _super7 = _createSuper(_class8); - - function _class8() { - _classCallCheck(this, _class8); - - return _super7.apply(this, arguments); - } - - _createClass(_class8, [{ - key: "path", - value: function path(ctx) { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - var rx = this.attribute('rx').toPixels('x'); - var ry = this.attribute('ry').toPixels('y'); - if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx; - if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry; - rx = Math.min(rx, width / 2.0); - ry = Math.min(ry, height / 2.0); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(x + rx, y); - ctx.lineTo(x + width - rx, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + ry); - ctx.lineTo(x + width, y + height - ry); - ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); - ctx.lineTo(x + rx, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - ry); - ctx.lineTo(x, y + ry); - ctx.quadraticCurveTo(x, y, x + rx, y); - ctx.closePath(); - } - - return new svg.BoundingBox(x, y, x + width, y + height); - } - }]); - - return _class8; - }(svg.Element.PathElementBase); // circle element - - - svg.Element.circle = /*#__PURE__*/function (_svg$Element$PathElem2) { - _inherits(_class9, _svg$Element$PathElem2); - - var _super8 = _createSuper(_class9); - - function _class9() { - _classCallCheck(this, _class9); - - return _super8.apply(this, arguments); - } - - _createClass(_class9, [{ - key: "path", - value: function path(ctx) { - var cx = this.attribute('cx').toPixels('x'); - var cy = this.attribute('cy').toPixels('y'); - var r = this.attribute('r').toPixels(); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.arc(cx, cy, r, 0, Math.PI * 2, true); - ctx.closePath(); - } - - return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r); - } - }]); - - return _class9; - }(svg.Element.PathElementBase); // ellipse element - - - var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3); - - svg.Element.ellipse = /*#__PURE__*/function (_svg$Element$PathElem3) { - _inherits(_class10, _svg$Element$PathElem3); - - var _super9 = _createSuper(_class10); - - function _class10() { - _classCallCheck(this, _class10); - - return _super9.apply(this, arguments); - } - - _createClass(_class10, [{ - key: "path", - value: function path(ctx) { - var rx = this.attribute('rx').toPixels('x'); - var ry = this.attribute('ry').toPixels('y'); - var cx = this.attribute('cx').toPixels('x'); - var cy = this.attribute('cy').toPixels('y'); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(cx, cy - ry); - ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy); - ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry); - ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy); - ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry); - ctx.closePath(); - } - - return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry); - } - }]); - - return _class10; - }(svg.Element.PathElementBase); // line element - - - svg.Element.line = /*#__PURE__*/function (_svg$Element$PathElem4) { - _inherits(_class11, _svg$Element$PathElem4); - - var _super10 = _createSuper(_class11); - - function _class11() { - _classCallCheck(this, _class11); - - return _super10.apply(this, arguments); - } - - _createClass(_class11, [{ - key: "getPoints", - value: function getPoints() { - return [new svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')), new svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))]; - } - }, { - key: "path", - value: function path(ctx) { - var points = this.getPoints(); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(points[0].x, points[0].y); - ctx.lineTo(points[1].x, points[1].y); - } - - return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y); - } - }, { - key: "getMarkers", - value: function getMarkers() { - var points = this.getPoints(); - var a = points[0].angleTo(points[1]); - return [[points[0], a], [points[1], a]]; - } - }]); - - return _class11; - }(svg.Element.PathElementBase); // polyline element - - - svg.Element.polyline = /*#__PURE__*/function (_svg$Element$PathElem5) { - _inherits(_class12, _svg$Element$PathElem5); - - var _super11 = _createSuper(_class12); - - function _class12(node) { - var _this8; - - _classCallCheck(this, _class12); - - _this8 = _super11.call(this, node); - _this8.points = svg.CreatePath(_this8.attribute('points').value); - return _this8; - } - - _createClass(_class12, [{ - key: "path", - value: function path(ctx) { - var _this$points$ = this.points[0], - x = _this$points$.x, - y = _this$points$.y; - var bb = new svg.BoundingBox(x, y); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(x, y); - } - - for (var i = 1; i < this.points.length; i++) { - var _this$points$i = this.points[i], - _x = _this$points$i.x, - _y = _this$points$i.y; - bb.addPoint(_x, _y); - if (!isNullish(ctx)) ctx.lineTo(_x, _y); - } - - return bb; - } - }, { - key: "getMarkers", - value: function getMarkers() { - var markers = []; - - for (var i = 0; i < this.points.length - 1; i++) { - markers.push([this.points[i], this.points[i].angleTo(this.points[i + 1])]); - } - - markers.push([this.points[this.points.length - 1], markers[markers.length - 1][1]]); - return markers; - } - }]); - - return _class12; - }(svg.Element.PathElementBase); // polygon element - - - svg.Element.polygon = /*#__PURE__*/function (_svg$Element$polyline) { - _inherits(_class13, _svg$Element$polyline); - - var _super12 = _createSuper(_class13); - - function _class13() { - _classCallCheck(this, _class13); - - return _super12.apply(this, arguments); - } - - _createClass(_class13, [{ - key: "path", - value: function path(ctx) { - var bb = _get(_getPrototypeOf(_class13.prototype), "path", this).call(this, ctx); - - if (!isNullish(ctx)) { - ctx.lineTo(this.points[0].x, this.points[0].y); - ctx.closePath(); - } - - return bb; - } - }]); - - return _class13; - }(svg.Element.polyline); // path element - - - svg.Element.path = /*#__PURE__*/function (_svg$Element$PathElem6) { - _inherits(_class14, _svg$Element$PathElem6); - - var _super13 = _createSuper(_class14); - - function _class14(node) { - var _this9; - - _classCallCheck(this, _class14); - - _this9 = _super13.call(this, node); - - var d = _this9.attribute('d').value // TODO: convert to real lexer based on https://www.w3.org/TR/SVG11/paths.html#PathDataBNF - .replace(/,/gm, ' ') // get rid of all commas - .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands - .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands - .replace(/([MmZzLlHhVvCcSsQqTtAa])(\S)/gm, '$1 $2') // separate commands from points - .replace(/(\S)([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from points - .replace(/(\d)([+-])/gm, '$1 $2') // separate digits when no comma - .replace(/(\.\d*)(\.)/gm, '$1 $2') // separate digits when no comma - .replace(/([Aa](\s+\d+)(\s+\d+)(\s+\d+))\s+([01])\s*([01])/gm, '$1 $5 $6 '); // shorthand elliptical arc path syntax - - - d = svg.compressSpaces(d); // compress multiple spaces - - d = svg.trim(d); - _this9.PathParser = { - tokens: d.split(' '), - reset: function reset() { - this.i = -1; - this.command = ''; - this.previousCommand = ''; - this.start = new svg.Point(0, 0); - this.control = new svg.Point(0, 0); - this.current = new svg.Point(0, 0); - this.points = []; - this.angles = []; - }, - isEnd: function isEnd() { - return this.i >= this.tokens.length - 1; - }, - isCommandOrEnd: function isCommandOrEnd() { - if (this.isEnd()) return true; - return !isNullish(this.tokens[this.i + 1].match(/^[A-Za-z]$/)); - }, - isRelativeCommand: function isRelativeCommand() { - switch (this.command) { - case 'm': - case 'l': - case 'h': - case 'v': - case 'c': - case 's': - case 'q': - case 't': - case 'a': - case 'z': - return true; - } - - return false; - }, - getToken: function getToken() { - this.i++; - return this.tokens[this.i]; - }, - getScalar: function getScalar() { - return Number.parseFloat(this.getToken()); - }, - nextCommand: function nextCommand() { - this.previousCommand = this.command; - this.command = this.getToken(); - }, - getPoint: function getPoint() { - var p = new svg.Point(this.getScalar(), this.getScalar()); - return this.makeAbsolute(p); - }, - getAsControlPoint: function getAsControlPoint() { - var p = this.getPoint(); - this.control = p; - return p; - }, - getAsCurrentPoint: function getAsCurrentPoint() { - var p = this.getPoint(); - this.current = p; - return p; - }, - getReflectedControlPoint: function getReflectedControlPoint() { - if (this.previousCommand.toLowerCase() !== 'c' && this.previousCommand.toLowerCase() !== 's' && this.previousCommand.toLowerCase() !== 'q' && this.previousCommand.toLowerCase() !== 't') { - return this.current; - } // reflect point - - - var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); - return p; - }, - makeAbsolute: function makeAbsolute(p) { - if (this.isRelativeCommand()) { - p.x += this.current.x; - p.y += this.current.y; - } - - return p; - }, - addMarker: function addMarker(p, from, priorTo) { - // if the last angle isn't filled in because we didn't have this point yet ... - if (!isNullish(priorTo) && this.angles.length > 0 && isNullish(this.angles[this.angles.length - 1])) { - this.angles[this.angles.length - 1] = this.points[this.points.length - 1].angleTo(priorTo); - } - - this.addMarkerAngle(p, isNullish(from) ? null : from.angleTo(p)); - }, - addMarkerAngle: function addMarkerAngle(p, a) { - this.points.push(p); - this.angles.push(a); - }, - getMarkerPoints: function getMarkerPoints() { - return this.points; - }, - getMarkerAngles: function getMarkerAngles() { - for (var i = 0; i < this.angles.length; i++) { - if (isNullish(this.angles[i])) { - for (var j = i + 1; j < this.angles.length; j++) { - if (!isNullish(this.angles[j])) { - this.angles[i] = this.angles[j]; - break; - } - } - } - } - - return this.angles; - } - }; - return _this9; - } - - _createClass(_class14, [{ - key: "path", - value: function path(ctx) { - var pp = this.PathParser; - pp.reset(); - var bb = new svg.BoundingBox(); - if (!isNullish(ctx)) ctx.beginPath(); - - while (!pp.isEnd()) { - pp.nextCommand(); - - switch (pp.command) { - case 'M': - case 'm': - { - var p = pp.getAsCurrentPoint(); - pp.addMarker(p); - bb.addPoint(p.x, p.y); - if (!isNullish(ctx)) ctx.moveTo(p.x, p.y); - pp.start = pp.current; - - while (!pp.isCommandOrEnd()) { - var _p = pp.getAsCurrentPoint(); - - pp.addMarker(_p, pp.start); - bb.addPoint(_p.x, _p.y); - if (!isNullish(ctx)) ctx.lineTo(_p.x, _p.y); - } - - break; - } - - case 'L': - case 'l': - while (!pp.isCommandOrEnd()) { - var c = pp.current; - - var _p2 = pp.getAsCurrentPoint(); - - pp.addMarker(_p2, c); - bb.addPoint(_p2.x, _p2.y); - if (!isNullish(ctx)) ctx.lineTo(_p2.x, _p2.y); - } - - break; - - case 'H': - case 'h': - while (!pp.isCommandOrEnd()) { - var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y); - pp.addMarker(newP, pp.current); - pp.current = newP; - bb.addPoint(pp.current.x, pp.current.y); - if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y); - } - - break; - - case 'V': - case 'v': - while (!pp.isCommandOrEnd()) { - var _newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar()); - - pp.addMarker(_newP, pp.current); - pp.current = _newP; - bb.addPoint(pp.current.x, pp.current.y); - if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y); - } - - break; - - case 'C': - case 'c': - while (!pp.isCommandOrEnd()) { - var curr = pp.current; - var p1 = pp.getPoint(); - var cntrl = pp.getAsControlPoint(); - var cp = pp.getAsCurrentPoint(); - pp.addMarker(cp, cntrl, p1); - bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); - if (!isNullish(ctx)) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); - } - - break; - - case 'S': - case 's': - while (!pp.isCommandOrEnd()) { - var _curr = pp.current; - - var _p3 = pp.getReflectedControlPoint(); - - var _cntrl = pp.getAsControlPoint(); - - var _cp = pp.getAsCurrentPoint(); - - pp.addMarker(_cp, _cntrl, _p3); - bb.addBezierCurve(_curr.x, _curr.y, _p3.x, _p3.y, _cntrl.x, _cntrl.y, _cp.x, _cp.y); - if (!isNullish(ctx)) ctx.bezierCurveTo(_p3.x, _p3.y, _cntrl.x, _cntrl.y, _cp.x, _cp.y); - } - - break; - - case 'Q': - case 'q': - while (!pp.isCommandOrEnd()) { - var _curr2 = pp.current; - - var _cntrl2 = pp.getAsControlPoint(); - - var _cp2 = pp.getAsCurrentPoint(); - - pp.addMarker(_cp2, _cntrl2, _cntrl2); - bb.addQuadraticCurve(_curr2.x, _curr2.y, _cntrl2.x, _cntrl2.y, _cp2.x, _cp2.y); - if (!isNullish(ctx)) ctx.quadraticCurveTo(_cntrl2.x, _cntrl2.y, _cp2.x, _cp2.y); - } - - break; - - case 'T': - case 't': - while (!pp.isCommandOrEnd()) { - var _curr3 = pp.current; - - var _cntrl3 = pp.getReflectedControlPoint(); - - pp.control = _cntrl3; - - var _cp3 = pp.getAsCurrentPoint(); - - pp.addMarker(_cp3, _cntrl3, _cntrl3); - bb.addQuadraticCurve(_curr3.x, _curr3.y, _cntrl3.x, _cntrl3.y, _cp3.x, _cp3.y); - if (!isNullish(ctx)) ctx.quadraticCurveTo(_cntrl3.x, _cntrl3.y, _cp3.x, _cp3.y); - } - - break; - - case 'A': - case 'a': - var _loop2 = function _loop2() { - var curr = pp.current; - var rx = pp.getScalar(); - var ry = pp.getScalar(); - var xAxisRotation = pp.getScalar() * (Math.PI / 180.0); - var largeArcFlag = pp.getScalar(); - var sweepFlag = pp.getScalar(); - var cp = pp.getAsCurrentPoint(); // Conversion from endpoint to center parameterization - // https://www.w3.org/TR/SVG11/implnote.html#ArcConversionEndpointToCenter - // x1', y1' - - var currp = new svg.Point(Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0, -Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0); // adjust radii - - var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2); - - if (l > 1) { - rx *= Math.sqrt(l); - ry *= Math.sqrt(l); - } // cx', cy' - - - var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2))); - if (isNaN(s)) s = 0; - var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy - - var centp = new svg.Point((curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // vector magnitude - - var m = function m(v) { - return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2)); - }; // ratio between two vectors - - - var r = function r(u, v) { - return (u[0] * v[0] + u[1] * v[1]) / (m(u) * m(v)); - }; // angle between two vectors - - - var a = function a(u, v) { - return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(r(u, v)); - }; // initial angle - - - var a1 = a([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // angle delta - - var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]; - var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry]; - var ad = a(u, v); - if (r(u, v) <= -1) ad = Math.PI; - if (r(u, v) >= 1) ad = 0; // for markers - - var dir = 1 - sweepFlag ? 1.0 : -1.0; - var ah = a1 + dir * (ad / 2.0); - var halfWay = new svg.Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah)); - pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2); - pp.addMarkerAngle(cp, ah - dir * Math.PI); - bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better - - if (!isNullish(ctx)) { - var _r = rx > ry ? rx : ry; - - var sx = rx > ry ? 1 : rx / ry; - var sy = rx > ry ? ry / rx : 1; - ctx.translate(centp.x, centp.y); - ctx.rotate(xAxisRotation); - ctx.scale(sx, sy); - ctx.arc(0, 0, _r, a1, a1 + ad, 1 - sweepFlag); - ctx.scale(1 / sx, 1 / sy); - ctx.rotate(-xAxisRotation); - ctx.translate(-centp.x, -centp.y); - } - }; - - while (!pp.isCommandOrEnd()) { - _loop2(); - } - - break; - - case 'Z': - case 'z': - if (!isNullish(ctx)) ctx.closePath(); - pp.current = pp.start; - } - } - - return bb; - } - }, { - key: "getMarkers", - value: function getMarkers() { - var points = this.PathParser.getMarkerPoints(); - var angles = this.PathParser.getMarkerAngles(); - var markers = points.map(function (point, i) { - return [point, angles[i]]; - }); - return markers; - } - }]); - - return _class14; - }(svg.Element.PathElementBase); // pattern element - - - svg.Element.pattern = /*#__PURE__*/function (_svg$Element$ElementB2) { - _inherits(_class15, _svg$Element$ElementB2); - - var _super14 = _createSuper(_class15); - - function _class15() { - _classCallCheck(this, _class15); - - return _super14.apply(this, arguments); - } - - _createClass(_class15, [{ - key: "createPattern", - value: function createPattern(ctx, element) { - var width = this.attribute('width').toPixels('x', true); - var height = this.attribute('height').toPixels('y', true); // render me using a temporary svg element - - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value); - tempSvg.attributes.width = new svg.Property('width', width + 'px'); - tempSvg.attributes.height = new svg.Property('height', height + 'px'); - tempSvg.attributes.transform = new svg.Property('transform', this.attribute('patternTransform').value); - tempSvg.children = this.children; - var c = document.createElement('canvas'); - c.width = width; - c.height = height; - var cctx = c.getContext('2d'); - - if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) { - cctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true)); - } // render 3x3 grid so when we transform there's no white space on edges - - - for (var x = -1; x <= 1; x++) { - for (var y = -1; y <= 1; y++) { - cctx.save(); - cctx.translate(x * c.width, y * c.height); - tempSvg.render(cctx); - cctx.restore(); - } - } - - var pattern = ctx.createPattern(c, 'repeat'); - return pattern; - } - }]); - - return _class15; - }(svg.Element.ElementBase); // marker element - - - svg.Element.marker = /*#__PURE__*/function (_svg$Element$ElementB3) { - _inherits(_class16, _svg$Element$ElementB3); - - var _super15 = _createSuper(_class16); - - function _class16() { - _classCallCheck(this, _class16); - - return _super15.apply(this, arguments); - } - - _createClass(_class16, [{ - key: "render", - value: function render(ctx, point, angle) { - ctx.translate(point.x, point.y); - if (this.attribute('orient').valueOrDefault('auto') === 'auto') ctx.rotate(angle); - if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth); - ctx.save(); // render me using a temporary svg element - - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value); - tempSvg.attributes.refX = new svg.Property('refX', this.attribute('refX').value); - tempSvg.attributes.refY = new svg.Property('refY', this.attribute('refY').value); - tempSvg.attributes.width = new svg.Property('width', this.attribute('markerWidth').value); - tempSvg.attributes.height = new svg.Property('height', this.attribute('markerHeight').value); - tempSvg.attributes.fill = new svg.Property('fill', this.attribute('fill').valueOrDefault('black')); - tempSvg.attributes.stroke = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none')); - tempSvg.children = this.children; - tempSvg.render(ctx); - ctx.restore(); - if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth); - - if (this.attribute('orient').valueOrDefault('auto') === 'auto') { - ctx.rotate(-angle); - } - - ctx.translate(-point.x, -point.y); - } - }]); - - return _class16; - }(svg.Element.ElementBase); // definitions element - - - svg.Element.defs = /*#__PURE__*/function (_svg$Element$ElementB4) { - _inherits(_class17, _svg$Element$ElementB4); - - var _super16 = _createSuper(_class17); - - function _class17() { - _classCallCheck(this, _class17); - - return _super16.apply(this, arguments); - } - - _createClass(_class17, [{ - key: "render", - value: function render(ctx) {// NOOP - } - }]); - - return _class17; - }(svg.Element.ElementBase); // base for gradients - - - svg.Element.GradientBase = /*#__PURE__*/function (_svg$Element$ElementB5) { - _inherits(_class18, _svg$Element$ElementB5); - - var _super17 = _createSuper(_class18); - - function _class18(node) { - var _this10; - - _classCallCheck(this, _class18); - - _this10 = _super17.call(this, node); - _this10.gradientUnits = _this10.attribute('gradientUnits').valueOrDefault('objectBoundingBox'); - _this10.stops = []; - - _this10.children.forEach(function (child) { - if (child.type === 'stop') { - _this10.stops.push(child); - } - }); - - return _this10; - } - - _createClass(_class18, [{ - key: "getGradient", - value: function getGradient() {// OVERRIDE ME! - } - }, { - key: "createGradient", - value: function createGradient(ctx, element, parentOpacityProp) { - var stopsContainer = this.getHrefAttribute().hasValue() ? this.getHrefAttribute().getDefinition() : this; - - var addParentOpacity = function addParentOpacity(color) { - if (parentOpacityProp.hasValue()) { - var p = new svg.Property('color', color); - return p.addOpacity(parentOpacityProp).value; - } - - return color; - }; - - var g = this.getGradient(ctx, element); - if (isNullish(g)) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color); - stopsContainer.stops.forEach(function (_ref10) { - var offset = _ref10.offset, - color = _ref10.color; - g.addColorStop(offset, addParentOpacity(color)); - }); - - if (this.attribute('gradientTransform').hasValue()) { - // render as transformed pattern on temporary canvas - var rootView = svg.ViewPort.viewPorts[0]; - var rect = new svg.Element.rect(); - rect.attributes.x = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS / 3.0); - rect.attributes.y = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS / 3.0); - rect.attributes.width = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS); - rect.attributes.height = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS); - var group = new svg.Element.g(); - group.attributes.transform = new svg.Property('transform', this.attribute('gradientTransform').value); - group.children = [rect]; - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.x = new svg.Property('x', 0); - tempSvg.attributes.y = new svg.Property('y', 0); - tempSvg.attributes.width = new svg.Property('width', rootView.width); - tempSvg.attributes.height = new svg.Property('height', rootView.height); - tempSvg.children = [group]; - var c = document.createElement('canvas'); - c.width = rootView.width; - c.height = rootView.height; - var tempCtx = c.getContext('2d'); - tempCtx.fillStyle = g; - tempSvg.render(tempCtx); - return tempCtx.createPattern(c, 'no-repeat'); - } - - return g; - } - }]); - - return _class18; - }(svg.Element.ElementBase); // linear gradient element - - - svg.Element.linearGradient = /*#__PURE__*/function (_svg$Element$Gradient) { - _inherits(_class19, _svg$Element$Gradient); - - var _super18 = _createSuper(_class19); - - function _class19() { - _classCallCheck(this, _class19); - - return _super18.apply(this, arguments); - } - - _createClass(_class19, [{ - key: "getGradient", - value: function getGradient(ctx, element) { - var useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox; - var bb = useBB ? element.getBoundingBox() : null; - - if (!this.attribute('x1').hasValue() && !this.attribute('y1').hasValue() && !this.attribute('x2').hasValue() && !this.attribute('y2').hasValue()) { - this.attribute('x1', true).value = 0; - this.attribute('y1', true).value = 0; - this.attribute('x2', true).value = 1; - this.attribute('y2', true).value = 0; - } - - var x1 = useBB ? bb.x() + bb.width() * this.attribute('x1').numValue() : this.attribute('x1').toPixels('x'); - var y1 = useBB ? bb.y() + bb.height() * this.attribute('y1').numValue() : this.attribute('y1').toPixels('y'); - var x2 = useBB ? bb.x() + bb.width() * this.attribute('x2').numValue() : this.attribute('x2').toPixels('x'); - var y2 = useBB ? bb.y() + bb.height() * this.attribute('y2').numValue() : this.attribute('y2').toPixels('y'); - if (x1 === x2 && y1 === y2) return null; - return ctx.createLinearGradient(x1, y1, x2, y2); - } - }]); - - return _class19; - }(svg.Element.GradientBase); // radial gradient element - - - svg.Element.radialGradient = /*#__PURE__*/function (_svg$Element$Gradient2) { - _inherits(_class20, _svg$Element$Gradient2); - - var _super19 = _createSuper(_class20); - - function _class20() { - _classCallCheck(this, _class20); - - return _super19.apply(this, arguments); - } - - _createClass(_class20, [{ - key: "getGradient", - value: function getGradient(ctx, element) { - var useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox; - var bb = useBB ? element.getBoundingBox() : null; - if (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%'; - if (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%'; - if (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%'; - var cx = useBB ? bb.x() + bb.width() * this.attribute('cx').numValue() : this.attribute('cx').toPixels('x'); - var cy = useBB ? bb.y() + bb.height() * this.attribute('cy').numValue() : this.attribute('cy').toPixels('y'); - var fx = cx; - var fy = cy; - - if (this.attribute('fx').hasValue()) { - fx = useBB ? bb.x() + bb.width() * this.attribute('fx').numValue() : this.attribute('fx').toPixels('x'); - } - - if (this.attribute('fy').hasValue()) { - fy = useBB ? bb.y() + bb.height() * this.attribute('fy').numValue() : this.attribute('fy').toPixels('y'); - } - - var r = useBB ? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue() : this.attribute('r').toPixels(); - return ctx.createRadialGradient(fx, fy, 0, cx, cy, r); - } - }]); - - return _class20; - }(svg.Element.GradientBase); // gradient stop element - - - svg.Element.stop = /*#__PURE__*/function (_svg$Element$ElementB6) { - _inherits(_class21, _svg$Element$ElementB6); - - var _super20 = _createSuper(_class21); - - function _class21(node) { - var _this11; - - _classCallCheck(this, _class21); - - _this11 = _super20.call(this, node); - _this11.offset = _this11.attribute('offset').numValue(); - if (_this11.offset < 0) _this11.offset = 0; - if (_this11.offset > 1) _this11.offset = 1; - - var stopColor = _this11.style('stop-color'); - - if (_this11.style('stop-opacity').hasValue()) { - stopColor = stopColor.addOpacity(_this11.style('stop-opacity')); - } - - _this11.color = stopColor.value; - return _this11; - } - - return _class21; - }(svg.Element.ElementBase); // animation base element - - - svg.Element.AnimateBase = /*#__PURE__*/function (_svg$Element$ElementB7) { - _inherits(_class22, _svg$Element$ElementB7); - - var _super21 = _createSuper(_class22); - - function _class22(node) { - var _this12; - - _classCallCheck(this, _class22); - - _this12 = _super21.call(this, node); - svg.Animations.push(_assertThisInitialized(_this12)); - _this12.duration = 0.0; - _this12.begin = _this12.attribute('begin').toMilliseconds(); - _this12.maxDuration = _this12.begin + _this12.attribute('dur').toMilliseconds(); - _this12.initialValue = null; - _this12.initialUnits = ''; - _this12.removed = false; - _this12.from = _this12.attribute('from'); - _this12.to = _this12.attribute('to'); - _this12.values = _this12.attribute('values'); - if (_this12.values.hasValue()) _this12.values.value = _this12.values.value.split(';'); - return _this12; - } - - _createClass(_class22, [{ - key: "getProperty", - value: function getProperty() { - var attributeType = this.attribute('attributeType').value; - var attributeName = this.attribute('attributeName').value; - - if (attributeType === 'CSS') { - return this.parent.style(attributeName, true); - } - - return this.parent.attribute(attributeName, true); - } - }, { - key: "calcValue", - value: function calcValue() { - // OVERRIDE ME! - return ''; - } - }, { - key: "update", - value: function update(delta) { - // set initial value - if (isNullish(this.initialValue)) { - this.initialValue = this.getProperty().value; - this.initialUnits = this.getProperty().getUnits(); - } // if we're past the end time - - - if (this.duration > this.maxDuration) { - // loop for indefinitely repeating animations - if (this.attribute('repeatCount').value === 'indefinite' || this.attribute('repeatDur').value === 'indefinite') { - this.duration = 0.0; - } else if (this.attribute('fill').valueOrDefault('remove') === 'freeze' && !this.frozen) { - this.frozen = true; - this.parent.animationFrozen = true; - this.parent.animationFrozenValue = this.getProperty().value; - } else if (this.attribute('fill').valueOrDefault('remove') === 'remove' && !this.removed) { - this.removed = true; - this.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue; - return true; - } - - return false; - } - - this.duration += delta; // if we're past the begin time - - var updated = false; - - if (this.begin < this.duration) { - var newValue = this.calcValue(); // tween - - if (this.attribute('type').hasValue()) { - // for transform, etc. - var type = this.attribute('type').value; - newValue = type + '(' + newValue + ')'; - } - - this.getProperty().value = newValue; - updated = true; - } - - return updated; - } // fraction of duration we've covered - - }, { - key: "progress", - value: function progress() { - var ret = { - progress: (this.duration - this.begin) / (this.maxDuration - this.begin) - }; - - if (this.values.hasValue()) { - var p = ret.progress * (this.values.value.length - 1); - var lb = Math.floor(p), - ub = Math.ceil(p); - ret.from = new svg.Property('from', Number.parseFloat(this.values.value[lb])); - ret.to = new svg.Property('to', Number.parseFloat(this.values.value[ub])); - ret.progress = (p - lb) / (ub - lb); - } else { - ret.from = this.from; - ret.to = this.to; - } - - return ret; - } - }]); - - return _class22; - }(svg.Element.ElementBase); // animate element - - - svg.Element.animate = /*#__PURE__*/function (_svg$Element$AnimateB) { - _inherits(_class23, _svg$Element$AnimateB); - - var _super22 = _createSuper(_class23); - - function _class23() { - _classCallCheck(this, _class23); - - return _super22.apply(this, arguments); - } - - _createClass(_class23, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); // tween value linearly - - var newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress; - return newValue + this.initialUnits; - } - }]); - - return _class23; - }(svg.Element.AnimateBase); // animate color element - - - svg.Element.animateColor = /*#__PURE__*/function (_svg$Element$AnimateB2) { - _inherits(_class24, _svg$Element$AnimateB2); - - var _super23 = _createSuper(_class24); - - function _class24() { - _classCallCheck(this, _class24); - - return _super23.apply(this, arguments); - } - - _createClass(_class24, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); - var from = new RGBColor(p.from.value); - var to = new RGBColor(p.to.value); - - if (from.ok && to.ok) { - // tween color linearly - var r = from.r + (to.r - from.r) * p.progress; - var g = from.g + (to.g - from.g) * p.progress; - var b = from.b + (to.b - from.b) * p.progress; - return 'rgb(' + Number.parseInt(r) + ',' + Number.parseInt(g) + ',' + Number.parseInt(b) + ')'; - } - - return this.attribute('from').value; - } - }]); - - return _class24; - }(svg.Element.AnimateBase); // animate transform element - - - svg.Element.animateTransform = /*#__PURE__*/function (_svg$Element$animate) { - _inherits(_class25, _svg$Element$animate); - - var _super24 = _createSuper(_class25); - - function _class25() { - _classCallCheck(this, _class25); - - return _super24.apply(this, arguments); - } - - _createClass(_class25, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); // tween value linearly - - var from = svg.ToNumberArray(p.from.value); - var to = svg.ToNumberArray(p.to.value); - var newValue = ''; - from.forEach(function (fr, i) { - newValue += fr + (to[i] - fr) * p.progress + ' '; - }); - return newValue; - } - }]); - - return _class25; - }(svg.Element.animate); // font element - - - svg.Element.font = /*#__PURE__*/function (_svg$Element$ElementB8) { - _inherits(_class26, _svg$Element$ElementB8); - - var _super25 = _createSuper(_class26); - - function _class26(node) { - var _this13; - - _classCallCheck(this, _class26); - - _this13 = _super25.call(this, node); - _this13.horizAdvX = _this13.attribute('horiz-adv-x').numValue(); - _this13.isRTL = false; - _this13.isArabic = false; - _this13.fontFace = null; - _this13.missingGlyph = null; - _this13.glyphs = []; - - _this13.children.forEach(function (child) { - if (child.type === 'font-face') { - _this13.fontFace = child; - - if (child.style('font-family').hasValue()) { - svg.Definitions[child.style('font-family').value] = _assertThisInitialized(_this13); - } - } else if (child.type === 'missing-glyph') { - _this13.missingGlyph = child; - } else if (child.type === 'glyph') { - if (child.arabicForm !== '') { - _this13.isRTL = true; - _this13.isArabic = true; - - if (typeof _this13.glyphs[child.unicode] === 'undefined') { - _this13.glyphs[child.unicode] = []; - } - - _this13.glyphs[child.unicode][child.arabicForm] = child; - } else { - _this13.glyphs[child.unicode] = child; - } - } - }); - - return _this13; - } - - return _class26; - }(svg.Element.ElementBase); // font-face element - - - svg.Element.fontface = /*#__PURE__*/function (_svg$Element$ElementB9) { - _inherits(_class27, _svg$Element$ElementB9); - - var _super26 = _createSuper(_class27); - - function _class27(node) { - var _this14; - - _classCallCheck(this, _class27); - - _this14 = _super26.call(this, node); - _this14.ascent = _this14.attribute('ascent').value; - _this14.descent = _this14.attribute('descent').value; - _this14.unitsPerEm = _this14.attribute('units-per-em').numValue(); - return _this14; - } - - return _class27; - }(svg.Element.ElementBase); // missing-glyph element - - - svg.Element.missingglyph = /*#__PURE__*/function (_svg$Element$path) { - _inherits(_class28, _svg$Element$path); - - var _super27 = _createSuper(_class28); - - function _class28(node) { - var _this15; - - _classCallCheck(this, _class28); - - _this15 = _super27.call(this, node); - _this15.horizAdvX = 0; - return _this15; - } - - return _class28; - }(svg.Element.path); // glyph element - - - svg.Element.glyph = /*#__PURE__*/function (_svg$Element$path2) { - _inherits(_class29, _svg$Element$path2); - - var _super28 = _createSuper(_class29); - - function _class29(node) { - var _this16; - - _classCallCheck(this, _class29); - - _this16 = _super28.call(this, node); - _this16.horizAdvX = _this16.attribute('horiz-adv-x').numValue(); - _this16.unicode = _this16.attribute('unicode').value; - _this16.arabicForm = _this16.attribute('arabic-form').value; - return _this16; - } - - return _class29; - }(svg.Element.path); // text element - - - svg.Element.text = /*#__PURE__*/function (_svg$Element$Rendered3) { - _inherits(_class30, _svg$Element$Rendered3); - - var _super29 = _createSuper(_class30); - - function _class30(node) { - _classCallCheck(this, _class30); - - return _super29.call(this, node, true); - } - - _createClass(_class30, [{ - key: "setContext", - value: function setContext(ctx) { - _get(_getPrototypeOf(_class30.prototype), "setContext", this).call(this, ctx); - - var textBaseline = this.style('dominant-baseline').toTextBaseline(); - if (isNullish(textBaseline)) textBaseline = this.style('alignment-baseline').toTextBaseline(); - if (!isNullish(textBaseline)) ctx.textBaseline = textBaseline; - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - return new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y); - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var _this17 = this; - - this.x = this.attribute('x').toPixels('x'); - this.y = this.attribute('y').toPixels('y'); - this.x += this.getAnchorDelta(ctx, this, 0); - this.children.forEach(function (child, i) { - _this17.renderChild(ctx, _this17, i); - }); - } - }, { - key: "getAnchorDelta", - value: function getAnchorDelta(ctx, parent, startI) { - var textAnchor = this.style('text-anchor').valueOrDefault('start'); - - if (textAnchor !== 'start') { - var width = 0; - - for (var i = startI; i < parent.children.length; i++) { - var child = parent.children[i]; - if (i > startI && child.attribute('x').hasValue()) break; // new group - - width += child.measureTextRecursive(ctx); - } - - return -1 * (textAnchor === 'end' ? width : width / 2.0); - } - - return 0; - } - }, { - key: "renderChild", - value: function renderChild(ctx, parent, i) { - var child = parent.children[i]; - - if (child.attribute('x').hasValue()) { - child.x = child.attribute('x').toPixels('x') + this.getAnchorDelta(ctx, parent, i); - if (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x'); - } else { - if (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x'); - if (child.attribute('dx').hasValue()) this.x += child.attribute('dx').toPixels('x'); - child.x = this.x; - } - - this.x = child.x + child.measureText(ctx); - - if (child.attribute('y').hasValue()) { - child.y = child.attribute('y').toPixels('y'); - if (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y'); - } else { - if (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y'); - if (child.attribute('dy').hasValue()) this.y += child.attribute('dy').toPixels('y'); - child.y = this.y; - } - - this.y = child.y; - child.render(ctx); - - for (var j = 0; j < child.children.length; j++) { - this.renderChild(ctx, child, j); - } - } - }]); - - return _class30; - }(svg.Element.RenderedElementBase); // text base - - - svg.Element.TextElementBase = /*#__PURE__*/function (_svg$Element$Rendered4) { - _inherits(_class31, _svg$Element$Rendered4); - - var _super30 = _createSuper(_class31); - - function _class31() { - _classCallCheck(this, _class31); - - return _super30.apply(this, arguments); - } - - _createClass(_class31, [{ - key: "getGlyph", - value: function getGlyph(font, text, i) { - var c = text[i]; - var glyph = null; - - if (font.isArabic) { - var arabicForm = 'isolated'; - if ((i === 0 || text[i - 1] === ' ') && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'terminal'; - if (i > 0 && text[i - 1] !== ' ' && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'medial'; - if (i > 0 && text[i - 1] !== ' ' && (i === text.length - 1 || text[i + 1] === ' ')) arabicForm = 'initial'; - - if (typeof font.glyphs[c] !== 'undefined') { - glyph = font.glyphs[c][arabicForm]; - if (isNullish(glyph) && font.glyphs[c].type === 'glyph') glyph = font.glyphs[c]; - } - } else { - glyph = font.glyphs[c]; - } - - if (isNullish(glyph)) glyph = font.missingGlyph; - return glyph; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var customFont = this.parent.style('font-family').getDefinition(); - - if (!isNullish(customFont)) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); - var text = this.getText(); - if (customFont.isRTL) text = text.split('').reverse().join(''); - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - - for (var i = 0; i < text.length; i++) { - var glyph = this.getGlyph(customFont, text, i); - var scale = fontSize / customFont.fontFace.unitsPerEm; - ctx.translate(this.x, this.y); - ctx.scale(scale, -scale); - var lw = ctx.lineWidth; - ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize; - if (fontStyle === 'italic') ctx.transform(1, 0, 0.4, 1, 0, 0); - glyph.render(ctx); - if (fontStyle === 'italic') ctx.transform(1, 0, -0.4, 1, 0, 0); - ctx.lineWidth = lw; - ctx.scale(1 / scale, -1 / scale); - ctx.translate(-this.x, -this.y); - this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm; - - if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) { - this.x += dx[i]; - } - } - - return; - } - - if (ctx.fillStyle !== '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y); - if (ctx.strokeStyle !== '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y); - } - }, { - key: "getText", - value: function getText() {// OVERRIDE ME - } - }, { - key: "measureTextRecursive", - value: function measureTextRecursive(ctx) { - var width = this.measureText(ctx); - this.children.forEach(function (child) { - width += child.measureTextRecursive(ctx); - }); - return width; - } - }, { - key: "measureText", - value: function measureText(ctx) { - var customFont = this.parent.style('font-family').getDefinition(); - - if (!isNullish(customFont)) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var measure = 0; - var text = this.getText(); - if (customFont.isRTL) text = text.split('').reverse().join(''); - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - - for (var i = 0; i < text.length; i++) { - var glyph = this.getGlyph(customFont, text, i); - measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm; - - if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) { - measure += dx[i]; - } - } - - return measure; - } - - var textToMeasure = svg.compressSpaces(this.getText()); - if (!ctx.measureText) return textToMeasure.length * 10; - ctx.save(); - this.setContext(ctx); - - var _ctx$measureText = ctx.measureText(textToMeasure), - width = _ctx$measureText.width; - - ctx.restore(); - return width; - } - }]); - - return _class31; - }(svg.Element.RenderedElementBase); // tspan - - - svg.Element.tspan = /*#__PURE__*/function (_svg$Element$TextElem) { - _inherits(_class32, _svg$Element$TextElem); - - var _super31 = _createSuper(_class32); - - function _class32(node) { - var _this18; - - _classCallCheck(this, _class32); - - _this18 = _super31.call(this, node, true); - _this18.text = node.nodeValue || node.text || ''; - return _this18; - } - - _createClass(_class32, [{ - key: "getText", - value: function getText() { - return this.text; - } - }]); - - return _class32; - }(svg.Element.TextElementBase); // tref - - - svg.Element.tref = /*#__PURE__*/function (_svg$Element$TextElem2) { - _inherits(_class33, _svg$Element$TextElem2); - - var _super32 = _createSuper(_class33); - - function _class33() { - _classCallCheck(this, _class33); - - return _super32.apply(this, arguments); - } - - _createClass(_class33, [{ - key: "getText", - value: function getText() { - var element = this.getHrefAttribute().getDefinition(); - if (!isNullish(element)) return element.children[0].getText(); - return undefined; - } - }]); - - return _class33; - }(svg.Element.TextElementBase); // a element - - - svg.Element.a = /*#__PURE__*/function (_svg$Element$TextElem3) { - _inherits(_class34, _svg$Element$TextElem3); - - var _super33 = _createSuper(_class34); - - function _class34(node) { - var _this19; - - _classCallCheck(this, _class34); - - _this19 = _super33.call(this, node); - _this19.hasText = true; - - _toConsumableArray(node.childNodes).forEach(function (childNode) { - if (childNode.nodeType !== 3) { - _this19.hasText = false; - } - }); // this might contain text - - - _this19.text = _this19.hasText ? node.childNodes[0].nodeValue : ''; - return _this19; - } - - _createClass(_class34, [{ - key: "getText", - value: function getText() { - return this.text; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - if (this.hasText) { - // render as text element - _get(_getPrototypeOf(_class34.prototype), "renderChildren", this).call(this, ctx); - - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y)); - } else { - // render as temporary group - var g = new svg.Element.g(); - g.children = this.children; - g.parent = this; - g.render(ctx); - } - } - }, { - key: "onclick", - value: function onclick() { - window.open(this.getHrefAttribute().value); - } - }, { - key: "onmousemove", - value: function onmousemove() { - svg.ctx.canvas.style.cursor = 'pointer'; - } - }]); - - return _class34; - }(svg.Element.TextElementBase); // image element - - - svg.Element.image = /*#__PURE__*/function (_svg$Element$Rendered5) { - _inherits(_class35, _svg$Element$Rendered5); - - var _super34 = _createSuper(_class35); - - function _class35(node) { - var _this20; - - _classCallCheck(this, _class35); - - _this20 = _super34.call(this, node); - - var href = _this20.getHrefAttribute().value; - - if (href === '') { - return _possibleConstructorReturn(_this20); - } - - _this20._isSvg = href.match(/\.svg$/); - svg.Images.push(_assertThisInitialized(_this20)); - _this20.loaded = false; - - if (!_this20._isSvg) { - _this20.img = document.createElement('img'); - - if (svg.opts.useCORS === true) { - _this20.img.crossOrigin = 'Anonymous'; - } - - _this20.img.addEventListener('load', function () { - _this20.loaded = true; - }); - - _this20.img.addEventListener('error', function () { - svg.log('ERROR: image "' + href + '" not found'); - _this20.loaded = true; - }); - - _this20.img.src = href; - } else { - svg.ajax(href, true).then(function (img) { - // eslint-disable-line promise/prefer-await-to-then, promise/always-return - _this20.img = img; - _this20.loaded = true; - })["catch"](function (err) { - // eslint-disable-line promise/prefer-await-to-callbacks - _this20.erred = true; - console.error('Ajax error for canvg', err); // eslint-disable-line no-console - }); - } - - return _this20; - } - - _createClass(_class35, [{ - key: "renderChildren", - value: function renderChildren(ctx) { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - if (width === 0 || height === 0) return; - ctx.save(); - - if (this._isSvg) { - ctx.drawSvg(this.img, x, y, width, height); - } else { - ctx.translate(x, y); - svg.AspectRatio(ctx, this.attribute('preserveAspectRatio').value, width, this.img.width, height, this.img.height, 0, 0); - ctx.drawImage(this.img, 0, 0); - } - - ctx.restore(); - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - return new svg.BoundingBox(x, y, x + width, y + height); - } - }]); - - return _class35; - }(svg.Element.RenderedElementBase); // group element - - - svg.Element.g = /*#__PURE__*/function (_svg$Element$Rendered6) { - _inherits(_class36, _svg$Element$Rendered6); - - var _super35 = _createSuper(_class36); - - function _class36() { - _classCallCheck(this, _class36); - - return _super35.apply(this, arguments); - } - - _createClass(_class36, [{ - key: "getBoundingBox", - value: function getBoundingBox() { - var bb = new svg.BoundingBox(); - this.children.forEach(function (child) { - bb.addBoundingBox(child.getBoundingBox()); - }); - return bb; - } - }]); - - return _class36; - }(svg.Element.RenderedElementBase); // symbol element - - - svg.Element.symbol = /*#__PURE__*/function (_svg$Element$Rendered7) { - _inherits(_class37, _svg$Element$Rendered7); - - var _super36 = _createSuper(_class37); - - function _class37() { - _classCallCheck(this, _class37); - - return _super36.apply(this, arguments); - } - - _createClass(_class37, [{ - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class37; - }(svg.Element.RenderedElementBase); // style element - - - svg.Element.style = /*#__PURE__*/function (_svg$Element$ElementB10) { - _inherits(_class38, _svg$Element$ElementB10); - - var _super37 = _createSuper(_class38); - - function _class38(node) { - var _this21; - - _classCallCheck(this, _class38); - - _this21 = _super37.call(this, node); // text, or spaces then CDATA - - var css = ''; - - _toConsumableArray(node.childNodes).forEach(function (_ref11) { - var nodeValue = _ref11.nodeValue; - css += nodeValue; - }); // remove comments - - - css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(^\s*\/\/.*)/gm, ''); // eslint-disable-line unicorn/no-unsafe-regex - // replace whitespace - - css = svg.compressSpaces(css); - var cssDefs = css.split('}'); - cssDefs.forEach(function (cssDef) { - if (svg.trim(cssDef) !== '') { - var _cssDef$split = cssDef.split('{'), - _cssDef$split2 = _slicedToArray(_cssDef$split, 2), - cssClasses = _cssDef$split2[0], - cssProps = _cssDef$split2[1]; - - cssClasses = cssClasses.split(','); - cssProps = cssProps.split(';'); - cssClasses.forEach(function (cssClass) { - cssClass = svg.trim(cssClass); - - if (cssClass !== '') { - var props = {}; - cssProps.forEach(function (cssProp) { - var prop = cssProp.indexOf(':'); - var name = cssProp.substr(0, prop); - var value = cssProp.substr(prop + 1, cssProp.length - prop); - - if (!isNullish(name) && !isNullish(value)) { - props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value)); - } - }); - svg.Styles[cssClass] = props; - - if (cssClass === '@font-face') { - var fontFamily = props['font-family'].value.replace(/"/g, ''); - var srcs = props.src.value.split(','); - srcs.forEach(function (src) { - if (src.includes('format("svg")')) { - var urlStart = src.indexOf('url'); - var urlEnd = src.indexOf(')', urlStart); - var url = src.substr(urlStart + 5, urlEnd - urlStart - 6); // Can this ajax safely be converted to async? - - var doc = svg.parseXml(svg.ajax(url)); - var fonts = doc.getElementsByTagName('font'); - - _toConsumableArray(fonts).forEach(function (font) { - font = svg.CreateElement(font); - svg.Definitions[fontFamily] = font; - }); - } - }); - } - } - }); - } - }); - return _this21; - } - - return _class38; - }(svg.Element.ElementBase); // use element - - - svg.Element.use = /*#__PURE__*/function (_svg$Element$Rendered8) { - _inherits(_class39, _svg$Element$Rendered8); - - var _super38 = _createSuper(_class39); - - function _class39(node) { - var _this22; - - _classCallCheck(this, _class39); - - _this22 = _super38.call(this, node); - _this22._el = _this22.getHrefAttribute().getDefinition(); - return _this22; - } - - _createClass(_class39, [{ - key: "setContext", - value: function setContext(ctx) { - _get(_getPrototypeOf(_class39.prototype), "setContext", this).call(this, ctx); - - if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0); - if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y')); - } - }, { - key: "path", - value: function path(ctx) { - var element = this._el; - if (!isNullish(element)) element.path(ctx); - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var element = this._el; - if (!isNullish(element)) return element.getBoundingBox(); - return undefined; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var element = this._el; - - if (!isNullish(element)) { - var tempSvg = element; - - if (element.type === 'symbol') { - // render me using a temporary svg element in symbol cases - // (https://www.w3.org/TR/SVG/struct.html#UseElement) - tempSvg = new svg.Element.svg(); - tempSvg.type = 'svg'; - tempSvg.attributes.viewBox = new svg.Property('viewBox', element.attribute('viewBox').value); - tempSvg.attributes.preserveAspectRatio = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value); - tempSvg.attributes.overflow = new svg.Property('overflow', element.attribute('overflow').value); - tempSvg.children = element.children; - } - - if (tempSvg.type === 'svg') { - // if symbol or svg, inherit width/height from me - if (this.attribute('width').hasValue()) { - tempSvg.attributes.width = new svg.Property('width', this.attribute('width').value); - } - - if (this.attribute('height').hasValue()) { - tempSvg.attributes.height = new svg.Property('height', this.attribute('height').value); - } - } - - var oldParent = tempSvg.parent; - tempSvg.parent = null; - tempSvg.render(ctx); - tempSvg.parent = oldParent; - } - } - }]); - - return _class39; - }(svg.Element.RenderedElementBase); // mask element - - - svg.Element.mask = /*#__PURE__*/function (_svg$Element$ElementB11) { - _inherits(_class40, _svg$Element$ElementB11); - - var _super39 = _createSuper(_class40); - - function _class40() { - _classCallCheck(this, _class40); - - return _super39.apply(this, arguments); - } - - _createClass(_class40, [{ - key: "apply", - value: function apply(ctx, element) { - // render as temp svg - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - - if (width === 0 && height === 0) { - var bb = new svg.BoundingBox(); - this.children.forEach(function (child) { - bb.addBoundingBox(child.getBoundingBox()); - }); - x = Math.floor(bb.x1); - y = Math.floor(bb.y1); - width = Math.floor(bb.width()); - height = Math.floor(bb.height()); - } // temporarily remove mask to avoid recursion - - - var mask = element.attribute('mask').value; - element.attribute('mask').value = ''; - var cMask = document.createElement('canvas'); - cMask.width = x + width; - cMask.height = y + height; - var maskCtx = cMask.getContext('2d'); - this.renderChildren(maskCtx); - var c = document.createElement('canvas'); - c.width = x + width; - c.height = y + height; - var tempCtx = c.getContext('2d'); - element.render(tempCtx); - tempCtx.globalCompositeOperation = 'destination-in'; - tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat'); - tempCtx.fillRect(0, 0, x + width, y + height); - ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat'); - ctx.fillRect(0, 0, x + width, y + height); // reassign mask - - element.attribute('mask').value = mask; - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class40; - }(svg.Element.ElementBase); // clip element - - - svg.Element.clipPath = /*#__PURE__*/function (_svg$Element$ElementB12) { - _inherits(_class41, _svg$Element$ElementB12); - - var _super40 = _createSuper(_class41); - - function _class41() { - _classCallCheck(this, _class41); - - return _super40.apply(this, arguments); - } - - _createClass(_class41, [{ - key: "apply", - value: function apply(ctx) { - this.children.forEach(function (child) { - if (typeof child.path !== 'undefined') { - var transform = null; - - if (child.attribute('transform').hasValue()) { - transform = new svg.Transform(child.attribute('transform').value); - transform.apply(ctx); - } - - child.path(ctx); - ctx.clip(); - - if (transform) { - transform.unapply(ctx); - } - } - }); - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class41; - }(svg.Element.ElementBase); // filters - - - svg.Element.filter = /*#__PURE__*/function (_svg$Element$ElementB13) { - _inherits(_class42, _svg$Element$ElementB13); - - var _super41 = _createSuper(_class42); - - function _class42() { - _classCallCheck(this, _class42); - - return _super41.apply(this, arguments); - } - - _createClass(_class42, [{ - key: "apply", - value: function apply(ctx, element) { - // render as temp svg - var bb = element.getBoundingBox(); - var x = Math.floor(bb.x1); - var y = Math.floor(bb.y1); - var width = Math.floor(bb.width()); - var height = Math.floor(bb.height()); // temporarily remove filter to avoid recursion - - var filter = element.style('filter').value; - element.style('filter').value = ''; - var px = 0, - py = 0; - this.children.forEach(function (child) { - var efd = child.extraFilterDistance || 0; - px = Math.max(px, efd); - py = Math.max(py, efd); - }); - var c = document.createElement('canvas'); - c.width = width + 2 * px; - c.height = height + 2 * py; - var tempCtx = c.getContext('2d'); - tempCtx.translate(-x + px, -y + py); - element.render(tempCtx); // apply filters - - this.children.forEach(function (child) { - child.apply(tempCtx, 0, 0, width + 2 * px, height + 2 * py); - }); // render on me - - ctx.drawImage(c, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py); // reassign filter - - element.style('filter', true).value = filter; - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class42; - }(svg.Element.ElementBase); - - svg.Element.feMorphology = /*#__PURE__*/function (_svg$Element$ElementB14) { - _inherits(_class43, _svg$Element$ElementB14); - - var _super42 = _createSuper(_class43); - - function _class43() { - _classCallCheck(this, _class43); - - return _super42.apply(this, arguments); - } - - _createClass(_class43, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) {// TODO: implement - } - }]); - - return _class43; - }(svg.Element.ElementBase); - - svg.Element.feComposite = /*#__PURE__*/function (_svg$Element$ElementB15) { - _inherits(_class44, _svg$Element$ElementB15); - - var _super43 = _createSuper(_class44); - - function _class44() { - _classCallCheck(this, _class44); - - return _super43.apply(this, arguments); - } - - _createClass(_class44, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) {// TODO: implement - } - }]); - - return _class44; - }(svg.Element.ElementBase); - /** - * @param {Uint8ClampedArray} img - * @param {Integer} x - * @param {Integer} y - * @param {Float} width - * @param {Float} height - * @param {Integer} rgba - * @returns {Integer} - */ - - - function imGet(img, x, y, width, height, rgba) { - return img[y * width * 4 + x * 4 + rgba]; - } - /** - * @param {Uint8ClampedArray} img - * @param {Integer} x - * @param {Integer} y - * @param {Float} width - * @param {Float} height - * @param {Integer} rgba - * @param {Float} val - * @returns {void} - */ - - - function imSet(img, x, y, width, height, rgba, val) { - img[y * width * 4 + x * 4 + rgba] = val; - } - - svg.Element.feColorMatrix = /*#__PURE__*/function (_svg$Element$ElementB16) { - _inherits(_class45, _svg$Element$ElementB16); - - var _super44 = _createSuper(_class45); - - function _class45(node) { - var _this23; - - _classCallCheck(this, _class45); - - _this23 = _super44.call(this, node); - var matrix = svg.ToNumberArray(_this23.attribute('values').value); - - switch (_this23.attribute('type').valueOrDefault('matrix')) { - // https://www.w3.org/TR/SVG/filters.html#feColorMatrixElement - case 'saturate': - { - var s = matrix[0]; - matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; - break; - } - - case 'hueRotate': - { - var a = matrix[0] * Math.PI / 180.0; - - var c = function c(m1, m2, m3) { - return m1 + Math.cos(a) * m2 + Math.sin(a) * m3; - }; - - matrix = [c(0.213, 0.787, -0.213), c(0.715, -0.715, -0.715), c(0.072, -0.072, 0.928), 0, 0, c(0.213, -0.213, 0.143), c(0.715, 0.285, 0.140), c(0.072, -0.072, -0.283), 0, 0, c(0.213, -0.213, -0.787), c(0.715, -0.715, 0.715), c(0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; - break; - } - - case 'luminanceToAlpha': - matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1]; - break; - } - - _this23.matrix = matrix; - - _this23._m = function (i, v) { - var mi = matrix[i]; - return mi * (mi < 0 ? v - 255 : v); - }; - - return _this23; - } - - _createClass(_class45, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) { - var m = this._m; // assuming x==0 && y==0 for now - - var srcData = ctx.getImageData(0, 0, width, height); - - for (var _y = 0; _y < height; _y++) { - for (var _x = 0; _x < width; _x++) { - var r = imGet(srcData.data, _x, _y, width, height, 0); - var g = imGet(srcData.data, _x, _y, width, height, 1); - var b = imGet(srcData.data, _x, _y, width, height, 2); - var a = imGet(srcData.data, _x, _y, width, height, 3); - imSet(srcData.data, _x, _y, width, height, 0, m(0, r) + m(1, g) + m(2, b) + m(3, a) + m(4, 1)); - imSet(srcData.data, _x, _y, width, height, 1, m(5, r) + m(6, g) + m(7, b) + m(8, a) + m(9, 1)); - imSet(srcData.data, _x, _y, width, height, 2, m(10, r) + m(11, g) + m(12, b) + m(13, a) + m(14, 1)); - imSet(srcData.data, _x, _y, width, height, 3, m(15, r) + m(16, g) + m(17, b) + m(18, a) + m(19, 1)); - } - } - - ctx.clearRect(0, 0, width, height); - ctx.putImageData(srcData, 0, 0); - } - }]); - - return _class45; - }(svg.Element.ElementBase); - - svg.Element.feGaussianBlur = /*#__PURE__*/function (_svg$Element$ElementB17) { - _inherits(_class46, _svg$Element$ElementB17); - - var _super45 = _createSuper(_class46); - - function _class46(node) { - var _this24; - - _classCallCheck(this, _class46); - - _this24 = _super45.call(this, node); - _this24.blurRadius = Math.floor(_this24.attribute('stdDeviation').numValue()); - _this24.extraFilterDistance = _this24.blurRadius; - return _this24; - } - - _createClass(_class46, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) { - // Todo: This might not be a problem anymore with out `instanceof` fix - // StackBlur requires canvas be on document - ctx.canvas.id = svg.UniqueId(); - ctx.canvas.style.display = 'none'; - document.body.append(ctx.canvas); - processCanvasRGBA(ctx.canvas, x, y, width, height, this.blurRadius); - ctx.canvas.remove(); - } - }]); - - return _class46; - }(svg.Element.ElementBase); // title element, do nothing - - - svg.Element.title = /*#__PURE__*/function (_svg$Element$ElementB18) { - _inherits(_class47, _svg$Element$ElementB18); - - var _super46 = _createSuper(_class47); - - function _class47(node) { - _classCallCheck(this, _class47); - - return _super46.call(this); - } - - return _class47; - }(svg.Element.ElementBase); // desc element, do nothing - - - svg.Element.desc = /*#__PURE__*/function (_svg$Element$ElementB19) { - _inherits(_class48, _svg$Element$ElementB19); - - var _super47 = _createSuper(_class48); - - function _class48(node) { - _classCallCheck(this, _class48); - - return _super47.call(this); - } - - return _class48; - }(svg.Element.ElementBase); - - svg.Element.MISSING = /*#__PURE__*/function (_svg$Element$ElementB20) { - _inherits(_class49, _svg$Element$ElementB20); - - var _super48 = _createSuper(_class49); - - function _class49(node) { - var _this25; - - _classCallCheck(this, _class49); - - _this25 = _super48.call(this); - svg.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.'); - return _this25; - } - - return _class49; - }(svg.Element.ElementBase); // element factory - - - svg.CreateElement = function (node) { - var className = node.nodeName.replace(/^[^:]+:/, '') // remove namespace - .replace(/-/g, ''); // remove dashes - - var e; - - if (typeof svg.Element[className] !== 'undefined') { - e = new svg.Element[className](node); - } else { - e = new svg.Element.MISSING(node); - } - - e.type = node.nodeName; - return e; - }; // load from url - - - svg.load = /*#__PURE__*/function () { - var _ref12 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(ctx, url) { - var dom; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return svg.ajax(url, true); - - case 2: - dom = _context.sent; - return _context.abrupt("return", svg.loadXml(ctx, dom)); - - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - - return function (_x2, _x3) { - return _ref12.apply(this, arguments); - }; - }(); // load from xml - - - svg.loadXml = function (ctx, xml) { - return svg.loadXmlDoc(ctx, svg.parseXml(xml)); - }; - - svg.loadXmlDoc = function (ctx, dom) { - var res; - svg.init(ctx); - - var mapXY = function mapXY(p) { - var e = ctx.canvas; - - while (e) { - p.x -= e.offsetLeft; - p.y -= e.offsetTop; - e = e.offsetParent; - } - - if (window.scrollX) p.x += window.scrollX; - if (window.scrollY) p.y += window.scrollY; - return p; - }; // bind mouse - - - if (svg.opts.ignoreMouse !== true) { - ctx.canvas.addEventListener('click', function (e) { - var args = !isNullish(e) ? [e.clientX, e.clientY] : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals - - var _mapXY = mapXY(_construct(svg.Point, args)), - x = _mapXY.x, - y = _mapXY.y; - - svg.Mouse.onclick(x, y); - }); - ctx.canvas.addEventListener('mousemove', function (e) { - var args = !isNullish(e) ? [e.clientX, e.clientY] : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals - - var _mapXY2 = mapXY(_construct(svg.Point, args)), - x = _mapXY2.x, - y = _mapXY2.y; - - svg.Mouse.onmousemove(x, y); - }); - } - - var e = svg.CreateElement(dom.documentElement); - e.root = true; // render loop - - var isFirstRender = true; - - var draw = function draw(resolve) { - svg.ViewPort.Clear(); - - if (ctx.canvas.parentNode) { - svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight); - } - - if (svg.opts.ignoreDimensions !== true) { - // set canvas size - if (e.style('width').hasValue()) { - ctx.canvas.width = e.style('width').toPixels('x'); - ctx.canvas.style.width = ctx.canvas.width + 'px'; - } - - if (e.style('height').hasValue()) { - ctx.canvas.height = e.style('height').toPixels('y'); - ctx.canvas.style.height = ctx.canvas.height + 'px'; - } - } - - var cWidth = ctx.canvas.clientWidth || ctx.canvas.width; - var cHeight = ctx.canvas.clientHeight || ctx.canvas.height; - - if (svg.opts.ignoreDimensions === true && e.style('width').hasValue() && e.style('height').hasValue()) { - cWidth = e.style('width').toPixels('x'); - cHeight = e.style('height').toPixels('y'); - } - - svg.ViewPort.SetCurrent(cWidth, cHeight); - - if (!isNullish(svg.opts.offsetX)) { - e.attribute('x', true).value = svg.opts.offsetX; - } - - if (!isNullish(svg.opts.offsetY)) { - e.attribute('y', true).value = svg.opts.offsetY; - } - - if (!isNullish(svg.opts.scaleWidth) || !isNullish(svg.opts.scaleHeight)) { - var viewBox = svg.ToNumberArray(e.attribute('viewBox').value); - var xRatio = null, - yRatio = null; - - if (!isNullish(svg.opts.scaleWidth)) { - if (e.attribute('width').hasValue()) { - xRatio = e.attribute('width').toPixels('x') / svg.opts.scaleWidth; - } else if (!isNaN(viewBox[2])) { - xRatio = viewBox[2] / svg.opts.scaleWidth; - } - } - - if (!isNullish(svg.opts.scaleHeight)) { - if (e.attribute('height').hasValue()) { - yRatio = e.attribute('height').toPixels('y') / svg.opts.scaleHeight; - } else if (!isNaN(viewBox[3])) { - yRatio = viewBox[3] / svg.opts.scaleHeight; - } - } - - if (isNullish(xRatio)) { - xRatio = yRatio; - } - - if (isNullish(yRatio)) { - yRatio = xRatio; - } - - e.attribute('width', true).value = svg.opts.scaleWidth; - e.attribute('height', true).value = svg.opts.scaleHeight; - e.attribute('viewBox', true).value = '0 0 ' + cWidth * xRatio + ' ' + cHeight * yRatio; - e.attribute('preserveAspectRatio', true).value = 'none'; - } // clear and render - - - if (svg.opts.ignoreClear !== true) { - ctx.clearRect(0, 0, cWidth, cHeight); - } - - e.render(ctx); - - if (isFirstRender) { - isFirstRender = false; - resolve(dom); - } - }; - - var waitingForImages = true; - svg.intervalID = setInterval(function () { - var needUpdate = false; - - if (waitingForImages && svg.ImagesLoaded()) { - waitingForImages = false; - needUpdate = true; - } // need update from mouse events? - - - if (svg.opts.ignoreMouse !== true) { - needUpdate = needUpdate || svg.Mouse.hasEvents(); - } // need update from animations? - - - if (svg.opts.ignoreAnimation !== true) { - svg.Animations.forEach(function (animation) { - var needAnimationUpdate = animation.update(1000 / svg.FRAMERATE); - needUpdate = needUpdate || needAnimationUpdate; - }); - } // need update from redraw? - - - if (typeof svg.opts.forceRedraw === 'function') { - if (svg.opts.forceRedraw() === true) { - needUpdate = true; - } - } // render if needed - - - if (needUpdate) { - draw(res); - svg.Mouse.runEvents(); // run and clear our events - } - }, 1000 / svg.FRAMERATE); // Todo: Replace with an image loading Promise utility? - // eslint-disable-next-line promise/avoid-new - - return new Promise(function (resolve, reject) { - if (svg.ImagesLoaded()) { - waitingForImages = false; - draw(resolve); - return; - } - - res = resolve; - }); - }; - - svg.stop = function () { - if (svg.intervalID) { - clearInterval(svg.intervalID); - } - }; - - svg.Mouse = { - events: [], - hasEvents: function hasEvents() { - return this.events.length !== 0; - }, - onclick: function onclick(x, y) { - this.events.push({ - type: 'onclick', - x: x, - y: y, - run: function run(e) { - if (e.onclick) e.onclick(); - } - }); - }, - onmousemove: function onmousemove(x, y) { - this.events.push({ - type: 'onmousemove', - x: x, - y: y, - run: function run(e) { - if (e.onmousemove) e.onmousemove(); - } - }); - }, - eventElements: [], - checkPath: function checkPath(element, ctx) { - var _this26 = this; - - this.events.forEach(function (_ref13, i) { - var x = _ref13.x, - y = _ref13.y; - - if (ctx.isPointInPath && ctx.isPointInPath(x, y)) { - _this26.eventElements[i] = element; - } - }); - }, - checkBoundingBox: function checkBoundingBox(element, bb) { - var _this27 = this; - - this.events.forEach(function (_ref14, i) { - var x = _ref14.x, - y = _ref14.y; - - if (bb.isPointInBox(x, y)) { - _this27.eventElements[i] = element; - } - }); - }, - runEvents: function runEvents() { - var _this28 = this; - - svg.ctx.canvas.style.cursor = ''; - this.events.forEach(function (e, i) { - var element = _this28.eventElements[i]; - - while (element) { - e.run(element); - element = element.parent; - } - }); // done running, clear - - this.events = []; - this.eventElements = []; - } - }; - return svg; - } - - if (typeof CanvasRenderingContext2D !== 'undefined') { - CanvasRenderingContext2D.prototype.drawSvg = function (s, dx, dy, dw, dh) { - canvg(this.canvas, s, { - ignoreMouse: true, - ignoreAnimation: true, - ignoreDimensions: true, - ignoreClear: true, - offsetX: dx, - offsetY: dy, - scaleWidth: dw, - scaleHeight: dh - }); - }; - } - - exports.canvg = canvg; - - return exports; - -}({})); diff --git a/dist/dom-polyfill.js b/dist/dom-polyfill.js deleted file mode 100644 index bd2ec167..00000000 --- a/dist/dom-polyfill.js +++ /dev/null @@ -1,165 +0,0 @@ -(function () { - 'use strict'; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - // From https://github.com/inexorabletash/polyfill/blob/master/dom.js - - /** - * @module DOMPolyfill - */ - - /** - * - * @param {Node} o - * @param {module:DOMPolyfill~ParentNode|module:DOMPolyfill~ChildNode} ps - * @returns {void} - */ - function mixin(o, ps) { - if (!o) return; - Object.keys(ps).forEach(function (p) { - if (p in o || p in o.prototype) { - return; - } - - try { - Object.defineProperty(o.prototype, p, Object.getOwnPropertyDescriptor(ps, p)); - } catch (ex) { - // Throws in IE8; just copy it - o[p] = ps[p]; - } - }); - } - /** - * - * @param {Node[]} nodes - * @returns {Node} - */ - - - function convertNodesIntoANode(nodes) { - nodes = nodes.map(function (node) { - var isNode = node && _typeof(node) === 'object' && 'nodeType' in node; - return isNode ? node : document.createTextNode(node); - }); - - if (nodes.length === 1) { - return nodes[0]; - } - - var node = document.createDocumentFragment(); - nodes.forEach(function (n) { - // // eslint-disable-next-line unicorn/prefer-node-append - node.appendChild(n); - }); - return node; - } - - var ParentNode = { - prepend: function prepend() { - for (var _len = arguments.length, nodes = new Array(_len), _key = 0; _key < _len; _key++) { - nodes[_key] = arguments[_key]; - } - - nodes = convertNodesIntoANode(nodes); - this.insertBefore(nodes, this.firstChild); - }, - append: function append() { - for (var _len2 = arguments.length, nodes = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - nodes[_key2] = arguments[_key2]; - } - - nodes = convertNodesIntoANode(nodes); // // eslint-disable-next-line unicorn/prefer-node-append - - this.appendChild(nodes); - } - }; - mixin(Document || HTMLDocument, ParentNode); // HTMLDocument for IE8 - - mixin(DocumentFragment, ParentNode); - mixin(Element, ParentNode); // Mixin ChildNode - // https://dom.spec.whatwg.org/#interface-childnode - - var ChildNode = { - before: function before() { - var parent = this.parentNode; - if (!parent) return; - var viablePreviousSibling = this.previousSibling; - - for (var _len3 = arguments.length, nodes = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { - nodes[_key3] = arguments[_key3]; - } - - while (nodes.includes(viablePreviousSibling)) { - viablePreviousSibling = viablePreviousSibling.previousSibling; - } - - var node = convertNodesIntoANode(nodes); - parent.insertBefore(node, viablePreviousSibling ? viablePreviousSibling.nextSibling : parent.firstChild); - }, - after: function after() { - var parent = this.parentNode; - if (!parent) return; - var viableNextSibling = this.nextSibling; - - for (var _len4 = arguments.length, nodes = new Array(_len4), _key4 = 0; _key4 < _len4; _key4++) { - nodes[_key4] = arguments[_key4]; - } - - while (nodes.includes(viableNextSibling)) { - viableNextSibling = viableNextSibling.nextSibling; - } - - var node = convertNodesIntoANode(nodes); // eslint-disable-next-line unicorn/prefer-modern-dom-apis - - parent.insertBefore(node, viableNextSibling); - }, - replaceWith: function replaceWith() { - var parent = this.parentNode; - if (!parent) return; - var viableNextSibling = this.nextSibling; - - for (var _len5 = arguments.length, nodes = new Array(_len5), _key5 = 0; _key5 < _len5; _key5++) { - nodes[_key5] = arguments[_key5]; - } - - while (nodes.includes(viableNextSibling)) { - viableNextSibling = viableNextSibling.nextSibling; - } - - var node = convertNodesIntoANode(nodes); - - if (this.parentNode === parent) { - parent.replaceChild(node, this); - } else { - // eslint-disable-next-line unicorn/prefer-modern-dom-apis - parent.insertBefore(node, viableNextSibling); - } - }, - remove: function remove() { - if (!this.parentNode) { - return; - } - - this.parentNode.removeChild(this); // eslint-disable-line unicorn/prefer-node-remove - } - }; - mixin(DocumentType, ChildNode); - mixin(Element, ChildNode); - mixin(CharacterData, ChildNode); - -}()); diff --git a/dist/extensions/closepath.png b/dist/extensions/closepath.png new file mode 100644 index 0000000000000000000000000000000000000000..7364bfc3f143c4b9737140558d791e21af6685a8 GIT binary patch literal 8036 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 + + + + Layer 1 + + + + + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + + + + + + + diff --git a/dist/extensions/ext-arrows.js b/dist/extensions/ext-arrows.js index 707ab068..878d53a4 100644 --- a/dist/extensions/ext-arrows.js +++ b/dist/extensions/ext-arrows.js @@ -1,398 +1,326 @@ -var svgEditorExtension_arrows = (function () { - 'use strict'; +/** + * @file ext-arrows.js + * + * @license MIT + * + * @copyright 2010 Alexis Deveria + * + */ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; +export default { + name: 'arrows', + async init (S) { + const strings = await S.importLocale(); + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const // {svgcontent} = S, + addElem = svgCanvas.addSVGElementFromJson, + {nonce, $} = S, + prefix = 'se_arrow_'; + + let selElems, arrowprefix, randomizeIds = S.randomize_ids; + + /** + * @param {Window} win + * @param {!(string|Integer)} n + * @returns {void} + */ + function setArrowNonce (win, n) { + randomizeIds = true; + arrowprefix = prefix + n + '_'; + pathdata.fw.id = arrowprefix + 'fw'; + pathdata.bk.id = arrowprefix + 'bk'; } - if (info.done) { - resolve(value); + /** + * @param {Window} win + * @returns {void} + */ + function unsetArrowNonce (win) { + randomizeIds = false; + arrowprefix = prefix; + pathdata.fw.id = arrowprefix + 'fw'; + pathdata.bk.id = arrowprefix + 'bk'; + } + + svgCanvas.bind('setnonce', setArrowNonce); + svgCanvas.bind('unsetnonce', unsetArrowNonce); + + if (randomizeIds) { + arrowprefix = prefix + nonce + '_'; } else { - Promise.resolve(value).then(_next, _throw); + arrowprefix = prefix; } - } - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + const pathdata = { + fw: {d: 'm0,0l10,5l-10,5l5,-5l-5,-5z', refx: 8, id: arrowprefix + 'fw'}, + bk: {d: 'm10,0l-10,5l10,5l-5,-5l5,-5z', refx: 2, id: arrowprefix + 'bk'} + }; - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /** + * Gets linked element. + * @param {Element} elem + * @param {string} attr + * @returns {Element} + */ + function getLinked (elem, attr) { + const str = elem.getAttribute(attr); + if (!str) { return null; } + const m = str.match(/\(#(.*)\)/); + // const m = str.match(/\(#(?.+)\)/); + // if (!m || !m.groups.id) { + if (!m || m.length !== 2) { + return null; + } + return svgCanvas.getElem(m[1]); + // return svgCanvas.getElem(m.groups.id); + } + + /** + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + $('#arrow_panel').toggle(on); + if (on) { + const el = selElems[0]; + const end = el.getAttribute('marker-end'); + const start = el.getAttribute('marker-start'); + const mid = el.getAttribute('marker-mid'); + let val; + if (end && start) { + val = 'both'; + } else if (end) { + val = 'end'; + } else if (start) { + val = 'start'; + } else if (mid) { + val = 'mid'; + if (mid.includes('bk')) { + val = 'mid_bk'; + } } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + if (!start && !mid && !end) { + val = 'none'; } - _next(undefined); + $('#arrow_list').val(val); + } + } + + /** + * + * @returns {void} + */ + function resetMarker () { + const el = selElems[0]; + el.removeAttribute('marker-start'); + el.removeAttribute('marker-mid'); + el.removeAttribute('marker-end'); + } + + /** + * @param {"bk"|"fw"} dir + * @param {"both"|"mid"|"end"|"start"} type + * @param {string} id + * @returns {Element} + */ + function addMarker (dir, type, id) { + // TODO: Make marker (or use?) per arrow type, since refX can be different + id = id || arrowprefix + dir; + + const data = pathdata[dir]; + + if (type === 'mid') { + data.refx = 5; + } + + let marker = svgCanvas.getElem(id); + if (!marker) { + marker = addElem({ + element: 'marker', + attr: { + viewBox: '0 0 10 10', + id, + refY: 5, + markerUnits: 'strokeWidth', + markerWidth: 5, + markerHeight: 5, + orient: 'auto', + style: 'pointer-events:none' // Currently needed for Opera + } + }); + const arrow = addElem({ + element: 'path', + attr: { + d: data.d, + fill: '#000000' + } + }); + marker.append(arrow); + svgCanvas.findDefs().append(marker); + } + + marker.setAttribute('refX', data.refx); + + return marker; + } + + /** + * + * @returns {void} + */ + function setArrow () { + resetMarker(); + + let type = this.value; + if (type === 'none') { + return; + } + + // Set marker on element + let dir = 'fw'; + if (type === 'mid_bk') { + type = 'mid'; + dir = 'bk'; + } else if (type === 'both') { + addMarker('bk', type); + svgCanvas.changeSelectedAttribute('marker-start', 'url(#' + pathdata.bk.id + ')'); + type = 'end'; + dir = 'fw'; + } else if (type === 'start') { + dir = 'bk'; + } + + addMarker(dir, type); + svgCanvas.changeSelectedAttribute('marker-' + type, 'url(#' + pathdata[dir].id + ')'); + svgCanvas.call('changed', selElems); + } + + /** + * @param {Element} elem + * @returns {void} + */ + function colorChanged (elem) { + const color = elem.getAttribute('stroke'); + const mtypes = ['start', 'mid', 'end']; + const defs = svgCanvas.findDefs(); + + $.each(mtypes, function (i, type) { + const marker = getLinked(elem, 'marker-' + type); + if (!marker) { return; } + + const curColor = $(marker).children().attr('fill'); + const curD = $(marker).children().attr('d'); + if (curColor === color) { return; } + + const allMarkers = $(defs).find('marker'); + let newMarker = null; + // Different color, check if already made + allMarkers.each(function () { + const attrs = $(this).children().attr(['fill', 'd']); + if (attrs.fill === color && attrs.d === curD) { + // Found another marker with this color and this path + newMarker = this; + } + }); + + if (!newMarker) { + // Create a new marker with this color + const lastId = marker.id; + const dir = lastId.includes('_fw') ? 'fw' : 'bk'; + + newMarker = addMarker(dir, type, arrowprefix + dir + allMarkers.length); + + $(newMarker).children().attr('fill', color); + } + + $(elem).attr('marker-' + type, 'url(#' + newMarker.id + ')'); + + // Check if last marker can be removed + let remove = true; + $(S.svgcontent).find('line, polyline, path, polygon').each(function () { + const element = this; + $.each(mtypes, function (j, mtype) { + if ($(element).attr('marker-' + mtype) === 'url(#' + marker.id + ')') { + remove = false; + return remove; + } + return undefined; + }); + if (!remove) { return false; } + return undefined; + }); + + // Not found, so can safely remove + if (remove) { + $(marker).remove(); + } }); + } + + const contextTools = [ + { + type: 'select', + panel: 'arrow_panel', + id: 'arrow_list', + defval: 'none', + events: { + change: setArrow + } + } + ]; + + return { + name: strings.name, + context_tools: strings.contextTools.map((contextTool, i) => { + return Object.assign(contextTools[i], contextTool); + }), + callback () { + $('#arrow_panel').hide(); + // Set ID so it can be translated in locale file + $('#arrow_list option')[0].id = 'connector_no_arrow'; + }, + async addLangData ({lang, importLocale}) { + const {langList} = await importLocale(); + return { + data: langList + }; + }, + selectedChanged (opts) { + // Use this to update the current selected elements + selElems = opts.elems; + + const markerElems = ['line', 'path', 'polyline', 'polygon']; + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && markerElems.includes(elem.tagName)) { + if (opts.selectedElement && !opts.multiselected) { + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + }, + elementChanged (opts) { + const elem = opts.elems[0]; + if (elem && ( + elem.getAttribute('marker-start') || + elem.getAttribute('marker-mid') || + elem.getAttribute('marker-end') + )) { + // const start = elem.getAttribute('marker-start'); + // const mid = elem.getAttribute('marker-mid'); + // const end = elem.getAttribute('marker-end'); + // Has marker, so see if it should match color + colorChanged(elem); + } + } }; } - - /** - * @file ext-arrows.js - * - * @license MIT - * - * @copyright 2010 Alexis Deveria - * - */ - var extArrows = { - name: 'arrows', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var strings, svgEditor, svgCanvas, addElem, nonce, $, prefix, selElems, arrowprefix, randomizeIds, setArrowNonce, unsetArrowNonce, pathdata, getLinked, showPanel, resetMarker, addMarker, setArrow, colorChanged, contextTools; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - colorChanged = function _colorChanged(elem) { - var color = elem.getAttribute('stroke'); - var mtypes = ['start', 'mid', 'end']; - var defs = svgCanvas.findDefs(); - $.each(mtypes, function (i, type) { - var marker = getLinked(elem, 'marker-' + type); - - if (!marker) { - return; - } - - var curColor = $(marker).children().attr('fill'); - var curD = $(marker).children().attr('d'); - - if (curColor === color) { - return; - } - - var allMarkers = $(defs).find('marker'); - var newMarker = null; // Different color, check if already made - - allMarkers.each(function () { - var attrs = $(this).children().attr(['fill', 'd']); - - if (attrs.fill === color && attrs.d === curD) { - // Found another marker with this color and this path - newMarker = this; - } - }); - - if (!newMarker) { - // Create a new marker with this color - var lastId = marker.id; - var dir = lastId.includes('_fw') ? 'fw' : 'bk'; - newMarker = addMarker(dir, type, arrowprefix + dir + allMarkers.length); - $(newMarker).children().attr('fill', color); - } - - $(elem).attr('marker-' + type, 'url(#' + newMarker.id + ')'); // Check if last marker can be removed - - var remove = true; - $(S.svgcontent).find('line, polyline, path, polygon').each(function () { - var element = this; - $.each(mtypes, function (j, mtype) { - if ($(element).attr('marker-' + mtype) === 'url(#' + marker.id + ')') { - remove = false; - return remove; - } - - return undefined; - }); - - if (!remove) { - return false; - } - - return undefined; - }); // Not found, so can safely remove - - if (remove) { - $(marker).remove(); - } - }); - }; - - setArrow = function _setArrow() { - resetMarker(); - var type = this.value; - - if (type === 'none') { - return; - } // Set marker on element - - - var dir = 'fw'; - - if (type === 'mid_bk') { - type = 'mid'; - dir = 'bk'; - } else if (type === 'both') { - addMarker('bk', type); - svgCanvas.changeSelectedAttribute('marker-start', 'url(#' + pathdata.bk.id + ')'); - type = 'end'; - dir = 'fw'; - } else if (type === 'start') { - dir = 'bk'; - } - - addMarker(dir, type); - svgCanvas.changeSelectedAttribute('marker-' + type, 'url(#' + pathdata[dir].id + ')'); - svgCanvas.call('changed', selElems); - }; - - addMarker = function _addMarker(dir, type, id) { - // TODO: Make marker (or use?) per arrow type, since refX can be different - id = id || arrowprefix + dir; - var data = pathdata[dir]; - - if (type === 'mid') { - data.refx = 5; - } - - var marker = svgCanvas.getElem(id); - - if (!marker) { - marker = addElem({ - element: 'marker', - attr: { - viewBox: '0 0 10 10', - id: id, - refY: 5, - markerUnits: 'strokeWidth', - markerWidth: 5, - markerHeight: 5, - orient: 'auto', - style: 'pointer-events:none' // Currently needed for Opera - - } - }); - var arrow = addElem({ - element: 'path', - attr: { - d: data.d, - fill: '#000000' - } - }); - marker.append(arrow); - svgCanvas.findDefs().append(marker); - } - - marker.setAttribute('refX', data.refx); - return marker; - }; - - resetMarker = function _resetMarker() { - var el = selElems[0]; - el.removeAttribute('marker-start'); - el.removeAttribute('marker-mid'); - el.removeAttribute('marker-end'); - }; - - showPanel = function _showPanel(on) { - $('#arrow_panel').toggle(on); - - if (on) { - var el = selElems[0]; - var end = el.getAttribute('marker-end'); - var start = el.getAttribute('marker-start'); - var mid = el.getAttribute('marker-mid'); - var val; - - if (end && start) { - val = 'both'; - } else if (end) { - val = 'end'; - } else if (start) { - val = 'start'; - } else if (mid) { - val = 'mid'; - - if (mid.includes('bk')) { - val = 'mid_bk'; - } - } - - if (!start && !mid && !end) { - val = 'none'; - } - - $('#arrow_list').val(val); - } - }; - - getLinked = function _getLinked(elem, attr) { - var str = elem.getAttribute(attr); - - if (!str) { - return null; - } - - var m = str.match(/\(#(.*)\)/); // const m = str.match(/\(#(?.+)\)/); - // if (!m || !m.groups.id) { - - if (!m || m.length !== 2) { - return null; - } - - return svgCanvas.getElem(m[1]); // return svgCanvas.getElem(m.groups.id); - }; - - unsetArrowNonce = function _unsetArrowNonce(win) { - randomizeIds = false; - arrowprefix = prefix; - pathdata.fw.id = arrowprefix + 'fw'; - pathdata.bk.id = arrowprefix + 'bk'; - }; - - setArrowNonce = function _setArrowNonce(win, n) { - randomizeIds = true; - arrowprefix = prefix + n + '_'; - pathdata.fw.id = arrowprefix + 'fw'; - pathdata.bk.id = arrowprefix + 'bk'; - }; - - _context2.next = 10; - return S.importLocale(); - - case 10: - strings = _context2.sent; - svgEditor = _this; - svgCanvas = svgEditor.canvas; - // {svgcontent} = S, - addElem = svgCanvas.addSVGElementFromJson, nonce = S.nonce, $ = S.$, prefix = 'se_arrow_'; - randomizeIds = S.randomize_ids; - /** - * @param {Window} win - * @param {!(string|Integer)} n - * @returns {void} - */ - - svgCanvas.bind('setnonce', setArrowNonce); - svgCanvas.bind('unsetnonce', unsetArrowNonce); - - if (randomizeIds) { - arrowprefix = prefix + nonce + '_'; - } else { - arrowprefix = prefix; - } - - pathdata = { - fw: { - d: 'm0,0l10,5l-10,5l5,-5l-5,-5z', - refx: 8, - id: arrowprefix + 'fw' - }, - bk: { - d: 'm10,0l-10,5l10,5l-5,-5l5,-5z', - refx: 2, - id: arrowprefix + 'bk' - } - }; - /** - * Gets linked element. - * @param {Element} elem - * @param {string} attr - * @returns {Element} - */ - - contextTools = [{ - type: 'select', - panel: 'arrow_panel', - id: 'arrow_list', - defval: 'none', - events: { - change: setArrow - } - }]; - return _context2.abrupt("return", { - name: strings.name, - context_tools: strings.contextTools.map(function (contextTool, i) { - return Object.assign(contextTools[i], contextTool); - }), - callback: function callback() { - $('#arrow_panel').hide(); // Set ID so it can be translated in locale file - - $('#arrow_list option')[0].id = 'connector_no_arrow'; - }, - addLangData: function addLangData(_ref) { - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var lang, importLocale, _yield$importLocale, langList; - - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - lang = _ref.lang, importLocale = _ref.importLocale; - _context.next = 3; - return importLocale(); - - case 3: - _yield$importLocale = _context.sent; - langList = _yield$importLocale.langList; - return _context.abrupt("return", { - data: langList - }); - - case 6: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - }, - selectedChanged: function selectedChanged(opts) { - // Use this to update the current selected elements - selElems = opts.elems; - var markerElems = ['line', 'path', 'polyline', 'polygon']; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && markerElems.includes(elem.tagName)) { - if (opts.selectedElement && !opts.multiselected) { - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - }, - elementChanged: function elementChanged(opts) { - var elem = opts.elems[0]; - - if (elem && (elem.getAttribute('marker-start') || elem.getAttribute('marker-mid') || elem.getAttribute('marker-end'))) { - // const start = elem.getAttribute('marker-start'); - // const mid = elem.getAttribute('marker-mid'); - // const end = elem.getAttribute('marker-end'); - // Has marker, so see if it should match color - colorChanged(elem); - } - } - }); - - case 21: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))(); - } - }; - - return extArrows; - -}()); +}; diff --git a/dist/extensions/ext-closepath.js b/dist/extensions/ext-closepath.js index c88b8af0..137ec2aa 100644 --- a/dist/extensions/ext-closepath.js +++ b/dist/extensions/ext-closepath.js @@ -1,2583 +1,101 @@ -var svgEditorExtension_closepath = (function () { - 'use strict'; +/** + * @file ext-closepath.js + * + * @license MIT + * + * @copyright 2010 Jeff Schiller + * + */ +import '../../common/svgpathseg.js'; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); +// This extension adds a simple button to the contextual panel for paths +// The button toggles whether the path is open or closed +export default { + name: 'closepath', + async init ({importLocale, $}) { + const strings = await importLocale(); + const svgEditor = this; + let selElems; + const updateButton = function (path) { + const seglist = path.pathSegList, + closed = seglist.getItem(seglist.numberOfItems - 1).pathSegType === 1, + showbutton = closed ? '#tool_openpath' : '#tool_closepath', + hidebutton = closed ? '#tool_closepath' : '#tool_openpath'; + $(hidebutton).hide(); + $(showbutton).show(); }; - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true + const showPanel = function (on) { + $('#closepath_panel').toggle(on); + if (on) { + const path = selElems[0]; + if (path) { updateButton(path); } } - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); + const toggleClosed = function () { + const path = selElems[0]; + if (path) { + const seglist = path.pathSegList, + last = seglist.numberOfItems - 1; + // is closed + if (seglist.getItem(last).pathSegType === 1) { + seglist.removeItem(last); + } else { + seglist.appendItem(path.createSVGPathSegClosePath()); + } + updateButton(path); } + }; - return _possibleConstructorReturn(this, result); + const buttons = [ + { + id: 'tool_openpath', + icon: svgEditor.curConfig.extIconsPath + 'openpath.png', + type: 'context', + panel: 'closepath_panel', + events: { + click () { + toggleClosed(); + } + } + }, + { + id: 'tool_closepath', + icon: svgEditor.curConfig.extIconsPath + 'closepath.png', + type: 'context', + panel: 'closepath_panel', + events: { + click () { + toggleClosed(); + } + } + } + ]; + + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'closepath_icons.svg', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + callback () { + $('#closepath_panel').hide(); + }, + selectedChanged (opts) { + selElems = opts.elems; + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && elem.tagName === 'path') { + if (opts.selectedElement && !opts.multiselected) { + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + } }; } - - /* eslint-disable import/unambiguous, max-len */ - - /* globals SVGPathSeg, SVGPathSegMovetoRel, SVGPathSegMovetoAbs, - SVGPathSegMovetoRel, SVGPathSegLinetoRel, SVGPathSegLinetoAbs, - SVGPathSegLinetoHorizontalRel, SVGPathSegLinetoHorizontalAbs, - SVGPathSegLinetoVerticalRel, SVGPathSegLinetoVerticalAbs, - SVGPathSegClosePath, SVGPathSegCurvetoCubicRel, - SVGPathSegCurvetoCubicAbs, SVGPathSegCurvetoCubicSmoothRel, - SVGPathSegCurvetoCubicSmoothAbs, SVGPathSegCurvetoQuadraticRel, - SVGPathSegCurvetoQuadraticAbs, SVGPathSegCurvetoQuadraticSmoothRel, - SVGPathSegCurvetoQuadraticSmoothAbs, SVGPathSegArcRel, SVGPathSegArcAbs */ - - /** - * SVGPathSeg API polyfill - * https://github.com/progers/pathseg - * - * This is a drop-in replacement for the `SVGPathSeg` and `SVGPathSegList` APIs - * that were removed from SVG2 ({@link https://lists.w3.org/Archives/Public/www-svg/2015Jun/0044.html}), - * including the latest spec changes which were implemented in Firefox 43 and - * Chrome 46. - */ - - /* eslint-disable no-shadow, class-methods-use-this, jsdoc/require-jsdoc */ - // Linting: We avoid `no-shadow` as ESLint thinks these are still available globals - // Linting: We avoid `class-methods-use-this` as this is a polyfill that must - // follow the conventions - (function () { - if (!('SVGPathSeg' in window)) { - // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSeg - var _SVGPathSeg = /*#__PURE__*/function () { - function _SVGPathSeg(type, typeAsLetter, owningPathSegList) { - _classCallCheck(this, _SVGPathSeg); - - this.pathSegType = type; - this.pathSegTypeAsLetter = typeAsLetter; - this._owningPathSegList = owningPathSegList; - } // Notify owning PathSegList on any changes so they can be synchronized back to the path element. - - - _createClass(_SVGPathSeg, [{ - key: "_segmentChanged", - value: function _segmentChanged() { - if (this._owningPathSegList) { - this._owningPathSegList.segmentChanged(this); - } - } - }]); - - return _SVGPathSeg; - }(); - - _SVGPathSeg.prototype.classname = 'SVGPathSeg'; - _SVGPathSeg.PATHSEG_UNKNOWN = 0; - _SVGPathSeg.PATHSEG_CLOSEPATH = 1; - _SVGPathSeg.PATHSEG_MOVETO_ABS = 2; - _SVGPathSeg.PATHSEG_MOVETO_REL = 3; - _SVGPathSeg.PATHSEG_LINETO_ABS = 4; - _SVGPathSeg.PATHSEG_LINETO_REL = 5; - _SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS = 6; - _SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL = 7; - _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS = 8; - _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL = 9; - _SVGPathSeg.PATHSEG_ARC_ABS = 10; - _SVGPathSeg.PATHSEG_ARC_REL = 11; - _SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS = 12; - _SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL = 13; - _SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS = 14; - _SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL = 15; - _SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16; - _SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17; - _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18; - _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19; - - var _SVGPathSegClosePath = /*#__PURE__*/function (_SVGPathSeg2) { - _inherits(_SVGPathSegClosePath, _SVGPathSeg2); - - var _super = _createSuper(_SVGPathSegClosePath); - - function _SVGPathSegClosePath(owningPathSegList) { - _classCallCheck(this, _SVGPathSegClosePath); - - return _super.call(this, _SVGPathSeg.PATHSEG_CLOSEPATH, 'z', owningPathSegList); - } - - _createClass(_SVGPathSegClosePath, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegClosePath]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegClosePath(undefined); - } - }]); - - return _SVGPathSegClosePath; - }(_SVGPathSeg); - - var _SVGPathSegMovetoAbs = /*#__PURE__*/function (_SVGPathSeg3) { - _inherits(_SVGPathSegMovetoAbs, _SVGPathSeg3); - - var _super2 = _createSuper(_SVGPathSegMovetoAbs); - - function _SVGPathSegMovetoAbs(owningPathSegList, x, y) { - var _this; - - _classCallCheck(this, _SVGPathSegMovetoAbs); - - _this = _super2.call(this, _SVGPathSeg.PATHSEG_MOVETO_ABS, 'M', owningPathSegList); - _this._x = x; - _this._y = y; - return _this; - } - - _createClass(_SVGPathSegMovetoAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegMovetoAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegMovetoAbs(undefined, this._x, this._y); - } - }]); - - return _SVGPathSegMovetoAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegMovetoAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegMovetoRel = /*#__PURE__*/function (_SVGPathSeg4) { - _inherits(_SVGPathSegMovetoRel, _SVGPathSeg4); - - var _super3 = _createSuper(_SVGPathSegMovetoRel); - - function _SVGPathSegMovetoRel(owningPathSegList, x, y) { - var _this2; - - _classCallCheck(this, _SVGPathSegMovetoRel); - - _this2 = _super3.call(this, _SVGPathSeg.PATHSEG_MOVETO_REL, 'm', owningPathSegList); - _this2._x = x; - _this2._y = y; - return _this2; - } - - _createClass(_SVGPathSegMovetoRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegMovetoRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegMovetoRel(undefined, this._x, this._y); - } - }]); - - return _SVGPathSegMovetoRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegMovetoRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegLinetoAbs = /*#__PURE__*/function (_SVGPathSeg5) { - _inherits(_SVGPathSegLinetoAbs, _SVGPathSeg5); - - var _super4 = _createSuper(_SVGPathSegLinetoAbs); - - function _SVGPathSegLinetoAbs(owningPathSegList, x, y) { - var _this3; - - _classCallCheck(this, _SVGPathSegLinetoAbs); - - _this3 = _super4.call(this, _SVGPathSeg.PATHSEG_LINETO_ABS, 'L', owningPathSegList); - _this3._x = x; - _this3._y = y; - return _this3; - } - - _createClass(_SVGPathSegLinetoAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegLinetoAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegLinetoAbs(undefined, this._x, this._y); - } - }]); - - return _SVGPathSegLinetoAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegLinetoAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegLinetoRel = /*#__PURE__*/function (_SVGPathSeg6) { - _inherits(_SVGPathSegLinetoRel, _SVGPathSeg6); - - var _super5 = _createSuper(_SVGPathSegLinetoRel); - - function _SVGPathSegLinetoRel(owningPathSegList, x, y) { - var _this4; - - _classCallCheck(this, _SVGPathSegLinetoRel); - - _this4 = _super5.call(this, _SVGPathSeg.PATHSEG_LINETO_REL, 'l', owningPathSegList); - _this4._x = x; - _this4._y = y; - return _this4; - } - - _createClass(_SVGPathSegLinetoRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegLinetoRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegLinetoRel(undefined, this._x, this._y); - } - }]); - - return _SVGPathSegLinetoRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegLinetoRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoCubicAbs = /*#__PURE__*/function (_SVGPathSeg7) { - _inherits(_SVGPathSegCurvetoCubicAbs, _SVGPathSeg7); - - var _super6 = _createSuper(_SVGPathSegCurvetoCubicAbs); - - function _SVGPathSegCurvetoCubicAbs(owningPathSegList, x, y, x1, y1, x2, y2) { - var _this5; - - _classCallCheck(this, _SVGPathSegCurvetoCubicAbs); - - _this5 = _super6.call(this, _SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS, 'C', owningPathSegList); - _this5._x = x; - _this5._y = y; - _this5._x1 = x1; - _this5._y1 = y1; - _this5._x2 = x2; - _this5._y2 = y2; - return _this5; - } - - _createClass(_SVGPathSegCurvetoCubicAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoCubicAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoCubicAbs(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2); - } - }]); - - return _SVGPathSegCurvetoCubicAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoCubicAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - x1: { - get: function get() { - return this._x1; - }, - set: function set(x1) { - this._x1 = x1; - - this._segmentChanged(); - }, - enumerable: true - }, - y1: { - get: function get() { - return this._y1; - }, - set: function set(y1) { - this._y1 = y1; - - this._segmentChanged(); - }, - enumerable: true - }, - x2: { - get: function get() { - return this._x2; - }, - set: function set(x2) { - this._x2 = x2; - - this._segmentChanged(); - }, - enumerable: true - }, - y2: { - get: function get() { - return this._y2; - }, - set: function set(y2) { - this._y2 = y2; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoCubicRel = /*#__PURE__*/function (_SVGPathSeg8) { - _inherits(_SVGPathSegCurvetoCubicRel, _SVGPathSeg8); - - var _super7 = _createSuper(_SVGPathSegCurvetoCubicRel); - - function _SVGPathSegCurvetoCubicRel(owningPathSegList, x, y, x1, y1, x2, y2) { - var _this6; - - _classCallCheck(this, _SVGPathSegCurvetoCubicRel); - - _this6 = _super7.call(this, _SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL, 'c', owningPathSegList); - _this6._x = x; - _this6._y = y; - _this6._x1 = x1; - _this6._y1 = y1; - _this6._x2 = x2; - _this6._y2 = y2; - return _this6; - } - - _createClass(_SVGPathSegCurvetoCubicRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoCubicRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoCubicRel(undefined, this._x, this._y, this._x1, this._y1, this._x2, this._y2); - } - }]); - - return _SVGPathSegCurvetoCubicRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoCubicRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - x1: { - get: function get() { - return this._x1; - }, - set: function set(x1) { - this._x1 = x1; - - this._segmentChanged(); - }, - enumerable: true - }, - y1: { - get: function get() { - return this._y1; - }, - set: function set(y1) { - this._y1 = y1; - - this._segmentChanged(); - }, - enumerable: true - }, - x2: { - get: function get() { - return this._x2; - }, - set: function set(x2) { - this._x2 = x2; - - this._segmentChanged(); - }, - enumerable: true - }, - y2: { - get: function get() { - return this._y2; - }, - set: function set(y2) { - this._y2 = y2; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoQuadraticAbs = /*#__PURE__*/function (_SVGPathSeg9) { - _inherits(_SVGPathSegCurvetoQuadraticAbs, _SVGPathSeg9); - - var _super8 = _createSuper(_SVGPathSegCurvetoQuadraticAbs); - - function _SVGPathSegCurvetoQuadraticAbs(owningPathSegList, x, y, x1, y1) { - var _this7; - - _classCallCheck(this, _SVGPathSegCurvetoQuadraticAbs); - - _this7 = _super8.call(this, _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS, 'Q', owningPathSegList); - _this7._x = x; - _this7._y = y; - _this7._x1 = x1; - _this7._y1 = y1; - return _this7; - } - - _createClass(_SVGPathSegCurvetoQuadraticAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoQuadraticAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoQuadraticAbs(undefined, this._x, this._y, this._x1, this._y1); - } - }]); - - return _SVGPathSegCurvetoQuadraticAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoQuadraticAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - x1: { - get: function get() { - return this._x1; - }, - set: function set(x1) { - this._x1 = x1; - - this._segmentChanged(); - }, - enumerable: true - }, - y1: { - get: function get() { - return this._y1; - }, - set: function set(y1) { - this._y1 = y1; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoQuadraticRel = /*#__PURE__*/function (_SVGPathSeg10) { - _inherits(_SVGPathSegCurvetoQuadraticRel, _SVGPathSeg10); - - var _super9 = _createSuper(_SVGPathSegCurvetoQuadraticRel); - - function _SVGPathSegCurvetoQuadraticRel(owningPathSegList, x, y, x1, y1) { - var _this8; - - _classCallCheck(this, _SVGPathSegCurvetoQuadraticRel); - - _this8 = _super9.call(this, _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL, 'q', owningPathSegList); - _this8._x = x; - _this8._y = y; - _this8._x1 = x1; - _this8._y1 = y1; - return _this8; - } - - _createClass(_SVGPathSegCurvetoQuadraticRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoQuadraticRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x1 + ' ' + this._y1 + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoQuadraticRel(undefined, this._x, this._y, this._x1, this._y1); - } - }]); - - return _SVGPathSegCurvetoQuadraticRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoQuadraticRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - x1: { - get: function get() { - return this._x1; - }, - set: function set(x1) { - this._x1 = x1; - - this._segmentChanged(); - }, - enumerable: true - }, - y1: { - get: function get() { - return this._y1; - }, - set: function set(y1) { - this._y1 = y1; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegArcAbs = /*#__PURE__*/function (_SVGPathSeg11) { - _inherits(_SVGPathSegArcAbs, _SVGPathSeg11); - - var _super10 = _createSuper(_SVGPathSegArcAbs); - - function _SVGPathSegArcAbs(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) { - var _this9; - - _classCallCheck(this, _SVGPathSegArcAbs); - - _this9 = _super10.call(this, _SVGPathSeg.PATHSEG_ARC_ABS, 'A', owningPathSegList); - _this9._x = x; - _this9._y = y; - _this9._r1 = r1; - _this9._r2 = r2; - _this9._angle = angle; - _this9._largeArcFlag = largeArcFlag; - _this9._sweepFlag = sweepFlag; - return _this9; - } - - _createClass(_SVGPathSegArcAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegArcAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._r1 + ' ' + this._r2 + ' ' + this._angle + ' ' + (this._largeArcFlag ? '1' : '0') + ' ' + (this._sweepFlag ? '1' : '0') + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegArcAbs(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag); - } - }]); - - return _SVGPathSegArcAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegArcAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - r1: { - get: function get() { - return this._r1; - }, - set: function set(r1) { - this._r1 = r1; - - this._segmentChanged(); - }, - enumerable: true - }, - r2: { - get: function get() { - return this._r2; - }, - set: function set(r2) { - this._r2 = r2; - - this._segmentChanged(); - }, - enumerable: true - }, - angle: { - get: function get() { - return this._angle; - }, - set: function set(angle) { - this._angle = angle; - - this._segmentChanged(); - }, - enumerable: true - }, - largeArcFlag: { - get: function get() { - return this._largeArcFlag; - }, - set: function set(largeArcFlag) { - this._largeArcFlag = largeArcFlag; - - this._segmentChanged(); - }, - enumerable: true - }, - sweepFlag: { - get: function get() { - return this._sweepFlag; - }, - set: function set(sweepFlag) { - this._sweepFlag = sweepFlag; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegArcRel = /*#__PURE__*/function (_SVGPathSeg12) { - _inherits(_SVGPathSegArcRel, _SVGPathSeg12); - - var _super11 = _createSuper(_SVGPathSegArcRel); - - function _SVGPathSegArcRel(owningPathSegList, x, y, r1, r2, angle, largeArcFlag, sweepFlag) { - var _this10; - - _classCallCheck(this, _SVGPathSegArcRel); - - _this10 = _super11.call(this, _SVGPathSeg.PATHSEG_ARC_REL, 'a', owningPathSegList); - _this10._x = x; - _this10._y = y; - _this10._r1 = r1; - _this10._r2 = r2; - _this10._angle = angle; - _this10._largeArcFlag = largeArcFlag; - _this10._sweepFlag = sweepFlag; - return _this10; - } - - _createClass(_SVGPathSegArcRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegArcRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._r1 + ' ' + this._r2 + ' ' + this._angle + ' ' + (this._largeArcFlag ? '1' : '0') + ' ' + (this._sweepFlag ? '1' : '0') + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegArcRel(undefined, this._x, this._y, this._r1, this._r2, this._angle, this._largeArcFlag, this._sweepFlag); - } - }]); - - return _SVGPathSegArcRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegArcRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - r1: { - get: function get() { - return this._r1; - }, - set: function set(r1) { - this._r1 = r1; - - this._segmentChanged(); - }, - enumerable: true - }, - r2: { - get: function get() { - return this._r2; - }, - set: function set(r2) { - this._r2 = r2; - - this._segmentChanged(); - }, - enumerable: true - }, - angle: { - get: function get() { - return this._angle; - }, - set: function set(angle) { - this._angle = angle; - - this._segmentChanged(); - }, - enumerable: true - }, - largeArcFlag: { - get: function get() { - return this._largeArcFlag; - }, - set: function set(largeArcFlag) { - this._largeArcFlag = largeArcFlag; - - this._segmentChanged(); - }, - enumerable: true - }, - sweepFlag: { - get: function get() { - return this._sweepFlag; - }, - set: function set(sweepFlag) { - this._sweepFlag = sweepFlag; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegLinetoHorizontalAbs = /*#__PURE__*/function (_SVGPathSeg13) { - _inherits(_SVGPathSegLinetoHorizontalAbs, _SVGPathSeg13); - - var _super12 = _createSuper(_SVGPathSegLinetoHorizontalAbs); - - function _SVGPathSegLinetoHorizontalAbs(owningPathSegList, x) { - var _this11; - - _classCallCheck(this, _SVGPathSegLinetoHorizontalAbs); - - _this11 = _super12.call(this, _SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS, 'H', owningPathSegList); - _this11._x = x; - return _this11; - } - - _createClass(_SVGPathSegLinetoHorizontalAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegLinetoHorizontalAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegLinetoHorizontalAbs(undefined, this._x); - } - }]); - - return _SVGPathSegLinetoHorizontalAbs; - }(_SVGPathSeg); - - Object.defineProperty(_SVGPathSegLinetoHorizontalAbs.prototype, 'x', { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }); - - var _SVGPathSegLinetoHorizontalRel = /*#__PURE__*/function (_SVGPathSeg14) { - _inherits(_SVGPathSegLinetoHorizontalRel, _SVGPathSeg14); - - var _super13 = _createSuper(_SVGPathSegLinetoHorizontalRel); - - function _SVGPathSegLinetoHorizontalRel(owningPathSegList, x) { - var _this12; - - _classCallCheck(this, _SVGPathSegLinetoHorizontalRel); - - _this12 = _super13.call(this, _SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL, 'h', owningPathSegList); - _this12._x = x; - return _this12; - } - - _createClass(_SVGPathSegLinetoHorizontalRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegLinetoHorizontalRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegLinetoHorizontalRel(undefined, this._x); - } - }]); - - return _SVGPathSegLinetoHorizontalRel; - }(_SVGPathSeg); - - Object.defineProperty(_SVGPathSegLinetoHorizontalRel.prototype, 'x', { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }); - - var _SVGPathSegLinetoVerticalAbs = /*#__PURE__*/function (_SVGPathSeg15) { - _inherits(_SVGPathSegLinetoVerticalAbs, _SVGPathSeg15); - - var _super14 = _createSuper(_SVGPathSegLinetoVerticalAbs); - - function _SVGPathSegLinetoVerticalAbs(owningPathSegList, y) { - var _this13; - - _classCallCheck(this, _SVGPathSegLinetoVerticalAbs); - - _this13 = _super14.call(this, _SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS, 'V', owningPathSegList); - _this13._y = y; - return _this13; - } - - _createClass(_SVGPathSegLinetoVerticalAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegLinetoVerticalAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegLinetoVerticalAbs(undefined, this._y); - } - }]); - - return _SVGPathSegLinetoVerticalAbs; - }(_SVGPathSeg); - - Object.defineProperty(_SVGPathSegLinetoVerticalAbs.prototype, 'y', { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }); - - var _SVGPathSegLinetoVerticalRel = /*#__PURE__*/function (_SVGPathSeg16) { - _inherits(_SVGPathSegLinetoVerticalRel, _SVGPathSeg16); - - var _super15 = _createSuper(_SVGPathSegLinetoVerticalRel); - - function _SVGPathSegLinetoVerticalRel(owningPathSegList, y) { - var _this14; - - _classCallCheck(this, _SVGPathSegLinetoVerticalRel); - - _this14 = _super15.call(this, _SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL, 'v', owningPathSegList); - _this14._y = y; - return _this14; - } - - _createClass(_SVGPathSegLinetoVerticalRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegLinetoVerticalRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegLinetoVerticalRel(undefined, this._y); - } - }]); - - return _SVGPathSegLinetoVerticalRel; - }(_SVGPathSeg); - - Object.defineProperty(_SVGPathSegLinetoVerticalRel.prototype, 'y', { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }); - - var _SVGPathSegCurvetoCubicSmoothAbs = /*#__PURE__*/function (_SVGPathSeg17) { - _inherits(_SVGPathSegCurvetoCubicSmoothAbs, _SVGPathSeg17); - - var _super16 = _createSuper(_SVGPathSegCurvetoCubicSmoothAbs); - - function _SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, x, y, x2, y2) { - var _this15; - - _classCallCheck(this, _SVGPathSegCurvetoCubicSmoothAbs); - - _this15 = _super16.call(this, _SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS, 'S', owningPathSegList); - _this15._x = x; - _this15._y = y; - _this15._x2 = x2; - _this15._y2 = y2; - return _this15; - } - - _createClass(_SVGPathSegCurvetoCubicSmoothAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoCubicSmoothAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoCubicSmoothAbs(undefined, this._x, this._y, this._x2, this._y2); - } - }]); - - return _SVGPathSegCurvetoCubicSmoothAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoCubicSmoothAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - x2: { - get: function get() { - return this._x2; - }, - set: function set(x2) { - this._x2 = x2; - - this._segmentChanged(); - }, - enumerable: true - }, - y2: { - get: function get() { - return this._y2; - }, - set: function set(y2) { - this._y2 = y2; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoCubicSmoothRel = /*#__PURE__*/function (_SVGPathSeg18) { - _inherits(_SVGPathSegCurvetoCubicSmoothRel, _SVGPathSeg18); - - var _super17 = _createSuper(_SVGPathSegCurvetoCubicSmoothRel); - - function _SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, x, y, x2, y2) { - var _this16; - - _classCallCheck(this, _SVGPathSegCurvetoCubicSmoothRel); - - _this16 = _super17.call(this, _SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL, 's', owningPathSegList); - _this16._x = x; - _this16._y = y; - _this16._x2 = x2; - _this16._y2 = y2; - return _this16; - } - - _createClass(_SVGPathSegCurvetoCubicSmoothRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoCubicSmoothRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x2 + ' ' + this._y2 + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoCubicSmoothRel(undefined, this._x, this._y, this._x2, this._y2); - } - }]); - - return _SVGPathSegCurvetoCubicSmoothRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoCubicSmoothRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - }, - x2: { - get: function get() { - return this._x2; - }, - set: function set(x2) { - this._x2 = x2; - - this._segmentChanged(); - }, - enumerable: true - }, - y2: { - get: function get() { - return this._y2; - }, - set: function set(y2) { - this._y2 = y2; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoQuadraticSmoothAbs = /*#__PURE__*/function (_SVGPathSeg19) { - _inherits(_SVGPathSegCurvetoQuadraticSmoothAbs, _SVGPathSeg19); - - var _super18 = _createSuper(_SVGPathSegCurvetoQuadraticSmoothAbs); - - function _SVGPathSegCurvetoQuadraticSmoothAbs(owningPathSegList, x, y) { - var _this17; - - _classCallCheck(this, _SVGPathSegCurvetoQuadraticSmoothAbs); - - _this17 = _super18.call(this, _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS, 'T', owningPathSegList); - _this17._x = x; - _this17._y = y; - return _this17; - } - - _createClass(_SVGPathSegCurvetoQuadraticSmoothAbs, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoQuadraticSmoothAbs]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoQuadraticSmoothAbs(undefined, this._x, this._y); - } - }]); - - return _SVGPathSegCurvetoQuadraticSmoothAbs; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoQuadraticSmoothAbs.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - } - }); - - var _SVGPathSegCurvetoQuadraticSmoothRel = /*#__PURE__*/function (_SVGPathSeg20) { - _inherits(_SVGPathSegCurvetoQuadraticSmoothRel, _SVGPathSeg20); - - var _super19 = _createSuper(_SVGPathSegCurvetoQuadraticSmoothRel); - - function _SVGPathSegCurvetoQuadraticSmoothRel(owningPathSegList, x, y) { - var _this18; - - _classCallCheck(this, _SVGPathSegCurvetoQuadraticSmoothRel); - - _this18 = _super19.call(this, _SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL, 't', owningPathSegList); - _this18._x = x; - _this18._y = y; - return _this18; - } - - _createClass(_SVGPathSegCurvetoQuadraticSmoothRel, [{ - key: "toString", - value: function toString() { - return '[object SVGPathSegCurvetoQuadraticSmoothRel]'; - } - }, { - key: "_asPathString", - value: function _asPathString() { - return this.pathSegTypeAsLetter + ' ' + this._x + ' ' + this._y; - } - }, { - key: "clone", - value: function clone() { - return new _SVGPathSegCurvetoQuadraticSmoothRel(undefined, this._x, this._y); - } - }]); - - return _SVGPathSegCurvetoQuadraticSmoothRel; - }(_SVGPathSeg); - - Object.defineProperties(_SVGPathSegCurvetoQuadraticSmoothRel.prototype, { - x: { - get: function get() { - return this._x; - }, - set: function set(x) { - this._x = x; - - this._segmentChanged(); - }, - enumerable: true - }, - y: { - get: function get() { - return this._y; - }, - set: function set(y) { - this._y = y; - - this._segmentChanged(); - }, - enumerable: true - } - }); // Add createSVGPathSeg* functions to SVGPathElement. - // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathElement. - - SVGPathElement.prototype.createSVGPathSegClosePath = function () { - return new _SVGPathSegClosePath(undefined); - }; - - SVGPathElement.prototype.createSVGPathSegMovetoAbs = function (x, y) { - return new _SVGPathSegMovetoAbs(undefined, x, y); - }; - - SVGPathElement.prototype.createSVGPathSegMovetoRel = function (x, y) { - return new _SVGPathSegMovetoRel(undefined, x, y); - }; - - SVGPathElement.prototype.createSVGPathSegLinetoAbs = function (x, y) { - return new _SVGPathSegLinetoAbs(undefined, x, y); - }; - - SVGPathElement.prototype.createSVGPathSegLinetoRel = function (x, y) { - return new _SVGPathSegLinetoRel(undefined, x, y); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs = function (x, y, x1, y1, x2, y2) { - return new _SVGPathSegCurvetoCubicAbs(undefined, x, y, x1, y1, x2, y2); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel = function (x, y, x1, y1, x2, y2) { - return new _SVGPathSegCurvetoCubicRel(undefined, x, y, x1, y1, x2, y2); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs = function (x, y, x1, y1) { - return new _SVGPathSegCurvetoQuadraticAbs(undefined, x, y, x1, y1); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel = function (x, y, x1, y1) { - return new _SVGPathSegCurvetoQuadraticRel(undefined, x, y, x1, y1); - }; - - SVGPathElement.prototype.createSVGPathSegArcAbs = function (x, y, r1, r2, angle, largeArcFlag, sweepFlag) { - return new _SVGPathSegArcAbs(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag); - }; - - SVGPathElement.prototype.createSVGPathSegArcRel = function (x, y, r1, r2, angle, largeArcFlag, sweepFlag) { - return new _SVGPathSegArcRel(undefined, x, y, r1, r2, angle, largeArcFlag, sweepFlag); - }; - - SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs = function (x) { - return new _SVGPathSegLinetoHorizontalAbs(undefined, x); - }; - - SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel = function (x) { - return new _SVGPathSegLinetoHorizontalRel(undefined, x); - }; - - SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs = function (y) { - return new _SVGPathSegLinetoVerticalAbs(undefined, y); - }; - - SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel = function (y) { - return new _SVGPathSegLinetoVerticalRel(undefined, y); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs = function (x, y, x2, y2) { - return new _SVGPathSegCurvetoCubicSmoothAbs(undefined, x, y, x2, y2); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel = function (x, y, x2, y2) { - return new _SVGPathSegCurvetoCubicSmoothRel(undefined, x, y, x2, y2); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs = function (x, y) { - return new _SVGPathSegCurvetoQuadraticSmoothAbs(undefined, x, y); - }; - - SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel = function (x, y) { - return new _SVGPathSegCurvetoQuadraticSmoothRel(undefined, x, y); - }; - - if (!('getPathSegAtLength' in SVGPathElement.prototype)) { - // Add getPathSegAtLength to SVGPathElement. - // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-__svg__SVGPathElement__getPathSegAtLength - // This polyfill requires SVGPathElement.getTotalLength to implement the distance-along-a-path algorithm. - SVGPathElement.prototype.getPathSegAtLength = function (distance) { - if (distance === undefined || !isFinite(distance)) { - throw new Error('Invalid arguments.'); - } - - var measurementElement = document.createElementNS('http://www.w3.org/2000/svg', 'path'); - measurementElement.setAttribute('d', this.getAttribute('d')); - var lastPathSegment = measurementElement.pathSegList.numberOfItems - 1; // If the path is empty, return 0. - - if (lastPathSegment <= 0) { - return 0; - } - - do { - measurementElement.pathSegList.removeItem(lastPathSegment); - - if (distance > measurementElement.getTotalLength()) { - break; - } - - lastPathSegment--; - } while (lastPathSegment > 0); - - return lastPathSegment; - }; - } - - window.SVGPathSeg = _SVGPathSeg; - window.SVGPathSegClosePath = _SVGPathSegClosePath; - window.SVGPathSegMovetoAbs = _SVGPathSegMovetoAbs; - window.SVGPathSegMovetoRel = _SVGPathSegMovetoRel; - window.SVGPathSegLinetoAbs = _SVGPathSegLinetoAbs; - window.SVGPathSegLinetoRel = _SVGPathSegLinetoRel; - window.SVGPathSegCurvetoCubicAbs = _SVGPathSegCurvetoCubicAbs; - window.SVGPathSegCurvetoCubicRel = _SVGPathSegCurvetoCubicRel; - window.SVGPathSegCurvetoQuadraticAbs = _SVGPathSegCurvetoQuadraticAbs; - window.SVGPathSegCurvetoQuadraticRel = _SVGPathSegCurvetoQuadraticRel; - window.SVGPathSegArcAbs = _SVGPathSegArcAbs; - window.SVGPathSegArcRel = _SVGPathSegArcRel; - window.SVGPathSegLinetoHorizontalAbs = _SVGPathSegLinetoHorizontalAbs; - window.SVGPathSegLinetoHorizontalRel = _SVGPathSegLinetoHorizontalRel; - window.SVGPathSegLinetoVerticalAbs = _SVGPathSegLinetoVerticalAbs; - window.SVGPathSegLinetoVerticalRel = _SVGPathSegLinetoVerticalRel; - window.SVGPathSegCurvetoCubicSmoothAbs = _SVGPathSegCurvetoCubicSmoothAbs; - window.SVGPathSegCurvetoCubicSmoothRel = _SVGPathSegCurvetoCubicSmoothRel; - window.SVGPathSegCurvetoQuadraticSmoothAbs = _SVGPathSegCurvetoQuadraticSmoothAbs; - window.SVGPathSegCurvetoQuadraticSmoothRel = _SVGPathSegCurvetoQuadraticSmoothRel; - } // Checking for SVGPathSegList in window checks for the case of an implementation without the - // SVGPathSegList API. - // The second check for appendItem is specific to Firefox 59+ which removed only parts of the - // SVGPathSegList API (e.g., appendItem). In this case we need to re-implement the entire API - // so the polyfill data (i.e., _list) is used throughout. - - - if (!('SVGPathSegList' in window) || !('appendItem' in window.SVGPathSegList.prototype)) { - // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGPathSegList - var SVGPathSegList = /*#__PURE__*/function () { - function SVGPathSegList(pathElement) { - _classCallCheck(this, SVGPathSegList); - - this._pathElement = pathElement; - this._list = this._parsePath(this._pathElement.getAttribute('d')); // Use a MutationObserver to catch changes to the path's "d" attribute. - - this._mutationObserverConfig = { - attributes: true, - attributeFilter: ['d'] - }; - this._pathElementMutationObserver = new MutationObserver(this._updateListFromPathMutations.bind(this)); - - this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig); - } // Process any pending mutations to the path element and update the list as needed. - // This should be the first call of all public functions and is needed because - // MutationObservers are not synchronous so we can have pending asynchronous mutations. - - - _createClass(SVGPathSegList, [{ - key: "_checkPathSynchronizedToList", - value: function _checkPathSynchronizedToList() { - this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords()); - } - }, { - key: "_updateListFromPathMutations", - value: function _updateListFromPathMutations(mutationRecords) { - if (!this._pathElement) { - return; - } - - var hasPathMutations = false; - mutationRecords.forEach(function (record) { - if (record.attributeName === 'd') { - hasPathMutations = true; - } - }); - - if (hasPathMutations) { - this._list = this._parsePath(this._pathElement.getAttribute('d')); - } - } // Serialize the list and update the path's 'd' attribute. - - }, { - key: "_writeListToPath", - value: function _writeListToPath() { - this._pathElementMutationObserver.disconnect(); - - this._pathElement.setAttribute('d', SVGPathSegList._pathSegArrayAsString(this._list)); - - this._pathElementMutationObserver.observe(this._pathElement, this._mutationObserverConfig); - } // When a path segment changes the list needs to be synchronized back to the path element. - - }, { - key: "segmentChanged", - value: function segmentChanged(pathSeg) { - this._writeListToPath(); - } - }, { - key: "clear", - value: function clear() { - this._checkPathSynchronizedToList(); - - this._list.forEach(function (pathSeg) { - pathSeg._owningPathSegList = null; - }); - - this._list = []; - - this._writeListToPath(); - } - }, { - key: "initialize", - value: function initialize(newItem) { - this._checkPathSynchronizedToList(); - - this._list = [newItem]; - newItem._owningPathSegList = this; - - this._writeListToPath(); - - return newItem; - } - }, { - key: "_checkValidIndex", - value: function _checkValidIndex(index) { - if (isNaN(index) || index < 0 || index >= this.numberOfItems) { - throw new Error('INDEX_SIZE_ERR'); - } - } - }, { - key: "getItem", - value: function getItem(index) { - this._checkPathSynchronizedToList(); - - this._checkValidIndex(index); - - return this._list[index]; - } - }, { - key: "insertItemBefore", - value: function insertItemBefore(newItem, index) { - this._checkPathSynchronizedToList(); // Spec: If the index is greater than or equal to numberOfItems, then the new item is appended to the end of the list. - - - if (index > this.numberOfItems) { - index = this.numberOfItems; - } - - if (newItem._owningPathSegList) { - // SVG2 spec says to make a copy. - newItem = newItem.clone(); - } - - this._list.splice(index, 0, newItem); - - newItem._owningPathSegList = this; - - this._writeListToPath(); - - return newItem; - } - }, { - key: "replaceItem", - value: function replaceItem(newItem, index) { - this._checkPathSynchronizedToList(); - - if (newItem._owningPathSegList) { - // SVG2 spec says to make a copy. - newItem = newItem.clone(); - } - - this._checkValidIndex(index); - - this._list[index] = newItem; - newItem._owningPathSegList = this; - - this._writeListToPath(); - - return newItem; - } - }, { - key: "removeItem", - value: function removeItem(index) { - this._checkPathSynchronizedToList(); - - this._checkValidIndex(index); - - var item = this._list[index]; - - this._list.splice(index, 1); - - this._writeListToPath(); - - return item; - } - }, { - key: "appendItem", - value: function appendItem(newItem) { - this._checkPathSynchronizedToList(); - - if (newItem._owningPathSegList) { - // SVG2 spec says to make a copy. - newItem = newItem.clone(); - } - - this._list.push(newItem); - - newItem._owningPathSegList = this; // TODO: Optimize this to just append to the existing attribute. - - this._writeListToPath(); - - return newItem; - } // This closely follows SVGPathParser::parsePath from Source/core/svg/SVGPathParser.cpp. - - }, { - key: "_parsePath", - value: function _parsePath(string) { - if (!string || !string.length) { - return []; - } - - var owningPathSegList = this; - - var Builder = /*#__PURE__*/function () { - function Builder() { - _classCallCheck(this, Builder); - - this.pathSegList = []; - } - - _createClass(Builder, [{ - key: "appendSegment", - value: function appendSegment(pathSeg) { - this.pathSegList.push(pathSeg); - } - }]); - - return Builder; - }(); - - var Source = /*#__PURE__*/function () { - function Source(string) { - _classCallCheck(this, Source); - - this._string = string; - this._currentIndex = 0; - this._endIndex = this._string.length; - this._previousCommand = SVGPathSeg.PATHSEG_UNKNOWN; - - this._skipOptionalSpaces(); - } - - _createClass(Source, [{ - key: "_isCurrentSpace", - value: function _isCurrentSpace() { - var character = this._string[this._currentIndex]; - return character <= ' ' && (character === ' ' || character === '\n' || character === '\t' || character === '\r' || character === '\f'); - } - }, { - key: "_skipOptionalSpaces", - value: function _skipOptionalSpaces() { - while (this._currentIndex < this._endIndex && this._isCurrentSpace()) { - this._currentIndex++; - } - - return this._currentIndex < this._endIndex; - } - }, { - key: "_skipOptionalSpacesOrDelimiter", - value: function _skipOptionalSpacesOrDelimiter() { - if (this._currentIndex < this._endIndex && !this._isCurrentSpace() && this._string.charAt(this._currentIndex) !== ',') { - return false; - } - - if (this._skipOptionalSpaces()) { - if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === ',') { - this._currentIndex++; - - this._skipOptionalSpaces(); - } - } - - return this._currentIndex < this._endIndex; - } - }, { - key: "hasMoreData", - value: function hasMoreData() { - return this._currentIndex < this._endIndex; - } - }, { - key: "peekSegmentType", - value: function peekSegmentType() { - var lookahead = this._string[this._currentIndex]; - return this._pathSegTypeFromChar(lookahead); - } - }, { - key: "_pathSegTypeFromChar", - value: function _pathSegTypeFromChar(lookahead) { - switch (lookahead) { - case 'Z': - case 'z': - return SVGPathSeg.PATHSEG_CLOSEPATH; - - case 'M': - return SVGPathSeg.PATHSEG_MOVETO_ABS; - - case 'm': - return SVGPathSeg.PATHSEG_MOVETO_REL; - - case 'L': - return SVGPathSeg.PATHSEG_LINETO_ABS; - - case 'l': - return SVGPathSeg.PATHSEG_LINETO_REL; - - case 'C': - return SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS; - - case 'c': - return SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL; - - case 'Q': - return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS; - - case 'q': - return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL; - - case 'A': - return SVGPathSeg.PATHSEG_ARC_ABS; - - case 'a': - return SVGPathSeg.PATHSEG_ARC_REL; - - case 'H': - return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS; - - case 'h': - return SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL; - - case 'V': - return SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS; - - case 'v': - return SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL; - - case 'S': - return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS; - - case 's': - return SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL; - - case 'T': - return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS; - - case 't': - return SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL; - - default: - return SVGPathSeg.PATHSEG_UNKNOWN; - } - } - }, { - key: "_nextCommandHelper", - value: function _nextCommandHelper(lookahead, previousCommand) { - // Check for remaining coordinates in the current command. - if ((lookahead === '+' || lookahead === '-' || lookahead === '.' || lookahead >= '0' && lookahead <= '9') && previousCommand !== SVGPathSeg.PATHSEG_CLOSEPATH) { - if (previousCommand === SVGPathSeg.PATHSEG_MOVETO_ABS) { - return SVGPathSeg.PATHSEG_LINETO_ABS; - } - - if (previousCommand === SVGPathSeg.PATHSEG_MOVETO_REL) { - return SVGPathSeg.PATHSEG_LINETO_REL; - } - - return previousCommand; - } - - return SVGPathSeg.PATHSEG_UNKNOWN; - } - }, { - key: "initialCommandIsMoveTo", - value: function initialCommandIsMoveTo() { - // If the path is empty it is still valid, so return true. - if (!this.hasMoreData()) { - return true; - } - - var command = this.peekSegmentType(); // Path must start with moveTo. - - return command === SVGPathSeg.PATHSEG_MOVETO_ABS || command === SVGPathSeg.PATHSEG_MOVETO_REL; - } // Parse a number from an SVG path. This very closely follows genericParseNumber(...) from Source/core/svg/SVGParserUtilities.cpp. - // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-PathDataBNF - - }, { - key: "_parseNumber", - value: function _parseNumber() { - var exponent = 0; - var integer = 0; - var frac = 1; - var decimal = 0; - var sign = 1; - var expsign = 1; - var startIndex = this._currentIndex; - - this._skipOptionalSpaces(); // Read the sign. - - - if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === '+') { - this._currentIndex++; - } else if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === '-') { - this._currentIndex++; - sign = -1; - } - - if (this._currentIndex === this._endIndex || (this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') && this._string.charAt(this._currentIndex) !== '.') { - // The first character of a number must be one of [0-9+-.]. - return undefined; - } // Read the integer part, build right-to-left. - - - var startIntPartIndex = this._currentIndex; - - while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') { - this._currentIndex++; // Advance to first non-digit. - } - - if (this._currentIndex !== startIntPartIndex) { - var scanIntPartIndex = this._currentIndex - 1; - var multiplier = 1; - - while (scanIntPartIndex >= startIntPartIndex) { - integer += multiplier * (this._string.charAt(scanIntPartIndex--) - '0'); - multiplier *= 10; - } - } // Read the decimals. - - - if (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) === '.') { - this._currentIndex++; // There must be a least one digit following the . - - if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') { - return undefined; - } - - while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') { - frac *= 10; - decimal += (this._string.charAt(this._currentIndex) - '0') / frac; - this._currentIndex += 1; - } - } // Read the exponent part. - - - 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') { - this._currentIndex++; // Read the sign of the exponent. - - if (this._string.charAt(this._currentIndex) === '+') { - this._currentIndex++; - } else if (this._string.charAt(this._currentIndex) === '-') { - this._currentIndex++; - expsign = -1; - } // There must be an exponent. - - - if (this._currentIndex >= this._endIndex || this._string.charAt(this._currentIndex) < '0' || this._string.charAt(this._currentIndex) > '9') { - return undefined; - } - - while (this._currentIndex < this._endIndex && this._string.charAt(this._currentIndex) >= '0' && this._string.charAt(this._currentIndex) <= '9') { - exponent *= 10; - exponent += this._string.charAt(this._currentIndex) - '0'; - this._currentIndex++; - } - } - - var number = integer + decimal; - number *= sign; - - if (exponent) { - number *= Math.pow(10, expsign * exponent); - } - - if (startIndex === this._currentIndex) { - return undefined; - } - - this._skipOptionalSpacesOrDelimiter(); - - return number; - } - }, { - key: "_parseArcFlag", - value: function _parseArcFlag() { - if (this._currentIndex >= this._endIndex) { - return undefined; - } - - var flag = false; - - var flagChar = this._string.charAt(this._currentIndex++); - - if (flagChar === '0') { - flag = false; - } else if (flagChar === '1') { - flag = true; - } else { - return undefined; - } - - this._skipOptionalSpacesOrDelimiter(); - - return flag; - } - }, { - key: "parseSegment", - value: function parseSegment() { - var lookahead = this._string[this._currentIndex]; - - var command = this._pathSegTypeFromChar(lookahead); - - if (command === SVGPathSeg.PATHSEG_UNKNOWN) { - // Possibly an implicit command. Not allowed if this is the first command. - if (this._previousCommand === SVGPathSeg.PATHSEG_UNKNOWN) { - return null; - } - - command = this._nextCommandHelper(lookahead, this._previousCommand); - - if (command === SVGPathSeg.PATHSEG_UNKNOWN) { - return null; - } - } else { - this._currentIndex++; - } - - this._previousCommand = command; - - switch (command) { - case SVGPathSeg.PATHSEG_MOVETO_REL: - return new SVGPathSegMovetoRel(owningPathSegList, this._parseNumber(), this._parseNumber()); - - case SVGPathSeg.PATHSEG_MOVETO_ABS: - return new SVGPathSegMovetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber()); - - case SVGPathSeg.PATHSEG_LINETO_REL: - return new SVGPathSegLinetoRel(owningPathSegList, this._parseNumber(), this._parseNumber()); - - case SVGPathSeg.PATHSEG_LINETO_ABS: - return new SVGPathSegLinetoAbs(owningPathSegList, this._parseNumber(), this._parseNumber()); - - case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL: - return new SVGPathSegLinetoHorizontalRel(owningPathSegList, this._parseNumber()); - - case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS: - return new SVGPathSegLinetoHorizontalAbs(owningPathSegList, this._parseNumber()); - - case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL: - return new SVGPathSegLinetoVerticalRel(owningPathSegList, this._parseNumber()); - - case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS: - return new SVGPathSegLinetoVerticalAbs(owningPathSegList, this._parseNumber()); - - case SVGPathSeg.PATHSEG_CLOSEPATH: - this._skipOptionalSpaces(); - - return new SVGPathSegClosePath(owningPathSegList); - - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL: - { - var points = { - x1: this._parseNumber(), - y1: this._parseNumber(), - x2: this._parseNumber(), - y2: this._parseNumber(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegCurvetoCubicRel(owningPathSegList, points.x, points.y, points.x1, points.y1, points.x2, points.y2); - } - - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS: - { - var _points = { - x1: this._parseNumber(), - y1: this._parseNumber(), - x2: this._parseNumber(), - y2: this._parseNumber(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegCurvetoCubicAbs(owningPathSegList, _points.x, _points.y, _points.x1, _points.y1, _points.x2, _points.y2); - } - - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL: - { - var _points2 = { - x2: this._parseNumber(), - y2: this._parseNumber(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegCurvetoCubicSmoothRel(owningPathSegList, _points2.x, _points2.y, _points2.x2, _points2.y2); - } - - case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: - { - var _points3 = { - x2: this._parseNumber(), - y2: this._parseNumber(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegCurvetoCubicSmoothAbs(owningPathSegList, _points3.x, _points3.y, _points3.x2, _points3.y2); - } - - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL: - { - var _points4 = { - x1: this._parseNumber(), - y1: this._parseNumber(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegCurvetoQuadraticRel(owningPathSegList, _points4.x, _points4.y, _points4.x1, _points4.y1); - } - - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS: - { - var _points5 = { - x1: this._parseNumber(), - y1: this._parseNumber(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegCurvetoQuadraticAbs(owningPathSegList, _points5.x, _points5.y, _points5.x1, _points5.y1); - } - - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: - return new SVGPathSegCurvetoQuadraticSmoothRel(owningPathSegList, this._parseNumber(), this._parseNumber()); - - case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: - return new SVGPathSegCurvetoQuadraticSmoothAbs(owningPathSegList, this._parseNumber(), this._parseNumber()); - - case SVGPathSeg.PATHSEG_ARC_REL: - { - var _points6 = { - x1: this._parseNumber(), - y1: this._parseNumber(), - arcAngle: this._parseNumber(), - arcLarge: this._parseArcFlag(), - arcSweep: this._parseArcFlag(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegArcRel(owningPathSegList, _points6.x, _points6.y, _points6.x1, _points6.y1, _points6.arcAngle, _points6.arcLarge, _points6.arcSweep); - } - - case SVGPathSeg.PATHSEG_ARC_ABS: - { - var _points7 = { - x1: this._parseNumber(), - y1: this._parseNumber(), - arcAngle: this._parseNumber(), - arcLarge: this._parseArcFlag(), - arcSweep: this._parseArcFlag(), - x: this._parseNumber(), - y: this._parseNumber() - }; - return new SVGPathSegArcAbs(owningPathSegList, _points7.x, _points7.y, _points7.x1, _points7.y1, _points7.arcAngle, _points7.arcLarge, _points7.arcSweep); - } - - default: - throw new Error('Unknown path seg type.'); - } - } - }]); - - return Source; - }(); - - var builder = new Builder(); - var source = new Source(string); - - if (!source.initialCommandIsMoveTo()) { - return []; - } - - while (source.hasMoreData()) { - var pathSeg = source.parseSegment(); - - if (!pathSeg) { - return []; - } - - builder.appendSegment(pathSeg); - } - - return builder.pathSegList; - } // STATIC - - }], [{ - key: "_pathSegArrayAsString", - value: function _pathSegArrayAsString(pathSegArray) { - var string = ''; - var first = true; - pathSegArray.forEach(function (pathSeg) { - if (first) { - first = false; - string += pathSeg._asPathString(); - } else { - string += ' ' + pathSeg._asPathString(); - } - }); - return string; - } - }]); - - return SVGPathSegList; - }(); - - SVGPathSegList.prototype.classname = 'SVGPathSegList'; - Object.defineProperty(SVGPathSegList.prototype, 'numberOfItems', { - get: function get() { - this._checkPathSynchronizedToList(); - - return this._list.length; - }, - enumerable: true - }); // Add the pathSegList accessors to SVGPathElement. - // Spec: https://www.w3.org/TR/SVG11/single-page.html#paths-InterfaceSVGAnimatedPathData - - Object.defineProperties(SVGPathElement.prototype, { - pathSegList: { - get: function get() { - if (!this._pathSegList) { - this._pathSegList = new SVGPathSegList(this); - } - - return this._pathSegList; - }, - enumerable: true - }, - // TODO: The following are not implemented and simply return SVGPathElement.pathSegList. - normalizedPathSegList: { - get: function get() { - return this.pathSegList; - }, - enumerable: true - }, - animatedPathSegList: { - get: function get() { - return this.pathSegList; - }, - enumerable: true - }, - animatedNormalizedPathSegList: { - get: function get() { - return this.pathSegList; - }, - enumerable: true - } - }); - window.SVGPathSegList = SVGPathSegList; - } - })(); - - // The button toggles whether the path is open or closed - - var extClosepath = { - name: 'closepath', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var importLocale, $, strings, svgEditor, selElems, updateButton, showPanel, toggleClosed, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - importLocale = _ref.importLocale, $ = _ref.$; - _context.next = 3; - return importLocale(); - - case 3: - strings = _context.sent; - svgEditor = _this; - - updateButton = function updateButton(path) { - var seglist = path.pathSegList, - closed = seglist.getItem(seglist.numberOfItems - 1).pathSegType === 1, - showbutton = closed ? '#tool_openpath' : '#tool_closepath', - hidebutton = closed ? '#tool_closepath' : '#tool_openpath'; - $(hidebutton).hide(); - $(showbutton).show(); - }; - - showPanel = function showPanel(on) { - $('#closepath_panel').toggle(on); - - if (on) { - var path = selElems[0]; - - if (path) { - updateButton(path); - } - } - }; - - toggleClosed = function toggleClosed() { - var path = selElems[0]; - - if (path) { - var seglist = path.pathSegList, - last = seglist.numberOfItems - 1; // is closed - - if (seglist.getItem(last).pathSegType === 1) { - seglist.removeItem(last); - } else { - seglist.appendItem(path.createSVGPathSegClosePath()); - } - - updateButton(path); - } - }; - - buttons = [{ - id: 'tool_openpath', - icon: svgEditor.curConfig.extIconsPath + 'openpath.png', - type: 'context', - panel: 'closepath_panel', - events: { - click: function click() { - toggleClosed(); - } - } - }, { - id: 'tool_closepath', - icon: svgEditor.curConfig.extIconsPath + 'closepath.png', - type: 'context', - panel: 'closepath_panel', - events: { - click: function click() { - toggleClosed(); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'closepath_icons.svg', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - callback: function callback() { - $('#closepath_panel').hide(); - }, - selectedChanged: function selectedChanged(opts) { - selElems = opts.elems; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && elem.tagName === 'path') { - if (opts.selectedElement && !opts.multiselected) { - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - } - }); - - case 10: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extClosepath; - -}()); +}; diff --git a/dist/extensions/ext-connector.js b/dist/extensions/ext-connector.js index ddca221c..13629d48 100644 --- a/dist/extensions/ext-connector.js +++ b/dist/extensions/ext-connector.js @@ -1,692 +1,659 @@ -var svgEditorExtension_connector = (function () { - 'use strict'; +/** + * @file ext-connector.js + * + * @license MIT + * + * @copyright 2010 Alexis Deveria + * + */ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; +export default { + name: 'connector', + async init (S) { + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const {getElem} = svgCanvas; + const {$, svgroot, importLocale} = S, + addElem = svgCanvas.addSVGElementFromJson, + selManager = S.selectorManager, + connSel = '.se_connector', + // connect_str = '-SE_CONNECT-', + elData = $.data; + const strings = await importLocale(); + + let startX, + startY, + curLine, + startElem, + endElem, + seNs, + {svgcontent} = S, + started = false, + connections = [], + selElems = []; + + /** + * + * @param {Float} x + * @param {Float} y + * @param {module:utilities.BBoxObject} bb + * @param {Float} offset + * @returns {module:math.XYObject} + */ + function getBBintersect (x, y, bb, offset) { + if (offset) { + offset -= 0; + bb = $.extend({}, bb); + bb.width += offset; + bb.height += offset; + bb.x -= offset / 2; + bb.y -= offset / 2; + } + + const midX = bb.x + bb.width / 2; + const midY = bb.y + bb.height / 2; + const lenX = x - midX; + const lenY = y - midY; + + const slope = Math.abs(lenY / lenX); + + let ratio; + if (slope < bb.height / bb.width) { + ratio = (bb.width / 2) / Math.abs(lenX); + } else { + ratio = lenY + ? (bb.height / 2) / Math.abs(lenY) + : 0; + } + + return { + x: midX + lenX * ratio, + y: midY + lenY * ratio + }; } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); + /** + * @param {"start"|"end"} side + * @param {Element} line + * @returns {Float} + */ + function getOffset (side, line) { + const giveOffset = line.getAttribute('marker-' + side); + // const giveOffset = $(line).data(side+'_off'); + + // TODO: Make this number (5) be based on marker width/height + const size = line.getAttribute('stroke-width') * 5; + return giveOffset ? size : 0; } - } - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + /** + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + let connRules = $('#connector_rules'); + if (!connRules.length) { + connRules = $('').appendTo('head'); + } + connRules.text(!on ? '' : '#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }'); + $('#connector_panel').toggle(on); + } - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /** + * @param {Element} elem + * @param {Integer|"end"} pos + * @param {Float} x + * @param {Float} y + * @param {boolean} [setMid] + * @returns {void} + */ + function setPoint (elem, pos, x, y, setMid) { + const pts = elem.points; + const pt = svgroot.createSVGPoint(); + pt.x = x; + pt.y = y; + if (pos === 'end') { pos = pts.numberOfItems - 1; } + // TODO: Test for this on init, then use alt only if needed + try { + pts.replaceItem(pt, pos); + } catch (err) { + // Should only occur in FF which formats points attr as "n,n n,n", so just split + const ptArr = elem.getAttribute('points').split(' '); + for (let i = 0; i < ptArr.length; i++) { + if (i === pos) { + ptArr[i] = x + ',' + y; + } + } + elem.setAttribute('points', ptArr.join(' ')); + } + + if (setMid) { + // Add center point + const ptStart = pts.getItem(0); + const ptEnd = pts.getItem(pts.numberOfItems - 1); + setPoint(elem, 1, (ptEnd.x + ptStart.x) / 2, (ptEnd.y + ptStart.y) / 2); + } + } + + /** + * @param {Float} diffX + * @param {Float} diffY + * @returns {void} + */ + function updateLine (diffX, diffY) { + // Update line with element + let i = connections.length; + while (i--) { + const conn = connections[i]; + const line = conn.connector; + // const {elem} = conn; + + const pre = conn.is_start ? 'start' : 'end'; + // const sw = line.getAttribute('stroke-width') * 5; + + // Update bbox for this element + const bb = elData(line, pre + '_bb'); + bb.x = conn.start_x + diffX; + bb.y = conn.start_y + diffY; + elData(line, pre + '_bb', bb); + + const altPre = conn.is_start ? 'end' : 'start'; + + // Get center pt of connected element + const bb2 = elData(line, altPre + '_bb'); + const srcX = bb2.x + bb2.width / 2; + const srcY = bb2.y + bb2.height / 2; + + // Set point of element being moved + const pt = getBBintersect(srcX, srcY, bb, getOffset(pre, line)); // $(line).data(pre+'_off')?sw:0 + setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true); + + // Set point of connected element + const pt2 = getBBintersect(pt.x, pt.y, elData(line, altPre + '_bb'), getOffset(altPre, line)); + setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true); + } + } + + /** + * + * @param {Element[]} [elems=selElems] Array of elements + * @returns {void} + */ + function findConnectors (elems = selElems) { + const connectors = $(svgcontent).find(connSel); + connections = []; + + // Loop through connectors to see if one is connected to the element + connectors.each(function () { + let addThis; + /** + * + * @returns {void} + */ + function add () { + if (elems.includes(this)) { + // Pretend this element is selected + addThis = true; + } } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } + // Grab the ends + const parts = []; + ['start', 'end'].forEach(function (pos, i) { + const key = 'c_' + pos; + let part = elData(this, key); + if (part === null || part === undefined) { // Does this ever return nullish values? + part = document.getElementById( + this.attributes['se:connector'].value.split(' ')[i] + ); + elData(this, 'c_' + pos, part.id); + elData(this, pos + '_bb', svgCanvas.getStrokedBBox([part])); + } else part = document.getElementById(part); + parts.push(part); + }, this); - _next(undefined); + for (let i = 0; i < 2; i++) { + const cElem = parts[i]; + + addThis = false; + // The connected element might be part of a selected group + $(cElem).parents().each(add); + + if (!cElem || !cElem.parentNode) { + $(this).remove(); + continue; + } + if (elems.includes(cElem) || addThis) { + const bb = svgCanvas.getStrokedBBox([cElem]); + connections.push({ + elem: cElem, + connector: this, + is_start: (i === 0), + start_x: bb.x, + start_y: bb.y + }); + } + } }); - }; - } - - /** - * @file ext-connector.js - * - * @license MIT - * - * @copyright 2010 Alexis Deveria - * - */ - var extConnector = { - name: 'connector', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var svgEditor, svgCanvas, getElem, $, svgroot, importLocale, addElem, selManager, connSel, elData, strings, startX, startY, curLine, startElem, endElem, seNs, svgcontent, started, connections, selElems, getBBintersect, getOffset, showPanel, setPoint, updateLine, findConnectors, updateConnectors, init, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - init = function _init() { - // Make sure all connectors have data set - $(svgcontent).find('*').each(function () { - var conn = this.getAttributeNS(seNs, 'connector'); - - if (conn) { - this.setAttribute('class', connSel.substr(1)); - var connData = conn.split(' '); - var sbb = svgCanvas.getStrokedBBox([getElem(connData[0])]); - var ebb = svgCanvas.getStrokedBBox([getElem(connData[1])]); - $(this).data('c_start', connData[0]).data('c_end', connData[1]).data('start_bb', sbb).data('end_bb', ebb); - svgCanvas.getEditorNS(true); - } - }); // updateConnectors(); - }; - - updateConnectors = function _updateConnectors(elems) { - // Updates connector lines based on selected elements - // Is not used on mousemove, as it runs getStrokedBBox every time, - // which isn't necessary there. - findConnectors(elems); - - if (connections.length) { - // Update line with element - var i = connections.length; - - while (i--) { - var conn = connections[i]; - var line = conn.connector; - var elem = conn.elem; // const sw = line.getAttribute('stroke-width') * 5; - - var pre = conn.is_start ? 'start' : 'end'; // Update bbox for this element - - var bb = svgCanvas.getStrokedBBox([elem]); - bb.x = conn.start_x; - bb.y = conn.start_y; - elData(line, pre + '_bb', bb); - /* const addOffset = */ - - elData(line, pre + '_off'); - var altPre = conn.is_start ? 'end' : 'start'; // Get center pt of connected element - - var bb2 = elData(line, altPre + '_bb'); - var srcX = bb2.x + bb2.width / 2; - var srcY = bb2.y + bb2.height / 2; // Set point of element being moved - - var pt = getBBintersect(srcX, srcY, bb, getOffset(pre, line)); - setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true); // Set point of connected element - - var pt2 = getBBintersect(pt.x, pt.y, elData(line, altPre + '_bb'), getOffset(altPre, line)); - setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true); // Update points attribute manually for webkit - - if (navigator.userAgent.includes('AppleWebKit')) { - var pts = line.points; - var len = pts.numberOfItems; - var ptArr = []; - - for (var j = 0; j < len; j++) { - pt = pts.getItem(j); - ptArr[j] = pt.x + ',' + pt.y; - } - - line.setAttribute('points', ptArr.join(' ')); - } - } - } - }; - - findConnectors = function _findConnectors() { - var elems = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : selElems; - var connectors = $(svgcontent).find(connSel); - connections = []; // Loop through connectors to see if one is connected to the element - - connectors.each(function () { - var addThis; - /** - * - * @returns {void} - */ - - function add() { - if (elems.includes(this)) { - // Pretend this element is selected - addThis = true; - } - } // Grab the ends - - - var parts = []; - ['start', 'end'].forEach(function (pos, i) { - var key = 'c_' + pos; - var part = elData(this, key); - - if (part === null || part === undefined) { - // Does this ever return nullish values? - part = document.getElementById(this.attributes['se:connector'].value.split(' ')[i]); - elData(this, 'c_' + pos, part.id); - elData(this, pos + '_bb', svgCanvas.getStrokedBBox([part])); - } else part = document.getElementById(part); - - parts.push(part); - }, this); - - for (var i = 0; i < 2; i++) { - var cElem = parts[i]; - addThis = false; // The connected element might be part of a selected group - - $(cElem).parents().each(add); - - if (!cElem || !cElem.parentNode) { - $(this).remove(); - continue; - } - - if (elems.includes(cElem) || addThis) { - var bb = svgCanvas.getStrokedBBox([cElem]); - connections.push({ - elem: cElem, - connector: this, - is_start: i === 0, - start_x: bb.x, - start_y: bb.y - }); - } - } - }); - }; - - updateLine = function _updateLine(diffX, diffY) { - // Update line with element - var i = connections.length; - - while (i--) { - var conn = connections[i]; - var line = conn.connector; // const {elem} = conn; - - var pre = conn.is_start ? 'start' : 'end'; // const sw = line.getAttribute('stroke-width') * 5; - // Update bbox for this element - - var bb = elData(line, pre + '_bb'); - bb.x = conn.start_x + diffX; - bb.y = conn.start_y + diffY; - elData(line, pre + '_bb', bb); - var altPre = conn.is_start ? 'end' : 'start'; // Get center pt of connected element - - var bb2 = elData(line, altPre + '_bb'); - var srcX = bb2.x + bb2.width / 2; - var srcY = bb2.y + bb2.height / 2; // Set point of element being moved - - var pt = getBBintersect(srcX, srcY, bb, getOffset(pre, line)); // $(line).data(pre+'_off')?sw:0 - - setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true); // Set point of connected element - - var pt2 = getBBintersect(pt.x, pt.y, elData(line, altPre + '_bb'), getOffset(altPre, line)); - setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true); - } - }; - - setPoint = function _setPoint(elem, pos, x, y, setMid) { - var pts = elem.points; - var pt = svgroot.createSVGPoint(); - pt.x = x; - pt.y = y; - - if (pos === 'end') { - pos = pts.numberOfItems - 1; - } // TODO: Test for this on init, then use alt only if needed - - - try { - pts.replaceItem(pt, pos); - } catch (err) { - // Should only occur in FF which formats points attr as "n,n n,n", so just split - var ptArr = elem.getAttribute('points').split(' '); - - for (var i = 0; i < ptArr.length; i++) { - if (i === pos) { - ptArr[i] = x + ',' + y; - } - } - - elem.setAttribute('points', ptArr.join(' ')); - } - - if (setMid) { - // Add center point - var ptStart = pts.getItem(0); - var ptEnd = pts.getItem(pts.numberOfItems - 1); - setPoint(elem, 1, (ptEnd.x + ptStart.x) / 2, (ptEnd.y + ptStart.y) / 2); - } - }; - - showPanel = function _showPanel(on) { - var connRules = $('#connector_rules'); - - if (!connRules.length) { - connRules = $('').appendTo('head'); - } - - connRules.text(!on ? '' : '#tool_clone, #tool_topath, #tool_angle, #xy_panel { display: none !important; }'); - $('#connector_panel').toggle(on); - }; - - getOffset = function _getOffset(side, line) { - var giveOffset = line.getAttribute('marker-' + side); // const giveOffset = $(line).data(side+'_off'); - // TODO: Make this number (5) be based on marker width/height - - var size = line.getAttribute('stroke-width') * 5; - return giveOffset ? size : 0; - }; - - getBBintersect = function _getBBintersect(x, y, bb, offset) { - if (offset) { - offset -= 0; - bb = $.extend({}, bb); - bb.width += offset; - bb.height += offset; - bb.x -= offset / 2; - bb.y -= offset / 2; - } - - var midX = bb.x + bb.width / 2; - var midY = bb.y + bb.height / 2; - var lenX = x - midX; - var lenY = y - midY; - var slope = Math.abs(lenY / lenX); - var ratio; - - if (slope < bb.height / bb.width) { - ratio = bb.width / 2 / Math.abs(lenX); - } else { - ratio = lenY ? bb.height / 2 / Math.abs(lenY) : 0; - } - - return { - x: midX + lenX * ratio, - y: midY + lenY * ratio - }; - }; - - svgEditor = _this; - svgCanvas = svgEditor.canvas; - getElem = svgCanvas.getElem; - $ = S.$, svgroot = S.svgroot, importLocale = S.importLocale, addElem = svgCanvas.addSVGElementFromJson, selManager = S.selectorManager, connSel = '.se_connector', elData = $.data; - _context.next = 14; - return importLocale(); - - case 14: - strings = _context.sent; - svgcontent = S.svgcontent, started = false, connections = [], selElems = []; - /** - * - * @param {Float} x - * @param {Float} y - * @param {module:utilities.BBoxObject} bb - * @param {Float} offset - * @returns {module:math.XYObject} - */ - - // Do once - (function () { - var gse = svgCanvas.groupSelectedElements; - - svgCanvas.groupSelectedElements = function () { - svgCanvas.removeFromSelection($(connSel).toArray()); - - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return gse.apply(this, args); - }; - - var mse = svgCanvas.moveSelectedElements; - - svgCanvas.moveSelectedElements = function () { - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - var cmd = mse.apply(this, args); - updateConnectors(); - return cmd; - }; - - seNs = svgCanvas.getEditorNS(); - })(); - /** - * Do on reset. - * @returns {void} - */ - - - // $(svgroot).parent().mousemove(function (e) { - // // if (started - // // || svgCanvas.getMode() !== 'connector' - // // || e.target.parentNode.parentNode !== svgcontent) return; - // - // console.log('y') - // // if (e.target.parentNode.parentNode === svgcontent) { - // // - // // } - // }); - buttons = [{ - id: 'mode_connect', - type: 'mode', - icon: svgEditor.curConfig.imgPath + 'cut.png', - includeWith: { - button: '#tool_line', - isDefault: false, - position: 1 - }, - events: { - click: function click() { - svgCanvas.setMode('connector'); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.imgPath + 'conn.svg', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - - /* async */ - addLangData: function addLangData(_ref) { - var lang = _ref.lang; - // , importLocale: importLoc - return { - data: strings.langList - }; - }, - mouseDown: function mouseDown(opts) { - var e = opts.event; - startX = opts.start_x; - startY = opts.start_y; - var mode = svgCanvas.getMode(); - var initStroke = svgEditor.curConfig.initStroke; - - if (mode === 'connector') { - if (started) { - return undefined; - } - - var mouseTarget = e.target; - var parents = $(mouseTarget).parents(); - - if ($.inArray(svgcontent, parents) !== -1) { - // Connectable element - // If child of foreignObject, use parent - var fo = $(mouseTarget).closest('foreignObject'); - startElem = fo.length ? fo[0] : mouseTarget; // Get center of source element - - var bb = svgCanvas.getStrokedBBox([startElem]); - var x = bb.x + bb.width / 2; - var y = bb.y + bb.height / 2; - started = true; - curLine = addElem({ - element: 'polyline', - attr: { - id: svgCanvas.getNextId(), - points: x + ',' + y + ' ' + x + ',' + y + ' ' + startX + ',' + startY, - stroke: '#' + initStroke.color, - 'stroke-width': !startElem.stroke_width || startElem.stroke_width === 0 ? initStroke.width : startElem.stroke_width, - fill: 'none', - opacity: initStroke.opacity, - style: 'pointer-events:none' - } - }); - elData(curLine, 'start_bb', bb); - } - - return { - started: true - }; - } - - if (mode === 'select') { - findConnectors(); - } - - return undefined; - }, - mouseMove: function mouseMove(opts) { - var zoom = svgCanvas.getZoom(); // const e = opts.event; - - var x = opts.mouse_x / zoom; - var y = opts.mouse_y / zoom; - var diffX = x - startX, - diffY = y - startY; - var mode = svgCanvas.getMode(); - - if (mode === 'connector' && started) { - // const sw = curLine.getAttribute('stroke-width') * 3; - // Set start point (adjusts based on bb) - var pt = getBBintersect(x, y, elData(curLine, 'start_bb'), getOffset('start', curLine)); - startX = pt.x; - startY = pt.y; - setPoint(curLine, 0, pt.x, pt.y, true); // Set end point - - setPoint(curLine, 'end', x, y, true); - } else if (mode === 'select') { - var slen = selElems.length; - - while (slen--) { - var elem = selElems[slen]; // Look for selected connector elements - - if (elem && elData(elem, 'c_start')) { - // Remove the "translate" transform given to move - svgCanvas.removeFromSelection([elem]); - svgCanvas.getTransformList(elem).clear(); - } - } - - if (connections.length) { - updateLine(diffX, diffY); - } - } - }, - mouseUp: function mouseUp(opts) { - // const zoom = svgCanvas.getZoom(); - var e = opts.event; // , x = opts.mouse_x / zoom, - // , y = opts.mouse_y / zoom, - - var mouseTarget = e.target; - - if (svgCanvas.getMode() !== 'connector') { - return undefined; - } - - var fo = $(mouseTarget).closest('foreignObject'); - - if (fo.length) { - mouseTarget = fo[0]; - } - - var parents = $(mouseTarget).parents(); - - if (mouseTarget === startElem) { - // Start line through click - started = true; - return { - keep: true, - element: null, - started: started - }; - } - - if ($.inArray(svgcontent, parents) === -1) { - // Not a valid target element, so remove line - $(curLine).remove(); - started = false; - return { - keep: false, - element: null, - started: started - }; - } // Valid end element - - - endElem = mouseTarget; - var startId = startElem.id, - endId = endElem.id; - var connStr = startId + ' ' + endId; - var altStr = endId + ' ' + startId; // Don't create connector if one already exists - - var dupe = $(svgcontent).find(connSel).filter(function () { - var conn = this.getAttributeNS(seNs, 'connector'); - - if (conn === connStr || conn === altStr) { - return true; - } - - return false; - }); - - if (dupe.length) { - $(curLine).remove(); - return { - keep: false, - element: null, - started: false - }; - } - - var bb = svgCanvas.getStrokedBBox([endElem]); - var pt = getBBintersect(startX, startY, bb, getOffset('start', curLine)); - setPoint(curLine, 'end', pt.x, pt.y, true); - $(curLine).data('c_start', startId).data('c_end', endId).data('end_bb', bb); - seNs = svgCanvas.getEditorNS(true); - curLine.setAttributeNS(seNs, 'se:connector', connStr); - curLine.setAttribute('class', connSel.substr(1)); - curLine.setAttribute('opacity', 1); - svgCanvas.addToSelection([curLine]); - svgCanvas.moveToBottomSelectedElement(); - selManager.requestSelector(curLine).showGrips(false); - started = false; - return { - keep: true, - element: curLine, - started: started - }; - }, - selectedChanged: function selectedChanged(opts) { - // TODO: Find better way to skip operations if no connectors are in use - if (!$(svgcontent).find(connSel).length) { - return; - } - - if (svgCanvas.getMode() === 'connector') { - svgCanvas.setMode('select'); - } // Use this to update the current selected elements - - - selElems = opts.elems; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && elData(elem, 'c_start')) { - selManager.requestSelector(elem).showGrips(false); - - if (opts.selectedElement && !opts.multiselected) { - // TODO: Set up context tools and hide most regular line tools - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - - updateConnectors(); - }, - elementChanged: function elementChanged(opts) { - var elem = opts.elems[0]; - if (!elem) return; - - if (elem.tagName === 'svg' && elem.id === 'svgcontent') { - // Update svgcontent (can change on import) - svgcontent = elem; - init(); - } // Has marker, so change offset - - - if (elem.getAttribute('marker-start') || elem.getAttribute('marker-mid') || elem.getAttribute('marker-end')) { - var start = elem.getAttribute('marker-start'); - var mid = elem.getAttribute('marker-mid'); - var end = elem.getAttribute('marker-end'); - curLine = elem; - $(elem).data('start_off', Boolean(start)).data('end_off', Boolean(end)); - - if (elem.tagName === 'line' && mid) { - // Convert to polyline to accept mid-arrow - var x1 = Number(elem.getAttribute('x1')); - var x2 = Number(elem.getAttribute('x2')); - var y1 = Number(elem.getAttribute('y1')); - var y2 = Number(elem.getAttribute('y2')); - var _elem = elem, - id = _elem.id; - var midPt = ' ' + (x1 + x2) / 2 + ',' + (y1 + y2) / 2 + ' '; - var pline = addElem({ - element: 'polyline', - attr: { - points: x1 + ',' + y1 + midPt + x2 + ',' + y2, - stroke: elem.getAttribute('stroke'), - 'stroke-width': elem.getAttribute('stroke-width'), - 'marker-mid': mid, - fill: 'none', - opacity: elem.getAttribute('opacity') || 1 - } - }); - $(elem).after(pline).remove(); - svgCanvas.clearSelection(); - pline.id = id; - svgCanvas.addToSelection([pline]); - elem = pline; - } - } // Update line if it's a connector - - - if (elem.getAttribute('class') === connSel.substr(1)) { - var _start = getElem(elData(elem, 'c_start')); - - updateConnectors([_start]); - } else { - updateConnectors(); - } - }, - IDsUpdated: function IDsUpdated(input) { - var remove = []; - input.elems.forEach(function (elem) { - if ('se:connector' in elem.attr) { - elem.attr['se:connector'] = elem.attr['se:connector'].split(' ').map(function (oldID) { - return input.changes[oldID]; - }).join(' '); // Check validity - the field would be something like 'svg_21 svg_22', but - // if one end is missing, it would be 'svg_21' and therefore fail this test - - if (!/. ./.test(elem.attr['se:connector'])) { - remove.push(elem.attr.id); - } - } - }); - return { - remove: remove - }; - }, - toolButtonStateUpdate: function toolButtonStateUpdate(opts) { - if (opts.nostroke) { - if ($('#mode_connect').hasClass('tool_button_current')) { - svgEditor.clickSelect(); - } - } - - $('#mode_connect').toggleClass('disabled', opts.nostroke); - } - }); - - case 19: - case "end": - return _context.stop(); + } + + /** + * @param {Element[]} [elems=selElems] + * @returns {void} + */ + function updateConnectors (elems) { + // Updates connector lines based on selected elements + // Is not used on mousemove, as it runs getStrokedBBox every time, + // which isn't necessary there. + findConnectors(elems); + if (connections.length) { + // Update line with element + let i = connections.length; + while (i--) { + const conn = connections[i]; + const line = conn.connector; + const {elem} = conn; + + // const sw = line.getAttribute('stroke-width') * 5; + const pre = conn.is_start ? 'start' : 'end'; + + // Update bbox for this element + const bb = svgCanvas.getStrokedBBox([elem]); + bb.x = conn.start_x; + bb.y = conn.start_y; + elData(line, pre + '_bb', bb); + /* const addOffset = */ elData(line, pre + '_off'); + + const altPre = conn.is_start ? 'end' : 'start'; + + // Get center pt of connected element + const bb2 = elData(line, altPre + '_bb'); + const srcX = bb2.x + bb2.width / 2; + const srcY = bb2.y + bb2.height / 2; + + // Set point of element being moved + let pt = getBBintersect(srcX, srcY, bb, getOffset(pre, line)); + setPoint(line, conn.is_start ? 0 : 'end', pt.x, pt.y, true); + + // Set point of connected element + const pt2 = getBBintersect(pt.x, pt.y, elData(line, altPre + '_bb'), getOffset(altPre, line)); + setPoint(line, conn.is_start ? 'end' : 0, pt2.x, pt2.y, true); + + // Update points attribute manually for webkit + if (navigator.userAgent.includes('AppleWebKit')) { + const pts = line.points; + const len = pts.numberOfItems; + const ptArr = []; + for (let j = 0; j < len; j++) { + pt = pts.getItem(j); + ptArr[j] = pt.x + ',' + pt.y; + } + line.setAttribute('points', ptArr.join(' ')); + } + } + } + } + + // Do once + (function () { + const gse = svgCanvas.groupSelectedElements; + + svgCanvas.groupSelectedElements = function (...args) { + svgCanvas.removeFromSelection($(connSel).toArray()); + return gse.apply(this, args); + }; + + const mse = svgCanvas.moveSelectedElements; + + svgCanvas.moveSelectedElements = function (...args) { + const cmd = mse.apply(this, args); + updateConnectors(); + return cmd; + }; + + seNs = svgCanvas.getEditorNS(); + }()); + + /** + * Do on reset. + * @returns {void} + */ + function init () { + // Make sure all connectors have data set + $(svgcontent).find('*').each(function () { + const conn = this.getAttributeNS(seNs, 'connector'); + if (conn) { + this.setAttribute('class', connSel.substr(1)); + const connData = conn.split(' '); + const sbb = svgCanvas.getStrokedBBox([getElem(connData[0])]); + const ebb = svgCanvas.getStrokedBBox([getElem(connData[1])]); + $(this).data('c_start', connData[0]) + .data('c_end', connData[1]) + .data('start_bb', sbb) + .data('end_bb', ebb); + svgCanvas.getEditorNS(true); + } + }); + // updateConnectors(); + } + + // $(svgroot).parent().mousemove(function (e) { + // // if (started + // // || svgCanvas.getMode() !== 'connector' + // // || e.target.parentNode.parentNode !== svgcontent) return; + // + // console.log('y') + // // if (e.target.parentNode.parentNode === svgcontent) { + // // + // // } + // }); + + const buttons = [{ + id: 'mode_connect', + type: 'mode', + icon: svgEditor.curConfig.imgPath + 'cut.png', + includeWith: { + button: '#tool_line', + isDefault: false, + position: 1 + }, + events: { + click () { + svgCanvas.setMode('connector'); + } + } + }]; + + return { + name: strings.name, + svgicons: svgEditor.curConfig.imgPath + 'conn.svg', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + /* async */ addLangData ({lang}) { // , importLocale: importLoc + return { + data: strings.langList + }; + }, + mouseDown (opts) { + const e = opts.event; + startX = opts.start_x; + startY = opts.start_y; + const mode = svgCanvas.getMode(); + const {curConfig: {initStroke}} = svgEditor; + + if (mode === 'connector') { + if (started) { return undefined; } + + const mouseTarget = e.target; + + const parents = $(mouseTarget).parents(); + + if ($.inArray(svgcontent, parents) !== -1) { + // Connectable element + + // If child of foreignObject, use parent + const fo = $(mouseTarget).closest('foreignObject'); + startElem = fo.length ? fo[0] : mouseTarget; + + // Get center of source element + const bb = svgCanvas.getStrokedBBox([startElem]); + const x = bb.x + bb.width / 2; + const y = bb.y + bb.height / 2; + + started = true; + curLine = addElem({ + element: 'polyline', + attr: { + id: svgCanvas.getNextId(), + points: (x + ',' + y + ' ' + x + ',' + y + ' ' + startX + ',' + startY), + stroke: '#' + initStroke.color, + 'stroke-width': (!startElem.stroke_width || startElem.stroke_width === 0) + ? initStroke.width + : startElem.stroke_width, + fill: 'none', + opacity: initStroke.opacity, + style: 'pointer-events:none' + } + }); + elData(curLine, 'start_bb', bb); + } + return { + started: true + }; + } + if (mode === 'select') { + findConnectors(); + } + return undefined; + }, + mouseMove (opts) { + const zoom = svgCanvas.getZoom(); + // const e = opts.event; + const x = opts.mouse_x / zoom; + const y = opts.mouse_y / zoom; + + const diffX = x - startX, + diffY = y - startY; + + const mode = svgCanvas.getMode(); + + if (mode === 'connector' && started) { + // const sw = curLine.getAttribute('stroke-width') * 3; + // Set start point (adjusts based on bb) + const pt = getBBintersect(x, y, elData(curLine, 'start_bb'), getOffset('start', curLine)); + startX = pt.x; + startY = pt.y; + + setPoint(curLine, 0, pt.x, pt.y, true); + + // Set end point + setPoint(curLine, 'end', x, y, true); + } else if (mode === 'select') { + let slen = selElems.length; + while (slen--) { + const elem = selElems[slen]; + // Look for selected connector elements + if (elem && elData(elem, 'c_start')) { + // Remove the "translate" transform given to move + svgCanvas.removeFromSelection([elem]); + svgCanvas.getTransformList(elem).clear(); } } - }, _callee); - }))(); - } - }; + if (connections.length) { + updateLine(diffX, diffY); + } + } + }, + mouseUp (opts) { + // const zoom = svgCanvas.getZoom(); + const e = opts.event; + // , x = opts.mouse_x / zoom, + // , y = opts.mouse_y / zoom, + let mouseTarget = e.target; - return extConnector; + if (svgCanvas.getMode() !== 'connector') { + return undefined; + } + const fo = $(mouseTarget).closest('foreignObject'); + if (fo.length) { mouseTarget = fo[0]; } -}()); + const parents = $(mouseTarget).parents(); + + if (mouseTarget === startElem) { + // Start line through click + started = true; + return { + keep: true, + element: null, + started + }; + } + if ($.inArray(svgcontent, parents) === -1) { + // Not a valid target element, so remove line + $(curLine).remove(); + started = false; + return { + keep: false, + element: null, + started + }; + } + // Valid end element + endElem = mouseTarget; + + const startId = startElem.id, endId = endElem.id; + const connStr = startId + ' ' + endId; + const altStr = endId + ' ' + startId; + // Don't create connector if one already exists + const dupe = $(svgcontent).find(connSel).filter(function () { + const conn = this.getAttributeNS(seNs, 'connector'); + if (conn === connStr || conn === altStr) { return true; } + return false; + }); + if (dupe.length) { + $(curLine).remove(); + return { + keep: false, + element: null, + started: false + }; + } + + const bb = svgCanvas.getStrokedBBox([endElem]); + + const pt = getBBintersect(startX, startY, bb, getOffset('start', curLine)); + setPoint(curLine, 'end', pt.x, pt.y, true); + $(curLine) + .data('c_start', startId) + .data('c_end', endId) + .data('end_bb', bb); + seNs = svgCanvas.getEditorNS(true); + curLine.setAttributeNS(seNs, 'se:connector', connStr); + curLine.setAttribute('class', connSel.substr(1)); + curLine.setAttribute('opacity', 1); + svgCanvas.addToSelection([curLine]); + svgCanvas.moveToBottomSelectedElement(); + selManager.requestSelector(curLine).showGrips(false); + started = false; + return { + keep: true, + element: curLine, + started + }; + }, + selectedChanged (opts) { + // TODO: Find better way to skip operations if no connectors are in use + if (!$(svgcontent).find(connSel).length) { return; } + + if (svgCanvas.getMode() === 'connector') { + svgCanvas.setMode('select'); + } + + // Use this to update the current selected elements + selElems = opts.elems; + + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && elData(elem, 'c_start')) { + selManager.requestSelector(elem).showGrips(false); + if (opts.selectedElement && !opts.multiselected) { + // TODO: Set up context tools and hide most regular line tools + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + updateConnectors(); + }, + elementChanged (opts) { + let elem = opts.elems[0]; + if (!elem) return; + if (elem.tagName === 'svg' && elem.id === 'svgcontent') { + // Update svgcontent (can change on import) + svgcontent = elem; + init(); + } + + // Has marker, so change offset + if ( + elem.getAttribute('marker-start') || + elem.getAttribute('marker-mid') || + elem.getAttribute('marker-end') + ) { + const start = elem.getAttribute('marker-start'); + const mid = elem.getAttribute('marker-mid'); + const end = elem.getAttribute('marker-end'); + curLine = elem; + $(elem) + .data('start_off', Boolean(start)) + .data('end_off', Boolean(end)); + + if (elem.tagName === 'line' && mid) { + // Convert to polyline to accept mid-arrow + + const x1 = Number(elem.getAttribute('x1')); + const x2 = Number(elem.getAttribute('x2')); + const y1 = Number(elem.getAttribute('y1')); + const y2 = Number(elem.getAttribute('y2')); + const {id} = elem; + + const midPt = (' ' + ((x1 + x2) / 2) + ',' + ((y1 + y2) / 2) + ' '); + const pline = addElem({ + element: 'polyline', + attr: { + points: (x1 + ',' + y1 + midPt + x2 + ',' + y2), + stroke: elem.getAttribute('stroke'), + 'stroke-width': elem.getAttribute('stroke-width'), + 'marker-mid': mid, + fill: 'none', + opacity: elem.getAttribute('opacity') || 1 + } + }); + $(elem).after(pline).remove(); + svgCanvas.clearSelection(); + pline.id = id; + svgCanvas.addToSelection([pline]); + elem = pline; + } + } + // Update line if it's a connector + if (elem.getAttribute('class') === connSel.substr(1)) { + const start = getElem(elData(elem, 'c_start')); + updateConnectors([start]); + } else { + updateConnectors(); + } + }, + IDsUpdated (input) { + const remove = []; + input.elems.forEach(function (elem) { + if ('se:connector' in elem.attr) { + elem.attr['se:connector'] = elem.attr['se:connector'].split(' ') + .map(function (oldID) { return input.changes[oldID]; }).join(' '); + + // Check validity - the field would be something like 'svg_21 svg_22', but + // if one end is missing, it would be 'svg_21' and therefore fail this test + if (!(/. ./).test(elem.attr['se:connector'])) { + remove.push(elem.attr.id); + } + } + }); + return {remove}; + }, + toolButtonStateUpdate (opts) { + if (opts.nostroke) { + if ($('#mode_connect').hasClass('tool_button_current')) { + svgEditor.clickSelect(); + } + } + $('#mode_connect') + .toggleClass('disabled', opts.nostroke); + } + }; + } +}; diff --git a/dist/extensions/ext-eyedropper.js b/dist/extensions/ext-eyedropper.js index ec8eb9dc..49a23e8a 100644 --- a/dist/extensions/ext-eyedropper.js +++ b/dist/extensions/ext-eyedropper.js @@ -1,202 +1,115 @@ -var svgEditorExtension_eyedropper = (function () { - 'use strict'; +/** + * @file ext-eyedropper.js + * + * @license MIT + * + * @copyright 2010 Jeff Schiller + * + */ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; +export default { + name: 'eyedropper', + async init (S) { + const strings = await S.importLocale(); + const svgEditor = this; + const {$, ChangeElementCommand} = S, // , svgcontent, + // svgdoc = S.svgroot.parentNode.ownerDocument, + svgCanvas = svgEditor.canvas, + addToHistory = function (cmd) { svgCanvas.undoMgr.addCommandToHistory(cmd); }, + currentStyle = { + fillPaint: 'red', fillOpacity: 1.0, + strokePaint: 'black', strokeOpacity: 1.0, + strokeWidth: 5, strokeDashArray: null, + opacity: 1.0, + strokeLinecap: 'butt', + strokeLinejoin: 'miter' + }; + + /** + * + * @param {module:svgcanvas.SvgCanvas#event:ext_selectedChanged|module:svgcanvas.SvgCanvas#event:ext_elementChanged} opts + * @returns {void} + */ + function getStyle (opts) { + // if we are in eyedropper mode, we don't want to disable the eye-dropper tool + const mode = svgCanvas.getMode(); + if (mode === 'eyedropper') { return; } + + const tool = $('#tool_eyedropper'); + // enable-eye-dropper if one element is selected + let elem = null; + if (!opts.multiselected && opts.elems[0] && + !['svg', 'g', 'use'].includes(opts.elems[0].nodeName) + ) { + elem = opts.elems[0]; + tool.removeClass('disabled'); + // grab the current style + currentStyle.fillPaint = elem.getAttribute('fill') || 'black'; + currentStyle.fillOpacity = elem.getAttribute('fill-opacity') || 1.0; + currentStyle.strokePaint = elem.getAttribute('stroke'); + currentStyle.strokeOpacity = elem.getAttribute('stroke-opacity') || 1.0; + currentStyle.strokeWidth = elem.getAttribute('stroke-width'); + currentStyle.strokeDashArray = elem.getAttribute('stroke-dasharray'); + currentStyle.strokeLinecap = elem.getAttribute('stroke-linecap'); + currentStyle.strokeLinejoin = elem.getAttribute('stroke-linejoin'); + currentStyle.opacity = elem.getAttribute('opacity') || 1.0; + // disable eye-dropper tool + } else { + tool.addClass('disabled'); + } } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + const buttons = [ + { + id: 'tool_eyedropper', + icon: svgEditor.curConfig.extIconsPath + 'eyedropper.png', + type: 'mode', + events: { + click () { + svgCanvas.setMode('eyedropper'); + } } + } + ]; - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'eyedropper-icon.xml', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + + // if we have selected an element, grab its paint and enable the eye dropper button + selectedChanged: getStyle, + elementChanged: getStyle, + + mouseDown (opts) { + const mode = svgCanvas.getMode(); + if (mode === 'eyedropper') { + const e = opts.event; + const {target} = e; + if (!['svg', 'g', 'use'].includes(target.nodeName)) { + const changes = {}; + + const change = function (elem, attrname, newvalue) { + changes[attrname] = elem.getAttribute(attrname); + elem.setAttribute(attrname, newvalue); + }; + + if (currentStyle.fillPaint) { change(target, 'fill', currentStyle.fillPaint); } + if (currentStyle.fillOpacity) { change(target, 'fill-opacity', currentStyle.fillOpacity); } + if (currentStyle.strokePaint) { change(target, 'stroke', currentStyle.strokePaint); } + if (currentStyle.strokeOpacity) { change(target, 'stroke-opacity', currentStyle.strokeOpacity); } + if (currentStyle.strokeWidth) { change(target, 'stroke-width', currentStyle.strokeWidth); } + if (currentStyle.strokeDashArray) { change(target, 'stroke-dasharray', currentStyle.strokeDashArray); } + if (currentStyle.opacity) { change(target, 'opacity', currentStyle.opacity); } + if (currentStyle.strokeLinecap) { change(target, 'stroke-linecap', currentStyle.strokeLinecap); } + if (currentStyle.strokeLinejoin) { change(target, 'stroke-linejoin', currentStyle.strokeLinejoin); } + + addToHistory(new ChangeElementCommand(target, changes)); + } } - - _next(undefined); - }); + } }; } - - /** - * @file ext-eyedropper.js - * - * @license MIT - * - * @copyright 2010 Jeff Schiller - * - */ - var extEyedropper = { - name: 'eyedropper', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var strings, svgEditor, $, ChangeElementCommand, svgCanvas, addToHistory, currentStyle, getStyle, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - getStyle = function _getStyle(opts) { - // if we are in eyedropper mode, we don't want to disable the eye-dropper tool - var mode = svgCanvas.getMode(); - - if (mode === 'eyedropper') { - return; - } - - var tool = $('#tool_eyedropper'); // enable-eye-dropper if one element is selected - - var elem = null; - - if (!opts.multiselected && opts.elems[0] && !['svg', 'g', 'use'].includes(opts.elems[0].nodeName)) { - elem = opts.elems[0]; - tool.removeClass('disabled'); // grab the current style - - currentStyle.fillPaint = elem.getAttribute('fill') || 'black'; - currentStyle.fillOpacity = elem.getAttribute('fill-opacity') || 1.0; - currentStyle.strokePaint = elem.getAttribute('stroke'); - currentStyle.strokeOpacity = elem.getAttribute('stroke-opacity') || 1.0; - currentStyle.strokeWidth = elem.getAttribute('stroke-width'); - currentStyle.strokeDashArray = elem.getAttribute('stroke-dasharray'); - currentStyle.strokeLinecap = elem.getAttribute('stroke-linecap'); - currentStyle.strokeLinejoin = elem.getAttribute('stroke-linejoin'); - currentStyle.opacity = elem.getAttribute('opacity') || 1.0; // disable eye-dropper tool - } else { - tool.addClass('disabled'); - } - }; - - _context.next = 3; - return S.importLocale(); - - case 3: - strings = _context.sent; - svgEditor = _this; - $ = S.$, ChangeElementCommand = S.ChangeElementCommand, svgCanvas = svgEditor.canvas, addToHistory = function addToHistory(cmd) { - svgCanvas.undoMgr.addCommandToHistory(cmd); - }, currentStyle = { - fillPaint: 'red', - fillOpacity: 1.0, - strokePaint: 'black', - strokeOpacity: 1.0, - strokeWidth: 5, - strokeDashArray: null, - opacity: 1.0, - strokeLinecap: 'butt', - strokeLinejoin: 'miter' - }; - /** - * - * @param {module:svgcanvas.SvgCanvas#event:ext_selectedChanged|module:svgcanvas.SvgCanvas#event:ext_elementChanged} opts - * @returns {void} - */ - - buttons = [{ - id: 'tool_eyedropper', - icon: svgEditor.curConfig.extIconsPath + 'eyedropper.png', - type: 'mode', - events: { - click: function click() { - svgCanvas.setMode('eyedropper'); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'eyedropper-icon.xml', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - // if we have selected an element, grab its paint and enable the eye dropper button - selectedChanged: getStyle, - elementChanged: getStyle, - mouseDown: function mouseDown(opts) { - var mode = svgCanvas.getMode(); - - if (mode === 'eyedropper') { - var e = opts.event; - var target = e.target; - - if (!['svg', 'g', 'use'].includes(target.nodeName)) { - var changes = {}; - - var change = function change(elem, attrname, newvalue) { - changes[attrname] = elem.getAttribute(attrname); - elem.setAttribute(attrname, newvalue); - }; - - if (currentStyle.fillPaint) { - change(target, 'fill', currentStyle.fillPaint); - } - - if (currentStyle.fillOpacity) { - change(target, 'fill-opacity', currentStyle.fillOpacity); - } - - if (currentStyle.strokePaint) { - change(target, 'stroke', currentStyle.strokePaint); - } - - if (currentStyle.strokeOpacity) { - change(target, 'stroke-opacity', currentStyle.strokeOpacity); - } - - if (currentStyle.strokeWidth) { - change(target, 'stroke-width', currentStyle.strokeWidth); - } - - if (currentStyle.strokeDashArray) { - change(target, 'stroke-dasharray', currentStyle.strokeDashArray); - } - - if (currentStyle.opacity) { - change(target, 'opacity', currentStyle.opacity); - } - - if (currentStyle.strokeLinecap) { - change(target, 'stroke-linecap', currentStyle.strokeLinecap); - } - - if (currentStyle.strokeLinejoin) { - change(target, 'stroke-linejoin', currentStyle.strokeLinejoin); - } - - addToHistory(new ChangeElementCommand(target, changes)); - } - } - } - }); - - case 8: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extEyedropper; - -}()); +}; diff --git a/dist/extensions/ext-foreignobject.js b/dist/extensions/ext-foreignobject.js index e98d6a4c..31a83693 100644 --- a/dist/extensions/ext-foreignobject.js +++ b/dist/extensions/ext-foreignobject.js @@ -1,363 +1,280 @@ -var svgEditorExtension_foreignobject = (function () { - 'use strict'; +/** + * @file ext-foreignobject.js + * + * @license Apache-2.0 + * + * @copyright 2010 Jacques Distler, 2010 Alexis Deveria + * + */ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; +export default { + name: 'foreignobject', + async init (S) { + const svgEditor = this; + const {$, text2xml, NS, importLocale} = S; + const svgCanvas = svgEditor.canvas; + const + // {svgcontent} = S, + // addElem = svgCanvas.addSVGElementFromJson, + svgdoc = S.svgroot.parentNode.ownerDocument; + const strings = await importLocale(); + + const properlySourceSizeTextArea = function () { + // TODO: remove magic numbers here and get values from CSS + const height = $('#svg_source_container').height() - 80; + $('#svg_source_textarea').css('height', height); + }; + + /** + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + let fcRules = $('#fc_rules'); + if (!fcRules.length) { + fcRules = $('').appendTo('head'); + } + fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); + $('#foreignObject_panel').toggle(on); } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); + /** + * @param {boolean} on + * @returns {void} + */ + function toggleSourceButtons (on) { + $('#tool_source_save, #tool_source_cancel').toggle(!on); + $('#foreign_save, #foreign_cancel').toggle(on); } - } - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + let selElems, + started, + newFO, + editingforeign = false; - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /** + * This function sets the content of element elt to the input XML. + * @param {string} xmlString - The XML text + * @returns {boolean} This function returns false if the set was unsuccessful, true otherwise. + */ + function setForeignString (xmlString) { + const elt = selElems[0]; // The parent `Element` to append to + try { + // convert string into XML document + const newDoc = text2xml('' + xmlString + ''); + // run it through our sanitizer to remove anything we do not support + svgCanvas.sanitizeSvg(newDoc.documentElement); + elt.replaceWith(svgdoc.importNode(newDoc.documentElement.firstChild, true)); + svgCanvas.call('changed', [elt]); + svgCanvas.clearSelection(); + } catch (e) { + // Todo: Surface error to user + console.log(e); // eslint-disable-line no-console + return false; + } + + return true; + } + + /** + * + * @returns {void} + */ + function showForeignEditor () { + const elt = selElems[0]; + if (!elt || editingforeign) { return; } + editingforeign = true; + toggleSourceButtons(true); + elt.removeAttribute('fill'); + + const str = svgCanvas.svgToString(elt, 0); + $('#svg_source_textarea').val(str); + $('#svg_source_editor').fadeIn(); + properlySourceSizeTextArea(); + $('#svg_source_textarea').focus(); + } + + /** + * @param {string} attr + * @param {string|Float} val + * @returns {void} + */ + function setAttr (attr, val) { + svgCanvas.changeSelectedAttribute(attr, val); + svgCanvas.call('changed', selElems); + } + + const buttons = [{ + id: 'tool_foreign', + icon: svgEditor.curConfig.extIconsPath + 'foreignobject-tool.png', + type: 'mode', + events: { + click () { + svgCanvas.setMode('foreign'); } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + }, { + id: 'edit_foreign', + icon: svgEditor.curConfig.extIconsPath + 'foreignobject-edit.png', + type: 'context', + panel: 'foreignObject_panel', + events: { + click () { + showForeignEditor(); } + } + }]; - _next(undefined); - }); + const contextTools = [ + { + type: 'input', + panel: 'foreignObject_panel', + id: 'foreign_width', + size: 3, + events: { + change () { + setAttr('width', this.value); + } + } + }, { + type: 'input', + panel: 'foreignObject_panel', + id: 'foreign_height', + events: { + change () { + setAttr('height', this.value); + } + } + }, { + type: 'input', + panel: 'foreignObject_panel', + id: 'foreign_font_size', + size: 2, + defval: 16, + events: { + change () { + setAttr('font-size', this.value); + } + } + } + ]; + + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'foreignobject-icons.xml', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + context_tools: strings.contextTools.map((contextTool, i) => { + return Object.assign(contextTools[i], contextTool); + }), + callback () { + $('#foreignObject_panel').hide(); + + const endChanges = function () { + $('#svg_source_editor').hide(); + editingforeign = false; + $('#svg_source_textarea').blur(); + toggleSourceButtons(false); + }; + + // TODO: Needs to be done after orig icon loads + setTimeout(function () { + // Create source save/cancel buttons + /* const save = */ $('#tool_source_save').clone() + .hide().attr('id', 'foreign_save').unbind() + .appendTo('#tool_source_back').click(async function () { + if (!editingforeign) { return; } + + if (!setForeignString($('#svg_source_textarea').val())) { + const ok = await $.confirm('Errors found. Revert to original?'); + if (!ok) { return; } + endChanges(); + } else { + endChanges(); + } + // setSelectMode(); + }); + + /* const cancel = */ $('#tool_source_cancel').clone() + .hide().attr('id', 'foreign_cancel').unbind() + .appendTo('#tool_source_back').click(function () { + endChanges(); + }); + }, 3000); + }, + mouseDown (opts) { + // const e = opts.event; + if (svgCanvas.getMode() !== 'foreign') { + return undefined; + } + started = true; + newFO = svgCanvas.addSVGElementFromJson({ + element: 'foreignObject', + attr: { + x: opts.start_x, + y: opts.start_y, + id: svgCanvas.getNextId(), + 'font-size': 16, // cur_text.font_size, + width: '48', + height: '20', + style: 'pointer-events:inherit' + } + }); + const m = svgdoc.createElementNS(NS.MATH, 'math'); + m.setAttributeNS(NS.XMLNS, 'xmlns', NS.MATH); + m.setAttribute('display', 'inline'); + const mi = svgdoc.createElementNS(NS.MATH, 'mi'); + mi.setAttribute('mathvariant', 'normal'); + mi.textContent = '\u03A6'; + const mo = svgdoc.createElementNS(NS.MATH, 'mo'); + mo.textContent = '\u222A'; + const mi2 = svgdoc.createElementNS(NS.MATH, 'mi'); + mi2.textContent = '\u2133'; + m.append(mi, mo, mi2); + newFO.append(m); + return { + started: true + }; + }, + mouseUp (opts) { + // const e = opts.event; + if (svgCanvas.getMode() !== 'foreign' || !started) { + return undefined; + } + const attrs = $(newFO).attr(['width', 'height']); + const keep = (attrs.width !== '0' || attrs.height !== '0'); + svgCanvas.addToSelection([newFO], true); + + return { + keep, + element: newFO + }; + }, + selectedChanged (opts) { + // Use this to update the current selected elements + selElems = opts.elems; + + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && elem.tagName === 'foreignObject') { + if (opts.selectedElement && !opts.multiselected) { + $('#foreign_font_size').val(elem.getAttribute('font-size')); + $('#foreign_width').val(elem.getAttribute('width')); + $('#foreign_height').val(elem.getAttribute('height')); + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + }, + elementChanged (opts) { + // const elem = opts.elems[0]; + } }; } - - /** - * @file ext-foreignobject.js - * - * @license Apache-2.0 - * - * @copyright 2010 Jacques Distler, 2010 Alexis Deveria - * - */ - var extForeignobject = { - name: 'foreignobject', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var svgEditor, $, text2xml, NS, importLocale, svgCanvas, svgdoc, strings, properlySourceSizeTextArea, showPanel, toggleSourceButtons, selElems, started, newFO, editingforeign, setForeignString, showForeignEditor, setAttr, buttons, contextTools; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - setAttr = function _setAttr(attr, val) { - svgCanvas.changeSelectedAttribute(attr, val); - svgCanvas.call('changed', selElems); - }; - - showForeignEditor = function _showForeignEditor() { - var elt = selElems[0]; - - if (!elt || editingforeign) { - return; - } - - editingforeign = true; - toggleSourceButtons(true); - elt.removeAttribute('fill'); - var str = svgCanvas.svgToString(elt, 0); - $('#svg_source_textarea').val(str); - $('#svg_source_editor').fadeIn(); - properlySourceSizeTextArea(); - $('#svg_source_textarea').focus(); - }; - - setForeignString = function _setForeignString(xmlString) { - var elt = selElems[0]; // The parent `Element` to append to - - try { - // convert string into XML document - var newDoc = text2xml('' + xmlString + ''); // run it through our sanitizer to remove anything we do not support - - svgCanvas.sanitizeSvg(newDoc.documentElement); - elt.replaceWith(svgdoc.importNode(newDoc.documentElement.firstChild, true)); - svgCanvas.call('changed', [elt]); - svgCanvas.clearSelection(); - } catch (e) { - // Todo: Surface error to user - console.log(e); // eslint-disable-line no-console - - return false; - } - - return true; - }; - - toggleSourceButtons = function _toggleSourceButtons(on) { - $('#tool_source_save, #tool_source_cancel').toggle(!on); - $('#foreign_save, #foreign_cancel').toggle(on); - }; - - showPanel = function _showPanel(on) { - var fcRules = $('#fc_rules'); - - if (!fcRules.length) { - fcRules = $('').appendTo('head'); - } - - fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); - $('#foreignObject_panel').toggle(on); - }; - - svgEditor = _this; - $ = S.$, text2xml = S.text2xml, NS = S.NS, importLocale = S.importLocale; - svgCanvas = svgEditor.canvas; - svgdoc = S.svgroot.parentNode.ownerDocument; - _context2.next = 11; - return importLocale(); - - case 11: - strings = _context2.sent; - - properlySourceSizeTextArea = function properlySourceSizeTextArea() { - // TODO: remove magic numbers here and get values from CSS - var height = $('#svg_source_container').height() - 80; - $('#svg_source_textarea').css('height', height); - }; - /** - * @param {boolean} on - * @returns {void} - */ - - - editingforeign = false; - /** - * This function sets the content of element elt to the input XML. - * @param {string} xmlString - The XML text - * @returns {boolean} This function returns false if the set was unsuccessful, true otherwise. - */ - - buttons = [{ - id: 'tool_foreign', - icon: svgEditor.curConfig.extIconsPath + 'foreignobject-tool.png', - type: 'mode', - events: { - click: function click() { - svgCanvas.setMode('foreign'); - } - } - }, { - id: 'edit_foreign', - icon: svgEditor.curConfig.extIconsPath + 'foreignobject-edit.png', - type: 'context', - panel: 'foreignObject_panel', - events: { - click: function click() { - showForeignEditor(); - } - } - }]; - contextTools = [{ - type: 'input', - panel: 'foreignObject_panel', - id: 'foreign_width', - size: 3, - events: { - change: function change() { - setAttr('width', this.value); - } - } - }, { - type: 'input', - panel: 'foreignObject_panel', - id: 'foreign_height', - events: { - change: function change() { - setAttr('height', this.value); - } - } - }, { - type: 'input', - panel: 'foreignObject_panel', - id: 'foreign_font_size', - size: 2, - defval: 16, - events: { - change: function change() { - setAttr('font-size', this.value); - } - } - }]; - return _context2.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'foreignobject-icons.xml', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - context_tools: strings.contextTools.map(function (contextTool, i) { - return Object.assign(contextTools[i], contextTool); - }), - callback: function callback() { - $('#foreignObject_panel').hide(); - - var endChanges = function endChanges() { - $('#svg_source_editor').hide(); - editingforeign = false; - $('#svg_source_textarea').blur(); - toggleSourceButtons(false); - }; // TODO: Needs to be done after orig icon loads - - - setTimeout(function () { - // Create source save/cancel buttons - - /* const save = */ - $('#tool_source_save').clone().hide().attr('id', 'foreign_save').unbind().appendTo('#tool_source_back').click( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var ok; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - if (editingforeign) { - _context.next = 2; - break; - } - - return _context.abrupt("return"); - - case 2: - if (setForeignString($('#svg_source_textarea').val())) { - _context.next = 11; - break; - } - - _context.next = 5; - return $.confirm('Errors found. Revert to original?'); - - case 5: - ok = _context.sent; - - if (ok) { - _context.next = 8; - break; - } - - return _context.abrupt("return"); - - case 8: - endChanges(); - _context.next = 12; - break; - - case 11: - endChanges(); - - case 12: - case "end": - return _context.stop(); - } - } - }, _callee); - }))); - /* const cancel = */ - - $('#tool_source_cancel').clone().hide().attr('id', 'foreign_cancel').unbind().appendTo('#tool_source_back').click(function () { - endChanges(); - }); - }, 3000); - }, - mouseDown: function mouseDown(opts) { - // const e = opts.event; - if (svgCanvas.getMode() !== 'foreign') { - return undefined; - } - - started = true; - newFO = svgCanvas.addSVGElementFromJson({ - element: 'foreignObject', - attr: { - x: opts.start_x, - y: opts.start_y, - id: svgCanvas.getNextId(), - 'font-size': 16, - // cur_text.font_size, - width: '48', - height: '20', - style: 'pointer-events:inherit' - } - }); - var m = svgdoc.createElementNS(NS.MATH, 'math'); - m.setAttributeNS(NS.XMLNS, 'xmlns', NS.MATH); - m.setAttribute('display', 'inline'); - var mi = svgdoc.createElementNS(NS.MATH, 'mi'); - mi.setAttribute('mathvariant', 'normal'); - mi.textContent = "\u03A6"; - var mo = svgdoc.createElementNS(NS.MATH, 'mo'); - mo.textContent = "\u222A"; - var mi2 = svgdoc.createElementNS(NS.MATH, 'mi'); - mi2.textContent = "\u2133"; - m.append(mi, mo, mi2); - newFO.append(m); - return { - started: true - }; - }, - mouseUp: function mouseUp(opts) { - // const e = opts.event; - if (svgCanvas.getMode() !== 'foreign' || !started) { - return undefined; - } - - var attrs = $(newFO).attr(['width', 'height']); - var keep = attrs.width !== '0' || attrs.height !== '0'; - svgCanvas.addToSelection([newFO], true); - return { - keep: keep, - element: newFO - }; - }, - selectedChanged: function selectedChanged(opts) { - // Use this to update the current selected elements - selElems = opts.elems; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && elem.tagName === 'foreignObject') { - if (opts.selectedElement && !opts.multiselected) { - $('#foreign_font_size').val(elem.getAttribute('font-size')); - $('#foreign_width').val(elem.getAttribute('width')); - $('#foreign_height').val(elem.getAttribute('height')); - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - }, - elementChanged: function elementChanged(opts) {// const elem = opts.elems[0]; - } - }); - - case 17: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))(); - } - }; - - return extForeignobject; - -}()); +}; diff --git a/dist/extensions/ext-grid.js b/dist/extensions/ext-grid.js index 420ddccb..cba3eb91 100644 --- a/dist/extensions/ext-grid.js +++ b/dist/extensions/ext-grid.js @@ -1,222 +1,168 @@ -var svgEditorExtension_grid = (function () { - 'use strict'; +/** + * @file ext-grid.js + * + * @license Apache-2.0 + * + * @copyright 2010 Redou Mine, 2010 Alexis Deveria + * + */ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } +export default { + name: 'grid', + async init ({$, NS, getTypeMap, importLocale}) { + const strings = await importLocale(); + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const svgdoc = document.getElementById('svgcanvas').ownerDocument, + {assignAttributes} = svgCanvas, + hcanvas = document.createElement('canvas'), + canvBG = $('#canvasBackground'), + units = getTypeMap(), // Assumes prior `init()` call on `units.js` module + intervals = [0.01, 0.1, 1, 10, 100, 1000]; + let showGrid = svgEditor.curConfig.showGrid || false; - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } + $(hcanvas).hide().appendTo('body'); - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + const canvasGrid = svgdoc.createElementNS(NS.SVG, 'svg'); + assignAttributes(canvasGrid, { + id: 'canvasGrid', + width: '100%', + height: '100%', + x: 0, + y: 0, + overflow: 'visible', + display: 'none' + }); + canvBG.append(canvasGrid); + const gridDefs = svgdoc.createElementNS(NS.SVG, 'defs'); + // grid-pattern + const gridPattern = svgdoc.createElementNS(NS.SVG, 'pattern'); + assignAttributes(gridPattern, { + id: 'gridpattern', + patternUnits: 'userSpaceOnUse', + x: 0, // -(value.strokeWidth / 2), // position for strokewidth + y: 0, // -(value.strokeWidth / 2), // position for strokewidth + width: 100, + height: 100 + }); - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } + const gridimg = svgdoc.createElementNS(NS.SVG, 'image'); + assignAttributes(gridimg, { + x: 0, + y: 0, + width: 100, + height: 100 + }); + gridPattern.append(gridimg); + gridDefs.append(gridPattern); + $('#canvasGrid').append(gridDefs); - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } + // grid-box + const gridBox = svgdoc.createElementNS(NS.SVG, 'rect'); + assignAttributes(gridBox, { + width: '100%', + height: '100%', + x: 0, + y: 0, + 'stroke-width': 0, + stroke: 'none', + fill: 'url(#gridpattern)', + style: 'pointer-events: none; display:visible;' + }); + $('#canvasGrid').append(gridBox); - _next(undefined); + /** + * + * @param {Float} zoom + * @returns {void} + */ + function updateGrid (zoom) { + // TODO: Try this with elements, then compare performance difference + const unit = units[svgEditor.curConfig.baseUnit]; // 1 = 1px + const uMulti = unit * zoom; + // Calculate the main number interval + const rawM = 100 / uMulti; + let multi = 1; + intervals.some((num) => { + multi = num; + return rawM <= num; }); + const bigInt = multi * uMulti; + + // Set the canvas size to the width of the container + hcanvas.width = bigInt; + hcanvas.height = bigInt; + const ctx = hcanvas.getContext('2d'); + const curD = 0.5; + const part = bigInt / 10; + + ctx.globalAlpha = 0.2; + ctx.strokeStyle = svgEditor.curConfig.gridColor; + for (let i = 1; i < 10; i++) { + const subD = Math.round(part * i) + 0.5; + // const lineNum = (i % 2)?12:10; + const lineNum = 0; + ctx.moveTo(subD, bigInt); + ctx.lineTo(subD, lineNum); + ctx.moveTo(bigInt, subD); + ctx.lineTo(lineNum, subD); + } + ctx.stroke(); + ctx.beginPath(); + ctx.globalAlpha = 0.5; + ctx.moveTo(curD, bigInt); + ctx.lineTo(curD, 0); + + ctx.moveTo(bigInt, curD); + ctx.lineTo(0, curD); + ctx.stroke(); + + const datauri = hcanvas.toDataURL('image/png'); + gridimg.setAttribute('width', bigInt); + gridimg.setAttribute('height', bigInt); + gridimg.parentNode.setAttribute('width', bigInt); + gridimg.parentNode.setAttribute('height', bigInt); + svgCanvas.setHref(gridimg, datauri); + } + + /** + * + * @returns {void} + */ + function gridUpdate () { + if (showGrid) { + updateGrid(svgCanvas.getZoom()); + } + $('#canvasGrid').toggle(showGrid); + $('#view_grid').toggleClass('push_button_pressed tool_button'); + } + const buttons = [{ + id: 'view_grid', + icon: svgEditor.curConfig.extIconsPath + 'grid.png', + type: 'context', + panel: 'editor_panel', + events: { + click () { + svgEditor.curConfig.showGrid = showGrid = !showGrid; + gridUpdate(); + } + } + }]; + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'grid-icon.xml', + + zoomChanged (zoom) { + if (showGrid) { updateGrid(zoom); } + }, + callback () { + if (showGrid) { + gridUpdate(); + } + }, + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }) }; } - - /** - * @file ext-grid.js - * - * @license Apache-2.0 - * - * @copyright 2010 Redou Mine, 2010 Alexis Deveria - * - */ - var extGrid = { - name: 'grid', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var $, NS, getTypeMap, importLocale, strings, svgEditor, svgCanvas, svgdoc, assignAttributes, hcanvas, canvBG, units, intervals, showGrid, canvasGrid, gridDefs, gridPattern, gridimg, gridBox, updateGrid, gridUpdate, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - gridUpdate = function _gridUpdate() { - if (showGrid) { - updateGrid(svgCanvas.getZoom()); - } - - $('#canvasGrid').toggle(showGrid); - $('#view_grid').toggleClass('push_button_pressed tool_button'); - }; - - updateGrid = function _updateGrid(zoom) { - // TODO: Try this with elements, then compare performance difference - var unit = units[svgEditor.curConfig.baseUnit]; // 1 = 1px - - var uMulti = unit * zoom; // Calculate the main number interval - - var rawM = 100 / uMulti; - var multi = 1; - intervals.some(function (num) { - multi = num; - return rawM <= num; - }); - var bigInt = multi * uMulti; // Set the canvas size to the width of the container - - hcanvas.width = bigInt; - hcanvas.height = bigInt; - var ctx = hcanvas.getContext('2d'); - var curD = 0.5; - var part = bigInt / 10; - ctx.globalAlpha = 0.2; - ctx.strokeStyle = svgEditor.curConfig.gridColor; - - for (var i = 1; i < 10; i++) { - var subD = Math.round(part * i) + 0.5; // const lineNum = (i % 2)?12:10; - - var lineNum = 0; - ctx.moveTo(subD, bigInt); - ctx.lineTo(subD, lineNum); - ctx.moveTo(bigInt, subD); - ctx.lineTo(lineNum, subD); - } - - ctx.stroke(); - ctx.beginPath(); - ctx.globalAlpha = 0.5; - ctx.moveTo(curD, bigInt); - ctx.lineTo(curD, 0); - ctx.moveTo(bigInt, curD); - ctx.lineTo(0, curD); - ctx.stroke(); - var datauri = hcanvas.toDataURL('image/png'); - gridimg.setAttribute('width', bigInt); - gridimg.setAttribute('height', bigInt); - gridimg.parentNode.setAttribute('width', bigInt); - gridimg.parentNode.setAttribute('height', bigInt); - svgCanvas.setHref(gridimg, datauri); - }; - - $ = _ref.$, NS = _ref.NS, getTypeMap = _ref.getTypeMap, importLocale = _ref.importLocale; - _context.next = 5; - return importLocale(); - - case 5: - strings = _context.sent; - svgEditor = _this; - svgCanvas = svgEditor.canvas; - svgdoc = document.getElementById('svgcanvas').ownerDocument, assignAttributes = svgCanvas.assignAttributes, hcanvas = document.createElement('canvas'), canvBG = $('#canvasBackground'), units = getTypeMap(), intervals = [0.01, 0.1, 1, 10, 100, 1000]; - showGrid = svgEditor.curConfig.showGrid || false; - $(hcanvas).hide().appendTo('body'); - canvasGrid = svgdoc.createElementNS(NS.SVG, 'svg'); - assignAttributes(canvasGrid, { - id: 'canvasGrid', - width: '100%', - height: '100%', - x: 0, - y: 0, - overflow: 'visible', - display: 'none' - }); - canvBG.append(canvasGrid); - gridDefs = svgdoc.createElementNS(NS.SVG, 'defs'); // grid-pattern - - gridPattern = svgdoc.createElementNS(NS.SVG, 'pattern'); - assignAttributes(gridPattern, { - id: 'gridpattern', - patternUnits: 'userSpaceOnUse', - x: 0, - // -(value.strokeWidth / 2), // position for strokewidth - y: 0, - // -(value.strokeWidth / 2), // position for strokewidth - width: 100, - height: 100 - }); - gridimg = svgdoc.createElementNS(NS.SVG, 'image'); - assignAttributes(gridimg, { - x: 0, - y: 0, - width: 100, - height: 100 - }); - gridPattern.append(gridimg); - gridDefs.append(gridPattern); - $('#canvasGrid').append(gridDefs); // grid-box - - gridBox = svgdoc.createElementNS(NS.SVG, 'rect'); - assignAttributes(gridBox, { - width: '100%', - height: '100%', - x: 0, - y: 0, - 'stroke-width': 0, - stroke: 'none', - fill: 'url(#gridpattern)', - style: 'pointer-events: none; display:visible;' - }); - $('#canvasGrid').append(gridBox); - /** - * - * @param {Float} zoom - * @returns {void} - */ - - buttons = [{ - id: 'view_grid', - icon: svgEditor.curConfig.extIconsPath + 'grid.png', - type: 'context', - panel: 'editor_panel', - events: { - click: function click() { - svgEditor.curConfig.showGrid = showGrid = !showGrid; - gridUpdate(); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'grid-icon.xml', - zoomChanged: function zoomChanged(zoom) { - if (showGrid) { - updateGrid(zoom); - } - }, - callback: function callback() { - if (showGrid) { - gridUpdate(); - } - }, - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }) - }); - - case 27: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extGrid; - -}()); +}; diff --git a/dist/extensions/ext-helloworld.js b/dist/extensions/ext-helloworld.js index dffb1c3c..fbe2dfa4 100644 --- a/dist/extensions/ext-helloworld.js +++ b/dist/extensions/ext-helloworld.js @@ -1,205 +1,91 @@ -var svgEditorExtension_helloworld = (function () { - 'use strict'; +/** + * @file ext-helloworld.js + * + * @license MIT + * + * @copyright 2010 Alexis Deveria + * + */ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } +/** +* This is a very basic SVG-Edit extension. It adds a "Hello World" button in +* the left ("mode") panel. Clicking on the button, and then the canvas +* will show the user the point on the canvas that was clicked on. +*/ +export default { + name: 'helloworld', + async init ({$, importLocale}) { + // See `/editor/extensions/ext-locale/helloworld/` + const strings = await importLocale(); + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + return { + name: strings.name, + // For more notes on how to make an icon file, see the source of + // the helloworld-icon.xml + svgicons: svgEditor.curConfig.extIconsPath + 'helloworld-icon.xml', - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } + // Multiple buttons can be added in this array + buttons: [{ + // Must match the icon ID in helloworld-icon.xml + id: 'hello_world', - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + // Fallback, e.g., for `file:///` access + icon: svgEditor.curConfig.extIconsPath + 'helloworld.png', - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + // This indicates that the button will be added to the "mode" + // button panel on the left side + type: 'mode', + + // Tooltip text + title: strings.buttons[0].title, + + // Events + events: { + click () { + // The action taken when the button is clicked on. + // For "mode" buttons, any other button will + // automatically be de-pressed. + svgCanvas.setMode('hello_world'); + } } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + }], + // This is triggered when the main mouse button is pressed down + // on the editor canvas (not the tool panels) + mouseDown () { + // Check the mode on mousedown + if (svgCanvas.getMode() === 'hello_world') { + // The returned object must include "started" with + // a value of true in order for mouseUp to be triggered + return {started: true}; } + return undefined; + }, - _next(undefined); - }); + // This is triggered from anywhere, but "started" must have been set + // to true (see above). Note that "opts" is an object with event info + mouseUp (opts) { + // Check the mode on mouseup + if (svgCanvas.getMode() === 'hello_world') { + const zoom = svgCanvas.getZoom(); + + // Get the actual coordinate by dividing by the zoom value + const x = opts.mouse_x / zoom; + const y = opts.mouse_y / zoom; + + // We do our own formatting + let {text} = strings; + [ + ['x', x], + ['y', y] + ].forEach(([prop, val]) => { + text = text.replace('{' + prop + '}', val); + }); + + // Show the text using the custom alert function + $.alert(text); + } + } }; } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * @file ext-helloworld.js - * - * @license MIT - * - * @copyright 2010 Alexis Deveria - * - */ - - /** - * This is a very basic SVG-Edit extension. It adds a "Hello World" button in - * the left ("mode") panel. Clicking on the button, and then the canvas - * will show the user the point on the canvas that was clicked on. - */ - var extHelloworld = { - name: 'helloworld', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var $, importLocale, strings, svgEditor, svgCanvas; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - $ = _ref.$, importLocale = _ref.importLocale; - _context.next = 3; - return importLocale(); - - case 3: - strings = _context.sent; - svgEditor = _this; - svgCanvas = svgEditor.canvas; - return _context.abrupt("return", { - name: strings.name, - // For more notes on how to make an icon file, see the source of - // the helloworld-icon.xml - svgicons: svgEditor.curConfig.extIconsPath + 'helloworld-icon.xml', - // Multiple buttons can be added in this array - buttons: [{ - // Must match the icon ID in helloworld-icon.xml - id: 'hello_world', - // Fallback, e.g., for `file:///` access - icon: svgEditor.curConfig.extIconsPath + 'helloworld.png', - // This indicates that the button will be added to the "mode" - // button panel on the left side - type: 'mode', - // Tooltip text - title: strings.buttons[0].title, - // Events - events: { - click: function click() { - // The action taken when the button is clicked on. - // For "mode" buttons, any other button will - // automatically be de-pressed. - svgCanvas.setMode('hello_world'); - } - } - }], - // This is triggered when the main mouse button is pressed down - // on the editor canvas (not the tool panels) - mouseDown: function mouseDown() { - // Check the mode on mousedown - if (svgCanvas.getMode() === 'hello_world') { - // The returned object must include "started" with - // a value of true in order for mouseUp to be triggered - return { - started: true - }; - } - - return undefined; - }, - // This is triggered from anywhere, but "started" must have been set - // to true (see above). Note that "opts" is an object with event info - mouseUp: function mouseUp(opts) { - // Check the mode on mouseup - if (svgCanvas.getMode() === 'hello_world') { - var zoom = svgCanvas.getZoom(); // Get the actual coordinate by dividing by the zoom value - - var x = opts.mouse_x / zoom; - var y = opts.mouse_y / zoom; // We do our own formatting - - var text = strings.text; - [['x', x], ['y', y]].forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - prop = _ref3[0], - val = _ref3[1]; - - text = text.replace('{' + prop + '}', val); - }); // Show the text using the custom alert function - - $.alert(text); - } - } - }); - - case 7: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extHelloworld; - -}()); +}; diff --git a/dist/extensions/ext-imagelib.js b/dist/extensions/ext-imagelib.js index 43bd2513..6ee0c2a7 100644 --- a/dist/extensions/ext-imagelib.js +++ b/dist/extensions/ext-imagelib.js @@ -1,584 +1,557 @@ -var svgEditorExtension_imagelib = (function () { - 'use strict'; +/** + * @file ext-imagelib.js + * + * @license MIT + * + * @copyright 2010 Alexis Deveria + * + */ +export default { + name: 'imagelib', + async init ({$, decode64, importLocale, dropXMLInternalSubset}) { + const imagelibStrings = await importLocale(); - function _typeof(obj) { - "@babel/helpers - typeof"; + const modularVersion = !('svgEditor' in window) || + !window.svgEditor || + window.svgEditor.modules !== false; - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; + const svgEditor = this; + + const {uiStrings, canvas: svgCanvas, curConfig: {extIconsPath}} = svgEditor; + + imagelibStrings.imgLibs = imagelibStrings.imgLibs.map(({name, url, description}) => { + // Todo: Adopt some standard formatting library like `fluent.js` instead + url = url + // Keep these regexes as is in prep. for switching to `u` flag + // which will require escaping + // eslint-disable-next-line unicorn/better-regex + .replace(/\{path\}/g, extIconsPath) + .replace( + // eslint-disable-next-line unicorn/better-regex + /\{modularVersion\}/g, + modularVersion + ? (imagelibStrings.moduleEnding || '-es') + : '' + ); + return {name, url, description}; + }); + const allowedImageLibOrigins = imagelibStrings.imgLibs.map(({url}) => { + try { + return new URL(url).origin; + } catch (err) { + return location.origin; + } + }); + + /** + * + * @returns {void} + */ + function closeBrowser () { + $('#imgbrowse_holder').hide(); + document.activeElement.blur(); // make sure focus is the body to correct issue #417 } - return _typeof(obj); - } - - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /** + * @param {string} url + * @returns {void} + */ + function importImage (url) { + const newImage = svgCanvas.addSVGElementFromJson({ + element: 'image', + attr: { + x: 0, + y: 0, + width: 0, + height: 0, + id: svgCanvas.getNextId(), + style: 'pointer-events:inherit' } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); }); + svgCanvas.clearSelection(); + svgCanvas.addToSelection([newImage]); + svgCanvas.setImageURL(url); + } + + const pending = {}; + + let mode = 's'; + let multiArr = []; + let transferStopped = false; + let preview, submit; + + /** + * Contains the SVG to insert. + * @typedef {PlainObject} ImageLibMessage + * @property {"imagelib"} namespace Required to distinguish from any other messages of app. + * @property {string} href Set to same value as previous `ImageLibMetaMessage` `id`. + * @property {string} data The response (as an SVG string or URL) + */ + + /** + * Used for setting meta-data before images are retrieved. + * @typedef {PlainObject} ImageLibMetaMessage + * @property {"imagelib"} namespace Required to distinguish from any other messages of app. + * @property {string} name If the subsequent response is an SVG string or if `preview_url` + * is present, will be used as the title for the preview image. When an + * SVG string is present, will default to the first ``'s contents or + * "(SVG #<Length of response>)" if none is present. Otherwise, if `preview_url` + * is present, will default to the empty string. Though `name` may be falsy, + * it is always expected to be present for meta messages. + * @property {string} id Identifier (the expected `href` for a subsequent response message); + * used for ensuring the subsequent response can be tied to this `ImageLibMetaMessage` object. + * @property {string} [preview_url] When import mode is multiple, used to set an image + * source along with the name/title. If the subsequent response is an SVG string + * and there is no `preview_url`, the default will just be to show the + * name/title. If the response is not an SVG string, the default will be to + * show that response (i.e., the URL). + * @property {string} entry Set automatically with div holding retrieving + * message (until ready to delete) + * @todo Should use a separate Map instead of `entry` + */ + + /** + * @param {PlainObject} cfg + * @param {string} cfg.origin + * @param {ImageLibMetaMessage|ImageLibMessage|string} cfg.data String is deprecated when parsed to JSON `ImageLibMessage` + * @returns {void} + */ + async function onMessage ({origin, data: response}) { // eslint-disable-line no-shadow + if (!response || !['string', 'object'].includes(typeof response)) { + // Do nothing + return; + } + let id; + let type; + try { + // Todo: This block can be removed (and the above check changed to + // insist on an object) if embedAPI moves away from a string to + // an object (if IE9 support not needed) + response = typeof response === 'object' ? response : JSON.parse(response); + if (response.namespace !== 'imagelib') { + return; + } + if (!allowedImageLibOrigins.includes('*') && !allowedImageLibOrigins.includes(origin)) { + // Todo: Surface this error to user? + console.log(`Origin ${origin} not whitelisted for posting to ${window.origin}`); // eslint-disable-line no-console + return; + } + const hasName = 'name' in response; + const hasHref = 'href' in response; + + if (!hasName && transferStopped) { + transferStopped = false; + return; + } + + if (hasHref) { + id = response.href; + response = response.data; + } + + // Hide possible transfer dialog box + $('#dialog_box').hide(); + type = hasName + ? 'meta' + : response.charAt(0); + } catch (e) { + // This block is for backward compatibility (for IAN and Openclipart); + // should otherwise return + if (typeof response === 'string') { + const char1 = response.charAt(0); + + if (char1 !== '{' && transferStopped) { + transferStopped = false; + return; + } + + if (char1 === '|') { + const secondpos = response.indexOf('|', 1); + id = response.substr(1, secondpos - 1); + response = response.substr(secondpos + 1); + type = response.charAt(0); + } + } + } + + let entry, curMeta, svgStr, imgStr; + switch (type) { + case 'meta': { + // Metadata + transferStopped = false; + curMeta = response; + + // Should be safe to add dynamic property as passed metadata + pending[curMeta.id] = curMeta; // lgtm [js/remote-property-injection] + + const name = (curMeta.name || 'file'); + + const message = uiStrings.notification.retrieving.replace('%s', name); + + if (mode !== 'm') { + await $.process_cancel(message); + transferStopped = true; + // Should a message be sent back to the frame? + + $('#dialog_box').hide(); + } else { + entry = $('<div>').text(message).data('id', curMeta.id); + preview.append(entry); + curMeta.entry = entry; + } + + return; + } + case '<': + svgStr = true; + break; + case 'd': { + if (response.startsWith('data:image/svg+xml')) { + const pre = 'data:image/svg+xml;base64,'; + const src = response.substring(pre.length); + response = decode64(src); + svgStr = true; + break; + } else if (response.startsWith('data:image/')) { + imgStr = true; + break; + } + } + // Else fall through + default: + // TODO: See if there's a way to base64 encode the binary data stream + // const str = 'data:;base64,' + svgedit.utilities.encode64(response, true); + + // Assume it's raw image data + // importImage(str); + + // Don't give warning as postMessage may have been used by something else + if (mode !== 'm') { + closeBrowser(); + } else { + pending[id].entry.remove(); + } + // await $.alert('Unexpected data was returned: ' + response, function() { + // if (mode !== 'm') { + // closeBrowser(); + // } else { + // pending[id].entry.remove(); + // } + // }); + return; + } + + switch (mode) { + case 's': + // Import one + if (svgStr) { + svgCanvas.importSvgString(response); + } else if (imgStr) { + importImage(response); + } + closeBrowser(); + break; + case 'm': { + // Import multiple + multiArr.push([(svgStr ? 'svg' : 'img'), response]); + curMeta = pending[id]; + let title; + if (svgStr) { + if (curMeta && curMeta.name) { + title = curMeta.name; + } else { + // Try to find a title + // `dropXMLInternalSubset` is to help prevent the billion laughs attack + const xml = new DOMParser().parseFromString(dropXMLInternalSubset(response), 'text/xml').documentElement; // lgtm [js/xml-bomb] + title = $(xml).children('title').first().text() || '(SVG #' + response.length + ')'; + } + if (curMeta) { + preview.children().each(function () { + if ($(this).data('id') === id) { + if (curMeta.preview_url) { + $(this).html( + $('<span>').append( + $('<img>').attr('src', curMeta.preview_url), + title + ) + ); + } else { + $(this).text(title); + } + submit.removeAttr('disabled'); + } + }); + } else { + preview.append( + $('<div>').text(title) + ); + submit.removeAttr('disabled'); + } + } else { + if (curMeta && curMeta.preview_url) { + title = curMeta.name || ''; + entry = $('<span>').append( + $('<img>').attr('src', curMeta.preview_url), + title + ); + } else { + entry = $('<img>').attr('src', response); + } + + if (curMeta) { + preview.children().each(function () { + if ($(this).data('id') === id) { + $(this).html(entry); + submit.removeAttr('disabled'); + } + }); + } else { + preview.append($('<div>').append(entry)); + submit.removeAttr('disabled'); + } + } + break; + } case 'o': { + // Open + if (!svgStr) { break; } + closeBrowser(); + const ok = await svgEditor.openPrep(); + if (!ok) { return; } + svgCanvas.clear(); + svgCanvas.setSvgString(response); + // updateCanvas(); + break; + } + } + } + + // Receive `postMessage` data + window.addEventListener('message', onMessage, true); + + /** + * @param {boolean} show + * @returns {void} + */ + function toggleMulti (show) { + $('#lib_framewrap, #imglib_opts').css({right: (show ? 200 : 10)}); + if (!preview) { + preview = $('<div id=imglib_preview>').css({ + position: 'absolute', + top: 45, + right: 10, + width: 180, + bottom: 45, + background: '#fff', + overflow: 'auto' + }).insertAfter('#lib_framewrap'); + + submit = $('<button disabled>Import selected</button>') + .appendTo('#imgbrowse') + .on('click touchend', function () { + $.each(multiArr, function (i) { + const type = this[0]; + const data = this[1]; + if (type === 'svg') { + svgCanvas.importSvgString(data); + } else { + importImage(data); + } + svgCanvas.moveSelectedElements(i * 20, i * 20, false); + }); + preview.empty(); + multiArr = []; + $('#imgbrowse_holder').hide(); + }).css({ + position: 'absolute', + bottom: 10, + right: -10 + }); + } + + preview.toggle(show); + submit.toggle(show); + } + + /** + * + * @returns {void} + */ + function showBrowser () { + let browser = $('#imgbrowse'); + if (!browser.length) { + $('<div id=imgbrowse_holder><div id=imgbrowse class=toolbar_button>' + + '</div></div>').insertAfter('#svg_docprops'); + browser = $('#imgbrowse'); + + const allLibs = imagelibStrings.select_lib; + + const libOpts = $('<ul id=imglib_opts>').appendTo(browser); + const frame = $('<iframe src="javascript:0"/>').prependTo(browser).hide().wrap('<div id=lib_framewrap>'); + + const header = $('<h1>').prependTo(browser).text(allLibs).css({ + position: 'absolute', + top: 0, + left: 0, + width: '100%' + }); + + const cancel = $('<button>' + uiStrings.common.cancel + '</button>') + .appendTo(browser) + .on('click touchend', function () { + $('#imgbrowse_holder').hide(); + }).css({ + position: 'absolute', + top: 5, + right: -10 + }); + + const leftBlock = $('<span>').css({position: 'absolute', top: 5, left: 10}).appendTo(browser); + + const back = $('<button hidden>' + imagelibStrings.show_list + '</button>') + .appendTo(leftBlock) + .on('click touchend', function () { + frame.attr('src', 'about:blank').hide(); + libOpts.show(); + header.text(allLibs); + back.hide(); + }).css({ + 'margin-right': 5 + }).hide(); + + /* const type = */ $('<select><option value=s>' + + imagelibStrings.import_single + '</option><option value=m>' + + imagelibStrings.import_multi + '</option><option value=o>' + + imagelibStrings.open + '</option></select>').appendTo(leftBlock).change(function () { + mode = $(this).val(); + switch (mode) { + case 's': + case 'o': + toggleMulti(false); + break; + + case 'm': + // Import multiple + toggleMulti(true); + break; + } + }).css({ + 'margin-top': 10 + }); + + cancel.prepend($.getSvgIcon('cancel', true)); + back.prepend($.getSvgIcon('tool_imagelib', true)); + + imagelibStrings.imgLibs.forEach(function ({name, url, description}) { + $('<li>') + .appendTo(libOpts) + .text(name) + .on('click touchend', function () { + frame.attr( + 'src', + url + ).show(); + header.text(name); + libOpts.hide(); + back.show(); + }).append(`<span>${description}</span>`); + }); + } else { + $('#imgbrowse_holder').show(); + } + } + + const buttons = [{ + id: 'tool_imagelib', + type: 'app_menu', // _flyout + icon: extIconsPath + 'imagelib.png', + position: 4, + events: { + mouseup: showBrowser + } + }]; + + return { + svgicons: extIconsPath + 'ext-imagelib.xml', + buttons: imagelibStrings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + callback () { + $('<style>').text( + '#imgbrowse_holder {' + + 'position: absolute;' + + 'top: 0;' + + 'left: 0;' + + 'width: 100%;' + + 'height: 100%;' + + 'background-color: rgba(0, 0, 0, .5);' + + 'z-index: 5;' + + '}' + + '#imgbrowse {' + + 'position: absolute;' + + 'top: 25px;' + + 'left: 25px;' + + 'right: 25px;' + + 'bottom: 25px;' + + 'min-width: 300px;' + + 'min-height: 200px;' + + 'background: #B0B0B0;' + + 'border: 1px outset #777;' + + '}' + + '#imgbrowse h1 {' + + 'font-size: 20px;' + + 'margin: .4em;' + + 'text-align: center;' + + '}' + + '#lib_framewrap,' + + '#imgbrowse > ul {' + + 'position: absolute;' + + 'top: 45px;' + + 'left: 10px;' + + 'right: 10px;' + + 'bottom: 10px;' + + 'background: white;' + + 'margin: 0;' + + 'padding: 0;' + + '}' + + '#imgbrowse > ul {' + + 'overflow: auto;' + + '}' + + '#imgbrowse > div {' + + 'border: 1px solid #666;' + + '}' + + '#imglib_preview > div {' + + 'padding: 5px;' + + 'font-size: 12px;' + + '}' + + '#imglib_preview img {' + + 'display: block;' + + 'margin: 0 auto;' + + 'max-height: 100px;' + + '}' + + '#imgbrowse li {' + + 'list-style: none;' + + 'padding: .5em;' + + 'background: #E8E8E8;' + + 'border-bottom: 1px solid #B0B0B0;' + + 'line-height: 1.2em;' + + 'font-style: sans-serif;' + + '}' + + '#imgbrowse li > span {' + + 'color: #666;' + + 'font-size: 15px;' + + 'display: block;' + + '}' + + '#imgbrowse li:hover {' + + 'background: #FFC;' + + 'cursor: pointer;' + + '}' + + '#imgbrowse iframe {' + + 'width: 100%;' + + 'height: 100%;' + + 'border: 0;' + + '}' + ).appendTo('head'); + } }; } - - /** - * @file ext-imagelib.js - * - * @license MIT - * - * @copyright 2010 Alexis Deveria - * - */ - var extImagelib = { - name: 'imagelib', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var $, decode64, importLocale, dropXMLInternalSubset, imagelibStrings, modularVersion, svgEditor, uiStrings, svgCanvas, extIconsPath, allowedImageLibOrigins, closeBrowser, importImage, pending, mode, multiArr, transferStopped, preview, submit, onMessage, _onMessage, toggleMulti, showBrowser, buttons; - - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - showBrowser = function _showBrowser() { - var browser = $('#imgbrowse'); - - if (!browser.length) { - $('<div id=imgbrowse_holder><div id=imgbrowse class=toolbar_button>' + '</div></div>').insertAfter('#svg_docprops'); - browser = $('#imgbrowse'); - var allLibs = imagelibStrings.select_lib; - var libOpts = $('<ul id=imglib_opts>').appendTo(browser); - var frame = $('<iframe src="javascript:0"/>').prependTo(browser).hide().wrap('<div id=lib_framewrap>'); - var header = $('<h1>').prependTo(browser).text(allLibs).css({ - position: 'absolute', - top: 0, - left: 0, - width: '100%' - }); - var cancel = $('<button>' + uiStrings.common.cancel + '</button>').appendTo(browser).on('click touchend', function () { - $('#imgbrowse_holder').hide(); - }).css({ - position: 'absolute', - top: 5, - right: -10 - }); - var leftBlock = $('<span>').css({ - position: 'absolute', - top: 5, - left: 10 - }).appendTo(browser); - var back = $('<button hidden>' + imagelibStrings.show_list + '</button>').appendTo(leftBlock).on('click touchend', function () { - frame.attr('src', 'about:blank').hide(); - libOpts.show(); - header.text(allLibs); - back.hide(); - }).css({ - 'margin-right': 5 - }).hide(); - /* const type = */ - - $('<select><option value=s>' + imagelibStrings.import_single + '</option><option value=m>' + imagelibStrings.import_multi + '</option><option value=o>' + imagelibStrings.open + '</option></select>').appendTo(leftBlock).change(function () { - mode = $(this).val(); - - switch (mode) { - case 's': - case 'o': - toggleMulti(false); - break; - - case 'm': - // Import multiple - toggleMulti(true); - break; - } - }).css({ - 'margin-top': 10 - }); - cancel.prepend($.getSvgIcon('cancel', true)); - back.prepend($.getSvgIcon('tool_imagelib', true)); - imagelibStrings.imgLibs.forEach(function (_ref5) { - var name = _ref5.name, - url = _ref5.url, - description = _ref5.description; - $('<li>').appendTo(libOpts).text(name).on('click touchend', function () { - frame.attr('src', url).show(); - header.text(name); - libOpts.hide(); - back.show(); - }).append("<span>".concat(description, "</span>")); - }); - } else { - $('#imgbrowse_holder').show(); - } - }; - - toggleMulti = function _toggleMulti(show) { - $('#lib_framewrap, #imglib_opts').css({ - right: show ? 200 : 10 - }); - - if (!preview) { - preview = $('<div id=imglib_preview>').css({ - position: 'absolute', - top: 45, - right: 10, - width: 180, - bottom: 45, - background: '#fff', - overflow: 'auto' - }).insertAfter('#lib_framewrap'); - submit = $('<button disabled>Import selected</button>').appendTo('#imgbrowse').on('click touchend', function () { - $.each(multiArr, function (i) { - var type = this[0]; - var data = this[1]; - - if (type === 'svg') { - svgCanvas.importSvgString(data); - } else { - importImage(data); - } - - svgCanvas.moveSelectedElements(i * 20, i * 20, false); - }); - preview.empty(); - multiArr = []; - $('#imgbrowse_holder').hide(); - }).css({ - position: 'absolute', - bottom: 10, - right: -10 - }); - } - - preview.toggle(show); - submit.toggle(show); - }; - - _onMessage = function _onMessage3() { - _onMessage = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(_ref4) { - var origin, response, id, type, hasName, hasHref, char1, secondpos, entry, curMeta, svgStr, imgStr, name, message, pre, src, title, xml, ok; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - origin = _ref4.origin, response = _ref4.data; - - if (!(!response || !['string', 'object'].includes(_typeof(response)))) { - _context.next = 3; - break; - } - - return _context.abrupt("return"); - - case 3: - _context.prev = 3; - // Todo: This block can be removed (and the above check changed to - // insist on an object) if embedAPI moves away from a string to - // an object (if IE9 support not needed) - response = _typeof(response) === 'object' ? response : JSON.parse(response); - - if (!(response.namespace !== 'imagelib')) { - _context.next = 7; - break; - } - - return _context.abrupt("return"); - - case 7: - if (!(!allowedImageLibOrigins.includes('*') && !allowedImageLibOrigins.includes(origin))) { - _context.next = 10; - break; - } - - // Todo: Surface this error to user? - console.log("Origin ".concat(origin, " not whitelisted for posting to ").concat(window.origin)); // eslint-disable-line no-console - - return _context.abrupt("return"); - - case 10: - hasName = 'name' in response; - hasHref = 'href' in response; - - if (!(!hasName && transferStopped)) { - _context.next = 15; - break; - } - - transferStopped = false; - return _context.abrupt("return"); - - case 15: - if (hasHref) { - id = response.href; - response = response.data; - } // Hide possible transfer dialog box - - - $('#dialog_box').hide(); - type = hasName ? 'meta' : response.charAt(0); - _context.next = 28; - break; - - case 20: - _context.prev = 20; - _context.t0 = _context["catch"](3); - - if (!(typeof response === 'string')) { - _context.next = 28; - break; - } - - char1 = response.charAt(0); - - if (!(char1 !== '{' && transferStopped)) { - _context.next = 27; - break; - } - - transferStopped = false; - return _context.abrupt("return"); - - case 27: - if (char1 === '|') { - secondpos = response.indexOf('|', 1); - id = response.substr(1, secondpos - 1); - response = response.substr(secondpos + 1); - type = response.charAt(0); - } - - case 28: - _context.t1 = type; - _context.next = _context.t1 === 'meta' ? 31 : _context.t1 === '<' ? 47 : _context.t1 === 'd' ? 49 : 60; - break; - - case 31: - // Metadata - transferStopped = false; - curMeta = response; // Should be safe to add dynamic property as passed metadata - - pending[curMeta.id] = curMeta; // lgtm [js/remote-property-injection] - - name = curMeta.name || 'file'; - message = uiStrings.notification.retrieving.replace('%s', name); - - if (!(mode !== 'm')) { - _context.next = 43; - break; - } - - _context.next = 39; - return $.process_cancel(message); - - case 39: - transferStopped = true; // Should a message be sent back to the frame? - - $('#dialog_box').hide(); - _context.next = 46; - break; - - case 43: - entry = $('<div>').text(message).data('id', curMeta.id); - preview.append(entry); - curMeta.entry = entry; - - case 46: - return _context.abrupt("return"); - - case 47: - svgStr = true; - return _context.abrupt("break", 62); - - case 49: - if (!response.startsWith('data:image/svg+xml')) { - _context.next = 57; - break; - } - - pre = 'data:image/svg+xml;base64,'; - src = response.substring(pre.length); - response = decode64(src); - svgStr = true; - return _context.abrupt("break", 62); - - case 57: - if (!response.startsWith('data:image/')) { - _context.next = 60; - break; - } - - imgStr = true; - return _context.abrupt("break", 62); - - case 60: - // TODO: See if there's a way to base64 encode the binary data stream - // const str = 'data:;base64,' + svgedit.utilities.encode64(response, true); - // Assume it's raw image data - // importImage(str); - // Don't give warning as postMessage may have been used by something else - if (mode !== 'm') { - closeBrowser(); - } else { - pending[id].entry.remove(); - } // await $.alert('Unexpected data was returned: ' + response, function() { - // if (mode !== 'm') { - // closeBrowser(); - // } else { - // pending[id].entry.remove(); - // } - // }); - - - return _context.abrupt("return"); - - case 62: - _context.t2 = mode; - _context.next = _context.t2 === 's' ? 65 : _context.t2 === 'm' ? 68 : _context.t2 === 'o' ? 72 : 83; - break; - - case 65: - // Import one - if (svgStr) { - svgCanvas.importSvgString(response); - } else if (imgStr) { - importImage(response); - } - - closeBrowser(); - return _context.abrupt("break", 83); - - case 68: - // Import multiple - multiArr.push([svgStr ? 'svg' : 'img', response]); - curMeta = pending[id]; - - if (svgStr) { - if (curMeta && curMeta.name) { - title = curMeta.name; - } else { - // Try to find a title - // `dropXMLInternalSubset` is to help prevent the billion laughs attack - xml = new DOMParser().parseFromString(dropXMLInternalSubset(response), 'text/xml').documentElement; // lgtm [js/xml-bomb] - - title = $(xml).children('title').first().text() || '(SVG #' + response.length + ')'; - } - - if (curMeta) { - preview.children().each(function () { - if ($(this).data('id') === id) { - if (curMeta.preview_url) { - $(this).html($('<span>').append($('<img>').attr('src', curMeta.preview_url), title)); - } else { - $(this).text(title); - } - - submit.removeAttr('disabled'); - } - }); - } else { - preview.append($('<div>').text(title)); - submit.removeAttr('disabled'); - } - } else { - if (curMeta && curMeta.preview_url) { - title = curMeta.name || ''; - entry = $('<span>').append($('<img>').attr('src', curMeta.preview_url), title); - } else { - entry = $('<img>').attr('src', response); - } - - if (curMeta) { - preview.children().each(function () { - if ($(this).data('id') === id) { - $(this).html(entry); - submit.removeAttr('disabled'); - } - }); - } else { - preview.append($('<div>').append(entry)); - submit.removeAttr('disabled'); - } - } - - return _context.abrupt("break", 83); - - case 72: - if (svgStr) { - _context.next = 74; - break; - } - - return _context.abrupt("break", 83); - - case 74: - closeBrowser(); - _context.next = 77; - return svgEditor.openPrep(); - - case 77: - ok = _context.sent; - - if (ok) { - _context.next = 80; - break; - } - - return _context.abrupt("return"); - - case 80: - svgCanvas.clear(); - svgCanvas.setSvgString(response); // updateCanvas(); - - return _context.abrupt("break", 83); - - case 83: - case "end": - return _context.stop(); - } - } - }, _callee, null, [[3, 20]]); - })); - return _onMessage.apply(this, arguments); - }; - - onMessage = function _onMessage2(_x) { - return _onMessage.apply(this, arguments); - }; - - importImage = function _importImage(url) { - var newImage = svgCanvas.addSVGElementFromJson({ - element: 'image', - attr: { - x: 0, - y: 0, - width: 0, - height: 0, - id: svgCanvas.getNextId(), - style: 'pointer-events:inherit' - } - }); - svgCanvas.clearSelection(); - svgCanvas.addToSelection([newImage]); - svgCanvas.setImageURL(url); - }; - - closeBrowser = function _closeBrowser() { - $('#imgbrowse_holder').hide(); - document.activeElement.blur(); // make sure focus is the body to correct issue #417 - }; - - $ = _ref.$, decode64 = _ref.decode64, importLocale = _ref.importLocale, dropXMLInternalSubset = _ref.dropXMLInternalSubset; - _context2.next = 9; - return importLocale(); - - case 9: - imagelibStrings = _context2.sent; - modularVersion = !('svgEditor' in window) || !window.svgEditor || window.svgEditor.modules !== false; - svgEditor = _this; - uiStrings = svgEditor.uiStrings, svgCanvas = svgEditor.canvas, extIconsPath = svgEditor.curConfig.extIconsPath; - imagelibStrings.imgLibs = imagelibStrings.imgLibs.map(function (_ref2) { - var name = _ref2.name, - url = _ref2.url, - description = _ref2.description; - // Todo: Adopt some standard formatting library like `fluent.js` instead - url = url // Keep these regexes as is in prep. for switching to `u` flag - // which will require escaping - // eslint-disable-next-line unicorn/better-regex - .replace(/\{path\}/g, extIconsPath).replace( // eslint-disable-next-line unicorn/better-regex - /\{modularVersion\}/g, modularVersion ? imagelibStrings.moduleEnding || '-es' : ''); - return { - name: name, - url: url, - description: description - }; - }); - allowedImageLibOrigins = imagelibStrings.imgLibs.map(function (_ref3) { - var url = _ref3.url; - - try { - return new URL(url).origin; - } catch (err) { - return location.origin; - } - }); - /** - * - * @returns {void} - */ - - pending = {}; - mode = 's'; - multiArr = []; - transferStopped = false; - // Receive `postMessage` data - window.addEventListener('message', onMessage, true); - /** - * @param {boolean} show - * @returns {void} - */ - - buttons = [{ - id: 'tool_imagelib', - type: 'app_menu', - // _flyout - icon: extIconsPath + 'imagelib.png', - position: 4, - events: { - mouseup: showBrowser - } - }]; - return _context2.abrupt("return", { - svgicons: extIconsPath + 'ext-imagelib.xml', - buttons: imagelibStrings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - callback: function callback() { - $('<style>').text('#imgbrowse_holder {' + 'position: absolute;' + 'top: 0;' + 'left: 0;' + 'width: 100%;' + 'height: 100%;' + 'background-color: rgba(0, 0, 0, .5);' + 'z-index: 5;' + '}' + '#imgbrowse {' + 'position: absolute;' + 'top: 25px;' + 'left: 25px;' + 'right: 25px;' + 'bottom: 25px;' + 'min-width: 300px;' + 'min-height: 200px;' + 'background: #B0B0B0;' + 'border: 1px outset #777;' + '}' + '#imgbrowse h1 {' + 'font-size: 20px;' + 'margin: .4em;' + 'text-align: center;' + '}' + '#lib_framewrap,' + '#imgbrowse > ul {' + 'position: absolute;' + 'top: 45px;' + 'left: 10px;' + 'right: 10px;' + 'bottom: 10px;' + 'background: white;' + 'margin: 0;' + 'padding: 0;' + '}' + '#imgbrowse > ul {' + 'overflow: auto;' + '}' + '#imgbrowse > div {' + 'border: 1px solid #666;' + '}' + '#imglib_preview > div {' + 'padding: 5px;' + 'font-size: 12px;' + '}' + '#imglib_preview img {' + 'display: block;' + 'margin: 0 auto;' + 'max-height: 100px;' + '}' + '#imgbrowse li {' + 'list-style: none;' + 'padding: .5em;' + 'background: #E8E8E8;' + 'border-bottom: 1px solid #B0B0B0;' + 'line-height: 1.2em;' + 'font-style: sans-serif;' + '}' + '#imgbrowse li > span {' + 'color: #666;' + 'font-size: 15px;' + 'display: block;' + '}' + '#imgbrowse li:hover {' + 'background: #FFC;' + 'cursor: pointer;' + '}' + '#imgbrowse iframe {' + 'width: 100%;' + 'height: 100%;' + 'border: 0;' + '}').appendTo('head'); - } - }); - - case 22: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))(); - } - }; - - return extImagelib; - -}()); +}; diff --git a/dist/extensions/ext-imagelib.xml b/dist/extensions/ext-imagelib.xml new file mode 100644 index 00000000..fdc7e333 --- /dev/null +++ b/dist/extensions/ext-imagelib.xml @@ -0,0 +1,14 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <g id="tool_imagelib"> +<svg width="201" height="211" xmlns="http://www.w3.org/2000/svg"> + <g> + <path fill="#efe8b8" stroke="#d6c47c" stroke-linecap="round" d="m2.75,49.51761l56.56,-46.26761c12.73,8.25 25.71001,7 46.44,0.75l-56.03999,47.23944l-22.72002,25.01056l-24.23999,-26.73239z" id="svg_2" stroke-width="7"/> + <path fill="#a03333" stroke="#3f3f3f" d="m3.75,203.25002c14.33301,7 30.66699,7 46,0l0,-152.00002c-14.66699,8 -32.33301,8 -47,0l1,152.00002zm45.75,-152.25002l56.25,-46.75l0,151l-56,48.00002m-47.25,-154.25002l57.25,-46.5" id="svg_1" stroke-width="7" stroke-linecap="round"/> + <path fill="#efe8b8" stroke="#d6c47c" stroke-linecap="round" d="m49.75,49.51801l56.56,-46.26801c12.72998,8.25 25.71002,7 46.44,0.75l-56.03998,47.239l-22.72003,25.011l-24.23999,-26.73199z" stroke-width="7" id="svg_5"/> + <path fill="#2f8e2f" stroke="#3f3f3f" d="m50.75,202.25c14.33301,7 30.66699,7.04253 46,0.04253l0,-151.04253c-14.66699,8 -32.33301,8 -47,0l1,151zm45.75,-151.25l56.25,-46.75l0,144.01219l-56,51.98782m-47.25,-151.25002l57.25,-46.5" stroke-width="7" stroke-linecap="round" id="svg_6"/> + <path fill="#efe8b8" stroke="#d6c47c" stroke-linecap="round" d="m95.75,49.51801l56.56,-46.26801c12.72998,8.25 25.71002,7 46.44,0.75l-56.03998,47.239l-22.72003,25.011l-24.23999,-26.73199z" stroke-width="7" id="svg_10"/> + <path fill="#336393" stroke="#3f3f3f" d="m96.75,200.29445c14.33301,7 30.66699,7 46,0l0,-149.04445c-14.66699,8 -32.33301,8 -47,0l1,149.04445zm45.75,-149.29445l56.25,-46.75l0,148.04445l-56,48m-47.25,-151.29445l57.25,-46.5" stroke-width="7" stroke-linecap="round" id="svg_11"/> + </g> +</svg> + </g> +</svg> diff --git a/dist/extensions/ext-locale/arrows/en.js b/dist/extensions/ext-locale/arrows/en.js index 909d76d9..b5f0a884 100644 --- a/dist/extensions/ext-locale/arrows/en.js +++ b/dist/extensions/ext-locale/arrows/en.js @@ -1,13 +1,10 @@ -var svgEditorExtensionLocale_arrows_en = (function () { - 'use strict'; - - var en = { - name: 'Arrows', - langList: [{ - id: 'arrow_none', - textContent: 'No arrow' - }], - contextTools: [{ +export default { + name: 'Arrows', + langList: [ + {id: 'arrow_none', textContent: 'No arrow'} + ], + contextTools: [ + { title: 'Select arrow type', options: { none: 'No arrow', @@ -17,9 +14,6 @@ var svgEditorExtensionLocale_arrows_en = (function () { mid: '-->--', mid_bk: '--<--' } - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/arrows/fr.js b/dist/extensions/ext-locale/arrows/fr.js index d4e15f24..ea223018 100644 --- a/dist/extensions/ext-locale/arrows/fr.js +++ b/dist/extensions/ext-locale/arrows/fr.js @@ -1,13 +1,10 @@ -var svgEditorExtensionLocale_arrows_fr = (function () { - 'use strict'; - - var fr = { - name: 'Arrows', - langList: [{ - id: 'arrow_none', - textContent: 'Sans flèche' - }], - contextTools: [{ +export default { + name: 'Arrows', + langList: [ + {id: 'arrow_none', textContent: 'Sans flèche'} + ], + contextTools: [ + { title: 'Select arrow type', options: { none: 'No arrow', @@ -17,9 +14,6 @@ var svgEditorExtensionLocale_arrows_fr = (function () { mid: '-->--', mid_bk: '--<--' } - }] - }; - - return fr; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/arrows/zh-CN.js b/dist/extensions/ext-locale/arrows/zh-CN.js old mode 100644 new mode 100755 index cb9286a6..bbe2e860 --- a/dist/extensions/ext-locale/arrows/zh-CN.js +++ b/dist/extensions/ext-locale/arrows/zh-CN.js @@ -1,13 +1,10 @@ -var svgEditorExtensionLocale_arrows_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '箭头', - langList: [{ - id: 'arrow_none', - textContent: '无箭头' - }], - contextTools: [{ +export default { + name: '箭头', + langList: [ + {id: 'arrow_none', textContent: '无箭头'} + ], + contextTools: [ + { title: '选择箭头类型', options: { none: '无箭头', @@ -17,9 +14,6 @@ var svgEditorExtensionLocale_arrows_zh_CN = (function () { mid: '-->--', mid_bk: '--<--' } - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/closepath/en.js b/dist/extensions/ext-locale/closepath/en.js index f8dc9bcf..5b57d617 100644 --- a/dist/extensions/ext-locale/closepath/en.js +++ b/dist/extensions/ext-locale/closepath/en.js @@ -1,15 +1,11 @@ -var svgEditorExtensionLocale_closepath_en = (function () { - 'use strict'; - - var en = { - name: 'ClosePath', - buttons: [{ +export default { + name: 'ClosePath', + buttons: [ + { title: 'Open path' - }, { + }, + { title: 'Close path' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/closepath/zh-CN.js b/dist/extensions/ext-locale/closepath/zh-CN.js old mode 100644 new mode 100755 index fa9f1a3b..20f0c42d --- a/dist/extensions/ext-locale/closepath/zh-CN.js +++ b/dist/extensions/ext-locale/closepath/zh-CN.js @@ -1,15 +1,11 @@ -var svgEditorExtensionLocale_closepath_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '闭合路径', - buttons: [{ +export default { + name: '闭合路径', + buttons: [ + { title: '打开路径' - }, { + }, + { title: '关闭路径' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/connector/en.js b/dist/extensions/ext-locale/connector/en.js index a2c09b7b..beef9a7f 100644 --- a/dist/extensions/ext-locale/connector/en.js +++ b/dist/extensions/ext-locale/connector/en.js @@ -1,17 +1,11 @@ -var svgEditorExtensionLocale_connector_en = (function () { - 'use strict'; - - var en = { - name: 'Connector', - langList: [{ - id: 'mode_connect', +export default { + name: 'Connector', + langList: [ + {id: 'mode_connect', title: 'Connect two objects'} + ], + buttons: [ + { title: 'Connect two objects' - }], - buttons: [{ - title: 'Connect two objects' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/connector/fr.js b/dist/extensions/ext-locale/connector/fr.js index 8b480be5..aec84749 100644 --- a/dist/extensions/ext-locale/connector/fr.js +++ b/dist/extensions/ext-locale/connector/fr.js @@ -1,17 +1,11 @@ -var svgEditorExtensionLocale_connector_fr = (function () { - 'use strict'; - - var fr = { - name: 'Connector', - langList: [{ - id: 'mode_connect', - title: 'Connecter deux objets' - }], - buttons: [{ +export default { + name: 'Connector', + langList: [ + {id: 'mode_connect', title: 'Connecter deux objets'} + ], + buttons: [ + { title: 'Connect two objects' - }] - }; - - return fr; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/connector/zh-CN.js b/dist/extensions/ext-locale/connector/zh-CN.js old mode 100644 new mode 100755 index 19c812d3..e5749d17 --- a/dist/extensions/ext-locale/connector/zh-CN.js +++ b/dist/extensions/ext-locale/connector/zh-CN.js @@ -1,17 +1,11 @@ -var svgEditorExtensionLocale_connector_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '连接器', - langList: [{ - id: 'mode_connect', +export default { + name: '连接器', + langList: [ + {id: 'mode_connect', title: '连接两个对象'} + ], + buttons: [ + { title: '连接两个对象' - }], - buttons: [{ - title: '连接两个对象' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/eyedropper/en.js b/dist/extensions/ext-locale/eyedropper/en.js index 2f1fa530..8c7fdc54 100644 --- a/dist/extensions/ext-locale/eyedropper/en.js +++ b/dist/extensions/ext-locale/eyedropper/en.js @@ -1,14 +1,9 @@ -var svgEditorExtensionLocale_eyedropper_en = (function () { - 'use strict'; - - var en = { - name: 'eyedropper', - buttons: [{ +export default { + name: 'eyedropper', + buttons: [ + { title: 'Eye Dropper Tool', key: 'I' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/eyedropper/zh-CN.js b/dist/extensions/ext-locale/eyedropper/zh-CN.js old mode 100644 new mode 100755 index 2ccb17cd..3f31a971 --- a/dist/extensions/ext-locale/eyedropper/zh-CN.js +++ b/dist/extensions/ext-locale/eyedropper/zh-CN.js @@ -1,14 +1,9 @@ -var svgEditorExtensionLocale_eyedropper_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '滴管', - buttons: [{ +export default { + name: '滴管', + buttons: [ + { title: '滴管工具', key: 'I' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/foreignobject/en.js b/dist/extensions/ext-locale/foreignobject/en.js index ed7a79e2..79e39cf0 100644 --- a/dist/extensions/ext-locale/foreignobject/en.js +++ b/dist/extensions/ext-locale/foreignobject/en.js @@ -1,25 +1,25 @@ -var svgEditorExtensionLocale_foreignobject_en = (function () { - 'use strict'; - - var en = { - name: 'foreignObject', - buttons: [{ +export default { + name: 'foreignObject', + buttons: [ + { title: 'Foreign Object Tool' - }, { + }, + { title: 'Edit ForeignObject Content' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: "Change foreignObject's width", label: 'w' - }, { + }, + { title: "Change foreignObject's height", label: 'h' - }, { + }, + { title: "Change foreignObject's font size", label: 'font-size' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/foreignobject/zh-CN.js b/dist/extensions/ext-locale/foreignobject/zh-CN.js old mode 100644 new mode 100755 index 99fa9f63..9b221b8a --- a/dist/extensions/ext-locale/foreignobject/zh-CN.js +++ b/dist/extensions/ext-locale/foreignobject/zh-CN.js @@ -1,25 +1,25 @@ -var svgEditorExtensionLocale_foreignobject_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '外部对象', - buttons: [{ +export default { + name: '外部对象', + buttons: [ + { title: '外部对象工具' - }, { + }, + { title: '编辑外部对象内容' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: '改变外部对象宽度', label: 'w' - }, { + }, + { title: '改变外部对象高度', label: 'h' - }, { + }, + { title: '改变外部对象文字大小', label: '文字大小' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/grid/en.js b/dist/extensions/ext-locale/grid/en.js index 9eb87099..8472da87 100644 --- a/dist/extensions/ext-locale/grid/en.js +++ b/dist/extensions/ext-locale/grid/en.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_grid_en = (function () { - 'use strict'; - - var en = { - name: 'View Grid', - buttons: [{ +export default { + name: 'View Grid', + buttons: [ + { title: 'Show/Hide Grid' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/grid/zh-CN.js b/dist/extensions/ext-locale/grid/zh-CN.js old mode 100644 new mode 100755 index 829fac4e..4c264d8a --- a/dist/extensions/ext-locale/grid/zh-CN.js +++ b/dist/extensions/ext-locale/grid/zh-CN.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_grid_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '网格视图', - buttons: [{ +export default { + name: '网格视图', + buttons: [ + { title: '显示/隐藏网格' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/helloworld/en.js b/dist/extensions/ext-locale/helloworld/en.js index 5f602f1a..e52406fa 100644 --- a/dist/extensions/ext-locale/helloworld/en.js +++ b/dist/extensions/ext-locale/helloworld/en.js @@ -1,14 +1,9 @@ -var svgEditorExtensionLocale_helloworld_en = (function () { - 'use strict'; - - var en = { - name: 'Hello World', - text: 'Hello World!\n\nYou clicked here: {x}, {y}', - buttons: [{ +export default { + name: 'Hello World', + text: 'Hello World!\n\nYou clicked here: {x}, {y}', + buttons: [ + { title: "Say 'Hello World'" - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/helloworld/zh-CN.js b/dist/extensions/ext-locale/helloworld/zh-CN.js old mode 100644 new mode 100755 index 1fee497b..87912014 --- a/dist/extensions/ext-locale/helloworld/zh-CN.js +++ b/dist/extensions/ext-locale/helloworld/zh-CN.js @@ -1,14 +1,9 @@ -var svgEditorExtensionLocale_helloworld_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: 'Hello World', - text: 'Hello World!\n\n 请点击: {x}, {y}', - buttons: [{ +export default { + name: 'Hello World', + text: 'Hello World!\n\n 请点击: {x}, {y}', + buttons: [ + { title: "输出 'Hello World'" - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/de.js b/dist/extensions/ext-locale/imagelib/de.js index 52057562..184d0109 100644 --- a/dist/extensions/ext-locale/imagelib/de.js +++ b/dist/extensions/ext-locale/imagelib/de.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_de = (function () { - 'use strict'; - - var de = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Bilder-Bibliothek' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_de = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return de; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/en.js b/dist/extensions/ext-locale/imagelib/en.js index 3ab39c02..e3e0c311 100644 --- a/dist/extensions/ext-locale/imagelib/en.js +++ b/dist/extensions/ext-locale/imagelib/en.js @@ -1,31 +1,32 @@ -var svgEditorExtensionLocale_imagelib_en = (function () { - 'use strict'; - - var en = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Image library' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' - } // The site is no longer using our API, and they have added an + } + // The site is no longer using our API, and they have added an // `X-Frame-Options` header which prevents our usage cross-origin: // Getting messages like this in console: // Refused to display 'https://openclipart.org/detail/307176/sign-bike' in a frame // because it set 'X-Frame-Options' to 'sameorigin'. // url: 'https://openclipart.org/svgedit', // However, they do have a custom API which we are using here: - /* { name: 'Openclipart', @@ -33,9 +34,5 @@ var svgEditorExtensionLocale_imagelib_en = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return en; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/fr.js b/dist/extensions/ext-locale/imagelib/fr.js index cb6e2619..f2f5ba16 100644 --- a/dist/extensions/ext-locale/imagelib/fr.js +++ b/dist/extensions/ext-locale/imagelib/fr.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_fr = (function () { - 'use strict'; - - var fr = { - select_lib: "Choisir une bibliothèque d'images", - show_list: 'show_list', - import_single: 'import_single', - import_multi: 'import_multi', - open: 'open', - buttons: [{ +export default { + select_lib: "Choisir une bibliothèque d'images", + show_list: 'show_list', + import_single: 'import_single', + import_multi: 'import_multi', + open: 'open', + buttons: [ + { title: "Bibliothèque d'images" - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_fr = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return fr; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/pl.js b/dist/extensions/ext-locale/imagelib/pl.js index af9eff1d..035649d9 100644 --- a/dist/extensions/ext-locale/imagelib/pl.js +++ b/dist/extensions/ext-locale/imagelib/pl.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_pl = (function () { - 'use strict'; - - var pl = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Biblioteka obrazów' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_pl = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return pl; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/pt-BR.js b/dist/extensions/ext-locale/imagelib/pt-BR.js index abbb7291..155c7f3e 100644 --- a/dist/extensions/ext-locale/imagelib/pt-BR.js +++ b/dist/extensions/ext-locale/imagelib/pt-BR.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_pt_BR = (function () { - 'use strict'; - - var ptBR = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Biblioteca de Imagens' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_pt_BR = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return ptBR; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/ro.js b/dist/extensions/ext-locale/imagelib/ro.js index 31324df0..cb557f02 100644 --- a/dist/extensions/ext-locale/imagelib/ro.js +++ b/dist/extensions/ext-locale/imagelib/ro.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_ro = (function () { - 'use strict'; - - var ro = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Bibliotecă de Imagini' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_ro = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return ro; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/sk.js b/dist/extensions/ext-locale/imagelib/sk.js index 6a72ab31..cf399c72 100644 --- a/dist/extensions/ext-locale/imagelib/sk.js +++ b/dist/extensions/ext-locale/imagelib/sk.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_sk = (function () { - 'use strict'; - - var sk = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Knižnica obrázkov' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_sk = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return sk; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/sl.js b/dist/extensions/ext-locale/imagelib/sl.js index 1dba6e38..200d0770 100644 --- a/dist/extensions/ext-locale/imagelib/sl.js +++ b/dist/extensions/ext-locale/imagelib/sl.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_sl = (function () { - 'use strict'; - - var sl = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: 'Knjižnica slik' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_sl = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return sl; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/imagelib/zh-CN.js b/dist/extensions/ext-locale/imagelib/zh-CN.js index 0ff164a9..b67094cb 100644 --- a/dist/extensions/ext-locale/imagelib/zh-CN.js +++ b/dist/extensions/ext-locale/imagelib/zh-CN.js @@ -1,20 +1,21 @@ -var svgEditorExtensionLocale_imagelib_zh_CN = (function () { - 'use strict'; - - var zhCN = { - select_lib: 'Select an image library', - show_list: 'Show library list', - import_single: 'Import single', - import_multi: 'Import multiple', - open: 'Open as new document', - buttons: [{ +export default { + select_lib: 'Select an image library', + show_list: 'Show library list', + import_single: 'Import single', + import_multi: 'Import multiple', + open: 'Open as new document', + buttons: [ + { title: '图像库' - }], - imgLibs: [{ + } + ], + imgLibs: [ + { name: 'Demo library (local)', url: '{path}imagelib/index{modularVersion}.html', description: 'Demonstration library for SVG-edit on this server' - }, { + }, + { name: 'IAN Symbol Libraries', url: 'https://ian.umces.edu/symbols/catalog/svgedit/album_chooser.php?svgedit=3', description: 'Free library of illustrations' @@ -28,9 +29,5 @@ var svgEditorExtensionLocale_imagelib_zh_CN = (function () { description: 'Share and Use Images. Over 100,000 Public Domain SVG Images and Growing.' } */ - ] - }; - - return zhCN; - -}()); + ] +}; diff --git a/dist/extensions/ext-locale/markers/en.js b/dist/extensions/ext-locale/markers/en.js index 7012a622..69201e4d 100644 --- a/dist/extensions/ext-locale/markers/en.js +++ b/dist/extensions/ext-locale/markers/en.js @@ -1,81 +1,46 @@ -var svgEditorExtensionLocale_markers_en = (function () { - 'use strict'; - - var en = { - name: 'Markers', - langList: [{ - id: 'nomarker', - title: 'No Marker' - }, { - id: 'leftarrow', - title: 'Left Arrow' - }, { - id: 'rightarrow', - title: 'Right Arrow' - }, { - id: 'textmarker', - title: 'Text Marker' - }, { - id: 'forwardslash', - title: 'Forward Slash' - }, { - id: 'reverseslash', - title: 'Reverse Slash' - }, { - id: 'verticalslash', - title: 'Vertical Slash' - }, { - id: 'box', - title: 'Box' - }, { - id: 'star', - title: 'Star' - }, { - id: 'xmark', - title: 'X' - }, { - id: 'triangle', - title: 'Triangle' - }, { - id: 'mcircle', - title: 'Circle' - }, { - id: 'leftarrow_o', - title: 'Open Left Arrow' - }, { - id: 'rightarrow_o', - title: 'Open Right Arrow' - }, { - id: 'box_o', - title: 'Open Box' - }, { - id: 'star_o', - title: 'Open Star' - }, { - id: 'triangle_o', - title: 'Open Triangle' - }, { - id: 'mcircle_o', - title: 'Open Circle' - }], - contextTools: [{ +export default { + name: 'Markers', + langList: [ + {id: 'nomarker', title: 'No Marker'}, + {id: 'leftarrow', title: 'Left Arrow'}, + {id: 'rightarrow', title: 'Right Arrow'}, + {id: 'textmarker', title: 'Text Marker'}, + {id: 'forwardslash', title: 'Forward Slash'}, + {id: 'reverseslash', title: 'Reverse Slash'}, + {id: 'verticalslash', title: 'Vertical Slash'}, + {id: 'box', title: 'Box'}, + {id: 'star', title: 'Star'}, + {id: 'xmark', title: 'X'}, + {id: 'triangle', title: 'Triangle'}, + {id: 'mcircle', title: 'Circle'}, + {id: 'leftarrow_o', title: 'Open Left Arrow'}, + {id: 'rightarrow_o', title: 'Open Right Arrow'}, + {id: 'box_o', title: 'Open Box'}, + {id: 'star_o', title: 'Open Star'}, + {id: 'triangle_o', title: 'Open Triangle'}, + {id: 'mcircle_o', title: 'Open Circle'} + ], + contextTools: [ + { title: 'Start marker', label: 's' - }, { + }, + { title: 'Select start marker type' - }, { + }, + { title: 'Middle marker', label: 'm' - }, { + }, + { title: 'Select mid marker type' - }, { + }, + { title: 'End marker', label: 'e' - }, { + }, + { title: 'Select end marker type' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/markers/zh-CN.js b/dist/extensions/ext-locale/markers/zh-CN.js old mode 100644 new mode 100755 index 3f86f2f1..1efe8a0a --- a/dist/extensions/ext-locale/markers/zh-CN.js +++ b/dist/extensions/ext-locale/markers/zh-CN.js @@ -1,81 +1,46 @@ -var svgEditorExtensionLocale_markers_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '标记', - langList: [{ - id: 'nomarker', - title: '无标记' - }, { - id: 'leftarrow', - title: '左箭头' - }, { - id: 'rightarrow', - title: '右箭头' - }, { - id: 'textmarker', - title: '文本' - }, { - id: 'forwardslash', - title: '斜杠' - }, { - id: 'reverseslash', - title: '反斜杠' - }, { - id: 'verticalslash', - title: '垂直线' - }, { - id: 'box', - title: '方块' - }, { - id: 'star', - title: '星形' - }, { - id: 'xmark', - title: 'X' - }, { - id: 'triangle', - title: '三角形' - }, { - id: 'mcircle', - title: '圆形' - }, { - id: 'leftarrow_o', - title: '左箭头(空心)' - }, { - id: 'rightarrow_o', - title: '右箭头(空心)' - }, { - id: 'box_o', - title: '方块(空心)' - }, { - id: 'star_o', - title: '星形(空心)' - }, { - id: 'triangle_o', - title: '三角形(空心)' - }, { - id: 'mcircle_o', - title: '圆形(空心)' - }], - contextTools: [{ +export default { + name: '标记', + langList: [ + {id: 'nomarker', title: '无标记'}, + {id: 'leftarrow', title: '左箭头'}, + {id: 'rightarrow', title: '右箭头'}, + {id: 'textmarker', title: '文本'}, + {id: 'forwardslash', title: '斜杠'}, + {id: 'reverseslash', title: '反斜杠'}, + {id: 'verticalslash', title: '垂直线'}, + {id: 'box', title: '方块'}, + {id: 'star', title: '星形'}, + {id: 'xmark', title: 'X'}, + {id: 'triangle', title: '三角形'}, + {id: 'mcircle', title: '圆形'}, + {id: 'leftarrow_o', title: '左箭头(空心)'}, + {id: 'rightarrow_o', title: '右箭头(空心)'}, + {id: 'box_o', title: '方块(空心)'}, + {id: 'star_o', title: '星形(空心)'}, + {id: 'triangle_o', title: '三角形(空心)'}, + {id: 'mcircle_o', title: '圆形(空心)'} + ], + contextTools: [ + { title: '起始标记', label: 's' - }, { + }, + { title: '选择起始标记类型' - }, { + }, + { title: '中段标记', label: 'm' - }, { + }, + { title: '选择中段标记类型' - }, { + }, + { title: '末端标记', label: 'e' - }, { + }, + { title: '选择末端标记类型' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/mathjax/en.js b/dist/extensions/ext-locale/mathjax/en.js index 5cb58851..916899ca 100644 --- a/dist/extensions/ext-locale/mathjax/en.js +++ b/dist/extensions/ext-locale/mathjax/en.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_mathjax_en = (function () { - 'use strict'; - - var en = { - name: 'MathJax', - buttons: [{ +export default { + name: 'MathJax', + buttons: [ + { title: 'Add Mathematics' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/mathjax/zh-CN.js b/dist/extensions/ext-locale/mathjax/zh-CN.js old mode 100644 new mode 100755 index 372d3710..0abe8529 --- a/dist/extensions/ext-locale/mathjax/zh-CN.js +++ b/dist/extensions/ext-locale/mathjax/zh-CN.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_mathjax_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '数学', - buttons: [{ +export default { + name: '数学', + buttons: [ + { title: '添加数学计算' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/panning/en.js b/dist/extensions/ext-locale/panning/en.js index 4feb49c6..5bd26b8b 100644 --- a/dist/extensions/ext-locale/panning/en.js +++ b/dist/extensions/ext-locale/panning/en.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_panning_en = (function () { - 'use strict'; - - var en = { - name: 'Extension Panning', - buttons: [{ +export default { + name: 'Extension Panning', + buttons: [ + { title: 'Panning' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/panning/zh-CN.js b/dist/extensions/ext-locale/panning/zh-CN.js old mode 100644 new mode 100755 index dcc266c5..a6264077 --- a/dist/extensions/ext-locale/panning/zh-CN.js +++ b/dist/extensions/ext-locale/panning/zh-CN.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_panning_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '移动', - buttons: [{ +export default { + name: '移动', + buttons: [ + { title: '移动' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/placemark/en.js b/dist/extensions/ext-locale/placemark/en.js index 23af187f..24e53af6 100644 --- a/dist/extensions/ext-locale/placemark/en.js +++ b/dist/extensions/ext-locale/placemark/en.js @@ -1,74 +1,40 @@ -var svgEditorExtensionLocale_placemark_en = (function () { - 'use strict'; - - var en = { - name: 'placemark', - langList: [{ - id: 'nomarker', - title: 'No Marker' - }, { - id: 'leftarrow', - title: 'Left Arrow' - }, { - id: 'rightarrow', - title: 'Right Arrow' - }, { - id: 'forwardslash', - title: 'Forward Slash' - }, { - id: 'reverseslash', - title: 'Reverse Slash' - }, { - id: 'verticalslash', - title: 'Vertical Slash' - }, { - id: 'box', - title: 'Box' - }, { - id: 'star', - title: 'Star' - }, { - id: 'xmark', - title: 'X' - }, { - id: 'triangle', - title: 'Triangle' - }, { - id: 'mcircle', - title: 'Circle' - }, { - id: 'leftarrow_o', - title: 'Open Left Arrow' - }, { - id: 'rightarrow_o', - title: 'Open Right Arrow' - }, { - id: 'box_o', - title: 'Open Box' - }, { - id: 'star_o', - title: 'Open Star' - }, { - id: 'triangle_o', - title: 'Open Triangle' - }, { - id: 'mcircle_o', - title: 'Open Circle' - }], - buttons: [{ +export default { + name: 'placemark', + langList: [ + {id: 'nomarker', title: 'No Marker'}, + {id: 'leftarrow', title: 'Left Arrow'}, + {id: 'rightarrow', title: 'Right Arrow'}, + {id: 'forwardslash', title: 'Forward Slash'}, + {id: 'reverseslash', title: 'Reverse Slash'}, + {id: 'verticalslash', title: 'Vertical Slash'}, + {id: 'box', title: 'Box'}, + {id: 'star', title: 'Star'}, + {id: 'xmark', title: 'X'}, + {id: 'triangle', title: 'Triangle'}, + {id: 'mcircle', title: 'Circle'}, + {id: 'leftarrow_o', title: 'Open Left Arrow'}, + {id: 'rightarrow_o', title: 'Open Right Arrow'}, + {id: 'box_o', title: 'Open Box'}, + {id: 'star_o', title: 'Open Star'}, + {id: 'triangle_o', title: 'Open Triangle'}, + {id: 'mcircle_o', title: 'Open Circle'} + ], + buttons: [ + { title: 'Placemark Tool' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: 'Select Place marker type' - }, { + }, + { title: 'Text on separated with ; ', label: 'Text' - }, { + }, + { title: 'Font for text', label: '' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/polygon/en.js b/dist/extensions/ext-locale/polygon/en.js index f88b0648..ddca9727 100644 --- a/dist/extensions/ext-locale/polygon/en.js +++ b/dist/extensions/ext-locale/polygon/en.js @@ -1,17 +1,14 @@ -var svgEditorExtensionLocale_polygon_en = (function () { - 'use strict'; - - var en = { - name: 'polygon', - buttons: [{ +export default { + name: 'polygon', + buttons: [ + { title: 'Polygon Tool' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: 'Number of Sides', label: 'sides' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/polygon/zh-CN.js b/dist/extensions/ext-locale/polygon/zh-CN.js old mode 100644 new mode 100755 index 2afc4ec9..6bfcc476 --- a/dist/extensions/ext-locale/polygon/zh-CN.js +++ b/dist/extensions/ext-locale/polygon/zh-CN.js @@ -1,17 +1,14 @@ -var svgEditorExtensionLocale_polygon_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '多边形', - buttons: [{ +export default { + name: '多边形', + buttons: [ + { title: '多边形工具' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: '边数', label: '边数' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/server_moinsave/en.js b/dist/extensions/ext-locale/server_moinsave/en.js index 13917b6c..7b7b4442 100644 --- a/dist/extensions/ext-locale/server_moinsave/en.js +++ b/dist/extensions/ext-locale/server_moinsave/en.js @@ -1,11 +1,4 @@ -var svgEditorExtensionLocale_server_moinsave_en = (function () { - 'use strict'; - - var en = { - saved: 'Saved! Return to Item View!', - hiddenframe: 'Moinsave frame to store hidden values' - }; - - return en; - -}()); +export default { + saved: 'Saved! Return to Item View!', + hiddenframe: 'Moinsave frame to store hidden values' +}; diff --git a/dist/extensions/ext-locale/server_moinsave/zh-CN.js b/dist/extensions/ext-locale/server_moinsave/zh-CN.js old mode 100644 new mode 100755 index 55909202..bdf4e720 --- a/dist/extensions/ext-locale/server_moinsave/zh-CN.js +++ b/dist/extensions/ext-locale/server_moinsave/zh-CN.js @@ -1,11 +1,4 @@ -var svgEditorExtensionLocale_server_moinsave_zh_CN = (function () { - 'use strict'; - - var zhCN = { - saved: '已保存! 返回视图!', - hiddenframe: 'Moinsave frame to store hidden values' - }; - - return zhCN; - -}()); +export default { + saved: '已保存! 返回视图!', + hiddenframe: 'Moinsave frame to store hidden values' +}; diff --git a/dist/extensions/ext-locale/server_opensave/en.js b/dist/extensions/ext-locale/server_opensave/en.js index 25dd0784..db251eb6 100644 --- a/dist/extensions/ext-locale/server_opensave/en.js +++ b/dist/extensions/ext-locale/server_opensave/en.js @@ -1,11 +1,4 @@ -var svgEditorExtensionLocale_server_opensave_en = (function () { - 'use strict'; - - var en = { - uploading: 'Uploading...', - hiddenframe: 'Opensave frame to store hidden values' - }; - - return en; - -}()); +export default { + uploading: 'Uploading...', + hiddenframe: 'Opensave frame to store hidden values' +}; diff --git a/dist/extensions/ext-locale/server_opensave/zh-CN.js b/dist/extensions/ext-locale/server_opensave/zh-CN.js old mode 100644 new mode 100755 index a9f8e35c..17d9b755 --- a/dist/extensions/ext-locale/server_opensave/zh-CN.js +++ b/dist/extensions/ext-locale/server_opensave/zh-CN.js @@ -1,11 +1,4 @@ -var svgEditorExtensionLocale_server_opensave_zh_CN = (function () { - 'use strict'; - - var zhCN = { - uploading: '正在上传...', - hiddenframe: 'Opensave frame to store hidden values' - }; - - return zhCN; - -}()); +export default { + uploading: '正在上传...', + hiddenframe: 'Opensave frame to store hidden values' +}; diff --git a/dist/extensions/ext-locale/shapes/en.js b/dist/extensions/ext-locale/shapes/en.js index 96b379a6..83a67ccf 100644 --- a/dist/extensions/ext-locale/shapes/en.js +++ b/dist/extensions/ext-locale/shapes/en.js @@ -1,29 +1,24 @@ -var svgEditorExtensionLocale_shapes_en = (function () { - 'use strict'; - - var en = { - loading: 'Loading...', - categories: { - basic: 'Basic', - object: 'Objects', - symbol: 'Symbols', - arrow: 'Arrows', - flowchart: 'Flowchart', - animal: 'Animals', - game: 'Cards & Chess', - dialog_balloon: 'Dialog balloons', - electronics: 'Electronics', - math: 'Mathematical', - music: 'Music', - misc: 'Miscellaneous', - raphael_1: 'raphaeljs.com set 1', - raphael_2: 'raphaeljs.com set 2' - }, - buttons: [{ +export default { + loading: 'Loading...', + categories: { + basic: 'Basic', + object: 'Objects', + symbol: 'Symbols', + arrow: 'Arrows', + flowchart: 'Flowchart', + animal: 'Animals', + game: 'Cards & Chess', + dialog_balloon: 'Dialog balloons', + electronics: 'Electronics', + math: 'Mathematical', + music: 'Music', + misc: 'Miscellaneous', + raphael_1: 'raphaeljs.com set 1', + raphael_2: 'raphaeljs.com set 2' + }, + buttons: [ + { title: 'Shape library' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/shapes/fr.js b/dist/extensions/ext-locale/shapes/fr.js index 72dae219..4b46c391 100644 --- a/dist/extensions/ext-locale/shapes/fr.js +++ b/dist/extensions/ext-locale/shapes/fr.js @@ -1,29 +1,24 @@ -var svgEditorExtensionLocale_shapes_fr = (function () { - 'use strict'; - - var fr = { - loading: 'Loading...', - categories: { - basic: 'Basic', - object: 'Objects', - symbol: 'Symbols', - arrow: 'Arrows', - flowchart: 'Flowchart', - animal: 'Animals', - game: 'Cards & Chess', - dialog_balloon: 'Dialog balloons', - electronics: 'Electronics', - math: 'Mathematical', - music: 'Music', - misc: 'Miscellaneous', - raphael_1: 'raphaeljs.com set 1', - raphael_2: 'raphaeljs.com set 2' - }, - buttons: [{ +export default { + loading: 'Loading...', + categories: { + basic: 'Basic', + object: 'Objects', + symbol: 'Symbols', + arrow: 'Arrows', + flowchart: 'Flowchart', + animal: 'Animals', + game: 'Cards & Chess', + dialog_balloon: 'Dialog balloons', + electronics: 'Electronics', + math: 'Mathematical', + music: 'Music', + misc: 'Miscellaneous', + raphael_1: 'raphaeljs.com set 1', + raphael_2: 'raphaeljs.com set 2' + }, + buttons: [ + { title: "Bibliothèque d'images" - }] - }; - - return fr; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/shapes/zh-CN.js b/dist/extensions/ext-locale/shapes/zh-CN.js old mode 100644 new mode 100755 index 215ab2c6..4b76d7a4 --- a/dist/extensions/ext-locale/shapes/zh-CN.js +++ b/dist/extensions/ext-locale/shapes/zh-CN.js @@ -1,29 +1,24 @@ -var svgEditorExtensionLocale_shapes_zh_CN = (function () { - 'use strict'; - - var zhCN = { - loading: '正在加载...', - categories: { - basic: '基本', - object: '对象', - symbol: '符号', - arrow: '箭头', - flowchart: '工作流', - animal: '动物', - game: '棋牌', - dialog_balloon: '会话框', - electronics: '电子', - math: '数学', - music: '音乐', - misc: '其他', - raphael_1: 'raphaeljs.com 集合 1', - raphael_2: 'raphaeljs.com 集合 2' - }, - buttons: [{ +export default { + loading: '正在加载...', + categories: { + basic: '基本', + object: '对象', + symbol: '符号', + arrow: '箭头', + flowchart: '工作流', + animal: '动物', + game: '棋牌', + dialog_balloon: '会话框', + electronics: '电子', + math: '数学', + music: '音乐', + misc: '其他', + raphael_1: 'raphaeljs.com 集合 1', + raphael_2: 'raphaeljs.com 集合 2' + }, + buttons: [ + { title: '图元库' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/star/en.js b/dist/extensions/ext-locale/star/en.js index abf7d96d..da9d857c 100644 --- a/dist/extensions/ext-locale/star/en.js +++ b/dist/extensions/ext-locale/star/en.js @@ -1,23 +1,22 @@ -var svgEditorExtensionLocale_star_en = (function () { - 'use strict'; - - var en = { - name: 'star', - buttons: [{ +export default { + name: 'star', + buttons: [ + { title: 'Star Tool' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: 'Number of Sides', label: 'points' - }, { + }, + { title: 'Pointiness', label: 'Pointiness' - }, { + }, + { title: 'Twists the star', label: 'Radial Shift' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/star/zh-CN.js b/dist/extensions/ext-locale/star/zh-CN.js old mode 100644 new mode 100755 index cda4d8a2..d9ee06da --- a/dist/extensions/ext-locale/star/zh-CN.js +++ b/dist/extensions/ext-locale/star/zh-CN.js @@ -1,23 +1,22 @@ -var svgEditorExtensionLocale_star_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: '星形', - buttons: [{ +export default { + name: '星形', + buttons: [ + { title: '星形工具' - }], - contextTools: [{ + } + ], + contextTools: [ + { title: '顶点', label: '顶点' - }, { + }, + { title: '钝度', label: '钝度' - }, { + }, + { title: '径向', label: '径向' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/storage/de.js b/dist/extensions/ext-locale/storage/de.js index 3ffd3e6d..d3160369 100644 --- a/dist/extensions/ext-locale/storage/de.js +++ b/dist/extensions/ext-locale/storage/de.js @@ -1,17 +1,14 @@ -var svgEditorExtensionLocale_storage_de = (function () { - 'use strict'; - - var de = { - message: 'Standardmäßig kann SVG-Edit Ihre Editor-Einstellungen ' + 'und die SVG-Inhalte lokal auf Ihrem Gerät abspeichern. So brauchen Sie ' + 'nicht jedes Mal die SVG neu laden. Falls Sie aus Datenschutzgründen ' + 'dies nicht wollen, ' + 'können Sie die Standardeinstellung im Folgenden ändern.', - storagePrefsAndContent: 'Store preferences and SVG content locally', - storagePrefsOnly: 'Only store preferences locally', - storagePrefs: 'Store preferences locally', - storageNoPrefsOrContent: 'Do not store my preferences or SVG content locally', - storageNoPrefs: 'Do not store my preferences locally', - rememberLabel: 'Remember this choice?', - rememberTooltip: 'If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again.' - }; - - return de; - -}()); +export default { + message: 'Standardmäßig kann SVG-Edit Ihre Editor-Einstellungen ' + + 'und die SVG-Inhalte lokal auf Ihrem Gerät abspeichern. So brauchen Sie ' + + 'nicht jedes Mal die SVG neu laden. Falls Sie aus Datenschutzgründen ' + + 'dies nicht wollen, ' + + 'können Sie die Standardeinstellung im Folgenden ändern.', + storagePrefsAndContent: 'Store preferences and SVG content locally', + storagePrefsOnly: 'Only store preferences locally', + storagePrefs: 'Store preferences locally', + storageNoPrefsOrContent: 'Do not store my preferences or SVG content locally', + storageNoPrefs: 'Do not store my preferences locally', + rememberLabel: 'Remember this choice?', + rememberTooltip: 'If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again.' +}; diff --git a/dist/extensions/ext-locale/storage/en.js b/dist/extensions/ext-locale/storage/en.js index 415458f1..568e0b9f 100644 --- a/dist/extensions/ext-locale/storage/en.js +++ b/dist/extensions/ext-locale/storage/en.js @@ -1,17 +1,14 @@ -var svgEditorExtensionLocale_storage_en = (function () { - 'use strict'; - - var en = { - message: 'By default and where supported, SVG-Edit can store your editor ' + 'preferences and SVG content locally on your machine so you do not ' + 'need to add these back each time you load SVG-Edit. If, for privacy ' + 'reasons, you do not wish to store this information on your machine, ' + 'you can change away from the default option below.', - storagePrefsAndContent: 'Store preferences and SVG content locally', - storagePrefsOnly: 'Only store preferences locally', - storagePrefs: 'Store preferences locally', - storageNoPrefsOrContent: 'Do not store my preferences or SVG content locally', - storageNoPrefs: 'Do not store my preferences locally', - rememberLabel: 'Remember this choice?', - rememberTooltip: 'If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again.' - }; - - return en; - -}()); +export default { + message: 'By default and where supported, SVG-Edit can store your editor ' + + 'preferences and SVG content locally on your machine so you do not ' + + 'need to add these back each time you load SVG-Edit. If, for privacy ' + + 'reasons, you do not wish to store this information on your machine, ' + + 'you can change away from the default option below.', + storagePrefsAndContent: 'Store preferences and SVG content locally', + storagePrefsOnly: 'Only store preferences locally', + storagePrefs: 'Store preferences locally', + storageNoPrefsOrContent: 'Do not store my preferences or SVG content locally', + storageNoPrefs: 'Do not store my preferences locally', + rememberLabel: 'Remember this choice?', + rememberTooltip: 'If you choose to opt out of storage while remembering this choice, the URL will change so as to avoid asking again.' +}; diff --git a/dist/extensions/ext-locale/storage/fr.js b/dist/extensions/ext-locale/storage/fr.js index c17b761a..9c454dbb 100644 --- a/dist/extensions/ext-locale/storage/fr.js +++ b/dist/extensions/ext-locale/storage/fr.js @@ -1,17 +1,14 @@ -var svgEditorExtensionLocale_storage_fr = (function () { - 'use strict'; - - var fr = { - message: "Par défaut et si supporté, SVG-Edit peut stocker les préférences de l'éditeur " + "et le contenu SVG localement sur votre machine de sorte que vous n'ayez pas besoin de les " + 'rajouter chaque fois que vous chargez SVG-Edit. Si, pour des raisons de confidentialité, ' + 'vous ne souhaitez pas stocker ces données sur votre machine, vous pouvez changer ce ' + 'comportement ci-dessous.', - storagePrefsAndContent: 'Store preferences and SVG content locally', - storagePrefsOnly: 'Only store preferences locally', - storagePrefs: 'Store preferences locally', - storageNoPrefsOrContent: 'Do not store my preferences or SVG content locally', - storageNoPrefs: 'Do not store my preferences locally', - rememberLabel: 'Remember this choice?', - rememberTooltip: "Si vous choisissez de désactiver le stockage en mémorisant le choix, l'URL va changer afin que la question ne vous soit plus reposée." - }; - - return fr; - -}()); +export default { + message: "Par défaut et si supporté, SVG-Edit peut stocker les préférences de l'éditeur " + + "et le contenu SVG localement sur votre machine de sorte que vous n'ayez pas besoin de les " + + 'rajouter chaque fois que vous chargez SVG-Edit. Si, pour des raisons de confidentialité, ' + + 'vous ne souhaitez pas stocker ces données sur votre machine, vous pouvez changer ce ' + + 'comportement ci-dessous.', + storagePrefsAndContent: 'Store preferences and SVG content locally', + storagePrefsOnly: 'Only store preferences locally', + storagePrefs: 'Store preferences locally', + storageNoPrefsOrContent: 'Do not store my preferences or SVG content locally', + storageNoPrefs: 'Do not store my preferences locally', + rememberLabel: 'Remember this choice?', + rememberTooltip: "Si vous choisissez de désactiver le stockage en mémorisant le choix, l'URL va changer afin que la question ne vous soit plus reposée." +}; diff --git a/dist/extensions/ext-locale/storage/zh-CN.js b/dist/extensions/ext-locale/storage/zh-CN.js old mode 100644 new mode 100755 index b5c12eb2..1de1f9dc --- a/dist/extensions/ext-locale/storage/zh-CN.js +++ b/dist/extensions/ext-locale/storage/zh-CN.js @@ -1,17 +1,11 @@ -var svgEditorExtensionLocale_storage_zh_CN = (function () { - 'use strict'; - - var zhCN = { - message: '默认情况下, SVG-Edit 在本地保存配置参数和画布内容. 如果基于隐私考虑, ' + '您可以勾选以下选项修改配置.', - storagePrefsAndContent: '本地存储配置参数和SVG图', - storagePrefsOnly: '本地只存储配置参数', - storagePrefs: '本地存储配置参数', - storageNoPrefsOrContent: '本地不保存配置参数和SVG图', - storageNoPrefs: '本地不保存配置参数', - rememberLabel: '记住选择?', - rememberTooltip: '如果您勾选记住选择,将不再弹出本窗口.' - }; - - return zhCN; - -}()); +export default { + message: '默认情况下, SVG-Edit 在本地保存配置参数和画布内容. 如果基于隐私考虑, ' + + '您可以勾选以下选项修改配置.', + storagePrefsAndContent: '本地存储配置参数和SVG图', + storagePrefsOnly: '本地只存储配置参数', + storagePrefs: '本地存储配置参数', + storageNoPrefsOrContent: '本地不保存配置参数和SVG图', + storageNoPrefs: '本地不保存配置参数', + rememberLabel: '记住选择?', + rememberTooltip: '如果您勾选记住选择,将不再弹出本窗口.' +}; diff --git a/dist/extensions/ext-locale/webappfind/en.js b/dist/extensions/ext-locale/webappfind/en.js index 33f212e8..92be802c 100644 --- a/dist/extensions/ext-locale/webappfind/en.js +++ b/dist/extensions/ext-locale/webappfind/en.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_webappfind_en = (function () { - 'use strict'; - - var en = { - name: 'WebAppFind', - buttons: [{ +export default { + name: 'WebAppFind', + buttons: [ + { title: 'Save Image back to Disk' - }] - }; - - return en; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-locale/webappfind/zh-CN.js b/dist/extensions/ext-locale/webappfind/zh-CN.js old mode 100644 new mode 100755 index bb8fd461..0831c4b0 --- a/dist/extensions/ext-locale/webappfind/zh-CN.js +++ b/dist/extensions/ext-locale/webappfind/zh-CN.js @@ -1,13 +1,8 @@ -var svgEditorExtensionLocale_webappfind_zh_CN = (function () { - 'use strict'; - - var zhCN = { - name: 'WebAppFind', - buttons: [{ +export default { + name: 'WebAppFind', + buttons: [ + { title: '保存图片到磁盘' - }] - }; - - return zhCN; - -}()); + } + ] +}; diff --git a/dist/extensions/ext-markers.js b/dist/extensions/ext-markers.js index 203ebc21..ec8628e7 100644 --- a/dist/extensions/ext-markers.js +++ b/dist/extensions/ext-markers.js @@ -1,763 +1,605 @@ -var svgEditorExtension_markers = (function () { - 'use strict'; +/** + * @file ext-markers.js + * + * @license Apache-2.0 + * + * @copyright 2010 Will Schleter based on ext-arrows.js by Copyright(c) 2010 Alexis Deveria + * + * This extension provides for the addition of markers to the either end + * or the middle of a line, polyline, path, polygon. + * + * Markers may be either a graphic or arbitary text + * + * to simplify the coding and make the implementation as robust as possible, + * markers are not shared - every object has its own set of markers. + * this relationship is maintained by a naming convention between the + * ids of the markers and the ids of the object + * + * The following restrictions exist for simplicty of use and programming + * objects and their markers to have the same color + * marker size is fixed + * text marker font, size, and attributes are fixed + * an application specific attribute - se_type - is added to each marker element + * to store the type of marker + * + * @todo + * remove some of the restrictions above + * add option for keeping text aligned to horizontal + * add support for dimension extension lines + * +*/ +export default { + name: 'markers', + async init (S) { + const strings = await S.importLocale(); + const svgEditor = this; + const {$} = S; + const svgCanvas = svgEditor.canvas; + const // {svgcontent} = S, + addElem = svgCanvas.addSVGElementFromJson; + const mtypes = ['start', 'mid', 'end']; + const markerPrefix = 'se_marker_'; + const idPrefix = 'mkr_'; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); + // note - to add additional marker types add them below with a unique id + // and add the associated icon(s) to marker-icons.svg + // the geometry is normalized to a 100x100 box with the origin at lower left + // Safari did not like negative values for low left of viewBox + // remember that the coordinate system has +y downward + const markerTypes = { + nomarker: {}, + leftarrow: + {element: 'path', attr: {d: 'M0,50 L100,90 L70,50 L100,10 Z'}}, + rightarrow: + {element: 'path', attr: {d: 'M100,50 L0,90 L30,50 L0,10 Z'}}, + textmarker: + {element: 'text', attr: { + x: 0, y: 0, 'stroke-width': 0, stroke: 'none', + 'font-size': 75, 'font-family': 'serif', 'text-anchor': 'left', + 'xml:space': 'preserve' + }}, + forwardslash: + {element: 'path', attr: {d: 'M30,100 L70,0'}}, + reverseslash: + {element: 'path', attr: {d: 'M30,0 L70,100'}}, + verticalslash: + {element: 'path', attr: {d: 'M50,0 L50,100'}}, + box: + {element: 'path', attr: {d: 'M20,20 L20,80 L80,80 L80,20 Z'}}, + star: + {element: 'path', attr: {d: 'M10,30 L90,30 L20,90 L50,10 L80,90 Z'}}, + xmark: + {element: 'path', attr: {d: 'M20,80 L80,20 M80,80 L20,20'}}, + triangle: + {element: 'path', attr: {d: 'M10,80 L50,20 L80,80 Z'}}, + mcircle: + {element: 'circle', attr: {r: 30, cx: 50, cy: 50}} }; - } - /** - * @file ext-markers.js - * - * @license Apache-2.0 - * - * @copyright 2010 Will Schleter based on ext-arrows.js by Copyright(c) 2010 Alexis Deveria - * - * This extension provides for the addition of markers to the either end - * or the middle of a line, polyline, path, polygon. - * - * Markers may be either a graphic or arbitary text - * - * to simplify the coding and make the implementation as robust as possible, - * markers are not shared - every object has its own set of markers. - * this relationship is maintained by a naming convention between the - * ids of the markers and the ids of the object - * - * The following restrictions exist for simplicty of use and programming - * objects and their markers to have the same color - * marker size is fixed - * text marker font, size, and attributes are fixed - * an application specific attribute - se_type - is added to each marker element - * to store the type of marker - * - * @todo - * remove some of the restrictions above - * add option for keeping text aligned to horizontal - * add support for dimension extension lines - * - */ - var extMarkers = { - name: 'markers', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() { - var strings, svgEditor, $, svgCanvas, addElem, mtypes, markerPrefix, idPrefix, markerTypes, getLinked, setIcon, selElems, showPanel, addMarker, convertline, setMarker, colorChanged, updateReferences, triggerTextEntry, showTextPrompt, _showTextPrompt, setArrowFromButton, _setArrowFromButton, getTitle, buildButtonList, contextTools; - - return regeneratorRuntime.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - buildButtonList = function _buildButtonList() { - var buttons = []; // const i = 0; - - /* - buttons.push({ - id: idPrefix + 'markers_off', - title: 'Turn off all markers', - type: 'context', - events: { click: setMarkerSet }, - panel: 'marker_panel' - }); - buttons.push({ - id: idPrefix + 'markers_dimension', - title: 'Dimension', - type: 'context', - events: { click: setMarkerSet }, - panel: 'marker_panel' - }); - buttons.push({ - id: idPrefix + 'markers_label', - title: 'Label', - type: 'context', - events: { click: setMarkerSet }, - panel: 'marker_panel' - }); - */ - - $.each(mtypes, function (k, pos) { - var listname = pos + '_marker_list'; - var def = true; - Object.keys(markerTypes).forEach(function (id) { - var title = getTitle(String(id)); - buttons.push({ - id: idPrefix + pos + '_' + id, - svgicon: id, - icon: svgEditor.curConfig.extIconsPath + 'markers-' + id + '.png', - title: title, - type: 'context', - events: { - click: setArrowFromButton - }, - panel: 'marker_panel', - list: listname, - isDefault: def - }); - def = false; - }); - }); - return buttons; - }; - - getTitle = function _getTitle(id) { - var langList = strings.langList; - var item = langList.find(function (itm) { - return itm.id === id; - }); - return item ? item.title : id; - }; - - _setArrowFromButton = function _setArrowFromButton3() { - _setArrowFromButton = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(ev) { - var parts, pos, val; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - parts = this.id.split('_'); - pos = parts[1]; - val = parts[2]; - - if (parts[3]) { - val += '_' + parts[3]; - } - - if (!(val !== 'textmarker')) { - _context2.next = 8; - break; - } - - triggerTextEntry(pos, '\\' + val); - _context2.next = 10; - break; - - case 8: - _context2.next = 10; - return showTextPrompt(pos); - - case 10: - case "end": - return _context2.stop(); - } - } - }, _callee2, this); - })); - return _setArrowFromButton.apply(this, arguments); - }; - - setArrowFromButton = function _setArrowFromButton2(_x2) { - return _setArrowFromButton.apply(this, arguments); - }; - - _showTextPrompt = function _showTextPrompt3() { - _showTextPrompt = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(pos) { - var def, txt; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - def = $('#' + pos + '_marker').val(); - - if (def.substr(0, 1) === '\\') { - def = ''; - } - - _context.next = 4; - return $.prompt('Enter text for ' + pos + ' marker', def); - - case 4: - txt = _context.sent; - - if (txt) { - triggerTextEntry(pos, txt); - } - - case 6: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - return _showTextPrompt.apply(this, arguments); - }; - - showTextPrompt = function _showTextPrompt2(_x) { - return _showTextPrompt.apply(this, arguments); - }; - - triggerTextEntry = function _triggerTextEntry(pos, val) { - $('#' + pos + '_marker').val(val); - $('#' + pos + '_marker').change(); // const txtbox = $('#'+pos+'_marker'); - // if (val.substr(0,1)=='\\') {txtbox.hide();} - // else {txtbox.show();} - }; - - updateReferences = function _updateReferences(el) { - $.each(mtypes, function (i, pos) { - var id = markerPrefix + pos + '_' + el.id; - var markerName = 'marker-' + pos; - var marker = getLinked(el, markerName); - - if (!marker || !marker.attributes.se_type) { - return; - } // not created by this extension - - - var url = el.getAttribute(markerName); - - if (url) { - var len = el.id.length; - var linkid = url.substr(-len - 1, len); - - if (el.id !== linkid) { - var val = $('#' + pos + '_marker').attr('value'); - addMarker(id, val); - svgCanvas.changeSelectedAttribute(markerName, 'url(#' + id + ')'); - - if (el.tagName === 'line' && pos === 'mid') { - el = convertline(el); - } - - svgCanvas.call('changed', selElems); - } - } - }); - }; - - colorChanged = function _colorChanged(elem) { - var color = elem.getAttribute('stroke'); - $.each(mtypes, function (i, pos) { - var marker = getLinked(elem, 'marker-' + pos); - - if (!marker) { - return; - } - - if (!marker.attributes.se_type) { - return; - } // not created by this extension - - - var ch = marker.lastElementChild; - - if (!ch) { - return; - } - - var curfill = ch.getAttribute('fill'); - var curstroke = ch.getAttribute('stroke'); - - if (curfill && curfill !== 'none') { - ch.setAttribute('fill', color); - } - - if (curstroke && curstroke !== 'none') { - ch.setAttribute('stroke', color); - } - }); - }; - - setMarker = function _setMarker() { - var poslist = { - start_marker: 'start', - mid_marker: 'mid', - end_marker: 'end' - }; - var pos = poslist[this.id]; - var markerName = 'marker-' + pos; - var el = selElems[0]; - var marker = getLinked(el, markerName); - - if (marker) { - $(marker).remove(); - } - - el.removeAttribute(markerName); - var val = this.value; - - if (val === '') { - val = '\\nomarker'; - } - - if (val === '\\nomarker') { - setIcon(pos, val); - svgCanvas.call('changed', selElems); - return; - } // Set marker on element - - - var id = markerPrefix + pos + '_' + el.id; - addMarker(id, val); - svgCanvas.changeSelectedAttribute(markerName, 'url(#' + id + ')'); - - if (el.tagName === 'line' && pos === 'mid') { - convertline(el); - } - - svgCanvas.call('changed', selElems); - setIcon(pos, val); - }; - - convertline = function _convertline(elem) { - // this routine came from the connectors extension - // it is needed because midpoint markers don't work with line elements - if (elem.tagName !== 'line') { - return elem; - } // Convert to polyline to accept mid-arrow - - - var x1 = Number(elem.getAttribute('x1')); - var x2 = Number(elem.getAttribute('x2')); - var y1 = Number(elem.getAttribute('y1')); - var y2 = Number(elem.getAttribute('y2')); - var id = elem.id; - var midPt = ' ' + (x1 + x2) / 2 + ',' + (y1 + y2) / 2 + ' '; - var pline = addElem({ - element: 'polyline', - attr: { - points: x1 + ',' + y1 + midPt + x2 + ',' + y2, - stroke: elem.getAttribute('stroke'), - 'stroke-width': elem.getAttribute('stroke-width'), - fill: 'none', - opacity: elem.getAttribute('opacity') || 1 - } - }); - $.each(mtypes, function (i, pos) { - // get any existing marker definitions - var nam = 'marker-' + pos; - var m = elem.getAttribute(nam); - - if (m) { - pline.setAttribute(nam, elem.getAttribute(nam)); - } - }); - var batchCmd = new S.BatchCommand(); - batchCmd.addSubCommand(new S.RemoveElementCommand(elem, elem.parentNode)); - batchCmd.addSubCommand(new S.InsertElementCommand(pline)); - $(elem).after(pline).remove(); - svgCanvas.clearSelection(); - pline.id = id; - svgCanvas.addToSelection([pline]); - S.addCommandToHistory(batchCmd); - return pline; - }; - - addMarker = function _addMarker(id, val) { - var txtBoxBg = '#ffffff'; - var txtBoxBorder = 'none'; - var txtBoxStrokeWidth = 0; - var marker = svgCanvas.getElem(id); - - if (marker) { - return undefined; - } - - if (val === '' || val === '\\nomarker') { - return undefined; - } - - var el = selElems[0]; - var color = el.getAttribute('stroke'); // NOTE: Safari didn't like a negative value in viewBox - // so we use a standardized 0 0 100 100 - // with 50 50 being mapped to the marker position - - var strokeWidth = 10; - var refX = 50; - var refY = 50; - var viewBox = '0 0 100 100'; - var markerWidth = 5; - var markerHeight = 5; - var seType; - - if (val.substr(0, 1) === '\\') { - seType = val.substr(1); - } else { - seType = 'textmarker'; - } - - if (!markerTypes[seType]) { - return undefined; - } // an unknown type! - // create a generic marker - - - marker = addElem({ - element: 'marker', - attr: { - id: id, - markerUnits: 'strokeWidth', - orient: 'auto', - style: 'pointer-events:none', - se_type: seType - } - }); - - if (seType !== 'textmarker') { - var mel = addElem(markerTypes[seType]); - var fillcolor = seType.substr(-2) === '_o' ? 'none' : color; - mel.setAttribute('fill', fillcolor); - mel.setAttribute('stroke', color); - mel.setAttribute('stroke-width', strokeWidth); - marker.append(mel); - } else { - var text = addElem(markerTypes[seType]); // have to add text to get bounding box - - text.textContent = val; - var tb = text.getBBox(); // alert(tb.x + ' ' + tb.y + ' ' + tb.width + ' ' + tb.height); - - var pad = 1; - var bb = tb; - bb.x = 0; - bb.y = 0; - bb.width += pad * 2; - bb.height += pad * 2; // shift text according to its size - - text.setAttribute('x', pad); - text.setAttribute('y', bb.height - pad - tb.height / 4); // kludge? - - text.setAttribute('fill', color); - refX = bb.width / 2 + pad; - refY = bb.height / 2 + pad; - viewBox = bb.x + ' ' + bb.y + ' ' + bb.width + ' ' + bb.height; - markerWidth = bb.width / 10; - markerHeight = bb.height / 10; - var box = addElem({ - element: 'rect', - attr: { - x: bb.x, - y: bb.y, - width: bb.width, - height: bb.height, - fill: txtBoxBg, - stroke: txtBoxBorder, - 'stroke-width': txtBoxStrokeWidth - } - }); - marker.setAttribute('orient', 0); - marker.append(box, text); - } - - marker.setAttribute('viewBox', viewBox); - marker.setAttribute('markerWidth', markerWidth); - marker.setAttribute('markerHeight', markerHeight); - marker.setAttribute('refX', refX); - marker.setAttribute('refY', refY); - svgCanvas.findDefs().append(marker); - return marker; - }; - - showPanel = function _showPanel(on) { - $('#marker_panel').toggle(on); - - if (on) { - var el = selElems[0]; - var val, ci; - $.each(mtypes, function (i, pos) { - var m = getLinked(el, 'marker-' + pos); - var txtbox = $('#' + pos + '_marker'); - - if (!m) { - val = '\\nomarker'; - ci = val; - txtbox.hide(); // hide text box - } else { - if (!m.attributes.se_type) { - return; - } // not created by this extension - - - val = '\\' + m.attributes.se_type.textContent; - ci = val; - - if (val === '\\textmarker') { - val = m.lastChild.textContent; // txtbox.show(); // show text box - } else { - txtbox.hide(); // hide text box - } - } - - txtbox.val(val); - setIcon(pos, ci); - }); - } - }; - - setIcon = function _setIcon(pos, id) { - if (id.substr(0, 1) !== '\\') { - id = '\\textmarker'; - } - - var ci = '#' + idPrefix + pos + '_' + id.substr(1); - svgEditor.setIcon('#cur_' + pos + '_marker_list', $(ci).children()); - $(ci).addClass('current').siblings().removeClass('current'); - }; - - getLinked = function _getLinked(elem, attr) { - var str = elem.getAttribute(attr); - - if (!str) { - return null; - } - - var m = str.match(/\(#(.*)\)/); // const m = str.match(/\(#(?<id>.+)\)/); - // if (!m || !m.groups.id) { - - if (!m || m.length !== 2) { - return null; - } - - return svgCanvas.getElem(m[1]); // return svgCanvas.getElem(m.groups.id); - }; - - _context3.next = 17; - return S.importLocale(); - - case 17: - strings = _context3.sent; - svgEditor = _this; - $ = S.$; - svgCanvas = svgEditor.canvas; - addElem = svgCanvas.addSVGElementFromJson; - mtypes = ['start', 'mid', 'end']; - markerPrefix = 'se_marker_'; - idPrefix = 'mkr_'; // note - to add additional marker types add them below with a unique id - // and add the associated icon(s) to marker-icons.svg - // the geometry is normalized to a 100x100 box with the origin at lower left - // Safari did not like negative values for low left of viewBox - // remember that the coordinate system has +y downward - - markerTypes = { - nomarker: {}, - leftarrow: { - element: 'path', - attr: { - d: 'M0,50 L100,90 L70,50 L100,10 Z' - } - }, - rightarrow: { - element: 'path', - attr: { - d: 'M100,50 L0,90 L30,50 L0,10 Z' - } - }, - textmarker: { - element: 'text', - attr: { - x: 0, - y: 0, - 'stroke-width': 0, - stroke: 'none', - 'font-size': 75, - 'font-family': 'serif', - 'text-anchor': 'left', - 'xml:space': 'preserve' - } - }, - forwardslash: { - element: 'path', - attr: { - d: 'M30,100 L70,0' - } - }, - reverseslash: { - element: 'path', - attr: { - d: 'M30,0 L70,100' - } - }, - verticalslash: { - element: 'path', - attr: { - d: 'M50,0 L50,100' - } - }, - box: { - element: 'path', - attr: { - d: 'M20,20 L20,80 L80,80 L80,20 Z' - } - }, - star: { - element: 'path', - attr: { - d: 'M10,30 L90,30 L20,90 L50,10 L80,90 Z' - } - }, - xmark: { - element: 'path', - attr: { - d: 'M20,80 L80,20 M80,80 L20,20' - } - }, - triangle: { - element: 'path', - attr: { - d: 'M10,80 L50,20 L80,80 Z' - } - }, - mcircle: { - element: 'circle', - attr: { - r: 30, - cx: 50, - cy: 50 - } - } - }; // duplicate shapes to support unfilled (open) marker types with an _o suffix - - ['leftarrow', 'rightarrow', 'box', 'star', 'mcircle', 'triangle'].forEach(function (v) { - markerTypes[v + '_o'] = markerTypes[v]; - }); - /** - * @param {Element} elem - A graphic element will have an attribute like marker-start - * @param {"marker-start"|"marker-mid"|"marker-end"} attr - * @returns {Element} The marker element that is linked to the graphic element - */ - - contextTools = [{ - type: 'input', - panel: 'marker_panel', - id: 'start_marker', - size: 3, - events: { - change: setMarker - } - }, { - type: 'button-select', - panel: 'marker_panel', - id: 'start_marker_list', - colnum: 3, - events: { - change: setArrowFromButton - } - }, { - type: 'input', - panel: 'marker_panel', - id: 'mid_marker', - defval: '', - size: 3, - events: { - change: setMarker - } - }, { - type: 'button-select', - panel: 'marker_panel', - id: 'mid_marker_list', - colnum: 3, - events: { - change: setArrowFromButton - } - }, { - type: 'input', - panel: 'marker_panel', - id: 'end_marker', - size: 3, - events: { - change: setMarker - } - }, { - type: 'button-select', - panel: 'marker_panel', - id: 'end_marker_list', - colnum: 3, - events: { - change: setArrowFromButton - } - }]; - return _context3.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'markers-icons.xml', - callback: function callback() { - $('#marker_panel').addClass('toolset').hide(); - }, - - /* async */ - addLangData: function addLangData(_ref) { - var importLocale = _ref.importLocale, - lang = _ref.lang; - return { - data: strings.langList - }; - }, - selectedChanged: function selectedChanged(opts) { - // Use this to update the current selected elements - // console.log('selectChanged',opts); - selElems = opts.elems; - var markerElems = ['line', 'path', 'polyline', 'polygon']; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && markerElems.includes(elem.tagName)) { - if (opts.selectedElement && !opts.multiselected) { - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - }, - elementChanged: function elementChanged(opts) { - // console.log('elementChanged',opts); - var elem = opts.elems[0]; - - if (elem && (elem.getAttribute('marker-start') || elem.getAttribute('marker-mid') || elem.getAttribute('marker-end'))) { - colorChanged(elem); - updateReferences(elem); - } // changing_flag = false; // Not apparently in use - - }, - buttons: buildButtonList(), - context_tools: strings.contextTools.map(function (contextTool, i) { - return Object.assign(contextTools[i], contextTool); - }) - }); - - case 29: - case "end": - return _context3.stop(); + // duplicate shapes to support unfilled (open) marker types with an _o suffix + ['leftarrow', 'rightarrow', 'box', 'star', 'mcircle', 'triangle'].forEach((v) => { + markerTypes[v + '_o'] = markerTypes[v]; + }); + + /** + * @param {Element} elem - A graphic element will have an attribute like marker-start + * @param {"marker-start"|"marker-mid"|"marker-end"} attr + * @returns {Element} The marker element that is linked to the graphic element + */ + function getLinked (elem, attr) { + const str = elem.getAttribute(attr); + if (!str) { return null; } + const m = str.match(/\(#(.*)\)/); + // const m = str.match(/\(#(?<id>.+)\)/); + // if (!m || !m.groups.id) { + if (!m || m.length !== 2) { + return null; + } + return svgCanvas.getElem(m[1]); + // return svgCanvas.getElem(m.groups.id); + } + + /** + * + * @param {"start"|"mid"|"end"} pos + * @param {string} id + * @returns {void} + */ + function setIcon (pos, id) { + if (id.substr(0, 1) !== '\\') { id = '\\textmarker'; } + const ci = '#' + idPrefix + pos + '_' + id.substr(1); + svgEditor.setIcon('#cur_' + pos + '_marker_list', $(ci).children()); + $(ci).addClass('current').siblings().removeClass('current'); + } + + let selElems; + /** + * Toggles context tool panel off/on. Sets the controls with the + * selected element's settings. + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + $('#marker_panel').toggle(on); + + if (on) { + const el = selElems[0]; + + let val, ci; + $.each(mtypes, function (i, pos) { + const m = getLinked(el, 'marker-' + pos); + const txtbox = $('#' + pos + '_marker'); + if (!m) { + val = '\\nomarker'; + ci = val; + txtbox.hide(); // hide text box + } else { + if (!m.attributes.se_type) { return; } // not created by this extension + val = '\\' + m.attributes.se_type.textContent; + ci = val; + if (val === '\\textmarker') { + val = m.lastChild.textContent; + // txtbox.show(); // show text box + } else { + txtbox.hide(); // hide text box } } - }, _callee3); - }))(); + txtbox.val(val); + setIcon(pos, ci); + }); + } } - }; - return extMarkers; + /** + * @param {string} id + * @param {""|"\\nomarker"|"nomarker"|"leftarrow"|"rightarrow"|"textmarker"|"forwardslash"|"reverseslash"|"verticalslash"|"box"|"star"|"xmark"|"triangle"|"mcircle"} val + * @returns {SVGMarkerElement} + */ + function addMarker (id, val) { + const txtBoxBg = '#ffffff'; + const txtBoxBorder = 'none'; + const txtBoxStrokeWidth = 0; -}()); + let marker = svgCanvas.getElem(id); + if (marker) { return undefined; } + + if (val === '' || val === '\\nomarker') { return undefined; } + + const el = selElems[0]; + const color = el.getAttribute('stroke'); + // NOTE: Safari didn't like a negative value in viewBox + // so we use a standardized 0 0 100 100 + // with 50 50 being mapped to the marker position + const strokeWidth = 10; + let refX = 50; + let refY = 50; + let viewBox = '0 0 100 100'; + let markerWidth = 5; + let markerHeight = 5; + let seType; + if (val.substr(0, 1) === '\\') { + seType = val.substr(1); + } else { seType = 'textmarker'; } + + if (!markerTypes[seType]) { return undefined; } // an unknown type! + + // create a generic marker + marker = addElem({ + element: 'marker', + attr: { + id, + markerUnits: 'strokeWidth', + orient: 'auto', + style: 'pointer-events:none', + se_type: seType + } + }); + + if (seType !== 'textmarker') { + const mel = addElem(markerTypes[seType]); + const fillcolor = (seType.substr(-2) === '_o') + ? 'none' + : color; + + mel.setAttribute('fill', fillcolor); + mel.setAttribute('stroke', color); + mel.setAttribute('stroke-width', strokeWidth); + marker.append(mel); + } else { + const text = addElem(markerTypes[seType]); + // have to add text to get bounding box + text.textContent = val; + const tb = text.getBBox(); + // alert(tb.x + ' ' + tb.y + ' ' + tb.width + ' ' + tb.height); + const pad = 1; + const bb = tb; + bb.x = 0; + bb.y = 0; + bb.width += pad * 2; + bb.height += pad * 2; + // shift text according to its size + text.setAttribute('x', pad); + text.setAttribute('y', bb.height - pad - tb.height / 4); // kludge? + text.setAttribute('fill', color); + refX = bb.width / 2 + pad; + refY = bb.height / 2 + pad; + viewBox = bb.x + ' ' + bb.y + ' ' + bb.width + ' ' + bb.height; + markerWidth = bb.width / 10; + markerHeight = bb.height / 10; + + const box = addElem({ + element: 'rect', + attr: { + x: bb.x, + y: bb.y, + width: bb.width, + height: bb.height, + fill: txtBoxBg, + stroke: txtBoxBorder, + 'stroke-width': txtBoxStrokeWidth + } + }); + marker.setAttribute('orient', 0); + marker.append(box, text); + } + + marker.setAttribute('viewBox', viewBox); + marker.setAttribute('markerWidth', markerWidth); + marker.setAttribute('markerHeight', markerHeight); + marker.setAttribute('refX', refX); + marker.setAttribute('refY', refY); + svgCanvas.findDefs().append(marker); + + return marker; + } + + /** + * @param {Element} elem + * @returns {SVGPolylineElement} + */ + function convertline (elem) { + // this routine came from the connectors extension + // it is needed because midpoint markers don't work with line elements + if (elem.tagName !== 'line') { return elem; } + + // Convert to polyline to accept mid-arrow + + const x1 = Number(elem.getAttribute('x1')); + const x2 = Number(elem.getAttribute('x2')); + const y1 = Number(elem.getAttribute('y1')); + const y2 = Number(elem.getAttribute('y2')); + const {id} = elem; + + const midPt = (' ' + ((x1 + x2) / 2) + ',' + ((y1 + y2) / 2) + ' '); + const pline = addElem({ + element: 'polyline', + attr: { + points: (x1 + ',' + y1 + midPt + x2 + ',' + y2), + stroke: elem.getAttribute('stroke'), + 'stroke-width': elem.getAttribute('stroke-width'), + fill: 'none', + opacity: elem.getAttribute('opacity') || 1 + } + }); + $.each(mtypes, function (i, pos) { // get any existing marker definitions + const nam = 'marker-' + pos; + const m = elem.getAttribute(nam); + if (m) { pline.setAttribute(nam, elem.getAttribute(nam)); } + }); + + const batchCmd = new S.BatchCommand(); + batchCmd.addSubCommand(new S.RemoveElementCommand(elem, elem.parentNode)); + batchCmd.addSubCommand(new S.InsertElementCommand(pline)); + + $(elem).after(pline).remove(); + svgCanvas.clearSelection(); + pline.id = id; + svgCanvas.addToSelection([pline]); + S.addCommandToHistory(batchCmd); + return pline; + } + + /** + * + * @returns {void} + */ + function setMarker () { + const poslist = {start_marker: 'start', mid_marker: 'mid', end_marker: 'end'}; + const pos = poslist[this.id]; + const markerName = 'marker-' + pos; + const el = selElems[0]; + const marker = getLinked(el, markerName); + if (marker) { $(marker).remove(); } + el.removeAttribute(markerName); + let val = this.value; + if (val === '') { val = '\\nomarker'; } + if (val === '\\nomarker') { + setIcon(pos, val); + svgCanvas.call('changed', selElems); + return; + } + // Set marker on element + const id = markerPrefix + pos + '_' + el.id; + addMarker(id, val); + svgCanvas.changeSelectedAttribute(markerName, 'url(#' + id + ')'); + if (el.tagName === 'line' && pos === 'mid') { + convertline(el); + } + svgCanvas.call('changed', selElems); + setIcon(pos, val); + } + + /** + * Called when the main system modifies an object. This routine changes + * the associated markers to be the same color. + * @param {Element} elem + * @returns {void} + */ + function colorChanged (elem) { + const color = elem.getAttribute('stroke'); + + $.each(mtypes, function (i, pos) { + const marker = getLinked(elem, 'marker-' + pos); + if (!marker) { return; } + if (!marker.attributes.se_type) { return; } // not created by this extension + const ch = marker.lastElementChild; + if (!ch) { return; } + const curfill = ch.getAttribute('fill'); + const curstroke = ch.getAttribute('stroke'); + if (curfill && curfill !== 'none') { ch.setAttribute('fill', color); } + if (curstroke && curstroke !== 'none') { ch.setAttribute('stroke', color); } + }); + } + + /** + * Called when the main system creates or modifies an object. + * Its primary purpose is to create new markers for cloned objects. + * @param {Element} el + * @returns {void} + */ + function updateReferences (el) { + $.each(mtypes, function (i, pos) { + const id = markerPrefix + pos + '_' + el.id; + const markerName = 'marker-' + pos; + const marker = getLinked(el, markerName); + if (!marker || !marker.attributes.se_type) { return; } // not created by this extension + const url = el.getAttribute(markerName); + if (url) { + const len = el.id.length; + const linkid = url.substr(-len - 1, len); + if (el.id !== linkid) { + const val = $('#' + pos + '_marker').attr('value'); + addMarker(id, val); + svgCanvas.changeSelectedAttribute(markerName, 'url(#' + id + ')'); + if (el.tagName === 'line' && pos === 'mid') { el = convertline(el); } + svgCanvas.call('changed', selElems); + } + } + }); + } + + // simulate a change event a text box that stores the current element's marker type + /** + * @param {"start"|"mid"|"end"} pos + * @param {string} val + * @returns {void} + */ + function triggerTextEntry (pos, val) { + $('#' + pos + '_marker').val(val); + $('#' + pos + '_marker').change(); + // const txtbox = $('#'+pos+'_marker'); + // if (val.substr(0,1)=='\\') {txtbox.hide();} + // else {txtbox.show();} + } + + /** + * @param {"start"|"mid"|"end"} pos + * @returns {Promise<void>} Resolves to `undefined` + */ + async function showTextPrompt (pos) { + let def = $('#' + pos + '_marker').val(); + if (def.substr(0, 1) === '\\') { def = ''; } + const txt = await $.prompt('Enter text for ' + pos + ' marker', def); + if (txt) { + triggerTextEntry(pos, txt); + } + } + + /* + function setMarkerSet(obj) { + const parts = this.id.split('_'); + const set = parts[2]; + switch (set) { + case 'off': + triggerTextEntry('start','\\nomarker'); + triggerTextEntry('mid','\\nomarker'); + triggerTextEntry('end','\\nomarker'); + break; + case 'dimension': + triggerTextEntry('start','\\leftarrow'); + triggerTextEntry('end','\\rightarrow'); + await showTextPrompt('mid'); + break; + case 'label': + triggerTextEntry('mid','\\nomarker'); + triggerTextEntry('end','\\rightarrow'); + await showTextPrompt('start'); + break; + } + } + */ + + // callback function for a toolbar button click + /** + * @param {Event} ev + * @returns {Promise<void>} Resolves to `undefined` + */ + async function setArrowFromButton (ev) { + const parts = this.id.split('_'); + const pos = parts[1]; + let val = parts[2]; + if (parts[3]) { val += '_' + parts[3]; } + + if (val !== 'textmarker') { + triggerTextEntry(pos, '\\' + val); + } else { + await showTextPrompt(pos); + } + } + + /** + * @param {"nomarker"|"leftarrow"|"rightarrow"|"textmarker"|"forwardslash"|"reverseslash"|"verticalslash"|"box"|"star"|"xmark"|"triangle"|"mcircle"} id + * @returns {string} + */ + function getTitle (id) { + const {langList} = strings; + const item = langList.find((itm) => { + return itm.id === id; + }); + return item ? item.title : id; + } + + /** + * Build the toolbar button array from the marker definitions. + * @returns {module:SVGEditor.Button[]} + */ + function buildButtonList () { + const buttons = []; + // const i = 0; + /* + buttons.push({ + id: idPrefix + 'markers_off', + title: 'Turn off all markers', + type: 'context', + events: { click: setMarkerSet }, + panel: 'marker_panel' + }); + buttons.push({ + id: idPrefix + 'markers_dimension', + title: 'Dimension', + type: 'context', + events: { click: setMarkerSet }, + panel: 'marker_panel' + }); + buttons.push({ + id: idPrefix + 'markers_label', + title: 'Label', + type: 'context', + events: { click: setMarkerSet }, + panel: 'marker_panel' + }); + */ + $.each(mtypes, function (k, pos) { + const listname = pos + '_marker_list'; + let def = true; + Object.keys(markerTypes).forEach(function (id) { + const title = getTitle(String(id)); + buttons.push({ + id: idPrefix + pos + '_' + id, + svgicon: id, + icon: svgEditor.curConfig.extIconsPath + 'markers-' + id + '.png', + title, + type: 'context', + events: {click: setArrowFromButton}, + panel: 'marker_panel', + list: listname, + isDefault: def + }); + def = false; + }); + }); + return buttons; + } + + const contextTools = [ + { + type: 'input', + panel: 'marker_panel', + id: 'start_marker', + size: 3, + events: {change: setMarker} + }, { + type: 'button-select', + panel: 'marker_panel', + id: 'start_marker_list', + colnum: 3, + events: {change: setArrowFromButton} + }, { + type: 'input', + panel: 'marker_panel', + id: 'mid_marker', + defval: '', + size: 3, + events: {change: setMarker} + }, { + type: 'button-select', + panel: 'marker_panel', + id: 'mid_marker_list', + colnum: 3, + events: {change: setArrowFromButton} + }, { + type: 'input', + panel: 'marker_panel', + id: 'end_marker', + size: 3, + events: {change: setMarker} + }, { + type: 'button-select', + panel: 'marker_panel', + id: 'end_marker_list', + colnum: 3, + events: {change: setArrowFromButton} + } + ]; + + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'markers-icons.xml', + callback () { + $('#marker_panel').addClass('toolset').hide(); + }, + /* async */ addLangData ({importLocale, lang}) { + return {data: strings.langList}; + }, + selectedChanged (opts) { + // Use this to update the current selected elements + // console.log('selectChanged',opts); + selElems = opts.elems; + + const markerElems = ['line', 'path', 'polyline', 'polygon']; + + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && markerElems.includes(elem.tagName)) { + if (opts.selectedElement && !opts.multiselected) { + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + }, + + elementChanged (opts) { + // console.log('elementChanged',opts); + const elem = opts.elems[0]; + if (elem && ( + elem.getAttribute('marker-start') || + elem.getAttribute('marker-mid') || + elem.getAttribute('marker-end') + )) { + colorChanged(elem); + updateReferences(elem); + } + // changing_flag = false; // Not apparently in use + }, + buttons: buildButtonList(), + context_tools: strings.contextTools.map((contextTool, i) => { + return Object.assign(contextTools[i], contextTool); + }) + }; + } +}; diff --git a/dist/extensions/ext-mathjax.js b/dist/extensions/ext-mathjax.js index 2e7ff034..f64568de 100644 --- a/dist/extensions/ext-mathjax.js +++ b/dist/extensions/ext-mathjax.js @@ -1,360 +1,307 @@ -var svgEditorExtension_mathjax = (function () { - 'use strict'; +/* globals MathJax */ +/** + * @file ext-mathjax.js + * + * @license MIT + * + * @copyright 2013 Jo Segaert + * + */ +// Todo: Wait for Mathjax 3.0 to get ES Module/avoid global +import {importScript} from '../../external/dynamic-import-polyfill/importModule.js'; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } +export default { + name: 'mathjax', + async init ({$, importLocale}) { + const strings = await importLocale(); + const svgEditor = this; + const svgCanvas = svgEditor.canvas; - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } + // Configuration of the MathJax extention. - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); + // This will be added to the head tag before MathJax is loaded. + const /* mathjaxConfiguration = `<script type="text/x-mathjax-config"> + MathJax.Hub.Config({ + extensions: ['tex2jax.js'], + jax: ['input/TeX', 'output/SVG'], + showProcessingMessages: true, + showMathMenu: false, + showMathMenuMSIE: false, + errorSettings: { + message: ['[Math Processing Error]'], + style: {color: '#CC0000', 'font-style': 'italic'} + }, + elements: [], + tex2jax: { + ignoreClass: 'tex2jax_ignore2', processClass: 'tex2jax_process2', + }, + TeX: { + extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js'] + }, + SVG: { + } }); - }; - } + </script>`, */ + // mathjaxSrc = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js', + // Had been on https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG.js + // Obtained Text-AMS-MML_SVG.js from https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.3/config/TeX-AMS-MML_SVG.js + mathjaxSrcSecure = 'mathjax/MathJax.min.js?config=TeX-AMS-MML_SVG.js', + {uiStrings} = svgEditor; + let + math, + locationX, + locationY, + mathjaxLoaded = false; - /** - * Add any of the whitelisted attributes to the script tag. - * @param {HTMLScriptElement} script - * @param {PlainObject<string, string>} atts - * @returns {void} - */ - - - function addScriptAtts(script, atts) { - ['id', 'class', 'type'].forEach(function (prop) { - if (prop in atts) { - script[prop] = atts[prop]; + // TODO: Implement language support. Move these uiStrings to the locale files and + // the code to the langReady callback. Also i18nize alert and HTML below + $.extend(uiStrings, { + mathjax: { + embed_svg: 'Save as mathematics', + embed_mathml: 'Save as figure', + svg_save_warning: 'The math will be transformed into a figure is ' + + 'manipulatable like everything else. You will not be able to ' + + 'manipulate the TeX-code anymore.', + mathml_save_warning: 'Advised. The math will be saved as a figure.', + title: 'Mathematics code editor' } }); - } // Additions by Brett - function importScript(url) { - var atts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + /** + * + * @returns {void} + */ + function saveMath () { + const code = $('#mathjax_code_textarea').val(); + // displaystyle to force MathJax NOT to use the inline style. Because it is + // less fancy! + MathJax.Hub.queue.Push(['Text', math, '\\displaystyle{' + code + '}']); - if (Array.isArray(url)) { - return Promise.all(url.map(function (u) { - return importScript(u, atts); - })); + /* + * The MathJax library doesn't want to bloat your webpage so it creates + * every symbol (glymph) you need only once. These are saved in a `<svg>` on + * the top of your html document, just under the body tag. Each glymph has + * its unique id and is saved as a `<path>` in the `<defs>` tag of the `<svg>` + * + * Then when the symbols are needed in the rest of your html document they + * are refferd to by a `<use>` tag. + * Because of bug 1076 we can't just grab the defs tag on the top and add it + * to your formula's `<svg>` and copy the lot. So we have to replace each + * `<use>` tag by its `<path>`. + */ + MathJax.Hub.queue.Push( + function () { + const mathjaxMath = $('.MathJax_SVG'); + const svg = $(mathjaxMath.html()); + svg.find('use').each(function () { + // TODO: find a less pragmatic and more elegant solution to this. + const id = $(this).attr('href') + ? $(this).attr('href').slice(1) // Works in Chrome. + : $(this).attr('xlink:href').slice(1); // Works in Firefox. + const glymph = $('#' + id).clone().removeAttr('id'); + const x = $(this).attr('x'); + const y = $(this).attr('y'); + const transform = $(this).attr('transform'); + if (transform && (x || y)) { + glymph.attr('transform', transform + ' translate(' + x + ',' + y + ')'); + } else if (transform) { + glymph.attr('transform', transform); + } else if (x || y) { + glymph.attr('transform', 'translate(' + x + ',' + y + ')'); + } + $(this).replaceWith(glymph); + }); + // Remove the style tag because it interferes with SVG-Edit. + svg.removeAttr('style'); + svg.attr('xmlns', 'http://www.w3.org/2000/svg'); + svgCanvas.importSvgString($('<div>').append(svg.clone()).html(), true); + svgCanvas.ungroupSelectedElement(); + // TODO: To undo the adding of the Formula you now have to undo twice. + // This should only be once! + svgCanvas.moveSelectedElements(locationX, locationY, true); + } + ); } - return new Promise(function (resolve, reject) { - // eslint-disable-line promise/avoid-new - var script = document.createElement('script'); - /** - * - * @returns {void} - */ + const buttons = [{ + id: 'tool_mathjax', + type: 'mode', + icon: svgEditor.curConfig.extIconsPath + 'mathjax.png', + events: { + async click () { + // Set the mode. + svgCanvas.setMode('mathjax'); - function scriptOnError() { - reject(new Error("Failed to import: ".concat(url))); - destructor(); - } - /** - * - * @returns {void} - */ + // Only load Mathjax when needed, we don't want to strain Svg-Edit any more. + // From this point on it is very probable that it will be needed, so load it. + if (mathjaxLoaded === false) { + $( + '<div id="mathjax">' + + '<!-- Here is where MathJax creates the math -->' + + '<div id="mathjax_creator" class="tex2jax_process" style="display:none">' + + '$${}$$' + + '</div>' + + '<div id="mathjax_overlay"></div>' + + '<div id="mathjax_container">' + + '<div id="tool_mathjax_back" class="toolbar_button">' + + '<button id="tool_mathjax_save">OK</button>' + + '<button id="tool_mathjax_cancel">Cancel</button>' + + '</div>' + + '<fieldset>' + + '<legend id="mathjax_legend">Mathematics Editor</legend>' + + '<label>' + + '<span id="mathjax_explication">Please type your mathematics in ' + + '<a href="https://en.wikipedia.org/wiki/Help:' + + 'Displaying_a_formula" target="_blank">TeX</a> code.' + + '</span></label>' + + '<textarea id="mathjax_code_textarea" spellcheck="false"></textarea>' + + '</fieldset>' + + '</div>' + + '</div>' + ).insertAfter('#svg_prefs').hide(); + // Make the MathEditor draggable. + $('#mathjax_container').draggable({ + cancel: 'button,fieldset', + containment: 'window' + }); - function scriptOnLoad() { - resolve(); - destructor(); - } + // Add functionality and picture to cancel button. + $('#tool_mathjax_cancel').prepend($.getSvgIcon('cancel', true)) + .on('click touched', function () { + $('#mathjax').hide(); + }); - var destructor = function destructor() { - script.removeEventListener('error', scriptOnError); - script.removeEventListener('load', scriptOnLoad); - script.remove(); - script.src = ''; - }; + // Add functionality and picture to the save button. + $('#tool_mathjax_save').prepend($.getSvgIcon('ok', true)) + .on('click touched', function () { + saveMath(); + $('#mathjax').hide(); + }); - script.defer = 'defer'; - addScriptAtts(script, atts); - script.addEventListener('error', scriptOnError); - script.addEventListener('load', scriptOnLoad); - script.src = url; - document.head.append(script); - }); - } + // MathJax preprocessing has to ignore most of the page. + $('body').addClass('tex2jax_ignore'); - var extMathjax = { - name: 'mathjax', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var $, importLocale, strings, svgEditor, svgCanvas, mathjaxSrcSecure, uiStrings, math, locationX, locationY, mathjaxLoaded, saveMath, buttons; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - saveMath = function _saveMath() { - var code = $('#mathjax_code_textarea').val(); // displaystyle to force MathJax NOT to use the inline style. Because it is - // less fancy! - - MathJax.Hub.queue.Push(['Text', math, '\\displaystyle{' + code + '}']); - /* - * The MathJax library doesn't want to bloat your webpage so it creates - * every symbol (glymph) you need only once. These are saved in a `<svg>` on - * the top of your html document, just under the body tag. Each glymph has - * its unique id and is saved as a `<path>` in the `<defs>` tag of the `<svg>` - * - * Then when the symbols are needed in the rest of your html document they - * are refferd to by a `<use>` tag. - * Because of bug 1076 we can't just grab the defs tag on the top and add it - * to your formula's `<svg>` and copy the lot. So we have to replace each - * `<use>` tag by its `<path>`. - */ - - MathJax.Hub.queue.Push(function () { - var mathjaxMath = $('.MathJax_SVG'); - var svg = $(mathjaxMath.html()); - svg.find('use').each(function () { - // TODO: find a less pragmatic and more elegant solution to this. - var id = $(this).attr('href') ? $(this).attr('href').slice(1) // Works in Chrome. - : $(this).attr('xlink:href').slice(1); // Works in Firefox. - - var glymph = $('#' + id).clone().removeAttr('id'); - var x = $(this).attr('x'); - var y = $(this).attr('y'); - var transform = $(this).attr('transform'); - - if (transform && (x || y)) { - glymph.attr('transform', transform + ' translate(' + x + ',' + y + ')'); - } else if (transform) { - glymph.attr('transform', transform); - } else if (x || y) { - glymph.attr('transform', 'translate(' + x + ',' + y + ')'); - } - - $(this).replaceWith(glymph); - }); // Remove the style tag because it interferes with SVG-Edit. - - svg.removeAttr('style'); - svg.attr('xmlns', 'http://www.w3.org/2000/svg'); - svgCanvas.importSvgString($('<div>').append(svg.clone()).html(), true); - svgCanvas.ungroupSelectedElement(); // TODO: To undo the adding of the Formula you now have to undo twice. - // This should only be once! - - svgCanvas.moveSelectedElements(locationX, locationY, true); - }); - }; - - $ = _ref.$, importLocale = _ref.importLocale; - _context2.next = 4; - return importLocale(); - - case 4: - strings = _context2.sent; - svgEditor = _this; - svgCanvas = svgEditor.canvas; // Configuration of the MathJax extention. - // This will be added to the head tag before MathJax is loaded. - - /* mathjaxConfiguration = `<script type="text/x-mathjax-config"> - MathJax.Hub.Config({ - extensions: ['tex2jax.js'], - jax: ['input/TeX', 'output/SVG'], - showProcessingMessages: true, - showMathMenu: false, - showMathMenuMSIE: false, - errorSettings: { - message: ['[Math Processing Error]'], - style: {color: '#CC0000', 'font-style': 'italic'} - }, - elements: [], - tex2jax: { - ignoreClass: 'tex2jax_ignore2', processClass: 'tex2jax_process2', - }, - TeX: { - extensions: ['AMSmath.js', 'AMSsymbols.js', 'noErrors.js', 'noUndefined.js'] - }, - SVG: { - } - }); - </script>`, */ - // mathjaxSrc = 'http://cdn.mathjax.org/mathjax/latest/MathJax.js', - // Had been on https://c328740.ssl.cf1.rackcdn.com/mathjax/latest/MathJax.js?config=TeX-AMS-MML_SVG.js - // Obtained Text-AMS-MML_SVG.js from https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.3/config/TeX-AMS-MML_SVG.js - mathjaxSrcSecure = 'mathjax/MathJax.min.js?config=TeX-AMS-MML_SVG.js', uiStrings = svgEditor.uiStrings; - mathjaxLoaded = false; // TODO: Implement language support. Move these uiStrings to the locale files and - // the code to the langReady callback. Also i18nize alert and HTML below - - $.extend(uiStrings, { - mathjax: { - embed_svg: 'Save as mathematics', - embed_mathml: 'Save as figure', - svg_save_warning: 'The math will be transformed into a figure is ' + 'manipulatable like everything else. You will not be able to ' + 'manipulate the TeX-code anymore.', - mathml_save_warning: 'Advised. The math will be saved as a figure.', - title: 'Mathematics code editor' - } - }); - /** - * - * @returns {void} - */ - - buttons = [{ - id: 'tool_mathjax', - type: 'mode', - icon: svgEditor.curConfig.extIconsPath + 'mathjax.png', - events: { - click: function click() { - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - // Set the mode. - svgCanvas.setMode('mathjax'); // Only load Mathjax when needed, we don't want to strain Svg-Edit any more. - // From this point on it is very probable that it will be needed, so load it. - - if (!(mathjaxLoaded === false)) { - _context.next = 17; - break; - } - - $('<div id="mathjax">' + '<!-- Here is where MathJax creates the math -->' + '<div id="mathjax_creator" class="tex2jax_process" style="display:none">' + '$${}$$' + '</div>' + '<div id="mathjax_overlay"></div>' + '<div id="mathjax_container">' + '<div id="tool_mathjax_back" class="toolbar_button">' + '<button id="tool_mathjax_save">OK</button>' + '<button id="tool_mathjax_cancel">Cancel</button>' + '</div>' + '<fieldset>' + '<legend id="mathjax_legend">Mathematics Editor</legend>' + '<label>' + '<span id="mathjax_explication">Please type your mathematics in ' + '<a href="https://en.wikipedia.org/wiki/Help:' + 'Displaying_a_formula" target="_blank">TeX</a> code.' + '</span></label>' + '<textarea id="mathjax_code_textarea" spellcheck="false"></textarea>' + '</fieldset>' + '</div>' + '</div>').insertAfter('#svg_prefs').hide(); // Make the MathEditor draggable. - - $('#mathjax_container').draggable({ - cancel: 'button,fieldset', - containment: 'window' - }); // Add functionality and picture to cancel button. - - $('#tool_mathjax_cancel').prepend($.getSvgIcon('cancel', true)).on('click touched', function () { - $('#mathjax').hide(); - }); // Add functionality and picture to the save button. - - $('#tool_mathjax_save').prepend($.getSvgIcon('ok', true)).on('click touched', function () { - saveMath(); - $('#mathjax').hide(); - }); // MathJax preprocessing has to ignore most of the page. - - $('body').addClass('tex2jax_ignore'); // Now get (and run) the MathJax Library. - // Todo: insert script with modules once widely supported - // and if MathJax (and its `TeX-AMS-MML_SVG.js` dependency) ends up - // providing an ES6 module export: https://github.com/mathjax/MathJax/issues/1998 - - /* - const modularVersion = !('svgEditor' in window) || - !window.svgEditor || - window.svgEditor.modules !== false; - // Add as second argument to `importScript` - { - type: modularVersion - ? 'module' // Make this the default when widely supported - : 'text/javascript' - } - // If only using modules, just use this: - const {default: MathJax} = await importModule( // or `import()` when widely supported - svgEditor.curConfig.extIconsPath + mathjaxSrcSecure - ); - */ - // We use `extIconsPath` here for now as it does not vary with - // the modular type as does `extPath` - - _context.prev = 7; - _context.next = 10; - return importScript(svgEditor.curConfig.extIconsPath + mathjaxSrcSecure); - - case 10: - // When MathJax is loaded get the div where the math will be rendered. - MathJax.Hub.queue.Push(function () { - math = MathJax.Hub.getAllJax('#mathjax_creator')[0]; - console.log(math); // eslint-disable-line no-console - - mathjaxLoaded = true; - console.log('MathJax Loaded'); // eslint-disable-line no-console - }); - _context.next = 17; - break; - - case 13: - _context.prev = 13; - _context.t0 = _context["catch"](7); - console.log('Failed loading MathJax.'); // eslint-disable-line no-console - - $.alert('Failed loading MathJax. You will not be able to change the mathematics.'); - - case 17: - case "end": - return _context.stop(); - } - } - }, _callee, null, [[7, 13]]); - }))(); - } - } - }]; - return _context2.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'mathjax-icons.xml', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - mouseDown: function mouseDown() { - if (svgCanvas.getMode() === 'mathjax') { - return { - started: true - }; - } - - return undefined; - }, - mouseUp: function mouseUp(opts) { - if (svgCanvas.getMode() === 'mathjax') { - // Get the coordinates from your mouse. - var zoom = svgCanvas.getZoom(); // Get the actual coordinate by dividing by the zoom value - - locationX = opts.mouse_x / zoom; - locationY = opts.mouse_y / zoom; - $('#mathjax').show(); - return { - started: false - }; // Otherwise the last selected object dissapears. - } - - return undefined; - }, - callback: function callback() { - $('<style>').text('#mathjax fieldset{' + 'padding: 5px;' + 'margin: 5px;' + 'border: 1px solid #DDD;' + '}' + '#mathjax label{' + 'display: block;' + 'margin: .5em;' + '}' + '#mathjax legend {' + 'max-width:195px;' + '}' + '#mathjax_overlay {' + 'position: absolute;' + 'top: 0;' + 'left: 0;' + 'right: 0;' + 'bottom: 0;' + 'background-color: black;' + 'opacity: 0.6;' + 'z-index: 20000;' + '}' + '#mathjax_container {' + 'position: absolute;' + 'top: 50px;' + 'padding: 10px;' + 'background-color: #B0B0B0;' + 'border: 1px outset #777;' + 'opacity: 1.0;' + 'font-family: Verdana, Helvetica, sans-serif;' + 'font-size: .8em;' + 'z-index: 20001;' + '}' + '#tool_mathjax_back {' + 'margin-left: 1em;' + 'overflow: auto;' + '}' + '#mathjax_legend{' + 'font-weight: bold;' + 'font-size:1.1em;' + '}' + '#mathjax_code_textarea {\\n' + 'margin: 5px .7em;' + 'overflow: hidden;' + 'width: 416px;' + 'display: block;' + 'height: 100px;' + '}').appendTo('head'); // Add the MathJax configuration. - // $(mathjaxConfiguration).appendTo('head'); - } - }); - - case 12: - case "end": - return _context2.stop(); + // Now get (and run) the MathJax Library. + // Todo: insert script with modules once widely supported + // and if MathJax (and its `TeX-AMS-MML_SVG.js` dependency) ends up + // providing an ES6 module export: https://github.com/mathjax/MathJax/issues/1998 + /* + const modularVersion = !('svgEditor' in window) || + !window.svgEditor || + window.svgEditor.modules !== false; + // Add as second argument to `importScript` + { + type: modularVersion + ? 'module' // Make this the default when widely supported + : 'text/javascript' + } + // If only using modules, just use this: + const {default: MathJax} = await importModule( // or `import()` when widely supported + svgEditor.curConfig.extIconsPath + mathjaxSrcSecure + ); + */ + // We use `extIconsPath` here for now as it does not vary with + // the modular type as does `extPath` + try { + await importScript(svgEditor.curConfig.extIconsPath + mathjaxSrcSecure); + // When MathJax is loaded get the div where the math will be rendered. + MathJax.Hub.queue.Push(function () { + math = MathJax.Hub.getAllJax('#mathjax_creator')[0]; + console.log(math); // eslint-disable-line no-console + mathjaxLoaded = true; + console.log('MathJax Loaded'); // eslint-disable-line no-console + }); + } catch (e) { + console.log('Failed loading MathJax.'); // eslint-disable-line no-console + $.alert('Failed loading MathJax. You will not be able to change the mathematics.'); } } - }, _callee2); - }))(); - } - }; + } + } + }]; - return extMathjax; + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'mathjax-icons.xml', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), -}()); + mouseDown () { + if (svgCanvas.getMode() === 'mathjax') { + return {started: true}; + } + return undefined; + }, + mouseUp (opts) { + if (svgCanvas.getMode() === 'mathjax') { + // Get the coordinates from your mouse. + const zoom = svgCanvas.getZoom(); + // Get the actual coordinate by dividing by the zoom value + locationX = opts.mouse_x / zoom; + locationY = opts.mouse_y / zoom; + + $('#mathjax').show(); + return {started: false}; // Otherwise the last selected object dissapears. + } + return undefined; + }, + callback () { + $('<style>').text( + '#mathjax fieldset{' + + 'padding: 5px;' + + 'margin: 5px;' + + 'border: 1px solid #DDD;' + + '}' + + '#mathjax label{' + + 'display: block;' + + 'margin: .5em;' + + '}' + + '#mathjax legend {' + + 'max-width:195px;' + + '}' + + '#mathjax_overlay {' + + 'position: absolute;' + + 'top: 0;' + + 'left: 0;' + + 'right: 0;' + + 'bottom: 0;' + + 'background-color: black;' + + 'opacity: 0.6;' + + 'z-index: 20000;' + + '}' + + '#mathjax_container {' + + 'position: absolute;' + + 'top: 50px;' + + 'padding: 10px;' + + 'background-color: #B0B0B0;' + + 'border: 1px outset #777;' + + 'opacity: 1.0;' + + 'font-family: Verdana, Helvetica, sans-serif;' + + 'font-size: .8em;' + + 'z-index: 20001;' + + '}' + + '#tool_mathjax_back {' + + 'margin-left: 1em;' + + 'overflow: auto;' + + '}' + + '#mathjax_legend{' + + 'font-weight: bold;' + + 'font-size:1.1em;' + + '}' + + '#mathjax_code_textarea {\\n' + + 'margin: 5px .7em;' + + 'overflow: hidden;' + + 'width: 416px;' + + 'display: block;' + + 'height: 100px;' + + '}' + ).appendTo('head'); + + // Add the MathJax configuration. + // $(mathjaxConfiguration).appendTo('head'); + } + }; + } +}; diff --git a/dist/extensions/ext-overview_window.js b/dist/extensions/ext-overview_window.js index db6ca8fb..c2518af1 100644 --- a/dist/extensions/ext-overview_window.js +++ b/dist/extensions/ext-overview_window.js @@ -1,153 +1,159 @@ -var svgEditorExtension_overview_window = (function () { - 'use strict'; - - /** - * @file ext-overview_window.js - * - * @license MIT - * - * @copyright 2013 James Sacksteder - * - */ - var extOverview_window = { - name: 'overview_window', - init: function init(_ref) { - var $ = _ref.$, - isChrome = _ref.isChrome, - isIE = _ref.isIE; - var overviewWindowGlobals = {}; // Disabled in Chrome 48-, see https://github.com/SVG-Edit/svgedit/issues/26 and - // https://code.google.com/p/chromium/issues/detail?id=565120. - - if (isChrome()) { - var verIndex = navigator.userAgent.indexOf('Chrome/') + 7; - var chromeVersion = Number.parseInt(navigator.userAgent.substring(verIndex)); - - if (chromeVersion < 49) { - return undefined; - } - } // Define and insert the base html element. - - - var propsWindowHtml = '<div id="overview_window_content_pane" style="width:100%; ' + 'word-wrap:break-word; display:inline-block; margin-top:20px;">' + '<div id="overview_window_content" style="position:relative; ' + 'left:12px; top:0px;">' + '<div style="background-color:#A0A0A0; display:inline-block; ' + 'overflow:visible;">' + '<svg id="overviewMiniView" width="150" height="100" x="0" ' + 'y="0" viewBox="0 0 4800 3600" ' + 'xmlns="http://www.w3.org/2000/svg" ' + 'xmlns:xlink="http://www.w3.org/1999/xlink">' + '<use x="0" y="0" xlink:href="#svgroot"> </use>' + '</svg>' + '<div id="overview_window_view_box" style="min-width:50px; ' + 'min-height:50px; position:absolute; top:30px; left:30px; ' + 'z-index:5; background-color:rgba(255,0,102,0.3);">' + '</div>' + '</div>' + '</div>' + '</div>'; - $('#sidepanels').append(propsWindowHtml); // Define dynamic animation of the view box. - - var updateViewBox = function updateViewBox() { - var portHeight = Number.parseFloat($('#workarea').css('height')); - var portWidth = Number.parseFloat($('#workarea').css('width')); - var portX = $('#workarea').scrollLeft(); - var portY = $('#workarea').scrollTop(); - var windowWidth = Number.parseFloat($('#svgcanvas').css('width')); - var windowHeight = Number.parseFloat($('#svgcanvas').css('height')); - var overviewWidth = $('#overviewMiniView').attr('width'); - var overviewHeight = $('#overviewMiniView').attr('height'); - var viewBoxX = portX / windowWidth * overviewWidth; - var viewBoxY = portY / windowHeight * overviewHeight; - var viewBoxWidth = portWidth / windowWidth * overviewWidth; - var viewBoxHeight = portHeight / windowHeight * overviewHeight; - $('#overview_window_view_box').css('min-width', viewBoxWidth + 'px'); - $('#overview_window_view_box').css('min-height', viewBoxHeight + 'px'); - $('#overview_window_view_box').css('top', viewBoxY + 'px'); - $('#overview_window_view_box').css('left', viewBoxX + 'px'); - }; - - $('#workarea').scroll(function () { - if (!overviewWindowGlobals.viewBoxDragging) { - updateViewBox(); - } - }); - $('#workarea').resize(updateViewBox); - updateViewBox(); // Compensate for changes in zoom and canvas size. - - var updateViewDimensions = function updateViewDimensions() { - var viewWidth = $('#svgroot').attr('width'); - var viewHeight = $('#svgroot').attr('height'); - var viewX = 640; - var viewY = 480; - - if (isIE()) { - // This has only been tested with Firefox 10 and IE 9 (without chrome frame). - // I am not sure if if is Firefox or IE that is being non compliant here. - // Either way the one that is noncompliant may become more compliant later. - // TAG:HACK - // TAG:VERSION_DEPENDENT - // TAG:BROWSER_SNIFFING - viewX = 0; - viewY = 0; - } - - var svgWidthOld = $('#overviewMiniView').attr('width'); - var svgHeightNew = viewHeight / viewWidth * svgWidthOld; - $('#overviewMiniView').attr('viewBox', viewX + ' ' + viewY + ' ' + viewWidth + ' ' + viewHeight); - $('#overviewMiniView').attr('height', svgHeightNew); - updateViewBox(); - }; - - updateViewDimensions(); // Set up the overview window as a controller for the view port. - - overviewWindowGlobals.viewBoxDragging = false; - - var updateViewPortFromViewBox = function updateViewPortFromViewBox() { - var windowWidth = Number.parseFloat($('#svgcanvas').css('width')); - var windowHeight = Number.parseFloat($('#svgcanvas').css('height')); - var overviewWidth = $('#overviewMiniView').attr('width'); - var overviewHeight = $('#overviewMiniView').attr('height'); - var viewBoxX = Number.parseFloat($('#overview_window_view_box').css('left')); - var viewBoxY = Number.parseFloat($('#overview_window_view_box').css('top')); - var portX = viewBoxX / overviewWidth * windowWidth; - var portY = viewBoxY / overviewHeight * windowHeight; - $('#workarea').scrollLeft(portX); - $('#workarea').scrollTop(portY); - }; - - $('#overview_window_view_box').draggable({ - containment: 'parent', - drag: updateViewPortFromViewBox, - start: function start() { - overviewWindowGlobals.viewBoxDragging = true; - }, - stop: function stop() { - overviewWindowGlobals.viewBoxDragging = false; - } - }); - $('#overviewMiniView').click(function (evt) { - // Firefox doesn't support evt.offsetX and evt.offsetY. - var mouseX = evt.offsetX || evt.originalEvent.layerX; - var mouseY = evt.offsetY || evt.originalEvent.layerY; - var overviewWidth = $('#overviewMiniView').attr('width'); - var overviewHeight = $('#overviewMiniView').attr('height'); - var viewBoxWidth = Number.parseFloat($('#overview_window_view_box').css('min-width')); - var viewBoxHeight = Number.parseFloat($('#overview_window_view_box').css('min-height')); - var viewBoxX = mouseX - 0.5 * viewBoxWidth; - var viewBoxY = mouseY - 0.5 * viewBoxHeight; // deal with constraints - - if (viewBoxX < 0) { - viewBoxX = 0; - } - - if (viewBoxY < 0) { - viewBoxY = 0; - } - - if (viewBoxX + viewBoxWidth > overviewWidth) { - viewBoxX = overviewWidth - viewBoxWidth; - } - - if (viewBoxY + viewBoxHeight > overviewHeight) { - viewBoxY = overviewHeight - viewBoxHeight; - } - - $('#overview_window_view_box').css('top', viewBoxY + 'px'); - $('#overview_window_view_box').css('left', viewBoxX + 'px'); - updateViewPortFromViewBox(); - }); - return { - name: 'overview window', - canvasUpdated: updateViewDimensions, - workareaResized: updateViewBox - }; +/** + * @file ext-overview_window.js + * + * @license MIT + * + * @copyright 2013 James Sacksteder + * + */ +export default { + name: 'overview_window', + init ({$, isChrome, isIE}) { + const overviewWindowGlobals = {}; + // Disabled in Chrome 48-, see https://github.com/SVG-Edit/svgedit/issues/26 and + // https://code.google.com/p/chromium/issues/detail?id=565120. + if (isChrome()) { + const verIndex = navigator.userAgent.indexOf('Chrome/') + 7; + const chromeVersion = Number.parseInt(navigator.userAgent.substring(verIndex)); + if (chromeVersion < 49) { + return undefined; + } } - }; - return extOverview_window; + // Define and insert the base html element. + const propsWindowHtml = + '<div id="overview_window_content_pane" style="width:100%; ' + + 'word-wrap:break-word; display:inline-block; margin-top:20px;">' + + '<div id="overview_window_content" style="position:relative; ' + + 'left:12px; top:0px;">' + + '<div style="background-color:#A0A0A0; display:inline-block; ' + + 'overflow:visible;">' + + '<svg id="overviewMiniView" width="150" height="100" x="0" ' + + 'y="0" viewBox="0 0 4800 3600" ' + + 'xmlns="http://www.w3.org/2000/svg" ' + + 'xmlns:xlink="http://www.w3.org/1999/xlink">' + + '<use x="0" y="0" xlink:href="#svgroot"> </use>' + + '</svg>' + + '<div id="overview_window_view_box" style="min-width:50px; ' + + 'min-height:50px; position:absolute; top:30px; left:30px; ' + + 'z-index:5; background-color:rgba(255,0,102,0.3);">' + + '</div>' + + '</div>' + + '</div>' + + '</div>'; + $('#sidepanels').append(propsWindowHtml); -}()); + // Define dynamic animation of the view box. + const updateViewBox = function () { + const portHeight = Number.parseFloat($('#workarea').css('height')); + const portWidth = Number.parseFloat($('#workarea').css('width')); + const portX = $('#workarea').scrollLeft(); + const portY = $('#workarea').scrollTop(); + const windowWidth = Number.parseFloat($('#svgcanvas').css('width')); + const windowHeight = Number.parseFloat($('#svgcanvas').css('height')); + const overviewWidth = $('#overviewMiniView').attr('width'); + const overviewHeight = $('#overviewMiniView').attr('height'); + + const viewBoxX = portX / windowWidth * overviewWidth; + const viewBoxY = portY / windowHeight * overviewHeight; + const viewBoxWidth = portWidth / windowWidth * overviewWidth; + const viewBoxHeight = portHeight / windowHeight * overviewHeight; + + $('#overview_window_view_box').css('min-width', viewBoxWidth + 'px'); + $('#overview_window_view_box').css('min-height', viewBoxHeight + 'px'); + $('#overview_window_view_box').css('top', viewBoxY + 'px'); + $('#overview_window_view_box').css('left', viewBoxX + 'px'); + }; + $('#workarea').scroll(function () { + if (!(overviewWindowGlobals.viewBoxDragging)) { + updateViewBox(); + } + }); + $('#workarea').resize(updateViewBox); + updateViewBox(); + + // Compensate for changes in zoom and canvas size. + const updateViewDimensions = function () { + const viewWidth = $('#svgroot').attr('width'); + const viewHeight = $('#svgroot').attr('height'); + + let viewX = 640; + let viewY = 480; + if (isIE()) { + // This has only been tested with Firefox 10 and IE 9 (without chrome frame). + // I am not sure if if is Firefox or IE that is being non compliant here. + // Either way the one that is noncompliant may become more compliant later. + // TAG:HACK + // TAG:VERSION_DEPENDENT + // TAG:BROWSER_SNIFFING + viewX = 0; + viewY = 0; + } + + const svgWidthOld = $('#overviewMiniView').attr('width'); + const svgHeightNew = viewHeight / viewWidth * svgWidthOld; + $('#overviewMiniView').attr('viewBox', viewX + ' ' + viewY + ' ' + viewWidth + ' ' + viewHeight); + $('#overviewMiniView').attr('height', svgHeightNew); + updateViewBox(); + }; + updateViewDimensions(); + + // Set up the overview window as a controller for the view port. + overviewWindowGlobals.viewBoxDragging = false; + const updateViewPortFromViewBox = function () { + const windowWidth = Number.parseFloat($('#svgcanvas').css('width')); + const windowHeight = Number.parseFloat($('#svgcanvas').css('height')); + const overviewWidth = $('#overviewMiniView').attr('width'); + const overviewHeight = $('#overviewMiniView').attr('height'); + const viewBoxX = Number.parseFloat($('#overview_window_view_box').css('left')); + const viewBoxY = Number.parseFloat($('#overview_window_view_box').css('top')); + + const portX = viewBoxX / overviewWidth * windowWidth; + const portY = viewBoxY / overviewHeight * windowHeight; + + $('#workarea').scrollLeft(portX); + $('#workarea').scrollTop(portY); + }; + $('#overview_window_view_box').draggable({ + containment: 'parent', + drag: updateViewPortFromViewBox, + start () { overviewWindowGlobals.viewBoxDragging = true; }, + stop () { overviewWindowGlobals.viewBoxDragging = false; } + }); + $('#overviewMiniView').click(function (evt) { + // Firefox doesn't support evt.offsetX and evt.offsetY. + const mouseX = (evt.offsetX || evt.originalEvent.layerX); + const mouseY = (evt.offsetY || evt.originalEvent.layerY); + const overviewWidth = $('#overviewMiniView').attr('width'); + const overviewHeight = $('#overviewMiniView').attr('height'); + const viewBoxWidth = Number.parseFloat($('#overview_window_view_box').css('min-width')); + const viewBoxHeight = Number.parseFloat($('#overview_window_view_box').css('min-height')); + + let viewBoxX = mouseX - 0.5 * viewBoxWidth; + let viewBoxY = mouseY - 0.5 * viewBoxHeight; + // deal with constraints + if (viewBoxX < 0) { + viewBoxX = 0; + } + if (viewBoxY < 0) { + viewBoxY = 0; + } + if (viewBoxX + viewBoxWidth > overviewWidth) { + viewBoxX = overviewWidth - viewBoxWidth; + } + if (viewBoxY + viewBoxHeight > overviewHeight) { + viewBoxY = overviewHeight - viewBoxHeight; + } + + $('#overview_window_view_box').css('top', viewBoxY + 'px'); + $('#overview_window_view_box').css('left', viewBoxX + 'px'); + updateViewPortFromViewBox(); + }); + + return { + name: 'overview window', + canvasUpdated: updateViewDimensions, + workareaResized: updateViewBox + }; + } +}; diff --git a/dist/extensions/ext-panning.js b/dist/extensions/ext-panning.js index 8b675fbe..2a581b75 100644 --- a/dist/extensions/ext-panning.js +++ b/dist/extensions/ext-panning.js @@ -1,122 +1,53 @@ -var svgEditorExtension_panning = (function () { - 'use strict'; - - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); +/** + * @file ext-panning.js + * + * @license MIT + * + * @copyright 2013 Luis Aguirre + * + */ +/* + This is a very basic SVG-Edit extension to let tablet/mobile devices pan without problem +*/ +export default { + name: 'panning', + async init ({importLocale}) { + const strings = await importLocale(); + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const buttons = [{ + id: 'ext-panning', + icon: svgEditor.curConfig.extIconsPath + 'panning.png', + type: 'mode', + events: { + click () { + svgCanvas.setMode('ext-panning'); } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + }]; + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'ext-panning.xml', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + mouseDown () { + if (svgCanvas.getMode() === 'ext-panning') { + svgEditor.setPanning(true); + return {started: true}; } - - _next(undefined); - }); + return undefined; + }, + mouseUp () { + if (svgCanvas.getMode() === 'ext-panning') { + svgEditor.setPanning(false); + return { + keep: false, + element: null + }; + } + return undefined; + } }; } - - /** - * @file ext-panning.js - * - * @license MIT - * - * @copyright 2013 Luis Aguirre - * - */ - - /* - This is a very basic SVG-Edit extension to let tablet/mobile devices pan without problem - */ - var extPanning = { - name: 'panning', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var importLocale, strings, svgEditor, svgCanvas, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - importLocale = _ref.importLocale; - _context.next = 3; - return importLocale(); - - case 3: - strings = _context.sent; - svgEditor = _this; - svgCanvas = svgEditor.canvas; - buttons = [{ - id: 'ext-panning', - icon: svgEditor.curConfig.extIconsPath + 'panning.png', - type: 'mode', - events: { - click: function click() { - svgCanvas.setMode('ext-panning'); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'ext-panning.xml', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - mouseDown: function mouseDown() { - if (svgCanvas.getMode() === 'ext-panning') { - svgEditor.setPanning(true); - return { - started: true - }; - } - - return undefined; - }, - mouseUp: function mouseUp() { - if (svgCanvas.getMode() === 'ext-panning') { - svgEditor.setPanning(false); - return { - keep: false, - element: null - }; - } - - return undefined; - } - }); - - case 8: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extPanning; - -}()); +}; diff --git a/dist/extensions/ext-panning.xml b/dist/extensions/ext-panning.xml new file mode 100644 index 00000000..5fa1aac4 --- /dev/null +++ b/dist/extensions/ext-panning.xml @@ -0,0 +1,6 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <g id="ext-panning"> + <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> + <path d="m8.00038,150.84583l51.60005,-51.78485l0,25.89205l26.28711,0l35.45559,-0.20444l-0.72941,-24.34613l0.93304,-37.61812l-25.79949,0l51.5997,-51.78508l51.60047,51.78508l-25.80024,0l0,33.87256l1.13677,26.21891l21.45996,2.07722l39.3497,0l0,-25.89205l51.60043,51.78485l-51.60043,51.78563l0,-25.89281l-38.41666,-0.93639l-20.52692,0.20445l-3.00285,42.13754l0,20.76308l25.80024,0l-51.60047,51.78561l-51.5997,-51.78561l25.79949,0l0,-20.76308l0.72941,-41.20115l-41.98688,-0.20445l-20.68886,0l0,25.89281l-51.60005,-51.78563z" fill="#b2b2b2" id="svg_1" stroke="#000000" stroke-width="10"/> </svg> + </g> +</svg> diff --git a/dist/extensions/ext-php_savefile.js b/dist/extensions/ext-php_savefile.js index 89052fb0..a66d747d 100644 --- a/dist/extensions/ext-php_savefile.js +++ b/dist/extensions/ext-php_savefile.js @@ -1,39 +1,30 @@ -var svgEditorExtension_php_savefile = (function () { - 'use strict'; +// TODO: Might add support for "exportImage" custom +// handler as in "ext-server_opensave.js" (and in savefile.php) - // TODO: Might add support for "exportImage" custom - // handler as in "ext-server_opensave.js" (and in savefile.php) - var extPhp_savefile = { - name: 'php_savefile', - init: function init(_ref) { - var $ = _ref.$; - var svgEditor = this; - var extPath = svgEditor.curConfig.extPath, - svgCanvas = svgEditor.canvas; - /** - * Get file name out of SVGEdit document title. - * @returns {string} - */ - - function getFileNameFromTitle() { - var title = svgCanvas.getDocumentTitle(); - return title.trim(); - } - - var saveSvgAction = extPath + 'savefile.php'; - svgEditor.setCustomHandlers({ - save: function save(win, data) { - var svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data, - filename = getFileNameFromTitle(); - $.post(saveSvgAction, { - output_svg: svg, - filename: filename - }); - } - }); +export default { + name: 'php_savefile', + init ({$}) { + const svgEditor = this; + const { + curConfig: {extPath}, + canvas: svgCanvas + } = svgEditor; + /** + * Get file name out of SVGEdit document title. + * @returns {string} + */ + function getFileNameFromTitle () { + const title = svgCanvas.getDocumentTitle(); + return title.trim(); } - }; + const saveSvgAction = extPath + 'savefile.php'; + svgEditor.setCustomHandlers({ + save (win, data) { + const svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data, + filename = getFileNameFromTitle(); - return extPhp_savefile; - -}()); + $.post(saveSvgAction, {output_svg: svg, filename}); + } + }); + } +}; diff --git a/dist/extensions/ext-placemark.js b/dist/extensions/ext-placemark.js index 46dca7cf..55d7e398 100644 --- a/dist/extensions/ext-placemark.js +++ b/dist/extensions/ext-placemark.js @@ -1,724 +1,538 @@ -var svgEditorExtension_placemark = (function () { - 'use strict'; +/** + * @file ext-placemark.js + * + * + * @copyright 2010 CloudCanvas, Inc. All rights reserved + * + */ +export default { + name: 'placemark', + async init (S) { + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const addElem = svgCanvas.addSVGElementFromJson; + const {$, importLocale} = S; // {svgcontent}, + let + selElems, + // editingitex = false, + // svgdoc = S.svgroot.parentNode.ownerDocument, + started, + newPM; + // edg = 0, + // newFOG, newFOGParent, newDef, newImageName, newMaskID, + // undoCommand = 'Not image', + // modeChangeG, ccZoom, wEl, hEl, wOffset, hOffset, ccRgbEl, brushW, brushH; + const strings = await importLocale(); + const markerTypes = { + nomarker: {}, + forwardslash: + {element: 'path', attr: {d: 'M30,100 L70,0'}}, + reverseslash: + {element: 'path', attr: {d: 'M30,0 L70,100'}}, + verticalslash: + {element: 'path', attr: {d: 'M50,0 L50,100'}}, + xmark: + {element: 'path', attr: {d: 'M20,80 L80,20 M80,80 L20,20'}}, + leftarrow: + {element: 'path', attr: {d: 'M0,50 L100,90 L70,50 L100,10 Z'}}, + rightarrow: + {element: 'path', attr: {d: 'M100,50 L0,90 L30,50 L0,10 Z'}}, + box: + {element: 'path', attr: {d: 'M20,20 L20,80 L80,80 L80,20 Z'}}, + star: + {element: 'path', attr: {d: 'M10,30 L90,30 L20,90 L50,10 L80,90 Z'}}, + mcircle: + {element: 'circle', attr: {r: 30, cx: 50, cy: 50}}, + triangle: + {element: 'path', attr: {d: 'M10,80 L50,20 L80,80 Z'}} + }; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; + // duplicate shapes to support unfilled (open) marker types with an _o suffix + ['leftarrow', 'rightarrow', 'box', 'star', 'mcircle', 'triangle'].forEach((v) => { + markerTypes[v + '_o'] = markerTypes[v]; + }); + + /** + * + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + $('#placemark_panel').toggle(on); } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); + /** + * @param {Element} elem - A graphic element will have an attribute like marker-start + * @param {"marker-start"|"marker-mid"|"marker-end"} attr + * @returns {Element} The marker element that is linked to the graphic element + */ + function getLinked (elem, attr) { + if (!elem) { return null; } + const str = elem.getAttribute(attr); + if (!str) { return null; } + + // const m = str.match(/\(#(?<id>.+)\)/); + // if (!m || !m.groups.id) { + const m = str.match(/\(#(.*)\)/); + if (!m || m.length !== 2) { + return null; + } + return svgCanvas.getElem(m[1]); + // return svgCanvas.getElem(m.groups.id); } - } - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /** + * Called when text is changed. + * @param {string} txt + * @returns {void} + */ + function updateText (txt) { + const items = txt.split(';'); + selElems.forEach((elem) => { + if (elem && elem.getAttribute('class').includes('placemark')) { + $(elem).children().each((_, i) => { + const [, , type, n] = i.id.split('_'); + if (type === 'txt') { + $(i).text(items[n]); + } + }); } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); }); + } + /** + * Called when font is changed. + * @param {string} font + * @returns {void} + */ + function updateFont (font) { + font = font.split(' '); + const fontSize = Number.parseInt(font.pop()); + font = font.join(' '); + selElems.forEach((elem) => { + if (elem && elem.getAttribute('class').includes('placemark')) { + $(elem).children().each((_, i) => { + const [, , type] = i.id.split('_'); + if (type === 'txt') { + $(i).attr({'font-family': font, 'font-size': fontSize}); + } + }); + } + }); + } + /** + * @param {string} id + * @param {""|"\\nomarker"|"nomarker"|"leftarrow"|"rightarrow"|"textmarker"|"textmarker_top"|"textmarker_bottom"|"forwardslash"|"reverseslash"|"verticalslash"|"box"|"star"|"xmark"|"triangle"|"mcircle"} val + * @returns {SVGMarkerElement} + */ + function addMarker (id, val) { + let marker = svgCanvas.getElem(id); + if (marker) { return undefined; } + // console.log(id); + if (val === '' || val === 'nomarker') { return undefined; } + const color = svgCanvas.getColor('stroke'); + // NOTE: Safari didn't like a negative value in viewBox + // so we use a standardized 0 0 100 100 + // with 50 50 being mapped to the marker position + const scale = 2;// parseFloat($('#marker_size').val()); + const strokeWidth = 10; + let refX = 50; + const refY = 50; + const viewBox = '0 0 100 100'; + const markerWidth = 5 * scale; + const markerHeight = 5 * scale; + const seType = val; + + if (!markerTypes[seType]) { return undefined; } // an unknown type! + // positional markers(arrows) at end of line + if (seType.includes('left')) refX = 0; + if (seType.includes('right')) refX = 100; + + // create a generic marker + marker = addElem({ + element: 'marker', + attr: { + id, + markerUnits: 'strokeWidth', + orient: 'auto', + style: 'pointer-events:none', + class: seType + } + }); + + const mel = addElem(markerTypes[seType]); + const fillcolor = (seType.substr(-2) === '_o') + ? 'none' + : color; + + mel.setAttribute('fill', fillcolor); + mel.setAttribute('stroke', color); + mel.setAttribute('stroke-width', strokeWidth); + marker.append(mel); + + marker.setAttribute('viewBox', viewBox); + marker.setAttribute('markerWidth', markerWidth); + marker.setAttribute('markerHeight', markerHeight); + marker.setAttribute('refX', refX); + marker.setAttribute('refY', refY); + svgCanvas.findDefs().append(marker); + + return marker; + } + /** + * @param {Element} el + * @param {string} val + * @returns {void} + */ + function setMarker (el, val) { + const markerName = 'marker-start'; + const marker = getLinked(el, markerName); + if (marker) { $(marker).remove(); } + el.removeAttribute(markerName); + if (val === 'nomarker') { + svgCanvas.call('changed', [el]); + return; + } + // Set marker on element + const id = 'placemark_marker_' + el.id; + addMarker(id, val); + el.setAttribute(markerName, 'url(#' + id + ')'); + svgCanvas.call('changed', [el]); + } + + /** + * Called when the main system modifies an object. This routine changes + * the associated markers to be the same color. + * @param {Element} el + * @returns {void} + */ + function colorChanged (el) { + const color = el.getAttribute('stroke'); + const marker = getLinked(el, 'marker-start'); + // console.log(marker); + if (!marker) { return; } + if (!marker.attributes.class) { return; } // not created by this extension + const ch = marker.lastElementChild; + if (!ch) { return; } + const curfill = ch.getAttribute('fill'); + const curstroke = ch.getAttribute('stroke'); + if (curfill && curfill !== 'none') { ch.setAttribute('fill', color); } + if (curstroke && curstroke !== 'none') { ch.setAttribute('stroke', color); } + } + + /** + * Called when the main system creates or modifies an object. + * Its primary purpose is to create new markers for cloned objects. + * @param {Element} el + * @returns {void} + */ + function updateReferences (el) { + const id = 'placemark_marker_' + el.id; + const markerName = 'marker-start'; + const marker = getLinked(el, markerName); + if (!marker || !marker.attributes.class) { return; } // not created by this extension + const url = el.getAttribute(markerName); + if (url) { + const len = el.id.length; + const linkid = url.substr(-len - 1, len); + if (el.id !== linkid) { + const val = $('#placemark_marker').attr('value') || 'leftarrow'; + addMarker(id, val); + svgCanvas.changeSelectedAttribute(markerName, 'url(#' + id + ')'); + svgCanvas.call('changed', selElems); + } + } + } + /** + * @param {Event} ev + * @returns {void} + */ + function setArrowFromButton (ev) { + const parts = this.id.split('_'); + let val = parts[2]; + if (parts[3]) { val += '_' + parts[3]; } + $('#placemark_marker').attr('value', val); + } + + /** + * @param {"nomarker"|"leftarrow"|"rightarrow"|"textmarker"|"forwardslash"|"reverseslash"|"verticalslash"|"box"|"star"|"xmark"|"triangle"|"mcircle"} id + * @returns {string} + */ + function getTitle (id) { + const {langList} = strings; + const item = langList.find((itm) => { + return itm.id === id; + }); + return item ? item.title : id; + } + + /** + * Build the toolbar button array from the marker definitions. + * @param {module:SVGEditor.Button[]} buttons + * @returns {module:SVGEditor.Button[]} + */ + function addMarkerButtons (buttons) { + Object.keys(markerTypes).forEach(function (id) { + const title = getTitle(String(id)); + buttons.push({ + id: 'placemark_marker_' + id, + svgicon: id, + icon: svgEditor.curConfig.extIconsPath + 'markers-' + id + '.png', + title, + type: 'context', + events: {click: setArrowFromButton}, + panel: 'placemark_panel', + list: 'placemark_marker', + isDefault: id === 'leftarrow' + }); + }); + return buttons; + } + + const buttons = [{ + id: 'tool_placemark', + icon: svgEditor.curConfig.extIconsPath + 'placemark.png', + type: 'mode', + position: 12, + events: { + click () { + showPanel(true); + svgCanvas.setMode('placemark'); + } + } + }]; + const contextTools = [ + { + type: 'button-select', + panel: 'placemark_panel', + id: 'placemark_marker', + colnum: 3, + events: {change: setArrowFromButton} + }, + { + type: 'input', + panel: 'placemark_panel', + id: 'placemarkText', + size: 20, + defval: '', + events: { + change () { + updateText(this.value); + } + } + }, { + type: 'input', + panel: 'placemark_panel', + id: 'placemarkFont', + size: 7, + defval: 'Arial 10', + events: { + change () { + updateFont(this.value); + } + } + } + ]; + + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'placemark-icons.xml', + buttons: addMarkerButtons(strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + })), + context_tools: strings.contextTools.map((contextTool, i) => { + return Object.assign(contextTools[i], contextTool); + }), + callback () { + $('#placemark_panel').hide(); + // const endChanges = function(){}; + }, + mouseDown (opts) { + // const rgb = svgCanvas.getColor('fill'); + const sRgb = svgCanvas.getColor('stroke'); + const sWidth = svgCanvas.getStrokeWidth(); + + if (svgCanvas.getMode() === 'placemark') { + started = true; + const id = svgCanvas.getNextId(); + const items = $('#placemarkText').val().split(';'); + let font = $('#placemarkFont').val().split(' '); + const fontSize = Number.parseInt(font.pop()); + font = font.join(' '); + const x0 = opts.start_x + 10, y0 = opts.start_y + 10; + let maxlen = 0; + const children = [{ + element: 'line', + attr: { + id: id + '_pline_0', + fill: 'none', + stroke: sRgb, + 'stroke-width': sWidth, + 'stroke-linecap': 'round', + x1: opts.start_x, + y1: opts.start_y, + x2: x0, + y2: y0 + } + }]; + items.forEach((i, n) => { + maxlen = Math.max(maxlen, i.length); + children.push({ + element: 'line', + attr: { + id: id + '_tline_' + n, + fill: 'none', + stroke: sRgb, + 'stroke-width': sWidth, + 'stroke-linecap': 'round', + x1: x0, + y1: y0 + (fontSize + 6) * n, + x2: x0 + i.length * fontSize * 0.5 + fontSize, + y2: y0 + (fontSize + 6) * n + } + }); + children.push({ + element: 'text', + attr: { + id: id + '_txt_' + n, + fill: sRgb, + stroke: 'none', + 'stroke-width': 0, + x: x0 + 3, + y: y0 - 3 + (fontSize + 6) * n, + 'font-family': font, + 'font-size': fontSize, + 'text-anchor': 'start' + }, + children: [i] + }); + }); + if (items.length > 0) { + children.push({ + element: 'line', + attr: { + id: id + '_vline_0', + fill: 'none', + stroke: sRgb, + 'stroke-width': sWidth, + 'stroke-linecap': 'round', + x1: x0, + y1: y0, + x2: x0, + y2: y0 + (fontSize + 6) * (items.length - 1) + } + }); + } + newPM = svgCanvas.addSVGElementFromJson({ + element: 'g', + attr: { + id, + class: 'placemark', + fontSize, + maxlen, + lines: items.length, + x: opts.start_x, + y: opts.start_y, + px: opts.start_x, + py: opts.start_y + }, + children + }); + setMarker( + newPM.firstElementChild, + $('#placemark_marker').attr('value') || 'leftarrow' + ); + return { + started: true + }; + } + return undefined; + }, + mouseMove (opts) { + if (!started) { + return undefined; + } + if (svgCanvas.getMode() === 'placemark') { + const x = opts.mouse_x / svgCanvas.getZoom(); + const y = opts.mouse_y / svgCanvas.getZoom(); + const {fontSize, maxlen, lines, px, py} = $(newPM).attr( + ['fontSize', 'maxlen', 'lines', 'px', 'py'] + ); + $(newPM).attr({x, y}); + $(newPM).children().each((_, i) => { + const [, , type, n] = i.id.split('_'); + const y0 = y + (fontSize + 6) * n, + x0 = x + maxlen * fontSize * 0.5 + fontSize; + const nx = (x + (x0 - x) / 2 < px) ? x0 : x; + const ny = (y + ((fontSize + 6) * (lines - 1)) / 2 < py) + ? y + (fontSize + 6) * (lines - 1) + : y; + if (type === 'pline') { + i.setAttribute('x2', nx); + i.setAttribute('y2', ny); + } + if (type === 'tline') { + i.setAttribute('x1', x); + i.setAttribute('y1', y0); + i.setAttribute('x2', x0); + i.setAttribute('y2', y0); + } + if (type === 'vline') { + i.setAttribute('x1', nx); + i.setAttribute('y1', y); + i.setAttribute('x2', nx); + i.setAttribute('y2', y + (fontSize + 6) * (lines - 1)); + } + if (type === 'txt') { + i.setAttribute('x', x + fontSize / 2); + i.setAttribute('y', y0 - 3); + } + }); + return { + started: true + }; + } + return undefined; + }, + mouseUp () { + if (svgCanvas.getMode() === 'placemark') { + const {x, y, px, py} = $(newPM).attr(['x', 'y', 'px', 'py']); + return { + keep: (x != px && y != py), // eslint-disable-line eqeqeq + element: newPM + }; + } + return undefined; + }, + selectedChanged (opts) { + // Use this to update the current selected elements + selElems = opts.elems; + selElems.forEach((elem) => { + if (elem && elem.getAttribute('class').includes('placemark')) { + const txt = []; + $(elem).children().each((n, i) => { + const [, , type] = i.id.split('_'); + if (type === 'txt') { + $('#placemarkFont').val( + i.getAttribute('font-family') + ' ' + i.getAttribute('font-size') + ); + txt.push($(i).text()); + } + }); + $('#placemarkText').val(txt.join(';')); + showPanel(true); + } else { + showPanel(false); + } + }); + }, + elementChanged (opts) { + opts.elems.forEach((elem) => { + if (elem.id.includes('pline_0')) { // need update marker of pline_0 + colorChanged(elem); + updateReferences(elem); + } + }); + } }; } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * @file ext-placemark.js - * - * - * @copyright 2010 CloudCanvas, Inc. All rights reserved - * - */ - var extPlacemark = { - name: 'placemark', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var svgEditor, svgCanvas, addElem, $, importLocale, selElems, started, newPM, strings, markerTypes, showPanel, getLinked, updateText, updateFont, addMarker, setMarker, colorChanged, updateReferences, setArrowFromButton, getTitle, addMarkerButtons, buttons, contextTools; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - addMarkerButtons = function _addMarkerButtons(buttons) { - Object.keys(markerTypes).forEach(function (id) { - var title = getTitle(String(id)); - buttons.push({ - id: 'placemark_marker_' + id, - svgicon: id, - icon: svgEditor.curConfig.extIconsPath + 'markers-' + id + '.png', - title: title, - type: 'context', - events: { - click: setArrowFromButton - }, - panel: 'placemark_panel', - list: 'placemark_marker', - isDefault: id === 'leftarrow' - }); - }); - return buttons; - }; - - getTitle = function _getTitle(id) { - var langList = strings.langList; - var item = langList.find(function (itm) { - return itm.id === id; - }); - return item ? item.title : id; - }; - - setArrowFromButton = function _setArrowFromButton(ev) { - var parts = this.id.split('_'); - var val = parts[2]; - - if (parts[3]) { - val += '_' + parts[3]; - } - - $('#placemark_marker').attr('value', val); - }; - - updateReferences = function _updateReferences(el) { - var id = 'placemark_marker_' + el.id; - var markerName = 'marker-start'; - var marker = getLinked(el, markerName); - - if (!marker || !marker.attributes["class"]) { - return; - } // not created by this extension - - - var url = el.getAttribute(markerName); - - if (url) { - var len = el.id.length; - var linkid = url.substr(-len - 1, len); - - if (el.id !== linkid) { - var val = $('#placemark_marker').attr('value') || 'leftarrow'; - addMarker(id, val); - svgCanvas.changeSelectedAttribute(markerName, 'url(#' + id + ')'); - svgCanvas.call('changed', selElems); - } - } - }; - - colorChanged = function _colorChanged(el) { - var color = el.getAttribute('stroke'); - var marker = getLinked(el, 'marker-start'); // console.log(marker); - - if (!marker) { - return; - } - - if (!marker.attributes["class"]) { - return; - } // not created by this extension - - - var ch = marker.lastElementChild; - - if (!ch) { - return; - } - - var curfill = ch.getAttribute('fill'); - var curstroke = ch.getAttribute('stroke'); - - if (curfill && curfill !== 'none') { - ch.setAttribute('fill', color); - } - - if (curstroke && curstroke !== 'none') { - ch.setAttribute('stroke', color); - } - }; - - setMarker = function _setMarker(el, val) { - var markerName = 'marker-start'; - var marker = getLinked(el, markerName); - - if (marker) { - $(marker).remove(); - } - - el.removeAttribute(markerName); - - if (val === 'nomarker') { - svgCanvas.call('changed', [el]); - return; - } // Set marker on element - - - var id = 'placemark_marker_' + el.id; - addMarker(id, val); - el.setAttribute(markerName, 'url(#' + id + ')'); - svgCanvas.call('changed', [el]); - }; - - addMarker = function _addMarker(id, val) { - var marker = svgCanvas.getElem(id); - - if (marker) { - return undefined; - } // console.log(id); - - - if (val === '' || val === 'nomarker') { - return undefined; - } - - var color = svgCanvas.getColor('stroke'); // NOTE: Safari didn't like a negative value in viewBox - // so we use a standardized 0 0 100 100 - // with 50 50 being mapped to the marker position - - var scale = 2; // parseFloat($('#marker_size').val()); - - var strokeWidth = 10; - var refX = 50; - var refY = 50; - var viewBox = '0 0 100 100'; - var markerWidth = 5 * scale; - var markerHeight = 5 * scale; - var seType = val; - - if (!markerTypes[seType]) { - return undefined; - } // an unknown type! - // positional markers(arrows) at end of line - - - if (seType.includes('left')) refX = 0; - if (seType.includes('right')) refX = 100; // create a generic marker - - marker = addElem({ - element: 'marker', - attr: { - id: id, - markerUnits: 'strokeWidth', - orient: 'auto', - style: 'pointer-events:none', - "class": seType - } - }); - var mel = addElem(markerTypes[seType]); - var fillcolor = seType.substr(-2) === '_o' ? 'none' : color; - mel.setAttribute('fill', fillcolor); - mel.setAttribute('stroke', color); - mel.setAttribute('stroke-width', strokeWidth); - marker.append(mel); - marker.setAttribute('viewBox', viewBox); - marker.setAttribute('markerWidth', markerWidth); - marker.setAttribute('markerHeight', markerHeight); - marker.setAttribute('refX', refX); - marker.setAttribute('refY', refY); - svgCanvas.findDefs().append(marker); - return marker; - }; - - updateFont = function _updateFont(font) { - font = font.split(' '); - var fontSize = Number.parseInt(font.pop()); - font = font.join(' '); - selElems.forEach(function (elem) { - if (elem && elem.getAttribute('class').includes('placemark')) { - $(elem).children().each(function (_, i) { - var _i$id$split3 = i.id.split('_'), - _i$id$split4 = _slicedToArray(_i$id$split3, 3), - type = _i$id$split4[2]; - - if (type === 'txt') { - $(i).attr({ - 'font-family': font, - 'font-size': fontSize - }); - } - }); - } - }); - }; - - updateText = function _updateText(txt) { - var items = txt.split(';'); - selElems.forEach(function (elem) { - if (elem && elem.getAttribute('class').includes('placemark')) { - $(elem).children().each(function (_, i) { - var _i$id$split = i.id.split('_'), - _i$id$split2 = _slicedToArray(_i$id$split, 4), - type = _i$id$split2[2], - n = _i$id$split2[3]; - - if (type === 'txt') { - $(i).text(items[n]); - } - }); - } - }); - }; - - getLinked = function _getLinked(elem, attr) { - if (!elem) { - return null; - } - - var str = elem.getAttribute(attr); - - if (!str) { - return null; - } // const m = str.match(/\(#(?<id>.+)\)/); - // if (!m || !m.groups.id) { - - - var m = str.match(/\(#(.*)\)/); - - if (!m || m.length !== 2) { - return null; - } - - return svgCanvas.getElem(m[1]); // return svgCanvas.getElem(m.groups.id); - }; - - showPanel = function _showPanel(on) { - $('#placemark_panel').toggle(on); - }; - - svgEditor = _this; - svgCanvas = svgEditor.canvas; - addElem = svgCanvas.addSVGElementFromJson; - $ = S.$, importLocale = S.importLocale; // {svgcontent}, - - _context.next = 17; - return importLocale(); - - case 17: - strings = _context.sent; - markerTypes = { - nomarker: {}, - forwardslash: { - element: 'path', - attr: { - d: 'M30,100 L70,0' - } - }, - reverseslash: { - element: 'path', - attr: { - d: 'M30,0 L70,100' - } - }, - verticalslash: { - element: 'path', - attr: { - d: 'M50,0 L50,100' - } - }, - xmark: { - element: 'path', - attr: { - d: 'M20,80 L80,20 M80,80 L20,20' - } - }, - leftarrow: { - element: 'path', - attr: { - d: 'M0,50 L100,90 L70,50 L100,10 Z' - } - }, - rightarrow: { - element: 'path', - attr: { - d: 'M100,50 L0,90 L30,50 L0,10 Z' - } - }, - box: { - element: 'path', - attr: { - d: 'M20,20 L20,80 L80,80 L80,20 Z' - } - }, - star: { - element: 'path', - attr: { - d: 'M10,30 L90,30 L20,90 L50,10 L80,90 Z' - } - }, - mcircle: { - element: 'circle', - attr: { - r: 30, - cx: 50, - cy: 50 - } - }, - triangle: { - element: 'path', - attr: { - d: 'M10,80 L50,20 L80,80 Z' - } - } - }; // duplicate shapes to support unfilled (open) marker types with an _o suffix - - ['leftarrow', 'rightarrow', 'box', 'star', 'mcircle', 'triangle'].forEach(function (v) { - markerTypes[v + '_o'] = markerTypes[v]; - }); - /** - * - * @param {boolean} on - * @returns {void} - */ - - buttons = [{ - id: 'tool_placemark', - icon: svgEditor.curConfig.extIconsPath + 'placemark.png', - type: 'mode', - position: 12, - events: { - click: function click() { - showPanel(true); - svgCanvas.setMode('placemark'); - } - } - }]; - contextTools = [{ - type: 'button-select', - panel: 'placemark_panel', - id: 'placemark_marker', - colnum: 3, - events: { - change: setArrowFromButton - } - }, { - type: 'input', - panel: 'placemark_panel', - id: 'placemarkText', - size: 20, - defval: '', - events: { - change: function change() { - updateText(this.value); - } - } - }, { - type: 'input', - panel: 'placemark_panel', - id: 'placemarkFont', - size: 7, - defval: 'Arial 10', - events: { - change: function change() { - updateFont(this.value); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'placemark-icons.xml', - buttons: addMarkerButtons(strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - })), - context_tools: strings.contextTools.map(function (contextTool, i) { - return Object.assign(contextTools[i], contextTool); - }), - callback: function callback() { - $('#placemark_panel').hide(); // const endChanges = function(){}; - }, - mouseDown: function mouseDown(opts) { - // const rgb = svgCanvas.getColor('fill'); - var sRgb = svgCanvas.getColor('stroke'); - var sWidth = svgCanvas.getStrokeWidth(); - - if (svgCanvas.getMode() === 'placemark') { - started = true; - var id = svgCanvas.getNextId(); - var items = $('#placemarkText').val().split(';'); - var font = $('#placemarkFont').val().split(' '); - var fontSize = Number.parseInt(font.pop()); - font = font.join(' '); - var x0 = opts.start_x + 10, - y0 = opts.start_y + 10; - var maxlen = 0; - var children = [{ - element: 'line', - attr: { - id: id + '_pline_0', - fill: 'none', - stroke: sRgb, - 'stroke-width': sWidth, - 'stroke-linecap': 'round', - x1: opts.start_x, - y1: opts.start_y, - x2: x0, - y2: y0 - } - }]; - items.forEach(function (i, n) { - maxlen = Math.max(maxlen, i.length); - children.push({ - element: 'line', - attr: { - id: id + '_tline_' + n, - fill: 'none', - stroke: sRgb, - 'stroke-width': sWidth, - 'stroke-linecap': 'round', - x1: x0, - y1: y0 + (fontSize + 6) * n, - x2: x0 + i.length * fontSize * 0.5 + fontSize, - y2: y0 + (fontSize + 6) * n - } - }); - children.push({ - element: 'text', - attr: { - id: id + '_txt_' + n, - fill: sRgb, - stroke: 'none', - 'stroke-width': 0, - x: x0 + 3, - y: y0 - 3 + (fontSize + 6) * n, - 'font-family': font, - 'font-size': fontSize, - 'text-anchor': 'start' - }, - children: [i] - }); - }); - - if (items.length > 0) { - children.push({ - element: 'line', - attr: { - id: id + '_vline_0', - fill: 'none', - stroke: sRgb, - 'stroke-width': sWidth, - 'stroke-linecap': 'round', - x1: x0, - y1: y0, - x2: x0, - y2: y0 + (fontSize + 6) * (items.length - 1) - } - }); - } - - newPM = svgCanvas.addSVGElementFromJson({ - element: 'g', - attr: { - id: id, - "class": 'placemark', - fontSize: fontSize, - maxlen: maxlen, - lines: items.length, - x: opts.start_x, - y: opts.start_y, - px: opts.start_x, - py: opts.start_y - }, - children: children - }); - setMarker(newPM.firstElementChild, $('#placemark_marker').attr('value') || 'leftarrow'); - return { - started: true - }; - } - - return undefined; - }, - mouseMove: function mouseMove(opts) { - if (!started) { - return undefined; - } - - if (svgCanvas.getMode() === 'placemark') { - var x = opts.mouse_x / svgCanvas.getZoom(); - var y = opts.mouse_y / svgCanvas.getZoom(); - - var _$$attr = $(newPM).attr(['fontSize', 'maxlen', 'lines', 'px', 'py']), - fontSize = _$$attr.fontSize, - maxlen = _$$attr.maxlen, - lines = _$$attr.lines, - px = _$$attr.px, - py = _$$attr.py; - - $(newPM).attr({ - x: x, - y: y - }); - $(newPM).children().each(function (_, i) { - var _i$id$split5 = i.id.split('_'), - _i$id$split6 = _slicedToArray(_i$id$split5, 4), - type = _i$id$split6[2], - n = _i$id$split6[3]; - - var y0 = y + (fontSize + 6) * n, - x0 = x + maxlen * fontSize * 0.5 + fontSize; - var nx = x + (x0 - x) / 2 < px ? x0 : x; - var ny = y + (fontSize + 6) * (lines - 1) / 2 < py ? y + (fontSize + 6) * (lines - 1) : y; - - if (type === 'pline') { - i.setAttribute('x2', nx); - i.setAttribute('y2', ny); - } - - if (type === 'tline') { - i.setAttribute('x1', x); - i.setAttribute('y1', y0); - i.setAttribute('x2', x0); - i.setAttribute('y2', y0); - } - - if (type === 'vline') { - i.setAttribute('x1', nx); - i.setAttribute('y1', y); - i.setAttribute('x2', nx); - i.setAttribute('y2', y + (fontSize + 6) * (lines - 1)); - } - - if (type === 'txt') { - i.setAttribute('x', x + fontSize / 2); - i.setAttribute('y', y0 - 3); - } - }); - return { - started: true - }; - } - - return undefined; - }, - mouseUp: function mouseUp() { - if (svgCanvas.getMode() === 'placemark') { - var _$$attr2 = $(newPM).attr(['x', 'y', 'px', 'py']), - x = _$$attr2.x, - y = _$$attr2.y, - px = _$$attr2.px, - py = _$$attr2.py; - - return { - keep: x != px && y != py, - // eslint-disable-line eqeqeq - element: newPM - }; - } - - return undefined; - }, - selectedChanged: function selectedChanged(opts) { - // Use this to update the current selected elements - selElems = opts.elems; - selElems.forEach(function (elem) { - if (elem && elem.getAttribute('class').includes('placemark')) { - var txt = []; - $(elem).children().each(function (n, i) { - var _i$id$split7 = i.id.split('_'), - _i$id$split8 = _slicedToArray(_i$id$split7, 3), - type = _i$id$split8[2]; - - if (type === 'txt') { - $('#placemarkFont').val(i.getAttribute('font-family') + ' ' + i.getAttribute('font-size')); - txt.push($(i).text()); - } - }); - $('#placemarkText').val(txt.join(';')); - showPanel(true); - } else { - showPanel(false); - } - }); - }, - elementChanged: function elementChanged(opts) { - opts.elems.forEach(function (elem) { - if (elem.id.includes('pline_0')) { - // need update marker of pline_0 - colorChanged(elem); - updateReferences(elem); - } - }); - } - }); - - case 23: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extPlacemark; - -}()); +}; diff --git a/dist/extensions/ext-polygon.js b/dist/extensions/ext-polygon.js index 37aa3a62..7968fca9 100644 --- a/dist/extensions/ext-polygon.js +++ b/dist/extensions/ext-polygon.js @@ -1,309 +1,309 @@ -var svgEditorExtension_polygon = (function () { - 'use strict'; +/** + * @file ext-polygon.js + * + * + * @copyright 2010 CloudCanvas, Inc. All rights reserved + * + */ +export default { + name: 'polygon', + async init (S) { + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const {$, importLocale} = S, // {svgcontent} + // addElem = svgCanvas.addSVGElementFromJson, + editingitex = false; + const strings = await importLocale(); + let selElems, + // svgdoc = S.svgroot.parentNode.ownerDocument, + // newFOG, newFOGParent, newDef, newImageName, newMaskID, modeChangeG, + // edg = 0, + // undoCommand = 'Not image'; + started, newFO; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; + // const ccZoom; + // const wEl, hEl; + // const wOffset, hOffset; + // const ccRBG; + // const ccOpacity; + // const brushW, brushH; + + // const ccDebug = document.getElementById('debugpanel'); + + /* const properlySourceSizeTextArea = function(){ + // TODO: remove magic numbers here and get values from CSS + const height = $('#svg_source_container').height() - 80; + $('#svg_source_textarea').css('height', height); + }; */ + + /** + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + let fcRules = $('#fc_rules'); + if (!fcRules.length) { + fcRules = $('<style id="fc_rules"></style>').appendTo('head'); + } + fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); + $('#polygon_panel').toggle(on); } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); + /* + function toggleSourceButtons(on){ + $('#tool_source_save, #tool_source_cancel').toggle(!on); + $('#polygon_save, #polygon_cancel').toggle(on); } - } + */ - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + /** + * @param {string} attr + * @param {string|Float} val + * @returns {void} + */ + function setAttr (attr, val) { + svgCanvas.changeSelectedAttribute(attr, val); + svgCanvas.call('changed', selElems); + } - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /** + * @param {Float} n + * @returns {Float} + */ + function cot (n) { + return 1 / Math.tan(n); + } + + /** + * @param {Float} n + * @returns {Float} + */ + function sec (n) { + return 1 / Math.cos(n); + } + + /** + * Obtained from http://code.google.com/p/passenger-top/source/browse/instiki/public/svg-edit/editor/extensions/ext-itex.js?r=3 + * This function sets the content of of the currently-selected foreignObject element, + * based on the itex contained in string. + * @param {string} tex The itex text. + * @returns {boolean} This function returns false if the set was unsuccessful, true otherwise. + */ + /* + function setItexString(tex) { + const mathns = 'http://www.w3.org/1998/Math/MathML', + xmlnsns = 'http://www.w3.org/2000/xmlns/', + ajaxEndpoint = '../../itex'; + const elt = selElems[0]; + try { + const math = svgdoc.createElementNS(mathns, 'math'); + math.setAttributeNS(xmlnsns, 'xmlns', mathns); + math.setAttribute('display', 'inline'); + const semantics = document.createElementNS(mathns, 'semantics'); + const annotation = document.createElementNS(mathns, 'annotation'); + annotation.setAttribute('encoding', 'application/x-tex'); + annotation.textContent = tex; + const mrow = document.createElementNS(mathns, 'mrow'); + semantics.append(mrow, annotation); + math.append(semantics); + // make an AJAX request to the server, to get the MathML + $.post(ajaxEndpoint, {tex, display: 'inline'}, function(data){ + const children = data.documentElement.childNodes; + while (children.length > 0) { + mrow.append(svgdoc.adoptNode(children[0], true)); + } + svgCanvas.sanitizeSvg(math); + svgCanvas.call('changed', [elt]); + }); + elt.firstChild.replaceWith(math); + svgCanvas.call('changed', [elt]); + svgCanvas.clearSelection(); + } catch(e) { + console.log(e); + return false; + } + + return true; + } + */ + const buttons = [{ + id: 'tool_polygon', + icon: svgEditor.curConfig.extIconsPath + 'polygon.png', + type: 'mode', + position: 11, + events: { + click () { + svgCanvas.setMode('polygon'); + showPanel(true); + } + } + }]; + const contextTools = [{ + type: 'input', + panel: 'polygon_panel', + id: 'polySides', + size: 3, + defval: 5, + events: { + change () { + setAttr('sides', this.value); + } + } + }]; + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'polygon-icons.svg', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + context_tools: strings.contextTools.map((contextTool, i) => { + return Object.assign(contextTools[i], contextTool); + }), + + callback () { + $('#polygon_panel').hide(); + + const endChanges = function () { + // Todo: Missing? + }; + + // TODO: Needs to be done after orig icon loads + setTimeout(function () { + // Create source save/cancel buttons + /* const save = */ $('#tool_source_save').clone().hide().attr( + 'id', 'polygon_save' + ).unbind().appendTo( + '#tool_source_back' + ).click(function () { + if (!editingitex) { + return; + } + // Todo: Uncomment the setItexString() function above and handle ajaxEndpoint? + /* + if (!setItexString($('#svg_source_textarea').val())) { + const ok = await $.confirm('Errors found. Revert to original?', function (ok) { + if (!ok) { + return false; + } + endChanges(); + } else { */ + endChanges(); + // } + // setSelectMode(); + }); + + /* const cancel = */ $('#tool_source_cancel').clone().hide().attr( + 'id', 'polygon_cancel' + ).unbind().appendTo('#tool_source_back').click(function () { + endChanges(); + }); + }, 3000); + }, + mouseDown (opts) { + if (svgCanvas.getMode() !== 'polygon') { + return undefined; + } + // const e = opts.event; + const rgb = svgCanvas.getColor('fill'); + // const ccRgbEl = rgb.substring(1, rgb.length); + const sRgb = svgCanvas.getColor('stroke'); + // ccSRgbEl = sRgb.substring(1, rgb.length); + const sWidth = svgCanvas.getStrokeWidth(); + + started = true; + + newFO = svgCanvas.addSVGElementFromJson({ + element: 'polygon', + attr: { + cx: opts.start_x, + cy: opts.start_y, + id: svgCanvas.getNextId(), + shape: 'regularPoly', + sides: document.getElementById('polySides').value, + orient: 'x', + edge: 0, + fill: rgb, + strokecolor: sRgb, + strokeWidth: sWidth + } + }); + + return { + started: true + }; + }, + mouseMove (opts) { + if (!started || svgCanvas.getMode() !== 'polygon') { + return undefined; + } + // const e = opts.event; + const c = $(newFO).attr(['cx', 'cy', 'sides', 'orient', 'fill', 'strokecolor', 'strokeWidth']); + let x = opts.mouse_x; + let y = opts.mouse_y; + const {cx, cy, fill, strokecolor, strokeWidth, sides} = c, // {orient} = c, + edg = (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy))) / 1.5; + newFO.setAttribute('edge', edg); + + const inradius = (edg / 2) * cot(Math.PI / sides); + const circumradius = inradius * sec(Math.PI / sides); + let points = ''; + for (let s = 0; sides >= s; s++) { + const angle = 2.0 * Math.PI * s / sides; + x = (circumradius * Math.cos(angle)) + cx; + y = (circumradius * Math.sin(angle)) + cy; + + points += x + ',' + y + ' '; } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } + // const poly = newFO.createElementNS(NS.SVG, 'polygon'); + newFO.setAttribute('points', points); + newFO.setAttribute('fill', fill); + newFO.setAttribute('stroke', strokecolor); + newFO.setAttribute('stroke-width', strokeWidth); + // newFO.setAttribute('transform', 'rotate(-90)'); + // const shape = newFO.getAttribute('shape'); + // newFO.append(poly); + // DrawPoly(cx, cy, sides, edg, orient); + return { + started: true + }; + }, - _next(undefined); - }); + mouseUp (opts) { + if (svgCanvas.getMode() !== 'polygon') { + return undefined; + } + const attrs = $(newFO).attr('edge'); + const keep = (attrs.edge !== '0'); + // svgCanvas.addToSelection([newFO], true); + return { + keep, + element: newFO + }; + }, + selectedChanged (opts) { + // Use this to update the current selected elements + selElems = opts.elems; + + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && elem.getAttribute('shape') === 'regularPoly') { + if (opts.selectedElement && !opts.multiselected) { + $('#polySides').val(elem.getAttribute('sides')); + + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + }, + elementChanged (opts) { + // const elem = opts.elems[0]; + } }; } - - /** - * @file ext-polygon.js - * - * - * @copyright 2010 CloudCanvas, Inc. All rights reserved - * - */ - var extPolygon = { - name: 'polygon', - init: function init(S) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var svgEditor, svgCanvas, $, importLocale, editingitex, strings, selElems, started, newFO, showPanel, setAttr, cot, sec, buttons, contextTools; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - sec = function _sec(n) { - return 1 / Math.cos(n); - }; - - cot = function _cot(n) { - return 1 / Math.tan(n); - }; - - setAttr = function _setAttr(attr, val) { - svgCanvas.changeSelectedAttribute(attr, val); - svgCanvas.call('changed', selElems); - }; - - showPanel = function _showPanel(on) { - var fcRules = $('#fc_rules'); - - if (!fcRules.length) { - fcRules = $('<style id="fc_rules"></style>').appendTo('head'); - } - - fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); - $('#polygon_panel').toggle(on); - }; - - svgEditor = _this; - svgCanvas = svgEditor.canvas; - $ = S.$, importLocale = S.importLocale, editingitex = false; - _context.next = 9; - return importLocale(); - - case 9: - strings = _context.sent; - - /** - * Obtained from http://code.google.com/p/passenger-top/source/browse/instiki/public/svg-edit/editor/extensions/ext-itex.js?r=3 - * This function sets the content of of the currently-selected foreignObject element, - * based on the itex contained in string. - * @param {string} tex The itex text. - * @returns {boolean} This function returns false if the set was unsuccessful, true otherwise. - */ - - /* - function setItexString(tex) { - const mathns = 'http://www.w3.org/1998/Math/MathML', - xmlnsns = 'http://www.w3.org/2000/xmlns/', - ajaxEndpoint = '../../itex'; - const elt = selElems[0]; - try { - const math = svgdoc.createElementNS(mathns, 'math'); - math.setAttributeNS(xmlnsns, 'xmlns', mathns); - math.setAttribute('display', 'inline'); - const semantics = document.createElementNS(mathns, 'semantics'); - const annotation = document.createElementNS(mathns, 'annotation'); - annotation.setAttribute('encoding', 'application/x-tex'); - annotation.textContent = tex; - const mrow = document.createElementNS(mathns, 'mrow'); - semantics.append(mrow, annotation); - math.append(semantics); - // make an AJAX request to the server, to get the MathML - $.post(ajaxEndpoint, {tex, display: 'inline'}, function(data){ - const children = data.documentElement.childNodes; - while (children.length > 0) { - mrow.append(svgdoc.adoptNode(children[0], true)); - } - svgCanvas.sanitizeSvg(math); - svgCanvas.call('changed', [elt]); - }); - elt.firstChild.replaceWith(math); - svgCanvas.call('changed', [elt]); - svgCanvas.clearSelection(); - } catch(e) { - console.log(e); - return false; - } - return true; - } - */ - buttons = [{ - id: 'tool_polygon', - icon: svgEditor.curConfig.extIconsPath + 'polygon.png', - type: 'mode', - position: 11, - events: { - click: function click() { - svgCanvas.setMode('polygon'); - showPanel(true); - } - } - }]; - contextTools = [{ - type: 'input', - panel: 'polygon_panel', - id: 'polySides', - size: 3, - defval: 5, - events: { - change: function change() { - setAttr('sides', this.value); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'polygon-icons.svg', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - context_tools: strings.contextTools.map(function (contextTool, i) { - return Object.assign(contextTools[i], contextTool); - }), - callback: function callback() { - $('#polygon_panel').hide(); - - - setTimeout(function () { - // Create source save/cancel buttons - - /* const save = */ - $('#tool_source_save').clone().hide().attr('id', 'polygon_save').unbind().appendTo('#tool_source_back').click(function () { - if (!editingitex) { - return; - } // Todo: Uncomment the setItexString() function above and handle ajaxEndpoint? - // setSelectMode(); - }); - /* const cancel = */ - - $('#tool_source_cancel').clone().hide().attr('id', 'polygon_cancel').unbind().appendTo('#tool_source_back').click(function () { - }); - }, 3000); - }, - mouseDown: function mouseDown(opts) { - if (svgCanvas.getMode() !== 'polygon') { - return undefined; - } // const e = opts.event; - - - var rgb = svgCanvas.getColor('fill'); // const ccRgbEl = rgb.substring(1, rgb.length); - - var sRgb = svgCanvas.getColor('stroke'); // ccSRgbEl = sRgb.substring(1, rgb.length); - - var sWidth = svgCanvas.getStrokeWidth(); - started = true; - newFO = svgCanvas.addSVGElementFromJson({ - element: 'polygon', - attr: { - cx: opts.start_x, - cy: opts.start_y, - id: svgCanvas.getNextId(), - shape: 'regularPoly', - sides: document.getElementById('polySides').value, - orient: 'x', - edge: 0, - fill: rgb, - strokecolor: sRgb, - strokeWidth: sWidth - } - }); - return { - started: true - }; - }, - mouseMove: function mouseMove(opts) { - if (!started || svgCanvas.getMode() !== 'polygon') { - return undefined; - } // const e = opts.event; - - - var c = $(newFO).attr(['cx', 'cy', 'sides', 'orient', 'fill', 'strokecolor', 'strokeWidth']); - var x = opts.mouse_x; - var y = opts.mouse_y; - var cx = c.cx, - cy = c.cy, - fill = c.fill, - strokecolor = c.strokecolor, - strokeWidth = c.strokeWidth, - sides = c.sides, - edg = Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)) / 1.5; - newFO.setAttribute('edge', edg); - var inradius = edg / 2 * cot(Math.PI / sides); - var circumradius = inradius * sec(Math.PI / sides); - var points = ''; - - for (var s = 0; sides >= s; s++) { - var angle = 2.0 * Math.PI * s / sides; - x = circumradius * Math.cos(angle) + cx; - y = circumradius * Math.sin(angle) + cy; - points += x + ',' + y + ' '; - } // const poly = newFO.createElementNS(NS.SVG, 'polygon'); - - - newFO.setAttribute('points', points); - newFO.setAttribute('fill', fill); - newFO.setAttribute('stroke', strokecolor); - newFO.setAttribute('stroke-width', strokeWidth); // newFO.setAttribute('transform', 'rotate(-90)'); - // const shape = newFO.getAttribute('shape'); - // newFO.append(poly); - // DrawPoly(cx, cy, sides, edg, orient); - - return { - started: true - }; - }, - mouseUp: function mouseUp(opts) { - if (svgCanvas.getMode() !== 'polygon') { - return undefined; - } - - var attrs = $(newFO).attr('edge'); - var keep = attrs.edge !== '0'; // svgCanvas.addToSelection([newFO], true); - - return { - keep: keep, - element: newFO - }; - }, - selectedChanged: function selectedChanged(opts) { - // Use this to update the current selected elements - selElems = opts.elems; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && elem.getAttribute('shape') === 'regularPoly') { - if (opts.selectedElement && !opts.multiselected) { - $('#polySides').val(elem.getAttribute('sides')); - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - }, - elementChanged: function elementChanged(opts) {// const elem = opts.elems[0]; - } - }); - - case 13: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extPolygon; - -}()); +}; diff --git a/dist/extensions/ext-server_moinsave.js b/dist/extensions/ext-server_moinsave.js index ea4247e2..6725c255 100644 --- a/dist/extensions/ext-server_moinsave.js +++ b/dist/extensions/ext-server_moinsave.js @@ -1,5000 +1,60 @@ -var svgEditorExtension_server_moinsave = (function () { - 'use strict'; +/** + * @file ext-server_moinsave.js + * + * @license (MIT OR GPL-2.0-or-later) + * + * @copyright 2010 Alexis Deveria, 2011 MoinMoin:ReimarBauer + * adopted for moinmoins item storage. It sends in one post png and svg data + * (I agree to dual license my work to additional GPLv2 or later) + */ +import {canvg} from '../canvg/canvg.js'; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } +export default { + name: 'server_moinsave', + async init ({$, encode64, importLocale}) { + const strings = await importLocale(); + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + const saveSvgAction = '/+modify'; - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } + // Create upload target (hidden iframe) + // Hiding by size instead of display to avoid FF console errors + // with `getBBox` in browser.js `supportsPathBBox_`) + /* const target = */ $( + `<iframe name="output_frame" title="${strings.hiddenframe}" + style="width: 0; height: 0;" src="data:text/html;base64,PGh0bWw+PC9odG1sPg=="/>` + ).appendTo('body'); - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + svgEditor.setCustomHandlers({ + async save (win, data) { + const svg = '<?xml version="1.0"?>\n' + data; + const {pathname} = new URL(location); + const name = pathname.replace(/\/+get\//, ''); + const svgData = encode64(svg); + if (!$('#export_canvas').length) { + $('<canvas>', {id: 'export_canvas'}).hide().appendTo('body'); } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true + const c = $('#export_canvas')[0]; + c.width = svgCanvas.contentW; + c.height = svgCanvas.contentH; + await canvg(c, svg); + const datauri = c.toDataURL('image/png'); + // const {uiStrings} = svgEditor; + const pngData = encode64(datauri); // Brett: This encoding seems unnecessary + /* const form = */ $('<form>').attr({ + method: 'post', + action: saveSvgAction + '/' + name, + target: 'output_frame' + }).append(` + <input type="hidden" name="png_data" value="${pngData}"> + <input type="hidden" name="filepath" value="${svgData}"> + <input type="hidden" name="filename" value="drawing.svg"> + <input type="hidden" name="contenttype" value="application/x-svgdraw"> + `).appendTo('body') + .submit().remove(); + $.alert(strings.saved); + top.window.location = '/' + name; } }); - if (superClass) _setPrototypeOf(subClass, superClass); } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } - } - - function _construct(Parent, args, Class) { - if (_isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; - } - - function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } - - return object; - } - - function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); - - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); - - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - - return _get(target, property, receiver || target); - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * For parsing color values. - * @module RGBColor - * @author Stoyan Stefanov <sstoo@gmail.com> - * @see https://www.phpied.com/rgb-color-parser-in-javascript/ - * @license MIT - */ - var simpleColors = { - aliceblue: 'f0f8ff', - antiquewhite: 'faebd7', - aqua: '00ffff', - aquamarine: '7fffd4', - azure: 'f0ffff', - beige: 'f5f5dc', - bisque: 'ffe4c4', - black: '000000', - blanchedalmond: 'ffebcd', - blue: '0000ff', - blueviolet: '8a2be2', - brown: 'a52a2a', - burlywood: 'deb887', - cadetblue: '5f9ea0', - chartreuse: '7fff00', - chocolate: 'd2691e', - coral: 'ff7f50', - cornflowerblue: '6495ed', - cornsilk: 'fff8dc', - crimson: 'dc143c', - cyan: '00ffff', - darkblue: '00008b', - darkcyan: '008b8b', - darkgoldenrod: 'b8860b', - darkgray: 'a9a9a9', - darkgreen: '006400', - darkkhaki: 'bdb76b', - darkmagenta: '8b008b', - darkolivegreen: '556b2f', - darkorange: 'ff8c00', - darkorchid: '9932cc', - darkred: '8b0000', - darksalmon: 'e9967a', - darkseagreen: '8fbc8f', - darkslateblue: '483d8b', - darkslategray: '2f4f4f', - darkturquoise: '00ced1', - darkviolet: '9400d3', - deeppink: 'ff1493', - deepskyblue: '00bfff', - dimgray: '696969', - dodgerblue: '1e90ff', - feldspar: 'd19275', - firebrick: 'b22222', - floralwhite: 'fffaf0', - forestgreen: '228b22', - fuchsia: 'ff00ff', - gainsboro: 'dcdcdc', - ghostwhite: 'f8f8ff', - gold: 'ffd700', - goldenrod: 'daa520', - gray: '808080', - green: '008000', - greenyellow: 'adff2f', - honeydew: 'f0fff0', - hotpink: 'ff69b4', - indianred: 'cd5c5c', - indigo: '4b0082', - ivory: 'fffff0', - khaki: 'f0e68c', - lavender: 'e6e6fa', - lavenderblush: 'fff0f5', - lawngreen: '7cfc00', - lemonchiffon: 'fffacd', - lightblue: 'add8e6', - lightcoral: 'f08080', - lightcyan: 'e0ffff', - lightgoldenrodyellow: 'fafad2', - lightgrey: 'd3d3d3', - lightgreen: '90ee90', - lightpink: 'ffb6c1', - lightsalmon: 'ffa07a', - lightseagreen: '20b2aa', - lightskyblue: '87cefa', - lightslateblue: '8470ff', - lightslategray: '778899', - lightsteelblue: 'b0c4de', - lightyellow: 'ffffe0', - lime: '00ff00', - limegreen: '32cd32', - linen: 'faf0e6', - magenta: 'ff00ff', - maroon: '800000', - mediumaquamarine: '66cdaa', - mediumblue: '0000cd', - mediumorchid: 'ba55d3', - mediumpurple: '9370d8', - mediumseagreen: '3cb371', - mediumslateblue: '7b68ee', - mediumspringgreen: '00fa9a', - mediumturquoise: '48d1cc', - mediumvioletred: 'c71585', - midnightblue: '191970', - mintcream: 'f5fffa', - mistyrose: 'ffe4e1', - moccasin: 'ffe4b5', - navajowhite: 'ffdead', - navy: '000080', - oldlace: 'fdf5e6', - olive: '808000', - olivedrab: '6b8e23', - orange: 'ffa500', - orangered: 'ff4500', - orchid: 'da70d6', - palegoldenrod: 'eee8aa', - palegreen: '98fb98', - paleturquoise: 'afeeee', - palevioletred: 'd87093', - papayawhip: 'ffefd5', - peachpuff: 'ffdab9', - peru: 'cd853f', - pink: 'ffc0cb', - plum: 'dda0dd', - powderblue: 'b0e0e6', - purple: '800080', - red: 'ff0000', - rosybrown: 'bc8f8f', - royalblue: '4169e1', - saddlebrown: '8b4513', - salmon: 'fa8072', - sandybrown: 'f4a460', - seagreen: '2e8b57', - seashell: 'fff5ee', - sienna: 'a0522d', - silver: 'c0c0c0', - skyblue: '87ceeb', - slateblue: '6a5acd', - slategray: '708090', - snow: 'fffafa', - springgreen: '00ff7f', - steelblue: '4682b4', - tan: 'd2b48c', - teal: '008080', - thistle: 'd8bfd8', - tomato: 'ff6347', - turquoise: '40e0d0', - violet: 'ee82ee', - violetred: 'd02090', - wheat: 'f5deb3', - white: 'ffffff', - whitesmoke: 'f5f5f5', - yellow: 'ffff00', - yellowgreen: '9acd32' - }; // array of color definition objects - - var colorDefs = [{ - re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, - // re: /^rgb\((?<r>\d{1,3}),\s*(?<g>\d{1,3}),\s*(?<b>\d{1,3})\)$/, - example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], - process: function process(_) { - for (var _len = arguments.length, bits = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bits[_key - 1] = arguments[_key]; - } - - return bits.map(function (b) { - return Number.parseInt(b); - }); - } - }, { - re: /^(\w{2})(\w{2})(\w{2})$/, - // re: /^(?<r>\w{2})(?<g>\w{2})(?<b>\w{2})$/, - example: ['#00ff00', '336699'], - process: function process(_) { - for (var _len2 = arguments.length, bits = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - bits[_key2 - 1] = arguments[_key2]; - } - - return bits.map(function (b) { - return Number.parseInt(b, 16); - }); - } - }, { - re: /^(\w)(\w)(\w)$/, - // re: /^(?<r>\w{1})(?<g>\w{1})(?<b>\w{1})$/, - example: ['#fb0', 'f0f'], - process: function process(_) { - for (var _len3 = arguments.length, bits = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - bits[_key3 - 1] = arguments[_key3]; - } - - return bits.map(function (b) { - return Number.parseInt(b + b, 16); - }); - } - }]; - /** - * A class to parse color values. - */ - - var RGBColor = /*#__PURE__*/function () { - /** - * @param {string} colorString - */ - function RGBColor(colorString) { - var _this = this; - - _classCallCheck(this, RGBColor); - - this.ok = false; // strip any leading # - - if (colorString.charAt(0) === '#') { - // remove # if any - colorString = colorString.substr(1, 6); - } - - colorString = colorString.replace(/ /g, ''); - colorString = colorString.toLowerCase(); // before getting into regexps, try simple matches - // and overwrite the input - - if (colorString in simpleColors) { - colorString = simpleColors[colorString]; - } // end of simple type-in colors - // search through the definitions to find a match - - - colorDefs.forEach(function (_ref) { - var re = _ref.re, - processor = _ref.process; - var bits = re.exec(colorString); - - if (bits) { - var _processor = processor.apply(void 0, _toConsumableArray(bits)), - _processor2 = _slicedToArray(_processor, 3), - r = _processor2[0], - g = _processor2[1], - b = _processor2[2]; - - Object.assign(_this, { - r: r, - g: g, - b: b - }); - _this.ok = true; - } - }); // validate/cleanup values - - this.r = this.r < 0 || isNaN(this.r) ? 0 : this.r > 255 ? 255 : this.r; - this.g = this.g < 0 || isNaN(this.g) ? 0 : this.g > 255 ? 255 : this.g; - this.b = this.b < 0 || isNaN(this.b) ? 0 : this.b > 255 ? 255 : this.b; - } // some getters - - /** - * @returns {string} - */ - - - _createClass(RGBColor, [{ - key: "toRGB", - value: function toRGB() { - return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; - } - /** - * @returns {string} - */ - - }, { - key: "toHex", - value: function toHex() { - var r = this.r.toString(16); - var g = this.g.toString(16); - var b = this.b.toString(16); - - if (r.length === 1) { - r = '0' + r; - } - - if (g.length === 1) { - g = '0' + g; - } - - if (b.length === 1) { - b = '0' + b; - } - - return '#' + r + g + b; - } - /** - * Offers a bulleted list of help. - * @returns {HTMLUListElement} - */ - - }], [{ - key: "getHelpXML", - value: function getHelpXML() { - var examples = [].concat(_toConsumableArray(colorDefs.flatMap(function (_ref2) { - var example = _ref2.example; - return example; - })), _toConsumableArray(Object.keys(simpleColors))); - var xml = document.createElement('ul'); - xml.setAttribute('id', 'rgbcolor-examples'); - xml.append.apply(xml, _toConsumableArray(examples.map(function (example) { - try { - var listItem = document.createElement('li'); - var listColor = new RGBColor(example); - var exampleDiv = document.createElement('div'); - exampleDiv.style.cssText = "\n margin: 3px;\n border: 1px solid black;\n background: ".concat(listColor.toHex(), ";\n color: ").concat(listColor.toHex(), ";"); - exampleDiv.append('test'); - var listItemValue = " ".concat(example, " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); - listItem.append(exampleDiv, listItemValue); - return listItem; - } catch (e) { - return ''; - } - }))); - return xml; - } - }]); - - return RGBColor; - }(); - - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function _typeof(obj) { - return typeof obj; - }; - } else { - _typeof = function _typeof(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - function _classCallCheck$1(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - /* eslint-disable no-bitwise, unicorn/prefer-query-selector */ - - /** - * StackBlur - a fast almost Gaussian Blur For Canvas - * - * In case you find this class useful - especially in commercial projects - - * I am not totally unhappy for a small donation to my PayPal account - * mario@quasimondo.de - * - * Or support me on flattr: - * {@link https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript}. - * - * @module StackBlur - * @author Mario Klingemann - * Contact: mario@quasimondo.com - * Website: {@link http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html} - * Twitter: @quasimondo - * - * @copyright (c) 2010 Mario Klingemann - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - /* eslint-disable max-len */ - - - var mulTable = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; - var shgTable = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; - /** - * @param {string|HTMLCanvasElement} canvas - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @throws {Error|TypeError} - * @returns {ImageData} See {@link https://html.spec.whatwg.org/multipage/canvas.html#imagedata} - */ - - - function getImageDataFromCanvas(canvas, topX, topY, width, height) { - if (typeof canvas === 'string') { - canvas = document.getElementById(canvas); - } - - if (!canvas || _typeof(canvas) !== 'object' || !('getContext' in canvas)) { - throw new TypeError('Expecting canvas with `getContext` method ' + 'in processCanvasRGB(A) calls!'); - } - - var context = canvas.getContext('2d'); - - try { - return context.getImageData(topX, topY, width, height); - } catch (e) { - throw new Error('unable to access image data: ' + e); - } - } - /** - * @param {HTMLCanvasElement} canvas - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @param {Float} radius - * @returns {undefined} - */ - - - function processCanvasRGBA(canvas, topX, topY, width, height, radius) { - if (isNaN(radius) || radius < 1) { - return; - } - - radius |= 0; - var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height); - imageData = processImageDataRGBA(imageData, topX, topY, width, height, radius); - canvas.getContext('2d').putImageData(imageData, topX, topY); - } - /** - * @param {ImageData} imageData - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @param {Float} radius - * @returns {ImageData} - */ - - - function processImageDataRGBA(imageData, topX, topY, width, height, radius) { - var pixels = imageData.data; - var x, y, i, p, yp, yi, yw, rSum, gSum, bSum, aSum, rOutSum, gOutSum, bOutSum, aOutSum, rInSum, gInSum, bInSum, aInSum, pr, pg, pb, pa, rbs; - var div = 2 * radius + 1; // const w4 = width << 2; - - var widthMinus1 = width - 1; - var heightMinus1 = height - 1; - var radiusPlus1 = radius + 1; - var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; - var stackStart = new BlurStack(); - var stack = stackStart; - var stackEnd; - - for (i = 1; i < div; i++) { - stack = stack.next = new BlurStack(); - - if (i === radiusPlus1) { - stackEnd = stack; - } - } - - stack.next = stackStart; - var stackIn = null; - var stackOut = null; - yw = yi = 0; - var mulSum = mulTable[radius]; - var shgSum = shgTable[radius]; - - for (y = 0; y < height; y++) { - rInSum = gInSum = bInSum = aInSum = rSum = gSum = bSum = aSum = 0; - rOutSum = radiusPlus1 * (pr = pixels[yi]); - gOutSum = radiusPlus1 * (pg = pixels[yi + 1]); - bOutSum = radiusPlus1 * (pb = pixels[yi + 2]); - aOutSum = radiusPlus1 * (pa = pixels[yi + 3]); - rSum += sumFactor * pr; - gSum += sumFactor * pg; - bSum += sumFactor * pb; - aSum += sumFactor * pa; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack.a = pa; - stack = stack.next; - } - - for (i = 1; i < radiusPlus1; i++) { - p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); - rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i); - gSum += (stack.g = pg = pixels[p + 1]) * rbs; - bSum += (stack.b = pb = pixels[p + 2]) * rbs; - aSum += (stack.a = pa = pixels[p + 3]) * rbs; - rInSum += pr; - gInSum += pg; - bInSum += pb; - aInSum += pa; - stack = stack.next; - } - - stackIn = stackStart; - stackOut = stackEnd; - - for (x = 0; x < width; x++) { - pixels[yi + 3] = pa = aSum * mulSum >> shgSum; - - if (pa !== 0) { - pa = 255 / pa; - pixels[yi] = (rSum * mulSum >> shgSum) * pa; - pixels[yi + 1] = (gSum * mulSum >> shgSum) * pa; - pixels[yi + 2] = (bSum * mulSum >> shgSum) * pa; - } else { - pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0; - } - - rSum -= rOutSum; - gSum -= gOutSum; - bSum -= bOutSum; - aSum -= aOutSum; - rOutSum -= stackIn.r; - gOutSum -= stackIn.g; - bOutSum -= stackIn.b; - aOutSum -= stackIn.a; - p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2; - rInSum += stackIn.r = pixels[p]; - gInSum += stackIn.g = pixels[p + 1]; - bInSum += stackIn.b = pixels[p + 2]; - aInSum += stackIn.a = pixels[p + 3]; - rSum += rInSum; - gSum += gInSum; - bSum += bInSum; - aSum += aInSum; - stackIn = stackIn.next; - rOutSum += pr = stackOut.r; - gOutSum += pg = stackOut.g; - bOutSum += pb = stackOut.b; - aOutSum += pa = stackOut.a; - rInSum -= pr; - gInSum -= pg; - bInSum -= pb; - aInSum -= pa; - stackOut = stackOut.next; - yi += 4; - } - - yw += width; - } - - for (x = 0; x < width; x++) { - gInSum = bInSum = aInSum = rInSum = gSum = bSum = aSum = rSum = 0; - yi = x << 2; - rOutSum = radiusPlus1 * (pr = pixels[yi]); - gOutSum = radiusPlus1 * (pg = pixels[yi + 1]); - bOutSum = radiusPlus1 * (pb = pixels[yi + 2]); - aOutSum = radiusPlus1 * (pa = pixels[yi + 3]); - rSum += sumFactor * pr; - gSum += sumFactor * pg; - bSum += sumFactor * pb; - aSum += sumFactor * pa; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack.a = pa; - stack = stack.next; - } - - yp = width; - - for (i = 1; i <= radius; i++) { - yi = yp + x << 2; - rSum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i); - gSum += (stack.g = pg = pixels[yi + 1]) * rbs; - bSum += (stack.b = pb = pixels[yi + 2]) * rbs; - aSum += (stack.a = pa = pixels[yi + 3]) * rbs; - rInSum += pr; - gInSum += pg; - bInSum += pb; - aInSum += pa; - stack = stack.next; - - if (i < heightMinus1) { - yp += width; - } - } - - yi = x; - stackIn = stackStart; - stackOut = stackEnd; - - for (y = 0; y < height; y++) { - p = yi << 2; - pixels[p + 3] = pa = aSum * mulSum >> shgSum; - - if (pa > 0) { - pa = 255 / pa; - pixels[p] = (rSum * mulSum >> shgSum) * pa; - pixels[p + 1] = (gSum * mulSum >> shgSum) * pa; - pixels[p + 2] = (bSum * mulSum >> shgSum) * pa; - } else { - pixels[p] = pixels[p + 1] = pixels[p + 2] = 0; - } - - rSum -= rOutSum; - gSum -= gOutSum; - bSum -= bOutSum; - aSum -= aOutSum; - rOutSum -= stackIn.r; - gOutSum -= stackIn.g; - bOutSum -= stackIn.b; - aOutSum -= stackIn.a; - p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2; - rSum += rInSum += stackIn.r = pixels[p]; - gSum += gInSum += stackIn.g = pixels[p + 1]; - bSum += bInSum += stackIn.b = pixels[p + 2]; - aSum += aInSum += stackIn.a = pixels[p + 3]; - stackIn = stackIn.next; - rOutSum += pr = stackOut.r; - gOutSum += pg = stackOut.g; - bOutSum += pb = stackOut.b; - aOutSum += pa = stackOut.a; - rInSum -= pr; - gInSum -= pg; - bInSum -= pb; - aInSum -= pa; - stackOut = stackOut.next; - yi += width; - } - } - - return imageData; - } - /** - * - */ - - - var BlurStack = - /** - * Set properties. - */ - function BlurStack() { - _classCallCheck$1(this, BlurStack); - - this.r = 0; - this.g = 0; - this.b = 0; - this.a = 0; - this.next = null; - }; - - /** - * Whether a value is `null` or `undefined`. - * @param {any} val - * @returns {boolean} - */ - - var isNullish = function isNullish(val) { - return val === null || val === undefined; - }; - /** - * @callback module:canvg.ForceRedraw - * @returns {boolean} - */ - - /** - * @typedef {PlainObject} module:canvg.CanvgOptions - * @property {boolean} ignoreMouse true => ignore mouse events - * @property {boolean} ignoreAnimation true => ignore animations - * @property {boolean} ignoreDimensions true => does not try to resize canvas - * @property {boolean} ignoreClear true => does not clear canvas - * @property {Integer} offsetX int => draws at a x offset - * @property {Integer} offsetY int => draws at a y offset - * @property {Integer} scaleWidth int => scales horizontally to width - * @property {Integer} scaleHeight int => scales vertically to height - * @property {module:canvg.ForceRedraw} forceRedraw function => will call the function on every frame, if it returns true, will redraw - * @property {boolean} log Adds log function - * @property {boolean} useCORS Whether to set CORS `crossOrigin` for the image to `Anonymous` - */ - - /** - * If called with no arguments, it will replace all `<svg>` elements on the page - * with `<canvas>` elements. - * @function module:canvg.canvg - * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element - * @param {string|XMLDocument} s - svg string, url to svg file, or xml document - * @param {module:canvg.CanvgOptions} [opts] Optional hash of options - * @returns {Promise<XMLDocument|XMLDocument[]>} All the function after the first render is completed with dom - */ - - - var canvg = function canvg(target, s, opts) { - // no parameters - if (isNullish(target) && isNullish(s) && isNullish(opts)) { - var svgTags = document.querySelectorAll('svg'); - return Promise.all(_toConsumableArray(svgTags).map(function (svgTag) { - var c = document.createElement('canvas'); - c.width = svgTag.clientWidth; - c.height = svgTag.clientHeight; - svgTag.before(c); - svgTag.remove(); - var div = document.createElement('div'); - div.append(svgTag); - return canvg(c, div.innerHTML); - })); - } - - if (typeof target === 'string') { - target = document.getElementById(target); - } // store class on canvas - - - if (!isNullish(target.svg)) target.svg.stop(); - var svg = build(opts || {}); // on i.e. 8 for flash canvas, we can't assign the property so check for it - - if (!(target.childNodes.length === 1 && target.childNodes[0].nodeName === 'OBJECT')) { - target.svg = svg; - } - - var ctx = target.getContext('2d'); - - if (typeof s.documentElement !== 'undefined') { - // load from xml doc - return svg.loadXmlDoc(ctx, s); - } - - if (s.substr(0, 1) === '<') { - // load from xml string - return svg.loadXml(ctx, s); - } // load from url - - - return svg.load(ctx, s); - }; - /* eslint-disable jsdoc/check-types */ - - /** - * @param {module:canvg.CanvgOptions} opts - * @returns {object} - * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) - */ - - function build(opts) { - /* eslint-enable jsdoc/check-types */ - var svg = { - opts: opts - }; - svg.FRAMERATE = 30; - svg.MAX_VIRTUAL_PIXELS = 30000; - - svg.log = function (msg) { - /* */ - }; - - if (svg.opts.log === true && typeof console !== 'undefined') { - svg.log = function (msg) { - console.log(msg); - }; // eslint-disable-line no-console - - } // globals - - - svg.init = function (ctx) { - var uniqueId = 0; - - svg.UniqueId = function () { - uniqueId++; - return 'canvg' + uniqueId; - }; - - svg.Definitions = {}; - svg.Styles = {}; - svg.Animations = []; - svg.Images = []; - svg.ctx = ctx; - svg.ViewPort = { - viewPorts: [], - Clear: function Clear() { - this.viewPorts = []; - }, - SetCurrent: function SetCurrent(width, height) { - this.viewPorts.push({ - width: width, - height: height - }); - }, - RemoveCurrent: function RemoveCurrent() { - this.viewPorts.pop(); - }, - Current: function Current() { - return this.viewPorts[this.viewPorts.length - 1]; - }, - width: function width() { - return this.Current().width; - }, - height: function height() { - return this.Current().height; - }, - ComputeSize: function ComputeSize(d) { - if (!isNullish(d) && typeof d === 'number') return d; - if (d === 'x') return this.width(); - if (d === 'y') return this.height(); - return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2); - } - }; - }; - - svg.init(); // images loaded - - svg.ImagesLoaded = function () { - return svg.Images.every(function (img) { - return img.loaded; - }); - }; // trim - - - svg.trim = function (s) { - return s.replace(/^\s+|\s+$/g, ''); - }; // compress spaces - - - svg.compressSpaces = function (s) { - return s.replace(/\s+/gm, ' '); - }; // ajax - // Todo: Replace with `fetch` and polyfill - - - svg.ajax = function (url, asynch) { - var AJAX = window.XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP'); - - if (asynch) { - return new Promise(function (resolve, reject) { - // eslint-disable-line promise/avoid-new - var req = AJAX.open('GET', url, true); - req.addEventListener('load', function () { - resolve(AJAX.responseText); - }); - AJAX.send(null); - }); - } - - AJAX.open('GET', url, false); - AJAX.send(null); - return AJAX.responseText; - }; // parse xml - - - svg.parseXml = function (xml) { - if (window.DOMParser) { - var parser = new DOMParser(); - return parser.parseFromString(xml, 'text/xml'); - } - - xml = xml.replace(/<!DOCTYPE svg[^>]*>/, ''); - var xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM'); - xmlDoc.async = 'false'; - xmlDoc.loadXML(xml); - return xmlDoc; - }; // text extensions - // get the text baseline - - - var textBaselineMapping = { - baseline: 'alphabetic', - 'before-edge': 'top', - 'text-before-edge': 'top', - middle: 'middle', - central: 'middle', - 'after-edge': 'bottom', - 'text-after-edge': 'bottom', - ideographic: 'ideographic', - alphabetic: 'alphabetic', - hanging: 'hanging', - mathematical: 'alphabetic' - }; - - svg.Property = /*#__PURE__*/function () { - function Property(name, value) { - _classCallCheck(this, Property); - - this.name = name; - this.value = value; - } - - _createClass(Property, [{ - key: "getValue", - value: function getValue() { - return this.value; - } - }, { - key: "hasValue", - value: function hasValue() { - return !isNullish(this.value) && this.value !== ''; - } // return the numerical value of the property - - }, { - key: "numValue", - value: function numValue() { - if (!this.hasValue()) return 0; - var n = Number.parseFloat(this.value); - - if (String(this.value).endsWith('%')) { - n /= 100.0; - } - - return n; - } - }, { - key: "valueOrDefault", - value: function valueOrDefault(def) { - if (this.hasValue()) return this.value; - return def; - } - }, { - key: "numValueOrDefault", - value: function numValueOrDefault(def) { - if (this.hasValue()) return this.numValue(); - return def; - } // color extensions - // augment the current color value with the opacity - - }, { - key: "addOpacity", - value: function addOpacity(opacityProp) { - var newValue = this.value; - - if (!isNullish(opacityProp.value) && opacityProp.value !== '' && typeof this.value === 'string') { - // can only add opacity to colors, not patterns - var color = new RGBColor(this.value); - - if (color.ok) { - newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')'; - } - } - - return new svg.Property(this.name, newValue); - } // definition extensions - // get the definition from the definitions table - - }, { - key: "getDefinition", - value: function getDefinition() { - var name = this.value.match(/#([^)'"]+)/); - - if (name) { - name = name[1]; - } - - if (!name) { - name = this.value; - } - - return svg.Definitions[name]; - } - }, { - key: "isUrlDefinition", - value: function isUrlDefinition() { - return this.value.startsWith('url('); - } - }, { - key: "getFillStyleDefinition", - value: function getFillStyleDefinition(e, opacityProp) { - var def = this.getDefinition(); // gradient - - if (!isNullish(def) && def.createGradient) { - return def.createGradient(svg.ctx, e, opacityProp); - } // pattern - - - if (!isNullish(def) && def.createPattern) { - if (def.getHrefAttribute().hasValue()) { - var pt = def.attribute('patternTransform'); - def = def.getHrefAttribute().getDefinition(); - - if (pt.hasValue()) { - def.attribute('patternTransform', true).value = pt.value; - } - } - - return def.createPattern(svg.ctx, e); - } - - return null; - } // length extensions - - }, { - key: "getDPI", - value: function getDPI(viewPort) { - return 96.0; // TODO: compute? - } - }, { - key: "getEM", - value: function getEM(viewPort) { - var em = 12; - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - if (fontSize.hasValue()) em = fontSize.toPixels(viewPort); - return em; - } - }, { - key: "getUnits", - value: function getUnits() { - return String(this.value).replace(/[\d.-]/g, ''); - } // get the length as pixels - - }, { - key: "toPixels", - value: function toPixels(viewPort, processPercent) { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('em')) return this.numValue() * this.getEM(viewPort); - if (s.endsWith('ex')) return this.numValue() * this.getEM(viewPort) / 2.0; - if (s.endsWith('px')) return this.numValue(); - if (s.endsWith('pt')) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0); - if (s.endsWith('pc')) return this.numValue() * 15; - if (s.endsWith('cm')) return this.numValue() * this.getDPI(viewPort) / 2.54; - if (s.endsWith('mm')) return this.numValue() * this.getDPI(viewPort) / 25.4; - if (s.endsWith('in')) return this.numValue() * this.getDPI(viewPort); - if (s.endsWith('%')) return this.numValue() * svg.ViewPort.ComputeSize(viewPort); - var n = this.numValue(); - if (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort); - return n; - } // time extensions - // get the time as milliseconds - - }, { - key: "toMilliseconds", - value: function toMilliseconds() { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('ms')) return this.numValue(); - if (s.endsWith('s')) return this.numValue() * 1000; - return this.numValue(); - } // angle extensions - // get the angle as radians - - }, { - key: "toRadians", - value: function toRadians() { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('deg')) return this.numValue() * (Math.PI / 180.0); - if (s.endsWith('grad')) return this.numValue() * (Math.PI / 200.0); - if (s.endsWith('rad')) return this.numValue(); - return this.numValue() * (Math.PI / 180.0); - } - }, { - key: "toTextBaseline", - value: function toTextBaseline() { - if (!this.hasValue()) return null; - return textBaselineMapping[this.value]; - } - }]); - - return Property; - }(); // fonts - - - svg.Font = { - Styles: 'normal|italic|oblique|inherit', - Variants: 'normal|small-caps|inherit', - Weights: 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit', - CreateFont: function CreateFont(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { - var f = !isNullish(inherit) ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); - return { - fontFamily: fontFamily || f.fontFamily, - fontSize: fontSize || f.fontSize, - fontStyle: fontStyle || f.fontStyle, - fontWeight: fontWeight || f.fontWeight, - fontVariant: fontVariant || f.fontVariant, - toString: function toString() { - return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' '); - } - }; - }, - Parse: function Parse(s) { - var _this = this; - - var f = {}; - var ds = svg.trim(svg.compressSpaces(s || '')).split(' '); - var set = { - fontSize: false, - fontStyle: false, - fontWeight: false, - fontVariant: false - }; - var ff = ''; - ds.forEach(function (d) { - if (!set.fontStyle && _this.Styles.includes(d)) { - if (d !== 'inherit') { - f.fontStyle = d; - } - - set.fontStyle = true; - } else if (!set.fontVariant && _this.Variants.includes(d)) { - if (d !== 'inherit') { - f.fontVariant = d; - } - - set.fontStyle = set.fontVariant = true; - } else if (!set.fontWeight && _this.Weights.includes(d)) { - if (d !== 'inherit') { - f.fontWeight = d; - } - - set.fontStyle = set.fontVariant = set.fontWeight = true; - } else if (!set.fontSize) { - if (d !== 'inherit') { - f.fontSize = d.split('/')[0]; - } - - set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; - } else if (d !== 'inherit') { - ff += d; - } - }); - - if (ff !== '') { - f.fontFamily = ff; - } - - return f; - } - }; // points and paths - - svg.ToNumberArray = function (s) { - var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' '); - return a.map(function (_a) { - return Number.parseFloat(_a); - }); - }; - - svg.Point = /*#__PURE__*/function () { - function _class(x, y) { - _classCallCheck(this, _class); - - this.x = x; - this.y = y; - } - - _createClass(_class, [{ - key: "angleTo", - value: function angleTo(p) { - return Math.atan2(p.y - this.y, p.x - this.x); - } - }, { - key: "applyTransform", - value: function applyTransform(v) { - var xp = this.x * v[0] + this.y * v[2] + v[4]; - var yp = this.x * v[1] + this.y * v[3] + v[5]; - this.x = xp; - this.y = yp; - } - }]); - - return _class; - }(); - - svg.CreatePoint = function (s) { - var a = svg.ToNumberArray(s); - return new svg.Point(a[0], a[1]); - }; - - svg.CreatePath = function (s) { - var a = svg.ToNumberArray(s); - var path = []; - - for (var i = 0; i < a.length; i += 2) { - path.push(new svg.Point(a[i], a[i + 1])); - } - - return path; - }; // bounding box - - - svg.BoundingBox = /*#__PURE__*/function () { - function _class2(x1, y1, x2, y2) { - _classCallCheck(this, _class2); - - // pass in initial points if you want - this.x1 = Number.NaN; - this.y1 = Number.NaN; - this.x2 = Number.NaN; - this.y2 = Number.NaN; - this.addPoint(x1, y1); - this.addPoint(x2, y2); - } - - _createClass(_class2, [{ - key: "x", - value: function x() { - return this.x1; - } - }, { - key: "y", - value: function y() { - return this.y1; - } - }, { - key: "width", - value: function width() { - return this.x2 - this.x1; - } - }, { - key: "height", - value: function height() { - return this.y2 - this.y1; - } - }, { - key: "addPoint", - value: function addPoint(x, y) { - if (!isNullish(x)) { - if (isNaN(this.x1) || isNaN(this.x2)) { - this.x1 = x; - this.x2 = x; - } - - if (x < this.x1) this.x1 = x; - if (x > this.x2) this.x2 = x; - } - - if (!isNullish(y)) { - if (isNaN(this.y1) || isNaN(this.y2)) { - this.y1 = y; - this.y2 = y; - } - - if (y < this.y1) this.y1 = y; - if (y > this.y2) this.y2 = y; - } - } - }, { - key: "addX", - value: function addX(x) { - this.addPoint(x, null); - } - }, { - key: "addY", - value: function addY(y) { - this.addPoint(null, y); - } - }, { - key: "addBoundingBox", - value: function addBoundingBox(bb) { - this.addPoint(bb.x1, bb.y1); - this.addPoint(bb.x2, bb.y2); - } - }, { - key: "addQuadraticCurve", - value: function addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) { - var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) - - var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) - - var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) - - var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) - - this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); - } - }, { - key: "addBezierCurve", - value: function addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { - var _this2 = this; - - // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html - var p0 = [p0x, p0y], - p1 = [p1x, p1y], - p2 = [p2x, p2y], - p3 = [p3x, p3y]; - this.addPoint(p0[0], p0[1]); - this.addPoint(p3[0], p3[1]); - - var _loop = function _loop(i) { - var f = function f(t) { - return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i]; - }; - - var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; - var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; - var c = 3 * p1[i] - 3 * p0[i]; - - if (a === 0) { - if (b === 0) return "continue"; - var t = -c / b; - - if (t > 0 && t < 1) { - if (i === 0) _this2.addX(f(t)); - if (i === 1) _this2.addY(f(t)); - } - - return "continue"; - } - - var b2ac = Math.pow(b, 2) - 4 * c * a; - if (b2ac < 0) return "continue"; - var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); - - if (t1 > 0 && t1 < 1) { - if (i === 0) _this2.addX(f(t1)); - if (i === 1) _this2.addY(f(t1)); - } - - var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); - - if (t2 > 0 && t2 < 1) { - if (i === 0) _this2.addX(f(t2)); - if (i === 1) _this2.addY(f(t2)); - } - }; - - for (var i = 0; i <= 1; i++) { - var _ret = _loop(i); - - if (_ret === "continue") continue; - } - } - }, { - key: "isPointInBox", - value: function isPointInBox(x, y) { - return this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2; - } - }]); - - return _class2; - }(); // transforms - - - svg.Transform = /*#__PURE__*/function () { - function _class3(v) { - var _this6 = this; - - _classCallCheck(this, _class3); - - this.Type = { - translate: function translate(s) { - _classCallCheck(this, translate); - - this.p = svg.CreatePoint(s); - - this.apply = function (ctx) { - ctx.translate(this.p.x || 0.0, this.p.y || 0.0); - }; - - this.unapply = function (ctx) { - ctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0); - }; - - this.applyToPoint = function (p) { - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - }; - }, - rotate: function rotate(s) { - _classCallCheck(this, rotate); - - var a = svg.ToNumberArray(s); - this.angle = new svg.Property('angle', a[0]); - this.cx = a[1] || 0; - this.cy = a[2] || 0; - - this.apply = function (ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(this.angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - }; - - this.unapply = function (ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(-1.0 * this.angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - }; - - this.applyToPoint = function (p) { - var _a = this.angle.toRadians(); - - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - p.applyTransform([Math.cos(_a), Math.sin(_a), -Math.sin(_a), Math.cos(_a), 0, 0]); - p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); - }; - }, - scale: function scale(s) { - _classCallCheck(this, scale); - - this.p = svg.CreatePoint(s); - - this.apply = function (ctx) { - ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); - }; - - this.unapply = function (ctx) { - ctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0); - }; - - this.applyToPoint = function (p) { - p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); - }; - }, - matrix: function matrix(s) { - _classCallCheck(this, matrix); - - this.m = svg.ToNumberArray(s); - - this.apply = function (ctx) { - ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); - }; - - this.applyToPoint = function (p) { - p.applyTransform(this.m); - }; - } - }; - Object.assign(this.Type, { - SkewBase: /*#__PURE__*/function (_this$Type$matrix) { - _inherits(SkewBase, _this$Type$matrix); - - var _super = _createSuper(SkewBase); - - function SkewBase(s) { - var _this3; - - _classCallCheck(this, SkewBase); - - _this3 = _super.call(this, s); - _this3.angle = new svg.Property('angle', s); - return _this3; - } - - return SkewBase; - }(this.Type.matrix) - }); - Object.assign(this.Type, { - skewX: /*#__PURE__*/function (_this$Type$SkewBase) { - _inherits(skewX, _this$Type$SkewBase); - - var _super2 = _createSuper(skewX); - - function skewX(s) { - var _this4; - - _classCallCheck(this, skewX); - - _this4 = _super2.call(this, s); - _this4.m = [1, 0, Math.tan(_this4.angle.toRadians()), 1, 0, 0]; - return _this4; - } - - return skewX; - }(this.Type.SkewBase), - skewY: /*#__PURE__*/function (_this$Type$SkewBase2) { - _inherits(skewY, _this$Type$SkewBase2); - - var _super3 = _createSuper(skewY); - - function skewY(s) { - var _this5; - - _classCallCheck(this, skewY); - - _this5 = _super3.call(this, s); - _this5.m = [1, Math.tan(_this5.angle.toRadians()), 0, 1, 0, 0]; - return _this5; - } - - return skewY; - }(this.Type.SkewBase) - }); - var data = svg.trim(svg.compressSpaces(v)).replace(/\)([a-zA-Z])/g, ') $1').replace(/\)(\s?,\s?)/g, ') ').split(/\s(?=[a-z])/); - this.transforms = data.map(function (d) { - var type = svg.trim(d.split('(')[0]); - var s = d.split('(')[1].replace(')', ''); - var transform = new _this6.Type[type](s); - transform.type = type; - return transform; - }); - } - - _createClass(_class3, [{ - key: "apply", - value: function apply(ctx) { - this.transforms.forEach(function (transform) { - transform.apply(ctx); - }); - } - }, { - key: "unapply", - value: function unapply(ctx) { - for (var i = this.transforms.length - 1; i >= 0; i--) { - this.transforms[i].unapply(ctx); - } - } - }, { - key: "applyToPoint", - value: function applyToPoint(p) { - this.transforms.forEach(function (transform) { - transform.applyToPoint(p); - }); - } - }]); - - return _class3; - }(); // aspect ratio - - - svg.AspectRatio = function (ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) { - // aspect ratio - https://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute - aspectRatio = svg.compressSpaces(aspectRatio); - aspectRatio = aspectRatio.replace(/^defer\s/, ''); // ignore defer - - var align = aspectRatio.split(' ')[0] || 'xMidYMid'; - var meetOrSlice = aspectRatio.split(' ')[1] || 'meet'; // calculate scale - - var scaleX = width / desiredWidth; - var scaleY = height / desiredHeight; - var scaleMin = Math.min(scaleX, scaleY); - var scaleMax = Math.max(scaleX, scaleY); - - if (meetOrSlice === 'meet') { - desiredWidth *= scaleMin; - desiredHeight *= scaleMin; - } - - if (meetOrSlice === 'slice') { - desiredWidth *= scaleMax; - desiredHeight *= scaleMax; - } - - refX = new svg.Property('refX', refX); - refY = new svg.Property('refY', refY); - - if (refX.hasValue() && refY.hasValue()) { - ctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y')); - } else { - // align - if (align.startsWith('xMid') && (meetOrSlice === 'meet' && scaleMin === scaleY || meetOrSlice === 'slice' && scaleMax === scaleY)) { - ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); - } - - if (align.endsWith('YMid') && (meetOrSlice === 'meet' && scaleMin === scaleX || meetOrSlice === 'slice' && scaleMax === scaleX)) { - ctx.translate(0, height / 2.0 - desiredHeight / 2.0); - } - - if (align.startsWith('xMax') && (meetOrSlice === 'meet' && scaleMin === scaleY || meetOrSlice === 'slice' && scaleMax === scaleY)) { - ctx.translate(width - desiredWidth, 0); - } - - if (align.endsWith('YMax') && (meetOrSlice === 'meet' && scaleMin === scaleX || meetOrSlice === 'slice' && scaleMax === scaleX)) { - ctx.translate(0, height - desiredHeight); - } - } // scale - - - if (align === 'none') ctx.scale(scaleX, scaleY);else if (meetOrSlice === 'meet') ctx.scale(scaleMin, scaleMin);else if (meetOrSlice === 'slice') ctx.scale(scaleMax, scaleMax); // translate - - ctx.translate(isNullish(minX) ? 0 : -minX, isNullish(minY) ? 0 : -minY); - }; // elements - - - svg.Element = {}; - svg.EmptyProperty = new svg.Property('EMPTY', ''); - - svg.Element.ElementBase = /*#__PURE__*/function () { - function _class4(node) { - var _this7 = this; - - _classCallCheck(this, _class4); - - // Argument from inheriting class - this.captureTextNodes = arguments[1]; // eslint-disable-line prefer-rest-params - - this.attributes = {}; - this.styles = {}; - this.children = []; - - if (!isNullish(node) && node.nodeType === 1) { - // ELEMENT_NODE - // add children - _toConsumableArray(node.childNodes).forEach(function (childNode) { - if (childNode.nodeType === 1) { - _this7.addChild(childNode, true); // ELEMENT_NODE - - } - - if (_this7.captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) { - var text = childNode.nodeValue || childNode.text || ''; - - if (svg.trim(svg.compressSpaces(text)) !== '') { - _this7.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE - - } - } - }); // add attributes - - - _toConsumableArray(node.attributes).forEach(function (_ref) { - var nodeName = _ref.nodeName, - nodeValue = _ref.nodeValue; - _this7.attributes[nodeName] = new svg.Property(nodeName, nodeValue); - }); // add tag styles - - - var styles = svg.Styles[node.nodeName]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - name = _ref3[0], - styleValue = _ref3[1]; - - _this7.styles[name] = styleValue; - }); - } // add class styles - - - if (this.attribute('class').hasValue()) { - var classes = svg.compressSpaces(this.attribute('class').value).split(' '); - classes.forEach(function (clss) { - styles = svg.Styles['.' + clss]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - name = _ref5[0], - styleValue = _ref5[1]; - - _this7.styles[name] = styleValue; - }); - } - - styles = svg.Styles[node.nodeName + '.' + clss]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref6) { - var _ref7 = _slicedToArray(_ref6, 2), - name = _ref7[0], - styleValue = _ref7[1]; - - _this7.styles[name] = styleValue; - }); - } - }); - } // add id styles - - - if (this.attribute('id').hasValue()) { - var _styles = svg.Styles['#' + this.attribute('id').value]; - - if (!isNullish(_styles)) { - Object.entries(_styles).forEach(function (_ref8) { - var _ref9 = _slicedToArray(_ref8, 2), - name = _ref9[0], - styleValue = _ref9[1]; - - _this7.styles[name] = styleValue; - }); - } - } // add inline styles - - - if (this.attribute('style').hasValue()) { - var _styles2 = this.attribute('style').value.split(';'); - - _styles2.forEach(function (style) { - if (svg.trim(style) !== '') { - var _style$split = style.split(':'), - name = _style$split.name, - value = _style$split.value; - - name = svg.trim(name); - value = svg.trim(value); - _this7.styles[name] = new svg.Property(name, value); - } - }); - } // add id - - - if (this.attribute('id').hasValue()) { - if (isNullish(svg.Definitions[this.attribute('id').value])) { - svg.Definitions[this.attribute('id').value] = this; - } - } - } - } // get or create attribute - - - _createClass(_class4, [{ - key: "attribute", - value: function attribute(name, createIfNotExists) { - var a = this.attributes[name]; - if (!isNullish(a)) return a; - - if (createIfNotExists === true) { - a = new svg.Property(name, ''); - this.attributes[name] = a; - } - - return a || svg.EmptyProperty; - } - }, { - key: "getHrefAttribute", - value: function getHrefAttribute() { - for (var a in this.attributes) { - if (a.endsWith(':href')) { - return this.attributes[a]; - } - } - - return svg.EmptyProperty; - } // get or create style, crawls up node tree - - }, { - key: "style", - value: function style(name, createIfNotExists, skipAncestors) { - var s = this.styles[name]; - if (!isNullish(s)) return s; - var a = this.attribute(name); - - if (!isNullish(a) && a.hasValue()) { - this.styles[name] = a; // move up to me to cache - - return a; - } - - if (skipAncestors !== true) { - var p = this.parent; - - if (!isNullish(p)) { - var ps = p.style(name); - - if (!isNullish(ps) && ps.hasValue()) { - return ps; - } - } - } - - if (createIfNotExists === true) { - s = new svg.Property(name, ''); - this.styles[name] = s; - } - - return s || svg.EmptyProperty; - } // base render - - }, { - key: "render", - value: function render(ctx) { - // don't render display=none - if (this.style('display').value === 'none') return; // don't render visibility=hidden - - if (this.style('visibility').value === 'hidden') return; - ctx.save(); - - if (this.attribute('mask').hasValue()) { - // mask - var mask = this.attribute('mask').getDefinition(); - if (!isNullish(mask)) mask.apply(ctx, this); - } else if (this.style('filter').hasValue()) { - // filter - var filter = this.style('filter').getDefinition(); - if (!isNullish(filter)) filter.apply(ctx, this); - } else { - this.setContext(ctx); - this.renderChildren(ctx); - this.clearContext(ctx); - } - - ctx.restore(); - } // base set context - - }, { - key: "setContext", - value: function setContext(ctx) {// OVERRIDE ME! - } // base clear context - - }, { - key: "clearContext", - value: function clearContext(ctx) {// OVERRIDE ME! - } // base render children - - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - this.children.forEach(function (child) { - child.render(ctx); - }); - } - }, { - key: "addChild", - value: function addChild(childNode, create) { - var child = create ? svg.CreateElement(childNode) : childNode; - child.parent = this; - - if (child.type !== 'title') { - this.children.push(child); - } - } - }]); - - return _class4; - }(); - - svg.Element.RenderedElementBase = /*#__PURE__*/function (_svg$Element$ElementB) { - _inherits(_class5, _svg$Element$ElementB); - - var _super4 = _createSuper(_class5); - - function _class5() { - _classCallCheck(this, _class5); - - return _super4.apply(this, arguments); - } - - _createClass(_class5, [{ - key: "setContext", - value: function setContext(ctx) { - // fill - if (this.style('fill').isUrlDefinition()) { - var fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity')); - if (!isNullish(fs)) ctx.fillStyle = fs; - } else if (this.style('fill').hasValue()) { - var fillStyle = this.style('fill'); - if (fillStyle.value === 'currentColor') fillStyle.value = this.style('color').value; - ctx.fillStyle = fillStyle.value === 'none' ? 'rgba(0,0,0,0)' : fillStyle.value; - } - - if (this.style('fill-opacity').hasValue()) { - var _fillStyle = new svg.Property('fill', ctx.fillStyle); - - _fillStyle = _fillStyle.addOpacity(this.style('fill-opacity')); - ctx.fillStyle = _fillStyle.value; - } // stroke - - - if (this.style('stroke').isUrlDefinition()) { - var _fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity')); - - if (!isNullish(_fs)) ctx.strokeStyle = _fs; - } else if (this.style('stroke').hasValue()) { - var strokeStyle = this.style('stroke'); - if (strokeStyle.value === 'currentColor') strokeStyle.value = this.style('color').value; - ctx.strokeStyle = strokeStyle.value === 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value; - } - - if (this.style('stroke-opacity').hasValue()) { - var _strokeStyle = new svg.Property('stroke', ctx.strokeStyle); - - _strokeStyle = _strokeStyle.addOpacity(this.style('stroke-opacity')); - ctx.strokeStyle = _strokeStyle.value; - } - - if (this.style('stroke-width').hasValue()) { - var newLineWidth = this.style('stroke-width').toPixels(); - ctx.lineWidth = newLineWidth === 0 ? 0.001 : newLineWidth; // browsers don't respect 0 - } - - if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value; - if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value; - if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value; - - if (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value !== 'none') { - var gaps = svg.ToNumberArray(this.style('stroke-dasharray').value); - - if (typeof ctx.setLineDash !== 'undefined') { - ctx.setLineDash(gaps); - } else if (typeof ctx.webkitLineDash !== 'undefined') { - ctx.webkitLineDash = gaps; - } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) { - ctx.mozDash = gaps; - } - - var offset = this.style('stroke-dashoffset').numValueOrDefault(1); - - if (typeof ctx.lineDashOffset !== 'undefined') { - ctx.lineDashOffset = offset; - } else if (typeof ctx.webkitLineDashOffset !== 'undefined') { - ctx.webkitLineDashOffset = offset; - } else if (typeof ctx.mozDashOffset !== 'undefined') { - ctx.mozDashOffset = offset; - } - } // font - - - if (typeof ctx.font !== 'undefined') { - ctx.font = svg.Font.CreateFont(this.style('font-style').value, this.style('font-variant').value, this.style('font-weight').value, this.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '', this.style('font-family').value).toString(); - } // transform - - - if (this.attribute('transform').hasValue()) { - var transform = new svg.Transform(this.attribute('transform').value); - transform.apply(ctx); - } // clip - - - if (this.style('clip-path', false, true).hasValue()) { - var clip = this.style('clip-path', false, true).getDefinition(); - if (!isNullish(clip)) clip.apply(ctx); - } // opacity - - - if (this.style('opacity').hasValue()) { - ctx.globalAlpha = this.style('opacity').numValue(); - } - } - }]); - - return _class5; - }(svg.Element.ElementBase); - - svg.Element.PathElementBase = /*#__PURE__*/function (_svg$Element$Rendered) { - _inherits(_class6, _svg$Element$Rendered); - - var _super5 = _createSuper(_class6); - - function _class6() { - _classCallCheck(this, _class6); - - return _super5.apply(this, arguments); - } - - _createClass(_class6, [{ - key: "path", - value: function path(ctx) { - if (!isNullish(ctx)) ctx.beginPath(); - return new svg.BoundingBox(); - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - this.path(ctx); - svg.Mouse.checkPath(this, ctx); - - if (ctx.fillStyle !== '') { - if (this.style('fill-rule').valueOrDefault('inherit') !== 'inherit') { - ctx.fill(this.style('fill-rule').value); - } else { - ctx.fill(); - } - } - - if (ctx.strokeStyle !== '') ctx.stroke(); - var markers = this.getMarkers(); - - if (!isNullish(markers)) { - if (this.style('marker-start').isUrlDefinition()) { - var marker = this.style('marker-start').getDefinition(); - marker.render(ctx, markers[0][0], markers[0][1]); - } - - if (this.style('marker-mid').isUrlDefinition()) { - var _marker = this.style('marker-mid').getDefinition(); - - for (var i = 1; i < markers.length - 1; i++) { - _marker.render(ctx, markers[i][0], markers[i][1]); - } - } - - if (this.style('marker-end').isUrlDefinition()) { - var _marker2 = this.style('marker-end').getDefinition(); - - _marker2.render(ctx, markers[markers.length - 1][0], markers[markers.length - 1][1]); - } - } - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - return this.path(); - } - }, { - key: "getMarkers", - value: function getMarkers() { - return null; - } - }]); - - return _class6; - }(svg.Element.RenderedElementBase); // svg element - - - svg.Element.svg = /*#__PURE__*/function (_svg$Element$Rendered2) { - _inherits(_class7, _svg$Element$Rendered2); - - var _super6 = _createSuper(_class7); - - function _class7() { - _classCallCheck(this, _class7); - - return _super6.apply(this, arguments); - } - - _createClass(_class7, [{ - key: "clearContext", - value: function clearContext(ctx) { - _get(_getPrototypeOf(_class7.prototype), "clearContext", this).call(this, ctx); - - svg.ViewPort.RemoveCurrent(); - } - }, { - key: "setContext", - value: function setContext(ctx) { - // initial values and defaults - ctx.strokeStyle = 'rgba(0,0,0,0)'; - ctx.lineCap = 'butt'; - ctx.lineJoin = 'miter'; - ctx.miterLimit = 4; - - if (typeof ctx.font !== 'undefined' && typeof window.getComputedStyle !== 'undefined') { - ctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font'); - } - - _get(_getPrototypeOf(_class7.prototype), "setContext", this).call(this, ctx); // create new view port - - - if (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0; - if (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0; - ctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y')); - var width = svg.ViewPort.width(); - var height = svg.ViewPort.height(); - if (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%'; - if (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%'; - - if (typeof this.root === 'undefined') { - width = this.attribute('width').toPixels('x'); - height = this.attribute('height').toPixels('y'); - var x = 0; - var y = 0; - - if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) { - x = -this.attribute('refX').toPixels('x'); - y = -this.attribute('refY').toPixels('y'); - } - - if (this.attribute('overflow').valueOrDefault('hidden') !== 'visible') { - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(width, y); - ctx.lineTo(width, height); - ctx.lineTo(x, height); - ctx.closePath(); - ctx.clip(); - } - } - - svg.ViewPort.SetCurrent(width, height); // viewbox - - if (this.attribute('viewBox').hasValue()) { - var viewBox = svg.ToNumberArray(this.attribute('viewBox').value); - var minX = viewBox[0]; - var minY = viewBox[1]; - width = viewBox[2]; - height = viewBox[3]; - svg.AspectRatio(ctx, this.attribute('preserveAspectRatio').value, svg.ViewPort.width(), width, svg.ViewPort.height(), height, minX, minY, this.attribute('refX').value, this.attribute('refY').value); - svg.ViewPort.RemoveCurrent(); - svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]); - } - } - }]); - - return _class7; - }(svg.Element.RenderedElementBase); // rect element - - - svg.Element.rect = /*#__PURE__*/function (_svg$Element$PathElem) { - _inherits(_class8, _svg$Element$PathElem); - - var _super7 = _createSuper(_class8); - - function _class8() { - _classCallCheck(this, _class8); - - return _super7.apply(this, arguments); - } - - _createClass(_class8, [{ - key: "path", - value: function path(ctx) { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - var rx = this.attribute('rx').toPixels('x'); - var ry = this.attribute('ry').toPixels('y'); - if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx; - if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry; - rx = Math.min(rx, width / 2.0); - ry = Math.min(ry, height / 2.0); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(x + rx, y); - ctx.lineTo(x + width - rx, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + ry); - ctx.lineTo(x + width, y + height - ry); - ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); - ctx.lineTo(x + rx, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - ry); - ctx.lineTo(x, y + ry); - ctx.quadraticCurveTo(x, y, x + rx, y); - ctx.closePath(); - } - - return new svg.BoundingBox(x, y, x + width, y + height); - } - }]); - - return _class8; - }(svg.Element.PathElementBase); // circle element - - - svg.Element.circle = /*#__PURE__*/function (_svg$Element$PathElem2) { - _inherits(_class9, _svg$Element$PathElem2); - - var _super8 = _createSuper(_class9); - - function _class9() { - _classCallCheck(this, _class9); - - return _super8.apply(this, arguments); - } - - _createClass(_class9, [{ - key: "path", - value: function path(ctx) { - var cx = this.attribute('cx').toPixels('x'); - var cy = this.attribute('cy').toPixels('y'); - var r = this.attribute('r').toPixels(); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.arc(cx, cy, r, 0, Math.PI * 2, true); - ctx.closePath(); - } - - return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r); - } - }]); - - return _class9; - }(svg.Element.PathElementBase); // ellipse element - - - var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3); - - svg.Element.ellipse = /*#__PURE__*/function (_svg$Element$PathElem3) { - _inherits(_class10, _svg$Element$PathElem3); - - var _super9 = _createSuper(_class10); - - function _class10() { - _classCallCheck(this, _class10); - - return _super9.apply(this, arguments); - } - - _createClass(_class10, [{ - key: "path", - value: function path(ctx) { - var rx = this.attribute('rx').toPixels('x'); - var ry = this.attribute('ry').toPixels('y'); - var cx = this.attribute('cx').toPixels('x'); - var cy = this.attribute('cy').toPixels('y'); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(cx, cy - ry); - ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy); - ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry); - ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy); - ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry); - ctx.closePath(); - } - - return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry); - } - }]); - - return _class10; - }(svg.Element.PathElementBase); // line element - - - svg.Element.line = /*#__PURE__*/function (_svg$Element$PathElem4) { - _inherits(_class11, _svg$Element$PathElem4); - - var _super10 = _createSuper(_class11); - - function _class11() { - _classCallCheck(this, _class11); - - return _super10.apply(this, arguments); - } - - _createClass(_class11, [{ - key: "getPoints", - value: function getPoints() { - return [new svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')), new svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))]; - } - }, { - key: "path", - value: function path(ctx) { - var points = this.getPoints(); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(points[0].x, points[0].y); - ctx.lineTo(points[1].x, points[1].y); - } - - return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y); - } - }, { - key: "getMarkers", - value: function getMarkers() { - var points = this.getPoints(); - var a = points[0].angleTo(points[1]); - return [[points[0], a], [points[1], a]]; - } - }]); - - return _class11; - }(svg.Element.PathElementBase); // polyline element - - - svg.Element.polyline = /*#__PURE__*/function (_svg$Element$PathElem5) { - _inherits(_class12, _svg$Element$PathElem5); - - var _super11 = _createSuper(_class12); - - function _class12(node) { - var _this8; - - _classCallCheck(this, _class12); - - _this8 = _super11.call(this, node); - _this8.points = svg.CreatePath(_this8.attribute('points').value); - return _this8; - } - - _createClass(_class12, [{ - key: "path", - value: function path(ctx) { - var _this$points$ = this.points[0], - x = _this$points$.x, - y = _this$points$.y; - var bb = new svg.BoundingBox(x, y); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(x, y); - } - - for (var i = 1; i < this.points.length; i++) { - var _this$points$i = this.points[i], - _x = _this$points$i.x, - _y = _this$points$i.y; - bb.addPoint(_x, _y); - if (!isNullish(ctx)) ctx.lineTo(_x, _y); - } - - return bb; - } - }, { - key: "getMarkers", - value: function getMarkers() { - var markers = []; - - for (var i = 0; i < this.points.length - 1; i++) { - markers.push([this.points[i], this.points[i].angleTo(this.points[i + 1])]); - } - - markers.push([this.points[this.points.length - 1], markers[markers.length - 1][1]]); - return markers; - } - }]); - - return _class12; - }(svg.Element.PathElementBase); // polygon element - - - svg.Element.polygon = /*#__PURE__*/function (_svg$Element$polyline) { - _inherits(_class13, _svg$Element$polyline); - - var _super12 = _createSuper(_class13); - - function _class13() { - _classCallCheck(this, _class13); - - return _super12.apply(this, arguments); - } - - _createClass(_class13, [{ - key: "path", - value: function path(ctx) { - var bb = _get(_getPrototypeOf(_class13.prototype), "path", this).call(this, ctx); - - if (!isNullish(ctx)) { - ctx.lineTo(this.points[0].x, this.points[0].y); - ctx.closePath(); - } - - return bb; - } - }]); - - return _class13; - }(svg.Element.polyline); // path element - - - svg.Element.path = /*#__PURE__*/function (_svg$Element$PathElem6) { - _inherits(_class14, _svg$Element$PathElem6); - - var _super13 = _createSuper(_class14); - - function _class14(node) { - var _this9; - - _classCallCheck(this, _class14); - - _this9 = _super13.call(this, node); - - var d = _this9.attribute('d').value // TODO: convert to real lexer based on https://www.w3.org/TR/SVG11/paths.html#PathDataBNF - .replace(/,/gm, ' ') // get rid of all commas - .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands - .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands - .replace(/([MmZzLlHhVvCcSsQqTtAa])(\S)/gm, '$1 $2') // separate commands from points - .replace(/(\S)([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from points - .replace(/(\d)([+-])/gm, '$1 $2') // separate digits when no comma - .replace(/(\.\d*)(\.)/gm, '$1 $2') // separate digits when no comma - .replace(/([Aa](\s+\d+)(\s+\d+)(\s+\d+))\s+([01])\s*([01])/gm, '$1 $5 $6 '); // shorthand elliptical arc path syntax - - - d = svg.compressSpaces(d); // compress multiple spaces - - d = svg.trim(d); - _this9.PathParser = { - tokens: d.split(' '), - reset: function reset() { - this.i = -1; - this.command = ''; - this.previousCommand = ''; - this.start = new svg.Point(0, 0); - this.control = new svg.Point(0, 0); - this.current = new svg.Point(0, 0); - this.points = []; - this.angles = []; - }, - isEnd: function isEnd() { - return this.i >= this.tokens.length - 1; - }, - isCommandOrEnd: function isCommandOrEnd() { - if (this.isEnd()) return true; - return !isNullish(this.tokens[this.i + 1].match(/^[A-Za-z]$/)); - }, - isRelativeCommand: function isRelativeCommand() { - switch (this.command) { - case 'm': - case 'l': - case 'h': - case 'v': - case 'c': - case 's': - case 'q': - case 't': - case 'a': - case 'z': - return true; - } - - return false; - }, - getToken: function getToken() { - this.i++; - return this.tokens[this.i]; - }, - getScalar: function getScalar() { - return Number.parseFloat(this.getToken()); - }, - nextCommand: function nextCommand() { - this.previousCommand = this.command; - this.command = this.getToken(); - }, - getPoint: function getPoint() { - var p = new svg.Point(this.getScalar(), this.getScalar()); - return this.makeAbsolute(p); - }, - getAsControlPoint: function getAsControlPoint() { - var p = this.getPoint(); - this.control = p; - return p; - }, - getAsCurrentPoint: function getAsCurrentPoint() { - var p = this.getPoint(); - this.current = p; - return p; - }, - getReflectedControlPoint: function getReflectedControlPoint() { - if (this.previousCommand.toLowerCase() !== 'c' && this.previousCommand.toLowerCase() !== 's' && this.previousCommand.toLowerCase() !== 'q' && this.previousCommand.toLowerCase() !== 't') { - return this.current; - } // reflect point - - - var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); - return p; - }, - makeAbsolute: function makeAbsolute(p) { - if (this.isRelativeCommand()) { - p.x += this.current.x; - p.y += this.current.y; - } - - return p; - }, - addMarker: function addMarker(p, from, priorTo) { - // if the last angle isn't filled in because we didn't have this point yet ... - if (!isNullish(priorTo) && this.angles.length > 0 && isNullish(this.angles[this.angles.length - 1])) { - this.angles[this.angles.length - 1] = this.points[this.points.length - 1].angleTo(priorTo); - } - - this.addMarkerAngle(p, isNullish(from) ? null : from.angleTo(p)); - }, - addMarkerAngle: function addMarkerAngle(p, a) { - this.points.push(p); - this.angles.push(a); - }, - getMarkerPoints: function getMarkerPoints() { - return this.points; - }, - getMarkerAngles: function getMarkerAngles() { - for (var i = 0; i < this.angles.length; i++) { - if (isNullish(this.angles[i])) { - for (var j = i + 1; j < this.angles.length; j++) { - if (!isNullish(this.angles[j])) { - this.angles[i] = this.angles[j]; - break; - } - } - } - } - - return this.angles; - } - }; - return _this9; - } - - _createClass(_class14, [{ - key: "path", - value: function path(ctx) { - var pp = this.PathParser; - pp.reset(); - var bb = new svg.BoundingBox(); - if (!isNullish(ctx)) ctx.beginPath(); - - while (!pp.isEnd()) { - pp.nextCommand(); - - switch (pp.command) { - case 'M': - case 'm': - { - var p = pp.getAsCurrentPoint(); - pp.addMarker(p); - bb.addPoint(p.x, p.y); - if (!isNullish(ctx)) ctx.moveTo(p.x, p.y); - pp.start = pp.current; - - while (!pp.isCommandOrEnd()) { - var _p = pp.getAsCurrentPoint(); - - pp.addMarker(_p, pp.start); - bb.addPoint(_p.x, _p.y); - if (!isNullish(ctx)) ctx.lineTo(_p.x, _p.y); - } - - break; - } - - case 'L': - case 'l': - while (!pp.isCommandOrEnd()) { - var c = pp.current; - - var _p2 = pp.getAsCurrentPoint(); - - pp.addMarker(_p2, c); - bb.addPoint(_p2.x, _p2.y); - if (!isNullish(ctx)) ctx.lineTo(_p2.x, _p2.y); - } - - break; - - case 'H': - case 'h': - while (!pp.isCommandOrEnd()) { - var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y); - pp.addMarker(newP, pp.current); - pp.current = newP; - bb.addPoint(pp.current.x, pp.current.y); - if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y); - } - - break; - - case 'V': - case 'v': - while (!pp.isCommandOrEnd()) { - var _newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar()); - - pp.addMarker(_newP, pp.current); - pp.current = _newP; - bb.addPoint(pp.current.x, pp.current.y); - if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y); - } - - break; - - case 'C': - case 'c': - while (!pp.isCommandOrEnd()) { - var curr = pp.current; - var p1 = pp.getPoint(); - var cntrl = pp.getAsControlPoint(); - var cp = pp.getAsCurrentPoint(); - pp.addMarker(cp, cntrl, p1); - bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); - if (!isNullish(ctx)) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); - } - - break; - - case 'S': - case 's': - while (!pp.isCommandOrEnd()) { - var _curr = pp.current; - - var _p3 = pp.getReflectedControlPoint(); - - var _cntrl = pp.getAsControlPoint(); - - var _cp = pp.getAsCurrentPoint(); - - pp.addMarker(_cp, _cntrl, _p3); - bb.addBezierCurve(_curr.x, _curr.y, _p3.x, _p3.y, _cntrl.x, _cntrl.y, _cp.x, _cp.y); - if (!isNullish(ctx)) ctx.bezierCurveTo(_p3.x, _p3.y, _cntrl.x, _cntrl.y, _cp.x, _cp.y); - } - - break; - - case 'Q': - case 'q': - while (!pp.isCommandOrEnd()) { - var _curr2 = pp.current; - - var _cntrl2 = pp.getAsControlPoint(); - - var _cp2 = pp.getAsCurrentPoint(); - - pp.addMarker(_cp2, _cntrl2, _cntrl2); - bb.addQuadraticCurve(_curr2.x, _curr2.y, _cntrl2.x, _cntrl2.y, _cp2.x, _cp2.y); - if (!isNullish(ctx)) ctx.quadraticCurveTo(_cntrl2.x, _cntrl2.y, _cp2.x, _cp2.y); - } - - break; - - case 'T': - case 't': - while (!pp.isCommandOrEnd()) { - var _curr3 = pp.current; - - var _cntrl3 = pp.getReflectedControlPoint(); - - pp.control = _cntrl3; - - var _cp3 = pp.getAsCurrentPoint(); - - pp.addMarker(_cp3, _cntrl3, _cntrl3); - bb.addQuadraticCurve(_curr3.x, _curr3.y, _cntrl3.x, _cntrl3.y, _cp3.x, _cp3.y); - if (!isNullish(ctx)) ctx.quadraticCurveTo(_cntrl3.x, _cntrl3.y, _cp3.x, _cp3.y); - } - - break; - - case 'A': - case 'a': - var _loop2 = function _loop2() { - var curr = pp.current; - var rx = pp.getScalar(); - var ry = pp.getScalar(); - var xAxisRotation = pp.getScalar() * (Math.PI / 180.0); - var largeArcFlag = pp.getScalar(); - var sweepFlag = pp.getScalar(); - var cp = pp.getAsCurrentPoint(); // Conversion from endpoint to center parameterization - // https://www.w3.org/TR/SVG11/implnote.html#ArcConversionEndpointToCenter - // x1', y1' - - var currp = new svg.Point(Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0, -Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0); // adjust radii - - var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2); - - if (l > 1) { - rx *= Math.sqrt(l); - ry *= Math.sqrt(l); - } // cx', cy' - - - var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2))); - if (isNaN(s)) s = 0; - var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy - - var centp = new svg.Point((curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // vector magnitude - - var m = function m(v) { - return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2)); - }; // ratio between two vectors - - - var r = function r(u, v) { - return (u[0] * v[0] + u[1] * v[1]) / (m(u) * m(v)); - }; // angle between two vectors - - - var a = function a(u, v) { - return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(r(u, v)); - }; // initial angle - - - var a1 = a([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // angle delta - - var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]; - var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry]; - var ad = a(u, v); - if (r(u, v) <= -1) ad = Math.PI; - if (r(u, v) >= 1) ad = 0; // for markers - - var dir = 1 - sweepFlag ? 1.0 : -1.0; - var ah = a1 + dir * (ad / 2.0); - var halfWay = new svg.Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah)); - pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2); - pp.addMarkerAngle(cp, ah - dir * Math.PI); - bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better - - if (!isNullish(ctx)) { - var _r = rx > ry ? rx : ry; - - var sx = rx > ry ? 1 : rx / ry; - var sy = rx > ry ? ry / rx : 1; - ctx.translate(centp.x, centp.y); - ctx.rotate(xAxisRotation); - ctx.scale(sx, sy); - ctx.arc(0, 0, _r, a1, a1 + ad, 1 - sweepFlag); - ctx.scale(1 / sx, 1 / sy); - ctx.rotate(-xAxisRotation); - ctx.translate(-centp.x, -centp.y); - } - }; - - while (!pp.isCommandOrEnd()) { - _loop2(); - } - - break; - - case 'Z': - case 'z': - if (!isNullish(ctx)) ctx.closePath(); - pp.current = pp.start; - } - } - - return bb; - } - }, { - key: "getMarkers", - value: function getMarkers() { - var points = this.PathParser.getMarkerPoints(); - var angles = this.PathParser.getMarkerAngles(); - var markers = points.map(function (point, i) { - return [point, angles[i]]; - }); - return markers; - } - }]); - - return _class14; - }(svg.Element.PathElementBase); // pattern element - - - svg.Element.pattern = /*#__PURE__*/function (_svg$Element$ElementB2) { - _inherits(_class15, _svg$Element$ElementB2); - - var _super14 = _createSuper(_class15); - - function _class15() { - _classCallCheck(this, _class15); - - return _super14.apply(this, arguments); - } - - _createClass(_class15, [{ - key: "createPattern", - value: function createPattern(ctx, element) { - var width = this.attribute('width').toPixels('x', true); - var height = this.attribute('height').toPixels('y', true); // render me using a temporary svg element - - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value); - tempSvg.attributes.width = new svg.Property('width', width + 'px'); - tempSvg.attributes.height = new svg.Property('height', height + 'px'); - tempSvg.attributes.transform = new svg.Property('transform', this.attribute('patternTransform').value); - tempSvg.children = this.children; - var c = document.createElement('canvas'); - c.width = width; - c.height = height; - var cctx = c.getContext('2d'); - - if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) { - cctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true)); - } // render 3x3 grid so when we transform there's no white space on edges - - - for (var x = -1; x <= 1; x++) { - for (var y = -1; y <= 1; y++) { - cctx.save(); - cctx.translate(x * c.width, y * c.height); - tempSvg.render(cctx); - cctx.restore(); - } - } - - var pattern = ctx.createPattern(c, 'repeat'); - return pattern; - } - }]); - - return _class15; - }(svg.Element.ElementBase); // marker element - - - svg.Element.marker = /*#__PURE__*/function (_svg$Element$ElementB3) { - _inherits(_class16, _svg$Element$ElementB3); - - var _super15 = _createSuper(_class16); - - function _class16() { - _classCallCheck(this, _class16); - - return _super15.apply(this, arguments); - } - - _createClass(_class16, [{ - key: "render", - value: function render(ctx, point, angle) { - ctx.translate(point.x, point.y); - if (this.attribute('orient').valueOrDefault('auto') === 'auto') ctx.rotate(angle); - if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth); - ctx.save(); // render me using a temporary svg element - - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value); - tempSvg.attributes.refX = new svg.Property('refX', this.attribute('refX').value); - tempSvg.attributes.refY = new svg.Property('refY', this.attribute('refY').value); - tempSvg.attributes.width = new svg.Property('width', this.attribute('markerWidth').value); - tempSvg.attributes.height = new svg.Property('height', this.attribute('markerHeight').value); - tempSvg.attributes.fill = new svg.Property('fill', this.attribute('fill').valueOrDefault('black')); - tempSvg.attributes.stroke = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none')); - tempSvg.children = this.children; - tempSvg.render(ctx); - ctx.restore(); - if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth); - - if (this.attribute('orient').valueOrDefault('auto') === 'auto') { - ctx.rotate(-angle); - } - - ctx.translate(-point.x, -point.y); - } - }]); - - return _class16; - }(svg.Element.ElementBase); // definitions element - - - svg.Element.defs = /*#__PURE__*/function (_svg$Element$ElementB4) { - _inherits(_class17, _svg$Element$ElementB4); - - var _super16 = _createSuper(_class17); - - function _class17() { - _classCallCheck(this, _class17); - - return _super16.apply(this, arguments); - } - - _createClass(_class17, [{ - key: "render", - value: function render(ctx) {// NOOP - } - }]); - - return _class17; - }(svg.Element.ElementBase); // base for gradients - - - svg.Element.GradientBase = /*#__PURE__*/function (_svg$Element$ElementB5) { - _inherits(_class18, _svg$Element$ElementB5); - - var _super17 = _createSuper(_class18); - - function _class18(node) { - var _this10; - - _classCallCheck(this, _class18); - - _this10 = _super17.call(this, node); - _this10.gradientUnits = _this10.attribute('gradientUnits').valueOrDefault('objectBoundingBox'); - _this10.stops = []; - - _this10.children.forEach(function (child) { - if (child.type === 'stop') { - _this10.stops.push(child); - } - }); - - return _this10; - } - - _createClass(_class18, [{ - key: "getGradient", - value: function getGradient() {// OVERRIDE ME! - } - }, { - key: "createGradient", - value: function createGradient(ctx, element, parentOpacityProp) { - var stopsContainer = this.getHrefAttribute().hasValue() ? this.getHrefAttribute().getDefinition() : this; - - var addParentOpacity = function addParentOpacity(color) { - if (parentOpacityProp.hasValue()) { - var p = new svg.Property('color', color); - return p.addOpacity(parentOpacityProp).value; - } - - return color; - }; - - var g = this.getGradient(ctx, element); - if (isNullish(g)) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color); - stopsContainer.stops.forEach(function (_ref10) { - var offset = _ref10.offset, - color = _ref10.color; - g.addColorStop(offset, addParentOpacity(color)); - }); - - if (this.attribute('gradientTransform').hasValue()) { - // render as transformed pattern on temporary canvas - var rootView = svg.ViewPort.viewPorts[0]; - var rect = new svg.Element.rect(); - rect.attributes.x = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS / 3.0); - rect.attributes.y = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS / 3.0); - rect.attributes.width = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS); - rect.attributes.height = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS); - var group = new svg.Element.g(); - group.attributes.transform = new svg.Property('transform', this.attribute('gradientTransform').value); - group.children = [rect]; - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.x = new svg.Property('x', 0); - tempSvg.attributes.y = new svg.Property('y', 0); - tempSvg.attributes.width = new svg.Property('width', rootView.width); - tempSvg.attributes.height = new svg.Property('height', rootView.height); - tempSvg.children = [group]; - var c = document.createElement('canvas'); - c.width = rootView.width; - c.height = rootView.height; - var tempCtx = c.getContext('2d'); - tempCtx.fillStyle = g; - tempSvg.render(tempCtx); - return tempCtx.createPattern(c, 'no-repeat'); - } - - return g; - } - }]); - - return _class18; - }(svg.Element.ElementBase); // linear gradient element - - - svg.Element.linearGradient = /*#__PURE__*/function (_svg$Element$Gradient) { - _inherits(_class19, _svg$Element$Gradient); - - var _super18 = _createSuper(_class19); - - function _class19() { - _classCallCheck(this, _class19); - - return _super18.apply(this, arguments); - } - - _createClass(_class19, [{ - key: "getGradient", - value: function getGradient(ctx, element) { - var useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox; - var bb = useBB ? element.getBoundingBox() : null; - - if (!this.attribute('x1').hasValue() && !this.attribute('y1').hasValue() && !this.attribute('x2').hasValue() && !this.attribute('y2').hasValue()) { - this.attribute('x1', true).value = 0; - this.attribute('y1', true).value = 0; - this.attribute('x2', true).value = 1; - this.attribute('y2', true).value = 0; - } - - var x1 = useBB ? bb.x() + bb.width() * this.attribute('x1').numValue() : this.attribute('x1').toPixels('x'); - var y1 = useBB ? bb.y() + bb.height() * this.attribute('y1').numValue() : this.attribute('y1').toPixels('y'); - var x2 = useBB ? bb.x() + bb.width() * this.attribute('x2').numValue() : this.attribute('x2').toPixels('x'); - var y2 = useBB ? bb.y() + bb.height() * this.attribute('y2').numValue() : this.attribute('y2').toPixels('y'); - if (x1 === x2 && y1 === y2) return null; - return ctx.createLinearGradient(x1, y1, x2, y2); - } - }]); - - return _class19; - }(svg.Element.GradientBase); // radial gradient element - - - svg.Element.radialGradient = /*#__PURE__*/function (_svg$Element$Gradient2) { - _inherits(_class20, _svg$Element$Gradient2); - - var _super19 = _createSuper(_class20); - - function _class20() { - _classCallCheck(this, _class20); - - return _super19.apply(this, arguments); - } - - _createClass(_class20, [{ - key: "getGradient", - value: function getGradient(ctx, element) { - var useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox; - var bb = useBB ? element.getBoundingBox() : null; - if (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%'; - if (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%'; - if (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%'; - var cx = useBB ? bb.x() + bb.width() * this.attribute('cx').numValue() : this.attribute('cx').toPixels('x'); - var cy = useBB ? bb.y() + bb.height() * this.attribute('cy').numValue() : this.attribute('cy').toPixels('y'); - var fx = cx; - var fy = cy; - - if (this.attribute('fx').hasValue()) { - fx = useBB ? bb.x() + bb.width() * this.attribute('fx').numValue() : this.attribute('fx').toPixels('x'); - } - - if (this.attribute('fy').hasValue()) { - fy = useBB ? bb.y() + bb.height() * this.attribute('fy').numValue() : this.attribute('fy').toPixels('y'); - } - - var r = useBB ? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue() : this.attribute('r').toPixels(); - return ctx.createRadialGradient(fx, fy, 0, cx, cy, r); - } - }]); - - return _class20; - }(svg.Element.GradientBase); // gradient stop element - - - svg.Element.stop = /*#__PURE__*/function (_svg$Element$ElementB6) { - _inherits(_class21, _svg$Element$ElementB6); - - var _super20 = _createSuper(_class21); - - function _class21(node) { - var _this11; - - _classCallCheck(this, _class21); - - _this11 = _super20.call(this, node); - _this11.offset = _this11.attribute('offset').numValue(); - if (_this11.offset < 0) _this11.offset = 0; - if (_this11.offset > 1) _this11.offset = 1; - - var stopColor = _this11.style('stop-color'); - - if (_this11.style('stop-opacity').hasValue()) { - stopColor = stopColor.addOpacity(_this11.style('stop-opacity')); - } - - _this11.color = stopColor.value; - return _this11; - } - - return _class21; - }(svg.Element.ElementBase); // animation base element - - - svg.Element.AnimateBase = /*#__PURE__*/function (_svg$Element$ElementB7) { - _inherits(_class22, _svg$Element$ElementB7); - - var _super21 = _createSuper(_class22); - - function _class22(node) { - var _this12; - - _classCallCheck(this, _class22); - - _this12 = _super21.call(this, node); - svg.Animations.push(_assertThisInitialized(_this12)); - _this12.duration = 0.0; - _this12.begin = _this12.attribute('begin').toMilliseconds(); - _this12.maxDuration = _this12.begin + _this12.attribute('dur').toMilliseconds(); - _this12.initialValue = null; - _this12.initialUnits = ''; - _this12.removed = false; - _this12.from = _this12.attribute('from'); - _this12.to = _this12.attribute('to'); - _this12.values = _this12.attribute('values'); - if (_this12.values.hasValue()) _this12.values.value = _this12.values.value.split(';'); - return _this12; - } - - _createClass(_class22, [{ - key: "getProperty", - value: function getProperty() { - var attributeType = this.attribute('attributeType').value; - var attributeName = this.attribute('attributeName').value; - - if (attributeType === 'CSS') { - return this.parent.style(attributeName, true); - } - - return this.parent.attribute(attributeName, true); - } - }, { - key: "calcValue", - value: function calcValue() { - // OVERRIDE ME! - return ''; - } - }, { - key: "update", - value: function update(delta) { - // set initial value - if (isNullish(this.initialValue)) { - this.initialValue = this.getProperty().value; - this.initialUnits = this.getProperty().getUnits(); - } // if we're past the end time - - - if (this.duration > this.maxDuration) { - // loop for indefinitely repeating animations - if (this.attribute('repeatCount').value === 'indefinite' || this.attribute('repeatDur').value === 'indefinite') { - this.duration = 0.0; - } else if (this.attribute('fill').valueOrDefault('remove') === 'freeze' && !this.frozen) { - this.frozen = true; - this.parent.animationFrozen = true; - this.parent.animationFrozenValue = this.getProperty().value; - } else if (this.attribute('fill').valueOrDefault('remove') === 'remove' && !this.removed) { - this.removed = true; - this.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue; - return true; - } - - return false; - } - - this.duration += delta; // if we're past the begin time - - var updated = false; - - if (this.begin < this.duration) { - var newValue = this.calcValue(); // tween - - if (this.attribute('type').hasValue()) { - // for transform, etc. - var type = this.attribute('type').value; - newValue = type + '(' + newValue + ')'; - } - - this.getProperty().value = newValue; - updated = true; - } - - return updated; - } // fraction of duration we've covered - - }, { - key: "progress", - value: function progress() { - var ret = { - progress: (this.duration - this.begin) / (this.maxDuration - this.begin) - }; - - if (this.values.hasValue()) { - var p = ret.progress * (this.values.value.length - 1); - var lb = Math.floor(p), - ub = Math.ceil(p); - ret.from = new svg.Property('from', Number.parseFloat(this.values.value[lb])); - ret.to = new svg.Property('to', Number.parseFloat(this.values.value[ub])); - ret.progress = (p - lb) / (ub - lb); - } else { - ret.from = this.from; - ret.to = this.to; - } - - return ret; - } - }]); - - return _class22; - }(svg.Element.ElementBase); // animate element - - - svg.Element.animate = /*#__PURE__*/function (_svg$Element$AnimateB) { - _inherits(_class23, _svg$Element$AnimateB); - - var _super22 = _createSuper(_class23); - - function _class23() { - _classCallCheck(this, _class23); - - return _super22.apply(this, arguments); - } - - _createClass(_class23, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); // tween value linearly - - var newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress; - return newValue + this.initialUnits; - } - }]); - - return _class23; - }(svg.Element.AnimateBase); // animate color element - - - svg.Element.animateColor = /*#__PURE__*/function (_svg$Element$AnimateB2) { - _inherits(_class24, _svg$Element$AnimateB2); - - var _super23 = _createSuper(_class24); - - function _class24() { - _classCallCheck(this, _class24); - - return _super23.apply(this, arguments); - } - - _createClass(_class24, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); - var from = new RGBColor(p.from.value); - var to = new RGBColor(p.to.value); - - if (from.ok && to.ok) { - // tween color linearly - var r = from.r + (to.r - from.r) * p.progress; - var g = from.g + (to.g - from.g) * p.progress; - var b = from.b + (to.b - from.b) * p.progress; - return 'rgb(' + Number.parseInt(r) + ',' + Number.parseInt(g) + ',' + Number.parseInt(b) + ')'; - } - - return this.attribute('from').value; - } - }]); - - return _class24; - }(svg.Element.AnimateBase); // animate transform element - - - svg.Element.animateTransform = /*#__PURE__*/function (_svg$Element$animate) { - _inherits(_class25, _svg$Element$animate); - - var _super24 = _createSuper(_class25); - - function _class25() { - _classCallCheck(this, _class25); - - return _super24.apply(this, arguments); - } - - _createClass(_class25, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); // tween value linearly - - var from = svg.ToNumberArray(p.from.value); - var to = svg.ToNumberArray(p.to.value); - var newValue = ''; - from.forEach(function (fr, i) { - newValue += fr + (to[i] - fr) * p.progress + ' '; - }); - return newValue; - } - }]); - - return _class25; - }(svg.Element.animate); // font element - - - svg.Element.font = /*#__PURE__*/function (_svg$Element$ElementB8) { - _inherits(_class26, _svg$Element$ElementB8); - - var _super25 = _createSuper(_class26); - - function _class26(node) { - var _this13; - - _classCallCheck(this, _class26); - - _this13 = _super25.call(this, node); - _this13.horizAdvX = _this13.attribute('horiz-adv-x').numValue(); - _this13.isRTL = false; - _this13.isArabic = false; - _this13.fontFace = null; - _this13.missingGlyph = null; - _this13.glyphs = []; - - _this13.children.forEach(function (child) { - if (child.type === 'font-face') { - _this13.fontFace = child; - - if (child.style('font-family').hasValue()) { - svg.Definitions[child.style('font-family').value] = _assertThisInitialized(_this13); - } - } else if (child.type === 'missing-glyph') { - _this13.missingGlyph = child; - } else if (child.type === 'glyph') { - if (child.arabicForm !== '') { - _this13.isRTL = true; - _this13.isArabic = true; - - if (typeof _this13.glyphs[child.unicode] === 'undefined') { - _this13.glyphs[child.unicode] = []; - } - - _this13.glyphs[child.unicode][child.arabicForm] = child; - } else { - _this13.glyphs[child.unicode] = child; - } - } - }); - - return _this13; - } - - return _class26; - }(svg.Element.ElementBase); // font-face element - - - svg.Element.fontface = /*#__PURE__*/function (_svg$Element$ElementB9) { - _inherits(_class27, _svg$Element$ElementB9); - - var _super26 = _createSuper(_class27); - - function _class27(node) { - var _this14; - - _classCallCheck(this, _class27); - - _this14 = _super26.call(this, node); - _this14.ascent = _this14.attribute('ascent').value; - _this14.descent = _this14.attribute('descent').value; - _this14.unitsPerEm = _this14.attribute('units-per-em').numValue(); - return _this14; - } - - return _class27; - }(svg.Element.ElementBase); // missing-glyph element - - - svg.Element.missingglyph = /*#__PURE__*/function (_svg$Element$path) { - _inherits(_class28, _svg$Element$path); - - var _super27 = _createSuper(_class28); - - function _class28(node) { - var _this15; - - _classCallCheck(this, _class28); - - _this15 = _super27.call(this, node); - _this15.horizAdvX = 0; - return _this15; - } - - return _class28; - }(svg.Element.path); // glyph element - - - svg.Element.glyph = /*#__PURE__*/function (_svg$Element$path2) { - _inherits(_class29, _svg$Element$path2); - - var _super28 = _createSuper(_class29); - - function _class29(node) { - var _this16; - - _classCallCheck(this, _class29); - - _this16 = _super28.call(this, node); - _this16.horizAdvX = _this16.attribute('horiz-adv-x').numValue(); - _this16.unicode = _this16.attribute('unicode').value; - _this16.arabicForm = _this16.attribute('arabic-form').value; - return _this16; - } - - return _class29; - }(svg.Element.path); // text element - - - svg.Element.text = /*#__PURE__*/function (_svg$Element$Rendered3) { - _inherits(_class30, _svg$Element$Rendered3); - - var _super29 = _createSuper(_class30); - - function _class30(node) { - _classCallCheck(this, _class30); - - return _super29.call(this, node, true); - } - - _createClass(_class30, [{ - key: "setContext", - value: function setContext(ctx) { - _get(_getPrototypeOf(_class30.prototype), "setContext", this).call(this, ctx); - - var textBaseline = this.style('dominant-baseline').toTextBaseline(); - if (isNullish(textBaseline)) textBaseline = this.style('alignment-baseline').toTextBaseline(); - if (!isNullish(textBaseline)) ctx.textBaseline = textBaseline; - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - return new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y); - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var _this17 = this; - - this.x = this.attribute('x').toPixels('x'); - this.y = this.attribute('y').toPixels('y'); - this.x += this.getAnchorDelta(ctx, this, 0); - this.children.forEach(function (child, i) { - _this17.renderChild(ctx, _this17, i); - }); - } - }, { - key: "getAnchorDelta", - value: function getAnchorDelta(ctx, parent, startI) { - var textAnchor = this.style('text-anchor').valueOrDefault('start'); - - if (textAnchor !== 'start') { - var width = 0; - - for (var i = startI; i < parent.children.length; i++) { - var child = parent.children[i]; - if (i > startI && child.attribute('x').hasValue()) break; // new group - - width += child.measureTextRecursive(ctx); - } - - return -1 * (textAnchor === 'end' ? width : width / 2.0); - } - - return 0; - } - }, { - key: "renderChild", - value: function renderChild(ctx, parent, i) { - var child = parent.children[i]; - - if (child.attribute('x').hasValue()) { - child.x = child.attribute('x').toPixels('x') + this.getAnchorDelta(ctx, parent, i); - if (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x'); - } else { - if (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x'); - if (child.attribute('dx').hasValue()) this.x += child.attribute('dx').toPixels('x'); - child.x = this.x; - } - - this.x = child.x + child.measureText(ctx); - - if (child.attribute('y').hasValue()) { - child.y = child.attribute('y').toPixels('y'); - if (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y'); - } else { - if (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y'); - if (child.attribute('dy').hasValue()) this.y += child.attribute('dy').toPixels('y'); - child.y = this.y; - } - - this.y = child.y; - child.render(ctx); - - for (var j = 0; j < child.children.length; j++) { - this.renderChild(ctx, child, j); - } - } - }]); - - return _class30; - }(svg.Element.RenderedElementBase); // text base - - - svg.Element.TextElementBase = /*#__PURE__*/function (_svg$Element$Rendered4) { - _inherits(_class31, _svg$Element$Rendered4); - - var _super30 = _createSuper(_class31); - - function _class31() { - _classCallCheck(this, _class31); - - return _super30.apply(this, arguments); - } - - _createClass(_class31, [{ - key: "getGlyph", - value: function getGlyph(font, text, i) { - var c = text[i]; - var glyph = null; - - if (font.isArabic) { - var arabicForm = 'isolated'; - if ((i === 0 || text[i - 1] === ' ') && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'terminal'; - if (i > 0 && text[i - 1] !== ' ' && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'medial'; - if (i > 0 && text[i - 1] !== ' ' && (i === text.length - 1 || text[i + 1] === ' ')) arabicForm = 'initial'; - - if (typeof font.glyphs[c] !== 'undefined') { - glyph = font.glyphs[c][arabicForm]; - if (isNullish(glyph) && font.glyphs[c].type === 'glyph') glyph = font.glyphs[c]; - } - } else { - glyph = font.glyphs[c]; - } - - if (isNullish(glyph)) glyph = font.missingGlyph; - return glyph; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var customFont = this.parent.style('font-family').getDefinition(); - - if (!isNullish(customFont)) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); - var text = this.getText(); - if (customFont.isRTL) text = text.split('').reverse().join(''); - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - - for (var i = 0; i < text.length; i++) { - var glyph = this.getGlyph(customFont, text, i); - var scale = fontSize / customFont.fontFace.unitsPerEm; - ctx.translate(this.x, this.y); - ctx.scale(scale, -scale); - var lw = ctx.lineWidth; - ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize; - if (fontStyle === 'italic') ctx.transform(1, 0, 0.4, 1, 0, 0); - glyph.render(ctx); - if (fontStyle === 'italic') ctx.transform(1, 0, -0.4, 1, 0, 0); - ctx.lineWidth = lw; - ctx.scale(1 / scale, -1 / scale); - ctx.translate(-this.x, -this.y); - this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm; - - if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) { - this.x += dx[i]; - } - } - - return; - } - - if (ctx.fillStyle !== '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y); - if (ctx.strokeStyle !== '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y); - } - }, { - key: "getText", - value: function getText() {// OVERRIDE ME - } - }, { - key: "measureTextRecursive", - value: function measureTextRecursive(ctx) { - var width = this.measureText(ctx); - this.children.forEach(function (child) { - width += child.measureTextRecursive(ctx); - }); - return width; - } - }, { - key: "measureText", - value: function measureText(ctx) { - var customFont = this.parent.style('font-family').getDefinition(); - - if (!isNullish(customFont)) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var measure = 0; - var text = this.getText(); - if (customFont.isRTL) text = text.split('').reverse().join(''); - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - - for (var i = 0; i < text.length; i++) { - var glyph = this.getGlyph(customFont, text, i); - measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm; - - if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) { - measure += dx[i]; - } - } - - return measure; - } - - var textToMeasure = svg.compressSpaces(this.getText()); - if (!ctx.measureText) return textToMeasure.length * 10; - ctx.save(); - this.setContext(ctx); - - var _ctx$measureText = ctx.measureText(textToMeasure), - width = _ctx$measureText.width; - - ctx.restore(); - return width; - } - }]); - - return _class31; - }(svg.Element.RenderedElementBase); // tspan - - - svg.Element.tspan = /*#__PURE__*/function (_svg$Element$TextElem) { - _inherits(_class32, _svg$Element$TextElem); - - var _super31 = _createSuper(_class32); - - function _class32(node) { - var _this18; - - _classCallCheck(this, _class32); - - _this18 = _super31.call(this, node, true); - _this18.text = node.nodeValue || node.text || ''; - return _this18; - } - - _createClass(_class32, [{ - key: "getText", - value: function getText() { - return this.text; - } - }]); - - return _class32; - }(svg.Element.TextElementBase); // tref - - - svg.Element.tref = /*#__PURE__*/function (_svg$Element$TextElem2) { - _inherits(_class33, _svg$Element$TextElem2); - - var _super32 = _createSuper(_class33); - - function _class33() { - _classCallCheck(this, _class33); - - return _super32.apply(this, arguments); - } - - _createClass(_class33, [{ - key: "getText", - value: function getText() { - var element = this.getHrefAttribute().getDefinition(); - if (!isNullish(element)) return element.children[0].getText(); - return undefined; - } - }]); - - return _class33; - }(svg.Element.TextElementBase); // a element - - - svg.Element.a = /*#__PURE__*/function (_svg$Element$TextElem3) { - _inherits(_class34, _svg$Element$TextElem3); - - var _super33 = _createSuper(_class34); - - function _class34(node) { - var _this19; - - _classCallCheck(this, _class34); - - _this19 = _super33.call(this, node); - _this19.hasText = true; - - _toConsumableArray(node.childNodes).forEach(function (childNode) { - if (childNode.nodeType !== 3) { - _this19.hasText = false; - } - }); // this might contain text - - - _this19.text = _this19.hasText ? node.childNodes[0].nodeValue : ''; - return _this19; - } - - _createClass(_class34, [{ - key: "getText", - value: function getText() { - return this.text; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - if (this.hasText) { - // render as text element - _get(_getPrototypeOf(_class34.prototype), "renderChildren", this).call(this, ctx); - - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y)); - } else { - // render as temporary group - var g = new svg.Element.g(); - g.children = this.children; - g.parent = this; - g.render(ctx); - } - } - }, { - key: "onclick", - value: function onclick() { - window.open(this.getHrefAttribute().value); - } - }, { - key: "onmousemove", - value: function onmousemove() { - svg.ctx.canvas.style.cursor = 'pointer'; - } - }]); - - return _class34; - }(svg.Element.TextElementBase); // image element - - - svg.Element.image = /*#__PURE__*/function (_svg$Element$Rendered5) { - _inherits(_class35, _svg$Element$Rendered5); - - var _super34 = _createSuper(_class35); - - function _class35(node) { - var _this20; - - _classCallCheck(this, _class35); - - _this20 = _super34.call(this, node); - - var href = _this20.getHrefAttribute().value; - - if (href === '') { - return _possibleConstructorReturn(_this20); - } - - _this20._isSvg = href.match(/\.svg$/); - svg.Images.push(_assertThisInitialized(_this20)); - _this20.loaded = false; - - if (!_this20._isSvg) { - _this20.img = document.createElement('img'); - - if (svg.opts.useCORS === true) { - _this20.img.crossOrigin = 'Anonymous'; - } - - _this20.img.addEventListener('load', function () { - _this20.loaded = true; - }); - - _this20.img.addEventListener('error', function () { - svg.log('ERROR: image "' + href + '" not found'); - _this20.loaded = true; - }); - - _this20.img.src = href; - } else { - svg.ajax(href, true).then(function (img) { - // eslint-disable-line promise/prefer-await-to-then, promise/always-return - _this20.img = img; - _this20.loaded = true; - })["catch"](function (err) { - // eslint-disable-line promise/prefer-await-to-callbacks - _this20.erred = true; - console.error('Ajax error for canvg', err); // eslint-disable-line no-console - }); - } - - return _this20; - } - - _createClass(_class35, [{ - key: "renderChildren", - value: function renderChildren(ctx) { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - if (width === 0 || height === 0) return; - ctx.save(); - - if (this._isSvg) { - ctx.drawSvg(this.img, x, y, width, height); - } else { - ctx.translate(x, y); - svg.AspectRatio(ctx, this.attribute('preserveAspectRatio').value, width, this.img.width, height, this.img.height, 0, 0); - ctx.drawImage(this.img, 0, 0); - } - - ctx.restore(); - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - return new svg.BoundingBox(x, y, x + width, y + height); - } - }]); - - return _class35; - }(svg.Element.RenderedElementBase); // group element - - - svg.Element.g = /*#__PURE__*/function (_svg$Element$Rendered6) { - _inherits(_class36, _svg$Element$Rendered6); - - var _super35 = _createSuper(_class36); - - function _class36() { - _classCallCheck(this, _class36); - - return _super35.apply(this, arguments); - } - - _createClass(_class36, [{ - key: "getBoundingBox", - value: function getBoundingBox() { - var bb = new svg.BoundingBox(); - this.children.forEach(function (child) { - bb.addBoundingBox(child.getBoundingBox()); - }); - return bb; - } - }]); - - return _class36; - }(svg.Element.RenderedElementBase); // symbol element - - - svg.Element.symbol = /*#__PURE__*/function (_svg$Element$Rendered7) { - _inherits(_class37, _svg$Element$Rendered7); - - var _super36 = _createSuper(_class37); - - function _class37() { - _classCallCheck(this, _class37); - - return _super36.apply(this, arguments); - } - - _createClass(_class37, [{ - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class37; - }(svg.Element.RenderedElementBase); // style element - - - svg.Element.style = /*#__PURE__*/function (_svg$Element$ElementB10) { - _inherits(_class38, _svg$Element$ElementB10); - - var _super37 = _createSuper(_class38); - - function _class38(node) { - var _this21; - - _classCallCheck(this, _class38); - - _this21 = _super37.call(this, node); // text, or spaces then CDATA - - var css = ''; - - _toConsumableArray(node.childNodes).forEach(function (_ref11) { - var nodeValue = _ref11.nodeValue; - css += nodeValue; - }); // remove comments - - - css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(^\s*\/\/.*)/gm, ''); // eslint-disable-line unicorn/no-unsafe-regex - // replace whitespace - - css = svg.compressSpaces(css); - var cssDefs = css.split('}'); - cssDefs.forEach(function (cssDef) { - if (svg.trim(cssDef) !== '') { - var _cssDef$split = cssDef.split('{'), - _cssDef$split2 = _slicedToArray(_cssDef$split, 2), - cssClasses = _cssDef$split2[0], - cssProps = _cssDef$split2[1]; - - cssClasses = cssClasses.split(','); - cssProps = cssProps.split(';'); - cssClasses.forEach(function (cssClass) { - cssClass = svg.trim(cssClass); - - if (cssClass !== '') { - var props = {}; - cssProps.forEach(function (cssProp) { - var prop = cssProp.indexOf(':'); - var name = cssProp.substr(0, prop); - var value = cssProp.substr(prop + 1, cssProp.length - prop); - - if (!isNullish(name) && !isNullish(value)) { - props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value)); - } - }); - svg.Styles[cssClass] = props; - - if (cssClass === '@font-face') { - var fontFamily = props['font-family'].value.replace(/"/g, ''); - var srcs = props.src.value.split(','); - srcs.forEach(function (src) { - if (src.includes('format("svg")')) { - var urlStart = src.indexOf('url'); - var urlEnd = src.indexOf(')', urlStart); - var url = src.substr(urlStart + 5, urlEnd - urlStart - 6); // Can this ajax safely be converted to async? - - var doc = svg.parseXml(svg.ajax(url)); - var fonts = doc.getElementsByTagName('font'); - - _toConsumableArray(fonts).forEach(function (font) { - font = svg.CreateElement(font); - svg.Definitions[fontFamily] = font; - }); - } - }); - } - } - }); - } - }); - return _this21; - } - - return _class38; - }(svg.Element.ElementBase); // use element - - - svg.Element.use = /*#__PURE__*/function (_svg$Element$Rendered8) { - _inherits(_class39, _svg$Element$Rendered8); - - var _super38 = _createSuper(_class39); - - function _class39(node) { - var _this22; - - _classCallCheck(this, _class39); - - _this22 = _super38.call(this, node); - _this22._el = _this22.getHrefAttribute().getDefinition(); - return _this22; - } - - _createClass(_class39, [{ - key: "setContext", - value: function setContext(ctx) { - _get(_getPrototypeOf(_class39.prototype), "setContext", this).call(this, ctx); - - if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0); - if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y')); - } - }, { - key: "path", - value: function path(ctx) { - var element = this._el; - if (!isNullish(element)) element.path(ctx); - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var element = this._el; - if (!isNullish(element)) return element.getBoundingBox(); - return undefined; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var element = this._el; - - if (!isNullish(element)) { - var tempSvg = element; - - if (element.type === 'symbol') { - // render me using a temporary svg element in symbol cases - // (https://www.w3.org/TR/SVG/struct.html#UseElement) - tempSvg = new svg.Element.svg(); - tempSvg.type = 'svg'; - tempSvg.attributes.viewBox = new svg.Property('viewBox', element.attribute('viewBox').value); - tempSvg.attributes.preserveAspectRatio = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value); - tempSvg.attributes.overflow = new svg.Property('overflow', element.attribute('overflow').value); - tempSvg.children = element.children; - } - - if (tempSvg.type === 'svg') { - // if symbol or svg, inherit width/height from me - if (this.attribute('width').hasValue()) { - tempSvg.attributes.width = new svg.Property('width', this.attribute('width').value); - } - - if (this.attribute('height').hasValue()) { - tempSvg.attributes.height = new svg.Property('height', this.attribute('height').value); - } - } - - var oldParent = tempSvg.parent; - tempSvg.parent = null; - tempSvg.render(ctx); - tempSvg.parent = oldParent; - } - } - }]); - - return _class39; - }(svg.Element.RenderedElementBase); // mask element - - - svg.Element.mask = /*#__PURE__*/function (_svg$Element$ElementB11) { - _inherits(_class40, _svg$Element$ElementB11); - - var _super39 = _createSuper(_class40); - - function _class40() { - _classCallCheck(this, _class40); - - return _super39.apply(this, arguments); - } - - _createClass(_class40, [{ - key: "apply", - value: function apply(ctx, element) { - // render as temp svg - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - - if (width === 0 && height === 0) { - var bb = new svg.BoundingBox(); - this.children.forEach(function (child) { - bb.addBoundingBox(child.getBoundingBox()); - }); - x = Math.floor(bb.x1); - y = Math.floor(bb.y1); - width = Math.floor(bb.width()); - height = Math.floor(bb.height()); - } // temporarily remove mask to avoid recursion - - - var mask = element.attribute('mask').value; - element.attribute('mask').value = ''; - var cMask = document.createElement('canvas'); - cMask.width = x + width; - cMask.height = y + height; - var maskCtx = cMask.getContext('2d'); - this.renderChildren(maskCtx); - var c = document.createElement('canvas'); - c.width = x + width; - c.height = y + height; - var tempCtx = c.getContext('2d'); - element.render(tempCtx); - tempCtx.globalCompositeOperation = 'destination-in'; - tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat'); - tempCtx.fillRect(0, 0, x + width, y + height); - ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat'); - ctx.fillRect(0, 0, x + width, y + height); // reassign mask - - element.attribute('mask').value = mask; - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class40; - }(svg.Element.ElementBase); // clip element - - - svg.Element.clipPath = /*#__PURE__*/function (_svg$Element$ElementB12) { - _inherits(_class41, _svg$Element$ElementB12); - - var _super40 = _createSuper(_class41); - - function _class41() { - _classCallCheck(this, _class41); - - return _super40.apply(this, arguments); - } - - _createClass(_class41, [{ - key: "apply", - value: function apply(ctx) { - this.children.forEach(function (child) { - if (typeof child.path !== 'undefined') { - var transform = null; - - if (child.attribute('transform').hasValue()) { - transform = new svg.Transform(child.attribute('transform').value); - transform.apply(ctx); - } - - child.path(ctx); - ctx.clip(); - - if (transform) { - transform.unapply(ctx); - } - } - }); - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class41; - }(svg.Element.ElementBase); // filters - - - svg.Element.filter = /*#__PURE__*/function (_svg$Element$ElementB13) { - _inherits(_class42, _svg$Element$ElementB13); - - var _super41 = _createSuper(_class42); - - function _class42() { - _classCallCheck(this, _class42); - - return _super41.apply(this, arguments); - } - - _createClass(_class42, [{ - key: "apply", - value: function apply(ctx, element) { - // render as temp svg - var bb = element.getBoundingBox(); - var x = Math.floor(bb.x1); - var y = Math.floor(bb.y1); - var width = Math.floor(bb.width()); - var height = Math.floor(bb.height()); // temporarily remove filter to avoid recursion - - var filter = element.style('filter').value; - element.style('filter').value = ''; - var px = 0, - py = 0; - this.children.forEach(function (child) { - var efd = child.extraFilterDistance || 0; - px = Math.max(px, efd); - py = Math.max(py, efd); - }); - var c = document.createElement('canvas'); - c.width = width + 2 * px; - c.height = height + 2 * py; - var tempCtx = c.getContext('2d'); - tempCtx.translate(-x + px, -y + py); - element.render(tempCtx); // apply filters - - this.children.forEach(function (child) { - child.apply(tempCtx, 0, 0, width + 2 * px, height + 2 * py); - }); // render on me - - ctx.drawImage(c, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py); // reassign filter - - element.style('filter', true).value = filter; - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class42; - }(svg.Element.ElementBase); - - svg.Element.feMorphology = /*#__PURE__*/function (_svg$Element$ElementB14) { - _inherits(_class43, _svg$Element$ElementB14); - - var _super42 = _createSuper(_class43); - - function _class43() { - _classCallCheck(this, _class43); - - return _super42.apply(this, arguments); - } - - _createClass(_class43, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) {// TODO: implement - } - }]); - - return _class43; - }(svg.Element.ElementBase); - - svg.Element.feComposite = /*#__PURE__*/function (_svg$Element$ElementB15) { - _inherits(_class44, _svg$Element$ElementB15); - - var _super43 = _createSuper(_class44); - - function _class44() { - _classCallCheck(this, _class44); - - return _super43.apply(this, arguments); - } - - _createClass(_class44, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) {// TODO: implement - } - }]); - - return _class44; - }(svg.Element.ElementBase); - /** - * @param {Uint8ClampedArray} img - * @param {Integer} x - * @param {Integer} y - * @param {Float} width - * @param {Float} height - * @param {Integer} rgba - * @returns {Integer} - */ - - - function imGet(img, x, y, width, height, rgba) { - return img[y * width * 4 + x * 4 + rgba]; - } - /** - * @param {Uint8ClampedArray} img - * @param {Integer} x - * @param {Integer} y - * @param {Float} width - * @param {Float} height - * @param {Integer} rgba - * @param {Float} val - * @returns {void} - */ - - - function imSet(img, x, y, width, height, rgba, val) { - img[y * width * 4 + x * 4 + rgba] = val; - } - - svg.Element.feColorMatrix = /*#__PURE__*/function (_svg$Element$ElementB16) { - _inherits(_class45, _svg$Element$ElementB16); - - var _super44 = _createSuper(_class45); - - function _class45(node) { - var _this23; - - _classCallCheck(this, _class45); - - _this23 = _super44.call(this, node); - var matrix = svg.ToNumberArray(_this23.attribute('values').value); - - switch (_this23.attribute('type').valueOrDefault('matrix')) { - // https://www.w3.org/TR/SVG/filters.html#feColorMatrixElement - case 'saturate': - { - var s = matrix[0]; - matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; - break; - } - - case 'hueRotate': - { - var a = matrix[0] * Math.PI / 180.0; - - var c = function c(m1, m2, m3) { - return m1 + Math.cos(a) * m2 + Math.sin(a) * m3; - }; - - matrix = [c(0.213, 0.787, -0.213), c(0.715, -0.715, -0.715), c(0.072, -0.072, 0.928), 0, 0, c(0.213, -0.213, 0.143), c(0.715, 0.285, 0.140), c(0.072, -0.072, -0.283), 0, 0, c(0.213, -0.213, -0.787), c(0.715, -0.715, 0.715), c(0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; - break; - } - - case 'luminanceToAlpha': - matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1]; - break; - } - - _this23.matrix = matrix; - - _this23._m = function (i, v) { - var mi = matrix[i]; - return mi * (mi < 0 ? v - 255 : v); - }; - - return _this23; - } - - _createClass(_class45, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) { - var m = this._m; // assuming x==0 && y==0 for now - - var srcData = ctx.getImageData(0, 0, width, height); - - for (var _y = 0; _y < height; _y++) { - for (var _x = 0; _x < width; _x++) { - var r = imGet(srcData.data, _x, _y, width, height, 0); - var g = imGet(srcData.data, _x, _y, width, height, 1); - var b = imGet(srcData.data, _x, _y, width, height, 2); - var a = imGet(srcData.data, _x, _y, width, height, 3); - imSet(srcData.data, _x, _y, width, height, 0, m(0, r) + m(1, g) + m(2, b) + m(3, a) + m(4, 1)); - imSet(srcData.data, _x, _y, width, height, 1, m(5, r) + m(6, g) + m(7, b) + m(8, a) + m(9, 1)); - imSet(srcData.data, _x, _y, width, height, 2, m(10, r) + m(11, g) + m(12, b) + m(13, a) + m(14, 1)); - imSet(srcData.data, _x, _y, width, height, 3, m(15, r) + m(16, g) + m(17, b) + m(18, a) + m(19, 1)); - } - } - - ctx.clearRect(0, 0, width, height); - ctx.putImageData(srcData, 0, 0); - } - }]); - - return _class45; - }(svg.Element.ElementBase); - - svg.Element.feGaussianBlur = /*#__PURE__*/function (_svg$Element$ElementB17) { - _inherits(_class46, _svg$Element$ElementB17); - - var _super45 = _createSuper(_class46); - - function _class46(node) { - var _this24; - - _classCallCheck(this, _class46); - - _this24 = _super45.call(this, node); - _this24.blurRadius = Math.floor(_this24.attribute('stdDeviation').numValue()); - _this24.extraFilterDistance = _this24.blurRadius; - return _this24; - } - - _createClass(_class46, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) { - // Todo: This might not be a problem anymore with out `instanceof` fix - // StackBlur requires canvas be on document - ctx.canvas.id = svg.UniqueId(); - ctx.canvas.style.display = 'none'; - document.body.append(ctx.canvas); - processCanvasRGBA(ctx.canvas, x, y, width, height, this.blurRadius); - ctx.canvas.remove(); - } - }]); - - return _class46; - }(svg.Element.ElementBase); // title element, do nothing - - - svg.Element.title = /*#__PURE__*/function (_svg$Element$ElementB18) { - _inherits(_class47, _svg$Element$ElementB18); - - var _super46 = _createSuper(_class47); - - function _class47(node) { - _classCallCheck(this, _class47); - - return _super46.call(this); - } - - return _class47; - }(svg.Element.ElementBase); // desc element, do nothing - - - svg.Element.desc = /*#__PURE__*/function (_svg$Element$ElementB19) { - _inherits(_class48, _svg$Element$ElementB19); - - var _super47 = _createSuper(_class48); - - function _class48(node) { - _classCallCheck(this, _class48); - - return _super47.call(this); - } - - return _class48; - }(svg.Element.ElementBase); - - svg.Element.MISSING = /*#__PURE__*/function (_svg$Element$ElementB20) { - _inherits(_class49, _svg$Element$ElementB20); - - var _super48 = _createSuper(_class49); - - function _class49(node) { - var _this25; - - _classCallCheck(this, _class49); - - _this25 = _super48.call(this); - svg.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.'); - return _this25; - } - - return _class49; - }(svg.Element.ElementBase); // element factory - - - svg.CreateElement = function (node) { - var className = node.nodeName.replace(/^[^:]+:/, '') // remove namespace - .replace(/-/g, ''); // remove dashes - - var e; - - if (typeof svg.Element[className] !== 'undefined') { - e = new svg.Element[className](node); - } else { - e = new svg.Element.MISSING(node); - } - - e.type = node.nodeName; - return e; - }; // load from url - - - svg.load = /*#__PURE__*/function () { - var _ref12 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(ctx, url) { - var dom; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return svg.ajax(url, true); - - case 2: - dom = _context.sent; - return _context.abrupt("return", svg.loadXml(ctx, dom)); - - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - - return function (_x2, _x3) { - return _ref12.apply(this, arguments); - }; - }(); // load from xml - - - svg.loadXml = function (ctx, xml) { - return svg.loadXmlDoc(ctx, svg.parseXml(xml)); - }; - - svg.loadXmlDoc = function (ctx, dom) { - var res; - svg.init(ctx); - - var mapXY = function mapXY(p) { - var e = ctx.canvas; - - while (e) { - p.x -= e.offsetLeft; - p.y -= e.offsetTop; - e = e.offsetParent; - } - - if (window.scrollX) p.x += window.scrollX; - if (window.scrollY) p.y += window.scrollY; - return p; - }; // bind mouse - - - if (svg.opts.ignoreMouse !== true) { - ctx.canvas.addEventListener('click', function (e) { - var args = !isNullish(e) ? [e.clientX, e.clientY] : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals - - var _mapXY = mapXY(_construct(svg.Point, args)), - x = _mapXY.x, - y = _mapXY.y; - - svg.Mouse.onclick(x, y); - }); - ctx.canvas.addEventListener('mousemove', function (e) { - var args = !isNullish(e) ? [e.clientX, e.clientY] : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals - - var _mapXY2 = mapXY(_construct(svg.Point, args)), - x = _mapXY2.x, - y = _mapXY2.y; - - svg.Mouse.onmousemove(x, y); - }); - } - - var e = svg.CreateElement(dom.documentElement); - e.root = true; // render loop - - var isFirstRender = true; - - var draw = function draw(resolve) { - svg.ViewPort.Clear(); - - if (ctx.canvas.parentNode) { - svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight); - } - - if (svg.opts.ignoreDimensions !== true) { - // set canvas size - if (e.style('width').hasValue()) { - ctx.canvas.width = e.style('width').toPixels('x'); - ctx.canvas.style.width = ctx.canvas.width + 'px'; - } - - if (e.style('height').hasValue()) { - ctx.canvas.height = e.style('height').toPixels('y'); - ctx.canvas.style.height = ctx.canvas.height + 'px'; - } - } - - var cWidth = ctx.canvas.clientWidth || ctx.canvas.width; - var cHeight = ctx.canvas.clientHeight || ctx.canvas.height; - - if (svg.opts.ignoreDimensions === true && e.style('width').hasValue() && e.style('height').hasValue()) { - cWidth = e.style('width').toPixels('x'); - cHeight = e.style('height').toPixels('y'); - } - - svg.ViewPort.SetCurrent(cWidth, cHeight); - - if (!isNullish(svg.opts.offsetX)) { - e.attribute('x', true).value = svg.opts.offsetX; - } - - if (!isNullish(svg.opts.offsetY)) { - e.attribute('y', true).value = svg.opts.offsetY; - } - - if (!isNullish(svg.opts.scaleWidth) || !isNullish(svg.opts.scaleHeight)) { - var viewBox = svg.ToNumberArray(e.attribute('viewBox').value); - var xRatio = null, - yRatio = null; - - if (!isNullish(svg.opts.scaleWidth)) { - if (e.attribute('width').hasValue()) { - xRatio = e.attribute('width').toPixels('x') / svg.opts.scaleWidth; - } else if (!isNaN(viewBox[2])) { - xRatio = viewBox[2] / svg.opts.scaleWidth; - } - } - - if (!isNullish(svg.opts.scaleHeight)) { - if (e.attribute('height').hasValue()) { - yRatio = e.attribute('height').toPixels('y') / svg.opts.scaleHeight; - } else if (!isNaN(viewBox[3])) { - yRatio = viewBox[3] / svg.opts.scaleHeight; - } - } - - if (isNullish(xRatio)) { - xRatio = yRatio; - } - - if (isNullish(yRatio)) { - yRatio = xRatio; - } - - e.attribute('width', true).value = svg.opts.scaleWidth; - e.attribute('height', true).value = svg.opts.scaleHeight; - e.attribute('viewBox', true).value = '0 0 ' + cWidth * xRatio + ' ' + cHeight * yRatio; - e.attribute('preserveAspectRatio', true).value = 'none'; - } // clear and render - - - if (svg.opts.ignoreClear !== true) { - ctx.clearRect(0, 0, cWidth, cHeight); - } - - e.render(ctx); - - if (isFirstRender) { - isFirstRender = false; - resolve(dom); - } - }; - - var waitingForImages = true; - svg.intervalID = setInterval(function () { - var needUpdate = false; - - if (waitingForImages && svg.ImagesLoaded()) { - waitingForImages = false; - needUpdate = true; - } // need update from mouse events? - - - if (svg.opts.ignoreMouse !== true) { - needUpdate = needUpdate || svg.Mouse.hasEvents(); - } // need update from animations? - - - if (svg.opts.ignoreAnimation !== true) { - svg.Animations.forEach(function (animation) { - var needAnimationUpdate = animation.update(1000 / svg.FRAMERATE); - needUpdate = needUpdate || needAnimationUpdate; - }); - } // need update from redraw? - - - if (typeof svg.opts.forceRedraw === 'function') { - if (svg.opts.forceRedraw() === true) { - needUpdate = true; - } - } // render if needed - - - if (needUpdate) { - draw(res); - svg.Mouse.runEvents(); // run and clear our events - } - }, 1000 / svg.FRAMERATE); // Todo: Replace with an image loading Promise utility? - // eslint-disable-next-line promise/avoid-new - - return new Promise(function (resolve, reject) { - if (svg.ImagesLoaded()) { - waitingForImages = false; - draw(resolve); - return; - } - - res = resolve; - }); - }; - - svg.stop = function () { - if (svg.intervalID) { - clearInterval(svg.intervalID); - } - }; - - svg.Mouse = { - events: [], - hasEvents: function hasEvents() { - return this.events.length !== 0; - }, - onclick: function onclick(x, y) { - this.events.push({ - type: 'onclick', - x: x, - y: y, - run: function run(e) { - if (e.onclick) e.onclick(); - } - }); - }, - onmousemove: function onmousemove(x, y) { - this.events.push({ - type: 'onmousemove', - x: x, - y: y, - run: function run(e) { - if (e.onmousemove) e.onmousemove(); - } - }); - }, - eventElements: [], - checkPath: function checkPath(element, ctx) { - var _this26 = this; - - this.events.forEach(function (_ref13, i) { - var x = _ref13.x, - y = _ref13.y; - - if (ctx.isPointInPath && ctx.isPointInPath(x, y)) { - _this26.eventElements[i] = element; - } - }); - }, - checkBoundingBox: function checkBoundingBox(element, bb) { - var _this27 = this; - - this.events.forEach(function (_ref14, i) { - var x = _ref14.x, - y = _ref14.y; - - if (bb.isPointInBox(x, y)) { - _this27.eventElements[i] = element; - } - }); - }, - runEvents: function runEvents() { - var _this28 = this; - - svg.ctx.canvas.style.cursor = ''; - this.events.forEach(function (e, i) { - var element = _this28.eventElements[i]; - - while (element) { - e.run(element); - element = element.parent; - } - }); // done running, clear - - this.events = []; - this.eventElements = []; - } - }; - return svg; - } - - if (typeof CanvasRenderingContext2D !== 'undefined') { - CanvasRenderingContext2D.prototype.drawSvg = function (s, dx, dy, dw, dh) { - canvg(this.canvas, s, { - ignoreMouse: true, - ignoreAnimation: true, - ignoreDimensions: true, - ignoreClear: true, - offsetX: dx, - offsetY: dy, - scaleWidth: dw, - scaleHeight: dh - }); - }; - } - - var extServer_moinsave = { - name: 'server_moinsave', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var $, encode64, importLocale, strings, svgEditor, svgCanvas, saveSvgAction; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - $ = _ref.$, encode64 = _ref.encode64, importLocale = _ref.importLocale; - _context2.next = 3; - return importLocale(); - - case 3: - strings = _context2.sent; - svgEditor = _this; - svgCanvas = svgEditor.canvas; - saveSvgAction = '/+modify'; // Create upload target (hidden iframe) - // Hiding by size instead of display to avoid FF console errors - // with `getBBox` in browser.js `supportsPathBBox_`) - - /* const target = */ - - $("<iframe name=\"output_frame\" title=\"".concat(strings.hiddenframe, "\"\n style=\"width: 0; height: 0;\" src=\"data:text/html;base64,PGh0bWw+PC9odG1sPg==\"/>")).appendTo('body'); - svgEditor.setCustomHandlers({ - save: function save(win, data) { - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var svg, _URL, pathname, name, svgData, c, datauri, pngData; - - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - svg = '<?xml version="1.0"?>\n' + data; - _URL = new URL(location), pathname = _URL.pathname; - name = pathname.replace(/\/+get\//, ''); - svgData = encode64(svg); - - if (!$('#export_canvas').length) { - $('<canvas>', { - id: 'export_canvas' - }).hide().appendTo('body'); - } - - c = $('#export_canvas')[0]; - c.width = svgCanvas.contentW; - c.height = svgCanvas.contentH; - _context.next = 10; - return canvg(c, svg); - - case 10: - datauri = c.toDataURL('image/png'); // const {uiStrings} = svgEditor; - - pngData = encode64(datauri); // Brett: This encoding seems unnecessary - - /* const form = */ - - $('<form>').attr({ - method: 'post', - action: saveSvgAction + '/' + name, - target: 'output_frame' - }).append("\n <input type=\"hidden\" name=\"png_data\" value=\"".concat(pngData, "\">\n <input type=\"hidden\" name=\"filepath\" value=\"").concat(svgData, "\">\n <input type=\"hidden\" name=\"filename\" value=\"drawing.svg\">\n <input type=\"hidden\" name=\"contenttype\" value=\"application/x-svgdraw\">\n ")).appendTo('body').submit().remove(); - $.alert(strings.saved); - top.window.location = '/' + name; - - case 15: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }); - - case 9: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))(); - } - }; - - return extServer_moinsave; - -}()); +}; diff --git a/dist/extensions/ext-server_opensave.js b/dist/extensions/ext-server_opensave.js index 076e5f5e..86149dd6 100644 --- a/dist/extensions/ext-server_opensave.js +++ b/dist/extensions/ext-server_opensave.js @@ -1,5248 +1,269 @@ -var svgEditorExtension_server_opensave = (function () { - 'use strict'; +/** + * @file ext-server_opensave.js + * + * @license MIT + * + * @copyright 2010 Alexis Deveria + * + */ +import {canvg} from '../canvg/canvg.js'; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; +export default { + name: 'server_opensave', + async init ({$, decode64, encode64, importLocale}) { + const strings = await importLocale(); + const svgEditor = this; + const { + curConfig: { + extPath, + avoidClientSide, // Deprecated + avoidClientSideDownload, avoidClientSideOpen + }, + canvas: svgCanvas + } = svgEditor; + + /** + * + * @returns {string} + */ + function getFileNameFromTitle () { + const title = svgCanvas.getDocumentTitle(); + // We convert (to underscore) only those disallowed Win7 file name characters + return title.trim().replace(/[/\\:*?"<>|]/g, '_'); + } + /** + * Escapes XML predefined entities for quoted attributes. + * @param {string} str + * @returns {string} + */ + function xhtmlEscape (str) { + return str.replace(/&(?!amp;)/g, '&').replace(/"/g, '"').replace(/</g, '<'); // < is actually disallowed above anyways } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true + /** + * + * @param {string} [filename='image'] + * @param {string} suffix To add to file name + * @param {string} uri + * @returns {boolean} + */ + function clientDownloadSupport (filename, suffix, uri) { + if (avoidClientSide || avoidClientSideDownload) { + return false; + } + const support = $('<a>')[0].download === ''; + let a; + if (support) { + a = $('<a>hidden</a>').attr({ + download: (filename || 'image') + suffix, + href: uri + }).css('display', 'none').appendTo('body'); + a[0].click(); + return true; } - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { return false; } - } - - function _construct(Parent, args, Class) { - if (_isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; - } - - function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } - - return object; - } - - function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); - - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); - - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - - return _get(target, property, receiver || target); - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * For parsing color values. - * @module RGBColor - * @author Stoyan Stefanov <sstoo@gmail.com> - * @see https://www.phpied.com/rgb-color-parser-in-javascript/ - * @license MIT - */ - var simpleColors = { - aliceblue: 'f0f8ff', - antiquewhite: 'faebd7', - aqua: '00ffff', - aquamarine: '7fffd4', - azure: 'f0ffff', - beige: 'f5f5dc', - bisque: 'ffe4c4', - black: '000000', - blanchedalmond: 'ffebcd', - blue: '0000ff', - blueviolet: '8a2be2', - brown: 'a52a2a', - burlywood: 'deb887', - cadetblue: '5f9ea0', - chartreuse: '7fff00', - chocolate: 'd2691e', - coral: 'ff7f50', - cornflowerblue: '6495ed', - cornsilk: 'fff8dc', - crimson: 'dc143c', - cyan: '00ffff', - darkblue: '00008b', - darkcyan: '008b8b', - darkgoldenrod: 'b8860b', - darkgray: 'a9a9a9', - darkgreen: '006400', - darkkhaki: 'bdb76b', - darkmagenta: '8b008b', - darkolivegreen: '556b2f', - darkorange: 'ff8c00', - darkorchid: '9932cc', - darkred: '8b0000', - darksalmon: 'e9967a', - darkseagreen: '8fbc8f', - darkslateblue: '483d8b', - darkslategray: '2f4f4f', - darkturquoise: '00ced1', - darkviolet: '9400d3', - deeppink: 'ff1493', - deepskyblue: '00bfff', - dimgray: '696969', - dodgerblue: '1e90ff', - feldspar: 'd19275', - firebrick: 'b22222', - floralwhite: 'fffaf0', - forestgreen: '228b22', - fuchsia: 'ff00ff', - gainsboro: 'dcdcdc', - ghostwhite: 'f8f8ff', - gold: 'ffd700', - goldenrod: 'daa520', - gray: '808080', - green: '008000', - greenyellow: 'adff2f', - honeydew: 'f0fff0', - hotpink: 'ff69b4', - indianred: 'cd5c5c', - indigo: '4b0082', - ivory: 'fffff0', - khaki: 'f0e68c', - lavender: 'e6e6fa', - lavenderblush: 'fff0f5', - lawngreen: '7cfc00', - lemonchiffon: 'fffacd', - lightblue: 'add8e6', - lightcoral: 'f08080', - lightcyan: 'e0ffff', - lightgoldenrodyellow: 'fafad2', - lightgrey: 'd3d3d3', - lightgreen: '90ee90', - lightpink: 'ffb6c1', - lightsalmon: 'ffa07a', - lightseagreen: '20b2aa', - lightskyblue: '87cefa', - lightslateblue: '8470ff', - lightslategray: '778899', - lightsteelblue: 'b0c4de', - lightyellow: 'ffffe0', - lime: '00ff00', - limegreen: '32cd32', - linen: 'faf0e6', - magenta: 'ff00ff', - maroon: '800000', - mediumaquamarine: '66cdaa', - mediumblue: '0000cd', - mediumorchid: 'ba55d3', - mediumpurple: '9370d8', - mediumseagreen: '3cb371', - mediumslateblue: '7b68ee', - mediumspringgreen: '00fa9a', - mediumturquoise: '48d1cc', - mediumvioletred: 'c71585', - midnightblue: '191970', - mintcream: 'f5fffa', - mistyrose: 'ffe4e1', - moccasin: 'ffe4b5', - navajowhite: 'ffdead', - navy: '000080', - oldlace: 'fdf5e6', - olive: '808000', - olivedrab: '6b8e23', - orange: 'ffa500', - orangered: 'ff4500', - orchid: 'da70d6', - palegoldenrod: 'eee8aa', - palegreen: '98fb98', - paleturquoise: 'afeeee', - palevioletred: 'd87093', - papayawhip: 'ffefd5', - peachpuff: 'ffdab9', - peru: 'cd853f', - pink: 'ffc0cb', - plum: 'dda0dd', - powderblue: 'b0e0e6', - purple: '800080', - red: 'ff0000', - rosybrown: 'bc8f8f', - royalblue: '4169e1', - saddlebrown: '8b4513', - salmon: 'fa8072', - sandybrown: 'f4a460', - seagreen: '2e8b57', - seashell: 'fff5ee', - sienna: 'a0522d', - silver: 'c0c0c0', - skyblue: '87ceeb', - slateblue: '6a5acd', - slategray: '708090', - snow: 'fffafa', - springgreen: '00ff7f', - steelblue: '4682b4', - tan: 'd2b48c', - teal: '008080', - thistle: 'd8bfd8', - tomato: 'ff6347', - turquoise: '40e0d0', - violet: 'ee82ee', - violetred: 'd02090', - wheat: 'f5deb3', - white: 'ffffff', - whitesmoke: 'f5f5f5', - yellow: 'ffff00', - yellowgreen: '9acd32' - }; // array of color definition objects - - var colorDefs = [{ - re: /^rgb\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})\)$/, - // re: /^rgb\((?<r>\d{1,3}),\s*(?<g>\d{1,3}),\s*(?<b>\d{1,3})\)$/, - example: ['rgb(123, 234, 45)', 'rgb(255,234,245)'], - process: function process(_) { - for (var _len = arguments.length, bits = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - bits[_key - 1] = arguments[_key]; - } - - return bits.map(function (b) { - return Number.parseInt(b); - }); - } - }, { - re: /^(\w{2})(\w{2})(\w{2})$/, - // re: /^(?<r>\w{2})(?<g>\w{2})(?<b>\w{2})$/, - example: ['#00ff00', '336699'], - process: function process(_) { - for (var _len2 = arguments.length, bits = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { - bits[_key2 - 1] = arguments[_key2]; - } - - return bits.map(function (b) { - return Number.parseInt(b, 16); - }); - } - }, { - re: /^(\w)(\w)(\w)$/, - // re: /^(?<r>\w{1})(?<g>\w{1})(?<b>\w{1})$/, - example: ['#fb0', 'f0f'], - process: function process(_) { - for (var _len3 = arguments.length, bits = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) { - bits[_key3 - 1] = arguments[_key3]; - } - - return bits.map(function (b) { - return Number.parseInt(b + b, 16); - }); - } - }]; - /** - * A class to parse color values. - */ - - var RGBColor = /*#__PURE__*/function () { - /** - * @param {string} colorString - */ - function RGBColor(colorString) { - var _this = this; - - _classCallCheck(this, RGBColor); - - this.ok = false; // strip any leading # - - if (colorString.charAt(0) === '#') { - // remove # if any - colorString = colorString.substr(1, 6); - } - - colorString = colorString.replace(/ /g, ''); - colorString = colorString.toLowerCase(); // before getting into regexps, try simple matches - // and overwrite the input - - if (colorString in simpleColors) { - colorString = simpleColors[colorString]; - } // end of simple type-in colors - // search through the definitions to find a match - - - colorDefs.forEach(function (_ref) { - var re = _ref.re, - processor = _ref.process; - var bits = re.exec(colorString); - - if (bits) { - var _processor = processor.apply(void 0, _toConsumableArray(bits)), - _processor2 = _slicedToArray(_processor, 3), - r = _processor2[0], - g = _processor2[1], - b = _processor2[2]; - - Object.assign(_this, { - r: r, - g: g, - b: b - }); - _this.ok = true; - } - }); // validate/cleanup values - - this.r = this.r < 0 || isNaN(this.r) ? 0 : this.r > 255 ? 255 : this.r; - this.g = this.g < 0 || isNaN(this.g) ? 0 : this.g > 255 ? 255 : this.g; - this.b = this.b < 0 || isNaN(this.b) ? 0 : this.b > 255 ? 255 : this.b; - } // some getters - - /** - * @returns {string} - */ - - - _createClass(RGBColor, [{ - key: "toRGB", - value: function toRGB() { - return 'rgb(' + this.r + ', ' + this.g + ', ' + this.b + ')'; - } - /** - * @returns {string} - */ - - }, { - key: "toHex", - value: function toHex() { - var r = this.r.toString(16); - var g = this.g.toString(16); - var b = this.b.toString(16); - - if (r.length === 1) { - r = '0' + r; - } - - if (g.length === 1) { - g = '0' + g; - } - - if (b.length === 1) { - b = '0' + b; - } - - return '#' + r + g + b; - } - /** - * Offers a bulleted list of help. - * @returns {HTMLUListElement} - */ - - }], [{ - key: "getHelpXML", - value: function getHelpXML() { - var examples = [].concat(_toConsumableArray(colorDefs.flatMap(function (_ref2) { - var example = _ref2.example; - return example; - })), _toConsumableArray(Object.keys(simpleColors))); - var xml = document.createElement('ul'); - xml.setAttribute('id', 'rgbcolor-examples'); - xml.append.apply(xml, _toConsumableArray(examples.map(function (example) { - try { - var listItem = document.createElement('li'); - var listColor = new RGBColor(example); - var exampleDiv = document.createElement('div'); - exampleDiv.style.cssText = "\n margin: 3px;\n border: 1px solid black;\n background: ".concat(listColor.toHex(), ";\n color: ").concat(listColor.toHex(), ";"); - exampleDiv.append('test'); - var listItemValue = " ".concat(example, " -> ").concat(listColor.toRGB(), " -> ").concat(listColor.toHex()); - listItem.append(exampleDiv, listItemValue); - return listItem; - } catch (e) { - return ''; - } - }))); - return xml; - } - }]); - - return RGBColor; - }(); - - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function _typeof(obj) { - return typeof obj; - }; - } else { - _typeof = function _typeof(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof(obj); - } - - function _classCallCheck$1(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - /* eslint-disable no-bitwise, unicorn/prefer-query-selector */ - - /** - * StackBlur - a fast almost Gaussian Blur For Canvas - * - * In case you find this class useful - especially in commercial projects - - * I am not totally unhappy for a small donation to my PayPal account - * mario@quasimondo.de - * - * Or support me on flattr: - * {@link https://flattr.com/thing/72791/StackBlur-a-fast-almost-Gaussian-Blur-Effect-for-CanvasJavascript}. - * - * @module StackBlur - * @author Mario Klingemann - * Contact: mario@quasimondo.com - * Website: {@link http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html} - * Twitter: @quasimondo - * - * @copyright (c) 2010 Mario Klingemann - * - * Permission is hereby granted, free of charge, to any person - * obtaining a copy of this software and associated documentation - * files (the "Software"), to deal in the Software without - * restriction, including without limitation the rights to use, - * copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the - * Software is furnished to do so, subject to the following - * conditions: - * - * The above copyright notice and this permission notice shall be - * included in all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES - * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT - * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, - * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR - * OTHER DEALINGS IN THE SOFTWARE. - */ - - /* eslint-disable max-len */ - - - var mulTable = [512, 512, 456, 512, 328, 456, 335, 512, 405, 328, 271, 456, 388, 335, 292, 512, 454, 405, 364, 328, 298, 271, 496, 456, 420, 388, 360, 335, 312, 292, 273, 512, 482, 454, 428, 405, 383, 364, 345, 328, 312, 298, 284, 271, 259, 496, 475, 456, 437, 420, 404, 388, 374, 360, 347, 335, 323, 312, 302, 292, 282, 273, 265, 512, 497, 482, 468, 454, 441, 428, 417, 405, 394, 383, 373, 364, 354, 345, 337, 328, 320, 312, 305, 298, 291, 284, 278, 271, 265, 259, 507, 496, 485, 475, 465, 456, 446, 437, 428, 420, 412, 404, 396, 388, 381, 374, 367, 360, 354, 347, 341, 335, 329, 323, 318, 312, 307, 302, 297, 292, 287, 282, 278, 273, 269, 265, 261, 512, 505, 497, 489, 482, 475, 468, 461, 454, 447, 441, 435, 428, 422, 417, 411, 405, 399, 394, 389, 383, 378, 373, 368, 364, 359, 354, 350, 345, 341, 337, 332, 328, 324, 320, 316, 312, 309, 305, 301, 298, 294, 291, 287, 284, 281, 278, 274, 271, 268, 265, 262, 259, 257, 507, 501, 496, 491, 485, 480, 475, 470, 465, 460, 456, 451, 446, 442, 437, 433, 428, 424, 420, 416, 412, 408, 404, 400, 396, 392, 388, 385, 381, 377, 374, 370, 367, 363, 360, 357, 354, 350, 347, 344, 341, 338, 335, 332, 329, 326, 323, 320, 318, 315, 312, 310, 307, 304, 302, 299, 297, 294, 292, 289, 287, 285, 282, 280, 278, 275, 273, 271, 269, 267, 265, 263, 261, 259]; - var shgTable = [9, 11, 12, 13, 13, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24]; - /** - * @param {string|HTMLCanvasElement} canvas - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @throws {Error|TypeError} - * @returns {ImageData} See {@link https://html.spec.whatwg.org/multipage/canvas.html#imagedata} - */ - - - function getImageDataFromCanvas(canvas, topX, topY, width, height) { - if (typeof canvas === 'string') { - canvas = document.getElementById(canvas); - } - - if (!canvas || _typeof(canvas) !== 'object' || !('getContext' in canvas)) { - throw new TypeError('Expecting canvas with `getContext` method ' + 'in processCanvasRGB(A) calls!'); - } - - var context = canvas.getContext('2d'); - - try { - return context.getImageData(topX, topY, width, height); - } catch (e) { - throw new Error('unable to access image data: ' + e); - } - } - /** - * @param {HTMLCanvasElement} canvas - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @param {Float} radius - * @returns {undefined} - */ - - - function processCanvasRGBA(canvas, topX, topY, width, height, radius) { - if (isNaN(radius) || radius < 1) { - return; - } - - radius |= 0; - var imageData = getImageDataFromCanvas(canvas, topX, topY, width, height); - imageData = processImageDataRGBA(imageData, topX, topY, width, height, radius); - canvas.getContext('2d').putImageData(imageData, topX, topY); - } - /** - * @param {ImageData} imageData - * @param {Integer} topX - * @param {Integer} topY - * @param {Integer} width - * @param {Integer} height - * @param {Float} radius - * @returns {ImageData} - */ - - - function processImageDataRGBA(imageData, topX, topY, width, height, radius) { - var pixels = imageData.data; - var x, y, i, p, yp, yi, yw, rSum, gSum, bSum, aSum, rOutSum, gOutSum, bOutSum, aOutSum, rInSum, gInSum, bInSum, aInSum, pr, pg, pb, pa, rbs; - var div = 2 * radius + 1; // const w4 = width << 2; - - var widthMinus1 = width - 1; - var heightMinus1 = height - 1; - var radiusPlus1 = radius + 1; - var sumFactor = radiusPlus1 * (radiusPlus1 + 1) / 2; - var stackStart = new BlurStack(); - var stack = stackStart; - var stackEnd; - - for (i = 1; i < div; i++) { - stack = stack.next = new BlurStack(); - - if (i === radiusPlus1) { - stackEnd = stack; - } - } - - stack.next = stackStart; - var stackIn = null; - var stackOut = null; - yw = yi = 0; - var mulSum = mulTable[radius]; - var shgSum = shgTable[radius]; - - for (y = 0; y < height; y++) { - rInSum = gInSum = bInSum = aInSum = rSum = gSum = bSum = aSum = 0; - rOutSum = radiusPlus1 * (pr = pixels[yi]); - gOutSum = radiusPlus1 * (pg = pixels[yi + 1]); - bOutSum = radiusPlus1 * (pb = pixels[yi + 2]); - aOutSum = radiusPlus1 * (pa = pixels[yi + 3]); - rSum += sumFactor * pr; - gSum += sumFactor * pg; - bSum += sumFactor * pb; - aSum += sumFactor * pa; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack.a = pa; - stack = stack.next; - } - - for (i = 1; i < radiusPlus1; i++) { - p = yi + ((widthMinus1 < i ? widthMinus1 : i) << 2); - rSum += (stack.r = pr = pixels[p]) * (rbs = radiusPlus1 - i); - gSum += (stack.g = pg = pixels[p + 1]) * rbs; - bSum += (stack.b = pb = pixels[p + 2]) * rbs; - aSum += (stack.a = pa = pixels[p + 3]) * rbs; - rInSum += pr; - gInSum += pg; - bInSum += pb; - aInSum += pa; - stack = stack.next; - } - - stackIn = stackStart; - stackOut = stackEnd; - - for (x = 0; x < width; x++) { - pixels[yi + 3] = pa = aSum * mulSum >> shgSum; - - if (pa !== 0) { - pa = 255 / pa; - pixels[yi] = (rSum * mulSum >> shgSum) * pa; - pixels[yi + 1] = (gSum * mulSum >> shgSum) * pa; - pixels[yi + 2] = (bSum * mulSum >> shgSum) * pa; - } else { - pixels[yi] = pixels[yi + 1] = pixels[yi + 2] = 0; - } - - rSum -= rOutSum; - gSum -= gOutSum; - bSum -= bOutSum; - aSum -= aOutSum; - rOutSum -= stackIn.r; - gOutSum -= stackIn.g; - bOutSum -= stackIn.b; - aOutSum -= stackIn.a; - p = yw + ((p = x + radius + 1) < widthMinus1 ? p : widthMinus1) << 2; - rInSum += stackIn.r = pixels[p]; - gInSum += stackIn.g = pixels[p + 1]; - bInSum += stackIn.b = pixels[p + 2]; - aInSum += stackIn.a = pixels[p + 3]; - rSum += rInSum; - gSum += gInSum; - bSum += bInSum; - aSum += aInSum; - stackIn = stackIn.next; - rOutSum += pr = stackOut.r; - gOutSum += pg = stackOut.g; - bOutSum += pb = stackOut.b; - aOutSum += pa = stackOut.a; - rInSum -= pr; - gInSum -= pg; - bInSum -= pb; - aInSum -= pa; - stackOut = stackOut.next; - yi += 4; - } - - yw += width; - } - - for (x = 0; x < width; x++) { - gInSum = bInSum = aInSum = rInSum = gSum = bSum = aSum = rSum = 0; - yi = x << 2; - rOutSum = radiusPlus1 * (pr = pixels[yi]); - gOutSum = radiusPlus1 * (pg = pixels[yi + 1]); - bOutSum = radiusPlus1 * (pb = pixels[yi + 2]); - aOutSum = radiusPlus1 * (pa = pixels[yi + 3]); - rSum += sumFactor * pr; - gSum += sumFactor * pg; - bSum += sumFactor * pb; - aSum += sumFactor * pa; - stack = stackStart; - - for (i = 0; i < radiusPlus1; i++) { - stack.r = pr; - stack.g = pg; - stack.b = pb; - stack.a = pa; - stack = stack.next; - } - - yp = width; - - for (i = 1; i <= radius; i++) { - yi = yp + x << 2; - rSum += (stack.r = pr = pixels[yi]) * (rbs = radiusPlus1 - i); - gSum += (stack.g = pg = pixels[yi + 1]) * rbs; - bSum += (stack.b = pb = pixels[yi + 2]) * rbs; - aSum += (stack.a = pa = pixels[yi + 3]) * rbs; - rInSum += pr; - gInSum += pg; - bInSum += pb; - aInSum += pa; - stack = stack.next; - - if (i < heightMinus1) { - yp += width; - } - } - - yi = x; - stackIn = stackStart; - stackOut = stackEnd; - - for (y = 0; y < height; y++) { - p = yi << 2; - pixels[p + 3] = pa = aSum * mulSum >> shgSum; - - if (pa > 0) { - pa = 255 / pa; - pixels[p] = (rSum * mulSum >> shgSum) * pa; - pixels[p + 1] = (gSum * mulSum >> shgSum) * pa; - pixels[p + 2] = (bSum * mulSum >> shgSum) * pa; - } else { - pixels[p] = pixels[p + 1] = pixels[p + 2] = 0; - } - - rSum -= rOutSum; - gSum -= gOutSum; - bSum -= bOutSum; - aSum -= aOutSum; - rOutSum -= stackIn.r; - gOutSum -= stackIn.g; - bOutSum -= stackIn.b; - aOutSum -= stackIn.a; - p = x + ((p = y + radiusPlus1) < heightMinus1 ? p : heightMinus1) * width << 2; - rSum += rInSum += stackIn.r = pixels[p]; - gSum += gInSum += stackIn.g = pixels[p + 1]; - bSum += bInSum += stackIn.b = pixels[p + 2]; - aSum += aInSum += stackIn.a = pixels[p + 3]; - stackIn = stackIn.next; - rOutSum += pr = stackOut.r; - gOutSum += pg = stackOut.g; - bOutSum += pb = stackOut.b; - aOutSum += pa = stackOut.a; - rInSum -= pr; - gInSum -= pg; - bInSum -= pb; - aInSum -= pa; - stackOut = stackOut.next; - yi += width; - } - } - - return imageData; - } - /** - * - */ - - - var BlurStack = - /** - * Set properties. - */ - function BlurStack() { - _classCallCheck$1(this, BlurStack); - - this.r = 0; - this.g = 0; - this.b = 0; - this.a = 0; - this.next = null; - }; - - /** - * Whether a value is `null` or `undefined`. - * @param {any} val - * @returns {boolean} - */ - - var isNullish = function isNullish(val) { - return val === null || val === undefined; - }; - /** - * @callback module:canvg.ForceRedraw - * @returns {boolean} - */ - - /** - * @typedef {PlainObject} module:canvg.CanvgOptions - * @property {boolean} ignoreMouse true => ignore mouse events - * @property {boolean} ignoreAnimation true => ignore animations - * @property {boolean} ignoreDimensions true => does not try to resize canvas - * @property {boolean} ignoreClear true => does not clear canvas - * @property {Integer} offsetX int => draws at a x offset - * @property {Integer} offsetY int => draws at a y offset - * @property {Integer} scaleWidth int => scales horizontally to width - * @property {Integer} scaleHeight int => scales vertically to height - * @property {module:canvg.ForceRedraw} forceRedraw function => will call the function on every frame, if it returns true, will redraw - * @property {boolean} log Adds log function - * @property {boolean} useCORS Whether to set CORS `crossOrigin` for the image to `Anonymous` - */ - - /** - * If called with no arguments, it will replace all `<svg>` elements on the page - * with `<canvas>` elements. - * @function module:canvg.canvg - * @param {HTMLCanvasElement|string} target canvas element or the id of a canvas element - * @param {string|XMLDocument} s - svg string, url to svg file, or xml document - * @param {module:canvg.CanvgOptions} [opts] Optional hash of options - * @returns {Promise<XMLDocument|XMLDocument[]>} All the function after the first render is completed with dom - */ - - - var canvg = function canvg(target, s, opts) { - // no parameters - if (isNullish(target) && isNullish(s) && isNullish(opts)) { - var svgTags = document.querySelectorAll('svg'); - return Promise.all(_toConsumableArray(svgTags).map(function (svgTag) { - var c = document.createElement('canvas'); - c.width = svgTag.clientWidth; - c.height = svgTag.clientHeight; - svgTag.before(c); - svgTag.remove(); - var div = document.createElement('div'); - div.append(svgTag); - return canvg(c, div.innerHTML); - })); - } - - if (typeof target === 'string') { - target = document.getElementById(target); - } // store class on canvas - - - if (!isNullish(target.svg)) target.svg.stop(); - var svg = build(opts || {}); // on i.e. 8 for flash canvas, we can't assign the property so check for it - - if (!(target.childNodes.length === 1 && target.childNodes[0].nodeName === 'OBJECT')) { - target.svg = svg; - } - - var ctx = target.getContext('2d'); - - if (typeof s.documentElement !== 'undefined') { - // load from xml doc - return svg.loadXmlDoc(ctx, s); - } - - if (s.substr(0, 1) === '<') { - // load from xml string - return svg.loadXml(ctx, s); - } // load from url - - - return svg.load(ctx, s); - }; - /* eslint-disable jsdoc/check-types */ - - /** - * @param {module:canvg.CanvgOptions} opts - * @returns {object} - * @todo Flesh out exactly what object is returned here (after updating to latest and reincluding our changes here and those of StackBlur) - */ - - function build(opts) { - /* eslint-enable jsdoc/check-types */ - var svg = { - opts: opts - }; - svg.FRAMERATE = 30; - svg.MAX_VIRTUAL_PIXELS = 30000; - - svg.log = function (msg) { - /* */ - }; - - if (svg.opts.log === true && typeof console !== 'undefined') { - svg.log = function (msg) { - console.log(msg); - }; // eslint-disable-line no-console - - } // globals - - - svg.init = function (ctx) { - var uniqueId = 0; - - svg.UniqueId = function () { - uniqueId++; - return 'canvg' + uniqueId; - }; - - svg.Definitions = {}; - svg.Styles = {}; - svg.Animations = []; - svg.Images = []; - svg.ctx = ctx; - svg.ViewPort = { - viewPorts: [], - Clear: function Clear() { - this.viewPorts = []; - }, - SetCurrent: function SetCurrent(width, height) { - this.viewPorts.push({ - width: width, - height: height - }); - }, - RemoveCurrent: function RemoveCurrent() { - this.viewPorts.pop(); - }, - Current: function Current() { - return this.viewPorts[this.viewPorts.length - 1]; - }, - width: function width() { - return this.Current().width; - }, - height: function height() { - return this.Current().height; - }, - ComputeSize: function ComputeSize(d) { - if (!isNullish(d) && typeof d === 'number') return d; - if (d === 'x') return this.width(); - if (d === 'y') return this.height(); - return Math.sqrt(Math.pow(this.width(), 2) + Math.pow(this.height(), 2)) / Math.sqrt(2); - } - }; - }; - - svg.init(); // images loaded - - svg.ImagesLoaded = function () { - return svg.Images.every(function (img) { - return img.loaded; - }); - }; // trim - - - svg.trim = function (s) { - return s.replace(/^\s+|\s+$/g, ''); - }; // compress spaces - - - svg.compressSpaces = function (s) { - return s.replace(/\s+/gm, ' '); - }; // ajax - // Todo: Replace with `fetch` and polyfill - - - svg.ajax = function (url, asynch) { - var AJAX = window.XMLHttpRequest ? new XMLHttpRequest() : new window.ActiveXObject('Microsoft.XMLHTTP'); - - if (asynch) { - return new Promise(function (resolve, reject) { - // eslint-disable-line promise/avoid-new - var req = AJAX.open('GET', url, true); - req.addEventListener('load', function () { - resolve(AJAX.responseText); - }); - AJAX.send(null); - }); - } - - AJAX.open('GET', url, false); - AJAX.send(null); - return AJAX.responseText; - }; // parse xml - - - svg.parseXml = function (xml) { - if (window.DOMParser) { - var parser = new DOMParser(); - return parser.parseFromString(xml, 'text/xml'); - } - - xml = xml.replace(/<!DOCTYPE svg[^>]*>/, ''); - var xmlDoc = new window.ActiveXObject('Microsoft.XMLDOM'); - xmlDoc.async = 'false'; - xmlDoc.loadXML(xml); - return xmlDoc; - }; // text extensions - // get the text baseline - - - var textBaselineMapping = { - baseline: 'alphabetic', - 'before-edge': 'top', - 'text-before-edge': 'top', - middle: 'middle', - central: 'middle', - 'after-edge': 'bottom', - 'text-after-edge': 'bottom', - ideographic: 'ideographic', - alphabetic: 'alphabetic', - hanging: 'hanging', - mathematical: 'alphabetic' - }; - - svg.Property = /*#__PURE__*/function () { - function Property(name, value) { - _classCallCheck(this, Property); - - this.name = name; - this.value = value; - } - - _createClass(Property, [{ - key: "getValue", - value: function getValue() { - return this.value; - } - }, { - key: "hasValue", - value: function hasValue() { - return !isNullish(this.value) && this.value !== ''; - } // return the numerical value of the property - - }, { - key: "numValue", - value: function numValue() { - if (!this.hasValue()) return 0; - var n = Number.parseFloat(this.value); - - if (String(this.value).endsWith('%')) { - n /= 100.0; - } - - return n; - } - }, { - key: "valueOrDefault", - value: function valueOrDefault(def) { - if (this.hasValue()) return this.value; - return def; - } - }, { - key: "numValueOrDefault", - value: function numValueOrDefault(def) { - if (this.hasValue()) return this.numValue(); - return def; - } // color extensions - // augment the current color value with the opacity - - }, { - key: "addOpacity", - value: function addOpacity(opacityProp) { - var newValue = this.value; - - if (!isNullish(opacityProp.value) && opacityProp.value !== '' && typeof this.value === 'string') { - // can only add opacity to colors, not patterns - var color = new RGBColor(this.value); - - if (color.ok) { - newValue = 'rgba(' + color.r + ', ' + color.g + ', ' + color.b + ', ' + opacityProp.numValue() + ')'; - } - } - - return new svg.Property(this.name, newValue); - } // definition extensions - // get the definition from the definitions table - - }, { - key: "getDefinition", - value: function getDefinition() { - var name = this.value.match(/#([^)'"]+)/); - - if (name) { - name = name[1]; - } - - if (!name) { - name = this.value; - } - - return svg.Definitions[name]; - } - }, { - key: "isUrlDefinition", - value: function isUrlDefinition() { - return this.value.startsWith('url('); - } - }, { - key: "getFillStyleDefinition", - value: function getFillStyleDefinition(e, opacityProp) { - var def = this.getDefinition(); // gradient - - if (!isNullish(def) && def.createGradient) { - return def.createGradient(svg.ctx, e, opacityProp); - } // pattern - - - if (!isNullish(def) && def.createPattern) { - if (def.getHrefAttribute().hasValue()) { - var pt = def.attribute('patternTransform'); - def = def.getHrefAttribute().getDefinition(); - - if (pt.hasValue()) { - def.attribute('patternTransform', true).value = pt.value; - } - } - - return def.createPattern(svg.ctx, e); - } - - return null; - } // length extensions - - }, { - key: "getDPI", - value: function getDPI(viewPort) { - return 96.0; // TODO: compute? - } - }, { - key: "getEM", - value: function getEM(viewPort) { - var em = 12; - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - if (fontSize.hasValue()) em = fontSize.toPixels(viewPort); - return em; - } - }, { - key: "getUnits", - value: function getUnits() { - return String(this.value).replace(/[\d.-]/g, ''); - } // get the length as pixels - - }, { - key: "toPixels", - value: function toPixels(viewPort, processPercent) { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('em')) return this.numValue() * this.getEM(viewPort); - if (s.endsWith('ex')) return this.numValue() * this.getEM(viewPort) / 2.0; - if (s.endsWith('px')) return this.numValue(); - if (s.endsWith('pt')) return this.numValue() * this.getDPI(viewPort) * (1.0 / 72.0); - if (s.endsWith('pc')) return this.numValue() * 15; - if (s.endsWith('cm')) return this.numValue() * this.getDPI(viewPort) / 2.54; - if (s.endsWith('mm')) return this.numValue() * this.getDPI(viewPort) / 25.4; - if (s.endsWith('in')) return this.numValue() * this.getDPI(viewPort); - if (s.endsWith('%')) return this.numValue() * svg.ViewPort.ComputeSize(viewPort); - var n = this.numValue(); - if (processPercent && n < 1.0) return n * svg.ViewPort.ComputeSize(viewPort); - return n; - } // time extensions - // get the time as milliseconds - - }, { - key: "toMilliseconds", - value: function toMilliseconds() { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('ms')) return this.numValue(); - if (s.endsWith('s')) return this.numValue() * 1000; - return this.numValue(); - } // angle extensions - // get the angle as radians - - }, { - key: "toRadians", - value: function toRadians() { - if (!this.hasValue()) return 0; - var s = String(this.value); - if (s.endsWith('deg')) return this.numValue() * (Math.PI / 180.0); - if (s.endsWith('grad')) return this.numValue() * (Math.PI / 200.0); - if (s.endsWith('rad')) return this.numValue(); - return this.numValue() * (Math.PI / 180.0); - } - }, { - key: "toTextBaseline", - value: function toTextBaseline() { - if (!this.hasValue()) return null; - return textBaselineMapping[this.value]; - } - }]); - - return Property; - }(); // fonts - - - svg.Font = { - Styles: 'normal|italic|oblique|inherit', - Variants: 'normal|small-caps|inherit', - Weights: 'normal|bold|bolder|lighter|100|200|300|400|500|600|700|800|900|inherit', - CreateFont: function CreateFont(fontStyle, fontVariant, fontWeight, fontSize, fontFamily, inherit) { - var f = !isNullish(inherit) ? this.Parse(inherit) : this.CreateFont('', '', '', '', '', svg.ctx.font); - return { - fontFamily: fontFamily || f.fontFamily, - fontSize: fontSize || f.fontSize, - fontStyle: fontStyle || f.fontStyle, - fontWeight: fontWeight || f.fontWeight, - fontVariant: fontVariant || f.fontVariant, - toString: function toString() { - return [this.fontStyle, this.fontVariant, this.fontWeight, this.fontSize, this.fontFamily].join(' '); - } - }; - }, - Parse: function Parse(s) { - var _this = this; - - var f = {}; - var ds = svg.trim(svg.compressSpaces(s || '')).split(' '); - var set = { - fontSize: false, - fontStyle: false, - fontWeight: false, - fontVariant: false - }; - var ff = ''; - ds.forEach(function (d) { - if (!set.fontStyle && _this.Styles.includes(d)) { - if (d !== 'inherit') { - f.fontStyle = d; - } - - set.fontStyle = true; - } else if (!set.fontVariant && _this.Variants.includes(d)) { - if (d !== 'inherit') { - f.fontVariant = d; - } - - set.fontStyle = set.fontVariant = true; - } else if (!set.fontWeight && _this.Weights.includes(d)) { - if (d !== 'inherit') { - f.fontWeight = d; - } - - set.fontStyle = set.fontVariant = set.fontWeight = true; - } else if (!set.fontSize) { - if (d !== 'inherit') { - f.fontSize = d.split('/')[0]; - } - - set.fontStyle = set.fontVariant = set.fontWeight = set.fontSize = true; - } else if (d !== 'inherit') { - ff += d; - } - }); - - if (ff !== '') { - f.fontFamily = ff; - } - - return f; - } - }; // points and paths - - svg.ToNumberArray = function (s) { - var a = svg.trim(svg.compressSpaces((s || '').replace(/,/g, ' '))).split(' '); - return a.map(function (_a) { - return Number.parseFloat(_a); - }); - }; - - svg.Point = /*#__PURE__*/function () { - function _class(x, y) { - _classCallCheck(this, _class); - - this.x = x; - this.y = y; - } - - _createClass(_class, [{ - key: "angleTo", - value: function angleTo(p) { - return Math.atan2(p.y - this.y, p.x - this.x); - } - }, { - key: "applyTransform", - value: function applyTransform(v) { - var xp = this.x * v[0] + this.y * v[2] + v[4]; - var yp = this.x * v[1] + this.y * v[3] + v[5]; - this.x = xp; - this.y = yp; - } - }]); - - return _class; - }(); - - svg.CreatePoint = function (s) { - var a = svg.ToNumberArray(s); - return new svg.Point(a[0], a[1]); - }; - - svg.CreatePath = function (s) { - var a = svg.ToNumberArray(s); - var path = []; - - for (var i = 0; i < a.length; i += 2) { - path.push(new svg.Point(a[i], a[i + 1])); - } - - return path; - }; // bounding box - - - svg.BoundingBox = /*#__PURE__*/function () { - function _class2(x1, y1, x2, y2) { - _classCallCheck(this, _class2); - - // pass in initial points if you want - this.x1 = Number.NaN; - this.y1 = Number.NaN; - this.x2 = Number.NaN; - this.y2 = Number.NaN; - this.addPoint(x1, y1); - this.addPoint(x2, y2); - } - - _createClass(_class2, [{ - key: "x", - value: function x() { - return this.x1; - } - }, { - key: "y", - value: function y() { - return this.y1; - } - }, { - key: "width", - value: function width() { - return this.x2 - this.x1; - } - }, { - key: "height", - value: function height() { - return this.y2 - this.y1; - } - }, { - key: "addPoint", - value: function addPoint(x, y) { - if (!isNullish(x)) { - if (isNaN(this.x1) || isNaN(this.x2)) { - this.x1 = x; - this.x2 = x; - } - - if (x < this.x1) this.x1 = x; - if (x > this.x2) this.x2 = x; - } - - if (!isNullish(y)) { - if (isNaN(this.y1) || isNaN(this.y2)) { - this.y1 = y; - this.y2 = y; - } - - if (y < this.y1) this.y1 = y; - if (y > this.y2) this.y2 = y; - } - } - }, { - key: "addX", - value: function addX(x) { - this.addPoint(x, null); - } - }, { - key: "addY", - value: function addY(y) { - this.addPoint(null, y); - } - }, { - key: "addBoundingBox", - value: function addBoundingBox(bb) { - this.addPoint(bb.x1, bb.y1); - this.addPoint(bb.x2, bb.y2); - } - }, { - key: "addQuadraticCurve", - value: function addQuadraticCurve(p0x, p0y, p1x, p1y, p2x, p2y) { - var cp1x = p0x + 2 / 3 * (p1x - p0x); // CP1 = QP0 + 2/3 *(QP1-QP0) - - var cp1y = p0y + 2 / 3 * (p1y - p0y); // CP1 = QP0 + 2/3 *(QP1-QP0) - - var cp2x = cp1x + 1 / 3 * (p2x - p0x); // CP2 = CP1 + 1/3 *(QP2-QP0) - - var cp2y = cp1y + 1 / 3 * (p2y - p0y); // CP2 = CP1 + 1/3 *(QP2-QP0) - - this.addBezierCurve(p0x, p0y, cp1x, cp2x, cp1y, cp2y, p2x, p2y); - } - }, { - key: "addBezierCurve", - value: function addBezierCurve(p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y) { - var _this2 = this; - - // from http://blog.hackers-cafe.net/2009/06/how-to-calculate-bezier-curves-bounding.html - var p0 = [p0x, p0y], - p1 = [p1x, p1y], - p2 = [p2x, p2y], - p3 = [p3x, p3y]; - this.addPoint(p0[0], p0[1]); - this.addPoint(p3[0], p3[1]); - - var _loop = function _loop(i) { - var f = function f(t) { - return Math.pow(1 - t, 3) * p0[i] + 3 * Math.pow(1 - t, 2) * t * p1[i] + 3 * (1 - t) * Math.pow(t, 2) * p2[i] + Math.pow(t, 3) * p3[i]; - }; - - var b = 6 * p0[i] - 12 * p1[i] + 6 * p2[i]; - var a = -3 * p0[i] + 9 * p1[i] - 9 * p2[i] + 3 * p3[i]; - var c = 3 * p1[i] - 3 * p0[i]; - - if (a === 0) { - if (b === 0) return "continue"; - var t = -c / b; - - if (t > 0 && t < 1) { - if (i === 0) _this2.addX(f(t)); - if (i === 1) _this2.addY(f(t)); - } - - return "continue"; - } - - var b2ac = Math.pow(b, 2) - 4 * c * a; - if (b2ac < 0) return "continue"; - var t1 = (-b + Math.sqrt(b2ac)) / (2 * a); - - if (t1 > 0 && t1 < 1) { - if (i === 0) _this2.addX(f(t1)); - if (i === 1) _this2.addY(f(t1)); - } - - var t2 = (-b - Math.sqrt(b2ac)) / (2 * a); - - if (t2 > 0 && t2 < 1) { - if (i === 0) _this2.addX(f(t2)); - if (i === 1) _this2.addY(f(t2)); - } - }; - - for (var i = 0; i <= 1; i++) { - var _ret = _loop(i); - - if (_ret === "continue") continue; - } - } - }, { - key: "isPointInBox", - value: function isPointInBox(x, y) { - return this.x1 <= x && x <= this.x2 && this.y1 <= y && y <= this.y2; - } - }]); - - return _class2; - }(); // transforms - - - svg.Transform = /*#__PURE__*/function () { - function _class3(v) { - var _this6 = this; - - _classCallCheck(this, _class3); - - this.Type = { - translate: function translate(s) { - _classCallCheck(this, translate); - - this.p = svg.CreatePoint(s); - - this.apply = function (ctx) { - ctx.translate(this.p.x || 0.0, this.p.y || 0.0); - }; - - this.unapply = function (ctx) { - ctx.translate(-1.0 * this.p.x || 0.0, -1.0 * this.p.y || 0.0); - }; - - this.applyToPoint = function (p) { - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - }; - }, - rotate: function rotate(s) { - _classCallCheck(this, rotate); - - var a = svg.ToNumberArray(s); - this.angle = new svg.Property('angle', a[0]); - this.cx = a[1] || 0; - this.cy = a[2] || 0; - - this.apply = function (ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(this.angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - }; - - this.unapply = function (ctx) { - ctx.translate(this.cx, this.cy); - ctx.rotate(-1.0 * this.angle.toRadians()); - ctx.translate(-this.cx, -this.cy); - }; - - this.applyToPoint = function (p) { - var _a = this.angle.toRadians(); - - p.applyTransform([1, 0, 0, 1, this.p.x || 0.0, this.p.y || 0.0]); - p.applyTransform([Math.cos(_a), Math.sin(_a), -Math.sin(_a), Math.cos(_a), 0, 0]); - p.applyTransform([1, 0, 0, 1, -this.p.x || 0.0, -this.p.y || 0.0]); - }; - }, - scale: function scale(s) { - _classCallCheck(this, scale); - - this.p = svg.CreatePoint(s); - - this.apply = function (ctx) { - ctx.scale(this.p.x || 1.0, this.p.y || this.p.x || 1.0); - }; - - this.unapply = function (ctx) { - ctx.scale(1.0 / this.p.x || 1.0, 1.0 / this.p.y || this.p.x || 1.0); - }; - - this.applyToPoint = function (p) { - p.applyTransform([this.p.x || 0.0, 0, 0, this.p.y || 0.0, 0, 0]); - }; - }, - matrix: function matrix(s) { - _classCallCheck(this, matrix); - - this.m = svg.ToNumberArray(s); - - this.apply = function (ctx) { - ctx.transform(this.m[0], this.m[1], this.m[2], this.m[3], this.m[4], this.m[5]); - }; - - this.applyToPoint = function (p) { - p.applyTransform(this.m); - }; - } - }; - Object.assign(this.Type, { - SkewBase: /*#__PURE__*/function (_this$Type$matrix) { - _inherits(SkewBase, _this$Type$matrix); - - var _super = _createSuper(SkewBase); - - function SkewBase(s) { - var _this3; - - _classCallCheck(this, SkewBase); - - _this3 = _super.call(this, s); - _this3.angle = new svg.Property('angle', s); - return _this3; - } - - return SkewBase; - }(this.Type.matrix) - }); - Object.assign(this.Type, { - skewX: /*#__PURE__*/function (_this$Type$SkewBase) { - _inherits(skewX, _this$Type$SkewBase); - - var _super2 = _createSuper(skewX); - - function skewX(s) { - var _this4; - - _classCallCheck(this, skewX); - - _this4 = _super2.call(this, s); - _this4.m = [1, 0, Math.tan(_this4.angle.toRadians()), 1, 0, 0]; - return _this4; - } - - return skewX; - }(this.Type.SkewBase), - skewY: /*#__PURE__*/function (_this$Type$SkewBase2) { - _inherits(skewY, _this$Type$SkewBase2); - - var _super3 = _createSuper(skewY); - - function skewY(s) { - var _this5; - - _classCallCheck(this, skewY); - - _this5 = _super3.call(this, s); - _this5.m = [1, Math.tan(_this5.angle.toRadians()), 0, 1, 0, 0]; - return _this5; - } - - return skewY; - }(this.Type.SkewBase) - }); - var data = svg.trim(svg.compressSpaces(v)).replace(/\)([a-zA-Z])/g, ') $1').replace(/\)(\s?,\s?)/g, ') ').split(/\s(?=[a-z])/); - this.transforms = data.map(function (d) { - var type = svg.trim(d.split('(')[0]); - var s = d.split('(')[1].replace(')', ''); - var transform = new _this6.Type[type](s); - transform.type = type; - return transform; - }); - } - - _createClass(_class3, [{ - key: "apply", - value: function apply(ctx) { - this.transforms.forEach(function (transform) { - transform.apply(ctx); - }); - } - }, { - key: "unapply", - value: function unapply(ctx) { - for (var i = this.transforms.length - 1; i >= 0; i--) { - this.transforms[i].unapply(ctx); - } - } - }, { - key: "applyToPoint", - value: function applyToPoint(p) { - this.transforms.forEach(function (transform) { - transform.applyToPoint(p); - }); - } - }]); - - return _class3; - }(); // aspect ratio - - - svg.AspectRatio = function (ctx, aspectRatio, width, desiredWidth, height, desiredHeight, minX, minY, refX, refY) { - // aspect ratio - https://www.w3.org/TR/SVG/coords.html#PreserveAspectRatioAttribute - aspectRatio = svg.compressSpaces(aspectRatio); - aspectRatio = aspectRatio.replace(/^defer\s/, ''); // ignore defer - - var align = aspectRatio.split(' ')[0] || 'xMidYMid'; - var meetOrSlice = aspectRatio.split(' ')[1] || 'meet'; // calculate scale - - var scaleX = width / desiredWidth; - var scaleY = height / desiredHeight; - var scaleMin = Math.min(scaleX, scaleY); - var scaleMax = Math.max(scaleX, scaleY); - - if (meetOrSlice === 'meet') { - desiredWidth *= scaleMin; - desiredHeight *= scaleMin; - } - - if (meetOrSlice === 'slice') { - desiredWidth *= scaleMax; - desiredHeight *= scaleMax; - } - - refX = new svg.Property('refX', refX); - refY = new svg.Property('refY', refY); - - if (refX.hasValue() && refY.hasValue()) { - ctx.translate(-scaleMin * refX.toPixels('x'), -scaleMin * refY.toPixels('y')); - } else { - // align - if (align.startsWith('xMid') && (meetOrSlice === 'meet' && scaleMin === scaleY || meetOrSlice === 'slice' && scaleMax === scaleY)) { - ctx.translate(width / 2.0 - desiredWidth / 2.0, 0); - } - - if (align.endsWith('YMid') && (meetOrSlice === 'meet' && scaleMin === scaleX || meetOrSlice === 'slice' && scaleMax === scaleX)) { - ctx.translate(0, height / 2.0 - desiredHeight / 2.0); - } - - if (align.startsWith('xMax') && (meetOrSlice === 'meet' && scaleMin === scaleY || meetOrSlice === 'slice' && scaleMax === scaleY)) { - ctx.translate(width - desiredWidth, 0); - } - - if (align.endsWith('YMax') && (meetOrSlice === 'meet' && scaleMin === scaleX || meetOrSlice === 'slice' && scaleMax === scaleX)) { - ctx.translate(0, height - desiredHeight); - } - } // scale - - - if (align === 'none') ctx.scale(scaleX, scaleY);else if (meetOrSlice === 'meet') ctx.scale(scaleMin, scaleMin);else if (meetOrSlice === 'slice') ctx.scale(scaleMax, scaleMax); // translate - - ctx.translate(isNullish(minX) ? 0 : -minX, isNullish(minY) ? 0 : -minY); - }; // elements - - - svg.Element = {}; - svg.EmptyProperty = new svg.Property('EMPTY', ''); - - svg.Element.ElementBase = /*#__PURE__*/function () { - function _class4(node) { - var _this7 = this; - - _classCallCheck(this, _class4); - - // Argument from inheriting class - this.captureTextNodes = arguments[1]; // eslint-disable-line prefer-rest-params - - this.attributes = {}; - this.styles = {}; - this.children = []; - - if (!isNullish(node) && node.nodeType === 1) { - // ELEMENT_NODE - // add children - _toConsumableArray(node.childNodes).forEach(function (childNode) { - if (childNode.nodeType === 1) { - _this7.addChild(childNode, true); // ELEMENT_NODE - - } - - if (_this7.captureTextNodes && (childNode.nodeType === 3 || childNode.nodeType === 4)) { - var text = childNode.nodeValue || childNode.text || ''; - - if (svg.trim(svg.compressSpaces(text)) !== '') { - _this7.addChild(new svg.Element.tspan(childNode), false); // TEXT_NODE - - } - } - }); // add attributes - - - _toConsumableArray(node.attributes).forEach(function (_ref) { - var nodeName = _ref.nodeName, - nodeValue = _ref.nodeValue; - _this7.attributes[nodeName] = new svg.Property(nodeName, nodeValue); - }); // add tag styles - - - var styles = svg.Styles[node.nodeName]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - name = _ref3[0], - styleValue = _ref3[1]; - - _this7.styles[name] = styleValue; - }); - } // add class styles - - - if (this.attribute('class').hasValue()) { - var classes = svg.compressSpaces(this.attribute('class').value).split(' '); - classes.forEach(function (clss) { - styles = svg.Styles['.' + clss]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - name = _ref5[0], - styleValue = _ref5[1]; - - _this7.styles[name] = styleValue; - }); - } - - styles = svg.Styles[node.nodeName + '.' + clss]; - - if (!isNullish(styles)) { - Object.entries(styles).forEach(function (_ref6) { - var _ref7 = _slicedToArray(_ref6, 2), - name = _ref7[0], - styleValue = _ref7[1]; - - _this7.styles[name] = styleValue; - }); - } - }); - } // add id styles - - - if (this.attribute('id').hasValue()) { - var _styles = svg.Styles['#' + this.attribute('id').value]; - - if (!isNullish(_styles)) { - Object.entries(_styles).forEach(function (_ref8) { - var _ref9 = _slicedToArray(_ref8, 2), - name = _ref9[0], - styleValue = _ref9[1]; - - _this7.styles[name] = styleValue; - }); - } - } // add inline styles - - - if (this.attribute('style').hasValue()) { - var _styles2 = this.attribute('style').value.split(';'); - - _styles2.forEach(function (style) { - if (svg.trim(style) !== '') { - var _style$split = style.split(':'), - name = _style$split.name, - value = _style$split.value; - - name = svg.trim(name); - value = svg.trim(value); - _this7.styles[name] = new svg.Property(name, value); - } - }); - } // add id - - - if (this.attribute('id').hasValue()) { - if (isNullish(svg.Definitions[this.attribute('id').value])) { - svg.Definitions[this.attribute('id').value] = this; - } - } - } - } // get or create attribute - - - _createClass(_class4, [{ - key: "attribute", - value: function attribute(name, createIfNotExists) { - var a = this.attributes[name]; - if (!isNullish(a)) return a; - - if (createIfNotExists === true) { - a = new svg.Property(name, ''); - this.attributes[name] = a; - } - - return a || svg.EmptyProperty; - } - }, { - key: "getHrefAttribute", - value: function getHrefAttribute() { - for (var a in this.attributes) { - if (a.endsWith(':href')) { - return this.attributes[a]; - } - } - - return svg.EmptyProperty; - } // get or create style, crawls up node tree - - }, { - key: "style", - value: function style(name, createIfNotExists, skipAncestors) { - var s = this.styles[name]; - if (!isNullish(s)) return s; - var a = this.attribute(name); - - if (!isNullish(a) && a.hasValue()) { - this.styles[name] = a; // move up to me to cache - - return a; - } - - if (skipAncestors !== true) { - var p = this.parent; - - if (!isNullish(p)) { - var ps = p.style(name); - - if (!isNullish(ps) && ps.hasValue()) { - return ps; - } - } - } - - if (createIfNotExists === true) { - s = new svg.Property(name, ''); - this.styles[name] = s; - } - - return s || svg.EmptyProperty; - } // base render - - }, { - key: "render", - value: function render(ctx) { - // don't render display=none - if (this.style('display').value === 'none') return; // don't render visibility=hidden - - if (this.style('visibility').value === 'hidden') return; - ctx.save(); - - if (this.attribute('mask').hasValue()) { - // mask - var mask = this.attribute('mask').getDefinition(); - if (!isNullish(mask)) mask.apply(ctx, this); - } else if (this.style('filter').hasValue()) { - // filter - var filter = this.style('filter').getDefinition(); - if (!isNullish(filter)) filter.apply(ctx, this); - } else { - this.setContext(ctx); - this.renderChildren(ctx); - this.clearContext(ctx); - } - - ctx.restore(); - } // base set context - - }, { - key: "setContext", - value: function setContext(ctx) {// OVERRIDE ME! - } // base clear context - - }, { - key: "clearContext", - value: function clearContext(ctx) {// OVERRIDE ME! - } // base render children - - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - this.children.forEach(function (child) { - child.render(ctx); - }); - } - }, { - key: "addChild", - value: function addChild(childNode, create) { - var child = create ? svg.CreateElement(childNode) : childNode; - child.parent = this; - - if (child.type !== 'title') { - this.children.push(child); - } - } - }]); - - return _class4; - }(); - - svg.Element.RenderedElementBase = /*#__PURE__*/function (_svg$Element$ElementB) { - _inherits(_class5, _svg$Element$ElementB); - - var _super4 = _createSuper(_class5); - - function _class5() { - _classCallCheck(this, _class5); - - return _super4.apply(this, arguments); - } - - _createClass(_class5, [{ - key: "setContext", - value: function setContext(ctx) { - // fill - if (this.style('fill').isUrlDefinition()) { - var fs = this.style('fill').getFillStyleDefinition(this, this.style('fill-opacity')); - if (!isNullish(fs)) ctx.fillStyle = fs; - } else if (this.style('fill').hasValue()) { - var fillStyle = this.style('fill'); - if (fillStyle.value === 'currentColor') fillStyle.value = this.style('color').value; - ctx.fillStyle = fillStyle.value === 'none' ? 'rgba(0,0,0,0)' : fillStyle.value; - } - - if (this.style('fill-opacity').hasValue()) { - var _fillStyle = new svg.Property('fill', ctx.fillStyle); - - _fillStyle = _fillStyle.addOpacity(this.style('fill-opacity')); - ctx.fillStyle = _fillStyle.value; - } // stroke - - - if (this.style('stroke').isUrlDefinition()) { - var _fs = this.style('stroke').getFillStyleDefinition(this, this.style('stroke-opacity')); - - if (!isNullish(_fs)) ctx.strokeStyle = _fs; - } else if (this.style('stroke').hasValue()) { - var strokeStyle = this.style('stroke'); - if (strokeStyle.value === 'currentColor') strokeStyle.value = this.style('color').value; - ctx.strokeStyle = strokeStyle.value === 'none' ? 'rgba(0,0,0,0)' : strokeStyle.value; - } - - if (this.style('stroke-opacity').hasValue()) { - var _strokeStyle = new svg.Property('stroke', ctx.strokeStyle); - - _strokeStyle = _strokeStyle.addOpacity(this.style('stroke-opacity')); - ctx.strokeStyle = _strokeStyle.value; - } - - if (this.style('stroke-width').hasValue()) { - var newLineWidth = this.style('stroke-width').toPixels(); - ctx.lineWidth = newLineWidth === 0 ? 0.001 : newLineWidth; // browsers don't respect 0 - } - - if (this.style('stroke-linecap').hasValue()) ctx.lineCap = this.style('stroke-linecap').value; - if (this.style('stroke-linejoin').hasValue()) ctx.lineJoin = this.style('stroke-linejoin').value; - if (this.style('stroke-miterlimit').hasValue()) ctx.miterLimit = this.style('stroke-miterlimit').value; - - if (this.style('stroke-dasharray').hasValue() && this.style('stroke-dasharray').value !== 'none') { - var gaps = svg.ToNumberArray(this.style('stroke-dasharray').value); - - if (typeof ctx.setLineDash !== 'undefined') { - ctx.setLineDash(gaps); - } else if (typeof ctx.webkitLineDash !== 'undefined') { - ctx.webkitLineDash = gaps; - } else if (typeof ctx.mozDash !== 'undefined' && !(gaps.length === 1 && gaps[0] === 0)) { - ctx.mozDash = gaps; - } - - var offset = this.style('stroke-dashoffset').numValueOrDefault(1); - - if (typeof ctx.lineDashOffset !== 'undefined') { - ctx.lineDashOffset = offset; - } else if (typeof ctx.webkitLineDashOffset !== 'undefined') { - ctx.webkitLineDashOffset = offset; - } else if (typeof ctx.mozDashOffset !== 'undefined') { - ctx.mozDashOffset = offset; - } - } // font - - - if (typeof ctx.font !== 'undefined') { - ctx.font = svg.Font.CreateFont(this.style('font-style').value, this.style('font-variant').value, this.style('font-weight').value, this.style('font-size').hasValue() ? this.style('font-size').toPixels() + 'px' : '', this.style('font-family').value).toString(); - } // transform - - - if (this.attribute('transform').hasValue()) { - var transform = new svg.Transform(this.attribute('transform').value); - transform.apply(ctx); - } // clip - - - if (this.style('clip-path', false, true).hasValue()) { - var clip = this.style('clip-path', false, true).getDefinition(); - if (!isNullish(clip)) clip.apply(ctx); - } // opacity - - - if (this.style('opacity').hasValue()) { - ctx.globalAlpha = this.style('opacity').numValue(); - } - } - }]); - - return _class5; - }(svg.Element.ElementBase); - - svg.Element.PathElementBase = /*#__PURE__*/function (_svg$Element$Rendered) { - _inherits(_class6, _svg$Element$Rendered); - - var _super5 = _createSuper(_class6); - - function _class6() { - _classCallCheck(this, _class6); - - return _super5.apply(this, arguments); - } - - _createClass(_class6, [{ - key: "path", - value: function path(ctx) { - if (!isNullish(ctx)) ctx.beginPath(); - return new svg.BoundingBox(); - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - this.path(ctx); - svg.Mouse.checkPath(this, ctx); - - if (ctx.fillStyle !== '') { - if (this.style('fill-rule').valueOrDefault('inherit') !== 'inherit') { - ctx.fill(this.style('fill-rule').value); - } else { - ctx.fill(); - } - } - - if (ctx.strokeStyle !== '') ctx.stroke(); - var markers = this.getMarkers(); - - if (!isNullish(markers)) { - if (this.style('marker-start').isUrlDefinition()) { - var marker = this.style('marker-start').getDefinition(); - marker.render(ctx, markers[0][0], markers[0][1]); - } - - if (this.style('marker-mid').isUrlDefinition()) { - var _marker = this.style('marker-mid').getDefinition(); - - for (var i = 1; i < markers.length - 1; i++) { - _marker.render(ctx, markers[i][0], markers[i][1]); - } - } - - if (this.style('marker-end').isUrlDefinition()) { - var _marker2 = this.style('marker-end').getDefinition(); - - _marker2.render(ctx, markers[markers.length - 1][0], markers[markers.length - 1][1]); - } - } - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - return this.path(); - } - }, { - key: "getMarkers", - value: function getMarkers() { - return null; - } - }]); - - return _class6; - }(svg.Element.RenderedElementBase); // svg element - - - svg.Element.svg = /*#__PURE__*/function (_svg$Element$Rendered2) { - _inherits(_class7, _svg$Element$Rendered2); - - var _super6 = _createSuper(_class7); - - function _class7() { - _classCallCheck(this, _class7); - - return _super6.apply(this, arguments); - } - - _createClass(_class7, [{ - key: "clearContext", - value: function clearContext(ctx) { - _get(_getPrototypeOf(_class7.prototype), "clearContext", this).call(this, ctx); - - svg.ViewPort.RemoveCurrent(); - } - }, { - key: "setContext", - value: function setContext(ctx) { - // initial values and defaults - ctx.strokeStyle = 'rgba(0,0,0,0)'; - ctx.lineCap = 'butt'; - ctx.lineJoin = 'miter'; - ctx.miterLimit = 4; - - if (typeof ctx.font !== 'undefined' && typeof window.getComputedStyle !== 'undefined') { - ctx.font = window.getComputedStyle(ctx.canvas).getPropertyValue('font'); - } - - _get(_getPrototypeOf(_class7.prototype), "setContext", this).call(this, ctx); // create new view port - - - if (!this.attribute('x').hasValue()) this.attribute('x', true).value = 0; - if (!this.attribute('y').hasValue()) this.attribute('y', true).value = 0; - ctx.translate(this.attribute('x').toPixels('x'), this.attribute('y').toPixels('y')); - var width = svg.ViewPort.width(); - var height = svg.ViewPort.height(); - if (!this.attribute('width').hasValue()) this.attribute('width', true).value = '100%'; - if (!this.attribute('height').hasValue()) this.attribute('height', true).value = '100%'; - - if (typeof this.root === 'undefined') { - width = this.attribute('width').toPixels('x'); - height = this.attribute('height').toPixels('y'); - var x = 0; - var y = 0; - - if (this.attribute('refX').hasValue() && this.attribute('refY').hasValue()) { - x = -this.attribute('refX').toPixels('x'); - y = -this.attribute('refY').toPixels('y'); - } - - if (this.attribute('overflow').valueOrDefault('hidden') !== 'visible') { - ctx.beginPath(); - ctx.moveTo(x, y); - ctx.lineTo(width, y); - ctx.lineTo(width, height); - ctx.lineTo(x, height); - ctx.closePath(); - ctx.clip(); - } - } - - svg.ViewPort.SetCurrent(width, height); // viewbox - - if (this.attribute('viewBox').hasValue()) { - var viewBox = svg.ToNumberArray(this.attribute('viewBox').value); - var minX = viewBox[0]; - var minY = viewBox[1]; - width = viewBox[2]; - height = viewBox[3]; - svg.AspectRatio(ctx, this.attribute('preserveAspectRatio').value, svg.ViewPort.width(), width, svg.ViewPort.height(), height, minX, minY, this.attribute('refX').value, this.attribute('refY').value); - svg.ViewPort.RemoveCurrent(); - svg.ViewPort.SetCurrent(viewBox[2], viewBox[3]); - } - } - }]); - - return _class7; - }(svg.Element.RenderedElementBase); // rect element - - - svg.Element.rect = /*#__PURE__*/function (_svg$Element$PathElem) { - _inherits(_class8, _svg$Element$PathElem); - - var _super7 = _createSuper(_class8); - - function _class8() { - _classCallCheck(this, _class8); - - return _super7.apply(this, arguments); - } - - _createClass(_class8, [{ - key: "path", - value: function path(ctx) { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - var rx = this.attribute('rx').toPixels('x'); - var ry = this.attribute('ry').toPixels('y'); - if (this.attribute('rx').hasValue() && !this.attribute('ry').hasValue()) ry = rx; - if (this.attribute('ry').hasValue() && !this.attribute('rx').hasValue()) rx = ry; - rx = Math.min(rx, width / 2.0); - ry = Math.min(ry, height / 2.0); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(x + rx, y); - ctx.lineTo(x + width - rx, y); - ctx.quadraticCurveTo(x + width, y, x + width, y + ry); - ctx.lineTo(x + width, y + height - ry); - ctx.quadraticCurveTo(x + width, y + height, x + width - rx, y + height); - ctx.lineTo(x + rx, y + height); - ctx.quadraticCurveTo(x, y + height, x, y + height - ry); - ctx.lineTo(x, y + ry); - ctx.quadraticCurveTo(x, y, x + rx, y); - ctx.closePath(); - } - - return new svg.BoundingBox(x, y, x + width, y + height); - } - }]); - - return _class8; - }(svg.Element.PathElementBase); // circle element - - - svg.Element.circle = /*#__PURE__*/function (_svg$Element$PathElem2) { - _inherits(_class9, _svg$Element$PathElem2); - - var _super8 = _createSuper(_class9); - - function _class9() { - _classCallCheck(this, _class9); - - return _super8.apply(this, arguments); - } - - _createClass(_class9, [{ - key: "path", - value: function path(ctx) { - var cx = this.attribute('cx').toPixels('x'); - var cy = this.attribute('cy').toPixels('y'); - var r = this.attribute('r').toPixels(); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.arc(cx, cy, r, 0, Math.PI * 2, true); - ctx.closePath(); - } - - return new svg.BoundingBox(cx - r, cy - r, cx + r, cy + r); - } - }]); - - return _class9; - }(svg.Element.PathElementBase); // ellipse element - - - var KAPPA = 4 * ((Math.sqrt(2) - 1) / 3); - - svg.Element.ellipse = /*#__PURE__*/function (_svg$Element$PathElem3) { - _inherits(_class10, _svg$Element$PathElem3); - - var _super9 = _createSuper(_class10); - - function _class10() { - _classCallCheck(this, _class10); - - return _super9.apply(this, arguments); - } - - _createClass(_class10, [{ - key: "path", - value: function path(ctx) { - var rx = this.attribute('rx').toPixels('x'); - var ry = this.attribute('ry').toPixels('y'); - var cx = this.attribute('cx').toPixels('x'); - var cy = this.attribute('cy').toPixels('y'); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(cx, cy - ry); - ctx.bezierCurveTo(cx + KAPPA * rx, cy - ry, cx + rx, cy - KAPPA * ry, cx + rx, cy); - ctx.bezierCurveTo(cx + rx, cy + KAPPA * ry, cx + KAPPA * rx, cy + ry, cx, cy + ry); - ctx.bezierCurveTo(cx - KAPPA * rx, cy + ry, cx - rx, cy + KAPPA * ry, cx - rx, cy); - ctx.bezierCurveTo(cx - rx, cy - KAPPA * ry, cx - KAPPA * rx, cy - ry, cx, cy - ry); - ctx.closePath(); - } - - return new svg.BoundingBox(cx - rx, cy - ry, cx + rx, cy + ry); - } - }]); - - return _class10; - }(svg.Element.PathElementBase); // line element - - - svg.Element.line = /*#__PURE__*/function (_svg$Element$PathElem4) { - _inherits(_class11, _svg$Element$PathElem4); - - var _super10 = _createSuper(_class11); - - function _class11() { - _classCallCheck(this, _class11); - - return _super10.apply(this, arguments); - } - - _createClass(_class11, [{ - key: "getPoints", - value: function getPoints() { - return [new svg.Point(this.attribute('x1').toPixels('x'), this.attribute('y1').toPixels('y')), new svg.Point(this.attribute('x2').toPixels('x'), this.attribute('y2').toPixels('y'))]; - } - }, { - key: "path", - value: function path(ctx) { - var points = this.getPoints(); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(points[0].x, points[0].y); - ctx.lineTo(points[1].x, points[1].y); - } - - return new svg.BoundingBox(points[0].x, points[0].y, points[1].x, points[1].y); - } - }, { - key: "getMarkers", - value: function getMarkers() { - var points = this.getPoints(); - var a = points[0].angleTo(points[1]); - return [[points[0], a], [points[1], a]]; - } - }]); - - return _class11; - }(svg.Element.PathElementBase); // polyline element - - - svg.Element.polyline = /*#__PURE__*/function (_svg$Element$PathElem5) { - _inherits(_class12, _svg$Element$PathElem5); - - var _super11 = _createSuper(_class12); - - function _class12(node) { - var _this8; - - _classCallCheck(this, _class12); - - _this8 = _super11.call(this, node); - _this8.points = svg.CreatePath(_this8.attribute('points').value); - return _this8; - } - - _createClass(_class12, [{ - key: "path", - value: function path(ctx) { - var _this$points$ = this.points[0], - x = _this$points$.x, - y = _this$points$.y; - var bb = new svg.BoundingBox(x, y); - - if (!isNullish(ctx)) { - ctx.beginPath(); - ctx.moveTo(x, y); - } - - for (var i = 1; i < this.points.length; i++) { - var _this$points$i = this.points[i], - _x = _this$points$i.x, - _y = _this$points$i.y; - bb.addPoint(_x, _y); - if (!isNullish(ctx)) ctx.lineTo(_x, _y); - } - - return bb; - } - }, { - key: "getMarkers", - value: function getMarkers() { - var markers = []; - - for (var i = 0; i < this.points.length - 1; i++) { - markers.push([this.points[i], this.points[i].angleTo(this.points[i + 1])]); - } - - markers.push([this.points[this.points.length - 1], markers[markers.length - 1][1]]); - return markers; - } - }]); - - return _class12; - }(svg.Element.PathElementBase); // polygon element - - - svg.Element.polygon = /*#__PURE__*/function (_svg$Element$polyline) { - _inherits(_class13, _svg$Element$polyline); - - var _super12 = _createSuper(_class13); - - function _class13() { - _classCallCheck(this, _class13); - - return _super12.apply(this, arguments); - } - - _createClass(_class13, [{ - key: "path", - value: function path(ctx) { - var bb = _get(_getPrototypeOf(_class13.prototype), "path", this).call(this, ctx); - - if (!isNullish(ctx)) { - ctx.lineTo(this.points[0].x, this.points[0].y); - ctx.closePath(); - } - - return bb; - } - }]); - - return _class13; - }(svg.Element.polyline); // path element - - - svg.Element.path = /*#__PURE__*/function (_svg$Element$PathElem6) { - _inherits(_class14, _svg$Element$PathElem6); - - var _super13 = _createSuper(_class14); - - function _class14(node) { - var _this9; - - _classCallCheck(this, _class14); - - _this9 = _super13.call(this, node); - - var d = _this9.attribute('d').value // TODO: convert to real lexer based on https://www.w3.org/TR/SVG11/paths.html#PathDataBNF - .replace(/,/gm, ' ') // get rid of all commas - .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands - .replace(/([MmZzLlHhVvCcSsQqTtAa])([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from commands - .replace(/([MmZzLlHhVvCcSsQqTtAa])(\S)/gm, '$1 $2') // separate commands from points - .replace(/(\S)([MmZzLlHhVvCcSsQqTtAa])/gm, '$1 $2') // separate commands from points - .replace(/(\d)([+-])/gm, '$1 $2') // separate digits when no comma - .replace(/(\.\d*)(\.)/gm, '$1 $2') // separate digits when no comma - .replace(/([Aa](\s+\d+)(\s+\d+)(\s+\d+))\s+([01])\s*([01])/gm, '$1 $5 $6 '); // shorthand elliptical arc path syntax - - - d = svg.compressSpaces(d); // compress multiple spaces - - d = svg.trim(d); - _this9.PathParser = { - tokens: d.split(' '), - reset: function reset() { - this.i = -1; - this.command = ''; - this.previousCommand = ''; - this.start = new svg.Point(0, 0); - this.control = new svg.Point(0, 0); - this.current = new svg.Point(0, 0); - this.points = []; - this.angles = []; - }, - isEnd: function isEnd() { - return this.i >= this.tokens.length - 1; - }, - isCommandOrEnd: function isCommandOrEnd() { - if (this.isEnd()) return true; - return !isNullish(this.tokens[this.i + 1].match(/^[A-Za-z]$/)); - }, - isRelativeCommand: function isRelativeCommand() { - switch (this.command) { - case 'm': - case 'l': - case 'h': - case 'v': - case 'c': - case 's': - case 'q': - case 't': - case 'a': - case 'z': - return true; - } - - return false; - }, - getToken: function getToken() { - this.i++; - return this.tokens[this.i]; - }, - getScalar: function getScalar() { - return Number.parseFloat(this.getToken()); - }, - nextCommand: function nextCommand() { - this.previousCommand = this.command; - this.command = this.getToken(); - }, - getPoint: function getPoint() { - var p = new svg.Point(this.getScalar(), this.getScalar()); - return this.makeAbsolute(p); - }, - getAsControlPoint: function getAsControlPoint() { - var p = this.getPoint(); - this.control = p; - return p; - }, - getAsCurrentPoint: function getAsCurrentPoint() { - var p = this.getPoint(); - this.current = p; - return p; - }, - getReflectedControlPoint: function getReflectedControlPoint() { - if (this.previousCommand.toLowerCase() !== 'c' && this.previousCommand.toLowerCase() !== 's' && this.previousCommand.toLowerCase() !== 'q' && this.previousCommand.toLowerCase() !== 't') { - return this.current; - } // reflect point - - - var p = new svg.Point(2 * this.current.x - this.control.x, 2 * this.current.y - this.control.y); - return p; - }, - makeAbsolute: function makeAbsolute(p) { - if (this.isRelativeCommand()) { - p.x += this.current.x; - p.y += this.current.y; - } - - return p; - }, - addMarker: function addMarker(p, from, priorTo) { - // if the last angle isn't filled in because we didn't have this point yet ... - if (!isNullish(priorTo) && this.angles.length > 0 && isNullish(this.angles[this.angles.length - 1])) { - this.angles[this.angles.length - 1] = this.points[this.points.length - 1].angleTo(priorTo); - } - - this.addMarkerAngle(p, isNullish(from) ? null : from.angleTo(p)); - }, - addMarkerAngle: function addMarkerAngle(p, a) { - this.points.push(p); - this.angles.push(a); - }, - getMarkerPoints: function getMarkerPoints() { - return this.points; - }, - getMarkerAngles: function getMarkerAngles() { - for (var i = 0; i < this.angles.length; i++) { - if (isNullish(this.angles[i])) { - for (var j = i + 1; j < this.angles.length; j++) { - if (!isNullish(this.angles[j])) { - this.angles[i] = this.angles[j]; - break; - } - } - } - } - - return this.angles; - } - }; - return _this9; - } - - _createClass(_class14, [{ - key: "path", - value: function path(ctx) { - var pp = this.PathParser; - pp.reset(); - var bb = new svg.BoundingBox(); - if (!isNullish(ctx)) ctx.beginPath(); - - while (!pp.isEnd()) { - pp.nextCommand(); - - switch (pp.command) { - case 'M': - case 'm': - { - var p = pp.getAsCurrentPoint(); - pp.addMarker(p); - bb.addPoint(p.x, p.y); - if (!isNullish(ctx)) ctx.moveTo(p.x, p.y); - pp.start = pp.current; - - while (!pp.isCommandOrEnd()) { - var _p = pp.getAsCurrentPoint(); - - pp.addMarker(_p, pp.start); - bb.addPoint(_p.x, _p.y); - if (!isNullish(ctx)) ctx.lineTo(_p.x, _p.y); - } - - break; - } - - case 'L': - case 'l': - while (!pp.isCommandOrEnd()) { - var c = pp.current; - - var _p2 = pp.getAsCurrentPoint(); - - pp.addMarker(_p2, c); - bb.addPoint(_p2.x, _p2.y); - if (!isNullish(ctx)) ctx.lineTo(_p2.x, _p2.y); - } - - break; - - case 'H': - case 'h': - while (!pp.isCommandOrEnd()) { - var newP = new svg.Point((pp.isRelativeCommand() ? pp.current.x : 0) + pp.getScalar(), pp.current.y); - pp.addMarker(newP, pp.current); - pp.current = newP; - bb.addPoint(pp.current.x, pp.current.y); - if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y); - } - - break; - - case 'V': - case 'v': - while (!pp.isCommandOrEnd()) { - var _newP = new svg.Point(pp.current.x, (pp.isRelativeCommand() ? pp.current.y : 0) + pp.getScalar()); - - pp.addMarker(_newP, pp.current); - pp.current = _newP; - bb.addPoint(pp.current.x, pp.current.y); - if (!isNullish(ctx)) ctx.lineTo(pp.current.x, pp.current.y); - } - - break; - - case 'C': - case 'c': - while (!pp.isCommandOrEnd()) { - var curr = pp.current; - var p1 = pp.getPoint(); - var cntrl = pp.getAsControlPoint(); - var cp = pp.getAsCurrentPoint(); - pp.addMarker(cp, cntrl, p1); - bb.addBezierCurve(curr.x, curr.y, p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); - if (!isNullish(ctx)) ctx.bezierCurveTo(p1.x, p1.y, cntrl.x, cntrl.y, cp.x, cp.y); - } - - break; - - case 'S': - case 's': - while (!pp.isCommandOrEnd()) { - var _curr = pp.current; - - var _p3 = pp.getReflectedControlPoint(); - - var _cntrl = pp.getAsControlPoint(); - - var _cp = pp.getAsCurrentPoint(); - - pp.addMarker(_cp, _cntrl, _p3); - bb.addBezierCurve(_curr.x, _curr.y, _p3.x, _p3.y, _cntrl.x, _cntrl.y, _cp.x, _cp.y); - if (!isNullish(ctx)) ctx.bezierCurveTo(_p3.x, _p3.y, _cntrl.x, _cntrl.y, _cp.x, _cp.y); - } - - break; - - case 'Q': - case 'q': - while (!pp.isCommandOrEnd()) { - var _curr2 = pp.current; - - var _cntrl2 = pp.getAsControlPoint(); - - var _cp2 = pp.getAsCurrentPoint(); - - pp.addMarker(_cp2, _cntrl2, _cntrl2); - bb.addQuadraticCurve(_curr2.x, _curr2.y, _cntrl2.x, _cntrl2.y, _cp2.x, _cp2.y); - if (!isNullish(ctx)) ctx.quadraticCurveTo(_cntrl2.x, _cntrl2.y, _cp2.x, _cp2.y); - } - - break; - - case 'T': - case 't': - while (!pp.isCommandOrEnd()) { - var _curr3 = pp.current; - - var _cntrl3 = pp.getReflectedControlPoint(); - - pp.control = _cntrl3; - - var _cp3 = pp.getAsCurrentPoint(); - - pp.addMarker(_cp3, _cntrl3, _cntrl3); - bb.addQuadraticCurve(_curr3.x, _curr3.y, _cntrl3.x, _cntrl3.y, _cp3.x, _cp3.y); - if (!isNullish(ctx)) ctx.quadraticCurveTo(_cntrl3.x, _cntrl3.y, _cp3.x, _cp3.y); - } - - break; - - case 'A': - case 'a': - var _loop2 = function _loop2() { - var curr = pp.current; - var rx = pp.getScalar(); - var ry = pp.getScalar(); - var xAxisRotation = pp.getScalar() * (Math.PI / 180.0); - var largeArcFlag = pp.getScalar(); - var sweepFlag = pp.getScalar(); - var cp = pp.getAsCurrentPoint(); // Conversion from endpoint to center parameterization - // https://www.w3.org/TR/SVG11/implnote.html#ArcConversionEndpointToCenter - // x1', y1' - - var currp = new svg.Point(Math.cos(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.sin(xAxisRotation) * (curr.y - cp.y) / 2.0, -Math.sin(xAxisRotation) * (curr.x - cp.x) / 2.0 + Math.cos(xAxisRotation) * (curr.y - cp.y) / 2.0); // adjust radii - - var l = Math.pow(currp.x, 2) / Math.pow(rx, 2) + Math.pow(currp.y, 2) / Math.pow(ry, 2); - - if (l > 1) { - rx *= Math.sqrt(l); - ry *= Math.sqrt(l); - } // cx', cy' - - - var s = (largeArcFlag === sweepFlag ? -1 : 1) * Math.sqrt((Math.pow(rx, 2) * Math.pow(ry, 2) - Math.pow(rx, 2) * Math.pow(currp.y, 2) - Math.pow(ry, 2) * Math.pow(currp.x, 2)) / (Math.pow(rx, 2) * Math.pow(currp.y, 2) + Math.pow(ry, 2) * Math.pow(currp.x, 2))); - if (isNaN(s)) s = 0; - var cpp = new svg.Point(s * rx * currp.y / ry, s * -ry * currp.x / rx); // cx, cy - - var centp = new svg.Point((curr.x + cp.x) / 2.0 + Math.cos(xAxisRotation) * cpp.x - Math.sin(xAxisRotation) * cpp.y, (curr.y + cp.y) / 2.0 + Math.sin(xAxisRotation) * cpp.x + Math.cos(xAxisRotation) * cpp.y); // vector magnitude - - var m = function m(v) { - return Math.sqrt(Math.pow(v[0], 2) + Math.pow(v[1], 2)); - }; // ratio between two vectors - - - var r = function r(u, v) { - return (u[0] * v[0] + u[1] * v[1]) / (m(u) * m(v)); - }; // angle between two vectors - - - var a = function a(u, v) { - return (u[0] * v[1] < u[1] * v[0] ? -1 : 1) * Math.acos(r(u, v)); - }; // initial angle - - - var a1 = a([1, 0], [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]); // angle delta - - var u = [(currp.x - cpp.x) / rx, (currp.y - cpp.y) / ry]; - var v = [(-currp.x - cpp.x) / rx, (-currp.y - cpp.y) / ry]; - var ad = a(u, v); - if (r(u, v) <= -1) ad = Math.PI; - if (r(u, v) >= 1) ad = 0; // for markers - - var dir = 1 - sweepFlag ? 1.0 : -1.0; - var ah = a1 + dir * (ad / 2.0); - var halfWay = new svg.Point(centp.x + rx * Math.cos(ah), centp.y + ry * Math.sin(ah)); - pp.addMarkerAngle(halfWay, ah - dir * Math.PI / 2); - pp.addMarkerAngle(cp, ah - dir * Math.PI); - bb.addPoint(cp.x, cp.y); // TODO: this is too naive, make it better - - if (!isNullish(ctx)) { - var _r = rx > ry ? rx : ry; - - var sx = rx > ry ? 1 : rx / ry; - var sy = rx > ry ? ry / rx : 1; - ctx.translate(centp.x, centp.y); - ctx.rotate(xAxisRotation); - ctx.scale(sx, sy); - ctx.arc(0, 0, _r, a1, a1 + ad, 1 - sweepFlag); - ctx.scale(1 / sx, 1 / sy); - ctx.rotate(-xAxisRotation); - ctx.translate(-centp.x, -centp.y); - } - }; - - while (!pp.isCommandOrEnd()) { - _loop2(); - } - - break; - - case 'Z': - case 'z': - if (!isNullish(ctx)) ctx.closePath(); - pp.current = pp.start; - } - } - - return bb; - } - }, { - key: "getMarkers", - value: function getMarkers() { - var points = this.PathParser.getMarkerPoints(); - var angles = this.PathParser.getMarkerAngles(); - var markers = points.map(function (point, i) { - return [point, angles[i]]; - }); - return markers; - } - }]); - - return _class14; - }(svg.Element.PathElementBase); // pattern element - - - svg.Element.pattern = /*#__PURE__*/function (_svg$Element$ElementB2) { - _inherits(_class15, _svg$Element$ElementB2); - - var _super14 = _createSuper(_class15); - - function _class15() { - _classCallCheck(this, _class15); - - return _super14.apply(this, arguments); - } - - _createClass(_class15, [{ - key: "createPattern", - value: function createPattern(ctx, element) { - var width = this.attribute('width').toPixels('x', true); - var height = this.attribute('height').toPixels('y', true); // render me using a temporary svg element - - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value); - tempSvg.attributes.width = new svg.Property('width', width + 'px'); - tempSvg.attributes.height = new svg.Property('height', height + 'px'); - tempSvg.attributes.transform = new svg.Property('transform', this.attribute('patternTransform').value); - tempSvg.children = this.children; - var c = document.createElement('canvas'); - c.width = width; - c.height = height; - var cctx = c.getContext('2d'); - - if (this.attribute('x').hasValue() && this.attribute('y').hasValue()) { - cctx.translate(this.attribute('x').toPixels('x', true), this.attribute('y').toPixels('y', true)); - } // render 3x3 grid so when we transform there's no white space on edges - - - for (var x = -1; x <= 1; x++) { - for (var y = -1; y <= 1; y++) { - cctx.save(); - cctx.translate(x * c.width, y * c.height); - tempSvg.render(cctx); - cctx.restore(); - } - } - - var pattern = ctx.createPattern(c, 'repeat'); - return pattern; - } - }]); - - return _class15; - }(svg.Element.ElementBase); // marker element - - - svg.Element.marker = /*#__PURE__*/function (_svg$Element$ElementB3) { - _inherits(_class16, _svg$Element$ElementB3); - - var _super15 = _createSuper(_class16); - - function _class16() { - _classCallCheck(this, _class16); - - return _super15.apply(this, arguments); - } - - _createClass(_class16, [{ - key: "render", - value: function render(ctx, point, angle) { - ctx.translate(point.x, point.y); - if (this.attribute('orient').valueOrDefault('auto') === 'auto') ctx.rotate(angle); - if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(ctx.lineWidth, ctx.lineWidth); - ctx.save(); // render me using a temporary svg element - - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.viewBox = new svg.Property('viewBox', this.attribute('viewBox').value); - tempSvg.attributes.refX = new svg.Property('refX', this.attribute('refX').value); - tempSvg.attributes.refY = new svg.Property('refY', this.attribute('refY').value); - tempSvg.attributes.width = new svg.Property('width', this.attribute('markerWidth').value); - tempSvg.attributes.height = new svg.Property('height', this.attribute('markerHeight').value); - tempSvg.attributes.fill = new svg.Property('fill', this.attribute('fill').valueOrDefault('black')); - tempSvg.attributes.stroke = new svg.Property('stroke', this.attribute('stroke').valueOrDefault('none')); - tempSvg.children = this.children; - tempSvg.render(ctx); - ctx.restore(); - if (this.attribute('markerUnits').valueOrDefault('strokeWidth') === 'strokeWidth') ctx.scale(1 / ctx.lineWidth, 1 / ctx.lineWidth); - - if (this.attribute('orient').valueOrDefault('auto') === 'auto') { - ctx.rotate(-angle); - } - - ctx.translate(-point.x, -point.y); - } - }]); - - return _class16; - }(svg.Element.ElementBase); // definitions element - - - svg.Element.defs = /*#__PURE__*/function (_svg$Element$ElementB4) { - _inherits(_class17, _svg$Element$ElementB4); - - var _super16 = _createSuper(_class17); - - function _class17() { - _classCallCheck(this, _class17); - - return _super16.apply(this, arguments); - } - - _createClass(_class17, [{ - key: "render", - value: function render(ctx) {// NOOP - } - }]); - - return _class17; - }(svg.Element.ElementBase); // base for gradients - - - svg.Element.GradientBase = /*#__PURE__*/function (_svg$Element$ElementB5) { - _inherits(_class18, _svg$Element$ElementB5); - - var _super17 = _createSuper(_class18); - - function _class18(node) { - var _this10; - - _classCallCheck(this, _class18); - - _this10 = _super17.call(this, node); - _this10.gradientUnits = _this10.attribute('gradientUnits').valueOrDefault('objectBoundingBox'); - _this10.stops = []; - - _this10.children.forEach(function (child) { - if (child.type === 'stop') { - _this10.stops.push(child); - } - }); - - return _this10; - } - - _createClass(_class18, [{ - key: "getGradient", - value: function getGradient() {// OVERRIDE ME! - } - }, { - key: "createGradient", - value: function createGradient(ctx, element, parentOpacityProp) { - var stopsContainer = this.getHrefAttribute().hasValue() ? this.getHrefAttribute().getDefinition() : this; - - var addParentOpacity = function addParentOpacity(color) { - if (parentOpacityProp.hasValue()) { - var p = new svg.Property('color', color); - return p.addOpacity(parentOpacityProp).value; - } - - return color; - }; - - var g = this.getGradient(ctx, element); - if (isNullish(g)) return addParentOpacity(stopsContainer.stops[stopsContainer.stops.length - 1].color); - stopsContainer.stops.forEach(function (_ref10) { - var offset = _ref10.offset, - color = _ref10.color; - g.addColorStop(offset, addParentOpacity(color)); - }); - - if (this.attribute('gradientTransform').hasValue()) { - // render as transformed pattern on temporary canvas - var rootView = svg.ViewPort.viewPorts[0]; - var rect = new svg.Element.rect(); - rect.attributes.x = new svg.Property('x', -svg.MAX_VIRTUAL_PIXELS / 3.0); - rect.attributes.y = new svg.Property('y', -svg.MAX_VIRTUAL_PIXELS / 3.0); - rect.attributes.width = new svg.Property('width', svg.MAX_VIRTUAL_PIXELS); - rect.attributes.height = new svg.Property('height', svg.MAX_VIRTUAL_PIXELS); - var group = new svg.Element.g(); - group.attributes.transform = new svg.Property('transform', this.attribute('gradientTransform').value); - group.children = [rect]; - var tempSvg = new svg.Element.svg(); - tempSvg.attributes.x = new svg.Property('x', 0); - tempSvg.attributes.y = new svg.Property('y', 0); - tempSvg.attributes.width = new svg.Property('width', rootView.width); - tempSvg.attributes.height = new svg.Property('height', rootView.height); - tempSvg.children = [group]; - var c = document.createElement('canvas'); - c.width = rootView.width; - c.height = rootView.height; - var tempCtx = c.getContext('2d'); - tempCtx.fillStyle = g; - tempSvg.render(tempCtx); - return tempCtx.createPattern(c, 'no-repeat'); - } - - return g; - } - }]); - - return _class18; - }(svg.Element.ElementBase); // linear gradient element - - - svg.Element.linearGradient = /*#__PURE__*/function (_svg$Element$Gradient) { - _inherits(_class19, _svg$Element$Gradient); - - var _super18 = _createSuper(_class19); - - function _class19() { - _classCallCheck(this, _class19); - - return _super18.apply(this, arguments); - } - - _createClass(_class19, [{ - key: "getGradient", - value: function getGradient(ctx, element) { - var useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox; - var bb = useBB ? element.getBoundingBox() : null; - - if (!this.attribute('x1').hasValue() && !this.attribute('y1').hasValue() && !this.attribute('x2').hasValue() && !this.attribute('y2').hasValue()) { - this.attribute('x1', true).value = 0; - this.attribute('y1', true).value = 0; - this.attribute('x2', true).value = 1; - this.attribute('y2', true).value = 0; - } - - var x1 = useBB ? bb.x() + bb.width() * this.attribute('x1').numValue() : this.attribute('x1').toPixels('x'); - var y1 = useBB ? bb.y() + bb.height() * this.attribute('y1').numValue() : this.attribute('y1').toPixels('y'); - var x2 = useBB ? bb.x() + bb.width() * this.attribute('x2').numValue() : this.attribute('x2').toPixels('x'); - var y2 = useBB ? bb.y() + bb.height() * this.attribute('y2').numValue() : this.attribute('y2').toPixels('y'); - if (x1 === x2 && y1 === y2) return null; - return ctx.createLinearGradient(x1, y1, x2, y2); - } - }]); - - return _class19; - }(svg.Element.GradientBase); // radial gradient element - - - svg.Element.radialGradient = /*#__PURE__*/function (_svg$Element$Gradient2) { - _inherits(_class20, _svg$Element$Gradient2); - - var _super19 = _createSuper(_class20); - - function _class20() { - _classCallCheck(this, _class20); - - return _super19.apply(this, arguments); - } - - _createClass(_class20, [{ - key: "getGradient", - value: function getGradient(ctx, element) { - var useBB = this.gradientUnits === 'objectBoundingBox' && element.getBoundingBox; - var bb = useBB ? element.getBoundingBox() : null; - if (!this.attribute('cx').hasValue()) this.attribute('cx', true).value = '50%'; - if (!this.attribute('cy').hasValue()) this.attribute('cy', true).value = '50%'; - if (!this.attribute('r').hasValue()) this.attribute('r', true).value = '50%'; - var cx = useBB ? bb.x() + bb.width() * this.attribute('cx').numValue() : this.attribute('cx').toPixels('x'); - var cy = useBB ? bb.y() + bb.height() * this.attribute('cy').numValue() : this.attribute('cy').toPixels('y'); - var fx = cx; - var fy = cy; - - if (this.attribute('fx').hasValue()) { - fx = useBB ? bb.x() + bb.width() * this.attribute('fx').numValue() : this.attribute('fx').toPixels('x'); - } - - if (this.attribute('fy').hasValue()) { - fy = useBB ? bb.y() + bb.height() * this.attribute('fy').numValue() : this.attribute('fy').toPixels('y'); - } - - var r = useBB ? (bb.width() + bb.height()) / 2.0 * this.attribute('r').numValue() : this.attribute('r').toPixels(); - return ctx.createRadialGradient(fx, fy, 0, cx, cy, r); - } - }]); - - return _class20; - }(svg.Element.GradientBase); // gradient stop element - - - svg.Element.stop = /*#__PURE__*/function (_svg$Element$ElementB6) { - _inherits(_class21, _svg$Element$ElementB6); - - var _super20 = _createSuper(_class21); - - function _class21(node) { - var _this11; - - _classCallCheck(this, _class21); - - _this11 = _super20.call(this, node); - _this11.offset = _this11.attribute('offset').numValue(); - if (_this11.offset < 0) _this11.offset = 0; - if (_this11.offset > 1) _this11.offset = 1; - - var stopColor = _this11.style('stop-color'); - - if (_this11.style('stop-opacity').hasValue()) { - stopColor = stopColor.addOpacity(_this11.style('stop-opacity')); - } - - _this11.color = stopColor.value; - return _this11; - } - - return _class21; - }(svg.Element.ElementBase); // animation base element - - - svg.Element.AnimateBase = /*#__PURE__*/function (_svg$Element$ElementB7) { - _inherits(_class22, _svg$Element$ElementB7); - - var _super21 = _createSuper(_class22); - - function _class22(node) { - var _this12; - - _classCallCheck(this, _class22); - - _this12 = _super21.call(this, node); - svg.Animations.push(_assertThisInitialized(_this12)); - _this12.duration = 0.0; - _this12.begin = _this12.attribute('begin').toMilliseconds(); - _this12.maxDuration = _this12.begin + _this12.attribute('dur').toMilliseconds(); - _this12.initialValue = null; - _this12.initialUnits = ''; - _this12.removed = false; - _this12.from = _this12.attribute('from'); - _this12.to = _this12.attribute('to'); - _this12.values = _this12.attribute('values'); - if (_this12.values.hasValue()) _this12.values.value = _this12.values.value.split(';'); - return _this12; - } - - _createClass(_class22, [{ - key: "getProperty", - value: function getProperty() { - var attributeType = this.attribute('attributeType').value; - var attributeName = this.attribute('attributeName').value; - - if (attributeType === 'CSS') { - return this.parent.style(attributeName, true); - } - - return this.parent.attribute(attributeName, true); - } - }, { - key: "calcValue", - value: function calcValue() { - // OVERRIDE ME! - return ''; - } - }, { - key: "update", - value: function update(delta) { - // set initial value - if (isNullish(this.initialValue)) { - this.initialValue = this.getProperty().value; - this.initialUnits = this.getProperty().getUnits(); - } // if we're past the end time - - - if (this.duration > this.maxDuration) { - // loop for indefinitely repeating animations - if (this.attribute('repeatCount').value === 'indefinite' || this.attribute('repeatDur').value === 'indefinite') { - this.duration = 0.0; - } else if (this.attribute('fill').valueOrDefault('remove') === 'freeze' && !this.frozen) { - this.frozen = true; - this.parent.animationFrozen = true; - this.parent.animationFrozenValue = this.getProperty().value; - } else if (this.attribute('fill').valueOrDefault('remove') === 'remove' && !this.removed) { - this.removed = true; - this.getProperty().value = this.parent.animationFrozen ? this.parent.animationFrozenValue : this.initialValue; - return true; - } - - return false; - } - - this.duration += delta; // if we're past the begin time - - var updated = false; - - if (this.begin < this.duration) { - var newValue = this.calcValue(); // tween - - if (this.attribute('type').hasValue()) { - // for transform, etc. - var type = this.attribute('type').value; - newValue = type + '(' + newValue + ')'; - } - - this.getProperty().value = newValue; - updated = true; - } - - return updated; - } // fraction of duration we've covered - - }, { - key: "progress", - value: function progress() { - var ret = { - progress: (this.duration - this.begin) / (this.maxDuration - this.begin) - }; - - if (this.values.hasValue()) { - var p = ret.progress * (this.values.value.length - 1); - var lb = Math.floor(p), - ub = Math.ceil(p); - ret.from = new svg.Property('from', Number.parseFloat(this.values.value[lb])); - ret.to = new svg.Property('to', Number.parseFloat(this.values.value[ub])); - ret.progress = (p - lb) / (ub - lb); - } else { - ret.from = this.from; - ret.to = this.to; - } - - return ret; - } - }]); - - return _class22; - }(svg.Element.ElementBase); // animate element - - - svg.Element.animate = /*#__PURE__*/function (_svg$Element$AnimateB) { - _inherits(_class23, _svg$Element$AnimateB); - - var _super22 = _createSuper(_class23); - - function _class23() { - _classCallCheck(this, _class23); - - return _super22.apply(this, arguments); - } - - _createClass(_class23, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); // tween value linearly - - var newValue = p.from.numValue() + (p.to.numValue() - p.from.numValue()) * p.progress; - return newValue + this.initialUnits; - } - }]); - - return _class23; - }(svg.Element.AnimateBase); // animate color element - - - svg.Element.animateColor = /*#__PURE__*/function (_svg$Element$AnimateB2) { - _inherits(_class24, _svg$Element$AnimateB2); - - var _super23 = _createSuper(_class24); - - function _class24() { - _classCallCheck(this, _class24); - - return _super23.apply(this, arguments); - } - - _createClass(_class24, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); - var from = new RGBColor(p.from.value); - var to = new RGBColor(p.to.value); - - if (from.ok && to.ok) { - // tween color linearly - var r = from.r + (to.r - from.r) * p.progress; - var g = from.g + (to.g - from.g) * p.progress; - var b = from.b + (to.b - from.b) * p.progress; - return 'rgb(' + Number.parseInt(r) + ',' + Number.parseInt(g) + ',' + Number.parseInt(b) + ')'; - } - - return this.attribute('from').value; - } - }]); - - return _class24; - }(svg.Element.AnimateBase); // animate transform element - - - svg.Element.animateTransform = /*#__PURE__*/function (_svg$Element$animate) { - _inherits(_class25, _svg$Element$animate); - - var _super24 = _createSuper(_class25); - - function _class25() { - _classCallCheck(this, _class25); - - return _super24.apply(this, arguments); - } - - _createClass(_class25, [{ - key: "calcValue", - value: function calcValue() { - var p = this.progress(); // tween value linearly - - var from = svg.ToNumberArray(p.from.value); - var to = svg.ToNumberArray(p.to.value); - var newValue = ''; - from.forEach(function (fr, i) { - newValue += fr + (to[i] - fr) * p.progress + ' '; - }); - return newValue; - } - }]); - - return _class25; - }(svg.Element.animate); // font element - - - svg.Element.font = /*#__PURE__*/function (_svg$Element$ElementB8) { - _inherits(_class26, _svg$Element$ElementB8); - - var _super25 = _createSuper(_class26); - - function _class26(node) { - var _this13; - - _classCallCheck(this, _class26); - - _this13 = _super25.call(this, node); - _this13.horizAdvX = _this13.attribute('horiz-adv-x').numValue(); - _this13.isRTL = false; - _this13.isArabic = false; - _this13.fontFace = null; - _this13.missingGlyph = null; - _this13.glyphs = []; - - _this13.children.forEach(function (child) { - if (child.type === 'font-face') { - _this13.fontFace = child; - - if (child.style('font-family').hasValue()) { - svg.Definitions[child.style('font-family').value] = _assertThisInitialized(_this13); - } - } else if (child.type === 'missing-glyph') { - _this13.missingGlyph = child; - } else if (child.type === 'glyph') { - if (child.arabicForm !== '') { - _this13.isRTL = true; - _this13.isArabic = true; - - if (typeof _this13.glyphs[child.unicode] === 'undefined') { - _this13.glyphs[child.unicode] = []; - } - - _this13.glyphs[child.unicode][child.arabicForm] = child; - } else { - _this13.glyphs[child.unicode] = child; - } - } - }); - - return _this13; - } - - return _class26; - }(svg.Element.ElementBase); // font-face element - - - svg.Element.fontface = /*#__PURE__*/function (_svg$Element$ElementB9) { - _inherits(_class27, _svg$Element$ElementB9); - - var _super26 = _createSuper(_class27); - - function _class27(node) { - var _this14; - - _classCallCheck(this, _class27); - - _this14 = _super26.call(this, node); - _this14.ascent = _this14.attribute('ascent').value; - _this14.descent = _this14.attribute('descent').value; - _this14.unitsPerEm = _this14.attribute('units-per-em').numValue(); - return _this14; - } - - return _class27; - }(svg.Element.ElementBase); // missing-glyph element - - - svg.Element.missingglyph = /*#__PURE__*/function (_svg$Element$path) { - _inherits(_class28, _svg$Element$path); - - var _super27 = _createSuper(_class28); - - function _class28(node) { - var _this15; - - _classCallCheck(this, _class28); - - _this15 = _super27.call(this, node); - _this15.horizAdvX = 0; - return _this15; - } - - return _class28; - }(svg.Element.path); // glyph element - - - svg.Element.glyph = /*#__PURE__*/function (_svg$Element$path2) { - _inherits(_class29, _svg$Element$path2); - - var _super28 = _createSuper(_class29); - - function _class29(node) { - var _this16; - - _classCallCheck(this, _class29); - - _this16 = _super28.call(this, node); - _this16.horizAdvX = _this16.attribute('horiz-adv-x').numValue(); - _this16.unicode = _this16.attribute('unicode').value; - _this16.arabicForm = _this16.attribute('arabic-form').value; - return _this16; - } - - return _class29; - }(svg.Element.path); // text element - - - svg.Element.text = /*#__PURE__*/function (_svg$Element$Rendered3) { - _inherits(_class30, _svg$Element$Rendered3); - - var _super29 = _createSuper(_class30); - - function _class30(node) { - _classCallCheck(this, _class30); - - return _super29.call(this, node, true); - } - - _createClass(_class30, [{ - key: "setContext", - value: function setContext(ctx) { - _get(_getPrototypeOf(_class30.prototype), "setContext", this).call(this, ctx); - - var textBaseline = this.style('dominant-baseline').toTextBaseline(); - if (isNullish(textBaseline)) textBaseline = this.style('alignment-baseline').toTextBaseline(); - if (!isNullish(textBaseline)) ctx.textBaseline = textBaseline; - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - return new svg.BoundingBox(x, y - fontSize, x + Math.floor(fontSize * 2.0 / 3.0) * this.children[0].getText().length, y); - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var _this17 = this; - - this.x = this.attribute('x').toPixels('x'); - this.y = this.attribute('y').toPixels('y'); - this.x += this.getAnchorDelta(ctx, this, 0); - this.children.forEach(function (child, i) { - _this17.renderChild(ctx, _this17, i); - }); - } - }, { - key: "getAnchorDelta", - value: function getAnchorDelta(ctx, parent, startI) { - var textAnchor = this.style('text-anchor').valueOrDefault('start'); - - if (textAnchor !== 'start') { - var width = 0; - - for (var i = startI; i < parent.children.length; i++) { - var child = parent.children[i]; - if (i > startI && child.attribute('x').hasValue()) break; // new group - - width += child.measureTextRecursive(ctx); - } - - return -1 * (textAnchor === 'end' ? width : width / 2.0); - } - - return 0; - } - }, { - key: "renderChild", - value: function renderChild(ctx, parent, i) { - var child = parent.children[i]; - - if (child.attribute('x').hasValue()) { - child.x = child.attribute('x').toPixels('x') + this.getAnchorDelta(ctx, parent, i); - if (child.attribute('dx').hasValue()) child.x += child.attribute('dx').toPixels('x'); - } else { - if (this.attribute('dx').hasValue()) this.x += this.attribute('dx').toPixels('x'); - if (child.attribute('dx').hasValue()) this.x += child.attribute('dx').toPixels('x'); - child.x = this.x; - } - - this.x = child.x + child.measureText(ctx); - - if (child.attribute('y').hasValue()) { - child.y = child.attribute('y').toPixels('y'); - if (child.attribute('dy').hasValue()) child.y += child.attribute('dy').toPixels('y'); - } else { - if (this.attribute('dy').hasValue()) this.y += this.attribute('dy').toPixels('y'); - if (child.attribute('dy').hasValue()) this.y += child.attribute('dy').toPixels('y'); - child.y = this.y; - } - - this.y = child.y; - child.render(ctx); - - for (var j = 0; j < child.children.length; j++) { - this.renderChild(ctx, child, j); - } - } - }]); - - return _class30; - }(svg.Element.RenderedElementBase); // text base - - - svg.Element.TextElementBase = /*#__PURE__*/function (_svg$Element$Rendered4) { - _inherits(_class31, _svg$Element$Rendered4); - - var _super30 = _createSuper(_class31); - - function _class31() { - _classCallCheck(this, _class31); - - return _super30.apply(this, arguments); - } - - _createClass(_class31, [{ - key: "getGlyph", - value: function getGlyph(font, text, i) { - var c = text[i]; - var glyph = null; - - if (font.isArabic) { - var arabicForm = 'isolated'; - if ((i === 0 || text[i - 1] === ' ') && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'terminal'; - if (i > 0 && text[i - 1] !== ' ' && i < text.length - 2 && text[i + 1] !== ' ') arabicForm = 'medial'; - if (i > 0 && text[i - 1] !== ' ' && (i === text.length - 1 || text[i + 1] === ' ')) arabicForm = 'initial'; - - if (typeof font.glyphs[c] !== 'undefined') { - glyph = font.glyphs[c][arabicForm]; - if (isNullish(glyph) && font.glyphs[c].type === 'glyph') glyph = font.glyphs[c]; - } - } else { - glyph = font.glyphs[c]; - } - - if (isNullish(glyph)) glyph = font.missingGlyph; - return glyph; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var customFont = this.parent.style('font-family').getDefinition(); - - if (!isNullish(customFont)) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var fontStyle = this.parent.style('font-style').valueOrDefault(svg.Font.Parse(svg.ctx.font).fontStyle); - var text = this.getText(); - if (customFont.isRTL) text = text.split('').reverse().join(''); - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - - for (var i = 0; i < text.length; i++) { - var glyph = this.getGlyph(customFont, text, i); - var scale = fontSize / customFont.fontFace.unitsPerEm; - ctx.translate(this.x, this.y); - ctx.scale(scale, -scale); - var lw = ctx.lineWidth; - ctx.lineWidth = ctx.lineWidth * customFont.fontFace.unitsPerEm / fontSize; - if (fontStyle === 'italic') ctx.transform(1, 0, 0.4, 1, 0, 0); - glyph.render(ctx); - if (fontStyle === 'italic') ctx.transform(1, 0, -0.4, 1, 0, 0); - ctx.lineWidth = lw; - ctx.scale(1 / scale, -1 / scale); - ctx.translate(-this.x, -this.y); - this.x += fontSize * (glyph.horizAdvX || customFont.horizAdvX) / customFont.fontFace.unitsPerEm; - - if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) { - this.x += dx[i]; - } - } - - return; - } - - if (ctx.fillStyle !== '') ctx.fillText(svg.compressSpaces(this.getText()), this.x, this.y); - if (ctx.strokeStyle !== '') ctx.strokeText(svg.compressSpaces(this.getText()), this.x, this.y); - } - }, { - key: "getText", - value: function getText() {// OVERRIDE ME - } - }, { - key: "measureTextRecursive", - value: function measureTextRecursive(ctx) { - var width = this.measureText(ctx); - this.children.forEach(function (child) { - width += child.measureTextRecursive(ctx); - }); - return width; - } - }, { - key: "measureText", - value: function measureText(ctx) { - var customFont = this.parent.style('font-family').getDefinition(); - - if (!isNullish(customFont)) { - var fontSize = this.parent.style('font-size').numValueOrDefault(svg.Font.Parse(svg.ctx.font).fontSize); - var measure = 0; - var text = this.getText(); - if (customFont.isRTL) text = text.split('').reverse().join(''); - var dx = svg.ToNumberArray(this.parent.attribute('dx').value); - - for (var i = 0; i < text.length; i++) { - var glyph = this.getGlyph(customFont, text, i); - measure += (glyph.horizAdvX || customFont.horizAdvX) * fontSize / customFont.fontFace.unitsPerEm; - - if (typeof dx[i] !== 'undefined' && !isNaN(dx[i])) { - measure += dx[i]; - } - } - - return measure; - } - - var textToMeasure = svg.compressSpaces(this.getText()); - if (!ctx.measureText) return textToMeasure.length * 10; - ctx.save(); - this.setContext(ctx); - - var _ctx$measureText = ctx.measureText(textToMeasure), - width = _ctx$measureText.width; - - ctx.restore(); - return width; - } - }]); - - return _class31; - }(svg.Element.RenderedElementBase); // tspan - - - svg.Element.tspan = /*#__PURE__*/function (_svg$Element$TextElem) { - _inherits(_class32, _svg$Element$TextElem); - - var _super31 = _createSuper(_class32); - - function _class32(node) { - var _this18; - - _classCallCheck(this, _class32); - - _this18 = _super31.call(this, node, true); - _this18.text = node.nodeValue || node.text || ''; - return _this18; - } - - _createClass(_class32, [{ - key: "getText", - value: function getText() { - return this.text; - } - }]); - - return _class32; - }(svg.Element.TextElementBase); // tref - - - svg.Element.tref = /*#__PURE__*/function (_svg$Element$TextElem2) { - _inherits(_class33, _svg$Element$TextElem2); - - var _super32 = _createSuper(_class33); - - function _class33() { - _classCallCheck(this, _class33); - - return _super32.apply(this, arguments); - } - - _createClass(_class33, [{ - key: "getText", - value: function getText() { - var element = this.getHrefAttribute().getDefinition(); - if (!isNullish(element)) return element.children[0].getText(); - return undefined; - } - }]); - - return _class33; - }(svg.Element.TextElementBase); // a element - - - svg.Element.a = /*#__PURE__*/function (_svg$Element$TextElem3) { - _inherits(_class34, _svg$Element$TextElem3); - - var _super33 = _createSuper(_class34); - - function _class34(node) { - var _this19; - - _classCallCheck(this, _class34); - - _this19 = _super33.call(this, node); - _this19.hasText = true; - - _toConsumableArray(node.childNodes).forEach(function (childNode) { - if (childNode.nodeType !== 3) { - _this19.hasText = false; - } - }); // this might contain text - - - _this19.text = _this19.hasText ? node.childNodes[0].nodeValue : ''; - return _this19; - } - - _createClass(_class34, [{ - key: "getText", - value: function getText() { - return this.text; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - if (this.hasText) { - // render as text element - _get(_getPrototypeOf(_class34.prototype), "renderChildren", this).call(this, ctx); - - var fontSize = new svg.Property('fontSize', svg.Font.Parse(svg.ctx.font).fontSize); - svg.Mouse.checkBoundingBox(this, new svg.BoundingBox(this.x, this.y - fontSize.toPixels('y'), this.x + this.measureText(ctx), this.y)); - } else { - // render as temporary group - var g = new svg.Element.g(); - g.children = this.children; - g.parent = this; - g.render(ctx); - } - } - }, { - key: "onclick", - value: function onclick() { - window.open(this.getHrefAttribute().value); - } - }, { - key: "onmousemove", - value: function onmousemove() { - svg.ctx.canvas.style.cursor = 'pointer'; - } - }]); - - return _class34; - }(svg.Element.TextElementBase); // image element - - - svg.Element.image = /*#__PURE__*/function (_svg$Element$Rendered5) { - _inherits(_class35, _svg$Element$Rendered5); - - var _super34 = _createSuper(_class35); - - function _class35(node) { - var _this20; - - _classCallCheck(this, _class35); - - _this20 = _super34.call(this, node); - - var href = _this20.getHrefAttribute().value; - - if (href === '') { - return _possibleConstructorReturn(_this20); - } - - _this20._isSvg = href.match(/\.svg$/); - svg.Images.push(_assertThisInitialized(_this20)); - _this20.loaded = false; - - if (!_this20._isSvg) { - _this20.img = document.createElement('img'); - - if (svg.opts.useCORS === true) { - _this20.img.crossOrigin = 'Anonymous'; - } - - _this20.img.addEventListener('load', function () { - _this20.loaded = true; - }); - - _this20.img.addEventListener('error', function () { - svg.log('ERROR: image "' + href + '" not found'); - _this20.loaded = true; - }); - - _this20.img.src = href; - } else { - svg.ajax(href, true).then(function (img) { - // eslint-disable-line promise/prefer-await-to-then, promise/always-return - _this20.img = img; - _this20.loaded = true; - })["catch"](function (err) { - // eslint-disable-line promise/prefer-await-to-callbacks - _this20.erred = true; - console.error('Ajax error for canvg', err); // eslint-disable-line no-console - }); - } - - return _this20; - } - - _createClass(_class35, [{ - key: "renderChildren", - value: function renderChildren(ctx) { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - if (width === 0 || height === 0) return; - ctx.save(); - - if (this._isSvg) { - ctx.drawSvg(this.img, x, y, width, height); - } else { - ctx.translate(x, y); - svg.AspectRatio(ctx, this.attribute('preserveAspectRatio').value, width, this.img.width, height, this.img.height, 0, 0); - ctx.drawImage(this.img, 0, 0); - } - - ctx.restore(); - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - return new svg.BoundingBox(x, y, x + width, y + height); - } - }]); - - return _class35; - }(svg.Element.RenderedElementBase); // group element - - - svg.Element.g = /*#__PURE__*/function (_svg$Element$Rendered6) { - _inherits(_class36, _svg$Element$Rendered6); - - var _super35 = _createSuper(_class36); - - function _class36() { - _classCallCheck(this, _class36); - - return _super35.apply(this, arguments); - } - - _createClass(_class36, [{ - key: "getBoundingBox", - value: function getBoundingBox() { - var bb = new svg.BoundingBox(); - this.children.forEach(function (child) { - bb.addBoundingBox(child.getBoundingBox()); - }); - return bb; - } - }]); - - return _class36; - }(svg.Element.RenderedElementBase); // symbol element - - - svg.Element.symbol = /*#__PURE__*/function (_svg$Element$Rendered7) { - _inherits(_class37, _svg$Element$Rendered7); - - var _super36 = _createSuper(_class37); - - function _class37() { - _classCallCheck(this, _class37); - - return _super36.apply(this, arguments); - } - - _createClass(_class37, [{ - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class37; - }(svg.Element.RenderedElementBase); // style element - - - svg.Element.style = /*#__PURE__*/function (_svg$Element$ElementB10) { - _inherits(_class38, _svg$Element$ElementB10); - - var _super37 = _createSuper(_class38); - - function _class38(node) { - var _this21; - - _classCallCheck(this, _class38); - - _this21 = _super37.call(this, node); // text, or spaces then CDATA - - var css = ''; - - _toConsumableArray(node.childNodes).forEach(function (_ref11) { - var nodeValue = _ref11.nodeValue; - css += nodeValue; - }); // remove comments - - - css = css.replace(/(\/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+\/)|(^\s*\/\/.*)/gm, ''); // eslint-disable-line unicorn/no-unsafe-regex - // replace whitespace - - css = svg.compressSpaces(css); - var cssDefs = css.split('}'); - cssDefs.forEach(function (cssDef) { - if (svg.trim(cssDef) !== '') { - var _cssDef$split = cssDef.split('{'), - _cssDef$split2 = _slicedToArray(_cssDef$split, 2), - cssClasses = _cssDef$split2[0], - cssProps = _cssDef$split2[1]; - - cssClasses = cssClasses.split(','); - cssProps = cssProps.split(';'); - cssClasses.forEach(function (cssClass) { - cssClass = svg.trim(cssClass); - - if (cssClass !== '') { - var props = {}; - cssProps.forEach(function (cssProp) { - var prop = cssProp.indexOf(':'); - var name = cssProp.substr(0, prop); - var value = cssProp.substr(prop + 1, cssProp.length - prop); - - if (!isNullish(name) && !isNullish(value)) { - props[svg.trim(name)] = new svg.Property(svg.trim(name), svg.trim(value)); - } - }); - svg.Styles[cssClass] = props; - - if (cssClass === '@font-face') { - var fontFamily = props['font-family'].value.replace(/"/g, ''); - var srcs = props.src.value.split(','); - srcs.forEach(function (src) { - if (src.includes('format("svg")')) { - var urlStart = src.indexOf('url'); - var urlEnd = src.indexOf(')', urlStart); - var url = src.substr(urlStart + 5, urlEnd - urlStart - 6); // Can this ajax safely be converted to async? - - var doc = svg.parseXml(svg.ajax(url)); - var fonts = doc.getElementsByTagName('font'); - - _toConsumableArray(fonts).forEach(function (font) { - font = svg.CreateElement(font); - svg.Definitions[fontFamily] = font; - }); - } - }); - } - } - }); - } - }); - return _this21; - } - - return _class38; - }(svg.Element.ElementBase); // use element - - - svg.Element.use = /*#__PURE__*/function (_svg$Element$Rendered8) { - _inherits(_class39, _svg$Element$Rendered8); - - var _super38 = _createSuper(_class39); - - function _class39(node) { - var _this22; - - _classCallCheck(this, _class39); - - _this22 = _super38.call(this, node); - _this22._el = _this22.getHrefAttribute().getDefinition(); - return _this22; - } - - _createClass(_class39, [{ - key: "setContext", - value: function setContext(ctx) { - _get(_getPrototypeOf(_class39.prototype), "setContext", this).call(this, ctx); - - if (this.attribute('x').hasValue()) ctx.translate(this.attribute('x').toPixels('x'), 0); - if (this.attribute('y').hasValue()) ctx.translate(0, this.attribute('y').toPixels('y')); - } - }, { - key: "path", - value: function path(ctx) { - var element = this._el; - if (!isNullish(element)) element.path(ctx); - } - }, { - key: "getBoundingBox", - value: function getBoundingBox() { - var element = this._el; - if (!isNullish(element)) return element.getBoundingBox(); - return undefined; - } - }, { - key: "renderChildren", - value: function renderChildren(ctx) { - var element = this._el; - - if (!isNullish(element)) { - var tempSvg = element; - - if (element.type === 'symbol') { - // render me using a temporary svg element in symbol cases - // (https://www.w3.org/TR/SVG/struct.html#UseElement) - tempSvg = new svg.Element.svg(); - tempSvg.type = 'svg'; - tempSvg.attributes.viewBox = new svg.Property('viewBox', element.attribute('viewBox').value); - tempSvg.attributes.preserveAspectRatio = new svg.Property('preserveAspectRatio', element.attribute('preserveAspectRatio').value); - tempSvg.attributes.overflow = new svg.Property('overflow', element.attribute('overflow').value); - tempSvg.children = element.children; - } - - if (tempSvg.type === 'svg') { - // if symbol or svg, inherit width/height from me - if (this.attribute('width').hasValue()) { - tempSvg.attributes.width = new svg.Property('width', this.attribute('width').value); - } - - if (this.attribute('height').hasValue()) { - tempSvg.attributes.height = new svg.Property('height', this.attribute('height').value); - } - } - - var oldParent = tempSvg.parent; - tempSvg.parent = null; - tempSvg.render(ctx); - tempSvg.parent = oldParent; - } - } - }]); - - return _class39; - }(svg.Element.RenderedElementBase); // mask element - - - svg.Element.mask = /*#__PURE__*/function (_svg$Element$ElementB11) { - _inherits(_class40, _svg$Element$ElementB11); - - var _super39 = _createSuper(_class40); - - function _class40() { - _classCallCheck(this, _class40); - - return _super39.apply(this, arguments); - } - - _createClass(_class40, [{ - key: "apply", - value: function apply(ctx, element) { - // render as temp svg - var x = this.attribute('x').toPixels('x'); - var y = this.attribute('y').toPixels('y'); - var width = this.attribute('width').toPixels('x'); - var height = this.attribute('height').toPixels('y'); - - if (width === 0 && height === 0) { - var bb = new svg.BoundingBox(); - this.children.forEach(function (child) { - bb.addBoundingBox(child.getBoundingBox()); - }); - x = Math.floor(bb.x1); - y = Math.floor(bb.y1); - width = Math.floor(bb.width()); - height = Math.floor(bb.height()); - } // temporarily remove mask to avoid recursion - - - var mask = element.attribute('mask').value; - element.attribute('mask').value = ''; - var cMask = document.createElement('canvas'); - cMask.width = x + width; - cMask.height = y + height; - var maskCtx = cMask.getContext('2d'); - this.renderChildren(maskCtx); - var c = document.createElement('canvas'); - c.width = x + width; - c.height = y + height; - var tempCtx = c.getContext('2d'); - element.render(tempCtx); - tempCtx.globalCompositeOperation = 'destination-in'; - tempCtx.fillStyle = maskCtx.createPattern(cMask, 'no-repeat'); - tempCtx.fillRect(0, 0, x + width, y + height); - ctx.fillStyle = tempCtx.createPattern(c, 'no-repeat'); - ctx.fillRect(0, 0, x + width, y + height); // reassign mask - - element.attribute('mask').value = mask; - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class40; - }(svg.Element.ElementBase); // clip element - - - svg.Element.clipPath = /*#__PURE__*/function (_svg$Element$ElementB12) { - _inherits(_class41, _svg$Element$ElementB12); - - var _super40 = _createSuper(_class41); - - function _class41() { - _classCallCheck(this, _class41); - - return _super40.apply(this, arguments); - } - - _createClass(_class41, [{ - key: "apply", - value: function apply(ctx) { - this.children.forEach(function (child) { - if (typeof child.path !== 'undefined') { - var transform = null; - - if (child.attribute('transform').hasValue()) { - transform = new svg.Transform(child.attribute('transform').value); - transform.apply(ctx); - } - - child.path(ctx); - ctx.clip(); - - if (transform) { - transform.unapply(ctx); - } - } - }); - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class41; - }(svg.Element.ElementBase); // filters - - - svg.Element.filter = /*#__PURE__*/function (_svg$Element$ElementB13) { - _inherits(_class42, _svg$Element$ElementB13); - - var _super41 = _createSuper(_class42); - - function _class42() { - _classCallCheck(this, _class42); - - return _super41.apply(this, arguments); - } - - _createClass(_class42, [{ - key: "apply", - value: function apply(ctx, element) { - // render as temp svg - var bb = element.getBoundingBox(); - var x = Math.floor(bb.x1); - var y = Math.floor(bb.y1); - var width = Math.floor(bb.width()); - var height = Math.floor(bb.height()); // temporarily remove filter to avoid recursion - - var filter = element.style('filter').value; - element.style('filter').value = ''; - var px = 0, - py = 0; - this.children.forEach(function (child) { - var efd = child.extraFilterDistance || 0; - px = Math.max(px, efd); - py = Math.max(py, efd); - }); - var c = document.createElement('canvas'); - c.width = width + 2 * px; - c.height = height + 2 * py; - var tempCtx = c.getContext('2d'); - tempCtx.translate(-x + px, -y + py); - element.render(tempCtx); // apply filters - - this.children.forEach(function (child) { - child.apply(tempCtx, 0, 0, width + 2 * px, height + 2 * py); - }); // render on me - - ctx.drawImage(c, 0, 0, width + 2 * px, height + 2 * py, x - px, y - py, width + 2 * px, height + 2 * py); // reassign filter - - element.style('filter', true).value = filter; - } - }, { - key: "render", - value: function render(ctx) {// NO RENDER - } - }]); - - return _class42; - }(svg.Element.ElementBase); - - svg.Element.feMorphology = /*#__PURE__*/function (_svg$Element$ElementB14) { - _inherits(_class43, _svg$Element$ElementB14); - - var _super42 = _createSuper(_class43); - - function _class43() { - _classCallCheck(this, _class43); - - return _super42.apply(this, arguments); - } - - _createClass(_class43, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) {// TODO: implement - } - }]); - - return _class43; - }(svg.Element.ElementBase); - - svg.Element.feComposite = /*#__PURE__*/function (_svg$Element$ElementB15) { - _inherits(_class44, _svg$Element$ElementB15); - - var _super43 = _createSuper(_class44); - - function _class44() { - _classCallCheck(this, _class44); - - return _super43.apply(this, arguments); - } - - _createClass(_class44, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) {// TODO: implement - } - }]); - - return _class44; - }(svg.Element.ElementBase); - /** - * @param {Uint8ClampedArray} img - * @param {Integer} x - * @param {Integer} y - * @param {Float} width - * @param {Float} height - * @param {Integer} rgba - * @returns {Integer} - */ - - - function imGet(img, x, y, width, height, rgba) { - return img[y * width * 4 + x * 4 + rgba]; - } - /** - * @param {Uint8ClampedArray} img - * @param {Integer} x - * @param {Integer} y - * @param {Float} width - * @param {Float} height - * @param {Integer} rgba - * @param {Float} val - * @returns {void} - */ - - - function imSet(img, x, y, width, height, rgba, val) { - img[y * width * 4 + x * 4 + rgba] = val; - } - - svg.Element.feColorMatrix = /*#__PURE__*/function (_svg$Element$ElementB16) { - _inherits(_class45, _svg$Element$ElementB16); - - var _super44 = _createSuper(_class45); - - function _class45(node) { - var _this23; - - _classCallCheck(this, _class45); - - _this23 = _super44.call(this, node); - var matrix = svg.ToNumberArray(_this23.attribute('values').value); - - switch (_this23.attribute('type').valueOrDefault('matrix')) { - // https://www.w3.org/TR/SVG/filters.html#feColorMatrixElement - case 'saturate': - { - var s = matrix[0]; - matrix = [0.213 + 0.787 * s, 0.715 - 0.715 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 + 0.285 * s, 0.072 - 0.072 * s, 0, 0, 0.213 - 0.213 * s, 0.715 - 0.715 * s, 0.072 + 0.928 * s, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; - break; - } - - case 'hueRotate': - { - var a = matrix[0] * Math.PI / 180.0; - - var c = function c(m1, m2, m3) { - return m1 + Math.cos(a) * m2 + Math.sin(a) * m3; - }; - - matrix = [c(0.213, 0.787, -0.213), c(0.715, -0.715, -0.715), c(0.072, -0.072, 0.928), 0, 0, c(0.213, -0.213, 0.143), c(0.715, 0.285, 0.140), c(0.072, -0.072, -0.283), 0, 0, c(0.213, -0.213, -0.787), c(0.715, -0.715, 0.715), c(0.072, 0.928, 0.072), 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1]; - break; - } - - case 'luminanceToAlpha': - matrix = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0.2125, 0.7154, 0.0721, 0, 0, 0, 0, 0, 0, 1]; - break; - } - - _this23.matrix = matrix; - - _this23._m = function (i, v) { - var mi = matrix[i]; - return mi * (mi < 0 ? v - 255 : v); - }; - - return _this23; - } - - _createClass(_class45, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) { - var m = this._m; // assuming x==0 && y==0 for now - - var srcData = ctx.getImageData(0, 0, width, height); - - for (var _y = 0; _y < height; _y++) { - for (var _x = 0; _x < width; _x++) { - var r = imGet(srcData.data, _x, _y, width, height, 0); - var g = imGet(srcData.data, _x, _y, width, height, 1); - var b = imGet(srcData.data, _x, _y, width, height, 2); - var a = imGet(srcData.data, _x, _y, width, height, 3); - imSet(srcData.data, _x, _y, width, height, 0, m(0, r) + m(1, g) + m(2, b) + m(3, a) + m(4, 1)); - imSet(srcData.data, _x, _y, width, height, 1, m(5, r) + m(6, g) + m(7, b) + m(8, a) + m(9, 1)); - imSet(srcData.data, _x, _y, width, height, 2, m(10, r) + m(11, g) + m(12, b) + m(13, a) + m(14, 1)); - imSet(srcData.data, _x, _y, width, height, 3, m(15, r) + m(16, g) + m(17, b) + m(18, a) + m(19, 1)); - } - } - - ctx.clearRect(0, 0, width, height); - ctx.putImageData(srcData, 0, 0); - } - }]); - - return _class45; - }(svg.Element.ElementBase); - - svg.Element.feGaussianBlur = /*#__PURE__*/function (_svg$Element$ElementB17) { - _inherits(_class46, _svg$Element$ElementB17); - - var _super45 = _createSuper(_class46); - - function _class46(node) { - var _this24; - - _classCallCheck(this, _class46); - - _this24 = _super45.call(this, node); - _this24.blurRadius = Math.floor(_this24.attribute('stdDeviation').numValue()); - _this24.extraFilterDistance = _this24.blurRadius; - return _this24; - } - - _createClass(_class46, [{ - key: "apply", - value: function apply(ctx, x, y, width, height) { - // Todo: This might not be a problem anymore with out `instanceof` fix - // StackBlur requires canvas be on document - ctx.canvas.id = svg.UniqueId(); - ctx.canvas.style.display = 'none'; - document.body.append(ctx.canvas); - processCanvasRGBA(ctx.canvas, x, y, width, height, this.blurRadius); - ctx.canvas.remove(); - } - }]); - - return _class46; - }(svg.Element.ElementBase); // title element, do nothing - - - svg.Element.title = /*#__PURE__*/function (_svg$Element$ElementB18) { - _inherits(_class47, _svg$Element$ElementB18); - - var _super46 = _createSuper(_class47); - - function _class47(node) { - _classCallCheck(this, _class47); - - return _super46.call(this); - } - - return _class47; - }(svg.Element.ElementBase); // desc element, do nothing - - - svg.Element.desc = /*#__PURE__*/function (_svg$Element$ElementB19) { - _inherits(_class48, _svg$Element$ElementB19); - - var _super47 = _createSuper(_class48); - - function _class48(node) { - _classCallCheck(this, _class48); - - return _super47.call(this); - } - - return _class48; - }(svg.Element.ElementBase); - - svg.Element.MISSING = /*#__PURE__*/function (_svg$Element$ElementB20) { - _inherits(_class49, _svg$Element$ElementB20); - - var _super48 = _createSuper(_class49); - - function _class49(node) { - var _this25; - - _classCallCheck(this, _class49); - - _this25 = _super48.call(this); - svg.log('ERROR: Element \'' + node.nodeName + '\' not yet implemented.'); - return _this25; - } - - return _class49; - }(svg.Element.ElementBase); // element factory - - - svg.CreateElement = function (node) { - var className = node.nodeName.replace(/^[^:]+:/, '') // remove namespace - .replace(/-/g, ''); // remove dashes - - var e; - - if (typeof svg.Element[className] !== 'undefined') { - e = new svg.Element[className](node); - } else { - e = new svg.Element.MISSING(node); - } - - e.type = node.nodeName; - return e; - }; // load from url - - - svg.load = /*#__PURE__*/function () { - var _ref12 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(ctx, url) { - var dom; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - _context.next = 2; - return svg.ajax(url, true); - - case 2: - dom = _context.sent; - return _context.abrupt("return", svg.loadXml(ctx, dom)); - - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - })); - - return function (_x2, _x3) { - return _ref12.apply(this, arguments); - }; - }(); // load from xml - - - svg.loadXml = function (ctx, xml) { - return svg.loadXmlDoc(ctx, svg.parseXml(xml)); - }; - - svg.loadXmlDoc = function (ctx, dom) { - var res; - svg.init(ctx); - - var mapXY = function mapXY(p) { - var e = ctx.canvas; - - while (e) { - p.x -= e.offsetLeft; - p.y -= e.offsetTop; - e = e.offsetParent; - } - - if (window.scrollX) p.x += window.scrollX; - if (window.scrollY) p.y += window.scrollY; - return p; - }; // bind mouse - - - if (svg.opts.ignoreMouse !== true) { - ctx.canvas.addEventListener('click', function (e) { - var args = !isNullish(e) ? [e.clientX, e.clientY] : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals - - var _mapXY = mapXY(_construct(svg.Point, args)), - x = _mapXY.x, - y = _mapXY.y; - - svg.Mouse.onclick(x, y); - }); - ctx.canvas.addEventListener('mousemove', function (e) { - var args = !isNullish(e) ? [e.clientX, e.clientY] : [event.clientX, event.clientY]; // eslint-disable-line no-restricted-globals - - var _mapXY2 = mapXY(_construct(svg.Point, args)), - x = _mapXY2.x, - y = _mapXY2.y; - - svg.Mouse.onmousemove(x, y); - }); - } - - var e = svg.CreateElement(dom.documentElement); - e.root = true; // render loop - - var isFirstRender = true; - - var draw = function draw(resolve) { - svg.ViewPort.Clear(); - - if (ctx.canvas.parentNode) { - svg.ViewPort.SetCurrent(ctx.canvas.parentNode.clientWidth, ctx.canvas.parentNode.clientHeight); - } - - if (svg.opts.ignoreDimensions !== true) { - // set canvas size - if (e.style('width').hasValue()) { - ctx.canvas.width = e.style('width').toPixels('x'); - ctx.canvas.style.width = ctx.canvas.width + 'px'; - } - - if (e.style('height').hasValue()) { - ctx.canvas.height = e.style('height').toPixels('y'); - ctx.canvas.style.height = ctx.canvas.height + 'px'; - } - } - - var cWidth = ctx.canvas.clientWidth || ctx.canvas.width; - var cHeight = ctx.canvas.clientHeight || ctx.canvas.height; - - if (svg.opts.ignoreDimensions === true && e.style('width').hasValue() && e.style('height').hasValue()) { - cWidth = e.style('width').toPixels('x'); - cHeight = e.style('height').toPixels('y'); - } - - svg.ViewPort.SetCurrent(cWidth, cHeight); - - if (!isNullish(svg.opts.offsetX)) { - e.attribute('x', true).value = svg.opts.offsetX; - } - - if (!isNullish(svg.opts.offsetY)) { - e.attribute('y', true).value = svg.opts.offsetY; - } - - if (!isNullish(svg.opts.scaleWidth) || !isNullish(svg.opts.scaleHeight)) { - var viewBox = svg.ToNumberArray(e.attribute('viewBox').value); - var xRatio = null, - yRatio = null; - - if (!isNullish(svg.opts.scaleWidth)) { - if (e.attribute('width').hasValue()) { - xRatio = e.attribute('width').toPixels('x') / svg.opts.scaleWidth; - } else if (!isNaN(viewBox[2])) { - xRatio = viewBox[2] / svg.opts.scaleWidth; - } - } - - if (!isNullish(svg.opts.scaleHeight)) { - if (e.attribute('height').hasValue()) { - yRatio = e.attribute('height').toPixels('y') / svg.opts.scaleHeight; - } else if (!isNaN(viewBox[3])) { - yRatio = viewBox[3] / svg.opts.scaleHeight; - } - } - - if (isNullish(xRatio)) { - xRatio = yRatio; - } - - if (isNullish(yRatio)) { - yRatio = xRatio; - } - - e.attribute('width', true).value = svg.opts.scaleWidth; - e.attribute('height', true).value = svg.opts.scaleHeight; - e.attribute('viewBox', true).value = '0 0 ' + cWidth * xRatio + ' ' + cHeight * yRatio; - e.attribute('preserveAspectRatio', true).value = 'none'; - } // clear and render - - - if (svg.opts.ignoreClear !== true) { - ctx.clearRect(0, 0, cWidth, cHeight); - } - - e.render(ctx); - - if (isFirstRender) { - isFirstRender = false; - resolve(dom); - } - }; - - var waitingForImages = true; - svg.intervalID = setInterval(function () { - var needUpdate = false; - - if (waitingForImages && svg.ImagesLoaded()) { - waitingForImages = false; - needUpdate = true; - } // need update from mouse events? - - - if (svg.opts.ignoreMouse !== true) { - needUpdate = needUpdate || svg.Mouse.hasEvents(); - } // need update from animations? - - - if (svg.opts.ignoreAnimation !== true) { - svg.Animations.forEach(function (animation) { - var needAnimationUpdate = animation.update(1000 / svg.FRAMERATE); - needUpdate = needUpdate || needAnimationUpdate; - }); - } // need update from redraw? - - - if (typeof svg.opts.forceRedraw === 'function') { - if (svg.opts.forceRedraw() === true) { - needUpdate = true; - } - } // render if needed - - - if (needUpdate) { - draw(res); - svg.Mouse.runEvents(); // run and clear our events - } - }, 1000 / svg.FRAMERATE); // Todo: Replace with an image loading Promise utility? - // eslint-disable-next-line promise/avoid-new - - return new Promise(function (resolve, reject) { - if (svg.ImagesLoaded()) { - waitingForImages = false; - draw(resolve); + const + saveSvgAction = extPath + 'filesave.php', + saveImgAction = extPath + 'filesave.php'; + // Create upload target (hidden iframe) + + let cancelled = false; + + // Hiding by size instead of display to avoid FF console errors + // with `getBBox` in browser.js `supportsPathBBox_`) + $( + `<iframe name="output_frame" title="${strings.hiddenframe}" + style="width: 0; height: 0;" src="data:text/html;base64,PGh0bWw+"/>` + ).appendTo('body'); + svgEditor.setCustomHandlers({ + save (win, data) { + const svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data, // Firefox doesn't seem to know it is UTF-8 (no matter whether we use or skip the clientDownload code) despite the Content-Disposition header containing UTF-8, but adding the encoding works + filename = getFileNameFromTitle(); + + if (clientDownloadSupport(filename, '.svg', 'data:image/svg+xml;charset=UTF-8;base64,' + encode64(svg))) { return; } - res = resolve; - }); - }; + $('<form>').attr({ + method: 'post', + action: saveSvgAction, + target: 'output_frame' + }).append(` + <input type="hidden" name="output_svg" value="${xhtmlEscape(svg)}"> + <input type="hidden" name="filename" value="${xhtmlEscape(filename)}"> + `).appendTo('body') + .submit().remove(); + }, + exportPDF (win, data) { + const filename = getFileNameFromTitle(), + datauri = data.output; + if (clientDownloadSupport(filename, '.pdf', datauri)) { + return; + } + $('<form>').attr({ + method: 'post', + action: saveImgAction, + target: 'output_frame' + }).append(` + <input type="hidden" name="output_img" value="${datauri}"> + <input type="hidden" name="mime" value="application/pdf"> + <input type="hidden" name="filename" value="${xhtmlEscape(filename)}"> + `).appendTo('body') + .submit().remove(); + }, + // Todo: Integrate this extension with a new built-in exportWindowType, "download" + async exportImage (win, data) { + const {issues, mimeType, quality} = data; - svg.stop = function () { - if (svg.intervalID) { - clearInterval(svg.intervalID); + if (!$('#export_canvas').length) { + $('<canvas>', {id: 'export_canvas'}).hide().appendTo('body'); + } + const c = $('#export_canvas')[0]; + + c.width = svgCanvas.contentW; + c.height = svgCanvas.contentH; + await canvg(c, data.svg); + const datauri = quality ? c.toDataURL(mimeType, quality) : c.toDataURL(mimeType); + // {uiStrings} = svgEditor; + + // Check if there are issues + let pre, note = ''; + if (issues.length) { + pre = '\n \u2022 '; // Bullet + note += ('\n\n' + pre + issues.join(pre)); + } + + if (note.length) { + await $.alert(note); + } + + const filename = getFileNameFromTitle(); + const suffix = '.' + data.type.toLowerCase(); + + if (clientDownloadSupport(filename, suffix, datauri)) { + return; + } + + $('<form>').attr({ + method: 'post', + action: saveImgAction, + target: 'output_frame' + }).append(` + <input type="hidden" name="output_img" value="${datauri}"> + <input type="hidden" name="mime" value="${mimeType}"> + <input type="hidden" name="filename" value="${xhtmlEscape(filename)}"> + `).appendTo('body') + .submit().remove(); + } + }); + + // Do nothing if client support is found + if (window.FileReader && !avoidClientSideOpen) { return; } + + // Change these to appropriate script file + const openSvgAction = extPath + 'fileopen.php?type=load_svg'; + const importSvgAction = extPath + 'fileopen.php?type=import_svg'; + const importImgAction = extPath + 'fileopen.php?type=import_img'; + + // Set up function for PHP uploader to use + svgEditor.processFile = function (str64, type) { + let xmlstr; + if (cancelled) { + cancelled = false; + return; + } + + $('#dialog_box').hide(); + + if (type !== 'import_img') { + xmlstr = decode64(str64); + } + + switch (type) { + case 'load_svg': + svgCanvas.clear(); + svgCanvas.setSvgString(xmlstr); + svgEditor.updateCanvas(); + break; + case 'import_svg': + svgCanvas.importSvgString(xmlstr); + svgEditor.updateCanvas(); + break; + case 'import_img': + svgCanvas.setGoodImage(str64); + break; } }; - svg.Mouse = { - events: [], - hasEvents: function hasEvents() { - return this.events.length !== 0; - }, - onclick: function onclick(x, y) { - this.events.push({ - type: 'onclick', - x: x, - y: y, - run: function run(e) { - if (e.onclick) e.onclick(); - } - }); - }, - onmousemove: function onmousemove(x, y) { - this.events.push({ - type: 'onmousemove', - x: x, - y: y, - run: function run(e) { - if (e.onmousemove) e.onmousemove(); - } - }); - }, - eventElements: [], - checkPath: function checkPath(element, ctx) { - var _this26 = this; + // Create upload form + const openSvgForm = $('<form>'); + openSvgForm.attr({ + enctype: 'multipart/form-data', + method: 'post', + action: openSvgAction, + target: 'output_frame' + }); - this.events.forEach(function (_ref13, i) { - var x = _ref13.x, - y = _ref13.y; + // Create import form + const importSvgForm = openSvgForm.clone().attr('action', importSvgAction); - if (ctx.isPointInPath && ctx.isPointInPath(x, y)) { - _this26.eventElements[i] = element; - } - }); - }, - checkBoundingBox: function checkBoundingBox(element, bb) { - var _this27 = this; + // Create image form + const importImgForm = openSvgForm.clone().attr('action', importImgAction); - this.events.forEach(function (_ref14, i) { - var x = _ref14.x, - y = _ref14.y; + // It appears necessary to rebuild this input every time a file is + // selected so the same file can be picked and the change event can fire. - if (bb.isPointInBox(x, y)) { - _this27.eventElements[i] = element; - } - }); - }, - runEvents: function runEvents() { - var _this28 = this; + /** + * + * @param {external:jQuery} form + * @returns {void} + */ + function rebuildInput (form) { + form.empty(); + const inp = $('<input type="file" name="svg_file">').appendTo(form); - svg.ctx.canvas.style.cursor = ''; - this.events.forEach(function (e, i) { - var element = _this28.eventElements[i]; + /** + * Submit the form, empty its contents for reuse and show + * uploading message. + * @returns {Promise<void>} + */ + async function submit () { + // This submits the form, which returns the file data using `svgEditor.processFile()` + form.submit(); - while (element) { - e.run(element); - element = element.parent; - } - }); // done running, clear - - this.events = []; - this.eventElements = []; + rebuildInput(form); + await $.process_cancel(strings.uploading); + cancelled = true; + $('#dialog_box').hide(); } - }; - return svg; - } - if (typeof CanvasRenderingContext2D !== 'undefined') { - CanvasRenderingContext2D.prototype.drawSvg = function (s, dx, dy, dw, dh) { - canvg(this.canvas, s, { - ignoreMouse: true, - ignoreAnimation: true, - ignoreDimensions: true, - ignoreClear: true, - offsetX: dx, - offsetY: dy, - scaleWidth: dw, - scaleHeight: dh - }); - }; - } - - var extServer_opensave = { - name: 'server_opensave', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() { - var $, decode64, encode64, importLocale, strings, svgEditor, _svgEditor$curConfig, extPath, avoidClientSide, avoidClientSideDownload, avoidClientSideOpen, svgCanvas, getFileNameFromTitle, xhtmlEscape, clientDownloadSupport, saveSvgAction, saveImgAction, cancelled, openSvgAction, importSvgAction, importImgAction, openSvgForm, importSvgForm, importImgForm, rebuildInput; - - return regeneratorRuntime.wrap(function _callee5$(_context5) { - while (1) { - switch (_context5.prev = _context5.next) { - case 0: - rebuildInput = function _rebuildInput(form) { - form.empty(); - var inp = $('<input type="file" name="svg_file">').appendTo(form); - /** - * Submit the form, empty its contents for reuse and show - * uploading message. - * @returns {Promise<void>} - */ - - function submit() { - return _submit.apply(this, arguments); - } - - function _submit() { - _submit = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() { - return regeneratorRuntime.wrap(function _callee4$(_context4) { - while (1) { - switch (_context4.prev = _context4.next) { - case 0: - // This submits the form, which returns the file data using `svgEditor.processFile()` - form.submit(); - rebuildInput(form); - _context4.next = 4; - return $.process_cancel(strings.uploading); - - case 4: - cancelled = true; - $('#dialog_box').hide(); - - case 6: - case "end": - return _context4.stop(); - } - } - }, _callee4); - })); - return _submit.apply(this, arguments); - } - - if (form[0] === openSvgForm[0]) { - inp.change( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var ok; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - _context2.next = 2; - return svgEditor.openPrep(); - - case 2: - ok = _context2.sent; - - if (ok) { - _context2.next = 6; - break; - } - - rebuildInput(form); - return _context2.abrupt("return"); - - case 6: - _context2.next = 8; - return submit(); - - case 8: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))); - } else { - inp.change( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() { - return regeneratorRuntime.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - _context3.next = 2; - return submit(); - - case 2: - case "end": - return _context3.stop(); - } - } - }, _callee3); - }))); - } - }; - - clientDownloadSupport = function _clientDownloadSuppor(filename, suffix, uri) { - if (avoidClientSide || avoidClientSideDownload) { - return false; - } - - var support = $('<a>')[0].download === ''; - var a; - - if (support) { - a = $('<a>hidden</a>').attr({ - download: (filename || 'image') + suffix, - href: uri - }).css('display', 'none').appendTo('body'); - a[0].click(); - return true; - } - - return false; - }; - - xhtmlEscape = function _xhtmlEscape(str) { - return str.replace(/&(?!amp;)/g, '&').replace(/"/g, '"').replace(/</g, '<'); // < is actually disallowed above anyways - }; - - getFileNameFromTitle = function _getFileNameFromTitle() { - var title = svgCanvas.getDocumentTitle(); // We convert (to underscore) only those disallowed Win7 file name characters - - return title.trim().replace(/[/\\:*?"<>|]/g, '_'); - }; - - $ = _ref.$, decode64 = _ref.decode64, encode64 = _ref.encode64, importLocale = _ref.importLocale; - _context5.next = 7; - return importLocale(); - - case 7: - strings = _context5.sent; - svgEditor = _this; - _svgEditor$curConfig = svgEditor.curConfig, extPath = _svgEditor$curConfig.extPath, avoidClientSide = _svgEditor$curConfig.avoidClientSide, avoidClientSideDownload = _svgEditor$curConfig.avoidClientSideDownload, avoidClientSideOpen = _svgEditor$curConfig.avoidClientSideOpen, svgCanvas = svgEditor.canvas; - /** - * - * @returns {string} - */ - - saveSvgAction = extPath + 'filesave.php', saveImgAction = extPath + 'filesave.php'; // Create upload target (hidden iframe) - - cancelled = false; // Hiding by size instead of display to avoid FF console errors - // with `getBBox` in browser.js `supportsPathBBox_`) - - $("<iframe name=\"output_frame\" title=\"".concat(strings.hiddenframe, "\"\n style=\"width: 0; height: 0;\" src=\"data:text/html;base64,PGh0bWw+\"/>")).appendTo('body'); - svgEditor.setCustomHandlers({ - save: function save(win, data) { - var svg = '<?xml version="1.0" encoding="UTF-8"?>\n' + data, - // Firefox doesn't seem to know it is UTF-8 (no matter whether we use or skip the clientDownload code) despite the Content-Disposition header containing UTF-8, but adding the encoding works - filename = getFileNameFromTitle(); - - if (clientDownloadSupport(filename, '.svg', 'data:image/svg+xml;charset=UTF-8;base64,' + encode64(svg))) { - return; - } - - $('<form>').attr({ - method: 'post', - action: saveSvgAction, - target: 'output_frame' - }).append("\n <input type=\"hidden\" name=\"output_svg\" value=\"".concat(xhtmlEscape(svg), "\">\n <input type=\"hidden\" name=\"filename\" value=\"").concat(xhtmlEscape(filename), "\">\n ")).appendTo('body').submit().remove(); - }, - exportPDF: function exportPDF(win, data) { - var filename = getFileNameFromTitle(), - datauri = data.output; - - if (clientDownloadSupport(filename, '.pdf', datauri)) { - return; - } - - $('<form>').attr({ - method: 'post', - action: saveImgAction, - target: 'output_frame' - }).append("\n <input type=\"hidden\" name=\"output_img\" value=\"".concat(datauri, "\">\n <input type=\"hidden\" name=\"mime\" value=\"application/pdf\">\n <input type=\"hidden\" name=\"filename\" value=\"").concat(xhtmlEscape(filename), "\">\n ")).appendTo('body').submit().remove(); - }, - // Todo: Integrate this extension with a new built-in exportWindowType, "download" - exportImage: function exportImage(win, data) { - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var issues, mimeType, quality, c, datauri, pre, note, filename, suffix; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - issues = data.issues, mimeType = data.mimeType, quality = data.quality; - - if (!$('#export_canvas').length) { - $('<canvas>', { - id: 'export_canvas' - }).hide().appendTo('body'); - } - - c = $('#export_canvas')[0]; - c.width = svgCanvas.contentW; - c.height = svgCanvas.contentH; - _context.next = 7; - return canvg(c, data.svg); - - case 7: - datauri = quality ? c.toDataURL(mimeType, quality) : c.toDataURL(mimeType); // {uiStrings} = svgEditor; - // Check if there are issues - - note = ''; - - if (issues.length) { - pre = "\n \u2022 "; // Bullet - - note += '\n\n' + pre + issues.join(pre); - } - - if (!note.length) { - _context.next = 13; - break; - } - - _context.next = 13; - return $.alert(note); - - case 13: - filename = getFileNameFromTitle(); - suffix = '.' + data.type.toLowerCase(); - - if (!clientDownloadSupport(filename, suffix, datauri)) { - _context.next = 17; - break; - } - - return _context.abrupt("return"); - - case 17: - $('<form>').attr({ - method: 'post', - action: saveImgAction, - target: 'output_frame' - }).append("\n <input type=\"hidden\" name=\"output_img\" value=\"".concat(datauri, "\">\n <input type=\"hidden\" name=\"mime\" value=\"").concat(mimeType, "\">\n <input type=\"hidden\" name=\"filename\" value=\"").concat(xhtmlEscape(filename), "\">\n ")).appendTo('body').submit().remove(); - - case 18: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }); // Do nothing if client support is found - - if (!(window.FileReader && !avoidClientSideOpen)) { - _context5.next = 16; - break; - } - - return _context5.abrupt("return"); - - case 16: - // Change these to appropriate script file - openSvgAction = extPath + 'fileopen.php?type=load_svg'; - importSvgAction = extPath + 'fileopen.php?type=import_svg'; - importImgAction = extPath + 'fileopen.php?type=import_img'; // Set up function for PHP uploader to use - - svgEditor.processFile = function (str64, type) { - var xmlstr; - - if (cancelled) { - cancelled = false; - return; - } - - $('#dialog_box').hide(); - - if (type !== 'import_img') { - xmlstr = decode64(str64); - } - - switch (type) { - case 'load_svg': - svgCanvas.clear(); - svgCanvas.setSvgString(xmlstr); - svgEditor.updateCanvas(); - break; - - case 'import_svg': - svgCanvas.importSvgString(xmlstr); - svgEditor.updateCanvas(); - break; - - case 'import_img': - svgCanvas.setGoodImage(str64); - break; - } - }; // Create upload form - - - openSvgForm = $('<form>'); - openSvgForm.attr({ - enctype: 'multipart/form-data', - method: 'post', - action: openSvgAction, - target: 'output_frame' - }); // Create import form - - importSvgForm = openSvgForm.clone().attr('action', importSvgAction); // Create image form - - importImgForm = openSvgForm.clone().attr('action', importImgAction); // It appears necessary to rebuild this input every time a file is - // selected so the same file can be picked and the change event can fire. - - /** - * - * @param {external:jQuery} form - * @returns {void} - */ - - // Create the input elements - rebuildInput(openSvgForm); - rebuildInput(importSvgForm); - rebuildInput(importImgForm); // Add forms to buttons - - $('#tool_open').show().prepend(openSvgForm); - $('#tool_import').show().prepend(importSvgForm); - $('#tool_image').prepend(importImgForm); - - case 30: - case "end": - return _context5.stop(); - } + if (form[0] === openSvgForm[0]) { + inp.change(async function () { + // This takes care of the "are you sure" dialog box + const ok = await svgEditor.openPrep(); + if (!ok) { + rebuildInput(form); + return; } - }, _callee5); - }))(); + await submit(); + }); + } else { + inp.change(async function () { + // This submits the form, which returns the file data using svgEditor.processFile() + await submit(); + }); + } } - }; - return extServer_opensave; + // Create the input elements + rebuildInput(openSvgForm); + rebuildInput(importSvgForm); + rebuildInput(importImgForm); -}()); + // Add forms to buttons + $('#tool_open').show().prepend(openSvgForm); + $('#tool_import').show().prepend(importSvgForm); + $('#tool_image').prepend(importImgForm); + } +}; diff --git a/dist/extensions/ext-shapes.js b/dist/extensions/ext-shapes.js index d77be0ed..c2038cfc 100644 --- a/dist/extensions/ext-shapes.js +++ b/dist/extensions/ext-shapes.js @@ -1,441 +1,376 @@ -var svgEditorExtension_shapes = (function () { - 'use strict'; +/** + * @file ext-shapes.js + * + * @license MIT + * + * @copyright 2010 Christian Tzurcanu, 2010 Alexis Deveria + * + */ +export default { + name: 'shapes', + async init ({$, importLocale}) { + const strings = await importLocale(); + const svgEditor = this; + const canv = svgEditor.canvas; + const svgroot = canv.getRootElem(); + let lastBBox = {}; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; + // This populates the category list + const {categories} = strings; + /* eslint-disable max-len */ + const library = { + basic: { + data: { + heart: 'm150,73c61,-175 300,0 0,225c-300,-225 -61,-400 0,-225z', + frame: 'm0,0l300,0l0,300l-300,0zm35,-265l0,230l230,0l0,-230z', + donut: 'm1,150l0,0c0,-82.29042 66.70958,-149 149,-149l0,0c39.51724,0 77.41599,15.69816 105.35889,43.64108c27.94293,27.94293 43.64111,65.84165 43.64111,105.35892l0,0c0,82.29041 -66.70958,149 -149,149l0,0c-82.29041,0 -149,-66.70959 -149,-149zm74.5,0l0,0c0,41.1452 33.35481,74.5 74.5,74.5c41.14522,0 74.5,-33.3548 74.5,-74.5c0,-41.1452 -33.3548,-74.5 -74.5,-74.5l0,0c-41.14519,0 -74.5,33.35481 -74.5,74.5z', + triangle: 'm1,280.375l149,-260.75l149,260.75z', + right_triangle: 'm1,299l0,-298l298,298z', + diamond: 'm1,150l149,-149l149,149l-149,149l-149,-149z', + pentagon: 'm1.00035,116.97758l148.99963,-108.4053l148.99998,108.4053l-56.91267,175.4042l-184.1741,0l-56.91284,-175.4042z', + hexagon: 'm1,149.99944l63.85715,-127.71428l170.28572,0l63.85713,127.71428l-63.85713,127.71428l-170.28572,0l-63.85715,-127.71428z', + septagon1: 'm0.99917,191.06511l29.51249,-127.7108l119.48833,-56.83673l119.48836,56.83673l29.51303,127.7108l-82.69087,102.41679l-132.62103,0l-82.69031,-102.41679z', + heptagon: 'm1,88.28171l87.28172,-87.28171l123.43653,0l87.28172,87.28171l0,123.43654l-87.28172,87.28172l-123.43653,0l-87.28172,-87.28172l0,-123.43654z', + decagon: 'm1,150.00093l28.45646,-88.40318l74.49956,-54.63682l92.08794,0l74.50002,54.63682l28.45599,88.40318l-28.45599,88.40318l-74.50002,54.63681l-92.08794,0l-74.49956,-54.63681l-28.45646,-88.40318z', + dodecagon: 'm1,110.07421l39.92579,-69.14842l69.14842,-39.92579l79.85159,0l69.14842,39.92579l39.92578,69.14842l0,79.85159l-39.92578,69.14842l-69.14842,39.92578l-79.85159,0l-69.14842,-39.92578l-39.92579,-69.14842l0,-79.85159z', + star_points_5: 'm1,116.58409l113.82668,0l35.17332,-108.13487l35.17334,108.13487l113.82666,0l-92.08755,66.83026l35.17514,108.13487l-92.08759,-66.83208l-92.08757,66.83208l35.17515,-108.13487l-92.08758,-66.83026z', + trapezoid: 'm1,299l55.875,-298l186.25001,0l55.87498,298z', + arrow_up: 'm1.49805,149.64304l148.50121,-148.00241l148.50121,148.00241l-74.25061,0l0,148.71457l-148.5012,0l0,-148.71457z', + vertical_scrool: 'm37.375,261.625l0,-242.9375l0,0c0,-10.32083 8.36669,-18.6875 18.6875,-18.6875l224.25,0c10.32083,0 18.6875,8.36667 18.6875,18.6875c0,10.32081 -8.36667,18.6875 -18.6875,18.6875l-18.6875,0l0,242.9375c0,10.32083 -8.36668,18.6875 -18.6875,18.6875l-224.25,0l0,0c-10.32083,0 -18.6875,-8.36667 -18.6875,-18.6875c0,-10.32083 8.36667,-18.6875 18.6875,-18.6875zm37.375,-261.625l0,0c10.32081,0 18.6875,8.36667 18.6875,18.6875c0,10.32081 -8.36669,18.6875 -18.6875,18.6875c-5.1604,0 -9.34375,-4.18335 -9.34375,-9.34375c0,-5.16041 4.18335,-9.34375 9.34375,-9.34375l18.6875,0m186.875,18.6875l-205.5625,0m-37.375,224.25l0,0c5.1604,0 9.34375,4.18335 9.34375,9.34375c0,5.1604 -4.18335,9.34375 -9.34375,9.34375l18.6875,0m-18.6875,18.6875l0,0c10.32081,0 18.6875,-8.36667 18.6875,-18.6875l0,-18.6875', + smiley: 'm68.49886,214.78838q81.06408,55.67332 161.93891,0m-144.36983,-109.9558c0,-8.60432 6.97517,-15.57949 15.57948,-15.57949c8.60431,0 15.57948,6.97517 15.57948,15.57949c0,8.60431 -6.97517,15.57947 -15.57948,15.57947c-8.60431,0 -15.57948,-6.97516 -15.57948,-15.57947m95.83109,0c0,-8.60432 6.97517,-15.57949 15.57948,-15.57949c8.60431,0 15.57947,6.97517 15.57947,15.57949c0,8.60431 -6.97516,15.57947 -15.57947,15.57947c-8.60429,0 -15.57948,-6.97516 -15.57948,-15.57947m-181.89903,44.73038l0,0c0,-82.60133 66.96162,-149.56296 149.56296,-149.56296c82.60135,0 149.56296,66.96162 149.56296,149.56296c0,82.60135 -66.96161,149.56296 -149.56296,149.56296c-82.60133,0 -149.56296,-66.96161 -149.56296,-149.56296zm0,0l0,0c0,-82.60133 66.96162,-149.56296 149.56296,-149.56296c82.60135,0 149.56296,66.96162 149.56296,149.56296c0,82.60135 -66.96161,149.56296 -149.56296,149.56296c-82.60133,0 -149.56296,-66.96161 -149.56296,-149.56296z', + left_braket: 'm174.24565,298.5c-13.39009,0 -24.24489,-1.80908 -24.24489,-4.04065l0,-140.4187c0,-2.23158 -10.85481,-4.04065 -24.2449,-4.04065l0,0c13.39009,0 24.2449,-1.80907 24.2449,-4.04065l0,-140.4187l0,0c0,-2.23159 10.8548,-4.04066 24.24489,-4.04066', + uml_actor: 'm40.5,100l219,0m-108.99991,94.00006l107,105m-107.00009,-106.00006l-100,106m99.5,-231l0,125m33.24219,-158.75781c0,18.35916 -14.88303,33.24219 -33.24219,33.24219c-18.35916,0 -33.2422,-14.88303 -33.2422,-33.24219c0.00002,-18.35915 14.88304,-33.24219 33.2422,-33.24219c18.35916,0 33.24219,14.88304 33.24219,33.24219z', + dialog_balloon_1: 'm0.99786,35.96579l0,0c0,-19.31077 15.28761,-34.96524 34.14583,-34.96524l15.52084,0l0,0l74.50001,0l139.68748,0c9.05606,0 17.74118,3.68382 24.14478,10.24108c6.40356,6.55726 10.00107,15.45081 10.00107,24.72416l0,87.41311l0,0l0,52.44785l0,0c0,19.31078 -15.2876,34.96524 -34.14584,34.96524l-139.68748,0l-97.32507,88.90848l22.82506,-88.90848l-15.52084,0c-18.85822,0 -34.14583,-15.65446 -34.14583,-34.96524l0,0l0,-52.44785l0,0z', + cloud: 'm182.05086,34.31005c-0.64743,0.02048 -1.27309,0.07504 -1.92319,0.13979c-10.40161,1.03605 -19.58215,7.63722 -24.24597,17.4734l-2.47269,7.44367c0.53346,-2.57959 1.35258,-5.08134 2.47269,-7.44367c-8.31731,-8.61741 -19.99149,-12.59487 -31.52664,-10.72866c-11.53516,1.8662 -21.55294,9.3505 -27.02773,20.19925c-15.45544,-9.51897 -34.72095,-8.94245 -49.62526,1.50272c-14.90431,10.44516 -22.84828,28.93916 -20.43393,47.59753l1.57977,7.58346c-0.71388,-2.48442 -1.24701,-5.01186 -1.57977,-7.58346l-0.2404,0.69894c-12.95573,1.4119 -23.58103,11.46413 -26.34088,24.91708c-2.75985,13.45294 2.9789,27.25658 14.21789,34.21291l17.54914,4.26352c-6.1277,0.50439 -12.24542,-0.9808 -17.54914,-4.26352c-8.66903,9.71078 -10.6639,24.08736 -4.94535,35.96027c5.71854,11.87289 17.93128,18.70935 30.53069,17.15887l7.65843,-2.02692c-2.46413,1.0314 -5.02329,1.70264 -7.65843,2.02692c7.15259,13.16728 19.01251,22.77237 32.93468,26.5945c13.92217,3.82214 28.70987,1.56322 41.03957,-6.25546c10.05858,15.86252 27.91113,24.19412 45.81322,21.38742c17.90208,-2.8067 32.66954,-16.26563 37.91438,-34.52742l1.82016,-10.20447c-0.27254,3.46677 -0.86394,6.87508 -1.82016,10.20447c12.31329,8.07489 27.80199,8.52994 40.52443,1.18819c12.72244,-7.34175 20.6609,-21.34155 20.77736,-36.58929l-4.56108,-22.7823l-17.96776,-15.41455c13.89359,8.70317 22.6528,21.96329 22.52884,38.19685c16.5202,0.17313 30.55292,-13.98268 36.84976,-30.22897c6.29684,-16.24631 3.91486,-34.76801 -6.2504,-48.68089c4.21637,-10.35873 3.96622,-22.14172 -0.68683,-32.29084c-4.65308,-10.14912 -13.23602,-17.69244 -23.55914,-20.65356c-2.31018,-13.45141 -11.83276,-24.27162 -24.41768,-27.81765c-12.58492,-3.54603 -25.98557,0.82654 -34.41142,11.25287l-5.11707,8.63186c1.30753,-3.12148 3.01521,-6.03101 5.11707,-8.63186c-5.93959,-8.19432 -15.2556,-12.8181 -24.96718,-12.51096z', + cylinder: 'm299.0007,83.77844c0,18.28676 -66.70958,33.11111 -149.00002,33.11111m149.00002,-33.11111l0,0c0,18.28676 -66.70958,33.11111 -149.00002,33.11111c-82.29041,0 -148.99997,-14.82432 -148.99997,-33.11111m0,0l0,0c0,-18.28674 66.70956,-33.1111 148.99997,-33.1111c82.29044,0 149.00002,14.82436 149.00002,33.1111l0,132.44449c0,18.28674 -66.70958,33.11105 -149.00002,33.11105c-82.29041,0 -148.99997,-14.82431 -148.99997,-33.11105z', + arrow_u_turn: 'm1.00059,299.00055l0,-167.62497l0,0c0,-72.00411 58.37087,-130.37499 130.375,-130.37499l0,0l0,0c34.57759,0 67.73898,13.7359 92.18906,38.18595c24.45006,24.45005 38.18593,57.61144 38.18593,92.18904l0,18.625l37.24997,0l-74.49995,74.50002l-74.50002,-74.50002l37.25,0l0,-18.625c0,-30.8589 -25.0161,-55.87498 -55.87498,-55.87498l0,0l0,0c-30.85892,0 -55.875,25.01608 -55.875,55.87498l0,167.62497z', + arrow_left_up: 'm0.99865,224.5l74.50004,-74.5l0,37.25l111.74991,0l0,-111.75l-37.25,0l74.5,-74.5l74.5,74.5l-37.25,0l0,186.25l-186.24989,0l0,37.25l-74.50005,-74.5z', + maximize: 'm1.00037,150.34581l55.30305,-55.30267l0,27.65093l22.17356,0l0,-44.21833l44.21825,0l0,-22.17357l-27.65095,0l55.30267,-55.30292l55.3035,55.30292l-27.65175,0l0,22.17357l44.21835,0l0,44.21833l22.17357,0l0,-27.65093l55.30345,55.30267l-55.30345,55.3035l0,-27.65175l-22.17357,0l0,44.21834l-44.21835,0l0,22.17355l27.65175,0l-55.3035,55.30348l-55.30267,-55.30348l27.65095,0l0,-22.17355l-44.21825,0l0,-44.21834l-22.17356,0l0,27.65175l-55.30305,-55.3035z', + cross: 'm0.99844,99.71339l98.71494,0l0,-98.71495l101.26279,0l0,98.71495l98.71495,0l0,101.2628l-98.71495,0l0,98.71494l-101.26279,0l0,-98.71494l-98.71494,0z', + plaque: 'm-0.00197,49.94376l0,0c27.5829,0 49.94327,-22.36036 49.94327,-49.94327l199.76709,0l0,0c0,27.5829 22.36037,49.94327 49.94325,49.94327l0,199.7671l0,0c-27.58289,0 -49.94325,22.36034 -49.94325,49.94325l-199.76709,0c0,-27.58292 -22.36037,-49.94325 -49.94327,-49.94325z', + page: 'm249.3298,298.99744l9.9335,-39.73413l39.73413,-9.93355l-49.66763,49.66768l-248.33237,0l0,-298.00001l298.00001,0l0,248.33234' + + }, + buttons: [] + } + }; + /* eslint-enable max-len */ + const modeId = 'shapelib'; + const startClientPos = {}; + + let currentD, curShapeId, curShape, startX, startY; + let curLib = library.basic; + + /** + * + * @returns {void} + */ + function loadIcons () { + $('#shape_buttons').empty().append(curLib.buttons); } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } + /** + * @typedef {PlainObject} module:Extension.Shapes.Shapes + * @property {PlainObject<string, string>} data + * @property {Integer} [size] + * @property {boolean} [fill] + */ - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + /** + * @param {string|"basic"} cat Category ID + * @param {module:Extension.Shapes.Shapes} shapes + * @returns {void} + */ + function makeButtons (cat, shapes) { + const size = curLib.size || 300; + const fill = curLib.fill || false; + const off = size * 0.05; + const vb = [-off, -off, size + off * 2, size + off * 2].join(' '); + const stroke = fill ? 0 : (size / 30); + const shapeIcon = new DOMParser().parseFromString( + '<svg xmlns="http://www.w3.org/2000/svg">' + + '<svg viewBox="' + vb + '">' + + '<path fill="' + (fill ? '#333' : 'none') + + '" stroke="#000" stroke-width="' + stroke + '" /></svg></svg>', + 'text/xml' + ); - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } + const width = 24; + const height = 24; + shapeIcon.documentElement.setAttribute('width', width); + shapeIcon.documentElement.setAttribute('height', height); + const svgElem = $(document.importNode(shapeIcon.documentElement, true)); - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } + const {data} = shapes; - _next(undefined); + curLib.buttons = Object.entries(data).map(([id, pathD]) => { + const icon = svgElem.clone(); + icon.find('path').attr('d', pathD); + + const iconBtn = icon.wrap('<div class="tool_button">').parent().attr({ + id: modeId + '_' + id, + title: id + }); + // Store for later use + return iconBtn[0]; }); + } + + /** + * @param {string|"basic"} catId + * @returns {void} + */ + function loadLibrary (catId) { + const lib = library[catId]; + + if (!lib) { + $('#shape_buttons').html(strings.loading); + $.getJSON(svgEditor.curConfig.extIconsPath + 'shapelib/' + catId + '.json', function (result) { + curLib = library[catId] = { + data: result.data, + size: result.size, + fill: result.fill + }; + makeButtons(catId, result); + loadIcons(); + }); + return; + } + curLib = lib; + if (!lib.buttons.length) { makeButtons(catId, lib); } + loadIcons(); + } + const buttons = [{ + id: 'tool_shapelib', + icon: svgEditor.curConfig.extIconsPath + 'shapes.png', + type: 'mode_flyout', // _flyout + position: 6, + events: { + click () { + canv.setMode(modeId); + } + } + }]; + + return { + svgicons: svgEditor.curConfig.extIconsPath + 'ext-shapes.xml', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + callback () { + $('<style>').text(` + #shape_buttons { + overflow: auto; + width: 180px; + max-height: 300px; + display: table-cell; + vertical-align: middle; + } + #shape_cats { + min-width: 110px; + display: table-cell; + vertical-align: middle; + height: 300px; + } + #shape_cats > div { + line-height: 1em; + padding: .5em; + border:1px solid #B0B0B0; + background: #E8E8E8; + margin-bottom: -1px; + } + #shape_cats div:hover { + background: #FFFFCC; + } + #shape_cats div.current { + font-weight: bold; + } + `).appendTo('head'); + + const btnDiv = $('<div id="shape_buttons">'); + $('#tools_shapelib > *').wrapAll(btnDiv); + + const shower = $('#tools_shapelib_show'); + + loadLibrary('basic'); + + // Do mouseup on parent element rather than each button + $('#shape_buttons').mouseup(function (evt) { + const btn = $(evt.target).closest('div.tool_button'); + + if (!btn.length) { return; } + + const copy = btn.children().clone(); + shower.children(':not(.flyout_arrow_horiz)').remove(); + shower + .append(copy) + .attr('data-curopt', '#' + btn[0].id) // This sets the current mode + .mouseup(); + canv.setMode(modeId); + + curShapeId = btn[0].id.substr((modeId + '_').length); + currentD = curLib.data[curShapeId]; + + $('.tools_flyout').fadeOut(); + }); + + const shapeCats = $('<div id="shape_cats">'); + + let catStr = ''; + $.each(categories, function (id, label) { + catStr += '<div data-cat=' + id + '>' + label + '</div>'; + }); + + shapeCats.html(catStr).children().bind('mouseup', function () { + const catlink = $(this); + catlink.siblings().removeClass('current'); + catlink.addClass('current'); + + loadLibrary(catlink.attr('data-cat')); + // Get stuff + return false; + }); + + shapeCats.children().eq(0).addClass('current'); + + $('#tools_shapelib').append(shapeCats); + + shower.mouseup(function () { + canv.setMode(currentD ? modeId : 'select'); + }); + $('#tool_shapelib').remove(); + + const h = $('#tools_shapelib').height(); + $('#tools_shapelib').css({ + 'margin-top': -(h / 2 - 15), + 'margin-left': 3 + }); + // Now add shape categories from locale + const cats = {}; + Object.entries(categories).forEach(([o, categoryName]) => { + cats['#shape_cats [data-cat="' + o + '"]'] = categoryName; + }); + this.setStrings('content', cats); + }, + mouseDown (opts) { + const mode = canv.getMode(); + if (mode !== modeId) { return undefined; } + + startX = opts.start_x; + const x = startX; + startY = opts.start_y; + const y = startY; + const curStyle = canv.getStyle(); + + startClientPos.x = opts.event.clientX; + startClientPos.y = opts.event.clientY; + + curShape = canv.addSVGElementFromJson({ + element: 'path', + curStyles: true, + attr: { + d: currentD, + id: canv.getNextId(), + opacity: curStyle.opacity / 2, + style: 'pointer-events:none' + } + }); + + // Make sure shape uses absolute values + if ((/[a-z]/).test(currentD)) { + currentD = curLib.data[curShapeId] = canv.pathActions.convertPath(curShape); + curShape.setAttribute('d', currentD); + canv.pathActions.fixEnd(curShape); + } + curShape.setAttribute('transform', 'translate(' + x + ',' + y + ') scale(0.005) translate(' + -x + ',' + -y + ')'); + + canv.recalculateDimensions(curShape); + + /* const tlist = */ canv.getTransformList(curShape); + + lastBBox = curShape.getBBox(); + + return { + started: true + }; + }, + mouseMove (opts) { + const mode = canv.getMode(); + if (mode !== modeId) { return; } + + const zoom = canv.getZoom(); + const evt = opts.event; + + const x = opts.mouse_x / zoom; + const y = opts.mouse_y / zoom; + + const tlist = canv.getTransformList(curShape), + box = curShape.getBBox(), + left = box.x, top = box.y; + // {width, height} = box, + // const dx = (x - startX), dy = (y - startY); + + const newbox = { + x: Math.min(startX, x), + y: Math.min(startY, y), + width: Math.abs(x - startX), + height: Math.abs(y - startY) + }; + + /* + // This is currently serving no purpose, so commenting out + let sy = height ? (height + dy) / height : 1, + sx = width ? (width + dx) / width : 1; + */ + + let sx = (newbox.width / lastBBox.width) || 1; + let sy = (newbox.height / lastBBox.height) || 1; + + // Not perfect, but mostly works... + let tx = 0; + if (x < startX) { + tx = lastBBox.width; + } + let ty = 0; + if (y < startY) { + ty = lastBBox.height; + } + + // update the transform list with translate,scale,translate + const translateOrigin = svgroot.createSVGTransform(), + scale = svgroot.createSVGTransform(), + translateBack = svgroot.createSVGTransform(); + + translateOrigin.setTranslate(-(left + tx), -(top + ty)); + if (!evt.shiftKey) { + const max = Math.min(Math.abs(sx), Math.abs(sy)); + + sx = max * (sx < 0 ? -1 : 1); + sy = max * (sy < 0 ? -1 : 1); + } + scale.setScale(sx, sy); + + translateBack.setTranslate(left + tx, top + ty); + tlist.appendItem(translateBack); + tlist.appendItem(scale); + tlist.appendItem(translateOrigin); + + canv.recalculateDimensions(curShape); + + lastBBox = curShape.getBBox(); + }, + mouseUp (opts) { + const mode = canv.getMode(); + if (mode !== modeId) { return undefined; } + + const keepObject = (opts.event.clientX !== startClientPos.x && opts.event.clientY !== startClientPos.y); + + return { + keep: keepObject, + element: curShape, + started: false + }; + } }; } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * @file ext-shapes.js - * - * @license MIT - * - * @copyright 2010 Christian Tzurcanu, 2010 Alexis Deveria - * - */ - var extShapes = { - name: 'shapes', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var $, importLocale, strings, svgEditor, canv, svgroot, lastBBox, categories, library, modeId, startClientPos, currentD, curShapeId, curShape, startX, startY, curLib, loadIcons, makeButtons, loadLibrary, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - loadLibrary = function _loadLibrary(catId) { - var lib = library[catId]; - - if (!lib) { - $('#shape_buttons').html(strings.loading); - $.getJSON(svgEditor.curConfig.extIconsPath + 'shapelib/' + catId + '.json', function (result) { - curLib = library[catId] = { - data: result.data, - size: result.size, - fill: result.fill - }; - makeButtons(catId, result); - loadIcons(); - }); - return; - } - - curLib = lib; - - if (!lib.buttons.length) { - makeButtons(catId, lib); - } - - loadIcons(); - }; - - makeButtons = function _makeButtons(cat, shapes) { - var size = curLib.size || 300; - var fill = curLib.fill || false; - var off = size * 0.05; - var vb = [-off, -off, size + off * 2, size + off * 2].join(' '); - var stroke = fill ? 0 : size / 30; - var shapeIcon = new DOMParser().parseFromString('<svg xmlns="http://www.w3.org/2000/svg">' + '<svg viewBox="' + vb + '">' + '<path fill="' + (fill ? '#333' : 'none') + '" stroke="#000" stroke-width="' + stroke + '" /></svg></svg>', 'text/xml'); - var width = 24; - var height = 24; - shapeIcon.documentElement.setAttribute('width', width); - shapeIcon.documentElement.setAttribute('height', height); - var svgElem = $(document.importNode(shapeIcon.documentElement, true)); - var data = shapes.data; - curLib.buttons = Object.entries(data).map(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - id = _ref3[0], - pathD = _ref3[1]; - - var icon = svgElem.clone(); - icon.find('path').attr('d', pathD); - var iconBtn = icon.wrap('<div class="tool_button">').parent().attr({ - id: modeId + '_' + id, - title: id - }); // Store for later use - - return iconBtn[0]; - }); - }; - - loadIcons = function _loadIcons() { - $('#shape_buttons').empty().append(curLib.buttons); - }; - - $ = _ref.$, importLocale = _ref.importLocale; - _context.next = 6; - return importLocale(); - - case 6: - strings = _context.sent; - svgEditor = _this; - canv = svgEditor.canvas; - svgroot = canv.getRootElem(); - lastBBox = {}; // This populates the category list - - categories = strings.categories; - /* eslint-disable max-len */ - - library = { - basic: { - data: { - heart: 'm150,73c61,-175 300,0 0,225c-300,-225 -61,-400 0,-225z', - frame: 'm0,0l300,0l0,300l-300,0zm35,-265l0,230l230,0l0,-230z', - donut: 'm1,150l0,0c0,-82.29042 66.70958,-149 149,-149l0,0c39.51724,0 77.41599,15.69816 105.35889,43.64108c27.94293,27.94293 43.64111,65.84165 43.64111,105.35892l0,0c0,82.29041 -66.70958,149 -149,149l0,0c-82.29041,0 -149,-66.70959 -149,-149zm74.5,0l0,0c0,41.1452 33.35481,74.5 74.5,74.5c41.14522,0 74.5,-33.3548 74.5,-74.5c0,-41.1452 -33.3548,-74.5 -74.5,-74.5l0,0c-41.14519,0 -74.5,33.35481 -74.5,74.5z', - triangle: 'm1,280.375l149,-260.75l149,260.75z', - right_triangle: 'm1,299l0,-298l298,298z', - diamond: 'm1,150l149,-149l149,149l-149,149l-149,-149z', - pentagon: 'm1.00035,116.97758l148.99963,-108.4053l148.99998,108.4053l-56.91267,175.4042l-184.1741,0l-56.91284,-175.4042z', - hexagon: 'm1,149.99944l63.85715,-127.71428l170.28572,0l63.85713,127.71428l-63.85713,127.71428l-170.28572,0l-63.85715,-127.71428z', - septagon1: 'm0.99917,191.06511l29.51249,-127.7108l119.48833,-56.83673l119.48836,56.83673l29.51303,127.7108l-82.69087,102.41679l-132.62103,0l-82.69031,-102.41679z', - heptagon: 'm1,88.28171l87.28172,-87.28171l123.43653,0l87.28172,87.28171l0,123.43654l-87.28172,87.28172l-123.43653,0l-87.28172,-87.28172l0,-123.43654z', - decagon: 'm1,150.00093l28.45646,-88.40318l74.49956,-54.63682l92.08794,0l74.50002,54.63682l28.45599,88.40318l-28.45599,88.40318l-74.50002,54.63681l-92.08794,0l-74.49956,-54.63681l-28.45646,-88.40318z', - dodecagon: 'm1,110.07421l39.92579,-69.14842l69.14842,-39.92579l79.85159,0l69.14842,39.92579l39.92578,69.14842l0,79.85159l-39.92578,69.14842l-69.14842,39.92578l-79.85159,0l-69.14842,-39.92578l-39.92579,-69.14842l0,-79.85159z', - star_points_5: 'm1,116.58409l113.82668,0l35.17332,-108.13487l35.17334,108.13487l113.82666,0l-92.08755,66.83026l35.17514,108.13487l-92.08759,-66.83208l-92.08757,66.83208l35.17515,-108.13487l-92.08758,-66.83026z', - trapezoid: 'm1,299l55.875,-298l186.25001,0l55.87498,298z', - arrow_up: 'm1.49805,149.64304l148.50121,-148.00241l148.50121,148.00241l-74.25061,0l0,148.71457l-148.5012,0l0,-148.71457z', - vertical_scrool: 'm37.375,261.625l0,-242.9375l0,0c0,-10.32083 8.36669,-18.6875 18.6875,-18.6875l224.25,0c10.32083,0 18.6875,8.36667 18.6875,18.6875c0,10.32081 -8.36667,18.6875 -18.6875,18.6875l-18.6875,0l0,242.9375c0,10.32083 -8.36668,18.6875 -18.6875,18.6875l-224.25,0l0,0c-10.32083,0 -18.6875,-8.36667 -18.6875,-18.6875c0,-10.32083 8.36667,-18.6875 18.6875,-18.6875zm37.375,-261.625l0,0c10.32081,0 18.6875,8.36667 18.6875,18.6875c0,10.32081 -8.36669,18.6875 -18.6875,18.6875c-5.1604,0 -9.34375,-4.18335 -9.34375,-9.34375c0,-5.16041 4.18335,-9.34375 9.34375,-9.34375l18.6875,0m186.875,18.6875l-205.5625,0m-37.375,224.25l0,0c5.1604,0 9.34375,4.18335 9.34375,9.34375c0,5.1604 -4.18335,9.34375 -9.34375,9.34375l18.6875,0m-18.6875,18.6875l0,0c10.32081,0 18.6875,-8.36667 18.6875,-18.6875l0,-18.6875', - smiley: 'm68.49886,214.78838q81.06408,55.67332 161.93891,0m-144.36983,-109.9558c0,-8.60432 6.97517,-15.57949 15.57948,-15.57949c8.60431,0 15.57948,6.97517 15.57948,15.57949c0,8.60431 -6.97517,15.57947 -15.57948,15.57947c-8.60431,0 -15.57948,-6.97516 -15.57948,-15.57947m95.83109,0c0,-8.60432 6.97517,-15.57949 15.57948,-15.57949c8.60431,0 15.57947,6.97517 15.57947,15.57949c0,8.60431 -6.97516,15.57947 -15.57947,15.57947c-8.60429,0 -15.57948,-6.97516 -15.57948,-15.57947m-181.89903,44.73038l0,0c0,-82.60133 66.96162,-149.56296 149.56296,-149.56296c82.60135,0 149.56296,66.96162 149.56296,149.56296c0,82.60135 -66.96161,149.56296 -149.56296,149.56296c-82.60133,0 -149.56296,-66.96161 -149.56296,-149.56296zm0,0l0,0c0,-82.60133 66.96162,-149.56296 149.56296,-149.56296c82.60135,0 149.56296,66.96162 149.56296,149.56296c0,82.60135 -66.96161,149.56296 -149.56296,149.56296c-82.60133,0 -149.56296,-66.96161 -149.56296,-149.56296z', - left_braket: 'm174.24565,298.5c-13.39009,0 -24.24489,-1.80908 -24.24489,-4.04065l0,-140.4187c0,-2.23158 -10.85481,-4.04065 -24.2449,-4.04065l0,0c13.39009,0 24.2449,-1.80907 24.2449,-4.04065l0,-140.4187l0,0c0,-2.23159 10.8548,-4.04066 24.24489,-4.04066', - uml_actor: 'm40.5,100l219,0m-108.99991,94.00006l107,105m-107.00009,-106.00006l-100,106m99.5,-231l0,125m33.24219,-158.75781c0,18.35916 -14.88303,33.24219 -33.24219,33.24219c-18.35916,0 -33.2422,-14.88303 -33.2422,-33.24219c0.00002,-18.35915 14.88304,-33.24219 33.2422,-33.24219c18.35916,0 33.24219,14.88304 33.24219,33.24219z', - dialog_balloon_1: 'm0.99786,35.96579l0,0c0,-19.31077 15.28761,-34.96524 34.14583,-34.96524l15.52084,0l0,0l74.50001,0l139.68748,0c9.05606,0 17.74118,3.68382 24.14478,10.24108c6.40356,6.55726 10.00107,15.45081 10.00107,24.72416l0,87.41311l0,0l0,52.44785l0,0c0,19.31078 -15.2876,34.96524 -34.14584,34.96524l-139.68748,0l-97.32507,88.90848l22.82506,-88.90848l-15.52084,0c-18.85822,0 -34.14583,-15.65446 -34.14583,-34.96524l0,0l0,-52.44785l0,0z', - cloud: 'm182.05086,34.31005c-0.64743,0.02048 -1.27309,0.07504 -1.92319,0.13979c-10.40161,1.03605 -19.58215,7.63722 -24.24597,17.4734l-2.47269,7.44367c0.53346,-2.57959 1.35258,-5.08134 2.47269,-7.44367c-8.31731,-8.61741 -19.99149,-12.59487 -31.52664,-10.72866c-11.53516,1.8662 -21.55294,9.3505 -27.02773,20.19925c-15.45544,-9.51897 -34.72095,-8.94245 -49.62526,1.50272c-14.90431,10.44516 -22.84828,28.93916 -20.43393,47.59753l1.57977,7.58346c-0.71388,-2.48442 -1.24701,-5.01186 -1.57977,-7.58346l-0.2404,0.69894c-12.95573,1.4119 -23.58103,11.46413 -26.34088,24.91708c-2.75985,13.45294 2.9789,27.25658 14.21789,34.21291l17.54914,4.26352c-6.1277,0.50439 -12.24542,-0.9808 -17.54914,-4.26352c-8.66903,9.71078 -10.6639,24.08736 -4.94535,35.96027c5.71854,11.87289 17.93128,18.70935 30.53069,17.15887l7.65843,-2.02692c-2.46413,1.0314 -5.02329,1.70264 -7.65843,2.02692c7.15259,13.16728 19.01251,22.77237 32.93468,26.5945c13.92217,3.82214 28.70987,1.56322 41.03957,-6.25546c10.05858,15.86252 27.91113,24.19412 45.81322,21.38742c17.90208,-2.8067 32.66954,-16.26563 37.91438,-34.52742l1.82016,-10.20447c-0.27254,3.46677 -0.86394,6.87508 -1.82016,10.20447c12.31329,8.07489 27.80199,8.52994 40.52443,1.18819c12.72244,-7.34175 20.6609,-21.34155 20.77736,-36.58929l-4.56108,-22.7823l-17.96776,-15.41455c13.89359,8.70317 22.6528,21.96329 22.52884,38.19685c16.5202,0.17313 30.55292,-13.98268 36.84976,-30.22897c6.29684,-16.24631 3.91486,-34.76801 -6.2504,-48.68089c4.21637,-10.35873 3.96622,-22.14172 -0.68683,-32.29084c-4.65308,-10.14912 -13.23602,-17.69244 -23.55914,-20.65356c-2.31018,-13.45141 -11.83276,-24.27162 -24.41768,-27.81765c-12.58492,-3.54603 -25.98557,0.82654 -34.41142,11.25287l-5.11707,8.63186c1.30753,-3.12148 3.01521,-6.03101 5.11707,-8.63186c-5.93959,-8.19432 -15.2556,-12.8181 -24.96718,-12.51096z', - cylinder: 'm299.0007,83.77844c0,18.28676 -66.70958,33.11111 -149.00002,33.11111m149.00002,-33.11111l0,0c0,18.28676 -66.70958,33.11111 -149.00002,33.11111c-82.29041,0 -148.99997,-14.82432 -148.99997,-33.11111m0,0l0,0c0,-18.28674 66.70956,-33.1111 148.99997,-33.1111c82.29044,0 149.00002,14.82436 149.00002,33.1111l0,132.44449c0,18.28674 -66.70958,33.11105 -149.00002,33.11105c-82.29041,0 -148.99997,-14.82431 -148.99997,-33.11105z', - arrow_u_turn: 'm1.00059,299.00055l0,-167.62497l0,0c0,-72.00411 58.37087,-130.37499 130.375,-130.37499l0,0l0,0c34.57759,0 67.73898,13.7359 92.18906,38.18595c24.45006,24.45005 38.18593,57.61144 38.18593,92.18904l0,18.625l37.24997,0l-74.49995,74.50002l-74.50002,-74.50002l37.25,0l0,-18.625c0,-30.8589 -25.0161,-55.87498 -55.87498,-55.87498l0,0l0,0c-30.85892,0 -55.875,25.01608 -55.875,55.87498l0,167.62497z', - arrow_left_up: 'm0.99865,224.5l74.50004,-74.5l0,37.25l111.74991,0l0,-111.75l-37.25,0l74.5,-74.5l74.5,74.5l-37.25,0l0,186.25l-186.24989,0l0,37.25l-74.50005,-74.5z', - maximize: 'm1.00037,150.34581l55.30305,-55.30267l0,27.65093l22.17356,0l0,-44.21833l44.21825,0l0,-22.17357l-27.65095,0l55.30267,-55.30292l55.3035,55.30292l-27.65175,0l0,22.17357l44.21835,0l0,44.21833l22.17357,0l0,-27.65093l55.30345,55.30267l-55.30345,55.3035l0,-27.65175l-22.17357,0l0,44.21834l-44.21835,0l0,22.17355l27.65175,0l-55.3035,55.30348l-55.30267,-55.30348l27.65095,0l0,-22.17355l-44.21825,0l0,-44.21834l-22.17356,0l0,27.65175l-55.30305,-55.3035z', - cross: 'm0.99844,99.71339l98.71494,0l0,-98.71495l101.26279,0l0,98.71495l98.71495,0l0,101.2628l-98.71495,0l0,98.71494l-101.26279,0l0,-98.71494l-98.71494,0z', - plaque: 'm-0.00197,49.94376l0,0c27.5829,0 49.94327,-22.36036 49.94327,-49.94327l199.76709,0l0,0c0,27.5829 22.36037,49.94327 49.94325,49.94327l0,199.7671l0,0c-27.58289,0 -49.94325,22.36034 -49.94325,49.94325l-199.76709,0c0,-27.58292 -22.36037,-49.94325 -49.94327,-49.94325z', - page: 'm249.3298,298.99744l9.9335,-39.73413l39.73413,-9.93355l-49.66763,49.66768l-248.33237,0l0,-298.00001l298.00001,0l0,248.33234' - }, - buttons: [] - } - }; - /* eslint-enable max-len */ - - modeId = 'shapelib'; - startClientPos = {}; - curLib = library.basic; - /** - * - * @returns {void} - */ - - buttons = [{ - id: 'tool_shapelib', - icon: svgEditor.curConfig.extIconsPath + 'shapes.png', - type: 'mode_flyout', - // _flyout - position: 6, - events: { - click: function click() { - canv.setMode(modeId); - } - } - }]; - return _context.abrupt("return", { - svgicons: svgEditor.curConfig.extIconsPath + 'ext-shapes.xml', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - callback: function callback() { - $('<style>').text("\n #shape_buttons {\n overflow: auto;\n width: 180px;\n max-height: 300px;\n display: table-cell;\n vertical-align: middle;\n }\n #shape_cats {\n min-width: 110px;\n display: table-cell;\n vertical-align: middle;\n height: 300px;\n }\n #shape_cats > div {\n line-height: 1em;\n padding: .5em;\n border:1px solid #B0B0B0;\n background: #E8E8E8;\n margin-bottom: -1px;\n }\n #shape_cats div:hover {\n background: #FFFFCC;\n }\n #shape_cats div.current {\n font-weight: bold;\n }\n ").appendTo('head'); - var btnDiv = $('<div id="shape_buttons">'); - $('#tools_shapelib > *').wrapAll(btnDiv); - var shower = $('#tools_shapelib_show'); - loadLibrary('basic'); // Do mouseup on parent element rather than each button - - $('#shape_buttons').mouseup(function (evt) { - var btn = $(evt.target).closest('div.tool_button'); - - if (!btn.length) { - return; - } - - var copy = btn.children().clone(); - shower.children(':not(.flyout_arrow_horiz)').remove(); - shower.append(copy).attr('data-curopt', '#' + btn[0].id) // This sets the current mode - .mouseup(); - canv.setMode(modeId); - curShapeId = btn[0].id.substr((modeId + '_').length); - currentD = curLib.data[curShapeId]; - $('.tools_flyout').fadeOut(); - }); - var shapeCats = $('<div id="shape_cats">'); - var catStr = ''; - $.each(categories, function (id, label) { - catStr += '<div data-cat=' + id + '>' + label + '</div>'; - }); - shapeCats.html(catStr).children().bind('mouseup', function () { - var catlink = $(this); - catlink.siblings().removeClass('current'); - catlink.addClass('current'); - loadLibrary(catlink.attr('data-cat')); // Get stuff - - return false; - }); - shapeCats.children().eq(0).addClass('current'); - $('#tools_shapelib').append(shapeCats); - shower.mouseup(function () { - canv.setMode(currentD ? modeId : 'select'); - }); - $('#tool_shapelib').remove(); - var h = $('#tools_shapelib').height(); - $('#tools_shapelib').css({ - 'margin-top': -(h / 2 - 15), - 'margin-left': 3 - }); // Now add shape categories from locale - - var cats = {}; - Object.entries(categories).forEach(function (_ref4) { - var _ref5 = _slicedToArray(_ref4, 2), - o = _ref5[0], - categoryName = _ref5[1]; - - cats['#shape_cats [data-cat="' + o + '"]'] = categoryName; - }); - this.setStrings('content', cats); - }, - mouseDown: function mouseDown(opts) { - var mode = canv.getMode(); - - if (mode !== modeId) { - return undefined; - } - - startX = opts.start_x; - var x = startX; - startY = opts.start_y; - var y = startY; - var curStyle = canv.getStyle(); - startClientPos.x = opts.event.clientX; - startClientPos.y = opts.event.clientY; - curShape = canv.addSVGElementFromJson({ - element: 'path', - curStyles: true, - attr: { - d: currentD, - id: canv.getNextId(), - opacity: curStyle.opacity / 2, - style: 'pointer-events:none' - } - }); // Make sure shape uses absolute values - - if (/[a-z]/.test(currentD)) { - currentD = curLib.data[curShapeId] = canv.pathActions.convertPath(curShape); - curShape.setAttribute('d', currentD); - canv.pathActions.fixEnd(curShape); - } - - curShape.setAttribute('transform', 'translate(' + x + ',' + y + ') scale(0.005) translate(' + -x + ',' + -y + ')'); - canv.recalculateDimensions(curShape); - /* const tlist = */ - - canv.getTransformList(curShape); - lastBBox = curShape.getBBox(); - return { - started: true - }; - }, - mouseMove: function mouseMove(opts) { - var mode = canv.getMode(); - - if (mode !== modeId) { - return; - } - - var zoom = canv.getZoom(); - var evt = opts.event; - var x = opts.mouse_x / zoom; - var y = opts.mouse_y / zoom; - var tlist = canv.getTransformList(curShape), - box = curShape.getBBox(), - left = box.x, - top = box.y; // {width, height} = box, - // const dx = (x - startX), dy = (y - startY); - - var newbox = { - x: Math.min(startX, x), - y: Math.min(startY, y), - width: Math.abs(x - startX), - height: Math.abs(y - startY) - }; - /* - // This is currently serving no purpose, so commenting out - let sy = height ? (height + dy) / height : 1, - sx = width ? (width + dx) / width : 1; - */ - - var sx = newbox.width / lastBBox.width || 1; - var sy = newbox.height / lastBBox.height || 1; // Not perfect, but mostly works... - - var tx = 0; - - if (x < startX) { - tx = lastBBox.width; - } - - var ty = 0; - - if (y < startY) { - ty = lastBBox.height; - } // update the transform list with translate,scale,translate - - - var translateOrigin = svgroot.createSVGTransform(), - scale = svgroot.createSVGTransform(), - translateBack = svgroot.createSVGTransform(); - translateOrigin.setTranslate(-(left + tx), -(top + ty)); - - if (!evt.shiftKey) { - var max = Math.min(Math.abs(sx), Math.abs(sy)); - sx = max * (sx < 0 ? -1 : 1); - sy = max * (sy < 0 ? -1 : 1); - } - - scale.setScale(sx, sy); - translateBack.setTranslate(left + tx, top + ty); - tlist.appendItem(translateBack); - tlist.appendItem(scale); - tlist.appendItem(translateOrigin); - canv.recalculateDimensions(curShape); - lastBBox = curShape.getBBox(); - }, - mouseUp: function mouseUp(opts) { - var mode = canv.getMode(); - - if (mode !== modeId) { - return undefined; - } - - var keepObject = opts.event.clientX !== startClientPos.x && opts.event.clientY !== startClientPos.y; - return { - keep: keepObject, - element: curShape, - started: false - }; - } - }); - - case 18: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extShapes; - -}()); +}; diff --git a/dist/extensions/ext-shapes.xml b/dist/extensions/ext-shapes.xml new file mode 100644 index 00000000..5befd016 --- /dev/null +++ b/dist/extensions/ext-shapes.xml @@ -0,0 +1,10 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + <g id="tool_shapelib"> + <svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 300 300"> + <path fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m70,194.72501l0,0c0,-10.30901 35.8172,-18.666 80,-18.666c44.18298,0 80,8.35699 80,18.666l0,74.66699c0,10.30899 -35.81702,18.66699 -80,18.66699c-44.1828,0 -80,-8.358 -80,-18.66699l0,-74.66699z"/> + <path fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m70,114.608l0,0c0,-10.309 35.8172,-18.6668 80,-18.6668c44.18298,0 80,8.3578 80,18.6668l0,74.66699c0,10.30901 -35.81702,18.666 -80,18.666c-44.1828,0 -80,-8.35699 -80,-18.666l0,-74.66699z"/> + <path fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m70,33.6667l0,0c0,-10.3094 35.8172,-18.6667 80,-18.6667c44.18298,0 80,8.3573 80,18.6667l0,74.6663c0,10.31 -35.81702,18.667 -80,18.667c-44.1828,0 -80,-8.357 -80,-18.667l0,-74.6663z"/> + <path id="svg_1" fill="#c0c0c0" stroke-linejoin="round" stroke-width="14" stroke="#202020" fill-rule="nonzero" d="m230,32.33334c0,10.30931 -35.81726,18.66666 -80,18.66666c-44.1828,0 -80,-8.35735 -80,-18.66666"/> + </svg> + </g> +</svg> diff --git a/dist/extensions/ext-star.js b/dist/extensions/ext-star.js index e1472116..c1042360 100644 --- a/dist/extensions/ext-star.js +++ b/dist/extensions/ext-star.js @@ -1,294 +1,248 @@ -var svgEditorExtension_star = (function () { - 'use strict'; +/** + * @file ext-star.js + * + * + * @copyright 2010 CloudCanvas, Inc. All rights reserved + * + */ +export default { + name: 'star', + async init (S) { + const svgEditor = this; + const svgCanvas = svgEditor.canvas; - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; + const {$, importLocale} = S; // {svgcontent}, + let + selElems, + // editingitex = false, + // svgdoc = S.svgroot.parentNode.ownerDocument, + started, + newFO; + // edg = 0, + // newFOG, newFOGParent, newDef, newImageName, newMaskID, + // undoCommand = 'Not image', + // modeChangeG, ccZoom, wEl, hEl, wOffset, hOffset, ccRgbEl, brushW, brushH; + const strings = await importLocale(); + + /** + * + * @param {boolean} on + * @returns {void} + */ + function showPanel (on) { + let fcRules = $('#fc_rules'); + if (!fcRules.length) { + fcRules = $('<style id="fc_rules"></style>').appendTo('head'); + } + fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); + $('#star_panel').toggle(on); } - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); + /* + function toggleSourceButtons(on){ + $('#star_save, #star_cancel').toggle(on); } - } + */ - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); + /** + * + * @param {string} attr + * @param {string|Float} val + * @returns {void} + */ + function setAttr (attr, val) { + svgCanvas.changeSelectedAttribute(attr, val); + svgCanvas.call('changed', selElems); + } - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + /* + function cot(n){ + return 1 / Math.tan(n); + } + + function sec(n){ + return 1 / Math.cos(n); + } + */ + const buttons = [{ + id: 'tool_star', + icon: svgEditor.curConfig.extIconsPath + 'star.png', + type: 'mode', + position: 12, + events: { + click () { + showPanel(true); + svgCanvas.setMode('star'); } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); + } + }]; + const contextTools = [{ + type: 'input', + panel: 'star_panel', + id: 'starNumPoints', + size: 3, + defval: 5, + events: { + change () { + setAttr('point', this.value); } + } + }, { + type: 'input', + panel: 'star_panel', + id: 'starRadiusMulitplier', + size: 3, + defval: 2.5 + }, { + type: 'input', + panel: 'star_panel', + id: 'radialShift', + size: 3, + defval: 0, + events: { + change () { + setAttr('radialshift', this.value); + } + } + }]; - _next(undefined); - }); - }; - } + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'star-icons.svg', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }), + context_tools: strings.contextTools.map((contextTool, i) => { + return Object.assign(contextTools[i], contextTool); + }), + callback () { + $('#star_panel').hide(); + // const endChanges = function(){}; + }, + mouseDown (opts) { + const rgb = svgCanvas.getColor('fill'); + // const ccRgbEl = rgb.substring(1, rgb.length); + const sRgb = svgCanvas.getColor('stroke'); + // const ccSRgbEl = sRgb.substring(1, rgb.length); + const sWidth = svgCanvas.getStrokeWidth(); - /** - * @file ext-star.js - * - * - * @copyright 2010 CloudCanvas, Inc. All rights reserved - * - */ - var extStar = { - name: 'star', - init: function init(S) { - var _this = this; + if (svgCanvas.getMode() === 'star') { + started = true; - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var svgEditor, svgCanvas, $, importLocale, selElems, started, newFO, strings, showPanel, setAttr, buttons, contextTools; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - setAttr = function _setAttr(attr, val) { - svgCanvas.changeSelectedAttribute(attr, val); - svgCanvas.call('changed', selElems); - }; + newFO = svgCanvas.addSVGElementFromJson({ + element: 'polygon', + attr: { + cx: opts.start_x, + cy: opts.start_y, + id: svgCanvas.getNextId(), + shape: 'star', + point: document.getElementById('starNumPoints').value, + r: 0, + radialshift: document.getElementById('radialShift').value, + r2: 0, + orient: 'point', + fill: rgb, + strokecolor: sRgb, + strokeWidth: sWidth + } + }); + return { + started: true + }; + } + return undefined; + }, + mouseMove (opts) { + if (!started) { + return undefined; + } + if (svgCanvas.getMode() === 'star') { + const c = $(newFO).attr(['cx', 'cy', 'point', 'orient', 'fill', 'strokecolor', 'strokeWidth', 'radialshift']); - showPanel = function _showPanel(on) { - var fcRules = $('#fc_rules'); + let x = opts.mouse_x; + let y = opts.mouse_y; + const {cx, cy, fill, strokecolor, strokeWidth, radialshift, point, orient} = c, + circumradius = (Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy))) / 1.5, + inradius = circumradius / document.getElementById('starRadiusMulitplier').value; + newFO.setAttribute('r', circumradius); + newFO.setAttribute('r2', inradius); - if (!fcRules.length) { - fcRules = $('<style id="fc_rules"></style>').appendTo('head'); - } + let polyPoints = ''; + for (let s = 0; point >= s; s++) { + let angle = 2.0 * Math.PI * (s / point); + if (orient === 'point') { + angle -= (Math.PI / 2); + } else if (orient === 'edge') { + angle = (angle + (Math.PI / point)) - (Math.PI / 2); + } - fcRules.text(!on ? '' : ' #tool_topath { display: none !important; }'); - $('#star_panel').toggle(on); - }; + x = (circumradius * Math.cos(angle)) + cx; + y = (circumradius * Math.sin(angle)) + cy; - svgEditor = _this; - svgCanvas = svgEditor.canvas; - $ = S.$, importLocale = S.importLocale; // {svgcontent}, + polyPoints += x + ',' + y + ' '; - _context.next = 7; - return importLocale(); + if (!isNaN(inradius)) { + angle = (2.0 * Math.PI * (s / point)) + (Math.PI / point); + if (orient === 'point') { + angle -= (Math.PI / 2); + } else if (orient === 'edge') { + angle = (angle + (Math.PI / point)) - (Math.PI / 2); + } + angle += radialshift; - case 7: - strings = _context.sent; + x = (inradius * Math.cos(angle)) + cx; + y = (inradius * Math.sin(angle)) + cy; - /* - function cot(n){ - return 1 / Math.tan(n); - } - function sec(n){ - return 1 / Math.cos(n); - } - */ - buttons = [{ - id: 'tool_star', - icon: svgEditor.curConfig.extIconsPath + 'star.png', - type: 'mode', - position: 12, - events: { - click: function click() { - showPanel(true); - svgCanvas.setMode('star'); - } - } - }]; - contextTools = [{ - type: 'input', - panel: 'star_panel', - id: 'starNumPoints', - size: 3, - defval: 5, - events: { - change: function change() { - setAttr('point', this.value); - } - } - }, { - type: 'input', - panel: 'star_panel', - id: 'starRadiusMulitplier', - size: 3, - defval: 2.5 - }, { - type: 'input', - panel: 'star_panel', - id: 'radialShift', - size: 3, - defval: 0, - events: { - change: function change() { - setAttr('radialshift', this.value); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'star-icons.svg', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }), - context_tools: strings.contextTools.map(function (contextTool, i) { - return Object.assign(contextTools[i], contextTool); - }), - callback: function callback() { - $('#star_panel').hide(); // const endChanges = function(){}; - }, - mouseDown: function mouseDown(opts) { - var rgb = svgCanvas.getColor('fill'); // const ccRgbEl = rgb.substring(1, rgb.length); - - var sRgb = svgCanvas.getColor('stroke'); // const ccSRgbEl = sRgb.substring(1, rgb.length); - - var sWidth = svgCanvas.getStrokeWidth(); - - if (svgCanvas.getMode() === 'star') { - started = true; - newFO = svgCanvas.addSVGElementFromJson({ - element: 'polygon', - attr: { - cx: opts.start_x, - cy: opts.start_y, - id: svgCanvas.getNextId(), - shape: 'star', - point: document.getElementById('starNumPoints').value, - r: 0, - radialshift: document.getElementById('radialShift').value, - r2: 0, - orient: 'point', - fill: rgb, - strokecolor: sRgb, - strokeWidth: sWidth - } - }); - return { - started: true - }; - } - - return undefined; - }, - mouseMove: function mouseMove(opts) { - if (!started) { - return undefined; - } - - if (svgCanvas.getMode() === 'star') { - var c = $(newFO).attr(['cx', 'cy', 'point', 'orient', 'fill', 'strokecolor', 'strokeWidth', 'radialshift']); - var x = opts.mouse_x; - var y = opts.mouse_y; - var cx = c.cx, - cy = c.cy, - fill = c.fill, - strokecolor = c.strokecolor, - strokeWidth = c.strokeWidth, - radialshift = c.radialshift, - point = c.point, - orient = c.orient, - circumradius = Math.sqrt((x - cx) * (x - cx) + (y - cy) * (y - cy)) / 1.5, - inradius = circumradius / document.getElementById('starRadiusMulitplier').value; - newFO.setAttribute('r', circumradius); - newFO.setAttribute('r2', inradius); - var polyPoints = ''; - - for (var s = 0; point >= s; s++) { - var angle = 2.0 * Math.PI * (s / point); - - if (orient === 'point') { - angle -= Math.PI / 2; - } else if (orient === 'edge') { - angle = angle + Math.PI / point - Math.PI / 2; - } - - x = circumradius * Math.cos(angle) + cx; - y = circumradius * Math.sin(angle) + cy; - polyPoints += x + ',' + y + ' '; - - if (!isNaN(inradius)) { - angle = 2.0 * Math.PI * (s / point) + Math.PI / point; - - if (orient === 'point') { - angle -= Math.PI / 2; - } else if (orient === 'edge') { - angle = angle + Math.PI / point - Math.PI / 2; - } - - angle += radialshift; - x = inradius * Math.cos(angle) + cx; - y = inradius * Math.sin(angle) + cy; - polyPoints += x + ',' + y + ' '; - } - } - - newFO.setAttribute('points', polyPoints); - newFO.setAttribute('fill', fill); - newFO.setAttribute('stroke', strokecolor); - newFO.setAttribute('stroke-width', strokeWidth); - /* const shape = */ - - newFO.getAttribute('shape'); - return { - started: true - }; - } - - return undefined; - }, - mouseUp: function mouseUp() { - if (svgCanvas.getMode() === 'star') { - var attrs = $(newFO).attr(['r']); // svgCanvas.addToSelection([newFO], true); - - return { - keep: attrs.r !== '0', - element: newFO - }; - } - - return undefined; - }, - selectedChanged: function selectedChanged(opts) { - // Use this to update the current selected elements - selElems = opts.elems; - var i = selElems.length; - - while (i--) { - var elem = selElems[i]; - - if (elem && elem.getAttribute('shape') === 'star') { - if (opts.selectedElement && !opts.multiselected) { - // $('#starRadiusMulitplier').val(elem.getAttribute('r2')); - $('#starNumPoints').val(elem.getAttribute('point')); - $('#radialShift').val(elem.getAttribute('radialshift')); - showPanel(true); - } else { - showPanel(false); - } - } else { - showPanel(false); - } - } - }, - elementChanged: function elementChanged(opts) {// const elem = opts.elems[0]; - } - }); - - case 11: - case "end": - return _context.stop(); + polyPoints += x + ',' + y + ' '; } } - }, _callee); - }))(); - } - }; + newFO.setAttribute('points', polyPoints); + newFO.setAttribute('fill', fill); + newFO.setAttribute('stroke', strokecolor); + newFO.setAttribute('stroke-width', strokeWidth); + /* const shape = */ newFO.getAttribute('shape'); - return extStar; + return { + started: true + }; + } + return undefined; + }, + mouseUp () { + if (svgCanvas.getMode() === 'star') { + const attrs = $(newFO).attr(['r']); + // svgCanvas.addToSelection([newFO], true); + return { + keep: (attrs.r !== '0'), + element: newFO + }; + } + return undefined; + }, + selectedChanged (opts) { + // Use this to update the current selected elements + selElems = opts.elems; -}()); + let i = selElems.length; + while (i--) { + const elem = selElems[i]; + if (elem && elem.getAttribute('shape') === 'star') { + if (opts.selectedElement && !opts.multiselected) { + // $('#starRadiusMulitplier').val(elem.getAttribute('r2')); + $('#starNumPoints').val(elem.getAttribute('point')); + $('#radialShift').val(elem.getAttribute('radialshift')); + showPanel(true); + } else { + showPanel(false); + } + } else { + showPanel(false); + } + } + }, + elementChanged (opts) { + // const elem = opts.elems[0]; + } + }; + } +}; diff --git a/dist/extensions/ext-storage.js b/dist/extensions/ext-storage.js index 50dfa718..98a2b266 100644 --- a/dist/extensions/ext-storage.js +++ b/dist/extensions/ext-storage.js @@ -1,444 +1,298 @@ -var svgEditorExtension_storage = (function () { - 'use strict'; +/** + * @file ext-storage.js + * + * This extension allows automatic saving of the SVG canvas contents upon + * page unload (which can later be automatically retrieved upon future + * editor loads). + * + * The functionality was originally part of the SVG Editor, but moved to a + * separate extension to make the setting behavior optional, and adapted + * to inform the user of its setting of local data. + * + * @license MIT + * + * @copyright 2010 Brett Zamir + * @todo Revisit on whether to use `svgEditor.pref` over directly setting + * `curConfig` in all extensions for a more public API (not only for `extPath` + * and `imagePath`, but other currently used config in the extensions) + * @todo We might provide control of storage settings through the UI besides the + * initial (or URL-forced) dialog. * +*/ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } +export default { + name: 'storage', + init ({$}) { + const svgEditor = this; + const svgCanvas = svgEditor.canvas; - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } + // We could empty any already-set data for users when they decline storage, + // but it would be a risk for users who wanted to store but accidentally + // said "no"; instead, we'll let those who already set it, delete it themselves; + // to change, set the "emptyStorageOnDecline" config setting to true + // in svgedit-config-iife.js/svgedit-config-es.js. + const { + emptyStorageOnDecline, + // When the code in svg-editor.js prevents local storage on load per + // user request, we also prevent storing on unload here so as to + // avoid third-party sites making XSRF requests or providing links + // which would cause the user's local storage not to load and then + // upon page unload (such as the user closing the window), the storage + // would thereby be set with an empty value, erasing any of the + // user's prior work. To change this behavior so that no use of storage + // or adding of new storage takes place regardless of settings, set + // the "noStorageOnLoad" config setting to true in svgedit-config-*.js. + noStorageOnLoad, + forceStorage + } = svgEditor.curConfig; + const {storage, updateCanvas} = svgEditor; - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * @file ext-storage.js - * - * This extension allows automatic saving of the SVG canvas contents upon - * page unload (which can later be automatically retrieved upon future - * editor loads). - * - * The functionality was originally part of the SVG Editor, but moved to a - * separate extension to make the setting behavior optional, and adapted - * to inform the user of its setting of local data. - * - * @license MIT - * - * @copyright 2010 Brett Zamir - * @todo Revisit on whether to use `svgEditor.pref` over directly setting - * `curConfig` in all extensions for a more public API (not only for `extPath` - * and `imagePath`, but other currently used config in the extensions) - * @todo We might provide control of storage settings through the UI besides the - * initial (or URL-forced) dialog. * - */ - var extStorage = { - name: 'storage', - init: function init(_ref) { - var $ = _ref.$; - var svgEditor = this; - var svgCanvas = svgEditor.canvas; // We could empty any already-set data for users when they decline storage, - // but it would be a risk for users who wanted to store but accidentally - // said "no"; instead, we'll let those who already set it, delete it themselves; - // to change, set the "emptyStorageOnDecline" config setting to true - // in svgedit-config-iife.js/svgedit-config-es.js. - - var _svgEditor$curConfig = svgEditor.curConfig, - emptyStorageOnDecline = _svgEditor$curConfig.emptyStorageOnDecline, - noStorageOnLoad = _svgEditor$curConfig.noStorageOnLoad, - forceStorage = _svgEditor$curConfig.forceStorage; - var storage = svgEditor.storage, - updateCanvas = svgEditor.updateCanvas; - /** - * Replace `storagePrompt` parameter within URL. - * @param {string} val - * @returns {void} - * @todo Replace the string manipulation with `searchParams.set` - */ - - function replaceStoragePrompt(val) { - val = val ? 'storagePrompt=' + val : ''; - var loc = top.location; // Allow this to work with the embedded editor as well - - if (loc.href.includes('storagePrompt=')) { - /* - loc.href = loc.href.replace(/(?<sep>[&?])storagePrompt=[^&]*(?<amp>&?)/, function (n0, sep, amp) { - return (val ? sep : '') + val + (!val && amp ? sep : (amp || '')); - }); - */ - loc.href = loc.href.replace(/([&?])storagePrompt=[^&]*(&?)/, function (n0, n1, amp) { - return (val ? n1 : '') + val + (!val && amp ? n1 : amp || ''); - }); - } else { - loc.href += (loc.href.includes('?') ? '&' : '?') + val; - } - } - /** - * Sets SVG content as a string with "svgedit-" and the current - * canvas name as namespace. - * @param {string} val - * @returns {void} - */ - - - function setSVGContentStorage(val) { - if (storage) { - var name = 'svgedit-' + svgEditor.curConfig.canvasName; - - if (!val) { - storage.removeItem(name); - } else { - storage.setItem(name, val); - } - } - } - /** - * Set the cookie to expire. - * @param {string} cookie - * @returns {void} - */ - - - function expireCookie(cookie) { - document.cookie = encodeURIComponent(cookie) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; - } - /** - * Expire the storage cookie. - * @returns {void} - */ - - - function removeStoragePrefCookie() { - expireCookie('svgeditstore'); - } - /** - * Empties storage for each of the current preferences. - * @returns {void} - */ - - - function emptyStorage() { - setSVGContentStorage(''); - Object.keys(svgEditor.curPrefs).forEach(function (name) { - name = 'svg-edit-' + name; - - if (storage) { - storage.removeItem(name); - } - - expireCookie(name); + /** + * Replace `storagePrompt` parameter within URL. + * @param {string} val + * @returns {void} + * @todo Replace the string manipulation with `searchParams.set` + */ + function replaceStoragePrompt (val) { + val = val ? 'storagePrompt=' + val : ''; + const loc = top.location; // Allow this to work with the embedded editor as well + if (loc.href.includes('storagePrompt=')) { + /* + loc.href = loc.href.replace(/(?<sep>[&?])storagePrompt=[^&]*(?<amp>&?)/, function (n0, sep, amp) { + return (val ? sep : '') + val + (!val && amp ? sep : (amp || '')); }); - } // emptyStorage(); + */ + loc.href = loc.href.replace(/([&?])storagePrompt=[^&]*(&?)/, function (n0, n1, amp) { + return (val ? n1 : '') + val + (!val && amp ? n1 : (amp || '')); + }); + } else { + loc.href += (loc.href.includes('?') ? '&' : '?') + val; + } + } - /** - * Listen for unloading: If and only if opted in by the user, set the content - * document and preferences into storage: - * 1. Prevent save warnings (since we're automatically saving unsaved - * content into storage) - * 2. Use localStorage to set SVG contents (potentially too large to allow in cookies) - * 3. Use localStorage (where available) or cookies to set preferences. - * @returns {void} - */ + /** + * Sets SVG content as a string with "svgedit-" and the current + * canvas name as namespace. + * @param {string} val + * @returns {void} + */ + function setSVGContentStorage (val) { + if (storage) { + const name = 'svgedit-' + svgEditor.curConfig.canvasName; + if (!val) { + storage.removeItem(name); + } else { + storage.setItem(name, val); + } + } + } + /** + * Set the cookie to expire. + * @param {string} cookie + * @returns {void} + */ + function expireCookie (cookie) { + document.cookie = encodeURIComponent(cookie) + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT'; + } - function setupBeforeUnloadListener() { - window.addEventListener('beforeunload', function (e) { - // Don't save anything unless the user opted in to storage - if (!document.cookie.match(/(?:^|;\s*)svgeditstore=(?:prefsAndContent|prefsOnly)/)) { + /** + * Expire the storage cookie. + * @returns {void} + */ + function removeStoragePrefCookie () { + expireCookie('svgeditstore'); + } + + /** + * Empties storage for each of the current preferences. + * @returns {void} + */ + function emptyStorage () { + setSVGContentStorage(''); + Object.keys(svgEditor.curPrefs).forEach((name) => { + name = 'svg-edit-' + name; + if (storage) { + storage.removeItem(name); + } + expireCookie(name); + }); + } + + // emptyStorage(); + + /** + * Listen for unloading: If and only if opted in by the user, set the content + * document and preferences into storage: + * 1. Prevent save warnings (since we're automatically saving unsaved + * content into storage) + * 2. Use localStorage to set SVG contents (potentially too large to allow in cookies) + * 3. Use localStorage (where available) or cookies to set preferences. + * @returns {void} + */ + function setupBeforeUnloadListener () { + window.addEventListener('beforeunload', function (e) { + // Don't save anything unless the user opted in to storage + if (!document.cookie.match(/(?:^|;\s*)svgeditstore=(?:prefsAndContent|prefsOnly)/)) { + return; + } + if (document.cookie.match(/(?:^|;\s*)svgeditstore=prefsAndContent/)) { + setSVGContentStorage(svgCanvas.getSvgString()); + } + + svgEditor.setConfig({no_save_warning: true}); // No need for explicit saving at all once storage is on + // svgEditor.showSaveWarning = false; + + const {curPrefs} = svgEditor; + + Object.entries(curPrefs).forEach(([key, val]) => { + const store = (val !== undefined); + key = 'svg-edit-' + key; + if (!store) { return; } + if (storage) { + storage.setItem(key, val); + } else if (window.widget) { + window.widget.setPreferenceForKey(val, key); + } else { + val = encodeURIComponent(val); + document.cookie = encodeURIComponent(key) + '=' + val + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; + } + }); + }); + } - if (document.cookie.match(/(?:^|;\s*)svgeditstore=prefsAndContent/)) { - setSVGContentStorage(svgCanvas.getSvgString()); + let loaded = false; + return { + name: 'storage', + async langReady ({importLocale}) { + const storagePrompt = new URL(top.location).searchParams.get('storagePrompt'); + + const confirmSetStorage = await importLocale(); + const { + message, storagePrefsAndContent, storagePrefsOnly, + storagePrefs, storageNoPrefsOrContent, storageNoPrefs, + rememberLabel, rememberTooltip + } = confirmSetStorage; + + // No need to run this one-time dialog again just because the user + // changes the language + if (loaded) { + return; + } + loaded = true; + + // Note that the following can load even if "noStorageOnLoad" is + // set to false; to avoid any chance of storage, avoid this + // extension! (and to avoid using any prior storage, set the + // config option "noStorageOnLoad" to true). + if (!forceStorage && ( + // If the URL has been explicitly set to always prompt the + // user (e.g., so one can be pointed to a URL where one + // can alter one's settings, say to prevent future storage)... + storagePrompt === 'true' || + ( + // ...or...if the URL at least doesn't explicitly prevent a + // storage prompt (as we use for users who + // don't want to set cookies at all but who don't want + // continual prompts about it)... + storagePrompt !== 'false' && + // ...and this user hasn't previously indicated a desire for storage + !document.cookie.match(/(?:^|;\s*)svgeditstore=(?:prefsAndContent|prefsOnly)/) + ) + // ...then show the storage prompt. + )) { + const options = []; + if (storage) { + options.unshift( + {value: 'prefsAndContent', text: storagePrefsAndContent}, + {value: 'prefsOnly', text: storagePrefsOnly}, + {value: 'noPrefsOrContent', text: storageNoPrefsOrContent} + ); + } else { + options.unshift( + {value: 'prefsOnly', text: storagePrefs}, + {value: 'noPrefsOrContent', text: storageNoPrefs} + ); } - svgEditor.setConfig({ - no_save_warning: true - }); // No need for explicit saving at all once storage is on - // svgEditor.showSaveWarning = false; + // Hack to temporarily provide a wide and high enough dialog + const oldContainerWidth = $('#dialog_container')[0].style.width, + oldContainerMarginLeft = $('#dialog_container')[0].style.marginLeft, + oldContentHeight = $('#dialog_content')[0].style.height, + oldContainerHeight = $('#dialog_container')[0].style.height; + $('#dialog_content')[0].style.height = '120px'; + $('#dialog_container')[0].style.height = '170px'; + $('#dialog_container')[0].style.width = '800px'; + $('#dialog_container')[0].style.marginLeft = '-400px'; - var curPrefs = svgEditor.curPrefs; - Object.entries(curPrefs).forEach(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 2), - key = _ref3[0], - val = _ref3[1]; - - var store = val !== undefined; - key = 'svg-edit-' + key; - - if (!store) { + // Open select-with-checkbox dialog + // From svg-editor.js + svgEditor.storagePromptState = 'waiting'; + const {response: pref, checked} = await $.select( + message, + options, + null, + null, + { + label: rememberLabel, + checked: true, + tooltip: rememberTooltip + } + ); + if (pref && pref !== 'noPrefsOrContent') { + // Regardless of whether the user opted + // to remember the choice (and move to a URL which won't + // ask them again), we have to assume the user + // doesn't even want to remember their not wanting + // storage, so we don't set the cookie or continue on with + // setting storage on beforeunload + document.cookie = 'svgeditstore=' + encodeURIComponent(pref) + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; // 'prefsAndContent' | 'prefsOnly' + // If the URL was configured to always insist on a prompt, if + // the user does indicate a wish to store their info, we + // don't want ask them again upon page refresh so move + // them instead to a URL which does not always prompt + if (storagePrompt === 'true' && checked) { + replaceStoragePrompt(); return; } - - if (storage) { - storage.setItem(key, val); - } else if (window.widget) { - window.widget.setPreferenceForKey(val, key); - } else { - val = encodeURIComponent(val); - document.cookie = encodeURIComponent(key) + '=' + val + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; + } else { // The user does not wish storage (or cancelled, which we treat equivalently) + removeStoragePrefCookie(); + if (pref && // If the user explicitly expresses wish for no storage + emptyStorageOnDecline + ) { + emptyStorage(); } - }); - }); - } + if (pref && checked) { + // Open a URL which won't set storage and won't prompt user about storage + replaceStoragePrompt('false'); + return; + } + } - var loaded = false; - return { - name: 'storage', - langReady: function langReady(_ref4) { - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var importLocale, storagePrompt, confirmSetStorage, message, storagePrefsAndContent, storagePrefsOnly, storagePrefs, storageNoPrefsOrContent, storageNoPrefs, rememberLabel, rememberTooltip, options, oldContainerWidth, oldContainerMarginLeft, oldContentHeight, oldContainerHeight, _yield$$$select, pref, checked; + // Reset width/height of dialog (e.g., for use by Export) + $('#dialog_container')[0].style.width = oldContainerWidth; + $('#dialog_container')[0].style.marginLeft = oldContainerMarginLeft; + $('#dialog_content')[0].style.height = oldContentHeight; + $('#dialog_container')[0].style.height = oldContainerHeight; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - importLocale = _ref4.importLocale; - storagePrompt = new URL(top.location).searchParams.get('storagePrompt'); - _context.next = 4; - return importLocale(); + // It should be enough to (conditionally) add to storage on + // beforeunload, but if we wished to update immediately, + // we might wish to try setting: + // svgEditor.setConfig({noStorageOnLoad: true}); + // and then call: + // svgEditor.loadContentAndPrefs(); - case 4: - confirmSetStorage = _context.sent; - message = confirmSetStorage.message, storagePrefsAndContent = confirmSetStorage.storagePrefsAndContent, storagePrefsOnly = confirmSetStorage.storagePrefsOnly, storagePrefs = confirmSetStorage.storagePrefs, storageNoPrefsOrContent = confirmSetStorage.storageNoPrefsOrContent, storageNoPrefs = confirmSetStorage.storageNoPrefs, rememberLabel = confirmSetStorage.rememberLabel, rememberTooltip = confirmSetStorage.rememberTooltip; // No need to run this one-time dialog again just because the user - // changes the language + // We don't check for noStorageOnLoad here because + // the prompt gives the user the option to store data + setupBeforeUnloadListener(); - if (!loaded) { - _context.next = 8; - break; - } - - return _context.abrupt("return"); - - case 8: - loaded = true; // Note that the following can load even if "noStorageOnLoad" is - // set to false; to avoid any chance of storage, avoid this - // extension! (and to avoid using any prior storage, set the - // config option "noStorageOnLoad" to true). - - if (!(!forceStorage && ( // If the URL has been explicitly set to always prompt the - // user (e.g., so one can be pointed to a URL where one - // can alter one's settings, say to prevent future storage)... - storagePrompt === 'true' || // ...or...if the URL at least doesn't explicitly prevent a - // storage prompt (as we use for users who - // don't want to set cookies at all but who don't want - // continual prompts about it)... - storagePrompt !== 'false' && // ...and this user hasn't previously indicated a desire for storage - !document.cookie.match(/(?:^|;\s*)svgeditstore=(?:prefsAndContent|prefsOnly)/) // ...then show the storage prompt. - ))) { - _context.next = 44; - break; - } - - options = []; - - if (storage) { - options.unshift({ - value: 'prefsAndContent', - text: storagePrefsAndContent - }, { - value: 'prefsOnly', - text: storagePrefsOnly - }, { - value: 'noPrefsOrContent', - text: storageNoPrefsOrContent - }); - } else { - options.unshift({ - value: 'prefsOnly', - text: storagePrefs - }, { - value: 'noPrefsOrContent', - text: storageNoPrefs - }); - } // Hack to temporarily provide a wide and high enough dialog - - - oldContainerWidth = $('#dialog_container')[0].style.width, oldContainerMarginLeft = $('#dialog_container')[0].style.marginLeft, oldContentHeight = $('#dialog_content')[0].style.height, oldContainerHeight = $('#dialog_container')[0].style.height; - $('#dialog_content')[0].style.height = '120px'; - $('#dialog_container')[0].style.height = '170px'; - $('#dialog_container')[0].style.width = '800px'; - $('#dialog_container')[0].style.marginLeft = '-400px'; // Open select-with-checkbox dialog - // From svg-editor.js - - svgEditor.storagePromptState = 'waiting'; - _context.next = 20; - return $.select(message, options, null, null, { - label: rememberLabel, - checked: true, - tooltip: rememberTooltip - }); - - case 20: - _yield$$$select = _context.sent; - pref = _yield$$$select.response; - checked = _yield$$$select.checked; - - if (!(pref && pref !== 'noPrefsOrContent')) { - _context.next = 30; - break; - } - - // Regardless of whether the user opted - // to remember the choice (and move to a URL which won't - // ask them again), we have to assume the user - // doesn't even want to remember their not wanting - // storage, so we don't set the cookie or continue on with - // setting storage on beforeunload - document.cookie = 'svgeditstore=' + encodeURIComponent(pref) + '; expires=Fri, 31 Dec 9999 23:59:59 GMT'; // 'prefsAndContent' | 'prefsOnly' - // If the URL was configured to always insist on a prompt, if - // the user does indicate a wish to store their info, we - // don't want ask them again upon page refresh so move - // them instead to a URL which does not always prompt - - if (!(storagePrompt === 'true' && checked)) { - _context.next = 28; - break; - } - - replaceStoragePrompt(); - return _context.abrupt("return"); - - case 28: - _context.next = 35; - break; - - case 30: - // The user does not wish storage (or cancelled, which we treat equivalently) - removeStoragePrefCookie(); - - if (pref && // If the user explicitly expresses wish for no storage - emptyStorageOnDecline) { - emptyStorage(); - } - - if (!(pref && checked)) { - _context.next = 35; - break; - } - - // Open a URL which won't set storage and won't prompt user about storage - replaceStoragePrompt('false'); - return _context.abrupt("return"); - - case 35: - // Reset width/height of dialog (e.g., for use by Export) - $('#dialog_container')[0].style.width = oldContainerWidth; - $('#dialog_container')[0].style.marginLeft = oldContainerMarginLeft; - $('#dialog_content')[0].style.height = oldContentHeight; - $('#dialog_container')[0].style.height = oldContainerHeight; // It should be enough to (conditionally) add to storage on - // beforeunload, but if we wished to update immediately, - // we might wish to try setting: - // svgEditor.setConfig({noStorageOnLoad: true}); - // and then call: - // svgEditor.loadContentAndPrefs(); - // We don't check for noStorageOnLoad here because - // the prompt gives the user the option to store data - - setupBeforeUnloadListener(); - svgEditor.storagePromptState = 'closed'; - updateCanvas(true); - _context.next = 45; - break; - - case 44: - if (!noStorageOnLoad || forceStorage) { - setupBeforeUnloadListener(); - } - - case 45: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); + svgEditor.storagePromptState = 'closed'; + updateCanvas(true); + } else if (!noStorageOnLoad || forceStorage) { + setupBeforeUnloadListener(); } - }; - } - }; - - return extStorage; - -}()); + } + }; + } +}; diff --git a/dist/extensions/ext-webappfind.js b/dist/extensions/ext-webappfind.js index 728e0f3c..4eb86c08 100644 --- a/dist/extensions/ext-webappfind.js +++ b/dist/extensions/ext-webappfind.js @@ -1,178 +1,109 @@ -var svgEditorExtension_webappfind = (function () { - 'use strict'; +/** +* Depends on Firefox add-on and executables from +* {@link https://github.com/brettz9/webappfind}. +* @author Brett Zamir +* @license MIT +* @todo See WebAppFind Readme for SVG-related todos +*/ - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } +export default { + name: 'webappfind', + async init ({importLocale, $}) { + const strings = await importLocale(); + const svgEditor = this; + const saveMessage = 'save', + readMessage = 'read', + excludedMessages = [readMessage, saveMessage]; - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); + let pathID; + this.canvas.bind( + 'message', + /** + * @param {external:Window} win + * @param {PlainObject} info + * @param {module:svgcanvas.SvgCanvas#event:message} info.data + * @param {string} info.origin + * @listens module:svgcanvas.SvgCanvas#event:message + * @throws {Error} Unexpected event type + * @returns {void} + */ + (win, {data, origin}) => { // eslint-disable-line no-shadow + // console.log('data, origin', data, origin); + let type, content; + try { + ({type, pathID, content} = data.webappfind); // May throw if data is not an object + if (origin !== location.origin || // We are only interested in a message sent as though within this URL by our browser add-on + excludedMessages.includes(type) // Avoid our post below (other messages might be possible in the future which may also need to be excluded if your subsequent code makes assumptions on the type of message this is) + ) { + return; + } + } catch (err) { + return; } - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } + switch (type) { + case 'view': + // Populate the contents + svgEditor.loadFromString(content); - _next(undefined); - }); + /* if ($('#tool_save_file')) { + $('#tool_save_file').disabled = false; + } */ + break; + case 'save-end': + $.alert(`save complete for pathID ${pathID}!`); + break; + default: + throw new Error('Unexpected WebAppFind event type'); + } + } + ); + + /* + window.postMessage({ + webappfind: { + type: readMessage + } + }, window.location.origin === 'null' + // Avoid "null" string error for `file:` protocol (even though + // file protocol not currently supported by Firefox) + ? '*' + : window.location.origin + ); + */ + const buttons = [{ + id: 'webappfind_save', // + icon: svgEditor.curConfig.extIconsPath + 'webappfind.png', + type: 'app_menu', + position: 4, // Before 0-based index position 4 (after the regular "Save Image (S)") + events: { + click () { + if (!pathID) { // Not ready yet as haven't received first payload + return; + } + window.postMessage( + { + webappfind: { + type: saveMessage, + pathID, + content: svgEditor.canvas.getSvgString() + } + }, window.location.origin === 'null' + // Avoid "null" string error for `file:` protocol (even + // though file protocol not currently supported by add-on) + ? '*' + : window.location.origin + ); + } + } + }]; + + return { + name: strings.name, + svgicons: svgEditor.curConfig.extIconsPath + 'webappfind-icon.svg', + buttons: strings.buttons.map((button, i) => { + return Object.assign(buttons[i], button); + }) }; } - - /** - * Depends on Firefox add-on and executables from - * {@link https://github.com/brettz9/webappfind}. - * @author Brett Zamir - * @license MIT - * @todo See WebAppFind Readme for SVG-related todos - */ - var extWebappfind = { - name: 'webappfind', - init: function init(_ref) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var importLocale, $, strings, svgEditor, saveMessage, readMessage, excludedMessages, pathID, buttons; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - importLocale = _ref.importLocale, $ = _ref.$; - _context.next = 3; - return importLocale(); - - case 3: - strings = _context.sent; - svgEditor = _this; - saveMessage = 'save', readMessage = 'read', excludedMessages = [readMessage, saveMessage]; - - _this.canvas.bind('message', - /** - * @param {external:Window} win - * @param {PlainObject} info - * @param {module:svgcanvas.SvgCanvas#event:message} info.data - * @param {string} info.origin - * @listens module:svgcanvas.SvgCanvas#event:message - * @throws {Error} Unexpected event type - * @returns {void} - */ - function (win, _ref2) { - var data = _ref2.data, - origin = _ref2.origin; - // eslint-disable-line no-shadow - // console.log('data, origin', data, origin); - var type, content; - - try { - var _data$webappfind = data.webappfind; - type = _data$webappfind.type; - pathID = _data$webappfind.pathID; - content = _data$webappfind.content; - - // May throw if data is not an object - if (origin !== location.origin || // We are only interested in a message sent as though within this URL by our browser add-on - excludedMessages.includes(type) // Avoid our post below (other messages might be possible in the future which may also need to be excluded if your subsequent code makes assumptions on the type of message this is) - ) { - return; - } - } catch (err) { - return; - } - - switch (type) { - case 'view': - // Populate the contents - svgEditor.loadFromString(content); - /* if ($('#tool_save_file')) { - $('#tool_save_file').disabled = false; - } */ - - break; - - case 'save-end': - $.alert("save complete for pathID ".concat(pathID, "!")); - break; - - default: - throw new Error('Unexpected WebAppFind event type'); - } - }); - /* - window.postMessage({ - webappfind: { - type: readMessage - } - }, window.location.origin === 'null' - // Avoid "null" string error for `file:` protocol (even though - // file protocol not currently supported by Firefox) - ? '*' - : window.location.origin - ); - */ - - - buttons = [{ - id: 'webappfind_save', - // - icon: svgEditor.curConfig.extIconsPath + 'webappfind.png', - type: 'app_menu', - position: 4, - // Before 0-based index position 4 (after the regular "Save Image (S)") - events: { - click: function click() { - if (!pathID) { - // Not ready yet as haven't received first payload - return; - } - - window.postMessage({ - webappfind: { - type: saveMessage, - pathID: pathID, - content: svgEditor.canvas.getSvgString() - } - }, window.location.origin === 'null' // Avoid "null" string error for `file:` protocol (even - // though file protocol not currently supported by add-on) - ? '*' : window.location.origin); - } - } - }]; - return _context.abrupt("return", { - name: strings.name, - svgicons: svgEditor.curConfig.extIconsPath + 'webappfind-icon.svg', - buttons: strings.buttons.map(function (button, i) { - return Object.assign(buttons[i], button); - }) - }); - - case 9: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); - } - }; - - return extWebappfind; - -}()); +}; diff --git a/dist/extensions/ext-xdomain-messaging.js b/dist/extensions/ext-xdomain-messaging.js index caca2fa1..78b3144a 100644 --- a/dist/extensions/ext-xdomain-messaging.js +++ b/dist/extensions/ext-xdomain-messaging.js @@ -1,114 +1,48 @@ -var svgEditorExtension_xdomain_messaging = (function () { - 'use strict'; - - function _typeof(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; +/** +* Should not be needed for same domain control (just call via child frame), +* but an API common for cross-domain and same domain use can be found +* in embedapi.js with a demo at embedapi.html. +*/ +export default { + name: 'xdomain-messaging', + init () { + const svgEditor = this; + const svgCanvas = svgEditor.canvas; + try { + window.addEventListener('message', function (e) { + // We accept and post strings for the sake of IE9 support + if (!e.data || !['string', 'object'].includes(typeof e.data) || e.data.charAt() === '|') { + return; + } + const data = typeof e.data === 'object' ? e.data : JSON.parse(e.data); + if (!data || typeof data !== 'object' || data.namespace !== 'svgCanvas') { + return; + } + // The default is not to allow any origins, including even the same domain or + // if run on a `file:///` URL. See `svgedit-config-es.js` for an example of how + // to configure + const {allowedOrigins} = svgEditor.curConfig; + if (!allowedOrigins.includes('*') && !allowedOrigins.includes(e.origin)) { + console.log(`Origin ${e.origin} not whitelisted for posting to ${window.origin}`); // eslint-disable-line no-console + return; + } + const cbid = data.id; + const {name, args} = data; + const message = { + namespace: 'svg-edit', + id: cbid + }; + try { + // Now that we know the origin is trusted, we perform otherwise + // unsafe arbitrary canvas method execution + message.result = svgCanvas[name](...args); // lgtm [js/remote-property-injection] + } catch (err) { + message.error = err.message; + } + e.source.postMessage(JSON.stringify(message), '*'); + }); + } catch (err) { + console.log('Error with xdomain message listener: ' + err); // eslint-disable-line no-console } - - return _typeof(obj); } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /** - * Should not be needed for same domain control (just call via child frame), - * but an API common for cross-domain and same domain use can be found - * in embedapi.js with a demo at embedapi.html. - */ - var extXdomainMessaging = { - name: 'xdomain-messaging', - init: function init() { - var svgEditor = this; - var svgCanvas = svgEditor.canvas; - - try { - window.addEventListener('message', function (e) { - // We accept and post strings for the sake of IE9 support - if (!e.data || !['string', 'object'].includes(_typeof(e.data)) || e.data.charAt() === '|') { - return; - } - - var data = _typeof(e.data) === 'object' ? e.data : JSON.parse(e.data); - - if (!data || _typeof(data) !== 'object' || data.namespace !== 'svgCanvas') { - return; - } // The default is not to allow any origins, including even the same domain or - // if run on a `file:///` URL. See `svgedit-config-es.js` for an example of how - // to configure - - - var allowedOrigins = svgEditor.curConfig.allowedOrigins; - - if (!allowedOrigins.includes('*') && !allowedOrigins.includes(e.origin)) { - console.log("Origin ".concat(e.origin, " not whitelisted for posting to ").concat(window.origin)); // eslint-disable-line no-console - - return; - } - - var cbid = data.id; - var name = data.name, - args = data.args; - var message = { - namespace: 'svg-edit', - id: cbid - }; - - try { - // Now that we know the origin is trusted, we perform otherwise - // unsafe arbitrary canvas method execution - message.result = svgCanvas[name].apply(svgCanvas, _toConsumableArray(args)); // lgtm [js/remote-property-injection] - } catch (err) { - message.error = err.message; - } - - e.source.postMessage(JSON.stringify(message), '*'); - }); - } catch (err) { - console.log('Error with xdomain message listener: ' + err); // eslint-disable-line no-console - } - } - }; - - return extXdomainMessaging; - -}()); +}; diff --git a/dist/extensions/eyedropper-icon.xml b/dist/extensions/eyedropper-icon.xml new file mode 100644 index 00000000..8f8233e4 --- /dev/null +++ b/dist/extensions/eyedropper-icon.xml @@ -0,0 +1,34 @@ +<svg xmlns="http://www.w3.org/2000/svg"> + +<g id="tool_eyedropper"> +<svg viewBox="0 0 320 320" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> + <!-- Created with SVG-edit - https://github.com/SVG-Edit/svgedit --> + <defs> + <radialGradient id="eyedropper_svg_6" cx="0.5" cy="0.5" r="0.5"> + <stop offset="0" stop-color="#ffffff" stop-opacity="1"/> + <stop offset="1" stop-color="#e5e5e5" stop-opacity="0.38"/> + </radialGradient> + <linearGradient id="eyedropper_svg_15" x1="0" y1="0" x2="0.58594" y2="0.55078"> + <stop offset="0" stop-color="#ffffff" stop-opacity="0.57"/> + <stop offset="1" stop-color="#000056" stop-opacity="1"/> + </linearGradient> + <linearGradient id="eyedropper_svg_19" x1="0" y1="0" x2="1" y2="1"> + <stop offset="0" stop-color="#ffffff" stop-opacity="1"/> + <stop offset="1" stop-color="#ffffff" stop-opacity="0"/> + </linearGradient> + </defs> + <g display="inline"> + <title>Layer 1 + + + + + + + + + + + + + diff --git a/dist/extensions/eyedropper.png b/dist/extensions/eyedropper.png new file mode 100644 index 0000000000000000000000000000000000000000..94bc664bb0aaad76778101b0fd09b48a2cf247a0 GIT binary patch literal 568 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

lP zi5+NarZz<;4pE*ah9IU6@%qWPo1F#9pmQwerPV3{@8T8K3`x4ddGWIP4FU;|@BD~& zKFw7bkwDpT!moS3Ast8z-nmLjUTF7U&otpa3=B~DGey{0Z}79g%};ukoG)vz4mC<( z6wDi6QUj=1A|0Fwk-&?&V~H~7$2OH|EYl^NOtw;$8NyW3Y&d=)9^BCuxVBMwi$kh_wA%neV? zo%osDA~x}%@}>8xAm=%OP!s$Rk>hPqjn{jbf1WkpJ82r4V_d+;dWBJD-d?Z%-lW#< zaj+d({hiwvo?0PF!tfRh$ZRT{ib$*w#k%n*r&_1Qtf*F%g`0%{>$K zA30N|SFo{V_xTq|f$DGWXKuQlrz;Rd9~-NEG>AE(JGO!aae58F(1B%1)I8JsAY;dB z_an4#7gZQzfhLo3%#niHVly}j6UYcp1eS*e)2D=ef@0sec;~nlb7{}MxTU9kSy91F ztE9f(Upev(X+(QXmwUKZ^LSwAB%+ETjREj4h+csG{>j4nde+cn4N`ThtQ&?f8@CQ1F?6&IM-RI2SGFn4kpot`r7@1R4kymQ#gMCy9{sgUDz>U9-XBFUo?% zaP4a-18UVdTDUh&ZlN&I_+#i)mvRz}2yvA~e)5_*PoTsm(s1KsNS$^sXgats`wA>n zgG}Y>^MzTFfO=soellX1F>J8Sad566BIh8o%83yW*sLW6jCSthF0a>Vm)<&46|h@W z7YTkm_7%FA#Z-39qJduZJR@Q(&767#gKF?<&GgVsLLX;^>yJGh5L3xry{yWt^Ft!) zeFU{?9TBq9aFRSwcN0p4*cm8m%6*F<=(K!u?}{2Iqa)LI-|mX6G5Sn6!y};40>gp!1?(s0#>*u=p)vMw~@_M%-C-9N0- zurKYfUhA)0b-1Nu!fi_v<>0k0Fo2iJOBUy literal 0 HcmV?d00001 diff --git a/dist/extensions/foreignobject-icons.xml b/dist/extensions/foreignobject-icons.xml new file mode 100644 index 00000000..d5cb7e61 --- /dev/null +++ b/dist/extensions/foreignobject-icons.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/extensions/foreignobject-tool.png b/dist/extensions/foreignobject-tool.png new file mode 100644 index 0000000000000000000000000000000000000000..29e50d9bf6175472df4005c66eb60d5b4ea15c6d GIT binary patch literal 2937 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 + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/extensions/grid.png b/dist/extensions/grid.png new file mode 100644 index 0000000000000000000000000000000000000000..75e400efdbc9b614dbeac0fa743c37d139c7b6d1 GIT binary patch literal 2797 zcmeAS@N?(olHy`uVBq!ia0y~yU@>K2V4lap3=~nhbh`jZO%Cu0aRt&XV9?y$eDL7G zzP`RGQ>Juubo~GSf5wa%ix)5c^XJc#Cr_R}efs0ak2i1LeEeZ_^Zrr$b?b^qW zAOHRPcmMwV%a<>I`0(M*ojX^qT>1O=Z)1(O<%W7_k%;; zXJ1{Bx<1GBR>sweRcnK;Y^XPjGToJR!M#H$RHDuah0 zn1RzYoXU^`K7^SJWzev}3;znoJ{Jd3ey35&DzM9#SS~qKz+-Z+E+q{)8e;y7# zZrZRi7?GucEK^cfhBI%V7G5}&;S2yG!>K_r_~Vb#RaU1X+ETl!Ug{|C zjN5kQ%jMU=lpc91DorPT`KtHE(-u$pI@NYcI~yqVAtzy+MH!LG4ov8ZIv=aEdGor@ z)?&8h&AG66M)np`bfX3ev3WTtFn?$F^|~`(wv=u&$k`;EwmK*Anz8Nre-rFqt@?PO z>fNL1j;8MddK0^@{#bh3xiSKrWhnRC%Ze;}SKV_))5L?W2G*quWCiptkK5rB7%q9b z`nj&D?)@KmYYOz9YrgWly5iX<8`r&mPe&fxXlLQ)`&TKs@@2co))~JF3DjZmfI?2m zI8zI1_))41Za0{L(=?pQke!Sgmqg}Kic^M>WcvC!OIEzkGn&+_AC>jWRyi_8H~7kL z`PFWQ^V|Fn-Hcqd%k<)gb|!eSOL?leoospZ$kv?Xts8}Y-(3Z2Mm+5Qo4&t;ucLK6T|hq0#s literal 0 HcmV?d00001 diff --git a/dist/extensions/helloworld-icon.xml b/dist/extensions/helloworld-icon.xml new file mode 100644 index 00000000..8778308f --- /dev/null +++ b/dist/extensions/helloworld-icon.xml @@ -0,0 +1,21 @@ + + + + + + + Layer 1 + + Hello + World! + + + + diff --git a/dist/extensions/helloworld.png b/dist/extensions/helloworld.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9c8fc04e703e200db87bd9f48218c1824efe40 GIT binary patch literal 3048 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 literal 0 HcmV?d00001 diff --git a/dist/extensions/imagelib/index-es.html b/dist/extensions/imagelib/index-es.html new file mode 100644 index 00000000..3e782dee --- /dev/null +++ b/dist/extensions/imagelib/index-es.html @@ -0,0 +1,29 @@ + + + + + - + + + + + + + + + + + + + + + + + +

Select an image:

+smiley.svg +
+logo.png + + + diff --git a/dist/extensions/imagelib/index.html b/dist/extensions/imagelib/index.html new file mode 100644 index 00000000..9aec0ecd --- /dev/null +++ b/dist/extensions/imagelib/index.html @@ -0,0 +1,30 @@ + + + + + + - + + + + + + + + + + + + + + + + + +

Select an image:

+smiley.svg +
+logo.png + + + diff --git a/dist/extensions/imagelib/index.js b/dist/extensions/imagelib/index.js index 47afc0f6..6521469a 100644 --- a/dist/extensions/imagelib/index.js +++ b/dist/extensions/imagelib/index.js @@ -1,84 +1,49 @@ -(function () { - 'use strict'; - - function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - return _extends.apply(this, arguments); - } - - /* globals jQuery */ - var $ = jQuery; - $('a').click(function () { - var href = this.href; - var target = window.parent; - - var post = function post(message) { - // Todo: Make origin customizable as set by opening window - // Todo: If dropping IE9, avoid stringifying - target.postMessage(JSON.stringify(_extends({ - namespace: 'imagelib' - }, message)), '*'); - }; // Convert Non-SVG images to data URL first - // (this could also have been done server-side by the library) - // Send metadata (also indicates file is about to be sent) - - - post({ - name: $(this).text(), - id: href - }); - - if (!href.includes('.svg')) { - var img = new Image(); - img.addEventListener('load', function () { - var canvas = document.createElement('canvas'); - canvas.width = this.width; - canvas.height = this.height; // load the raster image into the canvas - - canvas.getContext('2d').drawImage(this, 0, 0); // retrieve the data: URL - - var data; - - try { - data = canvas.toDataURL(); - } catch (err) { - // This fails in Firefox with `file:///` URLs :( - // Todo: This could use a generic alert library instead - alert('Data URL conversion failed: ' + err); // eslint-disable-line no-alert - - data = ''; - } - - post({ - href: href, - data: data - }); - }); - img.src = href; - } else { - // Do ajax request for image's href value - $.get(href, function (data) { - post({ - href: href, - data: data - }); - }, 'html'); // 'html' is necessary to keep returned data as a string - } - - return false; +/* globals jQuery */ +const $ = jQuery; +$('a').click(function () { + const {href} = this; + const target = window.parent; + const post = (message) => { + // Todo: Make origin customizable as set by opening window + // Todo: If dropping IE9, avoid stringifying + target.postMessage(JSON.stringify({ + namespace: 'imagelib', + ...message + }), '*'); + }; + // Convert Non-SVG images to data URL first + // (this could also have been done server-side by the library) + // Send metadata (also indicates file is about to be sent) + post({ + name: $(this).text(), + id: href }); - -}()); + if (!href.includes('.svg')) { + const img = new Image(); + img.addEventListener('load', function () { + const canvas = document.createElement('canvas'); + canvas.width = this.width; + canvas.height = this.height; + // load the raster image into the canvas + canvas.getContext('2d').drawImage(this, 0, 0); + // retrieve the data: URL + let data; + try { + data = canvas.toDataURL(); + } catch (err) { + // This fails in Firefox with `file:///` URLs :( + // Todo: This could use a generic alert library instead + alert('Data URL conversion failed: ' + err); // eslint-disable-line no-alert + data = ''; + } + post({href, data}); + }); + img.src = href; + } else { + // Do ajax request for image's href value + $.get(href, function (data) { + post({href, data}); + }, 'html'); // 'html' is necessary to keep returned data as a string + } + return false; +}); diff --git a/dist/extensions/imagelib/openclipart-es.html b/dist/extensions/imagelib/openclipart-es.html new file mode 100644 index 00000000..604a84e9 --- /dev/null +++ b/dist/extensions/imagelib/openclipart-es.html @@ -0,0 +1,24 @@ + + + + + - + + + + + + + + + + + + + + + + + + + diff --git a/dist/extensions/imagelib/openclipart.html b/dist/extensions/imagelib/openclipart.html new file mode 100644 index 00000000..866a8d17 --- /dev/null +++ b/dist/extensions/imagelib/openclipart.html @@ -0,0 +1,25 @@ + + + + + + - + + + + + + + + + + + + + + + + + + + diff --git a/dist/extensions/imagelib/openclipart.js b/dist/extensions/imagelib/openclipart.js index 56e2c7b8..d033525c 100644 --- a/dist/extensions/imagelib/openclipart.js +++ b/dist/extensions/imagelib/openclipart.js @@ -1,3465 +1,346 @@ -(function () { - 'use strict'; +import {jml, body, nbsp} from '../../../external/jamilih/jml-es.js'; +import $ from '../../../external/query-result/esm/index.js'; +import {manipulation} from '../../../external/qr-manipulation/dist/index-es.js'; - function _typeof(obj) { - "@babel/helpers - typeof"; +manipulation($, jml); - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof = function (obj) { - return typeof obj; - }; - } else { - _typeof = function (obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } +const baseAPIURL = 'https://openclipart.org/search/json/'; - return _typeof(obj); - } +const jsVoid = 'javascript: void(0);'; // eslint-disable-line no-script-url - function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { - try { - var info = gen[key](arg); - var value = info.value; - } catch (error) { - reject(error); - return; - } - - if (info.done) { - resolve(value); - } else { - Promise.resolve(value).then(_next, _throw); - } - } - - function _asyncToGenerator(fn) { - return function () { - var self = this, - args = arguments; - return new Promise(function (resolve, reject) { - var gen = fn.apply(self, args); - - function _next(value) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); - } - - function _throw(err) { - asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); - } - - _next(undefined); - }); - }; - } - - function _classCallCheck(instance, Constructor) { - if (!(instance instanceof Constructor)) { - throw new TypeError("Cannot call a class as a function"); - } - } - - function _defineProperties(target, props) { - for (var i = 0; i < props.length; i++) { - var descriptor = props[i]; - descriptor.enumerable = descriptor.enumerable || false; - descriptor.configurable = true; - if ("value" in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); - } - } - - function _createClass(Constructor, protoProps, staticProps) { - if (protoProps) _defineProperties(Constructor.prototype, protoProps); - if (staticProps) _defineProperties(Constructor, staticProps); - return Constructor; - } - - function _extends() { - _extends = Object.assign || function (target) { - for (var i = 1; i < arguments.length; i++) { - var source = arguments[i]; - - for (var key in source) { - if (Object.prototype.hasOwnProperty.call(source, key)) { - target[key] = source[key]; - } - } - } - - return target; - }; - - return _extends.apply(this, arguments); - } - - function _inherits(subClass, superClass) { - if (typeof superClass !== "function" && superClass !== null) { - throw new TypeError("Super expression must either be null or a function"); - } - - subClass.prototype = Object.create(superClass && superClass.prototype, { - constructor: { - value: subClass, - writable: true, - configurable: true - } - }); - if (superClass) _setPrototypeOf(subClass, superClass); - } - - function _getPrototypeOf(o) { - _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { - return o.__proto__ || Object.getPrototypeOf(o); - }; - return _getPrototypeOf(o); - } - - function _setPrototypeOf(o, p) { - _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { - o.__proto__ = p; - return o; - }; - - return _setPrototypeOf(o, p); - } - - function _isNativeReflectConstruct() { - if (typeof Reflect === "undefined" || !Reflect.construct) return false; - if (Reflect.construct.sham) return false; - if (typeof Proxy === "function") return true; - - try { - Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); - return true; - } catch (e) { - return false; - } - } - - function _construct(Parent, args, Class) { - if (_isNativeReflectConstruct()) { - _construct = Reflect.construct; - } else { - _construct = function _construct(Parent, args, Class) { - var a = [null]; - a.push.apply(a, args); - var Constructor = Function.bind.apply(Parent, a); - var instance = new Constructor(); - if (Class) _setPrototypeOf(instance, Class.prototype); - return instance; - }; - } - - return _construct.apply(null, arguments); - } - - function _isNativeFunction(fn) { - return Function.toString.call(fn).indexOf("[native code]") !== -1; - } - - function _wrapNativeSuper(Class) { - var _cache = typeof Map === "function" ? new Map() : undefined; - - _wrapNativeSuper = function _wrapNativeSuper(Class) { - if (Class === null || !_isNativeFunction(Class)) return Class; - - if (typeof Class !== "function") { - throw new TypeError("Super expression must either be null or a function"); - } - - if (typeof _cache !== "undefined") { - if (_cache.has(Class)) return _cache.get(Class); - - _cache.set(Class, Wrapper); - } - - function Wrapper() { - return _construct(Class, arguments, _getPrototypeOf(this).constructor); - } - - Wrapper.prototype = Object.create(Class.prototype, { - constructor: { - value: Wrapper, - enumerable: false, - writable: true, - configurable: true - } - }); - return _setPrototypeOf(Wrapper, Class); - }; - - return _wrapNativeSuper(Class); - } - - function _assertThisInitialized(self) { - if (self === void 0) { - throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); - } - - return self; - } - - function _possibleConstructorReturn(self, call) { - if (call && (typeof call === "object" || typeof call === "function")) { - return call; - } - - return _assertThisInitialized(self); - } - - function _createSuper(Derived) { - var hasNativeReflectConstruct = _isNativeReflectConstruct(); - - return function _createSuperInternal() { - var Super = _getPrototypeOf(Derived), - result; - - if (hasNativeReflectConstruct) { - var NewTarget = _getPrototypeOf(this).constructor; - - result = Reflect.construct(Super, arguments, NewTarget); - } else { - result = Super.apply(this, arguments); - } - - return _possibleConstructorReturn(this, result); - }; - } - - function _superPropBase(object, property) { - while (!Object.prototype.hasOwnProperty.call(object, property)) { - object = _getPrototypeOf(object); - if (object === null) break; - } - - return object; - } - - function _get(target, property, receiver) { - if (typeof Reflect !== "undefined" && Reflect.get) { - _get = Reflect.get; - } else { - _get = function _get(target, property, receiver) { - var base = _superPropBase(target, property); - - if (!base) return; - var desc = Object.getOwnPropertyDescriptor(base, property); - - if (desc.get) { - return desc.get.call(receiver); - } - - return desc.value; - }; - } - - return _get(target, property, receiver || target); - } - - function _slicedToArray(arr, i) { - return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); - } - - function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); - } - - function _arrayWithoutHoles(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray(arr); - } - - function _arrayWithHoles(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - function _iterableToArrayLimit(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); - } - - function _arrayLikeToArray(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; - - return arr2; - } - - function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _nonIterableRest() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - /* - Possible todos: - 0. Add XSLT to JML-string stylesheet (or even vice versa) - 0. IE problem: Add JsonML code to handle name attribute (during element creation) - 0. Element-specific: IE object-param handling - - Todos inspired by JsonML: https://github.com/mckamey/jsonml/blob/master/jsonml-html.js - - 0. duplicate attributes? - 0. expand ATTR_MAP - 0. equivalent of markup, to allow strings to be embedded within an object (e.g., {$value: '
id
'}); advantage over innerHTML in that it wouldn't need to work as the entire contents (nor destroy any existing content or handlers) - 0. More validation? - 0. JsonML DOM Level 0 listener - 0. Whitespace trimming? - - JsonML element-specific: - 0. table appending - 0. canHaveChildren necessary? (attempts to append to script and img) - - Other Todos: - 0. Note to self: Integrate research from other jml notes - 0. Allow Jamilih to be seeded with an existing element, so as to be able to add/modify attributes and children - 0. Allow array as single first argument - 0. Settle on whether need to use null as last argument to return array (or fragment) or other way to allow appending? Options object at end instead to indicate whether returning array, fragment, first element, etc.? - 0. Allow building of generic XML (pass configuration object) - 0. Allow building content internally as a string (though allowing DOM methods, etc.?) - 0. Support JsonML empty string element name to represent fragments? - 0. Redo browser testing of jml (including ensuring IE7 can work even if test framework can't work) - */ - // istanbul ignore next - var win = typeof window !== 'undefined' && window; // istanbul ignore next - - var doc = typeof document !== 'undefined' && document || win && win.document; // STATIC PROPERTIES - - var possibleOptions = ['$plugins', // '$mode', // Todo (SVG/XML) - // '$state', // Used internally - '$map' // Add any other options here - ]; - var NS_HTML = 'http://www.w3.org/1999/xhtml', - hyphenForCamelCase = /\x2D([a-z])/g; - var ATTR_MAP = { - maxlength: 'maxLength', - minlength: 'minLength', - readonly: 'readOnly' - }; // We define separately from ATTR_DOM for clarity (and parity with JsonML) but no current need - // We don't set attribute esp. for boolean atts as we want to allow setting of `undefined` - // (e.g., from an empty variable) on templates to have no effect - - var BOOL_ATTS = ['checked', 'defaultChecked', 'defaultSelected', 'disabled', 'indeterminate', 'open', // Dialog elements - 'readOnly', 'selected']; // From JsonML - - var ATTR_DOM = BOOL_ATTS.concat(['accessKey', // HTMLElement - 'async', 'autocapitalize', // HTMLElement - 'autofocus', 'contentEditable', // HTMLElement through ElementContentEditable - 'defaultValue', 'defer', 'draggable', // HTMLElement - 'formnovalidate', 'hidden', // HTMLElement - 'innerText', // HTMLElement - 'inputMode', // HTMLElement through ElementContentEditable - 'ismap', 'multiple', 'novalidate', 'pattern', 'required', 'spellcheck', // HTMLElement - 'translate', // HTMLElement - 'value', 'willvalidate']); // Todo: Add more to this as useful for templating - // to avoid setting through nullish value - - var NULLABLES = ['autocomplete', 'dir', // HTMLElement - 'integrity', // script, link - 'lang', // HTMLElement - 'max', 'min', 'minLength', 'maxLength', 'title' // HTMLElement - ]; - - var $ = function $(sel) { - return doc.querySelector(sel); - }; +/** + * Shows results after query submission. + * @param {string} url + * @returns {Promise} + */ +async function processResults (url) { /** - * Retrieve the (lower-cased) HTML name of a node. - * @static - * @param {Node} node The HTML node - * @returns {string} The lower-cased node name - */ - - - function _getHTMLNodeName(node) { - return node.nodeName && node.nodeName.toLowerCase(); - } - /** - * Apply styles if this is a style tag. - * @static - * @param {Node} node The element to check whether it is a style tag - * @returns {void} - */ - - - function _applyAnyStylesheet(node) { - // Only used in IE - // istanbul ignore else - if (!doc.createStyleSheet) { - return; - } // istanbul ignore next - - - if (_getHTMLNodeName(node) === 'style') { - // IE - var ss = doc.createStyleSheet(); // Create a stylesheet to actually do something useful - - ss.cssText = node.cssText; // We continue to add the style tag, however - } - } - /** - * Need this function for IE since options weren't otherwise getting added. - * @private - * @static - * @param {Element} parent The parent to which to append the element - * @param {Node} child The element or other node to append to the parent - * @returns {void} + * @param {string} query + * @returns {external:JamilihArray} */ - - - function _appendNode(parent, child) { - var parentName = _getHTMLNodeName(parent); // IE only - // istanbul ignore if - - - if (doc.createStyleSheet) { - if (parentName === 'script') { - parent.text = child.nodeValue; - return; - } - - if (parentName === 'style') { - parent.cssText = child.nodeValue; // This will not apply it--just make it available within the DOM cotents - - return; - } - } - - if (parentName === 'template') { - parent.content.append(child); - return; - } - - try { - parent.append(child); // IE9 is now ok with this - } catch (e) { - // istanbul ignore next - var childName = _getHTMLNodeName(child); // istanbul ignore next - - - if (parentName === 'select' && childName === 'option') { - try { - // Since this is now DOM Level 4 standard behavior (and what IE7+ can handle), we try it first - parent.add(child); - } catch (err) { - // DOM Level 2 did require a second argument, so we try it too just in case the user is using an older version of Firefox, etc. - parent.add(child, null); // IE7 has a problem with this, but IE8+ is ok - } - - return; - } // istanbul ignore next - - - throw e; - } + function queryLink (query) { + return ['a', { + href: jsVoid, + dataset: {value: query}, + $on: {click (e) { + e.preventDefault(); + const {value} = this.dataset; + $('#query')[0].$set(value); + $('#openclipart')[0].$submit(); + }} + }, [query]]; } - /** - * Attach event in a cross-browser fashion. - * @static - * @param {Element} el DOM element to which to attach the event - * @param {string} type The DOM event (without 'on') to attach to the element - * @param {EventListener} handler The event handler to attach to the element - * @param {boolean} [capturing] Whether or not the event should be - * capturing (W3C-browsers only); default is false; NOT IN USE - * @returns {void} - */ + const r = await fetch(url); + const json = await r.json(); + // console.log('json', json); - function _addEvent(el, type, handler, capturing) { - el.addEventListener(type, handler, Boolean(capturing)); + if (!json || json.msg !== 'success') { + // Todo: This could use a generic alert library instead + alert('There was a problem downloading the results'); // eslint-disable-line no-alert + return; } - /** - * Creates a text node of the result of resolving an entity or character reference. - * @param {'entity'|'decimal'|'hexadecimal'} type Type of reference - * @param {string} prefix Text to prefix immediately after the "&" - * @param {string} arg The body of the reference - * @returns {Text} The text node of the resolved reference - */ - - - function _createSafeReference(type, prefix, arg) { - // For security reasons related to innerHTML, we ensure this string only - // contains potential entity characters - if (!arg.match(/^[0-9A-Z_a-z]+$/)) { - throw new TypeError("Bad ".concat(type, " reference; with prefix \"").concat(prefix, "\" and arg \"").concat(arg, "\"")); - } - - var elContainer = doc.createElement('div'); // Todo: No workaround for XML? - // eslint-disable-next-line no-unsanitized/property - - elContainer.innerHTML = '&' + prefix + arg + ';'; - return doc.createTextNode(elContainer.innerHTML); - } - /** - * @param {string} n0 Whole expression match (including "-") - * @param {string} n1 Lower-case letter match - * @returns {string} Uppercased letter - */ - - - function _upperCase(n0, n1) { - return n1.toUpperCase(); - } // Todo: Make as public utility - - /** - * @param {any} o - * @returns {boolean} - */ - - - function _isNullish(o) { - return o === null || o === undefined; - } // Todo: Make as public utility, but also return types for undefined, boolean, number, document, etc. - - /** - * @private - * @static - * @param {string|JamilihAttributes|JamilihArray|Element|DocumentFragment} item - * @returns {"string"|"null"|"array"|"element"|"fragment"|"object"|"symbol"|"function"|"number"|"boolean"} - */ - - - function _getType(item) { - var type = _typeof(item); - - switch (type) { - case 'object': - if (item === null) { - return 'null'; - } - - if (Array.isArray(item)) { - return 'array'; - } - - if ('nodeType' in item) { - switch (item.nodeType) { - case 1: - return 'element'; - - case 9: - return 'document'; - - case 11: - return 'fragment'; - - default: - return 'non-container node'; - } - } - - // Fallthrough - - default: - return type; - } - } - /** - * @private - * @static - * @param {DocumentFragment} frag - * @param {Node} node - * @returns {DocumentFragment} - */ - - - function _fragReducer(frag, node) { - frag.append(node); - return frag; - } - /** - * @private - * @static - * @param {Object<{string:string}>} xmlnsObj - * @returns {string} - */ - - - function _replaceDefiner(xmlnsObj) { - return function (n0) { - var retStr = xmlnsObj[''] ? ' xmlns="' + xmlnsObj[''] + '"' : n0; // Preserve XHTML - - for (var _i = 0, _Object$entries = Object.entries(xmlnsObj); _i < _Object$entries.length; _i++) { - var _Object$entries$_i = _slicedToArray(_Object$entries[_i], 2), - ns = _Object$entries$_i[0], - xmlnsVal = _Object$entries$_i[1]; - - if (ns !== '') { - retStr += ' xmlns:' + ns + '="' + xmlnsVal + '"'; - } - } - - return retStr; - }; - } - /** - * @typedef {JamilihAttributes} AttributeArray - * @property {string} 0 The key - * @property {string} 1 The value - */ - - /** - * @callback ChildrenToJMLCallback - * @param {JamilihArray|Jamilih} childNodeJML - * @param {Integer} i - * @returns {void} - */ - - /** - * @private - * @static - * @param {Node} node - * @returns {ChildrenToJMLCallback} - */ - - - function _childrenToJML(node) { - return function (childNodeJML, i) { - var cn = node.childNodes[i]; - var j = Array.isArray(childNodeJML) ? jml.apply(void 0, _toConsumableArray(childNodeJML)) : jml(childNodeJML); - cn.replaceWith(j); - }; - } - /** - * @callback JamilihAppender - * @param {JamilihArray} childJML - * @returns {void} - */ - - /** - * @private - * @static - * @param {Node} node - * @returns {JamilihAppender} - */ - - - function _appendJML(node) { - return function (childJML) { - if (Array.isArray(childJML)) { - node.append(jml.apply(void 0, _toConsumableArray(childJML))); - } else { - node.append(jml(childJML)); - } - }; - } - /** - * @callback appender - * @param {string|JamilihArray} childJML - * @returns {void} - */ - - /** - * @private - * @static - * @param {Node} node - * @returns {appender} - */ - - - function _appendJMLOrText(node) { - return function (childJML) { - if (typeof childJML === 'string') { - node.append(childJML); - } else if (Array.isArray(childJML)) { - node.append(jml.apply(void 0, _toConsumableArray(childJML))); - } else { - node.append(jml(childJML)); - } - }; - } - /** - * @private - * @static - */ - - /* - function _DOMfromJMLOrString (childNodeJML) { - if (typeof childNodeJML === 'string') { - return doc.createTextNode(childNodeJML); - } - return jml(...childNodeJML); - } - */ - - /** - * @typedef {Element|DocumentFragment} JamilihReturn - */ - - /** - * @typedef {PlainObject} JamilihAttributes - */ - - /** - * @typedef {GenericArray} JamilihArray - * @property {string} 0 The element to create (by lower-case name) - * @property {JamilihAttributes} [1] Attributes to add with the key as the - * attribute name and value as the attribute value; important for IE where - * the input element's type cannot be added later after already added to the page - * @param {Element[]} [children] The optional children of this element - * (but raw DOM elements required to be specified within arrays since - * could not otherwise be distinguished from siblings being added) - * @param {Element} [parent] The optional parent to which to attach the element - * (always the last unless followed by null, in which case it is the - * second-to-last) - * @param {null} [returning] Can use null to indicate an array of elements - * should be returned - */ - - /** - * @typedef {PlainObject} JamilihOptions - * @property {"root"|"attributeValue"|"fragment"|"children"|"fragmentChildren"} $state - */ - - /** - * @param {Element} elem - * @param {string} att - * @param {string} attVal - * @param {JamilihOptions} opts - * @returns {void} - */ - - - function checkPluginValue(elem, att, attVal, opts) { - opts.$state = 'attributeValue'; - - if (attVal && _typeof(attVal) === 'object') { - var matchingPlugin = getMatchingPlugin(opts, Object.keys(attVal)[0]); - - if (matchingPlugin) { - return matchingPlugin.set({ - opts: opts, - element: elem, - attribute: { - name: att, - value: attVal - } - }); - } - } - - return attVal; - } - /** - * @param {JamilihOptions} opts - * @param {string} item - * @returns {JamilihPlugin} - */ - - - function getMatchingPlugin(opts, item) { - return opts.$plugins && opts.$plugins.find(function (p) { - return p.name === item; - }); - } - /** - * Creates an XHTML or HTML element (XHTML is preferred, but only in browsers - * that support); any element after element can be omitted, and any subsequent - * type or types added afterwards. - * @param {...JamilihArray} args - * @returns {JamilihReturn} The newly created (and possibly already appended) - * element or array of elements - */ - - - var jml = function jml() { - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var elem = doc.createDocumentFragment(); - /** - * - * @param {Object<{string: string}>} atts - * @returns {void} - */ - - function _checkAtts(atts) { - for (var _i2 = 0, _Object$entries2 = Object.entries(atts); _i2 < _Object$entries2.length; _i2++) { - var _Object$entries2$_i = _slicedToArray(_Object$entries2[_i2], 2), - att = _Object$entries2$_i[0], - attVal = _Object$entries2$_i[1]; - - att = att in ATTR_MAP ? ATTR_MAP[att] : att; - - if (NULLABLES.includes(att)) { - attVal = checkPluginValue(elem, att, attVal, opts); - - if (!_isNullish(attVal)) { - elem[att] = attVal; - } - - continue; - } else if (ATTR_DOM.includes(att)) { - attVal = checkPluginValue(elem, att, attVal, opts); - elem[att] = attVal; - continue; - } - - switch (att) { - /* - Todos: - 0. JSON mode to prevent event addition - 0. {$xmlDocument: []} // doc.implementation.createDocument - 0. Accept array for any attribute with first item as prefix and second as value? - 0. {$: ['xhtml', 'div']} for prefixed elements - case '$': // Element with prefix? - nodes[nodes.length] = elem = doc.createElementNS(attVal[0], attVal[1]); - break; - */ - case '#': - { - // Document fragment - opts.$state = 'fragmentChilden'; - nodes[nodes.length] = jml(opts, attVal); - break; - } - - case '$shadow': - { - var _attVal = attVal, - open = _attVal.open, - closed = _attVal.closed; - var _attVal2 = attVal, - content = _attVal2.content, - template = _attVal2.template; - var shadowRoot = elem.attachShadow({ - mode: closed || open === false ? 'closed' : 'open' - }); - - if (template) { - if (Array.isArray(template)) { - if (_getType(template[0]) === 'object') { - // Has attributes - template = jml.apply(void 0, ['template'].concat(_toConsumableArray(template), [doc.body])); - } else { - // Array is for the children - template = jml('template', template, doc.body); - } - } else if (typeof template === 'string') { - template = $(template); - } - - jml(template.content.cloneNode(true), shadowRoot); - } else { - if (!content) { - content = open || closed; - } - - if (content && typeof content !== 'boolean') { - if (Array.isArray(content)) { - jml({ - '#': content - }, shadowRoot); - } else { - jml(content, shadowRoot); - } - } - } - - break; - } - - case '$state': - { - // Handled internally - break; - } - - case 'is': - { - // Currently only in Chrome - // Handled during element creation - break; - } - - case '$custom': - { - Object.assign(elem, attVal); - break; - } - - /* istanbul ignore next */ - - case '$define': - { - var _ret = function () { - var localName = elem.localName.toLowerCase(); // Note: customized built-ins sadly not working yet - - var customizedBuiltIn = !localName.includes('-'); // We check attribute in case this is a preexisting DOM element - // const {is} = atts; - - var is = void 0; - - if (customizedBuiltIn) { - is = elem.getAttribute('is'); - - if (!is) { - if (!{}.hasOwnProperty.call(atts, 'is')) { - throw new TypeError("Expected `is` with `$define` on built-in; args: ".concat(JSON.stringify(args))); - } - - atts.is = checkPluginValue(elem, 'is', atts.is, opts); - elem.setAttribute('is', atts.is); - is = atts.is; - } - } - - var def = customizedBuiltIn ? is : localName; - - if (window.customElements.get(def)) { - return "break"; - } - - var getConstructor = function getConstructor(cnstrct) { - var baseClass = options && options["extends"] ? doc.createElement(options["extends"]).constructor : customizedBuiltIn ? doc.createElement(localName).constructor : window.HTMLElement; - /** - * Class wrapping base class. - */ - - return cnstrct ? /*#__PURE__*/function (_baseClass) { - _inherits(_class, _baseClass); - - var _super = _createSuper(_class); - - /** - * Calls user constructor. - */ - function _class() { - var _this; - - _classCallCheck(this, _class); - - _this = _super.call(this); - cnstrct.call(_assertThisInitialized(_this)); - return _this; - } - - return _class; - }(baseClass) : /*#__PURE__*/function (_baseClass2) { - _inherits(_class2, _baseClass2); - - var _super2 = _createSuper(_class2); - - function _class2() { - _classCallCheck(this, _class2); - - return _super2.apply(this, arguments); - } - - return _class2; - }(baseClass); - }; - - var cnstrctr = void 0, - options = void 0, - mixin = void 0; - - if (Array.isArray(attVal)) { - if (attVal.length <= 2) { - var _attVal3 = attVal; - - var _attVal4 = _slicedToArray(_attVal3, 2); - - cnstrctr = _attVal4[0]; - options = _attVal4[1]; - - if (typeof options === 'string') { - // Todo: Allow creating a definition without using it; - // that may be the only reason to have a string here which - // differs from the `localName` anyways - options = { - "extends": options - }; - } else if (options && !{}.hasOwnProperty.call(options, 'extends')) { - mixin = options; - } - - if (_typeof(cnstrctr) === 'object') { - mixin = cnstrctr; - cnstrctr = getConstructor(); - } - } else { - var _attVal5 = attVal; - - var _attVal6 = _slicedToArray(_attVal5, 3); - - cnstrctr = _attVal6[0]; - mixin = _attVal6[1]; - options = _attVal6[2]; - - if (typeof options === 'string') { - options = { - "extends": options - }; - } - } - } else if (typeof attVal === 'function') { - cnstrctr = attVal; - } else { - mixin = attVal; - cnstrctr = getConstructor(); - } - - if (!cnstrctr.toString().startsWith('class')) { - cnstrctr = getConstructor(cnstrctr); - } - - if (!options && customizedBuiltIn) { - options = { - "extends": localName - }; - } - - if (mixin) { - Object.entries(mixin).forEach(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - methodName = _ref2[0], - method = _ref2[1]; - - cnstrctr.prototype[methodName] = method; - }); - } // console.log('def', def, '::', typeof options === 'object' ? options : undefined); - - - window.customElements.define(def, cnstrctr, _typeof(options) === 'object' ? options : undefined); - return "break"; - }(); - - if (_ret === "break") break; - } - - case '$symbol': - { - var _attVal7 = attVal, - _attVal8 = _slicedToArray(_attVal7, 2), - symbol = _attVal8[0], - func = _attVal8[1]; - - if (typeof func === 'function') { - var funcBound = func.bind(elem); - - if (typeof symbol === 'string') { - elem[Symbol["for"](symbol)] = funcBound; - } else { - elem[symbol] = funcBound; - } - } else { - var obj = func; - obj.elem = elem; - - if (typeof symbol === 'string') { - elem[Symbol["for"](symbol)] = obj; - } else { - elem[symbol] = obj; - } - } - - break; - } - - case '$data': - { - setMap(attVal); - break; - } - - case '$attribute': - { - // Attribute node - var node = attVal.length === 3 ? doc.createAttributeNS(attVal[0], attVal[1]) : doc.createAttribute(attVal[0]); - node.value = attVal[attVal.length - 1]; - nodes[nodes.length] = node; - break; - } - - case '$text': - { - // Todo: Also allow as jml(['a text node']) (or should that become a fragment)? - var _node = doc.createTextNode(attVal); - - nodes[nodes.length] = _node; - break; - } - - case '$document': - { - // Todo: Conditionally create XML document - var _node2 = doc.implementation.createHTMLDocument(); - - if (attVal.childNodes) { - // Remove any extra nodes created by createHTMLDocument(). - var j = attVal.childNodes.length; - - while (_node2.childNodes[j]) { - var cn = _node2.childNodes[j]; - cn.remove(); // `j` should stay the same as removing will cause node to be present - } - - attVal.childNodes.forEach(_childrenToJML(_node2)); - } else { - if (attVal.$DOCTYPE) { - var dt = { - $DOCTYPE: attVal.$DOCTYPE - }; - var doctype = jml(dt); - - _node2.firstChild.replaceWith(doctype); - } - - var html = _node2.childNodes[1]; - var head = html.childNodes[0]; - var _body = html.childNodes[1]; - - if (attVal.title || attVal.head) { - var meta = doc.createElement('meta'); - meta.setAttribute('charset', 'utf-8'); - head.append(meta); - - if (attVal.title) { - _node2.title = attVal.title; // Appends after meta - } - - if (attVal.head) { - attVal.head.forEach(_appendJML(head)); - } - } - - if (attVal.body) { - attVal.body.forEach(_appendJMLOrText(_body)); - } - } - - nodes[nodes.length] = _node2; - break; - } - - case '$DOCTYPE': - { - var _node3 = doc.implementation.createDocumentType(attVal.name, attVal.publicId || '', attVal.systemId || ''); - - nodes[nodes.length] = _node3; - break; - } - - case '$on': - { - // Events - // Allow for no-op by defaulting to `{}` - for (var _i3 = 0, _Object$entries3 = Object.entries(attVal || {}); _i3 < _Object$entries3.length; _i3++) { - var _Object$entries3$_i = _slicedToArray(_Object$entries3[_i3], 2), - p2 = _Object$entries3$_i[0], - val = _Object$entries3$_i[1]; - - if (typeof val === 'function') { - val = [val, false]; - } - - if (typeof val[0] !== 'function') { - throw new TypeError("Expect a function for `$on`; args: ".concat(JSON.stringify(args))); - } - - _addEvent(elem, p2, val[0], val[1]); // element, event name, handler, capturing - - } - - break; - } - - case 'className': - case 'class': - attVal = checkPluginValue(elem, att, attVal, opts); - - if (!_isNullish(attVal)) { - elem.className = attVal; - } - - break; - - case 'dataset': - { - var _ret2 = function () { - // Map can be keyed with hyphenated or camel-cased properties - var recurse = function recurse(atVal, startProp) { - var prop = ''; - var pastInitialProp = startProp !== ''; - Object.keys(atVal).forEach(function (key) { - var value = atVal[key]; - - if (pastInitialProp) { - prop = startProp + key.replace(hyphenForCamelCase, _upperCase).replace(/^([a-z])/, _upperCase); - } else { - prop = startProp + key.replace(hyphenForCamelCase, _upperCase); - } - - if (value === null || _typeof(value) !== 'object') { - if (!_isNullish(value)) { - elem.dataset[prop] = value; - } - - prop = startProp; - return; - } - - recurse(value, prop); - }); - }; - - recurse(attVal, ''); - return "break"; // Todo: Disable this by default unless configuration explicitly allows (for security) - }(); - - if (_ret2 === "break") break; - } - // #if IS_REMOVE - // Don't remove this `if` block (for sake of no-innerHTML build) - - case 'innerHTML': - if (!_isNullish(attVal)) { - // eslint-disable-next-line no-unsanitized/property - elem.innerHTML = attVal; - } - - break; - // #endif - - case 'htmlFor': - case 'for': - if (elStr === 'label') { - attVal = checkPluginValue(elem, att, attVal, opts); - - if (!_isNullish(attVal)) { - elem.htmlFor = attVal; - } - - break; - } - - attVal = checkPluginValue(elem, att, attVal, opts); - elem.setAttribute(att, attVal); - break; - - case 'xmlns': - // Already handled - break; - - default: - { - if (att.startsWith('on')) { - attVal = checkPluginValue(elem, att, attVal, opts); - elem[att] = attVal; // _addEvent(elem, att.slice(2), attVal, false); // This worked, but perhaps the user wishes only one event - - break; - } - - if (att === 'style') { - attVal = checkPluginValue(elem, att, attVal, opts); - - if (_isNullish(attVal)) { - break; - } - - if (_typeof(attVal) === 'object') { - for (var _i4 = 0, _Object$entries4 = Object.entries(attVal); _i4 < _Object$entries4.length; _i4++) { - var _Object$entries4$_i = _slicedToArray(_Object$entries4[_i4], 2), - _p = _Object$entries4$_i[0], - styleVal = _Object$entries4$_i[1]; - - if (!_isNullish(styleVal)) { - // Todo: Handle aggregate properties like "border" - if (_p === 'float') { - elem.style.cssFloat = styleVal; - elem.style.styleFloat = styleVal; // Harmless though we could make conditional on older IE instead - } else { - elem.style[_p.replace(hyphenForCamelCase, _upperCase)] = styleVal; - } - } - } - - break; - } // setAttribute unfortunately erases any existing styles - - - elem.setAttribute(att, attVal); - /* - // The following reorders which is troublesome for serialization, e.g., as used in our testing - if (elem.style.cssText !== undefined) { - elem.style.cssText += attVal; - } else { // Opera - elem.style += attVal; - } - */ - - break; - } - - var matchingPlugin = getMatchingPlugin(opts, att); - - if (matchingPlugin) { - matchingPlugin.set({ - opts: opts, - element: elem, - attribute: { - name: att, - value: attVal - } - }); - break; - } - - attVal = checkPluginValue(elem, att, attVal, opts); - elem.setAttribute(att, attVal); - break; - } - } - } - } - - var nodes = []; - var elStr; - var opts; - var isRoot = false; - - if (_getType(args[0]) === 'object' && Object.keys(args[0]).some(function (key) { - return possibleOptions.includes(key); - })) { - opts = args[0]; - - if (opts.$state === undefined) { - isRoot = true; - opts.$state = 'root'; - } - - if (opts.$map && !opts.$map.root && opts.$map.root !== false) { - opts.$map = { - root: opts.$map - }; - } - - if ('$plugins' in opts) { - if (!Array.isArray(opts.$plugins)) { - throw new TypeError("`$plugins` must be an array; args: ".concat(JSON.stringify(args))); - } - - opts.$plugins.forEach(function (pluginObj) { - if (!pluginObj || _typeof(pluginObj) !== 'object') { - throw new TypeError("Plugin must be an object; args: ".concat(JSON.stringify(args))); - } - - if (!pluginObj.name || !pluginObj.name.startsWith('$_')) { - throw new TypeError("Plugin object name must be present and begin with `$_`; args: ".concat(JSON.stringify(args))); - } - - if (typeof pluginObj.set !== 'function') { - throw new TypeError("Plugin object must have a `set` method; args: ".concat(JSON.stringify(args))); - } - }); - } - - args = args.slice(1); - } else { - opts = { - $state: undefined - }; - } - - var argc = args.length; - var defaultMap = opts.$map && opts.$map.root; - - var setMap = function setMap(dataVal) { - var map, obj; // Boolean indicating use of default map and object - - if (dataVal === true) { - var _defaultMap = _slicedToArray(defaultMap, 2); - - map = _defaultMap[0]; - obj = _defaultMap[1]; - } else if (Array.isArray(dataVal)) { - // Array of strings mapping to default - if (typeof dataVal[0] === 'string') { - dataVal.forEach(function (dVal) { - setMap(opts.$map[dVal]); - }); - return; // Array of Map and non-map data object - } - - map = dataVal[0] || defaultMap[0]; - obj = dataVal[1] || defaultMap[1]; // Map - } else if (/^\[object (?:Weak)?Map\]$/.test([].toString.call(dataVal))) { - map = dataVal; - obj = defaultMap[1]; // Non-map data object - } else { - map = defaultMap[0]; - obj = dataVal; - } - - map.set(elem, obj); - }; - - for (var i = 0; i < argc; i++) { - var arg = args[i]; - - var type = _getType(arg); - - switch (type) { - default: - throw new TypeError("Unexpected type: ".concat(type, "; arg: ").concat(arg, "; index ").concat(i, " on args: ").concat(JSON.stringify(args))); - - case 'null': - // null always indicates a place-holder (only needed for last argument if want array returned) - if (i === argc - 1) { - _applyAnyStylesheet(nodes[0]); // We have to execute any stylesheets even if not appending or otherwise IE will never apply them - // Todo: Fix to allow application of stylesheets of style tags within fragments? - - - return nodes.length <= 1 ? nodes[0] // eslint-disable-next-line - : nodes.reduce(_fragReducer, doc.createDocumentFragment()); // nodes; - } - - throw new TypeError("`null` values not allowed except as final Jamilih argument; index ".concat(i, " on args: ").concat(JSON.stringify(args))); - - case 'string': - // Strings normally indicate elements - switch (arg) { - case '!': - nodes[nodes.length] = doc.createComment(args[++i]); - break; - - case '?': - { - arg = args[++i]; - var procValue = args[++i]; - var val = procValue; - - if (val && _typeof(val) === 'object') { - procValue = []; - - for (var _i5 = 0, _Object$entries5 = Object.entries(val); _i5 < _Object$entries5.length; _i5++) { - var _Object$entries5$_i = _slicedToArray(_Object$entries5[_i5], 2), - p = _Object$entries5$_i[0], - procInstVal = _Object$entries5$_i[1]; - - procValue.push(p + '=' + '"' + // https://www.w3.org/TR/xml-stylesheet/#NT-PseudoAttValue - procInstVal.replace(/"/g, '"') + '"'); - } - - procValue = procValue.join(' '); - } // Firefox allows instructions with ">" in this method, but not if placed directly! - - - try { - nodes[nodes.length] = doc.createProcessingInstruction(arg, procValue); - } catch (e) { - // Getting NotSupportedError in IE, so we try to imitate a processing instruction with a comment - // innerHTML didn't work - // var elContainer = doc.createElement('div'); - // elContainer.innerHTML = ''; - // nodes[nodes.length] = elContainer.innerHTML; - // Todo: any other way to resolve? Just use XML? - nodes[nodes.length] = doc.createComment('?' + arg + ' ' + procValue + '?'); - } - - break; // Browsers don't support doc.createEntityReference, so we just use this as a convenience - } - - case '&': - nodes[nodes.length] = _createSafeReference('entity', '', args[++i]); - break; - - case '#': - // // Decimal character reference - ['#', '01234'] // Ӓ // probably easier to use JavaScript Unicode escapes - nodes[nodes.length] = _createSafeReference('decimal', arg, String(args[++i])); - break; - - case '#x': - // Hex character reference - ['#x', '123a'] // ሺ // probably easier to use JavaScript Unicode escapes - nodes[nodes.length] = _createSafeReference('hexadecimal', arg, args[++i]); - break; - - case '![': - // '![', ['escaped <&> text'] // text]]> - // CDATA valid in XML only, so we'll just treat as text for mutual compatibility - // Todo: config (or detection via some kind of doc.documentType property?) of whether in XML - try { - nodes[nodes.length] = doc.createCDATASection(args[++i]); - } catch (e2) { - nodes[nodes.length] = doc.createTextNode(args[i]); // i already incremented - } - - break; - - case '': - nodes[nodes.length] = elem = doc.createDocumentFragment(); // Todo: Report to plugins - - opts.$state = 'fragment'; - break; - - default: - { - // An element - elStr = arg; - var atts = args[i + 1]; - - if (_getType(atts) === 'object' && atts.is) { - var is = atts.is; // istanbul ignore else - - if (doc.createElementNS) { - elem = doc.createElementNS(NS_HTML, elStr, { - is: is - }); - } else { - elem = doc.createElement(elStr, { - is: is - }); - } - } else - /* istanbul ignore else */ - if (doc.createElementNS) { - elem = doc.createElementNS(NS_HTML, elStr); - } else { - elem = doc.createElement(elStr); - } // Todo: Report to plugins - - - opts.$state = 'element'; - nodes[nodes.length] = elem; // Add to parent - - break; - } - } - - break; - - case 'object': - { - // Non-DOM-element objects indicate attribute-value pairs - var _atts = arg; - - if (_atts.xmlns !== undefined) { - // We handle this here, as otherwise may lose events, etc. - // As namespace of element already set as XHTML, we need to change the namespace - // elem.setAttribute('xmlns', atts.xmlns); // Doesn't work - // Can't set namespaceURI dynamically, renameNode() is not supported, and setAttribute() doesn't work to change the namespace, so we resort to this hack - var replacer = void 0; - - if (_typeof(_atts.xmlns) === 'object') { - replacer = _replaceDefiner(_atts.xmlns); - } else { - replacer = ' xmlns="' + _atts.xmlns + '"'; - } // try { - // Also fix DOMParser to work with text/html - - - elem = nodes[nodes.length - 1] = new win.DOMParser().parseFromString(new win.XMLSerializer().serializeToString(elem) // Mozilla adds XHTML namespace - .replace(' xmlns="' + NS_HTML + '"', replacer), 'application/xml').documentElement; // Todo: Report to plugins - - opts.$state = 'element'; // }catch(e) {alert(elem.outerHTML);throw e;} - } - - _checkAtts(_atts); - - break; - } - - case 'document': - case 'fragment': - case 'element': - /* - 1) Last element always the parent (put null if don't want parent and want to return array) unless only atts and children (no other elements) - 2) Individual elements (DOM elements or sequences of string[/object/array]) get added to parent first-in, first-added - */ - if (i === 0) { - // Allow wrapping of element, fragment, or document - elem = arg; // Todo: Report to plugins - - opts.$state = 'element'; - } - - if (i === argc - 1 || i === argc - 2 && args[i + 1] === null) { - // parent - var elsl = nodes.length; - - for (var k = 0; k < elsl; k++) { - _appendNode(arg, nodes[k]); - } // Todo: Apply stylesheets if any style tags were added elsewhere besides the first element? - - - _applyAnyStylesheet(nodes[0]); // We have to execute any stylesheets even if not appending or otherwise IE will never apply them - - } else { - nodes[nodes.length] = arg; - } - - break; - - case 'array': - { - // Arrays or arrays of arrays indicate child nodes - var child = arg; - var cl = child.length; - - for (var j = 0; j < cl; j++) { - // Go through children array container to handle elements - var childContent = child[j]; - - var childContentType = _typeof(childContent); - - if (_isNullish(childContent)) { - throw new TypeError("Bad children (parent array: ".concat(JSON.stringify(args), "; index ").concat(j, " of child: ").concat(JSON.stringify(child), ")")); - } - - switch (childContentType) { - // Todo: determine whether null or function should have special handling or be converted to text - case 'string': - case 'number': - case 'boolean': - _appendNode(elem, doc.createTextNode(childContent)); - - break; - - default: - if (Array.isArray(childContent)) { - // Arrays representing child elements - opts.$state = 'children'; - - _appendNode(elem, jml.apply(void 0, [opts].concat(_toConsumableArray(childContent)))); - } else if (childContent['#']) { - // Fragment - opts.$state = 'fragmentChildren'; - - _appendNode(elem, jml(opts, childContent['#'])); - } else { - // Single DOM element children - var newChildContent = checkPluginValue(elem, null, childContent, opts); - - _appendNode(elem, newChildContent); - } - - break; - } - } - - break; - } - } - } - - var ret = nodes[0] || elem; - - if (isRoot && opts.$map && opts.$map.root) { - setMap(true); - } - - return ret; - }; - /** - * Converts a DOM object or a string of HTML into a Jamilih object (or string). - * @param {string|HTMLElement} dom If a string, will parse as document - * @param {PlainObject} [config] Configuration object - * @param {boolean} [config.stringOutput=false] Whether to output the Jamilih object as a string. - * @param {boolean} [config.reportInvalidState=true] If true (the default), will report invalid state errors - * @param {boolean} [config.stripWhitespace=false] Strip whitespace for text nodes - * @returns {JamilihArray|string} Array containing the elements which represent - * a Jamilih object, or, if `stringOutput` is true, it will be the stringified - * version of such an object - */ - - - jml.toJML = function (dom) { - var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, - _ref3$stringOutput = _ref3.stringOutput, - stringOutput = _ref3$stringOutput === void 0 ? false : _ref3$stringOutput, - _ref3$reportInvalidSt = _ref3.reportInvalidState, - reportInvalidState = _ref3$reportInvalidSt === void 0 ? true : _ref3$reportInvalidSt, - _ref3$stripWhitespace = _ref3.stripWhitespace, - stripWhitespace = _ref3$stripWhitespace === void 0 ? false : _ref3$stripWhitespace; - - if (typeof dom === 'string') { - dom = new win.DOMParser().parseFromString(dom, 'text/html'); // todo: Give option for XML once implemented and change JSDoc to allow for Element - } - - var ret = []; - var parent = ret; - var parentIdx = 0; - /** - * @param {string} msg - * @throws {DOMException} - * @returns {void} - */ - - function invalidStateError(msg) { - // These are probably only necessary if working with text/html - - /* eslint-disable no-shadow, unicorn/custom-error-definition */ - - /** - * Polyfill for `DOMException`. - */ - var DOMException = /*#__PURE__*/function (_Error) { - _inherits(DOMException, _Error); - - var _super3 = _createSuper(DOMException); - - /* eslint-enable no-shadow, unicorn/custom-error-definition */ - - /** - * @param {string} message - * @param {string} name - */ - function DOMException(message, name) { - var _this2; - - _classCallCheck(this, DOMException); - - _this2 = _super3.call(this, message); // eslint-disable-next-line unicorn/custom-error-definition - - _this2.name = name; - return _this2; - } - - return DOMException; - }( /*#__PURE__*/_wrapNativeSuper(Error)); - - if (reportInvalidState) { - // INVALID_STATE_ERR per section 9.3 XHTML 5: http://www.w3.org/TR/html5/the-xhtml-syntax.html - var e = new DOMException(msg, 'INVALID_STATE_ERR'); - e.code = 11; - throw e; - } - } - /** - * - * @param {DocumentType|Entity} obj - * @param {Node} node - * @returns {void} - */ - - - function addExternalID(obj, node) { - if (node.systemId.includes('"') && node.systemId.includes("'")) { - invalidStateError('systemId cannot have both single and double quotes.'); - } - - var publicId = node.publicId, - systemId = node.systemId; - - if (systemId) { - obj.systemId = systemId; - } - - if (publicId) { - obj.publicId = publicId; - } - } - /** - * - * @param {any} val - * @returns {void} - */ - - - function set(val) { - parent[parentIdx] = val; - parentIdx++; - } - /** - * @returns {void} - */ - - - function setChildren() { - set([]); - parent = parent[parentIdx - 1]; - parentIdx = 0; - } - /** - * - * @param {string} prop1 - * @param {string} prop2 - * @returns {void} - */ - - - function setObj(prop1, prop2) { - parent = parent[parentIdx - 1][prop1]; - parentIdx = 0; - - if (prop2) { - parent = parent[prop2]; - } - } - /** - * - * @param {Node} node - * @param {object<{string: string}>} namespaces - * @returns {void} - */ - - - function parseDOM(node, namespaces) { - // namespaces = clone(namespaces) || {}; // Ensure we're working with a copy, so different levels in the hierarchy can treat it differently - - /* - if ((node.prefix && node.prefix.includes(':')) || (node.localName && node.localName.includes(':'))) { - invalidStateError('Prefix cannot have a colon'); - } - */ - var type = 'nodeType' in node ? node.nodeType : null; - namespaces = _extends({}, namespaces); - var xmlChars = /^([\t\n\r -\uD7FF\uE000-\uFFFD]|(?:[\uD800-\uDBFF](?![\uDC00-\uDFFF]))(?:(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]))*$/; // eslint-disable-line no-control-regex - - if ([2, 3, 4, 7, 8].includes(type) && !xmlChars.test(node.nodeValue)) { - invalidStateError('Node has bad XML character value'); - } - - var tmpParent, tmpParentIdx; - /** - * @returns {void} - */ - - function setTemp() { - tmpParent = parent; - tmpParentIdx = parentIdx; - } - /** - * @returns {void} - */ - - - function resetTemp() { - parent = tmpParent; - parentIdx = tmpParentIdx; - parentIdx++; // Increment index in parent container of this element - } - - switch (type) { - case 1: - { - // ELEMENT - setTemp(); - var nodeName = node.nodeName.toLowerCase(); // Todo: for XML, should not lower-case - - setChildren(); // Build child array since elements are, except at the top level, encapsulated in arrays - - set(nodeName); - var start = {}; - var hasNamespaceDeclaration = false; - - if (namespaces[node.prefix || ''] !== node.namespaceURI) { - namespaces[node.prefix || ''] = node.namespaceURI; - - if (node.prefix) { - start['xmlns:' + node.prefix] = node.namespaceURI; - } else if (node.namespaceURI) { - start.xmlns = node.namespaceURI; - } else { - start.xmlns = null; - } - - hasNamespaceDeclaration = true; - } - - if (node.attributes.length) { - set(_toConsumableArray(node.attributes).reduce(function (obj, att) { - obj[att.name] = att.value; // Attr.nodeName and Attr.nodeValue are deprecated as of DOM4 as Attr no longer inherits from Node, so we can safely use name and value - - return obj; - }, start)); - } else if (hasNamespaceDeclaration) { - set(start); - } - - var childNodes = node.childNodes; - - if (childNodes.length) { - setChildren(); // Element children array container - - _toConsumableArray(childNodes).forEach(function (childNode) { - parseDOM(childNode, namespaces); - }); - } - - resetTemp(); - break; - } - - case undefined: // Treat as attribute node until this is fixed: https://github.com/jsdom/jsdom/issues/1641 / https://github.com/jsdom/jsdom/pull/1822 - - case 2: - // ATTRIBUTE (should only get here if passing in an attribute node) - set({ - $attribute: [node.namespaceURI, node.name, node.value] - }); - break; - - case 3: - // TEXT - if (stripWhitespace && /^[\t-\r \xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+$/.test(node.nodeValue)) { - set(''); - return; - } - - set(node.nodeValue); - break; - - case 4: - // CDATA - if (node.nodeValue.includes(']]' + '>')) { - invalidStateError('CDATA cannot end with closing ]]>'); - } - - set(['![', node.nodeValue]); - break; - - case 5: - // ENTITY REFERENCE (though not in browsers (was already resolved - // anyways), ok to keep for parity with our "entity" shorthand) - set(['&', node.nodeName]); - break; - - case 7: - // PROCESSING INSTRUCTION - if (/^xml$/i.test(node.target)) { - invalidStateError('Processing instructions cannot be "xml".'); - } - - if (node.target.includes('?>')) { - invalidStateError('Processing instruction targets cannot include ?>'); - } - - if (node.target.includes(':')) { - invalidStateError('The processing instruction target cannot include ":"'); - } - - if (node.data.includes('?>')) { - invalidStateError('Processing instruction data cannot include ?>'); - } - - set(['?', node.target, node.data]); // Todo: Could give option to attempt to convert value back into object if has pseudo-attributes - - break; - - case 8: - // COMMENT - if (node.nodeValue.includes('--') || node.nodeValue.length && node.nodeValue.lastIndexOf('-') === node.nodeValue.length - 1) { - invalidStateError('Comments cannot include --'); - } - - set(['!', node.nodeValue]); - break; - - case 9: - { - // DOCUMENT - setTemp(); - var docObj = { - $document: { - childNodes: [] - } + const {payload, info: { + results: numResults, + pages, + current_page: currentPage + }} = json; + + // $('#page')[0].value = currentPage; + // $('#page')[0].max = pages; + + // Unused properties: + // - `svg_filesize` always 0? + // - `dimensions: { + // png_thumb: {width, height}, + // png_full_lossy: {width, height} + // }` object of relevance? + // - No need for `tags` with `tags_array` + // - `svg`'s: `png_thumb`, `png_full_lossy`, `png_2400px` + const semiColonSep = '; ' + nbsp; + $('#results').jml('div', [ + ['span', [ + 'Number of results: ', + numResults + ]], + semiColonSep, + ['span', [ + 'page ', + currentPage, + ' out of ', + pages + ]], + ...payload.map(({ + title, description, id, + uploader, created, + svg: {url: svgURL}, + detail_link: detailLink, + tags_array: tagsArray, + downloaded_by: downloadedBy, + total_favorites: totalFavorites + }) => { + const imgHW = '100px'; + const colonSep = ': ' + nbsp; + return ['div', [ + ['button', {style: 'margin-right: 8px; border: 2px solid black;', dataset: {id, value: svgURL}, $on: { + async click (e) { + e.preventDefault(); + const {value: svgurl} = this.dataset; + // console.log('this', id, svgurl); + const post = (message) => { + // Todo: Make origin customizable as set by opening window + // Todo: If dropping IE9, avoid stringifying + window.parent.postMessage(JSON.stringify({ + namespace: 'imagelib', + ...message + }), '*'); }; - set(docObj); // doc.implementation.createHTMLDocument - // Set position to fragment's array children - - setObj('$document', 'childNodes'); - var _childNodes = node.childNodes; - - if (!_childNodes.length) { - invalidStateError('Documents must have a child node'); - } // set({$xmlDocument: []}); // doc.implementation.createDocument // Todo: use this conditionally - - - _toConsumableArray(_childNodes).forEach(function (childNode) { - // Can't just do documentElement as there may be doctype, comments, etc. - // No need for setChildren, as we have already built the container array - parseDOM(childNode, namespaces); + // Send metadata (also indicates file is about to be sent) + post({ + name: title, + id: svgurl + }); + const result = await fetch(svgurl); + const svg = await result.text(); + // console.log('url and svg', svgurl, svg); + post({ + href: svgurl, + data: svg }); - - resetTemp(); - break; } - - case 10: - { - // DOCUMENT TYPE - setTemp(); // Can create directly by doc.implementation.createDocumentType - - var _start = { - $DOCTYPE: { - name: node.name + }}, [ + // If we wanted interactive versions despite security risk: + // ['object', {data: svgURL, type: 'image/svg+xml'}] + ['img', {src: svgURL, style: `width: ${imgHW}; height: ${imgHW};`}] + ]], + ['b', [title]], + ' ', + ['i', [description]], + ' ', + ['span', [ + '(ID: ', + ['a', { + href: jsVoid, + dataset: {value: id}, + $on: { + click (e) { + e.preventDefault(); + const {value} = this.dataset; + $('#byids')[0].$set(value); + $('#openclipart')[0].$submit(); } - }; - var pubIdChar = /^( |\r|\n|[0-9A-Za-z]|[!#-%'-\/:;=\?@_])*$/; // eslint-disable-line no-control-regex - - if (!pubIdChar.test(node.publicId)) { - invalidStateError('A publicId must have valid characters.'); } - - addExternalID(_start.$DOCTYPE, node); // Fit in internal subset along with entities?: probably don't need as these would only differ if from DTD, and we're not rebuilding the DTD - - set(_start); // Auto-generate the internalSubset instead? - - resetTemp(); - break; - } - - case 11: - { - // DOCUMENT FRAGMENT - setTemp(); - set({ - '#': [] - }); // Set position to fragment's array children - - setObj('#'); - var _childNodes2 = node.childNodes; - - _toConsumableArray(_childNodes2).forEach(function (childNode) { - // No need for setChildren, as we have already built the container array - parseDOM(childNode, namespaces); - }); - - resetTemp(); - break; - } - - default: - throw new TypeError('Not an XML type'); - } - } - - parseDOM(dom, {}); - - if (stringOutput) { - return JSON.stringify(ret[0]); - } - - return ret[0]; - }; - - jml.toJMLString = function (dom, config) { - return jml.toJML(dom, Object.assign(config || {}, { - stringOutput: true - })); - }; - /** - * - * @param {...JamilihArray} args - * @returns {JamilihReturn} - */ - - - jml.toDOM = function () { - // Alias for jml() - return jml.apply(void 0, arguments); - }; - /** - * - * @param {...JamilihArray} args - * @returns {string} - */ - - - jml.toHTML = function () { - // Todo: Replace this with version of jml() that directly builds a string - var ret = jml.apply(void 0, arguments); // Todo: deal with serialization of properties like 'selected', - // 'checked', 'value', 'defaultValue', 'for', 'dataset', 'on*', - // 'style'! (i.e., need to build a string ourselves) - - return ret.outerHTML; - }; - /** - * - * @param {...JamilihArray} args - * @returns {string} - */ - - - jml.toDOMString = function () { - // Alias for jml.toHTML for parity with jml.toJMLString - return jml.toHTML.apply(jml, arguments); - }; - /** - * - * @param {...JamilihArray} args - * @returns {string} - */ - - - jml.toXML = function () { - var ret = jml.apply(void 0, arguments); - return new win.XMLSerializer().serializeToString(ret); - }; - /** - * - * @param {...JamilihArray} args - * @returns {string} - */ - - - jml.toXMLDOMString = function () { - // Alias for jml.toXML for parity with jml.toJMLString - return jml.toXML.apply(jml, arguments); - }; - /** - * Element-aware wrapper for `Map`. - */ - - - var JamilihMap = /*#__PURE__*/function (_Map) { - _inherits(JamilihMap, _Map); - - var _super4 = _createSuper(JamilihMap); - - function JamilihMap() { - _classCallCheck(this, JamilihMap); - - return _super4.apply(this, arguments); - } - - _createClass(JamilihMap, [{ - key: "get", - - /** - * @param {string|Element} elem - * @returns {any} - */ - value: function get(elem) { - elem = typeof elem === 'string' ? $(elem) : elem; - return _get(_getPrototypeOf(JamilihMap.prototype), "get", this).call(this, elem); - } - /** - * @param {string|Element} elem - * @param {any} value - * @returns {any} - */ - - }, { - key: "set", - value: function set(elem, value) { - elem = typeof elem === 'string' ? $(elem) : elem; - return _get(_getPrototypeOf(JamilihMap.prototype), "set", this).call(this, elem, value); - } - /** - * @param {string|Element} elem - * @param {string} methodName - * @param {...any} args - * @returns {any} - */ - - }, { - key: "invoke", - value: function invoke(elem, methodName) { - var _this$get; - - elem = typeof elem === 'string' ? $(elem) : elem; - - for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) { - args[_key2 - 2] = arguments[_key2]; - } - - return (_this$get = this.get(elem))[methodName].apply(_this$get, [elem].concat(args)); - } - }]); - - return JamilihMap; - }( /*#__PURE__*/_wrapNativeSuper(Map)); - /** - * Element-aware wrapper for `WeakMap`. - */ - - - var JamilihWeakMap = /*#__PURE__*/function (_WeakMap) { - _inherits(JamilihWeakMap, _WeakMap); - - var _super5 = _createSuper(JamilihWeakMap); - - function JamilihWeakMap() { - _classCallCheck(this, JamilihWeakMap); - - return _super5.apply(this, arguments); - } - - _createClass(JamilihWeakMap, [{ - key: "get", - - /** - * @param {string|Element} elem - * @returns {any} - */ - value: function get(elem) { - elem = typeof elem === 'string' ? $(elem) : elem; - return _get(_getPrototypeOf(JamilihWeakMap.prototype), "get", this).call(this, elem); - } - /** - * @param {string|Element} elem - * @param {any} value - * @returns {any} - */ - - }, { - key: "set", - value: function set(elem, value) { - elem = typeof elem === 'string' ? $(elem) : elem; - return _get(_getPrototypeOf(JamilihWeakMap.prototype), "set", this).call(this, elem, value); - } - /** - * @param {string|Element} elem - * @param {string} methodName - * @param {...any} args - * @returns {any} - */ - - }, { - key: "invoke", - value: function invoke(elem, methodName) { - var _this$get2; - - elem = typeof elem === 'string' ? $(elem) : elem; - - for (var _len3 = arguments.length, args = new Array(_len3 > 2 ? _len3 - 2 : 0), _key3 = 2; _key3 < _len3; _key3++) { - args[_key3 - 2] = arguments[_key3]; - } - - return (_this$get2 = this.get(elem))[methodName].apply(_this$get2, [elem].concat(args)); - } - }]); - - return JamilihWeakMap; - }( /*#__PURE__*/_wrapNativeSuper(WeakMap)); - - jml.Map = JamilihMap; - jml.WeakMap = JamilihWeakMap; - /** - * @typedef {GenericArray} MapAndElementArray - * @property {JamilihWeakMap|JamilihMap} 0 - * @property {Element} 1 - */ - - /** - * @param {GenericObject} obj - * @param {...JamilihArray} args - * @returns {MapAndElementArray} - */ - - jml.weak = function (obj) { - var map = new JamilihWeakMap(); - - for (var _len4 = arguments.length, args = new Array(_len4 > 1 ? _len4 - 1 : 0), _key4 = 1; _key4 < _len4; _key4++) { - args[_key4 - 1] = arguments[_key4]; - } - - var elem = jml.apply(void 0, [{ - $map: [map, obj] - }].concat(args)); - return [map, elem]; - }; - /** - * @param {any} obj - * @param {...JamilihArray} args - * @returns {MapAndElementArray} - */ - - - jml.strong = function (obj) { - var map = new JamilihMap(); - - for (var _len5 = arguments.length, args = new Array(_len5 > 1 ? _len5 - 1 : 0), _key5 = 1; _key5 < _len5; _key5++) { - args[_key5 - 1] = arguments[_key5]; - } - - var elem = jml.apply(void 0, [{ - $map: [map, obj] - }].concat(args)); - return [map, elem]; - }; - /** - * @param {string|Element} elem If a string, will be interpreted as a selector - * @param {symbol|string} sym If a string, will be used with `Symbol.for` - * @returns {any} The value associated with the symbol - */ - - - jml.symbol = jml.sym = jml["for"] = function (elem, sym) { - elem = typeof elem === 'string' ? $(elem) : elem; - return elem[_typeof(sym) === 'symbol' ? sym : Symbol["for"](sym)]; - }; - /** - * @param {string|Element} elem If a string, will be interpreted as a selector - * @param {symbol|string|Map|WeakMap} symOrMap If a string, will be used with `Symbol.for` - * @param {string|any} methodName Can be `any` if the symbol or map directly - * points to a function (it is then used as the first argument). - * @param {any[]} args - * @returns {any} - */ - - - jml.command = function (elem, symOrMap, methodName) { - var _func3; - - elem = typeof elem === 'string' ? $(elem) : elem; - var func; - - for (var _len6 = arguments.length, args = new Array(_len6 > 3 ? _len6 - 3 : 0), _key6 = 3; _key6 < _len6; _key6++) { - args[_key6 - 3] = arguments[_key6]; - } - - if (['symbol', 'string'].includes(_typeof(symOrMap))) { - var _func; - - func = jml.sym(elem, symOrMap); - - if (typeof func === 'function') { - return func.apply(void 0, [methodName].concat(args)); // Already has `this` bound to `elem` - } - - return (_func = func)[methodName].apply(_func, args); - } - - func = symOrMap.get(elem); - - if (typeof func === 'function') { - var _func2; - - return (_func2 = func).call.apply(_func2, [elem, methodName].concat(args)); - } - - return (_func3 = func)[methodName].apply(_func3, [elem].concat(args)); // return func[methodName].call(elem, ...args); - }; - /** - * Expects properties `document`, `XMLSerializer`, and `DOMParser`. - * Also updates `body` with `document.body`. - * @param {Window} wind - * @returns {void} - */ - - - jml.setWindow = function (wind) { - win = wind; - doc = win.document; - - if (doc && doc.body) { - var _doc = doc; - body = _doc.body; - } - }; - /** - * @returns {Window} - */ - - - jml.getWindow = function () { - return win; - }; - - - var body = doc && doc.body; // eslint-disable-line import/no-mutable-exports - - var nbsp = "\xA0"; // Very commonly needed in templates - - /** - * ISC License - * - * Copyright (c) 2018, Andrea Giammarchi, @WebReflection - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH - * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, - * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM - * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - var QueryResult = /*#__PURE__*/function (_Array) { - _inherits(QueryResult, _Array); - - var _super = _createSuper(QueryResult); - - function QueryResult() { - _classCallCheck(this, QueryResult); - - return _super.apply(this, arguments); - } - - return QueryResult; - }( /*#__PURE__*/_wrapNativeSuper(Array)); - - var create = Object.create, - defineProperty = Object.defineProperty; - var AP = Array.prototype; - var DOM_CONTENT_LOADED = 'DOMContentLoaded'; - var LOAD = 'load'; - var NO_TRANSPILER_ISSUES = new QueryResult() instanceof QueryResult; - var QRP = QueryResult.prototype; // fixes methods returning non QueryResult - - /* istanbul ignore if */ - - if (!NO_TRANSPILER_ISSUES) Object.getOwnPropertyNames(AP).forEach(function (name) { - var desc = Object.getOwnPropertyDescriptor(AP, name); - - if (typeof desc.value === 'function') { - var fn = desc.value; - - desc.value = function () { - var result = fn.apply(this, arguments); - return result instanceof Array ? patch(result) : result; - }; - } - - defineProperty(QRP, name, desc); - }); // fixes badly transpiled classes - - var patch = NO_TRANSPILER_ISSUES ? function (qr) { - return qr; - } : - /* istanbul ignore next */ - function (qr) { - var nqr = create(QRP); - push.apply(nqr, slice(qr)); - return nqr; - }; - var push = AP.push; - - var search = function search(list, el) { - var nodes = []; - var length = list.length; - - for (var i = 0; i < length; i++) { - var css = list[i].trim(); - - if (css.slice(-6) === ':first') { - var node = el.querySelector(css.slice(0, -6)); - if (node) push.call(nodes, node); - } else push.apply(nodes, slice(el.querySelectorAll(css))); - } - - return _construct(QueryResult, nodes); - }; - - var slice = NO_TRANSPILER_ISSUES ? patch : - /* istanbul ignore next */ - function (all) { - // do not use slice.call(...) due old IE gotcha - var nodes = []; - var length = all.length; - - for (var i = 0; i < length; i++) { - nodes[i] = all[i]; - } - - return nodes; - }; // use function to avoid usage of Symbol.hasInstance - // (broken in older browsers anyway) - - var $$1 = function $(CSS) { - var parent = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : document; - - switch (_typeof(CSS)) { - case 'string': - return patch(search(CSS.split(','), parent)); - - case 'object': - // needed to avoid iterator dance (breaks in older IEs) - var nodes = []; - var all = 'nodeType' in CSS || 'postMessage' in CSS ? [CSS] : CSS; - push.apply(nodes, slice(all)); - return patch(_construct(QueryResult, nodes)); - - case 'function': - var $parent = $(parent); - var $window = $(parent.defaultView); - var handler = { - handleEvent: function handleEvent(event) { - $parent.off(DOM_CONTENT_LOADED, handler); - $window.off(LOAD, handler); - CSS(event); - } - }; - $parent.on(DOM_CONTENT_LOADED, handler); - $window.on(LOAD, handler); - var rs = parent.readyState; - if (rs == 'complete' || rs != 'loading' && !parent.documentElement.doScroll) setTimeout(function () { - return $parent.dispatch(DOM_CONTENT_LOADED); - }); - return $; - } - }; - - $$1.prototype = QRP; - - $$1.extend = function (key, value) { - return defineProperty(QRP, key, { - configurable: true, - value: value - }), $$1; - }; // dropped usage of for-of to avoid broken iteration dance in older IEs - - - $$1.extend('dispatch', function dispatch(type) { - var init = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var event = new CustomEvent(type, init); - var length = this.length; - - for (var i = 0; i < length; i++) { - this[i].dispatchEvent(event); - } - - return this; - }).extend('off', function off(type, handler) { - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var length = this.length; - - for (var i = 0; i < length; i++) { - this[i].removeEventListener(type, handler, options); - } - - return this; - }).extend('on', function on(type, handler) { - var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; - var length = this.length; - - for (var i = 0; i < length; i++) { - this[i].addEventListener(type, handler, options); - } - - return this; - }); - - function _typeof$1(obj) { - "@babel/helpers - typeof"; - - if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { - _typeof$1 = function _typeof(obj) { - return typeof obj; - }; - } else { - _typeof$1 = function _typeof(obj) { - return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; - }; - } - - return _typeof$1(obj); - } - - function _slicedToArray$1(arr, i) { - return _arrayWithHoles$1(arr) || _iterableToArrayLimit$1(arr, i) || _unsupportedIterableToArray$1(arr, i) || _nonIterableRest$1(); - } - - function _toConsumableArray$1(arr) { - return _arrayWithoutHoles$1(arr) || _iterableToArray$1(arr) || _unsupportedIterableToArray$1(arr) || _nonIterableSpread$1(); - } - - function _arrayWithoutHoles$1(arr) { - if (Array.isArray(arr)) return _arrayLikeToArray$1(arr); - } - - function _arrayWithHoles$1(arr) { - if (Array.isArray(arr)) return arr; - } - - function _iterableToArray$1(iter) { - if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); - } - - function _iterableToArrayLimit$1(arr, i) { - if (typeof Symbol === "undefined" || !(Symbol.iterator in Object(arr))) return; - var _arr = []; - var _n = true; - var _d = false; - var _e = undefined; - - try { - for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { - _arr.push(_s.value); - - if (i && _arr.length === i) break; - } - } catch (err) { - _d = true; - _e = err; - } finally { - try { - if (!_n && _i["return"] != null) _i["return"](); - } finally { - if (_d) throw _e; - } - } - - return _arr; - } - - function _unsupportedIterableToArray$1(o, minLen) { - if (!o) return; - if (typeof o === "string") return _arrayLikeToArray$1(o, minLen); - var n = Object.prototype.toString.call(o).slice(8, -1); - if (n === "Object" && o.constructor) n = o.constructor.name; - if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray$1(o, minLen); - } - - function _arrayLikeToArray$1(arr, len) { - if (len == null || len > arr.length) len = arr.length; - - for (var i = 0, arr2 = new Array(len); i < len; i++) { - arr2[i] = arr[i]; - } - - return arr2; - } - - function _nonIterableSpread$1() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function _nonIterableRest$1() { - throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); - } - - function convertToString(content, type) { - switch (_typeof$1(content)) { - case 'object': - { - if (!content) { - throw new TypeError('Cannot supply `null`'); - } - - switch (content.nodeType) { - case 1: - { - // ELEMENT - return content.outerHTML; - } - - case 3: - { - // TEXT - return content.nodeValue; - } - - case 11: - { - // DOCUMENT_FRAGMENT_NODE - return _toConsumableArray$1(content.childNodes).reduce(function (s, node) { - return s + convertToString(node, type); - }, ''); - } - - case undefined: - // Array of nodes, QueryResult objects - // if (Array.isArray(content)) { - if (typeof content.reduce === 'function') { - return content.reduce(function (s, node) { - return s + convertToString(node, type); - }, ''); - } - - break; - } - - return undefined; - } - - case 'string': - { - return content; - } - - default: - throw new TypeError('Bad content for ' + type + '; type: ' + _typeof$1(content)); - } - } - - function convertToDOM(content, type, avoidClone) { - switch (_typeof$1(content)) { - case 'object': - { - if (!content) { - throw new TypeError('Cannot supply `null`'); - } - - if ([1, // ELEMENT - 3, // TEXT - 11 // Document fragment - ].includes(content.nodeType)) { - return avoidClone ? content : content.cloneNode(true); - } - - if (typeof content.reduce !== 'function') { - throw new TypeError('Unrecognized type of object for conversion to DOM'); - } // Array of nodes, QueryResult objects - - - return avoidClone ? content : content.map(function (node) { - if (!node || !node.cloneNode) { - // Allows for arrays of HTML strings - return convertToDOM(node, type, false); - } - - return node.cloneNode(true); - }); - } - - case 'string': - { - var div = document.createElement('div'); // eslint-disable-next-line no-unsanitized/property - - div.innerHTML = content; - return div.firstElementChild || div.firstChild; - } - - default: - throw new TypeError('Bad content for ' + type + '; type: ' + _typeof$1(content)); - } - } - - function insert(type) { - return function () { - var _this = this; - - for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - var cbOrContent = args[0]; - - switch (_typeof$1(cbOrContent)) { - case 'function': - { - this.forEach(function (node, i) { - var ret = cbOrContent.call(_this, i, node.textContent); - node[type](ret); - }); - break; - } - - default: - { - this.forEach(function (node, i, arr) { - node[type].apply(node, _toConsumableArray$1(args.flatMap(function (content) { - return convertToDOM(content, type, i === arr.length - 1); - }))); - }); - break; - } - } - - return this; - }; - } - - function insertText(type) { - return function (cbOrContent) { - var _this2 = this; - - switch (_typeof$1(cbOrContent)) { - case 'function': - { - this.forEach(function (node, i) { - var ret = cbOrContent.call(_this2, i, node[type]); - node[type] = convertToString(ret, type); - }); - break; - } - - default: - { - this.forEach(function (node) { - node[type] = convertToString(cbOrContent, type); - }); - break; - } - } - - return this; - }; - } - - var after = insert('after'); - var before = insert('before'); - var append = insert('append'); - var prepend = insert('prepend'); - var html = insertText('innerHTML'); - var text = insertText('textContent'); - /* - // Todo: - export const val = function (valueOrFunc) { - - }; - */ - // Given that these types require a selector engine and - // in order to avoid the absence of optimization of `document.querySelectorAll` - // for `:first-child` and different behavior in different contexts, - // and to avoid making a mutual dependency with query-result, - // exports of this type accept a QueryResult instance; - // if selected without a second argument, we do default to - // `document.querySelectorAll`, however. - - var insertTo = function insertTo(method) { - var $ = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function (sel) { - return _toConsumableArray$1(document.querySelectorAll(sel)); - }; - var type = { - appendTo: 'append', - prependTo: 'prepend', - insertAfter: 'after', - insertBefore: 'before' - }[method] || 'append'; - return function (target) { - var toType = type + 'To'; - this.forEach(function (node, i, arr) { - if (typeof target === 'string' && target.charAt(0) !== '<') { - target = $(target); - } - - target = Array.isArray(target) ? target : [target]; - node[type].apply(node, _toConsumableArray$1(target.flatMap(function (content) { - return convertToDOM(content, toType, i === arr.length - 1); - }))); - }); - return this; - }; - }; // Todo: optional `withDataAndEvents` and `deepWithDataAndEvents` arguments? - - - var clone = function clone() { - return this.map(function (node) { - // Still a QueryResult with such a map - return node.cloneNode(true); - }); - }; - - var empty = function empty() { - this.forEach(function (node) { - node.textContent = ''; - }); - }; - - var remove = function remove(selector) { - if (selector) { - this.forEach(function (node) { - if (node.matches(selector)) { - // Todo: Use query-result instead? - node.remove(); - } - }); - } else { - this.forEach(function (node) { - node.remove(); - }); - } - - return this; - }; - /* - // Todo: - export const detach = function (selector) { - // Should preserve attached data - return remove(selector); - }; - */ - - - var attr = function attr(attributeNameOrAtts, valueOrCb) { - var _this3 = this; - - if (valueOrCb === undefined) { - switch (_typeof$1(attributeNameOrAtts)) { - case 'string': - { - return this[0].hasAttribute(attributeNameOrAtts) ? this[0].getAttribute(attributeNameOrAtts) : undefined; - } - - case 'object': - { - if (attributeNameOrAtts) { - this.forEach(function (node, i) { - Object.entries(attributeNameOrAtts).forEach(function (_ref) { - var _ref2 = _slicedToArray$1(_ref, 2), - att = _ref2[0], - val = _ref2[1]; - - node.setAttribute(att, val); - }); - }); - return this; + }, [id]], + ')' + ]], + ' ', + ['i', [ + ['a', { + href: detailLink, + target: '_blank' + }, ['Details']] + ]], + ['br'], + ['span', [ + ['u', ['Uploaded by']], colonSep, + queryLink(uploader), + semiColonSep + ]], + ['span', [ + ['u', ['Download count']], colonSep, + downloadedBy, + semiColonSep + ]], + ['span', [ + ['u', ['Times used as favorite']], colonSep, + totalFavorites, + semiColonSep + ]], + ['span', [ + ['u', ['Created date']], colonSep, + created + ]], + ['br'], + ['u', ['Tags']], colonSep, + ...tagsArray.map((tag) => { + return ['span', [ + ' ', + queryLink(tag) + ]]; + }) + ]]; + }), + ['br'], ['br'], + (currentPage === 1 || pages <= 2 + ? '' + : ['span', [ + ['a', { + href: jsVoid, + $on: { + click (e) { + e.preventDefault(); + $('#page')[0].value = 1; + $('#openclipart')[0].$submit(); } } - // Fallthrough - - default: - { - throw new TypeError('Unexpected type for attribute name: ' + _typeof$1(attributeNameOrAtts)); - } - } - } - - switch (_typeof$1(valueOrCb)) { - case 'function': - { - this.forEach(function (node, i) { - var ret = valueOrCb.call(_this3, i, node.getAttribute(valueOrCb)); - - if (ret === null) { - node.removeAttribute(attributeNameOrAtts); - } else { - node.setAttribute(attributeNameOrAtts, ret); + }, ['First']], + ' ' + ]] + ), + (currentPage === 1 + ? '' + : ['span', [ + ['a', { + href: jsVoid, + $on: { + click (e) { + e.preventDefault(); + $('#page')[0].value = currentPage - 1; + $('#openclipart')[0].$submit(); } - }); - break; - } - - case 'string': - { - this.forEach(function (node, i) { - node.setAttribute(attributeNameOrAtts, valueOrCb); - }); - break; - } - - case 'object': - { - if (!valueOrCb) { - // `null` - return removeAttr.call(this, attributeNameOrAtts); } - } - // Fallthrough - - default: - { - throw new TypeError('Unexpected type for attribute name: ' + _typeof$1(attributeNameOrAtts)); - } - } - - return this; - }; - - var removeAttr = function removeAttr(attributeName) { - if (typeof attributeName !== 'string') { - throw new TypeError('Unexpected type for attribute name: ' + _typeof$1(attributeName)); - } - - this.forEach(function (node) { - node.removeAttribute(attributeName); - }); - }; - - function classAttManipulation(type) { - return function (cbOrContent) { - var _this4 = this; - - switch (_typeof$1(cbOrContent)) { - case 'function': - { - this.forEach(function (node, i) { - var _node$classList; - - var ret = cbOrContent.call(_this4, i, node.className); - - (_node$classList = node.classList)[type].apply(_node$classList, _toConsumableArray$1(ret.split(' '))); - }); - break; - } - - default: - { - if (type === 'remove' && !cbOrContent) { - this.forEach(function (node) { - node.className = ''; - }); - break; + }, ['Prev']], + ' ' + ]] + ), + (currentPage === pages + ? '' + : ['span', [ + ['a', { + href: jsVoid, + $on: { + click (e) { + e.preventDefault(); + $('#page')[0].value = currentPage + 1; + $('#openclipart')[0].$submit(); } - - this.forEach(function (node) { - var _node$classList2; - - (_node$classList2 = node.classList)[type].apply(_node$classList2, _toConsumableArray$1(cbOrContent.split(' '))); - }); - break; } - } - - return this; - }; - } - - var addClass = classAttManipulation('add'); - var removeClass = classAttManipulation('remove'); - - var hasClass = function hasClass(className) { - return this.some(function (node) { - return node.classList.contains(className); - }); - }; - - var toggleClass = function toggleClass(classNameOrCb, state) { - var _this5 = this; - - switch (typeof cbOrContent === "undefined" ? "undefined" : _typeof$1(cbOrContent)) { - case 'function': - { - if (typeof state === 'boolean') { - this.forEach(function (node, i) { - var _node$classList3; - - var ret = classNameOrCb.call(_this5, i, node.className, state); - - (_node$classList3 = node.classList).toggle.apply(_node$classList3, _toConsumableArray$1(ret.split(' ')).concat([state])); - }); - } else { - this.forEach(function (node, i) { - var _node$classList4; - - var ret = classNameOrCb.call(_this5, i, node.className, state); - - (_node$classList4 = node.classList).toggle.apply(_node$classList4, _toConsumableArray$1(ret.split(' '))); - }); + }, ['Next']], + ' ' + ]] + ), + (currentPage === pages || pages <= 2 + ? '' + : ['span', [ + ['a', { + href: jsVoid, + $on: { + click (e) { + e.preventDefault(); + $('#page')[0].value = pages; + $('#openclipart')[0].$submit(); + } } + }, ['Last']], + ' ' + ]] + ) + ]); +} - break; - } - - case 'string': - { - if (typeof state === 'boolean') { - this.forEach(function (node) { - var _node$classList5; - - (_node$classList5 = node.classList).toggle.apply(_node$classList5, _toConsumableArray$1(classNameOrCb.split(' ')).concat([state])); - }); - } else { - this.forEach(function (node) { - var _node$classList6; - - (_node$classList6 = node.classList).toggle.apply(_node$classList6, _toConsumableArray$1(classNameOrCb.split(' '))); - }); - } - - break; - } - } - }; - - var methods = { - after: after, - before: before, - append: append, - prepend: prepend, - html: html, - text: text, - clone: clone, - empty: empty, - remove: remove, - // detach - attr: attr, - removeAttr: removeAttr, - addClass: addClass, - hasClass: hasClass, - removeClass: removeClass, - toggleClass: toggleClass - }; - - var manipulation = function manipulation($, jml) { - ['after', 'before', 'append', 'prepend', 'html', 'text', 'clone', 'empty', 'remove', // 'detach' - 'attr', 'removeAttr', 'addClass', 'hasClass', 'removeClass', 'toggleClass'].forEach(function (method) { - $.extend(method, methods[method]); - }); - ['appendTo', 'prependTo', 'insertAfter', 'insertBefore'].forEach(function (method) { - $.extend(method, insertTo(method, $)); - }); - - if (jml) { - $.extend('jml', function () { - var _this6 = this; - - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - this.forEach(function (node) { - while (node.hasChildNodes()) { - node.firstChild.remove(); - } - - var n = jml.apply(void 0, args); - return append.call(_this6, n); - }); - }); - } - - return $; - }; - - manipulation($$1, jml); - var baseAPIURL = 'https://openclipart.org/search/json/'; - var jsVoid = 'javascript: void(0);'; // eslint-disable-line no-script-url - - /** - * Shows results after query submission. - * @param {string} url - * @returns {Promise} - */ - - function processResults(_x) { - return _processResults.apply(this, arguments); - } - - function _processResults() { - _processResults = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(url) { - var queryLink, r, json, payload, _json$info, numResults, pages, currentPage, semiColonSep; - - return regeneratorRuntime.wrap(function _callee3$(_context3) { - while (1) { - switch (_context3.prev = _context3.next) { - case 0: - queryLink = function _queryLink(query) { - return ['a', { - href: jsVoid, - dataset: { - value: query - }, - $on: { - click: function click(e) { - e.preventDefault(); - var value = this.dataset.value; - $$1('#query')[0].$set(value); - $$1('#openclipart')[0].$submit(); - } - } - }, [query]]; - }; - - _context3.next = 3; - return fetch(url); - - case 3: - r = _context3.sent; - _context3.next = 6; - return r.json(); - - case 6: - json = _context3.sent; - - if (!(!json || json.msg !== 'success')) { - _context3.next = 10; - break; - } - - // Todo: This could use a generic alert library instead - alert('There was a problem downloading the results'); // eslint-disable-line no-alert - - return _context3.abrupt("return"); - - case 10: - payload = json.payload, _json$info = json.info, numResults = _json$info.results, pages = _json$info.pages, currentPage = _json$info.current_page; // $('#page')[0].value = currentPage; - // $('#page')[0].max = pages; - // Unused properties: - // - `svg_filesize` always 0? - // - `dimensions: { - // png_thumb: {width, height}, - // png_full_lossy: {width, height} - // }` object of relevance? - // - No need for `tags` with `tags_array` - // - `svg`'s: `png_thumb`, `png_full_lossy`, `png_2400px` - - semiColonSep = '; ' + nbsp; - $$1('#results').jml('div', [['span', ['Number of results: ', numResults]], semiColonSep, ['span', ['page ', currentPage, ' out of ', pages]]].concat(_toConsumableArray(payload.map(function (_ref3) { - var title = _ref3.title, - description = _ref3.description, - id = _ref3.id, - uploader = _ref3.uploader, - created = _ref3.created, - svgURL = _ref3.svg.url, - detailLink = _ref3.detail_link, - tagsArray = _ref3.tags_array, - downloadedBy = _ref3.downloaded_by, - totalFavorites = _ref3.total_favorites; - var imgHW = '100px'; - var colonSep = ': ' + nbsp; - return ['div', [['button', { - style: 'margin-right: 8px; border: 2px solid black;', - dataset: { - id: id, - value: svgURL - }, - $on: { - click: function click(e) { - var _this = this; - - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { - var svgurl, post, result, svg; - return regeneratorRuntime.wrap(function _callee2$(_context2) { - while (1) { - switch (_context2.prev = _context2.next) { - case 0: - e.preventDefault(); - svgurl = _this.dataset.value; // console.log('this', id, svgurl); - - post = function post(message) { - // Todo: Make origin customizable as set by opening window - // Todo: If dropping IE9, avoid stringifying - window.parent.postMessage(JSON.stringify(_extends({ - namespace: 'imagelib' - }, message)), '*'); - }; // Send metadata (also indicates file is about to be sent) - - - post({ - name: title, - id: svgurl - }); - _context2.next = 6; - return fetch(svgurl); - - case 6: - result = _context2.sent; - _context2.next = 9; - return result.text(); - - case 9: - svg = _context2.sent; - // console.log('url and svg', svgurl, svg); - post({ - href: svgurl, - data: svg - }); - - case 11: - case "end": - return _context2.stop(); - } - } - }, _callee2); - }))(); - } - } - }, [// If we wanted interactive versions despite security risk: - // ['object', {data: svgURL, type: 'image/svg+xml'}] - ['img', { - src: svgURL, - style: "width: ".concat(imgHW, "; height: ").concat(imgHW, ";") - }]]], ['b', [title]], ' ', ['i', [description]], ' ', ['span', ['(ID: ', ['a', { - href: jsVoid, - dataset: { - value: id - }, - $on: { - click: function click(e) { - e.preventDefault(); - var value = this.dataset.value; - $$1('#byids')[0].$set(value); - $$1('#openclipart')[0].$submit(); - } - } - }, [id]], ')']], ' ', ['i', [['a', { - href: detailLink, - target: '_blank' - }, ['Details']]]], ['br'], ['span', [['u', ['Uploaded by']], colonSep, queryLink(uploader), semiColonSep]], ['span', [['u', ['Download count']], colonSep, downloadedBy, semiColonSep]], ['span', [['u', ['Times used as favorite']], colonSep, totalFavorites, semiColonSep]], ['span', [['u', ['Created date']], colonSep, created]], ['br'], ['u', ['Tags']], colonSep].concat(_toConsumableArray(tagsArray.map(function (tag) { - return ['span', [' ', queryLink(tag)]]; - })))]; - })), [['br'], ['br'], currentPage === 1 || pages <= 2 ? '' : ['span', [['a', { - href: jsVoid, - $on: { - click: function click(e) { - e.preventDefault(); - $$1('#page')[0].value = 1; - $$1('#openclipart')[0].$submit(); - } - } - }, ['First']], ' ']], currentPage === 1 ? '' : ['span', [['a', { - href: jsVoid, - $on: { - click: function click(e) { - e.preventDefault(); - $$1('#page')[0].value = currentPage - 1; - $$1('#openclipart')[0].$submit(); - } - } - }, ['Prev']], ' ']], currentPage === pages ? '' : ['span', [['a', { - href: jsVoid, - $on: { - click: function click(e) { - e.preventDefault(); - $$1('#page')[0].value = currentPage + 1; - $$1('#openclipart')[0].$submit(); - } - } - }, ['Next']], ' ']], currentPage === pages || pages <= 2 ? '' : ['span', [['a', { - href: jsVoid, - $on: { - click: function click(e) { - e.preventDefault(); - $$1('#page')[0].value = pages; - $$1('#openclipart')[0].$submit(); - } - } - }, ['Last']], ' ']]])); - - case 13: - case "end": - return _context3.stop(); - } - } - }, _callee3); - })); - return _processResults.apply(this, arguments); - } - - jml('div', [['style', [".control {\n padding-top: 10px;\n }"]], ['form', { +jml('div', [ + ['style', [ + `.control { + padding-top: 10px; + }` + ]], + ['form', { id: 'openclipart', $custom: { - $submit: function $submit() { - return _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() { - var url; - return regeneratorRuntime.wrap(function _callee$(_context) { - while (1) { - switch (_context.prev = _context.next) { - case 0: - url = new URL(baseAPIURL); - ['query', 'sort', 'amount', 'page', 'byids'].forEach(function (prop) { - var value = $$1('#' + prop)[0].value; - - if (value) { - url.searchParams.set(prop, value); - } - }); - _context.next = 4; - return processResults(url); - - case 4: - case "end": - return _context.stop(); - } - } - }, _callee); - }))(); + async $submit () { + const url = new URL(baseAPIURL); + [ + 'query', 'sort', 'amount', 'page', 'byids' + ].forEach((prop) => { + const {value} = $('#' + prop)[0]; + if (value) { + url.searchParams.set(prop, value); + } + }); + await processResults(url); } }, $on: { - submit: function submit(e) { + submit (e) { e.preventDefault(); this.$submit(); } } - }, [// Todo: i18nize - ['fieldset', [['legend', ['Search terms']], ['div', { - "class": 'control' - }, [['label', ['Query (Title, description, uploader, or tag): ', ['input', { - id: 'query', - name: 'query', - placeholder: 'cat', - $custom: { - $set: function $set(value) { - $$1('#byids')[0].value = ''; - this.value = value; - } - }, - $on: { - change: function change() { - $$1('#byids')[0].value = ''; - } - } - }]]]]], ['br'], ' OR ', ['br'], ['div', { - "class": 'control' - }, [['label', ['IDs (single or comma-separated): ', ['input', { - id: 'byids', - name: 'ids', - placeholder: '271380, 265741', - $custom: { - $set: function $set(value) { - $$1('#query')[0].value = ''; - this.value = value; - } - }, - $on: { - change: function change() { - $$1('#query')[0].value = ''; - } - } - }]]]]]]], ['fieldset', [['legend', ['Configuring results']], ['div', { - "class": 'control' - }, [['label', ['Sort by: ', ['select', { - id: 'sort' - }, [// Todo: i18nize first values - ['Date', 'date'], ['Downloads', 'downloads'], ['Favorited', 'favorites']].map(function (_ref) { - var _ref2 = _slicedToArray(_ref, 2), - text = _ref2[0], - _ref2$ = _ref2[1], - value = _ref2$ === void 0 ? text : _ref2$; - - return ['option', { - value: value - }, [text]]; - })]]]]], ['div', { - "class": 'control' - }, [['label', ['Results per page: ', ['input', { - id: 'amount', - name: 'amount', - value: 10, - type: 'number', - min: 1, - max: 200, - step: 1, - pattern: '\\d+' - }]]]]], ['div', { - "class": 'control' - }, [['label', ['Page number: ', ['input', { - // max: 1, // We'll change this based on available results - id: 'page', - name: 'page', - value: 1, - style: 'width: 40px;', - type: 'number', - min: 1, - step: 1, - pattern: '\\d+' - }]]]]]]], ['div', { - "class": 'control' - }, [['input', { - type: 'submit' - }]]]]], ['div', { - id: 'results' - }]], body); - -}()); + }, [ + // Todo: i18nize + ['fieldset', [ + ['legend', ['Search terms']], + ['div', {class: 'control'}, [ + ['label', [ + 'Query (Title, description, uploader, or tag): ', + ['input', {id: 'query', name: 'query', placeholder: 'cat', $custom: { + $set (value) { + $('#byids')[0].value = ''; + this.value = value; + } + }, $on: { + change () { + $('#byids')[0].value = ''; + } + }}] + ]] + ]], + ['br'], + ' OR ', + ['br'], + ['div', {class: 'control'}, [ + ['label', [ + 'IDs (single or comma-separated): ', + ['input', {id: 'byids', name: 'ids', placeholder: '271380, 265741', $custom: { + $set (value) { + $('#query')[0].value = ''; + this.value = value; + } + }, $on: { + change () { + $('#query')[0].value = ''; + } + }}] + ]] + ]] + ]], + ['fieldset', [ + ['legend', ['Configuring results']], + ['div', {class: 'control'}, [ + ['label', [ + 'Sort by: ', + ['select', {id: 'sort'}, [ + // Todo: i18nize first values + ['Date', 'date'], + ['Downloads', 'downloads'], + ['Favorited', 'favorites'] + ].map(([text, value = text]) => { + return ['option', {value}, [text]]; + })] + ]] + ]], + ['div', {class: 'control'}, [ + ['label', [ + 'Results per page: ', + ['input', { + id: 'amount', name: 'amount', value: 10, + type: 'number', min: 1, max: 200, step: 1, pattern: '\\d+'}] + ]] + ]], + ['div', {class: 'control'}, [ + ['label', [ + 'Page number: ', + ['input', { + // max: 1, // We'll change this based on available results + id: 'page', name: 'page', value: 1, style: 'width: 40px;', + type: 'number', min: 1, step: 1, pattern: '\\d+' + }] + ]] + ]] + ]], + ['div', {class: 'control'}, [ + ['input', {type: 'submit'}] + ]] + ]], + ['div', {id: 'results'}] +], body); diff --git a/dist/extensions/imagelib/smiley.svg b/dist/extensions/imagelib/smiley.svg new file mode 100644 index 00000000..21a798d6 --- /dev/null +++ b/dist/extensions/imagelib/smiley.svg @@ -0,0 +1,12 @@ + + Cool smiley + + + + + + + + + + \ No newline at end of file diff --git a/dist/extensions/markers-box.png b/dist/extensions/markers-box.png new file mode 100644 index 0000000000000000000000000000000000000000..e558fdc8de7d4da3e63b98e8258cab7bf34e0375 GIT binary patch literal 9561 zcmeAS@N?(olHy`uVBq!ia0y~y;E!Tp;FD)z28x7T@hAmSLIFM@u0Z;K1H=D1Fj)^` zEakt!T9E2BT$mz@PgmL@+nt0f!L#9Gz3ON zU}%Rx!{%^y7ltMVfdg^p8RiMTx!z)7H?KsJg6 z5X(Ro*ol&6B-}9EMuJ@qcQcyH;cmw7a-7z{0|gR5aBFY{4VpFZK!F4h+!{pKBZ3C6 zKOnII_YJNXfLlQ2;KJn(bZdq|a2-xM&ga3v&?wR6XVCE1JB!&@vEWX%>OTpFEMA5c zrXaN78VEH+F@uDlqNTo=Vqld(Wl)tkHN(wAS9suzzCoB&V>Q#)EMDv0hRQDWImhE< zxj{Lc=hJq%qx&Xt0An0`<{ixl;6eyJg;E$?BPb)FrYp4akI2+TtKh;_{sF}y5l&{b zQ(Da8D*y7Z)~^E`h=aAR!WD=E99+btxrQ67nHfRFv*W*O%`rkZY0`$m+faZv5zt~6 z(rkn0N1P1>T!Bxk1`k@fg3B6QfsfN46qfUYHMrmnP_)cIX~9KdaKY0RS^}YVQkY3_`eS4#CQxH< z6wo6CGN7vy8WieZJFeSD4=YFQ7!85Z5TI=cG~8;252JGT1b|0WDY22AIL!)v(UNt= RI^m%p<({s7F6*2UngA(*nvDPe literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-box_o.png b/dist/extensions/markers-box_o.png new file mode 100644 index 0000000000000000000000000000000000000000..1774a4b3bdc45ff642f3f4be34db026b8b6b0834 GIT binary patch literal 1764 zcmeAS@N?(olHy`uVBq!ia0y~yV0i?@J6M>3A|89Io&YK70G|+7ApO6R;eP|e|9UX0 zWB3n2^$Z1@CVv7-bCv}81v7{`g#8b#ZwPr_qp*sBfi2(D#WAFU@$J>XT&6$~*Nesm zOmV9k7A%okwL?hYLV!v_gWvD7_j8R-s^;tRTHj;@nlrHAA9m{xOj5h&R(9muT)Ar| zh4;2vOw&6m`$>L*g$R3>bD;*GNc$rP2o)fs!FROr5tv$N5g^mWd=yMM7eW;SDe@G9 zEP$B|vH)f>$O5o4@VRD9=A#n-ix0Ig|Jt$S#fly3+b1r1J1eucPsBE+)b2_*K1Why zFG-FB`j23c5#t(o_!6Udh(sWA*bt0uWW~UQf;H_C6E^egTe~DWM4flv5h1 literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-forwardslash.png b/dist/extensions/markers-forwardslash.png new file mode 100644 index 0000000000000000000000000000000000000000..43cec42296852a81b2c110b8a503118ffd387c98 GIT binary patch literal 2905 zcmeAS@N?(olHy`uVBq!ia0y~yVE)9wz+%I}3>0De8R`I}!UKFlT!HleI)?uZU<72; zgAtGmVZ)^$;>dzPHW1Z-Ng$&frni>ie=Wn^ZI?Czjg~D5@(X4N+@M$eGXZ@!gRt=Nl{1U#UCpG5)$(;oi(&o&xWE{%UlTFRK$dVjXPH`DpG+ z_K$f7t~6JeC%giwQn<%EqY9|V7O3XmT?eqpOpw4|>jt1n5G8wm0(G4OYJv-Nu4I2# zK5_Ny?ytWZD#CZ}iCE9yQ9iZZl%bF!;x($i|o<7jmSV)L(&o>IbtRsY{_vqX7XvMz)X&q zDH~Y+VkSq-lnpG;F>?xWPP2Zn-|-`#g(KTbFr0QrH#bz2@5U(8X;88eU6El% z7G}Hyi#5#1!i;z3BUsWAX1p_e#7sv-mXPd!{y%)ISF}G){=wzv`imdQe)xLW{Ue{x zUtsmSEN%~T@cT*#{r?zH?(MHEV7Yyc|99X=z8f*|o#hFy(vMghe0?N4qY9{LZw34N zgjYx50{6~d=>{rchbs96Y#$&DwpX~gT-^eYpjYDoqAocU|( w8R4zI2Kl!K8+m}-0}A!8t81=u!)0i|5J*$sy=F19l`hC^Pgg&ebxsLQ0Goh#&j0`b literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-icons.xml b/dist/extensions/markers-icons.xml new file mode 100644 index 00000000..7a9f3047 --- /dev/null +++ b/dist/extensions/markers-icons.xml @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + + + + + + + + + + + + T + + + + + + + + T + + + + + diff --git a/dist/extensions/markers-leftarrow.png b/dist/extensions/markers-leftarrow.png new file mode 100644 index 0000000000000000000000000000000000000000..b91de84ed4224ef11754e36c54ad8039612a05a8 GIT binary patch literal 4856 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 Q7Y+bG>6#$QuH1_Je^C0yYXATM literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-mkr_markers_dimension.png b/dist/extensions/markers-mkr_markers_dimension.png new file mode 100644 index 0000000000000000000000000000000000000000..0e1352b6a88618ad3b7ec885bfb260aff0da6131 GIT binary patch literal 33259 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 literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-mkr_markers_label.png b/dist/extensions/markers-mkr_markers_label.png new file mode 100644 index 0000000000000000000000000000000000000000..3f2696a64f9ea2694787d9194360b73ef8d41126 GIT binary patch literal 11682 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 literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-mkr_markers_off.png b/dist/extensions/markers-mkr_markers_off.png new file mode 100644 index 0000000000000000000000000000000000000000..d9e692e126868e8e9125370b98719fc265c54997 GIT binary patch literal 585 zcmeAS@N?(olHy`uVBq!ia0y~yV98`)U^>mh3>4X6cgP(`2?h9sxB}__wG993z^I<# ze*?qCj3d@SQMQsGzhDN_hV1`Y6aHUc$-uz)z|+Msq=ND7orQu80X(b+*`*E!aJL3a zI&-dgudJk0mTghX2-G;RU>5n-N2~2PH|0a!s>pXqrZWC)H<(vBnyz5GxIrf%Q~loCIEwmN67#H literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-nomarker.png b/dist/extensions/markers-nomarker.png new file mode 100644 index 0000000000000000000000000000000000000000..80107237c09ed585ff2f7ad13f2acd0bae1bd537 GIT binary patch literal 625 zcmeAS@N?(olHy`uVBq!ia0y~yU=3wpV9H@(28!^f#iau&(Ey(iS0Merj^Tej5~^eP zc>C2(pagqKkY6yvg8lQa{=c$Fr1L4z02WUd$B+ufx0eDr8yo~!4=n$oF4I2uO{U^O zk7qmX&g2oE#R$|mRKYfplCvh}cH!3xw(qa9Tbb@JzJqIB(`p#;NDIiqM|7=zptS=p oA*11s4YjLS*42L@&f}AXy030_OsiLG%KZl{0jn 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 literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-star.png b/dist/extensions/markers-star.png new file mode 100644 index 0000000000000000000000000000000000000000..b2474bb51e66534ec904768eb199f9b4d2fb67b3 GIT binary patch literal 6090 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 l2lMowmskCCs>a+j= literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-star_o.png b/dist/extensions/markers-star_o.png new file mode 100644 index 0000000000000000000000000000000000000000..331de6d25268604aca2ebefea75dc73a1c8bdb63 GIT binary patch literal 28498 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 Y$eHC8b2s^J7Phz751#IOw&k`O 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 B3g`d; literal 0 HcmV?d00001 diff --git a/dist/extensions/markers-triangle_o.png b/dist/extensions/markers-triangle_o.png new file mode 100644 index 0000000000000000000000000000000000000000..637863e939b7cf8450f51452df9a4385a1ad6bf4 GIT binary patch literal 2666 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

phGU!D4C~B+hhBxSkmnB#EbU z!dTX#LZf{fXR_W}wB5*4$UUVBmwY2%G160pYhvQ@P^srgd{#^X9IS1Ihz(yMuec#B z8_^b{P~qe`2KSFy0jaeeV4Yn11n%e_A*I|-lp(eOQD!yZk~o*ZGjGaYSv}^65tYjGvcAT688k=nh$9v2!#2~+6p)hHMkX*84Ff2Kl45gdS ztcDD>CC%``t*ku*OF{YpBK0P<*LVL?y58ah(>^lMqA|o?D)4vvGZACh zmx!eMR)0fpkK6sSrh-PZNR#k;Y@WRud+KIf*4o^GPj60^MqQ>0dHSm>kzMr852A@V zCvY}jJ3VjCH^flw%a8*vco$MLpB;EolY$>Vzwon#J%Zkx>z3s2wZ9>HpD z1$=ZbnQcz{8P!+*LqEa$^^|QcT9@i|p-eUI$50ZkHkZxh^;$yew^S`}BjseuKPGXh z#Z|j9VQ;47?${_Sl4Q93z>y&9&=tx<4j(rw^u2!Dye&n4{gJAV;^NbfshtqbdvS!? zJ5E(iL+{KwZz!y)30f`KLeZ2S(>J=)%H1QP>oh!MI`FHWIdNTA7NCy1=sh%1N-15eek9}cv~Ml=`~#12j}-ie;eNEK_+{26{KAH v9|DI&jSKthox9XO)BpMWrvm?173k6Ly1USmZ-Z1TsgS_|q5k`o>a@QD(h#9z literal 0 HcmV?d00001 diff --git a/dist/extensions/mathjax-icons.xml b/dist/extensions/mathjax-icons.xml new file mode 100644 index 00000000..13f6557f --- /dev/null +++ b/dist/extensions/mathjax-icons.xml @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/dist/extensions/mathjax.png b/dist/extensions/mathjax.png new file mode 100644 index 0000000000000000000000000000000000000000..44cefccb08ac21a4796e435a05323a92b8d14258 GIT binary patch literal 7842 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.length===2&&!(typeof arguments[0]==="function")&&arguments[0] instanceof Object&&typeof arguments[1]==="number"){args=[].slice.call(args,i)}else{args=[].slice.call(arguments,0)}}if(args instanceof Array&&args.length===1){args=args[0]}if(typeof args==="function"){if(args.execute===CALLBACK.prototype.execute){return args}return CALLBACK({hook:args})}else{if(args instanceof Array){if(typeof(args[0])==="string"&&args[1] instanceof Object&&typeof args[1][args[0]]==="function"){return CALLBACK({hook:args[1][args[0]],object:args[1],data:args.slice(2)})}else{if(typeof args[0]==="function"){return CALLBACK({hook:args[0],data:args.slice(1)})}else{if(typeof args[1]==="function"){return CALLBACK({hook:args[1],object:args[0],data:args.slice(2)})}}}}else{if(typeof(args)==="string"){return CALLBACK({hook:EVAL,data:[args]})}else{if(args instanceof Object){return CALLBACK(args)}else{if(typeof(args)==="undefined"){return CALLBACK({})}}}}}throw Error("Can't make callback from given data")};var DELAY=function(time,callback){callback=USING(callback);callback.timeout=setTimeout(callback,time);return callback};var WAITFOR=function(callback,signal){callback=USING(callback);if(!callback.called){WAITSIGNAL(callback,signal);signal.pending++}};var WAITEXECUTE=function(){var signals=this.signal;delete this.signal;this.execute=this.oldExecute;delete this.oldExecute;var result=this.execute.apply(this,arguments);if(ISCALLBACK(result)&&!result.called){WAITSIGNAL(result,signals)}else{for(var i=0,m=signals.length;i0&&priorityf){f=document.styleSheets.length}if(!h){h=(document.getElementsByTagName("head"))[0];if(!h){h=document.body}}return h};var e=[];var b=function(){for(var j=0,h=e.length;j=this.timeout){h(this.STATUS.ERROR);return 1}return 0},file:function(i,h){if(h<0){a.Ajax.loadTimeout(i)}else{a.Ajax.loadComplete(i)}},execute:function(){this.hook.call(this.object,this,this.data[0],this.data[1])},checkSafari2:function(h,i,j){if(h.time(j)){return}if(document.styleSheets.length>i&&document.styleSheets[i].cssRules&&document.styleSheets[i].cssRules.length){j(h.STATUS.OK)}else{setTimeout(h,h.delay)}},checkLength:function(h,k,m){if(h.time(m)){return}var l=0;var i=(k.sheet||k.styleSheet);try{if((i.cssRules||i.rules||[]).length>0){l=1}}catch(j){if(j.message.match(/protected variable|restricted URI/)){l=1}else{if(j.message.match(/Security error/)){l=1}}}if(l){setTimeout(a.Callback([m,h.STATUS.OK]),0)}else{setTimeout(h,h.delay)}}},loadComplete:function(h){h=this.fileURL(h);var i=this.loading[h];if(i&&!i.preloaded){a.Message.Clear(i.message);clearTimeout(i.timeout);if(i.script){if(e.length===0){setTimeout(b,0)}e.push(i.script)}this.loaded[h]=i.status;delete this.loading[h];this.addHook(h,i.callback)}else{if(i){delete this.loading[h]}this.loaded[h]=this.STATUS.OK;i={status:this.STATUS.OK}}if(!this.loadHooks[h]){return null}return this.loadHooks[h].Execute(i.status)},loadTimeout:function(h){if(this.loading[h].timeout){clearTimeout(this.loading[h].timeout)}this.loading[h].status=this.STATUS.ERROR;this.loadError(h);this.loadComplete(h)},loadError:function(h){a.Message.Set(["LoadFailed","File failed to load: %1",h],null,2000);a.Hub.signal.Post(["file load error",h])},Styles:function(j,k){var h=this.StyleString(j);if(h===""){k=a.Callback(k);k()}else{var i=document.createElement("style");i.type="text/css";this.head=g(this.head);this.head.appendChild(i);if(i.styleSheet&&typeof(i.styleSheet.cssText)!=="undefined"){i.styleSheet.cssText=h}else{i.appendChild(document.createTextNode(h))}k=this.timer.create.call(this,k,i)}return k},StyleString:function(m){if(typeof(m)==="string"){return m}var j="",n,l;for(n in m){if(m.hasOwnProperty(n)){if(typeof m[n]==="string"){j+=n+" {"+m[n]+"}\n"}else{if(m[n] instanceof Array){for(var k=0;k="0"&&p<="9"){f[j]=o[f[j]-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{if(p==="{"){p=f[j].substr(1);if(p>="0"&&p<="9"){f[j]=o[f[j].substr(1,f[j].length-2)-1];if(typeof f[j]==="number"){f[j]=this.number(f[j])}}else{var k=f[j].match(/^\{([a-z]+):%(\d+)\|(.*)\}$/);if(k){if(k[1]==="plural"){var d=o[k[2]-1];if(typeof d==="undefined"){f[j]="???"}else{d=this.plural(d)-1;var h=k[3].replace(/(^|[^%])(%%)*%\|/g,"$1$2%\uEFEF").split(/\|/);if(d>=0&&d=3){c.push([f[0],f[1],this.processSnippet(g,f[2])])}else{c.push(e[d])}}}}else{c.push(e[d])}}return c},markdownPattern:/(%.)|(\*{1,3})((?:%.|.)+?)\2|(`+)((?:%.|.)+?)\4|\[((?:%.|.)+?)\]\(([^\s\)]+)\)/,processMarkdown:function(b,h,d){var j=[],e;var c=b.split(this.markdownPattern);var g=c[0];for(var f=1,a=c.length;f1?d[1]:""));f=null}if(e&&(!b.preJax||d)){c.nodeValue=c.nodeValue.replace(b.postJax,(e.length>1?e[1]:""))}if(f&&!f.nodeValue.match(/\S/)){f=f.previousSibling}}if(b.preRemoveClass&&f&&f.className===b.preRemoveClass){a.MathJax.preview=f}a.MathJax.checked=1},processInput:function(a){var b,i=MathJax.ElementJax.STATE;var h,e,d=a.scripts.length;try{while(a.ithis.processUpdateTime&&a.i1){d.jax[a.outputJax].push(b)}b.MathJax.state=c.OUTPUT},prepareOutput:function(c,f){while(c.jthis.processUpdateTime&&h.i=0;o--){if((b[o].src||"").match(d)){q.script=b[o].innerHTML;if(RegExp.$2){var r=RegExp.$2.substr(1).split(/\&/);for(var n=0,h=r.length;n=parseInt(x[y])}}return true},Select:function(j){var i=j[c.Browser];if(i){return i(c.Browser)}return null}};var g=navigator.userAgent.replace(/^Mozilla\/(\d+\.)+\d+ /,"").replace(/[a-z][-a-z0-9._: ]+\/\d+[^ ]*-[^ ]*\.([a-z][a-z])?\d+ /i,"").replace(/Gentoo |Ubuntu\/(\d+\.)*\d+ (\([^)]*\) )?/,"");c.Browser=c.Insert(c.Insert(new String("Unknown"),{version:"0.0"}),a);for(var t in a){if(a.hasOwnProperty(t)){if(a[t]&&t.substr(0,2)==="is"){t=t.slice(2);if(t==="Mac"||t==="PC"){continue}c.Browser=c.Insert(new String(t),a);var p=new RegExp(".*(Version)/((?:\\d+\\.)+\\d+)|.*("+t+")"+(t=="MSIE"?" ":"/")+"((?:\\d+\\.)*\\d+)|(?:^|\\(| )([a-z][-a-z0-9._: ]+|(?:Apple)?WebKit)/((?:\\d+\\.)+\\d+)");var s=p.exec(g)||["","","","unknown","0.0"];c.Browser.name=(s[1]=="Version"?t:(s[3]||s[5]));c.Browser.version=s[2]||s[4]||s[6];break}}}c.Browser.Select({Safari:function(j){var i=parseInt((String(j.version).split("."))[0]);if(i>85){j.webkit=j.version}if(i>=534){j.version="5.1"}else{if(i>=533){j.version="5.0"}else{if(i>=526){j.version="4.0"}else{if(i>=525){j.version="3.1"}else{if(i>500){j.version="3.0"}else{if(i>400){j.version="2.0"}else{if(i>85){j.version="1.0"}}}}}}}j.isMobile=(navigator.appVersion.match(/Mobile/i)!=null);j.noContextMenu=j.isMobile},Firefox:function(j){if((j.version==="0.0"||navigator.userAgent.match(/Firefox/)==null)&&navigator.product==="Gecko"){var m=navigator.userAgent.match(/[\/ ]rv:(\d+\.\d.*?)[\) ]/);if(m){j.version=m[1]}else{var i=(navigator.buildID||navigator.productSub||"0").substr(0,8);if(i>="20111220"){j.version="9.0"}else{if(i>="20111120"){j.version="8.0"}else{if(i>="20110927"){j.version="7.0"}else{if(i>="20110816"){j.version="6.0"}else{if(i>="20110621"){j.version="5.0"}else{if(i>="20110320"){j.version="4.0"}else{if(i>="20100121"){j.version="3.6"}else{if(i>="20090630"){j.version="3.5"}else{if(i>="20080617"){j.version="3.0"}else{if(i>="20061024"){j.version="2.0"}}}}}}}}}}}}j.isMobile=(navigator.appVersion.match(/Android/i)!=null||navigator.userAgent.match(/ Fennec\//)!=null||navigator.userAgent.match(/Mobile/)!=null)},Opera:function(i){i.version=opera.version()},MSIE:function(j){j.isIE9=!!(document.documentMode&&(window.performance||window.msPerformance));MathJax.HTML.setScriptBug=!j.isIE9||document.documentMode<9;var v=false;try{new ActiveXObject("MathPlayer.Factory.1");j.hasMathPlayer=v=true}catch(m){}try{if(v&&!q.params.NoMathPlayer){var i=document.createElement("object");i.id="mathplayer";i.classid="clsid:32F66A20-7614-11D4-BD11-00104BD3F987";document.getElementsByTagName("head")[0].appendChild(i);document.namespaces.add("m","https://web.archive.org/web/20131208123133/http://www.w3.org/1998/Math/MathML");j.mpNamespace=true;if(document.readyState&&(document.readyState==="loading"||document.readyState==="interactive")){document.write('');j.mpImported=true}}else{document.namespaces.add("mjx_IE_fix","https://web.archive.org/web/20131208123133/http://www.w3.org/1999/xlink")}}catch(m){}}});c.Browser.Select(MathJax.Message.browsers);if(f.AuthorConfig&&typeof f.AuthorConfig.AuthorInit==="function"){f.AuthorConfig.AuthorInit()}c.queue=f.Callback.Queue();c.queue.Push(["Post",q.signal,"Begin"],["Config",q],["Cookie",q],["Styles",q],["Message",q],function(){var i=f.Callback.Queue(q.Jax(),q.Extensions());return i.Push({})},["Menu",q],q.onLoad(),function(){MathJax.isReady=true},["Typeset",q],["Hash",q],["MenuZoom",q],["Post",q.signal,"End"])})("MathJax")}}; diff --git a/dist/extensions/mathjax/TeX-AMS-MML_SVG.js b/dist/extensions/mathjax/TeX-AMS-MML_SVG.js new file mode 100644 index 00000000..73ef7642 --- /dev/null +++ b/dist/extensions/mathjax/TeX-AMS-MML_SVG.js @@ -0,0 +1,52 @@ +/* + * /MathJax/config/TeX-AMS-MML_SVG.js + * + * Copyright (c) 2010-2013 The MathJax Consortium + * + * Part of the MathJax library. + * See http://www.mathjax.org for details. + * + * Licensed under the Apache License, Version 2.0; + * you may not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + +MathJax.Ajax.Preloading( + "[MathJax]/jax/input/TeX/config.js", + "[MathJax]/jax/input/MathML/config.js", + "[MathJax]/jax/output/SVG/config.js", + "[MathJax]/extensions/tex2jax.js", + "[MathJax]/extensions/mml2jax.js", + "[MathJax]/extensions/MathEvents.js", + "[MathJax]/extensions/MathZoom.js", + "[MathJax]/extensions/MathMenu.js", + "[MathJax]/jax/element/mml/jax.js", + "[MathJax]/extensions/toMathML.js", + "[MathJax]/extensions/TeX/noErrors.js", + "[MathJax]/extensions/TeX/noUndefined.js", + "[MathJax]/jax/input/TeX/jax.js", + "[MathJax]/extensions/TeX/AMSmath.js", + "[MathJax]/extensions/TeX/AMSsymbols.js", + "[MathJax]/jax/input/MathML/jax.js" +); + +MathJax.Hub.Config({"v1.0-compatible":false}); + +MathJax.InputJax.TeX=MathJax.InputJax({id:"TeX",version:"2.3",directory:MathJax.InputJax.directory+"/TeX",extensionDir:MathJax.InputJax.extensionDir+"/TeX",config:{TagSide:"right",TagIndent:"0.8em",MultLineWidth:"85%",equationNumbers:{autoNumber:"none",formatNumber:function(a){return a},formatTag:function(a){return"("+a+")"},formatID:function(a){return"mjx-eqn-"+String(a).replace(/[:"'<>&]/g,"")},formatURL:function(a){return"#"+escape(a)},useLabelIds:true}}});MathJax.InputJax.TeX.Register("math/tex");MathJax.InputJax.TeX.loadComplete("config.js"); +MathJax.InputJax.MathML=MathJax.InputJax({id:"MathML",version:"2.3",directory:MathJax.InputJax.directory+"/MathML",extensionDir:MathJax.InputJax.extensionDir+"/MathML",entityDir:MathJax.InputJax.directory+"/MathML/entities",config:{useMathMLspacing:false}});MathJax.InputJax.MathML.Register("math/mml");MathJax.InputJax.MathML.loadComplete("config.js"); +MathJax.OutputJax.SVG=MathJax.OutputJax({id:"SVG",version:"2.3",directory:MathJax.OutputJax.directory+"/SVG",extensionDir:MathJax.OutputJax.extensionDir+"/SVG",autoloadDir:MathJax.OutputJax.directory+"/SVG/autoload",fontDir:MathJax.OutputJax.directory+"/SVG/fonts",config:{scale:100,minScaleAdjust:50,font:"TeX",blacker:10,mtextFontInherit:false,undefinedFamily:"STIXGeneral,'Arial Unicode MS',serif",addMMLclasses:false,EqnChunk:(MathJax.Hub.Browser.isMobile?10:50),EqnChunkFactor:1.5,EqnChunkDelay:100,linebreaks:{automatic:false,width:"container"},styles:{".MathJax_SVG_Display":{"text-align":"center",margin:"1em 0em"},"#MathJax_SVG_Tooltip":{"background-color":"InfoBackground",color:"InfoText",border:"1px solid black","box-shadow":"2px 2px 5px #AAAAAA","-webkit-box-shadow":"2px 2px 5px #AAAAAA","-moz-box-shadow":"2px 2px 5px #AAAAAA","-khtml-box-shadow":"2px 2px 5px #AAAAAA",padding:"3px 4px","z-index":401}}}});if(!MathJax.Hub.config.delayJaxRegistration){MathJax.OutputJax.SVG.Register("jax/mml")}MathJax.OutputJax.SVG.loadComplete("config.js"); +MathJax.Extension.tex2jax={version:"2.3",config:{inlineMath:[["\\(","\\)"]],displayMath:[["$$","$$"],["\\[","\\]"]],balanceBraces:true,skipTags:["script","noscript","style","textarea","pre","code","annotation","annotation-xml"],ignoreClass:"tex2jax_ignore",processClass:"tex2jax_process",processEscapes:false,processEnvironments:true,processRefs:true,preview:"TeX"},PreProcess:function(a){if(!this.configured){this.config=MathJax.Hub.CombineConfig("tex2jax",this.config);if(this.config.Augment){MathJax.Hub.Insert(this,this.config.Augment)}if(typeof(this.config.previewTeX)!=="undefined"&&!this.config.previewTeX){this.config.preview="none"}this.configured=true}if(typeof(a)==="string"){a=document.getElementById(a)}if(!a){a=document.body}if(this.createPatterns()){this.scanElement(a,a.nextSibling)}},createPatterns:function(){var d=[],e=[],c,a,b=this.config;this.match={};for(c=0,a=b.inlineMath.length;c0)},patternQuote:function(a){return a.replace(/([\^$(){}+*?\-|\[\]\:\\])/g,"\\$1")},endPattern:function(a){return new RegExp(this.patternQuote(a)+"|\\\\.|[{}]","g")},sortLength:function(d,c){if(d.length!==c.length){return c.length-d.length}return(d==c?0:(d/i,"").replace(/<\?xml:namespace .*?\/>/i,"");b=b.replace(/ /g," ")}MathJax.HTML.setScript(a,b);d.removeChild(e)}else{var c=MathJax.HTML.Element("span");c.appendChild(e);MathJax.HTML.setScript(a,c.innerHTML)}if(this.config.preview!=="none"){this.createPreview(e,a)}},ProcessMathFlattened:function(f){var d=f.parentNode;if(!d||d.className===MathJax.Hub.config.preRemoveClass){return}var b=document.createElement("script");b.type="math/mml";d.insertBefore(b,f);var c="",e,a=f;while(f&&f.nodeName!=="/MATH"){e=f;f=f.nextSibling;c+=this.NodeHTML(e);e.parentNode.removeChild(e)}if(f&&f.nodeName==="/MATH"){f.parentNode.removeChild(f)}b.text=c+"";if(this.config.preview!=="none"){this.createPreview(a,b)}},NodeHTML:function(e){var c,b,a;if(e.nodeName==="#text"){c=this.quoteHTML(e.nodeValue)}else{if(e.nodeName==="#comment"){c=""}else{c="<"+e.nodeName.toLowerCase();for(b=0,a=e.attributes.length;b";if(e.outerHTML!=null&&e.outerHTML.match(/(.<\/[A-Z]+>|\/>)$/)){for(b=0,a=e.childNodes.length;b"}}}return c},OuterHTML:function(d){if(d.nodeName.charAt(0)==="#"){return this.NodeHTML(d)}if(!this.AttributeBug){return d.outerHTML}var c=this.NodeHTML(d);for(var b=0,a=d.childNodes.length;b";return c},quoteHTML:function(a){if(a==null){a=""}return a.replace(/&/g,"&").replace(//g,">").replace(/\"/g,""")},createPreview:function(f,b){var g=this.config.preview;if(g==="none"){return}var a=false;if(g==="mathml"){a=true;if(this.MathTagBug){g="alttext"}else{g=f.cloneNode(false)}}if(g==="alttext"||g==="altimg"){a=true;var c=this.filterPreview(f.getAttribute("alttext"));if(g==="alttext"){if(c!=null){g=MathJax.HTML.TextNode(c)}else{g=null}}else{var h=f.getAttribute("altimg");if(h!=null){var e={width:f.getAttribute("altimg-width"),height:f.getAttribute("altimg-height")};g=MathJax.HTML.Element("img",{src:h,alt:c,style:e})}else{g=null}}}if(g){var d;if(a){d=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass});d.appendChild(g)}else{d=MathJax.HTML.Element("span",{className:MathJax.Hub.config.preRemoveClass},g)}b.parentNode.insertBefore(d,b)}},filterPreview:function(a){return a},InitBrowser:function(){var b=MathJax.HTML.Element("span",{id:"<",className:"mathjax",innerHTML:"x"});var a=b.outerHTML||"";this.AttributeBug=a!==""&&!(a.match(/id="<"/)&&a.match(/class="mathjax"/)&&a.match(/<\/math>/));this.MathTagBug=b.childNodes.length>1;this.CleanupHTML=MathJax.Hub.Browser.isMSIE}};MathJax.Hub.Register.PreProcessor(["PreProcess",MathJax.Extension.mml2jax],5);MathJax.Ajax.loadComplete("[MathJax]/extensions/mml2jax.js"); +(function(d,h,l,g,m,b,j){var q="2.3";var i=MathJax.Extension;var c=i.MathEvents={version:q};var k=d.config.menuSettings;var p={hover:500,frame:{x:3.5,y:5,bwidth:1,bcolor:"#A6D",hwidth:"15px",hcolor:"#83A"},button:{x:-4,y:-3,wx:-2,src:l.fileURL(b.imageDir+"/MenuArrow-15.png")},fadeinInc:0.2,fadeoutInc:0.05,fadeDelay:50,fadeoutStart:400,fadeoutDelay:15*1000,styles:{".MathJax_Hover_Frame":{"border-radius":".25em","-webkit-border-radius":".25em","-moz-border-radius":".25em","-khtml-border-radius":".25em","box-shadow":"0px 0px 15px #83A","-webkit-box-shadow":"0px 0px 15px #83A","-moz-box-shadow":"0px 0px 15px #83A","-khtml-box-shadow":"0px 0px 15px #83A",border:"1px solid #A6D ! important",display:"inline-block",position:"absolute"},".MathJax_Hover_Arrow":{position:"absolute",width:"15px",height:"11px",cursor:"pointer"}}};var n=c.Event={LEFTBUTTON:0,RIGHTBUTTON:2,MENUKEY:"altKey",Mousedown:function(r){return n.Handler(r,"Mousedown",this)},Mouseup:function(r){return n.Handler(r,"Mouseup",this)},Mousemove:function(r){return n.Handler(r,"Mousemove",this)},Mouseover:function(r){return n.Handler(r,"Mouseover",this)},Mouseout:function(r){return n.Handler(r,"Mouseout",this)},Click:function(r){return n.Handler(r,"Click",this)},DblClick:function(r){return n.Handler(r,"DblClick",this)},Menu:function(r){return n.Handler(r,"ContextMenu",this)},Handler:function(u,s,t){if(l.loadingMathMenu){return n.False(u)}var r=b[t.jaxID];if(!u){u=window.event}u.isContextMenu=(s==="ContextMenu");if(r[s]){return r[s](u,t)}if(i.MathZoom){return i.MathZoom.HandleEvent(u,s,t)}},False:function(r){if(!r){r=window.event}if(r){if(r.preventDefault){r.preventDefault()}if(r.stopPropagation){r.stopPropagation()}r.cancelBubble=true;r.returnValue=false}return false},ContextMenu:function(u,F,x){var C=b[F.jaxID],w=C.getJaxFromMath(F);var G=(C.config.showMathMenu!=null?C:d).config.showMathMenu;if(!G||(k.context!=="MathJax"&&!x)){return}if(c.msieEventBug){u=window.event||u}n.ClearSelection();f.ClearHoverTimer();if(w.hover){if(w.hover.remove){clearTimeout(w.hover.remove);delete w.hover.remove}w.hover.nofade=true}var v=MathJax.Menu;var H,E;if(v){if(v.loadingDomain){return n.False(u)}H=m.loadDomain("MathMenu");if(!H){v.jax=w;var s=v.menu.Find("Show Math As").menu;s.items[0].name=w.sourceMenuTitle;s.items[0].format=(w.sourceMenuFormat||"MathML");s.items[1].name=j[w.inputJax].sourceMenuTitle;var B=s.items[2];B.disabled=true;var r=B.menu.items;annotationList=MathJax.Hub.Config.semanticsAnnotations;for(var A=0,z=r.length;A0){this.HoverFadeTimer(r,r.hover.inc);return}t.parentNode.removeChild(t);if(s){s.parentNode.removeChild(s)}if(r.hover.remove){clearTimeout(r.hover.remove)}delete r.hover},HoverFadeTimer:function(r,t,s){r.hover.inc=t;if(!r.hover.timer){r.hover.timer=setTimeout(g(["HoverFade",this,r]),(s||p.fadeDelay))}},HoverMenu:function(r){if(!r){r=window.event}return b[this.jax].ContextMenu(r,this.math,true)},ClearHover:function(r){if(r.hover.remove){clearTimeout(r.hover.remove)}if(r.hover.timer){clearTimeout(r.hover.timer)}f.ClearHoverTimer();delete r.hover},Px:function(r){if(Math.abs(r)<0.006){return"0px"}return r.toFixed(2).replace(/\.?0+$/,"")+"px"},getImages:function(){var r=new Image();r.src=p.button.src}};var a=c.Touch={last:0,delay:500,start:function(s){var r=new Date().getTime();var t=(r-a.lastr){x.style.height=r+"px";x.style.width=(v.zW+this.scrollSize)+"px"}if(x.offsetWidth>l){x.style.width=l+"px";x.style.height=(v.zH+this.scrollSize)+"px"}}if(this.operaPositionBug){x.style.width=Math.min(l,v.zW)+"px"}if(x.offsetWidth&&x.offsetWidth=9);h.msiePositionBug=!m;h.msieSizeBug=l.versionAtLeast("7.0")&&(!document.documentMode||n===7||n===8);h.msieZIndexBug=(n<=7);h.msieInlineBlockAlignBug=(n<=7);h.msieTrapEventBug=!window.addEventListener;if(document.compatMode==="BackCompat"){h.scrollSize=52}if(m){delete i.styles["#MathJax_Zoom"].filter}},Opera:function(l){h.operaPositionBug=true;h.operaRefreshBug=true}});h.topImg=(h.msieInlineBlockAlignBug?d.Element("img",{style:{width:0,height:0,position:"relative"},src:"about:blank"}):d.Element("span",{style:{width:0,height:0,display:"inline-block"}}));if(h.operaPositionBug||h.msieTopBug){h.topImg.style.border="1px solid"}MathJax.Callback.Queue(["StartupHook",MathJax.Hub.Register,"Begin Styles",{}],["Styles",f,i.styles],["Post",a.Startup.signal,"MathZoom Ready"],["loadComplete",f,"[MathJax]/extensions/MathZoom.js"])})(MathJax.Hub,MathJax.HTML,MathJax.Ajax,MathJax.OutputJax["HTML-CSS"],MathJax.OutputJax.NativeMML); +(function(c,g,k,f,b){var q="2.3";var j=MathJax.Callback.Signal("menu");MathJax.Extension.MathMenu={version:q,signal:j};var o=function(r){return MathJax.Localization._.apply(MathJax.Localization,[["MathMenu",r]].concat([].slice.call(arguments,1)))};var n=c.Browser.isPC,l=c.Browser.isMSIE,e=((document.documentMode||0)>8);var i=(n?null:"5px");var p=c.CombineConfig("MathMenu",{delay:150,closeImg:k.fileURL(b.imageDir+"/CloseX-31.png"),showRenderer:true,showMathPlayer:true,showFontMenu:false,showContext:false,showDiscoverable:false,showLocale:true,showLocaleURL:false,semanticsAnnotations:{TeX:["TeX","LaTeX","application/x-tex"],StarMath:["StarMath 5.0"],Maple:["Maple"],ContentMathML:["MathML-Content","application/mathml-content+xml"],OpenMath:["OpenMath"]},windowSettings:{status:"no",toolbar:"no",locationbar:"no",menubar:"no",directories:"no",personalbar:"no",resizable:"yes",scrollbars:"yes",width:400,height:300,left:Math.round((screen.width-400)/2),top:Math.round((screen.height-300)/3)},styles:{"#MathJax_About":{position:"fixed",left:"50%",width:"auto","text-align":"center",border:"3px outset",padding:"1em 2em","background-color":"#DDDDDD",color:"black",cursor:"default","font-family":"message-box","font-size":"120%","font-style":"normal","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","z-index":201,"border-radius":"15px","-webkit-border-radius":"15px","-moz-border-radius":"15px","-khtml-border-radius":"15px","box-shadow":"0px 10px 20px #808080","-webkit-box-shadow":"0px 10px 20px #808080","-moz-box-shadow":"0px 10px 20px #808080","-khtml-box-shadow":"0px 10px 20px #808080",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},".MathJax_Menu":{position:"absolute","background-color":"white",color:"black",width:"auto",padding:(n?"2px":"5px 0px"),border:"1px solid #CCCCCC",margin:0,cursor:"default",font:"menu","text-align":"left","text-indent":0,"text-transform":"none","line-height":"normal","letter-spacing":"normal","word-spacing":"normal","word-wrap":"normal","white-space":"nowrap","float":"none","z-index":201,"border-radius":i,"-webkit-border-radius":i,"-moz-border-radius":i,"-khtml-border-radius":i,"box-shadow":"0px 10px 20px #808080","-webkit-box-shadow":"0px 10px 20px #808080","-moz-box-shadow":"0px 10px 20px #808080","-khtml-box-shadow":"0px 10px 20px #808080",filter:"progid:DXImageTransform.Microsoft.dropshadow(OffX=2, OffY=2, Color='gray', Positive='true')"},".MathJax_MenuItem":{padding:(n?"2px 2em":"1px 2em"),background:"transparent"},".MathJax_MenuArrow":{position:"absolute",right:".5em",color:"#666666","font-family":(l?"'Arial unicode MS'":null)},".MathJax_MenuActive .MathJax_MenuArrow":{color:"white"},".MathJax_MenuCheck":{position:"absolute",left:".7em","font-family":(l?"'Arial unicode MS'":null)},".MathJax_MenuRadioCheck":{position:"absolute",left:(n?"1em":".7em")},".MathJax_MenuLabel":{padding:(n?"2px 2em 4px 1.33em":"1px 2em 3px 1.33em"),"font-style":"italic"},".MathJax_MenuRule":{"border-top":(n?"1px solid #CCCCCC":"1px solid #DDDDDD"),margin:(n?"4px 1px 0px":"4px 3px")},".MathJax_MenuDisabled":{color:"GrayText"},".MathJax_MenuActive":{"background-color":(n?"Highlight":"#606872"),color:(n?"HighlightText":"white")},".MathJax_Menu_Close":{position:"absolute",width:"31px",height:"31px",top:"-15px",left:"-15px"}}});var h,d;c.Register.StartupHook("MathEvents Ready",function(){h=MathJax.Extension.MathEvents.Event.False;d=MathJax.Extension.MathEvents.Hover});var a=MathJax.Menu=MathJax.Object.Subclass({version:q,items:[],posted:false,title:null,margin:5,Init:function(r){this.items=[].slice.call(arguments,0)},With:function(r){if(r){c.Insert(this,r)}return this},Post:function(s,B){if(!s){s=window.event}var r=document.getElementById("MathJax_MenuFrame");if(!r){r=a.Background(this);delete m.lastItem;delete m.lastMenu;delete a.skipUp;j.Post(["post",a.jax])}var t=g.addElement(r,"div",{onmouseup:a.Mouseup,ondblclick:h,ondragstart:h,onselectstart:h,oncontextmenu:h,menuItem:this,className:"MathJax_Menu"});MathJax.Localization.setCSS(t);for(var v=0,u=this.items.length;vdocument.body.offsetWidth-this.margin){A=document.body.offsetWidth-t.offsetWidth-this.margin}if(a.isMobile){A=Math.max(5,A-Math.floor(t.offsetWidth/2));z-=20}a.skipUp=s.isContextMenu}else{var w="left",C=B.offsetWidth;A=(a.isMobile?30:C-2);z=0;while(B&&B!==r){A+=B.offsetLeft;z+=B.offsetTop;B=B.parentNode}if(A+t.offsetWidth>document.body.offsetWidth-this.margin&&!a.isMobile){w="right";A=Math.max(this.margin,A-C-t.offsetWidth+6)}if(!n){t.style["borderRadiusTop"+w]=0;t.style["WebkitBorderRadiusTop"+w]=0;t.style["MozBorderRadiusTop"+w]=0;t.style["KhtmlBorderRadiusTop"+w]=0}}t.style.left=A+"px";t.style.top=z+"px";if(document.selection&&document.selection.empty){document.selection.empty()}return h(s)},Remove:function(r,s){j.Post(["unpost",a.jax]);var t=document.getElementById("MathJax_MenuFrame");if(t){t.parentNode.removeChild(t);if(this.msieFixedPositionBug){detachEvent("onresize",a.Resize)}}if(a.jax.hover){delete a.jax.hover.nofade;d.UnHover(a.jax)}return h(r)},Find:function(r){return this.FindN(1,r,[].slice.call(arguments,1))},FindId:function(r){return this.FindN(0,r,[].slice.call(arguments,1))},FindN:function(v,s,u){for(var t=0,r=this.items.length;t=0&&x.parentNode.menuItem!==w[r].menuItem){w[r].menuItem.posted=false;w[r].parentNode.removeChild(w[r]);r--}if(this.Timer&&!a.isMobile){this.Timer(v,x)}}},Mouseout:function(r,s){if(!this.menu||!this.menu.posted){this.Deactivate(s)}if(this.timer){clearTimeout(this.timer);delete this.timer}},Mouseup:function(r,s){return this.Remove(r,s)},Touchstart:function(r,s){return this.TouchEvent(r,s,"Mousedown")},Touchend:function(r,s){return this.TouchEvent(r,s,"Mouseup")},TouchEvent:function(s,t,r){if(this!==m.lastItem){if(m.lastMenu){a.Event(s,m.lastMenu,"Mouseout")}a.Event(s,t,"Mouseover",true);m.lastItem=this;m.lastMenu=t}if(this.nativeTouch){return null}a.Event(s,t,r);return false},Remove:function(r,s){s=s.parentNode.menuItem;return s.Remove(r,s)},Activate:function(r){this.Deactivate(r);r.className+=" MathJax_MenuActive"},Deactivate:function(r){r.className=r.className.replace(/ MathJax_MenuActive/,"")},With:function(r){if(r){c.Insert(this,r)}return this}});a.ITEM.COMMAND=a.ITEM.Subclass({action:function(){},Init:function(r,t,s){if(!(r instanceof Array)){r=[r,r]}this.name=r;this.action=t;this.With(s)},Label:function(r,s){return[this.Name()]},Mouseup:function(r,s){if(!this.disabled){this.Remove(r,s);j.Post(["command",this]);this.action.call(this,r)}return h(r)}});a.ITEM.SUBMENU=a.ITEM.Subclass({menu:null,marker:(n&&!c.Browser.isSafari?"\u25B6":"\u25B8"),Init:function(r,t){if(!(r instanceof Array)){r=[r,r]}this.name=r;var s=1;if(!(t instanceof a.ITEM)){this.With(t),s++}this.menu=a.apply(a,[].slice.call(arguments,s))},Label:function(r,s){this.menu.posted=false;return[this.Name()+" ",["span",{className:"MathJax_MenuArrow"},[this.marker]]]},Timer:function(r,s){if(this.timer){clearTimeout(this.timer)}r={clientX:r.clientX,clientY:r.clientY};this.timer=setTimeout(f(["Mouseup",this,r,s]),p.delay)},Touchend:function(s,u){var t=this.menu.posted;var r=this.SUPER(arguments).Touchend.apply(this,arguments);if(t){this.Deactivate(u);delete m.lastItem;delete m.lastMenu}return r},Mouseup:function(s,u){if(!this.disabled){if(!this.menu.posted){if(this.timer){clearTimeout(this.timer);delete this.timer}this.menu.Post(s,u)}else{var t=document.getElementById("MathJax_MenuFrame").childNodes,r=t.length-1;while(r>=0){var v=t[r];v.menuItem.posted=false;v.parentNode.removeChild(v);if(v.menuItem===this.menu){break}r--}}}return h(s)}});a.ITEM.RADIO=a.ITEM.Subclass({variable:null,marker:(n?"\u25CF":"\u2713"),Init:function(s,r,t){if(!(s instanceof Array)){s=[s,s]}this.name=s;this.variable=r;this.With(t);if(this.value==null){this.value=this.name[0]}},Label:function(s,t){var r={className:"MathJax_MenuRadioCheck"};if(p.settings[this.variable]!==this.value){r={style:{display:"none"}}}return[["span",r,[this.marker]]," "+this.Name()]},Mouseup:function(u,v){if(!this.disabled){var w=v.parentNode.childNodes;for(var s=0,r=w.length;s/g,">");var u=o("EqSource","MathJax Equation Source");if(a.isMobile){r.document.open();r.document.write(""+u+"");r.document.write("

"+v+"
");r.document.write("
");r.document.write("");r.document.close()}else{r.document.open();r.document.write(""+u+"");r.document.write("
"+v+"
");r.document.write("");r.document.close();var s=r.document.body.firstChild;setTimeout(function(){var A=(r.outerHeight-r.innerHeight)||30,z=(r.outerWidth-r.innerWidth)||30,w,B;z=Math.max(100,Math.min(Math.floor(0.5*screen.width),s.offsetWidth+z+25));A=Math.max(40,Math.min(Math.floor(0.5*screen.height),s.offsetHeight+A+25));r.resizeTo(z,A);if(t&&t.screenX!=null){w=Math.max(0,Math.min(t.screenX-Math.floor(z/2),screen.width-z-20));B=Math.max(0,Math.min(t.screenY-Math.floor(A/2),screen.height-A-20));r.moveTo(w,B)}},50)}};a.Scale=function(){var s=b["HTML-CSS"],r=b.NativeMML,v=b.SVG;var u=(s||r||v||{config:{scale:100}}).config.scale;var t=prompt(o("ScaleMath","Scale all mathematics (compared to surrounding text) by"),u+"%");if(t){if(t.match(/^\s*\d+(\.\d*)?\s*%?\s*$/)){t=parseFloat(t);if(t){if(t!==u){if(s){s.config.scale=t}if(r){r.config.scale=t}if(v){v.config.scale=t}a.cookie.scale=t;a.saveCookie();c.Reprocess()}}else{alert(o("NonZeroScale","The scale should not be zero"))}}else{alert(o("PercentScale","The scale should be a percentage (e.g., 120%%)"))}}};a.Zoom=function(){if(!MathJax.Extension.MathZoom){k.Require("[MathJax]/extensions/MathZoom.js")}};a.Renderer=function(){var s=c.outputJax["jax/mml"];if(s[0]!==p.settings.renderer){var v=c.Browser,u,r=a.Renderer.Messages,t;switch(p.settings.renderer){case"NativeMML":if(!p.settings.warnedMML){if(v.isChrome&&v.version.substr(0,3)!=="24."){u=r.MML.WebKit}else{if(v.isSafari&&!v.versionAtLeast("5.0")){u=r.MML.WebKit}else{if(v.isMSIE){if(!v.hasMathPlayer){u=r.MML.MSIE}}else{u=r.MML[v]}}}t="warnedMML"}break;case"SVG":if(!p.settings.warnedSVG){if(v.isMSIE&&!e){u=r.SVG.MSIE}}break}if(u){u=o(u[0],u[1]);u+="\n\n";u+=o("SwitchAnyway","Switch the renderer anyway?\n\n(Press OK to switch, CANCEL to continue with the current renderer)");a.cookie.renderer=s[0].id;a.saveCookie();if(!confirm(u)){a.cookie.renderer=p.settings.renderer=g.Cookie.Get("menu").renderer;a.saveCookie();return}if(t){a.cookie.warned=p.settings.warned=true}a.cookie.renderer=p.settings.renderer;a.saveCookie()}c.Queue(["setRenderer",c,p.settings.renderer,"jax/mml"],["Rerender",c])}};a.Renderer.Messages={MML:{WebKit:["WebkitNativeMMLWarning","Your browser doesn't seem to support MathML natively, so switching to MathML output may cause the mathematics on the page to become unreadable."],MSIE:["MSIENativeMMLWarning","Internet Explorer requires the MathPlayer plugin in order to process MathML output."],Opera:["OperaNativeMMLWarning","Opera's support for MathML is limited, so switching to MathML output may cause some expressions to render poorly."],Safari:["SafariNativeMMLWarning","Your browser's native MathML does not implement all the features used by MathJax, so some expressions may not render properly."],Firefox:["FirefoxNativeMMLWarning","Your browser's native MathML does not implement all the features used by MathJax, so some expressions may not render properly."]},SVG:{MSIE:["MSIESVGWarning","SVG is not implemented in Internet Explorer prior to IE9 or when it is emulating IE8 or below. Switching to SVG output will cause the mathematics to not display properly."]}};a.Font=function(){var r=b["HTML-CSS"];if(!r){return}document.location.reload()};a.Locale=function(){MathJax.Localization.setLocale(p.settings.locale);MathJax.Hub.Queue(["Reprocess",MathJax.Hub])};a.LoadLocale=function(){var r=prompt(o("LoadURL","Load translation data from this URL:"));if(r){if(!r.match(/\.js$/)){alert(o("BadURL","The URL should be for a javascript file that defines MathJax translation data. Javascript file names should end with '.js'"))}k.Require(r,function(s){if(s!=k.STATUS.OK){alert(o("BadData","Failed to load translation data from %1",r))}})}};a.MPEvents=function(t){var s=p.settings.discoverable,r=a.MPEvents.Messages;if(!e){if(p.settings.mpMouse&&!confirm(o.apply(o,r.IE8warning))){delete a.cookie.mpContext;delete p.settings.mpContext;delete a.cookie.mpMouse;delete p.settings.mpMouse;a.saveCookie();return}p.settings.mpContext=p.settings.mpMouse;a.cookie.mpContext=a.cookie.mpMouse=p.settings.mpMouse;a.saveCookie();MathJax.Hub.Queue(["Rerender",MathJax.Hub])}else{if(!s&&t.name[1]==="Menu Events"&&p.settings.mpContext){alert(o.apply(o,r.IE9warning))}}};a.MPEvents.Messages={IE8warning:["IE8warning","This will disable the MathJax menu and zoom features, but you can Alt-Click on an expression to obtain the MathJax menu instead.\n\nReally change the MathPlayer settings?"],IE9warning:["IE9warning","The MathJax contextual menu will be disabled, but you can Alt-Click on an expression to obtain the MathJax menu instead."]};c.Browser.Select({MSIE:function(r){var s=(document.compatMode==="BackCompat");var t=r.versionAtLeast("8.0")&&document.documentMode>7;a.Augment({margin:20,msieBackgroundBug:(document.documentMode<9),msieFixedPositionBug:(s||!t),msieAboutBug:s});if(e){delete p.styles["#MathJax_About"].filter;delete p.styles[".MathJax_Menu"].filter}},Firefox:function(r){a.skipMouseover=r.isMobile&&r.versionAtLeast("6.0");a.skipMousedown=r.isMobile}});a.isMobile=c.Browser.isMobile;a.noContextMenu=c.Browser.noContextMenu;a.CreateLocaleMenu=function(){if(!a.menu){return}var w=a.menu.Find("Language").menu,t=w.items;var s=[],y=MathJax.Localization.strings;for(var x in y){if(y.hasOwnProperty(x)){s.push(x)}}s=s.sort();w.items=[];for(var u=0,r=s.length;u0&&this.Get("scriptlevel")>0&&f>=0){return""}return this.TEXSPACELENGTH[Math.abs(f)]},TEXSPACELENGTH:["",a.LENGTH.THINMATHSPACE,a.LENGTH.MEDIUMMATHSPACE,a.LENGTH.THICKMATHSPACE],TEXSPACE:[[0,-1,2,3,0,0,0,1],[-1,-1,0,3,0,0,0,1],[2,2,0,0,2,0,0,2],[3,3,0,0,3,0,0,3],[0,0,0,0,0,0,0,0],[0,-1,2,3,0,0,0,1],[1,1,0,1,1,1,1,1],[1,-1,2,3,1,0,1,1]],autoDefault:function(d){return""},isSpacelike:function(){return false},isEmbellished:function(){return false},Core:function(){return this},CoreMO:function(){return this},hasNewline:function(){if(this.isEmbellished()){return this.CoreMO().hasNewline()}if(this.isToken||this.linebreakContainer){return false}for(var e=0,d=this.data.length;e=55296&&d.charCodeAt(0)<56320)?a.VARIANT.ITALIC:a.VARIANT.NORMAL)}return""},setTeXclass:function(e){this.getPrevClass(e);var d=this.data.join("");if(d.length>1&&d.match(/^[a-z][a-z0-9]*$/i)&&this.texClass===a.TEXCLASS.ORD){this.texClass=a.TEXCLASS.OP;this.autoOP=true}return this}});a.mn=a.mbase.Subclass({type:"mn",isToken:true,texClass:a.TEXCLASS.ORD,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT,dir:a.INHERIT}});a.mo=a.mbase.Subclass({type:"mo",isToken:true,defaults:{mathvariant:a.INHERIT,mathsize:a.INHERIT,mathbackground:a.INHERIT,mathcolor:a.INHERIT,dir:a.INHERIT,form:a.AUTO,fence:a.AUTO,separator:a.AUTO,lspace:a.AUTO,rspace:a.AUTO,stretchy:a.AUTO,symmetric:a.AUTO,maxsize:a.AUTO,minsize:a.AUTO,largeop:a.AUTO,movablelimits:a.AUTO,accent:a.AUTO,linebreak:a.LINEBREAK.AUTO,lineleading:a.INHERIT,linebreakstyle:a.AUTO,linebreakmultchar:a.INHERIT,indentalign:a.INHERIT,indentshift:a.INHERIT,indenttarget:a.INHERIT,indentalignfirst:a.INHERIT,indentshiftfirst:a.INHERIT,indentalignlast:a.INHERIT,indentshiftlast:a.INHERIT,texClass:a.AUTO},defaultDef:{form:a.FORM.INFIX,fence:false,separator:false,lspace:a.LENGTH.THICKMATHSPACE,rspace:a.LENGTH.THICKMATHSPACE,stretchy:false,symmetric:true,maxsize:a.SIZE.INFINITY,minsize:"0em",largeop:false,movablelimits:false,accent:false,linebreak:a.LINEBREAK.AUTO,lineleading:"1ex",linebreakstyle:"before",indentalign:a.INDENTALIGN.AUTO,indentshift:"0",indenttarget:"",indentalignfirst:a.INDENTALIGN.INDENTALIGN,indentshiftfirst:a.INDENTSHIFT.INDENTSHIFT,indentalignlast:a.INDENTALIGN.INDENTALIGN,indentshiftlast:a.INDENTSHIFT.INDENTSHIFT,texClass:a.TEXCLASS.REL},SPACE_ATTR:{lspace:1,rspace:2,form:4},useMMLspacing:7,autoDefault:function(f,l){var k=this.def;if(!k){if(f==="form"){this.useMMLspacing&=~this.SPACE_ATTR.form;return this.getForm()}var j=this.data.join("");var e=[this.Get("form"),a.FORM.INFIX,a.FORM.POSTFIX,a.FORM.PREFIX];for(var g=0,d=e.length;g=55296&&j<56320){j=(((j-55296)<<10)+(h.charCodeAt(1)-56320))+65536}for(var f=0,d=this.RANGES.length;f=0;d--){if(this.data[0]&&!this.data[d].isSpacelike()){return this.data[d]}}return null},Core:function(){if(!(this.isEmbellished())||typeof(this.core)==="undefined"){return this}return this.data[this.core]},CoreMO:function(){if(!(this.isEmbellished())||typeof(this.core)==="undefined"){return this}return this.data[this.core].CoreMO()},toString:function(){if(this.inferred){return"["+this.data.join(",")+"]"}return this.SUPER(arguments).toString.call(this)},setTeXclass:function(f){for(var e=0,d=this.data.length;e0){d++}return d},adjustChild_texprimestyle:function(d){if(d==this.den){return true}return this.Get("texprimestyle")},setTeXclass:a.mbase.setSeparateTeXclasses});a.msqrt=a.mbase.Subclass({type:"msqrt",inferRow:true,linebreakContainer:true,texClass:a.TEXCLASS.ORD,setTeXclass:a.mbase.setSeparateTeXclasses,adjustChild_texprimestyle:function(d){return true}});a.mroot=a.mbase.Subclass({type:"mroot",linebreakContainer:true,texClass:a.TEXCLASS.ORD,adjustChild_displaystyle:function(d){if(d===1){return false}return this.Get("displaystyle")},adjustChild_scriptlevel:function(e){var d=this.Get("scriptlevel");if(e===1){d+=2}return d},adjustChild_texprimestyle:function(d){if(d===0){return true}return this.Get("texprimestyle")},setTeXclass:a.mbase.setSeparateTeXclasses});a.mstyle=a.mbase.Subclass({type:"mstyle",isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,inferRow:true,defaults:{scriptlevel:a.INHERIT,displaystyle:a.INHERIT,scriptsizemultiplier:Math.sqrt(1/2),scriptminsize:"8pt",mathbackground:a.INHERIT,mathcolor:a.INHERIT,dir:a.INHERIT,infixlinebreakstyle:a.LINEBREAKSTYLE.BEFORE,decimalseparator:"."},adjustChild_scriptlevel:function(f){var e=this.scriptlevel;if(e==null){e=this.Get("scriptlevel")}else{if(String(e).match(/^ *[-+]/)){delete this.scriptlevel;var d=this.Get("scriptlevel");this.scriptlevel=e;e=d+parseInt(e)}}return e},inheritFromMe:true,noInherit:{mpadded:{width:true,height:true,depth:true,lspace:true,voffset:true},mtable:{width:true,height:true,depth:true,align:true}},setTeXclass:a.mbase.setChildTeXclass});a.merror=a.mbase.Subclass({type:"merror",inferRow:true,linebreakContainer:true,texClass:a.TEXCLASS.ORD});a.mpadded=a.mbase.Subclass({type:"mpadded",inferRow:true,isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,width:"",height:"",depth:"",lspace:0,voffset:0},setTeXclass:a.mbase.setChildTeXclass});a.mphantom=a.mbase.Subclass({type:"mphantom",texClass:a.TEXCLASS.ORD,inferRow:true,isSpacelike:a.mbase.childrenSpacelike,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,setTeXclass:a.mbase.setChildTeXclass});a.mfenced=a.mbase.Subclass({type:"mfenced",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,open:"(",close:")",separators:","},texClass:a.TEXCLASS.OPEN,setTeXclass:function(g){this.getPrevClass(g);var e=this.getValues("open","close","separators");e.open=e.open.replace(/[ \t\n\r]/g,"");e.close=e.close.replace(/[ \t\n\r]/g,"");e.separators=e.separators.replace(/[ \t\n\r]/g,"");if(e.open!==""){this.SetData("open",a.mo(e.open).With({stretchy:true,texClass:a.TEXCLASS.OPEN}));g=this.data.open.setTeXclass(g)}if(e.separators!==""){while(e.separators.length0){return false}return this.Get("displaystyle")},adjustChild_scriptlevel:function(e){var d=this.Get("scriptlevel");if(e>0){d++}return d},adjustChild_texprimestyle:function(d){if(d===this.sub){return true}return this.Get("texprimestyle")},setTeXclass:a.mbase.setBaseTeXclasses});a.msub=a.msubsup.Subclass({type:"msub"});a.msup=a.msubsup.Subclass({type:"msup",sub:2,sup:1});a.mmultiscripts=a.msubsup.Subclass({type:"mmultiscripts",adjustChild_texprimestyle:function(d){if(d%2===1){return true}return this.Get("texprimestyle")}});a.mprescripts=a.mbase.Subclass({type:"mprescripts"});a.none=a.mbase.Subclass({type:"none"});a.munderover=a.mbase.Subclass({type:"munderover",base:0,under:1,over:2,sub:1,sup:2,ACCENTS:["","accentunder","accent"],linebreakContainer:true,isEmbellished:a.mbase.childEmbellished,Core:a.mbase.childCore,CoreMO:a.mbase.childCoreMO,defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,accent:a.AUTO,accentunder:a.AUTO,align:a.ALIGN.CENTER,texClass:a.AUTO,subscriptshift:"",superscriptshift:""},autoDefault:function(d){if(d==="texClass"){return(this.isEmbellished()?this.CoreMO().Get(d):a.TEXCLASS.ORD)}if(d==="accent"&&this.data[this.over]){return this.data[this.over].CoreMO().Get("accent")}if(d==="accentunder"&&this.data[this.under]){return this.data[this.under].CoreMO().Get("accent")}return false},adjustChild_displaystyle:function(d){if(d>0){return false}return this.Get("displaystyle")},adjustChild_scriptlevel:function(f){var e=this.Get("scriptlevel");var d=(this.data[this.base]&&!this.Get("displaystyle")&&this.data[this.base].CoreMO().Get("movablelimits"));if(f==this.under&&(d||!this.Get("accentunder"))){e++}if(f==this.over&&(d||!this.Get("accent"))){e++}return e},adjustChild_texprimestyle:function(d){if(d===this.base&&this.data[this.over]){return true}return this.Get("texprimestyle")},setTeXclass:a.mbase.setBaseTeXclasses});a.munder=a.munderover.Subclass({type:"munder"});a.mover=a.munderover.Subclass({type:"mover",over:1,under:2,sup:1,sub:2,ACCENTS:["","accent","accentunder"]});a.mtable=a.mbase.Subclass({type:"mtable",defaults:{mathbackground:a.INHERIT,mathcolor:a.INHERIT,align:a.ALIGN.AXIS,rowalign:a.ALIGN.BASELINE,columnalign:a.ALIGN.CENTER,groupalign:"{left}",alignmentscope:true,columnwidth:a.WIDTH.AUTO,width:a.WIDTH.AUTO,rowspacing:"1ex",columnspacing:".8em",rowlines:a.LINES.NONE,columnlines:a.LINES.NONE,frame:a.LINES.NONE,framespacing:"0.4em 0.5ex",equalrows:false,equalcolumns:false,displaystyle:false,side:a.SIDE.RIGHT,minlabelspacing:"0.8em",texClass:a.TEXCLASS.ORD,useHeight:1},inheritFromMe:true,noInherit:{mover:{align:true},munder:{align:true},munderover:{align:true},mtable:{align:true,rowalign:true,columnalign:true,groupalign:true,alignmentscope:true,columnwidth:true,width:true,rowspacing:true,columnspacing:true,rowlines:true,columnlines:true,frame:true,framespacing:true,equalrows:true,equalcolumns:true,side:true,minlabelspacing:true,texClass:true,useHeight:1}},linebreakContainer:true,Append:function(){for(var e=0,d=arguments.length;e>10)+55296)+String.fromCharCode((d&1023)+56320)}});a.xml=a.mbase.Subclass({type:"xml",Init:function(){this.div=document.createElement("div");return this.SUPER(arguments).Init.apply(this,arguments)},Append:function(){for(var e=0,d=arguments.length;e":c.REL,"?":[1,1,b.CLOSE],"\\":c.ORD,"^":c.ORD11,_:c.ORD11,"|":[2,2,b.ORD,{fence:true,stretchy:true,symmetric:true}],"#":c.ORD,"$":c.ORD,"\u002E":[0,3,b.PUNCT,{separator:true}],"\u02B9":c.ORD,"\u0300":c.ACCENT,"\u0301":c.ACCENT,"\u0303":c.WIDEACCENT,"\u0304":c.ACCENT,"\u0306":c.ACCENT,"\u0307":c.ACCENT,"\u0308":c.ACCENT,"\u030C":c.ACCENT,"\u0332":c.WIDEACCENT,"\u0338":c.REL4,"\u2015":[0,0,b.ORD,{stretchy:true}],"\u2017":[0,0,b.ORD,{stretchy:true}],"\u2020":c.BIN3,"\u2021":c.BIN3,"\u20D7":c.ACCENT,"\u2111":c.ORD,"\u2113":c.ORD,"\u2118":c.ORD,"\u211C":c.ORD,"\u2205":c.ORD,"\u221E":c.ORD,"\u2305":c.BIN3,"\u2306":c.BIN3,"\u2322":c.REL4,"\u2323":c.REL4,"\u2329":c.OPEN,"\u232A":c.CLOSE,"\u23AA":c.ORD,"\u23AF":[0,0,b.ORD,{stretchy:true}],"\u23B0":c.OPEN,"\u23B1":c.CLOSE,"\u2500":c.ORD,"\u25EF":c.BIN3,"\u2660":c.ORD,"\u2661":c.ORD,"\u2662":c.ORD,"\u2663":c.ORD,"\u3008":c.OPEN,"\u3009":c.CLOSE,"\uFE37":c.WIDEACCENT,"\uFE38":c.WIDEACCENT}}},{OPTYPES:c});a.mo.prototype.OPTABLE.infix["^"]=c.WIDEREL;a.mo.prototype.OPTABLE.infix._=c.WIDEREL})(MathJax.ElementJax.mml);MathJax.ElementJax.mml.loadComplete("jax.js"); +MathJax.Hub.Register.LoadHook("[MathJax]/jax/element/mml/jax.js",function(){var b="2.3";var a=MathJax.ElementJax.mml;SETTINGS=MathJax.Hub.config.menuSettings;a.mbase.Augment({toMathML:function(k){var g=(this.inferred&&this.parent.inferRow);if(k==null){k=""}var e=this.type,d=this.toMathMLattributes();if(e==="mspace"){return k+"<"+e+d+" />"}var j=[];var h=(this.isToken?"":k+(g?"":" "));for(var f=0,c=this.data.length;f")}}}if(this.isToken){return k+"<"+e+d+">"+j.join("")+""}if(g){return j.join("\n")}if(j.length===0||(j.length===1&&j[0]==="")){return k+"<"+e+d+" />"}return k+"<"+e+d+">\n"+j.join("\n")+"\n"+k+""},toMathMLattributes:function(){var j=[],g=this.defaults;var c=(this.attrNames||a.copyAttributeNames),l=a.skipAttributes;if(this.type==="math"&&(!this.attr||!this.attr.xmlns)){j.push('xmlns="http://www.w3.org/1998/Math/MathML"')}if(!this.attrNames){if(this.type==="mstyle"){g=a.math.prototype.defaults}for(var d in g){if(!l[d]&&g.hasOwnProperty(d)){var e=(d==="open"||d==="close");if(this[d]!=null&&(e||this[d]!==g[d])){var k=this[d];delete this[d];if(e||this.Get(d)!==k){j.push(d+'="'+this.toMathMLattribute(k)+'"')}this[d]=k}}}}for(var h=0,f=c.length;h126){f[g]="&#x"+k.toString(16).toUpperCase()+";"}else{var j={"&":"&","<":"<",">":">",'"':"""}[f[g]];if(j){f[g]=j}}}else{if(g+1\n"+g.join("\n")+"\n"+h+""}});a.munderover.Augment({toMathML:function(h){var e=this.type;if(this.data[this.under]==null){e="mover"}if(this.data[this.over]==null){e="munder"}var d=this.toMathMLattributes();delete this.data[0].inferred;var g=[];for(var f=0,c=this.data.length;f\n"+g.join("\n")+"\n"+h+""}});a.TeXAtom.Augment({toMathML:function(d){var c=this.toMathMLattributes();if(!c&&this.data[0].data.length===1){return d.substr(2)+this.data[0].toMathML(d)}return d+"\n"+this.data[0].toMathML(d+" ")+"\n"+d+""}});a.chars.Augment({toMathML:function(c){return(c||"")+this.toMathMLquote(this.toString())}});a.entity.Augment({toMathML:function(c){return(c||"")+"&"+this.data[0]+";"}});a.xml.Augment({toMathML:function(c){return(c||"")+this.toString()}});MathJax.Hub.Register.StartupHook("TeX mathchoice Ready",function(){a.TeXmathchoice.Augment({toMathML:function(c){return this.Core().toMathML(c)}})});MathJax.Hub.Startup.signal.Post("toMathML Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/toMathML.js"); +(function(b,e){var d="2.3";var a=b.CombineConfig("TeX.noErrors",{disabled:false,multiLine:true,inlineDelimiters:["",""],style:{"font-size":"90%","text-align":"left",color:"black",padding:"1px 3px",border:"1px solid"}});var c="\u00A0";MathJax.Extension["TeX/noErrors"]={version:d,config:a};b.Register.StartupHook("TeX Jax Ready",function(){var f=MathJax.InputJax.TeX.formatError;MathJax.InputJax.TeX.Augment({formatError:function(j,i,k,g){if(a.disabled){return f.apply(this,arguments)}var h=j.message.replace(/\n.*/,"");b.signal.Post(["TeX Jax - parse error",h,i,k,g]);var m=a.inlineDelimiters;var l=(k||a.multiLine);if(!k){i=m[0]+i+m[1]}if(l){i=i.replace(/ /g,c)}else{i=i.replace(/\n/g," ")}return MathJax.ElementJax.mml.merror(i).With({isError:true,multiLine:l})}})});b.Register.StartupHook("HTML-CSS Jax Config",function(){b.Config({"HTML-CSS":{styles:{".MathJax .noError":b.Insert({"vertical-align":(b.Browser.isMSIE&&a.multiLine?"-2px":"")},a.style)}}})});b.Register.StartupHook("HTML-CSS Jax Ready",function(){var g=MathJax.ElementJax.mml;var h=MathJax.OutputJax["HTML-CSS"];var f=g.math.prototype.toHTML,i=g.merror.prototype.toHTML;g.math.Augment({toHTML:function(j,k){var l=this.data[0];if(l&&l.data[0]&&l.data[0].isError){j.style.fontSize="";j=this.HTMLcreateSpan(j);j.bbox=l.data[0].toHTML(j).bbox}else{j=f.call(this,j,k)}return j}});g.merror.Augment({toHTML:function(p){if(!this.isError){return i.call(this,p)}p=this.HTMLcreateSpan(p);p.className="noError";if(this.multiLine){p.style.display="inline-block"}var r=this.data[0].data[0].data.join("").split(/\n/);for(var o=0,l=r.length;o1){var n=(q.h+q.d)/2,j=h.TeX.x_height/2;p.parentNode.style.verticalAlign=h.Em(q.d+(j-n));q.h=j+n;q.d=n-j}p.bbox={h:q.h,d:q.d,w:k,lw:0,rw:k};return p}})});b.Register.StartupHook("SVG Jax Config",function(){b.Config({SVG:{styles:{".MathJax_SVG .noError":b.Insert({"vertical-align":(b.Browser.isMSIE&&a.multiLine?"-2px":"")},a.style)}}})});b.Register.StartupHook("SVG Jax Ready",function(){var g=MathJax.ElementJax.mml;var f=g.math.prototype.toSVG,h=g.merror.prototype.toSVG;g.math.Augment({toSVG:function(i,j){var k=this.data[0];if(k&&k.data[0]&&k.data[0].isError){i=k.data[0].toSVG(i)}else{i=f.call(this,i,j)}return i}});g.merror.Augment({toSVG:function(n){if(!this.isError||this.Parent().type!=="math"){return h.call(this,n)}n=e.addElement(n,"span",{className:"noError",isMathJax:true});if(this.multiLine){n.style.display="inline-block"}var o=this.data[0].data[0].data.join("").split(/\n/);for(var l=0,j=o.length;l1){var k=n.offsetHeight/2;n.style.verticalAlign=(-k+(k/j))+"px"}return n}})});b.Register.StartupHook("NativeMML Jax Ready",function(){var h=MathJax.ElementJax.mml;var g=MathJax.Extension["TeX/noErrors"].config;var f=h.math.prototype.toNativeMML,i=h.merror.prototype.toNativeMML;h.math.Augment({toNativeMML:function(j){var k=this.data[0];if(k&&k.data[0]&&k.data[0].isError){j=k.data[0].toNativeMML(j)}else{j=f.call(this,j)}return j}});h.merror.Augment({toNativeMML:function(n){if(!this.isError){return i.call(this,n)}n=n.appendChild(document.createElement("span"));var o=this.data[0].data[0].data.join("").split(/\n/);for(var l=0,k=o.length;l1){n.style.verticalAlign="middle"}}for(var p in g.style){if(g.style.hasOwnProperty(p)){var j=p.replace(/-./g,function(m){return m.charAt(1).toUpperCase()});n.style[j]=g.style[p]}}return n}})});b.Startup.signal.Post("TeX noErrors Ready")})(MathJax.Hub,MathJax.HTML);MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/noErrors.js"); +MathJax.Extension["TeX/noUndefined"]={version:"2.3",config:MathJax.Hub.CombineConfig("TeX.noUndefined",{disabled:false,attributes:{mathcolor:"red"}})};MathJax.Hub.Register.StartupHook("TeX Jax Ready",function(){var b=MathJax.Extension["TeX/noUndefined"].config;var a=MathJax.ElementJax.mml;var c=MathJax.InputJax.TeX.Parse.prototype.csUndefined;MathJax.InputJax.TeX.Parse.Augment({csUndefined:function(d){if(b.disabled){return c.apply(this,arguments)}MathJax.Hub.signal.Post(["TeX Jax - undefined control sequence",d]);this.Push(a.mtext(d).With(b.attributes))}});MathJax.Hub.Startup.signal.Post("TeX noUndefined Ready")});MathJax.Ajax.loadComplete("[MathJax]/extensions/TeX/noUndefined.js"); +(function(d,c,i){var h,g="\u00A0";var j=function(l){return MathJax.Localization._.apply(MathJax.Localization,[["TeX",l]].concat([].slice.call(arguments,1)))};var e=MathJax.Object.Subclass({Init:function(m,l){this.global={isInner:l};this.data=[b.start(this.global)];if(m){this.data[0].env=m}this.env=this.data[0].env},Push:function(){var n,l,o,p;for(n=0,l=arguments.length;n":"27E9","\\lt":"27E8","\\gt":"27E9","/":"/","|":["|",{texClass:h.TEXCLASS.ORD}],".":"","\\\\":"\\","\\lmoustache":"23B0","\\rmoustache":"23B1","\\lgroup":"27EE","\\rgroup":"27EF","\\arrowvert":"23D0","\\Arrowvert":"2016","\\bracevert":"23AA","\\Vert":["2225",{texClass:h.TEXCLASS.ORD}],"\\|":["2225",{texClass:h.TEXCLASS.ORD}],"\\vert":["|",{texClass:h.TEXCLASS.ORD}],"\\uparrow":"2191","\\downarrow":"2193","\\updownarrow":"2195","\\Uparrow":"21D1","\\Downarrow":"21D3","\\Updownarrow":"21D5","\\backslash":"\\","\\rangle":"27E9","\\langle":"27E8","\\rbrace":"}","\\lbrace":"{","\\}":"}","\\{":"{","\\rceil":"2309","\\lceil":"2308","\\rfloor":"230B","\\lfloor":"230A","\\lbrack":"[","\\rbrack":"]"},macros:{displaystyle:["SetStyle","D",true,0],textstyle:["SetStyle","T",false,0],scriptstyle:["SetStyle","S",false,1],scriptscriptstyle:["SetStyle","SS",false,2],rm:["SetFont",h.VARIANT.NORMAL],mit:["SetFont",h.VARIANT.ITALIC],oldstyle:["SetFont",h.VARIANT.OLDSTYLE],cal:["SetFont",h.VARIANT.CALIGRAPHIC],it:["SetFont","-tex-mathit"],bf:["SetFont",h.VARIANT.BOLD],bbFont:["SetFont",h.VARIANT.DOUBLESTRUCK],scr:["SetFont",h.VARIANT.SCRIPT],frak:["SetFont",h.VARIANT.FRAKTUR],sf:["SetFont",h.VARIANT.SANSSERIF],tt:["SetFont",h.VARIANT.MONOSPACE],tiny:["SetSize",0.5],Tiny:["SetSize",0.6],scriptsize:["SetSize",0.7],small:["SetSize",0.85],normalsize:["SetSize",1],large:["SetSize",1.2],Large:["SetSize",1.44],LARGE:["SetSize",1.73],huge:["SetSize",2.07],Huge:["SetSize",2.49],arcsin:["NamedFn"],arccos:["NamedFn"],arctan:["NamedFn"],arg:["NamedFn"],cos:["NamedFn"],cosh:["NamedFn"],cot:["NamedFn"],coth:["NamedFn"],csc:["NamedFn"],deg:["NamedFn"],det:"NamedOp",dim:["NamedFn"],exp:["NamedFn"],gcd:"NamedOp",hom:["NamedFn"],inf:"NamedOp",ker:["NamedFn"],lg:["NamedFn"],lim:"NamedOp",liminf:["NamedOp","lim inf"],limsup:["NamedOp","lim sup"],ln:["NamedFn"],log:["NamedFn"],max:"NamedOp",min:"NamedOp",Pr:"NamedOp",sec:["NamedFn"],sin:["NamedFn"],sinh:["NamedFn"],sup:"NamedOp",tan:["NamedFn"],tanh:["NamedFn"],limits:["Limits",1],nolimits:["Limits",0],overline:["UnderOver","00AF"],underline:["UnderOver","005F"],overbrace:["UnderOver","23DE",1],underbrace:["UnderOver","23DF",1],overrightarrow:["UnderOver","2192"],underrightarrow:["UnderOver","2192"],overleftarrow:["UnderOver","2190"],underleftarrow:["UnderOver","2190"],overleftrightarrow:["UnderOver","2194"],underleftrightarrow:["UnderOver","2194"],overset:"Overset",underset:"Underset",stackrel:["Macro","\\mathrel{\\mathop{#2}\\limits^{#1}}",2],over:"Over",overwithdelims:"Over",atop:"Over",atopwithdelims:"Over",above:"Over",abovewithdelims:"Over",brace:["Over","{","}"],brack:["Over","[","]"],choose:["Over","(",")"],frac:"Frac",sqrt:"Sqrt",root:"Root",uproot:["MoveRoot","upRoot"],leftroot:["MoveRoot","leftRoot"],left:"LeftRight",right:"LeftRight",middle:"Middle",llap:"Lap",rlap:"Lap",raise:"RaiseLower",lower:"RaiseLower",moveleft:"MoveLeftRight",moveright:"MoveLeftRight",",":["Spacer",h.LENGTH.THINMATHSPACE],":":["Spacer",h.LENGTH.MEDIUMMATHSPACE],">":["Spacer",h.LENGTH.MEDIUMMATHSPACE],";":["Spacer",h.LENGTH.THICKMATHSPACE],"!":["Spacer",h.LENGTH.NEGATIVETHINMATHSPACE],enspace:["Spacer",".5em"],quad:["Spacer","1em"],qquad:["Spacer","2em"],thinspace:["Spacer",h.LENGTH.THINMATHSPACE],negthinspace:["Spacer",h.LENGTH.NEGATIVETHINMATHSPACE],hskip:"Hskip",hspace:"Hskip",kern:"Hskip",mskip:"Hskip",mspace:"Hskip",mkern:"Hskip",Rule:["Rule"],Space:["Rule","blank"],big:["MakeBig",h.TEXCLASS.ORD,0.85],Big:["MakeBig",h.TEXCLASS.ORD,1.15],bigg:["MakeBig",h.TEXCLASS.ORD,1.45],Bigg:["MakeBig",h.TEXCLASS.ORD,1.75],bigl:["MakeBig",h.TEXCLASS.OPEN,0.85],Bigl:["MakeBig",h.TEXCLASS.OPEN,1.15],biggl:["MakeBig",h.TEXCLASS.OPEN,1.45],Biggl:["MakeBig",h.TEXCLASS.OPEN,1.75],bigr:["MakeBig",h.TEXCLASS.CLOSE,0.85],Bigr:["MakeBig",h.TEXCLASS.CLOSE,1.15],biggr:["MakeBig",h.TEXCLASS.CLOSE,1.45],Biggr:["MakeBig",h.TEXCLASS.CLOSE,1.75],bigm:["MakeBig",h.TEXCLASS.REL,0.85],Bigm:["MakeBig",h.TEXCLASS.REL,1.15],biggm:["MakeBig",h.TEXCLASS.REL,1.45],Biggm:["MakeBig",h.TEXCLASS.REL,1.75],mathord:["TeXAtom",h.TEXCLASS.ORD],mathop:["TeXAtom",h.TEXCLASS.OP],mathopen:["TeXAtom",h.TEXCLASS.OPEN],mathclose:["TeXAtom",h.TEXCLASS.CLOSE],mathbin:["TeXAtom",h.TEXCLASS.BIN],mathrel:["TeXAtom",h.TEXCLASS.REL],mathpunct:["TeXAtom",h.TEXCLASS.PUNCT],mathinner:["TeXAtom",h.TEXCLASS.INNER],vcenter:["TeXAtom",h.TEXCLASS.VCENTER],mathchoice:["Extension","mathchoice"],buildrel:"BuildRel",hbox:["HBox",0],text:"HBox",mbox:["HBox",0],fbox:"FBox",strut:"Strut",mathstrut:["Macro","\\vphantom{(}"],phantom:"Phantom",vphantom:["Phantom",1,0],hphantom:["Phantom",0,1],smash:"Smash",acute:["Accent","00B4"],grave:["Accent","0060"],ddot:["Accent","00A8"],tilde:["Accent","007E"],bar:["Accent","00AF"],breve:["Accent","02D8"],check:["Accent","02C7"],hat:["Accent","005E"],vec:["Accent","2192"],dot:["Accent","02D9"],widetilde:["Accent","007E",1],widehat:["Accent","005E",1],matrix:"Matrix",array:"Matrix",pmatrix:["Matrix","(",")"],cases:["Matrix","{","","left left",null,".1em",null,true],eqalign:["Matrix",null,null,"right left",h.LENGTH.THICKMATHSPACE,".5em","D"],displaylines:["Matrix",null,null,"center",null,".5em","D"],cr:"Cr","\\":"CrLaTeX",newline:"Cr",hline:["HLine","solid"],hdashline:["HLine","dashed"],eqalignno:["Matrix",null,null,"right left right",h.LENGTH.THICKMATHSPACE+" 3em",".5em","D"],leqalignno:["Matrix",null,null,"right left right",h.LENGTH.THICKMATHSPACE+" 3em",".5em","D"],bmod:["Macro","\\mathbin{\\mmlToken{mo}{mod}}"],pmod:["Macro","\\pod{\\mmlToken{mi}{mod}\\kern 6mu #1}",1],mod:["Macro","\\mathchoice{\\kern18mu}{\\kern12mu}{\\kern12mu}{\\kern12mu}\\mmlToken{mi}{mod}\\,\\,#1",1],pod:["Macro","\\mathchoice{\\kern18mu}{\\kern8mu}{\\kern8mu}{\\kern8mu}(#1)",1],iff:["Macro","\\;\\Longleftrightarrow\\;"],skew:["Macro","{{#2{#3\\mkern#1mu}\\mkern-#1mu}{}}",3],mathcal:["Macro","{\\cal #1}",1],mathscr:["Macro","{\\scr #1}",1],mathrm:["Macro","{\\rm #1}",1],mathbf:["Macro","{\\bf #1}",1],mathbb:["Macro","{\\bbFont #1}",1],Bbb:["Macro","{\\bbFont #1}",1],mathit:["Macro","{\\it #1}",1],mathfrak:["Macro","{\\frak #1}",1],mathsf:["Macro","{\\sf #1}",1],mathtt:["Macro","{\\tt #1}",1],textrm:["Macro","\\mathord{\\rm\\text{#1}}",1],textit:["Macro","\\mathord{\\it{\\text{#1}}}",1],textbf:["Macro","\\mathord{\\bf{\\text{#1}}}",1],pmb:["Macro","\\rlap{#1}\\kern1px{#1}",1],TeX:["Macro","T\\kern-.14em\\lower.5ex{E}\\kern-.115em X"],LaTeX:["Macro","L\\kern-.325em\\raise.21em{\\scriptstyle{A}}\\kern-.17em\\TeX"]," ":["Macro","\\text{ }"],not:"Not",dots:"Dots",space:"Tilde",begin:"Begin",end:"End",newcommand:["Extension","newcommand"],renewcommand:["Extension","newcommand"],newenvironment:["Extension","newcommand"],renewenvironment:["Extension","newcommand"],def:["Extension","newcommand"],let:["Extension","newcommand"],verb:["Extension","verb"],boldsymbol:["Extension","boldsymbol"],tag:["Extension","AMSmath"],notag:["Extension","AMSmath"],label:["Extension","AMSmath"],ref:["Extension","AMSmath"],eqref:["Extension","AMSmath"],nonumber:["Macro","\\notag"],unicode:["Extension","unicode"],color:"Color",href:["Extension","HTML"],"class":["Extension","HTML"],style:["Extension","HTML"],cssId:["Extension","HTML"],bbox:["Extension","bbox"],mmlToken:"MmlToken",require:"Require"},environment:{array:["AlignedArray"],matrix:["Array",null,null,null,"c"],pmatrix:["Array",null,"(",")","c"],bmatrix:["Array",null,"[","]","c"],Bmatrix:["Array",null,"\\{","\\}","c"],vmatrix:["Array",null,"\\vert","\\vert","c"],Vmatrix:["Array",null,"\\Vert","\\Vert","c"],cases:["Array",null,"\\{",".","ll",null,".2em","T"],equation:[null,"Equation"],"equation*":[null,"Equation"],eqnarray:["ExtensionEnv",null,"AMSmath"],"eqnarray*":["ExtensionEnv",null,"AMSmath"],align:["ExtensionEnv",null,"AMSmath"],"align*":["ExtensionEnv",null,"AMSmath"],aligned:["ExtensionEnv",null,"AMSmath"],multline:["ExtensionEnv",null,"AMSmath"],"multline*":["ExtensionEnv",null,"AMSmath"],split:["ExtensionEnv",null,"AMSmath"],gather:["ExtensionEnv",null,"AMSmath"],"gather*":["ExtensionEnv",null,"AMSmath"],gathered:["ExtensionEnv",null,"AMSmath"],alignat:["ExtensionEnv",null,"AMSmath"],"alignat*":["ExtensionEnv",null,"AMSmath"],alignedat:["ExtensionEnv",null,"AMSmath"]},p_height:1.2/0.85});if(this.config.Macros){var l=this.config.Macros;for(var m in l){if(l.hasOwnProperty(m)){if(typeof(l[m])==="string"){f.macros[m]=["Macro",l[m]]}else{f.macros[m]=["Macro"].concat(l[m])}f.macros[m].isUser=true}}}};var a=MathJax.Object.Subclass({Init:function(m,n){this.string=m;this.i=0;this.macroCount=0;var l;if(n){l={};for(var o in n){if(n.hasOwnProperty(o)){l[o]=n[o]}}}this.stack=d.Stack(l,!!n);this.Parse();this.Push(b.stop())},Parse:function(){var m,l;while(this.i=55296&&l<56320){m+=this.string.charAt(this.i++)}if(f.special[m]){this[f.special[m]](m)}else{if(f.letter.test(m)){this.Variable(m)}else{if(f.digit.test(m)){this.Number(m)}else{this.Other(m)}}}}},Push:function(){this.stack.Push.apply(this.stack,arguments)},mml:function(){if(this.stack.Top().type!=="mml"){return null}return this.stack.Top().data[0]},mmlToken:function(l){return l},ControlSequence:function(o){var l=this.GetCS(),n=this.csFindMacro(l);if(n){if(!(n instanceof Array)){n=[n]}var m=n[0];if(!(m instanceof Function)){m=this[m]}m.apply(this,[o+l].concat(n.slice(1)))}else{if(f.mathchar0mi[l]){this.csMathchar0mi(l,f.mathchar0mi[l])}else{if(f.mathchar0mo[l]){this.csMathchar0mo(l,f.mathchar0mo[l])}else{if(f.mathchar7[l]){this.csMathchar7(l,f.mathchar7[l])}else{if(f.delimiter["\\"+l]!=null){this.csDelimiter(l,f.delimiter["\\"+l])}else{this.csUndefined(o+l)}}}}}},csFindMacro:function(l){return f.macros[l]},csMathchar0mi:function(l,n){var m={mathvariant:h.VARIANT.ITALIC};if(n instanceof Array){m=n[1];n=n[0]}this.Push(this.mmlToken(h.mi(h.entity("#x"+n)).With(m)))},csMathchar0mo:function(l,n){var m={stretchy:false};if(n instanceof Array){m=n[1];m.stretchy=false;n=n[0]}this.Push(this.mmlToken(h.mo(h.entity("#x"+n)).With(m)))},csMathchar7:function(l,n){var m={mathvariant:h.VARIANT.NORMAL};if(n instanceof Array){m=n[1];n=n[0]}if(this.stack.env.font){m.mathvariant=this.stack.env.font}this.Push(this.mmlToken(h.mi(h.entity("#x"+n)).With(m)))},csDelimiter:function(l,n){var m={};if(n instanceof Array){m=n[1];n=n[0]}if(n.length===4){n=h.entity("#x"+n)}else{n=h.chars(n)}this.Push(this.mmlToken(h.mo(n).With({fence:false,stretchy:false}).With(m)))},csUndefined:function(l){d.Error(["UndefinedControlSequence","Undefined control sequence %1",l])},Variable:function(m){var l={};if(this.stack.env.font){l.mathvariant=this.stack.env.font}this.Push(this.mmlToken(h.mi(h.chars(m)).With(l)))},Number:function(o){var l,m=this.string.slice(this.i-1).match(f.number);if(m){l=h.mn(m[0].replace(/[{}]/g,""));this.i+=m[0].length-1}else{l=h.mo(h.chars(o))}if(this.stack.env.font){l.mathvariant=this.stack.env.font}this.Push(this.mmlToken(l))},Open:function(l){this.Push(b.open())},Close:function(l){this.Push(b.close())},Tilde:function(l){this.Push(h.mtext(h.chars(g)))},Space:function(l){},Superscript:function(p){if(this.GetNext().match(/\d/)){this.string=this.string.substr(0,this.i+1)+" "+this.string.substr(this.i+1)}var l,o,m,n=this.stack.Top();if(n.type==="prime"){m=n.data[0];o=n.data[1];this.stack.Pop()}else{m=this.stack.Prev();if(!m){m=h.mi("")}}if(m.isEmbellishedWrapper){m=m.data[0].data[0]}if(m.type==="msubsup"){if(m.data[m.sup]){d.Error(["DoubleExponent","Double exponent: use braces to clarify"])}l=m.sup}else{if(m.movesupsub){if(m.type!=="munderover"||m.data[m.over]){if(m.movablelimits&&m.isa(h.mi)){m=this.mi2mo(m)}m=h.munderover(m,null,null).With({movesupsub:true})}l=m.over}else{m=h.msubsup(m,null,null);l=m.sup}}this.Push(b.subsup(m).With({position:l,primes:o}))},Subscript:function(p){if(this.GetNext().match(/\d/)){this.string=this.string.substr(0,this.i+1)+" "+this.string.substr(this.i+1)}var l,o,m,n=this.stack.Top();if(n.type==="prime"){m=n.data[0];o=n.data[1];this.stack.Pop()}else{m=this.stack.Prev();if(!m){m=h.mi("")}}if(m.isEmbellishedWrapper){m=m.data[0].data[0]}if(m.type==="msubsup"){if(m.data[m.sub]){d.Error(["DoubleSubscripts","Double subscripts: use braces to clarify"])}l=m.sub}else{if(m.movesupsub){if(m.type!=="munderover"||m.data[m.under]){if(m.movablelimits&&m.isa(h.mi)){m=this.mi2mo(m)}m=h.munderover(m,null,null).With({movesupsub:true})}l=m.under}else{m=h.msubsup(m,null,null);l=m.sub}}this.Push(b.subsup(m).With({position:l,primes:o}))},PRIME:"\u2032",SMARTQUOTE:"\u2019",Prime:function(n){var m=this.stack.Prev();if(!m){m=h.mi()}if(m.type==="msubsup"&&m.data[m.sup]){d.Error(["DoubleExponentPrime","Prime causes double exponent: use braces to clarify"])}var l="";this.i--;do{l+=this.PRIME;this.i++,n=this.GetNext()}while(n==="'"||n===this.SMARTQUOTE);l=["","\u2032","\u2033","\u2034","\u2057"][l.length]||l;this.Push(b.prime(m,this.mmlToken(h.mo(l))))},mi2mo:function(l){var m=h.mo();m.Append.apply(m,l.data);var n;for(n in m.defaults){if(m.defaults.hasOwnProperty(n)&&l[n]!=null){m[n]=l[n]}}for(n in h.copyAttributes){if(h.copyAttributes.hasOwnProperty(n)&&l[n]!=null){m[n]=l[n]}}return m},Comment:function(l){while(this.id.config.MAXMACROS){d.Error(["MaxMacroSub1","MathJax maximum macro substitution count exceeded; is there a recursive macro call?"])}},Matrix:function(m,o,t,q,s,n,l,u){var r=this.GetNext();if(r===""){d.Error(["MissingArgFor","Missing argument for %1",m])}if(r==="{"){this.i++}else{this.string=r+"}"+this.string.slice(this.i+1);this.i=0}var p=b.array().With({requireClose:true,arraydef:{rowspacing:(n||"4pt"),columnspacing:(s||"1em")}});if(u){p.isCases=true}if(o||t){p.open=o;p.close=t}if(l==="D"){p.arraydef.displaystyle=true}if(q!=null){p.arraydef.columnalign=q}this.Push(p)},Entry:function(o){this.Push(b.cell().With({isEntry:true,name:o}));if(this.stack.Top().isCases){var n=this.string;var r=0,p=this.i,l=n.length;while(pd.config.MAXMACROS){d.Error(["MaxMacroSub2","MathJax maximum substitution count exceeded; is there a recursive latex environment?"])}if(!(o instanceof Array)){o=[o]}var l=b.begin().With({name:n,end:o[1],parse:this});if(o[0]&&this[o[0]]){l=this[o[0]].apply(this,[l].concat(o.slice(2)))}this.Push(l)},End:function(l){this.Push(b.end().With({name:this.GetArgument(l)}))},envFindName:function(l){return f.environment[l]},Equation:function(l,m){return m},ExtensionEnv:function(m,l){this.Extension(m.name,l,"environment")},Array:function(m,o,t,r,s,n,l,p){if(!r){r=this.GetArgument("\\begin{"+m.name+"}")}var u=("c"+r).replace(/[^clr|:]/g,"").replace(/[^|:]([|:])+/g,"$1");r=r.replace(/[^clr]/g,"").split("").join(" ");r=r.replace(/l/g,"left").replace(/r/g,"right").replace(/c/g,"center");var q=b.array().With({arraydef:{columnalign:r,columnspacing:(s||"1em"),rowspacing:(n||"4pt")}});if(u.match(/[|:]/)){if(u.charAt(0).match(/[|:]/)){q.frame.push("left");q.frame.dashed=u.charAt(0)===":"}if(u.charAt(u.length-1).match(/[|:]/)){q.frame.push("right")}u=u.substr(1,u.length-2);q.arraydef.columnlines=u.split("").join(" ").replace(/[^|: ]/g,"none").replace(/\|/g,"solid").replace(/:/g,"dashed")}if(o){q.open=this.convertDelimiter(o)}if(t){q.close=this.convertDelimiter(t)}if(l==="D"){q.arraydef.displaystyle=true}else{if(l){q.arraydef.displaystyle=false}}if(l==="S"){q.arraydef.scriptlevel=1}if(p){q.arraydef.useHeight=false}this.Push(m);return q},AlignedArray:function(l){var m=this.GetBrackets("\\begin{"+l.name+"}");return this.setArrayAlign(this.Array.apply(this,arguments),m)},setArrayAlign:function(m,l){l=this.trimSpaces(l||"");if(l==="t"){m.arraydef.align="baseline 1"}else{if(l==="b"){m.arraydef.align="baseline -1"}else{if(l==="c"){m.arraydef.align="center"}else{if(l){m.arraydef.align=l}}}}return m},convertDelimiter:function(l){if(l){l=f.delimiter[l]}if(l==null){return null}if(l instanceof Array){l=l[0]}if(l.length===4){l=String.fromCharCode(parseInt(l,16))}return l},trimSpaces:function(l){if(typeof(l)!="string"){return l}return l.replace(/^\s+|\s+$/g,"")},nextIsSpace:function(){return this.string.charAt(this.i).match(/[ \n\r\t]/)},GetNext:function(){while(this.nextIsSpace()){this.i++}return this.string.charAt(this.i)},GetCS:function(){var l=this.string.slice(this.i).match(/^([a-z]+|.) ?/i);if(l){this.i+=l[1].length;return l[1]}else{this.i++;return" "}},GetArgument:function(m,n){switch(this.GetNext()){case"":if(!n){d.Error(["MissingArgFor","Missing argument for %1",m])}return null;case"}":if(!n){d.Error(["ExtraCloseMissingOpen","Extra close brace or missing open brace"])}return null;case"\\":this.i++;return"\\"+this.GetCS();case"{":var l=++this.i,o=1;while(this.im.length){d.Error(["IllegalMacroParam","Illegal macro parameter reference"])}o=this.AddArgs(this.AddArgs(o,p),m[q-1]);p=""}}else{p+=q}}}return this.AddArgs(o,p)},AddArgs:function(m,l){if(l.match(/^[a-z]/i)&&m.match(/(^|[^\\])(\\\\)*\\[a-z]+$/i)){m+=" "}if(m.length+l.length>d.config.MAXBUFFER){d.Error(["MaxBufferSize","MathJax internal buffer size exceeded; is there a recursive macro call?"])}return m+l}});d.Augment({Stack:e,Parse:a,Definitions:f,Startup:k,config:{MAXMACROS:10000,MAXBUFFER:5*1024},sourceMenuTitle:["TeXCommands","TeX Commands"],prefilterHooks:MathJax.Callback.Hooks(true),postfilterHooks:MathJax.Callback.Hooks(true),Config:function(){this.SUPER(arguments).Config.apply(this,arguments);if(this.config.equationNumbers.autoNumber!=="none"){if(!this.config.extensions){this.config.extensions=[]}this.config.extensions.push("AMSmath.js")}},Translate:function(l){var m,n=false,p=MathJax.HTML.getScript(l);var r=(l.type.replace(/\n/g," ").match(/(;|\s|\n)mode\s*=\s*display(;|\s|\n|$)/)!=null);var q={math:p,display:r,script:l};this.prefilterHooks.Execute(q);p=q.math;try{m=d.Parse(p).mml()}catch(o){if(!o.texError){throw o}m=this.formatError(o,p,r,l);n=true}if(m.inferred){m=h.apply(MathJax.ElementJax,m.data)}else{m=h(m)}if(r){m.root.display="block"}if(n){m.texError=true}q.math=m;this.postfilterHooks.Execute(q);return q.math},prefilterMath:function(m,n,l){return m},postfilterMath:function(m,n,l){this.combineRelations(m.root);return m},formatError:function(o,n,p,l){var m=o.message.replace(/\n.*/,"");c.signal.Post(["TeX Jax - parse error",m,n,p,l]);return h.Error(m)},Error:function(l){if(l instanceof Array){l=j.apply(j,l)}throw c.Insert(Error(l),{texError:true})},Macro:function(l,m,n){f.macros[l]=["Macro"].concat([].slice.call(arguments,1));f.macros[l].isUser=true},fenced:function(n,m,o){var l=h.mrow();l.open=n;l.close=o;if(n){l.Append(h.mo(n).With({fence:true,stretchy:true,texClass:h.TEXCLASS.OPEN}))}if(m.type==="mrow"){l.Append.apply(l,m.data)}else{l.Append(m)}if(o){l.Append(h.mo(o).With({fence:true,stretchy:true,texClass:h.TEXCLASS.CLOSE}))}return l},combineRelations:function(p){var q,l,o,n;for(q=0,l=p.data.length;q0){o+="rl";m.push("0em 0em");p--}m=m.join(" ");if(h){return this.AMSarray(k,i,h,o,m)}var l=this.Array.call(this,k,null,null,o,m,".5em","D");return this.setArrayAlign(l,j)},EquationBegin:function(h,i){this.checkEqnEnv();this.stack.global.forcetag=(i&&a.autoNumber!=="none");return h},EquationStar:function(h,i){this.stack.global.tagged=true;return i},checkEqnEnv:function(){if(this.stack.global.eqnenv){g.Error(["ErroneousNestingEq","Erroneous nesting of equation structures"])}this.stack.global.eqnenv=true},MultiIntegral:function(h,l){var k=this.GetNext();if(k==="\\"){var j=this.i;k=this.GetArgument(h);this.i=j;if(k==="\\limits"){if(h==="\\idotsint"){l="\\!\\!\\mathop{\\,\\,"+l+"}"}else{l="\\!\\!\\!\\mathop{\\,\\,\\,"+l+"}"}}}this.string=l+" "+this.string.slice(this.i);this.i=0},xArrow:function(j,n,m,h){var k={width:"+"+(m+h)+"mu",lspace:m+"mu"};var o=this.GetBrackets(j),p=this.ParseArg(j);var q=b.mo(b.chars(String.fromCharCode(n))).With({stretchy:true,texClass:b.TEXCLASS.REL});var i=b.munderover(q);i.SetData(i.over,b.mpadded(p).With(k).With({voffset:".15em"}));if(o){o=g.Parse(o,this.stack.env).mml();i.SetData(i.under,b.mpadded(o).With(k).With({voffset:"-.24em"}))}this.Push(i)},GetDelimiterArg:function(h){var i=this.trimSpaces(this.GetArgument(h));if(i==""){return null}if(d.delimiter[i]==null){g.Error(["MissingOrUnrecognizedDelim","Missing or unrecognized delimiter for %1",h])}return this.convertDelimiter(i)},GetStar:function(){var h=(this.GetNext()==="*");if(h){this.i++}return h}});e.Augment({autoTag:function(){var i=this.global;if(!i.notag){f.number++;i.tagID=a.formatNumber(f.number.toString());var h=g.Parse("\\text{"+a.formatTag(i.tagID)+"}",{}).mml();i.tag=b.mtd(h.With({id:a.formatID(i.tagID)}))}},getTag:function(){var i=this.global,h=i.tag;i.tagged=true;if(i.label){f.eqlabels[i.label]=i.tagID;if(a.useLabelIds){h.id=a.formatID(i.label)}}delete i.tag;delete i.tagID;delete i.label;return h}});e.multline=e.array.Subclass({type:"multline",Init:function(i,h){this.SUPER(arguments).Init.apply(this);this.numbered=(i&&a.autoNumber!=="none");this.save={notag:h.global.notag};h.global.tagged=!i&&!h.global.forcetag},EndEntry:function(){var h=b.mtd.apply(b,this.data);if(this.data.shove){h.columnalign=this.data.shove}this.row.push(h);this.data=[]},EndRow:function(){if(this.row.length!=1){g.Error(["MultlineRowsOneCol","The rows within the %1 environment must have exactly one column","multline"])}this.table.push(this.row);this.row=[]},EndTable:function(){this.SUPER(arguments).EndTable.call(this);if(this.table.length){var j=this.table.length-1,l,k=-1;if(!this.table[0][0].columnalign){this.table[0][0].columnalign=b.ALIGN.LEFT}if(!this.table[j][0].columnalign){this.table[j][0].columnalign=b.ALIGN.RIGHT}if(!this.global.tag&&this.numbered){this.autoTag()}if(this.global.tag&&!this.global.notags){k=(this.arraydef.side==="left"?0:this.table.length-1);this.table[k]=[this.getTag()].concat(this.table[k])}for(l=0,j=this.table.length;l element, not %1","<"+h.firstChild.nodeName+">"])}this.mml=this.MakeMML(h.firstChild)},MakeMML:function(h){var i=String(h.getAttribute("class")||"");var f,g=h.nodeName.toLowerCase().replace(/^[a-z]+:/,"");var e=(i.match(/(^| )MJX-TeXAtom-([^ ]*)/));if(e){f=this.TeXAtom(e[2])}else{if(!(a[g]&&a[g].isa&&a[g].isa(a.mbase))){MathJax.Hub.signal.Post(["MathML Jax - unknown node type",g]);return a.Error(b("UnknownNodeType","Unknown node type: %1",g))}else{f=a[g]()}}this.AddAttributes(f,h);this.CheckClass(f,f["class"]);this.AddChildren(f,h);if(c.config.useMathMLspacing){f.useMMLspacing=8}return f},TeXAtom:function(f){var e=a.TeXAtom().With({texClass:a.TEXCLASS[f]});if(e.texClass===a.TEXCLASS.OP){e.movesupsub=e.movablelimits=true}return e},CheckClass:function(f,h){h=(h||"").split(/ /);var j=[];for(var g=0,e=h.length;g=2){var l=e.data[0],n=e.data[e.data.length-1];if(l.type==="mo"&&l.Get("fence")&&n.type==="mo"&&n.Get("fence")){if(l.data[0]){e.open=l.data.join("")}if(n.data[0]){e.close=n.data.join("")}}}},preProcessMath:function(f){if(f.match(/^<[a-z]+:/i)&&!f.match(/^<[^<>]* xmlns:/)){f=f.replace(/^<([a-z]+)(:math)/i,'<$1$2 xmlns:$1="http://www.w3.org/1998/Math/MathML"')}var e=f.match(/^(])+)>)/i);if(e&&e[2].match(/ (?!xmlns=)[a-z]+=\"http:/i)){f=e[1].replace(/ (?!xmlns=)([a-z]+=(['"])http:.*?\2)/ig," xmlns:$1 $1")+f.substr(e[0].length)}if(f.match(/^]* xmlns=/)){f=f.replace(/^<(math)/i,'\s*$/,"$2");return f.replace(/&([a-z][a-z0-9]*);/ig,this.replaceEntity)},trimSpace:function(e){return e.replace(/[\t\n\r]/g," ").replace(/^ +/,"").replace(/ +$/,"").replace(/ +/g," ")},replaceEntity:function(g,f){if(f.match(/^(lt|amp|quot)$/)){return g}if(c.Parse.Entity[f]){return c.Parse.Entity[f]}var h=f.charAt(0).toLowerCase();var e=f.match(/^[a-zA-Z](fr|scr|opf)$/);if(e){h=e[1]}if(!c.Parse.loaded[h]){c.Parse.loaded[h]=true;MathJax.Hub.RestartAfter(MathJax.Ajax.Require(c.entityDir+"/"+h+".js"))}return g}},{loaded:[]});c.Augment({sourceMenuTitle:["OriginalMathML","Original MathML"],prefilterHooks:MathJax.Callback.Hooks(true),postfilterHooks:MathJax.Callback.Hooks(true),Translate:function(e){if(!this.ParseXML){this.ParseXML=this.createParser()}var f,h,i={script:e};if(e.firstChild&&e.firstChild.nodeName.toLowerCase().replace(/^[a-z]+:/,"")==="math"){i.math=e.firstChild;this.prefilterHooks.Execute(i);h=i.math}else{h=MathJax.HTML.getScript(e);if(d.isMSIE){h=h.replace(/( )+$/,"")}i.math=h;this.prefilterHooks.Execute(i);h=i.math}try{f=c.Parse(h).mml}catch(g){if(!g.mathmlError){throw g}f=this.formatError(g,h,e)}i.math=a(f);this.postfilterHooks.Execute(i);return i.math},prefilterMath:function(f,e){return f},prefilterMathML:function(f,e){return f},formatError:function(h,g,e){var f=h.message.replace(/\n.*/,"");MathJax.Hub.signal.Post(["MathML Jax - parse error",f,g,e]);return a.Error(f)},Error:function(e){if(e instanceof Array){e=b.apply(b,e)}throw MathJax.Hub.Insert(Error(e),{mathmlError:true})},parseDOM:function(e){return this.parser.parseFromString(e,"text/xml")},parseMS:function(e){return(this.parser.loadXML(e)?this.parser:null)},parseDIV:function(e){this.div.innerHTML=e.replace(/<([a-z]+)([^>]*)\/>/g,"<$1$2>");return this.div},parseError:function(e){return null},createMSParser:function(){var j=null;var f=["MSXML2.DOMDocument.6.0","MSXML2.DOMDocument.5.0","MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0","MSXML2.DOMDocument.2.0","Microsoft.XMLDOM"];for(var g=0,e=f.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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + + + + + + + + T + + + + + diff --git a/dist/extensions/placemark.png b/dist/extensions/placemark.png new file mode 100644 index 0000000000000000000000000000000000000000..0756c598a546160212fde0cc5932211d61a1c89c GIT binary patch literal 1214 zcmV;v1VQ_WP)D%S$qJ{H4=9!wPAj)CNfx;026#Q#k6|*v9Wj8@$}1H5A8v^W zoK~)4g1_O0;RgfnJF1ZEXS_QMIIXrxDiUSuy5a*HUPq=Au;k5D<6-e?U-Ulu` zt<3Zv+<9)e(@60fTq$S6T+g|`MYx2=G35%1I9&F9Cdxq25a%V9p(s*jb9buq&}VvK zn#tj^=VR!p$>t|)w1eG@vtL78Rm@gm-N#U)Zj(RM?-I*!2N{*wN?c{kN?Z3aRH)nJ z0{Y4CZe+Oz_XeYgYb0K~&b79LB-LktB-kF5#U2(!~LI~H98r63R zIJ)O04BQx$8!Vke-O{^}<5xH{Ra57#J>k-}4&n5X*UUL8;Ow(|50`GU)xg&3|Z`mjSZaq2L4kx?0Md7t33|uPO!^e7u zu}*d~iZk-W!fDDvuJfJnMV@##m$Xe6dFgV&0c{jsn{06D=%Dbn$OWg}q<@j>|3aSU zaB*`e*0hy6cO5a2Cl-z?hvHu3#pX~(puix(vmoZ*V#n9UlS6S5c@@kYN-?@jQgc7C zf!fZgugT5G>oJME=p0HrBdPj{+Rmx3$<5YY%7{EVhtkQYbRYH1&#AB8-C%Bwd(YE! zlTqo%F8Y?b3zw#ABHK({lhA;B29KcbUb_6h2g^ph=-Z;RfGT*)1QO=(iaZoPtwuV&R1LP(;J6CC6JUA6zn8 z!lQx~5#J*4^;>%iPF6V4-7le<7#s6DpJv?` z@)|CL8D#wf<`XyTz7DV9I;n3y)HAB=%qIYDbJT=}hd8O5{xuqVaob>WgmYgxl$4Z| cl$2=w1-hEoXH!JVkN^Mx07*qoM6N<$f*^@fY5)KL literal 0 HcmV?d00001 diff --git a/dist/extensions/polygon-icons.svg b/dist/extensions/polygon-icons.svg new file mode 100644 index 00000000..732fa814 --- /dev/null +++ b/dist/extensions/polygon-icons.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/dist/extensions/polygon.png b/dist/extensions/polygon.png new file mode 100644 index 0000000000000000000000000000000000000000..5bb96ce90ec89b7e209d9b81264f08efbe718b2a GIT binary patch literal 16482 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 literal 0 HcmV?d00001 diff --git a/dist/extensions/shapelib/animal.json b/dist/extensions/shapelib/animal.json new file mode 100644 index 00000000..7861cc85 --- /dev/null +++ b/dist/extensions/shapelib/animal.json @@ -0,0 +1,21 @@ +{"data": { + "bat": "m143.40468,206.20782c-0.49527,-8.51843 -1.60919,-23.17813 -13.91826,-16.10698c-5.69614,2.11977 -22.79842,7.51244 -14.5293,-3.62979c-4.53243,-11.10219 -22.97476,5.42294 -24.24419,-2.29205c9.91943,-10.64906 -4.7813,-22.35199 -15.17139,-14.80321c-6.39341,1.76166 -19.4276,12.91188 -21.9789,9.37552c5.93793,-7.52516 19.31312,-22.93167 3.18112,-27.55084c-17.5302,-3.97589 -32.93319,8.09392 -48.1771,14.68205c-4.57452,3.57106 -10.39707,2.94862 -4.70683,-2.99597c19.7419,-30.64111 50.72646,-53.70857 85.10566,-65.43076c8.33369,-2.70812 21.16511,-8.70424 21.41656,4.97536c5.15313,12.59007 8.81947,28.33097 22.08977,34.80917c15.28362,8.49702 4.32793,-24.52711 20.16156,-12.05241c6.66379,4.32207 20.92268,-3.91697 22.87737,0.71265c-3.88257,5.55579 -5.70456,15.41883 4.55382,10.3489c17.81406,-7.0078 30.89859,-22.70471 39.67026,-39.22318c9.16278,-1.3768 18.27335,5.56162 26.62798,9.24753c27.74529,15.70954 44.86571,45.39448 52.13728,75.65768c-7.5513,-4.24557 -14.87186,-12.828 -24.02185,-16.20273c-9.75534,-4.87419 -20.75789,-5.73363 -31.48114,-5.39867c-5.02554,5.98985 -7.99353,13.42558 -3.62529,20.86708c3.80284,14.25407 -12.13176,-4.90576 -17.88498,-6.20744c-10.74191,-7.67955 -21.03323,3.92213 -18.67635,14.82222c-2.42909,2.10051 -9.92085,-3.5218 -14.32263,-2.86926c-9.05026,-2.72606 -15.42468,1.20085 -9.97261,10.61331c-7.98315,-0.97417 -19.64474,-13.28291 -26.70493,-1.69363c-3.0779,2.89514 -4.66377,8.66307 -8.40561,10.34547z", + "bull": "m247.95622,28.12305c-12.19972,2.23394 -21.61887,16.95667 -20.74588,29.01591c1.44209,13.7284 17.93463,5.12075 22.80087,1.23941c-2.90906,11.49207 -26.14024,13.85409 -24.83565,-0.12387c-17.69467,13.05878 -30.95056,33.52913 -52.86781,40.14553c-19.77757,4.59067 -40.50726,3.0742 -60.45068,0.39017c-12.12445,-1.13604 -23.69794,-7.26224 -35.91985,-5.97962c-13.09134,3.59118 -23.59412,13.16467 -36.65408,16.93906c-13.77014,6.03062 -8.51065,22.6805 -9.70401,34.47604c0.36829,17.55977 -2.85913,36.16287 -15.09811,49.55722c-7.11563,10.54993 -7.76443,24.43282 -13.48046,35.44298c18.99679,-0.19772 7.54522,-25.59486 17.99728,-35.91756c14.58305,-6.75189 14.16003,-25.2986 16.19452,-38.95529c1.4834,-5.51941 0.74519,-25.08188 6.61763,-22.44334c7.21924,16.22275 11.33028,34.35388 9.69645,52.12326c-9.5553,8.96404 -24.74576,15.34862 -22.54872,31.87126c0.72458,14.96526 -8.38036,25.74033 -15.4907,37.48604c4.56749,6.89259 1.00608,20.69472 14.11573,16.65324c8.77115,1.68887 13.10825,-2.37698 4.45589,-8.42346c-13.07829,-12.56499 5.13552,-29.16821 12.20585,-40.168c7.30689,-12.28131 22.16195,-12.86801 33.02653,-20.13979c15.00671,-8.95824 25.97935,-22.79263 35.92999,-36.78595c8.71432,9.26259 -13.75776,17.74474 -17.07076,27.20334c-7.22755,7.75058 -20.15694,21.85651 -2.99889,26.65347c13.26358,4.53796 25.75887,13.79143 25.35975,28.30255c0.22051,9.84615 24.38135,18.76527 19.43611,2.77341c-8.3609,-14.92882 -28.34064,-20.79163 -33.65835,-37.70844c-3.6715,-12.98383 11.61318,-19.27325 18.93525,-8.74269c12.96419,-1.41862 26.57983,-10.04028 40.80356,-11.3647c14.66299,-5.4577 18.06927,14.52957 29.8145,19.76668c9.79047,9.67969 18.77974,21.93582 17.54285,36.4783c1.1926,12.30893 9.52699,25.16873 23.92239,23.90201c16.80026,-2.80963 -5.10118,-20.70317 -12.79568,-24.81631c-11.14896,-13.29695 -9.30676,-32.20113 -16.24597,-47.51259c-5.00217,-4.52083 0.22685,-26.45532 0.40694,-10.76334c-0.90044,17.98242 24.73294,7.66248 22.97939,-6.09152c4.36166,-10.95654 -11.58513,-4.19417 -9.47617,-15.24252c-1.73091,-13.74937 -0.74355,-30.75096 -12.6731,-40.17292c-6.8737,-6.7591 -4.7831,-7.41829 2.70201,-2.07212c14.59439,7.55807 11.75914,24.79303 12.78276,38.37691c4.22589,17.80225 21.30753,-5.24332 20.80711,-14.89757c2.92691,-20.96336 12.92174,-42.46973 32.42046,-52.68139c-5.2402,-2.56694 -30.94765,6.73531 -28.79092,-4.9679c10.59921,9.00244 25.18661,-0.80075 37.71524,1.85265c16.62164,0.68233 20.74963,-22.79317 2.53195,-23.94116c-11.78333,-6.98062 -21.92947,-19.31897 -37.15829,-18.35906c-22.07759,7.39931 -8.43927,-13.11165 -2.53694,-22.37832zm21.60802,9.50184c-1.66193,5.79599 -12.61478,17.62506 0.56973,12.83867c1.89221,-3.91013 1.1131,-8.97168 -0.56973,-12.83867zm-3.4996,26.34877c5.90985,9.81916 -11.80539,1.02993 0,0zm24.39551,10.15293c-2.05029,4.18517 5.51468,4.9676 -0.32553,4.96455c-3.08926,4.10121 -4.4324,-5.29953 0.32553,-4.96455z", + "camel": "m105.23692,274.01276c10.42601,-6.85904 -13.23158,-12.66162 -16.74452,-19.13904c-10.34003,-12.71768 -13.56136,-29.62202 -16.44211,-45.3219c4.95107,-8.43617 2.94567,-17.1517 4.73958,-25.91959c8.77055,-13.01825 13.62244,-28.29056 22.43666,-41.26205c9.81532,2.07159 20.42883,10.03517 30.26162,13.06094c8.8764,15.9576 -7.35719,29.2457 -5.44854,44.69498c3.72314,14.40366 -6.25101,26.40735 -8.25558,39.83173c0.06986,12.69931 11.61848,25.55493 24.23922,16.82416c-0.64038,-9.26088 -18.64324,-12.13185 -10.58395,-25.1562c2.65187,-13.46596 11.34413,-24.24693 17.91676,-35.55937c-3.71349,-13.26427 1.2287,-30.0778 9.59569,-40.02118c8.49532,8.2068 14.36288,22.63718 15.66277,34.12883c0.16464,13.17332 17.70532,21.98904 17.37173,37.50392c1.31061,13.71669 7.73416,26.77841 16.64259,34.21387c4.65822,9.68192 33.56361,4.63116 18.16859,-6.87111c-12.71291,-11.47281 -27.33986,-23.63953 -29.27029,-41.92267c-5.27388,-10.85303 6.84843,-26.2316 -8.03899,-30.76501c0.92262,-14.70679 -2.97293,-31.40077 5.40811,-44.51862c12.07202,-10.31686 29.7518,-11.08165 41.29709,-22.49498c14.0099,-9.28757 21.96306,-24.50421 26.44456,-40.2729c6.78918,-7.60537 17.33322,-24.04447 29.06323,-15.49826c11.50851,7.1165 3.01477,-10.78561 9.62354,-14.73589c-5.45358,-19.67866 -27.58679,-10.231 -41.40082,-15.14074c-12.54193,-8.39989 -25.52765,-3.55679 -34.67496,6.0378c-6.85069,3.08698 -3.14447,11.16754 3.57637,8.12783c-4.82072,16.0155 -11.46542,33.6401 -26.07742,43.1243c-16.7653,7.33572 -26.11705,-14.39821 -36.07204,-23.83146c-10.86565,-10.63506 -17.60231,-26.15123 -31.2878,-33.45204c-19.0355,-4.82 -33.49794,11.89507 -47.87449,21.30644c-14.26775,7.14342 -31.39994,10.67369 -41.13367,24.60683c-16.15372,19.41527 -5.91326,48.70807 -22.89915,67.80049c-6.99636,10.58755 -22.39972,18.21231 -20.28306,32.7636c7.50211,15.58318 0.92728,34.18239 5.02367,50.94881c3.02735,12.11708 7.50982,27.68176 22.18437,29.48123c11.54434,7.31882 17.83198,-8.01192 5.60827,-12.45197c-14.75563,-6.55614 -16.77197,-25.01053 -17.95741,-39.18628c-3.25454,-14.0275 7.86033,-23.30806 12.45064,-34.31837c-3.87635,-10.75487 9.79252,-25.37375 18.46243,-23.19664c-6.47958,9.9541 -15.94005,22.87103 -0.60315,31.06966c-0.20134,0.50305 2.25023,-9.18846 6.19941,-12.10042c-0.58951,-7.59273 -8.29086,-14.05685 -0.12206,-21.73929c14.33151,-9.55606 11.17263,18.16365 8.19696,26.02383c-0.15744,12.07039 -16.33567,21.65707 -8.0749,33.75336c9.04985,14.91904 13.29631,32.04613 16.76897,48.94904c4.98299,14.02148 17.57185,24.27618 33.31381,20.65268l2.58825,-0.02829z", + "cat": "m111.55353,268.57376c-12.38409,-9.66019 -26.54234,-3.66064 -40.17431,-4.38614c-11.9392,-10.23105 -26.45395,2.16507 -37.70551,-7.68756c-14.55057,-12.97847 10.67308,-21.10451 5.29292,-36.51207c-0.60409,-22.18257 -10.10326,-42.27484 -20.08909,-60.91698c-7.07184,-14.82233 -4.56518,-31.85568 -6.84103,-47.71686c-8.17014,-11.38815 -16.33076,-25.48726 -6.60928,-39.55753c10.981,-11.86565 5.81937,-27.47561 1.50418,-41.19728c11.10318,3.26597 23.84772,18.14071 38.4552,15.16287c9.93419,-6.39761 15.9648,-0.073 17.62218,11.6365c5.20781,15.03792 8.24681,35.60265 24.68163,40.4529c17.26196,4.92876 36.58965,6.02341 50.24171,20.484c24.96439,23.38795 36.53986,60.25828 35.56061,95.79604c2.26117,16.61917 23.11539,7.79897 33.43477,10.24997c17.3054,-0.76804 33.91818,4.66769 50.66774,8.39909c14.94962,3.97684 27.61282,-8.59756 41.65988,-10.10515c2.37341,14.53128 -16.06888,20.58582 -26.14133,25.0639c-11.95706,5.08662 -24.89989,5.20694 -37.1826,1.47655c-26.55344,-6.62021 -54.69701,-4.88251 -79.92953,6.75992c-13.61838,5.01505 -26.84254,14.51093 -41.6569,13.32327l-2.79124,-0.72549l0,0.00003z", + "chick": "m76.6114,300.49948c-0.94218,-11.68399 1.80264,-23.81186 -2.78349,-35.22473c-7.45612,-25.10127 -23.93798,-47.16536 -31.36633,-72.21014c-3.21228,-16.80365 -8.65163,-34.79272 -2.2363,-51.43718c9.2771,-20.44891 24.58445,-39.1077 45.00853,-51.46853c11.45798,-6.87112 33.39433,1.8131 33.44485,-16.51133c3.62297,-20.89642 15.43811,-40.3082 30.48538,-56.28489c17.86485,-17.49571 47.98021,-20.77926 71.28149,-10.72216c13.19823,4.36545 26.92773,11.92505 29.85556,25.342c-2.0408,13.23198 13.36339,22.40786 12.41484,34.53756c-13.98409,-0.03379 -27.4267,2.25514 -39.10866,9.99602c-8.20006,3.8867 -26.4511,6.08187 -12.88864,15.86904c12.71146,21.22634 12.39029,48.02362 0.02443,69.35255c-8.24092,16.61523 -18.78058,33.14909 -36.37866,43.00504c-13.36313,9.14961 -27.77914,16.93257 -42.68192,23.79149c-11.62872,11.1774 5.32764,27.26614 9.71201,38.8335c3.36447,3.54044 4.524,10.84882 11.15869,9.08932c15.28535,0.25418 32.76015,-1.9313 44.98404,7.81229c-8.94319,8.25949 -25.89421,-1.41025 -38.02573,4.80051c-8.78024,5.75812 -19.06332,7.43823 -31.36371,7.58014c-13.23612,4.30203 -27.23189,-3.61423 -39.08569,1.66962c-4.11388,0.41238 -8.38321,3.40195 -12.45068,2.1799zm58.28394,-16.2124c-4.84233,-9.87674 -20.53861,1.56897 -6.10292,2.32874c2.30783,-0.47092 12.8125,3.03821 6.10292,-2.32874zm-17.85122,-4.32443c14.82944,-9.3367 7.74453,-25.48042 -1.79045,-35.63309c-3.24258,-2.97528 -4.73457,-8.94336 -9.13439,-9.94019c-6.73362,0 -13.46722,0 -20.20084,0c-4.65086,8.49229 -2.48404,17.86589 0.89217,26.43201c3.51066,10.88467 6.16319,28.60654 23.56189,23.00385c2.6806,-0.4599 4.89924,-2.07458 6.67162,-3.86258z", + "cormorant": "m143.5415,0.99936c-4.24326,11.41716 -19.29625,4.15632 -24.74561,12.50427c0.52748,6.07653 -8.29025,7.80436 -13.00653,8.43892c-8.50133,3.84879 -22.80692,-4.79845 -26.45377,4.01417c10.96676,1.70561 23.50823,0.97173 33.37776,7.63992c6.81084,8.30698 18.80501,9.32233 23.86815,19.00227c5.01492,11.90637 0.21405,24.79235 -6.1066,35.16777c-5.40714,11.63457 -14.24293,22.0266 -17.15868,34.6068c0.20795,13.02319 4.72718,25.69211 3.20084,38.80902c0.9605,10.14279 6.64024,19.14648 10.04536,28.64983c5.00912,10.57565 9.93535,21.70013 17.62276,30.53665c7.02892,8.87558 29.89705,11.67009 23.64502,24.91443c-4.01926,11.10844 -7.40147,24.48637 -19.39478,29.5565c-9.50977,5.9848 -21.3932,8.93677 -29.06369,17.37073c3.84956,0.36453 28.16327,-14.36331 23.8996,1.69739c-9.52658,11.2518 16.95053,-0.69223 23.42963,-2.18207c4.74442,-0.99915 4.29691,14.62488 8.52766,3.80228c5.95903,-10.08762 6.23502,-21.34366 11.26126,-30.51312c2.4781,-10.25645 3.82962,7.94009 9.64467,10.12222c7.07556,9.50238 7.79694,-14.07236 11.23129,-19.70615c2.62747,-8.54028 4.63826,-23.31885 8.02322,-27.91885c0.19868,-2.83281 6.58795,3.93147 5.0274,-3.78851c0.90347,-23.48584 -1.83659,-48.86755 -15.67365,-68.59196c-9.60602,-8.62669 -13.22336,-21.57266 -21.36568,-31.47811c-10.01912,-4.8186 -8.05391,-19.66993 -20.19205,-21.12443c-2.75856,-10.2361 2.62035,-22.86311 4.63016,-33.73514c2.78795,-10.12834 8.4742,-20.66132 3.52232,-31.15684c-3.76698,-10.86702 -11.83783,-21.03737 -23.57631,-23.51091c-5.21049,-2.63619 -9.89668,-4.17218 -2.89241,-7.84742c4.71588,-7.73713 -7.28709,7.39913 -1.58588,-2.982l0.25854,-2.29765l-0.00003,0zm-57.08003,24.11987c12.78673,0.33177 -8.83535,0.35227 0,0zm92.46721,218.72338c11.05893,4.6954 0.80228,21.55537 -5.46918,26.98338c-13.1071,-3.20859 2.39713,-19.21964 5.46918,-26.98338l0,0zm-10.64413,31.82323c-5.88483,2.41168 -15.44353,4.13849 -3.83093,0.46683l1.97208,-0.34274l1.85886,-0.12408z", + "cow": "m28.0749,243.56958c-11.25466,-1.13762 -0.26117,-18.72878 -4.5063,-26.87576c-0.04291,-11.99254 -4.49496,-23.80263 -3.04635,-35.73141c8.85702,-21.03091 1.47632,-43.99974 -0.46577,-65.6628c-0.878,-4.78294 -0.85219,-17.06834 -3.03475,-6.14601c-6.04425,18.41563 -0.13999,41.17824 -5.30961,59.82921c-8.64015,10.38419 -15.16653,-6.09071 -6.91858,-12.40807c9.63606,-15.16887 7.3071,-35.6004 7.63113,-54.51396c-0.41477,-11.95865 4.38277,-26.97649 18.58104,-27.31744c12.14677,-0.91866 23.64877,4.86966 35.90276,4.15359c35.73927,0.55689 71.83095,0.86755 107.11801,-5.64501c17.61354,-4.0591 35.14902,3.10693 52.79015,0.20057c9.91351,1.07068 15.15811,-3.56471 10.78886,-12.26689c7.38425,-5.09429 13.06598,9.66071 16.34573,-3.48148c11.89191,-8.19559 13.54935,15.99933 26.71921,9.16614c15.88589,2.05862 -6.90274,16.26875 6.39813,23.38159c8.04169,6.20473 20.35629,21.57409 4.35831,26.00379c-13.75446,-0.96602 -27.54028,-0.06377 -41.30312,0.60226c-6.36993,10.6367 -19.62016,18.61491 -18.16837,32.55296c-1.1003,16.62756 -12.74783,33.02081 -28.69196,38.18489c-6.81386,-1.34894 -9.78644,0.85432 -8.9351,7.83342c-3.52046,9.11967 -4.14098,18.73875 -3.72333,28.43974c-1.04204,5.34808 1.17265,9.50755 4.32187,13.62691c-3.70361,6.41692 -24.92326,2.61598 -16.88379,-9.5238c2.05592,-15.92261 -0.36317,-31.91132 -2.16568,-47.74242c-8.4565,-6.01532 -18.70856,-3.81294 -27.26753,1.0208c-18.88187,6.9252 -40.73763,13.48228 -60.10471,4.59438c-10.79734,-3.01547 -27.0833,-5.25847 -35.10848,3.84904c-3.611,13.73518 -2.64567,28.48619 -5.7238,42.42607c-0.05178,7.28806 6.88112,13.54532 -4.86428,11.51134c-4.90851,0.11278 -9.83028,0.26732 -14.73372,-0.06165zm10.02217,-15.5108c1.93175,-6.52728 -2.78621,-23.11049 -3.1906,-7.64299c-1.60691,4.90746 0.4367,28.47777 2.83738,12.83046c0.15187,-1.72662 0.25968,-3.45683 0.35322,-5.18747z", + "crow_2": "m299.86716,62.24508c-8.36279,-13.35279 -25.79254,-10.94299 -38.7652,-13.97612c-10.77151,-4.46517 -27.26852,-8.74568 -34.93257,4.02601c-10.22766,11.92024 -19.30536,24.77381 -27.38379,38.20519c-16.9417,18.56395 -37.51366,33.44937 -58.19264,47.49408c-17.41919,8.55826 -36.48907,15.23247 -50.59015,29.17691c-26.77713,17.17799 -59.39612,20.30975 -89.00278,30.37996c5.24787,1.82477 28.48156,-4.80739 12.86404,2.45506c-11.61908,3.82678 4.57293,7.38318 9.74338,4.83008c-4.08242,4.36552 -5.2054,4.72249 -0.18473,4.65681c-9.12115,5.09712 20.25491,-1.58305 4.07883,5.5506c-7.04263,2.05971 -24.35976,21.06046 -8.48079,12.5005c14.76321,-6.14401 30.50038,-9.23448 45.85791,-13.45705c-11.48634,11.80891 -27.85513,19.19374 -35.74965,34.16698c0.17943,3.86479 12.21982,-7.85281 17.31087,-9.77229c28.95095,-17.49719 59.28473,-33.71347 91.89844,-43.16046c4.45381,1.07288 5.32478,12.99994 14.00563,6.90237c0.76199,7.59987 19.82927,-11.92125 14.84979,3.30377c8.25793,-13.03635 -0.01482,14.1528 7.62892,18.26904c3.90089,5.15268 19.92041,12.26512 6.86195,14.03082c-5.77165,8.63597 8.09146,-3.46425 11.11865,4.62627c11.3129,4.10901 3.07231,8.32173 -5.11652,5.83363c-6.27592,-0.83809 -7.57079,7.40965 -1.22719,2.29182c7.57507,5.19347 19.60568,3.32813 29.26515,5.56088c9.65308,0.80066 21.35422,-9.88435 25.01279,-7.29437c-8.89755,-6.38512 -21.77765,1.41119 -31.54323,-3.51736c-2.05963,-6.62599 22.89082,2.37143 22.94131,-8.82851c11.68727,-1.08766 -9.82895,-2.59717 -14.00406,0.04509c-14.38026,0.76889 -21.75813,-12.59969 -31.88164,-20.19017c0.30659,-15.75429 11.86186,-29.28856 23.95569,-38.18524c15.77855,-9.50124 31.96706,-21.73888 36.43575,-40.70174c4.63271,-16.88809 7.21239,-34.29048 9.31848,-51.60873c2.84918,-11.17406 11.03882,-21.49306 23.60089,-20.65947c6.77469,-0.94415 13.57404,-1.72816 20.30646,-2.95438z", + "crow": "m65.63132,15.69366c7.23991,-11.19251 23.71874,-13.17996 36.20271,-14.69413c13.92134,1.25098 24.65079,12.10254 32.81262,22.59631c9.49452,8.5772 21.08662,15.85565 25.83853,28.41352c12.01437,5.95259 26.19815,9.13653 33.55229,21.87244c11.11548,14.36729 17.52112,31.75739 23.31628,48.60368c0.92021,12.5585 6.47,24.01521 8.36046,36.46043c3.24197,12.33818 5.82637,24.53572 9.31963,36.76498c3.88237,12.71416 9.39792,24.81319 13.2628,37.54517c7.05891,11.17328 13.48564,22.96204 17.86821,35.4054c-10.48648,-0.88873 0.96857,15.8573 2.93524,22.45895c2.86746,13.58783 -12.84537,5.80856 -15.59308,-0.46634c-9.70456,9.1796 -29.57259,11.24072 -38.3669,-0.80743c-9.26392,-12.20752 -14.38051,-27.69696 -27.16855,-36.53391c-5.02811,-4.18506 -9.90665,-22.45958 -11.7061,-6.32031c6.38489,16.05743 -18.74254,6.90547 -27.66772,9.78912c-15.99664,-3.21661 6.07263,-12.35889 12.86923,-11.27576c6.38602,-6.35408 17.01372,-16.99594 1.7589,-20.33147c-10.44731,-4.15326 -23.84068,-14.68553 -29.71439,0.99188c-7.37552,3.90117 -20.59412,22.40862 -5.95329,23.77255c5.91614,12.10878 -17.0737,3.35048 -23.49316,6.21452c-6.05255,1.90814 -21.13758,-1.4375 -7.08788,-4.49867c12.08796,-1.9845 17.85132,-16.8317 25.44044,-25.82515c-0.25166,-11.53856 -9.48829,-20.69617 -16.41167,-29.40816c-7.36517,-12.27962 -17.64172,-22.79747 -22.75925,-36.23717c-3.35689,-13.95544 -9.74807,-26.85826 -12.98938,-40.84583c-3.65936,-14.01762 -7.85575,-29.82359 0.01893,-43.25633c3.58914,-11.78534 5.08364,-22.78083 -2.44828,-32.4814c-10.40722,-8.4583 -25.19866,-5.06594 -37.19873,-10.67507c-1.4463,-9.05923 17.76661,-12.5158 26.11695,-14.53937c3.17027,-0.11009 5.59681,-2.76167 8.88516,-2.69248z", + "dog": "m100.16203,296.98279c-8.8212,-9.63385 1.38332,-24.43997 -0.42293,-36.27057c0.75693,-11.26283 0.70357,-22.55605 0.97627,-33.83612c-5.62751,-3.03004 -11.14646,-9.8163 -17.39571,-9.15442c-9.39647,12.28885 -8.36188,28.63301 -15.80033,41.86707c-4.14935,12.68604 -14.20047,25.1369 -28.95629,23.20023c-15.78228,0.24448 -5.31179,-12.67972 3.94138,-14.51392c15.5036,-7.47278 14.489,-27.14363 17.24157,-41.59114c1.02824,-10.18478 3.24236,-20.5625 3.54647,-30.63432c-6.4542,-14.31418 -15.78849,-28.37114 -13.67442,-44.85196c-0.91037,-17.78856 4.2768,-37.23788 -5.08019,-53.53189c-5.56927,-15.61405 3.8713,-31.59072 2.9399,-47.52759c0.9721,-14.78285 -5.20505,-30.54867 1.20562,-44.61136c13.7762,-15.53139 12.97964,13.29988 18.95111,20.54415c5.64886,15.40877 24.7487,10.76537 35.50636,4.24826c7.2022,-4.10769 16.87807,-28.32801 24.44378,-14.32351c3.37997,14.22579 -6.14093,25.38077 -12.22646,36.88495c-6.86581,22.01683 5.86861,44.08519 20.93388,59.44197c24.83763,26.97977 44.07555,59.68134 54.0882,95.03609c1.31316,14.68071 3.98535,28.23558 12.82726,40.18617c10.20438,10.1714 26.16472,9.68739 39.32852,13.25957c9.22101,2.52521 30.75206,5.14639 26.47435,17.3808c-14.74448,2.4689 -30.09541,0.23105 -44.90068,-1.32291c-17.28331,-2.73001 -35.00906,-7.2897 -49.09666,-18.1597c-14.62904,-9.61427 -18.7715,20.00995 -34.01671,10.65375c-2.19362,-7.70334 10.66454,-19.74266 -6.53938,-19.26297c-6.33104,0.30879 -15.00338,1.82024 -19.76239,4.89166c1.07452,12.16098 2.04812,24.36316 4.2893,36.36713c-1.78267,6.00809 -14.15643,12.93057 -18.82182,5.63058z", + "duck": "m185.95239,299.43112c-13.71118,-7.29123 11.45862,-7.3541 17.23322,-7.85522c14.99724,-0.2811 17.02971,-18.28448 15.48773,-29.74414c-2.1938,-4.69699 -0.04752,-14.89349 -7.7746,-13.37029c-15.43901,-0.71622 -30.7112,-4.55923 -44.14467,-12.22302c-0.82443,12.88171 -7.29927,24.66777 -11.6053,36.85115c-5.66316,6.16721 14.39644,28.18469 0.43378,18.34869c-9.04433,-8.40845 0.06526,8.74658 -11.16418,3.91656c-15.23827,-0.31436 -31.02578,2.40784 -45.91216,-1.24551c-5.00268,-2.09833 -20.66561,0.51883 -9.25531,-6.49301c6.4804,-1.18185 12.15667,4.48007 17.05421,-2.03778c11.5948,4.79346 30.04866,4.82639 34.25867,-10.28015c7.00595,-11.43338 11.29851,-24.25136 11.56012,-37.68254c-8.2043,-6.31854 -14.70296,-14.48831 -18.43434,-24.21049c-8.62861,-14.22275 -24.3753,-22.02206 -37.28508,-31.87471c-17.12926,-11.15475 -36.8522,-23.99915 -40.20823,-46.00098c-4.08031,-16.32172 0.02216,-34.19492 11.59384,-46.57394c7.80417,-11.16946 22.31328,-21.55052 18.99293,-36.88489c-8.43674,-15.00933 -26.68094,1.9423 -34.96601,9.23433c-9.98,7.06196 -20.71845,24.17017 -34.34288,16.49594c-1.7172,-11.61691 13.7034,-18.90693 17.498,-29.74388c7.8585,-12.19844 12.51045,-26.37627 18.95516,-38.92993c11.65712,-10.85135 30.93148,-10.91782 42.45155,0.28526c14.7008,11.44654 23.86826,29.5425 22.42876,48.35335c1.4173,12.98959 -4.14301,29.91504 8.25453,38.93287c17.92052,9.9613 39.04935,12.35098 57.26444,21.89838c22.77972,10.51788 39.86913,29.49796 59.04057,45.11781c11.7964,10.71736 23.92368,21.11819 35.13879,32.44618c-7.49713,-2.24278 -14.43054,-6.05879 -21.60767,-9.15805c9.28815,12.08043 13.46152,26.94177 15.66077,41.78857c3.61584,15.73579 13.73315,31.11919 8.65729,47.77711c-4.42633,13.85214 -18.52838,-8.55096 -25.42393,-12.47198c-7.88147,-7.42908 -15.67812,-16.62666 -27.10399,-17.90884c-2.06194,13.35767 -4.18094,27.25305 -1.83514,40.63339c1.37479,11.84998 25.0215,4.73886 21.59566,13.51175c-19.80942,-2.16162 -39.69846,-0.3399 -59.55595,-0.59872l-2.94055,-0.30328l0,0z", + "eagle": "m42.43982,248.02586c11.79883,-9.19574 37.51548,5.68584 36.59332,-18.29665c11.6873,-8.23552 20.68873,-26.28419 1.79099,-32.32607c-10.7688,-5.1657 -15.8233,11.42451 -19.57125,12.4706c-7.77777,-10.83765 -3.38924,-28.5033 -0.32791,-39.95343c9.78217,-6.08578 25.82187,-13.03094 14.50231,-26.59097c-2.34529,-14.80103 -3.78094,-32.06657 -17.7612,-41.01302c-10.43393,-6.26692 -25.16679,-12.24148 -20.04643,-26.95332c-6.73619,-10.16047 -14.53631,-24.05076 -10.06464,-36.59579c10.19879,-1.80737 9.00111,23.96806 10.94535,18.5213c-3.83083,-8.28799 9.1568,-27.37077 8.41371,-9.7762c-0.78397,6.31187 -0.27625,19.10084 3.19139,6.43372c9.40052,-13.9652 0.18064,24.20846 9.40782,9.05938c6.50935,-2.10711 4.52592,9.32912 10.80828,3.67456c6.87772,5.25431 11.91442,6.4291 11.89108,15.161c9.16496,3.3132 16.00232,8.79374 14.18665,17.50479c17.88632,-4.31568 2.59483,17.992 15.32488,24.21275c6.86198,10.87837 9.94656,21.77702 9.45206,34.69591c14.12406,-3.90332 23.43909,-19.96727 38.02612,-24.96548c16.37712,-7.58971 22.24484,-26.45808 25.80173,-42.75597c1.58806,-7.86366 11.55658,-7.47865 8.4944,1.35465c11.47125,-12.36288 6.68346,-30.36211 9.92291,-45.39627c1.03862,-8.40902 -2.33224,-26.94658 4.74805,-28.67765c10.56419,9.48252 -2.34641,30.44621 7.95137,36.7387c7.25935,-13.5451 4.68625,-29.74639 5.07938,-44.52987c-0.17744,-8.53332 8.28981,-14.18234 7.88048,-2.00179c3.55096,10.5139 -0.40492,32.21981 1.64958,36.04613c8.07187,-12.48013 6.34647,-29.28694 14.90497,-41.01045c11.77513,4.41697 -3.33727,24.23894 -2.9549,34.73938c1.57841,8.06398 13.11919,-23.61583 13.7003,-6.1498c-5.31714,4.6162 -4.42737,17.32646 1.51364,7.08835c2.29477,-8.40776 17.99155,-5.58858 7.86148,2.08536c-7.52231,6.5335 13.19769,6.07413 4.12683,13.25697c6.05191,9.99521 -10.41388,15.90605 -0.99213,23.11055c-0.5419,2.90166 7.51996,8.55031 3.95645,15.5176c3.55255,6.41606 -12.64786,10.58171 -2.07687,14.97137c0.61145,14.96265 -18.29834,25.28072 -14.15472,39.25008c-1.22144,16.83496 -13.92377,30.96262 -27.51764,39.86047c-12.55846,2.38141 -22.29991,7.42523 -33.09448,14.38452c-7.10794,0.12218 -9.63133,0.08891 -13.34837,5.21904c-5.85042,-4.53848 -15.49744,-11.39697 -13.84404,2.34781c2.50378,17.06932 24.15945,18.76619 35.67772,27.84688c12.28496,4.33621 28.35258,18.74889 15.04837,30.03174c-1.28722,16.03848 -22.62962,6.43207 -28.17253,11.98065c-7.95277,1.1889 -7.12421,6.80249 -14.18958,0.10867c-6.88124,9.22229 -22.27397,-0.76007 -29.61287,-4.75983c-11.90405,5.67993 -17.34648,-22.86903 -19.53539,-2.88507c-4.83576,13.58316 -24.476,-1.01483 -24.37943,16.35269c-8.98567,-1.84631 -9.40855,12.19781 -19.04626,10.78702c6.06173,-2.81454 10.18479,-18.90897 -0.69688,-11.14999c-8.89938,-6.76031 -3.76038,16.63571 -11.0985,4.45398c-1.61417,-15.81525 16.34735,-16.12735 26.46889,-18.96848c3.63502,-9.19174 8.23714,-21.27525 7.27283,-30.1396c-9.56728,3.84567 -17.9573,12.08994 -29.11918,12.79019c0.69484,8.35417 -5.77779,21.85307 -15.72966,14.08031c14.30752,5.57813 7.98567,-25.05467 -0.66062,-9.91721c-3.38933,9.9873 -2.96938,-14.429 -12.7722,-7.32185c-5.13792,3.73692 -1.64958,12.39018 -6.75386,2.35237c-0.99273,-2.02373 -1.14814,-4.89752 0.9282,-6.35475z", + "elk": "m55.44169,70.04322c-9.46609,7.85901 -22.89024,10.68682 -35.01687,12.13352c-10.34381,-1.03976 -26.56821,7.31529 -15.97385,18.70621c7.56154,15.8879 23.87035,2.81345 34.83344,1.97973c6.74288,1.81747 9.04052,25.43575 14.68986,9.83006c3.84105,-12.93275 21.02425,-8.87709 30.14005,-4.40716c14.1686,4.39434 8.46609,22.12076 16.61138,31.95892c12.24081,12.85411 -1.67636,29.24428 -12.4499,37.76401c-12.75361,7.58044 -18.55984,19.76834 -16.78767,34.30325c0.04941,14.73842 -3.99104,30.75432 3.85034,44.19391c11.85099,1.57538 1.64103,-19.88701 4.92331,-27.40918c1.21214,-13.46214 -1.9274,-30.30058 10.90484,-39.28947c11.4828,-10.01157 23.57063,-19.55112 36.47411,-27.62581c12.21095,-0.62399 10.39299,17.77295 13.97888,26.40175c2.87054,13.20355 4.12752,27.58423 3.69688,40.50841c3.125,10.64038 5.51489,24.0757 -1.41217,31.57294c12.91045,1.34732 24.73607,-12.8914 14.16034,-24.30435c-4.26125,-15.94153 -5.71083,-32.54619 -8.8824,-48.75049c-1.29825,-11.53598 -3.35872,-25.34232 4.83759,-34.86038c12.05826,-0.41389 24.32834,12.14566 37.60088,4.59509c11.65439,-7.49344 33.21696,-6.53802 31.62036,11.82347c-3.2142,14.87534 1.55244,29.61519 2.2346,43.81203c-3.42354,18.43187 -22.15714,27.36267 -29.50255,43.57849c6.98146,9.64319 17.6196,-4.17101 24.65466,-8.5957c-1.74142,-12.99426 11.64835,-19.92599 15.71536,-30.922c6.9856,-14.97188 -3.20459,-32.25409 -2.75711,-46.36688c-5.96602,-12.06912 6.08081,-14.98056 11.07512,-3.9678c8.02901,10.14059 21.03195,16.80963 23.7973,30.43394c7.39731,10.39175 10.8736,22.49284 15.64307,34.03711c4.08353,6.21262 10.6907,18.02594 12.81412,3.55118c3.85464,-8.67506 1.42859,-14.46745 -6.31488,-15.1647c-13.17899,-14.6283 -10.83514,-37.51031 -25.72766,-51.16437c-10.90161,-6.89407 -22.06673,-14.37312 -25.85289,-27.85638c-6.71298,-10.98305 -8.98033,-24.34339 -5.63237,-36.85001c4.36508,-2.10748 7.17406,6.33847 3.86676,-3.07584c-7.08252,-11.81364 -21.74017,-16.42101 -34.30881,-20.12214c-13.86351,-4.31435 -28.287,-5.60372 -42.65346,-3.49644c-12.2518,3.14196 -25.56529,6.21495 -37.68355,0.56779c-10.80199,-6.45414 -23.34553,-5.2407 -34.37726,-0.35921c-8.31817,4.58586 -24.95089,-0.17232 -13.39404,-9.69791c-4.65558,-4.05794 -21.26908,7.53993 -8.94252,-2.36752c5.90361,-6.02524 8.73024,-18.58166 6.56192,-25.10496c-2.33636,8.03588 -5.7029,7.70039 -5.40219,-0.79288c-2.03959,15.14413 -12.13537,5.38195 -10.55587,1.00194c0.66773,6.1233 -2.56635,12.84344 -5.72467,3.23117c-0.3636,6.21597 2.87773,15.15818 -3.77972,17.71219c10.15314,9.32419 -13.24982,2.42432 -13.20099,-4.96754c-6.18471,-9.39983 -7.12771,-4.31873 -4.60736,3.21883c-4.59348,-3.34352 -10.47613,-9.66862 -5.36225,0.14767c5.84781,13.3303 21.7189,7.94385 31.61781,10.45553z", + "fish": "m127.20683,242.3436c1.50244,-15.94504 5.02446,-32.41927 12.88557,-46.10178c7.51215,-8.98547 19.63693,-8.71681 29.76314,-11.79086c-14.18819,-3.80443 -27.43222,-10.54059 -40.42705,-17.66788c-21.27006,-9.23157 -42.92073,4.06975 -62.09324,13.40138c-14.23518,6.80144 -28.31641,14.82532 -43.64474,18.1933c-10.05519,-6.98578 -1.65744,-26.80461 5.41335,-35.17271c8.9525,-11.55655 22.2043,-17.52696 31.90982,-28.07993c4.26963,-14.90575 -15.40321,-18.57297 -24.24153,-24.42971c-13.70577,-6.20512 -25.35116,-16.36843 -35.77064,-27.71589c24.19748,-1.40994 45.60231,13.61476 67.43612,22.73716c11.80957,4.27464 22.94788,10.28683 33.98999,16.23396c5.06265,-0.02556 22.24189,3.73252 20.52978,-2.03984c-12.8773,-0.57095 -11.58655,-17.22836 -2.92075,-23.83247c12.73701,-10.02242 28.26479,-15.93932 38.86842,-29.21478c4.65193,-3.7341 7.09996,-12.86792 11.03157,-15.74994c16.95282,13.24852 26.87143,34.14735 36.22475,53.96581c15.23062,3.44089 30.61246,6.23184 46.13637,7.07419c15.15991,6.93107 28.10406,19.01068 39.97369,31.27808c8.99451,6.78525 11.39157,25.24843 -0.83481,28.95241c-30.16479,16.24658 -63.84666,21.21309 -97.06413,22.77441c-4.67992,-0.32996 -8.75485,0.18372 -8.78621,6.33609c-2.92581,8.76227 -4.12184,18.94467 -9.62984,26.07907c-6.07878,-1.55455 -0.31998,-19.45975 -6.56294,-10.95245c-12.27982,13.32922 -27.04962,23.32567 -42.18671,32.26515c0,-2.18091 -0.00002,-4.36198 0.00002,-6.54276z", + "hare": "m95.22337,299.53546c-10.68459,-4.81824 3.25798,-14.45154 8.53654,-18.71286c3.55556,-3.28177 -20.37717,0.46036 -10.27298,-10.93198c11.08577,-9.30692 6.89815,-25.05217 -4.18282,-32.37115c-15.24973,-10.2968 -34.81611,-19.10942 -40.44992,-38.33635c-5.69662,-11.9756 7.81301,-24.58835 -0.87631,-35.40263c-6.99412,-14.0412 1.177,-28.68323 6.25594,-41.69022c2.33568,-17.99253 -11.97227,-32.2212 -19.84076,-47.00306c-9.74298,-14.12588 -15.35928,-30.58578 -16.16633,-47.73895c-2.11884,-7.3217 0.22601,-18.6921 8.68694,-8.82097c17.71845,14.18765 37.17033,27.65002 49.57116,47.06949c2.34735,7.01447 11.74658,27.34441 12.27144,8.93449c0.24582,-25.30315 7.97399,-52.90002 27.77682,-69.85634c13.46954,-12.2734 20.73361,9.21683 21.36209,20.13735c3.50587,21.487 -2.30553,42.79486 -8.78146,63.09225c-2.37738,9.43285 -8.56868,35.2823 9.08899,25.75117c40.67693,-15.70451 89.96005,0.78945 116.45525,34.52606c12.17961,16.33485 17.5135,37.32133 17.39308,57.47189c-6.27155,11.83836 17.03061,-0.22177 8.58704,13.43613c-4.97064,15.1297 -19.01465,23.33925 -28.85207,34.75906c-10.01038,9.15085 -2.58298,28.71576 -19.13725,31.59863c-24.15469,7.44629 -49.5191,10.70804 -74.66498,12.6066c-14.07156,2.88287 -20.90056,-13.20758 -7.41347,-19.89679c6.46608,-9.96799 24.96535,-10.66653 30.46185,-12.24564c-13.13484,1.28516 -29.33337,-4.0759 -40.40141,4.05872c-6.70294,10.88138 -12.07141,25.20364 -26.12755,28.30951c-6.3168,1.75439 -12.8116,3.16129 -19.27982,1.25558z", + "he_hen": "m176.04681,296.29803c-8.82596,-3.77927 -18.43298,1.74493 -27.86224,-3.75964c7.62581,-0.4744 19.08463,-0.03574 17.06104,-11.34488c3.33665,-13.20654 -3.43475,-27.06163 2.20258,-38.55534c-8.82878,-8.42361 -18.09561,-18.39673 -22.80272,-30.16238c-0.9447,4.74663 -1.81537,8.52257 -3.158,0.33916c-0.76965,-4.00471 -0.30261,9.89931 -3.24527,0.14346c-3.10373,-8.67493 -11.4597,-31.29446 -14.05236,-10.31462c-1.0768,10.8262 -4.45592,3.14465 -6.0004,-3.72562c-1.56924,-13.22943 -7.23737,-25.48523 -8.72193,-38.68883c5.80227,-8.36407 -0.82715,-9.5029 -3.91098,-1.15848c-3.39584,13.23767 -6.30494,26.33923 -2.7624,39.9769c-4.70789,3.85124 -13.79493,-17.92216 -9.61541,-26.27414c3.62592,-9.45018 2.81974,-19.09607 3.42313,-25.48878c3.31529,-7.21146 -3.22571,-15.04807 0.25123,-22.73853c-8.88477,9.68631 -16.83011,16.38615 -14.33428,31.58234c-1.10283,3.79079 3.703,25.58844 0.64231,17.56184c-5.77861,-15.66916 -5.78305,-33.02271 -1.43442,-49.01125c0.00535,-12.20366 -9.89253,21.0744 -9.16187,4.76299c-0.93676,-12.30159 4.13303,-25.82869 8.93452,-35.55499c-5.46675,-6.50523 -23.17289,-1.89566 -14.79648,-15.70558c8.24343,-7.01884 7.35999,-16.67057 -3.85936,-8.18394c-17.3246,12.72424 -31.69814,29.07174 -47.58007,43.52234c15.25898,-19.61487 32.46107,-38.59572 53.7519,-51.75492c20.64337,-12.99951 50.5769,-14.34346 68.38963,4.28573c4.53072,7.97979 15.06177,13.26968 17.57275,20.45337c-1.84586,10.76744 5.10652,16.10654 5.85289,25.57021c4.38731,7.30244 -3.95828,20.43125 8.52597,16.64671c14.20137,-0.01996 33.63664,-3.16645 34.74754,-20.87874c5.66772,-25.50935 8.27689,-54.0092 26.4256,-74.31131c10.08655,-5.89642 3.82147,-4.32716 -3.54926,-5.29837c-6.51613,-7.58361 6.57724,-19.75743 13.02319,-21.14511c-1.112,-17.9227 10.53479,10.74471 13.86426,-2.41437c4.99586,0.09501 7.43144,12.08141 10.46855,2.29789c9.05719,7.66376 18.6297,19.25661 6.66562,29.92943c13.61102,6.52517 -13.86911,2.29947 -2.14532,12.29652c9.6759,9.35194 2.83621,26.62759 -5.10654,34.15639c-0.3085,5.66077 9.31277,13.88494 11.24728,20.75249c9.99454,19.34809 11.9986,42.36646 8.16797,63.56847c-5.39346,19.98318 -25.46588,28.67906 -39.65833,41.37386c-12.12337,9.93893 -7.85776,27.37115 -13.59781,40.42342c0.57072,7.5369 4.77751,16.1196 10.7547,20.66925c8.66214,4.84064 18.81006,7.96561 25.81393,15.05286c-6.39667,3.34055 -19.43893,-10.21753 -19.56508,0.39017c-9.50252,-12.34393 -23.7677,-4.06104 -34.21234,-13.55405c8.69193,1.65643 19.99033,0.8027 10.47188,-9.61145c-3.75841,-8.80696 -15.07852,-11.84618 -15.37883,-22.49022c-10.66643,6.69647 -17.92447,15.81358 -25.66988,24.90395c-12.85808,-0.80322 -13.41248,25.11618 0.47165,24.73163c5.7019,1.45825 27.10161,9.40335 10.25006,7.35107c-5.02289,-0.89746 -10.47203,-4.04099 -10.31842,1.85727c-2.30338,-0.41431 -4.35982,-1.56003 -6.48019,-2.47418z", + "hen": "m131.70792,299.20142c-2.65045,-8.04401 -50.59061,2.01245 -25.50379,-8.40613c9.71836,-2.24731 29.67359,0.57056 9.8335,-5.50568c22.5928,7.62228 32.60569,-19.08859 34.06422,-37.09636c-21.02885,-6.55212 -24.67069,-31.02429 -46.83106,-37.61485c-16.88445,-13.23645 -41.63732,-12.83168 -52.35418,-33.24014c-10.17476,-18.17259 -4.4284,-40.29292 -2.74405,-59.92338c4.00956,-20.72375 12.14967,-41.69897 10.53991,-62.75727c-16.41068,9.44812 -22.4106,-11.67328 -22.78485,-18.27062c-12.07958,3.08904 -19.7317,3.22594 -6.59584,-7.5194c5.87008,-8.14037 8.78346,-25.92081 18.16113,-23.25189c2.47408,-10.763 9.04029,4.89351 16.30021,-4.61621c4.44867,3.35889 13.85731,7.10325 3.42817,13.02555c18.83147,9.50194 34.07959,23.95835 41.92437,42.43233c7.86127,18.77559 23.52317,39.06593 48.8149,33.98585c22.90038,3.93186 49.73083,-9.80992 48.68822,-32.86776c0.44391,-16.33654 16.52325,-54.48924 38.19395,-35.09801c16.24046,6.22802 34.92778,21.65468 31.09642,39.16159c-2.21887,18.0508 -0.50452,36.25767 1.60162,54.45551c-13.60181,10.0825 -11.15982,27.59631 -20.65894,40.7838c7.8804,18.56862 0.29095,38.62871 -12.60841,53.70848c-12.90314,13.89935 -31.76248,26.24356 -52.66508,24.4381c-7.98578,13.29396 9.42929,24.99069 15.57339,25.73553c-16.01053,-5.1321 -13.75549,4.70874 -8.47672,15.2244c4.94576,19.6875 -10.58037,-17.53909 -20.60904,0.27255c-7.77597,7.68976 -38.86531,10.29276 -13.69539,1.07587c21.48048,-7.96875 -24.12099,-12.95142 -13.99879,5.00586c3.34996,7.49203 22.77361,10.79092 2.32814,7.93628c-9.02753,-4.74515 -13.85625,12.10397 -21.02202,8.92599zm43.09088,-34.62769c7.8596,-9.56569 10.12141,-37.24054 -6.87671,-17.06372c-13.43553,10.88889 -18.29311,29.6301 6.87671,17.06372z", + "mouse": "m0.99942,221.57315c18.97592,-5.2153 38.89368,-5.72223 58.37582,-7.77921c22.496,-2.19991 45.89505,-1.95135 67.14781,-10.93486c14.09158,-5.66957 18.06422,-22.34355 18.92189,-36.61246c3.853,-24.50212 17.5325,-49.94102 40.26784,-59.44455c8.81084,-4.72752 21.73279,1.24299 28.77051,-3.16475c-8.53821,-11.67851 9.86266,-25.18666 17.60304,-12.64201c9.90706,2.44754 20.13632,-4.12984 22.40773,-13.63184c8.92409,7.01573 17.55354,16.51189 28.21455,21.93088c10.14639,3.852 24.18005,17.58312 11.18048,27.34964c-8.74753,9.55273 -22.39651,8.48746 -31.55023,16.51577c-9.2032,7.60971 -8.39032,20.69223 -4.77994,31.13091c0.58701,11.39519 9.68161,13.02966 17.70996,16.03508c1.32019,7.11591 -9.48019,9.15216 -14.76065,10.85889c-11.37581,1.93378 -22.26419,-2.9012 -30.79645,-10.59497c-7.75803,-9.73157 -17.02081,0.98111 -14.42018,10.56955c-13.10742,11.20265 10.79541,5.32968 13.63931,12.79547c-11.33516,4.36475 -24.3324,2.06448 -36.29933,1.86723c-15.70055,0.23059 -28.91441,-10.20818 -44.0015,-12.87645c-9.31265,3.4888 -17.24791,11.49408 -27.66536,12.5939c-30.59707,5.30119 -61.77245,4.85931 -92.6703,6.59238c-8.95057,-0.1062 -18.97236,1.51553 -27.29502,-0.55859z" + } +} diff --git a/dist/extensions/shapelib/arrow.json b/dist/extensions/shapelib/arrow.json new file mode 100644 index 00000000..ea4db5a3 --- /dev/null +++ b/dist/extensions/shapelib/arrow.json @@ -0,0 +1,28 @@ +{"data": { + "10": "m0.99679,148.19614c0.277,-34.75176 -0.17724,-69.54997 2.27791,-104.24061c60.32762,11.41171 119.94372,30.08407 179.25477,46.87597c3.18407,-17.04019 1.68541,-31.17523 4.4519,-46.93008c38.1039,33.15254 75.86421,66.77718 112.07695,102.003c-34.74261,39.95821 -74.59364,74.65916 -113.71667,110.1933c-1.26689,-16.54773 -2.53401,-33.09534 -3.80092,-49.64307c-57.66159,16.00916 -118.64064,32.56108 -176.67504,47.19652c-3.94662,-33.77068 -3.83062,-70.54794 -3.8689,-105.45503z", + "11": "m136.44681,226.75766l47.24773,-47.40907l-91.35118,0l-91.35098,0l0,-29.34846l0,-29.34849l90.303,0c49.66658,0 90.30293,-1.48752 90.30293,-3.30561c0,-1.81805 -19.77211,-23.15214 -43.93797,-47.40906l-43.93811,-44.1035l40.61224,0l40.61209,0l62.02386,62.14279l62.02383,62.14276l-62.14281,62.02386l-62.14279,62.02386l-42.75481,0l-42.75491,0l47.24786,-47.40909z", + "12": "m116.00724,294.49442c-8.01179,-8.01181 -6.96065,-12.86337 12.51841,-57.77466c9.83598,-22.67787 17.88353,-41.89153 17.88353,-42.69699c0,-0.8054 -27.16052,-1.46442 -60.3569,-1.46442l-60.3569,0l0,-42.47337l0,-42.47337l60.83526,0c46.90741,0 60.31158,-1.27951 58.54825,-5.58862c-1.25784,-3.07373 -9.83818,-23.47047 -19.06743,-45.32602c-17.39725,-41.19823 -17.39179,-52.24659 0.02688,-55.67119c8.66862,-1.70424 143.62872,129.24032 148.26757,143.85621c-44.95403,52.18671 -98.68933,106.81281 -148.18829,154.97751c-2.60997,0 -7.15958,-2.41428 -10.11037,-5.36508z", + "13": "m167.5984,129.81894c13.45454,0 26.90909,0 40.36363,0c0,13.45454 0,26.90909 0,40.36363c-13.45454,0 -26.90909,0 -40.36363,0c0,-13.45454 0,-26.90909 0,-40.36363zm-58.30304,0c14.9494,0 29.89909,0 44.8485,0c0,13.45454 0,26.90909 0,40.36363c-14.9494,0 -29.89909,0 -44.8485,0c0,-13.45454 0,-26.90909 0,-40.36363zm-53.81818,0c14.9494,0 29.89908,0 44.84848,0c0,13.45454 0,26.90909 0,40.36363c-14.9494,0 -29.89909,0 -44.84848,0c0,-13.45454 0,-26.90909 0,-40.36363zm-53.81818,0c14.9494,0 29.89908,0 44.84849,0c0,13.45454 0,26.90909 0,40.36363c-14.94941,0 -29.89908,0 -44.84849,0c0,-13.45454 0,-26.90909 0,-40.36363zm165.9394,83.23706c14.2021,-0.91132 28.40395,0.64389 42.60606,-0.26743c0.91125,-14.20201 0.48917,-28.40405 1.40042,-42.60606c13.29086,0 27.91505,0 41.20563,0c0,-13.45454 0,-26.9091 0,-40.36363c-13.45454,0 -26.90909,0 -40.36363,0c0,-14.94952 0,-29.899 0,-44.84848c-14.9494,0 -29.89908,0 -44.84848,0c0,-13.45454 0,-26.90909 0,-40.36363c14.9494,0 29.89908,0 44.84848,0c0,13.45454 0,26.90909 0,40.36363c13.29059,0 27.91478,-0.66666 41.20563,-0.66666c0.91125,14.20197 0.48918,29.0707 1.40044,43.27271c14.20209,0.91129 28.60425,-0.07731 42.80637,0.83398c0,13.29074 -0.20032,28.48132 -0.20032,41.77208c-14.9494,0 -29.89908,0 -44.84848,0c0,14.94951 0,29.89897 0,44.84848c-13.45454,0 -26.90909,0 -40.36363,0c0,13.45454 0,26.90909 0,40.36363c-14.9494,0 -29.89908,0 -44.84848,0c0,-13.29074 0,-29.0479 0,-42.33865z", + "14": "m158.38327,149.9911l-83.00266,-148.9972l149.24145,148.9972l-149.24145,148.99712l83.00266,-148.99712z", + "15": "m175.41861,150.04552l-148.89816,-149.05299l98.06119,0l148.89816,149.05299l-148.89816,149.05287l-98.06119,0l148.89816,-149.05287z", + "16": "m227.52928,183.22569c6.14276,-5.95375 12.01762,-12.81764 17.19296,-18.97911l-155.07133,-2.82724l-21.27044,24.3479l-67.38522,-2.09119c8.44345,-11.0853 17.69294,-24.10754 24.55062,-33.88853l-24.39403,-32.88164l71.89852,0l14.62907,20.54468l158.32403,0l-19.63887,-20.4987c6.06082,-6.45992 15.03049,-15.08081 19.89622,-19.60087l53.24701,52.24467l-53.36812,53.05513l-18.61044,-19.42511z", + "bent_up": "m1.00136,224.73827l204.13,0l0,-149.15997l-31.28999,0l62.57999,-74.57997l62.58002,74.57997l-31.29001,0l0,223.73997l-266.71,0z", + "callout": "m0.99757,0.99642l193.63145,0l0,111.75l53.81497,0l0,-37.25l50.55357,74.49999l-50.55357,74.50003l0,-37.25002l-53.81497,0l0,111.75l-193.63145,0z", + "chevron": "m0.99844,0.99688l223.49919,0l74.49986,149.00068l-74.49986,149.00134l-223.49919,0l74.49984,-149.00134l-74.49984,-149.00068z", + "corners": "m78.29672,150l-55.17469,-55.1747l0,27.58735l-22.12203,0l0,-121.41265l121.41265,0l0,22.12203l-27.58736,0l55.17471,55.17471l55.17471,-55.17471l-27.58736,0l0,-22.12203l121.41264,0l0,121.41265l-22.12204,0l0,-27.58735l-55.1747,55.1747l55.1747,55.17471l0,-27.58736l22.12204,0l0,121.41264l-121.41264,0l0,-22.12204l27.58736,0l-55.17471,-55.17468l-55.17471,55.17468l27.58736,0l0,22.12204l-121.41265,0l0,-121.41264l22.12203,0l0,27.58736l55.17469,-55.17471z", + "diamond": "m228.23334,205.75699c-12.96465,-22.71989 -62.74901,-33.9996 -160.88079,-36.45064l-66.35706,-1.65739l0,-19.88501l0,-19.88482l50.08599,0c59.04541,0 101.26503,-4.08251 135.71376,-13.12332c20.32901,-5.33509 27.0845,-8.73719 36.27359,-18.26725l11.29199,-11.71121l32.38853,32.49907l32.38852,32.49925l-32.75113,32.72415l-32.75122,32.72433l-5.40219,-9.46716z", + "dotted": "m164.76302,54.29618c-12.89404,-14.08136 13.13254,-37.91006 24.83243,-21.67826c9.98653,14.06865 -12.21164,31.95572 -24.83243,21.67826zm34.52623,32.04741c-10.53665,-15.50334 18.2944,-32.06738 27.41472,-16.58083c10.82574,16.19412 -18.42853,34.68893 -27.41472,16.58083zm39.30569,38.77469c-13.16362,-8.91086 -0.08168,-29.46533 13.54875,-27.63215c18.93346,2.88981 13.87328,34.44158 -4.59297,32.89478c-3.58466,-0.41574 -6.77832,-2.45136 -8.95578,-5.26263zm32.87781,34.23642c-11.00845,-13.99648 14.37656,-32.37918 25.04797,-19.05171c11.60712,14.82527 -14.29718,34.39392 -25.04797,19.05171zm-63.84386,0.7675c-12.23796,-11.58463 5.72536,-30.30273 19.24007,-25.41679c19.63696,6.28566 5.03751,36.50668 -12.48737,29.64096c-2.41074,-1.14194 -4.56958,-2.71278 -6.7527,-4.22417zm-52.05359,0c-14.38365,-13.43323 11.89731,-35.50046 24.20743,-21.44815c12.48965,14.64734 -10.94827,35.43011 -24.20743,21.44815zm-51.41751,-0.7675c-11.01524,-13.99239 14.38364,-32.38554 25.04439,-19.04626c11.57417,14.84886 -14.25791,34.38168 -25.04439,19.04626zm-48.97159,0.7675c-14.38364,-13.43323 11.89733,-35.50046 24.20746,-21.44815c12.48962,14.64734 -10.94829,35.43011 -24.20746,21.44815zm-51.41319,-0.75569c-12.62148,-16.51503 21.51373,-34.53826 27.20482,-13.82039c4.20761,13.86485 -18.57945,25.93829 -27.20482,13.82039zm232.73729,36.71002c-12.26451,-12.7252 9.54947,-34.95583 22.63777,-23.37347c16.16324,11.53831 -5.25334,38.27226 -20.09267,25.93422c-0.83693,-0.86462 -1.69453,-1.70929 -2.5451,-2.56075zm-37.22105,31.5554c-10.33875,-14.74719 16.53384,-30.93315 26.24101,-17.10368c12.66234,14.69044 -12.76988,34.70573 -24.48114,20.0298l-1.75987,-2.92612zm-33.2933,39.2449c-11.17,-10.21844 4.17313,-26.31229 16.33257,-23.575c18.50797,4.77472 6.84483,34.45702 -10.13109,28.82402c-2.6304,-0.90369 -4.76476,-2.91159 -6.20148,-5.24902z", + "hand_2": "m166.23018,238.662c7.92778,-2.90976 14.43034,-5.61938 2.1153,-5.69868c-10.87593,1.46172 -39.01099,-9.28242 -16.4619,-14.56342c14.10701,-5.508 46.21144,7.21423 46.38257,-14.54736c-2.55197,-13.63786 -43.96396,-2.98952 -30.34076,-21.27969c15.00345,-6.1348 44.75407,8.31958 49.78708,-10.66391c-4.61371,-18.40675 -33.47118,-6.65964 -47.97568,-11.74664c-14.06097,2.90031 -17.76392,-15.58949 -1.98296,-12.79868c36.48125,-1.96817 73.21696,0.92035 109.57253,-3.09619c5.87265,-3.2529 10.21371,-23.26295 2.80267,-24.61046c-52.95885,-1.09735 -106.01129,-0.08873 -158.88631,-3.36192c-18.99625,-0.19729 -4.48207,-20.48157 9.55508,-15.71787c13.37119,-4.37856 18.67023,-15.85947 28.4838,-27.19597c5.01488,-24.77942 -19.08717,-15.58241 -28.93028,-8.33138c-10.99126,7.20572 -29.89664,22.16276 -39.92577,30.01463c-8.79154,6.3571 -29.0466,13.41131 -41.36795,21.93291c-10.53185,3.7428 -22.05687,1.87943 -32.40108,2.55152c0,33.57336 0,67.14623 0,100.71958c29.2655,12.743 60.06093,23.93646 92.50566,22.65599c19.00592,-0.07739 38.55775,0.63341 57.06799,-4.26245zm-120.57521,10.76822c-14.93961,-5.74022 -29.85212,-11.55359 -44.65637,-17.63553c0.70846,-41.92598 1.41691,-83.85243 2.12533,-125.77841c11.81984,-0.44887 29.35853,5.41407 37.78343,-3.21891c22.65079,-7.26991 37.35686,-23.34933 57.21348,-35.41785c13.97373,-10.98014 25.13529,-14.72766 39.56827,-23.05481c10.96249,-5.06954 16.89815,-2.48073 29.24257,-0.27045c5.38396,8.81045 12.06773,13.36412 8.59946,30.1482c-7.23705,3.64039 -16.6288,28.10783 -2.4068,28.30228c39.59416,3.79424 79.82585,-1.53866 119.10855,5.09266c9.78171,13.24281 11.64719,42.99407 -6.25568,51.39202c-17.13269,4.95341 -35.19667,2.49629 -52.7989,3.09193c-0.00107,12.52824 2.07022,28.51608 -11.83537,34.80946c-10.26779,13.39197 -10.98985,33.06551 -27.53502,42.86476c-13.91499,14.25851 -33.72333,18.66306 -53.04445,18.19296c-31.68189,0.4295 -65.02994,3.46667 -95.10849,-8.51738l0,-0.00095z", + "hand": "m136.98543,214.15889c-14.70618,-5.74251 -4.62521,-24.05643 -14.3905,-33.27538c-12.96347,-7.75244 -2.12349,-24.16507 -12.57821,-33.28812c-7.48801,-6.64952 -5.24203,-16.62421 -3.67915,-25.18983c-29.75101,-0.23549 -59.53337,0.62366 -89.25697,-0.78464c-15.11522,1.28053 -20.03182,-18.26941 -12.80666,-28.85114c7.00419,-11.24166 21.87759,-8.31262 33.12609,-9.4029c64.97946,-0.76864 129.97618,-0.61134 194.95673,0.02921c17.26189,0.80067 37.01695,-1.19489 50.6566,11.68779c16.24808,15.16693 16.0166,39.34441 16.04852,59.94771c-0.42267,19.21857 -2.90109,42.02173 -20.4863,53.46951c-16.36914,10.95175 -36.93741,7.66907 -55.55533,8.62302c-27.94264,-0.30014 -56.07063,1.04456 -83.86891,-2.2673l-2.16592,-0.69792l0,0zm69.33224,-10.55814c9.631,-11.23128 -3.5211,-20.50227 -14.65393,-17.55965c-16.14473,-0.10535 -32.65453,-1.7021 -48.52592,1.75482c-13.67432,5.19589 -4.85582,21.54512 7.46478,18.25877c18.04872,1.02443 36.47603,1.82143 54.28616,-1.68709l1.42891,-0.76686zm65.93199,-2.17656c15.66348,-8.69865 15.78064,-28.60548 16.25079,-44.24881c-0.34195,-16.50655 1.70639,-34.58434 -7.04581,-49.36581c-7.23798,-10.84158 -20.71933,-14.52557 -33.13705,-14.12024c-23.36646,0.0377 -47.0793,-1.82723 -70.16504,2.52512c-15.66467,3.36275 -22.23152,20.93031 -23.45795,35.19015c-0.48341,13.80043 -1.82124,28.00842 1.22505,41.56039c7.24641,5.02983 15.89499,-9.13847 19.17191,-15.4227c4.31766,-11.67575 -0.61995,-26.25061 8.10953,-36.19362c8.72269,-9.46424 24.96402,-8.53419 32.52521,1.88722c8.3812,9.23244 -0.48325,21.69592 1.82307,32.51563c4.15211,9.93069 -0.70021,19.45959 -0.85791,28.5067c4.13835,6.87068 2.87872,15.02933 1.61143,22.50597c16.21062,-0.57724 32.86133,1.70529 48.65034,-2.71872c1.84845,-0.69202 3.61401,-1.59238 5.29642,-2.62128zm-126.53741,-35.9437c2.18771,-13.69858 -18.65493,-12.59653 -20.49308,-1.57007c-4.38604,12.23279 17.61123,15.56906 20.78048,7.03215c0.03699,-1.82657 -0.14053,-3.64476 -0.2874,-5.46208zm62.45076,0.42249c1.41585,-11.79691 -20.5592,-11.91444 -24.75133,-3.63126c-2.34377,5.03215 -10.03961,15.25429 1.13329,12.59268c7.54675,-1.70357 25.12254,3.75204 23.61804,-8.96143zm-62.44263,-31.11197c-0.75351,-2.94205 3.03209,-10.28735 -1.13232,-9.92064c-9.20967,1.01493 -19.08115,-0.45296 -27.70964,3.18962c-7.77171,10.63712 5.24397,21.0274 15.9218,17.53934c7.79146,0.11475 13.91219,-1.24452 12.92017,-10.80832zm61.0041,7.53122c8.85812,-9.53879 -4.95708,-21.9593 -14.94496,-15.6684c-10.39732,5.40628 -7.29182,25.10663 6.58635,19.17703c2.96956,-0.54494 6.1384,-1.30057 8.35861,-3.50864zm-53.18405,-38.39041c2.00339,-3.50816 4.00681,-7.01634 6.01019,-10.52453c-44.99024,0.24061 -90.00227,-0.61648 -134.97418,0.73022c-12.21447,-3.32573 -22.07768,15.22181 -6.82234,18.35822c24.02138,3.10667 48.39057,1.52395 72.56345,1.97845c19.07089,-0.00607 38.14179,-0.01187 57.21268,-0.01793c2.0034,-3.50815 4.00681,-7.01634 6.01019,-10.52452z", + "in_circle_1": "m5.82933,197.43428c40.71335,-0.01967 134.41318,-0.35846 180.09581,-0.39397c0,16.34004 0,32.68033 0,49.02061c32.58316,-32.50494 65.16631,-65.00987 97.74948,-97.51482c-31.92815,-31.66348 -63.85603,-63.3272 -95.78392,-94.99068c-0.78604,15.0691 -1.57207,30.13822 -2.35809,45.20756c-59.53047,-0.36446 -119.11517,1.07731 -178.59646,-1.67522c0.61495,-72.0702 150.25177,-122.40517 212.67849,-79.3467c34.44215,24.58492 61.89983,56.78898 72.41017,96.54306c3.07645,22.14599 2.45142,44.78936 0.58615,67.02389c-6.63419,36.33044 -31.19992,67.07545 -59.56813,89.58617c-20.38606,15.81168 -45.18452,26.98569 -71.36909,26.70041c-75.26421,9.28406 -124.16029,-34.86111 -155.84441,-100.16032z", + "inner": "m197.26169,150.29735l-74.64867,-74.64867l0,37.32433l-80.12502,0l0,-111.97301l215.02399,0l0,298.5947l-215.02399,0l0,-111.97301l80.12502,0l0,37.32433l74.64867,-74.64867z", + "left_right": "m0.99835,150.00092l86.49609,-86.49651l0,43.24814l125.35546,0l0,-43.24814l86.49605,86.49651l-86.49605,86.49605l0,-43.24803l-125.35546,0l0,43.24803l-86.49609,-86.49605z", + "left_up": "m0.99865,224.5l74.50004,-74.5l0,37.25l111.74991,0l0,-111.75l-37.25,0l74.5,-74.5l74.5,74.5l-37.25,0l0,186.25l-186.24989,0l0,37.25l-74.50005,-74.5z", + "pentagon": "m0.99791,0.9981l162.54547,0l135.45454,149.40899l-135.45454,149.40898l-162.54547,0z", + "recycle_3": "m28.22058,93.28644c0.00678,-2.58051 2.31667,-18.40222 5.13495,-35.15953c8.78786,-52.25238 8.91713,-52.48297 20.07468,-35.82898l6.60126,9.85321l19.30534,-9.74535c25.53492,-12.88995 56.00401,-17.65838 84.01221,-13.14781c11.88918,1.91477 24.50447,5.02692 28.034,6.91587c7.00751,3.7502 6.55832,6.97083 -4.61034,33.05528c-6.12129,14.29643 -6.70886,14.70388 -17.2827,11.98577c-17.99704,-4.62608 -47.30141,-3.16897 -61.44969,3.05553l-13.26538,5.83627l9.31132,9.7189c5.12125,5.34554 8.02238,10.51565 6.44702,11.48924c-1.57542,0.97362 -20.7427,2.87124 -42.59392,4.21677c-32.78424,2.01891 -39.72768,1.62653 -39.71874,-2.24516zm168.81314,144.07051l-14.20186,-18.81009l12.93088,-12.50398c13.30882,-12.86928 22.90733,-30.93761 27.13603,-51.08145l2.41319,-11.49524l-13.91847,2.22554c-7.65517,1.22421 -13.96558,1.06514 -14.02313,-0.35333c-0.26878,-6.62247 36.12752,-71.90508 39.66528,-71.14616c5.56261,1.19325 61.9985,50.07314 61.9985,53.6975c0,1.61765 -5.93121,3.88967 -13.18036,5.04884l-13.18039,2.10753l-1.30084,22.476c-1.66846,28.82635 -16.85831,62.09589 -38.00682,83.24434c-8.4704,8.47049 -16.91487,15.4008 -18.76544,15.4008c-1.85062,0 -9.75555,-8.46469 -17.56657,-18.81029zm-128.20031,52.72328c0,-2.07986 2.23119,-8.0961 4.95819,-13.36954c4.94765,-9.56766 4.91901,-9.61411 -13.52617,-21.86105c-28.85884,-19.16116 -50.30965,-53.17105 -57.05687,-90.46291l-2.21202,-12.22588l15.77176,-2.16168c32.51166,-4.45622 32.80855,-4.32152 39.31982,17.83711c4.39381,14.95265 9.79779,23.91347 21.44681,35.56244c8.5651,8.56514 16.76965,14.83324 18.23236,13.92926c1.46265,-0.90396 3.57973,-6.24536 4.70464,-11.86984c1.1249,-5.62448 3.47056,-10.22638 5.21256,-10.22638c3.99942,0 41.66188,59.38374 42.2598,66.63249c0.39931,4.84137 -19.96001,13.22382 -73.01952,30.06421c-3.38333,1.07379 -6.09135,0.25229 -6.09135,-1.84824z", + "turn_17": "m187.66985,234.28424l2.06375,-22.20483l-24.28615,-3.86421c-61.48712,-9.78288 -121.75832,-51.26649 -155.31676,-106.90179c-6.02069,-9.98148 -10.05047,-19.59818 -8.95503,-21.37048c2.51272,-4.06578 63.74106,-36.43469 68.91894,-36.43469c2.11224,0 7.18627,5.95309 11.27556,13.22911c17.44035,31.03078 62.57552,63.39609 94.35383,67.65826l12.88387,1.7281l-2.21523,-19.19039c-2.29968,-19.92216 -1.65292,-24.10554 3.72659,-24.10554c3.43987,0 106.12749,76.50481 109.06303,81.25475c2.22696,3.60321 -11.89679,16.9705 -62.46501,59.11911c-21.96555,18.30804 -42.4514,33.28745 -45.52422,33.28745c-4.91821,0 -5.33987,-2.65765 -3.52318,-22.20483z", + "turn_reverse": "m298.99997,168.62498c0,-51.43148 -133.41916,-93.12499 -297.99997,-93.12499l0,-74.49999l0,0c164.58081,0 297.99997,41.69347 297.99997,93.12499l0,74.49999c0,42.46484 -91.92749,79.55168 -223.49998,90.16789l0,37.25l-74.49999,-71.54289l74.49999,-77.45709l0,37.25l0,0c88.72033,-7.15858 161.96952,-26.67409 198.62153,-52.91789", + "u_turn": "m1.00059,299.00055l0,-167.62497l0,0c0,-72.00411 58.37087,-130.37499 130.375,-130.37499l0,0l0,0c34.57759,0 67.73898,13.7359 92.18906,38.18595c24.45006,24.45005 38.18593,57.61144 38.18593,92.18904l0,18.625l37.24997,0l-74.49995,74.50002l-74.50002,-74.50002l37.25,0l0,-18.625c0,-30.8589 -25.0161,-55.87498 -55.87498,-55.87498l0,0l0,0c-30.85892,0 -55.875,25.01608 -55.875,55.87498l0,167.62497z", + "up": "m1.49805,149.64304l148.50121,-148.00241l148.50121,148.00241l-74.25061,0l0,148.71457l-148.5012,0l0,-148.71457z" + } +} diff --git a/dist/extensions/shapelib/dialog_balloon.json b/dist/extensions/shapelib/dialog_balloon.json new file mode 100644 index 00000000..c174c6e2 --- /dev/null +++ b/dist/extensions/shapelib/dialog_balloon.json @@ -0,0 +1,9 @@ +{"data": { + "1": "m0.99786,35.96579l0,0c0,-19.31077 15.28761,-34.96524 34.14583,-34.96524l15.52084,0l0,0l74.50001,0l139.68748,0c9.05606,0 17.74118,3.68382 24.14478,10.24108c6.40356,6.55726 10.00107,15.45081 10.00107,24.72416l0,87.41311l0,0l0,52.44785l0,0c0,19.31078 -15.2876,34.96524 -34.14584,34.96524l-139.68748,0l-97.32507,88.90848l22.82506,-88.90848l-15.52084,0c-18.85822,0 -34.14583,-15.65446 -34.14583,-34.96524l0,0l0,-52.44785l0,0z", + "4": "m1,1l49.66667,0l0,0l74.5,0l173.83334,0l0,115.8889l0,0l0,49.66666l0,33.11111l-173.83334,0l-123.68433,97.37498l49.18433,-97.37498l-49.66667,0l0,-33.11111l0,-49.66666l0,0z", + "5": "m3.88165,296.34811l58.64952,-105.30074l0,0c-62.13446,-31.76456 -79.86445,-91.6022 -40.96117,-138.24044c38.90255,-46.63797 121.70818,-64.81269 191.29914,-41.98796c69.59094,22.8246 103.19446,79.17835 77.63046,130.19172c-25.56265,51.01335 -101.92546,79.99094 -176.41714,66.94487l-110.20081,88.39255z", + "6": "m4.33333,266.6662c0,-1.854 2.23757,-3.35571 5,-3.35571c2.76243,0 5,1.50171 5,3.35571c0,1.85394 -2.23757,3.35565 -5,3.35565c-2.76243,0 -5,-1.50171 -5,-3.35565zm10.25,-24.11072c0,-4.6351 5.59392,-8.38943 12.50001,-8.38943c6.90608,0 12.5,3.75433 12.5,8.38943c0,4.63489 -5.59392,8.38928 -12.5,8.38928c-6.90609,0 -12.50001,-3.75433 -12.50001,-8.38928zm23.75001,-36.55524c0,-12.81482 19.46685,-23.19473 43.50002,-23.19473c24.0331,0 43.49996,10.37991 43.49996,23.19473c0,12.81473 -19.46686,23.19455 -43.49996,23.19455c-24.03317,0 -43.50002,-10.37982 -43.50002,-23.19455zm-37.33334,-104.99994c0,-55.2486 66.67956,-100 149,-100c82.32047,0 149,44.7514 149,100c0,55.24866 -66.67953,100 -149,100c-82.32044,0 -149,-44.75134 -149,-100z", + "scream": "m299.67374,132.67729l-35.72574,1.97192l-9.55817,48.04506l-31.60561,-11.61551l-45.83566,36.86661l-17.45096,-21.51509l-146.98414,92.00807l81.6677,-102.60858l-67.83573,-13.33963l21.22697,-19.84731l-46.57336,-36.42733l33.47025,-8.80944l-10.52427,-47.94958l35.08694,5.02536l28.86619,-44.2482l25.5638,17.26465l59.09183,-26.49832l7.92432,24.02253l70.55626,-0.33542l-12.23108,23.15343l59.61954,25.93398l-28.50317,14.93327l29.75409,43.96953z", + "thought": "m12,1c-6.094,0 -11,4.906 -11,11l0,147c0,6.09399 4.906,11 11,11l49.15625,0c-2.03143,2.32526 -3.15625,4.84886 -3.15625,7.5c0,11.32597 20.36188,20.5 45.5,20.5c25.13812,0 45.5,-9.17403 45.5,-20.5c0,-2.65114 -1.12482,-5.17474 -3.15625,-7.5l142.15625,0c6.09399,0 11,-4.90601 11,-11l0,-147c0,-6.094 -4.90601,-11 -11,-11l-276,0zm54,199c-13.81215,0 -25,5.37016 -25,12c0,6.62984 11.18785,12 25,12c13.81216,0 25,-5.37016 25,-12c0,-6.62984 -11.18784,-12 -25,-12zm-25,30c-7.73481,0 -14,4.02762 -14,9c0,4.97238 6.26519,9 14,9c7.73481,0 14,-4.02762 14,-9c0,-4.97238 -6.26519,-9 -14,-9zm-24,22c-4.97238,0 -9,2.23756 -9,5c0,2.76242 4.02762,5 9,5c4.97238,0 9,-2.23758 9,-5c0,-2.76244 -4.02762,-5 -9,-5z" + } +} diff --git a/dist/extensions/shapelib/electronics.json b/dist/extensions/shapelib/electronics.json new file mode 100644 index 00000000..bfdfb2ab --- /dev/null +++ b/dist/extensions/shapelib/electronics.json @@ -0,0 +1,20 @@ +{"data": { + "capacitor": "m292.103577,149.999374l-117.073944,-0.445328m-167.175035,0.445328l116.628588,0m0.44532,-72.035179l11.364601,0l0,144.640358l-11.364601,0l0,-144.640358zm38.244209,-0.569977l11.364594,0l0,144.640297l-11.364594,0l0,-144.640297zm-162.171733,68.98156l6.905184,0l0,6.905212l-6.905184,0l0,-6.905212zm291.101741,0.325241l6.905182,0l0,6.905212l-6.905182,0l0,-6.905212z", + "diode": "m180.228439,90.39769l21.70816,0l0,117.211075l-21.70816,0l0,-117.211075zm23.345947,59.602753l88.556381,0m-284.3409,-1.995804l85.541058,0l0,-65.011185l87.251961,66.722031l-87.250778,67.291931l0,-68.720001m-92.331572,-3.917542l6.811423,0l0,6.811447l-6.811423,0l0,-6.811447zm291.20439,2.03891l6.811401,0l0,6.811462l-6.811401,0l0,-6.811462z", + "gate_and": "m7.454795,178.082489l67.605378,0m-67.605378,-54.850876l67.605393,0.000015m-0.155602,-30.065033l0,113.750015c194.70015,10.208389 199.234482,-124.687454 0,-113.750015zm217.618942,56.662766l-70.312149,0m-221.397258,-29.817062l6.68369,0l0,6.683685l-6.68369,0l0,-6.683685zm-0.314375,54.532364l6.68369,0l0,6.683685l-6.68369,0l0,-6.683685zm291.95109,-27.976547l6.683685,0l0,6.683685l-6.683685,0l0,-6.683685z", + "gate_inverter": "m292.351624,149.998962l-70.506393,0m-0.189026,0a19.883057,19.883057 0 1 1-39.766113,0a19.883057,19.883057 0 1 139.766113,0zm-213.972072,2.405243l69.321826,0l0,-61.05407l101.250404,58.4571l-101.19664,58.840652l0,-56.176727m-76.061115,-3.699677l6.780182,0l0,6.779526l-6.780182,0l0,-6.779526zm291.428455,-2.135864l6.780518,0l0,6.780548l-6.780518,0l0,-6.780548z", + "gate_nand": "m8.042537,173.038879l60.699101,-0.672531m-60.699101,-49.879471l61.371335,0m-0.785973,-24.868042l0,104.835098c179.441437,9.408417 183.619827,-114.915443 0,-104.835098zm223.921448,50.643158l-64.591507,0m0.637238,0a11.937837,11.937837 0 1 1-23.87648,0a11.937837,11.937837 0 1 123.87648,0zm-227.445681,-29.373505l6.739111,0l0,6.739143l-6.739111,0l0,-6.739143zm-0.150617,50.613495l6.73911,0l0,6.739151l-6.73911,0l0,-6.739151zm291.47287,-24.654327l6.739105,0l0,6.739151l-6.739105,0l0,-6.739151z", + "gate_nor": "m292.610077,150.214462l-69.483139,-0.215668m0.147217,0.215668a12.942393,12.942393 0 1 1-25.884689,0a12.942393,12.942393 0 1 125.884689,0zm-215.590108,29.264374l63.620397,0m-63.620397,-54.805801l65.561368,-0.431335m-20.75433,-33.139984c129.343479,0 143.580387,58.405624 143.580387,58.405624l-0.347778,0c-18.514755,69.097885 -143.580379,58.057999 -143.580379,58.057999c59.7962,-58.405655 0.347775,-116.463623 0.347775,-116.463623zm-51.490408,30.117874l6.644974,0l0,6.645012l-6.644974,0l0,-6.645012zm0.003831,54.852463l6.644983,0l0,6.64502l-6.644983,0l0,-6.64502zm291.530706,-29.571609l6.644989,0l0,6.64502l-6.644989,0l0,-6.64502z", + "gate_or": "m7.681484,183.57515l71.7616,0m-71.7616,-60.67144l73.093784,-0.000015m-23.092442,-37.784157c143.186604,0 158.947315,64.65654 158.947315,64.65654l75.817307,0l-76.202316,0c-20.49614,76.493118 -158.94717,64.271667 -158.94717,64.271667c66.195942,-64.656525 0.385136,-128.928207 0.385136,-128.928207zm-56.684011,33.939781l6.677925,0l0,6.677956l-6.677925,0l0,-6.677956zm291.510831,27.410866l6.677948,0l0,6.677948l-6.677948,0l0,-6.677948zm-291.404498,33.607208l6.677927,0l0,6.677917l-6.677927,0l0,-6.677917z", + "gate_xor": "m80.450493,91.498093c129.22271,0 143.446312,58.351089 143.446312,58.351089l68.423569,0l-68.770889,0c-18.497391,69.033295 -143.446304,58.003708 -143.446304,58.003708c59.740372,-58.351089 0.347511,-116.354797 0.347511,-116.354797zm-22.576313,4.515259c43.415966,54.530457 0,108.018921 0,108.018921m-50.015199,-26.867355l63.560987,0m-63.560987,-54.7547l63.560987,0m-70.418914,-3.722206l6.82584,0l0,6.825867l-6.82584,0l0,-6.825867zm0.057968,54.832268l6.825839,0l0,6.825867l-6.825839,0l0,-6.825867zm291.170364,-27.096024l6.825836,0l0,6.825867l-6.825836,0l0,-6.825867z", + "inductor": "m7.783882,182.663147l59.679306,0c0,0 -30.829735,-67.744125 15.054253,-68.81945c42.462807,-0.995041 37.635605,69.357201 24.194321,69.357201c-13.441284,0 -12.903625,-68.81955 22.043701,-68.81955c34.947357,0 40.323868,68.819366 20.968399,68.819366c-19.355423,0 -11.828323,-68.819366 22.58139,-68.819366c34.409683,0 41.399155,68.81955 19.893112,68.81955c-21.506073,0 -9.67775,-68.81955 24.19429,-68.81955c33.87207,0 29.570831,68.819366 18.280151,68.819366c-11.290665,0 57.528732,-0.537659 57.528732,-0.537659m-291.202282,-3.571106l6.772959,0l0,6.772995l-6.772959,0l0,-6.772995zm291.221844,0.301132l6.772949,0l0,6.772995l-6.772949,0l0,-6.772995z", + "junction_1": "m0.99971,146.64024l6.71786,0l0,6.7179l-6.71786,0l0,-6.7179zm7.44043,3.36145l283.11684,0m0.72388,-3.35979l6.71786,0l0,6.7179l-6.71786,0l0,-6.7179zm-145.6413,152.35712l0,-6.71786l6.7179,0l0,6.71786l-6.7179,0zm3.36145,-7.44043l0,-283.11688m-3.35944,-0.72348l0,-6.71786l6.71793,0l0,6.71786l-6.71793,0z", + "junction_2": "m0.99971,146.64024l6.71786,0l0,6.7179l-6.71786,0l0,-6.7179zm7.44043,3.36145l121.77922,0c0,-29.3896 38.77921,-31.3896 38.77921,0l122.55841,0m0.72391,-3.35979l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm-145.6413,152.35712l0,-6.71786l6.7179,0l0,6.71786l-6.7179,0zm3.36145,-7.44043l0,-283.11688m-3.35945,-0.72348l0,-6.71786l6.71794,0l0,6.71786l-6.71794,0z", + "junction_3": "m143.58945,150.00009c0,-3.49425 2.83032,-6.32455 6.32455,-6.32455c3.49423,0 6.32455,2.83031 6.32455,6.32455c0,3.49423 -2.83032,6.32455 -6.32455,6.32455c-3.49423,0 -6.32455,-2.83032 -6.32455,-6.32455zm-142.59006,-3.35985l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm7.44043,3.36145l283.11682,0m0.72394,-3.35979l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm-145.6413,152.35712l0,-6.71786l6.7179,0l0,6.71786l-6.7179,0zm3.36145,-7.44043l0,-283.11688m-3.35947,-0.72348l0,-6.71786l6.71796,0l0,6.71786l-6.71796,0z", + "junction_tee": "m149.914,143.67554zm-148.91461,2.96471l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm7.44043,3.36145l283.11682,0m0.72394,-3.35979l6.71783,0l0,6.7179l-6.71783,0l0,-6.7179zm-141.61324,2.91669l-0.66661,-141.11688m-3.35947,-0.72348l0,-6.71786l6.71796,0l0,6.71786l-6.71796,0z", + "resistor": "m7.868202,151.620193l82.343018,0l11.393402,-32.392784l18.643684,62.356071l20.71521,-63.165901l18.12587,62.356071l19.679459,-61.546242l19.679443,61.951149l10.875488,-30.368195l82.860886,0m-291.18655,-2.813812l6.844604,0l0,6.844635l-6.844604,0l0,-6.844635zm291.194058,-0.465622l6.844604,0l0,6.844635l-6.844604,0l0,-6.844635z", + "source_AC_h": "m7.841724,149.837311l67.250737,0m149.928139,0.389923l67.250793,0m-67.653702,-0.227753a74.615135,74.615135 0 1 1-149.230286,0a74.615135,74.615135 0 1 1149.230286,0zm-126.528297,-1.996506c49.250984,-78.535637 61.230949,87.853104 103.826454,2.662094m-200.917796,-4.522659l6.717863,0l0,6.717896l-6.717863,0l0,-6.717896zm291.36706,0.642181l6.717865,0l0,6.717896l-6.717865,0l0,-6.717896z", + "source_DC": "m221.862747,94.98175l0,31.813873m-21.510544,-15.906944l43.020996,0m48.613678,39.407722l-121.593582,0m-162.447085,0l115.809275,0m1.040596,-37.757935l7.284134,0l0,75.963058l-7.284134,0l0,-75.963058zm37.461227,-41.623596l7.284134,0l0,158.169647l-7.284134,0l0,-158.169647zm-161.255614,75.613235l6.954941,0l0,6.954971l-6.954941,0l0,-6.954971zm291.012953,0.175003l6.954956,0l0,6.954971l-6.954956,0l0,-6.954971z", + "speaker": "m21.35352,187l77,0m-83.70878,3.11937l0,-6.71786l6.71793,0l0,6.71786l-6.71793,0zm6.70878,-76.11937l77,0m-83.70878,3.11937l0,-6.71786l6.71793,0l0,6.71786l-6.71793,0zm155.70878,-32.61937l115,-83l0,296.5l-115,-82.5l0,-131zm-70.99999,0l70.99999,0l0,131l-70.99999,0l0,-131z" + } +} diff --git a/dist/extensions/shapelib/flowchart.json b/dist/extensions/shapelib/flowchart.json new file mode 100644 index 00000000..47b257e7 --- /dev/null +++ b/dist/extensions/shapelib/flowchart.json @@ -0,0 +1,25 @@ +{"data": { + "manual_input": "m1,103.64394l298,-30.9037l0,154.51852l-298,0z", + "callout_left_right": "m1,150.0006l58.10869,-58.1087l0,29.05434l46.81141,0l0,-87.16304l87.1598,0l0,87.16304l46.8114,0l0,-29.05434l58.1087,58.1087l-58.1087,58.10869l0,-29.05435l-46.8114,0l0,87.16306l-87.1598,0l0,-87.16306l-46.81141,0l0,29.05435l-58.10869,-58.10869z", + "card": "m1,60.5l59.5,-59.5l238.5,0l0,298l-298,0l0,-238.5z", + "collate": "m0,1l299,0l-149.5,149l149.5,149l-299.00031,0l149.50031,-149l-149.5,-149z", + "connector_offpage": "m0.99775,0.99775l297.99984,0l0,238.39982l-149.00002,59.60002l-148.99999,-59.60002l0.00017,-238.39982z", + "data_stored": "m50.83397,0.99813l249.16667,0c-27.52219,0 -49.83333,66.78392 -49.83333,149.16604c0,82.38213 22.31114,149.16603 49.83333,149.16603l-249.16667,0l0,0c-27.52219,0 -49.83333,-66.78391 -49.83333,-149.16603c0,-82.38212 22.31114,-149.16604 49.83333,-149.16604z", + "data": "m1.00038,249.33351l59.60001,-198.66668l238.40001,0l-59.60001,198.66668z", + "decision": "m0.99837,149.99953l148.79352,-102.86476l148.79387,102.86476l-148.79387,102.86476l-148.79352,-102.86476z", + "delay": "m1,1l149,0l0,0c82.29044,0 149,66.70957 149,149c0,82.29044 -66.70956,149 -149,149l-149,0z", + "display": "m1,149.99924l49.66672,-97.42307l198.66612,0c27.43034,0 49.66716,43.61774 49.66716,97.42307c0,53.80476 -22.23682,97.42308 -49.66716,97.42308l-198.66612,0l-49.66672,-97.42308z", + "document_multiple": "m1.00054,45.02563l253.99998,0l0,206.43799c-126.99997,0 -126.99997,78.65668 -253.99998,33.96539zm21.49946,-240.92902l0,-19.5l255,0l0,207l-22.5,1m-210.5,-207l0,-25l255,0l0,207l-21.5,0", + "document": "m1.00064,1.00098l298,0l0,242.19891c-149,0 -149,92.28223 -298,39.84915z", + "filter1": "m75.5,150l74.5,-149l74.5,149l-74.5,149l-74.5,-149zm0,0l149,0", + "or_junction": "m0.99865,149.9991l0,0c0,-82.29043 66.70957,-149 149.00001,-149l0,0c39.51724,0 77.41597,15.69817 105.3589,43.64109c27.94292,27.94292 43.64107,65.84166 43.64107,105.35891l0,0c0,82.29041 -66.70956,148.99998 -148.99997,148.99998l0,0c-82.29044,0 -149.00001,-66.70958 -149.00001,-148.99998zm149.00001,-149l0,297.99998m-149.00001,-148.99998l297.99998,0", + "preparation": "m1.00063,150.00006l59.58485,-82.24058l178.75446,0l59.58505,82.24058l-59.58505,82.24086l-178.75446,0l-59.58485,-82.24086z", + "process": "m1,51.87891l298,0l0,196.24391l-298,0zm37.25,-196.24391l0,196.24391m223.5,-196.24391l0,196.24391", + "punched_tape": "m1.00047,30.80047l0,0c0,16.45808 33.35479,29.8 74.50001,29.8c41.1452,0 74.49998,-13.34192 74.49998,-29.8l0,0c0,-16.45809 33.3548,-29.8 74.50002,-29.8c41.14522,0 74.49998,13.34192 74.49998,29.8l0,238.4c0,-16.45808 -33.35477,-29.80002 -74.49998,-29.80002c-41.14522,0 -74.50002,13.34193 -74.50002,29.80002c0,16.45807 -33.35478,29.79999 -74.49998,29.79999c-41.14522,0 -74.50001,-13.34192 -74.50001,-29.79999z", + "sequential_data_storage": "m150,299l0,0c-82.29043,0 -149,-66.70955 -149,-149l0,0c0,-82.29043 66.70957,-149 149,-149l0,0c39.51726,0 77.41599,15.69817 105.3589,43.64108c27.94292,27.94293 43.6411,65.84165 43.6411,105.35892l0,0c0,39.51726 -15.69818,77.41599 -43.6411,105.3589l43.6411,0l0,43.6411z", + "sort": "m-0.0038,150.00102l299.00334,0m-299.00334,-0.00002l149.50209,-150.00059l149.50131,150.00059l-149.50131,150.00018l-149.50209,-150.00018z", + "storage_internal": "m1,1l297.99997,0l0,297.99997l-297.99997,0zm37.25,-297.99997l0,297.99997m-37.25,-260.74997l297.99997,0", + "terminal": "m48.94167,99.12235l202.11729,0l0,0c26.47794,0 47.9425,22.7794 47.9425,50.8792c0,28.09979 -21.46457,50.87918 -47.9425,50.87918l-202.11729,0l0,0c-26.47791,0 -47.9425,-22.77939 -47.9425,-50.87918c0,-28.09981 21.46459,-50.8792 47.9425,-50.8792z", + "wave": "m1,37.20809c99.33355,-125.42461 198.66708,125.4246 298.00061,0l0,225.76426c-99.33353,125.42462 -198.66706,-125.42459 -298.00061,0z" + } +} diff --git a/dist/extensions/shapelib/game.json b/dist/extensions/shapelib/game.json new file mode 100644 index 00000000..62cd1f44 --- /dev/null +++ b/dist/extensions/shapelib/game.json @@ -0,0 +1,13 @@ +{"data": { + "cards_clubs": "m107.57338,275.50809c15.10838,-15.77673 27.93053,-34.56763 33.34637,-55.90254c-16.19595,12.31328 -31.05006,32.11845 -53.64258,31.36813c-17.05595,0.97891 -37.37346,0.99548 -49.37947,-13.26945c-26.83,-21.5751 -34.03729,-64.69673 -12.00568,-92.15404c15.07669,-19.82526 41.4039,-28.23172 65.56467,-25.25816c15.22319,-6.45935 -2.97749,-22.81502 -4.80785,-33.02267c-11.33012,-37.02704 15.36169,-81.44029 54.60988,-85.70572c28.15103,-4.0415 55.67099,14.18231 69.44571,37.83293c7.4856,16.54877 3.58533,35.33045 1.83887,52.49866c-5.88113,8.62766 -20.94342,29.50022 0.55099,27.85616c21.2518,-0.33633 43.69397,5.90277 57.70761,22.8026c20.49747,22.76067 22.37766,60.37286 1.7551,83.63007c-10.90869,14.16582 -27.2782,25.50356 -45.80551,24.87234c-18.13391,1.83067 -37.77023,-2.10338 -50.62924,-15.92061c-5.48438,-3.84309 -18.92297,-18.36311 -18.91833,-15.17883c13.43222,27.98354 28.62112,57.04413 55.49167,74.38477c9.60062,7.71954 -14.62323,2.41226 -20.4874,3.98563c-35.53012,0.0314 -71.06009,0.06342 -106.59021,0.09497c7.31842,-7.63818 14.6373,-15.27603 21.9554,-22.91422z", + "cards_diamonds": "m34.92883,153.9321c25.56111,-56.62673 71.64644,-104.95768 110.85236,-152.92286c45.60773,30.78102 85.01025,98.49872 119.29071,145.66264c-30.57587,54.55344 -74.58923,104.23671 -114.23947,153.1615c-42.74368,-44.7616 -79.29648,-95.90262 -115.90359,-145.90128z", + "cards_hearts": "m106.76112,245.09012c-77.74644,-57.80281 -105.54389,-94.36783 -105.76917,-139.13003c-0.20544,-40.80623 34.10907,-80.19025 69.67002,-79.96313c17.75755,0.11364 55.84863,15.13257 69.33681,27.33919c6.79614,6.1504 10.01512,5.54391 25.146,-4.73779c41.17987,-27.98239 81.39243,-28.56973 107.43585,-1.56907c41.62292,43.15273 34.04501,94.68497 -21.78392,148.13782c-29.68187,28.41864 -94.50056,78.8349 -101.35565,78.8349c-2.08591,0 -21.29187,-13.01038 -42.67994,-28.9119z", + "cards_spades": "m92.84135,287.13989c18.3756,-17.73279 31.81261,-40.18849 43.07161,-62.94162c6.87787,-9.075 0.36623,-17.01425 -9.00183,-9.3188c-24.07579,16.07495 -56.84848,21.58751 -82.91551,6.92194c-29.46779,-15.23779 -42.75618,-51.47162 -36.07021,-83.04361c4.23415,-31.99545 27.52112,-57.07481 52.80524,-75.08997c29.04437,-20.7771 60.40868,-38.61331 86.95355,-62.67224c11.08365,0.22219 19.42508,17.61496 31.35349,22.21747c31.67316,23.59131 69.20874,40.95643 94.15042,72.50237c12.60098,17.9752 19.78281,40.10946 20.58459,61.98948c-3.83926,29.67093 -21.5314,60.96272 -52.04169,69.41241c-26.37521,7.98038 -53.51129,-2.14038 -76.49545,-15.01619c-2.80743,-0.60251 -13.10471,-8.7151 -9.02362,-2.41039c13.74066,28.19803 28.79581,56.19804 50.59952,79.09325c1.28156,2.89285 11.33243,9.75613 5.98334,9.64709c-44.76935,0 -89.53856,0 -134.30794,0c4.78471,-3.7637 9.5696,-7.5275 14.35449,-11.2912z", + "chess_bishop": "m61.92021,296.91153c0.43627,-9.82327 20.22808,-4.98053 9.33225,-14.55078c3.63447,-11.80536 14.91982,-19.66748 21.741,-29.79436c5.22913,-8.62125 17.00826,-19.01086 11.31252,-29.67047c-10.46021,-5.58662 -7.49181,-18.00824 5.30239,-15.28014c8.2272,-7.58801 8.79371,-20.26302 11.57766,-30.59467c2.52694,-12.36574 4.07327,-24.95554 3.66998,-37.5896c-14.99698,0.03661 -30.27584,-0.68196 -44.73978,-4.74928c2.8019,-11.20453 20.86148,-8.79659 28.26084,-15.67982c-6.87532,-6.18329 13.89957,-5.56496 8.46355,-15.34472c-0.37302,-11.20033 -9.19685,-14.44135 -16.26585,-22.60765c-9.44371,-12.76132 5.36173,-25.51221 13.58463,-34.13964c9.16566,-9.37672 19.64847,-19.36716 22.45389,-32.62941c-3.77451,-3.10155 -12.3967,-7.54239 -3.59866,-11.78228c12.01596,-2.03703 24.83499,-2.28521 36.61118,1.05654c7.81644,7.61585 -11.93045,8.03119 -3.43417,17.63365c10.07373,12.07176 -3.50795,18.30174 -11.52704,25.27969c-4.66763,5.89621 -18.59915,13.67189 -16.20224,19.78346c13.63968,-0.47554 21.5871,-13.67976 31.31615,-21.49704c10.67101,-13.68708 20.99446,8.43092 27.81822,15.94714c8.40642,11.39094 2.60674,26.70086 -10.05556,31.59287c-6.28001,6.46729 -10.44972,24.88914 4.57674,22.14657c8.72636,3.17196 -8.52979,3.51371 1.37608,6.446c6.58298,2.52787 32.25821,8.30554 18.1142,16.0547c-12.00471,2.71368 -24.40523,2.6017 -36.6002,1.50584c-0.75204,18.52477 1.89484,36.97644 7.35446,54.6958c1.35513,5.04123 2.71027,10.08244 4.06541,15.12361c6.52129,-0.129 19.98573,-1.55484 13.76321,9.18311c-13.08994,7.21928 -5.0789,22.41203 2.17738,31.05447c8.99446,11.37192 22.40833,22.01788 22.98288,37.58719c3.59734,2.14404 15.56946,8.03415 12.10645,12.64545c-57.30759,-0.2937 -114.6481,0.84897 -171.9265,-1.25046l-1.98901,-0.18246l-1.62205,-0.39337l0,0z", + "chess_king": "m75.6993,294.60599c-8.08068,-9.43317 12.65705,-9.68567 9.39906,-20.14252c5.95673,-13.85672 21.44485,-22.24414 23.72572,-37.99019c-6.28166,-4.37628 -9.89445,-14.96013 2.0899,-13.70361c8.78859,-6.61539 7.6902,-20.15297 10.33321,-30.0876c2.47588,-16.03471 3.03656,-32.26408 4.10001,-48.43053c-10.16894,-0.78108 -20.58942,-0.23701 -30.49778,-2.84268c0.28501,-10.75136 20.44619,-6.62604 21.3638,-16.77121c14.65907,-0.2649 0.81196,-22.15992 -5.15776,-27.38371c-7.64118,-8.81222 -12.7306,-22.72323 -6.92168,-33.60618c8.30865,-5.52043 27.09519,-2.1601 26.24604,-16.66769c-5.65058,-3.22095 -12.82484,-1.17552 -19.15805,-1.74514c0.38948,-6.7649 0.77895,-13.52979 1.16843,-20.29469c8.37558,-0.64424 16.75118,-1.28853 25.12676,-1.93283c-4.25133,-4.41846 -10.61392,-7.6702 -12.20608,-13.92034c5.41558,-8.90246 18.46751,-8.1166 27.81776,-8.03243c9.09207,-0.62713 25.66919,5.43749 13.27614,15.20592c-1.00447,2.39887 -10.78024,8.36352 -4.73895,7.71326c7.73515,0 15.47028,0 23.20541,0c-0.02223,6.6133 -0.20001,13.29232 1.35312,19.76423c-5.90448,4.39723 -25.05112,-3.75612 -19.59946,9.81149c6.13853,5.67249 15.53992,5.52279 23.32581,8.02098c4.54138,0.45371 8.15405,1.63713 6.5175,6.94557c0.85359,9.85596 -1.63307,19.77049 -8.40776,27.25217c-4.79567,7.80693 -15.56667,17.58031 -12.3781,26.61691c6.03265,-0.98199 10.87871,2.97905 6.06032,7.43356c4.94479,3.66121 22.35728,2.82278 18.59119,11.98875c-8.82205,2.92029 -18.29916,1.70366 -27.45192,2.00166c2.43703,25.01987 5.80666,50.04211 11.43709,74.54305c3.28979,5.43672 16.35808,9.61523 5.63309,16.70296c-4.00256,13.19919 8.78183,23.08223 16.81097,31.55379c8.82797,6.61176 4.54482,19.91519 17.0338,22.03693c9.83562,9.52774 -13.5036,9.27408 -19.49568,9.29486c-39.66827,0.42773 -79.37933,1.02615 -119.03208,-0.25211c-3.24605,-0.40967 -7.25645,-0.31595 -9.56982,-3.08264z", + "chess_knight": "m100.17753,299.2356c-10.0382,0.34137 -24.72987,-4.84531 -14.46609,-16.41525c11.17445,-4.40472 -1.98608,-19.00409 9.21265,-25.88123c8.98889,-12.79953 21.20518,-24.48807 24.89179,-40.11865c-0.57252,-10.60066 -13.22608,-16.87427 -7.18922,-28.60765c-5.92265,-18.77635 -4.55389,-40.38806 6.25748,-57.26643c9.18032,-15.67659 20.32635,-32.28713 19.15084,-51.25797c-11.5139,4.80804 -23.70148,9.0206 -36.37307,6.83708c-11.91311,-1.1064 -22.59742,8.54017 -34.74928,3.29494c-12.31807,-2.55921 -19.64501,-19.02957 -10.4606,-28.65753c10.03679,-8.57325 24.78339,-8.84916 34.35549,-18.41713c12.62932,-10.46186 24.31081,-24.61204 41.71716,-26.46155c7.69322,-1.76131 10.99294,-9.49197 15.25148,-15.2854c3.53894,9.18849 9.69408,17.31353 18.95801,21.387c18.83824,10.9118 23.5276,33.98066 30.47462,52.94444c5.13654,14.85179 9.41592,30.35814 18.01733,43.6171c0.09145,6.36343 -9.56343,9.05308 -3.04225,16.51302c3.39153,20.2325 3.53752,40.95071 3.23686,61.41966c-5.72005,10.01691 -10.93028,21.19722 -3.29993,32.69295c5.09689,14.05096 17.7905,23.26645 24.03563,36.52565c3.53024,6.8656 -6.88226,16.83319 6.09091,15.10654c11.84755,6.2681 2.28101,21.56821 -9.50232,17.11713c-44.15834,1.12289 -88.41394,2.24417 -132.5675,0.9133z", + "chess_pawn": "m76.17518,297.98557c-10.50418,1.59836 -25.59558,-8.37918 -12.29734,-17.44669c11.25366,-5.8967 0.45475,-21.25174 12.35514,-28.71019c12.10069,-16.52 24.98341,-33.40712 31.01369,-53.22789c-0.84142,-9.49573 -19.64921,-25.21422 -0.595,-28.29408c15.7114,1.82648 9.96503,-21.69583 15.39529,-31.88779c3.26528,-15.46995 5.63882,-31.19783 5.05293,-47.04268c-10.94164,-0.30554 -22.10724,0.96841 -32.83411,-1.63306c-6.84238,-8.98132 15.45903,-13.45317 19.13895,-21.55999c7.72121,-11.65172 -11.3031,-24.52544 -3.15941,-38.29919c5.20168,-20.85055 29.26575,-34.36854 49.62741,-26.73076c21.08499,5.46792 36.67119,30.37529 26.64961,51.09357c-0.80009,3.99703 -7.062,9.17959 -4.97066,12.36269c9.12987,6.33601 19.70087,11.85771 25.48528,21.64108c-8.18987,5.93826 -21.89375,1.4159 -32.1122,4.23674c-9.29645,8.24593 -0.11353,25.10609 0.36266,36.41936c2.90009,12.9261 5.46037,25.96617 8.78381,38.77452c6.98657,2.72525 21.33679,5.88095 13.4649,17.20207c-11.22217,9.11032 -5.7289,23.62137 0.60231,33.84465c7.87996,15.78793 21.40668,27.84862 29.69345,43.27188c3.07736,7.12057 -7.92374,19.7316 5.78708,16.78259c14.86404,3.15744 5.96938,23.76761 -7.3875,18.8981c-49.21407,1.73288 -98.52922,2.43631 -147.74446,0.51953l-2.31185,-0.21448l0,0z", + "chess_queen": "m59.54884,298.46313c-11.18457,2.51251 -19.80814,-14.30008 -5.94004,-16.129c12.20336,0.23074 -3.0349,-11.94995 7.98012,-16.05304c12.67021,-12.36537 25.23749,-25.26018 33.3575,-41.17609c-4.09126,-5.42482 -10.84344,-10.60782 -9.96117,-18.03085c7.964,-2.71161 19.82806,-0.87375 20.29981,-13.44502c7.24239,-22.68985 9.1741,-46.67986 10.76167,-70.3136c-7.99255,-6.33596 -24.45116,-0.33371 -35.62089,-3.56097c-16.94488,-4.5746 6.31873,-13.33291 13.78075,-12.6113c6.70493,0.01006 16.63324,-4.12222 5.41084,-7.2804c9.46686,-0.43687 23.08297,-12.44518 7.51486,-16.77373c11.54188,-8.28655 2.64816,-26.31929 -2.17102,-36.68976c-7.265,-12.52285 -19.21146,-21.59242 -32.71435,-26.42871c-2.18616,-12.77 18.63421,-8.99565 27.07909,-9.65835c12.78728,0.48775 25.82639,-0.15282 36.96732,-7.11507c15.05278,-6.96464 27.8495,4.65901 41.61934,7.11611c13.92807,0.89699 28.41634,-2.50577 41.97807,1.44028c4.20209,2.98911 11.18788,7.71034 2.77457,9.97613c-16.06789,8.94404 -31.07338,22.15693 -35.10127,40.92605c-6.0766,10.44077 4.6955,19.50048 -5.15381,26.98807c-0.10249,8.80961 22.85634,10.04067 10.00395,14.37878c8.80815,4.77542 27.69864,1.76332 29.62625,12.3696c-7.99612,6.2903 -19.2092,3.80788 -28.79007,4.39512c-3.2489,1.10706 -11.41316,-2.70125 -10.17032,2.89742c-0.6366,25.08775 5.87923,49.75521 12.1806,73.83221c0.00804,11.79608 29.09497,5.10777 12.92737,18.49597c-11.94247,10.28146 5.56685,24.68452 11.63272,33.82986c8.25099,10.03221 22.89711,15.11021 21.67468,29.8362c8.40468,0.60507 18.40166,13.69095 6.78131,16.95151c-62.8902,1.31946 -125.82766,2.22778 -188.72791,1.83258z", + "chess_rock": "m70.40736,299.11804c-15.60727,2.87628 -15.90823,-19.81082 -1.8931,-20.53482c-4.2011,-9.73361 -0.98556,-21.67557 5.22356,-30.68398c8.90442,-15.05035 22.29623,-30.00999 19.52936,-48.8515c-0.95786,-9.8022 -13.10349,-27.37677 5.72565,-24.85997c5.09087,-9.77498 2.13017,-24.16621 5.9483,-35.39389c3.33424,-21.28385 10.75552,-43.9948 2.86147,-65.09612c-4.97705,-11.23243 -17.62387,-18.62589 -16.26645,-32.35733c-1.42947,-13.39034 -0.95647,-26.88279 0.60455,-40.23392c6.07738,0.50975 12.84039,-1.27954 18.38155,1.475c-0.04153,12.96106 12.26991,10.08973 10.7935,-0.92486c3.23881,-1.28251 8.60017,-0.18413 12.6562,-0.55014c18.03256,0 36.06522,0 54.09778,0c-2.06311,7.51434 3.5195,17.19948 10.5887,8.35272c-1.93379,-11.75267 14.25911,-7.86334 10.37854,2.24694c0.22855,13.39515 1.87041,27.25403 -1.89201,40.29753c-6.12787,5.2086 -6.22449,15.45995 -13.90137,21.60233c-6.16908,11.51656 -3.45045,25.43306 -2.7644,37.9428c2.61279,18.51363 6.92676,36.79671 8.00221,55.52328c-0.76923,10.18126 20.18948,7.18474 11.15244,19.71645c-9.87662,8.41151 -4.0954,22.61668 -0.18413,32.66171c7.71916,17.36203 23.99019,32.95758 21.5343,53.32025c-1.94743,8.89606 14.16618,5.88821 9.97758,17.34372c-0.12151,14.11871 -21.10172,5.04239 -30.39526,8.00793c-46.7146,0.56656 -93.44374,1.44144 -140.159,0.99585z" + } +} diff --git a/dist/extensions/shapelib/license-MIT-raphael.txt b/dist/extensions/shapelib/license-MIT-raphael.txt new file mode 100644 index 00000000..0cd8be2d --- /dev/null +++ b/dist/extensions/shapelib/license-MIT-raphael.txt @@ -0,0 +1,12 @@ +All Raphaël icons were retrieved from here: +http://raphaeljs.com/icons/ + +And fall under the MIT license: + +Copyright © 2008 Dmitry Baranovskiy + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +The software is provided “as is”, without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose and noninfringement. In no event shall the authors or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software. diff --git a/dist/extensions/shapelib/math.json b/dist/extensions/shapelib/math.json new file mode 100644 index 00000000..e4e48a27 --- /dev/null +++ b/dist/extensions/shapelib/math.json @@ -0,0 +1,9 @@ +{"data": { + "divide": "m150,0.99785l0,0c25.17819,0 45.58916,20.41097 45.58916,45.58916c0,25.17821 -20.41096,45.58916 -45.58916,45.58916c-25.17822,0 -45.58916,-20.41093 -45.58916,-45.58916c0,-25.1782 20.41093,-45.58916 45.58916,-45.58916zm0,296.25203c-25.17822,0 -45.58916,-20.41095 -45.58916,-45.58917c0,-25.17819 20.41093,-45.58916 45.58916,-45.58916c25.17819,0 45.58916,20.41096 45.58916,45.58916c0,25.17822 -20.41096,45.58917 -45.58916,45.58917zm-134.06754,-193.71518l268.13507,0l0,91.17833l-268.13507,0z", + "equal": "m0.99915,31.03476l297.3767,0l0,95.17349l-297.3767,0zm0,47.58677l297.3767,0l0,95.17349l-297.3767,0z", + "minus": "m0.99887,102.39503l297.49445,0l0,95.2112l-297.49445,0z", + "not_equal": "m40.81188,62.2131l103.7978,0l22.27972,-61.2131l65.67503,23.90375l-13.5795,37.30935l40.20317,0l0,69.88993l-65.64099,0l-12.71893,34.94495l78.35992,0l0,69.88991l-103.79779,0l-22.27972,61.21309l-65.67503,-23.90378l13.57949,-37.30933l-40.20319,0l0,-69.88991l65.64102,0l12.71894,-34.94498l-78.35995,0z", + "times": "m1.00089,73.36786l72.36697,-72.36697l76.87431,76.87368l76.87431,-76.87368l72.36765,72.36697l-76.87433,76.87431l76.87433,76.87431l-72.36765,72.36765l-76.87431,-76.87433l-76.87431,76.87433l-72.36697,-72.36765l76.87368,-76.87431l-76.87368,-76.87431z", + "plus": "m1.00211,102.40185l101.39974,0l0,-101.39975l95.45412,0l0,101.39975l101.3997,0l0,95.45412l-101.3997,0l0,101.3997l-95.45412,0l0,-101.3997l-101.39974,0z" + } +} diff --git a/dist/extensions/shapelib/misc.json b/dist/extensions/shapelib/misc.json new file mode 100644 index 00000000..1ca3489f --- /dev/null +++ b/dist/extensions/shapelib/misc.json @@ -0,0 +1,37 @@ +{"data": { + "3_ways": "m1,159.61292l52.87097,-52.87097l0,26.43549l69.69355,0l0,-79.30646l-26.43549,0l52.87096,-52.87097l52.87097,52.87097l-26.43549,0l0,79.30646l69.69356,0l0,-26.43549l52.87096,52.87097l-52.87096,52.87097l0,-26.43549l-192.25807,0l0,26.43549l-52.87097,-52.87097z", + "3D_plane_1": "m1,187.25l74.49999,-74.5l223.49998,0l-74.5,74.5l-223.49997,0z", + "3D_plane_2": "m112.75,75.50002l74.5,-74.50002l0,223.50002l-74.5,74.49998l0,-223.49998z", + "babe": "m299.04794,205.18787c-3.77606,12.02469 -14.23288,15.70245 -23.42029,7.51477c-4.99579,-3.63025 -15.93668,-4.01721 -8.27643,4.11765c4.3663,3.89154 12.96597,18.43826 2.6701,7.63031c-6.72076,-9.88528 -21.45963,-10.97299 -26.80637,-21.01428c-0.7126,-12.09052 -19.01982,-9.85156 -28.21417,-13.29294c-7.97734,0.2787 -20.34282,-8.29872 -23.22426,-8.2877c7.17442,8.54059 6.05238,22.25063 13.10196,29.89879c9.38933,2.61444 12.97119,14.02899 0.81691,15.99643c-14.79422,5.33719 -12.22833,-12.63193 -20.04561,-20.07751c-5.76567,-2.6597 -0.17117,23.97388 -5.6981,17.70459c0.14073,-11.08301 -5.26385,-21.19345 -7.43376,-31.72055c3.66939,-3.90994 3.24513,-15.0824 -1.24792,-6.28702c-9.32401,15.52066 -21.53839,29.02148 -33.42717,42.58749c-12.32529,3.3429 -25.61986,1.75922 -38.28926,0.99091c-13.33909,0.21539 -16.41985,-23.40515 -24.5597,-24.14911c-1.69956,6.7645 0.04348,10.7413 3.54543,14.16528c-5.43895,6.35352 -17.0083,4.24969 -24.32439,1.67859c-12.99512,4.18167 4.10523,-7.37332 9.39456,-5.37735c0.12955,-9.23239 1.69711,-21.43146 -1.15234,-30.31955c-4.26376,-4.21536 -13.54346,-25.27448 -12.61225,-10.56541c-2.43563,17.92097 -10.72475,34.53096 -12.64814,52.59737c-1.6411,10.13943 -15.83897,5.33594 -23.08624,5.82672c-7.30112,2.27881 -6.50991,0.30469 -13.11051,0.69199c7.01961,-9.43863 23.73587,-3.27213 28.50491,-13.30713c2.12957,-14.98691 1.05568,-30.67914 6.12082,-45.11276c-2.11474,-14.92252 -6.78208,-29.69904 -6.85915,-44.79436c2.37534,-9.86703 8.15515,-18.85688 7.95601,-29.33565c4.35726,-11.70351 7.18935,-24.90283 15.98966,-34.19202c9.32926,-10.04192 23.95938,-2.34001 28.82026,8.23518c5.23969,11.5593 -2.89557,23.16132 -3.7411,34.79802c10.97217,2.97472 2.07053,18.22128 16.21945,16.77118c11.11885,1.02463 7.90206,16.12445 0.58741,20.71976c-0.2656,7.05571 8.13246,16.23514 6.20955,25.48418c5.50479,6.05925 12.30074,9.05171 12.7784,-1.61943c3.7646,-14.17346 5.15414,-29.11295 11.81579,-42.45001c2.65157,-10.67883 13.6115,-24.48097 25.27724,-15.69678c10.81068,5.92413 13.54153,23.94177 22.32231,28.34891c10.75034,-9.00977 20.01573,4.53285 28.83136,9.38853c13.27853,7.35518 24.98924,17.12993 37.79256,25.23851c13.37863,6.81644 27.61211,12.28633 40.07347,20.72394c8.47791,4.65475 17.41223,-4.71762 19.34897,6.49048zm-149.77098,-49.39249c-1.45267,7.65393 4.38054,3.60388 0,0z", + "bevel": "m24.5,277l-24,23m276,-22l23,22m-23,-274l23,-24m-275,23l-23,-22m23,21.5l252,0l0,252l-252,0l0,-252zm-23.5,-23.5l299,0l0,299l-299,0l0,-299z", + "bone": "m273.3559,119.27242c-11.58661,5.90293 -23.89537,9.95385 -36.67676,12.27164c-53.42084,0.2984 -105.13121,0.41397 -158.74251,2.97562c-14.28426,-2.65407 -30.58815,0.18161 -42.82426,-9.13783c-9.06827,-7.25944 -28.17529,-2.4415 -25.05096,11.36483c6.17649,14.08824 -14.61965,21.70474 -7.59176,36.00003c6.11589,14.67987 24.54805,9.02721 35.59484,4.1729c20.29636,-4.79665 40.55842,-9.8537 60.92737,-14.38416c42.52868,-4.82219 82.54949,-1.83121 124.59118,1.02063c11.68694,2.54654 23.55803,4.03351 35.45654,5.38187c10.1839,0.16006 18.34979,7.46698 27.92017,8.65919c12.6539,-1.22533 16.41983,-19.19981 7.59747,-27.17406c-13.18918,-8.72406 6.75436,-24.14882 -8.14166,-31.38885c-4.25287,-2.31086 -8.733,-0.75754 -13.05966,0.23817z", + "chord": "m277.04315,255.07486c-47.63342,47.63342 -121.3194,57.33392 -179.65791,23.65366c-58.33851,-33.6824 -86.78111,-102.34741 -69.34571,-167.41564c17.43547,-65.06779 76.39998,-110.31287 143.76268,-110.31287l105.24094,254.07486z", + "circle_band": "m1,224.5l0,0c0,-82.29044 66.70957,-149 149,-149c82.29042,0 149,66.70956 149,149l-74.5,0c0,-41.14522 -33.3548,-74.5 -74.5,-74.5c-41.1452,0 -74.5,33.35478 -74.5,74.5z", + "circle_pie": "m299,150l0,0c0,82.29044 -66.70956,149 -149,149c-82.29044,0 -149,-66.70956 -149,-149c0,-82.29043 66.70956,-149 149,-149l0,149z", + "cube": "m30.42785,1.56129l-29.42785,29.42785l0,268.21907l264.28937,0.68124l33.35693,-30.10974l0,-268.21843l-268.21845,0zm236.46521,28.94674l0,269.42122m0,-269.42122l33.35693,-29.50804m-33.35693,30.791l-265.57233,-1.28296", + "dagger": "m1.57422,47.21264c-2.775,14.24454 5.08469,27.79975 11.2199,40.10517c13.07098,21.70464 28.2358,42.59465 47.26681,59.46329c12.98537,10.6889 24.68548,22.99878 39.38902,31.4678c19.22253,12.95224 39.86254,23.55869 61.26455,32.3793c15.9138,6.93546 32.60274,11.85577 49.65401,15.08282c4.95967,1.28564 18.82625,4.91663 10.19991,-3.60251c-7.15544,-3.02133 -14.76756,-5.22583 -21.96236,-8.37695c-34.92769,-14.34082 -72.04247,-26.94104 -100.21951,-53.10463c-4.66899,-6.20064 8.95855,3.3492 11.3067,5.96803c23.50703,16.73581 50.36192,27.95749 76.84653,39.04178c13.47301,4.46384 28.20039,13.97903 42.51408,7.22675c12.36502,-4.72467 -2.95702,-5.44891 -8.42033,-7.24844c-24.28337,-6.90491 -48.85286,-13.54227 -71.13893,-25.76019c-12.72568,-4.65573 -23.42126,-13.22678 -34.85331,-20.29132c-12.35065,-8.53128 -23.65424,-18.49934 -35.67798,-27.49634c-7.86864,-5.96642 -15.68669,-11.98865 -22.20108,-19.46664c-11.01625,-11.02383 -21.70009,-22.36108 -31.68482,-34.33246c-6.52307,-7.36439 -13.86146,-14.10685 -18.44664,-22.93894l-5.05655,-8.11652zm256.45175,139.13108c-1.50562,-0.04745 -3.06,0.28214 -4.36211,1.15021c-9.72246,4.86124 -7.63908,13.88922 -13.19478,20.83386c-4.16678,5.55569 -9.028,8.33356 -15.97261,10.41693c1.38892,2.77783 4.16675,6.94461 4.16675,10.41693c0,7.63907 -9.02798,14.58368 -15.97261,13.88922c-2.77786,-0.69446 -9.028,-4.16678 -11.11139,0c-0.69446,1.38895 -0.69446,2.77786 0,3.47232c0,2.77786 3.47231,4.16678 6.25015,5.55569c7.63908,2.08337 15.97263,-0.69446 22.22279,-4.86124c4.86122,-2.77783 8.33353,-7.63907 9.72246,-13.19479l1.38892,-9.02798c0.69446,-2.77783 3.47232,-3.47232 6.94463,-8.33353c4.16676,-5.55569 8.33354,-15.2782 13.88924,-19.44495c2.08337,-1.38892 4.16675,-2.0834 6.94461,-2.77786c-1.38892,-2.08337 -2.77786,-3.47229 -4.16678,-5.55566c-1.38892,-0.69449 -2.77783,-2.0834 -4.16675,-2.0834c-0.78128,-0.26041 -1.6792,-0.42728 -2.58252,-0.45575zm29.4061,26.21594c-2.61084,-0.02899 -5.33868,0.54254 -8.07312,1.32382l5.55569,3.47232c-1.38895,2.77783 -4.86121,8.33353 -4.16678,11.80585c0.69449,6.94461 10.41693,6.94461 14.58371,2.77783c4.86124,-5.55569 4.86124,-13.88922 -2.08337,-18.056c-1.82297,-0.91147 -3.78549,-1.30127 -5.81613,-1.32382zm-13.39011,3.40723c-0.54364,0.00192 -1.07498,0.00705 -1.60593,0.0217c-3.8486,0.21091 -7.69568,0.50116 -11.54541,0.67276c-2.41867,0.03116 -4.88754,-0.00473 -7.22676,0.69446c-3.17285,2.02515 -5.29396,5.38272 -6.53229,8.87607c-0.16666,0.50345 -0.30807,1.02072 -0.41234,1.54083c3.86218,1.74924 8.17189,1.5618 12.30499,1.41064c2.50439,-0.06696 5.00949,0.24561 7.50888,0.36893c1.7876,0.07916 3.57104,0.32327 5.36038,0.26044c2.19412,-0.07278 4.22598,-1.3168 5.38205,-3.16849c0.99927,-1.58255 1.9447,-3.21933 2.56085,-4.99146c0.49768,-1.59048 0.5896,-3.80087 -1.06339,-4.75272c-1.43857,-0.79446 -3.10013,-0.93906 -4.73105,-0.93317zm2.53915,15.9726c-0.69449,0.69446 -1.38892,0.69446 -2.0834,1.38892c-0.69446,3.47232 8.33356,11.80588 9.72247,4.16678c-3.47232,-1.38892 -5.55573,-2.77786 -7.63907,-5.55569z", + "diamonds": "m79.28394,70.5173l69.51914,-69.51918l69.53062,69.51918l-69.53062,69.5193l-69.51914,-69.5193zm-78.28265,78.73502l69.53064,-69.51916l69.51917,69.51916l-69.51917,69.53081l-69.53064,-69.53081zm158.04381,1.41991l69.53076,-69.50788l69.50775,69.50788l-69.50775,69.53059l-69.53076,-69.53059zm-78.26005,78.74646l69.50779,-69.51927l69.53087,69.51927l-69.53087,69.5197l-69.50779,-69.5197z", + "dog": "m244.35188,22.54387l-69.54898,69.54889c-119.32899,0.00291 -120.2569,-0.00142 -121.18423,0c-10.16035,0.01348 -20.31404,-0.04446 -30.47281,0.1654c-17.41192,-3.13311 -29.41997,20.08429 -17.10143,32.59326c9.91919,10.04415 24.91881,5.84701 37.58711,6.70858c0.082,39.19679 0.15858,78.39276 0.24066,117.58955c-1.93424,11.60912 7.01076,23.37389 18.92138,24.38115c10.04872,1.3252 21.64701,-4.10141 24.54638,-14.3645c2.0378,-20.77086 0.69009,-41.75818 1.06802,-62.62978c15.7105,0 58.3028,0.55273 93.34407,0.94731c0.05244,10.48698 0.11156,36.08763 0.16484,43.1525c-0.20064,9.60797 -0.94731,36.79358 17.44778,36.82019c18.39429,0.02664 19.96759,-19.29745 19.74867,-23.16328c-0.13904,-5.1078 0.14149,-42.99934 0.54108,-56.44814c2.24173,0.01166 4.87888,0.02997 6.54291,0.02997c-0.00998,-0.00999 -0.01997,-0.01997 -0.02995,-0.02997c0.10487,0.06078 0.2106,0.11987 0.31549,0.18065c0.19894,-16.80684 -0.38959,-50.0226 -0.04497,-66.82692c15.38005,-0.19313 30.76425,-0.09573 46.14514,-0.13486c13.52618,3.45377 34.10559,-4.10139 23.59946,-20.81667c-16.37396,-18.52205 -34.58011,-35.37009 -51.83061,-53.07936l0,-34.62398z", + "frame_half": "m1,1l297,0l-98.99899,98.99902l-99.00199,0l0,99.00198l-98.99902,98.99901z", + "hand_stop": "m136.25574,297.49808c-29.33714,-5.08954 -54.45634,-27.86633 -62.06976,-56.71431c-3.62096,-14.72525 -1.50079,-30.17319 -2.21442,-45.21799c-0.13461,-38.62221 -0.20337,-77.24464 -0.30453,-115.86696c3.44471,-11.98872 17.98409,-18.29414 29.04424,-12.36688c0.96214,-3.14931 0.25692,-8.79729 0.59418,-12.8885c-1.96137,-11.24498 6.05913,-22.68389 17.70836,-23.44487c6.68523,-0.04347 14.68906,5.03699 11.64235,-6.21321c-2.06573,-11.58701 7.02885,-24.78486 19.46753,-23.71677c11.8866,-1.10308 20.91313,10.99307 19.47894,22.20545c0.55293,6.69356 15.04739,-4.38583 20.11427,3.0555c6.46245,3.83537 10.88301,11.15349 9.66263,18.71955c0.37462,20.72639 -0.50464,41.58417 0.94255,62.21075c10.62856,-5.38028 25.7729,1.23052 27.94981,13.06696c-0.24077,36.77421 0.61372,73.57438 -0.64664,110.32743c-4.27835,37.80429 -40.23309,69.77301 -78.61711,67.50256c-4.25351,0.01132 -8.54422,0.05313 -12.75241,-0.65872zm26.24695,-10.04156c32.22029,-5.44516 57.56776,-36.59567 55.75252,-69.35173c0.24638,-31.65953 1.24834,-63.36566 0.07516,-95.00381c-0.74966,-11.56753 -19.92574,-8.76712 -18.68594,1.90652c-0.00584,23.46449 -0.01172,46.92897 -0.01762,70.39346c-5.97046,6.15695 -16.65688,2.44864 -23.81619,7.45261c-15.91585,6.94403 -26.02902,23.94809 -26.37592,41.0688c-8.5842,13.31046 -12.47054,-8.35147 -7.54663,-15.48785c5.69263,-21.52615 25.72418,-37.58736 47.72688,-39.6965c-0.18001,-49.52237 0.46608,-99.06258 -0.57811,-148.57061c-6.22968,-14.02401 -23.68619,-1.72364 -19.04016,10.55674c-0.45773,37.44105 -0.04761,74.89084 -0.68825,112.32923c-4.16106,6.65674 -12.04573,0.3437 -9.47389,-5.79948c-0.17776,-46.90031 -0.35556,-93.80062 -0.53333,-140.70093c-3.33864,-8.28292 -18.12991,-6.98883 -18.3627,2.10197c-0.18286,48.40011 -0.36572,96.80021 -0.5486,145.20032c-3.89212,5.48285 -11.88664,0.71593 -9.73376,-5.26897c-0.14377,-36.45805 0.40013,-72.93186 -0.55034,-109.37686c-0.24316,-10.84745 -18.40633,-10.5788 -18.64873,-0.51889c-0.36327,37.37112 0.09734,74.76224 -0.99649,112.11712c1.02982,9.51479 -12.37218,4.97615 -9.28424,-2.22137c-0.16375,-25.39479 0.44627,-50.81747 -0.58949,-76.18918c-6.1088,-15.65501 -24.37704,-2.73073 -19.28278,10.2811c0.06127,45.03139 -0.41048,90.08521 0.72834,135.10263c2.79378,34.58762 36.09247,63.06729 70.73276,60.79437c3.26721,-0.13614 6.52469,-0.50925 9.73752,-1.11868z", + "L_shape": "m1,1l149,0l0,149l149,0l0,149l-298,0l0,-298z", + "lightning_bolt": "m117.48906,0.99793l60.3351,83.60071l-24.88768,9.85823l75.99797,71.63888l-24.88768,11.96198l93.95412,119.94316l-159.33742,-91.91997l30.38835,-12.76016l-99.00077,-58.87717l35.47526,-18.19279l-104.52837,-61.76487l116.49113,-53.48799z", + "logo_apple": "m209.28954,1.00088c-43.04727,7.92585 -57.33284,43.96882 -57.8894,64.561c23.68694,1.71168 38.47275,-11.65597 44.5219,-19.4791c9.85237,-11.09263 12.25443,-26.71591 13.36751,-45.0819zm5.28372,71.19604c-31.11621,-0.01418 -48.48506,12.70539 -57.04939,12.84402c-9.82712,-0.76584 -38.46593,-12.28108 -55.16231,-12.46661c-58.47802,1.74345 -75.23289,65.28636 -74.50751,92.61087c4.76329,104.60263 68.59296,131.60016 79.02421,134.12564c8.36713,1.64984 36.57712,-12.89731 57.32939,-12.23529c22.65837,2.3606 38.49214,11.76068 47.58983,11.10309c11.51012,-0.79871 49.05655,-31.14218 60.37299,-77.89201c-22.81836,-19.29358 -36.89403,-36.77824 -38.15468,-53.37267c-0.584,-7.50279 10.70016,-49.91425 28.69514,-61.83392c2.59723,-14.65567 -24.13031,-33.25182 -45.08191,-32.83442c-1.03252,-0.02777 -2.05203,-0.0482 -3.05577,-0.04871z", + "man": "m125.90131,25.2503c0,-13.33112 10.79823,-24.12934 24.12934,-24.12934c13.33113,0 24.12932,10.79822 24.12932,24.12934c0,13.33112 -10.79819,24.12934 -24.12932,24.12934c-13.33113,0 -24.12934,-10.79822 -24.12934,-24.12934zm81.12696,68.30144v-12.18601c0,-12.82147 -10.38806,-23.21696 -23.21696,-23.21696h-67.63607c-12.82147,0 -23.21695,10.39549 -23.21695,23.21696v12.18601c-0.02242,0.2766 -0.03739,0.56071 -0.03739,0.84853v70.18918c0,5.4538 4.41839,9.87215 9.87218,9.87215c5.44633,0 9.87589,-4.41837 9.87589,-9.87215v-69.14999h6.62006v79.02961h0.04859v111.66646c0,7.25925 5.89491,13.15787 13.16164,13.15787c7.27048,0 13.16164,-5.89114 13.16164,-13.15787v-111.66646h8.68347v111.66646c0,7.25925 5.89856,13.15787 13.16162,13.15787c7.27045,0 13.16161,-5.89114 13.16161,-13.15787v-111.66646h0.04112v-79.02961h6.62007v69.14623c0,5.45381 4.42955,9.8759 9.8759,9.8759c5.45386,0 9.87218,-4.42209 9.87218,-9.8759v-70.18916c-0.00371,-0.29156 -0.02617,-0.56819 -0.0486,-0.8448z", + "maximize_2": "m1,149.99998l67.05,-67.05l0,33.52501l48.425,0l0,-48.425l-33.52501,0l67.05,-67.05l67.04999,67.05l-33.52499,0l0,48.425l48.42502,0l0,-33.52501l67.04997,67.05l-67.04997,67.04999l0,-33.52499l-48.42502,0l0,48.42502l33.52499,0l-67.04999,67.04997l-67.05,-67.04997l33.52501,0l0,-48.42502l-48.425,0l0,33.52499l-67.05,-67.04999z", + "moon": "m227,299.94119l0,0c-85.05185,0 -154,-66.92029 -154,-149.4706c0,-82.55034 68.94815,-149.4706 154,-149.4706l0,0c-48.47263,35.28521 -77,90.6619 -77,149.4706c0,58.80869 28.52737,114.18535 77,149.4706z", + "mythic_unicorn_2": "m182.0204,297.85391c-5.77818,-7.90314 -14.7635,-8.80438 -16.9241,-20.05347c-1.69348,-6.11859 -17.65829,-14.32483 -8.20955,-3.3428c7.2961,6.61768 15.96432,31.02682 -1.98563,23.31473c-13.65228,-5.01041 -14.2377,-20.48209 -17.89716,-32.06519c-11.90031,-8.25644 3.07674,-25.71408 -9.73651,-36.29276c-10.87482,-11.04288 -3.30119,-31.72456 -18.8404,-39.55457c-7.79965,-3.16566 -11.1757,18.69177 -12.48895,2.70163c-4.27309,-16.17242 -19.36451,7.86156 -29.42789,5.31358c-8.12057,-0.70595 13.58361,-6.35143 3.22626,-7.87068c-6.08933,3.33348 -11.72343,9.09727 -12.68681,-0.44351c-7.3251,-4.35046 -22.68599,-11.29797 -22.28696,-18.20909c6.3611,-1.99829 27.83545,3.78387 24.11403,-4.25029c-6.38573,-2.42343 -7.54573,-9.04803 0.27553,-4.60205c15.41352,0.48352 33.48255,-5.66917 46.30758,6.09853c6.68958,4.11612 13.26701,18.87857 16.84827,4.53223c11.5443,-13.92389 34.83883,-15.10329 41.95536,-33.13124c1.72211,-8.72215 -5.28903,-13.69839 -11.24521,-15.46512c-1.15878,-2.86641 -3.13139,-15.03612 -8.05675,-8.8949c0.22449,-5.37502 4.84473,-18.22859 -5.38927,-12.53831c-1.03801,-11.44846 8.74879,-22.87025 -4.19783,-31.20716c12.13029,2.25027 9.73825,-11.57887 7.09616,-13.77212c7.19073,-1.02106 15.62939,-7.49186 11.66467,-15.50808c7.80894,14.17675 8.07971,-17.19902 14.50877,-3.67512c11.83272,1.93988 -3.67599,-10.57163 7.20721,-7.77902c6.21443,0.21264 4.83423,-6.80917 10.41692,-1.50957c7.3886,-4.03149 -5.66409,-16.21531 6.26559,-7.74985c4.01033,3.484 16.77809,12.60911 14.48726,0.56772c11.33586,12.0923 20.25659,-11.23169 29.67625,-16.06186c3.73633,-4.47003 11.8613,-9.20071 4.36795,-0.66791c-4.97461,10.87669 -21.85179,22.64296 -17.31131,33.45053c-4.10985,3.74163 8.29224,8.44421 -1.58034,7.02768c-5.8488,6.31351 7.84134,18.1257 8.93388,28.06219c-3.13588,6.80826 -15.07657,14.53744 -19.90688,14.29315c1.76543,-8.76564 -2.06178,-20.19066 -13.24036,-15.23595c6.26202,11.45789 14.72818,22.40379 20.03253,34.86404c5.18462,12.24902 13.59059,26.39416 24.64981,10.62966c7.04883,-10.04763 27.18559,-9.90218 21.65419,6.41521c-2.82767,16.0232 4.74286,37.1706 -9.80374,48.20794c-8.77531,16.90973 -18.50392,-6.2874 -11.60965,-15.06308c-1.75673,-2.50781 -3.11575,-4.27809 2.02489,-7.7061c-1.06146,-2.57137 14.7939,-12.24554 6.80286,-18.18176c-9.0885,10.30594 -22.38708,22.23511 -18.69125,37.55475c2.99957,10.26601 -21.73944,27.86615 -19.76117,10.82875c0.44312,-6.62131 9.89648,-19.45415 7.72044,-21.10741c-6.90181,12.95006 -16.71997,25.39136 -31.55621,29.23625c-12.34084,0.73132 -18.80547,10.66779 -12.94504,21.69241c1.11998,15.62238 -7.12646,29.76141 -9.02499,44.972c3.52914,16.13283 25.01552,19.39287 27.93198,35.84959c5.01138,11.05234 -7.52405,9.41898 -13.36446,6.32639zm-30.55545,-48.12944c-1.80891,-7.29253 -5.53151,18.95699 -0.94273,5.02481l0.68695,-2.46143l0.25578,-2.56339z", + "page": "m249.3298,298.99744l9.9335,-39.73413l39.73413,-9.93355l-49.66763,49.66768l-248.33237,0l0,-298.00001l298.00001,0l0,248.33234", + "people_business_woman_1": "m152.09991,291.25156c-2.47678,-44.58551 4.65103,-89.4209 -0.87244,-133.89311c-8.95648,25.8877 -13.19429,53.17113 -13.68393,80.52692c-0.41364,17.0155 -0.16316,34.03816 -0.23213,51.05714c-6.59424,1.84573 -15.25726,1.21277 -19.31381,7.46753c-5.79991,2.60486 -12.31924,1.35736 -18.48087,1.65521c6.01304,-4.82208 13.37695,-9.59021 13.6609,-18.23849c6.31746,-52.60599 2.67181,-105.66583 3.06088,-158.49306c0.43537,-21.1868 -1.16552,-42.66898 2.64828,-63.61227c2.03822,-10.62624 19.15558,-5.1272 18.60609,-18.67488c3.03041,-11.80116 0.67964,-26.03735 9.52867,-35.60117c10.5938,-7.7376 21.95103,4.42952 20.767,15.48053c1.06621,11.41806 -1.19225,25.92375 9.12468,33.77226c11.50188,2.75379 13.11151,17.72176 18.13281,26.80961c4.23164,10.69022 9.72182,23.87735 0.08774,33.44124c-5.93716,8.68594 -16.90076,16.78377 -12.99744,28.7057c-0.60452,31.03065 -6.76558,61.62357 -9.34036,92.51013c-2.09418,17.62329 -2.81628,35.5533 -6.9491,52.84404c-0.55614,5.69342 -5.84515,19.49838 -12.14343,10.53711c-0.87442,-1.99588 -1.26941,-4.15509 -1.60355,-6.29443zm-31.23076,-126.74179c-4.61314,-4.02649 0.43039,13.47859 0.48324,1.7234l-0.48324,-1.7234l0,0zm6.80929,-33.43718c-1.88333,-6.96362 -7.13425,10.3817 -5.38842,14.89726c-0.28574,6.8293 0.74596,4.17953 2.10389,-0.81731c1.48602,-4.58557 2.79638,-9.27054 3.28453,-14.07996zm61.63647,-23.18116c5.52028,-11.36497 -2.7056,-23.94508 -11.13263,-31.31998c-8.36171,1.6476 -4.1756,17.26677 -4.09579,24.50607c-0.37729,9.19583 11.31773,21.60236 15.22842,6.8139zm-59.09369,-11.57291c-3.00658,-5.39182 -0.968,23.24248 0.49254,8.1709c0.11818,-2.72906 0.0034,-5.48079 -0.49254,-8.1709z", + "plant_tree_1": "m122.82124,295.43991c-9.60714,-8.11343 -1.74962,-22.4458 -1.18428,-32.9653c4.14859,-11.24323 3.96359,-85.81235 -10.94936,-86.09872c-15.83897,-4.80884 -33.8653,1.83771 -48.3958,-7.59918c-9.84084,-5.82912 -12.90007,-17.71764 -12.64209,-28.40579c0.19444,-11.07701 -10.96857,-15.73981 -14.56149,-25.02111c-4.85892,-11.57952 -0.66407,-24.81283 7.67092,-33.63805c7.87535,-8.99152 0.96225,-20.76784 4.99341,-30.60822c5.74977,-13.3805 22.92119,-7.46461 32.14548,-16.67288c9.90182,-6.99356 18.35265,-19.09785 32.07681,-17.29906c13.25371,0.83774 28.05221,3.21463 39.26759,-5.80136c10.45538,-8.74133 25.08881,-13.41753 38.21471,-8.04486c12.4521,3.84588 26.61226,11.87612 26.66945,26.64145c-3.79947,15.14795 10.55962,14.96229 20.88582,17.05112c12.22475,5.50745 24.82689,14.06517 29.88231,26.94686c1.34924,14.72554 -15.32854,26.93484 -7.76337,41.96729c2.96521,14.64848 -9.76962,22.78136 -18.92447,30.72028c-3.76666,14.33221 -18.04883,25.98621 -33.39958,22.57785c-12.36432,-2.02824 -19.98886,11.49191 -32.59709,10.30693c-8.35739,8.60075 -2.66228,82.40933 -1.11533,92.59302c6.29385,12.59021 -2.48013,26.51376 -16.65036,26.0885c-11.10333,1.33105 -23.19679,1.95465 -33.62328,-2.73877z", + "rectangle_2_rounded": "m50.66998,1l198.6639,0l0,0c13.17268,0 25.80577,5.2328 35.12022,14.54726c9.31445,9.31446 14.54727,21.94758 14.54727,35.12021l0,248.33141c0,0.00134 -0.00116,0.00247 -0.0025,0.00247l-297.99637,-0.00247l0,0c-0.00136,0 -0.0025,-0.0011 -0.0025,-0.0025l0.0025,-248.3289l0,0c0,-27.43059 22.23686,-49.66747 49.66748,-49.66747z", + "rectangle_3_rounded": "m50.66972,1l248.33028,0c0.0007,0 0.00134,0.00024 0.00177,0.00072c0.00049,0.00048 0.00076,0.00108 0.00076,0.0018l-0.00253,248.32779c0,27.43044 -22.23679,49.66722 -49.66722,49.66722l-248.3303,0l0,0c-0.00138,0 -0.00248,-0.00113 -0.00248,-0.0025l0.00248,-248.32779l0,0c0,-27.43045 22.23678,-49.66723 49.66724,-49.66723z", + "ribbon_up": "m0.99887,298.99884l37.37486,-124.16641l-37.37486,-124.16684l74.74943,0l0,-37.25092l0,0c0,-6.85776 4.18383,-12.41691 9.34372,-12.41691l130.81201,0c5.16063,0 9.34372,5.55916 9.34372,12.41691l0,37.25092l0,0l74.74974,0l-37.37488,124.16684l37.37488,124.16641l-102.7809,0c-5.15987,0 -9.3437,-5.55884 -9.3437,-12.41577c0,-6.85834 4.18384,-12.41724 9.3437,-12.41724l18.68744,0c5.16063,0 9.34372,-5.5603 9.34372,-12.41721c0,-6.85834 -4.18309,-12.41722 -9.34372,-12.41722l-130.81201,0c-5.15989,0 -9.34372,5.55888 -9.34372,12.41722c0,6.85693 4.18383,12.41721 9.34372,12.41721l18.68743,0c5.1606,0 9.34372,5.5589 9.34372,12.41724c0,6.85693 -4.18312,12.41577 -9.34372,12.41577zm121.79819,-30.86179l-0.71873,-217.77046m-149.49945,214.90504l0.71875,-213.47234m110.6871,199.14535l0.71873,41.54834m-74.03098,-1.43271l-0.71874,-40.11563", + "sflowchart_filter2": "m1,75.5l298,0l-149,74.5l149,74.5l-298,0l149,-74.5l-149,-74.5z", + "sign_no": "m0.99794,149.99951l0,0c0,-82.29002 66.70967,-148.99969 148.99992,-148.99969l0,0c39.51779,0 77.41692,15.69819 105.35898,43.64116c27.94318,27.94297 43.64124,65.84185 43.64124,105.35853l0,0c0,82.29103 -66.7092,149.00024 -149.00021,149.00024l0,0c-82.29025,0 -148.99992,-66.70921 -148.99992,-149.00024zm240.6012,66.65504l0,0c32.80489,-45.08388 27.92851,-107.33437 -11.49672,-146.75905c-39.42525,-39.42501 -101.67574,-44.30139 -146.75847,-11.49616l158.25519,158.25521zm-183.20167,-133.30872c-32.80512,45.08364 -27.92886,107.33413 11.49615,146.75825c39.4249,39.42525 101.67541,44.30159 146.75814,11.49672l-158.2543,-158.25497z", + "skull": "m74.9404,81.44109c-2.88919,16.35929 -10.26919,31.99403 -10.76614,48.86361c0.66122,9.76746 -5.89156,15.01402 -14.86213,14.8293c-9.64813,10.00099 1.19087,25.80647 12.10749,29.84357c11.14103,7.47832 24.96226,-0.87791 35.99846,5.83044c14.65424,11.4554 20.77205,31.76607 15.71635,49.57211c-5.02672,14.69893 20.70476,9.35306 11.02628,-2.39693c-7.47506,-11.48471 14.09103,-7.68764 8.56998,3.21603c-1.04326,8.75262 6.45616,11.58562 3.11867,20.06531c8.69472,4.98558 -0.72885,7.77708 -6.02475,8.71843c-12.40178,6.18225 2.24324,-11.07452 -7.58144,-16.17874c-8.99694,1.95532 -2.90059,17.02136 -5.98875,15.28125c-6.3575,-4.97824 -6.35281,-23.59047 -17.02285,-11.44621c-3.54128,-14.96387 2.92009,-30.54814 -2.05737,-45.42514c2.03897,-11.11034 -15.50281,-14.9426 -13.28409,-2.05647c0.88449,19.66696 -5.0876,39.29475 -1.66005,58.86481c4.72071,12.07065 17.92378,17.50833 26.2104,26.82291c6.80557,7.18207 15.6284,14.86087 26.22089,12.5997c12.0141,-0.52078 24.05035,-1.63034 36.01024,0.2771c15.04311,0.47446 26.52666,-11.41623 39.36443,-17.5242c15.0918,-11.98355 12.71564,-33.38867 11.21118,-50.43889c-1.84476,-10.52664 2.20334,-21.05807 1.44894,-31.48618c-10.88037,-13.31276 -19.80722,10.08708 -16.70779,20.14043c-0.00076,12.64635 2.42783,28.93701 -9.63577,37.17496c-9.95572,-0.25104 -19.43069,3.36517 -29.4632,1.4744c-8.14081,4.83435 -21.32692,4.71021 -24.01404,-6.79811c-1.07281,-10.22015 3.55807,-20.93494 -2.73401,-30.47318c5.52835,4.7614 15.17361,-4.11226 9.79822,6.56248c-6.55643,8.68922 5.55173,22.07874 10.10989,9.25331c1.51227,-8.60512 -6.54141,-20.02596 6.69714,-18.18237c2.6998,3.03528 -9.21959,24.26701 7.07346,18.90152c11.61606,-2.54445 -2.06659,-20.76607 13.66382,-20.82939c7.61295,-8.9626 5.56317,-25.76184 17.20825,-32.56114c12.98419,-8.78706 33.2569,-2.44315 42.52423,-17.32399c7.89911,-7.61507 4.18182,-28.72154 -9.44128,-21.72794c-17.02448,1.65962 -3.51318,-23.0582 -3.98819,-32.32024c4.01126,-8.06691 -4.87137,-25.04774 -1.81268,-26.84933c5.77948,8.84253 7.84946,19.18484 6.60651,29.51878c-0.10681,8.76352 -3.8233,32.51385 8.36014,17.87288c4.12442,-10.20347 2.92487,-21.76073 5.86331,-32.37626c5.66748,-22.91865 -4.48026,-45.85004 -15.79309,-65.262c-9.63495,-10.45038 -21.86679,-18.78104 -33.35342,-26.98327c-19.32092,-7.26658 -40.65421,-8.56836 -61.06006,-6.74718c-18.04979,3.12863 -37.13738,6.42709 -51.51633,18.73374c-14.01352,8.25707 -27.43441,19.22373 -32.97453,35.08961c-4.82798,12.78156 -13.28239,25.798 -9.43994,39.99647c3.67479,11.83601 1.72576,24.12813 2.32075,36.22574c6.26442,13.82637 12.1788,-7.07504 11.59255,-13.98853c0.3468,-13.11021 7.26362,-24.71465 12.36033,-36.35318zm115.06042,28.12622c12.88235,0.92311 29.19336,8.09689 29.54492,23.0528c1.95883,15.00865 -10.16846,29.55684 -25.7099,28.08501c-14.11661,-1.15955 -23.14499,-13.35332 -22.20761,-27.06258c-4.7262,-9.82969 2.6286,-20.35741 12.49942,-22.61709c1.91415,-0.64365 3.88168,-1.12543 5.87317,-1.45815zm-86.93419,1.27835c14.94448,-2.65778 31.94749,6.61306 31.99739,23.15527c1.40359,15.99194 -15.57494,19.12508 -27.15695,23.1313c-8.01422,5.17467 -16.3391,0.35667 -22.99829,-4.85698c-8.63997,-9.0434 -6.10048,-27.26721 3.02245,-35.52229c4.42388,-3.27404 9.90028,-4.56108 15.1354,-5.9073zm51.1378,42.18812c7.2348,9.94383 15.92023,25.10751 6.56407,36.39339c-8.30571,6.66107 -9.35284,-9.47466 -18.07048,-1.8754c-8.17816,-7.1624 -0.63536,-21.73717 5.10291,-29.01329c1.8913,-2.09525 4.05559,-3.93987 6.4035,-5.5047z", + "star_32": "m1,150l37.78866,-10.95375l-34.9264,-18.11479l39.19976,-3.37057l-30.72019,-24.58047l39.1037,4.34019l-25.33452,-30.10049l37.5051,11.88636l-18.97492,-34.46539l34.46528,18.97503l-11.88614,-37.50511l30.10025,25.33441l-4.34019,-39.10359l24.58048,30.72008l3.37057,-39.19964l18.11479,34.92639l10.95375,-37.78866l10.95375,37.78866l18.11479,-34.92639l3.37057,39.19964l24.58047,-30.72008l-4.34018,39.10359l30.10023,-25.33441l-11.88614,37.50511l34.4653,-18.97503l-18.97491,34.46539l37.50508,-11.88636l-25.33452,30.10049l39.10347,-4.34019l-30.71994,24.58047l39.1994,3.37057l-34.92581,18.11479l37.78842,10.95375l-37.78842,10.95375l34.92581,18.11479l-39.1994,3.37057l30.71994,24.58047l-39.10347,-4.34018l25.33452,30.10025l-37.50508,-11.88615l18.97491,34.4653l-34.4653,-18.97493l11.88614,37.5051l-30.10023,-25.33452l4.34018,39.10347l-24.58047,-30.71994l-3.37057,39.1994l-18.11479,-34.92581l-10.95375,37.78842l-10.95375,-37.78842l-18.11479,34.92581l-3.37057,-39.1994l-24.58048,30.71994l4.34019,-39.10347l-30.10025,25.33452l11.88614,-37.5051l-34.46528,18.97493l18.97492,-34.4653l-37.5051,11.88615l25.33452,-30.10025l-39.1037,4.34018l30.72019,-24.58047l-39.19976,-3.37057l34.9264,-18.11479l-37.78866,-10.95375z", + "sun": "m298.99939,149.99919l-60.12755,21.3835l0,-42.76601l60.12755,21.38251zm-43.65198,-105.36193l-27.38881,57.64266l-30.23897,-30.23995l57.62778,-27.40271zm-105.34804,-43.63768l21.38251,60.12764l-42.76602,0l21.38351,-60.12764zm-105.36263,43.63768l57.64236,27.40271l-30.23955,30.23995l-27.40281,-57.64266zm-43.63767,105.36193l60.12774,-21.38251l0,42.76601l-60.12774,-21.3835zm43.63767,105.34903l27.40281,-57.62877l30.23955,30.23996l-57.64236,27.38881zm105.36263,43.65096l-21.38351,-60.12753l42.76602,0l-21.38251,60.12753zm105.34804,-43.65096l-57.62778,-27.38881l30.23897,-30.23996l27.38881,57.62877zm-179.84834,-105.34903l0,0c0,-41.14515 33.35516,-74.5 74.50031,-74.5c41.14514,0 74.5,33.35485 74.5,74.5c0,41.14514 -33.35486,74.49998 -74.5,74.49998c-41.14514,0 -74.50031,-33.35484 -74.50031,-74.49998z", + "woman": "m150.04984,49.03255c13.33249,0 24.15346,-10.81348 24.15346,-24.15346c0,-13.34748 -10.82097,-24.16844 -24.15346,-24.16844c-13.34375,0 -24.16843,10.82096 -24.16843,24.16844c0,13.33998 10.82095,24.15346 24.16843,24.15346zm67.74049,104.1672l-21.67561,-80.39177c-0.20212,-0.72988 -0.48662,-1.42607 -0.83093,-2.06987c-2.46291,-7.53088 -9.53339,-12.9844 -17.88399,-12.9844h-54.86088c-8.70618,0 -16.01627,5.9214 -18.16845,13.95758c-0.14598,0.35184 -0.26575,0.7224 -0.37429,1.10417l-21.2901,80.38803c-1.41861,5.2701 1.71053,10.6862 6.98811,12.1048c5.27014,1.4111 10.68626,-1.71803 12.10487,-6.98813l16.71989,-63.14786h6.96569l-30.34438,114.25453h28.5927v78.87959c0,6.06738 4.91077,10.9819 10.98564,10.9819c6.05989,0 10.9819,-4.9108 10.9819,-10.9819v-78.87959h8.73613v78.87959c0,6.06738 4.91826,10.9819 10.99315,10.9819c6.05988,0 10.9819,-4.9108 10.9819,-10.9819v-78.87959h28.57767l-30.45665,-114.25453h7.14911l17.02679,63.14786c1.41859,5.2701 6.83472,8.39923 12.10481,6.98813c5.2589,-1.41859 8.38803,-6.83842 6.97693,-12.10854z" + } +} diff --git a/dist/extensions/shapelib/music.json b/dist/extensions/shapelib/music.json new file mode 100644 index 00000000..74e60d52 --- /dev/null +++ b/dist/extensions/shapelib/music.json @@ -0,0 +1,21 @@ +{"data": { + "clef_alto": "m51.25065,150.28749c0,-49.53207 0,-99.06413 0,-148.5962c11.59261,0 23.18523,0 34.77784,0c0,99.06413 0,198.12827 0,297.1924c-11.59261,0 -23.18522,0 -34.77784,0c0,-49.53209 0,-99.06413 0,-148.59621zm51.37634,0c0,-49.53207 0,-99.06413 0,-148.5962c8.48285,-2.46703 12.93837,1.84261 11.08508,10.0007c0.12527,45.40251 0.25053,90.80502 0.37581,136.20751c21.44767,-15.32626 29.57346,-41.86327 36.21976,-66.10667c3.81448,15.78812 9.88112,35.01518 27.29865,40.16045c16.60112,4.98381 31.30354,-10.63891 31.13045,-26.64445c2.89955,-20.45341 3.30077,-41.70258 -1.14742,-61.93042c-4.16455,-12.79745 -16.64639,-23.36595 -30.52771,-22.52039c-11.42384,-5.25948 -24.23628,10.96936 -9.59547,16.90924c12.31264,13.08186 -1.99968,35.47687 -19.11742,30.23324c-16.59583,-3.55596 -21.00951,-25.43777 -11.40723,-37.80838c13.77419,-17.97563 39.16574,-20.24264 60.03438,-17.62625c27.15413,3.08944 47.80745,27.56302 50.7352,54.02297c3.73869,23.61245 -2.35521,50.29027 -22.12251,65.37829c-16.57411,13.95533 -40.93645,15.69794 -60.41183,7.1722c-4.73631,7.1261 -9.47264,14.25217 -14.20895,21.37825c4.65338,6.95274 9.30673,13.90549 13.96008,20.8582c23.58311,-10.57065 54.40877,-5.07518 69.99907,16.43117c21.95821,28.96715 17.67499,75.52599 -10.84692,98.64314c-17.91376,14.62869 -43.09233,14.67899 -64.38158,8.83109c-16.11131,-4.2995 -31.82996,-19.966 -26.84735,-37.82117c2.51375,-15.55998 23.9128,-21.41389 34.33803,-9.83356c14.19543,12.82462 -6.37968,25.74036 -5.32516,38.10141c15.79561,11.97195 41.38054,0.70062 45.05746,-18.39487c5.84576,-20.96526 4.47285,-43.25116 1.61388,-64.56879c-1.53316,-14.33195 -14.00139,-28.78069 -29.45882,-24.78352c-16.25957,3.69221 -24.37509,20.62003 -27.1602,35.64745c-3.41434,11.00523 -4.50349,-10.5222 -7.16806,-14.04636c-5.53896,-17.66304 -15.20212,-35.01096 -30.07851,-46.1468c-1.53252,4.76282 -0.13866,10.70403 -0.62897,15.96893c-0.11874,43.15994 -0.2375,86.31984 -0.35623,129.47978c-8.48793,2.46848 -12.93407,-1.8443 -11.0575,-10.00076c0,-46.19846 0,-92.39696 0,-138.59544z", + "clef_bass": "m21.53929,297.24106c0.11552,-13.50244 21.89277,-17.95071 30.83244,-27.31851c34.50853,-23.15955 68.13189,-49.8976 89.28437,-86.39645c22.47179,-37.29227 34.65842,-82.97259 25.51732,-126.22972c-4.84746,-26.84145 -30.93637,-48.32386 -58.5412,-44.96438c-18.18078,2.48732 -39.18159,6.6724 -49.70108,23.45858c-11.41858,8.57642 -5.13639,28.67733 10.08619,21.04295c19.47556,-7.4344 43.93666,7.72539 43.16644,29.21231c0.02258,20.3737 -20.60109,34.74615 -39.82058,32.83379c-21.40677,-0.21405 -42.59771,-17.48695 -42.15028,-39.87929c-1.48358,-36.0903 29.74187,-65.56665 63.16554,-73.13066c29.88613,-9.31284 64.6309,-5.56545 89.8325,13.80772c18.75227,12.81883 33.51952,32.25211 36.60045,55.18989c6.65193,29.82199 -1.94455,60.59844 -16.85703,86.54317c-19.16537,34.9521 -48.44911,63.56561 -82.44233,84.09172c-31.5721,20.13449 -64.41224,38.31845 -98.38529,54.07944c-0.19582,-0.78018 -0.39163,-1.56039 -0.58745,-2.34058zm226.81013,-147.1503c-16.25441,-7.36092 -12.66826,-37.2715 6.2514,-37.94421c14.1568,-3.30239 27.38025,11.49424 23.01007,25.17739c-2.75677,12.80446 -18.12839,18.35408 -29.26147,12.76682zm0,-81.82211c-16.25441,-7.36089 -12.66826,-37.2715 6.2514,-37.9442c14.1568,-3.30238 27.38025,11.49425 23.01007,25.17739c-2.82837,12.84788 -18.04926,18.33069 -29.26147,12.76681z", + "clef_treble": "m142.57787,298.08936c-19.93291,-3.16858 -30.69543,-32.78793 -10.77837,-43.63799c20.76305,-10.6983 33.11169,27.38725 10.4319,31.10985c-12.41878,4.65247 16.12379,12.44363 21.44362,4.62054c16.62259,-8.04572 14.05481,-28.98639 10.0555,-43.73428c-1.38792,-11.29834 -3.1236,-23.3942 -17.37872,-16.97299c-34.39165,2.76706 -61.61951,-32.12309 -58.88461,-64.7627c0.92851,-30.78641 26.14601,-51.87253 44.81895,-73.25146c-6.13037,-27.96899 -7.98138,-60.28084 9.78998,-84.65368c16.36949,-19.81244 24.67825,16.44271 27.44722,28.74505c6.15059,28.7567 -6.11317,58.97542 -26.51985,79.24646c1.94853,9.61536 3.86572,19.23715 5.85146,28.84491c21.56471,-4.16351 42.14922,14.0585 43.32542,35.40215c3.33209,19.27364 -9.02991,37.47516 -25.91515,45.75842c-0.27765,16.55051 8.86742,33.71834 5.58147,50.80913c-3.15567,17.67035 -22.97263,26.33539 -39.26881,22.47659zm22.51283,-75.40413c6.10963,-11.46864 -4.97238,-31.72308 -5.58083,-46.4445c0.2393,-25.67101 -26.99069,4.97273 -18.89308,17.57916c2.40038,7.45953 23.23523,21.13914 4.09677,12.70238c-19.98106,-11.95877 -19.06588,-42.72807 -0.80893,-55.71979c15.31693,-3.39279 5.96193,-23.83228 3.07584,-30.54592c-18.81245,17.14481 -40.13555,38.73356 -36.89114,66.48257c2.4439,26.00902 30.79729,41.78694 55.00137,35.94611zm12.65782,-4.96449c17.94263,-11.51868 17.35378,-41.74863 -2.27676,-51.12454c-20.94589,-11.06784 -6.59929,17.92804 -6.2155,28.9649c2.90686,4.22505 1.26024,28.84393 8.49226,22.15964zm-22.11331,-138.56764c11.03699,-13.35171 23.65346,-32.62746 15.90224,-50.28019c-16.69221,-11.01859 -25.9682,18.77171 -26.37872,31.81623c-0.15186,8.45836 -1.39836,37.61288 10.47649,18.46396l0,0z", + "note_16th": "m88.44206,298.30295c-13.87988,-2.82538 -24.35809,-16.50861 -20.88289,-30.73529c4.91499,-19.9595 23.53616,-33.76636 42.17206,-40.32825c12.41348,-4.12247 26.50006,-3.4993 38.15588,2.63036c1.0408,-76.23686 0.44647,-152.49294 0.60452,-228.73842c4.20728,-0.00103 9.6062,-1.35928 8.46304,4.73352c0.58707,13.69153 7.31578,26.22541 17.65646,35.05743c23.06891,21.49232 49.01909,44.8303 54.31831,77.58647c1.50432,13.81924 -0.10796,27.74641 -3.17799,41.24139c9.09166,16.96843 8.54382,37.52667 4.8522,55.93042c-2.39383,9.71803 -6.29839,19.07953 -11.26178,27.74855c-11.71941,5.45538 1.38908,-8.91675 1.22467,-14.09427c6.33897,-15.55397 7.06616,-32.87975 4.18297,-49.26376c-6.28082,-23.96758 -30.02579,-35.67821 -49.12051,-48.20921c-6.90894,-2.70374 -21.67717,-19.0106 -18.74876,-3.03152c-0.64005,43.31421 -0.53076,86.63467 -0.73126,129.95221c-8.01517,20.08276 -26.40254,35.40967 -47.75954,39.25299c-6.54287,1.13068 -13.39496,1.54416 -19.94739,0.2674zm133.16364,-163.77284c0.19041,-24.65028 -18.17068,-44.59457 -36.16211,-59.2127c-9.00275,-6.78731 -18.53905,-13.97798 -28.66229,-18.37087c0.62265,14.17498 7.10901,27.98635 14.87303,39.75766c14.63148,19.60416 36.7207,32.71725 48.97745,54.30224c1.46973,-5.35919 1.02641,-10.98389 0.97392,-16.47633z", + "note_2_16th": "m49.3958,299.54056c-16.81947,-3.04166 -22.61933,-24.29047 -12.59162,-37.02081c13.30804,-19.68834 41.77522,-32.96074 64.07959,-20.53789c0.44453,-69.33055 0.18797,-138.66488 0.25596,-207.99711c55.61466,-11.21983 111.34956,-21.8626 166.98527,-32.98482c-0.12048,77.7042 -0.24097,155.40843 -0.36145,233.1126c-8.71588,23.50243 -36.87907,39.79991 -61.40202,32.51219c-14.59976,-4.3703 -18.09988,-23.21532 -9.97012,-34.76195c11.13289,-17.22395 31.85399,-29.0497 52.68539,-25.82347c5.94469,-0.60136 14.69865,9.02304 12.18605,-1.86462c0,-54.46642 0,-108.93282 0,-163.39921c-51.0519,10.27703 -102.20471,20.06591 -153.28023,30.23172c-0.17435,63.38239 0.43399,126.77441 -0.45506,190.14903c-1.62524,19.24988 -20.10281,32.38318 -37.35132,37.51443c-6.81397,1.14908 -13.90893,1.86209 -20.78043,0.8699zm133.17406,-258.40903c26.23065,-5.16204 52.47366,-10.26209 78.69298,-15.48133c3.33676,-13.29303 -11.59628,-4.66015 -18.89926,-4.33564c-44.78732,8.84114 -89.60051,17.55139 -134.38097,26.42687c-3.33676,13.29303 11.59627,4.66015 18.89925,4.33564c18.56081,-3.65804 37.12405,-7.30357 55.688,-10.94555z", + "note_2_32nd": "m49.39585,299.53995c-16.81947,-3.04169 -22.61932,-24.29047 -12.59161,-37.02081c13.30804,-19.68835 41.77521,-32.96077 64.07959,-20.53792c0.44453,-69.33055 0.18797,-138.66488 0.25596,-207.9971c55.61465,-11.21984 111.34956,-21.86261 166.98528,-32.98483c-0.12048,77.70421 -0.24097,155.40842 -0.36145,233.11262c-8.71591,23.50241 -36.8791,39.7999 -61.40204,32.51218c-14.59978,-4.3703 -18.09987,-23.21533 -9.97015,-34.76193c11.13292,-17.22395 31.854,-29.0497 52.68541,-25.82347c5.9447,-0.60136 14.69868,9.02304 12.18605,-1.86462c0,-46.71117 0,-93.42232 0,-140.13348c-51.05188,10.27702 -102.20473,20.0659 -153.28023,30.23172c-0.22871,56.35212 0.56696,112.72466 -0.58765,169.06043c-3.51923,18.91183 -22.11423,32.00891 -40.05743,35.8262c-5.92716,0.70624 -12.00983,1.31848 -17.94172,0.38101zm133.17405,-235.14331c26.23065,-5.16204 52.47366,-10.26208 78.69298,-15.48132c3.33676,-13.29303 -11.59628,-4.66015 -18.89923,-4.33564c-44.78734,8.84113 -89.60054,17.55138 -134.381,26.42687c-3.33677,13.29303 11.59627,4.66015 18.89925,4.33564c18.56078,-3.65805 37.12405,-7.30357 55.688,-10.94555zm0,-23.26575c26.23065,-5.16204 52.47366,-10.26209 78.69298,-15.48133c3.33676,-13.29302 -11.59628,-4.66015 -18.89923,-4.33563c-44.78734,8.84113 -89.60054,17.55139 -134.381,26.42687c-3.33677,13.29303 11.59627,4.66016 18.89925,4.33564c18.56078,-3.65804 37.12405,-7.30358 55.688,-10.94555z", + "note_2_64th": "m49.39639,299.53995c-16.81947,-3.04169 -22.61932,-24.29047 -12.59161,-37.02081c13.30804,-19.68835 41.77522,-32.9608 64.07959,-20.53792c0.44453,-69.33055 0.18797,-138.66488 0.25596,-207.99711c55.61465,-11.21983 111.34957,-21.86261 166.98528,-32.98482c-0.12048,77.70421 -0.24097,155.40842 -0.36145,233.11262c-8.71591,23.50241 -36.8791,39.7999 -61.40205,32.51218c-14.59976,-4.3703 -18.09987,-23.21533 -9.97012,-34.76193c11.1329,-17.22395 31.85399,-29.0497 52.68539,-25.8235c5.94467,-0.60133 14.69868,9.02307 12.18605,-1.86459c0,-38.95592 0,-77.91182 0,-116.86773c-51.0519,10.27703 -102.20474,20.06591 -153.28024,30.23172c-0.23563,48.66071 0.58183,97.34513 -0.58977,145.98728c-3.69252,18.80173 -22.14742,31.83179 -40.05531,35.63361c-5.92716,0.70627 -12.00984,1.31848 -17.94173,0.38101zm133.17406,-211.87756c26.23067,-5.16204 52.47368,-10.26209 78.69298,-15.48133c3.33676,-13.29303 -11.59627,-4.66015 -18.89925,-4.33564c-44.78732,8.84113 -89.60051,17.55138 -134.38099,26.42688c-3.33676,13.29302 11.59627,4.66015 18.89925,4.33562c18.56079,-3.65804 37.12405,-7.30356 55.688,-10.94553zm0,-23.26575c26.23067,-5.16204 52.47368,-10.26208 78.69298,-15.48132c3.33676,-13.29303 -11.59627,-4.66015 -18.89925,-4.33564c-44.78732,8.84113 -89.60051,17.55138 -134.38099,26.42687c-3.33676,13.29303 11.59627,4.66015 18.89925,4.33564c18.56079,-3.65805 37.12405,-7.30357 55.688,-10.94555zm0,-23.26575c26.23067,-5.16204 52.47368,-10.26209 78.69298,-15.48133c3.33676,-13.29302 -11.59627,-4.66015 -18.89925,-4.33563c-44.78732,8.84113 -89.60051,17.55139 -134.38099,26.42687c-3.33676,13.29303 11.59627,4.66016 18.89925,4.33564c18.56079,-3.65804 37.12405,-7.30357 55.688,-10.94554z", + "note_2_8th": "m49.39571,299.54196c-16.81947,-3.04169 -22.61933,-24.29047 -12.59162,-37.02081c13.30804,-19.68834 41.77522,-32.96077 64.07959,-20.53792c0.44447,-69.55862 0.18803,-139.12106 0.25597,-208.68139c55.61337,-11.00192 111.35248,-21.38966 166.98529,-32.30051c-0.12051,77.70421 -0.24097,155.40842 -0.36145,233.11263c-8.71594,23.50241 -36.8791,39.7999 -61.40207,32.51218c-14.59976,-4.3703 -18.09987,-23.21533 -9.97012,-34.76193c11.1329,-17.22395 31.854,-29.0497 52.68538,-25.82347c5.9447,-0.60136 14.69872,9.02304 12.18608,-1.86462c-0.20636,-61.46065 0.51324,-122.93768 -0.53098,-184.38539c-9.07608,-3.36956 -25.21706,4.38308 -36.83795,5.01031c-38.86079,7.56314 -77.80466,14.7255 -116.5762,22.73074c1.16985,68.10055 0.62434,136.24279 0.45018,204.35774c2.05843,15.54877 -6.51154,30.19547 -19.54225,38.30072c-11.24453,8.17932 -25.1371,11.12784 -38.82984,9.35175z", + "note_3_16th": "m15.05685,274.22351c-14.31707,-1.91919 -18.42601,-20.36026 -8.93697,-29.99135c10.38879,-13.67648 30.27091,-22.30884 46.50806,-13.88651c0.66153,-52.11798 0.28726,-104.24728 0.38611,-156.37085c81.97754,-16.40272 164.06679,-32.26359 246.07988,-48.4937c-0.2363,57.62228 0.57657,115.26416 -0.57095,172.87157c-1.96915,14.86053 -17.13602,24.73001 -30.79037,27.8163c-11.96523,3.66803 -28.81345,-4.27913 -25.97942,-18.60889c3.50381,-15.4984 19.49126,-26.6657 34.85991,-28.02376c8.59586,-2.14986 20.61923,9.25734 16.69226,-5.91415c0.09525,-39.33675 -0.07153,-78.67297 -0.13177,-118.00977c-38.18202,7.50178 -76.35632,15.04294 -114.54555,22.50813c-0.23268,48.18274 0.55394,96.38557 -0.57504,144.55286c-2.30531,15.49788 -18.60167,25.74417 -33.19453,27.71848c-14.44766,3.90948 -29.61349,-11.1328 -21.45115,-25.13463c9.01589,-16.79831 32.00478,-28.23689 49.88007,-18.48071c0.13591,-41.88866 0.57454,-83.7979 -0.20747,-125.67833c-9.66763,-2.10095 -24.53024,4.47319 -35.97192,5.4189c-26.23273,5.15636 -52.45877,10.34411 -78.68841,15.51694c-0.35831,49.24326 0.12716,98.5107 -1.08934,147.73389c-6.17624,16.23714 -25.20985,26.82423 -42.27338,24.45558l0,0zm101.53641,-195.02805c18.87659,-3.72421 37.75267,-7.44825 56.62927,-11.17233c3.17946,-13.298 -14.34059,-1.80056 -21.35852,-2.54169c-31.16307,6.26984 -62.32049,12.56754 -93.49695,18.76997c-1.80596,13.61728 18.79422,-0.36912 26.46645,1.18459c10.58865,-2.07109 21.17471,-4.15247 31.75974,-6.24054zm119.43625,-23.77348c18.94301,-3.80857 37.98227,-7.27608 56.8645,-11.31118c2.82892,-13.23786 -18.20215,0.42724 -25.56601,-1.09475c-29.37257,5.74051 -58.85892,11.05022 -88.16765,17.02801c-3.13623,14.00632 18.26294,0.04643 25.92744,1.45249c10.31323,-2.02774 20.62746,-4.05219 30.94171,-6.07457z", + "note_3_32th": "m15.05685,274.22333c-14.31707,-1.91882 -18.42601,-20.36018 -8.93697,-29.99106c10.3888,-13.67676 30.27089,-22.30908 46.50806,-13.88647c0.66166,-52.11824 0.28732,-104.24765 0.38611,-156.37099c81.97754,-16.40273 164.06694,-32.2636 246.07988,-48.4937c-0.2363,57.6225 0.57663,115.26395 -0.57123,172.87143c-1.96881,14.86089 -17.13586,24.73018 -30.79025,27.81644c-11.96498,3.66806 -28.81322,-4.27921 -25.97935,-18.60878c3.50368,-15.49834 19.49123,-26.6657 34.86018,-28.02408c8.67697,-2.20874 20.51364,9.40097 16.68222,-5.83759c-0.09845,-33.39989 0.78769,-66.86396 -0.50803,-100.22556c-37.99194,7.33447 -75.93604,14.91556 -113.90202,22.38341c-0.40428,43.27432 0.22905,86.58281 -1.10269,129.83c-6.66052,18.05263 -29.74564,30.16772 -47.98743,22.50237c-14.38366,-7.43967 -7.95995,-27.06667 2.9687,-34.4792c10.34322,-10.82147 29.63336,-12.35156 40.562,-8.05225c0.25528,-36.18434 0.11931,-72.37016 0.15388,-108.55522c-38.40674,7.73776 -76.89246,15.09384 -115.31775,22.74432c-0.2578,42.95952 0.63174,85.96188 -0.70086,128.88727c-5.20541,16.91916 -25.24538,27.88303 -42.40446,25.48965zm99.21976,-176.85336c19.73389,-3.88507 39.47778,-7.71994 59.20331,-11.64712c1.63908,-13.07382 -17.1093,-0.27914 -24.42491,-1.54683c-30.21908,5.91451 -60.4242,11.89998 -90.63543,17.85444c-2.77443,12.63378 14.55762,1.2752 21.41661,2.10594c11.47932,-2.25961 22.95964,-4.51424 34.44042,-6.76643zm2.31665,-18.17461c18.87643,-3.72409 37.75285,-7.44817 56.62927,-11.17224c3.17953,-13.298 -14.34081,-1.80056 -21.35843,-2.5417c-31.16306,6.26989 -62.32067,12.56752 -93.49722,18.77c-1.80564,13.61723 18.7942,-0.36929 26.46687,1.1845c10.58833,-2.07081 21.17455,-4.15248 31.7595,-6.24056zm119.82236,-6.10279c19.00511,-3.73167 38.01025,-7.46333 57.01538,-11.195c2.25488,-12.51775 -14.43167,-1.31337 -21.22391,-2.14778c-31.1899,6.14801 -62.39635,12.21269 -93.57906,18.3969c-0.48149,12.89743 19.70058,-0.51178 28.22481,0.73691c9.85522,-1.92534 19.70935,-3.85638 29.56277,-5.79102zm-0.38611,-17.67059c18.94318,-3.80859 37.98227,-7.27608 56.86438,-11.31118c2.82913,-13.23785 -18.20197,0.42724 -25.56577,-1.09474c-29.37247,5.74053 -58.85913,11.0502 -88.1676,17.028c-3.13618,14.00631 18.26254,0.04646 25.92732,1.45247c10.31334,-2.02773 20.6273,-4.05214 30.94167,-6.07454z", + "note_3_64th": "m15.05833,274.22296c-14.317,-1.9187 -18.42625,-20.3604 -8.93719,-29.99104c10.38896,-13.67708 30.27131,-22.30949 46.50857,-13.88661c0.66169,-52.1188 0.28732,-104.24842 0.38611,-156.37186c81.97786,-16.40303 164.06815,-32.26401 246.08122,-48.49419c-0.23633,57.62288 0.57712,115.26462 -0.57092,172.87238c-1.96869,14.86116 -17.13614,24.73065 -30.79056,27.81697c-11.96483,3.66806 -28.81317,-4.27963 -25.97963,-18.60901c3.50381,-15.49847 19.49141,-26.66583 34.8607,-28.02443c7.61099,-2.92159 20.18073,9.65431 16.68201,-4.30438c0.21829,-27.96678 0.10867,-55.9346 0.13544,-83.90191c-38.27235,7.48128 -76.53494,15.0156 -114.80267,22.52314c-0.22958,36.48441 0.55602,72.99504 -0.58997,109.45938c-3.18001,15.89902 -20.29759,26.40845 -35.74976,27.23267c-14.89929,2.89737 -27.08599,-14.42255 -17.93506,-27.04372c9.64191,-15.67046 31.65898,-26.22467 48.93309,-16.72427c0.33206,-30.58104 0.14311,-61.16617 0.19254,-91.74873c-38.39642,7.82673 -76.92161,15.04803 -115.31823,22.87476c-0.25736,36.94054 0.62957,73.92738 -0.70087,110.83084c-5.2055,16.9194 -25.24553,27.88339 -42.40482,25.49002l0,0zm101.38524,-159.31403c18.83891,-3.75145 37.70946,-7.35722 56.50069,-11.3393c2.95145,-13.53962 -17.91554,0.08701 -25.35307,-1.30814c-29.80621,5.87558 -59.6283,11.67136 -89.42722,17.5835c-2.26596,13.04952 15.28052,1.23864 22.46973,2.11949c11.93564,-2.35683 23.87244,-4.70798 35.80987,-7.05554zm-2.1648,-17.54025c19.73418,-3.88531 39.47784,-7.72015 59.20348,-11.64717c1.63916,-13.07402 -17.10936,-0.27902 -24.42487,-1.54701c-30.21927,5.9147 -60.42458,11.89994 -90.63596,17.8548c-2.77449,12.63354 14.55767,1.27519 21.41672,2.10558c11.47937,-2.25951 22.95979,-4.51389 34.44062,-6.7662zm123.16869,-6.50159c18.66148,-3.66445 37.32301,-7.3289 55.98506,-10.99284c1.75296,-13.03485 -16.50751,-0.89732 -23.95999,-1.87753c-30.19955,5.92758 -60.38982,11.90097 -90.58421,17.8548c-3.55789,11.04535 8.5943,3.94657 14.87352,3.58826c14.56204,-2.85567 29.12408,-5.71393 43.68562,-8.57269zm-120.85203,-11.67342c18.8765,-3.72417 37.75323,-7.44803 56.62942,-11.17215c3.18001,-13.29807 -14.34068,-1.80056 -21.35812,-2.54169c-31.16348,6.26993 -62.3213,12.56734 -93.49802,18.77035c-1.80566,13.61685 18.79432,-0.36964 26.46704,1.18407c10.58839,-2.07059 21.17467,-4.1525 31.75968,-6.24059zm119.82291,-6.10266c19.0054,-3.73169 38.01082,-7.46337 57.01573,-11.19506c2.25491,-12.51782 -14.4313,-1.3134 -21.22379,-2.14781c-31.19003,6.14807 -62.39655,12.21279 -93.5799,18.39685c-0.48135,12.89765 19.70091,-0.51173 28.22522,0.73721c9.8551,-1.92541 19.70967,-3.85648 29.56273,-5.7912zm-0.38611,-17.67071c18.94363,-3.8086 37.9825,-7.27608 56.86485,-11.31125c2.82944,-13.23789 -18.20175,0.42725 -25.56567,-1.09475c-29.37276,5.7406 -58.85979,11.05029 -88.16818,17.02811c-3.13626,14.0062 18.26253,0.04649 25.9276,1.4525c10.31329,-2.02775 20.62709,-4.05215 30.94141,-6.07461z", + "note_3_8th": "m15.02169,274.2272c-14.31707,-1.91879 -18.42601,-20.36015 -8.93697,-29.99103c10.3888,-13.67676 30.27088,-22.3091 46.50806,-13.88649c0.66166,-52.11824 0.28732,-104.24764 0.38611,-156.37097c81.97754,-16.40273 164.06694,-32.2636 246.07985,-48.4937c-0.2363,57.6225 0.57663,115.26395 -0.5712,172.87141c-1.96884,14.86089 -17.13589,24.73018 -30.79025,27.81644c-11.965,3.66806 -28.81323,-4.27919 -25.97937,-18.60878c3.50368,-15.49834 19.49124,-26.66568 34.8602,-28.02408c8.2316,-2.53128 20.41348,9.51646 16.65692,-5.23953c-0.07721,-45.31436 0.85016,-90.69309 -0.45593,-135.96806c-37.90379,6.83744 -76.18053,14.4211 -114.18623,21.74638c-0.22679,54.0925 0.53969,108.20272 -0.57019,162.28107c-1.77496,14.91302 -17.02997,24.75598 -30.69292,27.71687c-13.90182,4.60379 -31.50981,-7.66069 -24.80507,-22.93971c8.1866,-17.99985 32.25569,-30.36769 50.72748,-20.3566c0.32813,-48.569 0.14423,-97.14091 0.19258,-145.71125c-38.34256,7.86306 -76.73341,15.50194 -115.11303,23.18613c-0.70871,54.82025 0.60002,109.69145 -0.90556,164.48224c-5.27564,16.97054 -25.17379,27.85027 -42.40448,25.48964z", + "note_32nd": "m96.7115,298.78342c-12.19044,-1.97687 -21.5796,-13.65018 -18.87752,-26.14322c3.19898,-16.4884 18.16196,-28.11014 32.8273,-34.56326c11.8622,-4.83313 26.35187,-5.63437 37.63535,1.13913c0.44954,-79.35593 0.19681,-158.71518 0.26346,-238.07262c3.98198,-0.1698 8.54333,-0.99947 7.45644,4.60387c0.32353,13.2127 8.16176,24.35488 17.90031,32.62089c20.68701,19.0793 43.62003,41.1507 45.44289,71.03391c1.94933,11.70761 -4.32771,23.23071 -1.67,34.59584c2.53688,11.20206 1.78056,22.8308 0.17831,34.09036c7.53368,20.20854 5.71452,43.47615 -2.49284,63.20886c0.75815,6.16689 -13.8391,16.22797 -7.44476,5.95023c8.63434,-18.74539 13.17647,-41.8004 3.81317,-61.08943c-11.33986,-18.69514 -31.97612,-28.28085 -48.89772,-41.04474c-11.778,-11.86667 -5.42902,11.18993 -7.18364,18.06325c-0.26184,33.71661 -0.28255,67.43445 -0.41075,101.15173c-5.27325,12.84436 -14.94577,23.71875 -27.82796,29.29456c-9.44402,4.40988 -20.29373,7.32529 -30.71203,5.16064zm114.86545,-145.34879c-7.29857,-26.18551 -30.51866,-43.93251 -53.18727,-56.72259c-6.20538,-0.86809 1.83978,14.15399 3.5831,18.80585c8.11926,15.92772 24.10783,25.32948 35.63724,38.48439c5.02966,4.16844 10.75517,12.77017 14.6803,15.07132c0.57034,-5.18866 0.22502,-10.51091 -0.71336,-15.63898zm0.91826,-35.72012c-0.11551,-22.00919 -16.64085,-39.55235 -32.65781,-52.65142c-7.46819,-4.94457 -16.49954,-13.27054 -24.16978,-14.26883c1.45969,12.25124 6.9503,24.24821 17.03656,31.76259c14.34996,13.93145 29.52126,27.82796 39.47783,45.32379c1.14618,-3.04146 0.13112,-6.92123 0.3132,-10.16613z", + "note_4th": "m126.58881,297.40149c-11.87886,-2.65546 -23.26585,-13.54025 -21.01448,-26.56512c0.1731,-16.24911 13.85612,-27.71617 25.94878,-36.50977c15.62231,-10.78831 37.15717,-14.20154 54.34061,-5.04248c1.02979,-75.90828 0.44815,-151.83525 0.60191,-227.75206c3.00182,0.70564 9.53603,-2.12083 8.02534,3.09698c-0.14726,78.93155 0.33716,157.8673 -0.38513,236.79541c-0.07584,10.70851 -0.22026,22.31233 -7.75522,30.804c-13.91748,17.52454 -37.15509,29.1525 -59.76181,25.17303z", + "note_64th": "m104.92412,299.31976c-12.00094,-1.27536 -20.94641,-13.79388 -17.06551,-25.49271c6.43043,-17.60776 24.98182,-29.7767 43.42287,-30.74879c7.6006,-2.50558 20.88075,10.01114 17.93382,-3.27145c0.48503,-79.47305 0.24155,-158.94821 0.30153,-238.42232c5.75809,-1.70799 6.23006,2.55972 6.32732,7.33913c1.78415,17.85563 19.14293,26.89136 29.82072,39.25721c15.39714,15.12255 27.5349,36.04512 24.51741,58.34038c-3.08612,10.64033 -0.83701,20.84729 0.30066,31.5748c0.06851,11.58006 -4.18433,22.62605 -0.40593,34.00638c1.68036,11.01886 -3.23894,22.12428 2.03442,32.51251c2.40002,18.25101 0.69795,38.47595 -10.52008,53.59502c-7.11406,1.93207 2.97337,-8.35378 2.33067,-11.88858c6.3118,-18.25085 7.27405,-41.79056 -8.5262,-55.64728c-12.36734,-10.82431 -26.50575,-19.43405 -39.98901,-28.77931c-0.71652,35.81755 -0.4848,71.65158 -0.68907,107.47679c-5.08496,13.03387 -16.00215,23.09641 -29.22493,27.57315c-6.53331,2.3526 -13.63996,3.72845 -20.5687,2.57507zm98.72386,-126.48091c-6.34319,-22.74789 -26.51086,-38.16362 -46.20412,-49.27464c-5.25957,0.57732 2.32552,14.64314 4.87614,19.57021c8.86444,13.06609 22.37558,21.98311 32.7415,33.78232c3.44377,1.45969 10.43367,15.90742 9.37975,5.93784c0.13239,-3.35165 -0.09975,-6.73082 -0.79327,-10.01572zm0.7843,-31.02991c0.01227,-19.15482 -14.53879,-34.37045 -28.41721,-45.78492c-6.00691,-3.41928 -16.78343,-14.40513 -20.81033,-10.93629c1.48004,11.20951 7.52783,21.1048 16.47551,27.9065c11.85971,11.75211 24.67769,23.13779 32.59132,38.04211c0.77432,-2.77734 0.04828,-6.25352 0.16071,-9.2274zm0.01279,-39.15976c-0.40309,-21.71703 -17.74644,-38.41104 -34.56728,-49.83583c-4.69977,-2.50358 -18.46306,-14.73891 -13.78862,-1.7836c3.12802,17.13914 19.8609,25.3779 30.46255,37.43516c7.16287,5.47251 13.39691,18.87303 18.00247,22.03555c0.14136,-2.61625 -0.03749,-5.23595 -0.10913,-7.85128z", + "note_8th": "m92.11929,299.44888c-12.88673,-2.17523 -24.85642,-14.0065 -22.42534,-27.8176c1.23042,-15.16177 13.28207,-27.36446 25.40788,-35.40434c16.13786,-10.9864 38.20284,-15.06764 55.98708,-5.59207c1.04205,-76.42476 0.44817,-152.86866 0.60602,-229.30206c11.21484,-2.71548 7.58873,11.96767 10.1358,18.75797c2.43044,19.96716 15.82285,35.63469 29.15343,49.62502c16.53877,17.58521 34.10059,36.23084 39.47629,60.59399c5.87012,28.26657 -3.51422,57.18356 -15.69261,82.51581c-0.88187,8.11874 -15.77403,19.86469 -8.67888,5.1937c11.94699,-25.09727 21.81674,-54.00095 13.66216,-81.79225c-7.76553,-27.73048 -31.97011,-50.88958 -60.78398,-55.04219c-0.18622,58.55498 0.45346,117.12103 -0.68288,175.66663c-2.83272,17.24548 -17.81155,30.04147 -32.83268,37.34811c-10.35778,4.50974 -22.04797,7.23831 -33.33228,5.2493z", + "note_half": "m126.15042,298.46863c-16.82465,-2.00256 -23.94094,-21.72537 -20.50175,-36.48892c5.91676,-23.32147 29.06407,-39.43811 52.28738,-42.05833c8.81128,-0.72736 18.52644,-0.60411 25.78337,4.94891c5.95566,-2.36537 1.76544,-11.69408 2.85246,-17.2854c0,-68.81003 0,-137.6201 0,-206.43012c14.97716,-2.18183 5.30603,19.02521 7.94768,27.71113c-0.09924,75.95386 0.62134,151.91534 -0.76007,227.86198c-7.30341,28.38443 -39.39244,46.36703 -67.60907,41.74075zm2.8452,-12.40747c22.98492,-7.3089 44.37535,-22.56259 55.31068,-44.49013c0.95541,-13.55527 -16.00528,-10.73553 -23.6718,-6.15868c-13.5024,6.76553 -26.21068,15.65268 -36.74068,26.51123c-6.99238,6.4256 -15.89267,26.17618 0.78696,25.05563l2.30408,-0.3252l2.01074,-0.59286l0,0z", + "note_whole": "m130.51953,195.65829c-18.47874,-2.9818 -38.13104,-9.41365 -49.81914,-24.96915c-4.87284,-6.5025 -6.85786,-14.78229 -6.23731,-22.81049c-0.81288,-10.41815 5.23877,-19.78279 13.11027,-26.04227c15.71593,-12.69998 36.4436,-17.12403 56.18739,-18.21444c21.01479,-0.84168 42.85126,2.6237 61.20964,13.32044c11.19275,6.86285 21.10484,18.66567 20.54733,32.45548c0.612,8.09668 -0.91914,16.68852 -6.59294,22.84065c-11.24144,13.63681 -28.92738,19.59387 -45.72455,22.87505c-14.06622,2.54445 -28.55254,2.69426 -42.68069,0.54472zm34.33258,-7.95905c9.06644,-1.9348 15.01314,-11.03741 14.88672,-20.03276c1.54852,-18.89767 -4.73529,-39.56404 -20.09192,-51.52234c-8.61502,-6.06224 -20.8895,-6.65757 -30.00668,-1.42353c-6.79661,4.10276 -9.33514,12.23845 -9.31819,19.7824c-0.73656,16.04378 3.97748,32.8201 14.66045,45.0217c7.49542,7.87076 19.3475,12.08484 29.86963,8.17453z" + } +} diff --git a/dist/extensions/shapelib/object.json b/dist/extensions/shapelib/object.json new file mode 100644 index 00000000..4a276dac --- /dev/null +++ b/dist/extensions/shapelib/object.json @@ -0,0 +1,18 @@ +{"data": { + "ball": "m1.36762,144.54343c-0.61252,-24.33647 11.43968,-48.24649 31.71385,-61.85355c33.0555,-25.12355 76.68359,-36.57172 117.69406,-29.65477c20.30775,-3.13354 29.29549,17.94864 22.15137,34.18353c-11.04268,10.79923 -30.25032,0.52836 -44.5518,6.11385c-46.3661,5.97041 -92.1348,26.12911 -123.47163,61.54787c-0.19116,-3.78908 -5.04203,-6.31387 -3.53584,-10.33693zm0.56006,21.59657c2.46893,-17.16783 19.59014,-26.10648 31.49495,-36.53964c40.07716,-28.36518 90.31613,-39.61352 138.89854,-37.70576c1.20387,19.56051 -8.00084,38.23036 -19.07559,53.7263c-15.20721,8.47826 -34.11861,-1.17561 -50.23914,6.54221c-28.27367,6.8441 -59.74523,15.46761 -77.84163,40.11734c-6.57559,19.79451 -20.47401,-0.35286 -21.54921,-12.00313c-1.52846,-4.62877 -1.3158,-9.384 -1.6879,-14.13731zm7.76269,-58.70418c2.42006,-21.53997 16.61662,-39.35048 29.64042,-55.76294c14.68114,-17.49181 34.66698,-30.31521 57.12629,-35.01287c17.80165,-4.64955 36.14864,-6.58389 54.39959,-8.53692c13.84103,10.63111 22.64574,29.11792 20.32661,46.60463c-10.75017,2.72292 -29.7578,-6.48294 -44.25362,-4.23798c-41.11142,0.38721 -83.13954,16.86419 -110.9226,47.60359c-2.31326,2.96635 -4.3931,6.11006 -6.31669,9.34248zm-2.20363,84.97105c15.37329,12.3277 15.8773,33.69405 25.32488,49.77684c-11.32475,-14.57886 -21.29314,-31.61081 -25.32488,-49.77684zm12.17333,11.7446c4.82258,-13.28815 19.94093,-31.96367 32.55468,-30.57486c5.04242,12.98813 7.22698,27.06129 15.42273,38.77007c22.00548,40.39473 62.27551,75.33984 110.15025,76.43997c7.82913,1.58691 28.58411,-3.6853 27.74063,-1.50394c-20.00963,9.82742 -43.17618,11.98239 -65.22374,11.19174c-40.94611,-2.71915 -81.7309,-22.38535 -106.34646,-55.65858c-6.96676,-11.95032 -10.92698,-25.33659 -14.29809,-38.66251zm33.70255,-33.88084c11.04849,-5.13829 31.74819,-20.7682 40.05036,-8.17067c20.26116,39.90601 54.51507,73.83781 96.68548,89.7942c21.8947,7.30453 46.52556,7.18939 67.87685,-1.92662c-8.90472,13.82597 -23.64018,22.69292 -37.52655,30.83714c-35.49046,15.14874 -78.39111,6.93469 -108.29421,-16.68286c-28.94243,-22.9118 -51.66176,-55.70389 -58.71476,-92.285l-0.04169,-0.84726l-0.03548,-0.71893l0,0l0,0zm14.80587,-143.69432c26.85995,-18.47492 60.14433,-27.13922 92.60995,-24.83766c-16.61871,10.60714 -37.47179,6.57748 -55.695,12.32051c-12.71339,2.76803 -25.33243,6.4903 -36.91495,12.51714zm23.19239,130.17215c17.68391,-8.37067 37.80864,-8.2348 56.92004,-7.08942c11.52194,17.94525 19.73788,38.80402 37.6284,51.74121c20.84937,18.617 51.18832,23.87227 77.45898,15.12419c9.02167,-6.09496 19.03778,-2.20023 14.1109,9.88971c-5.93085,20.07378 -26.98962,28.88977 -46.28781,29.86346c-39.48146,3.94382 -75.60028,-18.48682 -102.27098,-45.57831c-15.55914,-15.57706 -28.70033,-33.74123 -37.55954,-53.95085zm59.9713,-149.25921c14.39017,-11.41684 33.98842,-1.08634 48.71259,4.37706c14.6449,12.52997 16.60739,33.37817 20.47758,51.17717c6.47049,41.78263 3.85324,86.6684 -15.69031,124.8082c-4.67027,13.36929 -18.09242,20.61154 -26.69522,6.15724c-9.99724,-11.02568 -17.64142,-23.85532 -24.85538,-36.77173c-4.26648,-12.35977 9.69913,-21.07201 12.62395,-32.37317c5.6987,-11.2672 7.1479,-23.94022 7.7876,-36.27168c2.68518,-18.44756 0.04341,-37.58501 -4.80806,-55.44724c-3.40224,-9.88385 -8.92734,-19.45691 -17.55275,-25.65586zm41.36089,197.33399c28.32747,-32.0033 32.81847,-77.44762 30.6862,-118.36129c-1.29825,-24.12249 -4.96657,-49.05092 -17.68674,-70.0582c13.14473,0.40704 27.28206,12.75397 37.58124,21.8466c29.18982,37.11403 37.77368,91.40852 15.58273,134.05255c-8.72922,17.24329 -20.55305,32.80717 -34.43375,46.22929c-11.62009,-0.9548 -23.39864,-5.3515 -31.72969,-13.70895zm32.30334,13.89389c30.50691,-29.40305 52.59978,-71.66214 46.00664,-114.99303c-2.62479,-20.29454 -10.03497,-39.89902 -21.13239,-57.06778c20.32477,12.66527 31.62595,35.09759 41.79111,55.93748c14.61285,36.42265 6.66864,80.8159 -19.44537,109.92648c-13.41086,7.60643 -32.33356,8.77071 -47.21999,6.19685zm50.22404,-6.80072c10.46527,-18.28113 22.34006,-36.81323 23.43076,-58.50224c1.62656,-7.25171 -0.89633,14.22787 -1.77191,18.74721c-2.78329,15.96013 -6.41766,32.99399 -16.3092,46.01608c-2.27573,-1.26239 -1.2605,-7.4102 -5.34964,-6.26105z", + "bolt": "m178.14388,74.00616l-108.49727,68.79685l107.15599,23.63498l-99.04335,73.85934l-39.98779,-12.47227l28.36194,71.19228l112.7131,-31.06076l-47.58928,-12.98325l129.22581,-106.08589l-118.12698,-19.22734l114.07071,-71.6874l-65.0681,-10.76349l70.86891,-45.56109l-26.03423,-0.65478l-109.97452,62.50492l51.92505,10.50792z", + "bulb": "m148.28435,1.01645c-19.71313,-0.08707 -41.0383,4.93402 -53.87904,21.08005c-10.00002,11.90277 -20.52196,24.53872 -22.82235,40.47736c-5.18059,28.1529 -4.92928,57.93743 3.64143,85.4047c4.96631,13.63997 16.45209,23.50325 23.37698,36.11604c9.14968,13.20706 13.47519,29.26166 12.26267,45.27029c24.17088,0 48.34173,0 72.5126,0c0.07924,-23.9402 14.94635,-43.62665 28.19687,-62.22926c9.25131,-10.94521 15.23657,-24.20433 17.34691,-38.38177c4.07767,-25.40971 5.00331,-52.60092 -4.43568,-76.9665c-8.96201,-18.6421 -19.94247,-39.09958 -40.93047,-46.16479c-11.25407,-4.11034 -23.39734,-4.80265 -35.26991,-4.60611zm-36.97603,226.70836c24.34058,0 48.68115,0 73.0217,0c-4.36798,8.93942 -9.9079,18.74007 -6.84158,28.88942c-4.05983,8.82452 1.13719,17.61151 -5.54364,25.68655c-2.46005,11.06699 -16.46573,11.92905 -25.84717,12.23193c-10.13806,1.12546 -21.40701,-1.68927 -25.2739,-12.25085c-8.04343,-5.6481 1.65114,-12.52795 -4.58124,-18.87732c7.18661,-7.80208 -5.34555,-11.88156 -0.88777,-20.35059c-1.22452,-5.78517 -5.73284,-8.48584 -4.0464,-15.32915zm-0.15865,0.0249c24.34056,0 48.68114,0 73.02171,0c-1.83408,8.68544 -9.76653,16.89687 -6.75067,25.63821c1.71628,7.25716 -5.42461,13.19765 -1.14021,20.86113c-3.26378,9.1944 -9.79655,19.57855 -20.90657,19.54898c-10.7323,0.01825 -25.30243,3.58121 -31.95258,-7.11847c-2.51509,-6.44772 -10.6368,-10.31369 -4.40095,-17.31061c-7.73209,-5.79929 5.18552,-14.38748 -4.75156,-18.20934c4.72482,-9.15317 -5.09683,-14.41997 -3.11917,-23.40991l0,0zm-0.30553,-0.19208c24.34058,0 48.68115,0 73.02173,0c-1.83408,8.68544 -9.76651,16.89688 -6.75064,25.63823c1.71623,7.25714 -5.42465,13.19763 -1.14023,20.86111c-4.2211,6.69464 -8.74136,17.62585 -17.58711,18.4115c-9.70837,0.11472 -19.41676,0.2294 -29.12514,0.34415c-6.65182,-7.13144 -16.14077,-15.45563 -10.92694,-24.96432c-7.35572,-5.15384 5.77059,-13.49446 -4.37249,-16.88078c4.72483,-9.15317 -5.09684,-14.41994 -3.11918,-23.40988l0,0zm19.95543,64.05962c10.3149,0 20.62982,0 30.94472,0c-3.3429,2.41727 -5.36609,8.04688 -10.20465,6.82349c-4.97464,-0.38892 -10.5618,0.58282 -15.16096,-0.64023c-1.8597,-2.0611 -3.71941,-4.12219 -5.5791,-6.18326zm11.23076,-64.53401c-3.56728,-52.49875 -7.20926,-74.75493 -20.64074,-106.52489c-13.43148,-31.76996 -2.88758,-21.17014 27.12348,-24.60654c30.01106,-3.43639 13.46907,9.90684 13.48128,34.43486c0.01221,24.52803 1.7489,36.82391 3.69955,58.10826c-1.9278,20.61055 1.80084,20.75101 -2.79076,37.25708", + "car_smart": "m28.92024,238.37814c-20.54175,-8.15092 -27.36674,-32.3504 -27.6178,-52.52942c-2.7836,-14.94118 14.71887,-25.93048 8.95686,-41.2937c-2.18657,-22.71175 4.68564,-45.20703 14.9548,-65.22043c0.32475,-12.85873 10.87969,-17.84956 22.37955,-17.11762c37.15603,-4.71741 74.98359,-4.84966 112.15372,-0.39277c22.18198,4.11681 39.85953,19.32546 58.61859,30.81274c11.63586,8.63808 25.21985,14.32888 36.92355,22.63131c12.64026,10.62529 24.51556,22.47708 33.27448,36.57193c3.15143,14.09033 7.38165,28.09947 9.54742,42.2829c4.39661,13.27223 -4.6037,21.62047 -11.41214,30.84103c-10.34,12.57306 -29.90723,17.53416 -44.71561,10.78313c-10.28528,-3.75465 -14.07077,-19.70746 -25.7968,-18.60466c-44.20906,-0.65964 -88.41812,-1.31926 -132.62719,-1.97884c-10.24168,13.44736 -24.40165,28.14365 -42.91705,26.05086c-4.02312,-0.33679 -7.97831,-1.33774 -11.7224,-2.83646z", + "car": "m26.77284,183.48201c-8.08779,-6.80998 -23.25337,0.56996 -25.08215,-11.86069c-3.52016,-11.04616 7.23365,-19.6761 14.38957,-26.36473c12.51913,-6.23676 26.95447,-6.99092 40.49323,-9.84883c16.2238,-2.35439 33.11552,-4.36668 47.10119,-13.71207c15.9294,-9.9651 33.67083,-18.25834 52.86141,-18.11141c26.44141,-0.91634 53.7986,-0.02856 78.2453,11.26058c15.36688,6.93465 31.87709,10.4591 48.27711,13.85143c13.95395,1.83385 10.70889,16.88237 15.35007,26.15973c3.54291,10.65329 -4.11594,21.25732 -15.32654,21.59605c-11.85318,2.69405 -25.72552,2.95921 -34.00009,13.30453c-8.47623,9.38277 -23.69647,9.05888 -32.32811,0.09547c-3.56866,-2.21568 -5.9512,-7.58008 -10.70335,-6.65411c-44.31184,0.24008 -88.64653,-0.63266 -132.93902,0.78894c-11.57394,-0.92139 -16.38131,13.44077 -28.69251,12.44249c-6.30352,0.19554 -12.27285,-9.98318 -17.64611,-12.94739z", + "coud": "m193.50864,67.27344c-28.56444,0 -53.08249,14.81322 -65.08365,36.1982c-4.7932,-2.67596 -10.08009,-4.29625 -15.72245,-4.29625c-17.06268,0 -31.26126,13.72618 -35.64974,32.35901c-7.49058,-2.96072 -16.20005,-4.7533 -25.50328,-4.7533c-27.90971,0 -50.54951,15.27039 -50.54951,34.09579c0,16.99312 18.56764,30.96303 42.68829,33.54732c-1.08106,1.83421 -1.91961,3.65059 -1.91961,5.57599c0,18.02431 49.38134,32.72462 110.23999,32.72462c60.85864,0 110.24005,-14.70032 110.23999,-32.72462c0,-1.21274 -0.75272,-2.29501 -1.18832,-3.47357c2.66562,0.6629 5.30496,1.37115 8.22687,1.37115c16.28061,0.00005 29.5253,-11.06223 29.5253,-24.6806c0,-13.61838 -13.24469,-24.68059 -29.5253,-24.68059c-1.99515,0 -3.69165,0.68915 -5.57599,1.00551c1.64767,-5.44531 2.74228,-11.00153 2.74228,-16.91078c0,-36.04859 -32.63087,-65.35786 -72.94485,-65.35786z", + "drop": "m115.15536,295.759c-42.01334,-15.78687 -72.12711,-65.94934 -65.28346,-108.74701c4.3154,-26.98718 95.35947,-190.81818 103.3105,-185.90417c2.59511,1.60386 25.68835,39.79974 51.31831,84.87975c41.0565,72.21342 46.5999,85.67899 46.5999,113.19665c0,55.77716 -44.6394,101.46498 -98.23825,100.54555c-15.6409,-0.26834 -32.60906,-2.05518 -37.707,-3.97076zm42.09262,-28.05386c1.39066,-7.22116 -1.85785,-10.74289 -9.90955,-10.74289c-18.35065,0 -43.80598,-23.24161 -49.49309,-45.18889c-6.0666,-23.41179 -22.15186,-26.19615 -24.52774,-4.24574c-4.57746,42.29059 76.21872,100.22086 83.93037,60.17752z", + "electric_guitar": "m168.96899,1.09303c-2.62799,0.19977 -5.017,2.04496 -6.96899,4.55579c0.009,13.46278 -11.116,25.03858 -14.875,34.35928c2.30499,1.8475 1.13,2.9332 -1.03101,4.4286c-0.17,2.5165 0.468,4.9685 2.468,7.3554c-2.591,41.8755 -6.024,92.17889 -8.718,134.4599c6.14801,0.138 12.354,1.117 18.81201,0.687c-0.007,-32.55499 2.539,-84.562 3.282,-116.00749c-0.101,-10.2094 -0.504,-24.029 13.12399,-28.8618c-6.94499,-14.7833 5.922,-35.70095 -5.562,-40.97666c-0.146,-0.00122 -0.293,-0.00885 -0.438,0c-0.03099,0.00187 -0.062,-0.00236 -0.093,0l0,-0.00001zm11.692,171.76396c-4.715,6.66701 -11.79199,10.17 -14.146,13.60501c-5.37599,8.46799 -14.379,-3.16701 -26.89,2.99599c0.065,-1.02399 0.153,-2.172 0.21899,-3.20599c-0.07199,-0.002 -0.14699,0.00101 -0.21899,0c-6.659,1.013 -12.157,-7.713 -12.594,-15.44901c5.55199,-11.89 -14.242,-18.006 -19.5,-5.82899c-3.943,13.605 -0.41,27.51199 4.78201,40.672c5.933,16.162 -8.871,30.179 -13.2192,45.17601c-4.1375,9.502 -4.2709,20.46999 2.68719,29.192c9.486,13.58398 29.413,18.62799 47.563,18.758c3.23401,0.224 6.44801,0.414 9.68701,0.58499c57.61699,3.284 34.35399,-35.13699 25.282,-68.41299c-5.82201,-21.66299 1.48199,-36.38 6.269,-42.614c2.659,-7.35001 6.02899,-23 -9.92101,-15.472l0,-0.00101zm-34.567,-128.4203c2.43501,-11.918 -8.10399,0.709 0,0z", + "guitar": "m158.45264,1.00012c-0.96039,0.00612 -1.8884,0.06411 -2.73161,0.18457c-4.49716,0.64245 -8.99768,2.5655 -8.99768,2.5655c0,0 0.00569,8.99612 -0.63676,15.42064c-0.64244,6.42453 -3.21147,17.34015 -3.21147,17.34015l3.15611,6.32144l0.05536,-1.172l10.62189,1.86414l0.94128,0.05537c0,0 1.28059,-1.28413 2.56551,-3.21148c1.2849,-1.92736 3.85747,-3.21148 3.85747,-3.21148c0,0 0.63675,-9.63641 0.63675,-16.70339c0,-7.06698 2.57472,-18.63212 2.57472,-18.63212c0,0 -4.66991,-0.84783 -8.83156,-0.82133zm-1.74417,42.52442l-10.62189,-0.58139l-0.05536,-0.11074l-5.5278,113.65688c0.19376,0.03734 0.44296,0.08304 0.44296,0.08304c0.14801,2.18161 0.8121,3.84209 1.8549,5.14021l11.84926,5.41707c0.3562,0.09476 0.71249,0.18806 1.07048,0.28609l1.28276,-123.83578l-0.29532,-0.05537zm-0.98744,123.89115l0,0.20302l-1.07048,-0.48911c-4.80661,-1.27875 -9.3821,-2.34575 -11.84926,-5.41707l-2.5009,-1.14432l0.20303,-4.07893c-2.16553,-0.41753 -15.40038,-2.83867 -20.1179,-0.47989c-5.13962,2.56979 -8.99552,6.42279 -10.28043,14.77466c-1.2849,8.3519 2.57119,23.77351 1.92873,34.05275c-0.64246,10.27924 -7.71416,19.91469 -10.92641,28.26657c-3.21227,8.35188 -6.4202,17.99007 -2.5655,32.12404c3.85472,14.13391 17.99164,23.77151 25.70107,26.9838c7.70942,3.21225 23.7631,5.14023 23.7631,5.14023c0,0 15.42752,2.58041 25.06432,1.93796c20.23672,-3.64624 28.72404,-15.65756 29.98303,-30.66595c1.259,-15.00839 -4.71521,-33.01251 -13.40884,-48.65207c-9.50552,-17.10013 8.59656,-39.76326 -0.76596,-52.52802c-9.74182,-13.28188 -16.9409,8.64334 -23.78156,3.87593c-2.77655,-1.93504 -6.09895,-3.00655 -9.37605,-3.90359z", + "helicopter": "m145.07504,214.22588c7.36339,2.46503 20.68225,-9.04681 7.26401,-9.72079c-9.08205,-5.71648 20.13416,-1.63675 8.22827,-13.70961c-12.73747,-2.77332 -22.69479,-12.46857 -27.12979,-24.871c-5.18111,-13.36012 -22.04633,-9.68964 -33.09622,-13.54991c-22.05075,-3.93678 -44.07657,-8.59007 -66.50366,-9.73877c-7.45861,8.40495 -10.97594,26.46114 -24.24853,25.75703c-13.26779,-6.6758 0.56035,-23.43509 -3.41489,-33.00934c-7.79329,-2.62592 -6.3066,-7.72096 1.2938,-8.36586c11.59587,-8.00312 1.94812,-23.47349 -0.57486,-34.01581c-6.13778,-10.01295 7.00565,-18.8414 12.01386,-7.02641c6.38165,12.3224 10.0863,25.85204 15.15507,38.7706c1.5816,8.28716 13.30507,3.58878 19.44516,6.06101c25.89155,2.78554 51.80775,5.58556 77.83869,6.66318c13.03992,-5.6261 26.8783,-10.34038 41.29993,-8.34114c10.08574,3.05644 15.78185,-0.7104 15.3338,-11.13895c5.72609,-15.02095 -14.03151,-8.3312 -22.93935,-10.54208c-35.53757,-1.72837 -71.18015,-2.25171 -106.70476,-0.12757c-7.88696,-1.96813 10.41693,-1.78943 13.19444,-2.24187c37.48436,-1.98021 75.04819,-1.00611 112.54227,-2.69012c10.81163,-3.98792 21.54251,3.11311 32.56555,1.91049c27.80304,1.13907 55.63103,1.5356 83.45552,1.62198c-7.86588,5.84674 -22.53885,0.05771 -32.94354,1.5061c-20.90826,-0.64194 -41.94905,-1.24406 -62.73434,1.6021c-8.09567,7.82163 -3.84563,24.5245 6.28453,28.41502c10.32359,5.55025 20.91692,10.41565 30.31529,17.0117c5.93991,11.31316 22.72864,20.80537 17.77679,35.05132c-5.67494,11.7886 -26.25294,4.37625 -31.4632,7.69153c3.85466,6.8309 17.16597,7.52176 19.55997,10.01913c-13.12518,3.78056 -0.61014,11.85339 6.85498,9.29091c9.21201,2.18106 -9.36668,3.71298 -12.4339,2.99583c-14.92371,0.12004 -29.83833,-0.52202 -44.7583,-0.72722c14.41679,-0.6433 28.87468,-0.63033 43.24721,-2.05975c-3.35245,-13.78374 -21.0649,-7.04161 -31.27078,-9.43388c-4.97525,-2.55072 -21.3748,0.68501 -13.06122,5.71829c4.63876,-2.08994 15.97667,-0.09111 5.65021,2.25237c-18.67735,0.60303 -37.42494,0.87289 -56.04201,-1.0285zm45.45972,-5.72816c-5.69293,-8.23618 -25.36656,-6.65369 -28.94688,0.84814c6.97417,5.6115 21.3663,3.65866 28.78714,0.2599l0.15974,-1.10805l0,0zm41.15115,-4.79669c-8.39107,-5.92067 -23.748,-6.57408 -31.28664,-1.76099c9.46599,4.52687 21.07687,2.68456 31.28664,1.76099zm-41.46053,-2.71213c8.91602,-7.60876 -15.73071,-6.19264 -21.17932,-5.80487c-13.47525,6.12955 5.46666,7.82239 11.1256,6.8177c3.37151,-0.02223 6.75697,-0.27522 10.05373,-1.01283z", + "katana": "m127.28507,65.14041c-7.0962,-0.54353 -19.86895,7.61395 -17.02093,-6.32892c4.93732,-8.55679 18.30521,-4.48845 16.78561,5.48313l0.17354,0.62374l0.06178,0.22205l0,0zm17.16403,-18.49577c-6.77293,11.60114 -22.03173,12.43076 -33.48896,16.75148c-5.30647,3.04373 -26.81981,5.02184 -18.62814,-4.27034c11.69819,-7.75446 26.08649,-9.62626 39.25734,-13.85468c4.24069,-0.99664 9.15976,-1.38791 12.85976,1.37354zm-35.03055,12.26915c-5.16663,-17.73298 -10.33324,-35.46593 -15.49986,-53.19891c6.32053,-8.5978 20.25586,-4.8693 18.32531,6.59137c4.01678,13.78642 8.03355,27.57289 12.05032,41.35935m-5.56697,9.33072c22.56753,79.08354 48.81091,157.2375 81.6054,232.70842m-75.6467,-234.76585c22.79797,74.42342 46.12929,148.92492 77.59851,220.23124c0.43317,5.52475 14.80417,22.08911 1.77542,17.81497c-4.05151,-1.9415 -10.97104,-0.62137 -11.72156,-6.31741c-30.74268,-74.29929 -57.39734,-150.28568 -79.92033,-227.47363", + "leaf_1": "m35.63904,285.5213c9.77121,-31.99348 23.14531,-59.08864 35.83149,-72.59245c13.5912,-14.46718 7.56125,-20.74258 -6.45918,-6.72212c-5.89857,5.89853 -7.58387,1.61555 -7.58387,-19.2735c0,-49.83961 25.83589,-80.67891 87.99842,-105.04016c52.59872,-20.61333 91.37741,-43.79435 107.45589,-64.23479l13.10197,-16.65652l0,28.9807c0,35.83507 -11.11781,89.97318 -23.42422,114.0641c-13.0549,25.55626 -57.80217,72.72934 -79.76038,84.08435c-19.67261,10.17316 -61.687,13.16808 -84.14172,5.99792c-11.19011,-3.57314 -14.7415,-0.84308 -20.53963,15.78944c-3.8556,11.06018 -7.0102,26.79501 -7.0102,34.96616c0,9.27652 -3.72057,14.8566 -9.90572,14.8566c-7.3461,0 -8.78352,-3.67429 -5.56284,-14.21973z", + "menorah": "m86.17095,270.72717c9.02267,-23.09398 33.59461,-36.70894 57.45916,-38.45409c0,-4.91623 0,-9.83244 0,-14.74866c-38.305,-2.75075 -76.20534,-18.86525 -101.66333,-48.29793c-23.2569,-24.97108 -35.58256,-58.55817 -37.27682,-92.42073c-13.45491,-9.58464 12.56556,-16.55834 15.7355,-5.95607c-7.24909,8.79617 -0.22592,22.59306 0.80432,33.36646c11.47956,50.91395 56.38975,91.60496 107.78628,98.82449c13.14264,5.82442 16.6395,-2.00252 14.39308,-13.99509c2.81267,-9.48175 -7.44086,-6.60333 -13.57417,-8.37358c-40.52152,-7.1041 -75.7263,-38.65041 -86.11595,-78.75394c-2.97659,-11.47399 -3.94458,-24.11363 -7.5694,-33.51495c7.70256,-6.02401 26.19639,-1.60448 15.97076,9.15671c1.09565,45.56244 38.91488,85.76277 83.65269,91.48959c9.24995,4.52249 8.18915,-3.21457 7.85701,-9.40932c4.90146,-15.06035 -9.71606,-12.79654 -19.53952,-16.50067c-27.62657,-9.39215 -47.87568,-36.35101 -49.79039,-65.51331c-13.2153,-11.51691 15.74928,-17.53994 15.95383,-5.55531c-7.59098,8.84892 0.96818,23.21689 5.54156,32.6564c10.3335,16.84724 28.24842,28.22102 47.83452,30.47823c0,-7.52246 0,-15.04491 0,-22.56738c-18.20905,-2.81535 -32.7534,-18.72141 -34.8131,-36.97318c-12.40635,-10.10166 14.58986,-14.97282 16.53119,-5.29626c-6.736,5.28018 -1.66743,13.75206 2.28733,19.47478c2.82583,3.38407 16.81124,15.16281 15.99458,6.28913c0,-10.03232 0,-20.06463 0,-30.09695c-8.52963,-5.41637 3.21713,-9.02356 -1.91258,-15.41792c2.95047,-6.63559 4.28693,-23.79965 6.49635,-24.00391c7.40089,10.5439 4.63795,25.17949 11.62167,34.34932c-3.85376,4.14688 -4.52328,8.74758 -3.86568,14.89357c0,8.05796 0,16.11592 0,24.17388c11.03737,-3.24367 21.02812,-12.42406 21.72646,-24.48188c-12.61211,-14.80839 30.69243,-11.52931 12.71999,1.59949c-1.87195,17.85434 -17.0993,32.57059 -34.44644,35.57887c0,7.49281 0,14.98562 0,22.47842c29.68999,-2.98224 55.87296,-29.1582 56.39926,-59.47436c-12.36238,-13.6567 27.91393,-12.75137 14.12813,-0.52898c-3.16423,14.80594 -6.23018,30.54218 -16.29872,42.63571c-12.70108,17.1765 -33.04718,27.37456 -53.98901,29.78134c0.16994,9.14496 -4.65584,28.46082 11.13493,20.75519c39.31322,-6.69104 72.74197,-39.63307 78.74797,-79.43351c5.73982,-8.84732 -8.70837,-25.00382 8.28397,-22.77648c10.50046,-2.44997 11.98193,6.34405 5.8692,11.72792c-2.04736,35.89314 -21.91298,70.45303 -53.09749,88.60141c-15.52945,9.13074 -33.16388,14.88533 -51.17824,15.85547c0.17836,7.53169 -0.4761,15.16116 0.61618,22.6142c35.31798,-2.81911 70.08339,-18.10321 93.11932,-45.67516c20.51892,-23.04272 31.08511,-53.43816 32.84753,-84.00375c-10.43478,-10.04525 11.39471,-11.61442 16.59445,-7.04305c-5.883,11.66189 -5.21661,27.04671 -9.11984,40.52295c-12.68921,53.08224 -58.41412,95.84925 -111.85593,105.51876c-7.32545,1.56883 -14.77785,2.36348 -22.20172,3.29227c-0.71042,9.09981 -0.50818,18.35449 11.59822,16.61531c20.59241,4.32626 40.36211,18.55411 46.94081,39.19469c-43.09088,0 -86.18179,0 -129.2727,0c0.31159,-0.88608 0.62314,-1.77219 0.93477,-2.65823zm-82.88959,-208.5947c-0.54892,-8.1144 4.33617,-25.42208 5.66115,-27.43132c2.27143,7.42761 12.58555,23.78434 4.72879,28.60384c-3.29131,-0.38358 -8.04816,1.57556 -10.38994,-1.17252zm34.52483,0.55147c-1.7146,-10.01769 5.4567,-19.41309 4.51432,-29.75311c3.2196,8.43034 16.36395,29.47998 1.96646,30.42084c-2.16732,-0.0773 -4.38702,0.03559 -6.48078,-0.66772zm35.62526,-0.17229c-1.52428,-9.82734 5.20364,-19.12723 4.61758,-29.264c3.98769,8.50923 17.39558,32.7104 -0.82941,30.07944l-1.91212,-0.12625l-1.87605,-0.68919l0,0zm34.60818,0.26421c-1.9521,-10.01891 5.40411,-19.48301 4.43661,-29.84504c3.27068,8.4848 16.29427,29.36411 1.98981,30.63179c-2.15335,-0.08198 -4.37302,0.0215 -6.42642,-0.78675zm69.2087,-0.38279c-1.5544,-10.07727 5.31645,-19.6095 4.34973,-30.05398c2.70531,5.08463 6.32187,13.73424 7.91895,20.50951c4.77353,11.03205 -3.95122,12.51878 -12.26868,9.54446zm35.71176,0.44493c-2.89404,-9.75608 5.30412,-19.55815 4.07715,-29.90718c3.42241,8.32418 12.40758,23.15913 6.53528,30.337c-3.53609,0.01955 -7.13571,0.41735 -10.61243,-0.42982zm34.8703,-0.20629c-2.23303,-8.13288 4.34842,-24.82986 5.07388,-28.23849c3.49849,8.39077 16.5291,33.58521 -2.7937,28.93562l-2.28018,-0.69713l0,0zm35.10023,-0.15336c-1.90784,-8.93159 5.20419,-21.786 4.83258,-28.71239c3.47043,8.02287 16.97986,32.30244 -0.94669,29.60343l-1.89111,-0.14957l-1.99478,-0.74147l0,0z", + "sun": "m238.69324,135.65587c0,46.60593 -40.30034,84.38748 -90.01332,84.38748c-49.71299,0 -90.01332,-37.78156 -90.01332,-84.38748c0,-46.6059 40.30033,-84.38747 90.01332,-84.38747c49.71298,0 90.01332,37.78154 90.01332,84.38747zm-7.30318,120.56636c-4.20586,5.25757 -51.12886,-47.27794 -57.30507,-44.69331c-6.17622,2.58458 -15.51068,86.52086 -22.0425,87.47173c-6.53188,0.9509 -17.76118,-85.09837 -24.12714,-87.15329c-6.36602,-2.05495 -43.23042,49.74286 -48.75608,45.85272c-5.52563,-3.89009 13.12091,-67.11951 10.04803,-73.73549c-3.07288,-6.61595 -73.34953,-9.72229 -74.79697,-17.10284c-1.44742,-7.38055 63.69369,-26.7453 64.2322,-34.0554c0.53854,-7.31011 -43.73452,-48.6129 -41.1993,-55.02096c2.53526,-6.40806 61.81988,21.03078 65.82475,15.40928c4.00487,-5.62149 -7.80805,-76.34053 -1.73039,-78.4587c6.07763,-2.11818 42.59449,47.54089 49.0827,47.30339c6.48817,-0.23753 26.02002,-62.46352 32.64861,-61.00949c6.62865,1.45401 3.32251,66.01247 8.45366,70.32287c5.13113,4.31043 55.87381,-16.15842 59.63792,-10.29998c3.76414,5.85843 -29.09575,62.86814 -27.11681,69.62658c1.97902,6.75845 62.18188,13.20758 61.3595,20.19514c-0.82245,6.98758 -75.2742,9.96732 -78.37666,16.73535c-3.10245,6.76802 28.36942,83.35484 24.16354,88.6124z", + "chair": "m118.11539,289.55515c-7.47328,-14.4328 15.76004,-21.83389 9.75156,-35.26642c-9.58212,-8.59285 -23.93785,-6.58557 -35.88018,-5.92961c-12.89955,-1.58955 -16.67669,11.62587 -24.11323,17.11729c-14.66394,-4.57965 -9.41961,-23.5907 3.95336,-25.69879c17.48831,-7.56879 36.79559,-3.21786 54.96046,-6.57193c13.14571,-7.65541 -3.09947,-24.09541 -13.42245,-25.84244c-17.08451,-6.9008 -38.18468,-7.0844 -51.24073,-21.62146c-5.1916,-11.32457 -3.84497,-32.04767 10.15321,-36.01445c6.34414,-10.73523 5.01785,-24.55999 3.35027,-36.47948c1.42348,-12.67513 -26.70474,-5.25126 -14.90233,-18.24577c10.64336,-8.15804 24.36629,-13.15867 37.81105,-12.959c10.96933,0.36309 11.71716,12.99065 -0.37628,9.89848c-12.30081,6.18077 -7.72121,23.86169 -7.25122,35.16668c5.93514,11.39347 22.04794,5.36764 32.49831,7.07384c14.8665,0.39955 21.73593,0.44463 35.83476,5.23605c14.25958,-1.05464 8.64325,-20.61657 0.17079,-21.97119c-13.03212,-2.87206 -25.91483,-10.25501 -33.20317,-21.62909c-4.07215,-13.26593 1.69855,-27.24597 4.77583,-40.18096c9.18196,-28.0861 34.13237,-54.57027 65.33606,-54.63913c19.15414,0.28833 38.85675,14.48402 42.13089,33.82922c2.48616,20.34066 -5.57245,41.0622 -0.32005,61.11538c12.75343,7.04288 -8.70227,17.78406 -9.16336,27.50478c-5.43883,14.13736 6.97403,30.55498 -3.65417,43.29654c-6.64983,9.38159 -22.16026,14.5639 -22.43275,27.04953c-3.81845,11.24202 -21.47061,10.39703 -30.28923,17.71931c-9.74564,2.86838 -15.08257,19.17726 -0.15649,15.9317c14.55153,-0.35892 29.03516,-5.81784 43.55118,-3.3181c10.39314,7.10063 -0.45073,21.22018 -10.9113,14.54475c-5.46445,0.08383 -25.63857,2.80356 -18.76688,8.69054c17.18895,4.015 35.8273,9.2104 46.95854,24.0352c10.43184,13.90863 -12.73763,17.22995 -17.34935,5.0022c-19.29245,-15.75378 -48.30531,-24.24933 -70.97163,-10.48508c-13.71143,5.73386 -10.53542,20.53958 -11.98199,31.56015c-5.57972,6.09451 -13.26627,-2.5275 -14.84946,-7.91876zm100.26077,-153.99353c-4.62421,-8.64436 -27.69229,-17.16811 -30.82967,-4.71919c1.76141,12.68575 19.62196,15.68971 29.15408,10.51048c1.73547,-1.32053 2.45361,-3.74493 1.67558,-5.79129z" + } +} diff --git a/dist/extensions/shapelib/raphael_1.json b/dist/extensions/shapelib/raphael_1.json new file mode 100644 index 00000000..92f63e83 --- /dev/null +++ b/dist/extensions/shapelib/raphael_1.json @@ -0,0 +1,65 @@ +{"size": 32, +"fill": true, +"data": { + "raph_?": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.328,24.371h-2.707v-2.596h2.707V24.371zM17.328,19.003v0.858h-2.707v-1.057c0-3.19,3.63-3.696,3.63-5.963c0-1.034-0.924-1.826-2.134-1.826c-1.254,0-2.354,0.924-2.354,0.924l-1.541-1.915c0,0,1.519-1.584,4.137-1.584c2.487,0,4.796,1.54,4.796,4.136C21.156,16.208,17.328,16.627,17.328,19.003z", + "raph_i": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M14.757,8h2.42v2.574h-2.42V8z M18.762,23.622H16.1c-1.034,0-1.475-0.44-1.475-1.496v-6.865c0-0.33-0.176-0.484-0.484-0.484h-0.88V12.4h2.662c1.035,0,1.474,0.462,1.474,1.496v6.887c0,0.309,0.176,0.484,0.484,0.484h0.88V23.622z", + "raph_$": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466z M17.255,23.88v2.047h-1.958v-2.024c-3.213-0.44-4.621-3.08-4.621-3.08l2.002-1.673c0,0,1.276,2.223,3.586,2.223c1.276,0,2.244-0.683,2.244-1.849c0-2.729-7.349-2.398-7.349-7.459c0-2.2,1.738-3.785,4.137-4.159V5.859h1.958v2.046c1.672,0.22,3.652,1.1,3.652,2.993v1.452h-2.596v-0.704c0-0.726-0.925-1.21-1.959-1.21c-1.32,0-2.288,0.66-2.288,1.584c0,2.794,7.349,2.112,7.349,7.415C21.413,21.614,19.785,23.506,17.255,23.88z", + "raph_temp": "M19.361,17.744V3.438c0-1.85-1.504-3.348-3.352-3.348c-1.852,0-3.35,1.498-3.35,3.348v14.193c-2.106,1.154-3.536,3.391-3.536,5.961c0,3.752,3.042,6.793,6.793,6.793c3.753,0,6.793-3.041,6.793-6.793C22.71,21.099,21.363,18.924,19.361,17.744zM15.917,29.27c-3.129,0-5.676-2.548-5.676-5.68c0-2.072,1.132-3.98,2.954-4.979l0.581-0.316V3.437c0-1.231,1.003-2.231,2.236-2.231c1.231,0,2.232,1,2.232,2.231v14.942l0.548,0.324c1.756,1.036,2.806,2.861,2.806,4.887C21.596,26.722,19.048,29.27,15.917,29.27zM18.225,19.666l-1.099-0.647V9.26h-2.233v9.695l-1.161,0.635c-1.464,0.805-2.375,2.334-2.375,4c0,2.514,2.047,4.561,4.56,4.561c2.515,0,4.56-2.047,4.56-4.561C20.479,21.988,19.616,20.485,18.225,19.666z", + "raph_thunder": "M25.371,7.306c-0.092-3.924-3.301-7.077-7.248-7.079c-2.638,0.001-4.942,1.412-6.208,3.517c-0.595-0.327-1.28-0.517-2.01-0.517C7.626,3.229,5.772,5.033,5.689,7.293c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h5.271l-2.166,3.398l1.977-0.411L10,30.875l9.138-10.102L17,21l2.167-2.023h4.269c3.312,0,6-2.688,6-6C29.434,10.34,27.732,8.11,25.371,7.306zM23.436,16.979H7.561c-2.209-0.006-3.997-1.792-4.001-4.001c-0.002-1.982,1.45-3.618,3.35-3.931c0.265-0.043,0.502-0.191,0.657-0.414C7.722,8.41,7.779,8.136,7.73,7.87C7.702,7.722,7.685,7.582,7.685,7.446C7.689,6.221,8.68,5.23,9.905,5.228c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.309c0.342-0.066,0.626-0.307,0.748-0.63c0.749-1.992,2.662-3.412,4.911-3.41c2.899,0.004,5.244,2.35,5.251,5.249c0,0.161-0.009,0.326-0.027,0.497c-0.049,0.517,0.305,0.984,0.815,1.079c1.86,0.344,3.274,1.966,3.271,3.923C27.43,15.186,25.645,16.973,23.436,16.979z", + "raph_snow": "M25.372,6.912c-0.093-3.925-3.302-7.078-7.248-7.08c-2.638,0.002-4.942,1.412-6.208,3.518c-0.595-0.327-1.28-0.518-2.01-0.518C7.627,2.834,5.773,4.639,5.69,6.898c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.875c3.312,0,6-2.688,6-6C29.434,9.944,27.732,7.715,25.372,6.912zM23.436,16.584H7.562c-2.209-0.006-3.997-1.793-4.001-4c-0.002-1.983,1.45-3.619,3.35-3.933c0.265-0.043,0.502-0.19,0.657-0.414C7.723,8.015,7.78,7.74,7.731,7.475C7.703,7.326,7.686,7.187,7.686,7.051c0.004-1.225,0.995-2.217,2.22-2.219c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.31c0.342-0.066,0.626-0.308,0.748-0.631c0.749-1.992,2.662-3.412,4.911-3.41c2.898,0.004,5.244,2.351,5.251,5.25c0,0.16-0.009,0.325-0.026,0.496c-0.05,0.518,0.305,0.984,0.814,1.079c1.859,0.345,3.273,1.966,3.271,3.923C27.43,14.791,25.645,16.578,23.436,16.584zM16.667,24.09l1.119-1.119c0.389-0.391,0.389-1.025,0-1.416c-0.392-0.391-1.025-0.391-1.415,0l-1.119,1.119l-1.119-1.119c-0.391-0.391-1.025-0.391-1.415,0c-0.391,0.391-0.391,1.025,0,1.416l1.118,1.117l-1.12,1.121c-0.389,0.393-0.389,1.021,0,1.414c0.195,0.188,0.451,0.293,0.707,0.293c0.256,0,0.512-0.104,0.708-0.293l1.12-1.119l1.12,1.119c0.195,0.188,0.451,0.293,0.708,0.293c0.256,0,0.512-0.104,0.707-0.293c0.391-0.396,0.391-1.021,0-1.414L16.667,24.09zM25.119,21.817c-0.393-0.392-1.025-0.392-1.415,0l-1.12,1.121l-1.12-1.121c-0.391-0.392-1.022-0.392-1.414,0c-0.39,0.392-0.39,1.022,0,1.416l1.119,1.119l-1.119,1.119c-0.39,0.391-0.39,1.022,0,1.413c0.195,0.195,0.451,0.294,0.707,0.294c0.257,0,0.513-0.099,0.707-0.294l1.12-1.118l1.12,1.118c0.194,0.195,0.45,0.294,0.707,0.294c0.256,0,0.513-0.099,0.708-0.294c0.389-0.391,0.389-1.022,0-1.413l-1.12-1.119l1.12-1.119C25.507,22.842,25.507,22.209,25.119,21.817zM9.334,23.953l1.119-1.119c0.389-0.394,0.389-1.021,0-1.414c-0.391-0.394-1.025-0.394-1.415,0l-1.119,1.119l-1.12-1.121c-0.391-0.39-1.023-0.39-1.415,0c-0.391,0.396-0.391,1.024,0,1.418l1.119,1.117l-1.12,1.118c-0.391,0.394-0.391,1.025,0,1.414c0.196,0.195,0.452,0.293,0.708,0.293c0.256,0,0.511-0.098,0.707-0.293l1.12-1.119l1.121,1.121c0.195,0.195,0.451,0.293,0.707,0.293s0.513-0.098,0.708-0.293c0.389-0.391,0.389-1.022,0-1.416L9.334,23.953z", + "raph_hail": "M25.372,6.912c-0.093-3.925-3.302-7.078-7.248-7.08c-2.638,0.002-4.942,1.412-6.208,3.518c-0.595-0.327-1.28-0.518-2.01-0.518C7.627,2.834,5.773,4.639,5.69,6.898c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.875c3.312,0,6-2.688,6-6C29.434,9.944,27.732,7.715,25.372,6.912zM23.436,16.584H7.562c-2.209-0.006-3.997-1.793-4.001-4c-0.002-1.983,1.45-3.619,3.35-3.933c0.265-0.043,0.502-0.19,0.657-0.414C7.723,8.015,7.78,7.74,7.731,7.475C7.703,7.326,7.686,7.187,7.686,7.051c0.004-1.225,0.995-2.217,2.22-2.219c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.31c0.342-0.066,0.626-0.308,0.748-0.631c0.749-1.992,2.662-3.412,4.911-3.41c2.898,0.004,5.244,2.351,5.251,5.25c0,0.16-0.009,0.325-0.026,0.496c-0.05,0.518,0.305,0.984,0.814,1.079c1.859,0.345,3.273,1.966,3.271,3.923C27.43,14.791,25.645,16.578,23.436,16.584zM11.503,23.709c-0.784-0.002-1.418-0.636-1.418-1.416c0-0.785,0.634-1.416,1.418-1.418c0.78,0.002,1.413,0.633,1.416,1.418C12.917,23.073,12.284,23.707,11.503,23.709zM19.002,23.709c-0.783-0.002-1.418-0.636-1.418-1.416c0-0.785,0.635-1.416,1.418-1.418c0.779,0.002,1.414,0.633,1.414,1.418C20.417,23.073,19.784,23.707,19.002,23.709zM7.503,28.771c-0.783-0.002-1.417-0.637-1.417-1.418s0.634-1.414,1.417-1.416c0.78,0.002,1.415,0.635,1.415,1.416C8.917,28.135,8.284,28.77,7.503,28.771zM15.001,28.771c-0.782-0.002-1.417-0.637-1.417-1.418s0.634-1.414,1.417-1.416c0.78,0.002,1.413,0.635,1.415,1.416C16.415,28.135,15.784,28.77,15.001,28.771zM22.5,28.771c-0.782-0.002-1.416-0.634-1.416-1.416c0-0.785,0.634-1.418,1.416-1.42c0.781,0.002,1.414,0.635,1.418,1.42C23.915,28.138,23.282,28.77,22.5,28.771z", + "raph_rain": "M25.371,7.306c-0.092-3.924-3.301-7.077-7.248-7.079c-2.638,0.001-4.942,1.412-6.208,3.517c-0.595-0.327-1.28-0.517-2.01-0.517C7.626,3.229,5.772,5.033,5.689,7.293c-2.393,0.786-4.125,3.025-4.127,5.686c0,3.312,2.687,6,6,6v-0.002h15.874c3.312,0,6-2.688,6-6C29.434,10.34,27.732,8.11,25.371,7.306zM23.436,16.979H7.561c-2.209-0.006-3.997-1.792-4.001-4.001c-0.002-1.982,1.45-3.618,3.35-3.931c0.265-0.043,0.502-0.191,0.657-0.414C7.722,8.41,7.779,8.136,7.73,7.87C7.702,7.722,7.685,7.582,7.685,7.446C7.689,6.221,8.68,5.23,9.905,5.228c0.647,0,1.217,0.278,1.633,0.731c0.233,0.257,0.587,0.375,0.927,0.309c0.342-0.066,0.626-0.307,0.748-0.63c0.749-1.992,2.662-3.412,4.911-3.41c2.899,0.004,5.244,2.35,5.251,5.249c0,0.161-0.009,0.326-0.027,0.497c-0.049,0.517,0.305,0.984,0.815,1.079c1.86,0.344,3.274,1.966,3.271,3.923C27.43,15.186,25.645,16.973,23.436,16.979zM9.029,26.682c0-1.115,0.021-5.425,0.021-5.432c0.002-0.409-0.247-0.779-0.628-0.932c-0.38-0.152-0.815-0.059-1.099,0.24c-0.006,0.008-1.037,1.098-2.081,2.342c-0.523,0.627-1.048,1.287-1.463,1.896c-0.399,0.648-0.753,1.066-0.811,1.885C2.971,28.355,4.324,29.711,6,29.714C7.672,29.71,9.029,28.354,9.029,26.682zM4.971,26.727c0.091-0.349,1.081-1.719,1.993-2.764c0.025-0.029,0.051-0.061,0.076-0.089c-0.005,1.124-0.01,2.294-0.01,2.808c0,0.567-0.461,1.028-1.029,1.03C5.447,27.71,4.997,27.273,4.971,26.727zM16.425,26.682c0-1.115,0.021-5.424,0.021-5.43c0.002-0.41-0.247-0.779-0.628-0.934c-0.381-0.152-0.814-0.058-1.1,0.242c-0.006,0.008-1.035,1.094-2.08,2.342c-0.522,0.623-1.047,1.285-1.463,1.894c-0.399,0.649-0.753,1.068-0.809,1.888c0,1.672,1.354,3.028,3.029,3.028C15.068,29.711,16.425,28.354,16.425,26.682zM12.365,26.729c0.092-0.349,1.081-1.72,1.993-2.765c0.025-0.03,0.05-0.06,0.075-0.089c-0.005,1.123-0.011,2.294-0.011,2.807c-0.002,0.568-0.461,1.027-1.028,1.029C12.84,27.709,12.392,27.273,12.365,26.729zM23.271,20.317c-0.38-0.153-0.816-0.06-1.099,0.24c-0.009,0.008-1.037,1.097-2.08,2.342c-0.523,0.625-1.049,1.285-1.462,1.896c-0.402,0.649-0.754,1.067-0.812,1.886c0,1.672,1.354,3.029,3.03,3.029c1.673,0,3.027-1.357,3.027-3.029c0-1.115,0.022-5.425,0.022-5.431C23.9,20.84,23.651,20.47,23.271,20.317zM21.879,26.681c-0.004,0.568-0.463,1.027-1.031,1.029c-0.553-0.002-1.002-0.438-1.028-0.982c0.092-0.349,1.081-1.72,1.993-2.765c0.025-0.028,0.05-0.059,0.074-0.088C21.883,24.998,21.879,26.167,21.879,26.681z", + "raph_sun": "M15.502,7.504c-4.35,0-7.873,3.523-7.873,7.873c0,4.347,3.523,7.872,7.873,7.872c4.346,0,7.871-3.525,7.871-7.872C23.374,11.027,19.85,7.504,15.502,7.504zM15.502,21.25c-3.244-0.008-5.866-2.63-5.874-5.872c0.007-3.243,2.63-5.866,5.874-5.874c3.242,0.008,5.864,2.631,5.871,5.874C21.366,18.62,18.744,21.242,15.502,21.25zM15.502,6.977c0.553,0,1-0.448,1-1.001V1.125c-0.002-0.553-0.448-1-1-1c-0.553,0-1.001,0.449-1,1.002v4.85C14.502,6.528,14.949,6.977,15.502,6.977zM18.715,7.615c0.125,0.053,0.255,0.076,0.382,0.077c0.394,0,0.765-0.233,0.925-0.618l1.856-4.483c0.21-0.511-0.031-1.095-0.541-1.306c-0.511-0.211-1.096,0.031-1.308,0.541L18.174,6.31C17.963,6.82,18.205,7.405,18.715,7.615zM21.44,9.436c0.195,0.194,0.451,0.293,0.707,0.293s0.512-0.098,0.707-0.293l3.43-3.433c0.391-0.39,0.39-1.023,0-1.415c-0.392-0.39-1.025-0.39-1.415,0.002L21.44,8.021C21.049,8.412,21.049,9.045,21.44,9.436zM23.263,12.16c0.158,0.385,0.531,0.617,0.923,0.617c0.127,0,0.257-0.025,0.383-0.078l4.48-1.857c0.511-0.211,0.753-0.797,0.541-1.307s-0.796-0.752-1.307-0.54l-4.481,1.857C23.292,11.064,23.051,11.65,23.263,12.16zM29.752,14.371l-4.851,0.001c-0.552,0-1,0.448-0.998,1.001c0,0.553,0.447,0.999,0.998,0.999l4.852-0.002c0.553,0,0.999-0.449,0.999-1C30.752,14.817,30.304,14.369,29.752,14.371zM29.054,19.899l-4.482-1.854c-0.512-0.212-1.097,0.03-1.307,0.541c-0.211,0.511,0.031,1.096,0.541,1.308l4.482,1.854c0.126,0.051,0.256,0.075,0.383,0.075c0.393,0,0.765-0.232,0.925-0.617C29.806,20.695,29.563,20.109,29.054,19.899zM22.86,21.312c-0.391-0.391-1.023-0.391-1.414,0.001c-0.391,0.39-0.39,1.022,0,1.413l3.434,3.429c0.195,0.195,0.45,0.293,0.706,0.293s0.513-0.098,0.708-0.293c0.391-0.392,0.389-1.025,0-1.415L22.86,21.312zM20.029,23.675c-0.211-0.511-0.796-0.752-1.307-0.541c-0.51,0.212-0.752,0.797-0.54,1.308l1.86,4.48c0.159,0.385,0.531,0.617,0.925,0.617c0.128,0,0.258-0.024,0.383-0.076c0.511-0.211,0.752-0.797,0.54-1.309L20.029,23.675zM15.512,23.778c-0.553,0-1,0.448-1,1l0.004,4.851c0,0.553,0.449,0.999,1,0.999c0.553,0,1-0.448,0.998-1l-0.003-4.852C16.511,24.226,16.062,23.777,15.512,23.778zM12.296,23.142c-0.51-0.21-1.094,0.031-1.306,0.543l-1.852,4.483c-0.21,0.511,0.033,1.096,0.543,1.307c0.125,0.052,0.254,0.076,0.382,0.076c0.392,0,0.765-0.234,0.924-0.619l1.853-4.485C13.051,23.937,12.807,23.353,12.296,23.142zM9.57,21.325c-0.392-0.391-1.025-0.389-1.415,0.002L4.729,24.76c-0.391,0.392-0.389,1.023,0.002,1.415c0.195,0.194,0.45,0.292,0.706,0.292c0.257,0,0.513-0.098,0.708-0.293l3.427-3.434C9.961,22.349,9.961,21.716,9.57,21.325zM7.746,18.604c-0.213-0.509-0.797-0.751-1.307-0.54L1.96,19.925c-0.511,0.212-0.752,0.798-0.54,1.308c0.16,0.385,0.531,0.616,0.924,0.616c0.127,0,0.258-0.024,0.383-0.076l4.479-1.861C7.715,19.698,7.957,19.113,7.746,18.604zM7.1,15.392c0-0.553-0.447-0.999-1-0.999l-4.851,0.006c-0.553,0-1.001,0.448-0.999,1.001c0.001,0.551,0.449,1,1,0.998l4.852-0.006C6.654,16.392,7.102,15.942,7.1,15.392zM1.944,10.869l4.485,1.85c0.125,0.053,0.254,0.076,0.381,0.076c0.393,0,0.766-0.232,0.925-0.618c0.212-0.511-0.032-1.097-0.544-1.306L2.708,9.021c-0.511-0.21-1.095,0.032-1.306,0.542C1.19,10.074,1.435,10.657,1.944,10.869zM8.137,9.451c0.195,0.193,0.449,0.291,0.705,0.291s0.513-0.098,0.709-0.295c0.391-0.389,0.389-1.023-0.004-1.414L6.113,4.609C5.723,4.219,5.088,4.221,4.699,4.612c-0.391,0.39-0.389,1.024,0.002,1.414L8.137,9.451zM10.964,7.084c0.16,0.384,0.532,0.615,0.923,0.615c0.128,0,0.258-0.025,0.384-0.077c0.51-0.212,0.753-0.798,0.54-1.307l-1.864-4.479c-0.212-0.51-0.798-0.751-1.308-0.539C9.129,1.51,8.888,2.096,9.1,2.605L10.964,7.084z", + "raph_undo": "M12.981,9.073V6.817l-12.106,6.99l12.106,6.99v-2.422c3.285-0.002,9.052,0.28,9.052,2.269c0,2.78-6.023,4.263-6.023,4.263v2.132c0,0,13.53,0.463,13.53-9.823C29.54,9.134,17.952,8.831,12.981,9.073z", + "raph_merge": "M26.92,10.928l-3.574-2.064v2.297h-6.414c-1.123,0.084-3.062-1.19-5.218-2.881C9.543,6.676,7.062,4.709,3.74,4.656H1.505v3.662H3.74c1.627-0.047,3.633,1.232,5.769,2.883c0.796,0.577,1.599,1.213,2.45,1.788c-0.851,0.575-1.653,1.212-2.45,1.789c-2.136,1.646-4.142,2.929-5.767,2.882H1.505v3.668h2.236c3.315-0.047,5.797-2.02,7.975-3.621c2.156-1.691,4.094-2.966,5.218-2.883h6.412v2.297l3.574-2.062l3.576-2.064L26.92,10.928z", + "raph_split": "M23.346,23.979l3.576-2.062l3.574-2.062l-3.576-2.064l-3.574-2.062v2.293c-0.876,0-1.894,0-2.235,0c-1.626,0.046-3.633-1.233-5.768-2.883c-0.796-0.578-1.599-1.214-2.45-1.789c0.851-0.575,1.653-1.211,2.45-1.789c2.135-1.647,4.142-2.929,5.766-2.882l2.237-0.001v2.296l3.574-2.063l3.576-2.064L26.92,4.78l-3.574-2.064v2.295H21.11c-3.321,0.047-5.803,2.019-7.975,3.622c-2.156,1.691-4.094,2.965-5.218,2.882H1.505v3.664h6.414c1.123-0.083,3.062,1.191,5.218,2.882c2.171,1.604,4.652,3.575,7.974,3.622h2.235V23.979L23.346,23.979z", + "raph_fork": "M26.268,22.562l3.514-2.03l-3.514-2.028l-3.515-2.028v2.256c-0.922-0.002-2.45-0.002-2.883-0.002c-1.28-0.03-2.12-0.431-2.994-1.148c-1.303-1.07-2.415-2.997-3.756-4.853c-0.682-0.923-1.442-1.839-2.454-2.575C9.664,9.415,8.355,8.902,6.9,8.912H0.593v3.604H6.9c0.877,0.016,1.432,0.302,2.189,1.012c1.12,1.055,2.212,3.072,3.718,4.983c1.476,1.893,3.747,3.804,7.041,3.823h2.905v2.256L26.268,22.562zM11.401,8.912c0.04,0.028,0.082,0.053,0.121,0.082c1.202,0.874,2.07,1.947,2.757,2.88c0.158,0.218,0.298,0.428,0.448,0.642h8.026v2.257l3.515-2.028l3.514-2.029l-3.514-2.029l-3.515-2.03v2.255H11.401z", + "raph_shuffle": "M9.089,13.133c0.346,0.326,0.69,0.75,1.043,1.228c0.051-0.073,0.099-0.144,0.15-0.219c0.511-0.75,1.09-1.599,1.739-2.421c0.103-0.133,0.211-0.245,0.316-0.371c-0.487-0.572-1.024-1.12-1.672-1.592C9.663,9.02,8.354,8.506,6.899,8.517H0.593v3.604H6.9C7.777,12.138,8.333,12.422,9.089,13.133zM22.753,16.082v2.256c-0.922-0.002-2.45-0.002-2.883-0.002c-1.28-0.03-2.12-0.438-2.994-1.148c-0.378-0.311-0.74-0.7-1.097-1.133c-0.268,0.376-0.538,0.764-0.813,1.168c-0.334,0.488-0.678,0.99-1.037,1.484c-0.089,0.121-0.189,0.246-0.283,0.369c1.455,1.528,3.473,2.846,6.202,2.862h2.905v2.256l3.515-2.026l3.521-2.03l-3.521-2.028L22.753,16.082zM16.876,13.27c0.874-0.712,1.714-1.118,2.994-1.148c0.433,0,1.961,0,2.883-0.002v2.256l3.515-2.026l3.521-2.028l-3.521-2.029l-3.515-2.027V8.52h-2.905c-3.293,0.02-5.563,1.93-7.041,3.822c-1.506,1.912-2.598,3.929-3.718,4.982C8.332,18.033,7.777,18.32,6.9,18.336H0.593v3.604H6.9c1.455,0.011,2.764-0.502,3.766-1.242c1.012-0.735,1.772-1.651,2.454-2.573C14.461,16.267,15.574,14.34,16.876,13.27z", + "raph_refresh": "M15.999,4.308c1.229,0.001,2.403,0.214,3.515,0.57L18.634,6.4h6.247l-1.562-2.706L21.758,0.99l-0.822,1.425c-1.54-0.563-3.2-0.878-4.936-0.878c-7.991,0-14.468,6.477-14.468,14.468c0,3.317,1.128,6.364,3.005,8.805l2.2-1.689c-1.518-1.973-2.431-4.435-2.436-7.115C4.312,9.545,9.539,4.318,15.999,4.308zM27.463,7.203l-2.2,1.69c1.518,1.972,2.431,4.433,2.435,7.114c-0.011,6.46-5.238,11.687-11.698,11.698c-1.145-0.002-2.24-0.188-3.284-0.499l0.828-1.432H7.297l1.561,2.704l1.562,2.707l0.871-1.511c1.477,0.514,3.058,0.801,4.709,0.802c7.992-0.002,14.468-6.479,14.47-14.47C30.468,12.689,29.339,9.643,27.463,7.203z", + "raph_smile2": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM16,29.534C8.539,29.534,2.466,23.462,2.466,16C2.466,8.539,8.539,2.466,16,2.466c7.462,0,13.535,6.072,13.535,13.533C29.534,23.462,23.462,29.534,16,29.534zM11.104,14c0.932,0,1.688-1.483,1.688-3.312s-0.755-3.312-1.688-3.312s-1.688,1.483-1.688,3.312S10.172,14,11.104,14zM20.729,14c0.934,0,1.688-1.483,1.688-3.312s-0.756-3.312-1.688-3.312c-0.932,0-1.688,1.483-1.688,3.312S19.798,14,20.729,14zM8.143,21.189C10.458,24.243,13.148,26,16.021,26c2.969,0,5.745-1.868,8.11-5.109c-2.515,1.754-5.292,2.734-8.215,2.734C13.164,23.625,10.54,22.756,8.143,21.189z", + "raph_smile": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM20.729,7.375c0.934,0,1.688,1.483,1.688,3.312S21.661,14,20.729,14c-0.932,0-1.688-1.483-1.688-3.312S19.798,7.375,20.729,7.375zM11.104,7.375c0.932,0,1.688,1.483,1.688,3.312S12.037,14,11.104,14s-1.688-1.483-1.688-3.312S10.172,7.375,11.104,7.375zM16.021,26c-2.873,0-5.563-1.757-7.879-4.811c2.397,1.564,5.021,2.436,7.774,2.436c2.923,0,5.701-0.98,8.215-2.734C21.766,24.132,18.99,26,16.021,26z", + "raph_alarm": "M15.499,5.125c-0.553,0-0.999,0.448-0.999,1v9.221L8.454,17.99c-0.506,0.222-0.736,0.812-0.514,1.318c0.164,0.375,0.53,0.599,0.915,0.599c0.134,0,0.271-0.027,0.401-0.085l6.626-2.898c0.005-0.002,0.009-0.004,0.013-0.006l0.004-0.002c0.015-0.006,0.023-0.02,0.037-0.025c0.104-0.052,0.201-0.113,0.279-0.195c0.034-0.034,0.053-0.078,0.079-0.117c0.048-0.064,0.101-0.127,0.13-0.204c0.024-0.06,0.026-0.125,0.038-0.189c0.013-0.064,0.038-0.121,0.038-0.186V6.124C16.5,5.573,16.052,5.125,15.499,5.125zM31.125,6.832c0-3.832-3.105-6.938-6.938-6.938c-1.938,0-3.686,0.796-4.94,2.077C18.05,1.652,16.798,1.466,15.5,1.466c-1.334,0-2.62,0.195-3.847,0.531c-1.259-1.295-3.016-2.103-4.965-2.103C2.856-0.106-0.25,3-0.25,6.832c0,1.845,0.726,3.517,1.901,4.76c-0.443,1.39-0.685,2.87-0.685,4.408c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534c0-1.575-0.259-3.087-0.722-4.508C30.436,10.261,31.125,8.629,31.125,6.832zM15.5,27.533C9.139,27.533,3.966,22.359,3.966,16c0-6.36,5.173-11.534,11.534-11.534c6.361,0,11.533,5.173,11.533,11.534C27.033,22.361,21.859,27.533,15.5,27.533z", + "raph_clock": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM16,27.533C9.639,27.533,4.466,22.359,4.466,16C4.466,9.64,9.639,4.466,16,4.466c6.361,0,11.533,5.173,11.533,11.534C27.533,22.361,22.359,27.533,16,27.533zM15.999,5.125c-0.553,0-0.999,0.448-0.999,1v9.221L8.954,17.99c-0.506,0.222-0.736,0.812-0.514,1.318c0.164,0.375,0.53,0.599,0.915,0.599c0.134,0,0.271-0.027,0.401-0.085l6.626-2.898c0.005-0.002,0.009-0.004,0.013-0.006l0.004-0.002c0.015-0.006,0.023-0.02,0.037-0.025c0.104-0.052,0.201-0.113,0.279-0.195c0.034-0.034,0.053-0.078,0.079-0.117c0.048-0.064,0.101-0.127,0.13-0.204c0.024-0.06,0.026-0.125,0.038-0.189C16.975,16.121,17,16.064,17,15.999V6.124C17,5.573,16.552,5.125,15.999,5.125z", + "raph_globeAlt2": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM8.251,7.48c0.122,0.055,0.255,0.104,0.28,0.137C8.57,7.668,8.621,7.823,8.557,7.861C8.492,7.9,8.39,7.887,8.376,7.771c-0.013-0.115-0.026-0.128-0.18-0.18c-0.022-0.007-0.035-0.01-0.051-0.015C8.18,7.544,8.216,7.512,8.251,7.48zM7.733,7.974c0.031,0.087,0.113,0.125,0,0.17C7.673,8.168,7.611,8.172,7.559,8.165C7.617,8.102,7.672,8.035,7.733,7.974zM16,27.533C9.639,27.533,4.466,22.36,4.466,16c0-0.085,0.011-0.168,0.013-0.254c0.004-0.003,0.008-0.006,0.012-0.009c0.129-0.102,0.283-0.359,0.334-0.45c0.052-0.089,0.181-0.154,0.116-0.256c-0.059-0.096-0.292-0.23-0.407-0.261c0.01-0.099,0.032-0.195,0.045-0.294c0.063,0.077,0.137,0.17,0.208,0.194c0.115,0.038,0.501,0.052,0.566,0.052c0.063,0,0.334,0.014,0.386-0.064c0.051-0.077,0.09-0.077,0.154-0.077c0.064,0,0.18,0.231,0.271,0.257c0.089,0.026,0.257,0.013,0.244,0.181c-0.012,0.166,0.077,0.309,0.167,0.321c0.09,0.013,0.296-0.194,0.296-0.194s0,0.322-0.012,0.438C6.846,15.698,7,16.124,7,16.124s0.193,0.397,0.244,0.488c0.052,0.09,0.27,0.36,0.27,0.476c0,0.117,0.026,0.297,0.104,0.297s0.155-0.206,0.244-0.335c0.091-0.128,0.117-0.31,0.155-0.438c0.039-0.129,0.039-0.36,0.039-0.45c0-0.091,0.076-0.168,0.257-0.245c0.181-0.077,0.309-0.296,0.463-0.412c0.155-0.116,0.142-0.309,0.452-0.309c0.308,0,0.282,0,0.36-0.078c0.077-0.077,0.154-0.128,0.192,0.013c0.039,0.142,0.257,0.347,0.296,0.399c0.039,0.052,0.116,0.193,0.104,0.348c-0.013,0.153,0.012,0.334,0.077,0.334c0.064,0,0.193-0.219,0.193-0.219s0.283-0.192,0.27,0.014c-0.014,0.205,0.025,0.425,0.025,0.552c0,0.13,0.232,0.438,0.232,0.362c0-0.079,0.103-0.296,0.103-0.413c0-0.114,0.064-0.063,0.231,0.051c0.167,0.116,0.283,0.349,0.283,0.349s0.168,0.154,0.193,0.219c0.026,0.064,0.206-0.025,0.244-0.104c0.039-0.076,0.065-0.115,0.167-0.141c0.104-0.026,0.231-0.026,0.271-0.168c0.039-0.142,0.154-0.308,0-0.502c-0.154-0.193-0.232-0.321-0.347-0.412c-0.117-0.09-0.206-0.322-0.206-0.322s0.244-0.218,0.321-0.296c0.079-0.077,0.193-0.025,0.207,0.064c0.013,0.091-0.115,0.168-0.141,0.361c-0.026,0.192,0.154,0.257,0.206,0.192c0.051-0.065,0.18-0.219,0.18-0.257c0-0.039-0.089-0.026-0.102-0.167c-0.013-0.142,0.166-0.245,0.23-0.207c0.066,0.039,0.477-0.051,0.67-0.154s0.308-0.322,0.425-0.412c0.116-0.089,0.515-0.386,0.489-0.527c-0.026-0.142,0.012-0.334-0.09-0.515c-0.103-0.18-0.232-0.295-0.283-0.373c-0.051-0.077,0.219-0.09,0.347-0.206c0.129-0.116,0-0.219-0.064-0.206c-0.064,0.013-0.232,0.052-0.296,0.039c-0.064-0.013-0.103-0.077-0.206-0.155c-0.102-0.077,0.026-0.192,0.091-0.179c0.064,0.013,0.23-0.129,0.308-0.193c0.077-0.064,0.193-0.115,0.154-0.051c-0.038,0.064-0.128,0.296-0.026,0.309c0.104,0.013,0.348-0.193,0.388-0.18c0.038,0.013,0.102,0.18,0.064,0.257c-0.039,0.077-0.039,0.206,0.013,0.193c0.051-0.013,0.154-0.129,0.18-0.09c0.027,0.039,0.154,0.116,0.09,0.257c-0.063,0.142-0.193,0.193-0.039,0.284c0.154,0.089,0.206,0.012,0.322-0.052c0.115-0.064,0.193-0.347,0.128-0.438c-0.064-0.09-0.218-0.27-0.218-0.334c0-0.064,0.257-0.064,0.257-0.167s0.09-0.18,0.18-0.219c0.091-0.039,0.206-0.206,0.244-0.154c0.039,0.052,0.271,0.116,0.334,0.039c0.064-0.077,0.4-0.36,0.605-0.515c0.206-0.154,0.283-0.334,0.336-0.515c0.051-0.18,0.128-0.296,0.102-0.437v0c0.077,0.18,0.09,0.309,0.077,0.45c-0.013,0.142,0,0.438,0.026,0.476c0.025,0.039,0.129,0.128,0.192,0.103c0.064-0.025-0.025-0.283-0.025-0.334c0-0.052,0.09-0.129,0.142-0.142c0.052-0.013,0-0.231-0.065-0.322c-0.063-0.09-0.154-0.142-0.102-0.154c0.051-0.013,0.115-0.116,0.077-0.142c-0.039-0.025-0.014-0.116-0.103-0.09c-0.065,0.019-0.241-0.015-0.235,0.095c-0.037-0.11-0.116-0.183-0.216-0.172c-0.116,0.013-0.181,0.077-0.296,0.077s-0.025-0.18-0.077-0.18c-0.051,0-0.168,0.167-0.231,0.077c-0.064-0.09,0.18-0.206,0.373-0.27c0.192-0.064,0.514-0.438,0.644-0.451c0.128-0.013,0.45,0.026,0.733,0.013c0.283-0.013,0.373-0.129,0.463-0.064s0.283,0.142,0.399,0.129c0.116-0.014,0.064,0,0.244-0.129c0.18-0.129,0.348-0.193,0.438-0.296c0.09-0.103,0.335-0.18,0.348-0.077c0.014,0.103-0.026,0.206,0.077,0.206s0.258-0.103,0.386-0.154c0.129-0.051,0.231-0.116,0.231-0.116s-0.527,0.36-0.655,0.438c-0.129,0.077-0.438,0.129-0.567,0.283c-0.128,0.155-0.205,0.206-0.192,0.374c0.014,0.167,0.231,0.386,0.128,0.54c-0.103,0.154-0.141,0.373-0.141,0.373s0.154-0.219,0.373-0.36s0.348-0.334,0.425-0.412s0.309-0.091,0.309-0.181s0.064-0.206,0.104-0.309c0.038-0.103-0.077-0.078,0-0.206c0.076-0.129,0.064-0.232,0.45-0.232s0.257,0.026,0.566,0.013c0.309-0.013,0.424-0.167,0.72-0.245c0.296-0.077,0.527-0.128,0.618-0.089c0.09,0.038,0.232,0.012,0.141-0.078c-0.089-0.09-0.295-0.219-0.193-0.245c0.104-0.026,0.207-0.039,0.246-0.142c0.039-0.103-0.142-0.283-0.039-0.386c0.104-0.103-0.077-0.231-0.207-0.257c-0.128-0.025-0.63,0.026-0.731-0.025c-0.104-0.052-0.271-0.116-0.322-0.078c-0.052,0.039-0.168,0.245-0.168,0.245s-0.09,0.025-0.168-0.09c-0.076-0.116-0.5-0.103-0.629-0.103s-0.271,0.025-0.413,0.039c-0.141,0.013-0.219,0.052-0.322-0.039c-0.102-0.09-0.243-0.129-0.296-0.167c-0.051-0.039-0.334-0.039-0.553-0.012c-0.218,0.025-0.438,0.025-0.438,0.025s-0.104-0.039-0.257-0.129c-0.154-0.09-0.309-0.154-0.361-0.154c-0.051,0-0.449,0.064-0.539,0c-0.091-0.064-0.181-0.103-0.245-0.103s-0.115-0.103-0.038-0.103s0.437-0.103,0.437-0.103s-0.103-0.142-0.231-0.142c-0.128,0-0.359-0.064-0.424-0.064s-0.014,0.064-0.142,0.039c-0.13-0.026-0.258-0.078-0.335-0.026c-0.076,0.051-0.258,0.128-0.064,0.18c0.193,0.052,0.373,0,0.425,0.078c0.052,0.077,0,0.115,0,0.167s-0.103,0.193-0.167,0.219c-0.064,0.025-0.143-0.039-0.27,0.025c-0.129,0.064-0.451,0.013-0.49,0.052c-0.038,0.039-0.115-0.103-0.18-0.077c-0.064,0.025-0.232,0.193-0.322,0.18c-0.089-0.013-0.206-0.103-0.206-0.206s-0.038-0.232-0.077-0.258c-0.038-0.025-0.322-0.039-0.425-0.025c-0.103,0.013-0.424,0.038-0.477,0.09c-0.052,0.052-0.193,0.09-0.283,0.09s-0.167-0.09-0.36-0.116c-0.192-0.026-0.617-0.039-0.669-0.026s-0.218-0.025-0.155-0.077c0.065-0.051,0.257-0.219,0.143-0.295c-0.117-0.078-0.375-0.078-0.489-0.09c-0.117-0.013-0.232-0.039-0.413-0.013c-0.181,0.026-0.219,0.116-0.296,0.039c-0.077-0.077,0.193,0.039-0.077-0.077c-0.27-0.116-0.399-0.103-0.477-0.064c-0.077,0.039,0.013,0.025-0.192,0.103c-0.206,0.078-0.322,0.116-0.374,0.129c-0.051,0.012-0.372-0.065-0.411-0.091c-0.038-0.025-0.181,0.013-0.309,0.064S9.895,7.025,9.767,7C9.638,6.973,9.432,6.973,9.303,7.025C9.174,7.076,9.084,7.076,8.956,7.166c-0.13,0.09-0.373,0.142-0.373,0.142S8.522,7.305,8.448,7.301C10.474,5.541,13.111,4.466,16,4.466c6.361,0,11.534,5.173,11.534,11.534S22.36,27.533,16,27.533zM14.888,19.92c0,0,0.207-0.026,0.207-0.117c0-0.089-0.207-0.205-0.282-0.102c-0.078,0.102-0.219,0.205-0.207,0.296C14.625,20.138,14.888,19.92,14.888,19.92zM14.875,17.023c-0.181,0.233-0.167,0.182-0.296,0.128c-0.128-0.05-0.334,0.116-0.296,0.182c0.039,0.064,0.322-0.014,0.386,0.102c0.065,0.116,0.065,0.129,0.193,0.104c0.128-0.026,0.257-0.205,0.219-0.295C15.043,17.151,14.875,17.023,14.875,17.023zM14.837,18.245c-0.051,0-0.412,0.064-0.451,0.079c-0.039,0.013-0.27-0.025-0.27-0.025c-0.09,0.089-0.026,0.179,0.116,0.166s0.438-0.052,0.502-0.052C14.799,18.413,14.888,18.245,14.837,18.245zM14.284,14.668c-0.19,0.03-0.308,0.438-0.155,0.425C14.284,15.081,14.451,14.643,14.284,14.668zM14.734,16.959c-0.052-0.064-0.181-0.271-0.323-0.219c-0.042,0.017-0.153,0.245-0.012,0.245C14.541,16.985,14.786,17.023,14.734,16.959zM14.85,16.805c0.232-0.013,0.167-0.245-0.013-0.257C14.786,16.544,14.618,16.818,14.85,16.805zM17.591,18.928c-0.193-0.039-0.244-0.102-0.45-0.205c-0.207-0.103-0.67-0.103-0.682-0.039c-0.014,0.064,0,0-0.155-0.05c-0.153-0.054-0.271,0-0.309-0.091c-0.038-0.091-0.128-0.117-0.244-0.002c-0.097,0.097-0.142,0.104,0.078,0.143c0.218,0.039,0.283,0.039,0.192,0.141c-0.09,0.104-0.154,0.233-0.077,0.244c0.077,0.015,0.309-0.05,0.334,0c0.026,0.054-0.051,0.064,0.207,0.105c0.258,0.037,0.309,0.128,0.359,0.178c0.051,0.052,0.206,0.22,0.104,0.22c-0.104,0-0.219,0.128-0.142,0.143c0.077,0.013,0.309-0.039,0.321,0c0.014,0.037,0.143,0.283,0.271,0.271c0.129-0.013,0.206-0.244,0.27-0.31c0.065-0.064,0.322-0.104,0.349,0.012c0.026,0.116,0.104,0.233,0.257,0.311c0.154,0.076,0.335,0.154,0.348,0.089c0.013-0.064-0.077-0.309-0.181-0.346c-0.103-0.041-0.282-0.259-0.282-0.348c0-0.091-0.155-0.117-0.232-0.182C17.849,19.147,17.784,18.967,17.591,18.928zM8.042,17.023c-0.084,0.037-0.155,0.476,0,0.527c0.154,0.052,0.244-0.205,0.193-0.271C8.183,17.218,8.158,16.973,8.042,17.023zM15.429,18.117c-0.118-0.05-0.335,0.424-0.181,0.463C15.403,18.62,15.518,18.156,15.429,18.117zM15.687,13.703c0.077,0,0.18-0.051,0.18-0.193c0-0.142,0.18,0,0.27-0.013s0.141-0.103,0.18-0.206c0.005-0.013,0.008-0.021,0.009-0.027c-0.003,0.024-0.001,0.093,0.095,0.117c0.154,0.038,0.205-0.064,0.205-0.103s0.283-0.103,0.336-0.142c0.051-0.038,0.258-0.103,0.27-0.154c0.013-0.051,0-0.348,0.064-0.373c0.064-0.026,0.154-0.026,0.052-0.206c-0.104-0.181-0.104-0.348-0.232-0.271c-0.095,0.057-0.038,0.284-0.115,0.438s-0.142,0.296-0.193,0.296s-0.321,0.103-0.399,0.18c-0.076,0.077-0.45-0.064-0.501,0c-0.052,0.064-0.154,0.141-0.219,0.193c-0.065,0.051-0.245,0.013-0.207,0.167C15.518,13.562,15.609,13.703,15.687,13.703zM17.449,12.056c0.18-0.013,0.348-0.064,0.348-0.064s0.271,0.013,0.232-0.116c-0.04-0.128-0.322-0.141-0.375-0.128c-0.051,0.013-0.142-0.142-0.244-0.116c-0.096,0.023-0.128,0.155-0.128,0.193c0,0.039-0.36,0.115-0.245,0.219C17.153,12.146,17.27,12.069,17.449,12.056zM13.91,19.058c0.104,0.064,0.296-0.219,0.349-0.13c0.051,0.091-0.013,0.13,0.076,0.246c0.091,0.114,0.258,0.102,0.258,0.102s-0.013-0.309-0.155-0.387c-0.142-0.077-0.232-0.166-0.064-0.141c0.167,0.026,0.257-0.039,0.219-0.114c-0.039-0.078-0.283-0.039-0.361-0.026s-0.193-0.052-0.193-0.052c-0.077,0.024-0.063,0.089-0.09,0.219C13.923,18.902,13.807,18.992,13.91,19.058zM20.924,21.618c-0.231-0.052-0.077,0.039,0,0.154c0.077,0.116,0.232,0.176,0.258,0.05C21.193,21.759,21.155,21.67,20.924,21.618zM21.915,24.744c-0.077,0.064,0,0.091-0.219,0.22c-0.22,0.13-0.49,0.271-0.541,0.386c-0.052,0.116,0.051,0.181,0.258,0.192c0.206,0.013,0.154,0.053,0.296-0.103s0.271-0.244,0.438-0.373c0.168-0.128,0.168-0.322,0.168-0.322s-0.181-0.178-0.193-0.141C22.1,24.665,21.992,24.681,21.915,24.744zM18.504,21.618c0.014-0.116-0.219-0.116-0.334-0.207c-0.116-0.089-0.128-0.359-0.193-0.515c-0.064-0.153-0.192-0.257-0.322-0.397c-0.128-0.143-0.192-0.465-0.23-0.438c-0.039,0.025-0.154,0.399-0.064,0.515c0.09,0.116-0.039,0.348-0.103,0.503c-0.065,0.153-0.22-0.026-0.349-0.104c-0.129-0.078-0.308-0.128-0.398-0.219c-0.09-0.091,0.155-0.335,0.091-0.426c-0.065-0.09-0.412-0.013-0.45-0.013c-0.039,0-0.116-0.128-0.194-0.128c-0.077,0-0.064,0.258-0.064,0.258s-0.078-0.091-0.193-0.207c-0.117-0.115,0.012,0.077-0.103,0.193c-0.117,0.117-0.079,0.078-0.129,0.206c-0.051,0.129-0.167,0.077-0.283-0.052c-0.116-0.128-0.179-0.037-0.258,0c-0.077,0.039-0.141,0.259-0.18,0.309c-0.039,0.052-0.309,0.117-0.374,0.182c-0.064,0.062-0.09,0.27-0.09,0.322c0,0.05-0.271,0.023-0.361,0.089c-0.09,0.064-0.23,0.025-0.321,0.025c-0.09,0-0.399,0.244-0.502,0.308c-0.103,0.066-0.103,0.298-0.051,0.362c0.051,0.063,0.154,0.219,0.09,0.244c-0.064,0.026-0.104,0.206,0.051,0.359c0.154,0.155,0.103,0.194,0.115,0.271c0.014,0.077,0.078,0.104,0.181,0.232c0.102,0.128-0.181,0.231-0.219,0.31c-0.039,0.076,0.091,0.192,0.167,0.257c0.077,0.063,0.271,0.026,0.386-0.013c0.117-0.039,0.245-0.143,0.321-0.155c0.079-0.013,0.438-0.026,0.438-0.026s0.129-0.192,0.219-0.296c0.089-0.102,0.372-0.013,0.372-0.013s0.117-0.076,0.426-0.141c0.309-0.065,0.179,0.064,0.296,0.104c0.115,0.037,0.27,0.062,0.359,0.128c0.09,0.064,0,0.218-0.012,0.283c-0.014,0.064,0.219,0.038,0.23-0.026c0.014-0.064,0.077-0.128,0.207-0.205c0.128-0.078,0.025,0.114,0.076,0.231c0.052,0.116,0.129-0.157,0.129-0.026c0,0.039,0.039,0.078,0.051,0.116c0.014,0.039,0.181,0.052,0.181,0.18c0,0.13,0,0.207,0.039,0.231c0.038,0.026,0.244,0,0.335,0.155c0.089,0.154,0.154,0.013,0.205-0.052c0.052-0.064,0.231,0.026,0.283,0.078c0.052,0.05,0.193-0.104,0.387-0.155c0.192-0.051,0.167-0.039,0.219-0.115c0.051-0.078,0.09-0.283,0.205-0.438c0.115-0.153,0.271-0.424,0.271-0.631c0-0.206-0.014-0.682-0.155-0.899C18.761,21.953,18.492,21.733,18.504,21.618zM18.029,24.77c-0.065-0.013-0.207-0.062-0.207-0.062c-0.142,0.141,0.142,0.141,0.104,0.283c-0.039,0.141,0.193,0.089,0.257,0.064c0.063-0.027,0.22-0.323,0.193-0.399C18.351,24.577,18.093,24.783,18.029,24.77zM22.803,24.178c-0.052,0-0.077,0.064-0.192,0c-0.117-0.063-0.091-0.037-0.168-0.167c-0.077-0.127-0.091-0.296-0.219-0.23c-0.051,0.025,0,0.168,0.051,0.218c0.053,0.052,0.077,0.231,0.064,0.283c-0.012,0.052-0.231,0.116-0.129,0.18c0.104,0.064,0.297,0,0.271,0.078c-0.025,0.077-0.129,0.179-0.013,0.205c0.115,0.025,0.154-0.089,0.207-0.178c0.051-0.093,0.089-0.169,0.179-0.221C22.944,24.294,22.854,24.178,22.803,24.178zM22.815,21.18c0.168,0.064,0.464-0.231,0.347-0.27C23.047,20.871,22.815,21.18,22.815,21.18zM13.923,19.906c-0.029,0.115,0.193,0.167,0.206,0.039C14.141,19.816,13.949,19.803,13.923,19.906zM14.27,16.47c-0.064,0.065-0.257,0.193-0.283,0.31c-0.025,0.115,0.309-0.182,0.399-0.296c0.091-0.117,0.27-0.052,0.308-0.117c0.04-0.063,0.04-0.063,0.04-0.063s-0.142-0.025-0.257-0.063c-0.117-0.039-0.258,0.102-0.193-0.104c0.064-0.206,0.257-0.167,0.219-0.322c-0.039-0.154-0.168-0.193-0.207-0.193c-0.09,0,0.013,0.141-0.116,0.231c-0.128,0.09-0.271,0.128-0.193,0.283C14.064,16.29,14.334,16.405,14.27,16.47zM13.254,19.751c0.013-0.076-0.142-0.192-0.206-0.192c-0.065,0-0.386-0.077-0.386-0.077c-0.058,0.023-0.135,0.045-0.158,0.077c-0.007-0.011-0.022-0.024-0.049-0.039c-0.142-0.075-0.309,0-0.361-0.102c-0.05-0.104-0.127-0.104-0.179-0.039c-0.094,0.117,0.025,0.206,0.063,0.231c0.038,0.024,0.181,0.052,0.309,0.039c0.08-0.008,0.181-0.027,0.21-0.059c0.004,0.014,0.016,0.027,0.035,0.044c0.103,0.092,0.167,0.13,0.321,0.116C13.009,19.74,13.241,19.829,13.254,19.751zM12.881,18.992c0.065,0,0.193,0,0.283,0.026c0.09,0.025,0.386,0.05,0.373-0.064c-0.013-0.115-0.038-0.297,0.089-0.411c0.13-0.117,0.257-0.18,0.193-0.348c-0.063-0.167-0.193-0.271-0.103-0.349c0.09-0.076,0.192-0.102,0.192-0.166c0-0.065-0.217,0.18-0.244-0.246c-0.005-0.091-0.206,0.025-0.219,0.116c-0.012,0.091,0.142,0.167-0.103,0.167c-0.245,0-0.257,0.194-0.309,0.232c-0.052,0.039-0.103,0.051-0.207,0.076c-0.102,0.026-0.127,0.13-0.153,0.194c-0.025,0.063-0.206-0.116-0.257-0.064c-0.051,0.052-0.013,0.296,0.077,0.501C12.585,18.863,12.816,18.992,12.881,18.992zM11.979,18.928c0.065-0.077,0.038-0.192-0.063-0.18c-0.103,0.013-0.193-0.168-0.36-0.283c-0.168-0.114-0.296-0.194-0.451-0.36c-0.154-0.167-0.347-0.271-0.45-0.359c-0.104-0.091-0.257-0.13-0.322-0.116c-0.159,0.032,0.231,0.309,0.271,0.346c0.039,0.041,0.387,0.335,0.387,0.478s0.231,0.476,0.296,0.527c0.064,0.052,0.385,0.244,0.437,0.348c0.052,0.103,0.167,0.13,0.167-0.013C11.89,19.174,11.916,19.006,11.979,18.928zM11.002,17.474c0.064,0.232,0.193,0.464,0.244,0.555c0.052,0.089,0.271,0.217,0.348,0.281c0.077,0.064,0.192-0.024,0.143-0.102c-0.052-0.078-0.155-0.192-0.167-0.283c-0.013-0.091-0.078-0.233-0.181-0.387c-0.102-0.153-0.192-0.192-0.257-0.295c-0.064-0.104-0.296-0.297-0.296-0.297c-0.102,0.013-0.102,0.205-0.051,0.271C10.834,17.28,10.938,17.243,11.002,17.474z", + "raph_globeAlt": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM27.436,17.39c0.001,0.002,0.004,0.002,0.005,0.004c-0.022,0.187-0.054,0.37-0.085,0.554c-0.015-0.012-0.034-0.025-0.047-0.036c-0.103-0.09-0.254-0.128-0.318-0.115c-0.157,0.032,0.229,0.305,0.267,0.342c0.009,0.009,0.031,0.03,0.062,0.058c-1.029,5.312-5.709,9.338-11.319,9.338c-4.123,0-7.736-2.18-9.776-5.441c0.123-0.016,0.24-0.016,0.28-0.076c0.051-0.077,0.102-0.241,0.178-0.331c0.077-0.089,0.165-0.229,0.127-0.292c-0.039-0.064,0.101-0.344,0.088-0.419c-0.013-0.076-0.127-0.256,0.064-0.407s0.394-0.382,0.407-0.444c0.012-0.063,0.166-0.331,0.152-0.458c-0.012-0.127-0.152-0.28-0.24-0.318c-0.09-0.037-0.28-0.05-0.356-0.151c-0.077-0.103-0.292-0.203-0.368-0.178c-0.076,0.025-0.204,0.05-0.305-0.015c-0.102-0.062-0.267-0.139-0.33-0.189c-0.065-0.05-0.229-0.088-0.305-0.088c-0.077,0-0.065-0.052-0.178,0.101c-0.114,0.153,0,0.204-0.204,0.177c-0.204-0.023,0.025-0.036,0.141-0.189c0.113-0.152-0.013-0.242-0.141-0.203c-0.126,0.038-0.038,0.115-0.241,0.153c-0.203,0.036-0.203-0.09-0.076-0.115s0.355-0.139,0.355-0.19c0-0.051-0.025-0.191-0.127-0.191s-0.077-0.126-0.229-0.291c-0.092-0.101-0.196-0.164-0.299-0.204c-0.09-0.579-0.15-1.167-0.15-1.771c0-2.844,1.039-5.446,2.751-7.458c0.024-0.02,0.048-0.034,0.069-0.036c0.084-0.009,0.31-0.025,0.51-0.059c0.202-0.034,0.418-0.161,0.489-0.153c0.069,0.008,0.241,0.008,0.186-0.042C8.417,8.2,8.339,8.082,8.223,8.082S8.215,7.896,8.246,7.896c0.03,0,0.186,0.025,0.178,0.11C8.417,8.091,8.471,8.2,8.625,8.167c0.156-0.034,0.132-0.162,0.102-0.195C8.695,7.938,8.672,7.853,8.642,7.794c-0.031-0.06-0.023-0.136,0.14-0.153C8.944,7.625,9.168,7.708,9.16,7.573s0-0.28,0.046-0.356C9.253,7.142,9.354,7.09,9.299,7.065C9.246,7.04,9.176,7.099,9.121,6.972c-0.054-0.127,0.047-0.22,0.108-0.271c0.02-0.015,0.067-0.06,0.124-0.112C11.234,5.257,13.524,4.466,16,4.466c3.213,0,6.122,1.323,8.214,3.45c-0.008,0.022-0.01,0.052-0.031,0.056c-0.077,0.013-0.166,0.063-0.179-0.051c-0.013-0.114-0.013-0.331-0.102-0.203c-0.089,0.127-0.127,0.127-0.127,0.191c0,0.063,0.076,0.127,0.051,0.241C23.8,8.264,23.8,8.341,23.84,8.341c0.036,0,0.126-0.115,0.239-0.141c0.116-0.025,0.319-0.088,0.332,0.026c0.013,0.115,0.139,0.152,0.013,0.203c-0.128,0.051-0.267,0.026-0.293-0.051c-0.025-0.077-0.114-0.077-0.203-0.013c-0.088,0.063-0.279,0.292-0.279,0.292s-0.306,0.139-0.343,0.114c-0.04-0.025,0.101-0.165,0.203-0.228c0.102-0.064,0.178-0.204,0.14-0.242c-0.038-0.038-0.088-0.279-0.063-0.343c0.025-0.063,0.139-0.152,0.013-0.216c-0.127-0.063-0.217-0.14-0.318-0.178s-0.216,0.152-0.305,0.204c-0.089,0.051-0.076,0.114-0.191,0.127c-0.114,0.013-0.189,0.165,0,0.254c0.191,0.089,0.255,0.152,0.204,0.204c-0.051,0.051-0.267-0.025-0.267-0.025s-0.165-0.076-0.268-0.076c-0.101,0-0.229-0.063-0.33-0.076c-0.102-0.013-0.306-0.013-0.355,0.038c-0.051,0.051-0.179,0.203-0.28,0.152c-0.101-0.051-0.101-0.102-0.241-0.051c-0.14,0.051-0.279-0.038-0.355,0.038c-0.077,0.076-0.013,0.076-0.255,0c-0.241-0.076-0.189,0.051-0.419,0.089s-0.368-0.038-0.432,0.038c-0.064,0.077-0.153,0.217-0.19,0.127c-0.038-0.088,0.126-0.241,0.062-0.292c-0.062-0.051-0.33-0.025-0.367,0.013c-0.039,0.038-0.014,0.178,0.011,0.229c0.026,0.05,0.064,0.254-0.011,0.216c-0.077-0.038-0.064-0.166-0.141-0.152c-0.076,0.013-0.165,0.051-0.203,0.077c-0.038,0.025-0.191,0.025-0.229,0.076c-0.037,0.051,0.014,0.191-0.051,0.203c-0.063,0.013-0.114,0.064-0.254-0.025c-0.14-0.089-0.14-0.038-0.178-0.012c-0.038,0.025-0.216,0.127-0.229,0.012c-0.013-0.114,0.025-0.152-0.089-0.229c-0.115-0.076-0.026-0.076,0.127-0.025c0.152,0.05,0.343,0.075,0.622-0.013c0.28-0.089,0.395-0.127,0.28-0.178c-0.115-0.05-0.229-0.101-0.406-0.127c-0.179-0.025-0.42-0.025-0.7-0.127c-0.279-0.102-0.343-0.14-0.457-0.165c-0.115-0.026-0.813-0.14-1.132-0.089c-0.317,0.051-1.193,0.28-1.245,0.318s-0.128,0.19-0.292,0.318c-0.165,0.127-0.47,0.419-0.712,0.47c-0.241,0.051-0.521,0.254-0.521,0.305c0,0.051,0.101,0.242,0.076,0.28c-0.025,0.038,0.05,0.229,0.191,0.28c0.139,0.05,0.381,0.038,0.393-0.039c0.014-0.076,0.204-0.241,0.217-0.127c0.013,0.115,0.14,0.292,0.114,0.368c-0.025,0.077,0,0.153,0.09,0.14c0.088-0.012,0.559-0.114,0.559-0.114s0.153-0.064,0.127-0.166c-0.026-0.101,0.166-0.241,0.203-0.279c0.038-0.038,0.178-0.191,0.014-0.241c-0.167-0.051-0.293-0.064-0.115-0.216s0.292,0,0.521-0.229c0.229-0.229-0.051-0.292,0.191-0.305c0.241-0.013,0.496-0.025,0.444,0.051c-0.05,0.076-0.342,0.242-0.508,0.318c-0.166,0.077-0.14,0.216-0.076,0.292c0.063,0.076,0.09,0.254,0.204,0.229c0.113-0.025,0.254-0.114,0.38-0.101c0.128,0.012,0.383-0.013,0.42-0.013c0.039,0,0.216,0.178,0.114,0.203c-0.101,0.025-0.229,0.013-0.445,0.025c-0.215,0.013-0.456,0.013-0.456,0.051c0,0.039,0.292,0.127,0.19,0.191c-0.102,0.063-0.203-0.013-0.331-0.026c-0.127-0.012-0.203,0.166-0.241,0.267c-0.039,0.102,0.063,0.28-0.127,0.216c-0.191-0.063-0.331-0.063-0.381-0.038c-0.051,0.025-0.203,0.076-0.331,0.114c-0.126,0.038-0.076-0.063-0.242-0.063c-0.164,0-0.164,0-0.164,0l-0.103,0.013c0,0-0.101-0.063-0.114-0.165c-0.013-0.102,0.05-0.216-0.013-0.241c-0.064-0.026-0.292,0.012-0.33,0.088c-0.038,0.076-0.077,0.216-0.026,0.28c0.052,0.063,0.204,0.19,0.064,0.152c-0.14-0.038-0.317-0.051-0.419,0.026c-0.101,0.076-0.279,0.241-0.279,0.241s-0.318,0.025-0.318,0.102c0,0.077,0,0.178-0.114,0.191c-0.115,0.013-0.268,0.05-0.42,0.076c-0.153,0.025-0.139,0.088-0.317,0.102s-0.204,0.089-0.038,0.114c0.165,0.025,0.418,0.127,0.431,0.241c0.014,0.114-0.013,0.242-0.076,0.356c-0.043,0.079-0.305,0.026-0.458,0.026c-0.152,0-0.456-0.051-0.584,0c-0.127,0.051-0.102,0.305-0.064,0.419c0.039,0.114-0.012,0.178-0.063,0.216c-0.051,0.038-0.065,0.152,0,0.204c0.063,0.051,0.114,0.165,0.166,0.178c0.051,0.013,0.215-0.038,0.279,0.025c0.064,0.064,0.127,0.216,0.165,0.178c0.039-0.038,0.089-0.203,0.153-0.166c0.064,0.039,0.216-0.012,0.331-0.025s0.177-0.14,0.292-0.204c0.114-0.063,0.05-0.063,0.013-0.14c-0.038-0.076,0.114-0.165,0.204-0.254c0.088-0.089,0.253-0.013,0.292-0.115c0.038-0.102,0.051-0.279,0.151-0.267c0.103,0.013,0.243,0.076,0.331,0.076c0.089,0,0.279-0.14,0.332-0.165c0.05-0.025,0.241-0.013,0.267,0.102c0.025,0.114,0.241,0.254,0.292,0.279c0.051,0.025,0.381,0.127,0.433,0.165c0.05,0.038,0.126,0.153,0.152,0.254c0.025,0.102,0.114,0.102,0.128,0.013c0.012-0.089-0.065-0.254,0.025-0.242c0.088,0.013,0.191-0.026,0.191-0.026s-0.243-0.165-0.331-0.203c-0.088-0.038-0.255-0.114-0.331-0.241c-0.076-0.127-0.267-0.153-0.254-0.279c0.013-0.127,0.191-0.051,0.292,0.051c0.102,0.102,0.356,0.241,0.445,0.33c0.088,0.089,0.229,0.127,0.267,0.242c0.039,0.114,0.152,0.241,0.19,0.292c0.038,0.051,0.165,0.331,0.204,0.394c0.038,0.063,0.165-0.012,0.229-0.063c0.063-0.051,0.179-0.076,0.191-0.178c0.013-0.102-0.153-0.178-0.203-0.216c-0.051-0.038,0.127-0.076,0.191-0.127c0.063-0.05,0.177-0.14,0.228-0.063c0.051,0.077,0.026,0.381,0.051,0.432c0.025,0.051,0.279,0.127,0.331,0.191c0.05,0.063,0.267,0.089,0.304,0.051c0.039-0.038,0.242,0.026,0.294,0.038c0.049,0.013,0.202-0.025,0.304-0.05c0.103-0.025,0.204-0.102,0.191,0.063c-0.013,0.165-0.051,0.419-0.179,0.546c-0.127,0.127-0.076,0.191-0.202,0.191c-0.06,0-0.113,0-0.156,0.021c-0.041-0.065-0.098-0.117-0.175-0.097c-0.152,0.038-0.344,0.038-0.47,0.19c-0.128,0.153-0.178,0.165-0.204,0.114c-0.025-0.051,0.369-0.267,0.317-0.331c-0.05-0.063-0.355-0.038-0.521-0.038c-0.166,0-0.305-0.102-0.433-0.127c-0.126-0.025-0.292,0.127-0.418,0.254c-0.128,0.127-0.216,0.038-0.331,0.038c-0.115,0-0.331-0.165-0.331-0.165s-0.216-0.089-0.305-0.089c-0.088,0-0.267-0.165-0.318-0.165c-0.05,0-0.19-0.115-0.088-0.166c0.101-0.05,0.202,0.051,0.101-0.229c-0.101-0.279-0.33-0.216-0.419-0.178c-0.088,0.039-0.724,0.025-0.775,0.025c-0.051,0-0.419,0.127-0.533,0.178c-0.116,0.051-0.318,0.115-0.369,0.14c-0.051,0.025-0.318-0.051-0.433,0.013c-0.151,0.084-0.291,0.216-0.33,0.216c-0.038,0-0.153,0.089-0.229,0.28c-0.077,0.19,0.013,0.355-0.128,0.419c-0.139,0.063-0.394,0.204-0.495,0.305c-0.102,0.101-0.229,0.458-0.355,0.623c-0.127,0.165,0,0.317,0.025,0.419c0.025,0.101,0.114,0.292-0.025,0.471c-0.14,0.178-0.127,0.266-0.191,0.279c-0.063,0.013,0.063,0.063,0.088,0.19c0.025,0.128-0.114,0.255,0.128,0.369c0.241,0.113,0.355,0.217,0.418,0.367c0.064,0.153,0.382,0.407,0.382,0.407s0.229,0.205,0.344,0.293c0.114,0.089,0.152,0.038,0.177-0.05c0.025-0.09,0.178-0.104,0.355-0.104c0.178,0,0.305,0.04,0.483,0.014c0.178-0.025,0.356-0.141,0.42-0.166c0.063-0.025,0.279-0.164,0.443-0.063c0.166,0.103,0.141,0.241,0.23,0.332c0.088,0.088,0.24,0.037,0.355-0.051c0.114-0.09,0.064-0.052,0.203,0.025c0.14,0.075,0.204,0.151,0.077,0.267c-0.128,0.113-0.051,0.293-0.128,0.47c-0.076,0.178-0.063,0.203,0.077,0.278c0.14,0.076,0.394,0.548,0.47,0.638c0.077,0.088-0.025,0.342,0.064,0.495c0.089,0.151,0.178,0.254,0.077,0.331c-0.103,0.075-0.28,0.216-0.292,0.47s0.051,0.431,0.102,0.521s0.177,0.331,0.241,0.419c0.064,0.089,0.14,0.305,0.152,0.445c0.013,0.14-0.024,0.306,0.039,0.381c0.064,0.076,0.102,0.191,0.216,0.292c0.115,0.103,0.152,0.318,0.152,0.318s0.039,0.089,0.051,0.229c0.012,0.14,0.025,0.228,0.152,0.292c0.126,0.063,0.215,0.076,0.28,0.013c0.063-0.063,0.381-0.077,0.546-0.063c0.165,0.013,0.355-0.075,0.521-0.19s0.407-0.419,0.496-0.508c0.089-0.09,0.292-0.255,0.268-0.356c-0.025-0.101-0.077-0.203,0.024-0.254c0.102-0.052,0.344-0.152,0.356-0.229c0.013-0.077-0.09-0.395-0.115-0.457c-0.024-0.064,0.064-0.18,0.165-0.306c0.103-0.128,0.421-0.216,0.471-0.267c0.051-0.053,0.191-0.267,0.217-0.433c0.024-0.167-0.051-0.369,0-0.457c0.05-0.09,0.013-0.165-0.103-0.268c-0.114-0.102-0.089-0.407-0.127-0.457c-0.037-0.051-0.013-0.319,0.063-0.345c0.076-0.023,0.242-0.279,0.344-0.393c0.102-0.114,0.394-0.47,0.534-0.496c0.139-0.025,0.355-0.229,0.368-0.343c0.013-0.115,0.38-0.547,0.394-0.635c0.013-0.09,0.166-0.42,0.102-0.497c-0.062-0.076-0.559,0.115-0.622,0.141c-0.064,0.025-0.241,0.127-0.446,0.113c-0.202-0.013-0.114-0.177-0.127-0.254c-0.012-0.076-0.228-0.368-0.279-0.381c-0.051-0.012-0.203-0.166-0.267-0.317c-0.063-0.153-0.152-0.343-0.254-0.458c-0.102-0.114-0.165-0.38-0.268-0.559c-0.101-0.178-0.189-0.407-0.279-0.572c-0.021-0.041-0.045-0.079-0.067-0.117c0.118-0.029,0.289-0.082,0.31-0.009c0.024,0.088,0.165,0.279,0.19,0.419s0.165,0.089,0.178,0.216c0.014,0.128,0.14,0.433,0.19,0.47c0.052,0.038,0.28,0.242,0.318,0.318c0.038,0.076,0.089,0.178,0.127,0.369c0.038,0.19,0.076,0.444,0.179,0.482c0.102,0.038,0.444-0.064,0.508-0.102s0.482-0.242,0.635-0.255c0.153-0.012,0.179-0.115,0.368-0.152c0.191-0.038,0.331-0.177,0.458-0.28c0.127-0.101,0.28-0.355,0.33-0.444c0.052-0.088,0.179-0.152,0.115-0.253c-0.063-0.103-0.331-0.254-0.433-0.268c-0.102-0.012-0.089-0.178-0.152-0.178s-0.051,0.088-0.178,0.153c-0.127,0.063-0.255,0.19-0.344,0.165s0.026-0.089-0.113-0.203s-0.192-0.14-0.192-0.228c0-0.089-0.278-0.255-0.304-0.382c-0.026-0.127,0.19-0.305,0.254-0.19c0.063,0.114,0.115,0.292,0.279,0.368c0.165,0.076,0.318,0.204,0.395,0.229c0.076,0.025,0.267-0.14,0.33-0.114c0.063,0.024,0.191,0.253,0.306,0.292c0.113,0.038,0.495,0.051,0.559,0.051s0.33,0.013,0.381-0.063c0.051-0.076,0.089-0.076,0.153-0.076c0.062,0,0.177,0.229,0.267,0.254c0.089,0.025,0.254,0.013,0.241,0.179c-0.012,0.164,0.076,0.305,0.165,0.317c0.09,0.012,0.293-0.191,0.293-0.191s0,0.318-0.012,0.433c-0.014,0.113,0.139,0.534,0.139,0.534s0.19,0.393,0.241,0.482s0.267,0.355,0.267,0.47c0,0.115,0.025,0.293,0.103,0.293c0.076,0,0.152-0.203,0.24-0.331c0.091-0.126,0.116-0.305,0.153-0.432c0.038-0.127,0.038-0.356,0.038-0.444c0-0.09,0.075-0.166,0.255-0.242c0.178-0.076,0.304-0.292,0.456-0.407c0.153-0.115,0.141-0.305,0.446-0.305c0.305,0,0.278,0,0.355-0.077c0.076-0.076,0.151-0.127,0.19,0.013c0.038,0.14,0.254,0.343,0.292,0.394c0.038,0.052,0.114,0.191,0.103,0.344c-0.013,0.152,0.012,0.33,0.075,0.33s0.191-0.216,0.191-0.216s0.279-0.189,0.267,0.013c-0.014,0.203,0.025,0.419,0.025,0.545c0,0.053,0.042,0.135,0.088,0.21c-0.005,0.059-0.004,0.119-0.009,0.178C27.388,17.153,27.387,17.327,27.436,17.39zM20.382,12.064c0.076,0.05,0.102,0.127,0.152,0.203c0.052,0.076,0.14,0.05,0.203,0.114c0.063,0.064-0.178,0.14-0.075,0.216c0.101,0.077,0.151,0.381,0.165,0.458c0.013,0.076-0.279,0.114-0.369,0.102c-0.089-0.013-0.354-0.102-0.445-0.127c-0.089-0.026-0.139-0.343-0.025-0.331c0.116,0.013,0.141-0.025,0.267-0.139c0.128-0.115-0.189-0.166-0.278-0.191c-0.089-0.025-0.268-0.305-0.331-0.394c-0.062-0.089-0.014-0.228,0.141-0.331c0.076-0.051,0.279,0.063,0.381,0c0.101-0.063,0.203-0.14,0.241-0.165c0.039-0.025,0.293,0.038,0.33,0.114c0.039,0.076,0.191,0.191,0.141,0.229c-0.052,0.038-0.281,0.076-0.356,0c-0.075-0.077-0.255,0.012-0.268,0.152C20.242,12.115,20.307,12.013,20.382,12.064zM16.875,12.28c-0.077-0.025,0.025-0.178,0.102-0.229c0.075-0.051,0.164-0.178,0.241-0.305c0.076-0.127,0.178-0.14,0.241-0.127c0.063,0.013,0.203,0.241,0.241,0.318c0.038,0.076,0.165-0.026,0.217-0.051c0.05-0.025,0.127-0.102,0.14-0.165s0.127-0.102,0.254-0.102s0.013,0.102-0.076,0.127c-0.09,0.025-0.038,0.077,0.113,0.127c0.153,0.051,0.293,0.191,0.459,0.279c0.165,0.089,0.19,0.267,0.088,0.292c-0.101,0.025-0.406,0.051-0.521,0.038c-0.114-0.013-0.254-0.127-0.419-0.153c-0.165-0.025-0.369-0.013-0.433,0.077s-0.292,0.05-0.395,0.05c-0.102,0-0.228,0.127-0.253,0.077C16.875,12.534,16.951,12.306,16.875,12.28zM17.307,9.458c0.063-0.178,0.419,0.038,0.355,0.127C17.599,9.675,17.264,9.579,17.307,9.458zM17.802,18.584c0.063,0.102-0.14,0.431-0.254,0.407c-0.113-0.027-0.076-0.318-0.038-0.382C17.548,18.545,17.769,18.529,17.802,18.584zM13.189,12.674c0.025-0.051-0.039-0.153-0.127-0.013C13.032,12.71,13.164,12.725,13.189,12.674zM20.813,8.035c0.141,0.076,0.339,0.107,0.433,0.013c0.076-0.076,0.013-0.204-0.05-0.216c-0.064-0.013-0.104-0.115,0.062-0.203c0.165-0.089,0.343-0.204,0.534-0.229c0.19-0.025,0.622-0.038,0.774,0c0.152,0.039,0.382-0.166,0.445-0.254s-0.203-0.152-0.279-0.051c-0.077,0.102-0.444,0.076-0.521,0.051c-0.076-0.025-0.686,0.102-0.812,0.102c-0.128,0-0.179,0.152-0.356,0.229c-0.179,0.076-0.42,0.191-0.509,0.229c-0.088,0.038-0.177,0.19-0.101,0.216C20.509,7.947,20.674,7.959,20.813,8.035zM14.142,12.674c0.064-0.089-0.051-0.217-0.114-0.217c-0.12,0-0.178,0.191-0.103,0.254C14.002,12.776,14.078,12.763,14.142,12.674zM14.714,13.017c0.064,0.025,0.114,0.102,0.165,0.114c0.052,0.013,0.217,0,0.167-0.127s-0.167-0.127-0.204-0.127c-0.038,0-0.203-0.038-0.267,0C14.528,12.905,14.65,12.992,14.714,13.017zM11.308,10.958c0.101,0.013,0.217-0.063,0.305-0.101c0.088-0.038,0.216-0.114,0.216-0.229c0-0.114-0.025-0.216-0.077-0.267c-0.051-0.051-0.14-0.064-0.216-0.051c-0.115,0.02-0.127,0.14-0.203,0.14c-0.076,0-0.165,0.025-0.14,0.114s0.077,0.152,0,0.19C11.117,10.793,11.205,10.946,11.308,10.958zM11.931,10.412c0.127,0.051,0.394,0.102,0.292,0.153c-0.102,0.051-0.28,0.19-0.305,0.267s0.216,0.153,0.216,0.153s-0.077,0.089-0.013,0.114c0.063,0.025,0.102-0.089,0.203-0.089c0.101,0,0.304,0.063,0.406,0.063c0.103,0,0.267-0.14,0.254-0.229c-0.013-0.089-0.14-0.229-0.254-0.28c-0.113-0.051-0.241-0.28-0.317-0.331c-0.076-0.051,0.076-0.178-0.013-0.267c-0.09-0.089-0.153-0.076-0.255-0.14c-0.102-0.063-0.191,0.013-0.254,0.089c-0.063,0.076-0.14-0.013-0.217,0.012c-0.102,0.035-0.063,0.166-0.012,0.229C11.714,10.221,11.804,10.361,11.931,10.412zM24.729,17.198c-0.083,0.037-0.153,0.47,0,0.521c0.152,0.052,0.241-0.202,0.191-0.267C24.868,17.39,24.843,17.147,24.729,17.198zM20.114,20.464c-0.159-0.045-0.177,0.166-0.304,0.306c-0.128,0.141-0.267,0.254-0.317,0.241c-0.052-0.013-0.331,0.089-0.242,0.279c0.089,0.191,0.076,0.382-0.013,0.472c-0.089,0.088,0.076,0.342,0.052,0.482c-0.026,0.139,0.037,0.229,0.215,0.229s0.242-0.064,0.318-0.229c0.076-0.166,0.088-0.331,0.164-0.47c0.077-0.141,0.141-0.434,0.179-0.51c0.038-0.075,0.114-0.316,0.102-0.457C20.254,20.669,20.204,20.489,20.114,20.464zM10.391,8.802c-0.069-0.06-0.229-0.102-0.306-0.11c-0.076-0.008-0.152,0.06-0.321,0.06c-0.168,0-0.279,0.067-0.347,0C9.349,8.684,9.068,8.65,9.042,8.692C9.008,8.749,8.941,8.751,9.008,8.87c0.069,0.118,0.12,0.186,0.179,0.178s0.262-0.017,0.288,0.051C9.5,9.167,9.569,9.226,9.712,9.184c0.145-0.042,0.263-0.068,0.296-0.119c0.033-0.051,0.263-0.059,0.263-0.059S10.458,8.861,10.391,8.802z", + "raph_globe": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM19.158,23.269c-0.079,0.064-0.183,0.13-0.105,0.207c0.078,0.078-0.09,0.131-0.09,0.17s0.104,0.246,0.052,0.336c-0.052,0.092-0.091,0.223-0.13,0.301c-0.039,0.077-0.131,0.155-0.104,0.272c0.025,0.116-0.104,0.077-0.104,0.194c0,0.116,0.116,0.065,0.09,0.208c-0.025,0.144-0.09,0.183-0.09,0.285c0,0.104,0.064,0.247,0.064,0.286s-0.064,0.17-0.155,0.272c-0.092,0.104-0.155,0.17-0.144,0.233c0.014,0.065,0.104,0.144,0.091,0.184c-0.013,0.037-0.129,0.168-0.116,0.259c0.014,0.09,0.129,0.053,0.155,0.116c0.026,0.065-0.155,0.118-0.078,0.183c0.078,0.064,0.183,0.051,0.156,0.208c-0.019,0.112,0.064,0.163,0.126,0.198c-0.891,0.221-1.818,0.352-2.777,0.352C9.639,27.533,4.466,22.36,4.466,16c0-2.073,0.557-4.015,1.518-5.697c0.079-0.042,0.137-0.069,0.171-0.062c0.065,0.013,0.079,0.104,0.183,0.13c0.104,0.026,0.195-0.078,0.26-0.117c0.064-0.039,0.116-0.195,0.051-0.182c-0.065,0.013-0.234,0-0.234,0s0.183-0.104,0.183-0.169s0.025-0.169,0.129-0.208C6.83,9.655,6.83,9.681,6.765,9.837C6.7,9.993,6.896,9.928,6.973,9.863s0.13-0.013,0.272-0.104c0.143-0.091,0.143-0.143,0.221-0.143c0.078,0,0.221,0.143,0.299,0.091c0.077-0.052,0.299,0.065,0.429,0.065c0.129,0,0.545,0.169,0.624,0.169c0.078,0,0.312,0.09,0.325,0.259c0.013,0.169,0.09,0.156,0.168,0.156s0.26,0.065,0.26,0.13c0,0.065-0.052,0.325,0.078,0.39c0.129,0.064,0.247,0.169,0.299,0.143c0.052-0.026,0-0.233-0.064-0.26c-0.065-0.026-0.027-0.117-0.052-0.169c-0.026-0.051,0.078-0.051,0.117,0.039c0.039,0.091,0.143,0.26,0.208,0.26c0.064,0,0.208,0.156,0.168,0.247c-0.039,0.091,0.039,0.221,0.156,0.221c0.116,0,0.26,0.182,0.312,0.195c0.052,0.013,0.117,0.078,0.117,0.117c0,0.04,0.065,0.26,0.065,0.351c0,0.09-0.04,0.454-0.053,0.597s0.104,0.39,0.234,0.52c0.129,0.13,0.246,0.377,0.324,0.429c0.079,0.052,0.13,0.195,0.247,0.182c0.117-0.013,0.195,0.078,0.299,0.26c0.104,0.182,0.208,0.48,0.286,0.506c0.078,0.026,0.208,0.117,0.142,0.182c-0.064,0.064-0.168,0.208-0.051,0.208c0.117,0,0.156-0.065,0.247,0.053c0.09,0.116,0.208,0.181,0.194,0.26c-0.013,0.077,0.104,0.103,0.156,0.116c0.052,0.013,0.169,0.247,0.286,0.143c0.117-0.104-0.155-0.259-0.234-0.326c-0.078-0.064,0-0.207-0.182-0.35c-0.182-0.143-0.156-0.247-0.286-0.351c-0.13-0.104-0.233-0.195-0.104-0.286c0.13-0.091,0.143,0.091,0.195,0.208c0.052,0.116,0.324,0.351,0.441,0.454c0.117,0.104,0.326,0.468,0.39,0.468s0.247,0.208,0.247,0.208s0.103,0.168,0.064,0.22c-0.039,0.052,0.053,0.247,0.144,0.299c0.09,0.052,0.455,0.22,0.507,0.247c0.052,0.027,0.155,0.221,0.299,0.221c0.142,0,0.247,0.014,0.286,0.053c0.039,0.038,0.155,0.194,0.234,0.104c0.078-0.092,0.09-0.131,0.208-0.131c0.117,0,0.168,0.091,0.233,0.156c0.065,0.065,0.247,0.235,0.338,0.222c0.091-0.013,0.208,0.104,0.273,0.064s0.169,0.025,0.22,0.052c0.054,0.026,0.234,0.118,0.222,0.272c-0.013,0.157,0.103,0.195,0.182,0.234c0.078,0.039,0.182,0.13,0.248,0.195c0.064,0.063,0.206,0.077,0.246,0.116c0.039,0.039,0.065,0.117,0.182,0.052c0.116-0.064,0.092-0.181,0.092-0.181s0.129-0.026,0.194,0.026c0.064,0.05,0.104,0.22,0.144,0.246c0.038,0.026,0.115,0.221,0.063,0.362c-0.051,0.145-0.038,0.286-0.091,0.286c-0.052,0-0.116,0.17-0.195,0.209c-0.076,0.039-0.285,0.221-0.272,0.286c0.013,0.063,0.131,0.258,0.104,0.35c-0.025,0.091-0.194,0.195-0.154,0.338c0.038,0.144,0.312,0.183,0.323,0.312c0.014,0.131,0.209,0.417,0.235,0.546c0.025,0.13,0.246,0.272,0.246,0.453c0,0.184,0.312,0.3,0.377,0.312c0.063,0.013,0.182,0.131,0.272,0.17s0.169,0.116,0.233,0.221s0.053,0.261,0.053,0.299c0,0.039-0.039,0.44-0.078,0.674C19.145,23.021,19.235,23.203,19.158,23.269zM10.766,11.188c0.039,0.013,0.117,0.091,0.156,0.091c0.04,0,0.234,0.156,0.286,0.208c0.053,0.052,0.053,0.195-0.013,0.208s-0.104-0.143-0.117-0.208c-0.013-0.065-0.143-0.065-0.208-0.104C10.805,11.344,10.66,11.152,10.766,11.188zM27.51,16.41c-0.144,0.182-0.13,0.272-0.195,0.286c-0.064,0.013,0.065,0.065,0.09,0.194c0.022,0.112-0.065,0.224,0.063,0.327c-0.486,4.619-3.71,8.434-8.016,9.787c-0.007-0.011-0.019-0.025-0.021-0.034c-0.027-0.078-0.027-0.233,0.064-0.285c0.091-0.053,0.312-0.233,0.363-0.272c0.052-0.04,0.13-0.221,0.091-0.247c-0.038-0.026-0.232,0-0.26-0.039c-0.026-0.039-0.026-0.092,0.104-0.182c0.13-0.091,0.195-0.222,0.247-0.26c0.052-0.039,0.155-0.117,0.195-0.209c0.038-0.09-0.041-0.039-0.118-0.039s-0.117-0.142-0.117-0.207s0.195,0.026,0.339,0.052c0.143,0.024,0.077-0.065,0.064-0.142c-0.013-0.078,0.026-0.209,0.105-0.17c0.076,0.039,0.479-0.013,0.531-0.026c0.052-0.013,0.194-0.246,0.246-0.312c0.053-0.065,0.064-0.129,0-0.168c-0.065-0.04-0.143-0.184-0.168-0.221c-0.026-0.041-0.039-0.274-0.013-0.34c0.025-0.063,0,0.377,0.181,0.43c0.183,0.052,0.286,0.078,0.455-0.078c0.169-0.155,0.298-0.26,0.312-0.363c0.013-0.104,0.052-0.209,0.117-0.246c0.065-0.039,0.104,0.103,0.182-0.065c0.078-0.17,0.156-0.157,0.234-0.299c0.077-0.144-0.13-0.325,0.024-0.43c0.157-0.103,0.43-0.233,0.43-0.233s0.078-0.039,0.234-0.078c0.155-0.038,0.324-0.014,0.376-0.09c0.052-0.079,0.104-0.247,0.182-0.338c0.079-0.092,0.169-0.234,0.13-0.299c-0.039-0.065,0.104-0.352,0.091-0.429c-0.013-0.078-0.13-0.261,0.065-0.416s0.402-0.391,0.416-0.454c0.012-0.065,0.169-0.338,0.154-0.469c-0.012-0.129-0.154-0.285-0.245-0.325c-0.092-0.037-0.286-0.05-0.364-0.154s-0.299-0.208-0.377-0.182c-0.077,0.026-0.208,0.051-0.312-0.015c-0.104-0.063-0.272-0.143-0.337-0.194c-0.066-0.051-0.234-0.09-0.312-0.09s-0.065-0.053-0.182,0.103c-0.117,0.157,0,0.209-0.208,0.182c-0.209-0.024,0.025-0.038,0.144-0.194c0.115-0.155-0.014-0.247-0.144-0.207c-0.13,0.039-0.039,0.117-0.247,0.156c-0.207,0.038-0.207-0.092-0.077-0.117c0.13-0.026,0.363-0.143,0.363-0.194c0-0.053-0.026-0.196-0.13-0.196s-0.078-0.129-0.233-0.297c-0.156-0.17-0.351-0.274-0.508-0.249c-0.154,0.026-0.272,0.065-0.35-0.076c-0.078-0.144-0.169-0.17-0.222-0.247c-0.051-0.078-0.182,0-0.221-0.039s-0.039-0.039-0.039-0.039s-0.169,0.039-0.077-0.078c0.09-0.117,0.129-0.338,0.09-0.325c-0.038,0.013-0.104,0.196-0.168,0.183c-0.064-0.013-0.014-0.04-0.144-0.117c-0.13-0.078-0.337-0.013-0.337,0.052c0,0.065-0.065,0.117-0.065,0.117s-0.039-0.038-0.078-0.117c-0.039-0.078-0.221-0.091-0.312-0.013c-0.09,0.078-0.142-0.196-0.207-0.196s-0.194,0.065-0.26,0.184c-0.064,0.116-0.038,0.285-0.092,0.272c-0.05-0.013-0.063-0.233-0.05-0.312c0.012-0.079,0.155-0.208,0.05-0.234c-0.103-0.026-0.259,0.13-0.323,0.143c-0.065,0.013-0.195,0.104-0.273,0.209c-0.077,0.103-0.116,0.168-0.195,0.207c-0.077,0.039-0.193,0-0.167-0.039c0.025-0.039-0.222-0.181-0.261-0.13c-0.04,0.052-0.155,0.091-0.272,0.144c-0.117,0.052-0.222-0.065-0.247-0.117s-0.079-0.064-0.091-0.234c-0.013-0.168,0.027-0.351,0.065-0.454c0.038-0.104-0.195-0.312-0.286-0.3c-0.091,0.015-0.182,0.105-0.272,0.091c-0.092-0.012-0.052-0.038-0.195-0.038c-0.143,0-0.026-0.025,0-0.143c0.025-0.116-0.052-0.273,0.092-0.377c0.142-0.104,0.091-0.351,0-0.363c-0.092-0.014-0.261,0.039-0.377,0.026c-0.116-0.014-0.208,0.091-0.169,0.207c0.039,0.117-0.065,0.195-0.104,0.183c-0.039-0.013-0.09-0.078-0.234,0.026c-0.142,0.103-0.194,0.064-0.337-0.052c-0.143-0.118-0.299-0.234-0.325-0.416c-0.026-0.182-0.04-0.364,0.013-0.468c0.051-0.104,0.051-0.285-0.026-0.312c-0.078-0.025,0.09-0.155,0.181-0.181c0.092-0.026,0.234-0.143,0.26-0.195c0.026-0.052,0.156-0.04,0.298-0.04c0.143,0,0.169,0,0.312,0.078c0.143,0.078,0.169-0.039,0.169-0.078c0-0.039,0.052-0.117,0.208-0.104c0.156,0.013,0.376-0.052,0.416-0.013s0.116,0.195,0.194,0.143c0.079-0.051,0.104-0.143,0.131,0.014c0.025,0.155,0.09,0.39,0.208,0.429c0.116,0.039,0.052,0.194,0.168,0.207c0.115,0.013,0.17-0.246,0.131-0.337c-0.04-0.09-0.118-0.363-0.183-0.428c-0.064-0.065-0.064-0.234,0.064-0.286c0.13-0.052,0.442-0.312,0.532-0.389c0.092-0.079,0.338-0.144,0.261-0.248c-0.078-0.104-0.104-0.168-0.104-0.247s0.078-0.052,0.117,0s0.194-0.078,0.155-0.143c-0.038-0.064-0.026-0.155,0.065-0.143c0.091,0.013,0.116-0.065,0.078-0.117c-0.039-0.052,0.091-0.117,0.182-0.091c0.092,0.026,0.325-0.013,0.364-0.065c0.038-0.052-0.078-0.104-0.078-0.208c0-0.104,0.155-0.195,0.247-0.208c0.091-0.013,0.207,0,0.221-0.039c0.012-0.039,0.143-0.143,0.155-0.052c0.014,0.091,0,0.247,0.104,0.247c0.104,0,0.232-0.117,0.272-0.129c0.038-0.013,0.286-0.065,0.338-0.078c0.052-0.013,0.363-0.039,0.325-0.13c-0.039-0.09-0.078-0.181-0.118-0.22c-0.039-0.039-0.077,0.013-0.13,0.078c-0.051,0.065-0.143,0.065-0.168,0.013c-0.026-0.051,0.012-0.207-0.078-0.156c-0.092,0.052-0.104,0.104-0.157,0.078c-0.052-0.026-0.103-0.117-0.103-0.117s0.129-0.064,0.038-0.182c-0.09-0.117-0.221-0.091-0.35-0.025c-0.13,0.064-0.118,0.051-0.273,0.09s-0.234,0.078-0.234,0.078s0.209-0.129,0.299-0.208c0.091-0.078,0.209-0.117,0.286-0.195c0.078-0.078,0.285,0.039,0.285,0.039s0.105-0.104,0.105-0.039s-0.027,0.234,0.051,0.234c0.079,0,0.299-0.104,0.21-0.131c-0.093-0.026,0.129,0,0.219-0.065c0.092-0.065,0.194-0.065,0.247-0.09c0.052-0.026,0.092-0.143,0.182-0.143c0.092,0,0.13,0.117,0,0.195s-0.143,0.273-0.208,0.325c-0.064,0.052-0.026,0.117,0.078,0.104c0.104-0.013,0.194,0.013,0.286-0.013s0.143,0.026,0.168,0.065c0.026,0.039,0.104-0.039,0.104-0.039s0.169-0.039,0.221,0.026c0.053,0.064,0.092-0.039,0.053-0.104c-0.039-0.064-0.092-0.129-0.13-0.208c-0.039-0.078-0.091-0.104-0.194-0.078c-0.104,0.026-0.13-0.026-0.195-0.064c-0.065-0.04-0.118,0.052-0.065-0.04c0.053-0.09,0.078-0.117,0.117-0.195c0.039-0.078,0.209-0.221,0.039-0.259c-0.169-0.04-0.222-0.065-0.247-0.143c-0.026-0.078-0.221-0.221-0.272-0.221c-0.053,0-0.233,0-0.247-0.065c-0.013-0.065-0.143-0.208-0.208-0.273c-0.064-0.065-0.312-0.351-0.351-0.377c-0.039-0.026-0.091-0.013-0.208,0.143c-0.116,0.157-0.22,0.183-0.312,0.144c-0.091-0.039-0.104-0.026-0.193-0.13c-0.093-0.104,0.09-0.117,0.051-0.182c-0.04-0.064-0.247-0.091-0.377-0.104c-0.13-0.013-0.221-0.156-0.416-0.169c-0.194-0.013-0.428,0.026-0.493,0.026c-0.064,0-0.064,0.091-0.09,0.234c-0.027,0.143,0.09,0.182-0.027,0.208c-0.116,0.026-0.169,0.039-0.052,0.091c0.117,0.052,0.273,0.26,0.273,0.26s0,0.117-0.092,0.182c-0.09,0.065-0.182,0.13-0.233,0.053c-0.053-0.079-0.195-0.065-0.155,0.013c0.038,0.078,0.116,0.117,0.116,0.195c0,0.077,0.117,0.272,0.039,0.337c-0.078,0.065-0.168,0.014-0.233,0.026s-0.131-0.104-0.078-0.13c0.051-0.026-0.014-0.221-0.014-0.221s-0.155,0.221-0.143,0.104c0.014-0.117-0.064-0.13-0.064-0.221c0-0.091-0.079-0.13-0.194-0.104c-0.118,0.026-0.26-0.04-0.482-0.079c-0.22-0.039-0.311-0.064-0.493-0.156c-0.182-0.091-0.247-0.026-0.338-0.013c-0.091,0.013-0.052-0.182-0.169-0.207c-0.116-0.027-0.181,0.025-0.207-0.144c-0.026-0.168,0.039-0.208,0.324-0.39c0.286-0.182,0.247-0.26,0.468-0.286c0.22-0.026,0.325,0.026,0.325-0.039s0.052-0.325,0.052-0.195S16.95,9.109,16.832,9.2c-0.116,0.091-0.052,0.104,0.04,0.104c0.091,0,0.259-0.091,0.259-0.091s0.208-0.091,0.26-0.013c0.053,0.078,0.053,0.156,0.144,0.156s0.285-0.104,0.116-0.195c-0.168-0.091-0.272-0.078-0.376-0.182s-0.078-0.065-0.195-0.039c-0.116,0.026-0.116-0.039-0.156-0.039s-0.104,0.026-0.13-0.026c-0.025-0.052,0.014-0.065,0.145-0.065c0.129,0,0.285,0.039,0.285,0.039s0.155-0.052,0.194-0.065c0.039-0.013,0.247-0.039,0.208-0.155c-0.04-0.117-0.169-0.117-0.208-0.156s0.078-0.09,0.143-0.117c0.065-0.026,0.247,0,0.247,0s0.117,0.013,0.117-0.039S17.897,8.2,17.976,8.239s0,0.156,0.117,0.13c0.116-0.026,0.143,0,0.207,0.039c0.065,0.039-0.013,0.195-0.077,0.221c-0.065,0.025-0.169,0.077-0.026,0.09c0.144,0.014,0.246,0.014,0.246,0.014s0.092-0.091,0.131-0.169c0.038-0.078,0.104-0.026,0.155,0c0.052,0.025,0.247,0.065,0.065,0.117c-0.183,0.052-0.221,0.117-0.26,0.182c-0.038,0.065-0.053,0.104-0.221,0.065c-0.17-0.039-0.26-0.026-0.299,0.039c-0.039,0.064-0.013,0.273,0.053,0.247c0.063-0.026,0.129-0.026,0.207-0.052c0.078-0.026,0.39,0.026,0.467,0.013c0.078-0.013,0.209,0.13,0.248,0.104c0.039-0.026,0.117,0.052,0.194,0.104c0.078,0.052,0.052-0.117,0.194-0.013c0.144,0.104,0.065,0.104,0.144,0.104c0.076,0,0.246,0.013,0.246,0.013s0.014-0.129,0.144-0.104c0.13,0.026,0.245,0.169,0.232,0.064c-0.012-0.103,0.013-0.181-0.09-0.259c-0.104-0.078-0.272-0.13-0.299-0.169c-0.026-0.039-0.052-0.091-0.013-0.117c0.039-0.025,0.221,0.013,0.324,0.079c0.104,0.065,0.195,0.13,0.273,0.078c0.077-0.052,0.17-0.078,0.208-0.117c0.038-0.04,0.13-0.156,0.13-0.156s-0.391-0.051-0.441-0.117c-0.053-0.065-0.235-0.156-0.287-0.156s-0.194,0.091-0.246-0.039s-0.052-0.286-0.105-0.299c-0.05-0.013-0.597-0.091-0.674-0.13c-0.078-0.039-0.39-0.13-0.507-0.195s-0.286-0.156-0.389-0.156c-0.104,0-0.533,0.052-0.611,0.039c-0.078-0.013-0.312,0.026-0.403,0.039c-0.091,0.013,0.117,0.182-0.077,0.221c-0.195,0.039-0.169,0.065-0.13-0.13c0.038-0.195-0.131-0.247-0.299-0.169c-0.169,0.078-0.442,0.13-0.377,0.221c0.065,0.091-0.012,0.157,0.117,0.247c0.13,0.091,0.183,0.117,0.35,0.104c0.17-0.013,0.339,0.025,0.339,0.025s0,0.157-0.064,0.182c-0.065,0.026-0.169,0.026-0.196,0.104c-0.025,0.078-0.155,0.117-0.155,0.078s0.065-0.169-0.026-0.234c-0.09-0.065-0.117-0.078-0.221-0.013c-0.104,0.065-0.116,0.091-0.169-0.013C16.053,8.291,15.897,8.2,15.897,8.2s-0.104-0.129-0.182-0.194c-0.077-0.065-0.22-0.052-0.234,0.013c-0.013,0.064,0.026,0.129,0.078,0.247c0.052,0.117,0.104,0.337,0.013,0.351c-0.091,0.013-0.104,0.026-0.195,0.052c-0.091,0.026-0.13-0.039-0.13-0.143s-0.04-0.195-0.013-0.234c0.026-0.039-0.104,0.027-0.234,0c-0.13-0.025-0.233,0.052-0.104,0.092c0.13,0.039,0.157,0.194,0.039,0.233c-0.117,0.039-0.559,0-0.702,0s-0.35,0.039-0.39-0.039c-0.039-0.078,0.118-0.129,0.208-0.129c0.091,0,0.363,0.012,0.467-0.13c0.104-0.143-0.13-0.169-0.233-0.169c-0.104,0-0.183-0.039-0.299-0.155c-0.118-0.117,0.078-0.195,0.052-0.247c-0.026-0.052-0.156-0.014-0.272-0.014c-0.117,0-0.299-0.09-0.299,0.014c0,0.104,0.143,0.402,0.052,0.337c-0.091-0.064-0.078-0.156-0.143-0.234c-0.065-0.078-0.168-0.065-0.299-0.052c-0.129,0.013-0.35,0.052-0.415,0.039c-0.064-0.013-0.013-0.013-0.156-0.078c-0.142-0.065-0.208-0.052-0.312-0.117C12.091,7.576,12.182,7.551,12,7.538c-0.181-0.013-0.168,0.09-0.35,0.065c-0.182-0.026-0.234,0.013-0.416,0c-0.182-0.013-0.272-0.026-0.299,0.065c-0.025,0.091-0.078,0.247-0.156,0.247c-0.077,0-0.169,0.091,0.078,0.104c0.247,0.013,0.105,0.129,0.325,0.117c0.221-0.013,0.416-0.013,0.468-0.117c0.052-0.104,0.091-0.104,0.117-0.065c0.025,0.039,0.22,0.272,0.22,0.272s0.131,0.104,0.183,0.13c0.051,0.026-0.052,0.143-0.156,0.078c-0.104-0.065-0.299-0.051-0.377-0.116c-0.078-0.065-0.429-0.065-0.52-0.052c-0.09,0.013-0.247-0.039-0.299-0.039c-0.051,0-0.221,0.13-0.221,0.13S10.532,8.252,10.494,8.2c-0.039-0.052-0.104,0.052-0.156,0.065c-0.052,0.013-0.208-0.104-0.364-0.052C9.818,8.265,9.87,8.317,9.649,8.304s-0.272-0.052-0.35-0.039C9.22,8.278,9.22,8.278,9.22,8.278S9.233,8.33,9.143,8.382C9.052,8.434,8.986,8.499,8.921,8.421C8.857,8.343,8.818,8.343,8.779,8.33c-0.04-0.013-0.118-0.078-0.286-0.04C8.324,8.33,8.064,8.239,8.013,8.239c-0.04,0-0.313-0.015-0.491-0.033c2.109-2.292,5.124-3.74,8.478-3.74c2.128,0,4.117,0.589,5.83,1.598c-0.117,0.072-0.319,0.06-0.388,0.023c-0.078-0.043-0.158-0.078-0.475-0.061c-0.317,0.018-0.665,0.122-0.595,0.226c0.072,0.104-0.142,0.165-0.197,0.113c-0.055-0.052-0.309,0.06-0.293,0.165c0.016,0.104-0.039,0.225-0.175,0.199c-0.134-0.027-0.229,0.06-0.237,0.146c-0.007,0.087-0.309,0.147-0.332,0.147c-0.024,0-0.412-0.008-0.27,0.095c0.097,0.069,0.15,0.027,0.27,0.052c0.119,0.026,0.214,0.217,0.277,0.243c0.062,0.026,0.15,0,0.189-0.052c0.04-0.052,0.095-0.234,0.095-0.234s0,0.173,0.097,0.208c0.095,0.035,0.331-0.026,0.395-0.017c0.064,0.008,0.437,0.061,0.538,0.112c0.104,0.052,0.356,0.087,0.428,0.199c0.071,0.113,0.08,0.503,0.119,0.546c0.04,0.043,0.174-0.139,0.205-0.182c0.031-0.044,0.198-0.018,0.254,0.042c0.056,0.061,0.182,0.208,0.175,0.269C21.9,8.365,21.877,8.459,21.83,8.425c-0.048-0.034-0.127-0.025-0.096-0.095c0.032-0.069,0.048-0.217-0.015-0.217c-0.064,0-0.119,0-0.119,0s-0.12-0.035-0.199,0.095s-0.015,0.26,0.04,0.26s0.184,0,0.184,0.034c0,0.035-0.136,0.139-0.128,0.2c0.009,0.061,0.11,0.268,0.144,0.312c0.031,0.043,0.197,0.086,0.244,0.096c0.049,0.008-0.111,0.017-0.07,0.077c0.04,0.061,0.102,0.208,0.189,0.243c0.087,0.035,0.333,0.19,0.363,0.26c0.032,0.069,0.222-0.052,0.262-0.061c0.04-0.008,0.032,0.182,0.143,0.191c0.11,0.008,0.15-0.018,0.245-0.096s0.072-0.182,0.079-0.26c0.009-0.078,0-0.138,0.104-0.113c0.104,0.026,0.158-0.018,0.15-0.104c-0.008-0.087-0.095-0.191,0.07-0.217c0.167-0.026,0.254-0.138,0.357-0.138c0.103,0,0.389,0.043,0.419,0c0.032-0.043,0.167-0.243,0.254-0.251c0.067-0.007,0.224-0.021,0.385-0.042c1.582,1.885,2.561,4.284,2.673,6.905c-0.118,0.159-0.012,0.305,0.021,0.408c0.001,0.03,0.005,0.058,0.005,0.088c0,0.136-0.016,0.269-0.021,0.404C27.512,16.406,27.512,16.408,27.51,16.41zM17.794,12.084c-0.064,0.013-0.169-0.052-0.169-0.143s-0.091,0.169-0.04,0.247c0.053,0.078-0.104,0.169-0.155,0.169s-0.091-0.116-0.078-0.233c0.014-0.117-0.077-0.221-0.221-0.208c-0.143,0.014-0.208,0.13-0.259,0.169c-0.053,0.039-0.053,0.259-0.04,0.312s0.013,0.235-0.116,0.221c-0.118-0.013-0.092-0.233-0.079-0.312c0.014-0.078-0.039-0.273,0.014-0.376c0.053-0.104,0.207-0.143,0.312-0.156s0.324,0.065,0.363,0.052c0.04-0.014,0.222-0.014,0.312,0C17.729,11.837,17.858,12.071,17.794,12.084zM18.027,12.123c0.04,0.026,0.311-0.039,0.364,0.026c0.051,0.065-0.054,0.078-0.183,0.13c-0.129,0.052-0.169,0.039-0.221,0.104s-0.221,0.09-0.299,0.168c-0.078,0.079-0.217,0.125-0.246,0.065c-0.04-0.078,0.013-0.039,0.025-0.078c0.013-0.039,0.245-0.129,0.245-0.129S17.988,12.097,18.027,12.123zM16.988,11.668c-0.038,0.013-0.182-0.026-0.3-0.026c-0.116,0-0.091-0.078-0.143-0.064c-0.051,0.013-0.168,0.039-0.247,0.078c-0.078,0.039-0.208,0.03-0.208-0.04c0-0.104,0.052-0.078,0.221-0.143c0.169-0.065,0.352-0.247,0.429-0.169c0.078,0.078,0.221,0.169,0.312,0.182C17.144,11.5,17.026,11.655,16.988,11.668zM15.659,7.637c-0.079,0.026-0.347,0.139-0.321,0.199c0.01,0.023,0.078,0.069,0.19,0.052c0.113-0.018,0.276-0.035,0.355-0.043c0.078-0.009,0.095-0.139,0.009-0.147C15.805,7.689,15.736,7.611,15.659,7.637zM14.698,7.741c-0.061,0.026-0.243-0.043-0.338,0.018c-0.061,0.038-0.026,0.164,0.07,0.172c0.095,0.009,0.259-0.06,0.276-0.008c0.018,0.052,0.078,0.286,0.234,0.208c0.156-0.078,0.147-0.147,0.19-0.156c0.043-0.009-0.008-0.199-0.078-0.243C14.983,7.689,14.758,7.715,14.698,7.741zM14.385,7.005c0.017,0.044-0.008,0.078,0.113,0.095c0.121,0.018,0.173,0.035,0.243,0.035c0.069,0,0.042-0.113-0.018-0.19c-0.061-0.078-0.043-0.069-0.199-0.113c-0.156-0.043-0.312-0.043-0.416-0.035c-0.104,0.009-0.217-0.017-0.243,0.104c-0.013,0.062,0.07,0.112,0.174,0.112S14.368,6.962,14.385,7.005zM14.611,7.481c0.043,0.095,0.043,0.051,0.165,0.061C14.896,7.551,14.991,7.421,15,7.378c0.009-0.044-0.061-0.13-0.225-0.113c-0.165,0.017-0.667-0.026-0.736,0.034c-0.066,0.058,0,0.233-0.026,0.251c-0.026,0.017,0.009,0.095,0.077,0.078c0.069-0.017,0.104-0.182,0.157-0.182C14.299,7.447,14.568,7.386,14.611,7.481zM12.982,7.126c0.052,0.043,0.183,0.008,0.173-0.035c-0.008-0.043,0.053-0.217-0.051-0.225C13,6.858,12.854,6.962,12.697,7.014c-0.101,0.033-0.078,0.13-0.009,0.13S12.931,7.083,12.982,7.126zM13.72,7.282c-0.087,0.043-0.114,0.069-0.191,0.052c-0.078-0.017-0.078-0.156-0.217-0.13c-0.138,0.026-0.164,0.104-0.207,0.139s-0.139,0.061-0.173,0.043c-0.034-0.017-0.234-0.129-0.234-0.129s-0.416-0.018-0.433-0.07c-0.017-0.052-0.086-0.138-0.277-0.121s-0.52,0.13-0.572,0.13c-0.052,0,0.062,0.104-0.009,0.104c-0.069,0-0.155-0.008-0.181,0.069c-0.018,0.053,0.078,0.052,0.189,0.052c0.112,0,0.295,0,0.347-0.026c0.052-0.026,0.312-0.087,0.303-0.009c-0.009,0.079,0.104,0.199,0.164,0.182c0.061-0.017,0.183-0.13,0.243-0.086c0.061,0.043,0.07,0.146,0.13,0.173c0.061,0.025,0.226,0.025,0.304,0c0.077-0.027,0.294-0.027,0.389-0.009c0.095,0.018,0.373,0.069,0.399,0.018c0.026-0.053,0.104-0.061,0.112-0.113s0.051-0.216,0.051-0.216S13.806,7.239,13.72,7.282zM18.105,16.239c-0.119,0.021-0.091,0.252,0.052,0.21C18.3,16.407,18.223,16.217,18.105,16.239zM19.235,15.929c-0.104-0.026-0.221,0-0.299,0.013c-0.078,0.013-0.299,0.208-0.299,0.208s0.143,0.026,0.233,0.026c0.092,0,0.144,0.051,0.221,0.09c0.078,0.04,0.221-0.052,0.272-0.052c0.053,0,0.118,0.156,0.131-0.013C19.508,16.032,19.339,15.955,19.235,15.929zM15.616,7.507c-0.043-0.104-0.259-0.139-0.304-0.035C15.274,7.563,15.659,7.611,15.616,7.507zM18.093,15.292c0.143-0.026,0.064-0.144-0.053-0.13C17.922,15.175,17.949,15.318,18.093,15.292zM19.82,16.095c-0.119,0.022-0.092,0.253,0.051,0.211C20.015,16.264,19.937,16.074,19.82,16.095zM18.247,15.708c-0.09,0.013-0.285-0.09-0.389-0.182c-0.104-0.091-0.299-0.091-0.377-0.091c-0.077,0-0.39,0.091-0.39,0.091c-0.013,0.13,0.117,0.091,0.273,0.091s0.429-0.026,0.479,0.039c0.053,0.064,0.286,0.168,0.352,0.221c0.064,0.052,0.272,0.065,0.285,0.013S18.338,15.695,18.247,15.708zM16.698,7.412c-0.13-0.009-0.295-0.009-0.399,0c-0.104,0.008-0.182-0.069-0.26-0.113c-0.077-0.043-0.251-0.182-0.354-0.199c-0.104-0.017-0.086-0.017-0.303-0.069c-0.11-0.027-0.294-0.061-0.294-0.086c0-0.026-0.052,0.121,0.043,0.165c0.095,0.043,0.251,0.121,0.363,0.164c0.114,0.043,0.329,0.052,0.399,0.139c0.069,0.086,0.303,0.156,0.303,0.156l0.277,0.026c0,0,0.191-0.043,0.39-0.026c0.199,0.017,0.493,0.043,0.659,0.035c0.163-0.008,0.189-0.061,0.208-0.095c0.016-0.035-0.304-0.104-0.383-0.095C17.271,7.42,16.827,7.42,16.698,7.412zM17.182,9.404c-0.034,0.039,0.157,0.095,0.191,0.043C17.407,9.396,17.271,9.309,17.182,9.404zM17.764,9.585c0.086-0.035,0.043-0.139-0.079-0.104C17.547,9.521,17.676,9.62,17.764,9.585z", + "raph_warning": "M29.225,23.567l-3.778-6.542c-1.139-1.972-3.002-5.2-4.141-7.172l-3.778-6.542c-1.14-1.973-3.003-1.973-4.142,0L9.609,9.853c-1.139,1.972-3.003,5.201-4.142,7.172L1.69,23.567c-1.139,1.974-0.207,3.587,2.071,3.587h23.391C29.432,27.154,30.363,25.541,29.225,23.567zM16.536,24.58h-2.241v-2.151h2.241V24.58zM16.428,20.844h-2.023l-0.201-9.204h2.407L16.428,20.844z", + "raph_arrowleftalt": "M16,30.534c8.027,0,14.534-6.507,14.534-14.534c0-8.027-6.507-14.534-14.534-14.534C7.973,1.466,1.466,7.973,1.466,16C1.466,24.027,7.973,30.534,16,30.534zM18.335,6.276l3.536,3.538l-6.187,6.187l6.187,6.187l-3.536,3.537l-9.723-9.724L18.335,6.276z", + "raph_arrowalt": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM13.665,25.725l-3.536-3.539l6.187-6.187l-6.187-6.187l3.536-3.536l9.724,9.723L13.665,25.725z", + "raph_code": "M8.982,7.107L0.322,15.77l8.661,8.662l3.15-3.15L6.621,15.77l5.511-5.511L8.982,7.107zM21.657,7.107l-3.148,3.151l5.511,5.511l-5.511,5.511l3.148,3.15l8.662-8.662L21.657,7.107z", + "raph_arrowleft": "M21.871,9.814 15.684,16.001 21.871,22.188 18.335,25.725 8.612,16.001 18.335,6.276", + "raph_arrow": "M10.129,22.186 16.316,15.999 10.129,9.812 13.665,6.276 23.389,15.999 13.665,25.725", + "raph_pensil": "M25.31,2.872l-3.384-2.127c-0.854-0.536-1.979-0.278-2.517,0.576l-1.334,2.123l6.474,4.066l1.335-2.122C26.42,4.533,26.164,3.407,25.31,2.872zM6.555,21.786l6.474,4.066L23.581,9.054l-6.477-4.067L6.555,21.786zM5.566,26.952l-0.143,3.819l3.379-1.787l3.14-1.658l-6.246-3.925L5.566,26.952z", + "raph_pen": "M13.587,12.074c-0.049-0.074-0.11-0.147-0.188-0.202c-0.333-0.243-0.803-0.169-1.047,0.166c-0.244,0.336-0.167,0.805,0.167,1.048c0.303,0.22,0.708,0.167,0.966-0.091l-7.086,9.768l-2.203,7.997l6.917-4.577L26.865,4.468l-4.716-3.42l-1.52,2.096c-0.087-0.349-0.281-0.676-0.596-0.907c-0.73-0.529-1.751-0.369-2.28,0.363C14.721,6.782,16.402,7.896,13.587,12.074zM10.118,25.148L6.56,27.503l1.133-4.117L10.118,25.148zM14.309,11.861c2.183-3.225,1.975-4.099,3.843-6.962c0.309,0.212,0.664,0.287,1.012,0.269L14.309,11.861z", + "raph_minus": "M25.979,12.896,19.312,12.896,5.979,12.896,5.979,19.562,25.979,19.562", + "raph_tshirt": "M20.1,4.039c-0.681,1.677-2.32,2.862-4.24,2.862c-1.921,0-3.56-1.185-4.24-2.862L1.238,8.442l2.921,6.884l3.208-1.361V28h17.099V14.015l3.093,1.312l2.922-6.884L20.1,4.039z", + "raph_raphael": "M27.777,18.941c0.584-0.881,0.896-1.914,0.896-2.998c0-1.457-0.567-2.826-1.598-3.854l-6.91-6.911l-0.003,0.002c-0.985-0.988-2.35-1.6-3.851-1.6c-1.502,0-2.864,0.612-3.85,1.6H12.46l-6.911,6.911c-1.031,1.029-1.598,2.398-1.598,3.854c0,1.457,0.567,2.826,1.598,3.854l6.231,6.229c0.25,0.281,0.512,0.544,0.789,0.785c1.016,0.961,2.338,1.49,3.743,1.49c1.456,0,2.825-0.565,3.854-1.598l6.723-6.725c0.021-0.019,0.034-0.032,0.051-0.051l0.14-0.138c0.26-0.26,0.487-0.54,0.688-0.838c0.004-0.008,0.01-0.015,0.014-0.021L27.777,18.941zM26.658,15.946c0,0.678-0.197,1.326-0.561,1.879c-0.222,0.298-0.447,0.559-0.684,0.784L25.4,18.625c-1.105,1.052-2.354,1.35-3.414,1.35c-0.584,0-1.109-0.09-1.523-0.195c-2.422-0.608-5.056-2.692-6.261-5.732c0.649,0.274,1.362,0.426,2.11,0.426c2.811,0,5.129-2.141,5.415-4.877l3.924,3.925C26.301,14.167,26.658,15.029,26.658,15.946zM16.312,5.6c1.89,0,3.426,1.538,3.426,3.427c0,1.89-1.536,3.427-3.426,3.427c-1.889,0-3.426-1.537-3.426-3.427C12.886,7.138,14.423,5.6,16.312,5.6zM6.974,18.375c-0.649-0.648-1.007-1.512-1.007-2.429c0-0.917,0.357-1.78,1.007-2.428l2.655-2.656c-0.693,2.359-0.991,4.842-0.831,7.221c0.057,0.854,0.175,1.677,0.345,2.46L6.974,18.375zM11.514,11.592c0.583,4.562,4.195,9.066,8.455,10.143c0.693,0.179,1.375,0.265,2.033,0.265c0.01,0,0.02,0,0.027,0l-3.289,3.289c-0.648,0.646-1.512,1.006-2.428,1.006c-0.638,0-1.248-0.177-1.779-0.5l0.001-0.002c-0.209-0.142-0.408-0.295-0.603-0.461c-0.015-0.019-0.031-0.026-0.046-0.043l-0.665-0.664c-1.367-1.567-2.227-3.903-2.412-6.671C10.669,15.856,10.921,13.673,11.514,11.592", + "raph_graphael": "M28.832,16.104c0-1.477-0.574-2.863-1.617-3.905l-7.002-7.001L20.211,5.2c-1.027-1.03-2.445-1.62-3.9-1.62c-1.455,0-2.871,0.59-3.9,1.621l-0.002-0.002l-7,7c-1.033,1.031-1.619,2.445-1.619,3.905c0,1.458,0.586,2.872,1.619,3.903l6.312,6.312c0.253,0.284,0.519,0.55,0.8,0.794c1.049,0.994,2.463,1.54,3.908,1.51c1.417-0.028,2.783-0.612,3.785-1.615l6.811-6.811c0.018-0.017,0.035-0.034,0.053-0.052l0.137-0.138c0.27-0.268,0.49-0.564,0.713-0.868l-0.002-0.002C28.516,18.244,28.832,17.198,28.832,16.104zM23.08,21.252l-0.051,0.006l-0.955,0.974c0.01,0-3.305,3.332-3.305,3.332c-1.121,1.119-2.906,1.337-4.261,0.511l0.002-0.002c-0.213-0.141-0.414-0.299-0.61-0.467c-0.016-0.015-0.032-0.027-0.047-0.042l-3.024-3.024h-0.001l-3.976-3.976c-1.34-1.339-1.342-3.581,0-4.921l2.689-2.689l0.052-0.005l0.956-0.973c-0.01,0,3.303-3.332,3.303-3.332c1.121-1.12,2.908-1.337,4.261-0.511v0.002c0.211,0.14,0.414,0.299,0.609,0.467c0.016,0.015,0.031,0.028,0.047,0.042l3.025,3.024l0,0l3.975,3.976c0.389,0.388,0.66,0.852,0.824,1.348l-2.617,0.008c-0.537-3.754-3.764-6.64-7.666-6.64c-4.277,0-7.744,3.467-7.745,7.746c0.001,4.277,3.468,7.743,7.745,7.744c3.919-0.001,7.156-2.911,7.671-6.688l2.635-0.009c-0.16,0.52-0.441,1.007-0.846,1.412L23.08,21.252zM16.311,17.184c0.002,0,0.002,0,0.004,0l5.476-0.018c-0.5,2.573-2.76,4.516-5.48,4.52c-3.084-0.005-5.578-2.5-5.584-5.582c0.006-3.084,2.5-5.579,5.584-5.584c2.707,0.005,4.96,1.929,5.472,4.485l-5.476,0.018c-0.596,0.002-1.078,0.488-1.076,1.084C15.233,16.702,15.715,17.184,16.311,17.184z", + "raph_page": "M23.024,5.673c-1.744-1.694-3.625-3.051-5.168-3.236c-0.084-0.012-0.171-0.019-0.263-0.021H7.438c-0.162,0-0.322,0.063-0.436,0.18C6.889,2.71,6.822,2.87,6.822,3.033v25.75c0,0.162,0.063,0.317,0.18,0.435c0.117,0.116,0.271,0.179,0.436,0.179h18.364c0.162,0,0.317-0.062,0.434-0.179c0.117-0.117,0.182-0.272,0.182-0.435V11.648C26.382,9.659,24.824,7.49,23.024,5.673zM25.184,28.164H8.052V3.646h9.542v0.002c0.416-0.025,0.775,0.386,1.05,1.326c0.25,0.895,0.313,2.062,0.312,2.871c0.002,0.593-0.027,0.991-0.027,0.991l-0.049,0.652l0.656,0.007c0.003,0,1.516,0.018,3,0.355c1.426,0.308,2.541,0.922,2.645,1.617c0.004,0.062,0.005,0.124,0.004,0.182V28.164z", + "raph_page2": "M23.024,5.673c-1.744-1.694-3.625-3.051-5.168-3.236c-0.084-0.012-0.171-0.019-0.263-0.021H7.438c-0.162,0-0.322,0.063-0.436,0.18C6.889,2.71,6.822,2.87,6.822,3.033v25.75c0,0.162,0.063,0.317,0.18,0.435c0.117,0.116,0.271,0.179,0.436,0.179h18.364c0.162,0,0.317-0.062,0.434-0.179c0.117-0.117,0.182-0.272,0.182-0.435V11.648C26.382,9.659,24.824,7.49,23.024,5.673zM22.157,6.545c0.805,0.786,1.529,1.676,2.069,2.534c-0.468-0.185-0.959-0.322-1.42-0.431c-1.015-0.228-2.008-0.32-2.625-0.357c0.003-0.133,0.004-0.283,0.004-0.446c0-0.869-0.055-2.108-0.356-3.2c-0.003-0.01-0.005-0.02-0.009-0.03C20.584,5.119,21.416,5.788,22.157,6.545zM25.184,28.164H8.052V3.646h9.542v0.002c0.416-0.025,0.775,0.386,1.05,1.326c0.25,0.895,0.313,2.062,0.312,2.871c0.002,0.593-0.027,0.991-0.027,0.991l-0.049,0.652l0.656,0.007c0.003,0,1.516,0.018,3,0.355c1.426,0.308,2.541,0.922,2.645,1.617c0.004,0.062,0.005,0.124,0.004,0.182V28.164z", + "raph_plugin": "M26.33,15.836l-3.893-1.545l3.136-7.9c0.28-0.705-0.064-1.505-0.771-1.785c-0.707-0.28-1.506,0.065-1.785,0.771l-3.136,7.9l-4.88-1.937l3.135-7.9c0.281-0.706-0.064-1.506-0.77-1.786c-0.706-0.279-1.506,0.065-1.785,0.771l-3.136,7.9L8.554,8.781l-1.614,4.066l2.15,0.854l-2.537,6.391c-0.61,1.54,0.143,3.283,1.683,3.895l1.626,0.646L8.985,26.84c-0.407,1.025,0.095,2.188,1.122,2.596l0.93,0.369c1.026,0.408,2.188-0.095,2.596-1.121l0.877-2.207l1.858,0.737c1.54,0.611,3.284-0.142,3.896-1.682l2.535-6.391l1.918,0.761L26.33,15.836z", + "raph_svg": "M31.274,15.989c0-2.473-2.005-4.478-4.478-4.478l0,0c0.81-0.811,1.312-1.93,1.312-3.167c0-2.474-2.005-4.479-4.479-4.479c-1.236,0-2.356,0.501-3.167,1.312c0-2.473-2.005-4.478-4.478-4.478c-2.474,0-4.479,2.005-4.479,4.478c-0.811-0.81-1.93-1.312-3.167-1.312c-2.474,0-4.479,2.005-4.479,4.479c0,1.236,0.501,2.356,1.312,3.166c-2.474,0-4.479,2.005-4.479,4.479c0,2.474,2.005,4.479,4.479,4.479c-0.811,0.81-1.312,1.93-1.312,3.167c0,2.473,2.005,4.478,4.479,4.478c1.236,0,2.356-0.501,3.167-1.312c0,2.473,2.005,4.479,4.479,4.479c2.473,0,4.478-2.006,4.478-4.479l0,0c0.811,0.811,1.931,1.312,3.167,1.312c2.474,0,4.478-2.005,4.478-4.478c0-1.237-0.501-2.357-1.312-3.168c0.001,0,0.001,0,0.001,0C29.27,20.467,31.274,18.463,31.274,15.989zM23.583,21.211c0.016,0,0.031-0.001,0.047-0.001c1.339,0,2.424,1.085,2.424,2.425c0,1.338-1.085,2.424-2.424,2.424s-2.424-1.086-2.424-2.424c0-0.017,0.001-0.031,0.001-0.047l-3.541-3.542v5.009c0.457,0.44,0.743,1.06,0.743,1.746c0,1.339-1.086,2.424-2.424,2.424c-1.339,0-2.425-1.085-2.425-2.424c0-0.687,0.286-1.306,0.743-1.746v-5.009l-3.541,3.542c0,0.016,0.001,0.031,0.001,0.047c0,1.338-1.085,2.424-2.424,2.424s-2.424-1.086-2.424-2.424c0-1.34,1.085-2.425,2.424-2.425c0.015,0,0.031,0.001,0.046,0.001l3.542-3.541H6.919c-0.44,0.458-1.06,0.743-1.746,0.743c-1.339,0-2.424-1.085-2.424-2.424s1.085-2.424,2.424-2.424c0.686,0,1.305,0.285,1.746,0.744h5.008l-3.542-3.542c-0.015,0-0.031,0.001-0.046,0.001c-1.339,0-2.424-1.085-2.424-2.424S7.001,5.92,8.34,5.92s2.424,1.085,2.424,2.424c0,0.015-0.001,0.031-0.001,0.046l3.541,3.542V6.924c-0.457-0.441-0.743-1.06-0.743-1.746c0-1.339,1.086-2.425,2.425-2.425c1.338,0,2.424,1.085,2.424,2.425c0,0.686-0.286,1.305-0.743,1.746v5.008l3.541-3.542c0-0.015-0.001-0.031-0.001-0.046c0-1.339,1.085-2.424,2.424-2.424s2.424,1.085,2.424,2.424c0,1.339-1.085,2.424-2.424,2.424c-0.016,0-0.031-0.001-0.047-0.001l-3.541,3.542h5.008c0.441-0.458,1.061-0.744,1.747-0.744c1.338,0,2.423,1.085,2.423,2.424s-1.085,2.424-2.423,2.424c-0.687,0-1.306-0.285-1.747-0.743h-5.008L23.583,21.211z", + "raph_bookmark": "M17.396,1.841L6.076,25.986l7.341-4.566l1.186,8.564l11.32-24.146L17.396,1.841zM19.131,9.234c-0.562-0.264-0.805-0.933-0.541-1.495c0.265-0.562,0.934-0.805,1.496-0.541s0.805,0.934,0.541,1.496S19.694,9.498,19.131,9.234z", + "raph_hammer": "M7.831,29.354c0.685,0.353,1.62,1.178,2.344,0.876c0.475-0.195,0.753-1.301,1.048-1.883c2.221-4.376,4.635-9.353,6.392-13.611c0-0.19,0.101-0.337-0.049-0.595c0.983-1.6,1.65-3.358,2.724-5.138c0.34-0.566,0.686-1.351,1.163-1.577l0.881-0.368c1.12-0.288,1.938-0.278,2.719,0.473c0.396,0.383,0.578,1.015,0.961,1.395c0.259,0.26,1.246,0.899,1.613,0.8c0.285-0.077,0.52-0.364,0.72-0.728l0.696-1.286c0.195-0.366,0.306-0.718,0.215-0.999c-0.117-0.362-1.192-0.84-1.552-0.915c-0.528-0.113-1.154,0.081-1.692-0.041c-1.057-0.243-1.513-0.922-1.883-2.02c-2.608-1.533-6.119-2.53-10.207-1.244c-1.109,0.349-2.172,0.614-2.901,1.323c-0.146,0.412,0.143,0.494,0.446,0.489c-0.237,0.216-0.62,0.341-0.399,0.848c2.495-1.146,7.34-1.542,7.669,0.804c0.072,0.522-0.395,1.241-0.682,1.835c-0.905,1.874-2.011,3.394-2.813,5.091c-0.298,0.017-0.366,0.18-0.525,0.287c-2.604,3.8-5.451,8.541-7.9,12.794c-0.326,0.566-1.098,1.402-1.002,1.906C5.961,28.641,7.146,29,7.831,29.354z", + "raph_users": "M21.053,20.8c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68h-0.34c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888C28.469,23.686,22.185,21.252,21.053,20.8zM8.583,20.628c-0.099-0.18-0.148-0.31-0.148-0.31s-0.432,0.239-0.432-0.432s0.432,0.432,0.864-2.159c0,0,1.199-0.336,0.959-3.119H9.538c0,0,0.143-0.591,0.237-1.334c-0.004-0.308,0.006-0.636,0.037-0.996l0.038-0.426c-0.021-0.492-0.107-0.939-0.312-1.226C8.818,9.619,8.53,8.947,6.947,8.467c-1.583-0.48-1.008-0.385-2.159-0.336C3.636,8.179,2.676,8.802,2.676,9.139c0,0-0.72,0.048-1.008,0.336c-0.271,0.271-0.705,1.462-0.757,1.885v0.281c0.047,0.653,0.258,2.449,0.469,2.872l-0.286,0.096c-0.239,2.783,0.959,3.119,0.959,3.119c0.432,2.591,0.864,1.488,0.864,2.159s-0.432,0.432-0.432,0.432s-0.383,1.057-1.343,1.439c-0.061,0.024-0.139,0.056-0.232,0.092v5.234h0.575c-0.029-1.278,0.077-2.927,0.746-3.594C2.587,23.135,3.754,22.551,8.583,20.628zM30.913,11.572c-0.04-0.378-0.127-0.715-0.292-0.946c-0.719-1.008-1.008-1.679-2.59-2.159c-1.584-0.48-1.008-0.385-2.16-0.336C24.72,8.179,23.76,8.802,23.76,9.139c0,0-0.719,0.048-1.008,0.336c-0.271,0.272-0.709,1.472-0.758,1.891h0.033l0.08,0.913c0.02,0.231,0.022,0.436,0.027,0.645c0.09,0.666,0.21,1.35,0.33,1.589l-0.286,0.096c-0.239,2.783,0.96,3.119,0.96,3.119c0.432,2.591,0.863,1.488,0.863,2.159s-0.432,0.432-0.432,0.432s-0.053,0.142-0.163,0.338c4.77,1.9,5.927,2.48,6.279,2.834c0.67,0.667,0.775,2.315,0.746,3.594h0.48v-5.306c-0.016-0.006-0.038-0.015-0.052-0.021c-0.959-0.383-1.343-1.439-1.343-1.439s-0.433,0.239-0.433-0.432s0.433,0.432,0.864-2.159c0,0,0.804-0.229,0.963-1.841v-1.227c-0.001-0.018-0.001-0.033-0.003-0.051h-0.289c0,0,0.215-0.89,0.292-1.861V11.572z", + "raph_user": "M20.771,12.364c0,0,0.849-3.51,0-4.699c-0.85-1.189-1.189-1.981-3.058-2.548s-1.188-0.454-2.547-0.396c-1.359,0.057-2.492,0.792-2.492,1.188c0,0-0.849,0.057-1.188,0.397c-0.34,0.34-0.906,1.924-0.906,2.321s0.283,3.058,0.566,3.624l-0.337,0.113c-0.283,3.283,1.132,3.68,1.132,3.68c0.509,3.058,1.019,1.756,1.019,2.548s-0.51,0.51-0.51,0.51s-0.452,1.245-1.584,1.698c-1.132,0.452-7.416,2.886-7.927,3.396c-0.511,0.511-0.453,2.888-0.453,2.888h26.947c0,0,0.059-2.377-0.452-2.888c-0.512-0.511-6.796-2.944-7.928-3.396c-1.132-0.453-1.584-1.698-1.584-1.698s-0.51,0.282-0.51-0.51s0.51,0.51,1.02-2.548c0,0,1.414-0.397,1.132-3.68H20.771z", + "raph_mail": "M28.516,7.167H3.482l12.517,7.108L28.516,7.167zM16.74,17.303C16.51,17.434,16.255,17.5,16,17.5s-0.51-0.066-0.741-0.197L2.5,10.06v14.773h27V10.06L16.74,17.303z", + "raph_picture": "M2.5,4.833v22.334h27V4.833H2.5zM25.25,25.25H6.75V6.75h18.5V25.25zM11.25,14c1.426,0,2.583-1.157,2.583-2.583c0-1.427-1.157-2.583-2.583-2.583c-1.427,0-2.583,1.157-2.583,2.583C8.667,12.843,9.823,14,11.25,14zM24.251,16.25l-4.917-4.917l-6.917,6.917L10.5,16.333l-2.752,2.752v5.165h16.503V16.25z", + "raph_bubble": "M16,5.333c-7.732,0-14,4.701-14,10.5c0,1.982,0.741,3.833,2.016,5.414L2,25.667l5.613-1.441c2.339,1.317,5.237,2.107,8.387,2.107c7.732,0,14-4.701,14-10.5C30,10.034,23.732,5.333,16,5.333z", + "raph_codetalk": "M16,4.938c-7.732,0-14,4.701-14,10.5c0,1.981,0.741,3.833,2.016,5.414L2,25.272l5.613-1.44c2.339,1.316,5.237,2.106,8.387,2.106c7.732,0,14-4.701,14-10.5S23.732,4.938,16,4.938zM13.704,19.47l-2.338,2.336l-6.43-6.431l6.429-6.432l2.339,2.341l-4.091,4.091L13.704,19.47zM20.775,21.803l-2.337-2.339l4.092-4.09l-4.092-4.092l2.337-2.339l6.43,6.426L20.775,21.803z", + "raph_talkq": "M16,4.938c-7.732,0-14,4.701-14,10.5c0,1.981,0.741,3.833,2.016,5.414L2,25.272l5.613-1.44c2.339,1.316,5.237,2.106,8.387,2.106c7.732,0,14-4.701,14-10.5S23.732,4.938,16,4.938zM16.868,21.375h-1.969v-1.889h1.969V21.375zM16.772,18.094h-1.777l-0.176-8.083h2.113L16.772,18.094z", + "raph_talke": "M16,4.938c-7.732,0-14,4.701-14,10.5c0,1.981,0.741,3.833,2.016,5.414L2,25.272l5.613-1.44c2.339,1.316,5.237,2.106,8.387,2.106c7.732,0,14-4.701,14-10.5S23.732,4.938,16,4.938zM16.982,21.375h-1.969v-1.889h1.969V21.375zM16.982,17.469v0.625h-1.969v-0.769c0-2.321,2.641-2.689,2.641-4.337c0-0.752-0.672-1.329-1.553-1.329c-0.912,0-1.713,0.672-1.713,0.672l-1.12-1.393c0,0,1.104-1.153,3.009-1.153c1.81,0,3.49,1.121,3.49,3.009C19.768,15.437,16.982,15.741,16.982,17.469z", + "raph_home": "M27.812,16l-3.062-3.062V5.625h-2.625v4.688L16,4.188L4.188,16L7,15.933v11.942h17.875V16H27.812zM16,26.167h-5.833v-7H16V26.167zM21.667,23.167h-3.833v-4.042h3.833V23.167z", + "raph_linkedin": "M27.25,3.125h-22c-1.104,0-2,0.896-2,2v22c0,1.104,0.896,2,2,2h22c1.104,0,2-0.896,2-2v-22C29.25,4.021,28.354,3.125,27.25,3.125zM11.219,26.781h-4v-14h4V26.781zM9.219,11.281c-1.383,0-2.5-1.119-2.5-2.5s1.117-2.5,2.5-2.5s2.5,1.119,2.5,2.5S10.602,11.281,9.219,11.281zM25.219,26.781h-4v-8.5c0-0.4-0.403-1.055-0.687-1.213c-0.375-0.211-1.261-0.229-1.665-0.034l-1.648,0.793v8.954h-4v-14h4v0.614c1.583-0.723,3.78-0.652,5.27,0.184c1.582,0.886,2.73,2.864,2.73,4.702V26.781z", + "raph_github": "M28.436,15.099c-1.201-0.202-2.451-0.335-3.466-0.371l-0.179-0.006c0.041-0.09,0.072-0.151,0.082-0.16c0.022-0.018,0.04-0.094,0.042-0.168c0-0.041,0.018-0.174,0.046-0.35c0.275,0.01,0.64,0.018,1.038,0.021c1.537,0.012,3.145,0.136,4.248,0.331c0.657,0.116,0.874,0.112,0.389-0.006c-0.491-0.119-1.947-0.294-3.107-0.37c-0.779-0.053-1.896-0.073-2.554-0.062c0.019-0.114,0.041-0.241,0.064-0.371c0.093-0.503,0.124-1.009,0.126-2.016c0.002-1.562-0.082-1.992-0.591-3.025c-0.207-0.422-0.441-0.78-0.724-1.104c0.247-0.729,0.241-1.858-0.015-2.848c-0.211-0.812-0.285-0.864-1.021-0.708C22.19,4.019,21.69,4.2,21.049,4.523c-0.303,0.153-0.721,0.391-1.024,0.578c-0.79-0.278-1.607-0.462-2.479-0.561c-0.884-0.1-3.051-0.044-3.82,0.098c-0.752,0.139-1.429,0.309-2.042,0.511c-0.306-0.189-0.75-0.444-1.067-0.604C9.973,4.221,9.473,4.041,8.847,3.908c-0.734-0.157-0.81-0.104-1.02,0.708c-0.26,1.003-0.262,2.151-0.005,2.878C7.852,7.577,7.87,7.636,7.877,7.682c-1.042,1.312-1.382,2.78-1.156,4.829c0.059,0.534,0.15,1.024,0.277,1.473c-0.665-0.004-1.611,0.02-2.294,0.064c-1.162,0.077-2.618,0.25-3.109,0.369c-0.484,0.118-0.269,0.122,0.389,0.007c1.103-0.194,2.712-0.32,4.248-0.331c0.29-0.001,0.561-0.007,0.794-0.013c0.07,0.237,0.15,0.463,0.241,0.678L7.26,14.759c-1.015,0.035-2.264,0.168-3.465,0.37c-0.901,0.151-2.231,0.453-2.386,0.54c-0.163,0.091-0.03,0.071,0.668-0.106c1.273-0.322,2.928-0.569,4.978-0.741l0.229-0.02c0.44,1.022,1.118,1.802,2.076,2.41c0.586,0.373,1.525,0.756,1.998,0.816c0.13,0.016,0.508,0.094,0.84,0.172c0.333,0.078,0.984,0.195,1.446,0.262h0.011c-0.009,0.006-0.017,0.01-0.025,0.016c-0.56,0.291-0.924,0.744-1.169,1.457c-0.11,0.033-0.247,0.078-0.395,0.129c-0.529,0.18-0.735,0.217-1.271,0.221c-0.556,0.004-0.688-0.02-1.02-0.176c-0.483-0.225-0.933-0.639-1.233-1.133c-0.501-0.826-1.367-1.41-2.089-1.41c-0.617,0-0.734,0.25-0.288,0.615c0.672,0.549,1.174,1.109,1.38,1.537c0.116,0.24,0.294,0.611,0.397,0.824c0.109,0.227,0.342,0.535,0.564,0.748c0.522,0.498,1.026,0.736,1.778,0.848c0.504,0.074,0.628,0.074,1.223-0.002c0.287-0.035,0.529-0.076,0.746-0.127c0,0.244,0,0.525,0,0.855c0,1.766-0.021,2.334-0.091,2.5c-0.132,0.316-0.428,0.641-0.716,0.787c-0.287,0.146-0.376,0.307-0.255,0.455c0.067,0.08,0.196,0.094,0.629,0.066c0.822-0.051,1.403-0.355,1.699-0.891c0.095-0.172,0.117-0.518,0.147-2.318c0.032-1.953,0.046-2.141,0.173-2.42c0.077-0.166,0.188-0.346,0.25-0.395c0.104-0.086,0.111,0.084,0.111,2.42c-0.001,2.578-0.027,2.889-0.285,3.385c-0.058,0.113-0.168,0.26-0.245,0.33c-0.135,0.123-0.192,0.438-0.098,0.533c0.155,0.154,0.932-0.088,1.356-0.422c0.722-0.572,0.808-1.045,0.814-4.461l0.003-2.004l0.219,0.021l0.219,0.02l0.036,2.621c0.041,2.951,0.047,2.994,0.549,3.564c0.285,0.322,0.572,0.5,1.039,0.639c0.625,0.188,0.813-0.102,0.393-0.605c-0.457-0.547-0.479-0.756-0.454-3.994c0.017-2.076,0.017-2.076,0.151-1.955c0.282,0.256,0.336,0.676,0.336,2.623c0,2.418,0.069,2.648,0.923,3.07c0.399,0.195,0.511,0.219,1.022,0.221c0.544,0.002,0.577-0.006,0.597-0.148c0.017-0.115-0.05-0.193-0.304-0.348c-0.333-0.205-0.564-0.467-0.709-0.797c-0.055-0.127-0.092-0.959-0.117-2.672c-0.036-2.393-0.044-2.502-0.193-2.877c-0.201-0.504-0.508-0.902-0.897-1.166c-0.101-0.066-0.202-0.121-0.333-0.162c0.161-0.016,0.317-0.033,0.468-0.055c1.572-0.209,2.403-0.383,3.07-0.641c1.411-0.543,2.365-1.445,2.882-2.724c0.046-0.114,0.092-0.222,0.131-0.309l0.398,0.033c2.051,0.173,3.706,0.42,4.979,0.743c0.698,0.177,0.831,0.198,0.668,0.105C30.666,15.551,29.336,15.25,28.436,15.099zM22.422,15.068c-0.233,0.512-0.883,1.17-1.408,1.428c-0.518,0.256-1.33,0.451-2.25,0.544c-0.629,0.064-4.137,0.083-4.716,0.026c-1.917-0.188-2.991-0.557-3.783-1.296c-0.75-0.702-1.1-1.655-1.039-2.828c0.039-0.734,0.216-1.195,0.679-1.755c0.421-0.51,0.864-0.825,1.386-0.985c0.437-0.134,1.778-0.146,3.581-0.03c0.797,0.051,1.456,0.051,2.252,0c1.886-0.119,3.145-0.106,3.61,0.038c0.731,0.226,1.397,0.834,1.797,1.644c0.18,0.362,0.215,0.516,0.241,1.075C22.808,13.699,22.675,14.517,22.422,15.068zM12.912,11.762c-1.073-0.188-1.686,1.649-0.863,2.587c0.391,0.445,0.738,0.518,1.172,0.248c0.402-0.251,0.62-0.72,0.62-1.328C13.841,12.458,13.472,11.862,12.912,11.762zM19.425,11.872c-1.073-0.188-1.687,1.647-0.864,2.586c0.392,0.445,0.738,0.519,1.173,0.247c0.401-0.25,0.62-0.72,0.62-1.328C20.354,12.569,19.985,11.971,19.425,11.872zM16.539,15.484c-0.023,0.074-0.135,0.184-0.248,0.243c-0.286,0.147-0.492,0.096-0.794-0.179c-0.187-0.169-0.272-0.258-0.329-0.081c-0.053,0.164,0.28,0.493,0.537,0.594c0.236,0.094,0.405,0.097,0.661-0.01c0.254-0.106,0.476-0.391,0.476-0.576C16.842,15.303,16.595,15.311,16.539,15.484zM16.222,14.909c0.163-0.144,0.2-0.44,0.044-0.597s-0.473-0.133-0.597,0.043c-0.144,0.206-0.067,0.363,0.036,0.53C15.865,15.009,16.08,15.034,16.222,14.909z", + "raph_flickr": "M21.77,8.895c-2.379,0-4.479,1.174-5.77,2.969c-1.289-1.795-3.39-2.969-5.77-2.969c-3.924,0-7.105,3.181-7.105,7.105c0,3.924,3.181,7.105,7.105,7.105c2.379,0,4.48-1.175,5.77-2.97c1.29,1.795,3.391,2.97,5.77,2.97c3.925,0,7.105-3.182,7.105-7.105C28.875,12.075,25.694,8.895,21.77,8.895zM21.769,21.822c-3.211,0-5.821-2.61-5.821-5.821c0-3.213,2.61-5.824,5.821-5.824c3.213,0,5.824,2.611,5.824,5.824C27.593,19.212,24.981,21.822,21.769,21.822z", + "raph_lock": "M22.335,12.833V9.999h-0.001C22.333,6.501,19.498,3.666,16,3.666S9.666,6.502,9.666,10h0v2.833H7.375V25h17.25V12.833H22.335zM11.667,10C11.667,10,11.667,10,11.667,10c0-2.39,1.944-4.334,4.333-4.334c2.391,0,4.335,1.944,4.335,4.333c0,0,0,0,0,0v2.834h-8.668V10z", + "raph_clip": "M23.898,6.135c-1.571-1.125-3.758-0.764-4.884,0.808l-8.832,12.331c-0.804,1.122-0.546,2.684,0.577,3.488c1.123,0.803,2.684,0.545,3.488-0.578l6.236-8.706l-0.813-0.583l-6.235,8.707h0c-0.483,0.672-1.42,0.828-2.092,0.347c-0.673-0.481-0.827-1.419-0.345-2.093h0l8.831-12.33l0.001-0.001l-0.002-0.001c0.803-1.119,2.369-1.378,3.489-0.576c1.12,0.803,1.379,2.369,0.577,3.489v-0.001l-9.68,13.516l0.001,0.001c-1.124,1.569-3.316,1.931-4.885,0.808c-1.569-1.125-1.93-3.315-0.807-4.885l7.035-9.822l-0.813-0.582l-7.035,9.822c-1.447,2.02-0.982,4.83,1.039,6.277c2.021,1.448,4.831,0.982,6.278-1.037l9.68-13.516C25.83,9.447,25.47,7.261,23.898,6.135z", + "raph_star": "M15.999,22.77l-8.884,6.454l3.396-10.44l-8.882-6.454l10.979,0.002l2.918-8.977l0.476-1.458l3.39,10.433h10.982l-8.886,6.454l3.397,10.443L15.999,22.77L15.999,22.77z", + "raph_star2": "M30.373,12.329H19.391l-3.39-10.433l-0.476,1.458l-2.918,8.977L1.628,12.329l8.882,6.454l-3.396,10.44l8.884-6.454l8.886,6.457l-3.397-10.443L30.373,12.329z M17.175,21.151L16,20.298l-1.175,0.854l-3.902,2.834l1.49-4.584l0.45-1.382l-1.177-0.855l-3.9-2.834h6.275l0.45-1.381L16,8.366l1.489,4.581l0.449,1.381h6.281l-3.906,2.836l-1.178,0.854l0.449,1.384l1.493,4.584L17.175,21.151z", + "raph_plus": "M25.979,12.896 19.312,12.896 19.312,6.229 12.647,6.229 12.647,12.896 5.979,12.896 5.979,19.562 12.647,19.562 12.647,26.229 19.312,26.229 19.312,19.562 25.979,19.562", + "raph_chat": "M15.985,5.972c-7.563,0-13.695,4.077-13.695,9.106c0,2.877,2.013,5.44,5.147,7.108c-0.446,1.479-1.336,3.117-3.056,4.566c0,0,4.015-0.266,6.851-3.143c0.163,0.04,0.332,0.07,0.497,0.107c-0.155-0.462-0.246-0.943-0.246-1.443c0-3.393,3.776-6.05,8.599-6.05c3.464,0,6.379,1.376,7.751,3.406c1.168-1.34,1.847-2.892,1.847-4.552C29.68,10.049,23.548,5.972,15.985,5.972zM27.68,22.274c0-2.79-3.401-5.053-7.599-5.053c-4.196,0-7.599,2.263-7.599,5.053c0,2.791,3.403,5.053,7.599,5.053c0.929,0,1.814-0.116,2.637-0.319c1.573,1.597,3.801,1.744,3.801,1.744c-0.954-0.804-1.447-1.713-1.695-2.534C26.562,25.293,27.68,23.871,27.68,22.274z", + "raph_quote": "M14.505,5.873c-3.937,2.52-5.904,5.556-5.904,9.108c0,1.104,0.192,1.656,0.576,1.656l0.396-0.107c0.312-0.12,0.563-0.18,0.756-0.18c1.128,0,2.07,0.411,2.826,1.229c0.756,0.82,1.134,1.832,1.134,3.037c0,1.157-0.408,2.14-1.224,2.947c-0.816,0.807-1.801,1.211-2.952,1.211c-1.608,0-2.935-0.661-3.979-1.984c-1.044-1.321-1.565-2.98-1.565-4.977c0-2.259,0.443-4.327,1.332-6.203c0.888-1.875,2.243-3.57,4.067-5.085c1.824-1.514,2.988-2.272,3.492-2.272c0.336,0,0.612,0.162,0.828,0.486c0.216,0.324,0.324,0.606,0.324,0.846L14.505,5.873zM27.465,5.873c-3.937,2.52-5.904,5.556-5.904,9.108c0,1.104,0.192,1.656,0.576,1.656l0.396-0.107c0.312-0.12,0.563-0.18,0.756-0.18c1.104,0,2.04,0.411,2.808,1.229c0.769,0.82,1.152,1.832,1.152,3.037c0,1.157-0.408,2.14-1.224,2.947c-0.816,0.807-1.801,1.211-2.952,1.211c-1.608,0-2.935-0.661-3.979-1.984c-1.044-1.321-1.565-2.98-1.565-4.977c0-2.284,0.449-4.369,1.35-6.256c0.9-1.887,2.256-3.577,4.068-5.067c1.812-1.49,2.97-2.236,3.474-2.236c0.336,0,0.612,0.162,0.828,0.486c0.216,0.324,0.324,0.606,0.324,0.846L27.465,5.873z", + "raph_slideshare": "M28.952,12.795c-0.956,1.062-5.073,2.409-5.604,2.409h-4.513c-0.749,0-1.877,0.147-2.408,0.484c0.061,0.054,0.122,0.108,0.181,0.163c0.408,0.379,1.362,0.913,2.206,0.913c0.397,0,0.723-0.115,1-0.354c1.178-1.007,1.79-1.125,2.145-1.125c0.421,0,0.783,0.193,0.996,0.531c0.4,0.626,0.106,1.445-0.194,2.087c-0.718,1.524-3.058,3.171-5.595,3.171c-0.002,0-0.002,0-0.004,0c-0.354,0-0.701-0.033-1.033-0.099v3.251c0,0.742,1.033,2.533,4.167,2.533s3.955-3.701,3.955-4.338v-4.512c2.23-1.169,4.512-1.805,5.604-3.895C30.882,12.05,29.907,11.733,28.952,12.795zM21.942,17.521c0.796-1.699-0.053-1.699-1.54-0.425s-3.665,0.105-4.408-0.585c-0.743-0.689-1.486-1.22-2.814-1.167c-1.328,0.053-4.46-0.161-6.267-0.585c-1.805-0.425-4.895-3-5.15-2.335c-0.266,0.69,0.211,1.168,1.168,2.335c0.955,1.169,5.075,2.778,5.075,2.778s0,3.453,0,4.886c0,1.435,2.973,3.61,4.512,3.61s2.708-1.062,2.708-1.806v-4.512C17.775,21.045,21.146,19.221,21.942,17.521zM20.342,13.73c1.744,0,3.159-1.414,3.159-3.158c0-1.745-1.415-3.159-3.159-3.159s-3.158,1.414-3.158,3.159C17.184,12.316,18.598,13.73,20.342,13.73zM12.019,13.73c1.744,0,3.158-1.414,3.158-3.158c0-1.745-1.414-3.159-3.158-3.159c-1.745,0-3.159,1.414-3.159,3.159C8.86,12.316,10.273,13.73,12.019,13.73z" + } +} diff --git a/dist/extensions/shapelib/raphael_2.json b/dist/extensions/shapelib/raphael_2.json new file mode 100644 index 00000000..98d2d196 --- /dev/null +++ b/dist/extensions/shapelib/raphael_2.json @@ -0,0 +1,64 @@ +{"size": 32, +"fill": true, +"data": { + "raph_twitter": "M23.295,22.567h-7.213c-2.125,0-4.103-2.215-4.103-4.736v-1.829h11.232c1.817,0,3.291-1.469,3.291-3.281c0-1.813-1.474-3.282-3.291-3.282H11.979V6.198c0-1.835-1.375-3.323-3.192-3.323c-1.816,0-3.29,1.488-3.29,3.323v11.633c0,6.23,4.685,11.274,10.476,11.274h7.211c1.818,0,3.318-1.463,3.318-3.298S25.112,22.567,23.295,22.567z", + "raph_gear2": "M17.047,27.945c-0.34,0.032-0.688,0.054-1.046,0.054l0,0c-0.32,0-0.631-0.017-0.934-0.043l0,0l-2.626,3.375l-0.646-0.183c-0.758-0.213-1.494-0.48-2.202-0.8l0,0L8.979,30.07l0.158-4.24c-0.558-0.39-1.079-0.825-1.561-1.302l0,0L3.424,25.42l-0.379-0.557c-0.445-0.654-0.824-1.339-1.16-2.032l0,0l-0.292-0.605l2.819-3.12c-0.176-0.661-0.293-1.343-0.353-2.038l0,0l-3.736-1.975l0.068-0.669c0.08-0.801,0.235-1.567,0.42-2.303l0,0l0.165-0.653l4.167-0.577c0.297-0.627,0.647-1.221,1.041-1.78l0,0l-1.59-3.914l0.48-0.47c0.564-0.55,1.168-1.048,1.798-1.503l0,0l0.546-0.394l3.597,2.259c0.606-0.279,1.24-0.509,1.897-0.685l0,0l1.304-4.046l0.672-0.051c0.362-0.027,0.751-0.058,1.174-0.058l0,0c0.422,0,0.81,0.031,1.172,0.058l0,0l0.672,0.051l1.318,4.088c0.632,0.176,1.244,0.401,1.831,0.674l0,0l3.647-2.291l0.548,0.394c0.63,0.455,1.235,0.954,1.798,1.501l0,0l0.482,0.47l-1.639,4.031c0.357,0.519,0.679,1.068,0.954,1.646l0,0l4.297,0.595l0.167,0.653c0.188,0.735,0.342,1.501,0.42,2.303l0,0l0.068,0.669l-3.866,2.044c-0.058,0.634-0.161,1.258-0.315,1.866l0,0l2.913,3.218l-0.293,0.608c-0.335,0.695-0.712,1.382-1.159,2.034l0,0l-0.379,0.555l-4.255-0.912c-0.451,0.451-0.939,0.866-1.461,1.241l0,0l0.162,4.323l-0.615,0.278c-0.709,0.319-1.444,0.587-2.202,0.8l0,0l-0.648,0.183L17.047,27.945L17.047,27.945zM20.424,29.028c0.227-0.076,0.45-0.157,0.671-0.244l0,0l-0.152-4.083l0.479-0.307c0.717-0.466,1.37-1.024,1.95-1.658l0,0l0.386-0.423l4.026,0.862c0.121-0.202,0.238-0.409,0.351-0.62l0,0l-2.754-3.045l0.171-0.544c0.243-0.783,0.381-1.623,0.422-2.5l0,0l0.025-0.571l3.658-1.933c-0.038-0.234-0.082-0.467-0.132-0.7l0,0l-4.07-0.563l-0.219-0.527c-0.327-0.787-0.76-1.524-1.277-2.204l0,0l-0.342-0.453l1.548-3.808c-0.179-0.157-0.363-0.31-0.552-0.458l0,0l-3.455,2.169L20.649,7.15c-0.754-0.397-1.569-0.698-2.429-0.894l0,0l-0.556-0.127l-1.248-3.87c-0.121-0.006-0.239-0.009-0.354-0.009l0,0c-0.117,0-0.235,0.003-0.357,0.009l0,0l-1.239,3.845l-0.564,0.12c-0.875,0.188-1.709,0.494-2.486,0.896l0,0l-0.508,0.264L7.509,5.249c-0.188,0.148-0.372,0.301-0.55,0.458l0,0l1.507,3.708L8.112,9.869c-0.552,0.709-1.011,1.485-1.355,2.319l0,0l-0.218,0.529l-3.939,0.545c-0.05,0.233-0.094,0.466-0.131,0.7l0,0l3.531,1.867l0.022,0.575c0.037,0.929,0.192,1.82,0.459,2.653l0,0l0.175,0.548l-2.667,2.95c0.112,0.212,0.229,0.419,0.351,0.621l0,0l3.916-0.843l0.39,0.423c0.601,0.657,1.287,1.229,2.043,1.703l0,0l0.488,0.305l-0.149,4.02c0.221,0.087,0.445,0.168,0.672,0.244l0,0l2.479-3.188l0.566,0.07c0.427,0.054,0.843,0.089,1.257,0.089l0,0c0.445,0,0.894-0.039,1.353-0.104l0,0l0.571-0.08L20.424,29.028L20.424,29.028zM21.554,20.75l0.546,0.839l-3.463,2.253l-1.229-1.891l0,0c-0.447,0.109-0.917,0.173-1.406,0.173l0,0c-3.384,0-6.126-2.743-6.126-6.123l0,0c0-3.384,2.742-6.126,6.126-6.126l0,0c3.38,0,6.123,2.742,6.123,6.126l0,0c0,1.389-0.467,2.676-1.25,3.704l0,0L21.554,20.75M19.224,21.073l0.108-0.069l-0.987-1.519l0.572-0.572c0.748-0.75,1.207-1.773,1.207-2.912l0,0c-0.004-2.278-1.848-4.122-4.123-4.126l0,0c-2.28,0.004-4.122,1.846-4.126,4.126l0,0c0.004,2.275,1.848,4.119,4.126,4.123l0,0c0.509,0,0.999-0.104,1.473-0.286l0,0l0.756-0.29L19.224,21.073L19.224,21.073z", + "raph_gear": "M26.974,16.514l3.765-1.991c-0.074-0.738-0.217-1.454-0.396-2.157l-4.182-0.579c-0.362-0.872-0.84-1.681-1.402-2.423l1.594-3.921c-0.524-0.511-1.09-0.977-1.686-1.406l-3.551,2.229c-0.833-0.438-1.73-0.77-2.672-0.984l-1.283-3.976c-0.364-0.027-0.728-0.056-1.099-0.056s-0.734,0.028-1.099,0.056l-1.271,3.941c-0.967,0.207-1.884,0.543-2.738,0.986L7.458,4.037C6.863,4.466,6.297,4.932,5.773,5.443l1.55,3.812c-0.604,0.775-1.11,1.629-1.49,2.55l-4.05,0.56c-0.178,0.703-0.322,1.418-0.395,2.157l3.635,1.923c0.041,1.013,0.209,1.994,0.506,2.918l-2.742,3.032c0.319,0.661,0.674,1.303,1.085,1.905l4.037-0.867c0.662,0.72,1.416,1.351,2.248,1.873l-0.153,4.131c0.663,0.299,1.352,0.549,2.062,0.749l2.554-3.283C15.073,26.961,15.532,27,16,27c0.507,0,1.003-0.046,1.491-0.113l2.567,3.301c0.711-0.2,1.399-0.45,2.062-0.749l-0.156-4.205c0.793-0.513,1.512-1.127,2.146-1.821l4.142,0.889c0.411-0.602,0.766-1.243,1.085-1.905l-2.831-3.131C26.778,18.391,26.93,17.467,26.974,16.514zM20.717,21.297l-1.785,1.162l-1.098-1.687c-0.571,0.22-1.186,0.353-1.834,0.353c-2.831,0-5.125-2.295-5.125-5.125c0-2.831,2.294-5.125,5.125-5.125c2.83,0,5.125,2.294,5.125,5.125c0,1.414-0.573,2.693-1.499,3.621L20.717,21.297z", + "raph_wrench": "M26.834,14.693c1.816-2.088,2.181-4.938,1.193-7.334l-3.646,4.252l-3.594-0.699L19.596,7.45l3.637-4.242c-2.502-0.63-5.258,0.13-7.066,2.21c-1.907,2.193-2.219,5.229-1.039,7.693L5.624,24.04c-1.011,1.162-0.888,2.924,0.274,3.935c1.162,1.01,2.924,0.888,3.935-0.274l9.493-10.918C21.939,17.625,24.918,16.896,26.834,14.693z", + "raph_magic": "M23.043,4.649l-0.404-2.312l-1.59,1.727l-2.323-0.33l1.151,2.045l-1.032,2.108l2.302-0.463l1.686,1.633l0.271-2.332l2.074-1.099L23.043,4.649zM26.217,18.198l-0.182-1.25l-0.882,0.905l-1.245-0.214l0.588,1.118l-0.588,1.118l1.245-0.214l0.882,0.905l0.182-1.25l1.133-0.56L26.217,18.198zM4.92,7.672L5.868,7.3l0.844,0.569L6.65,6.853l0.802-0.627L6.467,5.97L6.118,5.013L5.571,5.872L4.553,5.908l0.647,0.786L4.92,7.672zM10.439,10.505l1.021-1.096l1.481,0.219l-0.727-1.31l0.667-1.341l-1.47,0.287l-1.069-1.048L10.16,7.703L8.832,8.396l1.358,0.632L10.439,10.505zM17.234,12.721c-0.588-0.368-1.172-0.618-1.692-0.729c-0.492-0.089-1.039-0.149-1.425,0.374L2.562,30.788h6.68l9.669-15.416c0.303-0.576,0.012-1.041-0.283-1.447C18.303,13.508,17.822,13.09,17.234,12.721zM13.613,21.936c-0.254-0.396-0.74-0.857-1.373-1.254c-0.632-0.396-1.258-0.634-1.726-0.69l4.421-7.052c0.064-0.013,0.262-0.021,0.543,0.066c0.346,0.092,0.785,0.285,1.225,0.562c0.504,0.313,0.908,0.677,1.133,0.97c0.113,0.145,0.178,0.271,0.195,0.335c0.002,0.006,0.004,0.011,0.004,0.015L13.613,21.936z", + "raph_download": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM16,28.792c-1.549,0-2.806-1.256-2.806-2.806s1.256-2.806,2.806-2.806c1.55,0,2.806,1.256,2.806,2.806S17.55,28.792,16,28.792zM16,21.087l-7.858-6.562h3.469V5.747h8.779v8.778h3.468L16,21.087z", + "raph_firefox": "M28.4,22.469c0.479-0.964,0.851-1.991,1.095-3.066c0.953-3.661,0.666-6.854,0.666-6.854l-0.327,2.104c0,0-0.469-3.896-1.044-5.353c-0.881-2.231-1.273-2.214-1.274-2.21c0.542,1.379,0.494,2.169,0.483,2.288c-0.01-0.016-0.019-0.032-0.027-0.047c-0.131-0.324-0.797-1.819-2.225-2.878c-2.502-2.481-5.943-4.014-9.745-4.015c-4.056,0-7.705,1.745-10.238,4.525C5.444,6.5,5.183,5.938,5.159,5.317c0,0-0.002,0.002-0.006,0.005c0-0.011-0.003-0.021-0.003-0.031c0,0-1.61,1.247-1.436,4.612c-0.299,0.574-0.56,1.172-0.777,1.791c-0.375,0.817-0.75,2.004-1.059,3.746c0,0,0.133-0.422,0.399-0.988c-0.064,0.482-0.103,0.971-0.116,1.467c-0.09,0.845-0.118,1.865-0.039,3.088c0,0,0.032-0.406,0.136-1.021c0.834,6.854,6.667,12.165,13.743,12.165l0,0c1.86,0,3.636-0.37,5.256-1.036C24.938,27.771,27.116,25.196,28.4,22.469zM16.002,3.356c2.446,0,4.73,0.68,6.68,1.86c-2.274-0.528-3.433-0.261-3.423-0.248c0.013,0.015,3.384,0.589,3.981,1.411c0,0-1.431,0-2.856,0.41c-0.065,0.019,5.242,0.663,6.327,5.966c0,0-0.582-1.213-1.301-1.42c0.473,1.439,0.351,4.17-0.1,5.528c-0.058,0.174-0.118-0.755-1.004-1.155c0.284,2.037-0.018,5.268-1.432,6.158c-0.109,0.07,0.887-3.189,0.201-1.93c-4.093,6.276-8.959,2.539-10.934,1.208c1.585,0.388,3.267,0.108,4.242-0.559c0.982-0.672,1.564-1.162,2.087-1.047c0.522,0.117,0.87-0.407,0.464-0.872c-0.405-0.466-1.392-1.105-2.725-0.757c-0.94,0.247-2.107,1.287-3.886,0.233c-1.518-0.899-1.507-1.63-1.507-2.095c0-0.366,0.257-0.88,0.734-1.028c0.58,0.062,1.044,0.214,1.537,0.466c0.005-0.135,0.006-0.315-0.001-0.519c0.039-0.077,0.015-0.311-0.047-0.596c-0.036-0.287-0.097-0.582-0.19-0.851c0.01-0.002,0.017-0.007,0.021-0.021c0.076-0.344,2.147-1.544,2.299-1.659c0.153-0.114,0.55-0.378,0.506-1.183c-0.015-0.265-0.058-0.294-2.232-0.286c-0.917,0.003-1.425-0.894-1.589-1.245c0.222-1.231,0.863-2.11,1.919-2.704c0.02-0.011,0.015-0.021-0.008-0.027c0.219-0.127-2.524-0.006-3.76,1.604C9.674,8.045,9.219,7.95,8.71,7.95c-0.638,0-1.139,0.07-1.603,0.187c-0.05,0.013-0.122,0.011-0.208-0.001C6.769,8.04,6.575,7.88,6.365,7.672c0.161-0.18,0.324-0.356,0.495-0.526C9.201,4.804,12.43,3.357,16.002,3.356z", + "raph_ie": "M27.998,2.266c-2.12-1.91-6.925,0.382-9.575,1.93c-0.76-0.12-1.557-0.185-2.388-0.185c-3.349,0-6.052,0.985-8.106,2.843c-2.336,2.139-3.631,4.94-3.631,8.177c0,0.028,0.001,0.056,0.001,0.084c3.287-5.15,8.342-7.79,9.682-8.487c0.212-0.099,0.338,0.155,0.141,0.253c-0.015,0.042-0.015,0,0,0c-2.254,1.35-6.434,5.259-9.146,10.886l-0.003-0.007c-1.717,3.547-3.167,8.529-0.267,10.358c2.197,1.382,6.13-0.248,9.295-2.318c0.764,0.108,1.567,0.165,2.415,0.165c5.84,0,9.937-3.223,11.399-7.924l-8.022-0.014c-0.337,1.661-1.464,2.548-3.223,2.548c-2.21,0-3.729-1.211-3.828-4.012l15.228-0.014c0.028-0.578-0.042-0.985-0.042-1.436c0-5.251-3.143-9.355-8.255-10.663c2.081-1.294,5.974-3.209,7.848-1.681c1.407,1.14,0.633,3.533,0.295,4.518c-0.056,0.254,0.24,0.296,0.296,0.057C28.814,5.573,29.026,3.194,27.998,2.266zM13.272,25.676c-2.469,1.475-5.873,2.539-7.539,1.289c-1.243-0.935-0.696-3.468,0.398-5.938c0.664,0.992,1.495,1.886,2.473,2.63C9.926,24.651,11.479,25.324,13.272,25.676zM12.714,13.046c0.042-2.435,1.787-3.49,3.617-3.49c1.928,0,3.49,1.112,3.49,3.49H12.714z", + "raph_opera": "M15.954,2.046c-7.489,0-12.872,5.432-12.872,13.581c0,7.25,5.234,13.835,12.873,13.835c7.712,0,12.974-6.583,12.974-13.835C28.929,7.413,23.375,2.046,15.954,2.046zM15.952,26.548L15.952,26.548c-2.289,0-3.49-1.611-4.121-3.796c-0.284-1.037-0.458-2.185-0.563-3.341c-0.114-1.374-0.129-2.773-0.129-4.028c0-0.993,0.018-1.979,0.074-2.926c0.124-1.728,0.386-3.431,0.89-4.833c0.694-1.718,1.871-2.822,3.849-2.822c2.5,0,3.763,1.782,4.385,4.322c0.429,1.894,0.56,4.124,0.56,6.274c0,2.299-0.103,5.153-0.763,7.442C19.473,24.979,18.242,26.548,15.952,26.548z", + "raph_chrome": "M16.277,8.655c-2.879,0-5.227,2.181-5.227,4.854s2.348,4.854,5.227,4.854c2.879,0,5.227-2.181,5.227-4.854S19.156,8.655,16.277,8.655zM29.535,13.486c-0.369-1.819-1.068-3.052-1.727-3.995c0.05,0.129,0.09,0.259,0.138,0.388c-2.34-6.355-11.704-9.8-18.937-5.43c-0.056,0.27-0.073,0.538-0.073,0.804c0-0.051-0.006-0.098-0.004-0.15c-1.743-0.134-3.854,2.061-5.731,6.083c-0.953,2.277-1.298,4.77-0.414,7.693c0.516,1.706,1.328,3.456,2.499,4.814c3.471,4.027,8.788,5.67,11.884,4.835c0.004,0.001,0.009,0.003,0.014,0.004c5.969-0.125,10.494-4.228,12.125-9.569C29.896,17.035,29.934,15.457,29.535,13.486zM6.043,23.04c-0.96-1.112-1.755-2.651-2.299-4.452c-0.733-2.42-0.612-4.65,0.379-7.015C5.129,9.42,6.111,8.005,6.956,7.154c0.15,0.742,0.521,1.628,1.113,2.649c0.218,0.379,0.459,0.701,0.692,1.012c0.179,0.237,0.356,0.474,0.513,0.729c0.124,0.202,0.239,0.445,0.354,0.737c-0.239,2.754,0.892,5.138,3.148,6.679l-2.546,2.25l-0.202,0.171c-0.208,0.171-0.447,0.373-0.651,0.589c-1.36,1.444-0.25,2.831,0.286,3.498l0.068,0.087c0.237,0.297,0.513,0.62,0.815,0.938C8.963,25.725,7.375,24.585,6.043,23.04zM28.354,18.67c-1.6,5.232-5.937,8.7-11.07,8.859c-2.485-0.583-4.362-1.78-5.586-3.557c0.004-0.004,0.01-0.008,0.015-0.013l4.944-3.836c2.226-0.124,3.854-0.888,4.847-2.278c1.222-1.412,1.792-3.025,1.693-4.861c1.817,0.377,3.389,0.903,4.855,1.883l0.116,0.078l0.134,0.043c0.156,0.049,0.311,0.076,0.459,0.081C28.87,16.309,28.74,17.402,28.354,18.67zM28.609,14.037c-1.951-1.306-4.062-1.867-6.594-2.285c0.531,2.358-0.084,4.072-1.326,5.512c-0.882,1.235-2.382,1.822-4.394,1.875l-5.22,4.052c-0.497,0.409-0.591,0.819-0.282,1.229c0.849,1.277,1.929,2.202,3.122,2.878c-0.013,0-0.026,0.002-0.039,0.003c-0.001-0.001-0.004-0.002-0.006-0.004c-0.02,0.003-0.041,0.004-0.062,0.005c-0.08,0.001-0.16-0.001-0.239-0.01c-0.156-0.021-0.314-0.064-0.459-0.118c-0.898-0.333-1.89-1.352-2.597-2.239c-0.581-0.73-1.206-1.433-0.411-2.275c0.258-0.273,0.582-0.514,0.789-0.698l2.521-2.229c0.172-0.137,0.35-0.277,0.535-0.423c0.053-0.042,0.107-0.084,0.162-0.127c0.564-0.442,0.483-0.32-0.108-0.642c-2.419-1.32-3.677-3.614-3.354-6.389c-0.149-0.41-0.317-0.792-0.518-1.124c-0.363-0.6-0.834-1.102-1.194-1.723c-0.9-1.556-1.847-3.902,0.013-3.682c-0.005-0.053-0.002-0.11-0.005-0.164c0.094,2.001,1.526,3.823,1.742,4.888c0.078,0.382,0.294,0.705,0.612,0.28c2.538-3.395,6.069-3.053,8.328-1.312c0.443,0.34,0.684,0.755,1.084,1.11c0.154,0.138,0.328,0.259,0.535,0.351c0.743,0.332,1.807,0.312,2.607,0.434c1.371,0.208,2.707,0.464,3.971,0.812c0.25,0.03,0.424-0.004,0.521-0.101c0.211-0.208-0.002-0.887-0.121-1.263c0.277,0.805,0.536,1.609,0.773,2.415C29.176,13.701,29.133,14.208,28.609,14.037z", + "raph_safari": "M16.154,5.135c-0.504,0-1,0.031-1.488,0.089l-0.036-0.18c-0.021-0.104-0.06-0.198-0.112-0.283c0.381-0.308,0.625-0.778,0.625-1.306c0-0.927-0.751-1.678-1.678-1.678s-1.678,0.751-1.678,1.678c0,0.745,0.485,1.376,1.157,1.595c-0.021,0.105-0.021,0.216,0,0.328l0.033,0.167C7.645,6.95,3.712,11.804,3.712,17.578c0,6.871,5.571,12.441,12.442,12.441c6.871,0,12.441-5.57,12.441-12.441C28.596,10.706,23.025,5.135,16.154,5.135zM16.369,8.1c4.455,0,8.183,3.116,9.123,7.287l-0.576,0.234c-0.148-0.681-0.755-1.191-1.48-1.191c-0.837,0-1.516,0.679-1.516,1.516c0,0.075,0.008,0.148,0.018,0.221l-2.771-0.028c-0.054-0.115-0.114-0.226-0.182-0.333l3.399-5.11l0.055-0.083l-4.766,4.059c-0.352-0.157-0.74-0.248-1.148-0.256l0.086-0.018l-1.177-2.585c0.64-0.177,1.111-0.763,1.111-1.459c0-0.837-0.678-1.515-1.516-1.515c-0.075,0-0.147,0.007-0.219,0.018l0.058-0.634C15.357,8.141,15.858,8.1,16.369,8.1zM12.146,3.455c0-0.727,0.591-1.318,1.318-1.318c0.727,0,1.318,0.591,1.318,1.318c0,0.425-0.203,0.802-0.516,1.043c-0.183-0.123-0.413-0.176-0.647-0.13c-0.226,0.045-0.413,0.174-0.535,0.349C12.542,4.553,12.146,4.049,12.146,3.455zM7.017,17.452c0-4.443,3.098-8.163,7.252-9.116l0.297,0.573c-0.61,0.196-1.051,0.768-1.051,1.442c0,0.837,0.678,1.516,1.515,1.516c0.068,0,0.135-0.006,0.2-0.015l-0.058,2.845l0.052-0.011c-0.442,0.204-0.824,0.513-1.116,0.895l0.093-0.147l-1.574-0.603l1.172,1.239l0.026-0.042c-0.19,0.371-0.306,0.788-0.324,1.229l-0.003-0.016l-2.623,1.209c-0.199-0.604-0.767-1.041-1.438-1.041c-0.837,0-1.516,0.678-1.516,1.516c0,0.064,0.005,0.128,0.013,0.191l-0.783-0.076C7.063,18.524,7.017,17.994,7.017,17.452zM16.369,26.805c-4.429,0-8.138-3.078-9.106-7.211l0.691-0.353c0.146,0.686,0.753,1.2,1.482,1.2c0.837,0,1.515-0.679,1.515-1.516c0-0.105-0.011-0.207-0.031-0.307l2.858,0.03c0.045,0.095,0.096,0.187,0.15,0.276l-3.45,5.277l0.227-0.195l4.529-3.92c0.336,0.153,0.705,0.248,1.094,0.266l-0.019,0.004l1.226,2.627c-0.655,0.166-1.142,0.76-1.142,1.468c0,0.837,0.678,1.515,1.516,1.515c0.076,0,0.151-0.007,0.225-0.018l0.004,0.688C17.566,26.746,16.975,26.805,16.369,26.805zM18.662,26.521l-0.389-0.6c0.661-0.164,1.152-0.759,1.152-1.47c0-0.837-0.68-1.516-1.516-1.516c-0.066,0-0.13,0.005-0.193,0.014v-2.86l-0.025,0.004c0.409-0.185,0.77-0.459,1.055-0.798l1.516,0.659l-1.104-1.304c0.158-0.335,0.256-0.704,0.278-1.095l2.552-1.164c0.19,0.618,0.766,1.068,1.447,1.068c0.838,0,1.516-0.679,1.516-1.516c0-0.069-0.006-0.137-0.016-0.204l0.65,0.12c0.089,0.517,0.136,1.049,0.136,1.591C25.722,21.826,22.719,25.499,18.662,26.521z", + "raph_view": "M16,8.286C8.454,8.286,2.5,16,2.5,16s5.954,7.715,13.5,7.715c5.771,0,13.5-7.715,13.5-7.715S21.771,8.286,16,8.286zM16,20.807c-2.649,0-4.807-2.157-4.807-4.807s2.158-4.807,4.807-4.807s4.807,2.158,4.807,4.807S18.649,20.807,16,20.807zM16,13.194c-1.549,0-2.806,1.256-2.806,2.806c0,1.55,1.256,2.806,2.806,2.806c1.55,0,2.806-1.256,2.806-2.806C18.806,14.451,17.55,13.194,16,13.194z", + "raph_noview": "M11.478,17.568c-0.172-0.494-0.285-1.017-0.285-1.568c0-2.65,2.158-4.807,4.807-4.807c0.552,0,1.074,0.113,1.568,0.285l2.283-2.283C18.541,8.647,17.227,8.286,16,8.286C8.454,8.286,2.5,16,2.5,16s2.167,2.791,5.53,5.017L11.478,17.568zM23.518,11.185l-3.056,3.056c0.217,0.546,0.345,1.138,0.345,1.76c0,2.648-2.158,4.807-4.807,4.807c-0.622,0-1.213-0.128-1.76-0.345l-2.469,2.47c1.327,0.479,2.745,0.783,4.229,0.783c5.771,0,13.5-7.715,13.5-7.715S26.859,13.374,23.518,11.185zM25.542,4.917L4.855,25.604L6.27,27.02L26.956,6.332L25.542,4.917z", + "raph_cloud": "M24.345,13.904c0.019-0.195,0.03-0.392,0.03-0.591c0-3.452-2.798-6.25-6.25-6.25c-2.679,0-4.958,1.689-5.847,4.059c-0.589-0.646-1.429-1.059-2.372-1.059c-1.778,0-3.219,1.441-3.219,3.219c0,0.21,0.023,0.415,0.062,0.613c-2.372,0.391-4.187,2.436-4.187,4.918c0,2.762,2.239,5,5,5h15.875c2.762,0,5-2.238,5-5C28.438,16.362,26.672,14.332,24.345,13.904z", + "raph_cloud2": "M7.562,24.812c-3.313,0-6-2.687-6-6l0,0c0.002-2.659,1.734-4.899,4.127-5.684l0,0c0.083-2.26,1.937-4.064,4.216-4.066l0,0c0.73,0,1.415,0.19,2.01,0.517l0,0c1.266-2.105,3.57-3.516,6.208-3.517l0,0c3.947,0.002,7.157,3.155,7.248,7.079l0,0c2.362,0.804,4.062,3.034,4.064,5.671l0,0c0,3.313-2.687,6-6,6l0,0H7.562L7.562,24.812zM24.163,14.887c-0.511-0.095-0.864-0.562-0.815-1.079l0,0c0.017-0.171,0.027-0.336,0.027-0.497l0,0c-0.007-2.899-2.352-5.245-5.251-5.249l0,0c-2.249-0.002-4.162,1.418-4.911,3.41l0,0c-0.122,0.323-0.406,0.564-0.748,0.63l0,0c-0.34,0.066-0.694-0.052-0.927-0.309l0,0c-0.416-0.453-0.986-0.731-1.633-0.731l0,0c-1.225,0.002-2.216,0.993-2.22,2.218l0,0c0,0.136,0.017,0.276,0.045,0.424l0,0c0.049,0.266-0.008,0.54-0.163,0.762l0,0c-0.155,0.223-0.392,0.371-0.657,0.414l0,0c-1.9,0.313-3.352,1.949-3.35,3.931l0,0c0.004,2.209,1.792,3.995,4.001,4.001l0,0h15.874c2.209-0.006,3.994-1.792,3.999-4.001l0,0C27.438,16.854,26.024,15.231,24.163,14.887L24.163,14.887", + "raph_cloudDown": "M24.345,13.904c0.019-0.195,0.03-0.392,0.03-0.591c0-3.452-2.798-6.25-6.25-6.25c-2.679,0-4.958,1.689-5.847,4.059c-0.589-0.646-1.429-1.059-2.372-1.059c-1.778,0-3.219,1.441-3.219,3.219c0,0.21,0.023,0.415,0.062,0.613c-2.372,0.391-4.187,2.436-4.187,4.918c0,2.762,2.239,5,5,5h3.404l-0.707-0.707c-0.377-0.377-0.585-0.879-0.585-1.413c0-0.533,0.208-1.035,0.585-1.412l0.556-0.557c0.4-0.399,0.937-0.628,1.471-0.628c0.027,0,0.054,0,0.08,0.002v-0.472c0-1.104,0.898-2.002,2-2.002h3.266c1.103,0,2,0.898,2,2.002v0.472c0.027-0.002,0.054-0.002,0.081-0.002c0.533,0,1.07,0.229,1.47,0.63l0.557,0.552c0.78,0.781,0.78,2.05,0,2.828l-0.706,0.707h2.403c2.762,0,5-2.238,5-5C28.438,16.362,26.672,14.332,24.345,13.904z M21.033,20.986l-0.556-0.555c-0.39-0.389-0.964-0.45-1.276-0.137c-0.312,0.312-0.568,0.118-0.568-0.432v-1.238c0-0.55-0.451-1-1-1h-3.265c-0.55,0-1,0.45-1,1v1.238c0,0.55-0.256,0.744-0.569,0.432c-0.312-0.313-0.887-0.252-1.276,0.137l-0.556,0.555c-0.39,0.389-0.39,1.024-0.001,1.413l4.328,4.331c0.194,0.194,0.451,0.291,0.707,0.291s0.512-0.097,0.707-0.291l4.327-4.331C21.424,22.011,21.423,21.375,21.033,20.986z", + "raph_cloudUp": "M24.345,13.904c0.019-0.195,0.03-0.392,0.03-0.591c0-3.452-2.798-6.25-6.25-6.25c-2.679,0-4.958,1.689-5.847,4.059c-0.589-0.646-1.429-1.059-2.372-1.059c-1.778,0-3.219,1.441-3.219,3.219c0,0.21,0.023,0.415,0.062,0.613c-2.372,0.391-4.187,2.436-4.187,4.918c0,2.762,2.239,5,5,5h2.312c-0.126-0.266-0.2-0.556-0.2-0.859c0-0.535,0.208-1.04,0.587-1.415l4.325-4.329c0.375-0.377,0.877-0.585,1.413-0.585c0.54,0,1.042,0.21,1.417,0.587l4.323,4.329c0.377,0.373,0.585,0.878,0.585,1.413c0,0.304-0.073,0.594-0.2,0.859h1.312c2.762,0,5-2.238,5-5C28.438,16.362,26.672,14.332,24.345,13.904z M16.706,17.916c-0.193-0.195-0.45-0.291-0.706-0.291s-0.512,0.096-0.707,0.291l-4.327,4.33c-0.39,0.389-0.389,1.025,0.001,1.414l0.556,0.555c0.39,0.389,0.964,0.449,1.276,0.137s0.568-0.119,0.568,0.432v1.238c0,0.549,0.451,1,1,1h3.265c0.551,0,1-0.451,1-1v-1.238c0-0.551,0.256-0.744,0.569-0.432c0.312,0.312,0.887,0.252,1.276-0.137l0.556-0.555c0.39-0.389,0.39-1.025,0.001-1.414L16.706,17.916z", + "raph_location": "M16,3.5c-4.142,0-7.5,3.358-7.5,7.5c0,4.143,7.5,18.121,7.5,18.121S23.5,15.143,23.5,11C23.5,6.858,20.143,3.5,16,3.5z M16,14.584c-1.979,0-3.584-1.604-3.584-3.584S14.021,7.416,16,7.416S19.584,9.021,19.584,11S17.979,14.584,16,14.584z", + "raph_volume0": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z", + "raph_volume1": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z M18.806,11.219c-0.393-0.389-1.024-0.389-1.415,0.002c-0.39,0.391-0.39,1.024,0.002,1.416v-0.002c0.863,0.864,1.395,2.049,1.395,3.366c0,1.316-0.531,2.497-1.393,3.361c-0.394,0.389-0.394,1.022-0.002,1.415c0.195,0.195,0.451,0.293,0.707,0.293c0.257,0,0.513-0.098,0.708-0.293c1.222-1.22,1.98-2.915,1.979-4.776C20.788,14.136,20.027,12.439,18.806,11.219z", + "raph_volume2": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z M18.806,11.219c-0.393-0.389-1.024-0.389-1.415,0.002c-0.39,0.391-0.39,1.024,0.002,1.416v-0.002c0.863,0.864,1.395,2.049,1.395,3.366c0,1.316-0.531,2.497-1.393,3.361c-0.394,0.389-0.394,1.022-0.002,1.415c0.195,0.195,0.451,0.293,0.707,0.293c0.257,0,0.513-0.098,0.708-0.293c1.222-1.22,1.98-2.915,1.979-4.776C20.788,14.136,20.027,12.439,18.806,11.219z M21.101,8.925c-0.393-0.391-1.024-0.391-1.413,0c-0.392,0.391-0.392,1.025,0,1.414c1.45,1.451,2.344,3.447,2.344,5.661c0,2.212-0.894,4.207-2.342,5.659c-0.392,0.39-0.392,1.023,0,1.414c0.195,0.195,0.451,0.293,0.708,0.293c0.256,0,0.512-0.098,0.707-0.293c1.808-1.809,2.929-4.315,2.927-7.073C24.033,13.24,22.912,10.732,21.101,8.925z", + "raph_volume3": "M4.998,12.127v7.896h4.495l6.729,5.526l0.004-18.948l-6.73,5.526H4.998z M18.806,11.219c-0.393-0.389-1.024-0.389-1.415,0.002c-0.39,0.391-0.39,1.024,0.002,1.416v-0.002c0.863,0.864,1.395,2.049,1.395,3.366c0,1.316-0.531,2.497-1.393,3.361c-0.394,0.389-0.394,1.022-0.002,1.415c0.195,0.195,0.451,0.293,0.707,0.293c0.257,0,0.513-0.098,0.708-0.293c1.222-1.22,1.98-2.915,1.979-4.776C20.788,14.136,20.027,12.439,18.806,11.219z M21.101,8.925c-0.393-0.391-1.024-0.391-1.413,0c-0.392,0.391-0.392,1.025,0,1.414c1.45,1.451,2.344,3.447,2.344,5.661c0,2.212-0.894,4.207-2.342,5.659c-0.392,0.39-0.392,1.023,0,1.414c0.195,0.195,0.451,0.293,0.708,0.293c0.256,0,0.512-0.098,0.707-0.293c1.808-1.809,2.929-4.315,2.927-7.073C24.033,13.24,22.912,10.732,21.101,8.925z M23.28,6.746c-0.393-0.391-1.025-0.389-1.414,0.002c-0.391,0.389-0.391,1.023,0.002,1.413h-0.002c2.009,2.009,3.248,4.773,3.248,7.839c0,3.063-1.239,5.828-3.246,7.838c-0.391,0.39-0.391,1.023,0.002,1.415c0.194,0.194,0.45,0.291,0.706,0.291s0.513-0.098,0.708-0.293c2.363-2.366,3.831-5.643,3.829-9.251C27.115,12.389,25.647,9.111,23.28,6.746z", + "raph_key": "M18.386,16.009l0.009-0.006l-0.58-0.912c1.654-2.226,1.876-5.319,0.3-7.8c-2.043-3.213-6.303-4.161-9.516-2.118c-3.212,2.042-4.163,6.302-2.12,9.517c1.528,2.402,4.3,3.537,6.944,3.102l0.424,0.669l0.206,0.045l0.779-0.447l-0.305,1.377l2.483,0.552l-0.296,1.325l1.903,0.424l-0.68,3.06l1.406,0.313l-0.424,1.906l4.135,0.918l0.758-3.392L18.386,16.009z M10.996,8.944c-0.685,0.436-1.593,0.233-2.029-0.452C8.532,7.807,8.733,6.898,9.418,6.463s1.594-0.233,2.028,0.452C11.883,7.6,11.68,8.509,10.996,8.944z", + "raph_ruler": "M6.63,21.796l-5.122,5.121h25.743V1.175L6.63,21.796zM18.702,10.48c0.186-0.183,0.48-0.183,0.664,0l1.16,1.159c0.184,0.183,0.186,0.48,0.002,0.663c-0.092,0.091-0.213,0.137-0.332,0.137c-0.121,0-0.24-0.046-0.33-0.137l-1.164-1.159C18.519,10.96,18.519,10.664,18.702,10.48zM17.101,12.084c0.184-0.183,0.48-0.183,0.662,0l2.156,2.154c0.184,0.183,0.184,0.48,0.002,0.661c-0.092,0.092-0.213,0.139-0.334,0.139s-0.24-0.046-0.33-0.137l-2.156-2.154C16.917,12.564,16.917,12.267,17.101,12.084zM15.497,13.685c0.184-0.183,0.48-0.183,0.664,0l1.16,1.161c0.184,0.183,0.182,0.48-0.002,0.663c-0.092,0.092-0.211,0.138-0.33,0.138c-0.121,0-0.24-0.046-0.332-0.138l-1.16-1.16C15.314,14.166,15.314,13.868,15.497,13.685zM13.896,15.288c0.184-0.183,0.48-0.181,0.664,0.002l1.158,1.159c0.183,0.184,0.183,0.48,0,0.663c-0.092,0.092-0.212,0.138-0.332,0.138c-0.119,0-0.24-0.046-0.332-0.138l-1.158-1.161C13.713,15.767,13.713,15.471,13.896,15.288zM12.293,16.892c0.183-0.184,0.479-0.184,0.663,0l2.154,2.153c0.184,0.184,0.184,0.481,0,0.665c-0.092,0.092-0.211,0.138-0.33,0.138c-0.121,0-0.242-0.046-0.334-0.138l-2.153-2.155C12.11,17.371,12.11,17.075,12.293,16.892zM10.302,24.515c-0.091,0.093-0.212,0.139-0.332,0.139c-0.119,0-0.238-0.045-0.33-0.137l-2.154-2.153c-0.184-0.183-0.184-0.479,0-0.663s0.479-0.184,0.662,0l2.154,2.153C10.485,24.036,10.485,24.332,10.302,24.515zM10.912,21.918c-0.093,0.093-0.214,0.139-0.333,0.139c-0.12,0-0.24-0.045-0.33-0.137l-1.162-1.161c-0.184-0.183-0.184-0.479,0-0.66c0.184-0.185,0.48-0.187,0.664-0.003l1.161,1.162C11.095,21.438,11.095,21.735,10.912,21.918zM12.513,20.316c-0.092,0.092-0.211,0.138-0.332,0.138c-0.119,0-0.239-0.046-0.331-0.138l-1.159-1.16c-0.184-0.184-0.184-0.48,0-0.664s0.48-0.182,0.663,0.002l1.159,1.161C12.696,19.838,12.696,20.135,12.513,20.316zM22.25,21.917h-8.67l8.67-8.67V21.917zM22.13,10.7c-0.09,0.092-0.211,0.138-0.33,0.138c-0.121,0-0.242-0.046-0.334-0.138l-1.16-1.159c-0.184-0.183-0.184-0.479,0-0.663c0.182-0.183,0.479-0.183,0.662,0l1.16,1.159C22.312,10.221,22.313,10.517,22.13,10.7zM24.726,10.092c-0.092,0.092-0.213,0.137-0.332,0.137s-0.24-0.045-0.33-0.137l-2.154-2.154c-0.184-0.183-0.184-0.481,0-0.664s0.482-0.181,0.664,0.002l2.154,2.154C24.911,9.613,24.909,9.91,24.726,10.092z", + "raph_power": "M21.816,3.999c-0.993-0.481-2.189-0.068-2.673,0.927c-0.482,0.995-0.066,2.191,0.927,2.673c3.115,1.516,5.265,4.705,5.263,8.401c-0.01,5.154-4.18,9.324-9.333,9.333c-5.154-0.01-9.324-4.18-9.334-9.333c-0.002-3.698,2.149-6.89,5.267-8.403c0.995-0.482,1.408-1.678,0.927-2.673c-0.482-0.993-1.676-1.409-2.671-0.927C5.737,6.152,2.667,10.72,2.665,16C2.667,23.364,8.634,29.332,16,29.334c7.365-0.002,13.333-5.97,13.334-13.334C29.332,10.722,26.266,6.157,21.816,3.999z M16,13.833c1.104,0,1.999-0.894,1.999-2V2.499C17.999,1.394,17.104,0.5,16,0.5c-1.106,0-2,0.895-2,1.999v9.333C14,12.938,14.894,13.833,16,13.833z", + "raph_unlock": "M20.375,12.833h-2.209V10c0,0,0,0,0-0.001c0-2.389,1.945-4.333,4.334-4.333c2.391,0,4.335,1.944,4.335,4.333c0,0,0,0,0,0v2.834h2V9.999h-0.001c-0.001-3.498-2.836-6.333-6.334-6.333S16.166,6.502,16.166,10v2.833H3.125V25h17.25V12.833z", + "raph_flag": "M26.04,9.508c0.138-0.533,0.15-1.407,0.028-1.943l-0.404-1.771c-0.122-0.536-0.665-1.052-1.207-1.146l-3.723-0.643c-0.542-0.094-1.429-0.091-1.97,0.007l-4.033,0.726c-0.542,0.098-1.429,0.108-1.973,0.023L8.812,4.146C8.817,4.165,8.826,4.182,8.83,4.201l2.701,12.831l1.236,0.214c0.542,0.094,1.428,0.09,1.97-0.007l4.032-0.727c0.541-0.097,1.429-0.107,1.973-0.022l4.329,0.675c0.544,0.085,0.906-0.288,0.807-0.829l-0.485-2.625c-0.1-0.541-0.069-1.419,0.068-1.952L26.04,9.508zM6.667,3.636C6.126,3.75,5.78,4.279,5.894,4.819l5.763,27.378H13.7L7.852,4.409C7.736,3.867,7.207,3.521,6.667,3.636z", + "raph_tag": "M14.263,2.826H7.904L2.702,8.028v6.359L18.405,30.09l11.561-11.562L14.263,2.826zM6.495,8.859c-0.619-0.619-0.619-1.622,0-2.24C7.114,6,8.117,6,8.736,6.619c0.62,0.62,0.619,1.621,0,2.241C8.117,9.479,7.114,9.479,6.495,8.859z", + "raph_search": "M29.772,26.433l-7.126-7.126c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127L29.772,26.433zM7.203,13.885c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486c-0.007,3.58-2.905,6.476-6.484,6.484C10.106,20.361,7.209,17.465,7.203,13.885z", + "raph_zoomout": "M22.646,19.307c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127l3.535-3.537L22.646,19.307zM13.688,20.369c-3.582-0.008-6.478-2.904-6.484-6.484c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486C20.165,17.465,17.267,20.361,13.688,20.369zM8.854,11.884v4.001l9.665-0.001v-3.999L8.854,11.884z", + "raph_zoomin": "M22.646,19.307c0.96-1.583,1.523-3.435,1.524-5.421C24.169,8.093,19.478,3.401,13.688,3.399C7.897,3.401,3.204,8.093,3.204,13.885c0,5.789,4.693,10.481,10.484,10.481c1.987,0,3.839-0.563,5.422-1.523l7.128,7.127l3.535-3.537L22.646,19.307zM13.688,20.369c-3.582-0.008-6.478-2.904-6.484-6.484c0.006-3.582,2.903-6.478,6.484-6.486c3.579,0.008,6.478,2.904,6.484,6.486C20.165,17.465,17.267,20.361,13.688,20.369zM15.687,9.051h-4v2.833H8.854v4.001h2.833v2.833h4v-2.834h2.832v-3.999h-2.833V9.051z", + "raph_cross": "M24.778,21.419 19.276,15.917 24.777,10.415 21.949,7.585 16.447,13.087 10.945,7.585 8.117,10.415 13.618,15.917 8.116,21.419 10.946,24.248 16.447,18.746 21.948,24.248", + "raph_check": "M2.379,14.729 5.208,11.899 12.958,19.648 25.877,6.733 28.707,9.561 12.958,25.308", + "raph_settings": "M16.015,12.03c-2.156,0-3.903,1.747-3.903,3.903c0,2.155,1.747,3.903,3.903,3.903c0.494,0,0.962-0.102,1.397-0.27l0.836,1.285l1.359-0.885l-0.831-1.276c0.705-0.706,1.142-1.681,1.142-2.757C19.918,13.777,18.171,12.03,16.015,12.03zM16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM26.174,20.809c-0.241,0.504-0.513,0.99-0.826,1.45L22.19,21.58c-0.481,0.526-1.029,0.994-1.634,1.385l0.119,3.202c-0.507,0.23-1.028,0.421-1.569,0.57l-1.955-2.514c-0.372,0.051-0.75,0.086-1.136,0.086c-0.356,0-0.706-0.029-1.051-0.074l-1.945,2.5c-0.541-0.151-1.065-0.342-1.57-0.569l0.117-3.146c-0.634-0.398-1.208-0.88-1.712-1.427L6.78,22.251c-0.313-0.456-0.583-0.944-0.826-1.448l2.088-2.309c-0.226-0.703-0.354-1.451-0.385-2.223l-2.768-1.464c0.055-0.563,0.165-1.107,0.301-1.643l3.084-0.427c0.29-0.702,0.675-1.352,1.135-1.942L8.227,7.894c0.399-0.389,0.83-0.744,1.283-1.07l2.663,1.672c0.65-0.337,1.349-0.593,2.085-0.75l0.968-3.001c0.278-0.021,0.555-0.042,0.837-0.042c0.282,0,0.56,0.022,0.837,0.042l0.976,3.028c0.72,0.163,1.401,0.416,2.036,0.75l2.704-1.697c0.455,0.326,0.887,0.681,1.285,1.07l-1.216,2.986c0.428,0.564,0.793,1.181,1.068,1.845l3.185,0.441c0.135,0.535,0.247,1.081,0.302,1.643l-2.867,1.516c-0.034,0.726-0.15,1.43-0.355,2.1L26.174,20.809z", + "raph_settingsalt": "M16,1.466C7.973,1.466,1.466,7.973,1.466,16c0,8.027,6.507,14.534,14.534,14.534c8.027,0,14.534-6.507,14.534-14.534C30.534,7.973,24.027,1.466,16,1.466zM24.386,14.968c-1.451,1.669-3.706,2.221-5.685,1.586l-7.188,8.266c-0.766,0.88-2.099,0.97-2.979,0.205s-0.973-2.099-0.208-2.979l7.198-8.275c-0.893-1.865-0.657-4.164,0.787-5.824c1.367-1.575,3.453-2.151,5.348-1.674l-2.754,3.212l0.901,2.621l2.722,0.529l2.761-3.22C26.037,11.229,25.762,13.387,24.386,14.968z", + "raph_feed": "M4.135,16.762c3.078,0,5.972,1.205,8.146,3.391c2.179,2.187,3.377,5.101,3.377,8.202h4.745c0-9.008-7.299-16.335-16.269-16.335V16.762zM4.141,8.354c10.973,0,19.898,8.975,19.898,20.006h4.743c0-13.646-11.054-24.749-24.642-24.749V8.354zM10.701,25.045c0,1.815-1.471,3.287-3.285,3.287s-3.285-1.472-3.285-3.287c0-1.813,1.471-3.285,3.285-3.285S10.701,23.231,10.701,25.045z", + "raph_bug": "M28.589,10.903l-5.828,1.612c-0.534-1.419-1.338-2.649-2.311-3.628l3.082-5.44c0.271-0.48,0.104-1.092-0.38-1.365c-0.479-0.271-1.09-0.102-1.36,0.377l-2.924,5.162c-0.604-0.383-1.24-0.689-1.9-0.896c-0.416-1.437-1.652-2.411-3.058-2.562c-0.001-0.004-0.002-0.008-0.003-0.012c-0.061-0.242-0.093-0.46-0.098-0.65c-0.005-0.189,0.012-0.351,0.046-0.479c0.037-0.13,0.079-0.235,0.125-0.317c0.146-0.26,0.34-0.43,0.577-0.509c0.023,0.281,0.142,0.482,0.352,0.601c0.155,0.088,0.336,0.115,0.546,0.086c0.211-0.031,0.376-0.152,0.496-0.363c0.105-0.186,0.127-0.389,0.064-0.607c-0.064-0.219-0.203-0.388-0.414-0.507c-0.154-0.087-0.314-0.131-0.482-0.129c-0.167,0.001-0.327,0.034-0.481,0.097c-0.153,0.063-0.296,0.16-0.429,0.289c-0.132,0.129-0.241,0.271-0.33,0.426c-0.132,0.234-0.216,0.496-0.25,0.783c-0.033,0.286-0.037,0.565-0.009,0.84c0.017,0.16,0.061,0.301,0.094,0.449c-0.375-0.021-0.758,0.002-1.14,0.108c-0.482,0.133-0.913,0.36-1.28,0.653c-0.052-0.172-0.098-0.344-0.18-0.518c-0.116-0.249-0.263-0.486-0.438-0.716c-0.178-0.229-0.384-0.41-0.618-0.543C9.904,3.059,9.737,2.994,9.557,2.951c-0.18-0.043-0.352-0.052-0.516-0.027s-0.318,0.08-0.463,0.164C8.432,3.172,8.318,3.293,8.23,3.445C8.111,3.656,8.08,3.873,8.136,4.092c0.058,0.221,0.181,0.384,0.367,0.49c0.21,0.119,0.415,0.138,0.611,0.056C9.31,4.556,9.451,4.439,9.539,4.283c0.119-0.21,0.118-0.443-0.007-0.695c0.244-0.055,0.497-0.008,0.757,0.141c0.081,0.045,0.171,0.115,0.27,0.208c0.097,0.092,0.193,0.222,0.286,0.388c0.094,0.166,0.179,0.368,0.251,0.608c0.013,0.044,0.023,0.098,0.035,0.146c-0.911,0.828-1.357,2.088-1.098,3.357c-0.582,0.584-1.072,1.27-1.457,2.035l-5.16-2.926c-0.48-0.271-1.092-0.102-1.364,0.377C1.781,8.404,1.95,9.016,2.43,9.289l5.441,3.082c-0.331,1.34-0.387,2.807-0.117,4.297l-5.828,1.613c-0.534,0.147-0.846,0.699-0.698,1.231c0.147,0.53,0.697,0.843,1.231,0.694l5.879-1.627c0.503,1.057,1.363,2.28,2.371,3.443l-3.194,5.639c-0.272,0.481-0.104,1.092,0.378,1.363c0.239,0.137,0.512,0.162,0.758,0.094c0.248-0.068,0.469-0.229,0.604-0.471l2.895-5.109c2.7,2.594,5.684,4.123,5.778,1.053c1.598,2.56,3.451-0.338,4.502-3.976l5.203,2.947c0.24,0.138,0.514,0.162,0.762,0.094c0.246-0.067,0.467-0.229,0.603-0.471c0.272-0.479,0.104-1.091-0.377-1.362l-5.701-3.229c0.291-1.505,0.422-2.983,0.319-4.138l5.886-1.627c0.53-0.147,0.847-0.697,0.696-1.229C29.673,11.068,29.121,10.756,28.589,10.903z", + "raph_link": "M15.667,4.601c-1.684,1.685-2.34,3.985-2.025,6.173l3.122-3.122c0.004-0.005,0.014-0.008,0.016-0.012c0.21-0.403,0.464-0.789,0.802-1.126c1.774-1.776,4.651-1.775,6.428,0c1.775,1.773,1.777,4.652,0.002,6.429c-0.34,0.34-0.727,0.593-1.131,0.804c-0.004,0.002-0.006,0.006-0.01,0.01l-3.123,3.123c2.188,0.316,4.492-0.34,6.176-2.023c2.832-2.832,2.83-7.423,0-10.255C23.09,1.77,18.499,1.77,15.667,4.601zM14.557,22.067c-0.209,0.405-0.462,0.791-0.801,1.131c-1.775,1.774-4.656,1.774-6.431,0c-1.775-1.774-1.775-4.653,0-6.43c0.339-0.338,0.725-0.591,1.128-0.8c0.004-0.006,0.005-0.012,0.011-0.016l3.121-3.123c-2.187-0.316-4.489,0.342-6.172,2.024c-2.831,2.831-2.83,7.423,0,10.255c2.833,2.831,7.424,2.831,10.257,0c1.684-1.684,2.342-3.986,2.023-6.175l-3.125,3.123C14.565,22.063,14.561,22.065,14.557,22.067zM9.441,18.885l2.197,2.197c0.537,0.537,1.417,0.537,1.953,0l8.302-8.302c0.539-0.536,0.539-1.417,0.002-1.952l-2.199-2.197c-0.536-0.539-1.416-0.539-1.952-0.002l-8.302,8.303C8.904,17.469,8.904,18.349,9.441,18.885z", + "raph_calendar": "M11.758,15.318c0.312-0.3,0.408-0.492,0.408-0.492h0.024c0,0-0.012,0.264-0.012,0.528v5.469h-1.871v1.031h4.87v-1.031H13.33v-7.436h-1.055l-2.027,1.967l0.719,0.744L11.758,15.318zM16.163,21.207c0,0.205,0.024,0.42,0.06,0.647h5.457v-1.031h-4.197c0.023-1.931,4.065-2.362,4.065-5.146c0-1.463-1.114-2.436-2.674-2.436c-1.907,0-2.675,1.607-2.675,1.607l0.875,0.587c0,0,0.6-1.08,1.716-1.08c0.887,0,1.522,0.563,1.522,1.403C20.312,17.754,16.163,18.186,16.163,21.207zM12,3.604h-2v3.335h2V3.604zM23,4.77v3.17h-4V4.77h-6v3.168H9.002V4.77H6.583v21.669h18.833V4.77H23zM24.417,25.438H7.584V10.522h16.833V25.438zM22,3.604h-2v3.335h2V3.604z", + "raph_picker": "M22.221,10.853c-0.111-0.414-0.261-0.412,0.221-1.539l1.66-3.519c0.021-0.051,0.2-0.412,0.192-0.946c0.015-0.529-0.313-1.289-1.119-1.642c-1.172-0.555-1.17-0.557-2.344-1.107c-0.784-0.396-1.581-0.171-1.979,0.179c-0.42,0.333-0.584,0.7-0.609,0.75L16.58,6.545c-0.564,1.084-0.655,0.97-1.048,1.147c-0.469,0.129-1.244,0.558-1.785,1.815c-1.108,2.346-1.108,2.346-1.108,2.346l-0.276,0.586l1.17,0.553l-3.599,7.623c-0.38,0.828-0.166,1.436-0.166,2.032c0.01,0.627-0.077,1.509-0.876,3.21l-0.276,0.586l3.517,1.661l0.276-0.585c0.808-1.699,1.431-2.326,1.922-2.717c0.46-0.381,1.066-0.6,1.465-1.42l3.599-7.618l1.172,0.554l0.279-0.589c0,0,0,0,1.105-2.345C22.578,12.166,22.419,11.301,22.221,10.853zM14.623,22.83c-0.156,0.353-0.413,0.439-1.091,0.955c-0.577,0.448-1.264,1.172-2.009,2.6l-1.191-0.562c0.628-1.48,0.75-2.474,0.73-3.203c-0.031-0.851-0.128-1.104,0.045-1.449l3.599-7.621l3.517,1.662L14.623,22.83z", + "raph_no": "M16,2.939C9.006,2.942,3.338,8.61,3.335,15.605C3.335,22.6,9.005,28.268,16,28.27c6.994-0.002,12.662-5.67,12.664-12.664C28.663,8.61,22.995,2.939,16,2.939zM25.663,15.605c-0.003,1.943-0.583,3.748-1.569,5.264L10.736,7.513c1.515-0.988,3.32-1.569,5.265-1.573C21.337,5.951,25.654,10.269,25.663,15.605zM6.335,15.605c0.004-1.943,0.584-3.75,1.573-5.266l13.355,13.357c-1.516,0.986-3.32,1.566-5.264,1.569C10.664,25.26,6.346,20.941,6.335,15.605z", + "raph_commandline": "M2.021,9.748L2.021,9.748V9.746V9.748zM2.022,9.746l5.771,5.773l-5.772,5.771l2.122,2.123l7.894-7.895L4.143,7.623L2.022,9.746zM12.248,23.269h14.419V20.27H12.248V23.269zM16.583,17.019h10.084V14.02H16.583V17.019zM12.248,7.769v3.001h14.419V7.769H12.248z", + "raph_photo": "M24.25,10.25H20.5v-1.5h-9.375v1.5h-3.75c-1.104,0-2,0.896-2,2v10.375c0,1.104,0.896,2,2,2H24.25c1.104,0,2-0.896,2-2V12.25C26.25,11.146,25.354,10.25,24.25,10.25zM15.812,23.499c-3.342,0-6.06-2.719-6.06-6.061c0-3.342,2.718-6.062,6.06-6.062s6.062,2.72,6.062,6.062C21.874,20.78,19.153,23.499,15.812,23.499zM15.812,13.375c-2.244,0-4.062,1.819-4.062,4.062c0,2.244,1.819,4.062,4.062,4.062c2.244,0,4.062-1.818,4.062-4.062C19.875,15.194,18.057,13.375,15.812,13.375z", + "raph_printer": "M24.569,12.125h-2.12c-0.207-1.34-1.247-2.759-2.444-3.967c-1.277-1.24-2.654-2.234-3.784-2.37c-0.062-0.008-0.124-0.014-0.198-0.015H8.594c-0.119,0-0.235,0.047-0.319,0.132c-0.083,0.083-0.132,0.2-0.132,0.32v5.9H6.069c-1.104,0-2,0.896-2,2V23h4.074v2.079c0,0.118,0.046,0.23,0.132,0.318c0.086,0.085,0.199,0.131,0.319,0.131h13.445c0.118,0,0.232-0.046,0.318-0.131s0.138-0.199,0.138-0.318V23h4.074v-8.875C26.569,13.021,25.674,12.125,24.569,12.125zM21.589,24.626H9.043V21.5h12.546V24.626zM21.589,13.921c0-0.03,0-0.063-0.003-0.096c-0.015-0.068-0.062-0.135-0.124-0.2H9.043v-6.95h6.987v0.001c0.305-0.019,0.567,0.282,0.769,0.971c0.183,0.655,0.229,1.509,0.229,2.102c0.001,0.433-0.019,0.725-0.019,0.725l-0.037,0.478l0.48,0.005c0.002,0,1.109,0.014,2.196,0.26c1.044,0.226,1.86,0.675,1.938,1.184c0.003,0.045,0.003,0.091,0.003,0.133V13.921z", + "export": "M24.086,20.904c-1.805,3.113-5.163,5.212-9.023,5.219c-5.766-0.01-10.427-4.672-10.438-10.435C4.636,9.922,9.297,5.261,15.063,5.25c3.859,0.007,7.216,2.105,9.022,5.218l3.962,2.284l0.143,0.082C26.879,6.784,21.504,2.25,15.063,2.248C7.64,2.25,1.625,8.265,1.624,15.688c0.002,7.42,6.017,13.435,13.439,13.437c6.442-0.002,11.819-4.538,13.127-10.589l-0.141,0.081L24.086,20.904zM28.4,15.688l-7.15-4.129v2.297H10.275v3.661H21.25v2.297L28.4,15.688z", + "import": "M15.067,2.25c-5.979,0-11.035,3.91-12.778,9.309h3.213c1.602-3.705,5.271-6.301,9.565-6.309c5.764,0.01,10.428,4.674,10.437,10.437c-0.009,5.764-4.673,10.428-10.437,10.438c-4.294-0.007-7.964-2.605-9.566-6.311H2.289c1.744,5.399,6.799,9.31,12.779,9.312c7.419-0.002,13.437-6.016,13.438-13.438C28.504,8.265,22.486,2.252,15.067,2.25zM10.918,19.813l7.15-4.126l-7.15-4.129v2.297H-0.057v3.661h10.975V19.813z", + "raph_run": "M17.41,20.395l-0.778-2.723c0.228-0.2,0.442-0.414,0.644-0.643l2.721,0.778c0.287-0.418,0.534-0.862,0.755-1.323l-2.025-1.96c0.097-0.288,0.181-0.581,0.241-0.883l2.729-0.684c0.02-0.252,0.039-0.505,0.039-0.763s-0.02-0.51-0.039-0.762l-2.729-0.684c-0.061-0.302-0.145-0.595-0.241-0.883l2.026-1.96c-0.222-0.46-0.469-0.905-0.756-1.323l-2.721,0.777c-0.201-0.228-0.416-0.442-0.644-0.643l0.778-2.722c-0.418-0.286-0.863-0.534-1.324-0.755l-1.96,2.026c-0.287-0.097-0.581-0.18-0.883-0.241l-0.683-2.73c-0.253-0.019-0.505-0.039-0.763-0.039s-0.51,0.02-0.762,0.039l-0.684,2.73c-0.302,0.061-0.595,0.144-0.883,0.241l-1.96-2.026C7.048,3.463,6.604,3.71,6.186,3.997l0.778,2.722C6.736,6.919,6.521,7.134,6.321,7.361L3.599,6.583C3.312,7.001,3.065,7.446,2.844,7.907l2.026,1.96c-0.096,0.288-0.18,0.581-0.241,0.883l-2.73,0.684c-0.019,0.252-0.039,0.505-0.039,0.762s0.02,0.51,0.039,0.763l2.73,0.684c0.061,0.302,0.145,0.595,0.241,0.883l-2.026,1.96c0.221,0.46,0.468,0.905,0.755,1.323l2.722-0.778c0.2,0.229,0.415,0.442,0.643,0.643l-0.778,2.723c0.418,0.286,0.863,0.533,1.323,0.755l1.96-2.026c0.288,0.097,0.581,0.181,0.883,0.241l0.684,2.729c0.252,0.02,0.505,0.039,0.763,0.039s0.51-0.02,0.763-0.039l0.683-2.729c0.302-0.061,0.596-0.145,0.883-0.241l1.96,2.026C16.547,20.928,16.992,20.681,17.41,20.395zM11.798,15.594c-1.877,0-3.399-1.522-3.399-3.399s1.522-3.398,3.399-3.398s3.398,1.521,3.398,3.398S13.675,15.594,11.798,15.594zM27.29,22.699c0.019-0.547-0.06-1.104-0.23-1.654l1.244-1.773c-0.188-0.35-0.4-0.682-0.641-0.984l-2.122,0.445c-0.428-0.364-0.915-0.648-1.436-0.851l-0.611-2.079c-0.386-0.068-0.777-0.105-1.173-0.106l-0.974,1.936c-0.279,0.054-0.558,0.128-0.832,0.233c-0.257,0.098-0.497,0.22-0.727,0.353L17.782,17.4c-0.297,0.262-0.568,0.545-0.813,0.852l0.907,1.968c-0.259,0.495-0.437,1.028-0.519,1.585l-1.891,1.06c0.019,0.388,0.076,0.776,0.164,1.165l2.104,0.519c0.231,0.524,0.541,0.993,0.916,1.393l-0.352,2.138c0.32,0.23,0.66,0.428,1.013,0.6l1.715-1.32c0.536,0.141,1.097,0.195,1.662,0.15l1.452,1.607c0.2-0.057,0.399-0.118,0.596-0.193c0.175-0.066,0.34-0.144,0.505-0.223l0.037-2.165c0.455-0.339,0.843-0.747,1.152-1.206l2.161-0.134c0.152-0.359,0.279-0.732,0.368-1.115L27.29,22.699zM23.127,24.706c-1.201,0.458-2.545-0.144-3.004-1.345s0.143-2.546,1.344-3.005c1.201-0.458,2.547,0.144,3.006,1.345C24.931,22.902,24.328,24.247,23.127,24.706z", + "raph_magnet": "M20.812,19.5h5.002v-6.867c-0.028-1.706-0.61-3.807-2.172-5.841c-1.539-2.014-4.315-3.72-7.939-3.687C12.076,3.073,9.3,4.779,7.762,6.792C6.2,8.826,5.617,10.928,5.588,12.634V19.5h5v-6.866c-0.027-0.377,0.303-1.789,1.099-2.748c0.819-0.979,1.848-1.747,4.014-1.778c2.165,0.032,3.195,0.799,4.013,1.778c0.798,0.959,1.126,2.372,1.099,2.748V19.5L20.812,19.5zM25.814,25.579c0,0,0-2.354,0-5.079h-5.002c0,2.727,0,5.08,0,5.08l5.004-0.001H25.814zM5.588,25.58h5c0,0,0-2.354,0-5.08h-5C5.588,23.227,5.588,25.58,5.588,25.58z", + "raph_nomagnet": "M10.59,17.857v-5.225c-0.027-0.376,0.303-1.789,1.099-2.748c0.819-0.979,1.849-1.748,4.014-1.778c1.704,0.026,2.699,0.508,3.447,1.189l3.539-3.539c-1.616-1.526-4.01-2.679-6.986-2.652C12.077,3.073,9.3,4.779,7.762,6.793C6.2,8.826,5.617,10.928,5.59,12.634V19.5h3.357L10.59,17.857zM5.59,20.5v2.357L7.947,20.5H5.59zM20.812,13.29v6.21h5.002v-6.866c-0.021-1.064-0.252-2.283-0.803-3.542L20.812,13.29zM25.339,4.522L4.652,25.209l1.415,1.416L26.753,5.937L25.339,4.522zM20.812,25.58h5.002c0,0,0-2.354,0-5.08h-5.002C20.812,23.227,20.812,25.58,20.812,25.58zM10.59,25.58c0,0,0-0.827,0-2.064L8.525,25.58H10.59z", + "raph_flip": "M15.5,21.082h1.001v-2.001H15.5V21.082zM15.5,25.082h1.001v-2H15.5V25.082zM15.5,29.082h1.001v-2H15.5V29.082zM15.5,32.127h1.001v-1.045H15.5V32.127zM15.5,17.083h1.001v-2H15.5V17.083zM15.5,1.083h1.001v-2H15.5V1.083zM15.5,5.083h1.001v-2H15.5V5.083zM15.5,9.083h1.001v-2H15.5V9.083zM15.5,13.083h1.001v-2H15.5V13.083zM18.832,1.203v25.962h14.093L18.832,1.203zM19.832,5.136l11.41,21.03h-11.41V5.136zM13.113,27.165V1.203L-0.979,27.165H13.113z", + "raph_flipv": "M21.45,16.078v-1.001h-2.001v1.001H21.45zM25.45,16.078v-1.001h-2v1.001H25.45zM29.45,16.078v-1.001h-2v1.001H29.45zM32.495,16.078v-1.001H31.45v1.001H32.495zM17.451,16.078v-1.001h-2v1.001H17.451zM1.451,16.078v-1.001h-2v1.001H1.451zM5.451,16.078v-1.001h-2v1.001H5.451zM9.452,16.078v-1.001h-2v1.001H9.452zM13.452,16.078v-1.001h-2v1.001H13.452zM1.571,12.745h25.962V-1.348L1.571,12.745zM5.504,11.745l21.03-11.41v11.41H5.504zM27.533,18.464H1.571l25.962,14.093V18.464z", + "raph_connect": "M25.06,13.719c-0.944-5.172-5.461-9.094-10.903-9.094v4c3.917,0.006,7.085,3.176,7.094,7.094c-0.009,3.917-3.177,7.085-7.094,7.093v4.002c5.442-0.004,9.959-3.926,10.903-9.096h4.69v-3.999H25.06zM20.375,15.719c0-3.435-2.784-6.219-6.219-6.219c-2.733,0-5.05,1.766-5.884,4.218H1.438v4.001h6.834c0.833,2.452,3.15,4.219,5.884,4.219C17.591,21.938,20.375,19.153,20.375,15.719z", + "raph_disconnect": "M9.219,9.5c-2.733,0-5.05,1.766-5.884,4.218H1.438v4.001h1.897c0.833,2.452,3.15,4.219,5.884,4.219c3.435,0,6.219-2.784,6.219-6.219S12.653,9.5,9.219,9.5zM27.685,13.719c-0.944-5.172-5.461-9.094-10.903-9.094v4c3.917,0.006,7.085,3.176,7.094,7.094c-0.009,3.917-3.177,7.085-7.094,7.093v4.002c5.442-0.004,9.959-3.926,10.903-9.096h2.065v-3.999H27.685z", + "raph_folder": "M29.124,12.75c-0.004-2.208-1.792-3.997-3.999-4V8.749H12.868c-0.505-1.622-2.011-2.808-3.805-2.811H6.188c-2.208,0.002-3.997,1.792-4.001,4v14.188c0.004,2.206,1.793,3.995,4.001,3.999h18.938c2.205-0.004,3.995-1.793,3.999-3.999V12.75zM6.188,7.937h2.875c1.046-0.004,1.917,0.834,1.983,1.876l0.058,0.937h14.022c1.093,0.002,1.997,0.906,1.999,2v0.495c-0.591-0.345-1.268-0.557-2-0.558H6.187c-0.732,0.001-1.41,0.214-2,0.559V9.937C4.19,8.843,5.094,7.939,6.188,7.937zM25.125,26.125H6.188c-1.093-0.002-1.997-0.908-2.001-2v-7.438h0.001c0.002-1.095,0.906-1.999,2-2.001h18.938c1.093,0.002,1.991,0.901,2,1.991v7.447C27.122,25.219,26.218,26.123,25.125,26.125z", + "raph_man": "M21.021,16.349c-0.611-1.104-1.359-1.998-2.109-2.623c-0.875,0.641-1.941,1.031-3.103,1.031c-1.164,0-2.231-0.391-3.105-1.031c-0.75,0.625-1.498,1.519-2.111,2.623c-1.422,2.563-1.578,5.192-0.35,5.874c0.55,0.307,1.127,0.078,1.723-0.496c-0.105,0.582-0.166,1.213-0.166,1.873c0,2.932,1.139,5.307,2.543,5.307c0.846,0,1.265-0.865,1.466-2.189c0.201,1.324,0.62,2.189,1.463,2.189c1.406,0,2.545-2.375,2.545-5.307c0-0.66-0.061-1.291-0.168-1.873c0.598,0.574,1.174,0.803,1.725,0.496C22.602,21.541,22.443,18.912,21.021,16.349zM15.808,13.757c2.362,0,4.278-1.916,4.278-4.279s-1.916-4.279-4.278-4.279c-2.363,0-4.28,1.916-4.28,4.279S13.445,13.757,15.808,13.757z", + "raph_woman": "M21.022,16.349c-0.611-1.104-1.359-1.998-2.109-2.623c-0.875,0.641-1.941,1.031-3.104,1.031c-1.164,0-2.231-0.391-3.105-1.031c-0.75,0.625-1.498,1.519-2.111,2.623c-1.422,2.563-1.579,5.192-0.351,5.874c0.55,0.307,1.127,0.078,1.723-0.496c-0.105,0.582-0.167,1.213-0.167,1.873c0,2.932,1.139,5.307,2.543,5.307c0.846,0,1.265-0.865,1.466-2.189c0.201,1.324,0.62,2.189,1.464,2.189c1.406,0,2.545-2.375,2.545-5.307c0-0.66-0.061-1.291-0.168-1.873c0.598,0.574,1.174,0.803,1.725,0.496C22.603,21.541,22.444,18.912,21.022,16.349zM15.808,13.757c2.363,0,4.279-1.916,4.279-4.279s-1.916-4.279-4.279-4.279c-2.363,0-4.28,1.916-4.28,4.279S13.445,13.757,15.808,13.757zM18.731,4.974c1.235,0.455,0.492-0.725,0.492-1.531s0.762-1.792-0.492-1.391c-1.316,0.422-2.383,0.654-2.383,1.461S17.415,4.489,18.731,4.974zM15.816,4.4c0.782,0,0.345-0.396,0.345-0.884c0-0.488,0.438-0.883-0.345-0.883s-0.374,0.396-0.374,0.883C15.442,4.005,15.034,4.4,15.816,4.4zM12.884,4.974c1.316-0.484,2.383-0.654,2.383-1.461S14.2,2.474,12.884,2.052c-1.254-0.402-0.492,0.584-0.492,1.391S11.648,5.428,12.884,4.974z", + "raph_notebook": "M24.875,1.375H8c-1.033,0-1.874,0.787-1.979,1.792h1.604c1.102,0,2,0.898,2,2c0,1.102-0.898,2-2,2H6v0.999h1.625c1.104,0,2.002,0.898,2.002,2.002c0,1.104-0.898,2.001-2.002,2.001H6v0.997h1.625c1.102,0,2,0.898,2,2c0,1.104-0.898,2.004-2,2.004H6v0.994h1.625c1.102,0,2,0.898,2,2.002s-0.898,2.002-2,2.002H6v0.997h1.624c1.104,0,2.002,0.897,2.002,2.001c0,1.104-0.898,2.002-2.002,2.002H6.004C6.027,28.252,6.91,29.125,8,29.125h16.875c1.104,0,2-0.896,2-2V3.375C26.875,2.271,25.979,1.375,24.875,1.375zM25.25,8.375c0,0.552-0.447,1-1,1H14c-0.553,0-1-0.448-1-1V4c0-0.552,0.447-1,1-1h10.25c0.553,0,1,0.448,1,1V8.375zM8.625,25.166c0-0.554-0.449-1.001-1-1.001h-3.25c-0.552,0-1,0.447-1,1.001c0,0.552,0.449,1,1,1h3.25C8.176,26.166,8.625,25.718,8.625,25.166zM4.375,6.166h3.251c0.551,0,0.999-0.448,0.999-0.999c0-0.555-0.448-1-0.999-1H4.375c-0.553,0-1,0.445-1,1C3.374,5.718,3.822,6.166,4.375,6.166zM4.375,11.167h3.25c0.553,0,1-0.448,1-1s-0.448-1-1-1h-3.25c-0.553,0-1,0.448-1,1S3.822,11.167,4.375,11.167zM4.375,16.167h3.25c0.551,0,1-0.448,1-1.001s-0.448-0.999-1-0.999h-3.25c-0.553,0-1.001,0.446-1.001,0.999S3.822,16.167,4.375,16.167zM3.375,20.165c0,0.553,0.446,1.002,1,1.002h3.25c0.551,0,1-0.449,1-1.002c0-0.552-0.448-1-1-1h-3.25C3.821,19.165,3.375,19.613,3.375,20.165z", + "raph_diagram": "M6.812,17.202l7.396-3.665v-2.164h-0.834c-0.414,0-0.808-0.084-1.167-0.237v1.159l-7.396,3.667v2.912h2V17.202zM26.561,18.875v-2.913l-7.396-3.666v-1.158c-0.358,0.152-0.753,0.236-1.166,0.236h-0.832l-0.001,2.164l7.396,3.666v1.672H26.561zM16.688,18.875v-7.501h-2v7.501H16.688zM27.875,19.875H23.25c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C29.875,20.771,28.979,19.875,27.875,19.875zM8.125,19.875H3.5c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2h4.625c1.104,0,2-0.896,2-2v-4.625C10.125,20.771,9.229,19.875,8.125,19.875zM13.375,10.375H18c1.104,0,2-0.896,2-2V3.75c0-1.104-0.896-2-2-2h-4.625c-1.104,0-2,0.896-2,2v4.625C11.375,9.479,12.271,10.375,13.375,10.375zM18,19.875h-4.625c-1.104,0-2,0.896-2,2V26.5c0,1.104,0.896,2,2,2H18c1.104,0,2-0.896,2-2v-4.625C20,20.771,19.104,19.875,18,19.875z", + "raph_barchart": "M21.25,8.375V28h6.5V8.375H21.25zM12.25,28h6.5V4.125h-6.5V28zM3.25,28h6.5V12.625h-6.5V28z" + } +} diff --git a/dist/extensions/shapelib/symbol.json b/dist/extensions/shapelib/symbol.json new file mode 100644 index 00000000..841e511d --- /dev/null +++ b/dist/extensions/shapelib/symbol.json @@ -0,0 +1,28 @@ +{"data": { + "airplane": "m150.70285,1c-3.11894,0 -5.89383,1.28033 -8.23512,3.60274c-2.33931,2.3205 -4.27426,5.64559 -5.8844,9.79826c-3.21983,8.30419 -5.20047,19.96969 -6.28387,33.94021c-1.08127,13.94364 -1.26349,30.17972 -0.81427,47.56012c-38.52657,15.80524 -116.66563,48.43882 -122.94262,55.72521c-8.35709,9.701 -5.65693,20.81889 -2.28924,28.1994l128.45827,-26.14551c2.71532,34.07207 6.57611,67.81866 9.94048,94.2617c-12.56244,3.67662 -36.01244,10.93625 -40.85281,15.43805c-6.66802,6.2016 -6.66797,26.22952 -6.66797,26.22952l52.57557,-4.27612c1.23827,8.63303 2.01266,13.67035 2.01266,13.67035l0.07683,0.45456l0.41484,0l0.96791,0l0.41483,0l0.07683,-0.45456c0,0 0.77292,-5.03741 2.01265,-13.67035l52.59094,4.27612c0,0 0.00006,-20.02792 -6.66798,-26.22952c-4.84218,-4.50354 -28.3093,-11.77963 -40.86818,-15.45499c3.35742,-26.36189 7.2114,-59.97935 9.92513,-93.94165l126.95265,25.84239c3.36765,-7.38051 6.08325,-18.4984 -2.27386,-28.1994c-6.19934,-7.19621 -82.45026,-39.10397 -121.45232,-55.11919c0.466,-17.60567 0.29471,-34.06301 -0.79893,-48.16614l0,-0.03367c-1.08395,-13.95511 -3.0667,-25.60925 -6.28384,-33.90654c-1.60968,-4.15152 -3.52888,-7.47695 -5.86903,-9.79826c-2.34131,-2.32241 -5.11617,-3.60274 -8.23509,-3.60274z", + "arrows_recycle": "m184.80963,97.86072l-33.85641,-5.99613l12.47342,-6.51318c6.86035,-3.58231 13.08063,-7.05022 13.8228,-7.70647c1.84358,-1.63009 -21.11545,-37.10833 -23.99486,-37.07896c-1.26575,0.01435 -10.08571,13.75221 -19.59988,30.53185c-9.58302,16.90081 -19.12026,29.77207 -21.38301,28.85762c-26.78106,-10.82179 -48.63238,-21.77106 -48.63238,-24.36867c0,-1.7743 8.40277,-17.60187 18.67293,-35.17241l18.67294,-31.94638l50.91241,0l50.91241,0l13.28955,21.01844l13.28966,21.01844l13.86403,-7.11266c9.61084,-4.93073 13.27039,-5.63875 11.92874,-2.30832c-11.81259,29.32658 -29.43884,63.52189 -32.57199,63.19018c-2.16919,-0.22948 -19.17931,-3.11553 -37.80035,-6.41334zm-157.90158,130.83841c-12.88431,-22.18782 -24.43164,-42.96199 -25.66062,-46.16496c-1.26128,-3.28671 2.41348,-15.03122 8.43637,-26.96236l10.67094,-21.13916l-10.90837,-6.44379c-14.51679,-8.57526 -9.12079,-11.21638 29.38814,-14.38432l30.43462,-2.50365l11.93788,31.54266c6.56593,17.34845 12.77805,33.78311 13.80486,36.52168c1.07085,2.85602 -4.05412,0.95576 -12.01902,-4.45653l-13.88588,-9.43578l-9.69341,18.71187c-5.33128,10.2917 -9.769,19.85884 -9.86144,21.26031c-0.09266,1.40147 16.26999,3.00525 36.36115,3.56384l36.52929,1.01558l2.3839,26.7207c1.3112,14.69647 2.11298,26.91713 1.78191,27.15706c-0.33105,0.23969 -17.62818,1.53915 -38.43802,2.88736l-37.83614,2.4512l-23.42616,-40.34174zm144.19484,39.20346c-22.11887,-33.38463 -22.50333,-30.90141 10.37228,-66.98763l21.10391,-23.16492l-2.24142,16.92821l-2.24152,16.92822l23.64932,0c13.0071,0 23.64944,-1.04019 23.64944,-2.31137c0,-1.27139 -7.21684,-15.55066 -16.03735,-31.73212c-8.82051,-16.18146 -16.00386,-30.77765 -15.96307,-32.436c0.09158,-3.71849 46.32753,-34.42394 48.52559,-32.22591c0.87094,0.87095 9.45139,16.38289 19.06769,34.47134l17.48441,32.8876l-23.52576,37.94727c-12.93936,20.87074 -25.37122,39.98283 -27.62622,42.47105c-2.25526,2.48822 -14.86537,5.52936 -28.02258,6.75787c-25.11388,2.34528 -24.43022,1.7804 -28.11249,23.22583c-0.64439,3.75308 -8.1586,-4.76279 -20.08223,-22.75946z", + "beverage": "m55.65598,297.84982c-28.13961,-15.0867 0.71402,-44.87836 24.17752,-35.2438c17.46051,-0.03983 34.92112,-0.01355 52.38168,-0.02121c0,-34.34088 0,-68.68181 0,-103.02271c-43.73869,-52.76227 -87.47738,-105.52454 -131.21606,-158.28681c98.99732,-0.36748 197.99556,-0.36708 296.99286,0c-42.95236,53.02298 -85.90472,106.04595 -128.85707,159.06893c0,34.08022 0,68.1604 0,102.24059c25.78079,0.22986 51.60571,-0.625 77.34869,0.87012c20.26866,5.44482 12.15504,38.73355 -7.54306,35.2244c-61.09291,-0.21259 -122.20532,0.38715 -183.28456,-0.8295zm127.03334,-186.51904c19.68919,-7.503 16.9212,-39.96898 -4.19951,-43.27924c-31.86026,-8.77637 -38.74004,46.49459 -5.25272,45.19753c3.23363,0.02124 6.51921,-0.43665 9.45222,-1.91829z", + "bicycle": "m69.04492,242.61508c10.78542,-0.13551 -10.27161,-0.62888 -14.0067,-0.90082c-31.20993,-0.75682 -57.11145,-31.7867 -53.74048,-62.58058c0.6826,-30.81444 30.36186,-57.88344 61.25282,-54.78261c8.04092,-3.41573 19.45538,7.85678 24.44781,2.47261c12.82323,-22.6207 25.24759,-45.47771 38.58752,-67.7975c11.3629,-1.62186 24.90015,-2.8755 35.9539,0.19863c5.11031,8.04987 -4.18097,10.24141 -9.97878,8.99869c-6.4711,0 -12.9422,0 -19.41331,0c-4.68463,8.54676 -9.49177,17.02541 -14.27853,25.51514c27.18877,0 54.37757,0 81.56634,0c0.60545,-2.89218 7.47321,-9.12369 1.38461,-8.44633c-11.06171,-1.39418 -4.14218,-14.17861 4.04941,-10.54169c11.49847,0.42252 23.4034,-1.13349 34.55679,1.17167c5.95799,11.9574 -11.26917,9.39215 -18.65384,9.51889c-5.46606,-1.78406 -6.59882,3.68022 -8.76302,7.4192c-8.77467,8.98817 -3.32066,18.46121 2.57677,27.22322c2.16318,3.98602 3.70422,9.51816 8.96812,5.7937c10.73436,-2.35877 22.43681,-2.44432 33.11809,0.31375c22.31958,6.63104 40.2153,27.32498 41.71356,50.76672c1.35196,14.39882 -1.7262,29.2406 -10.68872,40.85638c-10.3952,14.88928 -27.26529,23.04211 -45.01289,24.69595m-13.91446,0.14534c-16.17995,-4.15208 -31.09747,-13.81174 -39.74602,-28.39511c-5.65977,-7.28935 -6.39555,-18.57542 -9.40382,-25.8875c-7.93416,-0.10381 -15.86833,-0.20763 -23.80251,-0.31143c-16.06972,-25.85139 -30.2338,-52.8877 -45.73496,-79.09947c-3.0216,8.9735 -20.19933,21.18202 -10.71458,29.44228c23.80356,19.97299 26.97348,58.9857 6.61392,82.50262c-9.33031,10.45926 -22.27345,17.66695 -35.57853,21.74126m1.02195,-14.22214c25.6753,-5.59119 42.08234,-35.19554 33.20155,-59.88542c-2.74454,-8.04132 -10.29613,-20.88658 -16.96593,-21.01822c-7.10979,12.27542 -13.50588,24.99036 -21.29804,36.85445c-17.11086,3.00977 -1.43426,-17.82442 2.18629,-24.90399c3.88173,-8.63774 17.97784,-22.6107 0.22043,-22.40381c-12.4663,-1.24055 -25.71457,-0.04088 -35.79932,8.23351c-21.64245,14.32193 -25.73868,47.07928 -9.34899,66.82591c11.09536,14.38573 30.25585,20.50179 47.804,16.29758zm179.64028,-0.00356c21.91476,-5.14897 37.68491,-27.67265 34.8483,-50.02701c-1.50024,-24.84305 -26.27582,-44.93475 -50.90707,-41.59564c-18.45729,-1.74684 -0.78658,15.19781 1.85167,23.43547c2.5099,8.7469 16.33638,19.49011 8.6171,28.02017c-17.31352,0.72531 -35.05154,-0.50934 -52.31752,1.23642c3.1011,22.89496 24.76817,41.83401 48.14848,40.08203c3.28111,-0.02676 6.57803,-0.30434 9.75905,-1.15144zm-70.7294,-51.16617c2.08536,-17.91364 12.23944,-34.20847 27.04826,-44.4043c0.87492,-4.39421 -8.09195,-24.63332 -11.37527,-10.5231c-10.13445,18.42084 -20.32248,36.81699 -30.14639,55.40483c4.70622,0.11383 9.98186,0.93559 14.4734,-0.47743zm52.9005,-0.88846c-5.84201,-10.98254 -11.81374,-21.89917 -17.91992,-32.73703c-12.24919,6.45949 -20.3076,20.12949 -22.21249,33.77383c13.37456,-0.2851 26.97348,0.69884 40.16722,-0.71251l-0.03476,-0.3243l0,0zm-57.29515,-39.61388c5.7617,-10.63408 11.63275,-21.21213 17.21649,-31.94065c-24.2798,-0.5443 -48.61469,-0.66353 -72.88629,0.11504c12.46696,21.42642 23.73018,43.6828 37.36159,64.35614c6.59126,-10.13849 12.18927,-21.81091 18.30821,-32.53052z", + "bulb": "m145.62592,297.06863c-17.67376,-4.68848 -27.91267,-23.96384 -26.70493,-41.44981c-0.45245,-22.83995 1.65483,-46.8734 -9.26703,-67.87447c-6.22532,-15.68024 -16.83022,-29.52451 -21.2558,-45.86502c-5.50718,-25.3512 1.29536,-54.08422 21.79177,-71.10346c23.11512,-19.80671 60.02821,-22.38829 85.47337,-5.55379c17.94666,12.36192 30.89558,32.75098 30.41452,55.00024c2.10583,16.62513 -4.45561,32.2625 -12.17442,46.55451c-5.53021,11.50751 -11.98869,22.76817 -17.00821,34.40399c-1.32327,23.85774 -0.56435,47.93431 -4.15358,71.58684c-5.97899,18.328 -28.51152,30.78922 -47.11569,24.30096zm46.67903,-42.65804c-10.48888,-5.65382 -25.56134,-1.97798 -37.75313,-3.19516c-9.95908,1.99197 -27.6553,-4.08569 -32.94975,5.03105c12.10807,4.73648 26.33759,1.18594 39.22778,1.96957c10.31409,-0.9906 22.18068,0.93939 31.4751,-3.80547zm-0.78554,-10.63885c1.54361,-14.36404 -21.1709,-7.03433 -30.39838,-9.17262c-12.21318,2.47205 -31.64935,-5.2915 -39.33047,5.74487c4.5516,11.09071 24.85052,3.29074 35.50985,5.75148c11.3671,-0.4028 23.15991,0.40741 34.21899,-2.32373zm0.14142,-25.16705c2.9986,-27.98152 20.10725,-51.27968 30.01392,-76.87566c8.14517,-30.64574 -7.9861,-65.65708 -37.19159,-78.52086c-29.06958,-14.40719 -67.79967,-3.52343 -84.22785,24.70715c-15.82867,23.31919 -12.80788,55.00346 2.66266,77.68118c11.03862,19.81914 19.84574,42.09169 18.41109,65.15663c22.91359,0 45.82719,0 68.7408,0c0.53035,-4.04942 1.06052,-8.09911 1.59097,-12.14844zm-50.72687,-39.64223c-9.07846,-15.78525 -18.39817,-31.69214 -24.71996,-48.79948c5.68369,-7.35728 7.33711,-15.55251 9.10273,-24.19695c15.95243,-3.13345 -2.03056,18.17914 13.0308,18.65942c13.36925,5.81685 7.50436,-28.2252 18.61179,-15.95465c-7.9733,13.46684 15.66168,26.8638 16.5291,7.59886c-1.14578,-14.54594 14.28561,-11.82063 8.26923,1.37553c0.49657,6.78834 11.54893,8.73447 11.73816,14.19425c-7.9566,17.25854 -14.87259,35.07664 -24.29411,51.59875c-2.12068,-6.39691 8.34081,-22.42969 11.68367,-31.84341c6.45049,-8.13736 11.99347,-30.06687 -4.82256,-27.07765c-9.75478,15.21495 -22.87704,-9.5907 -32.42833,4.99055c-8.10805,2.41856 -20.86024,-14.04196 -23.2123,1.78514c6.10664,18.79854 18.8132,34.81967 25.46149,53.42416c-2.25594,-1.33008 -3.54053,-3.66359 -4.94971,-5.75453zm-12.74261,-68.89435c-4.41462,-2.15457 1.86072,11.45412 -0.00009,0l0.00009,0zm26.38611,1.60738c-5.73064,-9.69846 -2.6572,11.76727 0,0zm25.57564,0c-5.73064,-9.69846 -2.65724,11.76727 0,0zm-119.06653,-71.66327c-10.12879,-10.27977 -21.32492,-19.92564 -30.13364,-31.25677c22.0061,18.21614 42.14793,38.73141 61.97966,59.29806c5.2662,7.2365 -9.18723,-6.75771 -11.87724,-9.10345c-6.7307,-6.23349 -13.37324,-12.56173 -19.96879,-18.93784zm156.40887,29.39093c17.12013,-21.33164 33.0936,-43.69485 51.55162,-63.89019c-3.09076,8.6951 -13.04016,19.09942 -19.29597,28.05458c-10.44716,12.99739 -20.21251,26.73974 -32.1591,38.39317c-1.49106,1.57605 -3.71758,-2.15694 -0.09639,-2.55756l-0.00015,0zm-37.0826,-20.23703c5.91515,-16.91904 14.49518,-33.02397 24.06741,-48.16613c-0.22247,8.40011 -10.37453,24.32112 -15.25424,34.73693c-2.76042,4.19142 -5.08876,10.87586 -8.81317,13.4292zm-75.7492,-21.69804c-4.12045,-6.01025 -16.5241,-20.00493 -14.20815,-21.91343c11.95872,13.25933 24.12167,26.94502 32.71223,42.62532c-7.31573,-5.61084 -12.5797,-13.71475 -18.50409,-20.71189zm47.35616,-4.73013c-0.83392,-5.64444 1.75482,-32.58975 3.19298,-14.29333c0.00511,11.46356 1.20168,24.36872 -1.98915,34.80271c-1.36639,-6.70823 -1.03488,-13.69191 -1.20383,-20.50938z", + "careful": "m1,1c2.24496,29.70385 10.76853,56.9168 23.28125,80.81181l23.28125,-36.31875l-6.72569,-2.48334l-9.3125,-3.31111l4.86319,-8.48472l17.07292,-30.21389l-52.46042,0zm71.49931,0l-16.86597,29.8l7.24306,2.58681l9.82986,3.51805l-5.5875,8.69167l-33.525,52.46041c24.12122,36.61169 59.3948,61.88649 99.85071,67.36043l0,107.09373l-66.22223,0l0,26.48889l165.55556,0l0,-26.48889l-66.22223,0l0,-107.09373c70.57336,-9.43671 125.94405,-78.40826 132.44444,-164.41737l-226.50069,0z", + "cart_2": "m0.99397,46.01759l0,36.55115l57.8652,0l28.28396,104.41602l159.23965,0l52.21094,-125.30758l-237.55595,0l0,-15.65959zm53.21769,184.47131c0,12.97459 -10.51804,23.49266 -23.49261,23.49266c-12.97436,0 -23.49244,-10.51807 -23.49244,-23.49266c0,-12.97456 10.51808,-23.49228 23.49244,-23.49228c12.97457,0 23.49261,10.51772 23.49261,23.49228zm148.8,0c0,12.97459 -10.51817,23.49266 -23.4928,23.49266c-12.97446,0 -23.49258,-10.51807 -23.49258,-23.49266c0,-12.97456 10.51813,-23.49228 23.49258,-23.49228c12.97462,0 23.4928,10.51772 23.4928,23.49228z", + "coat_hanger": "m24.72351,255.83636c-16.41191,-2.33228 -27.73119,-20.33411 -22.38228,-36.1741c3.30628,-15.35616 20.22842,-19.55692 31.44893,-27.66121c35.64961,-21.14748 71.50229,-41.94997 107.26245,-62.9095c1.87845,-10.22399 -5.70195,-16.59309 -13.7997,-21.39916c-16.20296,-12.86633 -15.31998,-38.50921 -1.59858,-52.83282c16.08138,-18.88601 49.91904,-12.94907 59.95362,9.38958c9.73412,9.92804 -0.18503,34.24562 -13.8385,22.54042c-1.42418,-13.2976 -12.78993,-28.89017 -27.7881,-20.44456c-15.64833,8.98737 -6.40202,29.9363 8.0513,34.15588c9.75604,6.53233 8.45554,18.64742 8.97318,28.8608c42.85536,25.5808 86.25137,50.28574 128.51941,76.82744c16.8277,13.06401 9.90717,44.50819 -11.28448,48.76941c-16.06598,2.31227 -32.54915,0.68361 -48.77617,1.31593c-68.2437,0.05267 -136.50528,0.51715 -204.74109,-0.43811zm248.30083,-21.61086c12.28671,-12.24121 -10.69217,-18.82494 -18.26138,-24.82121c-34.85875,-20.46407 -69.60597,-41.14412 -104.87569,-60.89026c-41.32713,23.46544 -82.56062,47.16515 -123.11867,71.93832c-8.58788,3.43668 -2.61073,17.17589 5.37386,15.06004c78.53457,-0.16875 157.07672,0.41405 235.60527,-0.42499c1.73874,-0.22235 3.69772,0.07922 5.27661,-0.86191z", + "document": "m58.5474,213.36578c-0.05885,-70.73299 -0.11767,-141.466 -0.17652,-212.19898c53.12881,0.81297 106.48294,-1.9259 159.43185,2.08758c25.82027,9.16723 22.09921,66.23434 21.6799,108.85904c-1.13266,32.14426 15.08594,95.86641 -27.03937,105.4444c-21.00172,0.00113 -21.08437,8.97424 -18.9407,25.20605c2.4877,24.31731 -4.73431,78.79115 -39.2352,44.26363l-95.71997,-73.66171zm162.59977,-23.1226c0.08537,-63.57991 -0.62674,-117.82272 -4.15146,-159.71279c-31.317,-14.24883 -73.63496,-7.31453 -109.06839,-7.53106c-13.9288,6.77649 33.0414,29.27771 43.00333,38.00857c37.81908,18.77271 49.10266,52.9127 42.57201,91.49594c0,15.00871 0,30.01746 0,45.02617c6.97418,-0.00844 21.40269,-3.46487 27.64452,-7.28687z", + "gift": "m160.05605,46.22016c5.12212,-9.27578 14.49356,-21.35899 -1.60765,-24.27403c-4.48517,-2.30248 -8.9718,-6.3767 -13.45119,-1.83809c-9.96648,3.93713 -18.60622,9.44305 -8.12337,19.74747c4.64861,6.65461 8.87668,21.1743 14.1424,22.77341c3.14276,-5.39672 6.08684,-10.9068 9.03981,-16.40877zm-22.01753,25.61161c-9.14935,-16.32981 -16.51206,-33.84869 -27.71044,-48.91321c-13.62003,-14.54198 -40.45641,-8.05964 -46.55505,10.6975c-8.10131,18.54466 9.37865,40.68638 29.16686,38.36525c15.01618,0.2515 30.1178,0.92769 45.09863,-0.14954zm76.02873,0.55127c19.45964,-2.60851 30.65027,-27.10658 19.57069,-43.3727c-9.81836,-17.35883 -38.06532,-17.96398 -47.9265,-0.32358c-8.53876,14.26143 -15.94994,29.16402 -23.78549,43.81643c17.32285,0.99046 34.80862,0.75943 52.1413,-0.12016zm32.22711,20.88692c6.6339,-5.83724 32.32317,-12.71885 12.86739,-18.26252c-4.81963,-1.36767 -10.43866,-7.64191 -14.77026,-5.92492c-9.40594,11.6946 -23.86844,18.55521 -38.9686,17.83661c-2.95601,0.97167 -18.03316,-1.47781 -13.95946,1.30438c10.65262,6.07415 21.03697,12.6707 32.05554,18.0621c7.71764,-4.11029 15.20781,-8.63805 22.77539,-13.01566zm-151.5623,3.30481c5.67309,-3.30481 11.34617,-6.60963 17.01924,-9.91444c-17.34076,-0.86164 -37.18572,1.63783 -50.29088,-12.30952c-3.69488,-4.13725 -7.23799,-8.87396 -12.35892,-3.66532c-6.13381,4.22582 -25.00066,8.5563 -10.4742,13.71487c12.64928,7.47227 25.20959,15.12685 38.17151,22.0463c6.1765,-2.89648 11.99872,-6.5165 17.93326,-9.87188zm83.14041,36.87479c7.35168,-5.90694 25.15858,-11.53461 25.75348,-17.87329c-16.62141,-9.56481 -32.75868,-20.2142 -50.14796,-28.29874c-5.98431,-2.2704 -10.83618,1.22306 -15.65312,4.25735c-14.24385,8.47255 -28.83041,16.41927 -42.61077,25.63122c18.02219,11.14435 36.26101,21.95917 54.67725,32.43958c9.39328,-5.26857 18.66512,-10.75249 27.98112,-16.15611zm73.75499,18.43738c7.62694,-4.81227 15.25389,-9.62453 22.88087,-14.43683c-0.06244,-16.11785 0.19498,-32.24243 -0.24597,-48.35465c-15.39334,8.58929 -30.56776,17.60745 -45.48607,26.99785c-1.63162,16.62392 -0.80414,33.52276 -0.44952,50.23046c7.87193,-4.6378 15.55261,-9.59819 23.30069,-14.43683zm-178.87355,-10.1545c0.77462,-13.73913 2.44441,-29.40098 -14.12444,-33.4709c-10.46331,-4.88007 -24.96637,-17.38377 -33.02728,-17.25835c-0.25115,15.4809 -0.11823,30.96465 -0.14541,46.44691c15.45605,9.64543 30.63783,19.75522 46.42746,28.8476c1.53102,-7.98021 0.53017,-16.43968 0.86967,-24.56526zm110.68056,53.19621c9.14198,-5.77156 18.28395,-11.54312 27.42593,-17.31468c-0.04233,-16.63979 0.64572,-33.30351 -0.10625,-49.92543c-10.04709,2.88116 -21.5385,11.78691 -32.12366,17.31859c-7.92599,4.64276 -15.85202,9.28555 -23.77802,13.92833c0.1563,17.76723 -0.42728,35.56691 0.57802,53.30783c9.47523,-5.53633 18.69861,-11.49898 28.00397,-17.31464zm-38.32249,-9.33929c0,-8.88464 0,-17.76929 0,-26.6539c-18.35233,-10.72505 -36.64592,-21.55176 -55.0698,-32.1535c-1.01884,16.98993 -0.43661,34.04375 -0.59025,51.06303c18.34824,11.48767 36.50635,23.28906 55.08669,34.3983c0.72301,-8.85316 0.45901,-17.77696 0.57336,-26.65393zm106.97165,35.71599c7.47931,-4.98045 14.95862,-9.96091 22.43796,-14.94136c-0.31207,-15.79037 0.77045,-31.79442 -0.80399,-47.41055c-15.55414,8.87424 -30.56544,18.97736 -45.84236,28.4509c0.367,16.33781 -0.75356,32.86267 0.93411,49.06088c7.89078,-4.84329 15.54118,-10.07089 23.27428,-15.15987zm-179.49486,-8.85234c-0.06088,-8.2791 -0.12183,-16.55821 -0.18272,-24.8373c-15.452,-9.6673 -30.70933,-19.65799 -46.39347,-28.94519c-0.98154,15.8615 -0.42208,31.78482 -0.5697,47.67464c15.58812,10.31845 31.00088,20.91034 46.79801,30.90671c0.60526,-8.24165 0.30488,-16.53903 0.34788,-24.79886zm111.24078,54.40674c9.07924,-6.02985 18.15848,-12.05969 27.23772,-18.08952c-0.02109,-16.81348 0.32051,-33.6342 -0.13127,-50.44193c-18.48172,11.39566 -36.8398,23.00107 -55.0625,34.8063c-2.05943,16.23506 -0.72412,32.97392 -0.72713,49.38643c5.65578,3.44495 20.11658,-11.82266 28.68318,-15.66129zm-38.71758,-7.19754c-1.09789,-11.59346 4.72185,-27.9119 -10.01297,-32.40633c-14.85952,-9.4117 -29.65931,-18.92612 -44.71436,-28.02278c-2.19433,15.91664 0.10065,32.49809 -1.58499,48.60945c18.05386,13.0511 36.5795,25.52769 55.44263,37.37666c1.51289,-8.30347 0.57193,-17.09903 0.86969,-25.55701zm-63.13967,-3.06479c-21.97403,-14.66875 -43.94805,-29.33749 -65.92206,-44.00621c0.02491,-45.26978 -0.60055,-90.55044 0.20291,-135.81172c11.00354,-6.78941 22.71307,-12.35508 34.0373,-18.58421c-7.3143,-20.93821 3.23879,-46.38257 24.44761,-54.21996c17.77897,-7.29492 39.21008,-0.71179 50.54502,14.64528c8.23304,-4.22243 16.4661,-8.44486 24.69915,-12.66729c8.27725,4.26063 16.55455,8.52126 24.83179,12.78188c11.86055,-14.06895 32.18082,-22.09776 49.79013,-14.21312c21.13718,7.42951 32.65843,32.817 25.07826,53.72234c11.40756,6.44052 23.81024,11.47337 34.26968,19.33245c0.46368,45.00166 0.00415,90.00995 -0.0379,135.01437c-43.72298,28.93527 -86.73743,58.97507 -131.17026,86.81018c-12.92032,-0.00348 -24.07242,-14.03217 -36.06157,-19.72c-11.59096,-7.66315 -23.15266,-15.37048 -34.71011,-23.08398z", + "globe": "m33.11721,223.16701l233.44794,0.08913l-7.57544,11.19618l-218.20762,-0.26738l-7.66489,-11.01793zm1.60428,-148.93458l230.3285,-0.26738l6.68439,11.48557l-243.78651,0.08913l6.77362,-11.30732zm-22.73061,74.62911l275.61135,-0.26738l-0.35626,11.48558l-275.07684,-0.17825l-0.17825,-11.03995zm275.8395,1.06528c0,76.03723 -61.86858,137.89429 -137.92784,137.89429c-76.0264,0 -137.88345,-61.86824 -137.88345,-137.89429c0,-76.02642 61.86823,-137.88347 137.88345,-137.88347c76.05927,-0.01117 137.92784,61.85705 137.92784,137.88347zm-137.91701,-148.93459c-82.09525,0 -148.90104,66.8058 -148.90104,148.92339c0,82.12878 66.8058,148.93457 148.90104,148.93457c82.13995,0 148.93459,-66.80579 148.93459,-148.93457c0,-82.11759 -66.79463,-148.92339 -148.93459,-148.92339zm41.78581,148.93459c0,81.25211 -22.01353,137.89429 -41.78581,137.89429c-19.74991,0 -41.76309,-56.64218 -41.76309,-137.89429c0,-81.27448 22.00233,-137.88347 41.76309,-137.88347c19.76112,-0.01117 41.78581,56.60899 41.78581,137.88347zm-41.78581,-148.93459c-34.29579,0 -52.80304,76.73613 -52.80304,148.92339c0,72.2093 18.50725,148.93457 52.80304,148.93457c34.29614,0 52.83693,-76.73643 52.83693,-148.93457c-0.01118,-72.18726 -18.54079,-148.92339 -52.83693,-148.92339zm97.86217,148.93459c0,76.03723 -43.91597,137.89429 -97.86217,137.89429c-53.93499,0 -97.82862,-61.86824 -97.82862,-137.89429c0,-76.02642 43.89363,-137.88347 97.82862,-137.88347c53.9462,-0.01117 97.86217,61.85705 97.86217,137.88347zm-97.86217,-148.93459c-60.01537,0 -108.86856,66.8058 -108.86856,148.92339c0,82.12878 48.85319,148.93457 108.86856,148.93457c60.03773,0 108.88008,-66.80579 108.88008,-148.93457c0,-82.11759 -48.84235,-148.92339 -108.88008,-148.92339z", + "handle_care": "m163.84105,276.49316c0,-16.9874 0,-26.73244 0,-43.71985c0,-23.90417 32.58113,-58.75496 53.7084,-83.18626c5.78004,-5.69962 16.17278,-7.90976 21.66074,-2.49817c4.87456,4.80672 4.50662,16.61058 0.6333,22.48335c-7.09361,10.6588 -14.18712,21.31755 -21.28073,31.97632c-3.55533,6.07231 5.16899,10.98973 10.38702,4.49673c27.24385,-36.8876 34.70512,-44.36621 34.70512,-59.20624c0,-30.31093 0,-29.89459 0,-60.20548c0,-8.67812 6.34686,-16.98743 14.45584,-16.98743c7.71677,0 14.4277,7.99146 14.4277,15.52406c0,48.96381 0,67.40421 0,116.36799c0,15.08096 -47.62817,60.69775 -47.62817,81.9498c0,4.99628 0,9.99255 0,14.98889c-27.02963,0 -54.05942,0 -81.08914,0c0.00577,-7.32791 0.01431,-14.65582 0.02008,-21.9837zm-28.64365,0c0,-16.98746 0,-26.73244 0,-43.71985c0,-23.90422 -32.58104,-58.75496 -53.70833,-83.18626c-5.78003,-5.69962 -16.17277,-7.90976 -21.66072,-2.49817c-4.87465,4.80672 -4.50671,16.61058 -0.6334,22.48335c7.09362,10.6588 14.18714,21.31755 21.28075,31.97632c3.55531,6.07231 -5.16901,10.98973 -10.38705,4.49673c-27.24375,-36.8876 -34.70512,-44.36621 -34.70512,-59.20624c0,-30.31093 0,-29.89459 0,-60.20548c0,-8.67812 -6.34683,-16.98743 -14.45581,-16.98743c-7.71679,0 -14.42771,7.99146 -14.42771,15.52406c0,48.96381 0,67.40417 0,116.36799c0,15.08092 47.62818,60.69775 47.62818,81.9498c0,4.99628 0,9.99255 0,14.98889c27.02971,0 54.05941,0 81.08913,0c-0.00577,-7.32791 -0.01433,-14.65582 -0.02,-21.9837zm-42.88594,-214.71311l48.62654,36.4699l0,57.20769l-48.62654,-36.46989l0,-57.20769zm114.41537,0l-48.62654,36.4699l0,57.20769l48.62654,-36.46989l0,-57.20769zm-114.41537,-17.87738l57.20769,-42.90577l57.20769,42.90575l-57.20769,42.90577l-57.20769,-42.90574z", + "headphones": "m262.24301,276.32291c0,3.88873 -3.15054,7.03928 -7.03929,7.03928h-45.07771c-3.88873,0 -7.03928,-3.15054 -7.03928,-7.03928v-95.76917c0,-3.88843 3.15054,-7.03928 7.03928,-7.03928h45.07771c3.88875,0 7.03929,3.15085 7.03929,7.03928v95.76917zm-166.89014,0c0,3.88873 -3.15116,7.03928 -7.03929,7.03928h-45.07832c-3.88813,0 -7.03928,-3.15054 -7.03928,-7.03928v-95.76917c0,-3.88843 3.15115,-7.03928 7.03928,-7.03928h45.07832c3.88813,0 7.03929,3.15085 7.03929,7.03928v95.76917zm54.45998,-259.68797c-81.57039,0 -147.78664,65.61743 -148.80356,146.9389h25.82451c0.83739,-67.21309 55.56696,-121.44394 122.97905,-121.44394c67.41208,0 122.14168,54.23085 122.96928,121.44394h25.82391c-1.00656,-81.32147 -67.24229,-146.9389 -148.7932,-146.9389zm-148.59421,221.43015h25.35591v-74.64095h-25.35591v74.64095zm271.35417,-74.651v74.64127h26.29248v-74.64127h-26.29248z", + "hippie": "m126.57668,297.48117c-48.56062,-7.34268 -92.01251,-39.97321 -112.69057,-84.50511c-24.94552,-52.66977 -15.84542,-119.75688 23.8283,-162.85019c38.79855,-45.4432 106.09586,-61.79809 161.96931,-41.65034c58.35461,19.93039 100.52045,79.22475 99.29117,141.02438c1.2113,60.65196 -39.29578,118.84778 -96.0322,139.80408c-24.24886,9.49326 -50.68127,11.39462 -76.36598,8.17719zm8.7399,-92.17508c-0.08942,-7.31126 -0.17882,-14.62254 -0.26825,-21.93381c-20.52584,20.53458 -41.05166,41.06917 -61.57751,61.60378c17.64819,14.10371 39.22342,22.83827 61.57751,25.75548c0.29533,-21.80725 0.53749,-43.61626 0.26825,-65.42545zm48.5128,61.24323c14.52351,-4.28751 28.46933,-11.11562 40.24649,-20.66127c-9.32077,-13.4882 -22.68102,-24.26074 -33.95442,-36.33005c-8.88936,-8.88591 -17.77875,-17.77179 -26.66811,-26.6577c0,29.29706 0,58.59412 0,87.89117c6.88846,-0.91629 13.69307,-2.3291 20.37604,-4.24216zm-48.28273,-180.43147c0,-19.30317 0,-38.60634 0,-57.90951c-51.85052,5.59066 -97.82003,47.52976 -105.87597,99.4242c-5.92087,34.10992 2.2166,70.93011 24.35439,97.89821c27.17386,-27.16779 54.34772,-54.33559 81.52158,-81.50337c0,-19.30317 0,-38.60635 0,-57.90952zm116.00552,130.27736c29.94273,-44.68748 25.57903,-109.31516 -11.64191,-148.59046c-19.65836,-21.7875 -47.20416,-36.42821 -76.45694,-39.59642c0,38.6003 0,77.20061 0,115.80091c26.61343,26.23764 52.37032,53.38443 79.88922,78.67319c3.85712,4.56624 5.79269,-4.75352 8.20963,-6.28722z", + "house": "m21.15257,177.09065c0,-27.41002 0,-54.82008 0,-82.2301c-6.68203,1.86892 -13.14774,5.87402 -20.15257,5.63974c7.71781,-7.14793 21.82513,-9.41176 32.30949,-14.09891c45.79581,-16.133 91.60535,-32.4141 138.27387,-45.86145c13.50775,-0.66366 26.30505,7.15431 39.33269,10.42321c29.47861,10.57565 59.53784,19.97857 88.07501,32.90813c-6.51614,8.73929 -28.58875,5.06429 -25.73117,21.53019c-2.00067,45.62614 -0.83817,91.32375 -1.14786,136.98345c-18.99269,5.63184 -37.89932,11.84375 -56.94553,17.1149c-64.67134,-0.05981 -129.3426,-0.11945 -194.01394,-0.17902c0,-27.40996 0,-54.82036 0,-82.23004l0,-0.00011zm26.14161,31.25392c0,-16.12061 0,-32.24124 0,-48.36197c16.55636,0 33.11272,0 49.66908,0c0,32.24136 0,64.4827 0,96.724c38.34103,0 76.68204,0 115.02308,0c0,-54.026 0,-108.05197 0,-162.07799c-62.73987,0 -125.47972,0 -188.2196,0c0,54.02602 0,108.05199 0,162.07799c7.84248,0 15.68497,0 23.52745,0c0,-16.12067 0,-32.2413 0,-48.36203zm99.33812,-27.44867c0,-6.97108 0,-13.94214 0,-20.9133c13.07082,0 26.14162,0 39.21243,0c0,13.94221 0,27.88445 0,41.82658c-13.07082,0 -26.14162,0 -39.21243,0c0,-6.97108 0,-13.94214 0,-20.91328zm33.9841,1.30707c0,-5.66399 0,-11.32797 0,-16.99203c-9.58527,0 -19.17052,0 -28.75577,0c0,11.32805 0,22.65611 0,33.98409c9.58525,0 19.1705,0 28.75577,0c0,-5.66399 0,-11.32797 0,-16.99205zm-86.2673,28.75577c0,-15.24922 0,-30.4985 0,-45.7478c-14.8136,0 -29.62717,0 -44.44075,0c0.28782,29.49963 -0.86703,59.06848 1.39272,88.50464c7.32339,4.61035 18.6494,2.34561 27.75799,2.99103c5.09669,0 10.19335,0 15.29005,0c0,-15.24927 0,-30.49857 0,-45.74786zm150.9678,34.15282c7.18895,-2.37781 14.3779,-4.75565 21.56683,-7.13347c-0.32449,-45.85204 0.98636,-91.75861 -1.60782,-137.55795c-6.33264,-8.04385 -23.37172,10.13716 -33.97191,1.44468c-8.98801,-5.39767 -16.23575,-5.6667 -13.48424,6.8141c-0.6041,45.64783 -1.40456,91.35368 0.49997,136.97478c-2.32346,17.3029 19.61401,-1.57974 26.99716,-0.54214zm17.56241,-152.88132c5.81549,-2.74289 29.11139,-6.01917 13.28293,-11.03122c-31.02148,-13.18587 -62.53795,-25.50377 -94.87346,-35.06522c-13.26736,-1.87402 -25.71394,5.23786 -38.28336,8.42139c-7.2287,0.92986 -14.03493,6.61982 -2.78639,8.23806c33.43919,12.5762 66.81393,25.55496 101.06847,35.75281c7.2216,-1.29286 14.41238,-4.37938 21.59181,-6.31581zm-104.48328,-16.97943c-12.19943,-4.63456 -24.39883,-9.26913 -36.59824,-13.9037c-25.6514,8.95505 -51.55341,17.25012 -76.89988,27.03273c49.99152,1.67495 100.06706,0.58957 150.09639,0.77469c-12.19943,-4.6346 -24.39885,-9.26915 -36.59827,-13.90372z", + "keep_up": "m79,1l-21.3,35.5l-21.3,35.5l19.88,0l0,184.60001l45.44,0l0,-184.60001l19.88,0l-21.3,-35.5l-21.3,-35.5zm142.00002,0l-21.30002,35.5l-21.29999,35.5l19.88,0l0,184.60001l45.43999,0l0,-184.60001l19.88,0l-21.3,-35.5l-21.29999,-35.5zm-213.00002,269.80002l0,28.39999l284,0l0,-28.39999l-284,0z", + "new_born": "m137.15491,103.06109c-14.77614,-3.80736 -27.4188,-14.09921 -33.90258,-27.59863c-3.9915,-8.31045 -4.89106,-12.46352 -4.90182,-22.63058c-0.01103,-10.43683 0.90331,-14.55167 5.14873,-23.17045c6.5289,-13.25453 17.58841,-22.50933 32.02396,-26.7982c7.85696,-2.33434 19.44511,-2.4919 27.41292,-0.37272c10.68681,2.84234 20.56245,9.23503 27.27812,17.65763c11.44406,14.35284 14.51639,32.93808 8.33334,50.41059c-2.37558,6.7131 -5.38321,11.61306 -10.48294,17.07855c-7.51927,8.05854 -15.46124,12.82613 -25.72244,15.44125c-6.92987,1.76612 -18.2959,1.75824 -25.18729,-0.01743zm46.99359,76.71874c0,-11.66681 -0.15546,-21.21237 -0.34546,-21.21237c-0.55267,0 -23.15134,19.0079 -23.15134,19.47273c0,0.59862 22.40039,22.95203 23.00027,22.95203c0.2731,0 0.49652,-9.54558 0.49652,-21.21239zm-8.12837,89.58151c3.13896,-3.60342 5.94908,-9.57928 7.16283,-15.23215c0.75183,-3.5016 0.8862,-7.28795 0.60019,-16.91275l-0.36856,-12.40109l-33.73602,-33.39706c-29.396,-29.10065 -33.79212,-33.21501 -34.172,-31.98175c-0.2398,0.77843 -0.30579,13.66176 -0.14668,28.62961l0.28934,27.21429l28.53863,28.41072c15.69623,15.6259 28.73599,28.41826 28.97726,28.42744c0.24127,0.00919 1.52603,-1.23157 2.85503,-2.75726zm-21.12221,12.22665c0.5526,-0.21207 -6.52711,-7.73318 -19.03375,-20.22046c-15.75389,-15.72952 -20.00713,-19.64691 -20.36126,-18.75351c-0.82094,2.07094 -0.552,9.37703 0.49458,13.43619c3.03795,11.78281 12.81967,21.70416 24.49419,24.84378c3.43257,0.92316 12.65175,1.36725 14.40625,0.694zm-14.69553,16.96454c-19.19916,-3.63824 -34.22623,-17.37338 -40.35254,-36.88327l-1.52992,-4.87216l0,-51.56241c0,-48.09848 0.08022,-51.82547 1.1941,-55.47855c5.75462,-18.87271 18.67331,-31.86444 36.79293,-37.00092c7.28899,-2.06625 19.90268,-2.05429 27.24492,0.02586c17.6541,5.00159 31.24332,18.57871 36.39166,36.35935l1.50121,5.18457l0,50.90973l0,50.90971l-1.50121,5.18457c-2.97653,10.27997 -9.29736,19.97147 -17.27997,26.49481c-4.88281,3.99017 -14.22415,8.68716 -20.0538,10.08334c-6.28586,1.50537 -16.34073,1.79504 -22.40738,0.64539z", + "officer_2": "m144.87212,278.09424c0,-7.03476 0,-14.06952 0,-21.10431c34.12148,-0.13669 68.24295,-0.27335 102.36444,-0.41003c0,-6.63841 0,-13.27682 0,-19.91524c-26.94872,-0.26555 -53.89742,-0.53107 -80.84613,-0.79662c30.82893,-41.42374 61.65785,-82.8475 92.48683,-124.27124c13.28885,-1.73074 25.24835,9.13577 26.16702,22.30508c1.37796,55.08076 0.61356,110.19873 0.82785,165.29666c-46.99997,0 -94,0 -141.00003,0c0.00002,-7.03473 0,-14.06952 0.00002,-21.10431zm-0.19199,-87.83214c-0.06876,-13.74153 -0.13754,-27.48306 -0.20631,-41.22459c-14.64618,18.8075 -27.62093,39.06267 -43.91019,56.48129c-14.42976,9.56055 -27.65941,-6.01018 -38.58159,-13.69254c-15.26907,-12.11603 -30.9411,-23.83286 -45.24117,-37.08727c-8.74276,-13.13181 5.83314,-31.80238 20.70509,-26.84245c13.32168,6.5739 23.96796,17.78835 36.01906,26.44797c7.16664,7.87663 15.75377,12.89487 20.74445,-0.10861c10.61151,-12.96709 19.11472,-28.05023 32.18712,-38.75249c13.16731,-7.35264 29.1156,-2.93422 43.48628,-4.27982c21.93321,0.06611 43.87927,-0.19524 65.80286,0.42785c-29.83961,40.18141 -59.99303,80.13989 -90.45013,119.85524c-0.51442,-13.73006 -0.41658,-27.48491 -0.55545,-41.22459zm49.58183,-93.47518c-17.8813,-2.9394 -31.59131,-19.77306 -31.46613,-37.7664c-6.28482,-0.26553 -12.56969,-0.53107 -18.85452,-0.79661c5.37549,-6.77119 10.75095,-13.54238 16.12643,-20.31357c26.79919,0 53.59842,0 80.39761,0c-0.07553,16.83184 2.11966,36.40314 -12.31944,48.47567c-8.59595,8.79105 -21.9399,12.10719 -33.88396,10.40091zm-44.65282,-80.96436c-3.48923,-6.17941 -15.89734,-17.4112 -0.91945,-14.28427c30.58981,-0.43799 61.18378,-0.21775 91.77567,-0.27203c0,9.29378 0,18.58757 0,27.88137c-27.24594,0 -54.49188,0 -81.73782,0c-3.03946,-4.44169 -6.07892,-8.88338 -9.11839,-13.32506z", + "officer": "m127.65893,298.12302c-11.91827,-4.4541 -8.85096,-18.47458 -9.45842,-28.44775c-0.14007,-38.77051 -0.03694,-77.54163 -0.06789,-116.31239c21.30015,-0.31718 42.6003,-0.76093 63.90377,-0.70047c-0.02318,44.52536 0.58119,89.061 -0.14537,133.57832c-0.57059,11.93384 -13.89935,13.46393 -23.22325,12.30963c-10.33765,0.00372 -20.67488,-0.15573 -31.00884,-0.42734zm-30.7055,-116.03563c-6.74483,-0.72377 -12.32703,-17.61749 -4.40458,-17.57693c6.23801,-0.08125 12.47601,-0.16251 18.71403,-0.24377c1.007,8.20691 -1.59957,19.89343 -12.37878,18.21895l-1.93067,-0.39824l0,0zm99.85623,-0.00661c-6.98207,-0.87273 -10.75342,-15.40816 -5.67188,-17.55357c6.66685,-0.08684 13.33371,-0.17369 20.00055,-0.26053c1.00876,8.20958 -1.60458,19.90276 -12.38809,18.21675l-1.94055,-0.40263c0,0 -0.00003,0 -0.00003,0zm-107.61794,-56.49044c0.54922,-13.57674 -1.08583,-27.43726 1.69075,-40.79832c4.06557,-10.40357 13.92722,-19.77089 25.33163,-20.63995c23.60493,0.19927 47.27207,-1.00478 70.82676,0.54259c14.04367,3.09693 25.24931,16.9698 23.91605,31.57756c0.32544,21.70094 0.15948,43.40639 0.24002,65.10946c-7.41772,0.09508 -14.83545,0.19016 -22.25314,0.28525c0,-19.53377 0,-39.06755 0,-58.60133c-4.34856,-5.08821 -8.05232,1.74921 -6.5546,6.09985c-0.01697,13.17788 -0.03394,26.35577 -0.05093,39.53365c-21.48996,0 -42.97992,0 -64.46988,0c-0.17615,-15.26811 -0.35229,-30.53623 -0.52844,-45.80434c-4.21338,-4.81828 -7.17517,1.78474 -5.83627,5.79053c-0.07101,17.56546 -0.14203,35.13091 -0.21304,52.69639c-7.42339,0.09512 -14.84679,0.19028 -22.27019,0.28539c0.0571,-12.02556 0.11414,-24.05119 0.17128,-36.07671zm56.41985,-70.72921c-11.43472,-2.06434 -20.27027,-12.69278 -20.54277,-24.26873c16.53569,0 33.07137,0 49.60706,0c0.58516,15.06838 -14.48488,27.02206 -29.06429,24.26873zm-25.62941,-33.78068c2.8164,-2.81977 5.23412,-6.59949 9.76779,-5.28442c14.97531,0 29.95061,0 44.9259,0c-0.48174,3.25565 0.91423,8.389 -0.64331,10.56883c-19.77167,0 -39.54332,0 -59.31499,0c1.75487,-1.76147 3.50974,-3.52295 5.26459,-5.28442zm18.8918,-9.34585c-4.62387,-0.06122 -9.24773,-0.12243 -13.8716,-0.18365c0.48279,-3.24875 -0.91532,-8.37839 0.64332,-10.55128c16.34338,0 32.6868,0 49.0302,0c-0.48172,3.25588 0.91423,8.38858 -0.64331,10.56913c-11.722,-0.07703 -23.43608,0.45157 -35.1586,0.1658zm24.67688,286.6952c-6.54985,-2.25 -11.37944,-9.11417 -10.08943,-16.07803c-0.23178,-33.13365 0.30627,-66.28789 -0.62375,-99.40492c-7.52885,-8.41364 -5.32481,11.97667 -5.61325,16.63527c-0.40672,29.85049 0.65932,59.77377 -0.79054,89.57779c-1.03221,6.81601 -14.93086,10.39682 -2.36958,9.16388c6.49333,0.08212 12.9946,0.3678 19.48656,0.10602z", + "recycle_2": "m70.51852,115.61727c18.49814,35.46731 22.10944,46.23824 15.99329,47.70097c-11.94749,2.85741 -9.54662,19.19937 7.17589,48.84396c20.97182,37.17758 62.04919,60.008 100.6335,55.93118c14.9762,-1.5824 31.90746,-4.84808 37.62502,-7.25717c5.71753,-2.40912 2.20903,2.0788 -7.79668,9.97308c-50.05432,39.49167 -111.87362,36.74075 -161.19199,-7.17288c-19.66416,-17.50925 -46.71899,-68.66641 -46.71899,-88.33963c0,-5.57329 -4.46041,-10.97359 -9.91201,-12.0006c-8.91546,-1.67957 -7.71816,-6.10193 11.90882,-43.98632c12.00147,-23.16548 23.29887,-43.78072 25.10535,-45.81163c1.80651,-2.03091 14.03651,16.92264 27.17781,42.11903zm159.00744,68.37661c-18.49815,-35.4673 -22.10944,-46.23827 -15.99332,-47.70097c11.94749,-2.85736 9.54663,-19.19936 -7.17586,-48.84396c-20.97183,-37.17759 -62.04924,-60.00801 -100.63353,-55.9312c-14.9762,1.58238 -31.90743,4.84812 -37.62498,7.25722c-5.71756,2.40907 -2.20905,-2.07883 7.79666,-9.9731c50.05433,-39.49169 111.87363,-36.74079 161.192,7.1729c19.66417,17.50919 46.71898,68.66639 46.71898,88.33957c0,5.57333 4.46045,10.97359 9.91199,12.0006c8.9155,1.6796 7.71817,6.10193 -11.90878,43.98634c-12.00146,23.16545 -23.29889,43.7807 -25.10535,45.81163c-1.80652,2.03091 -14.03651,-16.92262 -27.17781,-42.11902z", + "shield_1": "m235.43118,0.99993c-25.8405,20.89055 -61.5569,21.09333 -87.59367,0.62283c-25.04173,19.6952 -59.05148,20.25899 -84.60652,1.69064l-45.9514,49.35802c28.26655,30.91131 28.10226,80.57548 -0.48303,111.27486c-3.79379,10.48137 -5.78214,9.97594 -6.19602,20.53111c-0.97335,25.41245 4.72666,49.11902 22.58091,66.97356c15.9491,15.9491 37.5927,22.71344 58.38308,20.29993c34.71738,1.92664 51.36115,18.07672 58.34494,27.73621c9.4303,-10.32108 24.09528,-26.91339 68.66653,-28.98181c26.60716,-4.12497 36.22241,-10.78885 48.70973,-23.10918c16.80759,-16.80759 22.6846,-38.091 22.18927,-61.73892c-0.20569,-9.81746 -1.32416,-13.23065 -6.84674,-25.76584c-28.71786,-30.84172 -28.73875,-80.82797 -0.07623,-111.70699l-47.12085,-47.18442z", + "smoking": "m1.00013,234.70761c0,-6.75858 0,-13.51718 0,-20.27576c85.15819,0 170.31638,0 255.47457,0c0,13.51718 0,27.03435 0,40.55151c-85.15819,0 -170.31638,0 -255.47457,0c0,-6.75858 0,-13.51717 0,-20.27576zm262.90899,-0.33792c0,-6.87125 0,-13.74248 0,-20.61369c4.50577,0 9.01147,0 13.51718,0c0,13.74245 0,27.48491 0,41.22737c-4.50571,0 -9.01141,0 -13.51718,0c0,-6.87125 0,-13.74246 0,-20.61368zm21.62747,0c0,-6.87125 0,-13.74248 0,-20.61369c4.50574,0 9.01147,0 13.51718,0c0,13.74245 0,27.48491 0,41.22737c-4.50571,0 -9.01144,0 -13.51718,0c0,-6.87125 0,-13.74246 0,-20.61368zm-21.62747,-38.40129c2.33044,-12.44823 -4.64667,-27.35672 -18.89619,-26.91631c-16.51076,-0.91339 -33.27669,-0.16469 -49.68698,-1.22891c-15.92004,-5.44565 -24.6412,-22.87308 -22.39098,-39.09009c-2.60393,-4.6821 -13.75305,-3.34301 -18.33653,-8.47466c-22.34129,-12.77989 -25.34413,-47.04951 -6.6355,-64.35941c6.55362,-6.74706 19.10332,-12.28213 27.40872,-10.56472c0,4.27357 0,8.54715 0,12.82071c-17.16693,0.19163 -30.20795,18.71787 -25.17886,34.95034c3.93155,16.28817 21.44681,21.17548 36.06943,21.4035c9.34369,7.54165 -5.73552,20.54516 2.38481,30.40595c5.4973,13.38734 21.79352,9.01994 33.15524,10.07909c16.32292,0.98282 36.22006,-2.88133 48.06549,11.43753c10.15674,11.08647 7.03754,26.81902 7.55853,40.56599c-4.50571,0 -9.01141,0 -13.51718,0c0,-3.67633 0,-7.35268 0,-11.02902zm21.44409,-5.02264c1.06424,-17.34164 -3.94,-36.41237 -18.82684,-46.85637c-14.2328,-10.82034 -32.68178,-7.49533 -49.35545,-8.05716c-10.44089,-9.26265 6.69904,-19.729 4.85689,-30.88184c1.16321,-14.61189 -8.86084,-28.86267 -23.32887,-32.0012c-8.26547,0.48857 -11.4507,-1.71243 -9.8101,-9.54141c-2.56769,-10.66179 12.99852,-3.08173 18.15088,-2.147c18.80948,6.74871 31.28568,27.05275 28.30017,46.93802c-0.48553,7.00495 -7.28169,16.99163 4.77028,14.2243c23.42943,-1.23563 45.83046,13.98601 54.11491,35.81352c6.09546,15.43478 4.5502,32.30844 4.8287,48.56076c-4.44968,0 -8.89935,0 -13.34903,0c-0.11716,-5.35051 -0.23438,-10.70122 -0.35153,-16.05162z", + "stairs": "m2.18934,245.58681c17.86729,-0.11601 35.73457,-0.23204 53.60186,-0.34804c0.11764,-18.34987 0.23526,-36.69974 0.35289,-55.04959c17.78193,0 35.56387,0 53.34581,0c0,-18.46245 0,-36.9249 0,-55.38734c18.2373,0 36.47458,0 54.71188,0c0,-18.01214 0,-36.02428 0,-54.03642c18.01213,0 36.02426,0 54.03641,0c0,-18.01213 0,-36.02428 0,-54.03642c26.79306,0 53.58612,0 80.37918,0c0,9.00607 0,18.01214 0,27.01821c-17.78702,0 -35.57397,0 -53.36099,0c0,18.23729 0,36.47458 0,54.71188c-18.01212,0 -36.02425,0 -54.03641,0c0,18.2373 0,36.47459 0,54.71188c-18.01215,0 -36.02426,0 -54.03641,0c0,18.23729 0,36.47459 0,54.71185c-18.2373,0 -36.47459,0 -54.71187,0c0,18.46246 0,36.9249 0,55.38733c-27.01822,0 -54.03642,0 -81.05463,0c1.20448,-8.94977 -2.05336,-19.04163 0.77228,-27.68333z", + "umbrella": "m138.31999,1l0,29.565c-75.13835,4.16908 -134.31995,48.17229 -134.31999,101.835c0,-9.67107 16.35202,-17.51999 36.5,-17.51999c20.14798,0 36.5,7.84892 36.5,17.51999c0,-9.67107 16.35202,-17.51999 36.5,-17.51999c9.59525,0 18.30284,1.83565 24.81999,4.745l0,144.17499c0,6.44742 -5.23262,11.68002 -11.67999,11.68002c-6.44734,0 -11.68,-5.2326 -11.68,-11.68002l0,-5.84l-23.36,0l0,5.84c0,19.34207 15.6979,35.04001 35.04,35.04001c19.34206,0 35.04001,-15.69794 35.04001,-35.04001l0,-144.17499c6.51714,-2.90935 15.22475,-4.745 24.81999,-4.745c20.14798,0 36.5,7.84892 36.5,17.51999c0,-9.67107 16.35202,-17.51999 36.5,-17.51999c20.14798,0 36.5,7.84892 36.5,17.51999c0,-53.66274 -59.18159,-97.66592 -134.31999,-101.835l0,-29.565l-23.36002,0z", + "yin_yang": "m152.3828,1.00127c40.96666,0 74.20116,33.2665 74.20116,74.23316c0,40.96668 -33.2345,74.20117 -74.20116,74.20117c-40.96668,0 -74.20118,33.26653 -74.20118,74.23318c0,40.96667 33.2345,74.20117 74.20118,74.20117c81.93332,0 148.43431,-66.50104 148.43431,-148.43436c0,-81.93333 -66.50099,-148.43433 -148.43431,-148.43433zm0,51.0353c-12.80867,0 -23.19788,10.38917 -23.19788,23.19786c0,12.80871 10.38918,23.19786 23.19788,23.19786c12.80869,0 23.19785,-10.38917 23.19785,-23.19786c0,-12.80869 -10.38916,-23.19786 -23.19785,-23.19786zm0,148.43436c12.80206,0 23.19785,10.39577 23.19785,23.19786c0,12.80206 -10.39578,23.19788 -23.19785,23.19788c-12.80208,0 -23.19788,-10.39581 -23.19788,-23.19788c0,-12.80206 10.3958,-23.19786 23.19788,-23.19786zm145.10503,-50.94075c0,81.87245 -66.37071,148.24319 -148.24321,148.24319c-81.87246,0 -148.24321,-66.37074 -148.24321,-148.24319c0,-81.87248 66.37075,-148.24324 148.24321,-148.24324c81.8725,0 148.24321,66.37076 148.24321,148.24324z" + } +} diff --git a/dist/extensions/shapes.png b/dist/extensions/shapes.png new file mode 100644 index 0000000000000000000000000000000000000000..1c303048391fdbb2811c3cb90a953fc7111bd707 GIT binary patch literal 8376 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 + + + + + + + + + + + + + diff --git a/dist/extensions/star.png b/dist/extensions/star.png new file mode 100644 index 0000000000000000000000000000000000000000..321e3ceebedb8e2460706343072b8bffde89770f GIT binary patch literal 14036 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 literal 0 HcmV?d00001 diff --git a/dist/extensions/webappfind-icon.svg b/dist/extensions/webappfind-icon.svg new file mode 100644 index 00000000..a73332e5 --- /dev/null +++ b/dist/extensions/webappfind-icon.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/extensions/webappfind.png b/dist/extensions/webappfind.png new file mode 100644 index 0000000000000000000000000000000000000000..f4b4417cb34f624e97175a2be6fbfde1dceeaeb6 GIT binary patch literal 97580 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 a7ze(vj)dDzxEJFQx(xIV=;mnKg#I7m7R+w| literal 0 HcmV?d00001 diff --git a/dist/images/README.txt b/dist/images/README.txt new file mode 100644 index 00000000..7c5b5739 --- /dev/null +++ b/dist/images/README.txt @@ -0,0 +1,60 @@ +filename origin + +align-bottom.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-vertical-bottom.png +align-bottom.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-vertical-bottom.svg +align-center.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-horizontal-center.png +align-center.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-horizontal-center.svg +align-left.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-horizontal-left.png +align-left.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-horizontal-left.svg +align-middle.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-vertical-center.png +align-middle.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-vertical-center.svg +align-right.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-horizontal-right.png +align-right.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-horizontal-right.svg +align-top.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-vertical-top.png +align-top.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/actions/align-vertical-top.svg +bold.png +cancel.png +circle.png +clear.png +clone.png +copy.png +cut.png +delete.png +document-properties.png +dropdown.gif +ellipse.png +eye.png +flyouth.png +flyup.gif +freehand-circle.png +freehand-square.png +go-down.png +go-up.png +image.png +italic.png +line.png +logo.png +logo.svg +move_bottom.png +move_top.png +none.png +open.png +paste.png +path.png +polygon.png https://github.com/SVG-Edit/svgedit/issues/377 +polygon.svg https://github.com/SVG-Edit/svgedit/issues/377 +rect.png +redo.png +rotate.png +save.png +select.png +sep.png +shape_group_elements.png +shape_ungroup.png +source.png +square.png +text.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/tools/draw-text.png +text.svg http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/tools/draw-text.svg +undo.png +view-refresh.png +zoom.png http://tango.freedesktop.org/static/cvs/tango-art-libre/22x22/tools/page-magnifier.png diff --git a/dist/images/add_subpath.png b/dist/images/add_subpath.png new file mode 100644 index 0000000000000000000000000000000000000000..a025a78d85a2e7304e01d57f62add027eaa417d1 GIT binary patch literal 35830 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�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 literal 0 HcmV?d00001 diff --git a/dist/images/align-bottom.png b/dist/images/align-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..b60fa558dc070f6ad71cc14de4f6042eee249b0b GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4f8J;eVAr*|tKmPx>_cfSv@#gJ+ zix#i`YH!9fN%?ld1jZc<9(_s8`tkPtJumYII+OBa^SyPP9sh$R%`cugYO>mgF`MV?mZL`7d4P5@c)I$z JtaD0e0sw8YJ&gbW literal 0 HcmV?d00001 diff --git a/dist/images/align-bottom.svg b/dist/images/align-bottom.svg new file mode 100644 index 00000000..36f8efe2 --- /dev/null +++ b/dist/images/align-bottom.svg @@ -0,0 +1,277 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/align-center.png b/dist/images/align-center.png new file mode 100644 index 0000000000000000000000000000000000000000..b155461c126328568f053c1607e8266e14c3603c GIT binary patch literal 221 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fOFUg1Ln;`PfBgS%?^vVQ`19cW zuVuapQb*L;gqOaE;W=Et;NX8plbdYi-?r_4@gnPQe~-V~=SCjZ%P)!)zPd>A1o?0= ztW-bw;PmzLhd;LZ1WxF7G}&bFlufzS(3W>ueL#R* + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/align-left.png b/dist/images/align-left.png new file mode 100644 index 0000000000000000000000000000000000000000..4975a62c19e05cec260527d32a91f53422fb59d9 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fWu7jMAr*|tKmPx>KitaljJ^Ka zZPUgKf%#GrK6APgfAE|9uMe%6a;7t$ zO?3bNq)fG!ImckaGK*#bvl;&^`wIjnN>;Wgi-s2|iziFjWEq@Q>R)%VH%qc5ZK@{2 YjHze07)1RI1iFC1)78&qol`;+0PCzj6aWAK literal 0 HcmV?d00001 diff --git a/dist/images/align-left.svg b/dist/images/align-left.svg new file mode 100644 index 00000000..b1a24a5a --- /dev/null +++ b/dist/images/align-left.svg @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/align-middle.png b/dist/images/align-middle.png new file mode 100644 index 0000000000000000000000000000000000000000..4d945f9e350c1b7cae36ea549e72da31138409d4 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fot`d^Ar*|tKmPx>_ceIS`|eF{ z{l$w{f5}U;ot&6!aDpL*LB)OJ!RhPgyC3^vG^1d`#7u*S3X9Jq_>>+#_<)=94F9>K z27l~lo?)N1XM*N0`4jAk2GT5kY99|CX~?m8HA(T6Lz>Z_$o%UpM-mtn7%nT=wI=y) tDgKzTYC-k6#r2Vn{hulxWDCqnU`Tp&=8m~*Mjg;m44$rjF6*2UngCszPP+gA literal 0 HcmV?d00001 diff --git a/dist/images/align-middle.svg b/dist/images/align-middle.svg new file mode 100644 index 00000000..d2b42e6a --- /dev/null +++ b/dist/images/align-middle.svg @@ -0,0 +1,250 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/align-right.png b/dist/images/align-right.png new file mode 100644 index 0000000000000000000000000000000000000000..2dc83ae48abb66bc584a97dbf25357fff251167c GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fC7v#hAr*|tKmPx>5B<=}@{GOy z+HKRu41xJsZ1cMlfAE|9utE#nfH^6MmsO=&swy{h?U{H X&)F?ECapdIw4cG#)z4*}Q$iB})9ysI literal 0 HcmV?d00001 diff --git a/dist/images/align-right.svg b/dist/images/align-right.svg new file mode 100644 index 00000000..c2f8f19e --- /dev/null +++ b/dist/images/align-right.svg @@ -0,0 +1,233 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/align-top.png b/dist/images/align-top.png new file mode 100644 index 0000000000000000000000000000000000000000..5252723bcb6210cdbe897859a26fd4316629d5a1 GIT binary patch literal 165 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fIi4<#Ar*|tKmPx>_cb`&%JPi; zd6L9G;X~n*s+691TxALd}bK z + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/align.png b/dist/images/align.png new file mode 100644 index 0000000000000000000000000000000000000000..a0fc147b240736d81c898c1c5528847b499254ca GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^Vj#@H1|*Mc$*~4fF`h1tAr*|t3T!exPyYO`oA#+* z;H-nKLDq*A2VcH?`CM2?=$~?OO7q314zD_mB$oX6`}_O%Q<**|mm@9^K@04;-RDaZ=@ zceawWvmzAii~sh%G_%51(*7gZlKHd?DMp6_U|&3PtI2p{XctsnU|)Qy{VhW(`c4A+_(wmaYlw1hJ6f- zl=x!-*os%SqBxbXFw9`Er$QdLbE927E(*=#(}_^b${;|VKXyX$I1vreaE7-GndHPq zHrN-xk@7fhpvRy^Rvvfw4z{F*cJ&4{k2@U4$m6&HFNtNDLklF2+sP8GrGeoOLk?+q z{4Y4+CXt{?mO-9@ne;rqiI#2kxzL7mpaa!_F&EZ6PF-lLg)NWM(h`SqhXb^LPV%E& d_)$P>006}ZS!$N}!ZiQ@002ovPDHLkV1jfY;4J_E literal 0 HcmV?d00001 diff --git a/dist/images/arrow_right.png b/dist/images/arrow_right.png new file mode 100644 index 0000000000000000000000000000000000000000..3d7a19710ac9bd35f79d98428a8e2bf9df625bfa GIT binary patch literal 2133 zcmeAS@N?(olHy`uVBq!ia0y~yU=3wpV9H@(28!^f#iau&i2$DvS0IfQgqh1|0VOy} zg8YIRw*24Av1c>qg)S3&1_t&go-U3d6^w6hYz=Hn6llHpJG#Z2xrD(m>QT6mWf+H^ z;Jayy-k+NjeRyVi*|zBs`HKFt@A~cDT=ypTxU^xI_nUW0$5w5ST5T_N?We?Q({1W& z*6fPt4Heg3eJE=U*XoU0Ye3|!Q!P_N6HUWfr-oXKhJ{7n)tFzV3|4vd{o7MVPk~H` zV_Y+9!zQgYK;s~!)apZE36Mdk#$i)*Y859$k@jjeu$@4gi8l|SGz)4eHuJ##!Q(z` zRugaDCVWcaUcsUWIi!(&jYTPD(4Z>9=4*Ub<1mkGuYk-0ha%WgP^^I6M~-=5uV9)7 zNjs>%1}897ub^5DN?PQYhs!IN=0UOwYEXlHjj0qKG{4>phlTk@L;`aZkTgw94F!`| zL3u3|L;|IOIS#ubzt*iCp}RA!fVrf5Dk#4K{U23t7DQnZIRcoYH1Id$Gt2bq>Ii#bm13F)HWg$k*i^8kRgp%l|M z^EPEEN9rbBUH2)od1?gbYO||HBTCmwt)9mKu^n#jt@p*Gwt(;(W;kU&iFD`=`2cE8eF6*2UngGH{1|a|d literal 0 HcmV?d00001 diff --git a/dist/images/arrow_right_big.png b/dist/images/arrow_right_big.png new file mode 100644 index 0000000000000000000000000000000000000000..a48479468e897e5d8118d0f45767ef461a6be980 GIT binary patch literal 2138 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 C*ead? literal 0 HcmV?d00001 diff --git a/dist/images/bold.png b/dist/images/bold.png new file mode 100644 index 0000000000000000000000000000000000000000..a1ce11df31e89b16092c9c5d8e7a1445ffca8c66 GIT binary patch literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+iE>9Q7kcwN$2@($<*o#$6UnnzQ zEV->bA$9k`Jtl3t1ALoyY@OqHiNS~=>AcS!sj|fx2@SVC_J#14cV2zKR2pPiD0OO~ zV}tpevc;^gCEEi26mFEx-XJCXnq76p;(HJKIKKqEQh1VE!uxbdmO=(|)+K?K<69K| t9bxy((+ha}ULvN$|K9G8?za~(Fzn)OI3l*=zB|xW44$rjF6*2UngF4pO=JK7 literal 0 HcmV?d00001 diff --git a/dist/images/c_radius.png b/dist/images/c_radius.png new file mode 100644 index 0000000000000000000000000000000000000000..f0f3a5228fce3714b34f938d6aa9f485bb0bd59f GIT binary patch literal 308 zcmV-40n7f0P)hbTwxdGz=0;{!mt}n#8%HPih-L!98K7bVJDi1eU$?X0|Ubg27VM_ zcZMA(d`EW&3n(*!felH*lVKYY&q~ZL9*L{SUFP)*3{k;#e!oDB2bn$!xroo z!+;r7sV~DOWD_IpR53zJpCOEafx(YqBXVrymtk{F1X6=Hq}T7&ahciC?XcAps|}MpEdIPgLThvO)j^H9BU*9HaRF0000{IP)X%qX4kC1X4`{Ubv3?~ zD_L;B0p7kNMjQz|v5&!CF@1dC`0*#tJNjtDzhVW^sw#YjLD=cUmKQCQuncRxUZOIo zU$cg}ixwHZh7LW>)CL6w?7Iz~9yn&q@$-*6&hY*HH&N}p-tC6oy@|AFK~RE)5>h{; zInS6e)aZO7S(A0^m^*Kt(R;`cg^ByDEV`r6aXQVj@4g$~zyA`esUhxg3q>ebiM2{cHVwFW->|tn{L7-@%2|-g;!$_kTFfd3TgXZy)f0c zvS{}~t}kIzMyTIX{XktE<+`#SS6)fq+it_5@YuDs{+er`yqxBVMDBlrj8KNbZkl!t ztO>PN8WvKqg#@UrrS9#waT!K#=hg4NOKRs%OFX0hWC|wfbQAYM;R@7}Kh%)Il~%TN z*l)jF2sKM*^#gzWK`OfmompC8$_P{cLFcATVi{NiElN4JYg@iAal+blF6PaevE{D2 zNGN1OZoHA9;@1;T#F72I?ggpjNcZcPGqXaZfi)pq8_kP5J9NNo-n@8-(h^K=+JsFzjOy@GGG*E{Lcjk`#Rngd z`0+FI{?%1>JM1t#EnAWTOyQ83ty8Ds24*UC&D(FjdG&sa7aKLvD50%e zDf#O!DzaCk`$FPm@L`>YK{0 zFWz_~`EMZb&3$mS461=D(a_jCxm0u)T}0Qz;P4T!5U`n|(5ho1vh8|U^AfxYl!RXPV|z%d+;xI|LAX$MF6S_%fT#UjM@nKg4@2uwuoE#UOY= z6h-cU0}iMeKYqM9Vf^@D^Z%D$e%bKxM<3H)e)}~Vi^UY=o$}+4KR(+dfwgPb^7(xJ zRkU)!{Q2|$J>!fs#-hnQF)f)G1|jGHX)VzRPxU9Bd3x7FPdu@|VHjU4iZU0y$#f~O zc=6&l(8`$)J@im~#PH!hkh(zLN^AgT5iHb-e73GJmRYcIofwP9w`|?I_2^Co7Q)c- z*Pndy$%auQM@B*3PU?uTLhw_L#56sANhXu`FalT!)5nb)SBDS2P+TU`ncor4WYoz=9@zk{V;KQm*AKu_G>|Np z78@*KXZ~!SE}1r?d8o%Yyn^!qXL#DwX%tHAWVXX%eeHROVcupQdt4OrpkmW|v4E07 zQ4csuInJ3lhp<;dSdhHUb6AN4CX^3R<3}HS(1fI-ZnLY#@v}aFBjn?6zNrO64y|u0 z7x?$R_uuF7sS&eB%aawN)PCu`ckBEj_2@4vG(G;69G!%?~7+!UHU3U8K+B?DrnQjHv2lZ>)5uM*tREcPG064 zooD~ogMWSN9$*LSz^XONmjLtWKvY~x3V%^m_Kk!Ze*e++V}?DPnyfhR10ac=`7@`_ zp}jH20p||xk0Usy1Vc6--rSvJNE~gj+0g*`ourvOeE5(=B7rdm5%FGt^&Jc;c|o=w zB9Y3%q{kzPV)9FmW87U6#C*C8+-??N7l8)?4E~#Uz8;lti2TM#9cVG2Kn75s4HN)q zO8^TZKyXY2RS-$wN**p{$lnLxoC5bXe|}v+%=eqXhc*GKiudXL)(9$!{s&OWF9z|) z^npJYNjm#@aQ_*CyBT=V62L0=UMM2OehYZ#(-^72ks`Vsx{&A3UQ8htq2&mji=j934_lj#8oqv}{Qv*}07*qoM6N<$g6kd(V*mgE literal 0 HcmV?d00001 diff --git a/dist/images/clone.png b/dist/images/clone.png new file mode 100644 index 0000000000000000000000000000000000000000..b8e10fb3cb39dc1ff4b59cfa7ff90af38deca843 GIT binary patch literal 597 zcmV-b0;>IqP)kQC>SxJV!Pd%jlU9ey{Al=wg-#`q&T#0@?UT6nul<~R*o z{#KaJ*4NJKFZ~5KlXGxI(1cEuV-|A1i85~DuW~TVi6gI@-M?(z=J_SJhU(|>X^1WzP z0x#(jq5@wc*yA=L0*qoLdmnRueOlRH>w95Z_=Lhoe+VDM&*6?a{iSr-1NKu{;7GP%%8}99d@!l@H zc(4Z>SB$~TiM_C6-FUp$?uDe?2Rr>|;qoNE_@?k51$lrcg!)Nves>ivQWiI6x`vyV z_QBKsI=q;}4fr?`ryF9pigMOsxB#gzsjbBnp7gUuwXhib`56nhf>b0mNj=hlG$u_+ zGg(u4Un6Ydv j$gBlcUtlQ)|N8a;k3PQosgg6A00000NkvXXu0mjfiX|Sq literal 0 HcmV?d00001 diff --git a/dist/images/closepath.png b/dist/images/closepath.png new file mode 100644 index 0000000000000000000000000000000000000000..7364bfc3f143c4b9737140558d791e21af6685a8 GIT binary patch literal 8036 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 literal 0 HcmV?d00001 diff --git a/dist/images/config.svg b/dist/images/config.svg new file mode 100644 index 00000000..a62cae6e --- /dev/null +++ b/dist/images/config.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/dist/images/conn.svg b/dist/images/conn.svg new file mode 100644 index 00000000..7aa6202d --- /dev/null +++ b/dist/images/conn.svg @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + + + diff --git a/dist/images/context_menu.png b/dist/images/context_menu.png new file mode 100644 index 0000000000000000000000000000000000000000..05a49fc1388b43dc652dd0de66257dd47d286c6d GIT binary patch literal 506 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P3?%t>9eV(zVgr0aT!A$0z)p6N4?xr9OM?7@ z85|n^>#$wa`&q$sRQXHB4#{^BD+Hgp&)~je^|#}*#y9<4!VCgpZ#aDyisvKcSHvW?3?OcaK+V+^UI2c!!pl4#LKhQ6$uIo z#y0<5C$~IU;$>Xmiz2z>o$n?e@l%}e%5J3vZ~D%66Vu}k2Tj=(8);z{zVvqJx{cwl z!?y0=Ghdr`*=*n8OE1mlR)>Gz<@)~q)x#@ZA9MWUyDLwqCGz?irj2*5ltr^V{ugli zv7UziRvT8eo;S`C>V9jSB{VnK=TG1_`_*{wW5Q$kjK$4CPx2Mq*q=&%2$x^ne9Ece zup4_QlZ=_w3b6+pE;{BmgP6h}KD6__Vzv3Ru=yCHWlqTjl>>>3o1gvv`}%Fs;cIl{7{F2_QlPl^Q8Tt3{gP$Il<@ z&cH~I)J(5muQ#B0rBVT9fn?&@vuDNxnCfJ5BfS|Z2%QWDhYupgS;ZXGZ zef+rg)H61D27l`yo`ISQYn3q8D{($Qdi+2l^wRi;0~6tcI%Hfc>1jrBo(b0Z@$yuZ zi%D=kzP0G&`^UTT&6_uh`w#9ZgM-B0`N#(Bl;Suao`n)6s8sz}9;FVH_|024m3a1I zCeOW*4cM*jm$mSj!ZaR_$CzNxOMaN#KNIf@LFV{6OeFB_`T+HyA_uPvc>Xgk26_Vk XMqF5A0!~eK00000NkvXXu0mjfTSX_H literal 0 HcmV?d00001 diff --git a/dist/images/cut.png b/dist/images/cut.png new file mode 100644 index 0000000000000000000000000000000000000000..b87a4e37517b9c99425dcba680be353bba68d558 GIT binary patch literal 893 zcmV-@1A_dCP)ax{&CxlHgUYumQH#ba5gvg?ep*7lC=9ox2T#5~)+^u0baH>~RV z=KK1+?uVJ=7H-_SdfH!{@UIIH7<})I35zo+DCC~6sihIIaZz9Uiwz9E`~A@HAc8{! zSxo+f3_`*JE#sy!csw2?B*Y>nHuBJ=sKGjc&*gHmI)VcD6Ms55^ghkua5&K2(~Y2z`yZ2=%%Wpufj*9k zRd#lEAS*k=OfED$=+lwWVc6|~G zsAlS?K&QJH`r1nuWREkpN`C6Fqw=RNyW6i?pyPM&d$XCCwY8!TLq@%EN2=v=gjBM6sjFORQYjY7R1 z$tu+|zmD%|-uX_Rag1jk^Zgslnceg8jvc6*Gw1s#wfYGWde5_QBV^9}LNN*yfu481 zlV=>`nU_0zRoXykg8*+5I#t^Octi0_K>=o?(75jh1?)w_e#Y~;9 zC0DO+OjDGL@;2wcI{0%Z>R$tN0;6D_VE&)5P_Rg_KrrX0LDjH99movUPfq{<$<-ir T-jN-B00000NkvXXu0mjfRa&*9 literal 0 HcmV?d00001 diff --git a/dist/images/delete.png b/dist/images/delete.png new file mode 100644 index 0000000000000000000000000000000000000000..d85ea1562423ff836ee63a56417271c8a63514b8 GIT binary patch literal 390 zcmV;10eSw3P)@pDoG>&1PB08MF^k*L;xUx0>cO(1P}lO+X^rM5J1r0N>MZ0ESrqBnAFhT zS;xGmNj&$uv%?Y6_jUVw{}q3db0JQ4J-ZNMv3rF|$smi&eZlEfDD*kb=kZu7DU}Se z$g~BQLOhSMSxi$Y7+x=~-EOJ!vt*D(=KcvlyW#VpFN9LbAdAcc0l$T+fDFe1!|%r= z7CQ>N2?Q`rr_p!0h3FUJ6EtAOv5{vx!6^fmAAmbUKYp zCS!`(FJ%-n?OO_k0^;#Fve_(L*ZodRcro|zve@bIc$8POSS+GaseB}+&`f+fop3&% zalKw~xm>;z^TlVkOv;pp!{I@AyWKc>_QZdpUqRp2(cDaF)s&r+nZ$qxumA?c0zfPa z#9BaX2E>j)>t5Zz=TV}*Vk9n%gZYRNFNFb33(YE9sNHpF7AJLc=&&BZ|_%jcJ@b1Oic2$w6tYh zU0fK6w$b0;AHX>|z*Z7PVfap8ZQE_Mw#{f6uWj45Z3b(bwXLAG_54P6&feR+PC99$ zoy?b$48H$d&73xETFK(YiyPC@(yAqlO#;jE*u+YpH%M5clY}-kkF|PJR&sLHoLRFP zA|oT~diU-RX~)$8@wMvor7Z0C+0ZQkBKo?v1b zM#4l)5NYj1Qal4uM2yN3bUfR<<@8C{=N~`3RasbUB)(QTVEFLiOWfVv4{qJO*>&pl z>8?m;us~EU%0dO*o|6z{XNRKFQd&2kIms6k6`eu=H{?ZbX=w=_IA~D#=;0%*k)Fr} z0T3r3#8Y?~`mEb?j#dFsy9P}fFxYY2;Gup*?x)yA9LGsItyW|W28;xeKIkGAC}xr3 zxiU-?kZ3fJ+d!3|2vDh1Wl>R4rBPAQfUK+}-~@*J1OysJkb~r|yEFm7@eH!IL0=Q& z+3yK))kIm-Z5O$^xt<#`aL~HT$Bwu635)atwN@oBawnp4J>*5UwS^jOd)?xb$K0aQ z)1DCBW`d|VXzF(LuIRY9b90w0_Wbnwho15AG9rcnU^#Qg0(5pvyYF}o2pC^q?stB! zcFfvUzC?c8)75R0S>E$yYim1#l#gB>9%VuGxerLM1^*Fq$is#t{B3l7Z%66pR7@rLVa7H0(dP P00000NkvXXu0mjfoKISl literal 0 HcmV?d00001 diff --git a/dist/images/export.png b/dist/images/export.png new file mode 100644 index 0000000000000000000000000000000000000000..3ae2a4c0e50c51a2fedcb3f5e7b78e2758e0bfdf GIT binary patch literal 771 zcmV+e1N{7nP)n&@Atbp=bSn0 z!DKS;XR%n1pC()`_pw9E*=)Af<;#~Pmo8meI8Dx-JGaE)aK1Vaz<>P6$jC@OIXMZZ zNl;J_;74L`EMVTx4}e746Gd_H|G?ouPi`@UG)cgwQi5K4M~?|S^qJYcZ!+}wM*-iv zl)^Jnvdz36Cxf`wV*n~dfuT0TYK3t{Jg5BgOkyIe=;>`{;)WhnpVJ45XZ;RfBUzo2 zoq#G)^tK8?NLD2X2zdEdsw83b$NGuz?iK%aGye>1_xXK278M;BW~OutclB2Q-Jn^mZ%jz^M`K#A5 z;eCTb_{yvbs18lQ^X|fdA-J6&1*TIeMllFLNLJ?w0aYUZRVDDs)eHoDX5eK^9LI{2Y@lxPt z&cZMLE!ex~oe>}?m2Q?%67u2GxVjyHd#z;KH6RM#Py(-9Nk_mJCKU+acy=P-R-6RR zIuv4LJ-;0n8^4gKe5UelaL>B6QI7B(x9JlkzPcL4Y*L+SF{?qhoYVZyYEF}Gxj?om zUq2r*2wxh;V%Htx_S{MGkz81=z8j$W49r*E4L1v===$tC(4HdjA5;5=ulWQ)sPW`C zA~h9~K>X&FkmXl@c3pQ0&)ri#)8`0SEh^s#`tI0M1wJMi8Z^_zAFm6i_bbN>_hh~P zp_9!;Uo+0p&{T1B`DPS@ai^Q?lv(Kb@vw4~<Wu@L0RS&36tgwglQIAR002ovPDHLkV1lE$ Ba^C;| literal 0 HcmV?d00001 diff --git a/dist/images/eye.png b/dist/images/eye.png new file mode 100644 index 0000000000000000000000000000000000000000..fe5e245c1246dd2aad0364ba47137671c89280e1 GIT binary patch literal 665 zcmV;K0%rY*P)N$4FQ)#$>1p2j3tw!Xz#iJ!RcK(Y?>cwX=EE(HpDgQt$klb zSHKSEK=Vn|`YoK>tKpa?1zk}%!Ekyz!Ods5Y&Qv5DG$0n4Br1bBFr=WV;VQ+#zuUp z<@3EdfvWD#z+Z2|U(KMqC4L?@9aLi1BX`D{+2JzQ%|OHmuC@MJNK*sff6Ag8H#Cu) z9`JbpcLk)=2OA9{1w=6e#I~@PEUH3P&lKGpz2LT|z7l^Z<&l>ja;I~}+bE^C>jam( z2m%gRHoqmyra5EpPl%LX-}S;btN%|k{gd$n5rlP`0=aWL00000NkvXXu0mjfX>~Cz literal 0 HcmV?d00001 diff --git a/dist/images/fhpath.png b/dist/images/fhpath.png new file mode 100644 index 0000000000000000000000000000000000000000..57a5365e4b39be242fa3e2bb754df2ab035eda96 GIT binary patch literal 1082 zcmV-A1jYM_P)ox^Qrm`8uvy9b;1cJ z=r?6jE=jT3LhrouPWiPrcmL$3J9+`p-y4j+n;k!}`smf~k}zYn5rhu_ow04=x**n@id>Z`9twC`B*>#QZa z#o}Csms&t!^_yroI*WIJ6Y&chJ4fAgnJ&6%F9P0T6UE}zmFHg2F&a*Hz>BVg^)oTSaMuI%+HcA9$KzA2 zQDOZ7YNuUx8|6CAQCiTSP4veff9%w$OG)FggUYB`F`dHtvuN%*{|(Q&1U>XcP0A_o z6e_Ggf*bpwhTjBKv5A^Ajb3@dc^#umXE&L=ae2Ia;moDs%9ZQdcP%3_wnvN>4J`g# zkYz)nkOY1ZjIh&AI~}S8w`##~pdh5vX-ltJfP>${g$uH)SI&<%Y1#qHvOq1J@rCo= zBbTh2Fmp|Z_bzB|j(cW9^+)4VcL0wFX56@OMuTT-*nRrlLXMQK(p0Z)@SmnXgk{T? z<(+&!OpsFn_5_f_Pk6X`pYEp774KH2GkLE)P$7gh#FCf>-6J2#H8M}HZPf2$aDzCqmYJIODiDhKf2xrFI>zn{WCq)PWu4;j_;MkjJfvBpXid+Kp_=kIj|u@bT9!zZEftH!!YW~mi3@@%h$ne@ zm)gbUPdSTiXo8HCpc;S47h)vHl8@zWF>FJZ$=^~csLSO_YS+mh{*6S~j-HYga--}k zt)-hBB#+1jxkt*_fkyg^eivI-$@l)?ma@tI1<0=$hV~)vt^fc407*qoM6N<$f`c0s AD*ylh literal 0 HcmV?d00001 diff --git a/dist/images/fill.png b/dist/images/fill.png new file mode 100644 index 0000000000000000000000000000000000000000..c785879d6b5b13d4608312129f033841dcae0d5a GIT binary patch literal 644 zcmV-~0(i-Y?4}77vHNGXjF+MxaGfs{K?FarZ{I3C~6Mj1UnDD>j zXXWRTXQ_{qD`UBd(thCog8vFoR^~V7HxSl_|I@xC{miN-Li>UL@&9H2mqFPDU(H`2 zWcoj5&mgEh|G(w`jsJE3H$wT9U$mbhWT$*d+lE*Bf&bC}Oa34DpY%TyF4Fu(;UPl4 z?M*@~9_N5FEx54;Y+=bm+K{^$daxd<@)T;z>V2BB@^! zMUlf1uMvSS5lK3YKlwXIEa_(`4{A)}G$Qf`PYXg>qG;+@kZ9r`2Nv|ifYpfDA95%q zQ<7BLmjnOz|4;afEjeNs5&vCgCaRKT`Has8{_p;u_!E1EKrtfmyUZMP1qrHI9}oQB z@jvMct~>=dBKf=2JWT0Ct?Um6{%`%C@(y>d1{;z3U1|X~$pnMk4+s8l`k(p&U%?V{~3Q$s>wDWC%Nrg$nm-(z;&1NFTnE&};OXk;vd$@?2>@jY9Krwq literal 0 HcmV?d00001 diff --git a/dist/images/flyup.gif b/dist/images/flyup.gif new file mode 100644 index 0000000000000000000000000000000000000000..c027e137c96c28747708aaf0bf3f137c6b156179 GIT binary patch literal 48 ycmZ?wbhEHbWM^PuXkcLY|NlP&1B2pE7Dgb&paUX6G7L=YEy9Fm%=ZO*Ghx%ZZrcPSt4l3Wu&g^IR~Ff`#z{ReU&hU9R8LmVT6 zb4#~~BV>?47B@9#U&G@JDIt!2OW%hacUe3bz$xor!R-WjLhp}$mj&6i{c4-dq)BAN zIDOI9_y3Cck#~Z`py3tW4iRAA39QUE=ret+m*gQ8l7Y-qO;1uKMe@$-4_YuQT1gB^LdaWkQm>rPcoD-6?zvwhSrAOf`P0qI`Lc*Kpv+qvYPId47jrV!pIN$pA3OM|J z(oLIF`0VV3MKl0BnA@1|kqp5=Tj1A{p1T&m5Y3WRGx*CVLqh;64!U|Ue;dk2SUUnZ zmn1+HY{36w+R6&rz`(!-k|foYWw~gxX3bpKZLr%>ZtgGB4jGwO#iKA%(W$T+dVx3C z_wtdpw*Uf^03qTulOxpSw<+xJDL290%4 z)7Bv7i;m&ojAACvU|$NLmlD7pKw^6CDXp^EY!_siv}oSExyPtcqw=wpb3&4}AOw&k z=s!Jo89Fi#crF73S{=6VHI9II+jAx{Jpe;&Mc++GjM;3yz_x6-ZQHh=IdkO52T@GJ zhC2s?NQjP%z`0A;@P2JgsO^m)i4VX$3hhlut_5(YxZhKA$mOP-E5FqpmxcK1`g@b*MOx826%-O*Z z*bO+Slg4YdMx#-UA3r`9?Do_k%GQdHpFRcUO{iHeEn`66~vJV1uw92>5grS9dMM zsDqzze54MW?$~8f=BXg?)EU5l144*vy}I>ymXy4AMZ)g8>heK>L?B;o0V5{2#p8h? z*m=*0>mMyVYePdRb$(TOHW*CD2{@kTxY#;~!=ypXBv1mFJryVS*J9?G7&NU}Q)0uF zcKAdUMclo8I}#Miz@%SO=U)UAES^bJO99|G6)Kf19}2+Aj7%Qjar4$K6##qE?uil< zw;5my0?Z!D_THXuXfZ{LJu?>4&)!}J06|P731GcF`tb3i4!nv$lA)YJsffe|NYRNl z_dt-p9!z3ld-@h9n@F{)=j(}4q4&z7Q zdqjTMqv=S0^li`$qdIg!G?8pWmMkm+U|!;iQjj4-hKJd+Ws3^^>=sJB{LJ+A2TGs6 zrS$PD3czW;Y#C{VBI)SV&YdW||I8Y7?{QSt%q~9xxZzijit${d(U7H6r+uJ40Y>^> zPw0!cl#2@xcopr|u(3>EzBBHbHSaUe^CAE}(-psgAxvB5j2Xi_HErg0V$C|ww5e0e z0BD)QMNB=KwfK_F#q|dO!kmfUi3{^6)01go(m1V5Z{|s6b^JLff!XkH;y+`tzqu7v Rabo}g002ovPDHLkV1j)eJ}3YH literal 0 HcmV?d00001 diff --git a/dist/images/freehand-square.png b/dist/images/freehand-square.png new file mode 100644 index 0000000000000000000000000000000000000000..1ca3e578a199eb4c78f3e7223731cf0b2c5d93b4 GIT binary patch literal 1021 zcmV}5TvZf?zcc4dIx|T#)1*zRE!L3YlU2k%2ue^X zD1~aJL~8{xZ7If73@Q`}v`7usOGpg~tv3?2v{GM89tz?^Dn1L=3+ju|JZP&ira3cn z=IpBvbDtBjjoENG`|_{Izvc86YkI^CfH^X1&R z^*67!zaC7IX38WISfdjkKu4fG@(8xgFrWId&-Osw!5b!*Y z!v`O2PL{}vB6)qMQSOD=URwUIz@B^WO2#|aI#u%0-w1t=lVp1K84@cNXv@To4nEnM zmVrj)b)5)+b$BpT%uLpZ+=#&T_O!cc`&JKGA}xPfms%gg1pbG_{C8F#vO zNAoTjdd}5(OJ_=Q-zGtKLZQQ=KwiQVpW$aETY*0SyzAs|7Bar;%C%da$9DFxaYKe* z=dLn3Im4EwYYg69Am+g5KO=!p%j7rWAk)#_y71dK@7LkAHuMdiM9+Q8{%s+>=kb>W zw*zx!j0e!t(lU`uCL=9Y9>y3?=`fOv>&AHR?dRF{zyRK*&^lgxeqD3xaSKQ#RL=L0 zc>qeO{bOTei3oEgQ_bP$4lR3@SQF>qQx7w8ddBHLGSro6YwuFpaBAd@Y|i(`9e`9S zmCxmJ$z`**79kZKZE61gaVl~i3duwJjuX#p=JiukNTre5(7$*0!Y@C3x8q-nEOilB z4zSoLMrj`DJAsI2cLKB=7TsVKKul~ zP$X9+yt1Y$V67z=iV~ojb;X6&5%RqQqgy!!50vZ1IZqv{=0UUIe|$OZyG2=NO7 zzfk;VgOF?>(AqHc<~gqXxk%qj6Z|yi^UCCxz@I!i^?sgBH0w@?Kf@a(C|qFF0!T_ zD=`gDOk)lHT3o7 + + + + + + + + + + + + + + + diff --git a/dist/images/globe_link.png b/dist/images/globe_link.png new file mode 100644 index 0000000000000000000000000000000000000000..84eae639a337da285efd476cc8558f5a5be006df GIT binary patch literal 5630 zcmVU>7&kU{A|{MIj97OjcAarUfrjq7@3ZUZy6>~AuxaE*8W0gwPIbI? z5CocAR6s{jmQWnSbw{_V0SjsF8$sm|=sG&9sx$X{FHdR;tYUB`bTi@~uNpeD-uvbM zeee5TW)ExhxaXdGeth43_o;>tAD#qFA2DJ?7}`h zK#m+ak{mT^6jp0%>q$`0-FM&pSKnI*03Zc}zYHRU5L#MVSO{cWTN^17iAb?nd<0s> z_X+?E`VP=G7C?O`UBr~`pitJO$5g)lk-#ecAQ%OSgu zm~QtM7u)@%mG;2k>-ON_hw%AB^cnw~e{eDS9h<)#Lg)M?IQ$R>{{D5GPyrCLYb_6h z{|P|YB7lIU(P&7mR!i#jmX9p1FH%M z^Z=ov)#@mKfMqnAD3i%dS!@%pIwF_*JZRAIV#b>&W;`Ho5`8W(Eht∾ZEn07|$B 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 literal 0 HcmV?d00001 diff --git a/dist/images/go-down.png b/dist/images/go-down.png new file mode 100644 index 0000000000000000000000000000000000000000..8b91699e2a6cf38b9d4efe97ecea3a07f393d96b GIT binary patch literal 551 zcmV+?0@(eDP)s*H!(>0eTv+t5Vj0os}>t z@n$%03=o6E7|I(K!531M)@YezC z`!U=BfQWF(bup*^&*IRpv6cY?cUSV&Eo$JNN_oDipE>U`pA-M4vGsE=4M4u>%?hvl z;_5l)JLY;Nf50#8E7I(h@_}=%b2#BNnUx<}GV?_>UWXm!Rp=33g&g6j|2`(3XqF?r ziZurAs`Tl=>#6zw;vS0Zi@D%2kFy@rIpQ*c1s`iM|6@(&f2hH{_qDj|zmC-pdgTkx zN9k4Pt|e}qdEb3^>HEl&ocEf+S?|fL|I>n{ziLadhn&C3x7hF9 zowXkI+2GrNoq;WRm%NV|=UXUpTRh{y-J*{VlM0{3ZDzes1GWS=;&sL*cDx%}Fldj= zZT&x}CC-(3*?n>8<;Y1~i=Dy^-=(F(tjTQ&py^}8fjYS_B6smJdN(5u*3sm)2GHwc p&c${)Li)LF1xSgtA4^%9DFY~ag9H9xti}KU002ovPDHLkV1jK=A4UKG literal 0 HcmV?d00001 diff --git a/dist/images/go-up.png b/dist/images/go-up.png new file mode 100644 index 0000000000000000000000000000000000000000..20044881365637e5f5b3d283378d2946a9765efe GIT binary patch literal 559 zcmV+~0?_@5P)UcX&=5cX$dAXDCD zYY*(za-@9o`yM!x5ca+P;V7EdZ>!1_uP`ukJy`m@mGo?!G;opUtM3&o(x8+;i~sKZFJ}CeI002ovPDHLkV1i8P1V#V= literal 0 HcmV?d00001 diff --git a/dist/images/group_elements.png b/dist/images/group_elements.png new file mode 100644 index 0000000000000000000000000000000000000000..5dbd1ce85a76826c918fa9b7eed0d9f7277adc80 GIT binary patch literal 398 zcmV;90df9`P)Iw zsI`h`@@96wFmE;|&tP3(!!3MkF5z8y29J_MxE1cfId=<=nQL%LnwI@K!P^RKyo2yi zi@9AbCN|UM1EKdpOWN z?9*3%z8Dj&e^H4}p#n^gu$rSk@2@>v3wF^ZQlNz^gFoGaB(RDX{1mun@?^|-cBxBX zdXNO>(HwFQuksV3z%*ipEO0MAAPS5^C&>b)2T5QMIEsIyZ|Rb|we9%Y!#Ys}i&!4a sqUK;6HU-0=F&O)`%c)TK|E0Bf*)0gJcfE<>RAirRS z`TrL%=p8=`vh(E@Gl6S$t3G_dfklSRO2iR`hijS#`w*hwafpUsoSbyznKjyi@c501xuv zYf2>zummifb{0dn+oZwTEA5F=hTXR*@x`}IYIQ}N2-rcaBOrV$NebT>0|C5mAWVE~DM5r9P0Vs37P%G@{|YwRH%yWZM6RzOES%gFd3 z&%OMyv!%)B-}cc_$U3O?ow!`$yHDP9@QCS=FDUk}#o$UC@O7ZuJysd$Du$pGm1>bn z#gYxc6cMNgyM2848@~MTW!Bkrcf`i1#9(g`6G+QTt%zDJYV+ePmc@caV2wr#fO@0B zdoMqYF(IwmEP=@~FtifQ(x_uJWL8T$o-dWT`liWecY7-&gb)-dh$_=-(Ct) zKMNKcUwr8WzW@GPhJX0s+H=l6_jG{3{ill_eE7k$_>+3}*=H}m|K9uW0%E|bv>yY6 z>CAFz9RPY!1nEl=ewSzgRiF+u7K2IQdJ!xGq6Gg{qh$B;wN0Ok(%mj~&*vVx7_z)x d{;pkq|3|`%p4cR9ki`H1002ovPDHLkV1i5ehlKzD literal 0 HcmV?d00001 diff --git a/dist/images/import.png b/dist/images/import.png new file mode 100644 index 0000000000000000000000000000000000000000..a2b23f572bfffb7f1429fb42191ac95524175695 GIT binary patch literal 727 zcmV;|0x127P)Nkl&wzqsQ2>Vfdi!mkZQHhO+qP}nwr$%s`rYw4^K7U1o9Ih&VQg$%chMe^ zjEs!-EG;cFp8?w1+W#0D8vehyxQIlWn3%u|0FOlss6=FeQd}koc_o0DUlM4A%R9Z5K$0vcHOFS@{gn>p!7FZq>p~YSy zn(q~$=}sOBM8ra5Q44$uP|~&dCLfswjD}%Q(=!gIr)RjhwvEa@nV>e92F6?2XtU;Lt8{7NHX&njbiwUT<5QnPsv8X&3jZ*EAsOXdSF@RRl zLxx=0@5O;TIzB;i)j&|3iA06z2$Y)&N4d!`6m1JePV=ZQP19$QDhGh{crZ$h1zi+~ z5+ea9*yMi!M1CEZT3AOF?+g&IiUkgv2oUY}MbRN&6dv$Kp#d-CYxO`@t1w{D4FysA z1Q?rL{rnfmxupPmfT#3-7d(}?TnnQj>s7531-oS@a115>JSg? z#je2B>4aRJj>yq&kL>Ms$l7X)O!2N@7?BHv$AHB!9GENZkfp`?E~ZpxQ1wp-;)8q> zxk>;qH{Cou+YzK(k{&*sIIzCGht%3Zz*uMp{MIo*Xg7VWiG?*#_D&kQZcu+kS#NJ!A20v13v7XTIzHqxjKY3Tp}002ov JPDHLkV1k7uPb>fc literal 0 HcmV?d00001 diff --git a/dist/images/italic.png b/dist/images/italic.png new file mode 100644 index 0000000000000000000000000000000000000000..8e6d76e1e7e7e037925639b097063b92106893a4 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM0wlfaz7_+i6i*k&kP61P2OUKZ83?c**ciaQ zRe(EUMQcO^cZQ?4&JiXtyW?@+Io=ySes6ZvY)h`-(%i1xA5u$mqJv#rGNYB+wr!8N zr6;)bt!h$+m5WZU>LQ?;^y!8ppFUXI{hq4zUnq~+<*0^!ofBo>jh?Zk>rnH#q6C$5k zaPCeE2q&MxjvYI$p}{F+AOxoVRa>^=Qd!IpPp<=~)2pzc@9JaeBNzl%F%;=qqC|;g z;D;E7DQ>b@<7O{V2+~;1@cj2baG(KVL6Zql3{IRl@fHo1BDkn7TfBI~YP4-ib<_<{Z_^aZxB+&B&1UI?Ai0EWS_|Ec9$+)yB?&mnc?LhhcA1dfy3A8 zkl}?pFXAE?+`M`79~z8CX2xc~Yc!op)TjmV>^89JwD9!HuaL|`ktLz;^W!TPg*OPP zV!0p)36dvIUNeU5S&rv>RBzQruje>;^79Y;bGXsK6M^r~u6cjHx*b1?!K+uV2%7Xq zrpApMmygDSC6Z)ImM$Iq^myU^rymhAcOsMme7b$qL1nUlg=qBo^XJ28@EYk1kwht# zj3(3Zel@BJo9E7gTj$QhpWlwq`|mUP_7(*9UoUPy$wLfMsvv|M$6K-<5B&|{RHag- z=gE^LtMJe1{IqBO6wBw&-^^J`)dpL-A|T5YKHodxrjj_9`td7Rf=r7%U$<`ES9fmT zrqua_(y!a;)05rZ<%_5KWwDw`{B(KUyw3Oq<7~=aHG@RRHzZBST-B;o6PGSsT6F!y z!@uvR^z}qaA2gxla(0?7DYzJxQIbj;;a?P!aD$S`EM#)X+^=81{!l!wP{}%^->^B} zn>VfixSzp-O^@WSzu`HRX=jZ482%8oDh$XQq)52Af*Os6)U8|Vjmf~tX_ByijXH4S ze6DE!rYcn^fkTndkB{THb_EL-{A#h-8A;~Pz4|2Aba|mJ?!6P;0ji)FXb8Z`bZA=u Y05Nh#%FD;E&;S4c07*qoM6N<$f@O8XV*mgE literal 0 HcmV?d00001 diff --git a/dist/images/linecap_butt.png b/dist/images/linecap_butt.png new file mode 100644 index 0000000000000000000000000000000000000000..eea4ff8c9d815fe1897debad4de0d2dde0a64d67 GIT binary patch literal 1968 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 Ezo>5->Hq)$ literal 0 HcmV?d00001 diff --git a/dist/images/linecap_square.png b/dist/images/linecap_square.png new file mode 100644 index 0000000000000000000000000000000000000000..798af9e6ff71697404b1948f4f58adbb00caef65 GIT binary patch literal 1984 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 literal 0 HcmV?d00001 diff --git a/dist/images/linejoin_miter.png b/dist/images/linejoin_miter.png new file mode 100644 index 0000000000000000000000000000000000000000..96b7cb62e7968d3d35d509d2cdd339a3c00ba86b GIT binary patch literal 2367 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 literal 0 HcmV?d00001 diff --git a/dist/images/logo.png b/dist/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..479125ad846b537590d49430d2dd6393494e7959 GIT binary patch literal 3281 zcmV;?3@-DDP)rbjC9!H+Nt&culhiedRcoTQHd|xR28={pqekNrR8$rb zP*8RR6c7WM8BUz)R%s1@*-NZlj!CyqLyt$)vJgiKOve#zXk0j+V&k0cK4Fw;PaypU^@t2 zdivNxgwKg0CKL6eXHg+UJ$#9FamC^1;D8*rJ-Fl%+VwiZi>Qrw_sdYei&C*C7|-_G~~R$8D2^oY$R%$K{V@G zf!FgV^505?1CBPxOi4oV)oUp9ia@@rFN&50qvXrOxabjuinXb@;2MHm)&sGglbBER zI{lgoCDPwV6fFE5=|uP;@fDoE{5`JM+(21+K5|@lA>Ykkn?xu|mq+0HwJ9iB9E`0B zD||&%&3nTB*YbQ%h7S>yj~Gs9N+kSP@+K-OZ=$BQ4)qNUDE5v*&SyK2@4gR(%YuGN zqGDYt&dgqi)jf2uf+&)nwhj^*v2DTxeAFn0PbQ$)0qqqlajW(U>gyliPJIK)ORgf< z(+|145_!B51@1v87D;&UN~}4KKqnV?5Md#a3q36bY2c&9hK+fV(40y@$spkSFM--U zXlW?Mt=o;Ls;tHZw$sU|RAjpCf_jNa!jF>(#Q9|*xUw=HXWrj{6}$@nCJLmdq5VWA zenhbX{>WIiOd0_fUH~eVGrS+ra0a*=jhjEHQCwP$)Dzh_c03zN;VH=Q^o9EKoyh;f zS4yIoyHnwk{aA0J#B!ob)ZOB$%Y2Cvwi6-YWkO53fFA->GJKs6!)Gx35uj!xTFVze zogRpU#Pdi@%tU-*HsWGVBW2rRWV`Q1!BQXI3n5T1-h(wpGLb+vb*C8I)Q2cpoUq4S z7(Ro5i%vk5hX(%sX@-ww_)To3IY5C9n(|DMbJ82J3B`zu%f^wo41`CY#zEgB2>T`! z;cE`SYs3U;53Cm5xVyBQNU@hFMZhP$Mrh3<;LX zs5|6GWaZ7(@ghR%TZHy}0)F#L24d`l3e=`;g_o`ZGU3n!f*X;rPSO&#COwXN8uZk+GPhpa z+sgK)xzYmW3Jcg+_I{wS?7e-Ce$SP>0!W{!t>m?_48NM;_iN#!*g_kD>$4bIpP@Td z`>X~Sr#Mb{0RjK≫`^85Bbg(CBazS?MhG5Fa3?8Z784oM zqsUC5(lIjZHJHPht8T9SY$#X0-BM+RT|2z-@Zm$Ww6q{HCKjV@?ZwQF6Ej8ubyI=b zRlwaKEqsIqzMO57rw3$dtDVM?B7n8vF&td=reH##v*dStK@{;%qF(eUQYy?QGUzF5 zbDIW+ZLzknDYr7WTEXu<%;YNk<*g~`s?Y@sAWqs#2fcwNe})fW_$+=62Wr*>m!|`n zy8m76qZ(jDafES15FYvw0-OjQnpPS50lW6mDsO5w-PYQ!St&O|fBOL#GRTqbVh;8_ z`16MfKEnStXCAsLZtOVtE99uJDnx7JS>XOD_I?=q{cE6v6F$lC$FaflDpmspZv#m>Kth*lGcbZU{5b*$javzR0|_fM z&%gmwiS+1EWudZ~WNBuF;ZDxDefthNYxyz{7#SFgRe;P$jmTN}cioe`i?;(m1@nj6c|bngn98m^ zv^gSryz{UT*x|JU<>lq*tdnVJ(mn_|7z!cv>ebjx1doMt(aQGuvHq$A|L{&J?$@eu z??x`}mK{T5;(WCE*#SOAfS)dIts?BPC9EaFheTWGNyyyHVyu;gwHN!mos(eC_mUDR zDk?%}9ZycdiPV#lePY-?o;`X%cZegl26<~%;m!p#)a2q`RXXlfCgWap67F0-itFj$ zB7fBzh#hB$?~DoG5aAz0{PLLM{%*~uYb@KRU2d#^sfj}BINXt>_d|yaLw^1_bXA>N zjr}@0cu%DQjT{C2QKPY&&w;l4#k`T#yaH*cRtG`t<%;mhW3WYLh;<}}G94`Gp_em* zXf{2r*bXuVJ!xTPi9R;=cyHz`%$PQl;q4$dHid#WY)@T7sdb)8JB7~5@$iuR@8IA7 z8Z$;pf_Oz1x&9sbJC`GR@_1}B(vvpmCS85(o8W@!cJ}BeQ^3~BwnV8=Dd=&<@QZ|} zpX)miC)pN1!JW-PWJDxlqGJ)uqr#!kLr70Q4Xrfx89p5Dy1Jmzqao+_qXrDXY!exl zlE&Lx3=DC2;w0qn*@L^+u0g2q;zf)Y`4UuIFdHk|bx$IJP+2cITo*6Fqo^(~558<4 zHvcwYB(P3h)o;NFeP=jK`md>GJsj4#>#JM28Bwzb7OlAn{ltk`j{; z6BC21tSkt%G&Ul}#Rc(P>C(VJG<2%;g-e&E|4llUB(CLq97R@U7CKZ`R*rGM8!wIH z{N0Z@x6F+1d1gv7rg%y-cA;`qJMi$5SBG*4&K7>T3L)M9UrK zG#ouhM_ema+Jf&rlN-Z_i$20I$Kgran9)(N^ z#}}NC&!fcut8%XLAI47*_YwCHm4=vNg;jah67a=*V7^RGQkE)9UAEF2{AJttOIw7k z4E2qqiWL+TptJJSd0p&Qgy`rPbXH|$6<(R}sx)?}6jH@Sgj=XA-{O1AsJq0K3AIpK zVz9#tShsc^F0-e*T4Z4V=W!tTAUc%E$?%Fv6KZEwv(0vT?Zmh-<6*|O;li9Vl`HhA zyQEU8Mhg(T-hFVIdwy4)J68awAw!|BV;~K49a872!3UwVF+)QRp{uH@sxV^MNbx^n z73NWQiEl2A(-ZkYy{j&kmcntclkjrKINdn`QC(pbDdOYe(N&**{4cR5L;`E6yTsm{ z%vF*GxcYnb=q%5#JjI?6pi+0~Y?rgyXTjHs%_=?Y%$)uXx@yYXQ^Ca%3Aj;riJylp zct)uaU$o$Zg($mLhWh$?M1)0PK;P%2FWyh zR>A!H(Pw;3Ij=-Bhe+r$f9^_8QzpGk3{7RGLye7$U*v>rG!HzMBe;^%YWVs3qqVga zEOA1MQAB($tTLBae65*DFWE?r5pol`oSqf&LF8j&q4D{|*C$DvlPxFUh5t|UkG@9q zEQ^1&Gho=fd9typ=zTH`o3h#DdN P00000NkvXXu0mjf1@%u5 literal 0 HcmV?d00001 diff --git a/dist/images/logo.svg b/dist/images/logo.svg new file mode 100644 index 00000000..83b8e9cc --- /dev/null +++ b/dist/images/logo.svg @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + Layer 1 + + + + + + + + + + + + Layer 2 + + + diff --git a/dist/images/move_bottom.png b/dist/images/move_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..44ec15f78e661bfce2595b889be90a8ddde39e93 GIT binary patch literal 664 zcmV;J0%!e+P)gPLo5N4Nj%)8g*rWq05I^38wl z8J{!fF;&$o&;s-WO3j)zYgcJ$>3-0nq@;v=5L5ZMxVSjqvaGE-GgEme1nqzaDnFzSdkNo13cUw^sE$;lH<&$pc2Cs#9O~T{wRTZ! zLQIGWvF`%=Q;?fpqZ{DW55dO6gL=@JnQsVes627%2_UZi1O|EFYE7Gb3U(K0RJ|;` zV7iV?O-dxfVMCz4KsaC19&Cgi4|;=e3HPW5jpEQ0pv7_Q7(IN^_AmqFhg}2hfC*fX zRH+B6VAq)0KhIM;vVmFKK^qFXffto$3Vc!w+5imEISf-LxL5hl z4hWEj+}Owset}Yu3|avJ^1v7HL($|Dupt4>^{o^9Qu!vQfQ~r%TlglRTHObufI$j{ z`;i7Nsy@?^Ku~~Mw{CqRDJkhHGwZ53;E+miqfB1CdUZF)aho}gBW>FzIK}67;C|P2 z*{_CQqIZ(086YK6h9UBNFTai=0fll1%6+nrc=59J^1!?|vPBbS$tIC7NK!qxNo8v` z;NdlykwEhEw0QWyV-M{Jp0000ST=J z!-t=+EUUNUIAYtjXb-BB_wYWSuiW19N~zv0TeXpa4@C(UpQ4|-lD~#7g37}(SOrxix;!`srzE}>ht+f8 zLdF?z(h1lCs06`M;FK>bE33yF4~DuiGVt(wuwA0-I;_!k7w8O2MXNmQf?i3S^ewkN zDPf}TECzu&bFj|zO$iR!mE`n8(olIA0R0k#e40~TOKXGu`}e=i%gfuSH;X2J2BxGb zf5@ZoB~U|RsB-1XPYJstxA-I}$_HcPEw0rL^3u&<5v+x(aWXgsC)3SfGY&bB&Y&?N z4omQ(-GnXaKG6>7p2Uy#nvhSV6Y?)fPT$hK!9e)45JIIX(DmnuFz*1m0L^PO0D0cf UV(9$TX#fBK07*qoM6N<$g5iS%Y5)KL literal 0 HcmV?d00001 diff --git a/dist/images/no_color.png b/dist/images/no_color.png new file mode 100644 index 0000000000000000000000000000000000000000..dd7df0a7d0cce8875965aa53759694aea2134fbd GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaT3?y&uT)!Jgu?6^qxLyG=7#MU;JpTrym`Z~D zg8wr--EQCoh>_QIVg&-e1B59X?=4GgS>#kl4aX%c-G7fe7dU8lui*7VvyFM9Mmbig(2D4sYDPV8=`mI9ZpZ(M0J~{>3f=BgOERkH^MMZ;I^TqLfj)sBz z9Z!SyJ83yNZn~;4N;w!RkyPGC6@yu+j|$w^u2IlF=QBG_zB6(!`k<6Kxh6 z%vlp=LNXORwWwnI<(?)(rxLi&Ia%Jv07D|BllSqTahfiso9S+%3`&Pbp`c*+z3fwR zmpZspqKSNu`Ucf7ymic!W03q4jSQ;Di}wR_d8ACVmp>}qY-NB1N%P#~pZJHjHIy?d zzygWC1e6xJP=^`WwVE3?#=7v zx60CAM?k!F-P9pgek&Q()t%e#2NHOwJhNkl$5HgwRxk#$8PB#^+YM%`=4{&w=4iHUg)?fuyt`j*|KpzI1Ru_QwBktg zV>G%k2%rO$(uUKpn&0q+#ARye#Ag7lpp5A}ha3_t^bFGg_D59^=p_!R;yVLzir5l` z*g7UYDKl`f=7CS5E(TN*-!4)-1|i|O`vj+TJ98{TQi(4l?oq>do&#uK-9U)Q!V%v} z;u+$ggclx@R=@PfUh~qEj&VDVVJJhOuq%qtox6MyDDwJ5&&g=ZYcM1=5eN|{^ z!HA)eKF4-#SVIQRiD}}{)z3YqN8k6)?J@5@Eq10SM)zHkm~CL1`vXmfHe|q5w9kvn zjm(uB%BXw((Ez&^YJi3k|J-d_Q9R+LXCxX94aAOOr_k#`GmGN#rbelVo1!yMU>-l4 zZpr-Kd)_@Q=7GPexX_f2IL0)PglKSAV^8n9H=&GvT!42ZSm{s00000NkvXXu0mjfP+0u8 literal 0 HcmV?d00001 diff --git a/dist/images/none.png b/dist/images/none.png new file mode 100644 index 0000000000000000000000000000000000000000..3d81b1cebaee56feabf2cfac226f7bcea76a2771 GIT binary patch literal 120 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 literal 0 HcmV?d00001 diff --git a/dist/images/path.png b/dist/images/path.png new file mode 100644 index 0000000000000000000000000000000000000000..d093f20b441636f6cf6b9e4a433e3535faaab246 GIT binary patch literal 788 zcmV+v1MB>WP)uxBSgQsY$$}tS(`%c-GC13|ZQEvawr$(CqqA)UXZQH~rfSo ziQ~ufy};pccrISNc;xtr<2@Bnz$}@;te7d6uT>r>qs-2`X9xb`#f$zIE?!7pw|yNkmNbdx zvhD)coRn#yDnm#}h?eICbLP%jHDK5PH%}i=0wO?_R8YnqRa`uF(b=qVv&VU|Xy?wI z*MdTV$k5*H}BdU8DbDHhFBzKqQ;zDCmFt&zPMMbSxwJ&!OS@`r?eT+hDj!gtU!jC(JHLD z#KoMHq`oF)`js*1@jCPy($CI0k4n9OzG!RLu6=Uv&Ap`VW4rsLW|$f%vxhA8fAHLg z^B;gcXZp%{E4!92Uw%I=`0(LFv%y0LpGYj5$P8wHYN()TT1qxtS$Acfda7}jNl!J- zB)bH*M>b>hz|lL$jvU*|Jw87E^q5g&_L|M+NGPPA-cmQYeqmVu+pw?nDF*P000&U1^@s6HNQ8u00004b3#c}2nYxW zdBn)Y21NkP2K72M}@sagv7LoQn{3L0Eyv5GhoxA)#_&leqpd}+PVMa z`SZuE5WFsgdj&vutH3^`es~42TOMZVJKulP7;@s(E8hO`Wlx7c)YL`v5*! z|K)FfKt#^$-rcu%a`Lp;vu9VU<9!#o+#(Jg`nI0QWb;~^j{$(KZH6J1hK9ay+W`Pz z=gyCiNDOkvp;v3QcZk+{?9!#{eh>t0Apnp}Ue%R~zPJGaFuAg_>fXKkur1)}(?2mk z|F;A%^*&@t2!1b>x@FrzE?>R@rQ{rdC+|a0tC`WUvFpa#?K`8R*L1C>lk01&;Y=!@ zFNkz{W?R6sXE|iE^AbR6E99k={K3S;?QJ3B<2Rv{{0qSBRtRb}Gn!0Z)!P}_+fiL? ztZzU7jK6sCkH}=QEdjaQB4%cuNB|SfAh}3HK5lhnsnjhfxUe>0}uiTtwl&gp|v)2UAHze^4-}) zBJnsDi!DW?(IwCG@|~TXc>(}ytt=D@ao_j5E0s!DsZ{DR#(b!??$BC$#+aDz`!Wne z9)=+?#sb%M4d=Wng!oq}RZ>c=NGV^%VzHu9swkyg_B^jZM3y#tzO|MEkfl;dYORIi wIGl(W5iu#HUoMveA%ylkPXo|IWH#&d8h`o8*_OOXSO5S307*qoM6N<$f<8>K2mk;8 literal 0 HcmV?d00001 diff --git a/dist/images/polygon.svg b/dist/images/polygon.svg new file mode 100644 index 00000000..e4962213 --- /dev/null +++ b/dist/images/polygon.svg @@ -0,0 +1,76 @@ + + + + This file is released under the MIT license. + + + + + + + + + + + + + + diff --git a/dist/images/rect.png b/dist/images/rect.png new file mode 100644 index 0000000000000000000000000000000000000000..d7e673cfe803cd07bf59ae027f15935340dea025 GIT binary patch literal 379 zcmV->0fhdEP)rcppJ=9JUfFV&sSwSqrm z!i3;@w_2_0s;U4GWbdUf3ecW%L}0t!Vz+z02k>ab%-=26>ow}SW)uw~3Q-zOg-A-* zuX&Qbwn=ewU9o=Hgx8nn1st=oQPZZLp{l8<&xW;$V$`5Ttug=~Q94uUnfu;bi5`U5 zzDa^;BzZg__&GPNKuM&+a7aZxAWA+ajx@+WRE`(=RDuBJpb&->-_EGjVn_7Mmn+>(6qK=Ju+LF0)r88^l^{0k;b Z_ykJo2nG>gT-yKu002ovPDHLkV1j<`qv!wt literal 0 HcmV?d00001 diff --git a/dist/images/redo.png b/dist/images/redo.png new file mode 100644 index 0000000000000000000000000000000000000000..f959305b52e293693abfe9e14920d7666c119b1b GIT binary patch literal 656 zcmV;B0&o3^P)(P@v| z1%cw1iIDdqTrE>`!ye{eu~YwEaK{2>o;T-##u2%#z|p+R{y$1yCc%R1c4}#T=H0M> zMfWXX>KQX0=+H7L0oeK?43^w=fW@~QlvyB=IHLq8A_`x|!jw~HFyowA$K(`1Nj$E# z3*@~Eg5vAGB&eg{MNDVp^#cj8`K>R^ziIIg|9?ij_;uQ!&dIr;^koX{_%K?L|3=bU zd6Vrr^`_#w|EYeT@k9ANca??>o)$PH=5nD!auPh;cO>NVmgm9h0G<;OiM~bUTvj1- z;Qu=k5fE`;HQQUZOZv3+dB`^kuojRBsqGNS5jlAkb5O(^pZI+pR-*qoyO@o^^IC{@ zW9Yn!Lajyw8VN%*b4u8BC9>v@&sUt$8*?AQ1kW2ZgFd25A;u$Z1`zGcJT_E`OgwCO zYd|GCpSVKK!t=(BFd~$QiX1|#ON6NSl0?psU2%z4=a#X38C%(u*m-h<*I>y})~=Ns zBKnO3%|-Z0sa`~rLOP-2Bzp|a%qeB-vy0dan^4ijDo8N$3y=-cvY1Kk5ZNdwRMO-d q-k#0oA*RH5urYL=wZ6$cc>D*`-D{*tha&I*00002(ji~G;6ZQHhO+qN~TZQC7nSlhO3+ep7UbHB1%_c;dhyu15O;QxYBo|h2b zh%uh@XN<#vi%kIdY}}aV$HyVqY}|$$szL}Ua@NX6Da~m^3_OVf=qd;zioz3M`XvxZ zl&x9?{J8@_PT}ulkObue&@~7|G>!Xkazu#yCLu9vGPXPkfMquTonrb9L`1pbd>z~B zd6QJLZOZ|~z8^rD3Puq-h@ZA($xyk&_dLBX;nO_+_(v)b<~}ThnCf5%0NcpesMMl7 zcCyDM83jP9Kw16=oh?kR@M~dNps%rnk@gdekt-D8KYTZp9iW>H`GD65E6DNn0R$-QJ%K& z_2C&xUz(D(#KC#GHQq(4V2IIkAchcXyBas`#(|)LxW1t|!g0d7>!KUH8=Ly!B6R$X$QWeycm-jgKL+9fS{IYHy~wZ>280agiu5 z(DcOKqOFgeD$;7lRhu{A4cvN0vV(|26y0+tOU3mYMR|!1hp&|Bdhn_%R?2C(Z2}?B z3Q2Yl9>&x@s>OFNN6iffBak1rA%;5$AENisY=MUbo36Vi$~8?3NOd3^qT2(H0*SK? z5#%!GKpskIZv5ejq9l+#2e$yxb?(Lug>Yj=Gh_6O4%dO#%XOR_`{fEU;QtLDH<}q^ gSb4^HLiing0MYnLC6?_f+yDRo07*qoM6N<$f{K7E5&!@I literal 0 HcmV?d00001 diff --git a/dist/images/rotate.png b/dist/images/rotate.png new file mode 100644 index 0000000000000000000000000000000000000000..c73420feec32752cb2eb40213ed34dd616129829 GIT binary patch literal 694 zcmV;n0!jUeP)S})=@6XP1}#GnbT>SCip?>j}$afp=P8+rEMmIG%RY818=q! z?T>m+ZaAUbZXzO@A0&bqQAU|&;Rhm&EZk~(Z{WFkiGtGe!2e^|alX;JzGq{4t@ADB zhK6z%aVsNMe|K`VQ!KN@QNCoN`_FbO;jxO}y4=Qp`PA>Gbg@9hN;h3;`D$I$+WN+pwv*LHL`2-x zV=;ZYb`KM=+KxS=Coq^WVFodz>Ek^jA~xzcGMx3Uh_9L0GBBThuRf9b`56%r-_`|W z{1P88KJMOQ`T6wgDfV=$Q>`#&t~gs)ld<&8osKo-+?iylD0}YZWi|1}ZS5V$Qx}r| ze5nbp%MCnSQ`_G8%2Kig$sr>c%qu7=8#(>OLo>MUK4L@}LYR9HBFx<~*1hD1iN_!5 z4si$Rn9b=nN0H&MQ@x+L|H_HemkwS{_@0ZM>pfH=THOP%I< ze|n!RAI+%~F>#fQKz{02k%$;H?wUFR^t1e%iv{9?o;^&T^wBq$z@dHPShC&kd8Ubi_65KcOTtqGo01kMZ;(r#Qix zuCVp5WXJf)+$tJfUK=Q4F!wVk@6qR9SpLq3@pYfBsaw3Hw44yPRY;To5F|{52oWOW c5a2fc1+5ZhcKDT9O#lD@07*qoM6N<$g2Q7{tpET3 literal 0 HcmV?d00001 diff --git a/dist/images/save.png b/dist/images/save.png new file mode 100644 index 0000000000000000000000000000000000000000..bc617ca9e1567a6fa66946660a5c2d868f767a82 GIT binary patch literal 825 zcmV-91IGM`P)h{&PZQHhOxA)x|>#d!nc4yz5>!%v&V3w+{Zcxqq~_(g`h}wHE=U^VaDdi+V|2 zo1O*lK|i?%UPcLU)7a(Xd5O)in&pFszh!=1W}qA+te-Lp+dQfhuyv60hO_3e#9S|_ z8`R^w;DS{W9945(;;iqU|0Tc^Gvi_ncaQRi7EawJ?yv6SnUU+Gb0;KDvuDj?ww{DE z0_tHvwG5K5d6aXQ)w8|4`=PsUaRWptHaXL zl7d)(XJIXPu8@lmCO~#^%GTZrrl+S#;?&fXC^_JobB+jj8QqTOVov|NeiCIK2vK4I zltaUV31D(+Qmh=s0=$S6$oU}+ZxROv2ME9~z#9Q~Sb%(5Y^b& zi26N1YisKkUi<}NC$=cS?YlSc;KARN%ya*)|M7hV84A|BQd;^t00000NkvXXu0mjf DmPvx^ literal 0 HcmV?d00001 diff --git a/dist/images/select.png b/dist/images/select.png new file mode 100644 index 0000000000000000000000000000000000000000..b81c8547105d35da0328ee106915bfdc2cb9bd79 GIT binary patch literal 389 zcmV;00eb$4P)sPYL5dBP|G_z^IFa4w&ya&Ga zbl}I4I!gmyH^MZ_o*-;`YB!@xzSqMTHSPOlgkCI{sSGg6lN-%j#}x#jlBgS68iD$~ zc2`AM*tb6`Ial#w0}v>+BO-#Sz0VPjQ@80$Um)}Q0dJQxbh4B@JJwmQe;Zb>gPOLE jn8>@Vrrv1sAf(3!Ph9W(|6qMJ00000NkvXXu0mjfmT{(% literal 0 HcmV?d00001 diff --git a/dist/images/select_node.png b/dist/images/select_node.png new file mode 100644 index 0000000000000000000000000000000000000000..9705e9a458a25624b65682227022d6fe84a34704 GIT binary patch literal 731 zcmV<10wn#3P)>9L&%uiTtNA^@gLpNkK5{^Wm)9EmG(IVV?E+M`hZqq}YTAJLEAn&QkIn50bK(E)+NrtuSw&3A& z(F?$#WlZ%nj$;UNgd_)pVHgYs4#>%5@7}$N*Xz9iz^n?8ujz9U!&+lH0U}1DkpsAL zU?)zTkO*=TfI&4NUm*&U$y5N~GMmjffBw8E2*O?fI?VuXSQNnJa5!-L_H9v;qzzgD zL5syw3cwW|9gSzto^i-L)qo&{)oLvhz?GPohz}n=h(4chqFO+}X0w$G;L6O*#P{#t zMap()wE+PNyWL)6_3MKsO9s%Zx&S{lw3Im?*MI;11^j-$Oy!aJ zxo|ifBFLrc0(?%VGsm=P)25g(VS+CovSGsp9~th}G)446pUdTf$K%1@zkg*v1)m-c zaJ$|3{rk5BprIx}c6K(teEA|#6Ni!E>45_W7Lri*Su8!ajF2+124snB5U!oEc=T7_-fXy2}Mx^08!Njkm5_G|LfPUyIs3> z#s7iwM@~-8zn3pxegOs@DD|)rX93~NSA6Blm0zGp2O7KsC}xaHEdZkU6zs*ooRt6o N002ovPDHLkV1m>`Pj~&jB38K2k*?8+;@#hR<_oxQ8sq%+VyVd z&Yikr$Bsv;ifXWa{rdB(R;|+I%a=c@51`lFxpTqHLs6yu`}c3s%9Sf^9aeAq_U$)C zWJKeZo$C!6yBG>U7tCu4{Y7UtadbDfgS%`vT2>Z(M`r=b4(gV(2s!pR4R2NilR}>eDlPK6QdIW5Pn|lY6DCa1YJX#g4juH!kt5ooMGLJTN58dc(J%=P)5l?Sh;d#g^U5Dlvj7}-d!mW&5N8tr*>ijh}Ew!n!6~LE?o*C#2KVOYz8|n{^VR? zr*@zO)I0$%KNGq)3_3E-0Eio&*|!h}R*uA>O_T8J$9G6F!E6FR0ceqlJ)36(m8GDpj8DncNI( zCwGA`PCB6d6Jf)QuGluAD*S%`O;bTKs5XjBnluUh`t`@1XFp9V&{;|S4{n^piWMu+ zp+koX=72Z}OO+~hrC70IRIp&db2gufZnyi8!{J~6r)}QB%=kA-008GiYm;u6R%!qM N002ovPDHLkV1gES3TFTS literal 0 HcmV?d00001 diff --git a/dist/images/source.png b/dist/images/source.png new file mode 100644 index 0000000000000000000000000000000000000000..39471617ff4ba9556ee5435d2401d9ef64ccde2f GIT binary patch literal 893 zcmV-@1A_dCP)V(sgL`_wy{!hAVaj~iyu4}> z&h(x*lf&?2y;9L06|#wu!AGj~i{M}?Y-bdK5MaX!L(GZd-qnR|}#S z&LVjF`li10F_^dy)Bsqd0k*@rW1yacFPoak>@D}pQ`{hGfspUfvnkyJ4&2^T?)gq<2-1bny#ZWbb`@Jox9?VJ7t&a?&C z66e$zgKvwVYy%V+s%}FYbU{!>6HdwWaGeF6&O3>kXOUMkkH9GhaHpS=hL?pW?F~%_ z_sMivCgBT8qjoSJHdjHEx&}7YNWdgP(2T!uPI?@B;wsE>Cs@Ax&RT##nM4X4a>AXB z0$lLP709lF{Gf?^CVVY-T_XR#9q-JaFh(E16jSq);A5FeH$$-tereVhg;(uFrsJB( zll}rWWiO6oMV9GUmHwF0pQr^`DU zZ`T5hQ(&tD?)`W1z!0OCap07U0mm8abC!ONYjo2IMg%zjbHHI#$bIy+=P)`n0cUE( z4r$x=ZaR;=On=w7|0kji_BPYoa+I!P^5o7h$#jIjmsqt8TJckE0a~75BSk#`ip^{J T`^?ox00000NkvXXu0mjf%GIOO literal 0 HcmV?d00001 diff --git a/dist/images/spinbtn_updn_big.png b/dist/images/spinbtn_updn_big.png new file mode 100644 index 0000000000000000000000000000000000000000..f6a4481e68b25106a50beb859787a60b29ee104a GIT binary patch literal 1240 zcmV;}1Sk86P)~`Xx000D^NklBb-$k17~GLvtmV17T}i0cVbOITlk!p$>*m(N%xU^DsoPg}lb)CR^&yGZ6JK ze1dL@F~`8xxYWZ#Y-?Nw&zX)!$40l3ds^Tj7*=B&c}NqSh_CS$Cdpfd;dy+Co6sJv zX^O7sgm$2?=d?m6^guKHThbgOF&aZ-99eIS!34CFhn#>06k|tu%M|3I4!5D5*Z;O` z7>dwS?rD$rVVI2x@SL5o2!@B`p0i+U9F3TBD-6r9zy3V490Ph5EfI6NAOnVc41+Um z@g)ou7^eiXDVD(SFj_!saybmEaI}(;t6^*G>lna17@kp*(jA||P=;Cf2!>h=QWCQn zX2VbeTVqe9AXmT~9zs*4AZ_ruqYH;Bh1mpQ9H@dFy3yYPR*&lMnOLWD> zSLo%JgX-OzLNbjQ;ge*TuY2$HD?k4^$Q3W{a&orS*I!3ivU*9TAwzt6>#YiHyKS8$ z)9~RTef3p@{W}KwORfhqGCEW2Tb+M?rKD9@qWkWvR!vQzo_*G*u3dwYOndC%XNfCV z;_>k{LvHS!dhx}O+O%0D$#mqAmE16kK}=U^>F4YjziXLVwp^k+?g+4t&(obPV{7k> zjNN#z)8xs1Nv3h*0{Za7xfD7K;`pY_wwfjV_4u%1bM?UobNKCO&wE6H{*3rrope$_ z(h9X}H(w7t5Kvj!{Tyon3ChmCh9-%qZQG@iR%!3O>)6vu8fbjN*Dk!*szoyliIWwS9qvq;@3%;ZHc@O~c;>6nTtIs}rf>}Ml^YKf8XIP>>&|l%2 z&g{)yyg#mwKYl>(yz?aYy2!myZf-|?_gy#r@IyDgcVmWap=cOT3;o=#SzI9y1wpWJ zcSw(bxS`Q-#gn2x?z-Ejp7(0qeQRd1Xz%9RY&sm)xqa4YxF2B8V9#LBV9#LBV9(%i zI2_SNo^(mU^$f0Oa6QAja6NA>^O21 z8a1rfRjgLEFNH=u%oj|`d!ZpyG&1QV(`Yg=NHnT*k4WC`5$R~66YNBjGT0+Zf)HI= zhiDR2dqk->X)gA^~2}uWSKqq$-HClUua_0000s|JDd@WR|jg$RP8i3?$zOPHh5G(g8jpu0T2~E2{t-c)Ql)08pB< zB*-tALBb*7|A7S!1~1Nu3jzf#JzX3_Dj1U&7$t-pVq44(_Tj)jUK4`=aR!Dbyhmei20l3rG=#y^)z4*}Q$iB}#OXIe literal 0 HcmV?d00001 diff --git a/dist/images/svg_edit_icons.svg b/dist/images/svg_edit_icons.svg new file mode 100644 index 00000000..98aa7b8a --- /dev/null +++ b/dist/images/svg_edit_icons.svg @@ -0,0 +1,1035 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + A + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + s + v + g + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + T + T + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dist/images/svg_edit_icons.svgz b/dist/images/svg_edit_icons.svgz new file mode 100644 index 0000000000000000000000000000000000000000..cb8c80cc59589b7ef1230e766cdb6b72681b5289 GIT binary patch literal 5493 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 literal 0 HcmV?d00001 diff --git a/dist/images/text.png b/dist/images/text.png new file mode 100644 index 0000000000000000000000000000000000000000..11ba7df7118e7126a310ff8a2c569744b4e54e44 GIT binary patch literal 600 zcmV-e0;m0nP)+NC|Rt?!75Cal};wPpM5ycc%7D@z7V?a$}W8p8bRcsWj1TAAL z2q`SIu+YkAM%KyV3KQ4eot>FC*Lib22LKS>4!OuhE^?7$E^h$<0RZUieQ;(6WXXq% z*&}`fpa1|D&s=$-`oXS|k*>M@Hh&911c37T^Zk8Ek|cLLP`aW6Km@>6cnM!_L-C88cvHLfQYXC$5IyWBg?@E&KBISQ1OSSdWP6I>$&unj< zvTtdko%nb^B}uDZdlMi6bgn%+_|sCdH)}u1UmWD6BpLL>I{*=IU$}HG{vla7h`#i@ z(Z7vsX7tGzeozD`mS^WK8|2tDb zs}KOJ0NLJR{iI(yc>SULmm|T6$w~l#!D726sLScqd^Hl^KRdV$rc-aJ)oQg`?ex4{ zgSwM1>qd`lKG-@$tEqgW(P%UpjY<4z0ZLW&N)bNVxlqN%%3Skf{#>QfRjG8uEI&7> zK-KJYoV!zuWZ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + diff --git a/dist/images/to_path.png b/dist/images/to_path.png new file mode 100644 index 0000000000000000000000000000000000000000..4e0e3c05ec5393b67a929e7444f9f2704b7c7ee4 GIT binary patch literal 938 zcmV;b16BNqP);nVg#L{*u1;M)5yO zYuR6fjkKl@Fi|;6p!v z-RVYK)<=LF80mb?Nx-<0aKq&yyiW}Hz))aka3!FmM6*7RP(cF#RGbxUbAH9=12)}s zasr?LNfJNFY>e~GZJsQ=poM|&rnBBxAfon96224B>nHgpZ{8f0J^;HuNY>u?$+FB;?Y3g6aFamgk0lO~T_s(fhH2{Vx3%Kyh%f8R7@>)}0nbfYg z$GDFhH(a>s?q7fM%t!Ll=QqRj=U`m%x|U{I%awfr08c*r@TI_EZ61Go|KYI3eCTeU z6g#}Q$4vu8c|lOu3$}g~#sE1RVAb~p=t_Hx)`6QoC~D!18M^`82V*S&>#edqSx&iO z-gQIw56`2hnL)7O?l8}VoCR(zOO`Wuv+oDM@*7k}k-s!aDo%hQKwz)A9S+R%o0|b} zi=oA@`<^^kcHl_#Lii!~Pivkzahw2HzzWi$6qPC-)^)+j$B#VlJZ|Ruqc5)fWEaaH zD0{zb{tNZarSROUZ~�+#$kq7(fBDL2W4Jll(=mp0BWRz zD+M^fIzTnNz4+Rl&*zIlP6mJu88I=IUAd8hgn$~@QT)AduPA4z` zmST}wdu{RO%ps;p3=b%+9ul*)Gp7HDaJy&9H8U$q3J?Dr*Z~9p0OUMfBja+|rT_o{ M07*qoM6N<$f?H9$;{X5v literal 0 HcmV?d00001 diff --git a/dist/images/undo.png b/dist/images/undo.png new file mode 100644 index 0000000000000000000000000000000000000000..8187a691bea1dc8ca9f8b7fd603cbfdd63badca6 GIT binary patch literal 837 zcmV-L1G@Z)P)w(Go-ufH_{6QJ>@Tgmq~N(OQbYXE6n>QWdrN%_w1mxW*zQns{7VZcx%yT zT=*#efWN^i(p~yC=`R0-l*Q-_!1`Dyd2!}P(aP}Oq41WXk4anc7Z^OEt>kOcnD-vZ z3>K2g)Tc>P-bZEtG1~1B?a>V^m3P z&S%8?z8dMT`A(fP+YX-fHT5sYy~+F`mY0;j^)Xc%tVlH(tW1A-(DRNQ_aLZ)nF}yP z0BF;TYTu0d7BQpHe)r{@8*-i=$d6I$_q-|1>kFHHHfT3nV$$PpJNg1yZ90K9Fl} z%6p+J(chrc?HW^w`}orp426qhh#XJ=ibx445AnFCn%!LVc1wtjc$?!THVVch05eqy z4=)RYCzr!ORiF;EfgaEY2Dc8&ZVRw#R%-f3dnm~5Se}RKE{#7}=EGoFs02mt?@n7_{ zQV37*mWjQ3M3A_9J@pfe8v$LQ24rS)nOLp_7t7N$rTpRhtjWHu67QYaE%w8eL-fv* zJ9xWcP7BM`@V?06{i7!<;Bo%^gAuM-O-ujvr?|{3FSAlFzCg>q_&lv}br1gq>vQza zN48S0Zv2BXz)L8HWPlWgGk8eejE^fW6yhcpi6L<$hU3h`!ICLhKRp2eY`nfsXt(23 P00000NkvXXu0mjf6=RsN literal 0 HcmV?d00001 diff --git a/dist/images/unlink_use.png b/dist/images/unlink_use.png new file mode 100644 index 0000000000000000000000000000000000000000..69f27c8ba2619f45cadfc1c760809841f97833bb GIT binary patch literal 3895 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 literal 0 HcmV?d00001 diff --git a/dist/images/width.png b/dist/images/width.png new file mode 100644 index 0000000000000000000000000000000000000000..0615d5d035904a6dd16886eeaf0ef604e6bb1321 GIT binary patch literal 278 zcmeAS@N?(olHy`uVBq!ia0vp^DImL`=7*mmXpiu zk7+w@dfBDu;W*`pfXeJ?5=|+Wg`6kkL?v-d^7ZC%+?3g==wZfc_-22vMD6Tr5{vH0 zJ5Tw$wK>P%#7%IqeV4@Fz#~5@r>wsspd83zDQlR-n%OC+?cv=M;TV;4gzJ)!a@d4v z5*wRT+`4NmPRtAXoiM@n>9>Un)p{HGS#B23w5>mx4|gb#alk%A`rDq6?YZ3`QBPMt Jmvv4FO#r5aWo-Ze literal 0 HcmV?d00001 diff --git a/dist/images/wireframe.png b/dist/images/wireframe.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac3c85b3b913e6fb320555749cae4f45c445d35 GIT binary patch literal 268 zcmV+n0rUQeP)PlU5;Sgo#RHUi3sjSrZNaiwa11UX5W6hibfhlo^ixf{d}i zF9cD14Gu1XP;`dP2+{>hL?0>>LtS`|vBrRN+Js9i7G5J`Ot4rey#C>US+%h(+OvK!m)s@><~E}al!DitqW5BN&bIsdNbjr@F8Pl~?23uNx5-HCmo2S6 z(^vbf@cm&2%skJQv2youkI_=9L*Fe}H1Ch)E0+#U#D4$m z`BR@?YC0dG&#huGnoF@%=GV&Y+pkf0-eafa8Pd|$xU8+C`7W%W2eF%58&;H-7e@ls@PlwvOvI{`w50#x5ut!a z=mF<}AON87Z`-JCn|G;u^9HruH%aXz-+JGm%>W`^-4?yV9iH%pFZ@9Q8PqVq2>tY4 z&a6vfOH%1%cN%Xkhc9r8XMEsyDW;poTnHgDJ$qn>g?LlMv-!+$8gCpMHcTU4_@`$V zY%n86yes0EhL76{DdbQ=4b_wqa{R(dyg+owb$kN69vjvsCdOa@0000e.length)&&(t=e.length);for(var n=0,r=new Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=e[Symbol.iterator]()},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}function y(e){var t=e.changedTouches,n=t[0],r="";switch(e.type){case"touchstart":r="mousedown";break;case"touchmove":r="mousemove";break;case"touchend":r="mouseup";break;default:return}var a=n.screenX,i=n.screenY,o=n.clientX,s=n.clientY,l=new MouseEvent(r,{bubbles:!0,cancelable:!0,view:window,detail:1,screenX:a,screenY:i,clientX:o,clientY:s,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null});t.length<2&&(n.target.dispatchEvent(l),e.preventDefault())}document.addEventListener("touchstart",y,!0),document.addEventListener("touchmove",y,!0),document.addEventListener("touchend",y,!0),document.addEventListener("touchcancel",y,!0); -/** - * Namespaces or tools therefor. - * @module namespaces - * @license MIT -*/ -var _={HTML:"http://www.w3.org/1999/xhtml",MATH:"http://www.w3.org/1998/Math/MathML",SE:"http://svg-edit.googlecode.com",SVG:"http://www.w3.org/2000/svg",XLINK:"http://www.w3.org/1999/xlink",XML:"http://www.w3.org/XML/1998/namespace",XMLNS:"http://www.w3.org/2000/xmlns/"},b=function(){var e={};return Object.entries(_).forEach((function(t){var n=f(t,2),r=n[0],a=n[1];e[a]=r.toLowerCase()})),e};!function(){if(!("SVGPathSeg"in window)){var e=function(){function e(t,n,a){r(this,e),this.pathSegType=t,this.pathSegTypeAsLetter=n,this._owningPathSegList=a}return i(e,[{key:"_segmentChanged",value:function(){this._owningPathSegList&&this._owningPathSegList.segmentChanged(this)}}]),e}();e.prototype.classname="SVGPathSeg",e.PATHSEG_UNKNOWN=0,e.PATHSEG_CLOSEPATH=1,e.PATHSEG_MOVETO_ABS=2,e.PATHSEG_MOVETO_REL=3,e.PATHSEG_LINETO_ABS=4,e.PATHSEG_LINETO_REL=5,e.PATHSEG_CURVETO_CUBIC_ABS=6,e.PATHSEG_CURVETO_CUBIC_REL=7,e.PATHSEG_CURVETO_QUADRATIC_ABS=8,e.PATHSEG_CURVETO_QUADRATIC_REL=9,e.PATHSEG_ARC_ABS=10,e.PATHSEG_ARC_REL=11,e.PATHSEG_LINETO_HORIZONTAL_ABS=12,e.PATHSEG_LINETO_HORIZONTAL_REL=13,e.PATHSEG_LINETO_VERTICAL_ABS=14,e.PATHSEG_LINETO_VERTICAL_REL=15,e.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS=16,e.PATHSEG_CURVETO_CUBIC_SMOOTH_REL=17,e.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS=18,e.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL=19;var t=function(t){s(a,t);var n=d(a);function a(t){return r(this,a),n.call(this,e.PATHSEG_CLOSEPATH,"z",t)}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegClosePath]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter}},{key:"clone",value:function(){return new a(void 0)}}]),a}(e),n=function(t){s(a,t);var n=d(a);function a(t,i,o){var s;return r(this,a),(s=n.call(this,e.PATHSEG_MOVETO_ABS,"M",t))._x=i,s._y=o,s}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegMovetoAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y)}}]),a}(e);Object.defineProperties(n.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0}});var a=function(t){s(a,t);var n=d(a);function a(t,i,o){var s;return r(this,a),(s=n.call(this,e.PATHSEG_MOVETO_REL,"m",t))._x=i,s._y=o,s}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegMovetoRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y)}}]),a}(e);Object.defineProperties(a.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0}});var o=function(t){s(a,t);var n=d(a);function a(t,i,o){var s;return r(this,a),(s=n.call(this,e.PATHSEG_LINETO_ABS,"L",t))._x=i,s._y=o,s}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegLinetoAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y)}}]),a}(e);Object.defineProperties(o.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0}});var l=function(t){s(a,t);var n=d(a);function a(t,i,o){var s;return r(this,a),(s=n.call(this,e.PATHSEG_LINETO_REL,"l",t))._x=i,s._y=o,s}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegLinetoRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y)}}]),a}(e);Object.defineProperties(l.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0}});var c=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l,c,u){var d;return r(this,a),(d=n.call(this,e.PATHSEG_CURVETO_CUBIC_ABS,"C",t))._x=i,d._y=o,d._x1=s,d._y1=l,d._x2=c,d._y2=u,d}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoCubicAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._x1,this._y1,this._x2,this._y2)}}]),a}(e);Object.defineProperties(c.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},x1:{get:function(){return this._x1},set:function(e){this._x1=e,this._segmentChanged()},enumerable:!0},y1:{get:function(){return this._y1},set:function(e){this._y1=e,this._segmentChanged()},enumerable:!0},x2:{get:function(){return this._x2},set:function(e){this._x2=e,this._segmentChanged()},enumerable:!0},y2:{get:function(){return this._y2},set:function(e){this._y2=e,this._segmentChanged()},enumerable:!0}});var u=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l,c,u){var d;return r(this,a),(d=n.call(this,e.PATHSEG_CURVETO_CUBIC_REL,"c",t))._x=i,d._y=o,d._x1=s,d._y1=l,d._x2=c,d._y2=u,d}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoCubicRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._x1,this._y1,this._x2,this._y2)}}]),a}(e);Object.defineProperties(u.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},x1:{get:function(){return this._x1},set:function(e){this._x1=e,this._segmentChanged()},enumerable:!0},y1:{get:function(){return this._y1},set:function(e){this._y1=e,this._segmentChanged()},enumerable:!0},x2:{get:function(){return this._x2},set:function(e){this._x2=e,this._segmentChanged()},enumerable:!0},y2:{get:function(){return this._y2},set:function(e){this._y2=e,this._segmentChanged()},enumerable:!0}});var h=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l){var c;return r(this,a),(c=n.call(this,e.PATHSEG_CURVETO_QUADRATIC_ABS,"Q",t))._x=i,c._y=o,c._x1=s,c._y1=l,c}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoQuadraticAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._x1,this._y1)}}]),a}(e);Object.defineProperties(h.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},x1:{get:function(){return this._x1},set:function(e){this._x1=e,this._segmentChanged()},enumerable:!0},y1:{get:function(){return this._y1},set:function(e){this._y1=e,this._segmentChanged()},enumerable:!0}});var f=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l){var c;return r(this,a),(c=n.call(this,e.PATHSEG_CURVETO_QUADRATIC_REL,"q",t))._x=i,c._y=o,c._x1=s,c._y1=l,c}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoQuadraticRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x1+" "+this._y1+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._x1,this._y1)}}]),a}(e);Object.defineProperties(f.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},x1:{get:function(){return this._x1},set:function(e){this._x1=e,this._segmentChanged()},enumerable:!0},y1:{get:function(){return this._y1},set:function(e){this._y1=e,this._segmentChanged()},enumerable:!0}});var p=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l,c,u,d){var h;return r(this,a),(h=n.call(this,e.PATHSEG_ARC_ABS,"A",t))._x=i,h._y=o,h._r1=s,h._r2=l,h._angle=c,h._largeArcFlag=u,h._sweepFlag=d,h}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegArcAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._r1+" "+this._r2+" "+this._angle+" "+(this._largeArcFlag?"1":"0")+" "+(this._sweepFlag?"1":"0")+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._r1,this._r2,this._angle,this._largeArcFlag,this._sweepFlag)}}]),a}(e);Object.defineProperties(p.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},r1:{get:function(){return this._r1},set:function(e){this._r1=e,this._segmentChanged()},enumerable:!0},r2:{get:function(){return this._r2},set:function(e){this._r2=e,this._segmentChanged()},enumerable:!0},angle:{get:function(){return this._angle},set:function(e){this._angle=e,this._segmentChanged()},enumerable:!0},largeArcFlag:{get:function(){return this._largeArcFlag},set:function(e){this._largeArcFlag=e,this._segmentChanged()},enumerable:!0},sweepFlag:{get:function(){return this._sweepFlag},set:function(e){this._sweepFlag=e,this._segmentChanged()},enumerable:!0}});var g=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l,c,u,d){var h;return r(this,a),(h=n.call(this,e.PATHSEG_ARC_REL,"a",t))._x=i,h._y=o,h._r1=s,h._r2=l,h._angle=c,h._largeArcFlag=u,h._sweepFlag=d,h}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegArcRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._r1+" "+this._r2+" "+this._angle+" "+(this._largeArcFlag?"1":"0")+" "+(this._sweepFlag?"1":"0")+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._r1,this._r2,this._angle,this._largeArcFlag,this._sweepFlag)}}]),a}(e);Object.defineProperties(g.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},r1:{get:function(){return this._r1},set:function(e){this._r1=e,this._segmentChanged()},enumerable:!0},r2:{get:function(){return this._r2},set:function(e){this._r2=e,this._segmentChanged()},enumerable:!0},angle:{get:function(){return this._angle},set:function(e){this._angle=e,this._segmentChanged()},enumerable:!0},largeArcFlag:{get:function(){return this._largeArcFlag},set:function(e){this._largeArcFlag=e,this._segmentChanged()},enumerable:!0},sweepFlag:{get:function(){return this._sweepFlag},set:function(e){this._sweepFlag=e,this._segmentChanged()},enumerable:!0}});var m=function(t){s(a,t);var n=d(a);function a(t,i){var o;return r(this,a),(o=n.call(this,e.PATHSEG_LINETO_HORIZONTAL_ABS,"H",t))._x=i,o}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegLinetoHorizontalAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x}},{key:"clone",value:function(){return new a(void 0,this._x)}}]),a}(e);Object.defineProperty(m.prototype,"x",{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0});var v=function(t){s(a,t);var n=d(a);function a(t,i){var o;return r(this,a),(o=n.call(this,e.PATHSEG_LINETO_HORIZONTAL_REL,"h",t))._x=i,o}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegLinetoHorizontalRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x}},{key:"clone",value:function(){return new a(void 0,this._x)}}]),a}(e);Object.defineProperty(v.prototype,"x",{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0});var y=function(t){s(a,t);var n=d(a);function a(t,i){var o;return r(this,a),(o=n.call(this,e.PATHSEG_LINETO_VERTICAL_ABS,"V",t))._y=i,o}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegLinetoVerticalAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._y)}}]),a}(e);Object.defineProperty(y.prototype,"y",{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0});var _=function(t){s(a,t);var n=d(a);function a(t,i){var o;return r(this,a),(o=n.call(this,e.PATHSEG_LINETO_VERTICAL_REL,"v",t))._y=i,o}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegLinetoVerticalRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._y)}}]),a}(e);Object.defineProperty(_.prototype,"y",{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0});var b=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l){var c;return r(this,a),(c=n.call(this,e.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS,"S",t))._x=i,c._y=o,c._x2=s,c._y2=l,c}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoCubicSmoothAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._x2,this._y2)}}]),a}(e);Object.defineProperties(b.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},x2:{get:function(){return this._x2},set:function(e){this._x2=e,this._segmentChanged()},enumerable:!0},y2:{get:function(){return this._y2},set:function(e){this._y2=e,this._segmentChanged()},enumerable:!0}});var x=function(t){s(a,t);var n=d(a);function a(t,i,o,s,l){var c;return r(this,a),(c=n.call(this,e.PATHSEG_CURVETO_CUBIC_SMOOTH_REL,"s",t))._x=i,c._y=o,c._x2=s,c._y2=l,c}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoCubicSmoothRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x2+" "+this._y2+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y,this._x2,this._y2)}}]),a}(e);Object.defineProperties(x.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0},x2:{get:function(){return this._x2},set:function(e){this._x2=e,this._segmentChanged()},enumerable:!0},y2:{get:function(){return this._y2},set:function(e){this._y2=e,this._segmentChanged()},enumerable:!0}});var w=function(t){s(a,t);var n=d(a);function a(t,i,o){var s;return r(this,a),(s=n.call(this,e.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS,"T",t))._x=i,s._y=o,s}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoQuadraticSmoothAbs]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y)}}]),a}(e);Object.defineProperties(w.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0}});var S=function(t){s(a,t);var n=d(a);function a(t,i,o){var s;return r(this,a),(s=n.call(this,e.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL,"t",t))._x=i,s._y=o,s}return i(a,[{key:"toString",value:function(){return"[object SVGPathSegCurvetoQuadraticSmoothRel]"}},{key:"_asPathString",value:function(){return this.pathSegTypeAsLetter+" "+this._x+" "+this._y}},{key:"clone",value:function(){return new a(void 0,this._x,this._y)}}]),a}(e);Object.defineProperties(S.prototype,{x:{get:function(){return this._x},set:function(e){this._x=e,this._segmentChanged()},enumerable:!0},y:{get:function(){return this._y},set:function(e){this._y=e,this._segmentChanged()},enumerable:!0}}),SVGPathElement.prototype.createSVGPathSegClosePath=function(){return new t(void 0)},SVGPathElement.prototype.createSVGPathSegMovetoAbs=function(e,t){return new n(void 0,e,t)},SVGPathElement.prototype.createSVGPathSegMovetoRel=function(e,t){return new a(void 0,e,t)},SVGPathElement.prototype.createSVGPathSegLinetoAbs=function(e,t){return new o(void 0,e,t)},SVGPathElement.prototype.createSVGPathSegLinetoRel=function(e,t){return new l(void 0,e,t)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicAbs=function(e,t,n,r,a,i){return new c(void 0,e,t,n,r,a,i)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicRel=function(e,t,n,r,a,i){return new u(void 0,e,t,n,r,a,i)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticAbs=function(e,t,n,r){return new h(void 0,e,t,n,r)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticRel=function(e,t,n,r){return new f(void 0,e,t,n,r)},SVGPathElement.prototype.createSVGPathSegArcAbs=function(e,t,n,r,a,i,o){return new p(void 0,e,t,n,r,a,i,o)},SVGPathElement.prototype.createSVGPathSegArcRel=function(e,t,n,r,a,i,o){return new g(void 0,e,t,n,r,a,i,o)},SVGPathElement.prototype.createSVGPathSegLinetoHorizontalAbs=function(e){return new m(void 0,e)},SVGPathElement.prototype.createSVGPathSegLinetoHorizontalRel=function(e){return new v(void 0,e)},SVGPathElement.prototype.createSVGPathSegLinetoVerticalAbs=function(e){return new y(void 0,e)},SVGPathElement.prototype.createSVGPathSegLinetoVerticalRel=function(e){return new _(void 0,e)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothAbs=function(e,t,n,r){return new b(void 0,e,t,n,r)},SVGPathElement.prototype.createSVGPathSegCurvetoCubicSmoothRel=function(e,t,n,r){return new x(void 0,e,t,n,r)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothAbs=function(e,t){return new w(void 0,e,t)},SVGPathElement.prototype.createSVGPathSegCurvetoQuadraticSmoothRel=function(e,t){return new S(void 0,e,t)},"getPathSegAtLength"in SVGPathElement.prototype||(SVGPathElement.prototype.getPathSegAtLength=function(e){if(void 0===e||!isFinite(e))throw new Error("Invalid arguments.");var t=document.createElementNS("http://www.w3.org/2000/svg","path");t.setAttribute("d",this.getAttribute("d"));var n=t.pathSegList.numberOfItems-1;if(n<=0)return 0;do{if(t.pathSegList.removeItem(n),e>t.getTotalLength())break;n--}while(n>0);return n}),window.SVGPathSeg=e,window.SVGPathSegClosePath=t,window.SVGPathSegMovetoAbs=n,window.SVGPathSegMovetoRel=a,window.SVGPathSegLinetoAbs=o,window.SVGPathSegLinetoRel=l,window.SVGPathSegCurvetoCubicAbs=c,window.SVGPathSegCurvetoCubicRel=u,window.SVGPathSegCurvetoQuadraticAbs=h,window.SVGPathSegCurvetoQuadraticRel=f,window.SVGPathSegArcAbs=p,window.SVGPathSegArcRel=g,window.SVGPathSegLinetoHorizontalAbs=m,window.SVGPathSegLinetoHorizontalRel=v,window.SVGPathSegLinetoVerticalAbs=y,window.SVGPathSegLinetoVerticalRel=_,window.SVGPathSegCurvetoCubicSmoothAbs=b,window.SVGPathSegCurvetoCubicSmoothRel=x,window.SVGPathSegCurvetoQuadraticSmoothAbs=w,window.SVGPathSegCurvetoQuadraticSmoothRel=S}if(!("SVGPathSegList"in window)||!("appendItem"in window.SVGPathSegList.prototype)){var k=function(){function e(t){r(this,e),this._pathElement=t,this._list=this._parsePath(this._pathElement.getAttribute("d")),this._mutationObserverConfig={attributes:!0,attributeFilter:["d"]},this._pathElementMutationObserver=new MutationObserver(this._updateListFromPathMutations.bind(this)),this._pathElementMutationObserver.observe(this._pathElement,this._mutationObserverConfig)}return i(e,[{key:"_checkPathSynchronizedToList",value:function(){this._updateListFromPathMutations(this._pathElementMutationObserver.takeRecords())}},{key:"_updateListFromPathMutations",value:function(e){if(this._pathElement){var t=!1;e.forEach((function(e){"d"===e.attributeName&&(t=!0)})),t&&(this._list=this._parsePath(this._pathElement.getAttribute("d")))}}},{key:"_writeListToPath",value:function(){this._pathElementMutationObserver.disconnect(),this._pathElement.setAttribute("d",e._pathSegArrayAsString(this._list)),this._pathElementMutationObserver.observe(this._pathElement,this._mutationObserverConfig)}},{key:"segmentChanged",value:function(e){this._writeListToPath()}},{key:"clear",value:function(){this._checkPathSynchronizedToList(),this._list.forEach((function(e){e._owningPathSegList=null})),this._list=[],this._writeListToPath()}},{key:"initialize",value:function(e){return this._checkPathSynchronizedToList(),this._list=[e],e._owningPathSegList=this,this._writeListToPath(),e}},{key:"_checkValidIndex",value:function(e){if(isNaN(e)||e<0||e>=this.numberOfItems)throw new Error("INDEX_SIZE_ERR")}},{key:"getItem",value:function(e){return this._checkPathSynchronizedToList(),this._checkValidIndex(e),this._list[e]}},{key:"insertItemBefore",value:function(e,t){return this._checkPathSynchronizedToList(),t>this.numberOfItems&&(t=this.numberOfItems),e._owningPathSegList&&(e=e.clone()),this._list.splice(t,0,e),e._owningPathSegList=this,this._writeListToPath(),e}},{key:"replaceItem",value:function(e,t){return this._checkPathSynchronizedToList(),e._owningPathSegList&&(e=e.clone()),this._checkValidIndex(t),this._list[t]=e,e._owningPathSegList=this,this._writeListToPath(),e}},{key:"removeItem",value:function(e){this._checkPathSynchronizedToList(),this._checkValidIndex(e);var t=this._list[e];return this._list.splice(e,1),this._writeListToPath(),t}},{key:"appendItem",value:function(e){return this._checkPathSynchronizedToList(),e._owningPathSegList&&(e=e.clone()),this._list.push(e),e._owningPathSegList=this,this._writeListToPath(),e}},{key:"_parsePath",value:function(e){if(!e||!e.length)return[];var t=this,n=function(){function e(){r(this,e),this.pathSegList=[]}return i(e,[{key:"appendSegment",value:function(e){this.pathSegList.push(e)}}]),e}(),a=function(){function e(t){r(this,e),this._string=t,this._currentIndex=0,this._endIndex=this._string.length,this._previousCommand=SVGPathSeg.PATHSEG_UNKNOWN,this._skipOptionalSpaces()}return i(e,[{key:"_isCurrentSpace",value:function(){var e=this._string[this._currentIndex];return e<=" "&&(" "===e||"\n"===e||"\t"===e||"\r"===e||"\f"===e)}},{key:"_skipOptionalSpaces",value:function(){for(;this._currentIndex="0"&&e<="9")&&t!==SVGPathSeg.PATHSEG_CLOSEPATH?t===SVGPathSeg.PATHSEG_MOVETO_ABS?SVGPathSeg.PATHSEG_LINETO_ABS:t===SVGPathSeg.PATHSEG_MOVETO_REL?SVGPathSeg.PATHSEG_LINETO_REL:t:SVGPathSeg.PATHSEG_UNKNOWN}},{key:"initialCommandIsMoveTo",value:function(){if(!this.hasMoreData())return!0;var e=this.peekSegmentType();return e===SVGPathSeg.PATHSEG_MOVETO_ABS||e===SVGPathSeg.PATHSEG_MOVETO_REL}},{key:"_parseNumber",value:function(){var e=0,t=0,n=1,r=0,a=1,i=1,o=this._currentIndex;if(this._skipOptionalSpaces(),this._currentIndex"9")&&"."!==this._string.charAt(this._currentIndex))){for(var s=this._currentIndex;this._currentIndex="0"&&this._string.charAt(this._currentIndex)<="9";)this._currentIndex++;if(this._currentIndex!==s)for(var l=this._currentIndex-1,c=1;l>=s;)t+=c*(this._string.charAt(l--)-"0"),c*=10;if(this._currentIndex=this._endIndex||this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")return;for(;this._currentIndex="0"&&this._string.charAt(this._currentIndex)<="9";)n*=10,r+=(this._string.charAt(this._currentIndex)-"0")/n,this._currentIndex+=1}if(this._currentIndex!==o&&this._currentIndex+1=this._endIndex||this._string.charAt(this._currentIndex)<"0"||this._string.charAt(this._currentIndex)>"9")return;for(;this._currentIndex="0"&&this._string.charAt(this._currentIndex)<="9";)e*=10,e+=this._string.charAt(this._currentIndex)-"0",this._currentIndex++}var u=t+r;if(u*=a,e&&(u*=Math.pow(10,i*e)),o!==this._currentIndex)return this._skipOptionalSpacesOrDelimiter(),u}}},{key:"_parseArcFlag",value:function(){if(!(this._currentIndex>=this._endIndex)){var e=!1,t=this._string.charAt(this._currentIndex++);if("0"===t)e=!1;else{if("1"!==t)return;e=!0}return this._skipOptionalSpacesOrDelimiter(),e}}},{key:"parseSegment",value:function(){var e=this._string[this._currentIndex],n=this._pathSegTypeFromChar(e);if(n===SVGPathSeg.PATHSEG_UNKNOWN){if(this._previousCommand===SVGPathSeg.PATHSEG_UNKNOWN)return null;if((n=this._nextCommandHelper(e,this._previousCommand))===SVGPathSeg.PATHSEG_UNKNOWN)return null}else this._currentIndex++;switch(this._previousCommand=n,n){case SVGPathSeg.PATHSEG_MOVETO_REL:return new SVGPathSegMovetoRel(t,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_MOVETO_ABS:return new SVGPathSegMovetoAbs(t,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_REL:return new SVGPathSegLinetoRel(t,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_ABS:return new SVGPathSegLinetoAbs(t,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_REL:return new SVGPathSegLinetoHorizontalRel(t,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_HORIZONTAL_ABS:return new SVGPathSegLinetoHorizontalAbs(t,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_VERTICAL_REL:return new SVGPathSegLinetoVerticalRel(t,this._parseNumber());case SVGPathSeg.PATHSEG_LINETO_VERTICAL_ABS:return new SVGPathSegLinetoVerticalAbs(t,this._parseNumber());case SVGPathSeg.PATHSEG_CLOSEPATH:return this._skipOptionalSpaces(),new SVGPathSegClosePath(t);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_REL:var r={x1:this._parseNumber(),y1:this._parseNumber(),x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicRel(t,r.x,r.y,r.x1,r.y1,r.x2,r.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_ABS:var a={x1:this._parseNumber(),y1:this._parseNumber(),x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicAbs(t,a.x,a.y,a.x1,a.y1,a.x2,a.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_REL:var i={x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicSmoothRel(t,i.x,i.y,i.x2,i.y2);case SVGPathSeg.PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:var o={x2:this._parseNumber(),y2:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoCubicSmoothAbs(t,o.x,o.y,o.x2,o.y2);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_REL:var s={x1:this._parseNumber(),y1:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoQuadraticRel(t,s.x,s.y,s.x1,s.y1);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_ABS:var l={x1:this._parseNumber(),y1:this._parseNumber(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegCurvetoQuadraticAbs(t,l.x,l.y,l.x1,l.y1);case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:return new SVGPathSegCurvetoQuadraticSmoothRel(t,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:return new SVGPathSegCurvetoQuadraticSmoothAbs(t,this._parseNumber(),this._parseNumber());case SVGPathSeg.PATHSEG_ARC_REL:var c={x1:this._parseNumber(),y1:this._parseNumber(),arcAngle:this._parseNumber(),arcLarge:this._parseArcFlag(),arcSweep:this._parseArcFlag(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegArcRel(t,c.x,c.y,c.x1,c.y1,c.arcAngle,c.arcLarge,c.arcSweep);case SVGPathSeg.PATHSEG_ARC_ABS:var u={x1:this._parseNumber(),y1:this._parseNumber(),arcAngle:this._parseNumber(),arcLarge:this._parseArcFlag(),arcSweep:this._parseArcFlag(),x:this._parseNumber(),y:this._parseNumber()};return new SVGPathSegArcAbs(t,u.x,u.y,u.x1,u.y1,u.arcAngle,u.arcLarge,u.arcSweep);default:throw new Error("Unknown path seg type.")}}}]),e}(),o=new n,s=new a(e);if(!s.initialCommandIsMoveTo())return[];for(;s.hasMoreData();){var l=s.parseSegment();if(!l)return[];o.appendSegment(l)}return o.pathSegList}}],[{key:"_pathSegArrayAsString",value:function(e){var t="",n=!0;return e.forEach((function(e){n?(n=!1,t+=e._asPathString()):t+=" "+e._asPathString()})),t}}]),e}();k.prototype.classname="SVGPathSegList",Object.defineProperty(k.prototype,"numberOfItems",{get:function(){return this._checkPathSynchronizedToList(),this._list.length},enumerable:!0}),Object.defineProperties(SVGPathElement.prototype,{pathSegList:{get:function(){return this._pathSegList||(this._pathSegList=new k(this)),this._pathSegList},enumerable:!0},normalizedPathSegList:{get:function(){return this.pathSegList},enumerable:!0},animatedPathSegList:{get:function(){return this.pathSegList},enumerable:!0},animatedNormalizedPathSegList:{get:function(){return this.pathSegList},enumerable:!0}}),window.SVGPathSegList=k}}();var x,w=jQuery,S=(Boolean(document.createElementNS&&document.createElementNS(_.SVG,"svg").createSVGRect),navigator.userAgent),k=document.createElementNS(_.SVG,"svg"),C=Boolean(window.opera),A=S.includes("AppleWebKit"),E=S.includes("Gecko/"),G=S.includes("MSIE"),N=S.includes("Chrome/"),P=(S.includes("Windows"),S.includes("Macintosh")),I="ontouchstart"in window,T=Boolean(k.querySelector),L=Boolean(document.evaluate),M=function(){var e=document.createElementNS(_.SVG,"path");e.setAttribute("d","M0,0 10,10");var t=e.pathSegList,n=e.createSVGPathSegLinetoAbs(5,5);try{return t.replaceItem(n,1),!0}catch(e){}return!1}(),O=function(){var e=document.createElementNS(_.SVG,"path");e.setAttribute("d","M0,0 10,10");var t=e.pathSegList,n=e.createSVGPathSegLinetoAbs(5,5);try{return t.insertItemBefore(n,1),!0}catch(e){}return!1}(),j=function(){var e=document.createElementNS(_.SVG,"svg"),t=document.createElementNS(_.SVG,"svg");document.documentElement.append(e),t.setAttribute("x",5),e.append(t);var n=document.createElementNS(_.SVG,"text");n.textContent="a",t.append(n);try{return 0===n.getStartPositionOfChar(0).x}catch(e){return!1}finally{e.remove()}}(),V=function(){var e=document.createElementNS(_.SVG,"svg");document.documentElement.append(e);var t=document.createElementNS(_.SVG,"path");t.setAttribute("d","M0,0 C0,0 10,10 10,0"),e.append(t);var n=t.getBBox();return e.remove(),n.height>4&&n.height<5}(),R=function(){var e=document.createElementNS(_.SVG,"svg");document.documentElement.append(e);var t=document.createElementNS(_.SVG,"path");t.setAttribute("d","M0,0 10,0");var n=document.createElementNS(_.SVG,"path");n.setAttribute("d","M5,0 15,0");var r=document.createElementNS(_.SVG,"g");r.append(t,n),e.append(r);var a=r.getBBox();return e.remove(),15===a.width}(),B=(function(){var e=document.createElementNS(_.SVG,"rect");e.setAttribute("x",.1);var t=!e.cloneNode(!1).getAttribute("x").includes(",");t||w.alert('NOTE: This version of Opera is known to contain bugs in SVG-edit.\nPlease upgrade to the latest version in which the problems have been fixed.')}(),(x=document.createElementNS(_.SVG,"rect")).setAttribute("style","vector-effect:non-scaling-stroke"),"non-scaling-stroke"===x.style.vectorEffect),D=function(){var t=document.createElementNS(_.SVG,"rect").transform.baseVal,n=k.createSVGTransform();t.appendItem(n);var r=t.getItem(0),a=function(t){return t&&"object"===e(t)&&"function"==typeof t.setMatrix&&"angle"in t};return a(r)&&a(n)&&r.type===n.type&&r.angle===n.angle&&r.matrix.a===n.matrix.a&&r.matrix.b===n.matrix.b&&r.matrix.c===n.matrix.c&&r.matrix.d===n.matrix.d&&r.matrix.e===n.matrix.e&&r.matrix.f===n.matrix.f}(),U=function(){return A},F=function(){return E},z=function(){return G},H=function(){return N},q=function(){return P},W=function(){return I},X=function(){return B}; -/** - * A jQuery module to work with SVG attributes. - * @module jQueryAttr - * @license MIT - */ -function Y(t){var n=t.fn.attr;return t.fn.attr=function(t,r){var a=this.length;if(!a)return n.call(this,t,r);for(var i=0;i=0)return this._xforms[e];var t=new Error("DOMException with code=INDEX_SIZE_ERR");throw t.code=1,t}},{key:"insertItemBefore",value:function(e,t){var n=null;if(t>=0)if(t=0&&(this._removeFromOtherLists(e),this._xforms[t]=e,n=e,this._list._update()),n}},{key:"removeItem",value:function(e){if(e=0){var t,n=this._xforms[e],r=new Array(this.numberOfItems-1);for(t=0;t(n=Number.parseInt(n))){var r=n;n=t,t=r}for(var a=he.createSVGMatrix(),i=t;i<=n;++i){var o=i>=0&&ie.x&&t.ye.y},we=Y(jQuery),Se="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",ke="a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use,clipPath".split(","),Ce=null,Ae=null,Ee=null,Ge=null,Ne=function(e){return e.replace(/()/,"$1$2")},Pe=function(e){return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")};function Ie(e){if(e=Me(e),window.btoa)return window.btoa(e);var t=new Array(4*Math.floor((e.length+2)/3)),n=0,r=0;do{var a=e.charCodeAt(n++),i=e.charCodeAt(n++),o=e.charCodeAt(n++),s=a>>2,l=(3&a)<<4|i>>4,c=(15&i)<<2|o>>6,u=63&o;Number.isNaN(i)?(c=64,u=64):Number.isNaN(o)&&(u=64),t[r++]=Se.charAt(s),t[r++]=Se.charAt(l),t[r++]=Se.charAt(c),t[r++]=Se.charAt(u)}while(n>4,l=(15&a)<<4|i>>2,c=(3&i)<<6|o;t+=String.fromCharCode(s),64!==i&&(t+=String.fromCharCode(l)),64!==o&&(t+=String.fromCharCode(c))}while(nSVG-edit "],{type:"text/html"});return je(e)}(),Re=function(e){var t,n;e.includes("0?t=t[0]:(t=e.ownerDocument.createElementNS(_.SVG,"defs"),e.firstChild?e.insertBefore(t,e.firstChild.nextSibling):e.append(t)),t},He=function(e){for(var t=e.pathSegList,n=t.numberOfItems,r=[[],[]],a=t.getItem(0),i=[a.x,a.y],o=function(e,t,n,r){return function(a){return 1-Math.pow(a,3)*i[e]+3-Math.pow(a,2)*a*t[e]+3*(1-a)*Math.pow(a,2)*n[e]+Math.pow(a,3)*r[e]}},s=0;s0&&y<1&&r[h].push(f(y));var _=(-p-Math.sqrt(v))/(2*g);_>0&&_<1&&r[h].push(f(_))}}else{if(0===p)continue;var b=-m/p;b>0&&b<1&&r[h].push(f(b))}}i=d}else r[0].push(l.x),r[1].push(l.y)}var x=Math.min.apply(null,r[0]),w=Math.max.apply(null,r[0])-x,S=Math.min.apply(null,r[1]);return{x:x,y:S,width:w,height:Math.max.apply(null,r[1])-S}};function qe(e){if(R)try{return e.getBBox()}catch(e){}var t,n,r=we.data(e,"ref"),a=null;r?(n=we(r).children().clone().attr("visibility","hidden"),we(Ge).append(n),a=n.filter("line, path")):a=we(e).find("line, path");var i=!1;if(a.length)if(a.each((function(){var e=this.getBBox();e.width&&e.height||(i=!0)})),i){var o=r?n:we(e).children();t=Je(o)}else t=e.getBBox();else t=e.getBBox();return r&&n.remove(),t}var We=function(e){var t=e||Ce.geSelectedElements()[0];if(1!==e.nodeType)return null;var n,r=t.nodeName,a=null;switch(r){case"text":""===t.textContent?(t.textContent="a",a=t.getBBox(),t.textContent=""):t.getBBox&&(a=t.getBBox());break;case"path":V?t.getBBox&&(a=t.getBBox()):a=He(t);break;case"g":case"a":a=qe(t);break;default:if("use"===r&&(a=qe(t)),"use"===r||"foreignObject"===r&&U()){if(a||(a=t.getBBox()),!U()){var i=a,o=i.x,s=i.y;a={width:i.width,height:i.height,x:o+Number.parseFloat(t.getAttribute("x")||0),y:s+Number.parseFloat(t.getAttribute("y")||0)}}}else if(ke.includes(r))if(t)try{a=t.getBBox()}catch(e){var l=t.getExtentOfChar(0),c=t.getComputedTextLength();a={x:l.x,y:l.y,width:c,height:l.height}}else{var u=we(t).closest("foreignObject");u.length&&u[0].getBBox&&(a=u[0].getBBox())}}return a&&(a={x:(n=a).x,y:n.y,width:n.width,height:n.height}),a},Xe=function(e){var t="";return we.each(e,(function(e,n){var r=f(n,2),a=r[0],i=r[1];t+=a;for(var o=0;o-.001&&n<.001||(n<-89.99||n>89.99))}(i,o)){if(["ellipse","path","line","polyline","polygon"].includes(e.tagName))r=s=Ke(e,t,n);else if("rect"===e.tagName){var l=e.getAttribute("rx"),c=e.getAttribute("ry");(l||c)&&(r=s=Ke(e,t,n))}}if(!s){var u=ye(a).matrix;r=ve(r.x,r.y,r.width,r.height,u).aabox}}return r};function $e(e){var t=e.getAttribute("stroke-width");return isNaN(t)||"none"===e.getAttribute("stroke")?0:t/2}var Je=function(e,t,n){if(!e||!e.length)return!1;var r;if(we.each(e,(function(){r||this.parentNode&&(r=Ze(this,t,n))})),void 0===r)return null;var a=r.x+r.width,i=r.y+r.height,o=r.x,s=r.y;if(1===e.length){var l=$e(e[0]);o-=l,s-=l,a+=l,i+=l}else we.each(e,(function(e,r){var l=Ze(r,t,n);if(l){var c=$e(r);o=Math.min(o,l.x-c),s=Math.min(s,l.y-c),1===r.nodeType&&(a=Math.max(a,l.x+l.width+c),i=Math.max(i,l.y+l.height+c))}}));return r.x=o,r.y=s,r.width=a-o,r.height=i-s,r},et=function(e){e||(e=we(Ce.getSVGContent()).children());var t=[];return we(e).children().each((function(e,n){n.getBBox&&t.push(n)})),t.reverse()},tt=function(e){return e||(e=et()),Je(e,Ce.addSVGElementFromJson,Ce.pathActions)},nt=function(e,t){if(!e)return 0;for(var n=e.numberOfItems,r=0;r");var t=e.shortcut||"";dt("#cmenu_canvas").append("
  • "+e.label+""+t+"
  • ")}(e)}))}; -/** - * Adapted from {@link https://github.com/uupaa/dynamic-import-polyfill/blob/master/importModule.js}. - * @module importModule - * @license MIT - */ -function pt(e){var t=document.createElement("a");return t.setAttribute("href",e),t.cloneNode(!1).href}function gt(e,t){["id","class","type"].forEach((function(n){n in t&&(e[n]=t[n])}))}function mt(e,t){return vt(e,o({},t,{returnDefault:!0}))}function vt(e,t){return yt.apply(this,arguments)}function yt(){return(yt=n(regeneratorRuntime.mark((function e(t,n){var r,a;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:if(r=n.global,a=n.returnDefault,!(!("svgEditor"in window)||!window.svgEditor||!1!==window.svgEditor.modules)){e.next=4;break}return e.abrupt("return",bt(t,void 0,{returnDefault:a}));case 4:return e.next=6,_t(t);case 6:return e.abrupt("return",window[r]);case 7:case"end":return e.stop()}}),e)})))).apply(this,arguments)}function _t(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Array.isArray(e)?Promise.all(e.map((function(e){return _t(e,t)}))):new Promise((function(n,r){var a=document.createElement("script");function i(){r(new Error("Failed to import: ".concat(e))),s()}function o(){n(),s()}var s=function(){a.removeEventListener("error",i),a.removeEventListener("load",o),a.remove(),a.src=""};a.defer="defer",gt(a,t),a.addEventListener("error",i),a.addEventListener("load",o),a.src=e,document.head.append(a)}))}function bt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},r=n.returnDefault,a=void 0!==r&&r;return Array.isArray(e)?Promise.all(e.map((function(e){return bt(e,t)}))):new Promise((function(n,r){var i="$importModule$"+Math.random().toString(32).slice(2),o=document.createElement("script");function s(){r(new Error("Failed to import: ".concat(e))),c()}function l(){n(window[i]),c()}var c=function(){delete window[i],o.removeEventListener("error",s),o.removeEventListener("load",l),o.remove(),URL.revokeObjectURL(o.src),o.src=""};gt(o,t),o.defer="defer",o.type="module",o.addEventListener("error",s),o.addEventListener("load",l);var u=pt(e),d="import * as m from '".concat(u.replace(/'/g,"\\'"),"'; window.").concat(i," = ").concat(a?"m.default || ":"","m;"),h=new Blob([d],{type:"text/javascript"});o.src=URL.createObjectURL(h),document.head.append(o)}))}var xt={true:!0,false:!1,null:null};function wt(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=n.ok,a=void 0===r?"Ok":r,i=n.cancel,o=void 0===i?"Cancel":i;t("#dialog_container").draggable({cancel:"#dialog_content, #dialog_buttons *",containment:"window"}).css("position","absolute");var s=t("#dialog_box"),l=t("#dialog_buttons"),c=t("#dialog_content");function u(n,r,i,u,d,h){c.html("

    "+r.replace(/\n/g,"

    ")+"

    ").toggleClass("prompt","prompt"===n),l.empty();var f=t('').appendTo(l);return new Promise((function(a,p){var g,m;if("alert"!==n&&t('').appendTo(l).click((function(){s.hide(),a(!1)})),"prompt"===n)(g=t('').prependTo(l)).val(i||""),g.bind("keydown","return",(function(){f.click()}));else if("select"===n){var v=t('
    ');if(g=t('').appendTo(y)).val(h.value),h.tooltip&&y.attr("title",h.tooltip),m.prop("checked",Boolean(h.checked)),v.append(t("
    ").append(y))}t.each(u||[],(function(n,r){"object"===e(r)?g.append(t("