×
Create a new article
Write your page title here:
We currently have 3 articles on Ballmedia Commons. Type your article name above or create one of the articles listed here!



    Ballmedia Commons

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

    --[==[
    This module implements [[Template:Dir]].
    
    Enter this to run tests in the Lua console:
    =getmetatable(p).quickTests()
    
    --]==]
    local rtlOverrides = require('Module:Dir/RTL overrides')
    local p = {}
    
    local function trim(s)
        if s and s ~= '' then s = tostring(s):match('^%s*(.-)%s*$') end
        if s == '' then return nil end
        return s
    end
    
    function p.rtlLangs(isRTL)
        if isRTL == nil then isRTL = true end
        return rtlOverrides[isRTL] or {}
    end
    
    function p.isRTL(code)
        if type(code) ~= 'string' then return nil end
        local v = rtlOverrides[code] -- very fast and not limited in the number of supported languages
        if v ~= nil then return v end -- return it if mapped, otherwise use MediaWiki library:
        local success, ret = pcall(function ()
            return mw.language.new(code):isRTL() -- expensive and limited to 20 languages per MediaWiki instance
        end)
        return success and ret
    end
    
    function p.select(code, rtl, ltr)
        if p.isRTL(code) then
            return rtl
        else
            return ltr
        end
    end
    
    -- Used via a template {{Dir|language-code|wikitext if rtl|wikitext if ltr}}
    -- which just calls {{#invoke:Dir|main}}, the 3 parameters are automatically trimmed:
    -- Parameter 1 takes the default value from {{Int:Lang}} if it's empty or not specified.
    -- Parameter 2 can be named rtl, may be explicitly empty, otherwise takes the default value 'rtl' only if it's not specified.
    -- Parameter 3 can be named ltr, may be explicitly empty, otherwise takes the default value 'ltr' only if it's not specified.
    function p.main(frame)
        local args = frame:getParent().args -- Parameters used to transclude Template:Dir
        local code = trim(args[1]) or frame:callParserFunction('Int', 'Lang')
        local rtl = trim(args.rtl or args[2] or 'rtl')
        local ltr = trim(args.ltr or args[3] or 'ltr')
        return p.select(code, rtl, ltr)
    end
    
    setmetatable(p, { quickTests = function ()
        local rtlLangs = p.rtlLangs(true)
        local ltrLangs = p.rtlLangs(false)
    
        -- Basic check of data format
        local function checkLangs(name, langs)
            for k, lang in pairs(langs) do
                assert(type(k) == 'number' and k == math.floor(k)
                    and type(lang) == 'string' and #lang >= 2 and #lang <= 16
                    and lang:find('^[a-z][%-0-9a-z]*[0-9a-z]$') == 1,
                    ": Invalid sequence of language codes, " .. name .. "['" .. k .. "'] = '" .. lang .. "'")
            end
            return true
        end
        local ok, msg
        ok, msg = pcall(checkLangs, 'rtlLangs', rtlLangs)
        if not ok then return false, msg end
        ok, msg = pcall(checkLangs, 'ltrLangs', ltrLangs)
        if not ok then return false, msg end
    
        -- Build inverse maps of languages having each direction
        local isrtl, isltr = {}, {}
        for _, lang in ipairs(rtlLangs) do isrtl[lang] = true end
        for _, lang in ipairs(ltrLangs) do isltr[lang] = true end
        -- Check conflicts using the two inverse maps
        for _, lang in ipairs(rtlLangs) do
            if isltr[lang] then return false, ": Direction conflict for '" .. lang .. "'" end
        end
        for _, lang in ipairs(ltrLangs) do
            if isrtl[lang] then return false, ": Direction conflict for '" .. lang .. "'" end
        end
    
        -- Log missing languages (allows filling the tables above) according to MediaWiki internal data
        local knownLangs, isKnownLang = mw.language.fetchLanguageNames(), {}
        for lang, _ in pairs(knownLangs) do
             isKnownLang[lang] = true
             if rtlOverrides[lang] == nil then -- only if we still don't have data for this language
                 -- Note: we cannot check more than 20 languages at once, then MediaWiki raises an error.
                 -- So this test only runs on the Lua console, where you can update the tables at top.
                 -- This also means we cannot compare what MediaWiki returns with the direction we map here for all languages.
                 ok, value = pcall(function() return tostring(mw.language.new(lang):isRTL()) end)
                 mw.log("Warning: missing direction for language '" .. lang .. "', MediaWiki returns '" .. value .. "'")
             end
        end
    
        -- utility: reverse order iterator on sequences
        local function revipairs(t)
            return function(t, i)
                i = i - 1
                local v = t[i]
                if v == nil then return nil end
                return i, v
            end, t, #t + 1
        end
        -- Sort and deduplicate language code values (by scanning backward) for data cleanup
        -- Also log languages having a direction mapping in this module but still not known by MediaWiki
        table.sort(rtlLangs)
        table.sort(ltrLangs)
        for i, lang in revipairs(rtlLangs) do
            if rtlLangs[i - 1] == rtlLangs[i] then table.remove(rtlLangs, i) end
            if isKnownLang[lang] == nil then
                 mw.log("RTL language '" .. lang .. "' still not known by Mediawiki (could be a missing alias or variant)")
            end
        end
        for i, lang in revipairs(ltrLangs) do
            if ltrLangs[i - 1] == ltrLangs[i] then table.remove(ltrLangs, i) end
            if isKnownLang[lang] == nil then
                 mw.log("LTR language '" .. lang .. "' still not known by Mediawiki (could be a missing alias or variant)")
            end
        end
    
        -- Final presentation of current lists, sorted and deduplicated
        mw.log("----")
        mw.log("local rtlLangs = { '" .. table.concat(rtlLangs, "', '") .. "' }")
        mw.log("local ltrLangs = { '" .. table.concat(ltrLangs, "', '") .. "' }")
        return true
    end })
    
    return p
    
    Cookies help us deliver our services. By using our services, you agree to our use of cookies.

    Recent changes

  • Grim kim • 3 months ago
  • G1-Busssy • 4 months ago
  • G1-Busssy • 4 months ago
  • Cookies help us deliver our services. By using our services, you agree to our use of cookies.