Deprecated: ScribuntoContent overrides fillParserOutput which was deprecated in MediaWiki 1.38. [Called from MediaWiki\Content\Renderer\ContentRenderer::getParserOutput in /var/www/html/includes/content/Renderer/ContentRenderer.php at line 47] in /var/www/html/includes/debug/MWDebug.php on line 381

Deprecated: Use of AbstractContent::getParserOutput was deprecated in MediaWiki 1.38. [Called from ContentHandler::callDeprecatedContentGPO in /var/www/html/includes/content/ContentHandler.php at line 1883] in /var/www/html/includes/debug/MWDebug.php on line 381
Module:Data/View: Difference between revisions - ΔV: Wiki

Module:Data/View: Difference between revisions

From ΔV: Wiki
(Module to define data views, display data tables)
 
m (Missed variable rename, nonbreaking spaces)
Line 52: Line 52:
     local unit = select(1, ...)
     local unit = select(1, ...)
     if unit then
     if unit then
         return string.format('%s %s', mw.getContentLanguage():formatNum(n), unit)
         return string.format('%s %s', mw.getContentLanguage():formatNum(n), unit)
     else
     else
         return mw.getContentLanguage():formatNum(n)
         return mw.getContentLanguage():formatNum(n)
Line 107: Line 107:
     for i,row in ipairs(data) do
     for i,row in ipairs(data) do
         table.insert(result ,'|-')
         table.insert(result ,'|-')
         for j,view in ipairs(views) do
         for j,v in ipairs(views) do
             local cell = {'|'}
             local cell = {'|'}
             if v.sortValue then
             if v.sortValue then
                 local sortValue = v.sortValue(row)
                 local sortValue = v.sortValue(row)
                 if sortValue ~= nil then
                 if sortValue ~= nil then
                     table.insert(cell, string.format('data-sort-value="%s"|', displayValue(sortValue)))
                     table.insert(cell, string.format('data-sort-value="%s"|', p.displayValue(sortValue)))
                 end
                 end
             end
             end

Revision as of 02:00, 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.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,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