미디어위키:Common.js: 두 판 사이의 차이

인테리어 위키
둘러보기로 이동 검색으로 이동
편집 요약 없음
편집 요약 없음
1번째 줄: 1번째 줄:
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/* 이 자바스크립트 설정은 모든 문서, 모든 사용자에게 적용됩니다. */
/* =========================
  h2/h3/h4/h5 기본 접기/펼치기
  - 헤더 왼쪽 아이콘 항상 표시
  - 헤더 바로 아래 콘텐츠만 토글
  - 다음 heading(h1~h6) 나오면 종료
  ========================= */


mw.hook('wikipage.content').add(function ($content) {
mw.hook('wikipage.content').add(function ($content) {
17번째 줄: 10번째 줄:


     // 중복 처리 방지
     // 중복 처리 방지
     if ($heading.data('fold-ready')) return;
     if ($heading.attr('data-mw-fold-ready') === '1') return;
     $heading.data('fold-ready', true);
     $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();


    // 바로 아래 콘텐츠만 수집 (heading 나오면 종료)
     while ($next.length && !$next.is(STOP_SELECTOR)) {
     while ($next.length && !$next.is(STOP_SELECTOR)) {
       const $current = $next;
       const $current = $next;
37번째 줄: 31번째 줄:
     }
     }


     // ✅ 콘텐츠가 있으면 wrapper만 추가
     $heading.after($wrapper);
    if ($wrapper.children().length > 0) {
      $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;


  // 헤더 안의 링크(<a>) 클릭이면 토글 금지
      // 헤더 링크 클릭이면 토글 금지
  if ($(e.target).closest('a').length) {
      if ($(e.target).closest('a').length) return;
    return;
  }


  // 콘텐츠가 없는 경우: 아이콘은 있지만 동작은 하지 않음
      // 콘텐츠가 없는 경우: 아이콘은 있지만 동작은 하지 않음
  if ($wrapper.children().length === 0) 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);
        $wrapper.stop(true, true).slideUp(150);
    } else {
      } else {
    $heading.removeClass('mw-fold-collapsed');
        $heading.removeClass('mw-fold-collapsed');
    $wrapper.stop(true, true).slideDown(150);
        $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);
      }
    });
  });
});