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;
 | 
						|
} |