function pad ( num, len ) { let result = String( num ); return result + repeat( ' ', len - result.length ); } function repeat ( str, times ) { let result = ''; while ( times-- ) result += str; return result; } export default function getSnippet ( source, loc, length = 1 ) { const first = Math.max( loc.line - 5, 0 ); const last = loc.line; const numDigits = String( last ).length; const lines = source.split( '\n' ).slice( first, last ); const lastLine = lines[ lines.length - 1 ]; const offset = lastLine.slice( 0, loc.column ).replace( /\t/g, ' ' ).length; let snippet = lines .map( ( line, i ) => `${pad( i + first + 1, numDigits )} : ${line.replace( /\t/g, ' ')}` ) .join( '\n' ); snippet += '\n' + repeat( ' ', numDigits + 3 + offset ) + repeat( '^', length ); return snippet; }