m (Missed variable rename, nonbreaking spaces) |
(Support for titles to have separate pipe text) |
||
| Line 29: | Line 29: | ||
format = function(data) return nil end | format = function(data) return nil end | ||
} | } | ||
end | |||
p.displayTitle = function(title, text) | |||
if title and text then | |||
return string.format('[[%s|%s]]', title, p.displayValue(text)) | |||
elseif title then | |||
return string.format('[[%s]]', title) | |||
end | |||
return text | |||
end | end | ||
p.title = function(args) | p.title = function(args) | ||
local getter, view = p.makeView(args) | local getter, view = p.makeView(args) | ||
local textGetter = nil | |||
if args.text then | |||
textGetter = makeGetter(args.text) | |||
end | |||
view.format = function(data) | view.format = function(data) | ||
local | local title = getter(data) | ||
if | local text = nil | ||
if textGetter then | |||
text = textGetter(data) | |||
end | end | ||
return p.displayTitle(title, text) | |||
end | end | ||
return view | return view | ||
Revision as of 03:10, 8 March 2023
Documentation for this module may be created at Module:Data/View/doc
local p = {}
local d = require('Module:Data')
local makeGetter = function(path)
if type(path) == 'function' then
return path
elseif type(path) == 'string' then
return d.path{path}
elseif type(path) == 'table' then
return d.path(path)
end
end
p.makeView = function(args)
local path = table.remove(args, 1)
local getter = makeGetter(path)
local view = {}
for k,v in pairs(args) do
view[k] = v
end
return getter, view
end
p.viewNotFound = function(name)
return {
heading = string.format("View %s is not defined", name),
format = function(data) return nil end
}
end
p.displayTitle = function(title, text)
if title and text then
return string.format('[[%s|%s]]', title, p.displayValue(text))
elseif title then
return string.format('[[%s]]', title)
end
return text
end
p.title = function(args)
local getter, view = p.makeView(args)
local textGetter = nil
if args.text then
textGetter = makeGetter(args.text)
end
view.format = function(data)
local title = getter(data)
local text = nil
if textGetter then
text = textGetter(data)
end
return p.displayTitle(title, text)
end
return view
end
p.text = function(args)
local getter, view = p.makeView(args)
view.format = getter
return view
end
p.formatNum = function(n, ...)
local unit = select(1, ...)
if unit then
return string.format('%s %s', mw.getContentLanguage():formatNum(n), unit)
else
return mw.getContentLanguage():formatNum(n)
end
end
p.number = function(args)
local getter,view = p.makeView(args)
view.format = function(data)
local value = getter(data)
if args.omitZero and value == 0 then
return ''
end
if type(value) == 'number' then
return p.formatNum(value, args.unit)
end
return value
end
view.sortType = 'number'
view.sortValue = function(data)
local value = getter(data)
if type(value) == number then
return tostring(value)
end
end
return view
end
p.displayValue = function(value)
if value == nil then
return ''
end
return tostring(value)
end
p.displayTable = function(data, view, columns)
local views = {}
for i,col in ipairs(columns) do
v = view[col] or p.viewNotFound(col)
table.insert(views, v)
end
local result = {'{| class="wikitable sortable"', '|-'}
for j,v in ipairs(views) do
local cell = {'!'}
if v.sortType then
table.insert(cell, string.format('data-sort-type="%s"|', tostring(v.sortType)))
end
table.insert(cell, p.displayValue(v.heading))
table.insert(result, table.concat(cell))
end
for i,row in ipairs(data) do
table.insert(result ,'|-')
for j,v in ipairs(views) do
local cell = {'|'}
if v.sortValue then
local sortValue = v.sortValue(row)
if sortValue ~= nil then
table.insert(cell, string.format('data-sort-value="%s"|', p.displayValue(sortValue)))
end
end
table.insert(cell, p.displayValue(v.format(row)))
table.insert(result, table.concat(cell))
end
end
table.insert(result,'|}')
return table.concat(result, '\n')
end
return p