去皮微博

讓微博更乾淨。

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

'use strict';

var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

// ==UserScript==
// @name         Cleaner Weibo
// @name:zh-CN   去皮微博
// @name:zh-TW   去皮微博
// @namespace    NB-Kevin
// @version      0.1.2
// @description  Make weibo cleaner.
// @description:zh-CN 讓微博更乾淨。
// @description:zh-TW 讓微博更乾淨。
// @author       Nb/Kevin
// @match        http://weibo.com/*
// @match        http://www.weibo.com/*
// @match        http://d.weibo.com/*
// @match        http://s.weibo.com/*
// @grant        none
// ==/UserScript==

// Transpiled by Babel from ES6 to ES5.
// Edited with WebStorm.

/**
 * Convert a node list to array.
 * @returns {Array.<HTMLElement>}
 */
NodeList.prototype.toArray = function () {
    var that = this;
    return Array.prototype.slice.call(that);
};

/**
 * Hide an HTML element.
 */
HTMLElement.prototype.hide = function () {
    if (this.className.indexOf('_CWHide') == -1) this.className += ' _CWHide';
};

/**
 * Create an element from HTML string.
 * @return {HTMLElement} The element.
 */
String.prototype.toHTMLElement = function () {
    var templateElement = document.createElement('template');
    templateElement.innerHTML = this;
    return templateElement.content.firstChild;
};

/**
 * Log to console.
 * @param {string} message Message.
 */
var log = function log(message) {}
// uncomment this line to enable logging
// console.log(`CleanerWeibo |> ${message}`)


/**
 * Root.
 */
