app/assets/javascripts/blocks/control.js.coffee.erb
# 「制御」ジャンル
<%
category = 'control'
require 'smalruby_editor'
require 'smalruby_editor/blockly_message_helper'
color = SmalrubyEditor::COLORS[category.to_sym]
%>
# ( )秒待つ
<% n = "#{category}_sleep" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.sleep') %>,
['SEC', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
arg = Blockly.Ruby.valueToCode(@, 'SEC', Blockly.Ruby.ORDER_FUNCTION_CALL) || '0'
"sleep(#{arg})\n"
# ずっと
<% n = "#{category}_loop" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput().appendField(<%= bm('.loop') %>)
@appendStatementInput('DO')
@appendDummyInput().appendField(<%= bm('.loop_end') %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
if Blockly.Ruby.r_() == 'main'
''
else
branch = Blockly.Ruby.statementToCode(block, 'DO') || '\n'
'loop do\n' + branch + 'end\n'
<%
%w(break next redo).each do |suffix|
n = "#{category}_#{suffix}"
%>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput().appendField(<%= bm(".#{suffix}") %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
if Blockly.Ruby.receiver() == 'main'
''
else
'<%= suffix %>\n'
<% end %>
# もし< >なら
<% n = "#{category}_if" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendValueInput('COND').setCheck('Boolean').appendField(<%= bm('.if') %>)
@appendDummyInput().appendField(<%= bm('.then') %>)
@appendStatementInput('THEN')
@setPreviousStatement(true)
@setNextStatement(true)
@setInputsInline(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
cond = Blockly.Ruby.valueToCode(block, 'COND', Blockly.Ruby.ORDER_CONDITIONAL) || 'false'
branch = Blockly.Ruby.statementToCode(block, 'THEN') || '\n'
'if ' + cond + '\n' + branch + 'end\n'
# もし< >なら~でなければ
<% n = "#{category}_if_else" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendValueInput('COND').setCheck('Boolean').appendField(<%= bm('.if') %>)
@appendDummyInput().appendField(<%= bm('.then') %>)
@appendStatementInput('THEN')
@appendDummyInput().appendField(<%= bm('.else') %>)
@appendStatementInput('ELSE')
@setPreviousStatement(true)
@setNextStatement(true)
@setInputsInline(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
cond = Blockly.Ruby.valueToCode(block, 'COND', Blockly.Ruby.ORDER_CONDITIONAL) || 'false'
branch0 = Blockly.Ruby.statementToCode(block, 'THEN') || '\n'
branch1 = Blockly.Ruby.statementToCode(block, 'ELSE') || '\n'
'if ' + cond + '\n' + branch0 + 'else\n' + branch1 + 'end\n'
# ( )回繰り返す
<% n = "#{category}_times" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.times') %>,
['COUNT', ['Number'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@appendStatementInput('DO')
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
count = Blockly.Ruby.valueToCode(@, 'COUNT', Blockly.Ruby.ORDER_STRING_CONVERSION) || 0
branch = Blockly.Ruby.statementToCode(block, 'DO') || '\n'
"#{count}.times do\n" + branch + 'end\n'
# < >まで待つ
<% n = "#{category}_await_until" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.await_until') %>,
['COND', ['Boolean'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
if Blockly.Ruby.receiver() == 'main'
''
else
await = Blockly.Ruby.characterMethodCallInput_('await')[0]
cond = Blockly.Ruby.valueToCode(@, 'COND', Blockly.Ruby.ORDER_CONDITIONAL) || 'true'
"#{await} until #{cond}\n"
# < >まで繰り返す
<% n = "#{category}_until" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@interpolateMsg(<%= bm('.until') %>,
['COND', ['Boolean'], Blockly.ALIGN_RIGHT],
Blockly.ALIGN_RIGHT)
@appendStatementInput('DO')
@appendDummyInput()
.appendField(<%= bm('.loop_end') %>)
.setAlign(Blockly.ALIGN_RIGHT)
@setInputsInline(true)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
cond = Blockly.Ruby.valueToCode(@, 'COND', Blockly.Ruby.ORDER_CONDITIONAL) || 'true'
branch = Blockly.Ruby.statementToCode(block, 'DO') || '\n'
"until #{cond}\n" + branch + 'end\n'
# ほんの少し待つ
<% n = "#{category}_await" %>
Blockly.Blocks['<%= n %>'] =
init: ()->
@setHelpUrl('')
@setColour(<%= color %>)
@appendDummyInput()
.appendField(<%= bm('.await') %>)
@setPreviousStatement(true)
@setNextStatement(true)
@setTooltip('')
Blockly.Ruby['<%= n %>'] = (block) ->
if Blockly.Ruby.receiver() == 'main'
''
else
Blockly.Ruby.characterMethodCall_('await')