/** * Compute the files to be include * * @param string $folder folder name to search into (images, css, js, ...) * @param string $file path to file * @param boolean $relative path to file is relative to /core folder * @param boolean $detect_browser detect browser to include specific browser files * @param boolean $detect_debug detect debug to include compressed files if debug is on * @return array files to be included */ protected static function includeRelativeFiles($folder, $file, $relative, $detect_browser, $detect_debug) { // If http is present in filename if (strpos($file, 'http') === 0) { $includes = array($file); } else { $root = rtrim(App::get('request')->root(true), '/'); // Extract extension and strip the file $strip = preg_replace('/\\.[^.]*$/', '', $file); $ext = App::get('filesystem')->extension($file); // Detect browser and compute potential files if ($detect_browser) { $navigator = new \Hubzero\Browser\Detector(); $browser = $navigator->name(); $major = $navigator->major(); $minor = $navigator->minor(); // Try to include files named filename.ext, filename_browser.ext, filename_browser_major.ext, filename_browser_major_minor.ext // where major and minor are the browser version names $potential = array($strip, $strip . '_' . $browser, $strip . '_' . $browser . '_' . $major, $strip . '_' . $browser . '_' . $major . '_' . $minor); } else { $potential = array($strip); } // If relative search in template directory or media directory if ($relative) { // Get the template $template = App::get('template')->template; // Prepare array of files $includes = array(); // For each potential files foreach ($potential as $strip) { $files = array(); // Detect debug mode if ($detect_debug && App::get('config')->get('debug')) { $files[] = $strip . '-uncompressed.' . $ext; } $files[] = $strip . '.' . $ext; // Loop on 1 or 2 files and break on first found foreach ($files as $file) { // If the file is in the template folder if (file_exists(JPATH_THEMES . "/{$template}/{$folder}/{$file}")) { $includes[] = App::get('request')->base(true) . "/templates/{$template}/{$folder}/{$file}"; break; } else { // If the file contains any /: it can be in an media extension subfolder if (strpos($file, '/')) { // Divide the file extracting the extension as the first part before / list($extension, $file) = explode('/', $file, 2); // If the file yet contains any /: it can be a plugin if (strpos($file, '/')) { // Divide the file extracting the element as the first part before / list($element, $file) = explode('/', $file, 2); // Try to deal with plugins group in the media folder if (file_exists(PATH_ROOT . "/core/{$extension}/{$element}/{$folder}/{$file}")) { $includes[] = $root . "/core/{$extension}/{$element}/{$folder}/{$file}" . '?v=' . filemtime(PATH_ROOT . "/core/{$extension}/{$element}/{$folder}/{$file}"); break; } elseif (file_exists(PATH_ROOT . "/core/{$extension}/{$folder}/{$element}/{$file}")) { $includes[] = $root . "/core/{$extension}/{$folder}/{$element}/{$file}" . '?v=' . filemtime(PATH_ROOT . "/core/{$extension}/{$folder}/{$element}/{$file}"); break; } elseif (file_exists(JPATH_THEMES . "/{$template}/{$folder}/system/{$element}/{$file}")) { $includes[] = $root . "/templates/{$template}/{$folder}/system/{$element}/{$file}" . '?v=' . filemtime(JPATH_THEMES . "/{$template}/{$folder}/system/{$element}/{$file}"); break; } elseif (file_exists(PATH_ROOT . "/core/assets/{$folder}/{$element}/{$file}")) { $includes[] = $root . "/core/assets/{$folder}/{$element}/{$file}" . '?v=' . filemtime(PATH_ROOT . "/core/assets/{$folder}/{$element}/{$file}"); break; } } elseif (file_exists(PATH_ROOT . "/core/{$extension}/{$folder}/{$file}")) { $includes[] = $root . "/core/{$extension}/{$folder}/{$file}" . '?v=' . filemtime(PATH_ROOT . "/core/{$extension}/{$folder}/{$file}"); break; } elseif (file_exists(JPATH_THEMES . "/{$template}/{$folder}/system/{$file}")) { $includes[] = $root . "/templates/{$template}/{$folder}/system/{$file}" . '?v=' . filemtime(JPATH_THEMES . "/{$template}/{$folder}/system/{$file}"); break; } elseif (file_exists(PATH_ROOT . "/core/assets/{$folder}/{$file}")) { $includes[] = $root . "/core/assets/{$folder}/{$file}" . '?v=' . filemtime(PATH_ROOT . "/core/assets/{$folder}/{$file}"); break; } } elseif (file_exists(PATH_ROOT . "/core/assets/{$folder}/{$file}")) { $includes[] = $root . "/core/assets/{$folder}/{$file}" . '?v=' . filemtime(PATH_ROOT . "/core/assets/{$folder}/{$file}"); break; } } } } } else { $includes = array(); foreach ($potential as $strip) { // Detect debug mode if ($detect_debug && App::get('config')->get('debug') && file_exists(PATH_ROOT . "/{$strip}-uncompressed.{$ext}")) { $includes[] = $root . "/{$strip}-uncompressed.{$ext}"; } elseif (file_exists(PATH_ROOT . "/{$strip}.{$ext}")) { $includes[] = $root . "/{$strip}.{$ext}"; } } } } return $includes; }
/** * Check if the plugin can render for the provided browser * * @return boolean */ protected function canRender() { $browser = new \Hubzero\Browser\Detector(); if ($allowed = trim($this->params->get('browsers'))) { $browsers = array(); $allowed = str_replace("\r", '', $allowed); $allowed = str_replace('\\n', "\n", $allowed); $allowed = explode("\n", $allowed); foreach ($allowed as $allow) { $allow = trim($allow); if (preg_match('/(.+?),\\s+([^\\s]+)\\s+(\\d+)\\.(\\d+)/i', $allow, $matches)) { $req = new stdClass(); $req->name = strtolower(trim($matches[2])); $req->major = intval($matches[3]); $req->minor = intval($matches[4]); $req->os = strtolower(trim($matches[1])); $browsers[] = $req; } } $matched = false; foreach ($browsers as $minimum) { if ($minimum->os != '*' && $minimum->os != strtolower($browser->platform())) { continue; } if ($minimum->name != strtolower($browser->name())) { continue; } // If we get to here, we have a matching OS and browser if ($minimum->major > $browser->major()) { return false; } if ($minimum->major == $browser->major() && $minimum->minor > $browser->minor()) { return false; } $matched = true; } if (!$matched) { return false; } } if ($regexes = trim($this->params->get('regexes'))) { $regexes = str_replace("\r", '', $regexes); $regexes = str_replace('\\n', "\n", $regexes); $regexes = explode("\n", $regexes); foreach ($regexes as $disallow) { $disallow = trim($disallow); if (preg_match("/{$disallow}/i", $browser->agent(), $matches)) { return false; } } } return true; }