Различие между версиями «MediaWiki:Gadget-HideEmptyness.js»

Материал из Викисловаря
Содержимое удалено Содержимое добавлено
Нет описания правки
v.1.5: Fixing styles
Строка 1: Строка 1:
/**
/**
* Версия: Gadget-HideEmptyness 1.4
* Версия: Gadget-HideEmptyness 1.5
* Автор: Vitalik
* Автор: Vitalik
* Описание: Гаджет предназначен для скрытия информации, которая кому-то может
* Описание: Гаджет предназначен для скрытия информации, которая кому-то может
Строка 27: Строка 27:
$ul = $('<ul>');
$ul = $('<ul>');
} else if ($('body').hasClass('skin-vector')) {
} else if ($('body').hasClass('skin-vector')) {
$block = $('<div class="portal" role="navigation" id="p-hide" aria-labelledby="p-hide-label">');
$block = $('<nav id="p-hide" class="vector-menu vector-menu-portal portal" aria-labelledby="p-hide-label" role="navigation">');
// <a href="/wiki/Викисловарь:Гаджеты/Скрыть пустоту">[?]</a>
// <a href="/wiki/Викисловарь:Гаджеты/Скрыть пустоту">[?]</a>
// $h3 = $('<h3 id="p-hide-label" tabindex="3"><a aria-haspopup="true" aria-controls="p-hide-list" role="button" aria-pressed="false" aria-expanded="false">Скрыть пустоту</a></h3>');
// $h3 = $('<h3 id="p-hide-label" tabindex="3"><a aria-haspopup="true" aria-controls="p-hide-list" role="button" aria-pressed="false" aria-expanded="false">Скрыть пустоту</a></h3>');
$h3 = $('<h3 id="p-hide-label">Скрыть пустоту</h3>');
$h3 = $('<h3 id="p-hide-label">Скрыть пустоту</h3>');
$subblock = $('<div class="body">');
$subblock = $('<div class="body vector-menu-content">');
$ul = $('<ul id="p-hide-list">');
$ul = $('<ul id="p-hide-list" class="vector-menu-content-list">');
}
}
$subblock.append($ul);
$subblock.append($ul);

Версия от 21:05, 27 августа 2020

/**
 * Версия: Gadget-HideEmptyness 1.5
 * Автор: Vitalik
 * Описание: Гаджет предназначен для скрытия информации, которая кому-то может 
 * показаться лишней. Например: пустые разделы, пустой морфемный состав, пустые
 * примеры, пометы заготовок ("болванка" или "нуждается в доработке")
 */

