Module:Vernacular/sandbox

Lua
CodeDiscussionEditHistoryLinksLink count Subpages:DocumentationTestsResultsSandboxLive code All modules

Documentation for this module may be created at Module:Vernacular/sandbox/doc

Code

--[[
  __  __           _       _      __     __                               _            
 |  \/  | ___   __| |_   _| | ___ \ \   / /__ _ __ _ __   __ _  ___ _   _| | __ _ _ __ 
 | |\/| |/ _ \ / _` | | | | |/ _ (_) \ / / _ \ '__| '_ \ / _` |/ __| | | | |/ _` | '__|
 | |  | | (_) | (_| | |_| | |  __/_ \ V /  __/ |  | | | | (_| | (__| |_| | | (_| | |   
 |_|  |_|\___/ \__,_|\__,_|_|\___(_) \_/ \___|_|  |_| |_|\__,_|\___|\__,_|_|\__,_|_|   
                                                                                           
 Authors and maintainers:
* User:Jarekt 
]]

local core = require('Module:Core')

-- local function to help normalize input arguments
local function normalize_input_args(input_args, output_args)
	for name, value in pairs( input_args ) do 
		if value ~= '' then -- nuke empty strings
			if type(name)=='string' then name=string.lower(name) end -- convert to lower case
			output_args[name] = value
		end
	end
	return output_args
end

--------------------------------------------------------------------------------
local function langWrapper(text, textLang) 
-- code equivalent to https://commons.wikimedia.org/wiki/Template:Description
	local language = mw.language.new( textLang )
	local dir  = language:getDir()  
	local Lang = language:ucfirst(mw.language.fetchLanguageName( textLang, textLang))
	local str  = mw.ustring.format('<span class="language %s"><b>%s:</b> %s</span>', textLang, Lang, text)
    return str
end

-- initialize object to be returned
local p = {}

--------------------------------------------------------------------------------
function p.get_vernacular_names1(item) 
	-- get a list of taxon common name (P1843), one for each language
	local vn_dict = {}
	for _, statement in ipairs(mw.wikibase.getBestStatements( item, 'P1843' ) or {}) do
		if (statement.mainsnak.snaktype == "value") and (statement.rank ~= 'deprecated')  then 
			local val = statement.mainsnak.datavalue.value
			local lang = val.language
			local text = val.text
			local sitelink = mw.wikibase.getSitelink(item, lang .. 'wiki')
			if (sitelink) then
			   text = '[[:' .. lang .. ':' .. sitelink .. '|' .. text .. ']]'			
			end
			vn_dict[lang] = langWrapper(text, lang)
		end
	end
	return vn_dict
end

--------------------------------------------------------------------------------
function p.get_vernacular_names2(item) 
	-- get a list of taxon common name (P1843), one for each language
	local entity = mw.wikibase.getEntity( item )
	local statements = entity:getBestStatements( 'P1843' )
	local taxon_name = core.parseStatements(entity:getBestStatements( 'P225' ), nil)[1]

	local vn_dict = {}
	for _, statement in ipairs(statements or {}) do
		if (statement.mainsnak.snaktype == "value") and (statement.rank ~= 'deprecated')  then 
			local val = statement.mainsnak.datavalue.value
			local lang = val.language
			local text = val.text
			local sitelink = mw.wikibase.getSitelink(item, lang .. 'wiki')
			if (sitelink) then
			   text = '[[:' .. lang .. ':' .. sitelink .. '|' .. text .. ']]'			
			end
			vn_dict[lang] = langWrapper(text, lang)
		end
	end
	
	for lang, value in pairs( entity.labels or {} ) do 
		local label = value.value
		if (not vn_dict[lang]) and (label~=taxon_name) then
			local text = label
			local sitelink = mw.wikibase.getSitelink(item, lang .. 'wiki')
			if (sitelink) then
			   text = '[[:' .. lang .. ':' .. sitelink .. '|' .. text .. ']]'			
			end
			vn_dict[lang] = langWrapper(text, lang)			
		end
	end
	
	return vn_dict
end
	
--------------------------------------------------------------------------------
local function add_local_names(vn_dict, args, item) 
	-- add names provided to the template
	for lang, text in pairs( args ) do 
		if type(lang)=='string' and mw.language.isSupportedLanguage(lang) and (not vn_dict[lang]) then -- lang has to be a valid language 
			vn_dict[lang] = langWrapper(text, lang)
		end
	end
	return vn_dict
end

--------------------------------------------------------------------------------
local function render_QS_URL(vn_dict, args, item)
	local today = '+' .. os.date('!%F') .. 'T00:00:00Z/11' -- today's date in QS format
	local url = mw.uri.decode(mw.title.getCurrentTitle():canonicalUrl())  -- URL to current page
	local ref = '|S143|Q565|S813|' .. today .. '|S4656|"' .. mw.uri.decode(url) .. '"'
	local icon = 'File:Commons_to_Wikidata_QuickStatements.svg'
	local exclude = { no=1 }

	qsTable = {}
	local str = '%s|P1843|%s:"%s"|S143|Q565|S813|%s|S4656|"%s"'
	for lang, text in pairs( args ) do 
		if type(lang)=='string' and mw.language.isSupportedLanguage(lang) and 
		   (not vn_dict[lang]) and (not exclude[lang]) then 
			table.insert(qsTable, string.format(str, item, lang, text, today, url))
		end
	end
	if #qsTable==0 then
		return '&nbsp;<span style="color:red;font-weight:bold">(Redundant local names)</span>'
	end 

	local qsURL = table.concat(qsTable, '||')
	local hoverMsg = 'Add properties to Wikidata item based on this file'
	qsURL = mw.uri.encode(qsURL, "PATH")
	qsURL = 'https://quickstatements.toolforge.org/#/v1=' .. qsURL    -- create full URL link
	qsURL = '&nbsp;[[' .. icon .. '|15px|link=' .. qsURL .. '|' .. hoverMsg ..']]' 
	return qsURL
end

--------------------------------------------------------------------------------
local function sort_names(vn_dict) 
    local keys = {}
    for key in pairs(vn_dict) do
        table.insert(keys, key)
    end
    table.sort(keys)

    local vn_lines = {}
    for _, key in ipairs(keys) do
        table.insert(vn_lines, '\n*'..vn_dict[key])
    end

    return table.concat(vn_lines, '')
end

--------------------------------------------------------------------------------
function p.vernacular_name(frame) 
	-- switch to lowercase parameters to make them case independent
	local args = {}
	args = normalize_input_args(frame:getParent().args, args)
	args = normalize_input_args(frame.args, args)
	local item = args[1] or args.wikidata or args.item or args.usewikidata
	local extended = core.yesno(args.extended, false)
		
	-- get the content of the infobox: a list of common names 
	local qsURL = ''
	local qs_cat = ''
	local vn_dict = {}
	if (item) then
		if (extended) then
			vn_dict = p.get_vernacular_names2(item)
		else
			vn_dict = p.get_vernacular_names1(item)
		end
		qsURL = render_QS_URL(vn_dict, args, item)
		if #qsURL>0 then
			qs_cat = '\n[[Category:Vernacular_names template with quick statements]]'
		end 
	end 
	vn_dict = add_local_names(vn_dict, args, item) 
	vn = sort_names(vn_dict)
	if #vn==0 then
		return ''
	end 
	
    local style0 = 'display:table;margin:2px 0;border:1px solid #CCC;padding:1px;'
    local style1 = 'background:var(--background-color-success-subtle,#F1FCF1); color:var(--color-base,#202122);padding:0 .25em'
	local style2 = 'font-size:95%;background:var(--background-color-interactive-subtle,#FDFDFD); color:var(--color-base,#202122); padding:0 4px'
	
	-- Get the header of the infobox
	local title = frame:expandTemplate{ title = 'VN/title' }
	local logo  = string.format("[[File:Wikidata-logo.svg|20px|wikidata:%s|link=wikidata:%s]]", item, item)
	local edit  = core.editAtWikidata(item, '', args.lang)
	title = string.format('<div style="%s">%s\n%s%s%s</div>', style1, title, logo, edit, qsURL)

	local body = string.format('<div class="hlist" style="%s">%s\n</div>', style2, vn)
	res = string.format('<div class="biota" style="%s">%s\n%s</div>', style0, title, body)
	return res .. qs_cat
end

return p