巴哈編輯器樓層連結轉換

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

目前為 2021-07-29 提交的版本,檢視 最新版本

// ==UserScript==
// @name         巴哈編輯器樓層連結轉換
// @namespace    https://home.gamer.com.tw/homeindex.php?owner=qwert535286
// @version      0.1
// @description  把編輯器裡的樓層號碼轉換成連結,如果不想限制只抓 # 號開頭,則會抓三位數以上的數字
// @author       笑翠鳥
// @icon         https://www.google.com/s2/favicons?domain=tampermonkey.net
// @include      https://forum.gamer.com.tw/C.php?*
// @include      https://forum.gamer.com.tw/Co.php?*
// @include      https://forum.gamer.com.tw/post1.php?*
// ==/UserScript==

(() => {
    function getBsnSna() {
        const generate = link => {
            const url = new URL(link)
            return [url.searchParams.get('bsn'), url.searchParams.get('snA')]
        }

        switch(true) {
            case location.href.includes('C.php'):
            case location.href.includes('post1.php'):
                return generate(location.href)
            case location.href.includes('Co.php'):
                return generate(`https://${document.querySelector('a[data-gtm="置頂標題回覆"]').getAttribute('href')}`)
            default:
                return []
        }
    }

    function insertButton() {
        const actionTmpl = `
            <button class="__generate-floor-link" type="button">樓層轉換</button>
            <label style="height: 24px; color: #a6a6a6; font-size: 13.333333px; display: inline-flex; align-items: center; padding: 4px; vertical-align: middle;">
                <input type="checkbox" name="no_floor_mark" />&nbsp;不限 # 號
            </label>
        `

        const target = location.href.includes('post1.php') ? '.postset_sign' : '.option .toolbar'
        document.querySelector(target).insertAdjacentHTML('beforeend', actionTmpl)
    }

    function removeFloorLink(content, bahaLink) {
        const regexLink = `<a href="${bahaLink.replace(/([\/\.\?])/g, '\\$1').replace(/&/g, '&amp;')}&amp;to=[0-9]{1,}">(#?[0-9]+)<\\/a>`
        return content.replace(new RegExp(regexLink, 'g'), '$1')
    }

    // 忽略 a:href, img:src,純文字網址若有數字可能會判斷錯誤
    function addFloorLinkWithoutMark(raw, bahaLink) {
        const hasAorImgTag = /(<a[^>]*>.*?<\/a>|<img[^>]*>)/g

        return raw
            .split(hasAorImgTag) // <a>, <img> split 後不會消失,而是單獨變成一行
            .map(line => hasAorImgTag.test(line) ? line : line.replace(/(#?)([0-9]{3,})/g, `<a href="${bahaLink}&to=$2">$1$2</a>`))
            .join('')
    }

    function addFloorLink(raw, bahaLink) {
        return raw.replace(/(#)([0-9]+)/g, `<a href="${bahaLink}&to=$2">$1$2</a>`)
    }

    window.addEventListener('load', () => {
        const [bsn, sna] = getBsnSna()
        if (!bsn || !sna) return

        const bahaLink = `https://forum.gamer.com.tw/C.php?bsn=${bsn}&snA=${sna}`

        insertButton()

        const $iframeEditor = document.getElementById('editor').contentWindow.document.body
        document.querySelector('.__generate-floor-link').addEventListener('click', () => {
            const rawContent = removeFloorLink($iframeEditor.innerHTML, bahaLink)

            $iframeEditor.innerHTML =
                document.querySelector('[name="no_floor_mark"]:checked')
                ? addFloorLinkWithoutMark(rawContent, bahaLink)
                : addFloorLink(rawContent, bahaLink)
        })
    })
})()

QingJ © 2025

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