smalruby-editor 0.1.20-x86-mingw32 → 0.1.21-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 (75) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +0 -1
  3. data/app/assets/javascripts/blocks/character.js.coffee.erb +3 -10
  4. data/app/assets/javascripts/blocks/control.js.coffee.erb +2 -1
  5. data/app/assets/javascripts/blocks/data.js.coffee.erb +2 -1
  6. data/app/assets/javascripts/blocks/etc.js.coffee.erb +2 -1
  7. data/app/assets/javascripts/blocks/events.js.coffee.erb +5 -4
  8. data/app/assets/javascripts/blocks/field_character.js.coffee.erb +9 -0
  9. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +171 -54
  10. data/app/assets/javascripts/blocks/looks.js.coffee.erb +2 -1
  11. data/app/assets/javascripts/blocks/motion.js.coffee.erb +4 -16
  12. data/app/assets/javascripts/blocks/operators.js.coffee.erb +2 -1
  13. data/app/assets/javascripts/blocks/pen.js.coffee.erb +2 -1
  14. data/app/assets/javascripts/blocks/ruby.js.coffee.erb +2 -1
  15. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +25 -3
  16. data/app/assets/javascripts/blocks/sound.js.coffee.erb +2 -1
  17. data/app/assets/javascripts/generators/ruby.js.coffee.erb +27 -5
  18. data/app/assets/javascripts/models/source_code.js.coffee +20 -7
  19. data/app/assets/javascripts/views/main_menu_view.js.coffee +5 -7
  20. data/app/assets/stylesheets/editor.css.scss +5 -1
  21. data/app/assets/stylesheets/toolbox.css.scss.erb +29 -24
  22. data/app/controllers/source_codes_controller.rb +7 -36
  23. data/app/helpers/editor_helper.rb +9 -0
  24. data/app/models/concerns/ruby_to_block/block/hardware_button_down_or_up.rb +25 -0
  25. data/app/models/concerns/ruby_to_block/block/hardware_button_not_use_pullup.rb +18 -0
  26. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver.rb +22 -0
  27. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_set_speed.rb +20 -0
  28. data/app/models/concerns/ruby_to_block/block/hardware_motor_driver_speed.rb +24 -0
  29. data/app/models/concerns/ruby_to_block/block/hardware_on_button_down_or_up.rb +19 -0
  30. data/app/models/concerns/ruby_to_block/block/hardware_operation.rb +15 -0
  31. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_set_speed.rb +22 -0
  32. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car_speed.rb +26 -0
  33. data/app/models/concerns/ruby_to_block/block/ruby_p.rb +19 -0
  34. data/app/models/concerns/ruby_to_block/block/{motion_reach_wall.rb → sensing_reach_wall.rb} +1 -1
  35. data/app/models/concerns/ruby_to_block/block/text.rb +3 -2
  36. data/app/models/source_code.rb +20 -0
  37. data/app/views/editor/_toolbox.html.haml +84 -63
  38. data/app/views/editor/index.html.haml +1 -1
  39. data/demos/adjust_2wd_car.rb.xml +179 -0
  40. data/demos/car_chase.rb.xml +129 -126
  41. data/demos/hardware_led.rb.xml +7 -4
  42. data/demos/pong.rb.xml +17 -14
  43. data/demos/star.rb.xml +115 -112
  44. data/lib/smalruby_editor/version.rb +3 -3
  45. data/lib/smalruby_editor.rb +16 -0
  46. data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js → application-734570836cdba680c1568220a51af40f.js} +216 -86
  47. data/public/assets/{application-c8991557a0789ac1bc9220f409e7f1c1.js.gz → application-734570836cdba680c1568220a51af40f.js.gz} +0 -0
  48. data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css → application-898cb749439fba4ce44cffeac1216201.css} +37 -9
  49. data/public/assets/{application-d4fe6c0f970efe8eab9267fd08718d96.css.gz → application-898cb749439fba4ce44cffeac1216201.css.gz} +0 -0
  50. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  51. data/smalruby-editor.gemspec +2 -1
  52. data/spec/acceptance/block_mode/blocks/events/on_hit.feature +2 -0
  53. data/spec/acceptance/block_mode/blocks/hardware/button_down_or_up.feature +79 -0
  54. data/spec/acceptance/block_mode/blocks/hardware/button_not_use_pullup.feature +61 -0
  55. data/spec/acceptance/block_mode/blocks/hardware/motor_driver.feature +73 -0
  56. data/spec/acceptance/block_mode/blocks/hardware/motor_driver_speed.feature +93 -0
  57. data/spec/acceptance/block_mode/blocks/hardware/on_button_down_or_up.feature +87 -0
  58. data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car_speed.feature +111 -0
  59. data/spec/acceptance/block_mode/blocks/motion/reach_wall.feature +1 -1
  60. data/spec/acceptance/block_mode/blocks/operators/text.feature +38 -0
  61. data/spec/acceptance/block_mode/blocks/sensing/hit.feature +98 -52
  62. data/spec/acceptance/block_mode/blocks/sensing/reach_wall.feature +98 -0
  63. data/spec/acceptance/block_mode/demo.feature +3 -1
  64. data/spec/acceptance/standalone/save.feature +51 -0
  65. data/spec/helpers/editor_helper_spec.rb +20 -0
  66. data/spec/javascripts/models/source_code_spec.coffee +40 -0
  67. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +269 -0
  68. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +1 -1
  69. data/spec/models/concerns/ruby_to_block/block/{motion_reach_wall_spec.rb → sensing_reach_wall_spec.rb} +2 -2
  70. data/spec/models/concerns/ruby_to_block/block/text_spec.rb +39 -0
  71. data/spec/models/concerns/ruby_to_block_spec.rb +2 -2
  72. data/spec/models/source_code_spec.rb +53 -0
  73. data/spec/steps/base_steps.rb +5 -0
  74. metadata +56 -12
  75. data/demos/rgb_led_anode.rb.xml +0 -83
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bda05df6c4fa25d55be6f5f3f171bc3cd6409688
4
- data.tar.gz: 46b3054ee3a77ea34e7ba1ccc0b482cf3949e661
3
+ metadata.gz: 20f711eaebefa511e016b5e546a05a7a9d6ba131
4
+ data.tar.gz: b2feda5f9659447e1b5736f8e7b6670129373cd7
5
5
  SHA512:
