「利用者:Frozen-mikan/EnhancedUserpageLink.js」の版間の差分
表示
削除された内容 追加された内容
Frozen-mikan (会話 | 投稿記録) m 廃止予定の jQuery( document ).ready の代わりに $() を使用する。特別:差分/65659197 を参考。 |
Frozen-mikan (会話 | 投稿記録) エラー箇所を修正: user-talk を user_talk に変更 |
||
12行目: | 12行目: | ||
var nse = { |
var nse = { |
||
'user': encodeURI(wgFormattedNamespaces[2]), |
'user': encodeURI(wgFormattedNamespaces[2]), |
||
' |
'user_talk': encodeURI(wgFormattedNamespaces[3]) |
||
}; |
}; |
||
var re = new RegExp(nse.user + ':([^/?&#]+?)(?:$|[?&])'); |
var re = new RegExp(nse.user + ':([^/?&#]+?)(?:$|[?&])'); |
||
99行目: | 99行目: | ||
}, [ |
}, [ |
||
'(', |
'(', |
||
createElement('a', {'href': '/wiki/' + nse. |
createElement('a', {'href': '/wiki/' + nse.user_talk + ':' + usere}, [msg.talk]), |
||
' | ', |
' | ', |
||
createElement('a', {'href': '/wiki/Special:Contributions/' + usere}, [msg.contribs]), |
createElement('a', {'href': '/wiki/Special:Contributions/' + usere}, [msg.contribs]), |
2017年12月6日 (水) 16:30時点における版
/*
* 本文中に利用者名前空間へのリンクが有った場合、会話ページと投稿記録へのリンクを追加する。
* id="content" がある外装のみ使用可能。
* 出力言語は英語と日本語を用意。個人設定の「使用言語」を優先。無ければ英語を使用。
*/
$(function() {
/* 標準名前空間とCategory名前空間では即時終了 */
var wgNamespaceNumber = mw.config.get('wgNamespaceNumber');
if (0 === wgNamespaceNumber || 14 === wgNamespaceNumber) { return; }
/* 事前準備 */
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]);
}
});