有觉性 以安住且中立的心 照见身心的实相
MediaWiki:Common.js:修订间差异
来自Dhamma.cn
小无编辑摘要 |
小无编辑摘要 |
||
| 第1行: | 第1行: | ||
(function () { | (function () { | ||
if (window.dhammaCopyLoaded) return; | if (window.dhammaCopyLoaded) return; | ||
| 第10行: | 第6行: | ||
var cachedShortUrl = ''; | var cachedShortUrl = ''; | ||
// | // 统一把任何子域名(如 reg.dhamma.cn)修正为规范的 www.dhamma.cn | ||
function normalizeUrl(url) { | function normalizeUrl(url) { | ||
if (!url) return url; | if (!url) return url; | ||
| 第16行: | 第12行: | ||
} | } | ||
// 1. | // 1. 异步获取/生成 UrlShortener 真正的 /s/ 短网址 | ||
function getShortUrlAsync() { | function getShortUrlAsync() { | ||
if (cachedShortUrl) return Promise.resolve(cachedShortUrl); | if (cachedShortUrl) return Promise.resolve(cachedShortUrl); | ||
var sLink = document.querySelector('a[href*="/s/"]'); | var sLink = document.querySelector('a[href*="/s/"]'); | ||
if (sLink && sLink.href && sLink.href.indexOf('/s/') !== -1) { | if (sLink && sLink.href && sLink.href.indexOf('/s/') !== -1) { | ||
| 第33行: | 第28行: | ||
} | } | ||
var pageName = (window.mw && mw.config && mw.config.get('wgPageName')) || ''; | var pageName = (window.mw && mw.config && mw.config.get('wgPageName')) || ''; | ||
var scriptPath = (window.mw && mw.config && mw.config.get('wgScriptPath')) || ''; | var scriptPath = (window.mw && mw.config && mw.config.get('wgScriptPath')) || ''; | ||
| 第44行: | 第38行: | ||
} | } | ||
var apiUrl = scriptPath + '/api.php'; | var apiUrl = scriptPath + '/api.php'; | ||
var params = new URLSearchParams(); | var params = new URLSearchParams(); | ||
| 第71行: | 第64行: | ||
} | } | ||
getShortUrlAsync(); | getShortUrlAsync(); | ||
// 2. | // 2. 创建弹窗元素 | ||
function getPopover() { | function getPopover() { | ||
var pop = document.getElementById('dhamma-copy-popover'); | var pop = document.getElementById('dhamma-copy-popover'); | ||
| 第87行: | 第79行: | ||
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; transition:background 0.2s;'; | 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; transition:background 0.2s;'; | ||
btn.onmouseover = function () { if (this.innerText.indexOf('✅') === -1) this.style.background = '#3b5343'; }; | btn.onmouseover = function () { if (this.innerText.indexOf('✅') === -1) this.style.background = '#3b5343'; }; | ||
btn.onmouseout = function () { if (this.innerText.indexOf('✅') === -1) this.style.background = '#4d6b57'; }; | btn.onmouseout = function () { if (this.innerText.indexOf('✅') === -1) this.style.background = '#4d6b57'; }; | ||
| 第99行: | 第90行: | ||
var currentText = ''; | var currentText = ''; | ||
function handleSelection() { | function handleSelection() { | ||
var popover = getPopover(); | var popover = getPopover(); | ||
| 第143行: | 第133行: | ||
var site = (window.mw && mw.config && mw.config.get('wgSiteName')) || 'Dhamma.cn'; | var site = (window.mw && mw.config && mw.config.get('wgSiteName')) || 'Dhamma.cn'; | ||
var output = | var output = | ||
'“' + currentText + '”\n\n' + | '“' + currentText + '”\n\n' + | ||
| 第166行: | 第155行: | ||
} | } | ||
function showSuccess(btn, popover) { | function showSuccess(btn, popover) { | ||
btn.innerText = '✅ 已复制开示及出处'; | btn.innerText = '✅ 已复制开示及出处'; | ||
| 第177行: | 第165行: | ||
} | } | ||
function fallbackCopy(text, btn, popover) { | function fallbackCopy(text, btn, popover) { | ||
var ta = document.createElement('textarea'); | var ta = document.createElement('textarea'); | ||
| 第190行: | 第177行: | ||
} | } | ||
document.addEventListener('mouseup', function () { setTimeout(handleSelection, 30); }); | document.addEventListener('mouseup', function () { setTimeout(handleSelection, 30); }); | ||
document.addEventListener('touchend', function () { setTimeout(handleSelection, 30); }); | document.addEventListener('touchend', function () { setTimeout(handleSelection, 30); }); | ||
| 第202行: | 第188行: | ||
} | } | ||
if (document.readyState === 'loading') { | if (document.readyState === 'loading') { | ||
document.addEventListener('DOMContentLoaded', initDhammaCopy); | document.addEventListener('DOMContentLoaded', initDhammaCopy); | ||
2026年9月19日 (六) 23:26的版本
(function () {
if (window.dhammaCopyLoaded) return;
window.dhammaCopyLoaded = true;
function initDhammaCopy() {
var cachedShortUrl = '';
// 统一把任何子域名(如 reg.dhamma.cn)修正为规范的 www.dhamma.cn
function normalizeUrl(url) {
if (!url) return url;
return url.replace(/:\/\/[^\/]+/, '://www.dhamma.cn');
}
// 1. 异步获取/生成 UrlShortener 真正的 /s/ 短网址
function getShortUrlAsync() {
if (cachedShortUrl) return Promise.resolve(cachedShortUrl);
var sLink = document.querySelector('a[href*="/s/"]');
if (sLink && sLink.href && sLink.href.indexOf('/s/') !== -1) {
cachedShortUrl = normalizeUrl(sLink.href);
return Promise.resolve(cachedShortUrl);
}
var tShort = document.querySelector('#t-shorturl a');
if (tShort && tShort.href && tShort.href.indexOf('/s/') !== -1) {
cachedShortUrl = normalizeUrl(tShort.href);
return Promise.resolve(cachedShortUrl);
}
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 = 'https://www.dhamma.cn' + scriptPath + '/index.php?title=' + pageName;
} else {
targetUrl = normalizeUrl(window.location.href.split('?')[0].split('#')[0]);
}
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 = normalizeUrl(data.shortenurl.shorturl);
} else {
cachedShortUrl = targetUrl;
}
return cachedShortUrl;
})
.catch(function () {
cachedShortUrl = targetUrl;
return cachedShortUrl;
});
}
getShortUrlAsync();
// 2. 创建弹窗元素
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; transition:background 0.2s;';
btn.onmouseover = function () { if (this.innerText.indexOf('✅') === -1) this.style.background = '#3b5343'; };
btn.onmouseout = function () { if (this.innerText.indexOf('✅') === -1) this.style.background = '#4d6b57'; };
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';
}
});
}
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', initDhammaCopy);
} else {
initDhammaCopy();
}
})();
