sketchily 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (284) hide show
  1. data/MIT-LICENSE +20 -0
  2. data/README.md +39 -0
  3. data/Rakefile +40 -0
  4. data/app/helpers/sketchily.rb~ +10 -0
  5. data/app/helpers/sketchily_helper.rb +10 -0
  6. data/app/views/sketchily/_embed.html.erb +28 -0
  7. data/app/views/sketchily/_embed.html.erb~ +28 -0
  8. data/app/views/sketchily/_embed.js.erb +50 -0
  9. data/app/views/sketchily/_embed.js.erb~ +50 -0
  10. data/app/views/sketchily/_sketchily.html.erb +23 -0
  11. data/app/views/sketchily/_sketchily.html.erb~ +23 -0
  12. data/app/views/sketchily/_sketchily_tag.html.erb +21 -0
  13. data/app/views/sketchily/_sketchily_tag.html.erb~ +21 -0
  14. data/app/views/sketchily/_svg_edit_tag.html.erb~ +51 -0
  15. data/app/views/sketchily/svg_edit_tag_.html~ +35 -0
  16. data/lib/sketchily.rb +15 -0
  17. data/lib/sketchily.rb~ +16 -0
  18. data/lib/sketchily/engine.rb +4 -0
  19. data/lib/sketchily/sketchily.rb +28 -0
  20. data/lib/sketchily/sketchily_show.rb~ +13 -0
  21. data/lib/sketchily/sketchily_tag.rb +15 -0
  22. data/lib/sketchily/svg_edit_tag.rb~ +9 -0
  23. data/lib/sketchily/version.rb +3 -0
  24. data/lib/sketchily/version.rb~ +3 -0
  25. data/spec/dummy/README.rdoc +261 -0
  26. data/spec/dummy/Rakefile +7 -0
  27. data/spec/dummy/app/assets/javascripts/application.js +15 -0
  28. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  29. data/spec/dummy/app/controllers/application_controller.rb +3 -0
  30. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  31. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  32. data/spec/dummy/config.ru +4 -0
  33. data/spec/dummy/config/application.rb +59 -0
  34. data/spec/dummy/config/boot.rb +10 -0
  35. data/spec/dummy/config/database.yml +25 -0
  36. data/spec/dummy/config/environment.rb +5 -0
  37. data/spec/dummy/config/environments/development.rb +37 -0
  38. data/spec/dummy/config/environments/production.rb +67 -0
  39. data/spec/dummy/config/environments/test.rb +37 -0
  40. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  41. data/spec/dummy/config/initializers/inflections.rb +15 -0
  42. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  43. data/spec/dummy/config/initializers/secret_token.rb +7 -0
  44. data/spec/dummy/config/initializers/session_store.rb +8 -0
  45. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  46. data/spec/dummy/config/locales/en.yml +5 -0
  47. data/spec/dummy/config/routes.rb +58 -0
  48. data/spec/dummy/public/404.html +26 -0
  49. data/spec/dummy/public/422.html +26 -0
  50. data/spec/dummy/public/500.html +25 -0
  51. data/spec/dummy/public/favicon.ico +0 -0
  52. data/spec/dummy/script/rails +6 -0
  53. data/spec/lib/sketchily_spec.rb +0 -0
  54. data/spec/spec_helper.rb +11 -0
  55. data/vendor/assets/svg-edit-2.6/browser-not-supported.html +27 -0
  56. data/vendor/assets/svg-edit-2.6/browser.js +180 -0
  57. data/vendor/assets/svg-edit-2.6/canvg/canvg.js +2620 -0
  58. data/vendor/assets/svg-edit-2.6/canvg/rgbcolor.js +287 -0
  59. data/vendor/assets/svg-edit-2.6/contextmenu.js +67 -0
  60. data/vendor/assets/svg-edit-2.6/contextmenu/jquery.contextMenu.js +203 -0
  61. data/vendor/assets/svg-edit-2.6/draw.js +528 -0
  62. data/vendor/assets/svg-edit-2.6/embedapi.html +56 -0
  63. data/vendor/assets/svg-edit-2.6/embedapi.js +173 -0
  64. data/vendor/assets/svg-edit-2.6/extensions/closepath_icons.svg +41 -0
  65. data/vendor/assets/svg-edit-2.6/extensions/ext-arrows.js +298 -0
  66. data/vendor/assets/svg-edit-2.6/extensions/ext-closepath.js +92 -0
  67. data/vendor/assets/svg-edit-2.6/extensions/ext-connector.js +587 -0
  68. data/vendor/assets/svg-edit-2.6/extensions/ext-eyedropper.js +109 -0
  69. data/vendor/assets/svg-edit-2.6/extensions/ext-foreignobject.js +277 -0
  70. data/vendor/assets/svg-edit-2.6/extensions/ext-grid.js +184 -0
  71. data/vendor/assets/svg-edit-2.6/extensions/ext-helloworld.js +78 -0
  72. data/vendor/assets/svg-edit-2.6/extensions/ext-imagelib.js +453 -0
  73. data/vendor/assets/svg-edit-2.6/extensions/ext-imagelib.xml +14 -0
  74. data/vendor/assets/svg-edit-2.6/extensions/ext-markers.js +572 -0
  75. data/vendor/assets/svg-edit-2.6/extensions/ext-server_moinsave.js +56 -0
  76. data/vendor/assets/svg-edit-2.6/extensions/ext-server_opensave.js +180 -0
  77. data/vendor/assets/svg-edit-2.6/extensions/ext-shapes.js +387 -0
  78. data/vendor/assets/svg-edit-2.6/extensions/ext-shapes.xml +10 -0
  79. data/vendor/assets/svg-edit-2.6/extensions/eyedropper-icon.xml +34 -0
  80. data/vendor/assets/svg-edit-2.6/extensions/eyedropper.png +0 -0
  81. data/vendor/assets/svg-edit-2.6/extensions/fileopen.php +31 -0
  82. data/vendor/assets/svg-edit-2.6/extensions/filesave.php +44 -0
  83. data/vendor/assets/svg-edit-2.6/extensions/foreignobject-icons.xml +96 -0
  84. data/vendor/assets/svg-edit-2.6/extensions/grid-icon.xml +30 -0
  85. data/vendor/assets/svg-edit-2.6/extensions/helloworld-icon.xml +21 -0
  86. data/vendor/assets/svg-edit-2.6/extensions/imagelib/index.html +64 -0
  87. data/vendor/assets/svg-edit-2.6/extensions/imagelib/smiley.svg +12 -0
  88. data/vendor/assets/svg-edit-2.6/extensions/markers-icons.xml +115 -0
  89. data/vendor/assets/svg-edit-2.6/extensions/shapelib/animal.json +21 -0
  90. data/vendor/assets/svg-edit-2.6/extensions/shapelib/arrow.json +28 -0
  91. data/vendor/assets/svg-edit-2.6/extensions/shapelib/dialog_balloon.json +9 -0
  92. data/vendor/assets/svg-edit-2.6/extensions/shapelib/electronics.json +20 -0
  93. data/vendor/assets/svg-edit-2.6/extensions/shapelib/flowchart.json +25 -0
  94. data/vendor/assets/svg-edit-2.6/extensions/shapelib/game.json +13 -0
  95. data/vendor/assets/svg-edit-2.6/extensions/shapelib/math.json +9 -0
  96. data/vendor/assets/svg-edit-2.6/extensions/shapelib/misc.json +37 -0
  97. data/vendor/assets/svg-edit-2.6/extensions/shapelib/music.json +21 -0
  98. data/vendor/assets/svg-edit-2.6/extensions/shapelib/object.json +19 -0
  99. data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael.txt +12 -0
  100. data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael_1.json +67 -0
  101. data/vendor/assets/svg-edit-2.6/extensions/shapelib/raphael_2.json +64 -0
  102. data/vendor/assets/svg-edit-2.6/extensions/shapelib/symbol.json +28 -0
  103. data/vendor/assets/svg-edit-2.6/history.js +601 -0
  104. data/vendor/assets/svg-edit-2.6/images/README.txt +61 -0
  105. data/vendor/assets/svg-edit-2.6/images/align-bottom.png +0 -0
  106. data/vendor/assets/svg-edit-2.6/images/align-bottom.svg +277 -0
  107. data/vendor/assets/svg-edit-2.6/images/align-center.png +0 -0
  108. data/vendor/assets/svg-edit-2.6/images/align-center.svg +252 -0
  109. data/vendor/assets/svg-edit-2.6/images/align-left.png +0 -0
  110. data/vendor/assets/svg-edit-2.6/images/align-left.svg +235 -0
  111. data/vendor/assets/svg-edit-2.6/images/align-middle.png +0 -0
  112. data/vendor/assets/svg-edit-2.6/images/align-middle.svg +250 -0
  113. data/vendor/assets/svg-edit-2.6/images/align-right.png +0 -0
  114. data/vendor/assets/svg-edit-2.6/images/align-right.svg +233 -0
  115. data/vendor/assets/svg-edit-2.6/images/align-top.png +0 -0
  116. data/vendor/assets/svg-edit-2.6/images/align-top.svg +233 -0
  117. data/vendor/assets/svg-edit-2.6/images/bold.png +0 -0
  118. data/vendor/assets/svg-edit-2.6/images/cancel.png +0 -0
  119. data/vendor/assets/svg-edit-2.6/images/circle.png +0 -0
  120. data/vendor/assets/svg-edit-2.6/images/clear.png +0 -0
  121. data/vendor/assets/svg-edit-2.6/images/clone.png +0 -0
  122. data/vendor/assets/svg-edit-2.6/images/conn.svg +29 -0
  123. data/vendor/assets/svg-edit-2.6/images/copy.png +0 -0
  124. data/vendor/assets/svg-edit-2.6/images/cut.png +0 -0
  125. data/vendor/assets/svg-edit-2.6/images/delete.png +0 -0
  126. data/vendor/assets/svg-edit-2.6/images/document-properties.png +0 -0
  127. data/vendor/assets/svg-edit-2.6/images/dropdown.gif +0 -0
  128. data/vendor/assets/svg-edit-2.6/images/ellipse.png +0 -0
  129. data/vendor/assets/svg-edit-2.6/images/eye.png +0 -0
  130. data/vendor/assets/svg-edit-2.6/images/fhpath.png +0 -0
  131. data/vendor/assets/svg-edit-2.6/images/flyouth.png +0 -0
  132. data/vendor/assets/svg-edit-2.6/images/flyup.gif +0 -0
  133. data/vendor/assets/svg-edit-2.6/images/freehand-circle.png +0 -0
  134. data/vendor/assets/svg-edit-2.6/images/freehand-square.png +0 -0
  135. data/vendor/assets/svg-edit-2.6/images/go-down.png +0 -0
  136. data/vendor/assets/svg-edit-2.6/images/go-up.png +0 -0
  137. data/vendor/assets/svg-edit-2.6/images/image.png +0 -0
  138. data/vendor/assets/svg-edit-2.6/images/italic.png +0 -0
  139. data/vendor/assets/svg-edit-2.6/images/line.png +0 -0
  140. data/vendor/assets/svg-edit-2.6/images/link_controls.png +0 -0
  141. data/vendor/assets/svg-edit-2.6/images/logo.png +0 -0
  142. data/vendor/assets/svg-edit-2.6/images/logo.svg +32 -0
  143. data/vendor/assets/svg-edit-2.6/images/move_bottom.png +0 -0
  144. data/vendor/assets/svg-edit-2.6/images/move_top.png +0 -0
  145. data/vendor/assets/svg-edit-2.6/images/node_clone.png +0 -0
  146. data/vendor/assets/svg-edit-2.6/images/node_delete.png +0 -0
  147. data/vendor/assets/svg-edit-2.6/images/none.png +0 -0
  148. data/vendor/assets/svg-edit-2.6/images/open.png +0 -0
  149. data/vendor/assets/svg-edit-2.6/images/paste.png +0 -0
  150. data/vendor/assets/svg-edit-2.6/images/path.png +0 -0
  151. data/vendor/assets/svg-edit-2.6/images/polygon.png +0 -0
  152. data/vendor/assets/svg-edit-2.6/images/polygon.svg +219 -0
  153. data/vendor/assets/svg-edit-2.6/images/rect.png +0 -0
  154. data/vendor/assets/svg-edit-2.6/images/redo.png +0 -0
  155. data/vendor/assets/svg-edit-2.6/images/reorient.png +0 -0
  156. data/vendor/assets/svg-edit-2.6/images/rotate.png +0 -0
  157. data/vendor/assets/svg-edit-2.6/images/save.png +0 -0
  158. data/vendor/assets/svg-edit-2.6/images/select.png +0 -0
  159. data/vendor/assets/svg-edit-2.6/images/select_node.png +0 -0
  160. data/vendor/assets/svg-edit-2.6/images/sep.png +0 -0
  161. data/vendor/assets/svg-edit-2.6/images/shape_group.png +0 -0
  162. data/vendor/assets/svg-edit-2.6/images/shape_ungroup.png +0 -0
  163. data/vendor/assets/svg-edit-2.6/images/source.png +0 -0
  164. data/vendor/assets/svg-edit-2.6/images/spinbtn_updn_big.png +0 -0
  165. data/vendor/assets/svg-edit-2.6/images/square.png +0 -0
  166. data/vendor/assets/svg-edit-2.6/images/svg_edit_icons.svg +1034 -0
  167. data/vendor/assets/svg-edit-2.6/images/svg_edit_icons.svgz +0 -0
  168. data/vendor/assets/svg-edit-2.6/images/text.png +0 -0
  169. data/vendor/assets/svg-edit-2.6/images/text.svg +157 -0
  170. data/vendor/assets/svg-edit-2.6/images/to_path.png +0 -0
  171. data/vendor/assets/svg-edit-2.6/images/undo.png +0 -0
  172. data/vendor/assets/svg-edit-2.6/images/view-refresh.png +0 -0
  173. data/vendor/assets/svg-edit-2.6/images/wave.png +0 -0
  174. data/vendor/assets/svg-edit-2.6/images/wireframe.png +0 -0
  175. data/vendor/assets/svg-edit-2.6/images/zoom.png +0 -0
  176. data/vendor/assets/svg-edit-2.6/jgraduate/LICENSE +202 -0
  177. data/vendor/assets/svg-edit-2.6/jgraduate/README +3 -0
  178. data/vendor/assets/svg-edit-2.6/jgraduate/css/jPicker.css +1 -0
  179. data/vendor/assets/svg-edit-2.6/jgraduate/css/jgraduate.css +351 -0
  180. data/vendor/assets/svg-edit-2.6/jgraduate/images/AlphaBar.png +0 -0
  181. data/vendor/assets/svg-edit-2.6/jgraduate/images/Bars.png +0 -0
  182. data/vendor/assets/svg-edit-2.6/jgraduate/images/Maps.png +0 -0
  183. data/vendor/assets/svg-edit-2.6/jgraduate/images/NoColor.png +0 -0
  184. data/vendor/assets/svg-edit-2.6/jgraduate/images/bar-opacity.png +0 -0
  185. data/vendor/assets/svg-edit-2.6/jgraduate/images/map-opacity.png +0 -0
  186. data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint.gif +0 -0
  187. data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint_c.png +0 -0
  188. data/vendor/assets/svg-edit-2.6/jgraduate/images/mappoint_f.png +0 -0
  189. data/vendor/assets/svg-edit-2.6/jgraduate/images/picker.gif +0 -0
  190. data/vendor/assets/svg-edit-2.6/jgraduate/images/preview-opacity.png +0 -0
  191. data/vendor/assets/svg-edit-2.6/jgraduate/images/rangearrows.gif +0 -0
  192. data/vendor/assets/svg-edit-2.6/jgraduate/images/rangearrows2.gif +0 -0
  193. data/vendor/assets/svg-edit-2.6/jgraduate/jpicker.js +2091 -0
  194. data/vendor/assets/svg-edit-2.6/jgraduate/jpicker.min.js +1 -0
  195. data/vendor/assets/svg-edit-2.6/jgraduate/jquery.jgraduate.js +1175 -0
  196. data/vendor/assets/svg-edit-2.6/jgraduate/jquery.jgraduate.min.js +37 -0
  197. data/vendor/assets/svg-edit-2.6/jquery-ui/jquery-ui-1.8.17.custom.min.js +54 -0
  198. data/vendor/assets/svg-edit-2.6/jquery-ui/jquery-ui-1.8.custom.min.js +84 -0
  199. data/vendor/assets/svg-edit-2.6/jquery.js +4 -0
  200. data/vendor/assets/svg-edit-2.6/jquerybbq/jquery.bbq.min.js +18 -0
  201. data/vendor/assets/svg-edit-2.6/js-hotkeys/README.md +45 -0
  202. data/vendor/assets/svg-edit-2.6/js-hotkeys/jquery.hotkeys.min.js +15 -0
  203. data/vendor/assets/svg-edit-2.6/locale/README.txt +17 -0
  204. data/vendor/assets/svg-edit-2.6/locale/lang.af.js +234 -0
  205. data/vendor/assets/svg-edit-2.6/locale/lang.ar.js +234 -0
  206. data/vendor/assets/svg-edit-2.6/locale/lang.az.js +234 -0
  207. data/vendor/assets/svg-edit-2.6/locale/lang.be.js +234 -0
  208. data/vendor/assets/svg-edit-2.6/locale/lang.bg.js +234 -0
  209. data/vendor/assets/svg-edit-2.6/locale/lang.ca.js +234 -0
  210. data/vendor/assets/svg-edit-2.6/locale/lang.cs.js +234 -0
  211. data/vendor/assets/svg-edit-2.6/locale/lang.cy.js +234 -0
  212. data/vendor/assets/svg-edit-2.6/locale/lang.da.js +234 -0
  213. data/vendor/assets/svg-edit-2.6/locale/lang.de.js +234 -0
  214. data/vendor/assets/svg-edit-2.6/locale/lang.el.js +234 -0
  215. data/vendor/assets/svg-edit-2.6/locale/lang.en.js +234 -0
  216. data/vendor/assets/svg-edit-2.6/locale/lang.es.js +234 -0
  217. data/vendor/assets/svg-edit-2.6/locale/lang.et.js +234 -0
  218. data/vendor/assets/svg-edit-2.6/locale/lang.fa.js +234 -0
  219. data/vendor/assets/svg-edit-2.6/locale/lang.fi.js +234 -0
  220. data/vendor/assets/svg-edit-2.6/locale/lang.fr.js +234 -0
  221. data/vendor/assets/svg-edit-2.6/locale/lang.fy.js +234 -0
  222. data/vendor/assets/svg-edit-2.6/locale/lang.ga.js +234 -0
  223. data/vendor/assets/svg-edit-2.6/locale/lang.gl.js +234 -0
  224. data/vendor/assets/svg-edit-2.6/locale/lang.he.js +234 -0
  225. data/vendor/assets/svg-edit-2.6/locale/lang.hi.js +234 -0
  226. data/vendor/assets/svg-edit-2.6/locale/lang.hr.js +234 -0
  227. data/vendor/assets/svg-edit-2.6/locale/lang.hu.js +234 -0
  228. data/vendor/assets/svg-edit-2.6/locale/lang.hy.js +234 -0
  229. data/vendor/assets/svg-edit-2.6/locale/lang.id.js +234 -0
  230. data/vendor/assets/svg-edit-2.6/locale/lang.is.js +234 -0
  231. data/vendor/assets/svg-edit-2.6/locale/lang.it.js +234 -0
  232. data/vendor/assets/svg-edit-2.6/locale/lang.ja.js +234 -0
  233. data/vendor/assets/svg-edit-2.6/locale/lang.ko.js +234 -0
  234. data/vendor/assets/svg-edit-2.6/locale/lang.lt.js +234 -0
  235. data/vendor/assets/svg-edit-2.6/locale/lang.lv.js +234 -0
  236. data/vendor/assets/svg-edit-2.6/locale/lang.mk.js +234 -0
  237. data/vendor/assets/svg-edit-2.6/locale/lang.ms.js +234 -0
  238. data/vendor/assets/svg-edit-2.6/locale/lang.mt.js +234 -0
  239. data/vendor/assets/svg-edit-2.6/locale/lang.nl.js +234 -0
  240. data/vendor/assets/svg-edit-2.6/locale/lang.no.js +234 -0
  241. data/vendor/assets/svg-edit-2.6/locale/lang.pl.js +234 -0
  242. data/vendor/assets/svg-edit-2.6/locale/lang.pt-BR.js +234 -0
  243. data/vendor/assets/svg-edit-2.6/locale/lang.pt-PT.js +234 -0
  244. data/vendor/assets/svg-edit-2.6/locale/lang.ro.js +234 -0
  245. data/vendor/assets/svg-edit-2.6/locale/lang.ru.js +234 -0
  246. data/vendor/assets/svg-edit-2.6/locale/lang.sk.js +234 -0
  247. data/vendor/assets/svg-edit-2.6/locale/lang.sl.js +234 -0
  248. data/vendor/assets/svg-edit-2.6/locale/lang.sq.js +234 -0
  249. data/vendor/assets/svg-edit-2.6/locale/lang.sr.js +234 -0
  250. data/vendor/assets/svg-edit-2.6/locale/lang.sv.js +234 -0
  251. data/vendor/assets/svg-edit-2.6/locale/lang.sw.js +234 -0
  252. data/vendor/assets/svg-edit-2.6/locale/lang.test.js +234 -0
  253. data/vendor/assets/svg-edit-2.6/locale/lang.th.js +234 -0
  254. data/vendor/assets/svg-edit-2.6/locale/lang.tl.js +234 -0
  255. data/vendor/assets/svg-edit-2.6/locale/lang.tr.js +234 -0
  256. data/vendor/assets/svg-edit-2.6/locale/lang.uk.js +234 -0
  257. data/vendor/assets/svg-edit-2.6/locale/lang.vi.js +234 -0
  258. data/vendor/assets/svg-edit-2.6/locale/lang.yi.js +234 -0
  259. data/vendor/assets/svg-edit-2.6/locale/lang.zh-CN.js +234 -0
  260. data/vendor/assets/svg-edit-2.6/locale/lang.zh-HK.js +234 -0
  261. data/vendor/assets/svg-edit-2.6/locale/lang.zh-TW.js +234 -0
  262. data/vendor/assets/svg-edit-2.6/locale/locale.js +320 -0
  263. data/vendor/assets/svg-edit-2.6/math.js +246 -0
  264. data/vendor/assets/svg-edit-2.6/path.js +980 -0
  265. data/vendor/assets/svg-edit-2.6/sanitize.js +273 -0
  266. data/vendor/assets/svg-edit-2.6/select.js +532 -0
  267. data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.css +41 -0
  268. data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.js +266 -0
  269. data/vendor/assets/svg-edit-2.6/spinbtn/JQuerySpinBtn.min.js +7 -0
  270. data/vendor/assets/svg-edit-2.6/spinbtn/spinbtn_updn.png +0 -0
  271. data/vendor/assets/svg-edit-2.6/svg-editor.css +1495 -0
  272. data/vendor/assets/svg-edit-2.6/svg-editor.css~ +1500 -0
  273. data/vendor/assets/svg-edit-2.6/svg-editor.html +788 -0
  274. data/vendor/assets/svg-edit-2.6/svg-editor.html~ +788 -0
  275. data/vendor/assets/svg-edit-2.6/svg-editor.js +4969 -0
  276. data/vendor/assets/svg-edit-2.6/svg-editor.manifest +121 -0
  277. data/vendor/assets/svg-edit-2.6/svgcanvas.js +8775 -0
  278. data/vendor/assets/svg-edit-2.6/svgedit.compiled.js +465 -0
  279. data/vendor/assets/svg-edit-2.6/svgicons/jquery.svgicons.js +486 -0
  280. data/vendor/assets/svg-edit-2.6/svgtransformlist.js +291 -0
  281. data/vendor/assets/svg-edit-2.6/svgutils.js +651 -0
  282. data/vendor/assets/svg-edit-2.6/touch.js +30 -0
  283. data/vendor/assets/svg-edit-2.6/units.js +281 -0
  284. 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
+ })();