app/assets/javascripts/blocks/operators.js.coffee.erb
# 「演算」ジャンル
<%
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 %>