Greasy Fork

Greasy Fork is available in English.

Bangumi-Relationship-Person-Synchronize

none

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Greasemonkey 油猴子Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Violentmonkey 暴力猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴Userscripts ,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey 篡改猴,才能安装此脚本。

您需要先安装一款用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==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();