vendor/emmet.js
function matchedRangeForCSSProperty(rule, selRange, isBackward) {
		/** @type CSSProperty */
		var property = null;
		var possibleRanges, curRange = null, ix;
		var list = rule.list();
		var searchFn, nearestItemFn;
		
		if (isBackward) {
			list.reverse();
			searchFn = function(p) {
				return p.range(true).start <= selRange.start;
			};
			nearestItemFn = function(r) {
				return r.start < selRange.start;
			};
		} else {
			searchFn = function(p) {
				return p.range(true).end >= selRange.end;
			};
			nearestItemFn = function(r) {
				return r.end > selRange.start;
			};
		}
		
		// search for nearest to selection CSS property
		while (property = _.find(list, searchFn)) {
			possibleRanges = makePossibleRangesCSS(property);
			if (isBackward)
				possibleRanges.reverse();
			
			// check if any possible range is already selected
			curRange = _.find(possibleRanges, function(r) {
				return r.equal(selRange);
			});
			
			if (!curRange) {
				// no selection, select nearest item
				var matchedRanges = _.filter(possibleRanges, function(r) {
					return r.inside(selRange.end);
				});
				
				if (matchedRanges.length > 1) {
					curRange = matchedRanges[1];
					break;
				}
				
				if (curRange = _.find(possibleRanges, nearestItemFn))
					break;
			} else {
				ix = _.indexOf(possibleRanges, curRange);
				if (ix != possibleRanges.length - 1) {
					curRange = possibleRanges[ix + 1];
					break;
				}
			}
			
			curRange = null;
			selRange.start = selRange.end = isBackward 
				? property.range(true).start - 1
				: property.range(true).end + 1;
		}
		
		return curRange;
	}
function matchedRangeForCSSProperty(rule, selRange, isBackward) {
		/** @type CSSProperty */
		var property = null;
		var possibleRanges, curRange = null, ix;
		var list = rule.list();
		var searchFn, nearestItemFn;
		
		if (isBackward) {
			list.reverse();
			searchFn = function(p) {
				return p.range(true).start <= selRange.start;
			};
			nearestItemFn = function(r) {
				return r.start < selRange.start;
			};
		} else {
			searchFn = function(p) {
				return p.range(true).end >= selRange.end;
			};
			nearestItemFn = function(r) {
				return r.end > selRange.start;
			};
		}
		
		// search for nearest to selection CSS property
		while (property = _.find(list, searchFn)) {
			possibleRanges = makePossibleRangesCSS(property);
			if (isBackward)
				possibleRanges.reverse();
			
			// check if any possible range is already selected
			curRange = _.find(possibleRanges, function(r) {
				return r.equal(selRange);
			});
			
			if (!curRange) {
				// no selection, select nearest item
				var matchedRanges = _.filter(possibleRanges, function(r) {
					return r.inside(selRange.end);
				});
				
				if (matchedRanges.length > 1) {
					curRange = matchedRanges[1];
					break;
				}
				
				if (curRange = _.find(possibleRanges, nearestItemFn))
					break;
			} else {
				ix = _.indexOf(possibleRanges, curRange);
				if (ix != possibleRanges.length - 1) {
					curRange = possibleRanges[ix + 1];
					break;
				}
			}
			
			curRange = null;
			selRange.start = selRange.end = isBackward 
				? property.range(true).start - 1
				: property.range(true).end + 1;
		}
		
		return curRange;
	}
function matchedRangeForCSSProperty ( rule , selRange , isBackward ) { /** @type CSSProperty */ var property = null ; var possibleRanges , curRange = null , ix ; var list = rule . list ( ) ; var searchFn , nearestItemFn ; if ( isBackward ) { list . reverse ( ) ; searchFn = function ( p ) { return p . range ( true ) . start <= selRange . start ; } ; nearestItemFn = function ( r ) { return r . start < selRange . start ; } ; } else { searchFn = function ( p ) { return p . range ( true ) . end >= selRange . end ; } ; nearestItemFn = function ( r ) { return r . end > selRange . start ; } ; } // search for nearest to selection CSS property while ( property = _ . find ( list , searchFn ) ) { possibleRanges = makePossibleRangesCSS ( property ) ; if ( isBackward ) possibleRanges . reverse ( ) ; // check if any possible range is already selected curRange = _ . find ( possibleRanges , function ( r ) { return r . equal ( selRange ) ; } ) ; if ( ! curRange ) { // no selection, select nearest item var matchedRanges = _ . filter ( possibleRanges , function ( r ) { return r . inside ( selRange . end ) ; } ) ; if ( matchedRanges . length > 1 ) { curRange = matchedRanges [ 1 ] ; break ; } if ( curRange = _ . find ( possibleRanges , nearestItemFn ) ) break ; } else { ix = _ . indexOf ( possibleRanges , curRange ) ; if ( ix != possibleRanges . length - 1 ) { curRange = possibleRanges [ ix + 1 ] ; break ; } } curRange = null ; selRange . start = selRange . end = isBackward ? property . range ( true ) . start - 1 : property . range ( true ) . end + 1 ; } return curRange ; }
Tries to find matched CSS property and nearest range for selection
@param {CSSRule} rule
@param {Range} selRange
@param {Boolean} isBackward
@returns {Range}
Tries to find matched CSS property and nearest range for selection