footnote

从豆瓣读书网页中提取元数据并生成中文引用格式(芝加哥格式)。

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey, Greasemonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Violentmonkey.

За да инсталирате този скрипт, трябва да имате инсталирано разширение като Tampermonkey или Userscripts.

За да инсталирате скрипта, трябва да инсталирате разширение като Tampermonkey.

За да инсталирате този скрипт, трябва да имате инсталиран скриптов мениджър.

(Вече имам скриптов мениджър, искам да го инсталирам!)

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да инсталирате разширение като Stylus.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

За да инсталирате този стил, трябва да имате инсталиран мениджър на потребителски стилове.

(Вече имам инсталиран мениджър на стиловете, искам да го инсталирам!)

// ==UserScript==
// @name         footnote
// @name:zh-CN         豆瓣读书生成中文引用格式
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  从豆瓣读书网页中提取元数据并生成中文引用格式(芝加哥格式)。
// @description:zh-CN  从豆瓣读书网页中提取元数据并生成中文引用格式(芝加哥格式)。
// @author       entr0pia
// @match        https://book.douban.com/*
// @grant        GM_setClipboard
// @license      MIT
// ==/UserScript==

(function () {
    'use strict';

    var title = document.querySelector("#wrapper > h1 > span").textContent;

    var subtitle, author1st, authors, publisher, year, pages, translators='', originalTitle='';
    function catSpan(n) {
        var key = n.textContent.trim().split(':')[0];
        var ast;
        switch (key) {
            case '作者':
                author1st = n.querySelectorAll('a')[0].textContent;
                var authorsList = Array.from(n.querySelectorAll('a'))
                    .map(a => a.textContent);
                authors = authorsList.join(',');
                ast = authors.split(/[,、]/);
                if (ast.length > 1) {
                    author1st = ast[0]
                    authors = ast.join(',');
                }
                console.log('一作:'+author1st);
                break;
            case '出版社':
                publisher = n.nextElementSibling.textContent;
                break;
            case '副标题':
                subtitle = n.nextSibling.textContent.trim();
                console.log('副标题:' + subtitle);
                break;
            case '原作名':
                originalTitle = n.nextSibling.textContent.trim();
                console.log('原作名:' + originalTitle);
                break;
            case '出版年':
                var yearText = n.nextSibling.textContent.trim();
                // 处理格式如 "2024-6-1" 转换为 "2024.06"
                var yearMatch = yearText.match(/(\d{4})-(\d{1,2})-?(\d{1,2})?/);
                if (yearMatch) {
                    var yearPart = yearMatch[1];
                    var monthPart = yearMatch[2].padStart(2, '0');
                    year = yearPart + '.' + monthPart;
                } else {
                    // 如果格式不匹配,直接使用原文本
                    year = yearText;
                }
                console.log('出版年:' + year);
                break;
            case '页数':
                pages = n.nextSibling.textContent.trim();
                break;
            case '译者':
                translators = Array.from(n.querySelectorAll('a'))
                    .map(a => a.textContent)
                    .join(',');
                ast = translators.split(/[,、]/);
                if (ast.length > 1) {
                    translators = ast.join(',');
                }
                console.log('译者:' + translators);
                break;
        }
    }

    // 提取元数据
    Array.from(document.querySelectorAll('#info > span'))
        .map(n => catSpan(n));

    // 构建中文引用格式
    var citation = '';

    // 作者部分 - 格式:作者中文名(作者原名)、作者中文名(作者原名) 著
    if (authors) {
        // 注意:豆瓣上的作者通常已经是中文名,原名信息可能不完整
        // 这里假设作者信息就是中文名,如果需要原名需要额外处理
        citation += authors + ' 著';
    }

    // 译者部分
    if (translators) {
        citation += ', ' + translators + ' 译';
    }

    citation += '. ';

    // 书名部分 - 格式:《书籍中文名》(书籍原名)
    var fullTitle = title;
    if (subtitle) {
        fullTitle = title + ':' + subtitle;
    }
    citation += '《' + fullTitle + '》';

    // 原文书名
    if (originalTitle) {
        citation += '(' + originalTitle + ')';
    }

    citation += '. ';

    // 出版社和年份
    if (publisher) {
        citation += publisher;
    }

    if (year) {
        citation += ', ' + year;
    }

    citation += '. ';

    console.log('生成的引用格式:', citation);

    // 添加一个按钮,点击后将引用文本复制到剪贴板
    const bibButton = document.createElement('button');
    bibButton.textContent = '复制中文引用';
    bibButton.className = 'j a_show_login lnk-sharing lnk-douban-sharing';
    bibButton.type = 'button';
    const container = document.querySelector("#content > div > div.article > div.indent > div.rec-sec");
    if (container != null) {
        container.appendChild(bibButton);
    }

    bibButton.addEventListener('click', () => {
        GM_setClipboard(citation);
        alert('复制成功!');
    });
})();