diff --git a/modules/dt.debug.js b/modules/dt.debug.js index 3cca76b53..bac4d97b5 100644 --- a/modules/dt.debug.js +++ b/modules/dt.debug.js @@ -1,30 +1,86 @@ var Parser = require( 'ext.discussionTools.init' ).Parser, + modifier = require( 'ext.discussionTools.init' ).modifier, + utils = require( 'ext.discussionTools.init' ).utils, highlighter = require( './highlighter.js' ), parser = new Parser( document.getElementById( 'mw-content-text' ) ), comments = parser.getCommentItems(), threads = parser.getThreads(), - timestampRegexps = parser.getLocalTimestampRegexps(); + timestampRegexps = parser.getLocalTimestampRegexps(), + debug = +( new mw.Uri().query.dtdebug ), + DEBUG_HIGHLIGHT = 1, + DEBUG_VOTE = 2, + DEBUG_VOTE_PERMISSIVE = 4; -highlighter.markThreads( threads ); +// eslint-disable-next-line no-bitwise +if ( debug & DEBUG_HIGHLIGHT ) { + highlighter.markThreads( threads ); -comments.forEach( function ( comment ) { - comment.signatureRanges.forEach( function ( signatureRange ) { - var signature, emptySignature, node, match; + // TODO: Use comment.signatureRanges to mark up signatures/timestamps + comments.forEach( function ( comment ) { + comment.signatureRanges.forEach( function ( signatureRange ) { + var signature, emptySignature, node, match; - node = signatureRange.endContainer; - match = parser.findTimestamp( node, timestampRegexps ); - if ( !match ) { - return; - } - signature = parser.findSignature( node )[ 0 ]; - emptySignature = signature.length === 1 && signature[ 0 ] === node; - // Note that additional content may follow the timestamp (e.g. in some voting formats), but we - // don't care about it. The code below doesn't mark that due to now the text nodes are sliced, - // but we might need to take care to use the matched range of node in other cases. - highlighter.markTimestamp( parser, node, match ); - if ( !emptySignature ) { - highlighter.markSignature( signature ); + node = signatureRange.endContainer; + match = parser.findTimestamp( node, timestampRegexps ); + if ( !match ) { + return; + } + signature = parser.findSignature( node )[ 0 ]; + emptySignature = signature.length === 1 && signature[ 0 ] === node; + // Note that additional content may follow the timestamp (e.g. in some voting formats), but we + // don't care about it. The code below doesn't mark that due to now the text nodes are sliced, + // but we might need to take care to use the matched range of node in other cases. + highlighter.markTimestamp( parser, node, match ); + if ( !emptySignature ) { + highlighter.markSignature( signature ); + } + } ); + } ); +} + +// eslint-disable-next-line no-bitwise +if ( ( debug & DEBUG_VOTE ) || ( debug & DEBUG_VOTE_PERMISSIVE ) ) { + threads.forEach( function ( thread ) { + var level, lastReply, listItem, firstVote, + firstComment = thread.replies[ 0 ]; + + if ( firstComment && firstComment.type === 'comment' ) { + // eslint-disable-next-line no-bitwise + if ( !( debug & DEBUG_VOTE_PERMISSIVE ) && firstComment.level <= 1 ) { + // Not in permissive vote mode, and first reply was not indented + return; + } + + firstVote = firstComment.level === 1 ? + // In permissive mode, the first vote is the replies to the OP + firstComment.replies[ 0 ] : + firstComment; + + if ( !firstVote ) { + return; + } + + level = firstVote.level; + firstVote.parent.replies.forEach( function ( reply ) { + if ( reply.type === 'comment' && reply.level <= level ) { + lastReply = reply; + } + } ); + + listItem = modifier.addSiblingListItem( + utils.closestElement( lastReply.range.endContainer, [ 'li', 'dd', 'p' ] ) + ); + if ( listItem && listItem.tagName.toLowerCase() === 'li' ) { + $( listItem ) + // Hide bullet/number + .css( 'list-style', 'none' ) + .append( + '[ ', + $( '' ).text( 'add comment' ), + ' ]' + ); + } } } ); -} ); +}