diamonds 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (180) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +36 -0
  3. data/lib/diamonds.rb +74 -0
  4. data/lib/diamonds/Gemfile +28 -0
  5. data/lib/diamonds/README.md +254 -0
  6. data/lib/diamonds/Rakefile +5 -0
  7. data/lib/diamonds/apps/application.rb +15 -0
  8. data/lib/diamonds/apps/library.rb +321 -0
  9. data/lib/diamonds/apps/user_app.rb +5 -0
  10. data/lib/diamonds/config.ru +98 -0
  11. data/lib/diamonds/db/mysiteDB Back.sqlite3 +0 -0
  12. data/lib/diamonds/db/mysiteDB.sqlite3 +0 -0
  13. data/lib/diamonds/gems/auto_launch_browser.rb +22 -0
  14. data/lib/diamonds/gems/io.rb +146 -0
  15. data/lib/diamonds/gems/ruby_to_js.rb +173 -0
  16. data/lib/diamonds/gems/server_utils.rb +96 -0
  17. data/lib/diamonds/lib/opal-browser.rb +1 -0
  18. data/lib/diamonds/lib/opal/browser.rb +4 -0
  19. data/lib/diamonds/opal-browser.gemspec +21 -0
  20. data/lib/diamonds/opal/browser.rb +11 -0
  21. data/lib/diamonds/opal/browser/animation_frame.rb +111 -0
  22. data/lib/diamonds/opal/browser/canvas.rb +321 -0
  23. data/lib/diamonds/opal/browser/canvas/data.rb +63 -0
  24. data/lib/diamonds/opal/browser/canvas/gradient.rb +27 -0
  25. data/lib/diamonds/opal/browser/canvas/style.rb +113 -0
  26. data/lib/diamonds/opal/browser/canvas/text.rb +45 -0
  27. data/lib/diamonds/opal/browser/console.rb +103 -0
  28. data/lib/diamonds/opal/browser/cookies.rb +133 -0
  29. data/lib/diamonds/opal/browser/css.rb +24 -0
  30. data/lib/diamonds/opal/browser/css/declaration.rb +83 -0
  31. data/lib/diamonds/opal/browser/css/rule.rb +48 -0
  32. data/lib/diamonds/opal/browser/css/rule/style.rb +16 -0
  33. data/lib/diamonds/opal/browser/css/style_sheet.rb +83 -0
  34. data/lib/diamonds/opal/browser/css/unit.rb +188 -0
  35. data/lib/diamonds/opal/browser/database/sql.rb +194 -0
  36. data/lib/diamonds/opal/browser/delay.rb +78 -0
  37. data/lib/diamonds/opal/browser/dom.rb +84 -0
  38. data/lib/diamonds/opal/browser/dom/attribute.rb +26 -0
  39. data/lib/diamonds/opal/browser/dom/builder.rb +88 -0
  40. data/lib/diamonds/opal/browser/dom/cdata.rb +9 -0
  41. data/lib/diamonds/opal/browser/dom/character_data.rb +73 -0
  42. data/lib/diamonds/opal/browser/dom/comment.rb +9 -0
  43. data/lib/diamonds/opal/browser/dom/document.rb +149 -0
  44. data/lib/diamonds/opal/browser/dom/document_fragment.rb +7 -0
  45. data/lib/diamonds/opal/browser/dom/element.rb +474 -0
  46. data/lib/diamonds/opal/browser/dom/element/attributes.rb +87 -0
  47. data/lib/diamonds/opal/browser/dom/element/data.rb +67 -0
  48. data/lib/diamonds/opal/browser/dom/element/image.rb +23 -0
  49. data/lib/diamonds/opal/browser/dom/element/input.rb +28 -0
  50. data/lib/diamonds/opal/browser/dom/element/offset.rb +89 -0
  51. data/lib/diamonds/opal/browser/dom/element/position.rb +46 -0
  52. data/lib/diamonds/opal/browser/dom/element/scroll.rb +136 -0
  53. data/lib/diamonds/opal/browser/dom/element/select.rb +36 -0
  54. data/lib/diamonds/opal/browser/dom/element/size.rb +34 -0
  55. data/lib/diamonds/opal/browser/dom/element/template.rb +9 -0
  56. data/lib/diamonds/opal/browser/dom/element/textarea.rb +24 -0
  57. data/lib/diamonds/opal/browser/dom/mutation_observer.rb +178 -0
  58. data/lib/diamonds/opal/browser/dom/node.rb +464 -0
  59. data/lib/diamonds/opal/browser/dom/node_set.rb +110 -0
  60. data/lib/diamonds/opal/browser/dom/text.rb +36 -0
  61. data/lib/diamonds/opal/browser/effects.rb +50 -0
  62. data/lib/diamonds/opal/browser/event.rb +253 -0
  63. data/lib/diamonds/opal/browser/event/animation.rb +38 -0
  64. data/lib/diamonds/opal/browser/event/audio_processing.rb +33 -0
  65. data/lib/diamonds/opal/browser/event/base.rb +430 -0
  66. data/lib/diamonds/opal/browser/event/before_unload.rb +15 -0
  67. data/lib/diamonds/opal/browser/event/clipboard.rb +28 -0
  68. data/lib/diamonds/opal/browser/event/close.rb +47 -0
  69. data/lib/diamonds/opal/browser/event/composition.rb +50 -0
  70. data/lib/diamonds/opal/browser/event/custom.rb +65 -0
  71. data/lib/diamonds/opal/browser/event/device_light.rb +23 -0
  72. data/lib/diamonds/opal/browser/event/device_motion.rb +51 -0
  73. data/lib/diamonds/opal/browser/event/device_orientation.rb +48 -0
  74. data/lib/diamonds/opal/browser/event/device_proximity.rb +33 -0
  75. data/lib/diamonds/opal/browser/event/drag.rb +119 -0
  76. data/lib/diamonds/opal/browser/event/focus.rb +39 -0
  77. data/lib/diamonds/opal/browser/event/gamepad.rb +60 -0
  78. data/lib/diamonds/opal/browser/event/hash_change.rb +28 -0
  79. data/lib/diamonds/opal/browser/event/keyboard.rb +115 -0
  80. data/lib/diamonds/opal/browser/event/message.rb +70 -0
  81. data/lib/diamonds/opal/browser/event/mouse.rb +254 -0
  82. data/lib/diamonds/opal/browser/event/page_transition.rb +23 -0
  83. data/lib/diamonds/opal/browser/event/pop_state.rb +33 -0
  84. data/lib/diamonds/opal/browser/event/progress.rb +43 -0
  85. data/lib/diamonds/opal/browser/event/sensor.rb +15 -0
  86. data/lib/diamonds/opal/browser/event/storage.rb +43 -0
  87. data/lib/diamonds/opal/browser/event/touch.rb +60 -0
  88. data/lib/diamonds/opal/browser/event/ui.rb +38 -0
  89. data/lib/diamonds/opal/browser/event/wheel.rb +49 -0
  90. data/lib/diamonds/opal/browser/event_source.rb +70 -0
  91. data/lib/diamonds/opal/browser/history.rb +90 -0
  92. data/lib/diamonds/opal/browser/http.rb +169 -0
  93. data/lib/diamonds/opal/browser/http/binary.rb +58 -0
  94. data/lib/diamonds/opal/browser/http/headers.rb +109 -0
  95. data/lib/diamonds/opal/browser/http/request.rb +344 -0
  96. data/lib/diamonds/opal/browser/http/response.rb +115 -0
  97. data/lib/diamonds/opal/browser/immediate.rb +163 -0
  98. data/lib/diamonds/opal/browser/interval.rb +111 -0
  99. data/lib/diamonds/opal/browser/location.rb +87 -0
  100. data/lib/diamonds/opal/browser/navigator.rb +173 -0
  101. data/lib/diamonds/opal/browser/screen.rb +66 -0
  102. data/lib/diamonds/opal/browser/socket.rb +123 -0
  103. data/lib/diamonds/opal/browser/storage.rb +252 -0
  104. data/lib/diamonds/opal/browser/support.rb +287 -0
  105. data/lib/diamonds/opal/browser/utils.rb +74 -0
  106. data/lib/diamonds/opal/browser/version.rb +3 -0
  107. data/lib/diamonds/opal/browser/window.rb +120 -0
  108. data/lib/diamonds/opal/browser/window/scroll.rb +59 -0
  109. data/lib/diamonds/opal/browser/window/size.rb +59 -0
  110. data/lib/diamonds/opal/browser/window/view.rb +36 -0
  111. data/lib/diamonds/opal/opal-browser.rb +1 -0
  112. data/lib/diamonds/public/__OPAL_SOURCE_MAPS__/application.map +0 -0
  113. data/lib/diamonds/public/javascripts/font-awesome/HELP-US-OUT.txt +7 -0
  114. data/lib/diamonds/public/javascripts/font-awesome/css/font-awesome.css +2026 -0
  115. data/lib/diamonds/public/javascripts/font-awesome/css/font-awesome.min.css +1 -0
  116. data/lib/diamonds/public/javascripts/font-awesome/fonts/FontAwesome.otf +0 -0
  117. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  118. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.svg +640 -0
  119. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  120. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  121. data/lib/diamonds/public/javascripts/font-awesome/fonts/fontawesome-webfont.woff2 +0 -0
  122. data/lib/diamonds/public/javascripts/font-awesome/less/animated.less +34 -0
  123. data/lib/diamonds/public/javascripts/font-awesome/less/bordered-pulled.less +25 -0
  124. data/lib/diamonds/public/javascripts/font-awesome/less/core.less +12 -0
  125. data/lib/diamonds/public/javascripts/font-awesome/less/fixed-width.less +6 -0
  126. data/lib/diamonds/public/javascripts/font-awesome/less/font-awesome.less +17 -0
  127. data/lib/diamonds/public/javascripts/font-awesome/less/icons.less +677 -0
  128. data/lib/diamonds/public/javascripts/font-awesome/less/larger.less +13 -0
  129. data/lib/diamonds/public/javascripts/font-awesome/less/list.less +19 -0
  130. data/lib/diamonds/public/javascripts/font-awesome/less/mixins.less +26 -0
  131. data/lib/diamonds/public/javascripts/font-awesome/less/path.less +15 -0
  132. data/lib/diamonds/public/javascripts/font-awesome/less/rotated-flipped.less +20 -0
  133. data/lib/diamonds/public/javascripts/font-awesome/less/stacked.less +20 -0
  134. data/lib/diamonds/public/javascripts/font-awesome/less/variables.less +688 -0
  135. data/lib/diamonds/public/javascripts/font-awesome/scss/_animated.scss +34 -0
  136. data/lib/diamonds/public/javascripts/font-awesome/scss/_bordered-pulled.scss +25 -0
  137. data/lib/diamonds/public/javascripts/font-awesome/scss/_core.scss +12 -0
  138. data/lib/diamonds/public/javascripts/font-awesome/scss/_fixed-width.scss +6 -0
  139. data/lib/diamonds/public/javascripts/font-awesome/scss/_icons.scss +677 -0
  140. data/lib/diamonds/public/javascripts/font-awesome/scss/_larger.scss +13 -0
  141. data/lib/diamonds/public/javascripts/font-awesome/scss/_list.scss +19 -0
  142. data/lib/diamonds/public/javascripts/font-awesome/scss/_mixins.scss +26 -0
  143. data/lib/diamonds/public/javascripts/font-awesome/scss/_path.scss +15 -0
  144. data/lib/diamonds/public/javascripts/font-awesome/scss/_rotated-flipped.scss +20 -0
  145. data/lib/diamonds/public/javascripts/font-awesome/scss/_stacked.scss +20 -0
  146. data/lib/diamonds/public/javascripts/font-awesome/scss/_variables.scss +688 -0
  147. data/lib/diamonds/public/javascripts/font-awesome/scss/font-awesome.scss +17 -0
  148. data/lib/diamonds/public/javascripts/jquery-2.1.4.min.js +4 -0
  149. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  150. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  151. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_flat_10_000000_40x100.png +0 -0
  152. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  153. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  154. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  155. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  156. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  157. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  158. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_222222_256x240.png +0 -0
  159. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_228ef1_256x240.png +0 -0
  160. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ef8c08_256x240.png +0 -0
  161. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ffd27a_256x240.png +0 -0
  162. data/lib/diamonds/public/javascripts/jquery-ui/images/ui-icons_ffffff_256x240.png +0 -0
  163. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.min.css +7 -0
  164. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.min.js +13 -0
  165. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.structure.min.css +5 -0
  166. data/lib/diamonds/public/javascripts/jquery-ui/jquery-ui.theme.min.css +5 -0
  167. data/lib/diamonds/public/javascripts/jquery.js +4 -0
  168. data/lib/diamonds/public/javascripts/jquery.ui.touch-punch.min.js +11 -0
  169. data/lib/diamonds/public/javascripts/ne pas utiliser version en retard jeezs_editor.js b/data/lib/diamonds/public/javascripts/ne pas utiliser version en retard → jeezs_editor.js +0 -0
  170. data/lib/diamonds/public/javascripts/standalone.js +2316 -0
  171. data/lib/diamonds/public/javascripts/standalone.min.js +1 -0
  172. data/lib/diamonds/public/javascripts/wysiwyg-editor.min.css +1 -0
  173. data/lib/diamonds/public/javascripts/wysiwyg-editor.min.js +1 -0
  174. data/lib/diamonds/public/javascripts/wysiwyg.min.js +1 -0
  175. data/lib/diamonds/user_app/main.rb +45 -0
  176. data/lib/diamonds/version.rb +3 -0
  177. data/lib/diamonds/views/index.erb +35 -0
  178. data/lib/diamonds/views/javascripts/jeezs_editor.js.erb +365 -0
  179. data/lib/diamonds/views/stylesheets/main.css.erb +244 -0
  180. metadata +490 -0
