mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Gadgets
synced 2024-11-28 01:00:02 +00:00
Revert r37263 for now:
* (bug 12211) Show some gadgets only for admins * (bug 13742) Allow for gadgets to be turned on by default I'm a bit leery of the 'on by default' entirely at the moment. :) A few comments: * The readme examples don't seem to clearly show the option format * Why are numeric constants being used as indexes to the option array? Strings are easier to work with and debug. * There's a lot of stuff like this which feels very ugly: if( isset( $gadget->options[Gadget::RIGHTS] ) && !empty( $gadget->options[Gadget::RIGHTS] ) ) { Since it's all hard-coded anyway, why not just do something nice and clear like this? if( !empty( $gadget->rights ) ) { * And this: if( wfGadgetAllowed( $gadget->options ) ) { to: if( $gadget->isAllowed() ) {
This commit is contained in:
parent
90d18f24e2
commit
740da4c34d
|
@ -32,8 +32,6 @@ Local administrators can edit available gadgets using [[MediaWiki:Gadgets-defini
|
||||||
'gadgets-pagetext' => "Below is a list of special gadgets users can enable on their preferences page, as defined by [[MediaWiki:Gadgets-definition]].
|
'gadgets-pagetext' => "Below is a list of special gadgets users can enable on their preferences page, as defined by [[MediaWiki:Gadgets-definition]].
|
||||||
This overview provides easy access to the system message pages that define each gadget's description and code.",
|
This overview provides easy access to the system message pages that define each gadget's description and code.",
|
||||||
'gadgets-uses' => 'Uses',
|
'gadgets-uses' => 'Uses',
|
||||||
'gadgets-rights' => 'Requires the following rights',
|
|
||||||
'gadgets-default' => 'Enabled by default',
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/** Amharic (አማርኛ)
|
/** Amharic (አማርኛ)
|
||||||
|
@ -899,6 +897,7 @@ Esta visão geral proporciona um acesso fácil para as mensagens de sistema que
|
||||||
* @author Illusion
|
* @author Illusion
|
||||||
* @author Siebrand
|
* @author Siebrand
|
||||||
* @author Александр Сигачёв
|
* @author Александр Сигачёв
|
||||||
|
* @author Ahonc
|
||||||
*/
|
*/
|
||||||
$messages['ru'] = array(
|
$messages['ru'] = array(
|
||||||
'gadgets-desc' => 'Позволяет участникам выбирать в [[Special:Preferences|настройках]] CSS- и JavaScript-гаджеты, которые они хотят подключить',
|
'gadgets-desc' => 'Позволяет участникам выбирать в [[Special:Preferences|настройках]] CSS- и JavaScript-гаджеты, которые они хотят подключить',
|
||||||
|
@ -1164,4 +1163,3 @@ $messages['zh-hant'] = array(
|
||||||
'gadgets-uses' => '使用',
|
'gadgets-uses' => '使用',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
111
Gadgets.php
111
Gadgets.php
|
@ -38,23 +38,6 @@ $wgExtensionMessagesFiles['Gadgets'] = $dir . 'Gadgets.i18n.php';
|
||||||
$wgAutoloadClasses['SpecialGadgets'] = $dir . 'SpecialGadgets.php';
|
$wgAutoloadClasses['SpecialGadgets'] = $dir . 'SpecialGadgets.php';
|
||||||
$wgSpecialPages['Gadgets'] = 'SpecialGadgets';
|
$wgSpecialPages['Gadgets'] = 'SpecialGadgets';
|
||||||
|
|
||||||
class Gadget {
|
|
||||||
const CACHE_VERSION = 1;
|
|
||||||
/**
|
|
||||||
* This gadget option contains rights the user must have to use this gadget
|
|
||||||
*/
|
|
||||||
const RIGHTS = 666;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This gadget should be enabled by default
|
|
||||||
*/
|
|
||||||
const ON_BY_DEFAULT = 667;
|
|
||||||
|
|
||||||
var $name = '';
|
|
||||||
var $modules = array();
|
|
||||||
var $options = array();
|
|
||||||
}
|
|
||||||
|
|
||||||
function wfGadgetsArticleSaveComplete( &$article, &$wgUser, &$text ) {
|
function wfGadgetsArticleSaveComplete( &$article, &$wgUser, &$text ) {
|
||||||
//update cache if MediaWiki:Gadgets-definition was edited
|
//update cache if MediaWiki:Gadgets-definition was edited
|
||||||
$title = $article->mTitle;
|
$title = $article->mTitle;
|
||||||
|
@ -94,10 +77,7 @@ function wfLoadGadgetsStructured( $forceNewText = NULL ) {
|
||||||
if ( $forceNewText === NULL ) {
|
if ( $forceNewText === NULL ) {
|
||||||
//cached?
|
//cached?
|
||||||
$gadgets = $wgMemc->get( $key );
|
$gadgets = $wgMemc->get( $key );
|
||||||
if ( is_array( $gadgets ) && isset( $gadgets['version'] ) && $gadgets['version'] == Gadget::CACHE_VERSION ) {
|
if ( is_array($gadgets) ) return $gadgets;
|
||||||
unset( $gadgets['version'] );
|
|
||||||
return $gadgets;
|
|
||||||
}
|
|
||||||
|
|
||||||
$g = wfMsgForContentNoTrans( "gadgets-definition" );
|
$g = wfMsgForContentNoTrans( "gadgets-definition" );
|
||||||
if ( wfEmptyMsg( "gadgets-definition", $g ) ) {
|
if ( wfEmptyMsg( "gadgets-definition", $g ) ) {
|
||||||
|
@ -117,48 +97,29 @@ function wfLoadGadgetsStructured( $forceNewText = NULL ) {
|
||||||
foreach ( $g as $line ) {
|
foreach ( $g as $line ) {
|
||||||
if ( preg_match( '/^==+ *([^*:\s|]+?)\s*==+\s*$/', $line, $m ) ) {
|
if ( preg_match( '/^==+ *([^*:\s|]+?)\s*==+\s*$/', $line, $m ) ) {
|
||||||
$section = $m[1];
|
$section = $m[1];
|
||||||
} else if ( preg_match( '/^\*+ *([a-zA-Z](?:[-_:.\w\d ]*[a-zA-Z0-9])?)\s*((\|[^|[]*)+)\s*(|\[(.*)\])\s*$/', $line, $m ) ) {
|
}
|
||||||
$gadget = new Gadget();
|
else if ( preg_match( '/^\*+ *([a-zA-Z](?:[-_:.\w\d ]*[a-zA-Z0-9])?)\s*((\|[^|]*)+)\s*$/', $line, $m ) ) {
|
||||||
|
|
||||||
//NOTE: the gadget name is used as part of the name of a form field,
|
//NOTE: the gadget name is used as part of the name of a form field,
|
||||||
// and must follow the rules defined in http://www.w3.org/TR/html4/types.html#type-cdata
|
// and must follow the rules defined in http://www.w3.org/TR/html4/types.html#type-cdata
|
||||||
// Also, title-normalization applies.
|
// Also, title-normalization applies.
|
||||||
$gadget->name = str_replace(' ', '_', $m[1] );
|
$name = str_replace(' ', '_', $m[1] );
|
||||||
|
|
||||||
$gadget->modules = preg_split( '/\s*\|\s*/', $m[2], -1, PREG_SPLIT_NO_EMPTY );
|
$code = preg_split( '/\s*\|\s*/', $m[2], -1, PREG_SPLIT_NO_EMPTY );
|
||||||
|
|
||||||
if( !empty( $m[5] ) && $gadget->modules )
|
if ( $code ) {
|
||||||
$gadget->options = wfProcessGadgetOptions( $m[5] );
|
$gadgets[$section][$name] = $code;
|
||||||
|
|
||||||
if ( $gadget->modules ) {
|
|
||||||
$gadgets[$section][$gadget->name] = $gadget;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//cache for a while. gets purged automatically when MediaWiki:Gadgets-definition is edited
|
//cache for a while. gets purged automatically when MediaWiki:Gadgets-definition is edited
|
||||||
$gadgets['version'] = Gadget::CACHE_VERSION;
|
|
||||||
$wgMemc->set( $key, $gadgets, 60*60*24 );
|
$wgMemc->set( $key, $gadgets, 60*60*24 );
|
||||||
$source = $forceNewText !== NULL ? 'input text' : 'MediaWiki:Gadgets-definition';
|
$source = $forceNewText !== NULL ? 'input text' : 'MediaWiki:Gadgets-definition';
|
||||||
wfDebug( __METHOD__ . ": $source parsed, cache entry $key updated\n");
|
wfDebug( __METHOD__ . ": $source parsed, cache entry $key updated\n");
|
||||||
|
|
||||||
unset( $gadgets['version'] );
|
|
||||||
return $gadgets;
|
return $gadgets;
|
||||||
}
|
}
|
||||||
|
|
||||||
function wfProcessGadgetOptions( $options ) {
|
|
||||||
$out = array();
|
|
||||||
foreach( preg_split( '/\s*\|\s*/', $options, -1, PREG_SPLIT_NO_EMPTY ) as $option ) {
|
|
||||||
if( preg_match( '/^rights\s*:\s*([\w\s,]+)$/', $option, $m ) ) {
|
|
||||||
$out[Gadget::RIGHTS] = preg_split( '/\s*,\s*/', $m[1], -1, PREG_SPLIT_NO_EMPTY );
|
|
||||||
} elseif( preg_match( '/^default$/', $option ) ) {
|
|
||||||
$out[Gadget::ON_BY_DEFAULT] = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $out;
|
|
||||||
}
|
|
||||||
|
|
||||||
function wfGadgetsInitPreferencesForm( &$prefs, &$request ) {
|
function wfGadgetsInitPreferencesForm( &$prefs, &$request ) {
|
||||||
$gadgets = wfLoadGadgets();
|
$gadgets = wfLoadGadgets();
|
||||||
if ( !$gadgets ) return true;
|
if ( !$gadgets ) return true;
|
||||||
|
@ -171,18 +132,6 @@ function wfGadgetsInitPreferencesForm( &$prefs, &$request ) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
function wfGadgetAllowed( $options ) {
|
|
||||||
global $wgUser;
|
|
||||||
|
|
||||||
if( isset( $options[Gadget::RIGHTS] ) )
|
|
||||||
foreach( $options[Gadget::RIGHTS] as $right ) {
|
|
||||||
if( !in_array( $right, $wgUser->getRights() ) )
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
function wfGadgetsResetPreferences( &$prefs, &$user ) {
|
function wfGadgetsResetPreferences( &$prefs, &$user ) {
|
||||||
$gadgets = wfLoadGadgets();
|
$gadgets = wfLoadGadgets();
|
||||||
if ( !$gadgets ) return true;
|
if ( !$gadgets ) return true;
|
||||||
|
@ -196,8 +145,6 @@ function wfGadgetsResetPreferences( &$prefs, &$user ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function wfGadgetsRenderPreferencesForm( &$prefs, &$out ) {
|
function wfGadgetsRenderPreferencesForm( &$prefs, &$out ) {
|
||||||
global $wgUser;
|
|
||||||
|
|
||||||
$gadgets = wfLoadGadgetsStructured();
|
$gadgets = wfLoadGadgetsStructured();
|
||||||
if ( !$gadgets ) return true;
|
if ( !$gadgets ) return true;
|
||||||
|
|
||||||
|
@ -210,39 +157,22 @@ function wfGadgetsRenderPreferencesForm( &$prefs, &$out ) {
|
||||||
$msgOpt = array( 'parseinline' );
|
$msgOpt = array( 'parseinline' );
|
||||||
|
|
||||||
foreach ( $gadgets as $section => $entries ) {
|
foreach ( $gadgets as $section => $entries ) {
|
||||||
$first = true;
|
if ( $section !== false && $section !== '' ) {
|
||||||
|
$ttext = wfMsgExt( "gadget-section-$section", $msgOpt );
|
||||||
foreach ( $entries as $gname => $gadget ) {
|
$out->addHtml( "\n<h2 id=\"".htmlspecialchars("gadget-section-$section")."\">" . $ttext . "</h2>\n" );
|
||||||
$tname = "gadget-$gname";
|
|
||||||
$ttext = wfMsgExt( $tname, $msgOpt );
|
|
||||||
|
|
||||||
if( ( ( $prefs->mToggles[$tname] != '' ) && ($prefs->mToggles[$tname] == 1) )
|
|
||||||
|| ( ( $prefs->mToggles[$tname] === '' ) && isset( $gadget->options[Gadget::ON_BY_DEFAULT] ) ) )
|
|
||||||
$checked = ' checked="checked"';
|
|
||||||
else
|
|
||||||
$checked = '';
|
|
||||||
|
|
||||||
$disabled = '';
|
|
||||||
|
|
||||||
if( wfGadgetAllowed( $gadget->options ) ) {
|
|
||||||
// draw section heading
|
|
||||||
if ($first && $section !== false && $section !== '' ) {
|
|
||||||
$stext = wfMsgExt( "gadget-section-$section", $msgOpt );
|
|
||||||
$out->addHtml( "\n<h2 id=\"".htmlspecialchars("gadget-section-$section")."\">" . $stext . "</h2>\n" );
|
|
||||||
$first = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isset( $gadget->options[Gadget::ON_BY_DEFAULT] ) )
|
foreach ( $entries as $gname => $code ) {
|
||||||
$extra = ' (' . wfMsg( 'gadgets-default' ) . ')';
|
$tname = "gadget-$gname";
|
||||||
else
|
$ttext = wfMsgExt( $tname, $msgOpt );
|
||||||
$extra = '';
|
$checked = @$prefs->mToggles[$tname] == 1 ? ' checked="checked"' : '';
|
||||||
|
$disabled = '';
|
||||||
|
|
||||||
# NOTE: No label for checkmarks as this causes the checks to toggle
|
# NOTE: No label for checkmarks as this causes the checks to toggle
|
||||||
# when clicking a link in the describing text.
|
# when clicking a link in the describing text.
|
||||||
$out->addHtml( "<div class='toggle'><input type='checkbox' value='1' " .
|
$out->addHtml( "<div class='toggle'><input type='checkbox' value='1' " .
|
||||||
"id=\"$tname\" name=\"wpOp$tname\"$checked$disabled />" .
|
"id=\"$tname\" name=\"wpOp$tname\"$checked$disabled />" .
|
||||||
" <span class='toggletext'>$ttext</span>$extra</div>\n" );
|
" <span class='toggletext'>$ttext</span></div>\n" );
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -266,13 +196,10 @@ function wfGadgetsBeforePageDisplay( &$out ) {
|
||||||
|
|
||||||
$done = array();
|
$done = array();
|
||||||
|
|
||||||
foreach ( $gadgets as $gname => $gadget ) {
|
foreach ( $gadgets as $gname => $code ) {
|
||||||
if( wfGadgetAllowed( $gadget->options ) ) {
|
|
||||||
$tname = "gadget-$gname";
|
$tname = "gadget-$gname";
|
||||||
$default = isset( $gadget->options[Gadget::ON_BY_DEFAULT] );
|
if ( $wgUser->getOption( $tname ) ) {
|
||||||
if ( $wgUser->getOption( $tname, $default ) ) {
|
wfApplyGadgetCode( $code, $out, $done );
|
||||||
wfApplyGadgetCode( $gadget->modules, $out, $done );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
22
README
22
README
|
@ -33,7 +33,7 @@ messages, for easy editing.
|
||||||
Each line in MediaWiki:Gadgets-definition that start with one or more "*"
|
Each line in MediaWiki:Gadgets-definition that start with one or more "*"
|
||||||
(asterisk) characters defines a gadget; it must have the following form:
|
(asterisk) characters defines a gadget; it must have the following form:
|
||||||
|
|
||||||
* mygadget|mygadget.js|mygadget.css[option1|option2]
|
* mygadget|mygadget.js|mygadget.css
|
||||||
|
|
||||||
That is, each line consists of fields separated by a "|" (pipe) character.
|
That is, each line consists of fields separated by a "|" (pipe) character.
|
||||||
The first field ("mygadget" in the example) is the gadgets internal name,
|
The first field ("mygadget" in the example) is the gadgets internal name,
|
||||||
|
@ -65,26 +65,6 @@ section's name - for example:
|
||||||
This would define a new section, with the title defined on the page
|
This would define a new section, with the title defined on the page
|
||||||
MediaWiki:Gadget-section-editing-gadgets
|
MediaWiki:Gadget-section-editing-gadgets
|
||||||
|
|
||||||
== Options ==
|
|
||||||
Options are optionally appended to the end of the gadget declaration.
|
|
||||||
They are enclosed in square brackets ("[...]") and are separated by pipe
|
|
||||||
character ("|").
|
|
||||||
|
|
||||||
Currently, there are two options: rights required to use the gadget, and
|
|
||||||
whether the gadget should be enaled for everyone by default.
|
|
||||||
|
|
||||||
The rights option looks like "[rights:delete,userrights]". Note that it
|
|
||||||
requires specific rights, not groups the user belongs to. This option is
|
|
||||||
case-sensitive, but ignores whitespace, i.e. "[ rights: foo , bar ]" is a
|
|
||||||
valid declaration, but not "[Rights:Foo]".
|
|
||||||
|
|
||||||
The "default" option, if present, makes this gadget enabled for every
|
|
||||||
eligible user who has not specifically opted out of it by unchecking it in
|
|
||||||
their preferences. The option looks like that: "[default]".
|
|
||||||
|
|
||||||
Options may be combined in any number or order, i.e. "[rights:foo, bar]",
|
|
||||||
"[default]", "[rights:boz|default]" and "[default|rights:quux]" are all valid
|
|
||||||
declarations.
|
|
||||||
|
|
||||||
== Caveats ==
|
== Caveats ==
|
||||||
|
|
||||||
|
|
|
@ -59,7 +59,7 @@ class SpecialGadgets extends SpecialPage {
|
||||||
$wgOut->addHTML( "\n<h2>$ttext [$lnk]</h2>\n" );
|
$wgOut->addHTML( "\n<h2>$ttext [$lnk]</h2>\n" );
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach ( $entries as $gname => $gadget ) {
|
foreach ( $entries as $gname => $code ) {
|
||||||
$t = Title::makeTitleSafe( NS_MEDIAWIKI, "Gadget-$gname" );
|
$t = Title::makeTitleSafe( NS_MEDIAWIKI, "Gadget-$gname" );
|
||||||
if ( !$t ) continue;
|
if ( !$t ) continue;
|
||||||
|
|
||||||
|
@ -73,19 +73,10 @@ class SpecialGadgets extends SpecialPage {
|
||||||
$wgOut->addHTML( "<li>" );
|
$wgOut->addHTML( "<li>" );
|
||||||
$wgOut->addHTML( "$ttext [$lnk]<br />" );
|
$wgOut->addHTML( "$ttext [$lnk]<br />" );
|
||||||
|
|
||||||
if( isset( $gadget->options[Gadget::RIGHTS] ) && !empty( $gadget->options[Gadget::RIGHTS] ) ) {
|
|
||||||
$wgOut->addHTML( wfMsgHTML( 'gadgets-rights' ) . ": " );
|
|
||||||
$wgOut->addHTML( htmlspecialchars( implode( ', ', $gadget->options[Gadget::RIGHTS] ) ) . '<br />' );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( isset( $gadget->options[Gadget::ON_BY_DEFAULT] ) )
|
|
||||||
$wgOut->addHTML( wfMsgHTML( "gadgets-default" ) . "<br />" );
|
|
||||||
|
|
||||||
|
|
||||||
$wgOut->addHTML( wfMsgHTML("gadgets-uses") . ": " );
|
$wgOut->addHTML( wfMsgHTML("gadgets-uses") . ": " );
|
||||||
|
|
||||||
$first = true;
|
$first = true;
|
||||||
foreach ( $gadget->modules as $codePage ) {
|
foreach ( $code as $codePage ) {
|
||||||
$t = Title::makeTitleSafe( NS_MEDIAWIKI, "Gadget-$codePage" );
|
$t = Title::makeTitleSafe( NS_MEDIAWIKI, "Gadget-$codePage" );
|
||||||
if ( !$t ) continue;
|
if ( !$t ) continue;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue