UCDRS Wikipedia Reference Generator

访问全国图书馆参考咨询联盟(ucdrs.superlib.net)的书籍信息页面时,生成一个引用按钮,引用为维基百科Cite Book模板格式。Generate a reference button with Wikipedia Cite Book Template style when visiting the book detail page in ucdrs.superlib.net

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

// ==UserScript==
// @name         UCDRS Wikipedia Reference Generator
// @version      0.1.4
// @description  访问全国图书馆参考咨询联盟(ucdrs.superlib.net)的书籍信息页面时,生成一个引用按钮,引用为维基百科Cite Book模板格式。Generate a reference button with Wikipedia Cite Book Template style when visiting the book detail page in ucdrs.superlib.net
// @author       Wikipedia User:瑞丽江的河水
// @license      MIT
// @match        http://book.ucdrs.superlib.net/views/specific/2929/bookDetail.jsp?*
// @grant        GM_setValue
// @grant        GM_getValue
// @namespace https://greasyfork.org/users/968912
// ==/UserScript==

(function() {
    'use strict';
    var pages_style = GM_getValue('page_styles') === 2 ? 2 : 1;
    var details = getDetails();
    var reference = generateCitation(details, pages_style);
    generateButton(reference);
    var copy_btn = document.getElementById('cite_wikipedia');
    copy_btn.onclick = function () {
        var cite_text = document.getElementById('wikipedia_template');
        cite_text.select();
        document.execCommand('copy');
        alert("复制成功");
    }

    var pages_style_1 = document.getElementById('pages_style_1');
    pages_style_1.onclick = function () {
        GM_setValue('page_styles', 1);
        location.reload();
    }

    var pages_style_2 = document.getElementById('pages_style_2');
    pages_style_2.onclick = function () {
        GM_setValue('page_styles', 2);
        location.reload();
    }
})();

function getDetails() {
    var title = document.getElementsByClassName("tutilte")[0].innerHTML;
    var author = "";
    var publication = "";
    var location = "";
    var publisher = "";
    var year = "";
    var isbn = "";
    var dd_num = document.getElementsByTagName("dd").length;
    for(var i = 0; i < dd_num; i++) {
        var temp = document.getElementsByTagName("dd")[i].innerHTML;
        if(temp.includes("【作 者】")) {
            author = temp;
        } else if (temp.includes("【出版项】")) {
            publication = temp;
        } else if (temp.includes("【ISBN号】")) {
            isbn = temp;
        }
    }
    var regex = /\t|\n| /gi;
    title = title.replaceAll(/  /gi, ' ');
    author = author.substring(author.indexOf("【作 者】") + "【作 者】".length, author.length).replaceAll(regex, '');
    publication = publication.substring(publication.indexOf("【出版项】") + "【出版项】".length, publication.length).replaceAll(regex, '');
    location = publication.substring(0, publication.indexOf(":"));
    location = location_exception_handling(location);
    publisher = publication.substring(publication.indexOf(":") + ":".length, publication.indexOf(","));
    year = publication.substring(publication.indexOf(",") + ",".length, publication.indexOf("."));
    isbn = isbn.substring(isbn.indexOf("【ISBN号】") + "【ISBN号】".length, isbn.length).replaceAll(regex, '').replaceAll('M', '');
    return [author, title, location, publisher, year, isbn];
}

function location_exception_handling(location) {
    if(location==="芒") {
        location = "芒市";
    }
    return location;
}

