Difference between revisions of "Module:Taxonbar/sandbox2"

From blackwiki
Jump to navigation Jump to search
blackwiki>Ahecht
(create)
 
blackwiki>Ahecht
(implement multiple rows)
Line 82: Line 82:
 
function p.authorityControlTaxon( frame )
 
function p.authorityControlTaxon( frame )
 
local parentArgs = copyTable(frame:getParent().args)
 
local parentArgs = copyTable(frame:getParent().args)
local stringArgs = false
+
local stringArgs, showBar = false, false
--Make args case insensitive
+
local fromForCount = 1
 +
--Cleanup args
 
for k, v in pairs( frame:getParent().args ) do
 
for k, v in pairs( frame:getParent().args ) do
 
if type(k) == 'string' then
 
if type(k) == 'string' then
 +
--make args case insensitive
 
v = mw.ustring.lower(v)
 
v = mw.ustring.lower(v)
 
local lowerk = mw.ustring.lower(k)
 
local lowerk = mw.ustring.lower(k)
Line 92: Line 94:
 
parentArgs[k] = nil
 
parentArgs[k] = nil
 
end
 
end
if v and v ~= '' and v ~= 'no' and lowerk ~= 'from' then stringArgs = true end
+
--remap abc to abc1
 +
if not mw.ustring.find(lowerk,"%d$") then --if no number at end of param
 +
if not parentArgs[lowerk..'1'] or parentArgs[lowerk..'1'] == '' then
 +
parentArgs[lowerk..'1'] = v
 +
parentArgs[lowerk] = nil
 +
end
 +
end
 +
if v and v ~= '' then
 +
--find highest from param
 +
if mw.ustring.sub(lowerk,1,4) == "from" then
 +
local fromNumber = tonumber(mw.ustring.sub(lowerk,5,-1))
 +
if fromNumber and fromNumber >= fromForCount then fromForCount = fromNumber end
 +
elseif mw.ustring.sub(lowerk,1,3) == "for" then
 +
local forNumber = tonumber(mw.ustring.sub(lowerk,4,-1))
 +
if forNumber and forNumber >= fromForCount then fromForCount = forNumber end
 +
elseif v ~= 'no' and lowerk ~= 'for' then
 +
stringArgs = true
 +
end
 +
end
 
end
 
end
 
end
 
end
--remap aliases
+
 
for _, a in pairs( conf.aliases ) do
+
--Setup navbox
local alias, name = mw.ustring.lower(a[1]), mw.ustring.lower(a[2])
+
local navboxParams = {
if parentArgs[alias] and not parentArgs[name] then
+
name  = 'Taxonbar',
parentArgs[name] = parentArgs[alias]
+
bodyclass = 'hlist',
parentArgs[alias] = nil
+
listclass = '',
 +
groupstyle = 'text-align: left;',
 +
}
 +
if fromForCount>1 then navboxParams['title'] = "[[Help:Taxon identifiers|Taxon identifiers]]" end
 +
 
 +
for f = 1,fromForCount,1
 +
do
 +
local elements, title = {}, {}
 +
--cleanup parameters
 +
if parentArgs['from'..f] == '' then parentArgs['from'..f] = nil end
 +
if parentArgs['for'..f] == '' then parentArgs['for'..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] then
 +
parentArgs[name..f] = parentArgs[alias..f]
 +
parentArgs[alias..f] = nil
 +
end
 +
end
 +
--Fetch Wikidata item
 +
local item = mw.wikibase.getEntity(parentArgs['from'..f])
 +
