smalruby/smalruby-editor

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

Summary

Maintainability
Test Coverage
# 「演算」ジャンル

<%
  category = 'operators'
  require 'smalruby_editor'
  require 'smalruby_editor/blockly_message_helper'
  color = SmalrubyEditor::COLORS[category.to_sym]
%>

# 変数:( ) + ( )
# 変数:( ) - ( )
# 変数:( ) * ( )
# 変数:( ) / ( )
<%
  [
    ['add', 'ADDITIVE', '+', '0', '0'],
    ['minus', 'ADDITIVE', '-', '0', '0'],
    ['multiply', 'MULTIPLICATIVE', '*', '0', '0'],
    ['divide', 'MULTIPLICATIVE', '/', '0', '1'],
  ].each do |suffix, order_suffix, operator, default_a, default_b|
    n = "#{category}_#{suffix}"
%>

Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm(".#{suffix}") %>,
                    ['A', null, Blockly.ALIGN_RIGHT],
                    ['B', null, Blockly.ALIGN_RIGHT],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, null)
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_<%= order_suffix %>
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '<%= default_a %>'
  b = Blockly.Ruby.valueToCode(block, 'B', order) || '<%= default_b %>'
  [a + ' <%= operator %> ' + b, order]
<% end %>

# 条件:( ) < ( )
# 条件:( ) <= ( )
# 条件:( ) = ( )
# 条件:( ) => ( )
# 条件:( ) > ( )
<%
  [
    ['compare_lt', '<', 'RELATIONAL'],
    ['compare_lte', '<=', 'RELATIONAL'],
    ['compare_eq', '==', 'EQUALS'],
    ['compare_gte', '>=', 'RELATIONAL'],
    ['compare_gt', '>', 'RELATIONAL'],
  ].each do |suffix, operator, order_suffix|
    n = "#{category}_#{suffix}"
%>

Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm(".#{suffix}") %>,
                     ['A', null, Blockly.ALIGN_RIGHT],
                     ['B', null, Blockly.ALIGN_RIGHT],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Boolean')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_<%= order_suffix %>;
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0'
  b = Blockly.Ruby.valueToCode(block, 'B', order) || '0'
  [a + ' <%= operator %> ' + b, order]
<% end %>

# 変数:( )から( )までの乱数
<% n = "#{category}_rand" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.rand')%>,
                     ['A', ['Number'], Blockly.ALIGN_RIGHT],
                     ['B', ['Number'], Blockly.ALIGN_RIGHT],
                     Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Number')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  a = Blockly.Ruby.valueToCode(block, 'A', Blockly.Ruby.ORDER_RANGE) || '0'
  b = Blockly.Ruby.valueToCode(block, 'B', Blockly.Ruby.ORDER_RANGE) || '0'
  ["rand(#{a}..#{b})", Blockly.Ruby.ORDER_FUNCTION_CALL]

# 条件:< > かつ < >
# 条件:< > または < >
<%
  [
    ['and', '&&'],
    ['or', '||'],
  ].each do |suffix, operator|
    n = "#{category}_#{suffix}"
%>

Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm(".#{suffix}") %>,
                     ['A', ['Boolean'], Blockly.ALIGN_RIGHT],
                     ['B', ['Boolean'], Blockly.ALIGN_RIGHT],
                     Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Boolean')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_LOGICAL_<%= suffix.upcase %>
  a = Blockly.Ruby.valueToCode(block, 'A', order) || 'true'
  b = Blockly.Ruby.valueToCode(block, 'B', order) || 'true'
  ["#{a} <%= operator %> #{b}", order]
<% end %>

# 条件:< > ではない
<% n = "#{category}_negate" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.not') %>,
                     ['A', ['Boolean'], Blockly.ALIGN_RIGHT],
                     Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Boolean')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_UNARY_SIGN
  a = Blockly.Ruby.valueToCode(block, 'A', order) || 'true'
  ["!#{a}", order]

