none
- // ==UserScript==
- // @name Bangumi-Relationship-Person-Synchronize
- // @namespace org.binota.scripts.bangumi.brps
- // @include /https?:\/\/(bgm\.tv|bangumi\.tv|chii\.in)\/subject\/\d+\/edit_detail/
- // @version 0.1.0
- // @grant none
- // @description none
- // ==/UserScript==
- "use strict";
- const SUBJECT_ID = (window.location.pathname.match(/\/subject\/(\d+)/)[1]);
- var querySelector = function(selector) {
- return document.querySelector(selector);
- };
- var querySelectorAll = function(selector) {
- return document.querySelectorAll(selector);
- };
- var Get = function(url, sync = true) {
- var req = new XMLHttpRequest();
- req.open("GET", url, false);
- req.send(null);
- if(req.status === 200) return req.responseText;
- };
- var DecodeHtml = (function() {
- var _e = document.createElement('div');
- return function(value) {
- _e.innerHTML = value;
- return _e.childNodes.length === 0 ? "" : _e.childNodes[0].nodeValue;
- };
- // https://stackoverflow.com/questions/1912501
- })();
- //Wcode Facade
- var Wcode = function(decodeHtml) {
- this.html2Json = function(html) {
- const lis = html.match(/<li[^>]*>(.+?)<\/li>/g);
- var infobox = {};
- //For each "li" node:
- for(let li of lis) {
- //Drop all html
- li = li.replace(/<.+?>/g, '').trim();
- let field = decodeHtml(li.match(/^(.+?):/)[1].trim());
- let values = decodeHtml(li.match(/:(.+?)$/)[1].trim());
- if(typeof infobox[field] === "undefined") {
- infobox[field] = [];
- }
- infobox[field].push(values);
- }
- return infobox;
- };
- this.json2Wcode = function(json) {
- var wcode = '';
- wcode += "{{Infobox\n";
- for(let field in json) {
- wcode += `|${field}= `;
- if(json[field].length > 1) {
- wcode += "{\n";
- for(let value of json[field]) {
- wcode += `[${value}]`;
- wcode += "\n";
- }
- wcode += "}\n";
- } else {
- wcode += json[field] + "\n";
- }
- }
- wcode += "}}";
- return wcode;
- };
- };
- //Get Infobox from Subject Page.
- //(Dependency Injection)
- var getSubjectInfobox = function($, $a, get, wcode, subjectId) {
- const page = get(`/subject/${subjectId}`);
- const infoboxHtml = page.match(/<ul id="infobox">[\w\W]+?<\/ul>/m)[0];
- return wcode.html2Json(infoboxHtml);
- };
- //Injection UI Element
- var drawUi = function() {
- //Creating Element
- var startBtn = document.createElement('a');
- startBtn.innerHTML = '[同步关联]';
- startBtn.classList.add('l');
- startBtn.href = 'javascript:void(0)';
- startBtn.onclick = function() {
- chiiLib.ukagaka.presentSpeech('正在获取条目信息中……');
- //Switch to Wiki Mode
- NormaltoWCODE();
- //Synchronize
- var wcode = new Wcode(DecodeHtml);
- var syncJson = getSubjectInfobox(querySelector, querySelectorAll, Get, wcode, SUBJECT_ID);
- //Get real wcode
- var syncWcode = wcode.json2Wcode(syncJson);
- //Writing wcode to textarea
- querySelector('#subject_infobox').value = syncWcode;
- //Writing edition summary
- querySelector('#editSummary').value = '同步关联列表更动';
- chiiLib.ukagaka.presentSpeech('同步完成!请仔细检查 Infobox 是否有误后再提交编辑!');
- };
- //Injection Button
- querySelector('table.settings small').appendChild(startBtn);
- };
- drawUi();