src/helpers/html.js
function getBlocks( text ) {
	var blocks = [], 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;
}
function getBlocks( text ) {
	var blocks = [], 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;
}
function getBlocks ( text ) { var blocks = [ ] , 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 ; }
Splits a text into blocks based on HTML block elements.

@param {string} text The text to split.
@returns {Array} A list of blocks based on HTML block elements.
Splits a text into blocks based on HTML block elements .