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.title = function(args) local getter, view = p.makeView(args) view.format = function(data) local value = getter(data) if value then return '[[' .. getter(data) .. ']]' end 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,view 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"|', 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