;var CleanerWeibo = {
    Resources: {
        Elements: {
            get HomeFeed() {
                var candidate = document.querySelector('[node-type="homefeed"]');
                if (candidate == null || candidate == undefined) candidate = document.querySelector('[node-type="feedconfig"]');
                return candidate;
            }
        },

        Styles: '<style>\n                    ._CWRightUserName {\n                        max-width: 175px !important;\n                    }\n                    ._CWFeedSendBox {\n                        padding-bottom: 0 !important;\n                    }\n                    ._CWGeneralNavNameIcon {\n                        max-width: 200px !important;\n                    }\n                    ._CWHide {\n                        display: none !important;\n                    }\n                    ._CWNoBackgroundImage {\n                        background-image: none !important;\n                    }\n                </style>'.toHTMLElement(),

        Selectors: {
            RightWildcard: '[id^="v6_pl_rightmod_"]',
            RightVIP: '#v6_trustPagelet_recom_member',
            FeedInputTitle: '.title_area',
            RightSetSkin: '#v6_pl_content_setskin',
            RightWBLevelIcon: '.W_icon_level',
            RightWBLevelText: '.icon_member_dis',
            GeneralNewIcon: '.W_new, .W_new_count, .W_new_ani',
            GeneralWebIM: '#WB_webim',
            GeneralPlayer: '.PCD_mplayer',
            GeneralSearchPlaceHolder: '.placeholder',
            GeneralFooter: '.WB_footer',
            FeedTips: '.W_tips',
            GeneralNavIcon: '[nm="game"], [nm="find"]',
            FeedSendBox: '.send_weibo',
            RightUserName: '.name',
            GeneralNavNameIcon: '[nm="name"]',
            LeftHotWeibo: '[suda-uatrack$="left_hotweibo"]',
            GeneralSinaLogo: '[node-type="logolink"]',
            FeedTopAd: '#v6_pl_content_biztips',
            SingleRightPanel: '[id^="Pl_Core_RecommendList"]',
            SingleStarCover: '.WB_starcover',
            UserPageSkinUseCount: '.pf_use_num',
            UserPageSkinUseForMeAsWell: '.pf_copy_icon',
            UserPageFollowerInterest: '[id^="Pl_Core_Ut1UserList"]',
            DiscoverLogo: '.logo_box',
            SearchTrend: '#pl_weibo_hotband',
            SearchLogo: '.search_logo',
            SearchFooter: '.search_footer',
            FeedVipCover: '.WB_vipcover',
            FeedDetail: '.WB_feed_detail',
            FeedBottomAdvertisement: '#v6_pl_ad_bottomtip',
            GeneralVipIcon: '[href*="vipicon"]',
            GeneralLevelIcon: '[class*="icon_member"]',
            GeneralClubIcon: '.icon_club',
            DiscoverRightPanelAdvertisement: '[id*="Pl_Core_ThirdHtmlData__"]',
            SearchRightPanelRecommendProduct: '#pl_common_ali',

            /**
             * Direct selectors.
             * @return {string}
             */
            get DirectSelectors() {
                return [this.RightVIP, this.FeedInputTitle, this.RightSetSkin, this.RightWBLevelIcon, this.RightWBLevelText, this.GeneralNewIcon, this.GeneralWebIM, this.GeneralPlayer, this.GeneralSearchPlaceHolder, this.GeneralFooter, this.FeedTips, this.GeneralNavIcon, this.LeftHotWeibo, this.GeneralSinaLogo, this.FeedTopAd, this.SingleRightPanel, this.SingleStarCover, this.UserPageSkinUseCount, this.UserPageSkinUseForMeAsWell, this.UserPageFollowerInterest, this.DiscoverLogo, this.SearchTrend, this.SearchLogo, this.SearchFooter, this.FeedVipCover, this.FeedBottomAdvertisement, this.GeneralVipIcon, this.GeneralLevelIcon, this.GeneralClubIcon, this.DiscoverRightPanelAdvertisement, this.SearchRightPanelRecommendProduct].join(',');
            }
        },

        StylePatcher: [{
            get selector() {
                return CleanerWeibo.Resources.Selectors.FeedSendBox;
            },
            patcher: function patcher(element) {
                if (element.className.indexOf('_CWFeedSendBox') == -1) element.className += ' _CWFeedSendBox';
            }
        }, {
            get selector() {
                return CleanerWeibo.Resources.Selectors.RightUserName;
            },
            patcher: function patcher(element) {
                if (element.className.indexOf('_CWRightUserName') == -1) element.className += ' _CWRightUserName';
            }
        }, {
            get selector() {
                return CleanerWeibo.Resources.Selectors.FeedDetail;
            },
            patcher: function patcher(element) {
                if (element.className.indexOf('_CWNoBackgroundImage') == -1) element.className += ' _CWNoBackgroundImage';
            }
        }, {
            get selector() {
                return CleanerWeibo.Resources.Selectors.GeneralNavNameIcon;
            },
            patcher: function patcher(element) {
                var actualContainer = element.childNodes.toArray()[1];
                if (actualContainer.className.indexOf('_CWGeneralNavNameIcon') == -1) actualContainer.className += ' _CWGeneralNavNameIcon';
            }
        }],

        /**
         * Elements selected by wildcard selectors.
         * @returns {Array.<HTMLElement>}
         */
        get WildcardElements() {
            return document.querySelectorAll(this.Selectors.RightWildcard).toArray().filter(function (e) {
                return !e.id.endsWith('myinfo');
            });
        },

        /**
         * Elements selected by direct selectors.
         * @returns {Array.<HTMLElement>}
         */
        get DirectElements() {
            return document.querySelectorAll(this.Selectors.DirectSelectors).toArray();
        },

        /**
         * All elements to be hidden.
         * @returns {Array.<HTMLElement>}
         */
        get AllElementsToBeHidden() {
            return this.WildcardElements.concat(this.DirectElements);
        }
    },

    Actions: {
        /**
         * Begin processing the page.
         */
        Process: function Process() {
            log('begin processing...');
            if (this.IsProcessing) return;
            this.IsProcessing = true;
            CleanerWeibo.Resources.AllElementsToBeHidden.forEach(function (element) {
                log('hiding element ' + element);
                element.hide();
            });
            this.IsProcessing = false;
        },

        IsProcessing: false,

        /**
         * Patch style.
         */
        PatchStyle: function PatchStyle() {
            CleanerWeibo.Resources.StylePatcher.forEach(function (patcher) {
                new CleanerWeibo.StylePatcher(patcher.selector, patcher.patcher).patch();
            });
        },

        /**
         * Feed observer.
         */
        FeedObserver: new MutationObserver(function (mutations) {
            CleanerWeibo.Actions.Process();
        }),

        /**
         * General observer.
         */
        GeneralObserver: new MutationObserver(function (mutations) {
            CleanerWeibo.Actions.Process();
            CleanerWeibo.Actions.PatchStyle();
        }),

        /**
         * The timer ID of the interval callback.
         */
        TimerID: 0,

        /**
         * Monitor home feed.
         */
        MonitorHomeFeed: function MonitorHomeFeed() {
            if (CleanerWeibo.Resources.Elements.HomeFeed !== undefined) {
                // home feed has been loaded
                if (CleanerWeibo.Resources.Elements.HomeFeed != undefined && CleanerWeibo.Resources.Elements.HomeFeed != null) CleanerWeibo.Actions.FeedObserver.observe(CleanerWeibo.Resources.Elements.HomeFeed, { childList: true });
                clearInterval(CleanerWeibo.Actions.TimerID);
            }
        }
    },

    StylePatcher: function () {
        /**
         * Create a style patcher.
         * @param selector {string} Selector.
         * @param patcher {Function} Patcher.
         */

        function StylePatcher(selector, patcher) {
            _classCallCheck(this, StylePatcher);

            this.selector = selector;
            this.patcher = patcher;
        }

        /**
         * Patch the style.
         */


        _createClass(StylePatcher, [{
            key: 'patch',
            value: function patch() {
                var that = this;
                document.querySelectorAll(that.selector).toArray().forEach(function (e) {
                    return that.patcher(e);
                });
            }
        }]);

        return StylePatcher;
    }()
};

// register stylesheet
document.body.appendChild(CleanerWeibo.Resources.Styles);

// register interval
CleanerWeibo.Actions.TimerID = setInterval(CleanerWeibo.Actions.MonitorHomeFeed, 1500);

// register general observer
CleanerWeibo.Actions.GeneralObserver.observe(document.body, { childList: true, attributes: true });

// debug entry point
window.cw = CleanerWeibo;