'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) }) } }