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,194 @@
1
+ require 'promise'
2
+ require 'ostruct'
3
+
4
+ module Browser; module Database
5
+
6
+ class SQL
7
+ # Check if the browser supports WebSQL.
8
+ def self.supported?
9
+ Browser.supports? 'WebSQL'
10
+ end
11
+
12
+ class Error < StandardError
13
+ def self.new(error)
14
+ return super if self != Error
15
+
16
+ [Unknown, Database, Version, TooLarge, Quota, Syntax, Constraint, Timeout] \
17
+ [`error.code`].new(`error.message`)
18
+ end
19
+
20
+ Unknown = Class.new(self)
21
+ Database = Class.new(self)
22
+ Version = Class.new(self)
23
+ TooLarge = Class.new(self)
24
+ Quota = Class.new(self)
25
+ Syntax = Class.new(self)
26
+ Constraint = Class.new(self)
27
+ Timeout = Class.new(self)
28
+ end
29
+
30
+ include Native
31
+
32
+ # @return [String] the name of the database
33
+ attr_reader :name
34
+
35
+ # @return [String] the description for the database
36
+ attr_reader :description
37
+
38
+ # @return [Integer] the size constraint in bytes
39
+ attr_reader :size
40
+
41
+ # Open a database with the given name and options.
42
+ #
43
+ # @param name [String] the name for the database
44
+ # @param options [Hash] options to open the database
45
+ #
46
+ # @option options [String] :description the description for the database
47
+ # @option options [String] :version ('') the expected version of the database
48
+ # @option options [Integer] :size (5 * 1024 * 1024) the size constraint in bytes
49
+ def initialize(name, options = {})
50
+ @name = name
51
+ @description = options[:description] || name
52
+ @version = options[:version] || ''
53
+ @size = options[:size] || 2 * 1024 * 1024
54
+
55
+ super(`window.openDatabase(#{name}, #{@version}, #{@description}, #{@size})`)
56
+ end
57
+
58
+ # @overload version()
59
+ #
60
+ # Get the version of the database.
61
+ #
62
+ # @return [String]
63
+ #
64
+ # @overload version(from, to, &block)
65
+ #
66
+ # Migrate the database to a new version.
67
+ #
68
+ # @param from [String] the version you're migrating from
69
+ # @param to [String] the version you're migrating to
70
+ #
71
+ # @yieldparam transaction [Transaction] the transaction to work with
72
+ def version(from = nil, to = nil, &block)
73
+ return `#@native.version` unless block
74
+
75
+ `#@native.changeVersion(#{from}, #{to},
76
+ #{-> t { block.call(Transaction.new(self, t)) }})`
77
+ end
78
+
79
+ # Start a transaction on the database.
80
+ #
81
+ # @yieldparam transaction [Transaction] the transaction to work on
82
+ def transaction(&block)
83
+ raise ArgumentError, 'no block given' unless block
84
+
85
+ `#@native.transaction(#{-> t { block.call(Transaction.new(self, t)) }})`
86
+ end
87
+
88
+ # Allows you to make changes to the database or read data from it.
89
+ class Transaction
90
+ include Native
91
+
92
+ # @return [Database] the database the transaction has been created from
93
+ attr_reader :database
94
+
95
+ # @private
96
+ def initialize(database, transaction)
97
+ @database = database
98
+
99
+ super(transaction)
100
+ end
101
+
102
+ # Query the database.
103
+ #
104
+ # @param query [String] the SQL query to send
105
+ # @param parameters [Array] optional bind parameters for the query
106
+ #
107
+ # @return [Promise]
108
+ def query(query, *parameters)
109
+ promise = Promise.new
110
+
111
+ `#@native.executeSql(#{query}, #{parameters},
112
+ #{-> _, r { promise.resolve(Result.new(self, r)) }},
113
+ #{-> _, e { promise.reject(Error.new(e)) }})`
114
+
115
+ promise
116
+ end
117
+ end
118
+
119
+ # Represents a row.
120
+ class Row < OpenStruct
121
+ # @private
122
+ def initialize(row)
123
+ super(Hash.new(row))
124
+ end
125
+
126
+ def inspect
127
+ "#<SQL::Row: #{Hash.new(@native).inspect}>"
128
+ end
129
+ end
130
+
131
+ class Result
132
+ include Native
133
+
134
+ # @return [Transaction] the transaction the result came from
135
+ attr_reader :transaction
136
+
137
+ # @return [SQL] the database the result came from
138
+ attr_reader :database
139
+
140
+ # @private
141
+ def initialize(transaction, result)
142
+ @transaction = transaction
143
+ @database = transaction.database
144
+
145
+ super(result)
146
+ end
147
+
148
+ include Enumerable
149
+
150
+ # Get a row from the result.
151
+ #
152
+ # @param index [Integer] the index for the row
153
+ #
154
+ # @return [Row]
155
+ def [](index)
156
+ if index < 0
157
+ index += length
158
+ end
159
+
160
+ unless index < 0 || index >= length
161
+ Row.new(`#@native.rows.item(index)`)
162
+ end
163
+ end
164
+
165
+ # Enumerate over the rows.
166
+ #
167
+ # @yieldparam row [Row]
168
+ #
169
+ # @return [self]
170
+ def each(&block)
171
+ return enum_for :each unless block
172
+
173
+ %x{
174
+ for (var i = 0, length = #@native.rows.length; i < length; i++) {
175
+ #{block.call(self[`i`])};
176
+ }
177
+ }
178
+
179
+ self
180
+ end
181
+
182
+ # @!attribute [r] length
183
+ # @return [Integer] number of rows in the result
184
+ def length
185
+ `#@native.rows.length`
186
+ end
187
+
188
+ # @!attribute [r] affected
189
+ # @return [Integer] number of affected rows
190
+ alias_native :affected, :rowsAffected
191
+ end
192
+ end
193
+
194
+ end; end
@@ -0,0 +1,78 @@
1
+ module Browser
2
+
3
+ # Allows you to delay the call to a function which gets called after the
4
+ # given time.
5
+ #
6
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/Window.setTimeout
7
+ class Delay
8
+ # @!attribute [r] after
9
+ # @return [Float] the seconds after which the block is called
10
+ attr_reader :after
11
+
12
+ # Create and start a timeout.
13
+ #
14
+ # @param window [Window] the window to start the timeout on
15
+ # @param time [Float] seconds after which the block is called
16
+ def initialize(window, time, &block)
17
+ @window = Native.convert(window)
18
+ @after = time
19
+ @block = block
20
+ end
21
+
22
+ # Abort the timeout.
23
+ def abort
24
+ `#@window.clearTimeout(#@id)`
25
+ end
26
+
27
+ # Start the delay.
28
+ def start
29
+ @id = `#@window.setTimeout(#{@block.to_n}, #@after * 1000)`
30
+ end
31
+ end
32
+
33
+ class Window
34
+ # Execute a block after the given seconds.
35
+ #
36
+ # @param time [Float] the seconds after it gets called
37
+ #
38
+ # @return [Delay] the object representing the timeout
39
+ def after(time, &block)
40
+ Delay.new(@native, time, &block).tap(&:start)
41
+ end
42
+
43
+ # Execute a block after the given seconds, you have to call [#start] on it
44
+ # yourself.
45
+ #
46
+ # @param time [Float] the seconds after it gets called
47
+ #
48
+ # @return [Delay] the object representing the timeout
49
+ def after!(time, &block)
50
+ Delay.new(@native, time, &block)
51
+ end
52
+ end
53
+
54
+ end
55
+
56
+ module Kernel
57
+ # (see Browser::Window#after)
58
+ def after(time, &block)
59
+ $window.after(time, &block)
60
+ end
61
+
62
+ # (see Browser::Window#after!)
63
+ def after!(time, &block)
64
+ $window.after!(time, &block)
65
+ end
66
+ end
67
+
68
+ class Proc
69
+ # (see Browser::Window#after)
70
+ def after(time)
71
+ $window.after(time, &self)
72
+ end
73
+
74
+ # (see Browser::Window#after!)
75
+ def after!(time)
76
+ $window.after!(time, &self)
77
+ end
78
+ end
@@ -0,0 +1,84 @@
1
+ require 'browser/dom/node_set'
2
+ require 'browser/dom/node'
3
+ require 'browser/dom/attribute'
4
+ require 'browser/dom/character_data'
5
+ require 'browser/dom/text'
6
+ require 'browser/dom/cdata'
7
+ require 'browser/dom/comment'
8
+ require 'browser/dom/element'
9
+ require 'browser/dom/document'
10
+ require 'browser/dom/document_fragment'
11
+ require 'browser/dom/builder'
12
+ require 'browser/dom/mutation_observer'
13
+
14
+ module Kernel
15
+ # Parse an XML string into a DOM usable {Browser::DOM::Document}
16
+ #
17
+ # @param what [String] the string to parse
18
+ # @return [Browser::DOM::Document] the document
19
+ def XML(what)
20
+ %x{
21
+ var doc;
22
+
23
+ if (window.DOMParser) {
24
+ doc = new DOMParser().parseFromString(what, 'text/xml');
25
+ }
26
+ else {
27
+ doc = new ActiveXObject('Microsoft.XMLDOM');
28
+ doc.async = 'false';
29
+ doc.loadXML(what);
30
+ }
31
+ }
32
+
33
+ DOM(`doc`)
34
+ end
35
+
36
+ # Wrap a native element or create a DOM tree using the {Paggio::HTML} DSL.
37
+ #
38
+ # @return [Browser::DOM::Node]
39
+ def DOM(*args, &block)
40
+ if block
41
+ document = args.shift || $document
42
+ roots = Browser::DOM::Builder.new(document, &block).to_a
43
+
44
+ if roots.length == 1
45
+ roots.first
46
+ else
47
+ Browser::DOM::NodeSet.new(roots)
48
+ end
49
+ else
50
+ what = args.shift
51
+ document = args.shift || $document
52
+
53
+ if native?(what)
54
+ Browser::DOM::Node.new(what)
55
+ elsif Browser::DOM::Node === what
56
+ what
57
+ elsif String === what
58
+ %x{
59
+ var doc = #{Native.try_convert(document)}.createElement('div');
60
+ doc.innerHTML = what;
61
+
62
+ return #{DOM(`doc.childNodes.length == 1 ? doc.childNodes[0] : doc`)};
63
+ }
64
+ else
65
+ raise ArgumentError, "argument not DOM convertible"
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ module Browser
72
+
73
+ class Window
74
+ # Get the {DOM::Document} for this window.
75
+ #
76
+ # @return [DOM::Document]
77
+ def document
78
+ DOM(`#@native.document`)
79
+ end
80
+ end
81
+
82
+ end
83
+
84
+ $document = $window.document
@@ -0,0 +1,26 @@
1
+ module Browser; module DOM
2
+
3
+ # Encapsulates an {Element} attribute.
4
+ class Attribute
5
+ include Native
6
+
7
+ # @!attribute [r] name
8
+ # @return [String] the name of the attribute
9
+ alias_native :name
10
+
11
+ # @!attribute value
12
+ # @return [String] the value of the attribute
13
+ alias_native :value
14
+ alias_native :value=
15
+
16
+ # Returns true if the attribute is an id.
17
+ if Browser.supports? 'Attr.isId'
18
+ alias_native :id?, :isId
19
+ else
20
+ def id?
21
+ name == :id
22
+ end
23
+ end
24
+ end
25
+
26
+ end; end
@@ -0,0 +1,88 @@
1
+ # Temporary fix for a bug in String#scan
2
+ module Paggio::Utils
3
+ def self.heredoc(string)
4
+ string
5
+ end
6
+ end
7
+
8
+ class Paggio::HTML::Element < BasicObject
9
+ def on(*args, &block)
10
+ (@on ||= []) << [args, block]
11
+ end
12
+ end
13
+
14
+ module Browser; module DOM
15
+
16
+ class Builder
17
+ def self.to_h
18
+ @builders ||= {}
19
+ end
20
+
21
+ def self.for(klass, &block)
22
+ if block
23
+ to_h[klass] = block
24
+ else
25
+ to_h[klass]
26
+ end
27
+ end
28
+
29
+ def self.build(builder, item)
30
+ to_h.each {|klass, block|
31
+ if klass === item
32
+ return block.call(builder, item)
33
+ end
34
+ }
35
+
36
+ raise ArgumentError, "cannot build unknown item #{item}"
37
+ end
38
+
39
+ attr_reader :document, :element
40
+
41
+ def initialize(document, &block)
42
+ @document = document
43
+ @builder = Paggio::HTML.new(&block)
44
+ @roots = @builder.each.map { |e| Builder.build(self, e) }
45
+ end
46
+
47
+ def to_a
48
+ @roots
49
+ end
50
+ end
51
+
52
+ Builder.for String do |b, item|
53
+ b.document.create_text(item)
54
+ end
55
+
56
+ Builder.for Paggio::HTML::Element do |b, item|
57
+ dom = b.document.create_element(`item.name`)
58
+
59
+ if Hash === `item.attributes`
60
+ dom.attributes.merge!(`item.attributes`)
61
+ end
62
+
63
+ `item.class_names`.each {|value|
64
+ dom.add_class value
65
+ }
66
+
67
+ if on = `item.on || nil`
68
+ on.each {|args, block|
69
+ dom.on(*args, &block)
70
+ }
71
+ end
72
+
73
+ if inner = `item.inner_html || nil`
74
+ dom.inner_html = inner
75
+ else
76
+ item.each {|child|
77
+ dom << Builder.build(b, child)
78
+ }
79
+ end
80
+
81
+ dom
82
+ end
83
+
84
+ Builder.for DOM::Node do |b, item|
85
+ item
86
+ end
87
+
88
+ end; end