blob: 53a666fb6def8a59cecfee6904622dc61a510eec [file] [log] [blame]
'use strict'
var repeat = require('repeat-string')
var trim = require('trim-trailing-lines')
module.exports = indentedCode
var lineFeed = '\n'
var tab = '\t'
var space = ' '
var tabSize = 4
var codeIndent = repeat(space, tabSize)
function indentedCode(eat, value, silent) {
var index = -1
var length = value.length
var subvalue = ''
var content = ''
var subvalueQueue = ''
var contentQueue = ''
var character
var blankQueue
var indent
while (++index < length) {
character = value.charAt(index)
if (indent) {
indent = false
subvalue += subvalueQueue
content += contentQueue
subvalueQueue = ''
contentQueue = ''
if (character === lineFeed) {
subvalueQueue = character
contentQueue = character
} else {
subvalue += character
content += character
while (++index < length) {
character = value.charAt(index)
if (!character || character === lineFeed) {
contentQueue = character
subvalueQueue = character
break
}
subvalue += character
content += character
}
}
} else if (
character === space &&
value.charAt(index + 1) === character &&
value.charAt(index + 2) === character &&
value.charAt(index + 3) === character
) {
subvalueQueue += codeIndent
index += 3
indent = true
} else if (character === tab) {
subvalueQueue += character
indent = true
} else {
blankQueue = ''
while (character === tab || character === space) {
blankQueue += character
character = value.charAt(++index)
}
if (character !== lineFeed) {
break
}
subvalueQueue += blankQueue + character
contentQueue += character
}
}
if (content) {
if (silent) {
return true
}
return eat(subvalue)({
type: 'code',
lang: null,
meta: null,
value: trim(content)
})
}
}