How it runs

recensere

The 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

recensere

1: 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)

Let's examine a complex edition: Cronica (Salimbene de Adam), coming from two index pages:

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:

  • Aaron, fratello di Mosé, 26, 153

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