<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans">
	<id>https://www.dhamma.cn/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AQuoteCopy.js</id>
	<title>MediaWiki:QuoteCopy.js - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.dhamma.cn/index.php?action=history&amp;feed=atom&amp;title=MediaWiki%3AQuoteCopy.js"/>
	<link rel="alternate" type="text/html" href="https://www.dhamma.cn/index.php?title=MediaWiki:QuoteCopy.js&amp;action=history"/>
	<updated>2026-09-26T13:00:25Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://www.dhamma.cn/index.php?title=MediaWiki:QuoteCopy.js&amp;diff=13037&amp;oldid=prev</id>
		<title>2026年9月19日 (六) 14:18 法藏</title>
		<link rel="alternate" type="text/html" href="https://www.dhamma.cn/index.php?title=MediaWiki:QuoteCopy.js&amp;diff=13037&amp;oldid=prev"/>
		<updated>2026-09-19T14:18:10Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://www.dhamma.cn/index.php?title=MediaWiki:QuoteCopy.js&amp;amp;diff=13037&amp;amp;oldid=13025&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>法藏</name></author>
	</entry>
	<entry>
		<id>https://www.dhamma.cn/index.php?title=MediaWiki:QuoteCopy.js&amp;diff=13025&amp;oldid=prev</id>
		<title>法藏：​创建页面，内容为“/* =========================================================    Dhamma.cn    QuoteCopy.js     功能：    选中文字        ↓    松开鼠标        ↓    出现引用工具        ↓    复制原文 / 复制出处 / 复制学术脚注     MediaWiki 1.43    使用现有 UrlShortener    ========================================================= */  (function () {     &#039;use strict&#039;;       /* =====================================================        基本…”</title>
		<link rel="alternate" type="text/html" href="https://www.dhamma.cn/index.php?title=MediaWiki:QuoteCopy.js&amp;diff=13025&amp;oldid=prev"/>
		<updated>2026-09-19T13:18:34Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&lt;span class=&quot;autocomment&quot;&gt;=========================================================    Dhamma.cn    QuoteCopy.js     功能：    选中文字        ↓    松开鼠标        ↓    出现引用工具        ↓    复制原文 / 复制出处 / 复制学术脚注     MediaWiki 1.43    使用现有 UrlShortener    =========================================================：​&lt;/span&gt;  (function () {     &amp;#039;use strict&amp;#039;;       /* =====================================================        基本…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;/* =========================================================&lt;br /&gt;
   Dhamma.cn&lt;br /&gt;
   QuoteCopy.js&lt;br /&gt;
&lt;br /&gt;
   功能：&lt;br /&gt;
   选中文字&lt;br /&gt;
       ↓&lt;br /&gt;
   松开鼠标&lt;br /&gt;
       ↓&lt;br /&gt;
   出现引用工具&lt;br /&gt;
       ↓&lt;br /&gt;
   复制原文 / 复制出处 / 复制学术脚注&lt;br /&gt;
&lt;br /&gt;
   MediaWiki 1.43&lt;br /&gt;
   使用现有 UrlShortener&lt;br /&gt;
   ========================================================= */&lt;br /&gt;
&lt;br /&gt;
(function () {&lt;br /&gt;
    &amp;#039;use strict&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       基本设置&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    var MIN_LENGTH = 8;&lt;br /&gt;
    var MAX_LENGTH = 8000;&lt;br /&gt;
&lt;br /&gt;
    var popup = null;&lt;br /&gt;
&lt;br /&gt;
    var selectedText = &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
    /*&lt;br /&gt;
     * 当前页面短网址。&lt;br /&gt;
     *&lt;br /&gt;
     * 同一个页面只请求一次。&lt;br /&gt;
     */&lt;br /&gt;
    var pageShortUrl = null;&lt;br /&gt;
&lt;br /&gt;
    var shortUrlPromise = null;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       1. 判断是否启用&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function shouldEnable() {&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 只在 Main namespace&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            mw.config.get(&amp;#039;wgNamespaceNumber&amp;#039;) !== 0&lt;br /&gt;
        ) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 只在普通阅读页面&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            mw.config.get(&amp;#039;wgAction&amp;#039;) !== &amp;#039;view&amp;#039;&lt;br /&gt;
        ) {&lt;br /&gt;
            return false;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 如果明确存在引用元数据，&lt;br /&gt;
         * 启用。&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            document.getElementById(&lt;br /&gt;
                &amp;#039;dhamma-quote-metadata&amp;#039;&lt;br /&gt;
            )&lt;br /&gt;
        ) {&lt;br /&gt;
            return true;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 如果属于：&lt;br /&gt;
         *&lt;br /&gt;
         * 分类:隆波帕默尊者&lt;br /&gt;
         *&lt;br /&gt;
         * 自动启用。&lt;br /&gt;
         */&lt;br /&gt;
        var categories =&lt;br /&gt;
            mw.config.get(&amp;#039;wgCategories&amp;#039;) || [];&lt;br /&gt;
&lt;br /&gt;
        return categories.indexOf(&lt;br /&gt;
            &amp;#039;隆波帕默尊者&amp;#039;&lt;br /&gt;
        ) !== -1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       2. 获取引用信息&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function getMetadata() {&lt;br /&gt;
&lt;br /&gt;
        var metadata =&lt;br /&gt;
            document.getElementById(&lt;br /&gt;
                &amp;#039;dhamma-quote-metadata&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 默认设置&lt;br /&gt;
         */&lt;br /&gt;
        var result = {&lt;br /&gt;
            author: &amp;#039;&amp;#039;,&lt;br /&gt;
            source: &amp;#039;Dhamma.cn&amp;#039;,&lt;br /&gt;
            title: &amp;#039;&amp;#039;,&lt;br /&gt;
            date: &amp;#039;&amp;#039;&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 如果页面有 metadata&lt;br /&gt;
         */&lt;br /&gt;
        if (metadata) {&lt;br /&gt;
&lt;br /&gt;
            result.author =&lt;br /&gt;
                metadata.getAttribute(&lt;br /&gt;
                    &amp;#039;data-author&amp;#039;&lt;br /&gt;
                ) || &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
            result.source =&lt;br /&gt;
                metadata.getAttribute(&lt;br /&gt;
                    &amp;#039;data-source&amp;#039;&lt;br /&gt;
                ) || &amp;#039;Dhamma.cn&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
            result.title =&lt;br /&gt;
                metadata.getAttribute(&lt;br /&gt;
                    &amp;#039;data-title&amp;#039;&lt;br /&gt;
                ) || &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
            result.date =&lt;br /&gt;
                metadata.getAttribute(&lt;br /&gt;
                    &amp;#039;data-date&amp;#039;&lt;br /&gt;
                ) || &amp;#039;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
            return result;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 没有 metadata 时，&lt;br /&gt;
         * 如果是隆波分类，&lt;br /&gt;
         * 自动判断作者。&lt;br /&gt;
         */&lt;br /&gt;
        var categories =&lt;br /&gt;
            mw.config.get(&amp;#039;wgCategories&amp;#039;) || [];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            categories.indexOf(&lt;br /&gt;
                &amp;#039;隆波帕默尊者&amp;#039;&lt;br /&gt;
            ) !== -1&lt;br /&gt;
        ) {&lt;br /&gt;
            result.author =&lt;br /&gt;
                &amp;#039;隆波帕默尊者&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return result;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       3. 获取页面标题&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function getPageTitle() {&lt;br /&gt;
&lt;br /&gt;
        var metadata =&lt;br /&gt;
            getMetadata();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * metadata 中指定标题&lt;br /&gt;
         * 优先使用。&lt;br /&gt;
         */&lt;br /&gt;
        if (metadata.title) {&lt;br /&gt;
            return metadata.title;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * MediaWiki 页面标题&lt;br /&gt;
         */&lt;br /&gt;
        var title =&lt;br /&gt;
            mw.config.get(&amp;#039;wgTitle&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        if (title) {&lt;br /&gt;
            return title;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 后备方案&lt;br /&gt;
         */&lt;br /&gt;
        var heading =&lt;br /&gt;
            document.querySelector(&lt;br /&gt;
                &amp;#039;#firstHeading, .mw-page-title-main&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
        if (heading) {&lt;br /&gt;
            return heading.textContent.trim();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 最终后备&lt;br /&gt;
         */&lt;br /&gt;
        return document.title&lt;br /&gt;
            .replace(/\s*-\s*.*$/, &amp;#039;&amp;#039;)&lt;br /&gt;
            .trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       4. 标题格式处理&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function formatTitle(title) {&lt;br /&gt;
&lt;br /&gt;
        if (!title) {&lt;br /&gt;
            return &amp;#039;&amp;#039;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 如果本身已经有《》&lt;br /&gt;
         * 不重复添加。&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            title.charAt(0) === &amp;#039;《&amp;#039; &amp;amp;&amp;amp;&lt;br /&gt;
            title.charAt(&lt;br /&gt;
                title.length - 1&lt;br /&gt;
            ) === &amp;#039;》&amp;#039;&lt;br /&gt;
        ) {&lt;br /&gt;
            return title;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return &amp;#039;《&amp;#039; + title + &amp;#039;》&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       5. 创建引用 Popup&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function createPopup() {&lt;br /&gt;
&lt;br /&gt;
        if (popup) {&lt;br /&gt;
            return popup;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup =&lt;br /&gt;
            document.createElement(&amp;#039;div&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        popup.id =&lt;br /&gt;
            &amp;#039;dhamma-quote-popup&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.setAttribute(&lt;br /&gt;
            &amp;#039;role&amp;#039;,&lt;br /&gt;
            &amp;#039;dialog&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.setAttribute(&lt;br /&gt;
            &amp;#039;aria-label&amp;#039;,&lt;br /&gt;
            &amp;#039;Dhamma.cn 引用工具&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.innerHTML =&lt;br /&gt;
&lt;br /&gt;
            &amp;#039;&amp;lt;div class=&amp;quot;dhamma-quote-popup-inner&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                &amp;#039;&amp;lt;div class=&amp;quot;dhamma-quote-popup-label&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
                    &amp;#039;引用此段开示&amp;#039; +&lt;br /&gt;
                &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                &amp;#039;&amp;lt;div class=&amp;quot;dhamma-quote-popup-buttons&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                    &amp;#039;&amp;lt;button type=&amp;quot;button&amp;quot; &amp;#039; +&lt;br /&gt;
                        &amp;#039;class=&amp;quot;dhamma-quote-button&amp;quot; &amp;#039; +&lt;br /&gt;
                        &amp;#039;data-action=&amp;quot;copy&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
                        &amp;#039;复制原文&amp;#039; +&lt;br /&gt;
                    &amp;#039;&amp;lt;/button&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                    &amp;#039;&amp;lt;button type=&amp;quot;button&amp;quot; &amp;#039; +&lt;br /&gt;
                        &amp;#039;class=&amp;quot;dhamma-quote-button dhamma-quote-primary&amp;quot; &amp;#039; +&lt;br /&gt;
                        &amp;#039;data-action=&amp;quot;source&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
                        &amp;#039;复制并附出处&amp;#039; +&lt;br /&gt;
                    &amp;#039;&amp;lt;/button&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                    &amp;#039;&amp;lt;button type=&amp;quot;button&amp;quot; &amp;#039; +&lt;br /&gt;
                        &amp;#039;class=&amp;quot;dhamma-quote-button&amp;quot; &amp;#039; +&lt;br /&gt;
                        &amp;#039;data-action=&amp;quot;footnote&amp;quot;&amp;gt;&amp;#039; +&lt;br /&gt;
                        &amp;#039;复制学术脚注&amp;#039; +&lt;br /&gt;
                    &amp;#039;&amp;lt;/button&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                &amp;#039;&amp;lt;/div&amp;gt;&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
            &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        document.body.appendChild(&lt;br /&gt;
            popup&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 不让点击 Popup 时&lt;br /&gt;
         * 改变当前选区。&lt;br /&gt;
         */&lt;br /&gt;
        popup.addEventListener(&lt;br /&gt;
            &amp;#039;mousedown&amp;#039;,&lt;br /&gt;
            function (event) {&lt;br /&gt;
&lt;br /&gt;
                event.preventDefault();&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 按钮事件&lt;br /&gt;
         */&lt;br /&gt;
        popup.addEventListener(&lt;br /&gt;
            &amp;#039;click&amp;#039;,&lt;br /&gt;
            function (event) {&lt;br /&gt;
&lt;br /&gt;
                var button =&lt;br /&gt;
                    event.target.closest(&lt;br /&gt;
                        &amp;#039;.dhamma-quote-button&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                if (!button) {&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                var action =&lt;br /&gt;
                    button.getAttribute(&lt;br /&gt;
                        &amp;#039;data-action&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                if (&lt;br /&gt;
                    action === &amp;#039;copy&amp;#039;&lt;br /&gt;
                ) {&lt;br /&gt;
                    copyPlainText();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                if (&lt;br /&gt;
                    action === &amp;#039;source&amp;#039;&lt;br /&gt;
                ) {&lt;br /&gt;
                    copyWithSource();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                if (&lt;br /&gt;
                    action === &amp;#039;footnote&amp;#039;&lt;br /&gt;
                ) {&lt;br /&gt;
                    copyFootnote();&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return popup;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       6. 获取选中文字&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function getSelectionData() {&lt;br /&gt;
&lt;br /&gt;
        var selection =&lt;br /&gt;
            window.getSelection();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            !selection ||&lt;br /&gt;
            selection.rangeCount === 0&lt;br /&gt;
        ) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var text =&lt;br /&gt;
            selection.toString().trim();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (!text) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            text.length &amp;lt; MIN_LENGTH&lt;br /&gt;
        ) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            text.length &amp;gt; MAX_LENGTH&lt;br /&gt;
        ) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var range =&lt;br /&gt;
            selection.getRangeAt(0);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var container =&lt;br /&gt;
            range.commonAncestorContainer;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            container.nodeType ===&lt;br /&gt;
            Node.TEXT_NODE&lt;br /&gt;
        ) {&lt;br /&gt;
            container =&lt;br /&gt;
                container.parentElement;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (!container) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 必须来自正文。&lt;br /&gt;
         */&lt;br /&gt;
        var content =&lt;br /&gt;
            container.closest(&lt;br /&gt;
                &amp;#039;#mw-content-text .mw-parser-output&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (!content) {&lt;br /&gt;
            return null;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return {&lt;br /&gt;
            text: normalizeText(text),&lt;br /&gt;
            range: range.cloneRange()&lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       7. 清理选中文字&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function normalizeText(text) {&lt;br /&gt;
&lt;br /&gt;
        return text&lt;br /&gt;
&lt;br /&gt;
            .replace(&lt;br /&gt;
                /\u00a0/g,&lt;br /&gt;
                &amp;#039; &amp;#039;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .replace(&lt;br /&gt;
                /\r\n/g,&lt;br /&gt;
                &amp;#039;\n&amp;#039;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .replace(&lt;br /&gt;
                /[ \t]+\n/g,&lt;br /&gt;
                &amp;#039;\n&amp;#039;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .replace(&lt;br /&gt;
                /\n[ \t]+/g,&lt;br /&gt;
                &amp;#039;\n&amp;#039;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .replace(&lt;br /&gt;
                /\n{3,}/g,&lt;br /&gt;
                &amp;#039;\n\n&amp;#039;&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .trim();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       8. 获取 Canonical URL&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function getCanonicalUrl() {&lt;br /&gt;
&lt;br /&gt;
        var url =&lt;br /&gt;
            mw.config.get(&lt;br /&gt;
                &amp;#039;wgCanonicalUrl&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (url) {&lt;br /&gt;
            return url;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 后备&lt;br /&gt;
         */&lt;br /&gt;
        var pageName =&lt;br /&gt;
            mw.config.get(&lt;br /&gt;
                &amp;#039;wgPageName&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            pageName &amp;amp;&amp;amp;&lt;br /&gt;
            mw.util &amp;amp;&amp;amp;&lt;br /&gt;
            mw.util.getUrl&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            return mw.util.getUrl(&lt;br /&gt;
                pageName&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return window.location.href;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       9. 获取短网址&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function getShortUrl() {&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 当前页面已经取得。&lt;br /&gt;
         */&lt;br /&gt;
        if (pageShortUrl) {&lt;br /&gt;
&lt;br /&gt;
            return Promise.resolve(&lt;br /&gt;
                pageShortUrl&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 已经正在请求。&lt;br /&gt;
         */&lt;br /&gt;
        if (shortUrlPromise) {&lt;br /&gt;
&lt;br /&gt;
            return shortUrlPromise;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 调用 MediaWiki UrlShortener&lt;br /&gt;
         */&lt;br /&gt;
        shortUrlPromise =&lt;br /&gt;
            new mw.Api().post({&lt;br /&gt;
&lt;br /&gt;
                action: &amp;#039;shortenurl&amp;#039;,&lt;br /&gt;
&lt;br /&gt;
                url:&lt;br /&gt;
                    getCanonicalUrl()&lt;br /&gt;
&lt;br /&gt;
            }).then(&lt;br /&gt;
&lt;br /&gt;
                function (data) {&lt;br /&gt;
&lt;br /&gt;
                    if (&lt;br /&gt;
                        data &amp;amp;&amp;amp;&lt;br /&gt;
                        data.shortenurl &amp;amp;&amp;amp;&lt;br /&gt;
                        data.shortenurl.shorturl&lt;br /&gt;
                    ) {&lt;br /&gt;
&lt;br /&gt;
                        pageShortUrl =&lt;br /&gt;
                            data.shortenurl.shorturl;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                        return pageShortUrl;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    throw new Error(&lt;br /&gt;
                        &amp;#039;UrlShortener 未返回短网址&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            ).catch(&lt;br /&gt;
&lt;br /&gt;
                function (error) {&lt;br /&gt;
&lt;br /&gt;
                    shortUrlPromise =&lt;br /&gt;
                        null;&lt;br /&gt;
&lt;br /&gt;
                    throw error;&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return shortUrlPromise;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       10. 获取日期&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function getAccessDate() {&lt;br /&gt;
&lt;br /&gt;
        var now =&lt;br /&gt;
            new Date();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var year =&lt;br /&gt;
            now.getFullYear();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var month =&lt;br /&gt;
            String(&lt;br /&gt;
                now.getMonth() + 1&lt;br /&gt;
            ).padStart(&lt;br /&gt;
                2,&lt;br /&gt;
                &amp;#039;0&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var day =&lt;br /&gt;
            String(&lt;br /&gt;
                now.getDate()&lt;br /&gt;
            ).padStart(&lt;br /&gt;
                2,&lt;br /&gt;
                &amp;#039;0&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        return (&lt;br /&gt;
            year +&lt;br /&gt;
            &amp;#039;-&amp;#039; +&lt;br /&gt;
            month +&lt;br /&gt;
            &amp;#039;-&amp;#039; +&lt;br /&gt;
            day&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       11. Clipboard&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function copyText(&lt;br /&gt;
        text,&lt;br /&gt;
        successMessage&lt;br /&gt;
    ) {&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 现代浏览器&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            navigator.clipboard &amp;amp;&amp;amp;&lt;br /&gt;
            window.isSecureContext&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            navigator.clipboard&lt;br /&gt;
                .writeText(text)&lt;br /&gt;
                .then(&lt;br /&gt;
&lt;br /&gt;
                    function () {&lt;br /&gt;
&lt;br /&gt;
                        showMessage(&lt;br /&gt;
                            successMessage&lt;br /&gt;
                        );&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                )&lt;br /&gt;
                .catch(&lt;br /&gt;
&lt;br /&gt;
                    function () {&lt;br /&gt;
&lt;br /&gt;
                        fallbackCopy(&lt;br /&gt;
                            text,&lt;br /&gt;
                            successMessage&lt;br /&gt;
                        );&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 后备&lt;br /&gt;
         */&lt;br /&gt;
        fallbackCopy(&lt;br /&gt;
            text,&lt;br /&gt;
            successMessage&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       12. 备用复制&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function fallbackCopy(&lt;br /&gt;
        text,&lt;br /&gt;
        successMessage&lt;br /&gt;
    ) {&lt;br /&gt;
&lt;br /&gt;
        var textarea =&lt;br /&gt;
            document.createElement(&lt;br /&gt;
                &amp;#039;textarea&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        textarea.value =&lt;br /&gt;
            text;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        textarea.setAttribute(&lt;br /&gt;
            &amp;#039;readonly&amp;#039;,&lt;br /&gt;
            &amp;#039;&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        textarea.style.position =&lt;br /&gt;
            &amp;#039;fixed&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        textarea.style.left =&lt;br /&gt;
            &amp;#039;-9999px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        textarea.style.top =&lt;br /&gt;
            &amp;#039;0&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        document.body.appendChild(&lt;br /&gt;
            textarea&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        textarea.focus();&lt;br /&gt;
        textarea.select();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var success = false;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        try {&lt;br /&gt;
&lt;br /&gt;
            success =&lt;br /&gt;
                document.execCommand(&lt;br /&gt;
                    &amp;#039;copy&amp;#039;&lt;br /&gt;
                );&lt;br /&gt;
&lt;br /&gt;
        } catch (error) {&lt;br /&gt;
&lt;br /&gt;
            success = false;&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        document.body.removeChild(&lt;br /&gt;
            textarea&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (success) {&lt;br /&gt;
&lt;br /&gt;
            showMessage(&lt;br /&gt;
                successMessage&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            showMessage(&lt;br /&gt;
                &amp;#039;复制失败，请使用 Ctrl+C。&amp;#039;&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       13. 复制原文&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function copyPlainText() {&lt;br /&gt;
&lt;br /&gt;
        if (!selectedText) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        copyText(&lt;br /&gt;
            selectedText,&lt;br /&gt;
            &amp;#039;已复制选中的法谈内容&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        hidePopup();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       14. 复制并附出处&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function copyWithSource() {&lt;br /&gt;
&lt;br /&gt;
        if (!selectedText) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        showMessage(&lt;br /&gt;
            &amp;#039;正在生成 Dhamma.cn 短网址……&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        getShortUrl()&lt;br /&gt;
&lt;br /&gt;
            .then(&lt;br /&gt;
&lt;br /&gt;
                function (shortUrl) {&lt;br /&gt;
&lt;br /&gt;
                    var metadata =&lt;br /&gt;
                        getMetadata();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var title =&lt;br /&gt;
                        formatTitle(&lt;br /&gt;
                            getPageTitle()&lt;br /&gt;
                        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var output =&lt;br /&gt;
                        selectedText +&lt;br /&gt;
                        &amp;#039;\n\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;----------------------------------------&amp;#039; +&lt;br /&gt;
                        &amp;#039;\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;法谈摘自：&amp;#039; +&lt;br /&gt;
                        metadata.source +&lt;br /&gt;
                        &amp;#039; &amp;#039; +&lt;br /&gt;
                        title +&lt;br /&gt;
                        &amp;#039;\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;该篇网址：&amp;#039; +&lt;br /&gt;
                        shortUrl +&lt;br /&gt;
                        &amp;#039;\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;转载请保持原文，随喜分享，Sadhu！&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    copyText(&lt;br /&gt;
                        output,&lt;br /&gt;
                        &amp;#039;已复制法谈内容及出处&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    hidePopup();&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .catch(&lt;br /&gt;
&lt;br /&gt;
                function (error) {&lt;br /&gt;
&lt;br /&gt;
                    console.error(&lt;br /&gt;
                        &amp;#039;Dhamma.cn UrlShortener:&amp;#039;,&lt;br /&gt;
                        error&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    /*&lt;br /&gt;
                     * 短网址失败时，&lt;br /&gt;
                     * 不复制长 URL。&lt;br /&gt;
                     */&lt;br /&gt;
                    var metadata =&lt;br /&gt;
                        getMetadata();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var title =&lt;br /&gt;
                        formatTitle(&lt;br /&gt;
                            getPageTitle()&lt;br /&gt;
                        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var output =&lt;br /&gt;
                        selectedText +&lt;br /&gt;
                        &amp;#039;\n\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;----------------------------------------&amp;#039; +&lt;br /&gt;
                        &amp;#039;\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;法谈摘自：&amp;#039; +&lt;br /&gt;
                        metadata.source +&lt;br /&gt;
                        &amp;#039; &amp;#039; +&lt;br /&gt;
                        title +&lt;br /&gt;
                        &amp;#039;\n&amp;#039; +&lt;br /&gt;
&lt;br /&gt;
                        &amp;#039;转载请保持原文，随喜分享，Sadhu！&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    copyText(&lt;br /&gt;
                        output,&lt;br /&gt;
                        &amp;#039;短网址暂时无法生成，已复制出处&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    hidePopup();&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       15. 学术脚注&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function copyFootnote() {&lt;br /&gt;
&lt;br /&gt;
        if (!selectedText) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        showMessage(&lt;br /&gt;
            &amp;#039;正在生成 Dhamma.cn 短网址……&amp;#039;&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        getShortUrl()&lt;br /&gt;
&lt;br /&gt;
            .then(&lt;br /&gt;
&lt;br /&gt;
                function (shortUrl) {&lt;br /&gt;
&lt;br /&gt;
                    var metadata =&lt;br /&gt;
                        getMetadata();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var author =&lt;br /&gt;
                        metadata.author ||&lt;br /&gt;
                        &amp;#039;隆波帕默尊者&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var source =&lt;br /&gt;
                        metadata.source ||&lt;br /&gt;
                        &amp;#039;Dhamma.cn&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var title =&lt;br /&gt;
                        getPageTitle();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var output =&lt;br /&gt;
                        author +&lt;br /&gt;
                        &amp;#039;：《&amp;#039; +&lt;br /&gt;
                        title +&lt;br /&gt;
                        &amp;#039;》，&amp;#039; +&lt;br /&gt;
                        source +&lt;br /&gt;
                        &amp;#039;，&amp;#039; +&lt;br /&gt;
                        shortUrl +&lt;br /&gt;
                        &amp;#039;（访问日期：&amp;#039; +&lt;br /&gt;
                        getAccessDate() +&lt;br /&gt;
                        &amp;#039;）。&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    copyText(&lt;br /&gt;
                        output,&lt;br /&gt;
                        &amp;#039;已复制学术脚注&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    hidePopup();&lt;br /&gt;
                }&lt;br /&gt;
            )&lt;br /&gt;
&lt;br /&gt;
            .catch(&lt;br /&gt;
&lt;br /&gt;
                function (error) {&lt;br /&gt;
&lt;br /&gt;
                    console.error(&lt;br /&gt;
                        &amp;#039;Dhamma.cn UrlShortener:&amp;#039;,&lt;br /&gt;
                        error&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var metadata =&lt;br /&gt;
                        getMetadata();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var author =&lt;br /&gt;
                        metadata.author ||&lt;br /&gt;
                        &amp;#039;隆波帕默尊者&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var source =&lt;br /&gt;
                        metadata.source ||&lt;br /&gt;
                        &amp;#039;Dhamma.cn&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var title =&lt;br /&gt;
                        getPageTitle();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    var output =&lt;br /&gt;
                        author +&lt;br /&gt;
                        &amp;#039;：《&amp;#039; +&lt;br /&gt;
                        title +&lt;br /&gt;
                        &amp;#039;》，&amp;#039; +&lt;br /&gt;
                        source +&lt;br /&gt;
                        &amp;#039;（访问日期：&amp;#039; +&lt;br /&gt;
                        getAccessDate() +&lt;br /&gt;
                        &amp;#039;）。&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    copyText(&lt;br /&gt;
                        output,&lt;br /&gt;
                        &amp;#039;短网址生成失败，已复制脚注&amp;#039;&lt;br /&gt;
                    );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                    hidePopup();&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       16. Popup 定位&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function positionPopup(range) {&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            !popup ||&lt;br /&gt;
            !range&lt;br /&gt;
        ) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var rect =&lt;br /&gt;
            range.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            rect.width === 0 &amp;amp;&amp;amp;&lt;br /&gt;
            rect.height === 0&lt;br /&gt;
        ) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.style.display =&lt;br /&gt;
            &amp;#039;block&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var popupRect =&lt;br /&gt;
            popup.getBoundingClientRect();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var left =&lt;br /&gt;
            rect.left +&lt;br /&gt;
            rect.width / 2 -&lt;br /&gt;
            popupRect.width / 2;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var top =&lt;br /&gt;
            rect.bottom +&lt;br /&gt;
            10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        var margin = 10;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 左边界&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            left &amp;lt; margin&lt;br /&gt;
        ) {&lt;br /&gt;
            left = margin;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 右边界&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            left +&lt;br /&gt;
            popupRect.width &amp;gt;&lt;br /&gt;
            window.innerWidth -&lt;br /&gt;
            margin&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            left =&lt;br /&gt;
                window.innerWidth -&lt;br /&gt;
                popupRect.width -&lt;br /&gt;
                margin;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 底部空间不足&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            top +&lt;br /&gt;
            popupRect.height &amp;gt;&lt;br /&gt;
            window.innerHeight -&lt;br /&gt;
            margin&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            top =&lt;br /&gt;
                rect.top -&lt;br /&gt;
                popupRect.height -&lt;br /&gt;
                10;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        /*&lt;br /&gt;
         * 顶部边界&lt;br /&gt;
         */&lt;br /&gt;
        if (&lt;br /&gt;
            top &amp;lt; margin&lt;br /&gt;
        ) {&lt;br /&gt;
            top = margin;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.style.left =&lt;br /&gt;
            Math.round(&lt;br /&gt;
                left +&lt;br /&gt;
                window.scrollX&lt;br /&gt;
            ) + &amp;#039;px&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.style.top =&lt;br /&gt;
            Math.round(&lt;br /&gt;
                top +&lt;br /&gt;
                window.scrollY&lt;br /&gt;
            ) + &amp;#039;px&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       17. 显示 Popup&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function showPopup(range) {&lt;br /&gt;
&lt;br /&gt;
        createPopup();&lt;br /&gt;
&lt;br /&gt;
        popup.style.display =&lt;br /&gt;
            &amp;#039;block&amp;#039;;&lt;br /&gt;
&lt;br /&gt;
        positionPopup(range);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       18. 隐藏 Popup&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function hidePopup() {&lt;br /&gt;
&lt;br /&gt;
        if (!popup) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        popup.style.display =&lt;br /&gt;
            &amp;#039;none&amp;#039;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       19. MediaWiki 提示&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function showMessage(message) {&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            typeof mw.notify ===&lt;br /&gt;
            &amp;#039;function&amp;#039;&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            mw.notify(&lt;br /&gt;
                message,&lt;br /&gt;
                {&lt;br /&gt;
                    type: &amp;#039;info&amp;#039;,&lt;br /&gt;
                    autoHide: true&lt;br /&gt;
                }&lt;br /&gt;
            );&lt;br /&gt;
&lt;br /&gt;
        } else {&lt;br /&gt;
&lt;br /&gt;
            console.log(&lt;br /&gt;
                message&lt;br /&gt;
            );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       20. 鼠标松开&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function handleMouseUp() {&lt;br /&gt;
&lt;br /&gt;
        setTimeout(&lt;br /&gt;
&lt;br /&gt;
            function () {&lt;br /&gt;
&lt;br /&gt;
                var data =&lt;br /&gt;
                    getSelectionData();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                if (!data) {&lt;br /&gt;
                    return;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                selectedText =&lt;br /&gt;
                    data.text;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
                showPopup(&lt;br /&gt;
                    data.range&lt;br /&gt;
                );&lt;br /&gt;
&lt;br /&gt;
            },&lt;br /&gt;
&lt;br /&gt;
            20&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       21. 点击页面其他位置&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function handleDocumentMouseDown(&lt;br /&gt;
        event&lt;br /&gt;
    ) {&lt;br /&gt;
&lt;br /&gt;
        if (!popup) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            popup.contains(&lt;br /&gt;
                event.target&lt;br /&gt;
            )&lt;br /&gt;
        ) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        hidePopup();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       22. ESC&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function handleKeyDown(event) {&lt;br /&gt;
&lt;br /&gt;
        if (&lt;br /&gt;
            event.key ===&lt;br /&gt;
            &amp;#039;Escape&amp;#039;&lt;br /&gt;
        ) {&lt;br /&gt;
&lt;br /&gt;
            hidePopup();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       23. 页面滚动&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function handleScroll() {&lt;br /&gt;
&lt;br /&gt;
        hidePopup();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       24. 初始化&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
&lt;br /&gt;
        if (!shouldEnable()) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        createPopup();&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&lt;br /&gt;
            &amp;#039;mouseup&amp;#039;,&lt;br /&gt;
            handleMouseUp&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&lt;br /&gt;
            &amp;#039;mousedown&amp;#039;,&lt;br /&gt;
            handleDocumentMouseDown&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&lt;br /&gt;
            &amp;#039;keydown&amp;#039;,&lt;br /&gt;
            handleKeyDown&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        window.addEventListener(&lt;br /&gt;
            &amp;#039;scroll&amp;#039;,&lt;br /&gt;
            handleScroll,&lt;br /&gt;
            { passive: true }&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
        window.addEventListener(&lt;br /&gt;
            &amp;#039;resize&amp;#039;,&lt;br /&gt;
            handleScroll&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    /* =====================================================&lt;br /&gt;
       25. 启动&lt;br /&gt;
       ===================================================== */&lt;br /&gt;
&lt;br /&gt;
    if (&lt;br /&gt;
        document.readyState ===&lt;br /&gt;
        &amp;#039;loading&amp;#039;&lt;br /&gt;
    ) {&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener(&lt;br /&gt;
            &amp;#039;DOMContentLoaded&amp;#039;,&lt;br /&gt;
            init&lt;br /&gt;
        );&lt;br /&gt;
&lt;br /&gt;
    } else {&lt;br /&gt;
&lt;br /&gt;
        init();&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
})();&lt;/div&gt;</summary>
		<author><name>法藏</name></author>
	</entry>
</feed>