1"""
2    sphinx.search.fi
3    ~~~~~~~~~~~~~~~~
4
5    Finnish search language: includes the JS Finnish stemmer.
6
7    :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
8    :license: BSD, see LICENSE for details.
9"""
10
11from typing import Dict
12
13import snowballstemmer
14
15from sphinx.search import SearchLanguage, parse_stop_word
16
17finnish_stopwords = parse_stop_word('''
18| source: http://snowball.tartarus.org/algorithms/finnish/stop.txt
19| forms of BE
20
21olla
22olen
23olet
24on
25olemme
26olette
27ovat
28ole        | negative form
29
30oli
31olisi
32olisit
33olisin
34olisimme
35olisitte
36olisivat
37olit
38olin
39olimme
40olitte
41olivat
42ollut
43olleet
44
45en         | negation
46et
47ei
48emme
49ette
50eivät
51
52|Nom   Gen    Acc    Part   Iness   Elat    Illat  Adess   Ablat   Allat   Ess    Trans
53minä   minun  minut  minua  minussa minusta minuun minulla minulta minulle               | I
54sinä   sinun  sinut  sinua  sinussa sinusta sinuun sinulla sinulta sinulle               | you
55hän    hänen  hänet  häntä  hänessä hänestä häneen hänellä häneltä hänelle               | he she
56me     meidän meidät meitä  meissä  meistä  meihin meillä  meiltä  meille                | we
57te     teidän teidät teitä  teissä  teistä  teihin teillä  teiltä  teille                | you
58he     heidän heidät heitä  heissä  heistä  heihin heillä  heiltä  heille                | they
59
60tämä   tämän         tätä   tässä   tästä   tähän  tällä   tältä   tälle   tänä   täksi  | this
61tuo    tuon          tuota  tuossa  tuosta  tuohon tuolla  tuolta  tuolle  tuona  tuoksi | that
62se     sen           sitä   siinä   siitä   siihen sillä   siltä   sille   sinä   siksi  | it
63nämä   näiden        näitä  näissä  näistä  näihin näillä  näiltä  näille  näinä  näiksi | these
64nuo    noiden        noita  noissa  noista  noihin noilla  noilta  noille  noina  noiksi | those
65ne     niiden        niitä  niissä  niistä  niihin niillä  niiltä  niille  niinä  niiksi | they
66
67kuka   kenen kenet   ketä   kenessä kenestä keneen kenellä keneltä kenelle kenenä keneksi| who
68ketkä  keiden ketkä  keitä  keissä  keistä  keihin keillä  keiltä  keille  keinä  keiksi | (pl)
69mikä   minkä minkä   mitä   missä   mistä   mihin  millä   miltä   mille   minä   miksi  | which what
70mitkä                                                                                    | (pl)
71
72joka   jonka         jota   jossa   josta   johon  jolla   jolta   jolle   jona   joksi  | who which
73jotka  joiden        joita  joissa  joista  joihin joilla  joilta  joille  joina  joiksi | (pl)
74
75| conjunctions
76
77että   | that
78ja     | and
79jos    | if
80koska  | because
81kuin   | than
82mutta  | but
83niin   | so
84sekä   | and
85sillä  | for
86tai    | or
87vaan   | but
88vai    | or
89vaikka | although
90
91
92| prepositions
93
94kanssa  | with
95mukaan  | according to
96noin    | about
97poikki  | across
98yli     | over, across
99
100| other
101
102kun    | when
103niin   | so
104nyt    | now
105itse   | self
106''')
107
108
109class SearchFinnish(SearchLanguage):
110    lang = 'fi'
111    language_name = 'Finnish'
112    js_stemmer_rawcode = 'finnish-stemmer.js'
113    stopwords = finnish_stopwords
114
115    def init(self, options: Dict) -> None:
116        self.stemmer = snowballstemmer.stemmer('finnish')
117
118    def stem(self, word: str) -> str:
119        return self.stemmer.stemWord(word.lower())
120