get_theme_path($theme, '', '', 'templates'); // path to the main site theme if (file_exists(TIKI_PATH . "/" . $main_theme_path . '/layouts/')) { foreach (scandir(TIKI_PATH . "/" . $main_theme_path . '/layouts/') as $layoutName) { if ($layoutName[0] != '.' && $layoutName != 'index.php') { $available_layouts[$layoutName] = ucfirst($layoutName); } } } if ($theme_option) { $theme_path = $themelib->get_theme_path($theme, $theme_option, '', 'templates'); // path to the site theme options if (file_exists(TIKI_PATH . "/" . $theme_path . '/layouts/')) { foreach (scandir(TIKI_PATH . "/" . $theme_path . '/layouts/') as $layoutName) { if ($layoutName[0] != '.' && $layoutName != 'index.php') { $available_layouts[$layoutName] = ucfirst($layoutName); } } } } return $available_layouts; } public function list_user_selectable_layouts($theme = null, $theme_option = null) { global $prefs; if (empty($theme) && empty($theme_option)) { // if you submit no parameters, return the current theme/theme option if (isset($prefs['site_theme'])) { $theme = $prefs['site_theme']; } if (isset($prefs['theme_option'])) { $theme_option = $prefs['theme_option']; } } $selectable_layouts = []; $available_layouts = $this->list_layouts($theme, $theme_option); foreach ($available_layouts as $layoutName => $layoutLabel) { if ( $layoutName == 'mobile' || $layoutName == 'layout_plain.tpl' || $layoutName == 'internal' ) { // hide layouts that are for internal use only continue; } elseif ($layoutName == 'basic') { $selectable_layouts[$layoutName] = tra('Single Container'); } elseif ($layoutName == 'classic') { $selectable_layouts[$layoutName] = tra('Classic Tiki (3 containers - header, middle, footer)'); } elseif ($layoutName == 'social') { $selectable_layouts[$layoutName] = tra('Classic Bootstrap (fixed top navbar)'); } else { $selectable_layouts[$layoutName] = $layoutLabel; } } return $selectable_layouts; } public function list_css($path, $recursive = false) { $files = $this->list_files($path, '.css', $recursive); foreach ($files as $i => $file) { $files[$i] = preg_replace("|^$path/(.*)\.css$|", '$1', $file); } return $files; } public function list_files($path, $extension, $recursive) { $back = []; $handle = opendir($path); while ($file = readdir($handle)) { if ((substr($file, -4, 4) == $extension) and (preg_match('/^[-_a-zA-Z0-9\.]*$/', $file))) { $back[] = "$path/$file"; } elseif ( $recursive && $file != '.svn' && $file != '.' && $file != '..' && is_dir("$path/$file") && ! file_exists("db/$file/local.php") ) { $back = array_merge($back, $this->list_files("$path/$file", $extension, $recursive)); } } closedir($handle); sort($back); return $back; } public function browse_css($path) { if (! is_file($path)) { return ['error' => "No such file : $path"]; } $meat = implode('', file($path)); $find[0] = '/\}/'; $repl[0] = "\n}\n"; $find[1] = '/\{/'; $repl[1] = "\n{\n"; $find[2] = '/\/\*/'; $repl[2] = "\n/*\n"; $find[3] = '/\*\//'; $repl[3] = "\n*/\n"; $find[4] = '/;/'; $repl[4] = ";\n"; $find[5] = '/(W|w)hite/'; $repl[5] = '#FFFFFF'; $find[6] = '/(B|b)lack/'; $repl[6] = '#000000'; $res = preg_replace($find, $repl, $meat); return [ 'error' => '', 'content' => explode("\n", $res) ]; } public function parse_css($data) { $back = []; $index = 0; $type = ''; foreach ($data as $line) { $line = trim($line); if ($line) { if (($type != 'comment') and ($line == '/*')) { $type = 'comment'; $index++; $back["$index"]['comment'] = ''; $back["$index"]['items'] = []; $back["$index"]['attributes'] = []; } elseif (($type == 'comment') and ($line == '*/')) { $type = ''; } elseif ($type == 'comment') { $back["$index"]['comment'] .= "$line\n"; } elseif (($type == 'items') and ($line == '{')) { $type = 'attributes'; } elseif ($type == 'items') { $li = explode(',', $line); foreach ($li as $l) { $l = trim($l); if ($l) { $back["$index"]['items'][] = $l; } } } elseif (($type == 'attributes') and ($line == '}')) { $type = ''; $index++; $back["$index"]['comment'] = ''; $back["$index"]['items'] = []; $back["$index"]['attributes'] = []; } elseif ($type == 'attributes') { $parts = explode(':', str_replace(';', '', $line)); if (isset($parts[0]) && isset($parts[1])) { $obj = trim($parts[0]); $back["$index"]['attributes']["$obj"] = trim($parts[1]); } } else { $li = explode(',', $line); foreach ($li as $l) { $l = trim($l); if ($l) { $back["$index"]['items'][] = $l; } } $type = 'items'; } $back['content'] = $line; } } return $back; } /** * Find the version of Tiki that a CSS is compatible with * * @TODO: cache the results * @TODO: only read the first 30 lines or so of the file */ public function version_css($path) { if (! file_exists($path)) { return false; } $data = implode('', file($path)); $pos = strpos($data, '@version'); if ($pos === false) { return false; } // get version preg_match("/(@[V|v]ersion):?\s?([\d]+)\.([\d]+)/i", $data, $matches); $version = $matches[2] . '.' . $matches[3]; return $version; } }