smalruby-editor 0.2.1-x86-mingw32 → 0.2.2-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.

Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/LEGAL +4 -3
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +7 -3
  4. data/app/assets/javascripts/blocks/events.js.coffee.erb +7 -10
  5. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +119 -31
  6. data/app/assets/javascripts/blocks/motion.js.coffee.erb +16 -20
  7. data/app/assets/javascripts/blocks/operators.js.coffee.erb +1 -1
  8. data/app/assets/javascripts/blocks/pen.js.coffee.erb +2 -1
  9. data/app/assets/javascripts/blocks/ruby.js.coffee.erb +3 -3
  10. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +8 -8
  11. data/app/assets/javascripts/blocks/sound.js.coffee.erb +3 -1
  12. data/app/assets/javascripts/fix_blockly.js.erb +105 -0
  13. data/app/assets/javascripts/generators/ruby.js.coffee.erb +3 -0
  14. data/app/assets/javascripts/msg/en_us.js +67 -17
  15. data/app/assets/javascripts/msg/ja.js +151 -95
  16. data/app/assets/javascripts/{smalruby.js.coffee → smalruby.js.coffee.erb} +35 -16
  17. data/app/assets/javascripts/views/character_selector_view.js.coffee +2 -2
  18. data/app/assets/javascripts/views/{load_modal_view.js.coffee → load_modal_view.js.coffee.erb} +8 -2
  19. data/app/assets/javascripts/views/main_menu_view.js.coffee.erb +33 -48
  20. data/app/assets/javascripts/views/signin_modal_view.js.coffee.erb +43 -0
  21. data/app/assets/stylesheets/application.css +3 -1
  22. data/app/assets/stylesheets/toolbox.css.scss.erb +2 -56
  23. data/app/assets/stylesheets/toolbox_default.css.scss.erb +34 -0
  24. data/app/assets/stylesheets/toolbox_smalrubot_s1.css.scss.erb +31 -0
  25. data/app/assets/stylesheets/toolbox_smalrubot_v3.css.scss.erb +32 -0
  26. data/app/controllers/application_controller.rb +5 -0
  27. data/app/controllers/source_codes_controller.rb +6 -3
  28. data/app/helpers/application_helper.rb +12 -0
  29. data/app/helpers/editor_helper.rb +25 -0
  30. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_action.rb +13 -0
  31. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_action_with_sec.rb +14 -0
  32. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_ir_photoreflector_value.rb +29 -0
  33. data/app/models/concerns/ruby_to_block/block/hardware_smalrubot_s1_led_turn_on_or_off.rb +22 -0
  34. data/app/views/editor/_block_tab.html.haml +7 -6
  35. data/app/views/editor/_reset_modal.html.haml +4 -4
  36. data/app/views/editor/_signin_modal.html.haml +8 -9
  37. data/app/views/editor/_toolbox_default.html.haml +504 -0
  38. data/app/views/editor/_toolbox_smalrubot_s1.html.haml +171 -0
  39. data/app/views/editor/_toolbox_smalrubot_v3.html.haml +177 -0
  40. data/app/views/editor/index.html.haml +12 -2
  41. data/app/views/layouts/application.html.erb +1 -0
  42. data/config/environments/production.rb +1 -0
  43. data/config/locales/en.yml +19 -16
  44. data/config/locales/ja.yml +28 -25
  45. data/demos/hardware_led.rb.xml +79 -79
  46. data/lib/smalruby_editor/config.rb +22 -0
  47. data/lib/smalruby_editor/version.rb +1 -1
  48. data/lib/smalruby_editor.rb +58 -0
  49. data/public/assets/application-71c4890fe0ea2e896fc0acff41cdb0ad.js +39 -0
  50. data/public/assets/application-71c4890fe0ea2e896fc0acff41cdb0ad.js.gz +0 -0
  51. data/public/assets/{application-d5358d75a2c4e570c749b333c59b55ab.css → application-c196e243630d74071981a16041bf391d.css} +1 -1
  52. data/public/assets/application-c196e243630d74071981a16041bf391d.css.gz +0 -0
  53. data/public/assets/blockly/msg/js/en_us-d5e1938b2d57c1df954f4411b9165d10.js +1 -0
  54. data/public/assets/blockly/msg/js/en_us-d5e1938b2d57c1df954f4411b9165d10.js.gz +0 -0
  55. data/public/assets/blockly/msg/js/ja-9f676d46458a2802b8f5a797c90ae8a4.js +1 -0
  56. data/public/assets/blockly/msg/js/ja-9f676d46458a2802b8f5a797c90ae8a4.js.gz +0 -0
  57. data/public/assets/manifest-f3d29c6d66b959abe4294a899733e4f0.json +1 -0
  58. data/public/assets/msg/en_us-213fb4a57884078038725a2991776f47.js +1 -0
  59. data/public/assets/msg/en_us-213fb4a57884078038725a2991776f47.js.gz +0 -0
  60. data/public/assets/msg/ja-aeface7456b479021e977a0387204036.js +1 -0
  61. data/public/assets/msg/ja-aeface7456b479021e977a0387204036.js.gz +0 -0
  62. data/public/assets/toolbox_default-e023d3f7a2cc7cc1f54a1224577b3c26.css +1 -0
  63. data/public/assets/toolbox_default-e023d3f7a2cc7cc1f54a1224577b3c26.css.gz +0 -0
  64. data/public/assets/toolbox_smalrubot_s1-18d28dc4b99723b60a3f538b742027df.css +1 -0
  65. data/public/assets/toolbox_smalrubot_s1-18d28dc4b99723b60a3f538b742027df.css.gz +0 -0
  66. data/public/assets/toolbox_smalrubot_v3-9af26ff13d4496890c4a391f65f95bcd.css +1 -0
  67. data/public/assets/toolbox_smalrubot_v3-9af26ff13d4496890c4a391f65f95bcd.css.gz +0 -0
  68. data/public/blockly/media/anon.jpeg +0 -0
  69. data/public/blockly/media/handclosed.cur +0 -0
  70. data/public/blockly/media/handdelete.cur +0 -0
  71. data/public/blockly/media/progress.gif +0 -0
  72. data/public/blockly/media/sprites.png +0 -0
  73. data/smalruby-editor.gemspec +2 -1
  74. data/spec/acceptance/base.feature +3 -3
  75. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_action.feature +107 -0
  76. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_action_with_sec.feature +151 -0
  77. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_ir_photoreflector_value.feature +100 -0
  78. data/spec/acceptance/block_mode/blocks/hardware/smalrubot_s1_led_turn_on_or_off.feature +73 -0
  79. data/spec/acceptance/ruby_mode/translate.feature +6 -6
  80. data/spec/acceptance/standalone/save.feature +3 -3
  81. data/spec/acceptance/standalone/signin.feature +1 -2
  82. data/spec/lib/smalruby_editor_spec.rb +21 -11
  83. data/spec/models/concerns/ruby_to_block/block/hardware__smalrubot_s1_spec.rb +279 -0
  84. data/vendor/assets/javascripts/blockly/blockly_compressed.js +995 -668
  85. data/vendor/assets/javascripts/blockly/blocks_compressed.js +138 -114
  86. data/vendor/assets/javascripts/blockly/msg/js/en_us.js +6 -6
  87. data/vendor/assets/javascripts/blockly/msg/js/ja.js +42 -28
  88. metadata +66 -25
  89. data/app/assets/javascripts/fix_blockly.js +0 -128
  90. data/app/assets/javascripts/views/signin_modal_view.js.coffee +0 -33
  91. data/app/views/editor/_toolbox.html.haml +0 -496
  92. data/public/assets/application-b305a6ea9e7c045a8e170bbf6fb09dd1.js +0 -35
  93. data/public/assets/application-b305a6ea9e7c045a8e170bbf6fb09dd1.js.gz +0 -0
  94. data/public/assets/application-d5358d75a2c4e570c749b333c59b55ab.css.gz +0 -0
  95. data/public/assets/blockly/msg/js/en_us-6f7333af29688596ef863fa36a22cb41.js +0 -1
  96. data/public/assets/blockly/msg/js/en_us-6f7333af29688596ef863fa36a22cb41.js.gz +0 -0
  97. data/public/assets/blockly/msg/js/ja-d2cbf808bda8180571bc5f39141a98fe.js +0 -1
  98. data/public/assets/blockly/msg/js/ja-d2cbf808bda8180571bc5f39141a98fe.js.gz +0 -0
  99. data/public/assets/manifest-b1b843b1334b3b973824ab66b1f7a077.json +0 -1
  100. data/public/assets/msg/en_us-c6f8f0084f38560bf933b742ede64a52.js +0 -1
  101. data/public/assets/msg/en_us-c6f8f0084f38560bf933b742ede64a52.js.gz +0 -0
  102. data/public/assets/msg/ja-3703e6ceebd04ae1f08b0e871800539d.js +0 -1
  103. data/public/assets/msg/ja-3703e6ceebd04ae1f08b0e871800539d.js.gz +0 -0
  104. data/public/blockly/media/trashbody.png +0 -0
  105. data/public/blockly/media/trashlid.png +0 -0
  106. data/public/blockly/media/tree.png +0 -0
