Módulo:ICP

De Wikisource, la biblioteca libre.
Documentación del módulo


Uso

Usado por {{ICP}}
Esta documentación está transcluida desde Módulo:ICP/doc.
Los editores pueden experimentar en la zona de pruebas de este módulo.
Por favor, añade las categorías e interwikis a la subpágina de documentación. Subpáginas de este módulo.

local p = {}
local altparams= {['c-an']='capítulo-ancho',
				  ['c-al']='capítulo-alineación',
				  ['c-val']='capítulo-valineación',
				  ['e-an']='entrada-ancho',
				  ['e-al']='entrada-alineación',
				  ['e-val']='entrada-valineación',
				  ['e-des']='entrada-desplazamiento',
				  ['es-an']='espacio-ancho',
				  ['n-an']='espacio-ancho',
				  ['n-al']='número-alineación',
				  ['n-val']='número-valineación',
				  ['t-an']='tercer-ancho',
				  ['t-al']='tercer-alineación',
				  ['t-val']='tercer-valineación',
				  ['an']='width',
				  ['ancho']='width',
}

function entradadiv(text, argus)
	local entrada = mw.html.create() -- cuerpo principal de la plantilla
	-- icp1 = div principal
    local icp1 = entrada:tag('div')
    				:addClass('icp1')
    				:css({['width']=argus['entrada-ancho'],
    					['text-align']=argus['entrada-alineación'],
    					['padding-left']=argus['sangría'],
    					['text-indent']=(argus['sangría'] and '-'..argus['sangría']),
    				})
    -- icpito = pequeño div que oculta el inicio de los "puntos"
	local icpito = icp1:tag('span')
					:addClass('icpito')
					:css({['width']=argus['sangría'],
						['background']=argus['fondo'],
					})
					:wikitext(' ')
	-- icp2 = span que contiene el texto de la entrada
	local icp2 = icp1:tag('span')
					:addClass('icp2')
					:css({['background']=argus['fondo']})
					:wikitext(text)
	-- icp3 = los "puntos"
	local icp3 = icp1:tag('span')
					:addClass('icp3 ws-noexport')
					:css({['letter-spacing']= argus['espacio']})
					:wikitext(string.rep((argus['símbolo'] or '.'),
										 (argus['reps'] or 200)))
	-- icp4 = entrada-final
	local icp4 = icp1:tag('span')
					:addClass('icp4')
					:css({['background']=argus['fondo'],
						['padding-left']=argus['sangría'],
					})
					:wikitext(argus['entrada-final'] or ' ')
	return tostring(entrada)
	
