미디어위키:Common.js: 두 판 사이의 차이
둘러보기로 이동
검색으로 이동
편집 요약 없음 |
편집 요약 없음 |
||
| 1번째 줄: | 1번째 줄: | ||
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */ | /* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */ | ||
mw.hook('wikipage.content').add(function ($content) { | mw.hook('wikipage.content').add(function ($content) { | ||
| 17번째 줄: | 10번째 줄: | ||
// 중복 처리 방지 | // 중복 처리 방지 | ||
if ($heading. | if ($heading.attr('data-mw-fold-ready') === '1') return; | ||
$heading. | $heading.attr('data-mw-fold-ready', '1'); | ||
// | // 아이콘 추가 (mw-headline이 있으면 그 안에, 없으면 heading에) | ||
if ($heading.find('.mw-fold-icon').length === 0) { | if ($heading.find('.mw-fold-icon').length === 0) { | ||
const $icon = $('<span class="mw-fold-icon" aria-hidden="true"></span>'); | const $icon = $('<span class="mw-fold-icon" aria-hidden="true"></span>'); | ||
$heading.prepend($icon); | const $headline = $heading.find('.mw-headline').first(); | ||
if ($headline.length) $headline.prepend($icon); | |||
else $heading.prepend($icon); | |||
} | } | ||
// wrapper 생성 | // wrapper 생성 + 항상 삽입 | ||
const $wrapper = $('<div class="mw-fold-content"></div>'); | const $wrapper = $('<div class="mw-fold-content"></div>'); | ||
let $next = $heading.next(); | let $next = $heading.next(); | ||
while ($next.length && !$next.is(STOP_SELECTOR)) { | while ($next.length && !$next.is(STOP_SELECTOR)) { | ||
const $current = $next; | const $current = $next; | ||
| 37번째 줄: | 31번째 줄: | ||
} | } | ||
$heading.after($wrapper); | |||
// 상태 (기본: 펼침) | // 상태 (기본: 펼침) | ||
let collapsed = false; | let collapsed = false; | ||
$heading.on('click', function (e) { | |||
$heading.on('click', function (e) { | // 좌클릭만 | ||
if (e.which && e.which !== 1) return; | |||
// 헤더 안 링크 클릭이면 토글 금지 | |||
if ($(e.target).closest('a').length) 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); | |||
} | |||
}); | |||
}); | }); | ||
}); | |||
2026년 1월 21일 (수) 01:19 판
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
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);
// 중복 처리 방지
if ($heading.attr('data-mw-fold-ready') === '1') return;
$heading.attr('data-mw-fold-ready', '1');
// 아이콘 추가 (mw-headline이 있으면 그 안에, 없으면 heading에)
if ($heading.find('.mw-fold-icon').length === 0) {
const $icon = $('<span class="mw-fold-icon" aria-hidden="true"></span>');
const $headline = $heading.find('.mw-headline').first();
if ($headline.length) $headline.prepend($icon);
else $heading.prepend($icon);
}
// wrapper 생성 + 항상 삽입
const $wrapper = $('<div class="mw-fold-content"></div>');
let $next = $heading.next();
while ($next.length && !$next.is(STOP_SELECTOR)) {
const $current = $next;
$next = $next.next();
$wrapper.append($current);
}
$heading.after($wrapper);
// 상태 (기본: 펼침)
let collapsed = false;
$heading.on('click', function (e) {
// 좌클릭만
if (e.which && e.which !== 1) return;
// 헤더 안 링크 클릭이면 토글 금지
if ($(e.target).closest('a').length) 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);
}
});
});
});