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

بدون خلاصۀ ویرایش
برچسب: برگردانده‌شده
بدون خلاصۀ ویرایش
 
(۲ نسخهٔ میانیِ ایجادشده توسط همین کاربر نشان داده نشد)
خط ۷۱۹: خط ۷۱۹:
});
});


/* سیستم جستجوی شهرها و استان‌ها */
mw.hook('wikipage.content').add(function ($content) {
    var $wrapper = $content.find('#city-search-wrapper');


    // فقط در صفحاتی اجرا شود که قالب در آن‌ها قرار دارد
    if (!$wrapper.length) {
        return;
    }


/* CitySearch: data generated from pasted-text.txt. */
    // جلوگیری از اجرای دو بار کد در صفحات داینامیک
(function () {
    if ($wrapper.data('citySearchReady')) {
  'use strict';
        return;
    }
    $wrapper.data('citySearchReady', true);


  var cityData = {
    var cityData = {
   "آذربایجان شرقی": [
   "آذربایجان شرقی": [
     {
     {
خط ۴٬۵۴۱: خط ۴٬۵۵۰:
   ]
   ]
};
};
    var $input = $wrapper.find('.city-search-input');
    var $container = $wrapper.find('.city-results-container');
    function normalizeText(text) {
        return String(text)
            .replace(/ي/g, 'ی')
            .replace(/ك/g, 'ک')
            .trim()
            .toLowerCase();
    }
    function escapeHtml(text) {
        return String(text)
            .replace(/&/g, '&')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#039;');
    }
    function render(filter) {
        var query = normalizeText(filter);
        var html = '';
        var resultCount = 0;


  function normalize(value) {
        data.forEach(function (item) {
    return String(value || '')
            var provinceMatches = normalizeText(item.province).indexOf(query) !== -1;
      .replace(/[‌‎‏]/g, ' ')
      .replace(/ي/g, 'ی')
      .replace(/ك/g, 'ک')
      .replace(/\s+/g, ' ')
      .trim()
      .toLocaleLowerCase('fa');
  }


  function escapeHtml(value) {
            var cities = item.cities.filter(function (city) {
    return String(value).replace(/[&<>"']/g, function (character) {
                return provinceMatches || normalizeText(city).indexOf(query) !== -1;
      return { '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#039;' }[character];
            });
    });
 
  }
            if (!cities.length) {
                return;
            }
 
            resultCount++;
 
            html += '<section class="province-section">';
            html += '<h3 class="province-title">' + escapeHtml(item.province) + '</h3>';
            html += '<ul class="city-list">';
 
            cities.forEach(function (city) {
                html += '<li class="city-item">' + escapeHtml(city) + '</li>';
            });


  function createResults(query) {
            html += '</ul>';
    var normalizedQuery = normalize(query);
            html += '</section>';
    var results = [];
        });


    Object.keys(cityData).forEach(function (province) {
        if (!resultCount) {
      var provinceMatches = normalize(province).indexOf(normalizedQuery) !== -1;
            html = '<p class="city-no-result">شهری یا استانی با این نام پیدا نشد.</p>';
      cityData[province].forEach(function (city) {
        if (provinceMatches || normalize(city.name).indexOf(normalizedQuery) !== -1) {
          results.push({ province: province, city: city });
         }
         }
      });
 
        $container.html(html);
    }
 
    $input.on('input', function () {
        render($(this).val());
     });
     });


     return results;
     // لود اولیه
  }
    render('');
});


  function initializeSearch(wrapper) {
    if (wrapper.dataset.citySearchReady === '1') {
      return;
    }
    wrapper.dataset.citySearchReady = '1';


    var input = wrapper.querySelector('.city-search-input');
/*
    var resultsContainer = wrapper.querySelector('.city-results-container');
  Faraghaib / فراغیب
    if (!input || !resultsContainer) {
  Paste this file into: MediaWiki:Common.js
      return;
  Vanilla JavaScript; no external library or framework is required.
    }
*/
(function () {
"use strict";
 
function toPersianNumber(value) {
return String(value).replace(/\d/g, function (digit) {
return "۰۱۲۳۴۵۶۷۸۹"[digit];
});
}
 
function initCounter(counter) {
if (counter.dataset.fgCounterReady === "true") {
return;
}
counter.dataset.fgCounterReady = "true";
var target = Number(counter.getAttribute("data-fg-count")) || 0;
var suffix = counter.getAttribute("data-fg-suffix") || "";
var duration = 1100;
var start = null;
 
function frame(timestamp) {
if (start === null) {
start = timestamp;
}
var progress = Math.min((timestamp - start) / duration, 1);
var eased = 1 - Math.pow(1 - progress, 3);
var current = Math.round(target * eased);
counter.textContent = toPersianNumber(current) + suffix;
if (progress < 1) {
window.requestAnimationFrame(frame);
}
}
 
window.requestAnimationFrame(frame);
}
 
function initCounters(root) {
var counters = root.querySelectorAll("[data-fg-count]");
if (!counters.length) {
return;
}
if (!("IntersectionObserver" in window)) {
counters.forEach(initCounter);
return;
}
var observer = new IntersectionObserver(function (entries, currentObserver) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
initCounter(entry.target);
currentObserver.unobserve(entry.target);
}
});
}, { threshold: 0.4 });
counters.forEach(function (counter) {
observer.observe(counter);
});
}
 
function initReveal(root) {
var elements = root.querySelectorAll(".fg-reveal");
if (!elements.length || !("IntersectionObserver" in window)) {
return;
}
elements.forEach(function (element) {
element.classList.add("fg-reveal--pending");
});
var observer = new IntersectionObserver(function (entries, currentObserver) {
entries.forEach(function (entry) {
if (entry.isIntersecting) {
entry.target.classList.add("fg-reveal--visible");
currentObserver.unobserve(entry.target);
}
});
}, { threshold: 0.12 });
elements.forEach(function (element) {
observer.observe(element);
});
}
 
function initSlider(slider) {
if (slider.dataset.fgSliderReady === "true") {
return;
}
var slides = Array.prototype.slice.call(slider.querySelectorAll(".fg-slide"));
var dots = Array.prototype.slice.call(slider.querySelectorAll(".fg-slider__dot"));
var previous = slider.querySelector(".fg-slider__button--prev");
var next = slider.querySelector(".fg-slider__button--next");
if (!slides.length || !dots.length) {
return;
}
 
var activeIndex = 0;
var timer = null;
var reducedMotion = window.matchMedia && window.matchMedia("(prefers-reduced-motion: reduce)").matches;
slider.dataset.fgSliderReady = "true";
slider.classList.add("fg-slider--ready");
 
function show(index) {
activeIndex = (index + slides.length) % slides.length;
slides.forEach(function (slide, slideIndex) {
var active = slideIndex === activeIndex;
slide.classList.toggle("is-active", active);
slide.setAttribute("aria-hidden", active ? "false" : "true");
});
dots.forEach(function (dot, dotIndex) {
var active = dotIndex === activeIndex;
dot.classList.toggle("is-active", active);
dot.setAttribute("aria-selected", active ? "true" : "false");
dot.setAttribute("tabindex", active ? "0" : "-1");
});
}
 
function stop() {
if (timer !== null) {
window.clearInterval(timer);
timer = null;
}
}


    function render() {
function start() {
      var query = input.value;
if (reducedMotion || document.hidden || timer !== null) {
      var results = createResults(query);
return;
}
timer = window.setInterval(function () {
show(activeIndex + 1);
}, 6200);
}


      if (!normalize(query)) {
if (previous) {
        resultsContainer.innerHTML = '<p class="city-search-message">نام شهر یا استان را وارد کنید.</p>';
previous.addEventListener("click", function () {
        return;
show(activeIndex - 1);
      }
stop();
      if (!results.length) {
start();
        resultsContainer.innerHTML = '<p class="city-search-message">شهری یا استانی با این نام پیدا نشد.</p>';
});
        return;
}
      }
if (next) {
next.addEventListener("click", function () {
show(activeIndex + 1);
stop();
start();
});
}
dots.forEach(function (dot, index) {
dot.addEventListener("click", function () {
show(index);
stop();
start();
});
dot.addEventListener("keydown", function (event) {
if (event.key === "ArrowLeft" || event.key === "ArrowRight") {
event.preventDefault();
show(activeIndex + (event.key === "ArrowLeft" ? 1 : -1));
dots[activeIndex].focus();
stop();
start();
}
});
});


      resultsContainer.innerHTML = results.slice(0, 100).map(function (result) {
slider.addEventListener("mouseenter", stop);
        return '<a class="city-search-result" href="' + escapeHtml(result.city.url) + '">' +
slider.addEventListener("mouseleave", start);
          '<span class="city-search-province">' + escapeHtml(result.province) + '</span>' +
slider.addEventListener("focusin", stop);
          '<span class="city-search-city">' + escapeHtml(result.city.name) + '</span>' +
slider.addEventListener("focusout", function (event) {
        '</a>';
if (!slider.contains(event.relatedTarget)) {
      }).join('');
start();
    }
}
});
document.addEventListener("visibilitychange", function () {
if (document.hidden) {
stop();
} else {
start();
}
});
show(0);
start();
}


    input.addEventListener('input', render);
function init(root) {
    render();
var container = root && root.jquery ? root[0] : root;
  }
var home = container && container.querySelector ? container.querySelector(".fg-home") : null;
if (!home) {
return;
}
home.querySelectorAll(".fg-slider").forEach(initSlider);
initCounters(home);
initReveal(home);
}


  mw.hook('wikipage.content').add(function ($content) {
if (window.mw && window.mw.hook) {
    $content.find('.city-search-wrapper').addBack('.city-search-wrapper').each(function () {
window.mw.hook("wikipage.content").add(init);
      initializeSearch(this);
} else {
    });
document.addEventListener("DOMContentLoaded", function () {
  });
init(document);
});
}
}());
}());