end
function p.ICP( frame ) -- función principal para llamar desde {{ICP}}
    local argus = (frame.args[1] ~= nil) and frame.args or frame:getParent().args

    for k,v in pairs(altparams) do --parámetros con nobmres alternativos.
		if argus[k] and not argus[v] then
			argus[v] = argus[k]
		end
	end

	local html = mw.html.create() -- cuerpo principal de la plantilla
    local tab = html:tag(argus['tag'] or 'table')
    				:addClass('ws-summary')
    				:css({['border-collapse']='collapse', ['border-spacing']='0',
    					['empty-cells']='hide', ['width']=(argus['width'] or '100%'),
    					['margin-left']='auto', ['margin-right']='auto',
    					['font-size']=(argus['tamaño'] or '100%')})
    if argus['estilo'] then  --estilo personalizado, al final para poder sobreescribir todo
		tab:cssText(argus['estilo'])
	end
	local celdasEnFila={}
	local cellcount = 0
	for k, v in pairs( argus ) do
        if type(k) == 'number' then 
            if cellcount < k then  --contar parámetros sin nombre
                cellcount = k
            end
            
        elseif type(k) == 'string' then
          	local rnglow
           	local rnghigh
			
           	rnglow, rnghigh = k:match( '^%s*nfila(%d+)a(%d+)%s*$' )
           	unirow = k:match( '^%s*nfila(%d+)%s*$' )
           	if rnglow and rnghigh then -- si los dos son válidos
           		if tonumber(rnglow) > tonumber(rnghigh) then	-- si el orden está mal, invertir
           			rnglow, rnghigh = rnghigh, rnglow
           		end
            		
           		for rrow = rnglow, rnghigh, 1 do
           			celdasEnFila[rrow] =  celdasEnFila[rrow] or tonumber(v)
           		end
        	elseif unirow then
        		celdasEnFila[tonumber(unirow)] = tonumber(v)
        	end
        	
        end
    end
       -- construir filas
       local arguactual=1
       local filaactual=1
       local filasglobal=tonumber(argus['n']) or 3
       local celdasactual = celdasEnFila[1] or filasglobal
       celdasEnFila['G'] = filasglobal

       local maxrow = 1
       
       for k,v in pairs(celdasEnFila) do
			if v > maxrow then maxrow = v end
       end

       while cellcount >0 do
             celdasactual = celdasEnFila[filaactual] or filasglobal
             local primerovacia=maxrow-celdasactual+1
             local row=tab:tag('tr')
             
             for a = 1, celdasactual, 1 do
             if argus[arguactual] then
             	---- formato para 3 celdas por fila
 	        	if celdasactual==3 then
             		if a==1 and argus[arguactual] =='' then
						--row:tag('td'):css('padding','0')
						primerovacia=maxrow-1
					elseif a==1 then
             			row:tag('td'):css({['width']=argus['capítulo-ancho']or '2.5em', ['max-width']=argus['capítulo-ancho'] or '2.5em', ['padding']='0.0em 0.5em 0.0em 0.0em', 
             				['text-align']=argus['capítulo-alineación'] or 'right', ['vertical-align']=argus['capítulo-valineación'] or 'middle'})
             				:wikitext(argus[arguactual])
             		elseif a==2 then
             			row:tag('td'):attr('colspan',primerovacia)
             			:wikitext(entradadiv(argus[arguactual], argus))
             		elseif a==3 then
						row:tag('td'):css({['text-align']=argus['número-alineación'] or 'right', ['vertical-align']=argus['número-valineación'] or 'bottom',
							['padding-left']=argus['margen'] or '1em', ['width']=argus['espacio-ancho'] or '2.0em'})
						    :wikitext(argus[arguactual])             		
             		end
              	---- formato para 2 celdas por fila
         	    elseif celdasactual == 2 then
         			if a==1 then
         				if maxrow > 2 then row:tag('td') end
         				
         				row:tag('td')
         				:wikitext(entradadiv(argus[arguactual], argus))
         			else
         				row:tag('td'):css({['text-align']=argus['número-alineación'] or 'right',
         					['vertical-align']=argus['número-valineación'] or 'bottom',
         					['padding-left']=argus['margen'] or '1em',
         					['width']=argus['espacio-ancho'] or '2.0em'})
						    :wikitext(argus[arguactual]) 
         			end
         		---- formato para 1 celda por fila
         		elseif celdasactual == 1 then
         			row:tag('td'):attr('colspan',maxrow):wikitext(argus[arguactual])
         		---- formato para 4 celdas por fila
         		elseif celdasactual == 4 then
         			if a==1 and argus[arguactual] =='' then
						--row:tag('td'):css('padding','0')
						primerovacia=maxrow-1
					elseif a==1 then
             			row:tag('td'):css({['width']=argus['capítulo-ancho']or '2.5em', ['max-width']=argus['capítulo-ancho'] or '2.5em', ['padding']='0.0em 0.5em 0.0em 0.0em', 
             				['text-align']=argus['capítulo-alineación'] or 'right', ['vertical-align']=argus['capítulo-valineación'] or 'middle'})
             				:wikitext(argus[arguactual])
             		elseif a==2 then
             			row:tag('td'):attr('colspan',primerovacia)
             			:wikitext(entradadiv(argus[arguactual], argus))
             		elseif a==3 then
             			row:tag('td'):wikitext(argus[arguactual]):css({['width']=argus['tercer-ancho'] or '15%', ['padding-left']=argus['margen'] or '1em', ['text-align']=argus['tercer-alineación'] or 'right',['vertical-align']=argus['tercer-valineación'] or 'middle'})
             		elseif a==4 then
						row:tag('td'):css({['text-align']=argus['número-alineación'] or 'right', ['vertical-align']=argus['número-valineación'] or 'bottom',
							['padding-left']=argus['margen'] or '1em', ['width']=argus['espacio-ancho'] or '2.0em'})
						    :wikitext(argus[arguactual])             		
             		end		
         		elseif argus[arguactual] ~='' then
         			row:tag('td'):wikitext(argus[arguactual])
         		end
         	end
             	arguactual = arguactual + 1
             	cellcount  = cellcount - 1
             end
             filaactual = filaactual + 1
       end
    --[['<span style="float:left;letter-spacing:' .. (args['leaderspacing'] or '4px') .. ';">' ..
          string.rep((args['leadersym'] or '.'),(args['leaderrepeat'] or 384)) ..
          '</span>]]

    
	if argus.autolinks then
		return require('Módulo:Autolinks')._autolink{tostring(html), argus.autolinks}
	end
    return tostring(html)
end


return p