49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			49 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								module.exports = function() {
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    name: 'truncateCode',
							 | 
						||
| 
								 | 
							
								    process: function(str, lines) {
							 | 
						||
| 
								 | 
							
								      if (lines === undefined) return str;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const parts = str && str.split && str.split(/\r?\n/);
							 | 
						||
| 
								 | 
							
								      if (parts && parts.length > lines) {
							 | 
						||
| 
								 | 
							
								        return balance(parts[0] + '...', ['{', '(', '['], ['}', ')', ']']);
							 | 
						||
| 
								 | 
							
								      } else {
							 | 
						||
| 
								 | 
							
								        return str;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Try to balance the brackets by adding closers on to the end of a string
							 | 
						||
| 
								 | 
							
								 * for every bracket that is left open.
							 | 
						||
| 
								 | 
							
								 * The chars at each index in the openers and closers should match (i.e openers = ['{', '('], closers = ['}', ')'])
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @param {string} str The string to balance
							 | 
						||
| 
								 | 
							
								 * @param {string[]} openers an array of chars that open a bracket
							 | 
						||
| 
								 | 
							
								 * @param {string[]} closers an array of chars that close a brack
							 | 
						||
| 
								 | 
							
								 * @returns the balanced string
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								function balance(str, openers, closers) {
							 | 
						||
| 
								 | 
							
								  const stack = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Add each open bracket to the stack, removing them when there is a matching closer
							 | 
						||
| 
								 | 
							
								  str.split('').forEach(function(char) {
							 | 
						||
| 
								 | 
							
								    const closerIndex = closers.indexOf(char);
							 | 
						||
| 
								 | 
							
								    if (closerIndex !== -1 && stack[stack.length-1] === closerIndex) {
							 | 
						||
| 
								 | 
							
								      stack.pop();
							 | 
						||
| 
								 | 
							
								    } else {
							 | 
						||
| 
								 | 
							
								      const openerIndex = openers.indexOf(char);
							 | 
						||
| 
								 | 
							
								      if (openerIndex !== -1) {
							 | 
						||
| 
								 | 
							
								        stack.push(openerIndex);
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // Now the stack should contain all the unclosed brackets
							 | 
						||
| 
								 | 
							
								  while(stack.length) {
							 | 
						||
| 
								 | 
							
								    str += closers[stack.pop()];
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return str;
							 | 
						||
| 
								 | 
							
								}
							 |