Cleaner Weibo

Make weibo cleaner.

Vous devrez installer une extension telle que Tampermonkey, Greasemonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Violentmonkey pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey ou Userscripts pour installer ce script.

Vous devrez installer une extension telle que Tampermonkey pour installer ce script.

Vous devrez installer une extension de gestionnaire de script utilisateur pour installer ce script.

(J'ai déjà un gestionnaire de scripts utilisateur, laissez-moi l'installer !)

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension telle que Stylus pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

Vous devrez installer une extension du gestionnaire de style pour utilisateur pour installer ce style.

(J'ai déjà un gestionnaire de style utilisateur, laissez-moi l'installer!)

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