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

인테리어 위키
둘러보기로 이동 검색으로 이동
편집 요약 없음
편집 요약 없음
 
(같은 사용자의 중간 판 5개는 보이지 않습니다)
8번째 줄: 8번째 줄:
   $content.find(HEADING_SELECTOR).each(function () {
   $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;
    }


     // 중복 처리 방지
     // 중복 처리 방지
13번째 줄: 30번째 줄:
     $heading.attr('data-mw-fold-ready', '1');
     $heading.attr('data-mw-fold-ready', '1');


     // 아이콘 추가 (mw-headline이 있으면 그 안에, 없으면 heading에)
     // 편집 링크 존재 여부 클래스(:has 대체용)
     if ($heading.find('.mw-fold-icon').length === 0) {
    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>');
       const $icon = $('<span class="mw-fold-icon" aria-hidden="true"></span>');
       const $headline = $heading.find('.mw-headline').first();
       $heading.prepend($icon);
      if ($headline.length) $headline.prepend($icon);
      else $heading.prepend($icon);
     }
     }
    $heading.addClass('mw-has-fold-icon');


     // wrapper 생성 + 항상 삽입
     // wrapper 생성 + 항상 삽입
25번째 줄: 46번째 줄:
     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;
32번째 줄: 54번째 줄:


     $heading.after($wrapper);
     $heading.after($wrapper);
    // 콘텐츠 유무 클래스
    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 (e) {
     $heading.on('click', function (e) {
      // 좌클릭만
       if (typeof e.which === 'number' && e.which !== 1) return;
       if (e.which && e.which !== 1) return;
      if ($(e.target).closest('a').length) return;


       // 헤더 안 링크 클릭이면 토글 금지
       const sel = window.getSelection && window.getSelection();
       if ($(e.target).closest('a').length) return;
       if (sel && sel.type === 'Range') return;


      // 콘텐츠가 없는 경우: 아이콘은 있지만 동작은 하지 않음
       if ($wrapper.children().length === 0) return;
       if ($wrapper.children().length === 0) return;


56번째 줄: 85번째 줄:
       }
       }
     });
     });
  });
});
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'
  });
});