smalruby/smalruby-editor

View on GitHub
app/assets/javascripts/blocks/control.js.coffee.erb

Summary

Maintainability
Test Coverage
# 「制御」ジャンル

<%
  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')