smalruby-editor 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of smalruby-editor might be problematic. Click here for more details.

Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/demos/default.xml +1 -1
  3. data/app/assets/javascripts/application.js +1 -0
  4. data/app/assets/javascripts/blocks/blockly.js.coffee.erb +1 -1
  5. data/app/assets/javascripts/blocks/events.js.coffee.erb +2 -3
  6. data/app/assets/javascripts/blocks/field_character.js.coffee.erb +108 -0
  7. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +35 -2
  8. data/app/assets/javascripts/blocks/motion.js.coffee.erb +4 -4
  9. data/app/assets/javascripts/blocks/operators.js.coffee.erb +27 -29
  10. data/app/assets/javascripts/blocks/sensing.js.coffee.erb +4 -6
  11. data/app/assets/javascripts/generators/ruby.js.coffee.erb +21 -19
  12. data/app/assets/javascripts/models/character.js.coffee +21 -0
  13. data/app/assets/javascripts/views/character_modal_view.js.coffee +24 -3
  14. data/app/views/editor/_character_modal.html.haml +1 -1
  15. data/app/views/editor/_toolbox.html.haml +7 -3
  16. data/lib/smalruby_editor/version.rb +1 -1
  17. data/public/assets/{application-0c2ae32cd8822cec7ba6e445e2501010.js → application-735e172a0df828da16d22f5d3c26671f.js} +294 -59
  18. data/public/assets/{application-0c2ae32cd8822cec7ba6e445e2501010.js.gz → application-735e172a0df828da16d22f5d3c26671f.js.gz} +0 -0
  19. data/public/assets/{default-7f438ebd7f8ab6ef65c5b9744786e57f.xml → default-5d1886100d7c8961e9962bbc4bb0c714.xml} +1 -1
  20. data/public/assets/manifest-1f254fa92a71ba4faad0f99136daeed8.json +1 -1
  21. data/spec/acceptance/block_mode/blocks/hardware/servo_set_position.feature +104 -0
  22. data/spec/acceptance/block_mode/blocks/operators/and_or.feature +61 -0
  23. data/spec/acceptance/block_mode/blocks/operators/four_arithmetic_and_compares.feature +85 -0
  24. data/spec/acceptance/block_mode/blocks/operators/index_of.feature +60 -0
  25. data/spec/acceptance/block_mode/blocks/operators/length.feature +52 -0
  26. data/spec/acceptance/block_mode/blocks/operators/math_method.feature +109 -0
  27. data/spec/acceptance/block_mode/blocks/operators/negate.feature +47 -0
  28. data/spec/acceptance/block_mode/blocks/operators/rand.feature +60 -0
  29. data/spec/acceptance/block_mode/blocks/operators/round.feature +52 -0
  30. data/spec/acceptance/block_mode/blocks/operators/true_false.feature +36 -0
  31. data/spec/acceptance/block_mode/blocks/ruby/expression.feature +36 -0
  32. data/spec/acceptance/block_mode/blocks/ruby/p.feature +34 -0
  33. data/spec/acceptance/block_mode/blocks/ruby/statement_comment.feature +25 -0
  34. data/spec/javascripts/models/character_spec.coffee +44 -5
  35. data/spec/steps/ace_steps.rb +9 -0
  36. data/spec/steps/block_mode_steps.rb +14 -0
  37. data/spec/steps/fix_turnip.rb +35 -0
  38. data/spec/steps/text_editor_steps.rb +1 -0
  39. data/spec/teaspoon_env.rb +1 -1
  40. data/spec/turnip_helper.rb +1 -0
  41. metadata +34 -5
