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.cjs
CHANGED
|
@@ -40,6 +40,12 @@ var __export = (target, all) => {
|
|
|
40
40
|
var exports_vet = {};
|
|
41
41
|
__export(exports_vet, {
|
|
42
42
|
ENOTE_SINONIMI: () => ENOTE_SINONIMI,
|
|
43
|
+
PREVODI: () => PREVODI,
|
|
44
|
+
PREVODI_VIR: () => PREVODI_VIR,
|
|
45
|
+
STAROSTI: () => STAROSTI,
|
|
46
|
+
STOP_BESEDE: () => STOP_BESEDE,
|
|
47
|
+
VELIKOSTI_EN: () => VELIKOSTI_EN,
|
|
48
|
+
VELIKOSTI_OKRAJSAVE: () => VELIKOSTI_OKRAJSAVE,
|
|
43
49
|
VET_NORMALIZATORJI: () => VET_NORMALIZATORJI,
|
|
44
50
|
VET_TABELA: () => VET_TABELA,
|
|
45
51
|
VRSTE_SINONIMI: () => VRSTE_SINONIMI,
|
|
@@ -50,9 +56,14 @@ __export(exports_vet, {
|
|
|
50
56
|
normalizeQueryWithOpts: () => normalizeQueryWithOpts,
|
|
51
57
|
oceniPar: () => oceniPar,
|
|
52
58
|
oznakeNormalizator: () => oznakeNormalizator,
|
|
59
|
+
prevodiNormalizator: () => prevodiNormalizator,
|
|
53
60
|
pripraviVetIndeks: () => pripraviVetIndeks,
|
|
61
|
+
razdeljevalciNormalizator: () => razdeljevalciNormalizator,
|
|
62
|
+
starostNormalizator: () => starostNormalizator,
|
|
54
63
|
upariArtikle: () => upariArtikle,
|
|
55
64
|
upariVse: () => upariVse,
|
|
65
|
+
upariVseSync: () => upariVseSync,
|
|
66
|
+
velikostNormalizator: () => velikostNormalizator,
|
|
56
67
|
vetArtikelSpec: () => vetArtikelSpec,
|
|
57
68
|
vetQueryOpts: () => vetQueryOpts,
|
|
58
69
|
vrstaNormalizator: () => vrstaNormalizator,
|
|
@@ -239,6 +250,369 @@ dodajVrsto("jelen", ["jelena", "jeleni", "jelenov", "jelenjad"]);
|
|
|
239
250
|
dodajVrsto("srna", ["srne", "srni", "srn", "srnjak", "srnjaka", "srnjaki"]);
|
|
240
251
|
dodajVrsto("divjad", ["divjadi", "divjadjo"]);
|
|
241
252
|
|
|
253
|
+
// src/vet/data/prevodi.ts
|
|
254
|
+
var PREVODI = {
|
|
255
|
+
dog: "pes",
|
|
256
|
+
dogs: "pes",
|
|
257
|
+
pse: "pes",
|
|
258
|
+
puppy: "mladič",
|
|
259
|
+
puppies: "mladič",
|
|
260
|
+
cat: "mačka",
|
|
261
|
+
cats: "mačka",
|
|
262
|
+
kitten: "mladič",
|
|
263
|
+
kittens: "mladič",
|
|
264
|
+
rabbit: "zajec",
|
|
265
|
+
bunny: "zajec",
|
|
266
|
+
chicken: "piščanec",
|
|
267
|
+
chick: "piščanec",
|
|
268
|
+
hen: "kokoš",
|
|
269
|
+
turkey: "puran",
|
|
270
|
+
duck: "raca",
|
|
271
|
+
goose: "gos",
|
|
272
|
+
quail: "prepelica",
|
|
273
|
+
pheasant: "fazan",
|
|
274
|
+
beef: "govedina",
|
|
275
|
+
veal: "teletina",
|
|
276
|
+
pork: "svinjina",
|
|
277
|
+
lamb: "jagnjetina",
|
|
278
|
+
mutton: "jagnjetina",
|
|
279
|
+
sheep: "ovca",
|
|
280
|
+
goat: "koza",
|
|
281
|
+
horse: "konj",
|
|
282
|
+
buffalo: "bivol",
|
|
283
|
+
bison: "bizon",
|
|
284
|
+
venison: "divjačina",
|
|
285
|
+
boar: "divji prašič",
|
|
286
|
+
salmon: "losos",
|
|
287
|
+
trout: "postrv",
|
|
288
|
+
cod: "polenovka",
|
|
289
|
+
codfish: "polenovka",
|
|
290
|
+
hake: "oslič",
|
|
291
|
+
herring: "sled",
|
|
292
|
+
sardine: "sardela",
|
|
293
|
+
anchovy: "inčun",
|
|
294
|
+
mackerel: "skuša",
|
|
295
|
+
shrimp: "rakci",
|
|
296
|
+
prawn: "rakci",
|
|
297
|
+
krill: "kril",
|
|
298
|
+
crab: "rakovice",
|
|
299
|
+
lobster: "jastog",
|
|
300
|
+
squid: "lignji",
|
|
301
|
+
octopus: "hobotnica",
|
|
302
|
+
clam: "skoljke",
|
|
303
|
+
mussel: "skoljke",
|
|
304
|
+
egg: "jajce",
|
|
305
|
+
eggs: "jajce",
|
|
306
|
+
milk: "mleko",
|
|
307
|
+
cheese: "sir",
|
|
308
|
+
yogurt: "jogurt",
|
|
309
|
+
insect: "žuželke",
|
|
310
|
+
fish: "riba",
|
|
311
|
+
salmonoil: "ribje olje",
|
|
312
|
+
rice: "riž",
|
|
313
|
+
potato: "krompir",
|
|
314
|
+
potatoes: "krompir",
|
|
315
|
+
potatoe: "krompir",
|
|
316
|
+
grain: "žita",
|
|
317
|
+
grains: "žita",
|
|
318
|
+
wheat: "pšenica",
|
|
319
|
+
corn: "koruza",
|
|
320
|
+
maize: "koruza",
|
|
321
|
+
oat: "oves",
|
|
322
|
+
oats: "oves",
|
|
323
|
+
barley: "ječmen",
|
|
324
|
+
rye: "rž",
|
|
325
|
+
spelt: "pira",
|
|
326
|
+
spelled: "pira",
|
|
327
|
+
millet: "proso",
|
|
328
|
+
sorghum: "sirek",
|
|
329
|
+
quinoa: "kvinoja",
|
|
330
|
+
buckwheat: "ajda",
|
|
331
|
+
pea: "grah",
|
|
332
|
+
peas: "grah",
|
|
333
|
+
chickpea: "čiček",
|
|
334
|
+
lentil: "leča",
|
|
335
|
+
bean: "fižol",
|
|
336
|
+
beans: "fižol",
|
|
337
|
+
carrot: "korenje",
|
|
338
|
+
carrots: "korenje",
|
|
339
|
+
spinach: "špinača",
|
|
340
|
+
broccoli: "brokoli",
|
|
341
|
+
tomato: "paradižnik",
|
|
342
|
+
tomatoes: "paradižnik",
|
|
343
|
+
beet: "pesa",
|
|
344
|
+
beetroot: "pesa",
|
|
345
|
+
pumpkin: "buča",
|
|
346
|
+
courgette: "bučke",
|
|
347
|
+
zucchini: "bučke",
|
|
348
|
+
kale: "ohrovt",
|
|
349
|
+
cabbage: "zelje",
|
|
350
|
+
apple: "jabolko",
|
|
351
|
+
apples: "jabolko",
|
|
352
|
+
pomegranate: "granatno jabolko",
|
|
353
|
+
pomeg: "granatno jabolko",
|
|
354
|
+
orange: "pomaranča",
|
|
355
|
+
lemon: "limona",
|
|
356
|
+
pear: "hruška",
|
|
357
|
+
blueberry: "borovnica",
|
|
358
|
+
blueberries: "borovnica",
|
|
359
|
+
cranberry: "brusnica",
|
|
360
|
+
cranberries: "brusnica",
|
|
361
|
+
raspberry: "malina",
|
|
362
|
+
strawberry: "jagoda",
|
|
363
|
+
blackberry: "robida",
|
|
364
|
+
cherry: "češnja",
|
|
365
|
+
apricot: "marelica",
|
|
366
|
+
peach: "breskev",
|
|
367
|
+
pineapple: "ananas",
|
|
368
|
+
papaya: "papaja",
|
|
369
|
+
kiwi: "kivi",
|
|
370
|
+
melon: "melona",
|
|
371
|
+
melons: "melona",
|
|
372
|
+
watermelon: "lubenica",
|
|
373
|
+
cantaloupe: "melona",
|
|
374
|
+
coconut: "kokoš",
|
|
375
|
+
almond: "mandelj",
|
|
376
|
+
walnuts: "oreski",
|
|
377
|
+
peanut: "arašid",
|
|
378
|
+
seaweed: "alge",
|
|
379
|
+
kelp: "alge",
|
|
380
|
+
yucca: "juka",
|
|
381
|
+
alfalfa: "lucerna",
|
|
382
|
+
mint: "meta",
|
|
383
|
+
chamomile: "kamilica",
|
|
384
|
+
fennel: "komarček",
|
|
385
|
+
parsley: "peteršilj",
|
|
386
|
+
garlic: "česen",
|
|
387
|
+
flaxseed: "laneno seme",
|
|
388
|
+
flax: "lan",
|
|
389
|
+
sesame: "sezam",
|
|
390
|
+
sunflower: "sončnice",
|
|
391
|
+
herbal: "zeleni",
|
|
392
|
+
tablet: "tbl",
|
|
393
|
+
tablets: "tbl",
|
|
394
|
+
capsule: "kps",
|
|
395
|
+
capsules: "kps",
|
|
396
|
+
injection: "inj",
|
|
397
|
+
injections: "inj",
|
|
398
|
+
suspension: "suspenzija",
|
|
399
|
+
solution: "raztopina",
|
|
400
|
+
powder: "prašek",
|
|
401
|
+
granulate: "granulat",
|
|
402
|
+
granules: "granulat",
|
|
403
|
+
drops: "kapljice",
|
|
404
|
+
shampoo: "šampon",
|
|
405
|
+
conditioner: "balzam",
|
|
406
|
+
paste: "pasta",
|
|
407
|
+
pate: "pašteta",
|
|
408
|
+
syrup: "sirup",
|
|
409
|
+
spray: "sprej",
|
|
410
|
+
pipette: "pipeta",
|
|
411
|
+
ampoule: "ampula",
|
|
412
|
+
vial: "viala",
|
|
413
|
+
sachet: "vrecka",
|
|
414
|
+
pouch: "vrecka",
|
|
415
|
+
can: "konzerva",
|
|
416
|
+
cans: "konzerva",
|
|
417
|
+
tin: "konzerva",
|
|
418
|
+
bag: "vrecka",
|
|
419
|
+
tube: "tuba",
|
|
420
|
+
bottle: "steklenička",
|
|
421
|
+
jar: "kozarec",
|
|
422
|
+
collar: "ovratnica",
|
|
423
|
+
harness: "ovratnica",
|
|
424
|
+
leash: "povodec",
|
|
425
|
+
lead: "povodec",
|
|
426
|
+
muzzle: "nagobcnik",
|
|
427
|
+
toy: "igraca",
|
|
428
|
+
toys: "igraca",
|
|
429
|
+
brush: "krtača",
|
|
430
|
+
comb: "glavnik",
|
|
431
|
+
clipper: "škarje",
|
|
432
|
+
scissors: "škarje",
|
|
433
|
+
wipes: "brisače",
|
|
434
|
+
pads: "blazinice",
|
|
435
|
+
biscuit: "piškot",
|
|
436
|
+
biscuits: "piškot",
|
|
437
|
+
stick: "palčka",
|
|
438
|
+
sticks: "palčka",
|
|
439
|
+
bone: "kost",
|
|
440
|
+
jerky: "suseno",
|
|
441
|
+
chew: "žvečenje",
|
|
442
|
+
chewable: "žvečljiv",
|
|
443
|
+
jelly: "žele",
|
|
444
|
+
gravy: "omaka",
|
|
445
|
+
sauce: "omaka",
|
|
446
|
+
mousse: "pena",
|
|
447
|
+
loaf: "hlod",
|
|
448
|
+
cream: "krema",
|
|
449
|
+
oil: "olje",
|
|
450
|
+
balm: "balzam",
|
|
451
|
+
tonic: "tonik",
|
|
452
|
+
lotion: "losjon",
|
|
453
|
+
urinary: "urinarne",
|
|
454
|
+
renal: "ledvično",
|
|
455
|
+
kidney: "ledvica",
|
|
456
|
+
dental: "zobno",
|
|
457
|
+
hairball: "dlake",
|
|
458
|
+
joint: "sklepi",
|
|
459
|
+
joints: "sklepi",
|
|
460
|
+
skin: "koza",
|
|
461
|
+
coat: "dlaka",
|
|
462
|
+
stomach: "želodec",
|
|
463
|
+
gastric: "prebavno",
|
|
464
|
+
digestive: "prebavni",
|
|
465
|
+
digestion: "prebava",
|
|
466
|
+
intestinal: "črevesni",
|
|
467
|
+
hepatic: "jetrni",
|
|
468
|
+
liver: "jetra",
|
|
469
|
+
cardiac: "srčni",
|
|
470
|
+
heart: "srce",
|
|
471
|
+
respiratory: "dihala",
|
|
472
|
+
breath: "dihala",
|
|
473
|
+
ear: "ušesa",
|
|
474
|
+
eye: "oci",
|
|
475
|
+
eyes: "oci",
|
|
476
|
+
oral: "oralno",
|
|
477
|
+
hypoallergenic: "hipoalergen",
|
|
478
|
+
hypoall: "hipoalergen",
|
|
479
|
+
allergenic: "alergen",
|
|
480
|
+
allergy: "alergija",
|
|
481
|
+
sensitive: "občutljiv",
|
|
482
|
+
sterilised: "steriliziran",
|
|
483
|
+
sterilized: "steriliziran",
|
|
484
|
+
steril: "steriliziran",
|
|
485
|
+
neutered: "steriliziran",
|
|
486
|
+
neutred: "steriliziran",
|
|
487
|
+
neuter: "steriliziran",
|
|
488
|
+
castrated: "kastriran",
|
|
489
|
+
obesity: "debelost",
|
|
490
|
+
obese: "debel",
|
|
491
|
+
overweight: "predebel",
|
|
492
|
+
diabetic: "diabetik",
|
|
493
|
+
mobility: "mobilnost",
|
|
494
|
+
weight: "teža",
|
|
495
|
+
growth: "rast",
|
|
496
|
+
recovery: "okrevanje",
|
|
497
|
+
convalescence: "okrevanje",
|
|
498
|
+
calm: "pomiritev",
|
|
499
|
+
relaxing: "pomiritev",
|
|
500
|
+
vitality: "vitalnost",
|
|
501
|
+
immune: "imunski",
|
|
502
|
+
immunity: "imunost",
|
|
503
|
+
supplement: "dodatek",
|
|
504
|
+
supplements: "dodatek",
|
|
505
|
+
probiotic: "probiotik",
|
|
506
|
+
probiotics: "probiotik",
|
|
507
|
+
antioxidant: "antioksidant",
|
|
508
|
+
fibre: "vlaknine",
|
|
509
|
+
fiber: "vlaknine",
|
|
510
|
+
protein: "beljakovine",
|
|
511
|
+
fat: "maščobe",
|
|
512
|
+
ash: "pepel",
|
|
513
|
+
moisture: "vlaga",
|
|
514
|
+
veterinary: "veterinarski",
|
|
515
|
+
diet: "dieta",
|
|
516
|
+
dietary: "dietna",
|
|
517
|
+
adult: "odrasel",
|
|
518
|
+
wet: "mokra",
|
|
519
|
+
dry: "suha",
|
|
520
|
+
food: "hrana",
|
|
521
|
+
snack: "priboljsek",
|
|
522
|
+
snacks: "priboljsek",
|
|
523
|
+
treat: "priboljsek",
|
|
524
|
+
treats: "priboljsek",
|
|
525
|
+
complete: "popolna",
|
|
526
|
+
balanced: "uravnotežena",
|
|
527
|
+
daily: "dnevni",
|
|
528
|
+
special: "specialni",
|
|
529
|
+
intensive: "intenzivni",
|
|
530
|
+
support: "podpora",
|
|
531
|
+
protection: "zaščita",
|
|
532
|
+
control: "nadzor",
|
|
533
|
+
hygiene: "higiena",
|
|
534
|
+
fresh: "sveze",
|
|
535
|
+
grainfree: "brez zita",
|
|
536
|
+
bite: "grizljaj",
|
|
537
|
+
flavour: "okus",
|
|
538
|
+
flavor: "okus",
|
|
539
|
+
taste: "okus",
|
|
540
|
+
chickpomeg: "piscanec granatno jabolko",
|
|
541
|
+
chpom: "piscanec granatno jabolko",
|
|
542
|
+
cant: "melona",
|
|
543
|
+
cantmelon: "melona",
|
|
544
|
+
neut: "steriliziran",
|
|
545
|
+
vacc: "cepivo",
|
|
546
|
+
vaccin: "cepivo",
|
|
547
|
+
vaccine: "cepivo",
|
|
548
|
+
haem: "hem",
|
|
549
|
+
canine: "pasji",
|
|
550
|
+
feline: "mačji",
|
|
551
|
+
satiety: "sitost",
|
|
552
|
+
gastrointestinal: "prebavni",
|
|
553
|
+
pisc: "piščanec",
|
|
554
|
+
piscji: "piščanec",
|
|
555
|
+
krom: "krompir",
|
|
556
|
+
kromp: "krompir",
|
|
557
|
+
granat: "granatno",
|
|
558
|
+
ovck: "ovčka",
|
|
559
|
+
priboljski: "priboljšek"
|
|
560
|
+
};
|
|
561
|
+
var STOP_BESEDE = [
|
|
562
|
+
"and",
|
|
563
|
+
"with",
|
|
564
|
+
"for",
|
|
565
|
+
"the",
|
|
566
|
+
"of",
|
|
567
|
+
"in",
|
|
568
|
+
"on",
|
|
569
|
+
"to",
|
|
570
|
+
"from",
|
|
571
|
+
"per",
|
|
572
|
+
"care",
|
|
573
|
+
"health",
|
|
574
|
+
"healthy",
|
|
575
|
+
"premium",
|
|
576
|
+
"quality",
|
|
577
|
+
"test"
|
|
578
|
+
];
|
|
579
|
+
var STAROSTI = {
|
|
580
|
+
mladic: "mladič",
|
|
581
|
+
mladicek: "mladič",
|
|
582
|
+
puppy: "mladič",
|
|
583
|
+
puppies: "mladič",
|
|
584
|
+
kitten: "mladič",
|
|
585
|
+
kittens: "mladič",
|
|
586
|
+
junior: "mladič",
|
|
587
|
+
juniors: "mladič",
|
|
588
|
+
baby: "mladič",
|
|
589
|
+
weaning: "mladič",
|
|
590
|
+
odrasel: "odrasel",
|
|
591
|
+
odrasli: "odrasel",
|
|
592
|
+
adult: "odrasel",
|
|
593
|
+
adults: "odrasel",
|
|
594
|
+
mature: "odrasel",
|
|
595
|
+
senior: "senior",
|
|
596
|
+
seniors: "senior",
|
|
597
|
+
seniorji: "senior",
|
|
598
|
+
geriatric: "senior",
|
|
599
|
+
aged: "senior"
|
|
600
|
+
};
|
|
601
|
+
var VELIKOSTI_EN = {
|
|
602
|
+
small: "s",
|
|
603
|
+
medium: "m",
|
|
604
|
+
large: "l",
|
|
605
|
+
giant: "xl",
|
|
606
|
+
xlarge: "xl",
|
|
607
|
+
extralarge: "xl"
|
|
608
|
+
};
|
|
609
|
+
var VELIKOSTI_OKRAJSAVE = {
|
|
610
|
+
med: "medium",
|
|
611
|
+
max: "maxi",
|
|
612
|
+
min: "mini"
|
|
613
|
+
};
|
|
614
|
+
var PREVODI_VIR = "ročno kurirano 2026-10-04 (besedišče izmerjeno v tackakp + SI_TACKA)";
|
|
615
|
+
|
|
242
616
|
// src/vet/data/znamke.gen.ts
|
|
243
617
|
var ZNAMKE_GEN = {
|
|
244
618
|
vir: "/Users/primozk/devmt/panthenImport",
|
|
@@ -986,6 +1360,14 @@ function kljucBesede(beseda) {
|
|
|
986
1360
|
return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+$/, "");
|
|
987
1361
|
}
|
|
988
1362
|
var BESEDA = /(?<![\p{L}\p{N}])([\p{L}\p{N}]+)(?![\p{L}\p{N}])/gu;
|
|
1363
|
+
var BESEDA_Z_VEZNIKOM = /(?<![\p{L}\p{N}])([\p{L}]+)\s*[&+]\s*([\p{L}]+)(?![\p{L}\p{N}])/gu;
|
|
1364
|
+
var VELIKOSTNE_BESEDE = new Set([
|
|
1365
|
+
...Object.keys(VELIKOSTI_OKRAJSAVE),
|
|
1366
|
+
...Object.keys(VELIKOSTI_EN),
|
|
1367
|
+
"mini",
|
|
1368
|
+
"maxi",
|
|
1369
|
+
...Object.keys(VELIKOSTI_SINONIMI)
|
|
1370
|
+
]);
|
|
989
1371
|
function kanonicaVelika(enota) {
|
|
990
1372
|
return enota.toUpperCase();
|
|
991
1373
|
}
|
|
@@ -1071,19 +1453,90 @@ var vrstaNormalizator = {
|
|
|
1071
1453
|
return najdene.length ? { text: ocisceno, classes: { vrsta: najdene } } : ocisceno;
|
|
1072
1454
|
}
|
|
1073
1455
|
};
|
|
1074
|
-
var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2));
|
|
1456
|
+
var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2 && !PREVODI[t]));
|
|
1457
|
+
var razdeljevalciNormalizator = {
|
|
1458
|
+
fn: (v) => {
|
|
1459
|
+
let spremenjeno = false;
|
|
1460
|
+
let besedilo = v.replace(BESEDA_Z_VEZNIKOM, (ujemanje, a, b) => {
|
|
1461
|
+
const ka = kljucBesede(a);
|
|
1462
|
+
const kb = kljucBesede(b);
|
|
1463
|
+
if (!VELIKOSTNE_BESEDE.has(ka) || !VELIKOSTNE_BESEDE.has(kb))
|
|
1464
|
+
return ujemanje;
|
|
1465
|
+
const razsiri = (k) => VELIKOSTI_OKRAJSAVE[k] ?? VELIKOSTI_EN[k] ?? k;
|
|
1466
|
+
spremenjeno = true;
|
|
1467
|
+
return `${razsiri(ka)} ${razsiri(kb)}`;
|
|
1468
|
+
});
|
|
1469
|
+
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, " ");
|
|
1470
|
+
if (zLocili !== besedilo)
|
|
1471
|
+
spremenjeno = true;
|
|
1472
|
+
besedilo = zLocili;
|
|
1473
|
+
return spremenjeno ? besedilo.replace(/\s+/g, " ").trim() : undefined;
|
|
1474
|
+
}
|
|
1475
|
+
};
|
|
1476
|
+
var PREVODI_MAP = new Map(Object.entries(PREVODI));
|
|
1477
|
+
var STOP_MAP = new Set(STOP_BESEDE);
|
|
1478
|
+
var prevodiNormalizator = {
|
|
1479
|
+
fn: (v) => {
|
|
1480
|
+
let spremenjeno = false;
|
|
1481
|
+
const izhod = v.replace(BESEDA, (ujemanje) => {
|
|
1482
|
+
const kljuc = kljucBesede(ujemanje);
|
|
1483
|
+
if (STOP_MAP.has(kljuc)) {
|
|
1484
|
+
spremenjeno = true;
|
|
1485
|
+
return " ";
|
|
1486
|
+
}
|
|
1487
|
+
const prevod = PREVODI_MAP.get(kljuc);
|
|
1488
|
+
if (!prevod)
|
|
1489
|
+
return ujemanje;
|
|
1490
|
+
spremenjeno = true;
|
|
1491
|
+
return prevod.toUpperCase();
|
|
1492
|
+
});
|
|
1493
|
+
return spremenjeno ? izhod.replace(/\s+/g, " ").trim() : undefined;
|
|
1494
|
+
}
|
|
1495
|
+
};
|
|
1496
|
+
var starostNormalizator = {
|
|
1497
|
+
fn: (v) => {
|
|
1498
|
+
const najdene = [];
|
|
1499
|
+
const izhod = v.replace(BESEDA, (ujemanje) => {
|
|
1500
|
+
const starost = STAROSTI[kljucBesede(ujemanje)];
|
|
1501
|
+
if (!starost)
|
|
1502
|
+
return ujemanje;
|
|
1503
|
+
if (!najdene.includes(starost))
|
|
1504
|
+
najdene.push(starost);
|
|
1505
|
+
return " ";
|
|
1506
|
+
});
|
|
1507
|
+
if (!najdene.length)
|
|
1508
|
+
return;
|
|
1509
|
+
return { text: izhod.replace(/\s+/g, " ").trim(), classes: { starost: najdene } };
|
|
1510
|
+
}
|
|
1511
|
+
};
|
|
1075
1512
|
var VRSTE_ZA_RAZRED = new Set(["pes", "macka"]);
|
|
1076
1513
|
var OKRAJSAVE_ZNAMK = new Map;
|
|
1077
1514
|
var LINIJE_ZNAMK = new Map;
|
|
1515
|
+
var ZNANE_ZNAMKE = new Map([["n&d", "NATURAL DELICIOUS"]]);
|
|
1516
|
+
var OBIČAJNE_BESEDE = new Set([
|
|
1517
|
+
...Object.keys(PREVODI),
|
|
1518
|
+
...STOP_BESEDE,
|
|
1519
|
+
...Object.keys(STAROSTI),
|
|
1520
|
+
...Object.keys(VELIKOSTI_EN),
|
|
1521
|
+
...Object.keys(VELIKOSTI_SINONIMI),
|
|
1522
|
+
...Object.keys(VRSTE_SINONIMI)
|
|
1523
|
+
]);
|
|
1524
|
+
var BESEDE_ZNAMK = new Set(ZNAMKE_GEN.okrajsave.flatMap((o) => o.znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u)).filter(Boolean));
|
|
1078
1525
|
for (const zapis of ZNAMKE_GEN.okrajsave) {
|
|
1079
1526
|
const kljuc = zapis.okrajsava.toLowerCase();
|
|
1080
1527
|
if (zapis.zaupanje === "splet")
|
|
1081
1528
|
continue;
|
|
1529
|
+
if (kljuc.length <= 4 && OBIČAJNE_BESEDE.has(kljuc))
|
|
1530
|
+
continue;
|
|
1531
|
+
if (BESEDE_ZNAMK.has(kljuc))
|
|
1532
|
+
continue;
|
|
1082
1533
|
if (!OKRAJSAVE_ZNAMK.has(kljuc))
|
|
1083
1534
|
OKRAJSAVE_ZNAMK.set(kljuc, zapis.znamka);
|
|
1084
1535
|
}
|
|
1085
1536
|
for (const linija of ZNAMKE_GEN.linije) {
|
|
1086
1537
|
const kljuc = linija.linija.toLowerCase();
|
|
1538
|
+
if (OBIČAJNE_BESEDE.has(kljuc))
|
|
1539
|
+
continue;
|
|
1087
1540
|
if (!LINIJE_ZNAMK.has(kljuc))
|
|
1088
1541
|
LINIJE_ZNAMK.set(kljuc, linija.znamka);
|
|
1089
1542
|
}
|
|
@@ -1092,7 +1545,7 @@ var znamkaNormalizator = {
|
|
|
1092
1545
|
let spremenjeno = false;
|
|
1093
1546
|
const izhod = v.replace(/(?<![\p{L}\p{N}])([\p{L}\p{N}&]+)(?![\p{L}\p{N}])/gu, (ujemanje) => {
|
|
1094
1547
|
const kljuc = kljucBesede(ujemanje);
|
|
1095
|
-
const znamka = OKRAJSAVE_ZNAMK.get(kljuc);
|
|
1548
|
+
const znamka = ZNANE_ZNAMKE.get(kljuc) ?? OKRAJSAVE_ZNAMK.get(kljuc);
|
|
1096
1549
|
if (znamka) {
|
|
1097
1550
|
const besedeCilja = znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
1098
1551
|
if (besedeCilja.includes(kljuc))
|
|
@@ -1103,7 +1556,8 @@ var znamkaNormalizator = {
|
|
|
1103
1556
|
const linija = LINIJE_ZNAMK.get(kljuc);
|
|
1104
1557
|
if (linija) {
|
|
1105
1558
|
spremenjeno = true;
|
|
1106
|
-
|
|
1559
|
+
const ze = v.toLowerCase().includes(linija.toLowerCase());
|
|
1560
|
+
return ze ? ujemanje.toUpperCase() : `${linija.toUpperCase()} ${ujemanje.toUpperCase()}`;
|
|
1107
1561
|
}
|
|
1108
1562
|
return ujemanje;
|
|
1109
1563
|
});
|
|
@@ -1137,7 +1591,7 @@ var velikostNormalizator = {
|
|
|
1137
1591
|
const najdene = [];
|
|
1138
1592
|
const izhod = v.replace(BESEDA, (ujemanje, ...args) => {
|
|
1139
1593
|
const kljuc = kljucBesede(ujemanje);
|
|
1140
|
-
const velikost = VELIKOSTI_SINONIMI[kljuc];
|
|
1594
|
+
const velikost = VELIKOSTI_SINONIMI[kljuc] ?? VELIKOSTI_EN[kljuc];
|
|
1141
1595
|
if (!velikost)
|
|
1142
1596
|
return ujemanje;
|
|
1143
1597
|
const mesto = args[args.length - 2];
|
|
@@ -1191,11 +1645,14 @@ var VET_NORMALIZATORJI = [
|
|
|
1191
1645
|
kodiranjeNormalizator,
|
|
1192
1646
|
decimalkeNormalizator,
|
|
1193
1647
|
pantheonOznakaNormalizator,
|
|
1194
|
-
tipskeOznakeNormalizator,
|
|
1195
1648
|
enoteNormalizator,
|
|
1196
1649
|
znamkaNormalizator,
|
|
1650
|
+
razdeljevalciNormalizator,
|
|
1651
|
+
prevodiNormalizator,
|
|
1652
|
+
tipskeOznakeNormalizator,
|
|
1197
1653
|
kolicinaNormalizator,
|
|
1198
1654
|
velikostNormalizator,
|
|
1655
|
+
starostNormalizator,
|
|
1199
1656
|
vrstaNormalizator,
|
|
1200
1657
|
oznakeNormalizator
|
|
1201
1658
|
];
|
|
@@ -1204,6 +1661,10 @@ var VET_TABELA = {
|
|
|
1204
1661
|
linije: LINIJE_ZNAMK,
|
|
1205
1662
|
dobavitelji: DOBAVITELJI,
|
|
1206
1663
|
oznake: OZNAKE,
|
|
1664
|
+
prevodi: PREVODI_MAP,
|
|
1665
|
+
stopBesede: STOP_MAP,
|
|
1666
|
+
starosti: STAROSTI,
|
|
1667
|
+
velikostiEn: VELIKOSTI_EN,
|
|
1207
1668
|
vir: ZNAMKE_GEN.vir
|
|
1208
1669
|
};
|
|
1209
1670
|
// src/vet/spec.ts
|
|
@@ -2005,14 +2466,17 @@ var KAZEN = {
|
|
|
2005
2466
|
kolicina: 150,
|
|
2006
2467
|
pakiranje: 150,
|
|
2007
2468
|
velikost: 300,
|
|
2008
|
-
pantheon: 100
|
|
2469
|
+
pantheon: 100,
|
|
2470
|
+
starost: 400
|
|
2009
2471
|
};
|
|
2472
|
+
var VETO_RAZREDI = new Set(["vrsta"]);
|
|
2010
2473
|
var BONUS = {
|
|
2011
2474
|
razpon: 150,
|
|
2012
2475
|
vrsta: 200,
|
|
2013
2476
|
kolicina: 100,
|
|
2014
2477
|
pakiranje: 100,
|
|
2015
|
-
velikost: 150
|
|
2478
|
+
velikost: 150,
|
|
2479
|
+
starost: 200
|
|
2016
2480
|
};
|
|
2017
2481
|
function kotSeznam(v) {
|
|
2018
2482
|
if (v === undefined)
|
|
@@ -2024,6 +2488,32 @@ function staVNasprotju(a, b) {
|
|
|
2024
2488
|
return false;
|
|
2025
2489
|
return !a.some((x) => b.includes(x));
|
|
2026
2490
|
}
|
|
2491
|
+
var NORMALIZIRANO = new Map;
|
|
2492
|
+
function normalizirajNaziv(naziv) {
|
|
2493
|
+
const shranjeno = NORMALIZIRANO.get(naziv);
|
|
2494
|
+
if (shranjeno)
|
|
2495
|
+
return shranjeno;
|
|
2496
|
+
let text = naziv;
|
|
2497
|
+
const classes = {};
|
|
2498
|
+
for (const n of VET_NORMALIZATORJI) {
|
|
2499
|
+
const r = n.fn(text, "naziv");
|
|
2500
|
+
if (r === undefined)
|
|
2501
|
+
continue;
|
|
2502
|
+
if (typeof r === "string") {
|
|
2503
|
+
text = r;
|
|
2504
|
+
continue;
|
|
2505
|
+
}
|
|
2506
|
+
text = r.text;
|
|
2507
|
+
for (const [kljuc, vrednost] of Object.entries(r.classes ?? {})) {
|
|
2508
|
+
classes[kljuc] = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
|
|
2509
|
+
}
|
|
2510
|
+
}
|
|
2511
|
+
const rezultat = { text: text.replace(/\s+/g, " ").trim(), classes };
|
|
2512
|
+
if (NORMALIZIRANO.size > 60000)
|
|
2513
|
+
NORMALIZIRANO.clear();
|
|
2514
|
+
NORMALIZIRANO.set(naziv, rezultat);
|
|
2515
|
+
return rezultat;
|
|
2516
|
+
}
|
|
2027
2517
|
function kljuc(beseda) {
|
|
2028
2518
|
return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "");
|
|
2029
2519
|
}
|
|
@@ -2053,8 +2543,16 @@ function prestaneVratar(besedePoizvedbe, besedeKandidata) {
|
|
|
2053
2543
|
}
|
|
2054
2544
|
function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
|
|
2055
2545
|
const n = { ...PRIVZETO, ...nastavitve };
|
|
2056
|
-
const
|
|
2057
|
-
const
|
|
2546
|
+
const qNorm = normalizirajNaziv(poizvedba);
|
|
2547
|
+
const cNorm = normalizirajNaziv(kandidat);
|
|
2548
|
+
const q = import_cry_vetzdravila.razcleniNaziv(qNorm.text);
|
|
2549
|
+
const c = import_cry_vetzdravila.razcleniNaziv(cNorm.text);
|
|
2550
|
+
const qSurov = import_cry_vetzdravila.razcleniNaziv(poizvedba);
|
|
2551
|
+
const cSurov = import_cry_vetzdravila.razcleniNaziv(kandidat);
|
|
2552
|
+
const razrediSkupni = {
|
|
2553
|
+
poizvedba: { ...qNorm.classes, ...razredi?.poizvedba ?? {} },
|
|
2554
|
+
kandidat: { ...cNorm.classes, ...razredi?.kandidat ?? {} }
|
|
2555
|
+
};
|
|
2058
2556
|
const prazna = {
|
|
2059
2557
|
ocena: 0,
|
|
2060
2558
|
sprejeto: false,
|
|
@@ -2066,52 +2564,85 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
|
|
|
2066
2564
|
};
|
|
2067
2565
|
if (!prestaneVratar(q.besede, c.besede))
|
|
2068
2566
|
return prazna;
|
|
2069
|
-
const
|
|
2070
|
-
const
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
|
|
2074
|
-
|
|
2075
|
-
|
|
2076
|
-
|
|
2077
|
-
|
|
2078
|
-
|
|
2079
|
-
|
|
2080
|
-
|
|
2081
|
-
|
|
2082
|
-
|
|
2083
|
-
|
|
2084
|
-
|
|
2085
|
-
|
|
2086
|
-
|
|
2087
|
-
|
|
2088
|
-
|
|
2089
|
-
|
|
2090
|
-
|
|
2091
|
-
|
|
2092
|
-
|
|
2093
|
-
|
|
2094
|
-
|
|
2095
|
-
|
|
2096
|
-
|
|
2097
|
-
|
|
2098
|
-
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
|
|
2567
|
+
const vrednostiRazredov = (m) => Object.values(m).flat().map((v) => String(v).toLowerCase()).filter((v) => v.length > 0);
|
|
2568
|
+
const qSurovTok = [
|
|
2569
|
+
...new Set([
|
|
2570
|
+
...[...qSurov.besede, ...qSurov.zivalskeVrste, ...qSurov.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2571
|
+
...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
|
|
2572
|
+
])
|
|
2573
|
+
];
|
|
2574
|
+
const cSurovTok = [
|
|
2575
|
+
...new Set([
|
|
2576
|
+
...[...cSurov.besede, ...cSurov.zivalskeVrste, ...cSurov.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2577
|
+
...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
|
|
2578
|
+
])
|
|
2579
|
+
];
|
|
2580
|
+
const qTok = [
|
|
2581
|
+
...new Set([
|
|
2582
|
+
...[...q.besede, ...q.zivalskeVrste, ...q.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2583
|
+
...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
|
|
2584
|
+
])
|
|
2585
|
+
];
|
|
2586
|
+
const cTok = [
|
|
2587
|
+
...new Set([
|
|
2588
|
+
...[...c.besede, ...c.zivalskeVrste, ...c.dozirneOblike].map((t) => t.toLowerCase()),
|
|
2589
|
+
...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
|
|
2590
|
+
])
|
|
2591
|
+
];
|
|
2592
|
+
const izracunajPokritost = (qZetoni, cZetoni) => {
|
|
2593
|
+
const qStevci = new Map;
|
|
2594
|
+
for (const t of qZetoni)
|
|
2595
|
+
qStevci.set(t, (qStevci.get(t) ?? 0) + 1);
|
|
2596
|
+
const cStevci = new Map;
|
|
2597
|
+
for (const t of cZetoni)
|
|
2598
|
+
cStevci.set(t, (cStevci.get(t) ?? 0) + 1);
|
|
2599
|
+
const porabljeno = new Map;
|
|
2600
|
+
let ujemajoce = 0;
|
|
2601
|
+
let ujemajoceCele = 0;
|
|
2602
|
+
const skupne2 = [];
|
|
2603
|
+
for (const [qZeton, kolikoQ] of qStevci) {
|
|
2604
|
+
let potrebnih = kolikoQ;
|
|
2605
|
+
for (const [cZeton, kolikoC] of cStevci) {
|
|
2606
|
+
if (potrebnih === 0)
|
|
2607
|
+
break;
|
|
2608
|
+
const prostih = kolikoC - (porabljeno.get(cZeton) ?? 0);
|
|
2609
|
+
if (prostih <= 0)
|
|
2610
|
+
continue;
|
|
2611
|
+
const qKljuc = kljuc(qZeton);
|
|
2612
|
+
const cKljuc = kljuc(cZeton);
|
|
2613
|
+
const cela = qKljuc === cKljuc;
|
|
2614
|
+
const predpona = !cela && (cKljuc.startsWith(qKljuc) || qKljuc.startsWith(cKljuc));
|
|
2615
|
+
const razmerje = Math.min(qKljuc.length, cKljuc.length) / Math.max(qKljuc.length, cKljuc.length);
|
|
2616
|
+
if (!cela && !(predpona && razmerje >= n.predponaDelez))
|
|
2617
|
+
continue;
|
|
2618
|
+
const vzem = Math.min(potrebnih, prostih);
|
|
2619
|
+
porabljeno.set(cZeton, (porabljeno.get(cZeton) ?? 0) + vzem);
|
|
2620
|
+
ujemajoce += vzem;
|
|
2621
|
+
if (cela)
|
|
2622
|
+
ujemajoceCele += vzem;
|
|
2623
|
+
if (!skupne2.includes(qZeton))
|
|
2624
|
+
skupne2.push(qZeton);
|
|
2625
|
+
potrebnih -= vzem;
|
|
2626
|
+
}
|
|
2102
2627
|
}
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2628
|
+
const pokritostKandidata2 = cZetoni.length ? ujemajoce / cZetoni.length : 0;
|
|
2629
|
+
const pokritostPoizvedbe2 = qZetoni.length ? ujemajoce / qZetoni.length : 0;
|
|
2630
|
+
const dovoljDolg = [...porabljeno.keys()].some((t) => kljuc(t).length >= 5);
|
|
2631
|
+
const popolno = pokritostKandidata2 === 1 && pokritostPoizvedbe2 === 1;
|
|
2632
|
+
const ok = ujemajoce >= 1 && pokritostKandidata2 >= n.pokritostKandidata && pokritostPoizvedbe2 >= n.pokritostPoizvedbe && (popolno || ujemajoceCele >= 2 || dovoljDolg);
|
|
2633
|
+
return { ok, pokritostKandidata: pokritostKandidata2, pokritostPoizvedbe: pokritostPoizvedbe2, skupne: skupne2, nasprotja: [] };
|
|
2634
|
+
};
|
|
2635
|
+
const kanonicno = izracunajPokritost(qTok, cTok);
|
|
2636
|
+
const surovo = izracunajPokritost(qSurovTok, cSurovTok);
|
|
2637
|
+
const izbrano = kanonicno.ok || kanonicno.pokritostKandidata >= surovo.pokritostKandidata ? kanonicno : surovo;
|
|
2638
|
+
const { pokritostKandidata, pokritostPoizvedbe, skupne } = izbrano;
|
|
2639
|
+
const pokritostOk = kanonicno.ok || surovo.ok;
|
|
2640
|
+
let ocena = Math.max(import_cry_vetzdravila.oceniPodobnost(q, c).ocena, import_cry_vetzdravila.oceniPodobnost(qSurov, cSurov).ocena);
|
|
2110
2641
|
const nasprotja = [];
|
|
2111
|
-
const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "pantheon"];
|
|
2642
|
+
const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "starost", "pantheon"];
|
|
2112
2643
|
for (const kljuc2 of kljuci) {
|
|
2113
|
-
const a = kotSeznam(
|
|
2114
|
-
const b = kotSeznam(
|
|
2644
|
+
const a = kotSeznam(razrediSkupni["poizvedba"]?.[kljuc2]);
|
|
2645
|
+
const b = kotSeznam(razrediSkupni["kandidat"]?.[kljuc2]);
|
|
2115
2646
|
if (staVNasprotju(a, b)) {
|
|
2116
2647
|
ocena -= KAZEN[kljuc2] ?? 0;
|
|
2117
2648
|
nasprotja.push(`${kljuc2}: ${a.join("/")} ≠ ${b.join("/")}`);
|
|
@@ -2119,8 +2650,9 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
|
|
|
2119
2650
|
ocena += BONUS[kljuc2] ?? 0;
|
|
2120
2651
|
}
|
|
2121
2652
|
}
|
|
2122
|
-
const
|
|
2123
|
-
const
|
|
2653
|
+
const veto = nasprotja.some((n2) => VETO_RAZREDI.has(n2.split(":")[0] ?? ""));
|
|
2654
|
+
const sprejeto = pokritostOk && !veto && ocena >= n.minOcena;
|
|
2655
|
+
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)} %)`;
|
|
2124
2656
|
return { ocena, sprejeto, razlog, pokritostKandidata, pokritostPoizvedbe, skupneBesede: skupne.slice(0, 5), nasprotja };
|
|
2125
2657
|
}
|
|
2126
2658
|
// src/common/numeric/scoring.ts
|
|
@@ -2284,76 +2816,87 @@ function naSezname(classes) {
|
|
|
2284
2816
|
}
|
|
2285
2817
|
return Object.keys(out).length ? out : undefined;
|
|
2286
2818
|
}
|
|
2287
|
-
|
|
2288
|
-
const { queryOf, idOf, limit = 3, minScore = 0,
|
|
2819
|
+
function matchOne(prepared, query, indeks, options, porabljeni) {
|
|
2820
|
+
const { queryOf, idOf, limit = 3, minScore = 0, rank, accept, opts } = options;
|
|
2289
2821
|
const retrievalLimit = options.retrievalLimit ?? Math.max(20, limit * 4);
|
|
2290
2822
|
const primaryTextOf = options.primaryTextOf ?? ((item) => item["naziv"]);
|
|
2291
|
-
const
|
|
2292
|
-
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
const
|
|
2299
|
-
|
|
2300
|
-
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
const
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
2312
|
-
|
|
2313
|
-
|
|
2314
|
-
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
continue;
|
|
2322
|
-
if (porabljeni?.has(zadetek.id))
|
|
2323
|
-
continue;
|
|
2324
|
-
najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
|
|
2325
|
-
}
|
|
2326
|
-
najdeni.sort((a, b) => {
|
|
2327
|
-
if (b.score !== a.score)
|
|
2328
|
-
return b.score - a.score;
|
|
2329
|
-
return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
|
|
2330
|
-
});
|
|
2331
|
-
if (najdeni.length > limit)
|
|
2332
|
-
najdeni.length = limit;
|
|
2333
|
-
return { kandidati: najdeni, zadetkov: zadetki.length };
|
|
2334
|
-
};
|
|
2335
|
-
let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
|
|
2336
|
-
const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
|
|
2337
|
-
if (poskusiAlternative && options.alternativnePoizvedbe) {
|
|
2338
|
-
for (const alternativa of options.alternativnePoizvedbe(query)) {
|
|
2339
|
-
const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
|
|
2340
|
-
if (!altBesedilo?.trim() || altBesedilo === text)
|
|
2341
|
-
continue;
|
|
2342
|
-
const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
|
|
2343
|
-
({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
|
|
2344
|
-
if (kandidati.length)
|
|
2345
|
-
break;
|
|
2346
|
-
}
|
|
2347
|
-
}
|
|
2348
|
-
if (porabljeni) {
|
|
2349
|
-
for (const kandidat of kandidati)
|
|
2350
|
-
porabljeni.add(kandidat.id);
|
|
2823
|
+
const vhod = queryOf(query);
|
|
2824
|
+
const text = typeof vhod === "string" ? vhod : vhod.text;
|
|
2825
|
+
const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
|
|
2826
|
+
const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
|
|
2827
|
+
const poisciKandidate = (besedilo, razredi) => {
|
|
2828
|
+
if (!besedilo.trim())
|
|
2829
|
+
return { kandidati: [], zadetkov: 0 };
|
|
2830
|
+
const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
|
|
2831
|
+
primaryTextFn: primaryTextOf,
|
|
2832
|
+
...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
|
|
2833
|
+
...opts ? { opts } : {},
|
|
2834
|
+
limit: retrievalLimit
|
|
2835
|
+
});
|
|
2836
|
+
const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
|
|
2837
|
+
const najdeni = [];
|
|
2838
|
+
for (const zadetek of zadetki) {
|
|
2839
|
+
const classes = itemClasses(prepared.metadata, zadetek.id);
|
|
2840
|
+
const kandidat = {
|
|
2841
|
+
id: zadetek.id,
|
|
2842
|
+
item: zadetek.item,
|
|
2843
|
+
...classes ? { classes } : {}
|
|
2844
|
+
};
|
|
2845
|
+
if (accept && !accept(kandidat, poizvedbaZaDomeno))
|
|
2846
|
+
continue;
|
|
2847
|
+
const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
|
|
2848
|
+
if (ocena < minScore)
|
|
2849
|
+
continue;
|
|
2850
|
+
if (porabljeni?.has(zadetek.id))
|
|
2851
|
+
continue;
|
|
2852
|
+
najdeni.push({ id: zadetek.id, item: zadetek.item, score: ocena, ...classes ? { classes } : {} });
|
|
2351
2853
|
}
|
|
2352
|
-
|
|
2353
|
-
|
|
2354
|
-
|
|
2355
|
-
|
|
2854
|
+
najdeni.sort((a, b) => {
|
|
2855
|
+
if (b.score !== a.score)
|
|
2856
|
+
return b.score - a.score;
|
|
2857
|
+
return (primaryTextOf(a.item) ?? "").localeCompare(primaryTextOf(b.item) ?? "");
|
|
2356
2858
|
});
|
|
2859
|
+
if (najdeni.length > limit)
|
|
2860
|
+
najdeni.length = limit;
|
|
2861
|
+
return { kandidati: najdeni, zadetkov: zadetki.length };
|
|
2862
|
+
};
|
|
2863
|
+
let { kandidati, zadetkov } = poisciKandidate(text, queryClasses);
|
|
2864
|
+
const poskusiAlternative = kandidati.length === 0 && (options.alternativneLeCeNiZadetkov ? zadetkov === 0 : true);
|
|
2865
|
+
if (poskusiAlternative && options.alternativnePoizvedbe) {
|
|
2866
|
+
for (const alternativa of options.alternativnePoizvedbe(query)) {
|
|
2867
|
+
const altBesedilo = typeof alternativa === "string" ? alternativa : alternativa.text;
|
|
2868
|
+
if (!altBesedilo?.trim() || altBesedilo === text)
|
|
2869
|
+
continue;
|
|
2870
|
+
const altRazredi = typeof alternativa === "string" ? undefined : naSezname(alternativa.classes);
|
|
2871
|
+
({ kandidati } = poisciKandidate(altBesedilo, altRazredi));
|
|
2872
|
+
if (kandidati.length)
|
|
2873
|
+
break;
|
|
2874
|
+
}
|
|
2875
|
+
}
|
|
2876
|
+
if (porabljeni) {
|
|
2877
|
+
for (const kandidat of kandidati)
|
|
2878
|
+
porabljeni.add(kandidat.id);
|
|
2879
|
+
}
|
|
2880
|
+
return {
|
|
2881
|
+
id,
|
|
2882
|
+
...queryClasses ? { queryClasses } : {},
|
|
2883
|
+
kandidati
|
|
2884
|
+
};
|
|
2885
|
+
}
|
|
2886
|
+
function matchManySync(prepared, queries, options) {
|
|
2887
|
+
const porabljeni = options.samoEnolicno ? new Set : undefined;
|
|
2888
|
+
const izhod = new Array(queries.length);
|
|
2889
|
+
for (let indeks = 0;indeks < queries.length; indeks++) {
|
|
2890
|
+
izhod[indeks] = matchOne(prepared, queries[indeks], indeks, options, porabljeni);
|
|
2891
|
+
}
|
|
2892
|
+
return izhod;
|
|
2893
|
+
}
|
|
2894
|
+
async function* matchMany(prepared, queries, options) {
|
|
2895
|
+
const kos = options.kos ?? 50;
|
|
2896
|
+
const porabljeni = options.samoEnolicno ? new Set : undefined;
|
|
2897
|
+
let kosZbirka = [];
|
|
2898
|
+
for (let indeks = 0;indeks < queries.length; indeks++) {
|
|
2899
|
+
kosZbirka.push(matchOne(prepared, queries[indeks], indeks, options, porabljeni));
|
|
2357
2900
|
if (kosZbirka.length >= kos) {
|
|
2358
2901
|
yield kosZbirka;
|
|
2359
2902
|
kosZbirka = [];
|
|
@@ -2435,7 +2978,9 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
|
|
|
2435
2978
|
opts: vetQueryOpts(),
|
|
2436
2979
|
primaryTextOf: (item) => item.naziv,
|
|
2437
2980
|
rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
|
|
2438
|
-
|
|
2981
|
+
...nastavitve.vrniNesprejete ? {} : {
|
|
2982
|
+
accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
|
|
2983
|
+
},
|
|
2439
2984
|
...uporabiZozeno ? {
|
|
2440
2985
|
alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv),
|
|
2441
2986
|
alternativneLeCeNiZadetkov: true
|
|
@@ -2460,6 +3005,58 @@ async function* upariArtikle(prepared, artikli, nastavitve = {}) {
|
|
|
2460
3005
|
yield izhod;
|
|
2461
3006
|
}
|
|
2462
3007
|
}
|
|
3008
|
+
function upariVseSync(prepared, artikli, nastavitve = {}) {
|
|
3009
|
+
const { limit = 3, retrievalLimit = 10, samoEnolicno, ocena: pragOcene } = nastavitve;
|
|
3010
|
+
const uporabiZozeno = nastavitve.zozenaPoizvedba !== false;
|
|
3011
|
+
const nazivPoId = new Map;
|
|
3012
|
+
for (const artikel of artikli)
|
|
3013
|
+
nazivPoId.set(String(artikel._id), artikel.naziv);
|
|
3014
|
+
const pomnilnik = new Map;
|
|
3015
|
+
const oceni = (poizvedba, kandidat, razrediPoizvedbe, razrediKandidata) => {
|
|
3016
|
+
const kljuc2 = `${poizvedba}\x00${kandidat}`;
|
|
3017
|
+
let rezultat = pomnilnik.get(kljuc2);
|
|
3018
|
+
if (!rezultat) {
|
|
3019
|
+
rezultat = oceniPar(poizvedba, kandidat, pragOcene, {
|
|
3020
|
+
...razrediPoizvedbe ? { poizvedba: razrediPoizvedbe } : {},
|
|
3021
|
+
...razrediKandidata ? { kandidat: razrediKandidata } : {}
|
|
3022
|
+
});
|
|
3023
|
+
pomnilnik.set(kljuc2, rezultat);
|
|
3024
|
+
}
|
|
3025
|
+
return rezultat;
|
|
3026
|
+
};
|
|
3027
|
+
const rezultati = matchManySync(prepared, artikli, {
|
|
3028
|
+
queryOf: (z) => {
|
|
3029
|
+
const { classes } = normalizeQueryWithOpts(z.naziv, vetQueryOpts());
|
|
3030
|
+
return { text: z.naziv, ...Object.keys(classes).length ? { classes } : {} };
|
|
3031
|
+
},
|
|
3032
|
+
idOf: (z) => String(z._id),
|
|
3033
|
+
limit,
|
|
3034
|
+
retrievalLimit,
|
|
3035
|
+
...samoEnolicno ? { samoEnolicno: true } : {},
|
|
3036
|
+
opts: vetQueryOpts(),
|
|
3037
|
+
primaryTextOf: (item) => item.naziv,
|
|
3038
|
+
rank: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).ocena,
|
|
3039
|
+
...nastavitve.vrniNesprejete ? {} : {
|
|
3040
|
+
accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto
|
|
3041
|
+
},
|
|
3042
|
+
...uporabiZozeno ? { alternativnePoizvedbe: (z) => zoziPoizvedbo(z.naziv), alternativneLeCeNiZadetkov: true } : {}
|
|
3043
|
+
});
|
|
3044
|
+
return rezultati.map((rezultat) => ({
|
|
3045
|
+
id: rezultat.id,
|
|
3046
|
+
kandidati: rezultat.kandidati.map((kandidat) => {
|
|
3047
|
+
const classes = itemClasses(prepared.metadata, kandidat.id);
|
|
3048
|
+
const ocena = oceni(nazivPoId.get(rezultat.id) ?? "", String(kandidat.item.naziv), rezultat.queryClasses, classes);
|
|
3049
|
+
return {
|
|
3050
|
+
id: String(kandidat.id),
|
|
3051
|
+
item: kandidat.item,
|
|
3052
|
+
score: kandidat.score,
|
|
3053
|
+
sprejeto: ocena.sprejeto,
|
|
3054
|
+
ocena,
|
|
3055
|
+
...classes ? { classes } : {}
|
|
3056
|
+
};
|
|
3057
|
+
})
|
|
3058
|
+
}));
|
|
3059
|
+
}
|
|
2463
3060
|
async function upariVse(prepared, artikli, nastavitve = {}) {
|
|
2464
3061
|
const izhod = [];
|
|
2465
3062
|
for await (const kos of upariArtikle(prepared, artikli, nastavitve))
|