1# Generated by Snowball 2.2.0 - https://snowballstem.org/
2
3from .basestemmer import BaseStemmer
4from .among import Among
5
6
7class DanishStemmer(BaseStemmer):
8    '''
9    This class implements the stemming algorithm defined by a snowball script.
10    Generated by Snowball 2.2.0 - https://snowballstem.org/
11    '''
12
13    a_0 = [
14        Among(u"hed", -1, 1),
15        Among(u"ethed", 0, 1),
16        Among(u"ered", -1, 1),
17        Among(u"e", -1, 1),
18        Among(u"erede", 3, 1),
19        Among(u"ende", 3, 1),
20        Among(u"erende", 5, 1),
21        Among(u"ene", 3, 1),
22        Among(u"erne", 3, 1),
23        Among(u"ere", 3, 1),
24        Among(u"en", -1, 1),
25        Among(u"heden", 10, 1),
26        Among(u"eren", 10, 1),
27        Among(u"er", -1, 1),
28        Among(u"heder", 13, 1),
29        Among(u"erer", 13, 1),
30        Among(u"s", -1, 2),
31        Among(u"heds", 16, 1),
32        Among(u"es", 16, 1),
33        Among(u"endes", 18, 1),
34        Among(u"erendes", 19, 1),
35        Among(u"enes", 18, 1),
36        Among(u"ernes", 18, 1),
37        Among(u"eres", 18, 1),
38        Among(u"ens", 16, 1),
39        Among(u"hedens", 24, 1),
40        Among(u"erens", 24, 1),
41        Among(u"ers", 16, 1),
42        Among(u"ets", 16, 1),
43        Among(u"erets", 28, 1),
44        Among(u"et", -1, 1),
45        Among(u"eret", 30, 1)
46    ]
47
48    a_1 = [
49        Among(u"gd", -1, -1),
50        Among(u"dt", -1, -1),
51        Among(u"gt", -1, -1),
52        Among(u"kt", -1, -1)
53    ]
54
55    a_2 = [
56        Among(u"ig", -1, 1),
57        Among(u"lig", 0, 1),
58        Among(u"elig", 1, 1),
59        Among(u"els", -1, 1),
60        Among(u"l\u00F8st", -1, 2)
61    ]
62
63    g_c = [119, 223, 119, 1]
64
65    g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, 128]
66
67    g_s_ending = [239, 254, 42, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16]
68
69    I_x = 0
70    I_p1 = 0
71    S_ch = ""
72
73    def __r_mark_regions(self):
74        self.I_p1 = self.limit
75        v_1 = self.cursor
76        c = self.cursor + 3
77        if c > self.limit:
78            return False
79        self.cursor = c
80        self.I_x = self.cursor
81        self.cursor = v_1
82        if not self.go_out_grouping(DanishStemmer.g_v, 97, 248):
83            return False
84        if not self.go_in_grouping(DanishStemmer.g_v, 97, 248):
85            return False
86        self.cursor += 1
87        self.I_p1 = self.cursor
88        try:
89            if not self.I_p1 < self.I_x:
90                raise lab0()
91            self.I_p1 = self.I_x
92        except lab0: pass
93        return True
94
95    def __r_main_suffix(self):
96        if self.cursor < self.I_p1:
97            return False
98        v_2 = self.limit_backward
99        self.limit_backward = self.I_p1
100        self.ket = self.cursor
101        among_var = self.find_among_b(DanishStemmer.a_0)
102        if among_var == 0:
103            self.limit_backward = v_2
104            return False
105        self.bra = self.cursor
106        self.limit_backward = v_2
107        if among_var == 1:
108            if not self.slice_del():
109                return False
110
111        else:
112            if not self.in_grouping_b(DanishStemmer.g_s_ending, 97, 229):
113                return False
114            if not self.slice_del():
115                return False
116
117        return True
118
119    def __r_consonant_pair(self):
120        v_1 = self.limit - self.cursor
121        if self.cursor < self.I_p1:
122            return False
123        v_3 = self.limit_backward
124        self.limit_backward = self.I_p1
125        self.ket = self.cursor
126        if self.find_among_b(DanishStemmer.a_1) == 0:
127            self.limit_backward = v_3
128            return False
129        self.bra = self.cursor
130        self.limit_backward = v_3
131        self.cursor = self.limit - v_1
132        if self.cursor <= self.limit_backward:
133            return False
134        self.cursor -= 1
135        self.bra = self.cursor
136        if not self.slice_del():
137            return False
138
139        return True
140
141    def __r_other_suffix(self):
142        v_1 = self.limit - self.cursor
143        try:
144            self.ket = self.cursor
145            if not self.eq_s_b(u"st"):
146                raise lab0()
147            self.bra = self.cursor
148            if not self.eq_s_b(u"ig"):
149                raise lab0()
150            if not self.slice_del():
151                return False
152
153        except lab0: pass
154        self.cursor = self.limit - v_1
155        if self.cursor < self.I_p1:
156            return False
157        v_3 = self.limit_backward
158        self.limit_backward = self.I_p1
159        self.ket = self.cursor
160        among_var = self.find_among_b(DanishStemmer.a_2)
161        if among_var == 0:
162            self.limit_backward = v_3
163            return False
164        self.bra = self.cursor
165        self.limit_backward = v_3
166        if among_var == 1:
167            if not self.slice_del():
168                return False
169
170            v_4 = self.limit - self.cursor
171            self.__r_consonant_pair()
172            self.cursor = self.limit - v_4
173        else:
174            if not self.slice_from(u"l\u00F8s"):
175                return False
176        return True
177
178    def __r_undouble(self):
179        if self.cursor < self.I_p1:
180            return False
181        v_2 = self.limit_backward
182        self.limit_backward = self.I_p1
183        self.ket = self.cursor
184        if not self.in_grouping_b(DanishStemmer.g_c, 98, 122):
185            self.limit_backward = v_2
186            return False
187        self.bra = self.cursor
188        self.S_ch = self.slice_to()
189        if self.S_ch == '':
190            return False
191        self.limit_backward = v_2
192        if not self.eq_s_b(self.S_ch):
193            return False
194        if not self.slice_del():
195            return False
196
197        return True
198
199    def _stem(self):
200        v_1 = self.cursor
201        self.__r_mark_regions()
202        self.cursor = v_1
203        self.limit_backward = self.cursor
204        self.cursor = self.limit
205        v_2 = self.limit - self.cursor
206        self.__r_main_suffix()
207        self.cursor = self.limit - v_2
208        v_3 = self.limit - self.cursor
209        self.__r_consonant_pair()
210        self.cursor = self.limit - v_3
211        v_4 = self.limit - self.cursor
212        self.__r_other_suffix()
213        self.cursor = self.limit - v_4
214        v_5 = self.limit - self.cursor
215        self.__r_undouble()
216        self.cursor = self.limit - v_5
217        self.cursor = self.limit_backward
218        return True
219
220
221class lab0(BaseException): pass
222