nl_tokens: Splits a text into blocks based on HTML block elements .
pl_tokens: function getBlocks ( text ) { var <mask> = [ ] , depth = 0 , blockStartTag = "" , currentBlock = "" , blockEndTag = "" ; // Remove all comments because it is very hard to tokenize them. text = text . replace ( commentRegex , "" ) ; createTokenizer ( ) ; htmlBlockTokenizer . onText ( text ) ; htmlBlockTokenizer . end ( ) ; forEach ( tokens , function ( token , i ) { var nextToken = tokens [ i + 1 ] ; switch ( token . type ) { case "content" : case "greater-than-sign-content" : case "inline-start" : case "inline-end" : case "other-tag" : case "other-element-start" : case "other-element-end" : case "greater than sign" : if ( ! nextToken || ( depth === 0 && ( nextToken . type === "block-start" || nextToken . type === "block-end" ) ) ) { currentBlock += token . src ; blocks . push ( currentBlock ) ; blockStartTag = "" ; currentBlock = "" ; blockEndTag = "" ; } else { currentBlock += token . src ; } break ; case "block-start" : if ( depth !== 0 ) { if ( currentBlock . trim ( ) !== "" ) { blocks . push ( currentBlock ) ; } currentBlock = "" ; blockEndTag = "" ; } depth ++ ; blockStartTag = token . src ; break ; case "block-end" : depth -- ; blockEndTag = token . src ; /*
  				 * We try to match the most deep blocks so discard any other blocks that have been started but not
  				 * finished.
  				 */ if ( "" !== blockStartTag && "" !== blockEndTag ) { blocks . push ( blockStartTag + currentBlock + blockEndTag ) ; } else if ( "" !== currentBlock . trim ( ) ) { blocks . push ( currentBlock ) ; } blockStartTag = "" ; currentBlock = "" ; blockEndTag = "" ; break ; } // Handles HTML with too many closing tags. if ( depth < 0 ) { depth = 0 ; } } ) ; return blocks ; }