nl_tokens: / * eslint - disable max - depth complexity
pl_tokens: function nestLists ( blocks , mode = 'html' ) { const tree = [ ] let currentList for ( let i = 0 ; i < blocks . length ; i ++ ) { const block = blocks [ i ] if ( ! isListBlock ( block ) ) { tree . push ( block ) currentList = null continue } // Start of a new list? if ( ! currentList ) { currentList = listFromBlock ( block ) tree . push ( currentList ) continue } // New list item within same list? if ( blockMatchesList ( block , currentList ) ) { currentList . children . push ( block ) continue } // Different list props, are we going deeper? if ( block . level > currentList . level ) { const newList = listFromBlock ( block ) if ( mode === 'html' ) { // Because HTML is kinda weird, nested lists needs to be nested within list items // So while you would think that we could populate the parent list with a new sub-list, // We actually have to target the last list element (child) of the parent. // However, at this point we need to be very careful - simply pushing to the list of children // will mutate the input, and we don't want to blindly clone the entire tree. // Clone the last child while adding our new list as the last child of it const lastListItem = lastChild ( currentList ) const newLastChild = objectAssign ( { } , lastListItem , { children : lastListItem . children . concat ( newList ) } ) // Swap the last child currentList . children [ currentList . children . length - 1 ] = newLastChild } else { currentList . children . push ( newList ) } // Set the newly created, deeper list as the current currentList = newList continue } // Different list props, are we going back up the tree? if ( block . level < currentList . level ) { // Current list has ended, and we need to hook up with a parent of the same level and type const match = findListMatching ( tree [ tree . length - 1 ] , block ) if ( match ) { currentList = match currentList . <mask> . push ( block ) continue } // Similar parent can't be found, assume new list currentList = listFromBlock ( block ) tree . push ( currentList ) continue } // Different list props, different list style? if ( block . listItem !== currentList . listItem ) { const match = findListMatching ( tree [ tree . length - 1 ] , { level : block . level } ) if ( match && match . listItem === block . listItem ) { currentList = match currentList . children . push ( block ) continue } else { currentList = listFromBlock ( block ) tree . push ( currentList ) continue } } // eslint-disable-next-line no-console console . warn ( 'Unknown state encountered for block' , block ) tree . push ( block ) } return tree }