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