本网站正在建设中(~ ̄▽ ̄)~

  • 你好~!欢迎来到中文歌声合成个人收集站-VCPedia.cn!
  • 若发现页面信息有误投稿至本站,请联系管理员。

MediaWiki:Gadget-vcep.js

VCPedia.cn ——关于中文歌声合成的一切。
MilkBoy讨论 | 贡献2025年2月22日 (六) 19:39的版本
跳到导航 跳到搜索

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的变更的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5Ctrl-R(Mac为⌘-R
  • Google Chrome:Ctrl-Shift-R(Mac为⌘-Shift-R
  • Internet Explorer或Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5
  • Opera:Ctrl-F5
  1. /*<pre>*/
  2. /*
  3. *名称:VC Editor Plus (简称VCEP)
  4. *原作者:商火
  5. *现修改者:MilkBoy
  6. *版本号:Beta 2.0
  7. *功能描述:辅助VC编辑者的工具集合
  8. */
  9. "use strict";
  10. var __extends = (this && this.__extends) || (function () {
  11. var extendStatics = function (d, b) {
  12. extendStatics = Object.setPrototypeOf ||
  13. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  14. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  15. return extendStatics(d, b);
  16. };
  17. return function (d, b) {
  18. if (typeof b !== "function" && b !== null)
  19. throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  20. extendStatics(d, b);
  21. function __() { this.constructor = d; }
  22. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  23. };
  24. })();
  25. var __assign = (this && this.__assign) || function () {
  26. __assign = Object.assign || function(t) {
  27. for (var s, i = 1, n = arguments.length; i < n; i++) {
  28. s = arguments[i];
  29. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  30. t[p] = s[p];
  31. }
  32. return t;
  33. };
  34. return __assign.apply(this, arguments);
  35. };
  36. $(function () {
  37. console.log('VCEP初始化成功')
  38. var button = $("<div></div>").addClass("vcep-button").text("启动VCEP");
  39. $(".wrapper").append(button);
  40. var api = mw.api;
  41. var UPlist = [
  42. { data: "A-39", label: "A-39" },
  43. { data: "Ace丨Zero", label: "Ace丨Zero" },
  44. { data: "Adam_K", label: "Adam_K" },
  45. { data: "AfterLight余晖", label: "AfterLight余晖" },
  46. { data: "ANK", label: "ANK" },
  47. { data: "AnnyJuly", label: "AnnyJuly" },
  48. { data: "A叔", label: "A叔" },
  49. { data: "阿碇司令", label: "阿碇司令" },
  50. { data: "阿良良木健", label: "阿良良木健" },
  51. { data: "阿萨", label: "阿萨" },
  52. { data: "阿妍Ayan", label: "阿妍Ayan" },
  53. { data: "阿原Adam", label: "阿原Adam" },
  54. { data: "安陵影钦", label: "安陵影钦" },
  55. { data: "暗猫", label: "暗猫の祝福" },
  56. { data: "BK小鹿", label: "BK小鹿" },
  57. { data: "白光Raphaelwalty", label: "白光Raphaelwalty" },
  58. { data: "Boxstar", label: "Boxstar" },
  59. { data: "崩坏(P主)", label: "崩坏Sovietsy" },
  60. { data: "白夜_P", label: "白夜ビャクヤ" },
  61. { data: "半只金蓝", label: "半只金蓝" },
  62. { data: "北山薇", label: "北山薇" },
  63. { data: "被遗忘者的哀伤", label: "被遗忘者的哀伤" },
  64. { data: "不安琪", label: "不安琪" },
  65. { data: "不鱼", label: "不鱼(电鱼)" },
  66. { data: "CARDINAL星海", label: "CARDINAL星海" },
  67. { data: "cnsouka", label: "cnsouka" },
  68. { data: "Cokoon", label: "Cokoon" },
  69. { data: "COP", label: "COP" },
  70. { data: "Creuzer", label: "Creuzer" },
  71. { data: "沧弦落尘", label: "沧弦落尘" },
  72. { data: "茶茶P", label: "茶茶P" },
  73. { data: "蝉c", label: "蝉c" },
  74. { data: "沉林川", label: "沉林川(贤狼Husky)" },
  75. { data: "晨鹊", label: "晨鹊" },
  76. { data: "樗儿", label: "樗儿(つろP)" },
  77. { data: "初繁言", label: "初繁言" },
  78. { data: "纯白", label: "纯白" },
  79. { data: "磁带君", label: "磁带君" },
  80. { data: "DBRT", label: "DBRT" },
  81. { data: "Ddickky", label: "Ddickky" },
  82. { data: "Dec顾令", label: "Dec顾令" },
  83. { data: "DELA", label: "DELA" },
  84. { data: "Digger", label: "Digger" },
  85. { data: "DOS:Error#", label: "DOS:Error#" },
  86. { data: "大古", label: "大♂古" },
  87. { data: "大九", label: "大九_LN" },
  88. { data: "敌门", label: "敌门" },
  89. { data: "董糖", label: "董糖" },
  90. { data: "动点P", label: "动点P" },
  91. { data: "豆腐P", label: "豆腐P" },
  92. { data: "度娘你要闹哪样", label: "度娘你要闹哪样" },
  93. { data: "ediq", label: "ediq" },
  94. { data: "Evalia", label: "Evalia" },
  95. { data: "厄诺末利P", label: "厄诺末利P(异常矢量/AnomalyVector)" },
  96. { data: "米库喵", label: "恩雅NYA(米库喵)" },
  97. { data: "饭后AfterDinner", label: "饭后AfterDinner" },
  98. { data: "饭団子P", label: "饭団子P" },
  99. { data: "风守miNado", label: "风守miNado" },
  100. { data: "枫音Atsuko", label: "枫音Atsuko" },
  101. { data: "负二价-", label: "负二价-" },
  102. { data: "gfcjyb", label: "gfcjyb" },
  103. { data: "GhostFinal", label: "GhostFinal" },
  104. { data: "G.K", label: "G.K" },
  105. { data: "Grid格子", label: "Grid格子" },
  106. { data: "钢铁信徒", label: "钢铁信徒" },
  107. { data: "鸽稀拉", label: "鸽稀拉(公兔)" },
  108. { data: "卦者灵风", label: "卦者灵风" },
  109. { data: "鬼面P", label: "鬼面P" },
  110. { data: "果汁涼菜", label: "果汁涼菜" },
  111. { data: "Haru.jpg", label: "Haru.jpg(Napstina)" },
  112. { data: "H.K.君", label: "H.K.君" },
  113. { data: "哈士奇P", label: "哈士奇P" },
  114. { data: "海格P", label: "海格P" },
  115. { data: "海仔儿", label: "海仔儿" },
  116. { data: "海鲜面", label: "海鲜面" },
  117. { data: "寒天集萤", label: "寒天集萤" },
  118. { data: "灰儿白", label: "灰儿白" },
  119. { data: "皓月(P主)", label: "皓月" },
  120. { data: "黑白P", label: "黒白P" },
  121. { data: "黑方Serge", label: "黑方Serge" },
  122. { data: "黑猫非猫", label: "黑猫非猫" },
  123. { data: "合目", label: "合目" },
  124. { data: "泓", label: "泓" },
  125. { data: "宏宇", label: "宏宇" },
  126. { data: "花间有鹿来", label: "花间有鹿来" },
  127. { data: "花儿不哭", label: "花儿不哭" },
  128. { data: "花之祭P", label: "花之祭P" },
  129. { data: "夥星P", label: "夥星P" },
  130. { data: "Hanssler", label: "Hanssler" },
  131. { data: "iKz", label: "iKz" },
  132. { data: "ilem", label: "ilem" },
  133. { data: "inoki", label: "inoki" },
  134. { data: "JINX什仲", label: "JINX什仲" },
  135. { data: "JUSF周存", label: "JUSF周存" },
  136. { data: "纪远", label: "纪远" },
  137. { data: "绛舞乱丸", label: "绛舞乱丸" },
  138. { data: "简单的一个φ", label: "简单的一个φ" },
  139. { data: "举烛", label: "举烛" },
  140. { data: "九ミ", label: "九ミ" },
  141. { data: "玖蝶", label: "玖蝶" },
  142. { data: "倔强的苦力怕", label: "倔强的苦力怕" },
  143. { data: "教科书之敌P", label: "教科书之敌P" },
  144. { data: "甲板边缘", label: "甲板边缘" },
  145. { data: "Karane", label: "Karane" },
  146. { data: "KBShinya", label: "KBShinya(塔库)" },
  147. { data: "Kevinz", label: "Kevinz" },
  148. { data: "Kide", label: "Kide" },
  149. { data: "KoiNs", label: "KoiNs" },
  150. { data: "Kolaa", label: "Kolaa" },
  151. { data: "KyuRu", label: "KyuRu" },
  152. { data: "考拉姬", label: "考拉姬" },
  153. { data: "跨海星尘", label: "跨海星尘" },
  154. { data: "葵花fa", label: "葵花fa" },
  155. { data: "空气凝Klean", label: "空气凝Klean" },
  156. { data: "Lanber", label: "Lanber" },
  157. { data: "lemon夹子", label: "lemon夹子" },
  158. { data: "licis", label: "licis" },
  159. { data: "litterzy", label: "litterzy" },
  160. { data: "Li Zong", label: "Li Zong" },
  161. { data: "lizzz", label: "lizzz" },
  162. { data: "LJC", label: "LJC" },
  163. { data: "LS", label: "LS" },
  164. { data: "LKs", label: "LKs" },
  165. { data: "Lthis", label: "Lthis" },
  166. { data: "Luna", label: "LunaSafari" },
  167. { data: "烂兔子P", label: "烂兔子P" },
  168. { data: "狼姬", label: "狼姬" },
  169. { data: "理科生天依酱", label: "理科生天依酱" },
  170. { data: "林墨白", label: "林墨白" },
  171. { data: "泠鸢yousa", label: "泠鸢yousa" },
  172. { data: "流绪", label: "流绪" },
  173. { data: "柳延之", label: "柳延之" },
  174. { data: "胧(音乐人)", label: "胧" },
  175. { data: "泷arisa", label: "泷arisa" },
  176. { data: "乱心", label: "乱心" },
  177. { data: "陆柒柒", label: "陆柒柒" },
  178. { data: "立入禁止", label: "立入禁止" },
  179. { data: "洛微", label: "洛微" },
  180. { data: "绿无", label: "绿无" },
  181. { data: "磷元素P", label: "磷元素P" },
  182. { data: "李阿充", label: "李阿充" },
  183. { data: "MACHWOLF", label: "MACHWOLF" },
  184. { data: "MeLo", label: "MeLo" },
  185. { data: "麦当叔劳劳", label: "麦当叔劳劳" },
  186. { data: "猫腿子P", label: "猫腿子P" },
  187. { data: "毛毛虫P", label: "毛毛虫P" },
  188. { data: "萌蛇", label: "萌蛇" },
  189. { data: "汨罗河童", label: "汨罗河童" },
  190. { data: "棉花P", label: "棉花P" },
  191. { data: "冥凰", label: "冥凰" },
  192. { data: "苗库里Owo", label: "苗库里Owo" },
  193. { data: "墨白茜兔", label: "墨白茜兔" },
  194. { data: "墨蓝酱油", label: "墨蓝酱油" },
  195. { data: "陌然", label: "陌然(MoreanP)" },
  196. { data: "墨雨清秋", label: "墨雨清秋" },
  197. { data: "莫与人辩", label: "莫与人辩" },
  198. { data: "木变石", label: "木变石" },
  199. { data: "KitanoNani", label: "なななななに" },
  200. { data: "Nekock·LK", label: "Nekock·LK" },
  201. { data: "拿破仑白克", label: "拿破仑白克" },
  202. { data: "纳兰寻风", label: "纳兰寻风" },
  203. { data: "南语", label: "南语" },
  204. { data: "闹闹", label: "闹闹" },
  205. { data: "鸟爷ToriSama", label: "鸟爷ToriSama" },
  206. { data: "浓缩排骨", label: "浓缩排骨" },
  207. { data: "OQQ", label: "OQQ" },
  208. { data: "平安夜的噩梦", label: "平安夜的噩梦" },
  209. { data: "PoKeR", label: "PoKeR" },
  210. { data: "PTX", label: "PTX" },
  211. { data: "QGRay", label: "QGRay" },
  212. { data: "祈哀", label: "祈哀" },
  213. { data: "迁梦狸", label: "迁梦狸" },
  214. { data: "铅笔", label: "铅笔" },
  215. { data: "潜移默化P", label: "潜移默化P" },
  216. { data: "芹菜猪肉大馄饨", label: "芹菜猪肉大馄饨" },
  217. { data: "溱绫西陌", label: "溱绫西陌" },
  218. { data: "清风疾行", label: "清风疾行" },
  219. { data: "清风之恋", label: "清风之恋" },
  220. { data: "青蓝", label: "青蓝" },
  221. { data: "情侶の敵p", label: "情侶の敵p" },
  222. { data: "清水夕日", label: "清水ユウヒ(脊獣)" },
  223. { data: "靘", label: "靘(青色P)" },
  224. { data: "Ryuu", label: "Ryuu" },
  225. { data: "冉语优", label: "冉语优" },
  226. { data: "瑞安Ryan", label: "瑞安Ryan" },
  227. { data: "46", label: "46" },
  228. { data: "Skyghost-", label: "Skyghost-" },
  229. { data: "Siren", label: "Siren" },
  230. { data: "Snail_蜗牛P", label: "Snail_蜗牛P" },
  231. { data: "Snoi", label: "Snoi" },
  232. { data: "SolPie", label: "SolPie" },
  233. { data: "Srgreen", label: "Srgreen" },
  234. { data: "St", label: "St" },
  235. { data: "St.K4N3", label: "St.K4N3" },
  236. { data: "Suya", label: "Suya" },
  237. { data: "Sya", label: "Sya" },
  238. { data: "叁咉", label: "叁咉" },
  239. { data: "桑葚上的猴子", label: "桑葚上的猴子" },
  240. { data: "杉田朗", label: "杉田朗" },
  241. { data: "神曦_LunA", label: "神曦_LunA" },
  242. { data: "失明少女(VOCALOID职人)", label: "失明少女" },
  243. { data: "舒自均", label: "舒自均" },
  244. { data: "水琹P", label: "水琹P" },
  245. { data: "霜凝玥", label: "霜凝玥" },
  246. { data: "水螅-Hydra", label: "水螅-Hydra" },
  247. { data: "四维空间中的二维生物", label: "四维空间中的二维生物" },
  248. { data: "逝羽", label: "逝羽" },
  249. { data: "苏逸", label: "苏逸(人形兎)" },
  250. { data: "溯回", label: "溯回" },
  251. { data: "T2o", label: "T2o" },
  252. { data: "Tamlite", label: "Tamlite" },
  253. { data: "停電前夜", label: "停電前夜" },
  254. { data: "teac", label: "teac" },
  255. { data: "ToToo", label: "ToToo" },
  256. { data: "Tuno桐音", label: "Tuno桐音" },
  257. { data: "提糯Tino", label: "提糯Tino" },
  258. { data: "他城P", label: "他城P(復一)" },
  259. { data: "一般社员汤", label: "湯ん" },
  260. { data: "唐乐林", label: "唐乐林" },
  261. { data: "天儿", label: "天儿" },
  262. { data: "天然衰", label: "天然衰" },
  263. { data: "天使盐", label: "天使盐" },
  264. { data: "跳蝻", label: "跳蝻" },
  265. { data: "桐叶_tongye", label: "桐叶_tongye" },
  266. { data: "瞳荧", label: "瞳荧" },
  267. { data: "U0__", label: "U0__" },
  268. { data: "UtaeP", label: "UtaeP" },
  269. { data: "Wing翼", label: "Wing翼" },
  270. { data: "WL", label: "WL" },
  271. { data: "WOVOP", label: "WOVOP" },
  272. { data: "王朝", label: "王朝" },
  273. { data: "薇采之依", label: "薇采之依" },
  274. { data: "味素", label: "味素" },
  275. { data: "文祖小t", label: "文祖小t" },
  276. { data: "乌龟Sui", label: "乌龟Sui" },
  277. { data: "无刃妖影", label: "无刃妖影" },
  278. { data: "西涼若若", label: "西涼若若" },
  279. { data: "西门振", label: "西门振" },
  280. { data: "希望索任合资", label: "希望索任合资" },
  281. { data: "枭目moku", label: "枭目moku" },
  282. { data: "小荳(P主)", label: "小荳" },
  283. { data: "小新Xin-Kun", label: "小新Xin-Kun" },
  284. { data: "小野道", label: "小野道" },
  285. { data: "小熠IVAC", label: "小熠IVAC" },
  286. { data: "小宇Cosmos", label: "小宇Cosmos" },
  287. { data: "邪叫教主", label: "邪叫教主" },
  288. { data: "星辉", label: "星辉" },
  289. { data: "星葵", label: "星葵" },
  290. { data: "星璇(P主)", label: "星璇" },
  291. { data: "萧家暮雨", label: "萧家暮雨" },
  292. { data: "杏花包子", label: "杏花包子" },
  293. { data: "YGY", label: "YGY" },
  294. { data: "鱼丸君", label: "鱼丸君" },
  295. { data: "ykykyukai", label: "ykykyukai" },
  296. { data: "野良犬P", label: "野良犬P" },
  297. { data: "壹繠", label: "壹繠" },
  298. { data: "一碗热汤", label: "一碗热汤" },
  299. { data: "伊水_Uryan", label: "伊水_Uryan" },
  300. { data: "伊野奏", label: "伊野奏" },
  301. { data: "依溪禾", label: "依溪禾" },
  302. { data: "萤失Hinano", label: "萤失Hinano" },
  303. { data: "影随龙风", label: "影随龙风" },
  304. { data: "犹狩", label: "犹狩" },
  305. { data: "喻川YuChuan", label: "喻川YuChuan" },
  306. { data: "御江", label: "御江" },
  307. { data: "雨狸", label: "雨狸" },
  308. { data: "雨霖仙", label: "雨霖仙" },
  309. { data: "雨巷独酌", label: "雨巷独酌" },
  310. { data: "裕剑流", label: "裕剑流" },
  311. { data: "媛天徵", label: "媛天徵" },
  312. { data: "原野婆婆纳", label: "原野婆婆纳" },
  313. { data: "幽寂", label: "幽寂" },
  314. { data: "运佳BlackberryP", label: "运佳BlackberryP" },
  315. { data: "壹零1-Zero", label: "壹零1-Zero" },
  316. { data: "月时学怍", label: "月时学怍" },
  317. { data: "盐水是言和水", label: "盐水是言和水" },
  318. { data: "源智大人", label: "源智大人" },
  319. { data: "Zeno", label: "Zeno" },
  320. { data: "Z新豪", label: "Z新豪" },
  321. { data: "战场原妖精", label: "战场原妖精" },
  322. { data: "折v", label: "折v" },
  323. { data: "郑射虎", label: "郑射虎" },
  324. { data: "正弦函数P", label: "正弦函数P" },
  325. { data: "正义铃", label: "正义铃" },
  326. { data: "著小生", label: "著小生" },
  327. { data: "周小蚕", label: "周小蚕" },
  328. { data: "砖厂浪人", label: "砖厂浪人" },
  329. { data: "紫P", label: "紫P" },
  330. { data: "紫荆7x", label: "紫荆7x" },
  331. { data: "籽三", label: "籽三" },
  332. { data: "兰音", label: "兰音" },
  333. { data: "ZOMiG", label: "ZOMiG" },
  334. { data: "瞾天p", label: "瞾天p" },
  335. { data: "坐标P", label: "坐标P" },
  336. { data: "团队", label: "团队" },
  337. { data: "半木生工作室", label: "半木生工作室" },
  338. { data: "彼方人偶", label: "彼方人偶" },
  339. { data: "不动声社", label: "不动声社" },
  340. { data: "不羁阁", label: "不羁阁" },
  341. { data: "初灵社", label: "初灵社" },
  342. { data: "COIN原创音乐工作室", label: "COIN原创音乐工作室" },
  343. { data: "ChiliChill", label: "ChiliChill" },
  344. { data: "大手组", label: "大手组" },
  345. { data: "Days幻梦年华乐团", label: "Days幻梦年华乐团" },
  346. { data: "贰茶社", label: "贰茶社" },
  347. { data: "覆域原创音乐工作室", label: "覆域原创音乐工作室" },
  348. { data: "GMN公会", label: "GMN公会" },
  349. { data: "瓜果瓜秧电视台", label: "瓜果瓜秧电视台" },
  350. { data: "赫尔辛根默斯肯社", label: "赫尔辛根默斯肯社" },
  351. { data: "幻茶会", label: "幻茶会" },
  352. { data: "幻月音乐团", label: "幻月音乐团" },
  353. { data: "静夜社", label: "静夜社" },
  354. { data: "空色幻奏", label: "空色幻奏" },
  355. { data: "灵寰社", label: "灵寰社" },
  356. { data: "离时社", label: "离时社" },
  357. { data: "LittleMusic Studio", label: "LittleMusic Studio" },
  358. { data: "龙皇漫音社", label: "龙皇漫音社" },
  359. { data: "陌云阁", label: "陌云阁" },
  360. { data: "奶牛组", label: "奶牛组" },
  361. { data: "凝曙轩", label: "凝曙轩" },
  362. { data: "NEBULOSA凩星社", label: "NEBULOSA凩星社" },
  363. { data: "北京福托科技开发有限责任公司", label: "平行四界Quadimension" },
  364. { data: "奇音社", label: "奇音社" },
  365. { data: "清文社", label: "清文社" },
  366. { data: "沙雕教", label: "沙雕教" },
  367. { data: "上京急电RECORDS", label: "上京急电RECORDS" },
  368. { data: "Signal-E", label: "Signal-E" },
  369. { data: "Sodatune", label: "Sodatune" },
  370. { data: "踏云社", label: "踏云社" },
  371. { data: "vanguard sound", label: "vanguard sound" },
  372. { data: "V音研", label: "V音研" },
  373. { data: "无名社", label: "无名社" },
  374. { data: "捂脸社", label: "捂脸社" },
  375. { data: "Xylose木糖醇", label: "Xylose木糖醇" },
  376. { data: "汐音社", label: "汐音社" },
  377. { data: "喜灰Doujin社", label: "喜灰Doujin社" },
  378. { data: "音喵工场", label: "音喵工场" },
  379. { data: "银渊社", label: "银渊社" },
  380. { data: "咏吟轩", label: "咏吟轩" },
  381. { data: "DJ Ninja", label: "DJ Ninja" },
  382. { data: "Hydra", label: "Hydra" },
  383. { data: "火蜥", label: "火蜥" },
  384. { data: "玖玲P", label: "玖玲P" },
  385. { data: "Karma(P主)", label: "Karma" },
  386. { data: "林檎desu", label: "林檎desu" },
  387. { data: "MAT", label: "MAT" },
  388. { data: "Mimi Neko", label: "Mimi Neko" },
  389. { data: "Mini", label: "Mini" },
  390. { data: "Project Winehouse", label: "Project Winehouse" },
  391. { data: "SEleA", label: "SEleA" },
  392. { data: "Sky Flight & Kright Wing", label: "Sky Flight & Kright Wing" },
  393. { data: "S2", label: "S2" },
  394. { data: "YIN", label: "YIN" },
  395. { data: "Hong Kong Vocaloid Independent Producers", label: "H.K.V.I.P" },
  396. { data: "VelecTi", label: "VelecTi" },
  397. { data: "Hoskey", label: "Hoskey" },
  398. { data: "yoyo幫尼", label: "yoyo幫尼" },
  399. { data: "鳴櫻", label: "鳴櫻" },
  400. { data: "茶米dav", label: "茶米dav" },
  401. { data: "XL", label: "XL" },
  402. { data: "BTM", label: "BTM" },
  403. { data: "阿六軒", label: "阿六軒" },
  404. { data: "惟(ゆい)", label: "惟(ゆい)" },
  405. { data: "雪楓Yuki", label: "雪楓Yuki" },
  406. { data: "天琴魅歌", label: "天琴魅歌" },
  407. { data: "神隱楓P", label: "神隱楓P" },
  408. { data: "檸檬酸P", label: "檸檬酸P" },
  409. { data: "月犬P", label: "月犬P" },
  410. { data: "VSPOT", label: "VSPOT" },
  411. { data: "閒雜人等", label: "閒雜人等" },
  412. { data: "BE pharma.", label: "BE pharma." },
  413. { data: "K楓悅", label: "K楓悅" },
  414. { data: "晴空和音", label: "晴空和音" },
  415. { data: "天雨路滑製作委員會", label: "天雨路滑製作委員會" },
  416. { data: "LMSP", label: "LMSP" },
  417. { data: "Dr.Yun", label: "Dr.Yun" },
  418. { data: "天水香", label: "天水香" },
  419. ];
  420. var Singerlist = [
  421. { data: "洛天依" },
  422. { data: "言和" },
  423. { data: "乐正绫" },
  424. { data: "乐正龙牙" },
  425. { data: "墨清弦" },
  426. { data: "徵羽摩柯" },
  427. { data: "星尘" },
  428. ];
  429. // 临时函数
  430. function wgULS(str1, str2) {
  431. return str1;
  432. }
  433. // 菜单页面类
  434. var MenuPage = /** @class */ (function (_super) {
  435. __extends(MenuPage, _super);
  436. function MenuPage(name, config) {
  437. var _this = this;
  438. config = Object.assign({ label: "Sample page" }, __assign({ expanded: false }, config));
  439. _this = _super.call(this, name, config) || this;
  440. _this.label = config.label;
  441. _this.level = config.level;
  442. _this.icon = config.icon;
  443. if (_this.$element.is(":empty")) {
  444. _this.$element.text(_this.label);
  445. }
  446. return _this;
  447. }
  448. MenuPage.prototype.setupOutlineItem = function () {
  449. _super.prototype.setupOutlineItem.call(this);
  450. this.outlineItem.setMovable(true).setRemovable(true).setIcon(this.icon).setLevel(this.level).setLabel(this.label);
  451. };
  452. return MenuPage;
  453. }(OO.ui.PageLayout));
  454. var Field = /** @class */ (function (_super) {
  455. __extends(Field, _super);
  456. function Field(widget, label, config) {
  457. if (label === void 0) { label = null; }
  458. if (config === void 0) { config = null; }
  459. return _super.call(this, widget, __assign({ label: label }, config)) || this;
  460. }
  461. return Field;
  462. }(OO.ui.FieldLayout));
  463. // 简介页面
  464. var InfoPage = new MenuPage("info", {
  465. label: wgULS("简介", "簡介"),
  466. icon: "info",
  467. content: [
  468. $("<p>")
  469. .text("VC Editor Plus(以下简称VCEP)是")
  470. .append($("<a>").attr("href", "/User:空翊/萌百VC编辑团队", "title", "User:空翊/萌百VC编辑团队").text("萌百VC区编辑组"))
  471. .append("成员")
  472. .append($("<a>").attr("href", "/User:商火").attr("title", "User:商火").text("商火"))
  473. .append("开发,由前维护员")
  474. .append($("<a>").attr("href", "/User:喵萝酱").attr("title", "User:喵萝酱").text("喵萝酱"))
  475. .append("和现维护员")
  476. .append($("<a>").attr("href", "/User:MilkBoy").attr("title", "User:MilkBoy").text("MilkBoy"))
  477. .append("进行更新和维护,面向VC区编辑者进行泛VC(中文歌声合成软件)条目等相关工作的辅助工具,目前仍处于开发状态。"),
  478. $("<p>").text("VCEP基于JavaScript,请确保您的浏览器开启了JavaScript功能。"),
  479. $("<p>").text("在使用过程中出现的任何问题和意见,请使用QQ或邮箱联系本人。"),
  480. ],
  481. });
  482. // 通用代码生成界面
  483. var SongTitle = new OO.ui.TextInputWidget({
  484. required: true,
  485. placeholder: "请输入歌曲名",
  486. });
  487. SongTitle.setValidityFlag(false);
  488. var SongTitleForValidation = new Field(SongTitle, "歌曲名");
  489. SongTitle.$input.on("blur", function () {
  490. if (SongTitle.getValue() === "") {
  491. SongTitleForValidation.setErrors(["请填写歌曲名"]);
  492. SongTitle.setValidityFlag(false);
  493. }
  494. else {
  495. SongTitleForValidation.setErrors([]);
  496. SongTitle.setValidityFlag(true);
  497. }
  498. });
  499. var BilibiliVideo = new OO.ui.TextInputWidget({
  500. required: true,
  501. placeholder: "请输入B站视频番号(aid/bvid),以av或BV开头",
  502. });
  503. BilibiliVideo.setValidityFlag(false);
  504. var BilibiliVideoForValidation = new Field(BilibiliVideo, "B站视频番号");
  505. BilibiliVideo.$input.on("blur", function () {
  506. if (BilibiliVideo.getValue() === "") {
  507. BilibiliVideoForValidation.setErrors(["请填写此字段"]);
  508. BilibiliVideo.setValidityFlag(false);
  509. }
  510. 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})$/)) {
  511. BilibiliVideoForValidation.setErrors([]);
  512. BilibiliVideo.setValidityFlag(true);
  513. }
  514. else {
  515. BilibiliVideoForValidation.setErrors(["请输入正确的格式"]);
  516. BilibiliVideo.setValidityFlag(false);
  517. }
  518. });
  519. var NiconicoVideo = new OO.ui.TextInputWidget({
  520. disabled: true,
  521. placeholder: "请输入N站视频番号",
  522. });
  523. var NiconicoVideoCheck = new OO.ui.CheckboxInputWidget({
  524. selected: false,
  525. }).on("change", function () {
  526. NiconicoVideo.setDisabled(!NiconicoVideoCheck.isSelected());
  527. NiconicoVideo.setRequired(NiconicoVideoCheck.isSelected());
  528. NiconicoVideo.setValidityFlag(!NiconicoVideoCheck.isSelected());
  529. });
  530. var NiconicoVideoForValidation = new OO.ui.ActionFieldLayout(NiconicoVideo, NiconicoVideoCheck, { label: "N站视频番号" });
  531. NiconicoVideoCheck.$element.addClass("vcep-checkbox");
  532. var YoutubeVideo = new OO.ui.TextInputWidget({
  533. disabled: true,
  534. placeholder: "请输入Youtube视频ID",
  535. });
  536. var YoutubeVideoCheck = new OO.ui.CheckboxInputWidget({
  537. selected: false,
  538. }).on("change", function () {
  539. YoutubeVideo.setDisabled(!YoutubeVideoCheck.isSelected());
  540. YoutubeVideo.setRequired(YoutubeVideoCheck.isSelected());
  541. YoutubeVideo.setValidityFlag(!YoutubeVideoCheck.isSelected());
  542. });
  543. var YoutubeVideoForValidation = new OO.ui.ActionFieldLayout(YoutubeVideo, YoutubeVideoCheck, { label: "Youtube视频ID" });
  544. YoutubeVideoCheck.$element.addClass("vcep-checkbox");
  545. var Uploader = new OO.ui.ComboBoxInputWidget({
  546. required: true,
  547. validate: "non-empty",
  548. placeholder: "请输入UP主",
  549. options: UPlist,
  550. menu: { filterFromInput: true },
  551. });
  552. Uploader.setValidityFlag(false);
  553. var UploaderForValidation = new Field(Uploader, "UP主");
  554. Uploader.$input.on("blur", function () {
  555. if (Uploader.getValue() === "") {
  556. UploaderForValidation.setErrors(["请选择一名UP主"]);
  557. Uploader.setValidityFlag(false);
  558. }
  559. else {
  560. UploaderForValidation.setErrors([]);
  561. Uploader.setValidityFlag(true);
  562. }
  563. });
  564. var UploadTime = new OO.ui.TextInputWidget({
  565. required: true,
  566. placeholder: "请输入日期(格式:yyyy-mm-dd,例如 2023-12-3 或 2023-9-05)",
  567. });
  568. UploadTime.setValidityFlag(false);
  569. var UploadTimeForValidation = new Field(UploadTime, "上传时间");
  570. UploadTime.$input.on("blur", function () {
  571. var value = UploadTime.getValue();
  572. if (value === "") {
  573. UploadTimeForValidation.setErrors(["请填写投稿日期"]);
  574. UploadTime.setValidityFlag(false);
  575. // console.log(UploadTime.hasFlag("ValidationError"));
  576. }
  577. else {
  578. var match = value.match(/^(\d{4})-(0?[1-9]|1[0-2])-(0?[1-9]|[12][0-9]|3[01])$/);
  579. if (match) {
  580. // 提取年、月、日并转换为数字
  581. var year = parseInt(match[1]);
  582. var month = parseInt(match[2]);
  583. var day = parseInt(match[3]);
  584. // 创建 Date 对象验证
  585. var date = new Date(year, month - 1, day);
  586. var isValid = date.getFullYear() === year && date.getMonth() === month - 1 && date.getDate() === day;
  587. if (isValid) {
  588. UploadTimeForValidation.setErrors([]);
  589. UploadTime.setValidityFlag(true);
  590. }
  591. else {
  592. UploadTimeForValidation.setErrors(["日期不存在"]);
  593. UploadTime.setValidityFlag(false);
  594. }
  595. }
  596. else {
  597. UploadTimeForValidation.setErrors(["日期格式错误,请使用 yyyy-mm-dd 格式"]);
  598. UploadTime.setValidityFlag(false);
  599. }
  600. }
  601. });
  602. var Singer = new OO.ui.MenuTagMultiselectWidget({
  603. allowArbitrary: true,
  604. options: Singerlist,
  605. });
  606. function SingerCheck() {
  607. if (Singer.getValue().length === 0) {
  608. SingerForValidation.setErrors(["请至少选择一名歌姬"]);
  609. }
  610. else {
  611. SingerForValidation.setErrors([]);
  612. }
  613. }
  614. Singer.on('add', SingerCheck);
  615. Singer.on('remove', SingerCheck);
  616. var SingerForValidation = new Field(Singer, "演唱歌姬");
  617. var PictureChoose = new OO.ui.RadioSelectInputWidget({
  618. options: [
  619. { data: "upload", label: "上传图片" },
  620. { data: "choose", label: "选择现有图片" },
  621. ],
  622. }).on("change", function (item) {
  623. if (item === "upload") {
  624. PictureUploader.setDisabled(false);
  625. PictureSource.toggle(true);
  626. PictureCategory.toggle(true);
  627. PictureUploadButton.toggle(true);
  628. }
  629. else {
  630. PictureUploader.setDisabled(true);
  631. PictureSource.toggle(false);
  632. PictureCategory.toggle(false);
  633. PictureUploadButton.toggle(false);
  634. }
  635. });
  636. var PictureChooseForValidation = new Field(PictureChoose, "封面图片选择");
  637. var PictureSource = new Field(new OO.ui.TextInputWidget({
  638. placeholder: "请输入图片来源",
  639. }), "图片来源");
  640. var PictureCategory = new Field(new OO.ui.TextInputWidget({
  641. placeholder: "请输入图片分类",
  642. }), "图片分类");
  643. var PictureUploader = new OO.ui.SelectFileInputWidget({
  644. accept: ["image/*"],
  645. showDropTarget: true,
  646. placeholder: "请选择封面图片",
  647. }).on('change', function () {
  648. PictureTitle.setValue(PictureUploader.getFilename());
  649. PictureName = PictureUploader.getFilename();
  650. FileNameCheck();
  651. });
  652. var PictureUploaderForValidation = new Field(PictureUploader, "封面图片上传");
  653. var PictureUploadButton = new Field(new OO.ui.ButtonWidget({
  654. label: "上传图片",
  655. flags: ["primary", "progressive"],
  656. }).on("click", function () {
  657. PictureUploadHint.toggle(false);
  658. PictureUploadProgress.toggle(true);
  659. PictureUploader.setDisabled(true);
  660. PictureUploadButton.getField().setDisabled(true);
  661. PictureCategory.getField().setDisabled(true);
  662. PictureSource.getField().setDisabled(true);
  663. PictureTitle.setDisabled(true);
  664. PictureChoose.setDisabled(true);
  665. api.get({
  666. action: 'query',
  667. meta: 'tokens',
  668. type: 'csrf'
  669. }).then(function (data) {
  670. var token = data.query.tokens.crsftoken;
  671. var formData = new FormData();
  672. formData.append('action', 'upload');
  673. formData.append('format', 'json');
  674. formData.append('filename', PictureTitle.getValue());
  675. formData.append('file', PictureUploader.getValue()[0]);
  676. formData.append('token', token);
  677. return api.postWithToken('csrf', {
  678. action: 'upload',
  679. format: 'json',
  680. file: PictureUploader.getValue()[0],
  681. filename: PictureTitle.getValue(),
  682. token: token,
  683. }, formData);
  684. }).then(function (response) {
  685. PictureUploadHint.toggle(true);
  686. console.log('上传成功:', response);
  687. if (response.upload.result === 'Success') {
  688. PictureUploadHint.setType('success');
  689. PictureUploadHint.setLabel("上传成功");
  690. }
  691. else {
  692. PictureUploadHint.setType('error');
  693. PictureUploadHint.setLabel("上传失败");
  694. }
  695. }).catch(function (error) {
  696. console.error('上传失败:', error);
  697. PictureUploadHint.setType('error');
  698. PictureUploadHint.setLabel("上传失败");
  699. }).finally(function () {
  700. PictureUploadProgress.toggle(false);
  701. PictureUploadProgress.toggle(false);
  702. PictureUploader.setDisabled(false);
  703. PictureUploadButton.getField().setDisabled(false);
  704. PictureCategory.getField().setDisabled(false);
  705. PictureSource.getField().setDisabled(false);
  706. PictureTitle.setDisabled(false);
  707. PictureChoose.setDisabled(false);
  708. });
  709. console.log(PictureSource);
  710. }), "上传图片", { help: "请确保图片来源和分类已填写" });
  711. var PictureName = '';
  712. var PictureTitle = new OO.ui.TextInputWidget({
  713. required: true,
  714. validate: "non-empty",
  715. placeholder: "请输入图片标题,带后缀名",
  716. }).on('blur', function () {
  717. if (PictureTitle.getValue() !== PictureName) {
  718. FileNameCheck();
  719. }
  720. PictureName = PictureTitle.getValue();
  721. });
  722. PictureTitle.setValidityFlag(false);
  723. var PictureTitleForValidation = new Field(PictureTitle, "封面图片标题");
  724. PictureTitle.$input.on("blur", function () {
  725. var value = PictureTitle.getValue();
  726. var allowedExtensions = /\.(jpg|jpeg|png|gif|webp|bmp|svg)$/i; // 支持的后缀列表
  727. var validFilename = /^[^\/*?"<>|]+$/; // 禁止文件名非法字符
  728. if (value === "") {
  729. PictureTitleForValidation.setErrors(["请填写图片标题"]);
  730. }
  731. else if (!validFilename.test(value.split(".")[0])) {
  732. PictureTitleForValidation.setErrors(['文件名含非法字符(/*?"<>|)']);
  733. }
  734. else if (!value.includes(".")) {
  735. PictureTitleForValidation.setErrors(["缺少文件后缀名"]);
  736. }
  737. else if (!allowedExtensions.test(value)) {
  738. PictureTitleForValidation.setErrors(["仅支持 jpg/jpeg/png/gif/webp/bmp/svg 格式"]);
  739. }
  740. else {
  741. PictureTitleForValidation.setErrors([]); // 验证通过
  742. }
  743. });
  744. var PictureInfo = new OO.ui.TextInputWidget();
  745. var Introduction = new OO.ui.MultilineTextInputWidget({
  746. rows: 5,
  747. autosize: true,
  748. placeholder: "请输入额外简介描述,可以输入wikitext",
  749. });
  750. var Lyrics = new OO.ui.MultilineTextInputWidget({
  751. required: true,
  752. rows: 8,
  753. autosize: true,
  754. placeholder: "请输入歌词,可以输入wikitext",
  755. validate: "non-empty",
  756. });
  757. Lyrics.setValidityFlag(false);
  758. var LyricsForValidation = new Field(Lyrics, "歌词");
  759. Lyrics.$input.on("blur", function () {
  760. if (Lyrics.getValue() === "") {
  761. LyricsForValidation.setErrors(["请填写歌词"]);
  762. Lyrics.setValidityFlag(false);
  763. }
  764. else {
  765. LyricsForValidation.setErrors([]);
  766. Lyrics.setValidityFlag(true);
  767. }
  768. });
  769. var PictureUploadProgress = new OO.ui.ProgressBarWidget({
  770. progress: false
  771. });
  772. PictureUploadProgress.toggle(false);
  773. var Result = new OO.ui.MultilineTextInputWidget({
  774. rows: 10,
  775. autosize: true,
  776. placeholder: "生成的代码将会显示在这里",
  777. disabled: true,
  778. });
  779. var ResultButton = new OO.ui.ButtonWidget({
  780. label: "生成代码",
  781. flags: ["primary", "progressive"],
  782. }).on("click", updateResult);
  783. var PictureNameProgress = new OO.ui.ProgressBarWidget({
  784. progress: false
  785. });
  786. PictureNameProgress.toggle(false);
  787. var PictureNameHint = new OO.ui.MessageWidget({
  788. showClose: true,
  789. });
  790. var PictureUploadHint = new OO.ui.MessageWidget({
  791. showClose: true,
  792. });
  793. PictureNameHint.toggle(false);
  794. var ResultHint = new OO.ui.MessageWidget({
  795. showClose: true
  796. });
  797. ResultHint.toggle(false);
  798. var CodeGenPage = new MenuPage("codegen", {
  799. label: wgULS("通用代码生成", "通用代碼生成"),
  800. icon: "code",
  801. content: [
  802. SongTitleForValidation,
  803. BilibiliVideoForValidation,
  804. NiconicoVideoForValidation,
  805. YoutubeVideoForValidation,
  806. UploaderForValidation,
  807. UploadTimeForValidation,
  808. SingerForValidation,
  809. PictureChooseForValidation,
  810. PictureUploaderForValidation,
  811. PictureNameProgress,
  812. PictureNameHint,
  813. PictureSource,
  814. PictureCategory,
  815. PictureTitleForValidation,
  816. PictureUploadProgress,
  817. PictureUploadButton,
  818. new Field(PictureInfo, "封面图片描述"),
  819. new Field(Introduction, "简介"),
  820. LyricsForValidation,
  821. new Field(ResultButton, "生成代码"),
  822. ResultHint,
  823. new Field(Result, "生成结果"),
  824. ],
  825. });
  826. function FileNameCheck() {
  827. PictureUploader.setDisabled(true);
  828. PictureTitle.setDisabled(true);
  829. PictureNameProgress.toggle(true);
  830. var Filename = PictureTitle.getValue();
  831. api.get({
  832. "action": "query",
  833. "format": "json",
  834. "list": "allimages",
  835. "utf8": 1,
  836. "aifrom": Filename,
  837. "aito": Filename,
  838. "ailimit": "1"
  839. }).then(function (data) {
  840. var res = JSON.parse(data);
  841. if (res.query.allimages.length !== 0) {
  842. PictureNameHint.toggle(true);
  843. PictureNameHint.setType("error");
  844. PictureNameHint.setLabel("文件名已存在,请更换文件名");
  845. PictureTitle.setValidityFlag(false);
  846. }
  847. else {
  848. PictureNameHint.toggle(false);
  849. PictureTitle.setValidityFlag(true);
  850. }
  851. }).finally(function () {
  852. PictureUploader.setDisabled(false);
  853. PictureTitle.setDisabled(false);
  854. PictureNameProgress.toggle(false);
  855. });
  856. }
  857. function FormatDate() {
  858. var date = UploadTime.getValue();
  859. var _a = date.split("-"), year = _a[0], month = _a[1], day = _a[2];
  860. var dateObj = new Date(Number(year), Number(month) - 1, Number(day));
  861. return "".concat(dateObj.getFullYear(), "\u5E74").concat(dateObj.getMonth() + 1, "\u6708").concat(dateObj.getDate(), "\u65E5");
  862. }
  863. function FormCheck() {
  864. SongTitle.blur();
  865. BilibiliVideo.blur();
  866. NiconicoVideo.blur();
  867. YoutubeVideo.blur();
  868. Uploader.blur();
  869. UploadTime.blur();
  870. PictureTitle.blur();
  871. Lyrics.blur();
  872. if (Singer.getValue().length === 0) {
  873. SingerForValidation.setErrors(["请至少选择一名歌姬"]);
  874. }
  875. else {
  876. SingerForValidation.setErrors([]);
  877. }
  878. var _SongTitle = SongTitleForValidation.$messages.html() === '';
  879. var _BilibiliVideo = BilibiliVideoForValidation.$messages.html() === '';
  880. var _NiconicoVideo = NiconicoVideoForValidation.$messages.html() === '';
  881. var _YoutubeVideo = YoutubeVideoForValidation.$messages.html() === '';
  882. var _Uploader = UploaderForValidation.$messages.html() === '';
  883. var _UploadTime = UploadTimeForValidation.$messages.html() === '';
  884. var _Singer = SingerForValidation.$messages.html() === '';
  885. var _PictureTitle = PictureTitleForValidation.$messages.html() === '';
  886. var _Lyrics = LyricsForValidation.$messages.html() === '';
  887. if (!_SongTitle || !_BilibiliVideo || !_NiconicoVideo || !_YoutubeVideo || !_Uploader || !_UploadTime || !_Singer || !_PictureTitle || !_Lyrics) {
  888. return false;
  889. }
  890. else {
  891. return true;
  892. }
  893. }
  894. function updateResult() {
  895. ResultHint.toggle(true);
  896. if (!FormCheck()) {
  897. ResultHint.setType("error");
  898. ResultHint.setLabel("请检查表单必填项是否填写正确");
  899. return;
  900. }
  901. ResultHint.setType('success');
  902. ResultHint.setLabel("代码生成成功,已复制到剪贴板");
  903. var _SongTitle = SongTitle.getValue();
  904. var _BilibiliVideo = BilibiliVideo.getValue();
  905. var _NiconicoVideo = NiconicoVideo.getValue();
  906. var _YoutubeVideo = YoutubeVideo.getValue();
  907. var _Uploader = "[[".concat(Uploader.getValue(), "]]");
  908. var _UploadTime = FormatDate();
  909. var _Singer = Singer.getValue()
  910. .map(function (item) { return (item = "[[".concat(item, "]]")); })
  911. .join("、");
  912. var _PictureTitle = PictureTitle.getValue();
  913. var _PictureInfo = PictureInfo.getValue();
  914. var _Introduction = Introduction.getValue();
  915. var _Lyrics = Lyrics.getValue();
  916. 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}}");
  917. 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) : "");
  918. var SongResult = "== \u6B4C\u66F2 ==\n{{BilibiliVideo|id=".concat(_BilibiliVideo, "}}");
  919. var LyricResult = "== \u6B4C\u8BCD ==\n<poem>\n".concat(_Lyrics, "\n</poem>");
  920. var EndnoteResult = "== \u6CE8\u91CA ==\n<references/>\n[[\u5206\u7C7B:\u4E2D\u56FD\u97F3\u4E50\u4F5C\u54C1]]";
  921. var ResultString = "".concat(TemplateResult, "\n\n").concat(IntroductionResult, "\n\n").concat(SongResult, "\n\n").concat(LyricResult, "\n\n").concat(EndnoteResult);
  922. Result.setValue(ResultString);
  923. navigator.clipboard.writeText(ResultString);
  924. }
  925. // 快捷访问页面
  926. var LinkPage = new MenuPage("link", {
  927. label: wgULS("快捷访问", "快捷訪問"),
  928. icon: "link",
  929. content: [
  930. $("<ul>")
  931. .append($("<li>").append($("<a>").attr("href", "/Special:特殊页面").text("Special:特殊页面")))
  932. .append($("<li>").append($("<a>").attr("href", "/Category:帮助").text("Category:帮助")))
  933. .append($("<li>").append($("<a>").attr("href", "/Category:格式模板").text("Category:格式模板")))
  934. .append($("<li>")
  935. .append($("<b>").text("api"))
  936. .append("-B站数据获得网址(")
  937. .append($("<a>")
  938. .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")
  939. .text("食用说明"))
  940. .append(")")
  941. .append($("<ul>")
  942. .append($("<li>").append($("<a>")
  943. .attr("href", "https://api.bilibili.com/archive_stat/stat?aid=")
  944. .text("B站数据获得网址(av版,请输入纯数字)")))
  945. .append($("<li>").append($("<a>").attr("href", "https://api.bilibili.com/x/web-interface/view?bvid=").text("B站数据获得网址(BV版)")))))
  946. .append($("<li>")
  947. .append("相关")
  948. .append($("<b>").text("讨论页面"))
  949. .append($("<ul>").append($("<li>").append($("<a>").attr("href", "/Talk:VOCALOID中文殿堂曲").text("VOCALOID中文殿堂曲"))))),
  950. $("<ul>")
  951. .append($("<li>").append($("<b>").text("导航/题头模板")))
  952. .append($("<ul>")
  953. .text("VOCALOID中文")
  954. .append($("<ul>")
  955. .append($("<li>")
  956. .append($("<a>").attr("href", "/Template:VOCALOID中文殿堂曲导航").text("殿堂曲导航"))
  957. .append("/")
  958. .append($("<a>").attr("href", "/Template:VOCALOID中文殿堂曲题头").text("殿堂曲题头")))
  959. .append($("<li>")
  960. .append($("<a>").attr("href", "/Template:VOCALOID中文传说曲导航").text("传说曲导航"))
  961. .append("/")
  962. .append($("<a>").attr("href", "/Template:VOCALOID中文传说曲题头").text("传说曲题头")))
  963. .append($("<li>")
  964. .append($("<a>").attr("href", "/Template:VOCALOID中文神话曲导航").text("神话曲导航"))
  965. .append("/")
  966. .append($("<a>").attr("href", "/Template:VOCALOID中文神话曲题头").text("神话曲题头")))))
  967. .append($("<ul>")
  968. .text("UTAU中文")
  969. .append($("<ul>")
  970. .append($("<li>")
  971. .append($("<a>").attr("href", "/Template:UTAU中文殿堂曲导航").text("殿堂曲导航"))
  972. .append("/")
  973. .append($("<a>").attr("href", "/Template:UTAU中文殿堂曲题头").text("殿堂曲题头")))
  974. .append($("<li>")
  975. .append($("<a>").attr("href", "/Template:UTAU中文传说曲导航").text("传说曲导航"))
  976. .append("/")
  977. .append($("<a>").attr("href", "/Template:UTAU中文传说曲题头").text("传说曲题头")))))
  978. .append($("<ul>")
  979. .text("Synthesizer V中文")
  980. .append($("<ul>")
  981. .append($("<li>")
  982. .append($("<a>").attr("href", "/Template:Synthesizer V中文殿堂曲导航").text("殿堂曲导航"))
  983. .append("/")
  984. .append($("<a>").attr("href", "/Template:Synthesizer V中文殿堂曲题头").text("殿堂曲题头")))
  985. .append($("<li>")
  986. .append($("<a>").attr("href", "/Template:Synthesizer V中文传说曲导航").text("传说曲导航"))
  987. .append("/")
  988. .append($("<a>").attr("href", "/Template:Synthesizer V中文传说曲题头").text("传说曲题头")))))
  989. .append($("<li>").append($("<a>").attr("href", "/User:商火/课室").text("Wiki语言进阶教程")))
  990. .append($("<li>").append($("<a>").attr("href", "/User:JackBlock/渐变色使用").text("渐变色使用整理")))
  991. .append($("<li>").append($("<a>").attr("href", "/User:喵萝酱/P主颜色").text("P主模板颜色汇整")))
  992. .append($("<li>").append($("<a>").attr("href", "/VOCALOID中文殿堂曲/VC编辑指引").text("VC编辑指引")))
  993. .append($("<li>").append($("<a>").attr("href", "/VOCALOID中文殿堂曲/VC编辑指引/VC之P主相关收录规则").text("VC之P主相关收录规则"))),
  994. $("<ul>")
  995. .append($("<li>").append($("<b>").text("歌姬模板")))
  996. .append($("<ul>")
  997. .text("VOCALOID")
  998. .append($("<ul>")
  999. .append($("<li>").append($("<a>").attr("href", "/Template:洛天依").text("Template:洛天依")))
  1000. .append($("<li>").append($("<a>").attr("href", "/Template:言和").text("Template:言和")))
  1001. .append($("<li>").append($("<a>").attr("href", "/Template:乐正绫").text("Template:乐正绫")))
  1002. .append($("<li>").append($("<a>").attr("href", "/Template:乐正龙牙").text("Template:乐正龙牙")))
  1003. .append($("<li>").append($("<a>").attr("href", "/Template:徵羽摩柯").text("Template:徵羽摩柯")))
  1004. .append($("<li>").append($("<a>").attr("href", "/Template:墨清弦").text("Template:墨清弦")))
  1005. .append($("<li>").append($("<a>").attr("href", "/Template:初音未来(中文)").text("Template:初音未来(中文)")))
  1006. .append($("<li>").append($("<a>").attr("href", "/Template:心华").text("Template:心华")))
  1007. .append($("<li>").append($("<a>").attr("href", "/Template:星尘").text("Template:星尘")))
  1008. .append($("<li>").append($("<a>").attr("href", "/Template:悦成").text("Template:悦成")))
  1009. .append($("<li>").append($("<a>").attr("href", "/Template:章楚楚").text("Template:章楚楚")))))
  1010. .append($("<ul>")
  1011. .text("Synthesizer V")
  1012. .append($("<ul>")
  1013. .append($("<li>").append($("<a>").attr("href", "/Template:艾可").text("Template:艾可")))
  1014. .append($("<li>").append($("<a>").attr("href", "/Template:赤羽").text("Template:赤羽")))
  1015. .append($("<li>").append($("<a>").attr("href", "/Template:诗岸").text("Template:诗岸")))
  1016. .append($("<li>").append($("<a>").attr("href", "/Template:苍穹(平行四界)").text("Template:苍穹")))
  1017. .append($("<li>").append($("<a>").attr("href", "/Template:海伊").text("Template:海伊")))
  1018. .append($("<li>").append($("<a>").attr("href", "/Template:牧心").text("Template:牧心")))
  1019. .append($("<li>").append($("<a>").attr("href", "/Template:Minus").text("Template:Minus")))
  1020. .append($("<li>").append($("<a>").attr("href", "/Template:心华").text("Template:心华")))))
  1021. .append($("<ul>")
  1022. .text("Sharpkey")
  1023. .append($("<ul>")
  1024. .append($("<li>").append($("<a>").attr("href", "/Template:幻晓伊").text("Template:幻晓伊")))
  1025. .append($("<li>").append($("<a>").attr("href", "/Template:琪亚娜 卡斯兰娜").text("Template:琪亚娜 卡斯兰娜")))
  1026. .append($("<li>").append($("<a>").attr("href", "/Template:元筱").text("Template:元筱")))))
  1027. .append($("<ul>")
  1028. .text("MUTA")
  1029. .append($("<ul>")
  1030. .append($("<li>").append($("<a>").attr("href", "/Template:嫣汐").text("Template:嫣汐")))
  1031. .append($("<li>").append($("<a>").attr("href", "/Template:琥珀虚颜").text("Template:琥珀虚颜")))
  1032. .append($("<li>").append($("<a>").attr("href", "/Template:未央").text("Template:未央"))))),
  1033. ],
  1034. });
  1035. var pages = [InfoPage, CodeGenPage, LinkPage];
  1036. // 主菜单类
  1037. var Menu = /** @class */ (function (_super) {
  1038. __extends(Menu, _super);
  1039. function Menu() {
  1040. return _super !== null && _super.apply(this, arguments) || this;
  1041. }
  1042. Menu.prototype.initialize = function () {
  1043. _super.prototype.initialize.call(this);
  1044. this.bookletLayout = new OO.ui.BookletLayout({
  1045. expanded: true,
  1046. outlined: true,
  1047. }).addPages(pages);
  1048. this.$body.append(this.bookletLayout.$element);
  1049. };
  1050. Menu.prototype.getBodyHeight = function () {
  1051. return 600;
  1052. };
  1053. Menu.prototype.makeItems = function () {
  1054. return [0, 1, 2, 3, 4].map(function (val) {
  1055. return new OO.ui.MenuOptionWidget({
  1056. data: val,
  1057. label: String(val),
  1058. });
  1059. });
  1060. };
  1061. Menu.prototype.getActionProcess = function (action) {
  1062. var _this = this;
  1063. if (action) {
  1064. return new OO.ui.Process(function () {
  1065. _this.close({ action: action });
  1066. });
  1067. }
  1068. return _super.prototype.getActionProcess.call(this, action);
  1069. };
  1070. Menu.static = {
  1071. name: "vcep",
  1072. title: "VC Editor Plus",
  1073. size: "larger",
  1074. actions: [{ action: "cancel", label: "Cancel", flags: ["safe", "close"] }],
  1075. };
  1076. return Menu;
  1077. }(OO.ui.ProcessDialog));
  1078. // 窗口管理器
  1079. var windowManager = new OO.ui.WindowManager();
  1080. $(document.body).append(windowManager.$element);
  1081. var dialog = new Menu();
  1082. windowManager.addWindows([dialog]);
  1083. button.on("click", function () {
  1084. windowManager.openWindow(dialog);
  1085. });
  1086. });
  1087. /*</pre>*/