User:アンジェロ先輩/ShowPageLintError.js

/* * Lint errorsの詳細情報を表示するカスタムJS * Custom JS to show detailed information of "lint errors" * * 説明: *  カスタムJSとして導入して下さい. *  1. ページ情報の画面のLint errorsの章に詳細を表示します. *     Lint errorsの章があると'Show Lint errors'というリンクが表示されます. *     'Show Lint errors'リンクをクリックすると、詳細なエラー内容を表示します. *     Extension:Linter に記録されたものを表示するので、古い場合があります. *  2. 編集画面で、編集中の内容のLint errorsを表示する *     'Test Lint errors'リンクを表示します. クリックすると、 *     リンクの下に現在の編集中の内容のLint errorsを表示します. *  3. 上記の2箇所の下に'Edit to check lint errors in text here' *     というテキストエリアを表示します. ここでは、任意のテキストに対して、 *     テンプレートの展開とLint errorsの確認を行うことができます. * * Description: *  Use this file as custom JS. *  1. This script creates 'Show Lint errors' link in *      'Lint errors' chapter of information page. *     By clicking the link, detained error information is shown. *     These errors are recorded by Extension:Linter. *  2. This script creates 'Show Lint errors' link in edit pages. *     By clicking the link, you can test lint errors of editing wiki text. *  3. You can expand or check lint errors of any wiki text *     in the textarea 'Edit to check lint errors in text here'. * * Global variables: *  以下のグローバル変数を、このスクリプトを読み込むより前に設定することで、 *  このスクリプトの動作を制御できます. *  (default) *  mw.libs.ShowPageLintError = { *    testsLinterErrorsOnEditInit: false, *    summaryMessage: null, *  }; *   mw.libs.ShowPageLintError.testsLinterErrorsOnEditInit: *    編集画面がロードされた時に自動的にLint errorsを表示します. *  mw.libs.ShowPageLintError.summaryMessage: *    要約欄に定型句を追加する'Add summary'リンクを追加します. *    この変数に、追加したい定型句を設定してください. *    e.g. "井戸端/subj/RemexHTML移行に関する合意形成に基づき修正" * * このファイルはパブリックドメインとします. * This file is public domain. */

