Стар против Сил Зла Вики
Advertisement
Стар против Сил Зла Вики

Для документации этого модуля может быть создана страница Модуль:TmplDoc/doc

local p = {}
p.colors = {
    brackets_f = '#4e4e4e',
    brackets_b = '#ffffa9',
    
    param_f = '#056472',
    param_b = nil,
    
    vline_f = '#4e4e4e',
    vline_b = '#ffffa9',
    
    doc_f = '#d86411',
    doc_b = nil,
    
    line_even_color = nil,
    line_odd_color = '#d1e0ff',
    
    border = '1px solid #444'
}
p.cfg = {
    noArg = "<acronym style='border: none;' title='Документация отсутствует'>&lt;nil&gt;</acronym>"
}

local function trim(t) return string.gsub(t, "^%s*(.-)%s*$", "%1"):sub(1, -1) end

local function getLine(text, i)
    line = mw.html.create('div'):css({padding = '0 10px', ['white-space'] = 'nowrap'})
    if i % 2 == 0 and p.colors.line_even_color ~= nil then 
        line:css('background', p.colors.line_even_color)
    elseif i % 2 == 1 and p.colors.line_odd_color ~= nil then 
        line:css('background', p.colors.line_odd_color) 
    end
    line:addClass('hl'):wikitext(text)
    return tostring(line)
end

local function getBrackets()
    l = mw.html.create('span'):wikitext(mw.text.nowiki('{{'))
    r = mw.html.create('span'):wikitext(mw.text.nowiki('}}'))
    if p.colors.brackets_b ~= nil then 
        l:css('background', p.colors.brackets_b) 
        r:css('background', p.colors.brackets_b) 
    end
    if p.colors.brackets_f ~= nil then 
        l:css('color', p.colors.brackets_f)
        r:css('color', p.colors.brackets_f) 
    end
    r:addClass('b')
    l:addClass('b')
    return tostring(l), tostring(r)
end

local function getVLine()
    l = mw.html.create('span'):addClass('vl'):wikitext('|')
    if p.colors.vline_f ~= nil then l:css('color', p.colors.vline_f) end
    if p.colors.vline_b ~= nil then l:css('background', p.colors.vline_b) end
    return tostring(l)
end

local function getDoc(text)
    if text == nil or trim(text) == '' then
        text = p.cfg.noArg
    end
    doc = mw.html.create('span'):addClass('doc'):wikitext(text)
    if p.colors.doc_b ~= nil then doc:css('background', p.colors.doc_b) end
    if p.colors.doc_f ~= nil then doc:css('color', p.colors.doc_f) end
    return tostring(doc)
end

local function getKeyArgHtml(key, doc) 
    key = mw.html.create('span'):addClass('key'):wikitext(mw.text.nowiki(key))
    if p.colors.param_b ~= nil then key:css('background', p.colors.param_b) end
    if p.colors.param_f ~= nil then key:css('color', p.colors.param_f) end
    doc = getDoc(doc)
    return tostring(key), doc
end


function p.pair(frame)
    local name = frame.args['name']
    local doc = frame.args['doc']
    
    name, doc = getKeyArgHtml(name, doc)
    return name .. " = " .. doc
end

function p.main(frame)
    local tmplName = frame.args[1] or p.cfg.noArg
    local args, kwargs = {}, {}
    for k, v in pairs(frame.args) do
        if type(k) == "number" then
            table.insert(args, v)
        else
            kwargs[k] = v
        end
    end
    table.remove(args, 1)
    local html = ""
    local vline = getVLine()
    
    for k, doc in ipairs(args) do
        doc = doc or p.cfg.noDoc
        table.insert(lines, vline .. getDoc(doc))
    end
    
    local kwLen = 0
    local kwNew = {}
    local lines = {}
    
    for k, doc in pairs(kwargs) do
        doc = doc or p.cfg.noDoc
        length = #k
        if kwLen < length then kwLen = length end
        
        k, doc = getKeyArgHtml(k, doc)
        table.insert(kwNew, {k, length, doc})
    end
    
    for k, v in ipairs(kwNew) do
        table.insert(lines, vline .. v[1] .. string.rep("&nbsp;", kwLen-v[2]) .. " = " .. v[3])
    end
    
    lb, rb = getBrackets()
    table.insert(lines, 1, lb .. mw.text.nowiki(tmplName))
    table.insert(lines, rb)
    for k, v in ipairs(lines) do
        lines[k] = getLine(lines[k], k)
    end
    
    w = mw.html.create('div'):wikitext(table.concat(lines, ''))
    w:css({['font-family'] = 'monospace', ['overflow-y'] = 'auto'}):addClass('tmpl-doc')
    if p.colors.border ~= nil then w:css('border', p.colors.border) end
    return tostring(w)
end

return p
Advertisement