Implementa {{ Valor del parámetro de plantilla }} y {{ HasTemplate }} , y se puede utilizar desde otros módulos.
getParameter toma 4 argumentos: el nombre de la página (cadena), la plantilla o plantillas (cadena o tabla de cadenas), el parámetro (cadena) y una tabla de opciones opcional. Devolverá true
y el contenido del parámetro solicitado o false
y un motivo del error.
Las siguientes opciones están disponibles:
ignore_subtemplates
es falso)parameter_index
(predeterminado: falso)getTemplate toma 3 argumentos: el nombre de la página (cadena), la plantilla o plantillas (cadena o tabla de cadenas) y una tabla de opciones opcional. Devolverá true
el texto de la plantilla solicitada o false
un motivo del error.
getTemplate admite las opciones template_index
y treat_as_regex
opciones de getParameter.
El módulo expone algunas de las funciones auxiliares que se utilizan ( matchAllTemplates
, getParameters
, y getAllParameters
) para mayor comodidad. Cada función tiene algunos comentarios encima en el código que explican su propósito general.
main
implementa {{ Valor del parámetro de plantilla }} y actúa como un contenedor de plantilla para getParameter
.
hasTemplate
implementa {{ HasTemplate }} y actúa de alguna manera como un contenedor para getTemplate
(solo proporciona si se encontró la plantilla, no el texto de la plantilla en sí).
Los casos de prueba están disponibles en Módulo discusión:Valor del parámetro de plantilla/casos de prueba
local p = {} local PrepareText = require ( "Módulo:Análisis de wikitexto" ). PrepareText función local getTitle ( title ) local success , titleObj = pcall ( mw.title.new , title ) si success entonces devuelve titleObj de lo contrario devuelve nil end end --string.gmatch comprobará el bloque más grande que pueda sin volver a escanear lo que hay dentro, pero necesitamos lo que hay dentro función local matchAllTemplates ( str ) local matches = { } para template en string.gmatch ( str , " {%b{}}" ) hacer table.insert ( matchs , template ) local innerContent = string.sub ( template , 3 , - 3 ) para _ , subtemplate en next , matchAllTemplates ( innerContent ) hacer table.insert ( matchs , subtemplate ) end end devolver matches end --Versión bifurcada de getParameters de [[Module:Transcluder]] con características adicionales eliminadas función local escapeString ( str ) devolver string.gsub ( str , '[%^%$%(%)%.%[%]%*%+%-%?%%]' , '%%%0' ) fin de la función local getParameters ( plantilla ) parámetros locales , parameterOrder = {}, {} parámetros locales = string.match ( plantilla , '{{[^|}]-|(.*)}}' ) si params entonces recuento local = 0 - Reemplazar temporalmente las tuberías en subplantillas y enlaces wiki para evitar el caos en las subplantillas en string.gmatch ( params , '{%b{}}' ) hacer params = string.gsub ( params , escapeString ( subtemplate ), string.gsub ( subtemplate , "." , {[ "%" ] = "%%" , [ "|" ] = "@@:@@" , [ "=" ] = "@@_@@" }) ) fin para wikilink en string.gmatch ( params , '%[%b[]%]' ) hacer params = string.gsub ( params , escapeString ( wikilink ), string.gsub ( wikilink , "." , {[ "%" ] = "%%" , [ "|" ] = "@@:@@" , [ " =" ] = " @@_@@" }) ) fin para parámetro en mw.text . gsplit ( params , ' | ' ) hacer local partes = mw.text.split ( parámetro , ' = ' ) local clave = mw.text.trim ( partes [ 1 ] ) local valor si # partes == 1 entonces valor = clave count = count + 1 clave = tostring ( count ) de lo contrario valor = mw.text.trim ( tabla.concat ( partes , ' = ' , 2 ) ) fin valor = string.gsub ( string.gsub ( valor , ' @@ :@@' , '|' ), '@@_@@' , '=' ) key = string.gsub ( string.gsub ( key , '@@:@@' , '|' ), '@@_@@' , '=' ) table.insert ( parameterOrder , key ) parameters [ key ] = value end end return parameters , parameterOrder end -- Devuelve una tabla que contiene parámetros y una tabla con el orden en el que se encontró cada uno de sus valores. -- Dado que esto considera todas las subplantillas, se espera que un solo parámetro tenga múltiples valores. -- Por ejemplo, {{ABC|X={{DEF|X=Valor|Y=Otro valor}}{{ABC|X=Sí}}|Y=P}} -- Devolvería {X={"{{DEF|X=Valor|Y=Otro valor}}", "Valor", "Sí"}, Y={"Otro valor", "P"}} función local getAllParameters ( plantilla , ignore_blank , only_subtemplates ) árbolDeParámetros local = setmetatable ({}, { __index = function ( self , clave ) rawset ( self , clave ,{}) return rawget ( self , clave ) end }) parámetros locales , ordenDeParámetros = getParameters ( plantilla ) para _ , clave en ipairs ( ordenDeParámetros ) hacer valor local = parámetros [ clave ] si no ignore_blank o valor ~= "" entonces si no only_subtemplates entonces tabla.insert ( parameterTree [ key ], value ) - Inserta el valor inicial en el árbol end for subtemplate in string.gmatch ( value , "{%b{}}" ) do - Y ahora comprueba si hay subvalores local subparams = getAllParameters ( subtemplate , ignore_blank ) para subclave , subconjunto en siguiente , subparámetros hacer para _ , subvalor en ipairs ( subconjunto ) hacer tabla.insert ( parameterTree [ subclave ], subvalor ) --Y agregar cualquiera que encontremos a nuestro árbol fin fin fin fin fin devolver parameterTree fin --Punto de entrada del módulo . Devuelve un booleano de éxito y la plantilla de destino o por qué falló función p.getTemplate ( página , plantillas , opciones ) si no plantillas entonces --Parámetros obligatorios devolver falso , "Falta el parámetro obligatorio 'plantillas'" fin opciones = opciones o { } local template_index = tonumber ( options.template_index ) o 1 local treat_as_regex = opciones . treat_as_regex o false si type ( templates ) == "string" entonces -- TODO: Encontrar una buena forma de permitir especificar múltiples plantillas a través de la invocación de plantilla -- (Los módulos pueden proporcionar una tabla, por lo que no hay preocupaciones allí) -- Dividir con comas es una mala idea (muchas plantillas tienen una coma en su nombre) plantillas = { plantillas } fin local título = getTitle ( página ) si título == nil entonces devuelve false , "El título solicitado no existe" fin local contenido = PrepareText ( título : getContent () o "" ) local foundTemplates = 0 para _ , plantilla en siguiente , matchAllTemplates ( contenido ) hacer para _ , wantedTemplate en pares ( plantillas ) hacer si no tratar_como_regex entonces wantedTemplate = escapeString ( wantedTemplate ) fin local firstLetter = string.sub ( wantedTemplate , 1 , 1 ) local firstUpper , firstLower = firstLetter : upper (), firstLetter : lower () si firstUpper ~= firstLower entonces wantedTemplate = "[" .. firstUpper .. firstLower .. "]" .. string.sub ( wantedTemplate , 2 ) fin si string.match ( plantilla , "^{{%s*" .. wantedTemplate .. "%s*[|}]" ) entonces foundTemplates = foundTemplates + 1 si foundTemplates == template_index entonces --Se encontró nuestra plantilla deseada devuelve verdadero , plantilla fin fin fin fin devuelve falso , "No se encontró una plantilla válida" fin --Punto de entrada del módulo. Devuelve un valor booleano de éxito y el valor del parámetro de destino o por qué falló function p . getParameter ( page , templates , parameter , options ) if not ( templates and parameter ) then --Required parameters return false , "Faltan los parámetros requeridos 'templates' y 'parameter'" end parameter = tostring ( parameter ) --Forzar consistencia options = options or {} local success , text = p . getTemplate ( page , templates , options ) if not success entonces devuelve éxito , texto de lo contrario local parameter_index = tonumber ( options.parameter_index ) o 1 local ignore_subtemplates = options.ignorar_subtemplates o falso local only_subtemplates = options.only_subtemplates o falso local ignore_blank = options.ignorar_blank o falso local valor si ignore_subtemplates entonces valor = getParameters ( texto ) [ parámetro ] o " " de lo contrario local params = getAllParameters ( texto , ignore_blank , only_subtemplates ) valor = params [ parámetro ] [ índice_parámetro ] o " " fin valor = string.gsub ( valor , " < / ?%a*include%a*>" , " " ) valor = mw.text.trim ( valor ) --técnicamente incorrecto en algunos casos , pero no es un gran problema devuelve verdadero , mw.text.decode ( valor ) --decodificar debido a PrepareText fin fin --Punto de entrada de plantilla . Devuelve "sí" o nada dependiendo de si se encuentra la plantilla deseada . Devolverá un texto de error si no se proporciona ninguna plantilla. function p . hasTemplate ( frame ) local args = require ( 'Module:Arguments' ). getArgs ( frame ) local yesno = require ( "Module:Yesno" ) local page = args [ 1 ] o args . page local template = args [ 2 ] o args . template local template_index = tonumber ( args [ 3 ] o args . N ) o 1 si no es template o template == "" entonces devuelve '<span class="error">No se proporcionó ninguna plantilla para hasTemplate</span>' fin local follow = yesno ( args . follow ) o false si follow entonces page = require ( "Module:Redirect" ). luaMain ( page ) fin local options = { template_index = template_index , treat_as_regex = yesno ( args . treat_as_regex ) o false , } local success , _ = p . getTemplate ( page , template , options ) devuelve success y "yes" o "" fin --Template punto de entrada para getParameter. Devuelve una cadena vacía en caso de error function p . main ( frame ) local args = require ( 'Module:Arguments' ). getArgs ( frame , { wrappers = ' Plantilla:Valor del parámetro de plantilla' } ) local yesno = require ( " Módulo : Yesno " ) local options = { template_index = args [ 3 ] o args.template_index , parameter_index = args [ 5 ] o args.parameter_index , ignore_subtemplates = yesno ( args.ignore_subtemplates o args . ist ) o falso , only_subtemplates = yesno ( args.only_subtemplates ) o falso , ignore_blank = yesno ( args.ignore_blank ) o falso , treat_as_regex = yesno ( args.treat_as_regex ) o falso , } página local = args [ 1 ] o args.page plantilla local = args [ 2 ] o args.template parámetro local = args [ 4 ] o args.parámetro éxito local , resultado = p.getParameter ( página , plantilla , parámetro , opciones ) si no es éxito entonces devuelve " " de lo contrario si args.dontprocess entonces devuelve resultado de lo contrario devuelve frame : preprocess ( resultado ) fin fin fin --Compatibilidad con versiones anteriores p.getValue = p.getParameter --Puntos de entrada de módulo potencialmente útiles p.matchAllTemplates = matchAllTemplates p .obtenerParámetros = obtenerParámetros p . obtenerTodosLosParámetros = obtenerTodosLosParámetros return p