{lang: 'hu'}

Összedobtam egy egyszerű függvényt, amivel egy megadott szóhoz -val, -vel ragot lehet képezni (pl. alma -> almával). Egyenlőre javascript-ben van megírva, de kérés alapján php-ra is simán átírható. A tévedés jogát fenntartom, ha találtok olyan esetet, amikor nem jól működik, akkor hozzászólásban várom a szót. (lehetséges, hogy valamelyik speciális magánhangzó páros kimaradt a listából) Tehát a függvény:

UPDATE: kód frissítve, köszönet az észrevételekért és a javítási javaslatokért!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
function addWithTermination(word) {
 
    var vowels = [
        'a', 'á',
        'e', 'é',
        'i', 'í',
        'o', 'ó',
        'ö', 'ő',
        'u', 'ú',
        'ü', 'ű'
        ],
        terminations = {
            'val': ['a', 'ae', 'aé', 'ai', 'aí', 'á', 'ái', 'áí', 'o', 'oi', 'ó', 'u', 'ú'],
            'vel': ['e', 'ei', 'é', 'i', 'í', 'ö', 'ő', 'ü', 'ű']
        },
        specialConsonants = [ 'cs', 'gy', 'sz', 'ty', 'zs' ],
        specialDoubleConsonants = [ 'ccs', 'ggy', 'ssz', 'tty' ],
        exceptions = {
            'val': ['íj', 'híd', 'díj'],
            'vel': []
        },
        lastCharIndex = word.length - 1,
        lastChar = word[lastCharIndex],
        vowelsAsString = vowels.join(''),
        vowelsPattern = new RegExp('[' + vowelsAsString + ']', 'ig'),
        vowelsMatch = word.match(vowelsPattern),
        lastTwoVowels = [],
        lastTwoVowelsAsString, termination;
 
    if (exceptions.val.indexOf(word) !== -1) {
        termination = 'val';
    }
    else if (exceptions.vel.indexOf(word) !== -1) {
        termination = 'vel';
    }
    else if (vowelsMatch.length > 1) {
        /* Több magánhagzó van a szóban */
        lastTwoVowels.push(vowelsMatch[vowelsMatch.length - 2]);
        lastTwoVowels.push(vowelsMatch[vowelsMatch.length - 1]);
        lastTwoVowelsAsString = lastTwoVowels.join('');
 
        if (terminations.val.indexOf(lastTwoVowelsAsString) === -1 && terminations.vel.indexOf(lastTwoVowelsAsString) === -1) { /* A magánhagzó pár nem egy speciális pár */
            termination = terminations.val.indexOf(lastTwoVowels[1]) === -1 ? 'vel' : 'val';
        }
        else {
            /* A magánhagzó pár egy speciális pár */
            termination = terminations.val.indexOf(lastTwoVowelsAsString) === -1 ? 'vel' : 'val';
        }
    }
    else if (vowelsMatch.length === 1) {
        /* Csak egy magánhangzó van a szóban */
        termination = terminations.val.indexOf(vowelsMatch[vowelsMatch.length - 1]) === -1 ? 'vel' : 'val';
    }
    else {
        /* Ilyen szó nincs */
        return word;
    }
 
    if (vowels.indexOf(lastChar) !== -1) {
        if (vowels.indexOf(lastChar) % 2 === 0) {
                /*
                 * Az utolsó karakter magánhangzó és ha
                 * nem ékezetes, akkor ékezetessé kell tenni
                 */
            word = word.substring(0, lastCharIndex) + vowels[vowels.indexOf(lastChar) + 1];
        }
    }
    else {
        if(word[lastCharIndex - 1] !== word[lastCharIndex]) {
            /*
             * Az utolsó karakter mássalhangzó, így
             * ha nem kettős mássalhangzó alapból,
             * akkor megkell kettőzni
             */
            if(specialConsonants.indexOf(word.substr(lastCharIndex - 1))  !== -1 && specialDoubleConsonants.indexOf(word.substr(lastCharIndex - 2)) === -1) {
                /*
                 * Az utolsó két karatkter: 'cs', 'gy', 'sz', 'ty' vagy 'zs',
                 * ezeknél az első karaktert duplázzuk
                 */
 
                word = word.substr(0, lastCharIndex) + word[lastCharIndex - 1] + word[lastCharIndex];
            }
            else if(specialDoubleConsonants.indexOf(word.substr(lastCharIndex - 2)) === -1) {
                word += word[lastCharIndex];
            }
 
        }
 
        /*
         * Mássalhangzóra végződés esetén mindenképp
         * törölni kell a -val, -vel ragból a v-t
         */
        termination = termination.substring(1);
    }
 
    word += termination;
 
    return word;
}