文献互助小帮手:①从图书馆参考咨询联盟(ucdrs)或读秀(duxiu)获取ssid/dxid ②从中美百万(cadal)获取ssno ③提供ucdrs、duxiu、cadal到豆瓣图书的链接

显示图书馆参考咨询联盟(ucdrs)或读秀及其镜像站(duxiu)上文献的ssid或dxid(ssid不存在时),用于群组找书、文献互助、图书互助等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;另外在搜索、详情页等处添加ucdrs、duxiu、cadal和豆瓣的双向导航链接。To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,下载请自行找百度网盘群组;显示dxid和双向链接为平底锅没有的新加功能。

目前为 2022-04-27 提交的版本。查看 最新版本

// ==UserScript==
// @name         文献互助小帮手:①从图书馆参考咨询联盟(ucdrs)或读秀(duxiu)获取ssid/dxid ②从中美百万(cadal)获取ssno ③提供ucdrs、duxiu、cadal到豆瓣图书的链接
// @namespace    ucdrs.superlib.net
// @version      1.6.0
// @author       Theron
// @match        *://book.ucdrs.superlib.net/views/specific/*
// @match        *://book.ucdrs.superlib.net/search*
// @match        *://search.douban.com/book/subject_search*
// @match        *://book.douban.com/isbn/*
// @match        *://book.douban.com/subject_search*
// @match        *://book.douban.com/tag/*
// @match        *://book.douban.com/subject/*
// @match        *://book.douban.com/series/*
// @match        *://book.douban.com/works/*
// @match        *://book.douban.com/author/*/books*
// @match        *://book.douban.com/people/*/wish*
// @match        *://book.douban.com/people/*/do*
// @match        *://book.douban.com/people/*/collect*
// @match        *://www.douban.com/doulist/*
// @match        *://book.douban.com/cart*
// @match        *://cadal.edu.cn/cadalinfo/search*
// @match        *://cadal.edu.cn/cardpage/bookCardPage?*ssno=*
// @match        *://fx.ccelib.com/detail_*
// @match        *://fx.ccelib.com/s?*
// @include      */search*
// @include      */bookDetail.jsp*
// @include      */chapter.jsp*
// @description  显示图书馆参考咨询联盟(ucdrs)或读秀及其镜像站(duxiu)上文献的ssid或dxid(ssid不存在时),用于群组找书、文献互助、图书互助等场景;显示大学数字图书馆国际合作计划(cadal)的书号-ssno,用于查询下载中美百万书册;另外在搜索、详情页等处添加ucdrs、duxiu、cadal和豆瓣的双向导航链接。To搜索[红太狼的平底锅]的朋友:提供红太狼的平底锅的部分功能,如显示ssid,下载请自行找百度网盘群组;显示dxid和双向链接为平底锅没有的新加功能。
// @grant        none
// @license      Copyright Theron
// ==/UserScript==

