Модуль:Tables

Материал из Викиверситета

AutoNumBox — шаблон для автоматической нумерации строк существующей таблицы[править]

Документацию см. на странице {{НумерацияТаблицы}}

AutoNum — шаблон для автоматической нумерации строк таблицы[править]

Документацию см. на странице {{Автонумерация}}


 local p = {}
 
-- **********************************************************
-- Вызов через шаблон {{НумерацияТаблицы}}
-- Заменяет число в первой яейке на номер строки
function p.AutoNumBox2(frame)
 
    local g = frame:getParent().args[1]
    local NumStr = tonumber (frame:getParent().args['Старт'] or "1");    
    if g == nil then return "Нет данных" end
    g = g:gsub(".*{|(.*)|}.*", "%1")
    local Titul = g:sub(1, (g:find ("\n!") or 1) - 1)
    g = g:sub((g:find ("\n!") or 1))
    g = g:gsub("||", "\n|")
    local Pos0 = 0
    while g:find("|%-[^|]*(|[^\n]*\n)", Pos0 + 1) ~= nil do
        Pos1, Pos2 = g:find("|%-[^|]*(|[^\n]*\n)", Pos0 + 1)
        while g:find("|", Pos1 + 1) ~= nil and g:find("|", Pos1 + 1) < Pos2 do 
            Pos1 = g:find("|", Pos1 + 1) 
        end    
        if g:find("%d", Pos1) ~= nil and g:find("%d", Pos1) < Pos2 then
            Pos3, Pos4 = g:find("%d+", Pos1)    
            g = g:sub(1, Pos3 - 1)..NumStr..g:sub(Pos4 + 1)
            NumStr = NumStr + 1
        end
        Pos0 = Pos2
    end
    return "{|"..Titul..g.."|}" 
end
 
-- **********************************************************
-- Вызов напрямую
-- Заменяет символ # в первой ячейке на номер строки
function p.AutoNumBox ( frame )
    local NumStr = tonumber (frame.args['Старт'] or "1");
    local g = frame.args[1]
    g = g:gsub("^%s- -{{", "", 1)
    g = g:gsub("}}%s- -$", "", 1)
    pattern = "|%s*#%s*%s*|"
    while string.find (g, pattern) ~= nil do
        g = g:gsub(pattern, "|"..NumStr.."\n".."|", 1)
        NumStr = NumStr + 1
    end 
    return g
end
 
-- **********************************************************
function p.AutoNum ( frame )
    local args = frame.args;
    local Style = (frame.args['Оформление'] or "standard");
    local Column = tonumber (frame.args['Столбцов'] or "0");
    local NumStr = tonumber (frame.args['Старт'] or "1");
    local Title0 = (frame.args['Заголовок0'] or "№")
    local Titles = {}
    for i = 1, Column do
        Titles[i] =(frame.args["Заголовок"..i] or "Заголовок"..i)
    end
    local Width0 = (frame.args['Ширина0']);
    local Widths = {}
    for i = 1, Column do
        Widths[i] =(frame.args["Ширина"..i])
    end
    local Align0 = (frame.args['Выравнивание0'] or "center")
    local Aligns = {}
    for i = 1, Column do
        Aligns[i] =(frame.args["Выравнивание"..i] or "left")
    end
 
    local g="<table class = '"..Style.."'>"
 
-- Строка заголовков    
    g = g.."<tr>"
 
---- Заголовок столба с номерами строк
    g = g.."<th"; if Width0 ~= nil then g = g.." width='"..Width0 end; g = g.."'>"
    g = g..Title0.."</th>"
 
---- Остальные заголовки
    for i = 1, Column do
        g = g.."<th"; if Widths[i] ~= nil then g = g.." width='"..Widths[i] end; g = g.."'>"
        g = g..Titles[i].."</th>"
    end
    g = g.."</tr>"
 
-- Строки данных       
    J = 1
    while args[(J-1)*Column+1] ~= nil do 
        g = g.."<tr><td align='"..Align0.."'>"..NumStr.."</td>"
        for i = 1, Column do
             if args[(J-1)*Column+i] == nil then
                g = g.."<td></td>"
            else
                g = g.."<td align='"..Aligns[i].."'>"..args[(J-1)*Column+i].."</td>"
             end  
        end
        g = g.."</tr>"
        NumStr = NumStr + 1
        J = J + 1
    end 
 
    g = g.."</table>"
    return g
end
 
