미디어위키:Common.js: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
편집 요약 없음 태그: 되돌려진 기여 |
편집 요약 없음 |
||
| (같은 사용자의 중간 판 17개는 보이지 않습니다) | |||
| 3번째 줄: | 3번째 줄: | ||
mw.hook('wikipage.content').add(function ($content) { | mw.hook('wikipage.content').add(function ($content) { | ||
$content.find( | const HEADING_SELECTOR = 'h2, h3, h4, h5'; | ||
const STOP_SELECTOR = 'h1, h2, h3, h4, h5, h6'; | |||
$content.find(HEADING_SELECTOR).each(function () { | |||
const $heading = $(this); | const $heading = $(this); | ||
/* =============================== | |||
✅ 제외 처리 (TOC / Minerva 요소) | |||
=============================== */ | |||
// 1) TOC 제목(h2#mw-toc-heading)은 접기 대상에서 제외 | |||
if ($heading.attr('id') === 'mw-toc-heading') return; | |||
// | // 2) TOC 컨테이너 내부에 있는 헤더도 제외(안전장치) | ||
if ($heading.closest('#toc, .toc, .mw-table-of-contents, .vector-toc').length) return; | |||
// | // 3) Minerva에서 TOC/메뉴 관련 요소를 더 안전하게 제외(있을 때만) | ||
if ($heading.closest('.minerva__toc, .minerva-toc, .content .toc').length) { | |||
// 위 클래스들은 설치/버전에 따라 없을 수 있음 (있으면 제외) | |||
// 필요 없으면 이 블록은 삭제해도 됨 | |||
return; | |||
} | |||
// 중복 처리 방지 | |||
if ($heading.attr('data-mw-fold-ready') === '1') return; | |||
$heading.attr('data-mw-fold-ready', '1'); | |||
// 편집 링크 존재 여부 클래스(:has 대체용) | |||
if ($heading.find('.mw-editsection').length) { | |||
$heading.addClass('mw-has-editsection'); | |||
} | |||
// 아이콘은 항상 "헤더 직계 자식"으로만 넣기 | |||
if ($heading.children('.mw-fold-icon').length === 0) { | |||
const $icon = $('<span class="mw-fold-icon" aria-hidden="true"></span>'); | |||
$heading.prepend($icon); | |||
} | |||
$heading.addClass('mw-has-fold-icon'); | |||
// wrapper 생성 + 항상 삽입 | |||
const $wrapper = $('<div class="mw-fold-content"></div>'); | |||
let $next = $heading.next(); | let $next = $heading.next(); | ||
while ( | // 다음 heading 전까지 수집 | ||
while ($next.length && !$next.is(STOP_SELECTOR)) { | |||
const $current = $next; | |||
) { | |||
$next = $next.next(); | $next = $next.next(); | ||
$wrapper.append($current); | $wrapper.append($current); | ||
} | } | ||
$heading.after($wrapper); | |||
$heading. | // 콘텐츠 유무 클래스 | ||
if ($wrapper.children().length > 0) { | |||
$heading.addClass('mw-fold-has-content'); | |||
} else { | |||
$heading.removeClass('mw-fold-has-content'); | |||
} | |||
// | // 상태 (기본: 펼침) | ||
let collapsed = false; | let collapsed = false; | ||
// 클릭 | // 제목 클릭 시 토글 | ||
$heading.on('click', function () { | $heading.on('click', function (e) { | ||
if (typeof e.which === 'number' && e.which !== 1) return; | |||
if ($(e.target).closest('a').length) return; | |||
const sel = window.getSelection && window.getSelection(); | |||
if (sel && sel.type === 'Range') return; | |||
if ($wrapper.children().length === 0) return; | |||
collapsed = !collapsed; | collapsed = !collapsed; | ||
if (collapsed) { | if (collapsed) { | ||
$heading.addClass('mw-fold-collapsed'); | $heading.addClass('mw-fold-collapsed'); | ||
$wrapper.stop(true, true).slideUp(150); | |||
} else { | } else { | ||
$heading.removeClass('mw-fold-collapsed'); | $heading.removeClass('mw-fold-collapsed'); | ||
$wrapper.stop(true, true).slideDown(150); | |||
} | } | ||
}); | }); | ||
}); | |||
}); | |||
mw.hook('wikipage.content').add(function () { | |||
var $link = $('#footer-places-privacy a'); | |||
if (!$link.length) return; | |||
$link.attr({ | |||
href: 'https://foundation.wikimedia.org/wiki/Policy:Privacy_policy', | |||
target: '_blank', | |||
rel: 'noopener noreferrer' | |||
}); | }); | ||
}); | }); | ||
2026년 1월 28일 (수) 06:37 기준 최신판
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
mw.hook('wikipage.content').add(function ($content) {
const HEADING_SELECTOR = 'h2, h3, h4, h5';
const STOP_SELECTOR = 'h1, h2, h3, h4, h5, h6';
$content.find(HEADING_SELECTOR).each(function () {
const $heading = $(this);
/* ===============================
✅ 제외 처리 (TOC / Minerva 요소)
=============================== */
// 1) TOC 제목(h2#mw-toc-heading)은 접기 대상에서 제외
if ($heading.attr('id') === 'mw-toc-heading') return;
// 2) TOC 컨테이너 내부에 있는 헤더도 제외(안전장치)
if ($heading.closest('#toc, .toc, .mw-table-of-contents, .vector-toc').length) return;
// 3) Minerva에서 TOC/메뉴 관련 요소를 더 안전하게 제외(있을 때만)
if ($heading.closest('.minerva__toc, .minerva-toc, .content .toc').length) {
// 위 클래스들은 설치/버전에 따라 없을 수 있음 (있으면 제외)
// 필요 없으면 이 블록은 삭제해도 됨
return;
}
// 중복 처리 방지
if ($heading.attr('data-mw-fold-ready') === '1') return;
$heading.attr('data-mw-fold-ready', '1');
// 편집 링크 존재 여부 클래스(:has 대체용)
if ($heading.find('.mw-editsection').length) {
$heading.addClass('mw-has-editsection');
}
// 아이콘은 항상 "헤더 직계 자식"으로만 넣기
if ($heading.children('.mw-fold-icon').length === 0) {
const $icon = $('<span class="mw-fold-icon" aria-hidden="true"></span>');
$heading.prepend($icon);
}
$heading.addClass('mw-has-fold-icon');
// wrapper 생성 + 항상 삽입
const $wrapper = $('<div class="mw-fold-content"></div>');
let $next = $heading.next();
// 다음 heading 전까지 수집
while ($next.length && !$next.is(STOP_SELECTOR)) {
const $current = $next;
$next = $next.next();
$wrapper.append($current);
}
$heading.after($wrapper);
// 콘텐츠 유무 클래스
if ($wrapper.children().length > 0) {
$heading.addClass('mw-fold-has-content');
} else {
$heading.removeClass('mw-fold-has-content');
}
// 상태 (기본: 펼침)
let collapsed = false;
// 제목 클릭 시 토글
$heading.on('click', function (e) {
if (typeof e.which === 'number' && e.which !== 1) return;
if ($(e.target).closest('a').length) return;
const sel = window.getSelection && window.getSelection();
if (sel && sel.type === 'Range') return;
if ($wrapper.children().length === 0) return;
collapsed = !collapsed;
if (collapsed) {
$heading.addClass('mw-fold-collapsed');
$wrapper.stop(true, true).slideUp(150);
} else {
$heading.removeClass('mw-fold-collapsed');
$wrapper.stop(true, true).slideDown(150);
}
});
});
});
mw.hook('wikipage.content').add(function () {
var $link = $('#footer-places-privacy a');
if (!$link.length) return;
$link.attr({
href: 'https://foundation.wikimedia.org/wiki/Policy:Privacy_policy',
target: '_blank',
rel: 'noopener noreferrer'
});
});