summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Gadgets/Gadgets_body.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Gadgets/Gadgets_body.php')
-rw-r--r--www/wiki/extensions/Gadgets/Gadgets_body.php315
1 files changed, 315 insertions, 0 deletions
diff --git a/www/wiki/extensions/Gadgets/Gadgets_body.php b/www/wiki/extensions/Gadgets/Gadgets_body.php
new file mode 100644
index 00000000..b197ed20
--- /dev/null
+++ b/www/wiki/extensions/Gadgets/Gadgets_body.php
@@ -0,0 +1,315 @@
+<?php
+/**
+ * Gadgets extension - lets users select custom javascript gadgets
+ *
+ * For more info see https://www.mediawiki.org/wiki/Extension:Gadgets
+ *
+ * @file
+ * @ingroup Extensions
+ * @author Daniel Kinzler, brightbyte.de
+ * @copyright © 2007 Daniel Kinzler
+ * @license GNU General Public Licence 2.0 or later
+ */
+
+/**
+ * Wrapper for one gadget.
+ */
+class Gadget {
+ /**
+ * Increment this when changing class structure
+ */
+ const GADGET_CLASS_VERSION = 9;
+
+ const CACHE_TTL = 86400;
+
+ private $scripts = [],
+ $styles = [],
+ $dependencies = [],
+ $peers = [],
+ $messages = [],
+ $name,
+ $definition,
+ $resourceLoaded = false,
+ $requiredRights = [],
+ $requiredSkins = [],
+ $targets = [ 'desktop' ],
+ $onByDefault = false,
+ $hidden = false,
+ $type = '',
+ $category;
+
+ public function __construct( array $options ) {
+ foreach ( $options as $member => $option ) {
+ switch ( $member ) {
+ case 'scripts':
+ case 'styles':
+ case 'dependencies':
+ case 'peers':
+ case 'messages':
+ case 'name':
+ case 'definition':
+ case 'resourceLoaded':
+ case 'requiredRights':
+ case 'requiredSkins':
+ case 'targets':
+ case 'onByDefault':
+ case 'type':
+ case 'hidden':
+ case 'category':
+ $this->{$member} = $option;
+ break;
+ default:
+ throw new InvalidArgumentException( "Unrecognized '$member' parameter" );
+ }
+ }
+ }
+
+ /**
+ * Create a object based on the metadata in a GadgetDefinitionContent object
+ *
+ * @param string $id
+ * @param GadgetDefinitionContent $content
+ * @return Gadget
+ */
+ public static function newFromDefinitionContent( $id, GadgetDefinitionContent $content ) {
+ $data = $content->getAssocArray();
+ $prefixGadgetNs = function ( $page ) {
+ return 'Gadget:' . $page;
+ };
+ $info = [
+ 'name' => $id,
+ 'resourceLoaded' => true,
+ 'requiredRights' => $data['settings']['rights'],
+ 'onByDefault' => $data['settings']['default'],
+ 'hidden' => $data['settings']['hidden'],
+ 'requiredSkins' => $data['settings']['skins'],
+ 'category' => $data['settings']['category'],
+ 'scripts' => array_map( $prefixGadgetNs, $data['module']['scripts'] ),
+ 'styles' => array_map( $prefixGadgetNs, $data['module']['styles'] ),
+ 'dependencies' => $data['module']['dependencies'],
+ 'peers' => $data['module']['peers'],
+ 'messages' => $data['module']['messages'],
+ 'type' => $data['module']['type'],
+ ];
+
+ return new self( $info );
+ }
+
+ /**
+ * Get a placeholder object to use if a gadget doesn't exist
+ *
+ * @param string $id name
+ * @return Gadget
+ */
+ public static function newEmptyGadget( $id ) {
+ return new self( [ 'name' => $id ] );
+ }
+
+ /**
+ * Whether the provided gadget id is valid
+ *
+ * @param string $id
+ * @return bool
+ */
+ public static function isValidGadgetID( $id ) {
+ return strlen( $id ) > 0 && ResourceLoader::isValidModuleName( self::getModuleName( $id ) );
+ }
+
+ /**
+ * @return string Gadget name
+ */
+ public function getName() {
+ return $this->name;
+ }
+
+ /**
+ * @return string Gadget description parsed into HTML
+ */
+ public function getDescription() {
+ return wfMessage( "gadget-{$this->getName()}" )->parse();
+ }
+
+ /**
+ * @return string Wikitext of gadget description
+ */
+ public function getRawDescription() {
+ return wfMessage( "gadget-{$this->getName()}" )->plain();
+ }
+
+ /**
+ * @return string Name of category (aka section) our gadget belongs to. Empty string if none.
+ */
+ public function getCategory() {
+ return $this->category;
+ }
+
+ /**
+ * @param string $id Name of gadget
+ * @return string Name of ResourceLoader module for the gadget
+ */
+ public static function getModuleName( $id ) {
+ return "ext.gadget.{$id}";
+ }
+
+ /**
+ * Checks whether this gadget is enabled for given user
+ *
+ * @param User $user user to check against
+ * @return bool
+ */
+ public function isEnabled( $user ) {
+ return (bool)$user->getOption( "gadget-{$this->name}", $this->onByDefault );
+ }
+
+ /**
+ * Checks whether given user has permissions to use this gadget
+ *
+ * @param User $user user to check against
+ * @return bool
+ */
+ public function isAllowed( $user ) {
+ return count( array_intersect( $this->requiredRights, $user->getRights() ) ) ==
+ count( $this->requiredRights )
+ && ( $this->requiredSkins === true
+ || !count( $this->requiredSkins )
+ || in_array( $user->getOption( 'skin' ), $this->requiredSkins )
+ );
+ }
+
+ /**
+ * @return bool Whether this gadget is on by default for everyone
+ * (but can be disabled in preferences)
+ */
+ public function isOnByDefault() {
+ return $this->onByDefault;
+ }
+
+ /**
+ * @return bool
+ */
+ public function isHidden() {
+ return $this->hidden;
+ }
+
+ /**
+ * @return bool Whether all of this gadget's JS components support ResourceLoader
+ */
+ public function supportsResourceLoader() {
+ return $this->resourceLoaded;
+ }
+
+ /**
+ * @return bool Whether this gadget has resources that can be loaded via ResourceLoaderb
+ */
+ public function hasModule() {
+ return count( $this->styles )
+ + ( $this->supportsResourceLoader() ? count( $this->scripts ) : 0 )
+ > 0;
+ }
+
+ /**
+ * @return string Definition for this gadget from MediaWiki:gadgets-definition
+ */
+ public function getDefinition() {
+ return $this->definition;
+ }
+
+ /**
+ * @return array Array of pages with JS (including namespace)
+ */
+ public function getScripts() {
+ return $this->scripts;
+ }
+
+ /**
+ * @return array Array of pages with CSS (including namespace)
+ */
+ public function getStyles() {
+ return $this->styles;
+ }
+
+ /**
+ * @return array Array of all of this gadget's resources
+ */
+ public function getScriptsAndStyles() {
+ return array_merge( $this->scripts, $this->styles );
+ }
+
+ /**
+ * @return array
+ */
+ public function getTargets() {
+ return $this->targets;
+ }
+
+ /**
+ * Returns list of scripts that don't support ResourceLoader
+ * @return Array
+ */
+ public function getLegacyScripts() {
+ if ( $this->supportsResourceLoader() ) {
+ return [];
+ }
+ return $this->scripts;
+ }
+
+ /**
+ * Returns names of resources this gadget depends on
+ * @return Array
+ */
+ public function getDependencies() {
+ return $this->dependencies;
+ }
+
+ /**
+ * Get list of extra modules that should be loaded when this gadget is enabled
+ *
+ * Primary use case is to allow a Gadget that includes JavaScript to also load
+ * a (usually, hidden) styles-type module to be applied to the page. Dependencies
+ * don't work for this use case as those would not be part of page rendering.
+ *
+ * @return Array
+ */
+ public function getPeers() {
+ return $this->peers;
+ }
+
+ /**
+ * @return array
+ */
+ public function getMessages() {
+ return $this->messages;
+ }
+
+ /**
+ * Returns array of permissions required by this gadget
+ * @return Array
+ */
+ public function getRequiredRights() {
+ return $this->requiredRights;
+ }
+
+ /**
+ * Returns array of skins where this gadget works
+ * @return Array
+ */
+ public function getRequiredSkins() {
+ return $this->requiredSkins;
+ }
+
+ /**
+ * Returns the load type of this Gadget's ResourceLoader module
+ * @return string 'styles' or 'general'
+ */
+ public function getType() {
+ if ( $this->type === 'styles' || $this->type === 'general' ) {
+ return $this->type;
+ }
+ // Similar to ResourceLoaderWikiModule default
+ if ( $this->styles && !$this->scripts && !$this->dependencies ) {
+ return 'styles';
+ } else {
+ return 'general';
+ }
+ }
+}