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,36 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Select < Element
4
+ def value
5
+ %x{
6
+ if (#@native.value == "") {
7
+ return nil;
8
+ }
9
+ else {
10
+ return #@native.value;
11
+ }
12
+ }
13
+ end
14
+
15
+ def labels
16
+ NodeSet[Native::Array.new(`#@native.labels`)]
17
+ end
18
+
19
+ def options
20
+ NodeSet[Native::Array.new(`#@native.options`)]
21
+ end
22
+
23
+ def option
24
+ DOM(`#@native.options[#@native.selectedIndex]`)
25
+ end
26
+
27
+ def index
28
+ `#@native.selectedIndex`
29
+ end
30
+
31
+ alias_native :multiple?, :multiple
32
+ alias_native :required?, :required
33
+ alias_native :length
34
+ end
35
+
36
+ end; end; end
@@ -0,0 +1,34 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Size
4
+ attr_reader :element
5
+
6
+ # @private
7
+ def initialize(element, *inc)
8
+ @element = element
9
+ @native = element.to_n
10
+ @include = inc
11
+ end
12
+
13
+ # @!attribute width
14
+ # @return [Integer] the element width
15
+ def width
16
+ `#@native.offsetWidth`
17
+ end
18
+
19
+ def width=(value)
20
+ @element.style[:width] = value
21
+ end
22
+
23
+ # @!attribute height
24
+ # @return [Integer] the element height
25
+ def height
26
+ `#@native.offsetHeight`
27
+ end
28
+
29
+ def height=(value)
30
+ @element.style[:height] = value
31
+ end
32
+ end
33
+
34
+ end; end; end
@@ -0,0 +1,9 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Template < Element
4
+ def content
5
+ DOM(`#@native.content`)
6
+ end
7
+ end
8
+
9
+ end; end; end
@@ -0,0 +1,24 @@
1
+ module Browser; module DOM; class Element < Node
2
+
3
+ class Textarea < Element
4
+ def value
5
+ %x{
6
+ if (#@native.value == "") {
7
+ return nil;
8
+ }
9
+ else {
10
+ return #@native.value;
11
+ }
12
+ }
13
+ end
14
+
15
+ def value=(value)
16
+ `#@native.value = #{value}`
17
+ end
18
+
19
+ def clear
20
+ `#@native.value = ''`
21
+ end
22
+ end
23
+
24
+ end; end; end
@@ -0,0 +1,178 @@
1
+ module Browser; module DOM
2
+
3
+ # A {MutationObserver} is a performant way to observe changes in the DOM,
4
+ # either on the tree, the attributes or data.
5
+ #
6
+ # @see https://developer.mozilla.org/en/docs/Web/API/MutationObserver
7
+ class MutationObserver
8
+ def self.supported?
9
+ Browser.supports? :MutationObserver
10
+ end
11
+
12
+ include Native
13
+
14
+ # Encapsulates a recorded change.
15
+ class Record
16
+ include Native
17
+
18
+ # @!attribute [r] type
19
+ # @return [:attributes, :tree, :cdata] the type of the recorded change
20
+ def type
21
+ case `#@native.type`
22
+ when :attributes then :attribute
23
+ when :childList then :tree
24
+ when :characterData then :cdata
25
+ end
26
+ end
27
+
28
+ # Returns true if the change happened on attributes.
29
+ def attribute?
30
+ type == :attribute
31
+ end
32
+
33
+ # Returns true if the change happened on the tree.
34
+ def tree?
35
+ type == :tree
36
+ end
37
+
38
+ # Returns true if the change happened in a CDATA section.
39
+ def cdata?
40
+ type == :cdata
41
+ end
42
+
43
+ # @!attribute [r] added
44
+ # @return [NodeSet] the added nodes
45
+ def added
46
+ array = if `#@native.addedNodes != null`
47
+ Native::Array.new(`#@native.addedNodes`)
48
+ else
49
+ []
50
+ end
51
+
52
+ NodeSet[array]
53
+ end
54
+
55
+ # @!attribute [r] removed
56
+ # @return [NodeSet] the removed nodes
57
+ def removed
58
+ array = if `#@native.removedNodes != null`
59
+ Native::Array.new(`#@native.removedNodes`)
60
+ else
61
+ []
62
+ end
63
+
64
+ NodeSet[array]
65
+ end
66
+
67
+ # @!attribute [r] target
68
+ # @return [Node] the node the mutation affected
69
+ def target
70
+ DOM(`#@native.target`)
71
+ end
72
+
73
+ # @!attribute [r] old
74
+ # @return [String] the old value
75
+ alias_native :old, :oldValue
76
+
77
+ # @!attribute [r] name
78
+ # @return [String] the name of the attribute
79
+ alias_native :name, :attributeName
80
+
81
+ # @!attribute [r] namespace
82
+ # @return [String] the namespace of the attribute
83
+ alias_native :namespace, :attributeNamespace
84
+ end
85
+
86
+ # Create a new MutationObserver with the given block.
87
+ #
88
+ # @yieldparam records [Array<Record>] the recorded changes
89
+ def initialize(&block)
90
+ %x{
91
+ var func = function(records) {
92
+ return #{block.call(`records`.map { |r| Browser::DOM::MutationObserver::Record.new(r) })};
93
+ }
94
+ }
95
+
96
+ super(`new window.MutationObserver(func)`)
97
+ end
98
+
99
+ # Observe the given target with the given options.
100
+ #
101
+ # The supported options are:
102
+ #
103
+ # + **children** - whether to observe changes on the children
104
+ # of the target or not
105
+ # + **tree** - whether to observe changes on the whole subtree
106
+ # or not
107
+ # + **attributes** - whether to observe changes to attributes or not,
108
+ # if the value is `:old` the old value will be saved
109
+ # + **cdata** - whether to observe changes to CDATA sections or not,
110
+ # if the value is `:old` the old value will be saved
111
+ # + **filter** - array of attribute names to observe
112
+ #
113
+ # @param target [DOM::Node, native] the node to observe
114
+ # @param options [Hash?] the options
115
+ def observe(target, options = nil)
116
+ unless options
117
+ options = {
118
+ children: true,
119
+ tree: true,
120
+ attributes: :old,
121
+ cdata: :old
122
+ }
123
+ end
124
+
125
+ `#@native.observe(#{Native.convert(target)}, #{convert(options)})`
126
+
127
+ self
128
+ end
129
+
130
+ # Empty the observer queue and return its contents.
131
+ #
132
+ # @return [Array<Record>]
133
+ def take
134
+ `#@native.takeRecords()`.map { |r| Record.new(r) }
135
+ end
136
+
137
+ # Disconnect the observer, thus stopping observing any changes.
138
+ def disconnect
139
+ `#@native.disconnect()`
140
+ end
141
+
142
+ private
143
+ def convert(hash)
144
+ options = Native(`{}`)
145
+
146
+ if hash[:children]
147
+ options[:childList] = true
148
+ end
149
+
150
+ if hash[:tree]
151
+ options[:subtree] = true
152
+ end
153
+
154
+ if attrs = hash[:attributes]
155
+ options[:attributes] = true
156
+
157
+ if attrs == :old
158
+ options[:attributeOldValue] = true
159
+ end
160
+ end
161
+
162
+ if filter = hash[:filter]
163
+ options[:attributeFilter] = filter
164
+ end
165
+
166
+ if cdata = hash[:cdata]
167
+ options[:characterData] = true
168
+
169
+ if cdata == :old
170
+ options[:characterDataOldValue] = true
171
+ end
172
+ end
173
+
174
+ options.to_n
175
+ end
176
+ end
177
+
178
+ end; end
@@ -0,0 +1,464 @@
1
+ module Browser; module DOM
2
+
3
+ # Abstract class for all DOM node types.
4
+ #
5
+ # @see https://developer.mozilla.org/en-US/docs/Web/API/Node
6
+ class Node
7
+ include Native
8
+
9
+ ELEMENT_NODE = 1
10
+ ATTRIBUTE_NODE = 2
11
+ TEXT_NODE = 3
12
+ CDATA_SECTION_NODE = 4
13
+ ENTITY_REFERENCE_NOCE = 5
14
+ ENTITY_NODE = 6
15
+ PROCESSING_INSTRUCTION_NODE = 7
16
+ COMMENT_NODE = 8
17
+ DOCUMENT_NODE = 9
18
+ DOCUMENT_TYPE_NODE = 10
19
+ DOCUMENT_FRAGMENT_NODE = 11
20
+ NOTATION_NODE = 12
21
+
22
+ # Wrap a native DOM node.
23
+ #
24
+ # @param value [native] the native DOM node
25
+ #
26
+ # @return [Node]
27
+ def self.new(value)
28
+ if self == Node
29
+ @classes ||= [nil, Element, Attribute, Text, CDATA, nil, nil, nil, Comment, Document, nil, DocumentFragment]
30
+
31
+ if klass = @classes[`value.nodeType`]
32
+ klass.new(value)
33
+ else
34
+ raise ArgumentError, 'cannot instantiate a non derived Node object'
35
+ end
36
+ else
37
+ super
38
+ end
39
+ end
40
+
41
+ # Return true of the other element is the same underlying DOM node.
42
+ #
43
+ # @return [Boolean]
44
+ def ==(other)
45
+ `#@native === #{Native.convert(other)}`
46
+ end
47
+
48
+ # Append a child to the node.
49
+ #
50
+ # When passing a {String} a text node will be created.
51
+ #
52
+ # When passing an Object that responds to #each, every yielded element
53
+ # will be added following the same logic.
54
+ #
55
+ # @param node [String, Node, #each, #to_n] the node to append
56
+ #
57
+ # @return [self]
58
+ def <<(node)
59
+ if Opal.respond_to? node, :each
60
+ node.each { |n| self << n }
61
+ return self
62
+ end
63
+
64
+ unless native?(node)
65
+ if String === node
66
+ node = `#@native.ownerDocument.createTextNode(node)`
67
+ else
68
+ node = Native.convert(node)
69
+ end
70
+ end
71
+
72
+ `#@native.appendChild(node)`
73
+
74
+ self
75
+ end
76
+
77
+ def >>(node)
78
+ if Opal.respond_to? node, :each
79
+ node.each { |n| self >> n }
80
+ return self
81
+ end
82
+
83
+ unless native?(node)
84
+ if String === node
85
+ node = `#@native.ownerDocument.createTextNode(node)`
86
+ else
87
+ node = Native.convert(node)
88
+ end
89
+ end
90
+
91
+ if `#@native.firstChild == null`
92
+ `#@native.appendChild(node)`
93
+ else
94
+ `#@native.insertBefore(node, #@native.firstChild)`
95
+ end
96
+
97
+ self
98
+ end
99
+
100
+ def add_child(node = nil, &block)
101
+ unless node
102
+ node = DOM(&block)
103
+ end
104
+
105
+ self << node
106
+ end
107
+
108
+ # Add the passed node after this one.
109
+ #
110
+ # When passing a {String} a text node will be created.
111
+ #
112
+ # @param node [String, Node, #to_n] the node to add
113
+ def add_next_sibling(node = nil, &block)
114
+ unless node
115
+ node = DOM(&block)
116
+ end
117
+
118
+ unless native?(node)
119
+ if String === node
120
+ node = `#@native.ownerDocument.createTextNode(node)`
121
+ else
122
+ node = Native.convert(node)
123
+ end
124
+ end
125
+
126
+ `#@native.parentNode.insertBefore(node, #@native.nextSibling)`
127
+ end
128
+
129
+ # Add the passed node before this one.
130
+ #
131
+ # When passing a {String} a text node will be created.
132
+ #
133
+ # @param node [String, Node, #to_n] the node to add
134
+ def add_previous_sibling(node = nil, &block)
135
+ unless node
136
+ node = DOM(&block)
137
+ end
138
+
139
+ unless native?(node)
140
+ if String === node
141
+ node = `#@native.ownerDocument.createTextNode(node)`
142
+ else
143
+ node = Native.convert(node)
144
+ end
145
+ end
146
+
147
+ `#@native.parentNode.insertBefore(node, #@native)`
148
+ end
149
+
150
+ alias after add_next_sibling
151
+
152
+ # Append the node to the passed one.
153
+ #
154
+ # @param node [Node] the node to append to
155
+ def append_to(node)
156
+ node << self
157
+ end
158
+
159
+ # Get an array of ancestors.
160
+ #
161
+ # Passing a selector will select the ancestors matching it.
162
+ #
163
+ # @param expression [String] the selector to use as filter
164
+ #
165
+ # @return [NodeSet]
166
+ def ancestors(expression = nil)
167
+ return NodeSet[] unless parent
168
+
169
+ parents = [parent]
170
+
171
+ while parent = parents.last.parent
172
+ parents << parent
173
+ end
174
+
175
+ if Document === parents.last
176
+ parents.pop
177
+ end
178
+
179
+ if expression
180
+ parents.select! { |p| p =~ expression }
181
+ end
182
+
183
+ NodeSet.new(parents)
184
+ end
185
+
186
+ alias before add_previous_sibling
187
+
188
+ # Remove the node from its parent.
189
+ def remove
190
+ parent.remove_child(self) if parent
191
+ end
192
+
193
+ # Remove all the children of the node.
194
+ def clear
195
+ children.remove
196
+ end
197
+
198
+ # @!attribute content
199
+ # @return [String] the inner text content of the node
200
+ if Browser.supports? 'Element.textContent'
201
+ def content
202
+ `#@native.textContent`
203
+ end
204
+
205
+ def content=(value)
206
+ `#@native.textContent = #{value}`
207
+ end
208
+ elsif Browser.supports? 'Element.innerText'
209
+ def content
210
+ `#@native.innerText`
211
+ end
212
+
213
+ def content=(value)
214
+ `#@native.innerText = #{value}`
215
+ end
216
+ else
217
+ def content
218
+ raise NotImplementedError, 'node text content unsupported'
219
+ end
220
+
221
+ def content=(value)
222
+ raise NotImplementedError, 'node text content unsupported'
223
+ end
224
+ end
225
+
226
+ def blank?
227
+ raise NotImplementedError
228
+ end
229
+
230
+ # Return true if the node is a CDATA section.
231
+ def cdata?
232
+ node_type == CDATA_SECTION_NODE
233
+ end
234
+
235
+ # @!attribute [r] child
236
+ # @return [Node?] the first child of the node
237
+ def child
238
+ children.first
239
+ end
240
+
241
+ # @!attribute children
242
+ # @return [NodeSet] the children of the node
243
+ def children
244
+ NodeSet[Native::Array.new(`#@native.childNodes`)]
245
+ end
246
+
247
+ def children=(node)
248
+ raise NotImplementedError
249
+ end
250
+
251
+ # Return true if the node is a comment.
252
+ def comment?
253
+ node_type == COMMENT_NODE
254
+ end
255
+
256
+ # @!attribute [r] document
257
+ # @return [Document?] the document the node is attached to
258
+ def document
259
+ DOM(`#@native.ownerDocument`) if defined?(`#@native.ownerDocument`)
260
+ end
261
+
262
+ # Return true if the node is a document.
263
+ def document?
264
+ node_type == DOCUMENT_NODE
265
+ end
266
+
267
+ # Return true if the node is an element.
268
+ def elem?
269
+ node_type == ELEMENT_NODE
270
+ end
271
+
272
+ alias element? elem?
273
+
274
+ # @!attribute [r] element_children
275
+ # @return [NodeSet] all the children which are elements
276
+ def element_children
277
+ children.select(&:element?)
278
+ end
279
+
280
+ alias elements element_children
281
+
282
+ # @!attribute [r] first_element_child
283
+ # @return [Element?] the first element child
284
+ def first_element_child
285
+ element_children.first
286
+ end
287
+
288
+ # Return true if the node is a document fragment.
289
+ def fragment?
290
+ node_type == DOCUMENT_FRAGMENT_NODE
291
+ end
292
+
293
+ # @!attribute inner_html
294
+ # @return [String] the inner HTML of the node
295
+ def inner_html
296
+ `#@native.innerHTML`
297
+ end
298
+
299
+ def inner_html=(value)
300
+ `#@native.innerHTML = #{value}`
301
+ end
302
+
303
+ alias inner_text content
304
+ alias inner_text= content=
305
+
306
+ # @!attribute [r] last_element_child
307
+ # @return [Element?] the last element child
308
+ def last_element_child
309
+ element_children.last
310
+ end
311
+
312
+ # @!attribute name
313
+ # @return [String] the name of the node
314
+ def name
315
+ `#@native.nodeName || nil`
316
+ end
317
+
318
+ def name=(value)
319
+ `#@native.nodeName = #{value.to_s}`
320
+ end
321
+
322
+ # @!attribute [r] namespace
323
+ # @return [String] the namespace of the node
324
+ def namespace
325
+ `#@native.namespaceURI || nil`
326
+ end
327
+
328
+ # @!attribute next
329
+ # @return [Node?] the next sibling of the node
330
+ def next
331
+ DOM(`#@native.nextSibling`) if `#@native.nextSibling != null`
332
+ end
333
+
334
+ alias next= add_next_sibling
335
+
336
+ # @!attribute [r] next_element
337
+ # @return [Element?] the next element sibling of the node
338
+ def next_element
339
+ current = self.next
340
+
341
+ while current && !current.element?
342
+ current = current.next
343
+ end
344
+
345
+ current
346
+ end
347
+
348
+ alias next_sibling next
349
+
350
+ alias node_name name
351
+
352
+ alias node_name= name=
353
+
354
+ # @!attribute [r] node_type
355
+ # @return [Symbol] the type of the node
356
+ def node_type
357
+ `#@native.nodeType`
358
+ end
359
+
360
+ # @!attribute parent
361
+ # @return [Element?] the parent of the node
362
+ def parent
363
+ DOM(`#@native.parentNode`) if `#@native.parentNode != null`
364
+ end
365
+
366
+ def parent=(node)
367
+ `#@native.parentNode = #{Native.convert(node)}`
368
+ end
369
+
370
+ def parse(text, options = {})
371
+ raise NotImplementedError
372
+ end
373
+
374
+ def path
375
+ raise NotImplementedError
376
+ end
377
+
378
+ # Prepend the node to the passed one.
379
+ #
380
+ # @param node [Node] the node to prepend to
381
+ def prepend_to(node)
382
+ node >> self
383
+ end
384
+
385
+ # @!attribute previous
386
+ # @return [Node?] the previous sibling of the node
387
+ def previous
388
+ DOM(`#@native.previousSibling`) if `#@native.previousSibling != null`
389
+ end
390
+
391
+ alias previous= add_previous_sibling
392
+
393
+ # @!attribute [r] previous_element
394
+ # @return [Element?] the previous element sibling of the node
395
+ def previous_element
396
+ current = self.previous
397
+
398
+ while current && !current.element?
399
+ current = current.previous
400
+ end
401
+
402
+ current
403
+ end
404
+
405
+ alias previous_sibling previous
406
+
407
+ # Remove the given node from the children of this node.
408
+ def remove_child(node)
409
+ `#@native.removeChild(#{Native.try_convert(node)})`
410
+ end
411
+
412
+ # Replace the node with the given one.
413
+ #
414
+ # @todo implement for NodeSet
415
+ #
416
+ # @param node [Node] the node to replace with
417
+ # @return [Node] the passed node
418
+ def replace(node)
419
+ unless native?(node)
420
+ if String === node
421
+ node = `#@native.ownerDocument.createTextNode(node)`
422
+ else
423
+ node = Native.convert(node)
424
+ end
425
+ end
426
+
427
+ `#@native.parentNode.replaceChild(node, #@native)`
428
+
429
+ node
430
+ end
431
+
432
+ alias replace_with replace
433
+
434
+ alias text content
435
+ alias text= content=
436
+
437
+ # Return true if the node is a text node.
438
+ def text?
439
+ node_type == TEXT_NODE
440
+ end
441
+
442
+ def traverse(&block)
443
+ raise NotImplementedError
444
+ end
445
+
446
+ alias type node_type
447
+
448
+ # @!attribute value
449
+ # @return [String] the value of the node
450
+ def value
451
+ `#@native.nodeValue || nil`
452
+ end
453
+
454
+ def value=(value)
455
+ `#@native.nodeValue = value`
456
+ end
457
+
458
+ # @private
459
+ def inspect
460
+ "#<DOM::Node: #{name}>"
461
+ end
462
+ end
463
+
464
+ end; end