巴哈編輯器樓層連結轉換

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

目前为 2021-07-29 提交的版本。查看 最新版本

  1. // ==UserScript==
  2. // @name 巴哈編輯器樓層連結轉換
  3. // @namespace https://home.gamer.com.tw/homeindex.php?owner=qwert535286
  4. // @version 0.1
  5. // @description 把編輯器裡的樓層號碼轉換成連結,如果不想限制只抓 # 號開頭,則會抓三位數以上的數字
  6. // @author 笑翠鳥
  7. // @icon https://www.google.com/s2/favicons?domain=tampermonkey.net
  8. // @include https://forum.gamer.com.tw/C.php?*
  9. // @include https://forum.gamer.com.tw/Co.php?*
  10. // @include https://forum.gamer.com.tw/post1.php?*
  11. // ==/UserScript==
  12.  
  13. (() => {
  14. function getBsnSna() {
  15. const generate = link => {
  16. const url = new URL(link)
  17. return [url.searchParams.get('bsn'), url.searchParams.get('snA')]
  18. }
  19.  
  20. switch(true) {
  21. case location.href.includes('C.php'):
  22. case location.href.includes('post1.php'):
  23. return generate(location.href)
  24. case location.href.includes('Co.php'):
  25. return generate(`https://${document.querySelector('a[data-gtm="置頂標題回覆"]').getAttribute('href')}`)
  26. default:
  27. return []
  28. }
  29. }
  30.  
  31. function insertButton() {
  32. const actionTmpl = `
  33. <button class="__generate-floor-link" type="button">樓層轉換</button>
  34. <label style="height: 24px; color: #a6a6a6; font-size: 13.333333px; display: inline-flex; align-items: center; padding: 4px; vertical-align: middle;">
  35. <input type="checkbox" name="no_floor_mark" />&nbsp;不限 #
  36. </label>
  37. `
  38.  
  39. const target = location.href.includes('post1.php') ? '.postset_sign' : '.option .toolbar'
  40. document.querySelector(target).insertAdjacentHTML('beforeend', actionTmpl)
  41. }
  42.  
  43. function removeFloorLink(content, bahaLink) {
  44. const regexLink = `<a href="${bahaLink.replace(/([\/\.\?])/g, '\\$1').replace(/&/g, '&amp;')}&amp;to=[0-9]{1,}">(#?[0-9]+)<\\/a>`
  45. return content.replace(new RegExp(regexLink, 'g'), '$1')
  46. }
  47.  
  48. // 忽略 a:href, img:src,純文字網址若有數字可能會判斷錯誤
  49. function addFloorLinkWithoutMark(raw, bahaLink) {
  50. const hasAorImgTag = /(<a[^>]*>.*?<\/a>|<img[^>]*>)/g
  51.  
  52. return raw
  53. .split(hasAorImgTag) // <a>, <img> split 後不會消失,而是單獨變成一行
  54. .map(line => hasAorImgTag.test(line) ? line : line.replace(/(#?)([0-9]{3,})/g, `<a href="${bahaLink}&to=$2">$1$2</a>`))
  55. .join('')
  56. }
  57.  
  58. function addFloorLink(raw, bahaLink) {
  59. return raw.replace(/(#)([0-9]+)/g, `<a href="${bahaLink}&to=$2">$1$2</a>`)
  60. }
  61.  
  62. window.addEventListener('load', () => {
  63. const [bsn, sna] = getBsnSna()
  64. if (!bsn || !sna) return
  65.  
  66. const bahaLink = `https://forum.gamer.com.tw/C.php?bsn=${bsn}&snA=${sna}`
  67.  
  68. insertButton()
  69.  
  70. const $iframeEditor = document.getElementById('editor').contentWindow.document.body
  71. document.querySelector('.__generate-floor-link').addEventListener('click', () => {
  72. const rawContent = removeFloorLink($iframeEditor.innerHTML, bahaLink)
  73.  
  74. $iframeEditor.innerHTML =
  75. document.querySelector('[name="no_floor_mark"]:checked')
  76. ? addFloorLinkWithoutMark(rawContent, bahaLink)
  77. : addFloorLink(rawContent, bahaLink)
  78. })
  79. })
  80. })()

QingJ © 2025

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