@delali/narsil-react-native 0.3.1-next.155 → 0.3.1-next.157

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/NOTICE +144 -0
  2. package/NarsilReactNative.podspec +2 -2
  3. package/android/CMakeLists.txt +1 -1
  4. package/cpp/HybridNarsilCoreAnalysis.cpp +277 -0
  5. package/cpp/HybridNarsilCoreImpl.hpp +43 -0
  6. package/cpp/HybridNarsilCoreKeyword.cpp +253 -0
  7. package/cpp/HybridNarsilCoreMath.cpp +47 -0
  8. package/cpp/core/include/narsil_analysis.h +86 -0
  9. package/cpp/core/include/narsil_core.h +1 -1
  10. package/cpp/core/include/narsil_keyword.h +110 -0
  11. package/cpp/core/include/narsil_math.h +36 -0
  12. package/cpp/core/src/analysis/analyse.c +281 -0
  13. package/cpp/core/src/analysis/analyser.h +49 -0
  14. package/cpp/core/src/analysis/languages.c +79 -0
  15. package/cpp/core/src/analysis/languages.h +42 -0
  16. package/cpp/core/src/analysis/normalise.c +242 -0
  17. package/cpp/core/src/analysis/normalise.h +28 -0
  18. package/cpp/core/src/analysis/split.c +183 -0
  19. package/cpp/core/src/analysis/split.h +27 -0
  20. package/cpp/core/src/analysis/stop_words.c +82 -0
  21. package/cpp/core/src/analysis/stop_words.h +19 -0
  22. package/cpp/core/src/analysis/term_cache.c +88 -0
  23. package/cpp/core/src/analysis/term_cache.h +36 -0
  24. package/cpp/core/src/analysis/text.c +161 -0
  25. package/cpp/core/src/analysis/text.h +45 -0
  26. package/cpp/core/src/analysis/transform.c +103 -0
  27. package/cpp/core/src/analysis/unicode.c +252 -0
  28. package/cpp/core/src/analysis/unicode.h +54 -0
  29. package/cpp/core/src/internal.h +4 -0
  30. package/cpp/core/src/keyword/pass.h +117 -0
  31. package/cpp/core/src/keyword/prune.c +324 -0
  32. package/cpp/core/src/keyword/request.c +179 -0
  33. package/cpp/core/src/keyword/rows.c +83 -0
  34. package/cpp/core/src/keyword/rows.h +18 -0
  35. package/cpp/core/src/keyword/score.c +257 -0
  36. package/cpp/core/src/keyword/score.h +17 -0
  37. package/cpp/core/src/keyword/scratch.c +226 -0
  38. package/cpp/core/src/keyword/scratch.h +55 -0
  39. package/cpp/core/src/keyword/select.c +155 -0
  40. package/cpp/core/src/keyword/select.h +17 -0
  41. package/cpp/core/src/languages/bulgarian_stemmer.c +114 -0
  42. package/cpp/core/src/languages/data/albanian.c +54 -0
  43. package/cpp/core/src/languages/data/amharic.c +93 -0
  44. package/cpp/core/src/languages/data/arabic.c +146 -0
  45. package/cpp/core/src/languages/data/armenian.c +46 -0
  46. package/cpp/core/src/languages/data/azerbaijani.c +68 -0
  47. package/cpp/core/src/languages/data/bambara.c +48 -0
  48. package/cpp/core/src/languages/data/basque.c +62 -0
  49. package/cpp/core/src/languages/data/belarusian.c +56 -0
  50. package/cpp/core/src/languages/data/bengali.c +63 -0
  51. package/cpp/core/src/languages/data/bosnian.c +73 -0
  52. package/cpp/core/src/languages/data/breton.c +52 -0
  53. package/cpp/core/src/languages/data/bulgarian.c +144 -0
  54. package/cpp/core/src/languages/data/burmese.c +48 -0
  55. package/cpp/core/src/languages/data/catalan.c +84 -0
  56. package/cpp/core/src/languages/data/chinese.c +70 -0
  57. package/cpp/core/src/languages/data/croatian.c +72 -0
  58. package/cpp/core/src/languages/data/czech.c +72 -0
  59. package/cpp/core/src/languages/data/dagbani.c +88 -0
  60. package/cpp/core/src/languages/data/danish.c +56 -0
  61. package/cpp/core/src/languages/data/declarations.h +114 -0
  62. package/cpp/core/src/languages/data/dutch.c +58 -0
  63. package/cpp/core/src/languages/data/english.c +172 -0
  64. package/cpp/core/src/languages/data/esperanto.c +71 -0
  65. package/cpp/core/src/languages/data/estonian.c +417 -0
  66. package/cpp/core/src/languages/data/ewe.c +89 -0
  67. package/cpp/core/src/languages/data/faroese.c +54 -0
  68. package/cpp/core/src/languages/data/fijian.c +44 -0
  69. package/cpp/core/src/languages/data/finnish.c +100 -0
  70. package/cpp/core/src/languages/data/french.c +74 -0
  71. package/cpp/core/src/languages/data/ga.c +83 -0
  72. package/cpp/core/src/languages/data/galician.c +70 -0
  73. package/cpp/core/src/languages/data/georgian.c +57 -0
  74. package/cpp/core/src/languages/data/german.c +96 -0
  75. package/cpp/core/src/languages/data/greek.c +202 -0
  76. package/cpp/core/src/languages/data/guarani.c +110 -0
  77. package/cpp/core/src/languages/data/gujarati.c +90 -0
  78. package/cpp/core/src/languages/data/haitian-creole.c +54 -0
  79. package/cpp/core/src/languages/data/hausa.c +85 -0
  80. package/cpp/core/src/languages/data/hawaiian.c +50 -0
  81. package/cpp/core/src/languages/data/hebrew.c +85 -0
  82. package/cpp/core/src/languages/data/hindi.c +91 -0
  83. package/cpp/core/src/languages/data/hungarian.c +98 -0
  84. package/cpp/core/src/languages/data/icelandic.c +73 -0
  85. package/cpp/core/src/languages/data/igbo.c +90 -0
  86. package/cpp/core/src/languages/data/indonesian.c +296 -0
  87. package/cpp/core/src/languages/data/irish.c +60 -0
  88. package/cpp/core/src/languages/data/italian.c +107 -0
  89. package/cpp/core/src/languages/data/japanese.c +52 -0
  90. package/cpp/core/src/languages/data/kannada.c +60 -0
  91. package/cpp/core/src/languages/data/kazakh.c +57 -0
  92. package/cpp/core/src/languages/data/khmer.c +71 -0
  93. package/cpp/core/src/languages/data/kinyarwanda.c +54 -0
  94. package/cpp/core/src/languages/data/kirundi.c +53 -0
  95. package/cpp/core/src/languages/data/korean.c +74 -0
  96. package/cpp/core/src/languages/data/kurmanji.c +43 -0
  97. package/cpp/core/src/languages/data/kyrgyz.c +65 -0
  98. package/cpp/core/src/languages/data/lao.c +46 -0
  99. package/cpp/core/src/languages/data/latin.c +46 -0
  100. package/cpp/core/src/languages/data/latvian.c +75 -0
  101. package/cpp/core/src/languages/data/lingala.c +88 -0
  102. package/cpp/core/src/languages/data/lithuanian.c +65 -0
  103. package/cpp/core/src/languages/data/luxembourgish.c +80 -0
  104. package/cpp/core/src/languages/data/macedonian.c +286 -0
  105. package/cpp/core/src/languages/data/malagasy.c +51 -0
  106. package/cpp/core/src/languages/data/malay.c +184 -0
  107. package/cpp/core/src/languages/data/malayalam.c +64 -0
  108. package/cpp/core/src/languages/data/maltese.c +102 -0
  109. package/cpp/core/src/languages/data/maori.c +52 -0
  110. package/cpp/core/src/languages/data/marathi.c +62 -0
  111. package/cpp/core/src/languages/data/nepali.c +72 -0
  112. package/cpp/core/src/languages/data/norwegian.c +74 -0
  113. package/cpp/core/src/languages/data/oromo.c +51 -0
  114. package/cpp/core/src/languages/data/persian.c +150 -0
  115. package/cpp/core/src/languages/data/polish.c +111 -0
  116. package/cpp/core/src/languages/data/portuguese.c +91 -0
  117. package/cpp/core/src/languages/data/punjabi.c +80 -0
  118. package/cpp/core/src/languages/data/registry.c +116 -0
  119. package/cpp/core/src/languages/data/romanian.c +93 -0
  120. package/cpp/core/src/languages/data/russian.c +76 -0
  121. package/cpp/core/src/languages/data/samoan.c +47 -0
  122. package/cpp/core/src/languages/data/sanskrit.c +53 -0
  123. package/cpp/core/src/languages/data/scottish-gaelic.c +119 -0
  124. package/cpp/core/src/languages/data/serbian.c +84 -0
  125. package/cpp/core/src/languages/data/shona.c +55 -0
  126. package/cpp/core/src/languages/data/sinhala.c +78 -0
  127. package/cpp/core/src/languages/data/slovak.c +135 -0
  128. package/cpp/core/src/languages/data/slovenian.c +139 -0
  129. package/cpp/core/src/languages/data/sorani.c +55 -0
  130. package/cpp/core/src/languages/data/spanish.c +84 -0
  131. package/cpp/core/src/languages/data/swahili.c +59 -0
  132. package/cpp/core/src/languages/data/swedish.c +60 -0
  133. package/cpp/core/src/languages/data/tagalog.c +75 -0
  134. package/cpp/core/src/languages/data/tamil.c +69 -0
  135. package/cpp/core/src/languages/data/tatar.c +548 -0
  136. package/cpp/core/src/languages/data/telugu.c +54 -0
  137. package/cpp/core/src/languages/data/thai.c +46 -0
  138. package/cpp/core/src/languages/data/tibetan.c +55 -0
  139. package/cpp/core/src/languages/data/tigrinya.c +73 -0
  140. package/cpp/core/src/languages/data/tongan.c +47 -0
  141. package/cpp/core/src/languages/data/turkish.c +100 -0
  142. package/cpp/core/src/languages/data/twi.c +88 -0
  143. package/cpp/core/src/languages/data/ukrainian.c +99 -0
  144. package/cpp/core/src/languages/data/urdu.c +174 -0
  145. package/cpp/core/src/languages/data/vietnamese.c +88 -0
  146. package/cpp/core/src/languages/data/welsh.c +143 -0
  147. package/cpp/core/src/languages/data/wolof.c +51 -0
  148. package/cpp/core/src/languages/data/xhosa.c +56 -0
  149. package/cpp/core/src/languages/data/yoruba.c +93 -0
  150. package/cpp/core/src/languages/data/zulu.c +58 -0
  151. package/cpp/core/src/languages/marks.c +64 -0
  152. package/cpp/core/src/languages/rules.c +63 -0
  153. package/cpp/core/src/languages/rules.h +68 -0
  154. package/cpp/core/src/languages/sanskrit_stemmer.c +50 -0
  155. package/cpp/core/src/languages/scripts.c +143 -0
  156. package/cpp/core/src/languages/slovenian_stemmer.c +46 -0
  157. package/cpp/core/src/languages/snowball/api.c +52 -0
  158. package/cpp/core/src/languages/snowball/api.h +43 -0
  159. package/cpp/core/src/languages/snowball/arabic_stemmer.c +1506 -0
  160. package/cpp/core/src/languages/snowball/arabic_stemmer.h +24 -0
  161. package/cpp/core/src/languages/snowball/armenian_stemmer.c +523 -0
  162. package/cpp/core/src/languages/snowball/armenian_stemmer.h +24 -0
  163. package/cpp/core/src/languages/snowball/basque_stemmer.c +1089 -0
  164. package/cpp/core/src/languages/snowball/basque_stemmer.h +24 -0
  165. package/cpp/core/src/languages/snowball/catalan_stemmer.c +1380 -0
  166. package/cpp/core/src/languages/snowball/catalan_stemmer.h +24 -0
  167. package/cpp/core/src/languages/snowball/czech_stemmer.c +582 -0
  168. package/cpp/core/src/languages/snowball/czech_stemmer.h +24 -0
  169. package/cpp/core/src/languages/snowball/danish_stemmer.c +352 -0
  170. package/cpp/core/src/languages/snowball/danish_stemmer.h +24 -0
  171. package/cpp/core/src/languages/snowball/dutch_stemmer.c +1657 -0
  172. package/cpp/core/src/languages/snowball/dutch_stemmer.h +24 -0
  173. package/cpp/core/src/languages/snowball/english_stemmer.c +1019 -0
  174. package/cpp/core/src/languages/snowball/english_stemmer.h +24 -0
  175. package/cpp/core/src/languages/snowball/esperanto_stemmer.c +716 -0
  176. package/cpp/core/src/languages/snowball/esperanto_stemmer.h +24 -0
  177. package/cpp/core/src/languages/snowball/estonian_stemmer.c +1361 -0
  178. package/cpp/core/src/languages/snowball/estonian_stemmer.h +24 -0
  179. package/cpp/core/src/languages/snowball/finnish_stemmer.c +800 -0
  180. package/cpp/core/src/languages/snowball/finnish_stemmer.h +24 -0
  181. package/cpp/core/src/languages/snowball/french_stemmer.c +1217 -0
  182. package/cpp/core/src/languages/snowball/french_stemmer.h +24 -0
  183. package/cpp/core/src/languages/snowball/german_stemmer.c +567 -0
  184. package/cpp/core/src/languages/snowball/german_stemmer.h +24 -0
  185. package/cpp/core/src/languages/snowball/greek_stemmer.c +3450 -0
  186. package/cpp/core/src/languages/snowball/greek_stemmer.h +24 -0
  187. package/cpp/core/src/languages/snowball/hindi_stemmer.c +325 -0
  188. package/cpp/core/src/languages/snowball/hindi_stemmer.h +24 -0
  189. package/cpp/core/src/languages/snowball/hungarian_stemmer.c +742 -0
  190. package/cpp/core/src/languages/snowball/hungarian_stemmer.h +24 -0
  191. package/cpp/core/src/languages/snowball/indonesian_stemmer.c +443 -0
  192. package/cpp/core/src/languages/snowball/indonesian_stemmer.h +24 -0
  193. package/cpp/core/src/languages/snowball/irish_stemmer.c +428 -0
  194. package/cpp/core/src/languages/snowball/irish_stemmer.h +24 -0
  195. package/cpp/core/src/languages/snowball/italian_stemmer.c +983 -0
  196. package/cpp/core/src/languages/snowball/italian_stemmer.h +24 -0
  197. package/cpp/core/src/languages/snowball/lithuanian_stemmer.c +794 -0
  198. package/cpp/core/src/languages/snowball/lithuanian_stemmer.h +24 -0
  199. package/cpp/core/src/languages/snowball/nepali_stemmer.c +361 -0
  200. package/cpp/core/src/languages/snowball/nepali_stemmer.h +24 -0
  201. package/cpp/core/src/languages/snowball/norwegian_stemmer.c +332 -0
  202. package/cpp/core/src/languages/snowball/norwegian_stemmer.h +24 -0
  203. package/cpp/core/src/languages/snowball/persian_stemmer.c +538 -0
  204. package/cpp/core/src/languages/snowball/persian_stemmer.h +24 -0
  205. package/cpp/core/src/languages/snowball/polish_stemmer.c +501 -0
  206. package/cpp/core/src/languages/snowball/polish_stemmer.h +24 -0
  207. package/cpp/core/src/languages/snowball/portuguese_stemmer.c +866 -0
  208. package/cpp/core/src/languages/snowball/portuguese_stemmer.h +24 -0
  209. package/cpp/core/src/languages/snowball/romanian_stemmer.c +940 -0
  210. package/cpp/core/src/languages/snowball/romanian_stemmer.h +24 -0
  211. package/cpp/core/src/languages/snowball/russian_stemmer.c +598 -0
  212. package/cpp/core/src/languages/snowball/russian_stemmer.h +24 -0
  213. package/cpp/core/src/languages/snowball/serbian_stemmer.c +6765 -0
  214. package/cpp/core/src/languages/snowball/serbian_stemmer.h +24 -0
  215. package/cpp/core/src/languages/snowball/snowball_runtime.h +122 -0
  216. package/cpp/core/src/languages/snowball/spanish_stemmer.c +955 -0
  217. package/cpp/core/src/languages/snowball/spanish_stemmer.h +24 -0
  218. package/cpp/core/src/languages/snowball/swedish_stemmer.c +364 -0
  219. package/cpp/core/src/languages/snowball/swedish_stemmer.h +24 -0
  220. package/cpp/core/src/languages/snowball/tamil_stemmer.c +1305 -0
  221. package/cpp/core/src/languages/snowball/tamil_stemmer.h +24 -0
  222. package/cpp/core/src/languages/snowball/turkish_stemmer.c +1700 -0
  223. package/cpp/core/src/languages/snowball/turkish_stemmer.h +24 -0
  224. package/cpp/core/src/languages/snowball/utilities.c +716 -0
  225. package/cpp/core/src/languages/substitutions.c +131 -0
  226. package/cpp/core/src/languages/swahili_stemmer.c +85 -0
  227. package/cpp/core/src/languages/ukrainian_stemmer.c +168 -0
  228. package/cpp/core/src/locks.c +2 -15
  229. package/cpp/core/src/math/apply.c +44 -0
  230. package/cpp/core/src/math/fdlibm.h +16 -0
  231. package/cpp/core/src/math/inverse.c +242 -0
  232. package/cpp/core/src/math/log.c +90 -0
  233. package/cpp/core/src/math/reduce.c +325 -0
  234. package/cpp/core/src/math/trig.c +188 -0
  235. package/cpp/core/src/math/words.h +45 -0
  236. package/cpp/core/src/thread_yield.h +18 -0
  237. package/cpp/core/src/unicode/decompositions.c +310 -0
  238. package/cpp/core/src/unicode/lowercase.c +172 -0
  239. package/cpp/core/src/unicode/properties.c +214 -0
  240. package/cpp/core/src/workspace.c +5 -1
  241. package/lib/engine/analysis.d.ts +3 -0
  242. package/lib/engine/analysis.js +76 -0
  243. package/lib/engine/core.js +5 -0
  244. package/lib/engine/keyword.d.ts +3 -0
  245. package/lib/engine/keyword.js +25 -0
  246. package/lib/specs/core.nitro.d.ts +1 -0
  247. package/nitrogen/generated/shared/c++/HybridNarsilCoreSpec.cpp +1 -0
  248. package/nitrogen/generated/shared/c++/HybridNarsilCoreSpec.hpp +1 -0
  249. package/package.json +4 -3
  250. package/src/engine/analysis.ts +87 -0
  251. package/src/engine/core.ts +6 -0
  252. package/src/engine/keyword.ts +26 -0
  253. package/src/specs/core.nitro.ts +1 -0
