Модуль:List — различия между версиями
Материал из HARITONOV
(Minerva skin needs whether an hlist is separated to be explicit (see https://en.wikipedia.org/wiki/Wikipedia:Village_pump_(technical)#Hlist_bullets_not_shown_in_mobile)) |
м (tst) |
||
Строка 1: | Строка 1: | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
local p = {} | local p = {} | ||
− | local | + | local function get_args (frame) |
− | + | -- На случай вызова из шаблона и из модуля: | |
− | + | local args = frame:getParent () and mw.clone (frame:getParent ().args) or {} | |
− | + | -- Overrides: | |
− | + | for key, val in pairs (frame.args) do | |
− | + | args [key] = val | |
− | + | ||
− | + | ||
− | function | + | |
− | -- | + | |
− | local | + | |
− | + | ||
− | -- | + | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | + | return args | |
+ | end -- local function get_args (frame) | ||
− | + | local function remove_empty (list) | |
− | + | local ret = {} | |
− | + | for i, item in ipairs (list) do | |
− | + | if item ~= '' then | |
− | + | ret [#ret + 1] = item | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
end | end | ||
− | + | return ret | |
− | -- | + | end -- local function remove_empty (list) |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | local function multiline (list, mark, header) | |
− | + | local ret = '' | |
− | + | for _, item in ipairs (list) do | |
− | + | ret = ret .. '\n' .. mark .. ' ' .. tostring (item) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | + | if ret ~= '' and header then | |
− | + | ret = header .. ret | |
− | if | + | |
− | + | ||
− | + | ||
− | + | ||
end | end | ||
+ | return ret | ||
+ | end -- local function multiline (list, mark, header) | ||
− | + | function p.l (frame) | |
− | + | local args = get_args (frame) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | -- | + | -- Извлекаем параметры — не пункты списка: |
− | + | local header = args ['заголовок'] | |
− | + | local separator = args ['разделитель'] | |
− | + | -- Для явно заданного разделителя, вроде «•», «и» не нужно: | |
+ | local last = separator or args ['последний'] | ||
− | -- | + | -- Случай многострочного списка: |
− | + | if separator == '*' or separator == '#' then | |
− | + | return multiline (remove_empty (args), separator, header) | |
− | + | else | |
− | + | local ret = mw.text.listToText (remove_empty (args), separator, last) | |
− | + | if ret ~= '' and header then | |
− | + | ret = header .. ' ' .. ret | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
− | + | return ret | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
+ | end -- function p.l (frame) | ||
− | + | function p.bl (frame) | |
− | + | local args = get_args (frame) | |
+ | -- Общий маркёр: | ||
+ | local bullet = args ['маркёр'] or args ['bullet'] or '{{*}}' | ||
− | + | local lines = {} | |
− | local | + | for i = 1, #args, 2 do |
− | for | + | lines [#lines + 1] = {bullet = args [i] or bullet, str = args [i + 1] or ''} |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
end | end | ||
local ret = '' | local ret = '' | ||
− | if | + | if #lines > 0 then |
− | ret = ret .. ' | + | ret = ret .. '<table style="background: transparent; vertical-align: top;">' |
+ | for _, line in ipairs (lines) do | ||
+ | ret = ret .. '\n<tr><td style="vertical-align:top; padding-top: 0.3ex">' .. line.bullet | ||
+ | .. '</td><td style="vertical-align:top">' .. line.str .. '</td></tr>' | ||
+ | end | ||
+ | ret = ret .. '\n</table>' | ||
end | end | ||
return ret | return ret | ||
− | end | + | end -- function p.bl (frame) |
− | function p. | + | function p.ul (frame) |
− | + | local args = get_args (frame) | |
− | + | -- Извлекаем параметры — не пункты списка: | |
− | + | local header = args ['заголовок'] | |
− | + | return multiline (remove_empty (args), '*', header) | |
− | + | end -- function p.ul (frame) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | function p.ol (frame) | |
− | + | local args = get_args (frame) | |
− | + | -- Извлекаем параметры — не пункты списка: | |
− | + | local header = args ['заголовок'] | |
− | + | return multiline (remove_empty (args), '#', header) | |
− | + | end -- function p.ol (frame) | |
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | + | ||
− | end | + | |
return p | return p |
Текущая версия на 03:18, 29 мая 2019
Для документации этого модуля может быть создана страница Модуль:List/doc
local p = {} local function get_args (frame) -- На случай вызова из шаблона и из модуля: local args = frame:getParent () and mw.clone (frame:getParent ().args) or {} -- Overrides: for key, val in pairs (frame.args) do args [key] = val end return args end -- local function get_args (frame) local function remove_empty (list) local ret = {} for i, item in ipairs (list) do if item ~= '' then ret [#ret + 1] = item end end return ret end -- local function remove_empty (list) local function multiline (list, mark, header) local ret = '' for _, item in ipairs (list) do ret = ret .. '\n' .. mark .. ' ' .. tostring (item) end if ret ~= '' and header then ret = header .. ret end return ret end -- local function multiline (list, mark, header) function p.l (frame) local args = get_args (frame) -- Извлекаем параметры — не пункты списка: local header = args ['заголовок'] local separator = args ['разделитель'] -- Для явно заданного разделителя, вроде «•», «и» не нужно: local last = separator or args ['последний'] -- Случай многострочного списка: if separator == '*' or separator == '#' then return multiline (remove_empty (args), separator, header) else local ret = mw.text.listToText (remove_empty (args), separator, last) if ret ~= '' and header then ret = header .. ' ' .. ret end return ret end end -- function p.l (frame) function p.bl (frame) local args = get_args (frame) -- Общий маркёр: local bullet = args ['маркёр'] or args ['bullet'] or '{{*}}' local lines = {} for i = 1, #args, 2 do lines [#lines + 1] = {bullet = args [i] or bullet, str = args [i + 1] or ''} end local ret = '' if #lines > 0 then ret = ret .. '<table style="background: transparent; vertical-align: top;">' for _, line in ipairs (lines) do ret = ret .. '\n<tr><td style="vertical-align:top; padding-top: 0.3ex">' .. line.bullet .. '</td><td style="vertical-align:top">' .. line.str .. '</td></tr>' end ret = ret .. '\n</table>' end return ret end -- function p.bl (frame) function p.ul (frame) local args = get_args (frame) -- Извлекаем параметры — не пункты списка: local header = args ['заголовок'] return multiline (remove_empty (args), '*', header) end -- function p.ul (frame) function p.ol (frame) local args = get_args (frame) -- Извлекаем параметры — не пункты списка: local header = args ['заголовок'] return multiline (remove_empty (args), '#', header) end -- function p.ol (frame) return p