1<?php
2###############################################################################
3# Gregarius - A PHP based RSS aggregator.
4# Copyright (C) 2003 - 2006 Marco Bonetti
5#
6###############################################################################
7# This program is free software and open source software; you can redistribute
8# it and/or modify it under the terms of the GNU General Public License as
9# published by the Free Software Foundation; either version 2 of the License,
10# or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful, but WITHOUT
13# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15# more details.
16#
17# You should have received a copy of the GNU General Public License along
18# with this program; if not, write to the Free Software Foundation, Inc.,
19# 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  or visit
20# http://www.gnu.org/licenses/gpl.html
21#
22###############################################################################
23# E-mail:      mbonetti at gmail dot com
24# Web page:    http://gregarius.net/
25#
26###############################################################################
27
28
29function getThemeInfo($theme) {
30
31    $path = "../".RSS_THEME_DIR."/$theme/.themeinfo";
32    $ret = array(
33               'name' => '',
34               'url' => '',
35               'official' => false,
36               'fsname' => $theme,
37               'description' => '',
38               'htmltheme' => true,
39               'version' => "1.0",
40               'author' => '',
41               'screenshot' => ''
42           );
43    if (file_exists($path)) {
44        $f = @fopen($path,'r');
45        $contents = "";
46        if ($f) {
47            $contents .= fread($f, filesize($path));
48            @fclose($f);
49        } else {
50            $contents = "";
51        }
52
53        if ($contents && preg_match_all("/^\s?([^:]+):(.*)$/m",$contents,$matches,PREG_SET_ORDER)) {
54            foreach($matches as $match) {
55                $key = trim(strtolower($match[1]));
56                $val = trim($match[2]);
57                if (array_key_exists($key,$ret)) {
58                    if ($val == 'true') {
59                        $ret[$key] = true;
60                    }
61                    elseif ($val == 'false') {
62                        $ret[$key] = false;
63                    }
64                    else {
65                        $ret[$key] = $val;
66                    }
67                }
68            }
69        }
70    }
71    return $ret;
72}
73
74function getThemePath($path=null) {
75    list($theme,$media) = getActualTheme();
76    if (null === $path)
77        $path = getPath();
78    return $path.RSS_THEME_DIR."/$theme/$media/";
79}
80
81/**
82 * Returns an array holding the "main" theme to use,
83 * as well as the detected "media" (@see getThemeMedia)
84 */
85function getActualTheme() {
86    static $ret;
87
88    if ($ret) {
89        return $ret;
90    }
91
92
93    // Theme
94    $theme = getConfig('rss.output.theme');
95    if (null === $theme)
96        $theme = 'default';
97    if (defined('THEME_OVERRIDE')) {
98        $theme = THEME_OVERRIDE;
99    }
100    elseif (isset($_GET['theme'])) {
101        $theme = sanitize($_GET['theme'],RSS_SANITIZER_WORDS);
102    }
103
104
105
106    // Media
107    $media = getThemeMedia();
108
109    if( !file_exists(GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/") )
110        $theme = 'default';
111
112    $ret = array($theme,$media);
113    return $ret;
114}
115
116
117/**
118 * Returns the theme's "media" component, e.g. 'web',
119 * 'rss' or 'mobile'.
120 */
121function getThemeMedia() {
122    static $media;
123
124    if ($media) {
125        return $media;
126    }
127
128    // Default to "web".
129    $media = 'web';
130
131    // Has the user specified anything?
132    if (isset($_GET['rss'])) {
133        $media = 'rss';
134    }
135    elseif (isset($_SESSION['mobile']) || isset($_REQUEST['mobile']) || isMobileDevice()) {
136        $media = 'mobile';
137    }
138
139    // This is here so that auto-detected (e.g. mobile) medias
140    // can be overridden.
141    if (isset($_REQUEST['media'])) {
142        $media = sanitize($_REQUEST['media'], RSS_SANITIZER_WORDS);
143    }
144
145    // Finally: let plugins voice their opinion
146    $media = rss_plugin_hook('rss.plugins.thememedia',$media);
147
148    return $media;
149}
150
151/**
152 * Dumb dunciton to detect mobile devices based on the passed user-agent.
153 * This definitely needs some heavy tweaking.
154 */
155function isMobileDevice() {
156    static $ret;
157    if ($ret !== NULL) {
158        return $ret;
159    } else {
160        $ret = false;
161        if (isset($_SERVER['HTTP_USER_AGENT'])) {
162            $ua = $_SERVER['HTTP_USER_AGENT'];
163            $ua_lwr = strtolower( $ua );
164
165            $ret  =
166                	(strpos($ua,	'SonyEricsson') !== FALSE)
167                ||	(strpos($ua, 	'Nokia') !== FALSE)
168                ||	(strpos($ua,  'Tablet') !== FALSE)
169                ||	(strpos($ua, 	'MIDP') !== FALSE)
170                ||	(strpos($ua_lwr,'mobile') !== FALSE)
171                ||	(strpos($ua, 	'Windows CE') !== FALSE)
172                ||	(strpos($ua, 	'EPOC') !== FALSE)
173                ||	(strpos($ua, 	'Opera Mini') !== FALSE)
174                ||	(strpos($ua, 	'UP.Browser') !== FALSE)
175                ||	(strpos($ua_lwr,'j2me') !== FALSE)
176                ||	(strpos($ua,	'SGH-') !== FALSE) // Samsung
177                ||	(strpos($ua_lwr,'samsung') !== FALSE)
178                ||	(strpos($ua_lwr,'netfront') !== FALSE);
179
180
181            // if none of those matched, let's have a gander at grabbing the resolution...
182            if (!$ret && eregi( "([0-9]{3})x([0-9]{3})", $ua, $matches ) ) {
183                if ($matches[1]<600 || $matches[2]<600) {
184                    $ret = true; //one of the screen dimensions is less than 600 - we'll call it a mobile device
185                }
186            }
187        }
188
189        return $ret;
190    }
191}
192
193function rss_theme_option_ref_obj_from_theme($theme=null, $media=null) {
194    if ($theme===null) {
195        list($theme,$media) = getActualTheme();
196    }
197
198    $ref_obj = "theme.$theme";
199    if( $media !== null )
200        $ref_obj .= ".$media";
201
202    return $ref_obj;
203}
204
205function rss_theme_get_option($option, $theme=null, $media=null) {
206    return getProperty(rss_theme_option_ref_obj_from_theme($theme,$media), $option);
207}
208
209function rss_theme_set_option($option, $value, $theme, $media) {
210    setProperty(rss_theme_option_ref_obj_from_theme($theme,$media), $option, 'theme', $value);
211}
212
213function rss_theme_delete_option($option, $theme=null, $media=null) {
214    return deleteProperty(rss_theme_option_ref_obj_from_theme($theme,$media), $option);
215}
216
217function rss_theme_config_override_option_name_mangle($config_key) {
218    return preg_replace( '/^rss\./', 'rss.prop.theme.', $config_key ) . '.override';
219}
220
221function rss_theme_config_override_option($config_key, $default, $theme=null, $media=null) {
222    $ret = getProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle($config_key));
223    if( $ret === null )
224        $ret = $default;
225    rss_config_override($config_key,$ret);
226    return $ret;
227}
228
229function rss_theme_set_config_override_option($config_key, $value, $theme=null, $media=null) {
230    setProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle($config_key), 'theme', $value);
231}
232
233function rss_theme_delete_config_override_option($config_key, $theme=null, $media=null) {
234    deleteProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle($config_key));
235}
236
237function loadSchemeList($pretty, $theme=null, $media=null) {
238    if ($theme===null) {
239        list($theme,$media) = getActualTheme();
240    }
241
242    $ret = array( '(use default scheme)' );
243
244    if( file_exists( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes" ) ) {
245        if( $checkDir = opendir( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes" ) ) {
246            while($file = readdir($checkDir)) {
247                if($file != "." && $file != ".." && $file != ".svn") {
248                    if(file_exists(GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/" . $file) && is_dir(GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/" . $file)) {
249                        if( $pretty )
250                            $theme_info = getThemeInfo( "$theme/$media/schemes/$file" );
251                        if( $pretty && isset( $theme_info['name'] ) && $theme_info['name'] !== '' )
252                            $ret[] = str_replace( ",", "_", $theme_info['name'] );
253                        else
254                            $ret[] = str_replace( ",", "_", $file );
255                    }
256                }
257            }
258        }
259    }
260
261    return $ret;
262}
263
264
265function rss_scheme_stylesheets($theme=null, $media=null) {
266    if ($theme===null) {
267        list($theme,$media) = getActualTheme();
268    }
269
270    $ret = getProperty(rss_theme_option_ref_obj_from_theme($theme,$media), rss_theme_config_override_option_name_mangle('rss.output.theme.scheme'));
271    if( $ret === null )
272        return "";
273
274    $arr = explode(',',$ret);
275    $ret = "";
276    $idx = array_pop($arr);
277    foreach (loadSchemeList( false, $theme, $media) as $i => $val) {
278        if ($i == $idx) {
279            if( $i > 0 ) {
280                if( file_exists( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val" ) && is_dir( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val" ) ) {
281                    foreach( glob( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val/*.css" ) as $file ) {
282                        $file = substr( $file, strlen( GREGARIUS_HOME.RSS_THEME_DIR."/$theme/$media/schemes/$val/" ) );
283                        $file = getPath().RSS_THEME_DIR."/$theme/$media/schemes/$val/$file";
284                        $ret .= "	<link rel=\"stylesheet\" type=\"text/css\" href=\"$file\" />\n";
285                    }
286                }
287            }
288            break;
289        }
290    }
291
292    return $ret;
293}
294
295?>
296