User:SunAfterRain/js/sandbox/gadget-AdvancedSiteNotices.js
注意:保存之后,你必须清除浏览器缓存才能看到做出的更改。Google Chrome、Firefox、Microsoft Edge及Safari:按住⇧ Shift键并单击工具栏的“刷新”按钮。参阅Help:绕过浏览器缓存以获取更多帮助。
$(function() {
/** Advanced Site Notices ********
* Allow to custom dynamic site notices
* Maintainer: [[User:PhiLiP]]
*/
if (window.closeASNForever || $('#siteNotice').length < 0 || mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') {
return;
}
if (typeof(window.customASNInterval) === 'undefined') {
window.customASNInterval = 15;
}
var langConv = require('ext.gadget.HanAssist').conv;
var cname = 'dismissASN';
var cval = $.cookie(cname);
if (cval == '') {
cval = -1;
}
var rev = 0;
var toid = null;
var tb = $('<table id="asn-dismissable-notice" width="100%" style="background:transparent"/>');
var ct = $('<div id="advancedSiteNotices" style="word-break:break-word" class="mw-parser-output"/>');
var sd = $('<a href="#"/>').text(langConv({hans: '关闭', hant: '關閉'}));
tb.append($('<tr/>').append($('<td/>').append(ct)).append($('<td/>').append('[').append(sd).append(']')));
var nts = null;
var styles = [];
sd.click(function() {
$.cookie(cname, rev, {
expires: 30,
path: '/',
secure: true
});
clearTimeout(toid);
tb.remove();
return false;
});
var matchCriteria = function(nt) {
var cache = nt.data('asn-cache');
if (cache !== undefined) {
return cache;
}
var criteria = nt.attr('data-asn-criteria');
if (criteria === undefined) {
criteria = nt.attr('class') ? 'false' : 'true';
if (nt.hasClass('only_sysop')) {
criteria += '||in_group("sysop")';
}
if (nt.hasClass('only_logged')) {
criteria += '||in_group("user")';
}
if (nt.hasClass('only_anon')) {
criteria += '||!in_group("user")';
}
if (nt.hasClass('only_zh_cn')) {
criteria += '||only_for("zh-cn")';
}
if (nt.hasClass('only_zh_hk')) {
criteria += '||only_for("zh-hk")';
}
if (nt.hasClass('only_zh_sg')) {
criteria += '||only_for("zh-sg")';
}
if (nt.hasClass('only_zh_tw')) {
criteria += '||only_for("zh-tw")';
}
} else {
criteria = decodeURIComponent(criteria.replace(/\+/g, '%20'));
criteria = criteria.trim();
}
if (criteria === '') {
criteria = 'true';
}
var testCriteria = function() {
var in_country = function(country) {
return window.Geo === undefined || Geo.country === country;
},
in_region = function(region) {
return window.Geo === undefined || Geo.region === region;
},
in_city = function(city) {
return window.Geo === undefined || Geo.city === city;
},
in_group = function(group) {
return $.inArray(group, mw.config.get('wgUserGroups')) > -1;
},
only_for = function(userlang) {
return userlang === mw.config.get('wgUserLanguage');
};
// FIXME: This shouldn't be using eval on data entered in wikitext. If that data is malformed it will throw an exception e.g. criteria = "(false))"
try {
return eval(criteria);
} catch (e) {
return false;
}
};
cache = testCriteria();
nt.data('asn-cache', cache);
return cache;
};
var loadNotices = function(pos) {
if (!tb.length) {
return;
}
ct.css('min-height', ct.height() + 'px');
tb.css('min-height', tb.height() + 'px');
var l = nts.length;
var nt = null;
var rt = 0;
while (rt++ < l) {
nt = $(nts[pos]);
if (matchCriteria(nt)) {
break;
}
pos = (pos + 1) % l;
}
if (rt >= l) {
return;
}
if (typeof nt.data('asn-style') == 'string') {
var style = mw.util.addCSS(decodeURIComponent(nt.data('asn-style').replace(/\+/g, '%20')));
nt.data('asn-style', null);
nt.data('asn-style-id', styles.length);
style.disabled = true;
styles.push(style);
}
if (typeof nt.data('asn-html') == 'string') {
nt.data('asn-html-raw', decodeURIComponent(nt.data('asn-html').replace(/\+/g, '%20')));
nt.data('asn-html', null);
}
var styleId = nt.data('asn-style-id');
nt = nt.data('asn-html-raw') || nt.html();
var cthtml = ct.html();
if (cthtml) {
if (cthtml !== nt) {
ct.stop().fadeOut(function() {
$.each(styles, function() {
this.disabled = true;
});
if (styles[styleId]) {
styles[styleId].disabled = false;
}
ct.html(nt);
// animation try /catched to avoid TypeError: (Animation.tweeners[prop]||[]).concat is not a function error being seen in production
try {
ct.fadeIn();
} catch (e) {}
});
}
} else if (rev == cval) {
return;
} else {
$.cookie(cname, null);
tb.appendTo($('#siteNotice'));
if (styles[styleId]) {
styles[styleId].disabled = false;
}
ct.html(nt).fadeIn();
}
toid = setTimeout(function() {
loadNotices((pos + 1) % l);
}, window.customASNInterval * 1000);
};
new mw.Api({
ajax: {
headers: {
'Api-User-Agent': 'w:zh:MediaWiki:Gadget-AdvancedSiteNotices.js'
}
}
}).get({
page: 'Template:AdvancedSiteNotices/ajax',
variant: mw.config.get('wgUserVariant'),
prop: 'text',
action: 'parse',
format: 'json',
maxage: 3600,
smaxage: 3600
}).then(function(json) {
if (!json || !json.parse || !json.parse.text || !json.parse.text['*']) return;
json = $('<div/>').html(json.parse.text['*']).find('ul.sitents');
nts = $('li', json);
rev = json.data('asn-version');
var l = nts.length;
loadNotices(Math.floor(Math.random() * l));
}).catch(function(e) {
console.error('[AdvancedSiteNotices]: ', JSON.stringify(e));
});
});