// ==UserScript==
// @name 豆瓣中图法分类
// @description 如果存在中图分类,则会在豆瓣信息栏中多显示如“中图分类: B842.1 (认知)”,方便对图书进行分类。
// @author 018(lyb018@gmail.com)
// @contributor Rhilip
// @connect *
// @grant GM_xmlhttpRequest
// @grant GM_setClipboard
// @grant GM_addStyle
// @grant GM_setValue
// @grant GM_getValue
// @grant GM_listValues
// @grant GM_deleteValue
// @grant GM_registerMenuCommand
// @require https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js
// @require https://greasyfork.org/scripts/368137-encodeToGb2312/code/encodeToGb2312.js?version=601683
// @include https://book.douban.com/*
// @version 0.1.1
// @icon https://img3.doubanio.com/favicon.ico
// @run-at document-end
// @namespace doveboy_js
// @downloadURL none
// ==/UserScript==
// This Userscirpt can't run under Greasemonkey 4.x platform
if (typeof GM_xmlhttpRequest === 'undefined') {
alert('不支持Greasemonkey 4.x,请换用暴力猴或Tampermonkey')
return
}
// 不属于豆瓣的页面
if (!/douban.com/.test(location.host)) {
return
}
;(function () {
'use strict'
$(document).ready(function () {
var isbn = /ISBN: .*\n/.exec($('#info').eq(0).text())[0].match(/\d+/g)[0].replace(/\n| /g, '');
var title = $('#wrapper h1').eq(0).text().replace(/\n| /g, '');
if( isbn && title ) {
// superlib 搜索
requestSuperlib(isbn);
}
})
function requestSuperlib(isbn) {
getDoc('http://book.ucdrs.superlib.net/search?Field=all&channel=search&sw=' + isbn, null, function(doc, responseDetail, meta) {
for (let book of doc.querySelectorAll('.book1')) {
let a = book.querySelector('.book1 td>table a.px14');//
if (a) {
// superlib 书籍查看
let url = a.href.replace(location.host, 'book.ucdrs.superlib.net').replace('https', 'http');
getDoc(url, null, function(doc1, responseDetail, meta) {
let tubox = doc1.querySelector('.tubox dl').textContent;
let isbn1 = opt(/【ISBN号】.*\n/.exec(tubox)).replace(/【ISBN号】|-|\n/g, '');
if (isbn == isbn1) {
let clc = opt(opt(/【中图法分类号】.*\n/.exec(tubox)).match(/[a-zA-Z0-9\.]+/));
if (clc) {
$('#info').append('中图分类: ' + clc + '');
requestClc(clc)
}
}
});
}
}
});
}
function requestClc(clc) {
doPost('https://ct.istic.ac.cn/site/clc/getByClassName?t=' + new Date().getTime(),
{ "Content-Type": "application/x-www-form-urlencoded" }, 'classname=' + clc, null, function(json, responseDetail, meta) {
if (json.length == 0) {
requestClc(clc.replace(/\.\d*$/, ''));
return;
}
let rets = []
let jsonMap = {}
let pid = putMapReturnPid(clc, json, jsonMap, rets);
clcText(pid, jsonMap, rets);
if (rets.length > 0) {
$('#clcText').after(' (' + rets.join(' / ') + ')');
}
});
}
function putMapReturnPid(clc, json, jsonMap, rets) {
if (!json || json.length <= 0 || !jsonMap || !rets) return;
let pid;
let level;
for (let i = 0; i < json.length; i ++) {
if (rets.length ==0 && json[i].classNum == clc) {
rets.push(json[i].classNum + ' - ' + json[i].className);
pid = json[i].pid;
level = json[i].level;
} else if( json[i].level < level) {
jsonMap[json[i].id + ''] = json[i];
}
}
return pid;
}
function clcText(pid, jsonMap, rets) {
if (!jsonMap || !rets) return;
if( jsonMap[pid] ) {
rets.unshift(jsonMap[pid].classNum + ' - ' + jsonMap[pid].className);
if (jsonMap[pid].level <= 2) return;
clcText(jsonMap[pid].pid, jsonMap, rets);
}
}
function opt(arrs) {
if (arrs && arrs.length > 0) {
return arrs[0];
}
return '';
}
// 对使用GM_xmlhttpRequest返回的html文本进行处理并返回DOM树
function page_parser(responseText) {
// 替换一些信息防止图片和页面脚本的加载,同时可能加快页面解析速度
responseText = responseText.replace(/s+src=/ig, ' data-src='); // 图片,部分外源脚本
responseText = responseText.replace(/