code: function(abbr, options) {
  			options = options || {};
  			
  			var tree = parseAbbreviation(abbr);
  			var that = this;
  			
  			if (options.contextNode) {
  				// add info about context node –
  				// a parent XHTML node in editor inside which abbreviation is 
  				// expanded
  				tree._name = options.contextNode.name;
  				var attrLookup = {};
  				tree._attributes.forEach(function(attr) {
  					attrLookup[attr.name] = attr;
  				});
  				
  				options.contextNode.attributes.forEach(function(attr) {
  					if (attr.name in attrLookup) {
  						attrLookup[attr.name].value = attr.value;
  					} else {
  						attr = utils.clone(attr);
  						tree._attributes.push(attr);
  						attrLookup[attr.name] = attr;
  					}
  				});
  			}
  			
  			// apply preprocessors
  			preprocessors.forEach(function(fn) {
  				fn(tree, options, that);
  			});
  
  			if ('counter' in options) {
  				tree.updateProperty('counter', options.counter);
  			}
  			
  			tree = squash(unroll(tree));
  			
  			// apply postprocessors
  			postprocessors.forEach(function(fn) {
  				fn(tree, options, that);
  			});
  			
  			return tree;
  		}
docs: Parses abbreviation into tree with respect of groups,
  text nodes and attributes. Each node of the tree is a single
  abbreviation. Tree represents actual structure of the outputted
  result
  @memberOf abbreviationParser
  @param {String} abbr Abbreviation to parse
  @param {Object} options Additional options for parser and processors
  
  @return {AbbreviationNode}