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.
@@ -40,6 +40,13 @@ 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,
49
+ VET_ISKALNI_NORMALIZATORJI: () => VET_ISKALNI_NORMALIZATORJI,
43
50
  VET_NORMALIZATORJI: () => VET_NORMALIZATORJI,
44
51
  VET_TABELA: () => VET_TABELA,
45
52
  VRSTE_SINONIMI: () => VRSTE_SINONIMI,
@@ -50,11 +57,17 @@ __export(exports_vet, {
50
57
  normalizeQueryWithOpts: () => normalizeQueryWithOpts,
51
58
  oceniPar: () => oceniPar,
52
59
  oznakeNormalizator: () => oznakeNormalizator,
60
+ prevodiNormalizator: () => prevodiNormalizator,
53
61
  pripraviVetIndeks: () => pripraviVetIndeks,
62
+ razdeljevalciNormalizator: () => razdeljevalciNormalizator,
63
+ starostNormalizator: () => starostNormalizator,
54
64
  upariArtikle: () => upariArtikle,
55
65
  upariVse: () => upariVse,
56
66
  upariVseSync: () => upariVseSync,
67
+ velikostNormalizator: () => velikostNormalizator,
57
68
  vetArtikelSpec: () => vetArtikelSpec,
69
+ vetIskalniQueryOpts: () => vetIskalniQueryOpts,
70
+ vetIskalniSpec: () => vetIskalniSpec,
58
71
  vetQueryOpts: () => vetQueryOpts,
59
72
  vrstaNormalizator: () => vrstaNormalizator,
60
73
  znamkaNormalizator: () => znamkaNormalizator
@@ -240,6 +253,369 @@ dodajVrsto("jelen", ["jelena", "jeleni", "jelenov", "jelenjad"]);
240
253
  dodajVrsto("srna", ["srne", "srni", "srn", "srnjak", "srnjaka", "srnjaki"]);
241
254
  dodajVrsto("divjad", ["divjadi", "divjadjo"]);
242
255
 
256
+ // src/vet/data/prevodi.ts
257
+ var PREVODI = {
258
+ dog: "pes",
259
+ dogs: "pes",
260
+ pse: "pes",
261
+ puppy: "mladič",
262
+ puppies: "mladič",
263
+ cat: "mačka",
264
+ cats: "mačka",
265
+ kitten: "mladič",
266
+ kittens: "mladič",
267
+ rabbit: "zajec",
268
+ bunny: "zajec",
269
+ chicken: "piščanec",
270
+ chick: "piščanec",
271
+ hen: "kokoš",
272
+ turkey: "puran",
273
+ duck: "raca",
274
+ goose: "gos",
275
+ quail: "prepelica",
276
+ pheasant: "fazan",
277
+ beef: "govedina",
278
+ veal: "teletina",
279
+ pork: "svinjina",
280
+ lamb: "jagnjetina",
281
+ mutton: "jagnjetina",
282
+ sheep: "ovca",
283
+ goat: "koza",
284
+ horse: "konj",
285
+ buffalo: "bivol",
286
+ bison: "bizon",
287
+ venison: "divjačina",
288
+ boar: "divji prašič",
289
+ salmon: "losos",
290
+ trout: "postrv",
291
+ cod: "polenovka",
292
+ codfish: "polenovka",
293
+ hake: "oslič",
294
+ herring: "sled",
295
+ sardine: "sardela",
296
+ anchovy: "inčun",
297
+ mackerel: "skuša",
298
+ shrimp: "rakci",
299
+ prawn: "rakci",
300
+ krill: "kril",
301
+ crab: "rakovice",
302
+ lobster: "jastog",
303
+ squid: "lignji",
304
+ octopus: "hobotnica",
305
+ clam: "skoljke",
306
+ mussel: "skoljke",
307
+ egg: "jajce",
308
+ eggs: "jajce",
309
+ milk: "mleko",
310
+ cheese: "sir",
311
+ yogurt: "jogurt",
312
+ insect: "žuželke",
313
+ fish: "riba",
314
+ salmonoil: "ribje olje",
315
+ rice: "riž",
316
+ potato: "krompir",
317
+ potatoes: "krompir",
318
+ potatoe: "krompir",
319
+ grain: "žita",
320
+ grains: "žita",
321
+ wheat: "pšenica",
322
+ corn: "koruza",
323
+ maize: "koruza",
324
+ oat: "oves",
325
+ oats: "oves",
326
+ barley: "ječmen",
327
+ rye: "rž",
328
+ spelt: "pira",
329
+ spelled: "pira",
330
+ millet: "proso",
331
+ sorghum: "sirek",
332
+ quinoa: "kvinoja",
333
+ buckwheat: "ajda",
334
+ pea: "grah",
335
+ peas: "grah",
336
+ chickpea: "čiček",
337
+ lentil: "leča",
338
+ bean: "fižol",
339
+ beans: "fižol",
340
+ carrot: "korenje",
341
+ carrots: "korenje",
342
+ spinach: "špinača",
343
+ broccoli: "brokoli",
344
+ tomato: "paradižnik",
345
+ tomatoes: "paradižnik",
346
+ beet: "pesa",
347
+ beetroot: "pesa",
348
+ pumpkin: "buča",
349
+ courgette: "bučke",
350
+ zucchini: "bučke",
351
+ kale: "ohrovt",
352
+ cabbage: "zelje",
353
+ apple: "jabolko",
354
+ apples: "jabolko",
355
+ pomegranate: "granatno jabolko",
356
+ pomeg: "granatno jabolko",
357
+ orange: "pomaranča",
358
+ lemon: "limona",
359
+ pear: "hruška",
360
+ blueberry: "borovnica",
361
+ blueberries: "borovnica",
362
+ cranberry: "brusnica",
363
+ cranberries: "brusnica",
364
+ raspberry: "malina",
365
+ strawberry: "jagoda",
366
+ blackberry: "robida",
367
+ cherry: "češnja",
368
+ apricot: "marelica",
369
+ peach: "breskev",
370
+ pineapple: "ananas",
371
+ papaya: "papaja",
372
+ kiwi: "kivi",
373
+ melon: "melona",
374
+ melons: "melona",
375
+ watermelon: "lubenica",
376
+ cantaloupe: "melona",
377
+ coconut: "kokoš",
378
+ almond: "mandelj",
379
+ walnuts: "oreski",
380
+ peanut: "arašid",
381
+ seaweed: "alge",
382
+ kelp: "alge",
383
+ yucca: "juka",
384
+ alfalfa: "lucerna",
385
+ mint: "meta",
386
+ chamomile: "kamilica",
387
+ fennel: "komarček",
388
+ parsley: "peteršilj",
389
+ garlic: "česen",
390
+ flaxseed: "laneno seme",
391
+ flax: "lan",
392
+ sesame: "sezam",
393
+ sunflower: "sončnice",
394
+ herbal: "zeleni",
395
+ tablet: "tbl",
396
+ tablets: "tbl",
397
+ capsule: "kps",
398
+ capsules: "kps",
399
+ injection: "inj",
400
+ injections: "inj",
401
+ suspension: "suspenzija",
402
+ solution: "raztopina",
403
+ powder: "prašek",
404
+ granulate: "granulat",
405
+ granules: "granulat",
406
+ drops: "kapljice",
407
+ shampoo: "šampon",
408
+ conditioner: "balzam",
409
+ paste: "pasta",
410
+ pate: "pašteta",
411
+ syrup: "sirup",
412
+ spray: "sprej",
413
+ pipette: "pipeta",
414
+ ampoule: "ampula",
415
+ vial: "viala",
416
+ sachet: "vrecka",
417
+ pouch: "vrecka",
418
+ can: "konzerva",
419
+ cans: "konzerva",
420
+ tin: "konzerva",
421
+ bag: "vrecka",
422
+ tube: "tuba",
423
+ bottle: "steklenička",
424
+ jar: "kozarec",
425
+ collar: "ovratnica",
426
+ harness: "ovratnica",
427
+ leash: "povodec",
428
+ lead: "povodec",
429
+ muzzle: "nagobcnik",
430
+ toy: "igraca",
431
+ toys: "igraca",
432
+ brush: "krtača",
433
+ comb: "glavnik",
434
+ clipper: "škarje",
435
+ scissors: "škarje",
436
+ wipes: "brisače",
437
+ pads: "blazinice",
438
+ biscuit: "piškot",
439
+ biscuits: "piškot",
440
+ stick: "palčka",
441
+ sticks: "palčka",
442
+ bone: "kost",
443
+ jerky: "suseno",
444
+ chew: "žvečenje",
445
+ chewable: "žvečljiv",
446
+ jelly: "žele",
447
+ gravy: "omaka",
448
+ sauce: "omaka",
449
+ mousse: "pena",
450
+ loaf: "hlod",
451
+ cream: "krema",
452
+ oil: "olje",
453
+ balm: "balzam",
454
+ tonic: "tonik",
455
+ lotion: "losjon",
456
+ urinary: "urinarne",
457
+ renal: "ledvično",
458
+ kidney: "ledvica",
459
+ dental: "zobno",
460
+ hairball: "dlake",
461
+ joint: "sklepi",
462
+ joints: "sklepi",
463
+ skin: "koza",
464
+ coat: "dlaka",
465
+ stomach: "želodec",
466
+ gastric: "prebavno",
467
+ digestive: "prebavni",
468
+ digestion: "prebava",
469
+ intestinal: "črevesni",
470
+ hepatic: "jetrni",
471
+ liver: "jetra",
472
+ cardiac: "srčni",
473
+ heart: "srce",
474
+ respiratory: "dihala",
475
+ breath: "dihala",
476
+ ear: "ušesa",
477
+ eye: "oci",
478
+ eyes: "oci",
479
+ oral: "oralno",
480
+ hypoallergenic: "hipoalergen",
481
+ hypoall: "hipoalergen",
482
+ allergenic: "alergen",
483
+ allergy: "alergija",
484
+ sensitive: "občutljiv",
485
+ sterilised: "steriliziran",
486
+ sterilized: "steriliziran",
487
+ steril: "steriliziran",
488
+ neutered: "steriliziran",
489
+ neutred: "steriliziran",
490
+ neuter: "steriliziran",
491
+ castrated: "kastriran",
492
+ obesity: "debelost",
493
+ obese: "debel",
494
+ overweight: "predebel",
495
+ diabetic: "diabetik",
496
+ mobility: "mobilnost",
497
+ weight: "teža",
498
+ growth: "rast",
499
+ recovery: "okrevanje",
500
+ convalescence: "okrevanje",
501
+ calm: "pomiritev",
502
+ relaxing: "pomiritev",
503
+ vitality: "vitalnost",
504
+ immune: "imunski",
505
+ immunity: "imunost",
506
+ supplement: "dodatek",
507
+ supplements: "dodatek",
508
+ probiotic: "probiotik",
509
+ probiotics: "probiotik",
510
+ antioxidant: "antioksidant",
511
+ fibre: "vlaknine",
512
+ fiber: "vlaknine",
513
+ protein: "beljakovine",
514
+ fat: "maščobe",
515
+ ash: "pepel",
516
+ moisture: "vlaga",
517
+ veterinary: "veterinarski",
518
+ diet: "dieta",
519
+ dietary: "dietna",
520
+ adult: "odrasel",
521
+ wet: "mokra",
522
+ dry: "suha",
523
+ food: "hrana",
524
+ snack: "priboljsek",
525
+ snacks: "priboljsek",
526
+ treat: "priboljsek",
527
+ treats: "priboljsek",
528
+ complete: "popolna",
529
+ balanced: "uravnotežena",
530
+ daily: "dnevni",
531
+ special: "specialni",
532
+ intensive: "intenzivni",
533
+ support: "podpora",
534
+ protection: "zaščita",
535
+ control: "nadzor",
536
+ hygiene: "higiena",
537
+ fresh: "sveze",
538
+ grainfree: "brez zita",
539
+ bite: "grizljaj",
540
+ flavour: "okus",
541
+ flavor: "okus",
542
+ taste: "okus",
543
+ chickpomeg: "piscanec granatno jabolko",
544
+ chpom: "piscanec granatno jabolko",
545
+ cant: "melona",
546
+ cantmelon: "melona",
547
+ neut: "steriliziran",
548
+ vacc: "cepivo",
549
+ vaccin: "cepivo",
550
+ vaccine: "cepivo",
551
+ haem: "hem",
552
+ canine: "pasji",
553
+ feline: "mačji",
554
+ satiety: "sitost",
555
+ gastrointestinal: "prebavni",
556
+ pisc: "piščanec",
557
+ piscji: "piščanec",
558
+ krom: "krompir",
559
+ kromp: "krompir",
560
+ granat: "granatno",
561
+ ovck: "ovčka",
562
+ priboljski: "priboljšek"
563
+ };
564
+ var STOP_BESEDE = [
565
+ "and",
566
+ "with",
567
+ "for",
568
+ "the",
569
+ "of",
570
+ "in",
571
+ "on",
572
+ "to",
573
+ "from",
574
+ "per",
575
+ "care",
576
+ "health",
577
+ "healthy",
578
+ "premium",
579
+ "quality",
580
+ "test"
581
+ ];
582
+ var STAROSTI = {
583
+ mladic: "mladič",
584
+ mladicek: "mladič",
585
+ puppy: "mladič",
586
+ puppies: "mladič",
587
+ kitten: "mladič",
588
+ kittens: "mladič",
589
+ junior: "mladič",
590
+ juniors: "mladič",
591
+ baby: "mladič",
592
+ weaning: "mladič",
593
+ odrasel: "odrasel",
594
+ odrasli: "odrasel",
595
+ adult: "odrasel",
596
+ adults: "odrasel",
597
+ mature: "odrasel",
598
+ senior: "senior",
599
+ seniors: "senior",
600
+ seniorji: "senior",
601
+ geriatric: "senior",
602
+ aged: "senior"
603
+ };
604
+ var VELIKOSTI_EN = {
605
+ small: "s",
606
+ medium: "m",
607
+ large: "l",
608
+ giant: "xl",
609
+ xlarge: "xl",
610
+ extralarge: "xl"
611
+ };
612
+ var VELIKOSTI_OKRAJSAVE = {
613
+ med: "medium",
614
+ max: "maxi",
615
+ min: "mini"
616
+ };
617
+ var PREVODI_VIR = "ročno kurirano 2026-10-04 (besedišče izmerjeno v tackakp + SI_TACKA)";
618
+
243
619
  // src/vet/data/znamke.gen.ts
244
620
  var ZNAMKE_GEN = {
245
621
  vir: "/Users/primozk/devmt/panthenImport",
@@ -987,6 +1363,14 @@ function kljucBesede(beseda) {
987
1363
  return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+$/, "");
988
1364
  }
989
1365
  var BESEDA = /(?<![\p{L}\p{N}])([\p{L}\p{N}]+)(?![\p{L}\p{N}])/gu;
1366
+ var BESEDA_Z_VEZNIKOM = /(?<![\p{L}\p{N}])([\p{L}]+)\s*[&+]\s*([\p{L}]+)(?![\p{L}\p{N}])/gu;
1367
+ var VELIKOSTNE_BESEDE = new Set([
1368
+ ...Object.keys(VELIKOSTI_OKRAJSAVE),
1369
+ ...Object.keys(VELIKOSTI_EN),
1370
+ "mini",
1371
+ "maxi",
1372
+ ...Object.keys(VELIKOSTI_SINONIMI)
1373
+ ]);
990
1374
  function kanonicaVelika(enota) {
991
1375
  return enota.toUpperCase();
992
1376
  }
@@ -1072,19 +1456,90 @@ var vrstaNormalizator = {
1072
1456
  return najdene.length ? { text: ocisceno, classes: { vrsta: najdene } } : ocisceno;
1073
1457
  }
1074
1458
  };
1075
- var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2));
1459
+ var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2 && !PREVODI[t]));
1460
+ var razdeljevalciNormalizator = {
1461
+ fn: (v) => {
1462
+ let spremenjeno = false;
1463
+ let besedilo = v.replace(BESEDA_Z_VEZNIKOM, (ujemanje, a, b) => {
1464
+ const ka = kljucBesede(a);
1465
+ const kb = kljucBesede(b);
1466
+ if (!VELIKOSTNE_BESEDE.has(ka) || !VELIKOSTNE_BESEDE.has(kb))
1467
+ return ujemanje;
1468
+ const razsiri = (k) => VELIKOSTI_OKRAJSAVE[k] ?? VELIKOSTI_EN[k] ?? k;
1469
+ spremenjeno = true;
1470
+ return `${razsiri(ka)} ${razsiri(kb)}`;
1471
+ });
1472
+ 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, " ");
1473
+ if (zLocili !== besedilo)
1474
+ spremenjeno = true;
1475
+ besedilo = zLocili;
1476
+ return spremenjeno ? besedilo.replace(/\s+/g, " ").trim() : undefined;
1477
+ }
1478
+ };
1479
+ var PREVODI_MAP = new Map(Object.entries(PREVODI));
1480
+ var STOP_MAP = new Set(STOP_BESEDE);
1481
+ var prevodiNormalizator = {
1482
+ fn: (v) => {
1483
+ let spremenjeno = false;
1484
+ const izhod = v.replace(BESEDA, (ujemanje) => {
1485
+ const kljuc = kljucBesede(ujemanje);
1486
+ if (STOP_MAP.has(kljuc)) {
1487
+ spremenjeno = true;
1488
+ return " ";
1489
+ }
1490
+ const prevod = PREVODI_MAP.get(kljuc);
1491
+ if (!prevod)
1492
+ return ujemanje;
1493
+ spremenjeno = true;
1494
+ return prevod.toUpperCase();
1495
+ });
1496
+ return spremenjeno ? izhod.replace(/\s+/g, " ").trim() : undefined;
1497
+ }
1498
+ };
1499
+ var starostNormalizator = {
1500
+ fn: (v) => {
1501
+ const najdene = [];
1502
+ const izhod = v.replace(BESEDA, (ujemanje) => {
1503
+ const starost = STAROSTI[kljucBesede(ujemanje)];
1504
+ if (!starost)
1505
+ return ujemanje;
1506
+ if (!najdene.includes(starost))
1507
+ najdene.push(starost);
1508
+ return " ";
1509
+ });
1510
+ if (!najdene.length)
1511
+ return;
1512
+ return { text: izhod.replace(/\s+/g, " ").trim(), classes: { starost: najdene } };
1513
+ }
1514
+ };
1076
1515
  var VRSTE_ZA_RAZRED = new Set(["pes", "macka"]);
