'', 'url' => '', 'official' => false, 'fsname' => $theme, 'description' => '', 'htmltheme' => true, 'version' => "1.0", 'author' => '', 'screenshot' => '' ); if (file_exists($path)) { $f = @fopen($path,'r'); $contents = ""; if ($f) { $contents .= fread($f, filesize($path)); @fclose($f); } else { $contents = ""; } if ($contents && preg_match_all("/^\s?([^:]+):(.*)$/m",$contents,$matches,PREG_SET_ORDER)) { foreach($matches as $match) { $key = trim(strtolower($match[1])); $val = trim($match[2]); if (array_key_exists($key,$ret)) { if ($val == 'true') { $ret[$key] = true; } elseif ($val == 'false') { $ret[$key] = false; } else { $ret[$key] = $val; } } } } } return $ret; } function getThemePath($path=null) { list($theme,$media) = getActualTheme(); if (null === $path) $path = getPath(); return $path.RSS_THEME_DIR."/$theme/$media/"; } /** * Returns an array holding the "main" theme to use, * as well as the detected "media" (@see getThemeMedia) */ function getActualTheme() { static $ret; if ($ret) { return $ret; } // Theme $theme = getConfig('rss.output.theme'); if (null === $theme) $theme = 'default'; if (defined('THEME_OVERRIDE')) { $theme = THEME_OVERRIDE; } elseif (isset($_GET['theme'])) { $theme = sanitize($_GET['theme'],RSS_SANITIZER_WORDS); } // Media $media = getThemeMedia(); if( !file_exists(GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/") ) $theme = 'default'; $ret = array($theme,$media); return $ret; } /** * Returns the theme's "media" component, e.g. 'web', * 'rss' or 'mobile'. */ function getThemeMedia() { static $media; if ($media) { return $media; } // Default to "web". $media = 'web'; // Has the user specified anything? if (isset($_GET['rss'])) { $media = 'rss'; } elseif (isset($_SESSION['mobile']) || isset($_REQUEST['mobile']) || isMobileDevice()) { $media = 'mobile'; } // This is here so that auto-detected (e.g. mobile) medias // can be overridden. if (isset($_REQUEST['media'])) { $media = sanitize($_REQUEST['media'], RSS_SANITIZER_WORDS); } // Finally: let plugins voice their opinion $media = rss_plugin_hook('rss.plugins.thememedia',$media); return $media; } /** * Dumb dunciton to detect mobile devices based on the passed user-agent. * This definitely needs some heavy tweaking. */ function isMobileDevice() { static $ret; if ($ret !== NULL) { return $ret; } else { $ret = false; if (isset($_SERVER['HTTP_USER_AGENT'])) { $ua = $_SERVER['HTTP_USER_AGENT']; $ua_lwr = strtolower( $ua ); $ret = (strpos($ua, 'SonyEricsson') !== FALSE) || (strpos($ua, 'Nokia') !== FALSE) || (strpos($ua, 'Tablet') !== FALSE) || (strpos($ua, 'MIDP') !== FALSE) || (strpos($ua_lwr,'mobile') !== FALSE) || (strpos($ua, 'Windows CE') !== FALSE) || (strpos($ua, 'EPOC') !== FALSE) || (strpos($ua, 'Opera Mini') !== FALSE) || (strpos($ua, 'UP.Browser') !== FALSE) || (strpos($ua_lwr,'j2me') !== FALSE) || (strpos($ua, 'SGH-') !== FALSE) // Samsung || (strpos($ua_lwr,'samsung') !== FALSE) || (strpos($ua_lwr,'netfront') !== FALSE); // if none of those matched, let's have a gander at grabbing the resolution... if (!$ret && eregi( "([0-9]{3})x([0-9]{3})", $ua, $matches ) ) { if ($matches[1]<600 || $matches[2]<600) { $ret = true; //one of the screen dimensions is less than 600 - we'll call it a mobile device } } } return $ret; } } function rss_theme_option_ref_obj_from_theme($theme=null, $media=null) { if ($theme===null) { list($theme,$media) = getActualTheme(); } $ref_obj = "theme.$theme"; if( $media !== null ) $ref_obj .= ".$media"; return $ref_obj; } function rss_theme_get_option($option, $theme=null, $media=null) { return getProperty(rss_theme_option_ref_obj_from_theme($theme,$media), $option); } function rss_theme_set_option($option, $value, $theme, $media) { setProperty(rss_theme_option_ref_obj_from_theme($theme,$media), $option, 'theme', $value); } function rss_theme_delete_option($option, $theme=null, $media=null) { return deleteProperty(rss_theme_option_ref_obj_from_theme($theme,$media), $option); } function rss_theme_config_override_option_name_mangle($config_key) { return preg_replace( '/^rss\./', 'rss.prop.theme.', $config_key ) . '.override'; } function rss_theme_config_override_option($config_key, $default, $theme=null, $media=null) { $ret = getProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle($config_key)); if( $ret === null ) $ret = $default; rss_config_override($config_key,$ret); return $ret; } function rss_theme_set_config_override_option($config_key, $value, $theme=null, $media=null) { setProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle($config_key), 'theme', $value); } function rss_theme_delete_config_override_option($config_key, $theme=null, $media=null) { deleteProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle($config_key)); } function loadSchemeList($pretty, $theme=null, $media=null) { if ($theme===null) { list($theme,$media) = getActualTheme(); } $ret = array( '(use default scheme)' ); if( file_exists( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes" ) ) { if( $checkDir = opendir( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes" ) ) { while($file = readdir($checkDir)) { if($file != "." && $file != ".." && $file != ".svn") { if(file_exists(GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/" . $file) && is_dir(GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/" . $file)) { if( $pretty ) $theme_info = getThemeInfo( "$theme/$media/schemes/$file" ); if( $pretty && isset( $theme_info['name'] ) && $theme_info['name'] !== '' ) $ret[] = str_replace( ",", "_", $theme_info['name'] ); else $ret[] = str_replace( ",", "_", $file ); } } } } } return $ret; } function rss_scheme_stylesheets($theme=null, $media=null) { if ($theme===null) { list($theme,$media) = getActualTheme(); } $ret = getProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle('rss.output.theme.scheme')); if( $ret === null ) return ""; $arr = explode(',',$ret); $ret = ""; $idx = array_pop($arr); foreach (loadSchemeList( false, $theme, $media) as $i => $val) { if ($i == $idx) { if( $i > 0 ) { if( file_exists( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val" ) && is_dir( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val" ) ) { foreach( glob( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val/*.css" ) as $file ) { $file = substr( $file, strlen( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val/" ) ); $file = getPath().RSS_THEME_DIR."/$theme/$media/schemes/$val/$file"; $ret .= " \n"; } } } break; } } return $ret; } ?>