网页黑色主题

网页切换为黑色主题

目前为 2018-02-03 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name DarkTheme
  3. // @name:zh-CN 网页黑色主题
  4. // @namespace https://greasyfork.org/zh-CN/users/104201
  5. // @version 0.1
  6. // @description Tabs in Dark Theme
  7. // @description:zh-CN 网页切换为黑色主题
  8. // @author 黄盐
  9. // @include *
  10. // @noframes
  11. // @require https://cdnjs.cloudflare.com/ajax/libs/zepto/1.2.0/zepto.min.js
  12. // @grant unsafeWindow
  13. // @run-at document-start
  14. // @grant GM_setValue
  15. // @grant GM_getValue
  16. // @grant GM.setValue
  17. // @grant GM.getValue
  18. // @grant GM_registerMenuCommand
  19. // @grant GM_unregisterMenuCommand
  20. // ==/UserScript==
  21. /* jshint esversion: 6 */
  22. ;
  23. (function() {
  24. 'use strict';
  25. const CSS = `
  26. :root{-webkit-filter:invert(100%) contrast(87%);filter:invert(100%) contrast(87%);background:#272822!important;}
  27. img{-webkit-filter:invert(100%) brightness(105%);filter:invert(100%) brightness(105%);}
  28. *[style*="url"]{-webkit-filter:invert(100%);filter:invert(100%);}
  29. *[data-dmbg="1"]{-webkit-filter:none;filter:none;}
  30. *[data-dmbg="2"]{-webkit-filter:invert(100%);filter:invert(100%);}
  31. video,embed,object,canvas{-webkit-filter:invert(100%);filter:invert(100%);}
  32. /* 图标 */
  33. ::before{-webkit-filter:invert(100%);filter:invert(100%);}
  34. /* 图标 排除font-awesome图标 */
  35. .fa::before{-webkit-filter:invert(0%);filter:invert(0%);}
  36. /* 下面的 img img 这种选择器,是指那些被点击后图片会放大的图片,如微博里面小图, 方案: 眼睛护航crx*/
  37. :-webkit-any(iframe,img,[style*="url"]:not(input),i,video,object,embed:not([type$="pdf"])):-webkit-any(iframe,img,[style*="url"]:not(input),i,video,object,embed:not([type$="pdf"])){-webkit-filter:none;filter:none;}
  38. :-moz-any(iframe,img,[style*="url"]:not(input),i,video,object,embed:not([type$="pdf"])):-moz-any(iframe,img,[style*="url"]:not(input),i,video,object,embed:not([type$="pdf"])){filter:none;}
  39. img[src*="logo"]{-webkit-filter:invert(0%);filter:invert(0%);}
  40. `;
  41. const defaultCSSlist = {
  42. ".*baidu.com": {
  43. name: "百度",
  44. enable: 0,
  45. default: 1,
  46. css: "/* baidu search,news,wenku logo*/\n#result_logo img, .s_logo img, .logo img {\n -webkit-filter: invert(0%);\n filter: invert(0%);\n}"
  47. },
  48. ".iqiyi.com": {
  49. name: "爱奇艺",
  50. enable: 1,
  51. default: 1,
  52. css: "/*index*/\n#adSkinInner #block-A,\ndiv#block-C,\ndiv#block-B { -webkit-filter: invert(100%); filter: invert(100%); }\n\n/*首页图片*/\n.skin_focus li[style*=\"background-image\"] { -webkit-filter: invert(0%); filter: invert(0%); }\n\n/*播放页*/\n#block-B video,\n#block-B img { -webkit-filter: invert(0%); filter: invert(0%); }\n.topNav-player,\n.topNav-pindao { background: #e4e4e4; }\ndiv.navMid.clearfix,\ndiv.navcont.clearfix { -webkit-filter: invert(100%); filter: invert(100%); }\ndiv.mod-breadcrumb { -webkit-filter: invert(0%); filter: invert(0%); background: black; }"
  53. }
  54. };
  55. var darkThemeSwitch, csslist, blackList, pageFirstLoad = true;
  56.  
  57. /*这里不采用GM_addStyle,
  58. *是为了避免网页局部更新的时候,把<head>内部的<style>去除了,
  59. *例如百度搜索,点击搜索一下按钮的时候
  60. */
  61. function GMaddStyle(id, css) {
  62. let a = document.createElement('style'),
  63. doc;
  64. a.id = id;
  65. a.textContent = '<!--\n' + css + '\n-->';
  66. if (location.origin === "file://") {
  67. doc = document.head || document.documentElement;
  68. } else {
  69. doc = document.body || document.documentElement;
  70. }
  71. doc.appendChild(a);
  72. }
  73. /* 兼容 Tampermonkey | Violentmonkey | Greasymonkey 4.0+
  74. * 为了兼容GreasyMonkey 4.0 获取结构化数据,比如 json Array 等,
  75. * 应当先将字符串还原为对象,再执行后续操作
  76. * GMgetValue(name,defaultValue).then((result)=>{
  77. * let result = JSON.parse(result);
  78. * // other code...
  79. * };
  80. */
  81. function GMgetValue(name, defaultValue) {
  82. if (typeof GM_getValue === 'function') {
  83. return new Promise((resolve, reject) => {
  84. resolve(GM_getValue(name, defaultValue));
  85. // reject();
  86. });
  87. } else {
  88. return GM.getValue(name, defaultValue);
  89. }
  90. }
  91. /* 兼容 Tampermonkey | Violentmonkey | Greasymonkey 4.0+
  92. * 为了兼容GreasyMonkey 4.0 储存结构化数据,比如 json Array 等,
  93. * 应当先将对象字符串化,
  94. * GMsetValue(name, JSON.stringify(defaultValue))
  95. */
  96. function GMsetValue(name, defaultValue) {
  97. if (typeof GM_setValue === 'function') {
  98. GM_setValue(name, defaultValue);
  99. return new Promise((resolve, reject) => {
  100. resolve();
  101. reject();
  102. });
  103. } else {
  104. return GM.setValue(name, defaultValue);
  105. }
  106. }
  107. //concat cssText: return css Promise
  108. function concatCss() {
  109. return GMgetValue('csslist', JSON.stringify(defaultCSSlist))
  110. .then((ag) => {
  111. let a = '', enableDefaultCSS = 0;
  112. csslist = JSON.parse(ag);
  113. for (let i in csslist) {
  114. try {
  115. if (new RegExp(i).test(location.host) && csslist[i].enable === "1") {
  116. a += csslist[i].css;
  117. /* 所有匹配规则都不允许默认CSS的时候,才不添加默认CSS */
  118. enableDefaultCSS = !!(enableDefaultCSS || csslist[i].default === "1");
  119. console.log(enableDefaultCSS);
  120. }
  121. } catch (e) {
  122. console.log(e);
  123. }
  124. }
  125. if( typeof enableDefaultCSS !== 'number' && !enableDefaultCSS){
  126. return a;
  127. }else{
  128. return CSS + a;
  129. }
  130. });
  131. }
  132. //Greasymonkey
  133. function GMBlackList() {
  134. if (pageFirstLoad) {
  135. let a = document.createElement('div'),
  136. doc = document.body || document.documentElement,
  137. txt = `#GMBlackListDiv{position:fixed;left:0;bottom:0;width:30px;height:30px;border-radius:20px;background:cyan;opacity:0;z-index:9999999;} #GMBlackListDiv:hover{opacity:1;} `;
  138. GMaddStyle('GMBlackList', txt);
  139. a.id = 'GMBlackListDiv';
  140. doc.appendChild(a);
  141. $(a).on('click', GMBlackList);
  142. } else {
  143. if (blackList[location.host] === undefined) {
  144. blackList[location.host] = true;
  145. } else {
  146. delete blackList[location.host];
  147. }
  148. GM.setValue('blackList', blackList);
  149. }
  150. if (blackList[location.host]) {
  151. try {
  152. $('#darkTheme').remove();
  153. } catch (e) {}
  154. } else {
  155. concatCss().then((ag) => {
  156. GMaddStyle('darkTheme', ag);
  157. init();
  158. });
  159. }
  160. }
  161. //Tampermonkey | Violentmonkey
  162. function TMBlackList() {
  163. GMgetValue('blackList', '{"null":false}')
  164. .then((blist) => {
  165. blackList = JSON.parse(blist);
  166. if (!pageFirstLoad) {
  167. GM_unregisterMenuCommand(darkThemeSwitch);
  168. if (blackList[location.host] === undefined) {
  169. blackList[location.host] = true;
  170. } else {
  171. delete blackList[location.host];
  172. }
  173. GMsetValue('blackList', JSON.stringify(blackList));
  174. }
  175. if (blackList[location.host]) {
  176. try {
  177. $('#darkTheme').remove();
  178. } catch (e) {}
  179. darkThemeSwitch = GM_registerMenuCommand('DarkTheme On', TMBlackList);
  180. } else {
  181. concatCss().then((ag) => {
  182. GMaddStyle('darkTheme', ag);
  183. init();
  184. darkThemeSwitch = GM_registerMenuCommand('DarkTheme Off', TMBlackList);
  185. });
  186. }
  187. });
  188. GM_registerMenuCommand('DK Manage CSS', manage);
  189. }
  190. //初始化
  191. function init() {
  192. function BGlinks() {
  193. $('a').each((index, item) => {
  194. if ($(item).css('background-image') !== 'none') {
  195. $(item).attr('data-dmbg', '1');
  196. }
  197. });
  198. }
  199. $(BGlinks);
  200. }
  201. //管理 特定的CSS
  202. function manage() {
  203. const managePanelCss = `
  204. #cssManagePanel{width:100%;height:100%;position:fixed;left:0;top:0;margin:0;padding:0;background-color:white;overflow-y:scroll;z-index:999999;}
  205. #cssManagePanel * :not(pre){border-radius:3px;font-size:16px;background:transparent;}
  206. #cssManagePanel pre,#cssManagePanel code,#cssManagePanel button[name='saveCSS']{display:none;}
  207. #cssManagePanel li{width:90%;list-style-type:none;border-bottom:1px dashed rgba(0,0,0,0.3);padding:3px;white-space:nowrap;text-align:center;}
  208. #cssManagePanel span :not(pre){display:inline-block;width:150px;}
  209. #cssManagePanel input[type='text']{display:inline-block;width:200px;border:1px solid #999;padding:2px 5px;}
  210. #cssManagePanel label{display:inline-block;width:80px;padding:3px 6px;}
  211. #cssManagePanel button{width:70px;background:#aaa;border:0;padding:3px 6px;}
  212. #cssManagePanel pre{width:100%;}
  213. #cssManagePanel code{border:1px solid #999;width:98%;height:200px;overflow:scroll;resize:both;min-width:300px;min-height:100px;text-align:left;}
  214. /* ===================== PrismJS Solarized Color Schemes START ========================= */
  215. code[class*="language-"],pre[class*="language-"]{color:#657b83; /* base00 */font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.5;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;}
  216. pre[class*="language-"]::-moz-selection,pre[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection,code[class*="language-"]::-moz-selection{background:#073642; /* base02 */}
  217. pre[class*="language-"]::selection,pre[class*="language-"]::selection,code[class*="language-"]::selection,code[class*="language-"]::selection{background:#073642; /* base02 */}
  218. /* Code blocks */
  219. pre[class*="language-"]{padding:1em;margin:.5em 0;overflow:auto;border-radius:0.3em;}
  220. :not(pre) > code[class*="language-"],pre[class*="language-"]{background-color:#fdf6e3; /* base3 */}
  221. /* Inline code */
  222. :not(pre) > code[class*="language-"]{padding:.1em;border-radius:.3em;}
  223. .token.comment,.token.prolog,.token.doctype,.token.cdata{color:#93a1a1; /* base1 */}
  224. .token.punctuation{color:#586e75; /* base01 */}
  225. .namespace{opacity:.7;}
  226. .token.property,.token.tag,.token.boolean,.token.number,.token.constant,.token.symbol,.token.deleted{color:#268bd2; /* blue */}
  227. .token.selector,.token.attr-name,.token.string,.token.char,.token.builtin,.token.url,.token.inserted{color:#2aa198; /* cyan */}
  228. .token.entity{color:#657b83; /* base00 */background:#eee8d5; /* base2 */}
  229. .token.atrule,.token.attr-value,.token.keyword{color:#859900; /* green */}
  230. .token.function{color:#b58900; /* yellow */}
  231. .token.regex,.token.important,.token.variable{color:#cb4b16; /* orange */}
  232. .token.important,.token.bold{font-weight:bold;}
  233. .token.italic{font-style:italic;}
  234. .token.entity{cursor:help;}
  235. /* ======================== PrismJS Solarized Color Schemes END ============================ */
  236. `;
  237.  
  238. function makeList() {
  239. let a = '',
  240. j = 0,
  241. managePanel;
  242. GMgetValue('csslist', JSON.stringify(defaultCSSlist))
  243. .then((ag) => {
  244. csslist = JSON.parse(ag);
  245. for (let i in csslist) {
  246. a += `<li>
  247. <span data-pattern="${i}">${csslist[i].name}</span>
  248. <label for="csslist${j}chbx1">
  249. <input id="csslist${j}chbx1" type="checkbox" name="default" ${csslist[i].default == '1'?' checked':''}>默认CSS
  250. </label>
  251. <label for="csslist${j}chbx2">
  252. <input id="csslist${j}chbx2" type="checkbox" name="enable" ${csslist[i].enable == '1'?' checked':''}>特定CSS
  253. </label>
  254. <button name="saveCSS">保存</button>
  255. <button name="editCSS">编辑CSS</button>
  256. <button name="deleteCSS">删除CSS</button>
  257. <button name="addCSS">新增</button>
  258. <br><pre><code id="csslist${j}" contenteditable="true" class="language-css">${csslist[i].css}</code></pre>
  259. </li>`;
  260. j++;
  261. }
  262. managePanel = $(`<style>${managePanelCss}</style><div><ul>${a}</ul></div>`, {
  263. id: "cssManagePanel"
  264. });
  265. $('body').append(managePanel);
  266. })
  267. .then(() => {
  268. $('#cssManagePanel button[name=editCSS]').one('click', editButton);
  269. $('#cssManagePanel button[name=deleteCSS]').one('click', deleteButton);
  270. $('#cssManagePanel button[name=addCSS]').on('click', addButton);
  271. // $('#cssManagePanel button[name=saveCSS]').on('click', saveButton);
  272. hightLight();
  273. });
  274. }
  275. function hightLight(){
  276. /* PrismJS 1.9.0
  277. http://prismjs.com/download.html?themes=prism-solarizedlight&languages=css */
  278. var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(){var e=/\blang(?:uage)?-(\w+)\b/i,t=0,n=_self.Prism={manual:_self.Prism&&_self.Prism.manual,disableWorkerMessageHandler:_self.Prism&&_self.Prism.disableWorkerMessageHandler,util:{encode:function(e){return e instanceof r?new r(e.type,n.util.encode(e.content),e.alias):"Array"===n.util.type(e)?e.map(n.util.encode):e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).match(/\[object (\w+)\]/)[1]},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function(e){var t=n.util.type(e);switch(t){case"Object":var r={};for(var a in e)e.hasOwnProperty(a)&&(r[a]=n.util.clone(e[a]));return r;case"Array":return e.map(function(e){return n.util.clone(e)})}return e}},languages:{extend:function(e,t){var r=n.util.clone(n.languages[e]);for(var a in t)r[a]=t[a];return r},insertBefore:function(e,t,r,a){a=a||n.languages;var l=a[e];if(2==arguments.length){r=arguments[1];for(var i in r)r.hasOwnProperty(i)&&(l[i]=r[i]);return l}var o={};for(var s in l)if(l.hasOwnProperty(s)){if(s==t)for(var i in r)r.hasOwnProperty(i)&&(o[i]=r[i]);o[s]=l[s]}return n.languages.DFS(n.languages,function(t,n){n===a[e]&&t!=e&&(this[t]=o)}),a[e]=o},DFS:function(e,t,r,a){a=a||{};for(var l in e)e.hasOwnProperty(l)&&(t.call(e,l,e[l],r||l),"Object"!==n.util.type(e[l])||a[n.util.objId(e[l])]?"Array"!==n.util.type(e[l])||a[n.util.objId(e[l])]||(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,l,a)):(a[n.util.objId(e[l])]=!0,n.languages.DFS(e[l],t,null,a)))}},plugins:{},highlightAll:function(e,t){n.highlightAllUnder(document,e,t)},highlightAllUnder:function(e,t,r){var a={callback:r,selector:'code[class*="language-"], [class*="language-"] code, code[class*="lang-"], [class*="lang-"] code'};n.hooks.run("before-highlightall",a);for(var l,i=a.elements||e.querySelectorAll(a.selector),o=0;l=i[o++];)n.highlightElement(l,t===!0,a.callback)},highlightElement:function(t,r,a){for(var l,i,o=t;o&&!e.test(o.className);)o=o.parentNode;o&&(l=(o.className.match(e)||[,""])[1].toLowerCase(),i=n.languages[l]),t.className=t.className.replace(e,"").replace(/\s+/g," ")+" language-"+l,t.parentNode&&(o=t.parentNode,/pre/i.test(o.nodeName)&&(o.className=o.className.replace(e,"").replace(/\s+/g," ")+" language-"+l));var s=t.textContent,g={element:t,language:l,grammar:i,code:s};if(n.hooks.run("before-sanity-check",g),!g.code||!g.grammar)return g.code&&(n.hooks.run("before-highlight",g),g.element.textContent=g.code,n.hooks.run("after-highlight",g)),n.hooks.run("complete",g),void 0;if(n.hooks.run("before-highlight",g),r&&_self.Worker){var u=new Worker(n.filename);u.onmessage=function(e){g.highlightedCode=e.data,n.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,a&&a.call(g.element),n.hooks.run("after-highlight",g),n.hooks.run("complete",g)},u.postMessage(JSON.stringify({language:g.language,code:g.code,immediateClose:!0}))}else g.highlightedCode=n.highlight(g.code,g.grammar,g.language),n.hooks.run("before-insert",g),g.element.innerHTML=g.highlightedCode,a&&a.call(t),n.hooks.run("after-highlight",g),n.hooks.run("complete",g)},highlight:function(e,t,a){var l=n.tokenize(e,t);return r.stringify(n.util.encode(l),a)},matchGrammar:function(e,t,r,a,l,i,o){var s=n.Token;for(var g in r)if(r.hasOwnProperty(g)&&r[g]){if(g==o)return;var u=r[g];u="Array"===n.util.type(u)?u:[u];for(var c=0;c<u.length;++c){var h=u[c],f=h.inside,d=!!h.lookbehind,m=!!h.greedy,p=0,y=h.alias;if(m&&!h.pattern.global){var v=h.pattern.toString().match(/[imuy]*$/)[0];h.pattern=RegExp(h.pattern.source,v+"g")}h=h.pattern||h;for(var b=a,k=l;b<t.length;k+=t[b].length,++b){var w=t[b];if(t.length>e.length)return;if(!(w instanceof s)){h.lastIndex=0;var _=h.exec(w),P=1;if(!_&&m&&b!=t.length-1){if(h.lastIndex=k,_=h.exec(e),!_)break;for(var A=_.index+(d?_[1].length:0),j=_.index+_[0].length,x=b,O=k,N=t.length;N>x&&(j>O||!t[x].type&&!t[x-1].greedy);++x)O+=t[x].length,A>=O&&(++b,k=O);if(t[b]instanceof s||t[x-1].greedy)continue;P=x-b,w=e.slice(k,O),_.index-=k}if(_){d&&(p=_[1].length);var A=_.index+p,_=_[0].slice(p),j=A+_.length,S=w.slice(0,A),C=w.slice(j),M=[b,P];S&&(++b,k+=S.length,M.push(S));var E=new s(g,f?n.tokenize(_,f):_,y,_,m);if(M.push(E),C&&M.push(C),Array.prototype.splice.apply(t,M),1!=P&&n.matchGrammar(e,t,r,b,k,!0,g),i)break}else if(i)break}}}}},tokenize:function(e,t){var r=[e],a=t.rest;if(a){for(var l in a)t[l]=a[l];delete t.rest}return n.matchGrammar(e,r,t,0,0,!1),r},hooks:{all:{},add:function(e,t){var r=n.hooks.all;r[e]=r[e]||[],r[e].push(t)},run:function(e,t){var r=n.hooks.all[e];if(r&&r.length)for(var a,l=0;a=r[l++];)a(t)}}},r=n.Token=function(e,t,n,r,a){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length,this.greedy=!!a};if(r.stringify=function(e,t,a){if("string"==typeof e)return e;if("Array"===n.util.type(e))return e.map(function(n){return r.stringify(n,t,e)}).join("");var l={type:e.type,content:r.stringify(e.content,t,a),tag:"span",classes:["token",e.type],attributes:{},language:t,parent:a};if(e.alias){var i="Array"===n.util.type(e.alias)?e.alias:[e.alias];Array.prototype.push.apply(l.classes,i)}n.hooks.run("wrap",l);var o=Object.keys(l.attributes).map(function(e){return e+'="'+(l.attributes[e]||"").replace(/"/g,"&quot;")+'"'}).join(" ");return"<"+l.tag+' class="'+l.classes.join(" ")+'"'+(o?" "+o:"")+">"+l.content+"</"+l.tag+">"},!_self.document)return _self.addEventListener?(n.disableWorkerMessageHandler||_self.addEventListener("message",function(e){var t=JSON.parse(e.data),r=t.language,a=t.code,l=t.immediateClose;_self.postMessage(n.highlight(a,n.languages[r],r)),l&&_self.close()},!1),_self.Prism):_self.Prism;var a=document.currentScript||[].slice.call(document.getElementsByTagName("script")).pop();return a&&(n.filename=a.src,n.manual||a.hasAttribute("data-manual")||("loading"!==document.readyState?window.requestAnimationFrame?window.requestAnimationFrame(n.highlightAll):window.setTimeout(n.highlightAll,16):document.addEventListener("DOMContentLoaded",n.highlightAll))),_self.Prism}();"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism);
  279. Prism.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:/@[\w-]+?.*?(?:;|(?=\s*\{))/i,inside:{rule:/@[\w-]+/}},url:/url\((?:(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1|.*?)\)/i,selector:/[^{}\s][^{};]*?(?=\s*\{)/,string:{pattern:/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},property:/[-_a-z\xA0-\uFFFF][-\w\xA0-\uFFFF]*(?=\s*:)/i,important:/\B!important\b/i,"function":/[-a-z0-9]+(?=\()/i,punctuation:/[(){};:]/},Prism.languages.css.atrule.inside.rest=Prism.util.clone(Prism.languages.css),Prism.languages.markup&&(Prism.languages.insertBefore("markup","tag",{style:{pattern:/(<style[\s\S]*?>)[\s\S]*?(?=<\/style>)/i,lookbehind:!0,inside:Prism.languages.css,alias:"language-css",greedy:!0}}),Prism.languages.insertBefore("inside","attr-value",{"style-attr":{pattern:/\s*style=("|')(?:\\[\s\S]|(?!\1)[^\\])*\1/i,inside:{"attr-name":{pattern:/^\s*style/i,inside:Prism.languages.markup.tag.inside},punctuation:/^\s*=\s*['"]|['"]\s*$/,"attr-value":{pattern:/.+/i,inside:Prism.languages.css}},alias:"language-css"}},Prism.languages.markup.tag));
  280. }
  281. function saveButton(evt) {
  282. let a = $(evt.target).parent(),
  283. b,c;
  284. b = `<span data-pattern="${a.children().first().val()}">${a.children().first().next().val()}</span>`;
  285. a.children().first().remove();
  286. a.children().first().replaceWith(b);
  287. a.find('button[name=editCSS]').one('click', editButton);
  288. a.find('button[name=saveCSS],code,pre').attr('style', 'display:none');
  289. c = {
  290. name:a.children().first().text(),
  291. enable: a.find('input[name=enable]').get(0).checked ? "1" : "0",
  292. default: a.find('input[name=default]').get(0).checked ? "1" : "0",
  293. css:a.find('code').text()
  294. }
  295. GMgetValue('csslist', JSON.stringify(defaultCSSlist))
  296. .then((ag)=>{
  297. csslist = JSON.parse(ag);
  298. csslist[a.children().first().data('pattern')] = c;
  299. GMsetValue('csslist', JSON.stringify(csslist));
  300. });
  301. }
  302.  
  303. function editButton(evt) {
  304. let a = $(evt.target).parent(),
  305. b;
  306. b = `<input type="text" name="pattern" value="${a.children().first().data('pattern')}">
  307. <input type="text" name="cssname" value="${a.children().first().text()}">`;
  308. a.find('button[name=saveCSS],code,pre').attr('style', 'display:inline-block;');
  309. a.find('button[name=saveCSS]').one('click', saveButton);
  310. a.children().first().replaceWith(b);
  311. }
  312.  
  313. function deleteButton(evt) {
  314. let a = $(evt.target).parent();
  315. GMgetValue('csslist',JSON.stringify(defaultCSSlist))
  316. .then((ag)=>{
  317. ag = JSON.parse(ag);
  318. delete ag[a.children().first().data('pattern')];
  319. GMsetValue('csslist', JSON.stringify(ag));
  320. a.remove();
  321. });
  322. }
  323.  
  324. function addButton(evt) {
  325. let t = new Date().getTime(),
  326. a = '',
  327. b;
  328. a = `<li>
  329. <input type="text" name="pattern" placeholder="match pattern">
  330. <input type="text" name="cssname" placeholder="name">
  331. <label for="csslist${t}chbx1">
  332. <input id="csslist${t}chbx1" type="checkbox" name="default" >默认CSS
  333. </label>
  334. <label for="csslist${t}chbx2">
  335. <input id="csslist${t}chbx2" type="checkbox" name="enable" >特定CSS
  336. </label>
  337. <button name="saveCSS" style="display:inline-block;">保存</button>
  338. <button name="editCSS">编辑CSS</button>
  339. <button name="deleteCSS">删除CSS</button>
  340. <button name="addCSS">新增</button>
  341. <br><pre><code id="csslist${t}" contenteditable="true" style="display:inline-block;" class="language-css"></code></pre>
  342. </li>`;
  343. b = $(a);
  344. $(evt.target).parent().after(b);
  345. $(b).children('button[name=editCSS]').on('click', editButton);
  346. $(b).children('button[name=deleteCSS]').on('click', deleteButton);
  347. $(b).children('button[name=addCSS]').on('click', addButton);
  348. $(b).children('button[name=saveCSS]').on('click', saveButton);
  349. }
  350. makeList();
  351. }
  352. //载入页面
  353. (() => {
  354. (typeof GM_registerMenuCommand === 'function') ? TMBlackList(): GMBlackList();
  355. setTimeout(() => {
  356. pageFirstLoad = false;
  357. }, 700);
  358. })();
  359.  
  360. })();