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

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

MediaWiki:Gadget-vcep.js

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

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

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