Greasy Fork

来自缓存

Greasy Fork is available in English.

豆瓣京东当当中图法分类

如果存在中图分类,则会在信息栏中多显示如“中图分类: 中图分类: G442 (G 文化、 科学、 教育、 体育 ▸ G4 教育 ▸ G44 教育心理学 ▸ G442 学习心理学);学科分类: 880 教育学 | 880 教育学 | 88027 教育心理学”,方便对图书进行分类。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// ==UserScript==
// @name           豆瓣京东当当中图法分类
// @description    如果存在中图分类,则会在信息栏中多显示如“中图分类: 中图分类: G442 (G 文化、 科学、 教育、 体育 ▸ G4 教育 ▸ G44 教育心理学 ▸ G442 学习心理学);学科分类: 880 教育学 | 880 教育学 | 88027 教育心理学”,方便对图书进行分类。
// @author         018([email protected])
// @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
// @include        https://book.douban.com/*
// @include        https://item.jd.com/*
// @include        http://product.dangdang.com/*
// @version        0.7.2
// @icon           https://img3.doubanio.com/favicon.ico
// @run-at         document-end
// @license        MIT
// @namespace      http://018.ai
// ==/UserScript==

// This Userscirpt can't run under Greasemonkey 4.x platform
if (typeof GM_xmlhttpRequest === 'undefined') {
    alert('不支持Greasemonkey 4.x,请换用暴力猴或Tampermonkey')
    return
}

const IsCourse = 'clc_setting_IsCourse';
const Subject = 'clc_setting_Subject';
const MoreVersion = 'clc_setting_MoreVersion';
const IsticKeys = 'clc_setting_IsticKeys';

