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

MediaWiki:Common.js:修订间差异

来自Dhamma.cn
法藏​(留言 | 贡献)
小无编辑摘要
法藏​(留言 | 贡献)
小无编辑摘要
第1行: 第1行:
/**
/* =========================================================
* =========================================================
  Dhamma.cn 划词复制开示及短网址落款 - 独立稳定版
* Dhamma.cn 阅读显示设置
  ========================================================= */
* MediaWiki 1.43
*
* 功能:
*  - 背景主题
*  - 字号
*  - 行距
*  - 阅读宽度
*  - 字体
*  - localStorage 保存
* =========================================================
*/
 
(function () {
(function () {
    if (window.dhammaCopyLoaded) return;
    window.dhammaCopyLoaded = true;


     'use strict';
     function getPopover() {
 
        var pop = document.getElementById('dhamma-copy-popover');
 
        if (!pop) {
    /* =====================================================
            pop = document.createElement('div');
      1. 默认设置
            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 defaults = {
            var btn = document.createElement('button');
 
            btn.id = 'dhamma-copy-btn';
        theme: 'default',
            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;';
        fontSize: 18,
           
 
             pop.appendChild(btn);
        lineHeight: 1.9,
             document.body.appendChild(pop);
 
        maxWidth: 900,
 
        fontFamily: 'system'
 
    };
 
 
    /* =====================================================
      2. 从 localStorage 读取
      ===================================================== */
 
    var settings = {};
 
    try {
 
        var saved =
             localStorage.getItem('dhammaReaderSettings');
 
        if (saved) {
 
             settings =
                Object.assign(
                    {},
                    defaults,
                    JSON.parse(saved)
                );
 
        } else {
 
             settings =
                Object.assign({}, defaults);
 
         }
         }
 
         return pop;
    } catch (e) {
 
         settings =
            Object.assign({}, defaults);
 
     }
     }


 
     function getShortUrl() {
    /* =====================================================
         var link = document.querySelector('link[rel="shortlink"]');
      3. 保存设置
        if (link && link.href) {
      ===================================================== */
             return link.href.indexOf('http') === 0 ? link.href : window.location.origin + link.href;
 
        }
     function saveSettings() {
         if (window.mw && mw.config && mw.config.get('wgShortUrl')) {
 
            var shortUrl = mw.config.get('wgShortUrl');
         try {
             return shortUrl.indexOf('http') === 0 ? shortUrl : window.location.origin + shortUrl;
 
            localStorage.setItem(
                'dhammaReaderSettings',
                JSON.stringify(settings)
             );
 
         } catch (e) {
 
             // 浏览器禁用 localStorage 时忽略
         }
         }
 
         var sidebarLink = document.querySelector('#t-shorturl a, #t-permalink a');
    }
         if (sidebarLink && sidebarLink.href) {
 
             return sidebarLink.href.indexOf('http') === 0 ? sidebarLink.href : window.location.origin + sidebarLink.href;
 
    /* =====================================================
      4. 字体
      ===================================================== */
 
    var fonts = {
 
        system:
            '-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans SC", "Microsoft YaHei", Arial, sans-serif',
 
        serif:
            '"Noto Serif SC", "Source Han Serif SC", "Songti SC", "SimSun", serif',
 
        sans:
            '"Noto Sans SC", "Source Han Sans SC", "Microsoft YaHei", Arial, sans-serif'
 
    };
 
 
    /* =====================================================
      5. 应用设置
      ===================================================== */
 
    function applySettings() {
 
        var root =
            document.documentElement;
 
         var body =
            document.body;
 
 
        /* -----------------------------
          背景主题
          ----------------------------- */
 
        body.classList.remove(
            'reader-theme-default',
            'reader-theme-cream',
            'reader-theme-zen',
            'reader-theme-dark'
        );
 
         body.classList.add(
            'reader-theme-' + settings.theme
        );
 
 
        /* -----------------------------
          字号
          ----------------------------- */
 
        root.style.setProperty(
             '--reader-font-size',
            settings.fontSize + 'px'
        );
 
 
        /* -----------------------------
          行距
          ----------------------------- */
 
        root.style.setProperty(
            '--reader-line-height',
            settings.lineHeight
        );
 
 
        /* -----------------------------
          阅读宽度
          ----------------------------- */
 
        root.style.setProperty(
            '--reader-max-width',
            settings.maxWidth + 'px'
        );
 
 
        /* -----------------------------
          字体
          ----------------------------- */
 
        root.style.setProperty(
            '--reader-font-family',
            fonts[settings.fontFamily]
        );
 
    }
 
 
    /* =====================================================
      6. 创建设置按钮
      ===================================================== */
 
    function createSettingsButton() {
 
        if (
            document.getElementById(
                'reader-settings-button'
            )
        ) {
            return;
         }
         }
 
         return window.location.href.split('#')[0].split('?')[0];
 
         var button =
            document.createElement('button');
 
        button.id =
            'reader-settings-button';
 
        button.type =
            'button';
 
        button.setAttribute(
            'aria-label',
            '阅读设置'
        );
 
        button.setAttribute(
            'title',
            '阅读设置'
        );
 
        button.innerHTML =
            '⚙';
 
 
        document.body.appendChild(button);
 
 
        button.addEventListener(
            'click',
            function () {
 
                var panel =
                    document.getElementById(
                        'reader-settings-panel'
                    );
 
                if (!panel) {
                    return;
                }
 
                panel.classList.toggle(
                    'reader-settings-open'
                );
 
            }
        );
 
     }
     }


    var currentText = '';


     /* =====================================================
     function handleSelection() {
      7. 创建设置面板
        var popover = getPopover();
      ===================================================== */
        var btn = document.getElementById('dhamma-copy-btn');
        var sel = window.getSelection();
        var text = sel ? sel.toString().trim() : '';


    function createSettingsPanel() {
        if (!text || text.length < 2) {
 
             popover.style.display = 'none';
        if (
             document.getElementById(
                'reader-settings-panel'
            )
        ) {
             return;
             return;
         }
         }


        currentText = text;


         var panel =
         if (sel.rangeCount > 0) {
            document.createElement('div');
             var range = sel.getRangeAt(0);
 
             var rect = range.getBoundingClientRect();
        panel.id =
            'reader-settings-panel';
 
 
        panel.setAttribute(
            'role',
            'dialog'
        );
 
        panel.setAttribute(
            'aria-label',
            '阅读显示设置'
        );
 
 
        panel.innerHTML = `
 
            <div class="reader-settings-title">
                阅读显示设置
            </div>
 
 
            <!-- =========================
                主题
                ========================= -->
 
            <div class="reader-setting-group">
 
                <span class="reader-setting-label">
                    背景
                </span>
 
                <div class="reader-theme-buttons">
 
                    <button
                        type="button"
                        class="reader-theme-button reader-theme-default-button"
                        data-theme="default">
                        默认
                    </button>
 
                    <button
                        type="button"
                        class="reader-theme-button reader-theme-cream-button"
                        data-theme="cream">
                        米白
                    </button>
 
                    <button
                        type="button"
                        class="reader-theme-button reader-theme-zen-button"
                        data-theme="zen">
                        禅意
                    </button>
 
                    <button
                        type="button"
                        class="reader-theme-button reader-theme-dark-button"
                        data-theme="dark">
                        夜间
                    </button>
 
                </div>
 
            </div>
 
 
            <!-- =========================
                字号
                ========================= -->
 
            <div class="reader-setting-group">
 
                <span class="reader-setting-label">
                    字号
                </span>
 
                <div class="reader-range-row">
 
                    <span>A−</span>
 
                    <input
                        id="reader-font-size"
                        class="reader-range"
                        type="range"
                        min="14"
                        max="26"
                        step="1">
 
                    <span>A+</span>
 
                    <span
                        id="reader-font-size-value"
                        class="reader-range-value">
                    </span>
 
                </div>
 
            </div>
 
 
            <!-- =========================
                行距
                ========================= -->
 
            <div class="reader-setting-group">
 
                <span class="reader-setting-label">
                    行距
                </span>
 
                <div class="reader-range-row">
 
                    <span>窄</span>
 
                    <input
                        id="reader-line-height"
                        class="reader-range"
                        type="range"
                        min="1.4"
                        max="2.4"
                        step="0.1">
 
                    <span>宽</span>
 
                    <span
                        id="reader-line-height-value"
                        class="reader-range-value">
                    </span>
 
                </div>
 
            </div>
 
 
            <!-- =========================
                阅读宽度
                ========================= -->
 
            <div class="reader-setting-group">
 
                <span class="reader-setting-label">
                    阅读宽度
                </span>
 
                <div class="reader-range-row">
 
                    <span>窄</span>
 
                    <input
                        id="reader-max-width"
                        class="reader-range"
                        type="range"
                        min="680"
                        max="1200"
                        step="20">
 
                    <span>宽</span>
 
                    <span
                        id="reader-max-width-value"
                        class="reader-range-value">
                    </span>
 
                </div>
 
            </div>
 
 
            <!-- =========================
                字体
                ========================= -->
 
            <div class="reader-setting-group">
 
                <span class="reader-setting-label">
                    字体
                </span>
 
                <div class="reader-font-buttons">
 
                    <button
                        type="button"
                        class="reader-font-button"
                        data-font="system">
                        系统字体
                    </button>
 
                    <button
                        type="button"
                        class="reader-font-button"
                        data-font="serif">
                        宋体
                    </button>
 
                    <button
                        type="button"
                        class="reader-font-button"
                        data-font="sans">
                        黑体
                    </button>
 
                </div>
 
            </div>
 
 
            <!-- =========================
                恢复默认
                ========================= -->
 
            <button
                id="reader-settings-reset"
                type="button">
 
                恢复默认设置
 
            </button>
 
        `;
 
 
        document.body.appendChild(panel);
 
 
        bindSettingsEvents();
 
        updateSettingsUI();
 
    }
 
 
    /* =====================================================
      8. 绑定事件
      ===================================================== */
 
    function bindSettingsEvents() {
 
 
        /* -----------------------------
          主题
          ----------------------------- */
 
        document
            .querySelectorAll(
                '.reader-theme-button'
            )
             .forEach(function (button) {
 
                button.addEventListener(
                    'click',
                    function () {
 
                        settings.theme =
                            this.dataset.theme;
 
                        applySettings();
 
                        saveSettings();
 
                        updateSettingsUI();
 
                    }
                );
 
            });
 
 
        /* -----------------------------
          字号
          ----------------------------- */
 
        var fontSize =
            document.getElementById(
                'reader-font-size'
            );
 
        fontSize.addEventListener(
            'input',
             function () {
 
                settings.fontSize =
                    parseInt(
                        this.value,
                        10
                    );
 
                applySettings();
 
                saveSettings();
 
                updateSettingsUI();
 
            }
        );
 
 
        /* -----------------------------
          行距
          ----------------------------- */
 
        var lineHeight =
            document.getElementById(
                'reader-line-height'
            );
 
        lineHeight.addEventListener(
            'input',
            function () {
 
                settings.lineHeight =
                    parseFloat(
                        this.value
                    );
 
                applySettings();
 
                saveSettings();
 
                updateSettingsUI();


            if (rect.width === 0 || rect.height === 0) {
                popover.style.display = 'none';
                return;
             }
             }
        );
        /* -----------------------------
          阅读宽度
          ----------------------------- */
        var maxWidth =
            document.getElementById(
                'reader-max-width'
            );
        maxWidth.addEventListener(
            'input',
            function () {
                settings.maxWidth =
                    parseInt(
                        this.value,
                        10
                    );
                applySettings();
                saveSettings();
                updateSettingsUI();
            }
        );
        /* -----------------------------
          字体
          ----------------------------- */
        document
            .querySelectorAll(
                '.reader-font-button'
            )
            .forEach(function (button) {
                button.addEventListener(
                    'click',
                    function () {
                        settings.fontFamily =
                            this.dataset.font;
                        applySettings();
                        saveSettings();


                        updateSettingsUI();
            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();


        document
                var title = (window.mw && mw.config && mw.config.get('wgTitle')) || document.title;
            .getElementById(
                var site = (window.mw && mw.config && mw.config.get('wgSiteName')) || 'Dhamma.cn';
                'reader-settings-reset'
                 var url = getShortUrl();
            )
            .addEventListener(
                'click',
                 function () {


                    settings =
                var output =  
                        Object.assign(
                    '“' + currentText + '”\n\n' +
                            {},
                    '----------------------------------------\n' +
                            defaults
                     '法谈摘自:' + site + ' 《' + title + '》\n' +
                        );
                     '该篇网址:' + url + '\n' +
 
                     '转载请保持原文,随喜分享,Sadhu!';
                     applySettings();
 
                     saveSettings();
 
                     updateSettingsUI();


                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);
                 }
                 }
             );
             };
 
    }
 
 
    /* =====================================================
      9. 更新界面
      ===================================================== */
 
    function updateSettingsUI() {
 
 
        /* -----------------------------
          主题按钮
          ----------------------------- */
 
        document
            .querySelectorAll(
                '.reader-theme-button'
            )
            .forEach(function (button) {
 
                button.classList.toggle(
                    'active',
                    button.dataset.theme ===
                    settings.theme
                );
 
            });
 
 
        /* -----------------------------
          字号
          ----------------------------- */
 
        var fontSize =
            document.getElementById(
                'reader-font-size'
            );
 
        var fontSizeValue =
            document.getElementById(
                'reader-font-size-value'
            );
 
        if (fontSize) {
 
            fontSize.value =
                settings.fontSize;
 
            fontSizeValue.textContent =
                settings.fontSize + 'px';
 
        }
 
 
        /* -----------------------------
          行距
          ----------------------------- */
 
        var lineHeight =
            document.getElementById(
                'reader-line-height'
            );
 
        var lineHeightValue =
            document.getElementById(
                'reader-line-height-value'
            );
 
        if (lineHeight) {
 
            lineHeight.value =
                settings.lineHeight;
 
            lineHeightValue.textContent =
                settings.lineHeight;
 
        }
 
 
        /* -----------------------------
          阅读宽度
          ----------------------------- */
 
        var maxWidth =
            document.getElementById(
                'reader-max-width'
            );
 
        var maxWidthValue =
            document.getElementById(
                'reader-max-width-value'
            );
 
        if (maxWidth) {
 
            maxWidth.value =
                settings.maxWidth;
 
            maxWidthValue.textContent =
                settings.maxWidth + 'px';
 
         }
         }
        /* -----------------------------
          字体
          ----------------------------- */
        document
            .querySelectorAll(
                '.reader-font-button'
            )
            .forEach(function (button) {
                button.classList.toggle(
                    'active',
                    button.dataset.font ===
                    settings.fontFamily
                );
            });
     }
     }


 
     function showSuccess(btn, popover) {
    /* =====================================================
         btn.innerText = '✅ 已复制开示及出处';
      10. 点击页面其他地方关闭面板
        btn.style.background = '#2e7d32';
      ===================================================== */
        setTimeout(function () {
 
            btn.innerText = '📋 复制该段开示(带出处)';
     function bindOutsideClick() {
            btn.style.background = '#4d6b57';
 
            popover.style.display = 'none';
         document.addEventListener(
        }, 1200);
            'click',
            function (event) {
 
                var panel =
                    document.getElementById(
                        'reader-settings-panel'
                    );
 
                var button =
                    document.getElementById(
                        'reader-settings-button'
                    );
 
                if (!panel || !button) {
                    return;
                }
 
 
                if (
                    panel.contains(event.target) ||
                    button.contains(event.target)
                ) {
                    return;
                }
 
 
                panel.classList.remove(
                    'reader-settings-open'
                );
 
            }
        );
 
     }
     }


 
    function fallbackCopy(text, btn, popover) {
    /* =====================================================
        var ta = document.createElement('textarea');
      11. 初始化
        ta.value = text;
      ===================================================== */
        ta.style.position = 'fixed';
 
        ta.style.opacity = '0';
    function initReaderSettings() {
        document.body.appendChild(ta);
 
         ta.select();
         applySettings();
         document.execCommand('copy');
 
         document.body.removeChild(ta);
         createSettingsButton();
         showSuccess(btn, popover);
 
         createSettingsPanel();
 
         bindOutsideClick();
 
     }
     }


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


     /*
     document.addEventListener('mousedown', function (e) {
    * MediaWiki 页面加载完成以后执行。
         var pop = document.getElementById('dhamma-copy-popover');
    */
         if (pop && !pop.contains(e.target)) {
/* =====================================================
            pop.style.display = 'none';
  MediaWiki 初始化
         }
  ===================================================== */
 
function startReaderSettings() {
 
    if (
         document.getElementById(
            'reader-settings-button'
        )
    ) {
         return;
    }
 
    initReaderSettings();
}
 
 
/*
* MediaWiki 页面加载完成后执行。
*
* 使用 mw.loader.using + jQuery ready,
* 避免 Common.js 加载时 DOMContentLoaded
* 已经执行完毕的问题。
*/
 
if (
    typeof mw !== 'undefined' &&
    mw.loader
) {
 
    mw.loader.using([], function () {
 
         $(startReaderSettings);
 
     });
     });
 
})();
} else {
 
    if (
        document.readyState === 'loading'
    ) {
 
        document.addEventListener(
            'DOMContentLoaded',
            startReaderSettings
        );
 
    } else {
 
        startReaderSettings();
 
    }
 
}
 
 
 
 
/* =========================================================
  Dhamma.cn 法谈划词引用
  ========================================================= */
 