@@ -14,6 +14,27 @@ Smalruby.Character = Backbone.Model.extend({
14
14
  if @get('costumes').length == 0
15
15
  @set({ costumes: [Smalruby.Character.PRESET_COSTUMES[0]] })
16
16
 
17
+ validate: (attrs, options) ->
18
+ errors = []
19
+
20
+ name = attrs.name
21
+ if _.isUndefined(name) || _.isNull(name) ||
22
+ (_.isString(name) && name.length == 0)
23
+ errors.push
24
+ attr: 'name'
25
+ message: 'Name is required'
26
+
27
+ if _.isString(name) &&
28
+ name.match(/^[0-9A-Z]|[!\"\#$%&\'()\-=^~\\|@`\[{;+:*\]},<.>/?]/)
29
+ errors.push
30
+ attr: 'name'
31
+ message: 'Name is invalid'
32
+
33
+ if errors.length > 0
34
+ return errors
35
+
36
+ return
37
+
17
38
  link: (object) ->
18
39
  @objects.push(object)
19
40
  @objects = _.uniq(@objects)
@@ -37,9 +37,11 @@ Smalruby.CharacterModalView = Backbone.View.extend
37
37
  true
38
38
 
39
39
  self = @
40
- @$el.find('input[name="character[name]"]').change (e) ->
40
+ changeNameFunc = (e) ->
41
41
  self.model.set({ name: $(@).val() })
42
42
  self.nameChanged = true
43
+ @$el.find('input[name="character[name]"]').change(changeNameFunc)
44
+ @$el.find('input[name="character[name]"]').keyup(changeNameFunc)
43
45
 
44
46
  @$el.find('input[name="character[x]"]').change (e) ->
45
47
  self.model.set({ x: $(@).val() })
@@ -55,11 +57,14 @@ Smalruby.CharacterModalView = Backbone.View.extend
55
57
  @listenTo(@model, 'change:y', @onChangeY)
56
58
  @listenTo(@model, 'change:angle', @onChangeAngle)
57
59
  @listenTo(@model, 'change:costumes', @onChangeCostumes)
60
+ @listenTo(@model, 'change', @onChange)
58
61
 
59
- @onChange(@model)
62
+ @callAllOnChangeAttributes_()
60
63
 
61
64
  render: ->
65
+ @onChange(@model)
62
66
  @$el.modal('show')
67
+
63
68
  # HACK: ダイアログを表示して500ms程度待たないと画像のサイズが取得できなかった
64
69
  f = ->
65
70
  if @readImageSizeflag
@@ -74,7 +79,7 @@ Smalruby.CharacterModalView = Backbone.View.extend
74
79
  if @readImageSizeflag
75
80
  setTimeout(_.bind(f, @), 1)
76
81
 
77
- onChange: (model, options)->
82
+ callAllOnChangeAttributes_: ->
78
83
  @onChangeName(@model, @model.get('name'))
79
84
  @onChangeX(@model, @model.get('x'))
80
85
  @onChangeY(@model, @model.get('y'))
@@ -118,6 +123,22 @@ Smalruby.CharacterModalView = Backbone.View.extend
118
123
  else
119
124
  @readImageSizeflag = true
120
125
 
126
+ onChange: (model, options) ->
127
+ return unless @target
128
+
129
+ @$el.find('.control-group[for="character[name]"]').removeClass('error')
130
+ @$el.find('#character-modal-ok-button').removeClass('disabled').removeAttr('disabled')
131
+
132
+ unless @model.isValid()
133
+ @$el.find('.control-group[for="character[name]"]').addClass('error')
134
+ @$el.find('#character-modal-ok-button').addClass('disabled').attr({ disabled: 'disabled' })
135
+
136
+ name = @model.get('name')
137
+ if @target.get('name') != name &&
138
+ Smalruby.Collections.CharacterSet.findWhere({ name: name })
139
+ @$el.find('.control-group[for="character[name]"]').addClass('error')
140
+ @$el.find('#character-modal-ok-button').addClass('disabled').attr({ disabled: 'disabled' })
141
+
121
142
  onSelectCostume: (e) ->
122
143
  e.preventDefault()
123
144
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  #character-modal-attributes
19
19
  %form#character-modal-form{:class => 'form-horizontal'}
20
- .control-group
20
+ .control-group{:for => "character[name]"}
21
21
  %label.control-label{:for => 'character_name'}<
22
22
  名前
23
23
  .controls
@@ -22,7 +22,6 @@
22
22
 
23
23
  -# [▼]へ向ける
24
24
  %block{:type => "#{category}_point_towards_character"}
25
- = toolbox_character_field
26
25
 
27
26
  -# x座標を( )、y座標を( )にする
28
27
  %block{:type => "#{category}_set_x_y"}
@@ -247,12 +246,12 @@
247
246
  = toolbox_number_value('A', 1)
248
247
  = toolbox_number_value('B', 10)
249
248
 
250
- -# 変数:( )の[ ]番目
249
+ -# 変数:( )の( )番目
251
250
  %block{:type => "#{category}_index_of"}
252
251
  = toolbox_text_value('A', 'あいうえお')
253
252
  = toolbox_number_value('INDEX', 1)
254
253
 
255
- -# 変数:[ ]の長さ
254
+ -# 変数:( )の長さ
256
255
  %block{:type => "#{category}_length"}
257
256
  = toolbox_text_value('A', 'あいうえお')
258
257
 
@@ -363,6 +362,11 @@
363
362
  -# -# LCDをクリアする
364
363
  -# %block{:type => "#{category}_lcd_clear"}
365
364
 
365
+ %category{:name => 'サーボ'}
366
+ -# サーボ[▼ピン]を( )度(5~180)にする
367
+ %block{:type => "#{category}_servo_set_position"}
368
+ = toolbox_number_value('POS', 90)
369
+
366
370
  -#%category{:name => 'ボタン'}
367
371
  -# -# 条件:ボタン[▼]を押している
368
372
  -# %block{:type => "#{category}_button_down"}
@@ -1,3 +1,3 @@
1
1
  module SmalrubyEditor
2
- VERSION = '0.1.1'
2
+ VERSION = '0.1.2'
3
3
  end
@@ -12642,6 +12642,26 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
12642
12642
  });
12643
12643
  }
12644
12644
  },
