打开/关闭菜单
60
73
29
1.1K
武外梗百科
打开/关闭外观设置菜单
打开/关闭个人菜单
未登录
未登录用户的IP地址会在进行任意编辑后公开展示。

MediaWiki:Common.js:修订间差异

MediaWiki界面页面
无编辑摘要
标签已被回退
无编辑摘要
标签手工回退 已被回退
第22行: 第22行:


//页面摘要功能
//页面摘要功能
/* ========= Page Card 摘要 + 概述图(保留内部链接) ========= */
console.log('COMMON.JS LOADED');
mw.hook('wikipage.content').add(function () {
mw.hook('wikipage.content').add(function () {
    console.log('wikipage.content triggered');
    var cards = document.querySelectorAll('.page-card');


     document.querySelectorAll('.page-card').forEach(function (card) {
     cards.forEach(function (card) {
         if (card.dataset.done === '1') return;
         if (card.dataset.done === '1') return;


         var title = card.dataset.title;
         var title = card.dataset.title;
        if (!title) return;
         var excerptDiv = card.querySelector('.page-excerpt');
         var excerptDiv = card.querySelector('.page-excerpt');
         if (!title || !excerptDiv) return;
         var imageDiv  = card.querySelector('.page-card-image');


         var length = parseInt(card.dataset.length) || 200;
         if (!excerptDiv) return;


         /* ① 先拿 wikitext */
         // API 地址(extracts + pageimages),保留 HTML
         fetch('/api.php?action=query&prop=revisions&rvprop=content&titles='
         var url = '/api.php?action=query' +
            + encodeURIComponent(title) + '&format=json')
                  '&titles=' + encodeURIComponent(title) +
        .then(r => r.json())
                  '&prop=extracts|pageimages' +
        .then(data => {
                  '&exchars=' + (card.dataset.length || 200) +
            var pages = data.query.pages;
                  '&exlimit=1' +
            var wikitext = '';
                  '&exsectionformat=plain' +
                  '&exintro=1' +
                  '&format=json' +
                  '&explaintext=0'; // 保留 HTML


             for (var id in pages) {
        fetch(url)
                 if (pages[id].revisions?.[0]?.['*']) {
             .then(function (res) {
                    wikitext = pages[id].revisions[0]['*'];
                 if (!res.ok) throw new Error('HTTP ' + res.status + ': ' + res.statusText);
                    break;
                return res.json();
                }
            })
             }
             .then(function (data) {
                if (!data.query || !data.query.pages) throw new Error('No pages in response');


            if (!wikitext) {
                for (var id in data.query.pages) {
                excerptDiv.textContent = '(无摘要)';
                    if (data.query.pages.hasOwnProperty(id)) {
                return;
                        var page = data.query.pages[id];
            }


            /* ② 截取前 N 字,避免截断 [[链接]] */
                        // 摘要 HTML
            var slice = wikitext.slice(0, length);
                        if (page.extract) {
            var open = slice.lastIndexOf('[[');
                            // 去掉换行符,保留 <a>
            var close = slice.lastIndexOf(']]');
                            var html = page.extract.replace(/[\r\n]+/g, ' ');
            if (open > close) slice = slice.slice(0, open);
                            excerptDiv.innerHTML = html;
                        } else {
                            excerptDiv.textContent = '(无摘要)';
                        }


            slice = slice.replace(/[\r\n]+/g, ' ');
                        // 概述图
                        if (imageDiv && page.thumbnail && page.thumbnail.source) {
                            imageDiv.innerHTML = '<img src="' + page.thumbnail.source + '" alt="概述图">';
                        }


            /* ③ 用 action=parse 解析这段 wikitext */
                        break; // 只取第一个页面
             return fetch('/api.php?action=parse&format=json', {
                    }
                 method: 'POST',
                }
                headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            })
                 body:
             .catch(function (err) {
                    'contentmodel=wikitext' +
                 console.error('Failed to fetch summary for', title, err);
                    '&text=' + encodeURIComponent(slice)
                 excerptDiv.textContent = '(加载失败)';
             });
             });
        })
        .then(r => r && r.json())
        .then(parsed => {
            if (parsed?.parse?.text?.['*']) {
                excerptDiv.innerHTML = parsed.parse.text['*'] + '…';
            } else {
                excerptDiv.textContent = '(解析失败)';
            }
        })
        .catch(err => {
            console.error('Excerpt error:', err);
            excerptDiv.textContent = '(加载失败)';
        });


         card.dataset.done = '1';
         card.dataset.done = '1';
     });
     });
});
});