|
Метки: очистка ручная отмена отменено |
Строка 1: |
Строка 1: |
| $(document).ready(function() {
| |
| console.log("Скрипт дерева категорий загружен.");
| |
|
| |
|
| function saveTreeHTML() {
| |
| console.log("Сохраняем HTML дерева...");
| |
| var treeHTML = $('#p-categorytree-portlet .CategoryTreeTag').html();
| |
| localStorage.setItem('categoryTreeHTML', treeHTML);
| |
| }
| |
|
| |
| function restoreTreeHTML() {
| |
| console.log("Восстанавливаем HTML дерева...");
| |
| var treeHTML = localStorage.getItem('categoryTreeHTML');
| |
| if (treeHTML) {
| |
| $('#p-categorytree-portlet .CategoryTreeTag').html(treeHTML);
| |
| }
| |
| }
| |
|
| |
| restoreTreeHTML();
| |
|
| |
| $('body').on('click', '#p-categorytree-portlet .CategoryTreeItem', function(event) {
| |
| var $target = $(event.target);
| |
| var $item = $(this);
| |
| var $toggleButton = $item.find('.CategoryTreeToggle').first();
| |
| var isCategory = !$item.find('.CategoryTreePageBullet').length;
| |
|
| |
| if ($target.hasClass('CategoryTreeToggle')) return;
| |
|
| |
| if ($target.is('a') && isCategory) {
| |
| event.preventDefault();
| |
| $toggleButton.click();
| |
| } else if (isCategory) {
| |
| $toggleButton.click();
| |
| } else {
| |
| var link = $item.find('a').attr('href');
| |
| if (link) {
| |
| saveTreeHTML();
| |
| localStorage.setItem('lastOpenedPageTitle', $item.text().trim());
| |
| window.location.href = link;
| |
| }
| |
| }
| |
| saveTreeHTML();
| |
| });
| |
|
| |
| function scrollToCategory(categoryTitle) {
| |
| var $categoryItem = $('#p-categorytree-portlet .CategoryTreeItem').filter(function() {
| |
| return $(this).text().trim() === categoryTitle;
| |
| });
| |
|
| |
| if ($categoryItem.length) {
| |
| console.log("Категория найдена, перематываем...");
| |
| $('#p-categorytree-portlet').animate({
| |
| scrollTop: $categoryItem.position().top - 50
| |
| }, 500, function() {
| |
| $('.CategoryTreeItem').removeClass('highlighted');
| |
| $categoryItem.addClass('highlighted');
| |
| });
| |
|
| |
| localStorage.setItem('highlightedCategory', categoryTitle);
| |
| return true;
| |
| }
| |
|
| |
| return false;
| |
| }
| |
|
| |
| function expandAndFindCategory($parent, callback) {
| |
| var $toggleButton = $parent.find('.CategoryTreeToggle').first();
| |
| if ($toggleButton.length && !$parent.hasClass('expanded')) {
| |
| $toggleButton.click();
| |
|
| |
| setTimeout(function() {
| |
| if (scrollToCategory(mw.config.get('wgTitle'))) {
| |
| callback(true);
| |
| } else {
| |
| callback(false);
| |
| }
| |
| }, 1000);
| |
| } else {
| |
| callback(false);
| |
| }
| |
| }
| |
|
| |
| function fetchCategoriesAndExpand(pageTitle) {
| |
| var apiUrl = mw.util.wikiScript('api');
| |
| $.getJSON(apiUrl, {
| |
| action: 'query',
| |
| titles: pageTitle,
| |
| prop: 'categories',
| |
| format: 'json'
| |
| }).done(function(data) {
| |
| var pages = data.query.pages;
| |
| var pageId = Object.keys(pages)[0];
| |
| var categories = pages[pageId].categories;
| |
|
| |
| if (categories) {
| |
| categories.forEach(function(category) {
| |
| var categoryTitle = category.title;
| |
| var $categoryItems = $('#p-categorytree-portlet .CategoryTreeItem');
| |
| var $categoryItem = $categoryItems.filter(function() {
| |
| return $(this).text().trim() === categoryTitle;
| |
| });
| |
|
| |
| if ($categoryItem.length) {
| |
| expandAndFindCategory($categoryItem, function(found) {
| |
| if (!found) {
| |
| console.log("Категория не найдена, продолжаем поиск...");
| |
| }
| |
| });
| |
| }
| |
| });
| |
| }
| |
| });
| |
| }
| |
|
| |
| function recursiveSearchForCategory() {
| |
| console.log("Очищаем localStorage перед поиском...");
| |
| localStorage.removeItem('lastOpenedPageTitle');
| |
| localStorage.removeItem('highlightedCategory');
| |
|
| |
| var currentPageTitle = mw.config.get('wgTitle');
| |
| if (!currentPageTitle) {
| |
| console.log("Не удалось определить текущую страницу.");
| |
| return;
| |
| }
| |
|
| |
| console.log("Начинаем поиск категории для текущей страницы:", currentPageTitle);
| |
|
| |
| if (scrollToCategory(currentPageTitle)) {
| |
| return;
| |
| }
| |
|
| |
| fetchCategoriesAndExpand(currentPageTitle);
| |
| }
| |
|
| |
| setTimeout(function() {
| |
| recursiveSearchForCategory();
| |
| }, 500);
| |
|
| |
| $(window).on('beforeunload', saveTreeHTML);
| |
| });
| |