@@ -1,3 +1,8 @@
1
+ <%
2
+ require 'smalruby_editor'
3
+ require 'smalruby_editor/blockly_message_helper'
4
+ %>
5
+
1
6
  window.SmalrubyEditor = {}
2
7
  window.changed = false
3
8
  window.textEditor = null
@@ -16,7 +21,7 @@ window.successMessage = (title, msg = '', selector = '#messages') ->
16
21
  window.errorMessage = (msg, selector = '#messages') ->
17
22
  html = $('<div class="alert alert-error" style="display: none">')
18
23
  .append('<button type="button" class="close" data-dismiss="alert">×</button>')
19
- .append('<h4><i class="icon-exclamation-sign"></i>エラー</h4>')
24
+ .append("<h4><i class=\"icon-exclamation-sign\"></i>#{<%= bm('common_error') %>}</h4>")
20
25
  .append(msg)
21
26
  $(selector).append(html)
22
27
  html.fadeIn('slow')
@@ -30,12 +35,16 @@ window.Smalruby =
30
35
  Collections: {}
31
36
  Views: {}
32
37
  Routers: {}
38
+ Features: []
39
+
40
+ username: null
41
+
33
42
  initialize: ->
34
43
  $.ajaxSetup
35
44
  headers:
36
45
  'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