/* jslint esversion: 6 */
/*globals jQuery */
(function () {
    'use strict';
    function slim(s) {
        return s.replaceAll(/  +/g, "").trim();
    }
    function showbid(bookid, idtype) {
        return `<p style="text-align: center; margin-top: 5px; margin-bottom: 5px; clear:both;"><span style="color: red; font-size: 12px; padding-right: 3px;">${idtype}</span><span style="color: blue; font-size: 12px; font-weight: bold;">${bookid}</span></p>`;
    }
    function sepit(s, sep) {
        if (sep === "|") {
            s = " | " + s;
        } else if (sep === "br") {
            s = s + "<br>";
        } else if (sep === "p") {
            s = '<p style="text-align: center">' + s + '</p>';
        }
        return s;
    }
    function ucdrslink(bookname, sep = "|", text = '参考联盟') {
        return sepit(`<a style="font-size: 80%; color: orange;" href="http://book.ucdrs.superlib.net/search?sw=${bookname}&bCon=&ecode=utf-8&channel=search&Field=1" target="_blank">${text}</a>`, sep);
    }
    function dblink(bookname, isbn = "", sep = "|", style="color: blue") {
        return isbn === "" ? sepit(`<a href="https://search.douban.com/book/subject_search?search_text=${bookname.trim()}" target="_blank" style="${style}">豆瓣搜索</a>`, sep) : sepit(`<a href="https://book.douban.com/isbn/${isbn.trim()}/?bookname=${bookname.trim()}" target="_blank" style="${style}">豆瓣直达</a>`, sep);
    }
    function dxtoc(url) {
        url = url.replace("bookDetail.jsp", "chapter.jsp").replace(/sw=[^/&]*/, "sw=1 2 3 中 4 5 6 7 8 大 参考 9 是 人 上 附 不 小 从 之 下 有 用 以 多 后 表 什么 十 10 部分 前 到 图 我 如何 要 可 内 里 记 区 外 天 来 你 西 再 序 南 步骤 同 录 附 去 女 篇 开 文 都 题 东 就 节 他 也 公 北 结 右 又 少 百 那 这 关 没 千 表格 个 男 章 0 论 几 今 左 万");
        return `<a href="${url}" target="_blank" style="color: blue">目录</a>`;
    }
    function iid2bookid(iid) {
        var bookid = "";
        var part = "";
        var tailhex = parseInt(iid.substring(iid.length - 2), 16);
        var encoded = iid.substring(0, iid.length - 16);
        var i;
        for (i = 0; i < encoded.length; i = i + 2) {
            part = encoded.substring(i, i + 2);
            bookid += String.fromCharCode(parseInt(part, 16) - tailhex);
        }
        return bookid.replace(/\//g, "").match(/^\d{8,}/)[0];
    }

    var pageurl = window.location.href;
    var bookid;
    var bookname;
    var ssid;
    var dxid;
    var img;
    var snippet;
    var m_isbn;
    var m_ssn;
    var m_dxid;
    var m_iid;
    if (pageurl.includes("search.douban.com/book/subject_search") || pageurl.includes("book.douban.com/subject_search")) {
        jQuery("div.item-root > div.detail > div.title").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).find("a").after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/works")) {
        jQuery("div.bkdesc > a.pl2").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/cart")) {
        jQuery("td.book_title > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname, '|', '参'));
        });
    } else if (pageurl.includes("www.douban.com/doulist")) {
        jQuery("div.title > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            var src = slim(jQuery(el).parent().prev().prev().text());
            if (src === "来自:豆瓣读书") {
                jQuery(el).after(ucdrslink(bookname));
            }
        });
    } else if (pageurl.match("book.douban.com.*/(series|tag|do|wish|collect)")) {
        jQuery("div.info > h2 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/author")) {
        jQuery("h6 > a").each(function (i, el) {
            bookname = slim(jQuery(el).text());
            jQuery(el).after(ucdrslink(bookname));
        });
    } else if (pageurl.includes("book.douban.com/subject")) {
        var json = jQuery("script[type='application/ld+json']").text();
        bookname = json.match(/"name" : "(.*?)",/)[1];
        m_isbn = json.match(/"isbn" : "(.*?)",/);
        snippet = '<br><a href="http://book.ucdrs.superlib.net/search?sw=' + (m_isbn ? m_isbn[1] : bookname) + '&bCon=&ecode=utf-8&channel=search&Field=' + (m_isbn ? "All" : "1") + '" target="_blank">参考联盟</a>';
        jQuery("div#mainpic > a.nbg").after(snippet);
    } else if (pageurl.includes("book.douban.com/isbn")) {
        var error = jQuery('div#exception').text().trim();
        if (error === "豆瓣评论暂时没有收录此书,请原谅。" || error === "您提供的ISBN号码不正确,请校正后再试。谢谢。") {
            var m_bookname = pageurl.match(/\?bookname=(.+)/);
            if (m_bookname) {
                bookname = m_bookname[1];
                document.location = "https://search.douban.com/book/subject_search?search_text=" + bookname;
            }
        }
    } else if (pageurl.includes("book.ucdrs.superlib.net/search")) {
        jQuery('td[id="b_img"]').each(function (i, el) {
            bookid = jQuery(el).parent("tr").find('input[name*="ssid"]').val();
            bookname = jQuery(el).parent("tr").find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
            if (bookname) {
                jQuery(el).parent().children().last().find("a").after(dblink(bookname));
            }
            if (bookid) {
                jQuery(el).after(showbid(bookid, "SS号"));
            } else {
                bookid = jQuery(el).find("a[href]").attr("href").match(/dxNumber=(\d+)/);
                if (bookid) {
                    jQuery(el).after(showbid(bookid[1], "DX号"));
                }
            }
        });
    } else if (pageurl.includes("//cadal.edu.cn/cadalinfo/search")) {
        jQuery('a.title').each(function (i, el) {
            bookid = jQuery(el).attr("onclick").match(/'\w+'/)[0].replace(/'/g, "").replace("hj", "");
            jQuery(el).parent().parent().prev().find("a").after(showbid("CD" + bookid, "CADAL号<br>"));
            bookname = jQuery(el).text().trim();
            jQuery(el).after(dblink(bookname));
        });
    } else if (pageurl.includes("/search") && jQuery('#dxid0').val()) {
        jQuery('div[class="divImg"]').each(function (i, el) {
            ssid = jQuery(el).prev().val();
            dxid = jQuery(el).prev().prev().val();
            bookname = jQuery(el).parent().find('input[name*="title"]').val().replaceAll(/<.*?>/g, "");
            m_isbn = jQuery(el).next().text().match(/ISBN : ([\d-]+)\n/);
            var ele_title = jQuery(el).next().find("dt").find("a");
            ele_title.after(dxtoc(ele_title.attr("href")) + (m_isbn ? dblink(bookname, m_isbn[1]) : dblink(bookname)));
            if (ssid) {
                jQuery(el).children().first().after(showbid(ssid, "SS号"));
            } else if (dxid) {
                jQuery(el).children().first().after(showbid(dxid, "DX号"));
            }
        });
    } else if (pageurl.includes("fx.ccelib.com/s?")) {
        jQuery('div[class="savelist clearfix"]').each(function (i, el) {
            var ele_ul = jQuery(el).find('div.savelist_con > div.savelist_box > ul');
            if (ele_ul.find('li.biaoti > a:first').text() === "[图书]") {
                 var ele_title = ele_ul.find('li.biaoti > a:last');
                 bookname = ele_title.text().trim();
                 var ele_input = jQuery(el).find('div.save_img > input');
                 bookid = iid2bookid(ele_input.attr("img").match(/iid=(\w+)/)[1]);
                 jQuery(el).find('div.save_img > a').after(showbid(bookid, bookid.length == 8 ? "SS号": "DX号"));
                 var m_isbn = ele_ul.text().match(/ISBN:([\d-]+)\n/);
                 ele_title.after(m_isbn ? dblink(bookname, m_isbn[1], "", "color: blue; float: none;") : dblink(bookname, "", "", "color: blue; float: none;"));
            }
        });
    } else if (pageurl.includes("/views/specific/")) {
        m_ssn = jQuery("script:contains(send_requestajax)").text().match(/ssn=(\d{3,})/);
        m_dxid = pageurl.match(/dxNumber=(\d+)/);
        img = jQuery("div.tubookimg>img");
        if (m_ssn) {
            img.after(showbid(m_ssn[1], "SS号"));
        } else if (m_dxid) {
            img.after(showbid(m_dxid[1], "DX号"));
        }
        bookname = jQuery("div.tutilte").text();
        m_isbn = jQuery("div.tubox").find("dl").text().match(/【ISBN号】(.*?)\n/);
        snippet = m_isbn ? dblink(bookname, m_isbn[1], "") : dblink(bookname, "");
        img.after(`<p style="text-align: center">${snippet}</p>`);
    } else if (pageurl.includes("bookDetail.jsp?") && jQuery('input#dxid').val()) {
        m_iid = jQuery("div#bookphoto").html().match(/CoverNew.dll\?iid=(\w{40,56}\b)/);
        m_ssn = jQuery("script:contains(send_requestlib)").text().match(/ssn=(\d{3,})/);
        m_dxid = pageurl.match(/dxNumber=(\d+)/);
        img = jQuery("#grade1").prev();
        if (m_iid) {
            bookid = iid2bookid(m_iid[1]);
            img.after(showbid(bookid, bookid.length == 8 ? "SS号": "DX号"));
        } else if (m_ssn) {
            img.after(showbid(m_ssn[1], "SS号"));
        } else if (m_dxid) {
            img.after(showbid(m_dxid[1], "DX号"));
        }
        bookname = jQuery("input#dxid").prev().text();
        m_isbn = jQuery("div.card_text").find("dl").text().match(/ISBN号 :(.*?)\n/);
        snippet = m_isbn ? dblink(bookname, m_isbn[1], "") : dblink(bookname, "");
        img.after(`<p style="text-align: center">${dxtoc(pageurl)} | ${snippet}</p>`);
    } else if (pageurl.includes("://cadal.edu.cn/cardpage/bookCardPage?")) {
        bookid = pageurl.match(/ssno=(\w+)/)[1];
        jQuery('div.title_img').each(function (i, el) {
            bookname = jQuery("span.title").text().trim();
            m_isbn = jQuery(el).next().text().match(/ISBN:(.*?)\n/);
            jQuery("span.title").after(m_isbn ? dblink(bookname, m_isbn[1]) : dblink(bookname));
            jQuery(el).find("a").after(showbid("CD" + bookid, "CADAL号<br>"));
        });
        jQuery("#menu_area").show();
    } else if (pageurl.includes("fx.ccelib.com/detail_")) {
        jQuery('div[class="savelist clearfix"]').each(function (i, el) {
            img = jQuery(el).find('div.save_img > img:first');
            if (img.next().text() === "【图书】") {
                bookname = jQuery("h4.falv_tit").text().trim();
                var ele_ul = jQuery(el).find('div.savelist_con > ul.infolist');
                var ele_headline = ele_ul.find('li.biaoti').children().last();
                bookid = iid2bookid(img.attr("src").match(/iid=(\w+)/)[1]);
                img.after(showbid(bookid, bookid.length == 8 ? "SS号": "DX号"));
                m_isbn = ele_ul.text().match(/【ISBN】([\d-]+)\n/);
                console.log(m_isbn);
                ele_headline.after(m_isbn ? dblink(bookname, m_isbn[1], "", "color: blue; float: none;") : dblink(bookname, "", "", "color: blue; float: none;"));
            }
        });
    } else if (pageurl.includes("chapter.jsp?") && pageurl.includes("dxNumber=")) {
        var also = jQuery("#also");
        also.after('<p style="color: orange; font-size: 120%;">以下目录非完整版,由于读秀限制,仅展示匹配了 <a href="https://greasyfork.org/zh-CN/scripts/435569/" target="_blank">文献互助小帮手</a> 脚本内置关键词的条目。</p>');
    }
})();