-- **********************************************************
function p.AutoNumSort(frame)
 
    local args = frame:getParent().args
    local Column = tonumber(args['Столбцов'] or "0")
        if Column == 0 then return "Невозможно определить количество столбцов" end 
    local TempSort = (args['Сортировка'] or "0")
    local SortColumn = tonumber(string.match(TempSort, "%d*"))
        if SortColumn > Column then SortColumn = 0 end
    local SortAsNumber = string.match(TempSort, "#") ~= nil
    local SortDescend 
        if SortAsNumber 
        then SortDescend = string.find(TempSort, "<") == nil
        else SortDescend = string.find(TempSort, ">") ~= nil end
 
    local Strings={}
    local TempString = {}
 
    local NumCell = 0
    while args[NumCell + 1] ~= nil or NumCell%Column ~= 0 do 
        NumCell = NumCell + 1
    	table.insert(TempString, (args[NumCell] or ""))
        if NumCell%Column == 0 then
            if SortAsNumber then 
                TempString.Key=mw.ustring.gsub(TempString[SortColumn], ",", ".")
                TempString.Key=mw.ustring.gsub(TempString.Key, "<span.*color.*</span>","")
                TempString.Key=mw.ustring.gsub(TempString.Key, "(%d)%s(%d)","%1%2")
                TempString.Key = tonumber(string.match(TempString.Key, "(%d+)") or 0)
            elseif SortColumn > 1 then 
                TempString.Key = (TempString[SortColumn] or "") 
                -- Возможность сортировки по скрытому ключу
                TempString.Key = mw.ustring.gsub(TempString.Key, '<span style="display: none; speak: none;">', "")
                -- Костыль из-за неправильной кодировки символа ё
                TempString.Key = mw.ustring.gsub(TempString.Key, "ё", "её")
                TempString.Key = mw.ustring.gsub(TempString.Key, "Ё", "ЖЁ")
                -- trim
                TempString.Key = mw.ustring.gsub(TempString.Key, "^%s*(.-)%s*$", "%1")
            else TempString.Key = tonumber(NumCell) end
            TempString.Group = TempString[1]:gsub("[^a-zA-Zа-яА-Я0-9]", "") 
            table.insert(Strings, TempString)
            TempString = {}
        end  
    end 
 
    local function SortString(a, b)  
        if a.Group ~= b.Group then return a.Group < b.Group end
        if SortDescend then a, b = b, a end
        if SortAsNumber or (SortColumn < 2) then
            return a.Key < b.Key 
        else
            local LenA = mw.ustring.len(a.Key)
            local LenB = mw.ustring.len(b.Key)
            for i = 1, (LenA < LenB) and LenA or LenB do
                if mw.ustring.codepoint(a.Key, i, i) ~= mw.ustring.codepoint(b.Key, i, i) then
                    return mw.ustring.codepoint(a.Key, i, i) < mw.ustring.codepoint(b.Key, i, i) 
                end
            end
            return LenA < LenB
        end            
    end  
 
-- Сортировка строк по группам и ключу
    table.sort(Strings, SortString)
 
-- Формироание HTML-таблицы
 
    local HtmlBuilder = require('Module:HtmlBuilder')    
    local HTML = HtmlBuilder.create('table')
 
    HTML.attr('class', (args['Оформление'] or "standard"))
 
-- Название таблицы
    if args['Название'] then
        HTML.tag('caption').wikitext(args['Название'])
    end
 
    local TempRow
-- Строка заголовков    
    TempRow = HTML.tag('tr')
    TempRow.tag('th')
        .css('width', (args['Ширина1'] or ""))
        .wikitext(args['Заголовок1'] or "№")
    for i = 2, Column do
        TempRow.tag('th')
            .css('width', (args["Ширина"..i] or ""))
            .wikitext(args["Заголовок"..i] or "Заголовок"..i)
    end
 
    local Aligns = {(args['Выравнивание1'] or "center")}
    for i = 2, Column do Aligns[i] = (args["Выравнивание"..i] or "left") end
-- Строки данных       
    local HideNum = 0
	local NumStr = tonumber (args['Старт'] or "1") - 1
    local Backlight = (args['Подсветка'] or "class='bright'"):gsub("\"", "'")
	for Index, TempString in pairs(Strings) do
        TempRow = HTML.tag('tr')
 
--      Стиль оформления строк
        if string.find(TempString[1], "%$") ~= nil then TempRow.attr('class', 'shadow')
        elseif string.find(TempString[1], "%%") ~= nil then TempRow.attr('class', 'bright')
        elseif string.find(TempString[1], "@") ~= nil then TempRow.attr('class', 'dark')
        elseif string.find(TempString[1], "%+") ~= nil then 
            for Part in string.gmatch(Backlight, "[%w]*=%s*'[^']*'") do
                TempRow.attr(string.match(Part, "([^=]*)="), string.match(Part, "'([^']*)'")) 
            end
        end
        if string.find(TempString[1], "!") ~= nil then TempRow.attr('style', 'font-weight:bold') end
 
--      Вывод номера строки
        if string.find(TempString[1], "-") ~= nil then 
            HideNum = HideNum + 0.000001
            TempRow.tag('td')
                .tag('span')
                .attr('style', 'display: none; speak: none;')
                .wikitext( tonumber(NumStr + HideNum))
        else
            NumStr = NumStr + 1
            TempRow.tag('td')
                .attr('align', Aligns[1])
                .wikitext(tonumber(NumStr))
        end
--      Вывод ячеек строки
		for i = 2, Column do
            TempRow.tag('td')
                .attr('align', Aligns[i])
                .wikitext(TempString[i])
		end
    end 
 
    return tostring(HTML)
end
 
return p