12645
+ validate: function(attrs, options) {
12646
+ var errors, name;
12647
+ errors = [];
12648
+ name = attrs.name;
12649
+ if (_.isUndefined(name) || _.isNull(name) || (_.isString(name) && name.length === 0)) {
12650
+ errors.push({
12651
+ attr: 'name',
12652
+ message: 'Name is required'
12653
+ });
12654
+ }
12655
+ if (_.isString(name) && name.match(/^[0-9A-Z]|[!\"\#$%&\'()\-=^~\\|@`\[{;+:*\]},<.>/?]/)) {
12656
+ errors.push({
12657
+ attr: 'name',
12658
+ message: 'Name is invalid'
12659
+ });
12660
+ }
12661
+ if (errors.length > 0) {
12662
+ return errors;
12663
+ }
12664
+ },
12645
12665
  link: function(object) {
12646
12666
  this.objects.push(object);
12647
12667
  this.objects = _.uniq(this.objects);
@@ -12820,7 +12840,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
12820
12840
  },
12821
12841
  previewZoomLevel: 0.5,
12822
12842
  initialize: function() {
12823
- var self, setPosition,
12843
+ var changeNameFunc, self, setPosition,
12824
12844
  _this = this;
12825
12845
  this.target = null;
12826
12846
  $('#character-modal-costume-selector img').on('dragstart', function(e) {
@@ -12855,12 +12875,14 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
12855
12875
  }
12856
12876
  });
12857
12877
  self = this;
12858
- this.$el.find('input[name="character[name]"]').change(function(e) {
12878
+ changeNameFunc = function(e) {
12859
12879
  self.model.set({
12860
12880
  name: $(this).val()
12861
12881
  });
12862
12882
  return self.nameChanged = true;
12863
- });
12883
+ };
12884
+ this.$el.find('input[name="character[name]"]').change(changeNameFunc);
12885
+ this.$el.find('input[name="character[name]"]').keyup(changeNameFunc);
12864
12886
  this.$el.find('input[name="character[x]"]').change(function(e) {
12865
12887
  return self.model.set({
12866
12888
  x: $(this).val()
@@ -12881,10 +12903,12 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
12881
12903
  this.listenTo(this.model, 'change:y', this.onChangeY);
12882
12904
  this.listenTo(this.model, 'change:angle', this.onChangeAngle);
12883
12905
  this.listenTo(this.model, 'change:costumes', this.onChangeCostumes);
12884
- return this.onChange(this.model);
12906
+ this.listenTo(this.model, 'change', this.onChange);
12907
+ return this.callAllOnChangeAttributes_();
12885
12908
  },
12886
12909
  render: function() {
12887
12910
  var f;
12911
+ this.onChange(this.model);
12888
12912
  this.$el.modal('show');
12889
12913
  f = function() {
12890
12914
  var img;
@@ -12905,7 +12929,7 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
12905
12929
  return setTimeout(_.bind(f, this), 1);
12906
12930
  }
12907
12931
  },
12908
- onChange: function(model, options) {
12932
+ callAllOnChangeAttributes_: function() {
12909
12933
  this.onChangeName(this.model, this.model.get('name'));
12910
12934
  this.onChangeX(this.model, this.model.get('x'));
12911
12935
  this.onChangeY(this.model, this.model.get('y'));
@@ -12955,6 +12979,29 @@ Blockly.Msg.CONTROLS_IF_ELSE_TITLE_ELSE = Blockly.Msg.CONTROLS_IF_MSG_ELSE;
12955
12979
  return this.readImageSizeflag = true;
12956
12980
  }
12957
12981
  },
12982
+ onChange: function(model, options) {
12983
+ var name;
12984
+ if (!this.target) {
12985
+ return;
12986
+ }
12987
+ this.$el.find('.control-group[for="character[name]"]').removeClass('error');
12988
+ this.$el.find('#character-modal-ok-button').removeClass('disabled').removeAttr('disabled');
12989
+ if (!this.model.isValid()) {
12990
+ this.$el.find('.control-group[for="character[name]"]').addClass('error');
12991
+ this.$el.find('#character-modal-ok-button').addClass('disabled').attr({
12992
+ disabled: 'disabled'
12993
+ });
12994
+ }
12995
+ name = this.model.get('name');
12996
+ if (this.target.get('name') !== name && Smalruby.Collections.CharacterSet.findWhere({
12997
+ name: name
12998
+ })) {
12999
+ this.$el.find('.control-group[for="character[name]"]').addClass('error');
13000
+ return this.$el.find('#character-modal-ok-button').addClass('disabled').attr({
13001
+ disabled: 'disabled'
13002
+ });
13003
+ }
13004
+ },
12958
13005
  onSelectCostume: function(e) {
12959
13006
  var attrs, costume, prefix;
12960
13007
  e.preventDefault();
@@ -13405,37 +13452,45 @@ case end next return until\
13405
13452
 
13406
13453
  Blockly.Ruby.ORDER_MEMBER = 2;
13407
13454
 
13408
- Blockly.Ruby.ORDER_FUNCTION_CALL = 2;
13455
+ Blockly.Ruby.ORDER_INDEX = 3;
13456
+
13457
+ Blockly.Ruby.ORDER_FUNCTION_CALL = 4;
13458
+
13459
+ Blockly.Ruby.ORDER_UNARY_SIGN = 5;
13409
13460
 
13410
- Blockly.Ruby.ORDER_EXPONENTIATION = 3;
13461
+ Blockly.Ruby.ORDER_EXPONENTIATION = 6;
13411
13462
 
13412
- Blockly.Ruby.ORDER_UNARY_SIGN = 4;
13463
+ Blockly.Ruby.ORDER_UNARY_MINUS_SIGN = 7;
13413
13464
 
13414
- Blockly.Ruby.ORDER_BITWISE_NOT = 4;
13465
+ Blockly.Ruby.ORDER_MULTIPLICATIVE = 8;
13415
13466
 
13416
- Blockly.Ruby.ORDER_MULTIPLICATIVE = 5;
13467
+ Blockly.Ruby.ORDER_ADDITIVE = 9;
13417
13468
 
13418
- Blockly.Ruby.ORDER_ADDITIVE = 6;
13469
+ Blockly.Ruby.ORDER_BITWISE_SHIFT = 10;
13419
13470
 
13420
- Blockly.Ruby.ORDER_BITWISE_SHIFT = 7;
13471
+ Blockly.Ruby.ORDER_BITWISE_AND = 11;
13421
13472
 
13422
- Blockly.Ruby.ORDER_BITWISE_AND = 8;
13473
+ Blockly.Ruby.ORDER_BITWISE_XOR = 12;
13423
13474
 
13424
- Blockly.Ruby.ORDER_BITWISE_XOR = 9;
13475
+ Blockly.Ruby.ORDER_BITWISE_OR = 12;
13425
13476
 
13426
- Blockly.Ruby.ORDER_BITWISE_OR = 10;
13477
+ Blockly.Ruby.ORDER_RELATIONAL = 13;
13427
13478
 
13428
- Blockly.Ruby.ORDER_RELATIONAL = 11;
13479
+ Blockly.Ruby.ORDER_EQUALS = 14;
13429
13480
 
13430
- Blockly.Ruby.ORDER_LOGICAL_NOT = 12;
13481
+ Blockly.Ruby.ORDER_LOGICAL_AND = 15;
13431
13482
 
13432
- Blockly.Ruby.ORDER_LOGICAL_AND = 13;
13483
+ Blockly.Ruby.ORDER_LOGICAL_OR = 16;
13433
13484
 
13434
- Blockly.Ruby.ORDER_LOGICAL_OR = 14;
13485
+ Blockly.Ruby.ORDER_RANGE = 17;
13435
13486
 
13436
- Blockly.Ruby.ORDER_CONDITIONAL = 15;
13487
+ Blockly.Ruby.ORDER_CONDITIONAL = 18;
13437
13488
 
13438
- Blockly.Ruby.ORDER_LAMBDA = 16;
13489
+ Blockly.Ruby.ORDER_ASSIGNMENT = 19;
13490
+
13491
+ Blockly.Ruby.ORDER_NOT = 20;
13492
+
13493
+ Blockly.Ruby.ORDER_AND_OR = 21;
13439
13494
 
13440
13495
  Blockly.Ruby.ORDER_NONE = 99;
13441
13496
 
@@ -13642,12 +13697,160 @@ case end next return until\
13642
13697
  return commentCode + code + nextCode;
13643
13698
  };
13644
13699
 
13700
+ }).call(this);
13701
+ (function() {
13702
+ 'use strict';
13703
+ goog.provide('Smalruby.FieldCharacter');
13704
+
13705
+ goog.require('Blockly.FieldDropdown');
13706
+
13707
+ Smalruby.FieldCharacter = function(character, opt_changeHandler) {
13708
+ var changeHandler, charSet,
13709
+ _this = this;
13710
+ if (opt_changeHandler) {
13711
+ changeHandler = function(value) {
13712
+ var newVal, retVal;
13713
+ retVal = Smalruby.FieldCharacter.dropdownChange.call(_this, value);
13714
+ if (retVal) {
13715
+ newVal = retVal;
13716
+ } else {
13717
+ retVal = _this.getValue();
13718
+ }
13719
+ opt_changeHandler.call(_this, newVal);
13720
+ return retVal;
13721
+ };
13722
+ } else {
13723
+ changeHandler = Smalruby.FieldCharacter.dropdownChange;
13724
+ }
13725
+ Smalruby.FieldCharacter.superClass_.constructor.call(this, Smalruby.FieldCharacter.dropdownCreate, changeHandler);
13726
+ charSet = Smalruby.Collections.CharacterSet;
13727
+ charSet.on('add', this.onCharacterSetAdd_, this);
13728
+ charSet.on('remove', this.onCharacterSetRemove_, this);
13729
+ charSet.on('reset', this.onCharacterSetReset_, this);
13730
+ this.character = Smalruby.FieldCharacter.NullCharacter;
13731
+ if (!character) {
13732
+ character = Smalruby.Collections.CharacterSet.first();
13733
+ }
13734
+ return this.setCharacter(character);
13735
+ };
13736
+
13737
+ goog.inherits(Smalruby.FieldCharacter, Blockly.FieldDropdown);
13738
+
13739
+ Smalruby.FieldCharacter.prototype.setCharacter = function(character) {
13740
+ if (character === this.character) {
13741
+ return;
13742
+ }
13743
+ this.character.unlink(this);
13744
+ this.character.off('change:name', this.onCharacterChangeName_, this);
13745
+ this.character = character ? character : Smalruby.FieldCharacter.NullCharacter;
13746
+ this.character.link(this);
13747
+ this.character.on('change:name', this.onCharacterChangeName_, this);
13748
+ return this.setValue(this.character.get('name'));
13749
+ };
13750
+
13751
+ Smalruby.FieldCharacter.prototype.onCharacterSetAdd_ = function(model, collection, options) {
13752
+ if (this.character === Smalruby.FieldCharacter.NullCharacter) {
13753
+ return this.setCharacter(model);
13754
+ }
13755
+ };
13756
+
13757
+ Smalruby.FieldCharacter.prototype.onCharacterSetRemove_ = function(model, collection, options) {
13758
+ if (model === this.character) {
13759
+ return this.setCharacter();
13760
+ }
13761
+ };
13762
+
13763
+ Smalruby.FieldCharacter.prototype.onCharacterSetReset_ = function(collection, options) {
13764
+ if (this.character === Smalruby.FieldCharacter.NullCharacter) {
13765
+ return this.setCharacter(collection.first());
13766
+ } else {
13767
+ return this.setCharacter(collection.findWhere({
13768
+ name: this.getValue()
13769
+ }));
13770
+ }
13771
+ };
13772
+
13773
+ Smalruby.FieldCharacter.prototype.onCharacterChangeName_ = function(model, value, options) {
13774
+ return this.setValue(value);
13775
+ };
13776
+
13777
+ Smalruby.FieldCharacter.prototype.clone = function() {
13778
+ return new Smalruby.FieldCharacter(this.character, this.changeHandler_);
13779
+ };
13780
+
13781
+ Smalruby.FieldCharacter.prototype.dispose = function() {
13782
+ var charSet;
13783
+ charSet = Smalruby.Collections.CharacterSet;
13784
+ charSet.off('add', this.onCharacterSetAdd_, this);
13785
+ charSet.off('remove', this.onCharacterSetRemove_, this);
13786
+ charSet.off('reset', this.onCharacterSetReset_, this);
13787
+ this.setCharacter();
13788
+ return Blockly.FieldDropdown.prototype.dispose.call(this);
13789
+ };
13790
+
13791
+ Smalruby.FieldCharacter.prototype.setText = function(value) {
13792
+ var charSet;
13793
+ if (!this.character) {
13794
+ this.character = Smalruby.FieldCharacter.NullCharacter;
13795
+ charSet = Smalruby.Collections.CharacterSet;
13796
+ this.setCharacter(charSet.findWhere({
13797
+ name: value
13798
+ }));
13799
+ }
13800
+ return Blockly.FieldDropdown.prototype.setText.call(this, value);
13801
+ };
13802
+
13803
+ Smalruby.FieldCharacter.dropdownCreate = function() {
13804
+ var charSet;
13805
+ charSet = Smalruby.Collections.CharacterSet;
13806
+ if (charSet.length > 0) {
13807
+ return Smalruby.Collections.CharacterSet.map(function(c) {
13808
+ var n;
13809
+ n = c.get('name');
13810
+ return [n, n];
13811
+ });
13812
+ } else {
13813
+ return [[Smalruby.FieldCharacter.NullCharacter.get('name'), '']];
13814
+ }
13815
+ };
13816
+
13817
+ Smalruby.FieldCharacter.dropdownChange = function(value) {
13818
+ var c;
13819
+ c = Smalruby.Collections.CharacterSet.findWhere({
13820
+ name: value
13821
+ });
13822
+ if (c) {
13823
+ this.setCharacter(c);
13824
+ return value;
13825
+ } else {
13826
+ return null;
13827
+ }
13828
+ };
13829
+
13830
+ Smalruby.FieldCharacter.NullCharacter = {
13831
+ get: function(name) {
13832
+ return 'キャラクターなし';
13833
+ },
13834
+ on: function() {
13835
+ return $.noop;
13836
+ },
13837
+ off: function() {
13838
+ return $.noop;
13839
+ },
13840
+ link: function() {
13841
+ return $.noop;
13842
+ },
13843
+ unlink: function() {
13844
+ return $.noop;
13845
+ }
13846
+ };
13847
+
13645
13848
  }).call(this);
13646
13849
  (function() {
13647
13850
  Blockly.Ruby['math_number'] = function(block) {
13648
13851
  var code, order;
13649
13852
  code = parseFloat(this.getFieldValue('NUM'));
13650
- order = code < 0 ? Blockly.Ruby.ORDER_UNARY_SIGN : Blockly.Ruby.ORDER_ATOMIC;
13853
+ order = code < 0 ? Blockly.Ruby.ORDER_UNARY_MINUS_SIGN : Blockly.Ruby.ORDER_ATOMIC;
13651
13854
  return [code, order];
13652
13855
  };
13653
13856
 
@@ -14015,7 +14218,7 @@ case end next return until\
14015
14218
  init: function() {
14016
14219
  this.setHelpUrl('');
14017
14220
  this.setColour(33);
14018
- this.appendDummyInput().appendField(new Blockly.FieldVariable('car1'), 'CHAR').appendField('にぶつかったとき');
14221
+ this.appendDummyInput().appendField(new Smalruby.FieldCharacter(), 'CHAR').appendField('にぶつかったとき');
14019
14222
  this.appendStatementInput('DO');
14020
14223
  this.setPreviousStatement(true);
14021
14224
  this.setNextStatement(true);
@@ -14025,17 +14228,18 @@ case end next return until\
14025
14228
 
14026
14229
  Blockly.Ruby['events_on_hit'] = function(block) {
14027
14230
  var char;
14028
- char = Blockly.Ruby.variableDB_.getName(block.getFieldValue('CHAR'), Blockly.Variables.NAME_TYPE);
14231
+ char = this.getFieldValue('CHAR');
14029
14232
  return Blockly.Ruby.characterEvent_(block, 'DO', 'hit', char);
14030
14233
  };
14031
14234
 
14032
14235
  }).call(this);
14033
14236
  (function() {
14034
- var acDropdown, aiPinDropdown, dioPinDropdown, n, pwmPinDropdown;
14237
+ var acDropdown, aiPinDropdown, dioPinDropdown, n, pwmPinDropdown, rgbLedPinDropdown;
14035
14238
 
14036
14239
  window.SmalrubyEditor.Hardware = {
14037
14240
  Type: 'Arduino',
14038
14241
  DioPins: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
14242
+ PwmPins: [3, 5, 6, 9, 10, 11],
14039
14243
  AiPins: [0, 1, 2, 3, 4, 5]
14040
14244
  };
14041
14245
 
@@ -14051,6 +14255,17 @@ case end next return until\
14051
14255
  })();
14052
14256
 
14053
14257
  pwmPinDropdown = (function() {
14258
+ var _i, _len, _ref, _results;
14259
+ _ref = window.SmalrubyEditor.Hardware.PwmPins;
14260
+ _results = [];
14261
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
14262
+ n = _ref[_i];
14263
+ _results.push(["D" + n, "D" + n]);
14264
+ }
14265
+ return _results;
14266
+ })();
14267
+
14268
+ rgbLedPinDropdown = (function() {
14054
14269
  var _i, _len, _ref, _results;
14055
14270
  _ref = [3, 9];
14056
14271
  _results = [];
@@ -14128,7 +14343,7 @@ case end next return until\
14128
14343
  init: function() {
14129
14344
  this.setHelpUrl('');
14130
14345
  this.setColour(208);
14131
- this.appendDummyInput().appendField('RGB LED').appendField(new Blockly.FieldDropdown(acDropdown), 'AC').appendField('コモン').appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN').appendField('を').appendField(new Blockly.FieldColour('#ff0000'), 'COLOUR').appendField('にする');
14346
+ this.appendDummyInput().appendField('RGB LED').appendField(new Blockly.FieldDropdown(acDropdown), 'AC').appendField('コモン').appendField(new Blockly.FieldDropdown(rgbLedPinDropdown), 'PIN').appendField('を').appendField(new Blockly.FieldColour('#ff0000'), 'COLOUR').appendField('にする');
14132
14347
  this.setPreviousStatement(true);
14133
14348
  this.setNextStatement(true);
14134
14349
  return this.setTooltip('');
@@ -14150,7 +14365,7 @@ case end next return until\
14150
14365
  init: function() {
14151
14366
  this.setHelpUrl('');
14152
14367
  this.setColour(208);
14153
- this.appendDummyInput().appendField('RGB LED').appendField(new Blockly.FieldDropdown(acDropdown), 'AC').appendField('コモン').appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN').appendField('をオフにする');
14368
+ this.appendDummyInput().appendField('RGB LED').appendField(new Blockly.FieldDropdown(acDropdown), 'AC').appendField('コモン').appendField(new Blockly.FieldDropdown(rgbLedPinDropdown), 'PIN').appendField('をオフにする');
14154
14369
  this.setPreviousStatement(true);
14155
14370
  this.setNextStatement(true);
14156
14371
  return this.setTooltip('');
@@ -14254,6 +14469,27 @@ case end next return until\
14254
14469
  return "seven_segment_display.off\n";
14255
14470
  };
14256
14471
 
14472
+ Blockly.Blocks['hardware_servo_set_position'] = {
14473
+ init: function() {
14474
+ this.setHelpUrl('');
14475
+ this.setColour(208);
14476
+ this.appendDummyInput().appendField('サーボ').appendField(new Blockly.FieldDropdown(pwmPinDropdown), 'PIN').appendField('を');
14477
+ this.appendValueInput('POS').setCheck('Number');
14478
+ this.appendDummyInput().appendField('度(5~180)にする');
14479
+ this.setInputsInline(true);
14480
+ this.setPreviousStatement(true);
14481
+ this.setNextStatement(true);
14482
+ return this.setTooltip('');
14483
+ }
14484
+ };
14485
+
14486
+ Blockly.Ruby['hardware_servo_set_position'] = function(block) {
14487
+ var pin, pos;
14488
+ pin = this.getFieldValue('PIN');
14489
+ pos = Blockly.Ruby.valueToCode(this, 'POS', Blockly.Ruby.ORDER_FUNCTION_CALL) || '5';
14490
+ return Blockly.Ruby.characterMethodCall_("servo(" + (Blockly.Ruby.quote_(pin)) + ").position = " + pos);
14491
+ };
14492
+
14257
14493
  Blockly.Blocks['hardware_button_down'] = {
14258
14494
  init: function() {
14259
14495
  this.setHelpUrl('');
@@ -14650,7 +14886,7 @@ case end next return until\
14650
14886
  init: function() {
14651
14887
  this.setHelpUrl('');
14652
14888
  this.setColour(225);
14653
- this.appendDummyInput().appendField(new Blockly.FieldVariable('char1'), 'VAR').appendField('へ向ける');
14889
+ this.appendDummyInput().appendField(new Smalruby.FieldCharacter(), 'CHAR').appendField('へ向ける');
14654
14890
  this.setPreviousStatement(true);
14655
14891
  this.setNextStatement(true);
14656
14892
  return this.setTooltip('');
@@ -14659,7 +14895,7 @@ case end next return until\
14659
14895
 
14660
14896
  Blockly.Ruby['motion_point_towards_character'] = function(block) {
14661
14897
  var char;
14662
- char = Blockly.Ruby.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
14898
+ char = this.getFieldValue('CHAR');
14663
14899
  return Blockly.Ruby.characterMethodCall_('point_towards', char);
14664
14900
  };
14665
14901
 
@@ -14705,7 +14941,7 @@ case end next return until\
14705
14941
  init: function() {
14706
14942
  this.setHelpUrl('');
14707
14943
  this.setColour(225);
14708
- this.appendDummyInput().appendField(new Blockly.FieldVariable('char1'), 'VAR').appendField('へ行く');
14944
+ this.appendDummyInput().appendField(new Smalruby.FieldCharacter(), 'CHAR').appendField('へ行く');
14709
14945
  this.setPreviousStatement(true);
14710
14946
  this.setNextStatement(true);
14711
14947
  return this.setTooltip('');
@@ -14713,8 +14949,8 @@ case end next return until\
14713
14949
  };
14714
14950
 
14715
14951
  Blockly.Ruby['motion_go_to_character'] = function(block) {
14716
- var var0;
14717
- var0 = Blockly.Ruby.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
14952
+ var char;
14953
+ char = this.getFieldValue('CHAR');
14718
14954
  return "" + (Blockly.Ruby.rn()) + "go_to(" + var0 + ")\n";
14719
14955
  };
14720
14956
 
@@ -14991,11 +15227,11 @@ case end next return until\
14991
15227
  var a, b, order;
14992
15228
  order = Blockly.Ruby.ORDER_MULTIPLICATIVE;
14993
15229
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
14994
- b = Blockly.Ruby.valueToCode(block, 'B', order) || '0';
15230
+ b = Blockly.Ruby.valueToCode(block, 'B', order) || '1';
14995
15231
  return [a + ' / ' + b, order];
14996
15232
  };
14997
15233
 
14998
- Blockly.Blocks['operators_compare_gt'] = {
15234
+ Blockly.Blocks['operators_compare_lt'] = {
14999
15235
  init: function() {
15000
15236
  this.setHelpUrl('');
15001
15237
  this.setColour(93);
@@ -15006,7 +15242,7 @@ case end next return until\
15006
15242
  }
15007
15243
  };
15008
15244
 
15009
- Blockly.Ruby['operators_compare_gt'] = function(block) {
15245
+ Blockly.Ruby['operators_compare_lt'] = function(block) {
15010
15246
  var a, b, order;
15011
15247
  order = Blockly.Ruby.ORDER_RELATIONAL;
15012
15248
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
@@ -15014,7 +15250,7 @@ case end next return until\
15014
15250
  return [a + ' < ' + b, order];
15015
15251
  };
15016
15252
 
15017
- Blockly.Blocks['operators_compare_gte'] = {
15253
+ Blockly.Blocks['operators_compare_lte'] = {
15018
15254
  init: function() {
15019
15255
  this.setHelpUrl('');
15020
15256
  this.setColour(93);
@@ -15025,7 +15261,7 @@ case end next return until\
15025
15261
  }
15026
15262
  };
15027
15263
 
15028
- Blockly.Ruby['operators_compare_gte'] = function(block) {
15264
+ Blockly.Ruby['operators_compare_lte'] = function(block) {
15029
15265
  var a, b, order;
15030
15266
  order = Blockly.Ruby.ORDER_RELATIONAL;
15031
15267
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
@@ -15046,13 +15282,13 @@ case end next return until\
15046
15282
 
15047
15283
  Blockly.Ruby['operators_compare_eq'] = function(block) {
15048
15284
  var a, b, order;
15049
- order = Blockly.Ruby.ORDER_RELATIONAL;
15285
+ order = Blockly.Ruby.ORDER_EQUALS;
15050
15286
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
15051
15287
  b = Blockly.Ruby.valueToCode(block, 'B', order) || '0';
15052
15288
  return [a + ' == ' + b, order];
15053
15289
  };
15054
15290
 
15055
- Blockly.Blocks['operators_compare_lte'] = {
15291
+ Blockly.Blocks['operators_compare_gte'] = {
15056
15292
  init: function() {
15057
15293
  this.setHelpUrl('');
15058
15294
  this.setColour(93);
@@ -15063,7 +15299,7 @@ case end next return until\
15063
15299
  }
15064
15300
  };
15065
15301
 
15066
- Blockly.Ruby['operators_compare_lte'] = function(block) {
15302
+ Blockly.Ruby['operators_compare_gte'] = function(block) {
15067
15303
  var a, b, order;
15068
15304
  order = Blockly.Ruby.ORDER_RELATIONAL;
15069
15305
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
@@ -15071,7 +15307,7 @@ case end next return until\
15071
15307
  return [a + ' >= ' + b, order];
15072
15308
  };
15073
15309
 
15074
- Blockly.Blocks['operators_compare_lt'] = {
15310
+ Blockly.Blocks['operators_compare_gt'] = {
15075
15311
  init: function() {
15076
15312
  this.setHelpUrl('');
15077
15313
  this.setColour(93);
@@ -15082,7 +15318,7 @@ case end next return until\
15082
15318
  }
15083
15319
  };
15084
15320
 
15085
- Blockly.Ruby['operators_compare_lt'] = function(block) {
15321
+ Blockly.Ruby['operators_compare_gt'] = function(block) {
15086
15322
  var a, b, order;
15087
15323
  order = Blockly.Ruby.ORDER_RELATIONAL;
15088
15324
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
@@ -15102,11 +15338,10 @@ case end next return until\
15102
15338
  };
15103
15339
 
15104
15340
  Blockly.Ruby['operators_rand'] = function(block) {
15105
- var a, b, order;
15106
- order = Blockly.Ruby.ORDER_FUNCTION_CALL;
15107
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '0';
15108
- b = Blockly.Ruby.valueToCode(block, 'B', order) || '0';
15109
- return ["rand(" + a + ".." + b + ")", order];
15341
+ var a, b;
15342
+ a = Blockly.Ruby.valueToCode(block, 'A', Blockly.Ruby.ORDER_RANGE) || '0';
15343
+ b = Blockly.Ruby.valueToCode(block, 'B', Blockly.Ruby.ORDER_RANGE) || '0';
15344
+ return ["rand(" + a + ".." + b + ")", Blockly.Ruby.ORDER_FUNCTION_CALL];
15110
15345
  };
15111
15346
 
15112
15347
  Blockly.Blocks['operators_and'] = {
@@ -15160,7 +15395,7 @@ case end next return until\
15160
15395
 
15161
15396
  Blockly.Ruby['operators_negate'] = function(block) {
15162
15397
  var a, order;
15163
- order = Blockly.Ruby.ORDER_LOGICAL_NOT;
15398
+ order = Blockly.Ruby.ORDER_UNARY_SIGN;
15164
15399
  a = Blockly.Ruby.valueToCode(block, 'A', order) || 'true';
15165
15400
  return ["!" + a, order];
15166
15401
  };
@@ -15177,11 +15412,10 @@ case end next return until\
15177
15412
  };
15178
15413
 
15179
15414
  Blockly.Ruby['operators_index_of'] = function(block) {
15180
- var a, index, order;
15181
- order = Blockly.Ruby.ORDER_FUNCTION_CALL;
15182
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '""';
15183
- index = Blockly.Ruby.valueToCode(block, 'INDEX', order) || '0';
15184
- return ["" + a + "[" + index + "]", order];
15415
+ var a, index;
15416
+ a = Blockly.Ruby.valueToCode(block, 'A', Blockly.Ruby.ORDER_FUNCTION_CALL) || '""';
15417
+ index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_INDEX) || '0';
15418
+ return ["" + a + "[" + index + "]", Blockly.Ruby.ORDER_FUNCTION_CALL];
15185
15419
  };
15186
15420
 
15187
15421
  Blockly.Blocks['operators_length'] = {
@@ -15216,8 +15450,8 @@ case end next return until\
15216
15450
  Blockly.Ruby['operators_modulo'] = function(block) {
15217
15451
  var a, b, order;
15218
15452
  order = Blockly.Ruby.ORDER_MULTIPLICATIVE;
15219
- a = Blockly.Ruby.valueToCode(block, 'A', order) || '5';
15220
- b = Blockly.Ruby.valueToCode(block, 'B', order) || '2';
15453
+ a = Blockly.Ruby.valueToCode(block, 'A', order) || '1';
15454
+ b = Blockly.Ruby.valueToCode(block, 'B', order) || '1';
15221
15455
  return ["" + a + " % " + b, order];
15222
15456
  };
15223
15457
 
@@ -15445,7 +15679,7 @@ case end next return until\
15445
15679
  init: function() {
15446
15680
  this.setHelpUrl('');
15447
15681
  this.setColour(200);
15448
- this.appendDummyInput().appendField(new Blockly.FieldVariable('car1'), 'CHAR').appendField('に触れた');
15682
+ this.appendDummyInput().appendField(new Smalruby.FieldCharacter(), 'CHAR').appendField('に触れた');
15449
15683
  this.setOutput(true, 'Boolean');
15450
15684
  return this.setTooltip('');
15451
15685
  }
@@ -15453,7 +15687,7 @@ case end next return until\
15453
15687
 
15454
15688
  Blockly.Ruby['sensing_hit'] = function(block) {
15455
15689
  var char;
15456
- char = Blockly.Ruby.variableDB_.getName(block.getFieldValue('CHAR'), Blockly.Variables.NAME_TYPE);
15690
+ char = this.getFieldValue('CHAR');
15457
15691
  return Blockly.Ruby.characterMethodCallInput_('hit?', char);
15458
15692
  };
15459
15693
 
@@ -15524,7 +15758,7 @@ case end next return until\
15524
15758
  dropdown = [['x座標', 'x'], ['y座標', 'y'], ['向き', 'angle'], ['コスチューム番号', 'costume_index'], ['コスチューム名', 'costume'], ['大きさ', 'scale'], ['ボリューム', 'volume']];
15525
15759
  this.setHelpUrl('');
15526
15760
  this.setColour(200);
15527
- this.appendDummyInput().appendField(new Blockly.FieldVariable('car1'), 'CHAR').appendField('の').appendField(new Blockly.FieldDropdown(dropdown), 'PROPERTY');
15761
+ this.appendDummyInput().appendField(new Smalruby.FieldCharacter(), 'CHAR').appendField('の').appendField(new Blockly.FieldDropdown(dropdown), 'PROPERTY');
15528
15762
  this.setOutput(true, ['Number', 'String']);
15529
15763
  return this.setTooltip('');
15530
15764
  }
@@ -15532,7 +15766,7 @@ case end next return until\
15532
15766
 
15533
15767
  Blockly.Ruby['sensing_character_property'] = function(block) {
15534
15768
  var c, char, property;
15535
- char = Blockly.Ruby.variableDB_.getName(block.getFieldValue('CHAR'), Blockly.Variables.NAME_TYPE);
15769
+ char = this.getFieldValue('CHAR');
15536
15770
  property = this.getFieldValue('PROPERTY');
15537
15771
  c = Smalruby.Collections.CharacterSet.findWhere({
15538
15772
  name: char
@@ -15696,6 +15930,7 @@ case end next return until\
15696
15930
 
15697
15931
 
15698
15932
 
15933
+
15699
15934
 
15700
15935
 
15701
15936
  ;