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,528 @@
1
+ /**
2
+ * Package: svgedit.draw
3
+ *
4
+ * Licensed under the MIT License
5
+ *
6
+ * Copyright(c) 2011 Jeff Schiller
7
+ */
8
+
9
+ // Dependencies:
10
+ // 1) jQuery
11
+ // 2) browser.js
12
+ // 3) svgutils.js
13
+
14
+ var svgedit = svgedit || {};
15
+
16
+ (function() {
17
+
18
+ if (!svgedit.draw) {
19
+ svgedit.draw = {};
20
+ }
21
+
22
+ var svg_ns = "http://www.w3.org/2000/svg";
23
+ var se_ns = "http://svg-edit.googlecode.com";
24
+ var xmlns_ns = "http://www.w3.org/2000/xmlns/";
25
+
26
+ var visElems = 'a,circle,ellipse,foreignObject,g,image,line,path,polygon,polyline,rect,svg,text,tspan,use';
27
+ var visElems_arr = visElems.split(',');
28
+
29
+ var RandomizeModes = {
30
+ LET_DOCUMENT_DECIDE: 0,
31
+ ALWAYS_RANDOMIZE: 1,
32
+ NEVER_RANDOMIZE: 2
33
+ };
34
+ var randomize_ids = RandomizeModes.LET_DOCUMENT_DECIDE;
35
+
36
+ /**
37
+ * This class encapsulates the concept of a layer in the drawing
38
+ * @param name {String} Layer name
39
+ * @param child {SVGGElement} Layer SVG group.
40
+ */
41
+ svgedit.draw.Layer = function(name, group) {
42
+ this.name_ = name;
43
+ this.group_ = group;
44
+ };
45
+
46
+ svgedit.draw.Layer.prototype.getName = function() {
47
+ return this.name_;
48
+ };
49
+
50
+ svgedit.draw.Layer.prototype.getGroup = function() {
51
+ return this.group_;
52
+ };
53
+
54
+
55
+ // Called to ensure that drawings will or will not have randomized ids.
56
+ // The current_drawing will have its nonce set if it doesn't already.
57
+ //
58
+ // Params:
59
+ // enableRandomization - flag indicating if documents should have randomized ids
60
+ svgedit.draw.randomizeIds = function(enableRandomization, current_drawing) {
61
+ randomize_ids = enableRandomization == false ?
62
+ RandomizeModes.NEVER_RANDOMIZE :
63
+ RandomizeModes.ALWAYS_RANDOMIZE;
64
+
65
+ if (randomize_ids == RandomizeModes.ALWAYS_RANDOMIZE && !current_drawing.getNonce()) {
66
+ current_drawing.setNonce(Math.floor(Math.random() * 100001));
67
+ } else if (randomize_ids == RandomizeModes.NEVER_RANDOMIZE && current_drawing.getNonce()) {
68
+ current_drawing.clearNonce();
69
+ }
70
+ };
71
+
72
+ /**
73
+ * This class encapsulates the concept of a SVG-edit drawing
74
+ *
75
+ * @param svgElem {SVGSVGElement} The SVG DOM Element that this JS object
76
+ * encapsulates. If the svgElem has a se:nonce attribute on it, then
77
+ * IDs will use the nonce as they are generated.
78
+ * @param opt_idPrefix {String} The ID prefix to use. Defaults to "svg_"
79
+ * if not specified.
80
+ */
81
+ svgedit.draw.Drawing = function(svgElem, opt_idPrefix) {
82
+ if (!svgElem || !svgElem.tagName || !svgElem.namespaceURI ||
83
+ svgElem.tagName != 'svg' || svgElem.namespaceURI != svg_ns) {
84
+ throw "Error: svgedit.draw.Drawing instance initialized without a <svg> element";
85
+ }
86
+
87
+ /**
88
+ * The SVG DOM Element that represents this drawing.
89
+ * @type {SVGSVGElement}
90
+ */
91
+ this.svgElem_ = svgElem;
92
+
93
+ /**
94
+ * The latest object number used in this drawing.
95
+ * @type {number}
96
+ */
97
+ this.obj_num = 0;
98
+
99
+ /**
100
+ * The prefix to prepend to each element id in the drawing.
101
+ * @type {String}
102
+ */
103
+ this.idPrefix = opt_idPrefix || "svg_";
104
+
105
+ /**
106
+ * An array of released element ids to immediately reuse.
107
+ * @type {Array.<number>}
108
+ */
109
+ this.releasedNums = [];
110
+
111
+ /**
112
+ * The z-ordered array of tuples containing layer names and <g> elements.
113
+ * The first layer is the one at the bottom of the rendering.
114
+ * TODO: Turn this into an Array.<Layer>
115
+ * @type {Array.<Array.<String, SVGGElement>>}
116
+ */
117
+ this.all_layers = [];
118
+
119
+ /**
120
+ * The current layer being used.
121
+ * TODO: Make this a {Layer}.
122
+ * @type {SVGGElement}
123
+ */
124
+ this.current_layer = null;
125
+
126
+ /**
127
+ * The nonce to use to uniquely identify elements across drawings.
128
+ * @type {!String}
129
+ */
130
+ this.nonce_ = "";
131
+ var n = this.svgElem_.getAttributeNS(se_ns, 'nonce');
132
+ // If already set in the DOM, use the nonce throughout the document
133
+ // else, if randomizeIds(true) has been called, create and set the nonce.
134
+ if (!!n && randomize_ids != RandomizeModes.NEVER_RANDOMIZE) {
135
+ this.nonce_ = n;
136
+ } else if (randomize_ids == RandomizeModes.ALWAYS_RANDOMIZE) {
137
+ this.setNonce(Math.floor(Math.random() * 100001));
138
+ }
139
+ };
140
+
141
+ svgedit.draw.Drawing.prototype.getElem_ = function(id) {
142
+ if(this.svgElem_.querySelector) {
143
+ // querySelector lookup
144
+ return this.svgElem_.querySelector('#'+id);
145
+ } else {
146
+ // jQuery lookup: twice as slow as xpath in FF
147
+ return $(this.svgElem_).find('[id=' + id + ']')[0];
148
+ }
149
+ };
150
+
151
+ svgedit.draw.Drawing.prototype.getSvgElem = function() {
152
+ return this.svgElem_;
153
+ };
154
+
155
+ svgedit.draw.Drawing.prototype.getNonce = function() {
156
+ return this.nonce_;
157
+ };
158
+
159
+ svgedit.draw.Drawing.prototype.setNonce = function(n) {
160
+ this.svgElem_.setAttributeNS(xmlns_ns, 'xmlns:se', se_ns);
161
+ this.svgElem_.setAttributeNS(se_ns, 'se:nonce', n);
162
+ this.nonce_ = n;
163
+ };
164
+
165
+ svgedit.draw.Drawing.prototype.clearNonce = function() {
166
+ // We deliberately leave any se:nonce attributes alone,
167
+ // we just don't use it to randomize ids.
168
+ this.nonce_ = "";
169
+ };
170
+
171
+ /**
172
+ * Returns the latest object id as a string.
173
+ * @return {String} The latest object Id.
174
+ */
175
+ svgedit.draw.Drawing.prototype.getId = function() {
176
+ return this.nonce_ ?
177
+ this.idPrefix + this.nonce_ +'_' + this.obj_num :
178
+ this.idPrefix + this.obj_num;
179
+ };
180
+
181
+ /**
182
+ * Returns the next object Id as a string.
183
+ * @return {String} The next object Id to use.
184
+ */
185
+ svgedit.draw.Drawing.prototype.getNextId = function() {
186
+ var oldObjNum = this.obj_num;
187
+ var restoreOldObjNum = false;
188
+
189
+ // If there are any released numbers in the release stack,
190
+ // use the last one instead of the next obj_num.
191
+ // We need to temporarily use obj_num as that is what getId() depends on.
192
+ if (this.releasedNums.length > 0) {
193
+ this.obj_num = this.releasedNums.pop();
194
+ restoreOldObjNum = true;
195
+ } else {
196
+ // If we are not using a released id, then increment the obj_num.
197
+ this.obj_num++;
198
+ }
199
+
200
+ // Ensure the ID does not exist.
201
+ var id = this.getId();
202
+ while (this.getElem_(id)) {
203
+ if (restoreOldObjNum) {
204
+ this.obj_num = oldObjNum;
205
+ restoreOldObjNum = false;
206
+ }
207
+ this.obj_num++;
208
+ id = this.getId();
209
+ }
210
+ // Restore the old object number if required.
211
+ if (restoreOldObjNum) {
212
+ this.obj_num = oldObjNum;
213
+ }
214
+ return id;
215
+ };
216
+
217
+ // Function: svgedit.draw.Drawing.releaseId
218
+ // Releases the object Id, letting it be used as the next id in getNextId().
219
+ // This method DOES NOT remove any elements from the DOM, it is expected
220
+ // that client code will do this.
221
+ //
222
+ // Parameters:
223
+ // id - The id to release.
224
+ //
225
+ // Returns:
226
+ // True if the id was valid to be released, false otherwise.
227
+ svgedit.draw.Drawing.prototype.releaseId = function(id) {
228
+ // confirm if this is a valid id for this Document, else return false
229
+ var front = this.idPrefix + (this.nonce_ ? this.nonce_ +'_' : '');
230
+ if (typeof id != typeof '' || id.indexOf(front) != 0) {
231
+ return false;
232
+ }
233
+ // extract the obj_num of this id
234
+ var num = parseInt(id.substr(front.length));
235
+
236
+ // if we didn't get a positive number or we already released this number
237
+ // then return false.
238
+ if (typeof num != typeof 1 || num <= 0 || this.releasedNums.indexOf(num) != -1) {
239
+ return false;
240
+ }
241
+
242
+ // push the released number into the released queue
243
+ this.releasedNums.push(num);
244
+
245
+ return true;
246
+ };
247
+
248
+ // Function: svgedit.draw.Drawing.getNumLayers
249
+ // Returns the number of layers in the current drawing.
250
+ //
251
+ // Returns:
252
+ // The number of layers in the current drawing.
253
+ svgedit.draw.Drawing.prototype.getNumLayers = function() {
254
+ return this.all_layers.length;
255
+ };
256
+
257
+ // Function: svgedit.draw.Drawing.hasLayer
258
+ // Check if layer with given name already exists
259
+ svgedit.draw.Drawing.prototype.hasLayer = function(name) {
260
+ for(var i = 0; i < this.getNumLayers(); i++) {
261
+ if(this.all_layers[i][0] == name) return true;
262
+ }
263
+ return false;
264
+ };
265
+
266
+
267
+ // Function: svgedit.draw.Drawing.getLayerName
268
+ // Returns the name of the ith layer. If the index is out of range, an empty string is returned.
269
+ //
270
+ // Parameters:
271
+ // i - the zero-based index of the layer you are querying.
272
+ //
273
+ // Returns:
274
+ // The name of the ith layer
275
+ svgedit.draw.Drawing.prototype.getLayerName = function(i) {
276
+ if (i >= 0 && i < this.getNumLayers()) {
277
+ return this.all_layers[i][0];
278
+ }
279
+ return "";
280
+ };
281
+
282
+ // Function: svgedit.draw.Drawing.getCurrentLayer
283
+ // Returns:
284
+ // The SVGGElement representing the current layer.
285
+ svgedit.draw.Drawing.prototype.getCurrentLayer = function() {
286
+ return this.current_layer;
287
+ };
288
+
289
+ // Function: getCurrentLayerName
290
+ // Returns the name of the currently selected layer. If an error occurs, an empty string
291
+ // is returned.
292
+ //
293
+ // Returns:
294
+ // The name of the currently active layer.
295
+ svgedit.draw.Drawing.prototype.getCurrentLayerName = function() {
296
+ for (var i = 0; i < this.getNumLayers(); ++i) {
297
+ if (this.all_layers[i][1] == this.current_layer) {
298
+ return this.getLayerName(i);
299
+ }
300
+ }
301
+ return "";
302
+ };
303
+
304
+ // Function: setCurrentLayer
305
+ // Sets the current layer. If the name is not a valid layer name, then this function returns
306
+ // false. Otherwise it returns true. This is not an undo-able action.
307
+ //
308
+ // Parameters:
309
+ // name - the name of the layer you want to switch to.
310
+ //
311
+ // Returns:
312
+ // true if the current layer was switched, otherwise false
313
+ svgedit.draw.Drawing.prototype.setCurrentLayer = function(name) {
314
+ for (var i = 0; i < this.getNumLayers(); ++i) {
315
+ if (name == this.getLayerName(i)) {
316
+ if (this.current_layer != this.all_layers[i][1]) {
317
+ this.current_layer.setAttribute("style", "pointer-events:none");
318
+ this.current_layer = this.all_layers[i][1];
319
+ this.current_layer.setAttribute("style", "pointer-events:all");
320
+ }
321
+ return true;
322
+ }
323
+ }
324
+ return false;
325
+ };
326
+
327
+
328
+ // Function: svgedit.draw.Drawing.deleteCurrentLayer
329
+ // Deletes the current layer from the drawing and then clears the selection. This function
330
+ // then calls the 'changed' handler. This is an undoable action.
331
+ // Returns:
332
+ // The SVGGElement of the layer removed or null.
333
+ svgedit.draw.Drawing.prototype.deleteCurrentLayer = function() {
334
+ if (this.current_layer && this.getNumLayers() > 1) {
335
+ // actually delete from the DOM and return it
336
+ var parent = this.current_layer.parentNode;
337
+ var nextSibling = this.current_layer.nextSibling;
338
+ var oldLayerGroup = parent.removeChild(this.current_layer);
339
+ this.identifyLayers();
340
+ return oldLayerGroup;
341
+ }
342
+ return null;
343
+ };
344
+
345
+ // Function: svgedit.draw.Drawing.identifyLayers
346
+ // Updates layer system and sets the current layer to the
347
+ // top-most layer (last <g> child of this drawing).
348
+ svgedit.draw.Drawing.prototype.identifyLayers = function() {
349
+ this.all_layers = [];
350
+ var numchildren = this.svgElem_.childNodes.length;
351
+ // loop through all children of SVG element
352
+ var orphans = [], layernames = [];
353
+ var a_layer = null;
354
+ var childgroups = false;
355
+ for (var i = 0; i < numchildren; ++i) {
356
+ var child = this.svgElem_.childNodes.item(i);
357
+ // for each g, find its layer name
358
+ if (child && child.nodeType == 1) {
359
+ if (child.tagName == "g") {
360
+ childgroups = true;
361
+ var name = $("title",child).text();
362
+
363
+ // Hack for Opera 10.60
364
+ if(!name && svgedit.browser.isOpera() && child.querySelectorAll) {
365
+ name = $(child.querySelectorAll('title')).text();
366
+ }
367
+
368
+ // store layer and name in global variable
369
+ if (name) {
370
+ layernames.push(name);
371
+ this.all_layers.push( [name,child] );
372
+ a_layer = child;
373
+ svgedit.utilities.walkTree(child, function(e){e.setAttribute("style", "pointer-events:inherit");});
374
+ a_layer.setAttribute("style", "pointer-events:none");
375
+ }
376
+ // if group did not have a name, it is an orphan
377
+ else {
378
+ orphans.push(child);
379
+ }
380
+ }
381
+ // if child has is "visible" (i.e. not a <title> or <defs> element), then it is an orphan
382
+ else if(~visElems_arr.indexOf(child.nodeName)) {
383
+ var bb = svgedit.utilities.getBBox(child);
384
+ orphans.push(child);
385
+ }
386
+ }
387
+ }
388
+
389
+ // create a new layer and add all the orphans to it
390
+ var svgdoc = this.svgElem_.ownerDocument;
391
+ if (orphans.length > 0 || !childgroups) {
392
+ var i = 1;
393
+ // TODO(codedread): What about internationalization of "Layer"?
394
+ while (layernames.indexOf(("Layer " + i)) >= 0) { i++; }
395
+ var newname = "Layer " + i;
396
+ a_layer = svgdoc.createElementNS(svg_ns, "g");
397
+ var layer_title = svgdoc.createElementNS(svg_ns, "title");
398
+ layer_title.textContent = newname;
399
+ a_layer.appendChild(layer_title);
400
+ for (var j = 0; j < orphans.length; ++j) {
401
+ a_layer.appendChild(orphans[j]);
402
+ }
403
+ this.svgElem_.appendChild(a_layer);
404
+ this.all_layers.push( [newname, a_layer] );
405
+ }
406
+ svgedit.utilities.walkTree(a_layer, function(e){e.setAttribute("style","pointer-events:inherit");});
407
+ this.current_layer = a_layer;
408
+ this.current_layer.setAttribute("style","pointer-events:all");
409
+ };
410
+
411
+ // Function: svgedit.draw.Drawing.createLayer
412
+ // Creates a new top-level layer in the drawing with the given name and
413
+ // sets the current layer to it.
414
+ //
415
+ // Parameters:
416
+ // name - The given name
417
+ //
418
+ // Returns:
419
+ // The SVGGElement of the new layer, which is also the current layer
420
+ // of this drawing.
421
+ svgedit.draw.Drawing.prototype.createLayer = function(name) {
422
+ var svgdoc = this.svgElem_.ownerDocument;
423
+ var new_layer = svgdoc.createElementNS(svg_ns, "g");
424
+ var layer_title = svgdoc.createElementNS(svg_ns, "title");
425
+ layer_title.textContent = name;
426
+ new_layer.appendChild(layer_title);
427
+ this.svgElem_.appendChild(new_layer);
428
+ this.identifyLayers();
429
+ return new_layer;
430
+ };
431
+
432
+ // Function: svgedit.draw.Drawing.getLayerVisibility
433
+ // Returns whether the layer is visible. If the layer name is not valid, then this function
434
+ // returns false.
435
+ //
436
+ // Parameters:
437
+ // layername - the name of the layer which you want to query.
438
+ //
439
+ // Returns:
440
+ // The visibility state of the layer, or false if the layer name was invalid.
441
+ svgedit.draw.Drawing.prototype.getLayerVisibility = function(layername) {
442
+ // find the layer
443
+ var layer = null;
444
+ for (var i = 0; i < this.getNumLayers(); ++i) {
445
+ if (this.getLayerName(i) == layername) {
446
+ layer = this.all_layers[i][1];
447
+ break;
448
+ }
449
+ }
450
+ if (!layer) return false;
451
+ return (layer.getAttribute('display') != 'none');
452
+ };
453
+
454
+ // Function: svgedit.draw.Drawing.setLayerVisibility
455
+ // Sets the visibility of the layer. If the layer name is not valid, this function return
456
+ // false, otherwise it returns true. This is an undo-able action.
457
+ //
458
+ // Parameters:
459
+ // layername - the name of the layer to change the visibility
460
+ // bVisible - true/false, whether the layer should be visible
461
+ //
462
+ // Returns:
463
+ // The SVGGElement representing the layer if the layername was valid, otherwise null.
464
+ svgedit.draw.Drawing.prototype.setLayerVisibility = function(layername, bVisible) {
465
+ if (typeof bVisible != typeof true) {
466
+ return null;
467
+ }
468
+ // find the layer
469
+ var layer = null;
470
+ for (var i = 0; i < this.getNumLayers(); ++i) {
471
+ if (this.getLayerName(i) == layername) {
472
+ layer = this.all_layers[i][1];
473
+ break;
474
+ }
475
+ }
476
+ if (!layer) return null;
477
+
478
+ var oldDisplay = layer.getAttribute("display");
479
+ if (!oldDisplay) oldDisplay = "inline";
480
+ layer.setAttribute("display", bVisible ? "inline" : "none");
481
+ return layer;
482
+ };
483
+
484
+
485
+ // Function: svgedit.draw.Drawing.getLayerOpacity
486
+ // Returns the opacity of the given layer. If the input name is not a layer, null is returned.
487
+ //
488
+ // Parameters:
489
+ // layername - name of the layer on which to get the opacity
490
+ //
491
+ // Returns:
492
+ // The opacity value of the given layer. This will be a value between 0.0 and 1.0, or null
493
+ // if layername is not a valid layer
494
+ svgedit.draw.Drawing.prototype.getLayerOpacity = function(layername) {
495
+ for (var i = 0; i < this.getNumLayers(); ++i) {
496
+ if (this.getLayerName(i) == layername) {
497
+ var g = this.all_layers[i][1];
498
+ var opacity = g.getAttribute('opacity');
499
+ if (!opacity) {
500
+ opacity = '1.0';
501
+ }
502
+ return parseFloat(opacity);
503
+ }
504
+ }
505
+ return null;
506
+ };
507
+
508
+ // Function: svgedit.draw.Drawing.setLayerOpacity
509
+ // Sets the opacity of the given layer. If the input name is not a layer, nothing happens.
510
+ // If opacity is not a value between 0.0 and 1.0, then nothing happens.
511
+ //
512
+ // Parameters:
513
+ // layername - name of the layer on which to set the opacity
514
+ // opacity - a float value in the range 0.0-1.0
515
+ svgedit.draw.Drawing.prototype.setLayerOpacity = function(layername, opacity) {
516
+ if (typeof opacity != typeof 1.0 || opacity < 0.0 || opacity > 1.0) {
517
+ return;
518
+ }
519
+ for (var i = 0; i < this.getNumLayers(); ++i) {
520
+ if (this.getLayerName(i) == layername) {
521
+ var g = this.all_layers[i][1];
522
+ g.setAttribute("opacity", opacity);
523
+ break;
524
+ }
525
+ }
526
+ };
527
+
528
+ })();