Module:PliMulti

La bibliothèque libre.

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

-- =p.getPage("00:13;01:31;02:41;03:133;03/01:138;03/02: 287;03/03:313;04:337;05:375;06:473;07:519;08:539",520)
-- Traditions indiennes du Canada Nord-Ouest/08
local p = {}
local t = {}       --nom de la sous-page:nopage du f-s 
local ecarts = {}  --table des changements d’écarts (nopage du livre:écart avec page du f-s)
local sep1 = ':'
local sep2 = ";"
local pageRoot 
local ns
local pageNom
local pageObj
local pageIndex =''
--local test
--local data = mw.loadData( 'Module:PliMulti/Data' )

function p.compose(frame)
	local args = frame.args
	local szCode = ''
--	initSpace()
	if args[1] == nil then
		args = frame:getParent().args
	end

	local ecart = args['ecart'] --or '0'
	if ecart and tonumber(ecart) == nil then
		return 'L’argument ecart doit être numérique'
	end
	sep1 = args['sep1'] or ':'
	sep2 = args['sep2'] or ';'
	if args['ecarts'] ~= nil then
		initSpace()
		for i, v12 in ipairs( mw.text.split(args['ecarts'],sep2, true ) ) do
			v = mw.text.split( v12, sep1, true ) 
			table.insert(ecarts, { tonumber(v[1]), tonumber(v[2]) })
		end
	elseif ecart then
		initSpace()
		table.insert(ecarts, { 1, ecart })
	else
		loadData()
	end
	local parg = args['parg'] or '.'

	local aParamSansNom = {}
    local nNbreParamSansNom = 0
    local szInfo = ''
    local styleP
    
    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 % 3 == 0 then
        szInfo = szInfo .. '<br />\n'
      end
    end
	if nNbreParamSansNom % 3 ~= 0 then
      return '<span style="font-size:200%; color:red;">Prière de saisir 3 ' 
        .. 'paramètres par ligne.</span><br />\n' .. szInfo
    end
	
	if ns == '' then 
		if args['index'] == nil  then
			-- pour fins de test
			--p.index(frame)
			--if t then return mw.dumpObject(t) end
		else
			for i, v12 in ipairs(mw.text.split(args['index'],sep2, true)) do
				v = mw.text.split(v12,sep1, true)
				table.insert(t, { v[1], tonumber(v[2]) })
			end
		end
			
	end
	if args['mode'] == 'table' then
		if args['classe'] and args['classe'] ~= '' then
			args['classe'] = args['classe'] .. ',no_erreurs_communes'
		else
			args['classe'] = 'no_erreurs_communes'
		end 
	end
	if args['classe'] and args['classe'] ~= '' then
		szCode =szCode .. '<div class="' .. args['classe'] ..'">'
	end
	if args['mode'] == 'table'  then
	    for n = 1, nNbreParamSansNom, 3 do 
	      szCode = szCode .. '<div style="display:flex; ;" ><span style=' .. 
	    	'"padding-right:.3em;text-align-last:right;max-width:100% ">' .. aParamSansNom[n] .. '</span>'
	      szCode = szCode .. '<div style=" flex: 1; direction: rtl; ' .. 
	    	'overflow: hidden; white-space:nowrap; font-weight:bold; ' .. 
	    	'letter-spacing:.3em">.....................................' .. 
	    	'..........................................................' .. 
	    	'............................................................' .. 
	    	'</div> <div style="display:flex;padding-left:.3em;align-items: end; ">' .. 
	    	lienPage(aParamSansNom[n + 1])
	      szCode = szCode .. '</div></div>\n' .. aParamSansNom[n + 2]
	    end		
	else
		szCode = szCode .. '<p>'
	    for n = 1, nNbreParamSansNom, 3 do 
	      if n > 3 then
	      	if aParamSansNom[n - 1] == parg or aParamSansNom[n - 1] == '' then
	      		szCode = szCode .. '<p>'
	      	end
	      end
	      szCode = szCode .. mw.ustring.gsub(aParamSansNom[n],'%s*\n%s*',' ') --.. ' '
	      szCode = szCode .. stylePage( lienPage(aParamSansNom[n + 1]), args['stylep'] )
	      szCode = szCode .. separator(aParamSansNom[n + 2], parg)
	    end	
	end
	if args['classe'] and args['classe'] ~= '' then
		szCode =szCode .. '</div>'
	end
	return szCode
	--return mw.dumpObject(t)
end

function stylePage( page, style )
	if style and style ~= '' then
		page = '<span style="' .. style .. '">' .. page ..'</span>'
	end
	return page
end

