stringtranslate.com

Módulo: Dump

-- Vuelca una tabla para ayudar a desarrollar otros módulos. -- También es posible usar mw.dumpObject() pero el resultado de este módulo es más claro y cercano al código fuente válido de Lua. -- El propósito principal es permitir una fácil inspección de los elementos de Wikidata. -- Previsualiza lo siguiente en un entorno limitado para ver la entidad Q833639 como una tabla de Lua: -- {{#invoke:dump|wikidata|Q833639}} -- Previsualiza lo siguiente para volcar una tabla incorporada: -- {{#invoke:dump|testcase}} Colección local -- una tabla para almacenar elementos Colección = { add = function ( self , item ) if item ~= nil then self . n = self . n + 1 self [ self . n ] = item end end , join = function ( self , sep ) return table. concat ( self , sep ) end , remove = function ( self , pos ) if self . n > 0 y ( pos == nil o ( 0 < pos y pos <= self . n )) entonces self . n = self . n - 1 return table. remove ( self , pos ) end end , sort = function ( self , comp ) table. sort ( self , comp ) end , new = function () return setmetatable ({ n = 0 }, Colección ) end } Colección . __index = Colección función local pre_block ( texto )                                                                  -- Las etiquetas pre devueltas por un módulo no actúan como wikitexto <pre>...</pre>. return '<pre> \n ' .. mw . text . nowiki ( text ) .. ( text : sub ( - 1 ) == ' \n ' and '' or ' \n ' ) .. '</pre> \n ' end local function make_tabstr ( indent ) -- Devuelve una cadena para generar un nivel de sangría. if indent == 'tab' then -- Las tabulaciones no funcionan bien en una ventana de edición del navegador, pero puedes forzarlas. return ' \t ' end indent = tonumber ( indent ) if not ( type ( indent ) == 'number' and 1 <= indent and indent <= 32 ) then indent = 4 end return string.rep ( ' ' , indent ) end local function _dumphtml ( html , tabwidth ) -- Devuelve un volcado con formato de texto bonito de una cadena html. -- Esto supone que el HTML está limpio, por ejemplo, la etiqueta "<tabla>" no "<tabla>". si el tipo ( html ) ~= 'string' entonces devuelve '' fin local selfClosingTags = { -- de mw.html.lua area = true , base = true , br = true , col = true , command = true , embed = true , hr = true , img = true , input = true , keygen = true , link = true ,meta = verdadero                                                                        , param = true , source = true , track = true , wbr = true , } local tabstr = make_tabstr ( tabwidth ) local function indent_pad ( depth , isfirst ) - Devuelve una cadena con una sangría para que coincida con la profundidad. si depth > 0 , entonces devuelve ' \n ' .. string.rep ( tabstr , depth ) end return isfirst y '' o ' \n ' end local function extract ( result , html , pos , len , depth , currenttag ) - Vuelca más html en la tabla result y devuelve una nueva pos. local has_child mientras pos <= len hacer local s , e = html : find ( '<[^<>]*>' , pos ) si s entonces si s > pos entonces tabla.insertar ( resultado , html : sub ( pos , s - 1 )) fin si html : sub ( s + 1 , s + 1 ) == '/' entonces -- Una etiqueta de cierre. etiqueta local = html : match ( '^([a-zA-Z0-9]+)>' , s + 2 ) o 'NOTAG' si etiqueta == currenttag entonces sangría local = has_child y sangría_pad ( profundidad - 1 ) o '' tabla.insertar ( resultado , sangría .. '</' ..                                                                                 tag  ..  '>' ) else -- Nunca debería suceder. table.insert ( result , ' \n </' .. tag .. '>' ) end return e + 1 end local tag = html : match ( '^[a-zA-Z0-9]+' , s + 1 ) or 'NOTAG' if html : sub ( e - 1 , e - 1 ) == '/' or selfClosingTags [ tag ] then -- Una etiqueta de cierre automático. table.insert ( result , html : sub ( s , e )) pos = e + 1 else -- Una etiqueta de apertura. tabla.insertar ( resultado , indent_pad ( profundidad , pos == 1 ) .. html : sub ( s , e )) pos = extraer ( resultado , html , e + 1 , len , profundidad + 1 , etiqueta ) tiene_hijo = verdadero fin de lo contrario tabla.insertar ( resultado , html : sub ( pos )) romper fin fin devolver len + 1 fin local resultado = {} html = html : gsub ( '>%s+<' , '><' ): gsub ( ' \n %s*' , ' ' ) extraer ( resultado , html , 1 , # html , 0 ) devolver pre_block ( tabla.concat ( resultado                                                           )) fin de la función local dumphtml ( frame ) local args = frame . args local pargs = frame : getParent (). args local text = args [ 1 ] o pargs [ 1 ] local indent = args . indent o pargs . indent return _dumphtml ( text , indent ) fin de la función local quoted ( str ) return ( string.format ( '%q' , str ): gsub ( ' \\\n ' , ' \\ n' )) fin de la función local iterkeys ( var , control ) -- Devuelve un iterador sobre las claves de var (que debe ser una tabla). -- Las claves se ordenan primero con las claves numeradas y luego con los otros tipos. -- El iterador devuelve key, repr donde key es la clave real y -- repr es su representación: un número para las claves ipairs, o -- una cadena, incluso para las claves numéricas por encima de la longitud de la tabla. si tipo ( var ) ~= 'tabla' entonces devuelve función ( ) devuelve nil fin fin números locales = {} resultados locales = Colección.new ( ) para i , _ en ipairs ( var ) hacer números [ i ] = verdadero resultados : sumar ( { i , i }) fin claves locales = Colección.new ( ) para k , _ en pairs ( var ) hacer si no números [ k ] entonces claves                                                                : agregar ( k ) fin fin local autoname = control . autoname keys : sort ( function ( a , b ) local ta , tb = type ( a ), type ( b ) if ta == tb then if ta == 'number' or ta == 'string' then return a < b end if ta == 'boolean' then return b and not a end return autoname ( a ) < autoname ( b ) end if ta == 'number' then return true elseif tb == 'number' then return false else return ta < tb end end ) for _ , k in ipairs ( keys ) do local repr local tk = type ( k ) if tk == 'number' then repr = '[' .. k .. ']' elseif tk == 'string' then if k : match ( '^[%a_][%w_]*$' ) then repr = k else repr = '[' .. quoted ( k ) .. ']' end elseif tk == 'booleano' entonces repr = '[' .. tostring ( k ) .. ']' de lo contrario repr = autoname ( k ) control .necesario [ repr ] =                                                                                                verdadero resultados finales : add ({ k , repr }) fin local last = 0 return function () if last < results . n then last = last + 1 return unpack ( results [ last ]) fin fin fin función local vardump ( var , vname , depth , control , self , parents ) - Actualizar elementos en control con los resultados del volcado de una variable. función local put ( value , options ) options = options o {} sangría local = options . indent o depth coma local = ( options . kind == 'open' o indent == 0 ) y '' o ',' control . elementos : agregar ({ clave = ( tipo ( vname ) == 'string' y opciones . kind ~= 'close' ) y vname o nulo , valor = valor .. coma , profundidad = sangría , nota = opciones . note }) fin si var == nulo entonces put ( 'nil' ) de lo contrario si tipo ( var ) == 'string' entonces put ( quoted ( var )) de lo contrario si tipo ( var ) == 'table' entonces local esto = control . autoname ( var )                                                                                    si  profundidad    > = control.limitdepth entonces put ( this ) de lo contrariosi padres y padres [ this ] entonces control.necessary [ this ] = verdadero si self == this entonces put ( this , { nota = ' self ' } ) control.necessary [ ' self ' ] = verdadero de lo contrario put ( this , { nota = ' repeat ' } ) control.necessary [ ' repeat' ] = verdadero fin de lo contrario padres = padres o {} padres [ this ] = verdadero self = this put ( '{' , { tipo = 'open' , nota = this } ) mt local = getmetatable ( var ) si mt entonces vardump ( mt , ' __metatable ' , profundidad + 1 , control , self , padres ) fin tamañomáximo local = control.items.n + control.limititems para clave , keyrep en iterkeys ( var , control ) hacer si control.items . n > maxsize entonces put ( '...más...' ) break end vardump ( var [ clave ], keyrep , profundidad + 1 , control , self , padres ) end put ( '}'                                                                    ,  {  kind  =  'close'  }) end elseif type ( var ) == 'boolean' or type ( var ) == 'number' then put ( tostring ( var )) else -- function (o userdata o thread) put ( control . autoname ( var )) end end local function dumper ( var , vname , tabwidth , wantraw , limititems , limitdepth ) -- Devuelve una cadena que representa var en una sintaxis de Lua casi correcta. -- No hay una nueva línea al final del resultado. local onames = {} local tcounts = {} local function autoname ( var ) -- Devuelve una cadena que es un nombre único para var, dado que no es -- un número o una cadena. si no es onames [ var ] entonces nombre local = tipo ( var ) tcounts [ nombre ] = ( tcounts [ nombre ] o 0 ) + 1 onames [ var ] = nombre .. '_' .. tcounts [ nombre ] fin devolver onames [ var ] fin control local = { autoname = autoname , limititems = limititems o 10000 , limitdepth = limitdepth o 50 , items = Collection.new ( ), needed = {}, } vardump ( var , tostring ( vname o ' variable' ), 0 , control ) tabstr local                                                                   =  make_tabstr ( tabwidth ) local líneas = Collection.new ( ) para i , v en ipairs ( control.items ) hacer sangría local = string.rep ( tabstr , v.depth ) nota local = v.note si nota y control.need [ nota ] entonces nota = ' -- ' ..nota de lo contrario nota = ' ' fin local k = v.key y ( v.key .. ' = ' ) o ' ' líneas : add ( sangría ..k ..v.value ..nota ) fin local raw = líneas : join ( ' \ n ' ) devolver wantraw y raw o pre_block ( raw ) fin local función dump_testcase ( frame ) elemento local si tipo ( frame ) == ' tabla ' entonces elemento = frame .args [ 1 ] de lo contrario elemento = marco fin si elemento == 'G' o elemento == '_G' entonces devuelve dumper ( _G , '_G' , marco . args . sangría ) fin local fruta = { 'manzana' , 'banana' , [ 0 ] = 'cero' , [{ 'anon' }] = 'anon' } local                                                                                   caso de prueba  =  { [ 100 ] = 'cien' , [ 99 ] = 'noventa y nueve' , [ 0.5 ] = 'la mitad' , [ - 1 ] = 'menos uno' , 'uno' , 'dos' , [ ' ' ] = 'espacio' , [ '1 –◆— z' ] = 'unicode' , alfa = 'aaa' , beta = 'bbb' , c = 123 , datos = { dumper = dumper , [ dumper ] = 'dumper' , 'tres' , 'cuatro' , T = verdadero , [ verdadero ] = 'T' , alfa2 = 'aaa2' , beta2 = 'bbb2' , F = falso , [ falso ] = 'F' , c2 = 1234 , datos2 = { 'cinco' , 'seis' , alfa3 = 'aaa3' , beta3 = 'bbb3' , c3 = 12345 , fruta = fruta , [ fruta ] = 'fruta' , }, }, z = 'zoo' , } caso de prueba . caso de prueba = caso de prueba caso de prueba . datos . yo = caso de prueba . caso de prueba de datos . datos . datos2 . yo = caso de prueba caso de prueba . datos . datos2 . fruta . atrás = caso de prueba . conjunto de datos metatable ( testcase .datos , { __índice = función                                                                ( self ,  key )  return  type ( key )  ==  'string'  and  # key  or  nil  end , __tostring = function ( self ) return tostring ( # self ) end , }) if item == 'return table' then return testcase end return dumper ( testcase , 'testcase' , frame . args . indent ) end local functionexecute ( frame ) -- Devuelve un volcado del resultado de ejecutar {{#invoke:dump|execute|EXPRESSION}}. -- En general, eso no es posible en Scribunto, por lo que tiene código incorporado -- para analizar algunas expresiones de interés. -- El objetivo principal es probar el resultado de llamar a una función de Wikidata -- mientras se obtiene una vista previa de una edición en un artículo. -- Ejemplos de EXPRESIÓN: -- mw.wikibase.getEntityIdForCurrentPage() -- mw.wikibase.getBestStatements('Q868', 'P214') -- mw.wikibase.getBestStatements(Q868, P214) -- también se acepta -- mw.wikibase.getEntity():getDescription('de') -- mw.wikibase.getEntity('Q868'):getDescription('de') -- getEntityObject es un alias para getEntity. -- El uso de lo siguiente da un error de "memoria insuficiente", probablemente porque -- el resultado es una tabla con una metatabla que dump expande repetidamente. -- mw.title.getCurrentTitle() función local params ( ptext , first ) local p = { first } para item en ( ptext .. ',' ): gmatch ( '(%S.-)%s*,' ) hacer -- Eliminar las comillas alrededor de cada parámetro porque ya es una cadena. local _ , s = item : match ( [[^%s*(['"])(.*)%1%s*$]] ) table.insert ( p , s o tonumber ( item ) o item ) fin                                       devolver  unpack ( p ) fin expresión local = frame . args [ 1 ] o '' texto local = expresión : match ( '^%s*mw(%..-)%s*$' ) si no texto entonces devolver 'Expresión no reconocida: "' .. expresión .. '"' fin - Buscar una expresión compatible con el formato 'mw.ab(c):de(f)'. entidad local objeto local = mw elemento local , ptext , resto = texto : match ( '^%.wikibase%.(%w+)%s*%((.*)%):(.*)$' ) si elemento == 'getEntity' o elemento == 'getEntityObject' entonces entidad = mw . wikibase . getEntity ( params ( ptext )) si no entidad entonces devolver 'No se encontró entidad para (' .. ptext .. ')' fin objeto = entidad texto = '.' .. resto - tratar ':' como '.' fin local hasta = 1 para i1 , elemento , i2 en texto : gmatch ( '()%.(%w+)()' ) hacer si i1 == hasta y tipo ( objeto ) == 'tabla' entonces objeto = objeto [ elemento ] de lo contrario objeto = nil fin si objeto == nil entonces devolver 'Elemento no válido "' .. elemento .. '"' fin si tipo ( objeto ) == 'función' entonces si texto : sub ( i2 ,i2 + 1 ) ==                                                                                          '()'  entonces objeto = objeto () i2 = i2 + 2 fin fin hasta = i2 fin local parm = texto : sub ( hasta ): coincidencia ( '^%((.*)%)%s*$' ) si parm entonces objeto = objeto ( params ( parm , entidad )) fin retorno dumper ( objeto , expresión ) fin local función dumpargs ( marco ) -- Devuelve un volcado de texto de frame.args. -- {{#invoke:dump|args|<ref>Ejemplo</ref>}} → mostrar marcador de tira de referencia control local = { autoname = función ( var ) retorno tostring ( var ) fin , -- no se debe llamar ya que las claves deben ser números o cadenas } líneas locales = Colección . new ( ) for key , keyrep in iterkeys ( frame.args , control ) do lines : add ( keyrep .. '=<code>' ..mw.text.nowiki ( frame.args [ key ] ) .. ' </code>' ) end return lines: join('<br> \ n ' ) end local function parameters ( frame ) -- Devuelve un volcado de texto de args y argumentos principales de frame. -- Esto es para depurar un módulo para mostrar qué parámetros recibió. local control = { autoname = function ( var ) return tostring ( var ) end , -- no se debe llamar ya que las claves deben ser números o cadenas } local                                                           líneas  =  Colección.new () líneas : add ( '' ) para _ , f en ipairs ({ marco , marco : getParent ( ) }) hacer líneas : add ( '[[' .. f : getTitle () .. ' ] ]' ) para clave , keyrep en iterkeys ( f.args , control ) hacer líneas : add ( ' & nbsp ; ' .. mw.text.nowiki ( keyrep .. '=' .. f.args [ clave ])) fin fin líneas: add('') devolver líneas: join( ' <br> \ n ' ) fin función local wikidata ( marco ) elemento local = marco.args [ 1 ] si elemento entonces id local = elemento : match ( ' ^ % s * ( [ PQ ] % d + ) % s * $ ' ) si id entonces entidad local = mw . wikibase . getEntity ( id ) return dumper ( entidad , id , frame . args . indent ) end end return 'El parámetro debe ser un identificador de Wikidata como P2386 o Q833639' end local builtins = { -- Manejar la vista previa del wikitexto como {{#invoke|dump|TEXT}} -- donde TEXT es un valor incorporado que se puede volcar. __index = function ( self , key ) local result función local llamador () return                                                       resultado final si tipo ( clave ) == 'string' entonces título local = clave : match ( '^%s*[ \' "]?(.*%.tab)[ \' "]?%s*$' ) si título entonces -- Suponga que los datos estructurados son de Commons en [[c:Data:<title>]]. si título : match ( '^[Dd]ata:' ) entonces título = título : sub ( 6 ) final datos locales = mw . ext . data . obtener ( título ) - falso si la página no existe resultado = dumper ( datos , '[[c:Data:' .. título .. ']]' ) fin fin resultado = resultado o ( 'DESCONOCIDO: ' .. tostring ( clave )) devolver llamador fin } devolver setmetatable ({ args = dumpargs , _dump = dumper , _dumphtml = _dumphtml , dumphtml = dumphtml , ejecutar = ejecutar , parámetros = parámetros , caso de prueba = dump_testcase , wikidata = wikidata , }, funciones integradas )