Mòdul:Proofreadpage index template

Mòdul que construeix la informació mostrada al namespace Llibre (Index).

El mòdul és cridat per MediaWiki:Proofreadpage index template, però pot ser provat amb el següent codi:

{{#invoke:Proofreadpage index template|fields|paràmetres}}

  • fields és la funció del mòdul encarregada de construir la pàgina, segons la resta de paràmetres.
  • Paràmetres:
  • Qid (obligatori): és l'identificador de Wikidata del Llibre. Per exemple, «Q19533394». A partir d'ell es recuperen les següents dades del Llibre des de Wikidata, explicades a Ajuda:Llibre: Autor, Títol, Data, Lloc, Traductor, Il·lustrador i Editor. Aquests paràmetres, si s'informen a mà, tenen preferència sobre els de Wikidata. La resta de dades (Subtítol, Compositor, Pròleg, Impressor, i Número d'edició) són capturades pel mòdul des de Wikidata, si existeixen, sense possibilitat de modificar-les des del formulari del Llibre (ni com a paràmetres d'aquest mòdul).
  • NomPag (obligatori): és el {{NOMPAGE}} de la pàgina del Llibre. Per fer proves podem posar el nom del fitxer, com «Mar y cel (1903).djvu». Es fa servir per mostrar la imatge del fitxer així com l'enllaç per purgar les pàgines.
  • NomPagE (obligatori): és el {{NOMPAGEE}} de la pàgina del Llibre. Per fer proves podem posar el nom del fitxer, com «Mar_y_cel_(1903).djvu». Es fa servir per mostrar la imatge del fitxer.
  • Sumari (opcional): només es pot informar a mà. Correspon als enllaços als diferents capítols.


Exemples

  • Codi mínim de proves: {{#invoke:Proofreadpage index template|fields|NomPag=Mar y cel (1903).djvu|NomPagE=Mar_y_cel_(1903).djvu|Pàgines=proves}}
  • Codi mínim de proves que captura dades de Wikidata: {{#invoke:Proofreadpage index template|fields|NomPag=Mar y cel (1903).djvu|NomPagE=Mar_y_cel_(1903).djvu|Pàgines=proves|Qid=Q19533394}}

--------------------------------------------------------------------------------
-- Adaptat de https://en.wikisource.org/wiki/Module:Proofreadpage_index_template
-- This is a module to implement logic for [[MediaWiki:Proofreadpage index template]]
--------------------------------------------------------------------------------

local Wikidata = require('Module:Wikidata')
local getArgs = require('Module:Arguments').getArgs

local p = {} --p stands for package

-- mapping of field ID to field properties
local headings = {
	author =		{	txt = 'Autor',			},
	compositor =	{   txt = 'Compositor'  	},
	year =			{	txt = 'Data d\'edició',	},
	source =		{	txt = 'Digitalització',	},
	edition =		{	txt = 'Edició',			},
	editor =		{	txt = 'Editor',			},
	epilogue =		{   txt = 'Epíleg'  		},
	illustrator =	{   txt = 'Il·lustrador'    },
	printer =		{	txt = 'Impressor',		},
	place = 		{	txt = 'Lloc d\'edició',	},
	quality =		{	txt = 'Nivell',			},
	parts = 		{   txt = 'Parts'   		},
	prologue =		{   txt = 'Pròleg'  		},
	subtitle =		{	txt = 'Subtítol',		},
	title = 		{	txt = 'Títol',			},
	translator =	{	txt = 'Traductor',		},
	volum = 		{   txt = 'Volum'   		},
	wikidata =		{	txt = 'Wikidata',		}
}

local function get_heading(id)
	if headings[id] then
		return headings[id]['txt']
	end
	error( "Can't find heading for ID: " .. id )
end

local function construct_imatge(content, sumari, nompage, qid, nompag)
	if nompage == nil or nompage == '' then error('nompage no pot ser nul') end
	local s = ''

	--Mirem si a WD hi ha 1 o més P996, agafem el que coincideixi, i li mirem el P4714 (nº pàg. amb títol).
	local P4714 = ''
	if qid then
		local FileOnCommonsStmts = mw.wikibase.getAllStatements (qid, 'P996');
		if FileOnCommonsStmts then
			for _, stmt in pairs( FileOnCommonsStmts ) do
				local commonsFilename = stmt['mainsnak']['datavalue']['value']
				--Cal decodificar nompag, per exemple, per l'apòstrof "'" arriba com "'"
				if mw.text.decode(nompag) == commonsFilename then
					P4714 = Wikidata.claim{item=qid, property="P996", qualifier="P4714", lang="ca", list=false, editicon=false}
				end
			end
		end
	end	

	s = s .. '<td><div style="float:left;">'
	if content then
	else
		if P4714 == '' then
			content = '1'	--si no hi ha res de res
		else
			content = P4714
		end
		if content == nil then content = '1' end
	end
	if tonumber(content) == nil then
		s = s .. content
	else
		s = s .. '<span id="ws-cover" style="display:none; speak:none;">'
		s = s .. nompage .. "/" .. content .. "</span>"
		s = s .. '[[File:' .. nompage .. '|page=' .. content .. '|frameless]]'
	end
	s = s .. '</div></td>\n'

	if sumari == nil then
		s = s .. '<td>'
	else
		s = s .. '<td width="45%">'
	end
	s = s .. '<table>' --es tanca a construct_field_pagines
	return s
end

local function construct_field_pagines(content, nompage)

	if nompage == nil or nompage == '' then return "Error nompage a construct_field_pagines" end
	if content == nil or content == '' then return "Error content a construct_field_pagines" end
	local s = ''
	s = s .. '\n<td valign="top"><span class="plainlinks">'
	s = s .. '<b>[//ca.wikisource.org/wiki/Index:' .. nompage .. '?action=purge Pàgines]</b></span></td>\n'
	s = s .. '<td valign="top" align="left" bgcolor="#F0F0F0">\n'
	s = s .. '<div style="padding-left:0.5em">\n' .. content .. '</div>'
	s = s .. '</td>'
	s = s .. '</table>'
	return s
end

local function construct_field_sumari(content)
	local s = ''
	if content then
		s = '<td width="45%">' .. content .. '</td>'
	end
	return s
end

-- construct a basic "field" row
local function construct_field(id, content, qid, nompag)

	if id == nil then error( "Error a construct_field" ) end

	local CatError = "[[Categoria:Llibres amb discrepàncies respecte a Wikidata"	
	local contentAux = content
	local noVT = false	--hi ha contingut a WD i a VT (cal esborrar-lo)
	local noWD = false	--hi ha contingut a VT però no a WD (cal moure'l i esborrar-lo)

	if id == 'author' then
		if qid then
			local AutorP50 = Wikidata.claim{item=qid, property="P50", lang="ca", list=true, editicon=false}
			if AutorP50 then
				if AutorP50 == 'valor desconegut' then AutorP50 = '[[Autor:Anònim|Anònim]]' end
				if content then
					noVT = true
				else
					content = AutorP50
				end
			else
				if content then
					noVT = true
				else
					AutorP50 = Wikidata.claim{item=qid, property="P2093", lang="ca", list=true, editicon=false}	-- p.ex. Q122228052
					if AutorP50 then content = AutorP50 end
				end
			end
			if not AutorP50 and content then noWD = true end
		end
	end

	if id == 'translator' then
		if qid then
			local wTraductor = Wikidata.claim{item=qid, property="P655", lang="ca", list=true, editicon=false}
			if wTraductor then
				if content then
					noVT = true
				else
					content = wTraductor
				end
			end
			if not wTraductor and content then noWD = true end
		end
	end

	if id == 'title' then
		if qid then
			local wSiteLink = Wikidata.getSiteLink{item=qid}
			local wTitol = Wikidata.claim{item=qid, property="P1476", lang="ca", list=false, editicon=false}					
			if wSiteLink then
				if content then
					noVT = true
				else
					if wTitol then
						content = "''[[" .. wSiteLink .. "|" .. wTitol .. "]]''"
					else
						content = "''[[" .. wSiteLink .. "]]''"
					end	
				end
			else	
				if content then
					noWD = true
				else
					if wTitol then content = "''[[" .. wTitol .. "]]''" end
				end	
			end
		end
	end
	
	if id == 'subtitle' then	--No vé per paràmetre
		if qid then
			local wSubtitol = Wikidata.claim{item=qid, property="P1680", lang="ca", list=false, editicon=false}
			if wSubtitol then
				content = "''" .. wSubtitol .. "''"
			else
				content = ''
			end
		end
	end
	
	if id == 'volum' then	--No vé per paràmetre
		if qid then
			local wVolum = Wikidata.claim{item=qid, property="P478", lang="ca", list=true, editicon=false}
			if wVolum then
				content = wVolum
			else
				content = ''
			end
		end
	end

	if id == 'parts' then	--No vé per paràmetre
		if qid then
			local wParts = Wikidata.claim{item=qid, property="P527", lang="ca", list=true, editicon=false}
			if wParts then
				content = wParts
			else
				content = ''
			end
		end
	end

	if id == 'prologue' then	--No vé per paràmetre
		if qid then
			local wProleg = Wikidata.claim{item=qid, property="P2679", lang="ca", list=true, editicon=false}
			if wProleg then
				content = wProleg
			else
				content = ''
			end
		end
	end

	if id == 'epilogue' then	--No vé per paràmetre
		if qid then
			local wEpileg = Wikidata.claim{item=qid, property="P2680", lang="ca", list=true, editicon=false}
			if wEpileg then
				content = wEpileg
			else
				content = ''
			end
		end
	end

	if id == 'illustrator' then
		if qid then
			local wIlustrator = Wikidata.claim{item=qid, property="P110", lang="ca", list=true, editicon=false}
			if wIlustrator then
				if content then
					noVT = true
				else
					content = wIlustrator
				end
			end
			if not wIlustrator and content then noWD = true end
		end
	end

	if id == 'compositor' then	--No vé per paràmetre
		if qid then
			local wCompositor = Wikidata.claim{item=qid, property="P86", lang="ca", list=true, editicon=false}
			if wCompositor then
				content = wCompositor
			else
				content = ''
			end
		end
	end
	
	if id == 'editor' then
		if qid then
			local wPublisher = Wikidata.claim{item=qid, property="P123", lang="ca", list=true, editicon=false, formatting='label'}
			if wPublisher then
				if content then
					noVT = true
				else
					content = wPublisher
				end
			end
			if not wPublisher and content then noWD = true end
		end
	end

	if id == 'printer' then	--No vé per paràmetre
		if qid then
			local wImpressor = Wikidata.claim{item=qid, property="P872", lang="ca", list=false, editicon=false, formatting='label'}
			if wImpressor then
				content = wImpressor
			else
				content = ''
			end
		end
	end

	if id == 'place' then
		if qid then
			local wPlace = Wikidata.claim{item=qid, property="P291", lang="ca", list=false, editicon=false, formatting='label'}
			if wPlace then
				if content then
					noVT = true
					content = content .. "[[Categoria:Llibres editats a " .. contentAux .. "]]"
				else
					local LlistaLlocs = Wikidata.claim{item=qid, property="P291", lang="ca", list=true, editicon=false, formatting='label'}
					content = LlistaLlocs .. "[[Categoria:Llibres editats a " .. wPlace .. "]]"	--només categ. 1er
				end
			end
			if not wPlace and content then noWD = true end
		else	
			if content then
				content = content .. "[[Categoria:Llibres editats a " .. contentAux .. "]]"
			end	
		end
	end

	if id == 'year' then
		if qid then
			local wData = Wikidata.claim{item=qid, property="P577", lang="ca", list=false, editicon=false, formatting=" j xg Y"}
			if wData then
				if content then
					noVT = true
				else
					content = wData
				end
			end
			if not wData and content then noWD = true end
		end
	end

	if id == 'edition' then	--No vé per paràmetre
		if qid then
			local wEdicio = Wikidata.claim{item=qid, property="P393", lang="ca", list=false, editicon=false, formatting='label'}
			if wEdicio then
				content = wEdicio
			else
				content = ''
			end
		end
	end

	if id == 'source' then
		if content == nil then
			if nompag == nil then
				content = content .. CatError .. "|Nompag]]"
			else
				content = "[[:File:" .. nompag .. "|Fitxer]]"
			end
		else
			noWD = true
		end
	end

	if id == 'wikidata' then
		if nompag == nil then
			return CatError .. "|Pagename]]"	
		end
		if content == nil then
			return "[[Categoria:Llibres no connectats amb Wikidata]]"
		end
		content = "[[File:Wikidata-logo.svg|20px|link=d:" .. contentAux .. "]] [[d:" .. contentAux .. "|" .. contentAux .. "]]"

		if mw.wikibase.entityExists(qid) == false then
			content = content .. CatError .. "|Qid]]"	
		end
		if Wikidata.validProperty{"P996", item=qid} == nil then
			local wTitol = mw.title.getCurrentTitle()	--Nom sense "Llibre:"
			if wTitol.text then
				local wFitxer = mw.title.new( wTitol.text, 'File' )
				if wFitxer.exists then
					--Fitxer no està a Commons però és localment a Viquitexts (casos excepcionals)
				else	
					--No hi fitxer local ni P996: cal afegir-la (fitxer a Commons) a l'ítem (a Wikidata)
					content = content .. CatError .. "|Commons]]"	
				end
    		else
				content = content .. CatError .. "|Error]]"
			end
		else
			local FileMatch = ''
			local FileOnCommonsStmts = mw.wikibase.getAllStatements (qid, 'P996');
			for _, stmt in pairs( FileOnCommonsStmts ) do
				local commonsFilename = stmt['mainsnak']['datavalue']['value']
				--Cal decodificar nompag, per exemple, per l'apòstrof "'" arriba com "&#39;"
				if mw.text.decode(nompag) == commonsFilename then
					FileMatch = commonsFilename
				end
			end
			if FileMatch == '' then
				content = content .. CatError .. "|Fitxer]]"
			end
		end
	end	
	
	if id == 'quality' then

		if qid then
			local badges = require("Module:Edition").badge{args={qid=qid}}
			if badges then
				if content then noVT = true end
				content = "I"
				if badges == "Q20748093" then content = "V" end
				if badges == "Q20748092" then content = "R" end
				if badges == "Q20748091" then content = "I" end
				if badges == "Q20748094" then content = "E" end
			else
				if content then noWD = true end
			end
			if contentAux then --de moment, té preferència allò posat a mà
				content = contentAux
			end	
		end

		if content == nil then
			content = "Per defecte&nbsp;[[Categoria:Llibres no revisats]][[:Categoria:Llibres no revisats|Llibre incomplet]]"
		elseif content == 'I' then
			content = "[[Categoria:Llibres no revisats]][[:Categoria:Llibres no revisats|Llibre incomplet]]"
		elseif content == 'R' then
			content = "[[Categoria:Llibres revisats]][[:Categoria:Llibres revisats|Llibre amb pàgines pendents de validar]]"
		elseif content == 'V' then
			content = "[[Categoria:Llibres validats]][[:Categoria:Llibres validats|Llibre validat]]"
		elseif content == 'E' then
			content = "[[Categoria:Llibres amb errors]][[:Categoria:Llibres amb errors|Llibre amb errors]]"
		else
			content = "Per defecte&nbsp;[[Categoria:Llibres no revisats]][[:Categoria:Llibres no revisats|Llibre incomplet]]"
		end
	end	
	
	if content == nil or content == '' then
		return ''
	end
	
	local title = get_heading( id )
	if noVT == true then
		content = content .. "[[Categoria:Llibres amb dades a Wikidata]]"
		title = title .. "<span style='color:red; font-size:75%;'>*</span>"
	end
	if noWD == true then
		content = content .. "[[Categoria:Llibres amb dades per a Wikidata]]"
		title = title .. "<span style='color:green; font-size:75%;'>*</span>"
	end
	
	local s = ''
	s = s .. '\n<tr>'
	s = s .. '<th valign="top" align="left"><b>' .. title .. '</b></th>\n'
	s = s .. '<td>' .. content .. '</td>\n'
	s = s .. '</tr>\n'

	return s
end

function p.fields(frame)
	
	local args = getArgs(frame)

	local s = ""

	s = s .. '<table><tr valign="top">'
	s = s .. construct_imatge(args['Imatge'], args['Sumari'], args['NomPagE'], args['Qid'], args['NomPag'])
	s = s .. construct_field('author', args['Autor'], args['Qid'])
	s = s .. construct_field('translator', args['Traductor'], args['Qid'])
	s = s .. construct_field('title', args['Títol'], args['Qid'])
	s = s .. construct_field('subtitle', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('volum', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('parts', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('prologue', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('epilogue', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('illustrator', args['Il·lustrador'], args['Qid'])
	s = s .. construct_field('compositor', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('editor', args['Editor'], args['Qid'])
	s = s .. construct_field('printer', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('place', args['Lloc'], args['Qid'])
	s = s .. construct_field('year', args['Any'], args['Qid'])
	s = s .. construct_field('edition', args['Qid'], args['Qid'])	--sense arg.
	s = s .. construct_field('source', args['Font'], args['Qid'], args['NomPag'])
	s = s .. construct_field('wikidata', args['Qid'], args['Qid'], args['NomPag'])
	s = s .. construct_field('quality', args['Nivell'], args['Qid'])
	s = s .. construct_field_pagines(args['Pàgines'], args['NomPagE'])
	s = s .. construct_field_sumari(args['Sumari'])
	s = s .. '</tr></table>'

	return s
	
end

return p