stringtranslate.com

Módulo:Navbox

require ( 'strict' ) local  p  =  {} local  cfg  =  mw . loadData ( 'Module:Navbox/configuration' ) local  inArray  =  require ( "Module:TableTools" ). inArray local  getArgs  -- inicializado de forma diferida local  format  =  string.format function p . _navbox ( args ) local function striped ( wikitext , border ) -- Devuelve el wikitexto con marcadores reemplazados para franjas pares/impares. -- Los navboxes secundarios (subgrupos) se marcan con una categoría que es eliminada -- por los navboxes primarios. El resultado es que la categoría muestra todas las páginas -- donde un navbox secundario no está contenido en un navbox primario. local orphanCat = cfg . category . orphan if border == cfg . keyword . border_subgroup and args [ cfg . arg . orphan ] ~= cfg . keyword . orphan_yes then -- Sin cambios; la segmentación se produce en el cuadro de navegación más externo. return wikitext .. orphanCat end local first , second = cfg . class . navbox_odd_part , cfg . class . navbox_even_part if args [ cfg . arg . evenodd ] then if args [ cfg . arg . evenodd ] == cfg . keyword . evenodd_swap then first , second = second , first else first = args [ cfg . arg . evenodd ] second = first end end local changer if                                       primero  ==  segundo  entonces cambiador = primero de lo contrario índice local = 0 cambiador = función ( código ) si código == '0' entonces -- La ocurrencia actual es para un grupo antes de una tabla anidada. -- Establézcalo en primero como una clase válida aunque sin sentido. -- La siguiente ocurrencia será la primera fila después de un título -- en un subgrupo y también será primero. índice = 0 devolver primero fin índice = índice + 1 devolver índice % 2 == 1 y primero o segundo fin fin local regex = orphanCat : gsub ( '([%[%]])' , ' %%%1' ) devolver ( wikitexto : gsub ( regex , '' ): gsub ( cfg.marker.regex , changer )) -- () omite el recuento de gsub fin función local processItem(item, nowrapitems ) si artículo : sub ( 1 , 2 ) == ' { | ' entonces -- Aplicar nowrap a líneas en una tabla no tiene sentido. -- Agrega nuevas líneas para compensar el recorte de x en |parm=x en una plantilla. return ' \n ' .. item .. ' \n ' end if nowrapitems == cfg . keyword . nowrapitems_yes then local lines = {} for line in ( item .. ' \n ' ): gmatch ( '([^ \n ]*) \n ' ) do local prefix , content = line : match ( '^([*:;#]+)%s*(.*)' ) if prefix and                                                                    no  contenido : match ( cfg.pattern.nowrap ) entonces  linea = format ( cfg.nowrap_item , prefix , content ) fin tabla.insert ( lineas , línea ) fin elemento = tabla.concat ( lineas , ' \ n ' ) fin si elemento : match ( ' ^ [ * : ; # ] ' ) entonces return ' \ n ' .. elemento .. ' \ n ' fin return elemento fin función local has_navbar ( ) return args [ cfg.arg.navbar ] ~ = cfg.keyword.navbar_off y args [ cfg.arg.navbar ] ~ = cfg.keyword .navbar_plain y ( args [ cfg . arg . name ] o mw . getCurrentFrame (): getParent (): getTitle (): gsub ( cfg . pattern . sandbox , '' ) ~= cfg . pattern . navbox ) fin -- extrae el color del texto de css, que es el único CSS en línea permitido para la barra de navegación función local extract_color ( css_str ) -- devuelve nil porque navbar lleva su argumento a mw.html que maneja -- nil elegantemente, eliminando el atributo de estilo asociado return mw . ustring . match ( ';' .. css_str .. ';' , '.*;%s*([Cc][Oo][Ll][Oo][Rr]%s*:%s*.-)%s*;' ) o nil fin de la función local renderNavBar (                                       titleCell ) si tiene_navbar () entonces local navbar = require ( 'Módulo:Navbar' ). _navbar titleCell : wikitext ( navbar { [ cfg . navbar . name ] = args [ cfg . arg . name ], [ cfg . navbar . mini ] = 1 , [ cfg . navbar . fontstyle ] = extract_color ( ( args [ cfg . arg . basestyle ] o '' ) .. ';' .. ( args [ cfg . arg . titlestyle ] o '' ) ) }) fin fin función local renderTitleRow ( tbl ) si no args [ cfg . arg . título ] entonces devuelve fin titleRow local = tbl : etiqueta ( ' tr ' ) titleCell local = titleRow : etiqueta ( ' th ' ) : attr ( ' scope ' , ' col ' ) titleColspan local = 2 si args [ cfg.arg.imageleft ] entonces titleColspan = titleColspan + 1 fin si args [ cfg.arg.image ] entonces titleColspan = titleColspan + 1 fin titleCell : cssText ( args [ cfg.arg.basestyle ] ) : cssText ( args [ cfg.arg.basestyle ] )                                                    . arg . titlestyle ]) : addClass ( cfg . class . navbox_title ) : attr ( 'colspan' , titleColspan ) renderNavBar ( titleCell ) titleCell : tag ( 'div' ) -- id para aria-labelledby atributo : attr ( 'id' , mw . uri . anchorEncode ( args [ cfg . arg . title ]) : addClass ( args [ cfg . arg . titleclass ]) : css ( 'font-size' , '114%' ) : css ( 'margin' , '0 4em' ) : wikitext ( processItem ( args [ cfg . arg . title ])) fin de la función local getAboveBelowColspan () ret local = 2 si args [ cfg . arg . imageleft ] entonces ret = ret + 1 fin si args [ cfg . arg . image ] entonces ret = ret + 1 fin devolver ret fin función local renderAboveRow ( tbl ) si no args [ cfg . arg . above ] entonces devolver fin tbl : etiqueta ( 'tr' ) : etiqueta ( 'td' ) : addClass ( cfg . class . navbox_abovebelow ) : addClass ( args [ cfg . arg . aboveclass                                 ]) : cssText ( args [ cfg.arg.basestyle ] ) : cssText ( args [ cfg.arg.abovestyle ] ) : attr ( ' colspan ' , getAboveBelowColspan ( ) ) : tag ( ' div ' ) -- id para el atributo aria - labelledby , si no hay título : attr ( ' id ' , ( no args [ cfg.arg.title ] ) y mw.uri.anchorEncode ( args [ cfg.arg.above ] ) o nulo ) : wikitext ( processItem ( args [ cfg.arg.above ] , args [ cfg.arg.nowrapitems ] ) ) fin de la función local renderBelowRow ( tbl ) si no es args [ cfg.arg . abajo ] luego regresa fin tbl : etiqueta ( 'tr' ) : etiqueta ( 'td' ) : addClass ( cfg . class . navbox_abovebelow ) : addClass ( args [ cfg . arg . belowclass ]) : cssText ( args [ cfg . arg . basestyle ]) : cssText ( args [ cfg . arg . belowstyle ]) : attr ( 'colspan' , getAboveBelowColspan ()) : etiqueta ( 'div' ) : wikitext ( processItem ( args [                cfg . arg . abajo ],  args [ cfg . arg . nowrapitems ])) fin de la función local renderListRow ( tbl , index , listnum , listnums_size ) fila local = tbl : etiqueta ( 'tr' ) si índice == 1 y args [ cfg . arg . imageleft ] entonces fila : etiqueta ( 'td' ) : addClass ( cfg . class . noviewer ) : addClass ( cfg . class . navbox_image ) : addClass ( args [ cfg . arg . imageclass ]) : css ( 'width' , '1px' ) -- Minimizar ancho : css ( 'padding' , '0 2px 0 0' ) : cssText ( args [ cfg . arg . imageleftstyle ]) : attr ( 'rowspan' , listnums_size ) : etiqueta ( 'div' ) : wikitext ( processItem ( args [ cfg . arg . imageleft ]) ) fin grupo_y_num local = formato ( cfg . arg . grupo_y_num , listnum ) estilo_y_num_local = formato ( cfg . arg . groupstyle_and_num , listnum ) si args [ group_and_num ] entonces groupCell local = fila : etiqueta ( 'th' )                               -- id para el atributo aria-labelledby, si es un grupo único sin título o superior si listnum == 1 y no ( args [ cfg . arg . title ] o args [ cfg . arg . above ] o args [ cfg . arg . group2 ]) entonces groupCell : attr ( 'id' , mw . uri . anchorEncode ( args [ cfg . arg . group1 ])) fin groupCell : attr ( 'scope' , 'row' ) : addClass ( cfg . class . navbox_group ) : addClass ( args [ cfg . arg . groupclass ]) : cssText ( args [ cfg . arg . basestyle ]) -- Si no se especifica groupwidth, minimizar el ancho : css ( 'width' , args [ cfg . arg . groupwidth ] o ' 1%' ) groupCell : cssText ( args [ cfg.arg.groupstyle ] ) : cssText ( args [ groupstyle_and_num ] ) : wikitext ( args [ group_and_num ]) fin local listCell = fila : etiqueta ( ' td' ) si args [ group_and_num ] entonces listCell : addClass ( cfg.class.navbox_list_with_group ) de lo contrario listCell : attr ( ' colspan ' , 2 ) fin si no args                        [ cfg . arg . groupwidth ]  entonces listCell : css ( 'width' , '100%' ) fin local rowstyle -- normalmente nulo así que cssText(rowstyle) normalmente no agrega nada si índice % 2 == 1 entonces rowstyle = args [ cfg . arg . oddstyle ] de lo contrario rowstyle = args [ cfg . arg . evenstyle ] fin local list_and_num = format ( cfg . arg . list_and_num , listnum ) local listText = args [ list_and_num ] si inArray ( cfg . keyword . subgroups , listText ) entonces local childArgs = { [ cfg . arg . border ] = cfg . keyword . border_subgroup , [ cfg . arg . navbar ] = cfg . keyword . navbar_plain } local hasChildArgs = false para k , v en pares ( args ) hacer k = tostring ( k ) para _ , w en ipairs ( cfg.keyword.subgroups ) hacer w = w..listnum .. " _ " si ( #k > #w ) y ( k : sub ( 1 , #w ) == w ) entonces childArgs [ k : sub ( #                                                            w  +  1 )]  =  v hasChildArgs = true end end end listText = hasChildArgs and p . _navbox ( childArgs ) o listText end local oddEven = cfg . marker . oddeven if listText : sub ( 1 , 12 ) == '</div><table' then -- Suponga que list text es para un navbox de subgrupo, por lo que no hay franjas automáticas para esta fila. oddEven = listText : find ( cfg . pattern . navbox_title ) y cfg . marker . restart o cfg . class . navbox_odd_part end local liststyle_and_num = format ( cfg . arg . liststyle_and_num , listnum ) local listclass_and_num = format ( cfg . arg . listclass_and_num , listnum ) listCell : css ( 'padding' , '0' ) : cssText ( args [ cfg . arg . liststyle ]) : cssText ( rowstyle ) : cssText ( args [ liststyle_and_num ]) : addClass ( cfg . class . navbox_list ) : addClass ( cfg . class . navbox_part .. oddEven ) : addClass ( args [ cfg . arg . listclass ]) : addClass ( args [ listclass_and_num ]) : tag ( 'div' ) : css (                                 ' padding ' , ( índice == 1 y argumentos [ cfg.arg.list1padding ] ) o argumentos [ cfg.arg.listpadding ] o ' 0 0.25em ' ) : wikitext ( processItem ( listText , argumentos [ cfg.arg.nowrapitems ] ) ) si índice == 1 y argumentos [ cfg.arg .imagen ] entonces fila : etiqueta ( 'td' ) : addClass ( cfg.class.noviewer ) : addClass ( cfg.class.navbox_image ) : addClass ( args [ cfg.arg.imageclass ] ) : css ( ' width ' , '1px') - Minimizar el ancho: css ( ' padding ' , ' 0 0 0 2px ' ) : cssText ( args [ cfg.arg.imagestyle ] ) : attr ( ' rowspan ' , listnums_size ) : etiqueta ( ' div ' ) : wikitext ( processItem ( args [ cfg.arg.image ] ) ) fin fin función local has_list_class ( htmlclass ) patrones locales = { ' ^ ' .. htmlclass .. ' $ ' , ' % s ' .. htmlclass .. '$' , '^' .. htmlclass .. '%s' , '%s' .. htmlclass .. '%s' } para arg ,_                                           en  pares ( args )  hacer si tipo ( arg ) == 'string' y mw.ustring.find ( arg , cfg.pattern.class ) entonces para _ , patrón en ipairs ( patrones ) hacer si mw.ustring.find ( args [ arg ] o ' ' , patrón ) entonces devolver verdadero fin fin fin fin devolver falso fin -- hay muchas clases de listas circulando , por lo que agregamos sus TemplateStyles función local add_list_styles ( ) marco local = mw . getCurrentFrame () función local add_list_templatestyles ( htmlclass , templatestyles ) si has_list_class ( htmlclass ) entonces devuelve frame : extensionTag { name = 'templatestyles' , args = { src = templatestyles } } de lo contrario devuelve '' end end local hlist_styles = add_list_templatestyles ( ' hlist ' , cfg.hlist_templatestyles ) local plainlist_styles = add_list_templatestyles ( 'plainlist' , cfg.plainlist_templatestyles ) -- una segunda solución alternativa para [[phab:T303378]] -- cuando se solucione ese problema, podemos usar has_navbar para no emitir la etiqueta -- aquí si queremos si has_navbar () y hlist_styles == '' entonces hlist_styles = frame : extensionTag { name = 'templatestyles' , args = { origen                                                               =  cfg . hlist_templatestyles  } } fin -- hlist -> plainlist es el mejor esfuerzo para preservar el antiguo ordenamiento de Common.css. -- este ordenamiento no es una garantía porque la mayoría de los cuadros de navegación emitirán solo -- una de estas clases [hlist_note] return hlist_styles .. plainlist_styles fin de la función local needsHorizontalLists ( border ) si border == cfg . keyword . border_subgroup o args [ cfg . arg . tracking ] == cfg . keyword . tracking_no entonces devuelve falso fin devuelve no has_list_class ( cfg.pattern.hlist ) y no has_list_class ( cfg.pattern.plainlist ) fin de la función local hasBackgroundColors ( ) para _ , ingresa ipairs ( { cfg.arg.titlestyle , cfg.arg.groupstyle , cfg.arg.basestyle , cfg.arg.abovestyle , cfg.arg.belowstyle } ) hacer si tostring ( args [ clave ] ) : buscar ( ' background ' , 1 , true ) entonces devuelve verdadero fin fin devuelve falso fin de la función local hasBorders ( ) para _ , ingresa ipairs ( { cfg.arg.groupstyle , cfg.arg.basestyle , cfg.arg.abovestyle , cfg.arg .                                            función local isIllegible ( ) local styleratio = require ( ' Módulo : Contraste de color ' ) ._ styleratio para clave , estilo en pares ( args ) hacer si tostring ( clave ) : match ( cfg.pattern.style ) entonces si styleratio { mw.text .unstripNoWiki ( estilo )} < 4.5 entonces devuelve verdadero fin fin fin devuelve falso fin función local getTrackingCategories ( borde ) gatos locales = {} si needsHorizontalLists ( borde ) entonces tabla.insert ( gatos , cfg . category . horizontal_lists ) fin si tieneBackgroundColors () entonces tabla.insert ( gatos , cfg . category . background_colors ) fin si esIllegible () entonces tabla.insert ( gatos , cfg . category . illegible ) fin si tieneBorders () entonces tabla.insert ( gatos , cfg . category . borders ) fin devuelve gatos fin función local renderTrackingCategories ( constructor , borde ) título local = mw .                                                        título . getCurrentTitle () si título . namespace ~= 10 entonces devuelve fin -- no está en el espacio de plantilla subpágina local = título . subpáginaTexto si subpágina == cfg . palabra clave . subpágina_doc o subpágina == cfg . palabra clave . subpágina_sandbox o subpágina == cfg . palabra clave . subpágina_casosdeprueba entonces devuelve fin para _ , gato en ipairs ( getTrackingCategories ( borde )) hacer constructor : wikitext ( '[[Categoría:' .. gato .. ']]' ) fin fin función local renderMainTable ( borde , listnums ) tbl local = mw . html . create ( 'tabla' ) : addClass ( cfg . class . nowraplinks ) : addClass ( args [ cfg . arg . bodyclass ]) estado local = args [ cfg . arg . estado ] si args [ cfg.arg.title ] y estado ~ = cfg.keyword.state_plain y estado ~ = cfg.keyword.state_off entonces si estado == cfg.keyword.state_collapsed entonces estado = cfg.class.collapsible fin de la tabla : addClass ( cfg.class.collapsible ) : addClass                                                         ( estado  o  cfg . clase . colapso automático ) fin de la tabla : css ( 'border-spacing' , 0 ) si borde == cfg . palabra clave . borde_subgrupo o borde == cfg . palabra clave . border_none entonces tbl : addClass ( cfg . class . navbox_subgroup ) : cssText ( args [ cfg . arg . bodystyle ]) : cssText ( args [ cfg . arg . style ]) de lo contrario -- navbox normal - el bodystyle y el estilo se aplicarán a la tabla contenedora tbl : addClass ( cfg . class . navbox_inner ) : css ( 'background' , 'transparent' ) : css ( 'color' , 'inherit' ) fin tbl : cssText ( args [ cfg . arg . innerstyle ]) renderTitleRow ( tbl ) renderAboveRow ( tbl ) local listnums_size = # listnums para i , listnum en ipairs ( listnums ) hacer renderListRow ( tbl , i , listnum , listnums_size ) fin renderBelowRow ( tbl ) devolver tbl fin función local add_navbox_styles ( hide_templatestyles ) marco local = mw . getCurrentFrame () - Este es un lambda por lo que no necesita el marco como parámetro función local add_user_styles ( templatestyles )                               si  templatestyles  y  templatestyles  ~=  ''  entonces devuelve frame : extensionTag { name = 'templatestyles' , args = { src = templatestyles } } fin devuelve '' fin -- obtiene templatestyles. carga la base desde la configuración para que Lua solo necesite hacer -- el trabajo una vez de expansión de etiqueta del analizador local base_templatestyles = cfg.templatestyles local templatestyles = add_user_styles(args[cfg.arg.templatestyles]) local child_templatestyles = add_user_styles ( args [ cfg.arg.child_templatestyles ] ) -- El div ' navbox - styles ' existe para envolver los estilos y trabajar alrededor de T200206 -- de manera más elegante . En lugar de reglas combinatorias, esto termina siendo lineal -- número de reglas CSS. devuelve mw.html . create ( 'div' ) : addClass ( cfg . class . navbox_styles ) : wikitext ( add_list_styles () .. -- ver [hlist_note] aplicado a 'antes de base_templatestyles' base_templatestyles .. templatestyles .. child_templatestyles .. table.concat ( hideing_templatestyles ) ) : done () fin -- solución alternativa [[phab:T303378]] -- para cada arg: encontrar todos los marcadores de tira de templatestyles, insertarlos en una -- tabla. luego eliminar todos los marcadores de templatestyles del arg función local move_hiding_templatestyles ( args ) local gfind = string . gfind gsub local = string.gsub marcadores_de_estilos_de_plantilla locales = {} patrón_de_marcador_de_tira_local = '( \127 [^ \127 ]*UNIQ%-%-estilos_de_plantilla%-%x+%-QINU[ ^                                        \127 ]* \127 )' para k , arg en pares ( args ) hacer para marcador en gfind ( arg , strip_marker_pattern ) hacer tabla.insert ( templatestyles_markers , marcador ) fin args [ k ] = gsub ( arg , strip_marker_pattern , '' ) fin devolver templatestyles_markers fin ocultar_estilos_de_plantilla local = mover_ocultar_estilos_de_plantilla ( args ) números_de_lista locales = {} para k , _ en pares ( args ) hacer si tipo ( k ) == 'string' entonces número_de_lista local = k : match ( cfg . pattern . listnum ) si número_de_lista entonces tabla.insert ( números_de_lista , tonumber ( número_de_lista )) fin fin fin tabla.sort ( números_de_lista ) borde local = mw . text . trim ( args [ cfg.arg.border ] o args [ 1 ] o '' ) si borde == cfg.keyword.border_child entonces borde = cfg.keyword.border_subgroup fin -- renderiza el cuerpo principal del cuadro de navegación local tbl = renderMainTable ( border , listnums ) local res = mw.html.create ( ) -- renderiza el contenedor apropiado para el cuadro de navegación , en base al parámetro borde si borde                                                             ==  cfg . keyword . border_none  entonces res : nodo ( add_navbox_styles ( hide_templatestyles )) local nav = res : etiqueta ( 'div' ) : attr ( 'rol' , 'navegación' ) : nodo ( tbl ) -- aria-etiquetado por título, de lo contrario arriba, de lo contrario solo grupo si args [ cfg . arg . título ] o args [ cfg . arg . arriba ] o ( args [ cfg . arg . group1 ] y no args [ cfg . arg . group2 ]) entonces nav : attr ( 'aria-labelledby' , mw . uri . anchorEncode ( args [ cfg . arg . title ] o args [ cfg . arg . above ] o args [ cfg . arg . group1 ] ) ) de lo contrario nav : attr ( 'aria-label' , cfg . aria_label ) fin de lo contrario si border == cfg . keyword . border_subgroup entonces -- Suponemos que este navbox se está representando en una celda de lista de un navbox padre, y por lo tanto está dentro de un div con padding:0em 0.25em. -- Comenzamos con un </div> para evitar que se aplique el relleno, y al final agregamos un <div> para equilibrar el </div> del padre res : wikitext ( '</div>' ) : node ( tbl ) : wikitext ( '<div>' ) else res : node ( add_navbox_styles (                     hide_templatestyles )) local nav = res : tag ( 'div' ) : attr ( 'role' , 'navigation' ) : addClass ( cfg . class . navbox ) : addClass ( args [ cfg . arg . navboxclass ] ) : cssText ( args [ cfg . arg . bodystyle ]) : cssText ( args [ cfg . arg . style ]) : css ( 'padding' , '3px' ) : node ( tbl ) -- aria-etiquetado por título, de lo contrario arriba, de lo contrario solo grupo si args [ cfg . arg . title ] o args [ cfg . arg . arriba ] o ( args [ cfg.arg.group1 ] y no args [ cfg.arg.group2 ] ) entonces nav : attr ( ' aria - labelledby ' , mw.uri.anchorEncode ( args [ cfg.arg.title ] o args [ cfg.arg.arriba ] o args [ cfg.arg.group1 ] ) ) de lo contrario nav : attr ( ' aria - label ' , cfg.aria_label ) fin fin si ( args [ cfg.arg.nocat ] o cfg.keyword.nocat_false ) : lower ( ) ==                       cfg . keyword . nocat_false  entonces renderTrackingCategories ( res , border ) fin return striped ( tostring ( res ), border ) fin función p . navbox ( frame ) función local readArgs ( args , prefix ) -- Lee los argumentos en el orden en que serán emitidos, para hacer referencias -- numera en el orden correcto. local _ _ = args [ prefijo .. cfg . arg . title ] _ = args [ prefijo .. cfg . arg . arriba ] - Limite esto a 20 ya que cubre 'la mayoría' de los casos (eso es un SWAG) y porque - el enfoque del iterador no funcionará aquí para i = 1 , 20 do _ = args [ prefijo .. formato ( cfg . arg . grupo_y_num , i )] if inArray ( cfg . palabra_clave . subgrupos , args [ prefijo .. formato ( cfg . arg . lista_y_num , i )]) then for _ , v in ipairs ( cfg . palabra_clave . subgrupos ) do readArgs ( args , prefijo .. v .. i .. "_" ) end end end _ = args [ prefijo .. cfg . arg . abajo ] end if not getArgs then getArgs = require ( 'Módulo:Argumentos' ). getArgs end local args =                                                        getArgs ( frame ,  { wrappers  =  { cfg.pattern.navbox } } ) readArgs ( args , " " ) return p._navbox ( args ) end return p