Exemplo n.º 1
0
 /**
  * The UI to translate code.
  *
  * @return tempcode		The UI
  */
 function interface_code()
 {
     $lang = filter_naughty_harsh(get_param('lang', ''));
     $lang_new = get_param('lang_new', $lang);
     if ($lang_new != '') {
         require_code('type_validation');
         if (!is_alphanumeric($lang_new, true)) {
             warn_exit(do_lang_tempcode('BAD_CODENAME'));
         }
         if (strlen($lang_new) > 5) {
             warn_exit(do_lang_tempcode('INVALID_LANG_CODE'));
         }
         $lang = $lang_new;
     }
     if ($lang == '') {
         $title = get_page_title('TRANSLATE_CODE');
         $GLOBALS['HELPER_PANEL_TEXT'] = comcode_lang_string('DOC_FIND_LANG_STRING_TIP');
         return $this->choose_lang($title, true, true, do_lang_tempcode('CHOOSE_EDIT_LIST_LANG_FILE'));
     }
     breadcrumb_set_parents(array(array('_SELF:_SELF:misc', do_lang_tempcode('CHOOSE'))));
     breadcrumb_set_self(do_lang_tempcode('TRANSLATE_CODE'));
     $base_lang = fallback_lang();
     $map_a = get_file_base() . '/lang/langs.ini';
     $map_b = get_custom_file_base() . '/lang_custom/langs.ini';
     $search = get_param('search', '', true);
     if ($search != '') {
         $title = get_page_title('TRANSLATE_CODE');
         require_code('form_templates');
         $fields = new ocp_tempcode();
         global $LANGUAGE;
         foreach ($LANGUAGE[user_lang()] as $key => $value) {
             if (strpos(strtolower($value), strtolower($search)) !== false) {
                 $fields->attach(form_input_text($key, '', 'l_' . $key, str_replace('\\n', chr(10), $value), false));
             }
         }
         if ($fields->is_empty()) {
             inform_exit(do_lang_tempcode('NO_ENTRIES'));
         }
         $post_url = build_url(array('page' => '_SELF', 'type' => '_code2'), '_SELF');
         $hidden = new ocp_tempcode();
         $hidden->attach(form_input_hidden('redirect', get_self_url(true)));
         $hidden->attach(form_input_hidden('lang', $lang));
         return do_template('FORM_SCREEN', array('_GUID' => '2d7356fd2c4497ceb19450e65331c9c5', 'TITLE' => $title, 'HIDDEN' => $hidden, 'FIELDS' => $fields, 'URL' => $post_url, 'TEXT' => '', 'SUBMIT_NAME' => do_lang('TRANSLATE_CODE')));
     }
     $lang_file = get_param('lang_file');
     if (!file_exists($map_b)) {
         $map_b = $map_a;
     }
     $map = better_parse_ini_file($map_b);
     $title = get_page_title('_TRANSLATE_CODE', true, array(escape_html($lang_file), escape_html(array_key_exists($lang, $map) ? $map[$lang] : $lang)));
     // Upgrade to custom if not there yet (or maybe we are creating a new lang - same difference)
     $custom_dir = get_custom_file_base() . '/lang_custom/' . $lang;
     if (!file_exists($custom_dir)) {
         require_code('abstract_file_manager');
         force_have_afm_details();
         afm_make_directory('lang_custom/' . $lang, true);
         $cached_dir = get_custom_file_base() . '/lang_cached/' . $lang;
         if (!file_exists($cached_dir)) {
             afm_make_directory('lang_cached/' . $lang, true);
         }
         // Make comcode page dirs
         $zones = find_all_zones();
         foreach ($zones as $zone) {
             $_special_dir = get_custom_file_base() . '/' . $zone . '/pages/comcode_custom/' . $lang;
             if (!file_exists($_special_dir)) {
                 afm_make_directory($zone . ($zone == '' ? '' : '/') . 'pages/comcode_custom/' . $lang, true);
             }
             $_special_dir = get_custom_file_base() . '/' . $zone . '/pages/html_custom/' . $lang;
             if (!file_exists($_special_dir)) {
                 afm_make_directory($zone . ($zone == '' ? '' : '/') . 'pages/html_custom/' . $lang, true);
             }
         }
         // Make templates_cached dirs
         require_code('themes2');
         $themes = find_all_themes();
         foreach (array_keys($themes) as $theme) {
             $_special_dir = get_custom_file_base() . '/themes/' . $theme . '/templates_cached/' . $lang;
             if (!file_exists($_special_dir)) {
                 afm_make_directory('themes/' . $theme . '/templates_cached/' . $lang, true);
             }
         }
     }
     // Get some stuff
     $for_lang = get_lang_file_map($lang, $lang_file);
     $for_base_lang = get_lang_file_map($base_lang, $lang_file, true);
     $descriptions = get_lang_file_descriptions($base_lang, $lang_file);
     // Make our translation page
     $lines = '';
     $intertrans = $this->get_intertran_conv($lang);
     $actions = new ocp_tempcode();
     $next = 0;
     $trans_lot = '';
     $delimit = chr(10) . '=-=-=-=-=-=-=-=-' . chr(10);
     foreach ($for_base_lang as $name => $old) {
         if (array_key_exists($name, $for_lang)) {
             $current = $for_lang[$name];
         } else {
             $current = '';
             //$this->find_lang_matches($old,$lang); Too slow / useless for code translation
         }
         if ($current == '' && strtolower($name) != $name) {
             $trans_lot .= str_replace('\\n', chr(10), str_replace(array('{', '}'), array('(((', ')))'), $old)) . $delimit;
         }
     }
     $translated_stuff = array();
     if ($trans_lot != '' && $intertrans != '') {
         $result = http_download_file('http://translate.google.com/translate_t', NULL, false, false, 'ocPortal', array('text' => $trans_lot, 'langpair' => 'en|' . $intertrans));
         if (!is_null($result)) {
             require_code('character_sets');
             $result = convert_to_internal_encoding($result);
             $matches = array();
             if (preg_match('#<div id=result_box dir="ltr">(.*)</div>#Us', convert_to_internal_encoding($result), $matches) != 0) {
                 $result2 = $matches[1];
                 $result2 = @html_entity_decode($result2, ENT_QUOTES, get_charset());
                 $result2 = preg_replace('#\\s?<br>\\s?#', chr(10), $result2);
                 $result2 = str_replace('> ', '>', str_replace(' <', ' <', str_replace('</ ', '</', str_replace(array('(((', ')))'), array('{', '}'), $result2))));
                 $translated_stuff = explode(trim($delimit), $result2 . chr(10));
             }
         }
     }
     foreach ($for_base_lang + $for_lang as $name => $old) {
         if (array_key_exists($name, $for_lang)) {
             $current = $for_lang[$name];
         } else {
             $current = '';
             //$this->find_lang_matches($old,$lang); Too slow / useless for code translation
         }
         $description = array_key_exists($name, $descriptions) ? $descriptions[$name] : '';
         if ($current == '' && strtolower($name) != $name && array_key_exists($next, $translated_stuff)) {
             $_current = '';
             $translate_auto = trim($translated_stuff[$next]);
             $next++;
         } else {
             $_current = str_replace('\\n', chr(10), $current);
             $translate_auto = NULL;
         }
         if ($_current == '') {
             $_current = str_replace('\\n', chr(10), $old);
         }
         if ($intertrans != '' && get_value('google_translate_api_key') !== NULL) {
             $actions = do_template('TRANSLATE_ACTION', array('_GUID' => '9e9a68cb2c1a1e23a901b84c9af2280b', 'LANG_FROM' => get_site_default_lang(), 'LANG_TO' => $lang, 'NAME' => 'trans_' . $name, 'OLD' => $_current));
         }
         $temp = do_template('TRANSLATE_LINE', array('_GUID' => '9cb331f5852ee043e6ad30b45aedc43b', 'TRANSLATE_AUTO' => $translate_auto, 'DESCRIPTION' => $description, 'NAME' => $name, 'OLD' => str_replace('\\n', chr(10), $old), 'CURRENT' => $_current, 'ACTIONS' => $actions));
         $lines .= $temp->evaluate();
     }
     $url = build_url(array('page' => '_SELF', 'type' => '_code', 'lang_file' => $lang_file, 'lang' => $lang), '_SELF');
     return do_template('TRANSLATE_SCREEN', array('_GUID' => 'b3429f8bd0b4eb79c33709ca43e3207c', 'PAGE' => $lang_file, 'INTERTRANS' => get_value('google_translate_api_key') !== NULL ? $intertrans : '', 'LANG' => $lang, 'LINES' => $lines, 'TITLE' => $title, 'URL' => $url));
 }
            if ($orig_path == '') {
                continue;
            }
            // Theme has specified non-existent image as themewizard-compatible
            if (strpos($orig_path, '/' . fallback_lang() . '/') !== false) {
                $composite = 'themes/' . filter_naughty($theme) . '/images/EN/';
            } else {
                $composite = 'themes/' . filter_naughty($theme) . '/images/';
            }
            afm_make_directory($composite, true);
            $saveat = get_custom_file_base() . '/' . $composite . $image_code . '.png';
            $saveat_url = $composite . $image_code . '.png';
            if (!file_exists($saveat)) {
                $image = calculate_theme($seed, 'default', 'equations', $image_code, $dark, $theme_map, $theme_landscape, 'EN');
                if (!is_null($image)) {
                    $pos = strpos($image_code, '/');
                    if ($pos !== false || strpos($orig_path, '/EN/') !== false) {
                        afm_make_directory($composite . substr($image_code, 0, $pos), true, true);
                    }
                    @imagepng($image, $saveat) or intelligent_write_error($saveat);
                    imagedestroy($image);
                    fix_permissions($saveat);
                    sync_file($saveat);
                    actual_edit_theme_image($image_code, $theme, 'EN', $image_code, $saveat_url, true);
                    echo '<li>' . escape_html($image_code) . '</li>';
                }
            }
        }
    }
}
echo '</ul><p>Finished theme images.</p>';
Exemplo n.º 3
0
/**
 * Add a theme.
 *
 * @param  ID_TEXT		The theme name
 */
