99 lines
2.0 KiB
JavaScript
99 lines
2.0 KiB
JavaScript
|
'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)
|
||
|
})
|
||
|
}
|
||
|
}
|