مدیاویکی:Common.js: تفاوت بین نسخهها
از ولایت حضرت علی و حضرت زهرا
| سطر ۱۳۴: | سطر ۱۳۴: | ||
//showSujects('minutes', 'دقایق سخنرانی') | //showSujects('minutes', 'دقایق سخنرانی') | ||
| + | |||
| + | document.addEventListener("DOMContentLoaded", function () { | ||
| + | |||
| + | function setupFind(box) { | ||
| + | const input = box.querySelector('.mw-find-input'); | ||
| + | const prev = box.querySelector('.mw-find-prev'); | ||
| + | const next = box.querySelector('.mw-find-next'); | ||
| + | const count = box.querySelector('.mw-find-count'); | ||
| + | |||
| + | let matches = []; | ||
| + | let index = 0; | ||
| + | |||
| + | function clearHighlights() { | ||
| + | matches.forEach(el => { | ||
| + | const text = el.textContent; | ||
| + | el.replaceWith(document.createTextNode(text)); | ||
| + | }); | ||
| + | matches = []; | ||
| + | } | ||
| + | |||
| + | function highlight(term) { | ||
| + | clearHighlights(); | ||
| + | if (!term) { | ||
| + | count.textContent = ''; | ||
| + | return; | ||
| + | } | ||
| + | |||
| + | const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null); | ||
| + | const regex = new RegExp(term, 'gi'); | ||
| + | |||
| + | while (walker.nextNode()) { | ||
| + | const node = walker.currentNode; | ||
| + | if (node.parentNode.tagName === 'SCRIPT') continue; | ||
| + | |||
| + | if (regex.test(node.textContent)) { | ||
| + | const span = document.createElement('span'); | ||
| + | span.innerHTML = node.textContent.replace(regex, match => | ||
| + | `<mark class="mw-find-highlight">${match}</mark>` | ||
| + | ); | ||
| + | node.replaceWith(span); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | matches = Array.from(document.querySelectorAll('.mw-find-highlight')); | ||
| + | index = 0; | ||
| + | |||
| + | update(); | ||
| + | } | ||
| + | |||
| + | function update() { | ||
| + | matches.forEach(m => m.classList.remove('active')); | ||
| + | if (matches.length) { | ||
| + | matches[index].classList.add('active'); | ||
| + | matches[index].scrollIntoView({ behavior: 'smooth', block: 'center' }); | ||
| + | count.textContent = `${index + 1} / ${matches.length}`; | ||
| + | } else { | ||
| + | count.textContent = '0'; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | next.onclick = () => { | ||
| + | if (!matches.length) return; | ||
| + | index = (index + 1) % matches.length; | ||
| + | update(); | ||
| + | }; | ||
| + | |||
| + | prev.onclick = () => { | ||
| + | if (!matches.length) return; | ||
| + | index = (index - 1 + matches.length) % matches.length; | ||
| + | update(); | ||
| + | }; | ||
| + | |||
| + | input.oninput = () => highlight(input.value); | ||
| + | } | ||
| + | |||
| + | document.querySelectorAll('.mw-find-box').forEach(setupFind); | ||
| + | }); | ||
نسخهٔ ۳ دسامبر ۲۰۲۵، ساعت ۱۰:۴۸
/* Any JavaScript here will be loaded for all users on every page load. */
$(function () {
var targets = $('[rel~=tooltip]'),
target = false,
tooltip = false,
title = false;
targets.bind('mouseenter', function () {
target = $(this);
tip = target.attr('title');
tooltip = $('<div id="tooltip"></div>');
if (!tip || tip == '')
return false;
target.removeAttr('title');
tooltip.css('opacity', 0)
.html(tip)
.appendTo('body');
var init_tooltip = function () {
if ($(window).width() < tooltip.outerWidth() * 1.5)
tooltip.css('max-width', $(window).width() / 2);
else
tooltip.css('max-width', 340);
var pos_left = target.offset().left + (target.outerWidth() / 2) - (tooltip.outerWidth() / 2),
pos_top = target.offset().top - tooltip.outerHeight() - 20;
if (pos_left < 0) {
pos_left = target.offset().left + target.outerWidth() / 2 - 20;
tooltip.addClass('left');
}
else
tooltip.removeClass('left');
if (pos_left + tooltip.outerWidth() > $(window).width()) {
pos_left = target.offset().left - tooltip.outerWidth() + target.outerWidth() / 2 + 20;
tooltip.addClass('right');
}
else
tooltip.removeClass('right');
if (pos_top < 0) {
var pos_top = target.offset().top + target.outerHeight();
tooltip.addClass('top');
}
else
tooltip.removeClass('top');
tooltip.css({ left: pos_left, top: pos_top })
.animate({ top: '+=10', opacity: 1 }, 50);
};
init_tooltip();
$(window).resize(init_tooltip);
var remove_tooltip = function () {
tooltip.animate({ top: '-=10', opacity: 0 }, 50, function () {
$(this).remove();
});
target.attr('title', tip);
};
target.bind('mouseleave', remove_tooltip);
tooltip.bind('click', remove_tooltip);
});
});
$('.col-lg-9').removeClass('col')
$('.col-lg-3').removeClass('col')
function showSujects(subjectClass, title) {
// Get all the elements with the class "subjects"
var subjects = $(subjectClass);
// Create an empty list to hold the IDs of the selected elements
var selectedTitles = [];
var selectedIds = [];
var types = [];
// Loop through each element with the class "subjects"
subjects.each(function () {
// Get the ID of the current element
var currentTitle = $(this).attr('data-headline');
var currentId = $(this).attr('id');
// Add the ID to the list of selected IDs
selectedTitles.push(currentTitle);
selectedIds.push(currentId);
types.push($(this).hasClass('minutes'))
});
if (selectedTitles.length === 0) {
return
}
// console.log('selecting subjects')
// Loop through the selected IDs and create a new div for each one
var headlines = [];
for (var i = 0; i < selectedTitles.length; i++) {
var tocWrapper = '';
var id = parseInt(selectedIds[i]);
console.log(id);
if (types[i])
tocWrapper = $("<div class='tocMinuts'></div>");
else
tocWrapper = $("<li></li>");
var newDiv = $("<a class='subjectToc' href='#" + selectedIds[i] + "'></a>");
newDiv.text(selectedTitles[i]);
tocWrapper.append(newDiv);
headlines.push(tocWrapper);
}
// Wrap all the new divs in a specific div with the ID "new-div-container"
var headLineContainer = $("<div></div>");
headLineContainer.addClass("infobox mw-collapsible");
headLineContainer.css("width", "22em");
var ToggleSpan = $("<span >" + title + "</span>")
var headLineWrapper = $("<ol></ol>");
headLineWrapper.addClass("headWrapperSubjects");
headLineWrapper.addClass("mw-collapsible-content");
headLineWrapper.append(headlines);
headLineContainer.append(ToggleSpan);
headLineContainer.append(headLineWrapper);
// Add the new div container after the table with the ID "my-table"
$(".infobox.vcard").after(headLineContainer);
}
showSujects('.subjects, .minutes', 'موضوعات');
//showSujects('minutes', 'دقایق سخنرانی')
document.addEventListener("DOMContentLoaded", function () {
function setupFind(box) {
const input = box.querySelector('.mw-find-input');
const prev = box.querySelector('.mw-find-prev');
const next = box.querySelector('.mw-find-next');
const count = box.querySelector('.mw-find-count');
let matches = [];
let index = 0;
function clearHighlights() {
matches.forEach(el => {
const text = el.textContent;
el.replaceWith(document.createTextNode(text));
});
matches = [];
}
function highlight(term) {
clearHighlights();
if (!term) {
count.textContent = '';
return;
}
const walker = document.createTreeWalker(document.body, NodeFilter.SHOW_TEXT, null);
const regex = new RegExp(term, 'gi');
while (walker.nextNode()) {
const node = walker.currentNode;
if (node.parentNode.tagName === 'SCRIPT') continue;
if (regex.test(node.textContent)) {
const span = document.createElement('span');
span.innerHTML = node.textContent.replace(regex, match =>
`<mark class="mw-find-highlight">${match}</mark>`
);
node.replaceWith(span);
}
}
matches = Array.from(document.querySelectorAll('.mw-find-highlight'));
index = 0;
update();
}
function update() {
matches.forEach(m => m.classList.remove('active'));
if (matches.length) {
matches[index].classList.add('active');
matches[index].scrollIntoView({ behavior: 'smooth', block: 'center' });
count.textContent = `${index + 1} / ${matches.length}`;
} else {
count.textContent = '0';
}
}
next.onclick = () => {
if (!matches.length) return;
index = (index + 1) % matches.length;
update();
};
prev.onclick = () => {
if (!matches.length) return;
index = (index - 1 + matches.length) % matches.length;
update();
};
input.oninput = () => highlight(input.value);
}
document.querySelectorAll('.mw-find-box').forEach(setupFind);
});
