1// Pazarlama sitesi fiyatlarını ziyaretçinin para birimine çevirir. 2// 3// Neden istemcide: site 700+ statik HTML ve arkasında CDN/tarayıcı önbelleÄi 4// var. Fiyatı sunucuda gövdeye yazmak, önbellekteki bir sayfanın YANLIŠülkenin 5// fiyatını taÅıması demekti (ilk isteyen kimse onun para birimi donardı). 6// İstemci çevrimi bu sınıf hatayı tümüyle ortadan kaldırır. 7// 8// Neden metin düÄümü yürüyüÅü: fiyat 24 dosyada, farklı sarmalayıcılar içinde 9// ve bazıları "$9.50/ay" gibi cümlenin ortasında geçiyor; ortak bir CSS 10// seçicisi yok. YürüyüŠ`script`/`style`/`code` içine GİRMEZ â JSON-LD ve 11// yapılandırılmıŠveri bozulmadan kalır (SEO'da dolar fiyatı görünür). 12// 13// Sunucu tarafı sözleÅme: GET /api/public/fx â {currency, symbol, rate, decimals} 14(function () { 15 'use strict'; 16 17 // Yalnız "$12.34" / "$1,234.56" biçimi. Ondalık ZORUNLU: "$1M büyüme" gibi 18 // fiyat olmayan tutarlara dokunmayalım. 19 var FIYAT = /\$\s?(\d{1,3}(?:,\d{3})*|\d+)\.(\d{2})\b/g; 20 var ATLA = { SCRIPT: 1, STYLE: 1, CODE: 1, PRE: 1, TEXTAREA: 1, NOSCRIPT: 1 }; 21 var ANAHTAR = 'mzFx'; // sessionStorage önbelleÄi 22 23 function bicimle(tutar, kur) { 24 var ondalik = kur.decimals; 25 // Büyük tutarlarda kuruÅ göstermek gürültü: âº15.234,00 yerine âº15.234. 26 if (ondalik === 2 && tutar >= 1000) ondalik = 0; 27 var s; 28 try { 29 s = tutar.toLocaleString(kur.currency === 'TRY' ? 'tr-TR' : undefined, { 30 minimumFractionDigits: ondalik, maximumFractionDigits: ondalik, 31 }); 32 } catch (e) { 33 s = tutar.toFixed(ondalik); 34 } 35 var sim = kur.symbol || kur.currency; 36 return sim.length <= 2 ? sim + s : s + ' ' + sim; 37 } 38 39 function cevir(kur) { 40 if (!kur || !kur.rate || kur.currency === 'USD') return; 41 var yurutec = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, { 42 acceptNode: function (n) { 43 if (!n.nodeValue || n.nodeValue.indexOf('$') < 0) return NodeFilter.FILTER_REJECT; 44 var p = n.parentNode; 45 if (!p || ATLA[p.nodeName]) return NodeFilter.FILTER_REJECT; 46 return NodeFilter.FILTER_ACCEPT; 47 }, 48 }); 49 var dugumler = [], d; 50 while ((d = yurutec.nextNode())) dugumler.push(d); 51 dugumler.forEach(function (n) { 52 var yeni = n.nodeValue.replace(FIYAT, function (tam, tamsayi, kesir) { 53 var usd = parseFloat(tamsayi.replace(/,/g, '') + '.' + kesir); 54 if (!isFinite(usd)) return tam; 55 return bicimle(usd * kur.rate, kur); 56 }); 57 if (yeni !== n.nodeValue) { 58 n.nodeValue = yeni; 59 // Aslı kaybolmasın: fareyle üstüne gelince dolar tutarı görünsün. 60 var p = n.parentElement; 61 if (p && !p.title) p.title = n.nodeValue + ' â ' + (kur.currency) + 62 ' (' + kur.currency + '/USD ' + Number(kur.rate).toFixed(2) + ')'; 63 } 64 }); 65 document.documentElement.setAttribute('data-mz-currency', kur.currency); 66 } 67 68 function calistir() { 69 var onbellek = null; 70 try { onbellek = JSON.parse(sessionStorage.getItem(ANAHTAR) || 'null'); } catch (e) {} 71 if (onbellek && onbellek.currency) { cevir(onbellek); return; } 72 fetch('/api/public/fx', { credentials: 'omit' }) 73 .then(function (r) { return r.ok ? r.json() : null; }) 74 .then(function (k) { 75 if (!k) return; 76 try { sessionStorage.setItem(ANAHTAR, JSON.stringify(k)); } catch (e) {} 77 cevir(k); 78 }) 79 .catch(function () { /* kur alınamazsa sayfa dolar fiyatıyla kalır */ }); 80 } 81 82 if (document.readyState === 'loading') { 83 document.addEventListener('DOMContentLoaded', calistir); 84 } else { 85 calistir(); 86 } 87})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.