您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Allows finer control over what words you want to hide from the platform
// ==UserScript== // @name Enhanced Twitter post hider // @namespace victorique.moe // @version 1.5.5 // @description Allows finer control over what words you want to hide from the platform // @grant GM.xmlHttpRequest // @grant GM.getValue // @grant GM.listValues // @grant GM.setValue // @author Victoria // @match https://x.com/* // @match https://twitter.com/* // @run-at document-idle // @icon https://i.imgur.com/nx5ejHb.png // @license MIT // ==/UserScript== (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(); else if(typeof define === 'function' && define.amd) define([], factory); else if(typeof exports === 'object') exports["twitter-enhanced-muted-words"] = factory(); else root["twitter-enhanced-muted-words"] = factory(); })(this, () => { return /******/ (() => { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ 944: /***/ ((module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(601); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `.remove-button { color: red; } .hidden { display: none; } #currentBlockedWordsTable { border-collapse: collapse; width: 100%; } #currentBlockedWordsTable td, #currentBlockedWordsTable th { border: 1px solid #ddd; padding: 8px; } #currentBlockedWordsTable td:last-of-type { border: none; width: 20px; } #currentBlockedWordsTable tr:hover { background-color: #073d1e; } #currentBlockedWordsTable th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #04AA6D; color: white; } .overlay { position: fixed; display: block; width: 100%; height: 100%; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 1.0); z-index: 2; cursor: pointer; } .overlay .text { position: absolute; top: 50%; left: 50%; color: white; transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); font-family: TwitterChirp, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } #EH_settings { margin-top: 10px; } #yourUserId { margin-left: 10px; } #yourUserId:focus { outline: none; border-color: rgb(29, 155, 240); box-shadow: 0 0 10px rgb(29, 155, 240); } `, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 108: /***/ ((module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(601); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `.Modal { display: none; position: fixed; z-index: 9999; padding-top: 100px; left: 0; top: 0; width: 100%; height: 100%; overflow: auto; background-color: rgb(0, 0, 0); background-color: rgba(0, 0, 0, 0.4); font-family: TwitterChirp, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .FSmodalContent { position: relative; background-color: #141414; color: #ffffff !important; margin: auto; padding: 0; border: 1px solid #888; width: 900px; box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); -webkit-animation-name: animatetop; -webkit-animation-duration: 0.4s; animation-name: animatetop; animation-duration: 0.4s } .button { background-color: #4CAF50; /* Green */ border: none; color: white; padding: 7px 21px; text-align: center; text-decoration: none; display: inline-block; font-size: 16px; margin: 4px 2px; -webkit-transition-duration: 0.4s; /* Safari */ transition-duration: 0.4s; cursor: pointer; } .blackButton { background-color: #141414; color: white; border: 2px solid #555555; } .blackButton:hover { background-color: #555555; color: white; } /* Add Animation */ @-webkit-keyframes animatetop { from { top: -300px; opacity: 0 } to { top: 0; opacity: 1 } } @keyframes animatetop { from { top: -300px; opacity: 0 } to { top: 0; opacity: 1 } } /* The Close Button */ .FSclose { float: right; font-size: 28px; font-weight: bold; margin-bottom: 1rem; } .FSclose:hover, .FSclose:focus { color: #8f412c6e; text-decoration: none; cursor: pointer; } .FSmodalHeader { padding: 0.5rem; } .FSModalBody { padding: 1rem; } .FSModalFooter { color: white; display: flex; flex-wrap:wrap; justify-content: space-between; padding: 0.5rem; border-top: 1px solid #333232; } .FSmodalTitle { margin-left: 1rem; } .awesomplete > ul { color: #ff0000; } `, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 107: /***/ ((module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__) /* harmony export */ }); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(601); /* harmony import */ var _node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(314); /* harmony import */ var _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1__); // Imports var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default())); // Module ___CSS_LOADER_EXPORT___.push([module.id, `* { --switch-height: 18px; --switch-padding: 8px; --switch-width: calc((var(--switch-height) * 2) - var(--switch-padding)); --slider-height: calc(var(--switch-height) - var(--switch-padding)); --slider-on: calc(var(--switch-height) - var(--switch-padding)); } .switch { position: relative; display: inline-block; width: var(--switch-width); height: var(--switch-height); } .switch input { opacity: 0; width: 0; height: 0; } .slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #ccc; -webkit-transition: .4s; transition: .4s; } .slider:before { content: ""; position: absolute; height: var(--slider-height); width: var(--slider-height); left: calc(var(--switch-padding) / 2); bottom: calc(var(--switch-padding) / 2); background-color: white; -webkit-transition: .4s; transition: .4s; } input:checked+.slider { background-color: #2196F3; } input:focus+.slider { box-shadow: 0 0 1px #2196F3; } input:checked+.slider:before { transform: translateX(var(--slider-on)); } .slider.round { border-radius: var(--slider-height); } .slider.round:before { border-radius: 50%; } `, ""]); // Exports /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (___CSS_LOADER_EXPORT___); /***/ }), /***/ 314: /***/ ((module) => { /* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ module.exports = function (cssWithMappingToString) { var list = []; // return the list of modules as css string list.toString = function toString() { return this.map(function (item) { var content = ""; var needLayer = typeof item[5] !== "undefined"; if (item[4]) { content += "@supports (".concat(item[4], ") {"); } if (item[2]) { content += "@media ".concat(item[2], " {"); } if (needLayer) { content += "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {"); } content += cssWithMappingToString(item); if (needLayer) { content += "}"; } if (item[2]) { content += "}"; } if (item[4]) { content += "}"; } return content; }).join(""); }; // import a list of modules into the list list.i = function i(modules, media, dedupe, supports, layer) { if (typeof modules === "string") { modules = [[null, modules, undefined]]; } var alreadyImportedModules = {}; if (dedupe) { for (var k = 0; k < this.length; k++) { var id = this[k][0]; if (id != null) { alreadyImportedModules[id] = true; } } } for (var _k = 0; _k < modules.length; _k++) { var item = [].concat(modules[_k]); if (dedupe && alreadyImportedModules[item[0]]) { continue; } if (typeof layer !== "undefined") { if (typeof item[5] === "undefined") { item[5] = layer; } else { item[1] = "@layer".concat(item[5].length > 0 ? " ".concat(item[5]) : "", " {").concat(item[1], "}"); item[5] = layer; } } if (media) { if (!item[2]) { item[2] = media; } else { item[1] = "@media ".concat(item[2], " {").concat(item[1], "}"); item[2] = media; } } if (supports) { if (!item[4]) { item[4] = "".concat(supports); } else { item[1] = "@supports (".concat(item[4], ") {").concat(item[1], "}"); item[4] = supports; } } list.push(item); } }; return list; }; /***/ }), /***/ 601: /***/ ((module) => { module.exports = function (i) { return i[1]; }; /***/ }), /***/ 977: /***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(72); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(825); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(659); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(56); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(540); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(113); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_main_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(944); var options = {}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_main_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_main_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_main_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_main_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 839: /***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(72); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(825); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(659); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(56); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(540); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(113); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_modal_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(108); var options = {}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_modal_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_modal_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_modal_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_modal_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 206: /***/ ((__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) => { /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(72); /* harmony import */ var _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(825); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(659); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(56); /* harmony import */ var _node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(540); /* harmony import */ var _node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(113); /* harmony import */ var _node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _node_modules_css_loader_dist_cjs_js_switch_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(107); var options = {}; options.styleTagTransform = (_node_modules_style_loader_dist_runtime_styleTagTransform_js__WEBPACK_IMPORTED_MODULE_5___default()); options.setAttributes = (_node_modules_style_loader_dist_runtime_setAttributesWithoutAttributes_js__WEBPACK_IMPORTED_MODULE_3___default()); options.insert = _node_modules_style_loader_dist_runtime_insertBySelector_js__WEBPACK_IMPORTED_MODULE_2___default().bind(null, "head"); options.domAPI = (_node_modules_style_loader_dist_runtime_styleDomAPI_js__WEBPACK_IMPORTED_MODULE_1___default()); options.insertStyleElement = (_node_modules_style_loader_dist_runtime_insertStyleElement_js__WEBPACK_IMPORTED_MODULE_4___default()); var update = _node_modules_style_loader_dist_runtime_injectStylesIntoStyleTag_js__WEBPACK_IMPORTED_MODULE_0___default()(_node_modules_css_loader_dist_cjs_js_switch_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A, options); /* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_css_loader_dist_cjs_js_switch_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A && _node_modules_css_loader_dist_cjs_js_switch_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals ? _node_modules_css_loader_dist_cjs_js_switch_css__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .A.locals : undefined); /***/ }), /***/ 72: /***/ ((module) => { var stylesInDOM = []; function getIndexByIdentifier(identifier) { var result = -1; for (var i = 0; i < stylesInDOM.length; i++) { if (stylesInDOM[i].identifier === identifier) { result = i; break; } } return result; } function modulesToDom(list, options) { var idCountMap = {}; var identifiers = []; for (var i = 0; i < list.length; i++) { var item = list[i]; var id = options.base ? item[0] + options.base : item[0]; var count = idCountMap[id] || 0; var identifier = "".concat(id, " ").concat(count); idCountMap[id] = count + 1; var indexByIdentifier = getIndexByIdentifier(identifier); var obj = { css: item[1], media: item[2], sourceMap: item[3], supports: item[4], layer: item[5] }; if (indexByIdentifier !== -1) { stylesInDOM[indexByIdentifier].references++; stylesInDOM[indexByIdentifier].updater(obj); } else { var updater = addElementStyle(obj, options); options.byIndex = i; stylesInDOM.splice(i, 0, { identifier: identifier, updater: updater, references: 1 }); } identifiers.push(identifier); } return identifiers; } function addElementStyle(obj, options) { var api = options.domAPI(options); api.update(obj); var updater = function updater(newObj) { if (newObj) { if (newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap && newObj.supports === obj.supports && newObj.layer === obj.layer) { return; } api.update(obj = newObj); } else { api.remove(); } }; return updater; } module.exports = function (list, options) { options = options || {}; list = list || []; var lastIdentifiers = modulesToDom(list, options); return function update(newList) { newList = newList || []; for (var i = 0; i < lastIdentifiers.length; i++) { var identifier = lastIdentifiers[i]; var index = getIndexByIdentifier(identifier); stylesInDOM[index].references--; } var newLastIdentifiers = modulesToDom(newList, options); for (var _i = 0; _i < lastIdentifiers.length; _i++) { var _identifier = lastIdentifiers[_i]; var _index = getIndexByIdentifier(_identifier); if (stylesInDOM[_index].references === 0) { stylesInDOM[_index].updater(); stylesInDOM.splice(_index, 1); } } lastIdentifiers = newLastIdentifiers; }; }; /***/ }), /***/ 659: /***/ ((module) => { var memo = {}; /* istanbul ignore next */ function getTarget(target) { if (typeof memo[target] === "undefined") { var styleTarget = document.querySelector(target); // Special case to return head of iframe instead of iframe itself if (window.HTMLIFrameElement && styleTarget instanceof window.HTMLIFrameElement) { try { // This will throw an exception if access to iframe is blocked // due to cross-origin restrictions styleTarget = styleTarget.contentDocument.head; } catch (e) { // istanbul ignore next styleTarget = null; } } memo[target] = styleTarget; } return memo[target]; } /* istanbul ignore next */ function insertBySelector(insert, style) { var target = getTarget(insert); if (!target) { throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid."); } target.appendChild(style); } module.exports = insertBySelector; /***/ }), /***/ 540: /***/ ((module) => { /* istanbul ignore next */ function insertStyleElement(options) { var element = document.createElement("style"); options.setAttributes(element, options.attributes); options.insert(element, options.options); return element; } module.exports = insertStyleElement; /***/ }), /***/ 56: /***/ ((module, __unused_webpack_exports, __webpack_require__) => { /* istanbul ignore next */ function setAttributesWithoutAttributes(styleElement) { var nonce = true ? __webpack_require__.nc : 0; if (nonce) { styleElement.setAttribute("nonce", nonce); } } module.exports = setAttributesWithoutAttributes; /***/ }), /***/ 825: /***/ ((module) => { /* istanbul ignore next */ function apply(styleElement, options, obj) { var css = ""; if (obj.supports) { css += "@supports (".concat(obj.supports, ") {"); } if (obj.media) { css += "@media ".concat(obj.media, " {"); } var needLayer = typeof obj.layer !== "undefined"; if (needLayer) { css += "@layer".concat(obj.layer.length > 0 ? " ".concat(obj.layer) : "", " {"); } css += obj.css; if (needLayer) { css += "}"; } if (obj.media) { css += "}"; } if (obj.supports) { css += "}"; } var sourceMap = obj.sourceMap; if (sourceMap && typeof btoa !== "undefined") { css += "\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))), " */"); } // For old IE /* istanbul ignore if */ options.styleTagTransform(css, styleElement, options.options); } function removeStyleElement(styleElement) { // istanbul ignore if if (styleElement.parentNode === null) { return false; } styleElement.parentNode.removeChild(styleElement); } /* istanbul ignore next */ function domAPI(options) { if (typeof document === "undefined") { return { update: function update() {}, remove: function remove() {} }; } var styleElement = options.insertStyleElement(options); return { update: function update(obj) { apply(styleElement, options, obj); }, remove: function remove() { removeStyleElement(styleElement); } }; } module.exports = domAPI; /***/ }), /***/ 113: /***/ ((module) => { /* istanbul ignore next */ function styleTagTransform(css, styleElement) { if (styleElement.styleSheet) { styleElement.styleSheet.cssText = css; } else { while (styleElement.firstChild) { styleElement.removeChild(styleElement.firstChild); } styleElement.appendChild(document.createTextNode(css)); } } module.exports = styleTagTransform; /***/ }), /***/ 279: /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ TwitterPostObserver: () => (/* binding */ TwitterPostObserver) /* harmony export */ }); /* harmony import */ var _UiBuilder_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(361); /* harmony import */ var _managers_LocalStoreManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(146); /* harmony import */ var _decorators_PostObserver_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(967); /* harmony import */ var _PageInterceptor_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(678); /* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(41); /* harmony import */ var _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(57); /* harmony import */ var _css_modal_css__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(839); /* harmony import */ var _css_switch_css__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(206); /* harmony import */ var _css_main_css__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(977); var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_decorators_PostObserver_js__WEBPACK_IMPORTED_MODULE_2__, _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_3__]); ([_decorators_PostObserver_js__WEBPACK_IMPORTED_MODULE_2__, _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_3__] = __webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__); var __decorate = (undefined && undefined.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (undefined && undefined.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var TwitterPostObserver_1; let TwitterPostObserver = class TwitterPostObserver { static { TwitterPostObserver_1 = this; } constructor() { this.uiBuilder = _UiBuilder_js__WEBPACK_IMPORTED_MODULE_0__/* .UiBuilder */ .i.getInstance(); this.localStoreManager = _managers_LocalStoreManager_js__WEBPACK_IMPORTED_MODULE_1__/* .LocalStoreManager */ .g.getInstance(); this.regexPhraseCache = new Map(); } static async getInstance() { if (!TwitterPostObserver_1.instance) { TwitterPostObserver_1.instance = new TwitterPostObserver_1(); await TwitterPostObserver_1.instance.init(); TwitterPostObserver_1.instance.twitterMutator = await _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_3__/* .TwitterMutator */ .q.getInstance(); } return TwitterPostObserver_1.instance; } removeElm(blockedWordEntry, elms) { for (const elm of elms) { const e = elm; if (blockedWordEntry.options.useOverlay) { this.uiBuilder.injectOverlay(e, blockedWordEntry.phrase); } else { e.style.display = "none"; } e.dataset.thidden = "true"; } } async processMuteMap(muteMap) { const pArr = []; for (const [entry, elements] of muteMap) { this.removeElm(entry, elements); pArr.push(this.localStoreManager.incrementBlockedWordAudit(entry.phrase)); } await Promise.all(pArr); } findMatchingBlockPhrase(tweetText, allBlockedWords, testId) { for (const blockedWord of allBlockedWords) { const { phrase, options } = blockedWord; const { useRegex, filterUsername } = options; if (testId === "User-Name" && !filterUsername) { return null; } if (useRegex) { let regExp = this.regexPhraseCache.get(phrase); if (!regExp) { regExp = new RegExp(phrase, "mi"); this.regexPhraseCache.set(phrase, regExp); } if (regExp.test(tweetText)) { return blockedWord; } } else if (tweetText.includes(phrase)) { return blockedWord; } } return null; } shouldRemove(el, allBlockedWords, globalOpts) { if (!allBlockedWords || allBlockedWords.length === 0) { return [false, null]; } const tweetTexts = el.querySelectorAll("[data-testid='tweetText']"); const username = el.querySelectorAll("[data-testid='User-Name']"); if (el.dataset.thidden) { return [false, null]; // already hidden } // we want to check the username first, so it needs to be this order const elements = Array.from(username).concat(Array.from(tweetTexts)); for (const tweet of elements) { let content; if (tweet.dataset.testid === "User-Name") { content = tweet.querySelector("a")?.href?.split("/")?.pop() ?? null; if (globalOpts.username) { // content at this point is the user handle if (content === globalOpts.username) { return [false, null]; } } } else { content = tweet.textContent; } if (content) { const dataset = tweet.dataset; const matchedPhrase = this.findMatchingBlockPhrase(content, allBlockedWords, dataset.testid); if (matchedPhrase) { return [true, matchedPhrase]; } } } return [false, null]; } async observe(mutationList, observer) { const allBlockedWords = await this.localStoreManager.getAllStoredWords(); const globalOptions = await this.localStoreManager.getAllGlobalOpts(); // collection of how many elements a phrase muted const muteMap = new Map(); for (const mutationRecord of mutationList) { for (let i = 0; i < mutationRecord.addedNodes.length; i++) { const removedNode = mutationRecord.addedNodes[i]; this.populateMuteMap(removedNode, allBlockedWords, muteMap, globalOptions); } } await this.processMuteMap(muteMap); } populateMuteMap(removedNode, allBlockedWords, muteMap, globalOpts) { const [shouldRemove, entry] = this.shouldRemove(removedNode, allBlockedWords, globalOpts); if (shouldRemove) { if (muteMap.has(entry)) { muteMap.get(entry)?.push(removedNode); } else { muteMap.set(entry, [removedNode]); } } } async init() { const pageInterceptor = _PageInterceptor_js__WEBPACK_IMPORTED_MODULE_7__/* .PageInterceptor */ .L.getInstance(); pageInterceptor.addAction(async () => { const allBlockedWords = await this.localStoreManager.getAllStoredWords(); if (allBlockedWords.length === 0) { this.twitterMutator.closeMutators(); return; } await this.twitterMutator.init(); await this.loadPage(); }); await this.loadPage(); pageInterceptor.addAction(async () => { const page = window.location.pathname.split("/").pop(); if (page !== "mute_and_block") { return; } const anchor = this.uiBuilder.buildOption(); if (!anchor) { return; } const insertAfter = await (0,_Utils_js__WEBPACK_IMPORTED_MODULE_8__/* .waitForElm */ .ZO)("a[href='/settings/muted_keywords']"); if (!insertAfter) { return; } insertAfter.after(anchor); const modal = await this.buildModal(); anchor.addEventListener("click", () => { _Utils_js__WEBPACK_IMPORTED_MODULE_8__/* .DomUtil */ .bQ.openModal(modal); }); }); } async buildModal() { const [modal, exists] = await this.uiBuilder.getEditor(blockedWords => { // no point listening for mutation events if there are no words to block if (blockedWords.length === 0) { this.twitterMutator.closeMutators(); } }); if (!exists) { const el = document.body; el.insertAdjacentElement("beforeend", modal); } return modal; } async loadPage() { const allBlockedWords = await this.localStoreManager.getAllStoredWords(); if (allBlockedWords.length === 0) { return; } const allGlobalOpts = await this.localStoreManager.getAllGlobalOpts(); const selectorToLoad = (0,_Utils_js__WEBPACK_IMPORTED_MODULE_8__/* .getSelectorForPage */ .c4)(); const timelineContainer = await (0,_Utils_js__WEBPACK_IMPORTED_MODULE_8__/* .waitForElm */ .ZO)(selectorToLoad); if (!timelineContainer) { return; } if (!timelineContainer.children) { return; } const muteMap = new Map(); for (let i = 0; i < timelineContainer.children.length; i++) { const chatItem = timelineContainer.children[i]; this.populateMuteMap(chatItem, allBlockedWords, muteMap, allGlobalOpts); } await this.processMuteMap(muteMap); } }; TwitterPostObserver = TwitterPostObserver_1 = __decorate([ _decorators_PostObserver_js__WEBPACK_IMPORTED_MODULE_2__/* .PostObserver */ .z, __metadata("design:paramtypes", []) ], TwitterPostObserver); await TwitterPostObserver.getInstance(); __webpack_async_result__(); } catch(e) { __webpack_async_result__(e); } }, 1); /***/ }), /***/ 678: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ L: () => (/* binding */ PageInterceptor) /* harmony export */ }); class PageInterceptor { constructor() { this.actions = []; } static getInstance() { if (!PageInterceptor.instance) { PageInterceptor.instance = new PageInterceptor(); PageInterceptor.instance.init(); } return PageInterceptor.instance; } init() { window.addEventListener("load", () => { let oldHref = document.location.href; const body = document.querySelector("body"); if (!body) { return; } const observer = new MutationObserver(() => { if (oldHref !== document.location.href) { oldHref = document.location.href; for (const action of this.actions) { action(); } } }); observer.observe(body, { childList: true, subtree: true }); }, true); } addAction(action) { this.actions.push(action); } } /***/ }), /***/ 57: /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ q: () => (/* binding */ TwitterMutator) /* harmony export */ }); /* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(41); /* harmony import */ var _Main_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(279); var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_Main_js__WEBPACK_IMPORTED_MODULE_0__]); _Main_js__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; class TwitterMutator { constructor() { this.timelineObserverProxy = null; this.observerList = []; this.instanceMap = new Map(); } static async getInstance() { if (!TwitterMutator.instance) { TwitterMutator.instance = new TwitterMutator(); await TwitterMutator.instance.init(); } return TwitterMutator.instance; } async init() { await this.onTweet(); } addObserver(context) { this.observerList.push(context); } async getObserver(context) { let instance = this.instanceMap.get(context) ?? null; if (instance) { return instance; } if (context === _Main_js__WEBPACK_IMPORTED_MODULE_0__.TwitterPostObserver) { instance = await _Main_js__WEBPACK_IMPORTED_MODULE_0__.TwitterPostObserver.getInstance(); this.instanceMap.set(context, instance); return instance; } return null; } async onTweet() { const homePageSelector = (0,_Utils_js__WEBPACK_IMPORTED_MODULE_1__/* .getSelectorForPage */ .c4)(); const elm = await (0,_Utils_js__WEBPACK_IMPORTED_MODULE_1__/* .waitForElm */ .ZO)(homePageSelector); if (!elm) { return; } const parentSection = elm.closest("section"); if (!parentSection) { return; } const sectionWrapper = parentSection.parentElement; if (!sectionWrapper) { return; } if (this.timelineObserverProxy) { this.timelineObserverProxy.disconnect(); } this.timelineObserverProxy = new MutationObserver(async (mutations, observer) => { const observers = (await Promise.all(this.observerList.map(observer => this.getObserver(observer)))).filter(observer => !!observer); observers.map(instanceObserver => { instanceObserver.observe(mutations, observer); }); }); this.timelineObserverProxy.observe(sectionWrapper, { childList: true, subtree: true, }); } closeMutators() { this.timelineObserverProxy?.disconnect(); } async openMutators() { await this.init(); } } __webpack_async_result__(); } catch(e) { __webpack_async_result__(e); } }); /***/ }), /***/ 361: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ i: () => (/* binding */ UiBuilder) /* harmony export */ }); /* harmony import */ var _Utils_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(41); /* harmony import */ var _typings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(872); /* harmony import */ var _managers_LocalStoreManager_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(146); class UiBuilder { constructor() { this.localStoreManager = _managers_LocalStoreManager_js__WEBPACK_IMPORTED_MODULE_1__/* .LocalStoreManager */ .g.getInstance(); } static getInstance() { if (!UiBuilder.instance) { UiBuilder.instance = new UiBuilder(); } return UiBuilder.instance; } buildOption() { const hasEl = document.querySelector("#enhanced_muted_words") !== null; if (hasEl) { return null; } const a = document.createElement("a"); a.className = "css-175oi2r r-1wtj0ep r-16x9es5 r-1f1sjgu r-o7ynqc r-6416eg r-1ny4l3l r-1loqt21"; a.id = "enhanced_muted_words"; a.setAttribute("style", "padding-right: 16px; padding-left: 16px;"); a.innerHTML = `<div class="css-175oi2r r-1awozwy r-18u37iz r-16y2uox"><div class="css-175oi2r r-16y2uox r-1wbh5a2"><div dir="ltr" class="css-1rynq56 r-bcqeeo r-qvutc0 r-37j5jr r-a023e6 r-rjixqe r-16dba41" style="text-overflow: unset; color: rgb(231, 233, 234);"><span class="css-1qaijid r-bcqeeo r-qvutc0 r-poiln3" style="text-overflow: unset;">Enhanced muted words</span></div></div><svg viewBox="0 0 24 24" aria-hidden="true" class="r-4qtqp9 r-yyyyoo r-1xvli5t r-dnmrzs r-bnwqim r-1plcrui r-lrvibr r-1bwzh9t r-1q142lx r-f727ji"><g><path d="M14.586 12L7.543 4.96l1.414-1.42L17.414 12l-8.457 8.46-1.414-1.42L14.586 12z"></path></g></svg></div>`; a.addEventListener("mouseenter", evt => { evt.target.classList.add("r-g2wdr4"); }); a.addEventListener("mouseleave", evt => { evt.target.classList.remove("r-g2wdr4"); }); return a; } injectOverlay(e, phrase) { const overlay = document.createElement("div"); const text = document.createElement("span"); const innerContent = e.firstChild; innerContent.style.display = "none"; e.style.height = "121px"; text.className = "text"; text.textContent = `Content hidden due to rule ${phrase} - click to show`; overlay.append(text); overlay.className = "overlay"; overlay.onclick = () => { overlay.style.display = "none"; innerContent.style.removeProperty("display"); e.style.removeProperty("height"); delete e.dataset.thidden; }; e.append(overlay); } async getEditor(onSave) { function createTableBodyRows(allBlockedWords) { let tableBodyRows = ""; for (const blockedWord of allBlockedWords) { const useOverlay = blockedWord.options.useOverlay ?? false; const filterUsername = blockedWord.options.useOverlay ?? false; tableBodyRows += ` <tr> <td contenteditable="true">${blockedWord.phrase}</td> <td> <select> <option value="true" ${blockedWord.options.useRegex ? "selected" : ""}>true</option> <option value="false" ${blockedWord.options.useRegex ? "" : "selected"}>false</option> </select> </td> <td> <label class="switch"> <input type="checkbox" class="useOverlayCheck" ${useOverlay ? "" : "checked"}> <span class="slider round"></span> </label> </td> <td> <label class="switch"> <input type="checkbox" class="includeUsernameCheck" ${filterUsername ? "checked" : ""}> <span class="slider round"></span> </label> </td> <td>${blockedWord.count}</td> <td> <button data-id="removeRow">Remove</button> </td> </tr> `; } return tableBodyRows; } function createHtml(allBlockedWords, settings) { return ` <div id='currentBlockedWordsTableWrapper'> <table id='currentBlockedWordsTable'> <thead> <tr> <th scope="col">Phrase</th> <th scope="col">Regex</th> <th scope="col"><span title="If toggled on, this will remove the post completely instead of using an overlay">Remove posts</span></th> <th scope="col"><span title="If on, it will also include user handles (@) in the filter">Include username</span></th> <th scope="col">Mute count</th> </tr> </thead> <tbody id="currentBlockedWordsTableBody"> ${createTableBodyRows(allBlockedWords)} </tbody> </table> <div id='EH_settings'> <label for="yourUserId">Your Username:</label> <input id="yourUserId" placeholder="Example: @VictoriqueM" value="${settings.username ?? ""}" data-type="${_typings_js__WEBPACK_IMPORTED_MODULE_0__/* .SETTING */ .H.USERNAME}" style="margin-left: 10px;"/> </div> </div> `; } function bindRemoveButtons() { modal.querySelectorAll("button[data-id='removeRow']").forEach(e => { _Utils_js__WEBPACK_IMPORTED_MODULE_2__/* .DomUtil */ .bQ.offOn(e, "click", e => { const target = e.target; target.closest("tr")?.remove(); }); }); } const existingModel = document.getElementById("#enhancedMutedWordsDialog"); if (existingModel) { return [existingModel, true]; } const allBlockedWords = await this.localStoreManager.getAllStoredWords(); const muteCount = await this.localStoreManager.getAuditEntries(); const merged = allBlockedWords.map(value => { const auditEntry = muteCount[value.phrase] ?? 0; return { ...value, count: auditEntry }; }); const globalOpts = await this.localStoreManager.getAllGlobalOpts(); const modal = await _Utils_js__WEBPACK_IMPORTED_MODULE_2__/* .DomUtil */ .bQ.createModal({ id: "enhancedMutedWordsDialog", body: () => createHtml(merged, globalOpts), title: "Enhanced Muted words", modalBodyStyle: { height: "auto", overflow: "auto", }, footer: ` <button id="AddRowButton" class="button blackButton">Add row</button> <button id="applyEnhancedMutedWords" class="button blackButton apply">Save</button> `, }); modal.querySelector("#applyEnhancedMutedWords")?.addEventListener("click", async () => { const table = modal.querySelector("#currentBlockedWordsTable"); const tableRows = Array.from(table.querySelectorAll("#currentBlockedWordsTableBody tr")); const muteCount = await this.localStoreManager.getAuditEntries(); const blockedWords = []; for (const row of tableRows) { const tableTextContent = row.querySelector("td:first-child")?.textContent; if (!tableTextContent) { alert("Unable to set blank phrase"); return; } const phrase = tableTextContent; const useRegex = row.querySelector("select").value === "true"; if (useRegex) { try { new RegExp(phrase); } catch (e) { alert(`Regex ${phrase} is not valid: ${e.message}`); return; } } const hidePost = row.querySelector("input.useOverlayCheck").checked; const filterUsername = row.querySelector("input.includeUsernameCheck").checked; const auditEntry = muteCount[phrase] ?? 0; blockedWords.push({ phrase, options: { useRegex, useOverlay: !hidePost, filterUsername, }, count: auditEntry, }); } await this.localStoreManager.setBlockedWords(blockedWords); const globalOptsToSet = {}; const globalOpts = modal.querySelector("#EH_settings"); globalOpts?.querySelectorAll("input").forEach(e => { const type = e.dataset.type; let value = e.value; if (type === _typings_js__WEBPACK_IMPORTED_MODULE_0__/* .SETTING */ .H.USERNAME) { if (value.startsWith("@")) { // we don't want @ in the input value = value.slice(1); } } globalOptsToSet[type] = value; }); await this.localStoreManager.setAllGlobalOpts(globalOptsToSet); if (onSave) { await onSave(blockedWords); } alert("Saved successfully."); }); bindRemoveButtons(); modal.querySelector("#AddRowButton")?.addEventListener("click", () => { const table = modal.querySelector("#currentBlockedWordsTable"); const newRow = document.createElement("tr"); newRow.innerHTML = ` <td contenteditable="true"></td> <td> <select> <option value="true">true</option> <option value="false">false</option> </select> </td> <td> <label class=" switch"> <input type="checkbox" class="useOverlayCheck"> <span class="slider round"></span> </label> </td> <td> <label class=" switch"> <input type="checkbox" class="includeUsernameCheck"> <span class="slider round"></span> </label> </td> <td>0</td> <td> <button data-id="removeRow">Remove</button> </td> `; table.querySelector("#currentBlockedWordsTableBody")?.appendChild(newRow); bindRemoveButtons(); }); return [modal, false]; } } /***/ }), /***/ 41: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ZO: () => (/* binding */ waitForElm), /* harmony export */ bQ: () => (/* binding */ DomUtil), /* harmony export */ c4: () => (/* binding */ getSelectorForPage) /* harmony export */ }); /* unused harmony export toggleHide */ function waitForElm(selector, node) { return new Promise((resolve, reject) => { const e = node ?? document; if (e.querySelector(selector)) { return resolve(e.querySelector(selector)); } const timeout = setTimeout(() => { resolve(null); observer.disconnect(); }, 10000); const observer = new MutationObserver(() => { if (e.querySelector(selector)) { resolve(e.querySelector(selector)); observer.disconnect(); clearTimeout(timeout); } }); observer.observe(e, { childList: true, subtree: true, }); }); } class DomUtil { static guid() { function s4() { return Math.floor((1 + Math.random()) * 0x10000) .toString(16) .substring(1); } return `${s4()}${s4()}-${s4()}-${s4()}-${s4()}-${s4()}${s4()}${s4()}`; } /** * Create a modal with the given options * @param options */ static async createModal(options) { function getStyle(styleObj) { let styleStr = ""; if (styleObj) { for (const key in styleObj) { styleStr += `${key}: ${styleObj[key]}; `; } } return styleStr; } let id; if (options.id) { id = options.id; } else { id = this.guid(); } const bodyStyle = getStyle(options.modalContentStyle); const styleStr = getStyle(options.modalBodyStyle); const body = await options.body(); let html = `<div class="Modal" id="${id}"> <div class="FSmodalContent" style="${bodyStyle}"> <div class="FSmodalHeader"> <span class="FSclose">×</span> <h5 class="FSmodalTitle">${options.title}</h5> </div> <div class="FSModalBody" style="${styleStr}">${body}</div>`; if (options.footer) { html += ` <div class="FSModalFooter"> ${options.footer} </div>`; } html += `</div></div>`; const modal = DomUtil.createElementFromHTML(html); window.onclick = (event) => { if (event.target == modal) { DomUtil.closeModal(modal); } }; DomUtil.offOn(DomUtil.bySelector(".FSclose", modal), "click", e => { DomUtil.closeModal(modal); }); return modal; } static bySelector(selector, el) { if (el) { return el.querySelector(selector); } return document.querySelector(selector); } static offOn(el, event, callBack, fireImmediately = false) { if (!el) { return; } let toTrigger; if (el instanceof Element) { toTrigger = el; } else { toTrigger = document.querySelector(el); } if (!toTrigger) { return; } toTrigger = DomUtil.off(toTrigger); DomUtil.on(toTrigger, event, callBack, fireImmediately); } static off(el) { if (!el) { return; } const newEl = el.cloneNode(false); while (el.hasChildNodes()) { if (el.firstChild) { newEl.appendChild(el.firstChild); } } el?.parentNode?.replaceChild(newEl, el); return newEl; } static on(el, event, callBack, fireImmediately = false) { if (!el) { return; } let toTrigger; if (el instanceof Element) { toTrigger = el; } else { toTrigger = document.querySelector(el); } if (!toTrigger) { return; } toTrigger.addEventListener(event, callBack); if (fireImmediately) { toTrigger.dispatchEvent(new Event(event)); } } static openModal(modal) { modal.style.display = "block"; } static createElementFromHTML(htmlString) { const div = document.createElement("div"); div.innerHTML = htmlString.trim(); return div.firstChild; } static closeModal(modal) { modal.style.display = "none"; } } function getSelectorForPage() { const path = window.location.pathname; const page = path.split("/").pop(); if (page === "mute_and_block") { return "a[href='/settings/muted_keywords']"; } return "[aria-label*='Timeline'] > div[style^='position: relative']"; } function toggleHide(hide, element) { hide ? element.classList.add("hidden") : element.classList.remove("hidden"); } /***/ }), /***/ 967: /***/ ((module, __webpack_exports__, __webpack_require__) => { __webpack_require__.a(module, async (__webpack_handle_async_dependencies__, __webpack_async_result__) => { try { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ z: () => (/* binding */ PostObserver) /* harmony export */ }); /* harmony import */ var _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(57); var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([_TwitterMutator_js__WEBPACK_IMPORTED_MODULE_0__]); _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_0__ = (__webpack_async_dependencies__.then ? (await __webpack_async_dependencies__)() : __webpack_async_dependencies__)[0]; function PostObserver(target) { _TwitterMutator_js__WEBPACK_IMPORTED_MODULE_0__/* .TwitterMutator */ .q.getInstance().then(mutatorProxy => { mutatorProxy.addObserver(target); }); } __webpack_async_result__(); } catch(e) { __webpack_async_result__(e); } }); /***/ }), /***/ 146: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ g: () => (/* binding */ LocalStoreManager) /* harmony export */ }); /* harmony import */ var _typings_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(872); class LocalStoreManager { constructor() { this.KEY = "TWITTER_POST_HIDER_MANAGER"; } static getInstance() { if (!LocalStoreManager.instance) { LocalStoreManager.instance = new LocalStoreManager(); } return LocalStoreManager.instance; } async addBlockedWord(entry) { const storedWords = await this.getAllStoredWords(); const idx = storedWords.findIndex(value => value.phrase === entry.phrase); if (idx > -1) { storedWords[idx] = entry; } else { storedWords.push(entry); } await this.setBlockedWords(storedWords); } async getBlockedWord(phrase) { const allWords = await this.getAllStoredWords(); if (allWords) { return allWords.find(value => value.phrase === phrase) ?? null; } return null; } async hasBlockedWord(word) { const allWords = await this.getAllStoredWords(); if (allWords) { return !!allWords.find(value => value.phrase === word); } return false; } async getAllStoredWords() { const itmJson = await GM.getValue(this.KEY, `{"blockedWords": []}`); const json = JSON.parse(itmJson); return json.blockedWords; } async getAllGlobalOpts() { const itmJson = (await GM.getValue(this.KEY, `{}`)); const gmJson = JSON.parse(itmJson); return gmJson.globalSettings ?? {}; } async setAllGlobalOpts(options) { const itmJson = (await GM.getValue(this.KEY, `{}`)); const gmJson = JSON.parse(itmJson); gmJson.globalSettings = options; await GM.setValue(this.KEY, JSON.stringify(gmJson)); } async setGlobalOpts(opt) { const itmJson = (await GM.getValue(this.KEY, `{}`)); const gmJson = JSON.parse(itmJson); const globalOpts = gmJson.globalSettings ?? {}; switch (opt) { case _typings_js__WEBPACK_IMPORTED_MODULE_0__/* .SETTING */ .H.USERNAME: globalOpts.username = opt; break; } gmJson.globalSettings = globalOpts; await GM.setValue(this.KEY, JSON.stringify(gmJson)); } async getGlobalOption(opt) { const itmJson = (await GM.getValue(this.KEY, `{}`)); const gmJson = JSON.parse(itmJson); const globalOpts = gmJson.globalSettings ?? {}; switch (opt) { case _typings_js__WEBPACK_IMPORTED_MODULE_0__/* .SETTING */ .H.USERNAME: return globalOpts?.username ?? null; } } async setBlockedWords(blockedWordEntries) { const itmJson = (await GM.getValue(this.KEY, `{"blockedWords": []}`)); const gmJson = JSON.parse(itmJson); gmJson.blockedWords = blockedWordEntries; await GM.setValue(this.KEY, JSON.stringify(gmJson)); } async incrementBlockedWordAudit(key) { const itmJson = (await GM.getValue(this.KEY, `{"audit": {}}`)); const gmJson = JSON.parse(itmJson); const auditEntries = gmJson.audit ?? {}; auditEntries[key] = auditEntries[key] ? auditEntries[key] + 1 : 1; gmJson.audit = auditEntries; await GM.setValue(this.KEY, JSON.stringify(gmJson)); } async getAuditEntries() { const itmJson = (await GM.getValue(this.KEY, `{"audit": []}`)); const json = JSON.parse(itmJson); return json.audit; } } /***/ }), /***/ 872: /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ H: () => (/* binding */ SETTING) /* harmony export */ }); var SETTING; (function (SETTING) { SETTING["USERNAME"] = "username"; })(SETTING || (SETTING = {})); /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ id: moduleId, /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/async module */ /******/ (() => { /******/ var webpackQueues = typeof Symbol === "function" ? Symbol("webpack queues") : "__webpack_queues__"; /******/ var webpackExports = typeof Symbol === "function" ? Symbol("webpack exports") : "__webpack_exports__"; /******/ var webpackError = typeof Symbol === "function" ? Symbol("webpack error") : "__webpack_error__"; /******/ var resolveQueue = (queue) => { /******/ if(queue && queue.d < 1) { /******/ queue.d = 1; /******/ queue.forEach((fn) => (fn.r--)); /******/ queue.forEach((fn) => (fn.r-- ? fn.r++ : fn())); /******/ } /******/ } /******/ var wrapDeps = (deps) => (deps.map((dep) => { /******/ if(dep !== null && typeof dep === "object") { /******/ if(dep[webpackQueues]) return dep; /******/ if(dep.then) { /******/ var queue = []; /******/ queue.d = 0; /******/ dep.then((r) => { /******/ obj[webpackExports] = r; /******/ resolveQueue(queue); /******/ }, (e) => { /******/ obj[webpackError] = e; /******/ resolveQueue(queue); /******/ }); /******/ var obj = {}; /******/ obj[webpackQueues] = (fn) => (fn(queue)); /******/ return obj; /******/ } /******/ } /******/ var ret = {}; /******/ ret[webpackQueues] = x => {}; /******/ ret[webpackExports] = dep; /******/ return ret; /******/ })); /******/ __webpack_require__.a = (module, body, hasAwait) => { /******/ var queue; /******/ hasAwait && ((queue = []).d = -1); /******/ var depQueues = new Set(); /******/ var exports = module.exports; /******/ var currentDeps; /******/ var outerResolve; /******/ var reject; /******/ var promise = new Promise((resolve, rej) => { /******/ reject = rej; /******/ outerResolve = resolve; /******/ }); /******/ promise[webpackExports] = exports; /******/ promise[webpackQueues] = (fn) => (queue && fn(queue), depQueues.forEach(fn), promise["catch"](x => {})); /******/ module.exports = promise; /******/ body((deps) => { /******/ currentDeps = wrapDeps(deps); /******/ var fn; /******/ var getResult = () => (currentDeps.map((d) => { /******/ if(d[webpackError]) throw d[webpackError]; /******/ return d[webpackExports]; /******/ })) /******/ var promise = new Promise((resolve) => { /******/ fn = () => (resolve(getResult)); /******/ fn.r = 0; /******/ var fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn)))); /******/ currentDeps.map((dep) => (dep[webpackQueues](fnQueue))); /******/ }); /******/ return fn.r ? promise : getResult(); /******/ }, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue))); /******/ queue && queue.d < 0 && (queue.d = 0); /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/compat get default export */ /******/ (() => { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = (module) => { /******/ var getter = module && module.__esModule ? /******/ () => (module['default']) : /******/ () => (module); /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ (() => { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = (exports, definition) => { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ (() => { /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) /******/ })(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ (() => { /******/ // define __esModule on exports /******/ __webpack_require__.r = (exports) => { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ })(); /******/ /******/ /* webpack/runtime/nonce */ /******/ (() => { /******/ __webpack_require__.nc = undefined; /******/ })(); /******/ /************************************************************************/ /******/ /******/ // startup /******/ // Load entry module and return exports /******/ // This entry module is referenced by other modules so it can't be inlined /******/ var __webpack_exports__ = __webpack_require__(279); /******/ /******/ return __webpack_exports__; /******/ })() ; });