コンテンツにスキップ

利用者:MawaruNeko/CiteEmphasizer.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

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

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

/*
 * 段落ごとに出典の有無を強調するカスタムJS
 * Custom JS to emphasize paragraphs with or without cites
 * 
 * 説明:
 *   カスタムJSとして導入して下さい。
 *   スタイルを調整するには、コピーしてstyleタグ中のCSSを調整して下さい。
 * 
 * 機能:
 *   1. ハーバード方式で記載された参考文献への、出典のリンクを作成
 *   2. 脚注を、出典と注釈に区別
 *   3. 脚注を含まないパラグラフを強調表示
 * 
 * 解説:
 *   1. 参考文献は、HTMLのciteタグで認識します。
 *      Wikipediaのcite bookなどのテンプレートを使用するとciteタグが使用されます。
 *      単純に参考文献節に通常テキストで書かれた参考文献は認識できません。
 *      (li.cite-like-listで、参考文献と思われるリストとして認識)
 *   2. cite, citeへの内部リンク, 外部リンクを含む脚注セクションを出典の脚注セクションとみなします。
 *      ハーバード方式の出典を通常テキストで書いた場合は認識できません。
 * 
 * Global variables:
 *   以下のグローバル変数を、このスクリプトを読み込むより前に設定することで、
 *   このスクリプトの動作を制御できます。
 *   (default)
 *   mw.libs.citeEmphasizer = {
 *     addCSS: true,
 *     deferred: $.Deferred(),
 *   };
 *   mw.libs.citeEmphasizer.addCSS:
 *     trueの時、デフォルトのスタイルを追加します。
 *     falseの時、スタイルを追加しません。自分でCSSを追加してスタイルを設定してください。
 *   mw.libs.citeEmphasizer.deferred:
 *     処理完了時に成功するdeferredオブジェクトを設定します。
 * 
 * CSS
 *   .counter-cite-link
 *     ハーバード方式で記載された参考文献への出典のリンク
 *   li.cite-list
 *     citeまたはcounter-cite-linkを含む脚注セクションのリスト
 *   li.external-link-list
 *     外部リンクを含む脚注セクションのリスト
 *   li.note-list
 *     出典・外部リンクを含まない脚注セクションのリスト
 *     (ハーバード方式の出典を通常テキストで書いた場合も含む)
 *   sup.reference.cite-sup
 *     li.cite-list, li.external-link-list に対応する脚注
 *   .has-cite-sups
 *     sup.reference.cite-supの脚注を含むパラグラフ
 *   .has-reference-sups
 *     脚注を含むパラグラフ
 *     (.has-cite-supsを含む)
 *   .has-no-reference-sups
 *     .has-reference-sups以外のパラグラフ
 *   li.cite-like-list
 *     参考文献節内の、参考文献と推定されるリスト
 * 
 * このファイルはパブリックドメインとします。
 * This file is public domain.
 */