# 変数:( )の( )番目
<% n = "#{category}_index_of" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.index_of') %>,
                    ['A', null, Blockly.ALIGN_RIGHT],
                    ['INDEX', ['Number'], Blockly.ALIGN_RIGHT],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, null)
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  a = Blockly.Ruby.valueToCode(block, 'A', Blockly.Ruby.ORDER_FUNCTION_CALL) || '""'
  index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_INDEX) || '0'
  ["#{a}[#{index}]", Blockly.Ruby.ORDER_FUNCTION_CALL]

# 変数:( )の長さ
<% n = "#{category}_length" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.length') %>,
                    ['A', null, Blockly.ALIGN_RIGHT],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, null)
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_FUNCTION_CALL
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '""'
  ["#{a}.length", order]

# 変数:( )を( )で割った余り
<% n = "#{category}_modulo" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.modulo') %>,
                    ['A', ['Number'], Blockly.ALIGN_RIGHT],
                    ['B', ['Number'], Blockly.ALIGN_RIGHT],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Number')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_MULTIPLICATIVE
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '1'
  b = Blockly.Ruby.valueToCode(block, 'B', order) || '1'
  ["#{a} % #{b}", order]

# 変数:( )を丸める
<% n = "#{category}_round" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.round') %>,
                    ['A', ['Number'], Blockly.ALIGN_RIGHT],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Number')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_FUNCTION_CALL
  a = Blockly.Ruby.valueToCode(block, 'A', order) || '0'
  ["#{a}.round", order]

# 変数:( )の[▼数学関数]
<% n = "#{category}_math_method" %>
Blockly.Blocks['<%= n %>'] =
  init: ()->
    dropdown = [
      [<%= bm('.math_method_abs') %>, '%num%.abs'],
      [<%= bm('.math_method_floor') %>, '%num%.floor'],
      [<%= bm('.math_method_ceil') %>, '%num%.ceil'],
      [<%= bm('.math_method_sqrt') %>, 'Math.sqrt(%num%)'],
      [<%= bm('.math_method_sin') %>, 'Math.sin(%num%)'],
      [<%= bm('.math_method_cos') %>, 'Math.cos(%num%)'],
      [<%= bm('.math_method_tan') %>, 'Math.tan(%num%)'],
      [<%= bm('.math_method_asin') %>, 'Math.asin(%num%)'],
      [<%= bm('.math_method_acos') %>, 'Math.acos(%num%)'],
      [<%= bm('.math_method_atan') %>, 'Math.atan(%num%)'],
      [<%= bm('.math_method_ln') %>, 'Math.log(%num%)'],
      [<%= bm('.math_method_log') %>, 'Math.log10(%num%)'],
      [<%= bm('.math_method_e_square') %>, 'Math::E ** %num%'],
      [<%= bm('.math_method_10_square') %>, '10 ** %num%'],
    ]

    @setHelpUrl('')
    @setColour(<%= color %>)
    @interpolateMsg(<%= bm('.math_method') %>,
                    ['NUM', ['Number'], Blockly.ALIGN_RIGHT],
                    ['METHOD', new Blockly.FieldDropdown(dropdown)],
                    Blockly.ALIGN_RIGHT)
    @setInputsInline(true)
    @setOutput(true, 'Number')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  order = Blockly.Ruby.ORDER_FUNCTION_CALL
  method = @getFieldValue('METHOD')
  num = Blockly.Ruby.valueToCode(block, 'NUM', order) || '0'
  [method.replace(/%num%/, num), order]

# 条件:真
# 条件:偽
<%
  %w(true false).each do |val|
    n = "#{category}_#{val}"
%>

Blockly.Blocks['<%= n %>'] =
  init: ()->
    @setHelpUrl('')
    @setColour(<%= color %>)
    @appendDummyInput()
      .appendField(<%= bm(".#{val}")%>)
    @setInputsInline(true)
    @setOutput(true, 'Boolean')
    @setTooltip('')

Blockly.Ruby['<%= n %>'] = (block) ->
  ['<%= val %>', Blockly.Ruby.ORDER_ATOMIC]
<% end %>