Greasy Fork

Yet Another #自古CB出评论 sharing plugin

一键分享 cnBeta 新闻的评论

// ==UserScript==
// @name          Yet Another #自古CB出评论 sharing plugin
// @namespace     http://gplus.me/JaHIY
// @description   一键分享 cnBeta 新闻的评论
// @grant         GM_getValue
// @grant         GM_setValue
// @grant         GM_registerMenuCommand
// @match         http://cnbeta.com/articles/*
// @match         http://www.cnbeta.com/articles/*
// @version       1.1.10
// @homepageURL   https://greasyfork.org/scripts/5029
// @run-at        document-end
// ==/UserScript==

"use strict";

if (typeof GM_getValue !== "function") {
    var GM_getValue = function(key, default_value) {
        return default_value;
    };
}

var cBshare = function ($comments, $where_to_add_links_callback) {
    var $doc = document,
        $template_link = $doc.createElement("a"),
        $template_text = $doc.createElement("span"),
        $template_newline = $doc.createElement("br"),
        $post_title = $doc.getElementById("news_title").textContent.trim(),
        $post_url = window.location.href;
    $template_link.rel = "external nofollow noreferer";
    $template_link.className = "cbshare commt_a_link";
    return {
        "link_start": function () {
            var comments = $comments,
                where_to_add_links_callback = $where_to_add_links_callback,
                doc = $doc,
                i = comments.length,
                template = cBshare.generate_template(),
                generate_content = function (comment_node) {
                    var content_dict = {
                            "comment": comment_node.textContent.trim(),
                            "title": $post_title,
                            "url": $post_url
                        },
                        content = template.replace(/\{%(title|comment|url)%\}/g, function (match, p1, offset, string) {
                            return content_dict[p1];
                        });
                    return content;
                },
                generate_links = function (template) {
                    var fragment, temp_link, temp_text, temp_newline, parent_node,
                        template_single = template.replace(/\{%tag%\}/g, "#自古CB出评论"),
                        template_double = template.replace(/\{%tag%\}/g, "#自古CB出评论#"),
                        fragments = [
                            [
                                encodeURI('http://widget.renren.com/dialog/forward?content=') + encodeURIComponent(template_double),
                                "rentag",
                                "以 #自古CB出评论# 发表至人人",
                                "#人"
                            ], [
                                encodeURI('https://twitter.com/intent/tweet?text=') + encodeURIComponent(template_single),
                                "twitag",
                                "以 #自古CB出评论 发表至推特",
                                "#推"
                            ], [
                                encodeURI('http://service.weibo.com/share/share.php?title=') + encodeURIComponent(template_double),
                                "weitag",
                                "以 #自古CB出评论# 发表至微博",
                                "#微"
                            ]
                        ],
                        i = fragments.length,
                        template_link = $template_link,
                        template_text = $template_text,
                        template_newline = $template_newline,
                        df = doc.createDocumentFragment();
                    parent_node = template_text.cloneNode(true);
                    parent_node.className = "cbshare_bar";
                    temp_newline = template_newline.cloneNode(true);
                    parent_node.appendChild(temp_newline);
                    do {
                        i -= 1;
                        fragment = fragments[i];
                        temp_link = template_link.cloneNode(true);
                        temp_text = template_text.cloneNode(true);
                        temp_link.href = fragment[0];
                        temp_link.classList.add(fragment[1]);
                        temp_link.title = fragment[2];
                        temp_text.textContent = fragment[3];
                        temp_link.appendChild(temp_text);
                        parent_node.appendChild(temp_link);
                    } while (i !== 0);
                    df.appendChild(parent_node);
                    return df;
                },
                comment;
            if (i === 0) {
                console.warn("Cannot get comments! (Maybe this page has no comment.)");
            } else {
                do {
                    i -= 1;
                    comment = comments[i];
                    where_to_add_links_callback(comment).appendChild(generate_links(generate_content(comment)));
                } while (i !== 0);
            }
            return this;
        }
    };
};

cBshare.external_links = function () {
    var open_links_in_new_window = function (event) {
            var target = event.target.parentNode;
            if (target.classList.contains("cbshare")) {
                event.preventDefault();
                event.stopPropagation();
                window.open(target.href, "_blank");
            }
        };
    document.getElementsByClassName("main_content")[0].addEventListener("click", open_links_in_new_window, false);
    return this;
};

cBshare.append_style = (function () {
    var doc = document,
        style = doc.createElement("style");
        style.textContent = "a.weitag:link span,a.weitag:hover span{color:#EB192D;}\
            a.twitag:link span,a.twitag:hover span{color:#00C8FA;}\
            a.rentag:link span,a.rentag:hover span{color:#005EAC;}";
    return function () {
        try {
            doc.head.appendChild(style);
        } catch (err) {
            console.error("Cannot append style to <head>!");
        } finally {
            return this;
        }
    };
}());

cBshare.template = "{%comment%} ——「{%title%}」 {%url%} {%tag%}";

cBshare.generate_template = function () {
    return GM_getValue("template", this.template);
};

cBshare.create_observer = function (where_to_get_comments_callback, where_to_add_links_callback) {
    return new MutationObserver(function (mutationRecord, observer) {
        mutationRecord.forEach(function (mutation) {
            var n = mutation.addedNodes,
                i = n.length;
            do {
                i -= 1;
                (n[i].nodeType === Node.ELEMENT_NODE) && cBshare(where_to_get_comments_callback(n[i]), where_to_add_links_callback).link_start();
            } while (i !== 0);
        });
    });
};

cBshare.append_style().external_links();

var commt_list_observer = cBshare.create_observer(function (e) {
        return e.getElementsByClassName("re_text");
    }, function (e) {
        return e.nextElementSibling;
    }),
    hotcommt_list_observer = cBshare.create_observer(function (e) {
        return e.querySelectorAll(".comContent em");
    }, function (e) {
        return e.parentNode.parentNode.nextElementSibling.firstElementChild;
    });
commt_list_observer.observe(document.getElementById("J_commt_list"), {"childList": true});
hotcommt_list_observer.observe(document.getElementById("J_hotcommt_list"), {"childList": true});

if (typeof GM_registerMenuCommand === "function") {
    GM_registerMenuCommand("「#自古CB出评论」模板设置", function () {
        var template, template_input, temp_link, cbshare_links, i;
        template = cBshare.generate_template();
        template_input = prompt("「#自古CB出评论」模板设置\n\n可用变量:\n{%title%} - 文章标题;\n{%url%} - 文章链接;\n{%comment%} - 评论正文;\n{%tag%} - 奇怪的标签;\n\n默认值:" + cBshare.template + "\n\n", template);
        if (template_input !== null && template !== template_input) {
            GM_setValue("template", template_input);
            cbshare_links = document.getElementsByClassName("main_content")[0].getElementsByClassName("cbshare_bar");
            i = cbshare_links.length;
            while (i !== 0) {
                i -= 1;
                temp_link = cbshare_links[i];
                temp_link.parentNode.removeChild(temp_link);
            }
            cBshare(document.getElementById("J_commt_list").getElementsByClassName("re_text"), function (e) {
                return e.nextElementSibling;
            }).link_start();
            cBshare(document.querySelectorAll("#J_hotcommt_list .comContent em"), function (e) {
                return e.parentNode.parentNode.nextElementSibling.firstChild;
            }).link_start();
        }
    });
}