This module depends on the following other modules: |
Related pages |
---|
About
This module allows Module:Taxonbar/conf to automatically update its own documentation table of Wikidata taxon ID properties on Template:Taxonbar/doc.
Usage
{{#invoke:Taxonbar/confdoc|confdoc}}
Output
{{#invoke:Taxonbar/confdoc|confdoc}}
Lua error: callParserFunction: function "#statements" was not found.
Wikidata link information
{{#invoke:Taxonbar/confdoc|wikidataInfo
Lua error at line 82: attempt to index field 'wikibase' (a nil value).
require('strict')
local conf = require( "Module:Taxonbar/conf" ) -- configuration module
local p = {}
function p.confdoc( frame )
local wikitable = mw.html.create('table')
wikitable:addClass('wikitable sortable')
:tag('caption')
:wikitext('Taxon identifiers by parameter name')
:done()
:tag('tr')
:tag('th')
:wikitext('Parameter')
:tag('th')
:attr('data-sort-type', 'number')
:css('white-space', 'nowrap')
:wikitext('Wikidata ID')
:tag('th')
:wikitext('Authority')
:tag('th')
:wikitext('Description')
local format = string.format
for _, db in pairs( conf.databases ) do
local prop = db[3]
if type(prop) == 'number' and prop > 0 then
local param = mw.ustring.lower(db[1])
local row = mw.html.create('tr')
row
:tag('td')
:wikitext(param)
:tag('td')
:attr('data-sort-value', prop)
:wikitext(format('[[d:Property:P%d|P%d]]', prop, prop))
-- {{#statements:P1629|from=P{{{1|}}}}}
:tag('td')
:wikitext(frame:callParserFunction{
name = '#statements:P1629',
args = { from = 'P' .. prop }
})
:tag('td')
:wikitext(mw.wikibase.getDescription('P' .. prop))
wikitable:node(row)
end
end
return wikitable
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 !! 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 .. '\n{{smalldiv|1=' .. links .. '}}'
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