Modulus:Pg
How it runs
recensereThe template works into nsPage, and it builds a link to appropriate nsPage (from nsPage) or ns0 (when use or transcluded into a namespace different from nsPage) using the original number of page, as it is printed in original edition. When the original index of edition refers to multiple volumes, an additional parameter must be added to point the link to appropriate volume.
Needed data must be stored into a special, index-related Lua repository.
Parameters
recensere1: original number of page 2: alternative text to be shown as link text (optional) 3: base name of appropriate index page (an abbreviation can be stored and used)
Example
recensereLet's examine a complex edition: Cronica (Salimbene de Adam), coming from two index pages:
- Liber:Salimbene de Adam – Cronica, Vol. I, 1942 – BEIC 1910163.djvu (abbreviation: cron1)
- Liber:Salimbene de Adam – Cronica, Vol. II, 1942 – BEIC 1912533.djvu (abbreviation: cron2)
At the bottom of volume II, you can find lots of pages (a glossary and an index of names) with thousands of links.
Here the wikicode of a fragment of a page:
* Aaron, fratello di Mosé, {{Pg|26||cron1}}, {{Pg|153||cron1}}
Here its parsed output:
As you see, links point to ns0 pages of the work here (since they are not working in nsPage namespace); if you navigate to nsPage, the same code points to two pages of volume I of the book.
Needed data are saved into pages, two Lua Module:Dati/Salimbene de Adam – Cronica, Vol. I, 1942 – BEIC 1910163.djvu and Module:Dati/Salimbene de Adam – Cronica, Vol. II, 1942 – BEIC 1912533.djvu.
local p = {}
local indici= {}
-- abbreviazioni per opere multi-indice con indici analitici finali
indici["dec1"]="Boccaccio - Decameron I.djvu"
indici["dec2"]="Boccaccio - Decameron II.djvu"
indici["cron1"] = "Salimbene de Adam – Cronica, Vol. I, 1942 – BEIC 1910163.djvu"
indici["cron2"] = "Salimbene de Adam – Cronica, Vol. II, 1942 – BEIC 1912533.djvu"
indici["du1"]="Vico, Giambattista – Il diritto universale, Vol. I, 1936 – BEIC 1960672.djvu"
indici["du2"]="Vico, Giambattista – Il diritto universale, Vol. II, 1936 – BEIC 1961223.djvu"
indici["du3"]="Vico, Giambattista – Il diritto universale, Vol. III, 1936 – BEIC 1961890.djvu"
-- in nsPagina riceve un numero di pagina del libro e restituisce il link alla pagina djvu che contiene la pagina
function p.b2dt(frame)
local base = mw.title.getCurrentTitle()
local rootText=base.rootText
local parent = frame:getParent()
local paginaLibro=parent.args[1]
local ancora=nil
local pos=string.find(paginaLibro,"#")
if pos~=nil then
ancora=string.sub(paginaLibro,pos+1)
paginaLibro=string.sub(paginaLibro,1,pos-1)
end
-- un eventuale terzo parametro di Pg indica una fonte dati alternativa
if parent.args[3] and parent.args[3]~="" then
-- if parent.args[3]=="polo1" then
-- rootText="Polo - Il milione, Pagani, Firenze 1827, I.djvu"
-- end
-- if parent.args[3]=="polo2" then
-- rootText="Polo - Il milione, Pagani, Firenze 1827, II.djvu"
-- end
if indici[parent.args[3]]==nil then
rootText=parent.args[3]
else
rootText=indici[parent.args[3]]
end
end
local paginaDati="Module:Dati/"..rootText
local ok,pagine = pcall(mw.loadData,paginaDati)
local pageDisplay = paginaLibro
if string.find(pageDisplay,"%.") then
pageDisplay=string.sub(pageDisplay,1,string.find(pageDisplay,"%.")-1)
end
if parent.args[2] and parent.args[2] ~="" then
pageDisplay=parent.args[2]
end
if ok then
local pageDjvu = pagine.b2d[paginaLibro]
if pageDjvu then
if ancora==nil then
return '[[Pagina:'..rootText..'/'..pageDjvu..'|'..pageDisplay..']]'
else
return '[[Pagina:'..rootText..'/'..pageDjvu.."#"..ancora..'|'..pageDisplay..']]'
end
end
end
return parent.args[1]
end
-- in ns0 riceve un numero di pagina del libro e restituisce il link al capitolo che contiene la pagina
function p.b2ns0(frame)
local titolo=mw.title.getCurrentTitle()
local parent = frame:getParent()
local paginaDati=""
local testo=""
local paginaLibro=parent.args[1]
local ancora=nil
local pos=string.find(paginaLibro,"#")
if pos~=nil then
ancora=string.sub(paginaLibro,pos+1)
paginaLibro=string.sub(paginaLibro,1,pos-1)
end
if parent.args[3] and parent.args[3]~="" then
-- if parent.args[3]=="polo1" then
-- paginaDati="Module:Dati/Polo - Il milione, Pagani, Firenze 1827, I.djvu"
-- end
-- if parent.args[3]=="polo2" then
-- paginaDati="Module:Dati/Polo - Il milione, Pagani, Firenze 1827, II.djvu"
-- end
if indici[parent.args[3]]==nil then
paginaDati="Module:Dati/"..parent.args[3]
else
paginaDati="Module:Dati/"..indici[parent.args[3]]
end
else
testo=titolo:getContent()
paginaDati="Module:Dati/".. (string.match(testo,'index="([^"]-)"') or '')
end
local ok,pagine = pcall(mw.loadData,paginaDati)
--if ok then
-- return paginaDati
--end
local pageDisplay = paginaLibro
if string.find(pageDisplay,"%.") then
pageDisplay=string.sub(pageDisplay,1,string.find(pageDisplay,"%.")-1)
end
if parent.args[2] and parent.args[2] ~= "" then
pageDisplay=parent.args[2]
end
if ok then
paginaDjvu=pagine.b2d[paginaLibro]
for i,v in pairs(pagine.cap) do
if not v.from or not v.to or not paginaDjvu then
return pageDisplay..'[[Categoria:Pagine con errori in Pg]]'
else
if paginaDjvu >= v.from and paginaDjvu <=v.to then
if ancora==nil then
return '[['..v.nome.."#pagename"..paginaDjvu..'|'..pageDisplay..']]'
else
return '[['..v.nome.."#"..ancora..'|'..pageDisplay..']]'
end
end
end
end
end
return paginaLibro
end
-- in ns0 restituisce l'indice di eventuali sottocapitoli del capitolo
function p.indice(frame)
local titolo=mw.title.getCurrentTitle()
local testo=titolo:getContent()
local paginaDati="Module:Dati/"..string.match(testo,'index="([^"]-)"')
if paginaDati==nil then
paginaDati="Module:Dati/"..string.match(testo,"URL della versione cartacea a fronte%s*=%s*Indice:([^%c]+)%c-")
end
local pagine=mw.loadData(paginaDati)
local testo="== INDICE ==\n"
local y=0
for i,v in pairs(pagine.cap) do
sottocapitolo=string.match(v.nome,titolo.text.."/(.+)")
if sottocapitolo ~= nil then
sottocapitolo,y=string.gsub(sottocapitolo,"/","/")
testo=testo..string.rep("*",y+1).." ''[["..v.nome.."|"..v.titolo.."]]''\n"
end
end
if testo=="== INDICE ==\n" then
testo=""
end
return testo
end
-- in nsPagina riceve una stringa-ancora e restituisce il link alla pagina djvu che contiene l'ancora
-- test in corso su Dizionario mitologico ad uso di giovinetti
function p.l1(frame)
local base = mw.title.getCurrentTitle()
local paginaDati="Module:Dati/"..base.rootText
local parent = frame:getParent()
local ok,pagine = pcall(mw.loadData,paginaDati)
local pageDisplay = parent.args[1]
local pageShow=pageDisplay
if parent.args[2] then
pageShow=parent.args[2]
end
if ok then
if pagine.p2d[parent.args[1]]==nil then
return parent.args[1]
else
return '[[Pagina:'..base.rootText..'/'..pagine.p2d[parent.args[1]]..'#'..pageDisplay..'|'..pageShow..']]'
end
end
return parent.args[1]
end
-- in ns0 costruisce il link sulla base dell'iniziale dell'ancora
-- test in corso su Dizionario mitologico ad uso di giovinetti
function p.l2(frame)
local titolo=mw.title.getCurrentTitle()
local testo=titolo:getContent()
local paginaDati="Module:Dati/"..string.match(testo,'index="([^"]-)"')
local ok,pagine = pcall(mw.loadData,paginaDati)
local parent = frame:getParent()
local pageDisplay = parent.args[1]
local pageShow=pageDisplay
if parent.args[2] then
pageShow=parent.args[2]
end
if ok then
local iniziale=mw.ustring.sub(parent.args[1],1,1)
if iniziale=="J" then iniziale="I" end
return '[['..'Dizionario mitologico ad uso di giovanetti/Mitologia/'..iniziale..'#'..pageDisplay..'|'..pageShow..']]'
end
return parent.args[1]
end
-- in nsPagina riceve una stringa-ancora e restituisce il link alla pagina djvu che contiene l'ancora
-- test in corso su Dizionario mitologico ad uso di giovinetti
function p.l3(frame)
local base = mw.title.getCurrentTitle()
local paginaDati="Module:Dati/"..base.rootText
local parent = frame:getParent()
local ok,pagine = pcall(mw.loadData,paginaDati)
local pageDisplay = parent.args[1]
if ok then
if pagine.p2d[parent.args[1]]==nil then
return parent.args[1]
else
return 'Pagina:'..base.rootText..'/'..pagine.p2d[parent.args[1]]..'#'..pageDisplay
end
end
return parent.args[1]
end
-- in ns0 costruisce il link sulla base dell'iniziale dell'ancora
-- test in corso su Dizionario mitologico ad uso di giovinetti
function p.l4(frame)
local titolo=mw.title.getCurrentTitle()
local testo=titolo:getContent()
local paginaDati="Module:Dati/"..string.match(testo,'index="([^"]-)"')
local ok,pagine = pcall(mw.loadData,paginaDati)
local parent = frame:getParent()
local pageDisplay = parent.args[1]
if ok then
if mw.ustring.sub(pageDisplay,1,4)=="nota" then
return 'Dizionario mitologico ad uso di giovanetti/Note'..'#'..pageDisplay
else
local iniziale=mw.ustring.sub(pageDisplay,1,1)
if iniziale=="J" then iniziale="I" end
return 'Dizionario mitologico ad uso di giovanetti/Mitologia/'..iniziale..'#'..pageDisplay
end
end
return parent.args[1]
end
return p