Skip to content

Commit 7746135

Browse files
authored
Merge pull request #74 from t-kazu/feature/rubygenerator-for-data-blocks
Dataの命令ブロックをRubyに変換できるようにしました
2 parents dec2fd5 + 5609d03 commit 7746135

File tree

2 files changed

+123
-0
lines changed

2 files changed

+123
-0
lines changed

src/lib/ruby-generator/data.js

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* Define Ruby with Data Blocks
3+
* @param {Blockly} Blockly The ScratchBlocks
4+
* @return {Blockly} Blockly defined Ruby generator.
5+
*/
6+
export default function (Blockly) {
7+
Blockly.Ruby.data_variable = function (block) {
8+
const variable = Blockly.Ruby.variableName(block.getFieldValue('VARIABLE'));
9+
return [variable, Blockly.Ruby.ORDER_ATOMIC];
10+
};
11+
12+
Blockly.Ruby.data_setvariableto = function (block) {
13+
const variable = Blockly.Ruby.variableName(block.getFieldValue('VARIABLE'));
14+
const value = Blockly.Ruby.valueToCode(block, 'VALUE', Blockly.Ruby.ORDER_NONE) || '0';
15+
return `${variable} = ${value}\n`;
16+
};
17+
18+
Blockly.Ruby.data_changevariableby = function (block) {
19+
const variable = Blockly.Ruby.variableName(block.getFieldValue('VARIABLE'));
20+
const value = Blockly.Ruby.valueToCode(block, 'VALUE', Blockly.Ruby.ORDER_NONE) || 0;
21+
return `${variable} += ${value}\n`;
22+
};
23+
24+
Blockly.Ruby.data_showvariable = function (block) {
25+
const variable = Blockly.Ruby.variableName(block.getFieldValue('VARIABLE'));
26+
return `show_variable(${Blockly.Ruby.quote_(variable)})\n`;
27+
};
28+
29+
Blockly.Ruby.data_hidevariable = function (block) {
30+
const variable = Blockly.Ruby.variableName(block.getFieldValue('VARIABLE'));
31+
return `hide_variable(${Blockly.Ruby.quote_(variable)})\n`;
32+
};
33+
34+
Blockly.Ruby.data_listcontents = function (block) {
35+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
36+
return [list, Blockly.Ruby.ORDER_COLLECTION];
37+
};
38+
39+
Blockly.Ruby.data_addtolist = function (block) {
40+
const item = Blockly.Ruby.valueToCode(block, 'ITEM', Blockly.Ruby.ORDER_NONE) || '0';
41+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
42+
return `${list}.push(${item})\n`;
43+
};
44+
45+
Blockly.Ruby.data_deleteoflist = function (block) {
46+
const index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_NONE) - 1 || 0;
47+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
48+
return `${list}.delete_at(${index})\n`;
49+
};
50+
51+
Blockly.Ruby.data_deletealloflist = function (block) {
52+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
53+
return `${list}.clear\n`;
54+
};
55+
56+
Blockly.Ruby.data_insertatlist = function (block) {
57+
const index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_NONE) - 1 || 0;
58+
const item = Blockly.Ruby.valueToCode(block, 'ITEM', Blockly.Ruby.ORDER_NONE) || '0';
59+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
60+
return `${list}.insert(${index}, ${item})\n`;
61+
};
62+
63+
Blockly.Ruby.data_replaceitemoflist = function (block) {
64+
const index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_INDEX) - 1 || 0;
65+
const item = Blockly.Ruby.valueToCode(block, 'ITEM', Blockly.Ruby.ORDER_NONE) || '0';
66+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
67+
return `${list}[${index}] = ${item}\n`;
68+
};
69+
70+
Blockly.Ruby.data_itemoflist = function (block) {
71+
const index = Blockly.Ruby.valueToCode(block, 'INDEX', Blockly.Ruby.ORDER_INDEX) - 1 || 0;
72+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
73+
return [`${list}[${index}]`, Blockly.Ruby.ORDER_FUNCTION_CAL];
74+
};
75+
76+
Blockly.Ruby.data_itemnumoflist = function (block) {
77+
const item = Blockly.Ruby.valueToCode(block, 'ITEM', Blockly.Ruby.ORDER_NONE) || '0';
78+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
79+
return [`${list}.index(${item})`, Blockly.Ruby.ORDER_FUNCTION_CAL];
80+
};
81+
82+
Blockly.Ruby.data_lengthoflist = function (block) {
83+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
84+
return [`${list}.length`, Blockly.Ruby.ORDER_FUNCTION_CAL];
85+
};
86+
87+
Blockly.Ruby.data_listcontainsitem = function (block) {
88+
const order = Blockly.Ruby.ORDER_FUNCTION_CALL;
89+
const item = Blockly.Ruby.valueToCode(block, 'ITEM', order) || '0';
90+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
91+
return [`${list}.include?(${item})`, order];
92+
};
93+
94+
Blockly.Ruby.data_showlist = function (block) {
95+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
96+
return `show_list(${Blockly.Ruby.quote_(list)})\n`;
97+
};
98+
99+
Blockly.Ruby.data_hidelist = function (block) {
100+
const list = Blockly.Ruby.listName(block.getFieldValue('LIST'));
101+
return `hide_list(${Blockly.Ruby.quote_(list)})\n`;
102+
};
103+
104+
return Blockly;
105+
}

src/lib/ruby-generator/index.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import SoundBlocks from './sound.js';
99
import EventBlocks from './event.js';
1010
import ControlBlocks from './control.js';
1111
import OperatorsBlocks from './operators.js';
12+
import DataBlocks from './data.js';
1213

1314
/**
1415
* Define Ruby
@@ -344,6 +345,22 @@ export default function (Blockly) {
344345
return null;
345346
};
346347

348+
Blockly.Ruby.variableName = function (name) {
349+
const variable = this.editingTarget.lookupOrCreateVariable(name);
350+
if (variable) {
351+
return variable.name;
352+
}
353+
return null;
354+
};
355+
356+
Blockly.Ruby.listName = function (name) {
357+
const list = this.editingTarget.lookupOrCreateList(name);
358+
if (list) {
359+
return list.name;
360+
}
361+
return null;
362+
};
363+
347364
Blockly.Ruby.workspaceToCode_ = Blockly.Ruby.workspaceToCode;
348365

349366
Blockly.Ruby.workspaceToCode = function (block, target) {
@@ -392,6 +409,7 @@ export default function (Blockly) {
392409
Blockly = EventBlocks(Blockly);
393410
Blockly = ControlBlocks(Blockly);
394411
Blockly = OperatorsBlocks(Blockly);
412+
Blockly = DataBlocks(Blockly);
395413

396414
return Blockly;
397415
}

0 commit comments

Comments
 (0)