mediawiki-extensions-Discus.../modules/modifier.js
Ed Sanders 16de8fb288 Rewrite list modifier in plain JS and move to separate file
Change-Id: Idc4867f1fe266de21e8964e5887aabd545d6c7ee
2019-11-05 14:13:18 +00:00

81 lines
2.1 KiB
JavaScript

/* global $:off */
'use strict';
/**
* Adapted from MDN polyfill (CC0)
* https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
*
* @param {HTMLElement} el
* @param {string} selector
* @return {HTMLElement|null}
*/
function closest( el, selector ) {
var matches;
el = el.nodeType === Node.ELEMENT_NODE ? el : el.parentElement;
if ( Element.prototype.closest ) {
return el.closest( selector );
}
matches = Element.prototype.matches ||
Element.prototype.msMatchesSelector ||
Element.prototype.webkitMatchesSelector;
do {
if ( matches.call( el, selector ) ) {
return el;
}
el = el.parentElement || el.parentNode;
} while ( el !== null && el.nodeType === 1 );
return null;
}
function addListAtComment( comment ) {
var list, listType, lastReply, listItem, endNodeInAncestor,
tsNode = comment.range.endContainer;
if ( comment.replies.length ) {
lastReply = comment.replies[ comment.replies.length - 1 ];
list = closest( lastReply.range.endContainer, 'dl, ul, ol' );
} else {
listItem = closest( tsNode, 'li, dd' );
if ( listItem ) {
listType = closest( listItem, 'dl, ul, ol' ).tagName;
list = document.createElement( listType );
listItem.appendChild( list );
} else {
endNodeInAncestor = comment.range.endContainer;
while ( endNodeInAncestor.parentNode !== comment.range.commonAncestorContainer ) {
endNodeInAncestor = endNodeInAncestor.parentNode;
}
list = document.createElement( 'dl' );
comment.range.commonAncestorContainer.insertBefore(
list,
endNodeInAncestor.nextSibling
);
}
}
return list;
}
function addListItem( list ) {
var listItem = document.createElement( list.nodeName.toLowerCase() === 'dl' ? 'dd' : 'li' );
list.appendChild( listItem );
return listItem;
}
function createWikitextNode( wt ) {
var span = document.createElement( 'span' );
span.setAttribute( 'typeof', 'mw:Transclusion' );
span.setAttribute( 'data-mw', JSON.stringify( { parts: [ wt ] } ) );
return span;
}
module.exports = {
addListAtComment: addListAtComment,
addListItem: addListItem,
createWikitextNode: createWikitextNode
};