37
46
 
38
- # HACK: Underscoreのテンプレートの<%, %>はHamlと組み合わせたときに
47
+ # HACK: Underscoreのテンプレートの\<\%, \%\>はHamlと組み合わせたときに
39
48
  # HTML要素の属性がHamlによってエスケープされてしまうため使いにく
40
49
  # い。そこで、それぞれ{{, }}に変更する。
41
50
  _.extend(_.templateSettings, {
@@ -44,17 +53,6 @@ window.Smalruby =
44
53
  interpolate: /{{=([\s\S]+?)}}/
45
54
  })
46
55
 
47
- # HACK: 一度開いたジャンルを2回クリックしても閉じないように修正
48
- Blockly.Toolbox.TreeNode.prototype.onMouseDown = (e) ->
49
- if @hasChildren() && @isUserCollapsible_
50
- @toggle()
51
- @select()
52
- else if @isSelected()
53
- #@getTree().setSelectedItem(null)
54
- else
55
- @select()
56
- @updateRow()
57
-
58
56
  @Collections.CharacterSet = new Smalruby.CharacterSet()
59
57
 
60
58
  @Views.MainMenuView = new Smalruby.MainMenuView()
@@ -72,7 +70,7 @@ window.Smalruby =
72
70
  Smalruby.downloading = false
73
71
  window.onbeforeunload = (event) ->
74
72
  if !Smalruby.downloading && window.changed
75
- return '作成中のプログラムが消えてしまうよ!'
73
+ return <%= bm('.will_disapper_your_program') %>
76
74
  else
77
75
  Smalruby.downloading = false
78
76
  return
@@ -85,8 +83,6 @@ window.Smalruby =
85
83
  toolbox: document.getElementById('toolbox')
86
84
  trashcan: true
87
85
 
88
- Blockly.Toolbox.tree_.expandAll()
89
-
90
86
  @blocklyFirst = true
91
87
  @blocklyLoading = false
92
88
  Blockly.addChangeListener =>
@@ -110,6 +106,7 @@ window.Smalruby =
110
106
  textEditor.setTheme('ace/theme/clouds')
111
107
  textEditor.setShowInvisibles(true)
112
108
  textEditor.gotoLine(0, 0)
109
+ textEditor.setReadOnly(@isEnabled('readonly_ruby_mode'))
113
110
  textEditor.on 'change', (e) =>
114
111
  unless @translating
115
112
  window.changed = true
@@ -120,6 +117,8 @@ window.Smalruby =
120
117
  session.setTabSize(2)
121
118
  session.setUseSoftTabs(true)
122
119
 
120
+ @addCharacterFromBeginning()
121
+
123
122
  loadXml: (data, workspace = Blockly.mainWorkspace) ->
124
123
  xml = Blockly.Xml.textToDom(data)
125
124
  workspace.clear()
@@ -172,6 +171,7 @@ window.Smalruby =
172
171
  $('#filename').val('')
173
172
  window.textEditor.getSession().getDocument().setValue('')
174
173
  window.textEditor.moveCursorTo(0, 0)
174
+ @addCharacterFromBeginning()
175
175
  window.changed = false
176
176
 
177
177
  # 国際化したメッセージを取得する
@@ -182,5 +182,24 @@ window.Smalruby =
182
182
  else
183
183
  name
184
184
 
