| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- 'use strict';
- var trim = require('trim');
- var repeat = require('repeat-string');
- var getIndent = require('./get-indentation');
- module.exports = indentation;
- var C_SPACE = ' ';
- var C_NEWLINE = '\n';
- var C_TAB = '\t';
- /* Remove the minimum indent from every line in `value`.
- * Supports both tab, spaced, and mixed indentation (as
- * well as possible). */
- function indentation(value, maximum) {
- var values = value.split(C_NEWLINE);
- var position = values.length + 1;
- var minIndent = Infinity;
- var matrix = [];
- var index;
- var indentation;
- var stops;
- var padding;
- values.unshift(repeat(C_SPACE, maximum) + '!');
- while (position--) {
- indentation = getIndent(values[position]);
- matrix[position] = indentation.stops;
- if (trim(values[position]).length === 0) {
- continue;
- }
- if (indentation.indent) {
- if (indentation.indent > 0 && indentation.indent < minIndent) {
- minIndent = indentation.indent;
- }
- } else {
- minIndent = Infinity;
- break;
- }
- }
- if (minIndent !== Infinity) {
- position = values.length;
- while (position--) {
- stops = matrix[position];
- index = minIndent;
- while (index && !(index in stops)) {
- index--;
- }
- if (
- trim(values[position]).length !== 0 &&
- minIndent &&
- index !== minIndent
- ) {
- padding = C_TAB;
- } else {
- padding = '';
- }
- values[position] = padding + values[position].slice(
- index in stops ? stops[index] + 1 : 0
- );
- }
- }
- values.shift();
- return values.join(C_NEWLINE);
- }
|