コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「利用者: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])
'user_talk': encodeURI(wgFormattedNamespaces[3])
};
};
var re = new RegExp(nse.user + ':([^/?&#]+?)(?:$|[?&])');
var re = new RegExp(nse.user + ':([^/?&#]+?)(?:$|[?&])');
99行目: 99行目:
}, [
}, [
'(',
'(',
createElement('a', {'href': '/wiki/' + nse.user-talk + ':' + usere}, [msg.talk]),
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]);
  }
});