nl_tokens: Attempt to add a single item to the row . This is the heart of the justified algorithm . This method is direction - agnostic ; it deals only with sizes not positions .
pl_tokens: function ( itemData ) { var newItems = this . items . concat ( itemData ) , // Calculate aspect ratios for items only; exclude spacing rowWidthWithoutSpacing = this . <mask> - ( newItems . length - 1 ) * this . spacing , newAspectRatio = newItems . reduce ( function ( sum , item ) { return sum + item . aspectRatio ; } , 0 ) , targetAspectRatio = rowWidthWithoutSpacing / this . targetRowHeight , previousRowWidthWithoutSpacing , previousAspectRatio , previousTargetAspectRatio ; // Handle big full-width breakout photos if we're doing them if ( this . isBreakoutRow ) { // Only do it if there's no other items in this row if ( this . items . length === 0 ) { // Only go full width if this photo is a square or landscape if ( itemData . aspectRatio >= 1 ) { // Close out the row with a full width photo this . items . push ( itemData ) ; this . completeLayout ( rowWidthWithoutSpacing / itemData . aspectRatio , 'justify' ) ; return true ; } } } if ( newAspectRatio < this . minAspectRatio ) { // New aspect ratio is too narrow / scaled row height is too tall. // Accept this item and leave row open for more items. this . items . push ( merge ( itemData ) ) ; return true ; } else if ( newAspectRatio > this . maxAspectRatio ) { // New aspect ratio is too wide / scaled row height will be too short. // Accept item if the resulting aspect ratio is closer to target than it would be without the item. // NOTE: Any row that falls into this block will require cropping/padding on individual items. if ( this . items . length === 0 ) { // When there are no existing items, force acceptance of the new item and complete the layout. // This is the pano special case. this . items . push ( merge ( itemData ) ) ; this . completeLayout ( rowWidthWithoutSpacing / newAspectRatio , 'justify' ) ; return true ; } // Calculate width/aspect ratio for row before adding new item previousRowWidthWithoutSpacing = this . width - ( this . items . length - 1 ) * this . spacing ; previousAspectRatio = this . items . reduce ( function ( sum , item ) { return sum + item . aspectRatio ; } , 0 ) ; previousTargetAspectRatio = previousRowWidthWithoutSpacing / this . targetRowHeight ; if ( Math . abs ( newAspectRatio - targetAspectRatio ) > Math . abs ( previousAspectRatio - previousTargetAspectRatio ) ) { // Row with new item is us farther away from target than row without; complete layout and reject item. this . completeLayout ( previousRowWidthWithoutSpacing / previousAspectRatio , 'justify' ) ; return false ; } else { // Row with new item is us closer to target than row without; // accept the new item and complete the row layout. this . items . push ( merge ( itemData ) ) ; this . completeLayout ( rowWidthWithoutSpacing / newAspectRatio , 'justify' ) ; return true ; } } else { // New aspect ratio / scaled row height is within tolerance; // accept the new item and complete the row layout. this . items . push ( merge ( itemData ) ) ; this . completeLayout ( rowWidthWithoutSpacing / newAspectRatio , 'justify' ) ; return true ; } }