Ctrl K
ComunidadGuías…

extensions/web-scripts/blocks-lua.js

Rama master · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
define(function() {

  function textToLua(text) {
    if (typeof text !== 'string') {
      text = '' + text;
    }
    return "'" + text.replace(/([\'\\])/g, '\\$1') + "'";
  }
  function nameToLuaKey(name) {
    if (name.match(/^[a-zA-Z_][a-zA-Z0-9_]+$/)) {
      return '.' + name;
    }
    return '[' + textToLua(name) + ']';
  }
  function getVariableName(block, fieldName) {
    var fieldValue = block.getFieldValue(fieldName);
    return Blockly.Lua.nameDB_.getName(fieldValue, Blockly.Names.NameType.VARIABLE);
  }

  return {
    // -- Data --------
    "lha_get_data": function(block) {
      var path = block.getFieldValue('PATH');
      var code = "script:getDataValue('" + path + "')";
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_set_data": function(block) {
      var path = block.getFieldValue('PATH');
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      return "script:setDataValue('" + path + "', " + value + ")\n";
    },
    "lha_watch_data": function(block) {
      var code = Blockly.Lua.statementToCode(block, 'DO');
      var path = block.getFieldValue('PATH');
      var newValue = getVariableName(block, 'NEW_VALUE');
      //var oldValue = getVariableName(block, 'OLD_VALUE');
      code = "script:watchValue('data/" + path + "', function(" + newValue + ")\n" + code + "end)\n";
      return code;
    },
    "lha_data_path": function(block) {
      var path = block.getFieldValue('PATH');
      return [textToLua(path), Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_get_data_path": function(block) {
      var path = Blockly.Lua.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_NONE);
      var code = "script:getDataValue(" + path + ")";
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_set_data_path": function(block) {
      var path = Blockly.Lua.valueToCode(block, 'PATH', Blockly.JavaScript.ORDER_NONE);
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      return "script:setDataValue(" + path + ", " + value + ")\n";
    },
    // -- Event --------
    "lha_event": function(block) {
      var code = Blockly.Lua.statementToCode(block, 'DO');
      var event = block.getFieldValue('EVENT');
      code = "script:subscribeEvent('" + event + "', function()\n" + code + "end)\n";
      return code;
    },
    "lha_schedule": function(block) {
      var code = Blockly.Lua.statementToCode(block, 'DO');
      var value = block.getFieldValue('VALUE');
      code = "script:registerSchedule('" + value + "', function()\n" + code + "end)\n";
      return code;
    },
    "lha_timer": function(block) {
      var name = block.getFieldValue('NAME');
      var value = block.getFieldValue('VALUE');
      var factor = parseInt(block.getFieldValue('SECONDS'), 10) * 1000;
      var code = Blockly.Lua.statementToCode(block, 'DO');
      return "script:setTimer(function()\n" + code + "end, " + (value * factor) + ", " + textToLua(name) + ")\n";
    },
    "lha_clear_timer": function(block) {
      var name = block.getFieldValue('NAME');
      return "script:clearTimer(" + textToLua(name) + ")\n";
    },
    "lha_on_event": function(block) {
      var code = Blockly.Lua.statementToCode(block, 'DO');
      var event = block.getFieldValue('EVENT');
      var args = getVariableName(block, 'ARGS');
      return "script:subscribeEvent(" + textToLua(event) + ", function(...)\n  local " + args + " = {...}\n" + code + "end)\n";
    },
    "lha_fire_event": function(block) {
      var event = block.getFieldValue('EVENT');
      var target = block.getFieldValue('TARGET');
      var args = Blockly.Lua.valueToCode(block, 'ARGS', Blockly.JavaScript.ORDER_NONE);
      var code = textToLua(event);
      if ((typeof args === 'string') && (args.length > 0)) {
        code += ", table.unpack(" + args + ")";
      }
      switch(target) {
      case 'OTHERS':
        return "script:fireExtensionEvent(" + code + ")\n";
      case 'ALL':
        return "script.engine:publishEvent(" + code + ")\n";
      } // ME
      return "script:publishEvent(" + code + ")\n";
    },
    // -- Expression --------
    "lha_to_string": function(block) {
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      return ["tostring(" + value + ")", Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_type": function(block) {
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      return ["type(" + value + ")", Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_time": function(block) {
      return ["utils.time()", Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_hms": function(block) {
      var value = block.getFieldValue('VALUE');
      var hms = value.split(':').map(function(v) {
        return parseInt(v, 10);
      });
      var code = '' + hms.reverse().reduce(function(pv, cv) {return cv + pv / 60}, 0);
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_day": function(block) {
      var value = block.getFieldValue('NAME');
      return [value, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_parse_time": function(block) {
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      var code = "(utils.timeFromString(tostring(" + value + ")) or 0)";
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_format_time": function(block) {
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      var code = "utils.timeToString(tonumber(" + value + ") or 0)";
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_date": function(block) {
      var field = block.getFieldValue('FIELD');
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      var code;
      if (field === 'H.ms') {
        code = "utils.timeToHms(" + value + ")";
      } else {
        code = "tonumber(os.date('%" + field + "', " + value + "))";
      }
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_color": function(block) {
      var field = block.getFieldValue('FIELD');
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      var o = "utils.parseRgbHex(" + value + ")";
      var indices = {"r": 1, "g": 2, "b": 3, "h": 11, "s": 12, "v": 13};
      var n = indices[field];
      if (n > 10) {
        n = n - 10;
        var o = "utils.rgbToHsv(" + o + ")";
      }
      var code = 'select(' + n + ', ' + o + ')';
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_color_hsv": function(block) {
      var h = Blockly.Lua.valueToCode(block, 'HUE', Blockly.JavaScript.ORDER_NONE);
      var s = Blockly.Lua.valueToCode(block, 'SATURATION', Blockly.JavaScript.ORDER_NONE);
      var v = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      var code = 'utils.formatRgbHex(utils.hsvToRgb(' + h + ', ' + s + ', ' + v + '))';
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_color_rgb": function(block) {
      var r = Blockly.Lua.valueToCode(block, 'RED', Blockly.JavaScript.ORDER_NONE);
      var g = Blockly.Lua.valueToCode(block, 'GREEN', Blockly.JavaScript.ORDER_NONE);
      var b = Blockly.Lua.valueToCode(block, 'BLUE', Blockly.JavaScript.ORDER_NONE);
      var code = 'utils.formatRgbHex(' + r + ', ' + g + ', ' + b + ')';
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    // -- Experimental --------
    "lha_get_field": function(block) {
      var name = block.getFieldValue('NAME');
      var obj = getVariableName(block, 'OBJECT');
      //var code = "(type(" + obj + ") == 'table' and " + obj + "[" + textToLua(name) + "])";
      var code = obj + nameToLuaKey(name);
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_set_field": function(block) {
      var name = block.getFieldValue('NAME');
      var obj = getVariableName(block, 'OBJECT');
      var value = Blockly.Lua.valueToCode(block, 'VALUE', Blockly.JavaScript.ORDER_NONE);
      //return "if type(" + obj + ") == 'table' then\n" + obj + "[" + textToLua(name) + "] = " + value + "\nend\n";
      return obj + nameToLuaKey(name) + " = " + value + "\n";
    },
    "lha_log": function(block) {
      var level = block.getFieldValue('LEVEL')
      var message = Blockly.Lua.valueToCode(block, 'MESSAGE', Blockly.JavaScript.ORDER_NONE);
      return "logger:log(logger." + level + ", tostring(" + message + "))\n";
    },
    "lha_require": function(block) {
      var name = block.getFieldValue('NAME');
      var code = 'script:require(' + textToLua(name) + ')';
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_call": function(block) {
      var fn = Blockly.Lua.valueToCode(block, 'FUNCTION', Blockly.JavaScript.ORDER_NONE);
      var args = Blockly.Lua.valueToCode(block, 'ARGS', Blockly.JavaScript.ORDER_NONE);
      //var code = "(function(...) local fn = " + fn + "; if type(fn) == 'function' then return fn(...); end; end)(" + value + ")";
      var code = fn + "(table.unpack(" + args + "))";
      return [code, Blockly.JavaScript.ORDER_MEMBER];
    },
    "lha_call_no_return": function(block) {
      var fn = Blockly.Lua.valueToCode(block, 'FUNCTION', Blockly.JavaScript.ORDER_NONE);
      var args = Blockly.Lua.valueToCode(block, 'ARGS', Blockly.JavaScript.ORDER_NONE);
      var code = fn + "(table.unpack(" + args + "))";
      return code + "\n";
    }
  };

});