有觉性 以安住且中立的心 照见身心的实相

MediaWiki:Common.js

来自Dhamma.cn
法藏​(留言 | 贡献)2026年9月19日 (六) 23:17的版本

注意:在发布之后,您可能需要清除浏览器缓存才能看到所作出的更改的影响。

  • Firefox或Safari:按住Shift的同时单击刷新,或按Ctrl-F5或Ctrl-R(Mac为⌘-R)
  • Google Chrome:按Ctrl-Shift-R(Mac为⌘-Shift-R)
  • Edge:按住Ctrl的同时单击刷新,或按Ctrl-F5。
(function () {
    if (window.dhammaCopyLoaded) return;
    window.dhammaCopyLoaded = true;

    var cachedShortUrl = '';

    // 异步通过 POST 方式向 UrlShortener API 请求真正的 /s/ 短网址
    function getShortUrlAsync() {
        if (cachedShortUrl) return Promise.resolve(cachedShortUrl);

        // 1. 优先在 DOM 中查找侧边栏或页面现成的 /s/ 短链接
        var sLink = document.querySelector('a[href*="/s/"]');
        if (sLink && sLink.href && sLink.href.indexOf('/s/') !== -1) {
            cachedShortUrl = sLink.href;
            return Promise.resolve(cachedShortUrl);
        }

        var tShort = document.querySelector('#t-shorturl a');
        if (tShort && tShort.href && tShort.href.indexOf('/s/') !== -1) {
            cachedShortUrl = tShort.href;
            return Promise.resolve(cachedShortUrl);
        }

        // 2. 构建干净的页面原生 URL(彻底剥离 &oldid=12715 等历史版本参数)
        var pageName = (window.mw && mw.config && mw.config.get('wgPageName')) || '';
        var scriptPath = (window.mw && mw.config && mw.config.get('wgScriptPath')) || '';
        var targetUrl = '';
        
        if (pageName) {
            targetUrl = window.location.origin + scriptPath + '/index.php?title=' + pageName;
        } else {
            targetUrl = window.location.href.split('?')[0].split('#')[0];
        }

        // 3. MediaWiki 规范:action=shortenurl 必须以 POST 提交
        var apiUrl = scriptPath + '/api.php';
        var params = new URLSearchParams();
        params.append('action', 'shortenurl');
        params.append('format', 'json');
        params.append('url', targetUrl);

        return fetch(apiUrl, {
            method: 'POST',
            headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
            body: params.toString()
        })
        .then(function (res) { return res.json(); })
        .then(function (data) {
            if (data && data.shortenurl && data.shortenurl.shorturl) {
                cachedShortUrl = data.shortenurl.shorturl;
            } else {
                cachedShortUrl = targetUrl;
            }
            return cachedShortUrl;
        })
        .catch(function () {
            cachedShortUrl = targetUrl;
            return cachedShortUrl;
        });
    }

    // 页面加载时后台静默预取短网址
    getShortUrlAsync();

    // 创建浮窗节点
    function getPopover() {
        var pop = document.getElementById('dhamma-copy-popover');
        if (!pop) {
            pop = document.createElement('div');
            pop.id = 'dhamma-copy-popover';
            pop.style.cssText = 'display:none; position:fixed; z-index:2147483647; background:#ffffff; border:1px solid rgba(0,0,0,0.18); border-radius:8px; box-shadow:0 6px 20px rgba(0,0,0,0.25); padding:6px; font-size:13px; line-height:1.4; white-space:nowrap;';
            
            var btn = document.createElement('button');
            btn.id = 'dhamma-copy-btn';
            btn.innerText = '复制该段开示(带出处)';
            btn.style.cssText = 'background:#4d6b57; color:#ffffff; border:none; border-radius:5px; padding:6px 14px; font-size:13px; cursor:pointer; font-weight:600; font-family:sans-serif;';
            
            pop.appendChild(btn);
            document.body.appendChild(pop);
        }
        return pop;
    }

    var currentText = '';

    function handleSelection() {
        var popover = getPopover();
        var btn = document.getElementById('dhamma-copy-btn');
        var sel = window.getSelection();
        var text = sel ? sel.toString().trim() : '';

        if (!text || text.length < 2) {
            popover.style.display = 'none';
            return;
        }

        currentText = text;

        if (sel.rangeCount > 0) {
            var range = sel.getRangeAt(0);
            var rect = range.getBoundingClientRect();

            if (rect.width === 0 || rect.height === 0) {
                popover.style.display = 'none';
                return;
            }

            var popWidth = popover.offsetWidth || 190;
            var popHeight = popover.offsetHeight || 38;

            var top = rect.top - popHeight - 10;
            var left = rect.left + (rect.width / 2) - (popWidth / 2);

            if (left < 10) left = 10;
            if (top < 10) top = rect.bottom + 10;

            popover.style.top = top + 'px';
            popover.style.left = left + 'px';
            popover.style.display = 'block';

            btn.onclick = function (e) {
                e.stopPropagation();
                e.preventDefault();

                getShortUrlAsync().then(function (shortUrl) {
                    var title = (window.mw && mw.config && mw.config.get('wgTitle')) || document.title;
                    var site = (window.mw && mw.config && mw.config.get('wgSiteName')) || 'Dhamma.cn';

                 // 格式化输出:摘自、标题、地址、声明各独占一行
                    var output = 
                        '“' + currentText + '”\n\n' +
                        '----------------------------------------\n' +
                        '摘自:' + site + '\n' +
                        '标题:' + title + '\n' +
                        '地址:' + shortUrl + '\n' +
                        '转载请保持原文,随喜分享,Sadhu!';

                    if (navigator.clipboard && navigator.clipboard.writeText) {
                        navigator.clipboard.writeText(output).then(function () {
                            showSuccess(btn, popover);
                        }).catch(function () {
                            fallbackCopy(output, btn, popover);
                        });
                    } else {
                        fallbackCopy(output, btn, popover);
                    }
                });
            };
        }
    }

    function showSuccess(btn, popover) {
        btn.innerText = '✅ 已复制开示及出处';
        btn.style.background = '#2e7d32';
        setTimeout(function () {
            btn.innerText = '📋 复制该段开示(带出处)';
            btn.style.background = '#4d6b57';
            popover.style.display = 'none';
        }, 1200);
    }

    function fallbackCopy(text, btn, popover) {
        var ta = document.createElement('textarea');
        ta.value = text;
        ta.style.position = 'fixed';
        ta.style.opacity = '0';
        document.body.appendChild(ta);
        ta.select();
        document.execCommand('copy');
        document.body.removeChild(ta);
        showSuccess(btn, popover);
    }

    document.addEventListener('mouseup', function () { setTimeout(handleSelection, 30); });
    document.addEventListener('touchend', function () { setTimeout(handleSelection, 30); });

    document.addEventListener('mousedown', function (e) {
        var pop = document.getElementById('dhamma-copy-popover');
        if (pop && !pop.contains(e.target)) {
            pop.style.display = 'none';
        }
    });
})();