Skip to content

Commit e316a49

Browse files
author
t-kazu
committed
Operatorの命令ブロックをRubyに変換できるようにしました
1 parent e7ebf8a commit e316a49

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed

src/lib/ruby-generator/index.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import LooksBlocks from './looks.js';
88
import SoundBlocks from './sound.js';
99
import EventBlocks from './event.js';
1010
import ControlBlocks from './control.js';
11+
import OperatorsBlocks from './operators.js';
1112

1213
/**
1314
* Define Ruby
@@ -390,6 +391,7 @@ export default function (Blockly) {
390391
Blockly = SoundBlocks(Blockly);
391392
Blockly = EventBlocks(Blockly);
392393
Blockly = ControlBlocks(Blockly);
394+
Blockly = OperatorsBlocks(Blockly);
393395

394396
return Blockly;
395397
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
/**
2+
* Define Ruby with Operators Blocks
3+
* @param {Blockly} Blockly The ScratchBlocks
4+
* @return {Blockly} Blockly defined Ruby generator.
5+
*/
6+
export default function (Blockly) {
7+
Blockly.Ruby.operator_add = function (block) {
8+
const num1 = Blockly.Ruby.valueToCode(block, 'NUM1', Blockly.Ruby.ORDER_NONE) || '0';
9+
const num2 = Blockly.Ruby.valueToCode(block, 'NUM2', Blockly.Ruby.ORDER_NONE) || '0';
10+
return [`${num1} + ${num2}`, Blockly.Ruby.ORDER_ATOMIC];
11+
};
12+
13+
Blockly.Ruby.operator_subtract = function (block) {
14+
const num1 = Blockly.Ruby.valueToCode(block, 'NUM1', Blockly.Ruby.ORDER_NONE) || '0';
15+
const num2 = Blockly.Ruby.valueToCode(block, 'NUM2', Blockly.Ruby.ORDER_NONE) || '0';
16+
return [`${num1} - ${num2}`, Blockly.Ruby.ORDER_ATOMIC];
17+
};
18+
19+
Blockly.Ruby.operator_multiply = function (block) {
20+
const num1 = Blockly.Ruby.valueToCode(block, 'NUM1', Blockly.Ruby.ORDER_NONE) || '0';
21+
const num2 = Blockly.Ruby.valueToCode(block, 'NUM2', Blockly.Ruby.ORDER_NONE) || '0';
22+
return [`${num1} * ${num2}`, Blockly.Ruby.ORDER_ATOMIC];
23+
};
24+
25+
Blockly.Ruby.operator_divide = function (block) {
26+
const num1 = Blockly.Ruby.valueToCode(block, 'NUM1', Blockly.Ruby.ORDER_NONE) || '0';
27+
const num2 = Blockly.Ruby.valueToCode(block, 'NUM2', Blockly.Ruby.ORDER_NONE) || '1';
28+
return [`${num1} / ${num2}`, Blockly.Ruby.ORDER_ATOMIC];
29+
};
30+
31+
Blockly.Ruby.operator_random = function (block) {
32+
const fromNum = Blockly.Ruby.valueToCode(block, 'FROM', Blockly.Ruby.ORDER_NONE) || '0';
33+
const toNum = Blockly.Ruby.valueToCode(block, 'TO', Blockly.Ruby.ORDER_NONE) || '0';
34+
return [`rand(${fromNum}..${toNum})`, Blockly.Ruby.ORDER_ATOMIC];
35+
};
36+
37+
Blockly.Ruby.operator_gt = function (block) {
38+
const operand1 = Blockly.Ruby.valueToCode(block, 'OPERAND1', Blockly.Ruby.ORDER_NONE) || '0';
39+
const operand2 = Blockly.Ruby.valueToCode(block, 'OPERAND2', Blockly.Ruby.ORDER_NONE) || '0';
40+
return [`Cast.compare(${operand1}, ${operand2}) > 0`, Blockly.Ruby.ORDER_ATOMIC];
41+
};
42+
43+
Blockly.Ruby.operator_lt = function (block) {
44+
const operand1 = Blockly.Ruby.valueToCode(block, 'OPERAND1', Blockly.Ruby.ORDER_NONE) || '0';
45+
const operand2 = Blockly.Ruby.valueToCode(block, 'OPERAND2', Blockly.Ruby.ORDER_NONE) || '0';
46+
return [`Cast.compare(${operand1}, ${operand2}) < 0`, Blockly.Ruby.ORDER_ATOMIC];
47+
};
48+
49+
Blockly.Ruby.operator_equals = function (block) {
50+
const operand1 = Blockly.Ruby.valueToCode(block, 'OPERAND1', Blockly.Ruby.ORDER_NONE) || '0';
51+
const operand2 = Blockly.Ruby.valueToCode(block, 'OPERAND2', Blockly.Ruby.ORDER_NONE) || '0';
52+
return [`Cast.compare(${operand1}, ${operand2}) == 0`, Blockly.Ruby.ORDER_ATOMIC];
53+
};
54+
55+
Blockly.Ruby.operator_and = function (block) {
56+
const operand1 = Blockly.Ruby.valueToCode(block, 'OPERAND1', Blockly.Ruby.ORDER_NONE) || 'false';
57+
const operand2 = Blockly.Ruby.valueToCode(block, 'OPERAND2', Blockly.Ruby.ORDER_NONE) || 'false';
58+
return [`${operand1} && ${operand2}`, Blockly.Ruby.ORDER_ATOMIC];
59+
};
60+
61+
Blockly.Ruby.operator_or = function (block) {
62+
const operand1 = Blockly.Ruby.valueToCode(block, 'OPERAND1', Blockly.Ruby.ORDER_NONE) || 'false';
63+
const operand2 = Blockly.Ruby.valueToCode(block, 'OPERAND2', Blockly.Ruby.ORDER_NONE) || 'false';
64+
return [`${operand1} || ${operand2}`, Blockly.Ruby.ORDER_ATOMIC];
65+
};
66+
67+
Blockly.Ruby.operator_not = function (block) {
68+
const operand = Blockly.Ruby.valueToCode(block, 'OPERAND', Blockly.Ruby.ORDER_NONE) || 'false';
69+
return [`!${operand}`, Blockly.Ruby.ORDER_ATOMIC];
70+
};
71+
72+
Blockly.Ruby.operator_join = function (block) {
73+
const rightStr = Blockly.Ruby.valueToCode(block, 'STRING1', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
74+
const leftStr = Blockly.Ruby.valueToCode(block, 'STRING2', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
75+
return [`${rightStr} + ${leftStr}`, Blockly.Ruby.ORDER_ATOMIC];
76+
};
77+
78+
Blockly.Ruby.operator_letter_of = function (block) {
79+
const str = Blockly.Ruby.valueToCode(block, 'STRING', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
80+
const letter = Blockly.Ruby.valueToCode(block, 'LETTER', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
81+
return [`${str}[${letter}]`, Blockly.Ruby.ORDER_ATOMIC];
82+
};
83+
84+
Blockly.Ruby.operator_length = function (block) {
85+
const str = Blockly.Ruby.valueToCode(block, 'STRING', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
86+
return [`${str}.length`, Blockly.Ruby.ORDER_ATOMIC];
87+
};
88+
89+
Blockly.Ruby.operator_contains = function (block) {
90+
const str1 = Blockly.Ruby.valueToCode(block, 'STRING1', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
91+
const str2 = Blockly.Ruby.valueToCode(block, 'STRING2', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
92+
return [`${str1}.include?(${str2})`, Blockly.Ruby.ORDER_ATOMIC];
93+
};
94+
95+
Blockly.Ruby.operator_mod = function (block) {
96+
const num1 = Blockly.Ruby.valueToCode(block, 'NUM1', Blockly.Ruby.ORDER_NONE) || '0';
97+
const num2 = Blockly.Ruby.valueToCode(block, 'NUM2', Blockly.Ruby.ORDER_NONE) || '0';
98+
return [`${num1} % ${num2}`, Blockly.Ruby.ORDER_ATOMIC];
99+
};
100+
101+
Blockly.Ruby.operator_round = function (block) {
102+
const num = Blockly.Ruby.valueToCode(block, 'NUM', Blockly.Ruby.ORDER_NONE) || '0';
103+
return [`${num}.round`, Blockly.Ruby.ORDER_ATOMIC];
104+
};
105+
106+
Blockly.Ruby.operator_mathop = function (block) {
107+
const num = Blockly.Ruby.valueToCode(block, 'NUM', Blockly.Ruby.ORDER_NONE) || Blockly.Ruby.quote_('');
108+
const operator = block.getFieldValue('OPERATOR') || null;
109+
switch (operator) {
110+
case 'abs':
111+
return [`${num}.abs`, Blockly.Ruby.ORDER_ATOMIC];
112+
case 'floor':
113+
return [`${num}.floor`, Blockly.Ruby.ORDER_ATOMIC];
114+
case 'ceiling':
115+
return [`${num}.ceil`, Blockly.Ruby.ORDER_ATOMIC];
116+
case 'sqrt':
117+
return [`Math.sqrt(${num})`, Blockly.Ruby.ORDER_ATOMIC];
118+
case 'sin':
119+
return [`Math.sin(${num})`, Blockly.Ruby.ORDER_ATOMIC];
120+
case 'cos':
121+
return [`Math.cos(${num})`, Blockly.Ruby.ORDER_ATOMIC];
122+
case 'tan':
123+
return [`Math.tan(${num})`, Blockly.Ruby.ORDER_ATOMIC];
124+
case 'asin':
125+
return [`Math.asin(${num})`, Blockly.Ruby.ORDER_ATOMIC];
126+
case 'acos':
127+
return [`Math.acos(${num})`, Blockly.Ruby.ORDER_ATOMIC];
128+
case 'atan':
129+
return [`Math.atan(${num})`, Blockly.Ruby.ORDER_ATOMIC];
130+
case 'ln':
131+
return [`Math.log(${num})`, Blockly.Ruby.ORDER_ATOMIC];
132+
case 'log':
133+
return [`Math.log10(${num})`, Blockly.Ruby.ORDER_ATOMIC];
134+
case 'e ^':
135+
return [`Math::E**${num}`, Blockly.Ruby.ORDER_ATOMIC];
136+
case '10 ^':
137+
return [`10**${num}`, Blockly.Ruby.ORDER_ATOMIC];
138+
default:
139+
return [null, Blockly.Ruby.ORDER_ATOMIC];
140+
}
141+
};
142+
143+
return Blockly;
144+
}

0 commit comments

Comments
 (0)