| 'use strict' |
| |
| var trim = require('trim') |
| var repeat = require('repeat-string') |
| var getIndent = require('./get-indentation') |
| |
| module.exports = indentation |
| |
| var tab = '\t' |
| var lineFeed = '\n' |
| var space = ' ' |
| var exclamationMark = '!' |
| |
| // 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(lineFeed) |
| var position = values.length + 1 |
| var minIndent = Infinity |
| var matrix = [] |
| var index |
| var indentation |
| var stops |
| var padding |
| |
| values.unshift(repeat(space, maximum) + exclamationMark) |
| |
| 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 = tab |
| } else { |
| padding = '' |
| } |
| |
| values[position] = |
| padding + values[position].slice(index in stops ? stops[index] + 1 : 0) |
| } |
| } |
| |
| values.shift() |
| |
| return values.join(lineFeed) |
| } |