巴哈編輯器樓層連結轉換

把編輯器裡的樓層號碼轉換成連結,如果不想限制只抓 # 號開頭,則會抓三位數以上的數字

  1. // ==UserScript==
  2. // @name 巴哈編輯器樓層連結轉換
  3. // @namespace https://home.gamer.com.tw/homeindex.php?owner=qwert535286
  4. // @version 0.5.5
  5. // @description 把編輯器裡的樓層號碼轉換成連結,如果不想限制只抓 # 號開頭,則會抓三位數以上的數字
  6. // @author 笑翠鳥
  7. // @icon https://www.google.com/s2/favicons?domain=gamer.com.tw
  8. // @match https://forum.gamer.com.tw/C.php?*
  9. // @match https://forum.gamer.com.tw/Co.php?*
  10. // @match https://forum.gamer.com.tw/post1.php?*
  11. // @grant GM_addStyle
  12. // ==/UserScript==
  13.  
  14. (() => {
  15. // post1.php 的編輯簽名黨按鈕
  16. GM_addStyle(`
  17. [href="https://home.gamer.com.tw/editSignWeb.php"] + .__generate-floor-link {
  18. margin-left: 8px;
  19. }
  20. `)
  21.  
  22.  
  23. function getBsnSna() {
  24. const generate = link => {
  25. const url = new URL(link)
  26. return [url.searchParams.get('bsn'), url.searchParams.get('snA')]
  27. }
  28.  
  29. switch(true) {
  30. case location.href.includes('C.php'):
  31. return generate(location.href)
  32. case location.href.includes('post1.php'): // post 頁面不會每次都有 snA,我不知道為什麼
  33. return generate(`https://forum.gamer.com.tw/${document.form1.action}`)
  34. case location.href.includes('Co.php'):
  35. return generate(`https://${document.querySelector('a[data-gtm="選單下滑-查看全文"]').href}`)
  36. default:
  37. return []
  38. }
  39. }
  40.  
  41. function insertButton() {
  42. const actionTmpl = `
  43. <button class="__generate-floor-link" type="button">樓層轉換</button>
  44. <label style="display: inline-flex; align-items: center; height: 24px; padding: 4px; color: #a6a6a6; font-size: 13.333333px; vertical-align: middle;">
  45. <input type="checkbox" name="no_floor_mark" />&nbsp;不限 #
  46. </label>
  47. `
  48.  
  49. const [position, target] = location.href.includes('post1.php')
  50. ? ['afterend', '[href="https://home.gamer.com.tw/editSignWeb.php"]']
  51. : ['beforeend', '.option .toolbar']
  52. document.querySelector(target).insertAdjacentHTML(position, actionTmpl)
  53. }
  54.  
  55. function replaceFloorLink(content, bahaLink, hasMark) {
  56. const tags = 'font|span|i|b|u|strike'
  57. const regexStyle = reg => `((<(${tags})[^>]*>)*)${reg}((</(${tags})>)*)`
  58.  
  59. const isAorImg = /(<a[^>]*>.*?<\/a>|<img[^>]*>)/g
  60. const hasLink = new RegExp(`<a[^>]*>${regexStyle('(#?)([0-9]+)')}</a>`, 'g')
  61. const regex = new RegExp(regexStyle(hasMark ? '(#)([0-9]+)' : '(#?)([0-9]{3,})'), 'g')
  62.  
  63. return content
  64. .replace(hasLink, '$1$4$5$6') // 還原原本的樓層網址
  65. .split(isAorImg) // <a>, <img> split 後不會消失,而是單獨變成一行
  66. .map(line => isAorImg.test(line) ? line : line.replace(regex, `<a href="${bahaLink}&to=$5">$1$4$5$6</a>`))
  67. .join('')
  68. .replace(/color:\s?rgb\((<a[^>]*>)?(\d*)(<\/a>)?,\s?(<a[^>]*>)?(\d*)(<\/a>)?,\s?(<a[^>]*>)?(\d*)(<\/a>)?\);/g, 'color:rgb($2, $5, $8);') // 把被換成連結的 style:rgb 換回來,勾選不帶 # 號時會發生
  69. .replace(/color:\s?(#?[\w\d]*)<a[^>]*>(.*?)<\/a>([\w\d]*);/g, 'color:$1$2$3;') // 把被換成連結的 style:#色碼 換回來
  70. }
  71.  
  72. window.addEventListener('load', () => {
  73. const [bsn, sna] = getBsnSna()
  74. if (!bsn || !sna) return
  75.  
  76. insertButton()
  77.  
  78. const bahaLink = `https://forum.gamer.com.tw/C.php?bsn=${bsn}&snA=${sna}`
  79. const $iframeEditor = document.getElementById('editor').contentWindow.document.body
  80.  
  81. document.querySelector('.__generate-floor-link').addEventListener('click', () => {
  82. $iframeEditor.innerHTML = replaceFloorLink($iframeEditor.innerHTML, bahaLink, !document.querySelector('[name="no_floor_mark"]').checked)
  83. })
  84. })
  85. })()

QingJ © 2025

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