本网站正在建设中(~ ̄▽ ̄)~
- 你好~!欢迎来到中文歌声合成个人收集站-VCPedia.cn!
- 若发现页面信息有误或投稿至本站,请联系管理员。
MediaWiki:Gadget-vcep.js
跳到导航
跳到搜索
注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。
- Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
- Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
- Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
- Opera:按 Ctrl-F5。
/*<pre>*/ /* *名称:VC Editor Plus (简称VCEP) *原作者:商火 *现修改者:MilkBoy *版本号:Beta 2.0 *功能描述:辅助VC编辑者的工具集合 */ "use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; $(function () { console.log('VCEP初始化成功') var button = $("<div></div>").addClass("vcep-button").text("启动VCEP"); $("body").append(button); var api = mw.api; var UPlist = [ { data: "A-39", label: "A-39" }, { data: "Ace丨Zero", label: "Ace丨Zero" }, { data: "Adam_K", label: "Adam_K" }, { data: "AfterLight余晖", label: "AfterLight余晖" }, { data: "ANK", label: "ANK" }, { data: "AnnyJuly", label: "AnnyJuly" }, { data: "A叔", label: "A叔" }, { data: "阿碇司令", label: "阿碇司令" }, { data: "阿良良木健", label: "阿良良木健" }, { data: "阿萨", label: "阿萨" }, { data: "阿妍Ayan", label: "阿妍Ayan" }, { data: "阿原Adam", label: "阿原Adam" }, { data: "安陵影钦", label: "安陵影钦" }, { data: "暗猫", label: "暗猫の祝福" }, { data: "BK小鹿", label: "BK小鹿" }, { data: "白光Raphaelwalty", label: "白光Raphaelwalty" }, { data: "Boxstar", label: "Boxstar" }, { data: "崩坏(P主)", label: "崩坏Sovietsy" }, { data: "白夜_P", label: "白夜ビャクヤ" }, { data: "半只金蓝", label: "半只金蓝" }, { data: "北山薇", label: "北山薇" }, { data: "被遗忘者的哀伤", label: "被遗忘者的哀伤" }, { data: "不安琪", label: "不安琪" }, { data: "不鱼", label: "不鱼(电鱼)" }, { data: "CARDINAL星海", label: "CARDINAL星海" }, { data: "cnsouka", label: "cnsouka" }, { data: "Cokoon", label: "Cokoon" }, { data: "COP", label: "COP" }, { data: "Creuzer", label: "Creuzer" }, { data: "沧弦落尘", label: "沧弦落尘" }, { data: "茶茶P", label: "茶茶P" }, { data: "蝉c", label: "蝉c" }, { data: "沉林川", label: "沉林川(贤狼Husky)" }, { data: "晨鹊", label: "晨鹊" }, { data: "樗儿", label: "樗儿(つろP)" }, { data: "初繁言", label: "初繁言" }, { data: "纯白", label: "纯白" }, { data: "磁带君", label: "磁带君" }, { data: "DBRT", label: "DBRT" }, { data: "Ddickky", label: "Ddickky" }, { data: "Dec顾令", label: "Dec顾令" }, { data: "DELA", label: "DELA" }, { data: "Digger", label: "Digger" }, { data: "DOS:Error#", label: "DOS:Error#" }, { data: "大古", label: "大♂古" }, { data: "大九", label: "大九_LN" }, { data: "敌门", label: "敌门" }, { data: "董糖", label: "董糖" }, { data: "动点P", label: "动点P" }, { data: "豆腐P", label: "豆腐P" }, { data: "度娘你要闹哪样", label: "度娘你要闹哪样" }, { data: "ediq", label: "ediq" }, { data: "Evalia", label: "Evalia" }, { data: "厄诺末利P", label: "厄诺末利P(异常矢量/AnomalyVector)" }, { data: "米库喵", label: "恩雅NYA(米库喵)" }, { data: "饭后AfterDinner", label: "饭后AfterDinner" }, { data: "饭団子P", label: "饭団子P" }, { data: "风守miNado", label: "风守miNado" }, { data: "枫音Atsuko", label: "枫音Atsuko" }, { data: "负二价-", label: "负二价-" }, { data: "gfcjyb", label: "gfcjyb" }, { data: "GhostFinal", label: "GhostFinal" }, { data: "G.K", label: "G.K" }, { data: "Grid格子", label: "Grid格子" }, { data: "钢铁信徒", label: "钢铁信徒" }, { data: "鸽稀拉", label: "鸽稀拉(公兔)" }, { data: "卦者灵风", label: "卦者灵风" }, { data: "鬼面P", label: "鬼面P" }, { data: "果汁涼菜", label: "果汁涼菜" }, { data: "Haru.jpg", label: "Haru.jpg(Napstina)" }, { data: "H.K.君", label: "H.K.君" }, { data: "哈士奇P", label: "哈士奇P" }, { data: "海格P", label: "海格P" }, { data: "海仔儿", label: "海仔儿" }, { data: "海鲜面", label: "海鲜面" }, { data: "寒天集萤", label: "寒天集萤" }, { data: "灰儿白", label: "灰儿白" }, { data: "皓月(P主)", label: "皓月" }, { data: "黑白P", label: "黒白P" }, { data: "黑方Serge", label: "黑方Serge" }, { data: "黑猫非猫", label: "黑猫非猫" }, { data: "合目", label: "合目" }, { data: "泓", label: "泓" }, { data: "宏宇", label: "宏宇" }, { data: "花间有鹿来", label: "花间有鹿来" }, { data: "花儿不哭", label: "花儿不哭" }, { data: "花之祭P", label: "花之祭P" }, { data: "夥星P", label: "夥星P" }, { data: "Hanssler", label: "Hanssler" }, { data: "iKz", label: "iKz" }, { data: "ilem", label: "ilem" }, { data: "inoki", label: "inoki" }, { data: "JINX什仲", label: "JINX什仲" }, { data: "JUSF周存", label: "JUSF周存" }, { data: "纪远", label: "纪远" }, { data: "绛舞乱丸", label: "绛舞乱丸" }, { data: "简单的一个φ", label: "简单的一个φ" }, { data: "举烛", label: "举烛" }, { data: "九ミ", label: "九ミ" }, { data: "玖蝶", label: "玖蝶" }, { data: "倔强的苦力怕", label: "倔强的苦力怕" }, { data: "教科书之敌P", label: "教科书之敌P" }, { data: "甲板边缘", label: "甲板边缘" }, { data: "Karane", label: "Karane" }, { data: "KBShinya", label: "KBShinya(塔库)" }, { data: "Kevinz", label: "Kevinz" }, { data: "Kide", label: "Kide" }, { data: "KoiNs", label: "KoiNs" }, { data: "Kolaa", label: "Kolaa" }, { data: "KyuRu", label: "KyuRu" }, { data: "考拉姬", label: "考拉姬" }, { data: "跨海星尘", label: "跨海星尘" }, { data: "葵花fa", label: "葵花fa" }, { data: "空气凝Klean", label: "空气凝Klean" }, { data: "Lanber", label: "Lanber" }, { data: "lemon夹子", label: "lemon夹子" }, { data: "licis", label: "licis" }, { data: "litterzy", label: "litterzy" }, { data: "Li Zong", label: "Li Zong" }, { data: "lizzz", label: "lizzz" }, { data: "LJC", label: "LJC" }, { data: "LS", label: "LS" }, { data: "LKs", label: "LKs" }, { data: "Lthis", label: "Lthis" }, { data: "Luna", label: "LunaSafari" }, { data: "烂兔子P", label: "烂兔子P" }, { data: "狼姬", label: "狼姬" }, { data: "理科生天依酱", label: "理科生天依酱" }, { data: "林墨白", label: "林墨白" }, { data: "泠鸢yousa", label: "泠鸢yousa" }, { data: "流绪", label: "流绪" }, { data: "柳延之", label: "柳延之" }, { data: "胧(音乐人)", label: "胧" }, { data: "泷arisa", label: "泷arisa" }, { data: "乱心", label: "乱心" }, { data: "陆柒柒", label: "陆柒柒" }, { data: "立入禁止", label: "立入禁止" }, { data: "洛微", label: "洛微" }, { data: "绿无", label: "绿无" }, { data: "磷元素P", label: "磷元素P" }, { data: "李阿充", label: "李阿充" }, { data: "MACHWOLF", label: "MACHWOLF" }, { data: "MeLo", label: "MeLo" }, { data: "麦当叔劳劳", label: "麦当叔劳劳" }, { data: "猫腿子P", label: "猫腿子P" }, { data: "毛毛虫P", label: "毛毛虫P" }, { data: "萌蛇", label: "萌蛇" }, { data: "汨罗河童", label: "汨罗河童" }, { data: "棉花P", label: "棉花P" }, { data: "冥凰", label: "冥凰" }, { data: "苗库里Owo", label: "苗库里Owo" }, { data: "墨白茜兔", label: "墨白茜兔" }, { data: "墨蓝酱油", label: "墨蓝酱油" }, { data: "陌然", label: "陌然(MoreanP)" }, { data: "墨雨清秋", label: "墨雨清秋" }, { data: "莫与人辩", label: "莫与人辩" }, { data: "木变石", label: "木变石" }, { data: "KitanoNani", label: "なななななに" }, { data: "Nekock·LK", label: "Nekock·LK" }, { data: "拿破仑白克", label: "拿破仑白克" }, { data: "纳兰寻风", label: "纳兰寻风" }, { data: "南语", label: "南语" }, { data: "闹闹", label: "闹闹" }, { data: "鸟爷ToriSama", label: "鸟爷ToriSama" }, { data: "浓缩排骨", label: "浓缩排骨" }, { data: "OQQ", label: "OQQ" }, { data: "平安夜的噩梦", label: "平安夜的噩梦" }, { data: "PoKeR", label: "PoKeR" }, { data: "PTX", label: "PTX" }, { data: "QGRay", label: "QGRay" }, { data: "祈哀", label: "祈哀" }, { data: "迁梦狸", label: "迁梦狸" }, { data: "铅笔", label: "铅笔" }, { data: "潜移默化P", label: "潜移默化P" }, { data: "芹菜猪肉大馄饨", label: "芹菜猪肉大馄饨" }, { data: "溱绫西陌", label: "溱绫西陌" }, { data: "清风疾行", label: "清风疾行" }, { data: "清风之恋", label: "清风之恋" }, { data: "青蓝", label: "青蓝" }, { data: "情侶の敵p", label: "情侶の敵p" }, { data: "清水夕日", label: "清水ユウヒ(脊獣)" }, { data: "靘", label: "靘(青色P)" }, { data: "Ryuu", label: "Ryuu" }, { data: "冉语优", label: "冉语优" }, { data: "瑞安Ryan", label: "瑞安Ryan" }, { data: "46", label: "46" }, { data: "Skyghost-", label: "Skyghost-" }, { data: "Siren", label: "Siren" }, { data: "Snail_蜗牛P", label: "Snail_蜗牛P" }, { data: "Snoi", label: "Snoi" }, { data: "SolPie", label: "SolPie" }, { data: "Srgreen", label: "Srgreen" }, { data: "St", label: "St" }, { data: "St.K4N3", label: "St.K4N3" }, { data: "Suya", label: "Suya" }, { data: "Sya", label: "Sya" }, { data: "叁咉", label: "叁咉" }, { data: "桑葚上的猴子", label: "桑葚上的猴子" }, { data: "杉田朗", label: "杉田朗" }, { data: "神曦_LunA", label: "神曦_LunA" }, { data: "失明少女(VOCALOID职人)", label: "失明少女" }, { data: "舒自均", label: "舒自均" }, { data: "水琹P", label: "水琹P" }, { data: "霜凝玥", label: "霜凝玥" }, { data: "水螅-Hydra", label: "水螅-Hydra" }, { data: "四维空间中的二维生物", label: "四维空间中的二维生物" }, { data: "逝羽", label: "逝羽" }, { data: "苏逸", label: "苏逸(人形兎)" }, { data: "溯回", label: "溯回" }, { data: "T2o", label: "T2o" }, { data: "Tamlite", label: "Tamlite" }, { data: "停電前夜", label: "停電前夜" }, { data: "teac", label: "teac" }, { data: "ToToo", label: "ToToo" }, { data: "Tuno桐音", label: "Tuno桐音" }, { data: "提糯Tino", label: "提糯Tino" }, { data: "他城P", label: "他城P(復一)" }, { data: "一般社员汤", label: "湯ん" }, { data: "唐乐林", label: "唐乐林" }, { data: "天儿", label: "天儿" }, { data: "天然衰", label: "天然衰" }, { data: "天使盐", label: "天使盐" }, { data: "跳蝻", label: "跳蝻" }, { data: "桐叶_tongye", label: "桐叶_tongye" }, { data: "瞳荧", label: "瞳荧" }, { data: "U0__", label: "U0__" }, { data: "UtaeP", label: "UtaeP" }, { data: "Wing翼", label: "Wing翼" }, { data: "WL", label: "WL" }, { data: "WOVOP", label: "WOVOP" }, { data: "王朝", label: "王朝" }, { data: "薇采之依", label: "薇采之依" }, { data: "味素", label: "味素" }, { data: "文祖小t", label: "文祖小t" }, { data: "乌龟Sui", label: "乌龟Sui" }, { data: "无刃妖影", label: "无刃妖影" }, { data: "西涼若若", label: "西涼若若" }, { data: "西门振", label: "西门振" }, { data: "希望索任合资", label: "希望索任合资" }, { data: "枭目moku", label: "枭目moku" }, { data: "小荳(P主)", label: "小荳" }, { data: "小新Xin-Kun", label: "小新Xin-Kun" }, { data: "小野道", label: "小野道" }, { data: "小熠IVAC", label: "小熠IVAC" }, { data: "小宇Cosmos", label: "小宇Cosmos" }, { data: "邪叫教主", label: "邪叫教主" }, { data: "星辉", label: "星辉" }, { data: "星葵", label: "星葵" }, { data: "星璇(P主)", label: "星璇" }, { data: "萧家暮雨", label: "萧家暮雨" }, { data: "杏花包子", label: "杏花包子" }, { data: "YGY", label: "YGY" }, { data: "鱼丸君", label: "鱼丸君" }, { data: "ykykyukai", label: "ykykyukai" }, { data: "野良犬P", label: "野良犬P" }, { data: "壹繠", label: "壹繠" }, { data: "一碗热汤", label: "一碗热汤" }, { data: "伊水_Uryan", label: "伊水_Uryan" }, { data: "伊野奏", label: "伊野奏" }, { data: "依溪禾", label: "依溪禾" }, { data: "萤失Hinano", label: "萤失Hinano" }, { data: "影随龙风", label: "影随龙风" }, { data: "犹狩", label: "犹狩" }, { data: "喻川YuChuan", label: "喻川YuChuan" }, { data: "御江", label: "御江" }, { data: "雨狸", label: "雨狸" }, { data: "雨霖仙", label: "雨霖仙" }, { data: "雨巷独酌", label: "雨巷独酌" }, { data: "裕剑流", label: "裕剑流" }, { data: "媛天徵", label: "媛天徵" }, { data: "原野婆婆纳", label: "原野婆婆纳" }, { data: "幽寂", label: "幽寂" }, { data: "运佳BlackberryP", label: "运佳BlackberryP" }, { data: "壹零1-Zero", label: "壹零1-Zero" }, { data: "月时学怍", label: "月时学怍" }, { data: "盐水是言和水", label: "盐水是言和水" }, { data: "源智大人", label: "源智大人" }, { data: "Zeno", label: "Zeno" }, { data: "Z新豪", label: "Z新豪" }, { data: "战场原妖精", label: "战场原妖精" }, { data: "折v", label: "折v" }, { data: "郑射虎", label: "郑射虎" }, { data: "正弦函数P", label: "正弦函数P" }, { data: "正义铃", label: "正义铃" }, { data: "著小生", label: "著小生" }, { data: "周小蚕", label: "周小蚕" }, { data: "砖厂浪人", label: "砖厂浪人" }, { data: "紫P", label: "紫P" }, { data: "紫荆7x", label: "紫荆7x" }, { data: "籽三", label: "籽三" }, { data: "兰音", label: "兰音" }, { data: "ZOMiG", label: "ZOMiG" }, { data: "瞾天p", label: "瞾天p" }, { data: "坐标P", label: "坐标P" }, { data: "团队", label: "团队" }, { data: "半木生工作室", label: "半木生工作室" }, { data: "彼方人偶", label: "彼方人偶" }, { data: "不动声社", label: "不动声社" }, { data: "不羁阁", label: "不羁阁" }, { data: "初灵社", label: "初灵社" }, { data: "COIN原创音乐工作室", label: "COIN原创音乐工作室" }, { data: "ChiliChill", label: "ChiliChill" }, { data: "大手组", label: "大手组" }, { data: "Days幻梦年华乐团", label: "Days幻梦年华乐团" }, { data: "贰茶社", label: "贰茶社" }, { data: "覆域原创音乐工作室", label: "覆域原创音乐工作室" }, { data: "GMN公会", label: "GMN公会" }, { data: "瓜果瓜秧电视台", label: "瓜果瓜秧电视台" }, { data: "赫尔辛根默斯肯社", label: "赫尔辛根默斯肯社" }, { data: "幻茶会", label: "幻茶会" }, { data: "幻月音乐团", label: "幻月音乐团" }, { data: "静夜社", label: "静夜社" }, { data: "空色幻奏", label: "空色幻奏" }, { data: "灵寰社", label: "灵寰社" }, { data: "离时社", label: "离时社" }, { data: "LittleMusic Studio", label: "LittleMusic Studio" }, { data: "龙皇漫音社", label: "龙皇漫音社" }, { data: "陌云阁", label: "陌云阁" }, { data: "奶牛组", label: "奶牛组" }, { data: "凝曙轩", label: "凝曙轩" }, { data: "NEBULOSA凩星社", label: "NEBULOSA凩星社" }, { data: "北京福托科技开发有限责任公司", label: "平行四界Quadimension" }, { data: "奇音社", label: "奇音社" }, { data: "清文社", label: "清文社" }, { data: "沙雕教", label: "沙雕教" }, { data: "上京急电RECORDS", label: "上京急电RECORDS" }, { data: "Signal-E", label: "Signal-E" }, { data: "Sodatune", label: "Sodatune" }, { data: "踏云社", label: "踏云社" }, { data: "vanguard sound", label: "vanguard sound" }, { data: "V音研", label: "V音研" }, { data: "无名社", label: "无名社" }, { data: "捂脸社", label: "捂脸社" }, { data: "Xylose木糖醇", label: "Xylose木糖醇" }, { data: "汐音社", label: "汐音社" }, { data: "喜灰Doujin社", label: "喜灰Doujin社" }, { data: "音喵工场", label: "音喵工场" }, { data: "银渊社", label: "银渊社" }, { data: "咏吟轩", label: "咏吟轩" }, { data: "DJ Ninja", label: "DJ Ninja" }, { data: "Hydra", label: "Hydra" }, { data: "火蜥", label: "火蜥" }, { data: "玖玲P", label: "玖玲P" }, { data: "Karma(P主)", label: "Karma" }, { data: "林檎desu", label: "林檎desu" }, { data: "MAT", label: "MAT" }, { data: "Mimi Neko", label: "Mimi Neko" }, { data: "Mini", label: "Mini" }, { data: "Project Winehouse", label: "Project Winehouse" }, { data: "SEleA", label: "SEleA" }, { data: "Sky Flight & Kright Wing", label: "Sky Flight & Kright Wing" }, { data: "S2", label: "S2" }, { data: "YIN", label: "YIN" }, { data: "Hong Kong Vocaloid Independent Producers", label: "H.K.V.I.P" }, { data: "VelecTi", label: "VelecTi" }, { data: "Hoskey", label: "Hoskey" }, { data: "yoyo幫尼", label: "yoyo幫尼" }, { data: "鳴櫻", label: "鳴櫻" }, { data: "茶米dav", label: "茶米dav" }, { data: "XL", label: "XL" }, { data: "BTM", label: "BTM" }, { data: "阿六軒", label: "阿六軒" }, { data: "惟(ゆい)", label: "惟(ゆい)" }, { data: "雪楓Yuki", label: "雪楓Yuki" }, { data: "天琴魅歌", label: "天琴魅歌" }, { data: "神隱楓P", label: "神隱楓P" }, { data: "檸檬酸P", label: "檸檬酸P" }, { data: "月犬P", label: "月犬P" }, { data: "VSPOT", label: "VSPOT" }, { data: "閒雜人等", label: "閒雜人等" }, { data: "BE pharma.", label: "BE pharma." }, { data: "K楓悅", label: "K楓悅" }, { data: "晴空和音", label: "晴空和音" }, { data: "天雨路滑製作委員會", label: "天雨路滑製作委員會" }, { data: "LMSP", label: "LMSP" }, { data: "Dr.Yun", label: "Dr.Yun" }, { data: "天水香", label: "天水香" }, ]; var Singerlist = [ { data: "洛天依" }, { data: "言和" }, { data: "乐正绫" }, { data: "乐正龙牙" }, { data: "墨清弦" }, { data: "徵羽摩柯" }, { data: "星尘" }, ]; // 临时函数 function wgULS(str1, str2) { return str1; } // 菜单页面类 var MenuPage = /** @class */ (function (_super) { __extends(MenuPage, _super); function MenuPage(name, config) { var _this = this; config = Object.assign({ label: "Sample page" }, __assign({ expanded: false }, config)); _this = _super.call(this, name, config) || this; _this.label = config.label; _this.level = config.level; _this.icon = config.icon; if (_this.$element.is(":empty")) { _this.$element.text(_this.label); } return _this; } MenuPage.prototype.setupOutlineItem = function () { _super.prototype.setupOutlineItem.call(this); this.outlineItem.setMovable(true).setRemovable(true).setIcon(this.icon).setLevel(this.level).setLabel(this.label); }; return MenuPage; }(OO.ui.PageLayout)); var Field = /** @class */ (function (_super) { __extends(Field, _super); function Field(widget, label, config) { if (label === void 0) { label = null; } if (config === void 0) { config = null; } return _super.call(this, widget, __assign({ label: label }, config)) || this; } return Field; }(OO.ui.FieldLayout)); // 简介页面 var InfoPage = new MenuPage("info", { label: wgULS("简介", "簡介"), icon: "info", content: [ $("<p>") .text("VC Editor Plus(以下简称VCEP)是") .append($("<a>").attr("href", "/User:空翊/萌百VC编辑团队", "title", "User:空翊/萌百VC编辑团队").text("萌百VC区编辑组")) .append("成员") .append($("<a>").attr("href", "/User:商火").attr("title", "User:商火").text("商火")) .append("开发,由前维护员") .append($("<a>").attr("href", "/User:喵萝酱").attr("title", "User:喵萝酱").text("喵萝酱")) .append("和现维护员") .append($("<a>").attr("href", "/User:MilkBoy").attr("title", "User:MilkBoy").text("MilkBoy")) .append("进行更新和维护,面向VC区编辑者进行泛VC(中文歌声合成软件)条目等相关工作的辅助工具,目前仍处于开发状态。"), $("<p>").text("VCEP基于JavaScript,请确保您的浏览器开启了JavaScript功能。"), $("<p>").text("在使用过程中出现的任何问题和意见,请使用QQ或邮箱联系本人。"), ], }); // 通用代码生成界面 var SongTitle = new OO.ui.TextInputWidget({ required: true, placeholder: "请输入歌曲名", }); SongTitle.setValidityFlag(false); var SongTitleForValidation = new Field(SongTitle, "歌曲名"); SongTitle.$input.on("blur", function () { if (SongTitle.getValue() === "") { SongTitleForValidation.setErrors(["请填写歌曲名"]); SongTitle.setValidityFlag(false); } else { SongTitleForValidation.setErrors([]); SongTitle.setValidityFlag(true); } }); var BilibiliVideo = new OO.ui.TextInputWidget({ required: true, placeholder: "请输入B站视频番号(aid/bvid),以av或BV开头", }); BilibiliVideo.setValidityFlag(false); var BilibiliVideoForValidation = new Field(BilibiliVideo, "B站视频番号"); BilibiliVideo.$input.on("blur", function () { if (BilibiliVideo.getValue() === "") { BilibiliVideoForValidation.setErrors(["请填写此字段"]); BilibiliVideo.setValidityFlag(false); } else if (BilibiliVideo.getValue().match(/^(av\d{1,16}|BV1[0-9A-Za-z]{2}4[0-9A-Za-z]{3}1[0-9A-Za-z]{3})$/)) { BilibiliVideoForValidation.setErrors([]); BilibiliVideo.setValidityFlag(true); } else { BilibiliVideoForValidation.setErrors(["请输入正确的格式"]); BilibiliVideo.setValidityFlag(false); } }); var NiconicoVideo = new OO.ui.TextInputWidget({ disabled: true, placeholder: "请输入N站视频番号", }); var NiconicoVideoCheck = new OO.ui.CheckboxInputWidget({ selected: false, }).on("change", function () { NiconicoVideo.setDisabled(!NiconicoVideoCheck.isSelected()); NiconicoVideo.setRequired(NiconicoVideoCheck.isSelected()); NiconicoVideo.setValidityFlag(!NiconicoVideoCheck.isSelected()); }); var NiconicoVideoForValidation = new OO.ui.ActionFieldLayout(NiconicoVideo, NiconicoVideoCheck, { label: "N站视频番号" }); NiconicoVideoCheck.$element.addClass("vcep-checkbox"); var YoutubeVideo = new OO.ui.TextInputWidget({ disabled: true, placeholder: "请输入Youtube视频ID", }); var YoutubeVideoCheck = new OO.ui.CheckboxInputWidget({ selected: false, }).on("change", function () { YoutubeVideo.setDisabled(!YoutubeVideoCheck.isSelected()); YoutubeVideo.setRequired(YoutubeVideoCheck.isSelected()); YoutubeVideo.setValidityFlag(!YoutubeVideoCheck.isSelected()); }); var YoutubeVideoForValidation = new OO.ui.ActionFieldLayout(YoutubeVideo, YoutubeVideoCheck, { label: "Youtube视频ID" }); YoutubeVideoCheck.$element.addClass("vcep-checkbox"); var Uploader = new OO.ui.ComboBoxInputWidget({ required: true, validate: "non-empty", placeholder: "请输入UP主", options: UPlist, menu: { filterFromInput: true }, }); Uploader.setValidityFlag(false); var UploaderForValidation = new Field(Uploader, "UP主"); Uploader.$input.on("blur", function () { if (Uploader.getValue() === "") { UploaderForValidation.setErrors(["请选择一名UP主"]); Uploader.setValidityFlag(false); } else { UploaderForValidation.setErrors([]); Uploader.setValidityFlag(true); } }); var UploadTime = new OO.ui.TextInputWidget({ required: true, placeholder: "请输入日期(格式:yyyy-mm-dd,例如 2023-12-3 或 2023-9-05)", }); UploadTime.setValidityFlag(false); var UploadTimeForValidation = new Field(UploadTime, "上传时间"); UploadTime.$input.on("blur", function () { var value = UploadTime.getValue(); if (value === "") { UploadTimeForValidation.setErrors(["请填写投稿日期"]); UploadTime.setValidityFlag(false); // console.log(UploadTime.hasFlag("ValidationError")); } else { var match = value.match(/^(\d{4})-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])$/); if (match) { // 提取年、月、日并转换为数字 var year = parseInt(match[1]); var month = parseInt(match[2]); var day = parseInt(match[3]); // 创建 Date 对象验证 var date = new Date(year, month - 1, day); var isValid = date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day; if (isValid) { UploadTimeForValidation.setErrors([]); UploadTime.setValidityFlag(true); } else { UploadTimeForValidation.setErrors(["日期不存在"]); UploadTime.setValidityFlag(false); } } else { UploadTimeForValidation.setErrors(["日期格式错误,请使用 yyyy-mm-dd 格式"]); UploadTime.setValidityFlag(false); } } }); var Singer = new OO.ui.MenuTagMultiselectWidget({ allowArbitrary: true, options: Singerlist, }); function SingerCheck() { if (Singer.getValue().length === 0) { SingerForValidation.setErrors(["请至少选择一名歌姬"]); } else { SingerForValidation.setErrors([]); } } Singer.on('add', SingerCheck); Singer.on('remove', SingerCheck); var SingerForValidation = new Field(Singer, "演唱歌姬"); var PictureChoose = new OO.ui.RadioSelectInputWidget({ options: [ { data: "upload", label: "上传图片" }, { data: "choose", label: "选择现有图片" }, ], }).on("change", function (item) { if (item === "upload") { PictureUploader.setDisabled(false); PictureSource.toggle(true); PictureCategory.toggle(true); PictureUploadButton.toggle(true); } else { PictureUploader.setDisabled(true); PictureSource.toggle(false); PictureCategory.toggle(false); PictureUploadButton.toggle(false); } }); var PictureChooseForValidation = new Field(PictureChoose, "封面图片选择"); var PictureSource = new Field(new OO.ui.TextInputWidget({ placeholder: "请输入图片来源", }), "图片来源"); var PictureCategory = new Field(new OO.ui.TextInputWidget({ placeholder: "请输入图片分类", }), "图片分类"); var PictureUploader = new OO.ui.SelectFileInputWidget({ accept: ["image/*"], showDropTarget: true, placeholder: "请选择封面图片", }).on('change', function () { PictureTitle.setValue(PictureUploader.getFilename()); PictureName = PictureUploader.getFilename(); FileNameCheck(); }); var PictureUploaderForValidation = new Field(PictureUploader, "封面图片上传"); var PictureUploadButton = new Field(new OO.ui.ButtonWidget({ label: "上传图片", flags: ["primary", "progressive"], }).on("click", function () { PictureUploadHint.toggle(false); PictureUploadProgress.toggle(true); PictureUploader.setDisabled(true); PictureUploadButton.getField().setDisabled(true); PictureCategory.getField().setDisabled(true); PictureSource.getField().setDisabled(true); PictureTitle.setDisabled(true); PictureChoose.setDisabled(true); api.get({ action: 'query', meta: 'tokens', type: 'csrf' }).then(function (data) { var token = data.query.tokens.crsftoken; var formData = new FormData(); formData.append('action', 'upload'); formData.append('format', 'json'); formData.append('filename', PictureTitle.getValue()); formData.append('file', PictureUploader.getValue()[0]); formData.append('token', token); return api.postWithToken('csrf', { action: 'upload', format: 'json', file: PictureUploader.getValue()[0], filename: PictureTitle.getValue(), token: token, }, formData); }).then(function (response) { PictureUploadHint.toggle(true); console.log('上传成功:', response); if (response.upload.result === 'Success') { PictureUploadHint.setType('success'); PictureUploadHint.setLabel("上传成功"); } else { PictureUploadHint.setType('error'); PictureUploadHint.setLabel("上传失败"); } }).catch(function (error) { console.error('上传失败:', error); PictureUploadHint.setType('error'); PictureUploadHint.setLabel("上传失败"); }).finally(function () { PictureUploadProgress.toggle(false); PictureUploadProgress.toggle(false); PictureUploader.setDisabled(false); PictureUploadButton.getField().setDisabled(false); PictureCategory.getField().setDisabled(false); PictureSource.getField().setDisabled(false); PictureTitle.setDisabled(false); PictureChoose.setDisabled(false); }); console.log(PictureSource); }), "上传图片", { help: "请确保图片来源和分类已填写" }); var PictureName = ''; var PictureTitle = new OO.ui.TextInputWidget({ required: true, validate: "non-empty", placeholder: "请输入图片标题,带后缀名", }).on('blur', function () { if (PictureTitle.getValue() !== PictureName) { FileNameCheck(); } PictureName = PictureTitle.getValue(); }); PictureTitle.setValidityFlag(false); var PictureTitleForValidation = new Field(PictureTitle, "封面图片标题"); PictureTitle.$input.on("blur", function () { var value = PictureTitle.getValue(); var allowedExtensions = /\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i; // 支持的后缀列表 var validFilename = /^[^\/*?"<>|]+$/; // 禁止文件名非法字符 if (value === "") { PictureTitleForValidation.setErrors(["请填写图片标题"]); } else if (!validFilename.test(value.split(".")[0])) { PictureTitleForValidation.setErrors(['文件名含非法字符(/*?"<>|)']); } else if (!value.includes(".")) { PictureTitleForValidation.setErrors(["缺少文件后缀名"]); } else if (!allowedExtensions.test(value)) { PictureTitleForValidation.setErrors(["仅支持 jpg/jpeg/png/gif/webp/bmp/svg 格式"]); } else { PictureTitleForValidation.setErrors([]); // 验证通过 } }); var PictureInfo = new OO.ui.TextInputWidget(); var Introduction = new OO.ui.MultilineTextInputWidget({ rows: 5, autosize: true, placeholder: "请输入额外简介描述,可以输入wikitext", }); var Lyrics = new OO.ui.MultilineTextInputWidget({ required: true, rows: 8, autosize: true, placeholder: "请输入歌词,可以输入wikitext", validate: "non-empty", }); Lyrics.setValidityFlag(false); var LyricsForValidation = new Field(Lyrics, "歌词"); Lyrics.$input.on("blur", function () { if (Lyrics.getValue() === "") { LyricsForValidation.setErrors(["请填写歌词"]); Lyrics.setValidityFlag(false); } else { LyricsForValidation.setErrors([]); Lyrics.setValidityFlag(true); } }); var PictureUploadProgress = new OO.ui.ProgressBarWidget({ progress: false }); PictureUploadProgress.toggle(false); var Result = new OO.ui.MultilineTextInputWidget({ rows: 10, autosize: true, placeholder: "生成的代码将会显示在这里", disabled: true, }); var ResultButton = new OO.ui.ButtonWidget({ label: "生成代码", flags: ["primary", "progressive"], }).on("click", updateResult); var PictureNameProgress = new OO.ui.ProgressBarWidget({ progress: false }); PictureNameProgress.toggle(false); var PictureNameHint = new OO.ui.MessageWidget({ showClose: true, }); var PictureUploadHint = new OO.ui.MessageWidget({ showClose: true, }); PictureNameHint.toggle(false); var ResultHint = new OO.ui.MessageWidget({ showClose: true }); ResultHint.toggle(false); var CodeGenPage = new MenuPage("codegen", { label: wgULS("通用代码生成", "通用代碼生成"), icon: "code", content: [ SongTitleForValidation, BilibiliVideoForValidation, NiconicoVideoForValidation, YoutubeVideoForValidation, UploaderForValidation, UploadTimeForValidation, SingerForValidation, PictureChooseForValidation, PictureUploaderForValidation, PictureNameProgress, PictureNameHint, PictureSource, PictureCategory, PictureTitleForValidation, PictureUploadProgress, PictureUploadButton, new Field(PictureInfo, "封面图片描述"), new Field(Introduction, "简介"), LyricsForValidation, new Field(ResultButton, "生成代码"), ResultHint, new Field(Result, "生成结果"), ], }); function FileNameCheck() { PictureUploader.setDisabled(true); PictureTitle.setDisabled(true); PictureNameProgress.toggle(true); var Filename = PictureTitle.getValue(); api.get({ "action": "query", "format": "json", "list": "allimages", "utf8": 1, "aifrom": Filename, "aito": Filename, "ailimit": "1" }).then(function (data) { var res = JSON.parse(data); if (res.query.allimages.length !== 0) { PictureNameHint.toggle(true); PictureNameHint.setType("error"); PictureNameHint.setLabel("文件名已存在,请更换文件名"); PictureTitle.setValidityFlag(false); } else { PictureNameHint.toggle(false); PictureTitle.setValidityFlag(true); } }).finally(function () { PictureUploader.setDisabled(false); PictureTitle.setDisabled(false); PictureNameProgress.toggle(false); }); } function FormatDate() { var date = UploadTime.getValue(); var _a = date.split("-"), year = _a[0], month = _a[1], day = _a[2]; var dateObj = new Date(Number(year), Number(month) - 1, Number(day)); return "".concat(dateObj.getFullYear(), "\u5E74").concat(dateObj.getMonth() + 1, "\u6708").concat(dateObj.getDate(), "\u65E5"); } function FormCheck() { SongTitle.blur(); BilibiliVideo.blur(); NiconicoVideo.blur(); YoutubeVideo.blur(); Uploader.blur(); UploadTime.blur(); PictureTitle.blur(); Lyrics.blur(); if (Singer.getValue().length === 0) { SingerForValidation.setErrors(["请至少选择一名歌姬"]); } else { SingerForValidation.setErrors([]); } var _SongTitle = SongTitleForValidation.$messages.html() === ''; var _BilibiliVideo = BilibiliVideoForValidation.$messages.html() === ''; var _NiconicoVideo = NiconicoVideoForValidation.$messages.html() === ''; var _YoutubeVideo = YoutubeVideoForValidation.$messages.html() === ''; var _Uploader = UploaderForValidation.$messages.html() === ''; var _UploadTime = UploadTimeForValidation.$messages.html() === ''; var _Singer = SingerForValidation.$messages.html() === ''; var _PictureTitle = PictureTitleForValidation.$messages.html() === ''; var _Lyrics = LyricsForValidation.$messages.html() === ''; if (!_SongTitle || !_BilibiliVideo || !_NiconicoVideo || !_YoutubeVideo || !_Uploader || !_UploadTime || !_Singer || !_PictureTitle || !_Lyrics) { return false; } else { return true; } } function updateResult() { ResultHint.toggle(true); if (!FormCheck()) { ResultHint.setType("error"); ResultHint.setLabel("请检查表单必填项是否填写正确"); return; } ResultHint.setType('success'); ResultHint.setLabel("代码生成成功,已复制到剪贴板"); var _SongTitle = SongTitle.getValue(); var _BilibiliVideo = BilibiliVideo.getValue(); var _NiconicoVideo = NiconicoVideo.getValue(); var _YoutubeVideo = YoutubeVideo.getValue(); var _Uploader = "[[".concat(Uploader.getValue(), "]]"); var _UploadTime = FormatDate(); var _Singer = Singer.getValue() .map(function (item) { return (item = "[[".concat(item, "]]")); }) .join("、"); var _PictureTitle = PictureTitle.getValue(); var _PictureInfo = PictureInfo.getValue(); var _Introduction = Introduction.getValue(); var _Lyrics = Lyrics.getValue(); var TemplateResult = "{{VOCALOID_Songbox\n|image = ".concat(_PictureTitle).concat(_PictureInfo ? "\n|\u56FE\u7247\u4FE1\u606F = ".concat(_PictureInfo) : "", "\n|\u6F14\u5531 = ").concat(_Singer, "\n|\u6B4C\u66F2\u540D\u79F0 = ").concat(_SongTitle, "\n|UP\u4E3B = ").concat(_Uploader, "\n|bb_id = ").concat(_BilibiliVideo, "\n|\u6295\u7A3F\u65F6\u95F4 = ").concat(_UploadTime, "\n|\u518D\u751F = {{BilibiliCount|id=").concat(_BilibiliVideo, "}}\n}}"); var IntroductionResult = "== \u7B80\u4ECB ==\n\u300A'''".concat(_SongTitle, "'''\u300B\u662F").concat(_Uploader, "\u4E8E").concat(_UploadTime, "\u6295\u7A3F\u81F3[[bilibili]]\u7684[[VOCALOID]]\u4E2D\u6587\u539F\u521B\u6B4C\u66F2\uFF0C\u7531").concat(_Singer, "\u6F14\u5531\u3002\u622A\u81F3\u76EE\u524D\u5DF2\u6709{{BilibiliCount|id=").concat(_BilibiliVideo, "}}\u6B21\u89C2\u770B\uFF0C{{BilibiliCount|id=").concat(_BilibiliVideo, "|type=4}}\u4EBA\u6536\u85CF\u3002").concat(_Introduction ? "\n\n".concat(_Introduction) : ""); var SongResult = "== \u6B4C\u66F2 ==\n{{BilibiliVideo|id=".concat(_BilibiliVideo, "}}"); var LyricResult = "== \u6B4C\u8BCD ==\n<poem>\n".concat(_Lyrics, "\n</poem>"); var EndnoteResult = "== \u6CE8\u91CA ==\n<references/>\n[[\u5206\u7C7B:\u4E2D\u56FD\u97F3\u4E50\u4F5C\u54C1]]"; var ResultString = "".concat(TemplateResult, "\n\n").concat(IntroductionResult, "\n\n").concat(SongResult, "\n\n").concat(LyricResult, "\n\n").concat(EndnoteResult); Result.setValue(ResultString); navigator.clipboard.writeText(ResultString); } // 快捷访问页面 var LinkPage = new MenuPage("link", { label: wgULS("快捷访问", "快捷訪問"), icon: "link", content: [ $("<ul>") .append($("<li>").append($("<a>").attr("href", "/Special:特殊页面").text("Special:特殊页面"))) .append($("<li>").append($("<a>").attr("href", "/Category:帮助").text("Category:帮助"))) .append($("<li>").append($("<a>").attr("href", "/Category:格式模板").text("Category:格式模板"))) .append($("<li>") .append($("<b>").text("api")) .append("-B站数据获得网址(") .append($("<a>") .attr("href", "https://www.mywiki.cn/dgck81lnn/index.php/%E5%93%94%E5%93%A9%E5%93%94%E5%93%A9API%E8%AF%A6%E8%A7%A3") .text("食用说明")) .append(")") .append($("<ul>") .append($("<li>").append($("<a>") .attr("href", "https://api.bilibili.com/archive_stat/stat?aid=") .text("B站数据获得网址(av版,请输入纯数字)"))) .append($("<li>").append($("<a>").attr("href", "https://api.bilibili.com/x/web-interface/view?bvid=").text("B站数据获得网址(BV版)"))))) .append($("<li>") .append("相关") .append($("<b>").text("讨论页面")) .append($("<ul>").append($("<li>").append($("<a>").attr("href", "/Talk:VOCALOID中文殿堂曲").text("VOCALOID中文殿堂曲"))))), $("<ul>") .append($("<li>").append($("<b>").text("导航/题头模板"))) .append($("<ul>") .text("VOCALOID中文") .append($("<ul>") .append($("<li>") .append($("<a>").attr("href", "/Template:VOCALOID中文殿堂曲导航").text("殿堂曲导航")) .append("/") .append($("<a>").attr("href", "/Template:VOCALOID中文殿堂曲题头").text("殿堂曲题头"))) .append($("<li>") .append($("<a>").attr("href", "/Template:VOCALOID中文传说曲导航").text("传说曲导航")) .append("/") .append($("<a>").attr("href", "/Template:VOCALOID中文传说曲题头").text("传说曲题头"))) .append($("<li>") .append($("<a>").attr("href", "/Template:VOCALOID中文神话曲导航").text("神话曲导航")) .append("/") .append($("<a>").attr("href", "/Template:VOCALOID中文神话曲题头").text("神话曲题头"))))) .append($("<ul>") .text("UTAU中文") .append($("<ul>") .append($("<li>") .append($("<a>").attr("href", "/Template:UTAU中文殿堂曲导航").text("殿堂曲导航")) .append("/") .append($("<a>").attr("href", "/Template:UTAU中文殿堂曲题头").text("殿堂曲题头"))) .append($("<li>") .append($("<a>").attr("href", "/Template:UTAU中文传说曲导航").text("传说曲导航")) .append("/") .append($("<a>").attr("href", "/Template:UTAU中文传说曲题头").text("传说曲题头"))))) .append($("<ul>") .text("Synthesizer V中文") .append($("<ul>") .append($("<li>") .append($("<a>").attr("href", "/Template:Synthesizer V中文殿堂曲导航").text("殿堂曲导航")) .append("/") .append($("<a>").attr("href", "/Template:Synthesizer V中文殿堂曲题头").text("殿堂曲题头"))) .append($("<li>") .append($("<a>").attr("href", "/Template:Synthesizer V中文传说曲导航").text("传说曲导航")) .append("/") .append($("<a>").attr("href", "/Template:Synthesizer V中文传说曲题头").text("传说曲题头"))))) .append($("<li>").append($("<a>").attr("href", "/User:商火/课室").text("Wiki语言进阶教程"))) .append($("<li>").append($("<a>").attr("href", "/User:JackBlock/渐变色使用").text("渐变色使用整理"))) .append($("<li>").append($("<a>").attr("href", "/User:喵萝酱/P主颜色").text("P主模板颜色汇整"))) .append($("<li>").append($("<a>").attr("href", "/VOCALOID中文殿堂曲/VC编辑指引").text("VC编辑指引"))) .append($("<li>").append($("<a>").attr("href", "/VOCALOID中文殿堂曲/VC编辑指引/VC之P主相关收录规则").text("VC之P主相关收录规则"))), $("<ul>") .append($("<li>").append($("<b>").text("歌姬模板"))) .append($("<ul>") .text("VOCALOID") .append($("<ul>") .append($("<li>").append($("<a>").attr("href", "/Template:洛天依").text("Template:洛天依"))) .append($("<li>").append($("<a>").attr("href", "/Template:言和").text("Template:言和"))) .append($("<li>").append($("<a>").attr("href", "/Template:乐正绫").text("Template:乐正绫"))) .append($("<li>").append($("<a>").attr("href", "/Template:乐正龙牙").text("Template:乐正龙牙"))) .append($("<li>").append($("<a>").attr("href", "/Template:徵羽摩柯").text("Template:徵羽摩柯"))) .append($("<li>").append($("<a>").attr("href", "/Template:墨清弦").text("Template:墨清弦"))) .append($("<li>").append($("<a>").attr("href", "/Template:初音未来(中文)").text("Template:初音未来(中文)"))) .append($("<li>").append($("<a>").attr("href", "/Template:心华").text("Template:心华"))) .append($("<li>").append($("<a>").attr("href", "/Template:星尘").text("Template:星尘"))) .append($("<li>").append($("<a>").attr("href", "/Template:悦成").text("Template:悦成"))) .append($("<li>").append($("<a>").attr("href", "/Template:章楚楚").text("Template:章楚楚"))))) .append($("<ul>") .text("Synthesizer V") .append($("<ul>") .append($("<li>").append($("<a>").attr("href", "/Template:艾可").text("Template:艾可"))) .append($("<li>").append($("<a>").attr("href", "/Template:赤羽").text("Template:赤羽"))) .append($("<li>").append($("<a>").attr("href", "/Template:诗岸").text("Template:诗岸"))) .append($("<li>").append($("<a>").attr("href", "/Template:苍穹(平行四界)").text("Template:苍穹"))) .append($("<li>").append($("<a>").attr("href", "/Template:海伊").text("Template:海伊"))) .append($("<li>").append($("<a>").attr("href", "/Template:牧心").text("Template:牧心"))) .append($("<li>").append($("<a>").attr("href", "/Template:Minus").text("Template:Minus"))) .append($("<li>").append($("<a>").attr("href", "/Template:心华").text("Template:心华"))))) .append($("<ul>") .text("Sharpkey") .append($("<ul>") .append($("<li>").append($("<a>").attr("href", "/Template:幻晓伊").text("Template:幻晓伊"))) .append($("<li>").append($("<a>").attr("href", "/Template:琪亚娜 卡斯兰娜").text("Template:琪亚娜 卡斯兰娜"))) .append($("<li>").append($("<a>").attr("href", "/Template:元筱").text("Template:元筱"))))) .append($("<ul>") .text("MUTA") .append($("<ul>") .append($("<li>").append($("<a>").attr("href", "/Template:嫣汐").text("Template:嫣汐"))) .append($("<li>").append($("<a>").attr("href", "/Template:琥珀虚颜").text("Template:琥珀虚颜"))) .append($("<li>").append($("<a>").attr("href", "/Template:未央").text("Template:未央"))))), ], }); var pages = [InfoPage, CodeGenPage, LinkPage]; // 主菜单类 var Menu = /** @class */ (function (_super) { __extends(Menu, _super); function Menu() { return _super !== null && _super.apply(this, arguments) || this; } Menu.prototype.initialize = function () { _super.prototype.initialize.call(this); this.bookletLayout = new OO.ui.BookletLayout({ expanded: true, outlined: true, }).addPages(pages); this.$body.append(this.bookletLayout.$element); }; Menu.prototype.getBodyHeight = function () { return 600; }; Menu.prototype.makeItems = function () { return [0, 1, 2, 3, 4].map(function (val) { return new OO.ui.MenuOptionWidget({ data: val, label: String(val), }); }); }; Menu.prototype.getActionProcess = function (action) { var _this = this; if (action) { return new OO.ui.Process(function () { _this.close({ action: action }); }); } return _super.prototype.getActionProcess.call(this, action); }; Menu.static = { name: "vcep", title: "VC Editor Plus", size: "larger", actions: [{ action: "cancel", label: "Cancel", flags: ["safe", "close"] }], }; return Menu; }(OO.ui.ProcessDialog)); // 窗口管理器 var windowManager = new OO.ui.WindowManager(); $(document.body).append(windowManager.$element); var dialog = new Menu(); windowManager.addWindows([dialog]); button.on("click", function () { windowManager.openWindow(dialog); }); }); /*</pre>*/