footnote

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

// ==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('复制成功!');
    });
})();