Making WordPress.org

Ticket #3572: 3572.10.patch

File 3572.10.patch, 58.6 KB (added by keesiemeijer, 7 years ago)

Don't show edit notice if a comment wasn't updated

  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/comments-edit.php

     
     1<?php namespace DevHub;
     2/**
     3 * The Template for editing user contributed notes.
     4 *
     5 * This template is used if the current user can edit a note.
     6 * The global post data is set with the pre_get_posts action.
     7 *
     8 * @package wporg-developer
     9 */
     10
     11get_header();
     12
     13$comment_id    = get_query_var( 'edit_user_note' );
     14$comment       = get_comment( $comment_id );
     15$post          = get_queried_object();
     16$post_id       = get_queried_object_id();
     17$can_user_edit = \DevHub\can_user_edit_note( $comment_id );
     18
     19if ( ! ( $comment && $post && $post_id && $can_user_edit ) ) {
     20        // Bail if the current user can't edit this note, or if
     21        // the comment or global post data is not found.
     22        include get_404_template();
     23        return;
     24}
     25
     26$is_parent   = $comment->comment_parent ?  true : false;
     27$parent      = $is_parent ? get_comment( $comment->comment_parent ) : false;
     28$post_url    = get_permalink( $post_id );
     29$post_title  = single_post_title( '', false );
     30$post_types  = get_parsed_post_types( 'labels' );
     31$type_single = get_post_type_object( $post->post_type )->labels->singular_name;
     32$type_url    = get_post_type_archive_link( $post->post_type );
     33$type_label  = $post_types[ $post->post_type ];
     34$ref_url     = get_site_section_url();
     35$ref_link    = "<a href='{$ref_url}'>Reference</a>";
     36$post_link   = "<a href='{$post_url}'>{$post_title}</a>";
     37$note_link   = "<a href='{$post_url}#comment-{$comment_id}'>note {$comment_id}</a>";
     38$type_link   = "<a href='{$type_url}'>{$type_label}</a>";
     39
     40$parent_link   = '';
     41$parent_author = '';
     42if ( $is_parent && isset( $parent->comment_ID ) ) {
     43        $parent_author = get_note_author_link( $parent );
     44        $parent_label  = sprintf( __('note %d', 'wporg'), $parent->comment_ID );
     45        $parent_link   = "<a href='{$post_url}#comment-{$parent->comment_ID}'>{$parent_label}</a>";
     46}
     47
     48add_filter( 'breadcrumb_trail_items', function($items) use ( $ref_link, $type_link, $post_link, $note_link ) {
     49        $items[] = $ref_link;
     50        $items[] = $type_link;
     51        $items[] = $post_link;
     52        $items[] = $note_link;
     53        $items[] = __('Edit', 'wporg');
     54        return $items;
     55} );
     56?>
     57
     58        <div id="content-area" <?php body_class( 'code-reference' ); ?>>
     59
     60                <?php breadcrumb_trail( array( 'show_title' => false ) ); ?>
     61
     62                <main id="main" class="site-main" role="main">
     63                        <h1><?php printf( __( 'Edit Note %d', 'wporg' ), $comment_id ); ?></h1>
     64
     65                        <p>
     66                                <?php if ( $is_parent ) : ?>
     67                                        <?php
     68                                                /* translators: 1: comment title, 2: comment author name, 3: reference type (function, class, method, hook), 4: post title */
     69                                                printf( __( 'This is a feedback note to %1$s by %2$s for the %3$s %4$s.', 'wporg' ), $parent_link, $parent_author, strtolower( $type_single ), $post_link );
     70                                        ?>
     71                                <?php else : ?>
     72                                        <?php
     73                                                /* translators: 1: reference type (function, class, method, hook), 2: post title */
     74                                                printf( __( 'This is a note for the %1$s %2$s.', 'wporg' ), strtolower( $type_single ), $post_link ); ?>
     75                                <?php endif; ?>
     76
     77                                <?php echo ' ' . __( "You can edit this note as long as it's in moderation.", 'wporg' ); ?>
     78                        </p>
     79                        <?php
     80                                if ( $is_parent ) {
     81                                        echo \DevHub_User_Submitted_Content::wp_editor_feedback( $comment, 'show', true );
     82                                } else {
     83                                        $args = \DevHub_User_Submitted_Content::comment_form_args( $comment, 'edit');
     84                                        comment_form( $args );
     85                                }
     86                        ?>
     87
     88                </main><!-- #main -->
     89        </div><!-- #primary -->
     90<?php get_footer(); ?>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/comments.php

     
    4545                                } else {
    4646                                        $ordered_comments = wporg_developer_get_ordered_notes();
    4747                                        if ( $ordered_comments ) {
    48                                                 $feedback_editor = array_filter(  wp_list_pluck( $ordered_comments, 'show_editor') );
    4948                                                wporg_developer_list_notes( $ordered_comments, array( 'avatar_size' => 32 ) );
    5049                                        }
    5150                                }
     
    6463
    6564        <?php if ( \DevHub\is_parsed_post_type() && DevHub\can_user_post_note( true, get_the_ID() ) ) : ?>
    6665
    67                 <?php $add_note_style = empty( $feedback_editor ) ? 'display:none;' : ''; ?>
    68                 <p id="add-user-note" style="<?php echo $add_note_style; ?>"><a href="<?php echo user_trailingslashit( get_permalink() ) . '#respond'; ?>"><?php _e( 'Have a note or feedback to contribute?', 'wporg' ); ?></a></p>
     66                <?php if ( is_user_logged_in() ) : ?>
     67                        <?php
     68                                /* Hide the add user note link by default.
     69                                 * It will be displayed by Javascript.
     70                                 * If Javascript is disabled the comment form is displayed and the link stays hidden.
     71                                 */
     72                        ?>
     73                        <p id="add-user-note" style="display: none;"><a href="<?php echo user_trailingslashit( get_permalink() ) . '#respond'; ?>"><?php _e( 'Have a note or feedback to contribute?', 'wporg' ); ?></a></p>
     74                <?php endif; ?>
    6975
    7076                <?php
    71                 $args = array(
    72                         'logged_in_as'        => '<p class="logged-in-as">'
    73                                 . sprintf(
    74                                         /* translators: 1: user profile link, 2: accessibility text, 3: user name, 4: logout URL */
    75                                         __( '<a href="%1$s" aria-label="%2$s">Logged in as %3$s</a>. <a href="%4$s">Log out?</a>' ),
    76                                         'https://profiles.wordpress.org/' . esc_attr( wp_get_current_user()->user_nicename ),
    77                                         /* translators: %s: user name */
    78                                         esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity ) ),
    79                                         $user_identity,
    80                                         wp_logout_url( apply_filters( 'the_permalink', get_permalink() ) )
    81                                 )
    82                                 . '</p><p><ul><li>'
    83                                 . __( 'Notes should supplement code reference entries, for example examples, tips, explanations, use-cases, and best practices.', 'wporg' )
    84                                 . '</li><li>'
    85                                 . __( 'Feedback can be to report errors or omissions with the documentation on this page. Such feedback will not be publicly posted.', 'wporg' )
    86                                 . '</li><li>'
    87                                 /* translators: 1: php button, 2: js button, 3: inline code button */
    88                                 . sprintf(
    89                                         __( 'You can enter text and code. Use the %1$s, %2$s, or %3$s buttons to wrap code snippets.', 'wporg' ),
    90                                         '<span class="text-button">php</span>',
    91                                         '<span class="text-button">js</span>',
    92                                         '<span class="text-button">' . __( 'inline code', 'wporg' ) . '</span>'
    93                                 )
    94                                 . '</li></ul></p>',
    95                         'comment_notes_after' => '<p>'
    96                                 . __( 'Submission Notes:', 'wporg' )
    97                                 . '<ul><li>'
    98                                 . __( 'This form is not for support requests, discussions, spam, bug reports, complaints, or self-promotion. Entries of this nature will be deleted.', 'wporg' )
    99                                 . '</li><li>'
    100                                 . __( 'In the editing area the Tab key enters a tab character. To move below this area by pressing Tab, press the Esc key followed by the Tab key. In some cases the Esc key will need to be pressed twice before the Tab key will allow you to continue.', 'wporg' )
    101                                 . '</li><li class="user-notes-are-gpl">'
    102                                 . sprintf(
    103                                         /* translators: 1: GFDL link */
    104                                         __( '<strong>NOTE:</strong> All contributions are licensed under %s and are moderated before appearing on the site.', 'wporg' ),
    105                                         '<a href="https://gnu.org/licenses/fdl.html">GFDL</a>'
    106                                 )
    107                                 . '</li></ul></p>',
    108                         'label_submit'        => __( 'Add Note or Feedback', 'wporg' ),
    109                         'cancel_reply_link'   => '',
    110                         'must_log_in'         => '<p>' . sprintf(
    111                                 __( 'You must <a href="%s">log in</a> before being able to contribute a note or feedback.', 'wporg' ),
    112                                 'https://login.wordpress.org/?redirect_to=' . urlencode( get_comments_link() )
    113                         ) . '</p>',
    114                         'title_reply'         => '', //'Add Example'
    115                         'title_reply_to'      => '',
    116                 );
    117 
    118                 if ( class_exists( 'DevHub_Note_Preview' ) ) {
    119                         $args['comment_notes_after'] = DevHub_Note_Preview::comment_preview() . $args['comment_notes_after'];
    120                         $args['class_form']          = 'comment-form tab-container';
    121                 }
    122 
    123                 if ( class_exists( 'DevHub_User_Submitted_Content' ) ) {
    124                         $args['comment_field'] = DevHub_User_Submitted_Content::wp_editor_comments();
    125                 }
    126 
    127                 // Insert comment form if feedback form is not already used.
    128                 if ( empty( $feedback_editor ) ) {
     77                if ( class_exists( 'DevHub_User_Submitted_Content' ) )  {
     78                        $args = \DevHub_User_Submitted_Content::comment_form_args();
    12979                        comment_form( $args );
    13080                }
    13181                ?>
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/functions.php

     
    5656require __DIR__ . '/inc/user-content-voting.php';
    5757
    5858/**
     59 * Editing for user-submitted content.
     60 */
     61require __DIR__ . '/inc/user-content-edit.php';
     62
     63/**
    5964 * CLI commands custom post type and importer.
    6065 */
    6166require __DIR__ . '/inc/cli.php';
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/template-tags.php

     
    113113
    114114                        // Check if the current page is a reply to a note.
    115115                        $reply_id = 0;
    116                         if ( isset( $_GET['replytocom'] ) && $_GET['replytocom'] ) {
     116                        if ( isset( $_GET['replytocom'] ) && $_GET['replytocom'] ) {           
     117                                /* Javascript uses preventDefault() when clicking links with '?replytocom={comment_ID}'
     118                                 * We assume Javascript is disabled when visiting a page with this query var.
     119                                 * There are no consequences if Javascript is enabled.
     120                                 */
    117121                                $reply_id = absint( $_GET['replytocom'] );
    118122                        }
    119123
     
    142146                                        $comments[ $key ]->child_notes = array_reverse( $children[ $comment->comment_ID ] );
    143147                                }
    144148
    145                                 if ( ! $show_editor && ( $reply_id && ( $reply_id === (int) $comment->comment_ID ) ) ) {
    146                                         // Show the editor when replying to this parent comment
     149                                if ( ! $show_editor && ( $reply_id && ( $reply_id === (int) $comment->comment_ID ) ) ) {
     150                                        /* The query var 'replytocom' is used and the value is the same as the current comment ID.
     151                                         * We show the editor for the current comment because we assume Javascript is disabled.
     152                                         * If Javascript is not disabled the editor is hidden (as normal) by the class 'hide-if-js'.
     153                                         */
    147154                                        $comments[ $key ]->show_editor = true;
    148155                                        $show_editor = true;
    149156                                }
     
    164171                 * @param array   $args Comment display arguments.
    165172                 */
    166173                function wporg_developer_list_notes( $comments, $args ) {
     174                        $is_user_content    = class_exists( 'DevHub_User_Submitted_Content' );
    167175                        $is_user_logged_in  = is_user_logged_in();
    168176                        $can_user_post_note = DevHub\can_user_post_note( true, get_the_ID() );
    169                         $user_content       = class_exists( 'DevHub_User_Submitted_Content' );
    170                         $display_editor     = $is_user_logged_in && $can_user_post_note && $user_content;
     177                        $is_user_verified   = $is_user_logged_in && $can_user_post_note;
     178               
     179                        $args['updated_note'] = 0;
     180                        if ( isset( $_GET['updated-note'] ) && $_GET['updated-note'] ) {
     181                                $args['updated_note'] = absint( $_GET['updated-note'] );
     182                        }
    171183
    172184                        foreach ( $comments as $comment ) {
    173185
     
    176188                                // Display parent comment.
    177189                                wporg_developer_user_note( $comment, $args, 1 );
    178190
    179                                 // Show or hide feedback notes.
    180                                 $class = $comment->show_editor ? '' : ' hide-if-js';
    181                                 echo "<section id='feedback-{$comment_id}' class='feedback{$class}'>\n";
     191                                /* Use hide-if-js class to hide the feedback section if Javascript is enabled.
     192                                 * Users can display the section with Javascript.
     193                                 */
     194                                echo "<section id='feedback-{$comment_id}' class='feedback hide-if-js'>\n";
    182195
    183196                                // Display child comments.
    184197                                if ( ! empty( $comment->child_notes ) ) {
     
    192205                                }
    193206
    194207                                // Add a feedback form for logged in users.
    195                                 if ( $display_editor ) {
    196                                         // Show or hide the editor depending if we're replying to a note.
     208                                if ( $is_user_content && $is_user_verified ) {
     209                                        /* Show the feedback editor if we're replying to a note and Javascript is disabled.
     210                                         * If Javascript is enabled the editor is hidden (as normal) by the 'hide-if-js' class.
     211                                         */
    197212                                        $display = $comment->show_editor ? 'show' : 'hide';
    198213                                        echo DevHub_User_Submitted_Content::wp_editor_feedback( $comment, $display );
    199214                                }
     
    202217                                // Feedback links to log in, add feedback or show feedback.
    203218                                echo "<footer class='feedback-links' >\n";
    204219                                if ( $can_user_post_note ) {
    205                                         echo "EEE";
    206220                                        $feedback_link = trailingslashit( get_permalink() ) . "?replytocom={$comment_id}#feedback-editor-{$comment_id}";
    207221                                        $display       = '';
    208                                         $aria          = '';
    209222                                        if ( ! $is_user_logged_in ) {
    210223                                                $class         = 'login';
    211224                                                $feedback_text = __( 'Log in to add feedback', 'wporg' );
     
    213226                                        } else {
    214227                                                $class         ='add';
    215228                                                $feedback_text = __( 'Add feedback to this note', 'wporg' );
    216                                                 $aria          = '';//" aria-expanded='false' aria_controls='feedback-editor-{$comment_id}' aria-label='" . esc_attr( $feedback_text ) . "'";
    217229
    218                                                 // Hide 'add feedback' link if editor is displayed.
    219                                                 $display = $display_editor && $comment->show_editor ? ' style="display:none"' : '';
     230                                                /* Hide the feedback link if the current user is logged in and the
     231                                                 * feedback editor is displayed (because Javascript is disabled).
     232                                                 * If Javascript is enabled the editor is hidden and the feedback link is displayed (as normal).
     233                                                 */
     234                                                $display = $is_user_verified && $comment->show_editor ? ' style="display:none"' : '';
    220235                                        }
    221                                         echo '<a class="feedback-' . $class . '" href="' . esc_url( $feedback_link ) . '"' . $display . $aria .' rel="nofollow">' . $feedback_text . '</a>';
     236                                        echo '<a role="button" class="feedback-' . $class . '" href="' . esc_url( $feedback_link ) . '"' . $display . ' rel="nofollow">' . $feedback_text . '</a>';
    222237                                }
    223238
    224239                                // close parent list item
     
    240255                        $GLOBALS['comment']       = $comment;
    241256                        $GLOBALS['comment_depth'] = $depth;
    242257
     258                        static $note_number = 0;
     259
    243260                        $approved       = ( 0 < (int) $comment->comment_approved ) ? true : false;
    244261                        $is_parent      = ( 0 === (int) $comment->comment_parent ) ? true : false;
    245262                        $is_voting      = class_exists( 'DevHub_User_Contributed_Notes_Voting' );
    246263                        $count          = $is_voting ? (int)  DevHub_User_Contributed_Notes_Voting::count_votes( $comment->comment_ID, 'difference' ) : 0;
    247264                        $curr_user_note = $is_voting ? (bool) DevHub_User_Contributed_Notes_Voting::is_current_user_note( $comment->comment_ID ) : false;
     265                        $edited_note_id = isset( $args['updated_note'] ) ? $args['updated_note'] : 0;
     266                        $is_edited_note = ( $edited_note_id === (int) $comment->comment_ID );
     267                        $note_author    = \DevHub\get_note_author_link( $comment );
     268                        $can_edit_note  = \DevHub\can_user_edit_note( $comment->comment_ID );
     269                        $has_edit_cap   = current_user_can( 'edit_comment', $comment->comment_ID );
    248270
    249                         // Classes
     271                        // CSS Classes
    250272                        $comment_class = array();
    251273
    252274                        if ( -1 > $count ) {
     
    261283                                $comment_class[] = 'user-note-moderated';
    262284                        }
    263285
    264                         // This would all be moot if core passed the $comment context for 'get_comment_author_link' filter.
    265                         if ( $comment->user_id ) {
    266                                 $commenter = get_user_by( 'id', $comment->user_id );
    267                                 $url = 'https://profiles.wordpress.org/' . sanitize_key( $commenter->user_nicename ) . '/';
    268                                 $author = get_the_author_meta( 'display_name', $comment->user_id );
    269                         } else {
    270                                 $url = $comment->comment_author_url;
    271                                 $author = $comment->comment_author;
    272                         }
    273 
    274                         $comment_author_link = $author;
    275                         if ( $url ) {
    276                                 $comment_author_link = "<a href='$url' rel='external nofollow' class='url'>$author</a>";
    277                         }
    278 
    279286                        $date = sprintf( _x( '%1$s ago', '%1$s = human-readable time difference', 'wporg' ),
    280287                                human_time_diff( get_comment_time( 'U' ),
    281288                                current_time( 'timestamp' ) )
     
    285292                        <article id="div-comment-<?php comment_ID(); ?>" class="comment-body">
    286293
    287294                        <?php if ( $is_parent ) : ?>
    288                                 <a href="#comment-content-<?php echo $comment->comment_ID; ?>" class="screen-reader-text"><?php _e( 'Skip to note content', 'wporg' ); ?></a>
     295                                <a href="#comment-content-<?php echo $comment->comment_ID; ?>" class="screen-reader-text"><?php printf( __( 'Skip to note %d content', 'wporg' ), ++ $note_number ); ?></a>
    289296                                <header class="comment-meta">
    290297
    291298                                <?php
     
    300307                                                        echo get_avatar( $comment, $args['avatar_size'] );
    301308                                                }
    302309
    303                                                 printf( __( 'Contributed by %s', 'wporg' ), sprintf( '<cite class="fn">%s</cite>', $comment_author_link ) );
     310                                                printf( __( 'Contributed by %s', 'wporg' ), sprintf( '<cite class="fn">%s</cite>', $note_author ) );
    304311                                                ?>
    305312
    306313                                                </span>
    307314                                                &mdash;
    308                                                 <a href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>">
     315                                                <a class="comment-date" href="<?php echo esc_url( get_comment_link( $comment->comment_ID ) ); ?>">
    309316                                                        <time datetime="<?php comment_time( 'c' ); ?>">
    310317                                                        <?php echo $date; ?>
    311318                                                        </time>
    312319                                                </a>
     320
    313321                                                <?php edit_comment_link( __( 'Edit', 'wporg' ), '<span class="edit-link">&mdash; ', '</span>' ); ?>
     322                                                <?php if ( ! $has_edit_cap && $can_edit_note ) : ?>
     323                                                        &mdash; <span class="comment-author-edit-link">
     324                                                                <!-- Front end edit comment link -->
     325                                                                <a class="comment-edit-link" href="<?php echo site_url( "/reference/comment/edit/{$comment->comment_ID}" ); ?>"><?php _e( 'Edit', 'wporg' ); ?></a>
     326                                                        </span>
     327                                                <?php endif; ?>
     328                                                <?php if ( $can_edit_note && $is_edited_note ) : ?>
     329                                                        &mdash; <span class="comment-edited">
     330                                                        <?php _e( 'edited', 'wporg' ); ?>
     331                                                        </span>
     332                                                <?php endif; ?>
    314333                                                <?php if ( ! $approved ) : ?>
    315334                                                        &mdash; <span class="comment-awaiting-moderation"><?php _e( 'awaiting moderation', 'wporg' ); ?></span>
    316335                                                <?php endif; ?>
     
    325344                                        comment_text();
    326345                                } else {
    327346                                        $text = get_comment_text()  . ' &mdash; ';
    328                                         $text .= sprintf( __( 'By %s', 'wporg' ), sprintf( '<cite class="fn">%s</cite>', $comment_author_link ) ) . ' &mdash; ';
    329                                         $text .= ' <a href="'. esc_url( get_comment_link( $comment->comment_ID ) ) . '">';
     347                                        $text .= sprintf( __( 'By %s', 'wporg' ), sprintf( '<cite class="fn">%s</cite>', $note_author ) ) . ' &mdash; ';
     348                                        $text .= ' <a class="comment-date" href="'. esc_url( get_comment_link( $comment->comment_ID ) ) . '">';
    330349                                        $text .= '<time datetime="' . get_comment_time( 'c' ) . '">' . $date . '</time></a>';
    331350
    332                                         if ( current_user_can( 'edit_comment', $comment->comment_ID ) ) {
     351                                        if ( $has_edit_cap ) {
     352                                                // WP admin edit comment link.
    333353                                                $text .= ' &mdash; <a class="comment-edit-link" href="' . get_edit_comment_link( $comment->comment_ID ) .'">';
    334354                                                $text .= __( 'Edit', 'wporg' ) . '</a>';
     355                                        } elseif ( $can_edit_note ) {
     356                                                // Front end edit comment link.
     357                                                $text .= ' &mdash; <a class="comment-edit-link" href="' . site_url( "/reference/comment/edit/{$comment->comment_ID}" ) . '">';
     358                                                $text .= __( 'Edit', 'wporg' ) . '</a>';
    335359                                        }
    336360
     361                                        if ( $can_edit_note && $is_edited_note ) {
     362                                                $text .= ' &mdash; <span class="comment-edited">' . __( 'edited', 'wporg' ) . '</span>';
     363                                        }
     364
    337365                                        if ( ! $approved ) {
    338366                                                $text .= ' &mdash; <span class="comment-awaiting-moderation">' . __( 'awaiting moderation', 'wporg' ) . '</span>';
    339367                                        }
     
    13971425        }
    13981426
    13991427        /**
     1428         * Indicates if the current user can edit a user contibuted note.
     1429         *
     1430         * A user can only edit their own notes if it's in moderation and
     1431         * if it's a note for a parsed post type.
     1432         *     
     1433         * Users with the 'edit_comment' capability can edit
     1434         * all notes from a parsed post type (regardless if it's in moderation).
     1435         *
     1436         * @param integer $note_id Note ID.
     1437         * @return bool True if the current user can edit notes.
     1438         */
     1439        function can_user_edit_note( $note_id = 0 ) {
     1440                $user = get_current_user_id();
     1441                $note = get_comment( $note_id );
     1442                if ( ! $user || ! $note ) {
     1443                        return false;
     1444                }
     1445
     1446                $post_id        = isset( $note->comment_post_ID ) ? (int) $note->comment_post_ID : 0;
     1447                $is_note_author = isset( $note->user_id ) && ( (int) $note->user_id === $user );
     1448                $is_approved    = isset( $note->comment_approved ) && ( 0 < (int) $note->comment_approved );
     1449                $can_edit_notes = isset( $note->comment_ID ) && current_user_can( 'edit_comment', $note->comment_ID );
     1450                $is_parsed_type = is_parsed_post_type( get_post_type( $post_id ) );
     1451
     1452                if ( $is_parsed_type && ( $can_edit_notes || ( $is_note_author && ! $is_approved ) ) ) {
     1453                        return true;
     1454                }
     1455
     1456                return false;
     1457        }
     1458
     1459        /**
     1460         * Get the note author link to the profiles.wordpress.org author's URL.
     1461         *
     1462         * @param WP_Comment|int $comment Comment object or comment ID.
     1463         * @return string The HTML link to the profiles.wordpress.org author's URL.
     1464         */
     1465        function get_note_author_link( $comment ) {
     1466                return get_note_author( $comment, true );
     1467        }
     1468
     1469        /**
     1470         * Get the note author nicename.
     1471         *
     1472         * @param WP_Comment|int $comment Comment object or comment ID.
     1473         * @param bool           $link. Whether to return a link to the author's profiles. Default false.
     1474         * @return string The comment author name or HTML link.
     1475         */
     1476        function get_note_author( $comment, $link = false ) {
     1477                $comment   = get_comment( $comment );
     1478                $user_id   = isset( $comment->user_id ) ? $comment->user_id : 0;
     1479                $commenter = get_user_by( 'id', $comment->user_id );
     1480                $author    = '';
     1481
     1482                if ( $user_id && isset( $commenter->user_nicename ) ) {
     1483                        $url    = 'https://profiles.wordpress.org/' . sanitize_key( $commenter->user_nicename ) . '/';
     1484                        $author = get_the_author_meta( 'display_name', $comment->user_id );
     1485                } else {
     1486                        $url    = isset( $comment->comment_author_url ) ?  $comment->comment_author_url : '';
     1487                        $author = isset( $comment->comment_author ) ?  $comment->comment_author : '';
     1488                }
     1489
     1490                if ( $link && ( $url && $author ) ) {
     1491                        $author = "<a href='$url' rel='external nofollow' class='url'>$author</a>";
     1492                }
     1493
     1494                return $author;
     1495        }
     1496
     1497        /**
    14001498         * Gets the summary.
    14011499         *
    14021500         * The summary (aka short description) is stored in the 'post_excerpt' field.
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/user-content-edit.php

     
     1<?php
     2/**
     3 * Code Reference edit user submitted content (comments, notes, etc).
     4 *
     5 * Allows users to edit top level and child comments from parsed post types.
     6 *
     7 * @package wporg-developer
     8 */
     9
     10/**
     11 * Class to handle editing user submitted content.
     12 */
     13class DevHub_User_Content_Edit {
     14
     15        /**
     16         * Initializer
     17         */
     18        public static function init() {
     19                // Priority 20 is after this theme and the WP Parser register post types.
     20                add_action( 'init', array( __CLASS__, 'do_init' ), 20 );
     21        }
     22
     23        /**
     24         * Handles adding hooks to enable editing comments.
     25         * Adds rewrite rules for editing comments in the front end.
     26         */
     27        public static function do_init() {
     28                // Add the edit user note rewrite rule
     29                add_rewrite_rule( 'reference/comment/edit/([0-9]{1,})/?$', 'index.php?edit_user_note=$matches[1]', 'top' );
     30
     31                // Update comment for edit comment request
     32                self::update_comment();
     33
     34                // Add edit_user_note query var for editing.
     35                add_filter( 'query_vars',                      array( __CLASS__, 'comment_query_var' ) );
     36
     37                // Redirect to home page if the edit request is invalid.
     38                add_action( 'template_redirect',               array( __CLASS__, 'redirect_invalid_edit_request' ) );
     39
     40                // Include the comment edit template.
     41                add_filter( 'template_include',                array( __CLASS__, 'template_include' ) );
     42
     43                // Set the post_type and post id for use in the comment edit template.
     44                add_action( 'pre_get_posts',                   array( __CLASS__, 'pre_get_posts' ) );
     45        }
     46
     47        /**
     48         * Add the edit_user_note query var to the public query vars.
     49         *
     50         * @param array $query_vars Array with public query vars.
     51         * @return array Public query vars.
     52         */
     53        public static function comment_query_var( $query_vars ) {
     54                $query_vars[] = 'edit_user_note';
     55                return $query_vars;
     56        }
     57
     58        /**
     59         * Update a comment after editing.
     60         */
     61        public static function update_comment() {
     62
     63                if ( is_admin() || ( 'POST' !== $_SERVER['REQUEST_METHOD'] ) ) {
     64                        return;
     65                }
     66
     67                $comment_data = wp_unslash( $_POST );
     68
     69                $defaults = array(
     70                        'update_user_note',
     71                        '_wpnonce',
     72                        'comment_ID',
     73                        'comment',
     74                        'comment_parent',
     75                        'comment_post_ID'
     76                );
     77
     78                foreach ( $defaults as $value ) {
     79                        if ( ! isset( $comment_data[ $value ] ) ) {
     80                                // Return if any of the $_POST keys are missing.
     81                                return;
     82                        }
     83                }
     84
     85                $comment = trim( (string) $comment_data['comment'] );
     86                if ( ! $comment ) {
     87                        // Bail and provide a way back to the edit form if a comment is empty.
     88                        $msg  = __( '<strong>ERROR</strong>: please type a comment.', 'wporg' );
     89                        $args = array( 'response' => 200, 'back_link' => true );
     90                        wp_die( '<p>' . $msg . '</p>', __( 'Comment Submission Failure', 'wporg' ), $args );
     91                }
     92
     93                $updated       = 0;
     94                $post_id       = absint( $comment_data['comment_post_ID'] );
     95                $comment_id    = absint( $comment_data['comment_ID'] );
     96                $can_user_edit = DevHub\can_user_edit_note( $comment_id );
     97                $action        = 'update_user_note_' . $comment_id;
     98                $nonce         = wp_verify_nonce( $comment_data['_wpnonce'], $action );
     99
     100                if ( $nonce && $can_user_edit ) {
     101                        $comment_data['comment_content'] = $comment;
     102                        $updated = wp_update_comment( $comment_data );
     103                }
     104
     105                $location = get_permalink( $post_id );
     106                if ( $location ) {
     107                        $query = $updated ? '?updated-note=' . $comment_id : '';
     108                        $query .= '#comment-' . $comment_id;
     109                        wp_safe_redirect( $location . $query );
     110                        exit;
     111                }
     112        }
     113
     114        /**
     115         * Redirects to the home page if the edit request is invalid for the current user.
     116         *
     117         * Redirects if the comment doesn't exist.
     118         * Redirects if the comment is not for a parsed post type.
     119         * Redirects if the current user is not the comment author.
     120         * Redirects if a comment is already approved.
     121         *
     122         * Doesn't redirect for users with the edit_comment capability.
     123         */
     124        public static function redirect_invalid_edit_request() {
     125                $comment_id = absint( get_query_var( 'edit_user_note' ) );
     126                if ( ! $comment_id ) {
     127                        // Not a query for editing a note.
     128                        return;
     129                }
     130
     131                if ( ! DevHub\can_user_edit_note( $comment_id ) ) {
     132                        wp_redirect( home_url( '/reference' ) );
     133                        exit();
     134                }
     135        }
     136
     137        /**
     138         * Use the 'comments-edit.php' template for editing comments.
     139         *
     140         * The current user has already been verified in the template_redirect action.
     141         *
     142         * @param string $template Template to include.
     143         * @return string Template to include.
     144         */
     145        public static function template_include( $template ) {
     146                $comment_id = absint( get_query_var( 'edit_user_note' ) );
     147                if ( ! $comment_id ) {
     148                        // Not a query for editing a note.
     149                        return $template;
     150                }
     151
     152                $comment_template = get_query_template( "comments-edit" );
     153                if ( $comment_template ) {
     154                        $template = $comment_template;
     155                }
     156                return $template;
     157        }
     158
     159        /**
     160         * Sets the post and post type for an edit request.
     161         *
     162         * Trows a 404 if the current user can't edit the requested note.
     163         *
     164         * @param WP_Query $query The WP_Query instance (passed by reference)
     165         */
     166        public static function pre_get_posts( $query ) {
     167                $comment_id = absint( get_query_var( 'edit_user_note' ) );
     168
     169                if ( is_admin() || ! ( $query->is_main_query() && $comment_id ) ) {
     170                        // Not a query for editing a note.
     171                        return;
     172                }
     173
     174                if ( DevHub\can_user_edit_note( $comment_id ) ) {
     175                        $comment = get_comment( $comment_id );
     176                        if ( isset( $comment->comment_post_ID ) ) {
     177                                $query->is_singular = true;
     178                                $query->is_single = true;
     179                                $query->set( 'post_type', get_post_type( $comment->comment_post_ID ) );
     180                                $query->set( 'p', $comment->comment_post_ID );
     181
     182                                return;
     183                        }
     184                }
     185
     186                // Set 404 if a user can't edit a note.
     187                $query->set_404();
     188        }
     189
     190} // DevHub_User_Content_Edit
     191
     192DevHub_User_Content_Edit::init();
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/inc/user-content.php

     
    5050                remove_filter( 'comment_text',                 'capital_P_dangit',   31 );
    5151
    5252                // Enable shortcodes for comments
    53                 add_filter( 'comment_text',                    'do_shortcode');
     53                add_filter( 'comment_text',                    'do_shortcode' );
    5454
    5555                // Customize allowed tags
    5656                add_filter( 'wp_kses_allowed_html',            array( __CLASS__, 'wp_kses_allowed_html' ), 10, 2 );
     
    6767                // Allowed HTML for an edited child comment (There is no decent hook to filter child comments only)
    6868                add_action( 'edit_comment',                    array( __CLASS__, 'comment_edit_allowed_html' ) );
    6969
     70                // Adds hidden fields to a comment form for editing
     71                add_filter( 'comment_form_submit_field',       array( __CLASS__, 'add_hidden_fields' ), 10, 2 );
    7072        }
    7173
    7274        /**
     
    148150                );
    149151
    150152                $allowed_protocols = array( 'http', 'https' );
     153                $comment_content   = wp_kses( $comment_content, $allowed_html, $allowed_protocols );
    151154
    152                 $comment_content = wp_kses( $comment_content, $allowed_html, $allowed_protocols );
    153                 $commentdata['comment_content'] = preg_replace( '/\r?\n|\r/', '', $comment_content );
     155                // Replace newlines with a space.
     156                $commentdata['comment_content'] = preg_replace( '/\r?\n|\r/', ' ', $comment_content );
    154157
    155158                return $commentdata;
    156159        }
     
    167170                        wp_enqueue_script( 'wporg-developer-user-notes', get_template_directory_uri() . '/js/user-notes.js', array( 'jquery', 'quicktags' ), '20180323', true );
    168171                        wp_enqueue_script( 'wporg-developer-user-notes-feedback', get_template_directory_uri() . '/js/user-notes-feedback.js', array( 'jquery', 'quicktags' ), '20180323', true );
    169172                        wp_localize_script( 'wporg-developer-user-notes-feedback', 'wporg_note_feedback', array(
    170                                 'show' => __( 'Show Feedback', 'wporg' ),
    171                                 'hide' => __( 'Hide Feedback', 'wporg' ),
     173                                'show'             => __( 'Show Feedback', 'wporg' ),
     174                                'hide'             => __( 'Hide Feedback', 'wporg' ),
    172175                        ) );
    173176                }
    174177        }
     
    176179        /**
    177180         * Sets the default language for SyntaxHighlighter shortcode.
    178181         *
    179          * @param  array $atts Shortcode attributes.
     182         * @param array $atts Shortcode attributes.
    180183         * @return array
    181184         */
    182185        public static function syntaxhighlighter_shortcodeatts( $atts ) {
     
    187190        /**
    188191         * Subverts capital_P_dangit for SyntaxHighlighter shortcode.
    189192         *
    190          * @param  string $code
     193         * @param string $code
    191194         * @return string
    192195         */
    193196        public static function syntaxhighlighter_precode( $code ) {
     
    195198        }
    196199
    197200        /**
     201         * Add hidden fields to the comment form if the context is 'edit'
     202         *
     203         * @param string $submit_field HTML string with the submit button fields.
     204         * @param array  $args         Arguments for the comment form.
     205         * @return HTML string with the submit button fields.
     206         */
     207        public static function add_hidden_fields( $submit_field, $args ) {
     208                $context = isset( $args['context'] ) ? $args['context'] : '';
     209                $comment = isset( $args['comment_edit'] ) ? $args['comment_edit'] : false;
     210                if ( ! ( $comment && ( 'edit' === $context ) ) ) {
     211                        return $submit_field;
     212                }
     213
     214                $comment_id = isset( $comment->comment_ID ) ? $comment->comment_ID : 0;
     215
     216                return $submit_field . self::get_edit_fields( $comment_id, $instance = 0 );
     217        }
     218
     219        /**
     220         * Get the comment form arguments by context.
     221         *
     222         * @param WP_Comment|false $comment Comment object or false. Default false.
     223         * @param string           $context Context of arguments. Accepts 'edit' or empty string.
     224         * @return array Array with comment form arguments.
     225         */
     226        public static function comment_form_args( $comment = false, $context = '' ) {
     227                $label = _x( 'Add Note or Feedback', 'noun', 'wporg' );
     228                if ( 'edit' === $context ) {
     229                        $label = _x( 'Edit Note', 'noun', 'wporg' );
     230                }
     231
     232                $user_identity = wp_get_current_user();
     233
     234                $args = array(
     235                        'logged_in_as'        => '<p class="logged-in-as">'
     236                        . sprintf(
     237                                /* translators: 1: user profile link, 2: accessibility text, 3: user name, 4: logout URL */
     238                                __( '<a href="%1$s" aria-label="%2$s">Logged in as %3$s</a>. <a href="%4$s">Log out?</a>' ),
     239                                'https://profiles.wordpress.org/' . esc_attr( $user_identity->user_nicename ),
     240                                /* translators: %s: user name */
     241                                esc_attr( sprintf( __( 'Logged in as %s. Edit your profile.' ), $user_identity->display_name ) ),
     242                                $user_identity->display_name,
     243                                wp_logout_url( apply_filters( 'the_permalink', get_permalink() ) )
     244                        )
     245                        . '</p><p><ul><li>'
     246                        . __( 'Notes should supplement code reference entries, for example examples, tips, explanations, use-cases, and best practices.', 'wporg' )
     247                        . '</li><li>'
     248                        . __( 'Feedback can be to report errors or omissions with the documentation on this page. Such feedback will not be publicly posted.', 'wporg' )
     249                        . '</li><li>'
     250                        /* translators: 1: php button, 2: js button, 3: inline code button */
     251                        . sprintf(
     252                                __( 'You can enter text and code. Use the %1$s, %2$s, or %3$s buttons to wrap code snippets.', 'wporg' ),
     253                                '<span class="text-button">php</span>',
     254                                '<span class="text-button">js</span>',
     255                                '<span class="text-button">' . __( 'inline code', 'wporg' ) . '</span>'
     256                        )
     257                        . '</li></ul></p>',
     258                        'comment_notes_after' => '<p>' . __( 'Submission Notes:', 'wporg' ) . '</p>' . self::get_editor_rules(),
     259                        'label_submit'        => $label,
     260                        'cancel_reply_link'   => '',
     261                        'must_log_in'         => '<p>' . sprintf(
     262                                __( 'You must <a href="%s">log in</a> before being able to contribute a note or feedback.', 'wporg' ),
     263                                'https://login.wordpress.org/?redirect_to=' . urlencode( get_comments_link() )
     264                        ) . '</p>',
     265                        'title_reply'         => '', //'Add Example'
     266                        'title_reply_to'      => '',
     267                );
     268
     269                if ( class_exists( 'DevHub_Note_Preview' ) ) {
     270                        $args['comment_notes_after'] = DevHub_Note_Preview::comment_preview() . $args['comment_notes_after'];
     271                        $args['class_form']          = "comment-form tab-container";
     272                }
     273
     274                $args['comment_field'] = self::wp_editor_comments( $label, $comment );
     275
     276                // Args for adding hidden links after the comment form submit field.
     277                $args['context']      = $context;
     278                $args['comment_edit'] = $comment;
     279
     280                if ( $comment && ( 'edit' === $context ) ) {
     281                        $comment_id = isset( $comment->comment_ID ) ? $comment->comment_ID : 0;
     282                        $post_id    = isset( $comment->comment_post_ID ) ? $comment->comment_post_ID : 0;
     283
     284                        $args['action'] = get_permalink( $post_id ) . '#comment-' . $comment_id;
     285                }
     286
     287                return $args;
     288        }
     289
     290        /**
    198291         * Capture an {@see wp_editor()} instance as the 'User Contributed Notes' comment form.
    199292         *
    200293         * Uses output buffering to capture the editor instance for use with the {@see comments_form()}.
    201294         *
     295         * @param string           $label   Label used for the editor.
     296         * @param WP_Comment|false $comment Comment object or false. Default false.
    202297         * @return string HTML output for the wp_editor-ized comment form.
    203298         */
    204         public static function wp_editor_comments() {
     299        public static function wp_editor_comments( $label, $comment = false ) {
     300                $content = isset( $comment->comment_content ) ? trim( $comment->comment_content ) : '';
     301
     302                // wp_kses() converts htmlspecialchars in source code.
     303                $content = $content ? htmlspecialchars_decode( $content ) : '';
     304
    205305                ob_start();
    206                 echo '<h3><label for="comment">' . _x( 'Add Note or Feedback', 'noun', 'wporg' ) . '</label></h3>';
     306                echo '<h3><label for="comment">' . $label . '</label></h3>';
    207307
    208308                if ( class_exists( 'DevHub_Note_Preview' ) ) {
    209                         echo '<ul class="tablist" style="display:none;">';
     309                        echo "<ul class='tablist' style='display: none;'>";
    210310                        echo '<li><a href="#comment-form-comment">' . __( 'Write', 'wporg' ) . '</a></li>';
    211311                        echo '<li><a href="#comment-preview">' . __( 'Preview', 'wporg' ) . '</a></li></ul>';
    212312                }
    213313
    214                 $style = '<style type="text/css">';
    215                 ob_start();
    216                 include get_stylesheet_directory() . '/stylesheets/editor-style.css';
    217                 $style .= ob_get_clean();
    218                 $style .=' </style>';
    219 
    220314                echo '<div class="comment-form-comment tab-section" id="comment-form-comment">';
    221                 wp_editor( '', 'comment', array(
    222                         'media_buttons' => false,
    223                         'editor_css'    => $style,
    224                         'textarea_name' => 'comment',
    225                         'textarea_rows' => 8,
    226                         'quicktags'     => array(
    227                                 'buttons' => 'strong,em,ul,ol,li'
    228                         ),
    229                         'teeny'         => true,
    230                         'tinymce'       => false,
    231                 ) );
     315                wp_editor( $content, 'comment', array(
     316                                'media_buttons' => false,
     317                                'editor_css'    => self::get_editor_style(),
     318                                'textarea_name' => 'comment',
     319                                'textarea_rows' => 8,
     320                                'quicktags'     => array(
     321                                        'buttons' => 'strong,em,ul,ol,li'
     322                                ),
     323                                'teeny'         => true,
     324                                'tinymce'       => false,
     325                        ) );
    232326                echo '</div>';
    233327                return ob_get_clean();
    234328        }
     
    238332         *
    239333         * Uses output buffering to capture the editor instance.
    240334         *
     335         * @param WP_Comment|false $comment Comment object or false. Default false.
     336         * @param string           $display Display the editor. Default 'show'.
     337         * @param bool             $edit    True if the editor used for editing a note. Default false.
    241338         * @return string HTML output for the wp_editor-ized feedback form.
    242339         */
    243         public static function wp_editor_feedback( $comment, $display = 'show', $content = '' ) {
     340        public static function wp_editor_feedback( $comment, $display = 'show', $edit = false ) {
    244341
    245342                if ( ! ( isset( $comment->comment_ID ) && absint( $comment->comment_ID ) ) ) {
    246343                        return '';
     
    251348                static $instance = 0;
    252349                $instance++;
    253350
    254                 $display     = ( 'hide' === $display ) ? ' style="display: none;"' : '';
    255                 $title       = __( 'Add feedback to this note', 'wporg' );
    256                 $form_type   = '';
    257                 $button_text = __( 'Add Feedback', 'wporg' );
     351                $display       = ( 'hide' === $display ) ? ' style="display: none;"' : '';
     352                $parent        = $comment_id;
     353                $action        = site_url( '/wp-comments-post.php' );
     354                $title         = __( 'Add feedback to this note', 'wporg' );
     355                $button_text   = __( 'Add Feedback', 'wporg' );
     356                $post_id       = isset( $comment->comment_post_ID ) ? $comment->comment_post_ID : get_the_ID();
     357                $content       = '';
     358                $form_type     = '';
     359                $note_link     = '';
     360                $class         = '';
    258361
    259                 if ( $content ) {
    260                         $title       = __( 'Edit feedback', 'wporg' );
    261                         $form_type   = '-edit';
    262                         $button_text = __( 'Edit Feedback', 'wporg' );
    263                 }
     362                if ( $edit ) {
     363                        $content       = isset( $comment->comment_content ) ? $comment->comment_content : '';
     364                        $title         = __( 'Edit feedback', 'wporg' );
     365                        $form_type     = '-edit';
     366                        $button_text   = __( 'Edit Note', 'wporg' );
     367                        $post_url      = get_permalink( $post_id );
     368                        $action        = $post_url ? $post_url . '#comment-' . $comment_id : '';
     369                        $parent        = isset( $comment->comment_parent ) ? $comment->comment_parent : 0;
     370                        $parent_author = \DevHub\get_note_author( $parent );
     371                        $class         = ' edit-feedback-editor';
    264372
     373                        if ( $parent && $post_url && $parent_author ) {
     374                                $post_url  = $post_url . '#comment-' . $parent;
     375                                $parent_note = sprintf( __( 'note %d', 'wporg' ), $parent );
     376
     377                                /* translators: 1: note, 2: note author name */
     378                                $note_link = sprintf( __( '%1$s by %2$s', 'wporg' ), "<a href='{$post_url}'>{$parent_note}</a>", $parent_author );
     379                        }
     380                }
     381
    265382                $allowed_tags = '';
    266383                foreach ( array( '<strong>', '<em>', '<code>', '<a>' ) as $tag ) {
    267384                        $allowed_tags .= '<code>' . htmlentities( $tag ) . '</code>, ';
     
    268385                }
    269386
    270387                ob_start();
    271                 echo "<div id='feedback-editor-{$comment_id}' class='feedback-editor'{$display}>\n";
    272                 echo "<p class='feedback-editor-title'>{$title}</p>\n";
    273                 echo '<form id="feedback-form-' . $instance . $form_type . '" class="feedback-form" method="post" action="' . site_url( '/wp-comments-post.php' ) . '" name="feedback-form-' . $instance ."\">\n";
     388                echo "<div id='feedback-editor-{$comment_id}' class='feedback-editor{$class}'{$display}>\n";
     389                if ( ! $edit ) {
     390                        echo "<p class='feedback-editor-title'>{$title}</p>\n";
     391                }
    274392
    275                 wp_editor( '', 'feedback-' . $instance, array(
    276                         'media_buttons' => false,
    277                         'textarea_name' => 'comment',
    278                         'textarea_rows' => 3,
    279                         'quicktags'     => array(
    280                                 'buttons' => 'strong,em'
    281                         ),
    282                         'teeny'         => true,
    283                         'tinymce'       => false,
    284                 ) );
     393                echo "<form id='feedback-form-{$instance}{$form_type}' class='feedback-form' method='post' action='{$action}' name='feedback-form-{$instance}'>\n";
     394                echo self::get_editor_rules( 'feedback', $note_link );
     395                wp_editor( $content, 'feedback-' . $instance, array(
     396                                'media_buttons' => false,
     397                                'textarea_name' => 'comment',
     398                                'textarea_rows' => 3,
     399                                'quicktags'     => array(
     400                                        'buttons' => 'strong,em'
     401                                ),
     402                                'editor_css'    => self::get_editor_style(),
     403                                'teeny'         => true,
     404                                'tinymce'       => false,
     405                        ) );
    285406
    286407                echo '<p><strong>' . __( 'Note', 'wporg' ) . '</strong>: ' . __( 'No newlines allowed', 'wporg' ) . '. ';
    287408                printf( __( 'Allowed tags: %s', 'wporg' ), trim( $allowed_tags, ', ' ) ) . "</p>\n";
    288                 echo "<p><input id='submit-{$instance}' class='submit' type='submit' value='Add Feedback' name='submit-{$instance}'>\n";
    289                 echo "<input type='hidden' name='comment_post_ID' value='" . get_the_ID() . "' id='comment_post_ID-{$instance}' />\n";
    290                 echo "<input type='hidden' name='comment_parent' id='comment_parent-{$instance}' value='{$comment_id}' />\n";
     409                echo "<p><input id='submit-{$instance}' class='submit' type='submit' value='{$button_text}' name='submit-{$instance}'>\n";
     410                echo "<input type='hidden' name='comment_post_ID' value='{$post_id}' id='comment_post_ID-{$instance}' />\n";
     411                echo "<input type='hidden' name='comment_parent' id='comment_parent-{$instance}' value='{$parent}' />\n";
     412
     413                if ( $edit ) {
     414                        echo self::get_edit_fields( $comment_id, $instance );
     415                }
     416
    291417                echo "</p>\n</form>\n</div><!-- #feedback-editor-{$comment_id} -->\n";
    292418                return ob_get_clean();
    293419        }
    294420
     421        /**
     422         * Get the rules list for the comment form.
     423         *
     424         * @param string $context   Accepts 'feedback' or empty sring.
     425         * @param string $note_link Link to parent note.
     426         * @return string Editor rules.
     427         */
     428        public static function get_editor_rules( $context = '', $note_link = '' ) {
     429                $license_rule = sprintf(
     430                        /* translators: 1: GFDL link */
     431                        __( '<strong>NOTE:</strong> All contributions are licensed under %s and are moderated before appearing on the site.', 'wporg' ),
     432                        '<a href="https://gnu.org/licenses/fdl.html">GFDL</a>'
     433                );
     434
     435                if ( 'feedback' === $context ) {
     436                        $feedback_rule = __( 'Use this form to report errors or to add additional information to this note.', 'wporg' );
     437                        if ( $note_link ) {
     438                                $feedback_rule = sprintf( __( 'Use this form to report errors or to add additional information to %s.', 'wporg' ), $note_link );
     439                        }
     440
     441                        return '<ul><li>'
     442                                . __( 'Feedback is part of the documentation.', 'wporg' ) . ' '
     443                                . $feedback_rule
     444                                . '</li><li>'
     445                                . __( 'This form is not for support requests, spam, bug reports, complaints, or self-promotion. Entries of this nature will be deleted.', 'wporg' )
     446                                . '</li><li class="user-notes-are-gpl">'
     447                                . $license_rule
     448                                . '</li></ul>';
     449                }
     450
     451                return '<ul><li>'
     452                        . __( 'This form is not for support requests, discussions, spam, bug reports, complaints, or self-promotion. Entries of this nature will be deleted.', 'wporg' )
     453                        . '</li><li>'
     454                        . __( 'In the editing area the Tab key enters a tab character. To move below this area by pressing Tab, press the Esc key followed by the Tab key. In some cases the Esc key will need to be pressed twice before the Tab key will allow you to continue.', 'wporg' )
     455                        . '</li><li class="user-notes-are-gpl">'
     456                        . $license_rule
     457                        . '</li></ul>';
     458        }
     459
     460        /**
     461         * Get the editor styles.
     462         *
     463         * @return string Editor styles.
     464         */
     465        public static function get_editor_style() {
     466                $style = '<style type="text/css">';
     467                ob_start();
     468                include get_stylesheet_directory() . '/stylesheets/editor-style.css';
     469                $style .= ob_get_clean();
     470                $style .= ' </style>';
     471                return $style;
     472        }
     473
     474        /**
     475         * Get the hidden input fields HTML used for editing a note.
     476         *
     477         * @param int     $comment_id Comment ID.
     478         * @param integer $instance   Comment form instance number used in HTML id's.
     479         * @return string Hidden input fields HTML.
     480         */
     481        public static function get_edit_fields( $comment_id, $instance = 0 ) {
     482                $fields = "<input type='hidden' name='comment_ID' id='comment_ID-{$instance}' value='{$comment_id}' />\n";
     483                $fields .= "<input type='hidden' name='update_user_note' id='update_user_note-{$instance}' value='1' />\n";
     484                $fields .= wp_nonce_field( 'update_user_note_' . $comment_id, '_wpnonce', true, false );
     485
     486                return $fields;
     487        }
     488
    295489} // DevHub_User_Submitted_Content
    296490
    297491DevHub_User_Submitted_Content::init();
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/js/user-notes-feedback.js

     
    44                return;
    55        }
    66
     7        var wpAdminBar     = 0;
    78        var options        = wporg_note_feedback;
    8         var wpAdminBar     = $('#page.admin-bar').length ? 32 : 0;
    9         var feedbackToggle = $( '<a class="feedback-toggle" href="#">' + options.show + '</a>' );
    10         var hash           = window.location.hash;
     9        var feedbackToggle = $( '<a role="button" class="feedback-toggle" href="#">' + options.show + '</a>' );
     10        var commentID      = window.location.hash;
    1111
    1212        // Check if the fragment identifier is a comment ID (e.g. #comment-63)
    13         if ( !hash.match( /#comment\-[0-9]+$/ ) ) {
    14                 hash = '';
     13        if ( !commentID.match( /#comment\-[0-9]+$/ ) ) {
     14                commentID = '';
    1515        }
    1616       
    1717        $( '.feedback-editor' ).each( function() {
     18                // Hide feedback editors with hide-if-js class
     19                $( this ).not('.edit-feedback-editor').addClass( 'hide-if-js' );
     20                $( this ).removeAttr("style");
    1821
    19                 // Hide hidden editor with 'hide-if-js' class.
    20                 if( 'none' === $(this).css('display') ) {
    21                         $( this ).show().addClass( 'hide-if-js' );
    22                 }
    23 
    2422                // Add quicktag 'inline code' button to editor.
    2523                var id = $( this ).find( 'textarea' ).attr( 'id' );
    2624                if ( id.length ) {
     
    3735                        var feedback = $( this ).find( '.feedback' );
    3836                        var toggle = feedbackToggle.clone();
    3937
     38                        var feedback_id = getCommentID( $(this) );
    4039                        toggle.attr( {
    4140                                'aria-expanded': 'false',
    42                                 'aria-controls': 'feedback-' + getCommentID( $(this) )
     41                                'aria-controls': 'feedback-' + feedback_id
    4342                        } );
    4443
    4544                        // Set text to 'Hide Feedback' if feedback is displayed
     
    4746                                toggle.text( options.hide );
    4847                        }
    4948
    50                         feedbackLinks.find( '.feedback-add' ).show();
     49                        // Display hidden add feedback link and add aria
     50                        feedbackLinks.find( '.feedback-add' ).removeAttr("style").attr( {
     51                                'aria-expanded': 'false',
     52                                'aria-controls': 'feedback-editor-' + feedback_id
     53                        } );
     54
    5155                        feedbackLinks.append( toggle );
    5256                }
    5357
    5458                if ( feedbackLinks.length ) {
    55                         // Move feedback links before feedback.
     59                        // Move the feedback links before the feedback section.
    5660                        var clonedElements = feedbackLinks.clone().children();
    5761                        var feedbackLinksTop = $( '<div class="feedback-links"></div>' ).append( clonedElements );
    5862                        $( this ).find( '.feedback' ).first().before( feedbackLinksTop );
     63
     64                        // Hide the bottom feedback links.
    5965                        feedbackLinks.addClass( 'bottom hide-if-js' );
    6066                }
    6167        } );
     
    6773
    6874        // Removes added elements
    6975        function resetComment( el ) {
    70 
    7176                var children = el.find( 'ul.children' );
    7277                if ( !children.length ) {
    7378                        el.find( '.feedback-toggle' ).remove();
     
    7883
    7984        // Show hidden child comments if the fragment identifier is a comment ID (e.g. #comment-63). 
    8085        $( document ).ready( function() {
    81 
     86                // Set wpAdminBar
     87                wpAdminBar = $('#wpadminbar').length ? 32 : 0;
    8288                var childComments = $( '.comment' ).find( 'ul.children' );
    8389
    84                 if ( !( hash.length && childComments.length ) ) {
     90                if ( ! ( commentID.length && childComments.length ) ) {
    8591                        return;
    8692                }
    8793
    88                 var hashComment = childComments.find( hash ).first();
    89                 if ( hashComment.length ) {
    90                         // Child comment exists.
     94                var comment = childComments.find( commentID + '.depth-2' ).first();
     95                if ( ! comment.length ) {
     96                        return;
     97                }
     98                // Child comment exists.
    9199
    92                         var parent = hashComment.closest( '.comment.depth-1' );
    93                         if ( parent.find( '.feedback' ).hasClass( 'hide-if-js' ) ) {
    94                                 // Show child comments.
    95                                 parent.find( '.feedback-toggle' ).first().trigger( 'click' );
    96                         }
     100                var parent = comment.closest( '.comment.depth-1' );
     101                if ( parent.find( '.feedback' ).hasClass( 'hide-if-js' ) ) {
     102                        // Show child comments.
     103                        parent.find( '.feedback-toggle' ).first().trigger( 'click' );
     104                }
    97105
    98                         // Scroll to the child comment.
    99                         var pos = hashComment.offset();
    100                         $( 'html,body' ).animate( {
    101                                 scrollTop: pos.top - wpAdminBar
    102                         }, 1 );
    103                 }
     106                // Scroll to child comment and adjust for admin bar
     107                var pos = comment.offset();
     108                $( 'html,body' ).animate( {
     109                        scrollTop: pos.top - wpAdminBar
     110                }, 1 );
     111
    104112        } );
    105113
    106         // Show/Hide feedback toggle link.
     114        // Click event for Show/Hide feedback toggle link.
    107115        $( document ).on( 'click', '.feedback-toggle', function( e ) {
    108116                e.preventDefault();
    109117
     
    130138                                scrollTop: pos.top - wpAdminBar
    131139                        }, 1000 );
    132140
    133                         // Add feedback links at the bottom if there are over 3 feedback notes.
     141                        // Show feedback links at the bottom if there are over 3 feedback notes.
    134142                        var children = parent.find( 'ul.children > li' );
    135143                        if ( 3 < children.length ) {
    136144                                var feedbackLinks = parent.find( '.feedback-links.bottom' );
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/js/user-notes-preview.js

     
    2020                text = '';
    2121                processing = false;
    2222
     23                // Show tabs with Javascript.
     24                $( '#commentform .tablist').show();
     25
    2326                if ( textarea.length && preview.length && tabs.length ) {
    2427
    2528                        // Append spinner to preview tab
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/js/user-notes.js

     
    66( function( $ ) {
    77
    88        var commentForm = $( '.comment-form textarea' );
     9        var add_user_note = $( '#add-user-note' );     
     10        var commentID = window.location.hash;
     11        var wpAdminBar = 0;
    912
    10         if ( !commentForm.length ) {
    11                 return;
     13        // Check if the fragment identifier is a comment ID (e.g. #comment-63)
     14        if ( ! commentID.match( /#comment\-[0-9]+$/ ) ) {
     15                commentID = '';
    1216        }
    1317
     18        // Actions for when the page is ready
     19        $( document ).ready( function() {
     20                // Set wpAdminBar
     21                wpAdminBar = $( '#wpadminbar' ).length ? 32 : 0;
     22
     23                // Display form and scroll to it
     24                if ( '#respond' === window.location.hash ) {
     25                        showCommentForm();
     26                }
     27
     28                if( ! wpAdminBar || ! commentID ) {
     29                        return;
     30                }
     31
     32                var comment = $('#comments').find( commentID + '.depth-1' ).first();
     33                if( ! comment.length  ) {
     34                        return;
     35                }
     36
     37                // Scroll to top level comment and adjust for admin bar.
     38                var pos = comment.offset();
     39                $( 'html,body' ).animate( {
     40                        scrollTop: pos.top - wpAdminBar
     41                }, 1 );
     42        } );
     43
     44        // Scroll to comment if comment date link is clicked
     45        $( '#comments' ).on( 'click', '.comment-date', function( e ) {
     46                // Scroll to comment and adjust for admin bar
     47                // Add 16px for child comments
     48                var pos = $( this ).offset();
     49                $( 'html,body' ).animate( {
     50                        scrollTop: pos.top - wpAdminBar - 16
     51                }, 1 );
     52        } );
     53
    1454        function showCommentForm() {
     55                if( add_user_note.length ) {
     56                        add_user_note.hide();
     57                }
     58
    1559                $( '#respond' ).show();
    16                 $( '#add-user-note' ).hide();
    1760
    18                 var wpAdminBar = $( '#page.admin-bar' ).length ? 32 : 0;
    19                 var target     = $( '#commentform #add-note-or-feedback' );
     61                var target = $( '#commentform #add-note-or-feedback' );
    2062                if ( target.length ) {
    2163                        var pos = target.offset();
    2264
     
    2870                }
    2971        }
    3072
    31         $( '#respond, #add-user-note' ).toggle();
     73        if ( ! commentForm.length ) {
     74                return;
     75        }
     76
     77        if( add_user_note.length ) {
     78                add_user_note.show();
     79
     80                // Hide by default if #add-user-note exists
     81                $( '#respond' ).hide();
     82        }
     83
    3284        $( '#add-user-note, .table-of-contents a[href="#add-note-or-feedback"]' ).click( function( e ) {
    3385                e.preventDefault();
    34 
    3586                showCommentForm();
    3687        } );
    3788
    38         if ( '#respond' === document.location.hash ) {
    39                 showCommentForm();
    40         }
    41 
    4289        // Add php and js buttons to QuickTags.
    4390        QTags.addButton( 'php', 'php', '[php]', '[/php]', '', '', '', 'comment' );
    4491        QTags.addButton( 'js', 'js', '[js]', '[/js]', '', '', '', 'comment' );
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/scss/main.scss

     
    11371137                        opacity: 1;
    11381138                }
    11391139
    1140                 .comment-awaiting-moderation {
     1140                .comment-awaiting-moderation,
     1141                .comment-edited {
    11411142                        background-color: #fff8e5;
    11421143                        padding: .2em .5em;
     1144                        margin-right: .5em;
    11431145                        border-radius: 3px;
    11441146                        border: 1px solid #ffb900;
    11451147                }
    11461148
    1147                 .depth-2 .comment-awaiting-moderation {
     1149                .depth-2 .comment-awaiting-moderation,
     1150                .depth-2 .comment-edited {
    11481151                        display: inline-block;
    11491152                        margin: 2px 0;
    11501153                }
     
    11701173                .comment-list li.depth-1,
    11711174                #comment-preview {
    11721175                        border: 1px solid #dfdfdf;
    1173                         border-radius: 2px;
     1176                        border-radius: 2px;     
     1177                        width: 100%;
    11741178                }
    11751179
    11761180                // Feedback
     
    13621366                        padding: 0 5px;
    13631367                }
    13641368
    1365                 .comment-form ul {
     1369                .comment-form ul, .feedback-form ul {
    13661370                        margin-left: 1.5em;
    13671371                }
     1372
     1373                .feedback-form ul li {
     1374                        margin: 0;
     1375                        overflow: visible;
     1376                }
    13681377        }
    13691378
    13701379        &.single-post {
  • sites/trunk/wordpress.org/public_html/wp-content/themes/pub/wporg-developer/stylesheets/main.css

     
    15141514  opacity: 1;
    15151515}
    15161516
    1517 .devhub-wrap .single-wp-parser-function .comment-awaiting-moderation, .devhub-wrap .single-wp-parser-method .comment-awaiting-moderation, .devhub-wrap .single-wp-parser-hook .comment-awaiting-moderation, .devhub-wrap .single-wp-parser-class .comment-awaiting-moderation {
     1517.devhub-wrap .single-wp-parser-function .comment-awaiting-moderation,
     1518.devhub-wrap .single-wp-parser-function .comment-edited, .devhub-wrap .single-wp-parser-method .comment-awaiting-moderation,
     1519.devhub-wrap .single-wp-parser-method .comment-edited, .devhub-wrap .single-wp-parser-hook .comment-awaiting-moderation,
     1520.devhub-wrap .single-wp-parser-hook .comment-edited, .devhub-wrap .single-wp-parser-class .comment-awaiting-moderation,
     1521.devhub-wrap .single-wp-parser-class .comment-edited {
    15181522  background-color: #fff8e5;
    15191523  padding: .2em .5em;
     1524  margin-right: .5em;
    15201525  border-radius: 3px;
    15211526  border: 1px solid #ffb900;
    15221527}
    15231528
    1524 .devhub-wrap .single-wp-parser-function .depth-2 .comment-awaiting-moderation, .devhub-wrap .single-wp-parser-method .depth-2 .comment-awaiting-moderation, .devhub-wrap .single-wp-parser-hook .depth-2 .comment-awaiting-moderation, .devhub-wrap .single-wp-parser-class .depth-2 .comment-awaiting-moderation {
     1529.devhub-wrap .single-wp-parser-function .depth-2 .comment-awaiting-moderation,
     1530.devhub-wrap .single-wp-parser-function .depth-2 .comment-edited, .devhub-wrap .single-wp-parser-method .depth-2 .comment-awaiting-moderation,
     1531.devhub-wrap .single-wp-parser-method .depth-2 .comment-edited, .devhub-wrap .single-wp-parser-hook .depth-2 .comment-awaiting-moderation,
     1532.devhub-wrap .single-wp-parser-hook .depth-2 .comment-edited, .devhub-wrap .single-wp-parser-class .depth-2 .comment-awaiting-moderation,
     1533.devhub-wrap .single-wp-parser-class .depth-2 .comment-edited {
    15251534  display: inline-block;
    15261535  margin: 2px 0;
    15271536}
     
    15611570.devhub-wrap .single-wp-parser-class #comment-preview {
    15621571  border: 1px solid #dfdfdf;
    15631572  border-radius: 2px;
     1573  width: 100%;
    15641574}
    15651575
    15661576.devhub-wrap .single-wp-parser-function .comment-list li.depth-2, .devhub-wrap .single-wp-parser-method .comment-list li.depth-2, .devhub-wrap .single-wp-parser-hook .comment-list li.depth-2, .devhub-wrap .single-wp-parser-class .comment-list li.depth-2 {
     
    17351745  padding: 0 5px;
    17361746}
    17371747
    1738 .devhub-wrap .single-wp-parser-function .comment-form ul, .devhub-wrap .single-wp-parser-method .comment-form ul, .devhub-wrap .single-wp-parser-hook .comment-form ul, .devhub-wrap .single-wp-parser-class .comment-form ul {
     1748.devhub-wrap .single-wp-parser-function .comment-form ul, .devhub-wrap .single-wp-parser-function .feedback-form ul, .devhub-wrap .single-wp-parser-method .comment-form ul, .devhub-wrap .single-wp-parser-method .feedback-form ul, .devhub-wrap .single-wp-parser-hook .comment-form ul, .devhub-wrap .single-wp-parser-hook .feedback-form ul, .devhub-wrap .single-wp-parser-class .comment-form ul, .devhub-wrap .single-wp-parser-class .feedback-form ul {
    17391749  margin-left: 1.5em;
    17401750}
    17411751
     1752.devhub-wrap .single-wp-parser-function .feedback-form ul li, .devhub-wrap .single-wp-parser-method .feedback-form ul li, .devhub-wrap .single-wp-parser-hook .feedback-form ul li, .devhub-wrap .single-wp-parser-class .feedback-form ul li {
     1753  margin: 0;
     1754  overflow: visible;
     1755}
     1756
    17421757.devhub-wrap.single-post .comment-list,
    17431758.devhub-wrap.single-post .comment-list ol {
    17441759  list-style: none;