Modul:sort

Definition från Wiktionary, den fria ordlistan.
Hoppa till: navigering, sök

Dokumentation för denna modul finns på /dok (redigera), /test


Syfte[redigera]

Att bistå mallar att förse kategoriseringar med sorteringsnycklar så att sidor sorteras på ett rimligt sätt för det aktuella språket. Utan sorteringsnycket sorteras "åra" efter "öre". Med rätt sorteringsnyckel rättas detta till.

Användning i mallar[redigera]

[[Kategori:<kategori>|{{#invoke:sort|get_sort_key|<språkkod>|<pagename>}}]]

Till exempel:

[[Kategori:Svenska/Substantiv|{{#invoke:sort|get_sort_key|sv|åra}}]]

som genererar

[[Kategori:Svenska/Substantiv|z~ra]]

Alla mallar som kategoriserar en sida bör förse kategoriangivelsen med en sorteringsnyckel från sorteringsmodulen.

Tester[redigera]

All tests passed.

test_1_text:

Text Expected Actual
bara gemener, sv-abc abc abc
mellanrum ska bort, sv-a b c abc abc
diakriter hanteras som egen bokstav, sv-åra z~ra z~ra
diakriter hanteras ej som egen bokstav, en-åra ara ara
versaler till gemener, fr-TV tv tv
diakriter bort även för versaler, egen bokstav, sv-Åre z~re z~re
diakriter bort även för versaler, ej egen bokstav, fr-Åre are are
utan språkkod, diakriter bort ändå, -éüåäö euaao euaao
ej existerande språkkod, diakriter bort ändå, xyz-éüåäö euaao euaao
speciella tecken ska bort, de-a.,-b ab ab
utan språkkod, speciella tecken ska bort, -a.,-b ab ab
ej existerande språkkod, speciella tecken ska bort, xyz-a.,-b ab ab

test_2_nummer:

Text Expected Actual
enkelt nummer, sv-33  ::33  ::33
enkelt nummer med text, sv-ab33cd ab::33cd ab::33cd
dubbelt nummer med text, sv-ab33cd9988ef ab::33cd::::9988ef ab::33cd::::9988ef
dubbelt nummer med text och ledande nollor, sv-ab0033cd09900ef ab::33cd::::9900ef ab::33cd::::9900ef
speciella tecken ska bort, sv-1,2-etandiol  ::12etandiol  ::12etandiol
speciella tecken ska bort, sv-1,2,3-propantriol  :::123propantriol  :::123propantriol

test_3_non_latin:

Text Expected Actual
kinesiska ska ej ändras, zh-中世紀 中世紀 中世紀


Detaljerad information om modulen[redigera]

local export = {}

local lang = require('Modul:lang')
local diacritics = mw.loadData("Modul:sort/data-diacritics")

local function excludeCharsFromString(str)
	--settings for which characters that should always be excluded from the sort key, fetched from Wiktionary:Användare/Robotar/Tecken som exkluderas för sortering 2017-05-12
	local excludedChars = {" ", "%.", ",", "&", "!", "%-", "/", ":", "\"", "%$", "%(", "%)", "%*", "%+", "\\", ";", "=", "%?", "~", "%%"}

	for k,v in pairs(excludedChars) do
		str = mw.ustring.gsub(str, v, "")
	end

	return str;
end

local function lc(str)
	return mw.ustring.lower(str)
end

local function undiacritic(str, languageSpecificRules)
	local diacriticsExceptions = {} --don't remove diacritics for letters put in this table
	for k,v in pairs(languageSpecificRules) do
	    local replacePair = mw.text.split(v, ">", true)
		str = mw.ustring.gsub(str, replacePair[1], replacePair[2])
		table.insert(diacriticsExceptions, replacePair[2])
	end

	for k,v in pairs(diacritics) do --i.e. v == {"α", {"ά", "ὰ", "ἀ", "ἅ", "ᾶ", "ἆ", "ἇ"}}
		local charWithoutDiacritics = v[1]
		local charsWithDiacritics = v[2]
		for k2,v2 in pairs(charsWithDiacritics) do 
			local isDiacriticsException = false
			for k3,v3 in pairs(diacriticsExceptions) do
		        if v3 == v2 then 
		        	isDiacriticsException = true
		        end
		    end
		    if isDiacriticsException ~= true then
				str = mw.ustring.gsub(str, v2, charWithoutDiacritics)
			end
		end
	end

	return str;
end

local function applyNumberSorting(str)
	return mw.ustring.gsub(str, "0*(%d+)", function(d) return mw.ustring.rep(":", mw.ustring.len(d)) .. d end) --add a ":" for each numeral in each number in front of the number
end

local function getKey(str, languageSpecificRules)
	str = excludeCharsFromString(str)
	str = lc(str)
	str = undiacritic(str, languageSpecificRules)
	str = applyNumberSorting(str)
	return str
end

function export.getSortKey(arg1, arg2)
	local langCode, pageName
	if arg1 == mw.getCurrentFrame() then
		local frame = arg1
		langCode = frame.args[1] or "" --defaults to none
		pageName = frame.args[2] or mw.title.getCurrentTitle().text -- current pagename
	else
		langCode = arg1 or ""
		pageName = arg2
	end

	local languageSpecificRules = lang.getSortRules(langCode) or {}

	return getKey(pageName, languageSpecificRules)
end

return export