sketchily 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/MIT-LICENSE +20 -0
- data/README.md +39 -0
- data/Rakefile +40 -0
- data/app/helpers/sketchily.rb~ +10 -0
- data/app/helpers/sketchily_helper.rb +10 -0
- data/app/views/sketchily/_embed.html.erb +28 -0
- data/app/views/sketchily/_embed.html.erb~ +28 -0
- data/app/views/sketchily/_embed.js.erb +50 -0
- data/app/views/sketchily/_embed.js.erb~ +50 -0
- data/app/views/sketchily/_sketchily.html.erb +23 -0
- data/app/views/sketchily/_sketchily.html.erb~ +23 -0
- data/app/views/sketchily/_sketchily_tag.html.erb +21 -0
- data/app/views/sketchily/_sketchily_tag.html.erb~ +21 -0
- data/app/views/sketchily/_svg_edit_tag.html.erb~ +51 -0
- data/app/views/sketchily/svg_edit_tag_.html~ +35 -0
- data/lib/sketchily.rb +15 -0
- data/lib/sketchily.rb~ +16 -0
- data/lib/sketchily/engine.rb +4 -0
- data/lib/sketchily/sketchily.rb +28 -0
- data/lib/sketchily/sketchily_show.rb~ +13 -0
- data/lib/sketchily/sketchily_tag.rb +15 -0
- data/lib/sketchily/svg_edit_tag.rb~ +9 -0
- data/lib/sketchily/version.rb +3 -0
- data/lib/sketchily/version.rb~ +3 -0
- data/spec/dummy/README.rdoc +261 -0
- data/spec/dummy/Rakefile +7 -0
- data/spec/dummy/app/assets/javascripts/application.js +15 -0
- data/spec/dummy/app/assets/stylesheets/application.css +13 -0
- data/spec/dummy/app/controllers/application_controller.rb +3 -0
- data/spec/dummy/app/helpers/application_helper.rb +2 -0
- data/spec/dummy/app/views/layouts/application.html.erb +14 -0
- data/spec/dummy/config.ru +4 -0
- data/spec/dummy/config/application.rb +59 -0
- data/spec/dummy/config/boot.rb +10 -0
- data/spec/dummy/config/database.yml +25 -0
- data/spec/dummy/config/environment.rb +5 -0
- data/spec/dummy/config/environments/development.rb +37 -0
- data/spec/dummy/config/environments/production.rb +67 -0
- data/spec/dummy/config/environments/test.rb +37 -0
- data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/dummy/config/initializers/inflections.rb +15 -0
- data/spec/dummy/config/initializers/mime_types.rb +5 -0
- data/spec/dummy/config/initializers/secret_token.rb +7 -0
- data/spec/dummy/config/initializers/session_store.rb +8 -0
- data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
- data/spec/dummy/config/locales/en.yml +5 -0
- data/spec/dummy/config/routes.rb +58 -0
- data/spec/dummy/public/404.html +26 -0
- data/spec/dummy/public/422.html +26 -0
- data/spec/dummy/public/500.html +25 -0
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/dummy/script/rails +6 -0
- data/spec/lib/sketchily_spec.rb +0 -0
- data/spec/spec_helper.rb +11 -0
- data/vendor/assets/svg-edit-2.6/browser-not-supported.html +27 -0
- data/vendor/assets/svg-edit-2.6/browser.js +180 -0
- data/vendor/assets/svg-edit-2.6/canvg/canvg.js +2620 -0
- data/vendor/assets/svg-edit-2.6/canvg/rgbcolor.js +287 -0
- data/vendor/assets/svg-edit-2.6/contextmenu.js +67 -0
- data/vendor/assets/svg-edit-2.6/contextmenu/jquery.contextMenu.js +203 -0
- data/vendor/assets/svg-edit-2.6/draw.js +528 -0
- data/vendor/assets/svg-edit-2.6/embedapi.html +56 -0
- data/vendor/assets/svg-edit-2.6/embedapi.js +173 -0
- data/vendor/assets/svg-edit-2.6/extensions/closepath_icons.svg +41 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-arrows.js +298 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-closepath.js +92 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-connector.js +587 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-eyedropper.js +109 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-foreignobject.js +277 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-grid.js +184 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-helloworld.js +78 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-imagelib.js +453 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-imagelib.xml +14 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-markers.js +572 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-server_moinsave.js +56 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-server_opensave.js +180 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-shapes.js +387 -0
- data/vendor/assets/svg-edit-2.6/extensions/ext-shapes.xml +10 -0
- data/vendor/assets/svg-edit-2.6/extensions/eyedropper-icon.xml +34 -0
- data/vendor/assets/svg-edit-2.6/extensions/eyedropper.png +0 -0
- data/vendor/assets/svg-edit-2.6/extensions/fileopen.php +31 -0
- data/vendor/assets/svg-edit-2.6/extensions/filesave.php +44 -0
- data/vendor/assets/svg-edit-2.6/extensions/foreignobject-icons.xml +96 -0
- data/vendor/assets/svg-edit-2.6/extensions/grid-icon.xml +30 -0
- data/vendor/assets/svg-edit-2.6/extensions/helloworld-icon.xml +21 -0
- data/vendor/assets/svg-edit-2.6/extensions/imagelib/index.html +64 -0
- data/vendor/assets/svg-edit-2.6/extensions/imagelib/smiley.svg +12 -0
- data/vendor/assets/svg-edit-2.6/extensions/markers-icons.xml +115 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/animal.json +21 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/arrow.json +28 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/dialog_balloon.json +9 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/electronics.json +20 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/flowchart.json +25 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/game.json +13 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/math.json +9 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/misc.json +37 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/music.json +21 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/object.json +19 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael.txt +12 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael_1.json +67 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael_2.json +64 -0
- data/vendor/assets/svg-edit-2.6/extensions/shapelib/symbol.json +28 -0
- data/vendor/assets/svg-edit-2.6/history.js +601 -0
- data/vendor/assets/svg-edit-2.6/images/README.txt +61 -0
- data/vendor/assets/svg-edit-2.6/images/align-bottom.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/align-bottom.svg +277 -0
- data/vendor/assets/svg-edit-2.6/images/align-center.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/align-center.svg +252 -0
- data/vendor/assets/svg-edit-2.6/images/align-left.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/align-left.svg +235 -0
- data/vendor/assets/svg-edit-2.6/images/align-middle.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/align-middle.svg +250 -0
- data/vendor/assets/svg-edit-2.6/images/align-right.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/align-right.svg +233 -0
- data/vendor/assets/svg-edit-2.6/images/align-top.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/align-top.svg +233 -0
- data/vendor/assets/svg-edit-2.6/images/bold.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/cancel.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/circle.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/clear.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/clone.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/conn.svg +29 -0
- data/vendor/assets/svg-edit-2.6/images/copy.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/cut.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/delete.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/document-properties.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/dropdown.gif +0 -0
- data/vendor/assets/svg-edit-2.6/images/ellipse.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/eye.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/fhpath.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/flyouth.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/flyup.gif +0 -0
- data/vendor/assets/svg-edit-2.6/images/freehand-circle.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/freehand-square.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/go-down.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/go-up.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/image.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/italic.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/line.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/link_controls.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/logo.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/logo.svg +32 -0
- data/vendor/assets/svg-edit-2.6/images/move_bottom.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/move_top.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/node_clone.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/node_delete.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/none.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/open.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/paste.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/path.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/polygon.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/polygon.svg +219 -0
- data/vendor/assets/svg-edit-2.6/images/rect.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/redo.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/reorient.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/rotate.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/save.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/select.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/select_node.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/sep.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/shape_group.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/shape_ungroup.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/source.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/spinbtn_updn_big.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/square.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/svg_edit_icons.svg +1034 -0
- data/vendor/assets/svg-edit-2.6/images/svg_edit_icons.svgz +0 -0
- data/vendor/assets/svg-edit-2.6/images/text.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/text.svg +157 -0
- data/vendor/assets/svg-edit-2.6/images/to_path.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/undo.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/view-refresh.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/wave.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/wireframe.png +0 -0
- data/vendor/assets/svg-edit-2.6/images/zoom.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/LICENSE +202 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/README +3 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/css/jPicker.css +1 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/css/jgraduate.css +351 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/AlphaBar.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/Bars.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/Maps.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/NoColor.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/bar-opacity.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/map-opacity.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint.gif +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint_c.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint_f.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/picker.gif +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/preview-opacity.png +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/rangearrows.gif +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/images/rangearrows2.gif +0 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/jpicker.js +2091 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/jpicker.min.js +1 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/jquery.jgraduate.js +1175 -0
- data/vendor/assets/svg-edit-2.6/jgraduate/jquery.jgraduate.min.js +37 -0
- data/vendor/assets/svg-edit-2.6/jquery-ui/jquery-ui-1.8.17.custom.min.js +54 -0
- data/vendor/assets/svg-edit-2.6/jquery-ui/jquery-ui-1.8.custom.min.js +84 -0
- data/vendor/assets/svg-edit-2.6/jquery.js +4 -0
- data/vendor/assets/svg-edit-2.6/jquerybbq/jquery.bbq.min.js +18 -0
- data/vendor/assets/svg-edit-2.6/js-hotkeys/README.md +45 -0
- data/vendor/assets/svg-edit-2.6/js-hotkeys/jquery.hotkeys.min.js +15 -0
- data/vendor/assets/svg-edit-2.6/locale/README.txt +17 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.af.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ar.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.az.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.be.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.bg.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ca.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.cs.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.cy.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.da.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.de.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.el.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.en.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.es.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.et.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.fa.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.fi.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.fr.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.fy.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ga.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.gl.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.he.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.hi.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.hr.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.hu.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.hy.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.id.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.is.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.it.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ja.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ko.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.lt.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.lv.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.mk.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ms.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.mt.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.nl.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.no.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.pl.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.pt-BR.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.pt-PT.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ro.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.ru.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.sk.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.sl.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.sq.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.sr.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.sv.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.sw.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.test.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.th.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.tl.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.tr.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.uk.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.vi.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.yi.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.zh-CN.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.zh-HK.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/lang.zh-TW.js +234 -0
- data/vendor/assets/svg-edit-2.6/locale/locale.js +320 -0
- data/vendor/assets/svg-edit-2.6/math.js +246 -0
- data/vendor/assets/svg-edit-2.6/path.js +980 -0
- data/vendor/assets/svg-edit-2.6/sanitize.js +273 -0
- data/vendor/assets/svg-edit-2.6/select.js +532 -0
- data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.css +41 -0
- data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.js +266 -0
- data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.min.js +7 -0
- data/vendor/assets/svg-edit-2.6/spinbtn/spinbtn_updn.png +0 -0
- data/vendor/assets/svg-edit-2.6/svg-editor.css +1495 -0
- data/vendor/assets/svg-edit-2.6/svg-editor.css~ +1500 -0
- data/vendor/assets/svg-edit-2.6/svg-editor.html +788 -0
- data/vendor/assets/svg-edit-2.6/svg-editor.html~ +788 -0
- data/vendor/assets/svg-edit-2.6/svg-editor.js +4969 -0
- data/vendor/assets/svg-edit-2.6/svg-editor.manifest +121 -0
- data/vendor/assets/svg-edit-2.6/svgcanvas.js +8775 -0
- data/vendor/assets/svg-edit-2.6/svgedit.compiled.js +465 -0
- data/vendor/assets/svg-edit-2.6/svgicons/jquery.svgicons.js +486 -0
- data/vendor/assets/svg-edit-2.6/svgtransformlist.js +291 -0
- data/vendor/assets/svg-edit-2.6/svgutils.js +651 -0
- data/vendor/assets/svg-edit-2.6/touch.js +30 -0
- data/vendor/assets/svg-edit-2.6/units.js +281 -0
- metadata +407 -0
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package: svgedit.sanitize
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the MIT License
|
|
5
|
+
*
|
|
6
|
+
* Copyright(c) 2010 Alexis Deveria
|
|
7
|
+
* Copyright(c) 2010 Jeff Schiller
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// Dependencies:
|
|
11
|
+
// 1) browser.js
|
|
12
|
+
// 2) svgutils.js
|
|
13
|
+
|
|
14
|
+
var svgedit = svgedit || {};
|
|
15
|
+
|
|
16
|
+
(function() {
|
|
17
|
+
|
|
18
|
+
if (!svgedit.sanitize) {
|
|
19
|
+
svgedit.sanitize = {};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Namespace constants
|
|
23
|
+
var svgns = "http://www.w3.org/2000/svg",
|
|
24
|
+
xlinkns = "http://www.w3.org/1999/xlink",
|
|
25
|
+
xmlns = "http://www.w3.org/XML/1998/namespace",
|
|
26
|
+
xmlnsns = "http://www.w3.org/2000/xmlns/", // see http://www.w3.org/TR/REC-xml-names/#xmlReserved
|
|
27
|
+
se_ns = "http://svg-edit.googlecode.com",
|
|
28
|
+
htmlns = "http://www.w3.org/1999/xhtml",
|
|
29
|
+
mathns = "http://www.w3.org/1998/Math/MathML";
|
|
30
|
+
|
|
31
|
+
// map namespace URIs to prefixes
|
|
32
|
+
var nsMap_ = {};
|
|
33
|
+
nsMap_[xlinkns] = 'xlink';
|
|
34
|
+
nsMap_[xmlns] = 'xml';
|
|
35
|
+
nsMap_[xmlnsns] = 'xmlns';
|
|
36
|
+
nsMap_[se_ns] = 'se';
|
|
37
|
+
nsMap_[htmlns] = 'xhtml';
|
|
38
|
+
nsMap_[mathns] = 'mathml';
|
|
39
|
+
|
|
40
|
+
// map prefixes to namespace URIs
|
|
41
|
+
var nsRevMap_ = {};
|
|
42
|
+
$.each(nsMap_, function(key,value){
|
|
43
|
+
nsRevMap_[value] = key;
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// this defines which elements and attributes that we support
|
|
47
|
+
var svgWhiteList_ = {
|
|
48
|
+
// SVG Elements
|
|
49
|
+
"a": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "xlink:href", "xlink:title"],
|
|
50
|
+
"circle": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "r", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
|
|
51
|
+
"clipPath": ["class", "clipPathUnits", "id"],
|
|
52
|
+
"defs": [],
|
|
53
|
+
"style" : ["type"],
|
|
54
|
+
"desc": [],
|
|
55
|
+
"ellipse": ["class", "clip-path", "clip-rule", "cx", "cy", "fill", "fill-opacity", "fill-rule", "filter", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
|
|
56
|
+
"feGaussianBlur": ["class", "color-interpolation-filters", "id", "requiredFeatures", "stdDeviation"],
|
|
57
|
+
"filter": ["class", "color-interpolation-filters", "filterRes", "filterUnits", "height", "id", "primitiveUnits", "requiredFeatures", "width", "x", "xlink:href", "y"],
|
|
58
|
+
"foreignObject": ["class", "font-size", "height", "id", "opacity", "requiredFeatures", "style", "transform", "width", "x", "y"],
|
|
59
|
+
"g": ["class", "clip-path", "clip-rule", "id", "display", "fill", "fill-opacity", "fill-rule", "filter", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "font-family", "font-size", "font-style", "font-weight", "text-anchor"],
|
|
60
|
+
"image": ["class", "clip-path", "clip-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "style", "systemLanguage", "transform", "width", "x", "xlink:href", "xlink:title", "y"],
|
|
61
|
+
"line": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "x1", "x2", "y1", "y2"],
|
|
62
|
+
"linearGradient": ["class", "id", "gradientTransform", "gradientUnits", "requiredFeatures", "spreadMethod", "systemLanguage", "x1", "x2", "xlink:href", "y1", "y2"],
|
|
63
|
+
"marker": ["id", "class", "markerHeight", "markerUnits", "markerWidth", "orient", "preserveAspectRatio", "refX", "refY", "systemLanguage", "viewBox"],
|
|
64
|
+
"mask": ["class", "height", "id", "maskContentUnits", "maskUnits", "width", "x", "y"],
|
|
65
|
+
"metadata": ["class", "id"],
|
|
66
|
+
"path": ["class", "clip-path", "clip-rule", "d", "fill", "fill-opacity", "fill-rule", "filter", "id", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
|
|
67
|
+
"pattern": ["class", "height", "id", "patternContentUnits", "patternTransform", "patternUnits", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xlink:href", "y"],
|
|
68
|
+
"polygon": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "id", "class", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
|
|
69
|
+
"polyline": ["class", "clip-path", "clip-rule", "id", "fill", "fill-opacity", "fill-rule", "filter", "marker-end", "marker-mid", "marker-start", "mask", "opacity", "points", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform"],
|
|
70
|
+
"radialGradient": ["class", "cx", "cy", "fx", "fy", "gradientTransform", "gradientUnits", "id", "r", "requiredFeatures", "spreadMethod", "systemLanguage", "xlink:href"],
|
|
71
|
+
"rect": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "opacity", "requiredFeatures", "rx", "ry", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "width", "x", "y"],
|
|
72
|
+
"stop": ["class", "id", "offset", "requiredFeatures", "stop-color", "stop-opacity", "style", "systemLanguage"],
|
|
73
|
+
"svg": ["class", "clip-path", "clip-rule", "filter", "id", "height", "mask", "preserveAspectRatio", "requiredFeatures", "style", "systemLanguage", "viewBox", "width", "x", "xmlns", "xmlns:se", "xmlns:xlink", "y"],
|
|
74
|
+
"switch": ["class", "id", "requiredFeatures", "systemLanguage"],
|
|
75
|
+
"symbol": ["class", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "opacity", "preserveAspectRatio", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "transform", "viewBox"],
|
|
76
|
+
"text": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "transform", "x", "xml:space", "y"],
|
|
77
|
+
"textPath": ["class", "id", "method", "requiredFeatures", "spacing", "startOffset", "style", "systemLanguage", "transform", "xlink:href"],
|
|
78
|
+
"title": [],
|
|
79
|
+
"tspan": ["class", "clip-path", "clip-rule", "dx", "dy", "fill", "fill-opacity", "fill-rule", "filter", "font-family", "font-size", "font-style", "font-weight", "id", "mask", "opacity", "requiredFeatures", "rotate", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "systemLanguage", "text-anchor", "textLength", "transform", "x", "xml:space", "y"],
|
|
80
|
+
"use": ["class", "clip-path", "clip-rule", "fill", "fill-opacity", "fill-rule", "filter", "height", "id", "mask", "stroke", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke-width", "style", "transform", "width", "x", "xlink:href", "y"],
|
|
81
|
+
|
|
82
|
+
// MathML Elements
|
|
83
|
+
"annotation": ["encoding"],
|
|
84
|
+
"annotation-xml": ["encoding"],
|
|
85
|
+
"maction": ["actiontype", "other", "selection"],
|
|
86
|
+
"math": ["class", "id", "display", "xmlns"],
|
|
87
|
+
"menclose": ["notation"],
|
|
88
|
+
"merror": [],
|
|
89
|
+
"mfrac": ["linethickness"],
|
|
90
|
+
"mi": ["mathvariant"],
|
|
91
|
+
"mmultiscripts": [],
|
|
92
|
+
"mn": [],
|
|
93
|
+
"mo": ["fence", "lspace", "maxsize", "minsize", "rspace", "stretchy"],
|
|
94
|
+
"mover": [],
|
|
95
|
+
"mpadded": ["lspace", "width", "height", "depth", "voffset"],
|
|
96
|
+
"mphantom": [],
|
|
97
|
+
"mprescripts": [],
|
|
98
|
+
"mroot": [],
|
|
99
|
+
"mrow": ["xlink:href", "xlink:type", "xmlns:xlink"],
|
|
100
|
+
"mspace": ["depth", "height", "width"],
|
|
101
|
+
"msqrt": [],
|
|
102
|
+
"mstyle": ["displaystyle", "mathbackground", "mathcolor", "mathvariant", "scriptlevel"],
|
|
103
|
+
"msub": [],
|
|
104
|
+
"msubsup": [],
|
|
105
|
+
"msup": [],
|
|
106
|
+
"mtable": ["align", "columnalign", "columnlines", "columnspacing", "displaystyle", "equalcolumns", "equalrows", "frame", "rowalign", "rowlines", "rowspacing", "width"],
|
|
107
|
+
"mtd": ["columnalign", "columnspan", "rowalign", "rowspan"],
|
|
108
|
+
"mtext": [],
|
|
109
|
+
"mtr": ["columnalign", "rowalign"],
|
|
110
|
+
"munder": [],
|
|
111
|
+
"munderover": [],
|
|
112
|
+
"none": [],
|
|
113
|
+
"semantics": []
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
// Produce a Namespace-aware version of svgWhitelist
|
|
117
|
+
var svgWhiteListNS_ = {};
|
|
118
|
+
$.each(svgWhiteList_, function(elt,atts){
|
|
119
|
+
var attNS = {};
|
|
120
|
+
$.each(atts, function(i, att){
|
|
121
|
+
if (att.indexOf(':') >= 0) {
|
|
122
|
+
var v = att.split(':');
|
|
123
|
+
attNS[v[1]] = nsRevMap_[v[0]];
|
|
124
|
+
} else {
|
|
125
|
+
attNS[att] = att == 'xmlns' ? xmlnsns : null;
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
svgWhiteListNS_[elt] = attNS;
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// temporarily expose these
|
|
132
|
+
svgedit.sanitize.getNSMap = function() { return nsMap_; }
|
|
133
|
+
|
|
134
|
+
// Function: svgedit.sanitize.sanitizeSvg
|
|
135
|
+
// Sanitizes the input node and its children
|
|
136
|
+
// It only keeps what is allowed from our whitelist defined above
|
|
137
|
+
//
|
|
138
|
+
// Parameters:
|
|
139
|
+
// node - The DOM element to be checked, will also check its children
|
|
140
|
+
svgedit.sanitize.sanitizeSvg = function(node) {
|
|
141
|
+
// we only care about element nodes
|
|
142
|
+
// automatically return for all comment, etc nodes
|
|
143
|
+
// for text, we do a whitespace trim
|
|
144
|
+
if (node.nodeType == 3) {
|
|
145
|
+
node.nodeValue = node.nodeValue.replace(/^\s+|\s+$/g, "");
|
|
146
|
+
// Remove empty text nodes
|
|
147
|
+
if(!node.nodeValue.length) node.parentNode.removeChild(node);
|
|
148
|
+
}
|
|
149
|
+
if (node.nodeType != 1) return;
|
|
150
|
+
var doc = node.ownerDocument;
|
|
151
|
+
var parent = node.parentNode;
|
|
152
|
+
// can parent ever be null here? I think the root node's parent is the document...
|
|
153
|
+
if (!doc || !parent) return;
|
|
154
|
+
|
|
155
|
+
var allowedAttrs = svgWhiteList_[node.nodeName];
|
|
156
|
+
var allowedAttrsNS = svgWhiteListNS_[node.nodeName];
|
|
157
|
+
|
|
158
|
+
// if this element is allowed
|
|
159
|
+
if (allowedAttrs != undefined) {
|
|
160
|
+
|
|
161
|
+
var se_attrs = [];
|
|
162
|
+
|
|
163
|
+
var i = node.attributes.length;
|
|
164
|
+
while (i--) {
|
|
165
|
+
// if the attribute is not in our whitelist, then remove it
|
|
166
|
+
// could use jQuery's inArray(), but I don't know if that's any better
|
|
167
|
+
var attr = node.attributes.item(i);
|
|
168
|
+
var attrName = attr.nodeName;
|
|
169
|
+
var attrLocalName = attr.localName;
|
|
170
|
+
var attrNsURI = attr.namespaceURI;
|
|
171
|
+
// Check that an attribute with the correct localName in the correct namespace is on
|
|
172
|
+
// our whitelist or is a namespace declaration for one of our allowed namespaces
|
|
173
|
+
if (!(allowedAttrsNS.hasOwnProperty(attrLocalName) && attrNsURI == allowedAttrsNS[attrLocalName] && attrNsURI != xmlnsns) &&
|
|
174
|
+
!(attrNsURI == xmlnsns && nsMap_[attr.nodeValue]) )
|
|
175
|
+
{
|
|
176
|
+
// TODO(codedread): Programmatically add the se: attributes to the NS-aware whitelist.
|
|
177
|
+
// Bypassing the whitelist to allow se: prefixes. Is there
|
|
178
|
+
// a more appropriate way to do this?
|
|
179
|
+
if(attrName.indexOf('se:') == 0) {
|
|
180
|
+
se_attrs.push([attrName, attr.nodeValue]);
|
|
181
|
+
}
|
|
182
|
+
node.removeAttributeNS(attrNsURI, attrLocalName);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
// Add spaces before negative signs where necessary
|
|
186
|
+
if(svgedit.browser.isGecko()) {
|
|
187
|
+
switch ( attrName ) {
|
|
188
|
+
case "transform":
|
|
189
|
+
case "gradientTransform":
|
|
190
|
+
case "patternTransform":
|
|
191
|
+
var val = attr.nodeValue.replace(/(\d)-/g, "$1 -");
|
|
192
|
+
node.setAttribute(attrName, val);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// for the style attribute, rewrite it in terms of XML presentational attributes
|
|
197
|
+
if (attrName == "style") {
|
|
198
|
+
var props = attr.nodeValue.split(";"),
|
|
199
|
+
p = props.length;
|
|
200
|
+
while(p--) {
|
|
201
|
+
var nv = props[p].split(":");
|
|
202
|
+
// now check that this attribute is supported
|
|
203
|
+
if (allowedAttrs.indexOf(nv[0]) >= 0) {
|
|
204
|
+
node.setAttribute(nv[0],nv[1]);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
node.removeAttribute('style');
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
$.each(se_attrs, function(i, attr) {
|
|
212
|
+
node.setAttributeNS(se_ns, attr[0], attr[1]);
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
// for some elements that have a xlink:href, ensure the URI refers to a local element
|
|
216
|
+
// (but not for links)
|
|
217
|
+
var href = svgedit.utilities.getHref(node);
|
|
218
|
+
if(href &&
|
|
219
|
+
["filter", "linearGradient", "pattern",
|
|
220
|
+
"radialGradient", "textPath", "use"].indexOf(node.nodeName) >= 0)
|
|
221
|
+
{
|
|
222
|
+
// TODO: we simply check if the first character is a #, is this bullet-proof?
|
|
223
|
+
if (href[0] != "#") {
|
|
224
|
+
// remove the attribute (but keep the element)
|
|
225
|
+
svgedit.utilities.setHref(node, "");
|
|
226
|
+
node.removeAttributeNS(xlinkns, "href");
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Safari crashes on a <use> without a xlink:href, so we just remove the node here
|
|
231
|
+
if (node.nodeName == "use" && !svgedit.utilities.getHref(node)) {
|
|
232
|
+
parent.removeChild(node);
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
// if the element has attributes pointing to a non-local reference,
|
|
236
|
+
// need to remove the attribute
|
|
237
|
+
$.each(["clip-path", "fill", "filter", "marker-end", "marker-mid", "marker-start", "mask", "stroke"],function(i,attr) {
|
|
238
|
+
var val = node.getAttribute(attr);
|
|
239
|
+
if (val) {
|
|
240
|
+
val = svgedit.utilities.getUrlFromAttr(val);
|
|
241
|
+
// simply check for first character being a '#'
|
|
242
|
+
if (val && val[0] !== "#") {
|
|
243
|
+
node.setAttribute(attr, "");
|
|
244
|
+
node.removeAttribute(attr);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
|
|
249
|
+
// recurse to children
|
|
250
|
+
i = node.childNodes.length;
|
|
251
|
+
while (i--) { svgedit.sanitize.sanitizeSvg(node.childNodes.item(i)); }
|
|
252
|
+
}
|
|
253
|
+
// else, remove this element
|
|
254
|
+
else {
|
|
255
|
+
// remove all children from this node and insert them before this node
|
|
256
|
+
// FIXME: in the case of animation elements this will hardly ever be correct
|
|
257
|
+
var children = [];
|
|
258
|
+
while (node.hasChildNodes()) {
|
|
259
|
+
children.push(parent.insertBefore(node.firstChild, node));
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
// remove this node from the document altogether
|
|
263
|
+
parent.removeChild(node);
|
|
264
|
+
|
|
265
|
+
// call sanitizeSvg on each of those children
|
|
266
|
+
var i = children.length;
|
|
267
|
+
while (i--) { svgedit.sanitize.sanitizeSvg(children[i]); }
|
|
268
|
+
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
|
|
272
|
+
})();
|
|
273
|
+
|
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package: svedit.select
|
|
3
|
+
*
|
|
4
|
+
* Licensed under the MIT License
|
|
5
|
+
*
|
|
6
|
+
* Copyright(c) 2010 Alexis Deveria
|
|
7
|
+
* Copyright(c) 2010 Jeff Schiller
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
// Dependencies:
|
|
11
|
+
// 1) jQuery
|
|
12
|
+
// 2) browser.js
|
|
13
|
+
// 3) math.js
|
|
14
|
+
// 4) svgutils.js
|
|
15
|
+
|
|
16
|
+
var svgedit = svgedit || {};
|
|
17
|
+
|
|
18
|
+
(function() {
|
|
19
|
+
|
|
20
|
+
if (!svgedit.select) {
|
|
21
|
+
svgedit.select = {};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
var svgFactory_;
|
|
25
|
+
var config_;
|
|
26
|
+
var selectorManager_; // A Singleton
|
|
27
|
+
|
|
28
|
+
var gripRadius;
|
|
29
|
+
svgedit.browser.isTouch() ? gripRadius = 10 : gripRadius = 4;
|
|
30
|
+
|
|
31
|
+
// Class: svgedit.select.Selector
|
|
32
|
+
// Private class for DOM element selection boxes
|
|
33
|
+
//
|
|
34
|
+
// Parameters:
|
|
35
|
+
// id - integer to internally indentify the selector
|
|
36
|
+
// elem - DOM element associated with this selector
|
|
37
|
+
svgedit.select.Selector = function(id, elem) {
|
|
38
|
+
// this is the selector's unique number
|
|
39
|
+
this.id = id;
|
|
40
|
+
|
|
41
|
+
// this holds a reference to the element for which this selector is being used
|
|
42
|
+
this.selectedElement = elem;
|
|
43
|
+
|
|
44
|
+
// this is a flag used internally to track whether the selector is being used or not
|
|
45
|
+
this.locked = true;
|
|
46
|
+
|
|
47
|
+
// this holds a reference to the <g> element that holds all visual elements of the selector
|
|
48
|
+
this.selectorGroup = svgFactory_.createSVGElement({
|
|
49
|
+
'element': 'g',
|
|
50
|
+
'attr': {'id': ('selectorGroup' + this.id)}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// this holds a reference to the path rect
|
|
54
|
+
this.selectorRect = this.selectorGroup.appendChild(
|
|
55
|
+
svgFactory_.createSVGElement({
|
|
56
|
+
'element': 'path',
|
|
57
|
+
'attr': {
|
|
58
|
+
'id': ('selectedBox' + this.id),
|
|
59
|
+
'fill': 'none',
|
|
60
|
+
'stroke': '#22C',
|
|
61
|
+
'stroke-width': '1',
|
|
62
|
+
'stroke-dasharray': '5,5',
|
|
63
|
+
// need to specify this so that the rect is not selectable
|
|
64
|
+
'style': 'pointer-events:none'
|
|
65
|
+
}
|
|
66
|
+
})
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
// this holds a reference to the grip coordinates for this selector
|
|
70
|
+
this.gripCoords = {
|
|
71
|
+
'nw': null,
|
|
72
|
+
'n' : null,
|
|
73
|
+
'ne': null,
|
|
74
|
+
'e' : null,
|
|
75
|
+
'se': null,
|
|
76
|
+
's' : null,
|
|
77
|
+
'sw': null,
|
|
78
|
+
'w' : null
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
this.reset(this.selectedElement);
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
// Function: svgedit.select.Selector.reset
|
|
86
|
+
// Used to reset the id and element that the selector is attached to
|
|
87
|
+
//
|
|
88
|
+
// Parameters:
|
|
89
|
+
// e - DOM element associated with this selector
|
|
90
|
+
svgedit.select.Selector.prototype.reset = function(e) {
|
|
91
|
+
this.locked = true;
|
|
92
|
+
this.selectedElement = e;
|
|
93
|
+
this.resize();
|
|
94
|
+
this.selectorGroup.setAttribute('display', 'inline');
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
// Function: svgedit.select.Selector.updateGripCursors
|
|
98
|
+
// Updates cursors for corner grips on rotation so arrows point the right way
|
|
99
|
+
//
|
|
100
|
+
// Parameters:
|
|
101
|
+
// angle - Float indicating current rotation angle in degrees
|
|
102
|
+
svgedit.select.Selector.prototype.updateGripCursors = function(angle) {
|
|
103
|
+
var dir_arr = [];
|
|
104
|
+
var steps = Math.round(angle / 45);
|
|
105
|
+
if(steps < 0) steps += 8;
|
|
106
|
+
for (var dir in selectorManager_.selectorGrips) {
|
|
107
|
+
dir_arr.push(dir);
|
|
108
|
+
}
|
|
109
|
+
while(steps > 0) {
|
|
110
|
+
dir_arr.push(dir_arr.shift());
|
|
111
|
+
steps--;
|
|
112
|
+
}
|
|
113
|
+
var i = 0;
|
|
114
|
+
for (var dir in selectorManager_.selectorGrips) {
|
|
115
|
+
selectorManager_.selectorGrips[dir].setAttribute('style', ('cursor:' + dir_arr[i] + '-resize'));
|
|
116
|
+
i++;
|
|
117
|
+
};
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
// Function: svgedit.select.Selector.showGrips
|
|
121
|
+
// Show the resize grips of this selector
|
|
122
|
+
//
|
|
123
|
+
// Parameters:
|
|
124
|
+
// show - boolean indicating whether grips should be shown or not
|
|
125
|
+
svgedit.select.Selector.prototype.showGrips = function(show) {
|
|
126
|
+
// TODO: use suspendRedraw() here
|
|
127
|
+
var bShow = show ? 'inline' : 'none';
|
|
128
|
+
selectorManager_.selectorGripsGroup.setAttribute('display', bShow);
|
|
129
|
+
var elem = this.selectedElement;
|
|
130
|
+
this.hasGrips = show;
|
|
131
|
+
if(elem && show) {
|
|
132
|
+
this.selectorGroup.appendChild(selectorManager_.selectorGripsGroup);
|
|
133
|
+
this.updateGripCursors(svgedit.utilities.getRotationAngle(elem));
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
// Function: svgedit.select.Selector.resize
|
|
138
|
+
// Updates the selector to match the element's size
|
|
139
|
+
svgedit.select.Selector.prototype.resize = function() {
|
|
140
|
+
var selectedBox = this.selectorRect,
|
|
141
|
+
mgr = selectorManager_,
|
|
142
|
+
selectedGrips = mgr.selectorGrips,
|
|
143
|
+
selected = this.selectedElement,
|
|
144
|
+
sw = selected.getAttribute('stroke-width'),
|
|
145
|
+
current_zoom = svgFactory_.currentZoom();
|
|
146
|
+
var offset = 1/current_zoom;
|
|
147
|
+
if (selected.getAttribute('stroke') !== 'none' && !isNaN(sw)) {
|
|
148
|
+
offset += (sw/2);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
var tagName = selected.tagName;
|
|
152
|
+
if (tagName === 'text') {
|
|
153
|
+
offset += 2/current_zoom;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// loop and transform our bounding box until we reach our first rotation
|
|
157
|
+
var tlist = svgedit.transformlist.getTransformList(selected);
|
|
158
|
+
var m = svgedit.math.transformListToTransform(tlist).matrix;
|
|
159
|
+
|
|
160
|
+
// This should probably be handled somewhere else, but for now
|
|
161
|
+
// it keeps the selection box correctly positioned when zoomed
|
|
162
|
+
m.e *= current_zoom;
|
|
163
|
+
m.f *= current_zoom;
|
|
164
|
+
|
|
165
|
+
var bbox = svgedit.utilities.getBBox(selected);
|
|
166
|
+
if(tagName === 'g' && !$.data(selected, 'gsvg')) {
|
|
167
|
+
// The bbox for a group does not include stroke vals, so we
|
|
168
|
+
// get the bbox based on its children.
|
|
169
|
+
var stroked_bbox = svgFactory_.getStrokedBBox(selected.childNodes);
|
|
170
|
+
if(stroked_bbox) {
|
|
171
|
+
bbox = stroked_bbox;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// apply the transforms
|
|
176
|
+
var l=bbox.x, t=bbox.y, w=bbox.width, h=bbox.height,
|
|
177
|
+
bbox = {x:l, y:t, width:w, height:h};
|
|
178
|
+
|
|
179
|
+
// we need to handle temporary transforms too
|
|
180
|
+
// if skewed, get its transformed box, then find its axis-aligned bbox
|
|
181
|
+
|
|
182
|
+
//*
|
|
183
|
+
offset *= current_zoom;
|
|
184
|
+
|
|
185
|
+
var nbox = svgedit.math.transformBox(l*current_zoom, t*current_zoom, w*current_zoom, h*current_zoom, m),
|
|
186
|
+
aabox = nbox.aabox,
|
|
187
|
+
nbax = aabox.x - offset,
|
|
188
|
+
nbay = aabox.y - offset,
|
|
189
|
+
nbaw = aabox.width + (offset * 2),
|
|
190
|
+
nbah = aabox.height + (offset * 2);
|
|
191
|
+
|
|
192
|
+
// now if the shape is rotated, un-rotate it
|
|
193
|
+
var cx = nbax + nbaw/2,
|
|
194
|
+
cy = nbay + nbah/2;
|
|
195
|
+
|
|
196
|
+
var angle = svgedit.utilities.getRotationAngle(selected);
|
|
197
|
+
if (angle) {
|
|
198
|
+
var rot = svgFactory_.svgRoot().createSVGTransform();
|
|
199
|
+
rot.setRotate(-angle,cx,cy);
|
|
200
|
+
var rotm = rot.matrix;
|
|
201
|
+
nbox.tl = svgedit.math.transformPoint(nbox.tl.x,nbox.tl.y,rotm);
|
|
202
|
+
nbox.tr = svgedit.math.transformPoint(nbox.tr.x,nbox.tr.y,rotm);
|
|
203
|
+
nbox.bl = svgedit.math.transformPoint(nbox.bl.x,nbox.bl.y,rotm);
|
|
204
|
+
nbox.br = svgedit.math.transformPoint(nbox.br.x,nbox.br.y,rotm);
|
|
205
|
+
|
|
206
|
+
// calculate the axis-aligned bbox
|
|
207
|
+
var tl = nbox.tl;
|
|
208
|
+
var minx = tl.x,
|
|
209
|
+
miny = tl.y,
|
|
210
|
+
maxx = tl.x,
|
|
211
|
+
maxy = tl.y;
|
|
212
|
+
|
|
213
|
+
var Min = Math.min, Max = Math.max;
|
|
214
|
+
|
|
215
|
+
minx = Min(minx, Min(nbox.tr.x, Min(nbox.bl.x, nbox.br.x) ) ) - offset;
|
|
216
|
+
miny = Min(miny, Min(nbox.tr.y, Min(nbox.bl.y, nbox.br.y) ) ) - offset;
|
|
217
|
+
maxx = Max(maxx, Max(nbox.tr.x, Max(nbox.bl.x, nbox.br.x) ) ) + offset;
|
|
218
|
+
maxy = Max(maxy, Max(nbox.tr.y, Max(nbox.bl.y, nbox.br.y) ) ) + offset;
|
|
219
|
+
|
|
220
|
+
nbax = minx;
|
|
221
|
+
nbay = miny;
|
|
222
|
+
nbaw = (maxx-minx);
|
|
223
|
+
nbah = (maxy-miny);
|
|
224
|
+
}
|
|
225
|
+
var sr_handle = svgFactory_.svgRoot().suspendRedraw(100);
|
|
226
|
+
|
|
227
|
+
var dstr = 'M' + nbax + ',' + nbay
|
|
228
|
+
+ ' L' + (nbax+nbaw) + ',' + nbay
|
|
229
|
+
+ ' ' + (nbax+nbaw) + ',' + (nbay+nbah)
|
|
230
|
+
+ ' ' + nbax + ',' + (nbay+nbah) + 'z';
|
|
231
|
+
selectedBox.setAttribute('d', dstr);
|
|
232
|
+
|
|
233
|
+
var xform = angle ? 'rotate(' + [angle,cx,cy].join(',') + ')' : '';
|
|
234
|
+
this.selectorGroup.setAttribute('transform', xform);
|
|
235
|
+
|
|
236
|
+
// TODO(codedread): Is this if needed?
|
|
237
|
+
// if(selected === selectedElements[0]) {
|
|
238
|
+
this.gripCoords = {
|
|
239
|
+
'nw': [nbax, nbay],
|
|
240
|
+
'ne': [nbax+nbaw, nbay],
|
|
241
|
+
'sw': [nbax, nbay+nbah],
|
|
242
|
+
'se': [nbax+nbaw, nbay+nbah],
|
|
243
|
+
'n': [nbax + (nbaw)/2, nbay],
|
|
244
|
+
'w': [nbax, nbay + (nbah)/2],
|
|
245
|
+
'e': [nbax + nbaw, nbay + (nbah)/2],
|
|
246
|
+
's': [nbax + (nbaw)/2, nbay + nbah]
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
for(var dir in this.gripCoords) {
|
|
250
|
+
var coords = this.gripCoords[dir];
|
|
251
|
+
selectedGrips[dir].setAttribute('cx', coords[0]);
|
|
252
|
+
selectedGrips[dir].setAttribute('cy', coords[1]);
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// we want to go 20 pixels in the negative transformed y direction, ignoring scale
|
|
256
|
+
mgr.rotateGripConnector.setAttribute('x1', nbax + (nbaw)/2);
|
|
257
|
+
mgr.rotateGripConnector.setAttribute('y1', nbay);
|
|
258
|
+
mgr.rotateGripConnector.setAttribute('x2', nbax + (nbaw)/2);
|
|
259
|
+
mgr.rotateGripConnector.setAttribute('y2', nbay - (gripRadius*5));
|
|
260
|
+
|
|
261
|
+
mgr.rotateGrip.setAttribute('cx', nbax + (nbaw)/2);
|
|
262
|
+
mgr.rotateGrip.setAttribute('cy', nbay - (gripRadius*5));
|
|
263
|
+
// }
|
|
264
|
+
|
|
265
|
+
svgFactory_.svgRoot().unsuspendRedraw(sr_handle);
|
|
266
|
+
};
|
|
267
|
+
|
|
268
|
+
|
|
269
|
+
// Class: svgedit.select.SelectorManager
|
|
270
|
+
svgedit.select.SelectorManager = function() {
|
|
271
|
+
// this will hold the <g> element that contains all selector rects/grips
|
|
272
|
+
this.selectorParentGroup = null;
|
|
273
|
+
|
|
274
|
+
// this is a special rect that is used for multi-select
|
|
275
|
+
this.rubberBandBox = null;
|
|
276
|
+
|
|
277
|
+
// this will hold objects of type svgedit.select.Selector (see above)
|
|
278
|
+
this.selectors = [];
|
|
279
|
+
|
|
280
|
+
// this holds a map of SVG elements to their Selector object
|
|
281
|
+
this.selectorMap = {};
|
|
282
|
+
|
|
283
|
+
// this holds a reference to the grip elements
|
|
284
|
+
this.selectorGrips = {
|
|
285
|
+
'nw': null,
|
|
286
|
+
'n' : null,
|
|
287
|
+
'ne': null,
|
|
288
|
+
'e' : null,
|
|
289
|
+
'se': null,
|
|
290
|
+
's' : null,
|
|
291
|
+
'sw': null,
|
|
292
|
+
'w' : null
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
this.selectorGripsGroup = null;
|
|
296
|
+
this.rotateGripConnector = null;
|
|
297
|
+
this.rotateGrip = null;
|
|
298
|
+
|
|
299
|
+
this.initGroup();
|
|
300
|
+
};
|
|
301
|
+
|
|
302
|
+
// Function: svgedit.select.SelectorManager.initGroup
|
|
303
|
+
// Resets the parent selector group element
|
|
304
|
+
svgedit.select.SelectorManager.prototype.initGroup = function() {
|
|
305
|
+
// remove old selector parent group if it existed
|
|
306
|
+
if (this.selectorParentGroup && this.selectorParentGroup.parentNode) {
|
|
307
|
+
this.selectorParentGroup.parentNode.removeChild(this.selectorParentGroup);
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// create parent selector group and add it to svgroot
|
|
311
|
+
this.selectorParentGroup = svgFactory_.createSVGElement({
|
|
312
|
+
'element': 'g',
|
|
313
|
+
'attr': {'id': 'selectorParentGroup'}
|
|
314
|
+
});
|
|
315
|
+
this.selectorGripsGroup = svgFactory_.createSVGElement({
|
|
316
|
+
'element': 'g',
|
|
317
|
+
'attr': {'display': 'none'}
|
|
318
|
+
});
|
|
319
|
+
this.selectorParentGroup.appendChild(this.selectorGripsGroup);
|
|
320
|
+
svgFactory_.svgRoot().appendChild(this.selectorParentGroup);
|
|
321
|
+
|
|
322
|
+
this.selectorMap = {};
|
|
323
|
+
this.selectors = [];
|
|
324
|
+
this.rubberBandBox = null;
|
|
325
|
+
|
|
326
|
+
// add the corner grips
|
|
327
|
+
for (var dir in this.selectorGrips) {
|
|
328
|
+
var grip = svgFactory_.createSVGElement({
|
|
329
|
+
'element': 'circle',
|
|
330
|
+
'attr': {
|
|
331
|
+
'id': ('selectorGrip_resize_' + dir),
|
|
332
|
+
'fill': '#22C',
|
|
333
|
+
'r': gripRadius,
|
|
334
|
+
'style': ('cursor:' + dir + '-resize'),
|
|
335
|
+
// This expands the mouse-able area of the grips making them
|
|
336
|
+
// easier to grab with the mouse.
|
|
337
|
+
// This works in Opera and WebKit, but does not work in Firefox
|
|
338
|
+
// see https://bugzilla.mozilla.org/show_bug.cgi?id=500174
|
|
339
|
+
'stroke-width': 2,
|
|
340
|
+
'pointer-events': 'all'
|
|
341
|
+
}
|
|
342
|
+
});
|
|
343
|
+
|
|
344
|
+
$.data(grip, 'dir', dir);
|
|
345
|
+
$.data(grip, 'type', 'resize');
|
|
346
|
+
this.selectorGrips[dir] = this.selectorGripsGroup.appendChild(grip);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// add rotator elems
|
|
350
|
+
this.rotateGripConnector = this.selectorGripsGroup.appendChild(
|
|
351
|
+
svgFactory_.createSVGElement({
|
|
352
|
+
'element': 'line',
|
|
353
|
+
'attr': {
|
|
354
|
+
'id': ('selectorGrip_rotateconnector'),
|
|
355
|
+
'stroke': '#22C',
|
|
356
|
+
'stroke-width': '1'
|
|
357
|
+
}
|
|
358
|
+
})
|
|
359
|
+
);
|
|
360
|
+
|
|
361
|
+
this.rotateGrip = this.selectorGripsGroup.appendChild(
|
|
362
|
+
svgFactory_.createSVGElement({
|
|
363
|
+
'element': 'circle',
|
|
364
|
+
'attr': {
|
|
365
|
+
'id': 'selectorGrip_rotate',
|
|
366
|
+
'fill': 'lime',
|
|
367
|
+
'r': gripRadius,
|
|
368
|
+
'stroke': '#22C',
|
|
369
|
+
'stroke-width': 2,
|
|
370
|
+
'style': 'cursor:url(' + config_.imgPath + 'rotate.png) 12 12, auto;'
|
|
371
|
+
}
|
|
372
|
+
})
|
|
373
|
+
);
|
|
374
|
+
$.data(this.rotateGrip, 'type', 'rotate');
|
|
375
|
+
|
|
376
|
+
if($('#canvasBackground').length) return;
|
|
377
|
+
|
|
378
|
+
var dims = config_.dimensions;
|
|
379
|
+
var canvasbg = svgFactory_.createSVGElement({
|
|
380
|
+
'element': 'svg',
|
|
381
|
+
'attr': {
|
|
382
|
+
'id': 'canvasBackground',
|
|
383
|
+
'width': dims[0],
|
|
384
|
+
'height': dims[1],
|
|
385
|
+
'x': 0,
|
|
386
|
+
'y': 0,
|
|
387
|
+
'overflow': (svgedit.browser.isWebkit() ? 'none' : 'visible'), // Chrome 7 has a problem with this when zooming out
|
|
388
|
+
'style': 'pointer-events:none'
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
|
|
392
|
+
var rect = svgFactory_.createSVGElement({
|
|
393
|
+
'element': 'rect',
|
|
394
|
+
'attr': {
|
|
395
|
+
'width': '100%',
|
|
396
|
+
'height': '100%',
|
|
397
|
+
'x': 0,
|
|
398
|
+
'y': 0,
|
|
399
|
+
'stroke-width': 1,
|
|
400
|
+
'stroke': '#000',
|
|
401
|
+
'fill': '#FFF',
|
|
402
|
+
'style': 'pointer-events:none'
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// Both Firefox and WebKit are too slow with this filter region (especially at higher
|
|
407
|
+
// zoom levels) and Opera has at least one bug
|
|
408
|
+
// if (!svgedit.browser.isOpera()) rect.setAttribute('filter', 'url(#canvashadow)');
|
|
409
|
+
canvasbg.appendChild(rect);
|
|
410
|
+
svgFactory_.svgRoot().insertBefore(canvasbg, svgFactory_.svgContent());
|
|
411
|
+
};
|
|
412
|
+
|
|
413
|
+
// Function: svgedit.select.SelectorManager.requestSelector
|
|
414
|
+
// Returns the selector based on the given element
|
|
415
|
+
//
|
|
416
|
+
// Parameters:
|
|
417
|
+
// elem - DOM element to get the selector for
|
|
418
|
+
svgedit.select.SelectorManager.prototype.requestSelector = function(elem) {
|
|
419
|
+
if (elem == null) return null;
|
|
420
|
+
var N = this.selectors.length;
|
|
421
|
+
// If we've already acquired one for this element, return it.
|
|
422
|
+
if (typeof(this.selectorMap[elem.id]) == 'object') {
|
|
423
|
+
this.selectorMap[elem.id].locked = true;
|
|
424
|
+
return this.selectorMap[elem.id];
|
|
425
|
+
}
|
|
426
|
+
for (var i = 0; i < N; ++i) {
|
|
427
|
+
if (this.selectors[i] && !this.selectors[i].locked) {
|
|
428
|
+
this.selectors[i].locked = true;
|
|
429
|
+
this.selectors[i].reset(elem);
|
|
430
|
+
this.selectorMap[elem.id] = this.selectors[i];
|
|
431
|
+
return this.selectors[i];
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
// if we reached here, no available selectors were found, we create one
|
|
435
|
+
this.selectors[N] = new svgedit.select.Selector(N, elem);
|
|
436
|
+
this.selectorParentGroup.appendChild(this.selectors[N].selectorGroup);
|
|
437
|
+
this.selectorMap[elem.id] = this.selectors[N];
|
|
438
|
+
return this.selectors[N];
|
|
439
|
+
};
|
|
440
|
+
|
|
441
|
+
// Function: svgedit.select.SelectorManager.releaseSelector
|
|
442
|
+
// Removes the selector of the given element (hides selection box)
|
|
443
|
+
//
|
|
444
|
+
// Parameters:
|
|
445
|
+
// elem - DOM element to remove the selector for
|
|
446
|
+
svgedit.select.SelectorManager.prototype.releaseSelector = function(elem) {
|
|
447
|
+
if (elem == null) return;
|
|
448
|
+
var N = this.selectors.length,
|
|
449
|
+
sel = this.selectorMap[elem.id];
|
|
450
|
+
for (var i = 0; i < N; ++i) {
|
|
451
|
+
if (this.selectors[i] && this.selectors[i] == sel) {
|
|
452
|
+
if (sel.locked == false) {
|
|
453
|
+
// TODO(codedread): Ensure this exists in this module.
|
|
454
|
+
console.log('WARNING! selector was released but was already unlocked');
|
|
455
|
+
}
|
|
456
|
+
delete this.selectorMap[elem.id];
|
|
457
|
+
sel.locked = false;
|
|
458
|
+
sel.selectedElement = null;
|
|
459
|
+
sel.showGrips(false);
|
|
460
|
+
|
|
461
|
+
// remove from DOM and store reference in JS but only if it exists in the DOM
|
|
462
|
+
try {
|
|
463
|
+
sel.selectorGroup.setAttribute('display', 'none');
|
|
464
|
+
} catch(e) { }
|
|
465
|
+
|
|
466
|
+
break;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
};
|
|
470
|
+
|
|
471
|
+
// Function: svgedit.select.SelectorManager.getRubberBandBox
|
|
472
|
+
// Returns the rubberBandBox DOM element. This is the rectangle drawn by the user for selecting/zooming
|
|
473
|
+
svgedit.select.SelectorManager.prototype.getRubberBandBox = function() {
|
|
474
|
+
if (!this.rubberBandBox) {
|
|
475
|
+
this.rubberBandBox = this.selectorParentGroup.appendChild(
|
|
476
|
+
svgFactory_.createSVGElement({
|
|
477
|
+
'element': 'rect',
|
|
478
|
+
'attr': {
|
|
479
|
+
'id': 'selectorRubberBand',
|
|
480
|
+
'fill': '#22C',
|
|
481
|
+
'fill-opacity': 0.15,
|
|
482
|
+
'stroke': '#22C',
|
|
483
|
+
'stroke-width': 0.5,
|
|
484
|
+
'display': 'none',
|
|
485
|
+
'style': 'pointer-events:none'
|
|
486
|
+
}
|
|
487
|
+
})
|
|
488
|
+
);
|
|
489
|
+
}
|
|
490
|
+
return this.rubberBandBox;
|
|
491
|
+
};
|
|
492
|
+
|
|
493
|
+
|
|
494
|
+
/**
|
|
495
|
+
* Interface: svgedit.select.SVGFactory
|
|
496
|
+
* An object that creates SVG elements for the canvas.
|
|
497
|
+
*
|
|
498
|
+
* interface svgedit.select.SVGFactory {
|
|
499
|
+
* SVGElement createSVGElement(jsonMap);
|
|
500
|
+
* SVGSVGElement svgRoot();
|
|
501
|
+
* SVGSVGElement svgContent();
|
|
502
|
+
*
|
|
503
|
+
* Number currentZoom();
|
|
504
|
+
* Object getStrokedBBox(Element[]); // TODO(codedread): Remove when getStrokedBBox() has been put into svgutils.js
|
|
505
|
+
* }
|
|
506
|
+
*/
|
|
507
|
+
|
|
508
|
+
/**
|
|
509
|
+
* Function: svgedit.select.init()
|
|
510
|
+
* Initializes this module.
|
|
511
|
+
*
|
|
512
|
+
* Parameters:
|
|
513
|
+
* config - an object containing configurable parameters (imgPath)
|
|
514
|
+
* svgFactory - an object implementing the SVGFactory interface (see above).
|
|
515
|
+
*/
|
|
516
|
+
svgedit.select.init = function(config, svgFactory) {
|
|
517
|
+
config_ = config;
|
|
518
|
+
svgFactory_ = svgFactory;
|
|
519
|
+
selectorManager_ = new svgedit.select.SelectorManager();
|
|
520
|
+
};
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Function: svgedit.select.getSelectorManager
|
|
524
|
+
*
|
|
525
|
+
* Returns:
|
|
526
|
+
* The SelectorManager instance.
|
|
527
|
+
*/
|
|
528
|
+
svgedit.select.getSelectorManager = function() {
|
|
529
|
+
return selectorManager_;
|
|
530
|
+
};
|
|
531
|
+
|
|
532
|
+
})();
|