]> git.mxchange.org Git - friendica.git/blob - view/theme/frio/style.php
18211f4702d5f56e631af2764995dccee98d6bdc
[friendica.git] / view / theme / frio / style.php
1 <?php
2 /**
3  * @file view/theme/frio/style.php
4  */
5
6 use Friendica\Core\Config;
7 use Friendica\Core\PConfig;
8 use Friendica\Util\Strings;
9
10 require_once 'view/theme/frio/php/PHPColors/Color.php';
11
12 $scheme = '';
13 $schemecss = '';
14 $schemecssfile = false;
15 $scheme_modified = 0;
16
17 if ($a->module !== 'install') {
18
19         // Get the UID of the profile owner.
20         $uid = defaults($_REQUEST, 'puid', 0);
21         if ($uid) {
22                 PConfig::load($uid, 'frio');
23
24                 // Load the profile owners pconfig.
25                 $scheme           = PConfig::get($uid, 'frio', 'scheme', PConfig::get($uid, 'frio', 'schema'));
26                 $nav_bg           = PConfig::get($uid, 'frio', 'nav_bg');
27                 $nav_icon_color   = PConfig::get($uid, 'frio', 'nav_icon_color');
28                 $link_color       = PConfig::get($uid, 'frio', 'link_color');
29                 $background_color = PConfig::get($uid, 'frio', 'background_color');
30                 $contentbg_transp = PConfig::get($uid, 'frio', 'contentbg_transp');
31                 $background_image = PConfig::get($uid, 'frio', 'background_image');
32                 $bg_image_option  = PConfig::get($uid, 'frio', 'bg_image_option');
33                 $modified         = PConfig::get($uid, 'frio', 'css_modified');
34
35                 // There is maybe the case that the user did never modify the theme settings.
36                 // In this case we store the present time.
37                 if (empty($modified)) {
38                         PConfig::set($uid, 'frio', 'css_modified', time());
39                 }
40         }
41
42         Config::load('frio');
43
44         // Load frios system config.
45         $scheme           = (empty($scheme)           ? Config::get('frio', 'scheme', Config::get('frio', 'schema')) : $scheme);
46         $nav_bg           = (empty($nav_bg)           ? Config::get('frio', 'nav_bg', '#708fa0')                     : $nav_bg);
47         $nav_icon_color   = (empty($nav_icon_color)   ? Config::get('frio', 'nav_icon_color', '#fff')                : $nav_icon_color);
48         $link_color       = (empty($link_color)       ? Config::get('frio', 'link_color', '#6fdbe8')                 : $link_color);
49         $background_color = (empty($background_color) ? Config::get('frio', 'background_color', '#ededed')           : $background_color);
50         $contentbg_transp = (empty($contentbg_transp) ? Config::get('frio', 'contentbg_transp')                      : $contentbg_transp);
51         $background_image = (empty($background_image) ? Config::get('frio', 'background_image', 'img/none.png')      : $background_image);
52         $bg_image_option  = (empty($bg_image_option)  ? Config::get('frio', 'bg_image_option')                       : $bg_image_option);
53         $login_bg_image   = (empty($login_bg_image)   ? Config::get('frio', 'login_bg_image')                        : $login_bg_image);
54         $login_bg_color   = (empty($login_bg_color)   ? Config::get('frio', 'login_bg_color')                        : $login_bg_color;
55         $modified         = (empty($modified)         ? Config::get('frio', 'css_modified')                          : $modified);
56
57         // There is maybe the case that the user did never modify the theme settings.
58         // In this case we store the present time.
59         if (empty($modified)) {
60                 Config::set('frio', 'css_modified', time());
61         }
62 }
63
64 // Now load the scheme.  If a value is changed above, we'll keep the settings
65 // If not, we'll keep those defined by the scheme
66 // Setting $scheme to '' wasn't working for some reason, so we'll check it's
67 // not --- like the mobile theme does instead.
68 // Allow layouts to over-ride the scheme.
69 if (!empty($_REQUEST['scheme'])) {
70         $scheme = $_REQUEST['scheme'];
71 }
72
73 $scheme = Strings::sanitizeFilePathItem($scheme);
74
75 if (($scheme) && ($scheme != '---')) {
76         if (file_exists('view/theme/frio/scheme/' . $scheme . '.php')) {
77                 $schemefile = 'view/theme/frio/scheme/' . $scheme . '.php';
78                 require_once $schemefile;
79         }
80         if (file_exists('view/theme/frio/scheme/' . $scheme . '.css')) {
81                 $schemecssfile = 'view/theme/frio/scheme/' . $scheme . '.css';
82         }
83 }
84
85 // If we haven't got a scheme, load the default.  We shouldn't touch this - we
86 // should leave it for admins to define for themselves.
87 // default.php and default.css MUST be symlinks to existing scheme files.
88 if (!$scheme) {
89         if (file_exists('view/theme/frio/scheme/default.php')) {
90                 $schemefile = 'view/theme/frio/scheme/default.php';
91                 require_once $schemefile;
92         }
93         if (file_exists('view/theme/frio/scheme/default.css')) {
94                 $schemecssfile = 'view/theme/frio/scheme/default.css';
95         }
96 }
97
98 // set a default login bg image if no custom image and no custom bg color are set.
99 if (empty($login_bg_image) && empty($login_bg_color)) {
100         $login_bg_image = 'img/login_bg.jpg';
101 }
102 $login_bg_color   = (empty($login_bg_color)   ? '#ededed'      : $login_bg_color);
103 $login_bg_image   = (empty($login_bg_image)   ? ''             : $login_bg_image);
104
105 $contentbg_transp = ((isset($contentbg_transp) && $contentbg_transp != '') ? $contentbg_transp : 100);
106
107 // Calculate some colors in dependance of existing colors.
108 // Some colors are calculated to don't have too many selection
109 // fields in the theme settings.
110 if (!isset($menu_background_hover_color)) {
111         $mbhc = new Color($nav_bg);
112         $mcolor = $mbhc->getHex();
113
114         if ($mbhc->isLight($mcolor, 75)) {
115                 $menu_is = 'light';
116                 $menu_background_hover_color = '#' . $mbhc->darken(5);
117         } else {
118                 $menu_is = 'dark';
119                 $menu_background_hover_color = '#' . $mbhc->lighten(5);
120         }
121 }
122 if (!isset($nav_icon_hover_color)) {
123         $nihc = new Color($nav_bg);
124
125         if ($nihc->isLight()) {
126                 $nav_icon_hover_color = '#' . $nihc->darken(10);
127         } else {
128                 $nav_icon_hover_color = '#' . $nihc->lighten(10);
129         }
130 }
131 if (!isset($link_hover_color)) {
132         $lhc = new Color($link_color);
133         $lcolor = $lhc->getHex();
134
135         if ($lhc->isLight($lcolor, 75)) {
136                 $link_hover_color = '#' . $lhc->darken(5);
137         } else {
138                 $link_hover_color = '#' . $lhc->lighten(5);
139         }
140 }
141
142 // Convert $bg_image_options into css.
143 if (!isset($bg_image_option)) {
144         $bg_image_option = null;
145 }
146
147 switch ($bg_image_option) {
148         case 'stretch':
149                 $background_size_img = '100%';
150                 $background_repeat = 'no-repeat';
151                 break;
152         case 'cover':
153                 $background_size_img = 'cover';
154                 $background_repeat = 'no-repeat';
155                 break;
156         case 'repeat':
157                 $background_size_img = 'auto';
158                 $background_repeat = 'repeat';
159                 break;
160         case 'contain':
161                 $background_size_img = 'contain';
162                 $background_repeat = 'repeat';
163                 break;
164
165         default:
166                 $background_size_img = 'auto';
167                 $background_repeat = 'no-repeat';
168                 break;
169 }
170
171 // Convert transparency level from percentage to opacity value.
172 $contentbg_transp = $contentbg_transp / 100;
173
174 $options = [
175         '$nav_bg'                      => $nav_bg,
176         '$nav_icon_color'              => $nav_icon_color,
177         '$nav_icon_hover_color'        => $nav_icon_hover_color,
178         '$link_color'                  => $link_color,
179         '$link_hover_color'            => $link_hover_color,
180         '$menu_background_hover_color' => $menu_background_hover_color,
181         '$btn_primary_color'           => $nav_icon_color,
182         '$btn_primary_hover_color'     => $menu_background_hover_color,
183         '$background_color'            => $background_color,
184         '$contentbg_transp'            => $contentbg_transp,
185         '$background_image'            => $background_image,
186         '$background_size_img'         => $background_size_img,
187         '$background_repeat'           => $background_repeat,
188         '$login_bg_image'              => $login_bg_image,
189         '$login_bg_color'              => $login_bg_color
190 ];
191
192 $css_tpl = file_get_contents('view/theme/frio/css/style.css');
193
194 // Get the content of the scheme css file and the time of the last file change.
195 if ($schemecssfile) {
196         $css_tpl .= file_get_contents($schemecssfile);
197         $scheme_modified = filemtime($schemecssfile);
198 }
199
200 // We need to check which is the most recent css data.
201 // We will use this time later to decide if we load the cached or fresh css data.
202 if ($scheme_modified > $modified) {
203         $modified = $scheme_modified;
204 }
205 // Apply the settings to the css template.
206 $css = str_replace(array_keys($options), array_values($options), $css_tpl);
207
208 $modified = gmdate('r', $modified);
209
210 $etag = md5($css);
211
212 // Set a header for caching.
213 header('Cache-Control: public');
214 header('ETag: "' . $etag . '"');
215 header('Last-Modified: ' . $modified);
216
217 // Only send the CSS file if it was changed.
218 /// @todo Check if this works at all (possibly clients are sending only the one or the other header) - compare with mod/photo.php
219 if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) && isset($_SERVER['HTTP_IF_NONE_MATCH'])) {
220         $cached_modified = gmdate('r', strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']));
221         $cached_etag = str_replace(['"', '-gzip'], ['', ''],
222                                 stripslashes($_SERVER['HTTP_IF_NONE_MATCH']));
223
224         if (($cached_modified == $modified) && ($cached_etag == $etag)) {
225                 header('HTTP/1.1 304 Not Modified');
226                 exit();
227         }
228 }
229
230 echo $css;