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/CLAUDE.md +26 -0
- package/README.md +38 -0
- package/dist/vet/data/prevodi.d.ts +64 -0
- package/dist/vet/data/prevodi.d.ts.map +1 -0
- package/dist/vet/index.cjs +611 -54
- package/dist/vet/index.d.cts +3 -2
- package/dist/vet/index.d.ts +3 -2
- package/dist/vet/index.d.ts.map +1 -1
- package/dist/vet/index.js +611 -54
- package/dist/vet/normalizatorji.d.ts +45 -3
- package/dist/vet/normalizatorji.d.ts.map +1 -1
- package/dist/vet/ocena.d.ts +2 -0
- package/dist/vet/ocena.d.ts.map +1 -1
- package/dist/vet/spec.d.ts +28 -0
- package/dist/vet/spec.d.ts.map +1 -1
- package/package.json +3 -2
package/dist/vet/index.js
CHANGED
|
@@ -177,6 +177,369 @@ dodajVrsto("jelen", ["jelena", "jeleni", "jelenov", "jelenjad"]);
|
|
|
177
177
|
dodajVrsto("srna", ["srne", "srni", "srn", "srnjak", "srnjaka", "srnjaki"]);
|
|
178
178
|
dodajVrsto("divjad", ["divjadi", "divjadjo"]);
|
|
179
179
|
|
|
180
|
+
// src/vet/data/prevodi.ts
|
|
181
|
+
var PREVODI = {
|
|
182
|
+
dog: "pes",
|
|
183
|
+
dogs: "pes",
|
|
184
|
+
pse: "pes",
|
|
185
|
+
puppy: "mladič",
|
|
186
|
+
puppies: "mladič",
|
|
187
|
+
cat: "mačka",
|
|
188
|
+
cats: "mačka",
|
|
189
|
+
kitten: "mladič",
|
|
190
|
+
kittens: "mladič",
|
|
191
|
+
rabbit: "zajec",
|
|
192
|
+
bunny: "zajec",
|
|
193
|
+
chicken: "piščanec",
|
|
194
|
+
chick: "piščanec",
|
|
195
|
+
hen: "kokoš",
|
|
196
|
+
turkey: "puran",
|
|
197
|
+
duck: "raca",
|
|
198
|
+
goose: "gos",
|
|
199
|
+
quail: "prepelica",
|
|
200
|
+
pheasant: "fazan",
|
|
201
|
+
beef: "govedina",
|
|
202
|
+
veal: "teletina",
|
|
203
|
+
pork: "svinjina",
|
|
204
|
+
lamb: "jagnjetina",
|
|
205
|
+
mutton: "jagnjetina",
|
|
206
|
+
sheep: "ovca",
|
|
207
|
+
goat: "koza",
|
|
208
|
+
horse: "konj",
|
|
209
|
+
buffalo: "bivol",
|
|
210
|
+
bison: "bizon",
|
|
211
|
+
venison: "divjačina",
|
|
212
|
+
boar: "divji prašič",
|
|
213
|
+
salmon: "losos",
|
|
214
|
+
trout: "postrv",
|
|
215
|
+
cod: "polenovka",
|
|
216
|
+
codfish: "polenovka",
|
|
217
|
+
hake: "oslič",
|
|
218
|
+
herring: "sled",
|
|
219
|
+
sardine: "sardela",
|
|
220
|
+
anchovy: "inčun",
|
|
221
|
+
mackerel: "skuša",
|
|
222
|
+
shrimp: "rakci",
|
|
223
|
+
prawn: "rakci",
|
|
224
|
+
krill: "kril",
|
|
225
|
+
crab: "rakovice",
|
|
226
|
+
lobster: "jastog",
|
|
227
|
+
squid: "lignji",
|
|
228
|
+
octopus: "hobotnica",
|
|
229
|
+
clam: "skoljke",
|
|
230
|
+
mussel: "skoljke",
|
|
231
|
+
egg: "jajce",
|
|
232
|
+
eggs: "jajce",
|
|
233
|
+
milk: "mleko",
|
|
234
|
+
cheese: "sir",
|
|
235
|
+
yogurt: "jogurt",
|
|
236
|
+
insect: "žuželke",
|
|
237
|
+
fish: "riba",
|
|
238
|
+
salmonoil: "ribje olje",
|
|
239
|
+
rice: "riž",
|
|
240
|
+
potato: "krompir",
|
|
241
|
+
potatoes: "krompir",
|
|
242
|
+
potatoe: "krompir",
|
|
243
|
+
grain: "žita",
|
|
244
|
+
grains: "žita",
|
|
245
|
+
wheat: "pšenica",
|
|
246
|
+
corn: "koruza",
|
|
247
|
+
maize: "koruza",
|
|
248
|
+
oat: "oves",
|
|
249
|
+
oats: "oves",
|
|
250
|
+
barley: "ječmen",
|
|
251
|
+
rye: "rž",
|
|
252
|
+
spelt: "pira",
|
|
253
|
+
spelled: "pira",
|
|
254
|
+
millet: "proso",
|
|
255
|
+
sorghum: "sirek",
|
|
256
|
+
quinoa: "kvinoja",
|
|
257
|
+
buckwheat: "ajda",
|
|
258
|
+
pea: "grah",
|
|
259
|
+
peas: "grah",
|
|
260
|
+
chickpea: "čiček",
|
|
261
|
+
lentil: "leča",
|
|
262
|
+
bean: "fižol",
|
|
263
|
+
beans: "fižol",
|
|
264
|
+
carrot: "korenje",
|
|
265
|
+
carrots: "korenje",
|
|
266
|
+
spinach: "špinača",
|
|
267
|
+
broccoli: "brokoli",
|
|
268
|
+
tomato: "paradižnik",
|
|
269
|
+
tomatoes: "paradižnik",
|
|
270
|
+
beet: "pesa",
|
|
271
|
+
beetroot: "pesa",
|
|
272
|
+
pumpkin: "buča",
|
|
273
|
+
courgette: "bučke",
|
|
274
|
+
zucchini: "bučke",
|
|
275
|
+
kale: "ohrovt",
|
|
276
|
+
cabbage: "zelje",
|
|
277
|
+
apple: "jabolko",
|
|
278
|
+
apples: "jabolko",
|
|
279
|
+
pomegranate: "granatno jabolko",
|
|
280
|
+
pomeg: "granatno jabolko",
|
|
281
|
+
orange: "pomaranča",
|
|
282
|
+
lemon: "limona",
|
|
283
|
+
pear: "hruška",
|
|
284
|
+
blueberry: "borovnica",
|
|
285
|
+
blueberries: "borovnica",
|
|
286
|
+
cranberry: "brusnica",
|
|
287
|
+
cranberries: "brusnica",
|
|
288
|
+
raspberry: "malina",
|
|
289
|
+
strawberry: "jagoda",
|
|
290
|
+
blackberry: "robida",
|
|
291
|
+
cherry: "češnja",
|
|
292
|
+
apricot: "marelica",
|
|
293
|
+
peach: "breskev",
|
|
294
|
+
pineapple: "ananas",
|
|
295
|
+
papaya: "papaja",
|
|
296
|
+
kiwi: "kivi",
|
|
297
|
+
melon: "melona",
|
|
298
|
+
melons: "melona",
|
|
299
|
+
watermelon: "lubenica",
|
|
300
|
+
cantaloupe: "melona",
|
|
301
|
+
coconut: "kokoš",
|
|
302
|
+
almond: "mandelj",
|
|
303
|
+
walnuts: "oreski",
|
|
304
|
+
peanut: "arašid",
|
|
305
|
+
seaweed: "alge",
|
|
306
|
+
kelp: "alge",
|
|
307
|
+
yucca: "juka",
|
|
308
|
+
alfalfa: "lucerna",
|
|
309
|
+
mint: "meta",
|
|
310
|
+
chamomile: "kamilica",
|
|
311
|
+
fennel: "komarček",
|
|
312
|
+
parsley: "peteršilj",
|
|
313
|
+
garlic: "česen",
|
|
314
|
+
flaxseed: "laneno seme",
|
|
315
|
+
flax: "lan",
|
|
316
|
+
sesame: "sezam",
|
|
317
|
+
sunflower: "sončnice",
|
|
318
|
+
herbal: "zeleni",
|
|
319
|
+
tablet: "tbl",
|
|
320
|
+
tablets: "tbl",
|
|
321
|
+
capsule: "kps",
|
|
322
|
+
capsules: "kps",
|
|
323
|
+
injection: "inj",
|
|
324
|
+
injections: "inj",
|
|
325
|
+
suspension: "suspenzija",
|
|
326
|
+
solution: "raztopina",
|
|
327
|
+
powder: "prašek",
|
|
328
|
+
granulate: "granulat",
|
|
329
|
+
granules: "granulat",
|
|
330
|
+
drops: "kapljice",
|
|
331
|
+
shampoo: "šampon",
|
|
332
|
+
conditioner: "balzam",
|
|
333
|
+
paste: "pasta",
|
|
334
|
+
pate: "pašteta",
|
|
335
|
+
syrup: "sirup",
|
|
336
|
+
spray: "sprej",
|
|
337
|
+
pipette: "pipeta",
|
|
338
|
+
ampoule: "ampula",
|
|
339
|
+
vial: "viala",
|
|
340
|
+
sachet: "vrecka",
|
|
341
|
+
pouch: "vrecka",
|
|
342
|
+
can: "konzerva",
|
|
343
|
+
cans: "konzerva",
|
|
344
|
+
tin: "konzerva",
|
|
345
|
+
bag: "vrecka",
|
|
346
|
+
tube: "tuba",
|
|
347
|
+
bottle: "steklenička",
|
|
348
|
+
jar: "kozarec",
|
|
349
|
+
collar: "ovratnica",
|
|
350
|
+
harness: "ovratnica",
|
|
351
|
+
leash: "povodec",
|
|
352
|
+
lead: "povodec",
|
|
353
|
+
muzzle: "nagobcnik",
|
|
354
|
+
toy: "igraca",
|
|
355
|
+
toys: "igraca",
|
|
356
|
+
brush: "krtača",
|
|
357
|
+
comb: "glavnik",
|
|
358
|
+
clipper: "škarje",
|
|
359
|
+
scissors: "škarje",
|
|
360
|
+
wipes: "brisače",
|
|
361
|
+
pads: "blazinice",
|
|
362
|
+
biscuit: "piškot",
|
|
363
|
+
biscuits: "piškot",
|
|
364
|
+
stick: "palčka",
|
|
365
|
+
sticks: "palčka",
|
|
366
|
+
bone: "kost",
|
|
367
|
+
jerky: "suseno",
|
|
368
|
+
chew: "žvečenje",
|
|
369
|
+
chewable: "žvečljiv",
|
|
370
|
+
jelly: "žele",
|
|
371
|
+
gravy: "omaka",
|
|
372
|
+
sauce: "omaka",
|
|
373
|
+
mousse: "pena",
|
|
374
|
+
loaf: "hlod",
|
|
375
|
+
cream: "krema",
|
|
376
|
+
oil: "olje",
|
|
377
|
+
balm: "balzam",
|
|
378
|
+
tonic: "tonik",
|
|
379
|
+
lotion: "losjon",
|
|
380
|
+
urinary: "urinarne",
|
|
381
|
+
renal: "ledvično",
|
|
382
|
+
kidney: "ledvica",
|
|
383
|
+
dental: "zobno",
|
|
384
|
+
hairball: "dlake",
|
|
385
|
+
joint: "sklepi",
|
|
386
|
+
joints: "sklepi",
|
|
387
|
+
skin: "koza",
|
|
388
|
+
coat: "dlaka",
|
|
389
|
+
stomach: "želodec",
|
|
390
|
+
gastric: "prebavno",
|
|
391
|
+
digestive: "prebavni",
|
|
392
|
+
digestion: "prebava",
|
|
393
|
+
intestinal: "črevesni",
|
|
394
|
+
hepatic: "jetrni",
|
|
395
|
+
liver: "jetra",
|
|
396
|
+
cardiac: "srčni",
|
|
397
|
+
heart: "srce",
|
|
398
|
+
respiratory: "dihala",
|
|
399
|
+
breath: "dihala",
|
|
400
|
+
ear: "ušesa",
|
|
401
|
+
eye: "oci",
|
|
402
|
+
eyes: "oci",
|
|
403
|
+
oral: "oralno",
|
|
404
|
+
hypoallergenic: "hipoalergen",
|
|
405
|
+
hypoall: "hipoalergen",
|
|
406
|
+
allergenic: "alergen",
|
|
407
|
+
allergy: "alergija",
|
|
408
|
+
sensitive: "občutljiv",
|
|
409
|
+
sterilised: "steriliziran",
|
|
410
|
+
sterilized: "steriliziran",
|
|
411
|
+
steril: "steriliziran",
|
|
412
|
+
neutered: "steriliziran",
|
|
413
|
+
neutred: "steriliziran",
|
|
414
|
+
neuter: "steriliziran",
|
|
415
|
+
castrated: "kastriran",
|
|
416
|
+
obesity: "debelost",
|
|
417
|
+
obese: "debel",
|
|
418
|
+
overweight: "predebel",
|
|
419
|
+
diabetic: "diabetik",
|
|
420
|
+
mobility: "mobilnost",
|
|
421
|
+
weight: "teža",
|
|
422
|
+
growth: "rast",
|
|
423
|
+
recovery: "okrevanje",
|
|
424
|
+
convalescence: "okrevanje",
|
|
425
|
+
calm: "pomiritev",
|
|
426
|
+
relaxing: "pomiritev",
|
|
427
|
+
vitality: "vitalnost",
|
|
428
|
+
immune: "imunski",
|
|
429
|
+
immunity: "imunost",
|
|
430
|
+
supplement: "dodatek",
|
|
431
|
+
supplements: "dodatek",
|
|
432
|
+
probiotic: "probiotik",
|
|
433
|
+
probiotics: "probiotik",
|
|
434
|
+
antioxidant: "antioksidant",
|
|
435
|
+
fibre: "vlaknine",
|
|
436
|
+
fiber: "vlaknine",
|
|
437
|
+
protein: "beljakovine",
|
|
438
|
+
fat: "maščobe",
|
|
439
|
+
ash: "pepel",
|
|
440
|
+
moisture: "vlaga",
|
|
441
|
+
veterinary: "veterinarski",
|
|
442
|
+
diet: "dieta",
|
|
443
|
+
dietary: "dietna",
|
|
444
|
+
adult: "odrasel",
|
|
445
|
+
wet: "mokra",
|
|
446
|
+
dry: "suha",
|
|
447
|
+
food: "hrana",
|
|
448
|
+
snack: "priboljsek",
|
|
449
|
+
snacks: "priboljsek",
|
|
450
|
+
treat: "priboljsek",
|
|
451
|
+
treats: "priboljsek",
|
|
452
|
+
complete: "popolna",
|
|
453
|
+
balanced: "uravnotežena",
|
|
454
|
+
daily: "dnevni",
|
|
455
|
+
special: "specialni",
|
|
456
|
+
intensive: "intenzivni",
|
|
457
|
+
support: "podpora",
|
|
458
|
+
protection: "zaščita",
|
|
459
|
+
control: "nadzor",
|
|
460
|
+
hygiene: "higiena",
|
|
461
|
+
fresh: "sveze",
|
|
462
|
+
grainfree: "brez zita",
|
|
463
|
+
bite: "grizljaj",
|
|
464
|
+
flavour: "okus",
|
|
465
|
+
flavor: "okus",
|
|
466
|
+
taste: "okus",
|
|
467
|
+
chickpomeg: "piscanec granatno jabolko",
|
|
468
|
+
chpom: "piscanec granatno jabolko",
|
|
469
|
+
cant: "melona",
|
|
470
|
+
cantmelon: "melona",
|
|
471
|
+
neut: "steriliziran",
|
|
472
|
+
vacc: "cepivo",
|
|
473
|
+
vaccin: "cepivo",
|
|
474
|
+
vaccine: "cepivo",
|
|
475
|
+
haem: "hem",
|
|
476
|
+
canine: "pasji",
|
|
477
|
+
feline: "mačji",
|
|
478
|
+
satiety: "sitost",
|
|
479
|
+
gastrointestinal: "prebavni",
|
|
480
|
+
pisc: "piščanec",
|
|
481
|
+
piscji: "piščanec",
|
|
482
|
+
krom: "krompir",
|
|
483
|
+
kromp: "krompir",
|
|
484
|
+
granat: "granatno",
|
|
485
|
+
ovck: "ovčka",
|
|
486
|
+
priboljski: "priboljšek"
|
|
487
|
+
};
|
|
488
|
+
var STOP_BESEDE = [
|
|
489
|
+
"and",
|
|
490
|
+
"with",
|
|
491
|
+
"for",
|
|
492
|
+
"the",
|
|
493
|
+
"of",
|
|
494
|
+
"in",
|
|
495
|
+
"on",
|
|
496
|
+
"to",
|
|
497
|
+
"from",
|
|
498
|
+
"per",
|
|
499
|
+
"care",
|
|
500
|
+
"health",
|
|
501
|
+
"healthy",
|
|
502
|
+
"premium",
|
|
503
|
+
"quality",
|
|
504
|
+
"test"
|
|
505
|
+
];
|
|
506
|
+
var STAROSTI = {
|
|
507
|
+
mladic: "mladič",
|
|
508
|
+
mladicek: "mladič",
|
|
509
|
+
puppy: "mladič",
|
|
510
|
+
puppies: "mladič",
|
|
511
|
+
kitten: "mladič",
|
|
512
|
+
kittens: "mladič",
|
|
513
|
+
junior: "mladič",
|
|
514
|
+
juniors: "mladič",
|
|
515
|
+
baby: "mladič",
|
|
516
|
+
weaning: "mladič",
|
|
517
|
+
odrasel: "odrasel",
|
|
518
|
+
odrasli: "odrasel",
|
|
519
|
+
adult: "odrasel",
|
|
520
|
+
adults: "odrasel",
|
|
521
|
+
mature: "odrasel",
|
|
522
|
+
senior: "senior",
|
|
523
|
+
seniors: "senior",
|
|
524
|
+
seniorji: "senior",
|
|
525
|
+
geriatric: "senior",
|
|
526
|
+
aged: "senior"
|
|
527
|
+
};
|
|
528
|
+
var VELIKOSTI_EN = {
|
|
529
|
+
small: "s",
|
|
530
|
+
medium: "m",
|
|
531
|
+
large: "l",
|
|
532
|
+
giant: "xl",
|
|
533
|
+
xlarge: "xl",
|
|
534
|
+
extralarge: "xl"
|
|
535
|
+
};
|
|
536
|
+
var VELIKOSTI_OKRAJSAVE = {
|
|
537
|
+
med: "medium",
|
|
538
|
+
max: "maxi",
|
|
539
|
+
min: "mini"
|
|
540
|
+
};
|
|
541
|
+
var PREVODI_VIR = "ročno kurirano 2026-10-04 (besedišče izmerjeno v tackakp + SI_TACKA)";
|
|
542
|
+
|
|
180
543
|
// src/vet/data/znamke.gen.ts
|
|
181
544
|
var ZNAMKE_GEN = {
|
|
182
545
|
vir: "/Users/primozk/devmt/panthenImport",
|
|
@@ -924,6 +1287,14 @@ function kljucBesede(beseda) {
|
|
|
924
1287
|
return beseda.toLowerCase().normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^a-z0-9]+$/, "");
|
|
925
1288
|
}
|
|
926
1289
|
var BESEDA = /(?<![\p{L}\p{N}])([\p{L}\p{N}]+)(?![\p{L}\p{N}])/gu;
|
|
1290
|
+
var BESEDA_Z_VEZNIKOM = /(?<![\p{L}\p{N}])([\p{L}]+)\s*[&+]\s*([\p{L}]+)(?![\p{L}\p{N}])/gu;
|
|
1291
|
+
var VELIKOSTNE_BESEDE = new Set([
|
|
1292
|
+
...Object.keys(VELIKOSTI_OKRAJSAVE),
|
|
1293
|
+
...Object.keys(VELIKOSTI_EN),
|
|
1294
|
+
"mini",
|
|
1295
|
+
"maxi",
|
|
1296
|
+
...Object.keys(VELIKOSTI_SINONIMI)
|
|
1297
|
+
]);
|
|
927
1298
|
function kanonicaVelika(enota) {
|
|
928
1299
|
return enota.toUpperCase();
|
|
929
1300
|
}
|
|
@@ -1009,19 +1380,90 @@ var vrstaNormalizator = {
|
|
|
1009
1380
|
return najdene.length ? { text: ocisceno, classes: { vrsta: najdene } } : ocisceno;
|
|
1010
1381
|
}
|
|
1011
1382
|
};
|
|
1012
|
-
var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2));
|
|
1383
|
+
var TIPSKE_OZNAKE = new Set(ZNAMKE_GEN.tipskeOznake.map(kljucBesede).filter((t) => t.length >= 2 && !PREVODI[t]));
|
|
1384
|
+
var razdeljevalciNormalizator = {
|
|
1385
|
+
fn: (v) => {
|
|
1386
|
+
let spremenjeno = false;
|
|
1387
|
+
let besedilo = v.replace(BESEDA_Z_VEZNIKOM, (ujemanje, a, b) => {
|
|
1388
|
+
const ka = kljucBesede(a);
|
|
1389
|
+
const kb = kljucBesede(b);
|
|
1390
|
+
if (!VELIKOSTNE_BESEDE.has(ka) || !VELIKOSTNE_BESEDE.has(kb))
|
|
1391
|
+
return ujemanje;
|
|
1392
|
+
const razsiri = (k) => VELIKOSTI_OKRAJSAVE[k] ?? VELIKOSTI_EN[k] ?? k;
|
|
1393
|
+
spremenjeno = true;
|
|
1394
|
+
return `${razsiri(ka)} ${razsiri(kb)}`;
|
|
1395
|
+
});
|
|
1396
|
+
const zLocili = besedilo.replace(/\s*[&+,;|]\s*/g, " ").replace(/(?<=[\p{L}\p{N}]{2})\s*\/\s*(?=[\p{L}\p{N}]{2})/gu, " ").replace(/(?<![\d])([\p{L}]{2,})\.(?=\s|$)/gu, "$1").replace(/(?<=\p{L})\.(?=\p{L})/gu, " ");
|
|
1397
|
+
if (zLocili !== besedilo)
|
|
1398
|
+
spremenjeno = true;
|
|
1399
|
+
besedilo = zLocili;
|
|
1400
|
+
return spremenjeno ? besedilo.replace(/\s+/g, " ").trim() : undefined;
|
|
1401
|
+
}
|
|
1402
|
+
};
|
|
1403
|
+
var PREVODI_MAP = new Map(Object.entries(PREVODI));
|
|
1404
|
+
var STOP_MAP = new Set(STOP_BESEDE);
|
|
1405
|
+
var prevodiNormalizator = {
|
|
1406
|
+
fn: (v) => {
|
|
1407
|
+
let spremenjeno = false;
|
|
1408
|
+
const izhod = v.replace(BESEDA, (ujemanje) => {
|
|
1409
|
+
const kljuc = kljucBesede(ujemanje);
|
|
1410
|
+
if (STOP_MAP.has(kljuc)) {
|
|
1411
|
+
spremenjeno = true;
|
|
1412
|
+
return " ";
|
|
1413
|
+
}
|
|
1414
|
+
const prevod = PREVODI_MAP.get(kljuc);
|
|
1415
|
+
if (!prevod)
|
|
1416
|
+
return ujemanje;
|
|
1417
|
+
spremenjeno = true;
|
|
1418
|
+
return prevod.toUpperCase();
|
|
1419
|
+
});
|
|
1420
|
+
return spremenjeno ? izhod.replace(/\s+/g, " ").trim() : undefined;
|
|
1421
|
+
}
|
|
1422
|
+
};
|
|
1423
|
+
var starostNormalizator = {
|
|
1424
|
+
fn: (v) => {
|
|
1425
|
+
const najdene = [];
|
|
1426
|
+
const izhod = v.replace(BESEDA, (ujemanje) => {
|
|
1427
|
+
const starost = STAROSTI[kljucBesede(ujemanje)];
|
|
1428
|
+
if (!starost)
|
|
1429
|
+
return ujemanje;
|
|
1430
|
+
if (!najdene.includes(starost))
|
|
1431
|
+
najdene.push(starost);
|
|
1432
|
+
return " ";
|
|
1433
|
+
});
|
|
1434
|
+
if (!najdene.length)
|
|
1435
|
+
return;
|
|
1436
|
+
return { text: izhod.replace(/\s+/g, " ").trim(), classes: { starost: najdene } };
|
|
1437
|
+
}
|
|
1438
|
+
};
|
|
1013
1439
|
var VRSTE_ZA_RAZRED = new Set(["pes", "macka"]);
|
|
1014
1440
|
var OKRAJSAVE_ZNAMK = new Map;
|
|
1015
1441
|
var LINIJE_ZNAMK = new Map;
|
|
1442
|
+
var ZNANE_ZNAMKE = new Map([["n&d", "NATURAL DELICIOUS"]]);
|
|
1443
|
+
var OBIČAJNE_BESEDE = new Set([
|
|
1444
|
+
...Object.keys(PREVODI),
|
|
1445
|
+
...STOP_BESEDE,
|
|
1446
|
+
...Object.keys(STAROSTI),
|
|
1447
|
+
...Object.keys(VELIKOSTI_EN),
|
|
1448
|
+
...Object.keys(VELIKOSTI_SINONIMI),
|
|
1449
|
+
...Object.keys(VRSTE_SINONIMI)
|
|
1450
|
+
]);
|
|
1451
|
+
var BESEDE_ZNAMK = new Set(ZNAMKE_GEN.okrajsave.flatMap((o) => o.znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u)).filter(Boolean));
|
|
1016
1452
|
for (const zapis of ZNAMKE_GEN.okrajsave) {
|
|
1017
1453
|
const kljuc = zapis.okrajsava.toLowerCase();
|
|
1018
1454
|
if (zapis.zaupanje === "splet")
|
|
1019
1455
|
continue;
|
|
1456
|
+
if (kljuc.length <= 4 && OBIČAJNE_BESEDE.has(kljuc))
|
|
1457
|
+
continue;
|
|
1458
|
+
if (BESEDE_ZNAMK.has(kljuc))
|
|
1459
|
+
continue;
|
|
1020
1460
|
if (!OKRAJSAVE_ZNAMK.has(kljuc))
|
|
1021
1461
|
OKRAJSAVE_ZNAMK.set(kljuc, zapis.znamka);
|
|
1022
1462
|
}
|
|
1023
1463
|
for (const linija of ZNAMKE_GEN.linije) {
|
|
1024
1464
|
const kljuc = linija.linija.toLowerCase();
|
|
1465
|
+
if (OBIČAJNE_BESEDE.has(kljuc))
|
|
1466
|
+
continue;
|
|
1025
1467
|
if (!LINIJE_ZNAMK.has(kljuc))
|
|
1026
1468
|
LINIJE_ZNAMK.set(kljuc, linija.znamka);
|
|
1027
1469
|
}
|
|
@@ -1030,7 +1472,7 @@ var znamkaNormalizator = {
|
|
|
1030
1472
|
let spremenjeno = false;
|
|
1031
1473
|
const izhod = v.replace(/(?<![\p{L}\p{N}])([\p{L}\p{N}&]+)(?![\p{L}\p{N}])/gu, (ujemanje) => {
|
|
1032
1474
|
const kljuc = kljucBesede(ujemanje);
|
|
1033
|
-
const znamka = OKRAJSAVE_ZNAMK.get(kljuc);
|
|
1475
|
+
const znamka = ZNANE_ZNAMKE.get(kljuc) ?? OKRAJSAVE_ZNAMK.get(kljuc);
|
|
1034
1476
|
if (znamka) {
|
|
1035
1477
|
const besedeCilja = znamka.toLowerCase().split(/[^\p{L}\p{N}]+/u).filter(Boolean);
|
|
1036
1478
|
if (besedeCilja.includes(kljuc))
|
|
@@ -1041,7 +1483,8 @@ var znamkaNormalizator = {
|
|
|
1041
1483
|
const linija = LINIJE_ZNAMK.get(kljuc);
|
|
1042
1484
|
if (linija) {
|
|
1043
1485
|
spremenjeno = true;
|
|
1044
|
-
|
|
1486
|
+
const ze = v.toLowerCase().includes(linija.toLowerCase());
|
|
1487
|
+
return ze ? ujemanje.toUpperCase() : `${linija.toUpperCase()} ${ujemanje.toUpperCase()}`;
|
|
1045
1488
|
}
|
|
1046
1489
|
return ujemanje;
|
|
1047
1490
|
});
|
|
@@ -1075,7 +1518,7 @@ var velikostNormalizator = {
|
|
|
1075
1518
|
const najdene = [];
|
|
1076
1519
|
const izhod = v.replace(BESEDA, (ujemanje, ...args) => {
|
|
1077
1520
|
const kljuc = kljucBesede(ujemanje);
|
|
1078
|
-
const velikost = VELIKOSTI_SINONIMI[kljuc];
|
|
1521
|
+
const velikost = VELIKOSTI_SINONIMI[kljuc] ?? VELIKOSTI_EN[kljuc];
|
|
1079
1522
|
if (!velikost)
|
|
1080
1523
|
return ujemanje;
|
|
1081
1524
|
const mesto = args[args.length - 2];
|
|
@@ -1129,11 +1572,14 @@ var VET_NORMALIZATORJI = [
|
|
|
1129
1572
|
kodiranjeNormalizator,
|
|
1130
1573
|
decimalkeNormalizator,
|
|
1131
1574
|
pantheonOznakaNormalizator,
|
|
1132
|
-
tipskeOznakeNormalizator,
|
|
1133
1575
|
enoteNormalizator,
|
|
1134
1576
|
znamkaNormalizator,
|
|
1577
|
+
razdeljevalciNormalizator,
|
|
1578
|
+
prevodiNormalizator,
|
|
1579
|
+
tipskeOznakeNormalizator,
|
|
1135
1580
|
kolicinaNormalizator,
|
|
1136
1581
|
velikostNormalizator,
|
|
1582
|
+
starostNormalizator,
|
|
1137
1583
|
vrstaNormalizator,
|
|
1138
1584
|
oznakeNormalizator
|
|
1139
1585
|
];
|
|
@@ -1142,6 +1588,10 @@ var VET_TABELA = {
|
|
|
1142
1588
|
linije: LINIJE_ZNAMK,
|
|
1143
1589
|
dobavitelji: DOBAVITELJI,
|
|
1144
1590
|
oznake: OZNAKE,
|
|
1591
|
+
prevodi: PREVODI_MAP,
|
|
1592
|
+
stopBesede: STOP_MAP,
|
|
1593
|
+
starosti: STAROSTI,
|
|
1594
|
+
velikostiEn: VELIKOSTI_EN,
|
|
1145
1595
|
vir: ZNAMKE_GEN.vir
|
|
1146
1596
|
};
|
|
1147
1597
|
// src/vet/spec.ts
|
|
@@ -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
|
|
1995
|
-
const
|
|
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
|
|
2008
|
-
const
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
|
|
2013
|
-
|
|
2014
|
-
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
|
|
2023
|
-
|
|
2024
|
-
|
|
2025
|
-
|
|
2026
|
-
|
|
2027
|
-
|
|
2028
|
-
|
|
2029
|
-
|
|
2030
|
-
|
|
2031
|
-
|
|
2032
|
-
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
|
|
2036
|
-
|
|
2037
|
-
|
|
2038
|
-
|
|
2039
|
-
|
|
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
|
-
|
|
2043
|
-
|
|
2044
|
-
|
|
2045
|
-
|
|
2046
|
-
|
|
2047
|
-
|
|
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(
|
|
2052
|
-
const b = kotSeznam(
|
|
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
|
|
2061
|
-
const
|
|
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
|