Moduł:categoriesIndexing

Z Wikisłownika – wolnego słownika wielojęzycznego

Dokumentacja dla tego modułu może zostać utworzona pod nazwą Moduł:categoriesIndexing/opis

local p = {}

function inTable(tbl, item) -- check if item exists in an array
    for key, value in pairs(tbl) do
        if value == item then return key end
    end
    return false
end

function removeDiacritics( text )
    local nfd = mw.ustring.toNFD( text )
    local res = ''
    for c in mw.ustring.gcodepoint( nfd ) do
        if c<128 then
            res = res .. string.char(c)
        end
    end
    return res
end

local arabskie = {
    
    ["إ"] = "ا",
	["آ"] = "ا",
	["ا"] = "ا",
	["أ"] = "ا"
}

local francuski = {
	["À"] = "A",
	["Â"] = "A",
	["Ç"] = "C",
	["É"] = "E",
	["È"] = "E",
	["Ë"] = "E",
	["Ê"] = "E",
	["Î"] = "I",
	["Ï"] = "I",
	["Ô"] = "O",
	["Œ"] = "OE",
	["Ù"] = "U",
	["Ú"] = "U",
	["Û"] = "U",
	["à"] = "a",
	["â"] = "a",
	["ç"] = "c",
	["é"] = "e",
	["è"] = "e",
	["ë"] = "e",
	["ê"] = "e",
	["î"] = "i",
	["ï"] = "i",
	["ô"] = "o",
	["œ"] = "oe",
	["ù"] = "u",
	["ú"] = "u",
	["û"] = "u"
}

local hiszpanski = {
    ["Á"] = "A",
	["É"] = "E",
	["Í"] = "I",
	["Ó"] = "O",
	["Ú"] = "U",
    ["Ü"] = "U",
    N = "N1",
    ["Ñ"] = "N2+",
	["á"] = "a",
	["é"] = "e",
	["í"] = "i",
	["ó"] = "o",
	["ú"] = "u",
    ["ü"] = "u",
    n = "n1",
    ["ñ"] = "n2+"
}

local nowogrecki = {
    ["Ά"] = "Α",
	["Έ"] = "Ε",
	["Ή"] = "Η",
	["Ί"] = "Ι",
	["Ϊ"] = "Ι",
	["Ό"] = "Ο",
	["Ύ"] = "Υ",
	["Ϋ"] = "Υ",
	["Ώ"] = "Ω",
	["ά"] = "α",
	["έ"] = "ε",
	["ί"] = "ι",
	["ϊ"] = "ι",
	["ΐ"] = "ι",
	["ό"] = "ο",
	["ύ"] = "υ",
	["ϋ"] = "υ",
	["ΰ"] = "υ",
	["ώ"] = "ω",
	["ή"] = "η",
	["ς"] = "σ"
}

local polski = {
    A = "A1",
    C = "C1",
    E = "E1",
    L = "L1",
    N = "N1",
    O = "O1",
    S = "S1",
    Z = "Z1",
    a = "a1",
    c = "c1",
    e = "e1",
    l = "l1",
    n = "n1",
    o = "o1",
    s = "s1",
    z = "z1",
    ["Ą"] = "A2",
    ["Ć"] = "C2+",
    ["Ę"] = "E2",
    ["Ł"] = "L2+",
    ["Ń"] = "N2",
    ["Ó"] = "O2+",
    ["Ś"] = "S2+",
    ["Ź"] = "Z2+",
    ["Ż"] = "Z3+",
    ["ą"] = "a2",
    ["ć"] = "c2+",
    ["ę"] = "e2",
    ["ł"] = "l2+",
    ["ń"] = "n2",
    ["ó"] = "o2+",
    ["ś"] = "s2+",
    ["ź"] = "z2+",
    ["ż"] = "z3+"
}

