미디어위키:Common.js

WONGO
고대진 (토론 | 기여)님의 2025년 1월 17일 (금) 22:14 판
둘러보기로 이동 검색으로 이동

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

  • 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
  • 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
  • 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
  • 오페라: Ctrl-F5를 입력.
mw.hook('wikipage.content').add(function ($content) {
    // 팝업 컨테이너 생성
    const $popup = $('<div>')
        .addClass('link-preview-popup')
        .css({
            display: 'none',
            position: 'absolute',
            border: '1px solid #ccc',
            background: '#fff',
            padding: '10px',
            'z-index': 1000,
            'box-shadow': '0 4px 8px rgba(0,0,0,0.1)',
            'max-width': '300px',
            'overflow-wrap': 'break-word',
        });

    // 팝업 DOM에 추가
    $('body').append($popup);

    // 모든 링크 처리
    $content.find('a').each(function () {
        const $link = $(this);

        // 내부 링크만 처리
        if (
            $link.attr('href') &&
            ($link.attr('href').startsWith(mw.config.get('wgScriptPath') + '/index.php/') ||
                $link.attr('href').startsWith(mw.config.get('wgScriptPath') + '/wiki/'))
        ) {
            $link.on('mouseenter', function (event) {
                // 페이지 제목 추출
                const pageTitle = decodeURIComponent(
                    $link.attr('href')
                        .replace(mw.config.get('wgScriptPath') + '/index.php/', '')
                        .replace(mw.config.get('wgScriptPath') + '/wiki/', '')
                );

                // MediaWiki API 호출
                $.ajax({
                    url: mw.util.wikiScript('api'),
                    data: {
                        action: 'query',
                        prop: 'extracts',
                        titles: pageTitle,
                        format: 'json',
                        exintro: true, // 첫 번째 문단만 가져오기
                        explaintext: true, // HTML 태그 제거
                    },
                    dataType: 'json',
                    success: function (data) {
                        const pages = data.query.pages;
                        const page = Object.values(pages)[0];

                        // API 응답에서 'extract' 가져오기
                        if (page && page.extract) {
                            $popup.html(page.extract); // 팝업에 텍스트 삽입
                            $popup.css({
                                top: event.pageY + 10,
                                left: event.pageX + 10,
                            }).fadeIn(200);
                        } else {
                            $popup.html('내용을 가져올 수 없습니다.');
                        }
                    },
                    error: function () {
                        $popup.html('API 호출에 실패했습니다.');
                    },
                });
            });

            $link.on('mousemove', function (event) {
                $popup.css({
                    top: event.pageY + 10,
                    left: event.pageX + 10,
                });
            });

            $link.on('mouseleave', function () {
                $popup.fadeOut(200);
            });
        }
    });
});