跳转到内容

User:Kcx36/JS/sandbox.js

维基百科,自由的百科全书
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google ChromeFirefoxMicrosoft EdgeSafari:按住⇧ 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 (!isDCActive && !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 = 'User:Kcx36/沙盒48/' + username;
	var cchpePersonalPage = 'User:Kcx36/沙盒47/' + 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>&nbsp;&nbsp;';
		}
		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&section=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&section=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&section=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&section=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' +
				'|目标=' + tar + '\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&section=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&section=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 = isCCHPEActive ?
		(isDCActive ? wgULS('提交贡献', '提交貢獻') : wgULS('提交中国文化遗产编辑松', '提交中國文化遺產編輯松')) :
		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);