-- sources: http://www.cjvlang.com/Writing/writviet.html and http://kord.kober.us/encoding/vn_utf-8.html
local wietnamski = {
    A = "A0",
    E = "E0",
    O = "O0",
    U = "U0",
    D = "D0",
    a = "a0",
    e = "e0",
    o = "o0",
    U = "u0",
    d = "d0",
    ["Ắ+"] = "Ă", ["Ằ+"] = "Ă", ["Ẳ+"] = "Ă", ["Ẵ+"] = "Ă", ["Ặ+"] = "Ă",
    ["Ấ+"] = "Â", ["Ầ+"] = "Â", ["Ẩ+"] = "Â", ["Ẫ+"] = "Â", ["Ậ+"] = "Â",
    ["Ế+"] = "Ê", ["Ề+"] = "Ê", ["Ể+"] = "Ê", ["Ễ+"] = "Ê", ["Ệ+"] = "Ê",
    ["Ố+"] = "Ô", ["Ồ+"] = "Ô", ["Ổ+"] = "Ô", ["Ỗ+"] = "Ô", ["Ộ+"] = "Ô",
    ["Ớ+"] = "Ơ", ["Ờ+"] = "Ơ", ["Ở+"] = "Ơ", ["Ỡ+"] = "Ơ", ["Ợ+"] = "Ơ",
    ["Ứ+"] = "Ư", ["Ừ+"] = "Ư", ["Ử+"] = "Ư", ["Ữ+"] = "Ư", ["Ự+"] = "Ư",
    ["ắ+"] = "ă", ["ằ+"] = "ă", ["ẳ+"] = "ă", ["ẵ+"] = "ă", ["ặ+"] = "ă",
    ["ấ+"] = "â", ["ầ+"] = "â", ["ẩ+"] = "â", ["ẫ+"] = "â", ["ậ+"] = "â",
    ["ế+"] = "ê", ["ề+"] = "ê", ["ể+"] = "ê", ["ễ+"] = "ê", ["ệ+"] = "ê",
    ["ố+"] = "ô", ["ồ+"] = "ô", ["ổ+"] = "ô", ["ỗ+"] = "ô", ["ộ+"] = "ô",
    ["ớ+"] = "ơ", ["ờ+"] = "ơ", ["ở+"] = "ơ", ["ỡ+"] = "ơ", ["ợ+"] = "ơ",
    ["ứ+"] = "ư", ["ừ+"] = "ư", ["ử+"] = "ư", ["ữ+"] = "ư", ["ự+"] = "ư",
    ["À"] = "A0",
    ["Á"] = "A0",
	["Â"] = "A2+",
	["È"] = "E0",
	["É"] = "E0",
	["Ê"] = "E1+",
	["Ì"] = "I",
	["Í"] = "I",
	["Ò"] = "O0",
	["Ó"] = "O0",
	["Ô"] = "O1+",
	["Õ"] = "O0",
	["Ù"] = "U0",
	["Ú"] = "U0",
	["à"] = "a0",
	["á"] = "a0",
	["â"] = "a2+",
	["ã"] = "a0",
	["è"] = "e0",
	["é"] = "e0",
	["ê"] = "e1+",
	["ì"] = "i",
	["í"] = "i",
	["ò"] = "o0",
	["ó"] = "o0",
	["ô"] = "o1+",
	["õ"] = "o0",
	["ù"] = "u0",
	["ú"] = "u0",
	["ý"] = "y",
    ["Ý"] = "Y",
	["Ă"] = "A1+",
	["ă"] = "a1+",
	["Đ"] = "D1+",
	["đ"] = "d1+",
	["Ĩ"] = "I",
	["ĩ"] = "i",
	["Ũ"] = "U0",
	["ũ"] = "u0",
	["Ơ"] = "O2+",
	["ơ"] = "o2+",
	["Ư"] = "U1+",
	["ư"] = "u1+",
	["Ạ"] = "A0",
	["ạ"] = "a0",
	["Ả"] = "A0",
	["ả"] = "a0",
	["Ấ"] = "A2+",
	["ấ"] = "a2+",
	["Ầ"] = "A2+",
	["ầ"] = "a2+",
	["Ẩ"] = "A2+",
	["ẩ"] = "a2+",
	["Ẫ"] = "A2+",
	["ẫ"] = "a2+",
	["Ậ"] = "A2+",
	["ậ"] = "a2+",
	["Ắ"] = "A1+",
	["ắ"] = "a1+",
	["Ằ"] = "A1+",
	["ằ"] = "a1+",
	["Ẳ"] = "A1+",
	["ẳ"] = "a1+",
	["Ẵ"] = "A1+",
	["ẵ"] = "a1+",
	["Ặ"] = "A1+",
	["ặ"] = "a1+",
	["Ẹ"] = "E0",
	["ẹ"] = "e0",
	["Ẻ"] = "E0",
	["ẻ"] = "e0",
	["Ẽ"] = "E0",
	["ẽ"] = "e0",
	["Ế"] = "E1+",
	["ế"] = "e1+",
	["Ề"] = "E1+",
	["ề"] = "e1+",
	["Ể"] = "E1+",
	["ể"] = "e1+",
	["Ễ"] = "E1+",
	["ễ"] = "e1+",
	["Ệ"] = "E1+",
	["ệ"] = "e1+",
	["Ỉ"] = "I",
	["ỉ"] = "i",
	["Ị"] = "I",
	["ị"] = "i",
	["Ọ"] = "O0",
	["ọ"] = "o0",
	["Ỏ"] = "O0",
	["ỏ"] = "o0",
	["Ố"] = "O1+",
	["ố"] = "o1+",
	["Ồ"] = "O1+",
	["ồ"] = "o1+",
	["Ổ"] = "O1+",
	["ổ"] = "o1+",
	["Ỗ"] = "O1+",
	["ỗ"] = "o1+",
	["Ộ"] = "O1+",
	["ộ"] = "o1+",
	["Ớ"] = "O2+",
	["ớ"] = "o2+",
	["Ờ"] = "O2+",
	["ờ"] = "o2+",
	["Ở"] = "O2+",
	["ở"] = "o2+",
	["Ỡ"] = "O2+",
	["ỡ"] = "o2+",
	["Ợ"] = "O2+",
	["ợ"] = "o2+",
	["Ụ"] = "U0",
	["ụ"] = "u0",
	["Ủ"] = "U0",
	["ủ"] = "u0",
	["Ứ"] = "U1+",
	["ứ"] = "u1+",
	["Ừ"] = "U1+",
	["ừ"] = "u1+",
	["Ử"] = "U1+",
	["ử"] = "u1+",
	["Ữ"] = "U1+",
	["ữ"] = "u1+",
	["Ự"] = "U1+",
	["ự"] = "u1+",
	["Ỳ"] = "Y",
	["ỳ"] = "y",
	["Ỵ"] = "Y",
	["ỵ"] = "y",
	["Ỷ"] = "Y",
	["ỷ"] = "y",
	["Ỹ"] = "Y",
	["ỹ"] = "y"
}