;(function () {
    'use strict';

    $(document).ready(function () {
        if (/douban.com/.test(location.host)) {
            handleDouban()
        } else if (/jd.com/.test(location.host)) {
            handleJd()
        } else if (/dangdang.com/.test(location.host)) {
            handleDangdang()
        }
    })

    function handleDangdang() {
        // 分类
        var isbn;
        var lis = document.querySelectorAll('#detail_describe > ul li');
        if (lis) {
            for (var li of lis) {
                if (li) {
                    var section = li.innerText;
                    let index = section.indexOf(':');
                    if (index <= -1) continue;

                    let key = section.substr(0, index).trim();
                    let value = section.substr(index + 1).trim();
                    switch (key) {
                        case "国际标准书号ISBN":
                            isbn = value;
                            break;
                    }
                }
            }
        }

        if( isbn ) {
            // superlib 搜索
            requestSuperlib(isbn, function(clc) {
                let $clc = $('.clcText');
                if($clc.length > 0) {
                    $clc.after('; <a id="clc_' + clc.replace('.', '') + '" target="_blank" href="http://uread.today/clc?c=' + clc + '">'
                               + clc + '</a> <span id="clcText_' + clc.replace('.', '') + '">(...)</span>');
                } else {
                    $('.pinglun').after('<div id="p-clc" style="margin: 0; color: #666;"><span>中图分类:</span> <span id="clc" style="display: none;">' + clc + '</span><a id="clc_' + clc.replace('.', '') + '" target="_blank" href="http://uread.today/clc?c=' + clc + '">'
                                      + clc + '</a> <span id="clcText_' + clc.replace('.', '') + '" class="clcText">(...)</span></div>');
                }
                requestClc(clc, clc, function(subject) {
                    appendsubjectDangdang(subject);
                });
            }, function(as) {
                let $clc = $('.as');
                if($clc.length > 0) {
                    $clc.after(as);
                } else {
                    $('.pinglun').after('<div id="p-try" style="color: #666;"><span>试读:</span> <span class="as">' + as + '</span></div>');
                }
            }, function(status, statusText) {
                $('.pinglun').after('<span style="margin: 10px 0; color: #666;">中图分类:</span> <span style="color:#989B9B">' + statusText + '</span>');
            }, function(status, statusText) {
                $('.pinglun').after('<div id="p-try" style="color: #666;"><span>试读:</span> <span style="color:#989B9B" class="as">' + statusText + '</span></div>');
            });
        }
    }

    function handleJd() {
        // 分类
        var infos = $('.p-parameter-list').text();
        infos = infos.replace(/^[\xA0\s]+/gm, '')
            .replace(/[\xA0\s]+$/gm, '')
            .replace(/\n+/g, '\n')
            .replace(/:\n+/g, ': ')
            .replace(/]\n/g, ']')
            .replace(/】\n/g, '】')
            .replace(/\n\/\n/g, '/');
        var isbn, author;
        for (var section of Object.values(infos.split('\n'))) {
            if (!section || section.trim().length <= 0) continue;

            let index = section.indexOf(':');
            if (index <= -1) continue;

            let key = section.substr(0, index).trim();
            let value = section.substr(index + 1).trim();
            switch (key) {
                    // book
                case "作者":
                    author = value;
                    break;
                case "ISBN":
                    isbn = value;
                    break;
                default:
                    break;
            }
        }

        if( isbn ) {
            // superlib 搜索
            requestSuperlib(isbn, function(clc) {
                let $clc = $('.clcText');
                if($clc.length > 0) {
                    $clc.after('; <a id="clc_' + clc.replace('.', '') + '" target="_blank" href="http://uread.today/clc?c=' + clc + '">'
                               + clc + '</a> <span id="clcText_' + clc.replace('.', '') + '">(...)</span>');
                } else {
                    $('#p-author').after('<div id="p-clc" style="margin: 10px 0; color: #666;"><span>中图分类:</span> <span id="clc" style="display: none;">' + clc + '</span><a id="clc_' + clc.replace('.', '') + '" target="_blank" href="http://uread.today/clc?c=' + clc + '">'
                                      + clc + '</a> <span id="clcText_' + clc.replace('.', '') + '" class="clcText">(...)</span></div>');
                }
                requestClc(clc, clc, function(subject) {
                    appendsubjectJD(subject);
                });
            }, function(as) {
                let $clc = $('.as');
                if($clc.length > 0) {
                    $clc.after(as);
                } else {
                    $('#p-author').after('<div id="p-try" style="margin: 10px 0; color: #666;"><span>试读:</span> <span class="as">' + as + '</span></div>');
                }
            }, function(status, statusText) {
                $('#p-author').after('<span style="margin: 10px 0; color: #666;">中图分类:</span> <span style="color:#989B9B">' + statusText + '</span><br/>');
            }, function(status, statusText) {
                $('#p-author').after('<div id="p-try" style="margin: 10px 0; color: #666;"><span>试读:</span> <span style="color:#989B9B" class="as">' + statusText + '</span></div>');
            });
        }
    }

    function handleDouban() {
        // 初始化
        var isSubject = localStorage.getItem(Subject);
        if (!isSubject || isSubject.length === 0) {
            localStorage.setItem(Subject, 1);
        }
        var isCourse = localStorage.getItem(IsCourse);
        if (!isCourse || isCourse.length === 0) {
            localStorage.setItem(IsCourse, 1);
        }
        var moreVersion = localStorage.getItem(MoreVersion);
        if (!moreVersion || moreVersion.length === 0) {
            localStorage.setItem(MoreVersion, 1);
        }
        var isticKeys = localStorage.getItem(IsticKeys);
        if (!isticKeys || isticKeys.length === 0) {
            localStorage.setItem(IsticKeys, 1);
        }

        //  设置
        $('.top-nav-info').append('<a href="javascript:;" id="clc_setting_btn">中图法分类设置</a>');
        $('#clc_setting_btn').click(function(){
            if ($('#clc_setting').length > 0) {
                return;
            }

            $('#wrapper > *').hide();
            var $clc_setting = $('<div id="clc_setting">\
<h1>\
<span>豆瓣中图法分类</span>\
</h1>\
<div>\
<table>\
<tbody>\
<tr>\
<td><input type="checkbox" checked lable="中图分类" disabled><span>中图分类</span></td>\
</tr>\
<tr>\
<td><input type="checkbox" ' + (localStorage.getItem(IsCourse) === '1' ? 'checked' : '') + ' lable="是否教程" data-config="' + IsCourse + '"><span>是否教程</span></td>\
</tr>\
<tr>\
<td><input type="checkbox" ' + (localStorage.getItem(Subject) === '1' ? 'checked' : '') + ' lable="学科分类参考" data-config="' + Subject + '"><span>学科分类参考</span></td>\
</tr>\
<tr>\
<td><input type="checkbox" ' + (localStorage.getItem(MoreVersion) === '1' ? 'checked' : '') + ' lable="更多版本" data-config="' + MoreVersion + '"><span>更多版本</span></td>\
</tr>\
<tr>\
<td><input type="checkbox" ' + (localStorage.getItem(IsticKeys) === '1' ? 'checked' : '') + ' lable="关键字" data-config="' + IsticKeys + '"><span>关键字</span></td>\
</tr>\
</tbody>\
</table>\
</div>\
<br>\
<h2>设置完成后刷新即可。</h2>\
</div>');
            $clc_setting.on('click', 'input', function() {
                localStorage.setItem($(this).data('config'), $(this).prop('checked') ? 1 : 0);
            });
            $('#wrapper').append($clc_setting);
        });

        // 分类
        var infos = $('#info').text();
        infos = infos.replace(/^[\xA0\s]+/gm, '')
            .replace(/[\xA0\s]+$/gm, '')
            .replace(/\n+/g, '\n')
            .replace(/:\n+/g, ': ')
            .replace(/]\n/g, ']')
            .replace(/】\n/g, '】')
            .replace(/\n\/\n/g, '/');
        var title = $('#wrapper h1').eq(0).text().replace(/\n| /g, '');
        var isbn, author, series, subtitle;
        for (var section of Object.values(infos.split('\n'))) {
            if (!section || section.trim().length <= 0) continue;

            let index = section.indexOf(':');
            if (index <= -1) continue;

            let key = section.substr(0, index).trim();
            let value = section.substr(index + 1).trim();
            switch (key) {
                    // book
                case "作者":
                    author = value;
                    break;
                case "ISBN":
                    isbn = value;
                    break;
                case "丛书":
                    series = value;
                    break;
                case "副标题":
                    subtitle = value;
                    break;
                default:
                    break;
            }
        }

        if( isbn && title ) {
            // superlib 搜索
            requestSuperlib(isbn, function(clc) {
                let $clc = $('.clcText');
                if($clc.length > 0) {
                    $clc.after('; <a id="clc_' + clc.replace('.', '') + '" target="_blank" href="http://uread.today/clc?c=' + clc + '">'
                               + clc + '</a> <span id="clcText_' + clc.replace('.', '') + '">(...)</span>');
                } else {
                    $('#info').append('<span class="pl">中图分类:</span> <span id="clc" style="display: none;">' + clc + '</span><a id="clc_' + clc.replace('.', '') + '" target="_blank" href="http://uread.today/clc?c=' + clc + '">'
                                      + clc + '</a> <span id="clcText_' + clc.replace('.', '') + '" class="clcText">(...)</span><br>');
                }
                requestClc(clc, clc, function(subject) {
                    if (localStorage.getItem(Subject) == '1') {
                        appendsubject(subject);
                    }
                });
            }, function(as) {
                let $clc = $('.as');
                if($clc.length > 0) {
                    $clc.after(as);
                } else {
                    $('#info').append('<div id="p-try" style="color: #666;"><span>试读:</span> <span class="as">' + as + '</span></div>');
                }
            }, function(status, statusText) {
                $('#info').append('<span class="pl">中图分类:</span> <span style="color:#989B9B">' + statusText + '</span><br/>');
            }, function(status, statusText) {
                $('#info').append('<div id="p-try" style="color: #666;"><span>试读:</span> <span style="color:#989B9B" class="as">' + statusText + '</span></div>');
            });
        }

        if (localStorage.getItem(MoreVersion) == '1') {
            if( author && title ) {
                moreversion(title, author);
            }
        }

        var abstract;
        var h2s = $('div.related_info h2');
        for (var i = 0; i < h2s.length; i++) {
            let h2 = h2s[i];
            let span = h2.querySelector('span');
            if(span && span.textContent === '内容简介') {
                var intro = h2.nextElementSibling.querySelector('.all div.intro');
                if(!intro) {
                    intro = h2.nextElementSibling.querySelector('div.intro');
                }
                if(intro) {
                    abstract = intro.textContent;
                }
                break;
            }
        }

        if (localStorage.getItem(IsCourse) == '1') {
            var istextbook = false;
            var tip = '';
            let _istextbook = false
            if (subtitle) {
                _istextbook = subtitle.includes('教科书') || subtitle.includes('教材') || subtitle.includes('课程') || subtitle.includes('课本')
                istextbook |= _istextbook
            }
            tip += (tip.length > 0 ? '\t' : '') + (_istextbook ? '● 副标题' : '○ 副标题')

            if (series) {
                _istextbook = series.includes('教科书') || series.includes('教材') || series.includes('课程') || series.includes('课本')
                istextbook |= _istextbook
            }
            tip += (tip.length > 0 ? '\t' : '') + (_istextbook ? '● 丛书' : '○ 丛书')

            if (abstract) {
                _istextbook = abstract.includes('教科书') || abstract.includes('教材') || abstract.includes('课程') || abstract.includes('课本')
                istextbook |= _istextbook
            }
            tip += (tip.length > 0 ? '\t' : '') + (_istextbook ? '● 内容简介' : '○ 内容简介')

            // 标签
            _istextbook = false
            for(let tag of $('div#db-tags-section div.indent a.tag')) {
                let text = tag.textContent;
                if (text.includes('教科书') || text.includes('教材') || text.includes('课程') || text.includes('课本')) {
                    _istextbook = true;
                    istextbook |= _istextbook;
                    break;
                }
            }
            tip += (tip.length > 0 ? '\t' : '') + (_istextbook ? '● 标签' : '○ 标签')

            // 短评
            _istextbook = false
            for(let span of $('#comment-list-wrapper .comment-item .comment .comment-content .short')) {
                let text = span.textContent;
                if (text.includes('教科书') || text.includes('教材') || text.includes('课程') || text.includes('课本')) {
                    _istextbook = true;
                    istextbook |= _istextbook;
                    break;
                }
            }
            tip += (tip.length > 0 ? '\t' : '') + (_istextbook ? '● 短评' : '○ 短评')

            if (istextbook) {
                $('#mainpic').append('<div class="indent"><span class="tag" title="' + tip + '">教材</span></div>');
            }
        }

        if (localStorage.getItem(IsticKeys) == '1') {
            // 目录
            let id = getIDFromURL(location.href);
            let dir = $('#dir_' + id + '_full').text();
            if (dir) {
                dir = dir.replace(/(([\xA0\s]*)\n([\xA0\s]*))+/g, '').replace('· · · · · ·     (收起)', '');
            }

            let content = abstract + dir;
            if (content.length > 0) {
                requestIstic(content);
            }
        }
    }

    function requestIstic(abstract) {
        let headers = {
            "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
            "Connection": "keep-alive",
            "Accept": "application/json, text/javascript, */*; q=0.01",
            "X-Requested-With": "XMLHttpRequest",
            "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4229.0 Safari/537.36",
            "Origin": "https://ct.istic.ac.cn",
            "Sec-Fetch-Site": "same-origin",
            "Sec-Fetch-Mode": "cors",
            "Sec-Fetch-Dest": "empty",
            "Referer": "https://ct.istic.ac.cn/site/term/participle",
            "Accept-Language": "zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7",
            "Cookie": "name=value"
        }
        doPost('https://ct.istic.ac.cn/site/term/ceshihjson', headers, 'id=lyb018' + new Date().getTime() + '&inputText=' + encodeURIComponent(abstract), {}, function(json, responseDetail, meta) {
            if (json && json.t1 && json.t1.length > 0) {
                // 最多取五个
                let keys = [];
                json.t1.sort(function (a, b) {
                    return b.frequency - a.frequency;
                });
                for (let i = 0; i < json.t1.length; i++ ) {
                    let work = json.t1[i].word.trim();
                    if(work.length == 0 || ['第', '部分', '章', '●', 'Chapter', '-', '#', '附录'].includes(work)) continue;

                    keys.push('<span style="color:#EB9108">' + json.t1[i].word + '(' + json.t1[i].frequency + ')' + '</span>');

                    replaceKey(json.t1[i].word);

                    if (keys.length >= 5) break;
                }

                $('div.indent div.intro').eq(0).after('<p class="IsticKeys">关键字: ' + keys.join('<span style="color:#989B9B"> | </span>'));
                $('div.indent span.all div.intro').eq(0).after('<p class="IsticKeys">关键字: ' + keys.join('<span style="color:#989B9B"> | </span>'));
            }
        }, function(err, meta) {
        });
    }

    function replaceKey(work) {
        for (let e of $('div.indent div.intro p')) {
            if (!e.querySelector('a')) {
                $(e).html($(e).html().replace(eval('/' + work + '/g'), '<span style="color:#EB9108">' + work + '</span>'));
            }
        }
    }

    // 请求图书馆联盟
    function requestSuperlib(isbn, callback, tryread, error, tryreaderror) {
        loadDoc('http://book.ucdrs.superlib.net/search?Field=all&channel=search&sw=' + isbn, {isbn: isbn}, function(doc, responseDetail, meta) {
            let found = false;
            let searchinfo = doc.querySelector('#searchinfo');
            if (!searchinfo) {
                error(-2, '请登陆 <a href="http://www.ucdrs.superlib.net/login/login.action" target="_blank">全图图书馆参考咨询联盟</a> 后刷新。');
                return;
            }
            let books = doc.querySelectorAll('.book1');
            if (books.length <= 0) {
                error(-1, '<a href="http://book.ucdrs.superlib.net/search?Field=all&channel=search&sw=' + isbn + '&edtype=&ecode=utf-8" target="_blank">全图图书馆参考咨询联盟</a> 没有该书籍');
                return;
            }

            for (let book of books) {
                if (found) break;

                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');
                    loadSrcDoc(url, {isbn: meta.isbn, url: url}, function(doc1, responseDetail1, meta1) {
                        found = $(".clcText").length > 0;
                        if (!found) {
                            let tubox = doc1.querySelector('.tubox dl').textContent;
                            let isbn1 = opt(/【ISBN号】.*\n/.exec(tubox)).replace(/【ISBN号】|-|\n/g, '');
                            if (eqisbn(meta1.isbn, isbn1)) {
                                let clcsText = opt(opt(/【中图法分类号】.*\n/.exec(tubox)).match(/[a-zA-Z0-9\.;]+/));
                                if (!clcsText) {
                                    error(-1, '该书在 <a href="' + meta1.url + '" target="_blank">全图图书馆参考咨询联盟</a> 没有中图分类号');
                                } else {
                                    let clcs = clcsText.split(';');
                                    if (clcs) {
                                        for(let i = 0; i < clcs.length; i++) {
                                            let clc = clcs[i];
                                            callback(clc);
                                        }
                                    }
                                }
                            }
                        }

                        // 试读
                        var element = Object.values(doc1.scripts).find(element => element.textContent.includes('send_requestajax'))
                        if (element) {
                            var pattern = /".*?"/
                            if (pattern.test(element.textContent)) {
                                var url = pattern.exec(element.textContent)[0].replaceAll('"', '');

                                doText ('http://book.ucdrs.superlib.net/' + url, {}, function (responseText, responseDetail, meta) {
                                    var htmlText = unescape(responseText.trim());
                                    var html = (new DOMParser()).parseFromString(htmlText, 'text/html');
                                    var as = '';
                                    var href
                                    for(var a of html.querySelectorAll('.link a')) {
                                        if (as.length > 0) {
                                            as += '<span> | </span>'
                                        }
                                        if (a.textContent === '图书馆文献传递') {
                                            as += '<a href="http://book.ucdrs.superlib.net' + a.href.replace('javascript:subtoRefer(true,', '').replace('\'', '').replace(')', '') + '" target="_blank">' + a.textContent + '</a>'
                                        } else {
                                            href = a.href.replace(location.origin, 'http://book.ucdrs.superlib.net');
                                            as += '<a href="' + href + '" target="_blank">' + a.textContent + '</a>'
                                        }
                                    }

                                    if (!href) {
                                        tryreaderror(-1, '查无此信息')
                                    } else {
                                        loadDoc(href, {}, function(doc, responseDetail, meta) {
                                            let $assistUrl = $(doc.querySelector('#downpdf [name=assistUrl]'));
                                            let assistUrl = $assistUrl.attr('value');
                                            let $cntUrl = $(doc.querySelector('#downpdf [name=cntUrl]'));
                                            let cntUrl = $cntUrl.attr('value');

                                            as += '<span> | </span><a id="assistUrl" target="_blank" href="' + assistUrl + '" title="版权页、前言页、目录页。">下载辅助页</a>';
                                            if (cntUrl) {
                                                as += '<span> | </span><a id="cntUrl" target="_blank" href="' + cntUrl + '">下载正文试读</a>';
                                            }
                                            tryread(as);
                                        }, function (err, meta) {
                                            tryreaderror(err.status, err.statusText);
                                        });
                                    }
                                }, function (err, meta) {
                                    error(err.status, err.statusText);
                                })
                            }
                        }
                    }, function(err, meta) {
                        error(err.status, err.statusText);
                    });
                }
            }
        }, function(err, meta) {
            error(err.status, err.statusText);
        });
    }

    function trimAuthors(author) {
        let authors = author.split(/[(|(|)|)|\/|\.|.|·|•|\s]/g);
        var trimAs = [];
        for (let a of authors) {
            let trima = a.trim().replace('主编', '');
            if (trima.length <= 1) continue;

            if (trimAs.indexOf(trima) < 0) {
                trimAs.push(trima);
            }
        }
        return trimAs;
    }

    function moreversion(title, author) {
        var trimTitle = title.replace(/[\(|(].*[\)|)]/g, '');
        doGet('https://book.douban.com/j/subject_suggest?q=' + trimTitle, {isbn: trimTitle}, function(arr, responseDetail, meta) {
            if (arr.length <= 0) {
                $('#info').append('<span class="pl">更多版本:</span> <span style="color:#989B9B">查无此信息</span><br>');
                return;
            }

            $('#info').append('<span class="pl">更多版本:</span> ');
            var trimAs = trimAuthors(author);
            var html = '';
            for (let item of arr) {
                if (item.type !== 'b' || item.url === location.href) continue;

                let trim_author_name = trimAuthors(item.author_name);
                if ($(trimAs).filter(trim_author_name).length > 0) {
                    $('#info').append('<a target="_blank" href="' + item.url + '"><img style="width: 16px;height: 16px;" src="' + item.pic + '" />' + item.title + '(' + item.year + ', <span id="item__' + item.id + '">...</span>)' + '</a><span style="color:#989B9B"> | </span>');
                }

                loadDoc(item.url, {id: item.id}, function(_doc, responseDetail, meta) {
                    let rating = _doc.querySelector('strong[property*="v:average"]');
                    let ratingContent;
                    if (rating && (ratingContent = rating.textContent.trim()).length >= 1) {
                        var ratingPeople = _doc.querySelector('div.rating_sum a.rating_people span[property="v:votes"]').textContent;
                        if (!ratingPeople || ratingPeople.toString().trim().length <= 0) {
                            ratingPeople = 0;
                        }
                        $('#item__' + meta.id).html(ratingContent + "/" + ratingPeople);
                    } else {
                        $('#item__' + meta.id).html("0/0");
                    }
                }, function(err, meta) {
                    $('#item__' + meta.id).html("-/-");
                });
            }
            $('#info').append('<a target="_blank" href="https://search.douban.com/book/subject_search?search_text=' + trimTitle + '&cat=1001">详情</a><br>');
        }, function(err, meta) {
            $('#info').append('<span class="pl">更多版本:</span> <a target="_blank" href="https://search.douban.com/book/subject_search?search_text=' + trimTitle + '&cat=1001">详情...</a><br>');
        });
    }

    // 请求istic,获取分类名称,备用,暂不启用。
    function requestClc(srcclc, clc, subject) {
        doGet('http://api.uread.today/master/anon/ch_lib_cls/info?code=' + clc, {srcclc: srcclc, clc: clc}, function(json, responseDetail, meta) {
            if (json.resultcode == 40000 && meta.clc.length > 0) {
                if (meta.clc.includes('.')) {
                    requestClc(meta.srcclc, meta.clc.replace(/\.\d*$/, ''), subject);
                } else {
                    requestClc(meta.srcclc, meta.clc.replace(/\d$/, ''), subject);
                }
                return;
            }

            let clcs = [];
            clcs.push(...json.data.clc.parents.map((e) => '<a target="_blank" href="http://uread.today/clc?c=' + e.clc + '">' + e.clc + '</a>' + ' ' + hanldeClcText(e.name)));
            clcs.push('<a target="_blank" href="http://uread.today/clc?c=' + json.data.clc.clc + '">' + json.data.clc.clc + '</a>' + ' ' + hanldeClcText(json.data.clc.name))
            htmlclc(meta.srcclc, clcs);

            subject(json.data.subject)
        }, function(err, meta) {
            requestClcA(meta.srcclc, meta.clc);
        });
    }

    // 请求istic,获取分类名称,备用,暂不启用。
    function requestClcA(srcclc, clc) {
        doPost('https://ct.istic.ac.cn/site/clc/getByClassName?t=' + new Date().getTime(),
               { "Content-Type": "application/x-www-form-urlencoded" }, 'classname=' + clc, {srcclc: srcclc, clc: clc}, function(json, responseDetail, meta) {
            if (json.length == 0 && meta.clc.length > 0) {
                if (meta.clc.includes('.')) {
                    requestClcA(meta.clc.replace(/\.\d*$/, ''));
                } else {
                    requestClcA(meta.clc.replace(/\d$/, ''));
                }
                return;
            }

            let clcs = [];
            let jsonMap = {};
            let pid;

            let level;
            for (let i = 0; i < json.length; i ++) {
                if (clcs.length == 0 && json[i].classNum.split('/').includes(clc)) {
                    clcs.push(json[i].classNum + ' ' + hanldeClcText(json[i].className));

                    pid = json[i].pid;
                    level = json[i].level;
                } else if( json[i].level < level) {
                    jsonMap[json[i].id + ''] = json[i];
                }
            }

            clcText(clc, pid, jsonMap, clcs);

            htmlclc(meta.srcclc, clcs);
        }, function(err, meta) {
            requestClcB(meta.clc);
        });
    }

    //  处理clc文字
    function clcText(clc, pid, jsonMap, rets) {
        if (!jsonMap || !rets) return;

        if( jsonMap[pid] ) {
            rets.unshift('<a target="_blank" href="http://uread.today/clc?c=' + jsonMap[pid].classNum + '">' + jsonMap[pid].classNum + '</a> ' + hanldeClcText(jsonMap[pid].className));

            if (jsonMap[pid].level <= 2) return;

            clcText(clc, jsonMap[pid].pid, jsonMap, rets);
        }
    }

    function htmlclc(srcclc, rets) {
        let clcText = $('#clcText_' + srcclc.replace('.', ''));
        if (rets.length > 0) {
            if (clcText.text() == '(...)' ) {
                clcText.html('(' + rets.join('<span style="color:#989B9B"> ▸ </span>') + ')');
            }
        } else {
            if (clcText.text() == '(...)' ) {
                clcText.html('<span style="color:#989B9B">(查无此信息)</span>');
            }
        }
    }

    function hanldeClcText(txt) {
        var splits = txt.split(/、|(|)|\(|\)/);
        var retss = [];
        for (var s of splits) {
            if (s.length == 0) continue;

            retss.push(' <a target="_blank" href="http://uread.today/clc-subject?t=content&q=' + s + '">' + s + '</a>');

            /*if (localStorage.getItem(Subject) == '1') {
                requestxhma(s);
            }*/
        }
        return retss.join('、');
    }

    // 请求clcindex,获取分类名称
    function requestClcB(clc) {
        var url = 'https://www.clcindex.com/category/' + clc;
        loadDoc(url, {clc: clc, url: url}, function(doc, responseDetail, meta) {
            let clcs = [];
            for (let li of doc.querySelectorAll('.breadcrumb li.active')) {
                if (!li) continue;

                var txtContent = li.textContent.trim();
                var clcCode;
                var index = txtContent.indexOf(' ');
                if (index > 0) {
                    clcCode = txtContent.substr(0, index);
                    txtContent = txtContent.substr(index + 1);
                }

                clcs.push('<a target="_blank" href="http://uread.today/clc?c=' + clcCode + '">' + clcCode + '</a> ' + hanldeClcText(txtContent));
            }

            $('#clc_' + meta.clc).attr('href', meta.url);
            htmlclc(meta.clc, clcs);
        }, function(err, meta) {
            if (err.status == 404) {
                if (meta.clc.includes('.')) {
                    requestClcB(meta.clc, meta.clc.replace(/\.\d*$/, ''));
                } else {
                    requestClcB(meta.clc, meta.clc.replace(/\d$/, ''));
                }
                return;
            }

            let clcText = $('#clcText');
            if (clcText.text() == '(...)' ) {
                clcText.html('<span style="color:#989B9B">(无法获取)</span>');
            }
        });

    }

    // 请求xhma,获取学科
    function requestxhma(s) {
        var url = 'http://xkfl.xhma.com/search?w=' + s;
        loadDoc(url, {}, function(doc, responseDetail, meta) {
            let spans = doc.querySelectorAll('.data li:not(.t) span');//code
            if (spans.length == 1) {
                let name = spans[0].nextElementSibling.textContent.trim();
                if (name.includes(s)) {
                    let code = spans[0].textContent.trim();
                    appendsubject(' <a target="_blank" href="http://uread.today/subject?c=' + code.replace(/\./g, '') + '">' + code + ' ' + name + '</a>');
                }
            } else if (spans.length > 1) {
                for (let span of spans) {
                    if (!span) continue;

                    let name = span.nextElementSibling.textContent.trim();
                    if (name != s && (name != s + '学')) continue;

                    let code = span.textContent.trim();

                    appendsubject('<a target="_blank" href="http://uread.today/subject?c=' + code.replace(/\./g, '') + '">' + code + ' ' + name + '</a>');
                }
            }
        }, function(err, meta) {
        });
    }

    function appendsubject(subject) {
        let clcText = $('#subjectText');
        let subjectText = ''
        for(let subj of subject.parents) {
            subjectText += ' <a target="_blank" href="http://uread.today/subject?c=' + subj.code + '">' + subj.code + ' ' + subj.name + '</a><span style="color:#989B9B"> ▸ </span>'
        }
        subjectText += ' <a target="_blank" href="http://uread.today/subject?c=' + subject.code + '">' + subject.code + ' ' + subject.name + '</a>'
        if (clcText.length == 0) {
            $('#info').append('<span class="pl">学科分类:</span><span id="subject" style="display: none;">' + subject.code + '</span><span id="subjectText"><span>' + subjectText + '</span></span>');
        } else {
            clcText.append('<span style="color:#989B9B"> | </span><span>' + subjectText + '</span>');
        }
    }

    function appendsubjectJD(subject) {
        let clcText = $('#subjectText');
        let subjectText = ''
        for(let subj of subject.parents) {
            subjectText += ' <a target="_blank" href="http://uread.today/subject?c=' + subj.code + '">' + subj.code + ' ' + subj.name + '</a><span style="color:#989B9B"> ▸ </span>'
        }
        subjectText += ' <a target="_blank" href="http://uread.today/subject?c=' + subject.code + '">' + subject.code + ' ' + subject.name + '</a>'
        if (clcText.length == 0) {
            $('#p-clc').after('<div style="margin: 5px 0; color: #666;"><span class="pl">学科分类:</span><span id="subject" style="display: none;">' + subject.code + '</span><span id="subjectText"><span>' + subjectText + '</span></span></div>');
        } else {
            clcText.append('<span style="color:#989B9B"> | </span><span>' + subjectText + '</span>');
        }
    }

    function appendsubjectDangdang(subject) {
        let clcText = $('#subjectText');
        let subjectText = ''
        for(let subj of subject.parents) {
            subjectText += ' <a target="_blank" href="http://uread.today/subject?c=' + subj.code + '">' + subj.code + ' ' + subj.name + '</a><span style="color:#989B9B"> ▸ </span>'
        }
        subjectText += ' <a target="_blank" href="http://uread.today/subject?c=' + subject.code + '">' + subject.code + ' ' + subject.name + '</a>'
        if (clcText.length == 0) {
            $('#p-clc').after('<div style="margin: 0; color: #666;"><span class="pl">学科分类:</span><span id="subject" style="display: none;">' + subject.code + '</span><span id="subjectText"><span>' + subjectText + '</span></span></div>');
        } else {
            clcText.append('<span style="color:#989B9B"> | </span><span>' + subjectText + '</span>');
        }
    }

    // 判断两个ISBN是否相等,如:9787100005586与7100005582,具体阅读:http://www.banquanye.com/article/id-812
    function eqisbn(val1, val2) {
        if (!val1 || (val1.length != 13 && val1.length != 10) || !val2 || (val2.length != 13 && val2.length != 10)) return false;

        let no1 = getISBNNo(val1);
        let no2 = getISBNNo(val2);
        return no1 == no2;
    }

    // 获取ID
    function getIDFromURL(url) {
        if (!url) return '';

        var id = url.match(/subject\/.*\//g);
        if (!id) return '';

        return id[0].replace(/subject|\//g, '');
    }

    // 获取ISBN的No,去掉前三位的978以及最后一位验证码
    function getISBNNo(val) {
        if (!val || (val.length != 13 && val.length != 10)) return;

        if (val.length == 13) {
            return val.substr(3, 9);
        } else if (val.length == 10) {
            return val.substr(0, 9);
        }
    }

    // 判断,空返回空字符串
    function opt(val) {
        if (!val) return '';

        if (val instanceof Array) {
            if (val.length > 0) {
                return val[0];
            }
        } else {
            return val;
        }
    }

    // 对使用GM_xmlhttpRequest返回的html文本进行处理并返回DOM树
    function page_parser(responseText, src) {
        // 替换一些信息防止图片和页面脚本的加载,同时可能加快页面解析速度
        if (!src) {
            responseText = responseText.replace(/s+src=/ig, ' data-src='); // 图片,部分外源脚本
            responseText = responseText.replace(/<script[^>]*?>[\S\s]*?<\/script>/ig, ''); //页面脚本
        }
        return (new DOMParser()).parseFromString(responseText, 'text/html');
    }

    // 加载网页
    function loadDoc (url, meta, callback, fail) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (responseDetail) {
                if (responseDetail.status === 200) {
                    let doc = page_parser(responseDetail.responseText, false)
                    callback(doc, responseDetail, meta)
                } else if (fail){
                    fail(responseDetail, meta);
                }
            },
            onerror: function(err) {
                if (fail) {
                    fail(err, meta);
                }
            }
        })
    }

    // 加载网页
    function loadSrcDoc (url, meta, callback, fail) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (responseDetail) {
                if (responseDetail.status === 200) {
                    let doc = page_parser(responseDetail.responseText, true)
                    callback(doc, responseDetail, meta)
                } else if (fail){
                    fail(responseDetail, meta);
                }
            },
            onerror: function(err) {
                if (fail) {
                    fail(err, meta);
                }
            }
        })
    }

    // get请求
    function doText (url, meta, callback, fail) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (responseDetail) {
                if (responseDetail.status === 200) {
                    callback(responseDetail.responseText, responseDetail, meta)
                } else if (fail){
                    fail(responseDetail, meta);
                }
            },
            onerror: function(err) {
                if (fail) {
                    fail(err, meta);
                }
            }
        })
    }

    // get请求
    function doGet (url, meta, callback, fail) {
        GM_xmlhttpRequest({
            method: 'GET',
            url: url,
            onload: function (responseDetail) {
                if (responseDetail.status === 200) {
                    callback(JSON.parse(responseDetail.responseText), responseDetail, meta)
                } else if (fail){
                    fail(responseDetail, meta);
                }
            },
            onerror: function(err) {
                if (fail) {
                    fail(err, meta);
                }
            }
        })
    }

    // post请求
    function doPost (url, headers, data, meta, callback, fail) {
        GM_xmlhttpRequest({
            method: "POST",
            url: url,
            data: data,
            headers: headers,
            onload: function(responseDetail){
                if (responseDetail.status === 200) {
                    callback(JSON.parse(responseDetail.responseText), responseDetail, meta)
                } else if (fail){
                    fail(responseDetail, meta);
                }
            },
            onerror: function(err) {
                if (fail) {
                    fail(err, meta);
                }
            }
        })
    }
})()

// 测试URL:
// https://book.douban.com/subject/26431646/
// https://book.douban.com/subject/26298597/
// https://book.douban.com/subject/5402711/