browserio 0.0.4 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.ruby-version +1 -0
- data/Gemfile +0 -2
- data/LICENSE.txt +1 -1
- data/README.md +5 -23
- data/Rakefile +1 -8
- data/bin/bio +36 -0
- data/browserio.gemspec +9 -14
- data/lib/browserio.rb +3 -187
- data/lib/browserio/cli.rb +40 -0
- data/lib/browserio/version.rb +1 -1
- metadata +34 -125
- data/lib/browserio/component.rb +0 -326
- data/lib/browserio/config.rb +0 -120
- data/lib/browserio/dom.rb +0 -139
- data/lib/browserio/events.rb +0 -136
- data/lib/browserio/html.rb +0 -29
- data/lib/browserio/opal.rb +0 -18
- data/lib/browserio/plugins/form.rb +0 -343
- data/lib/browserio/plugins/history.rb +0 -92
- data/lib/browserio/plugins/location.rb +0 -78
- data/lib/browserio/plugins/pjax.rb +0 -65
- data/lib/browserio/plugins/validations.rb +0 -251
- data/lib/browserio/utilis/blank.rb +0 -133
- data/lib/browserio/utilis/element.rb +0 -23
- data/lib/browserio/utilis/hash.rb +0 -77
- data/lib/browserio/utilis/indifferent_hash.rb +0 -209
- data/lib/browserio/utilis/methods.rb +0 -25
- data/lib/browserio/utilis/nokogiri.rb +0 -44
- data/lib/browserio/utilis/titleize.rb +0 -97
- data/lib/browserio/utilis/try.rb +0 -106
- data/lib/roda/plugins/browserio.rb +0 -88
- data/test/dummy/app.rb +0 -34
- data/test/dummy/components/bar.rb +0 -16
- data/test/dummy/components/root.rb +0 -39
- data/test/dummy/config.ru +0 -6
- data/test/dummy/forms/foo.rb +0 -6
- data/test/test.js +0 -59
- data/test/test_basic_component.rb +0 -34
- data/test/test_browserio.rb +0 -13
- data/test/test_helper.rb +0 -38
data/lib/browserio/component.rb
DELETED
@@ -1,326 +0,0 @@
|
|
1
|
-
module BrowserIO
|
2
|
-
class Component
|
3
|
-
include Methods
|
4
|
-
|
5
|
-
REJECTED_CLIENT_OPTS = %i(scope file_path methods_wrapped events klass on on_server_methods added_class_events)
|
6
|
-
|
7
|
-
class << self
|
8
|
-
# Override the default new behaviour
|
9
|
-
def new(*args, &block)
|
10
|
-
obj = allocate
|
11
|
-
|
12
|
-
obj.bio_opts.js = args.delete(:js)
|
13
|
-
obj.bio_opts.init = args.delete(:init)
|
14
|
-
|
15
|
-
# Merge other args into opts
|
16
|
-
args.each { |a| a.each {|k, v| obj.bio_opts[k] = v } } if args.any?
|
17
|
-
|
18
|
-
# Set all the requires
|
19
|
-
unless RUBY_ENGINE == 'opal'
|
20
|
-
obj.bio_opts.requires = obj.bio_config.get_requires
|
21
|
-
end
|
22
|
-
|
23
|
-
obj.bio_opts.events.scope = obj
|
24
|
-
|
25
|
-
# Set all the on events
|
26
|
-
obj.bio_opts.on.each do |*a, &b|
|
27
|
-
obj.bio_opts.events.add(*a.first.first, &a.first.last)
|
28
|
-
end
|
29
|
-
bio_opts.added_class_events = true
|
30
|
-
|
31
|
-
if obj.bio_opts.init
|
32
|
-
if obj.bio_opts.init.is_a? Array
|
33
|
-
obj.send :initialize, *obj.bio_opts.init, &block
|
34
|
-
else
|
35
|
-
obj.send :initialize, obj.bio_opts.init, &block
|
36
|
-
end
|
37
|
-
else
|
38
|
-
obj.send :initialize, &block
|
39
|
-
end
|
40
|
-
|
41
|
-
unless bio_opts.methods_wrapped
|
42
|
-
obj.bio_opts.methods_wrapped = bio_opts.methods_wrapped = true
|
43
|
-
|
44
|
-
public_instance_methods(false).each do |meth|
|
45
|
-
alias_method :"bio_original_#{meth}", :"#{meth}"
|
46
|
-
define_method "#{meth}" do |*d_args, &blk|
|
47
|
-
if bio_opts.js
|
48
|
-
bio_opts.method_called = meth
|
49
|
-
bio_opts.method_args = *d_args
|
50
|
-
end
|
51
|
-
|
52
|
-
o_name = "bio_original_#{meth}"
|
53
|
-
|
54
|
-
if client? || method(o_name).parameters.length > 0
|
55
|
-
result = send(o_name, *d_args, &blk)
|
56
|
-
else
|
57
|
-
result = send(o_name, &blk)
|
58
|
-
end
|
59
|
-
|
60
|
-
# Append the initialize javscript
|
61
|
-
if server? && opts.js
|
62
|
-
result = result.to_html if result.is_a? DOM
|
63
|
-
result << bio_javascript
|
64
|
-
end
|
65
|
-
|
66
|
-
result
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
obj
|
72
|
-
end
|
73
|
-
|
74
|
-
# Used to setup the component with default options.
|
75
|
-
#
|
76
|
-
# @example
|
77
|
-
# class SomeComponent < Component
|
78
|
-
# setup do |config|
|
79
|
-
# config.name :some
|
80
|
-
# end
|
81
|
-
# end
|
82
|
-
# @yield [Config]
|
83
|
-
def bio_setup(&block)
|
84
|
-
block.call bio_config
|
85
|
-
end
|
86
|
-
alias_method :setup, :bio_setup
|
87
|
-
|
88
|
-
# Set templates
|
89
|
-
#
|
90
|
-
# @example
|
91
|
-
# tmpl :some_name, dom.find('#some-div')
|
92
|
-
# @return dom [DOM]
|
93
|
-
def bio_tmpl(name, dom = false, remove = true)
|
94
|
-
if dom
|
95
|
-
dom = remove ? dom.remove : dom
|
96
|
-
bio_opts.tmpl[name] = {
|
97
|
-
dom: dom,
|
98
|
-
html: dom.to_html
|
99
|
-
}
|
100
|
-
elsif t = bio_opts.tmpl[name]
|
101
|
-
dom = DOM.new t[:html]
|
102
|
-
else
|
103
|
-
false
|
104
|
-
end
|
105
|
-
|
106
|
-
dom
|
107
|
-
end
|
108
|
-
alias_method :tmpl, :bio_tmpl
|
109
|
-
|
110
|
-
def bio_dom
|
111
|
-
@bio_dom ||= DOM.new bio_opts.html
|
112
|
-
end
|
113
|
-
alias_method :dom, :bio_dom
|
114
|
-
|
115
|
-
# Shortcut for BrowserIO.components
|
116
|
-
#
|
117
|
-
# @return [Hash, BrowserIO.components]
|
118
|
-
def bio_components
|
119
|
-
BrowserIO.components ||= {}
|
120
|
-
end
|
121
|
-
alias_method :components, :bio_components
|
122
|
-
|
123
|
-
# Shortcut for the Config#opts
|
124
|
-
#
|
125
|
-
# @return [Openstruct, Config#opts]
|
126
|
-
def bio_opts
|
127
|
-
bio_config.opts
|
128
|
-
end
|
129
|
-
alias_method :opts, :bio_opts
|
130
|
-
|
131
|
-
def bio_config
|
132
|
-
@bio_config ||= begin
|
133
|
-
args = BrowserIO.config.opts_dup.merge(klass: self, object_events: {})
|
134
|
-
|
135
|
-
if server?
|
136
|
-
args[:file_path] = caller.first.gsub(/(?<=\.rb):.*/, '')
|
137
|
-
args[:path_name] = args[:file_path]
|
138
|
-
.gsub(%r{(#{Dir.pwd}/|.*(?=browserio))}, '')
|
139
|
-
.gsub(/\.rb$/, '')
|
140
|
-
end
|
141
|
-
|
142
|
-
c = Config.new(args)
|
143
|
-
|
144
|
-
# If extending from a plugin it will automatically require it.
|
145
|
-
ancestors.each do |klass|
|
146
|
-
next if klass.to_s == name.to_s
|
147
|
-
|
148
|
-
if klass.method_defined?(:bio_opts) && klass.bio_opts.name.to_s =~ /_plugin$/
|
149
|
-
c.requires klass.bio_opts.name
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
c
|
154
|
-
end
|
155
|
-
end
|
156
|
-
alias_method :config, :bio_config
|
157
|
-
|
158
|
-
def bio_on(*args, &block)
|
159
|
-
if args.first.to_s != 'server'
|
160
|
-
bio_opts.on << [args, block]
|
161
|
-
else
|
162
|
-
bio_on_server(&block)
|
163
|
-
end
|
164
|
-
end
|
165
|
-
alias_method :on, :bio_on
|
166
|
-
|
167
|
-
def method_missing(method, *args, &block)
|
168
|
-
if bio_opts.scope.respond_to?(method, true)
|
169
|
-
bio_opts.scope.send method, *args, &block
|
170
|
-
else
|
171
|
-
super
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
|
-
def client_bio_opts
|
176
|
-
bio_config.opts_dup.reject {|k, v| REJECTED_CLIENT_OPTS.include? k }
|
177
|
-
end
|
178
|
-
|
179
|
-
def bio_on_server(&block)
|
180
|
-
if server?
|
181
|
-
yield
|
182
|
-
else
|
183
|
-
m = Module.new(&block)
|
184
|
-
|
185
|
-
m.public_instance_methods(false).each do |meth|
|
186
|
-
bio_opts.on_server_methods << meth.to_s
|
187
|
-
|
188
|
-
define_method "#{meth}" do |*args, &blk|
|
189
|
-
path_name = bio_opts.path_name
|
190
|
-
# event_id = "comp-event-#{$faye.generate_id}"
|
191
|
-
|
192
|
-
payload = client_bio_opts.reject do |k, _|
|
193
|
-
%w(html tmpl requires plugins object_events).include? k
|
194
|
-
end
|
195
|
-
payload[:method_called] = meth
|
196
|
-
payload[:method_args] = args
|
197
|
-
|
198
|
-
HTTP.post("/#{bio_opts.assets_url}/#{path_name}.call",
|
199
|
-
headers: {
|
200
|
-
'X-CSRF-TOKEN' => Element.find('meta[name=_csrf]').attr('content')
|
201
|
-
},
|
202
|
-
payload: payload) do |response|
|
203
|
-
|
204
|
-
# We set the new csrf token
|
205
|
-
xhr = Native(response.xhr)
|
206
|
-
csrf = xhr.getResponseHeader('BIO-CSRF-TOKEN')
|
207
|
-
Element.find('meta[name=_csrf]').attr 'content', csrf
|
208
|
-
###########################
|
209
|
-
|
210
|
-
res = JSON.from_object(`response`)
|
211
|
-
|
212
|
-
blk.call res[:body], res
|
213
|
-
end
|
214
|
-
|
215
|
-
true
|
216
|
-
end
|
217
|
-
end
|
218
|
-
|
219
|
-
include m
|
220
|
-
end
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
# Duplicate of class condig [Config]
|
225
|
-
# @return config [Config]
|
226
|
-
def bio_config
|
227
|
-
@bio_config ||= begin
|
228
|
-
c = Config.new(self.class.bio_config.opts_dup.merge(events: Events.new))
|
229
|
-
c.opts.events.object_events = c.opts.object_events.dup
|
230
|
-
c.opts.object_events = {}
|
231
|
-
c
|
232
|
-
end
|
233
|
-
end
|
234
|
-
alias_method :config, :bio_config
|
235
|
-
|
236
|
-
# Duplicated of config.opts [Config#opts]
|
237
|
-
# @return opts [Config#opts]
|
238
|
-
def bio_opts
|
239
|
-
bio_config.opts
|
240
|
-
end
|
241
|
-
alias_method :opts, :bio_opts
|
242
|
-
|
243
|
-
# Grab a copy of the template
|
244
|
-
# @return dom [DOM]
|
245
|
-
def bio_tmpl(name)
|
246
|
-
self.class.bio_tmpl name
|
247
|
-
end
|
248
|
-
alias_method :tmpl, :bio_tmpl
|
249
|
-
|
250
|
-
# Dom
|
251
|
-
# @return bio_dom [Dom]
|
252
|
-
def bio_dom
|
253
|
-
@bio_dom ||= begin
|
254
|
-
if server?
|
255
|
-
DOM.new self.class.bio_dom.to_html
|
256
|
-
else
|
257
|
-
DOM.new(Element)
|
258
|
-
end
|
259
|
-
end
|
260
|
-
end
|
261
|
-
alias_method :dom, :bio_dom
|
262
|
-
|
263
|
-
# Special method that acts like the javascript equivalent
|
264
|
-
# @example
|
265
|
-
# foo = {
|
266
|
-
# bar: function { |moo|
|
267
|
-
# moo.call 'something'
|
268
|
-
# }
|
269
|
-
# }.to_n
|
270
|
-
def bio_function(*args, &block)
|
271
|
-
args.any? && raise(ArgumentError, '`function` does not accept arguments')
|
272
|
-
block || raise(ArgumentError, 'block required')
|
273
|
-
proc do |*a|
|
274
|
-
a.map! {|x| Native(`x`)}
|
275
|
-
@this = Native(`this`)
|
276
|
-
%x{
|
277
|
-
var bs = block.$$s,
|
278
|
-
result;
|
279
|
-
block.$$s = null;
|
280
|
-
result = block.apply(self, a);
|
281
|
-
block.$$s = bs;
|
282
|
-
|
283
|
-
return result;
|
284
|
-
}
|
285
|
-
end
|
286
|
-
end
|
287
|
-
alias_method :function, :bio_function
|
288
|
-
|
289
|
-
def bio_javascript
|
290
|
-
return unless server?
|
291
|
-
|
292
|
-
compiled_opts = Base64.encode64 client_bio_opts.to_json
|
293
|
-
name = bio_opts.file_path.gsub("#{Dir.pwd}/", '').gsub(/\.rb$/, '')
|
294
|
-
|
295
|
-
javascript = <<-JS
|
296
|
-
BrowserIO.javascript('#{name}', JSON.parse(Base64.decode64('#{compiled_opts}')))
|
297
|
-
JS
|
298
|
-
"<script>#{Opal.compile(javascript)}</script>"
|
299
|
-
end
|
300
|
-
alias_method :javscript, :bio_javascript
|
301
|
-
|
302
|
-
def client_bio_opts
|
303
|
-
bio_config.opts_dup.reject {|k, v| REJECTED_CLIENT_OPTS.include? k }
|
304
|
-
end
|
305
|
-
alias_method :client_opts, :client_bio_opts
|
306
|
-
|
307
|
-
def bio_trigger(*args)
|
308
|
-
bio_opts.events.trigger(*args)
|
309
|
-
end
|
310
|
-
alias_method :trigger, :bio_trigger
|
311
|
-
|
312
|
-
if RUBY_ENGINE == 'opal'
|
313
|
-
def bio(*args)
|
314
|
-
BrowserIO[*args]
|
315
|
-
end
|
316
|
-
end
|
317
|
-
|
318
|
-
def method_missing(method, *args, &block)
|
319
|
-
if bio_opts.scope.respond_to?(method, true)
|
320
|
-
bio_opts.scope.send method, *args, &block
|
321
|
-
else
|
322
|
-
super
|
323
|
-
end
|
324
|
-
end
|
325
|
-
end
|
326
|
-
end
|
data/lib/browserio/config.rb
DELETED
@@ -1,120 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
require 'browserio/events'
|
3
|
-
|
4
|
-
module BrowserIO
|
5
|
-
class Config
|
6
|
-
include Methods
|
7
|
-
|
8
|
-
# Stores the options for the config
|
9
|
-
#
|
10
|
-
# @return [OpenStruct]
|
11
|
-
attr_accessor :opts
|
12
|
-
|
13
|
-
# Setup initial opts values
|
14
|
-
#
|
15
|
-
# @param opts [Hash] The initial params for #opts.
|
16
|
-
def initialize(opts = {})
|
17
|
-
opts = {
|
18
|
-
tmpl: IndifferentHash.new,
|
19
|
-
scope: false,
|
20
|
-
loaded: false,
|
21
|
-
requires: [],
|
22
|
-
on: [],
|
23
|
-
on_server_methods: [],
|
24
|
-
object_events: {},
|
25
|
-
is_plugin: false,
|
26
|
-
plugins: []
|
27
|
-
}.merge opts
|
28
|
-
|
29
|
-
@opts = OpenStruct.new(opts)
|
30
|
-
end
|
31
|
-
|
32
|
-
# Set the unique name of the component
|
33
|
-
#
|
34
|
-
# @param name [<String, Symbol>, #to_sym]
|
35
|
-
def name(name)
|
36
|
-
opts.name = name.to_sym
|
37
|
-
opts.is_plugin = true if name.to_s =~ /_plugin$/
|
38
|
-
BrowserIO.components ||= {}
|
39
|
-
BrowserIO.components[opts.name] = opts
|
40
|
-
end
|
41
|
-
|
42
|
-
def is_plugin?
|
43
|
-
opts.is_plugin
|
44
|
-
end
|
45
|
-
|
46
|
-
%w(scope assets_url).each do |m|
|
47
|
-
define_method m do |v|
|
48
|
-
opts[m] = v
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
# Used to set and update the dom
|
53
|
-
def dom
|
54
|
-
if server?
|
55
|
-
yield
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
# Set the raw html
|
60
|
-
# @param html [String]
|
61
|
-
def html(html)
|
62
|
-
unless RUBY_ENGINE == 'opal'
|
63
|
-
opts.html = begin
|
64
|
-
File.read html
|
65
|
-
rescue
|
66
|
-
html
|
67
|
-
end.strip
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def requires(*args)
|
72
|
-
unless RUBY_ENGINE == 'opal'
|
73
|
-
args.each do |a|
|
74
|
-
if a.to_s[/_plugin$/]
|
75
|
-
require "browserio/plugins/#{a.to_s.gsub(/_plugin$/, '')}"
|
76
|
-
end
|
77
|
-
opts.requires << a
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
def opts_dup
|
83
|
-
opts.to_h.inject({}) {|copy, (key, value)| copy[key] = value.dup rescue value; copy}
|
84
|
-
end
|
85
|
-
|
86
|
-
def plugin(name)
|
87
|
-
unless RUBY_ENGINE == 'opal'
|
88
|
-
require "browserio/plugins/#{name}"
|
89
|
-
end
|
90
|
-
end
|
91
|
-
|
92
|
-
def get_requires(requires = false, previous_requires = [])
|
93
|
-
list = []
|
94
|
-
|
95
|
-
unless requires
|
96
|
-
requires ||= opts.requires.dup
|
97
|
-
previous_requires << opts.name.to_sym
|
98
|
-
end
|
99
|
-
|
100
|
-
previous_requires.each { |p| requires.delete(p) }
|
101
|
-
|
102
|
-
requires.each do |r|
|
103
|
-
klass = BrowserIO.components[r.to_sym].klass
|
104
|
-
o = klass.client_bio_opts.select do |k, v|
|
105
|
-
%w(path_name name assets_url requires).include? k.to_s
|
106
|
-
end
|
107
|
-
|
108
|
-
# We don't want to get a stack limit error so we stop something
|
109
|
-
# requiring itself
|
110
|
-
pr = previous_requires.dup << o[:name].to_sym
|
111
|
-
|
112
|
-
o[:requires] = get_requires o[:requires].dup, pr if o[:requires].present?
|
113
|
-
|
114
|
-
list << o
|
115
|
-
end
|
116
|
-
|
117
|
-
list
|
118
|
-
end
|
119
|
-
end
|
120
|
-
end
|
data/lib/browserio/dom.rb
DELETED
@@ -1,139 +0,0 @@
|
|
1
|
-
module BrowserIO
|
2
|
-
class DOM
|
3
|
-
include Methods
|
4
|
-
|
5
|
-
attr_accessor :dom, :raw_html
|
6
|
-
|
7
|
-
class << self
|
8
|
-
# Shortcut for creating dom
|
9
|
-
# @param html [String]
|
10
|
-
# @return dom [DOM]
|
11
|
-
def [] html
|
12
|
-
new html
|
13
|
-
end
|
14
|
-
end
|
15
|
-
|
16
|
-
def initialize html
|
17
|
-
@raw_html = html
|
18
|
-
|
19
|
-
if server?
|
20
|
-
@dom = raw_html.is_a?(String) ? HTML[raw_html.dup] : raw_html
|
21
|
-
else
|
22
|
-
@dom = raw_html.is_a?(String) ? Element[raw_html.dup] : raw_html
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
|
-
def find string, &block
|
27
|
-
if client?
|
28
|
-
node = DOM.new dom.find(string)
|
29
|
-
elsif server?
|
30
|
-
if block_given?
|
31
|
-
node = DOM.new dom.css(string)
|
32
|
-
else
|
33
|
-
node = DOM.new dom.at(string)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
if block_given?
|
38
|
-
node.each_with_index do |n, i|
|
39
|
-
block.call DOM.new(n), i
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
node
|
44
|
-
end
|
45
|
-
|
46
|
-
if RUBY_ENGINE == 'ruby'
|
47
|
-
def data key = false, value = false
|
48
|
-
d = Hash[node.xpath("@*[starts-with(name(), 'data-')]").map{|a| [a.name, a.value]}]
|
49
|
-
|
50
|
-
if !key
|
51
|
-
d
|
52
|
-
elsif key && !value
|
53
|
-
d[key]
|
54
|
-
else
|
55
|
-
node["data-#{key}"] = value
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def val value
|
60
|
-
node.content = value
|
61
|
-
end
|
62
|
-
|
63
|
-
def add_class classes
|
64
|
-
classes = (classes || '').split ' ' unless classes.is_a? Array
|
65
|
-
new_classes = ((node.attr('class') || '').split(' ') << classes).uniq.join(' ')
|
66
|
-
node['class'] = new_classes
|
67
|
-
end
|
68
|
-
|
69
|
-
def remove_class classes
|
70
|
-
classes = (classes || '').split ' ' unless classes.is_a? Array
|
71
|
-
(node.attr('class') || '').split(' ').reject { |n| n =~ /active|asc|desc/i }.join(' ')
|
72
|
-
end
|
73
|
-
|
74
|
-
def attr key, value = false
|
75
|
-
if value
|
76
|
-
value = value.join ' ' if value.is_a? Array
|
77
|
-
node[key] = value
|
78
|
-
else
|
79
|
-
super key
|
80
|
-
end
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def html= content
|
85
|
-
if server?
|
86
|
-
node.inner_html = content
|
87
|
-
else
|
88
|
-
content = content.dom if content.is_a? BrowserIO::DOM
|
89
|
-
node.html content
|
90
|
-
end
|
91
|
-
|
92
|
-
node
|
93
|
-
end
|
94
|
-
|
95
|
-
if RUBY_ENGINE == 'opal'
|
96
|
-
# make it supply the jquery element so it will use that as it doesn't
|
97
|
-
# know how to handle the DOM element.
|
98
|
-
%w(append prepend replace_with after before).each do |meth|
|
99
|
-
define_method meth do |obj|
|
100
|
-
obj = obj.dom if obj.is_a? BrowserIO::DOM
|
101
|
-
super obj
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def to_html
|
106
|
-
@dom ||= DOM.new '<div>'
|
107
|
-
el = dom.first
|
108
|
-
DOM.new('<div>').append(el).html
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
|
-
def html content = false
|
113
|
-
if !content
|
114
|
-
if server?
|
115
|
-
node.inner_html
|
116
|
-
else
|
117
|
-
node ? node.html : dom.html
|
118
|
-
end
|
119
|
-
else
|
120
|
-
self.html = content
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
124
|
-
def node
|
125
|
-
@node || dom
|
126
|
-
end
|
127
|
-
|
128
|
-
# This allows you to use all the nokogiri or opal jquery methods if a
|
129
|
-
# global one isn't set
|
130
|
-
def method_missing method, *args, &block
|
131
|
-
# respond_to?(symbol, include_all=false)
|
132
|
-
if dom.respond_to? method, true
|
133
|
-
dom.send method, *args, &block
|
134
|
-
else
|
135
|
-
super
|
136
|
-
end
|
137
|
-
end
|
138
|
-
end
|
139
|
-
end
|