MediaWiki:Gadget-freezeAPNG.js
Материал из Space Station 14 Вики
Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.
- Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
- Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
- Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
- Opera: Нажмите Ctrl+F5.
( function ( $, mw ) {
function parseChunks( buf ) {
const dv = new DataView( buf );
let pos = 8;
const chunks = [];
while ( pos < buf.byteLength ) {
const length = dv.getUint32( pos );
const typeBytes = new Uint8Array( buf, pos + 4, 4 );
const type = String.fromCharCode.apply( null, typeBytes );
const dataStart = pos + 8;
const dataEnd = dataStart + length;
const crcEnd = dataEnd + 4;
chunks.push({
type,
start: pos,
end: crcEnd
});
pos = crcEnd;
}
return chunks;
}
async function detectAndStrip( img ) {
try {
const resp = await fetch( img.src );
if ( !resp.ok ) return;
const buf = await resp.arrayBuffer();
const chunks = parseChunks( buf );
if ( !chunks.some( c => c.type === 'acTL' ) ) return;
const keep = [];
keep.push( buf.slice( 0, 8 ) );
for ( const c of chunks ) {
if ( c.type === 'acTL' || c.type === 'fcTL' ) continue;
keep.push( buf.slice( c.start, c.end ) );
}
const blob = new Blob( keep, { type: 'image/png' } );
const url = URL.createObjectURL( blob );
img.src = url;
} catch ( e ) {
console.error( 'freezeAPNG error:', e );
}
}
$( () => {
$( '.freezeAPNG img[src$=".png"]' ).each( ( _, img ) => {
if ( img.complete ) {
detectAndStrip( img );
} else {
img.addEventListener( 'load', () => detectAndStrip( img ), { once: true } );
}
} );
} );
} )( jQuery, mediaWiki );