open_original_links_in_pocket

just open direct!

目前为 2021-02-06 提交的版本,查看 最新版本

  1. // ==UserScript==
  2. // @name open_original_links_in_pocket
  3. // @namespace undegro
  4. // @include https://getpocket.com/*
  5. // @version 4.4
  6. // @license MIT
  7. // @description just open direct!
  8. // ==/UserScript==
  9.  
  10. {
  11. const parent = document.getElementById("__next")
  12. const observeParent = new MutationObserver(records => records.filter(record => record.addedNodes[0]).some(record => record.target.tagName == "MAIN" || (record.target == parent && record.addedNodes[0].querySelector("main"))) && init())
  13. const observeArticle = new MutationObserver(records => records.flatMap(record => [...record.addedNodes]).forEach(rewrite))
  14.  
  15. observeParent.observe(parent, { childList: true, subtree: true })
  16.  
  17. async function init() {
  18. observeArticle.disconnect()
  19. const articleList = await waitElement("main > div > div > div")
  20. if(articleList) observeArticle.observe(articleList, { childList: true, subtree: true })
  21. }
  22.  
  23. function rewrite(target) {
  24. if(target.tagName == "ARTICLE") {
  25. target.querySelector("button[aria-label='Open Menu']").click()
  26. }else if(target.parentElement?.classList.contains("item-menu")){
  27. target.style.opacity = "0"
  28. target.style.pointerEvents = "none"
  29.  
  30. const parentArticle = target.closest("article")
  31. parentArticle.querySelector("button[aria-label='Open Menu']").addEventListener("click", () => target.removeAttribute("style"), { once: true })
  32. parentArticle.getElementsByTagName("a")[0].href = decodeURIComponent(target.getElementsByTagName("a")[0].href.replace(/^https:\/\/getpocket\.com\/redirect\?url=/, ""))
  33. }
  34. }
  35.  
  36. function waitElement(selector) {
  37. return new Promise((resolve) => {
  38. const searchElement = () => {
  39. const elem = document.querySelector(selector)
  40. if(!elem) {
  41. requestAnimationFrame(searchElement)
  42. }else{
  43. resolve(elem)
  44. }
  45. }
  46.  
  47. searchElement()
  48. setTimeout(() => resolve(false), 5000)
  49. })
  50. }
  51. }