code: function makePossibleRangesHTML(source, tokens, offset) {
  		offset = offset || 0;
  		var result = [];
  		var attrStart = -1, attrName = '', attrValue = '', attrValueRange, tagName;
  		tokens.forEach(function(tok) {
  			switch (tok.type) {
  				case 'tag':
  					tagName = source.substring(tok.start, tok.end);
  					if (/^<[\w\:\-]/.test(tagName)) {
  						// add tag name
  						result.push(range({
  							start: tok.start + 1, 
  							end: tok.end
  						}));
  					}
  					break;
  				case 'attribute':
  					attrStart = tok.start;
  					attrName = source.substring(tok.start, tok.end);
  					break;
  					
  				case 'string':
  					// attribute value
  					// push full attribute first
  					result.push(range(attrStart, tok.end - attrStart));
  					
  					attrValueRange = range(tok);
  					attrValue = attrValueRange.substring(source);
  					
  					// is this a quoted attribute?
  					if (isQuote(attrValue.charAt(0)))
  						attrValueRange.start++;
  					
  					if (isQuote(attrValue.charAt(attrValue.length - 1)))
  						attrValueRange.end--;
  					
  					result.push(attrValueRange);
  					
  					if (attrName == 'class') {
  						result = result.concat(classNameRanges(attrValueRange.substring(source), attrValueRange.start));
  					}
  					
  					break;
  			}
  		});
  		
  		// offset ranges
  		result = result.filter(function(item) {
  			if (item.length()) {
  				item.shift(offset);
  				return true;
  			}
  		});
  
  		// remove duplicates
  		return utils.unique(result, function(item) {
  			return item.toString();
  		});
  	}
docs: Creates possible selection ranges for HTML tag
  @param {String} source Original HTML source for tokens
  @param {Array} tokens List of HTML tokens
  @returns {Array}