När sidor kategoriseras sorteras enligt standardalgoritmen för svenskspråkiga Wiktionary så sorteras de i en ordning som inte alltid stämmer överens med det aktuella språkets regler. Exempelvis sorteras ä och ö framför å, vilket blir fel för svenska. Olika språk har olika regler och dessa regler hämtas från Modul:lang som har dessa sorteringsregler och annan språkrelaterad information sparad i Modul:lang/data.
Modulen används endast av andra moduler, och inte direkt från mallkoden. Mallar bör istället använda Modul:categorize för att skapa kategorier där sorteringsnyckeln är inkluderad.
Den textsträng som returneras är sidnamnet som skickas in, efter det att särskilda operationer utförts som delvis är beroende på språk.
local lang = require('Modul:lang')
local diacritic_objects = mw.loadData("Modul:sort/data-diacritics")
local export = {}
local function excludeSpecificCharsFromString(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 excluded_chars = {" ", "%.", ",", "%&", "!", "%-", "/", ":", "\"", "\'", "%$", "%(", "%)", "%*", "%+", "\\", ";", "=", "%?", "~", "%%"}
for k,v in pairs(excluded_chars) do
str = mw.ustring.gsub(str, v, "")
end
return str;
end
local function undiacritic(str, language_specific_rules)
local diacritic_exceptions = {} --don't remove diacritics for letters put in this table
for k,v in pairs(language_specific_rules) do
local replace_pair = mw.text.split(v, ">", true)
str = mw.ustring.gsub(str, replace_pair[1], replace_pair[2])
table.insert(diacritic_exceptions, replace_pair[2])
end
for k,v in pairs(diacritic_objects) do --i.e. v == {"α", {"ά", "ὰ", "ἀ", "ἅ", "ᾶ", "ἆ", "ἇ"}}
local char_without_diacritics = v[1]
local chars_with_diacritics = v[2]
for k2,v2 in pairs(chars_with_diacritics) do
local is_diacritic_exception = false
for k3,v3 in pairs(diacritic_exceptions) do
if v3 == v2 then
is_diacritic_exception = true
end
end
if is_diacritic_exception ~= true then
str = mw.ustring.gsub(str, v2, char_without_diacritics)
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, language_specific_rules)
str = excludeSpecificCharsFromString(str)
str = mw.ustring.lower(str)
str = undiacritic(str, language_specific_rules)
str = applyNumberSorting(str)
return str
end
function export.getSortKey(arg1, arg2)
local lang_code, pagename
if arg1 == mw.getCurrentFrame() then
local frame = arg1
lang_code = frame.args[1] or "xx"
pagename = frame.args[2] or mw.title.getCurrentTitle().text
else
lang_code = arg1 or "xx"
pagename = arg2 or ""
end
local language_specific_rules = lang.getSortRules(lang_code) or {}
return getKey(pagename, language_specific_rules)
end
return export