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,486 @@
1
+ /*
2
+ * SVG Icon Loader 2.0
3
+ *
4
+ * jQuery Plugin for loading SVG icons from a single file
5
+ *
6
+ * Copyright (c) 2009 Alexis Deveria
7
+ * http://a.deveria.com
8
+ *
9
+ * MIT License
10
+
11
+ How to use:
12
+
13
+ 1. Create the SVG master file that includes all icons:
14
+
15
+ The master SVG icon-containing file is an SVG file that contains
16
+ <g> elements. Each <g> element should contain the markup of an SVG
17
+ icon. The <g> element has an ID that should
18
+ correspond with the ID of the HTML element used on the page that should contain
19
+ or optionally be replaced by the icon. Additionally, one empty element should be
20
+ added at the end with id "svg_eof".
21
+
22
+ 2. Optionally create fallback raster images for each SVG icon.
23
+
24
+ 3. Include the jQuery and the SVG Icon Loader scripts on your page.
25
+
26
+ 4. Run $.svgIcons() when the document is ready:
27
+
28
+ $.svgIcons( file [string], options [object literal]);
29
+
30
+ File is the location of a local SVG or SVGz file.
31
+
32
+ All options are optional and can include:
33
+
34
+ - 'w (number)': The icon widths
35
+
36
+ - 'h (number)': The icon heights
37
+
38
+ - 'fallback (object literal)': List of raster images with each
39
+ key being the SVG icon ID to replace, and the value the image file name.
40
+
41
+ - 'fallback_path (string)': The path to use for all images
42
+ listed under "fallback"
43
+
44
+ - 'replace (boolean)': If set to true, HTML elements will be replaced by,
45
+ rather than include the SVG icon.
46
+
47
+ - 'placement (object literal)': List with selectors for keys and SVG icon ids
48
+ as values. This provides a custom method of adding icons.
49
+
50
+ - 'resize (object literal)': List with selectors for keys and numbers
51
+ as values. This allows an easy way to resize specific icons.
52
+
53
+ - 'callback (function)': A function to call when all icons have been loaded.
54
+ Includes an object literal as its argument with as keys all icon IDs and the
55
+ icon as a jQuery object as its value.
56
+
57
+ - 'id_match (boolean)': Automatically attempt to match SVG icon ids with
58
+ corresponding HTML id (default: true)
59
+
60
+ - 'no_img (boolean)': Prevent attempting to convert the icon into an <img>
61
+ element (may be faster, help for browser consistency)
62
+
63
+ - 'svgz (boolean)': Indicate that the file is an SVGZ file, and thus not to
64
+ parse as XML. SVGZ files add compression benefits, but getting data from
65
+ them fails in Firefox 2 and older.
66
+
67
+ 5. To access an icon at a later point without using the callback, use this:
68
+ $.getSvgIcon(id (string));
69
+
70
+ This will return the icon (as jQuery object) with a given ID.
71
+
72
+ 6. To resize icons at a later point without using the callback, use this:
73
+ $.resizeSvgIcons(resizeOptions) (use the same way as the "resize" parameter)
74
+
75
+
76
+ Example usage #1:
77
+
78
+ $(function() {
79
+ $.svgIcons('my_icon_set.svg'); // The SVG file that contains all icons
80
+ // No options have been set, so all icons will automatically be inserted
81
+ // into HTML elements that match the same IDs.
82
+ });
83
+
84
+ Example usage #2:
85
+
86
+ $(function() {
87
+ $.svgIcons('my_icon_set.svg', { // The SVG file that contains all icons
88
+ callback: function(icons) { // Custom callback function that sets click
89
+ // events for each icon
90
+ $.each(icons, function(id, icon) {
91
+ icon.click(function() {
92
+ alert('You clicked on the icon with id ' + id);
93
+ });
94
+ });
95
+ }
96
+ }); //The SVG file that contains all icons
97
+ });
98
+
99
+ Example usage #3:
100
+
101
+ $(function() {
102
+ $.svgIcons('my_icon_set.svgz', { // The SVGZ file that contains all icons
103
+ w: 32, // All icons will be 32px wide
104
+ h: 32, // All icons will be 32px high
105
+ fallback_path: 'icons/', // All fallback files can be found here
106
+ fallback: {
107
+ '#open_icon': 'open.png', // The "open.png" will be appended to the
108
+ // HTML element with ID "open_icon"
109
+ '#close_icon': 'close.png',
110
+ '#save_icon': 'save.png'
111
+ },
112
+ placement: {'.open_icon','open'}, // The "open" icon will be added
113
+ // to all elements with class "open_icon"
114
+ resize: function() {
115
+ '#save_icon .svg_icon': 64 // The "save" icon will be resized to 64 x 64px
116
+ },
117
+
118
+ callback: function(icons) { // Sets background color for "close" icon
119
+ icons['close'].css('background','red');
120
+ },
121
+
122
+ svgz: true // Indicates that an SVGZ file is being used
123
+
124
+ })
125
+ });
126
+
127
+ */
128
+
129
+
130
+ (function($) {
131
+ var svg_icons = {}, fixIDs;
132
+
133
+ $.svgIcons = function(file, opts) {
134
+ var svgns = "http://www.w3.org/2000/svg",
135
+ xlinkns = "http://www.w3.org/1999/xlink",
136
+ icon_w = opts.w?opts.w : 24,
137
+ icon_h = opts.h?opts.h : 24,
138
+ elems, svgdoc, testImg,
139
+ icons_made = false, data_loaded = false, load_attempts = 0,
140
+ ua = navigator.userAgent, isOpera = !!window.opera, isSafari = (ua.indexOf('Safari/') > -1 && ua.indexOf('Chrome/')==-1),
141
+ data_pre = 'data:image/svg+xml;charset=utf-8;base64,';
142
+
143
+ if(opts.svgz) {
144
+ var data_el = $('<object data="' + file + '" type=image/svg+xml>').appendTo('body').hide();
145
+ try {
146
+ svgdoc = data_el[0].contentDocument;
147
+ data_el.load(getIcons);
148
+ getIcons(0, true); // Opera will not run "load" event if file is already cached
149
+ } catch(err1) {
150
+ useFallback();
151
+ }
152
+ } else {
153
+ var parser = new DOMParser();
154
+ $.ajax({
155
+ url: file,
156
+ dataType: 'string',
157
+ success: function(data) {
158
+ if(!data) {
159
+ $(useFallback);
160
+ return;
161
+ }
162
+ svgdoc = parser.parseFromString(data, "text/xml");
163
+ $(function() {
164
+ getIcons('ajax');
165
+ });
166
+ },
167
+ error: function(err) {
168
+ // TODO: Fix Opera widget icon bug
169
+ if(window.opera) {
170
+ $(function() {
171
+ useFallback();
172
+ });
173
+ } else {
174
+ if(err.responseText) {
175
+ svgdoc = parser.parseFromString(err.responseText, "text/xml");
176
+
177
+ if(!svgdoc.childNodes.length) {
178
+ $(useFallback);
179
+ }
180
+ $(function() {
181
+ getIcons('ajax');
182
+ });
183
+ } else {
184
+ $(useFallback);
185
+ }
186
+ }
187
+ }
188
+ });
189
+ }
190
+
191
+ function getIcons(evt, no_wait) {
192
+ if(evt !== 'ajax') {
193
+ if(data_loaded) return;
194
+ // Webkit sometimes says svgdoc is undefined, other times
195
+ // it fails to load all nodes. Thus we must make sure the "eof"
196
+ // element is loaded.
197
+ svgdoc = data_el[0].contentDocument; // Needed again for Webkit
198
+ var isReady = (svgdoc && svgdoc.getElementById('svg_eof'));
199
+ if(!isReady && !(no_wait && isReady)) {
200
+ load_attempts++;
201
+ if(load_attempts < 50) {
202
+ setTimeout(getIcons, 20);
203
+ } else {
204
+ useFallback();
205
+ data_loaded = true;
206
+ }
207
+ return;
208
+ }
209
+ data_loaded = true;
210
+ }
211
+
212
+ elems = $(svgdoc.firstChild).children(); //.getElementsByTagName('foreignContent');
213
+
214
+ if(!opts.no_img) {
215
+ var testSrc = data_pre + 'PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNzUiIGhlaWdodD0iMjc1Ij48L3N2Zz4%3D';
216
+
217
+ testImg = $(new Image()).attr({
218
+ src: testSrc,
219
+ width: 0,
220
+ height: 0
221
+ }).appendTo('body')
222
+ .load(function () {
223
+ // Safari 4 crashes, Opera and Chrome don't
224
+ makeIcons(true);
225
+ }).error(function () {
226
+ makeIcons();
227
+ });
228
+ } else {
229
+ setTimeout(function() {
230
+ if(!icons_made) makeIcons();
231
+ },500);
232
+ }
233
+ }
234
+
235
+ var setIcon = function(target, icon, id, setID) {
236
+ if(isOpera) icon.css('visibility','hidden');
237
+ if(opts.replace) {
238
+ if(setID) icon.attr('id',id);
239
+ var cl = target.attr('class');
240
+ if(cl) icon.attr('class','svg_icon '+cl);
241
+ target.replaceWith(icon);
242
+ } else {
243
+
244
+ target.append(icon);
245
+ }
246
+ if(isOpera) {
247
+ setTimeout(function() {
248
+ icon.removeAttr('style');
249
+ },1);
250
+ }
251
+ }
252
+
253
+ var addIcon = function(icon, id) {
254
+ if(opts.id_match === undefined || opts.id_match !== false) {
255
+ setIcon(holder, icon, id, true);
256
+ }
257
+ svg_icons[id] = icon;
258
+ }
259
+
260
+ function makeIcons(toImage, fallback) {
261
+ if(icons_made) return;
262
+ if(opts.no_img) toImage = false;
263
+ var holder;
264
+
265
+ if(toImage) {
266
+ var temp_holder = $(document.createElement('div'));
267
+ temp_holder.hide().appendTo('body');
268
+ }
269
+ if(fallback) {
270
+ var path = opts.fallback_path?opts.fallback_path:'';
271
+ $.each(fallback, function(id, imgsrc) {
272
+ holder = $('#' + id);
273
+ var icon = $(new Image())
274
+ .attr({
275
+ 'class':'svg_icon',
276
+ src: path + imgsrc,
277
+ 'width': icon_w,
278
+ 'height': icon_h,
279
+ 'alt': 'icon'
280
+ });
281
+
282
+ addIcon(icon, id);
283
+ });
284
+ } else {
285
+ var len = elems.length;
286
+ for(var i = 0; i < len; i++) {
287
+ var elem = elems[i];
288
+ var id = elem.id;
289
+ if(id === 'svg_eof') break;
290
+ holder = $('#' + id);
291
+ var svg = elem.getElementsByTagNameNS(svgns, 'svg')[0];
292
+ var svgroot = document.createElementNS(svgns, "svg");
293
+ svgroot.setAttributeNS(svgns, 'viewBox', [0,0,icon_w,icon_h].join(' '));
294
+
295
+ // Make flexible by converting width/height to viewBox
296
+ var w = svg.getAttribute('width');
297
+ var h = svg.getAttribute('height');
298
+ svg.removeAttribute('width');
299
+ svg.removeAttribute('height');
300
+
301
+ var vb = svg.getAttribute('viewBox');
302
+ if(!vb) {
303
+ svg.setAttribute('viewBox', [0,0,w,h].join(' '));
304
+ }
305
+
306
+ // Not using jQuery to be a bit faster
307
+ svgroot.setAttribute('xmlns', svgns);
308
+ svgroot.setAttribute('width', icon_w);
309
+ svgroot.setAttribute('height', icon_h);
310
+ svgroot.setAttribute("xmlns:xlink", xlinkns);
311
+ svgroot.setAttribute("class", 'svg_icon');
312
+
313
+ // Without cloning, Firefox will make another GET request.
314
+ // With cloning, causes issue in Opera/Win/Non-EN
315
+ if(!isOpera) svg = svg.cloneNode(true);
316
+
317
+ svgroot.appendChild(svg);
318
+
319
+ if(toImage) {
320
+ // Without cloning, Safari will crash
321
+ // With cloning, causes issue in Opera/Win/Non-EN
322
+ var svgcontent = isOpera?svgroot:svgroot.cloneNode(true);
323
+ temp_holder.empty().append(svgroot);
324
+ var str = data_pre + encode64(temp_holder.html());
325
+ var icon = $(new Image())
326
+ .attr({'class':'svg_icon', src:str});
327
+ } else {
328
+ var icon = fixIDs($(svgroot), i);
329
+ }
330
+ addIcon(icon, id);
331
+ }
332
+
333
+ }
334
+
335
+ if(opts.placement) {
336
+ $.each(opts.placement, function(sel, id) {
337
+ if(!svg_icons[id]) return;
338
+ $(sel).each(function(i) {
339
+ var copy = svg_icons[id].clone();
340
+ if(i > 0 && !toImage) copy = fixIDs(copy, i, true);
341
+ setIcon($(this), copy, id);
342
+ })
343
+ });
344
+ }
345
+ if(!fallback) {
346
+ if(toImage) temp_holder.remove();
347
+ if(data_el) data_el.remove();
348
+ if(testImg) testImg.remove();
349
+ }
350
+ if(opts.resize) $.resizeSvgIcons(opts.resize);
351
+ icons_made = true;
352
+
353
+ if(opts.callback) opts.callback(svg_icons);
354
+ }
355
+
356
+ fixIDs = function(svg_el, svg_num, force) {
357
+ var defs = svg_el.find('defs');
358
+ if(!defs.length) return svg_el;
359
+
360
+ if(isOpera) {
361
+ var id_elems = defs.find('*').filter(function() {
362
+ return !!this.id;
363
+ });
364
+ } else {
365
+ var id_elems = defs.find('[id]');
366
+ }
367
+
368
+ var all_elems = svg_el[0].getElementsByTagName('*'), len = all_elems.length;
369
+
370
+ id_elems.each(function(i) {
371
+ var id = this.id;
372
+ var no_dupes = ($(svgdoc).find('#' + id).length <= 1);
373
+ if(isOpera) no_dupes = false; // Opera didn't clone svg_el, so not reliable
374
+ // if(!force && no_dupes) return;
375
+ var new_id = 'x' + id + svg_num + i;
376
+ this.id = new_id;
377
+
378
+ var old_val = 'url(#' + id + ')';
379
+ var new_val = 'url(#' + new_id + ')';
380
+
381
+ // Selector method, possibly faster but fails in Opera / jQuery 1.4.3
382
+ // svg_el.find('[fill="url(#' + id + ')"]').each(function() {
383
+ // this.setAttribute('fill', 'url(#' + new_id + ')');
384
+ // }).end().find('[stroke="url(#' + id + ')"]').each(function() {
385
+ // this.setAttribute('stroke', 'url(#' + new_id + ')');
386
+ // }).end().find('use').each(function() {
387
+ // if(this.getAttribute('xlink:href') == '#' + id) {
388
+ // this.setAttributeNS(xlinkns,'href','#' + new_id);
389
+ // }
390
+ // }).end().find('[filter="url(#' + id + ')"]').each(function() {
391
+ // this.setAttribute('filter', 'url(#' + new_id + ')');
392
+ // });
393
+
394
+ for(var i = 0; i < len; i++) {
395
+ var elem = all_elems[i];
396
+ if(elem.getAttribute('fill') === old_val) {
397
+ elem.setAttribute('fill', new_val);
398
+ }
399
+ if(elem.getAttribute('stroke') === old_val) {
400
+ elem.setAttribute('stroke', new_val);
401
+ }
402
+ if(elem.getAttribute('filter') === old_val) {
403
+ elem.setAttribute('filter', new_val);
404
+ }
405
+ }
406
+ });
407
+ return svg_el;
408
+ }
409
+
410
+ function useFallback() {
411
+ if(file.indexOf('.svgz') != -1) {
412
+ var reg_file = file.replace('.svgz','.svg');
413
+ if(window.console) {
414
+ console.log('.svgz failed, trying with .svg');
415
+ }
416
+ $.svgIcons(reg_file, opts);
417
+ } else if(opts.fallback) {
418
+ makeIcons(false, opts.fallback);
419
+ }
420
+ }
421
+
422
+ function encode64(input) {
423
+ // base64 strings are 4/3 larger than the original string
424
+ if(window.btoa) return window.btoa(input);
425
+ var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
426
+ var output = new Array( Math.floor( (input.length + 2) / 3 ) * 4 );
427
+ var chr1, chr2, chr3;
428
+ var enc1, enc2, enc3, enc4;
429
+ var i = 0, p = 0;
430
+
431
+ do {
432
+ chr1 = input.charCodeAt(i++);
433
+ chr2 = input.charCodeAt(i++);
434
+ chr3 = input.charCodeAt(i++);
435
+
436
+ enc1 = chr1 >> 2;
437
+ enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
438
+ enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
439
+ enc4 = chr3 & 63;
440
+
441
+ if (isNaN(chr2)) {
442
+ enc3 = enc4 = 64;
443
+ } else if (isNaN(chr3)) {
444
+ enc4 = 64;
445
+ }
446
+
447
+ output[p++] = _keyStr.charAt(enc1);
448
+ output[p++] = _keyStr.charAt(enc2);
449
+ output[p++] = _keyStr.charAt(enc3);
450
+ output[p++] = _keyStr.charAt(enc4);
451
+ } while (i < input.length);
452
+
453
+ return output.join('');
454
+ }
455
+ }
456
+
457
+ $.getSvgIcon = function(id, uniqueClone) {
458
+ var icon = svg_icons[id];
459
+ if(uniqueClone && icon) {
460
+ icon = fixIDs(icon, 0, true).clone(true);
461
+ }
462
+ return icon;
463
+ }
464
+
465
+ $.resizeSvgIcons = function(obj) {
466
+ // FF2 and older don't detect .svg_icon, so we change it detect svg elems instead
467
+ var change_sel = !$('.svg_icon:first').length;
468
+ $.each(obj, function(sel, size) {
469
+ var arr = $.isArray(size);
470
+ var w = arr?size[0]:size,
471
+ h = arr?size[1]:size;
472
+ if(change_sel) {
473
+ sel = sel.replace(/\.svg_icon/g,'svg');
474
+ }
475
+ $(sel).each(function() {
476
+ this.setAttribute('width', w);
477
+ this.setAttribute('height', h);
478
+ if(window.opera && window.widget) {
479
+ this.parentNode.style.width = w + 'px';
480
+ this.parentNode.style.height = h + 'px';
481
+ }
482
+ });
483
+ });
484
+ }
485
+
486
+ })(jQuery);