Module:Sorted plain list
MyWikiBiz, Author Your Legacy — Friday October 31, 2025
Jump to navigationJump to searchOverview
This module may be used to generate a sorted "plain list", which is a sorted unordered HTML list without visible bullets.
- There are six possible sort modes
- ascis ascending as defined by the default LUA string comparison operator.
- descis descending as defined by the default LUA string comparison operator.
- ascwith Template:Para is ascending using numeric comparison instead of string comparison.
- descwith Template:Para is descending using numeric comparison instead of string comparison.
- ascdis ascending dictionary order, so spaces are sorted before other characters.
- descdis descending dictionary order, so spaces are sorted before other characters.
 
- By default, the list is assumed to be delimited by commas, this can be changed to semicolons or any other choice.
- The list may be implicitly loaded from a wikidata property using the Template:Para parameter, which will override any explicitly specified values.
Usage
To convert a comma separated list to a sorted plainlist, use
- {{#invoke:sorted plain list|asc|<comma separated entries>}}
- {{#invoke:sorted plain list|desc|<comma separated entries>}}
- {{#invoke:sorted plain list|ascd|<comma separated entries>}}
- {{#invoke:sorted plain list|descd|<comma separated entries>}}
To convert a semicolon separated list to a sorted plainlist, use
- {{#invoke:sorted plain list|asc|<semicolon separated entries>|;}}
- {{#invoke:sorted plain list|desc|<semicolon separated entries>|;}}
- {{#invoke:sorted plain list|ascd|<semicolon separated entries>|;}}
- {{#invoke:sorted plain list|descd|<semicolon separated entries>|;}}
To convert a semicolon separated list of numbers to a sorted plainlist, use
- {{#invoke:sorted plain list|asc|<semicolon separated entries>|;|type=number}}
- {{#invoke:sorted plain list|desc|<semicolon separated entries>|;|type=number}}
To convert a wikidata property list to a sorted plainlist, use
- {{#invoke:sorted plain list|asc|propertyID=<PNUMBER>}}
- {{#invoke:sorted plain list|desc|propertyID=<PNUMBER>}}
- {{#invoke:sorted plain list|ascd|propertyID=<PNUMBER>}}
- {{#invoke:sorted plain list|descd|propertyID=<PNUMBER>}}
Examples
{{#invoke:sorted plain list|asc|apples, oranges, bananas}} → - apples
- bananas
- oranges
{{#invoke:sorted plain list|desc|apples, oranges, bananas}} → - oranges
- bananas
- apples
{{#invoke:sorted plain list|asc|Santa Fe, Santa Rosa, Santana}} → - Santa Fe
- Santa Rosa
- Santana
{{#invoke:sorted plain list|desc|Santa Fe, Santa Rosa, Santana}} → - Santana
- Santa Rosa
- Santa Fe
{{#invoke:sorted plain list|ascd|Santa Fe, Santa Rosa, Santana}} → - Santa Fe
- Santa Rosa
- Santana
{{#invoke:sorted plain list|descd|Santa Fe, Santa Rosa, Santana}} → - Santana
- Santa Rosa
- Santa Fe
{{#invoke:sorted plain list|asc|apples; oranges; bananas|;}} → - apples
- bananas
- oranges
{{#invoke:sorted plain list|desc|apples; oranges; bananas|;}} → - oranges
- bananas
- apples
{{#invoke:sorted plain list|asc|1,500,666; 200; 3,999; 0; -5|;|type=number}} → - -5
- 0
- 200
- 3,999
- 1,500,666
{{#invoke:sorted plain list|desc|1,500,666; 200; 3,999; 0; -5|;|type=number}} → - 1,500,666
- 3,999
- 200
- 0
- -5
{{#invoke:sorted plain list|asc|1,500,666; 200; 3,999; 0; -5; apples; oranges; bananas|;}} → - -5
- 0
- 1,500,666
- 200
- 3,999
- apples
- bananas
- oranges
{{#invoke:sorted plain list|desc|1,500,666; 200; 3,999; 0; -5; apples; oranges; bananas|;}} → - oranges
- bananas
- apples
- 3,999
- 200
- 1,500,666
- 0
- -5
{{#invoke:sorted plain list|asc|1,500,666; 200; 3,999; 0; -5; apples; oranges; bananas|;|type=number}} → - -5
- 0
- 200
- 3,999
- 1,500,666
- apples
- oranges
- bananas
{{#invoke:sorted plain list|desc|1,500,666; 200; 3,999; 0; -5; apples; oranges; bananas|;|type=number}} → - bananas
- apples
- oranges
- 1,500,666
- 3,999
- 200
- 0
- -5
{{#invoke:sorted plain list|ascd|District 1, District 8, District 10, District 11}} → - District 1
- District 8
- District 10
- District 11
{{#invoke:sorted plain list|descd|District 1, District 8, District 10, District 11}} → - District 11
- District 10
- District 8
- District 1
See also
-- This module generates a sorted plain list
-- It was created as a modification of [[Module:Sort]]
local p = {}
local lang = mw.getContentLanguage()
local function transformstring(s)
	local a = mw.text.trim(s)
	a = mw.ustring.gsub(a, '%[%[[^%[%]<>|][^%[%]<>|]*|([^%[%]<>|][^%[%]<>|]*)%]%]', '%1')
	a = mw.ustring.gsub(a, '%[%[([^%[%]<>|][^%[%]<>|]*)%]%]', '%1')
	a = mw.ustring.gsub(a, '[%s%‑]', 'AA' )
	a = mw.ustring.gsub(a, '([%D])([%d])$', '%10%2')
	return a
end
-- This function was copied/modified from [[Module:Wikidata]]
local function getValue(frame, propertyID)
	local entity = mw.wikibase.getEntityObject()
	local claims
	if entity and entity.claims then
		claims = entity.claims[propertyID]
	end
	if claims then
		-- if wiki-linked value output as link if possible
		if (claims[1] and claims[1].mainsnak.snaktype == "value" and claims[1].mainsnak.datavalue.type == "wikibase-entityid") then
			local out = {}
			for k, v in pairs(claims) do
				local sitelink = mw.wikibase.sitelink("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				local label = mw.wikibase.label("Q" .. v.mainsnak.datavalue.value["numeric-id"])
				if label == nil then label = "Q" .. v.mainsnak.datavalue.value["numeric-id"] end
				
				if sitelink then
					out[#out + 1] = "[[" .. sitelink .. "|" .. label .. "]]"
				else
					out[#out + 1] = label
				end
			end
			return out
		else
			-- just return best values
			return { entity:formatPropertyValues(propertyID).value }
		end
	else
		return {""}
	end
end
function p.asc(frame)
    local items
    if frame.args.propertyID then
    	items = getValue(frame, frame.args.propertyID)
    else
    	items = mw.text.split( frame.args[1] or '', frame.args[2] or ',', true)
    end
    if (frame.args['type'] or '') == 'number' then
    	table.sort( items, function (a, b) return ((lang:parseFormattedNumber(a) or math.huge) < (lang:parseFormattedNumber(b) or math.huge)) end )
    else
	    table.sort( items, function (a, b) return mw.text.trim(a) < mw.text.trim(b) end )
    end
    return '<div class="plainlist"><ul><li>' .. table.concat( items, "</li><li>" ) .. '</li></ul></div>'
end
function p.desc(frame)
    if frame.args.propertyID then
    	items = getValue(frame, frame.args.propertyID)
    else
    	items = mw.text.split( frame.args[1] or '', frame.args[2] or ',', true)
    end
    if (frame.args['type'] or '') == 'number' then
    	table.sort( items, function (a, b) return ((lang:parseFormattedNumber(a) or math.huge) > (lang:parseFormattedNumber(b) or math.huge)) end )
    else
    	table.sort( items, function (a, b) return mw.text.trim(a) > mw.text.trim(b) end )
    end
    return '<div class="plainlist"><ul><li>' .. table.concat( items, "</li><li>" ) .. '</li></ul></div>'
end
function p.ascd(frame)
    local items
    if frame.args.propertyID then
    	items = getValue(frame, frame.args.propertyID)
    else
    	items = mw.text.split( frame.args[1] or '', frame.args[2] or ',', true)
    end
    if (frame.args['type'] or '') == 'number' then
    	table.sort( items, function (a, b) return ((lang:parseFormattedNumber(a) or math.huge) < (lang:parseFormattedNumber(b) or math.huge)) end )
    else
	    table.sort( items, function (a, b) return ( transformstring(a) < transformstring(b) ) end)
    end
    return '<div class="plainlist"><ul><li>' .. table.concat( items, "</li><li>" ) .. '</li></ul></div>'
end
function p.descd(frame)
    local items
    if frame.args.propertyID then
    	items = getValue(frame, frame.args.propertyID)
    else
    	items = mw.text.split( frame.args[1] or '', frame.args[2] or ',', true)
    end
    if (frame.args['type'] or '') == 'number' then
    	table.sort( items, function (a, b) return ((lang:parseFormattedNumber(a) or math.huge) > (lang:parseFormattedNumber(b) or math.huge)) end )
    else
	    table.sort( items, function (a, b) return ( transformstring(a) > transformstring(b) ) end)
    end
    return '<div class="plainlist"><ul><li>' .. table.concat( items, "</li><li>" ) .. '</li></ul></div>'
end
return p
