Módulo:Control de autoridades: Diferenzas entre revisións

Contido eliminado Contido engadido
Banjo (conversa | contribucións)
Desfíxose a edición 4925338 de Banjo (conversa)
Etiqueta: Desfacer
Banjo (conversa | contribucións)
Sen resumo de edición
Liña 1:
require('MóduloModule:No globals')
 
local conf = require( "Módulo'Module:Control de autoridades/conf"' ) -- configuration module
 
local function getIdsFromWikidataisNilOrEmpty( item, propertything )
if thing == nil or thing == '' then
local ids = {}
return true
if not item.claims[property] then
end
return ids
return nil
end
 
local function getIdFromWikidata( item, property )
local id = nil
if property == 'PWikispecies:$1' then
local siteLinks = item.sitelinks
if siteLinks then
local speciesWiki = item.sitelinks.specieswiki
if speciesWiki then
id = speciesWiki.title
end
end
return id
elseif item.claims[property] == nil then
return id
end
for _, statement in pairs( item.claims[property] ) do
if statement.mainsnak.datavalue then
table.insert(id ids,= statement.mainsnak.datavalue.value )
break
end
end
return idsid
end
 
local function getLink( property, val, mask )
local link, returnVal = ""'', {}
returnVal.isError = false
if mw.ustring.find( val, '//' ) then
link = val
else
if type(property) == 'number' and property > 0 then
local entityObject = mw.wikibase.getEntityObjectgetEntity('P'..property)
local dataType = entityObject.datatype
if dataType == "external-id" then
localif formatterURLentityObject then dataType = entityObject:getBestStatements('P1630')[1].datatype
else returnVal.isError = true end
if formatterURL then
link = formatterURL.mainsnak.datavalue.value
if dataType == 'external-id' then
else
local formatterURL = entityObject:getBestStatements('P3303')[1]nil
if formatterURLproperty == 3746 then link--Wildflowers =of Israel ID's 2nd formatterURL.mainsnak.datavalue.value endis in English
formatterURL = entityObject:getBestStatements('P1630')[2]
end
if formatterURL == nil then formatterURL = entityObject:getBestStatements('P1630')[1] end
if formatterURL then
if formatterURL.mainsnak.datavalue and formatterURL.mainsnak.datavalue.value then --nil check for ABA
link = formatterURL.mainsnak.datavalue.value
end
end
elseif dataType == "'url"' then
local subjectItem = entityObject:getBestStatements('P1629')[1]
if subjectItem then
local officialWebsite = mw.wikibase.getEntityObjectgetEntity(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]
if officialWebsite then link = officialWebsite.mainsnak.datavalue.value end
end
elseif dataType == "'string"' then
local formatterURL = entityObject:getBestStatements('P1630')[1]
if formatterURL then
link = formatterURL.mainsnak.datavalue.value
else
local formatterURL = entityObject:getBestStatements('P3303')[1]
if formatterURL then link = formatterURL.mainsnak.datavalue.value
else
local subjectItem = entityObject:getBestStatements('P1629')[1]
if subjectItem then
local officialWebsite = mw.wikibase.getEntityObjectgetEntity(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]
if officialWebsite then link = officialWebsite.mainsnak.datavalue.value end
end
end
endelse
returnVal.isError = true
end
elseif type(property) == 'string' then
link = property
end
link = mw.ustring.gsub(link, '$1', val)
local valurl = val
if mw.ustring.find( link, 'antweb.org' ) then valurl = mw.ustring.gsub(valurl, ' ', '%%20') end
if type(property) == 'number' then
--doublecheck language for Wildflowers of Israel ID
if property == 3746 then link = mw.ustring.gsub(link, '/hebrew/', '/english/') end
--format spaces in PfaF, e.g. for "Elaeagnus x ebbingei"
if property == 4301 then valurl = mw.ustring.gsub(valurl, ' ', '+') end
end
valurl = mw.ustring.gsub(valurl,'%%','%%%%')
link = mw.ustring.gsub(link, '$1', valurl)
end
link = mw.ustring.gsub(link, '^[Hh][Tt][Tt][Pp]([Ss]?)://', 'http%1://') -- fix wikidata URL
link = mw.ustring.gsub(link, ' ' , '')
val = mw.ustring.match(val, '([^=/]*)/?$') -- get display name from end of URL
if mw.ustring.find( link, '//' ) then
returnVal.text = '['..link..' '..mw.text.encode(mw.uri.decode(val, 'PATH'),'%[%]')..']'
if mask == 'y' then
elseif link == '' then
return '<span class="plainlinks">['..link..' ID]</span>'
returnVal.text = val
else
return '<span class="plainlinks">['..link..' '..val..']</span>'
end
elseif link == "" then
return val
else
returnreturnVal.text = '<span class="external">[['..link..'|'..val..']]</span>'
end
return returnVal
end
 
Liña 81 ⟶ 113:
return outStr..'>' .. link .. '</span></span>\n'
else
return '* <' .. mw.text.tag('span', {class="'error">'}, 'The identifier ' .. id .. ' ' .. rawValue .. ' is not valid.</span>') .. '\n'
end
end
Liña 90 ⟶ 122:
for key, value in pairs (inTable) do outTable[copyTable(key)] = copyTable(value) end
return outTable
end
 
local function splitLccn( id )
if id:match( '^%l%l?%l?%d%d%d%d%d%d%d%d%d?%d?$' ) then
id = id:gsub( '^(%l+)(%d+)(%d%d%d%d%d%d)$', '%1/%2/%3' )
end
if id:match( '^%l%l?%l?/%d%d%d?%d?/%d+$' ) then
return mw.text.split( id, '/' )
end
return false
end
 
Liña 105 ⟶ 127:
 
function p.authorityControl( frame )
local resolve = require( 'Module:ResolveEntityId' )
local parentArgs = copyTable(frame:getParent().args)
local currentTitle = mw.title.getCurrentTitle()
local currentEntityId = mw.wikibase.getEntityIdForCurrentPage()
local stringArgs = false
local fromForCountfromTitleCount, firstRow, rowCount = 1, 0, 0
local outString, errors = '', ''
local tFroms = {} --non-sequential table of unique froms
local iFroms = 0 --integer size of tFroms, b/c Lua
--Assess the page's relationship with Wikidata
local currentItem = nil
if currentTitle.namespace == 10 then --i.e. Module:Taxonbar/sandbox, Template:Taxonbar/doc, etc.
if resolve._entityid(frame, parentArgs['from']) then
currentItem = mw.wikibase.getEntity(parentArgs['from'])
end
if currentItem == nil then
if resolve._entityid(frame, parentArgs['from1']) then
currentItem = mw.wikibase.getEntity(parentArgs['from1'])
end
end
elseif resolve._entityid(frame, currentEntityId) then
currentItem = mw.wikibase.getEntity(currentEntityId)
else --currentEntityId == nil/unresolvable
 
end
if currentItem then
local acceptable = {
['Q16521'] = 'taxon', --strict
['Q310890'] = 'monotypic taxon', --strict
['Q2568288'] = 'ichnotaxon', --strict
['Q23038290'] = 'fossil taxon', --strict
['Q47487597'] = 'monotypic fossil taxon', --strict
['Q42621'] = 'hybrid', --lax
['Q235536'] = 'incertae sedis', --lax
['Q713623'] = 'clade', --lax
['Q848328'] = 'serotype', --lax
['Q857968'] = 'candidatus', --lax
['Q17487588'] = 'unavailable combination', --lax
}
 
for _, instanceOfState in pairs ( currentItem:getBestStatements('P31') ) do --instance of
local instanceOf = instanceOfState.mainsnak.datavalue.value.id
if acceptable[instanceOf] then
 
break
end
end
end
--Cleanup args
for k, v in pairs( frame:getParent().args ) do
Liña 113 ⟶ 184:
--make args case insensitive
local lowerk = mw.ustring.lower(k)
if notisNilOrEmpty( parentArgs[lowerk] or parentArgs[lowerk] == '') then
parentArgs[lowerk] = v
parentArgs[k] = nil
parentArgs[lowerk] = v
end
--remap abc to abc1
if not mw.ustring.find(lowerk,"'%d$"') == nil then --if no number at end of param
if notisNilOrEmpty( parentArgs[lowerk..'1'] or parentArgs[lowerk..'1'] == '') then
parentArgs[lowerk..'1'] = v
parentArgs[lowerk] = nil
lowerk = lowerk..'1'
parentArgs[lowerk] = v
end
end
if v and v ~= '' then
--findremap highest'for' fromto param'title'
if mw.ustring.sub(lowerk,1,43) == "from"'for' then
local forTitle = mw.ustring.gsub(lowerk,'^for','title',1)
if isNilOrEmpty( parentArgs[forTitle] ) then
parentArgs[lowerk] = nil
lowerk = forTitle
parentArgs[lowerk] = v
end
end
--find highest from or title param
if mw.ustring.sub(lowerk,1,4) == 'from' then
local fromNumber = tonumber(mw.ustring.sub(lowerk,5,-1))
if fromNumber and fromNumber >= fromForCountfromTitleCount then fromForCountfromTitleCount = fromNumber end
--look for duplicate froms while we're here
elseif mw.ustring.sub(lowerk,1,3) == "for" then
localif forNumber = tonumber(mw.ustring.subfind(lowerkv,4,-1) '^Q%d') then
if tFroms[v] then
if forNumber and forNumber >= fromForCount then fromForCount = forNumber end
 
elseif mw.ustring.lower(v) ~= 'no' and lowerk ~= 'for' then
tFroms[v] = tFroms[v] + 1
else
tFroms[v] = 1
iFroms = iFroms + 1
end
if iFroms == 2 then
 
end
end
elseif mw.ustring.sub(lowerk,1,5) == 'title' then
local titleNumber = tonumber(mw.ustring.sub(lowerk,4,-1))
if titleNumber and titleNumber >= fromTitleCount then fromTitleCount = titleNumber end
elseif mw.ustring.lower(v) ~= 'no' then
stringArgs = true
 
end
end
end
end
--Check for unknown parameters
--create knowns list
local acceptableArgs = { from = true, } --master list of l/c acceptable args
for _, d in pairs( conf.databases ) do
if d[1] ~= 'Wikidata' then --made obsolete by from
acceptableArgs[mw.ustring.lower(d[1])] = true
end
end
for _, a in pairs( conf.aliases ) do
acceptableArgs[mw.ustring.lower(a[1])] = true
end
--create trimmed parents list
local baseParentArgs = {} --condensed list of l/c parent args w/o trailing #s
for k, v in pairs( parentArgs ) do
if type(k) == 'string' then --ignore unnamed params, which have keys of type 'number'
local lowerk = mw.ustring.lower(k)
local base = mw.ustring.gsub(lowerk, '[%d]*$', '')
baseParentArgs[base] = true
end
end
--compare lists and spit out unknowns
local unknownParams = {}
for k, v in pairs( baseParentArgs ) do
if acceptableArgs[k] == nil then
 
unknownParams[#unknownParams + 1] = k
end
end
--warn if unknown(s) present
if #unknownParams > 0 then
local plural = nil
local itthem = nil
if #unknownParams == 1 then
plural = ''
itthem = 'it'
else
plural = 's'
itthem = 'them'
end
if frame:preprocess( '{{REVISIONID}}' ) == '' then
errors = errors..'<div class="hatnote" style="color:red">'..
'<strong>Warning:</strong> unknown parameter'..plural..' <strong>'..table.concat(unknownParams, ', ')..'</strong>.<br />'..
'Please correct '..itthem..' or consider adding '..itthem..' to Wikidata.<br />'..
'This message is only shown in preview.</div>'
end
end
--Append basionym to arg list, if not already provided
if currentItem then
local currentBasState = currentItem:getBestStatements('P566')[1] --basionym
if currentBasState then
local basionymId = currentBasState.mainsnak.datavalue.value.id
if basionymId and resolve._entityid(frame, basionymId) and tFroms[basionymId] == nil then
--check that basionym is a strict instance of taxon
local basionymItem = mw.wikibase.getEntity(basionymId)
if basionymItem then
local acceptable = {
['Q16521'] = 'taxon', --strict
['Q310890'] = 'monotypic taxon', --strict
['Q2568288'] = 'ichnotaxon', --strict
['Q23038290'] = 'fossil taxon', --strict
['Q47487597'] = 'monotypic fossil taxon', --strict
}
for _, instanceOfState in pairs ( basionymItem:getBestStatements('P31') ) do --instance of
local instanceOf = instanceOfState.mainsnak.datavalue.value.id
if acceptable[instanceOf] then
--housekeeping
tFroms[basionymId] = 1
iFroms = iFroms + 1
fromTitleCount = fromTitleCount + 1
--append basionym & track
parentArgs['from'..fromTitleCount] = basionymId
 
break
end end end end end end
--Append monotypic genus/species to arg list of monotypic species/genus, if not already provided
if currentItem then
for _, instanceOfState in pairs ( currentItem:getBestStatements('P31') ) do --instance of
local taxonRank = nil
local parentItem = nil
local parentTaxon = nil
local parentTaxonRank = nil
local parentMonoGenus = nil --holy grail/tbd
local instanceOf = instanceOfState.mainsnak.datavalue.value.id
if instanceOf and (instanceOf == 'Q310890' or instanceOf == 'Q47487597') then --monotypic/fossil taxon
local taxonRankState = currentItem:getBestStatements('P105')[1] --taxon rank
if taxonRankState then taxonRank = taxonRankState.mainsnak.datavalue.value.id end
if taxonRank and taxonRank == 'Q7432' then --species
--is monotypic species; add genus
local parentTaxonState = currentItem:getBestStatements('P171')[1] --parent taxon
if parentTaxonState then parentTaxon = parentTaxonState.mainsnak.datavalue.value.id end
--confirm parent taxon rank == genus & monotypic
if parentTaxon and resolve._entityid(frame, parentTaxon) then
parentItem = mw.wikibase.getEntity(parentTaxon)
if parentItem then
local parentTaxonRankState = parentItem:getBestStatements('P105')[1] --taxon rank
if parentTaxonRankState then parentTaxonRank = parentTaxonRankState.mainsnak.datavalue.value.id end
if parentTaxonRank and parentTaxonRank == 'Q34740' then --parent == genus
for _, parentInstanceOfState in pairs ( parentItem:getBestStatements('P31') ) do --instance of
local parentInstanceOf = parentInstanceOfState.mainsnak.datavalue.value.id
if parentInstanceOf and
(parentInstanceOf == 'Q310890' or parentInstanceOf == 'Q47487597') then --monotypic/fossil taxon
parentMonoGenus = parentTaxon --confirmed
break
end
end
if parentMonoGenus and tFroms[parentMonoGenus] == nil then
--housekeeping
tFroms[parentMonoGenus] = 1
iFroms = iFroms + 1
fromTitleCount = fromTitleCount + 1
--append monotypic genus & track
parentArgs['from'..fromTitleCount] = parentMonoGenus
 
break
end
end
end
end
if parentMonoGenus == nil or tFroms[parentMonoGenus] == nil then
 
break
end
elseif taxonRank and taxonRank == 'Q34740' then --genus
--is monotypic genus; add species
--...
end
end
end
end --if currentItem
--Setup navbox
local navboxParams = {
name = 'Control de autoridadesTaxonbar',
bodyclass = 'hlist',
listclass = 'plainlinks',
groupstyle = 'width: 12%; text-align:center left;',
}
 
for f = 1,fromForCount fromTitleCount, 1
do
local elements, title = {}, {}nil
--cleanup parameters
if parentArgs['from'..f] == '' then parentArgs['from'..f] = nil end
if parentArgs['fortitle'..f] == '' then parentArgs['fortitle'..f] = nil end
--remap aliases
for _, a in pairs( conf.aliases ) do
local alias, name = mw.ustring.lower(a[1]), mw.ustring.lower(a[2])
if parentArgs[alias..f] and not parentArgs[name..f] == nil then
parentArgs[name..f] = parentArgs[alias..f]
parentArgs[alias..f] = nil
end
end
--Fetch Wikidata item
local itemfrom = mwresolve.wikibase.getEntity_entityid(frame, parentArgs['from'..f])
local labelitem = item and item:getLabelmw.wikibase.getEntity(from)
local label = nil
if type(item) == 'table' then
local statements = item:getBestStatements('P225')[1] --taxon name
if statements then
local datavalue = statements.mainsnak.datavalue
if datavalue then
label = datavalue.value
end
end
label = label or item:getLabel()
else
if parentArgs['from'..f] then
 
errors = errors .. mw.text.tag('strong', {class='error'}, 'Error: "' ..
parentArgs['from'..f] .. '" is not a valid Wikidata entity ID.<br />')
end
end
if label and label ~= '' then
title = mw.title.new(label)
if not title then title = mw.title.getCurrentTitle() end
else
title = mw.title.getCurrentTitle()
end
if title == nil and parentArgs['title'..f] then
if title (not= parentArgs['wikidata'mw.title.f] or new(parentArgs['wikidatatitle'..f] == '') and (title.namespace == 0) then
if parentArgs['from'..f] then parentArgs['wikidata'..f] = parentArgs['from'..f] elseif item then parentArgs['wikidata'..f] = item.id end
end
if title == nil and f == 1 then
if title.namespace == 0 or stringArgs then --Only in the main namespace or if there are manual overrides
title = currentTitle
local sourcesFound = false
end
for _, params in pairs( conf.databases ) do
params[1] = mw.ustring.lower(params[1])
if title then
--Wikidata fallback if requested
if isNilOrEmpty( parentArgs['wikidata'..f] ) and
if (item ~= nil and item.claims ~= nil) and params[3] ~= 0 and (not parentArgs[params[1]..f] or parentArgs[params[1]..f] == '') then
(title.namespace == 0) then
local wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
if wikidataIdsparentArgs[1'from'..f] then
parentArgs[params[1]'wikidata'..f] = wikidataIdsparentArgs[1'from'..f]
elseif item then
parentArgs['wikidata'..f] = item.id
end
end
if title.namespace == 0 or stringArgs then --only in mainspace or if manual overrides exist
local sourceCount = 0
for _, params in pairs( conf.databases ) do
params[1] = mw.ustring.lower(params[1])
local propId = params[3]
--Wikidata fallback if requested
if (item and item.claims) and
(type(propId) == 'string' or (type(propId) == 'number' and propId > 0)) then
local wikidataId = getIdFromWikidata( item, 'P' .. propId )
local v = parentArgs[params[1]..f]
if wikidataId then
if isNilOrEmpty(v) then
parentArgs[params[1]..f] = wikidataId
else
if v and v ~= 'no' and v ~= wikidataId then
 
elseif v and v == wikidataId then
 
end
end
end
end
local val = parentArgs[params[1]..f]
if val and val ~= '' and mw.ustring.lower(val) ~= 'no' then
if type(propId) == 'number' then
if propId < 0 then propId = -propId end --allow link
if propId > 0 then --link
table.insert( elements, createRow( params[1], params[2]..':', val, getLink( propId, val ).text, true ) )
else --propId == 0; no link
table.insert( elements, createRow( params[1], params[2]..':', val, val, true ) )
end
else
table.insert( elements, createRow( params[1], params[2]..':', val, getLink( propId, val ).text, true ) )
end
if params[1] ~= 'wikidata' and params[1] ~= 'wikispecies' then
sourceCount = sourceCount + 1
end
end
end
 
local val = parentArgs[params[1]..f]
if val and val ~= '' and mw.ustring.lower(val) ~= 'no' and params[3] ~= 0 then
--Generate navbox title
if sourceCount > 0 then --TODO: don't count Wikispecies towards 'taxon ID count'
--Worldcat
rowCount = rowCount + 1
if params[1] == 'issn' and parentArgs['worldcatid'..f] and parentArgs['worldcatid'..f] ~= '' then -- 'issn' is the first element following the 'wikidata' item
if firstRow == 0 then firstRow = f end
table.insert( elements, createRow( params[1], '', parentArgs['worldcatid'..f], '[//www.worldcat.org/identities/' .. parentArgs['worldcatid'..f] .. ' WorldCat]', false ) ) --Validation?
--set title from wikidata if it doesn't exist
elseif params[1] == 'viaf' and parentArgs[params[1]..f] and string.match( parentArgs[params[1]..f], '^%d+$' ) and not parentArgs['worldcatid'..f] then -- Hackishly copy the validation code; this should go away when we move to using P1793 and P1630
if isNilOrEmpty( parentArgs['title'..f] ) then
table.insert( elements, createRow( params[1], '', parentArgs[params[1]], '[//www.worldcat.org/identities/containsVIAFID/' .. parentArgs[params[1]..f] .. ' WorldCat]', false ) )
parentArgs['noTitle'..f] = true
elseif params[1] == 'lccn' and parentArgs[params[1]..f] and parentArgs[params[1]..f] ~= '' and not parentArgs['viaf'..f] and not parentArgs['worldcatid'..f] then
local lccnParts = splitLccn( parentArgs[params[1]'title'..f] )= title.text
if lccnParts and lccnParts[1] ~= 'sh' then
table.insert( elements, createRow( params[1], '', parentArgs[params[1]..f], '[//www.worldcat.org/identities/lccn-' .. lccnParts[1] .. lccnParts[2] .. '-' .. lccnParts[3] .. ' WorldCat]', false ) )
end
end
--if it exists now, set row heading to title
if not isNilOrEmpty( parentArgs['title'..f] ) then
 
else
navboxParams['group'..f] = ''
end
navboxParams['list'..f] = table.concat( elements )
elseif currentEntityId then
 
end
--Categorize
table.insert( elements, createRow( params[1], params[2] .. ':', val, getLink( params[3], val, params[4]) , true ) )
if not isNilOrEmpty( parentArgs['from'..f] ) then
if params[1] ~= 'wikidata' then sourcesFound = true end
--blank "missing from" if 'from' exists
 
--blank "desynced" if 'from' matches current page
end
--cannot be "desynced" if no 'from' params
end
 
--Generate navbox title
if sourcesFound then
rowCount = rowCount + 1
if firstRow == 0 then firstRow = f end
if parentArgs['for'..f] and parentArgs['for'..f] ~= '' then
navboxParams['group'..f] = "''" .. parentArgs['for'..f] .. "''"
else
navboxParams['group'..f] = ""
end
navboxParams['list'..f] = table.concat( elements )
end
end
end --for f = 1, fromTitleCount, 1
end
if rowCount > 0 then
local Navbox = require('Module:Navbox')
if rowCount > 1 then
--remove duplicates and move page title to top
navboxParams['title'] = "[[Axuda:Control de autoridades|Control de autoridades]]"
--addlocal missingrowIDs names= {}
for f = 1,fromForCountfromTitleCount,1
do
if navboxParamsnot isNilOrEmpty( parentArgs['grouptitle'..f] == "") then
if rowIDs[parentArgs['wikidata'..f]] then --remove duplicate
navboxParams['group'..f] = "''" .. mw.wikibase.getEntity(parentArgs['wikidata'..f]):getLabel().."''"
navboxParams['group'..f] = nil
navboxParams['list'..f] = nil
else
rowIDs[parentArgs['wikidata'..f]] = true
if f > firstRow and (parentArgs['title'..f] == currentTitle.text or
parentArgs['wikidata'..f] == currentEntityId) then --move item linked to page to top
if navboxParams['group'..f] and
navboxParams['group'..f] ~= '' and
navboxParams['list'..f] and
navboxParams['list'..f] ~= '' then
local tempGroup, tempList = navboxParams['group'..f], navboxParams['list'..f]
navboxParams['group'..f], navboxParams['list'..f] = navboxParams['group'..firstRow], navboxParams['list'..firstRow]
navboxParams['group'..firstRow], navboxParams['list'..firstRow] = tempGroup, tempList
end
end
end
end
end
--adjust navbox for number of rows
navboxParams['title'] = '[[Axuda:Control de autoridades|Control de autoridades]]'
if rowCount > 2 then
navboxParams['navbar'] = 'plain'
Liña 239 ⟶ 539:
navboxParams['navbar'] = 'off'
end
elseif parentArgs['noTitle'..firstRow] then
navboxParams['group'..firstRow] = '[[Axuda:Control de autoridades|Control de autoridades]]'
else
navboxParams['group'..firstRow] = '[[Axuda:Control de autoridades|Control de autoridades]]<br />' .. navboxParams['group'..firstRow]
end
return Navbox._navbox(navboxParams)
--return navbox
else
outString = Navbox._navbox(navboxParams)
return ""
end --if rowCount > 0
--Add categories
if string.sub(currentTitle.subpageText,1,9) == 'testcases' then parentArgs['demo'] = true end
if not isNilOrEmpty( parentArgs['demo'] ) then
elseif currentTitle.namespace == 0 then
end
return outString .. errors
end