1077
1516
  var OKRAJSAVE_ZNAMK = new Map;
1078
1517
  var LINIJE_ZNAMK = new Map;
1518
+ var ZNANE_ZNAMKE = new Map([["n&d", "NATURAL DELICIOUS"]]);
1519
+ var OBIČAJNE_BESEDE = new Set([
1520
+ ...Object.keys(PREVODI),
1521
+ ...STOP_BESEDE,
1522
+ ...Object.keys(STAROSTI),
1523
+ ...Object.keys(VELIKOSTI_EN),
1524
+ ...Object.keys(VELIKOSTI_SINONIMI),
1525
+ ...Object.keys(VRSTE_SINONIMI)
1526
+ ]);
1527
+ var BESEDE_ZNAMK = new Set(ZNAMKE_GEN.okrajsave.flatMap((o) => o.znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u)).filter(Boolean));
1079
1528
  for (const zapis of ZNAMKE_GEN.okrajsave) {
1080
1529
  const kljuc = zapis.okrajsava.toLowerCase();
1081
1530
  if (zapis.zaupanje === "splet")
1082
1531
  continue;
1532
+ if (kljuc.length <= 4 && OBIČAJNE_BESEDE.has(kljuc))
1533
+ continue;
1534
+ if (BESEDE_ZNAMK.has(kljuc))
1535
+ continue;
1083
1536
  if (!OKRAJSAVE_ZNAMK.has(kljuc))
1084
1537
  OKRAJSAVE_ZNAMK.set(kljuc, zapis.znamka);
1085
1538
  }