local default = {"kurdyjski"} -- add languages for which stripping all accents works properly
    
local indexing = {
    ["arabski"] = arabskie,
    ["dari"] = arabskie,
    ["osmańsko-turecki"] = arabskie,
    ["perski"] = arabskie,
    ["paszto"] = arabskie,
    ["polski"] = polski,
    ["urdu"] = arabskie,
    ["francuski"] = francuski,
    ["hiszpański"] = hiszpanski,
    ["nowogrecki"] = nowogrecki,
    ["wietnamski"] = wietnamski
}

function p.stripAccents( frame )
	local language = frame.args[1]
	local text = frame.args[2]
    
    if inTable(default, language) then
        return removeDiacritics( text )
    end
    
	local indexing = indexing[ language ]

    if indexing == nil then
        return text
	end

	local result, poczatek = '', true
        
	for codepoint in mw.ustring.gcodepoint( text ) do
            local unstripped = mw.ustring.char(codepoint)
            local stripped = indexing[ unstripped ]
                        
            if stripped == nil then
                stripped = unstripped
                poczatek = false
            end
            
            if poczatek then
                local stripped2 = indexing[unstripped..'+']
                stripped = stripped2 or ((string.sub(stripped, -1) == '+') and unstripped or stripped)
                poczatek = false
            end
            
            result = result .. stripped
    end
    return result
end
return p