Modul:Collation

Z Wikislovníku
Skočit na navigaci Skočit na vyhledávání

Dokumentaci tohoto modulu lze vytvořit na stránce Nápověda:Modul:Collation

-- @brief
--  Collation for cs (Czech) language.
-- 
-- @author
--  [[meta:User:Danny B.]]
local _module = {}
----------------------------------------


--[[
	Zde je možno editovat
	
	Prosíme, zachovávejte formát a správné abecední pořadí.
	
	Formát:
		{ sekundární abeceda, primární abeceda },
	Pořadí:
		ČSN 97 6030
		https://cs.wikipedia.org/wiki/Abecedn%C3%AD_%C5%99azen%C3%AD#.C4.8Ce.C5.A1tina
--]]
_module.alphabet = {
	{ " ", " " },
	{ "-", "-" },
	{ "a", "a" },
	{ "á", "a" },
	{ "å", "a" },
	{ "ä", "a" },
	{ "b", "b" },
	{ "c", "c" },
	{ "č", "č" },
	{ "d", "d" },
	{ "ď", "d" },
	{ "e", "e" },
	{ "é", "e" },
	{ "ě", "e" },
	{ "f", "f" },
	{ "g", "g" },
	{ "h", "h" },
	{ "ch", "ch" },
	{ "i", "i" },
	{ "í", "i" },
	{ "j", "j" },
	{ "k", "k" },
	{ "l", "l" },
	{ "m", "m" },
	{ "n", "n" },
	{ "ň", "n" },
	{ "o", "o" },
	{ "ó", "o" },
	{ "p", "p" },
	{ "q", "q" },
	{ "r", "r" },
	{ "ř", "ř" },
	{ "s", "s" },
	{ "š", "š" },
	{ "t", "t" },
	{ "ť", "t" },
	{ "u", "u" },
	{ "ú", "u" },
	{ "ů", "u" },
	{ "ü", "u" },
	{ "v", "v" },
	{ "w", "w" },
	{ "x", "x" },
	{ "y", "y" },
	{ "ý", "y" },
	{ "z", "z" },
	{ "ž", "ž" },
	{ "'", "'" }
}
--[[
	Konec možnosti editace
--]]


-- Pomocné tabulky
local primaryAlphabet = {}
local secondaryAlphabet = {}

-- Inicializace pomocných tabulek
for i, letter in ipairs( _module.alphabet ) do
	secondaryAlphabet[letter[1]] = i
	primaryAlphabet[letter[1]] = secondaryAlphabet[letter[2]]
end


local function charAt( str, pos )
	
	return mw.ustring.sub( str, pos, pos )
	
end


local function getChar( str, pos, alphabet )
	
	local newpos = pos
	local char = charAt( str, newpos )
	
	
	while char ~= "" and not alphabet[char] do
		newpos = newpos + 1
		char = charAt( str, newpos )
	end
	
	if ( char == "c" and charAt( str, newpos + 1 ) == "h" ) then
		char = "ch"
		newpos = newpos + 1
	end
	
	return char, newpos + 1
	
end


-- @brief
--  Compare two strings by given alphabet.
-- 
-- @param
--  String left First string
--  String right Second string
--  table alphabet Table of order of chars
-- @return
--  -1 if left < right
--  0 if left = right
--  1 if left > right
local function compareByAlphabet( strLeft, strRight, alphabet )
	
	local iLeft = 1
	local iRight = 1
	local charLeft = ""
	local charRight = ""
	
	
	repeat
		charLeft, iLeft = getChar( strLeft, iLeft, alphabet );
		charRight, iRight = getChar( strRight, iRight, alphabet );
		if charLeft ~= "" or charRight ~= "" then
			if charLeft == "" then
				return -1
			elseif charRight == "" then
				return 1
			elseif alphabet[charLeft] > alphabet[charRight] then
				return 1
			elseif alphabet[charLeft] < alphabet[charRight] then
				return -1
			end
		end
	until ( charLeft == "" or charRight == "" )
	
	return 0
	
end


-- @brief
--  Compare two strings.
-- 
-- @param
--  String left First string
--  String right Second string
-- @return
--  -1 if left < right
--  0 if left = right
--  1 if left > right
function _module.compare( left, right )
	
	local output
	
	local strLeft = mw.ustring.lower( left )
	local strRight = mw.ustring.lower( right )

	
	if strLeft == strRight then
		return 0
	end

	output = compareByAlphabet( strLeft, strRight, primaryAlphabet )
	if output == 0 then
		return compareByAlphabet( strLeft, strRight, secondaryAlphabet )
	else
		return output
	end
	
end


-- @brief
--  Compare two strings for table.sort().
-- 
-- @param
--  String left First string
--  String right Second string
-- @return
--  boolean true if left < right
--  boolean false if left >= right
function _module.sortCompare( left, right )
	
	return _module.compare( left, right ) < 0
	
end


----------------------------------------
return _module