Module:Sorted plain list

MyWikiBiz, Author Your Legacy — Thursday April 18, 2024
Jump to navigationJump to search

Template:Module rating

Overview

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
    1. asc is ascending as defined by the default LUA string comparison operator.
    2. desc is descending as defined by the default LUA string comparison operator.
    3. asc with Template:Para is ascending using numeric comparison instead of string comparison.
    4. desc with Template:Para is descending using numeric comparison instead of string comparison.
    5. ascd is ascending dictionary order, so spaces are sorted before other characters.
    6. descd is 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

Template:Basepage subpage


-- 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