@@ -0,0 +1,96 @@
1
+ def time
2
+ time= Time.now
3
+ return "#{time.year}_#{time.month}_#{time.day}_#{time.hour}_#{time.min}_#{time.sec}"
4
+
5
+ end
6
+
7
+ def read_ppage (fluxToSend, current_page)
8
+ @fluxToSend=fluxToSend
9
+ get_page= read_page(:pages, :title => current_page)
10
+ if get_page.nil?
11
+ pagecontent="default message to user, when empty page found"
12
+ else
13
+ pagecontent= get_page[:content]
14
+ end
15
+
16
+ # ------ read modules need on page # ------
17
+ requested_module_name=read_modules_on_page(:pages, :title => current_page)
18
+ if !requested_module_name.nil?
19
+ module_to_insert_on_page=requested_module_name.split(",")
20
+ else
21
+ module_to_insert_on_page=["vide"]
22
+ end
23
+ modules_content=""
24
+ module_to_insert_on_page.each do |module_to_get|
25
+ modules_content=get_modules_content(:modules, :title => module_to_get)+modules_content
26
+
27
+ end
28
+
29
+ pagecontent=pagecontent+modules_content
30
+
31
+ set_page pagecontent, "page_content", "editablecontent"
32
+ end
33
+
34
+ def set_page content, id=time, css_class="standard_object"
35
+ content=(content).to_json
36
+ @fluxToSend.send content
37
+ end
38
+
39
+ def machinize(fluxToSend, current_page, message)
40
+ msg_received=case message[:action]
41
+ when "save"
42
+ content= message[:pagecontent]
43
+ pagename= message[:currentpage]
44
+ save(:pages, :title => current_page, :content => content)
45
+ when "save_list_of_modules_on_page"
46
+ content= message[:pagecontent]
47
+ pagename= message[:currentpage]
48
+ save(:pages, :title => current_page, :modules_on_page => content.join(","))
49
+ when "save_menus_on_page"
50
+ content= message[:pagecontent]
51
+ pagename= message[:currentpage]
52
+ save(:pages, :title => current_page, :menus_on_page => content)
53
+ when "save_module"
54
+ content= message[:pagecontent]
55
+ pagename= message[:currentpage]
56
+ save(:modules, :title => pagename, :content => content)
57
+ when "get_module"
58
+ content= message[:pagecontent]
59
+ module_found=get_modules_content(:modules, :title => content)
60
+ module_found="<script>$('#master_items').append('#{module_found}');$('.modules').draggable()</script>"
61
+ module_found=(module_found).to_json
62
+ @fluxToSend.send module_found
63
+ when "read_modules_list"
64
+ module_found= read_modules_list
65
+ module_found= module_found.join("</li><li class=\\'module_available\\'>")
66
+ module_found="<ul><li class=\\'module_available\\'>#{module_found}</li></ul>"
67
+ module_found="<script>$('#module_infos').html('#{module_found}')</script>"
68
+ module_found=(module_found).to_json
69
+ @fluxToSend.send module_found
70
+ when "list_modules_number"
71
+ number_found= read_modules_list.length.to_s
72
+ number_found="<script>$('#module_utils').attr('number_of_modules','#{number_found}')</script>"
73
+ number_found=(number_found).to_json
74
+ @fluxToSend.send number_found
75
+ when "read_modules_on_page"
76
+ pagename= message[:currentpage]
77
+ module_requested=read_modules_on_page(:pages, :title => pagename)
78
+ if !module_requested.nil?
79
+ module_requested=module_requested.split(",")
80
+ module_requested= module_requested.join("</li><li class=\\'module_on_page\\'>")
81
+ module_requested="<ul><li class=\\'module_on_page\\'>#{module_requested}</li></ul>"
82
+ module_requested="<script>$('#module_infos').html('#{module_requested}')</script>"
83
+ module_requested=(module_requested).to_json
84
+ @fluxToSend.send module_requested
85
+ end
86
+ else
87
+ end
88
+ end
89
+
90
+
91
+
92
+
93
+
94
+
95
+
96
+
@@ -0,0 +1 @@
1
+ require 'opal/browser'
@@ -0,0 +1,4 @@
1
+ require 'opal'
2
+
3
+ Opal.append_path File.expand_path('../../../opal', __FILE__)
4
+ Opal.use_gem 'paggio'
@@ -0,0 +1,21 @@
1
+ $LOAD_PATH << File.expand_path('../opal', __FILE__)
2
+ require 'browser/version'
3
+
4
+ Gem::Specification.new {|s|
5
+ s.name = 'opal-browser'
6
+ s.version = Browser::VERSION
7
+ s.author = 'meh.'
8
+ s.email = 'meh@schizofreni.co'
9
+ s.homepage = 'http://github.com/opal/opal-browser'
10
+ s.platform = Gem::Platform::RUBY
11
+ s.summary = 'Browser support for Opal.'
12
+ s.license = 'MIT'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
16
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
+ s.require_paths = ['lib']
18
+
19
+ s.add_dependency 'opal'
20
+ s.add_dependency 'paggio'
21
+ }
@@ -0,0 +1,11 @@
1
+ require 'native'
2
+ require 'paggio'
3
+
4
+ require 'browser/version'
5
+ require 'browser/utils'
6
+ require 'browser/support'
7
+
8
+ require 'browser/event'
9
+ require 'browser/window'
10
+ require 'browser/dom'
11
+ require 'browser/css'
@@ -0,0 +1,111 @@
1
+ module Browser
2
+
3
+ # Allows you to wrap a block to use in an animation rendering cycle.
4
+ #
5
+ # @see https://developer.mozilla.org/en/docs/Web/API/window.requestAnimationFrame
6
+ class AnimationFrame
7
+ def self.supported?
8
+ ['Animation.request',
9
+ 'Animation.request (Chrome)',
10
+ 'Animation.request (Firefox)',
11
+ 'Animation.request (Opera)',
12
+ 'Animation.request (Internet Explorer)'].any? {|feature|
13
+ Browser.supports? feature
14
+ }
15
+ end
16
+
17
+ # Execute the block to update an animation before the next repaint.
18
+ #
19
+ # @param window [Window] the window to request the frame on
20
+ def initialize(window, &block)
21
+ @window = window
22
+ @native = window.to_n
23
+ @id = request(block)
24
+ end
25
+
26
+ if Browser.supports? 'Animation.request'
27
+ def request(block)
28
+ `#@native.requestAnimationFrame(#{block.to_n})`
29
+ end
30
+ elsif Browser.supports? 'Animation.request (Chrome)'
31
+ def request(block)
32
+ `#@native.webkitRequestAnimationFrame(#{block.to_n})`
33
+ end
34
+ elsif Browser.supports? 'Animation.request (Firefox)'
35
+ def request(block)
36
+ `#@native.mozRequestAnimationFrame(#{block.to_n})`
37
+ end
38
+ elsif Browser.supports? 'Animation.request (Opera)'
39
+ def request(block)
40
+ `#@native.oRequestAnimationFrame(#{block.to_n})`
41
+ end
42
+ elsif Browser.supports? 'Animation.request (Internet Explorer)'
43
+ def request(block)
44
+ `#@native.msRequestAnimationFrame(#{block.to_n})`
45
+ end
46
+ else
47
+ # Request the animation frame.
48
+ def request
49
+ raise NotImplementedError, 'window requestAnimationFrame unsupported'
50
+ end
51
+ end
52
+
53
+ if Browser.supports? 'Animation.cancel'
54
+ def cancel
55
+ `#@native.cancelAnimationFrame(#@id)`
56
+ end
57
+ elsif Browser.supports? 'Animation.cancel (Chrome)'
58
+ def cancel
59
+ `#@native.webkitCancelAnimationFrame(#@id)`
60
+ end
61
+ elsif Browser.supports? 'Animation.cancelRequest (Chrome)'
62
+ def cancel
63
+ `#@native.webkitCancelRequestAnimationFrame(#@id)`
64
+ end
65
+ elsif Browser.supports? 'Animation.cancel (Firefox)'
66
+ def cancel
67
+ `#@native.mozCancelAnimationFrame(#@id)`
68
+ end
69
+ elsif Browser.supports? 'Animation.cancelRequest (Firefox)'
70
+ def cancel
71
+ `#@native.mozCancelRequestAnimationFrame(#@id)`
72
+ end
73
+ elsif Browser.supports? 'Animation.cancel (Opera)'
74
+ def cancel
75
+ `#@native.oCancelAnimationFrame(#@id)`
76
+ end
77
+ elsif Browser.supports? 'Animation.cancelRequest (Opera)'
78
+ def cancel
79
+ `#@native.oCancelRequestAnimationFrame(#@id)`
80
+ end
81
+ elsif Browser.supports? 'Animation.cancel (Internet Explorer)'
82
+ def cancel
83
+ `#@native.msCancelAnimationFrame(#@id)`
84
+ end
85
+ elsif Browser.supports? 'Animation.cancelRequest (Internet Explorer)'
86
+ def cancel
87
+ `#@native.msCancelRequestAnimationFrame(#@id)`
88
+ end
89
+ else
90
+ # Cancel the animation frame request.
91
+ def cancel
92
+ raise NotImplementedError, 'window cancelAnimationFrame unsupported'
93
+ end
94
+ end
95
+ end
96
+
97
+ end
98
+
99
+ module Kernel
100
+ # (see Browser::AnimationFrame.new)
101
+ def animation_frame(&block)
102
+ Browser::AnimationFrame.new($window, &block)
103
+ end
104
+ end
105
+
106
+ class Proc
107
+ # (see Browser::AnimationFrame.new)
108
+ def animation_frame
109
+ Browser::AnimationFrame.new($window, &self)
110
+ end
111
+ end
@@ -0,0 +1,321 @@
1
+ require 'promise'
2
+
3
+ require 'browser/canvas/style'
4
+ require 'browser/canvas/text'
5
+ require 'browser/canvas/data'
6
+ require 'browser/canvas/gradient'
7
+
8
+ module Browser
9
+
10
+ class Canvas
11
+ include Native
12
+
13
+ attr_reader :element, :style, :text
14
+
15
+ def initialize(*args)
16
+ if DOM::Element === args.first
17
+ element = args.shift
18
+
19
+ if DOM::Element::Image === element
20
+ @image = element
21
+ else
22
+ @element = element
23
+ end
24
+ elsif Canvas === args.first
25
+ @image = args.first
26
+ end
27
+
28
+ unless @element
29
+ @element = $document.create_element('canvas')
30
+
31
+ if @image
32
+ @element[:width] = @image.width
33
+ @element[:height] = @image.height
34
+ else
35
+ @element[:width] = args.shift
36
+ @element[:height] = args.shift
37
+ end
38
+ end
39
+
40
+ if @element.node_name != 'CANVAS'
41
+ raise ArgumentError, "the element isn't a <canvas> element"
42
+ end
43
+
44
+ super(`#{@element.to_n}.getContext('2d')`)
45
+
46
+ @style = Style.new(self)
47
+ @text = Text.new(self)
48
+
49
+ if @image
50
+ draw_image(@image)
51
+ end
52
+ end
53
+
54
+ def width
55
+ @element[:width].to_i
56
+ end
57
+
58
+ def height
59
+ @element[:height].to_i
60
+ end
61
+
62
+ def append_to(parent)
63
+ @element.append_to(parent)
64
+ end
65
+
66
+ def load(path)
67
+ promise = Promise.new
68
+ image = $document.create_element('img')
69
+
70
+ image.on :load do
71
+ promise.resolve(image)
72
+ end
73
+
74
+ image[:src] = path
75
+
76
+ promise
77
+ end
78
+
79
+ def data(x = nil, y = nil, width = nil, height = nil)
80
+ x ||= 0
81
+ y ||= 0
82
+ width ||= self.width
83
+ height ||= self.height
84
+
85
+ Data.new(self, x, y, width, height)
86
+ end
87
+
88
+ def pattern(image, type = :repeat)
89
+ `#@native.createPattern(#{DOM(image).to_n}, type)`
90
+ end
91
+
92
+ def gradient(*args, &block)
93
+ Gradient.new(self, *args, &block)
94
+ end
95
+
96
+ def clear(x = nil, y = nil, width = nil, height = nil)
97
+ x ||= 0
98
+ y ||= 0
99
+ width ||= self.width
100
+ height ||= self.height
101
+
102
+ `#@native.clearRect(x, y, width, height)`
103
+ end
104
+
105
+ def begin
106
+ `#@native.beginPath()`
107
+
108
+ self
109
+ end
110
+
111
+ def close
112
+ `#@native.closePath()`
113
+
114
+ self
115
+ end
116
+
117
+ def save
118
+ `#@native.save()`
119
+
120
+ self
121
+ end
122
+
123
+ def restore
124
+ `#@native.restore()`
125
+
126
+ self
127
+ end
128
+
129
+ def move_to(x, y)
130
+ `#@native.moveTo(x, y)`
131
+
132
+ self
133
+ end
134
+
135
+ alias move move_to
136
+
137
+ def line_to(x, y)
138
+ `#@native.lineTo(x, y)`
139
+
140
+ self
141
+ end
142
+
143
+ def line(x1, y1, x2, y2)
144
+ move_to x1, y1
145
+ line_to x2, y2
146
+ end
147
+
148
+ def rect(x, y, width, height)
149
+ `#@native.rect(x, y, width, height)`
150
+
151
+ self
152
+ end
153
+
154
+ def arc(x, y, radius, angle, clockwise = false)
155
+ `#@native.arc(x, y, radius, #{angle[:start]}, #{angle[:end]}, !clockwise)`
156
+
157
+ self
158
+ end
159
+
160
+ def quadratic_curve_to(cp1x, cp1y, x, y)
161
+ `#@native.quadraticCurveTo(cp1x, cp1y, x, y)`
162
+
163
+ self
164
+ end
165
+
166
+ def bezier_curve_to(cp1x, cp1y, cp2x, cp2y, x, y)
167
+ `#@native.bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)`
168
+
169
+ self
170
+ end
171
+
172
+ def curve_to(*args)
173
+ case args.length
174
+ when 4 then quadratic_curve_to(*args)
175
+ when 6 then bezier_curve_to(*args)
176
+
177
+ else raise ArgumentError, "don't know where to dispatch"
178
+ end
179
+
180
+ self
181
+ end
182
+
183
+ def draw_image(image, *args)
184
+ if Canvas === image
185
+ image = image.element
186
+ else
187
+ image = DOM(image)
188
+ end
189
+
190
+ if args.first.is_a?(Hash)
191
+ source, destination = args
192
+
193
+ `#@native.drawImage(#{image.to_n}, #{source[:x]}, #{source[:y]}, #{source[:width]}, #{source[:height]}, #{destination[:x]}, #{destination[:y]}, #{destination[:width]}, #{destination[:height]})`
194
+ else
195
+ case args.length
196
+ when 0
197
+ `#@native.drawImage(#{image.to_n}, 0, 0)`
198
+
199
+ when 2
200
+ `#@native.drawImage(#{image.to_n}, #{args[0]}, #{args[1]})`
201
+
202
+ when 4
203
+ `#@native.drawImage(#{image.to_n}, #{args[0]}, #{args[1]}, #{args[2]}, #{args[3]})`
204
+ end
205
+ end
206
+
207
+ self
208
+ end
209
+
210
+ def translate(x, y, &block)
211
+ if block
212
+ save
213
+
214
+ `#@native.translate(x, y)`
215
+
216
+ instance_eval(&block)
217
+
218
+ restore
219
+ else
220
+ `#@native.translate(x, y)`
221
+ end
222
+
223
+ self
224
+ end
225
+
226
+ def rotate(angle, &block)
227
+ if block
228
+ save
229
+
230
+ `#@native.rotate(angle)`
231
+
232
+ instance_eval(&block)
233
+
234
+ restore
235
+ else
236
+ `#@native.rotate(angle)`
237
+ end
238
+
239
+ self
240
+ end
241
+
242
+ def scale(x, y, &block)
243
+ if block
244
+ save
245
+
246
+ `#@native.scale(x, y)`
247
+
248
+ instance_eval(&block)
249
+
250
+ restore
251
+ else
252
+ `#@native.scale(x, y)`
253
+ end
254
+
255
+ self
256
+ end
257
+
258
+ def transform(m11, m12, m21, m22, dx, dy, &block)
259
+ if block
260
+ save
261
+
262
+ `#@native.transform(m11, m12, m21, m22, dx, dy)`
263
+
264
+ instance_eval(&block)
265
+
266
+ restore
267
+ else
268
+ `#@native.transform(m11, m12, m21, m22, dx, dy)`
269
+ end
270
+
271
+ self
272
+ end
273
+
274
+ def path(&block)
275
+ `#@native.beginPath()`
276
+
277
+ instance_eval(&block)
278
+
279
+ `#@native.closePath()`
280
+
281
+ self
282
+ end
283
+
284
+ def fill(&block)
285
+ path(&block) if block
286
+
287
+ `#@native.fill()`
288
+
289
+ self
290
+ end
291
+
292
+ def stroke(&block)
293
+ path(&block) if block
294
+
295
+ `#@native.stroke()`
296
+
297
+ self
298
+ end
299
+
300
+ def clip(&block)
301
+ path(&block) if block
302
+
303
+ `#@native.clip()`
304
+
305
+ self
306
+ end
307
+
308
+ def point_in_path?(x, y)
309
+ `#@native.isPointInPath(x, y)`
310
+ end
311
+
312
+ def to_data(type = undefined)
313
+ `#{@element.to_n}.toDataUrl(type)`
314
+ end
315
+ end
316
+
317
+ Browser::DOM::Builder.for Canvas do |b, item|
318
+ item.element
319
+ end
320
+
321
+ end