EhTagBuilder

Build EhTagTranslater from Wiki.

目前為 2016-06-18 提交的版本,檢視 最新版本

  1. // ==UserScript==
  2. // @name EhTagBuilder
  3. // @name:zh-CN E绅士标签构建者
  4. // @namespace http://www.mapaler.com/
  5. // @description Build EhTagTranslater from Wiki.
  6. // @description:zh-CN 从Wiki获取EhTagTranslater数据库,将E绅士TAG翻译为中文
  7. // @include *://github.com/Mapaler/EhTagTranslator*
  8. // @icon http://exhentai.org/favicon.ico
  9. // @version 2.5.2
  10. // @grant none
  11. // @copyright 2016+, Mapaler <mapaler@163.com>
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. var wiki_URL="https://github.com/Mapaler/EhTagTranslator/wiki"; //GitHub wiki 的地址
  16. var rows_title="rows"; //行名的地址
  17. var buttonInserPlace = document.getElementsByClassName("pagehead-actions")[0]; //按钮插入位置
  18. var windowInserPlace = document.getElementsByClassName("reponav")[0]; //窗口插入位置
  19. var scriptName = typeof(GM_info)!="undefined" ? (GM_info.script.localizedName ? GM_info.script.localizedName : GM_info.script.name) : "EhTagBuilder"; //本程序的名称
  20. var scriptVersion = typeof(GM_info)!="undefined" ? GM_info.script.version : "LocalDebug"; //本程序的版本
  21. var optionVersion = 1; //当前设置版本,用于提醒是否需要重置设置
  22. var wikiVersion = 2; //当前Wiki版本,用于提醒是否需要更新脚本
  23. var downOverCheckHook; //检测下载是否完成的循环函数
  24. var rowsCount = 0; //行名总数
  25. var rowsCurrent = 0; //当前下载行名
  26.  
  27.  
  28. //访GM_xmlhttpRequest函数v1.0
  29. if(typeof(GM_xmlhttpRequest) == "undefined")
  30. {
  31. var GM_xmlhttpRequest = function(GM_param){
  32. var xhr = new XMLHttpRequest(); //创建XMLHttpRequest对象
  33. if(GM_param.responseType) xhr.responseType = GM_param.responseType;
  34. xhr.onreadystatechange = function() //设置回调函数
  35. {
  36. if (xhr.readyState == 4 && xhr.status == 200)
  37. GM_param.onload(xhr);
  38. }
  39. for (var header in GM_param.headers){
  40. xhr.setRequestHeader(header, GM_param.headers[header]);
  41. }
  42. xhr.open(GM_param.method, GM_param.url, true);
  43. xhr.send(GM_param.data ? GM_param.data : null);
  44. }
  45. }
  46. //仿GM_getValue函数v1.0
  47. if(typeof(GM_getValue) == "undefined")
  48. {
  49. var GM_getValue = function(name, type){
  50. var value = localStorage.getItem(name);
  51. if (value == undefined) return value;
  52. if ((/^(?:true|false)$/i.test(value) && type == undefined) || type == "boolean")
  53. {
  54. if (/^true$/i.test(value))
  55. return true;
  56. else if (/^false$/i.test(value))
  57. return false;
  58. else
  59. return Boolean(value);
  60. }
  61. else if((/^\-?[\d\.]+$/i.test(value) && type == undefined) || type == "number")
  62. return Number(value);
  63. else
  64. return value;
  65. }
  66. }
  67. //仿GM_setValue函数v1.0
  68. if(typeof(GM_setValue) == "undefined")
  69. {
  70. var GM_setValue = function(name, value){
  71. localStorage.setItem(name, value);
  72. }
  73. }
  74. //仿GM_deleteValue函数v1.0
  75. if(typeof(GM_deleteValue) == "undefined")
  76. {
  77. var GM_deleteValue = function(name){
  78. localStorage.removeItem(name);
  79. }
  80. }
  81. //仿GM_listValues函数v1.0
  82. if(typeof(GM_listValues) == "undefined")
  83. {
  84. var GM_listValues = function(){
  85. var keys = [];
  86. for (var ki=0, kilen=localStorage.length; ki<kilen; ki++)
  87. {
  88. keys.push(localStorage.key(ki));
  89. }
  90. return keys;
  91. }
  92. }
  93.  
  94.  
  95. var ds = [];
  96. var rowObj = function(){
  97. var obj = {
  98. name:"",
  99. cname:"",
  100. info:"",
  101. tags:[],
  102. addTagFromName: function(rowObj)
  103. {
  104. if (rowObj == undefined) rowObj = this;
  105. GM_xmlhttpRequest({
  106. method: "GET",
  107. url: wiki_URL + (rowObj.name.length?"/"+rowObj.name:""),
  108. onload: function(response) {
  109. var page_get_w = document.getElementById("ETB_page-get");
  110. if (page_get_w)
  111. {
  112. var statetxt = page_get_w.getElementsByClassName("page-get-" + rowObj.name)[0];
  113. statetxt.classList.add("page-load");
  114. statetxt.innerHTML = "获取成功";
  115. }
  116. console.debug("正在处理 %s %s 页面",rowObj.name,rowObj.cname);
  117. dealTags(response.responseText,rowObj.tags);
  118. }
  119. });
  120. },
  121. }
  122. return obj;
  123. }
  124. var tagObj = function(){
  125. var obj = {
  126. type:0,
  127. name:"",
  128. cname:"",
  129. info:"",
  130. }
  131. return obj;
  132. }
  133.  
  134.  
  135. //处理行的页面
  136. function dealRows(response, dataset)
  137. {
  138. var parser = new DOMParser();
  139. PageDOM = parser.parseFromString(response, "text/html");
  140. var page_get_w = document.getElementById("ETB_page-get");
  141. if (page_get_w)
  142. {
  143. var statetxt = page_get_w.getElementsByClassName("page-get-rows")[0];
  144. statetxt.classList.add("page-load");
  145. statetxt.innerHTML = "获取成功";
  146. }
  147. var wiki_body = PageDOM.getElementById("wiki-body").getElementsByTagName("div")[0];
  148. var linksn = wiki_body.getElementsByTagName("a");
  149. for (var ai=0, ailen=linksn.length; ai<ailen; ai++)
  150. {
  151. if (linksn[ai].getAttribute("href") == "ETB_wiki-version")
  152. {
  153. var new_wiki_version = Number(linksn[ai].textContent.replace(/\D/ig,""));
  154. if (new_wiki_version > wikiVersion)
  155. {
  156. alert("Wiki数据库结构已更新,你的 " + scriptName + " 版本可能已经不适用新的数据库,请更新你的脚本。");
  157. }
  158. break;
  159. }
  160. }
  161. var table = wiki_body.getElementsByTagName("table")[0].tBodies[0];
  162. rowsCount = table.rows.length;
  163. for(var ri=0, rilen=table.rows.length; ri<rilen; ri++)
  164. {
  165. var trow = table.rows[ri];
  166. var row = new rowObj;
  167. row.name = trow.cells[0].textContent;
  168. row.cname = trow.cells[1].textContent;
  169. row.info = trow.cells[2];
  170. row.addTagFromName();
  171. dataset.push(row);
  172. if (page_get_w)
  173. {
  174. page_get_w.getElementsByClassName("select-menu-list")[0].appendChild(
  175. buildMenuItem((function()
  176. {
  177. var div = document.createElement("div");
  178. var span1 = document.createElement("span");
  179. span1.className = "page-title";
  180. span1.innerHTML = row.cname ;
  181. div.appendChild(span1);
  182. var span2 = document.createElement("span");
  183. span2.className = "page-get-" + row.name;
  184. span2.innerHTML = "等待";
  185. div.appendChild(span2);
  186. return div;
  187. })()
  188. )
  189. );
  190. }
  191. }
  192. }
  193.  
  194. //获取介绍是图片还是文字
  195. function getInfoString(dom, creatImage)
  196. {
  197. if (creatImage == undefined) creatImage = true;
  198. var info = [];
  199. if (dom.childNodes != undefined)
  200. {
  201. for (var ci=0, cilen=dom.childNodes.length; ci<cilen; ci++)
  202. {
  203. var node = dom.childNodes[ci];
  204. info = info.concat(getDomInfoString(node, creatImage))
  205. }
  206. }
  207. function getDomInfoString(node,creatImage)
  208. {
  209. var info = [];
  210. switch (node.nodeName) {
  211. case "BR":
  212. info.push(
  213. "\""
  214. ,"\\A"
  215. ,"\""
  216. );
  217. break;
  218. case "IMG":
  219. if (creatImage)
  220. {
  221. var osrc = node.getAttribute("data-canonical-src");
  222. if (osrc)
  223. {
  224. if (osrc.indexOf("?")>0) //动态链接
  225. {
  226. var osrct = osrc.substring(0,osrc.indexOf("?")); //获取
  227. if(osrct.substr(osrct.length-1,1)=="h")
  228. {
  229. osrc = osrc.substring(0,osrc.indexOf("?")-1) + osrc.substring(osrc.indexOf("?"));
  230. }
  231. }else //静态链接
  232. {
  233. if(osrc.substr(osrc.length-1,1)=="h")
  234. {
  235. osrc = osrc.substring(0,osrc.length-1);
  236. }
  237. }
  238. info.push(
  239. "url(\""
  240. ,osrc
  241. ,"\")"
  242. );
  243. }else if(node.title) //链接写在title
  244. {
  245. info.push(
  246. "url(\""
  247. ,node.title
  248. ,"\")"
  249. );
  250. }
  251. }
  252. break;
  253. case "#text":
  254. default:
  255. if ((ci==0 || ci==(dom.childNodes.length-1) || dom.childNodes.length < 2) && node.textContent == "\n")
  256. break;
  257. info.push(
  258. "\""
  259. ,specialCharToCss(node.textContent)
  260. ,"\""
  261. );
  262. break;
  263. }
  264. return info;
  265. }
  266. return info.join("");
  267. }
  268.  
  269. //生成按钮
  270. function specialCharToCss(str)
  271. {
  272. var strn = str;
  273. strn = strn.replace("\\","\\\\");
  274. strn = strn.replace("\"","\\\"");
  275. strn = strn.replace("\r","");
  276. strn = strn.replace("\n","\\A");
  277. return strn;
  278. }
  279.  
  280. //处理Tag页面
  281. function dealTags(response, dataset)
  282. {
  283. var parser = new DOMParser();
  284. PageDOM = parser.parseFromString(response, "text/html");
  285. var wiki_body = PageDOM.getElementById("wiki-body").getElementsByTagName("div")[0];
  286. var table = wiki_body.getElementsByTagName("table")[0].tBodies[0];
  287. for(var ri=0, rilen=table.rows.length; ri<rilen; ri++)
  288. {
  289. var trow = table.rows[ri];
  290. var tag = new tagObj;
  291. if (trow.cells.length > 2)
  292. {//没有足够单元格的跳过
  293. tag.name = trow.cells[0].textContent;
  294. tag.cname = trow.cells[1];
  295. tag.info = trow.cells[2];
  296. tag.type = tag.name.replace(/\s/ig,"").length < 1 ? 1 : 0;
  297. if (tag.type == 1 && getInfoString(tag.cname,true).replace(/\s/ig,"").length < 1)
  298. {
  299. console.error("发现无中文名的错误行%d %s",ri,tag.name);
  300. }
  301. dataset.push(tag);
  302. }
  303. else
  304. {
  305. console.error("发现无3单元格的错误行%d %s",ri,tag.name);
  306. }
  307. }
  308. rowsCurrent++;
  309. }
  310.  
  311. //点击开始任务按钮
  312. function startProgram(dataset, mode){
  313. var downOver = startProgramCheck(dataset, mode);
  314. if (!downOver || downOverCheckHook == undefined)
  315. {
  316. GM_xmlhttpRequest({
  317. method: "GET",
  318. url: wiki_URL + (rows_title.length?"/"+rows_title:""),
  319. onload: function(response) {
  320. dealRows(response.responseText,dataset);
  321. }
  322. });
  323. downOverCheckHook = setInterval(function () { startProgramCheck(dataset, mode) }, 200);
  324. }
  325. if (!downOver)
  326. {
  327. buildDownloadProgress();
  328. }
  329. }
  330.  
  331. //创建下载进度窗口
  332. function buildDownloadProgress()
  333. {
  334. var page_get_w = document.getElementById("ETB_page-get");
  335. if (!page_get_w)
  336. {
  337. windowInserPlace.appendChild(buildMenuModal("window", "ETB_page-get", "数据获取进度", null, [
  338. buildMenuList([
  339. buildMenuItem((function()
  340. {
  341. var div = document.createElement("div");
  342. var span1 = document.createElement("span");
  343. span1.className = "page-title";
  344. span1.innerHTML = "列表页面";
  345. div.appendChild(span1);
  346. var span2 = document.createElement("span");
  347. span2.className = "page-get-rows";
  348. span2.innerHTML = "等待";
  349. div.appendChild(span2);
  350. return div;
  351. })()
  352. )
  353. ])
  354. ],
  355. [
  356. ".ETB_page-get .page-title" + "{\r\n" + [
  357. 'font-weight: bold',
  358. 'margin-right: 15px',
  359. ].join(';\r\n') + "\r\n}",
  360. ".ETB_page-get .page-load" + "{\r\n" + [
  361. 'color: #0A0',
  362. ].join(';\r\n') + "\r\n}",
  363. ].join('\r\n')
  364. ));
  365. }
  366. else
  367. {
  368. page_get_w.style.display = "block";
  369. }
  370. }
  371.  
  372. //检测下载完成情况
  373. function startProgramCheck(dataset, mode)
  374. {
  375. if (rowsCount > 0 && rowsCurrent >= rowsCount)
  376. {
  377. console.debug("获取完成");
  378. clearInterval(downOverCheckHook);
  379. switch (mode) {
  380. case 1:
  381. buildJSOutput(dataset);
  382. break;
  383. case 0:
  384. default:
  385. buildCSSOutput(dataset);
  386. break;
  387. }
  388. var page_get_w = document.getElementById("ETB_page-get");
  389. if (page_get_w)
  390. {
  391. page_get_w.parentNode.removeChild(page_get_w);
  392. }
  393. return true;
  394. }
  395. else
  396. {
  397. console.debug("获取%d/%d",rowsCurrent, rowsCount);
  398. return false;
  399. }
  400. }
  401.  
  402. //获取完成后创建CSS输出窗口
  403. function buildCSSOutput(dataset)
  404. {
  405. var css = createOutputCSS(dataset
  406. ,GM_getValue("ETB_create-info","boolean")
  407. ,GM_getValue("ETB_create-info-image","boolean")
  408. ,GM_getValue("ETB_create-cname-image","boolean")
  409. );
  410. var downBlob = new Blob([css], {'type': 'text\/css'});
  411. var downurl = window.URL.createObjectURL(downBlob);
  412. var css_output_w = document.getElementById("ETB_css-output");
  413. if (!css_output_w)
  414. {
  415. windowInserPlace.appendChild(buildMenuModal("window", "ETB_css-output", "用户样式版EhTagTranslator", null,
  416. [
  417. buildMenuList([
  418. buildMenuItem("CSS文本",
  419. (function()
  420. {
  421. var textarea = document.createElement("textarea");
  422. textarea.id = "ETB_css-textarea";
  423. textarea.name = textarea.id;
  424. textarea.className = "txta " + textarea.id;
  425. textarea.value = css;
  426. textarea.wrap = "off";
  427. textarea.setAttribute("readonly",true);
  428. return textarea;
  429. })()
  430. ,buildSVG("css")),
  431. buildMenuItem("直接下载CSS文件",null,buildSVG("download"),downurl,1)
  432. ])
  433. ],
  434. [
  435. ".ETB_css-output .txta" + "{\r\n" + [
  436. 'resize: vertical',
  437. 'width:100%',
  438. 'height:300px',
  439. ].join(';\r\n') + "\r\n}",
  440. ].join('\r\n')
  441. ));
  442. }
  443. else
  444. {
  445. css_output_w.style.display = "block";
  446. css_output_w.getElementsByClassName("ETB_css-textarea")[0].value = css;
  447. css_output_w.getElementsByTagName("a")[0].href = downurl;
  448. }
  449. }
  450.  
  451. //开始构建CSS
  452. function createOutputCSS(dataset, createInfo, createInfoImage, createCnameImage)
  453. {
  454. if (createInfo == undefined) createInfo = true;
  455. if (createInfoImage == undefined) createInfoImage = true;
  456. if (createCnameImage == undefined) createCnameImage = true;
  457. var date = new Date();
  458. var cssAry = [];
  459. //样式信息说明
  460. cssAry.push(
  461. "/* EhTagTranslator 用户样式版,由 " + scriptName + " v" + scriptVersion + " 构建"
  462. ," * 构建时间为"
  463. ," * " + date.toString()
  464. ," */"
  465. )
  466. //样式命名区间
  467. cssAry.push(
  468. //▼CSS内容部分
  469. "@namespace url(http://www.w3.org/1999/xhtml);"
  470. //▲CSS内容部分
  471. );
  472.  
  473. //表里通用样式
  474. cssAry.push(""
  475. //▼CSS内容部分
  476. ,"/* 表里通用样式 */"
  477. ,"@-moz-document"
  478. ," url-prefix('http://exhentai.org/g/'),"
  479. ," url-prefix('http://g.e-hentai.org/g/')"
  480. ,"{"
  481. ,GM_getValue("ETB_global-style")
  482. ,"}"
  483. //▲CSS内容部分
  484. );
  485.  
  486. //表站样式
  487. cssAry.push(""
  488. //▼CSS内容部分
  489. ,"/* 表站样式 */"
  490. ,"@-moz-document"
  491. ," url-prefix('http://g.e-hentai.org/g/')"
  492. ,"{"
  493. ,GM_getValue("ETB_global-style-eh")
  494. ,"}"
  495. //▲CSS内容部分
  496. );
  497.  
  498. //里站样式
  499. cssAry.push(""
  500. //▼CSS内容部分
  501. ,"/* 里站样式 */"
  502. ,"@-moz-document"
  503. ," url-prefix('http://exhentai.org/g/')"
  504. ,"{"
  505. ,GM_getValue("ETB_global-style-ex")
  506. ,"}"
  507. //▲CSS内容部分
  508. );
  509.  
  510. //翻译内容
  511. cssAry.push(""
  512. //▼CSS内容部分
  513. ,"/* 翻译内容 */"
  514. ,"@-moz-document"
  515. ," url-prefix('http://exhentai.org/g/'),"
  516. ," url-prefix('http://g.e-hentai.org/g/')"
  517. ,"{"
  518. //▲CSS内容部分
  519. );
  520.  
  521. dataset.forEach(function(row){
  522.  
  523. //添加行名的注释
  524. cssAry.push(""
  525. ,"/* " + row.name
  526. ," * " + row.cname
  527. ," */"
  528. );
  529.  
  530. row.tags.forEach(function(tag){
  531.  
  532. if (tag.type == 0)
  533. {
  534. var tagid = (row.name=="misc"?"":row.name + ":") + tag.name.replace(/\s/ig,"_");
  535. cssAry.push(""
  536. //▼CSS内容部分
  537. ," a[id=\"ta_" + tagid + "\"]{"
  538. ," font-size:0px;"
  539. ," }"
  540. ," a[id=\"ta_" + tagid + "\"]::before{"
  541. ," content:" + getInfoString(tag.cname, createCnameImage) + ";"
  542. ," }"
  543. //▲CSS内容部分
  544. );
  545. if (createInfo)
  546. {
  547. var sinfo = getInfoString(tag.info, createInfoImage);
  548. if (sinfo.replace(/\s/ig,"").length > 0)
  549. {
  550. cssAry.push(""
  551. //▼CSS内容部分
  552. ," a[id=\"ta_" + tagid + "\"]::after{"
  553. ," content:" + sinfo + ";"
  554. ," }"
  555. //▲CSS内容部分
  556. );
  557. }
  558. }
  559. }
  560. else
  561. { //将注释写成CSS注释
  562. cssAry.push(
  563. "/* " + getInfoString(tag.cname, false)
  564. ," * " + getInfoString(tag.info, false)
  565. ," */"
  566. );
  567. }
  568. })//row.tags.forEach
  569. });//dataset.forEach
  570.  
  571. cssAry.push(
  572. //▼CSS内容部分
  573. "}"
  574. //▲CSS内容部分
  575. );
  576. var css = cssAry.join("\r\n");
  577. return css;
  578. }
  579.  
  580. //获取完成后创建JS输出窗口
  581. function buildJSOutput(dataset)
  582. {
  583. var json = createOutputJSON(dataset
  584. ,GM_getValue("ETB_create-info","boolean")
  585. ,GM_getValue("ETB_create-info-image","boolean")
  586. ,GM_getValue("ETB_create-cname-image","boolean")
  587. );
  588. var downBlob = new Blob([json], {'type': 'text\/json'});
  589. var downurl = window.URL.createObjectURL(downBlob);
  590. var js_output_w = document.getElementById("ETB_js-output");
  591. if (!js_output_w)
  592. {
  593. windowInserPlace.appendChild(buildMenuModal("window", "ETB_js-output", "用户脚本版EhTagTranslator数据库", null,
  594. [
  595. buildMenuList([
  596. buildMenuItem("JSON文本",
  597. (function()
  598. {
  599. var textarea = document.createElement("textarea");
  600. textarea.id = "ETB_js-textarea";
  601. textarea.name = textarea.id;
  602. textarea.className = "txta " + textarea.id;
  603. textarea.value = json;
  604. textarea.setAttribute("readonly",true);
  605. return textarea;
  606. })()
  607. ,buildSVG("json")),
  608. buildMenuItem("直接下载JSON文件",null,buildSVG("download"),downurl,1)
  609. ])
  610. ],
  611. [
  612. ".ETB_js-output .txta" + "{\r\n" + [
  613. 'resize: vertical',
  614. 'width:100%',
  615. 'height:300px',
  616. ].join(';\r\n') + "\r\n}",
  617. ].join('\r\n')
  618. ));
  619. }
  620. else
  621. {
  622. js_output_w.style.display = "block";
  623. js_output_w.getElementsByClassName("ETB_js-textarea")[0].value = json;
  624. js_output_w.getElementsByTagName("a")[0].href = downurl;
  625. }
  626. }
  627.  
  628. //开始构建JSON
  629. function createOutputJSON(dataset, createInfo, createInfoImage, createCnameImage)
  630. {
  631. if (createInfo == undefined) createInfo = true;
  632. if (createInfoImage == undefined) createInfoImage = true;
  633. if (createCnameImage == undefined) createCnameImage = true;
  634. function doForAllTag(dom, tag, callback)
  635. {
  636. var tagDoms = dom.getElementsByTagName(tag);
  637. for (var di=0, dilen=tagDoms.length; di<dilen; di++)
  638. {
  639. callback(tagDoms[di]);
  640. }
  641. }
  642. function removeSelf(dom)
  643. {
  644. dom.parentNode.removeChild(dom);
  645. }
  646. function resetImageSrc(dom)
  647. {
  648. var osrc = dom.getAttribute("data-canonical-src");
  649. if (osrc)
  650. {
  651. if (osrc.indexOf("?")>0) //动态链接
  652. {
  653. var osrct = osrc.substring(0,osrc.indexOf("?")); //获取
  654. if(osrct.substr(osrct.length-1,1)=="h")
  655. {
  656. osrc = osrc.substring(0,osrc.indexOf("?")-1) + osrc.substring(osrc.indexOf("?"));
  657. }
  658. }else //静态链接
  659. {
  660. if(osrc.substr(osrc.length-1,1)=="h")
  661. {
  662. osrc = osrc.substring(0,osrc.length-1);
  663. }
  664. }
  665. dom.src=osrc;
  666. dom.removeAttribute("data-canonical-src");
  667. }else if(dom.title) //链接写在title
  668. {
  669. dom.src=dom.title;
  670. dom.removeAttribute("title");
  671. }
  672. }
  673. var outArray = //重新生成处理过的数组
  674. dataset.map(function(row_orignal){
  675. var row=new rowObj;
  676. row.name=row_orignal.name;
  677. row.cname=row_orignal.cname;
  678. row.info=row_orignal.info.cloneNode(true);
  679. if (createInfo)
  680. {
  681.  
  682. doForAllTag(row.info, "img", createInfoImage ? resetImageSrc : removeSelf);
  683. row.info = row.info.innerHTML.replace(/(?:^\n|\n$)/igm,"");
  684. }
  685. else
  686. {
  687. row.info = "";
  688. }
  689. row.tags = //重新生成处理过的Tag
  690. row_orignal.tags.map(function(tag_orignal){
  691. var tag=new tagObj;
  692. tag.type=tag_orignal.type;
  693. tag.name=tag_orignal.name;
  694. tag.cname=tag_orignal.cname.cloneNode(true);
  695. tag.info=tag_orignal.info.cloneNode(true);
  696.  
  697. doForAllTag(tag.cname, "img", createCnameImage ? resetImageSrc : removeSelf);
  698. tag.cname = tag.cname.innerHTML.replace(/(?:^\n|\n$)/igm,"");
  699.  
  700. if (createInfo || tag.type==1)
  701. {
  702. doForAllTag(tag.info, "img", createInfoImage ? resetImageSrc : removeSelf);
  703. tag.info = tag.info.innerHTML.replace(/(?:^\n|\n$)/igm,"");
  704. }
  705. else
  706. {
  707. tag.info = "";
  708. }
  709. return tag;
  710. })//row.tags.forEach
  711. return row;
  712. });//dataset.forEach
  713.  
  714. var date = new Date();
  715. var outJson =
  716. {
  717. "scriptName":scriptName,
  718. "scriptVersion":scriptVersion,
  719. "date":date.getTime(),
  720. "dataset":outArray
  721. }
  722. return JSON.stringify(outJson);
  723. }
  724.  
  725. //生成按钮
  726. function buildButton(title, icon, modal)
  727. {
  728. var li = document.createElement("li");
  729. var select_menu = document.createElement("div");
  730. select_menu.className = "select-menu js-menu-container js-select-menu";
  731. li.appendChild(select_menu);
  732. var button = document.createElement("button");
  733. button.className = "btn btn-sm select-menu-button js-menu-target css-truncate";
  734. select_menu.appendChild(button);
  735. var span = document.createElement("span");
  736. span.className = "js-select-button";
  737. if (icon != undefined)
  738. span.appendChild(icon);
  739. span.innerHTML += title;
  740. button.appendChild(span);
  741. select_menu.appendChild(modal);
  742. return li;
  743. }
  744.  
  745. //生成菜单窗口
  746. function buildMenuModal(mode, id, stitle, filters, lists, sstyle)
  747. {
  748. var modal_holder = document.createElement("div");
  749. modal_holder.className = "select-menu-modal-holder js-menu-content js-navigation-container js-active-navigation-container";
  750. if (id != undefined)
  751. {
  752. modal_holder.id = id;
  753. modal_holder.classList.add(id);
  754. }
  755. if (sstyle != undefined)
  756. {
  757. var style = document.createElement("style");
  758. style.innerHTML = sstyle;
  759. modal_holder.appendChild(style);
  760. }
  761.  
  762. var modal = document.createElement("div");
  763. modal.className = "select-menu-modal subscription-menu-modal js-menu-content";
  764. modal_holder.appendChild(modal);
  765. var header = document.createElement("div");
  766. header.className = "select-menu-header js-navigation-enable";
  767. modal.appendChild(header);
  768. var CloseSvg = buildSVG("Close");
  769. header.appendChild(CloseSvg);
  770.  
  771. switch (mode) {
  772. case "window":
  773. modal_holder.style.display = "block";
  774. CloseSvg.onclick = function(){
  775. modal_holder.style.display = "none";
  776. }
  777. break;
  778.  
  779. case "menu":
  780. default:
  781. break;
  782. }
  783. var title = document.createElement("span");
  784. title.className = "select-menu-title";
  785. title.innerHTML = stitle;
  786. header.appendChild(title);
  787.  
  788. if (lists != undefined)
  789. {
  790. for(var li = 0, lilen=lists.length; li<lilen; li++)
  791. {
  792. var list = lists[li];
  793. if (list)
  794. modal.appendChild(list);
  795. }
  796. }
  797. return modal_holder;
  798. }
  799.  
  800. //构建一个菜单列表框架
  801. function buildMenuList(items)
  802. {
  803. var list = document.createElement("div");
  804. list.className = "select-menu-list js-navigation-container";
  805. if (items != undefined)
  806. {
  807. for(var ii=0, lilen=items.length; ii<lilen; ii++)
  808. {
  809. var item = items[ii];
  810. if (item)
  811. list.appendChild(item);
  812. }
  813. }
  814. return list;
  815. }
  816.  
  817. //构建一个菜单列表项
  818. function buildMenuItem(heading, description, icon, callback, type)
  819. {
  820. if (heading == undefined) heading = "未设定";
  821. var item = document.createElement("div");
  822. if (type == 3)
  823. {
  824. var item = document.createElement("label");
  825. item.setAttribute('for', callback);
  826. }
  827. else if (typeof(callback) == "string")
  828. {
  829. var item = document.createElement("a");
  830. item.target = "_blank";
  831. item.href = callback;
  832. }
  833. else
  834. {
  835. if (callback) item.onclick = callback;
  836. }
  837. item.className = "select-menu-item";
  838. switch (type) {
  839. case 0:
  840. item.classList.add("js-navigation-item");
  841. break;
  842. case 1:
  843. item.classList.add("select-menu-action");
  844. break;
  845. default:
  846. break;
  847. }
  848. if (icon != undefined) item.appendChild(icon);
  849. var item_text = document.createElement("div");
  850. item_text.className = "select-menu-item-text";
  851. item.appendChild(item_text);
  852. if (description != undefined)
  853. {
  854. var item_heading = document.createElement("span");
  855. item_heading.className = "select-menu-item-heading";
  856. if (typeof(heading)=="string")
  857. item_heading.innerHTML = heading;
  858. else
  859. item_heading.appendChild(heading);
  860. var item_description = document.createElement("span");
  861. item_description.className = "description";
  862. if (typeof(description)=="string")
  863. item_description.innerHTML = description;
  864. else
  865. item_description.appendChild(description);
  866. item_text.appendChild(item_heading);
  867. item_text.appendChild(item_description);
  868. }
  869. else
  870. {
  871. if (typeof(heading)=="string")
  872. item_text.innerHTML = heading;
  873. else
  874. item_text.appendChild(heading);
  875. }
  876. return item;
  877. }
  878. //生成svg
  879. function buildSVG(mode,check)
  880. {
  881. if (check == undefined) check = false;
  882. var CloseSvgDiv = document.createElement("div");
  883. var innerHTML = "";
  884. switch (mode) {
  885. case "Close":
  886. innerHTML = '<svg aria-label="Close" class="octicon octicon-x js-menu-close" height="16" role="img" version="1.1" viewBox="0 0 12 16" width="12"><path d="M7.48 8l3.75 3.75-1.48 1.48-3.75-3.75-3.75 3.75-1.48-1.48 3.75-3.75L0.77 4.25l1.48-1.48 3.75 3.75 3.75-3.75 1.48 1.48-3.75 3.75z"/></svg>';
  887. break;
  888.  
  889. case "Settings":
  890. innerHTML = '<svg width="14" viewBox="0 0 14 16" version="1.1" height="16" class="octicon octicon-question select-menu-item-icon" aria-hidden="true"><path d="M14 8.77V7.17l-1.94-0.64-0.45-1.09 0.88-1.84-1.13-1.13-1.81 0.91-1.09-0.45-0.69-1.92H6.17l-0.63 1.94-1.11 0.45-1.84-0.88-1.13 1.13 0.91 1.81-0.45 1.09L0 7.23v1.59l1.94 0.64 0.45 1.09-0.88 1.84 1.13 1.13 1.81-0.91 1.09 0.45 0.69 1.92h1.59l0.63-1.94 1.11-0.45 1.84 0.88 1.13-1.13-0.92-1.81 0.47-1.09 1.92-0.69zM7 11c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3z"/></svg>';
  891. break;
  892.  
  893. case "check":
  894. innerHTML = '<svg width="12" viewBox="0 0 12 16" version="1.1" height="16" class="octicon octicon-check select-menu-item-icon" aria-hidden="true"><path d="M12 5L4 13 0 9l1.5-1.5 2.5 2.5 6.5-6.5 1.5 1.5z"/></svg>';
  895. break;
  896.  
  897. case "question":
  898. innerHTML = '<svg width="14" viewBox="0 0 14 16" version="1.1" height="16" class="octicon octicon-question select-menu-item-icon" aria-hidden="true"><path d="M6 10h2v2H6V10z m4-3.5c0 2.14-2 2.5-2 2.5H6c0-0.55 0.45-1 1-1h0.5c0.28 0 0.5-0.22 0.5-0.5v-1c0-0.28-0.22-0.5-0.5-0.5h-1c-0.28 0-0.5 0.22-0.5 0.5v0.5H4c0-1.5 1.5-3 3-3s3 1 3 2.5zM7 2.3c3.14 0 5.7 2.56 5.7 5.7S10.14 13.7 7 13.7 1.3 11.14 1.3 8s2.56-5.7 5.7-5.7m0-1.3C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7S10.86 1 7 1z"/></svg>';
  899. break;
  900.  
  901. case "download":
  902. innerHTML = '<svg width="16" viewBox="0 0 16 16" version="1.1" height="16" class="octicon octicon-desktop-download select-menu-item-icon" aria-hidden="true"><path d="M4 6h3V0h2v6h3L8 10 4 6z m11-4H11v1h4v8H1V3h4v-1H1c-0.55 0-1 0.45-1 1v9c0 0.55 0.45 1 1 1h5.34c-0.25 0.61-0.86 1.39-2.34 2h8c-1.48-0.61-2.09-1.39-2.34-2h5.34c0.55 0 1-0.45 1-1V3c0-0.55-0.45-1-1-1z"/></svg>';
  903. break;
  904.  
  905. case "book":
  906. innerHTML = '<svg width="16" viewBox="0 0 16 16" version="1.1" height="16" class="octicon octicon-book select-menu-item-icon" aria-hidden="true"><path d="M2 5h4v1H2v-1z m0 3h4v-1H2v1z m0 2h4v-1H2v1z m11-5H9v1h4v-1z m0 2H9v1h4v-1z m0 2H9v1h4v-1z m2-6v9c0 0.55-0.45 1-1 1H8.5l-1 1-1-1H1c-0.55 0-1-0.45-1-1V3c0-0.55 0.45-1 1-1h5.5l1 1 1-1h5.5c0.55 0 1 0.45 1 1z m-8 0.5l-0.5-0.5H1v9h6V3.5z m7-0.5H8.5l-0.5 0.5v8.5h6V3z"/></svg>';
  907. break;
  908. case "code":
  909. innerHTML = '<svg width="14" viewBox="0 0 14 16" version="1.1" height="16" class="octicon octicon-code select-menu-item-icon" aria-hidden="true"><path d="M9.5 3l-1.5 1.5 3.5 3.5L8 11.5l1.5 1.5 4.5-5L9.5 3zM4.5 3L0 8l4.5 5 1.5-1.5L2.5 8l3.5-3.5L4.5 3z"/></svg>'
  910. break;
  911. case "css":
  912. innerHTML = '<img width="14" height="16" class="octicon octicon-question select-menu-item-icon" aria-hidden="true" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAIAAACp9tltAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAsSAAALEgHS3X78AAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAApZJREFUKJFNwX1MzHEcB/D35/v9/s7lXKqj0p0T1vXg2lIeh+thjZE/1Iw/8mwyjBn+sdmwGWZmy6LokllGm5mHYVYbmzIydTJlMtGTqJau7n6p3+/79a/XiywWEe2wEgAQEWcQRDwc1tnfyamcgTHFCMR+j4aEOzGm7N5GIjASds0pjPi+Tr36Rq3R9GlfkitxtpM7ZrKYGRuu1wjOeWx0PAgktUe1ra1vGzxJ3syFeWNJS662tOBd+/7l1oy4WYxIMGjTLE5j0rx07vHmokMnjuQxxgAAUEr19/efOXwwQwGAYCTsFnfNnSerc4vz8/ODwWBlZWVHR0dUVFRhYWFKSgrnHFAABJFms7hf1H28euUwgMbXDc/qb7oS4t/cbWt7/nTKfI9dH4OSgBLBkdHqaw96un6GQiEAuTl5PT2HAi3Nka6xNDLS+fhMp0OCQYFbBIuQoxzGUHA8JydX07SszKyCgvWbtu+c7s2oqns53251x8XdbmpG6jznt/rSz88upnvcfr/fMAz1n97e3i25q7rLLnjdLqakmgyFf/0cXOhxl5cd8fm8B/aXVFSUDwwMAEhISHAlp2qaRgSmlDRC+vHS+2Fr/Bw3bpd/Obq7+n3jsW1bt0opAfSOjO4or+obHhFKKjk+YUr4/f5AIFBadWt48OP4ROSekhIi0nW9a/BPVvHBD5fPCgBSmoAyTdPn82VnZ5umSUSMMV3XT5467Vm5ZlHe2vv+UgEo4nzv+qWF6/Izl61MW+CNjY2TUra1t79qal5StCsnPT1SSCgIEOM224rF3tbuITkR8CZPdnUFHz78GuSpRcfOR0RY7EJZmVJQFDFFm+uMBTAcDDGNHA4bQQ0OhSdMiy3KwUgxIgb143vnP5/yHx0OlzuwAAAAAElFTkSuQmCC"/>';
  913. break;
  914.  
  915. case "js":
  916. innerHTML = '<img width="15" height="16" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAQCAMAAAD+iNU2AAAAA3NCSVQICAjb4U/gAAABKVBMVEX///9/QABAIAB/QAAAAAB/QAAAAABAIAAAAAB9PgBJJAB/QABAIAB/QABmMwB+PgB9PgBcLgB/QAB0OgB/QAB/QAB4PABlPhNJJABEIgB6Qgj/6bv/57j/5bH/5a//5K3/46n/4qb/4aX/4aP/353/4KD/35//3pn/3Zf/3JP/25H/24//2o330YX30IPgwIDgv37ft3XTt4PStYHXqmDPoVufqWafqGHHl1CfomKfomWfl3GflXCflWmflGuxhku3gz6sf0OveTSSfFSmdzuQe1KncCudbTKTbTufZiOTaDJAb0CPUxGYOSpnRS96QghjRS9/QACJOCqEOCpzOgBrNgBmMwBjMgBfMABlKh9cLgBfKh4QPBBTKgBPKABGJABAIAAAJgAAHQCEX9KOAAAAY3RSTlMAEREiIjMzRERVZnd3iIiqqqq7u8zd3d3d3e7///////////////////////////////////////////////////////////////////////////////////////////////89N3vSAAAACXBIWXMAAAsSAAALEgHS3X78AAAALHRFWHRDcmVhdGlvbiBUaW1lAFN1biAzMCBNYXIgMjAwOCAxNzoyMjo0NyAtMDUwMNSe+EoAAAAcdEVYdFNvZnR3YXJlAEFkb2JlIEZpcmV3b3JrcyBDUzbovLKMAAAA4ElEQVQImTWPaVsBYRhGnxEasiVjj8rwLl5vZafFkjCInpI21fD/fwTTxfl0zrf7BtjhODqO7R0OvNrbn+nZpxfxyzR/T6K2/wzhZPHxPp//HG7DFfD3pahgRci+P+CC+AAlp+SaUC5xEIdRy8jTWvOi2iDcaI1g2GszfbxMj5c52u4MIdKr0+xqnVytM6TeiYB7VqDZu9vEzX2GFGZuUCbisXSePk2dFR8EAigor56/X59ePqeXctsQ7ApOdV0nTHSD1hHNKOcZY7xsaA5rruILo0XYp+z+2J2qqjrtlm4AX+Ek7puqLocAAAAASUVORK5CYII="/>';
  917. break;
  918.  
  919. case "json":
  920. innerHTML = '<svg viewBox="0 0 16 16" height="15" width="16" version="1.1" class="octicon octicon-code select-menu-item-icon"><defs><style>.cls-1{fill:url(#linearGradient_1);}.cls-2{fill:url(#linearGradient_2);}</style><linearGradient gradientUnits="userSpaceOnUse" gradientTransform="matrix(1, 0, 0, -1, 688.46, -371.22)" y2="-385.5" x2="-675.75" y1="-374.22" x1="-687.04" id="linearGradient_1"><stop offset="0"/><stop stop-color="#fff" offset="1"/></linearGradient><linearGradient xlink:href="#linearGradient_1" y2="-373.71" x2="-686.52" y1="-384.99" x1="-675.24" id="linearGradient_2"/></defs><path style="fill:url(#linearGradient_1)" d="M8,11.91c3.54,4.83,7-1.35,7-5.06C15,2.46,10.53,0,8,0A8.07,8.07,0,0,0,0,8a8.06,8.06,0,0,0,8,8c-0.8-.11-3.45-0.68-3.49-6.8C4.47,5.07,5.85,3.42,8,4.14A4.06,4.06,0,0,1,10.33,8,4.08,4.08,0,0,1,8,11.91Z" class="cls-1"/><path style="fill:url(#linearGradient_2)" d="M8,4.14c-2.34-.81-5.2,1.12-5.2,5C2.78,15.43,7.45,16,8,16a8.07,8.07,0,0,0,8-8A8.06,8.06,0,0,0,8,0c1-.13,5.25,1.05,5.25,6.9,0,3.81-3.2,5.89-5.27,5A4.06,4.06,0,0,1,5.65,8,4.1,4.1,0,0,1,8,4.14Z" class="cls-2"/></svg>';
  921. break;
  922.  
  923. case "eh":
  924. innerHTML = '<img width="14" height="12" class="octicon" aria-hidden="true" src="data:image/gif;base64,R0lGODlhDgAMAIAAAGYGEf///yH5BAEHAAEALAAAAAAOAAwAAAIghB2JcZ0M1HlvOQrlorZF5HlZuFURVErayZ2kuU4qVAAAOw=="/>';
  925. break;
  926. default:
  927. innerHTML = '<svg width="12" viewBox="0 0 12 16" version="1.1" height="16" class="octicon octicon-check select-menu-item-icon" aria-hidden="true"></svg>';
  928. break;
  929. }
  930. CloseSvgDiv.innerHTML = innerHTML;
  931. var CloseSvg = CloseSvgDiv.firstChild;
  932. if(check)
  933. CloseSvg.classList.add("octicon-check");
  934. else
  935. CloseSvg.classList.remove("octicon-check");
  936. //更改SVG的渐变ID名
  937. function changeSvgIdName(svg)
  938. {
  939. var linearGradient = svg.getElementsByTagName("linearGradient");
  940. for (var lGi=0, lGilen=linearGradient.length;lGi<lGilen;lGi++)
  941. {
  942. var idName = linearGradient[lGi].id;
  943. var idIndex = 0;
  944. while(document.getElementById(idName + "_" + idIndex.toString()))
  945. {
  946. idIndex++;
  947. }
  948. linearGradient[lGi].id = idName + "_" + idIndex.toString();
  949. var idReg = new RegExp("#" + idName + "", "igm"); //P站图片地址正则匹配式
  950. svg.innerHTML = svg.innerHTML.replace(idReg,"#" + idName + "_" + idIndex.toString());
  951. }
  952. return svg;
  953. }
  954. CloseSvg = changeSvgIdName(CloseSvg);
  955.  
  956. return CloseSvg;
  957. }
  958. //打开设置窗口
  959. function startOption()
  960. {
  961. var option_modal_w = document.getElementById("ETB_option");
  962. if (!option_modal_w)
  963. {
  964. windowInserPlace.appendChild(
  965. buildMenuModal("window", "ETB_option", scriptName + " 设置", null, [
  966. buildMenuList([
  967. buildMenuItem("生成简介","生成光标移动到Tag上时出现的简介。",
  968. (function(){
  969. var chk = document.createElement("input");
  970. chk.type = "checkbox";
  971. chk.id = "ETB_create-info";
  972. chk.name = chk.id;
  973. chk.className = "octicon octicon-question select-menu-item-icon " + chk.id;
  974. return chk;
  975. })()
  976. ,"ETB_create-info",3),
  977. buildMenuItem("生成简介图片","生成简介中的图片。",
  978. (function(){
  979. var chk = document.createElement("input");
  980. chk.type = "checkbox";
  981. chk.id = "ETB_create-info-image";
  982. chk.name = chk.id;
  983. chk.className = "octicon octicon-question select-menu-item-icon " + chk.id;
  984. return chk;
  985. })()
  986. ,"ETB_create-info-image",3),
  987. buildMenuItem("生成中文名图片","生成中文名中的图片,一般为名称前的小图标。",
  988. (function(){
  989. var chk = document.createElement("input");
  990. chk.type = "checkbox";
  991. chk.id = "ETB_create-cname-image";
  992. chk.name = chk.id;
  993. chk.className = "octicon octicon-question select-menu-item-icon " + chk.id;
  994. return chk;
  995. })()
  996. ,"ETB_create-cname-image",3),
  997. buildMenuItem("Tag通用样式",
  998. (function(){
  999. var div = document.createElement("div");
  1000. var span1 = document.createElement("div");
  1001. span1.innerHTML = "Tag统一应用的样式,可修改为自己喜爱的样式。";
  1002. div.appendChild(span1);
  1003. //表里共用
  1004. var textarea = document.createElement("textarea");
  1005. textarea.id = "ETB_global-style";
  1006. textarea.name = textarea.id;
  1007. textarea.className = "txta " + textarea.id;
  1008. textarea.wrap = "off";
  1009. var label = document.createElement("label");
  1010. label.setAttribute('for', textarea.id);
  1011. label.innerHTML = "表里共用样式";
  1012. div.appendChild(label);
  1013. div.appendChild(textarea);
  1014. //表站
  1015. var textarea = document.createElement("textarea");
  1016. textarea.id = "ETB_global-style-eh";
  1017. textarea.name = textarea.id;
  1018. textarea.className = "txta " + textarea.id;
  1019. textarea.wrap = "off";
  1020. var label = document.createElement("label");
  1021. label.setAttribute('for', textarea.id);
  1022. label.innerHTML = "表站样式";
  1023. div.appendChild(label);
  1024. div.appendChild(textarea);
  1025. //里站
  1026. var textarea = document.createElement("textarea");
  1027. textarea.id = "ETB_global-style-ex";
  1028. textarea.name = textarea.id;
  1029. textarea.className = "txta " + textarea.id;
  1030. textarea.wrap = "off";
  1031. var label = document.createElement("label");
  1032. label.setAttribute('for', textarea.id);
  1033. label.innerHTML = "里站样式";
  1034. div.appendChild(label);
  1035. div.appendChild(textarea);
  1036. return div;
  1037. })()
  1038. ,buildSVG("css")),
  1039. ]),
  1040. buildMenuList([
  1041. buildMenuItem("其他用户分享的通用样式",null,buildSVG("code"),"https://github.com/Mapaler/EhTagTranslator/labels/%E6%A0%B7%E5%BC%8F%E5%88%86%E4%BA%AB",1),
  1042. buildMenuItem(
  1043. (function(){
  1044. var div = document.createElement("div");
  1045. var btn = document.createElement("button");
  1046. btn.innerHTML = "重置";
  1047. btn.id = "ETB_reset-option";
  1048. btn.name = btn.id;
  1049. btn.className = "btn btn-sm btn-danger " + btn.id;
  1050. btn.onclick = function(){
  1051. resetOption();
  1052. }
  1053. div.appendChild(btn);
  1054. /*
  1055. var btn2 = document.createElement("button");
  1056. btn2.innerHTML = "取消";
  1057. btn2.className = "btn btn-sm";
  1058. div.appendChild(btn2);
  1059. */
  1060. var btn = document.createElement("button");
  1061. btn.innerHTML = "保存";
  1062. btn.id = "ETB_save-option";
  1063. btn.name = btn.id;
  1064. btn.className = "btn btn-sm btn-primary " + btn.id;
  1065. btn.onclick = function(){
  1066. saveOption();
  1067. }
  1068. div.appendChild(btn);
  1069. return div;
  1070. })()
  1071. ,null,null,null,1),
  1072. ]),
  1073. ],
  1074. [
  1075. ".ETB_option .select-menu-item-text" + "{\r\n" + [
  1076. 'font-weight: normal',
  1077. ].join(';\r\n') + "\r\n}",
  1078. ".ETB_option .txta" + "{\r\n" + [
  1079. 'resize: vertical',
  1080. 'width: 100%',
  1081. 'height: 100px',
  1082. ].join(';\r\n') + "\r\n}",
  1083. ".ETB_option .ETB_save-option" + "{\r\n" + [
  1084. 'float: right',
  1085. ].join(';\r\n') + "\r\n}",
  1086. ].join('\r\n')
  1087. )
  1088. );
  1089. }
  1090. else
  1091. {
  1092. option_modal_w.style.display = "block";
  1093. }
  1094. }
  1095. //重置设置
  1096. function resetOption(part)
  1097. {
  1098. function partReset(name,value,ispart)
  1099. {
  1100. if (!ispart || ispart && GM_getValue(name) == undefined)
  1101. GM_setValue(name, value);
  1102. }
  1103. var cssAry = [];
  1104. var cssAry_eh = [];
  1105. var cssAry_ex = [];
  1106. cssAry.push(
  1107. //▼CSS内容部分
  1108. " #taglist a{"
  1109. ," background:inherit;"
  1110. ," border-color: inherit;"
  1111. ," }"
  1112. ," #taglist a::before{"
  1113. ," font-size:12px;"
  1114. ," }"
  1115. ," #taglist a::after{"
  1116. ," background: inherit;"
  1117. ," border-style: solid;"
  1118. ," border-width: 1px;"
  1119. ," border-color: inherit;"
  1120. ," border-radius:5px;"
  1121. ," font-size:12pt;"
  1122. ," float:left;"
  1123. ," position:fixed;"
  1124. ," z-index:999;"
  1125. ," padding:2px;"
  1126. ," box-shadow: 3px 3px 5px #888;"
  1127. ," min-width:150px;"
  1128. ," max-width:300px;"
  1129. ," white-space:pre-wrap;"
  1130. ," opacity: 0;"
  1131. ," transition: opacity 0.2s;"
  1132. ," transform: translate(30px,25px);"
  1133. ," top:0px;"
  1134. ," pointer-events:none;"
  1135. ," }"
  1136. ," #taglist a:hover::after,#taglist a:focus::after{"
  1137. ," opacity: 1;"
  1138. ," transition: opacity 0.5s;"
  1139. ," }"
  1140. //▲CSS内容部分
  1141. );
  1142. cssAry_eh.push(
  1143. //▼CSS内容部分
  1144. " #taglist a::after{"
  1145. ," color:#5c0d11;"
  1146. ," }"
  1147. //▲CSS内容部分
  1148. );
  1149. cssAry_ex.push(
  1150. //▼CSS内容部分
  1151. " #taglist a::after{"
  1152. ," color:#dddddd;"
  1153. ," }"
  1154. //▲CSS内容部分
  1155. );
  1156. partReset("ETB_option-version",optionVersion,part);
  1157. partReset("ETB_create-info","true",part);
  1158. partReset("ETB_create-info-image","true",part);
  1159. partReset("ETB_create-cname-image","true",part);
  1160. partReset("ETB_global-style",cssAry.join("\r\n"),part);
  1161. partReset("ETB_global-style-eh",cssAry_eh.join("\r\n"),part);
  1162. partReset("ETB_global-style-ex",cssAry_ex.join("\r\n"),part);
  1163. reloadOption();
  1164. }
  1165. //访问设置用递归函数
  1166. function visitChildNodes(dom, callback)
  1167. {
  1168. callback(dom);
  1169. for (var ci=0, cilen=dom.childNodes.length; ci<cilen; ci++)
  1170. {
  1171. visitChildNodes(dom.childNodes[ci], callback);
  1172. }
  1173. }
  1174. //保存设置
  1175. function saveOption()
  1176. {
  1177. var option_modal_w = document.getElementById("ETB_option");
  1178. if (option_modal_w)
  1179. {
  1180. visitChildNodes(option_modal_w,setValue);
  1181. }
  1182. function setValue(dom)
  1183. {
  1184. if (dom.name && dom.value != undefined)
  1185. {
  1186. if (dom.type == "checkbox")
  1187. GM_setValue(dom.name, dom.checked);
  1188. else
  1189. GM_setValue(dom.name, dom.value);
  1190. }
  1191. }
  1192. option_modal_w.style.display = "none";
  1193. }
  1194. //重新加载设置窗口
  1195. function reloadOption()
  1196. {
  1197. var option_modal_w = document.getElementById("ETB_option");
  1198. if (option_modal_w)
  1199. {
  1200. visitChildNodes(option_modal_w, getValue);
  1201. }
  1202. function getValue(dom)
  1203. {
  1204. if (dom.name && dom.value != undefined)
  1205. {
  1206. var value = GM_getValue(dom.name);
  1207. if (value != undefined)
  1208. {
  1209. if (dom.type != undefined && dom.type == "checkbox")
  1210. dom.checked = value;
  1211. else
  1212. dom.value = value;
  1213. }
  1214. }
  1215. }
  1216. }
  1217.  
  1218.  
  1219. /*
  1220. * 开始实际执行的程序
  1221. */
  1222.  
  1223. if (!GM_getValue("ETB_option-version"))
  1224. {
  1225. resetOption(false); //新用户重置设置
  1226. }
  1227. else if (GM_getValue("ETB_option-version", "number") < optionVersion)
  1228. { //老用户提醒更改设置
  1229. alert(scriptName + " 本次程序版本更新改变了设置结构,建议先重置设置否则可能会导致无法正常使用。");
  1230. resetOption(true);
  1231. }
  1232.  
  1233. var menu_modal = buildMenuModal("menu", null, "请选择任务 v" + scriptVersion, null, [
  1234. buildMenuList([
  1235. buildMenuItem("生成CSS","生成用户样式版EhTagTranslator,请使用Stylish扩展安装。理论上安卓火狐也可使用。",buildSVG("css"),function(){
  1236. startProgram(ds,0);
  1237. }
  1238. ,0),
  1239. buildMenuItem("生成JSON","生成用户脚本版"+buildSVG("js").outerHTML+"EhTagTranslator数据库,不过该脚本暂未开发。",buildSVG("json"),function(){
  1240. startProgram(ds,1);
  1241. }
  1242. ,0)
  1243. ]),
  1244. buildMenuList([
  1245. buildMenuItem("选项",null,buildSVG("Settings"),function(){startOption();reloadOption();},1),
  1246. //buildMenuItem("查看使用帮助",null,buildSVG("question"),"https://github.com/Mapaler/EhTagTranslator/blob/master/README.md",1),
  1247. buildMenuItem("参与补全翻译",null,buildSVG("book"),"https://github.com/Mapaler/EhTagTranslator/wiki",1),
  1248. ])
  1249. ]);
  1250. buttonInserPlace.insertBefore(buildButton(" " + scriptName + " ", buildSVG("eh"), menu_modal),buttonInserPlace.getElementsByTagName("li")[0]);
  1251. })();