Este módulo puede volcar una tabla mostrando su contenido como texto. También puede mostrar texto HTML formateado. Esto puede ayudar a desarrollar otros módulos.
Una alternativa es utilizar mw.dumpObject()
pero el resultado de este módulo es más claro y se acerca al código fuente Lua válido.
Al trabajar con Wikidata, puede ser útil examinar una tabla que represente una entidad.
Por ejemplo, el Gran Telescopio de África Austral es d:Q833639. Esa entidad se puede ver como una tabla Lua mediante una vista previa:
{{#invoke:dump|wikidata|Q833639}}
Para ello, edite su sandbox y reemplace su contenido con la línea anterior, luego haga clic en Mostrar vista previa. Módulo discusión:Dump muestra este ejemplo.
Si se desea, se puede configurar el ancho de cada columna sangrada, por ejemplo, en dos espacios o utilizar caracteres de tabulación:
{{#invoke:dump|wikidata|Q833639|indent=2}}
{{#invoke:dump|wikidata|Q833639|indent=tab}}
También se puede visualizar una propiedad como el diámetro (P2386):
{{#invoke:dump|wikidata|P2386}}
Si hay un problema al depurar un módulo, puede resultar útil utilizar una copia del módulo en un entorno aislado para mostrar el contenido de una tabla y confirmar que contiene los datos esperados. A continuación, se muestra cómo un módulo puede volcar una tabla.
local p = {} function p . main ( frame ) local ejemplo = { link = true , fruta = { amarillo = 'bannana' , rojo = 'cereza' }, 11 , 22 , 33 , } local dump = require ( 'Módulo:Dump' ). _dump return dump ( ejemplo , 'ejemplo' ) end return p
Con el código anterior en Módulo: Ejemplo, el resultado podría mostrarse mediante una vista previa:
{{#invoke:example|main}}
El módulo contiene una tabla compleja para realizar pruebas. La tabla se puede visualizar mediante una vista previa:
{{#invoke:dump|testcase}}
Un módulo puede usar mw.html para generar HTML. Para realizar pruebas, puede resultar útil mostrar el resultado formateado. A continuación, se muestra cómo un módulo puede crear y volcar texto HTML.
función local main ( ) local tbl = mw.html . crear ( 'tabla' ) tbl : addClass ( 'wikitable' ) : etiqueta ( 'caption' ): wikitext ( 'Demostración de tabla' ): hecho () : etiqueta ( 'tr' ) : etiqueta ( 'th' ): wikitext ( 'Mes' ): hecho () : etiqueta ( 'th' ): wikitext ( 'Cantidad' ): hecho () : hecho () : etiqueta ( 'tr' ) : etiqueta ( 'td' ): wikitext ( 'Enero' ): hecho () : etiqueta ( 'td' ): wikitext ( '$100<br>pérdida' ): hecho () : hecho ( ) : etiqueta ( 'tr' ) : etiqueta ( 'td' ): wikitext ( 'Febrero' ): hecho () : etiqueta ( 'td' ): wikitext ( '$200' ) html local = tostring ( tbl ) dumphtml local = require ( 'Módulo:Dump' ). _dumphtml devuelve dumphtml ( html ) fin devolver { principal = principal }
Con el código anterior en Módulo: Ejemplo, el resultado podría mostrarse mediante una vista previa:
{{#invoke:example|main}}
El resultado es:
<tabla clase="wikitabla"> <caption>Demostración de tabla</caption> <tr> <th>Mes</th> <th>Cantidad</th> </tr> <tr> <td>Enero</td> Pérdida de $100 </tr> <tr> <td>Febrero</td> 200 dólares </tr></tabla>
La main()
función en el código anterior podría modificarse para devolver la tabla html reemplazando las dos últimas líneas con:
devolver html
En ese caso, el resultado se podría mostrar previsualizando lo siguiente ( 1=
es necesario si el texto contiene " =
"):
{{#invoke:dump|dumphtml|1={{#invoke:example|main}}}}
Obtener una vista previa de los siguientes ejemplos en un entorno aislado puede ser útil para examinar los resultados de una plantilla, como {{ navbox }} , que genera HTML.
{{#invoke:dump|dumphtml|1= {{navbox/caja de arena |grupo1 = Grupo1 |lista1 = Lista1 |grupo2 = Grupo2 |lista2 = Lista2 |grupo3 = Grupo3 |lista3 = Lista3 }}}}
El procedimiento dumphtml solo funciona de manera confiable con HTML válido. En el siguiente ejemplo, se inserta texto adicional ( <div>
) al comienzo porque la salida de un cuadro de navegación de subgrupo (secundario) comienza con </div>
.
{{#invoke:dump|dumphtml|1=<div> {{navbox/sandbox|subgrupo |grupo1 = Grupo1 |lista1 = Lista1 |grupo2 = Grupo2 |lista2 = Lista2 |grupo3 = Grupo3 |lista3 = Lista3 }}}}
Especial: ExpandTemplates es útil si es necesario ver el wikitexto devuelto por una plantilla o módulo. Sin embargo, ExpandTemplates no siempre muestra exactamente lo que recibiría un módulo. Por ejemplo, la siguiente plantilla muestra el resultado que se muestra en ExpandTemplates, pero el wikitexto que se pasa a un módulo en realidad contiene marcadores de franjas .
{{convert|1+2/3<ref>Example</ref>|ft|in}}
<templatestyles src="Fraction/styles.css"></templatestyles>
<span class="frac" role="math">1<span class="sr-only">+</span>
<span class="num">2</span>⁄<span class="den">3</span></span>
<ref>Example</ref>
feet (20 in)
La args
función muestra lo que recibe un módulo en sus argumentos.
{{#invoke:dump|args|1={{convert|1+2/3<ref>Example</ref>|ft|in}}}}
El resultado es el siguiente. Para mayor claridad, se ha reorganizado en varias líneas y cada carácter de eliminación se ha reemplazado por ♢
.
♢'"`UNIQ--templatestyles-00000002-QINU`"'♢
<span class="frac" role="math">1<span class="sr-only">+</span>
<span class="num">2</span>⁄<span class="den">3</span></span>
♢'"`UNIQ--ref-00000001-QINU`"'♢
feet (20 in)
Una plantilla puede invocar la main
función del ejemplo anterior. Cualquier parámetro que se pase a la plantilla o al módulo se puede mostrar para su depuración. Esto sería para investigar un resultado inesperado en una página, por ejemplo, Albedo . Para ver qué parámetros recibe un módulo utilizado en ese artículo, edite el módulo e inserte la siguiente línea al comienzo de la función principal:
Si es verdadero , entonces devuelve require ( 'Module:Dump' ). parámetros ( frame ) fin
No guarde los cambios. En su lugar, introduzca el nombre del artículo (por ejemplo, Albedo) en el cuadro que se encuentra debajo de "Vista previa de la página con este módulo" y, a continuación, haga clic en Mostrar vista previa. Todos los parámetros que se pasan al módulo en su marco y en el marco principal se muestran donde normalmente aparecería el resultado del módulo.
Un programa Lua podría ejecutarse
datos locales = mw . ext . datos . get ( 'Wikipedia estadísticas/datos.tab' )
para leer una tabla de datos de c:Data:Wikipedia statistics/data.tab.
Se puede obtener una vista previa de una edición en un entorno de pruebas para ver qué datos recibirá el programa. Para ello, obtenga una vista previa del siguiente wikitexto:{{#invoke:dump|Wikipedia statistics/data.tab}}
El módulo de volcado acepta cualquier texto como parámetro y aplicará un procesamiento especial si se reconoce el texto. Los datos estructurados se identifican como texto que termina en .tab
.
En Lua, _G
es una variable global que es una tabla que contiene información sobre todas las variables globales. La _G
tabla se puede visualizar mediante una vista previa (tanto como G
de _G
trabajo):
{{#invoke:dump|testcase|G}}
Si se desea, se puede establecer el ancho de cada columna sangrada, por ejemplo, en 2 espacios:
{{#invoke:dump|testcase|G|indent=2}}
-- 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 )