smalruby-editor 0.1.5-x86-mingw32 → 0.1.6-x86-mingw32
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.
Potentially problematic release.
This version of smalruby-editor might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.rubocop.yml +8 -0
- data/README.rdoc +3 -0
- data/app/assets/javascripts/application.js +0 -1
- data/app/assets/javascripts/models/source_code.js.coffee +5 -2
- data/app/assets/javascripts/smalruby.js.coffee +18 -11
- data/app/assets/javascripts/views/main_menu_view.js.coffee +139 -81
- data/app/controllers/source_codes_controller.rb +7 -0
- data/app/models/concerns/ruby_to_block.rb +391 -0
- data/app/models/source_code.rb +3 -2
- data/app/views/editor/demo.html.erb +1 -1
- data/app/views/editor/index.html.haml +2 -2
- data/config/routes.rb +1 -0
- data/{app/assets/demos → demos}/default.xml +0 -0
- data/{app/assets/demos → demos}/rgb_led_anode.xml +82 -82
- data/lib/smalruby_editor/version.rb +3 -3
- data/lib/tasks/release.rake +0 -4
- data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js → application-8bfffad1222d4e198f3c7ccc1cbd774f.js} +179 -144
- data/public/assets/{application-0047adbc0fb7a529ef7a41b5e0e7d097.js.gz → application-8bfffad1222d4e198f3c7ccc1cbd774f.js.gz} +0 -0
- data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
- data/smalruby-editor.gemspec +0 -6
- data/spec/acceptance/base.feature +119 -0
- data/spec/acceptance/block_mode/translate.feature +14 -0
- data/spec/acceptance/ruby_mode/translate.feature +65 -0
- data/spec/acceptance/standalone/run.feature +14 -1
- data/spec/controllers/source_codes_controller_spec.rb +22 -0
- data/{public/assets/default-5d1886100d7c8961e9962bbc4bb0c714.xml → spec/fixtures/files/01.rb.xml} +0 -0
- data/spec/models/concerns/ruby_to_block_spec.rb +329 -0
- data/spec/steps/base_steps.rb +230 -0
- data/spec/steps/block_mode_steps.rb +9 -1
- data/spec/steps/fix_turnip.rb +28 -0
- data/spec/steps/text_editor_steps.rb +52 -193
- metadata +19 -97
- data/app/assets/javascripts/ruby_mode.js.coffee.erb +0 -12
- data/public/assets/rgb_led_anode-91225bef2a8b97f1cefee862a0619b91.xml +0 -83
- data/spec/acceptance/ruby_mode/base.feature +0 -33
- data/spec/steps/ace_steps.rb +0 -77
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 53e0d4cc07184d7d779bce31a30099140c72d191
|
4
|
+
data.tar.gz: ee93d3bd4b1a53590e2d0fb0af8d95851de81736
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 998812bd17c0f42e82fac22a223219082807267f674e06158c50365ae88d1d325efd7f6a0a8364d6ca80ac4839708d7892201e2a94201cb46ad2016097b9a869
|
7
|
+
data.tar.gz: 540eb8e5125b96e2ae2ae8f2500dc2b76a9ef6d541e0a51efc7d63ce9c8b73abdbbbcb9575da2d0d69c47a4fdb8f5907023c0099388ff02febfbf32bbfe8eaff
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
data/README.rdoc
CHANGED
@@ -8,6 +8,9 @@
|
|
8
8
|
|
9
9
|
The smalruby-editor is a visual programming editor that can create a Ruby script by combining individual blocks similar to Scratch. It can also enter the program as better than Scratch.
|
10
10
|
|
11
|
+
* DEMO: http://smalruby.herokuapp.com/demo/
|
12
|
+
* DEMO(Arduino): http://smalruby.herokuapp.com/demo/rgb_led_anode/
|
13
|
+
|
11
14
|
The smalruby-editor is a part of the Smalruby Project.
|
12
15
|
|
13
16
|
The Smalruby(smɔ́ːrúːbi) Project will provide a Ruby learning environment for middle school students from the upper grades of elementary school. The goal of this project is to achieve software and community sites such as the {Scratch}[http://scratch.mit.edu/] in Ruby. The Scratch has experience as educational programming environment can be used in elementary school. This project consists of the following elements.
|
@@ -39,7 +39,10 @@ Smalruby.SourceCode = Backbone.Model.extend
|
|
39
39
|
action += '?force=1' if force
|
40
40
|
@delete_(action)
|
41
41
|
|
42
|
-
|
42
|
+
toBlocks: ->
|
43
|
+
@post_('to_blocks', 'html')
|
44
|
+
|
45
|
+
post_: (action, dataType = 'json') ->
|
43
46
|
dfr = $.Deferred()
|
44
47
|
$.ajax
|
45
48
|
url: "/source_codes/#{action}"
|
@@ -48,7 +51,7 @@ Smalruby.SourceCode = Backbone.Model.extend
|
|
48
51
|
source_code:
|
49
52
|
filename: @get('filename')
|
50
53
|
data: @get('data')
|
51
|
-
dataType:
|
54
|
+
dataType: dataType
|
52
55
|
success: (data, textStatus, jqXHR) -> dfr.resolve(data)
|
53
56
|
error: dfr.reject
|
54
57
|
dfr.promise()
|
@@ -11,6 +11,7 @@ window.successMessage = (title, msg = '', selector = '#messages') ->
|
|
11
11
|
html.fadeIn('slow')
|
12
12
|
.delay(3000)
|
13
13
|
.fadeOut('slow')
|
14
|
+
return
|
14
15
|
|
15
16
|
window.errorMessage = (msg, selector = '#messages') ->
|
16
17
|
html = $('<div class="alert alert-error" style="display: none">')
|
@@ -19,6 +20,7 @@ window.errorMessage = (msg, selector = '#messages') ->
|
|
19
20
|
.append(msg)
|
20
21
|
$(selector).append(html)
|
21
22
|
html.fadeIn('slow')
|
23
|
+
return
|
22
24
|
|
23
25
|
window.Smalruby =
|
24
26
|
Models: {}
|
@@ -43,17 +45,6 @@ window.Smalruby =
|
|
43
45
|
@Views.CharacterModalView = new Smalruby.CharacterModalView
|
44
46
|
el: $('#character-modal')
|
45
47
|
|
46
|
-
$('a[data-toggle="tab"]').on 'shown', (e) ->
|
47
|
-
if $(e.target).attr('href') == '#block-tab'
|
48
|
-
window.blockMode = true
|
49
|
-
else
|
50
|
-
window.blockMode = false
|
51
|
-
data = Blockly.Ruby.workspaceToCode()
|
52
|
-
if $.trim(data).length > 0
|
53
|
-
window.textEditor.getSession().getDocument().setValue(data)
|
54
|
-
window.textEditor.moveCursorTo(0, 0)
|
55
|
-
window.textEditor.focus()
|
56
|
-
|
57
48
|
Smalruby.downloading = false
|
58
49
|
window.onbeforeunload = (event) ->
|
59
50
|
if !Smalruby.downloading && window.changed
|
@@ -75,6 +66,8 @@ window.Smalruby =
|
|
75
66
|
@blocklyFirst = true
|
76
67
|
@blocklyLoading = false
|
77
68
|
Blockly.addChangeListener =>
|
69
|
+
Smalruby.changedAfterTranslating = true
|
70
|
+
|
78
71
|
# HACK: Blocklyを初期化後に一回だけChangeListenerが呼び出させれ
|
79
72
|
# る。ここではそれを無視している。
|
80
73
|
if @blocklyFirst
|
@@ -89,6 +82,20 @@ window.Smalruby =
|
|
89
82
|
|
90
83
|
window.changed = true
|
91
84
|
|
85
|
+
window.textEditor = textEditor = ace.edit('text-editor')
|
86
|
+
textEditor.setTheme('ace/theme/clouds')
|
87
|
+
textEditor.setShowInvisibles(true)
|
88
|
+
textEditor.gotoLine(0, 0)
|
89
|
+
textEditor.on 'change', (e) =>
|
90
|
+
unless @translating
|
91
|
+
window.changed = true
|
92
|
+
Smalruby.changedAfterTranslating = true
|
93
|
+
|
94
|
+
session = textEditor.getSession()
|
95
|
+
session.setMode('ace/mode/ruby')
|
96
|
+
session.setTabSize(2)
|
97
|
+
session.setUseSoftTabs(true)
|
98
|
+
|
92
99
|
loadXml: (data, workspace = Blockly.mainWorkspace) ->
|
93
100
|
xml = Blockly.Xml.textToDom(data)
|
94
101
|
workspace.clear()
|
@@ -3,6 +3,8 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
3
3
|
el: '#main-menu'
|
4
4
|
|
5
5
|
events:
|
6
|
+
'click #block-mode-button': 'onBlockMode'
|
7
|
+
'click #ruby-mode-button': 'onRubyMode'
|
6
8
|
'click #run-button': 'onRun'
|
7
9
|
'click #download-button': 'onDownload'
|
8
10
|
'click #load-button': 'onLoad'
|
@@ -29,6 +31,7 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
29
31
|
filename = info.filename
|
30
32
|
if filename.match(/\.xml$/)
|
31
33
|
unless window.blockMode
|
34
|
+
window.blockMode = true
|
32
35
|
$('#tabs a[href="#block-tab"]').tab('show')
|
33
36
|
|
34
37
|
filename = filename.replace(/(\.rb)?\.xml$/, '.rb')
|
@@ -40,6 +43,7 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
40
43
|
Blockly.mainWorkspace.clear()
|
41
44
|
|
42
45
|
if window.blockMode
|
46
|
+
window.blockMode = false
|
43
47
|
$('#tabs a[href="#ruby-tab"]').tab('show')
|
44
48
|
window.textEditor.focus()
|
45
49
|
|
@@ -48,8 +52,60 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
48
52
|
window.textEditor.moveCursorTo(0, 0)
|
49
53
|
# TODO: window.changed -> Smalruby.Models.SourceCode.changed
|
50
54
|
window.changed = false
|
55
|
+
Smalruby.changedAfterTranslating = true
|
51
56
|
window.successMessage('ロードしました')
|
52
57
|
|
58
|
+
onBlockMode: (e) ->
|
59
|
+
e.preventDefault()
|
60
|
+
|
61
|
+
return if window.blockMode
|
62
|
+
|
63
|
+
unless Smalruby.changedAfterTranslating
|
64
|
+
window.blockMode = true
|
65
|
+
$('#tabs a[href="#block-tab"]').tab('show')
|
66
|
+
return
|
67
|
+
|
68
|
+
@blockUI
|
69
|
+
title:
|
70
|
+
"""
|
71
|
+
<i class="icon-filter"></i>
|
72
|
+
プログラムの変換中
|
73
|
+
"""
|
74
|
+
message: 'プログラムをブロックに変換しています。'
|
75
|
+
|
76
|
+
sourceCode = new Smalruby.SourceCode()
|
77
|
+
sourceCode.toBlocks()
|
78
|
+
.then (data) ->
|
79
|
+
window.blockMode = true
|
80
|
+
$('#tabs a[href="#block-tab"]').tab('show')
|
81
|
+
if data.length > 0
|
82
|
+
Smalruby.blocklyLoading = true
|
83
|
+
Smalruby.translating = true
|
84
|
+
Smalruby.loadXml(data)
|
85
|
+
Smalruby.translating = false
|
86
|
+
Smalruby.changedAfterTranslating = false
|
87
|
+
.then(@unblockUI, @unblockUI)
|
88
|
+
.fail ->
|
89
|
+
window.errorMessage('ブロックへの変換に失敗しました')
|
90
|
+
|
91
|
+
onRubyMode: (e) ->
|
92
|
+
e.preventDefault()
|
93
|
+
|
94
|
+
return unless window.blockMode
|
95
|
+
|
96
|
+
window.blockMode = false
|
97
|
+
$('#tabs a[href="#ruby-tab"]').tab('show')
|
98
|
+
|
99
|
+
return unless Smalruby.changedAfterTranslating
|
100
|
+
|
101
|
+
data = Blockly.Ruby.workspaceToCode()
|
102
|
+
Smalruby.translating = true
|
103
|
+
window.textEditor.getSession().getDocument().setValue(data)
|
104
|
+
Smalruby.translating = false
|
105
|
+
Smalruby.changedAfterTranslating = false
|
106
|
+
window.textEditor.moveCursorTo(0, 0)
|
107
|
+
window.textEditor.focus()
|
108
|
+
|
53
109
|
onRun: (e) ->
|
54
110
|
e.preventDefault()
|
55
111
|
|
@@ -68,55 +124,40 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
68
124
|
Escキーを押すとプログラムが終わります。
|
69
125
|
"""
|
70
126
|
|
71
|
-
|
72
|
-
$.unblockUI()
|
73
|
-
errorMessage('プログラムを実行できませんでした')
|
74
|
-
|
127
|
+
errorMsg = 'プログラムを実行できませんでした'
|
75
128
|
sourceCode.save2()
|
76
|
-
.
|
129
|
+
.then (data) ->
|
77
130
|
sourceCode.write()
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
if data.source_code.error
|
109
|
-
if sourceCode.get('filename') == Smalruby.savedFilename ||
|
110
|
-
confirm("前に#{sourceCode.get('filename')}という名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!")
|
111
|
-
sourceCode.write(true)
|
112
|
-
.done (data) ->
|
113
|
-
afterSave()
|
114
|
-
else
|
115
|
-
failedFunc()
|
116
|
-
else
|
117
|
-
afterSave()
|
118
|
-
.fail -> failedFunc()
|
119
|
-
.fail -> failedFunc()
|
131
|
+
.then (data) =>
|
132
|
+
@confirmOverwrite_.call @, data, sourceCode, ->
|
133
|
+
errorMsg = 'プログラムの実行をキャンセルしました'
|
134
|
+
.then ->
|
135
|
+
Smalruby.savedFilename = sourceCode.get('filename')
|
136
|
+
window.changed = false
|
137
|
+
sourceCode.check()
|
138
|
+
.then (data) ->
|
139
|
+
if data.length > 0
|
140
|
+
for errorInfo in data
|
141
|
+
do (errorInfo) ->
|
142
|
+
msg = "#{errorInfo.row}行"
|
143
|
+
if errorInfo.column > 0
|
144
|
+
msg += "、#{errorInfo.column}文字"
|
145
|
+
window.errorMessage(msg + ": #{errorInfo.message}")
|
146
|
+
$.Deferred().reject().promise()
|
147
|
+
.then ->
|
148
|
+
sourceCode.run()
|
149
|
+
.then (data) ->
|
150
|
+
if data.length > 0
|
151
|
+
for errorInfo in data
|
152
|
+
do (errorInfo) ->
|
153
|
+
msg = "#{errorInfo.row}行"
|
154
|
+
if errorInfo.column > 0
|
155
|
+
msg += "、#{errorInfo.column}文字"
|
156
|
+
errorMessage(msg + ": #{errorInfo.message}")
|
157
|
+
$.Deferred().reject().promise()
|
158
|
+
.then(@unblockUI, @unblockUI)
|
159
|
+
.fail ->
|
160
|
+
errorMessage(errorMsg)
|
120
161
|
|
121
162
|
onDownload: (e) ->
|
122
163
|
e.preventDefault()
|
@@ -137,14 +178,13 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
137
178
|
"""
|
138
179
|
|
139
180
|
sourceCode.save2()
|
140
|
-
.
|
141
|
-
$.unblockUI()
|
181
|
+
.then (data) ->
|
142
182
|
window.changed = false
|
143
183
|
window.successMessage('ダウンロードしました')
|
144
184
|
Smalruby.downloading = true
|
145
185
|
$('#download-link').click()
|
186
|
+
.then(@unblockUI, @unblockUI)
|
146
187
|
.fail ->
|
147
|
-
$.unblockUI()
|
148
188
|
window.errorMessage('ダウンロードできませんでした')
|
149
189
|
|
150
190
|
onLoad: (e) ->
|
@@ -182,33 +222,20 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
182
222
|
プログラムはホームディレクトリにセーブします。<br>
|
183
223
|
"""
|
184
224
|
|
185
|
-
|
186
|
-
$.unblockUI()
|
187
|
-
window.errorMessage('セーブできませんでした')
|
188
|
-
|
225
|
+
errorMsg = 'セーブできませんでした'
|
189
226
|
sourceCode.save2()
|
190
|
-
.
|
227
|
+
.then (data) ->
|
191
228
|
sourceCode.write()
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
sourceCode.write(true)
|
203
|
-
.done (data) ->
|
204
|
-
afterSave()
|
205
|
-
else
|
206
|
-
$.unblockUI()
|
207
|
-
window.successMessage('セーブをキャンセルしました')
|
208
|
-
else
|
209
|
-
afterSave()
|
210
|
-
.fail -> failedFunc()
|
211
|
-
.fail -> failedFunc()
|
229
|
+
.then (data) =>
|
230
|
+
@confirmOverwrite_.call @, data, sourceCode, ->
|
231
|
+
errorMsg = 'セーブをキャンセルしました'
|
232
|
+
.then(@unblockUI, @unblockUI)
|
233
|
+
.done ->
|
234
|
+
Smalruby.savedFilename = sourceCode.get('filename')
|
235
|
+
window.changed = false
|
236
|
+
window.successMessage('セーブしました')
|
237
|
+
.fail ->
|
238
|
+
window.errorMessage(errorMsg)
|
212
239
|
|
213
240
|
onCheck: (e) ->
|
214
241
|
e.preventDefault()
|
@@ -230,8 +257,7 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
230
257
|
"""
|
231
258
|
|
232
259
|
sourceCode.check()
|
233
|
-
.
|
234
|
-
$.unblockUI()
|
260
|
+
.then (data) ->
|
235
261
|
if data.length == 0
|
236
262
|
window.successMessage('チェックしました', 'ただし、プログラムを動かすとエラーが見つかるかもしれません。')
|
237
263
|
else
|
@@ -241,8 +267,8 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
241
267
|
if errorInfo.column > 0
|
242
268
|
msg += "、#{errorInfo.column}文字"
|
243
269
|
window.errorMessage(msg + ": #{errorInfo.message}")
|
270
|
+
.then(@unblockUI, @unblockUI)
|
244
271
|
.fail ->
|
245
|
-
$.unblockUI()
|
246
272
|
errorMessage('チェックできませんでした')
|
247
273
|
|
248
274
|
onReset: (e) ->
|
@@ -259,22 +285,54 @@ Smalruby.MainMenuView = Backbone.View.extend
|
|
259
285
|
sourceCode
|
260
286
|
|
261
287
|
blockUI: (options) ->
|
262
|
-
|
263
|
-
|
288
|
+
message = ''
|
289
|
+
if options.title
|
290
|
+
message +=
|
264
291
|
"""
|
265
292
|
<h3>
|
266
293
|
#{options.title}
|
267
294
|
</h3>
|
268
|
-
|
295
|
+
"""
|
296
|
+
|
297
|
+
if options.message || options.notice
|
298
|
+
part = ''
|
299
|
+
if options.message
|
300
|
+
part +=
|
301
|
+
"""
|
269
302
|
<p>
|
270
303
|
#{options.message}
|
271
304
|
</p>
|
305
|
+
"""
|
306
|
+
if options.notice
|
307
|
+
part +=
|
308
|
+
"""
|
272
309
|
<small>
|
273
310
|
#{options.notice}
|
274
311
|
</small>
|
312
|
+
"""
|
313
|
+
|
314
|
+
message +=
|
315
|
+
"""
|
316
|
+
<blockquote>
|
317
|
+
#{part}
|
275
318
|
</blockquote>
|
276
319
|
"""
|
320
|
+
|
321
|
+
$.blockUI
|
322
|
+
message: message
|
277
323
|
css:
|
278
324
|
border: 'none'
|
279
325
|
'text-align': 'left'
|
280
326
|
'padding-left': '2em'
|
327
|
+
|
328
|
+
unblockUI: ->
|
329
|
+
$.unblockUI()
|
330
|
+
|
331
|
+
confirmOverwrite_: (data, sourceCode, canceled = $.noop) ->
|
332
|
+
if data.source_code.error
|
333
|
+
if sourceCode.get('filename') == Smalruby.savedFilename ||
|
334
|
+
confirm("前に#{sourceCode.get('filename')}という名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!")
|
335
|
+
sourceCode.write(true)
|
336
|
+
else
|
337
|
+
canceled.call()
|
338
|
+
$.Deferred().reject().promise()
|
@@ -57,6 +57,13 @@ class SourceCodesController < ApplicationController
|
|
57
57
|
render json: source_code.run(path)
|
58
58
|
end
|
59
59
|
|
60
|
+
def to_blocks
|
61
|
+
source_code = SourceCode.new(source_code_params)
|
62
|
+
render text: source_code.to_blocks
|
63
|
+
rescue
|
64
|
+
head :bad_request
|
65
|
+
end
|
66
|
+
|
60
67
|
private
|
61
68
|
|
62
69
|
def check_whether_standalone
|