Jump to content

Module:Taxonbar/confdoc: Difference between revisions

From Wikipedia, the free encyclopedia
Content deleted Content added
less expensive method (get example info from qualifiers rather than call getEntities on each example
improve formatting of examples
Line 130: Line 130:
--mw.addWarning ( mw.wikibase.renderSnak( value ))
--mw.addWarning ( mw.wikibase.renderSnak( value ))
local id = mw.wikibase.renderSnak( value )
local id = mw.wikibase.renderSnak( value )
examples = examples .. '<br/>id=<code>' .. id .. '</code>'
examples = examples .. '<br/><small>id=<code>' .. id .. '</code></small>'
local link = formatterURL:gsub('$1', id)
local link = formatterURL:gsub('$1', id)
if (datatype == "url") then link = id end
if (datatype == "url") then link = id end

Revision as of 13:00, 17 November 2021

require('Module:No globals')

local conf = require( "Module:Taxonbar/conf" ) -- configuration module

local p = {}
	
function p.confdoc( frame )
	local wikitable = '{| class="wikitable sortable"\n' .. 
					  '|-\n' .. 
					  '! Parameter !! data-sort-type=number style="white-space: nowrap;"|Wikidata ID !! Authority !! Description'
	
	for _, db in pairs( conf.databases ) do
		local param = mw.ustring.lower(db[1])
		local prop = db[3]
		if type(prop) == 'number' and prop > 0 then
			local TaxonbarProperty = frame:expandTemplate{ title = 'Taxonbar/Property', args = { prop } }
			wikitable = wikitable .. '\n' .. 
					    '|-\n' .. 
					    '|' .. param .. '||' .. TaxonbarProperty
		end
	end
	
	return wikitable .. '\n|}'
end
--[[ p.wikidataInfo( frame )
    -function to show formatURL and id for taxonomic databases
]]
local COUNTER_MAX = 390
local counter = 0    --expensive parser function counter

function p.wikidataInfo( frame )
	counter = frame.args['counter']  or COUNTER_MAX  -- prevent too many expensive calls
	local start = frame.args['start'] or "a"
	local finish = frame.args['finish'] or "zzz"
	
	local wikitable = '{| class="wikitable sortable"\n' .. 
					  '|-\n' .. 
					  '! Parameter !! data-sort-type=number style="white-space: nowrap;"|Wikidata ID !! Database !! Examples !! datatype !! formatterURL (or alternative) and examples'
	
	for _, db in pairs( conf.databases ) do
		local param = mw.ustring.lower(db[1])
		local link = db[2]
		local prop = db[3]
		local id = 'id'
		local url = 'url'
		local datatype = ""
		local examples = ""
		local links = ""
		local formatterURL = ""
		
		if type(prop) == 'number' and prop > 0 and param > start and param < finish then
			local item = mw.wikibase.getEntity('P'..prop)  --('P5354')
			counter = counter - 1
			
			if item and item ~= "" then
				datatype = item.datatype
				local statements = item:getBestStatements('P1630')[1] 
				if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
					formatterURL = statements.mainsnak.datavalue.value
					url = formatterURL
				else
					url = "No formatter URL (P1630)."
					if datatype == "url" then url = url .. " The id of the external database is the url." end
					local subjectItem = item:getBestStatements('P1629')[1]
					if subjectItem then
						local officialWebsite = mw.wikibase.getEntity(subjectItem.mainsnak.datavalue.value.id):getBestStatements('P856')[1]
						counter = counter - 1
						if officialWebsite then	
							url = url .. '<br/>website: ' ..  officialWebsite.mainsnak.datavalue.value
						end
					else
						url = url .. ' or official website (P856) of wikidata item of this property (P1629)'
						-- use third-party formatter URL. e.g for  Euring number (P3459) 
						local statements = item:getBestStatements('P3459')[1] 
						if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
				   			local thirdPartyURL = statements.mainsnak.datavalue.value
							url = url ..'<br/>use third party url: ' .. thirdPartyURL
						else
							url = url .. ' or third party formatter url (P3459) '
						end
					end
				end
                examples, links =  p.getExamples( item, prop, formatterURL, datatype )
			end

		
			wikitable = wikitable .. '\n' .. '|-' 
					    .. '\n|' .. param 
					    .. '\n|' .. '[[:d:Property:P' .. prop .. '|P' .. prop .. ']]' 
					    .. '\n|' .. link
					    .. '\n|' .. examples
					    .. '\n|' .. datatype
					    .. '\n|' .. url  .. '<small>' .. links  .. '</small>'
		end
	end
	
	return wikitable .. '\n|}'
end

function p.getExamples( propItem , prop, formatterURL, datatype)
	
	
	if counter < 0 then return "count exceeded" end
	
	local examples	= ""	
	local links	= ""	
	local exampleStatements = propItem:getBestStatements('P1855')
	local nExamples = 0
	
	--local statement = statements[1]
	for _, statement in pairs( exampleStatements ) do
		
		if nExamples == 3 then break end -- don't show more than 3 examples
			
		if statement.mainsnak and statement.mainsnak.datavalue and statement.mainsnak.datavalue.value then
			local examplesValue = statement.mainsnak.datavalue.value
			if examplesValue and examplesValue.id then
				local exampleID = examplesValue.id
				--examples = examples .. '\n*[[:d:' .. exampleID  .. '|' .. exampleID ..']] '
				local label = mw.wikibase.getLabel( exampleID )
				examples = examples .. '\n*[[' .. label .. ']] ([[:d:' .. exampleID  .. '|' .. exampleID ..']])'

                -- get information form qualifiers
                if statement.qualifiers then
                   local qualifiers = statement['qualifiers']  
                   local value = qualifiers['P'..prop][1] --['datavalue']['value']
                   --mw.addWarning (mw.wikibase.formatValues( qualifiers ))
                   --mw.addWarning (mw.wikibase.renderSnaks( qualifiers ))
                   -- mw.addWarning (mw.wikibase.formatValue( value ))
                   --mw.addWarning ( mw.wikibase.renderSnak( value ))
                   local id = mw.wikibase.renderSnak( value )
                   examples = examples .. '<br/><small>id=<code>' .. id .. '</code></small>'
                   local link = formatterURL:gsub('$1', id)
                   if (datatype == "url") then link = id end
                   links = links .. '\n*' .. link .. ''
                end


--[==[		    -- this method is expensive as it calls getEntity

		        local item = mw.wikibase.getEntity(exampleID)
		        counter = counter - 1
		        nExamples = nExamples + 1
		        
		        
		        if item and item ~= "" then
					--datatype = item.datatype
					local statements = item:getBestStatements('P225')[1] -- taxon name
					if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
						local taxon = statements.mainsnak.datavalue.value
						examples = examples .. ' [[' .. taxon .. ']]'
					end
					local statements = item:getBestStatements('P'..prop)[1] -- the databas property
					if statements and statements.mainsnak and statements.mainsnak.datavalue and statements.mainsnak.datavalue.value then
						local id = statements.mainsnak.datavalue.value
						local link = formatterURL:gsub('$1', id)
						if (datatype == "url") then link = id end
						examples = examples .. ' (' .. id .. ')'  
						links = links .. '\n*' .. link .. ''
					end
		end
]==]
		    else
		    	examples = examples .. "No example"
		    end
		else
			examples = examples .. "No examples statements"
		end
	end

    return examples, links
end
return p