مدیاویکی:Common.js
نکته: پس از انتشار ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.
- فایرفاکس / سافاری: کلید Shift را نگه دارید و روی دکمهٔ Reload کلیک کنید، یا کلیدهای Ctrl-F5 یا Ctrl-R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-R)
- گوگل کروم: کلیدهای Ctrl+Shift+R را با هم فشار دهید (در رایانههای اپل مکینتاش کلیدهای ⌘-Shift-R)
- Edge: کلید Ctrl را نگهدارید و روی دکمهٔ Refresh کلیک کنید، یا کلیدهای Ctrl-F5 را با هم فشار دهید
(function () {
/* =========================================================
سیستم تستهای تعاملی ویکیداد
نسخه مرکزی — هماهنگ با Master ماده ۱۵
========================================================= */
'use strict';
/* =========================================================
ابزارهای کمکی
========================================================= */
function getTestOptions(test) {
return test.find('.wd-test-option').filter(function () {
return $(this).closest('.wd-test')[0] === test[0];
});
}
function getTestResult(test) {
return test.find('.wd-test-result').filter(function () {
return $(this).closest('.wd-test')[0] === test[0];
}).first();
}
function getTestAnswer(test) {
return test.find('.wd-test-answer').filter(function () {
return $(this).closest('.wd-test')[0] === test[0];
}).first();
}
function normalizeAnswer(value) {
value = $.trim(value || '');
/*
* پاسخ میتواند مستقیماً «الف» باشد
* یا در بعضی شرایط با فاصله/نشانه همراه باشد.
*/
var match = value.match(
/^(الف|ب|ج|د|ه|هـ|و)/
);
if (match) {
return match[1];
}
return value.charAt(0);
}
/* =========================================================
آمادهسازی تستها
========================================================= */
function initWikidadTests() {
$('.wd-test').each(function () {
var test = $(this);
if (test.hasClass('wd-test-ready')) {
return;
}
test.addClass('wd-test-ready');
var options = getTestOptions(test);
/*
* اگر تست قبلاً پاسخ داده شده باشد،
* وضعیت را حفظ میکنیم.
*/
if (test.hasClass('wd-test-finished')) {
options.prop('disabled', true);
return;
}
/*
* طراحی پایه گزینهها
*
* رنگها مطابق طراحی ماده ۱۵
*/
options.css({
'display': 'block',
'width': '100%',
'box-sizing': 'border-box',
'padding': '10px 13px',
'margin': '7px 0',
'border': '1px solid #d9dfdc',
'border-radius': '6px',
'background': '#ffffff',
'color': '#455a64',
'cursor': 'pointer',
'font-family': 'inherit',
'font-size': '13.5px',
'line-height': '1.9',
'text-align': 'right',
'direction': 'rtl',
'transition':
'background .15s ease, border-color .15s ease, color .15s ease, box-shadow .15s ease'
});
/*
* نتیجه در شروع مخفی باشد.
*/
var result = getTestResult(test);
result.css({
'display': 'none',
'visibility': 'hidden',
'opacity': '0'
});
/*
* پاسخ و تحلیل در شروع مخفی باشد.
*/
var answer = getTestAnswer(test);
answer.css({
'display': 'none',
'visibility': 'hidden',
'opacity': '0'
});
});
}
/* =========================================================
اجرای آمادهسازی
========================================================= */
$(document).ready(function () {
initWikidadTests();
});
/* =========================================================
افکت ساده هنگام قرار گرفتن موس روی گزینه
========================================================= */
$(document).on(
'mouseenter',
'.wd-test:not(.wd-test-finished) .wd-test-option',
function () {
var option = $(this);
if (option.prop('disabled')) {
return;
}
option.css({
'background': '#faf8fc',
'border-color': '#cfc4d9',
'box-shadow': '0 1px 3px rgba(80,60,90,.06)'
});
}
);
$(document).on(
'mouseleave',
'.wd-test:not(.wd-test-finished) .wd-test-option',
function () {
var option = $(this);
if (option.prop('disabled')) {
return;
}
option.css({
'background': '#ffffff',
'border-color': '#d9dfdc',
'box-shadow': 'none'
});
}
);
/* =========================================================
کلیک روی گزینه
========================================================= */
$(document).on(
'click',
'.wd-test-option',
function (event) {
event.preventDefault();
event.stopPropagation();
var option = $(this);
var test = option.closest('.wd-test');
/*
* تست معتبر نیست.
*/
if (!test.length) {
return;
}
/*
* اگر قبلاً پاسخ داده شده،
* دیگر امکان تغییر پاسخ وجود ندارد.
*/
if (test.hasClass('wd-test-finished')) {
return;
}
/*
* جلوگیری از چندبار کلیک سریع
*/
if (option.prop('disabled')) {
return;
}
/*
* گزینههای همین تست
*/
var options = getTestOptions(test);
/*
* پاسخ صحیح از data-answer الگوی تست
*/
var correctAnswer = normalizeAnswer(
test.attr('data-answer') || ''
);
/*
* اگر data-answer خالی بود،
* از data-correct خود گزینهها استفاده میکنیم.
*
* این fallback باعث میشود ساختار جدید
* Python نیز مستقیماً قابل استفاده باشد.
*/
if (!correctAnswer) {
var optionContainer =
option.closest('.wd-test-options');
correctAnswer = normalizeAnswer(
optionContainer.attr('data-correct') || ''
);
}
/*
* پاسخ انتخابشده
*/
var selectedAnswer = normalizeAnswer(
option.attr('data-option') || ''
);
/*
* اگر data-option وجود نداشت،
* از متن گزینه استخراج شود.
*/
if (!selectedAnswer) {
selectedAnswer = normalizeAnswer(
option.text()
);
}
/*
* تعیین درست / غلط
*/
var isCorrect =
selectedAnswer === correctAnswer;
/*
* نتیجه و پاسخ همین تست
*/
var result = getTestResult(test);
var resultMessage =
result.find('.wd-test-result-message').first();
var answer = getTestAnswer(test);
/* =================================================
پاک کردن وضعیت قبلی گزینهها
================================================= */
options.css({
'background': '#ffffff',
'border-color': '#d9dfdc',
'color': '#455a64',
'font-weight': 'normal',
'box-shadow': 'none'
});
/* =================================================
مشخص کردن گزینه انتخابشده
================================================= */
if (isCorrect) {
option.css({
'background': '#edf8f5',
'border-color': '#527d77',
'color': '#405b56',
'font-weight': 'bold',
'box-shadow': '0 1px 3px rgba(82,125,119,.10)'
});
}
else {
option.css({
'background': '#fff2f2',
'border-color': '#b44a4a',
'color': '#9b3838',
'font-weight': 'bold',
'box-shadow': '0 1px 3px rgba(180,74,74,.10)'
});
/*
* پاسخ صحیح را نیز پیدا و سبز میکنیم.
*/
options.each(function () {
var item = $(this);
var itemAnswer =
normalizeAnswer(
item.attr('data-option') || ''
);
if (!itemAnswer) {
itemAnswer =
normalizeAnswer(
item.text()
);
}
if (itemAnswer === correctAnswer) {
item.css({
'background': '#edf8f5',
'border-color': '#527d77',
'color': '#405b56',
'font-weight': 'bold',
'box-shadow':
'0 1px 3px rgba(82,125,119,.10)'
});
}
});
}
/* =================================================
نمایش پیام نتیجه
================================================= */
result.css({
'display': 'block',
'visibility': 'visible',
'opacity': '1',
'padding': '10px 13px',
'border-radius': '6px'
});
if (isCorrect) {
result.css({
'background': '#edf8f5',
'border-right': '3px solid #527d77'
});
resultMessage
.text('✓ پاسخ شما صحیح است.')
.css({
'display': 'block',
'visibility': 'visible',
'opacity': '1',
'color': '#527d77',
'font-weight': 'bold'
});
}
else {
result.css({
'background': '#fff5f5',
'border-right': '3px solid #b44a4a'
});
resultMessage
.text('✕ پاسخ شما نادرست است.')
.css({
'display': 'block',
'visibility': 'visible',
'opacity': '1',
'color': '#b44a4a',
'font-weight': 'bold'
});
}
/* =================================================
نمایش پاسخ صحیح و تحلیل
================================================= */
if (answer.length) {
answer.css({
'display': 'block',
'visibility': 'visible',
'opacity': '1'
});
}
/* =================================================
قفل کردن همه گزینههای همین تست
================================================= */
options.prop('disabled', true);
options.css({
'cursor': 'default'
});
/*
* علامت پایان تست
*/
test
.addClass('wd-test-finished')
.attr('data-answered', 'true');
/*
* ثبت وضعیت روی خود option container
*/
test.find('.wd-test-options').first()
.attr('data-answered', 'true');
}
);
/* =========================================================
مشاهده / بستن متن نسخه قانون
========================================================= */
$(document).on(
'click',
'.wd-version-toggle',
function () {
var button = $(this);
var card = button.closest(
'.wd-version-history-card'
);
var text = card.find(
'.wd-version-text'
);
var icon = button.find(
'.wd-version-toggle-icon'
);
var label = button.find(
'.wd-version-toggle-label'
);
if (text.is(':visible')) {
text.stop(true, true)
.slideUp(180);
icon.text('+');
label.text('مشاهده متن');
}
else {
text.stop(true, true)
.slideDown(220);
icon.text('−');
label.text('بستن متن');
}
}
);
})();