Jump to content

Module:OSF version

From HopperWiki

Documentation for this module may be created at Module:OSF version/doc

-- Module:OSF_version
local json = require("Module:JSON_pipeline")
local p    = {}

local PAGE = "JSON:OSF_provenance"

local function fmt_number(n)
    if not n then return "—" end
    return tostring(n):reverse():gsub("(%d%d%d)", "%1,"):reverse():gsub("^,", "")
end

local function cell(label, value)
    return string.format(
        '<div class="osf-cell"><div class="osf-label">%s</div><div class="osf-value">%s</div></div>',
        label, value
    )
end

function p.infobox(frame)
    local data, err = json.load(PAGE)
    if not data then
        return '<span class="error">OSF version data unavailable: ' .. tostring(err) .. '</span>'
    end

    local counts     = type(data.record_counts) == "table" and data.record_counts or {}
    local source     = data.source       or "Orthoptera Species File"
    local source_url = data.source_url   or ""
    local updated    = data.last_updated or "unknown"
    local n_species  = fmt_number(counts.species)
    local n_subsp    = fmt_number(counts.subspecies)
    local n_total    = fmt_number(counts.total_taxa)

	local source_link = source_url ~= ""
	    and string.format('[%s %s]', source_url, source)
	    or source

    local header = string.format(
        '<div class="osf-header">' ..
            '<span class="ib-h-badge ib-h-badge-organization">OSF</span>' ..
            '<span class="osf-title">HopperWiki\'s current taxonomy</span>' ..
            '<span class="osf-source">%s</span>' ..
        '</div>',
        source_link
    )

    local cells = table.concat({
        cell("Last updated", updated),
        cell("Species",      n_species),
        cell("Subspecies",   n_subsp),
        cell("Total taxa",   n_total),
    })

    local html = string.format(
        '<div class="ib-h osf-version-box">' ..
            '%s' ..
            '<div class="ib-h-cells">%s</div>' ..
        '</div>',
        header, cells
    )

    return frame:preprocess(html)
end

function p.data()
    return json.load(PAGE)
end

function p.field(frame)
    local args = frame.args or frame
    local key  = args[1] or args.key
    if not key then return "" end
    local data, err = json.load(PAGE)
    if not data then return "" end
    return tostring(data[key] or "")
end

return p
Cookies help us deliver our services. By using our services, you agree to our use of cookies.