PageSourceSearch

https://morfoz.ai/public/price-localize.js?v=1790769371

js morfoz.ai collected 2026-10-05 15:11:01 UTC 3,686 bytes, 87 lines download raw bytes

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.