cry-search 2.1.1 → 2.3.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
@@ -1157,6 +1607,29 @@ function vetArtikelSpec(nastavitve = {}) {
1157
1607
  function vetQueryOpts(dodatni = {}) {
1158
1608
  return { ...dodatni, queryNormalizers: [...VET_NORMALIZATORJI, ...dodatni.queryNormalizers ?? []] };
1159
1609
  }
1610
+ var VET_ISKALNI_NORMALIZATORJI = [
1611
+ kodiranjeNormalizator,
1612
+ decimalkeNormalizator,
1613
+ enoteNormalizator,
1614
+ znamkaNormalizator,
1615
+ razdeljevalciNormalizator,
1616
+ prevodiNormalizator
1617
+ ];
1618
+ function vetIskalniSpec(nastavitve = {}) {
1619
+ const polja = nastavitve.polja ?? ["naziv"];
1620
+ return {
1621
+ searchInFields: [...polja],
1622
+ keyFields: [...nastavitve.keyFields ?? polja],
1623
+ ...nastavitve.prviTokeni !== undefined ? { firstTokensN: nastavitve.prviTokeni } : {},
1624
+ valueNormalizers: [...VET_ISKALNI_NORMALIZATORJI, ...nastavitve.dodatniNormalizatorji ?? []]
1625
+ };
1626
+ }
1627
+ function vetIskalniQueryOpts(dodatni = {}) {
1628
+ return {
1629
+ ...dodatni,
1630
+ queryNormalizers: [...VET_ISKALNI_NORMALIZATORJI, ...dodatni.queryNormalizers ?? []]
1631
+ };
1632
+ }
1160
1633
  // src/types/index.ts
1161
1634
  var DEFAULT_PHONE_FIELDS = ["telefon", "phone", "gsm", "msisdn"];
1162
1635
  var DEFAULT_FIRST_TOKENS_N = 8;
@@ -1943,14 +2416,17 @@ var KAZEN = {
1943
2416
  kolicina: 150,
1944
2417
  pakiranje: 150,
1945
2418
  velikost: 300,
1946
- pantheon: 100
2419
+ pantheon: 100,
2420
+ starost: 400
1947
2421
  };
2422
+ var VETO_RAZREDI = new Set(["vrsta"]);
1948
2423
  var BONUS = {
1949
2424
  razpon: 150,
1950
2425
  vrsta: 200,
1951
2426
  kolicina: 100,
1952
2427
  pakiranje: 100,
1953
- velikost: 150
2428
+ velikost: 150,
2429
+ starost: 200
1954
2430
  };
1955
2431
  function kotSeznam(v) {
1956
2432
  if (v === undefined)
@@ -1962,6 +2438,32 @@ function staVNasprotju(a, b) {
1962
2438
  return false;
1963
2439
  return !a.some((x) => b.includes(x));
1964
2440
  }
2441
+ var NORMALIZIRANO = new Map;
2442
+ function normalizirajNaziv(naziv) {
2443
+ const shranjeno = NORMALIZIRANO.get(naziv);
2444
+ if (shranjeno)
2445
+ return shranjeno;
2446
+ let text = naziv;
2447
+ const classes = {};
2448
+ for (const n of VET_NORMALIZATORJI) {
2449
+ const r = n.fn(text, "naziv");
2450
+ if (r === undefined)
2451
+ continue;
2452
+ if (typeof r === "string") {
2453
+ text = r;
2454
+ continue;
2455
+ }
2456
+ text = r.text;
2457
+ for (const [kljuc, vrednost] of Object.entries(r.classes ?? {})) {
2458
+ classes[kljuc] = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
2459
+ }
2460
+ }
2461
+ const rezultat = { text: text.replace(/\s+/g, " ").trim(), classes };
2462
+ if (NORMALIZIRANO.size > 60000)
2463
+ NORMALIZIRANO.clear();
2464
+ NORMALIZIRANO.set(naziv, rezultat);
2465
+ return rezultat;
2466
+ }
1965
2467
  function kljuc(beseda) {
1966
2468
  return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "");
1967
2469
  }
@@ -1991,8 +2493,16 @@ function prestaneVratar(besedePoizvedbe, besedeKandidata) {
1991
2493
  }
1992
2494
  function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
1993
2495
  const n = { ...PRIVZETO, ...nastavitve };
1994
- const q = razcleniNaziv(poizvedba);
1995
- const c = razcleniNaziv(kandidat);
2496
+ const qNorm = normalizirajNaziv(poizvedba);
2497
+ const cNorm = normalizirajNaziv(kandidat);
2498
+ const q = razcleniNaziv(qNorm.text);
2499
+ const c = razcleniNaziv(cNorm.text);
2500
+ const qSurov = razcleniNaziv(poizvedba);
2501
+ const cSurov = razcleniNaziv(kandidat);
2502
+ const razrediSkupni = {
2503
+ poizvedba: { ...qNorm.classes, ...razredi?.poizvedba ?? {} },
2504
+ kandidat: { ...cNorm.classes, ...razredi?.kandidat ?? {} }
2505
+ };
1996
2506
  const prazna = {
1997
2507
  ocena: 0,
1998
2508
  sprejeto: false,
@@ -2004,52 +2514,85 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
2004
2514
  };
2005
2515
  if (!prestaneVratar(q.besede, c.besede))
2006
2516
  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;
2517
+ const vrednostiRazredov = (m) => Object.values(m).flat().map((v) => String(v).toLowerCase()).filter((v) => v.length > 0);
2518
+ const qSurovTok = [
2519
+ ...new Set([
2520
+ ...[...qSurov.besede, ...qSurov.zivalskeVrste, ...qSurov.dozirneOblike].map((t) => t.toLowerCase()),
2521
+ ...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
2522
+ ])
2523
+ ];
2524
+ const cSurovTok = [
2525
+ ...new Set([
2526
+ ...[...cSurov.besede, ...cSurov.zivalskeVrste, ...cSurov.dozirneOblike].map((t) => t.toLowerCase()),
2527
+ ...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
2528
+ ])
2529
+ ];
2530
+ const qTok = [
2531
+ ...new Set([
2532
+ ...[...q.besede, ...q.zivalskeVrste, ...q.dozirneOblike].map((t) => t.toLowerCase()),
2533
+ ...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
2534
+ ])
2535
+ ];
2536
+ const cTok = [
2537
+ ...new Set([
2538
+ ...[...c.besede, ...c.zivalskeVrste, ...c.dozirneOblike].map((t) => t.toLowerCase()),
2539
+ ...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
2540
+ ])
2541
+ ];
2542
+ const izracunajPokritost = (qZetoni, cZetoni) => {
2543
+ const qStevci = new Map;
2544
+ for (const t of qZetoni)
2545
+ qStevci.set(t, (qStevci.get(t) ?? 0) + 1);
2546
+ const cStevci = new Map;
2547
+ for (const t of cZetoni)
2548
+ cStevci.set(t, (cStevci.get(t) ?? 0) + 1);
2549
+ const porabljeno = new Map;
2550
+ let ujemajoce = 0;
2551
+ let ujemajoceCele = 0;
2552
+ const skupne2 = [];
2553
+ for (const [qZeton, kolikoQ] of qStevci) {
2554
+ let potrebnih = kolikoQ;
2555
+ for (const [cZeton, kolikoC] of cStevci) {
2556
+ if (potrebnih === 0)
2557
+ break;
2558
+ const prostih = kolikoC - (porabljeno.get(cZeton) ?? 0);
2559
+ if (prostih <= 0)
2560
+ continue;
2561
+ const qKljuc = kljuc(qZeton);
2562
+ const cKljuc = kljuc(cZeton);
2563
+ const cela = qKljuc === cKljuc;
2564
+ const predpona = !cela && (cKljuc.startsWith(qKljuc) || qKljuc.startsWith(cKljuc));
2565
+ const razmerje = Math.min(qKljuc.length, cKljuc.length) / Math.max(qKljuc.length, cKljuc.length);
2566
+ if (!cela && !(predpona && razmerje >= n.predponaDelez))
2567
+ continue;
2568
+ const vzem = Math.min(potrebnih, prostih);
2569
+ porabljeno.set(cZeton, (porabljeno.get(cZeton) ?? 0) + vzem);
2570
+ ujemajoce += vzem;
2571
+ if (cela)
2572
+ ujemajoceCele += vzem;
2573
+ if (!skupne2.includes(qZeton))
2574
+ skupne2.push(qZeton);
2575
+ potrebnih -= vzem;
2576
+ }
2040
2577
  }
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;
2578
+ const pokritostKandidata2 = cZetoni.length ? ujemajoce / cZetoni.length : 0;
2579
+ const pokritostPoizvedbe2 = qZetoni.length ? ujemajoce / qZetoni.length : 0;
2580
+ const dovoljDolg = [...porabljeno.keys()].some((t) => kljuc(t).length >= 5);
2581
+ const popolno = pokritostKandidata2 === 1 && pokritostPoizvedbe2 === 1;
2582
+ const ok = ujemajoce >= 1 && pokritostKandidata2 >= n.pokritostKandidata && pokritostPoizvedbe2 >= n.pokritostPoizvedbe && (popolno || ujemajoceCele >= 2 || dovoljDolg);
2583
+ return { ok, pokritostKandidata: pokritostKandidata2, pokritostPoizvedbe: pokritostPoizvedbe2, skupne: skupne2, nasprotja: [] };
2584
+ };
2585
+ const kanonicno = izracunajPokritost(qTok, cTok);
2586
+ const surovo = izracunajPokritost(qSurovTok, cSurovTok);
2587
+ const izbrano = kanonicno.ok || kanonicno.pokritostKandidata >= surovo.pokritostKandidata ? kanonicno : surovo;
2588
+ const { pokritostKandidata, pokritostPoizvedbe, skupne } = izbrano;
2589
+ const pokritostOk = kanonicno.ok || surovo.ok;
2590
+ let ocena = Math.max(oceniPodobnost(q, c).ocena, oceniPodobnost(qSurov, cSurov).ocena);
2048
2591
  const nasprotja = [];
2049
- const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "pantheon"];
2592
+ const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "starost", "pantheon"];
2050
2593
  for (const kljuc2 of kljuci) {
2051
- const a = kotSeznam(razredi?.poizvedba?.[kljuc2]);
2052
- const b = kotSeznam(razredi?.kandidat?.[kljuc2]);
2594
+ const a = kotSeznam(razrediSkupni["poizvedba"]?.[kljuc2]);
2595
+ const b = kotSeznam(razrediSkupni["kandidat"]?.[kljuc2]);
2053
2596
  if (staVNasprotju(a, b)) {
2054
2597
  ocena -= KAZEN[kljuc2] ?? 0;
2055
2598
  nasprotja.push(`${kljuc2}: ${a.join("/")} ≠ ${b.join("/")}`);
@@ -2057,8 +2600,9 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
2057
2600
  ocena += BONUS[kljuc2] ?? 0;
2058
2601
  }
2059
2602
  }
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)} %)`;
2603
+ const veto = nasprotja.some((n2) => VETO_RAZREDI.has(n2.split(":")[0] ?? ""));
2604
+ const sprejeto = pokritostOk && !veto && ocena >= n.minOcena;
2605
+ 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
2606
  return { ocena, sprejeto, razlog, pokritostKandidata, pokritostPoizvedbe, skupneBesede: skupne.slice(0, 5), nasprotja };
2063
2607
  }
2064
2608
  // src/common/numeric/scoring.ts
@@ -2471,6 +3015,13 @@ async function upariVse(prepared, artikli, nastavitve = {}) {
2471
3015
  }
2472
3016
  export {
2473
3017
  ENOTE_SINONIMI,
3018
+ PREVODI,
3019
+ PREVODI_VIR,
3020
+ STAROSTI,
3021
+ STOP_BESEDE,
3022
+ VELIKOSTI_EN,
3023
+ VELIKOSTI_OKRAJSAVE,
3024
+ VET_ISKALNI_NORMALIZATORJI,
2474
3025
  VET_NORMALIZATORJI,
2475
3026
  VET_TABELA,
2476
3027
  VRSTE_SINONIMI,
@@ -2481,11 +3032,17 @@ export {
2481
3032
  normalizeQueryWithOpts,
2482
3033
  oceniPar,
2483
3034
  oznakeNormalizator,
3035
+ prevodiNormalizator,
2484
3036
  pripraviVetIndeks,
3037
+ razdeljevalciNormalizator,
3038
+ starostNormalizator,
2485
3039
  upariArtikle,
2486
3040
  upariVse,
2487
3041
  upariVseSync,
3042
+ velikostNormalizator,
2488
3043
  vetArtikelSpec,
3044
+ vetIskalniQueryOpts,
3045
+ vetIskalniSpec,
2489
3046
  vetQueryOpts,
2490
3047
  vrstaNormalizator,
2491
3048
  znamkaNormalizator