diff --git a/wp-admin/admin-functions.php b/wp-admin/admin-functions.php index 855e2d0e5..0d743354a 100644 --- a/wp-admin/admin-functions.php +++ b/wp-admin/admin-functions.php @@ -1,40 +1,47 @@ 31) ? 31 : $jj; - $hh = ($hh > 23) ? $hh - 24 : $hh; - $mn = ($mn > 59) ? $mn - 60 : $mn; - $ss = ($ss > 59) ? $ss - 60 : $ss; + $hh = ($hh > 23) ? $hh -24 : $hh; + $mn = ($mn > 59) ? $mn -60 : $mn; + $ss = ($ss > 59) ? $ss -60 : $ss; $_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss"; $_POST['post_date_gmt'] = get_gmt_from_date("$aa-$mm-$jj $hh:$mn:$ss"); - } + } // Create the post. $post_ID = wp_insert_post($_POST); @@ -62,44 +69,50 @@ function edit_post() { $post_ID = (int) $_POST['post_ID']; - if ( ! current_user_can('edit_post', $post_ID) ) - die( __('You are not allowed to edit this post.') ); + if (!current_user_can('edit_post', $post_ID)) + die(__('You are not allowed to edit this post.')); // Rename. $_POST['ID'] = (int) $_POST['post_ID']; - $_POST['post_content'] = $_POST['content']; - $_POST['post_excerpt'] = $_POST['excerpt']; + $_POST['post_content'] = $_POST['content']; + $_POST['post_excerpt'] = $_POST['excerpt']; $_POST['post_parent'] = $_POST['parent_id']; $_POST['to_ping'] = $_POST['trackback_url']; - if (! empty($_POST['post_author_override'])) { + if (!empty ($_POST['post_author_override'])) { $_POST['$post_author'] = (int) $_POST['post_author_override']; - } else if (! empty($_POST['post_author'])) { - $_POST['post_author'] = (int) $_POST['post_author']; - } else { - $_POST['post_author'] = (int) $_POST['user_ID']; - } + } else + if (!empty ($_POST['post_author'])) { + $_POST['post_author'] = (int) $_POST['post_author']; + } else { + $_POST['post_author'] = (int) $_POST['user_ID']; + } - if ( ($_POST['post_author'] != $_POST['user_ID']) && ! current_user_can('edit_others_posts') ) - die( __('You cannot post as this user.') ); + if (($_POST['post_author'] != $_POST['user_ID']) && !current_user_can('edit_others_posts')) + die(__('You cannot post as this user.')); // What to do based on which button they pressed - if ('' != $_POST['saveasdraft']) $_POST['post_status'] = 'draft'; - if ('' != $_POST['saveasprivate']) $_POST['post_status'] = 'private'; - if ('' != $_POST['publish']) $_POST['post_status'] = 'publish'; - if ('' != $_POST['advanced']) $_POST['post_status'] = 'draft'; - if ('' != $_POST['savepage']) $_POST['post_status'] = 'static'; - - if ( 'publish' == $_POST['post_status'] && ! current_user_can('publish_posts') ) + if ('' != $_POST['saveasdraft']) $_POST['post_status'] = 'draft'; - - if ( !isset($_POST['comment_status']) ) + if ('' != $_POST['saveasprivate']) + $_POST['post_status'] = 'private'; + if ('' != $_POST['publish']) + $_POST['post_status'] = 'publish'; + if ('' != $_POST['advanced']) + $_POST['post_status'] = 'draft'; + if ('' != $_POST['savepage']) + $_POST['post_status'] = 'static'; + + if ('publish' == $_POST['post_status'] && !current_user_can('publish_posts')) + $_POST['post_status'] = 'draft'; + + if (!isset ($_POST['comment_status'])) $_POST['comment_status'] = 'closed'; - if ( !isset($_POST['ping_status']) ) + if (!isset ($_POST['ping_status'])) $_POST['ping_status'] = 'closed'; - - if ( !empty($_POST['edit_date']) ) { + + if (!empty ($_POST['edit_date'])) { $aa = $_POST['aa']; $mm = $_POST['mm']; $jj = $_POST['jj']; @@ -107,30 +120,30 @@ function edit_post() { $mn = $_POST['mn']; $ss = $_POST['ss']; $jj = ($jj > 31) ? 31 : $jj; - $hh = ($hh > 23) ? $hh - 24 : $hh; - $mn = ($mn > 59) ? $mn - 60 : $mn; - $ss = ($ss > 59) ? $ss - 60 : $ss; + $hh = ($hh > 23) ? $hh -24 : $hh; + $mn = ($mn > 59) ? $mn -60 : $mn; + $ss = ($ss > 59) ? $ss -60 : $ss; $_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss"; $_POST['post_date_gmt'] = get_gmt_from_date("$aa-$mm-$jj $hh:$mn:$ss"); - } + } wp_update_post($_POST); // Meta Stuff - if ($_POST['meta']) : - foreach ($_POST['meta'] as $key => $value) : - update_meta($key, $value['key'], $value['value']); - endforeach; + if ($_POST['meta']) + : foreach ($_POST['meta'] as $key => $value) + : update_meta($key, $value['key'], $value['value']); + endforeach; endif; - if ($_POST['deletemeta']) : - foreach ($_POST['deletemeta'] as $key => $value) : - delete_meta($key); - endforeach; + if ($_POST['deletemeta']) + : foreach ($_POST['deletemeta'] as $key => $value) + : delete_meta($key); + endforeach; endif; add_meta($post_ID); - + return $post_ID; } @@ -140,17 +153,17 @@ function edit_comment() { $comment_ID = (int) $_POST['comment_ID']; $comment_post_ID = (int) $_POST['comment_post_ID']; - if ( ! current_user_can('edit_post', $comment_post_ID) ) - die( __('You are not allowed to edit comments on this post, so you cannot edit this comment.') ); + if (!current_user_can('edit_post', $comment_post_ID)) + die(__('You are not allowed to edit comments on this post, so you cannot edit this comment.')); $_POST['comment_author'] = $_POST['newcomment_author']; - $_POST['comment_author_email'] = $_POST['newcomment_author_email']; + $_POST['comment_author_email'] = $_POST['newcomment_author_email']; $_POST['comment_author_url'] = $_POST['newcomment_author_url']; $_POST['comment_approved'] = $_POST['comment_status']; $_POST['comment_content'] = $_POST['content']; $_POST['comment_ID'] = (int) $_POST['comment_ID']; - - if ( !empty($_POST['edit_date']) ) { + + if (!empty ($_POST['edit_date'])) { $aa = $_POST['aa']; $mm = $_POST['mm']; $jj = $_POST['jj']; @@ -158,9 +171,9 @@ function edit_comment() { $mn = $_POST['mn']; $ss = $_POST['ss']; $jj = ($jj > 31) ? 31 : $jj; - $hh = ($hh > 23) ? $hh - 24 : $hh; - $mn = ($mn > 59) ? $mn - 60 : $mn; - $ss = ($ss > 59) ? $ss - 60 : $ss; + $hh = ($hh > 23) ? $hh -24 : $hh; + $mn = ($mn > 59) ? $mn -60 : $mn; + $ss = ($ss > 59) ? $ss -60 : $ss; $_POST['comment_date'] = "$aa-$mm-$jj $hh:$mn:$ss"; } @@ -181,7 +194,7 @@ function get_post_to_edit($id) { $post->post_title = apply_filters('title_edit_pre', $post->post_title); if ($post->post_status == 'static') - $post->page_template = get_post_meta($id, '_wp_page_template', true); + $post->page_template = get_post_meta($id, '_wp_page_template', true); return $post; } @@ -233,7 +246,7 @@ function wp_insert_category($catarr) { $cat_ID = (int) $cat_ID; // Are we updating or creating? - if ( !empty($cat_ID) ) { + if (!empty ($cat_ID)) { $update = true; } else { $update = false; @@ -243,25 +256,25 @@ function wp_insert_category($catarr) { $cat_name = wp_specialchars($cat_name); - if ( empty($category_nicename) ) + if (empty ($category_nicename)) $category_nicename = sanitize_title($cat_name, $cat_ID); else $category_nicename = sanitize_title($category_nicename, $cat_ID); - if ( empty($category_description) ) + if (empty ($category_description)) $category_description = ''; - if ( empty($category_parent) ) + if (empty ($category_parent)) $category_parent = 0; - if ( !$update) + if (!$update) $query = "INSERT INTO $wpdb->categories (cat_ID, cat_name, category_nicename, category_description, category_parent) VALUES ('0', '$cat_name', '$category_nicename', '$category_description', '$cat')"; else $query = "UPDATE $wpdb->categories SET cat_name = '$cat_name', category_nicename = '$category_nicename', category_description = '$category_description', category_parent = '$category_parent' WHERE cat_ID = '$cat_ID'"; $result = $wpdb->query($query); - if ( $update ) { + if ($update) { do_action('edit_category', $cat_ID); } else { do_action('create_category', $rval); @@ -275,9 +288,9 @@ function wp_update_category($catarr) { global $wpdb; $cat_ID = (int) $catarr['cat_ID']; - + // First, get all of the original fields - $category = get_category($cat_ID, ARRAY_A); + $category = get_category($cat_ID, ARRAY_A); // Escape data pulled from DB. $category = add_magic_quotes($category); @@ -294,7 +307,7 @@ function wp_delete_category($cat_ID) { $cat_ID = (int) $cat_ID; // Don't delete the default cat. - if ( 1 == $cat_ID ) + if (1 == $cat_ID) return 0; $category = get_category($cat_ID); @@ -320,39 +333,39 @@ function wp_create_category($cat_name) { return wp_insert_category($cat_array); } - function wp_create_categories($categories, $post_id = '') { - $cat_ids = array(); + $cat_ids = array (); foreach ($categories as $category) { - if ( $id = category_exists($category) ) + if ($id = category_exists($category)) $cat_ids[] = $id; - else if ( $id = wp_create_category($category) ) - $cat_ids[] = $id; + else + if ($id = wp_create_category($category)) + $cat_ids[] = $id; } - - if ( $post_id ) + + if ($post_id) wp_set_post_cats('', $post_id, $cat_ids); - + return $cat_ids; } function category_exists($cat_name) { global $wpdb; - if ( !$category_nicename = sanitize_title($cat_name) ) + if (!$category_nicename = sanitize_title($cat_name)) return 0; - + return $wpdb->get_var("SELECT cat_ID FROM $wpdb->categories WHERE category_nicename = '$category_nicename'"); } // Creates a new user from the "Users" form using $_POST information. function add_user() { - return update_user(); + return edit_user(); } -function update_user($user_id = 0) { - - if ( $user_id != 0 ) { +function edit_user($user_id = 0) { + + if ($user_id != 0) { $update = true; $user->ID = $user_id; $userdata = get_userdata($user_id); @@ -361,83 +374,84 @@ function update_user($user_id = 0) { $update = false; $user = ''; } - - if ( isset($_POST['user_login']) ) + + if (isset ($_POST['user_login'])) $user->user_login = wp_specialchars(trim($_POST['user_login'])); $pass1 = $pass2 = ''; - if ( isset($_POST['pass1']) ) + if (isset ($_POST['pass1'])) $pass1 = $_POST['pass1']; - if ( isset($_POST['pass2']) ) + if (isset ($_POST['pass2'])) $pass2 = $_POST['pass2']; - if ( isset($_POST['email']) ) + if (isset ($_POST['email'])) $user->user_email = wp_specialchars(trim($_POST['email'])); - if ( isset($_POST['url']) ) { + if (isset ($_POST['url'])) { $user->user_url = wp_specialchars(trim($_POST['url'])); - $user->user_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $user->user_url) ? $user->user_url : 'http://' . $user->user_url; + $user->user_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $user->user_url) ? $user->user_url : 'http://'.$user->user_url; } - if ( isset($_POST['first_name']) ) + if (isset ($_POST['first_name'])) $user->first_name = wp_specialchars(trim($_POST['first_name'])); - if ( isset($_POST['last_name']) ) + if (isset ($_POST['last_name'])) $user->last_name = wp_specialchars(trim($_POST['last_name'])); - if ( isset($_POST['nickname']) ) + if (isset ($_POST['nickname'])) $user->nickname = wp_specialchars(trim($_POST['nickname'])); - if ( isset($_POST['display_name']) ) + if (isset ($_POST['display_name'])) $user->display_name = wp_specialchars(trim($_POST['display_name'])); - if ( isset($_POST['description']) ) + if (isset ($_POST['description'])) $user->description = wp_specialchars(trim($_POST['description'])); - if ( isset($_POST['jabber']) ) + if (isset ($_POST['jabber'])) $user->jabber = wp_specialchars(trim($_POST['jabber'])); - if ( isset($_POST['aim']) ) + if (isset ($_POST['aim'])) $user->aim = wp_specialchars(trim($_POST['aim'])); - if ( isset($_POST['yim']) ) + if (isset ($_POST['yim'])) $user->yim = wp_specialchars(trim($_POST['yim'])); - $errors = array(); - + $errors = array (); + /* checking that username has been typed */ if ($user->user_login == '') $errors['user_login'] = __('ERROR: Please enter a username.'); /* checking the password has been typed twice */ - do_action('check_passwords', array($user->user_login, &$pass1, &$pass2)); - - if ( !$update ) { - if ( $pass1 == '' || $pass2 == '' ) + do_action('check_passwords', array ($user->user_login, & $pass1, & $pass2)); + + if (!$update) { + if ($pass1 == '' || $pass2 == '') $errors['pass'] = __('ERROR: Please enter your password twice.'); } else { - if ( ( empty($pass1) && !empty($pass2) ) || ( empty($pass2) && !empty($pass1) ) ) + if ((empty ($pass1) && !empty ($pass2)) || (empty ($pass2) && !empty ($pass1))) $errors['pass'] = __("ERROR: you typed your new password only once."); } - + /* checking the password has been typed twice the same */ if ($pass1 != $pass2) $errors['pass'] = __('ERROR: Please type the same password in the two password fields.'); - if ( !empty($pass1) ) + if (!empty ($pass1)) $user->user_pass = $pass1; - - if ( !$update && username_exists( $user_login ) ) + + if (!$update && username_exists($user_login)) $errors['user_login'] = __('ERROR: This username is already registered, please choose another one.'); /* checking e-mail address */ - if (empty($user->user_email)) { + if (empty ($user->user_email)) { $errors['user_email'] = __("ERROR: please type an e-mail address"); - } else if (!is_email($user->user_email)) { - $errors['user_email'] = __("ERROR: the email address isn't correct"); - } + } else + if (!is_email($user->user_email)) { + $errors['user_email'] = __("ERROR: the email address isn't correct"); + } - if ( count($errors) != 0 ) + if (count($errors) != 0) return $errors; - - if ( $update ) { + + if ($update) { $user_id = wp_update_user(get_object_vars($user)); } else { $user_id = wp_insert_user(get_object_vars($user)); wp_new_user_notification($user_id); } - + return $errors; } @@ -445,13 +459,13 @@ function wp_delete_user($id, $reassign = 'novalue') { global $wpdb; $id = (int) $id; - - if($reassign == 'novalue') { + + if ($reassign == 'novalue') { $post_ids = $wpdb->get_col("SELECT ID FROM $wpdb->posts WHERE post_author = $id"); - + if ($post_ids) { $post_ids = implode(',', $post_ids); - + // Delete comments, *backs $wpdb->query("DELETE FROM $wpdb->comments WHERE comment_post_ID IN ($post_ids)"); // Clean cats @@ -461,11 +475,11 @@ function wp_delete_user($id, $reassign = 'novalue') { // Delete posts $wpdb->query("DELETE FROM $wpdb->posts WHERE post_author = $id"); } - + // Clean links $wpdb->query("DELETE FROM $wpdb->links WHERE link_owner = $id"); } else { - $reassign = (int)$reassign; + $reassign = (int) $reassign; $wpdb->query("UPDATE $wpdb->posts SET post_author = {$reassign} WHERE post_author = {$id}"); $wpdb->query("UPDATE $wpdb->links SET link_owner = {$reassign} WHERE link_owner = {$id}"); } @@ -478,16 +492,136 @@ function wp_delete_user($id, $reassign = 'novalue') { return true; } -function post_exists($title, $content = '', $post_date = '') { +function get_link($link_id, $output = OBJECT) { global $wpdb; - if ( !empty($post_date) ) + $link = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = '$link_id'"); + + if ( $output == OBJECT ) { + return $link; + } elseif ( $output == ARRAY_A ) { + return get_object_vars($link); + } elseif ( $output == ARRAY_N ) { + return array_values(get_object_vars($link)); + } else { + return $link; + } +} + +function get_link_to_edit($link_id) { + $link = get_link($link_id); + + $link->link_url = wp_specialchars($link->link_url, 1); + $link->link_name = wp_specialchars($link->link_name, 1); + $link->link_description = wp_specialchars($link->link_description); + $link->link_notes = wp_specialchars($link->link_notes); + $link->link_rss = wp_specialchars($link->link_rss); + + return $link; +} + +function add_link() { + return edit_link(); +} + +function edit_link($link_id = '') { + if (!current_user_can('manage_links')) + die(__("Cheatin' uh ?")); + + $_POST['link_url'] = wp_specialchars($_POST['link_url']); + //$link_url = preg_match('/^(https?|ftps?|mailto|news|gopher):/is', $link_url) ? $link_url : 'http://'.$link_url; + $_POST['link_name'] = wp_specialchars($_POST['link_name']); + $_POST['link_image'] = wp_specialchars($_POST['link_image']); + $_POST['link_rss'] = wp_specialchars($_POST['link_rss']); + $auto_toggle = get_autotoggle($_POST['link_category']); + + // if we are in an auto toggle category and this one is visible then we + // need to make the others invisible before we add this new one. + // FIXME Add category toggle func. + //if (($auto_toggle == 'Y') && ($link_visible == 'Y')) { + // $wpdb->query("UPDATE $wpdb->links set link_visible = 'N' WHERE link_category = $link_category"); + //} + + if ( !empty($link_id) ) { + $_POST['link_id'] = $link_id; + return wp_update_link($_POST); + } else { + return wp_insert_link($_POST); + } +} + +function wp_insert_link($linkdata) { + global $wpdb; + + extract($linkdata); + + $update = false; + if ( !empty($link_id) ) + $update = true; + + if ( empty($link_rating) ) + $link_rating = 0; + + if ( empty($link_target) ) + $link_target = ''; + + if ( empty($link_visible) ) + $link_visible = 'Y'; + + if ( $update ) { + $wpdb->query("UPDATE $wpdb->links SET link_url='$link_url', + link_name='$link_name', link_image='$link_image', + link_target='$link_target', link_category='$link_category', + link_visible='$link_visible', link_description='$link_description', + link_rating='$link_rating', link_rel='$link_rel', + link_notes='$link_notes', link_rss = '$link_rss' + WHERE link_id='$link_id'"); + } else { + $wpdb->query("INSERT INTO $wpdb->links (link_url, link_name, link_image, link_target, link_category, link_description, link_visible, link_owner, link_rating, link_rel, link_notes, link_rss) VALUES('$link_url','$link_name', '$link_image', '$link_target', '$link_category', '$link_description', '$link_visible', '$link_owner', '$link_rating', '$link_rel', '$link_notes', '$link_rss')"); + $link_id = $wpdb->insert_id; + } + + if ( $update ) + do_action('edit_link', $link_id); + else + do_action('add_link', $link_id); + + return $link_id; +} + +function wp_update_link($linkdata) { + global $wpdb; + + $link_id = (int) $linkdata['link_id']; + + $link = get_link($link_id, ARRAY_A); + + // Escape data pulled from DB. + $link = add_magic_quotes($link); + + // Merge old and new fields with new fields overwriting old ones. + $linkdata = array_merge($link, $linkdata); + + return wp_insert_link($linkdata); +} + +function wp_delete_link($link_id) { + global $wpdb; + + return $wpdb->query("DELETE FROM $wpdb->links WHERE link_id = '$link_id'"); +} + +function post_exists($title, $content = '', $post_date = '') { + global $wpdb; + + if (!empty ($post_date)) $post_date = "AND post_date = '$post_date'"; - if ( ! empty($title) ) + if (!empty ($title)) return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_title = '$title' $post_date"); - else if ( ! empty($content) ) - return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_content = '$content' $post_date"); + else + if (!empty ($content)) + return $wpdb->get_var("SELECT ID FROM $wpdb->posts WHERE post_content = '$content' $post_date"); return 0; } @@ -496,57 +630,58 @@ function comment_exists($comment_author, $comment_date) { global $wpdb; return $wpdb->get_var("SELECT comment_post_ID FROM $wpdb->comments - WHERE comment_author = '$comment_author' AND comment_date = '$comment_date'"); + WHERE comment_author = '$comment_author' AND comment_date = '$comment_date'"); } -function url_shorten ($url) { +function url_shorten($url) { $short_url = str_replace('http://', '', stripslashes($url)); $short_url = str_replace('www.', '', $short_url); if ('/' == substr($short_url, -1)) $short_url = substr($short_url, 0, -1); if (strlen($short_url) > 35) - $short_url = substr($short_url, 0, 32).'...'; + $short_url = substr($short_url, 0, 32).'...'; return $short_url; } function selected($selected, $current) { - if ($selected == $current) echo ' selected="selected"'; + if ($selected == $current) + echo ' selected="selected"'; } function checked($checked, $current) { - if ($checked == $current) echo ' checked="checked"'; + if ($checked == $current) + echo ' checked="checked"'; } -function return_categories_list( $parent = 0 ) { +function return_categories_list($parent = 0) { global $wpdb; return $wpdb->get_col("SELECT cat_ID FROM $wpdb->categories WHERE category_parent = $parent ORDER BY category_count DESC"); } function get_nested_categories($default = 0, $parent = 0) { - global $post_ID, $mode, $wpdb; + global $post_ID, $mode, $wpdb; - if ($post_ID) { - $checked_categories = $wpdb->get_col(" - SELECT category_id - FROM $wpdb->categories, $wpdb->post2cat - WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID' - "); + if ($post_ID) { + $checked_categories = $wpdb->get_col(" + SELECT category_id + FROM $wpdb->categories, $wpdb->post2cat + WHERE $wpdb->post2cat.category_id = cat_ID AND $wpdb->post2cat.post_id = '$post_ID' + "); - if(count($checked_categories) == 0) - { - // No selected categories, strange - $checked_categories[] = $default; - } + if (count($checked_categories) == 0) { + // No selected categories, strange + $checked_categories[] = $default; + } - } else { - $checked_categories[] = $default; - } + } else { + $checked_categories[] = $default; + } - $cats = return_categories_list($parent); - $result = array(); + $cats = return_categories_list($parent); + $result = array (); - if ( is_array( $cats ) ) { - foreach($cats as $cat) { + if (is_array($cats)) { + foreach ($cats as $cat) { $result[$cat]['children'] = get_nested_categories($default, $cat); $result[$cat]['cat_ID'] = $cat; $result[$cat]['checked'] = in_array($cat, $checked_categories); @@ -558,28 +693,26 @@ function get_nested_categories($default = 0, $parent = 0) { } function write_nested_categories($categories) { - foreach($categories as $category) { - echo '\n"; + foreach ($categories as $category) { + echo '\n"; - if(isset($category['children'])) { - echo "\n\n"; - write_nested_categories($category['children']); - echo "\n"; - } - } + if (isset ($category['children'])) { + echo "\n\n"; + write_nested_categories($category['children']); + echo "\n"; + } + } } function dropdown_categories($default = 0) { - write_nested_categories(get_nested_categories($default)); -} + write_nested_categories(get_nested_categories($default)); +} // Dandy new recursive multiple category stuff. function cat_rows($parent = 0, $level = 0, $categories = 0) { global $wpdb, $class; - if ( !$categories ) + if (!$categories) $categories = $wpdb->get_results("SELECT * FROM $wpdb->categories ORDER BY cat_name"); if ($categories) { @@ -588,18 +721,18 @@ function cat_rows($parent = 0, $level = 0, $categories = 0) { $category->cat_name = wp_specialchars($category->cat_name); $count = $wpdb->get_var("SELECT COUNT(post_id) FROM $wpdb->post2cat WHERE category_id = $category->cat_ID"); $pad = str_repeat('— ', $level); - if ( current_user_can('manage_categories') ) - $edit = "" . __('Edit') . "
- | - | - | - | - -"; + |
---|---|---|---|
+ | + | + | + |