Module:Multiple releases/sandbox

local p = {}

local wikidata = require("Module:Wd")

local properties = { platform = "P400", publication_date = "P577", software_version_identifier = "P348", version_type = "P548", }

local version_types = { pre_release = "Q51930650", stable = "Q2804309", }

local platforms = { android = {id = "Q94", label = "Android"}, ios = {id = "Q48493", label = "iOS"}, linux = {id = "Q388", label = "Linux"}, macos = {id = "Q14116", label = "macOS"}, windows = {id = "Q1406", label = "Windows"}, web = {id = "Q6368", label = "Web"}, }

local labels = { final = "Final release", stable = "Stable release", beta = "Preview release", }

local date_template = "Start date and age"

--- Returns a date formatted with the template. --- --- @param date string --- @return string local function get_formatted_date(date) local formatted_date = mw.getCurrentFrame:expandTemplate{title = date_template, args = {date}} return formatted_date end

--- Returns a Wikidata qualifier request for the date. --- @param args [] --- @return string local function get_wikidata_date(args) local wikidata_args = mw.clone(args) table.insert(wikidata_args, 1, "single") table.insert(wikidata_args, properties.publication_date) local result = wikidata._qualifier(wikidata_args) return result end

--- Returns a Wikidata property request for the version number. --- --- @param args [] --- @return string local function get_wikidata_version(args) local wikidata_args = mw.clone(args) table.insert(wikidata_args, 1, "references") table.insert(wikidata_args, 2, "preferred") table.insert(wikidata_args, 3, "sourced") table.insert(wikidata_args, 4, "edit") local result = wikidata._property(wikidata_args) return result end

--- Returns an entity for Wikidata. --- --- @param software string --- @param platform string --- @param version_type string --- @param use_platform boolean --- @return table local function get_wikidata_args(software, platform, version_type, use_platform) local args = { software, properties.software_version_identifier, [properties.version_type] = version_type, }

if use_platform then args[properties.platform] = platform end

return args end

--- Creates an infobox row with the label and either a version number or a version number and date value. --- Returns the number of the next infobox row. --- --- @param infobox_args table --- @param software_id string --- @param platform_id string --- @param version_type string --- @param use_platform boolean --- @param row_number number --- @param label string --- @return number local function get_infobox_row(infobox_args, software_id, platform_id, version_type, use_platform, row_number, label) local wikidata_args = get_wikidata_args(software_id, platform_id, version_type, use_platform) local version = get_wikidata_version(wikidata_args) if version and version ~= "" then row_number = row_number + 1 infobox_args["label" .. row_number] = label local date = get_wikidata_date(wikidata_args) if date and date ~= "" then date = get_formatted_date(date) infobox_args["data" .. row_number] = version .. " / " .. date else infobox_args["data" .. row_number] = version end end

return row_number end

--- Creates an infobox row. --- A row consists of a label of the version type and a data value of either a version number or a version number and date value. --- Returns the total number of rows created. --- --- @param infobox_args table --- @param software_id string --- @param version_type string --- @param isDiscontinued string --- @return number local function get_single_row(infobox_args, software_id, version_type, isDiscontinued) local label = "" if version_type == version_types.stable then if isDiscontinued then label = labels.final else label = labels.stable end elseif version_type == version_types.pre_release then label = labels.beta end

return get_infobox_row(infobox_args, software_id, nil, version_type, false, 0, label) end

--- Creates one or more infobox rows. --- A row consists of a label of the platform name and a data value of either a version number or a version number and date value. --- Returns the total number of rows created. --- --- @param infobox_args table --- @param software_id string --- @param requested_platforms string --- @param version_type string --- @return number local function get_multiple_rows(infobox_args, software_id, requested_platforms, version_type) ---@type table local used_platforms = {} for platform in string.gmatch(requested_platforms, "[^,]+") do		used_platforms[platform] = true end

local ordered_pairs = require("Module:Ordered pairs").orderedPairs local row_number = 0 for platform, _ in ordered_pairs(used_platforms) do		local platform_id = platforms[platform].id		row_number = get_infobox_row(infobox_args, software_id, platform_id, version_type, true, row_number, platforms[platform].label) end

return row_number end

--- Returns a child Infobox with one or more infobox rows for a software release or an empty string. --- ---	The list of platforms is a comma separated list. Valid platforms are listed in the platforms table at the top. --- If args.platforms is empty then only the latest release is returned. --- Valid version types are listed at the version_types table at the top. --- --- Infobox parameters used: |discontinued= |platforms= |version_type= --- --- Testing parameters used: |software= --- --- @param args table --- @return string local function _main(args) if not args.version_type then return "" end

local version_type = version_types[args.version_type] if not version_type then return "" end

local software_id = args.software or "" local infobox_args = {child = "yes"}

local row_number if args.platforms then row_number = get_multiple_rows(infobox_args, software_id, args.platforms, version_type) else row_number = get_single_row(infobox_args, software_id, version_type, args.discontinued) end

if row_number == 0 then return "" end

local infobox = require("Module:Infobox").infobox return infobox(infobox_args) end

--- Returns a subbox Infobox with one or more infobox rows for a software release or an empty string. --- --- @param frame table --- @return string function p.main(frame) local getArgs = require("Module:Arguments").getArgs local args = getArgs(frame) return _main(args) end

return p