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
100
101
102
103
104
105
106
|
/*
* Copyright (C) 2024 Yomitan Authors
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
import {prefixInflection, suffixInflection} from '../language-transforms.js';
// https://www.dartmouth.edu/~deutsch/Grammatik/Wortbildung/Separables.html
const separablePrefixes = ['ab', 'an', 'auf', 'aus', 'auseinander', 'bei', 'da', 'dabei', 'dar', 'daran', 'dazwischen', 'durch', 'ein', 'empor', 'entgegen', 'entlang', 'entzwei', 'fehl', 'fern', 'fest', 'fort', 'frei', 'gegenüber', 'gleich', 'heim', 'her', 'herab', 'heran', 'herauf', 'heraus', 'herbei', 'herein', 'herüber', 'herum', 'herunter', 'hervor', 'hin', 'hinab', 'hinauf', 'hinaus', 'hinein', 'hinterher', 'hinunter', 'hinweg', 'hinzu', 'hoch', 'los', 'mit', 'nach', 'nebenher', 'nieder', 'statt', 'um', 'vor', 'voran', 'voraus', 'vorbei', 'vorüber', 'vorweg', 'weg', 'weiter', 'wieder', 'zu', 'zurecht', 'zurück', 'zusammen'];
/**
* @param {string} prefix
* @param {string[]} conditionsIn
* @param {string[]} conditionsOut
* @returns {import('language-transformer').Rule}
*/
function separatedPrefix(prefix, conditionsIn, conditionsOut) {
const germanLetters = 'a-zA-ZäöüßÄÖÜẞ';
const regex = new RegExp(`^([${germanLetters}]+) .+ ${prefix}$`);
return {
type: 'other',
isInflected: regex,
deinflect: (term) => {
return term.replace(regex, '$1 ' + prefix);
},
conditionsIn,
conditionsOut,
};
}
const separatedPrefixInflections = separablePrefixes.map((prefix) => {
return separatedPrefix(prefix, [], []);
});
const zuInfinitiveInflections = separablePrefixes.map((prefix) => {
return prefixInflection(prefix + 'zu', prefix, [], ['v']);
});
export const germanTransforms = {
language: 'de',
conditions: {
v: {
name: 'Verb',
isDictionaryForm: true,
},
n: {
name: 'Noun',
isDictionaryForm: true,
},
adj: {
name: 'Adjective',
isDictionaryForm: true,
},
},
transforms: [
{
name: 'nominalization',
description: 'Noun formed from a verb',
rules: [
suffixInflection('ung', 'en', [], []),
suffixInflection('lung', 'eln', [], []),
],
},
{
name: '-bar',
description: '-able adjective from a verb',
rules: [
suffixInflection('bar', 'en', [], ['v']),
suffixInflection('bar', 'n', [], ['v']), // Lieferbar
],
},
{
name: 'negative',
description: 'Negation',
rules: [
prefixInflection('un', '', [], ['adj']),
],
},
{
name: 'separated prefix',
description: 'Separable prefix',
rules: [
...separatedPrefixInflections,
],
},
{
name: 'zu-infinitive',
description: 'zu-infinitive',
rules: [
...zuInfinitiveInflections,
],
},
],
};
|