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/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
- return `${linija.toUpperCase()} ${ujemanje.toUpperCase()}`;
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 q = razcleniNaziv(poizvedba);
1995
- const c = razcleniNaziv(kandidat);
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 qTok = [...new Set([...q.besede, ...q.zivalskeVrste, ...q.dozirneOblike].map((t) => t.toLowerCase()))];
2008
- const cTok = [...new Set([...c.besede, ...c.zivalskeVrste, ...c.dozirneOblike].map((t) => t.toLowerCase()))];
2009
- const qStevci = new Map;
2010
- for (const t of qTok)
2011
- qStevci.set(t, (qStevci.get(t) ?? 0) + 1);
2012
- const cStevci = new Map;
2013
- for (const t of cTok)
2014
- cStevci.set(t, (cStevci.get(t) ?? 0) + 1);
2015
- const porabljeno = new Map;
2016
- let ujemajoce = 0;
2017
- let ujemajoceCele = 0;
2018
- const skupne = [];
2019
- for (const [qZeton, kolikoQ] of qStevci) {
2020
- let potrebnih = kolikoQ;
2021
- for (const [cZeton, kolikoC] of cStevci) {
2022
- if (potrebnih === 0)
2023
- break;
2024
- const prostih = kolikoC - (porabljeno.get(cZeton) ?? 0);
2025
- if (prostih <= 0)
2026
- continue;
2027
- const cela = qZeton === cZeton;
2028
- const predpona = !cela && (cZeton.startsWith(qZeton) || qZeton.startsWith(cZeton));
2029
- const razmerje = Math.min(qZeton.length, cZeton.length) / Math.max(qZeton.length, cZeton.length);
2030
- if (!cela && !(predpona && razmerje >= n.predponaDelez))
2031
- continue;
2032
- const vzem = Math.min(potrebnih, prostih);
2033
- porabljeno.set(cZeton, (porabljeno.get(cZeton) ?? 0) + vzem);
2034
- ujemajoce += vzem;
2035
- if (cela)
2036
- ujemajoceCele += vzem;
2037
- if (!skupne.includes(qZeton))
2038
- skupne.push(qZeton);
2039
- potrebnih -= vzem;
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
- const pokritostKandidata = cTok.length ? ujemajoce / cTok.length : 0;
2043
- const pokritostPoizvedbe = qTok.length ? ujemajoce / qTok.length : 0;
2044
- const dovoljDolg = [...porabljeno.keys()].some((t) => t.length >= 5);
2045
- const popolno = pokritostKandidata === 1 && pokritostPoizvedbe === 1;
2046
- const pokritostOk = ujemajoce >= 1 && pokritostKandidata >= n.pokritostKandidata && pokritostPoizvedbe >= n.pokritostPoizvedbe && (popolno || ujemajoceCele >= 2 || dovoljDolg);
2047
- let ocena = oceniPodobnost(q, c).ocena;
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(razredi?.poizvedba?.[kljuc2]);
2052
- const b = kotSeznam(razredi?.kandidat?.[kljuc2]);
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 sprejeto = pokritostOk && ocena >= n.minOcena;
2061
- 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("; ")}` : "") : `pokritost prenizka (kandidat ${Math.round(pokritostKandidata * 100)} %, poizvedba ${Math.round(pokritostPoizvedbe * 100)} %)`;
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
- async function* matchMany(prepared, queries, options) {
2226
- const { queryOf, idOf, limit = 3, minScore = 0, kos = 50, samoEnolicno, rank, accept, opts } = options;
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 porabljeni = samoEnolicno ? new Set : undefined;
2230
- let kosZbirka = [];
2231
- for (let indeks = 0;indeks < queries.length; indeks++) {
2232
- const query = queries[indeks];
2233
- const vhod = queryOf(query);
2234
- const text = typeof vhod === "string" ? vhod : vhod.text;
2235
- const queryClasses = typeof vhod === "string" ? undefined : naSezname(vhod.classes);
2236
- const id = idOf ? idOf(query, indeks) : String(query["_id"] ?? query["id"] ?? indeks);
2237
- const poisciKandidate = (besedilo, razredi) => {
2238
- if (!besedilo.trim())
2239
- return { kandidati: [], zadetkov: 0 };
2240
- const zadetki = searchAndRankNumeric(besedilo, prepared.data, prepared.metadata, {
2241
- primaryTextFn: primaryTextOf,
2242
- ...options.exactKeysOf ? { exactKeysFn: options.exactKeysOf } : {},
2243
- ...opts ? { opts } : {},
2244
- limit: retrievalLimit
2245
- });
2246
- const poizvedbaZaDomeno = { text: besedilo, ...razredi ? { classes: razredi } : {} };
2247
- const najdeni = [];
2248
- for (const zadetek of zadetki) {
2249
- const classes = itemClasses(prepared.metadata, zadetek.id);
2250
- const kandidat = {
2251
- id: zadetek.id,
2252
- item: zadetek.item,
2253
- ...classes ? { classes } : {}
2254
- };
2255
- if (accept && !accept(kandidat, poizvedbaZaDomeno))
2256
- continue;
2257
- const ocena = rank ? rank(kandidat, poizvedbaZaDomeno) : zadetek.score;
2258
- if (ocena < minScore)
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
- kosZbirka.push({
2291
- id,
2292
- ...queryClasses ? { queryClasses } : {},
2293
- kandidati
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
- accept: (kandidat, poizvedba) => oceni(poizvedba.text, String(kandidat.item.naziv), poizvedba.classes, kandidat.classes).sprejeto,
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,