1086
1539
  for (const linija of ZNAMKE_GEN.linije) {
1087
1540
  const kljuc = linija.linija.toLowerCase();
1541
+ if (OBIČAJNE_BESEDE.has(kljuc))
1542
+ continue;
1088
1543
  if (!LINIJE_ZNAMK.has(kljuc))
1089
1544
  LINIJE_ZNAMK.set(kljuc, linija.znamka);
1090
1545
  }
@@ -1093,7 +1548,7 @@ var znamkaNormalizator = {
1093
1548
  let spremenjeno = false;
1094
1549
  const izhod = v.replace(/(?<![\p{L}\p{N}])([\p{L}\p{N}&]+)(?![\p{L}\p{N}])/gu, (ujemanje) => {
1095
1550
  const kljuc = kljucBesede(ujemanje);
1096
- const znamka = OKRAJSAVE_ZNAMK.get(kljuc);
1551
+ const znamka = ZNANE_ZNAMKE.get(kljuc) ?? OKRAJSAVE_ZNAMK.get(kljuc);
1097
1552
  if (znamka) {
1098
1553
  const besedeCilja = znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
1099
1554
  if (besedeCilja.includes(kljuc))
@@ -1104,7 +1559,8 @@ var znamkaNormalizator = {
1104
1559
  const linija = LINIJE_ZNAMK.get(kljuc);
1105
1560
  if (linija) {
1106
1561
  spremenjeno = true;
1107
- return `${linija.toUpperCase()} ${ujemanje.toUpperCase()}`;
1562
+ const ze = v.toLowerCase().includes(linija.toLowerCase());
1563
+ return ze ? ujemanje.toUpperCase() : `${linija.toUpperCase()} ${ujemanje.toUpperCase()}`;
1108
1564
  }
1109
1565
  return ujemanje;
1110
1566
  });
@@ -1138,7 +1594,7 @@ var velikostNormalizator = {
1138
1594
  const najdene = [];
1139
1595
  const izhod = v.replace(BESEDA, (ujemanje, ...args) => {
1140
1596
  const kljuc = kljucBesede(ujemanje);
1141
- const velikost = VELIKOSTI_SINONIMI[kljuc];
1597
+ const velikost = VELIKOSTI_SINONIMI[kljuc] ?? VELIKOSTI_EN[kljuc];
1142
1598
  if (!velikost)
1143
1599
  return ujemanje;
1144
1600
  const mesto = args[args.length - 2];
@@ -1192,11 +1648,14 @@ var VET_NORMALIZATORJI = [
1192
1648
  kodiranjeNormalizator,
1193
1649
  decimalkeNormalizator,
1194
1650
  pantheonOznakaNormalizator,
1195
- tipskeOznakeNormalizator,
1196
1651
  enoteNormalizator,
1197
1652
  znamkaNormalizator,
1653
+ razdeljevalciNormalizator,
1654
+ prevodiNormalizator,
1655
+ tipskeOznakeNormalizator,
1198
1656
  kolicinaNormalizator,
1199
1657
  velikostNormalizator,
1658
+ starostNormalizator,
1200
1659
  vrstaNormalizator,
1201
1660
  oznakeNormalizator
1202
1661
  ];
@@ -1205,6 +1664,10 @@ var VET_TABELA = {
1205
1664
  linije: LINIJE_ZNAMK,
1206
1665
  dobavitelji: DOBAVITELJI,
1207
1666
  oznake: OZNAKE,
1667
+ prevodi: PREVODI_MAP,
1668
+ stopBesede: STOP_MAP,
1669
+ starosti: STAROSTI,
1670
+ velikostiEn: VELIKOSTI_EN,
1208
1671
  vir: ZNAMKE_GEN.vir
1209
1672
  };
1210
1673
  // src/vet/spec.ts
@@ -1220,6 +1683,29 @@ function vetArtikelSpec(nastavitve = {}) {
1220
1683
  function vetQueryOpts(dodatni = {}) {
1221
1684
  return { ...dodatni, queryNormalizers: [...VET_NORMALIZATORJI, ...dodatni.queryNormalizers ?? []] };
1222
1685
  }
1686
+ var VET_ISKALNI_NORMALIZATORJI = [
1687
+ kodiranjeNormalizator,
1688
+ decimalkeNormalizator,
1689
+ enoteNormalizator,
1690
+ znamkaNormalizator,
1691
+ razdeljevalciNormalizator,
1692
+ prevodiNormalizator
1693
+ ];
1694
+ function vetIskalniSpec(nastavitve = {}) {
1695
+ const polja = nastavitve.polja ?? ["naziv"];
1696
+ return {
1697
+ searchInFields: [...polja],
1698
+ keyFields: [...nastavitve.keyFields ?? polja],
1699
+ ...nastavitve.prviTokeni !== undefined ? { firstTokensN: nastavitve.prviTokeni } : {},
1700
+ valueNormalizers: [...VET_ISKALNI_NORMALIZATORJI, ...nastavitve.dodatniNormalizatorji ?? []]
1701
+ };
1702
+ }
1703
+ function vetIskalniQueryOpts(dodatni = {}) {
1704
+ return {
1705
+ ...dodatni,
1706
+ queryNormalizers: [...VET_ISKALNI_NORMALIZATORJI, ...dodatni.queryNormalizers ?? []]
1707
+ };
1708
+ }
1223
1709
  // src/types/index.ts
1224
1710
  var DEFAULT_PHONE_FIELDS = ["telefon", "phone", "gsm", "msisdn"];
1225
1711
  var DEFAULT_FIRST_TOKENS_N = 8;
@@ -2006,14 +2492,17 @@ var KAZEN = {
2006
2492
  kolicina: 150,
2007
2493
  pakiranje: 150,
2008
2494
  velikost: 300,
2009
- pantheon: 100
2495
+ pantheon: 100,
2496
+ starost: 400
2010
2497
  };
2498
+ var VETO_RAZREDI = new Set(["vrsta"]);
2011
2499
  var BONUS = {
2012
2500
  razpon: 150,
2013
2501
  vrsta: 200,
2014
2502
  kolicina: 100,
2015
2503
  pakiranje: 100,
2016
- velikost: 150
2504
+ velikost: 150,
2505
+ starost: 200
2017
2506
  };
2018
2507
  function kotSeznam(v) {
2019
2508
  if (v === undefined)
@@ -2025,6 +2514,32 @@ function staVNasprotju(a, b) {
2025
2514
  return false;
2026
2515
  return !a.some((x) => b.includes(x));
2027
2516
  }
2517
+ var NORMALIZIRANO = new Map;
2518
+ function normalizirajNaziv(naziv) {
2519
+ const shranjeno = NORMALIZIRANO.get(naziv);
2520
+ if (shranjeno)
2521
+ return shranjeno;
2522
+ let text = naziv;
2523
+ const classes = {};
2524
+ for (const n of VET_NORMALIZATORJI) {
2525
+ const r = n.fn(text, "naziv");
2526
+ if (r === undefined)
2527
+ continue;
2528
+ if (typeof r === "string") {
2529
+ text = r;
2530
+ continue;
2531
+ }
2532
+ text = r.text;
2533
+ for (const [kljuc, vrednost] of Object.entries(r.classes ?? {})) {
2534
+ classes[kljuc] = Array.isArray(vrednost) ? vrednost.map(String) : [String(vrednost)];
2535
+ }
2536
+ }
2537
+ const rezultat = { text: text.replace(/\s+/g, " ").trim(), classes };
2538
+ if (NORMALIZIRANO.size > 60000)
2539
+ NORMALIZIRANO.clear();
2540
+ NORMALIZIRANO.set(naziv, rezultat);
2541
+ return rezultat;
2542
+ }
2028
2543
  function kljuc(beseda) {
2029
2544
  return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]/g, "");
2030
2545
  }
@@ -2054,8 +2569,16 @@ function prestaneVratar(besedePoizvedbe, besedeKandidata) {
2054
2569
  }
2055
2570
  function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
2056
2571
  const n = { ...PRIVZETO, ...nastavitve };
2057
- const q = import_cry_vetzdravila.razcleniNaziv(poizvedba);
2058
- const c = import_cry_vetzdravila.razcleniNaziv(kandidat);
2572
+ const qNorm = normalizirajNaziv(poizvedba);
2573
+ const cNorm = normalizirajNaziv(kandidat);
2574
+ const q = import_cry_vetzdravila.razcleniNaziv(qNorm.text);
2575
+ const c = import_cry_vetzdravila.razcleniNaziv(cNorm.text);
2576
+ const qSurov = import_cry_vetzdravila.razcleniNaziv(poizvedba);
2577
+ const cSurov = import_cry_vetzdravila.razcleniNaziv(kandidat);
2578
+ const razrediSkupni = {
2579
+ poizvedba: { ...qNorm.classes, ...razredi?.poizvedba ?? {} },
2580
+ kandidat: { ...cNorm.classes, ...razredi?.kandidat ?? {} }
2581
+ };
2059
2582
  const prazna = {
2060
2583
  ocena: 0,
2061
2584
  sprejeto: false,
@@ -2067,52 +2590,85 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
2067
2590
  };
2068
2591
  if (!prestaneVratar(q.besede, c.besede))
2069
2592
  return prazna;
2070
- const qTok = [...new Set([...q.besede, ...q.zivalskeVrste, ...q.dozirneOblike].map((t) => t.toLowerCase()))];
2071
- const cTok = [...new Set([...c.besede, ...c.zivalskeVrste, ...c.dozirneOblike].map((t) => t.toLowerCase()))];
2072
- const qStevci = new Map;
2073
- for (const t of qTok)
2074
- qStevci.set(t, (qStevci.get(t) ?? 0) + 1);
2075
- const cStevci = new Map;
2076
- for (const t of cTok)
2077
- cStevci.set(t, (cStevci.get(t) ?? 0) + 1);
2078
- const porabljeno = new Map;
2079
- let ujemajoce = 0;
2080
- let ujemajoceCele = 0;
2081
- const skupne = [];
2082
- for (const [qZeton, kolikoQ] of qStevci) {
2083
- let potrebnih = kolikoQ;
2084
- for (const [cZeton, kolikoC] of cStevci) {
2085
- if (potrebnih === 0)
2086
- break;
2087
- const prostih = kolikoC - (porabljeno.get(cZeton) ?? 0);
2088
- if (prostih <= 0)
2089
- continue;
2090
- const cela = qZeton === cZeton;
2091
- const predpona = !cela && (cZeton.startsWith(qZeton) || qZeton.startsWith(cZeton));
2092
- const razmerje = Math.min(qZeton.length, cZeton.length) / Math.max(qZeton.length, cZeton.length);
2093
- if (!cela && !(predpona && razmerje >= n.predponaDelez))
2094
- continue;
2095
- const vzem = Math.min(potrebnih, prostih);
2096
- porabljeno.set(cZeton, (porabljeno.get(cZeton) ?? 0) + vzem);
2097
- ujemajoce += vzem;
2098
- if (cela)
2099
- ujemajoceCele += vzem;
2100
- if (!skupne.includes(qZeton))
2101
- skupne.push(qZeton);
2102
- potrebnih -= vzem;
2593
+ const vrednostiRazredov = (m) => Object.values(m).flat().map((v) => String(v).toLowerCase()).filter((v) => v.length > 0);
2594
+ const qSurovTok = [
2595
+ ...new Set([
2596
+ ...[...qSurov.besede, ...qSurov.zivalskeVrste, ...qSurov.dozirneOblike].map((t) => t.toLowerCase()),
2597
+ ...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
2598
+ ])
2599
+ ];
2600
+ const cSurovTok = [
2601
+ ...new Set([
2602
+ ...[...cSurov.besede, ...cSurov.zivalskeVrste, ...cSurov.dozirneOblike].map((t) => t.toLowerCase()),
2603
+ ...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
2604
+ ])
2605
+ ];
2606
+ const qTok = [
2607
+ ...new Set([
2608
+ ...[...q.besede, ...q.zivalskeVrste, ...q.dozirneOblike].map((t) => t.toLowerCase()),
2609
+ ...vrednostiRazredov(razrediSkupni["poizvedba"] ?? {})
2610
+ ])
2611
+ ];
2612
+ const cTok = [
2613
+ ...new Set([
2614
+ ...[...c.besede, ...c.zivalskeVrste, ...c.dozirneOblike].map((t) => t.toLowerCase()),
2615
+ ...vrednostiRazredov(razrediSkupni["kandidat"] ?? {})
2616
+ ])
2617
+ ];
2618
+ const izracunajPokritost = (qZetoni, cZetoni) => {
2619
+ const qStevci = new Map;
2620
+ for (const t of qZetoni)
2621
+ qStevci.set(t, (qStevci.get(t) ?? 0) + 1);
2622
+ const cStevci = new Map;
2623
+ for (const t of cZetoni)
2624
+ cStevci.set(t, (cStevci.get(t) ?? 0) + 1);
2625
+ const porabljeno = new Map;
2626
+ let ujemajoce = 0;
2627
+ let ujemajoceCele = 0;
2628
+ const skupne2 = [];
2629
+ for (const [qZeton, kolikoQ] of qStevci) {
2630
+ let potrebnih = kolikoQ;
2631
+ for (const [cZeton, kolikoC] of cStevci) {
2632
+ if (potrebnih === 0)
2633
+ break;
2634
+ const prostih = kolikoC - (porabljeno.get(cZeton) ?? 0);
2635
+ if (prostih <= 0)
2636
+ continue;
2637
+ const qKljuc = kljuc(qZeton);
2638
+ const cKljuc = kljuc(cZeton);
2639
+ const cela = qKljuc === cKljuc;
2640
+ const predpona = !cela && (cKljuc.startsWith(qKljuc) || qKljuc.startsWith(cKljuc));
2641
+ const razmerje = Math.min(qKljuc.length, cKljuc.length) / Math.max(qKljuc.length, cKljuc.length);
2642
+ if (!cela && !(predpona && razmerje >= n.predponaDelez))
2643
+ continue;
2644
+ const vzem = Math.min(potrebnih, prostih);
2645
+ porabljeno.set(cZeton, (porabljeno.get(cZeton) ?? 0) + vzem);
2646
+ ujemajoce += vzem;
2647
+ if (cela)
2648
+ ujemajoceCele += vzem;
2649
+ if (!skupne2.includes(qZeton))
2650
+ skupne2.push(qZeton);
2651
+ potrebnih -= vzem;
2652
+ }
2103
2653
  }
2104
- }
2105
- const pokritostKandidata = cTok.length ? ujemajoce / cTok.length : 0;
2106
- const pokritostPoizvedbe = qTok.length ? ujemajoce / qTok.length : 0;
2107
- const dovoljDolg = [...porabljeno.keys()].some((t) => t.length >= 5);
2108
- const popolno = pokritostKandidata === 1 && pokritostPoizvedbe === 1;
2109
- const pokritostOk = ujemajoce >= 1 && pokritostKandidata >= n.pokritostKandidata && pokritostPoizvedbe >= n.pokritostPoizvedbe && (popolno || ujemajoceCele >= 2 || dovoljDolg);
2110
- let ocena = import_cry_vetzdravila.oceniPodobnost(q, c).ocena;
2654
+ const pokritostKandidata2 = cZetoni.length ? ujemajoce / cZetoni.length : 0;
2655
+ const pokritostPoizvedbe2 = qZetoni.length ? ujemajoce / qZetoni.length : 0;
2656
+ const dovoljDolg = [...porabljeno.keys()].some((t) => kljuc(t).length >= 5);
2657
+ const popolno = pokritostKandidata2 === 1 && pokritostPoizvedbe2 === 1;
2658
+ const ok = ujemajoce >= 1 && pokritostKandidata2 >= n.pokritostKandidata && pokritostPoizvedbe2 >= n.pokritostPoizvedbe && (popolno || ujemajoceCele >= 2 || dovoljDolg);
2659
+ return { ok, pokritostKandidata: pokritostKandidata2, pokritostPoizvedbe: pokritostPoizvedbe2, skupne: skupne2, nasprotja: [] };
2660
+ };
2661
+ const kanonicno = izracunajPokritost(qTok, cTok);
2662
+ const surovo = izracunajPokritost(qSurovTok, cSurovTok);
2663
+ const izbrano = kanonicno.ok || kanonicno.pokritostKandidata >= surovo.pokritostKandidata ? kanonicno : surovo;
2664
+ const { pokritostKandidata, pokritostPoizvedbe, skupne } = izbrano;
2665
+ const pokritostOk = kanonicno.ok || surovo.ok;
2666
+ let ocena = Math.max(import_cry_vetzdravila.oceniPodobnost(q, c).ocena, import_cry_vetzdravila.oceniPodobnost(qSurov, cSurov).ocena);
2111
2667
  const nasprotja = [];
2112
- const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "pantheon"];
2668
+ const kljuci = ["razpon", "vrsta", "kolicina", "pakiranje", "velikost", "starost", "pantheon"];
2113
2669
  for (const kljuc2 of kljuci) {
2114
- const a = kotSeznam(razredi?.poizvedba?.[kljuc2]);
2115
- const b = kotSeznam(razredi?.kandidat?.[kljuc2]);
2670
+ const a = kotSeznam(razrediSkupni["poizvedba"]?.[kljuc2]);
2671
+ const b = kotSeznam(razrediSkupni["kandidat"]?.[kljuc2]);
2116
2672
  if (staVNasprotju(a, b)) {
2117
2673
  ocena -= KAZEN[kljuc2] ?? 0;
2118
2674
  nasprotja.push(`${kljuc2}: ${a.join("/")} ≠ ${b.join("/")}`);
@@ -2120,8 +2676,9 @@ function oceniPar(poizvedba, kandidat, nastavitve = {}, razredi) {
2120
2676
  ocena += BONUS[kljuc2] ?? 0;
2121
2677
  }
2122
2678
  }
2123
- const sprejeto = pokritostOk && ocena >= n.minOcena;
2124
- 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)} %)`;
2679
+ const veto = nasprotja.some((n2) => VETO_RAZREDI.has(n2.split(":")[0] ?? ""));
2680
+ const sprejeto = pokritostOk && !veto && ocena >= n.minOcena;
2681
+ 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)} %)`;
2125
2682
  return { ocena, sprejeto, razlog, pokritostKandidata, pokritostPoizvedbe, skupneBesede: skupne.slice(0, 5), nasprotja };
2126
2683
  }
2127
2684
  // src/common/numeric/scoring.ts