MediaWiki:Common.js: Difference between revisions
Appearance
No edit summary Tag: Reverted |
No edit summary Tag: Reverted |
||
| Line 1: | Line 1: | ||
mw.loader.using(['mediawiki.api'],function(){var api=new mw.Api() | mw.loader.using(['mediawiki.api'],function(){ | ||
var api=new mw.Api(),cache={}; | |||
function | function norm(t){return (t||'').replace(/\s+/g,' ').trim().toLowerCase();} | ||
function extractCombined(h){ | |||
var w=$('<div>').html(h); | |||
function | w.find('#toc,.toc,.vector-toc,.mw-table-of-contents-container,.mw-jump-link').remove(); | ||
api.postWithToken('csrf',{action:'edit',title:title,text:text,summary:'Vote sync: refresh Cargo (auto)',minor:1,bot:1,basetimestamp:baseTs,maxlag:5});});} | var ov=w.find('.build-layout-container').first(), mb=w.find('.mb-content').first(), bs=w.find('.build-strategy').first(); | ||
var timer=null | var st=mb.length?mb:bs, out=''; | ||
if(ov.length&&st&&st.length){ | |||
var ot=norm(ov.text()), stt=norm(st.text()); | |||
if(ot.indexOf(stt)!==-1) out=ov.prop('outerHTML'); else out=ov.prop('outerHTML')+st.prop('outerHTML'); | |||
}else if(ov.length){out=ov.prop('outerHTML');} | |||
else if(st&&st.length){out=st.prop('outerHTML');} | |||
return out||h; | |||
} | |||
function loadBuild(t,cb){ | |||
if(cache[t])return cb(cache[t]); | |||
api.post({action:'parse',format:'json',page:t,prop:'text'}).done(function(r){ | |||
var h=(r.parse&&r.parse.text&&r.parse.text['*'])||''; | |||
var data={html:extractCombined(h)}; | |||
cache[t]=data;cb(data); | |||
}).fail(function(){cb({html:'<div>Failed to load.</div>'});}); | |||
} | |||
function onToggle(e){ | |||
e.preventDefault(); | |||
var a=$(this), s=a.attr('data-state')||'closed', row=a.closest('.build-row--interactive'), title=row.attr('data-page'); | |||
var panel=$('.build-inline-panel[data-target="'+title.replace(/"/g,'"')+'"]'); | |||
if(s==='open'){a.attr('data-state','closed').text('Show');panel.hide();return;} | |||
$('.build-inline-panel:visible').hide();$('.br-toggle[data-state="open"]').attr('data-state','closed').text('Show'); | |||
a.attr('data-state','open').text('Hide');panel.show(); | |||
if(!panel.data('loaded')){loadBuild(title,function(d){panel.html(d.html);panel.data('loaded','1');});} | |||
} | |||
$(document).on('click','.br-toggle',onToggle); | |||
$(document).on('keydown','.br-toggle',function(e){if(e.key==='Enter'||e.key===' '){$(this).trigger('click');e.preventDefault();}}); | |||
var THROTTLE_SEC=30,lastTouch={}; | |||
function canTouch(t){var n=Date.now();return !lastTouch[t]||(n-lastTouch[t])>THROTTLE_SEC*1000;} | |||
function touch(title){ | |||
if(!canTouch(title))return;lastTouch[title]=Date.now(); | |||
api.get({action:'query',prop:'revisions',rvprop:'content|timestamp',rvslots:'main',titles:title,format:'json',maxlag:5}).done(function(res){ | |||
var pages=res.query&&res.query.pages;if(!pages)return;var p=pages[Object.keys(pages)[0]]; | |||
if(!p||!p.revisions||!p.revisions.length)return; | |||
var rev=p.revisions[0], text=(rev.slots&&rev.slots.main&&rev.slots.main['*'])||rev['*']||'', baseTs=rev.timestamp; | |||
var m=/<!--\s*VOTE_TOUCH:\s*([^>]*)\s*-->/i, d=new Date(), z=function(n){return n<10?'0'+n:''+n;}; | |||
var stamp=''+d.getUTCFullYear()+z(d.getUTCMonth()+1)+z(d.getUTCDate())+z(d.getUTCHours())+z(d.getUTCMinutes())+z(d.getUTCSeconds()); | |||
if(m.test(text)){text=text.replace(m,'<!-- VOTE_TOUCH: '+stamp+' -->');}else{text+='\n<!-- VOTE_TOUCH: '+stamp+' -->\n';} | |||
api.postWithToken('csrf',{action:'edit',title:title,text:text,summary:'Vote sync: refresh Cargo (auto)',minor:1,bot:1,basetimestamp:baseTs,maxlag:5}); | |||
}); | |||
} | |||
var timer=null, obs=new MutationObserver(function(muts){ | |||
var pages=new Set(); | |||
for(var i=0;i<muts.length;i++){var el=$(muts[i].target).closest('.br-vote[data-page]');if(el.length)pages.add(el.attr('data-page'));} | |||
if(timer)clearTimeout(timer);timer=setTimeout(function(){pages.forEach(touch);},500); | |||
}); | |||
obs.observe(document.body,{childList:true,subtree:true,characterData:true}); | |||
}); | |||
Revision as of 22:54, 4 October 2025
mw.loader.using(['mediawiki.api'],function(){
var api=new mw.Api(),cache={};
function norm(t){return (t||'').replace(/\s+/g,' ').trim().toLowerCase();}
function extractCombined(h){
var w=$('<div>').html(h);
w.find('#toc,.toc,.vector-toc,.mw-table-of-contents-container,.mw-jump-link').remove();
var ov=w.find('.build-layout-container').first(), mb=w.find('.mb-content').first(), bs=w.find('.build-strategy').first();
var st=mb.length?mb:bs, out='';
if(ov.length&&st&&st.length){
var ot=norm(ov.text()), stt=norm(st.text());
if(ot.indexOf(stt)!==-1) out=ov.prop('outerHTML'); else out=ov.prop('outerHTML')+st.prop('outerHTML');
}else if(ov.length){out=ov.prop('outerHTML');}
else if(st&&st.length){out=st.prop('outerHTML');}
return out||h;
}
function loadBuild(t,cb){
if(cache[t])return cb(cache[t]);
api.post({action:'parse',format:'json',page:t,prop:'text'}).done(function(r){
var h=(r.parse&&r.parse.text&&r.parse.text['*'])||'';
var data={html:extractCombined(h)};
cache[t]=data;cb(data);
}).fail(function(){cb({html:'<div>Failed to load.</div>'});});
}
function onToggle(e){
e.preventDefault();
var a=$(this), s=a.attr('data-state')||'closed', row=a.closest('.build-row--interactive'), title=row.attr('data-page');
var panel=$('.build-inline-panel[data-target="'+title.replace(/"/g,'"')+'"]');
if(s==='open'){a.attr('data-state','closed').text('Show');panel.hide();return;}
$('.build-inline-panel:visible').hide();$('.br-toggle[data-state="open"]').attr('data-state','closed').text('Show');
a.attr('data-state','open').text('Hide');panel.show();
if(!panel.data('loaded')){loadBuild(title,function(d){panel.html(d.html);panel.data('loaded','1');});}
}
$(document).on('click','.br-toggle',onToggle);
$(document).on('keydown','.br-toggle',function(e){if(e.key==='Enter'||e.key===' '){$(this).trigger('click');e.preventDefault();}});
var THROTTLE_SEC=30,lastTouch={};
function canTouch(t){var n=Date.now();return !lastTouch[t]||(n-lastTouch[t])>THROTTLE_SEC*1000;}
function touch(title){
if(!canTouch(title))return;lastTouch[title]=Date.now();
api.get({action:'query',prop:'revisions',rvprop:'content|timestamp',rvslots:'main',titles:title,format:'json',maxlag:5}).done(function(res){
var pages=res.query&&res.query.pages;if(!pages)return;var p=pages[Object.keys(pages)[0]];
if(!p||!p.revisions||!p.revisions.length)return;
var rev=p.revisions[0], text=(rev.slots&&rev.slots.main&&rev.slots.main['*'])||rev['*']||'', baseTs=rev.timestamp;
var m=/<!--\s*VOTE_TOUCH:\s*([^>]*)\s*-->/i, d=new Date(), z=function(n){return n<10?'0'+n:''+n;};
var stamp=''+d.getUTCFullYear()+z(d.getUTCMonth()+1)+z(d.getUTCDate())+z(d.getUTCHours())+z(d.getUTCMinutes())+z(d.getUTCSeconds());
if(m.test(text)){text=text.replace(m,'<!-- VOTE_TOUCH: '+stamp+' -->');}else{text+='\n<!-- VOTE_TOUCH: '+stamp+' -->\n';}
api.postWithToken('csrf',{action:'edit',title:title,text:text,summary:'Vote sync: refresh Cargo (auto)',minor:1,bot:1,basetimestamp:baseTs,maxlag:5});
});
}
var timer=null, obs=new MutationObserver(function(muts){
var pages=new Set();
for(var i=0;i<muts.length;i++){var el=$(muts[i].target).closest('.br-vote[data-page]');if(el.length)pages.add(el.attr('data-page'));}
if(timer)clearTimeout(timer);timer=setTimeout(function(){pages.forEach(touch);},500);
});
obs.observe(document.body,{childList:true,subtree:true,characterData:true});
});