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