function actual_add_theme($name)
{
    $GLOBALS['NO_QUERY_LIMIT'] = true;
    if (file_exists(get_custom_file_base() . '/themes/' . $name) || $name == 'default') {
        warn_exit(do_lang_tempcode('ALREADY_EXISTS', escape_html($name)));
    }
    require_code('abstract_file_manager');
    force_have_afm_details();
    // Create directories
    $dir_list = array('', 'images', 'images/logo', 'images_custom', 'templates', 'templates_custom', 'templates_cached', 'css', 'css_custom');
    $langs = find_all_langs(true);
    foreach (array_keys($langs) as $lang) {
        $dir_list[] = 'templates_cached/' . $lang;
    }
    $dir_list_access = array('', 'images', 'images_custom', 'css');
    foreach ($dir_list as $dir) {
        $path = 'themes/' . $name . '/' . $dir;
        afm_make_directory($path, true);
        if (!in_array($dir, $dir_list_access)) {
            //			$path='themes/'.$name.'/'.$dir.'/.htaccess';
            //			afm_copy('themes/default/templates_cached/.htaccess',$path,false);
        }
        $path = 'themes/' . $name . '/' . ($dir == '' ? '' : $dir . '/') . 'index.html';
        if (file_exists(get_file_base() . '/themes/default/templates_cached/index.html')) {
            afm_copy('themes/default/templates_cached/index.html', $path, false);
        }
    }
    afm_copy('themes/default/theme.ini', 'themes/' . $name . '/theme.ini', true);
    /*$_dir=opendir(get_custom_file_base().'/themes/default/css');
    	while (false!==($file=readdir($_dir)))
    	{
    		if (strtolower(substr($file,-4,4))=='.css')
    		{
    			$path='themes/'.$name.'/css_custom/'.$file;
    			$new_css_file="@import url(../../../default/css/$file);\n\n".file_get_contents(get_custom_file_base().'/themes/default/css/'.$file,FILE_TEXT);
    			afm_make_file($path,$new_css_file,false);
    		}
    	}
    	closedir($_dir);*/
    // Copy image references from default
    $start = 0;
    do {
        $theme_images = $GLOBALS['SITE_DB']->query_select('theme_images', array('*'), array('theme' => 'default'), '', 100, $start);
        foreach ($theme_images as $theme_image) {
            $test = $GLOBALS['SITE_DB']->query_value_null_ok('theme_images', 'id', array('theme' => $name, 'id' => $theme_image['id'], 'lang' => $theme_image['lang']));
            if (is_null($test)) {
                $GLOBALS['SITE_DB']->query_insert('theme_images', array('id' => $theme_image['id'], 'theme' => $name, 'path' => $theme_image['path'], 'lang' => $theme_image['lang']));
            }
        }
        $start += 100;
    } while (count($theme_images) == 100);
    log_it('ADD_THEME', $name);
}
Exemplo n.º 4
0
/**
 * Make a theme. Note that this will trigger the AFM.
 *
 * @param  string		Name of the theme.
 * @param  ID_TEXT	The theme it's being generated from
 * @param  ID_TEXT	The algorithm to use
 * @set equations hsv
 * @param  string		Seed colour to use.
 * @param  boolean	Whether to use the theme immediately.
 * @param  ?boolean  Whether it will be a dark theme (NULL: autodetect).
 * @param  boolean	Whether to inherit the CSS, for easier theme upgrading.
 */
function make_theme($themename, $source_theme, $algorithm, $seed, $use, $dark = false, $inherit_css = false)
{
    $GLOBALS['NO_QUERY_LIMIT'] = true;
    load_themewizard_params_from_theme($source_theme, $algorithm == 'hsv');
    if (file_exists(get_custom_file_base() . '/themes/' . $themename)) {
        require_code('abstract_file_manager');
        force_have_afm_details();
        $extending_existing = true;
    } else {
        if ($source_theme == 'default') {
            actual_add_theme($themename);
        } else {
            require_code('themes3');
            actual_copy_theme($source_theme, $themename);
        }
        $extending_existing = false;
    }
    if ($seed != find_theme_seed($source_theme) || $dark != find_theme_dark($source_theme)) {
        list($colours, $landscape) = calculate_theme($seed, $source_theme, $algorithm, 'colours', $dark);
        // Make images
        global $THEME_WIZARD_IMAGES, $THEME_WIZARD_IMAGES_NO_WILD, $IMG_CODES;
        if (function_exists('imagecolorallocatealpha')) {
            require_code('themes2');
            $full_img_set = array();
            foreach ($THEME_WIZARD_IMAGES as $expression) {
                if (substr($expression, -1) == '*') {
                    $expression = substr($expression, 0, strlen($expression) - 2);
                    // remove "/*"
                    $full_img_set = array_merge($full_img_set, array_keys(get_all_image_codes(get_file_base() . '/themes/' . filter_naughty($source_theme) . '/images', $expression)));
                    $full_img_set = array_merge($full_img_set, array_keys(get_all_image_codes(get_file_base() . '/themes/' . filter_naughty($source_theme) . '/images/' . fallback_lang(), $expression)));
                } else {
                    $full_img_set[] = $expression;
                }
            }
            if ($extending_existing) {
                $temp_all_ids = collapse_2d_complexity('id', 'path', $GLOBALS['SITE_DB']->query_select('theme_images', array('id', 'path'), array('theme' => $themename)));
            } else {
                $temp_all_ids = array();
            }
            $_langs = find_all_langs(true);
            foreach ($full_img_set as $image_code) {
                if (!in_array($image_code, $THEME_WIZARD_IMAGES_NO_WILD)) {
                    if ($extending_existing && array_key_exists($image_code, $temp_all_ids) && strpos($temp_all_ids[$image_code], $themename . '/images_custom/') !== false && (!url_is_local($temp_all_ids[$image_code]) || file_exists(get_custom_file_base() . '/' . $temp_all_ids[$image_code]))) {
                        continue;
                    }
                    foreach (array_keys($_langs) as $lang) {
                        $orig_path = find_theme_image($image_code, true, true, $source_theme, $lang);
                        if ($orig_path == '') {
                            continue;
                        }
                        // Theme has specified non-existent image as themewizard-compatible
                        if (strpos($orig_path, '/' . $lang . '/') === false && $lang != fallback_lang()) {
                            continue;
                        }
                        if (strpos($orig_path, '/' . fallback_lang() . '/') !== false) {
                            $composite = 'themes/' . filter_naughty($themename) . '/images/' . $lang . '/';
                        } else {
                            $composite = 'themes/' . filter_naughty($themename) . '/images/';
                        }
                        $saveat = get_custom_file_base() . '/' . $composite . $image_code . '.png';
                        $saveat_url = $composite . $image_code . '.png';
                        // Wipe out ones that might have been copied from source theme
                        if ($source_theme != 'default' && strpos($orig_path, 'images_custom') !== false) {
                            @unlink(str_replace('/images/', '/images_custom/', basename($saveat, '.png')) . '.png');
                            @unlink(str_replace('/images/', '/images_custom/', basename($saveat, '.png')) . '.jpg');
                            @unlink(str_replace('/images/', '/images_custom/', basename($saveat, '.png')) . '.gif');
                            @unlink(str_replace('/images/', '/images_custom/', basename($saveat, '.png')) . '.jpeg');
                        }
                        if (!file_exists($saveat) || $source_theme != 'default' || $algorithm == 'hsv') {
                            $image = calculate_theme($seed, $source_theme, $algorithm, $image_code, $dark, $colours, $landscape, $lang);
                            if (!is_null($image)) {
                                $pos = strpos($image_code, '/');
                                if ($pos !== false || strpos($orig_path, '/' . fallback_lang() . '/') !== false) {
                                    afm_make_directory($composite . substr($image_code, 0, $pos), true, true);
                                }
                                @imagepng($image, $saveat) or intelligent_write_error($saveat);
                                imagedestroy($image);
                                fix_permissions($saveat);
                                sync_file($saveat);
                                actual_edit_theme_image($image_code, $themename, $lang, $image_code, $saveat_url, true);
                                //if ($lang==fallback_lang()) $IMG_CODES['site'][$image_code]=$saveat_url;
                            }
                        } else {
                            actual_edit_theme_image($image_code, $themename, $lang, $image_code, $saveat_url, true);
                        }
                    }
                }
            }
        }
        // Make sheets
        $dh = opendir(get_file_base() . '/themes/' . filter_naughty($source_theme) . ($source_theme == 'default' ? '/css/' : '/css_custom/'));
        while (($sheet = readdir($dh)) !== false) {
            if (substr($sheet, -4) == '.css') {
                $saveat = get_custom_file_base() . '/themes/' . filter_naughty($themename) . '/css_custom/' . $sheet;
                if (!file_exists($saveat) || $source_theme != 'default' || $algorithm == 'hsv') {
                    $fp = @fopen($saveat, 'wt') or intelligent_write_error(get_custom_file_base() . '/themes/' . filter_naughty($themename) . '/css_custom/' . $sheet);
                    if ($inherit_css) {
                        $output = '{+START,CSS_INHERIT,' . basename($sheet, '.css') . ',' . filter_naughty($source_theme) . ',' . $seed . ',' . ($dark ? '1' : '0') . ',' . $algorithm . '}{+END}';
                    } else {
                        $output = theme_wizard_colours_to_sheet($sheet, $landscape, $source_theme, $algorithm, $seed);
                    }
                    if (fwrite($fp, $output) < strlen($output)) {
                        warn_exit(do_lang_tempcode('COULD_NOT_SAVE_FILE'));
                    }
                    fclose($fp);
                    fix_permissions($saveat);
                    sync_file($saveat);
                    if (!$inherit_css) {
                        $c_success = @copy(get_file_base() . '/themes/' . filter_naughty($source_theme) . '/css/' . $sheet, $saveat . '.editfrom');
                        if ($c_success !== false) {
                            fix_permissions($saveat . '.editfrom');
                            sync_file($saveat . '.editfrom');
                        }
                    } else {
                        @unlink($saveat . '.editfrom');
                    }
                }
            }
        }
    }
    // Use it, if requested
    if ($use) {
        $GLOBALS['SITE_DB']->query('UPDATE ' . get_table_prefix() . 'zones SET zone_theme=\'' . db_escape_string($themename) . '\' WHERE ' . db_string_not_equal_to('zone_name', 'cms') . ' AND ' . db_string_not_equal_to('zone_name', 'adminzone'));
        $admin_groups = $GLOBALS['FORUM_DRIVER']->get_super_admin_groups();
        $groups = $GLOBALS['FORUM_DRIVER']->get_usergroup_list(false, true);
        $GLOBALS['SITE_DB']->query_delete('group_category_access', array('module_the_name' => 'theme', 'category_name' => $themename));
        foreach (array_keys($groups) as $group_id) {
            if (in_array($group_id, $admin_groups)) {
                continue;
            }
            $GLOBALS['SITE_DB']->query_insert('group_category_access', array('module_the_name' => 'theme', 'category_name' => $themename, 'group_id' => $group_id));
        }
        persistant_cache_empty();
    }
}
Exemplo n.º 5
0
/**
 * Copy a theme.
 *
 * @param  ID_TEXT		The original theme name
 * @param  ID_TEXT		The copy's theme name
 */
