@mapbox/jsxtreme-markdown
Version:
Transform Markdown into JSX or React component modules
99 lines (81 loc) • 2.08 kB
JavaScript
;
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),
});
}
}