/** * Creates an instance of this class from definition in MediaWiki:Gadgets-definition * @param $definition String: Gadget definition * @return Gadget|bool Instance of Gadget class or false if $definition is invalid */ public static function newFromDefinition($definition) { $m = array(); if (!preg_match('/^\\*+ *([a-zA-Z](?:[-_:.\\w\\d ]*[a-zA-Z0-9])?)(\\s*\\[.*?\\])?\\s*((\\|[^|]*)+)\\s*$/', $definition, $m)) { return false; } // 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 // Also, title-normalization applies. $gadget = new Gadget(); $gadget->name = trim(str_replace(' ', '_', $m[1])); // If the name is too long, then RL will throw an MWException when // we try to register the module if (!ResourceLoader::isValidModuleName($gadget->getModuleName())) { return false; } $gadget->definition = $definition; $options = trim($m[2], ' []'); foreach (preg_split('/\\s*\\|\\s*/', $options, -1, PREG_SPLIT_NO_EMPTY) as $option) { $arr = preg_split('/\\s*=\\s*/', $option, 2); $option = $arr[0]; if (isset($arr[1])) { $params = explode(',', $arr[1]); $params = array_map('trim', $params); } else { $params = array(); } switch ($option) { case 'ResourceLoader': $gadget->resourceLoaded = true; break; case 'dependencies': $gadget->dependencies = $params; break; case 'rights': $gadget->requiredRights = $params; break; case 'skins': $gadget->requiredSkins = $params; break; case 'default': $gadget->onByDefault = true; break; case 'targets': $gadget->targets = $params; break; case 'top': $gadget->position = 'top'; break; } } foreach (preg_split('/\\s*\\|\\s*/', $m[3], -1, PREG_SPLIT_NO_EMPTY) as $page) { $page = "Gadget-{$page}"; if (preg_match('/\\.js/', $page)) { $gadget->scripts[] = $page; } elseif (preg_match('/\\.css/', $page)) { $gadget->styles[] = $page; } } return $gadget; }
/** * Whether the provided gadget id is valid * * @param string $id * @return bool */ public static function isValidGadgetID($id) { return strlen($id) > 0 && ResourceLoader::isValidModuleName("ext.gadget.{$id}"); }