docs: function triggerEditable( that ) {
  		that.debug.groupStart( 'triggerEditable' ); // %REMOVE_LINE%
  
  		var editable = that.editable,
  			mouse = that.mouse,
  			view = that.view,
  			triggerOffset = that.triggerOffset,
  			triggerLook;
  
  		// Update editable dimensions.
  		updateEditableSize( that );
  
  		// This flag determines whether checking bottom trigger.
  		var bottomTrigger = mouse.y > ( that.inInlineMode ?
  				view.editable.top + view.editable.height / 2
  			:
  				// This is to handle case when editable.height / 2 <<< pane.height.
  				Math.min( view.editable.height, view.pane.height ) / 2 ),
  
  		// Edge node according to bottomTrigger.
  		edgeNode = editable[ bottomTrigger ? 'getLast' : 'getFirst' ]( function( node ) {
  			return !( isEmptyTextNode( node ) || isComment( node ) );
  		} );
  
  		// There's no edge node. Abort.
  		if ( !edgeNode ) {
  			that.debug.logEnd( 'ABORT. No edge node found.' ); // %REMOVE_LINE%
  			return null;
  		}
  
  		// If the edgeNode in editable is ML, get the next one.
  		if ( isLine( that, edgeNode ) ) {
  			edgeNode = that.line.wrap[ bottomTrigger ? 'getPrevious' : 'getNext' ]( function( node ) {
  				return !( isEmptyTextNode( node ) || isComment( node ) );
  			} );
  		}
  
  		// Exclude bad nodes (no ML needed then):
  		//	\-> Edge node is text.
  		//	\-> Edge node is floated, etc.
  		//
  		// Edge node *must be* a valid trigger at this stage as well.
  		if ( !isHtml( edgeNode ) || isFlowBreaker( edgeNode ) || !isTrigger( that, edgeNode ) ) {
  			that.debug.logEnd( 'ABORT. Invalid edge node.' ); // %REMOVE_LINE%
  			return null;
  		}
  
  		// Update size of edge node. Dimensions will be necessary.
  		updateSize( that, edgeNode );
  
  		// Return appropriate trigger according to bottomTrigger.
  		// \->	Top edge trigger case first.
  		if ( !bottomTrigger &&													// Top trigger case.
  			edgeNode.size.top >= 0 &&											// Check if the first element is fully visible.
  			inBetween( mouse.y, 0, edgeNode.size.top + triggerOffset ) ) {		// Check if mouse in [0, edgeNode.top + triggerOffset].
  
  			// Determine trigger look.
  			triggerLook = that.inInlineMode || view.scroll.y === 0 ?
  				LOOK_TOP : LOOK_NORMAL;
  
  			that.debug.logEnd( 'SUCCESS. Created box trigger. EDGE_TOP.' ); // %REMOVE_LINE%
  
  			return new boxTrigger( [ null, edgeNode,
  				EDGE_TOP,
  				TYPE_EDGE,
  				triggerLook
  			] );
  		}
  
  		// \->	Bottom case.
  		else if ( bottomTrigger &&
  			edgeNode.size.bottom <= view.pane.height &&							// Check if the last element is fully visible
  			inBetween( mouse.y,													// Check if mouse in...
  				edgeNode.size.bottom - triggerOffset, view.pane.height ) ) {	// [ edgeNode.bottom - triggerOffset, paneHeight ]
  
  			// Determine trigger look.
  			triggerLook = that.inInlineMode ||
  				inBetween( edgeNode.size.bottom, view.pane.height - triggerOffset, view.pane.height ) ?
  					LOOK_BOTTOM : LOOK_NORMAL;
  
  			that.debug.logEnd( 'SUCCESS. Created box trigger. EDGE_BOTTOM.' ); // %REMOVE_LINE%
  
  			return new boxTrigger( [ edgeNode, null,
  				EDGE_BOTTOM,
  				TYPE_EDGE,
  				triggerLook
  			] );
  		}
  
  		that.debug.logEnd( 'ABORT. No trigger created.' ); // %REMOVE_LINE%
  		return null;
  	}