Nenda kwa yaliyomo

Module:Ficha

Kutoka Wikipedia, kamusi elezo huru

Hati za moduli hii zinaweza kuanzishwa kwenye Moduli:Ficha/hati

local p = {}

local function gettitlestyletracking(ts)
    if not ts then return '' end
    ts = mw.ustring.gsub(mw.ustring.lower(ts), '%s', '')
    local tsvals = mw.text.split(ts, ';')
    table.sort(tsvals)
    local skey = table.concat(tsvals, ';')
    skey = mw.ustring.gsub(skey, '^;', '')
    skey = mw.text.encode(mw.text.encode(skey), '%c%[%]=')
    if (mw.ustring.match(';' .. ts, ';background:') or mw.ustring.match(';' .. ts, ';background%-color:')) 
        and mw.ustring.match(';' .. ts, ';text%-align:') then 
        return '[[Category:Pages using collapsible list with both background and text-align in titlestyle|' .. skey .. ' ]]'
    end
    return '[[Category:Pages using collapsible list without both background and text-align in titlestyle|' .. skey .. ' ]]'
end

local function getListItem(data)
    if not type(data) == 'string' then
        return ''
    end
    return mw.ustring.format('<li style="line-height: inherit; margin: 0">%s</li>', data)
end

local function getArgNums(args)
    local nums = {}
    for k, v in pairs(args) do
        if type(k) == 'number' and k >= 1 and math.floor(k) == k and type(v) == 'string' and mw.ustring.match(v, '%S') then
            table.insert(nums, k)
        end
    end
    table.sort(nums)
    return nums
end

local function formatAttributes(attrType, ...)
    local attributes = { ... }
    local nums = getArgNums(attributes)
    local t = {}
    for _, num in ipairs(nums) do
        table.insert(t, attributes[num])
    end
    if #t == 0 then
        return ''
    end
    return mw.ustring.format(' %s="%s"', attrType, table.concat(t, ' '))
end

local function buildList(args)
    -- Get the list items.
    local listItems = {}
    local argNums = getArgNums(args)
    for _, num in ipairs(argNums) do
        table.insert(listItems, getListItem(args[num]))
    end
    if #listItems == 0 then
        return ''
    end
    listItems = table.concat(listItems)
    
    -- Get class, style, and title data.
    local div1class = formatAttributes('class', 'NavFrame', 'mw-collapsible', not args.expand and 'mw-collapsed')
    local div1style = formatAttributes('style', args.frame_style, args.framestyle, not (args.frame_style or args.framestyle) and 'border: none; padding: 0;')
    local div2class = formatAttributes('class', 'NavHead', 'mw-collapsible-toggle')
    local div2style = formatAttributes('style', 'font-size: 105%;', args.title_style, args.titlestyle, not (args.title_style or args.titlestyle) and 'background: transparent; text-align: left;')

    -- Add a toggle button inside the title
    local title = args.title or 'List'
    local div2content = mw.ustring.format('<span style="color:blue;">%s</span> %s', '[Funga/Fungua]', title)

    local ulclass = formatAttributes('class', 'NavContent', args.hlist and 'hlist')
    local ulstyle = formatAttributes('style', not args.bullets and 'list-style: none none; margin-left: 0;', args.list_style, args.liststyle, not (args.list_style or args.liststyle) and 'text-align: left;', 'font-size: 105%; margin-top: 0; margin-bottom: 0; line-height: inherit;')

    -- Build the list.
    return mw.ustring.format(
        '<div%s%s>\n<div%s%s>%s</div>\n<div class="mw-collapsible-content"><ul%s%s>%s</ul></div>\n</div>',
        div1class, div1style, div2class, div2style, div2content, ulclass, ulstyle, listItems
    ) .. gettitlestyletracking(args.title_style or args.titlestyle)
end

function p.main(frame)
    local origArgs
    if frame == mw.getCurrentFrame() then
        origArgs = frame:getParent().args
        for k, v in pairs(frame.args) do
            origArgs = frame.args
            break
        end
    else
        origArgs = frame
    end

    local args = {}
    for k, v in pairs(origArgs) do
        if type(k) == 'number' or v ~= '' then
            args[k] = v
        end
    end
    return buildList(args)
end

return p