MediaWiki:Common.js
MediaWiki界面页面
更多操作
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
/* ===== 江中缘搜索摘要清理:开始 ===== */
/* 仅处理 Special:Search 的摘要展示;不修改页面原文、索引或搜索顺序。 */
(function () {
'use strict';
function cleanSource(source) {
var text = source
.replace(/<(script|style|template|noscript)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, ' ')
.replace(/<(?:script|style|template|noscript)\b[^>]*>[\s\S]*$/gi, ' ')
.replace(/<!--[\s\S]*?(?:-->|$)/g, ' ')
.replace(/\/\*[\s\S]*?\*\//g, ' ')
.replace(/<[^>]*>/g, ' ')
.replace(/<[^>]*$/g, ' ')
.replace(/^[.\s…]*(?:[a-zA-Z][\w:-]*|[="'\s])+>/, '… ')
.replace(/\b(?:class|id|href|style|title|data-[\w-]+)\s*=\s*(?:"[^"]*"|'[^']*'|[^\s>]+)/gi, ' ')
.replace(/(?:^|[.…]\s*)[>]+/g, '… ')
.replace(/\[\[(?:File|Image|文件|图像):[^\]]*\]\]/gi, ' ')
.replace(/\[\[([^\]|]+)\|([^\]]+)\]\]/g, '$2')
.replace(/\[\[([^\]]+)\]\]/g, '$1')
.replace(/'{2,5}/g, '')
.replace(/[|]/g, ' ')
.replace(/&(?:nbsp|amp|quot|apos|lt|gt);/g, function (entity) {
return { ' ':' ', '&':'&', '"':'"', ''':"'", '<':'<', '>':'>' }[entity];
})
.replace(/\s+/g, ' ').replace(/(?:…\s*){2,}/g, '… ').trim();
/* 只有可靠的正文才显示;无法还原的脚本、样式或数据片段留空。 */
if (/[<>]|(?:jzy[-:]|data:image|https?:\/\/)|(?:\b(?:function|document|window|const|var)\b)|[{}]|=>/i.test(text)) return '';
return text;
}
function highlight(node, text, terms) {
var lower = text.toLocaleLowerCase(), start = 0;
node.replaceChildren();
while (start < text.length) {
var at = -1, term = '';
terms.forEach(function (word) {
var found = lower.indexOf(word.toLocaleLowerCase(), start);
if (found >= 0 && (at < 0 || found < at || (found === at && word.length > term.length))) { at = found; term = word; }
});
if (at < 0) { node.appendChild(document.createTextNode(text.slice(start))); break; }
node.appendChild(document.createTextNode(text.slice(start, at)));
var mark = document.createElement('span');
mark.className = 'searchmatch';
mark.textContent = text.slice(at, at + term.length);
node.appendChild(mark);
start = at + term.length;
}
}
function cleanResults(root) {
if (!document.body.classList.contains('mw-special-Search')) return;
var scope = root && root.querySelectorAll ? root : document;
scope.querySelectorAll('.mw-search-results .searchresult').forEach(function (snippet) {
if (snippet.dataset.jzyCleaned) return;
snippet.dataset.jzyCleaned = 'true';
var terms = Array.from(new Set(Array.from(snippet.querySelectorAll('.searchmatch')).map(function (mark) { return mark.textContent.trim(); }).filter(function (term) { return term && term.length <= 80 && !/[<>]/.test(term); })));
var text = cleanSource(snippet.textContent);
highlight(snippet, text, terms);
snippet.hidden = !text;
});
}
if (document.readyState === 'loading') document.addEventListener('DOMContentLoaded', function () { cleanResults(document); });
else cleanResults(document);
if (window.mw && mw.hook) mw.hook('wikipage.content').add(function (content) { cleanResults(content && content[0]); });
})();
/* ===== 江中缘搜索摘要清理:结束 ===== */