User:逆襲的天邪鬼/Twinkle-lzh/twinklespeedy.js: Difference between revisions
< User:逆襲的天邪鬼 | Twinkle-lzh
Content added Content deleted
(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: | Line 26: | ||
// * Flow pages |
// * Flow pages |
||
// * non-existent pages |
// * non-existent pages |
||
if (mw.config.get('wgNamespaceNumber') < 0 |
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) { |
||
return; |
return; |
||
} |
} |
||
Twinkle.addPortletLink( Twinkle.speedy.callback, "速 |
Twinkle.addPortletLink( Twinkle.speedy.callback, "速刪", "tw-csd", Morebits.userIsInGroup('sysop') ? "快速刪除" : "請求快速刪除" ); |
||
}; |
}; |
||
Line 83: | Line 83: | ||
Twinkle.speedy.dialog = new Morebits.simpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') ); |
Twinkle.speedy.dialog = new Morebits.simpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') ); |
||
dialog = Twinkle.speedy.dialog; |
dialog = Twinkle.speedy.dialog; |
||
dialog.setTitle( " |
dialog.setTitle( "選擇快速刪除理由" ); |
||
dialog.setScriptName( "Twinkle" ); |
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) ); |
var form = new Morebits.quickForm( callbackfunc, (Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null) ); |
||
Line 94: | Line 92: | ||
list: [ |
list: [ |
||
{ |
{ |
||
label: '只 |
label: '只標記,不刪除', |
||
value: 'tag_only', |
value: 'tag_only', |
||
name: 'tag_only', |
name: 'tag_only', |
||
tooltip: '如果您只想 |
tooltip: '如果您只想標記此頁面而不是刪除', |
||
checked : Twinkle.getPref('deleteSysopDefaultToTag'), |
checked : Twinkle.getPref('deleteSysopDefaultToTag'), |
||
event: function( event ) { |
event: function( event ) { |
||
Line 138: | Line 136: | ||
deleteOptions.append( { |
deleteOptions.append( { |
||
type: 'header', |
type: 'header', |
||
label: ' |
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 |
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: | Line 143: | ||
list: [ |
list: [ |
||
{ |
{ |
||
label: ' |
label: '刪除討論頁', |
||
value: 'talkpage', |
value: 'talkpage', |
||
name: 'talkpage', |
name: 'talkpage', |
||
tooltip: " |
tooltip: "刪除時附带刪除此頁面的討論頁。", |
||
checked: Twinkle.getPref('deleteTalkPageOnDelete'), |
checked: Twinkle.getPref('deleteTalkPageOnDelete'), |
||
disabled: Twinkle.getPref('deleteSysopDefaultToTag'), |
disabled: Twinkle.getPref('deleteSysopDefaultToTag'), |
||
Line 158: | Line 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( { |
deleteOptions.append( { |
||
type: 'checkbox', |
type: 'checkbox', |
||
list: [ |
list: [ |
||
{ |
{ |
||
label: ' |
label: '刪除重定向', |
||
value: 'redirects', |
value: 'redirects', |
||
name: 'redirects', |
name: 'redirects', |
||
tooltip: " |
tooltip: "刪除到此頁的重定向。", |
||
checked: Twinkle.getPref('deleteRedirectsOnDelete'), |
checked: Twinkle.getPref('deleteRedirectsOnDelete'), |
||
disabled: Twinkle.getPref('deleteSysopDefaultToTag'), |
disabled: Twinkle.getPref('deleteSysopDefaultToTag'), |
||
Line 178: | Line 193: | ||
list: [ |
list: [ |
||
{ |
{ |
||
label: ' |
label: '應用多個理由刪除', |
||
value: 'delmultiple', |
value: 'delmultiple', |
||
name: 'delmultiple', |
name: 'delmultiple', |
||
tooltip: "您可 |
tooltip: "您可選擇應用於該頁的多個理由。", |
||
event: function( event ) { |
event: function( event ) { |
||
Twinkle.speedy.callback.modeChanged( event.target.form ); |
Twinkle.speedy.callback.modeChanged( event.target.form ); |
||
Line 193: | Line 208: | ||
list: [ |
list: [ |
||
{ |
{ |
||
label: ' |
label: '開啟用戶對話頁', |
||
value: 'openusertalk', |
value: 'openusertalk', |
||
name: 'openusertalk', |
name: 'openusertalk', |
||
tooltip: '此 |
tooltip: '此項的預設值為您的開啟對話頁設定。在您選擇應用多條理由刪除時此項將保持不變。', |
||
checked : false |
checked : false |
||
} |
} |
||
Line 211: | Line 226: | ||
tagOptions.append( { |
tagOptions.append( { |
||
type: 'header', |
type: 'header', |
||
label: ' |
label: '標記相關选項' |
||
} ); |
} ); |
||
} |
} |
||
Line 219: | Line 234: | ||
list: [ |
list: [ |
||
{ |
{ |
||
label: '如可能,通知 |
label: '如可能,通知建立者', |
||
value: 'notify', |
value: 'notify', |
||
name: 'notify', |
name: 'notify', |
||
tooltip: "一 |
tooltip: "如果您啟用了該理據的通知,一個通知模板將會加入到建立者的對話頁。", |
||
checked: !Morebits.userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'), |
checked: !Morebits.userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'), |
||
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'), |
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'), |
||
Line 235: | Line 250: | ||
list: [ |
list: [ |
||
{ |
{ |
||
label: ' |
label: '應用多個理由', |
||
value: 'multiple', |
value: 'multiple', |
||
name: 'multiple', |
name: 'multiple', |
||
tooltip: "您可 |
tooltip: "您可選擇應用於該頁的多個理由。", |
||
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'), |
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'), |
||
event: function( event ) { |
event: function( event ) { |
||
Line 251: | Line 266: | ||
type: 'div', |
type: 'div', |
||
name: 'work_area', |
name: 'work_area', |
||
label: '初始化CSD模 |
label: '初始化CSD模組失敗,請重試,或將這報告給Twinkle開發者。' |
||
} ); |
} ); |
||
Line 324: | Line 339: | ||
work_area.append( { |
work_area.append( { |
||
type: 'div', |
type: 'div', |
||
label: ' |
label: '當選擇完成後,點選:' |
||
} ); |
} ); |
||
work_area.append( { |
work_area.append( { |
||
Line 339: | Line 354: | ||
var radioOrCheckbox = (Twinkle.speedy.mode.isMultiple(mode) ? 'checkbox' : 'radio'); |
var radioOrCheckbox = (Twinkle.speedy.mode.isMultiple(mode) ? 'checkbox' : 'radio'); |
||
if (Twinkle.speedy.mode.isSysop(mode) && !Twinkle.speedy.mode.isMultiple(mode)) { |
// if (Twinkle.speedy.mode.isSysop(mode) && !Twinkle.speedy.mode.isMultiple(mode)) { |
||
work_area.append( { type: 'header', label: '自定 |
work_area.append( { type: 'header', label: '自定義理由' } ); |
||
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.customRationale, mode) } ); |
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.customRationale, mode) } ); |
||
} |
// } |
||
switch (namespace) { |
switch (namespace) { |
||
case 0: // article |
case 0: // article |
||
work_area.append( { type: 'header', label: ' |
work_area.append( { type: 'header', label: '條目' } ); |
||
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.articleList, mode) } ); |
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.articleList, mode) } ); |
||
break; |
break; |
||
/* |
|||
case 2: // user |
case 2: // user |
||
case 3: // user talk |
case 3: // user talk |
||
work_area.append( { type: 'header', label: '用 |
work_area.append( { type: 'header', label: '用戶頁' } ); |
||
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.userList, mode) } ); |
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.userList, mode) } ); |
||
break; |
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 |
case 14: // category |
||
work_area.append( { type: 'header', label: '分 |
work_area.append( { type: 'header', label: '分類' } ); |
||
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode) } ); |
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode) } ); |
||
break; |
break; |
||
Line 375: | Line 384: | ||
// custom rationale lives under general criteria when tagging |
// custom rationale lives under general criteria when tagging |
||
var generalCriteria = Twinkle.speedy.generalList; |
var generalCriteria = Twinkle.speedy.generalList; |
||
if(!Twinkle.speedy.mode.isSysop(mode)) { |
// if (!Twinkle.speedy.mode.isSysop(mode)) { |
||
// generalCriteria = Twinkle.speedy.customRationale.concat(generalCriteria); |
|||
} |
// } |
||
work_area.append( { type: 'header', label: '常 |
work_area.append( { type: 'header', label: '常規' } ); |
||
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(generalCriteria, mode) }); |
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')) { |
if (mw.config.get('wgIsRedirect') || Morebits.userIsInGroup('sysop')) { |
||
Line 417: | Line 423: | ||
return $.map(list, function(critElement) { |
return $.map(list, function(critElement) { |
||
var criterion = $.extend({}, 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) { |
if (multiple) { |
||
Line 503: | Line 504: | ||
Twinkle.speedy.customRationale = [ |
Twinkle.speedy.customRationale = [ |
||
{ |
{ |
||
label: '自定 |
label: '自定義理由' + (Morebits.userIsInGroup('sysop') ? '(自定義刪除理由)' : ''), |
||
value: 'reason', |
value: 'reason', |
||
tooltip: '這不是萬能的刪除理由,只適用於該頁及其歷史版本均明顯不應存在於維基大典的情況。', |
|||
tooltip: '该页至少应该符合一条快速删除的标准,并且您必须在理由中提到。这不是万能的删除理由。', |
|||
subgroup: { |
subgroup: { |
||
name: 'reason_1', |
name: 'reason_1', |
||
Line 512: | Line 513: | ||
size: 60 |
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: | Line 518: | ||
Twinkle.speedy.articleList = [ |
Twinkle.speedy.articleList = [ |
||
{ |
{ |
||
label: ' |
label: '非文言', |
||
value: 'a1', |
value: 'a1', |
||
tooltip: '條目根本不是文言文,只有完全重寫才能解決問題。文白相雜請改用{{文白相雜|~~~~~}}。如果作者有改善意願,建議移至草稿。' |
|||
tooltip: '例如:“他是一个很有趣的人,他创建了工厂和庄园。并且,顺便提一下,他的妻子也很好。”如果能够发现任何相关的内容,可以将这个页面重定向到相关的条目上。' |
|||
}, |
}, |
||
{ |
{ |
||
label: '極短且不知所云', |
|||
label: 'A2: 内容只包括外部连接、参见、图书参考、类别标签、模板标签、跨语言连接的条目。', |
|||
value: 'a2', |
value: 'a2', |
||
tooltip: '只用於非常短,而且明顯看不出主題的條目。' |
|||
tooltip: '请注意:有些维基人创建条目时会分开多次保存,请避免删除有人正在工作的页面。带有{{inuse}}的不适用。' |
|||
}, |
}, |
||
{ |
{ |
||
label: '文白相雜且未斧正', |
|||
label: 'A3: 复制自其他中文维基计划,或是与其他中文维基计划内容相同的文章。', |
|||
value: 'a3' |
value: 'a3', |
||
tooltip: '條目文白相雜,等了一個月之後內容仍未改善。建議將這種頁面移到草稿而不是刪除。', |
|||
hideWhenUser: true |
|||
}, |
}, |
||
{ |
{ |
||
label: '生不立傳', |
|||
label: 'A5: 条目建立时之内容即与其他现有条目内容完全相同,且名称不适合做为其他条目之重定向。', |
|||
value: ' |
value: 'a4' |
||
tooltip: '条目被建立时,第一个版本的内容与当时其他现存条目完全相同,且这个条目的名称不适合改为重定向,就可以提送快速删除。如果名称可以作为重定向,就应直接改重定向,不要提送快速删除。如果是多个条目合并产生的新条目,不适用。如果是从主条目拆分产生的条目,不适用;如有疑虑,应提送存废讨论处理。', |
|||
subgroup: { |
|||
name: 'a5_pagename', |
|||
type: 'input', |
|||
label: '现有条目名:', |
|||
size: 60 |
|||
} |
|||
}, |
}, |
||
{ |
|||
label: 'A6: 复制自其他维基百科语言版本,且完全没有翻译。', |
|||
value: 'a6', |
|||
tooltip: '如果并不是复制于任何其他的维基百科语言版本,请换用{{notmandarin}}。带有{{inuse}}和{{translating}}模板的不适用。' |
|||
} |
|||
]; |
]; |
||
Twinkle.speedy.categoryList = [ |
Twinkle.speedy.categoryList = [ |
||
{ |
{ |
||
label: ' |
label: '空類', |
||
value: ' |
value: 'c1', |
||
tooltip: '不 |
tooltip: '不適用於維護大典性質的分類。' |
||
} |
|||
]; |
|||
Twinkle.speedy.userList = [ |
|||
{ |
|||
label: 'O1: 用户请求删除自己的用户页或其子页面。', |
|||
value: 'o1', |
|||
tooltip: '如果是从其他名字空间移动来的,须附有合理原因。' |
|||
}, |
|||
{ |
|||
label: 'O3: 匿名用户的用户讨论页,其中的内容不再有用。', |
|||
value: 'o3', |
|||
tooltip: '避免给使用同一IP地址的用户带来混淆。不适用于用户讨论页的存盘页面。' |
|||
} |
} |
||
]; |
]; |
||
Line 621: | Line 549: | ||
Twinkle.speedy.generalList = [ |
Twinkle.speedy.generalList = [ |
||
{ |
{ |
||
label: ' |
label: '作者請求 / 去己齋', |
||
value: 'g1', |
value: 'g1', |
||
tooltip: '注意:應該只用於頁面作者唯一或實質貢獻者唯一的情況,因此用戶討論頁通常不適用刪除。' |
|||
tooltip: '如“adfasddd”。参见Wikipedia:胡言乱语。但注意:图片也算是内容。' |
|||
}, |
}, |
||
{ |
{ |
||
label: ' |
label: '毀我大典', |
||
value: ' |
value: 'g3', |
||
tooltip: '例如:“这是一个测试。”' |
|||
}, |
}, |
||
{ |
{ |
||
label: '廣告宣傳', |
|||
label: 'G3: 纯粹破坏,包括但不限于明显的恶作剧、错误信息、人身攻击等', |
|||
value: ' |
value: 'g4', |
||
tooltip: '明顯的廣告宣傳,唯有全部重寫才能改善內容,或者無法按大典要求重寫。' |
|||
tooltip: '包括明显的错误信息、明显的恶作剧、信息明显错误的图片,以及清理移动破坏时留下的重定向。' |
|||
}, |
}, |
||
{ |
{ |
||
label: '試筆', |
|||
label: 'G5: 曾经根据页面存废讨论、侵权审核或文件存废讨论结果删除后又重新创建的内容,而有关内容与已删除版本相同或非常相似,无论标题是否相同', |
|||
value: 'g5', |
value: 'g5', |
||
tooltip: '測試性質的頁面', |
|||
tooltip: '该内容之前必须是经存废讨论删除,如之前属于快速删除,请以相同理由重新提送快速删除。该内容如与被删除的版本明显不同,而提删者认为需要删除,请交到存废讨论,如果提删者对此不肯定,请先联络上次执行删除的管理人员。不适用于根据存废复核结果被恢复的内容。在某些情况下,重新创建的条目有机会发展。那么不应提交快速删除,而应该提交存废复核或存废讨论重新评核。', |
|||
subgroup: { |
|||
name: 'g5_1', |
|||
type: 'input', |
|||
label: '删除讨论位置:', |
|||
tooltip: '必须以“Wikipedia:”开头', |
|||
size: 60 |
|||
}, |
|||
hideSubgroupWhenMultiple: true |
|||
}, |
}, |
||
{ |
{ |
||
label: ' |
label: '孤頁', |
||
value: ' |
value: 'g7', |
||
tooltip: '例如以下几种類型:1. 没有對應檔案的檔案頁面;2. 没有對應母頁面的子頁面,用戶頁子頁面除外;3. 指向不存在頁面的重定向;4. 没有對應内容頁面的討論頁,討論頁存档和用戶討論頁除外;5. 不存在注册用戶的用戶頁及用戶頁子頁面,随用戶更名产生的用戶頁重定向除外。請在刪除時注意有无將内容移至他处的必要。不包括在主頁面挂有{{CSD Placeholder}}模板的討論頁。' |
|||
tooltip: '包括解封用户后删除用户页、因用户夺取而删除、删除MediaWiki页面、因移动请求而删除页面。', |
|||
hideWhenUser: true |
|||
}, |
}, |
||
{ |
{ |
||
label: '大典維護', |
|||
label: 'G10: 原作者清空页面或提出删除,且贡献者只有一人', |
|||
value: ' |
value: 'g8', |
||
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 |
hideWhenUser: true |
||
}, |
}, |
||
{ |
|||
label: 'G15: 孤立页面,比如没有主页面的讨论页、指向空页面的重定向等', |
|||
value: 'g15', |
|||
tooltip: '包括以下几种类型:1. 没有对应文件的文件页面;2. 没有对应母页面的子页面,用户页子页面除外;3. 指向不存在页面的重定向;4. 没有对应内容页面的讨论页,讨论页存档和用户讨论页除外;5. 不存在注册用户的用户页及用户页子页面,随用户更名产生的用户页重定向除外。请在删除时注意有无将内容移至他处的必要。不包括在主页面挂有{{CSD Placeholder}}模板的讨论页。' |
|||
}, |
|||
{ |
|||
label: 'G16: 因为主页面侵权而创建的临时页面仍然侵权', |
|||
value: 'g16', |
|||
hideWhenUser: true |
|||
} |
|||
]; |
]; |
||
Twinkle.speedy.redirectArticleList = [ |
Twinkle.speedy.redirectArticleList = [ |
||
{ |
{ |
||
label: ' |
label: '條目渡至非條目', |
||
value: ' |
value: 'r3', |
||
tooltip: '由 |
tooltip: '由條目的名字空间重定向至非條目名字空间,或將用戶頁移出條目名字空间時遗留的重定向。' |
||
}, |
|||
{ |
|||
label: '簡化字文題', |
|||
value: 'r4', |
|||
tooltip: '條目以簡化字為題。如果不是重定向頁,需先移動到合適的標題然後再提刪。' |
|||
} |
} |
||
]; |
]; |
||
Line 709: | Line 595: | ||
Twinkle.speedy.redirectList = [ |
Twinkle.speedy.redirectList = [ |
||
{ |
{ |
||
label: ' |
label: '斷渡或窮渡', |
||
value: ' |
value: 'r1', |
||
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: ' |
value: 'r2', |
||
tooltip: '非一眼能看出的拼寫錯誤和翻譯或標题用字的爭議應交由議刪處理。', |
|||
tooltip: '如A→B→C→……→A。' |
|||
} |
}, |
||
]; |
]; |
||
Line 739: | Line 610: | ||
'multiple-finish': 'multiple-finish', |
'multiple-finish': 'multiple-finish', |
||
'g1': 'g1', |
'g1': 'g1', |
||
'g2': 'g2', |
|||
'g3': 'g3', |
'g3': 'g3', |
||
'g4': 'g4', |
|||
'g5': 'g5', |
'g5': 'g5', |
||
'g7': 'g7', |
|||
'g8': 'g8', |
'g8': 'g8', |
||
'g10': 'g10', |
|||
'g11': 'g11', |
|||
'g12': 'g12', |
|||
'g13': 'g13', |
|||
'g14': 'g14', |
|||
'g15': 'g15', |
|||
'g16': 'g16', |
|||
'a1': 'a1', |
'a1': 'a1', |
||
'a2': 'a2', |
'a2': 'a2', |
||
'a3': 'a3', |
'a3': 'a3', |
||
' |
'a4': 'a4', |
||
'r1': 'r1', |
|||
'r2': 'r2', |
|||
'r3': 'r3', |
|||
'r4': 'r4', |
|||
' |
'c1': 'c1', |
||
'f3': 'f3', |
|||
'f4': 'f4', |
|||
'f5': 'f5', |
|||
'f6': 'f6', |
|||
'f7': 'f7', |
|||
'o1': 'o1', |
|||
'o3': 'o3', |
|||
'o4': 'o4' |
|||
}; |
}; |
||
Line 773: | Line 630: | ||
'reason': '', |
'reason': '', |
||
// General |
// General |
||
'g1': ' |
'g1': '作者請求', |
||
' |
'g3': '毀我大典', |
||
' |
'g4': '廣告宣傳', |
||
'g5': '試筆', |
|||
'g5': '曾经依存废讨论被删除的重建内容', |
|||
' |
'g7': '孤頁', |
||
' |
'g8': '大典維護', |
||
'g11': '广告或宣传', |
|||
'g12': '未列明来源或违反生者传记的负面内容', |
|||
'g13': '明显且拙劣的机器翻译', |
|||
'g14': '超过两周没有翻译的非现代标准汉语页面', |
|||
'g15': '孤立页面', |
|||
'g16': '临时页面依然侵权', |
|||
// Articles |
// Articles |
||
'a1': '非 |
'a1': '非文言', |
||
'a2': '極短且不知所云', |
|||
'a2': '内容只包含参考、链接、模板或/及分类', |
|||
'a3': ' |
'a3': '文白相雜且未斧正', |
||
'a4': '生不立傳', |
|||
'a5': '条目建立时之内容即与其他现有条目内容相同', |
|||
'a6': '复制自其他维基百科语言版本', |
|||
// Redirects |
// Redirects |
||
' |
'r1': '斷渡或窮渡', |
||
' |
'r2': '筆誤', |
||
'r3': '條目渡至非條目', |
|||
'r5': '指向本身的重定向或循环的重定向', |
|||
'r4': '簡化字文題', |
|||
// Images and media |
|||
'f1': '重复的图片', |
|||
'f3': '[[:Category:未知版权的档案]]', |
|||
'f4': '[[:Category:來源不明檔案]]', |
|||
'f5': '已有高分辨率的图片取代', |
|||
'f6': '孤立而没有被条目使用的非自由版权图片', |
|||
'f7': '[[:Category:与维基共享资源重复的档案]]', |
|||
// User pages |
|||
'o1': '用户请求删除自己的用户页或其子页面', |
|||
'o3': '匿名用户的讨论页', |
|||
// Categories |
// Categories |
||
' |
'c1': '空類' |
||
// Templates |
// Templates |
||
// Portals |
// Portals |
||
Line 813: | Line 654: | ||
Twinkle.speedy.callbacks = { |
Twinkle.speedy.callbacks = { |
||
getTemplateCodeAndParams: function(params) { |
getTemplateCodeAndParams: function(params) { |
||
var code |
var code = "{{刪|"; |
||
var reasons = Twinkle.speedy.callbacks.getReasons(params); |
|||
if (params.normalizeds.length > 1) { |
|||
params.utparams = {}; |
|||
$.each(params.normalizeds, 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] || []; |
parameters = params.templateParams[index] || []; |
||
for (var i |
for (var i=0; i<parameters.length; i++) { |
||
if (typeof parameters[i] === 'string') { |
if (typeof parameters[i] === 'string') { |
||
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: | Line 688: | ||
if (!params.normalizeds.length && params.normalizeds[0] === 'db') { |
if (!params.normalizeds.length && params.normalizeds[0] === 'db') { |
||
reason = prompt("输入 |
reason = prompt("输入刪除理由:", ""); |
||
Twinkle.speedy.callbacks.sysop.deletePage( reason, params ); |
Twinkle.speedy.callbacks.sysop.deletePage( reason, params ); |
||
} else { |
} else { |
||
Twinkle.speedy.callbacks.sysop.deletePage(Twinkle.speedy.callbacks.getReasons(params).join(';'), params); |
|||
Twinkle.speedy.callbacks.parseWikitext(code, function(reason) { |
|||
if (params.promptForSummary) { |
|||
reason = prompt("输入删除理由,或点击确定以接受自动生成的:", presetReason); |
|||
} |
|||
Twinkle.speedy.callbacks.sysop.deletePage( reason, params ); |
|||
}); |
|||
} |
} |
||
}, |
}, |
||
deletePage: function( reason, params ) { |
deletePage: function( reason, params ) { |
||
var thispage = new Morebits.wiki.page( mw.config.get('wgPageName'), " |
var thispage = new Morebits.wiki.page( mw.config.get('wgPageName'), "刪除頁面" ); |
||
if (reason === null) { |
if (reason === null) { |
||
return Morebits.status.error(" |
return Morebits.status.error("詢問理由", "用戶取消操作。"); |
||
} else if (!reason || !reason.replace(/^\s*/, "").replace(/\s*$/, "")) { |
} else if (!reason || !reason.replace(/^\s*/, "").replace(/\s*$/, "")) { |
||
return Morebits.status.error(" |
return Morebits.status.error("詢問理由", "你不給我理由…我就…不管了…"); |
||
} |
} |
||
thispage.setEditSummary( reason + Twinkle.getPref('deletionSummaryAd') ); |
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. |
// look up initial contributor. If prompting user for deletion reason, just display a link. |
||
Line 910: | Line 730: | ||
// delete talk page |
// delete talk page |
||
if (params.deleteTalkPage && |
if (params.deleteTalkPage && |
||
params.normalized !== ' |
params.normalized !== 'g1' && |
||
params.normalized !== 'o1' && |
|||
document.getElementById( 'ca-talk' ).className !== 'new') { |
document.getElementById( 'ca-talk' ).className !== 'new') { |
||
var talkpage = new Morebits.wiki.page( Morebits.wikipedia.namespaces[ mw.config.get('wgNamespaceNumber') + 1 ] + ':' + mw.config.get('wgTitle'), " |
var talkpage = new Morebits.wiki.page( Morebits.wikipedia.namespaces[ mw.config.get('wgNamespaceNumber') + 1 ] + ':' + mw.config.get('wgTitle'), "刪除討論頁" ); |
||
talkpage.setEditSummary(' |
talkpage.setEditSummary('孤頁:已刪「' + Morebits.pageNameNorm + "」,去其議論頁" + Twinkle.getPref('deletionSummaryAd')); |
||
talkpage.deletePage(); |
talkpage.deletePage(); |
||
// this is ugly, but because of the architecture of wiki.api, it is needed |
// this is ugly, but because of the architecture of wiki.api, it is needed |
||
Line 932: | Line 751: | ||
'rdlimit': 5000 // 500 is max for normal users, 5000 for bots and sysops |
'rdlimit': 5000 // 500 is max for normal users, 5000 for bots and sysops |
||
}; |
}; |
||
var wikipedia_api = new Morebits.wiki.api( '取得重定向 |
var wikipedia_api = new Morebits.wiki.api( '取得重定向清單…', query, Twinkle.speedy.callbacks.sysop.deleteRedirectsMain, |
||
new Morebits.status( ' |
new Morebits.status( '刪除重定向' ) ); |
||
wikipedia_api.params = params; |
wikipedia_api.params = params; |
||
wikipedia_api.post(); |
wikipedia_api.post(); |
||
} |
} |
||
// |
// promote Unlink tool |
||
var $link, $bigtext; |
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' ) { |
|||
'css': { 'fontWeight': 'bold' }, |
|||
'click': 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 ) { |
openUserTalkPage: function( pageobj ) { |
||
Line 1,012: | Line 793: | ||
$link = $('<a/>', { |
$link = $('<a/>', { |
||
'href': mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ), |
'href': mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ), |
||
'text': ' |
'text': '點此打開User talk:' + user, |
||
'target': '_blank', |
'target': '_blank', |
||
'css': { 'fontSize': '130%', 'fontWeight': 'bold' } |
'css': { 'fontSize': '130%', 'fontWeight': 'bold' } |
||
}); |
}); |
||
$bigtext = $('<span/>', { |
$bigtext = $('<span/>', { |
||
'text': '通知 |
'text': '通知頁面建立者', |
||
'css': { 'fontSize': '130%', 'fontWeight': 'bold' } |
'css': { 'fontSize': '130%', 'fontWeight': 'bold' } |
||
}); |
}); |
||
Line 1,023: | Line 804: | ||
} else { |
} else { |
||
// open the initial contributor's talk page |
// open the initial contributor's talk page |
||
var statusIndicator = new Morebits.status('打 |
var statusIndicator = new Morebits.status('打開用戶' + user + '對話頁編輯表单', '打開中…'); |
||
switch( Twinkle.getPref('userTalkPageMode') ) { |
switch( Twinkle.getPref('userTalkPageMode') ) { |
||
Line 1,051: | Line 832: | ||
if( !total ) { |
if( !total ) { |
||
statusIndicator.status("未 |
statusIndicator.status("未發现重定向"); |
||
return; |
return; |
||
} |
} |
||
Line 1,072: | Line 853: | ||
$snapshot.each(function(key, value) { |
$snapshot.each(function(key, value) { |
||
var title = $(value).attr('title'); |
var title = $(value).attr('title'); |
||
var page = new Morebits.wiki.page(title, ' |
var page = new Morebits.wiki.page(title, '刪除重定向 "' + title + '"'); |
||
page.setEditSummary(' |
page.setEditSummary('孤頁:渡至已刪頁「' + Morebits.pageNameNorm + "」" + Twinkle.getPref('deletionSummaryAd')); |
||
page.deletePage(onsuccess); |
page.deletePage(onsuccess); |
||
}); |
}); |
||
Line 1,084: | Line 865: | ||
if (!pageobj.exists()) { |
if (!pageobj.exists()) { |
||
statelem.error( " |
statelem.error( "頁面不存在,可能已被刪除" ); |
||
return; |
return; |
||
} |
} |
||
Line 1,091: | Line 872: | ||
var params = pageobj.getCallbackParameters(); |
var params = pageobj.getCallbackParameters(); |
||
statelem.status( ' |
statelem.status( '檢查頁面已有標記…' ); |
||
// check for existing deletion tags |
// check for existing deletion tags |
||
var tag = /(?:\{\{\s*( |
var tag = /(?:\{\{\s*(d|delete|刪)(?:\s*\||\s*\}\}))/i.exec( text ); |
||
if ( tag ) { |
if ( tag ) { |
||
statelem.error( [ Morebits.htmlNode( 'strong', tag[1] ) , " 已 |
statelem.error( [ Morebits.htmlNode( 'strong', tag[1] ) , " 已置於頁面中。" ] ); |
||
return; |
return; |
||
} |
} |
||
var |
var xfd = /(?:\{\{\s*(afd|議刪)[^{}]*?\}\})/i.exec( text ); |
||
if ( xfd && !confirm( "刪除相關模板{{" + xfd[1] + "}}已被置於頁面中,您是否仍想添加一個快速刪除模板?" ) ) { |
|||
if ( copyvio ) { |
|||
statelem.error( ' |
statelem.error( '頁面已被提交至存废討論。' ); |
||
return; |
|||
} |
|||
var xfd = /(?:\{\{([rsaiftcmv]fd|md1|proposed deletion)[^{}]*?\}\})/i.exec( text ); |
|||
if ( xfd && !confirm( "删除相关模板{{" + xfd[1] + "}}已被置于页面中,您是否仍想添加一个快速删除模板?" ) ) { |
|||
statelem.error( '页面已被提交至存废讨论。' ); |
|||
return; |
return; |
||
} |
} |
||
Line 1,128: | Line 903: | ||
if (mw.config.get('wgNamespaceNumber') === 10) { // Template: |
if (mw.config.get('wgNamespaceNumber') === 10) { // Template: |
||
code = "<noinclude>" + code + "</noinclude>"; |
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 |
// Generate edit summary for edit |
||
var editsummary; |
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); |
pageobj.setPageText(code + "\n" + text); |
||
Line 1,169: | Line 925: | ||
// disallow warning yourself |
// disallow warning yourself |
||
if (initialContrib === mw.config.get('wgUserName')) { |
if (initialContrib === mw.config.get('wgUserName')) { |
||
Morebits.status.warn("您(" + initialContrib + ") |
Morebits.status.warn("您(" + initialContrib + ")建立了該頁,跳過通知"); |
||
// don't notify users when their user talk page is nominated |
// don't notify users when their user talk page is nominated |
||
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) { |
} else if (initialContrib === mw.config.get('wgTitle') && mw.config.get('wgNamespaceNumber') === 3) { |
||
Morebits.status.warn("通知 |
Morebits.status.warn("通知頁面建立者:用戶建立了自己的對話頁"); |
||
} else { |
} else { |
||
var talkPageName = 'User talk:' + initialContrib; |
var talkPageName = 'User talk:' + initialContrib; |
||
Morebits.wiki. |
var usertalkpage = new Morebits.wiki.page(talkPageName, "通知頁面建立者(" + 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, i; |
||
notifytext = "\n{{subst:db-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: | Line 968: | ||
// for DI: params.fromDI = true, params.templatename, params.normalized (note: normalized is a string) |
// for DI: params.fromDI = true, params.templatename, params.normalized (note: normalized is a string) |
||
addToLog: function(params, initialContrib) { |
addToLog: function(params, initialContrib) { |
||
var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('speedyLogPageName'), "添加 |
var wikipedia_page = new Morebits.wiki.page("User:" + mw.config.get('wgUserName') + "/" + Twinkle.getPref('speedyLogPageName'), "添加項目到用戶日誌"); |
||
params.logInitialContrib = initialContrib; |
params.logInitialContrib = initialContrib; |
||
wikipedia_page.setCallbackParameters(params); |
wikipedia_page.setCallbackParameters(params); |
||
Line 1,239: | Line 983: | ||
if (!pageobj.exists()) { |
if (!pageobj.exists()) { |
||
appendText += |
appendText += |
||
" |
"這是該用戶使用[[WP:TW|Twinkle]]的速刪模組做出的速刪提名清單。\n\n" + |
||
"如果您不再想保留此日 |
"如果您不再想保留此日誌,請在[[Wikipedia:Twinkle/偏好設定|偏好設定]]中關掉,並" + |
||
" |
"提交速刪。\n"; |
||
if (Morebits.userIsInGroup("sysop")) { |
if (Morebits.userIsInGroup("sysop")) { |
||
appendText += "\n此日 |
appendText += "\n此日誌并不記录用Twinkle直接执行的刪除。\n"; |
||
} |
} |
||
} |
} |
||
Line 1,255: | Line 999: | ||
appendText += "\n# [[:" + Morebits.pageNameNorm + "]]: "; |
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) { |
if (params.logInitialContrib) { |
||
Line 1,278: | Line 1,007: | ||
pageobj.setAppendText(appendText); |
pageobj.setAppendText(appendText); |
||
pageobj.setEditSummary(" |
pageobj.setEditSummary("錄速刪誌:[[" + Morebits.pageNameNorm + "]]" + Twinkle.getPref('summaryAd')); |
||
pageobj.setCreateOption("recreate"); |
pageobj.setCreateOption("recreate"); |
||
pageobj.append(); |
pageobj.append(); |
||
Line 1,296: | Line 1,025: | ||
var dbrationale = form["csd.reason_1"].value; |
var dbrationale = form["csd.reason_1"].value; |
||
if (!dbrationale || !dbrationale.trim()) { |
if (!dbrationale || !dbrationale.trim()) { |
||
alert( '自定 |
alert( '自定義理由:請指定理由。' ); |
||
parameters = null; |
parameters = null; |
||
return false; |
return false; |
||
} |
} |
||
currentParams["1"] = dbrationale; |
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; |
break; |
||
Line 1,411: | Line 1,055: | ||
var values = (e.target.form ? e.target.form : e.target).getChecked('csd'); |
var values = (e.target.form ? e.target.form : e.target).getChecked('csd'); |
||
if (values.length === 0) { |
if (values.length === 0) { |
||
alert( " |
alert( "請選擇一個理據!" ); |
||
return null; |
return null; |
||
} |
} |
||
Line 1,457: | Line 1,101: | ||
deleteTalkPage: form.talkpage && form.talkpage.checked, |
deleteTalkPage: form.talkpage && form.talkpage.checked, |
||
deleteRedirects: form.redirects.checked, |
deleteRedirects: form.redirects.checked, |
||
movetodraft: form.movetodraft.checked, |
|||
openUserTalk: form.openusertalk.checked, |
openUserTalk: form.openusertalk.checked, |
||
promptForSummary: promptForSummary, |
promptForSummary: promptForSummary, |
||
Line 1,547: | Line 1,192: | ||
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName'); |
Morebits.wiki.actionCompleted.redirect = mw.config.get('wgPageName'); |
||
Morebits.wiki.actionCompleted.notice = " |
Morebits.wiki.actionCompleted.notice = "標記完成"; |
||
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), " |
var wikipedia_page = new Morebits.wiki.page(mw.config.get('wgPageName'), "標記頁面"); |
||
wikipedia_page.setCallbackParameters(params); |
wikipedia_page.setCallbackParameters(params); |
||
wikipedia_page.load(Twinkle.speedy.callbacks.user.main); |
wikipedia_page.load(Twinkle.speedy.callbacks.user.main); |
Latest revision as of 12:55, 6 June 2017
//<nowiki>
// vim: set noet sts=0 sw=8:
(function($){
/*
****************************************
*** twinklespeedy.js: CSD module
****************************************
* Mode of invocation: Tab ("CSD")
* Active on: Non-special, existing pages
* Config directives in: TwinkleConfig
*
* NOTE FOR DEVELOPERS:
* If adding a new criterion, add it to the appropriate places at the top of
* twinkleconfig.js. Also check out the default values of the CSD preferences
* in twinkle.js, and add your new criterion to those if you think it would be
* good.
*/
Twinkle.speedy = function twinklespeedy() {
// Disable on:
// * special pages
// * Flow pages
// * non-existent pages
if (mw.config.get('wgNamespaceNumber') < 0 || !mw.config.get('wgArticleId')) {
return;
}
Twinkle.addPortletLink( Twinkle.speedy.callback, "速刪", "tw-csd", Morebits.userIsInGroup('sysop') ? "快速刪除" : "請求快速刪除" );
};
// This function is run when the CSD tab/header link is clicked
Twinkle.speedy.callback = function twinklespeedyCallback() {
Twinkle.speedy.initDialog(Morebits.userIsInGroup( 'sysop' ) ? Twinkle.speedy.callback.evaluateSysop : Twinkle.speedy.callback.evaluateUser, true);
};
// Used by unlink feature
Twinkle.speedy.dialog = null;
// The speedy criteria list can be in one of several modes
Twinkle.speedy.mode = {
sysopSingleSubmit: 1, // radio buttons, no subgroups, submit when "Submit" button is clicked
sysopRadioClick: 2, // radio buttons, no subgroups, submit when a radio button is clicked
sysopMultipleSubmit: 3, // check boxes, subgroups, "Submit" button already present
sysopMultipleRadioClick: 4, // check boxes, subgroups, need to add a "Submit" button
userMultipleSubmit: 5, // check boxes, subgroups, "Submit" button already pressent
userMultipleRadioClick: 6, // check boxes, subgroups, need to add a "Submit" button
userSingleSubmit: 7, // radio buttons, subgroups, submit when "Submit" button is clicked
userSingleRadioClick: 8, // radio buttons, subgroups, submit when a radio button is clicked
// are we in "delete page" mode?
// (sysops can access both "delete page" [sysop] and "tag page only" [user] modes)
isSysop: function twinklespeedyModeIsSysop(mode) {
return mode === Twinkle.speedy.mode.sysopSingleSubmit ||
mode === Twinkle.speedy.mode.sysopMultipleSubmit ||
mode === Twinkle.speedy.mode.sysopRadioClick ||
mode === Twinkle.speedy.mode.sysopMultipleRadioClick;
},
// do we have a "Submit" button once the form is created?
hasSubmitButton: function twinklespeedyModeHasSubmitButton(mode) {
return mode === Twinkle.speedy.mode.sysopSingleSubmit ||
mode === Twinkle.speedy.mode.sysopMultipleSubmit ||
mode === Twinkle.speedy.mode.sysopMultipleRadioClick ||
mode === Twinkle.speedy.mode.userMultipleSubmit ||
mode === Twinkle.speedy.mode.userMultipleRadioClick ||
mode === Twinkle.speedy.mode.userSingleSubmit;
},
// is db-multiple the outcome here?
isMultiple: function twinklespeedyModeIsMultiple(mode) {
return mode === Twinkle.speedy.mode.userMultipleSubmit ||
mode === Twinkle.speedy.mode.sysopMultipleSubmit ||
mode === Twinkle.speedy.mode.userMultipleRadioClick ||
mode === Twinkle.speedy.mode.sysopMultipleRadioClick;
},
};
// Prepares the speedy deletion dialog and displays it
Twinkle.speedy.initDialog = function twinklespeedyInitDialog(callbackfunc) {
var dialog;
Twinkle.speedy.dialog = new Morebits.simpleWindow( Twinkle.getPref('speedyWindowWidth'), Twinkle.getPref('speedyWindowHeight') );
dialog = Twinkle.speedy.dialog;
dialog.setTitle( "選擇快速刪除理由" );
dialog.setScriptName( "Twinkle" );
var form = new Morebits.quickForm( callbackfunc, (Twinkle.getPref('speedySelectionStyle') === 'radioClick' ? 'change' : null) );
if( Morebits.userIsInGroup( 'sysop' ) ) {
form.append( {
type: 'checkbox',
list: [
{
label: '只標記,不刪除',
value: 'tag_only',
name: 'tag_only',
tooltip: '如果您只想標記此頁面而不是刪除',
checked : Twinkle.getPref('deleteSysopDefaultToTag'),
event: function( event ) {
var cForm = event.target.form;
var cChecked = event.target.checked;
// enable/disable talk page checkbox
if (cForm.talkpage) {
cForm.talkpage.disabled = cChecked;
cForm.talkpage.checked = !cChecked && Twinkle.getPref('deleteTalkPageOnDelete');
}
// enable/disable redirects checkbox
cForm.redirects.disabled = cChecked;
cForm.redirects.checked = !cChecked;
// enable/disable delete multiple
cForm.delmultiple.disabled = cChecked;
cForm.delmultiple.checked = false;
// enable/disable open talk page checkbox
cForm.openusertalk.disabled = cChecked;
cForm.openusertalk.checked = false;
// enable/disable notify checkbox
cForm.notify.disabled = !cChecked;
cForm.notify.checked = cChecked;
// enable/disable multiple
cForm.multiple.disabled = !cChecked;
cForm.multiple.checked = false;
Twinkle.speedy.callback.modeChanged(cForm);
event.stopPropagation();
}
}
]
} );
var deleteOptions = form.append( {
type: 'div',
name: 'delete_options'
} );
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
deleteOptions.append( {
type: 'checkbox',
list: [
{
label: '刪除討論頁',
value: 'talkpage',
name: 'talkpage',
tooltip: "刪除時附带刪除此頁面的討論頁。",
checked: Twinkle.getPref('deleteTalkPageOnDelete'),
disabled: Twinkle.getPref('deleteSysopDefaultToTag'),
event: function( event ) {
event.stopPropagation();
}
}
]
} );
}
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'),
event: function( event ) {
event.stopPropagation();
}
}
]
} );
deleteOptions.append( {
type: 'checkbox',
list: [
{
label: '應用多個理由刪除',
value: 'delmultiple',
name: 'delmultiple',
tooltip: "您可選擇應用於該頁的多個理由。",
event: function( event ) {
Twinkle.speedy.callback.modeChanged( event.target.form );
event.stopPropagation();
}
}
]
} );
deleteOptions.append( {
type: 'checkbox',
list: [
{
label: '開啟用戶對話頁',
value: 'openusertalk',
name: 'openusertalk',
tooltip: '此項的預設值為您的開啟對話頁設定。在您選擇應用多條理由刪除時此項將保持不變。',
checked : false
}
]
} );
}
var tagOptions = form.append( {
type: 'div',
name: 'tag_options'
} );
if( Morebits.userIsInGroup( 'sysop' ) ) {
tagOptions.append( {
type: 'header',
label: '標記相關选項'
} );
}
tagOptions.append( {
type: 'checkbox',
list: [
{
label: '如可能,通知建立者',
value: 'notify',
name: 'notify',
tooltip: "如果您啟用了該理據的通知,一個通知模板將會加入到建立者的對話頁。",
checked: !Morebits.userIsInGroup( 'sysop' ) || Twinkle.getPref('deleteSysopDefaultToTag'),
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
event: function( event ) {
event.stopPropagation();
}
}
]
} );
tagOptions.append( {
type: 'checkbox',
list: [
{
label: '應用多個理由',
value: 'multiple',
name: 'multiple',
tooltip: "您可選擇應用於該頁的多個理由。",
disabled: Morebits.userIsInGroup( 'sysop' ) && !Twinkle.getPref('deleteSysopDefaultToTag'),
event: function( event ) {
Twinkle.speedy.callback.modeChanged( event.target.form );
event.stopPropagation();
}
}
]
} );
form.append( {
type: 'div',
name: 'work_area',
label: '初始化CSD模組失敗,請重試,或將這報告給Twinkle開發者。'
} );
if( Twinkle.getPref( 'speedySelectionStyle' ) !== 'radioClick' ) {
form.append( { type: 'submit' } );
}
var result = form.render();
dialog.setContent( result );
dialog.display();
Twinkle.speedy.callback.modeChanged( result );
// if sysop, check if CSD is already on the page and fill in custom rationale
if (Morebits.userIsInGroup('sysop') && $("#delete-reason").length) {
var customOption = $("input[name=csd][value=reason]")[0];
if (Twinkle.getPref('speedySelectionStyle') !== 'radioClick') {
// force listeners to re-init
customOption.click();
customOption.parentNode.appendChild(customOption.subgroup);
}
customOption.subgroup.querySelector('input').value = decodeURIComponent($("#delete-reason").text()).replace(/\+/g, ' ');
}
};
Twinkle.speedy.callback.getMode = function twinklespeedyCallbackGetMode(form) {
var mode = Twinkle.speedy.mode.userSingleSubmit;
if (form.tag_only && !form.tag_only.checked) {
if (form.delmultiple.checked) {
mode = Twinkle.speedy.mode.sysopMultipleSubmit;
} else {
mode = Twinkle.speedy.mode.sysopSingleSubmit;
}
} else {
if (form.multiple.checked) {
mode = Twinkle.speedy.mode.userMultipleSubmit;
} else {
mode = Twinkle.speedy.mode.userSingleSubmit;
}
}
if (Twinkle.getPref('speedySelectionStyle') === 'radioClick') {
mode++;
}
return mode;
};
Twinkle.speedy.callback.modeChanged = function twinklespeedyCallbackModeChanged(form) {
var namespace = mw.config.get('wgNamespaceNumber');
// first figure out what mode we're in
var mode = Twinkle.speedy.callback.getMode(form);
if (Twinkle.speedy.mode.isSysop(mode)) {
$("[name=delete_options]").show();
$("[name=tag_options]").hide();
} else {
$("[name=delete_options]").hide();
$("[name=tag_options]").show();
}
var work_area = new Morebits.quickForm.element( {
type: 'div',
name: 'work_area'
} );
if (mode === Twinkle.speedy.mode.userMultipleRadioClick || mode === Twinkle.speedy.mode.sysopMultipleRadioClick) {
var evaluateType = Twinkle.speedy.mode.isSysop(mode) ? 'evaluateSysop' : 'evaluateUser';
work_area.append( {
type: 'div',
label: '當選擇完成後,點選:'
} );
work_area.append( {
type: 'button',
name: 'submit-multiple',
label: '提交',
event: function( event ) {
Twinkle.speedy.callback[evaluateType]( event );
event.stopPropagation();
}
} );
}
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 14: // category
work_area.append( { type: 'header', label: '分類' } );
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.categoryList, mode) } );
break;
default:
break;
}
// 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 (mw.config.get('wgIsRedirect') || Morebits.userIsInGroup('sysop')) {
work_area.append( { type: 'header', label: '重定向' } );
if (namespace === 0 || namespace === 118) {
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.redirectArticleList, mode) } );
}
work_area.append( { type: radioOrCheckbox, name: 'csd', list: Twinkle.speedy.generateCsdList(Twinkle.speedy.redirectList, mode) } );
}
var old_area = Morebits.quickForm.getElements(form, "work_area")[0];
form.replaceChild(work_area.render(), old_area);
};
Twinkle.speedy.generateCsdList = function twinklespeedyGenerateCsdList(list, mode) {
// mode switches
var isSysop = Twinkle.speedy.mode.isSysop(mode);
var multiple = Twinkle.speedy.mode.isMultiple(mode);
var hasSubmitButton = Twinkle.speedy.mode.hasSubmitButton(mode);
var openSubgroupHandler = function(e) {
$(e.target.form).find('input').prop('disabled', true);
$(e.target.form).children().css('color', 'gray');
$(e.target).parent().css('color', 'black').find('input').prop('disabled', false);
$(e.target).parent().find('input:text')[0].focus();
e.stopPropagation();
};
var submitSubgroupHandler = function(e) {
var evaluateType = Twinkle.speedy.mode.isSysop(mode) ? 'evaluateSysop' : 'evaluateUser';
Twinkle.speedy.callback[evaluateType](e);
e.stopPropagation();
};
return $.map(list, function(critElement) {
var criterion = $.extend({}, critElement);
if (multiple) {
if (criterion.hideWhenMultiple) {
return null;
}
if (criterion.hideSubgroupWhenMultiple) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenSingle) {
return null;
}
if (criterion.hideSubgroupWhenSingle) {
criterion.subgroup = null;
}
}
if (isSysop) {
if (criterion.hideWhenSysop) {
return null;
}
if (criterion.hideSubgroupWhenSysop) {
criterion.subgroup = null;
}
} else {
if (criterion.hideWhenUser) {
return null;
}
if (criterion.hideSubgroupWhenUser) {
criterion.subgroup = null;
}
}
if (mw.config.get('wgIsRedirect') && criterion.hideWhenRedirect) {
return null;
}
if (criterion.subgroup && !hasSubmitButton) {
if ($.isArray(criterion.subgroup)) {
criterion.subgroup.push({
type: 'button',
name: 'submit',
label: '提交',
event: submitSubgroupHandler
});
} else {
criterion.subgroup = [
criterion.subgroup,
{
type: 'button',
name: 'submit', // ends up being called "csd.submit" so this is OK
label: '提交',
event: submitSubgroupHandler
}
];
}
// FIXME: does this do anything?
criterion.event = openSubgroupHandler;
}
if ( isSysop ) {
var originalEvent = criterion.event;
criterion.event = function(e) {
if (multiple) return originalEvent(e);
var normalizedCriterion = Twinkle.speedy.normalizeHash[e.target.value];
$('[name=openusertalk]').prop('checked',
Twinkle.getPref('openUserTalkPageOnSpeedyDelete').indexOf(normalizedCriterion) !== -1
);
if ( originalEvent ) {
return originalEvent(e);
}
};
}
return criterion;
});
};
Twinkle.speedy.customRationale = [
{
label: '自定義理由' + (Morebits.userIsInGroup('sysop') ? '(自定義刪除理由)' : ''),
value: 'reason',
tooltip: '這不是萬能的刪除理由,只適用於該頁及其歷史版本均明顯不應存在於維基大典的情況。',
subgroup: {
name: 'reason_1',
type: 'input',
label: '理由:',
size: 60
},
}
];
Twinkle.speedy.articleList = [
{
label: '非文言',
value: 'a1',
tooltip: '條目根本不是文言文,只有完全重寫才能解決問題。文白相雜請改用{{文白相雜|~~~~~}}。如果作者有改善意願,建議移至草稿。'
},
{
label: '極短且不知所云',
value: 'a2',
tooltip: '只用於非常短,而且明顯看不出主題的條目。'
},
{
label: '文白相雜且未斧正',
value: 'a3',
tooltip: '條目文白相雜,等了一個月之後內容仍未改善。建議將這種頁面移到草稿而不是刪除。',
hideWhenUser: true
},
{
label: '生不立傳',
value: 'a4'
},
];
Twinkle.speedy.categoryList = [
{
label: '空類',
value: 'c1',
tooltip: '不適用於維護大典性質的分類。'
}
];
Twinkle.speedy.generalList = [
{
label: '作者請求 / 去己齋',
value: 'g1',
tooltip: '注意:應該只用於頁面作者唯一或實質貢獻者唯一的情況,因此用戶討論頁通常不適用刪除。'
},
{
label: '毀我大典',
value: 'g3',
},
{
label: '廣告宣傳',
value: 'g4',
tooltip: '明顯的廣告宣傳,唯有全部重寫才能改善內容,或者無法按大典要求重寫。'
},
{
label: '試筆',
value: 'g5',
tooltip: '測試性質的頁面',
},
{
label: '孤頁',
value: 'g7',
tooltip: '例如以下几种類型:1. 没有對應檔案的檔案頁面;2. 没有對應母頁面的子頁面,用戶頁子頁面除外;3. 指向不存在頁面的重定向;4. 没有對應内容頁面的討論頁,討論頁存档和用戶討論頁除外;5. 不存在注册用戶的用戶頁及用戶頁子頁面,随用戶更名产生的用戶頁重定向除外。請在刪除時注意有无將内容移至他处的必要。不包括在主頁面挂有{{CSD Placeholder}}模板的討論頁。'
},
{
label: '大典維護',
value: 'g8',
tooltip: '例如解封用戶而刪除{{永禁}}、刪除MediaWiki頁面、因移動而刪除等。',
hideWhenUser: true
},
];
Twinkle.speedy.redirectArticleList = [
{
label: '條目渡至非條目',
value: 'r3',
tooltip: '由條目的名字空间重定向至非條目名字空间,或將用戶頁移出條目名字空间時遗留的重定向。'
},
{
label: '簡化字文題',
value: 'r4',
tooltip: '條目以簡化字為題。如果不是重定向頁,需先移動到合適的標題然後再提刪。'
}
];
Twinkle.speedy.redirectList = [
{
label: '斷渡或窮渡',
value: 'r1',
},
{
label: '筆誤',
value: 'r2',
tooltip: '非一眼能看出的拼寫錯誤和翻譯或標题用字的爭議應交由議刪處理。',
},
];
Twinkle.speedy.normalizeHash = {
'reason': 'db',
'multiple': 'multiple',
'multiple-finish': 'multiple-finish',
'g1': 'g1',
'g3': 'g3',
'g4': 'g4',
'g5': 'g5',
'g7': 'g7',
'g8': 'g8',
'a1': 'a1',
'a2': 'a2',
'a3': 'a3',
'a4': 'a4',
'r1': 'r1',
'r2': 'r2',
'r3': 'r3',
'r4': 'r4',
'c1': 'c1',
};
// keep this synched with [[MediaWiki:Deletereason-dropdown]]
Twinkle.speedy.reasonHash = {
'reason': '',
// General
'g1': '作者請求',
'g3': '毀我大典',
'g4': '廣告宣傳',
'g5': '試筆',
'g7': '孤頁',
'g8': '大典維護',
// Articles
'a1': '非文言',
'a2': '極短且不知所云',
'a3': '文白相雜且未斧正',
'a4': '生不立傳',
// Redirects
'r1': '斷渡或窮渡',
'r2': '筆誤',
'r3': '條目渡至非條目',
'r4': '簡化字文題',
// Categories
'c1': '空類'
// Templates
// Portals
};
Twinkle.speedy.callbacks = {
getTemplateCodeAndParams: function(params) {
var code = "{{刪|";
var reasons = Twinkle.speedy.callbacks.getReasons(params);
params.utparams = {};
$.each(params.normalizeds, function(index, norm) {
$.extend(params.utparams, Twinkle.speedy.getUserTalkParameters(norm, params.templateParams[index] || []));
});
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; i<parameters.length; i++) {
if (typeof parameters[i] === 'string') {
reasons.push(parameters[i]);
}
}
}
});
return reasons;
},
sysop: {
main: function( params ) {
var reason;
if (!params.normalizeds.length && params.normalizeds[0] === 'db') {
reason = prompt("输入刪除理由:", "");
Twinkle.speedy.callbacks.sysop.deletePage( reason, params );
} else {
Twinkle.speedy.callbacks.sysop.deletePage(Twinkle.speedy.callbacks.getReasons(params).join(';'), 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') );
if (params.movetodraft) {
thispage.setMoveTalkPage(true);
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.
// Otherwise open the talk page directly
if( params.openUserTalk ) {
thispage.setCallbackParameters( params );
thispage.lookupCreator( Twinkle.speedy.callbacks.sysop.openUserTalkPage );
}
},
deleteTalk: function( params ) {
// delete talk page
if (params.deleteTalkPage &&
params.normalized !== 'g1' &&
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('孤頁:已刪「' + Morebits.pageNameNorm + "」,去其議論頁" + Twinkle.getPref('deletionSummaryAd'));
talkpage.deletePage();
// this is ugly, but because of the architecture of wiki.api, it is needed
// (otherwise success/failure messages for the previous action would be suppressed)
window.setTimeout(function() { Twinkle.speedy.callbacks.sysop.deleteRedirects( params ); }, 1800);
} else {
Twinkle.speedy.callbacks.sysop.deleteRedirects( params );
}
},
deleteRedirects: function( params ) {
// delete redirects
if (params.deleteRedirects) {
var query = {
'action': 'query',
'titles': mw.config.get('wgPageName'),
'prop': 'redirects',
'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();
}
// promote Unlink tool
var $link, $bigtext;
$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 ) {
pageobj.getStatusElement().unlink(); // don't need it anymore
var user = pageobj.getCreator();
var params = pageobj.getCallbackParameters();
var query = {
'title': 'User talk:' + user,
'action': 'edit',
'preview': 'yes',
'vanarticle': Morebits.pageNameNorm
};
if (params.normalized === 'db' || Twinkle.getPref("promptForSpeedyDeletionSummary").indexOf(params.normalized) !== -1) {
// provide a link to the user talk page
var $link, $bigtext;
$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' }
});
Morebits.status.info($bigtext[0], $link[0]);
} else {
// open the initial contributor's talk page
var statusIndicator = new Morebits.status('打開用戶' + user + '對話頁編輯表单', '打開中…');
switch( Twinkle.getPref('userTalkPageMode') ) {
case 'tab':
window.open( mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ), '_blank' );
break;
case 'blank':
window.open( mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ), '_blank', 'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
break;
case 'window':
/* falls through */
default:
window.open( mw.util.wikiScript('index') + '?' + Morebits.queryString.create( query ),
( window.name === 'twinklewarnwindow' ? '_blank' : 'twinklewarnwindow' ),
'location=no,toolbar=no,status=no,directories=no,scrollbars=yes,width=1200,height=800' );
break;
}
statusIndicator.info( '完成' );
}
},
deleteRedirectsMain: function( apiobj ) {
var xmlDoc = apiobj.getXML();
var $snapshot = $(xmlDoc).find('redirects rd');
var total = $snapshot.length;
var statusIndicator = apiobj.statelem;
if( !total ) {
statusIndicator.status("未發现重定向");
return;
}
statusIndicator.status("0%");
var current = 0;
var onsuccess = function( apiobjInner ) {
var now = parseInt( 100 * (++current)/total, 10 ) + '%';
statusIndicator.update( now );
apiobjInner.statelem.unlink();
if( current >= total ) {
statusIndicator.info( now + '(完成)' );
Morebits.wiki.removeCheckpoint();
}
};
Morebits.wiki.addCheckpoint();
$snapshot.each(function(key, value) {
var title = $(value).attr('title');
var page = new Morebits.wiki.page(title, '刪除重定向 "' + title + '"');
page.setEditSummary('孤頁:渡至已刪頁「' + Morebits.pageNameNorm + "」" + Twinkle.getPref('deletionSummaryAd'));
page.deletePage(onsuccess);
});
}
},
user: {
main: function(pageobj) {
var statelem = pageobj.getStatusElement();
if (!pageobj.exists()) {
statelem.error( "頁面不存在,可能已被刪除" );
return;
}
var text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
statelem.status( '檢查頁面已有標記…' );
// check for existing deletion tags
var tag = /(?:\{\{\s*(d|delete|刪)(?:\s*\||\s*\}\}))/i.exec( text );
if ( tag ) {
statelem.error( [ Morebits.htmlNode( 'strong', tag[1] ) , " 已置於頁面中。" ] );
return;
}
var xfd = /(?:\{\{\s*(afd|議刪)[^{}]*?\}\})/i.exec( text );
if ( xfd && !confirm( "刪除相關模板{{" + xfd[1] + "}}已被置於頁面中,您是否仍想添加一個快速刪除模板?" ) ) {
statelem.error( '頁面已被提交至存废討論。' );
return;
}
// given the params, builds the template and also adds the user talk page parameters to the params that were passed in
// returns => [<string> wikitext, <object> utparams]
var buildData = Twinkle.speedy.callbacks.getTemplateCodeAndParams(params),
code = buildData[0];
params.utparams = buildData[1];
var thispage = new Morebits.wiki.page(mw.config.get('wgPageName'));
// patrol the page, if reached from Special:NewPages
if( Twinkle.getPref('markSpeedyPagesAsPatrolled') ) {
thispage.patrol();
}
// Wrap SD template in noinclude tags if we are in template space.
// Won't work with userboxes in userspace, or any other transcluded page outside template space
if (mw.config.get('wgNamespaceNumber') === 10) { // Template:
code = "<noinclude>" + code + "</noinclude>";
}
// Generate edit summary for edit
var editsummary = '提速刪:' + Twinkle.speedy.callbacks.getReasons(params);
pageobj.setPageText(code + "\n" + text);
pageobj.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
pageobj.setWatchlist(params.watch);
pageobj.setCreateOption('nocreate');
pageobj.save(Twinkle.speedy.callbacks.user.tagComplete);
},
tagComplete: function(pageobj) {
var params = pageobj.getCallbackParameters();
// Notification to first contributor
if (params.usertalk) {
var callback = function(pageobj) {
var initialContrib = pageobj.getCreator();
// 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.page(talkPageName, "通知頁面建立者(" + initialContrib + ")"),
notifytext, i;
notifytext = "\n{{subst:db-notice|target=" + Morebits.pageNameNorm;
notifytext += (params.welcomeuser ? "" : "|nowelcome=yes") + "}}--~~~~";
var editsummary = "通知:";
editsummary += "頁[[" + Morebits.pageNameNorm + "]]將刪";
usertalkpage.setAppendText(notifytext);
usertalkpage.setEditSummary(editsummary + Twinkle.getPref('summaryAd'));
usertalkpage.setCreateOption('recreate');
usertalkpage.setFollowRedirect(true);
usertalkpage.append();
}
// add this nomination to the user's userspace log, if the user has enabled it
if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, initialContrib);
}
};
var thispage = new Morebits.wiki.page(Morebits.pageNameNorm);
thispage.lookupCreator(callback);
}
// or, if not notifying, add this nomination to the user's userspace log without the initial contributor's name
else if (params.lognomination) {
Twinkle.speedy.callbacks.user.addToLog(params, null);
}
},
// note: this code is also invoked from twinkleimage
// the params used are:
// for CSD: params.values, params.normalizeds (note: normalizeds is an array)
// 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);
wikipedia_page.load(Twinkle.speedy.callbacks.user.saveLog);
},
saveLog: function(pageobj) {
var text = pageobj.getPageText();
var params = pageobj.getCallbackParameters();
var appendText = "";
// add blurb if log page doesn't exist
if (!pageobj.exists()) {
appendText +=
"這是該用戶使用[[WP:TW|Twinkle]]的速刪模組做出的速刪提名清單。\n\n" +
"如果您不再想保留此日誌,請在[[Wikipedia:Twinkle/偏好設定|偏好設定]]中關掉,並" +
"提交速刪。\n";
if (Morebits.userIsInGroup("sysop")) {
appendText += "\n此日誌并不記录用Twinkle直接执行的刪除。\n";
}
}
// create monthly header
var date = new Date();
var headerRe = new RegExp("^==+\\s*" + date.getUTCFullYear() + "\\s*年\\s*" + (date.getUTCMonth() + 1) + "\\s*月\\s*==+", "m");
if (!headerRe.exec(text)) {
appendText += "\n\n=== " + date.getUTCFullYear() + "年" + (date.getUTCMonth() + 1) + "月 ===";
}
appendText += "\n# [[:" + Morebits.pageNameNorm + "]]: ";
appendText += Twinkle.speedy.callbacks.getReasons(params);
if (params.logInitialContrib) {
appendText += ";通知{{user|" + params.logInitialContrib + "}}";
}
appendText += " ~~~~~\n";
pageobj.setAppendText(appendText);
pageobj.setEditSummary("錄速刪誌:[[" + Morebits.pageNameNorm + "]]" + Twinkle.getPref('summaryAd'));
pageobj.setCreateOption("recreate");
pageobj.append();
}
}
};
// validate subgroups in the form passed into the speedy deletion tag
Twinkle.speedy.getParameters = function twinklespeedyGetParameters(form, values) {
var parameters = [];
$.each(values, function(index, value) {
var currentParams = [];
switch (value) {
case 'reason':
if (form["csd.reason_1"]) {
var dbrationale = form["csd.reason_1"].value;
if (!dbrationale || !dbrationale.trim()) {
alert( '自定義理由:請指定理由。' );
parameters = null;
return false;
}
currentParams["1"] = dbrationale;
}
break;
default:
break;
}
parameters.push(currentParams);
});
return parameters;
};
// function for processing talk page notification template parameters
Twinkle.speedy.getUserTalkParameters = function twinklespeedyGetUserTalkParameters(normalized, parameters) {
var utparams = [];
switch (normalized) {
default:
break;
}
return utparams;
};
Twinkle.speedy.resolveCsdValues = function twinklespeedyResolveCsdValues(e) {
var values = (e.target.form ? e.target.form : e.target).getChecked('csd');
if (values.length === 0) {
alert( "請選擇一個理據!" );
return null;
}
return values;
};
Twinkle.speedy.callback.evaluateSysop = function twinklespeedyCallbackEvaluateSysop(e) {
var form = (e.target.form ? e.target.form : e.target);
if (e.target.type === "checkbox" || e.target.type === "text" ||
e.target.type === "select") {
return;
}
var tag_only = form.tag_only;
if( tag_only && tag_only.checked ) {
Twinkle.speedy.callback.evaluateUser(e);
return;
}
var values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
var normalizeds = values.map(function(value) {
return Twinkle.speedy.normalizeHash[ value ];
});
// analyse each criterion to determine whether to watch the page, prompt for summary, or open user talk page
var watchPage, promptForSummary;
normalizeds.forEach(function(norm) {
if (Twinkle.getPref("watchSpeedyPages").indexOf(norm) !== -1) {
watchPage = true;
}
if (Twinkle.getPref("promptForSpeedyDeletionSummary").indexOf(norm) !== -1) {
promptForSummary = true;
}
});
var params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
deleteTalkPage: form.talkpage && form.talkpage.checked,
deleteRedirects: form.redirects.checked,
movetodraft: form.movetodraft.checked,
openUserTalk: form.openusertalk.checked,
promptForSummary: promptForSummary,
templateParams: Twinkle.speedy.getParameters( form, values )
};
if(!params.templateParams) {
return;
}
Morebits.simpleWindow.setButtonsEnabled( false );
Morebits.status.init( form );
Twinkle.speedy.callbacks.sysop.main( params );
};
Twinkle.speedy.callback.evaluateUser = function twinklespeedyCallbackEvaluateUser(e) {
var form = (e.target.form ? e.target.form : e.target);
if (e.target.type === "checkbox" || e.target.type === "text" ||
e.target.type === "select") {
return;
}
var values = Twinkle.speedy.resolveCsdValues(e);
if (!values) {
return;
}
//var multiple = form.multiple.checked;
var normalizeds = [];
$.each(values, function(index, value) {
var norm = Twinkle.speedy.normalizeHash[ value ];
normalizeds.push(norm);
});
// analyse each criterion to determine whether to watch the page/notify the creator
var watchPage = false;
$.each(normalizeds, function(index, norm) {
if (Twinkle.getPref('watchSpeedyPages').indexOf(norm) !== -1) {
watchPage = true;
return false; // break
}
});
var notifyuser = false;
if (form.notify.checked) {
$.each(normalizeds, function(index, norm) {
if (Twinkle.getPref('notifyUserOnSpeedyDeletionNomination').indexOf(norm) !== -1) {
notifyuser = true;
return false; // break
}
});
}
var welcomeuser = false;
if (notifyuser) {
$.each(normalizeds, function(index, norm) {
if (Twinkle.getPref('welcomeUserOnSpeedyDeletionNotification').indexOf(norm) !== -1) {
welcomeuser = true;
return false; // break
}
});
}
var csdlog = false;
if (Twinkle.getPref('logSpeedyNominations')) {
$.each(normalizeds, function(index, norm) {
if (Twinkle.getPref('noLogOnSpeedyNomination').indexOf(norm) === -1) {
csdlog = true;
return false; // break
}
});
}
var params = {
values: values,
normalizeds: normalizeds,
watch: watchPage,
usertalk: notifyuser,
welcomeuser: welcomeuser,
lognomination: csdlog,
templateParams: Twinkle.speedy.getParameters( form, values )
};
if (!params.templateParams) {
return;
}
Morebits.simpleWindow.setButtonsEnabled( false );
Morebits.status.init( form );
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);
};
})(jQuery);
//</nowiki>