185
+ addCharacterFromBeginning: ->
186
+ if @isEnabled('add_character_from_beginning')
187
+ constume = 'cat1.png'
188
+ c = new Smalruby.Character
189
+ name: @Collections.CharacterSet.uniqueName(constume)
190
+ costumes: [constume]
191
+ x: 200
192
+ y: 200
193
+ @Collections.CharacterSet.add(c)
194
+ @Views.CharacterSelectorView.prevBlock = null
195
+ @Views.CharacterSelectorView.addBlock_(c)
196
+ window.changed = false
197
+
198
+ isEnabled: (feature) ->
199
+ @Features.indexOf(feature) != -1
200
+
185
201
  $(document).ready ->
186
202
  Smalruby.initialize()
203
+
204
+ if Smalruby.username == null && Smalruby.isEnabled('must_signin')
205
+ Smalruby.Views.SigninModalView.render()
@@ -61,14 +61,14 @@ Smalruby.CharacterSelectorView = Backbone.View.extend({
61
61
  @render()
62
62
 
63
63
  addBlock_: (character) ->
64
- newBlock = new Blockly.Block(Blockly.mainWorkspace, 'character_new')
64
+ newBlock = Blockly.Block.obtain(Blockly.mainWorkspace, 'character_new')
65
65
  newBlock.setCharacter(character)
66
66
  newBlock.initSvg()
67
67
  newBlock.render()
68
68
  @moveByNewBlock_(newBlock)
69
69
  newBlock.select()
70
70
 
71
- onStartBlock = new Blockly.Block(Blockly.mainWorkspace, 'events_on_start')
71
+ onStartBlock = Blockly.Block.obtain(Blockly.mainWorkspace, 'events_on_start')
72
72
  onStartBlock.initSvg()
73
73
  onStartBlock.render()
74
74
  newBlock.getInput('DO').connection.connect(onStartBlock.previousConnection)
@@ -1,4 +1,9 @@
1
- # ロードダイアログを表現するビュー
1
+ <%
2
+ require 'smalruby_editor'
3
+ require 'smalruby_editor/blockly_message_helper'
4
+ %>
5
+
6
+ # load dialog view
2
7
  Smalruby.LoadModalView = Backbone.View.extend
3
8
  events:
4
9
  'click #load-modal-ok-button': 'onOk'
@@ -26,6 +31,7 @@ Smalruby.LoadModalView = Backbone.View.extend
26
31
 
27
32
  unblock = =>
28
33
  @$el.find('.modal-body').unblock()
34
+ null # HACK: if return unblock(), does not call fail().
29
35
 
30
36
  @$el.modal('show')
31
37
 
@@ -51,7 +57,7 @@ Smalruby.LoadModalView = Backbone.View.extend
51
57
  .then(unblock, unblock)
52
58
  .fail =>
53
59
  @$el.modal('hide')
54
- errorMessage('ロードに失敗しました')
60
+ errorMessage(<%= bm('.error') %>)
55
61
 
56
62
  onOk: ->
57
63
  switch @type
@@ -3,7 +3,7 @@
3
3
  require 'smalruby_editor/blockly_message_helper'
4
4
  %>
5
5
 
6
- # ナビゲーションメニューを表現するビュー
6
+ # navigation menu view
7
7
  Smalruby.MainMenuView = Backbone.View.extend
8
8
  el: '#main-menu'
9
9
 
@@ -152,34 +152,26 @@ Smalruby.MainMenuView = Backbone.View.extend
152
152
  clearMessages()
153
153
 
154
154
  @blockUI
155
- title:
156
- """
157
- #{<%= bm('.download_blockui_title') %>}
158
- """
155
+ title: <%= bm('.download_blockui_title') %>
159
156
  message: <%= bm('.download_blockui_message') %>
160
- notice:
161
- """
162
- ダウンロードしたプログラムは、<br>
163
- Windowsだと「ruby #{sourceCode.get('filename')}」、<br>
164
- Macだと「rsdl #{sourceCode.get('filename')}」で実行できます。
165
- """
166
157
 
167
158
  sourceCode.save2()
168
159
  .then (data) ->
169
160
  window.changed = false
170
- window.successMessage('ダウンロードしました')
161
+ window.successMessage(goog.getMsg(<%= bm('.download_succeeded') %>,
162
+ { filename: sourceCode.get('filename') }))
171
163
  Smalruby.downloading = true
172
164
  $('#download-link').click()
173
165
  .then(@unblockUI, @unblockUI)
174
166
  .fail ->
175
- window.errorMessage('ダウンロードできませんでした')
167
+ window.errorMessage(<%= bm('.download_error') %>)
176
168
 
177
169
  onLoadLocal: (e) ->
178
170
  e.preventDefault()
179
171
 
180
172
  # TODO: window.changed -> Smalruby.Models.SourceCode.changed
181
173
  if window.changed
182
- return unless confirm('まだセーブしていないのでロードするとプログラムが消えてしまうよ!\nそれでもロードしますか?')
174
+ return unless confirm(<%= bm('.load_confirm') %>)
183
175
 
184
176
  Smalruby.Views.LoadModalView.render()
185
177
 
@@ -188,7 +180,7 @@ Smalruby.MainMenuView = Backbone.View.extend
188
180
 
189
181
  # TODO: window.changed -> Smalruby.Models.SourceCode.changed
190
182
  if window.changed
191
- return unless confirm('まだセーブしていないのでロードするとプログラムが消えてしまうよ!\nそれでもロードしますか?')
183
+ return unless confirm(<%= bm('.load_confirm') %>)
192
184
  $('input#load-file[name="source_code[file]"]').click()
193
185
 
194
186
  onSave: (e) ->
@@ -196,7 +188,7 @@ Smalruby.MainMenuView = Backbone.View.extend
196
188
 
197
189
  filename = $.trim($('#filename').val())
198
190
  if filename.length <= 0
199
- window.errorMessage('セーブする前にプログラムに名前をつけてね!')
191
+ window.errorMessage(<%= bm('.save_error_no_name') %>)
200
192
  $('#filename').focus()
201
193
  return
202
194
 
@@ -208,29 +200,23 @@ Smalruby.MainMenuView = Backbone.View.extend
208
200
  clearMessages()
209
201
 
210
202
  @blockUI
211
- title:
212
- """
213
- プログラムのセーブ中
214
- """
215
- message: 'プログラムをセーブしています。'
216
- notice:
217
- """
218
- プログラムの名前は「#{sourceCode.get('filename')}」です。<br>
219
- プログラムはホームディレクトリにセーブします。<br>
220
- """
203
+ title: <%= bm('.save_blockui_title') %>
204
+ message: <%= bm('.save_blockui_message') %>
205
+ notice: goog.getMsg(<%= bm('.save_blockui_notice') %>,
206
+ { filename: sourceCode.get('filename') })
221
207
 
222
- errorMsg = 'セーブできませんでした'
208
+ errorMsg = <%= bm('.save_error_message') %>
223
209
  sourceCode.save2()
224
210
  .then (data) ->
225
211
  sourceCode.write()
226
212
  .then (data) =>
227
213
  @confirmOverwrite_.call @, data, sourceCode, ->
228
- errorMsg = 'セーブをキャンセルしました'
214
+ errorMsg = <%= bm('.save_canceled') %>
229
215
  .then(@unblockUI, @unblockUI)
230
216
  .done ->
231
217
  Smalruby.savedFilename = sourceCode.get('filename')
232
218
  window.changed = false
233
- window.successMessage('セーブしました')
219
+ window.successMessage(<%= bm('.save_succeeded') %>)
234
220
  .fail ->
235
221
  window.errorMessage(errorMsg)
236
222
 
@@ -242,31 +228,24 @@ Smalruby.MainMenuView = Backbone.View.extend
242
228
  sourceCode = @getSourceCode()
243
229
 
244
230
  @blockUI
245
- title:
246
- """
247
- プログラムのチェック中
248
- """
249
- message: 'プログラムの文法をチェックしています。'
250
- notice:
251
- """
252
- このチェックは簡易的なものですので、<br>
253
- プログラムを動かすとエラーが見つかるかもしれません。
254
- """
231
+ title: <%= bm('.check_blockui_title') %>
232
+ message: <%= bm('.check_blockui_message') %>
233
+ notice: <%= bm('.check_blockui_notice') %>
255
234
 
256
235
  sourceCode.check()
257
236
  .then (data) ->
258
237
  if data.length == 0
259
- window.successMessage('チェックしました', 'ただし、プログラムを動かすとエラーが見つかるかもしれません。')
238
+ window.successMessage(<%= bm('.check_succeeded') %>, <%= bm('.check_succeeded_notice') %>)
260
239
  else
261
240
  for errorInfo in data
262
241
  do (errorInfo) ->
263
- msg = "#{errorInfo.row}"
242
+ msg = "#{errorInfo.row}#{<%= bm('.common_lines') %>}"
264
243
  if errorInfo.column > 0
265
- msg += "、#{errorInfo.column}文字"
244
+ msg += "#{<%= bm('.common_comma') %>}#{errorInfo.column}#{<%= bm('.common_letters') %>}"
266
245
  window.errorMessage(msg + ": #{errorInfo.message}")
267
246
  .then(@unblockUI, @unblockUI)
268
247
  .fail ->
269
- errorMessage('チェックできませんでした')
248
+ errorMessage(<%= bm('.check_error') %>)
270
249
 
271
250
  onReset: (e) ->
272
251
  e.preventDefault()
@@ -291,13 +270,17 @@ Smalruby.MainMenuView = Backbone.View.extend
291
270
  })
