Module:Core

--[[   __  __           _       _         ____                |  \/  | ___   __| |_   _| | ___ _ / ___|___  _ __ ___  | |\/| |/ _ \ / _` | | | | |/ _ (_) |   / _ \| '__/ _ \ | |  | | (_) | (_| | |_| | |  __/_| |__| (_) | | |  __/ |_|  |_|\___/ \__,_|\__,_|_|\___(_)\____\___/|_|  \___| 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 " " 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 " " 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 ..label.. end

return core