Модуль:Tables

Материал из Ligapedia
Перейти к навигации Перейти к поиску

Найду переключалку еода, буит норм выглядеть. --Ленивое КотЭ (обсуждение) 14:34, 10 июня 2013 (MSK)

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="

" -- Строка заголовков g = g..""
Заголовок столба с номерами строк
   g = g.."<th"; if Width0 ~= nil then g = g.." width='"..Width0 end; g = g.."'>"
g = g..Title0..""
Остальные заголовки
   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].."" end g = g.."" -- Строки данных J = 1 while args[(J-1)*Column+1] ~= nil do g = g..""
       for i = 1, Column do
            if args[(J-1)*Column+i] == nil then
g = g..""
           else
g = g..""
            end  
       end
g = g.."" NumStr = NumStr + 1 J = J + 1 end g = g.."
"..NumStr..""..args[(J-1)*Column+i].."

"

   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.*","")
               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, '', "")
               -- Костыль из-за неправильной кодировки символа ё
               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 = string.len(a.Key)
           local LenB = string.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