미디어위키:Gadget-Timeless.js

식물 vs 좀비 위키
Brokey (토론 | 기여)님의 2026년 7월 30일 (목) 19:27 판

참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.

  • 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
  • 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
  • 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
/* MediaWiki:Timeless.js
 * 문단 제목 아래 잔디밭 구분선 삽입
 */

(function () {
	'use strict';

	function installGrassDividers(root) {
		var scope = root || document;
		var wrappers;
		var legacyHeadings;

		wrappers = scope.querySelectorAll(
			'.skin-timeless .mw-parser-output .mw-heading2'
		);

		Array.prototype.forEach.call(wrappers, function (wrapper) {
			var divider;

			wrapper.classList.add('pvz-grass-heading');

			divider = wrapper.querySelector(
				':scope > .pvz-grass-divider'
			);

			if (!divider) {
				divider = document.createElement('span');
				divider.className = 'pvz-grass-divider';
				divider.setAttribute('aria-hidden', 'true');
				wrapper.appendChild(divider);
			}
		});

		legacyHeadings = scope.querySelectorAll(
			'.skin-timeless .mw-parser-output > h2'
		);

		Array.prototype.forEach.call(legacyHeadings, function (heading) {
			var divider;

			if (heading.closest('.mw-heading2')) {
				return;
			}

			heading.classList.add('pvz-grass-heading');

			divider = heading.querySelector(
				':scope > .pvz-grass-divider'
			);

			if (!divider) {
				divider = document.createElement('span');
				divider.className = 'pvz-grass-divider';
				divider.setAttribute('aria-hidden', 'true');
				heading.appendChild(divider);
			}
		});
	}

	function initGrassDividers() {
		var observer;

		installGrassDividers(document);

		observer = new MutationObserver(function (mutations) {
			mutations.forEach(function (mutation) {
				Array.prototype.forEach.call(
					mutation.addedNodes,
					function (node) {
						if (node.nodeType !== Node.ELEMENT_NODE) {
							return;
						}

						if (
							node.matches(
								'.mw-heading2, .mw-parser-output > h2'
							)
						) {
							installGrassDividers(node.parentNode);
							return;
						}

						installGrassDividers(node);
					}
				);
			});
		});

		observer.observe(document.body, {
			childList: true,
			subtree: true
		});
	}

	if (document.readyState === 'loading') {
		document.addEventListener(
			'DOMContentLoaded',
			initGrassDividers,
			{ once: true }
		);
	} else {
		initGrassDividers();
	}
}());

mw.loader.using( 'mobile.init' ).then( function () {
	requestAnimationFrame( function () {
		document
			.querySelectorAll(
				'.collapsible-heading-button[aria-expanded="false"]'
			)
			.forEach( function ( button ) {
				button.click();
			} );
	} );
} );