AdBlock Script for WebView

Parse ABP Cosmetic rules to CSS and apply it.

目前為 2022-10-01 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name AdBlock Script for WebView
  3. // @name:zh-CN 套壳油猴的广告拦截脚本
  4. // @author Lemon399
  5. // @version 2.0
  6. // @description Parse ABP Cosmetic rules to CSS and apply it.
  7. // @description:zh-CN 将 ABP 元素隐藏规则转换为 CSS 并且应用
  8. // @require https://greasyfork.org/scripts/452263-extended-css/code/extended-css.js?version=1099366
  9. // @match *://*/*
  10. // @run-at document-start
  11. // @grant GM_getValue
  12. // @grant GM_deleteValue
  13. // @grant GM_setValue
  14. // @grant GM_registerMenuCommand
  15. // @grant GM_unregisterMenuCommand
  16. // @grant GM_xmlhttpRequest
  17. // @grant GM_addStyle
  18. // @namespace https://lemon399-bitbucket-io.vercel.app/
  19. // @source https://gitee.com/lemon399/tampermonkey-cli/tree/master/projects/abp_parse
  20. // @connect code.gitlink.org.cn
  21. // @copyright GPL-3.0
  22. // @license GPL-3.0
  23. // ==/UserScript==
  24.  
  25. (function (tm, ExtendedCss) {
  26. "use strict";
  27.  
  28. function _interopDefaultLegacy(e) {
  29. return e && typeof e === "object" && "default" in e
  30. ? e
  31. : {
  32. default: e,
  33. };
  34. }
  35.  
  36. var ExtendedCss__default = _interopDefaultLegacy(ExtendedCss);
  37.  
  38. var __assign = function () {
  39. __assign =
  40. Object.assign ||
  41. function __assign(t) {
  42. for (var s, i = 1, n = arguments.length; i < n; i++) {
  43. s = arguments[i];
  44.  
  45. for (var p in s)
  46. if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
  47. }
  48.  
  49. return t;
  50. };
  51.  
  52. return __assign.apply(this, arguments);
  53. };
  54.  
  55. function __awaiter(thisArg, _arguments, P, generator) {
  56. function adopt(value) {
  57. return value instanceof P
  58. ? value
  59. : new P(function (resolve) {
  60. resolve(value);
  61. });
  62. }
  63.  
  64. return new (P || (P = Promise))(function (resolve, reject) {
  65. function fulfilled(value) {
  66. try {
  67. step(generator.next(value));
  68. } catch (e) {
  69. reject(e);
  70. }
  71. }
  72.  
  73. function rejected(value) {
  74. try {
  75. step(generator["throw"](value));
  76. } catch (e) {
  77. reject(e);
  78. }
  79. }
  80.  
  81. function step(result) {
  82. result.done
  83. ? resolve(result.value)
  84. : adopt(result.value).then(fulfilled, rejected);
  85. }
  86.  
  87. step((generator = generator.apply(thisArg, _arguments || [])).next());
  88. });
  89. }
  90.  
  91. function __generator(thisArg, body) {
  92. var _ = {
  93. label: 0,
  94. sent: function () {
  95. if (t[0] & 1) throw t[1];
  96. return t[1];
  97. },
  98. trys: [],
  99. ops: [],
  100. },
  101. f,
  102. y,
  103. t,
  104. g;
  105. return (
  106. (g = {
  107. next: verb(0),
  108. throw: verb(1),
  109. return: verb(2),
  110. }),
  111. typeof Symbol === "function" &&
  112. (g[Symbol.iterator] = function () {
  113. return this;
  114. }),
  115. g
  116. );
  117.  
  118. function verb(n) {
  119. return function (v) {
  120. return step([n, v]);
  121. };
  122. }
  123.  
  124. function step(op) {
  125. if (f) throw new TypeError("Generator is already executing.");
  126.  
  127. while (_)
  128. try {
  129. if (
  130. ((f = 1),
  131. y &&
  132. (t =
  133. op[0] & 2
  134. ? y["return"]
  135. : op[0]
  136. ? y["throw"] || ((t = y["return"]) && t.call(y), 0)
  137. : y.next) &&
  138. !(t = t.call(y, op[1])).done)
  139. )
  140. return t;
  141. if (((y = 0), t)) op = [op[0] & 2, t.value];
  142.  
  143. switch (op[0]) {
  144. case 0:
  145. case 1:
  146. t = op;
  147. break;
  148.  
  149. case 4:
  150. _.label++;
  151. return {
  152. value: op[1],
  153. done: false,
  154. };
  155.  
  156. case 5:
  157. _.label++;
  158. y = op[1];
  159. op = [0];
  160. continue;
  161.  
  162. case 7:
  163. op = _.ops.pop();
  164.  
  165. _.trys.pop();
  166.  
  167. continue;
  168.  
  169. default:
  170. if (
  171. !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) &&
  172. (op[0] === 6 || op[0] === 2)
  173. ) {
  174. _ = 0;
  175. continue;
  176. }
  177.  
  178. if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) {
  179. _.label = op[1];
  180. break;
  181. }
  182.  
  183. if (op[0] === 6 && _.label < t[1]) {
  184. _.label = t[1];
  185. t = op;
  186. break;
  187. }
  188.  
  189. if (t && _.label < t[2]) {
  190. _.label = t[2];
  191.  
  192. _.ops.push(op);
  193.  
  194. break;
  195. }
  196.  
  197. if (t[2]) _.ops.pop();
  198.  
  199. _.trys.pop();
  200.  
  201. continue;
  202. }
  203.  
  204. op = body.call(thisArg, _);
  205. } catch (e) {
  206. op = [6, e];
  207. y = 0;
  208. } finally {
  209. f = t = 0;
  210. }
  211.  
  212. if (op[0] & 5) throw op[1];
  213. return {
  214. value: op[0] ? op[1] : void 0,
  215. done: true,
  216. };
  217. }
  218. }
  219.  
  220. var onlineRules = [
  221. "https://code.gitlink.org.cn/damengzhu/banad/raw/branch/main/jiekouAD.txt",
  222. "https://code.gitlink.org.cn/damengzhu/abpmerge/raw/branch/main/abpmerge.txt",
  223. ],
  224. defaultRules =
  225. '\n! \u6CA1\u6709\u4E24\u4E2A # \u7684\u884C\u548C \u5F00\u5934\u4E3A ! \u7684\u884C\u4F1A\u5FFD\u7565\n! baidu.com##.ec_wise_ad\n!\n! :remove() \u4F1A\u7528 js \u79FB\u9664\u5143\u7D20\uFF0C:remove() \u5FC5\u987B\u653E\u5728\u884C\u5C3E\n! baidu.com###ad:remove()\n!\n! \u7531\u4E8E\u8BED\u6CD5\u9650\u5236\uFF0C\u5185\u7F6E\u89C4\u5219\u4E2D\n! \u4E00\u4E2A\u53CD\u659C\u6760\u9700\u8981\u6539\u6210\u4E24\u4E2A\uFF0C\u50CF\u8FD9\u6837 \\\n!\n! \u811A\u672C\u4F1A\u9996\u5148\u5C1D\u8BD5\u4ECE\u4E0A\u9762\u7684\u5730\u5740\u6570\u7EC4\u83B7\u53D6\u89C4\u5219\n! \u83B7\u53D6\u5230\u7684\u89C4\u5219\u5C06\u4F1A\u4E0E\u5185\u7F6E\u89C4\u5219\u5408\u5E76\n! \u6240\u6709\u89C4\u5219\u83B7\u53D6\u5B8C\u6BD5\u4EE5\u540E\u624D\u4F1A\u5E94\u7528\u89C4\u5219\n!\n! \u82E5\u8981\u4FEE\u6539\u5730\u5740\uFF0C\u8BF7\u6CE8\u610F\u540C\u6B65\u4FEE\u6539\u5934\u90E8\u7684 @connect \u7684\u57DF\u540D\n!2.3.1\nvercel.app#?#blockquote:has(.mymoney)\nvercel.app#?#blockquote:-abp-has(.myhoney)\nvercel.app#?#blockquote[-ext-has=".mytony"]\n!2.3.2\nvercel.app#?#blockquote:has-text(\u70E6\u607C)\nvercel.app#?#blockquote:has-text(/\u533A\u5206\\d/)\nvercel.app#?#blockquote:contains(\u6ED1\u5757)\nvercel.app#?#blockquote:-abp-contains(\u7EA2\u65E5)\nvercel.app#?#blockquote[-ext-contains="\u5A92\u4F53"]\n!2.3.3\nvercel.app#?#blockquote:matches-css(background-color: rgb\\(135, 206, 235\\))\nvercel.app#?#blockquote:matches-css(background-color: rgb\\(200, 206, 214\\))\nvercel.app#?#blockquote[-ext-matches-css="background-color: rgb\\(240, 255, 240\\)"]\nvercel.app#?#blockquote:matches-css(background-color: /^rgb\\(255,/)\n!2.3.4\nvercel.app#?#blockquote:matches-css-before(content: \u6211\u662F\u5E7F\u544A\u554A)\nvercel.app#?#blockquote[-ext-matches-css-before="content: \u6211\u662F\u5E7F\u544A\u5462"]\n!2.3.5\nvercel.app#?#blockquote:matches-css-after(content: \u6211\u662F\u5E7F\u544A\u54DF)\nvercel.app#?#blockquote[-ext-matches-css-after="content: \u6211\u662F\u5E7F\u544A\u54E6"]\n!2.3.6\nvercel.app#?#[type=range]:matches-attr("disabled")\nvercel.app#?#[type=range]:matches-attr("min"="5")\nvercel.app#?#[type=range]:matches-attr("max"="/^3/")\n!2.3.9\nvercel.app#?#[src$="up.gif"]:nth-ancestor(2)\n!2.3.10\nvercel.app#?#[src$="up2.gif"]:upward(2)\nvercel.app#?#p > em:upward(.box)\n!2.3.12\nvercel.app#?##close:xpath(../../*[1])\n!2.3.13\nvercel.app#?##remo:remove()\n!2.3.15\nvercel.app#?##not > blockquote:not(:has(.ok))\nvercel.app#?##abpnot > blockquote:not(:-abp-has(.ok))\n!2.3.16\nvercel.app#?##ifnot > blockquote:if-not(.ok)\n!2.2.4\nvercel.app#?#blockquote:has(.yes)\nvercel.app#@?#blockquote:has(.yes)\n!2.2.10\nvercel.app#$##turq { color: turquoise !important }\n!2.2.10@\nvercel.app#$##seag { color: seagreen !important }\nvercel.app#@$##seag { color: seagreen !important }\n!2.2.11\nvercel.app#$?#span:contains(\u771F\u7684\u662F) { display: none!important; }\n!2.2.11@\nvercel.app#$?#span:contains(\u771F\u4E0D\u662F) { display: none!important; }\nvercel.app#@$?#span:contains(\u771F\u4E0D\u662F) { display: none!important; }\n';
  226. const id = "placeholder";
  227.  
  228. function isObj(o) {
  229. return (
  230. typeof o == "object" &&
  231. (o === null || o === void 0 ? void 0 : o.toString()) === "[object Object]"
  232. );
  233. }
  234.  
  235. function runNeed(condition, fn, option, ...args) {
  236. let ok = false,
  237. sleep = (time) => {
  238. return new Promise((r) => setTimeout(r, time));
  239. },
  240. defaultOption = {
  241. count: 20,
  242. delay: 200,
  243. failFn: () => null,
  244. };
  245.  
  246. if (isObj(option)) Object.assign(defaultOption, option);
  247. new Promise(async (resolve, reject) => {
  248. for (let c = 0; !ok && c < defaultOption.count; c++) {
  249. await sleep(defaultOption.delay);
  250. ok = condition.call(null, c + 1);
  251. }
  252.  
  253. ok ? resolve() : reject();
  254. }).then(fn.bind(null, ...args), defaultOption.failFn);
  255. }
  256.  
  257. `BEXT_LAST_CHECK_KEY_${id}`;
  258.  
  259. function getName(path) {
  260. var reer = /\/([^\/]+)$/.exec(path);
  261. return reer ? reer[1] : null;
  262. }
  263.  
  264. function getEtag(header) {
  265. var reer = /etag: \"(\w+)\"/.exec(header);
  266. return reer ? reer[1] : null;
  267. }
  268.  
  269. function getDay(date) {
  270. var reer = /\/(\d{1,2}) /.exec(date);
  271. return reer ? parseInt(reer[1]) : 0;
  272. }
  273.  
  274. function makeRuleBox() {
  275. return {
  276. black: [],
  277. white: [],
  278. apply: "",
  279. };
  280. }
  281.  
  282. function domainChecker(domains) {
  283. var results = [],
  284. hasTLD = /\.+?[\w-]+$/,
  285. urlSuffix = hasTLD.exec(location.hostname);
  286. var invert = false,
  287. result = false,
  288. mostMatch = {
  289. long: 0,
  290. result: undefined,
  291. };
  292. domains.forEach(function (domain) {
  293. if (domain.endsWith(".*") && Array.isArray(urlSuffix)) {
  294. domain = domain.replace(".*", urlSuffix[0]);
  295. }
  296.  
  297. if (domain.startsWith("~")) {
  298. invert = true;
  299. domain = domain.slice(1);
  300. } else invert = false;
  301.  
  302. result = location.hostname.endsWith(domain);
  303. results.push(result !== invert);
  304.  
  305. if (result) {
  306. if (domain.length > mostMatch.long) {
  307. mostMatch = {
  308. long: domain.length,
  309. result: result !== invert,
  310. };
  311. }
  312. }
  313. });
  314. return mostMatch.long > 0 ? mostMatch.result : results.includes(true);
  315. }
  316.  
  317. function ruleChecker(matches) {
  318. var index = matches.findIndex(function (i) {
  319. return i !== null;
  320. });
  321.  
  322. if (
  323. index >= 0 &&
  324. (!matches[index][1] || domainChecker(matches[index][1].split(",")))
  325. ) {
  326. return [index % 2 == 0, Math.floor(index / 2), matches[index].pop()];
  327. }
  328. }
  329.  
  330. function ruleSpliter(rule) {
  331. var result = ruleChecker([
  332. rule.match(
  333. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?##([^\s^+].*)/
  334. ),
  335. rule.match(
  336. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#@#([^\s^+].*)/
  337. ),
  338. rule.match(
  339. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#\?#([^\s^+].*)/
  340. ),
  341. rule.match(
  342. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#@\?#([^\s^+].*)/
  343. ),
  344. rule.match(
  345. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#\$#([^\s^+].*)/
  346. ),
  347. rule.match(
  348. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#@\$#([^\s^+].*)/
  349. ),
  350. rule.match(
  351. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#\$\?#([^\s^+].*)/
  352. ),
  353. rule.match(
  354. /^(~?[\w-]+\.([\w-]+|\*)(,~?[\w-]+\.([\w-]+|\*))*)?#@\$\?#([^\s^+].*)/
  355. ),
  356. ]);
  357.  
  358. if (result && result[2]) {
  359. return {
  360. black: result[0],
  361. type: result[1],
  362. sel: result[2],
  363. };
  364. }
  365. }
  366.  
  367. var selectors = makeRuleBox(),
  368. extSelectors = makeRuleBox(),
  369. styles = makeRuleBox(),
  370. extStyles = makeRuleBox(),
  371. values = {
  372. get black() {
  373. var v = tm.GM_getValue("ajs_disabled_domains", "");
  374. return typeof v == "string" ? v : "";
  375. },
  376.  
  377. set black(v) {
  378. v === null
  379. ? tm.GM_deleteValue("ajs_disabled_domains")
  380. : tm.GM_setValue("ajs_disabled_domains", v);
  381. },
  382.  
  383. get rules() {
  384. var v = tm.GM_getValue("ajs_saved_abprules", "{}");
  385. return typeof v == "string" ? JSON.parse(v) : {};
  386. },
  387.  
  388. set rules(v) {
  389. v === null
  390. ? tm.GM_deleteValue("ajs_saved_abprules")
  391. : tm.GM_setValue("ajs_saved_abprules", JSON.stringify(v));
  392. },
  393.  
  394. get time() {
  395. var v = tm.GM_getValue("ajs_rules_ver", "0/0/0 0:0:0");
  396. return typeof v == "string" ? v : "0/0/0 0:0:0";
  397. },
  398.  
  399. set time(v) {
  400. v === null
  401. ? tm.GM_deleteValue("ajs_rules_ver")
  402. : tm.GM_setValue("ajs_rules_ver", v);
  403. },
  404.  
  405. get etags() {
  406. var v = tm.GM_getValue("ajs_rules_etags", "{}");
  407. return typeof v == "string" ? JSON.parse(v) : {};
  408. },
  409.  
  410. set etags(v) {
  411. v === null
  412. ? tm.GM_deleteValue("ajs_rules_etags")
  413. : tm.GM_setValue("ajs_rules_etags", JSON.stringify(v));
  414. },
  415. },
  416. data = {
  417. disabled: false,
  418. updating: false,
  419. receivedRules: "",
  420. allRules: "",
  421. genericStyle: document.createElement("style"),
  422. presetCss:
  423. " {display: none !important;width: 0 !important;height: 0 !important;} ",
  424. supportedCount: 0,
  425. appliedCount: 0,
  426. },
  427. menus = {
  428. disable: {
  429. id: undefined,
  430.  
  431. get text() {
  432. return data.disabled ? "在此网站启用拦截" : "在此网站禁用拦截";
  433. },
  434. },
  435. update: {
  436. id: undefined,
  437.  
  438. get text() {
  439. var time = values.time;
  440. return data.updating
  441. ? "正在更新..."
  442. : "\u70B9\u51FB\u66F4\u65B0: ".concat(
  443. time.slice(0, 1) === "0" ? "未知时间" : time
  444. );
  445. },
  446. },
  447. count: {
  448. id: undefined,
  449.  
  450. get text() {
  451. return "\u70B9\u51FB\u6E05\u7A7A: "
  452. .concat(data.appliedCount, " / ")
  453. .concat(data.supportedCount, " / ")
  454. .concat(data.allRules.split("\n").length);
  455. },
  456. },
  457. };
  458.  
  459. function gmMenu(name, cb) {
  460. if (
  461. typeof tm.GM_registerMenuCommand !== "function" ||
  462. typeof tm.GM_unregisterMenuCommand !== "function" ||
  463. window.self !== window.top
  464. )
  465. return false;
  466. var id = menus[name].id;
  467.  
  468. if (typeof id !== "undefined") {
  469. menus[name].id = tm.GM_unregisterMenuCommand(id);
  470. }
  471.  
  472. if (typeof cb == "function") {
  473. menus[name].id = tm.GM_registerMenuCommand(menus[name].text, cb);
  474. }
  475.  
  476. return typeof menus[name].id !== "undefined";
  477. }
  478.  
  479. function promiseXhr(details) {
  480. return new Promise(function (resolve, reject) {
  481. tm.GM_xmlhttpRequest(
  482. __assign(
  483. {
  484. onload: function (e) {
  485. resolve(e);
  486. },
  487. onabort: reject.bind(null),
  488. onerror: reject.bind(null),
  489. ontimeout: reject.bind(null),
  490. },
  491. details
  492. )
  493. );
  494. });
  495. }
  496.  
  497. function storeRule(name, resp) {
  498. var savedRules = values.rules,
  499. savedEtags = values.etags;
  500.  
  501. if (resp.responseHeaders) {
  502. var etag = getEtag(resp.responseHeaders);
  503.  
  504. if (etag) {
  505. savedEtags[name] = etag;
  506. values.etags = savedEtags;
  507. }
  508. }
  509.  
  510. if (resp.responseText) {
  511. savedRules[name] = resp.responseText;
  512. values.rules = savedRules;
  513. }
  514. }
  515.  
  516. function fetchRule(url) {
  517. var _this = this;
  518.  
  519. var _a;
  520.  
  521. var name =
  522. (_a = getName(url)) !== null && _a !== void 0
  523. ? _a
  524. : "".concat(url.length, ".").concat(url.slice(-5));
  525. return new Promise(function (resolve, reject) {
  526. return __awaiter(_this, void 0, void 0, function () {
  527. var headResp, etag, savedEtags, _a, _b;
  528.  
  529. return __generator(this, function (_c) {
  530. switch (_c.label) {
  531. case 0:
  532. if (!name) reject();
  533. return [
  534. 4,
  535. promiseXhr({
  536. method: "HEAD",
  537. responseType: "text",
  538. url: url,
  539. }),
  540. ];
  541.  
  542. case 1:
  543. headResp = _c.sent();
  544. if (!headResp.responseText) return [3, 2];
  545. storeRule(name, headResp);
  546. resolve();
  547. return [3, 5];
  548.  
  549. case 2:
  550. if (!headResp.responseHeaders) return [3, 5];
  551. (etag = getEtag(headResp.responseHeaders)),
  552. (savedEtags = values.etags);
  553. if (!(etag !== savedEtags[name])) return [3, 4];
  554. _a = storeRule;
  555. _b = [name];
  556. return [
  557. 4,
  558. promiseXhr({
  559. method: "GET",
  560. responseType: "text",
  561. url: url,
  562. }),
  563. ];
  564.  
  565. case 3:
  566. _a.apply(void 0, _b.concat([_c.sent()]));
  567.  
  568. resolve();
  569. return [3, 5];
  570.  
  571. case 4:
  572. reject();
  573. _c.label = 5;
  574.  
  575. case 5:
  576. return [2];
  577. }
  578. });
  579. });
  580. });
  581. }
  582.  
  583. function fetchRules() {
  584. return __awaiter(this, void 0, void 0, function () {
  585. var pArray;
  586. return __generator(this, function (_a) {
  587. switch (_a.label) {
  588. case 0:
  589. pArray = [];
  590. data.updating = true;
  591. gmMenu("update", fetchRules);
  592. onlineRules.forEach(function (url) {
  593. pArray.push(fetchRule(url));
  594. });
  595. return [4, Promise.allSettled(pArray)];
  596.  
  597. case 1:
  598. _a.sent();
  599.  
  600. values.time = new Date().toLocaleString("zh-CN");
  601. initRules();
  602. return [2];
  603. }
  604. });
  605. });
  606. }
  607.  
  608. function performUpdate(force) {
  609. if (force) {
  610. return fetchRules();
  611. } else {
  612. return getDay(values.time) !== new Date().getDate()
  613. ? fetchRules()
  614. : Promise.resolve();
  615. }
  616. }
  617.  
  618. function switchDisabledStat() {
  619. var disaList = values.black.split(","),
  620. disaResult = disaList.includes(location.hostname);
  621. data.disabled = !disaResult;
  622.  
  623. if (data.disabled) {
  624. disaList.push(location.hostname);
  625. } else {
  626. disaList.splice(disaList.indexOf(location.hostname), 1);
  627. }
  628.  
  629. values.black = disaList.join(",");
  630. gmMenu("disable", switchDisabledStat);
  631. }
  632.  
  633. function checkDisableStat() {
  634. var disaResult = values.black.split(",").includes(location.hostname);
  635. data.disabled = disaResult;
  636. gmMenu("disable", switchDisabledStat);
  637. return disaResult;
  638. }
  639.  
  640. function initRules() {
  641. var abpRules = values.rules,
  642. abpKeys = Object.keys(abpRules);
  643. abpKeys.forEach(function (name) {
  644. data.receivedRules += "\n" + abpRules[name] + "\n";
  645. });
  646. data.allRules = defaultRules + data.receivedRules;
  647.  
  648. if (abpKeys.length !== 0) {
  649. data.updating = false;
  650. gmMenu("update", fetchRules);
  651. }
  652.  
  653. return data.receivedRules.length;
  654. }
  655.  
  656. function styleApply() {
  657. var css =
  658. styles.apply +
  659. (selectors.apply.length > 0 ? selectors.apply + data.presetCss : ""),
  660. ecss =
  661. extStyles.apply +
  662. (extSelectors.apply.length > 0
  663. ? extSelectors.apply + data.presetCss
  664. : "");
  665.  
  666. if (css.length > 0) {
  667. if (typeof tm.GM_addStyle == "function") {
  668. tm.GM_addStyle(css);
  669. } else {
  670. runNeed(
  671. function () {
  672. return !!document.documentElement;
  673. },
  674. function () {
  675. data.genericStyle.textContent = css;
  676. document.documentElement.appendChild(data.genericStyle);
  677. }
  678. );
  679. }
  680. }
  681.  
  682. if (ecss.length > 0)
  683. new ExtendedCss__default.default({
  684. styleSheet: ecss,
  685. }).apply();
  686. }
  687.  
  688. function parseRules() {
  689. var _this = this;
  690.  
  691. [selectors, extSelectors].forEach(function (obj) {
  692. obj.black
  693. .filter(function (v) {
  694. return !obj.white.includes(v);
  695. })
  696. .forEach(function (sel) {
  697. obj.apply += "".concat(obj.apply.length == 0 ? "" : ",").concat(sel);
  698. data.appliedCount++;
  699. });
  700. });
  701. [styles, extStyles].forEach(function (obj) {
  702. obj.black
  703. .filter(function (v) {
  704. return !obj.white.includes(v);
  705. })
  706. .forEach(function (sel) {
  707. obj.apply += " ".concat(sel);
  708. data.appliedCount++;
  709. });
  710. });
  711. gmMenu("count", function () {
  712. if (confirm("是否清空存储规则 ?")) {
  713. values.rules = {};
  714. values.time = "0/0/0 0:0:0";
  715. values.etags = {};
  716. gmMenu("update", performUpdate.bind(_this, true));
  717. }
  718. });
  719. styleApply();
  720. }
  721.  
  722. function main() {
  723. return __awaiter(this, void 0, void 0, function () {
  724. return __generator(this, function (_a) {
  725. switch (_a.label) {
  726. case 0:
  727. if (checkDisableStat()) return [2];
  728. if (!(initRules() === 0)) return [3, 2];
  729. return [4, performUpdate(true)];
  730.  
  731. case 1:
  732. _a.sent();
  733.  
  734. _a.label = 2;
  735.  
  736. case 2:
  737. data.allRules.split("\n").forEach(function (rule) {
  738. var ruleObj = ruleSpliter(rule);
  739. var arr = "";
  740.  
  741. if (typeof ruleObj !== "undefined") {
  742. arr = ruleObj.black ? "black" : "white";
  743.  
  744. switch (ruleObj.type) {
  745. case 0:
  746. selectors[arr].push(ruleObj.sel);
  747. break;
  748.  
  749. case 1:
  750. extSelectors[arr].push(ruleObj.sel);
  751. break;
  752.  
  753. case 2:
  754. styles[arr].push(ruleObj.sel);
  755. break;
  756.  
  757. case 3:
  758. extStyles[arr].push(ruleObj.sel);
  759. break;
  760. }
  761.  
  762. data.supportedCount++;
  763. }
  764. });
  765. parseRules();
  766. performUpdate(false);
  767. return [2];
  768. }
  769. });
  770. });
  771. }
  772.  
  773. main();
  774. })(self, ExtendedCss);