/** * Load information stored in the database about modules. * * This method grabs modules dependencies from the database and updates modules * objects. * * This is not inside the module code because it is much faster to * request all of the information at once than it is to have each module * requests its own information. This sacrifice of modularity yields a substantial * performance improvement. * * @param array $moduleNames List of module names to preload information for * @param ResourceLoaderContext $context Context to load the information within */ public function preloadModuleInfo(array $moduleNames, ResourceLoaderContext $context) { if (!$moduleNames) { // Or else Database*::select() will explode, plus it's cheaper! return; } $dbr = wfGetDB(DB_SLAVE); $skin = $context->getSkin(); $lang = $context->getLanguage(); // Batched version of ResourceLoaderModule::getFileDependencies $vary = "{$skin}|{$lang}"; $res = $dbr->select('module_deps', array('md_module', 'md_deps'), array('md_module' => $moduleNames, 'md_skin' => $vary), __METHOD__); // Prime in-object cache for file dependencies $modulesWithDeps = array(); foreach ($res as $row) { $module = $this->getModule($row->md_module); if ($module) { $module->setFileDependencies($context, ResourceLoaderModule::expandRelativePaths(FormatJson::decode($row->md_deps, true))); $modulesWithDeps[] = $row->md_module; } } // Register the absence of a dependency row too foreach (array_diff($moduleNames, $modulesWithDeps) as $name) { $module = $this->getModule($name); if ($module) { $this->getModule($name)->setFileDependencies($context, array()); } } // Prime in-object cache for message blobs for modules with messages $modules = array(); foreach ($moduleNames as $name) { $module = $this->getModule($name); if ($module && $module->getMessages()) { $modules[$name] = $module; } } $store = $this->getMessageBlobStore(); $blobs = $store->getBlobs($modules, $lang); foreach ($blobs as $name => $blob) { $modules[$name]->setMessageBlob($blob, $lang); } }
/** * Get the definition summary for this module. * * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { global $IP; $summary = parent::getDefinitionSummary($context); $summary[] = ['vars' => $this->getConfigSettings($context), 'wgLegacyJavaScriptGlobals' => $this->getConfig()->get('LegacyJavaScriptGlobals'), 'moduleHashes' => $this->getAllModuleHashes($context), 'fileMtimes' => [filemtime("{$IP}/resources/src/startup.js")]]; return $summary; }
/** * Get the definition summary for this module. * * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $summary = parent::getDefinitionSummary($context); $options = array(); foreach (array('scripts', 'debugScripts', 'loaderScripts', 'styles', 'languageScripts', 'skinScripts', 'skinStyles', 'messages', 'templates', 'skipFunction', 'debugRaw', 'raw') as $member) { $options[$member] = $this->{$member}; } $summary[] = array('options' => $options, 'fileHashes' => $this->getFileHashes($context), 'msgBlobMtime' => $this->getMsgBlobMtime($context->getLanguage())); return $summary; }
/** * @param ResourceLoaderContext $context * @return array */ public function getScriptURLsForDebug(ResourceLoaderContext $context) { // Bypass file module urls return ResourceLoaderModule::getScriptURLsForDebug($context); }
/** * Generate the message blob for a given module in a given language. * * @param ResourceLoaderModule $module * @param string $lang Language code * @return string JSON object */ private function generateMessageBlob(ResourceLoaderModule $module, $lang) { $messages = array(); foreach ($module->getMessages() as $key) { $messages[$key] = wfMessage($key)->inLanguage($lang)->plain(); } return FormatJson::encode((object) $messages); }
/** * Generate the message blob for a given module in a given language. * * @param ResourceLoaderModule $module * @param string $lang Language code * @return string JSON blob */ private function generateMessageBlob(ResourceLoaderModule $module, $lang) { $messages = []; foreach ($module->getMessages() as $key) { $messages[$key] = $this->fetchMessage($key, $lang); } $json = FormatJson::encode((object) $messages); if ($json === false) { $this->logger->warning('Failed to encode message blob for {module} ({lang})', ['module' => $module->getName(), 'lang' => $lang]); $json = '{}'; } return $json; }
/** * @return JSParser */ protected static function javaScriptParser() { if (!self::$jsParser) { self::$jsParser = new JSParser(); } return self::$jsParser; }
/** * Generate the message blob for a given module in a given language. * * @param ResourceLoaderModule $module * @param string $lang Language code * @return string JSON blob */ private function generateMessageBlob(ResourceLoaderModule $module, $lang) { $messages = array(); foreach ($module->getMessages() as $key) { $messages[$key] = $this->fetchMessage($key, $lang); } return FormatJson::encode((object) $messages); }
/** * Generate the message blob for a given module in a given language. * * @param $module ResourceLoaderModule object * @param $lang String: language code * @return String: JSON object */ private static function generateMessageBlob(ResourceLoaderModule $module, $lang) { $messages = array(); foreach ($module->getMessages() as $key) { $messages[$key] = wfMsgExt($key, array('language' => $lang)); } return FormatJson::encode((object) $messages); }
public function getModifiedTime(ResourceLoaderContext $context) { return max($this->getGitHeadModifiedTime($context), $this->getMsgBlobMtime($context->getLanguage()), ResourceLoaderModule::safeFilemtime(__FILE__)); }
public function isPositionDefault() { $this->loadFromDefinition(); return parent::isPositionDefault(); }
/** * Get the definition summary for this module. * * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $this->loadFromDefinition(); $summary = parent::getDefinitionSummary($context); $options = []; foreach (['localBasePath', 'images', 'variants', 'prefix', 'selectorWithoutVariant', 'selectorWithVariant'] as $member) { $options[$member] = $this->{$member}; } $summary[] = ['options' => $options, 'fileHashes' => $this->getFileHashes($context)]; return $summary; }
/** * @param $context ResourceLoaderContext * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $r = parent::getDefinitionSummary($context); return $r + array('class' => get_class($this), 'lang' => $this->lang, 'geshi' => GESHI_VERSION); }
/** * Get the definition summary for this module. * * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $summary = parent::getDefinitionSummary($context); foreach (array('scripts', 'debugScripts', 'loaderScripts', 'styles', 'languageScripts', 'skinScripts', 'skinStyles', 'dependencies', 'messages', 'targets', 'templates', 'group', 'position', 'skipFunction', 'localBasePath', 'remoteBasePath', 'debugRaw', 'raw') as $member) { $summary[$member] = $this->{$member}; } return $summary; }
/** * Get flag value * * @param $name string Parameter name */ protected function reallyGetFlag($name) { if ($name == 'sass') { $styles = array(); if (!empty($this->styles)) { $styles = array_merge($styles, (array) $this->styles); } if (!empty($this->skinStyles)) { foreach ($this->skinStyles as $skin => $skinStyles) { if (!empty($skinStyles)) { $styles = array_merge($styles, (array) $skinStyles); } } } $requireSass = false; foreach ($styles as $k => $style) { if (is_array($style)) { $style = $k; } if (self::getFileType($style) == self::FILE_TYPE_SASS) { $requireSass = true; } } return $requireSass; } return parent::reallyGetFlag($name); }
/** * Get the definition summary for this module. * * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $this->loadFromDefinition(); $summary = parent::getDefinitionSummary($context); foreach (['localBasePath', 'images', 'variants', 'prefix', 'selectorWithoutVariant', 'selectorWithVariant'] as $member) { $summary[$member] = $this->{$member}; } return $summary; }
/** * Get the definition summary for this module. * * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $summary = parent::getDefinitionSummary($context); $options = []; foreach (['scripts', 'debugScripts', 'styles', 'languageScripts', 'skinScripts', 'skinStyles', 'messages', 'templates', 'skipFunction', 'debugRaw', 'raw'] as $member) { $options[$member] = $this->{$member}; } $summary[] = ['options' => $options, 'fileHashes' => $this->getFileHashes($context), 'messageBlob' => $this->getMessageBlob($context)]; return $summary; }
/** * @param ResourceLoaderContext $context * @return array */ public function getDefinitionSummary(ResourceLoaderContext $context) { $summary = parent::getDefinitionSummary($context); $summary[] = array('pages' => $this->getPages($context), 'titleInfo' => $this->getTitleInfo($context)); return $summary; }
/** * Load information stored in the database about modules. * * This method grabs modules dependencies from the database and updates modules * objects. * * This is not inside the module code because it is much faster to * request all of the information at once than it is to have each module * requests its own information. This sacrifice of modularity yields a substantial * performance improvement. * * @param array $modules List of module names to preload information for * @param ResourceLoaderContext $context Context to load the information within */ public function preloadModuleInfo(array $modules, ResourceLoaderContext $context) { if (!count($modules)) { // Or else Database*::select() will explode, plus it's cheaper! return; } $dbr = wfGetDB(DB_SLAVE); $skin = $context->getSkin(); $lang = $context->getLanguage(); // Batched version of ResourceLoaderModule::getFileDependencies $vary = "{$skin}|{$lang}"; $res = $dbr->select('module_deps', array('md_module', 'md_deps'), array('md_module' => $modules, 'md_skin' => $vary), __METHOD__); // Prime in-object cache values for each module $modulesWithDeps = array(); foreach ($res as $row) { $module = $this->getModule($row->md_module); if ($module) { $module->setFileDependencies($context, ResourceLoaderModule::expandRelativePaths(FormatJson::decode($row->md_deps, true))); $modulesWithDeps[] = $row->md_module; } } // Register the absence of a dependency row too foreach (array_diff($modules, $modulesWithDeps) as $name) { $module = $this->getModule($name); if ($module) { $this->getModule($name)->setFileDependencies($context, array()); } } // Get message blob mtimes. Only do this for modules with messages $modulesWithMessages = array(); foreach ($modules as $name) { $module = $this->getModule($name); if ($module && count($module->getMessages())) { $modulesWithMessages[] = $name; } } $modulesWithoutMessages = array_flip($modules); // Will be trimmed down by the loop below if (count($modulesWithMessages)) { $res = $dbr->select('msg_resource', array('mr_resource', 'mr_timestamp'), array('mr_resource' => $modulesWithMessages, 'mr_lang' => $lang), __METHOD__); foreach ($res as $row) { $module = $this->getModule($row->mr_resource); if ($module) { $module->setMsgBlobMtime($lang, wfTimestamp(TS_UNIX, $row->mr_timestamp)); unset($modulesWithoutMessages[$row->mr_resource]); } } } foreach (array_keys($modulesWithoutMessages) as $name) { $module = $this->getModule($name); if ($module) { $module->setMsgBlobMtime($lang, 1); } } }
/** * @param ResourceLoaderContext $context * @return array */ public function getStyleURLsForDebug(ResourceLoaderContext $context) { if ($this->hasGeneratedStyles) { // Do the default behaviour of returning a url back to load.php // but with only=styles. return parent::getStyleURLsForDebug($context); } // Our module consists entirely of real css files, // in debug mode we can load those directly. $urls = array(); foreach ($this->getStyleFiles($context) as $mediaType => $list) { $urls[$mediaType] = array(); foreach ($list as $file) { $urls[$mediaType][] = $this->getRemotePath($file); } } return $urls; }
public function getDefinitionSummary(ResourceLoaderContext $context) { $summary = parent::getDefinitionSummary($context); $summary[] = array('script' => $this->getScript($context)); return $summary; }
/** * Don't break debug mode by only showing file URLs */ public function getScriptURLsForDebug(ResourceLoaderContext $context) { return ResourceLoaderModule::getScriptURLsForDebug($context); }