function csp_po_get_theme_capabilities($theme, $values, $active) { $data = array(); $data['locale'] = get_locale(); $data['type'] = 'themes'; $data['img_type'] = 'themes'; $data['type-desc'] = __('Theme',CSP_PO_TEXTDOMAIN); $data['name'] = $values['Name']; $data['author'] = $values['Author']; $data['version'] = $values['Version']; $data['description'] = $values['Description']; $data['status'] = $theme == $active->name ? __("activated",CSP_PO_TEXTDOMAIN) : __("deactivated",CSP_PO_TEXTDOMAIN); $data['base_path'] = str_replace("\\","/", WP_CONTENT_DIR.str_replace('wp-content', '', dirname($values['Template Files'][0])).'/'); if (file_exists($values['Template Files'][0])){ $data['base_path'] = dirname(str_replace("\\","/",$values['Template Files'][0])).'/'; } $data['special-path'] = ''; foreach($values['Template Files'] as $themefile) { $main = ''; if (!file_exists($themefile)) { $main = file_get_contents(WP_CONTENT_DIR.str_replace('wp-content', '', $themefile)); }else { $main = file_get_contents($themefile); } if (preg_match("/load_theme_textdomain\s*\(\s*(\'|\"|)([\w\-_]+|[A-Z\-_]+)(\'|\"|)\s*(,|\))/", $main, $hits)) break; } $data['is-path-unclear'] = false; $data['gettext_ready'] = empty($hits) === false; if ($data['gettext_ready']) { $data['textdomain'] = array('identifier' => $hits[2], 'is_const' => empty($hits[1]) ); $data['languages'] = array(); $const_list = array(); if (!($data['gettext_ready'] && !$data['textdomain']['is_const'])) { if (preg_match_all("/define\s*\(([^\)]+)\)/" , $main, $hits)) { $const_list = array_merge($const_list, $hits[1]); } } if ($data['gettext_ready']) { if ($data['textdomain']['is_const']) { foreach($const_list as $e) { $a = split(',', $e); $c = trim($a[0], "\"' \t"); if ($c == $data['textdomain']['identifier']) { $data['textdomain']['is_const'] = $data['textdomain']['identifier']; $data['textdomain']['identifier'] = trim($a[1], "\"' \t"); } } } } $tmp = array(); $dn = dirname(str_replace("\\","/",WP_CONTENT_DIR).str_replace('wp-content', '', $values['Template Files'][0])); if (file_exists($values['Template Files'][0])){ $dn = dirname(str_replace("\\","/",$values['Template Files'][0])); } $files = rscandir($dn.'/', "/(.\mo|\.po|\.pot)$/", $tmp); $sub_dirs = array(); foreach($files as $filename) { preg_match("/\/([a-z][a-z]_[A-Z][A-Z]).(mo|po)$/", $filename, $hits); if (empty($hits[1]) === false) { $data['languages'][$hits[1]][$hits[2]] = array( 'class' => "-".(is_readable($filename) ? 'r' : '').(is_writable($filename) ? 'w' : ''), 'stamp' => date(__('m/d/Y H:i:s',CSP_PO_TEXTDOMAIN), filemtime($filename))." ".file_permissions($filename) ); $data['filename'] = ''; $sd = dirname(str_replace($dn.'/', '', $filename)); if ($sd == '.') $sd = ''; if (!in_array($sd, $sub_dirs)) $sub_dirs[] = $sd; } } //completely other directories can be defined WP if >= 2.7.0 global $wp_version; if (version_compare($wp_version, '2.7', '>=')) { if (count($data['languages']) == 0) { $data['is-path-unclear'] = has_subdirs($dn.'/'); if ($data['is-path-unclear'] && (count($files) > 0)) { foreach($files as $file) { $f = str_replace($dn.'/', '', $file); if (preg_match("/^([a-z][a-z]_[A-Z][A-Z]).(mo|po|pot)$/", basename($f))) { $data['special_path'] = (dirname($f) == '.' ? '' : dirname($f)); $data['is-path-unclear'] = false; break; } } } } else{ if ($sub_dirs[0] != '') { $data['special_path'] = ltrim($sub_dirs[0], "/"); } } } } $data['base_file'] = (empty($data['special_path']) ? '' : $data['special_path']."/"); return $data; }
function index_array($directory = "../../../data/pages/", $pattern = 'index.txt', $recursive = true) { $array_items = array(); if ($handle = opendir($directory)) { while (false !== ($file = readdir($handle))) { if ($file != "." && $file != "..") { if (is_dir($directory . "/" . $file)) { if ($recursive) { if (substr($file, 0, 4) != ".tmp" and substr($file, 0, 2) != "z_") { $array_items = array_merge($array_items, index_array($directory . "/" . $file, $pattern, $recursive)); } } // No és un directori } else { // mirar si s'inclou a la llista $newdir = str_replace("//", "/", $directory) . '/'; $subdirs = has_subdirs($newdir); $ext = substr(strtolower($file), -strlen($pattern)); if (!is_dir($file) && $ext == $pattern && $subdirs) { $file = $directory . "/" . $file; $array_items[] = preg_replace("/\\/\\//si", "/", $file); } } } } closedir($handle); } foreach ($array_items as &$item) { $item = str_replace("../../../data/pages/", "", $item); } deleteFromArray($array_items, $pattern, $useOldKeys = FALSE); $result = natsort($array_items); return $array_items; }
function csp_po_get_theme_capabilities($theme, $values, $active) { $data = array(); $data['dev-hints'] = null; $data['deny_scanning'] = false; //let's first check the whether we have a child or base theme if (is_object($values) && get_class($values) == 'WP_Theme') { //WORDPRESS Version 3.4 changes theme handling! $theme_root = trailingslashit(str_replace("\\", "/", get_theme_root())); $firstfile = array_values($values['Template Files']); $firstfile = array_shift($firstfile); $firstfile = str_replace("\\", "/", $firstfile); $firstfile = str_replace($theme_root, '', $firstfile); $firstfile = explode('/', $firstfile); $firstfile = reset($firstfile); $data['base_path'] = $theme_root . $firstfile . '/'; } else { $data['base_path'] = str_replace("\\", "/", WP_CONTENT_DIR . str_replace('wp-content', '', dirname($values['Template Files'][0])) . '/'); if (file_exists($values['Template Files'][0])) { $data['base_path'] = dirname(str_replace("\\", "/", $values['Template Files'][0])) . '/'; } } $fc = explode('/', untrailingslashit($data['base_path'])); $folder_filesys = end($fc); $folder_data = $values['Template']; $is_child_theme = $folder_filesys != $folder_data; $data['theme-self'] = $folder_filesys; $data['theme-template'] = $folder_data; $data['locale'] = get_locale(); $data['type'] = 'themes'; $data['img_type'] = $is_child_theme ? 'childthemes' : 'themes'; $data['type-desc'] = $is_child_theme ? __('Childtheme', CSP_PO_TEXTDOMAIN) : __('Theme', CSP_PO_TEXTDOMAIN); $data['name'] = $values['Name']; $data['author'] = $values['Author']; $data['version'] = $values['Version']; $data['description'] = $values['Description']; $data['status'] = $values['Name'] == $active->name ? __("activated", CSP_PO_TEXTDOMAIN) : __("deactivated", CSP_PO_TEXTDOMAIN); // $data['status'] = $theme == $active->name ? __("activated",CSP_PO_TEXTDOMAIN) : __("deactivated",CSP_PO_TEXTDOMAIN); if ($is_child_theme) { $data['status'] .= ' / <b></i>' . __('child theme of', CSP_PO_TEXTDOMAIN) . ' ' . $values['Parent Theme'] . '</i></b>'; } $data['special-path'] = ''; $data['is-path-unclear'] = false; $data['gettext_ready'] = false; $data['translation_template'] = null; $data['is-simple'] = false; $data['simple-filename'] = ''; //now scanning the child's own files $parent_files = array(); $files = array(); $const_list = array(); $tmp = array(); $files = rscandir($data["base_path"], "/\\.(php|phtml)\$/", $tmp); foreach ($files as $themefile) { $main = file_get_contents($themefile); if (preg_match("/[^_^!]load_(child_theme_|theme_|)textdomain\\s*\\(\\s*(\\'|\"|)([\\w\\d\\-_]+|[A-Z\\d\\-_]+)(\\'|\"|)\\s*(,|\\))/", $main, $hits) || preg_match("/[^_^!]load_(child_theme_|theme_|)textdomain\\s*\\(\\s*/", $main, $hits)) { if (isset($hits[1]) && $hits[1] != 'child_theme_' && $hits[1] != 'theme_') { $data['dev-hints'] = __("<strong>Loading Issue: </strong>Author is using <em>load_textdomain</em> instead of <em>load_theme_textdomain</em> or <em>load_child_theme_textdomain</em> function. This may break behavior of WordPress, because some filters and actions won't be executed anymore. Please contact the Author about that.", CSP_PO_TEXTDOMAIN); } //fallback for variable names used to load textdomain, assumes theme name if (isset($hits[3]) && strpos($hits[3], '$') !== false) { unset($hits[3]); if (isset($data['dev-hints'])) { $data['dev-hints'] .= "<br/><br/>"; } $data['dev-hints'] = __("<strong>Textdomain Naming Issue: </strong>Author uses a variable to load the textdomain. It will be assumed to be equal to theme name now.", CSP_PO_TEXTDOMAIN); } //make it short $data['gettext_ready'] = true; if ($data['gettext_ready']) { if (!isset($hits[3])) { $data['textdomain'] = array('identifier' => $values['Template'], 'is_const' => false); } else { $data['textdomain'] = array('identifier' => $hits[3], 'is_const' => empty($hits[2])); } $data['languages'] = array(); } $dn = $data["base_path"]; $tmp = array(); $lng_files = rscandir($dn, "/(\\.mo|\\.po|\\.pot)\$/", $tmp); $data['translation_template'] = csp_find_translation_template($lng_files); $sub_dirs = array(); $naming_convention_error = false; foreach ($lng_files as $filename) { //somebody did place buddypress themes at sub folder hierarchy like: themes/buddypress/bp-default //results at $values['Template'] to 'buddypress/bp-default' which damages the preg_match $v = explode('/', $values['Template']); $theme_langfile_check = end($v); preg_match("/\\/(|" . preg_quote($theme_langfile_check) . "\\-)([a-z][a-z]_[A-Z][A-Z])\\.(mo|po)\$/", $filename, $hits); if (empty($hits[1]) === false) { $naming_convention_error = true; $data['filename'] = ''; $sd = dirname(str_replace($dn, '', $filename)); if ($sd == '.') { $sd = ''; } if (!in_array($sd, $sub_dirs)) { $sub_dirs[] = $sd; } } elseif (empty($hits[2]) === false) { $data['languages'][$hits[2]][$hits[3]] = array('class' => "-" . (is_readable($filename) ? 'r' : '') . (is_writable($filename) ? 'w' : ''), 'stamp' => date(__('m/d/Y H:i:s', CSP_PO_TEXTDOMAIN), filemtime($filename)) . " " . file_permissions($filename)); $data['filename'] = ''; $sd = dirname(str_replace($dn, '', $filename)); if ($sd == '.') { $sd = ''; } if (!in_array($sd, $sub_dirs)) { $sub_dirs[] = $sd; } } } if ($naming_convention_error && count($data['languages']) == 0) { if (isset($data['dev-hints'])) { $data['dev-hints'] .= "<br/><br/>"; } $data['dev-hints'] .= sprintf(__("<strong>Naming Issue: </strong>Author uses unsupported language file naming convention! Instead of example <em>de_DE.po</em> the non theme standard version <em>%s</em> has been used. If you translate this Theme, only renamed language files will be working!", CSP_PO_TEXTDOMAIN), $values['Template'] . '-de_DE.po'); } //completely other directories can be defined WP if >= 2.7.0 global $wp_version; if (version_compare($wp_version, '2.7', '>=')) { if (count($data['languages']) == 0) { $data['is-path-unclear'] = has_subdirs($dn); if ($data['is-path-unclear'] && count($lng_files) > 0) { foreach ($lng_files as $file) { $f = str_replace($dn, '', $file); if (preg_match("/^([a-z][a-z]_[A-Z][A-Z])\\.(mo|po|pot)\$/", basename($f)) || preg_match("/\\.po(t|)\$/", basename($f))) { $data['special_path'] = dirname($f) == '.' ? '' : dirname($f); $data['is-path-unclear'] = false; break; } } } } else { if ($sub_dirs[0] != '') { $data['special_path'] = ltrim($sub_dirs[0], "/"); } } } } if ($data['gettext_ready'] && !$data['textdomain']['is_const']) { break; } //make it short :-) if (preg_match_all("/define\\s*\\(([^\\)]+)\\)/", $main, $hits)) { $const_list = array_merge($const_list, $hits[1]); } } $data['base_file'] = empty($data['special_path']) ? '' : $data['special_path'] . "/"; $constant_failed = false; if ($data['gettext_ready']) { if ($data['textdomain']['is_const']) { foreach ($const_list as $e) { $a = explode(',', $e); $c = trim($a[0], "\"' \t"); if ($c == $data['textdomain']['identifier']) { $data['textdomain']['is_const'] = $data['textdomain']['identifier']; $data['textdomain']['identifier'] = trim($a[1], "\"' \t"); } } } //fallback for constants defined by variables! assume the theme name instead if (strpos($data['textdomain']['identifier'], '$') !== false || strpos($data['textdomain']['identifier'], '"') !== false || strpos($data['textdomain']['identifier'], '\'') !== false) { $constant_failed = true; $data['textdomain']['identifier'] = $values['Template']; if (isset($data['dev-hints'])) { $data['dev-hints'] .= "<br/><br/>"; } $data['dev-hints'] = __("<strong>Textdomain Naming Issue: </strong>Author uses a variable to define the textdomain constant. It will be assumed to be equal to theme name now.", CSP_PO_TEXTDOMAIN); } } //check now known issues for themes if (isset($data['textdomain']['identifier']) && $data['textdomain']['identifier'] == 'woothemes') { if (isset($data['dev-hints'])) { $data['dev-hints'] .= "<br/><br/>"; } $data['dev-hints'] .= __("<strong>WooThemes Issue: </strong>The Author is known for not supporting a translatable backend. Please expect only translations for frontend or contact the Author for support!", CSP_PO_TEXTDOMAIN); } if (isset($data['textdomain']['identifier']) && $data['textdomain']['identifier'] == 'ares' && $constant_failed) { if (isset($data['dev-hints'])) { $data['dev-hints'] .= "<br/><br/>"; } $data['dev-hints'] .= __("<strong>Ares Theme Issue: </strong>This theme uses a textdomain defined by string concatination code. The textdomain will be patched to 'AresLanguage', please contact the theme author to change this into a fix constant value! ", CSP_PO_TEXTDOMAIN); $data['textdomain']['identifier'] = 'AresLanguage'; } return $data; }