smalruby-editor 0.1.6-x86-mingw32 → 0.1.7-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 (98) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/blocks/hardware.js.coffee.erb +40 -3
  3. data/app/assets/stylesheets/toolbox.css.scss.erb +1 -6
  4. data/app/controllers/source_codes_controller.rb +5 -1
  5. data/app/models/concerns/ruby_to_block/block/base.rb +251 -0
  6. data/app/models/concerns/ruby_to_block/block/character.rb +42 -0
  7. data/app/models/concerns/ruby_to_block/block/character_event.rb +27 -0
  8. data/app/models/concerns/ruby_to_block/block/character_method_call.rb +29 -0
  9. data/app/models/concerns/ruby_to_block/block/character_new.rb +7 -0
  10. data/app/models/concerns/ruby_to_block/block/character_operation.rb +80 -0
  11. data/app/models/concerns/ruby_to_block/block/control_if.rb +45 -0
  12. data/app/models/concerns/ruby_to_block/block/control_loop.rb +19 -0
  13. data/app/models/concerns/ruby_to_block/block/control_sleep.rb +18 -0
  14. data/app/models/concerns/ruby_to_block/block/do.rb +24 -0
  15. data/app/models/concerns/ruby_to_block/block/else.rb +12 -0
  16. data/app/models/concerns/ruby_to_block/block/end.rb +26 -0
  17. data/app/models/concerns/ruby_to_block/block/events_on_click.rb +14 -0
  18. data/app/models/concerns/ruby_to_block/block/events_on_key_push_or_down.rb +17 -0
  19. data/app/models/concerns/ruby_to_block/block/events_on_start.rb +14 -0
  20. data/app/models/concerns/ruby_to_block/block/hardware_init_hardware.rb +14 -0
  21. data/app/models/concerns/ruby_to_block/block/hardware_led_off.rb +16 -0
  22. data/app/models/concerns/ruby_to_block/block/hardware_led_on.rb +16 -0
  23. data/app/models/concerns/ruby_to_block/block/hardware_on_sensor_change.rb +17 -0
  24. data/app/models/concerns/ruby_to_block/block/hardware_rgb_led_off.rb +18 -0
  25. data/app/models/concerns/ruby_to_block/block/hardware_rgb_led_on.rb +23 -0
  26. data/app/models/concerns/ruby_to_block/block/hardware_sensor_value.rb +23 -0
  27. data/app/models/concerns/ruby_to_block/block/hardware_two_wheel_drive_car.rb +26 -0
  28. data/app/models/concerns/ruby_to_block/block/looks_hide.rb +8 -0
  29. data/app/models/concerns/ruby_to_block/block/looks_say.rb +20 -0
  30. data/app/models/concerns/ruby_to_block/block/looks_show.rb +8 -0
  31. data/app/models/concerns/ruby_to_block/block/looks_vanish.rb +8 -0
  32. data/app/models/concerns/ruby_to_block/block/math_number.rb +14 -0
  33. data/app/models/concerns/ruby_to_block/block/motion_change_x_by.rb +20 -0
  34. data/app/models/concerns/ruby_to_block/block/motion_change_y_by.rb +20 -0
  35. data/app/models/concerns/ruby_to_block/block/motion_move.rb +15 -0
  36. data/app/models/concerns/ruby_to_block/block/motion_point_towards_character.rb +24 -0
  37. data/app/models/concerns/ruby_to_block/block/motion_point_towards_mouse.rb +9 -0
  38. data/app/models/concerns/ruby_to_block/block/motion_reach_wall.rb +24 -0
  39. data/app/models/concerns/ruby_to_block/block/motion_rotate_left.rb +20 -0
  40. data/app/models/concerns/ruby_to_block/block/motion_rotate_right.rb +20 -0
  41. data/app/models/concerns/ruby_to_block/block/motion_self_angle.rb +23 -0
  42. data/app/models/concerns/ruby_to_block/block/motion_self_x.rb +23 -0
  43. data/app/models/concerns/ruby_to_block/block/motion_self_y.rb +23 -0
  44. data/app/models/concerns/ruby_to_block/block/motion_set_angle.rb +15 -0
  45. data/app/models/concerns/ruby_to_block/block/motion_set_x.rb +38 -0
  46. data/app/models/concerns/ruby_to_block/block/motion_set_y.rb +15 -0
  47. data/app/models/concerns/ruby_to_block/block/motion_turn.rb +8 -0
  48. data/app/models/concerns/ruby_to_block/block/motion_turn_if_reach_wall.rb +8 -0
  49. data/app/models/concerns/ruby_to_block/block/null.rb +17 -0
  50. data/app/models/concerns/ruby_to_block/block/operators_compare.rb +36 -0
  51. data/app/models/concerns/ruby_to_block/block/operators_false.rb +8 -0
  52. data/app/models/concerns/ruby_to_block/block/operators_true.rb +8 -0
  53. data/app/models/concerns/ruby_to_block/block/require_smalruby.rb +7 -0
  54. data/app/models/concerns/ruby_to_block/block/ruby_comment.rb +16 -0
  55. data/app/models/concerns/ruby_to_block/block/ruby_expression.rb +14 -0
  56. data/app/models/concerns/ruby_to_block/block/ruby_statement.rb +23 -0
  57. data/app/models/concerns/ruby_to_block/block/sensing_hit.rb +23 -0
  58. data/app/models/concerns/ruby_to_block/block/sound_play.rb +15 -0
  59. data/app/models/concerns/ruby_to_block/block/sound_preset_sounds.rb +31 -0
  60. data/app/models/concerns/ruby_to_block/block/text.rb +15 -0
  61. data/app/models/concerns/ruby_to_block/block/value.rb +12 -0
  62. data/app/models/concerns/ruby_to_block/block.rb +97 -0
  63. data/app/models/concerns/ruby_to_block/context.rb +97 -0
  64. data/app/models/concerns/ruby_to_block/formatter.rb +26 -0
  65. data/app/models/concerns/ruby_to_block.rb +17 -360
  66. data/app/models/source_code.rb +3 -1
  67. data/app/views/editor/_toolbox.html.haml +16 -0
  68. data/lib/smalruby_editor/version.rb +3 -3
  69. data/public/assets/{application-64a390efe879c386a5950515064f062d.css → application-28b7bed56c5389dfa372e972c75b6676.css} +17 -10
  70. data/public/assets/application-28b7bed56c5389dfa372e972c75b6676.css.gz +0 -0
  71. data/public/assets/{application-8bfffad1222d4e198f3c7ccc1cbd774f.js → application-4f747690ebc8ec4815ae36021fdb2c44.js} +135 -0
  72. data/public/assets/{application-8bfffad1222d4e198f3c7ccc1cbd774f.js.gz → application-4f747690ebc8ec4815ae36021fdb2c44.js.gz} +0 -0
  73. data/public/assets/manifest-332a5a1668194028b55103e0ea45c054.json +1 -1
  74. data/smalruby-editor.gemspec +1 -1
  75. data/spec/acceptance/block_mode/blocks/hardware/two_wheel_drive_car.feature +69 -0
  76. data/spec/acceptance/ruby_mode/translate.feature +1 -1
  77. data/spec/controllers/source_codes_controller_spec.rb +14 -11
  78. data/spec/models/concerns/ruby_to_block/block/character_method_call_spec.rb +175 -0
  79. data/spec/models/concerns/ruby_to_block/block/control_if_spec.rb +75 -0
  80. data/spec/models/concerns/ruby_to_block/block/control_loop_spec.rb +68 -0
  81. data/spec/models/concerns/ruby_to_block/block/events_on_start_spec.rb +120 -0
  82. data/spec/models/concerns/ruby_to_block/block/hardware_spec.rb +120 -0
  83. data/spec/models/concerns/ruby_to_block/block/looks_say_spec.rb +79 -0
  84. data/spec/models/concerns/ruby_to_block/block/looks_spec.rb +74 -0
  85. data/spec/models/concerns/ruby_to_block/block/motion_move_spec.rb +63 -0
  86. data/spec/models/concerns/ruby_to_block/block/motion_reach_wall_spec.rb +67 -0
  87. data/spec/models/concerns/ruby_to_block/block/motion_spec.rb +392 -0
  88. data/spec/models/concerns/ruby_to_block/block/motion_turn_spec.rb +54 -0
  89. data/spec/models/concerns/ruby_to_block/block/require_smalruby_spec.rb +39 -0
  90. data/spec/models/concerns/ruby_to_block/block/ruby_comment_spec.rb +55 -0
  91. data/spec/models/concerns/ruby_to_block/block/ruby_statement_spec.rb +113 -0
  92. data/spec/models/concerns/ruby_to_block/block/shared/block_examples.rb +44 -0
  93. data/spec/models/concerns/ruby_to_block/block/sound_spec.rb +46 -0
  94. data/spec/models/concerns/ruby_to_block/block_spec.rb +49 -0
  95. data/spec/models/concerns/ruby_to_block_spec.rb +421 -217
  96. data/spec/support/ruby_to_block.rb +10 -0
  97. metadata +108 -10
  98. data/public/assets/application-64a390efe879c386a5950515064f062d.css.gz +0 -0