292
271
  .then(
293
272
  (data) ->
273
+ Smalruby.username = null
294
274
  $('#signin-button').show()
295
275
  $('#signout-button').hide()
296
276
  $('#username-label').text('')
297
277
  $('#username-button').hide()
298
- successMessage('ログアウトしました')
278
+ successMessage(<%= bm('.signout_succeeded') %>)
279
+
280
+ if Smalruby.isEnabled('must_signin')
281
+ Smalruby.Views.SigninModalView.render()
299
282
  ->
300
- errorMessage('ログアウトに失敗しました')
283
+ errorMessage(<%= bm('.signout_error') %>)
301
284
  )
302
285
 
303
286
  onUsername: (e) ->
@@ -358,7 +341,8 @@ Smalruby.MainMenuView = Backbone.View.extend
358
341
  confirmOverwrite_: (data, sourceCode, canceled = $.noop) ->
359
342
  if data.source_code.error
360
343
  if sourceCode.get('filename') == Smalruby.savedFilename ||
361
- confirm("前に#{sourceCode.get('filename')}という名前でセーブしているけど本当にセーブしますか?\nセーブすると前に作成したプログラムは消えてしまうよ!")
344
+ confirm(goog.getMsg(<%= bm('.common_confirm_overwrite') %>,
345
+ { filename: sourceCode.get('filename') }))
362
346
  sourceCode.write(true)
