مدیاویکی:Common.js: تفاوت میان نسخه‌ها

بدون خلاصۀ ویرایش
برچسب: برگردانده‌شده
بدون خلاصۀ ویرایش
برچسب: برگردانده‌شده
خط ۶۹۱: خط ۶۹۱:


=========================================================================
=========================================================================
(function () {
  function tokenize(html) {
    // فقط <br>, <br/>, <br /> را توکن جداگانه می‌کنیم؛ بقیه را کاراکتری تایپ می‌کنیم
    const out = [];
    const re = /<br\s*\/?>/ig;
    let last = 0, m;
    while ((m = re.exec(html)) !== null) {
      const chunk = html.slice(last, m.index);
      for (const ch of chunk) out.push(ch);
      out.push('<br>');
      last = re.lastIndex;
    }
    const tail = html.slice(last);
    for (const ch of tail) out.push(ch);
    return out;
  }


/* ==========================================================================
  function runTypewriter(root) {
  Sanjab Professional Typewriter Engine
    const nodes = root.querySelectorAll('.sj-type[data-sj-typewriter]');
  ========================================================================== */
     nodes.forEach((el) => {
mw.loader.using('jquery', function () {
      if (el.dataset.sjTyped === '1') return; // جلوگیری از اجرای دوباره
     $(document).ready(function () {
      el.dataset.sjTyped = '1';
        var $target = $('.sanjab-typewriter');
        if (!$target.length) return;


        $target.each(function () {
      const original = (el.innerHTML || '').trim();
            var $this = $(this);
      const tokens = tokenize(original);
            var originalHTML = $this.html().trim();
           
            $this.empty().css('visibility', 'visible');


            // تفکیک هوشمند کاراکترها و تگ‌های HTML مثل <br>
      el.innerHTML = '';
            var tokens = [];
      el.style.visibility = 'visible';
            var i = 0;
            while (i < originalHTML.length) {
                if (originalHTML.substr(i, 4).toLowerCase() === '<br>') {
                    tokens.push('<br>');
                    i += 4;
                } else if (originalHTML.substr(i, 5).toLowerCase() === '<br />') {
                    tokens.push('<br />');
                    i += 5;
                } else {
                    tokens.push(originalHTML[i]);
                    i++;
                }
            }


            var tokenIndex = 0;
      let i = 0;
            function typeNext() {
      const base = Number(el.dataset.speed || 55);   // سرعت پایه
                if (tokenIndex < tokens.length) {
      const jitter = Number(el.dataset.jitter || 45); // نوسان
                    $this.append(tokens[tokenIndex]);
                    tokenIndex++;
                   
                    // ایجاد سرعت متغیر طبیعی بین ۵۰ تا ۱۲۰ میلی‌ثانیه برای هر کاراکتر
                    var randomDelay = Math.random() * (120 - 50) + 50;
                   
                    // اگر کاراکتر بعدی شکست خط بود، کمی مکث بیشتر ایجاد کن
                    if (tokens[tokenIndex] === '<br>' || tokens[tokenIndex] === '<br />') {
                        randomDelay = 400;
                    }


                    setTimeout(typeNext, randomDelay);
      function step() {
                } else {
        if (i >= tokens.length) {
                    // پایان تایپ و محو کردن نشانگر
          setTimeout(() => el.classList.add('is-done'), 700);
                    setTimeout(function() {
          return;
                        $this.addClass('finished');
        }
                    }, 800);
        const t = tokens[i++];
                }
        if (t === '<br>') el.insertAdjacentHTML('beforeend', '<br>');
            }
        else el.appendChild(document.createTextNode(t));


            // شروع تایپ پس از نیم ثانیه تاخیر اولیه جهت لود کامل صفحه
        let delay = base + Math.random() * jitter;
            setTimeout(typeNext, 600);
        if (t === '<br>') delay = 320; // مکث روی رفتن به خط بعد
        });
        setTimeout(step, delay);
      }
 
      const startDelay = Number(el.dataset.delay || 300);
      setTimeout(step, startDelay);
     });
     });
});
  }
 
  // اجرا روی محتوای هر صفحه
  mw.hook('wikipage.content').add(function ($content) {
    runTypewriter($content[0]);
  });
})();


========================================================================
========================================================================