cry-search 2.1.0 → 2.2.0
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.
- package/CLAUDE.md +26 -0
- package/README.md +26 -0
- package/dist/common/numeric/matchMany.d.ts +9 -11
- package/dist/common/numeric/matchMany.d.ts.map +1 -1
- package/dist/index.cjs +78 -66
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +78 -66
- package/dist/vet/data/prevodi.d.ts +64 -0
- package/dist/vet/data/prevodi.d.ts.map +1 -0
- package/dist/vet/index.cjs +718 -121
- package/dist/vet/index.d.cts +3 -2
- package/dist/vet/index.d.ts +3 -2
- package/dist/vet/index.d.ts.map +1 -1
- package/dist/vet/index.js +718 -121
- package/dist/vet/normalizatorji.d.ts +45 -3
- package/dist/vet/normalizatorji.d.ts.map +1 -1
- package/dist/vet/ocena.d.ts +2 -0
- package/dist/vet/ocena.d.ts.map +1 -1
- package/dist/vet/uparjanje.d.ts +15 -0
- package/dist/vet/uparjanje.d.ts.map +1 -1
- package/package.json +3 -2
package/dist/vet/index.js
CHANGED
|
@@ -177,6 +177,369 @@ dodajVrsto("jelen", ["jelena", "jeleni", "jelenov", "jelenjad"]);
|
|
|
177
177
|
dodajVrsto("srna", ["srne", "srni", "srn", "srnjak", "srnjaka", "srnjaki"]);
|
|
178
178
|
dodajVrsto("divjad", ["divjadi", "divjadjo"]);
|
|
179
179
|
|
|
180
|
+
// src/vet/data/prevodi.ts
|
|
181
|
+
var PREVODI = {
|
|
182
|
+
dog: "pes",
|
|
183
|
+
dogs: "pes",
|
|
184
|
+
pse: "pes",
|
|
185
|
+
puppy: "mladič",
|
|
186
|
+
puppies: "mladič",
|
|
187
|
+
cat: "mačka",
|
|
188
|
+
cats: "mačka",
|
|
189
|
+
kitten: "mladič",
|
|
190
|
+
kittens: "mladič",
|
|
191
|
+
rabbit: "zajec",
|
|
192
|
+
bunny: "zajec",
|
|
193
|
+
chicken: "piščanec",
|
|
194
|
+
chick: "piščanec",
|
|
195
|
+
hen: "kokoš",
|
|
196
|
+
turkey: "puran",
|
|
197
|
+
duck: "raca",
|
|
198
|
+
goose: "gos",
|
|
199
|
+
quail: "prepelica",
|
|
200
|
+
pheasant: "fazan",
|
|
201
|
+
beef: "govedina",
|
|
202
|
+
veal: "teletina",
|
|
203
|
+
pork: "svinjina",
|
|
204
|
+
lamb: "jagnjetina",
|
|
205
|
+
mutton: "jagnjetina",
|
|
206
|
+
sheep: "ovca",
|
|
207
|
+
goat: "koza",
|
|
208
|
+
horse: "konj",
|
|
209
|
+
buffalo: "bivol",
|
|
210
|
+
bison: "bizon",
|
|
211
|
+
venison: "divjačina",
|
|
212
|
+
boar: "divji prašič",
|
|
213
|
+
salmon: "losos",
|
|
214
|
+
trout: "postrv",
|
|
215
|
+
cod: "polenovka",
|
|
216
|
+
codfish: "polenovka",
|
|
217
|
+
hake: "oslič",
|
|
218
|
+
herring: "sled",
|
|
219
|
+
sardine: "sardela",
|
|
220
|
+
anchovy: "inčun",
|
|
221
|
+
mackerel: "skuša",
|
|
222
|
+
shrimp: "rakci",
|
|
223
|
+
prawn: "rakci",
|
|
224
|
+
krill: "kril",
|
|
225
|
+
crab: "rakovice",
|
|
226
|
+
lobster: "jastog",
|
|
227
|
+
squid: "lignji",
|
|
228
|
+
octopus: "hobotnica",
|
|
229
|
+
clam: "skoljke",
|
|
230
|
+
mussel: "skoljke",
|
|
231
|
+
egg: "jajce",
|
|
232
|
+
eggs: "jajce",
|
|
233
|
+
milk: "mleko",
|
|
234
|
+
cheese: "sir",
|
|
235
|
+
yogurt: "jogurt",
|
|
236
|
+
insect: "žuželke",
|
|
237
|
+
fish: "riba",
|
|
238
|
+
salmonoil: "ribje olje",
|
|
239
|
+
rice: "riž",
|
|
240
|
+
potato: "krompir",
|
|
241
|
+
potatoes: "krompir",
|
|
242
|
+
potatoe: "krompir",
|
|
243
|
+
grain: "žita",
|
|
244
|
+
grains: "žita",
|
|
245
|
+
wheat: "pšenica",
|
|
246
|
+
corn: "koruza",
|
|
247
|
+
maize: "koruza",
|
|
248
|
+
oat: "oves",
|
|
249
|
+
oats: "oves",
|
|
250
|
+
barley: "ječmen",
|
|
251
|
+
rye: "rž",
|
|
252
|
+
spelt: "pira",
|
|
253
|
+
spelled: "pira",
|
|
254
|
+
millet: "proso",
|
|
255
|
+
sorghum: "sirek",
|
|
256
|
+
quinoa: "kvinoja",
|
|
257
|
+
buckwheat: "ajda",
|
|
258
|
+
pea: "grah",
|
|
259
|
+
peas: "grah",
|
|
260
|
+
chickpea: "čiček",
|
|
261
|
+
lentil: "leča",
|
|
262
|
+
bean: "fižol",
|
|
263
|
+
beans: "fižol",
|
|
264
|
+
carrot: "korenje",
|
|
265
|
+
carrots: "korenje",
|
|
266
|
+
spinach: "špinača",
|
|
267
|
+
broccoli: "brokoli",
|
|
268
|
+
tomato: "paradižnik",
|
|
269
|
+
tomatoes: "paradižnik",
|
|
270
|
+
beet: "pesa",
|
|
271
|
+
beetroot: "pesa",
|
|
272
|
+
pumpkin: "buča",
|
|
273
|
+
courgette: "bučke",
|
|
274
|
+
zucchini: "bučke",
|
|
275
|
+
kale: "ohrovt",
|
|
276
|
+
cabbage: "zelje",
|
|
277
|
+
apple: "jabolko",
|
|
278
|
+
apples: "jabolko",
|
|
279
|
+
pomegranate: "granatno jabolko",
|
|
280
|
+
pomeg: "granatno jabolko",
|
|
281
|
+
orange: "pomaranča",
|
|
282
|
+
lemon: "limona",
|
|
283
|
+
pear: "hruška",
|
|
284
|
+
blueberry: "borovnica",
|
|
285
|
+
blueberries: "borovnica",
|
|
286
|
+
cranberry: "brusnica",
|
|
287
|
+
cranberries: "brusnica",
|
|
288
|
+
raspberry: "malina",
|
|
289
|
+
strawberry: "jagoda",
|
|
290
|
+
blackberry: "robida",
|
|
291
|
+
cherry: "češnja",
|
|
292
|
+
apricot: "marelica",
|
|
293
|
+
peach: "breskev",
|
|
294
|
+
pineapple: "ananas",
|
|
295
|
+
papaya: "papaja",
|
|
296
|
+
kiwi: "kivi",
|
|
297
|
+
melon: "melona",
|
|
298
|
+
melons: "melona",
|
|
299
|
+
watermelon: "lubenica",
|
|
300
|
+
cantaloupe: "melona",
|
|
301
|
+
coconut: "kokoš",
|
|
302
|
+
almond: "mandelj",
|
|
303
|
+
walnuts: "oreski",
|
|
304
|
+
peanut: "arašid",
|
|
305
|
+
seaweed: "alge",
|
|
306
|
+
kelp: "alge",
|
|
307
|
+
yucca: "juka",
|
|
308
|
+
alfalfa: "lucerna",
|
|
309
|
+
mint: "meta",
|
|
310
|
+
chamomile: "kamilica",
|
|
311
|
+
fennel: "komarček",
|
|
312
|
+
parsley: "peteršilj",
|
|
313
|
+
garlic: "česen",
|
|
314
|
+
flaxseed: "laneno seme",
|
|
315
|
+
flax: "lan",
|
|
316
|
+
sesame: "sezam",
|
|
317
|
+
sunflower: "sončnice",
|
|
318
|
+
herbal: "zeleni",
|
|
319
|
+
tablet: "tbl",
|
|
320
|
+
tablets: "tbl",
|
|
321
|
+
capsule: "kps",
|
|
322
|
+
capsules: "kps",
|
|
323
|
+
injection: "inj",
|
|
324
|
+
injections: "inj",
|
|
325
|
+
suspension: "suspenzija",
|
|
326
|
+
solution: "raztopina",
|
|
327
|
+
powder: "prašek",
|
|
328
|
+
granulate: "granulat",
|
|
329
|
+
granules: "granulat",
|
|
330
|
+
drops: "kapljice",
|
|
331
|
+
shampoo: "šampon",
|
|
332
|
+
conditioner: "balzam",
|
|
333
|
+
paste: "pasta",
|
|
334
|
+
pate: "pašteta",
|
|
335
|
+
syrup: "sirup",
|
|
336
|
+
spray: "sprej",
|
|
337
|
+
pipette: "pipeta",
|
|
338
|
+
ampoule: "ampula",
|
|
339
|
+
vial: "viala",
|
|
340
|
+
sachet: "vrecka",
|
|
341
|
+
pouch: "vrecka",
|
|
342
|
+
can: "konzerva",
|
|
343
|
+
cans: "konzerva",
|
|
344
|
+
tin: "konzerva",
|
|
345
|
+
bag: "vrecka",
|
|
346
|
+
tube: "tuba",
|
|
347
|
+
bottle: "steklenička",
|
|
348
|
+
jar: "kozarec",
|
|
349
|
+
collar: "ovratnica",
|
|
350
|
+
harness: "ovratnica",
|
|
351
|
+
leash: "povodec",
|
|
352
|
+
lead: "povodec",
|
|
353
|
+
muzzle: "nagobcnik",
|
|
354
|
+
toy: "igraca",
|
|
355
|
+
toys: "igraca",
|
|
356
|
+
brush: "krtača",
|
|
357
|
+
comb: "glavnik",
|
|
358
|
+
clipper: "škarje",
|
|
359
|
+
scissors: "škarje",
|
|
360
|
+
wipes: "brisače",
|
|
361
|
+
pads: "blazinice",
|
|
362
|
+
biscuit: "piškot",
|
|
363
|
+
biscuits: "piškot",
|
|
364
|
+
stick: "palčka",
|
|
365
|
+
sticks: "palčka",
|
|
366
|
+
bone: "kost",
|
|
367
|
+
jerky: "suseno",
|
|
368
|
+
chew: "žvečenje",
|
|
369
|
+
chewable: "žvečljiv",
|
|
370
|
+
jelly: "žele",
|
|
371
|
+
gravy: "omaka",
|
|
372
|
+
sauce: "omaka",
|
|
373
|
+
mousse: "pena",
|
|
374
|
+
loaf: "hlod",
|
|
375
|
+
cream: "krema",
|
|
376
|
+
oil: "olje",
|
|
377
|
+
balm: "balzam",
|
|
378
|
+
tonic: "tonik",
|
|
379
|
+
lotion: "losjon",
|
|
380
|
+
urinary: "urinarne",
|
|
381
|
+
renal: "ledvično",
|
|
382
|
+
kidney: "ledvica",
|
|
383
|
+
dental: "zobno",
|
|
384
|
+
hairball: "dlake",
|
|
385
|
+
joint: "sklepi",
|
|
386
|
+
joints: "sklepi",
|
|
387
|
+
skin: "koza",
|
|
388
|
+
coat: "dlaka",
|
|
389
|
+
stomach: "želodec",
|
|
390
|
+
gastric: "prebavno",
|
|
391
|
+
digestive: "prebavni",
|
|
392
|
+
digestion: "prebava",
|
|
393
|
+
intestinal: "črevesni",
|
|
394
|
+
hepatic: "jetrni",
|
|
395
|
+
liver: "jetra",
|
|
396
|
+
cardiac: "srčni",
|
|
397
|
+
heart: "srce",
|
|
398
|
+
respiratory: "dihala",
|
|
399
|
+
breath: "dihala",
|
|
400
|
+
ear: "ušesa",
|
|
401
|
+
eye: "oci",
|
|
402
|
+
eyes: "oci",
|
|
403
|
+
oral: "oralno",
|
|
404
|
+
hypoallergenic: "hipoalergen",
|
|
405
|
+
hypoall: "hipoalergen",
|
|
406
|
+
allergenic: "alergen",
|
|
407
|
+
allergy: "alergija",
|
|
408
|
+
sensitive: "občutljiv",
|
|
409
|
+
sterilised: "steriliziran",
|
|
410
|
+
sterilized: "steriliziran",
|
|
411
|
+
steril: "steriliziran",
|
|
412
|
+
neutered: "steriliziran",
|
|
413
|
+
neutred: "steriliziran",
|
|
414
|
+
neuter: "steriliziran",
|
|
415
|
+
castrated: "kastriran",
|
|
416
|
+
obesity: "debelost",
|
|
417
|
+
obese: "debel",
|
|
418
|
+
overweight: "predebel",
|
|
419
|
+
diabetic: "diabetik",
|
|
420
|
+
mobility: "mobilnost",
|
|
421
|
+
weight: "teža",
|
|
422
|
+
growth: "rast",
|
|
423
|
+
recovery: "okrevanje",
|
|
424
|
+
convalescence: "okrevanje",
|
|
425
|
+
calm: "pomiritev",
|
|
426
|
+
relaxing: "pomiritev",
|
|
427
|
+
vitality: "vitalnost",
|
|
428
|
+
immune: "imunski",
|
|
429
|
+
immunity: "imunost",
|
|
430
|
+
supplement: "dodatek",
|
|
431
|
+
supplements: "dodatek",
|
|
432
|
+
probiotic: "probiotik",
|
|
433
|
+
probiotics: "probiotik",
|
|
434
|
+
antioxidant: "antioksidant",
|
|
435
|
+
fibre: "vlaknine",
|
|
436
|
+
fiber: "vlaknine",
|
|
437
|
+
protein: "beljakovine",
|
|
438
|
+
fat: "maščobe",
|
|
439
|
+
ash: "pepel",
|
|
440
|
+
moisture: "vlaga",
|
|
441
|
+
veterinary: "veterinarski",
|
|
442
|
+
diet: "dieta",
|
|
443
|
+
dietary: "dietna",
|
|
444
|
+
adult: "odrasel",
|
|
445
|
+
wet: "mokra",
|
|
446
|
+
dry: "suha",
|
|
447
|
+
food: "hrana",
|
|
448
|
+
snack: "priboljsek",
|
|
449
|
+
snacks: "priboljsek",
|
|
450
|
+
treat: "priboljsek",
|
|
451
|
+
treats: "priboljsek",
|
|
452
|
+
complete: "popolna",
|
|
453
|
+
balanced: "uravnotežena",
|
|
454
|
+
daily: "dnevni",
|
|
455
|
+
special: "specialni",
|
|
456
|
+
intensive: "intenzivni",
|
|
457
|
+
support: "podpora",
|
|
458
|
+
protection: "zaščita",
|
|
459
|
+
control: "nadzor",
|
|
460
|
+
hygiene: "higiena",
|
|
461
|
+
fresh: "sveze",
|
|
462
|
+
grainfree: "brez zita",
|
|
463
|
+
bite: "grizljaj",
|
|
464
|
+
flavour: "okus",
|
|
465
|
+
flavor: "okus",
|
|
466
|
+
taste: "okus",
|
|
467
|
+
chickpomeg: "piscanec granatno jabolko",
|
|
468
|
+
chpom: "piscanec granatno jabolko",
|
|
469
|
+
cant: "melona",
|
|
470
|
+
cantmelon: "melona",
|
|
471
|
+
neut: "steriliziran",
|
|
472
|
+
vacc: "cepivo",
|
|
473
|
+
vaccin: "cepivo",
|
|
474
|
+
vaccine: "cepivo",
|
|
475
|
+
haem: "hem",
|
|
476
|
+
canine: "pasji",
|
|
477
|
+
feline: "mačji",
|
|
478
|
+
satiety: "sitost",
|
|
479
|
+
gastrointestinal: "prebavni",
|
|
480
|
+
pisc: "piščanec",
|
|
481
|
+
piscji: "piščanec",
|
|
482
|
+
krom: "krompir",
|
|
483
|
+
kromp: "krompir",
|
|
484
|
+
granat: "granatno",
|
|
485
|
+
ovck: "ovčka",
|
|
486
|
+
priboljski: "priboljšek"
|
|
487
|
+
};
|
|
488
|
+
var STOP_BESEDE = [
|
|
489
|
+
"and",
|
|
490
|
+
"with",
|
|
491
|
+
"for",
|
|
492
|
+
"the",
|
|
493
|
+
"of",
|
|
494
|
+
"in",
|
|
495
|
+
"on",
|
|
496
|
+
"to",
|
|
497
|
+
"from",
|
|
498
|
+
"per",
|
|
499
|
+
"care",
|
|
500
|
+
"health",
|
|
501
|
+
"healthy",
|
|
502
|
+
"premium",
|
|
503
|
+
"quality",
|
|
504
|
+
"test"
|
|
505
|
+
];
|
|
506
|
+
var STAROSTI = {
|
|
507
|
+
mladic: "mladič",
|
|
508
|
+
mladicek: "mladič",
|
|
509
|
+
puppy: "mladič",
|
|
510
|
+
puppies: "mladič",
|
|
511
|
+
kitten: "mladič",
|
|
512
|
+
kittens: "mladič",
|
|
513
|
+
junior: "mladič",
|
|
514
|
+
juniors: "mladič",
|
|
515
|
+
baby: "mladič",
|
|
516
|
+
weaning: "mladič",
|
|
517
|
+
odrasel: "odrasel",
|
|
518
|
+
odrasli: "odrasel",
|
|
519
|
+
adult: "odrasel",
|
|
520
|
+
adults: "odrasel",
|
|
521
|
+
mature: "odrasel",
|
|
522
|
+
senior: "senior",
|
|
523
|
+
seniors: "senior",
|
|
524
|
+
seniorji: "senior",
|
|
525
|
+
geriatric: "senior",
|
|
526
|
+
aged: "senior"
|
|
527
|
+
};
|
|
528
|
+
var VELIKOSTI_EN = {
|
|
529
|
+
small: "s",
|
|
530
|
+
medium: "m",
|
|
531
|
+
large: "l",
|
|
532
|
+
giant: "xl",
|
|
533
|
+
xlarge: "xl",
|
|
534
|
+
extralarge: "xl"
|
|
535
|
+
};
|
|
536
|
+
var VELIKOSTI_OKRAJSAVE = {
|
|
537
|
+
med: "medium",
|
|
538
|
+
max: "maxi",
|
|
539
|
+
min: "mini"
|
|
540
|
+
};
|
|
541
|
+
var PREVODI_VIR = "ročno kurirano 2026-10-04 (besedišče izmerjeno v tackakp + SI_TACKA)";
|
|
542
|
+
|
|
180
543
|
// src/vet/data/znamke.gen.ts
|
|
181
544
|
var ZNAMKE_GEN = {
|
|
182
545
|
vir: "/Users/primozk/devmt/panthenImport",
|
|
@@ -924,6 +1287,14 @@ function kljucBesede(beseda) {
|
|
|
924
1287
|
return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+$/, "");
|
|
925
1288
|
}
|
|
926
1289
|
var BESEDA = /(?<![\p{L}\p{N}])([\p{L}\p{N}]+)(?![\p{L}\p{N}])/gu;
|
|
1290
|
+
var BESEDA_Z_VEZNIKOM = /(?<![\p{L}\p{N}])([\p{L}]+)\s*[&+]\s*([\p{L}]+)(?![\p{L}\p{N}])/gu;
|
|
1291
|
+
var VELIKOSTNE_BESEDE = new Set([
|
|
1292
|
+
...Object.keys(VELIKOSTI_OKRAJSAVE),
|
|
1293
|
+
...Object.keys(VELIKOSTI_EN),
|
|
1294
|
+
"mini",
|
|
1295
|
+
"maxi",
|
|
1296
|
+
...Object.keys(VELIKOSTI_SINONIMI)
|
|
1297
|
+
]);
|
|
927
1298
|
function kanonicaVelika(enota) {
|
|
928
1299
|
return enota.toUpperCase();
|
|
929
1300
|
}
|
|
@@ -1009,19 +1380,90 @@ var vrstaNormalizator = {
|
|
|
1009
1380
|
return najdene.length ? { text: ocisceno, classes: { vrsta: najdene } } : ocisceno;
|
|
1010
1381
|
}
|
|
1011
1382
|
};
|
|
1012
|
-
var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2));
|
|
1383
|
+
var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2 && !PREVODI[t]));
|
|
1384
|
+
var razdeljevalciNormalizator = {
|
|
1385
|
+
fn: (v) => {
|
|
1386
|
+
let spremenjeno = false;
|
|
1387
|
+
let besedilo = v.replace(BESEDA_Z_VEZNIKOM, (ujemanje, a, b) => {
|
|
1388
|
+
const ka = kljucBesede(a);
|
|
1389
|
+
const kb = kljucBesede(b);
|
|
1390
|
+
if (!VELIKOSTNE_BESEDE.has(ka) || !VELIKOSTNE_BESEDE.has(kb))
|
|
1391
|
+
return ujemanje;
|
|
1392
|
+
const razsiri = (k) => VELIKOSTI_OKRAJSAVE[k] ?? VELIKOSTI_EN[k] ?? k;
|
|
1393
|
+
spremenjeno = true;
|
|
1394
|
+
return `${razsiri(ka)} ${razsiri(kb)}`;
|
|
1395
|
+
});
|
|
1396
|
+
const zLocili = besedilo.replace(/\s*[&+,;|]\s*/g, " ").replace(/(?<=[\p{L}\p{N}]{2})\s*\/\s*(?=[\p{L}\p{N}]{2})/gu, " ").replace(/(?<![\d])([\p{L}]{2,})\.(?=\s|$)/gu, "$1").replace(/(?<=\p{L})\.(?=\p{L})/gu, " ");
|
|
1397
|
+
if (zLocili !== besedilo)
|
|
1398
|
+
spremenjeno = true;
|
|
1399
|
+
besedilo = zLocili;
|
|
1400
|
+
return spremenjeno ? besedilo.replace(/\s+/g, " ").trim() : undefined;
|
|
1401
|
+
}
|
|
1402
|
+
};
|
|
1403
|
+
var PREVODI_MAP = new Map(Object.entries(PREVODI));
|
|
1404
|
+
var STOP_MAP = new Set(STOP_BESEDE);
|
|
1405
|
+
var prevodiNormalizator = {
|
|
1406
|
+
fn: (v) => {
|
|
1407
|
+
let spremenjeno = false;
|
|
1408
|
+
const izhod = v.replace(BESEDA, (ujemanje) => {
|
|
1409
|
+
const kljuc = kljucBesede(ujemanje);
|
|
1410
|
+
if (STOP_MAP.has(kljuc)) {
|
|
1411
|
+
spremenjeno = true;
|
|
1412
|
+
return " ";
|
|
1413
|
+
}
|
|
1414
|
+
const prevod = PREVODI_MAP.get(kljuc);
|
|
1415
|
+
if (!prevod)
|
|
1416
|
+
return ujemanje;
|
|
1417
|
+
spremenjeno = true;
|
|
1418
|
+
return prevod.toUpperCase();
|
|
1419
|
+
});
|
|
1420
|
+
return spremenjeno ? izhod.replace(/\s+/g, " ").trim() : undefined;
|
|
1421
|
+
}
|
|
1422
|
+
};
|
|
1423
|
+
var starostNormalizator = {
|
|
1424
|
+
fn: (v) => {
|
|
1425
|
+
const najdene = [];
|
|
1426
|
+
const izhod = v.replace(BESEDA, (ujemanje) => {
|
|
1427
|
+
const starost = STAROSTI[kljucBesede(ujemanje)];
|
|
1428
|
+
if (!starost)
|
|
1429
|
+
return ujemanje;
|
|
1430
|
+
if (!najdene.includes(starost))
|
|
1431
|
+
najdene.push(starost);
|
|
1432
|
+
return " ";
|
|
1433
|
+
});
|
|
1434
|
+
if (!najdene.length)
|
|
1435
|
+
return;
|
|
1436
|
+
return { text: izhod.replace(/\s+/g, " ").trim(), classes: { starost: najdene } };
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1013
1439
|
var VRSTE_ZA_RAZRED = new Set(["pes", "macka"]);
|
|
1014
1440
|
var OKRAJSAVE_ZNAMK = new Map;
|
|
1015
1441
|
var LINIJE_ZNAMK = new Map;
|
|
1442
|
+
var ZNANE_ZNAMKE = new Map([["n&d", "NATURAL DELICIOUS"]]);
|
|
1443
|
+
var OBIČAJNE_BESEDE = new Set([
|
|
1444
|
+
...Object.keys(PREVODI),
|
|
1445
|
+
...STOP_BESEDE,
|
|
1446
|
+
...Object.keys(STAROSTI),
|
|
1447
|
+
...Object.keys(VELIKOSTI_EN),
|
|
1448
|
+
...Object.keys(VELIKOSTI_SINONIMI),
|
|
1449
|
+
...Object.keys(VRSTE_SINONIMI)
|
|
1450
|
+
]);
|
|
1451
|
+
var BESEDE_ZNAMK = new Set(ZNAMKE_GEN.okrajsave.flatMap((o) => o.znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u)).filter(Boolean));
|
|
1016
1452
|
for (const zapis of ZNAMKE_GEN.okrajsave) {
|
|
1017
1453
|
const kljuc = zapis.okrajsava.toLowerCase();
|
|
1018
1454
|
if (zapis.zaupanje === "splet")
|
|
1019
1455
|
continue;
|
|
1456
|
+
if (kljuc.length <= 4 && OBIČAJNE_BESEDE.has(kljuc))
|
|
1457
|
+
continue;
|
|
1458
|
+
if (BESEDE_ZNAMK.has(kljuc))
|
|
1459
|
+
continue;
|
|
1020
1460
|
if (!OKRAJSAVE_ZNAMK.has(kljuc))
|
|
1021
1461
|
OKRAJSAVE_ZNAMK.set(kljuc, zapis.znamka);
|
|
1022
1462
|
}
|
|
1023
1463
|
for (const linija of ZNAMKE_GEN.linije) {
|
|
1024
1464
|
const kljuc = linija.linija.toLowerCase();
|
|
1465
|
+
if (OBIČAJNE_BESEDE.has(kljuc))
|
|
1466
|
+
continue;
|
|
1025
1467
|
if (!LINIJE_ZNAMK.has(kljuc))
|
|
1026
1468
|
LINIJE_ZNAMK.set(kljuc, linija.znamka);
|
|
1027
1469
|
}
|
|
@@ -1030,7 +1472,7 @@ var znamkaNormalizator = {
|
|
|
1030
1472
|
let spremenjeno = false;
|
|
1031
1473
|
const izhod = v.replace(/(?<![\p{L}\p{N}])([\p{L}\p{N}&]+)(?![\p{L}\p{N}])/gu, (ujemanje) => {
|
|
1032
1474
|
const kljuc = kljucBesede(ujemanje);
|
|
1033
|
-
const znamka = OKRAJSAVE_ZNAMK.get(kljuc);
|
|
1475
|
+
const znamka = ZNANE_ZNAMKE.get(kljuc) ?? OKRAJSAVE_ZNAMK.get(kljuc);
|
|
1034
1476
|
if (znamka) {
|
|
1035
1477
|
const besedeCilja = znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
1036
1478
|
if (besedeCilja.includes(kljuc))
|
|
@@ -1041,7 +1483,8 @@ var znamkaNormalizator = {
|
|
|
1041
1483
|
const linija = LINIJE_ZNAMK.get(kljuc);
|
|
1042
1484
|
if (linija) {
|
|
1043
1485
|
spremenjeno = true;
|
|
1044
|
-
|
|
1486
|
+
const ze = v.toLowerCase().includes(linija.toLowerCase());
|
|
1487
|
+
return ze ? ujemanje.toUpperCase() : `${linija.toUpperCase()} ${ujemanje.toUpperCase()}`;
|
|
1045
1488
|
}
|
|
1046
1489
|
return ujemanje;
|
|
1047
1490
|
});
|
|
@@ -1075,7 +1518,7 @@ var velikostNormalizator = {
|
|
|
1075
1518
|
const najdene = [];
|
|
1076
1519
|
const izhod = v.replace(BESEDA, (ujemanje, ...args) => {
|
|
1077
1520
|
const kljuc = kljucBesede(ujemanje);
|
|
1078
|
-
const velikost = VELIKOSTI_SINONIMI[kljuc];
|
|
1521
|
+
const velikost = VELIKOSTI_SINONIMI[kljuc] ?? VELIKOSTI_EN[kljuc];
|
|
1079
1522
|
if (!velikost)
|
|
1080
1523
|
return ujemanje;
|
|
1081
1524
|
const mesto = args[args.length - 2];
|
|
@@ -1129,11 +1572,14 @@ var VET_NORMALIZATORJI = [
|
|
|
1129
1572
|
kodiranjeNormalizator,
|
|
1130
1573
|
decimalkeNormalizator,
|
|
1131
1574
|
pantheonOznakaNormalizator,
|
|
1132
|
-
tipskeOznakeNormalizator,
|
|
1133
1575
|
enoteNormalizator,
|
|
1134
1576
|
znamkaNormalizator,
|
|
1577
|
+
razdeljevalciNormalizator,
|
|
1578
|
+
prevodiNormalizator,
|
|
1579
|
+
tipskeOznakeNormalizator,
|
|
1135
1580
|
kolicinaNormalizator,
|
|
1136
1581
|
velikostNormalizator,
|
|
1582
|
+
starostNormalizator,
|
|
1137
1583
|
vrstaNormalizator,
|
|
1138
1584
|
oznakeNormalizator
|
|
1139
1585
|
];
|
|
@@ -1142,6 +1588,10 @@ var VET_TABELA = {
|
|
|
1142
1588
|
linije: LINIJE_ZNAMK,
|
|
1143
1589
|
dobavitelji: DOBAVITELJI,
|
|
1144
1590
|
oznake: OZNAKE,
|
|
1591
|
+
prevodi: PREVODI_MAP,
|
|
1592
|
+
stopBesede: STOP_MAP,
|
|
1593
|
+
starosti: STAROSTI,
|
|
1594
|
+
velikostiEn: VELIKOSTI_EN,
|
|
1145
1595
|
vir: ZNAMKE_GEN.vir
|
|
1146
1596
|
};
|
|
1147
1597
|
// src/vet/spec.ts
|
|
@@ -1943,14 +2393,17 @@ var KAZEN = {
|
|
|
1943
2393
|
kolicina: 150,
|
|
1944
2394
|
pakiranje: 150,
|
|
1945
2395
|
velikost: 300,
|
|
1946
|
-
pantheon: 100
|
|
2396
|
+
pantheon: 100,
|
|
2397
|
+
starost: 400
|
|
1947
2398
|
};
|
|
2399
|
+
var VETO_RAZREDI = new Set(["vrsta"]);
|
|
1948
2400
|
var BONUS = {
|
|
1949
2401
|
razpon: 150,
|
|
1950
2402
|
vrsta: 200,
|
|
1951
2403
|
kolicina: 100,
|
|
1952
2404
|
pakiranje: 100,
|
|
1953
|
-
velikost: 150
|
|
2405
|
+
velikost: 150,
|
|
2406
|
+
starost: 200
|
|
1954
2407
|
};
|
|
1955
2408
|
function kotSeznam(v) {
|
|
1956
2409
|
if (v === undefined)
|
|
@@ -1962,6 +2415,32 @@ function staVNasprotju(a, b) {
|
|
|
1962
2415
|
return false;
|
|
1963
2416
|
return !a.some((x) => b.includes(x));
|
|
1964
2417
|
}
|
|
2418
|
+
var NORMALIZIRANO = new Map;
|
|
2419
|
+
function normalizirajNaziv(naziv) {
|
|
2420
|
+
const shranjeno = NORMALIZIRANO.get(naziv);
|
|
2421
|
+
if (shranjeno)
|
|
2422
|
+
return shranjeno;
|
|
2423
|
+
let text = naziv;
|
|
2424
|
+
const classes = {};
|
|
2425
|
+
for (const n of VET_NORMALIZATORJI) {
|
|
2426
|
+
const r = n.fn(text, "naziv");
|
|
2427
|
+
if (r === undefined)
|
|
2428
|
+
continue;
|
|
2429
|
+
if (typeof r === "string") {
|
|
2430
|
+
text = r;
|
|
2431
|
+
continue;
|
|
2432
|
+
}
|
|
2433
|
+
text = r.text;
|
|
2434
|
+
for (const [kljuc, vrednost] of Object.entries(r.classes ?? {})) {
|
|
2435
|
+
classes[kljuc] = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
|
|
2436
|
+
}
|
|
2437
|
+
}
|
|
2438
|
+
const rezultat = { text: text.replace(/\s+/g, " ").trim(), classes };
|
|
2439
|
+
if (NORMALIZIRANO.size > 60000)
|
|
2440
|
+
NORMALIZIRANO.clear();
|
|
2441
|
+
NORMALIZIRANO.set(naziv, rezultat);
|
|
2442
|
+
return rezultat;
|
|
2443
|
+
}
|
|
1965
2444
|
function kljuc(beseda) {
|
|
1966
2445
|
return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "");
|
|
1967
2446
|
}
|
|
@@ -1991,8 +2470,16 @@ function prestaneVratar(besedePoizvedbe, besedeKandidata) {
|
|
|
1991
2470
|
}
|
|
1992
2471
|
function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
|
|
1993
2472
|
const n = { ...PRIVZETO, ...nastavitve };
|
|
1994
|
-
const
|
|
1995
|
-
const
|
|
2473
|
+
const qNorm = normalizirajNaziv(poizvedba);
|
|
2474
|
+
const cNorm = normalizirajNaziv(kandidat);
|
|
2475
|
+
const q = razcleniNaziv(qNorm.text);
|
|
2476
|
+
const c = razcleniNaziv(cNorm.text);
|
|
2477
|
+
const qSurov = razcleniNaziv(poizvedba);
|
|
2478
|
+
const cSurov = razcleniNaziv(kandidat);
|
|
2479
|
+
const razrediSkupni = {
|
|
2480
|
+
poizvedba: { ...qNorm.classes, ...razredi?.poizvedba ?? {} },
|
|
2481
|
+
kandidat: { ...cNorm.classes, ...razredi?.kandidat ?? {} }
|
|
2482
|
+
};
|
|
1996
2483
|
const prazna = {
|
|
1997
2484
|
ocena: 0,
|
|
1998
2485
|
sprejeto: false,
|
|
@@ -2004,52 +2491,85 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
|
|
|
2004
2491
|
};
|
|
2005
2492
|
if (!prestaneVratar(q.besede, c.besede))
|
|
2006
2493
|
return prazna;
|
|
2007
|
-
const
|
|
2008
|
-
const
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
2494
|
+
const vrednostiRazredov = (m) => Object.values(m).flat().map((v) => String(v).toLowerCase()).filter((v) => v.length > 0);
|
|
2495
|
+
const qSurovTok = [
|
|
2496
|
+
...new Set([
|
|
2497
|
+
...[...qSurov.besede, ...qSurov.zivalskeVrste, ...qSurov.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2498
|
+
...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
|
|
2499
|
+
])
|
|
2500
|
+
];
|
|
2501
|
+
const cSurovTok = [
|
|
2502
|
+
...new Set([
|
|
2503
|
+
...[...cSurov.besede, ...cSurov.zivalskeVrste, ...cSurov.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2504
|
+
...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
|
|
2505
|
+
])
|
|
2506
|
+
];
|
|
2507
|
+
const qTok = [
|
|
2508
|
+
...new Set([
|
|
2509
|
+
...[...q.besede, ...q.zivalskeVrste, ...q.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2510
|
+
...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
|
|
2511
|
+
])
|
|
2512
|
+
];
|
|
2513
|
+
const cTok = [
|
|
2514
|
+
...new Set([
|
|
2515
|
+
...[...c.besede, ...c.zivalskeVrste, ...c.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2516
|
+
...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
|
|
2517
|
+
])
|
|
2518
|
+
];
|
|
2519
|
+
const izracunajPokritost = (qZetoni, cZetoni) => {
|
|
2520
|
+
const qStevci = new Map;
|
|
2521
|
+
for (const t of qZetoni)
|
|
2522
|
+
qStevci.set(t, (qStevci.get(t) ?? 0) + 1);
|
|
2523
|
+
const cStevci = new Map;
|
|
2524
|
+
for (const t of cZetoni)
|
|
2525
|
+
cStevci.set(t, (cStevci.get(t) ?? 0) + 1);
|
|
2526
|
+
const porabljeno = new Map;
|
|
2527
|
+
let ujemajoce = 0;
|
|
2528
|
+
let ujemajoceCele = 0;
|
|
2529
|
+
const skupne2 = [];
|
|
2530
|
+
for (const [qZeton, kolikoQ] of qStevci) {
|
|
2531
|
+
let potrebnih = kolikoQ;
|
|
2532
|
+
for (const [cZeton, kolikoC] of cStevci) {
|
|
2533
|
+
if (potrebnih === 0)
|
|
2534
|
+
break;
|
|
2535
|
+
const prostih = kolikoC - (porabljeno.get(cZeton) ?? 0);
|
|
2536
|
+
if (prostih <= 0)
|
|
2537
|
+
continue;
|
|
2538
|
+
const qKljuc = kljuc(qZeton);
|
|
2539
|
+
const cKljuc = kljuc(cZeton);
|
|
2540
|
+
const cela = qKljuc === cKljuc;
|
|
2541
|
+
const predpona = !cela && (cKljuc.startsWith(qKljuc) || qKljuc.startsWith(cKljuc));
|
|
2542
|
+
const razmerje = Math.min(qKljuc.length, cKljuc.length) / Math.max(qKljuc.length, cKljuc.length);
|
|
2543
|
+
if (!cela && !(predpona && razmerje >= n.predponaDelez))
|
|
2544
|
+
continue;
|
|
2545
|
+
const vzem = Math.min(potrebnih, prostih);
|
|
2546
|
+
porabljeno.set(cZeton, (porabljeno.get(cZeton) ?? 0) + vzem);
|
|
2547
|
+
ujemajoce += vzem;
|
|
2548
|
+
if (cela)
|
|
2549
|
+
ujemajoceCele += vzem;
|
|
2550
|
+
if (!skupne2.includes(qZeton))
|
|
2551
|
+
skupne2.push(qZeton);
|
|
2552
|
+
potrebnih -= vzem;
|
|
2553
|
+
}
|
|
2040
2554
|
}
|
|
2041
|
-
|
|
2042
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
2555
|
+
const pokritostKandidata2 = cZetoni.length ? ujemajoce / cZetoni.length : 0;
|
|
2556
|
+
const pokritostPoizvedbe2 = qZetoni.length ? ujemajoce / qZetoni.length : 0;
|
|
2557
|
+
const dovoljDolg = [...porabljeno.keys()].some((t) => kljuc(t).length >= 5);
|
|
2558
|
+
const popolno = pokritostKandidata2 === 1 && pokritostPoizvedbe2 === 1;
|
|
2559
|
+
const ok = ujemajoce >= 1 && pokritostKandidata2 >= n.pokritostKandidata && pokritostPoizvedbe2 >= n.pokritostPoizvedbe && (popolno || ujemajoceCele >= 2 || dovoljDolg);
|
|
2560
|
+
return { ok, pokritostKandidata: pokritostKandidata2, pokritostPoizvedbe: pokritostPoizvedbe2, skupne: skupne2, nasprotja: [] };
|
|
2561
|
+
};
|
|
2562
|
+
const kanonicno = izracunajPokritost(qTok, cTok);
|
|
2563
|
+
const surovo = izracunajPokritost(qSurovTok, cSurovTok);
|
|
2564
|
+
const izbrano = kanonicno.ok || kanonicno.pokritostKandidata >= surovo.pokritostKandidata ? kanonicno : surovo;
|
|
2565
|
+
const { pokritostKandidata, pokritostPoizvedbe, skupne } = izbrano;
|
|
2566
|
+
const pokritostOk = kanonicno.ok || surovo.ok;
|
|
2567
|
+
let ocena = Math.max(oceniPodobnost(q, c).ocena, oceniPodobnost(qSurov, cSurov).ocena);
|
|
2048
2568
|
const nasprotja = [];
|
|
2049
|
-
const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "pantheon"];
|
|
2569
|
+
const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "starost", "pantheon"];
|
|
2050
2570
|
for (const kljuc2 of kljuci) {
|
|
2051
|
-
const a = kotSeznam(
|
|
2052
|
-
const b = kotSeznam(
|
|
2571
|
+
const a = kotSeznam(razrediSkupni["poizvedba"]?.[kljuc2]);
|
|
2572
|
+
const b = kotSeznam(razrediSkupni["kandidat"]?.[kljuc2]);
|
|
2053
2573
|
if (staVNasprotju(a, b)) {
|
|
2054
2574
|
ocena -= KAZEN[kljuc2] ?? 0;
|
|
2055
2575
|
nasprotja.push(`${kljuc2}: ${a.join("/")} ≠ ${b.join("/")}`);
|
|
@@ -2057,8 +2577,9 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
|
|
|
2057
2577
|
ocena += BONUS[kljuc2] ?? 0;
|
|
2058
2578
|
}
|
|
2059
2579
|
}
|
|
2060
|
-
const
|
|
2061
|
-
const
|
|
2580
|
+
const veto = nasprotja.some((n2) => VETO_RAZREDI.has(n2.split(":")[0] ?? ""));
|
|
2581
|
+
const sprejeto = pokritostOk && !veto && ocena >= n.minOcena;
|
|
2582
|
+
const razlog = sprejeto ? `pokritost kandidata ${Math.round(pokritostKandidata * 100)} %, poizvedbe ${Math.round(pokritostPoizvedbe * 100)} %` + (skupne.length ? `; skupne besede: ${skupne.slice(0, 5).join(", ")}` : "") + (nasprotja.length ? `; nasprotja: ${nasprotja.join("; ")}` : "") : veto ? `nasprotje v razredu (${nasprotja.join("; ")})` : `pokritost prenizka (kandidat ${Math.round(pokritostKandidata * 100)} %, poizvedba ${Math.round(pokritostPoizvedbe * 100)} %)`;
|
|
2062
2583
|
return { ocena, sprejeto, razlog, pokritostKandidata, pokritostPoizvedbe, skupneBesede: skupne.slice(0, 5), nasprotja };
|
|
2063
2584
|
}
|
|
2064
2585
|
// src/common/numeric/scoring.ts
|
|
@@ -2222,76 +2743,87 @@ function naSezname(classes) {
|
|
|
2222
2743
|
}
|
|
2223
2744
|
return Object.keys(out).length ? out : undefined;
|
|
2224
2745
|
}
|
|
2225
|
-
|
|
2226
|
-
const { queryOf, idOf, limit = 3, minScore = 0,
|
|
2746
|
+
function matchOne(prepared, query, indeks, options, porabljeni) {
|
|
2747
|
+
const { queryOf, idOf, limit = 3, minScore = 0, rank, accept, opts } = options;
|
|
2227
2748
|
const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
|
|
2228
2749
|
const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
|
|
2229
|
-
const
|
|
2230
|
-
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
|
|
2234
|
-
|
|
2235
|
-
|
|
2236
|
-
const
|
|
2237
|
-
|
|
2238
|
-
|
|
2239
|
-
|
|
2240
|
-
|
|
2241
|
-
|
|
2242
|
-
|
|
2243
|
-
|
|
2244
|
-
|
|
2245
|
-
|
|
2246
|
-
const
|
|
2247
|
-
|
|
2248
|
-
|
|
2249
|
-
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2253
|
-
|
|
2254
|
-
|
|
2255
|
-
|
|
2256
|
-
|
|
2257
|
-
|
|
2258
|
-
|
|
2259
|
-
continue;
|
|
2260
|
-
if (porabljeni?.has(zadetek.id))
|
|
2261
|
-
continue;
|
|
2262
|
-
najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
|
|
2263
|
-
}
|
|
2264
|
-
najdeni.sort((a, b) => {
|
|
2265
|
-
if (b.score !== a.score)
|
|
2266
|
-
return b.score - a.score;
|
|
2267
|
-
return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
|
|
2268
|
-
});
|
|
2269
|
-
if (najdeni.length > limit)
|
|
2270
|
-
najdeni.length = limit;
|
|
2271
|
-
return { kandidati: najdeni, zadetkov: zadetki.length };
|
|
2272
|
-
};
|
|
2273
|
-
let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
|
|
2274
|
-
const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
|
|
2275
|
-
if (poskusiAlternative && options.alternativnePoizvedbe) {
|
|
2276
|
-
for (const alternativa of options.alternativnePoizvedbe(query)) {
|
|
2277
|
-
const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
|
|
2278
|
-
if (!altBesedilo?.trim() || altBesedilo === text)
|
|
2279
|
-
continue;
|
|
2280
|
-
const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
|
|
2281
|
-
({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
|
|
2282
|
-
if (kandidati.length)
|
|
2283
|
-
break;
|
|
2284
|
-
}
|
|
2285
|
-
}
|
|
2286
|
-
if (porabljeni) {
|
|
2287
|
-
for (const kandidat of kandidati)
|
|
2288
|
-
porabljeni.add(kandidat.id);
|
|
2750
|
+
const vhod = queryOf(query);
|
|
2751
|
+
const text = typeof vhod === "string" ? vhod : vhod.text;
|
|
2752
|
+
const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
|
|
2753
|
+
const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
|
|
2754
|
+
const poisciKandidate = (besedilo, razredi) => {
|
|
2755
|
+
if (!besedilo.trim())
|
|
2756
|
+
return { kandidati: [], zadetkov: 0 };
|
|
2757
|
+
const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
|
|
2758
|
+
primaryTextFn: primaryTextOf,
|
|
2759
|
+
...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
|
|
2760
|
+
...opts ? { opts } : {},
|
|
2761
|
+
limit: retrievalLimit
|
|
2762
|
+
});
|
|
2763
|
+
const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
|
|
2764
|
+
const najdeni = [];
|
|
2765
|
+
for (const zadetek of zadetki) {
|
|
2766
|
+
const classes = itemClasses(prepared.metadata, zadetek.id);
|
|
2767
|
+
const kandidat = {
|
|
2768
|
+
id: zadetek.id,
|
|
2769
|
+
item: zadetek.item,
|
|
2770
|
+
...classes ? { classes } : {}
|
|
2771
|
+
};
|
|
2772
|
+
if (accept && !accept(kandidat, poizvedbaZaDomeno))
|
|
2773
|
+
continue;
|
|
2774
|
+
const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
|
|
2775
|
+
if (ocena < minScore)
|
|
2776
|
+
continue;
|
|
2777
|
+
if (porabljeni?.has(zadetek.id))
|
|
2778
|
+
continue;
|
|
2779
|
+
najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
|
|
2289
2780
|
}
|
|
2290
|
-
|
|
2291
|
-
|
|
2292
|
-
|
|
2293
|
-
|
|
2781
|
+
najdeni.sort((a, b) => {
|
|
2782
|
+
if (b.score !== a.score)
|
|
2783
|
+
return b.score - a.score;
|
|
2784
|
+
return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
|
|
2294
2785
|
});
|
|
2786
|
+
if (najdeni.length > limit)
|
|
2787
|
+
najdeni.length = limit;
|
|
2788
|
+
return { kandidati: najdeni, zadetkov: zadetki.length };
|
|
2789
|
+
};
|
|
2790
|
+
let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
|
|
2791
|
+
const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
|
|
2792
|
+
if (poskusiAlternative && options.alternativnePoizvedbe) {
|
|
2793
|
+
for (const alternativa of options.alternativnePoizvedbe(query)) {
|
|
2794
|
+
const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
|
|
2795
|
+
if (!altBesedilo?.trim() || altBesedilo === text)
|
|
2796
|
+
continue;
|
|
2797
|
+
const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
|
|
2798
|
+
({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
|
|
2799
|
+
if (kandidati.length)
|
|
2800
|
+
break;
|
|
2801
|
+
}
|
|
2802
|
+
}
|
|
2803
|
+
if (porabljeni) {
|
|
2804
|
+
for (const kandidat of kandidati)
|
|
2805
|
+
porabljeni.add(kandidat.id);
|
|
2806
|
+
}
|
|
2807
|
+
return {
|
|
2808
|
+
id,
|
|
2809
|
+
...queryClasses ? { queryClasses } : {},
|
|
2810
|
+
kandidati
|
|
2811
|
+
};
|
|
2812
|
+
}
|
|
2813
|
+
function matchManySync(prepared, queries, options) {
|
|
2814
|
+
const porabljeni = options.samoEnolicno ? new Set : undefined;
|
|
2815
|
+
const izhod = new Array(queries.length);
|
|
2816
|
+
for (let indeks = 0;indeks < queries.length; indeks++) {
|
|
2817
|
+
izhod[indeks] = matchOne(prepared, queries[indeks], indeks, options, porabljeni);
|
|
2818
|
+
}
|
|
2819
|
+
return izhod;
|
|
2820
|
+
}
|
|
2821
|
+
async function* matchMany(prepared, queries, options) {
|
|
2822
|
+
const kos = options.kos ?? 50;
|
|
2823
|
+
const porabljeni = options.samoEnolicno ? new Set : undefined;
|
|
2824
|
+
let kosZbirka = [];
|
|
2825
|
+
for (let indeks = 0;indeks < queries.length; indeks++) {
|
|
2826
|
+
kosZbirka.push(matchOne(prepared, queries[indeks], indeks, options, porabljeni));
|
|
2295
2827
|
if (kosZbirka.length >= kos) {
|
|
2296
2828
|
yield kosZbirka;
|
|
2297
2829
|
kosZbirka = [];
|
|
@@ -2373,7 +2905,9 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
|
|
|
2373
2905
|
opts: vetQueryOpts(),
|
|
2374
2906
|
primaryTextOf: (item) => item.naziv,
|
|
2375
2907
|
rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
|
|
2376
|
-
|
|
2908
|
+
...nastavitve.vrniNesprejete ? {} : {
|
|
2909
|
+
accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
|
|
2910
|
+
},
|
|
2377
2911
|
...uporabiZozeno ? {
|
|
2378
2912
|
alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv),
|
|
2379
2913
|
alternativneLeCeNiZadetkov: true
|
|
@@ -2398,6 +2932,58 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
|
|
|
2398
2932
|
yield izhod;
|
|
2399
2933
|
}
|
|
2400
2934
|
}
|
|
2935
|
+
function upariVseSync(prepared, artikli, nastavitve = {}) {
|
|
2936
|
+
const { limit = 3, retrievalLimit = 10, samoEnolicno, ocena: pragOcene } = nastavitve;
|
|
2937
|
+
const uporabiZozeno = nastavitve.zozenaPoizvedba !== false;
|
|
2938
|
+
const nazivPoId = new Map;
|
|
2939
|
+
for (const artikel of artikli)
|
|
2940
|
+
nazivPoId.set(String(artikel._id), artikel.naziv);
|
|
2941
|
+
const pomnilnik = new Map;
|
|
2942
|
+
const oceni = (poizvedba, kandidat, razrediPoizvedbe, razrediKandidata) => {
|
|
2943
|
+
const kljuc2 = `${poizvedba}\x00${kandidat}`;
|
|
2944
|
+
let rezultat = pomnilnik.get(kljuc2);
|
|
2945
|
+
if (!rezultat) {
|
|
2946
|
+
rezultat = oceniPar(poizvedba, kandidat, pragOcene, {
|
|
2947
|
+
...razrediPoizvedbe ? { poizvedba: razrediPoizvedbe } : {},
|
|
2948
|
+
...razrediKandidata ? { kandidat: razrediKandidata } : {}
|
|
2949
|
+
});
|
|
2950
|
+
pomnilnik.set(kljuc2, rezultat);
|
|
2951
|
+
}
|
|
2952
|
+
return rezultat;
|
|
2953
|
+
};
|
|
2954
|
+
const rezultati = matchManySync(prepared, artikli, {
|
|
2955
|
+
queryOf: (z) => {
|
|
2956
|
+
const { classes } = normalizeQueryWithOpts(z.naziv, vetQueryOpts());
|
|
2957
|
+
return { text: z.naziv, ...Object.keys(classes).length ? { classes } : {} };
|
|
2958
|
+
},
|
|
2959
|
+
idOf: (z) => String(z._id),
|
|
2960
|
+
limit,
|
|
2961
|
+
retrievalLimit,
|
|
2962
|
+
...samoEnolicno ? { samoEnolicno: true } : {},
|
|
2963
|
+
opts: vetQueryOpts(),
|
|
2964
|
+
primaryTextOf: (item) => item.naziv,
|
|
2965
|
+
rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
|
|
2966
|
+
...nastavitve.vrniNesprejete ? {} : {
|
|
2967
|
+
accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
|
|
2968
|
+
},
|
|
2969
|
+
...uporabiZozeno ? { alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv), alternativneLeCeNiZadetkov: true } : {}
|
|
2970
|
+
});
|
|
2971
|
+
return rezultati.map((rezultat) => ({
|
|
2972
|
+
id: rezultat.id,
|
|
2973
|
+
kandidati: rezultat.kandidati.map((kandidat) => {
|
|
2974
|
+
const classes = itemClasses(prepared.metadata, kandidat.id);
|
|
2975
|
+
const ocena = oceni(nazivPoId.get(rezultat.id) ?? "", String(kandidat.item.naziv), rezultat.queryClasses, classes);
|
|
2976
|
+
return {
|
|
2977
|
+
id: String(kandidat.id),
|
|
2978
|
+
item: kandidat.item,
|
|
2979
|
+
score: kandidat.score,
|
|
2980
|
+
sprejeto: ocena.sprejeto,
|
|
2981
|
+
ocena,
|
|
2982
|
+
...classes ? { classes } : {}
|
|
2983
|
+
};
|
|
2984
|
+
})
|
|
2985
|
+
}));
|
|
2986
|
+
}
|
|
2401
2987
|
async function upariVse(prepared, artikli, nastavitve = {}) {
|
|
2402
2988
|
const izhod = [];
|
|
2403
2989
|
for await (const kos of upariArtikle(prepared, artikli, nastavitve))
|
|
@@ -2406,6 +2992,12 @@ async function upariVse(prepared, artikli, nastavitve = {}) {
|
|
|
2406
2992
|
}
|
|
2407
2993
|
export {
|
|
2408
2994
|
ENOTE_SINONIMI,
|
|
2995
|
+
PREVODI,
|
|
2996
|
+
PREVODI_VIR,
|
|
2997
|
+
STAROSTI,
|
|
2998
|
+
STOP_BESEDE,
|
|
2999
|
+
VELIKOSTI_EN,
|
|
3000
|
+
VELIKOSTI_OKRAJSAVE,
|
|
2409
3001
|
VET_NORMALIZATORJI,
|
|
2410
3002
|
VET_TABELA,
|
|
2411
3003
|
VRSTE_SINONIMI,
|
|
@@ -2416,9 +3008,14 @@ export {
|
|
|
2416
3008
|
normalizeQueryWithOpts,
|
|
2417
3009
|
oceniPar,
|
|
2418
3010
|
oznakeNormalizator,
|
|
3011
|
+
prevodiNormalizator,
|
|
2419
3012
|
pripraviVetIndeks,
|
|
3013
|
+
razdeljevalciNormalizator,
|
|
3014
|
+
starostNormalizator,
|
|
2420
3015
|
upariArtikle,
|
|
2421
3016
|
upariVse,
|
|
3017
|
+
upariVseSync,
|
|
3018
|
+
velikostNormalizator,
|
|
2422
3019
|
vetArtikelSpec,
|
|
2423
3020
|
vetQueryOpts,
|
|
2424
3021
|
vrstaNormalizator,
|