function generateCitation(details, pages_style) {

    // Header
    var reference = "{{cite book";
    if(pages_style === 1) {
        var ref_name;
        if(details[5] !== "") {
            ref_name = ":" + details[5];
        } else {
            ref_name = details[1].substring(0, 5);
        }
        reference = "<ref name=\"" + ref_name + "\">" + reference;
    } else {
        reference = "<ref>" + reference;
    }

    // Author
    if(details[0] !== "") {
        details[0] = details[0].replace(/,/g,",");
        details[0] = details[0].replace(/;/g,"; ");
        reference = reference + " |author=" + details[0];
    }

    // Title
    reference = reference + " |title=" + details[1];

    // Location
    if(details[2] !== "") {
        reference = reference + " |location=" + details[2];
    }

    // Publisher
    if(details[3] !== "") {
        reference = reference + " |publisher=" + details[3];
    }

    // Year
    if(details[4] !== "") {
        reference = reference + " |year=" + details[4];
    }

    // ISBN
    if(details[5] !== "") {
        var pure_isbn = details[5].replace(/·|-/g,"");
        if(pure_isbn.length < 10) {
            reference = reference + " |csbn=" + details[5];
        } else {
            reference = reference + " |isbn=" + details[5];
            if(!checkISBN(pure_isbn)) {
                reference = reference + " |ignore-isbn-error=true";
            }
        }
    }

    // pages
    if(pages_style === 2) {
        reference = reference + " |pages=";
    }

    // Footer
    reference = reference + " }}";
    if(pages_style === 1) {
        reference = reference + "</ref>{{rp|}}";
    } else {
        reference = reference + "</ref>";
    }
    return reference;
}

function checkISBN(isbn) {
    var isbn_array = Array.from(isbn);
    var check_digit;
    if(isbn_array.length === 10) {
        check_digit = (1 * isbn_array[0] + 2 * isbn_array[1] + 3 * isbn_array[2] + 4 * isbn_array[3] + 5 * isbn_array[4] + 6 * isbn_array[5] + 7 * isbn_array[6] + 8 * isbn_array[7] + 9 * isbn_array[8]) % 11;
        if(check_digit === 10) {
            check_digit = 'X';
        }
        if(check_digit != isbn_array[9]) {
            return false;
        }
    } else if(isbn_array.length === 13) {
        check_digit = (1 * isbn_array[0] + 3 * isbn_array[1] + 1 * isbn_array[2] + 3 * isbn_array[3] + 1 * isbn_array[4] + 3 * isbn_array[5] + 1 * isbn_array[6] + 3 * isbn_array[7] + 1 * isbn_array[8] + 3 * isbn_array[9] + 1 * isbn_array[10] + 3 * isbn_array[11]) % 10;
        if(check_digit !== 0) {
            check_digit = 10 - check_digit;
        }
        if(check_digit != isbn_array[12]) {
            return false;
        }
    }
    return true;
}

function generateButton(reference) {
    var content_body = document.getElementsByClassName("tu_content")[0].innerHTML;
    content_body = "<div>" + content_body + "</div>";
    var info = "<div style='margin-top: 10px;'><b>引用为维基百科Cite Book模板格式:</b></div>";
    var pages_style_selector_1 = "<button id='pages_style_1' style='padding-top: 3px; padding-bottom: 3px; padding-left: 7px; padding-right: 7px; cursor: pointer;'>{{rp|}}</button>";
    var pages_style_selector_2 = "<button id='pages_style_2' style='padding-top: 3px; padding-bottom: 3px; padding-left: 7px; padding-right: 7px; cursor: pointer;'>|pages=</button>";
    var pages_style_selector = pages_style_selector_1 + " " + pages_style_selector_2;
    var textarea = "<div style='margin-top: 5px;'><textarea style='padding: 3px; min-width: 80%; height: 50px; border: 2px solid #ccc; border-radius: 4px; background-color: #f8f8f8; resize:none;' id='wikipedia_template' readonly>" + reference + "</textarea></div>";
    var button = "<div style='margin-top: 10px; margin-left: 72%;'><button id='cite_wikipedia' style='padding-top: 3px; padding-bottom: 3px; padding-left: 7px; padding-right: 7px; cursor: pointer;'>复制</button></div>";
    document.getElementsByClassName("tu_content")[0].innerHTML = content_body + info + pages_style_selector + textarea + button;
}