importScript('MediaWiki:QuoteCopy.js');

2026年9月19日 (六) 22:28的版本

/* =========================================================
   Dhamma.cn 划词复制开示及短网址落款 - 独立稳定版
   ========================================================= */
(function () {
    if (window.dhammaCopyLoaded) return;
    window.dhammaCopyLoaded = true;

    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;
    }

    function getShortUrl() {
        var link = document.querySelector('link[rel="shortlink"]');
        if (link && link.href) {
            return link.href.indexOf('http') === 0 ? link.href : window.location.origin + link.href;
        }
        if (window.mw && mw.config && mw.config.get('wgShortUrl')) {
            var shortUrl = mw.config.get('wgShortUrl');
            return shortUrl.indexOf('http') === 0 ? shortUrl : window.location.origin + shortUrl;
        }
        var sidebarLink = document.querySelector('#t-shorturl a, #t-permalink a');
        if (sidebarLink && sidebarLink.href) {
            return sidebarLink.href.indexOf('http') === 0 ? sidebarLink.href : window.location.origin + sidebarLink.href;
        }
        return window.location.href.split('#')[0].split('?')[0];
    }

    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();

                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 url = getShortUrl();

                var output = 
                    '“' + currentText + '”\n\n' +
                    '----------------------------------------\n' +
                    '法谈摘自:' + site + ' 《' + title + '》\n' +
                    '该篇网址:' + url + '\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';
        }
    });
})();