--[[
__ __ _ _ ____
| \/ | ___ __| |_ _| | ___ _ / ___|___ _ __ ___
| |\/| |/ _ \ / _` | | | | |/ _ (_) | / _ \| '__/ _ \
| | | | (_) | (_| | |_| | | __/_| |__| (_) | | | __/
|_| |_|\___/ \__,_|\__,_|_|\___(_)\____\___/|_| \___|
This module is intended as collection of core functions shared among several Lua modules
creating infobox templates on Commons.
Authors and maintainers:
* User:Jarekt
]]
local core = {}
------------------------------------------------------------------------------
-- Based on frame structure create "args" table with all the input parameters.
-- All inputs are not not case-sensitive and underscored are treated the same
-- way as speces. Input values are trimmed and empty string are converted to
-- nils. If "lang" is not provided than we substitute user's prefered language.
function core.getArgs(frame)
local function normalize_input_args(input_args, output_args)
for name, value in pairs( input_args ) do
value = string.gsub(value, "^%s*(.-)%s*$", "%1") -- trim whitespaces from the beggining and the end of the string
if value ~= '' then -- nuke empty strings
if type(name)=='string' then
name = string.gsub( string.lower(name), ' ', '_')
end
output_args[name] = value
end
end
return output_args
end
local args = {}
args = normalize_input_args(frame:getParent().args, args)
args = normalize_input_args(frame.args, args)
if (args.lang and mw.language.isSupportedLanguage(args.lang)) then
args.lang = string.lower(args.lang)
else
args.lang = frame:callParserFunction("int","lang") -- get user's chosen language
end
return args
end
------------------------------------------------------------------------------
-- code equivalent to https://commons.wikimedia.org/wiki/Template:LangSwitch
function core.langSwitch(list,lang)
local langList = mw.language.getFallbacksFor(lang)
table.insert(langList,1,lang)
for i,language in ipairs(langList) do
if list[language] then
return list[language]
end
end
end
------------------------------------------------------------------------------
-- Function allowing for consistent treatment of boolean-like wikitext input.
-- It works similarly to Module:Yesno
function core.yesno(val, default)
if type(val) == 'boolean' then
return val
elseif type(val) == 'number' then
if val==1 then
return true
elseif val==0 then
return false
end
elseif type(val) == 'string' then
val = mw.ustring.lower(val) -- put in lower case
if val == 'no' or val == 'n' or val == 'false' or val == '0' then
return false
elseif val == 'yes' or val == 'y' or val == 'true' or val == '1' then
return true
end
end
return default
end
------------------------------------------------------------------------------
-- read Commons Data:SOMENAME.tab dataset and look for message identified by a
-- "key" in a language "lang". See editAtWikidata as an example.
function core.formatMessage(dataset, key, lang)
for _, row in pairs(mw.ext.data.get(dataset, lang).data) do
local id, msg = unpack(row)
if id == key then
return mw.message.newRawMessage(msg):plain()
end
end
error('Invalid message key "' .. key .. '"')
end
-------------------------------------------------------------------------------
-- Assembles the "Edit at Wikidata" pen icon and returns it as wikitext string.
-- Dependencies: Data:I18n/EditAt.tab
-------------------------------------------------------------------------------
function core.editAtWikidata(entityID, propertyID, lang)
local msg = core.formatMessage('I18n/EditAt.tab', 'EditAtWikidata', lang)
local link = 'https://www.wikidata.org/wiki/' .. entityID .. (propertyID == "" and "" or ("#" .. propertyID))
return " [[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="..msg.."|link="..link.."|"..msg.."]]"
end
-------------------------------------------------------------------------------
-- Assembles the "Edit at SDC" pen icon and returns it as wikitext string.
-- Dependencies: Data:I18n/EditAt.tab
-------------------------------------------------------------------------------
function core.editAtSDC(propertyID, lang)
local msg = core.formatMessage('I18n/EditAt.tab', 'EditAtSDC', lang)
local link = mw.title.getCurrentTitle():fullUrl() .. (propertyID == "" and "" or ("#" .. propertyID))
return " [[File:OOjs UI icon edit-ltr-progressive.svg |frameless |text-top |10px |alt="..msg.."|link="..link.."|"..msg.."]]"
end
-------------------------------------------------------------------------------
function core.getLabel(id, userLang)
-- code equivalent to require("Module:Wikidata label")._getLabel
local label, link
-- build language fallback list
local langList = mw.language.getFallbacksFor(userLang)
table.insert(langList, 1, userLang)
for _, lang in ipairs(langList) do -- loop over language fallback list looking for label in the specific language
label = mw.wikibase.getLabelByLang(id, lang)
if label then break end -- label found and we are done
end
for _, lang in ipairs(langList) do -- loop over language fallback list looking for label in the specific language
link = mw.wikibase.getSitelink(id, lang .. 'wiki')
if link then
link = mw.ustring.format('w:%s:%s', lang, link)
break
end
end
link = link or ('d:'..id)
label = label or id
return '[['..link..'|'..label..']]'
end
return core