مدیاویکی:Common.js: تفاوت میان نسخهها
Esfandiari (بحث | مشارکتها) بدون خلاصۀ ویرایش |
Esfandiari (بحث | مشارکتها) بدون خلاصۀ ویرایش |
||
| خط ۷۶۷: | خط ۷۶۷: | ||
}); | }); | ||
/* ==================== سیستم جستجوی شهرها ==================== */ | |||
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, '<') | |||
.replace(/>/g, '>') | |||
.replace(/"/g, '"') | |||
.replace(/'/g, '''); | |||
} | |||
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(''); | |||
}); | |||