@@ -0,0 +1,8 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class OperatorsTrue < Value
5
+ blocknize '^\s*true\s*$', value: true
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ module RubyToBlock
2
+ module Block
3
+ class RequireSmalruby < Base
4
+ blocknize '^\s*require\s*"smalruby"\s*$', statement: true
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class RubyComment < Base
5
+ blocknize '^\s*\#\ (.*)$', statement: true
6
+
7
+ def self.process_match_data(md, context)
8
+ md2 = regexp.match(md[type])
9
+ block = new(fields: { COMMENT: md2[1] })
10
+ context.add_block(block)
11
+
12
+ true
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,14 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class RubyExpression < Value
5
+ blocknize '^.*$', value: true, priority: -Float::INFINITY
6
+
7
+ def self.process_match_data(md, context)
8
+ context.add_value(new(fields: { EXP: md.string }))
9
+
10
+ true
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module RubyToBlock
2
+ module Block
3
+ class RubyStatement < Base
4
+ blocknize '^.*$', statement: true, priority: -Float::INFINITY
5
+
6
+ def self.process_match_data(md, context)
7
+ block = new(fields: { STATEMENT: md.string })
8
+ context.add_block(block)
9
+
10
+ true
11
+ end
12
+
13
+ private
14
+
15
+ def fields_to_xml(e)
16
+ @fields[:STATEMENT] =
17
+ @fields[:STATEMENT].sub(/^ {0,#{indent_level * 2}}/, '')
18
+
19
+ super
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,23 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class SensingHit < Value
5
+ blocknize '^\s*hit\?\(([^)]+)\)\s*$', value: true
6
+
7
+ def self.process_match_data(md, context)
8
+ return false unless context.receiver
9
+
10
+ md2 = regexp.match(md[type])
11
+ name = md2[1]
12
+ name.strip!
13
+ c = context.characters[name]
14
+
15
+ return false unless c
16
+
17
+ context.add_value(new(fields: { CHAR: name }))
18
+
19
+ true
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class SoundPlay < CharacterMethodCall
5
+ blocknize '^\s*' + CHAR_RE + 'play\(name:\s*(.+)\)\s*$',
6
+ statement: true, inline: true
7
+
8
+ def self.process_match_data(md, context)
9
+ md2 = regexp.match(md[type])
10
+ add_character_method_call_block(context, md2[1], new, NAME: md2[2])
11
+ true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class SoundPresetSounds < Value
5
+ blocknize '^\s*"([^"]*?\.wav)"\s*$', value: true, priority: 1
6
+
7
+ # TODO: 自動生成する
8
+ SOUNDS = %w(
9
+ piano_do.wav
10
+ piano_re.wav
11
+ piano_mi.wav
12
+ piano_fa.wav
13
+ piano_so.wav
14
+ piano_ra.wav
15
+ piano_si.wav
16
+ piano_do_2.wav
17
+ )
18
+
19
+ def self.process_match_data(md, context)
20
+ md2 = regexp.match(md[type])
21
+ if SOUNDS.include?(md2[1])
22
+ context.add_value(new(fields: { NAME: md2[1] }))
23
+ else
24
+ context.add_value(Text.new(fields: { TEXT: md2[1] }))
25
+ end
26
+
27
+ true
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,15 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class Text < Value
5
+ blocknize '^\s*"([^"]*)"\s*$', value: true
6
+
7
+ def self.process_match_data(md, context)
8
+ md2 = regexp.match(md[type])
9
+ context.add_value(new(fields: { TEXT: md2[1] }))
10
+
11
+ true
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,12 @@
1
+ # -*- coding: utf-8 -*-
2
+ module RubyToBlock
3
+ module Block
4
+ class Value < Base
5
+ def self.process_match_data(md, context)
6
+ context.add_value(new)
7
+
8
+ true
9
+ end
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,97 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module RubyToBlock
4
+ # ブロック群を表現するモジュール
5
+ module Block
6
+ @blocks = {}
7
+
8
+ # ブロックのインスタンスを生成する
9
+ def self.new(type, *args)
10
+ @blocks[type].new(*args)
11
+ end
12
+
13
+ # ステートメントを表現するブロックの正規表現を返す
14
+ def self.statement_regexp
15
+ @statement_regexp ||= make_regexp(:statement?)
16
+ end
17
+
18
+ # 値を表現するブロックの正規表現を返す
19
+ def self.value_regexp
20
+ @value_regexp ||= make_regexp(:value?)
21
+ end
22
+
23
+ # ブロックを登録する
24
+ def self.register(klass)
25
+ @blocks[klass.type] = klass
26
+ end
27
+
28
+ # ブロックの正規表現を返す
29
+ def self.regexp(type)
30
+ @blocks[type.to_s].regexp
31
+ end
32
+
33
+ # MatchDataを処理する
34
+ def self.process_match_data(md, context, type = nil)
35
+ type = md.names.find { |n| md[n.to_sym] } unless type
36
+ @blocks[type].process_match_data(md, context)
37
+ rescue
38
+ false
39
+ end
40
+
41
+ # elseを処理する
42
+ def self.process_else(context)
43
+ st = context.statement
44
+ @blocks[st.first].process_else(context)
45
+ rescue
46
+ false
47
+ end
48
+
49
+ # endを処理する
50
+ def self.process_end(context)
51
+ st = context.statement
52
+ @blocks[st.first].process_end(context)
53
+ rescue
54
+ false
55
+ end
56
+
57
+ # ブロックを表現するクラスを返す
58
+ def self.[](type)
59
+ @blocks[type.to_s]
60
+ end
61
+
62
+ def self.make_regexp(method_symbol)
63
+ regexps = @blocks.values.select(&method_symbol).sort_by(&:priority)
64
+ .reverse.map { |klass|
65
+ "(?<#{klass.type}>#{klass.regexp_string})"
66
+ }
67
+ Regexp.new(regexps.join('|'), 'x')
68
+ end
69
+ private_class_method :make_regexp
70
+ end
71
+ end
72
+
73
+ preloads = %w(
74
+ base
75
+ value
76
+ character_operation
77
+ character_method_call
78
+ character_event
79
+ ).map { |s|
80
+ "#{s}.rb"
81
+ }
82
+ preloads.each do |preload|
83
+ path = Pathname(__FILE__).dirname.join('block', preload)
84
+ silence_warnings do
85
+ load path.expand_path
86
+ end
87
+ end
88
+
89
+ block_pattern = Pathname(__FILE__).dirname.join('block', '*.rb')
90
+ block_files = Pathname.glob(block_pattern)
91
+ block_files.each do |path|
92
+ next if preloads.include?(path.basename)
93
+
94
+ silence_warnings do
95
+ load path.expand_path
96
+ end
97
+ end
@@ -0,0 +1,97 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module RubyToBlock
4
+ # ソースコード解析の状態を表現するクラス
5
+ class Context
6
+ attr_accessor :current_line
7
+ attr_accessor :lines
8
+ attr_accessor :characters
9
+ attr_accessor :character_stack
10
+ attr_accessor :receiver_stack
11
+ attr_accessor :statement_stack
12
+ attr_accessor :value_name_stack
13
+ attr_accessor :blocks
14
+ attr_accessor :current_block
15
+
16
+ def initialize(lines)
17
+ @lines = lines
18
+ @characters = {}
19
+ @character_stack = []
20
+ @receiver_stack = []
21
+ @statement_stack = []
22
+ @value_name_stack = []
23
+ @blocks = []
24
+ @current_block = nil
25
+ end
26
+
27
+ # 次の行に移動して、改行を含むその行の文字列を返す
28
+ #
29
+ # @return [String] 改行を含む次の行の文字列
30
+ def next_line
31
+ self.current_line = lines.shift
32
+ end
33
+
34
+ # 次の行を参照する
35
+ #
36
+ # @return [String] 次の行の文字列
37
+ def look_next_line
38
+ lines.first
39
+ end
40
+
41
+ def add_block(block)
42
+ if current_block
43
+ # HACK: コメントは下の行に関係することが多いため対象外としている
44
+ if current_block.type == 'character_new' &&
45
+ block.type != 'character_new' && block.type != 'ruby_comment'
46
+ current_block.add_statement(:DO, block)
47
+ block = current_block
48
+ else
49
+ current_block.sibling = block
50
+ end
51
+ else
52
+ blocks.push(block)
53
+ end
54
+ self.current_block = block
55
+ self
56
+ end
57
+
58
+ def add_value(block)
59
+ fail unless current_block || value_name
60
+
61
+ current_block.add_value(value_name, block)
62
+ self
63
+ end
64
+
65
+ def [](symbol)
66
+ send(symbol)
67
+ end
68
+
69
+ def []=(symbol, val)
70
+ send("#{symbol}=", val)
71
+ end
72
+
73
+ def receiver
74
+ @receiver_stack.last
75
+ end
76
+
77
+ def character
78
+ @character_stack.last
79
+ end
80
+
81
+ def statement
82
+ @statement_stack.last
83
+ end
84
+
85
+ def statement_type
86
+ statement.first
87
+ end
88
+
89
+ def statement_block
90
+ statement[1]
91
+ end
92
+
93
+ def value_name
94
+ @value_name_stack.last
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,26 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ module RubyToBlock
4
+ # XMLをフォーマットするクラス
5
+ #
6
+ # REXML::Formatters::Prettyでは行頭、行末などのスペースが1つになって
7
+ # しまうため、このクラスではそれらを修正している
8
+ class Formatter < REXML::Formatters::Pretty
9
+ def initialize
10
+ super(2, true)
11
+ self.compact = true
12
+ end
13
+
14
+ def write_text(node, output)
15
+ s = node.to_s
16
+ s.gsub!(/\s/, ' ')
17
+ if !node.is_a?(REXML::Text) ||
18
+ node.is_a?(REXML::Text) && !node.parent.whitespace
19
+ s.squeeze!(' ')
20
+ end
21
+ s = wrap(s, @width - @level)
22
+ s = indent_text(s, @level, ' ', true)
23
+ output << (' ' * @level + s)
24
+ end
25
+ end
26
+ end