function lienPage( s )
	local wss = ''
    local baseP = pageObj.baseText
	if s == '' then return '' end
	for i, noPagePrel in ipairs(mw.text.split(s,',', true)) do
		noPagePrel = mw.text.trim(noPagePrel)
		esp = mw.ustring.match(noPagePrel,'&....;') --si &#160; modèle lié
		noPage = mw.ustring.match(noPagePrel, (esp or '') .. '([%d]+)')
		-- un no page doit être numérique
		if tonumber(noPage) ~= nil then
			if wss ~= '' then wss = wss .. ',' end
			if not esp then wss = wss .. ' ' end
			if ns == 'Page' then
			  lien = '[[Page:' .. baseP .. '/' ..  
			    (noPage + getEcart(noPage)) .. '|' .. noPage .. ']]'
			    wss = wss .. mw.ustring.gsub(noPagePrel, noPage, lien, 1 )
			elseif pageObj.subpageText == "Texte entier" then
		 	  lien = '[[' .. pageObj.text .. '#' .. noPage .. '|' .. noPage .. ']]' 
		 	  wss = wss ..  mw.ustring.gsub(noPagePrel, noPage, lien, 1 ) 
			elseif ns == '' then
			   -- s’il n’y a pas de sommaire cherche le no de page dans pageRoot
			   lien = getPage(noPage + getEcart(noPage)) or ''
			   if lien ~= '' then
			   	lien = '/' .. lien
			   end
			   lien = '[[' .. pageRoot .. lien .. '#' 
			    .. noPage .. '|' .. noPage .. ']]'
			   wss = wss .. mw.ustring.gsub(noPagePrel , noPage, lien, 1 )
			end
		else -- la page finit par une virgule et la liste se poursuit à la pge suiv.
			wss = wss .. ', ' .. (noPage or '')  
		end
	end
	return wss
end

function getPage(noPage)
	for i, p1 in ipairs(t) do
	  if noPage and t[i + 1] then --and #t > i then # ne peut plus être utilisé avec mw.loadData
		p2 = t[i + 1]
			if noPage >= p1[2] and noPage < (p2[2] or 10000) then
				return p1[1]  or ''
			end
	  else
	  		return p1[1] or ''
	  end
	end
end

function getEcart(noPage)

	noPage = tonumber(noPage)
	for i, p1 in ipairs(ecarts) do

	  if ecarts[i + 1] ~= nil then

		p2 = ecarts[i + 1]
		if p1[1] == nil then return 1000 end
		if noPage >= p1[1] and noPage < p2[1] then
			return p1[2]  or ''
		end
	  else
	  		return p1[2] or ''
	  end
	end
end

function separator(v, parg)
	if v == parg or v == '' then
		return v .. '</p>'
	else
		return v .. ' '
	end
end

--=====================
function getEcarts() -- pour fins de test voir loadData()

	if pageIndex == '' then initSpace() end
	titre = mw.title.new(pageIndex)
	textContent = titre:getContent(titre)
	pagelist = mw.ustring.match( textContent, '<pagelist(.-)/>',1)

	table.insert(ecarts,{ 1, 0 })
	for paire in mw.ustring.gmatch(pagelist, '[0-9]+=[0-9]+') do
		pages = mw.text.split(paire,'=', true)
		table.insert(ecarts, { tonumber(pages[2]), (tonumber(pages[1]) - tonumber(pages[2])) })
	end
end

function p.ecarts(frame) --pour fins de test
	getEcarts()
	return ecarts  -- pagelist -- textContent --
end

function initSpace() --pour fins de test
	pageObj = mw.title.getCurrentTitle()
	pageNom = pageObj.text
	ns = pageObj.nsText
	if ns == 'Page' then
		pageIndex = 'Livre:' .. pageObj.baseText
	elseif ns == '' then
		content = pageObj:getContent(pageObj)
		pageIndex = 'Livre:' .. mw.ustring.match(content, 'index="(.-)"')
	end

	pageRoot = mw.title.new(pageIndex)
	content = pageRoot:getContent(pageRoot)
	pageRoot = mw.ustring.match( content, '|Titre=%[%[(.-)[|%]]',1)
	--pageRoot = mw.ustring.gsub(pageRoot, '([%^%$%(%)%%%.%*%+%-%?])', '%%' .. '%1')
	
end

function p.index(frame) --pour fins de test
	if pageIndex == '' then initSpace() end
	local titre
	local tdm

		titre = mw.title.new(pageIndex)
		textContent = titre:getContent(titre)
		sommaire = mw.ustring.match( textContent, '|Sommaire=(.-)|Epigraphe=',1)

		tdm = frame:preprocess(sommaire)

	--ajouter % devant tout caractère magique dans le nom de la page 
	titre = mw.ustring.gsub(pageRoot, '([%^%$%(%)%%%.%*%+%-%?])', '%%' .. '%1')

	index = ""
	if ns == "Page" then
		for chap, page, pageFS in mw.ustring.gmatch(tdm, '%[%[' .. titre .. '.-/(.-)|[^[]+%[%[.-/(.-)|(.-)%]%]') do  --.-{{pli|(.-)|
				index = index .. chap .. sep1 .. page .. ';'
				table.insert(t, { chap, tonumber(page), pageFS })
			--end
		end
	elseif ns == '' then
		for chap, page in mw.ustring.gmatch(tdm, '%[%[' .. titre .. '.-/(.-)|.-([0-9]-)</span></span>') do  --.-{{pli|(.-)|
				index = index .. chap .. sep1 .. page .. sep1 .. page + p.getEcart(page) .. '; '
				table.insert(t, { chap, page + p.getEcart(page), tonumber(page) })
		end		
		
	end

end

function loadData()
	local data = mw.loadData( 'Module:PliMulti/Data' )
	t = data["t"]       --nom de la sous-page:nopage du f-s 
	ecarts = data["ecarts"]  --table des changements d’écarts (nopage du livre:écart avec page du f-s)
	pageRoot = data["pageRoot"]
	ns = data["ns"]
	pageNom = data["pageNom"]
	pageObj = mw.title.getCurrentTitle()
	pageIndex = data["pageIndex"]
end

function p.test()
local t = {}
t[1] = "555"
t['test'] = 'test'
return mw.dumpObject(_deepCopy(t, false, already_seen))
end
return p