You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

136 lines
4.8 KiB

<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* RequireJS helper functions.
*
* @package core
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
defined('MOODLE_INTERNAL') || die();
/**
* Collection of requirejs related methods.
*
* @copyright 2015 Damyon Wiese <damyon@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class core_requirejs {
/**
* Check a single module exists and return the full path to it.
*
* The expected location for amd modules is:
* <componentdir>/amd/src/modulename.js
*
* @param string $component The component determines the folder the js file should be in.
* @param string $jsfilename The filename for the module (with the js extension).
* @param boolean $debug If true, returns the paths to the original (unminified) source files.
* @return array $files An array of mappings from module names to file paths.
* Empty array if the file does not exist.
*/
public static function find_one_amd_module($component, $jsfilename, $debug = false) {
$jsfileroot = core_component::get_component_directory($component);
if (!$jsfileroot) {
return array();
}
$module = str_replace('.js', '', $jsfilename);
$srcdir = $jsfileroot . '/amd/build';
$minpart = '.min';
if ($debug) {
$srcdir = $jsfileroot . '/amd/src';
$minpart = '';
}
$filename = $srcdir . '/' . $module . $minpart . '.js';
if (!file_exists($filename)) {
return array();
}
$fullmodulename = $component . '/' . $module;
return array($fullmodulename => $filename);
}
/**
* Scan the source for AMD modules and return them all.
*
* The expected location for amd modules is:
* <componentdir>/amd/src/modulename.js
*
* @param boolean $debug If true, returns the paths to the original (unminified) source files.
* @return array $files An array of mappings from module names to file paths.
*/
public static function find_all_amd_modules($debug = false) {
global $CFG;
$jsdirs = array();
$jsfiles = array();
$dir = $CFG->libdir . '/amd';
if (!empty($dir) && is_dir($dir)) {
$jsdirs['core'] = $dir;
}
$subsystems = core_component::get_core_subsystems();
foreach ($subsystems as $subsystem => $dir) {
if (!empty($dir) && is_dir($dir . '/amd')) {
$jsdirs['core_' . $subsystem] = $dir . '/amd';
}
}
$plugintypes = core_component::get_plugin_types();
foreach ($plugintypes as $type => $dir) {
$plugins = core_component::get_plugin_list_with_file($type, 'amd', false);
foreach ($plugins as $plugin => $dir) {
if (!empty($dir) && is_dir($dir)) {
$jsdirs[$type . '_' . $plugin] = $dir;
}
}
}
foreach ($jsdirs as $component => $dir) {
$srcdir = $dir . '/build';
if ($debug) {
$srcdir = $dir . '/src';
}
if (!is_dir($srcdir) || !is_readable($srcdir)) {
// This is probably an empty amd directory without src or build.
// Skip it - RecursiveDirectoryIterator fatals if the directory is not readable as an iterator.
continue;
}
$items = new RecursiveDirectoryIterator($srcdir);
foreach ($items as $item) {
$extension = $item->getExtension();
if ($extension === 'js') {
$filename = str_replace('.min', '', $item->getBaseName('.js'));
// We skip lazy loaded modules.
if (strpos($filename, '-lazy') === false) {
$modulename = $component . '/' . $filename;
$jsfiles[$modulename] = $item->getRealPath();
}
}
unset($item);
}
unset($items);
}
return $jsfiles;
}
}