🏠 Home 

Bangumi-Relationship-Person-Synchronize

none


Install this script?
  1. // ==UserScript==
  2. // @name Bangumi-Relationship-Person-Synchronize
  3. // @namespace org.binota.scripts.bangumi.brps
  4. // @include /https?:\/\/(bgm\.tv|bangumi\.tv|chii\.in)\/subject\/\d+\/edit_detail/
  5. // @version 0.1.0
  6. // @grant none
  7. // @description none
  8. // ==/UserScript==
  9. "use strict";
  10. const SUBJECT_ID = (window.location.pathname.match(/\/subject\/(\d+)/)[1]);
  11. var querySelector = function(selector) {
  12. return document.querySelector(selector);
  13. };
  14. var querySelectorAll = function(selector) {
  15. return document.querySelectorAll(selector);
  16. };
  17. var Get = function(url, sync = true) {
  18. var req = new XMLHttpRequest();
  19. req.open("GET", url, false);
  20. req.send(null);
  21. if(req.status === 200) return req.responseText;
  22. };
  23. var DecodeHtml = (function() {
  24. var _e = document.createElement('div');
  25. return function(value) {
  26. _e.innerHTML = value;
  27. return _e.childNodes.length === 0 ? "" : _e.childNodes[0].nodeValue;
  28. };
  29. // https://stackoverflow.com/questions/1912501
  30. })();
  31. //Wcode Facade
  32. var Wcode = function(decodeHtml) {
  33. this.html2Json = function(html) {
  34. const lis = html.match(/<li[^>]*>(.+?)<\/li>/g);
  35. var infobox = {};
  36. //For each "li" node:
  37. for(let li of lis) {
  38. //Drop all html
  39. li = li.replace(/<.+?>/g, '').trim();
  40. let field = decodeHtml(li.match(/^(.+?):/)[1].trim());
  41. let values = decodeHtml(li.match(/:(.+?)$/)[1].trim());
  42. if(typeof infobox[field] === "undefined") {
  43. infobox[field] = [];
  44. }
  45. infobox[field].push(values);
  46. }
  47. return infobox;
  48. };
  49. this.json2Wcode = function(json) {
  50. var wcode = '';
  51. wcode += "{{Infobox\n";
  52. for(let field in json) {
  53. wcode += `|${field}= `;
  54. if(json[field].length > 1) {
  55. wcode += "{\n";
  56. for(let value of json[field]) {
  57. wcode += `[${value}]`;
  58. wcode += "\n";
  59. }
  60. wcode += "}\n";
  61. } else {
  62. wcode += json[field] + "\n";
  63. }
  64. }
  65. wcode += "}}";
  66. return wcode;
  67. };
  68. };
  69. //Get Infobox from Subject Page.
  70. //(Dependency Injection)
  71. var getSubjectInfobox = function($, $a, get, wcode, subjectId) {
  72. const page = get(`/subject/${subjectId}`);
  73. const infoboxHtml = page.match(/<ul id="infobox">[\w\W]+?<\/ul>/m)[0];
  74. return wcode.html2Json(infoboxHtml);
  75. };
  76. //Injection UI Element
  77. var drawUi = function() {
  78. //Creating Element
  79. var startBtn = document.createElement('a');
  80. startBtn.innerHTML = '[同步关联]';
  81. startBtn.classList.add('l');
  82. startBtn.href = 'javascript:void(0)';
  83. startBtn.onclick = function() {
  84. chiiLib.ukagaka.presentSpeech('正在获取条目信息中……');
  85. //Switch to Wiki Mode
  86. NormaltoWCODE();
  87. //Synchronize
  88. var wcode = new Wcode(DecodeHtml);
  89. var syncJson = getSubjectInfobox(querySelector, querySelectorAll, Get, wcode, SUBJECT_ID);
  90. //Get real wcode
  91. var syncWcode = wcode.json2Wcode(syncJson);
  92. //Writing wcode to textarea
  93. querySelector('#subject_infobox').value = syncWcode;
  94. //Writing edition summary
  95. querySelector('#editSummary').value = '同步关联列表更动';
  96. chiiLib.ukagaka.presentSpeech('同步完成!请仔细检查 Infobox 是否有误后再提交编辑!');
  97. };
  98. //Injection Button
  99. querySelector('table.settings small').appendChild(startBtn);
  100. };
  101. drawUi();