ФЭНДОМ


--[[
 
TODO:
    Модуль не способен работать с числовыми атрибутами шаблона, если они не идут в числовом порядке
 
CSS:
.tmpl-doc-wrap {
    /* main element wrapper */
}
 
.tmpl-doc {
    /* main element */
}
 
.tmpl-doc .hl {
    /* line */
}
 
.tmpl-doc .b {
    /* both pairs of brackets */
}
 
.tmpl-doc .b.l {
    /* left pair of brackets */
}
 
.tmpl-doc .b.r {
    /* right pair of brackets */
}
 
.tmpl-doc .key {
    /* template attribute */
}
 
.tmpl-doc .doc {
    /* description of attribute */
}
 
 
--]]
 
local p = {}
p.colors = {
    brackets_f = '#4e4e4e',
    brackets_b = '#ffffa9',
 
    param_f = '#056472',
    param_b = nil,
 
    vline_f = '#4e4e4e',
    vline_b = '#ffffa9',
 
    line_even_color = nil,
    line_odd_color = '#d1e0ff',
 
    border = '1px solid #444'
}
p.cfg = {
    noArg = "<acronym style='border: none;' title='Документация отсутствует'>&lt;nil&gt;</acronym>",
    noTmplName = "<acronym class='tmpl-name' 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 r')
    l:addClass('b l')
    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 getArgument(key) 
    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
    return tostring(key)
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.noTmplName
    local vline = getVLine()
    local lines = {}
    local maxLength = 0
 
 
    for k, argName in ipairs(frame.args) do
        if k ~= 1 then
            local argLen = mw.ustring.len(argName)
            if argLen > maxLength then maxLength = argLen end
            table.insert(lines, {vline .. getArgument(argName), argLen})
        end
    end
 
    local newLines = {}
    for k, l in ipairs(lines) do
        table.insert(newLines, l[1] .. string.rep("&nbsp;", maxLength-l[2]) .. " = ")
    end
 
    lb, rb = getBrackets()
    table.insert(newLines, 1, lb .. (tmplName == p.cfg.noTmplName and tmplName or ("<span class='tmpl-name'>" .. mw.text.nowiki(tmplName) .. '</span>')))
    table.insert(newLines, rb)
    for k, v in ipairs(newLines) do
        newLines[k] = getLine(newLines[k], k)
    end
 
    local w = mw.html.create('div'):wikitext(table.concat(newLines, ''))
    w:css({['font-family'] = 'monospace', ['flex-direction'] = 'column', display = 'inline-flex', width = '100%'}):addClass('tmpl-doc')
 
    local wrapper = mw.html.create('div'):css({['overflow-x'] = 'auto', position = 'relative'}):addClass('tmpl-doc-wrap'):wikitext(tostring(w))
    if p.colors.border ~= nil then wrapper:css('border', p.colors.border) end
    return tostring(wrapper)
end
 
return p