JQMGenerator = new Blockly.Generator( "CafeSQL" ) ; CafeGenerator = JQMGenerator VALUE = "input_value" STATEMENT = "input_statement" FIELDINPUT = "field_input" FIELDDROPDOWN = "field_dropdown" Agregar( "TTexto", "Texto {DContenido|field_input}", {salida: true, color: "240"}, ["'{DContenido}'", 0] ) Agregar( "TCampo", 'Campo {DContenido|field_variable|{"text":"Campo"}',{salida:true,color:"green"},["`{DContenido}`",0] ) Agregar( "TTabla", 'Tabla {DContenido|field_variable|{"text":"TablaPersonas"}', {salida:true,color:"green"},["`{DContenido}`",0] ) Agregar( "TUrl", "URL {DContenido|field_input}", {salida: true, color: "240"}, ["{DContenido}", 0] ) Agregar("TNumero", 'Núm {DContenido|field_input}', {salida:true,color:"blue"}, ["{Number([DContenido])}",0]) Agregar("TFecha", 'Fecha {Año|field_number|{"min":"1900","max":"2100", "value":"'+((new Date()).getFullYear())+'"}{Mes|field_dropdown|{"options":'+(function(){ return JSON.stringify("ENE0FEB0MAR0ABR0MAY0JUN0JUL0AGO0SEP0OCT0NOV0DIC".split(0).map(function(n,i){return [n, i+""]})) })()+'}{Día|field_number|{"value":"1","min":"1","max":"31"}', {salida:true, color:"green"}, function(D){ D.Mes++ ; if( D["Mes"]<10 ) D["Mes"] = "0"+D["Mes"] ; if( D["Día"]<10 ) D["Día"] = "0"+D["Día"] ; podriaSerBisiesto = D["Año"] % 4 == 0 ; noPuedeSerBisiesto = D["Año"] % 100 == 0 ; maxDiaFebrero = 28 if( podriaSerBisiesto && !noPuedeSerBisiesto ) maxDiaFebrero++ ; if( D.Mes == 2 ) if( D["Día"] > maxDiaFebrero ) D["Día"] = maxDiaFebrero ; return '"{Año}-{Mes}-{Día}"'.procesar(D) ; }) //------------------------------------------------ Lista Agregar( "TListaArray" , 'Lista (Array) con {D|input_dummy}{DContenido|input_statement}' , { salida: true, color: "#AA0000" } , function(D) { return ['[\n'+D.DContenido.replace(",","")+']\n',0] } ) Agregar( "TListaItemArray" , 'Item de Array{DInput|input_value}' , { esStatement: true, color: "#CC0000" } , ",{DInput}" ) Agregar( 'TObjeto' , 'Objeto con pares {D|input_dummy}{DPares|input_statement}' , { salida: true, color: "#00AA22" } , function(D){ return ['{\n'+D.DPares.replace(",","")+'}\n',0] } ) Agregar( 'TPar' , 'Clave {Clave|field_input|{"text":"nombre"}:{Valor|input_value}' , { esStatement: true, color: "#00AAE4" } , ', "{Clave}": {Valor}' ) Agregar( 'TFrase' , 'Frase "{Valor|field_input|{"text":"abc...xyz"}"' , { salida: true, color: "green" } , ['"{Valor}"\n', 0] ) Agregar( 'TNumero' , 'Núm {Valor|field_number|{"value":"0"}' , { salida:true, color: "blue" } , ['{Valor}\n', 0] ) Agregar( `TVerdad` , `Valor {Valor|field_dropdown|{"options":[["true","true"],["false","false"]]}` , { salida: true, color: "blue" } , [ '{Valor}\n', 0 ] ) Agregar( 'TColorX' , 'color {Valor|field_colour|{"colour":"#FF8811"}' , { salida: true, color: "#FFD500" } , ['"{Valor}"\n',0] ) //------------------------------------------------ Funciones de Blockly function Agregar( $nombre, $codigo, $datos, $funcion ) { CafeGenerator[$nombre] = function(E) { var aqui = this ; aqui.Data = {} ; Datos = this.Datos.forEach(function(cadaDato, num){ //if(num==0) return cadaDato ; X = cadaDato.split("|") Tipo = X[1] Nombre = X[0] if( Tipo == "input_statement" ) aqui.Data[Nombre] = CafeGenerator.statementToCode( E, Nombre, 0 ); else if( Tipo == "input_value" ) aqui.Data[Nombre] = CafeGenerator.valueToCode( E, Nombre, 0 ); else if( Tipo.substr(0,5) == "field" ){ if( Tipo.indexOf("variable") > -1 ) aqui.Data[Nombre] = AreaDeTrabajo.getVariableById(E.getFieldValue( Nombre )).name ; else aqui.Data[Nombre] = E.getFieldValue(Nombre) } // return X }) console.log(aqui.Data) if($funcion.tipo()=="[object Function]") return $funcion(aqui.Data) ; if($funcion.tipo()=="[object Array]" ) return [ $funcion[0].procesar(aqui.Data), $funcion[1] ]; return $funcion.procesar(aqui.Data) ; } Blockly.Blocks[$nombre] = { init: function() { $ = {} ; var n = 0 ; $.args0 = [] ; this.Datos = [] ; var aqui = this ; $.message0 = $codigo.replace( /{(.*?)}/g, function(a,b){ X = b.split("|") aqui.Datos.push(b) Y = ({ type: X[1] , name: X[0] }) if( X.length > 2 ) { console.log(X[2]) try { Otro = JSON.parse( X[2]+"}" ) for( var j in Otro ) Y[j] = Otro[j] ; console.log(110,Otro) } catch(E) { console.log( -10, Y, X[2]+"}" ) } } console.log( Y ) $.args0.push(Y) ; s = "%"+(++n) return s }) if( $datos.color ) $.colour = $datos.color ; if( $datos.siguiente ) $.nextStatement = $datos.siguiente === true ? null : $datos.siguiente ; if( $datos.anterior ) $.previousStatement = $datos.anterior === true ? null : $datos.anterior ; if( $datos.salida ) $.output = $datos.salida ===true ? null: $datos.salida ; if( $datos.entrada ) $.input = $datos.entrada===true ? null : $datos.entrada ; if( $datos.renglones == 1 ) $.inputsInline = true ; else if( $datos.renglones ) $.inputsInline = false ; if( $datos.esStatement ) { $.nextStatement = null ; $.previousStatement = null ; } console.log($) this.jsonInit($) } } } RTabla() ; function RTabla() { CafeGenerator.RTabla = function(B) { return B.getFieldValue("DTabla") } Blockly.Blocks.RTabla = { init: function() { var self = this; var input = this .appendDummyInput() .appendField('Tabla') .appendField( new Blockly.FieldDropdown( this.generarOpciones , function(x) { self.generarOpciones() ; } ) , 'DTabla' ) ; } , generarOpciones: function() { var r = [] ; window.ListaTablas = window.ListaTablas || [] ; ListaTablas.forEach(function(x) { r.push( [x+"", x+""] ) }) r.push( ["Agregar", "AGREGAR"] ) return r ; } } } function CrearComponenteHTML( $nombre, $etiqueta, $color, $funcion ) { CafeGenerator[$nombre] = $funcion ; Blockly.Blocks[$nombre] = { init: function() { this.jsonInit({ args0: [ { type: "input_statement" , name: "DAtributo" } , { type: "input_statement" , name: "DContenido" } ] , colour: $color || 0 , message0: "Componente "+$etiqueta+" con atributos %1 de contenido %2" }) this.datos = [$etiqueta,"IS|DAtributo", "IS|DContenido"] } } } JQMGenerator.scrub_ = function(block, code, opt_thisOnly) { const nextBlock = block.nextConnection && block.nextConnection.targetBlock(); const nextCode = opt_thisOnly ? '' : JQMGenerator.blockToCode(nextBlock); return code + nextCode; };