利用者:Nanona15dobato/CustomWikiEditor.js
表示
お知らせ: 保存した後、ブラウザのキャッシュをクリアしてページを再読み込みする必要があります。
多くの Windows や Linux のブラウザ
- Ctrl を押しながら F5 を押す。
Mac における Safari
Mac における Chrome や Firefox
- ⌘ Cmd と ⇧ Shift を押しながら R を押す。
詳細についてはWikipedia:キャッシュを消すをご覧ください。
/*<nowiki>
* 改良型編集ツールバーに各種ボタンを追加するカスタムJS
* Custom JS to add custom tools to WikiEditor
*
* 説明:
* 改良型編集ツールバーにコメントテンプレートなどを追加します。
* カスタムJSとして導入するか、コピーして使用してください。
* カスタマイズする場合は、[[Wikipedia:カスタムJS#改良型編集ツールバーの拡張]]を参照してください。
*
* PDである[[利用者:MawaruNeko/CustomWikiEditor.js]]より改変
*/
(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['Bot'] = {
type: 'booklet',
label: 'Bot',
pages: {},
};
settings.sections['Bot'].pages['Botreq'] = {
label: 'BOTREQ',
layout: 'characters',
characters: [
'* {{BOTREQ|着手}}--~~~~',
encapsulateSetting('* {{at|', '}}:{{BOTREQ|完了}} Botにて{{利用者の投稿記録リンク|nanonaBot|nn|yyyymmddhhmmss|text=nn編集}}行いました。が0項目のため、完了とします。問題等なければ{{tl|確認}}の貼付をお願いします。'),
encapsulateSetting('{{リンク元|', '|標準名前空間のリンク元|0}}'),
encapsulateSetting('{{Fullurl|n=特別:リンク元|p=target=Template:', '&namespace=0&hidelinks=1&hideredirs=1&limit=50|s=標準名前空間の参照読み込み}}'),
encapsulateSetting('「[[:Category:', ']]」'),
'{{解決済み|~~~~}}',
],
};
settings.sections['anime'] = {
type: 'booklet',
label: 'アニメ',
pages: {},
};
settings.sections['anime'].pages['season1'] = {
label: '第2期制作決定',
layout: 'characters',
characters: [
encapsulateSetting('第1','期:'),
'{{放送前の番組|date=' + jaDateMonth + '|section=1}}',
encapsulateSetting('第1','期'),
encapsulateSetting('{{エピソードリスト/base\n| Chapter = 第1','期\n}}'),
encapsulateSetting('| season = 第1','期'),
encapsulateSetting('|-\n! colspan="', '"|第1期'),
],
};
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);
});
}
}
});
});
})();
//</nowiki>