363
347
  else
364
348
  canceled.call()
@@ -366,7 +350,8 @@ Smalruby.MainMenuView = Backbone.View.extend
366
350
 
367
351
  load: (info) ->
368
352
  if info.error
369
- window.errorMessage(info.filename + '' + info.error)
353
+ window.errorMessage(goog.getMsg(<%= bm('.load_error') %>,
354
+ { filename: info.filename, error: info.error }))
370
355
  else
371
356
  clearMessages()
372
357
 
@@ -395,4 +380,4 @@ Smalruby.MainMenuView = Backbone.View.extend
395
380
  # TODO: window.changed -> Smalruby.Models.SourceCode.changed
396
381
  window.changed = false
397
382
  Smalruby.changedAfterTranslating = true
398
- window.successMessage('ロードしました')
383
+ window.successMessage(<%= bm('.load_succeeded') %>)
@@ -0,0 +1,43 @@
1
+ <%
2
+ require 'smalruby_editor'
3
+ require 'smalruby_editor/blockly_message_helper'
4
+ %>
5
+
6
+ # signin dialog view
7
+ Smalruby.SigninModalView = Backbone.View.extend
8
+ events:
9
+ 'click #signin-modal-ok-button': 'onOk' # FIXME: 本当は#signin-modal .ok-buttonを指定したいができなかった
10
+
11
+ initialize: ->
12
+ Smalruby.ignoreEnterKey(@$el)
13
+ @$el.on 'shown', =>
14
+ @$el.find('#signin-modal-username')
15
+ .focus()
16
+
17
+ render: ->
18
+ @$el.find('#signin-modal-username')
19
+ .val($('#username-label').text())
20
+ @$el.modal
21
+ backdrop: 'static'
22
+ @$el.modal('show')
23
+
24
+ onOk: (e) ->
25
+ username = @$el.find('input[name=username]').val()
26
+ if $.trim(username).length > 0
27
+ $.post('/sessions/', { username: username })
28
+ .then(
29
+ (data) ->
30
+ Smalruby.username = data
31
+ $('#signin-button').hide()
32
+ $('#signout-button').show()
33
+ $('#username-label').text(data)
34
+ $('#username-button').show()
35
+ successMessage(<%= bm('.signed_in') %>)
36
+ new $.Deferred().resolve().promise()
37
+ ->
38
+ errorMessage(<%= bm('.error') %>)
39
+ new $.Deferred().resolve().promise()
40
+ )
41
+ .done =>
42
+ if Smalruby.username != null || !Smalruby.isEnabled('must_signin')
43
+ @$el.modal('hide')
@@ -10,7 +10,9 @@
10
10
  *
11
11
  *= require flatstrap-custom
12
12
  *= require_self
13
- *= require_tree .
13
+ *= require editor
14
+ *= require load-modal
15
+ *= require toolbox
14
16
  */
15
17
 
