Изменения
Перейти к навигации
Перейти к поиску
Строка 1:
Строка 1:
− -- This module outputs different kinds of lists. At the moment, bulleted,
− -- unbulleted, horizontal, ordered, and horizontal ordered lists are supported.
−
− local libUtil = require('libraryUtil')
− local checkType = libUtil.checkType
− local mTableTools = require('Module:TableTools')
−
− +
− ['bulleted'] = true,+
− ['unbulleted'] = true,+
− ['horizontal'] = true,+
− ['ordered'] = true,+
− ['horizontal_ordered'] = true+
− }
−
−
−
−
−
−
− data.classes = {}
− if listType == 'horizontal' or listType == 'horizontal_ordered' then
− table.insert(data.classes, 'hlist')
− elseif listType == 'unbulleted' then
− table.insert(data.classes, 'plainlist')
− table.insert(data.classes, args.class) +
+
− -- Main div style+
− data.style = args.style +
− +
− -- Indent for horizontal lists +
− if listType == 'horizontal' or listType == 'horizontal_ordered' then+
− local indent = tonumber(args.indent)
− indent = indent and indent * 1.6 or 0
− if indent > 0 then
− data.marginLeft = indent .. 'em'
− +
− +
− -- This could be "1, 2, 3", "a, b, c", or a number of others. The list style
− -- type is either set by the "type" attribute or the "list-style-type" CSS
− -- property.
− if listType == 'ordered' or listType == 'horizontal_ordered' then
− data.listStyleType = args.list_style_type or args['list-style-type']
− data.type = args['type']
− -- Detect invalid type attributes and attempt to convert them to+
− -- list-style-type CSS properties.+
− if data.type +
− and not data.listStyleType+
− and not tostring(data.type):find('^%s*[1AaIi]%s*$')
− then
− data.listStyleType = data.type
− data.type = nil
− end
− +
− -- List tag type+
−
− data.listTag = 'ol'
− else
− data.listTag = 'ul'
− end
−
− -- Start number for ordered lists
− data.start = args.start
− if listType == 'horizontal_ordered' then
− -- Apply fix to get start numbers working with horizontal ordered lists.
− local startNum = tonumber(data.start)
− if startNum then
− data.counterReset = 'listitem ' .. tostring(startNum - 1)
− end
+
+
− -- List style+
− -- ul_style and ol_style are included for backwards compatibility. No
− -- distinction is made for ordered or unordered lists.
− data.listStyle = args.list_style
− -- List items+
− -- li_style is included for backwards compatibility. item_style was included+
− -- to be easier to understand for non-coders.
− data.itemStyle = args.item_style or args.li_style
− data.items = {}
− for i, num in ipairs(mTableTools.numKeys(args)) do
− local item = {}
− item.content = args[num]
− item.style = args['item' .. tostring(num) .. '_style']
− or args['item_style' .. tostring(num)]
− item.value = args['item' .. tostring(num) .. '_value']
− or args['item_value' .. tostring(num)]
− table.insert(data.items, item)
− end
−
− return data
− end
− function p.renderList(data)+
− +
− +
− -- Return the blank string if there are no list items.+
− if type(data.items) ~= 'table' or #data.items < 1 then+
− return ''
− end
−
−
−
− for i, class in ipairs(data.classes or {}) do
− root:addClass(class)
− end
− root:css{['margin-left'] = data.marginLeft}
− if data.style then
− root:cssText(data.style)
− end
− +
− local list = root:tag(data.listTag or 'ul')+
− list +
− :attr{start = data.start, type = data.type}+
− :css{+
− ['counter-reset'] = data.counterReset,+
− ['list-style-type'] = data.listStyleType+
− }
− if data.listStyle then
− list:cssText(data.listStyle)
− end
−
− -- Render the list items
− for i, t in ipairs(data.items or {}) do
−
−
− item:cssText(data.itemStyle)
− if t.style then +
− item:cssText(t.style)
− end
− item
− :attr{value = t.value}
− :wikitext(t.content)
+
− return tostring(root) +
− end+
+
+
− function p.renderTrackingCategories(args)+
− +
− +
− k = tostring(k)
− if k:find('^item_style%d+$') or k:find('^item_value%d+$') then
− isDeprecated = true
− break
− end
− +
− +
+
+
+
+
+
− +
− +
− if not listType or not listTypes[listType] then +
− error(string.format(+
− "bad argument #1 to 'makeList' ('%s' is not a valid list type)",+
− tostring(listType)+
− ), 2)+
− end
− checkType('makeList', 2, args, 'table')
− local data = p.makeListData(listType, args)
− local list = p.renderList(data)
− local trackingCategories = p.renderTrackingCategories(args)
− return list .. trackingCategories
− end
− for listType in pairs(listTypes) do+
− p[listType] = function (frame)+
− local mArguments = require('Module:Arguments')+
− local origArgs = mArguments.getArgs(frame)+
− -- Copy all the arguments to a new table, for faster indexing.+
− local args = {}+
− for k, v in pairs(origArgs) do
− args[k] = v
− end
− return p.makeList(listType, args)
− end
−
export multiline
local p = {}
local p = {}
local listTypes = {
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 p.makeListData(listType, args)
-- Constructs a data table to be passed to p.renderList.
local data = {}
-- Classes
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
-- List style types for ordered lists
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 listType == 'ordered' or listType == 'horizontal_ordered' then
end
end
return ret
end -- local function multiline (list, mark, header)
p.multiline = multiline
function p.l (frame)
local args = get_args (frame)
-- Извлекаем параметры — не пункты списка:
-- Renders the list HTML.
local header = args ['заголовок']
local separator = args ['разделитель']
-- Для явно заданного разделителя, вроде «•», «и» не нужно:
local last = separator or args ['последний']
-- Render the main div tag.
local root = mw.html.create('div')
-- Render the list tag.
-- Случай многострочного списка:
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
local item = list:tag('li')
if data.itemStyle then
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 isDeprecated = false -- Tracks deprecated parameters.
for i = 1, #args, 2 do
for k, v in pairs(args) do
lines [#lines + 1] = {bullet = args [i] or bullet, str = args [i + 1] or ''}
end
end
local ret = ''
local ret = ''
if isDeprecated then
if #lines > 0 then
ret = ret .. '[[Category:List templates with deprecated parameters]]'
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.makeList(listType, args)
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