(function ($) {
	var hideEmptySections = false; // необходимость скрывать пустые заголовки
	var hideEmptyMorfo = false;    // необходимость скрывать пустую морфемику
	var hideEmptyExamples = false; // необходимость скрывать пустые примеры
	var hideEmptyLists = false;    // необходимость скрывать списки из "?" и "-"
	var hideStubBlocks = false;    // необходимость скрывать пометы заготовок

	/**
	 * функция для создания или получения существующего блока "Оформление",
	 * который находится ниже блока 
	 */
	function getViewBlock() {
		if (!$('#p-hide').is('*')) {
			var $block, $h3, $subblock, $ul;
			if ($('body').hasClass('skin-monobook')) {
				$block = $('<div class="portlet" id="p-tb" role="navigation">');
				$h3 = $('<h3>Скрыть пустоту</h3>');
				$subblock = $('<div class="pBody">');
				$ul = $('<ul>');
			} else if ($('body').hasClass('skin-vector')) {
				$block = $('<nav id="p-hide" class="vector-menu vector-menu-portal portal" aria-labelledby="p-hide-label" role="navigation">');
				// <a href="/wiki/Викисловарь:Гаджеты/Скрыть пустоту">[?]</a>
				// $h3 = $('<h3 id="p-hide-label" tabindex="3"><a aria-haspopup="true" aria-controls="p-hide-list" role="button" aria-pressed="false" aria-expanded="false">Скрыть пустоту</a></h3>');
				$h3 = $('<h3 id="p-hide-label">Скрыть пустоту</h3>');
				$subblock = $('<div class="body vector-menu-content">');
				$ul = $('<ul id="p-hide-list" class="vector-menu-content-list">');
			}
			$subblock.append($ul);
			$block.append($h3);
			$block.append($subblock);
			$('#p-tb').after($block);
			return $ul;
		} else {
			return $('#p-hide-list');
		}
	}

	/**
	 * функция для создания или получения существующего блока "Оформление",
	 * который находится ниже блока
	 */
	function getStatusSymbol(hideEmptyExamples) {
		if (hideEmptyExamples) {
			return '<span style="font-weight: bold;">×</span>';
		} else {
			return '<span style="color: silver;">×</span>';
		}
	}

	/**
	 * Функция для проверки того, что элемент является последним в секции
	 * (т.е. следующий элемент либо является заголовком, либо концом страницы)
	 */
	function isLastInSection($item) {
		var $next = $item.next();
		return $.inArray($next.prop("tagName"), ['H1', 'H2', 'H3', 'H4']) != -1
			|| $next.attr('id') == 'catlinks' 
			|| $next.hasClass('stub-main-footer');
	}

	/**
	 * Функция обработки щелчка по опции "Пустые заголовки"
	 */
	function switchEmptySections(force) {
		if (force !== true) {
			hideEmptySections = !hideEmptySections;
			if ('localStorage' in window) { // сохранение текущего состояния
				localStorage.hideEmptySections = hideEmptySections;
			}
		}
		var hideItems = [
			$('h3+h1').prev(),
			$('h3+h2').prev(),
			$('h3+h3').prev(),
			$('h4+h3').prev(),
			$('h4+h4').prev(),
			$('h3+#catlinks').prev(),
			$('h3+.stub-main-footer').prev()
		];
		$('h3+p').each(function () {
			if ($(this).text().match(/^(Происходит от|От|Из|\?\?)([  ]\?\?)?\s*$/g)) {
				if (isLastInSection($(this))) {
					hideItems.push($(this));
					hideItems.push($(this).prev());
				}
			}
		});
		$('h3+p, h3+ol, h3+ul, h4+ol, h4+ul').each(function () {
			if ($.trim($(this).text()) === "") {
				if (isLastInSection($(this))) {
					hideItems.push($(this));
					hideItems.push($(this).prev());
				}
			}
		});
		$('h3+table.collapsible').each(function () {
			var $tr = $(this).find('tr').next();
			if ($tr.children().length == 1 && $.trim($tr.children().text()) === "") {
				if (isLastInSection($(this))) {
					hideItems.push($(this));
					hideItems.push($(this).prev());
				}
			}
		});
		for (var index = 0; index < hideItems.length; index++) {
			var hideItem = hideItems[index];
			if (force === true) {
				hideItem.hide();  // быстрое скрытие пустых разделов при загрузке страницы
			} else {
				if (hideEmptySections) {
					hideItem.fadeOut();  // скрытие пустых разделов
				} else {
					hideItem.fadeIn();  // показ пустых разделов
				}
			}
		}
		var status = getStatusSymbol(hideEmptySections);
		$('#hide-empty-sections').html(status + " пустые разделы");
	}

	/**
	 * Функция обработки щелчка по опции "Пустая морфемика"
	 */
	function switchEmptyMorfo(force) {
		if (force !== true) {
			hideEmptyMorfo = !hideEmptyMorfo;
			if ('localStorage' in window) {  // сохранение текущего состояния
				localStorage.hideEmptyMorfo = hideEmptyMorfo;
			}
		}
		$('p').each(function () {
			if ($.trim($(this).text()) != "Корень: --.") {
				return;
			}
			if (force === true) {
				$(this).hide();  // быстрое скрытие пустой морфемики при загрузке страницы
			} else {
				if (hideEmptyMorfo) {
					$(this).fadeOut();  // скрытие пустой морфемики
				} else {
					$(this).fadeIn();  // показ пустой морфемики
				}
			}
		});
		var status = getStatusSymbol(hideEmptyMorfo);
		$('#hide-empty-morfo').html(status + " пустая морфемика");
	}

	/**
	 * Функция для предварительной подготовки к возможности скрытия ромбика из
	 * примера
	 */
	function prepareEmptyExamples() {
		$('span').each(function () {
			if ($.trim($(this).text()) != "Отсутствует пример употребления (см. рекомендации).") {
				return;
			}
			var $parent = $(this).parent();
			var replacement = '<span class="hidden-rhombus">◆</span>';
			$parent.html($parent.html().replace('◆', replacement));
		});
	}

	/**
	 * Функция обработки щелчка по опции "Пустые примеры"
	 */
	function switchEmptyExamples(force) {
		if (force !== true) {
			hideEmptyExamples = !hideEmptyExamples;
			if ('localStorage' in window) {  // сохранение текущего состояния
				localStorage.hideEmptyExamples = hideEmptyExamples;
			}
		}
		$('span').each(function () {
			if ($.trim($(this).text()) != "Отсутствует пример употребления (см. рекомендации).") {
				return;
			}
			var $parent = $(this).parent();
			var replacement = '<span class="hidden-rhomb"></span>';
			if (force === true) {
				$(this).hide();  // быстрое скрытие пустых примеров при загрузке страницы
				$('.hidden-rhombus').hide();
			} else {
				if (hideEmptyExamples) {
					$(this).fadeOut();  // скрытие пустых примеров
					$('.hidden-rhombus').fadeOut();
				} else {
					$(this).fadeIn();  // показ пустых примеров
					$('.hidden-rhombus').fadeIn();
				}
			}
		});

		var status = getStatusSymbol(hideEmptyExamples);
		$('#hide-empty-examples').html(status + " пустые примеры");
	}

	/**
	 * Функция обработки щелчка по опции 'Списки из "?" и "—"'
	 */
	function switchEmptyLists(force) {
		if (force !== true) {
			hideEmptyLists = !hideEmptyLists;
			if ('localStorage' in window) { // сохранение текущего состояния
				localStorage.hideEmptyLists = hideEmptyLists;
			}
		}
		var hideItems = [];
		$('h3+ol, h4+ol').each(function () {
			if ($(this).text().match(/^\s*((—|-|\?)\s*)+$/g)) {
				if (isLastInSection($(this))) {
					hideItems.push($(this));
					hideItems.push($(this).prev());
				}
			}
		});
		for (var index = 0; index < hideItems.length; index++) {
			var hideItem = hideItems[index];
			if (force === true) {
				hideItem.hide();  // быстрое скрытие пустых списков при загрузке страницы
			} else {
				if (hideEmptyLists) {
					hideItem.fadeOut();  // скрытие пустых списков
				} else {
					hideItem.fadeIn();  // показ пустых списков
				}
			}
		}
		var status = getStatusSymbol(hideEmptyLists);
		$('#hide-empty-lists').html(status + ' списки из "?" и "—"');
	}

	/**
	 * Функция обработки щелчка по опции "Пометы заготовок"
	 */
	function switchStubBlocks(force) {
		if (force !== true) {
			hideStubBlocks = !hideStubBlocks;
			if ('localStorage' in window) {  // сохранение текущего состояния
				localStorage.hideStubBlocks = hideStubBlocks;
			}
		}
		var $stubBlocks = $('.stub-main-footer');
		if (force === true) {
			$stubBlocks.hide();  // быстрое скрытие помет заготовок при загрузке страницы
		} else {
			if (hideStubBlocks) {
				$stubBlocks.fadeOut();  // скрытие помет заготовок
			} else {
				$stubBlocks.fadeIn();  // показ помет заготовок
			}
		}
		var status = getStatusSymbol(hideStubBlocks);
		$('#hide-stub-blocks').html(status + " пометы заготовок");
	}
 
	$(document).ready(function () {
		if ($('.ns-0').is('*')) { // активация скрипта только для основного пространства
			var $block = getViewBlock();
			//'<a href="/wiki/test" title="test" accesskey="h">test</a>'
			var status = getStatusSymbol(false);
			$block.append($('<li>').append($('<a>', {
				id: 'hide-empty-sections',
				html: status + ' пустые разделы',
				on: {click: switchEmptySections}
			})));
			$block.append($('<li>').append($('<a>', {
				id: 'hide-empty-morfo',
				html: status + ' пустая морфемика',
				on: {click: switchEmptyMorfo}
			})));
			$block.append($('<li>').append($('<a>', {
				id: 'hide-empty-examples',
				html: status + ' пустые примеры',
				on: {click: switchEmptyExamples}
			})));
			$block.append($('<li>').append($('<a>', {
				id: 'hide-empty-lists',
				html: status + ' списки из "?" и "—"',
				on: {click: switchEmptyLists}
			})));
			$block.append($('<li>').append($('<a>', {
				id: 'hide-stub-blocks',
				html: status + ' пометы заготовок',
				on: {click: switchStubBlocks}
			})));

			prepareEmptyExamples();

			if ('localStorage' in window) { // загрузка прошлого состояния
				hideEmptySections = localStorage.hideEmptySections == 'true';
				hideEmptyMorfo = localStorage.hideEmptyMorfo == 'true';
				hideEmptyExamples = localStorage.hideEmptyExamples == 'true';
				hideEmptyLists = localStorage.hideEmptyLists == 'true';
				hideStubBlocks = localStorage.hideStubBlocks == 'true';
			}
			if (hideEmptySections) {
				// быстрое скрытие пустых разделов при загрузке страницы
				switchEmptySections(true);
			}
			if (hideEmptyMorfo) {
				// быстрое скрытие пустой морфемики при загрузке страницы
				switchEmptyMorfo(true);
			}
			if (hideEmptyExamples) {
				// быстрое скрытие пустых примеров при загрузке страницы
				switchEmptyExamples(true);
			}
			if (hideEmptyLists) {
				// быстрое скрытие пустых списков при загрузке страницы
				switchEmptyLists(true);
			}
			if (hideStubBlocks) {
				// быстрое скрытие помет заготовок при загрузке страницы
				switchStubBlocks(true);
			}
		}
	});
 
})(window.jQuery);