78 lines
1.6 KiB
JavaScript
78 lines
1.6 KiB
JavaScript
'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)
|
|
}
|