module:sorted plain list

-- This module generates a sorted plain list

-- It was created as a modification of Module:Sort

local p = {}

local lang = mw.getContentLanguage()

local ubl = require('Module:List').unbulleted

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] = "" .. 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 ubl(items)

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 ubl(items)

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 ubl(items)

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 ubl(items)

end

return p