1# Generated by Snowball 2.2.0 - https://snowballstem.org/
2
3from .basestemmer import BaseStemmer
4from .among import Among
5
6
7class SwedishStemmer(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"a", -1, 1),
15        Among(u"arna", 0, 1),
16        Among(u"erna", 0, 1),
17        Among(u"heterna", 2, 1),
18        Among(u"orna", 0, 1),
19        Among(u"ad", -1, 1),
20        Among(u"e", -1, 1),
21        Among(u"ade", 6, 1),
22        Among(u"ande", 6, 1),
23        Among(u"arne", 6, 1),
24        Among(u"are", 6, 1),
25        Among(u"aste", 6, 1),
26        Among(u"en", -1, 1),
27        Among(u"anden", 12, 1),
28        Among(u"aren", 12, 1),
29        Among(u"heten", 12, 1),
30        Among(u"ern", -1, 1),
31        Among(u"ar", -1, 1),
32        Among(u"er", -1, 1),
33        Among(u"heter", 18, 1),
34        Among(u"or", -1, 1),
35        Among(u"s", -1, 2),
36        Among(u"as", 21, 1),
37        Among(u"arnas", 22, 1),
38        Among(u"ernas", 22, 1),
39        Among(u"ornas", 22, 1),
40        Among(u"es", 21, 1),
41        Among(u"ades", 26, 1),
42        Among(u"andes", 26, 1),
43        Among(u"ens", 21, 1),
44        Among(u"arens", 29, 1),
45        Among(u"hetens", 29, 1),
46        Among(u"erns", 21, 1),
47        Among(u"at", -1, 1),
48        Among(u"andet", -1, 1),
49        Among(u"het", -1, 1),
50        Among(u"ast", -1, 1)
51    ]
52
53    a_1 = [
54        Among(u"dd", -1, -1),
55        Among(u"gd", -1, -1),
56        Among(u"nn", -1, -1),
57        Among(u"dt", -1, -1),
58        Among(u"gt", -1, -1),
59        Among(u"kt", -1, -1),
60        Among(u"tt", -1, -1)
61    ]
62
63    a_2 = [
64        Among(u"ig", -1, 1),
65        Among(u"lig", 0, 1),
66        Among(u"els", -1, 1),
67        Among(u"fullt", -1, 3),
68        Among(u"l\u00F6st", -1, 2)
69    ]
70
71    g_v = [17, 65, 16, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 32]
72
73    g_s_ending = [119, 127, 149]
74
75    I_x = 0
76    I_p1 = 0
77
78    def __r_mark_regions(self):
79        self.I_p1 = self.limit
80        v_1 = self.cursor
81        c = self.cursor + 3
82        if c > self.limit:
83            return False
84        self.cursor = c
85        self.I_x = self.cursor
86        self.cursor = v_1
87        if not self.go_out_grouping(SwedishStemmer.g_v, 97, 246):
88            return False
89        if not self.go_in_grouping(SwedishStemmer.g_v, 97, 246):
90            return False
91        self.cursor += 1
92        self.I_p1 = self.cursor
93        try:
94            if not self.I_p1 < self.I_x:
95                raise lab0()
96            self.I_p1 = self.I_x
97        except lab0: pass
98        return True
99
100    def __r_main_suffix(self):
101        if self.cursor < self.I_p1:
102            return False
103        v_2 = self.limit_backward
104        self.limit_backward = self.I_p1
105        self.ket = self.cursor
106        among_var = self.find_among_b(SwedishStemmer.a_0)
107        if among_var == 0:
108            self.limit_backward = v_2
109            return False
110        self.bra = self.cursor
111        self.limit_backward = v_2
112        if among_var == 1:
113            if not self.slice_del():
114                return False
115
116        else:
117            if not self.in_grouping_b(SwedishStemmer.g_s_ending, 98, 121):
118                return False
119            if not self.slice_del():
120                return False
121
122        return True
123
124    def __r_consonant_pair(self):
125        if self.cursor < self.I_p1:
126            return False
127        v_2 = self.limit_backward
128        self.limit_backward = self.I_p1
129        v_3 = self.limit - self.cursor
130        if self.find_among_b(SwedishStemmer.a_1) == 0:
131            self.limit_backward = v_2
132            return False
133        self.cursor = self.limit - v_3
134        self.ket = self.cursor
135        if self.cursor <= self.limit_backward:
136            self.limit_backward = v_2
137            return False
138        self.cursor -= 1
139        self.bra = self.cursor
140        if not self.slice_del():
141            return False
142
143        self.limit_backward = v_2
144        return True
145
146    def __r_other_suffix(self):
147        if self.cursor < self.I_p1:
148            return False
149        v_2 = self.limit_backward
150        self.limit_backward = self.I_p1
151        self.ket = self.cursor
152        among_var = self.find_among_b(SwedishStemmer.a_2)
153        if among_var == 0:
154            self.limit_backward = v_2
155            return False
156        self.bra = self.cursor
157        if among_var == 1:
158            if not self.slice_del():
159                return False
160
161        elif among_var == 2:
162            if not self.slice_from(u"l\u00F6s"):
163                return False
164        else:
165            if not self.slice_from(u"full"):
166                return False
167        self.limit_backward = v_2
168        return True
169
170    def _stem(self):
171        v_1 = self.cursor
172        self.__r_mark_regions()
173        self.cursor = v_1
174        self.limit_backward = self.cursor
175        self.cursor = self.limit
176        v_2 = self.limit - self.cursor
177        self.__r_main_suffix()
178        self.cursor = self.limit - v_2
179        v_3 = self.limit - self.cursor
180        self.__r_consonant_pair()
181        self.cursor = self.limit - v_3
182        v_4 = self.limit - self.cursor
183        self.__r_other_suffix()
184        self.cursor = self.limit - v_4
185        self.cursor = self.limit_backward
186        return True
187
188
189class lab0(BaseException): pass
190