diff --git a/includes/CommentModifier.php b/includes/CommentModifier.php index 5cb79c1f8..6676fe6c7 100644 --- a/includes/CommentModifier.php +++ b/includes/CommentModifier.php @@ -294,6 +294,29 @@ class CommentModifier { return $listItem; } + /** + * Add a reply to a specific comment + * + * @param CommentItem $comment Comment being replied to + * @param DOMElement $container Container of comment DOM nodes + */ + public static function addReply( CommentItem $comment, DOMElement $container ) { + $newParsoidItem = null; + // Transfer comment DOM to Parsoid DOM + // Wrap every root node of the document in a new list item (dd/li). + // In wikitext mode every root node is a paragraph. + // In visual mode the editor takes care of preventing problematic nodes + // like or

from ever occurring in the comment. + while ( $container->childNodes->length ) { + if ( !$newParsoidItem ) { + $newParsoidItem = self::addListItem( $comment ); + } else { + $newParsoidItem = self::addSiblingListItem( $newParsoidItem ); + } + $newParsoidItem->appendChild( $container->firstChild ); + } + } + /** * Create an element that will convert to the provided wikitext * diff --git a/modules/CommentController.js b/modules/CommentController.js index 334a1d3e5..fa7a83b87 100644 --- a/modules/CommentController.js +++ b/modules/CommentController.js @@ -304,7 +304,7 @@ CommentController.prototype.createCommentContainerFromHtml = function ( doc, htm }; CommentController.prototype.postReply = function ( comment ) { - var container, newParsoidItem, wikitext, + var container, wikitext, doc = comment.range.endContainer.ownerDocument; if ( this.replyWidget.getMode() === 'source' ) { @@ -319,19 +319,7 @@ CommentController.prototype.postReply = function ( comment ) { container = this.createCommentContainerFromHtml( doc, this.replyWidget.getValue() ); } - // Transfer comment DOM to Parsoid DOM - // Wrap every root node of the document in a new list item (dd/li). - // In wikitext mode every root node is a paragraph. - // In visual mode the editor takes care of preventing problematic nodes - // like

or

from ever occurring in the comment. - while ( container.children.length ) { - if ( !newParsoidItem ) { - newParsoidItem = modifier.addListItem( comment ); - } else { - newParsoidItem = modifier.addSiblingListItem( newParsoidItem ); - } - newParsoidItem.appendChild( container.firstChild ); - } + modifier.addReply( comment, container ); }; CommentController.prototype.save = function ( parsoidData ) { diff --git a/modules/modifier.js b/modules/modifier.js index f3000c393..cd0566b53 100644 --- a/modules/modifier.js +++ b/modules/modifier.js @@ -292,6 +292,30 @@ function addSiblingListItem( previousItem ) { return listItem; } +/** + * Add a reply to a specific comment + * + * @param {CommentItem} comment Comment being replied to + * @param {HTMLElement} container Container of comment DOM nodes + */ +function addReply( comment, container ) { + var newParsoidItem; + + // Transfer comment DOM to Parsoid DOM + // Wrap every root node of the document in a new list item (dd/li). + // In wikitext mode every root node is a paragraph. + // In visual mode the editor takes care of preventing problematic nodes + // like

or

from ever occurring in the comment. + while ( container.childNodes.length ) { + if ( !newParsoidItem ) { + newParsoidItem = addListItem( comment ); + } else { + newParsoidItem = addSiblingListItem( newParsoidItem ); + } + newParsoidItem.appendChild( container.firstChild ); + } +} + function createWikitextNode( doc, wt ) { var span = doc.createElement( 'span' ); @@ -303,6 +327,7 @@ function createWikitextNode( doc, wt ) { module.exports = { addReplyLink: addReplyLink, + addReply: addReply, addListItem: addListItem, removeAddedListItem: removeAddedListItem, addSiblingListItem: addSiblingListItem,