Module:Core

    From Commons
    Revision as of 10:01, 29 April 2020 by Shaunak Chakraborty (talk | contribs) (1 revision imported)
    (diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

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