6
- metadata.gz: f7999752ad0bc11db21be6b4b8ad77a2c839cd5c6dfe64698b8634e86852cbb6d84ee69e87380865e8d35196fb682981bba7d25c537a06a9f0a336b11dda7fd4
7
- data.tar.gz: 91129d5c6dce1d15992c99743ed5fd1cbab0a6062b72f5bec1e55dadb8f4fb267f7ef036dfe135aa2a6941250ffedc841cc992737f0aff5ce1b00452bcd85422
6
+ metadata.gz: c548cae61d1255fe7f1d347a5754ac96f03b30e0646485ae4cc6143f153da780fd7aff53f4f30258299201c001ce49b5eda000b920e0a3488504273c4f725c40
7
+ data.tar.gz: 67a0dda37bce833a7bc084d569008d99b1d9d543434cb99f380091f5dcbc354de45bf33da6b88b8d558c7f8d53c3a663a5a288d802c510103dd233edf9a8c792
data/.gitignore CHANGED
@@ -23,4 +23,3 @@
23
23
  /coverage
24
24
  /pkg
25
25
  /features
26
- /demos/*.xml
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'character'
5
- color = 198
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # キャラクター
@@ -65,15 +66,7 @@ Blockly.Blocks['<%= n %>'] =
65
66
 
66
67
  Blockly.Ruby['<%= n %>'] = (block) ->
67
68
  c = block.character
68
- switch c.get('rotationStyle')
69
- when 'left_right'
70
- rotationStyle = ', rotation_style: :left_right'
71
- when 'none'
72
- rotationStyle = ', rotation_style: :none'
73
- else
74
- rotationStyle = ''
75
- Blockly.Ruby.definitions_["character_#{c.get('name')}"] =
76
- "#{c.get('name')} = Character.new(costume: #{Blockly.Ruby.quote_(c.costume())}, x: #{c.get('x')}, y: #{c.get('y')}, angle: #{c.get('angle')}#{rotationStyle})"
69
+ Blockly.Ruby.defineCharacter(c)
77
70
  Blockly.Ruby.cs_().push(c)
78
71
  try
79
72
  targetBlock = block.getInputTargetBlock('DO')
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'control'
5
- color = 43
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # ( )秒待つ
@@ -2,5 +2,6 @@
2
2
 
3
3
  <%
4
4
  category = 'data'
5
- color = 29
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
@@ -2,5 +2,6 @@
2
2
 
3
3
  <%
4
4
  category = 'etc'
5
- color = 270
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
@@ -2,10 +2,11 @@
2
2
 
3
3
  <%
4
4
  category = 'events'
5
- color = 33
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
- # まずは
9
+ # 実行ボタンがクリックされたとき
9
10
  <% n = "#{category}_on_start" %>
10
11
  Blockly.Blocks['<%= n %>'] =
11
12
  init: ()->
@@ -69,7 +70,7 @@ Blockly.Blocks['<%= n %>'] =
69
70
  @setHelpUrl('')
70
71
  @setColour(<%= color %>)
71
72
  @appendDummyInput()
72
- .appendField(new Smalruby.FieldCharacter(), 'CHAR') # TODO
73
+ .appendField(new Smalruby.FieldCharacter(), 'CHAR')
73
74
  .appendField('にぶつかったとき')
74
75
  @appendStatementInput('DO')
75
76
  @setPreviousStatement(true)
@@ -77,5 +78,5 @@ Blockly.Blocks['<%= n %>'] =
77
78
  @setTooltip('')
78
79
 
79
80
  Blockly.Ruby['<%= n %>'] = (block) ->
80
- char = @getFieldValue('CHAR')
81
+ char = @getCharacterFieldValue()
81
82
  Blockly.Ruby.characterEvent_(block, 'DO', 'hit', char)
@@ -106,3 +106,12 @@ Smalruby.FieldCharacter.NullCharacter =
106
106
  off: -> $.noop
107
107
  link: -> $.noop
108
108
  unlink: -> $.noop
109
+
110
+ Blockly.Block.prototype.getCharacterFieldValue = (name = 'CHAR') ->
111
+ char = @getFieldValue(name)
112
+
113
+ if Blockly.Ruby.c()
114
+ c = Smalruby.Collections.CharacterSet.findWhere({ name: char })
115
+ Blockly.Ruby.defineCharacter(c)
116
+
117
+ char
@@ -2,13 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'hardware'
5
- colors = {
6
- motion: 208,
7
- looks: 270,
8
- events: 33,
9
- sensing: 190,
10
- etc: 340,
11
- }
5
+ require 'smalruby_editor'
6
+ colors = SmalrubyEditor::COLORS
12
7
  %>
13
8
 
14
9
  # ハードウェアの環境設定
@@ -35,6 +30,11 @@ acDropdown = [
35
30
  ['カソード', 'cathode']
36
31
  ]
37
32
 
33
+ lorPinDropdown = [
34
+ ['左', 'left'],
35
+ ['右', 'right'],
36
+ ]
37
+
38
38
  twoWDPinDropdown = (["D#{n}", "D#{n}"] for n in [2..10])
39
39
 
40
40
  # ハードウェアを準備する
@@ -52,8 +52,8 @@ Blockly.Ruby['<%= n %>'] = (block) ->
52
52
 
53
53
  # 「LED」サブジャンル
54
54
 
55
- # LED[▼ピン]をオンにする
56
- # LED[▼ピン]をオフにする
55
+ # LED[▼PIN]をオンにする
56
+ # LED[▼PIN]をオフにする
57
57
  <%
58
58
  [
59
59
  ['on', 'オン'],
@@ -83,7 +83,7 @@ Blockly.Ruby['<%= n %>'] = (block) ->
83
83
 
84
84
  # 「RGB LED」サブジャンル
85
85
 
86
- # RGB LED[▼アノード]コモン[▼ピン]を[カラー]にする
86
+ # RGB LED[▼アノード]コモン[▼PIN]を[カラー]にする
87
87
  <% n = "#{category}_rgb_led_on" %>
88
88
  Blockly.Blocks['<%= n %>'] =
89
89
  init: ()->
@@ -111,7 +111,7 @@ Blockly.Ruby['<%= n %>'] = (block) ->
111
111
  Blockly.Ruby.characterMethodCall_("rgb_led_#{ac}(#{Blockly.Ruby.quote_(pin)}).on",
112
112
  "color: [#{red}, #{green}, #{blue}]")
113
113
 
114
- # RGB LED[▼アノード]コモン[▼ピン]をオフにする
114
+ # RGB LED[▼アノード]コモン[▼PIN]をオフにする
115
115
  <% n = "#{category}_rgb_led_off" %>
116
116
  Blockly.Blocks['<%= n %>'] =
117
117
  init: ()->
@@ -223,7 +223,7 @@ Blockly.Ruby['<%= n %>'] = (block) ->
223
223
 
224
224
  # 「サーボ」サブジャンル
225
225
 
226
- # 「サーボ[▼ピン]を( )度(5~180)にする」ブロック
226
+ # 「サーボ[▼PIN]を( )度(5~180)にする」ブロック
227
227
  <% n = "#{category}_servo_set_position" %>
228
228
  Blockly.Blocks['<%= n %>'] =
229
229
  init: ()->
@@ -248,14 +248,14 @@ Blockly.Ruby['<%= n %>'] = (block) ->
248
248
  pos = Blockly.Ruby.valueToCode(@, 'POS', Blockly.Ruby.ORDER_FUNCTION_CALL) || '5'
249
249
  Blockly.Ruby.characterMethodCall_("servo(#{Blockly.Ruby.quote_(pin)}).position = #{pos}")
250
250
 
251
- # 「車」サブジャンル
251
+ # 「2WD車」サブジャンル
252
252
  <% subcategory = 'two_wheel_drive_car' %>
253
253
 
254
- # 2WD車[▼ピン]を進める
255
- # 2WD車[▼ピン]をバックさせる
256
- # 2WD車[▼ピン]を左に曲げる
257
- # 2WD車[▼ピン]を右に曲げる
258
- # 2WD車[▼ピン]を止める
254
+ # 2WD車[▼PIN]を進める
255
+ # 2WD車[▼PIN]をバックさせる
256
+ # 2WD車[▼PIN]を左に曲げる
257
+ # 2WD車[▼PIN]を右に曲げる
258
+ # 2WD車[▼PIN]を止める
259
259
  <%
260
260
  [
261
261
  ['forward', '進める'],
@@ -288,7 +288,7 @@ Blockly.Ruby['<%= n %>'] = (block) ->
288
288
  Blockly.Ruby.characterMethodCall_("two_wheel_drive_car(#{Blockly.Ruby.quote_(pin)}).<%= method %>")
289
289
  <% end %>
290
290
 
291
- # 2WD車[▼ピン]を( )秒[▼コマンド]
291
+ # 2WD車[▼PIN]を( )秒[▼コマンド]
292
292
  <% n = "#{category}_#{subcategory}_run" %>
293
293
  Blockly.Blocks['<%= n %>'] =
294
294
  init: ()->
@@ -337,71 +337,188 @@ Blockly.Ruby['<%= n %>'] = (block) ->
337
337
  code = Blockly.Ruby.quote_(@getFieldValue('COMMAND'))
338
338
  [code, Blockly.Ruby.ORDER_ATOMIC]
339
339
 
340
- # 「ボタン」サブジャンル
340
+ # 2WD車[▼PIN]の[▼LOR]の速度を<速度の割合>%にする
341
+ <% n = "#{category}_#{subcategory}_set_speed" %>
342
+ Blockly.Blocks['<%= n %>'] =
343
+ init: ()->
344
+ @setHelpUrl('')
345
+ @setColour(<%= colors[:motion] %>)
346
+ @appendDummyInput()
347
+ .appendField('2WD車')
348
+ .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
349
+ .appendField('の')
350
+ .appendField(new Blockly.FieldDropdown(lorPinDropdown), 'LOR')
351
+ .appendField('の速度を')
352
+ @interpolateMsg('%1%にする',
353
+ ['SPEED', ['Number'], Blockly.ALIGN_RIGHT],
354
+ Blockly.ALIGN_RIGHT)
355
+ @setInputsInline(true)
356
+ @setPreviousStatement(true)
357
+ @setNextStatement(true)
358
+ @setTooltip('')
341
359
 
342
- # 条件:ボタン[▼]を押している
343
- # 条件:ボタン[▼]を離している
344
- <%
345
- [
346
- ['down', '押している'],
347
- ['up', '離している'],
348
- ].each do |method, label|
349
- n = "#{category}_button_#{method}"
350
- %>
360
+ Blockly.Ruby['<%= n %>'] = (block) ->
361
+ pin = @getFieldValue('PIN')
362
+ lor = @getFieldValue('LOR')
363
+ speed = Blockly.Ruby.valueToCode(@, 'SPEED', Blockly.Ruby.ORDER_NONE) || '100'
364
+ Blockly.Ruby.characterMethodCall_("two_wheel_drive_car(#{Blockly.Ruby.quote_(pin)}).#{lor}_speed = #{speed}")
365
+
366
+ # 2WD車[▼PIN]の[▼LOR]の速度(%)
367
+ <% n = "#{category}_#{subcategory}_speed" %>
368
+ Blockly.Blocks['<%= n %>'] =
369
+ init: ()->
370
+ @setHelpUrl('')
371
+ @setColour(<%= colors[:sensing] %>)
372
+ @appendDummyInput()
373
+ .appendField('2WD車')
374
+ .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
375
+ .appendField('の')
376
+ .appendField(new Blockly.FieldDropdown(lorPinDropdown), 'LOR')
377
+ .appendField('の速度(%)')
378
+ @setOutput(true, 'Number')
379
+ @setTooltip('')
380
+
381
+ Blockly.Ruby['<%= n %>'] = (block) ->
382
+ pin = @getFieldValue('PIN')
383
+ lor = @getFieldValue('LOR')
384
+ Blockly.Ruby.characterMethodCallInput_("two_wheel_drive_car(#{Blockly.Ruby.quote_(pin)}).#{lor}_speed")
385
+
386
+ # 「(モータードライバ{で,の})モータ」サブジャンル
387
+ <% subcategory = 'motor_driver' %>
388
+
389
+ # (モータードライバ[▼PIN]で)モーターを[▼正転させる]
390
+ <% n = "#{category}_#{subcategory}" %>
391
+ Blockly.Blocks['<%= n %>'] =
392
+ init: ()->
393
+ methodDropdown = [
394
+ ['正転させる', 'forward'],
395
+ ['逆転させる', 'backward'],
396
+ ['止める', 'stop'],
397
+ ]
398
+
399
+ @setHelpUrl('')
400
+ @setColour(<%= colors[:motion] %>)
401
+ @appendDummyInput()
402
+ .appendField('(モータードライバ')
403
+ .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
404
+ .appendField('で)モーターを')
405
+ .appendField(new Blockly.FieldDropdown(methodDropdown), 'METHOD')
406
+ @setInputsInline(true)
407
+ @setPreviousStatement(true)
408
+ @setNextStatement(true)
409
+ @setTooltip('')
410
+
411
+ Blockly.Ruby['<%= n %>'] = (block) ->
412
+ pin = @getFieldValue('PIN')
413
+ method = @getFieldValue('METHOD')
414
+
415
+ Blockly.Ruby.characterMethodCall_("motor_driver(#{Blockly.Ruby.quote_(pin)}).#{method}")
351
416
 
417
+ # (モータードライバ[▼PIN]の)モーターの速度を<SPEED>%にする
418
+ <% n = "#{category}_#{subcategory}_set_speed" %>
352
419
  Blockly.Blocks['<%= n %>'] =
353
420
  init: ()->
421
+ @setHelpUrl('')
422
+ @setColour(<%= colors[:motion] %>)
423
+ @appendDummyInput()
424
+ .appendField('(モータードライバ')
425
+ .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
426
+ .appendField('の)モーターの速度を')
427
+ @interpolateMsg('%1%にする',
428
+ ['SPEED', ['Number'], Blockly.ALIGN_RIGHT],
429
+ Blockly.ALIGN_RIGHT)
430
+ @setInputsInline(true)
431
+ @setPreviousStatement(true)
432
+ @setNextStatement(true)
433
+ @setTooltip('')
434
+
435
+ Blockly.Ruby['<%= n %>'] = (block) ->
436
+ pin = @getFieldValue('PIN')
437
+ speed = Blockly.Ruby.valueToCode(@, 'SPEED', Blockly.Ruby.ORDER_NONE) || '100'
438
+ Blockly.Ruby.characterMethodCall_("motor_driver(#{Blockly.Ruby.quote_(pin)}).speed = #{speed}")
439
+
440
+ # (モータードライバ[▼PIN]の)モーターの速度(%)
441
+ <% n = "#{category}_#{subcategory}_speed" %>
442
+ Blockly.Blocks['<%= n %>'] =
443
+ init: ()->
444
+ @setHelpUrl('')
445
+ @setColour(<%= colors[:sensing] %>)
446
+ @appendDummyInput()
447
+ .appendField('(モータードライバ')
448
+ .appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN')
449
+ .appendField('の)モーターの速度(%)')
450
+ @setOutput(true, 'Number')
451
+ @setTooltip('')
452
+
453
+ Blockly.Ruby['<%= n %>'] = (block) ->
454
+ pin = @getFieldValue('PIN')
455
+ Blockly.Ruby.characterMethodCallInput_("motor_driver(#{Blockly.Ruby.quote_(pin)}).speed")
456
+
457
+
458
+ # 「ボタン」サブジャンル
459
+
460
+ # 条件:ボタン[▼PIN]が[▼押された]
461
+ <% n = "#{category}_button_down_or_up" %>
462
+ Blockly.Blocks['<%= n %>'] =
463
+ init: ()->
464
+ douDropdown = window.SmalrubyEditor.Sensing.DownOrUpDropdown
465
+
354
466
  @setHelpUrl('')
355
467
  @setColour(<%= colors[:sensing] %>)
356
468
  @appendDummyInput()
357
469
  .appendField('ボタン')
358
470
  .appendField(new Blockly.FieldDropdown(dioPinDropdown), 'PIN')
359
- .appendField('を<%= label %>')
471
+ .appendField('')
472
+ .appendField(new Blockly.FieldDropdown(douDropdown), 'DOU')
360
473
  @setOutput(true, 'Boolean')
361
474
  @setTooltip('')
362
475
 
363
476
  Blockly.Ruby['<%= n %>'] = (block) ->
364
477
  pin = @getFieldValue('PIN')
365
- ["button(#{pin}).<%= method %>?", Blockly.Ruby.ORDER_ATOMIC]
366
- <% end %>
367
-
368
- # ボタン[▼]を押したとき
369
- # ボタン[▼]を離したとき
370
- <%
371
- [
372
- ['down', '押した'],
373
- ['up', '離した'],
374
- ].each do |name, label|
375
- n = "#{category}_on_button_#{name}"
376
- %>
478
+ dou = @getFieldValue('DOU')
479
+ Blockly.Ruby.characterMethodCallInput_("button(#{Blockly.Ruby.quote_(pin)}).#{dou}?")
377
480
 
481
+ # ボタン[▼PIN]が[▼押された]とき
482
+ <% n = "#{category}_on_button_down_or_up" %>
378
483
  Blockly.Blocks['<%= n %>'] =
379
484
  init: ()->
485
+ douDropdown = window.SmalrubyEditor.Sensing.DownOrUpDropdown
486
+
380
487
  @setHelpUrl('')
381
488
  @setColour(<%= colors[:events] %>)
382
489
  @appendDummyInput()
383
490
  .appendField('ボタン')
384
491
  .appendField(new Blockly.FieldDropdown(dioPinDropdown), 'PIN')
385
- .appendField('を<%= label %>とき')
492
+ .appendField('')
493
+ .appendField(new Blockly.FieldDropdown(douDropdown), 'DOU')
494
+ .appendField('とき')
386
495
  @appendStatementInput('DO')
387
496
  @setPreviousStatement(true)
388
497
  @setNextStatement(true)
389
498
  @setTooltip('')
390
499
 
391
500
  Blockly.Ruby['<%= n %>'] = (block) ->
392
- if (var0 = Blockly.Ruby.receiverName())
393
- pin = @getFieldValue('PIN')
394
- branch = Blockly.Ruby.statementToCode(block, 'DO') || '\n'
395
- """
396
-
501
+ pin = @getFieldValue('PIN')
502
+ dou = @getFieldValue('DOU')
503
+ Blockly.Ruby.characterEvent_(block, 'DO', "button_#{dou}", Blockly.Ruby.quote_(pin))
397
504
 
398
- #{var0}.on(:button_<%= name %>, #{pin}) do
399
- #{branch}end
505
+ # ボタン[▼PIN]のプルアップ抵抗を使わない
506
+ <% n = "#{category}_button_not_use_pullup" %>
507
+ Blockly.Blocks['<%= n %>'] =
508
+ init: ()->
509
+ @setHelpUrl('')
510
+ @setColour(<%= colors[:etc] %>)
511
+ @appendDummyInput()
512
+ .appendField('ボタン')
513
+ .appendField(new Blockly.FieldDropdown(dioPinDropdown), 'PIN')
514
+ .appendField('のプルアップ抵抗を使わない')
515
+ @setPreviousStatement(true)
516
+ @setNextStatement(true)
517
+ @setTooltip('')
400
518
 
401
- """
402
- else
403
- ''
404
- <% end %>
519
+ Blockly.Ruby['<%= n %>'] = (block) ->
520
+ pin = @getFieldValue('PIN')
521
+ Blockly.Ruby.characterMethodCall_("button(#{Blockly.Ruby.quote_(pin)}).not_use_pullup")
405
522
 
406
523
  # 「センサー」サブジャンル
407
524
 
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'looks'
5
- color = 270
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # [ ]と( )秒言う
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'motion'
5
- color = 208
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # ( )歩動かす
@@ -97,7 +98,7 @@ Blockly.Blocks['<%= n %>'] =
97
98
  @setTooltip('')
98
99
 
99
100
  Blockly.Ruby['<%= n %>'] = (block) ->
100
- char = @getFieldValue('CHAR')
101
+ char = @getCharacterFieldValue()
101
102
  Blockly.Ruby.characterMethodCall_('point_towards', char)
102
103
 
103
104
  # x座標を( )、y座標を( )にする
@@ -150,7 +151,7 @@ Blockly.Blocks['<%= n %>'] =
150
151
  @setTooltip('')
151
152
 
152
153
  Blockly.Ruby['<%= n %>'] = (block) ->
153
- char = @getFieldValue('CHAR')
154
+ char = @getCharacterFieldValue()
154
155
  Blockly.Ruby.characterMethodCall_("go_to(#{char})")
155
156
 
156
157
  # ( )秒でx座標を( )、y座標を( )に変える
@@ -220,19 +221,6 @@ Blockly.Blocks['<%= n %>'] =
220
221
  Blockly.Ruby['<%= n %>'] = (block) ->
221
222
  Blockly.Ruby.characterMethodCall_('turn_if_reach_wall')
222
223
 
223
- # 条件:端に着いた
224
- <% n = "#{category}_reach_wall" %>
225
- Blockly.Blocks['<%= n %>'] =
226
- init: ()->
227
- @setHelpUrl('')
228
- @setColour(<%= color %>)
229
- @appendDummyInput().appendField('端に着いた')
230
- @setOutput(true, 'Boolean')
231
- @setTooltip('')
232
-
233
- Blockly.Ruby['<%= n %>'] = (block) ->
234
- Blockly.Ruby.characterMethodCallInput_('reach_wall?')
235
-
236
224
  # 跳ね返る
237
225
  <% n = "#{category}_turn" %>
238
226
  Blockly.Blocks['<%= n %>'] =
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'operators'
5
- color = 100
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # 変数:( ) + ( )
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'pen'
5
- color = 160
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # ペンを下ろす
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'ruby'
5
- color = 340
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # 文
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'sensing'
5
- color = 190
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # 調べるの環境設定
@@ -26,6 +27,27 @@ window.SmalrubyEditor.Sensing =
26
27
  ['中ボタン', 'M_MBUTTON'],
27
28
  ['右ボタン', 'M_RBUTTON'],
28
29
  ]
30
+ DownOrUpDropdown: [
31
+ ['押された', 'down'],
32
+ ['離された', 'up'],
33
+ ]
34
+
35
+ # 条件:端に触れた
36
+ <% n = "#{category}_reach_wall" %>
37
+ Blockly.Blocks['<%= n %>'] =
38
+ init: ()->
39
+ @setHelpUrl('')
40
+ @setColour(<%= color %>)
41
+ @appendDummyInput().appendField('端に触れた')
42
+ @setOutput(true, 'Boolean')
43
+ @setTooltip('')
44
+
45
+ Blockly.Ruby['<%= n %>'] = (block) ->
46
+ Blockly.Ruby.characterMethodCallInput_('reach_wall?')
47
+
48
+ # HACK: 後方互換性のため、motion_reach_wallとして複製する
49
+ Blockly.Blocks['motion_reach_wall'] = Blockly.Blocks['<%= n %>']
50
+ Blockly.Ruby['motion_reach_wall'] = Blockly.Ruby['<%= n %>']
29
51
 
30
52
  # 条件:キーボードの[▼キー]が[▼押された]
31
53
  <% n = "#{category}_input_key_push_or_down" %>
@@ -104,7 +126,7 @@ Blockly.Blocks['<%= n %>'] =
104
126
  @setTooltip('')
105
127
 
106
128
  Blockly.Ruby['<%= n %>'] = (block) ->
107
- char = @getFieldValue('CHAR')
129
+ char = @getCharacterFieldValue()
108
130
  Blockly.Ruby.characterMethodCallInput_('hit?', char)
109
131
 
110
132
  # [ ]と聞いて待つ
@@ -192,7 +214,7 @@ Blockly.Blocks['<%= n %>'] =
192
214
  @setTooltip('')
193
215
 
194
216
  Blockly.Ruby['<%= n %>'] = (block) ->
195
- char = @getFieldValue('CHAR')
217
+ char = @getCharacterFieldValue()
196
218
  property = @getFieldValue('PROPERTY')
197
219
  c = Smalruby.Collections.CharacterSet.findWhere({ name: char })
198
220
  Blockly.Ruby.characterMethodCallInput_(property, null, { object: c })
@@ -2,7 +2,8 @@
2
2
 
3
3
  <%
4
4
  category = 'sound'
5
- color = 300
5
+ require 'smalruby_editor'
6
+ color = SmalrubyEditor::COLORS[category.to_sym]
6
7
  %>
7
8
 
8
9
  # [▼プリセット音声]
@@ -51,6 +51,20 @@ Blockly.Ruby.init = ->
51
51
  @definitions_['receiver_stack'] = ['main']
52
52
  @definitions_['character_stack'] = []
53
53
 
54
+ Blockly.Ruby.defineCharacter = (c) ->
55
+ name = c.get('name')
56
+ blockName = "character_#{name}"
57
+ if !Blockly.Ruby.definitions_[blockName]
58
+ switch c.get('rotationStyle')
59
+ when 'left_right'
60
+ rotationStyle = ', rotation_style: :left_right'
61
+ when 'none'
62
+ rotationStyle = ', rotation_style: :none'
63
+ else
64
+ rotationStyle = ''
65
+ Blockly.Ruby.definitions_[blockName] =
66
+ "#{name} = Character.new(costume: #{Blockly.Ruby.quote_(c.costume())}, x: #{c.get('x')}, y: #{c.get('y')}, angle: #{c.get('angle')}#{rotationStyle})"
67
+
54
68
  Blockly.Ruby.characterStack = ->
55
69
  @definitions_['character_stack']
56
70
 
@@ -159,12 +173,20 @@ Blockly.Ruby.finish = (code) ->
159
173
  Blockly.Ruby.scrubNakedValue = (line) ->
160
174
  line + '\n'
161
175
 
176
+ Blockly.Ruby.escapeChars_ =
177
+ '"': '\\"'
178
+
162
179
  Blockly.Ruby.quote_ = (string) ->
163
- # TODO: 実装すること
164
- # stringに"を含んでいたら、aから順番にstringに含まれるか試して、含ま
165
- # れていない文字を使って%Qa...aとしようかな。でも生成したソースコード
166
- # の可読性が下がりますね。
167
- '\"' + string + '\"'
180
+ # copy and modified goog.string.quote:
181
+ # http://docs.closure-library.googlecode.com/git/namespace_goog_string.html
182
+ s = String(string)
183
+ sb = ['"']
184
+ for i in [0...s.length]
185
+ do (i) ->
186
+ ch = s.charAt(i)
187
+ sb[i + 1] = Blockly.Ruby.escapeChars_[ch] || ch
188
+ sb.push('"')
189
+ sb.join('')
168
190
 
169
191
  Blockly.Ruby.scrub_ = (block, code) ->
170
192
  if code == null