Cleaner Weibo

Make weibo cleaner.

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

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

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

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

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

You will need to install a user script manager extension to install this script.

(У мене вже є менеджер скриптів, дайте мені встановити його!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

'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;