12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- 'use strict'
- var trim = require('trim')
- var repeat = require('repeat-string')
- var getIndent = require('./get-indentation')
- module.exports = indentation
- 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
- 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--
- }
- values[position] = values[position].slice(stops[index] + 1)
- }
- }
- values.shift()
- return values.join(lineFeed)
- }
|