Reddit - Top Comments Preview

Preview to the top comments on Reddit

目前為 2015-03-04 提交的版本,檢視 最新版本

// ==UserScript==
// @name           Reddit - Top Comments Preview
// @namespace      https://gf.qytechs.cn/users/5174-jesuis-parapluie
// @author         Erik Wannebo, gavin19, jesuis-unparapluie
// @description    Preview to the top comments on Reddit
// @include        http://*.reddit.com/*
// @exclude        http://*.reddit.com/*/comments/*
// @include        https://*.reddit.com/*
// @exclude        https://*.reddit.com/*/comments/*
// @grant          none
// @version        1.63
// ==/UserScript==
(function () {
    'use strict';
    var topCP = {
        opts: {
            /* Number of comments to display. Default is 3 */
            topComments: 3,
            /* click or hover. Do you want to hover the link to trigger it, or click? */
            eventType: 'click',
            /* set keyboard shortcut 't' to show/hide active top comments (only with RES) */
            setShortCut: true,
            /* auto expand on siteload (for RES) */
            setAutoExpand: false
        },
        addTopLinks: function () {
            var i, len, link, li, articleID, tmp, parent,
                a = document.querySelectorAll('.linklisting .comments:not(.empty)');
            if (a.length) {
                for (i = 0, len = a.length; i < len; i += 1) {
                    if (!a[i].parentNode.parentNode.querySelector('.toplink') && /[0-9]/.test(a[i])) {
                        articleID = a[i].getAttribute('href');
                        articleID = articleID.substring(articleID.indexOf('/comments/') + 10, articleID.indexOf('/comments/') + 16);
                        link = document.createElement('a');
                        li = document.createElement('li');
                        //li.className = 'rcp';
                        li.appendChild(link);
                        link.className = 'toplink';
                        tmp = "java";
                        link.href = tmp + 'script:;';
                        link.setAttribute('id', 'toplink' + articleID);
                        link.setAttribute('style', 'color:orangered;text-decoration:none;');
                        link.textContent = ' top';
                        parent = a[i].parentNode.parentNode;
                        parent.insertBefore(li, parent.querySelector('.first + li'));
                        topCP.addListener(link, articleID);
                    }
                }
            }
        },
        addListener: function (link, id) {
            link.addEventListener(topCP.opts.eventType, function () {
                topCP.retrieveTopComments(this, id);
            });
        },
        retrieveTopComments: function (ele, articleID) {
            var pre, url, xhr, thisPre;
            topCP.kill_preview = function () { this.parentNode.removeChild(this); }
            ele = ele.parentNode.parentNode.parentNode;
            if (!document.querySelector('#preview' + articleID)) {
                pre = document.createElement('div');
                pre.setAttribute('id', 'preview' + articleID);
                pre.classList.add('loading');
                pre.addEventListener('click', topCP.kill_preview);
                //ele.querySelector('.first').insertBefore(pre, null);
                ele.insertBefore(pre, ele.querySelector('.expando'));
                url =  window.location.href.split("/")[0]+'//www.reddit.com/comments/' + articleID + '/.json?limit=' + (topCP.opts.topComments + 5) + '&sort=top';
                xhr = new XMLHttpRequest();
                xhr.open('GET', url, true);
                xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
                xhr.onreadystatechange = function () {
                    if (xhr.readyState === 4 && xhr.status === 200) {
                        topCP.onloadJSON(xhr);
                    }
                };
                xhr.send(null);
            } else {
                thisPre = document.querySelector('#preview' + articleID);
                thisPre.parentNode.parentNode.style.marginBottom = '';
                thisPre.parentNode.removeChild(thisPre);
            }
        },
        onloadJSON: function (response) {
            var i, len, content, score, contentDiv, article, author, permalink,
                newHTML = '',
                comments = JSON.parse(response.responseText),
                commentsLength = comments[1].data.children.length,
                articleID = comments[0].data.children[0].data.id,
                threadLink = comments[0].data.children[0].data.permalink;
            len = topCP.opts.topComments < commentsLength ? topCP.opts.topComments : commentsLength;
            for (i = 0; i < len; i += 1) {
                content = comments[1].data.children[i].data.body_html;
                if (content) {
                    
                    contentDiv = document.createElement('div');
                    contentDiv.innerHTML = content;
                    content = contentDiv.firstChild.textContent;
                    author = comments[1].data.children[i].data.author;
                    score = comments[1].data.children[i].data.score;
                    permalink = threadLink + comments[1].data.children[i].data.id;
                    newHTML += (i > 0 ? '<hr>' : '');
                    newHTML += '<a class="ulink" target="_blank" href="/u/' + author;
                    newHTML += '">' + author + '</a>';
                    newHTML += '<span class="points">| score: ' + score + '</span>';
                    newHTML += '<a class="permalink" target="_blank" href="' + permalink + '">permalink</a><br />' + content;
                }
            }
        article = document.querySelector('#preview' + articleID);
        if (article) {
            article.classList.remove('loading');
            article.innerHTML = newHTML;
            article.removeEventListener(topCP.opts.eventType, topCP.kill_preview);
        }            
            article = document.querySelector('#preview' + articleID);
            if (article) {
                article.classList.remove('loading');
                article.innerHTML = newHTML;
                article.removeEventListener('click', topCP.kill_preview);
            }
        },
        addStyle: function () {
            var style,
                sheet = '';
            sheet += "div[id^=preview]{box-sizing:border-box;-moz-box-sizing:border-box;background:#fff;border-radius:5px;border:1px solid #dbdbdb;white-space:normal;padding:5px;display:inline-block;margin:8px 0;}";
            sheet += ".loading:before{content:\"Loading...\";}div[id^=preview] .md{border:1px solid #ddd;background:#f0f0f0;box-sizing:border-box;-moz-box-sizing:border-box;margin:3px 0;box-sizing:border-box;padding:2px 8px;}";
            sheet += "div[id^=preview] .md *{white-space:normal;}div[id^=preview] .md code{white-space:pre;}";
            sheet += "div[id^=preview] .md pre{overflow:visible}div[id^=preview]>*{font-size: small;}";
            sheet += "div[id^=preview] .ulink,div[id^=preview] .md a{font-weight:bold;color:#369!important;}";
            sheet += ".listing-page .buttons li{vertical-align:top;}.toplink{text-decoration:none;}";
            sheet += ".permalink { float: right; color: #666;}.points{color:#333;font-weight:bold;margin-left:.5em;}"
            sheet += ".res-nightmode div[id^=preview] .ulink,.res-nightmode div[id^=preview] .md a{color: rgb(20, 150, 220)!important;}";
            sheet += ".res-nightmode div[id^=preview]{ background: #333!important;border-color:#666!important}";
            sheet += ".res-nightmode .toplink{color: #eee!important;}";
            sheet += ".res-nightmode div[id^=preview] .points{color: #ddd!important;}";
            sheet += ".res-nightmode div[id^=preview] .permalink{color: #ccc!important;}";
            sheet += ".res-nightmode div[id^=preview] .md{background:#555!important;border-color: #222!important;}";
            sheet += ".res-nightmode div[id^=preview] .md blockquote{color:#8C8C8C!important;}";
            sheet += ".res-nightmode div[id^=preview] hr{border-color:#777!important;}";
            style = document.createElement('style');
            style.type = 'text/css';
            style.textContent = sheet;
            document.querySelector('head').appendChild(style);
        },
        init: function () {
            document.body.addEventListener('DOMNodeInserted', function (e) {
                if ((e.target.tagName === 'DIV') && (e.target.getAttribute('id') && e.target.getAttribute('id').indexOf('siteTable') !== -1)) {
                    topCP.addTopLinks();
                }
            }, true);
            document.body.addEventListener('DOMNodeInserted', function (e) {
                if ((e.target.tagName === 'DIV') && (e.target.getAttribute('id') && e.target.getAttribute('id').indexOf('siteTable') !== -1)) {
                    topCP.addTopLinks();
                }
            }, true);
            if (topCP.opts.setShortCut)
            {
                window.addEventListener("keyup", function(e) {
                 //t: keycode 84
                 if(e.keyCode === 84 && document.querySelector('.RES-keyNav-activeElement')) {
                    document.querySelector('.RES-keyNav-activeElement .toplink').click();
                  }
                });
            }
            if (topCP.opts.setAutoExpand)
            {
                document.querySelector('#viewImagesButton').click();
            }
            topCP.addStyle();
            topCP.addTopLinks();
        }
    };
    if (document.body) {
        setTimeout(function () {
            topCP.init();
        }, 300);
    } else {
        window.addEventListener('load', function () {
            topCP.init();
        }, false);
    }
}());

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址