User:Kcx36/JS/CCHPEparticipant.js
外观
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
/**
* 本脚本仍在测试阶段,请留意使用效果是否符合预期
* 用于[[Wikipedia:2025年中国文化遗产编辑松]]
* 修改自:https://zh.wikipedia.org/wiki/MediaWiki:Gadget-dcparticipant.js
* 原作者:https://zh.wikipedia.org/wiki/User:WhitePhosphorus
* CC BY-SA 4.0 <https://creativecommons.org/licenses/by-sa/4.0/>
*/
(function ($, mw) {
'use strict';
// 动员令时间 (UTC)
var dcStartTime = new Date('2025-06-05T00:00:00Z');
var dcEndTime = new Date('2025-09-08T23:59:59Z');
// 中国文化遗产编辑松时间 (UTC)
var cchpeStartTime = new Date('2025-07-04T16:00:00Z');
var cchpeEndTime = new Date('2025-09-14T15:59:59Z');
var now = new Date();
// 检查活动是否在进行中
var isDCActive = now >= dcStartTime && now <= dcEndTime;
var isCCHPEActive = now >= cchpeStartTime && now <= cchpeEndTime;
// 如果两个活动都不在进行中,则退出
if (!isCCHPEActive) {
return;
}
var $dl = null, $dl2 = null;
var pagename = mw.config.get('wgPageName');
var username = mw.config.get('wgUserName');
//var dcPersonalPage = 'User:Kcx36/沙盒53';
var dcPersonalPage = 'Wikipedia:動員令/第二十三次動員令/個人貢獻/' + username;
var cchpePersonalPage = 'Wikipedia:2025年中国文化遗产编辑松/个人贡献/' + username;
var summaryPostfix = ' via [[User:Kcx36/JS/CCHPEparticipant.js|CCHPEparticipant.js]]';
// 在提报页面加个广告推荐大家使用小工具
if (pagename === dcPersonalPage && mw.config.get('wgAction') === 'edit') {
if ($.cookie('p4js-dcparticipant-notice')) {
return;
}
$.cookie('p4js-dcparticipant-notice', 1, { path: "/", expires: dcEndTime });
var messageDialog = new OO.ui.MessageDialog();
var windowManager = new OO.ui.WindowManager();
$('body').append(windowManager.$element);
windowManager.addWindows([messageDialog]);
windowManager.openWindow(messageDialog, {
title: wgULS('提交动员令小工具已上线', '提交動員令小工具已上線'),
message: $(wgULS('<img src="/wiki/Special:Redirect/file/Gadget-dcparticipant-entry-zh-hans.png" style="width:80%;margin:10px auto 20px;display:block"><p>还在纠结复杂的源代码?现在写完条目只需点击右上角"更多"-"提交动员令"并填写表单即可,提交动员令从未如此简单!</p><img src="/wiki/Special:Redirect/file/Gadget-dcparticipant-ui-zh-hans.png" style="width:100%;margin:10px auto 20px;display:block">',
'<img src="/wiki/Special:Redirect/file/Gadget-dcparticipant-entry-zh-hant.png" style="width:80%;margin:10px auto 20px;display:block"><p>還在糾結複雜的原始碼?現在寫完條目只需點按右上角「更多」-「提交動員令」並填寫表單即可,提交動員令從未如此簡單!</p><img src="/wiki/Special:Redirect/file/Gadget-dcparticipant-ui-zh-hant.png" style="width:100%;margin:10px auto 20px;display:block">')),
size: 'large',
verbose: true,
actions: [{
action: 'accept',
label: '我知道了',
flags: 'primary'
}]
});
}
// 只在条目空间使用
if (mw.config.get('wgNamespaceNumber') !== 0) {
return;
}
// 只对自动确认/确认用户启用
if (mw.config.get('wgUserGroups').indexOf('autoconfirmed') === -1 && mw.config.get('wgUserGroups').indexOf('confirmed') === -1) {
return;
}
// 动员令主题配置
var dcTopics = [["大動員令"], ["粗劣翻譯條目改善", "GLAM", "軍事", "政治"], ["亟需撰寫的條目", "文化遺產", "交通"]];
var dcTopics_s = [["大动员令"], ["粗劣翻译条目改善", "GLAM", "军事", "政治"], ["亟需撰写的条目", "文化遗产", "交通"]];
var dcTopics_t = [["大動員令"], ["粗劣翻譯條目改善", "GLAM", "軍事", "政治"], ["亟需撰寫的條目", "文化遺產", "交通"]];
var dcTopicGroupName_s = ["大动员令", "中动员令", '小动员令'];
var dcTopicGroupName_t = ["大動員令", "中動員令", '小動員令'];
// 用主题生成下拉选单
var dcTopicsToSelect = function () {
var html = '<select id="p4js-dcparticipant-select-topic">\n';
for (var i in dcTopics) {
var group = dcTopics[i];
html += '<optgroup label="' + (wgULS(dcTopicGroupName_s[i], dcTopicGroupName_t[i])) + '">\n';
for (var j in group) {
var topic = group[j];
html += '<option value="' + (topic) + '"' + ("文化遺產" == topic ? " selected" : "") + '>' + (wgULS(dcTopics_s[i][j], dcTopics_t[i][j])) + '</option>';
}
}
return html + '</select>';
};
// 用主题得到 {{DCxx/art}} 中填的数字类别
var dcTopicToType = function (topic) {
for (var i = 0; i < dcTopics.length; ++i) {
if (dcTopics[i].indexOf(topic) !== -1) {
return String(i + 1);
}
}
return undefined;
};
// 藝術 -> (艺术|藝術)
var dcTopicVariants = function (t) {
for (var i in dcTopics) {
var group = dcTopics[i];
for (var j in group) {
var topic = group[j];
if (t === topic) {
return '(' + (t) + '|' + (dcTopics_s[i][j]) + '|' + (dcTopics_t[i][j]) + ')';
}
}
}
return t;
};
// CCHPE激励主题
var cchpeIncentives = [
{ id: 'yangtze', name_s: '长江流域', name_t: '長江流域' },
{ id: 'national', name_s: '国保消红', name_t: '國保消紅' },
{ id: 'needed', name_s: '亟需撰写的条目', name_t: '亟需撰寫的條目' }
];
// 生成CCHPE激励主题复选框
var cchpeIncentivesToCheckboxes = function () {
var html = '<div id="p4js-cchpe-incentives-container">';
for (var i in cchpeIncentives) {
var incentive = cchpeIncentives[i];
html += '<label><input type="checkbox" id="p4js-cchpe-incentive-' + incentive.id + '">' +
wgULS(incentive.name_s, incentive.name_t) + '</label> ';
}
return html + '</div>';
};
// 主对话框HTML
var dialogHtml = '<div id="p4js-dcparticipant-dialog" title="' +
wgULS('提交贡献:', '提交貢獻:') + pagename + '">' +
'<div id="p4js-submission-target">' +
(isDCActive ? '<p>✓ ' + wgULS('提交到第二十三次动员令', '提交到第二十三次動員令') + '</p>' : '') +
(isCCHPEActive ? '<p>✓ ' + wgULS('提交到2025年中国文化遗产编辑松', '提交到2025年中國文化遺產編輯松') + '</p>' : '') +
'</div>' +
'<table id="p4js-dcparticipant-table" class="wikitable">' +
'<thead style="display:table-header-group"><tr><th>' + wgULS('项目', '項目') + '</th><th>' +
wgULS('请填写', '請填寫') + '</th><th>' + wgULS('说明', '說明') + '</th></tr></thead>' +
'<tbody>' +
(isDCActive ?
'<tr><th>' + wgULS('类别', '類別') + '*</th><th>' + (dcTopicsToSelect()) + '</th><th>' +
wgULS('条目所属类别,分类细则参见', '條目所屬類別,分類細則參見') +
'<a href="https://zh.wikipedia.org/wiki/Wikipedia:動員令/第二十三次動員令#主題">' +
wgULS('此处', '此處') + '</a></th></tr>' : '') +
(isCCHPEActive ?
'<tr><th>' + wgULS('激励主题', '激勵主題') + '</th><th>' + (cchpeIncentivesToCheckboxes()) + '</th><th>' +
wgULS('选择中国文化遗产编辑松适用的激励主题,可多选', '選擇中國文化遺產編輯松適用的激勵主題,可多選') + '</th></tr>' : '') +
'<tr><th>' + wgULS('质量', '質量') + (isDCActive ? '*' : '') + '</th><th><select id="p4js-dcparticipant-select-quality">' +
'<option value="FL">特色列表</option>' +
'<option value="FA">' + wgULS('典范条目', '典範條目') + '</option>' +
'<option value="GA">' + wgULS('优良条目', '優良條目') + '</option>' +
'<option value="" selected>' + wgULS('达标条目', '達標條目') + '</option>' +
'</select><br><label id="p4js-dcparticipant-label-qualitychecked" style="display:none"><input type="checkbox">已通过</label></th>' +
'<th>' + wgULS('如果本条目预期参评优良/典范内容,请加以选择,否则可忽略此项', '如果本條目預期參評優良/典範內容,請加以選擇,否則可忽略此項') + '</th></tr>' +
'<tr><th>' + wgULS('长度', '長度') + '*</th><th><input type="text" id="p4js-dcparticipant-length"></th>' +
'<th>' + wgULS('如果条目由您建立,请填写', '如果條目由您建立,請填寫') +
'<a href="' + (mw.config.get('wgArticlePath').replace('$1', pagename)) + '?action=history">' +
wgULS('此处', '此處') + '</a>' +
wgULS('显示最新版本的字节数<br>(提交工具会尝试自动填入)', '顯示最新版本的位元組數<br>(提交工具會嘗試自動填入)') + '<br>' +
wgULS('如果您改善/重写了条目,请填写重写后与保留原文的字节数之差', '如果您改善/重寫了條目,請填寫重寫後與保留原文的位元組數之差') + '</th></tr>' +
'<tr><th>' + wgULS('改善工程', '改善工程') + '</th><th><label><input type="checkbox" id="p4js-dcparticipant-improve">是</label></th><th>' +
wgULS('如果您并非创建,而是改写了条目,请勾选此项。具体规则参见', '如果您並非創建,而是改寫了條目,請勾選此項。具體規則參見') +
'<a href="https://zh.wikipedia.org/wiki/Wikipedia:動員令/第二十三次動員令#計分及注意事項">' +
wgULS('此处', '此處') + '</a></th></tr>' +
'<tr><th>' + wgULS('有声条目', '有聲條目') + '</th><th><input type="text" id="p4js-dcparticipant-spokenlen"></th><th>' +
wgULS('如您已上传有声条目,请填写条目正文字节数', '如您已上傳有聲條目,請填寫條目正文位元組數') +
'(<a href="https://zh.wikipedia.org/wiki/Wikipedia:有聲維基百科專題">' +
wgULS('如何制作并上传?', '如何製作並上載?') + '</a>)</th></tr>' +
'<tr><th>' + wgULS('图片', '圖片') + '</th>' +
'<th><label>' + wgULS('一般原创图片数量', '一般原創圖片數量') +
'<input type="text" id="p4js-dcparticipant-picnum"></label>' +
'<br><label>' + wgULS('特色原创图片数量', '特色原創圖片數量') +
'<input type="text" id="p4js-dcparticipant-fpicnum"></label>' +
'<br><label>' + wgULS('翻译图片译文字节数', '翻譯圖片譯文位元組數') +
'<input type="text" id="p4js-dcparticipant-pictranslen"></label></th>' +
'<th>' + wgULS('原创图片必须由您亲自创作且已上传至维基共享资源', '原創圖片必須由您親自創作且已上載至維基共享資源') +
'(<a href="https://commons.wikimedia.org/wiki/Special:UploadWizard">' +
wgULS('如何上传?', '如何上載?') + '</a>)<br>' +
wgULS('特色原创图片要求您的图片已经当选<a href="https://zh.wikipedia.org/wiki/Wikipedia:特色图片">特色图片</a>',
'特色原創圖片要求您的圖片已經當選<a href="https://zh.wikipedia.org/wiki/Wikipedia:特色图片">特色圖片</a>') + '</th></tr>' +
'<tr><th>' + wgULS('原创视频', '原創影片') + '</th>' +
'<th><label>' + wgULS('总时长(秒)', '總時長(秒)') +
'<input type="text" id="p4js-dcparticipant-videolen"></label></th>' +
'<th>' + wgULS('原创视频必须由您亲自创作且已上传至维基共享资源', '原創影片必須由您親自創作且已上載至維基共享資源') +
'(<a href="https://commons.wikimedia.org/wiki/Special:UploadWizard">' +
wgULS('如何上传?', '如何上載?') + '</a>)</th></tr>' +
'<tr><th>' + wgULS('参考来源', '參考來源') + '</th><th><input type="text" id="p4js-dcparticipant-refnum"></th><th>' +
wgULS('如您提报缺少来源的条目,请填写新增的参考来源数', '如您提報缺少來源的條目,請填寫新增的參考來源數') +
wgULS('(须可在<a href="/wiki/WorldCat" title="">WorldCat</a>等<a href="/wiki/OPAC" title="">图书馆联机目录</a>、<a href="/wiki/Special:%E7%BD%91%E7%BB%9C%E4%B9%A6%E6%BA%90" title="Special:网络书源">Special:网络书源</a>或<a href="/wiki/CNKI" title="">CNKI</a>等学术期刊数据库上查证)',
'須可在<a href="/wiki/WorldCat" title="">WorldCat</a>等<a href="/wiki/OPAC" title="OPAC">圖書館聯機目錄</a>、<a href="/wiki/Special:%E7%BD%91%E7%BB%9C%E4%B9%A6%E6%BA%90" title="Special:網絡書源">Special:網絡書源</a>或<a href="/wiki/CNKI" title="CNKI">CNKI</a>等學術期刊資料庫上查證') + '</th></tr>' +
'</tbody></table>' +
'<p>' + wgULS('带有*者为必填项目。请注意主持人有权审核并改动您填写的各项目。如阅读说明后仍有疑问,您还可以<a href="https://t.me/wikipedia_zh_DC">加入Telegram讨论群组</a>询问我们的志愿者,或<a href="https://zh.wikipedia.org/w/index.php?title=Wikipedia_talk:動員令/第二十三次動員令&action=edit§ion=new">在此处填写您的问题</a>等待志愿者回复。',
'帶有*者為必填項目。請注意主持人有權審核並改動您填寫的各項目。如閱讀說明後仍有疑問,您還可以<a href="https://t.me/wikipedia_zh_DC">加入Telegram討論群組</a>詢問我們的志願者,或<a href="https://zh.wikipedia.org/w/index.php?title=Wikipedia_talk:動員令/第二十三次動員令&action=edit§ion=new">在此處填寫您的問題</a>等待志願者回覆。') +
'</p>' +
'</div>';
// 用户信息对话框HTML
var dialogUserinfoHtml = '<div id="p4js-dcparticipant-dialog-info" title="' +
wgULS('提交贡献:补充信息', '提交貢獻:補充信息') + '">' +
'<p>' + wgULS('由于您尚未报名,请填写以下信息:', '由於您尚未報名,請填寫以下信息:') + '</p>' +
'<table id="p4js-dcparticipant-table-info" class="wikitable">' +
'<thead style="display:table-header-group"><tr><th>' + wgULS('项目', '項目') + '</th><th>' +
wgULS('请填写', '請填寫') + '</th><th>' + wgULS('说明', '說明') + '</th></tr></thead>' +
'<tbody>' +
'<tr><th>' + wgULS('昵称', '暱稱') + '</th><th><input type="text" id="p4js-dcparticipant-nick" value="' +
(username) + '"></th><th>' +
wgULS('可以不与您的用户名相同,将在活动页面显示,默认为用户名', '可以不與您的用戶名相同,將在活動頁面顯示,默認為用戶名') + '</th></tr>' +
(isDCActive ?
'<tr><th>' + wgULS('完成次数', '完成次數') + '*</th><th><input type="text" id="p4js-dcparticipant-complete"></th><th>' +
wgULS('您以前完成动员令的次数,可能影响头衔颁发,建议如实填写', '您以前完成動員令的次數,可能影響頭銜頒發,建議如實填寫') + '</th></tr>' +
'<tr><th>' + wgULS('编辑次数', '编辑次数') + '*</th><th><input type="text" id="p4js-dcparticipant-ec"></th><th>' +
wgULS('您动员令开始前的编辑次数(<a href="https://zh.wikipedia.org/wiki/Special:参数设置">点击此处</a>查看当前编辑次数),可能影响头衔颁发,建议如实填写(提交工具会尝试自动填入)',
'您動員令開始前的編輯次數(<a href="https://zh.wikipedia.org/wiki/Special:参数设置">點擊此處</a>查看當前編輯次數),可能影響頭銜頒發,建議如實填寫(提交工具會嘗試自動填入)') + '</th></tr>' : '') +
'<tr><th>' + wgULS('目标', '目標') + '</th><th><textarea id="p4js-dcparticipant-tar" style="resize:vertical"></textarea></th><th>' +
wgULS('您对自己本次活动的期望,不会影响任何事情,请自由发挥', '您對自己本次活動的期望,不會影響任何事情,請自由發揮') + '</th></tr>' +
'</tbody></table>' +
'<p>' + wgULS('带有*者为必填项目。以上内容只需本次完成,以后无需填写。如阅读说明后仍有疑问,您还可以<a href="https://t.me/wikipedia_zh_DC">加入Telegram讨论群组</a>询问我们的志愿者,或<a href="https://zh.wikipedia.org/w/index.php?title=Wikipedia_talk:動員令/第二十三次動員令&action=edit§ion=new">在此处填写您的问题</a>等待志愿者回复。',
'帶有*者為必填項目。以上內容只需本次完成,以後無需填寫。如閱讀說明後仍有疑問,您還可以<a href="https://t.me/wikipedia_zh_DC">加入Telegram討論群組</a>詢問我們的志願者,或<a href="https://zh.wikipedia.org/w/index.php?title=Wikipedia_talk:動員令/第二十三次動員令&action=edit§ion=new">在此處填寫您的問題</a>等待志願者回覆。') +
'</p>' +
'</div>';
// 生成动员令贡献wikitext
var htmlToDCWikitext = function () {
var topic = $('#p4js-dcparticipant-select-topic').val();
var quality = $('#p4js-dcparticipant-select-quality').val();
var qualitychecked = $('#p4js-dcparticipant-label-qualitychecked')[0]?.checked;
var len = $('#p4js-dcparticipant-length').val().replace(',', '');
var improve = $('#p4js-dcparticipant-improve').is(':checked');
var spokenlen = parseInt($('#p4js-dcparticipant-spokenlen').val()) || 0;
var spoken = spokenlen !== 0;
var picnum = parseInt($('#p4js-dcparticipant-picnum').val()) || 0;
var fpicnum = parseInt($('#p4js-dcparticipant-fpicnum').val()) || 0;
var pictranslen = parseInt($('#p4js-dcparticipant-pictranslen').val()) || 0;
var pic = (picnum || fpicnum || pictranslen) !== 0;
var videolen = parseInt($('#p4js-dcparticipant-videolen').val()) || 0;
var video = videolen !== 0;
var refnum = parseInt($('#p4js-dcparticipant-refnum').val()) || 0;
var ref = refnum !== 0 && !$('#p4js-dcparticipant-refnum').prop('disabled');
return '#{{DC23/art|' + pagename +
'|type=' + dcTopicToType(topic) +
'|length=' + len +
(quality ? '|quality=' + quality : '') +
(improve ? '|improve=1' : '') +
(ref ? '|ref=1|refnum=' + refnum : '') +
(spoken ? '|spoken=1|spokenlength=' + spokenlen : '') +
(pic ? '|pic=1|picnum=' + picnum + '|fpicnum=' + fpicnum + '|pictranslength=' + pictranslen : '') +
(video ? '|video=1|videolength=' + videolen : '') +
'}}\n';
};
// 生成CCHPE贡献wikitext
var htmlToCCHPEWikitext = function () {
var quality = $('#p4js-dcparticipant-select-quality').val();
var len = $('#p4js-dcparticipant-length').val().replace(',', '');
var improve = $('#p4js-dcparticipant-improve').is(':checked');
var picnum = parseInt($('#p4js-dcparticipant-picnum').val()) || 0;
var fpicnum = parseInt($('#p4js-dcparticipant-fpicnum').val()) || 0;
var yangtze = $('#p4js-cchpe-incentive-yangtze').is(':checked');
var national = $('#p4js-cchpe-incentive-national').is(':checked');
var needed = $('#p4js-cchpe-incentive-needed').is(':checked');
return '#{{CCHPE/2025/art|' + pagename +
'|length=' + len +
(quality ? '|quality=' + quality : '') +
(improve ? '|improve=1' : '') +
(yangtze ? '|长江=1' : '') +
(national ? '|国保=1' : '') +
(needed ? '|待撰=1' : '') +
(picnum || fpicnum ? '|pic=1|picnum=' + picnum + '|fpicnum=' + fpicnum : '') +
'}}\n';
};
// 生成用户信息wikitext
var htmlToUserInfoWikitext = function (isDC) {
var nick = $('#p4js-dcparticipant-nick').val();
if (!nick || nick === '~~' + '~~') nick = username;
var complete = isDC ? $('#p4js-dcparticipant-complete').val() : '';
var ec = isDC ? $('#p4js-dcparticipant-ec').val() : '';
var tar = $('#p4js-dcparticipant-tar').val();
if (isDC) {
var prefix = '{{DC23/con table\n' +
'|真用戶名=' + username + '\n' +
'|暱稱=' + nick + '\n' +
'|參與數=' + complete + '\n' +
'|編輯數=' + ec + '\n' +
'|目標=' + tar + '\n';
var topicList = '';
var suffix = '<!--參數設置:請在下面加入你打算設置的參數,詳情請報名後閱讀本頁下方的連結-->\n' +
'|\n' +
'}}\n';
for (var i in dcTopics) {
var group = dcTopics[i];
for (var j in group) {
var topic = group[j];
topicList += '<!--' + topic + (topic === '大動員令' ? '' : '類') + ',type參數請填' + (parseInt(i) + 1) + '-->\n';
topicList += '|' + topic + '=\n';
}
}
return prefix + topicList + suffix;
} else {
return '{{CCHPE/2025/con table\n' +
'|真用户名=' + username + '\n' +
'|昵称=' + nick + '\n' +
'|贡献=\n' +
'}}\n';
}
};
// 插入贡献到现有内容中
var insertContribution = function (oldtext, contribution, isDC) {
if (isDC) {
// 动员令:查找对应的主题区域插入
var topic = $('#p4js-dcparticipant-select-topic').val();
var topicRegex = new RegExp('\\|\\s*' + dcTopicVariants(topic) + '\\s*=\\n*(#.+\\n+)*');
var match = topicRegex.exec(oldtext);
if (match === null) {
return oldtext;
}
var index = match.index + match[0].length;
return oldtext.slice(0, index) + contribution + oldtext.slice(index);
} else {
// CCHPE:直接插入到贡献部分
var contributionRegex = /\|贡献\s*=\s*(#.+)*/;
var match = contributionRegex.exec(oldtext);
if (match === null) {
return oldtext;
}
var index = match.index + match[0].length;
return oldtext.slice(0, index) + (match[0].trim().endsWith('=') ? '' : '\n') + contribution + oldtext.slice(index);
}
};
// 检查页面是否存在且不为空
var checkPageExists = function (pageTitle) {
return new mw.Api().get({
action: 'query',
prop: 'revisions',
rvprop: 'content',
titles: pageTitle,
formatversion: '2'
}).then(function (data) {
if (!data.query || !data.query.pages) {
return { exists: false, content: '' };
}
var page = data.query.pages[0];
return {
exists: !page.missing,
content: page.revisions ? page.revisions[0].content : ''
};
});
};
// 提交贡献
var postContributions = function () {
// 检查必填参数
var len = $('#p4js-dcparticipant-length').val();
if (!len) {
alert(wgULS('您没有填写"长度"一项', '您沒有填寫「長度」一項'));
return;
}
// 检查是否已经报名
var dcPageCheck = isDCActive ? checkPageExists(dcPersonalPage) : Promise.resolve({ exists: false, content: '' });
var cchpePageCheck = isCCHPEActive ? checkPageExists(cchpePersonalPage) : Promise.resolve({ exists: false, content: '' });
Promise.all([dcPageCheck, cchpePageCheck]).then(function (results) {
var dcPage = results[0];
var cchpePage = results[1];
// 如果两个活动都未报名,显示补充信息对话框
if ((isDCActive && !dcPage.exists) || (isCCHPEActive && !cchpePage.exists)) {
$dl.dialog('close');
if (!$dl2) {
$dl2 = $(dialogUserinfoHtml).dialog({
autoOpen: false, minWidth: 800, minHeight: 240,
buttons: [{
text: wgULS('提交', '提交'),
click: function () {
submitAllContributions(dcPage, cchpePage);
$(this).dialog('close');
$dl.dialog('open');
}
}]
});
}
// 自动填入编辑数
if (isDCActive) {
$('#p4js-dcparticipant-ec').val(mw.config.get('wgUserEditCount'));
}
$dl2.dialog('open');
} else {
submitAllContributions(dcPage, cchpePage);
}
}).catch(function (error) {
console.error('Error checking pages:', error);
alert(wgULS('检查报名状态时出错', '檢查報名狀態時出錯'));
});
};
// 提交所有贡献
var submitAllContributions = function (dcPage, cchpePage) {
var dcContribution = isDCActive ? htmlToDCWikitext() : null;
var cchpeContribution = isCCHPEActive ? htmlToCCHPEWikitext() : null;
var dcNewText = '';
var cchpeNewText = '';
var dcSummary = wgULS('提交[[' + pagename + ']]到动员令', '提交[[' + pagename + ']]到動員令') + summaryPostfix;
var cchpeSummary = wgULS('提交[[' + pagename + ']]到中国文化遗产编辑松', '提交[[' + pagename + ']]到中國文化遺產編輯松') + summaryPostfix;
// 处理动员令提交
if (isDCActive) {
if (dcPage.exists) {
// 检查是否已提交过
var articleRegex = new RegExp('#\\s*{{DC23/art\\s*\\|\\s*' + pagename + '\\s*(\\||}}).*?}}\\n');
if (articleRegex.exec(dcPage.content)) {
if (!confirm(wgULS('您已提交过本条目到动员令,是否移除原有贡献重新提交?', '您已提交過本條目到動員令,是否移除原有貢獻重新提交?'))) {
showResult(false, true, dcContribution, cchpeContribution);
return;
}
dcPage.content = dcPage.content.replace(articleRegex, '');
}
dcNewText = insertContribution(dcPage.content, dcContribution, true);
} else {
// 创建新的动员令个人贡献页
dcNewText = insertContribution(htmlToUserInfoWikitext(true), dcContribution, true);
}
}
// 处理CCHPE提交
if (isCCHPEActive) {
if (cchpePage.exists) {
// 检查是否已提交过
var articleRegex = new RegExp('#\\s*{{CCHPE/2025/art\\s*\\|\\s*' + pagename + '\\s*(\\||}}).*?}}\\n');
if (articleRegex.exec(cchpePage.content)) {
if (!confirm(wgULS('您已提交过本条目到中国文化遗产编辑松,是否移除原有贡献重新提交?', '您已提交過本條目到中國文化遺產編輯松,是否移除原有貢獻重新提交?'))) {
showResult(true, false, dcContribution, cchpeContribution);
return;
}
cchpePage.content = cchpePage.content.replace(articleRegex, '');
}
cchpeNewText = insertContribution(cchpePage.content, cchpeContribution, false);
} else {
// 创建新的CCHPE个人贡献页
cchpeNewText = insertContribution(htmlToUserInfoWikitext(false), cchpeContribution, false);
}
}
// 开始提交
submitting();
// 提交动员令
var dcPromise = isDCActive ?
(dcPage.exists ?
new mw.Api().edit(dcPersonalPage, function () {
return { text: dcNewText, summary: dcSummary };
}) :
new mw.Api().create(dcPersonalPage, {
text: dcNewText, summary: dcSummary
})) :
Promise.resolve();
// 提交CCHPE
var cchpePromise = isCCHPEActive ?
(cchpePage.exists ?
new mw.Api().edit(cchpePersonalPage, function () {
return { text: cchpeNewText, summary: cchpeSummary };
}) :
new mw.Api().create(cchpePersonalPage, {
text: cchpeNewText, summary: cchpeSummary
})) :
Promise.resolve();
// 等待所有提交完成
Promise.all([dcPromise, cchpePromise])
.then(function () {
showResult(true, true);
})
.catch(function (errors) {
var dcError = isDCActive ? errors[0] : null;
var cchpeError = isCCHPEActive ? errors[1] : null;
showResult(!dcError, !cchpeError, dcContribution, cchpeContribution,
dcError ? '错误代码:' + dcError + '。' : '',
cchpeError ? '错误代码:' + cchpeError + '。' : '');
});
};
// 显示提交状态
var submitting = function () {
$dl.html('<div style="text-align:center">' + wgULS('提交中...', '提交中...') + '</div>' +
'<p>' + wgULS('请确保网络畅通并耐心等待几秒钟', '請確保網路暢通並耐心等待幾秒鐘') + '</p>');
$dl.dialog("option", "buttons", []);
};
// 显示提交结果
var showResult = function (dcSuccess, cchpeSuccess, dcContribution, cchpeContribution, dcReason, cchpeReason) {
var html = '<div style="text-align:center">';
if (dcSuccess && cchpeSuccess) {
html += wgULS('提交完成!', '提交完成!');
} else if (!dcSuccess && !cchpeSuccess) {
html += wgULS('提交失败', '提交失敗');
} else {
html += wgULS('部分提交成功', '部分提交成功');
}
html += '</div>';
if (!dcSuccess || !cchpeSuccess) {
html += '<p>';
if (!dcSuccess) {
html += wgULS('动员令提交失败:' + (dcReason || '未知错误'), '動員令提交失敗:' + (dcReason || '未知錯誤')) + '<br>';
}
if (!cchpeSuccess) {
html += wgULS('中国文化遗产编辑松提交失败:' + (cchpeReason || '未知错误'), '中國文化遺產編輯松提交失敗:' + (cchpeReason || '未知錯誤')) + '<br>';
}
html += wgULS('如需手动编辑,可复制以下源代码', '如需手動編輯,可複製以下原始碼') + '</p>';
if (!dcSuccess && dcContribution) {
html += '<h4>' + wgULS('动员令贡献代码:', '動員令貢獻代碼:') + '</h4>' +
'<pre id="p4js-dc-failed-edit-content">' + dcContribution + '</pre>';
}
if (!cchpeSuccess && cchpeContribution) {
html += '<h4>' + wgULS('中国文化遗产编辑松贡献代码:', '中國文化遺產編輯松貢獻代碼:') + '</h4>' +
'<pre id="p4js-cchpe-failed-edit-content">' + cchpeContribution + '</pre>';
}
html += '<p>' + wgULS('并点击"编辑个人贡献页",根据说明进行编辑。', '並點按"編輯個人貢獻頁",根據說明進行編輯。') +
'<hr>' + wgULS('如有疑问,您可以<a href="https://t.me/wikipedia_zh_DC">加入Telegram讨论群组</a>询问我们的志愿者,或<a href="https://zh.wikipedia.org/w/index.php?title=Wikipedia_talk:動員令/第二十三次動員令&action=edit§ion=new">在此处填写您的问题</a>等待志愿者回复。',
'如有疑問,您可以<a href="https://t.me/wikipedia_zh_DC">加入Telegram討論群組</a>詢問我們的志願者,或<a href="https://zh.wikipedia.org/w/index.php?title=Wikipedia_talk:動員令/第二十三次動員令&action=edit§ion=new">在此處填寫您的問題</a>等待志願者回覆。') +
'</p>';
}
$dl.html(html);
var buttons = [];
buttons.push({
text: wgULS('留在本页', '留在本頁'),
click: function () {
$(this).dialog('close');
}
});
if (dcSuccess && isDCActive) {
buttons.push({
text: wgULS('查看动员令提交', '檢視動員令提交'),
click: function () {
window.open(mw.config.get('wgServer') + '/' + mw.config.get('wgArticlePath').replace('$1', dcPersonalPage), '_blank');
}
});
}
if (cchpeSuccess && isCCHPEActive) {
buttons.push({
text: wgULS('查看编辑松提交', '檢視編輯松提交'),
click: function () {
window.open(mw.config.get('wgServer') + '/' + mw.config.get('wgArticlePath').replace('$1', cchpePersonalPage), '_blank');
}
});
}
if ((!dcSuccess && dcContribution) || (!cchpeSuccess && cchpeContribution)) {
buttons.push({
text: wgULS('编辑个人贡献页', '編輯個人貢獻頁'),
click: function () {
if (!dcSuccess && dcContribution) {
window.open(mw.config.get('wgServer') + '/' + mw.config.get('wgArticlePath').replace('$1', dcPersonalPage) + '?action=edit', '_blank');
}
if (!cchpeSuccess && cchpeContribution) {
window.open(mw.config.get('wgServer') + '/' + mw.config.get('wgArticlePath').replace('$1', cchpePersonalPage) + '?action=edit', '_blank');
}
}
});
}
$dl.dialog("option", "buttons", buttons);
};
// 添加按钮
var buttonText = wgULS('提交中国文化遗产编辑松', '提交中國文化遺產編輯松');
$(mw.util.addPortletLink('p-cactions', '#', buttonText)).click(function (e) {
if (!$dl) {
$dl = $(dialogHtml).dialog({
autoOpen: false, minWidth: 1024, minHeight: 256,
buttons: [{
text: wgULS('提交', '提交'),
click: function () {
$.cookie('p4js-dcparticipant-notice', 1, { path: "/", expires: dcEndTime });
postContributions();
}
}]
});
// 自动填入字节数
new mw.Api()
.get({
action: 'query',
prop: 'revisions',
rvprop: 'size',
rvlimit: 1,
titles: mw.config.get('wgPageName'),
formatversion: '2'
})
.then(function (data) {
if (!data.query || !data.query.pages) {
console.log(mw.config.get('wgPageName') + ': unknown error');
return;
}
var page = data.query.pages[0];
if (page.missing) {
console.log(mw.config.get('wgPageName') + ' doesn\'t exist');
return;
} else {
var revisions = page.revisions;
if (revisions && revisions.length && revisions[0]) {
var length = revisions[0].size || 0;
if (length) $('#p4js-dcparticipant-length').val(length);
}
}
})
.fail(function (obj) {
console.log('fetch page failed:', mw.config.get('wgPageName'));
});
}
$dl.dialog('open');
});
})(jQuery, mediaWiki);