利用者:Frozen-mikan/EnhancedUserpageLink.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
/*
* 本文中に利用者名前空間へのリンクが有った場合、会話ページと投稿記録へのリンクを追加する。
* id="content" がある外装のみ使用可能。
* 出力言語は英語と日本語を用意。個人設定の「使用言語」を優先。無ければ英語を使用。
*/
$(function() {
/* 標準名前空間とCategory名前空間では即時終了 */
var wgNamespaceNumber = mw.config.get('wgNamespaceNumber');
if (0 === wgNamespaceNumber || 14 === wgNamespaceNumber) { return; }
/* 事前準備 */
var wgFormattedNamespaces = mw.config.get('wgFormattedNamespaces');
var nse = {
'user': encodeURI(wgFormattedNamespaces[2]),
'user_talk': encodeURI(wgFormattedNamespaces[3])
};
var re = new RegExp(nse.user + ':([^/?&#]+?)(?:$|[?&])');
var msgLangs = {
en: {
'talk': 'talk',
'contribs': 'contribs'
},
ja: {
'talk': '会話',
'contribs': '投稿'
}
};
var wgUserLanguage = mw.config.get('wgUserLanguage');
var msg = msgLangs[wgUserLanguage] ? msgLangs[wgUserLanguage] : msgLangs.en;
/* HTML要素を生成する。 */
function createElement(name, attr, inner) {
if (!name) return null;
var element = document.createElement(name);
// attr
for (var key in attr) {
if (key == 'style') {
for (var styleKey in attr[key]) {
element[key][styleKey] = attr[key][styleKey];
}
} else {
element.setAttribute(key, attr[key]);
}
}
// inner
for (var i=0; i<inner.length; ++i) {
if (typeof inner[i] == 'string') {
element.appendChild(document.createTextNode(inner[i]));
} else {
element.appendChild(inner[i]);
}
}
return element;
}
function isSameUserLink(link, usere) {
var status = { 'sameUser': false };
function depthFirstSearch(node, fn) {
if (!node) return false;
if (fn(node)) return true;
if (depthFirstSearch(node.firstChild, fn)) return true;
if (depthFirstSearch(node.nextSibling, fn)) return true;
return false;
}
depthFirstSearch(link.nextSibling, function(element) {
if(!element.href) return false;
if (0 <= element.href.indexOf(usere)){
status.sameUser = true;
}
return true;
});
return status.sameUser;
}
/* class="changedby" の直下にあるa要素の場合は true */
function isInnerChangedBy(link) {
if (link && link.parentNode) {
var classValue = link.parentNode.getAttribute('class');
if (classValue) return /changedby/.test(classValue);
}
return false;
}
function linksLoop(link) {
var href = link.href;
var reArray = re.exec(href);
if (!reArray) return;
var usere = reArray[1];
if (!usere || !(/(\/wiki\/|redlink=1)/.test(href))) return;
if (isSameUserLink(link, usere)) return;
if (isInnerChangedBy(link)) return;
/* 要素の生成と追加 */
var span = createElement('small', {
'class': 'enhanced_userpage_link mw-usertoollinks',
'style': {'marginLeft': '0.5em'}
}, [
'(',
createElement('a', {'href': '/wiki/' + nse.user_talk + ':' + usere}, [msg.talk]),
' | ',
createElement('a', {'href': '/wiki/Special:Contributions/' + usere}, [msg.contribs]),
')'
]);
link.parentNode.insertBefore(span, link.nextSibling);
}
/* ここから本体 */
var content = document.getElementById('content');
if (!content) return;
var links = content.getElementsByTagName('a');
for (var i = 0; i < links.length; ++i) {
linksLoop(links[i]);
}
});