미디어위키:Common.js

신사 (토론 | 기여)님의 2026년 8월 20일 (목) 13:56 판

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

  • 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
  • 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
  • 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
  • 오페라: Ctrl-F5를 입력.
/**
 * 식별자에 대응하는 실제 collapsible 대상 찾기
 *
 * 동일한 id가 여러 번 사용되는 나무위키식/리브레위키식
 * 둘러보기 틀 구조도 지원.
 *
 * 예:
 *
 * 1. 상단 버튼용
 * <div class="mw-collapsible"
 *      id="mw-customcollapsible-XXX">
 *     <div class="mw-customtoggle-XXX">...</div>
 * </div>
 *
 * 2. 실제 펼침 영역
 * <div class="mw-collapsible mw-collapsed"
 *      id="mw-customcollapsible-XXX">
 *     <div class="mw-customtoggle-XXX">...</div>
 *     <table>...</table>
 * </div>
 *
 * → 2번을 선택
 */
function getTarget( name ) {
	if ( !name ) {
		return null;
	}

	var id =
		'mw-customcollapsible-' + name;

	/*
	 * getElementById()를 사용하지 않는다.
	 *
	 * 같은 ID가 여러 개 존재하는 위키 문법을
	 * 지원하기 위해 attribute selector로 전부 가져온다.
	 */
	var candidates =
		document.querySelectorAll(
			'[id="' +
			escapeAttribute( id ) +
			'"], .mw-customcollapsible-' +
			escapeSelector( name )
		);

	if ( !candidates.length ) {
		return null;
	}

	if ( candidates.length === 1 ) {
		return candidates[ 0 ];
	}

	var bestTarget = null;
	var bestScore = -1;
	var i;

	for ( i = 0; i < candidates.length; i++ ) {
		var candidate = candidates[ i ];
		var score = 0;

		/*
		 * 실제 펼침 영역은 보통 mw-collapsed를 가지고 시작
		 */
		if (
			candidate.classList.contains(
				'mw-collapsed'
			)
		) {
			score += 1000;
		}

		/*
		 * MediaWiki가 생성한 실제 콘텐츠
		 */
		if (
			candidate.querySelector(
				'.mw-collapsible-content'
			)
		) {
			score += 500;
		}

		/*
		 * 실제 내용에 표가 존재하는 경우
		 */
		if (
			candidate.querySelector(
				'table'
			)
		) {
			score += 200;
		}

		/*
		 * wikitable
		 */
		if (
			candidate.querySelector(
				'.wikitable'
			)
		) {
			score += 200;
		}

		/*
		 * 내부 요소가 많을수록 실제 내용 영역일 가능성이 높음
		 */
		score +=
			candidate.querySelectorAll( '*' ).length;

		if ( score > bestScore ) {
			bestScore = score;
			bestTarget = candidate;
		}
	}

	return bestTarget;
}