مدیاویکی: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);
});
حاج حسین خوش لهجه نابغه ولایت؛ حاج حسین خوش لهجه