Advertisement
Reemind

Untitled

Feb 13th, 2024
973
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Import Blockly core.
  2. import * as Blockly from 'blockly/core.js';
  3. // Import the default blocks.
  4. import * as libraryBlocks from 'blockly/blocks.js';
  5. // Import a generator.
  6. import { pythonGenerator, Order } from 'blockly/python.js';
  7. // Import a message file.
  8. import * as Ru from 'blockly/msg/ru.js';
  9.  
  10. Blockly.setLocale(Ru);
  11.  
  12. export const init = (toolbox, playgroundSource, parameters) => {
  13.     console.log('Init');
  14.  
  15.     var playground = JSON.parse(playgroundSource);
  16.  
  17.     const blocklyArea = document.getElementById('blocklyArea');
  18.     const blocklyDiv = document.getElementById('blocklyDiv');
  19.  
  20.     const theme = Blockly.Theme.defineTheme('dark', {
  21.         base: Blockly.Themes.Classic,
  22.         componentStyles: {
  23.             workspaceBackgroundColour: '#1e1e1e',
  24.             toolboxBackgroundColour: 'blackBackground',
  25.             toolboxForegroundColour: '#fff',
  26.             flyoutBackgroundColour: '#252526',
  27.             flyoutForegroundColour: '#ccc',
  28.             flyoutOpacity: 1,
  29.             scrollbarColour: '#797979',
  30.             insertionMarkerColour: '#fff',
  31.             insertionMarkerOpacity: 0.3,
  32.             scrollbarOpacity: 0.4,
  33.             cursorColour: '#d0d0d0',
  34.             blackBackground: '#333',
  35.         },
  36.     })
  37.  
  38.     Blockly.defineBlocksWithJsonArray([
  39.         {
  40.         "type": "pow_mod",
  41.         "message0": "%1 ^ %2 %% %3",
  42.         "args0": [
  43.             {
  44.                 "type": "input_value",
  45.                 "name": "base",
  46.                 "check": "Number"
  47.             },
  48.             {
  49.                 "type": "input_value",
  50.                 "name": "exponent",
  51.                 "check": "Number"
  52.             },
  53.             {
  54.                 "type": "input_value",
  55.                 "name": "modulo",
  56.                 "check": "Number"
  57.             }
  58.         ],
  59.         "inputsInline": true,
  60.         "output": "Number",
  61.         "colour": 230,
  62.         "tooltip": "Нахождение степени по модулю",
  63.         "helpUrl": ""
  64.         },
  65.         {
  66.             "type": "dict_create",
  67.             "message0": "пустой словарь",
  68.             "output": "dict",
  69.             "colour": 230,
  70.             "tooltip": "",
  71.             "helpUrl": ""
  72.         },
  73.         {
  74.             "type": "dict_set",
  75.             "message0": "в списке %1 установить по ключу %2 значение %3",
  76.             "args0": [
  77.                 {
  78.                     "type": "input_value",
  79.                     "name": "dictVar",
  80.                     "check": "dict"
  81.                 },
  82.                 {
  83.                     "type": "input_value",
  84.                     "name": "key"
  85.                 },
  86.                 {
  87.                     "type": "input_value",
  88.                     "name": "val"
  89.                 }
  90.             ],
  91.             "inputsInline": true,
  92.             "previousStatement": null,
  93.             "nextStatement": null,
  94.             "colour": 300,
  95.             "tooltip": "",
  96.             "helpUrl": ""
  97.         },
  98.         {
  99.             "type": "dict_get",
  100.             "message0": "из словаря %1 вернуть по ключу %2",
  101.             "args0": [
  102.                 {
  103.                     "type": "input_value",
  104.                     "name": "dict",
  105.                     "check": "dict"
  106.                 },
  107.                 {
  108.                     "type": "input_value",
  109.                     "name": "key"
  110.                 }
  111.             ],
  112.             "inputsInline": true,
  113.             "output": null,
  114.             "colour": 150,
  115.             "tooltip": "",
  116.             "helpUrl": ""
  117.         },
  118.         {
  119.             "type": "dict_get_or_default",
  120.             "message0": "из словаря %1 вернуть по ключу %2 или %3",
  121.             "args0": [
  122.                 {
  123.                     "type": "input_value",
  124.                     "name": "dict",
  125.                     "check": "dict"
  126.                 },
  127.                 {
  128.                     "type": "input_value",
  129.                     "name": "key"
  130.                 },
  131.                 {
  132.                     "type": "input_value",
  133.                     "name": "default"
  134.                 }
  135.             ],
  136.             "inputsInline": true,
  137.             "output": null,
  138.             "colour": 150,
  139.             "tooltip": "",
  140.             "helpUrl": ""
  141.         },
  142.         {
  143.             "type": "isqrt",
  144.             "message0": "целый квадратный корень %1",
  145.             "args0": [
  146.                 {
  147.                     "type": "input_value",
  148.                     "name": "val"
  149.                 }
  150.             ],
  151.             "output": null,
  152.             "colour": 230,
  153.             "tooltip": "",
  154.             "helpUrl": ""
  155.         }
  156.     ]);
  157.  
  158.     pythonGenerator.forBlock['pow_mod'] = function (block, generator) {
  159.         var value_base = generator.valueToCode(block, 'base', Order.ATOMIC);
  160.         var value_exponent = generator.valueToCode(block, 'exponent', Order.ATOMIC);
  161.         var value_name = generator.valueToCode(block, 'modulo', Order.ATOMIC);
  162.         var code = 'pow(' + value_base + ', ' + value_exponent + ', ' + value_name + ')';
  163.         return [code, Order.FUNCTION_CALL];
  164.     };
  165.  
  166.     pythonGenerator.forBlock['dict_create'] = function (block, generator) {
  167.         var code = '{}';
  168.         return [code, Order.COLLECTION];
  169.     };
  170.  
  171.     pythonGenerator.forBlock['dict_set'] = function (block, generator) {
  172.         var value_dictvar = generator.valueToCode(block, 'dictVar', Order.ATOMIC);
  173.         var value_key = generator.valueToCode(block, 'key', Order.ATOMIC);
  174.         var value_val = generator.valueToCode(block, 'val', Order.ATOMIC);
  175.         // TODO: Assemble python into code variable.
  176.         var code = `${value_dictvar}[${value_key}] = ${value_val}\n`;
  177.         return code;
  178.     };
  179.  
  180.     pythonGenerator.forBlock['dict_get'] = function (block, generator) {
  181.         var value_dict = generator.valueToCode(block, 'dict', Order.ATOMIC);
  182.         var value_key = generator.valueToCode(block, 'key', Order.ATOMIC);
  183.        
  184.         var code = `${value_dictvar}[${value_key}]`;
  185.         return [code, Order.COLLECTION];
  186.     };
  187.  
  188.     pythonGenerator.forBlock['dict_get_or_default'] = function (block, generator) {
  189.         var value_dict = generator.valueToCode(block, 'dict', Order.ATOMIC);
  190.         var value_key = generator.valueToCode(block, 'key', Order.ATOMIC);
  191.         var value_default = generator.valueToCode(block, 'default', Order.ATOMIC);
  192.  
  193.         var code = `${value_dict}.get(${value_key}, ${value_default})`;
  194.         // TODO: Change ORDER_NONE to the correct strength.
  195.         return [code, Order.FUNCTION_CALL];
  196.     };
  197.  
  198.     pythonGenerator.forBlock['isqrt'] = function (block, generator) {
  199.         generator.definitions_['import_math'] = 'import math';
  200.  
  201.         var value_val = generator.valueToCode(block, 'val', Order.ATOMIC);
  202.  
  203.         var code = `int(math.sqrt(${value_val}))`;
  204.         return [code, Order.FUNCTION_CALL];
  205.     };
  206.  
  207.     let workspace = Blockly.inject(blocklyDiv, {
  208.         toolbox: toolbox,
  209.         theme: theme
  210.     })
  211.  
  212.     parameters.map(item => {
  213.         workspace.createVariable(item);
  214.     })
  215.  
  216.     const onresize = function (e) {
  217.         // Compute the absolute coordinates and dimensions of blocklyArea.
  218.         let element = blocklyArea;
  219.         let x = 0;
  220.         let y = 0;
  221.         do {
  222.             x += element.offsetLeft;
  223.             y += element.offsetTop;
  224.             element = element.offsetParent;
  225.         } while (element);
  226.         // Position blocklyDiv over blocklyArea.
  227.         blocklyDiv.style.left = x + 'px';
  228.         blocklyDiv.style.top = y + 'px';
  229.         blocklyDiv.style.width = blocklyArea.offsetWidth + 'px';
  230.         blocklyDiv.style.height = blocklyArea.offsetHeight + 'px';
  231.         Blockly.svgResize(workspace);
  232.     };
  233.     window.addEventListener('resize', onresize, false);
  234.     onresize();
  235.  
  236.     if (playground)
  237.         Blockly.serialization.workspaces.load(playground, workspace);
  238.  
  239.     return workspace;
  240. };
  241.  
  242. export const generate = (workspace) => {
  243.     return pythonGenerator.workspaceToCode(workspace)
  244. };
  245.  
  246. export const save = (workspace) => {
  247.     return JSON.stringify(Blockly.serialization.workspaces.save(workspace))
  248. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement