<?php if (!isset($gCms)) { exit; } $url = $this->GetPreference('ical_holidays'); if (!$url) { return; } $minutes = 7 * 24 * 60; // 7 DAYS $cachedfile = new cge_cached_remote_file($url, $minutes); if (!$cachedfile->size()) { return; } $ical = new \CGCalendar\IcalParser(); $ical->parseFile($cachedfile->get_dest()); $events = $ical->getSortedEvents(); if (count($events)) { $out = array(); foreach ($events as $event) { $obj = array(); $obj['start'] = $event['DTSTART']->format('Y-m-d'); $obj['end'] = $event['DTEND']->format('Y-m-d'); $obj['allDay'] = true; $obj['title'] = $event['SUMMARY']; $obj['type'] = 'holiday'; $out[] = $obj; } \cge_utils::send_ajax_and_exit($out); }
/** * Render the output javascript and stylesheets into cachable files * and output the appropriate HTML tags. * * @param array $opts Options for this method (for further reference, see the {cgjs_render} smarty tag. * @return string HTML output code. */ public static function render($opts = null) { if (count(self::$_rlibs) == 0 && count(self::$_required) == 0) { return; } // nothing to do. // process options $options = array(); $options['excludes'] = array(); if (!cmsms()->is_frontend_request()) { // the cmsms admin console includes versions of these. $excludes = array(); $excludes[] = 'jquery'; $excludes[] = 'ui'; $excludes[] = 'fileupload'; $options['excludes'] = $excludes; } if (is_array($opts)) { $options = array_merge_recursive($options, $opts); } if (isset($options['no_jquery']) && !in_array('jquery', $options['excludes'])) { $options['excludes'][] = 'jquery'; } if (isset($options['excludes']) && count($options['excludes'])) { // clean up the excludes $out = array(); foreach ($options['excludes'] as &$str) { $str = strtolower(trim($str)); if (!$str) { continue; } if (!in_array($str, $out)) { $out[] = $str; } } $options['excludes'] = $out; } $options['lang'] = \CmsNlsOperations::get_current_language(); // expand some options to simple variables. $config = \cms_config::get_instance(); $cache_lifetime = isset($options['cache_lifetime']) ? (int) $options['cache_lifetime'] : 24; $cache_lifetime = (int) \cge_utils::get_param($config, 'cgejs_cachelife', $cache_lifetime); $cache_lifetime = max($cache_lifetime, 1); $nocache = isset($options['no_cache']) ? TRUE : FALSE; $nocache = \cge_utils::get_param($config, 'cgejs_nocache', $nocache); $nominify = isset($options['nominify']) ? TRUE : FALSE; // overrides anything in libs. $nominify = \cge_utils::get_param($config, 'cgejs_nominify', $nominify); $nocsssmarty = isset($options['nocsssmarty']) || $nominify ? TRUE : $nocache; $addkey = \cge_utils::get_param($options, 'addkey', ''); $do_js = isset($options['no_js']) ? FALSE : TRUE; $do_css = isset($options['no_css']) ? FALSE : TRUE; $js_fmt = '<script type="text/javascript" src="%s"></script>'; $css_fmt = '<link type="text/css" rel="stylesheet" href="%s"/>'; if ($nocache) { $nominify = true; } if (!$nominify) { require_once dirname(__DIR__) . '/jsmin.php'; } $get_relative_url = function ($filename) { $config = \cms_config::get_instance(); $relative_url = ''; if (startswith($filename, $config['root_path'])) { $relative_url = str_replace($config['root_path'], $config['root_url'], dirname($filename)); if (!endswith($relative_url, '/')) { $relative_url .= '/'; } if (startswith($relative_url, 'http:')) { $relative_url = substr($relative_url, 5); } if (startswith($relative_url, 'https:')) { $relative_url = substr($relative_url, 6); } } return $relative_url; }; $fix_css_urls = function ($css, $url_prefix) { $css_search = '#url\\(\\s*[\'"]?(.*?)[\'"]?\\s*\\)#'; $css_url_fix = function ($matches) use($url_prefix) { if (startswith($matches[1], 'data:')) { return $matches[0]; } if (startswith($matches[1], 'http:')) { return $matches[0]; } if (startswith($matches[1], 'https:')) { return $matches[0]; } if (startswith($matches[1], '//')) { return $matches[0]; } //$str = substr($matches[1],0,-1); $str = $matches[1]; return "url('{$url_prefix}{$str}')"; }; $out = preg_replace_callback($css_search, $css_url_fix, $css); return $out; }; $get_code = function ($rec, $type) use(&$get_relative_url, &$fix_css_urls) { $config = \cms_config::get_instance(); if ($type == "js") { $js = null; if (isset($rec->jsfile)) { $jsfile = $rec->jsfile; if (!is_array($jsfile)) { $jsfile = array($jsfile); } $js = null; foreach ($jsfile as $one_file) { $one_file = self::_expand_filename($one_file); $js .= "/* jsloader // javascript file {$one_file} */\n"; if (is_file($one_file)) { $js .= @file_get_contents($one_file); } } } else { if (isset($rec->jsurl)) { // cache this for at least 24 hours if (startswith($rec->jsurl, $config['root_url'])) { $fn = str_replace($config['root_url'], $config['root_path'], $rec->jsurl); if (is_file($fn)) { if (!endswith($js, "\n")) { $js .= "\n"; } $js .= "/* jsloader // javascript local file from url {$fn} */\n"; $js .= file_get_contents($fn); } } else { $crf = new \cge_cached_remote_file($rec->jsurl, 48 * 60); if ($crf->size()) { if (!endswith($js, "\n")) { $js .= "\n"; } $js .= "/* jsloader // javascript remote {$rec->jsurl} */\n"; $js .= $crf->file_get_contents(); } } } else { if (isset($rec->code)) { $js .= "/* jsloader // javascript inline code */\n"; $js .= $rec->code; } } } return $js; } else { // css $css = null; if (isset($rec->cssfile)) { $cssfile = $rec->cssfile; if (!is_array($cssfile)) { $cssfile = array($cssfile); } foreach ($cssfile as $one_file) { $one_file = self::_expand_filename($one_file); $tmp = file_get_contents($one_file); $css .= "/* jsloader//css file: {$one_file} */\n"; $relative_url = $get_relative_url($one_file); $tmp = $fix_css_urls($tmp, $relative_url); $css .= $tmp; } } else { if (isset($rec->cssname)) { if (version_compare(CMS_VERSION, '1.99-alpha0') < 0) { $query = 'SELECT css_id, css_name, css_text FROM ' . cms_db_prefix() . 'css WHERE css_name = ?'; $db = CmsApp::get_instance()->GetDb(); $row = $db->GetRow($query, array($rec->cssname)); if (!is_array($row)) { return; } $css = trim($row['css_text']); } else { $css = CmsLayoutStylesheet::load($rec->cssname)->get_content(); } } else { if (isset($rec->cssurl)) { if (startswith($rec->cssurl, $config['root_url'])) { $fn = str_replace($config['root_url'], $config['root_path'], $rec->cssurl); if (is_file($fn)) { $relative_url = $get_relative_url($fn); $tmp .= file_get_contents($fn); $tmp = $fix_css_urls($tmp, $relative_url); if (!endswith($css, "\n")) { $css .= "\n"; } $css .= "/* jsloader //css local file from url {$fn} */\n"; $css .= $tmp; } } else { $crf = new \cge_cached_remote_file($rec->cssurl, 48 * 60); if ($crf->size()) { if (!endswith($css, "\n")) { $css .= "\n"; } $css .= "/* jsloader//css remote {$rec->cssurl} */\n"; $css .= $crf->file_get_contents(); } } } else { if (isset($rec->styles)) { $css .= "/* jsloader//css inline code */\n"; $css .= $rec->styles; } } } } return $css; } }; $get_minified_code = function ($rec, $type) use(&$get_code) { /* check for a cached version of this code */ $fn = TMP_CACHE_LOCATION . '/cgejs_' . md5(__FILE__ . serialize($rec) . $type) . '.cache'; if (is_file($fn)) { return file_get_contents($fn); } // not in cache // calculate a prefix to go on top of the cache file, and test if we are really minifying $code = $prefix = null; $do_minify = TRUE; if ($type == 'js') { if (isset($rec->js_nominify) && $rec->js_nominify) { $do_minify = FALSE; } if ($do_minify && isset($rec->jsfile)) { $jsfile = $rec->jsfile; if (!is_array($jsfile)) { $jsfile = array($jsfile); } foreach ($jsfile as $one) { if (strpos($one, '.min') !== FALSE || strpos($one, '.pack') !== FALSE) { $do_minify = FALSE; break; } } } if ($do_minify && isset($rec->jsurl)) { if (strpos($rec->jsurl, '.min') !== FALSE || strpos($rec->jsurl, '.pack') !== FALSE) { $do_minify = FALSE; } } $prefix = "/* jsloader // cached javascript // "; if (isset($rec->name)) { $prefix .= $rec->name; } else { if (isset($rec->jsfile)) { if (is_string($rec->jsfile)) { $prefix .= $rec->jsfile; } else { $prefix .= $rec->jsfile[0]; } } else { if (isset($rec->code)) { $prefix .= 'inline code'; } } } $prefix .= " */\n"; } else { // CSS if (isset($rec->css_nominify) && $rec->css_nominify) { $do_minify = FALSE; } if ($do_minify && isset($rec->cssfile)) { $cssfile = $rec->cssfile; if (!is_array($cssfile)) { $cssfile = array($cssfile); } foreach ($cssfile as $one) { if (strpos($one, '.min') !== FALSE || strpos($one, '.pack') !== FALSE) { $do_minify = FALSE; break; } } } if ($do_minify && isset($rec->cssurl)) { if (strpos($rec->cssurl, '.min') !== FALSE || strpos($rec->cssurl, '.pack') !== FALSE) { $do_minify = FALSE; } } $prefix = "/* jsloader // cached css // "; if (isset($rec->name)) { $prefix .= $rec->name; } else { if (isset($rec->cssfile)) { if (is_string($rec->cssfile)) { $prefix .= $rec->cssfile; } else { $prefix .= $rec->cssfile[0]; } } else { $prefix .= 'inline code'; } } $prefix .= " */\n"; } // get the code. $code = $get_code($rec, $type); if ($code) { // got code... are we minifying and caching it? if ($do_minify) { $code = \JSMin::minify($code); $code = $prefix . $code; file_put_contents($fn, $code); } return $code; } }; // determine if we have to process all this cruft (which could potentially be very expensive) $sig = md5(serialize(self::$_rlibs) . serialize(self::$_required) . serialize($options) . $nocache . $nominify . $cache_lifetime); $cache_js = TMP_CACHE_LOCATION . "/cgejs_{$sig}.js"; $cache_css = TMP_CACHE_LOCATION . "/cgejs_{$sig}.css"; $do_js_tag = $do_css_tag = FALSE; $do_js2 = $do_css2 = FALSE; $do_processing = TRUE; if ($nocache) { // forced to rejenerate. $do_js2 = $do_css2 = TRUE; } else { /* we can cache */ $etime = time() - $cache_lifetime * 3600; if (is_file($cache_js)) { $mtime1 = @filemtime($cache_js); $do_js_tag = TRUE; if ($mtime1 < $etime) { // cache too olo, forced to rebuild $do_js2 = FALSE; } } else { // no file, gotta process. $do_js2 = TRUE; } if (is_file($cache_css)) { $mtime2 = @filemtime($cache_css); $do_css_tag = TRUE; if ($mtime2 < $etime) { // cache too old, forced to rebuild $do_css2 = FALSE; } } else { // no file, gotta process. $do_css2 = TRUE; } } if ($do_js2 || $do_css2) { // okay, we have work to do. static $list = null; if (is_null($list)) { // now expand all our dependencies. $list_0 = array(); $required = array_merge(self::$_rlibs, self::$_required); foreach ($required as $rec) { if (isset($rec->depends)) { self::_resolve_dependencies($rec, $list_0, $options['excludes']); } else { $sig = md5(serialize($rec)); $list_0[$sig] = $rec; } } // now check for callback items // and get their code... this may be an expensive process // note: may also have dependencies $list = array(); foreach ($list_0 as $rec) { if (isset($rec->callback)) { $tmp = call_user_func($rec->callback, $rec->name); if (is_object($tmp) && (isset($tmp->code) || isset($tmp->styles))) { $list[] = $tmp; } } else { $list[] = $rec; } } unset($required, $list_0); } // // process js // if ($do_js && $do_js2 && $list && count($list)) { $txt = null; foreach ($list as $rec) { if ($nominify) { $txt .= $get_code($rec, 'js'); } else { $txt .= $get_minified_code($rec, 'js'); } } if ($txt) { $do_js_tag = TRUE; file_put_contents($cache_js, $txt); } } // // process css // if ($do_css && $do_css2 && $list && count($list)) { $txt = null; foreach ($list as $rec) { if ($nominify) { $txt .= $get_code($rec, 'css'); } else { $txt .= $get_minified_code($rec, 'css'); } } if ($txt) { $do_css_tag = TRUE; file_put_contents($cache_css, $txt); } } // do_css } // do processing // do the output. if ($nocache) { $cache_js .= '?_t=' . time(); $cache_css .= '?_t=' . time(); } $out = null; if ($do_js_tag) { $cache_url = $config['root_url'] . '/tmp/cache/' . basename($cache_js); $out .= trim(sprintf($js_fmt, $cache_url)) . "\n"; } if ($do_css_tag) { $cache_url = $config['root_url'] . '/tmp/cache/' . basename($cache_css); $out .= trim(sprintf($css_fmt, $cache_url)) . "\n"; } // all freaking done return $out; }