Module:PdsM

La bibliothèque libre.

La documentation pour ce module peut être créée à Module:PdsM/Documentation

--[[  
Le module PdsM permet évite de répéter le modèle Pds sur plusieurrs ligne.
Il permet aussi d’intercaler un texte décoré avec WsCss 
décoré du préfixe style:: en argument de droite

EXEMPLE :
{{#invoke:PdsM|construire
        |texte de gauche|texte de droite
        |texte de gauche|style::WsCss
        |l=largeur totale (ex. : 25em)
        |x=espacement en em qui s’adapte à la taille de la police de caractère
        |ld=largeur de la section réservée au texte de droite (ex : 10em)
        |altd=alignement du texte de droite (altd=g)
        |m=motif à pas fixe fin(2px) ou xfin(1px)
        |indent=indentation en em du texte de gauche + ou - (ex. : 2)
}}
]]


local p = {}
local szMsg = ''
local szCode = ''

-- Fonction recopiée de module:Table
-- https://fr.wikisource.org/w/index.php?title=Module:Table&oldid=10679048
function p.out_arg( arg, default )
    if arg and arg ~= '' then
        return arg
    end
    return default
end

function p.construire( frame )

    -- Chaque ligne comprend 2 éléments par défaut
    local nNbreColonnes = 2

    --------------------------------------------------------
    -- Noter les paramètres nommés dans l'appel du modèle :
    -- 
    -- Il s'agit de tous les paramètres du module:Table
    -- (voir documentation de modèle:Table)
    --------------------------------------------------------
	local args = {}
	local div1 = '<div  style= "position:relative; max-width:'
	local div2 = '<div  style="position:relative; '
	local divf = ''
	local div3 = '<div  style="position:relative; z-index:2; '
	local indp = ''
	local divd = ''
    local nNbreParamSansNom = 0
	args = frame.args
	if args[1] == nil then
		args = frame:getParent().args
	end

	local x = args['x'] or .5
	if args['l'] ~=nil then 
		div1 = div1 .. args['l'] 
	else
		div1 = div1 .. '100%'
	end
	div1 = div1 .. '; margin-bottom:0;">'
	local indent = tonumber(args['indent'] or 0)
	if args['m'] ~=nil then 
		divf = '<div style="position:absolute; z-index:1; bottom:.4em; '
		if indent < 0 then
			divf = divf .. 'width:calc(100% - ' .. -indent .. 'em; ' ..
				'margin-left:' .. -indent .. 'em; border-bottom:'
		else
			divf = divf .. 'width:100%; border-bottom:'
		end
		if args['m'] == 'fin' then
			divf = divf .. '2px dotted"></div>'
		else
			divf = divf .. '1px dotted"></div>'
		end
	end	
	if indent < 0 then
		div3 = div3 .. 'margin-left:' .. -indent .. 'em; ' ..
			'text-indent:' .. indent .. 'em; ' ..
			'width:calc(100% + ' .. indent .. ')em; '
	else
		div3 = div3 .. 'width:100%; '
	end
	if args['m'] ==nil then
		div3 = div3 .. 'background-image:radial-gradient(black 1px, white 0px); '
			.. 'background-size: ' .. x .. 'em ' .. x .. 'em; ' 
			.. 'background-repeat:repeat-x; ' 
			.. 'background-position: left bottom ' .. .4 - x/2 .. 'em;"'
	end
	div3 = div3 .. '> <span style="z-index:3; padding-right:'
	if args['m'] ~=nil then
		div3 = div3 .. '2px; '
	else 
		div3 = div3 .. x/2 .. 'em; '
	end
-- à faire background white
	if indent > 0 then
		indp = '<span style="display:inline-block;min-width:' .. indent .. 'em; '
			.. 'max-width:' .. indent .. 'em">&#65279;</span>'
	end
	divd = divd .. '<div style="float:right"><div style="position:absolute; ' 
		.. 'z-index:2; bottom:0; right:0; text-indent:0; '
	if args['ld'] ~=nil then
		divd = divd .. 'width:' .. args['ld'] .. '; '
	end
	if args['altd'] ~= nil then
		if args['altd'] == 'd' then
			divd = divd .. 'text-align:right;'
		elseif args['altd'] == 'g' then
			divd = divd .. 'text-align:left;'
		end
	end
	divd = divd .. 'white-space:nowrap"><span style="z-index:2; background: white;'
	if args['m'] ~= nil then
		divd = divd .. 'padding-left:4px;" '
	else 
		divd = divd .. 'padding-left:' .. x*1.5 .. 'em;" '
	end	
	
	
    -- Noter les paramètres sans nom dans l'appel du modèle
    -- qui doivent être inscrits en trio : section, titre et page (même vide)
    -------------------------------------------------------
    local aParamSansNom = {}

    local szInfo = ''
    for i, v in ipairs(args) do
      aParamSansNom[i] = mw.text.trim(v)
      nNbreParamSansNom = nNbreParamSansNom + 1
      szInfo = szInfo .. 'Paramètre ' .. i .. ' : ' .. aParamSansNom[i] .. '<br>\n'
      if nNbreParamSansNom % nNbreColonnes == 0 then
        szInfo = szInfo .. '<br>\n'
      end