@@ -0,0 +1,281 @@
1
+ #include "../../include/narsil_analysis.h"
2
+ #include "../../include/narsil_core.h"
3
+ #include "../languages/snowball/api.h"
4
+ #include "analyser.h"
5
+ #include "languages.h"
6
+ #include "normalise.h"
7
+ #include "split.h"
8
+ #include "stop_words.h"
9
+ #include "term_cache.h"
10
+ #include "text.h"
11
+ #include "unicode.h"
12
+
13
+ #include <stddef.h>
14
+ #include <stdint.h>
15
+ #include <stdlib.h>
16
+ #include <string.h>
17
+
18
+ #define APOSTROPHE 0x27U
19
+ #define LATIN_SMALL_S 0x73U
20
+ #define MIN_TOKEN_CAPACITY 32U
21
+
22
+ narsil_status narsil_analyser_create(narsil_analyser **analyser) {
23
+ if (analyser == NULL) { return NARSIL_INVALID_ARGUMENT; }
24
+ *analyser = NULL;
25
+ if (narsil_unicode_prepare() != NARSIL_OK) { return NARSIL_OUT_OF_MEMORY; }
26
+ narsil_analyser *created = calloc(1, sizeof(narsil_analyser));
27
+ if (created == NULL) { return NARSIL_OUT_OF_MEMORY; }
28
+ created->snowball = (struct SN_env **)calloc(narsil_language_table_length, sizeof(struct SN_env *));
29
+ created->default_stop_words = calloc(narsil_language_table_length, sizeof(narsil_stop_words));
30
+ created->default_stop_words_built = calloc(narsil_language_table_length, sizeof(uint8_t));
31
+ if (created->snowball == NULL || created->default_stop_words == NULL || created->default_stop_words_built == NULL) {
32
+ narsil_analyser_destroy(created);
33
+ return NARSIL_OUT_OF_MEMORY;
34
+ }
35
+ *analyser = created;
36
+ return NARSIL_OK;
37
+ }
38
+
39
+ void narsil_analyser_destroy(narsil_analyser *analyser) {
40
+ if (analyser == NULL) { return; }
41
+ for (uint32_t language = 0; language < narsil_language_table_length; language++) {
42
+ if (analyser->snowball != NULL && analyser->snowball[language] != NULL) {
43
+ narsil_language_table[language]->close_snowball(analyser->snowball[language]);
44
+ }
45
+ if (analyser->default_stop_words != NULL) { narsil_stop_words_release(&analyser->default_stop_words[language]); }
46
+ }
47
+ free((void *)analyser->snowball);
48
+ free(analyser->default_stop_words);
49
+ free(analyser->default_stop_words_built);
50
+ narsil_normalise_scratch_release(&analyser->scratch);
51
+ narsil_text_release(&analyser->folded);
52
+ narsil_spans_release(&analyser->parts);
53
+ narsil_spans_release(&analyser->grams);
54
+ narsil_code_points_release(&analyser->gram_offsets);
55
+ narsil_text_release(&analyser->step_a);
56
+ narsil_text_release(&analyser->step_b);
57
+ narsil_text_release(&analyser->surface_step);
58
+ narsil_text_release(&analyser->surface);
59
+ narsil_text_release(&analyser->arena);
60
+ narsil_term_cache_release(&analyser->terms);
61
+ free(analyser->tokens);
62
+ free(analyser);
63
+ }
64
+
65
+ narsil_status narsil_stop_word_set_create(const uint16_t *units, const uint32_t *offsets, uint32_t count,
66
+ narsil_stop_word_set **set) {
67
+ if (set == NULL || offsets == NULL || (units == NULL && offsets[count] > offsets[0])) {
68
+ return NARSIL_INVALID_ARGUMENT;
69
+ }
70
+ *set = NULL;
71
+ narsil_stop_word_set *created = calloc(1, sizeof(narsil_stop_word_set));
72
+ if (created == NULL) { return NARSIL_OUT_OF_MEMORY; }
73
+ int status = narsil_stop_words_build(&created->words, units, offsets, count);
74
+ if (status != NARSIL_OK) {
75
+ free(created);
76
+ return (narsil_status)status;
77
+ }
78
+ *set = created;
79
+ return NARSIL_OK;
80
+ }
81
+
82
+ void narsil_stop_word_set_destroy(narsil_stop_word_set *set) {
83
+ if (set == NULL) { return; }
84
+ narsil_stop_words_release(&set->words);
85
+ free(set);
86
+ }
87
+
88
+ static const narsil_stop_words *stop_words_for(narsil_analyser *analyser, const narsil_analysis_request *request,
89
+ int *status) {
90
+ *status = NARSIL_OK;
91
+ if ((request->flags & NARSIL_ANALYSE_REMOVE_STOP_WORDS) == 0) { return NULL; }
92
+ if (request->stop_words != NULL) { return &request->stop_words->words; }
93
+ uint32_t index = request->language;
94
+ if (!analyser->default_stop_words_built[index]) {
95
+ const narsil_language *language = narsil_language_table[index];
96
+ *status = narsil_stop_words_build(&analyser->default_stop_words[index], language->stop_word_units,
97
+ language->stop_word_offsets, language->stop_word_count);
98
+ if (*status != NARSIL_OK) { return NULL; }
99
+ analyser->default_stop_words_built[index] = 1;
100
+ }
101
+ return &analyser->default_stop_words[index];
102
+ }
103
+
104
+ static narsil_unit_view strip_possessive(narsil_unit_view part) {
105
+ const uint16_t *units = part.units;
106
+ size_t length = part.length;
107
+ if (length >= 2 && units[length - 1] == LATIN_SMALL_S && units[length - 2] == APOSTROPHE) {
108
+ part.length -= 2;
109
+ } else if (length >= 1 && units[length - 1] == APOSTROPHE) {
110
+ part.length -= 1;
111
+ }
112
+ return part;
113
+ }
114
+
115
+ static int append_units(narsil_analyser *analyser, narsil_unit_view view, uint32_t *offset) {
116
+ if (analyser->arena.length + view.length > UINT32_MAX) { return NARSIL_INVALID_ARGUMENT; }
117
+ *offset = (uint32_t)analyser->arena.length;
118
+ int status = narsil_text_append(&analyser->arena, view.units, view.length);
119
+ if (status == NARSIL_OK) { narsil_replace_unpaired_surrogates(analyser->arena.units + *offset, view.length); }
120
+ return status;
121
+ }
122
+
123
+ static int push_token(narsil_analyser *analyser, uint32_t position, narsil_span original, narsil_unit_view term,
124
+ uint32_t term_slot, const narsil_unit_view *surface) {
125
+ if (analyser->token_count == analyser->token_capacity) {
126
+ uint32_t capacity = analyser->token_capacity < MIN_TOKEN_CAPACITY ? MIN_TOKEN_CAPACITY : analyser->token_capacity;
127
+ if (analyser->token_count == capacity) {
128
+ if (capacity > UINT32_MAX / 2) { return NARSIL_OUT_OF_MEMORY; }
129
+ capacity *= 2;
130
+ }
131
+ narsil_token *grown = realloc(analyser->tokens, (size_t)capacity * sizeof(narsil_token));
132
+ if (grown == NULL) { return NARSIL_OUT_OF_MEMORY; }
133
+ analyser->tokens = grown;
134
+ analyser->token_capacity = capacity;
135
+ }
136
+ narsil_token *token = &analyser->tokens[analyser->token_count];
137
+ token->position = position;
138
+ token->original_offset = original.start;
139
+ token->original_length = original.length;
140
+ token->surface_offset = NARSIL_NO_SURFACE;
141
+ token->surface_length = 0;
142
+ token->term_length = (uint32_t)term.length;
143
+ token->term_slot = term_slot;
144
+ int status = append_units(analyser, term, &token->term_offset);
145
+ if (status == NARSIL_OK && surface != NULL) {
146
+ token->surface_length = (uint32_t)surface->length;
147
+ status = append_units(analyser, *surface, &token->surface_offset);
148
+ }
149
+ if (status == NARSIL_OK) { analyser->token_count++; }
150
+ return status;
151
+ }
152
+
153
+ static int validate(const narsil_analyser *analyser, const narsil_analysis_request *request,
154
+ const narsil_tokens *tokens) {
155
+ if (analyser == NULL || request == NULL || tokens == NULL) { return NARSIL_INVALID_ARGUMENT; }
156
+ if (request->language >= narsil_language_table_length) { return NARSIL_INVALID_ARGUMENT; }
157
+ if ((request->flags & ~NARSIL_ANALYSE_FLAGS) != 0 && request->flags != NARSIL_ANALYSE_SPELLINGS) {
158
+ return NARSIL_INVALID_ARGUMENT;
159
+ }
160
+ if (request->length > NARSIL_MAX_ANALYSED_UNITS || (request->text == NULL && request->length > 0)) {
161
+ return NARSIL_INVALID_ARGUMENT;
162
+ }
163
+ return NARSIL_OK;
164
+ }
165
+
166
+ typedef struct {
167
+ const narsil_language *language;
168
+ uint32_t language_index;
169
+ const narsil_stop_words *stop_words;
170
+ uint32_t flags;
171
+ } analysis_pass;
172
+
173
+ static int push_spelling(narsil_analyser *analyser, const analysis_pass *pass, uint32_t position, narsil_span part,
174
+ narsil_unit_view candidate) {
175
+ narsil_unit_view spelling = candidate;
176
+ uint32_t term_slot = NARSIL_NO_TERM_SLOT;
177
+ if (pass->language->normalises_diacritics) {
178
+ int status = narsil_transform_token(analyser, pass->language, pass->language_index, candidate,
179
+ NARSIL_ANALYSE_REMOVE_DIACRITICS, &spelling, &term_slot);
180
+ if (status != NARSIL_OK) { return status; }
181
+ }
182
+ return push_token(analyser, position, part, spelling, term_slot, NULL);
183
+ }
184
+
185
+ static int analyse_part(narsil_analyser *analyser, const analysis_pass *pass, uint32_t position, narsil_span part) {
186
+ const narsil_language *language = pass->language;
187
+ narsil_unit_view candidate = {analyser->folded.units + part.start, part.length};
188
+ if (language->strips_possessive) { candidate = strip_possessive(candidate); }
189
+ if (candidate.length < language->min_token_length) { return NARSIL_OK; }
190
+ if ((pass->flags & NARSIL_ANALYSE_SPELLINGS) != 0) {
191
+ return push_spelling(analyser, pass, position, part, candidate);
192
+ }
193
+ if (pass->stop_words != NULL && narsil_stop_words_contains(pass->stop_words, candidate.units, candidate.length)) {
194
+ return NARSIL_OK;
195
+ }
196
+ narsil_unit_view term;
197
+ uint32_t term_slot = NARSIL_NO_TERM_SLOT;
198
+ int status =
199
+ narsil_transform_token(analyser, language, pass->language_index, candidate, pass->flags, &term, &term_slot);
200
+ if (status != NARSIL_OK || term.length == 0) { return status; }
201
+ int stems =
202
+ (pass->flags & NARSIL_ANALYSE_STEM) != 0 && (language->stem_by_rules != NULL || language->snowball_stem != NULL);
203
+ if ((pass->flags & NARSIL_ANALYSE_COLLECT_SURFACES) == 0 || !stems) {
204
+ return push_token(analyser, position, part, term, term_slot, NULL);
205
+ }
206
+ narsil_unit_view surface = candidate;
207
+ if ((pass->flags & NARSIL_ANALYSE_REMOVE_DIACRITICS) != 0) {
208
+ status = narsil_surface_of(analyser, language, candidate, &surface);
209
+ if (status != NARSIL_OK) { return status; }
210
+ }
211
+ int same = narsil_units_equal(surface.units, surface.length, term.units, term.length);
212
+ return push_token(analyser, position, part, term, term_slot, same ? NULL : &surface);
213
+ }
214
+
215
+ static int split_text(narsil_analyser *analyser, const narsil_language *language, const narsil_spans **parts) {
216
+ int status = narsil_split(language, analyser->folded.units, (uint32_t)analyser->folded.length, &analyser->parts);
217
+ *parts = &analyser->parts;
218
+ if (status != NARSIL_OK || language->ngram_size < 1) { return status; }
219
+ analyser->grams.length = 0;
220
+ for (size_t i = 0; i < analyser->parts.length && status == NARSIL_OK; i++) {
221
+ status = narsil_expand_ngrams(analyser->folded.units, analyser->parts.spans[i], language->ngram_size,
222
+ &analyser->grams, &analyser->gram_offsets);
223
+ }
224
+ *parts = &analyser->grams;
225
+ return status;
226
+ }
227
+
228
+ narsil_status narsil_transform(narsil_analyser *analyser, const narsil_analysis_request *request, narsil_term *term) {
229
+ if (analyser == NULL || request == NULL || term == NULL) { return NARSIL_INVALID_ARGUMENT; }
230
+ if (request->language >= narsil_language_table_length || (request->flags & ~NARSIL_TRANSFORM_FLAGS) != 0) {
231
+ return NARSIL_INVALID_ARGUMENT;
232
+ }
233
+ if (request->length > NARSIL_MAX_ANALYSED_UNITS || (request->text == NULL && request->length > 0)) {
234
+ return NARSIL_INVALID_ARGUMENT;
235
+ }
236
+ static const uint16_t no_units[1] = {0};
237
+ narsil_unit_view candidate = {request->length == 0 ? no_units : request->text, request->length};
238
+ narsil_unit_view result = candidate;
239
+ uint32_t term_slot = NARSIL_NO_TERM_SLOT;
240
+ int status = narsil_transform_token(analyser, narsil_language_table[request->language], request->language, candidate,
241
+ request->flags, &result, &term_slot);
242
+ if (status != NARSIL_OK) { return (narsil_status)status; }
243
+ if (result.length > NARSIL_MAX_ANALYSED_UNITS) { return NARSIL_INVALID_ARGUMENT; }
244
+ term->units = result.units;
245
+ term->length = (uint32_t)result.length;
246
+ return NARSIL_OK;
247
+ }
248
+
249
+ narsil_status narsil_analyse(narsil_analyser *analyser, const narsil_analysis_request *request, narsil_tokens *tokens) {
250
+ int status = validate(analyser, request, tokens);
251
+ if (status != NARSIL_OK) { return (narsil_status)status; }
252
+ const narsil_language *language = narsil_language_table[request->language];
253
+ analyser->token_count = 0;
254
+ analyser->arena.length = 0;
255
+ memset(tokens, 0, sizeof(*tokens));
256
+ status = narsil_text_reserve(&analyser->folded, 1);
257
+ if (status == NARSIL_OK) { status = narsil_text_reserve(&analyser->arena, 1); }
258
+ if (status != NARSIL_OK) { return (narsil_status)status; }
259
+ status = narsil_fold_for_splitting(request->text, request->length, &analyser->folded, &analyser->scratch);
260
+ if (status == NARSIL_OK && analyser->folded.length > NARSIL_MAX_ANALYSED_UNITS) { status = NARSIL_INVALID_ARGUMENT; }
261
+ if (status == NARSIL_OK) {
262
+ status = narsil_text_assign(&analyser->arena, analyser->folded.units, analyser->folded.length);
263
+ }
264
+ const narsil_spans *parts = NULL;
265
+ if (status == NARSIL_OK) { status = split_text(analyser, language, &parts); }
266
+ analysis_pass pass = {language, request->language, NULL, request->flags};
267
+ if (status == NARSIL_OK) { pass.stop_words = stop_words_for(analyser, request, &status); }
268
+ if (language->normalises_diacritics) { pass.flags |= NARSIL_ANALYSE_REMOVE_DIACRITICS; }
269
+ for (size_t position = 0; status == NARSIL_OK && parts != NULL && position < parts->length; position++) {
270
+ status = analyse_part(analyser, &pass, (uint32_t)position, parts->spans[position]);
271
+ }
272
+ if (status != NARSIL_OK) {
273
+ analyser->token_count = 0;
274
+ return (narsil_status)status;
275
+ }
276
+ tokens->tokens = analyser->tokens;
277
+ tokens->token_count = analyser->token_count;
278
+ tokens->units = analyser->arena.units;
279
+ tokens->unit_count = (uint32_t)analyser->arena.length;
280
+ return NARSIL_OK;
281
+ }
@@ -0,0 +1,49 @@
1
+ #ifndef NARSIL_ANALYSIS_ANALYSER_H
2
+ #define NARSIL_ANALYSIS_ANALYSER_H
3
+
4
+ #include "../../include/narsil_analysis.h"
5
+ #include "languages.h"
6
+ #include "normalise.h"
7
+ #include "split.h"
8
+ #include "stop_words.h"
9
+ #include "term_cache.h"
10
+ #include "text.h"
11
+
12
+ #include <stddef.h>
13
+ #include <stdint.h>
14
+
15
+ struct narsil_stop_word_set {
16
+ narsil_stop_words words;
17
+ };
18
+
19
+ typedef struct {
20
+ const uint16_t *units;
21
+ size_t length;
22
+ } narsil_unit_view;
23
+
24
+ struct narsil_analyser {
25
+ narsil_normalise_scratch scratch;
26
+ narsil_text folded;
27
+ narsil_spans parts;
28
+ narsil_spans grams;
29
+ narsil_code_points gram_offsets;
30
+ narsil_text step_a;
31
+ narsil_text step_b;
32
+ narsil_text surface_step;
33
+ narsil_text surface;
34
+ narsil_text arena;
35
+ narsil_token *tokens;
36
+ uint32_t token_count;
37
+ uint32_t token_capacity;
38
+ struct SN_env **snowball;
39
+ narsil_stop_words *default_stop_words;
40
+ uint8_t *default_stop_words_built;
41
+ narsil_term_cache terms;
42
+ };
43
+
44
+ int narsil_transform_token(narsil_analyser *analyser, const narsil_language *language, uint32_t language_index,
45
+ narsil_unit_view candidate, uint32_t flags, narsil_unit_view *result, uint32_t *term_slot);
46
+ int narsil_surface_of(narsil_analyser *analyser, const narsil_language *language, narsil_unit_view candidate,
47
+ narsil_unit_view *result);
48
+
49
+ #endif
@@ -0,0 +1,79 @@
1
+ #include "languages.h"
2
+
3
+ #include "../../include/narsil_analysis.h"
4
+ #include "../../include/narsil_core.h"
5
+ #include "text.h"
6
+
7
+ #include <stddef.h>
8
+ #include <stdint.h>
9
+ #include <string.h>
10
+
11
+ #define ASCII_KEEP_WORD_BITS 64U
12
+ #define KEEP_RANGE_STRIDE 2U
13
+
14
+ static int compare_name(const char *candidate, const char *name, size_t length) {
15
+ size_t candidate_length = strlen(candidate);
16
+ size_t shared = candidate_length < length ? candidate_length : length;
17
+ int order = memcmp(candidate, name, shared);
18
+ if (order != 0) { return order; }
19
+ return (candidate_length > length) - (candidate_length < length);
20
+ }
21
+
22
+ narsil_status narsil_language_lookup(const char *name, size_t length, uint32_t *language) {
23
+ if (name == NULL || language == NULL) { return NARSIL_INVALID_ARGUMENT; }
24
+ uint32_t low = 0;
25
+ uint32_t high = narsil_language_table_length;
26
+ while (low < high) {
27
+ uint32_t middle = low + ((high - low) / 2);
28
+ int order = compare_name(narsil_language_table[middle]->name, name, length);
29
+ if (order == 0) {
30
+ *language = middle;
31
+ return NARSIL_OK;
32
+ }
33
+ if (order < 0) {
34
+ low = middle + 1;
35
+ } else {
36
+ high = middle;
37
+ }
38
+ }
39
+ return NARSIL_INVALID_ARGUMENT;
40
+ }
41
+
42
+ uint32_t narsil_language_count(void) { return narsil_language_table_length; }
43
+
44
+ const char *narsil_language_name(uint32_t language) {
45
+ return language < narsil_language_table_length ? narsil_language_table[language]->name : NULL;
46
+ }
47
+
48
+ const char *narsil_language_revision(uint32_t language) {
49
+ return language < narsil_language_table_length ? narsil_language_table[language]->revision : NULL;
50
+ }
51
+
52
+ narsil_status narsil_language_stop_words(uint32_t language, narsil_word_list *words) {
53
+ if (words == NULL || language >= narsil_language_table_length) { return NARSIL_INVALID_ARGUMENT; }
54
+ const narsil_language *module = narsil_language_table[language];
55
+ words->units = module->stop_word_units;
56
+ words->offsets = module->stop_word_offsets;
57
+ words->count = module->stop_word_count;
58
+ return NARSIL_OK;
59
+ }
60
+
61
+ int narsil_language_keeps(const narsil_language *language, uint32_t code_point) {
62
+ if (code_point < NARSIL_ASCII_END) {
63
+ return (int)((language->ascii_keep[code_point / ASCII_KEEP_WORD_BITS] >> (code_point % ASCII_KEEP_WORD_BITS)) & 1U);
64
+ }
65
+ uint32_t low = 0;
66
+ uint32_t high = language->keep_range_count;
67
+ while (low < high) {
68
+ uint32_t middle = low + ((high - low) / 2);
69
+ const uint32_t *range = &language->keep_ranges[(size_t)middle * KEEP_RANGE_STRIDE];
70
+ if (code_point < range[0]) {
71
+ high = middle;
72
+ } else if (code_point > range[1]) {
73
+ low = middle + 1;
74
+ } else {
75
+ return 1;
76
+ }
77
+ }
78
+ return 0;
79
+ }
@@ -0,0 +1,42 @@
1
+ #ifndef NARSIL_ANALYSIS_LANGUAGES_H
2
+ #define NARSIL_ANALYSIS_LANGUAGES_H
3
+
4
+ #include "../languages/snowball/api.h"
5
+ #include "normalise.h"
6
+ #include "text.h"
7
+
8
+ #include <stddef.h>
9
+ #include <stdint.h>
10
+
11
+ #define NARSIL_ASCII_KEEP_WORDS 2
12
+
13
+ typedef int (*narsil_token_rewrite)(const uint16_t *units, size_t length, narsil_text *out,
14
+ narsil_normalise_scratch *scratch);
15
+
16
+ typedef struct {
17
+ const char *name;
18
+ const char *revision;
19
+ const uint16_t *stop_word_units;
20
+ const uint32_t *stop_word_offsets;
21
+ uint32_t stop_word_count;
22
+ uint64_t ascii_keep[NARSIL_ASCII_KEEP_WORDS];
23
+ const uint32_t *keep_ranges;
24
+ uint32_t keep_range_count;
25
+ uint8_t splits_code_points;
26
+ uint8_t strips_possessive;
27
+ uint8_t normalises_diacritics;
28
+ uint32_t min_token_length;
29
+ uint32_t ngram_size;
30
+ narsil_token_rewrite normalise;
31
+ narsil_token_rewrite stem_by_rules;
32
+ struct SN_env *(*create_snowball)(void);
33
+ int (*snowball_stem)(struct SN_env *env);
34
+ void (*close_snowball)(struct SN_env *env);
35
+ } narsil_language;
36
+
37
+ extern const narsil_language *const narsil_language_table[];
38
+ extern const uint32_t narsil_language_table_length;
39
+
40
+ int narsil_language_keeps(const narsil_language *language, uint32_t code_point);
41
+
42
+ #endif