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

بدون خلاصۀ ویرایش
بدون خلاصۀ ویرایش
خط ۷۶۷: خط ۷۶۷:
});
});


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


======================================================
    // فقط در صفحاتی اجرا شود که قالب CitySearch در آن‌ها قرار دارد
==============================================================
    if (!$wrapper.length) {
        return;
    }
 
    // جلوگیری از اجرای دوباره در صورت بارگذاری پویا
    if ($wrapper.data('citySearchReady')) {
        return;
    }
    $wrapper.data('citySearchReady', true);
 
    var data = [
        {
            province: 'آذربایجان شرقی',
            cities: ['تبریز', 'مراغه', 'مرند', 'بناب']
        },
        {
            province: 'آذربایجان غربی',
            cities: ['ارومیه', 'خوی', 'مهاباد', 'بوکان']
        },
        {
            province: 'اردبیل',
            cities: ['اردبیل', 'پارس آباد', 'خلخال']
        },
        {
            province: 'اصفهان',
            cities: ['اصفهان', 'کاشان', 'خمینی‌شهر', 'نجف آباد']
        },
        {
            province: 'البرز',
            cities: ['کرج', 'فردیس', 'نظر آباد']
        },
        {
            province: 'تهران',
            cities: ['تهران', 'اسلامشهر', 'شهریار', 'قدس', 'پردیس', 'قرچک']
        },
        {
            province: 'خراسان رضوی',
            cities: ['مشهد', 'نیشابور', 'سبزوار']
        },
        {
            province: 'فارس',
            cities: ['شیراز', 'مرودشت', 'فسا']
        },
        {
            province: 'گیلان',
            cities: ['رشت', 'بندر انزلی', 'لاهیجان']
        },
        {
            province: 'مازندران',
            cities: ['ساری', 'آمل', 'بابل']
        },
        {
            province: 'یزد',
            cities: ['یزد', 'میبد', 'اردکان']
        }
    ];
 
    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;
 
        data.forEach(function (item) {
            var provinceMatches = normalizeText(item.province).indexOf(query) !== -1;
 
            var cities = item.cities.filter(function (city) {
                return provinceMatches || normalizeText(city).indexOf(query) !== -1;
            });
 
            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>';
            });
 
            html += '</ul>';
            html += '</section>';
        });
 
        if (!resultCount) {
            html = '<p class="city-no-result">شهری یا استانی با این نام پیدا نشد.</p>';
        }
 
        $container.html(html);
    }
 
    $input.on('input', function () {
        render($(this).val());
    });
 
    render('');
});