opal-browser 0.2.0 → 0.3.3
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.
- checksums.yaml +5 -5
- data/.github/workflows/build.yml +78 -0
- data/.gitignore +3 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +17 -3
- data/LICENSE +2 -1
- data/README.md +131 -54
- data/Rakefile +29 -1
- data/config.ru +20 -3
- data/docs/polyfills.md +24 -0
- data/examples/2048/Gemfile +6 -0
- data/examples/2048/README.md +13 -0
- data/examples/2048/app/application.rb +169 -0
- data/examples/2048/config.ru +9 -0
- data/examples/canvas/Gemfile +6 -0
- data/examples/canvas/README.md +9 -0
- data/examples/canvas/app/application.rb +55 -0
- data/examples/canvas/config.ru +9 -0
- data/examples/component/Gemfile +6 -0
- data/examples/component/README.md +10 -0
- data/examples/component/app/application.rb +66 -0
- data/examples/component/config.ru +9 -0
- data/examples/integrations/README.md +24 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/Gemfile +6 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/README.md +16 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/app/application.rb +6 -0
- data/examples/integrations/dynamic-rack-opal-sprockets-server/config.ru +9 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/.gitignore +1 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/Gemfile +7 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/README.md +22 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/Rakefile +4 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/app/application.rb +6 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/app.rb +32 -0
- data/examples/integrations/dynamic-roda-roda-sprockets/config.ru +3 -0
- data/examples/integrations/dynamic-roda-tilt/.gitignore +1 -0
- data/examples/integrations/dynamic-roda-tilt/Gemfile +8 -0
- data/examples/integrations/dynamic-roda-tilt/README.md +17 -0
- data/examples/integrations/dynamic-roda-tilt/Rakefile +6 -0
- data/examples/integrations/dynamic-roda-tilt/app/application.rb +6 -0
- data/examples/integrations/dynamic-roda-tilt/app.rb +50 -0
- data/examples/integrations/dynamic-roda-tilt/config.ru +3 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/Gemfile +7 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/README.md +16 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/app/application.rb +6 -0
- data/examples/integrations/dynamic-sinatra-opal-sprockets-server/config.ru +29 -0
- data/examples/integrations/static-bash/.gitignore +2 -0
- data/examples/integrations/static-bash/Gemfile +3 -0
- data/examples/integrations/static-bash/README.md +8 -0
- data/examples/integrations/static-bash/app/application.rb +6 -0
- data/examples/integrations/static-bash/build.sh +4 -0
- data/examples/integrations/static-bash/index.html +10 -0
- data/examples/integrations/static-bash-opal-parser/.gitignore +3 -0
- data/examples/integrations/static-bash-opal-parser/Gemfile +3 -0
- data/examples/integrations/static-bash-opal-parser/README.md +10 -0
- data/examples/integrations/static-bash-opal-parser/build.sh +4 -0
- data/examples/integrations/static-bash-opal-parser/index.html +19 -0
- data/examples/integrations/static-rake/.gitignore +1 -0
- data/examples/integrations/static-rake/Gemfile +4 -0
- data/examples/integrations/static-rake/README.md +7 -0
- data/examples/integrations/static-rake/Rakefile +10 -0
- data/examples/integrations/static-rake/app/application.rb +6 -0
- data/examples/integrations/static-rake/index.html +9 -0
- data/examples/integrations/static-rake-guard/.gitignore +1 -0
- data/examples/integrations/static-rake-guard/Gemfile +6 -0
- data/examples/integrations/static-rake-guard/Guardfile +3 -0
- data/examples/integrations/static-rake-guard/README.md +10 -0
- data/examples/integrations/static-rake-guard/Rakefile +10 -0
- data/examples/integrations/static-rake-guard/app/application.rb +6 -0
- data/examples/integrations/static-rake-guard/index.html +9 -0
- data/examples/svg/.gitignore +1 -0
- data/examples/svg/Gemfile +4 -0
- data/examples/svg/README.md +7 -0
- data/examples/svg/Rakefile +10 -0
- data/examples/svg/app/application.rb +11 -0
- data/examples/svg/index.html +17 -0
- data/examples/svg/index.svg +6 -0
- data/index.html.erb +2 -3
- data/opal/browser/audio/node.rb +121 -0
- data/opal/browser/audio/param_schedule.rb +43 -0
- data/opal/browser/audio.rb +66 -0
- data/opal/browser/blob.rb +94 -0
- data/opal/browser/canvas/data.rb +1 -1
- data/opal/browser/canvas/gradient.rb +1 -1
- data/opal/browser/canvas/style.rb +3 -1
- data/opal/browser/canvas/text.rb +1 -1
- data/opal/browser/canvas.rb +17 -3
- data/opal/browser/console.rb +3 -1
- data/opal/browser/cookies.rb +72 -34
- data/opal/browser/crypto.rb +79 -0
- data/opal/browser/css/declaration.rb +1 -1
- data/opal/browser/css/rule.rb +1 -1
- data/opal/browser/css/style_sheet.rb +2 -2
- data/opal/browser/css.rb +23 -7
- data/opal/browser/database/sql.rb +7 -8
- data/opal/browser/delay.rb +16 -0
- data/opal/browser/dom/attribute.rb +1 -1
- data/opal/browser/dom/builder.rb +29 -10
- data/opal/browser/dom/document.rb +81 -13
- data/opal/browser/dom/document_fragment.rb +18 -0
- data/opal/browser/dom/document_or_shadow_root.rb +19 -0
- data/opal/browser/dom/element/attributes.rb +28 -4
- data/opal/browser/dom/element/button.rb +31 -0
- data/opal/browser/dom/element/custom.rb +177 -0
- data/opal/browser/dom/element/data.rb +17 -2
- data/opal/browser/dom/element/editable.rb +47 -0
- data/opal/browser/dom/element/form.rb +38 -0
- data/opal/browser/dom/element/iframe.rb +37 -0
- data/opal/browser/dom/element/image.rb +2 -0
- data/opal/browser/dom/element/input.rb +36 -0
- data/opal/browser/dom/element/media.rb +17 -0
- data/opal/browser/dom/element/scroll.rb +106 -74
- data/opal/browser/dom/element/select.rb +6 -0
- data/opal/browser/dom/element/size.rb +12 -0
- data/opal/browser/dom/element/template.rb +2 -0
- data/opal/browser/dom/element/textarea.rb +2 -0
- data/opal/browser/dom/element.rb +194 -50
- data/opal/browser/dom/mutation_observer.rb +2 -2
- data/opal/browser/dom/node.rb +53 -13
- data/opal/browser/dom/node_set.rb +13 -2
- data/opal/browser/dom/shadow_root.rb +12 -0
- data/opal/browser/dom/text.rb +2 -2
- data/opal/browser/dom.rb +38 -5
- data/opal/browser/effects.rb +170 -4
- data/opal/browser/event/all.rb +26 -0
- data/opal/browser/event/animation.rb +2 -0
- data/opal/browser/event/audio_processing.rb +2 -0
- data/opal/browser/event/base.rb +35 -4
- data/opal/browser/event/before_unload.rb +2 -0
- data/opal/browser/event/clipboard.rb +9 -0
- data/opal/browser/event/close.rb +2 -0
- data/opal/browser/event/composition.rb +2 -0
- data/opal/browser/event/custom.rb +1 -1
- data/opal/browser/event/data_transfer.rb +95 -0
- data/opal/browser/event/device_light.rb +2 -0
- data/opal/browser/event/device_motion.rb +2 -0
- data/opal/browser/event/device_orientation.rb +2 -0
- data/opal/browser/event/device_proximity.rb +2 -0
- data/opal/browser/event/drag.rb +9 -5
- data/opal/browser/event/focus.rb +2 -0
- data/opal/browser/event/gamepad.rb +3 -1
- data/opal/browser/event/hash_change.rb +2 -0
- data/opal/browser/event/keyboard.rb +14 -1
- data/opal/browser/event/message.rb +2 -0
- data/opal/browser/event/mouse.rb +10 -6
- data/opal/browser/event/page_transition.rb +2 -0
- data/opal/browser/event/pop_state.rb +2 -0
- data/opal/browser/event/progress.rb +2 -0
- data/opal/browser/event/sensor.rb +2 -0
- data/opal/browser/event/storage.rb +2 -0
- data/opal/browser/event/touch.rb +2 -0
- data/opal/browser/event/wheel.rb +2 -0
- data/opal/browser/event.rb +26 -116
- data/opal/browser/event_source.rb +1 -1
- data/opal/browser/form_data.rb +225 -0
- data/opal/browser/history.rb +4 -8
- data/opal/browser/http/request.rb +32 -10
- data/opal/browser/http/response.rb +5 -1
- data/opal/browser/http.rb +0 -2
- data/opal/browser/immediate.rb +0 -2
- data/opal/browser/location.rb +7 -1
- data/opal/browser/navigator.rb +105 -4
- data/opal/browser/polyfill/visual_viewport.rb +216 -0
- data/opal/browser/screen.rb +2 -2
- data/opal/browser/setup/base.rb +6 -0
- data/opal/browser/setup/full.rb +13 -0
- data/opal/browser/setup/large.rb +17 -0
- data/opal/browser/setup/mini.rb +8 -0
- data/opal/browser/setup/traditional.rb +10 -0
- data/opal/browser/socket.rb +3 -3
- data/opal/browser/storage.rb +2 -2
- data/opal/browser/support.rb +46 -22
- data/opal/browser/utils.rb +94 -14
- data/opal/browser/version.rb +1 -1
- data/opal/browser/visual_viewport.rb +39 -0
- data/opal/browser/window/size.rb +14 -0
- data/opal/browser/window/view.rb +15 -0
- data/opal/browser/window.rb +29 -16
- data/opal/browser.rb +1 -11
- data/opal-browser.gemspec +3 -3
- data/spec/database/sql_spec.rb +43 -35
- data/spec/delay_spec.rb +15 -12
- data/spec/dom/document_spec.rb +10 -8
- data/spec/dom/element/custom_spec.rb +106 -0
- data/spec/dom/element/subclass_spec.rb +144 -0
- data/spec/dom/element_spec.rb +42 -0
- data/spec/dom/mutation_observer_spec.rb +12 -8
- data/spec/dom/node_spec.rb +48 -0
- data/spec/dom_spec.rb +8 -0
- data/spec/event_source_spec.rb +15 -12
- data/spec/{dom/event_spec.rb → event_spec.rb} +44 -15
- data/spec/history_spec.rb +23 -19
- data/spec/http_spec.rb +19 -31
- data/spec/immediate_spec.rb +5 -4
- data/spec/interval_spec.rb +18 -9
- data/spec/native_cached_wrapper_spec.rb +46 -0
- data/spec/runner.rb +37 -62
- data/spec/socket_spec.rb +15 -12
- data/spec/spec_helper.rb +2 -1
- data/spec/spec_helper_promise.rb.erb +25 -0
- metadata +120 -16
- data/.travis.yml +0 -74
- data/opal/browser/window/scroll.rb +0 -59
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
require 'opal'
|
|
2
|
+
require 'native'
|
|
3
|
+
require 'promise'
|
|
4
|
+
require 'browser/setup/full'
|
|
5
|
+
|
|
6
|
+
class Game
|
|
7
|
+
def initialize
|
|
8
|
+
@grid = ([[nil] * 4] * 4).map(&:dup)
|
|
9
|
+
|
|
10
|
+
2.times { add_field }
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
attr_reader :grid
|
|
14
|
+
|
|
15
|
+
def lost?
|
|
16
|
+
@grid.all? { |row| row.all? } && !(begin
|
|
17
|
+
(0..2).any? do |y|
|
|
18
|
+
(0..3).any? do |x|
|
|
19
|
+
@grid[y][x] == @grid[y+1][x]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end || begin
|
|
23
|
+
(0..3).any? do |y|
|
|
24
|
+
(0..2).any? do |x|
|
|
25
|
+
@grid[y][x] == @grid[y][x+1]
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def won?
|
|
32
|
+
@grid.any? { |row| row.any? { |f| f == 2048 } }
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def add_field
|
|
36
|
+
return if lost? or won?
|
|
37
|
+
|
|
38
|
+
y,x = nil
|
|
39
|
+
|
|
40
|
+
loop do
|
|
41
|
+
y,x = random_field
|
|
42
|
+
break unless @grid[y][x]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
@grid[y][x] = [2,4].sample
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def shake(dir)
|
|
49
|
+
grid = @grid
|
|
50
|
+
conversion = proc {}
|
|
51
|
+
back_conversion = nil
|
|
52
|
+
|
|
53
|
+
case dir
|
|
54
|
+
when :left
|
|
55
|
+
when :right
|
|
56
|
+
conversion = proc { grid = grid.map(&:reverse) }
|
|
57
|
+
when :top
|
|
58
|
+
conversion = proc { grid = grid.transpose }
|
|
59
|
+
when :bottom
|
|
60
|
+
conversion = proc do
|
|
61
|
+
grid = grid.transpose
|
|
62
|
+
grid = grid.map(&:reverse)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
back_conversion = proc do
|
|
66
|
+
grid = grid.map(&:reverse)
|
|
67
|
+
grid = grid.transpose
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
back_conversion ||= conversion
|
|
72
|
+
|
|
73
|
+
conversion.()
|
|
74
|
+
|
|
75
|
+
grid = grid.map do |row|
|
|
76
|
+
row = row.compact
|
|
77
|
+
(0..2).each do |x|
|
|
78
|
+
if row[x] && row[x+1] && row[x] == row[x+1]
|
|
79
|
+
row[x], row[x+1] = row[x] + row[x+1], nil
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
row = row.compact
|
|
83
|
+
row = (row + [nil]*4)[0..3]
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
back_conversion.()
|
|
87
|
+
|
|
88
|
+
changed = grid != @grid
|
|
89
|
+
|
|
90
|
+
@grid = grid
|
|
91
|
+
|
|
92
|
+
add_field if changed && !lost?
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
private
|
|
96
|
+
|
|
97
|
+
def random_field
|
|
98
|
+
[rand(4), rand(4)]
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def render(game)
|
|
103
|
+
$document[:arena].inner_dom { |b|
|
|
104
|
+
(0..3).each do |y|
|
|
105
|
+
b.tr {
|
|
106
|
+
(0..3).each do |x|
|
|
107
|
+
b.td(class: "f_"+(game.grid[y][x] || "nil").to_s) {
|
|
108
|
+
(game.grid[y][x] || "").to_s
|
|
109
|
+
}
|
|
110
|
+
end
|
|
111
|
+
}
|
|
112
|
+
end
|
|
113
|
+
}
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
$document.head << DOM("<style>
|
|
117
|
+
#arena {
|
|
118
|
+
border-collapse: separate;
|
|
119
|
+
border-spacing: 4px;
|
|
120
|
+
}
|
|
121
|
+
#arena td {
|
|
122
|
+
width: 150px;
|
|
123
|
+
height: 150px;
|
|
124
|
+
border: 2px solid black;
|
|
125
|
+
font-size: 50px;
|
|
126
|
+
vertical-align: middle;
|
|
127
|
+
text-align: center;
|
|
128
|
+
}
|
|
129
|
+
#arena .f_2 { background-color: #eff; }
|
|
130
|
+
#arena .f_4 { background-color: #eef; }
|
|
131
|
+
#arena .f_8 { background-color: #def; }
|
|
132
|
+
#arena .f_16 { background-color: #dee; }
|
|
133
|
+
#arena .f_32 { background-color: #ded; }
|
|
134
|
+
#arena .f_64 { background-color: #ced; }
|
|
135
|
+
#arena .f_128 { background-color: #cdd; }
|
|
136
|
+
#arena .f_256 { background-color: #cdc; }
|
|
137
|
+
#arena .f_512 { background-color: #bdc; }
|
|
138
|
+
#arena .f_1024 { background-color: #bcc; }
|
|
139
|
+
#arena .f_2048 { background-color: #bbc; }
|
|
140
|
+
</style>")
|
|
141
|
+
$document.body << DOM("<div id='arena'></div>")
|
|
142
|
+
|
|
143
|
+
$game = game = Game.new
|
|
144
|
+
render(game)
|
|
145
|
+
|
|
146
|
+
$document.on(:keydown) do |e|
|
|
147
|
+
case e.key
|
|
148
|
+
when :ArrowUp
|
|
149
|
+
game.shake(:top)
|
|
150
|
+
when :ArrowDown
|
|
151
|
+
game.shake(:bottom)
|
|
152
|
+
when :ArrowLeft
|
|
153
|
+
game.shake(:left)
|
|
154
|
+
when :ArrowRight
|
|
155
|
+
game.shake(:right)
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
render(game)
|
|
159
|
+
|
|
160
|
+
if game.lost?
|
|
161
|
+
alert "You lost!"
|
|
162
|
+
game = Game.new
|
|
163
|
+
elsif game.won?
|
|
164
|
+
alert "You won!"
|
|
165
|
+
game = Game.new
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
render(game)
|
|
169
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
require 'opal'
|
|
2
|
+
require 'native'
|
|
3
|
+
require 'promise'
|
|
4
|
+
require 'browser/setup/full'
|
|
5
|
+
|
|
6
|
+
$document.head << CSS {
|
|
7
|
+
rule("body") {
|
|
8
|
+
margin 0
|
|
9
|
+
padding 0
|
|
10
|
+
overflow :hidden
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
c = Browser::Canvas.new($window.view.width, $window.view.height)
|
|
15
|
+
$document.body << c
|
|
16
|
+
|
|
17
|
+
$window.on :resize do |e|
|
|
18
|
+
c.height = $window.view.height
|
|
19
|
+
c.width = $window.view.width
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# A port of https://developer.mozilla.org/en-US/docs/Web/API/Element/mousemove_event
|
|
23
|
+
|
|
24
|
+
is_drawing = false
|
|
25
|
+
x, y = 0, 0
|
|
26
|
+
y = 0
|
|
27
|
+
|
|
28
|
+
c.on :mousedown do |e|
|
|
29
|
+
x, y = e.offset.x, e.offset.y
|
|
30
|
+
is_drawing = true
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
c.on :mousemove do |e|
|
|
34
|
+
if is_drawing
|
|
35
|
+
draw_line(c, x, y, e.offset.x, e.offset.y)
|
|
36
|
+
x, y = e.offset.x, e.offset.y
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
$window.on :mouseup do |e|
|
|
41
|
+
if is_drawing
|
|
42
|
+
draw_line(c, x, y, e.offset.x, e.offset.y)
|
|
43
|
+
x, y = e.offset.x, e.offset.y
|
|
44
|
+
is_drawing = false
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def draw_line(c, x1, y1, x2, y2)
|
|
49
|
+
c.path do
|
|
50
|
+
c.style.stroke = :black
|
|
51
|
+
c.style.line.width = 1
|
|
52
|
+
c.line(x1, y1, x2, y2)
|
|
53
|
+
c.stroke
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
require "opal"
|
|
2
|
+
require "console"
|
|
3
|
+
require "promise"
|
|
4
|
+
require "browser/setup/full"
|
|
5
|
+
|
|
6
|
+
# Let's test some element before we have been initialized.
|
|
7
|
+
# This is so we can test the upgrading behavior.
|
|
8
|
+
$document.body << $document.create_element("app-mycounter")
|
|
9
|
+
|
|
10
|
+
d = DOM("<div>")
|
|
11
|
+
$document.body << d
|
|
12
|
+
d.inner_html = "<app-mycounter>"
|
|
13
|
+
|
|
14
|
+
class MyCounter < Browser::DOM::Element::Custom
|
|
15
|
+
# Custom Element interface:
|
|
16
|
+
|
|
17
|
+
self.observed_attributes = %w[value]
|
|
18
|
+
|
|
19
|
+
def initialize(node)
|
|
20
|
+
super
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def attached
|
|
24
|
+
self[:value] ||= "0"
|
|
25
|
+
on :click do
|
|
26
|
+
increase!
|
|
27
|
+
end
|
|
28
|
+
render
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def detached
|
|
32
|
+
off :click
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def attribute_changed(attr, from, to)
|
|
36
|
+
render
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Our interface:
|
|
40
|
+
|
|
41
|
+
def increase!
|
|
42
|
+
self[:value] = (self[:value].to_i + 1)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Private:
|
|
46
|
+
|
|
47
|
+
def render
|
|
48
|
+
self.inner_html = "<h1>[#{self[:value]}]</h1>"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# This should come after the methods have been defined.
|
|
52
|
+
def_custom "app-mycounter"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
$document.body << DOM("<app-mycounter></app-mycounter>")
|
|
56
|
+
$document.body << $document.create_element("app-mycounter")
|
|
57
|
+
$document.body << MyCounter.new
|
|
58
|
+
$document.body << DOM { e('app-mycounter') }
|
|
59
|
+
|
|
60
|
+
all = DOM("<h1>Increase all!</h1>")
|
|
61
|
+
all.on(:click) do
|
|
62
|
+
$document.css("app-mycounter").each do |c|
|
|
63
|
+
c.increase!
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
$document.body << all
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
Integrations
|
|
2
|
+
============
|
|
3
|
+
|
|
4
|
+
It's possible to combine Opal-Browser with a lot of different workflows. Some are
|
|
5
|
+
better than others, but some are more suited at certain applications.
|
|
6
|
+
|
|
7
|
+
If you plan to do a static website, possibly you would like to base your work on
|
|
8
|
+
some static-* template. The downside is that you will need to recompile your work
|
|
9
|
+
each time you change something (except for static-rake-guard and
|
|
10
|
+
static-bash-opal-parser which is interesting only from experimentation viewpoint).
|
|
11
|
+
|
|
12
|
+
The dynamic-* templates will most of the time allow you to create a website with
|
|
13
|
+
both a frontend and a backend (some, like dynamic-rack-opal-sprockets-server won't
|
|
14
|
+
make your life easy though).
|
|
15
|
+
|
|
16
|
+
The sprockets integrations have a unique property, that you can name files like
|
|
17
|
+
`file.rb.erb` and then they will be preprocessed by ERB.
|
|
18
|
+
|
|
19
|
+
This directory is meant in general as a guideline, so the examples are as brief
|
|
20
|
+
as possible. I took a lot of time trying to understand how to integrate Opal, so
|
|
21
|
+
you can treat this directory as a library of my knowledge that you will be able
|
|
22
|
+
to use to get to use Opal as soon as possible!
|
|
23
|
+
|
|
24
|
+
TODO: dynamic-rails-opal-rails-with-sprockets
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Dynamic Opal-Browser integration with Rack via Opal-Sprockets-Server
|
|
2
|
+
====================================================================
|
|
3
|
+
|
|
4
|
+
To install, run:
|
|
5
|
+
|
|
6
|
+
$ bundle install
|
|
7
|
+
|
|
8
|
+
Development mode
|
|
9
|
+
----------------
|
|
10
|
+
|
|
11
|
+
$ bundle exec rackup
|
|
12
|
+
|
|
13
|
+
Production mode
|
|
14
|
+
---------------
|
|
15
|
+
|
|
16
|
+
Left as an exercise for the reader. In general - don't do it. Use some more robust integration.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
public/assets
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
Dynamic Opal-Browser integration with Roda via Roda-Sprockets
|
|
2
|
+
=============================================================
|
|
3
|
+
|
|
4
|
+
To install, run:
|
|
5
|
+
|
|
6
|
+
$ bundle install
|
|
7
|
+
|
|
8
|
+
Development mode
|
|
9
|
+
----------------
|
|
10
|
+
|
|
11
|
+
$ bundle exec rackup
|
|
12
|
+
|
|
13
|
+
Production mode
|
|
14
|
+
---------------
|
|
15
|
+
|
|
16
|
+
$ bundle exec rake assets:precompile
|
|
17
|
+
$ RACK_ENV=production bundle exec rackup
|
|
18
|
+
|
|
19
|
+
See more:
|
|
20
|
+
---------
|
|
21
|
+
|
|
22
|
+
https://github.com/hmdne/roda-sprockets
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
require 'roda'
|
|
2
|
+
require 'opal-browser'
|
|
3
|
+
|
|
4
|
+
class App < Roda
|
|
5
|
+
plugin :sprockets, precompile: %w(application.js),
|
|
6
|
+
prefix: %w(app/),
|
|
7
|
+
root: __dir__,
|
|
8
|
+
public_path: 'public/assets/',
|
|
9
|
+
opal: true,
|
|
10
|
+
debug: ENV['RACK_ENV'] != 'production'
|
|
11
|
+
plugin :public
|
|
12
|
+
|
|
13
|
+
route do |r|
|
|
14
|
+
r.public
|
|
15
|
+
r.sprockets
|
|
16
|
+
|
|
17
|
+
r.root do
|
|
18
|
+
<<~END
|
|
19
|
+
<!doctype html>
|
|
20
|
+
<html>
|
|
21
|
+
<head>
|
|
22
|
+
<title>My application</title>
|
|
23
|
+
</head>
|
|
24
|
+
<body>
|
|
25
|
+
#{ javascript_tag 'application' }
|
|
26
|
+
#{ opal_require 'application' }
|
|
27
|
+
</body>
|
|
28
|
+
</html>
|
|
29
|
+
END
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
public/assets
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
Dynamic Opal-Browser integration with Roda via Tilt
|
|
2
|
+
===================================================
|
|
3
|
+
|
|
4
|
+
To install, run:
|
|
5
|
+
|
|
6
|
+
$ bundle install
|
|
7
|
+
|
|
8
|
+
Development mode
|
|
9
|
+
----------------
|
|
10
|
+
|
|
11
|
+
$ bundle exec rackup
|
|
12
|
+
|
|
13
|
+
Production mode
|
|
14
|
+
---------------
|
|
15
|
+
|
|
16
|
+
$ RACK_ENV=production bundle exec rake assets
|
|
17
|
+
$ RACK_ENV=production bundle exec rackup
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'roda'
|
|
2
|
+
require 'tilt/sass'
|
|
3
|
+
require 'tilt/opal'
|
|
4
|
+
require 'opal/builder_processors'
|
|
5
|
+
require 'opal-browser'
|
|
6
|
+
|
|
7
|
+
class OpalBuilder < Opal::Builder
|
|
8
|
+
attr_accessor :build_source_map
|
|
9
|
+
|
|
10
|
+
def to_s
|
|
11
|
+
if @build_source_map
|
|
12
|
+
super + "\n" + source_map.to_data_uri_comment
|
|
13
|
+
else
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
class App < Roda
|
|
20
|
+
js_builder = OpalBuilder.new(stubs: []) #'opal'
|
|
21
|
+
js_builder.build_source_map = ENV['RACK_ENV'] == 'development'
|
|
22
|
+
js_builder.append_paths('app')
|
|
23
|
+
|
|
24
|
+
plugin :assets, js: ['application.rb'],
|
|
25
|
+
js_opts: { builder: js_builder },
|
|
26
|
+
path: '.',
|
|
27
|
+
js_dir: 'app',
|
|
28
|
+
timestamp_paths: true,
|
|
29
|
+
precompiled: ENV['RACK_ENV'] != 'development' ? 'public/assets/assets-precompiled.json' : nil
|
|
30
|
+
plugin :public
|
|
31
|
+
|
|
32
|
+
route do |r|
|
|
33
|
+
r.public
|
|
34
|
+
r.assets
|
|
35
|
+
|
|
36
|
+
r.root do
|
|
37
|
+
<<~END
|
|
38
|
+
<!doctype html>
|
|
39
|
+
<html>
|
|
40
|
+
<head>
|
|
41
|
+
<title>My application</title>
|
|
42
|
+
</head>
|
|
43
|
+
<body>
|
|
44
|
+
#{ assets :js }
|
|
45
|
+
</body>
|
|
46
|
+
</html>
|
|
47
|
+
END
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Dynamic Opal-Browser integration with Sinatra via Opal-Sprockets-Server
|
|
2
|
+
=======================================================================
|
|
3
|
+
|
|
4
|
+
To install, run:
|
|
5
|
+
|
|
6
|
+
$ bundle install
|
|
7
|
+
|
|
8
|
+
Development mode
|
|
9
|
+
----------------
|
|
10
|
+
|
|
11
|
+
$ bundle exec rackup
|
|
12
|
+
|
|
13
|
+
Production mode
|
|
14
|
+
---------------
|
|
15
|
+
|
|
16
|
+
Left as an exercise for the reader.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require 'opal-sprockets'
|
|
2
|
+
require 'opal-browser'
|
|
3
|
+
require 'sinatra'
|
|
4
|
+
|
|
5
|
+
opal = Opal::Sprockets::Server.new {|s|
|
|
6
|
+
s.append_path 'app'
|
|
7
|
+
s.main = 'application'
|
|
8
|
+
s.debug = ENV['RACK_ENV'] != 'production'
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
map '/assets' do
|
|
12
|
+
run opal.sprockets
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
get '/' do
|
|
16
|
+
<<-HTML
|
|
17
|
+
<!doctype html>
|
|
18
|
+
<html>
|
|
19
|
+
<head>
|
|
20
|
+
<title>My Application</title>
|
|
21
|
+
</head>
|
|
22
|
+
<body>
|
|
23
|
+
#{ Opal::Sprockets.javascript_include_tag('application', debug: opal.debug, sprockets: opal.sprockets, prefix: 'assets/' ) }
|
|
24
|
+
</body>
|
|
25
|
+
</html>
|
|
26
|
+
HTML
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
run Sinatra::Application
|