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 );