コンテンツにスキップ

利用者:MawaruNeko/ShowInternalDeadLink.js

お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。

多くの WindowsLinux のブラウザ

  • Ctrl を押しながら F5 を押す。

Mac における Safari

  • Shift を押しながら、更新ボタン をクリックする。

Mac における ChromeFirefox

  • Cmd Shift を押しながら R を押す。

詳細についてはWikipedia:キャッシュを消すをご覧ください。

/*
 * ページ内リンク切れを表示するカスタムJS
 * Custom JS to show internal dead links in a page
 * 
 * 説明:
 *   カスタムJSとして導入して下さい。
 * 
 * Description:
 *   Use this file as custom JS.
 * 
 * Global variables:
 *   以下のグローバル変数を、このスクリプトを読み込むより前に設定することで、
 *   このスクリプトの動作を制御できます。
 *   (default)
 *   mw.libs.showInternalDeadLink = {
 *     addCSS: true,
 *     showLinks: true,
 *     deferred: $.Deferred(),
 *   };
 *   mw.libs.showInternalDeadLink.addCSS:
 *     trueの時、デフォルトのスタイルを追加します。
 *     falseの時、スタイルを追加しません。自分でCSSを追加してスタイルを設定してください。
 *   mw.libs.showInternalDeadLink.showLinks:
 *     trueの時、リンク切れ部分へのリンクをページ右上に表示します。
 *     falseの時、リンク切れ部分へのリンクを表示しません。
 *   mw.libs.showInternalDeadLink.deferred:
 *     処理完了時に成功するdeferredオブジェクトを設定します。
 * 
 * CSS:
 *   .dead-internal-link
 *     リンク切れのリンク
 *   div.dead-internal-link-links
 *     リンク切れ部分へのリンクを表示する領域
 * 
 * このファイルはパブリックドメインとします。
 * This file is public domain.
 */

(function () {
  'use strict';
  function addDeadInternalLink() {
    $('[href]').each(function (index, elem) {
      var href = elem.getAttribute('href');
      if (href.substr(0, 1) === '#') {
        var anchor = href.substr(1);
        if (anchor !== '' && !document.getElementById(anchor)) {
          $(elem).addClass('dead-internal-link');
        }
      }
    });
  }

  function addCSS() {
    mw.util.addCSS(
      '.dead-internal-link:after{ content: " [内部リンク切れ]"; color: red; font-size: x-small; }\n' +
      ''
    );
  }

  function showLinks() {
    var deadInternalLinks = $('.dead-internal-link');
    function deadLinkId(index) {
      return 'dead_internal_link_' + index;
    }
    if(deadInternalLinks.length > 0){
      var linksDiv = $('<div>').addClass('dead-internal-link-links').prependTo($('.mw-indicators').eq(0));
      var $resultSpan = $('<span>').text('内部リンク切れ: ' + deadInternalLinks.length + ':').appendTo(linksDiv);
      deadInternalLinks.each(function (index, elem) {
        var $elem = $(elem);
        var id = $elem.attr('id');
        if (!id) {
          id = deadLinkId(index + 1);
          $elem.attr('id', id);
        }
        $resultSpan.append(' ');
        $('<a>').attr('href', '#' + id).text(index + 1).appendTo($resultSpan);
      });
      if (mw.libs.showInternalDeadLink.addCSS) {
        mw.util.addCSS(
          'div.dead-internal-link-links{ border: black 1px solid; vertical-align: top; display: inline-block; color: red; font-size: x-small; font-weight: bold; }\n' +
          ''
        );
      }
    }
  }
  function main() {
    addDeadInternalLink();
    if (mw.libs.showInternalDeadLink.addCSS) {
      addCSS();
    }
    if (mw.libs.showInternalDeadLink.showLinks) {
      showLinks();
    }
  }
  $(function () {
    if (!('showInternalDeadLink' in mw.libs)) {
      mw.libs.showInternalDeadLink = {
        addCSS: true,
        showLinks: true,
      };
    }

    mw.libs.showInternalDeadLink.deferred = mw.libs.showInternalDeadLink.deferred || $.Deferred();

    mw.loader.using('mediawiki.util').then(function () {
      main();
      mw.libs.showInternalDeadLink.deferred.resolve();
    });
  });
}) ();