snap Links Mod

批量获取页面链接和选项框

当前为 2016-11-22 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name snap Links Mod
  3. // @description 批量获取页面链接和选项框
  4. // @name:en snap Links Mod
  5. // @description:en snap Links radios chenkboxs imgage from website
  6. // @author Hanchy Hill
  7. // @namespace https://minhill.com/snapLinks
  8. // @include http*
  9. // @version 0.5
  10. // @license MIT
  11. // @grant GM_getValue
  12. // @grant GM_setValue
  13. // @grant GM_openInTab
  14. // @grant GM_deleteValue
  15. // @grant GM_addStyle
  16. // @grant GM_registerMenuCommand
  17. // @grant GM_setClipboard
  18. // @grant GM_log
  19. // @icon http://minhill.com/blog/wp-content/uploads/2012/03/favicon.ico
  20. // ==/UserScript==
  21.  
  22. var snapLinks = {
  23. timer: null,
  24. button: 0,
  25.  
  26. init: function() {
  27. /*if (!snapLinks.inited) {
  28. var menuitem = document.getElementById("SnapLinksCopyLinksSetFormat");
  29. if (menuitem) {
  30. var func = function() {
  31. var format = prompt('请输入需要设置的格式(%t:标题,%u:链接,%n:序号,%r:反向序号)',
  32. '<a href="%u">%r. %t</a><br>');
  33. snapLinks.copyLinks(null, false, format);
  34. };
  35. menuitem.addEventListener('command', func, false);
  36. }
  37.  
  38. snapLinks.inited = true;
  39. }*/
  40.  
  41. snapLinks.win = window;
  42. if (snapLinks.win == window) snapLinks.win = window;
  43. snapLinks.doc = snapLinks.win.document;
  44. snapLinks.body = snapLinks.doc.body;
  45. if (!snapLinks.body instanceof HTMLBodyElement){
  46. alert("Can not snaplinks.");
  47. return false;
  48. }
  49.  
  50. snapLinks.root = snapLinks.doc.documentElement;
  51. //this.utils = this.win.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils);
  52. snapLinks.popup = document.getElementById("snapLinksMenupopup");
  53.  
  54. snapLinks.bodyCursor = snapLinks.body.style.cursor;
  55. snapLinks.rootCursor = snapLinks.root.style.cursor;
  56. snapLinks.body.style.setProperty("cursor", "crosshair", "important");
  57. snapLinks.root.style.setProperty("cursor", "crosshair", "important");
  58.  
  59. snapLinks.highlights = [];
  60. snapLinks.elements = [];
  61. //alert(snapLinks.button);
  62.  
  63. snapLinks.doc.addEventListener("mousedown", snapLinks.handleEvent, true);
  64. snapLinks.doc.addEventListener("pagehide", snapLinks.handleEvent, true);
  65. },
  66. uninit: function() {
  67. //alert("uninit");
  68. snapLinks.doc.removeEventListener("mousedown", snapLinks.handleEvent, true);
  69. snapLinks.doc.removeEventListener("mousemove", snapLinks.handleEvent, true);
  70. snapLinks.doc.removeEventListener("pagehide", snapLinks.handleEvent, true);
  71. snapLinks.doc.removeEventListener("mouseup", snapLinks.handleEvent, true);//?
  72. setTimeout(function(self){
  73. snapLinks.doc.removeEventListener("click", snapLinks.handleEvent, true);
  74. }, 10, snapLinks);
  75.  
  76. if (snapLinks.box && snapLinks.box.parentNode)
  77. snapLinks.box.parentNode.removeChild(snapLinks.box);
  78. snapLinks.box = null;
  79. snapLinks.body.style.cursor = snapLinks.bodyCursor;
  80. snapLinks.root.style.cursor = snapLinks.rootCursor;
  81. },
  82. destroy: function() {
  83. snapLinks.uninit();
  84. snapLinks.lowlightAll();
  85. document.removeEventListener("click",snapLinks.destroy,false);
  86.  
  87. var sslpop = document.getElementById("snapLinksMenupopup")
  88. sslpop.setAttribute("class","hidden_popup");
  89. sslpop.setAttribute("style",null);
  90.  
  91. },
  92. handleEvent: function(event) {
  93. //alert(event.type);
  94. switch(event.type){
  95. case "mousedown":
  96. if (event.button != 0 || event.ctrlKey || event.shiftKey || event.altKey) return;
  97. event.preventDefault();
  98. event.stopPropagation();
  99.  
  100. snapLinks.draw(event);
  101. break;
  102. case "mousemove":
  103. event.preventDefault();
  104. event.stopPropagation();
  105. var moveX = event.pageX;
  106. var moveY = event.pageY;
  107. if (snapLinks.downX > moveX) snapLinks.box.style.left = moveX + "px";
  108. if (snapLinks.downY > moveY) snapLinks.box.style.top = moveY + "px";
  109. snapLinks.box.style.width = Math.abs(moveX - snapLinks.downX) + "px";
  110. snapLinks.box.style.height = Math.abs(moveY - snapLinks.downY) + "px";
  111.  
  112. if (snapLinks.timer) {
  113. clearTimeout(snapLinks.timer);
  114. snapLinks.timer = null;
  115. }
  116. var timeStamp = new Date().getTime();
  117. if (timeStamp - snapLinks.lastHiglightedTime > 150) {
  118. snapLinks.boxRect = snapLinks.box.getBoundingClientRect();
  119. snapLinks.highlightAll();
  120. } else {
  121. var self = snapLinks;
  122. snapLinks.timer = setTimeout(function() {
  123. self.boxRect = self.box.getBoundingClientRect();
  124. self.highlightAll();
  125. }, 200);
  126. }
  127. break;
  128. case "mouseup":
  129. //alert("mouseup");
  130. if (event.button != snapLinks.button || event.ctrlKey || event.shiftKey) return;
  131. event.preventDefault();
  132. event.stopPropagation();
  133.  
  134. if (snapLinks.timer) {
  135. clearTimeout(snapLinks.timer);
  136. snapLinks.timer = null;
  137. }
  138. snapLinks.boxRect = snapLinks.box.getBoundingClientRect();
  139. snapLinks.highlightAll();
  140.  
  141.  
  142. //alert("mouseup");
  143.  
  144. for (let [i, e] in Iterator(snapLinks.highlights)) {
  145. if (e instanceof HTMLImageElement) {
  146. let link = snapLinks.doc.evaluate(
  147. 'ancestor::*[@href]', e, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
  148. if (snapLinks.highlights.indexOf(link) === -1) {
  149. snapLinks.elements[snapLinks.elements.length] = link;
  150. }
  151. continue;
  152. }
  153. snapLinks.elements[snapLinks.elements.length] = e;
  154. }
  155. snapLinks.elements = snapLinks.elements;//?
  156.  
  157. snapLinks.uninit();
  158. snapLinks.showPopup(event);
  159. break;
  160. case "click":
  161. event.preventDefault();
  162. event.stopPropagation();
  163. break;
  164. case "pagehide":
  165. snapLinks.destroy();
  166. break;
  167. }
  168. },
  169. draw: function(aEvent) {
  170. snapLinks.lastHiglightedTime = new Date().getTime();
  171. snapLinks.downX = aEvent.pageX;
  172. snapLinks.downY = aEvent.pageY;
  173. snapLinks.box = snapLinks.doc.createElement("div");
  174. snapLinks.box.id = "snap-links-box";
  175. snapLinks.box.style.cssText = [
  176. 'background-color: rgba(0,128,255,.1) !important;'
  177. ,'border: 1px solid rgb(255,255,0) !important;'
  178. ,'box-sizing: border-box !important;'
  179. ,'-moz-box-sizing: border-box !important;'
  180. ,'position: absolute !important;'
  181. ,'z-index: 2147483647 !important;'
  182. ,'top:' + snapLinks.downY + 'px;'
  183. ,'left:' + snapLinks.downX + 'px;'
  184. ,'cursor: crosshair !important;'
  185. ,'margin: 0px !important;'
  186. ,'padding: 0px !important;'
  187. ,'outline: none !important;'
  188. ].join(" ");
  189. snapLinks.body.appendChild(snapLinks.box);
  190.  
  191. snapLinks.doc.removeEventListener("mousedown", snapLinks.handleEvent, true);
  192. snapLinks.doc.addEventListener("mousemove", snapLinks.handleEvent, true);
  193. snapLinks.doc.addEventListener("mouseup", snapLinks.handleEvent, true);
  194. snapLinks.doc.addEventListener("click", snapLinks.handleEvent, true);
  195. },
  196. highlightAll: function() {
  197. var a = '[href]:not([href^="javascript:"]):not([href^="mailto:"]):not([href^="#"])';
  198. var selector = a + ', ' + a + ' img, input[type="checkbox"], input[type="radio"]';
  199. selector += ', a.b-in-blk.input-cbx[href^="javascript:"]'; // 百度盘的特殊多选框
  200.  
  201. var contains = snapLinks.getContainsElements();
  202. contains.reverse();
  203. var matches = [];
  204. for (let [i, e] in Iterator(contains)) {
  205. if (e.nodeType !== 1 || !e.matches(selector))
  206. continue;
  207.  
  208. if (e.hasAttribute('href')) {
  209. let imgs = Array.slice(e.getElementsByTagName('img'));
  210. if (imgs[0]) {
  211. [].push.apply(contains, imgs);
  212. continue;
  213. }
  214. }
  215.  
  216. if (!("defStyle" in e))
  217. snapLinks.highlight(e);
  218. matches[matches.length] = e;
  219. }
  220.  
  221. snapLinks.highlights.forEach(function(e, i, a){
  222. if (matches.indexOf(e) === -1)
  223. snapLinks.lowlight(e);
  224. }, snapLinks);
  225.  
  226. snapLinks.highlights = matches;
  227. snapLinks.lastHiglightedTime = new Date().getTime();
  228. },
  229. lowlightAll: function() {
  230. snapLinks.highlights.forEach(function(e){
  231. snapLinks.lowlight(e);
  232. }, this);
  233. },
  234. highlight: function(elem) {
  235. if (!('defStyle' in elem))
  236. elem.defStyle = elem.getAttribute('style');
  237. //elem.style.setProperty('outline', '2px solid #ff0000', 'important');
  238. elem.style.setProperty('outline', '2px solid #ff0000', null);
  239. elem.style.setProperty('outline-offset', '-1px', null);
  240. //elem.style.setProperty('outline-offset', '-1px', 'important');
  241. },
  242. lowlight: function(elem) {
  243. if ("defStyle" in elem) {
  244. elem.defStyle?
  245. elem.style.cssText = elem.defStyle:
  246. elem.removeAttribute("style");
  247. delete elem.defStyle;
  248. }
  249. },
  250. getContainsElements: function() {
  251. if (!snapLinks.boxRect) return;
  252. var a = '[href]:not([href^="javascript:"]):not([href^="mailto:"]):not([href^="#"])';
  253. var selector = a + ', ' + a + ' img, input[type="checkbox"], input[type="radio"]';
  254. selector += ', a.b-in-blk.input-cbx[href^="javascript:"]';
  255. //var nodes = document.querySelectorAll("a[href],img,radio,checkbox");
  256. var nodes = document.querySelectorAll(selector);
  257. var arraynode=[] , len = nodes.length , i;
  258.  
  259.  
  260. for (i = 0; i < len; i++) {
  261. if(this.inSelect(nodes[i])) arraynode.push(nodes[i]);
  262. }
  263.  
  264. return arraynode;
  265.  
  266. },
  267.  
  268. inSelect : function (node){
  269. var boxPos = snapLinks.boxRect;
  270. var xmin = boxPos.left, xmax = boxPos.right, ymin = boxPos.top, ymax = boxPos.bottom;
  271.  
  272. var pos = this.getOffset(node);
  273. var point = new Array();
  274.  
  275. point = [pos.x, pos.x + pos.width, pos.y, pos.y + pos.height];
  276. var swithcase = [];
  277. if((point[0]>xmin&&point[0]<xmax)||
  278. (point[1]>xmin&&point[1]<xmax)||
  279. (point[0]<xmin&&point[1]>xmax)){
  280. swithcase[0] = true;
  281. }
  282. if((point[2]>ymin&&point[2]<ymax)||
  283. (point[3]>ymin&&point[3]<ymax)||
  284. (point[2]<ymin&&point[3]>ymax)){
  285. swithcase[1] = true;
  286. }
  287. if(swithcase[0]&&swithcase[1]){
  288. return true;
  289. }
  290.  
  291. else{
  292. return false;
  293. }
  294.  
  295. },
  296.  
  297. getOffset : function(node){
  298. var rect = node.getBoundingClientRect();
  299.  
  300. return {
  301. //x: window.pageXOffset + rect.left,
  302. //y: window.pageYOffset + rect.top,
  303. x: rect.left,
  304. y: rect.top,
  305. width: rect.width,
  306. height: rect.height
  307. };
  308. },
  309.  
  310.  
  311. showPopup: function(aEvent) {
  312. //alert("Popup");
  313. var cls = [];
  314.  
  315. var linkcount = 0;
  316. var specialLinkCount = 0; // 特殊的类似多选框的链接
  317. var imagecount = 0;
  318. var checkboxcount = 0;
  319. var radiocount = 0;
  320. for (let [i, elem] in Iterator(this.elements)) {
  321. if (elem instanceof HTMLAnchorElement)
  322. elem.href.indexOf('javascript:') == 0 ? specialLinkCount++ : linkcount++;
  323. }
  324. for (let [i, elem] in Iterator(this.elements)) {
  325. if (elem instanceof HTMLAnchorElement && /\.(jpe?g|png|gif|bmp)$/i.test(elem.href))
  326. imagecount++;
  327. }
  328. for (let [i, elem] in Iterator(this.elements)) {
  329. if (elem instanceof HTMLInputElement && elem.type === 'checkbox') {
  330. checkboxcount++;
  331. }
  332. }
  333. for (let [i, elem] in Iterator(this.elements)) {
  334. if (elem instanceof HTMLInputElement && elem.type === 'radio') {
  335. radiocount++;
  336. }
  337. }
  338. if ( linkcount > 0 ) cls.push("hasLink");
  339. if ( imagecount > 0 ) cls.push("hasImageLink");
  340. if ( checkboxcount > 0 ) cls.push("hasCheckbox");
  341. if ( radiocount > 0 ) cls.push("hasRadio");
  342. if ( specialLinkCount > 0 ) cls.push("hasSpecialLink");
  343.  
  344.  
  345.  
  346. var setCount = function(id, label){
  347. let currentEntry = document.getElementById(id);
  348. if(currentEntry)
  349. currentEntry.innerHTML = label;
  350. };
  351.  
  352. var data = {
  353. "SnapLinksOpenLinks": "在新标签打开所有链接 (" + linkcount + ")",
  354. "SnapLinksCopyLinks": "复制所有链接URL (" + linkcount + ")",
  355. "SnapLinksCopyLinksReverse": "复制所有链接URL (" + linkcount + ") (反向)",
  356. "SnapLinksCopyLinksAndTitles": "复制所有链接标题 + URL (" + linkcount + ")",
  357. "SnapLinksCopyLinksAndTitlesMD": "复制所有链接标题 + URL (" + linkcount + ") (MD)",
  358. "SnapLinksCopyLinksAndTitlesBBS": "复制所有链接标题 + URL (" + linkcount + ") (BBS)",
  359. "SnapLinksCopyLinksRegExp": "复制所有链接标题 + URL (" + linkcount + ") (筛选)",
  360. "SnapLinksCopyLinksSetFormat": "复制所有链接标题 + URL (" + linkcount + ") (设置复制格式)",
  361. "SnapLinksOpenImageLinks": "在新标签页打开所有图片链接 (" + imagecount + ")",
  362. "SnapLinksImageLinksOnePage": "在一个标签页显示所有图片链接 (" + imagecount + ")",
  363. "SnapLinksCheckBoxSelect": "复选框 - 选中 (" + checkboxcount + ")",
  364. "SnapLinksCheckBoxCancel": "复选框 - 取消 (" + checkboxcount + ")",
  365. "SnapLinksCheckBoxTaggle": "复选框 - 反选 (" + checkboxcount + ")",
  366. "SnapLinksRadioSelect": "单选框 - 选中 (" + radiocount + ")",
  367. "SnapLinksRadioCancel": "单选框 - 取消 (" + radiocount + ")",
  368. "SnapLinksClickLinks": "特殊单选框 - 选中 (" + specialLinkCount + ")",
  369. };
  370.  
  371. for(let id in data){
  372. setCount(id, data[id]);
  373. }
  374.  
  375.  
  376. var setStyleNode = function(showList){
  377. var setList = ["hasLink","hasImageLink","hasCheckbox","hasRadio","hasSpecialLink"];
  378. setList.forEach(
  379. function(elist){
  380. eClass = document.getElementsByClassName(elist);
  381. if(eClass){
  382. if(showList.indexOf(elist)==-1){
  383. for(var i=0;i<eClass.length;i++){
  384. eClass[i].style = "display:none";
  385. }
  386. //eClass.forEach(function(enode){enode.setAttribute("stlye","display:none")})
  387. } else{
  388. for(var i=0;i<eClass.length;i++){
  389. eClass[i].style = "display:block";
  390. }
  391. //eClass.forEach(function(enode){enode.setAttribute("stlye","display:block")})
  392. }
  393. }
  394. }
  395. )
  396. }
  397.  
  398.  
  399. if (cls.length > 0) {
  400. setStyleNode(cls);
  401. snapLinks.openPopupAtScreen(aEvent.pageX, aEvent.pageY,aEvent.clientX,aEvent.clientY);
  402. //snapLinks.popup.className = cls.join(' ');
  403. } else {
  404. snapLinks.lowlightAll();
  405. }
  406. },
  407. openPopupAtScreen:function(ax,ay,cx,cy){
  408. var popMenu = document.getElementById("snapLinksMenupopup");
  409. var midx = document.documentElement.clientWidth/2;
  410. var midy = document.documentElement.clientHeight/2;
  411. //GM_log("pointerY:"+ay);
  412. //GM_log("screen:"+midy*2);
  413. //GM_log(ay-document.body.scrollTop);
  414.  
  415.  
  416. popMenu.className = "trigger_popup";
  417. //popMenu.style.position = "absolute";
  418. var menuRight = ax - popMenu.clientWidth;
  419. //alert(popMenu.clientHeight);
  420. var menuDown = ay - popMenu.clientHeight;
  421.  
  422. //popMenu.setAttribute("style","left: "+ax.toString()+"px; top: "+ay.toString()+"px;")
  423. //popMenu.style.left = ax.toString()+"px";
  424. //popMenu.style.top = ay.toString()+"px";
  425. document.addEventListener("click",snapLinks.destroy,false);
  426.  
  427. xaxis = (cx<midx) ? "left: "+ax.toString()+"px;":"left: "+menuRight.toString()+"px;";
  428.  
  429. yaxis = (cy<midy) ? " top: "+ay.toString()+"px;" : " top: "+menuDown.toString()+"px;";
  430. popMenu.setAttribute("style", xaxis + yaxis);
  431.  
  432.  
  433. //popMenu.getElementById("SnapLinksCopyLinks").addEventListener()
  434. //alert(snapLinks.elements);
  435. // document.getElementById("SnapLinksOpenLinks").addEventListener("click",function(){snapLinks.openLinks()},false);
  436. // document.getElementById("SnapLinksCopyLinks").addEventListener("click",function(){snapLinks.copyLinks()},false);
  437. },
  438. openLinks : function(regexp){
  439. var obj = {};
  440. for (let [i, elem] in Iterator(this.elements)) {
  441. if (!elem.href || /^(?:javascript:|mailto:|#)/i.test(elem.href)) continue;
  442. if (!regexp || regexp.test(elem.href))
  443. obj[elem.href] = true;
  444. }
  445. for (let [key, val] in Iterator(obj)) {
  446. GM_openInTab(key);
  447. //gBrowser.addTab(key, { ownerTab: gBrowser.mCurrentTab });
  448. }
  449. },
  450. clickLinks : function(){
  451. for (let [i, elem] in Iterator(this.elements)) {
  452. if (!elem.href || /^(?:javascript:|mailto:|#)/i.test(elem.href)) {
  453. elem.click();
  454. }
  455. }
  456. },
  457. copyLinks : function(regexp, reverse, format){
  458.  
  459.  
  460.  
  461.  
  462. //GM_log(selements);
  463. var links = this.elements.filter(function(elem){
  464. return elem instanceof HTMLAnchorElement && (!regexp || regexp.test(elem.href))
  465. });
  466.  
  467.  
  468. var num = 1,
  469. numReverse = links.length;
  470. links = links.map(function(e) {
  471. if (format) {
  472. return format.replace(/%t/g, e.textContent)
  473. .replace(/%u/g, e.href)
  474. .replace(/%r/g, numReverse--)
  475. .replace(/%n/g, num++);
  476. }
  477. return e.href;
  478. });
  479.  
  480. // 筛选出重复的
  481. links = snapLinks.unique(links);
  482.  
  483. if(reverse)
  484. links = links.reverse();
  485.  
  486. if (links.length){
  487. GM_setClipboard(links.join('\n'));
  488. //Components.classes["@mozilla.org/widget/clipboardhelper;1"]
  489. // .getService(Components.interfaces.nsIClipboardHelper)
  490. // .copyString(links.join('\n'));
  491. }
  492. },
  493. imageOnePage : function(){
  494. var htmlsrc = [
  495. '<style>'
  496. ,'img { max-width: 100%; max-height: 100%; }'
  497. ,'</style>'].join('');
  498. for (let [i, elem] in Iterator(this.elements)) {
  499. if (elem instanceof HTMLAnchorElement && /\.(jpe?g|png|gif|bmp)$/i.test(elem.href))
  500. htmlsrc += '\n<img src="' + elem.href + '">'
  501. }
  502. GM_openInTab("data:text/html;charset=utf-8," +
  503. '<html><head><title>' + snapLinks.doc.domain + ' 图象列表</title><body>' +
  504. encodeURIComponent(htmlsrc));
  505. },
  506. checkbox : function(bool){
  507. for (let [i, elem] in Iterator(this.elements)) {
  508. if (elem instanceof HTMLInputElement && elem.type === 'checkbox') {
  509. elem.checked = arguments.length == 0?
  510. !elem.checked :
  511. bool;
  512. }
  513. }
  514. },
  515. radio : function(bool){
  516. for (let [i, elem] in Iterator(this.elements)) {
  517. if (elem instanceof HTMLInputElement && elem.type === 'radio') {
  518. elem.checked = arguments.length == 0?
  519. !elem.checked :
  520. bool;
  521. }
  522. }
  523. },
  524. unique: function(a){
  525. var o = {},
  526. r = [],
  527. t;
  528. for (var i = 0, l = a.length; i < l; i++) {
  529. t = a[i];
  530. if(!o[t]){
  531. o[t] = true;
  532. r.push(t);
  533. }
  534. }
  535. return r;
  536. }
  537. };
  538.  
  539.  
  540.  
  541.  
  542.  
  543. function begin() {
  544. var ibody = document.getElementsByTagName("body")[0]
  545. ibody.setAttribute("contextmenu","popup-menu");
  546.  
  547. var rclickMenu = document.createElement("menu");
  548. rclickMenu.setAttribute("type","context");
  549. rclickMenu.setAttribute('id', "popup-menu");
  550.  
  551. var imenu = document.createElement("menuitem");
  552. imenu.setAttribute("id","snapclicks");
  553. imenu.setAttribute('label', "snap-links");
  554. imenu.innerHTML = "snap links";
  555.  
  556. rclickMenu.appendChild(imenu);
  557. ibody.appendChild(rclickMenu);
  558.  
  559. imenu.addEventListener("click", snapLinks.init, false);
  560.  
  561. var popup = document.createElement("div");
  562. //popup.setAttribute("onclick","snapLinks.lowlightAll();");
  563. popup.setAttribute("id","snapLinksMenupopup");
  564. popup.setAttribute("class","hidden_popup");
  565. popup.innerHTML = '<div class = "-hasLink-">' +
  566. '<div id="SnapLinksOpenLinks" class="hasLink" >在新标签打开所有链接</div>' +
  567. '<div id="SnapLinksCopyLinks" class="hasLink" >复制所有链接URL</div>' +
  568. '<div id="SnapLinksCopyLinksReverse" class="hasLink" >复制所有链接URL(反向)</div>' +
  569. '<div id="SnapLinksCopyLinksAndTitles" class="hasLink" >复制所有链接标题 + URL</div>' +
  570. '<div id="SnapLinksCopyLinksAndTitlesMD" class="hasLink" >复制所有链接标题 + URL (MD)</div>' +
  571. '<div id="SnapLinksCopyLinksAndTitlesBBS" class="hasLink">复制所有链接标题 + URL (BBS)</div>' +
  572. '<div id="SnapLinksCopyLinksRegExp" class="hasLink" >复制所有链接标题 + URL (筛选)</div>' +
  573. '<div id="SnapLinksCopyLinksSetFormat" class="hasLink" >复制所有链接标题 + URL (设置复制格式)</div>' +
  574. '<div id="SnapLinksOpenImageLinks" class="hasImageLink" >在新标签页打开所有图片链接</div>' +
  575. '<div id="SnapLinksImageLinksOnePage" class="hasImageLink" >在一个标签页显示所有图片链接</div>' +
  576. '</div>' +
  577. '<div class="hasLink-hasCheckbox-hasRadio" >' +
  578. '<div id="SnapLinksCheckBoxSelect" class="hasCheckbox" >复选框 - 选中</div>' +
  579. '<div id="SnapLinksCheckBoxCancel" class="hasCheckbox" >复选框 - 取消</div>' +
  580. '<div id="SnapLinksCheckBoxTaggle" class="hasCheckbox" >复选框 - 反选</div>' +
  581. '<div id="SnapLinksRadioSelect" class="hasRadio" >单选框 - 选中</div>' +
  582. '<div id="SnapLinksRadioCancel" class="hasRadio">单选框 - 取消</div>' +
  583. '<div id="SnapLinksClickLinks" class="hasSpecialLink" >特殊单选框 - 选中</div>' +
  584. '</div>';
  585. ibody.insertBefore(popup,ibody.childNodes[0]);
  586.  
  587.  
  588.  
  589. //popup.addEventListener("click",function(){snapLinks.lowlightAll()},false);
  590. document.getElementById("SnapLinksOpenLinks").addEventListener("click",function(){snapLinks.openLinks()},false);
  591. document.getElementById("SnapLinksCopyLinks").addEventListener("click",function(){snapLinks.copyLinks()},false);
  592. document.getElementById("SnapLinksCopyLinksReverse").addEventListener("click",function(){snapLinks.copyLinks(null, true)},false);
  593. document.getElementById("SnapLinksCopyLinksAndTitles").addEventListener("click",function(){snapLinks.copyLinks(null, false, '%t\n%u')},false);
  594. document.getElementById("SnapLinksCopyLinksAndTitlesMD").addEventListener("click",function(){snapLinks.copyLinks(null, false, '[%t](%u)')},false);
  595. document.getElementById("SnapLinksCopyLinksAndTitlesBBS").addEventListener("click",function(){snapLinks.copyLinks(null, false, '[url=%u]%t[/url]')},false);
  596. document.getElementById("SnapLinksCopyLinksRegExp").addEventListener("click",function(){var reg=prompt('请输入需要筛选的 RegExp', '');snapLinks.copyLinks(new RegExp(reg));},false);
  597. //document.getElementById("SnapLinksCopyLinksSetFormat").addEventListener("click",function(){snapLinks.copyLinks()},false);
  598.  
  599. document.getElementById("SnapLinksOpenImageLinks").addEventListener("click",function(){snapLinks.openLinks(/\.(jpe?g|png|gif|bmp)$/i);},false);
  600. document.getElementById("SnapLinksImageLinksOnePage").addEventListener("click",function(){snapLinks.imageOnePage();},false);
  601. document.getElementById("SnapLinksCheckBoxSelect").addEventListener("click",function(){snapLinks.checkbox(true);},false);
  602. document.getElementById("SnapLinksCheckBoxCancel").addEventListener("click",function(){snapLinks.checkbox(false);},false);
  603. document.getElementById("SnapLinksCheckBoxTaggle").addEventListener("click",function(){snapLinks.checkbox();},false);
  604. document.getElementById("SnapLinksRadioSelect").addEventListener("click",function(){snapLinks.radio(true);},false);
  605. document.getElementById("SnapLinksRadioCancel").addEventListener("click",function(){snapLinks.radio(false);},false);
  606. document.getElementById("SnapLinksClickLinks").addEventListener("click",function(){snapLinks.clickLinks()},false);
  607.  
  608. GM_addStyle(".hidden_popup { display:none!important; } .trigger_popup{display:block!important;z-index:99999}" +
  609.  
  610. " #snapLinksMenupopup{position:absolute;background-color: rgb(45,53,63);border-bottom: 0px solid rgb(20,20,20);" +
  611. "border-bottom: 0px solid rgb(20,20,20);cursor:pointer;border-radius: 4px;border: 1px solid rgb(22,25,28);box-shadow:0 1px 0 rgba(162,184,204,0.25) inset,0 0 4px hsla(0,0%,0%,0.95);}" +
  612. "#snapLinksMenupopup div{color: white;} #snapLinksMenupopup > div > div:hover{color: rgb(51,159,255);" +
  613. "background-color: transparent; background-image:linear-gradient(to bottom,rgb(37,46,54),rgb(36,40,45));} ");
  614. };
  615.  
  616. begin();
  617.  
  618.  

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址