Moduuli:Automaattilinkki

Wikisanakirjasta
Tässä ohjeessa kuvataan toiminnallisuutta jonka kehitys on vielä kesken. Sivu on tarkoitettu lähinnä kehityksen apuvälineeksi, ei yleiseen käyttöön.

EI KÄYTÖSSÄ

Tässä moduulissa on määritelty muunnosfunktioita, jotka muuttavat sanarivillä ja muisssa linkkiteksteissä näytetyt sana automaattisesti sivun nimen muotoon. Kielille, joille on määritelty muunnosfunktio, voidaan sanarivimallineissa antaa pelkkä tarkkeellinen muoto.

Muunnosfunkioita on seuraaville kielille:

  • arabia
  • heprea
  • latina
  • serbia
  • ukraina
  • venäjä

Esim. taivutustaulukoissa:

  • {{al|la|nucī}} merkinnän {{l|la|nuci|nucī}} sijaan

Esim. sanarivimallineissa:

  • {{substantiivi|ar|vok=أَب|monvok=آبَاء}} merkinnän {{substantiivi|ar|vok=أَب|mon=آباء|monvok=آبَاء}} sijaan
  • {{substantiivi|ru|paino=аба́к|monpaino=аба́ки}} pro {{substantiivi|ru|paino=аба́к|mon=абаки|monpaino=аба́ки}}
  • {{substantiivi|la|abbās|mon*=abbātēs}} pro {{substantiivi|la|abbās|mon=abbates|mon*=abbātēs}}

-- akuuttiaksentin poistava funktio
local function yleinenAkuutillinen(sana)
    local tarkkeet = {
	-- Poistettavat
		[0x0301] = true,  -- COMBINING ACUTE ACCENT
    }

    local s = mw.ustring.toNFD(sana)

    local out = {}
    local i = 1

    for codepoint in mw.ustring.gcodepoint( s ) do
		if not tarkkeet[codepoint] then
	    	out[i] = codepoint
	    	i = i + 1
		end
    end

    return mw.ustring.toNFC(mw.ustring.char(unpack(out)))
    
end



--- Taulukko kielikoodeista ja sanan muuttavista funktoista.
local muuntimet = {
    
    ["ar"] = function (sana)  -- arabia

        local tarkkeet = {
            -- TODO tarkistettava
            
            -- Poistettavat
            [0x064B] = true,  -- ARABIC FATHATAN
            [0x064C] = true,  -- ARABIC DAMMATAN
            [0x064D] = true,  -- ARABIC KASRATAN
            [0x064E] = true,  -- ARABIC FATHA
            [0x064F] = true,  -- ARABIC DAMMA
            [0x0650] = true,  -- ARABIC KASRA
            [0x0651] = true,  -- ARABIC SHADDA
            [0x0652] = true,  -- ARABIC SUKUN
            [0x200E] = true,  -- LEFT-TO-RIGHT MARK
            [0x0670] = true,  -- ARABIC LETTER SUPERSCRIPT ALEF

            -- Muutettavat
            [0x0671] = 0x0627, -- U+0671 ARABIC LETTER ALEF WASLA -> U+0627 ARABIC LETTER ALEF
        }

        local s = mw.ustring.toNFD(sana)

        local out = {}
        local i = 1

        for codepoint in mw.ustring.gcodepoint( s ) do
            if not tarkkeet[codepoint] then
                out[i] = codepoint
                i = i + 1
            elseif type(tarkkeet[codepoint]) == "number" then
                out[i] = tarkkeet[codepoint]
                i = i + 1
            end
        end

        return mw.ustring.toNFC(mw.ustring.char(unpack(out)))
    end,


    ["he"] = function (sana)  -- heprea

        local tarkkeet = {
            -- TODO tarkistettava
            
            -- Poistettavat
            [0x05B0] = true,  -- HEBREW POINT SHEVA
            [0x05B1] = true,  -- HEBREW POINT HATAF SEGOL
            [0x05B2] = true,  -- HEBREW POINT HATAF PATAH
            --[0x05B3] = true,  -- HEBREW POINT HATAF QAMATS
            [0x05B4] = true,  -- HEBREW POINT HIRIQ
            [0x05B5] = true,  -- HEBREW POINT TSERE
            [0x05B6] = true,  -- HEBREW POINT SEGOL
            [0x05B7] = true,  -- HEBREW POINT PATAH
            [0x05B8] = true,  -- HEBREW POINT QAMATS
            [0x05B9] = true,  -- HEBREW POINT HOLAM
            --[0x05BA] = true,  -- HEBREW POINT HOLAM HASER FOR VAV
            [0x05BB] = true,  -- HEBREW POINT QUBUTS
            [0x05BC] = true,  -- HEBREW POINT DAGESH OR MAPIQ
            [0x05C1] = true,  -- HEBREW POINT SHIN DOT
            [0x05C2] = true,  -- HEBREW POINT SIN DOT
        }

        local s = mw.ustring.toNFD(sana)

        local out = {}
        local i = 1

        for codepoint in mw.ustring.gcodepoint( s ) do
            if not tarkkeet[codepoint] then
                out[i] = codepoint
                i = i + 1
            elseif type(tarkkeet[codepoint]) == "number" then
                out[i] = tarkkeet[codepoint]
                i = i + 1
            end
        end

        return mw.ustring.toNFC(mw.ustring.char(unpack(out)))
    end,
    
    ["la"] = function (sana)  -- latina
        local tarkkeet = {
	    
	    -- Poistettavat
            [0x0304] = true,  -- COMBINING MACRON
            [0x0306] = true,  -- COMBINING BREVE	    
        }

        local s = mw.ustring.toNFD(sana)

        local out = {}
        local i = 1

        for codepoint in mw.ustring.gcodepoint( s ) do
            if not tarkkeet[codepoint] then
                out[i] = codepoint
                i = i + 1
            end
        end

        return mw.ustring.toNFC(mw.ustring.char(unpack(out)))
    end,
    
    ["ru"] = yleinenAkuutillinen, -- venäjä,
    
    ["sr"] = function (sana)  -- serbia
        local tarkkeet = {
            0x0300,  -- COMBINING GRAVE ACCENT
            0x0301,  -- COMBINING ACUTE ACCENT
            0x0304,  -- COMBINING MACRON
            0x030F,  -- COMBINING DOUBLE GRAVE ACCENT
            0x0311,  -- COMBINING INVERTED BREVE
        }

        -- Tarkkeet poistetaan vain, jos ne on alla luetelluissa kirjaimissa.
        local muutettavat = {
            -- Latinalaiset
            ["a"] = "a",
            ["e"] = "e",
            ["i"] = "i",
            ["o"] = "o",
            ["u"] = "u",
            ["r"] = "r",
            
            -- Kyrilliset
            ["а"] = "а",
            ["е"] = "е",
            ["и"] = "и",
            ["о"] = "о",
            ["у"] = "у",         
        }

        local nfc = mw.ustring.toNFD(sana)
        local muutettu = mw.ustring.gsub(nfc, "(.)[" .. mw.ustring.char(unpack(tarkkeet)) .. "]", muutettavat)
        
        return mw.ustring.toNFC(muutettu)
    end,
    
    ["uk"] = yleinenAkuutillinen, -- ukraina,
}

local m = {}


function m.muuta(lang, sana)
    local func = muuntimet[lang]
    
    if func then
        return func(sana)
    end
    
    return sana
end




return m