function actual_copy_theme($theme, $to)
{
    if ($theme == 'default') {
        fatal_exit(do_lang_tempcode('INTERNAL_ERROR'));
    }
    if (file_exists(get_custom_file_base() . '/themes/' . $to) || $to == 'default') {
        warn_exit(do_lang_tempcode('ALREADY_EXISTS', escape_html($to)));
    }
    require_code('abstract_file_manager');
    require_code('files2');
    force_have_afm_details();
    $contents = get_directory_contents(get_custom_file_base() . '/themes/' . $theme, '', true);
    foreach ($contents as $c) {
        afm_make_directory(dirname('themes/' . $to . '/' . $c), true, true);
        afm_copy('themes/' . $theme . '/' . $c, 'themes/' . $to . '/' . $c, true);
    }
    $needed = array('css', 'css_custom', 'images', 'images_custom', 'templates', 'templates_cached/' . get_site_default_lang(), 'templates_custom');
    foreach ($needed as $n) {
        afm_make_directory(dirname('themes/' . $to . '/' . $n), true, true);
    }
    $images = $GLOBALS['SITE_DB']->query_select('theme_images', array('*'), array('theme' => $theme));
    foreach ($images as $i) {
        $i['theme'] = $to;
        $i['path'] = str_replace('themes/' . $theme . '/', 'themes/' . $to . '/', $i['path']);
        $GLOBALS['SITE_DB']->query_insert('theme_images', $i);
    }
    log_it('COPY_THEME', $theme, $to);
}
Exemplo n.º 6
0
/**
 * Upgrade a theme automatically, using hand-coded migration arrays.
 *
 * @param   ID_TEXT	Theme to be upgraded
 * @param   float		From version
 * @param   float		Target version
 * @param   boolean	Whether executing a test run (i.e. not do anything)
 * @return  array		A pair: List of errors, List of successes
 */