local label = item and item:getLabel()
 +
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 (not parentArgs['wikidata'..f] or parentArgs['wikidata'..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
 
end
end
+
if title.namespace == 0 or stringArgs then --Only in the main namespace or if there are manual overrides
--Create rows
+
local sourcesFound = false
local elements, title = {}, {}
+
for _, params in pairs( conf.databases ) do
+
params[1] = mw.ustring.lower(params[1])
--Look for for2/from2, etc.
+
--Wikidata fallback if requested
if parentArgs['from'] == '' then parentArgs['from'] = nil end
+
if (item ~= nil and item.claims ~= nil) and params[3] ~= 0 and (not parentArgs[params[1]..f] or parentArgs[params[1]..f] == '') then
local fromCount, forCount = 0, 0
+
local wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
for k, v in pairs( parentArgs ) do
+
if wikidataIds[1] then
if v and v ~= '' then
+
parentArgs[params[1]..f] = wikidataIds[1]
if mw.ustring.sub(k,1,4) == "from"  then
+
end
local fromNumber = tonumber(mw.ustring.sub(k,5,-1))
+
end
if fromNumber and fromNumber > fromCount then fromCount = fromNumber end
+
local val = parentArgs[params[1]..f]
elseif mw.ustring.sub(k,1,3) == "for" then
+
if val and val ~= '' and mw.ustring.lower(val) ~= 'no' and params[3] ~= 0 then
local forNumber = tonumber(mw.ustring.sub(k,4,-1))
+
table.insert( elements, createRow( params[1], params[2] .. ':', val, getLink( params[3], val ), true ) )
if forNumber and forNumber > forCount then forCount = forNumber end
+
if params[1] ~= 'wikidata' then sourcesFound = true end
 +
end
 +
end
 +
 +
--Generate navbox title
 +
local groupName = ""
 +
if fromForCount == 1 then groupName = '[[Help:Taxon identifiers|Taxon identifiers]]<br />' end
 +
if parentArgs['for'..f] and parentArgs['for'..f] ~= '' then groupName = groupName .. "''" .. parentArgs['for'..f] .. "''" end
 +
 +
if sourcesFound then
 +
showBar = true
 +
navboxParams['group'..f] = groupName
 +
navboxParams['list'..f] = table.concat( elements )
 
end
 
end
 
end
 
end
end
 
local maxCount = math.max(forCount, fromCount)
 
if maxCount > 0 then
 
parentArgs['from'] = parentArgs['from' .. maxCount]
 
parentArgs['for'] = parentArgs['for' .. maxCount]
 
 
end
 
end
 
 
--Fetch Wikidata item
+
local Navbox = require('Module:Navbox')
local item = mw.wikibase.getEntity(parentArgs['from'])
+
local label = item and item:getLabel()
+
if showBar then
if label and label ~= '' then
+
return Navbox._navbox(navboxParams)
title = mw.title.new(label)
 
if not title then title = mw.title.getCurrentTitle() end
 
 
else
 
else
title = mw.title.getCurrentTitle()
+
return ""
end
 
if (not parentArgs['wikidata'] or parentArgs['wikidata'] == '') and (title.namespace == 0) then
 
if parentArgs['from'] then parentArgs['wikidata'] = parentArgs['from'] elseif item then parentArgs['wikidata'] = item.id end
 
end
 
if title.namespace == 0 or stringArgs then --Only in the main namespace or if there are manual overrides
 
local sourcesFound = false
 
for _, params in pairs( conf.databases ) do
 
params[1] = mw.ustring.lower(params[1])
 
--Wikidata fallback if requested
 
if (item ~= nil and item.claims ~= nil) and params[3] ~= 0 and (not parentArgs[params[1]] or parentArgs[params[1]] == '') then
 
local wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
 
if wikidataIds[1] then
 
parentArgs[params[1]] = wikidataIds[1]
 
end
 
end
 
local val = parentArgs[params[1]]
 
if val and val ~= '' and mw.ustring.lower(val) ~= 'no' and params[3] ~= 0 then
 
table.insert( elements, createRow( params[1], params[2] .. ':', val, getLink( params[3], val ), true ) )
 
if params[1] ~= 'wikidata' then sourcesFound = true end
 
end
 
end
 
 
--Generate navbox title
 
local groupName = ""
 
if maxCount < 1 then groupName = '[[Help:Taxon identifiers|Taxon identifiers]]<br />' end
 
if parentArgs['for'] and parentArgs['for'] ~= '' then groupName = groupName .. "''" .. parentArgs['for'] .. "''" end
 
 
 
local Navbox = require('Module:Navbox')
 
 
 
if sourcesFound then
 
return Navbox._navbox( {
 
name  = 'Taxonbar',
 
bodyclass = 'hlist',
 
listclass = '',
 
groupstyle = 'text-align: left;',
 
group1 = groupName, --.. elementscats,
 
list1 = table.concat( elements )
 
} )
 
else
 
return ""
 
end
 
 
end
 
end
 
end
 
end
  
 
return p
 
return p

Revision as of 22:22, 3 January 2018

Documentation for this module may be created at Module:Taxonbar/sandbox2/doc

require('Module:No globals')

local conf = require( "Module:Taxonbar/conf" )

local function getIdsFromWikidata( item, property )
	local ids = {}
	if not item.claims[property] then
		return ids
	end
	for _, statement in pairs( item.claims[property] ) do
		if statement.mainsnak.datavalue then
			table.insert( ids, statement.mainsnak.datavalue.value )
		end
	end
	return ids
end

local function getLink( property, val )
	local link = ""
	if mw.ustring.find( val, '//' ) then
		link = val
	else
		if type(property) == 'number' then
			local entityObject = mw.wikibase.getEntityObject('P'..property)
			local dataType = entityObject.datatype
			if dataType == "external-id" then
				local formatterURL = entityObject:getBestStatements('P1630')[1]
				if formatterURL then link = formatterURL.mainsnak.datavalue.value end
			elseif dataType == "url" then
				local subjectItem = entityObject:getBestStatements('P1629')[1]
				if subjectItem then
					local officialWebsite = mw.wikibase.getEntityObject(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 subjectItem = entityObject:getBestStatements('P1629')[1]
					if subjectItem then
						local officialWebsite = mw.wikibase.getEntityObject(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]
						if officialWebsite then	link = officialWebsite.mainsnak.datavalue.value end
					end
				end
			end
		elseif type(property) == 'string' then
			link = property
		end
		link = mw.ustring.gsub(link, '$1', val)
	end
	link = mw.ustring.gsub(link, '^[Hh][Tt][Tt][Pp]([Ss]?)&#58;//', 'http%1://') -- fix wikidata URL
	val = mw.ustring.match(val, '([^=/]*)/?$') -- get display name from end of URL
	if mw.ustring.find( link, '//' ) then
		return '['..link..' '..val..']'
	elseif link == "" then
		return val
	else
		return '<span class="external">[['..link..'|'..val..']]</span>'
	end
end

local function createRow( id, label, rawValue, link, withUid )
	if link then
		local outStr = '*<span style="white-space:nowrap;">' .. label .. ' <span'
		if withUid then outStr = outStr..' class="uid"' end
		return outStr..'>' .. link .. '</span></span>\n'
	else
		return '* <span class="error">The identifier ' .. id .. ' ' .. rawValue .. ' is not valid.</span>\n'
	end
end

local function copyTable(inTable)
	if type(inTable) ~= 'table' then return inTable end
	local outTable = setmetatable({}, getmetatable(inTable))
	for key, value in pairs (inTable) do outTable[copyTable(key)] = copyTable(value) end
	return outTable
end

local p = {}

function p.authorityControlTaxon( frame )
	local parentArgs = copyTable(frame:getParent().args)
	local stringArgs, showBar = false, false
	local fromForCount = 1
	--Cleanup args
	for k, v in pairs( frame:getParent().args ) do
		if type(k) == 'string' then
			--make args case insensitive
			v = mw.ustring.lower(v)
			local lowerk = mw.ustring.lower(k)
			if not parentArgs[lowerk] or parentArgs[lowerk] == '' then
				parentArgs[lowerk] = v
				parentArgs[k] = nil
			end
			--remap abc to abc1
			if not mw.ustring.find(lowerk,"%d$") then --if no number at end of param
				if not parentArgs[lowerk..'1'] or parentArgs[lowerk..'1'] == '' then
					parentArgs[lowerk..'1'] = v
					parentArgs[lowerk] = nil
				end
			end
			if v and v ~= '' then
				--find highest from param
				if mw.ustring.sub(lowerk,1,4) == "from" then
					local fromNumber = tonumber(mw.ustring.sub(lowerk,5,-1))
					if fromNumber and fromNumber >= fromForCount then fromForCount = fromNumber end
				elseif mw.ustring.sub(lowerk,1,3) == "for" then
					local forNumber = tonumber(mw.ustring.sub(lowerk,4,-1))
					if forNumber and forNumber >= fromForCount then fromForCount = forNumber end
				elseif v ~= 'no' and lowerk ~= 'for' then
					stringArgs = true
				end
			end
		end
	end

	--Setup navbox
	local navboxParams = {
		name  = 'Taxonbar',
		bodyclass = 'hlist',
		listclass = '',
		groupstyle = 'text-align: left;',
	}
	if fromForCount>1 then navboxParams['title'] = "[[Help:Taxon identifiers|Taxon identifiers]]" end

	for f = 1,fromForCount,1
	do
		local elements, title = {}, {}
		--cleanup parameters
		if parentArgs['from'..f] == '' then parentArgs['from'..f] = nil end
		if parentArgs['for'..f] == '' then parentArgs['for'..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] then
				parentArgs[name..f] = parentArgs[alias..f]
				parentArgs[alias..f] = nil
			end
		end
		--Fetch Wikidata item
		local item = mw.wikibase.getEntity(parentArgs['from'..f])
		local label = item and item:getLabel()
		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 (not parentArgs['wikidata'..f] or parentArgs['wikidata'..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.namespace == 0 or stringArgs then --Only in the main namespace or if there are manual overrides
			local sourcesFound = false
			for _, params in pairs( conf.databases ) do
				params[1] = mw.ustring.lower(params[1])
				--Wikidata fallback if requested
				if (item ~= nil and item.claims ~= nil) and params[3] ~= 0 and (not parentArgs[params[1]..f] or parentArgs[params[1]..f] == '') then
					local wikidataIds = getIdsFromWikidata( item, 'P' .. params[3] )
					if wikidataIds[1] then
						parentArgs[params[1]..f] = wikidataIds[1]
					end
				end
				local val = parentArgs[params[1]..f]
				if val and val ~= '' and mw.ustring.lower(val) ~= 'no' and params[3] ~= 0 then
					table.insert( elements, createRow( params[1], params[2] .. ':', val, getLink( params[3], val ), true ) )
					if params[1] ~= 'wikidata' then sourcesFound = true end
				end
			end
			
			--Generate navbox title
			local groupName = ""
			if fromForCount == 1 then groupName = '[[Help:Taxon identifiers|Taxon identifiers]]<br />' end
			if parentArgs['for'..f] and parentArgs['for'..f] ~= '' then groupName = groupName .. "''" .. parentArgs['for'..f] .. "''" end
			
			if sourcesFound then
				showBar = true
				navboxParams['group'..f] = groupName
				navboxParams['list'..f] = table.concat( elements )
			end
		end
	end
	
	local Navbox = require('Module:Navbox')
	
	if showBar then
		return Navbox._navbox(navboxParams)
	else
		return ""
	end
end

return p