利用者:MawaruNeko/CustomWikiEditor.js
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
/* * 改良型編集ツールバーに各種ボタンを追加するカスタムJS * Custom JS to add custom tools to WikiEditor * * 説明: * 改良型編集ツールバーにコメントテンプレートなどを追加します。 * カスタムJSとして導入するか、コピーして使用してください。 * カスタマイズする場合は、[[Wikipedia:カスタムJS#改良型編集ツールバーの拡張]]を参照してください。 * * このファイルはパブリックドメインとします。 * This file is public domain. */(function () { 'use strict'; var spaceRegexp = /\s/gm; /* create link elements from wikiSource */ function getLinkElements(wikiSource, config) { var ns_template = config.wgNamespaceIds.template; var pageName = config.wgPageName; function getLinkPageName(linkName) { linkName = linkName.replace(spaceRegexp, ' '); var firstChar = (linkName.slice(0, 1) === '/'); if (firstChar === '/') { return pageName + linkName; } else { try { return new mw.Title(linkName).getPrefixedText(); } catch (exception) { return null; } } } function getTemplatePageName(templateName) { templateName = templateName.replace(spaceRegexp, ' '); var firstChar = (templateName.slice(0, 1) === '/'); if (firstChar === '/') { return pageName + templateName; } else { try { return new mw.Title(templateName, ns_template).getPrefixedText(); } catch (exception) { return null; } } } var linkRegexp = /\[\[([^\{\}\[\]<>\#\|]+)(\]\]|\|)/mg; var linkNameIndex = 1; var linkNameIndexInRegexp = 2; var templateRegexp = /\{\{([^\{\}\[\]<>\#\|]+)(\}\}|\|)/mg; var templateNameIndex = 1; var templateNameIndexInRegexp = 2; function getPositions(regexp, nameIndex, nameIndexInRegexp, toPageName) { var r = new RegExp(regexp); var match; var results = []; while ((match = r.exec(wikiSource))) { var name = match[nameIndex]; var pageName = toPageName(name); if (pageName) { results.push({ startPos: (match.index + nameIndexInRegexp), name: name, pageName: pageName, url: mw.util.getUrl(pageName), }); } /* if toPageName cannot parse name, just skip it */ } return results; } var positionResults = getPositions(linkRegexp, linkNameIndex, linkNameIndexInRegexp, getLinkPageName). concat(getPositions(templateRegexp, templateNameIndex, templateNameIndexInRegexp, getTemplatePageName)). sort(function (a, b) { return a.startPos - b.startPos; }); var elements = []; var restStrPos = 0; positionResults.forEach(function (position, index) { var pre = wikiSource.slice(restStrPos, position.startPos); elements.push(document.createTextNode(pre)); elements.push($('<a>').attr('target', '_blank').attr('href', position.url).attr('title', position.pageName).text(position.name)); restStrPos = position.startPos + position.name.length; }); var restStr = wikiSource.slice(restStrPos); elements.push(document.createTextNode(restStr)); return elements; } var sourceDialog = { windowManager: null, panelDialog: null, }; function createSourceDialog() { function PanelDialog(config) { PanelDialog.super.call(this, config); } OO.inheritClass(PanelDialog, OO.ui.MessageDialog); PanelDialog.static.name = 'panelDialog'; PanelDialog.static.actions = [{ action: 'accept', label: 'Close' }]; PanelDialog.prototype.initialize = function () { PanelDialog.super.prototype.initialize.apply(this, arguments); var dialog = this; this.sourcePanel = new OO.ui.PanelLayout({ padded: true, expanded: false, scrollable: true, classes: ['show-source-links-panel'] }); this.container.$element.append(this.sourcePanel.$element); }; PanelDialog.prototype.getBodyHeight = function () { return PanelDialog.super.prototype.getBodyHeight.call(this) + this.sourcePanel.$element.outerHeight(true); }; sourceDialog.windowManager = new OO.ui.WindowManager(); $('body').append(sourceDialog.windowManager.$element); sourceDialog.panelDialog = new PanelDialog(); sourceDialog.windowManager.addWindows([sourceDialog.panelDialog]); } function showSourceDialog(source, config) { if (!sourceDialog.windowManager) { createSourceDialog(); } sourceDialog.panelDialog.sourcePanel.$element.empty(); var instance = sourceDialog.windowManager.openWindow(sourceDialog.panelDialog, { size: 'large' }); instance.opened.then(function () { var linksContent = getLinkElements(source, config); sourceDialog.panelDialog.sourcePanel.$element.empty().append(linksContent); }); } function encapsulateSetting(pre, post, label, peri) { pre = pre || ''; post = post || ''; peri = peri || ''; label = label || (pre + peri + post); return { label: label, action: { type: 'encapsulate', options: { pre: pre, peri: peri, post: post, } }, }; } function getSettings(config) { var dateNow = new Date(); var isoDateMonth = dateNow.getUTCFullYear() + '-' + (dateNow.getUTCMonth() + 1); var isoDateMonthDay = dateNow.getUTCFullYear() + '-' + (dateNow.getUTCMonth() + 1) + '-' + dateNow.getUTCDate(); var jaDateMonth = dateNow.getUTCFullYear() + '年' + (dateNow.getUTCMonth() + 1) + '月'; var settings = { sections: {} }; settings.sections['editBooklet'] = { type: 'booklet', label: '編集', pages: {}, }; settings.sections['editBooklet'].pages['editPage'] = { label: '編集', layout: 'characters', characters: [ { label: '改行削除', action: { type: 'encapsulate', options: { regex: /\r|\n/g, regexReplace: '', } }, }, { label: 'リンクを表示', action: { type: 'callback', execute: function(context) { showSourceDialog(context.$textarea.val(), config); } }, }, ], }; settings.sections['editBooklet'].pages['replaceTags'] = { label: 'タグ置換', layout: 'characters', characters: [ { label: '改行 -> <br/>', action: { type: 'encapsulate', options: { regex: /\r|\n/g, regexReplace: '<br/>', } }, }, { label: '<font color=""> -> {{font color|$1|', action: { type: 'encapsulate', options: { regex: /<font\ *color\ *\=\ *(\"|\')?(\#[0-9a-fA-F]+|\w+)(\"|\')?\ *>/g, regexReplace: '{{font color|$2|', } }, }, { label: '</font\ *> -> }}', action: { type: 'encapsulate', options: { regex: /<\/font>/g, regexReplace: '}}', } }, }, ], }; settings.sections['commentBooklet'] = { type: 'booklet', label: 'コメント', pages: {}, }; if (config.wgNamespaceNumber === 4 && config.wgPageName.includes('削除依頼')) { settings.sections['commentBooklet'].pages['AFDcomments'] = { label: '削除依頼', layout: 'characters', characters: [ '{{AFD|削除}}', '{{AFD|全削除}}', '{{AFD|即時削除}}', '{{AFD|一部}}', '{{AFD|一部削除}}', '{{AFD|一部存続}}', '{{AFD|特定版}}', '{{AFD|特定版削除}}', '{{AFD|版指定}}', '{{AFD|版指定削除}}', '{{AFD|即時版指定}}', '{{AFD|即時版指定削除}}', '{{AFD|緊急削除}}', '{{AFD|緊急}}', '{{AFD|緊急特定版削除}}', '{{AFD|緊急版指定}}', '{{AFD|緊急版指定削除}}', '{{AFD|緊急即時削除}}', '{{AFD|緊急即時}}', '{{AFD|存続}}', '{{AFD|全存続}}', '{{AFD|即時存続}}', '{{AFD|移動}}', '{{AFD|他プロジェクトへ移動}}', '{{AFD|取り下げ}}', '{{AFD|終了}}', '{{AFD|保留}}', '{{AFD|コメント}}', '{{AFD|コ}}', ], }; } if (config.wgNamespaceNumber === 4 && config.wgPageName.includes('保護') && config.wgPageName.includes('依頼')) { settings.sections['commentBooklet'].pages['RFPcomments'] = { label: '保護依頼', layout: 'characters', characters: [ '{{RFP|保護}} ', '{{RFP|半保護}} ', '{{RFP|移動}} ', '{{RFP|白紙}} ', '{{RFP|半白紙}} ', '{{RFP|継続}} ', '{{RFP|解除}}', '{{RFP|解除2}} ', '{{RFP|反対}} ', '{{RFP|終了}} ', '{{RFP|保留}} ', '{{RFP|コメント}} ', ], }; } if (config.wgNamespaceNumber === 4 && config.wgPageName.includes('ブロック依頼')) { settings.sections['commentBooklet'].pages['BLcomments'] = { label: 'ブロック依頼', layout: 'characters', characters: [ '{{BL|賛成}}', '{{BL|賛成|対話の結果次第|3ヶ月}}', '{{BL|反対}}', '{{BL|反対|対話の結果次第}}', '{{BL|即時終了}}', '{{BL|中立}}', '{{BL|棄権}}', '{{BL|保留}}', '{{BL|コメント}}', '{{BL|延長}}', '{{BL|延長|対話の結果次第|1年}}', '{{BL|維持}}', '{{BL|維持|対話の結果次第}}', '{{BL|解除}}', '{{BL|解除|対話の結果次第}}', '{{BL|短縮}}', '{{BL|短縮|対話の結果次第}}', '{{BL|継続}}', '{{BL|継続|対話の結果次第}}', '{{BL|追認}}', '{{BL|追認|対話の結果次第|3ヶ月}}', '{{BL|質問}}', '{{BL|情報}}', '{{BL|報告}}', '{{BL|取り下げ}}', '{{BL|終了提案}}', ], }; } settings.sections['commentBooklet'].pages['discussion'] = { label: '議論', layout: 'characters', characters: [ '{{賛成}}', '{{条件付賛成}}', '{{賛成r}}', '{{反対}}', '{{条件付反対}}', '{{反対r}}', '{{保留}}', '{{ニュートラル}}', '{{棄権}}', '{{コメント}}', '{{コ|(コメント)}}', '{{返信}}', '{{返|(宛先)}}', '{{提案}}', '{{理由}}', '{{問}}', '{{情報}}', '{{報告}}', '{{撤回}}', ], }; settings.sections['commentBooklet'].pages['discussion2'] = { label: '議論2', layout: 'characters', characters: [ '{{支持}}', '{{コメント2|横から失礼}}', '{{無関係}}', '{{Attention}}', '{{Attention2}}', '{{Warnsign}}', '{{おそらく}}', '{{ありそうにない}}', '{{移譲}}', '{{メモ}}', '{{終了依頼}}', '{{補助メモ}}', '{{補助要求}}', '{{追加情報}}', '{{非決定的}}', '{{追記}}', '{{除外}}', '{{不必要}}', '{{不要}}', '{{除去}}', '{{維持}}', '{{コメント2|維持r}}', '{{現状維持}}', '{{現状維持|r}}', '{{存続}}', '{{存続|存続r}}', '{{存続|全}}', '{{存続|全存続}}', '{{存続|全r}}', '{{存続|全存続r}}', '{{存続|即時}}', '{{存続|即時存続}}', '{{存続|即時r}}', '{{存続|即時存続r}}', '{{存続|一部}}', '{{存続|一部存続}}', '{{存続|一部r}}', '{{存続|一部存続r}}', ], }; settings.sections['commentBooklet'].pages['discussionEnd'] = { label: '終了', layout: 'characters', characters: [ '{{レ}}', '{{済}}', '{{完了}}', '{{対処}}', '{{確認}}', '{{可能}}', '{{追加済}}', '{{×}}', '{{中止}}', '{{却下}}', '{{自動失効}}', '{{依頼無効}}', '{{取り下げ}}', '{{受付除外}}', '{{未了}}', '{{未了2}}', '{{謝絶}}', '{{時間切れ}}', '{{終了}}', '{{Close}}', '{{再受付}}', '{{作業中}}', ], }; settings.sections['commentBooklet'].pages['discussionThanks'] = { label: '感謝', layout: 'characters', characters: [ '{{感謝}}', '{{感謝2}}', '{{笑顔}}', '{{花}}', ], }; settings.sections['commentBooklet'].pages['discussionState'] = { label: '話題の状態', layout: 'characters', characters: [ '{{済み}}', '{{失効}}', '{{スタック}}', '{{解決済み}}', '{{未解決}}', ], }; settings.sections['layoutBooklet'] = { type: 'booklet', label: 'レイアウト', pages: {}, }; settings.sections['layoutBooklet'].pages['sfnPage'] = { label: 'Sfn', layout: 'characters', characters: [ '{{Sfn|author|YYYY|p=}}', '{{Harv|author|YYYY|p=}}', '{{Harvnb|author|YYYY|p=}}', '{{SfnRef|author|YYYY}}', ], }; settings.sections['layoutBooklet'].pages['notePage'] = { label: '脚注', layout: 'characters', characters: [ encapsulateSetting('{{efn2|', '}}'), '{{notelist2}}', ], }; settings.sections['layoutBooklet'].pages['formatPage'] = { label: '書式', layout: 'characters', characters: [ encapsulateSetting('{{Color|red|', '}}'), encapsulateSetting('{{Color|#00F000|', '}}'), encapsulateSetting('{{fontsize|12px|', '}}'), encapsulateSetting('{{Center|', '}}'), encapsulateSetting('{{Del|', '}}'), encapsulateSetting('<s>', '</s>'), encapsulateSetting('<code>', '</code>'), encapsulateSetting('<source lang="javascript">', '</source>'), encapsulateSetting('<kbd>', '</kbd>'), encapsulateSetting('<var>', '</var>'), encapsulateSetting('<samp>', '</samp>'), ], }; settings.sections['cleanupBooklet'] = { type: 'booklet', label: '問題', pages: {}, }; settings.sections['cleanupBooklet'].pages['cleanupHeadPage'] = { label: '見出し', layout: 'characters', characters: [ '{{特筆性|date=' + jaDateMonth + '}}', '{{観点|date=' + jaDateMonth + '}}', '{{国際化|date=' + jaDateMonth + '}}', '{{宣伝|date=' + jaDateMonth + '}}', '{{存命人物の出典明記|date=' + jaDateMonth + '}}', '{{BLP unsourced|date=' + jaDateMonth + '}}', '{{スポーツ選手の出典明記|section=1|date=' + jaDateMonth + '}}', '{{出典の明記|date=' + jaDateMonth + '}}', '{{単一の出典|date=' + jaDateMonth + '}}', '{{単一の出典|section=1|date=' + jaDateMonth + '}}', '{{一次資料|date=' + jaDateMonth + '}}', '{{一次資料|section=1|date=' + jaDateMonth + '}}', '{{精度|date=' + jaDateMonth + '}}', '{{精度|date=' + jaDateMonth + '|section=1}}', '{{未検証|date=' + jaDateMonth + '}}', '{{未検証|date=' + jaDateMonth + '|talk=ノート:XXXXXXXX|section=1}}', '{{ページ番号|date=' + jaDateMonth + '}}', '{{参照方法|date=' + jaDateMonth + '}}', '{{参照方法|date=' + jaDateMonth + '|section=1}}', '{{No footnotes|date=' + jaDateMonth + '}}', '{{No footnotes|date=' + jaDateMonth + '|section=1}}', '{{No footnotes|date=' + jaDateMonth + '|BLP=yes}}', '{{脚注の不足|date=' + jaDateMonth + '}}', '{{脚注の不足|date=' + jaDateMonth + '|section=1}}', '{{脚注の不足|date=' + jaDateMonth + '|BLP=yes}}', '{{Ibid|date=' + jaDateMonth + '}}', '{{TVWATCH}}', '{{RADIOLISTEN}}', '{{医学の情報源|date=' + jaDateMonth + '}}', '{{医学の情報源|section|date=' + jaDateMonth + '}}', '{{独自研究|date=' + jaDateMonth + '}}', '{{独自研究|section=1|date=' + jaDateMonth + '}}', '{{Cleanup|date=' + jaDateMonth + '}}', '{{Cleanup|section=1|date=' + jaDateMonth + '}}', '{{Wikify|date=' + jaDateMonth + '}}', '{{リンクのみの節}}', '{{年譜のみの経歴|date=' + jaDateMonth + '}}', '{{色の過剰使用}}', '{{一部ブラウザで表示できない}}', '{{一部ブラウザで表示できない|問題のブラウザ}}', '{{導入部がない|date=' + jaDateMonth + '}}', '{{導入部が短い|date=' + jaDateMonth + '}}', '{{導入部が長い|date=' + jaDateMonth + '}}', '{{導入部がおかしい|date=' + jaDateMonth + '}}', '{{概要節がおかしい|date=' + jaDateMonth + '}}', '{{雑多な内容の箇条書き|date=' + jaDateMonth + '}}', '{{雑多な内容の箇条書き|section=1|date=' + jaDateMonth + '}}', '{{内容過剰|date=' + jaDateMonth + '|該当ポータル・プロジェクトの運用基準が記されているページ名}}', '{{画像過剰|date=' + jaDateMonth + '}}', '{{リンク過剰||date=' + jaDateMonth + '}}', '{{関連項目過剰|date=' + jaDateMonth + '}}', '{{百科事典的でない|date=' + jaDateMonth + '|t=Wikipedia‐ノート:ウィキペディアは何ではないか}}', '{{百科事典的でない|date=' + jaDateMonth + '|section=1}}', '{{字引|date=' + jaDateMonth + '}}', '{{百科事典的でない|date=' + jaDateMonth + '|t=Wikipedia‐ノート:ウィキペディアは何ではないか}}', '{{百科事典的でない|date=' + jaDateMonth + '|section=1}}', '{{正確性|date=' + jaDateMonth + '}}', '{{正確性|date=' + jaDateMonth + '|疑問点の要約}}', '{{正確性|date=' + jaDateMonth + '|section=1}}', '{{大言壮語|date=' + jaDateMonth + '}}', '{{大言壮語|date=' + jaDateMonth + '|section=1}}', '{{言葉を濁さない|date=' + jaDateMonth + '}}', '{{不十分なあらすじ|date=' + jaDateMonth + '}}', '{{要あらすじ}}', '{{物語世界内の観点|date=' + jaDateMonth + '}}', '{{物語内容のみ|date=' + jaDateMonth + '}}', '{{外部リンクの注意}}', '{{外部リンクの注意|section=1}}', '{{Rough translation|言語名}}', '{{要改訳}}', ], }; settings.sections['cleanupBooklet'].pages['cleanupNotePage'] = { label: '注釈', layout: 'characters', characters: [ '{{要検証|date=' + jaDateMonth + '}}', encapsulateSetting('{{要検証範囲|date=' + jaDateMonth + '|', '}}'), '{{信頼性要検証|date=' + isoDateMonth + '}}', '{{要出典|date=' + jaDateMonth + '}}', encapsulateSetting('{{要出典範囲|date=' + jaDateMonth + '|', '}}'), '{{要ページ番号|date=' + jaDateMonth + '}}', '{{Full citation needed|date=' + jaDateMonth + '}}', '{{出典無効|date=' + isoDateMonthDay + '}}', '{{リンク切れ|date=' + jaDateMonth + '}}', '{{要出典医学|date=' + jaDateMonth + '}}', '{{信頼性の低い医学の情報源|date=' + jaDateMonth + '}}', '{{誰|date=' + jaDateMonth + '}}', encapsulateSetting('{{誰範囲|date=' + jaDateMonth + '|', '}}'), '{{誰2|date=' + jaDateMonth + '}}', encapsulateSetting('{{誰範囲2|date=' + jaDateMonth + '|', '}}'), '{{いつ|date=' + jaDateMonth + '}}', encapsulateSetting('{{いつ範囲|date=' + jaDateMonth + '|', '}}'), '{{どこ|date=' + jaDateMonth + '}}', '{{どれ|date=' + jaDateMonth + '}}', '{{How|date=' + jaDateMonth + '}}', encapsulateSetting('{{独自研究範囲|date=' + jaDateMonth + '|', '}}'), '{{Synthesis-inline}}', '{{疑問点|date=' + jaDateMonth + '|title=|talksection=}}', encapsulateSetting('{{疑問点範囲|date=' + jaDateMonth + '|', '}}'), '{{読み疑問点|date=' + jaDateMonth + '}}', encapsulateSetting('{{要追加記述範囲|date=' + jaDateMonth + '|', '}}'), '{{要曖昧さ回避|date=' + jaDateMonth + '}}', '{{要説明|date=' + jaDateMonth + '}}', encapsulateSetting('{{要説明範囲|date=' + jaDateMonth + '|', '}}'), '{{訳語疑問点|date=' + jaDateMonth + '}}', encapsulateSetting('{{訳語疑問点範囲|date=' + jaDateMonth + '|', '}}'), ], }; return settings; } function customizeEditform(config) { mw.util.addCSS( '.show-source-links-panel { white-space: pre-wrap; height: 40em; }\n' + '' ); $(document.editform.wpTextbox1).wikiEditor('addToToolbar', getSettings(config)); } $(function () { mw.loader.using(['mediawiki.util', 'user.options', 'mediawiki.Title', 'oojs-ui']).then(function () { if (document.editform) { var config = mw.config.get(['wgAction', 'wgNamespaceNumber', 'wgNamespaceIds', 'wgPageName']); if (mw.user.options.get('usebetatoolbar') == 1) { mw.loader.using('ext.wikiEditor').then(function () { customizeEditform(config); }); } } }); });}) ();