(function {    'use strict';

/* Api functions */ function getWikiSource(wgArticleId) { return $.get(mw.util.wikiScript, {           action: 'raw',            curid: wgArticleId,        }); }

function getApiLintErrorsOfArticle(wgArticleId) { return (new mw.Api).get({           action: 'query',            list: 'linterrors',            lntlimit: 'max',            lntpageid: wgArticleId,        }).then(function (data) {            return data.query.linterrors;        }); }

function getRestLintErrorsOfText(text, title) { return $.ajax({           type: 'POST',            url: '/api/rest_v1/transform/wikitext/to/lint',            data: {                wikitext: text,                title: title,            },            dataType: 'json',        }); }

function expandTemplates(text, title, revid) { return (new mw.Api).post({           action: 'expandtemplates',            prop: 'wikitext',            text: text,            title: title,            revid: revid,        }).then(function (data) {            return data.expandtemplates.wikitext;        }); }

/* format functions */ function createCategoryHelpLink(category) { return $('').addClass('mw-helplink').text(category). attr('href', '//www.mediawiki.org/wiki/Special:MyLanguage/Help:Extension:Linter/' + category). attr('target', '_blank'); }

function createEditLink(wgArticleId, lintId) { var editLinkPath = mw.util.wikiScript + '?' + $.param({           action: 'edit',            curid: wgArticleId,            lintid: lintId,        }); return $('').text('edit').attr('href', editLinkPath); }

function selectTextarea($textarea, start, end) { var textarea = $textarea[0]; textarea.focus; textarea.setSelectionRange(start, end); }

function createLocationLink($textarea, start, end) { return $('').text(start + ' - ' + end). attr('href', 'javascript:void(0)'). on('click', function (event) {             selectTextarea($textarea, start, end);          }); }

function createTemplateLink(templateInfo) { var $templateLink; if (templateInfo) { if (templateInfo.name) { var linkPath = mw.util.getUrl(templateInfo.name); $templateLink = $('').text(templateInfo.name).attr('href', linkPath); } else if ('multiPartTemplateBlock' in templateInfo) { $templateLink = 'multi-part-template-block'; } else { $templateLink = '-'; }       } else { $templateLink = '-'; }       return $templateLink; }

/* show linter errors */ function showApiLinterErrors(apiLinterErrors, config, $table, $wikiSourceTextarea) { var $thead = $(' ').appendTo($table); $(' ').         append($(' ').text('lintId')). append($(' ').text('edit')). append($(' ').text('category')). append($(' ').text('location')). append($(' ').text('params')). append($(' ').text('template')). append($(' ').text('templateInfo')). appendTo($thead); var $tbody = $(' ').appendTo($table);

var appendLintError = function (linterror) { $(' ').             append($(' ').append(linterror.lintId)). append($(' ').append(createEditLink(config.wgArticleId, linterror.lintId))). append($(' ').append(createCategoryHelpLink(linterror.category))). append($(' ').append(createLocationLink($wikiSourceTextarea, linterror.location[0], linterror.location[1]))). append($(' ').text(JSON.stringify(linterror.params))). append($(' ').append(createTemplateLink(linterror.templateInfo))). append($(' ').text(JSON.stringify(linterror.templateInfo))). appendTo($tbody); };

if (apiLinterErrors.length >= 1) { $.each(apiLinterErrors, function (index, linterror) {               appendLintError(linterror);            }); } else { $(' ').             append($(' ').attr('colspan', 7).text('No lint errors')). appendTo($tbody); }   }

function showApiLinterErrorsForTextarea(config, $table, $wikiSourceTextarea) { $table.empty; var $loadingMsg = $(' ').text('Loading lint errors from API...').insertAfter($table); getApiLintErrorsOfArticle(config.wgArticleId).then(function (apiLinterErrors) {           $loadingMsg.remove;            showApiLinterErrors(apiLinterErrors, config, $table, $wikiSourceTextarea);        }); }

function showRestLinterErrors(restLinterErrors, config, $table, $wikiSourceTextarea) { var $thead = $(' ').appendTo($table); $(' ').         append($(' ').text('category')). append($(' ').text('location')). append($(' ').text('params')). append($(' ').text('template')). append($(' ').text('templateInfo')). appendTo($thead); var $tbody = $(' ').appendTo($table);

var appendLintError = function (linterror) { $(' ').             append($(' ').append(createCategoryHelpLink(linterror.type))). append($(' ').append(createLocationLink($wikiSourceTextarea, linterror.dsr[0], linterror.dsr[1]))). append($(' ').text(JSON.stringify(linterror.params))). append($(' ').append(createTemplateLink(linterror.templateInfo))). append($(' ').text(JSON.stringify(linterror.templateInfo))). appendTo($tbody); };

if (restLinterErrors.length >= 1) { $.each(restLinterErrors, function (index, linterror) {               appendLintError(linterror);            }); } else { $(' ').             append($(' ').attr('colspan', 5).text('No lint errors')). appendTo($tbody); }   }

function expandTemplatesInTextarea(config, $textarea) { expandTemplates($textarea.val, config.wgPageName).then(function (result) {           $textarea.val(result);        }); }

function showRestLinterErrorsForTextarea(config, $table, $wikiSourceTextarea) { $table.empty; var $loadingMsg = $(' ').text('Loading lint errors from REST API...').insertAfter($table); getRestLintErrorsOfText($wikiSourceTextarea.val, config.wgPageName).then(function (restLinterErrors) {           $loadingMsg.remove;            showRestLinterErrors(restLinterErrors, config, $table, $wikiSourceTextarea);        }); }

function createEditableTextarea(config, $div) { var $editableTextarea = $(' ').css('width', '100%').css('height', '10em'); $(' ').append('Edit to check lint errors in text here:'). append($editableTextarea).appendTo($div);

var $expandTemplatesLink = $('').text('Expand templates'). attr('href', 'javascript:void(0)'). on('click', function {              expandTemplatesInTextarea(config, $editableTextarea);          }). appendTo($div);

$div.append(' | ');

var $restLinterErrorsTable = $(' ').addClass('linter-details wikitable mw-page-info').appendTo($div); var $showRestLinterErrorsLink = $('').text('Show lint errors'). attr('href', 'javascript:void(0)'). on('click', function {              showRestLinterErrorsForTextarea(config, $restLinterErrorsTable, $editableTextarea);          }). insertBefore($restLinterErrorsTable); }

function createApiLinterErrorsTableAndEditableTextarea(config, $linterDetailsTable, $wikiSourceTextarea) { getWikiSource(config.wgArticleId).then(function (wikiSource) {           $wikiSourceTextarea.text(wikiSource);            showApiLinterErrorsForTextarea(config, $linterDetailsTable, $wikiSourceTextarea);

var $div = $(' ').insertAfter($linterDetailsTable); createEditableTextarea(config, $div); });   }

function mainForInfo(config, $linterTable) { var $showLinterErrorsLink = $('').text('Show Lint errors'). attr('href', 'javascript:void(0)'). on('click', function {              var $linterDetailsTable = $(' ').addClass('linter-details wikitable mw-page-info').insertAfter($linterTable);              var $wikiSourceTextarea = $(' ').attr('readonly', true).css('width', '100%').css('height', '10em').insertAfter($linterTable);              $showLinterErrorsLink.remove;

createApiLinterErrorsTableAndEditableTextarea(config, $linterDetailsTable, $wikiSourceTextarea); }).         insertAfter($linterTable);    }

function mainForEdit(config, $wpTextbox1, $editOptionsDiv, $editButtonsDiv, testsLinterErrorsOnEditInit, summaryMessage) { var $linterDetailsTable = $(' ').addClass('linter-details wikitable mw-page-info').insertAfter($editOptionsDiv); var $div = $(' ').insertAfter($linterDetailsTable); createEditableTextarea(config, $div);

var $testLinterErrorsLink = $('').text('Test Lint errors'). attr('href', 'javascript:void(0)'). on('click', function {                showRestLinterErrorsForTextarea(config, $linterDetailsTable, $wpTextbox1);            }). insertAfter($editButtonsDiv);

if (testsLinterErrorsOnEditInit) { /* initial display of lint errors */ showRestLinterErrorsForTextarea(config, $linterDetailsTable, $wpTextbox1); }

if (summaryMessage) { var $addSummaryMessageLink = $('').text('Add summary'). attr('href', 'javascript:void(0)'). on('click', function {                    $('#wpSummary').val($('#wpSummary').val + summaryMessage);                }). insertAfter($testLinterErrorsLink); $testLinterErrorsLink.after(' | '); }   }

$(function {        if (!('ShowPageLintError' in mw.libs)) {            mw.libs.ShowPageLintError = {                testsLinterErrorsOnEditInit: false,                summaryMessage: null,            };        }        mw.loader.using(['mediawiki.util', 'mediawiki.api']).then(function  { var config = mw.config.get(['wgArticleId', 'wgAction', 'wgPageName']); if (config.wgAction === 'info') { var $linterTable = $('#mw-pageinfo-linter + table'); if ($linterTable[0]) { mainForInfo(config, $linterTable); }           } else if ($('#wpTextbox1')[0]) { mainForEdit(config, $('#wpTextbox1'), $('.editOptions'), $('.editButtons'),                   mw.libs.ShowPageLintError.testsLinterErrorsOnEditInit, mw.libs.ShowPageLintError.summaryMessage); }       });    }); });