function upgrade_theme($theme, $from_version, $to_version, $test_run = true)
{
    $errors = array();
    $successes = array();
    if (!$test_run) {
        require_code('abstract_file_manager');
        force_have_afm_details();
    }
    $css_replace__single_match = array();
    $css_prepend__single_match = array();
    $css_append__single_match = array();
    $css_replace__multi_match = array();
    $css_prepend__multi_match = array();
    $css_append__multi_match = array();
    $css_file_append = array();
    $theme_images_new = array();
    $theme_images_renames = array();
    $templates_replace = array();
    $templates_rename = array();
    $templates_borked = array();
    if ($from_version < 8.0 && $to_version >= 8.0 && $to_version < 9.0) {
        $css_recognition_string = '2004-2011';
        // Must be defined. Ensures theme is right version.
        $css_replace__multi_match = array('*' => array("2004-2011" => "2004-2012", "gradiant" => "gradient", "\$IMG," => "\$IMG;,", "url(\"" => "url('", "\")" => "')"), 'global.css' => array("comments_outer" => "comments_posting_form_outer", "comments_inner" => "comments_posting_form_inner", "comments_end" => "comments_posting_form_end", "comments_emoticons" => "comments_posting_form_emoticons", "comments_links" => "comments_posting_form_links"));
        $css_replace__single_match = array('adminzone.css' => array("template_edit_guid__true" => "template_edit_guid_1", "template_edit_guid__false" => "template_edit_guid_0"), 'calendar.css' => array(".calendar_week_hour {\n\twidth: 90px;\n}" => ".calendar_week_hour {\n\twidth: 90px;\n\theight: 30px;\n\tborder: 1px solid #6b81a1; /* {\$,dottedborder.border, 95% (seed sat_to 33) + 5% !W/B}*/\n}"), 'chat.css' => array(".chat_lobby_convos_area {\n}" => ".chat_lobby_convos_area {\n\toverflow: hidden;\n\twidth: 100%;\n}"), 'global.css' => array("tt, kbd, samp {\n\tfont-size: 1.25em;\n\tfont-weight: bold;\n}" => "tt, kbd, samp {\n\tfont-weight: bold;\n}", "input[type=\"text\"],input[type=\"password\"],textarea,select { /* Normally a browser default, but gets inherited on some phones */" => "input[type=\"text\"],input[type=\"password\"],input[type=\"color\"],input[type=\"email\"],input[type=\"number\"],input[type=\"range\"],input[type=\"search\"],input[type=\"tel\"],input[type=\"url\"],textarea,select { /* Normally a browser default, but gets inherited on some phones */", ".breadcrumbs {\n\tpadding: 5px 0 0 0;\n\tfloat: {!en_right};\n\tmargin-left: 5px;\n\tzoom: 1;\n}" => ".breadcrumbs {\n\tpadding: 5px 0 0 0;\n\t{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\tfloat: {!en_right};\n\t\tmargin-left: 5px;\n\t{+END}\n\tzoom: 1;\n}\n\n.breadcrumbs abbr {\n\twhite-space: nowrap;\n}", ".standardbox_wrap_panel img {\n\tmax-width: 100%;\n}" => ".standardbox_wrap_panel img {\n\tmax-width: 98%;\n}", ".standardbox_classic, .standardbox_links_classic {" => ".standardbox_classic, .standardbox_wrap_classic .standardbox_links_classic {", ".scale_down { /* {\$,Membership of this class is used as a tag to turn on image scaling} */\n\tmax-width: 100%;\n}" => ".scale_down { /* {\$,Membership of this class is used as a tag to turn on image scaling} */\n\tmax-width: 100%;\n\tbox-sizing: border-box;\n}", "ul.compact_list {" => "ul.compact_list, ol.compact_list {", "ul.compact_list li {" => "ul.compact_list li, ol.compact_list li {", "ul.spaced_list, .spaced_list ul {" => "ul.spaced_list, .spaced_list ul, ol.spaced_list, .spaced_list ol {", ".trinav_right {\n\tfloat: right;\n\t{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\tmargin-left: 10px;\n\t{+END}\n\t{+START,IF,{\$MOBILE}}\n\t\twidth: 33%;\n\t{+END}\n\ttext-align: right;\n}\n" => ".trinav_right {\n\tfloat: right;\n\t{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\tmargin-left: 10px;\n\t\tmargin-right: 26px;\n\t{+END}\n\t{+START,IF,{\$MOBILE}}\n\t\twidth: 33%;\n\t{+END}\n\ttext-align: right;\n}\n", ".category_entry {\n\tpadding: 6px 0;\n\tmargin: 6px 0;\n\tclear: both;\n}" => ".category_entry {\n\tpadding: 6px 0;\n\tmargin: 6px 0;\n\tclear: both;\n\toverflow: hidden;\n\twidth: 100%;\n}", "ul.actions_list li, ul.actions_list_compact li, ul.actions_list_super_compact li {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style-type: none;\n}" => "ul.actions_list li, ul.actions_list_compact li, ul.actions_list_super_compact li {\n\tpadding: 0;\n\tmargin: 0;\n\tlist-style-type: none;\n\tlist-style-image: none;\n}", ".non_link:link,\n.non_link:visited,\n.non_link:hover,\n.non_link:active {\n\tcolor: #0d1522; /* {\$,wizard, 20% seed + 80% !W/B} */\n\ttext-decoration: none;\n\tcursor: default;\n}" => ".non_link,\n.non_link:link,\n.non_link:visited,\n.non_link:hover,\n.non_link:active {\n\tcolor: #0d1522 !important; /* {\$,wizard, 20% seed + 80% !W/B} */\n\ttext-decoration: none;\n\tcursor: default;\n}", "text-shadow: 1px 1px 1px #000000; /* {\$,wizard, 100% !W/B} */\n\tmargin: 0 2px;\n}" => "text-shadow: 1px 1px 1px #000000; /* {\$,wizard, 100% !W/B} */\n\tmargin: 0 2px;\n\toverflow: visible; /* stops button padding on IE7 */\n}", ".inline_image {\n\tvertical-align: top;\n}\n\n.inline_image_2 {\n\tvertical-align: middle;\n}\n\n.inline_image_3 {\n\tvertical-align: baseline;\n}\n\n.inline_image_4 {\n\tmargin-top: -4px;\n}" => ".inline_image {\n\tvertical-align: top !important;\n}\n\n.inline_image_2 {\n\tvertical-align: middle !important;\n}\n\n.inline_image_3 {\n\tvertical-align: baseline !important;\n}\n\n.inline_image_4 {\n\tmargin-top: -4px !important;\n}", ".gallery_media_full_expose {\n\toverflow: hidden;\n\twidth: 100%;\n\toutline: 0;\n\tmargin: {\$?,{\$MOBILE},1,3}em 0;\n}\n\n.gallery_media_full_expose {\n\ttext-align: center;\n}" => ".gallery_media_full_expose {\n\toverflow: hidden;\n\twidth: 100%;\n\toutline: 0;\n\tmargin: {\$?,{\$MOBILE},1,3}em 0;\n\ttext-align: center;\n\tposition: relative;\n}", ".gallery_media_full_expose img, .img_thumb {\n\tborder: 1px solid #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\t-webkit-box-shadow: 3px 3px 10px #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\t-moz-box-shadow: 3px 3px 10px #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\tbox-shadow: 3px 3px 10px #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\tmax-width: 100%;\n}" => ".gallery_media_full_expose img, .img_thumb {\n\tborder: 1px solid #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\t-webkit-box-shadow: 3px 3px 10px #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\t-moz-box-shadow: 3px 3px 10px #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\tbox-shadow: 3px 3px 10px #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\tmax-width: 100%;\n\tbox-sizing: border-box;\n}", ".form_field_name {\n\tmargin: 4px 0;\n}" => ".form_field_name {\n\tmargin: 4px;\n\tdisplay: inline-block;\n}", ".input_author, .input_username, .input_colour, .input_email,\n" => ".input_author, .input_username, .input_colour, .input_email, .input_codename,\n", ".input_author_required, .input_username_required, .input_colour_required, .input_email_required,\n" => ".input_author_required, .input_username_required, .input_colour_required, .input_email_required, .input_codename_required,\n", ".members_viewing {\n\tborder-top: 0;\n\tpadding: 4px;\n\ttext-indent: 25px;\n\tpadding-{!en_left}: 0;\n}" => ".members_viewing {\n\tpadding: 4px;\n\ttext-indent: 25px;\n\tpadding-{!en_left}: 0;\n}\n\n.ocf_topic_0 .members_viewing {\n\tborder-top: 0;\n}", ".post .post_edit_link {\n}" => ".post .post_action_link {\n}\n\n.post .post_thread_children {\n\tmargin-top: 1em;\n\t{+START,IF,{\$MOBILE}}\n\t\tmargin-left: 7px;\n\t{+END}\n\t{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\tmargin-left: 20px;\n\t{+END}\n}\n\n.post .ocf_post_buttons {\n\tmargin-top: 1.3em;\n}\n\n.ocf_post_buttons a {\n\topacity: 0.0;\n\t-webkit-transition-property : opacity;\n\t-webkit-transition-duration : 0.5s;\n\t-moz-transition-property : opacity;\n\t-moz-transition-duration : 0.5s;\n\t-o-transition-property : opacity;\n\t-o-transition-duration : 0.5s;\n\ttransition-property : opacity;\n\ttransition-duration : 0.5s;\n}\n\n.ocf_post_buttons a[rel=\"add reply\"] {\n\topacity: 1.0;\n}\n\n.ocf_post_buttons:hover a {\n\topacity: 1.0;\n}\n\n.post_show_more {\n\ttext-align: center;\n\tborder: 1px dashed #c1cee3; /* {\$,wizard, 100% lightborder} */\n\tborder-bottom-left-radius: 40px;\n\tborder-bottom-right-radius: 40px;\n\tpadding: 15px;\n\tfont-weight: bold;\n\tfont-size: 0.85em;\n}\n\n.post .post_show_more {\n\tmargin-left: 20px;\n}", "ul.sitemap {\n\tlist-style-type: none;\n\tmargin-left: 0;\n\tpadding-left: 0;\n}" => "ul.sitemap {\n\tlist-style-type: none;\n\tlist-style-image: none;\n\tmargin-left: 0;\n\tpadding-left: 0;\n}", ".rating_inner {\n\ttext-align: center;\n\twhite-space: nowrap;\n}" => ".RATING_BOX .rating_inner {\n\ttext-align: center;\n}\n\n.RATING_INLINE_DYNAMIC .rating_inner, .RATING_INLINE_DYNAMIC form {\n\tdisplay: inline;\n}\n\n.post_action_link .RATING_INLINE_DYNAMIC {\n\tpadding-left: 20px;\n}\n\n.rating_inner {\n\twhite-space: nowrap;\n}\n\n.rating_inner img {\n\tcursor: pointer;\n}", ".tab {\n\tfloat: left;\n\tbackground: url('{\$IMG,tab}');\n\tpadding: 3px 5px 0 5px;\n\theight: 20px;\n\ttext-align: center;\n\tcursor: pointer;\n}" => ".tab {\n\tfloat: left;\n\tbackground: url('{\$IMG;,tab}') !important;\n\tpadding: 3px 7px 0 7px !important;\n\theight: 20px;\n\ttext-align: center;\n\tcursor: pointer;\n}", ".tab_active, .tab:hover {\n\tfont-weight: bold;\n}" => ".tab_active {\n\tfont-weight: bold;\n}\n\n.tab:hover {\n\ttext-decoration: underline !important;\n}", ".nl li {\n\tdisplay: block;\n\tmargin-{!en_left}: 0;\n\tpadding-{!en_left}: 0;\n\tlist-style-type: none;\n}" => ".nl li {\n\tdisplay: block;\n\tmargin-{!en_left}: 0;\n\tpadding-{!en_left}: 0;\n\tlist-style-type: none;\n\tlist-style-image: none;\n}", ".menu_type__popup li a:link a:hover {\n\tcolor: #9C202F; /* {\$,wizard, 100% a.hover}*/\n}" => ".menu_type__popup li a:hover {\n\tcolor: #9C202F !important; /* {\$,wizard, 100% a.hover}*/\n}", ".menu_type__top li, .menu_type__dropdown li.toplevel {\n\tfloat: {!en_left};\n\tborder-{!en_left}: 1px solid #0d1522; /* {\$,wizard, 20% seed + 80% !W/B} */\n\tmargin-{!en_right}: -1px;" => ".menu_type__top li, .menu_type__dropdown li.toplevel {\n\tfloat: {!en_left};\n\tborder-{!en_left}: 1px solid #0d1522; /* {\$,wizard, 20% seed + 80% !W/B} */\n\tmargin-{!en_right}: -1px;\n\tmargin-bottom: 0;", ".menu_type__top img, .menu_type__dropdown li.toplevel img {\n\tfloat: {!en_left};\n\tpadding: 0 8px 0 3px;\n\tmargin-top: -2px;\n}" => ".menu_type__top img, .menu_type__dropdown .toplevel_link img {\n\tmargin-top: -2px;\n}\n\n.menu_type__top img, .menu_type__dropdown img {\n\tfloat: {!en_left};\n\tpadding: 0 8px 0 3px;\n}", ".menu_type__top .menu_spacer, .menu_type__dropdown li.toplevel.menu_spacer {\n\theight: 1.15em;\n\twidth: 4em;\n\tpadding: 4px;\n}" => ".menu_type__top .menu_spacer, .menu_type__dropdown li.toplevel.menu_spacer {\n\theight: 1.15em;\n\twidth: 4em;\n\tpadding: 4px;\n\tfloat: {!en_left};\n}", ".menu_type__zone {\n\tfont-size: 0.9em;\n}" => ".menu_type__zone {\n\tfont-size: 0.9em;\n\tmax-height: 15px;\n}", ".menu_type__zone li {\n\tdisplay: inline;\n\tpadding: 0;\n\tlist-style-type: none;\n}" => ".menu_type__zone li {\n\tdisplay: inline;\n\tpadding: 0;\n\tlist-style-type: none;\n\tlist-style-image: none;\n}\n\n.menu_type__zone li * {\n\tvertical-align: middle;\n}", ".edit_menu_link_inline {\n\tposition: absolute;\n\tright: 1px;\n}" => "*>.edit_menu_link_inline {\n\tdisplay: none;\n}\n\n*:hover>.edit_menu_link_inline {\n\tdisplay: block;\n}\n\n.edit_menu_link_inline {\n\tposition: absolute;\n\tright: 1px;\n\tz-index: 10000;\n}", ".radio_list_picture {\n\tfloat: {!en_left};\n\twhite-space: nowrap;\n\tpadding: 3px;\n\tmin-width: 35px;\n\tmin-height: 35px;\n}" => ".radio_list_picture {\n\tfloat: {!en_left};\n\twhite-space: nowrap;\n\tpadding: 3px;\n\tmin-width: 40px;\n\tmin-height: 40px;\n\tfont-size: 0.8em;\n\tmin-height: 65px;\n\tmin-width: 85px;\n}"), 'news.css' => array(".standardbox_wrap_classic .news_piece_summary h3, .rss_summary h3 {\n\tmargin-{!en_right}: 130px;\n\tborder-bottom: 1px solid #6b81a1; /* {\$,wizard, 100% medborder.border} */\n}" => ".news_piece_summary h3, .rss_summary h3 {\n\tmargin-{!en_right}: 130px !important;\n\tborder-bottom: 1px solid #6b81a1 !important; /* {\$,wizard, 100% medborder.border} */\n}\n\n.rss_summary nobr { /* Stops naughty Google news from breaking layout */\n\twhite-space: normal;\n}"), 'ocf.css' => array(".ocf_post_details_date {\n\tfloat: {!en_left};\n\t{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\twidth: 25em;\n\t{+END}\n\tpadding-{!en_left}: 4px;\n}" => ".ocf_post_details_date {\n\tfloat: {!en_left};\n\tpadding-{!en_left}: 4px;\n}\n\n.ocf_post_details_rating {\n\tfloat: {!en_left};\n\tpadding-{!en_left}: 20px;\n\twhite-space: nowrap;\n}", ".ocf_information_bar { /* {\$,either OCF_GUEST_BAR.tpl or OCF_MEMBER_BAR.tpl} */\n\tbackground-color: #eef2f7; /* {\$,wizard, 60% bgcol + 40% W/B} */\n\tfont-size: 0.85em;\n\tborder-collapse: collapse;\n\twhite-space: nowrap;\n\twidth: 100%;\n}" => ".ocf_information_bar { /* {\$,either OCF_GUEST_BAR.tpl or OCF_MEMBER_BAR.tpl} */\n\tbackground-color: #eef2f7; /* {\$,wizard, 60% bgcol + 40% W/B} */\n\tfont-size: 0.85em;\n\tborder-collapse: collapse;\n\twhite-space: nowrap;\n\twidth: 100%;\n\tpadding: 0;\n}", ".ocf_member_column_d {\n\t{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\twidth: 11.3em;\n\t{+END}\n\t{+START,IF,{\$MOBILE}}\n\t\tfloat: left;\n\t{+END}\n\twhite-space: nowrap;\n}" => ".ocf_member_column_d {\n\twhite-space: nowrap;\n}", ".ocf_member_column_e {\n\twhite-space: nowrap;\n}\n\n" => "", ".ocf_post_details_unvalidated {\n\tfloat: {!en_left};\n\t}" => ".ocf_post_details_unvalidated {\n\tfloat: {!en_left};\n\tpadding-{!en_left}: 7px;\n\t}"), 'points.css' => array(".points_give_choices .sub_option {\n\tfont-size: 0.9em;\n}" => ".points_give_choices .sub_option {\n\tfont-size: 0.9em;\n\twhite-space: nowrap;\n}"), 'swfupload.css' => array("width: 365px;" => "{+START,IF,{\$NOT,{\$MOBILE}}}\n\t\twidth: 365px;\n\t{+END}"), 'tickets.css' => array(".closed_ticket {\n\tfont-weight: bold;\n\tpadding-{!en_left}: 30px;\n}" => ".closed_ticket {\n\tfont-style: italic;\n\tfloat: right;\n\tpadding-{!en_left}: 30px;\n}"));
        $css_prepend__single_match = array('adminzone.css' => array(".css_colour_strip" => ".dottedborder .css_colour_chooser_name {\n\twidth: 190px;\n}\n\n.dottedborder .css_colour_chooser {\n\twidth: 680px;\n\tmargin: 0;\n}\n\n", ".menu_editor_rh_side" => ".menu_editor_page.docked .menu_editor_rh_side {\n\toverflow-y: scroll;\n\tmax-height: 380px;\n\tmargin-right: 10px;\n}\n\n", ".menu_editor_lh_side" => ".menu_editor_page.docked #mini_form_hider {\n\tmargin-top: 1em;\n\tborder-top: 3px dotted #8b96df !important; /* {\$,wizard, 61% seed + 39% W/B} */\n\tposition: fixed;\n\tleft: 0;\n\tbottom: 0;\n\tbackground: #ffffff; /* {\$,wizard, 100% W/B} */\n\tfont-size: 0.9em;\n}\n\n.docked .menu_edit_main {\n\tpadding-bottom: 30em;\n}\n\n.dock_button {\n\tfloat: right;\n\tpadding: 5px;\n\tcursor: pointer;\n}\n\n"), 'calendar.css' => array(".top_navigation" => "abbr.dtstart, abbr.dtend {\n\tborder-bottom: 0;\n}\n\n"), 'galleries.css' => array(".nav_mid" => "#gallery_entry_screen {\n\twidth: 100%;\n\tmin-height: 100%;\n}\n\n", "/* side_root galleries block */" => ".slideshow_speed {\n\tposition: absolute;\n\tright: 0;\n\ttop: 0;\n}\n\n.slideshow_speed input {\n\twidth: 3em;\n}\n\n#changer {\n\tfont-weight: bold;\n\tfont-family: Courier;\n\tfont-size: 1.2em;\n}\n\n"), 'global.css' => array(".standardbox_title_classic a" => "h3.standardbox_title_classic {\n\tborder-bottom: 0;\n}\n\n", ".no_stbox_padding .dottedborder {" => ".overlay .dottedborder_huge_a, .overlay .dottedborder_barrier_a_nonrequired, .overlay .dottedborder_barrier_b_nonrequired, .overlay .dottedborder_divider, .overlay .dottedborder_divider_continue, .overlay .no_stbox_padding .forcedottedborder, .overlay .dottedborder {\n\tborder: 0;\n}\n\n", ".edited {" => ".bookmarks_menu_box {\n\twidth: 320px;\n}\n\n", "\na.poster_member:hover" => ".post_poster a.poster_member:link, .post_poster a.poster_member:active, .post_poster a.poster_member:visited, .post_poster a.poster_member:hover {\n\tdisplay: inline-block;\n}\n", ".menu_type__dropdown ul.nlevel, .menu_type__popup ul" => ".menu_type__popup {\n\tmin-width: 150px;\n}\n\n", ".comments_posting_form_inner table" => ".comments_posting_form_inner textarea {\n\tcolor: #94979d; /* {\$,wizard, 65% bgcol + 35% !W/B} */\n}\n\n"));
        $css_append__single_match = array('global.css' => array(".medborder_detailhead a:hover {\n\tcolor: #9C202F; /* {\$,wizard, 100% a.hover}*/\n}\n\n" => ".global_side .medborder_detailhead_wrap {\n\tpadding: 0;\n}\n\n.global_side .medborder_detailhead {\n\tborder-bottom: 0;\n\tpadding-left: 0;\n\tpadding-top: 5px;\n}\n\n", "\ttop: -256000px;\n\tleft: 0;\n" => "\tdisplay: block; /* stops browser bugs where it interacts with the layout flow incorrectly */\n", ".page_icon {\n\tvertical-align: middle;\n\t{+START,IF,{\$MOBILE}}\n\t\tmargin-bottom: 5px;\n\t{+END}\n}\n\n" => ".standardbox_title_classic .page_icon {\n\tmargin: -1px 3px 0 0;\n}\n\n", ".input_huge_field {\n}\n\n" => ".password_strength {\n\tfloat: right;\n\twidth: 100px;\n\tborder: 1px solid #6b81a1; /* {\$,wizard, 100% medborder.border} */\n\tdisplay: none;\n}\n\n.password_strength_inner {\n\theight: 1em;\n\twidth: 0px;\n}\n\n", ".radio_list_picture {\n\tfloat: {!en_left};\n\twhite-space: nowrap;\n\tpadding: 3px;\n\tmin-width: 40px;\n\tmin-height: 40px;\n}\n\n" => "#page_running_admin_themes .radio_list_picture {\n\tfloat: none;\n\tmargin: 15px;\n\tborder: 1px solid #c1cee3; /* {\$,wizard, 100% lightborder} */\n}\n\n.radio_list_picture img {\n\tmax-width: 100px;\n}\n\n", ".tab_last {\n\tborder-right: 1px solid;\n\tborder-color: #b5b5b5; /* {\$,wizard, 100% b5b5b5} */\n}\n\n" => ".tab_surround .tab { /* subtabs */\n\tpadding-top: 5px !important;\n\theight: 18px;\n\tfont-size: 0.88em;\n}\n\n", "#screen_actions .digg {\n\tbackground-image: url('{\$IMG,recommend/digg}');\n}" => "\n#screen_actions .google_plusone {\n\tmargin-top: 1px;\n}\n"));
        $css_file_append = array('galleries.css' => array("\n/* Miscellaneous media handling */\n\n.gallery_pdf {\n\twidth: 100%;\n\theight: 600px;\n}"), 'no_cache.css' => array("\n{\$BROWSER,opera,,tt\\, kbd\\, samp \\{ font-size: 1.25em; \\}}\n"));
        // NB: This UNIX command can work out what theme images are added...
        // OLD=/Library/WebServer/Documents/test/themes/default/images ; NEW=/Library/WebServer/Documents/git/themes/default/images ; diff -r $OLD $NEW | grep "Only in $NEW" | grep -v .DS_Store | sed "s#Only in "$NEW"##g" | sed "s#: #/#g" | sed "s#^/##g" | sed "s#^EN/##g" | sed "s#\.*$##"
        // Obviously only theme-wizable images should go here
        $theme_images_new = array('page/add_ticket', 'page/disable_notifications', 'page/enable_notifications', 'page/forum', 'page/send_message', 'pageitem/disable_notifications', 'pageitem/enable_notifications', 'pageitem/reply', 'pageitem/send_message');
        $theme_images_renames = array('standardboxes/title_gradiant' => 'standardboxes/title_gradient', 'quote_gradiant' => 'quote_gradient', 'zone_gradiant' => 'zone_gradient');
        $templates_replace = array('*' => array('_true' => '1', '_false' => '0', 'TOPIC_NAME' => 'TOPIC_TITLE', 'load_XML_doc' => 'do_ajax_request', 'DESPATCH' => 'DISPATCH'));
        /*Find deleted/renamed templates:
        		OLD=/Library/WebServer/Documents/test/themes/default/templates ; NEW=/Library/WebServer/Documents/git/themes/default/templates ; diff -r $OLD $NEW | grep .tpl$ | grep "Only in "$OLD | sed "s#Only in "$OLD": ##"*/
        $templates_rename = array('COMMENTS.tpl' => 'COMMENTS_POSTING_FORM.tpl', 'CEDI_RATING_INSIDE.tpl' => 'CEDI_RATING_FORM.tpl', 'RATING_INSIDE.tpl' => 'RATING_FORM.tpl', 'RATING.tpl' => 'RATING_BOX.tpl', 'RATING_INLINE.tpl' => 'RATING_INLINE_STATIC.tpl');
        /*Find diff of changes templates
        		OLD=/Library/WebServer/Documents/test/themes/default/templates ; NEW=/Library/WebServer/Documents/git/themes/default/templates ; diff -u $OLD $NEW > ~/Desktop/diff.txt*/
        $templates_borked = array('COMMENTS_POSTING_FORM.tpl', 'CEDI_RATING_FORM.tpl', 'RATING_FORM.tpl', 'RATING_BOX.tpl', 'RATING_INLINE_STATIC.tpl', 'COMMENTS_WRAPPER.tpl', 'CEDI_RATING.tpl', 'OCF_MEMBER_PROFILE_SCREEN.tpl', 'ATTACHMENT.tpl', 'POSTING_FORM.tpl', 'POSTING_FIELD.tpl', 'ATTACHMENTS.tpl', 'BLOCK_HELPER_DONE.tpl', 'ATTACHMENT_IMG.tpl', 'ATTACHMENT_IMG_MINI.tpl', 'CATALOGUE_DEFAULT_CATEGORY_SCREEN.tpl', 'JAVASCRIPT.tpl', 'JAVASCRIPT_AJAX.tpl', 'JAVASCRIPT_AJAX_PEOPLE_LISTS.tpl', 'JAVASCRIPT_CHAT.tpl', 'JAVASCRIPT_DATE_CHOOSER.tpl', 'JAVASCRIPT_EDITING.tpl', 'JAVASCRIPT_JWPLAYER.tpl', 'JAVASCRIPT_MENU_EDITOR.tpl', 'JAVASCRIPT_PERMISSIONS.tpl', 'JAVASCRIPT_POSTING.tpl', 'JAVASCRIPT_SOUND.tpl', 'JAVASCRIPT_STAFF.tpl', 'JAVASCRIPT_SWFUPLOAD.tpl', 'JAVASCRIPT_THUMBNAILS.tpl', 'JAVASCRIPT_TREE_LIST.tpl', 'JAVASCRIPT_VALIDATION.tpl', 'JAVASCRIPT_YAHOO_EVENTS.tpl', 'JAVASCRIPT_ZONE_EDITOR.tpl', 'FORM_SCREEN_INPUT_CAPTCHA.tpl', 'FORM_SCREEN_INPUT_DATE.tpl', 'FORM_SCREEN_INPUT_PASSWORD.tpl', 'FORM_SCREEN_INPUT_RADIO_LIST.tpl', 'FORM_SCREEN_INPUT_RADIO_LIST_ENTRY_PICTURE_2.tpl', 'FORM_SCREEN_INPUT_TICK.tpl', 'FORM_SCREEN_INPUT_TREE_LIST.tpl', 'FORM_SCREEN_INPUT_UPLOAD.tpl', 'FORM_SCREEN_INPUT_UPLOAD_MULTI.tpl', 'GALLERY_NAV.tpl', 'MENU_EDITOR_BRANCH_WRAP.tpl', 'MENU_EDITOR_SCREEN.tpl', 'OCF_FORUM.tpl', 'OCF_MEMBER_BAR.tpl', 'OCF_TOPIC_WRAP.tpl', 'PAGE_LINK_CHOOSER.tpl', 'POINTS_SCREEN.tpl', 'SUPPORT_TICKETS_SCREEN.tpl', 'SUPPORT_TICKET_SCREEN.tpl');
    } else {
        $errors[] = do_lang_tempcode('NO_DEFINED_THEME_UPGRADER');
        return array($errors, array());
    }
    if (addon_installed('themewizard')) {
        require_code('themewizard');
        $seed = find_theme_seed($theme);
        $dark = find_theme_dark($theme);
        list($colours, $landscape) = calculate_theme($seed, 'default', 'equations', 'colours', $dark);
    }
    // CSS
    $css_dir = get_custom_file_base() . '/themes/' . filter_naughty($theme) . '/css_custom/';
    $dh = @opendir($css_dir);
    if ($dh !== false) {
        while (($css_file = readdir($dh)) !== false) {
            if (substr($css_file, -4) != '.css') {
                continue;
            }
            if (substr($css_file, 0, 1) == '.') {
                continue;
            }
            $css_file_contents = file_get_contents($css_dir . $css_file);
            $orig_css_file_contents = $css_file_contents;
            if (strpos($css_file_contents, $css_recognition_string) === false) {
                $errors[] = do_lang_tempcode('NON_RECOGNISED_CSS_FILE', escape_html($css_file), escape_html(float_to_raw_string($from_version)));
                //continue;		Actually we'll let it pass
            }
            // Apply single match rules. First check single match rules apply exactly once (means rule is bogus if it matches more than once, or unusable if not at all)
            foreach (array('css_replace' => $css_replace__single_match, 'css_prepend' => $css_prepend__single_match, 'css_append' => $css_append__single_match) as $rule_set_type => $rule_set) {
                foreach ($rule_set as $target_file => $_rule_set) {
                    // If people have moved CSS into global.css, to optimise page load times
                    if ($target_file != '*' && $target_file != 'global.css' && $css_file == 'global.css') {
                        if (file_exists($css_dir . $target_file) && strlen(trim(file_get_contents($css_dir . $target_file))) == 0) {
                            $target_file = 'global.css';
                        }
                    }
                    if ($target_file == '*' || $target_file == $css_file) {
                        foreach ($_rule_set as $from => $to) {
                            // Apply theme wizard to $to
                            if (addon_installed('themewizard')) {
                                $to = theme_wizard_colours_to_css($to, $landscape, 'default', 'equations', $seed);
                            }
                            $occurrences = substr_count($css_file_contents, $from);
                            if ($occurrences == 0) {
                                if (addon_installed('themewizard')) {
                                    $from = theme_wizard_colours_to_css($from, $landscape, 'default', 'equations', $seed);
                                    $occurrences = substr_count($css_file_contents, $from);
                                }
                            }
                            if ($occurrences == 0) {
                                $errors[] = do_lang_tempcode('CSS_RULE_UNMATCHED_' . $rule_set_type, escape_html($from), escape_html($to), escape_html($target_file));
                            } elseif ($occurrences > 1) {
                                $errors[] = do_lang_tempcode('CSS_RULE_OVERMATCHED_' . $rule_set_type, escape_html($from), escape_html($to), escape_html($target_file));
                            } else {
                                switch ($rule_set_type) {
                                    case 'css_replace':
                                        $css_file_contents = str_replace($from, $to, $css_file_contents);
                                        break;
                                    case 'css_prepend':
                                        $pos = strpos($css_file_contents, $from);
                                        if (substr($css_file_contents, $pos - strlen($to), strlen($to)) != $to) {
                                            $css_file_contents = substr($css_file_contents, 0, $pos) . $to . substr($css_file_contents, $pos);
                                        }
                                        break;
                                    case 'css_append':
                                        $pos = strpos($css_file_contents, $from) + strlen($from);
                                        if (substr($css_file_contents, $pos, strlen($to)) != $to) {
                                            $css_file_contents = substr($css_file_contents, 0, $pos) . $to . substr($css_file_contents, $pos);
                                        }
                                        break;
                                }
                            }
                        }
                    }
                }
            }
            // Apply multi-match rules
            foreach (array('css_replace' => $css_replace__multi_match, 'css_prepend' => $css_prepend__multi_match, 'css_append' => $css_append__multi_match) as $rule_set_type => $rule_set) {
                foreach ($rule_set as $target_file => $_rule_set) {
                    if ($target_file == '*' || $target_file == $css_file) {
                        foreach ($_rule_set as $from_a => $to) {
                            // Apply theme wizard to $to
                            if (addon_installed('themewizard')) {
                                $to = theme_wizard_colours_to_css($to, $landscape, 'default', 'equations', $seed);
                            }
                            $froms = array($from_a);
                            if (addon_installed('themewizard')) {
                                $froms[] = theme_wizard_colours_to_css($from_a, $landscape, 'default', 'equations', $seed);
                            }
                            foreach ($froms as $from) {
                                switch ($rule_set_type) {
                                    case 'css_replace':
                                        $css_file_contents = str_replace($from, $to, $css_file_contents);
                                        break;
                                    case 'css_prepend':
                                        $pos = 0;
                                        do {
                                            $pos = strpos($css_file_contents, $from, $pos);
                                            if ($pos !== false) {
                                                if (substr($css_file_contents, $pos, -strlen($to)) != $to) {
                                                    $css_file_contents = substr($css_file_contents, 0, $pos) . $to . substr($css_file_contents, $pos);
                                                    $pos += strlen($to) + strlen($from);
                                                } else {
                                                    $pos += strlen($from);
                                                }
                                            }
                                        } while ($pos !== false);
                                        break;
                                    case 'css_append':
                                        $pos = 0;
                                        do {
                                            $pos = strpos($css_file_contents, $from, $pos);
                                            if ($pos !== false) {
                                                if (substr($css_file_contents, $pos, strlen($to)) != $to) {
                                                    $pos += strlen($from);
                                                    $css_file_contents = substr($css_file_contents, 0, $pos) . $to . substr($css_file_contents, $pos);
                                                    $pos += strlen($to);
                                                } else {
                                                    $pos += strlen($from);
                                                }
                                            }
                                        } while ($pos !== false);
                                        break;
                                }
                            }
                        }
                    }
                }
            }
            // Apply unmatched rules
            foreach ($css_file_append as $target_file => $rule_set) {
                if ($target_file == '*' || $target_file == $css_file) {
                    foreach ($rule_set as $to) {
                        $css_file_contents .= $to;
                    }
                }
            }
            if (!$test_run) {
                // Take revision
                $revision_file = $css_dir . $css_file . '.' . strval(time());
                if (@copy($css_dir . $css_file, $revision_file) !== false) {
                    fix_permissions($revision_file);
                    sync_file($revision_file);
                }
                // Save
                if ($orig_css_file_contents != $css_file_contents) {
                    $outfile = @fopen($css_dir . $css_file, 'wb') or intelligent_write_error($css_dir . $css_file);
                    fwrite($outfile, $css_file_contents);
                    fclose($outfile);
                }
                $successes[] = do_lang_tempcode('CSS_FILE_UPGRADED', escape_html($css_file));
            }
        }
        closedir($dh);
    }
    // Theme images
    require_code('themes2');
    $langs = array('EN' => 'lang');
    //find_all_langs();
    foreach ($theme_images_renames as $old => $new) {
        foreach (array_keys($langs) as $lang) {
            $path = urldecode(find_theme_image($old, true, true, $theme, $lang));
            if ($path != '') {
                $new_path = str_replace('/' . $old, '/' . $new, $path);
                if (!$test_run) {
                    if (!file_exists(get_custom_file_base() . '/' . $new_path)) {
                        if (file_exists($path)) {
                            afm_move($path, $new_path);
                        }
                        $where_map = array('theme' => $theme, 'id' => $new);
                        if ($lang != '' && !is_null($lang)) {
                            $where_map['lang'] = $lang;
                        }
                        $GLOBALS['SITE_DB']->query_delete('theme_images', $where_map);
                        actual_edit_theme_image($old, $theme, $lang, $new, $new_path);
                        $successes[] = do_lang_tempcode('THEME_IMAGE_RENAMED', escape_html($old), escape_html($new));
                    }
                }
            }
        }
    }
    if (addon_installed('themewizard')) {
        if ($theme != 'default') {
            foreach ($theme_images_new as $new) {
                foreach (array_keys($langs) as $lang) {
                    $path = urldecode(find_theme_image($new, true, true, 'default', $lang));
                    if ($path != '') {
                        $new_path = str_replace('themes/default/images/', 'themes/' . $theme . '/images/', $path);
                        if (!file_exists(get_custom_file_base() . '/' . $new_path)) {
                            if (!$test_run) {
                                afm_make_directory(dirname($new_path), true, true);
                            }
                            $image = calculate_theme($seed, 'default', 'equations', $new, $dark, $colours, $landscape, $lang);
                            if (!is_null($image)) {
                                if (!$test_run) {
                                    @imagepng($image, get_custom_file_base() . '/' . $new_path) or intelligent_write_error(get_custom_file_base() . '/' . $new_path);
                                    imagedestroy($image);
                                    fix_permissions(get_custom_file_base() . '/' . $new_path);
                                    sync_file(get_custom_file_base() . '/' . $new_path);
                                    $successes[] = do_lang_tempcode('THEME_IMAGE_NEW', escape_html($new));
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    // Templates
    $templates_dir = get_custom_file_base() . '/themes/' . filter_naughty($theme) . '/templates_custom/';
    $dh = @opendir($templates_dir);
    if ($dh !== false) {
        while (($templates_file = readdir($dh)) !== false) {
            if (substr($templates_file, -4) != '.tpl') {
                continue;
            }
            $templates_file_contents = file_get_contents($templates_dir . $templates_file);
            $orig_templates_file_contents = $templates_file_contents;
            foreach ($templates_replace as $target_file => $rule_set) {
                if ($target_file == '*' || $target_file == $templates_file) {
                    foreach ($rule_set as $from => $to) {
                        $templates_file_contents = str_replace($from, $to, $templates_file_contents);
                    }
                }
            }
            if (array_key_exists($templates_file, $templates_rename)) {
                if (!$test_run) {
                    @rename($templates_dir . $templates_file, $templates_dir . $templates_rename[$templates_file]) or intelligent_write_error($templates_dir . $templates_rename[$templates_file]);
                    $successes[] = do_lang_tempcode('TEMPLATE_RENAMED', escape_html($templates_file), escape_html($templates_rename[$templates_file]));
                }
                $templates_file = $templates_rename[$templates_file];
            }
            if ($templates_file_contents != $orig_templates_file_contents) {
                if (!$test_run) {
                    $successes[] = do_lang_tempcode('TEMPLATE_ALTERED', escape_html($templates_file));
                    // Save
                    $outfile = @fopen($templates_dir . $templates_file, 'wb') or intelligent_write_error($templates_dir . $templates_file);
                    fwrite($outfile, $templates_file_contents);
                    fclose($outfile);
                }
            }
            if (in_array($templates_file, $templates_borked)) {
                $errors[] = do_lang_tempcode('TEMPLATE_WILL_NEED_RESTORING', escape_html($templates_file));
            }
        }
        closedir($dh);
    }
    return array($errors, $successes);
}
Exemplo n.º 7
0
/**
 * Extract all the files in the specified TAR file to the specified path.
 *
 * @param  array			The TAR file handle
 * @param  PATH			The full path to the folder to extract to
 * @param  boolean		Whether to extract via the AFM (assumes AFM has been set up prior to this function call)
 * @param  ?array			The files to extract (NULL: all)
 * @param  boolean		Whether to take backups of Comcode pages
 */
function tar_extract_to_folder(&$resource, $path, $use_afm = false, $files = NULL, $comcode_backups = false)
{
    if (!array_key_exists('directory', $resource)) {
        tar_get_directory($resource);
    }
    if (substr($path, -1) != '/') {
        $path .= '/';
    }
    $directory = $resource['directory'];
    foreach ($directory as $file) {
        if ($file['path'] != 'mod.inf' && $file['path'] != 'mod.php' && (is_null($files) || in_array($file['path'], $files))) {
            // Special case for directories. ocPortal doesn't add directory records, but at least 7-zip does
            if (substr($file['path'], -1) == '/') {
                if (!$use_afm) {
                    @mkdir($path . $file['path'], 0777);
                    fix_permissions($path . $file['path'], 0777);
                    sync_file($path . $file['path']);
                } else {
                    afm_make_directory($path . $file['path'], true);
                }
                continue;
            }
            $data = tar_get_file($resource, $file['path']);
            $path_components = explode('/', $file['path']);
            $buildup = '';
            foreach ($path_components as $i => $component) {
                if ($component != '') {
                    if (array_key_exists($i + 1, $path_components)) {
                        $buildup .= $component . '/';
                        if (!$use_afm) {
                            if (!file_exists($path . $buildup)) {
                                @mkdir($path . $buildup, 0777);
                                fix_permissions($path . $buildup, 0777);
                                sync_file($path . $buildup);
                            }
                        } else {
                            afm_make_directory($path . $buildup, true);
                        }
                    }
                }
            }
            // Take backup of Comcode page, if requested
            if ($comcode_backups) {
                if (substr($file['path'], -4) == '.txt') {
                    if (!$use_afm) {
                        if (file_exists(get_custom_file_base() . '/' . $path . $file['path'])) {
                            copy(get_custom_file_base() . '/' . $path . $file['path'], $path . $file['path'] . '.' . strval(time()));
                        }
                    } else {
                        if (file_exists(get_custom_file_base() . '/' . $path . $file['path'])) {
                            afm_copy($path . $file['path'], $path . $file['path'] . '.' . strval(time()), true);
                        }
                    }
                }
            }
            // Actually make file
            if ($path == '/' && $comcode_backups && get_param_integer('keep_theme_test', 0) == 1 && preg_match('#^[\\w\\_]+\\.txt$#', basename($file['path'])) != 0) {
                $theme = NULL;
                foreach ($directory as $file2) {
                    $matches = array();
                    if (preg_match('#^themes/([\\w\\_\\-]+)/#', $file2['path'], $matches) != 0) {
                        $theme = $matches[1];
                        break;
                    }
                }
                if (!is_null($theme)) {
                    $file['path'] = dirname($file['path']) . '/' . $theme . '__' . basename($file['path']);
                }
            }
            if (!$use_afm) {
                $myfile = @fopen(get_custom_file_base() . '/' . $path . $file['path'], 'wb');
                if ($myfile === false) {
                    intelligent_write_error($path . $file['path']);
                }
                if (fwrite($myfile, $data['data']) < strlen($data['data'])) {
                    warn_exit(do_lang_tempcode('COULD_NOT_SAVE_FILE'));
                }
                $fullpath = get_custom_file_base() . '/' . $path . $file['path'];
                @chmod($fullpath, $data['mode']);
                fclose($myfile);
                fix_permissions($fullpath);
                sync_file($fullpath);
            } else {
                afm_make_file($path . $file['path'], $data['data'], ($data['mode'] & 02) != 0);
            }
        }
    }
}
Exemplo n.º 8
0
/**
 * Add a zone.
 *
 * @param  ID_TEXT		Name of the zone
 * @param  SHORT_TEXT	The zone title
 * @param  ID_TEXT		The zones default page
 * @param  SHORT_TEXT	The header text
 * @param  ID_TEXT		The theme
 * @param  BINARY			Whether the zone is wide
 * @param  BINARY			Whether the zone requires a session for pages to be used
 * @param  BINARY			Whether the zone in displayed in the menu coded into some themes
 */
function actual_add_zone($zone, $title, $default_page = 'start', $header_text = '', $theme = 'default', $wide = 0, $require_session = 0, $displayed_in_menu = 1)
{
    require_code('type_validation');
    if (!is_alphanumeric($zone, true)) {
        warn_exit(do_lang_tempcode('BAD_CODENAME'));
    }
    if (get_file_base() != get_custom_file_base()) {
        warn_exit(do_lang_tempcode('SHARED_INSTALL_PROHIBIT'));
    }
    // Check doesn't already exist
    $test = $GLOBALS['SITE_DB']->query_value_null_ok('zones', 'zone_header_text', array('zone_name' => $zone));
    if (!is_null($test)) {
        if (file_exists(get_file_base() . '/' . $zone)) {
            warn_exit(do_lang_tempcode('ALREADY_EXISTS', escape_html($zone)));
        } else {
            persistant_cache_delete(array('ZONE', $zone));
            $GLOBALS['SITE_DB']->query_delete('zones', array('zone_name' => $zone), '', 1);
        }
    }
    if (!file_exists(get_file_base() . '/' . $zone)) {
        // Create structure
        afm_make_directory($zone . '/pages/minimodules_custom', true, true);
        afm_make_directory($zone . '/pages/minimodules', false, true);
        afm_make_directory($zone . '/pages/modules_custom', true, true);
        afm_make_directory($zone . '/pages/modules', false, true);
        $langs = array_keys(find_all_langs(true));
        foreach ($langs as $lang) {
            afm_make_directory($zone . '/pages/comcode_custom/' . $lang, true, true);
            afm_make_directory($zone . '/pages/comcode/' . $lang, false, true);
            afm_make_directory($zone . '/pages/html_custom/' . $lang, true, true);
            afm_make_directory($zone . '/pages/html/' . $lang, false, true);
        }
        afm_make_file($zone . '/index.php', file_get_contents(get_file_base() . '/site/index.php'), false);
        if (file_exists(get_file_base() . '/pages/.htaccess')) {
            afm_make_file($zone . '/pages/.htaccess', file_get_contents(get_file_base() . '/pages/.htaccess'), false);
        }
        $index_php = array('pages/comcode', 'pages/comcode/EN', 'pages/comcode_custom', 'pages/comcode_custom/EN', 'pages/html', 'pages/html/EN', 'pages/html_custom', 'pages/html_custom/EN', 'pages/modules', 'pages/modules_custom', 'pages');
        foreach ($index_php as $i) {
            afm_make_file($zone . '/' . $i . '/index.html', '', false);
        }
        $default_menu = <<<END
[block="zone_{$zone}_menu" type="tree" caption="Menu"]side_stored_menu[/block]
[block failsafe="1"]side_users_online[/block]
[block failsafe="1"]side_stats[/block]
[block]side_personal_stats[/block]
END;
        afm_make_file($zone . '/pages/comcode_custom/EN/panel_left.txt', $default_menu, true);
    }
    afm_make_file($zone . '/pages/comcode_custom/EN/' . filter_naughty($default_page) . '.txt', '[title]' . do_lang('YOUR_NEW_ZONE') . '[/title]' . chr(10) . chr(10) . do_lang('YOUR_NEW_ZONE_PAGE', $zone . ':' . $default_page) . chr(10) . chr(10) . '[block]main_comcode_page_children[/block]', true);
    $GLOBALS['SITE_DB']->query_insert('zones', array('zone_name' => $zone, 'zone_title' => insert_lang($title, 1), 'zone_default_page' => $default_page, 'zone_header_text' => insert_lang($header_text, 1), 'zone_theme' => $theme, 'zone_wide' => $wide, 'zone_require_session' => $require_session, 'zone_displayed_in_menu' => $displayed_in_menu));
    require_code('menus2');
    $menu_item_count = $GLOBALS['SITE_DB']->query_value('menu_items', 'COUNT(*)', array('i_menu' => 'zone_menu'));
    if ($menu_item_count < 40) {
        add_menu_item_simple('zone_menu', NULL, $title, $zone . ':', 0, 1);
    }
    log_it('ADD_ZONE', $zone);
    persistant_cache_delete('ALL_ZONES');
    decache('main_sitemap');
    decache('side_stored_menu');
    decache('side_zone_jump');
}