(function () {
  'use strict';
  function setCiteEmphasis() {
    function counterCiteIdName(citeIdName, index) {
      return 'Counter_Cite_' + index + '_' + citeIdName;
    }
    function hasOnlyLinkTag(elem) {
      var contents = $(elem).contents();
      return (contents.length > 0) && !((contents.length === 1) && (contents[0].nodeType === 1) && (contents.eq(0).is('a')));
    }
    function escapeId(id) {
      return id.replace(/\"/g, '\\"');
    }

    $('cite[id]').each(function (index, elem) {
      var $elem = $(elem);
      var id = $elem.attr('id');
      var $citelinks = $('[href="#' + escapeId(id) + '"]');
      if (!$elem.attr('title')) {
      	$elem.attr('title', id);
      }
      if ($citelinks.length === 0) {
        $elem.append(' 参照なし');
      } else {
        $elem.append(' 参照:');
        $citelinks.each(function (linkIndex, linkElem) {
          var linkIndexShow = linkIndex + 1;
          var $linkElem = $(linkElem);
          $linkElem.addClass('counter-cite-link');
          var oldLinkId = $linkElem.attr('id');
          var linkId;
          if (oldLinkId) {
            linkId = oldLinkId;
          } else {
            var newLinkId = counterCiteIdName(id, linkIndexShow);
            $linkElem.attr('id', newLinkId);
            linkId = newLinkId;
          }
          $elem.append(' ');
          $('<a>').attr('href', '#' + linkId).text(linkIndexShow).appendTo($elem);
        });
      }
    });
    $('cite, a.counter-cite-link').closest('.references > li').addClass('cite-list');
    $('.references > li .reference-text a.external').not('.plainlinks a.external').closest('.references > li').not('.cite-list').addClass('external-link-list');
    $('.references > li:not(.cite-list,.external-link-list)').addClass('note-list');

    var afterReferenceParagraphs = $('h2 .mw-headline:contains("参考文献")').closest('h2').eq(0).nextAll();
    var referenceParagraphs = null;
    for (var i = 0; i < afterReferenceParagraphs.length; i++) {
      if (afterReferenceParagraphs.eq(i).is('h2')) {
        referenceParagraphs = afterReferenceParagraphs.slice(0, i);
        break;
      }
    }
    if (referenceParagraphs === null) {
      referenceParagraphs = afterReferenceParagraphs;
    }
    referenceParagraphs.not('div,:header,table,.gallery').find('li').not(':has(cite)').addClass('cite-like-list');

    $('li.cite-list a[href],li.external-link-list a[href]').each(function (index, elem) {
      var $elem = $(elem);
      var href = $elem.attr('href');
      if (href.substr(0, 1) === '#') {
        $(document.getElementById(href.substr(1))).filter('sup.reference').addClass('cite-sup');
      }
    });

    var paragraphs = $('#content #mw-content-text > .mw-parser-output').children().not('div,:header,table,.gallery,.references').not(':has(cite,.cite-list,.cite-like-list,.references)').filter(function (index, elem) {
      return hasOnlyLinkTag(elem);
    });
    paragraphs.filter(':has(.reference.cite-sup)').addClass('has-cite-sups');
    paragraphs.filter(':has(.reference)').addClass('has-reference-sups');
    paragraphs.not('.has-reference-sups').addClass('has-no-reference-sups');
  }

  function addCSS() {
    mw.util.addCSS(
      'cite{ border-bottom: lime 1px solid; }\n' +
      'li.cite-list:before{ content: " [出典] "; color: green; font-weight: bold; }\n' +
      'li.external-link-list:before{ content: " [外部] "; color: green; }\n' +
      'li.note-list:before{ content: " [注釈] "; color: blue; }\n' +
      'sup.reference.cite-sup a{ color: green; }\n' +
      '.has-reference-sups:not(.has-cite-sups){ border-left: gray 3px solid; padding-left: 3px; }\n' +
      /* '.has-no-reference-sups:after{ content: " [脚注なし]"; font-size: x-small; }\n' + */
      '.has-no-reference-sups{ background-color: #EEEEEE; }\n' +
      'li.cite-like-list{ border-bottom: lime 1px dotted; }\n' +
      ''
    );
  }

  function main() {
    setCiteEmphasis();
    if (mw.libs.citeEmphasizer.addCSS) {
      addCSS();
    }
  }

  $(function () {
    if (!('citeEmphasizer' in mw.libs)) {
      mw.libs.citeEmphasizer = {
        addCSS: true,
      };
    }
    
    mw.libs.citeEmphasizer.deferred = mw.libs.citeEmphasizer.deferred || $.Deferred();

    mw.loader.using('mediawiki.util').then(function () {
      var config = mw.config.get(['wgAction', 'wgNamespaceNumber']);
      if ((config.wgAction === 'view') && (config.wgNamespaceNumber === 0)) {
        main();
        mw.libs.citeEmphasizer.deferred.resolve();
      }
    });
  });
}) ();