16
18
  html, body {
@@ -1,58 +1,11 @@
1
- <%
2
- # hsv_to_rgb メソッドは http://c4se.hatenablog.com/entry/2013/08/04/190937 をほぼコピーした
3
- def hsv_to_rgb(h, s, v)
4
- s /= 100.0
5
- v /= 100.0
6
- c = v * s
7
- x = c * (1 - ((h / 60.0) % 2 - 1).abs)
8
- m = v - c
9
- r, g, b = *(
10
- case
11
- when h < 60 then [c, x, 0]
12
- when h < 120 then [x, c, 0]
13
- when h < 180 then [0, c, x]
14
- when h < 240 then [0, x, c]
15
- when h < 300 then [x, 0, c]
16
- else [c, 0, x]
17
- end
18
- )
19
- [r, g, b].map { |channel|
20
- ((channel + m) * 255).ceil
21
- }.map { |c|
22
- '%02x' % c
23
- }.join
24
- end
25
-
26
- require 'smalruby_editor'
27
- colors = SmalrubyEditor::COLORS
28
-
29
- hues = [
30
- colors[:motion],
31
- colors[:looks],
32
- colors[:sound],
33
- colors[:pen],
34
- colors[:data],
35
- colors[:events],
36
- colors[:control],
37
- colors[:sensing],
38
- colors[:operators],
39
- colors[:etc],
40
- ]
41
-
42
- colors = hues.map { |h|
43
- [hsv_to_rgb(h, 100, 80), hsv_to_rgb(h, 100, 100)]
44
- }
45
-
46
- colors.each.with_index(1) do |(color, active_color), index|
47
- %>
1
+ div.blocklyTreeRoot {
2
+ padding: 0;
48
3
 
49
- div[aria-level="1"][aria-posinset="<%= index %>"] {
50
4
  .blocklyTreeRow {
51
5
  margin-bottom: 1px;
52
6
  padding-top: 1px;
53
7
  padding-bottom: 1px;
54
8
  color: white;
55
- background-color: #<%= color %> !important;
56
9
 
57
10
  span.blocklyTreeIcon, span.blocklyTreeLabel {
58
11
  font-size: 14px;
@@ -61,12 +14,5 @@ div[aria-level="1"][aria-posinset="<%= index %>"] {
61
14
 
62
15
  .blocklyTreeRow.blocklyTreeSelected {
63
16
  font-weight: bold;
64
- background-color: #<%= active_color %> !important;
65
17
  }
66
18
  }
67
-
68
- <% end %>
69
-
70
- div.blocklyTreeRoot {
71
- padding: 0;
72
- }
@@ -0,0 +1,34 @@
1
+ <%
2
+ require 'smalruby_editor'
3
+ colors = SmalrubyEditor::COLORS
4
+
5
+ hues = [
6
+ colors[:motion],
7
+ colors[:looks],
8
+ colors[:sound],
9
+ colors[:pen],
10
+ colors[:data],
11
+ colors[:events],
12
+ colors[:control],
13
+ colors[:sensing],
14
+ colors[:operators],
15
+ colors[:etc],
16
+ ]
17
+
18
+ colors = hues.map { |h|
19
+ [SmalrubyEditor.hsv_to_rgb(h, 100, 80),
20
+ SmalrubyEditor.hsv_to_rgb(h, 100, 100)]
21
+ }
22
+
23
+ colors.each.with_index(1) do |(color, active_color), index|
24
+ %>
25
+ div[aria-level="1"][aria-posinset="<%= index %>"] {
26
+ .blocklyTreeRow {
27
+ background-color: #<%= color %> !important;
28
+ }
29
+
30
+ .blocklyTreeRow.blocklyTreeSelected {
31
+ background-color: #<%= active_color %> !important;
32
+ }
33
+ }
34
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <%
2
+ require 'smalruby_editor'
3
+ colors = SmalrubyEditor::COLORS
4
+
5
+ hues = [
6
+ colors[:motion],
7
+ colors[:looks],
8
+ colors[:data],
9
+ colors[:events],
10
+ colors[:control],
11
+ colors[:sensing],
12
+ colors[:operators],
13
+ ]
14
+
15
+ colors = hues.map { |h|
16
+ [SmalrubyEditor.hsv_to_rgb(h, 100, 80),
17
+ SmalrubyEditor.hsv_to_rgb(h, 100, 100)]
18
+ }
19
+
20
+ colors.each.with_index(1) do |(color, active_color), index|
21
+ %>
22
+ div[aria-level="1"][aria-posinset="<%= index %>"] {
23
+ .blocklyTreeRow {
24
+ background-color: #<%= color %> !important;
25
+ }
26
+
27
+ .blocklyTreeRow.blocklyTreeSelected {
28
+ background-color: #<%= active_color %> !important;
29
+ }
30
+ }
31
+ <% end %>
@@ -0,0 +1,32 @@
1
+ <%
2
+ require 'smalruby_editor'
3
+ colors = SmalrubyEditor::COLORS
4
+
5
+ hues = [
6
+ colors[:motion],
7
+ colors[:looks],
8
+ colors[:data],
9
+ colors[:events],
10
+ colors[:control],
11
+ colors[:sensing],
12
+ colors[:operators],
13
+ colors[:etc],
14
+ ]
15
+
16
+ colors = hues.map { |h|
17
+ [SmalrubyEditor.hsv_to_rgb(h, 100, 80),
18
+ SmalrubyEditor.hsv_to_rgb(h, 100, 100)]
19
+ }
20
+
21
+ colors.each.with_index(1) do |(color, active_color), index|
22
+ %>
23
+ div[aria-level="1"][aria-posinset="<%= index %>"] {
24
+ .blocklyTreeRow {
25
+ background-color: #<%= color %> !important;
26
+ }
27
+
28
+ .blocklyTreeRow.blocklyTreeSelected {
29
+ background-color: #<%= active_color %> !important;
30
+ }
31
+ }
32
+ <% end %>
@@ -10,6 +10,7 @@ class ApplicationController < ActionController::Base
10
10
  helper_method :standalone?, :raspberrypi?
11
11
 
12
12
  before_filter :set_locale
13
+ before_filter :reload_config if Rails.env.development?
13
14
 
14
15
  private
15
16
 
@@ -51,4 +52,8 @@ class ApplicationController < ActionController::Base
51
52
  fail "#{self.class.name}##{action_name}はstandaloneモードのみの機能です"
52
53
  end
53
54
  end
55
+
56
+ def reload_config
57
+ SmalrubyEditor::Config.reload!
58
+ end
54
59
  end
@@ -69,7 +69,8 @@ class SourceCodesController < ApplicationController
69
69
  if /\Atext\/plain/ =~ info[:type]
70
70
  info[:data] = NKF.nkf('-w', f.read)
71
71
  else
72
- info[:error] = 'Rubyのプログラムではありません'
72
+ info[:error] = I18n.t('.not_ruby_program',
73
+ scope: 'controllers.source_codes')
73
74
  end
74
75
 
75
76
  render json: { source_code: info }, content_type: request.format
@@ -152,7 +153,9 @@ class SourceCodesController < ApplicationController
152
153
  end
153
154
  path = Pathname(s).expand_path.to_s
154
155
 
155
- fail 'すでに同じ名前のプログラムがあります' if File.exist?(path) && params[:force].blank?
156
+ if File.exist?(path) && params[:force].blank?
157
+ fail I18n.t('.exist', scope: 'controllers.source_codes')
158
+ end
156
159
 
157
160
  FileUtils.mkdir_p(File.dirname(path))
158
161
  File.open(path, 'w') do |f|
@@ -203,7 +206,7 @@ class SourceCodesController < ApplicationController
203
206
  else
204
207
  info = {
205
208
  filename: source_code_params[:filename],
206
- error: 'ありません',
209
+ error: I18n.t('.not_exist', scope: 'controllers.source_codes'),
207
210
  }
208
211
  end
209
212
 
@@ -14,4 +14,16 @@ module ApplicationHelper
14
14
  I18n.locale
15
15
  end
16
16
  end
17
+
18
+ # name of Toolbox
19
+ def toolbox_name
20
+ SmalrubyEditor::Config.toolbox_name || 'default'
21
+ end
22
+
23
+ # css name of Toolbox
24
+ def toolbox_css_name
25
+ SmalrubyEditor::Config.toolbox_css_name ||
26
+ SmalrubyEditor::Config.toolbox_name ||
27
+ 'default'
28
+ end
17
29
  end
@@ -17,6 +17,20 @@ module EditorHelper
17
17
  %(<field name="#{h name}">#{h value}</field>).html_safe
18
18
  end
19
19
 
20
+ # push or down field for Toolbox
21
+ #
22
+ # @param [String] name field name
23
+ # @param [String] value :push or :down
24
+ # @return [String] XML
25
+ def toolbox_pod_field(name = 'POD', value = :down)
26
+ if value == :down
27
+ pod = 'down'
28
+ else
29
+ pod = 'push'
30
+ end
31
+ %(<field name="#{h name}">#{pod}</field>).html_safe
32
+ end
33
+
20
34
  # ツールボックスのブロックに対して、PINの入力フィールドの値を設定する
21
35
  #
22
36
  # @param [String] value ピン
@@ -56,4 +70,15 @@ module EditorHelper
56
70
  </value>
57
71
  XML
58
72
  end
73
+
74
+ # I18n.t wrapper for Toolbox that's defualt scope is
75
+ # 'editor.toolbox'.
76
+ def toolbox_t(*args)
77
+ if args.length == 1 && args.first[0] == '.'
78
+ t(args.first[1..-1], scope: 'editor.toolbox')
79
+ else
80
+ t(*args)
81
+ end
82
+ end
83
+ alias_method :tt, :toolbox_t
59
84
  end