-- szCode = szCode .. i .. ' : ' .. aParamSansNom[i] .. '<br>\n'
    end
    if nNbreParamSansNom % nNbreColonnes ~= 0 then
      szMsg = '<span style="font-size:200%; color:red;">Prière de saisir ' .. nNbreColonnes .. ' paramètres par ligne.</span>' .. '<br>\n' .. szInfo
    end
	if args[1] == nil or args[1] == '' then
		aParamSansNom[1] = '&#8203;'
		aParamSansNom[2] = '&#8203;'
		args['m'] = 'dots'
		args['sp'] = args['sp'] or '1'
		nNbreParamSansNom = 2
		args['pad'] = 0
	end
	--if true then return nNbreParamSansNom end
    ---------------------
    -- Créer le code HTML
    ---------------------
    -- Pour chaque paire définissant une ligne, ajouter le code pertinent
    --------------------------------------------------------------------
	local util = require("Module:StyleM")
    for n = 1, nNbreParamSansNom, nNbreColonnes do 
    	--if true then return aParamSansNom[n + 1] end
      if mw.ustring.sub(aParamSansNom[n + 1],1,7) == 'style::' then
      	local style = mw.ustring.sub(aParamSansNom[n + 1],8)
      	szCode = szCode .. '<div style = "' .. util.toCss(style 
      		.. ';text-align:center; ') .. '>' .. aParamSansNom[n] .. '</div>'
      elseif args['m'] ~=nil then
      	if args['m'] == "dots" then
      		szCode = szCode .. '<div style="display:flex; max-width:100%;'
      		if args['l'] ~=nil then 
      			szCode = szCode .. 'width:' .. args['l']
      		end
      		szCode = szCode .. ';" ><span style="padding-right:' .. (args['pad'] or '.3') .. 'em; '
      		if indent > 0 then
      			szCode = szCode .. 'text-indent:' .. indent .. 'em ; '
      		end
      		szCode = szCode .. '">' .. aParamSansNom[n] .. '</span>'
      			.. '<div class="no_erreurs_communes" ' 
      			.. 'style=" flex: 1; direction: rtl; overflow: hidden; '
      			.. 'white-space:nowrap; font-weight:bold; letter-spacing:'
      			.. (args['sp'] or '.3') .. 'em">'
      			.. '.........................................................'
      			.. '.........................................................'
      			.. '............................................</div>'
      		if aParamSansNom[n + 1] ~= '' then
      			szCode = szCode .. ' <span style="padding-left:' .. (args['pad'] or '.3') .. 'em; '
      			if args['ld'] ~=nil then
      				szCode = szCode .. 'width:' .. args['ld'] .. '; '
      			end
      			if args['altd'] ~=nil then
      				if args['altd'] == 'd' then
      					szCode = szCode .. 'text-align:right; '
      				end
      			end
      			szCode = szCode .. '">' .. aParamSansNom[n + 1] .. '</span></div>'
      		end

      		
      	end
      else
    	szCode = szCode .. div1 .. div2
    	if aParamSansNom[n + 1] ~= '' and args['ld'] ~=nil then
    		szCode = szCode .. 'margin-right:' .. args['ld'] .. '">'
    	else 
    		szCode = szCode .. '">'
    	end	
    	szCode = szCode .. divf .. div3
    	if aParamSansNom[n] == '' then 
    		aParamSansNom[n] = '&nbsp;' 
    	else 
    		szCode = szCode .. 'background: white; '
    	end
    	szCode = szCode .. '">' .. indp .. aParamSansNom[n] .. '</span></div></div>'
    	if aParamSansNom[n + 1] ~= '' then
    		szCode = szCode .. divd .. '>' .. aParamSansNom[n + 1]
    			.. '</span></div></div>'
    	end
    	szCode = szCode .. '</div><div style="clear:right;"></div>'
      end
    end

    if string.len( szMsg ) ~= 0 then
      szCode = szMsg
    end

    return szCode
end


return p