משתמש:קיפודנחש/flexGadgets.js
מראה
הערה: לאחר הפרסום, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.
- פיירפוקס / ספארי: להחזיק את המקש Shift בעת לחיצה על טעינה מחדש (Reload) או ללחוץ על צירוף המקשים Ctrl-F5 או Ctrl-R (במחשב מק: ⌘-R).
- גוגל כרום: ללחוץ על צירוף המקשים Ctrl-Shift-R (במחשב מק: ⌘-Shift-R).
- אדג': להחזיק את המקש Ctrl בעת לחיצה על רענן (Refresh) או ללחוץ על צירוף המקשים Ctrl-F5.
mw.loader.using( ['mediawiki.api', 'mediawiki.user', 'jquery.ui'], function() {
"use strict";
var api = new mw.Api(),
userRights,
allGadgets = {},
hardActiveGadgets = {},
softActiveGadgets = {},
cookieName = 'softGadgetsGadget',
current = $.cookie( cookieName ),
strings = {
cancel: 'ביטול',
save: 'הפעל וזכור',
onetime: 'הפעלה חד פעמית',
prefs: 'העדפות',
clearall: 'נקה הכל',
title: 'העדפות מקומיות'
};
mw.user.getRights().done( function( data ) {
userRights = data;
} );
function showForm( e ) {
e.preventDefault();
api.get( {
action: 'parse',
page: 'Mediawiki:Gadgets-definition'
} )
.done( function( data ) {
if ( data && data.parse && data.parse.text && data.parse.text['*'] )
buildFormAndShowit( data.parse.text['*'] );
} );
}
function buildFormAndShowit( gadgetsDefinitionHtml ) {
var bag = '__NOEDITSECTION__\n__NOTOC__\n',
div = $( '<div>' ).append( $( gadgetsDefinitionHtml ) );
div.find( '#toc' ).remove();
div.find( 'h2, li' )
.each( function( index, item ) {
var $item = $( item );
if ( $item.is( 'h2' ) ) {
var title = $item.find( 'span:first' ).text().replace( /_/g, " " );
if ( $.trim( title ) )
bag += '\n==' + title + '==';
}
else
bag += lineOfSourceItem( $item );
} );
api.post( {
action: 'parse',
text: bag
} ).done( function( data ) {
handleParsedPage( data.parse.text['*'] );
} );
}
function lineOfSourceItem( $item ) {
var sourceText = $item.text(),
gadgetName = $.trim( sourceText.replace( /[[|].*/, '' ) ),
s = '',
active = mw.user.options.get( 'gadget-' + gadgetName );
if ( active ) {
hardActiveGadgets[gadgetName] = 1;
return '';
}
if ( userRights ) {
var match = sourceText.match( /rights\s*=\s*([^|[]*)/ );
if ( match ) {
var required = match[1].split( ',' );
for ( var i = 0; i < required.length; i++ )
if ( $.inArray( required[i], userRights ) < 0 )
return ''; // current user does not have rights for this gadget.
}
}
allGadgets[gadgetName] = 1;
return '\n* <span class = "spanCheckbox" id = "spanGadget-' + gadgetName + '"></span> {{Mediawiki:Gadget-' + gadgetName + '}}';
}
function handleParsedPage( parsedString ) {
var $page = $( parsedString );
for ( var gadget in allGadgets ) {
var cb = $( '<input>', {
type: 'checkbox'
} )
.prop( 'checked', !!( hardActiveGadgets[gadget] || softActiveGadgets[gadget] ) )
.prop( 'disabled', hardActiveGadgets[gadget] );
$page.find( '#spanGadget-' + gadget ).prepend( cb );
}
var div = $( '<div>' )
.css( {
overflow: 'auto',
width: 'auto'
} )
.append( $page );
showDialog( div );
}
function actOnUserChoice( content, remember ) {
var selected = [];
softActiveGadgets = {};
for ( var gadget in allGadgets ) {
if ( hardActiveGadgets[gadget] )
continue;
if ( content.find( '#spanGadget-' + gadget + ' input' ).prop( 'checked' ) ) {
loadGadget( gadget ); // never mind if it's already loaded: mw.loader keeps track.
selected.push( gadget );
softActiveGadgets[gadget] = 1;
}
}
if ( remember )
$.cookie( cookieName, selected.join( '.' ) );
}
function showDialog( content ) {
var buttons = {};
buttons[strings.cancel] = function() {
$( this ).dialog( 'close' );
};
buttons[strings.onetime] = function() {
actOnUserChoice( content, false );
$( this ).dialog( "close" );
};
buttons[strings.save] = function() {
actOnUserChoice( content, true );
$( this ).dialog( "close" );
};
buttons[strings.clearall] = function() {
$( this ).find('input:enabled[type=checkbox]').prop('checked', false);
};
var dialog = $( '<div>' )
.append( content )
.dialog( {
resizable: true,
height: 600,
width: 1000,
modal: true,
title: strings.title,
buttons: buttons
} );
}
function loadGadget( gadget ) {
mw.loader.load( 'ext.gadget.' + gadget );
}
function start() {
if ( current ) {
var softies = current.split( '.' );
for ( var i = 0; i < softies.length; i++ ) {
var softie = softies[i];
softie = $.trim( softie );
softActiveGadgets[softie] = 1;
loadGadget( softie );
}
}
$( mw.util.addPortletLink( mw.user.isAnon() ? 'p-personal' : 'p-cactions', '', strings.prefs ) ).click( showForm );
}
start();
} );