「MediaWiki:Common.js」:修訂間差異
無編輯摘要 |
無編輯摘要 |
||
| 第1行: | 第1行: | ||
/** | /** | ||
* | * MediaWiki:Common.js(強化完整版) | ||
* 功能: | |||
* - 語言切換(簡 / 繁) | |||
* - 自動暫存(24小時) | |||
* - 深色模式 | |||
* - 右上角時鐘 | |||
*/ | */ | ||
mw. | mw.loader.using(['mediawiki.util', 'mediawiki.Uri']).then(function () { | ||
$(function () { | |||
/* ========================= | |||
* ① 語言切換(簡 / 繁) | |||
* ========================= */ | |||
var variants = [ | |||
{ code: 'zh-tw', label: '繁體' }, | |||
{ code: 'zh-cn', label: '简体' } | |||
]; | |||
var current = | |||
mw.config.get('wgUserVariant') || | |||
mw.util.getParamValue('variant') || | |||
'zh-tw'; | |||
var $langMenu = $('<span>').css({ | |||
marginLeft: '10px', | |||
fontWeight: 'bold' | |||
}); | }); | ||
variants.forEach(function (v, i) { | |||
var $link = $('<a>') | |||
.text(v.label) | |||
.css({ | |||
cursor: 'pointer', | |||
margin: '0 4px', | |||
color: v.code === current ? '#000' : '#0645ad', | |||
textDecoration: v.code === current ? 'underline' : 'none' | |||
}) | |||
.on('click', function () { | |||
var url = new mw.Uri(window.location.href); | |||
url.query.variant = v.code; | |||
var | window.location.href = url.toString(); | ||
}); | |||
} | |||
$langMenu.append($link); | |||
if (i < variants.length - 1) { | |||
$langMenu.append(' / '); | |||
if ( | |||
} | } | ||
}); | }); | ||
mw.util.addPortletLink( | |||
'p-personal', | |||
'#', | |||
$langMenu.prop('outerHTML'), | |||
'pt-lang-switch', | |||
'語言切換' | |||
); | |||
/* ========================= | |||
* ② 深色模式 | |||
* ========================= */ | |||
var darkBtn = mw.util.addPortletLink( | |||
'p-personal', | |||
'#', | |||
'深色模式', | |||
'pt-darkmode' | |||
); | |||
$(function() { | $(darkBtn).on('click', function (e) { | ||
e.preventDefault(); | |||
$('body').toggleClass('dark-mode'); | |||
var isDark = $('body').hasClass('dark-mode'); | |||
localStorage.setItem('dark-mode', isDark ? '1' : '0'); | |||
}); | |||
if (localStorage.getItem('dark-mode') === '1') { | |||
$('body').addClass('dark-mode'); | |||
} | |||
} | |||
/ | /* ========================= | ||
* ③ 右上角時鐘 | |||
* ========================= */ | |||
function updateClock() { | |||
var now = new Date(); | |||
return now.toLocaleTimeString('zh-TW', { hour12: false }); | |||
} | |||
var $clock = $('<span>') | |||
.attr('id', 'mw-clock') | |||
.css({ | |||
marginLeft: '10px', | |||
fontWeight: 'bold', | |||
fontFamily: 'monospace' | |||
}) | |||
.text(updateClock()); | |||
$('#p-personal').append($clock); | |||
setInterval(function () { | |||
$clock.text(updateClock()); | |||
}, 1000); | |||
/ | /* ========================= | ||
* ④ 自動暫存(24小時) | |||
* ========================= */ | |||
if (mw.config.get('wgAction') === 'edit') { | |||
mw. | |||
var interval = 600000; // 10分鐘 | |||
var expire = 24 * 60 * 60 * 1000; | |||
var | |||
function getKey() { | |||
return 'autosave_' + mw.config.get('wgPageName'); | |||
} | |||
setInterval(function () { | |||
var text = $('#wpTextbox1').val(); | |||
if (!text) return; | |||
var data = { | |||
value: text, | |||
time: Date.now() | |||
}; | |||
localStorage.setItem(getKey(), JSON.stringify(data)); | |||
console.log('已自動暫存'); | |||
}, interval); | |||
var saved = localStorage.getItem(getKey()); | |||
if (saved) { | |||
try { | |||
var data = JSON.parse(saved); | |||
if (Date.now() - data.time < expire) { | |||
if (!$('#wpTextbox1').val()) { | |||
$('#wpTextbox1').val(data.value); | |||
console.log('已還原暫存'); | |||
} | |||
} else { | |||
localStorage.removeItem(getKey()); | |||
} | } | ||
} catch (e) {} | |||
} | } | ||
} | } | ||
var url = new mw.Uri(window.location.href); | /* ========================= | ||
* ⑤ 訪客預設語言(不干擾轉換) | |||
* ========================= */ | |||
var isAnon = mw.config.get('wgUserName') === null; | |||
if (isAnon && !mw.util.getParamValue('variant')) { | |||
var url = new mw.Uri(window.location.href); | |||
url.query.variant = 'zh-tw'; | |||
window.location.replace(url.toString()); | |||
} | |||
}); | }); | ||
}); | }); | ||
於 2026年4月25日 (六) 06:18 的修訂
/**
* MediaWiki:Common.js(強化完整版)
* 功能:
* - 語言切換(簡 / 繁)
* - 自動暫存(24小時)
* - 深色模式
* - 右上角時鐘
*/
mw.loader.using(['mediawiki.util', 'mediawiki.Uri']).then(function () {
$(function () {
/* =========================
* ① 語言切換(簡 / 繁)
* ========================= */
var variants = [
{ code: 'zh-tw', label: '繁體' },
{ code: 'zh-cn', label: '简体' }
];
var current =
mw.config.get('wgUserVariant') ||
mw.util.getParamValue('variant') ||
'zh-tw';
var $langMenu = $('<span>').css({
marginLeft: '10px',
fontWeight: 'bold'
});
variants.forEach(function (v, i) {
var $link = $('<a>')
.text(v.label)
.css({
cursor: 'pointer',
margin: '0 4px',
color: v.code === current ? '#000' : '#0645ad',
textDecoration: v.code === current ? 'underline' : 'none'
})
.on('click', function () {
var url = new mw.Uri(window.location.href);
url.query.variant = v.code;
window.location.href = url.toString();
});
$langMenu.append($link);
if (i < variants.length - 1) {
$langMenu.append(' / ');
}
});
mw.util.addPortletLink(
'p-personal',
'#',
$langMenu.prop('outerHTML'),
'pt-lang-switch',
'語言切換'
);
/* =========================
* ② 深色模式
* ========================= */
var darkBtn = mw.util.addPortletLink(
'p-personal',
'#',
'深色模式',
'pt-darkmode'
);
$(darkBtn).on('click', function (e) {
e.preventDefault();
$('body').toggleClass('dark-mode');
var isDark = $('body').hasClass('dark-mode');
localStorage.setItem('dark-mode', isDark ? '1' : '0');
});
if (localStorage.getItem('dark-mode') === '1') {
$('body').addClass('dark-mode');
}
/* =========================
* ③ 右上角時鐘
* ========================= */
function updateClock() {
var now = new Date();
return now.toLocaleTimeString('zh-TW', { hour12: false });
}
var $clock = $('<span>')
.attr('id', 'mw-clock')
.css({
marginLeft: '10px',
fontWeight: 'bold',
fontFamily: 'monospace'
})
.text(updateClock());
$('#p-personal').append($clock);
setInterval(function () {
$clock.text(updateClock());
}, 1000);
/* =========================
* ④ 自動暫存(24小時)
* ========================= */
if (mw.config.get('wgAction') === 'edit') {
var interval = 600000; // 10分鐘
var expire = 24 * 60 * 60 * 1000;
function getKey() {
return 'autosave_' + mw.config.get('wgPageName');
}
setInterval(function () {
var text = $('#wpTextbox1').val();
if (!text) return;
var data = {
value: text,
time: Date.now()
};
localStorage.setItem(getKey(), JSON.stringify(data));
console.log('已自動暫存');
}, interval);
var saved = localStorage.getItem(getKey());
if (saved) {
try {
var data = JSON.parse(saved);
if (Date.now() - data.time < expire) {
if (!$('#wpTextbox1').val()) {
$('#wpTextbox1').val(data.value);
console.log('已還原暫存');
}
} else {
localStorage.removeItem(getKey());
}
} catch (e) {}
}
}
/* =========================
* ⑤ 訪客預設語言(不干擾轉換)
* ========================= */
var isAnon = mw.config.get('wgUserName') === null;
if (isAnon && !mw.util.getParamValue('variant')) {
var url = new mw.Uri(window.location.href);
url.query.variant = 'zh-tw';
window.location.replace(url.toString());
}
});
});