User:逆襲的天邪鬼/Twinkle-lzh/twinklespeedy.js: Difference between revisions

no edit summary
(Created page with "//<nowiki> // vim: set noet sts=0 sw=8: (function($){ /* **************************************** *** twinklespeedy.js: CSD module *************************************...")
 
No edit summary
 
(11 intermediate revisions by the same user not shown)
Line 26:
// * Flow pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || mw.config.get('wgPageContentModel') === 'flow-board' || !mw.config.get('wgArticleId')) {
return;
}
 
Twinkle.addPortletLink( Twinkle.speedy.callback, "速", "tw-csd", Morebits.userIsInGroup('sysop') ? "快速除" : "求快速除" );
};
 
Line 83:
Twinkle.speedy.dialog = new Morebits.simpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') );
dialog = Twinkle.speedy.dialog;
dialog.setTitle( "选择選擇快速除理由" );
dialog.setScriptName( "Twinkle" );
dialog.addFooterLink( "快速删除方针", "WP:CSD" );
dialog.addFooterLink( "Twinkle帮助", "WP:TW/DOC#speedy" );
 
var form = new Morebits.quickForm( callbackfunc, (Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null) );
Line 94 ⟶ 92:
list: [
{
label: '只标记標記,不除',
value: 'tag_only',
name: 'tag_only',
tooltip: '如果您只想标记標記面而不是',
checked : Twinkle.getPref('deleteSysopDefaultToTag'),
event: function( event ) {
Line 138 ⟶ 136:
deleteOptions.append( {
type: 'header',
label: '除相'
} );
if (mw.config.get('wgNamespaceNumber') % 2 === 0 && (mw.config.get('wgNamespaceNumber') !== 2 || (/\//).test(mw.config.get('wgTitle')))) { // hide option for user pages, to avoid accidentally deleting user talk page
Line 145 ⟶ 143:
list: [
{
label: '讨论页討論頁',
value: 'talkpage',
name: 'talkpage',
tooltip: "附带除此面的讨论页討論頁。",
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
Line 158 ⟶ 156:
} );
}
deleteOptions.append( {
type: 'checkbox',
list: [
{
label: '不刪除,而是移動到「稿」',
value: 'movetodraft',
name: 'movetodraft',
tooltip: "不刪除頁面,而是將其移動到「稿」名字空間。",
checked: false,
disabled: (mw.config.get('wgNamespaceNumber') === 106 || mw.config.get('wgNamespaceNumber') === 107),
event: function( event ) {
event.stopPropagation();
}
}
]
} );
 
deleteOptions.append( {
type: 'checkbox',
list: [
{
label: '除重定向',
value: 'redirects',
name: 'redirects',
tooltip: "除到此的重定向。",
checked: Twinkle.getPref('deleteRedirectsOnDelete'),
disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
Line 178 ⟶ 193:
list: [
{
label: '用多理由除',
value: 'delmultiple',
name: 'delmultiple',
tooltip: "您可选择应選擇應于该页於該頁的多理由。",
event: function( event ) {
Twinkle.speedy.callback.modeChanged( event.target.form );
Line 193 ⟶ 208:
list: [
{
label: '开启開啟户对话页戶對話頁',
value: 'openusertalk',
name: 'openusertalk',
tooltip: '此默认預設您的开启对话页设置開啟對話頁設定。在您选择应選擇應用多理由项将項將保持不。',
checked : false
}
Line 211 ⟶ 226:
tagOptions.append( {
type: 'header',
label: '标记標記'
} );
}
Line 219 ⟶ 234:
list: [
{
label: '如可能,通知者',
value: 'notify',
name: 'notify',
tooltip: "如果您啟用了該理據的通知,通知模板将会被將會加入者的对话页,如果您启用了该理据的通知對話頁。",
checked: !Morebits.userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'),
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
Line 235 ⟶ 250:
list: [
{
label: '用多理由',
value: 'multiple',
name: 'multiple',
tooltip: "您可选择应選擇應于该页於該頁的多理由。",
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
event: function( event ) {
Line 251 ⟶ 266:
type: 'div',
name: 'work_area',
label: '初始化CSD模,或将这报將這報Twinkle开发開發者。'
} );
 
Line 324 ⟶ 339:
work_area.append( {
type: 'div',
label: '当选择當選擇完成点击點選:'
} );
work_area.append( {
Line 339 ⟶ 354:
var radioOrCheckbox = (Twinkle.speedy.mode.isMultiple(mode) ? 'checkbox' : 'radio');
 
// if (Twinkle.speedy.mode.isSysop(mode) && !Twinkle.speedy.mode.isMultiple(mode)) {
work_area.append( { type: 'header', label: '自定理由' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.customRationale, mode) } );
// }
 
switch (namespace) {
case 0: // article
work_area.append( { type: 'header', label: '目' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.articleList, mode) } );
break;
 
/*
case 2: // user
case 3: // user talk
work_area.append( { type: 'header', label: '用户页戶頁' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.userList, mode) } );
break;
*/
 
case 6: // file
work_area.append( { type: 'header', label: '文件' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.fileList, mode) } );
if (!Twinkle.speedy.mode.isSysop(mode)) {
work_area.append( { type: 'div', label: '标记CSD F3、F4,请使用Twinkle的“图权”功能。' } );
}
break;
 
case 14: // category
work_area.append( { type: 'header', label: '分' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode) } );
break;
Line 375 ⟶ 384:
// custom rationale lives under general criteria when tagging
var generalCriteria = Twinkle.speedy.generalList;
// if (!Twinkle.speedy.mode.isSysop(mode)) {
// generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria);
// }
work_area.append( { type: 'header', label: '常' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(generalCriteria, mode) });
if (!Twinkle.speedy.mode.isSysop(mode)) {
work_area.append( { type: 'div', label: '标记CSD G16,请使用Twinkle的“侵权”功能。' } );
}
 
if (mw.config.get('wgIsRedirect') || Morebits.userIsInGroup('sysop')) {
Line 417 ⟶ 423:
return $.map(list, function(critElement) {
var criterion = $.extend({}, critElement);
 
// hack to get the g11 radio / checkbox right
if (criterion.value === 'g11') {
criterion.style = Twinkle.getPref('enlargeG11Input') ? 'height: 2em; width: 2em; height: -moz-initial; width: -moz-initial; -moz-transform: scale(2); -o-transform: scale(2);' : '';
}
 
if (multiple) {
Line 503 ⟶ 504:
Twinkle.speedy.customRationale = [
{
label: '自定理由' + (Morebits.userIsInGroup('sysop') ? '(自定义删義刪除理由)' : ''),
value: 'reason',
tooltip: '這不是萬能的刪除理由,只適用於該頁及其歷史版本均明顯不應存在於維基大典的情況。',
tooltip: '该页至少应该符合一条快速删除的标准,并且您必须在理由中提到。这不是万能的删除理由。',
subgroup: {
name: 'reason_1',
Line 512 ⟶ 513:
size: 60
},
hideWhenMultiple: true
}
];
 
Twinkle.speedy.fileList = [
{
label: 'F1: 重复的档案(完全相同或缩小),而且不再被条目使用',
value: 'f1',
subgroup: {
name: 'f1_filename',
type: 'input',
label: '与此文件相同的文件名:',
tooltip: '可不含“File:”前缀。'
}
},
{
label: 'F3: 所有未知版权的档案和来源不明档案',
value: 'f3',
hideWhenUser: true
},
{
label: 'F4: 没有提供版权状况、来源等资讯的档案',
value: 'f4',
hideWhenUser: true
},
{
label: 'F5: 被高分辨率或SVG档案取代的图片',
value: 'f5',
subgroup: {
name: 'f5_filename',
type: 'input',
label: '新文件名:',
tooltip: '可不含“File:”前缀。'
}
},
{
label: 'F6: 没有被条目使用的非自由版权档案',
value: 'f6',
},
{
label: 'F7: 与维基共享资源档案重复的档案',
value: 'f7',
subgroup: {
name: 'f7_filename',
type: 'input',
label: '维基共享资源上的文件名:',
value: Morebits.pageNameNorm,
tooltip: '如与本文件名相同则可留空,可不含“File:”前缀。'
},
hideWhenMultiple: true
}
];
Line 567 ⟶ 518:
Twinkle.speedy.articleList = [
{
label: 'A1: 常短,而且没有定义或内容。文言',
value: 'a1',
tooltip: '條目根本不是文言文,只有完全重寫才能解決問題。文白相雜請改用{{文白相雜|~~~~~}}。如果作者有改善意願,建議移至草稿。'
tooltip: '例如:“他是一个很有趣的人,他创建了工厂和庄园。并且,顺便提一下,他的妻子也很好。”如果能够发现任何相关的内容,可以将这个页面重定向到相关的条目上。'
},
{
label: '極短且不知所云',
label: 'A2: 内容只包括外部连接、参见、图书参考、类别标签、模板标签、跨语言连接的条目。',
value: 'a2',
tooltip: '只用於非常短,而且明顯看不出主題的條目。'
tooltip: '请注意:有些维基人创建条目时会分开多次保存,请避免删除有人正在工作的页面。带有{{inuse}}的不适用。'
},
{
label: '文白相雜且未斧正',
label: 'A3: 复制自其他中文维基计划,或是与其他中文维基计划内容相同的文章。',
value: 'a3',
tooltip: '條目文白相雜,等了一個月之後內容仍未改善。建議將這種頁面移到草稿而不是刪除。',
hideWhenUser: true
},
{
label: '生不立傳',
label: 'A5: 条目建立时之内容即与其他现有条目内容完全相同,且名称不适合做为其他条目之重定向。',
value: 'a5a4',
tooltip: '条目被建立时,第一个版本的内容与当时其他现存条目完全相同,且这个条目的名称不适合改为重定向,就可以提送快速删除。如果名称可以作为重定向,就应直接改重定向,不要提送快速删除。如果是多个条目合并产生的新条目,不适用。如果是从主条目拆分产生的条目,不适用;如有疑虑,应提送存废讨论处理。',
subgroup: {
name: 'a5_pagename',
type: 'input',
label: '现有条目名:',
size: 60
}
},
{
label: 'A6: 复制自其他维基百科语言版本,且完全没有翻译。',
value: 'a6',
tooltip: '如果并不是复制于任何其他的维基百科语言版本,请换用{{notmandarin}}。带有{{inuse}}和{{translating}}模板的不适用。'
}
];
 
Twinkle.speedy.categoryList = [
{
label: 'O4: 的类别(没有条目也没有子类别)。',
value: 'o4c1',
tooltip: '不于Category:不要删除於維護大典性質的分类中的空分类。'
}
];
 
Twinkle.speedy.userList = [
{
label: 'O1: 用户请求删除自己的用户页或其子页面。',
value: 'o1',
tooltip: '如果是从其他名字空间移动来的,须附有合理原因。'
},
{
label: 'O3: 匿名用户的用户讨论页,其中的内容不再有用。',
value: 'o3',
tooltip: '避免给使用同一IP地址的用户带来混淆。不适用于用户讨论页的存盘页面。'
}
];
Line 621 ⟶ 549:
Twinkle.speedy.generalList = [
{
label: 'G1:作者請求 没有实际内容的页面/ 去己齋',
value: 'g1',
tooltip: '注意:應該只用於頁面作者唯一或實質貢獻者唯一的情況,因此用戶討論頁通常不適用刪除。'
tooltip: '如“adfasddd”。参见Wikipedia:胡言乱语。但注意:图片也算是内容。'
},
{
label: 'G2: 测试页面毀我大典',
value: 'g2g3',
tooltip: '例如:“这是一个测试。”'
},
{
label: '廣告宣傳',
label: 'G3: 纯粹破坏,包括但不限于明显的恶作剧、错误信息、人身攻击等',
value: 'g3g4',
tooltip: '明顯的廣告宣傳,唯有全部重寫才能改善內容,或者無法按大典要求重寫。'
tooltip: '包括明显的错误信息、明显的恶作剧、信息明显错误的图片,以及清理移动破坏时留下的重定向。'
},
{
label: '試筆',
label: 'G5: 曾经根据页面存废讨论、侵权审核或文件存废讨论结果删除后又重新创建的内容,而有关内容与已删除版本相同或非常相似,无论标题是否相同',
value: 'g5',
tooltip: '測試性質的頁面',
tooltip: '该内容之前必须是经存废讨论删除,如之前属于快速删除,请以相同理由重新提送快速删除。该内容如与被删除的版本明显不同,而提删者认为需要删除,请交到存废讨论,如果提删者对此不肯定,请先联络上次执行删除的管理人员。不适用于根据存废复核结果被恢复的内容。在某些情况下,重新创建的条目有机会发展。那么不应提交快速删除,而应该提交存废复核或存废讨论重新评核。',
subgroup: {
name: 'g5_1',
type: 'input',
label: '删除讨论位置:',
tooltip: '必须以“Wikipedia:”开头',
size: 60
},
hideSubgroupWhenMultiple: true
},
{
label: 'G8: 管理员因技术原因删除页面孤頁',
value: 'g8g7',
tooltip: '例如以下几种類型:1. 没有對應檔案的檔案頁面;2. 没有對應母頁面的子頁面,用戶頁子頁面除外;3. 指向不存在頁面的重定向;4. 没有對應内容頁面的討論頁,討論頁存档和用戶討論頁除外;5. 不存在注册用戶的用戶頁及用戶頁子頁面,随用戶更名产生的用戶頁重定向除外。請在刪除時注意有无將内容移至他处的必要。不包括在主頁面挂有{{CSD Placeholder}}模板的討論頁。'
tooltip: '包括解封用户后删除用户页、因用户夺取而删除、删除MediaWiki页面、因移动请求而删除页面。',
hideWhenUser: true
},
{
label: '大典維護',
label: 'G10: 原作者清空页面或提出删除,且贡献者只有一人',
value: 'g10g8',
tooltip: '例如解封用戶而刪除{{永禁}}、刪除MediaWiki頁面、因移動而刪除等。',
tooltip: '对条目内容无实际修改的除外;提请须出于善意,及附有合理原因。',
subgroup: {
name: 'g10_rationale',
type: 'input',
label: '可选的解释:',
tooltip: '比如作者在哪里请求了删除。',
size: 60
},
hideSubgroupWhenSysop: true
},
{
label: 'G11: 明显的广告宣传页面,或只有相关人物或团体的联系方法的页面',
value: 'g11',
tooltip: '页面只收宣传之用,并须完全重写才能贴合百科全书要求。须注意,仅仅以某公司或产品为主题的条目,并不直接导致其自然满足此速删标准。'
},
{
label: 'G12: 未列明来源且语调负面的生者传记',
value: 'g12',
tooltip: '注意是未列明来源且语调负面,必须2项均符合。'
},
{
label: 'G13: 明显、拙劣的机器翻译',
value: 'g13'
},
{
label: 'G14: 超过两周没有进行任何翻译的非现代标准汉语页面',
value: 'g14',
tooltip: '包括所有未翻译的外语、汉语方言以及文言文。',
hideWhenUser: true
},
{
label: 'G15: 孤立页面,比如没有主页面的讨论页、指向空页面的重定向等',
value: 'g15',
tooltip: '包括以下几种类型:1. 没有对应文件的文件页面;2. 没有对应母页面的子页面,用户页子页面除外;3. 指向不存在页面的重定向;4. 没有对应内容页面的讨论页,讨论页存档和用户讨论页除外;5. 不存在注册用户的用户页及用户页子页面,随用户更名产生的用户页重定向除外。请在删除时注意有无将内容移至他处的必要。不包括在主页面挂有{{CSD Placeholder}}模板的讨论页。'
},
{
label: 'G16: 因为主页面侵权而创建的临时页面仍然侵权',
value: 'g16',
hideWhenUser: true
}
];
 
Twinkle.speedy.redirectArticleList = [
{
label: 'R2: 跨名字空间重定向。條目渡至非條目',
value: 'r2r3',
tooltip: '由目的名字空间重定向至非目名字空间,或户页戶頁移出目名字空间遗留的重定向。'
},
{
label: '簡化字文題',
value: 'r4',
tooltip: '條目以簡化字為題。如果不是重定向頁,需先移動到合適的標題然後再提刪。'
}
];
Line 709 ⟶ 595:
Twinkle.speedy.redirectList = [
{
label: 'R3: 格式错误,斷渡明显笔误的重定向。窮渡',
value: 'r3r1',
tooltip: '非一眼能看出的拼写错误和翻译或标题用字的争议应交由存废讨论处理。',
subgroup: {
name: 'r3_type',
type: 'select',
label: '适用类别:',
list: [
{ label: '请选择', value: '' },
{ label: '标题繁简混用', value: '标题繁简混用。' },
{ label: '消歧义使用的括号或空格错误', value: '消歧义使用的括号或空格错误。' },
{ label: '间隔号使用错误', value: '间隔号使用错误。' },
{ label: '标题中使用非常见的错别字', value: '标题中使用非常见的错别字。' },
{ label: '移动侵权页面的临时页后所产生的重定向', value: '移动侵权页面的临时页后所产生的重定向。' }
]
},
hideSubgroupWhenSysop: true
},
{
label: '筆誤',
label: 'R5: 指向本身的重定向或循环的重定向。',
value: 'r5r2',
tooltip: '非一眼能看出的拼寫錯誤和翻譯或標题用字的爭議應交由議刪處理。',
tooltip: '如A→B→C→……→A。'
},
];
 
Line 739 ⟶ 610:
'multiple-finish': 'multiple-finish',
'g1': 'g1',
'g2': 'g2',
'g3': 'g3',
'g4': 'g4',
'g5': 'g5',
'g7': 'g7',
'g8': 'g8',
'g10': 'g10',
'g11': 'g11',
'g12': 'g12',
'g13': 'g13',
'g14': 'g14',
'g15': 'g15',
'g16': 'g16',
'a1': 'a1',
'a2': 'a2',
'a3': 'a3',
'a5a4': 'a5a4',
'a6r1': 'a6r1',
'r2': 'r2',
'r3': 'r3',
'r5r4': 'r5r4',
'f1c1': 'f1c1',
'f3': 'f3',
'f4': 'f4',
'f5': 'f5',
'f6': 'f6',
'f7': 'f7',
'o1': 'o1',
'o3': 'o3',
'o4': 'o4'
};
 
Line 773 ⟶ 630:
'reason': '',
// General
'g1': '无实际内容作者請求',
'g2g3': '测试页毀我大典',
'g3g4': '破坏廣告宣傳',
'g5': '試筆',
'g5': '曾经依存废讨论被删除的重建内容',
'g8g7': '技术原因孤頁',
'g10g8': '作者请求大典維護',
'g11': '广告或宣传',
'g12': '未列明来源或违反生者传记的负面内容',
'g13': '明显且拙劣的机器翻译',
'g14': '超过两周没有翻译的非现代标准汉语页面',
'g15': '孤立页面',
'g16': '临时页面依然侵权',
// Articles
'a1': '非常短而无定义或内容文言',
'a2': '極短且不知所云',
'a2': '内容只包含参考、链接、模板或/及分类',
'a3': '与其他中维基计划内容同的文章雜且未斧正',
'a4': '生不立傳',
'a5': '条目建立时之内容即与其他现有条目内容相同',
'a6': '复制自其他维基百科语言版本',
// Redirects
'r2r1': '跨名字空间重定向斷渡或窮渡',
'r3r2': '标题错误的重定向筆誤',
'r3': '條目渡至非條目',
'r5': '指向本身的重定向或循环的重定向',
'r4': '簡化字文題',
// Images and media
'f1': '重复的图片',
'f3': '[[:Category:未知版权的档案]]',
'f4': '[[:Category:來源不明檔案]]',
'f5': '已有高分辨率的图片取代',
'f6': '孤立而没有被条目使用的非自由版权图片',
'f7': '[[:Category:与维基共享资源重复的档案]]',
// User pages
'o1': '用户请求删除自己的用户页或其子页面',
'o3': '匿名用户的讨论页',
// Categories
'o4c1': '空的类别'
// Templates
// Portals
Line 813 ⟶ 654:
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
var code, parameters,= i"{{刪|";
var reasons = Twinkle.speedy.callbacks.getReasons(params);
if (params.normalizeds.length > 1) {
codeparams.utparams = "{{delete"};
$.each(params.utparamsnormalizeds, function(index, =norm) {};
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, params.templateParams[index] || []));
$.each(params.normalizeds, function(index, norm) {
});
code += "|" + norm.toUpperCase();
code += reasons.join(';') + "}}";
 
return [code, params.utparams];
},
 
getReasons: function (params) {
var reasons = [];
var parameters;
$.each(params.normalizeds, function(index, norm) {
if (Twinkle.speedy.reasonHash[norm]) {
reasons.push(Twinkle.speedy.reasonHash[norm]);
} else {
parameters = params.templateParams[index] || [];
for (var i=0; in i<parameters.length; i++) {
if (typeof parameters[i] === 'string') {
code += "|" + reasons.push(parameters[i]);
}
}
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, parameters));
});
code += "}}";
} else {
parameters = params.templateParams[0] || [];
code = "{{delete";
if (params.values[0] !== 'reason') {
code += '|' + params.values[0];
}
});
for (i in parameters) {
return reasons;
if (typeof parameters[i] === 'string') {
code += "|" + parameters[i];
}
}
code += "}}";
params.utparams = Twinkle.speedy.getUserTalkParameters(params.normalizeds[0], parameters);
}
 
return [code, params.utparams];
},
 
parseWikitext: function(wikitext, callback) {
var query = {
action: "parse",
prop: "text",
pst: "true",
text: wikitext,
contentmodel: "wikitext",
title: mw.config.get("wgPageName")
};
 
var statusIndicator = new Morebits.status( '构造删除理由' );
var api = new Morebits.wiki.api( '解析删除模板', query, function(apiObj) {
var reason = decodeURIComponent($(apiObj.getXML().querySelector('text').childNodes[0].nodeValue).find('#delete-reason').text()).replace(/\+/g, ' ');
if (!reason) {
statusIndicator.warn( '未能从删除模板生成删除理由' );
} else {
statusIndicator.info( '完成' );
}
callback(reason);
}, statusIndicator);
api.post();
},
 
Line 874 ⟶ 688:
 
if (!params.normalizeds.length && params.normalizeds[0] === 'db') {
reason = prompt("输入除理由:", "");
Twinkle.speedy.callbacks.sysop.deletePage( reason, params );
} else {
var code = Twinkle.speedy.callbacks.getTemplateCodeAndParamssysop.deletePage(Twinkle.speedy.callbacks.getReasons(params).join(';'), params)[0];
Twinkle.speedy.callbacks.parseWikitext(code, function(reason) {
if (params.promptForSummary) {
reason = prompt("输入删除理由,或点击确定以接受自动生成的:", presetReason);
}
Twinkle.speedy.callbacks.sysop.deletePage( reason, params );
});
}
},
deletePage: function( reason, params ) {
var thispage = new Morebits.wiki.page( mw.config.get('wgPageName'), "面" );
 
if (reason === null) {
return Morebits.status.error("询问詢問理由", "用取消操作。");
} else if (!reason || !reason.replace(/^\s*/, "").replace(/\s*$/, "")) {
return Morebits.status.error("询问詢問理由", "你不我理由…我就…不管了…");
}
thispage.setEditSummary( reason + Twinkle.getPref('deletionSummaryAd') );
 
thispage.deletePage(function() {
if (params.movetodraft) {
thispage.getStatusElement().info("完成");
thispage.setMoveTalkPage(true);
Twinkle.speedy.callbacks.sysop.deleteTalk( params );
thispage.setMoveSuppressRedirect(true);
});
thispage.setMoveDestination('稿:' + mw.config.get('wgPageName'));
thispage.move(function() {
thispage.getStatusElement().info("完成");
Twinkle.speedy.callbacks.sysop.deleteRedirects( params );
});
} else {
thispage.deletePage(function() {
thispage.getStatusElement().info("完成");
Twinkle.speedy.callbacks.sysop.deleteTalk( params );
});
}
 
 
// look up initial contributor. If prompting user for deletion reason, just display a link.
Line 910 ⟶ 730:
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'f7g1' &&
params.normalized !== 'o1' &&
document.getElementById( 'ca-talk' ).className !== 'new') {
var talkpage = new Morebits.wiki.page( Morebits.wikipedia.namespaces[ mw.config.get('wgNamespaceNumber') + 1 ] + ':' + mw.config.get('wgTitle'), "讨论页討論頁" );
talkpage.setEditSummary('[[WP:CSD#G15|G15]]: 立页面: 頁:删除页面“刪「' + Morebits.pageNameNorm + "”的讨论页」,去其議論頁" + Twinkle.getPref('deletionSummaryAd'));
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
Line 932 ⟶ 751:
'rdlimit': 5000 // 500 is max for normal users, 5000 for bots and sysops
};
var wikipedia_api = new Morebits.wiki.api( '取得重定向列表清單…', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain,
new Morebits.status( '除重定向' ) );
wikipedia_api.params = params;
wikipedia_api.post();
}
 
// promptpromote forUnlink protect on G11tool
var $link, $bigtext;
if (params.normalized === 'g11') {
$link = $('<a/>', {
'href': '#',
'text': '点击这里施行保护',
'css': { 'fontSize': '130%', 'fontWeight': 'bold' },
'click': function(){
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
mw.config.set('wgArticleId', 0);
Twinkle.protect.callback();
}
});
$bigtext = $('<span/>', {
'text': '白纸保护该页',
'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
});
Morebits.status.info($bigtext[0], $link[0]);
}
 
$link = $('<a/>', {
// promote Unlink tool
'href': '#',
var $link, $bigtext;
'text': '點選這里前往反連工具',
if( mw.config.get('wgNamespaceNumber') === 6 && params.normalized !== 'f7' ) {
$link'css': ={ $('<a/>fontWeight',: {'bold' },
'hrefclick': '#',function(){
Morebits.wiki.actionCompleted.redirect = null;
'text': '点击这里前往反链工具',
Twinkle.speedy.dialog.close();
'css': { 'fontWeight': 'bold' },
Twinkle.unlink.callback("取消對已刪除頁面 " + Morebits.pageNameNorm + " 的連結");
'click': function(){
}
Morebits.wiki.actionCompleted.redirect = null;
});
Twinkle.speedy.dialog.close();
$bigtext = $('<span/>', {
Twinkle.unlink.callback("取消对已删除文件 " + Morebits.pageNameNorm + " 的使用");
'text': '取消對已刪除頁面的連結',
}
'css': { 'fontWeight': 'bold' }
});
});
$bigtext = $('<span/>', {
Morebits.status.info($bigtext[0], $link[0]);
'text': '取消对已删除文件的使用',
'css': { 'fontWeight': 'bold' }
});
Morebits.status.info($bigtext[0], $link[0]);
} else if (params.normalized !== 'f7') {
$link = $('<a/>', {
'href': '#',
'text': '点击这里前往反链工具',
'css': { 'fontWeight': 'bold' },
'click': function(){
Morebits.wiki.actionCompleted.redirect = null;
Twinkle.speedy.dialog.close();
Twinkle.unlink.callback("取消对已删除页面 " + Morebits.pageNameNorm + " 的链接");
}
});
$bigtext = $('<span/>', {
'text': '取消对已删除页面的链接',
'css': { 'fontWeight': 'bold' }
});
Morebits.status.info($bigtext[0], $link[0]);
}
},
openUserTalkPage: function( pageobj ) {
Line 1,012 ⟶ 793:
$link = $('<a/>', {
'href': mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ),
'text': '此打User talk:' + user,
'target': '_blank',
'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
});
$bigtext = $('<span/>', {
'text': '通知者',
'css': { 'fontSize': '130%', 'fontWeight': 'bold' }
});
Line 1,023 ⟶ 804:
} else {
// open the initial contributor's talk page
var statusIndicator = new Morebits.status('打' + user + '对话页编辑對話頁編輯表单', '打中…');
 
switch( Twinkle.getPref('userTalkPageMode') ) {
Line 1,051 ⟶ 832:
 
if( !total ) {
statusIndicator.status("未现重定向");
return;
}
Line 1,072 ⟶ 853:
$snapshot.each(function(key, value) {
var title = $(value).attr('title');
var page = new Morebits.wiki.page(title, '除重定向 "' + title + '"');
page.setEditSummary('[[WP:CSD#G15|G15]]: 立页面: 重定向到頁:渡至删除页面“刪頁「' + Morebits.pageNameNorm + "" + Twinkle.getPref('deletionSummaryAd'));
page.deletePage(onsuccess);
});
Line 1,084 ⟶ 865:
 
if (!pageobj.exists()) {
statelem.error( "面不存在,可能已被除" );
return;
}
Line 1,091 ⟶ 872:
var params = pageobj.getCallbackParameters();
 
statelem.status( '面已有标记標記…' );
 
// check for existing deletion tags
var tag = /(?:\{\{\s*(db|d|delete|db-.*?)(?:\s*\||\s*\}\}))/i.exec( text );
if ( tag ) {
statelem.error( [ Morebits.htmlNode( 'strong', tag[1] ) , " 已于页於頁面中。" ] );
return;
}
 
var copyvioxfd = /(?:\{\{\s*(copyvioafd|議刪)[^{}]*?\}\})/i.exec( text );
if ( xfd && !confirm( "刪除相關模板{{" + xfd[1] + "}}已被置於頁面中,您是否仍想添加一個快速刪除模板?" ) ) {
if ( copyvio ) {
statelem.error( '有版权验证模板被提交至存废討論。' );
return;
}
 
var xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec( text );
if ( xfd && !confirm( "删除相关模板{{" + xfd[1] + "}}已被置于页面中,您是否仍想添加一个快速删除模板?" ) ) {
statelem.error( '页面已被提交至存废讨论。' );
return;
}
Line 1,128 ⟶ 903:
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = "<noinclude>" + code + "</noinclude>";
}
 
// Remove tags that become superfluous with this action
text = text.replace(/\{\{\s*([Nn]ew unreviewed article|[Uu]nreviewed|[Uu]serspace draft)\s*(\|(?:\{\{[^{}]*\}\}|[^{}])*)?\}\}\s*/g, "");
if (mw.config.get('wgNamespaceNumber') === 6) {
// remove "move to Commons" tag - deletion-tagged files cannot be moved to Commons
text = text.replace(/\{\{(mtc|(copy |move )?to ?commons|move to wikimedia commons|copy to wikimedia commons)[^}]*\}\}/gi, "");
}
 
// Generate edit summary for edit
var editsummary = '提速刪:' + Twinkle.speedy.callbacks.getReasons(params);
if (params.normalizeds.length > 1) {
editsummary = '请求快速删除(';
$.each(params.normalizeds, function(index, norm) {
editsummary += '[[WP:CSD#' + norm.toUpperCase() + '|CSD ' + norm.toUpperCase() + ']]、';
});
editsummary = editsummary.substr(0, editsummary.length - 1); // remove trailing comma
editsummary += ')。';
} else if (params.normalizeds[0] === "db") {
editsummary = '请求[[WP:CSD|快速删除]]:' + params.templateParams[0]["1"];
} else {
editsummary = "请求快速删除([[WP:CSD#" + params.normalizeds[0].toUpperCase() + "|CSD " + params.normalizeds[0].toUpperCase() + "]])";
}
 
pageobj.setPageText(code + "\n" + text);
Line 1,169 ⟶ 925:
// disallow warning yourself
if (initialContrib === mw.config.get('wgUserName')) {
Morebits.status.warn("您(" + initialContrib + ")该页該頁,跳通知");
 
// don't notify users when their user talk page is nominated
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) {
Morebits.status.warn("通知者:用户创了自己的对话页對話頁");
 
} else {
var talkPageName = 'User talk:' + initialContrib;
var usertalkpage = new Morebits.wiki.flow.checkpage(talkPageName, function"通知頁面建立者(" ()+ {initialContrib + ")"),
var flowpage = new Morebits.wiki.flow(talkPageName, "通知页面创建者(" + initialContrib + ")");
flowpage.setTopic('[[:' + Morebits.pageNameNorm + ']]的快速删除通知');
flowpage.setContent('{{subst:User:逆襲的天邪鬼/Twinkle/Template:Db-notice|target=' + Morebits.pageNameNorm + '|flow=yes}}');
flowpage.newTopic();
}, function() {
var usertalkpage = new Morebits.wiki.page(talkPageName, "通知页面创建者(" + initialContrib + ")"),
notifytext, i;
 
notifytext = "\n{{subst:User:逆襲的天邪鬼/Twinkle/Template:Dbdb-notice|target=" + Morebits.pageNameNorm;
notifytext += (params.welcomeuser ? "" : "|nowelcome=yes") + "}}--~~~~";
 
var editsummary = "通知:";
editsummary += "頁[[" + Morebits.pageNameNorm + "]]將刪";
if (params.normalizeds.indexOf("g12") === -1) { // no article name in summary for G10 deletions
editsummary += "页面[[" + Morebits.pageNameNorm + "]]";
} else {
editsummary += "一攻击性页面";
}
editsummary += "快速删除提名";
 
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
usertalkpage.setCreateOption('recreate');
usertalkpage.setFollowRedirect(true);
usertalkpage.append();
});
}
 
Line 1,224 ⟶ 968:
// for DI: params.fromDI = true, params.templatename, params.normalized (note: normalized is a string)
addToLog: function(params, initialContrib) {
var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('speedyLogPageName'), "添加目到用");
params.logInitialContrib = initialContrib;
wikipedia_page.setCallbackParameters(params);
Line 1,239 ⟶ 983:
if (!pageobj.exists()) {
appendText +=
"使用[[WP:TW|Twinkle]]的速做出的[[WP:CSD|快删除]]提名列表清單。\n\n" +
"如果您不再想保留此日在[[Wikipedia:Twinkle/参数设置偏好設定|参数设置偏好設定]]中掉," +
"使用[[WP:CSD#O1|CSD O1]]提交删除。\n";
if (Morebits.userIsInGroup("sysop")) {
appendText += "\n此日并不录用Twinkle直接执行的除。\n";
}
}
Line 1,255 ⟶ 999:
 
appendText += "\n# [[:" + Morebits.pageNameNorm + "]]: ";
appendText += Twinkle.speedy.callbacks.getReasons(params);
if (params.fromDI) {
appendText += "图版[[WP:CSD#" + params.normalized.toUpperCase() + "|CSD " + params.normalized.toUpperCase() + "]]({{tl|" + params.templatename + "}})";
} else {
if (params.normalizeds.length > 1) {
appendText += "多个理由(";
$.each(params.normalizeds, function(index, norm) {
appendText += "[[WP:CSD#" + norm.toUpperCase() + "|" + norm.toUpperCase() + ']]、';
});
appendText = appendText.substr(0, appendText.length - 1); // remove trailing comma
appendText += ')';
} else if (params.normalizeds[0] === "db") {
appendText += "自定义理由";
} else {
appendText += "[[WP:CSD#" + params.normalizeds[0].toUpperCase() + "|CSD " + params.normalizeds[0].toUpperCase() + "]]";
}
}
 
if (params.logInitialContrib) {
Line 1,278 ⟶ 1,007:
 
pageobj.setAppendText(appendText);
pageobj.setEditSummary("记录对錄速刪誌:[[" + Morebits.pageNameNorm + "]]的快速删除提名" + Twinkle.getPref('summaryAd'));
pageobj.setCreateOption("recreate");
pageobj.append();
Line 1,296 ⟶ 1,025:
var dbrationale = form["csd.reason_1"].value;
if (!dbrationale || !dbrationale.trim()) {
alert( '自定理由:指定理由。' );
parameters = null;
return false;
}
currentParams["1"] = dbrationale;
}
break;
 
case 'a5':
if (form["csd.a5_pagename"]) {
var otherpage = form["csd.a5_pagename"].value;
if (!otherpage || !otherpage.trim()) {
alert( 'CSD A5:请提供现有条目的名称。' );
parameters = null;
return false;
}
currentParams.pagename = otherpage;
}
break;
 
case 'g5':
if (form["csd.g5_1"]) {
var deldisc = form["csd.g5_1"].value;
if (deldisc) {
if (deldisc.substring(0, 9) !== "Wikipedia" &&
deldisc.substring(0, 3) !== "WP:" &&
deldisc.substring(0, 5) !== "维基百科:" &&
deldisc.substring(0, 5) !== "維基百科:") {
alert( 'CSD G5:您提供的讨论页名必须以“Wikipedia:”开头。' );
parameters = null;
return false;
}
currentParams["1"] = deldisc;
}
}
break;
 
case 'g10':
if (form["csd.g10_rationale"] && form["csd.g10_rationale"].value) {
currentParams.rationale = form["csd.g10_rationale"].value;
}
break;
 
case 'f1':
if (form["csd.f1_filename"]) {
var redimage = form["csd.f1_filename"].value;
if (!redimage || !redimage.trim()) {
alert( 'CSD F1:请提供另一文件的名称。' );
parameters = null;
return false;
}
currentParams.filename = redimage.replace(/^\s*(Image|File|文件|檔案):/i, "");
}
break;
 
case 'f5':
if (form["csd.f5_filename"]) {
var redimage = form["csd.f5_filename"].value;
if (!redimage || !redimage.trim()) {
alert( 'CSD F5:请提供另一文件的名称。' );
parameters = null;
return false;
}
currentParams.filename = redimage.replace(/^\s*(Image|File|文件|檔案):/i, "");
}
break;
 
case 'f7':
if (form["csd.f7_filename"]) {
var filename = form["csd.f7_filename"].value;
if (filename && filename !== Morebits.pageNameNorm) {
if (filename.indexOf("Image:") === 0 || filename.indexOf("File:") === 0 ||
filename.indexOf("文件:") === 0 || filename.indexOf("檔案:") === 0) {
currentParams["1"] = filename;
} else {
currentParams["1"] = "File:" + filename;
}
}
}
break;
 
case 'r3':
if (form["csd.r3_type"]) {
var redirtype = form["csd.r3_type"].value;
if (!redirtype) {
alert( 'CSD R3:请选择适用类别。' );
parameters = null;
return false;
}
currentParams["1"] = redirtype;
}
break;
Line 1,411 ⟶ 1,055:
var values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert( "请选择請選擇!" );
return null;
}
Line 1,457 ⟶ 1,101:
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
movetodraft: form.movetodraft.checked,
openUserTalk: form.openusertalk.checked,
promptForSummary: promptForSummary,
Line 1,547 ⟶ 1,192:
 
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName');
Morebits.wiki.actionCompleted.notice = "标记標記完成";
 
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "标记页標記頁面");
wikipedia_page.setCallbackParameters(params);
wikipedia_page.load(Twinkle.speedy.callbacks.user.main);