@mapbox/jsxtreme-markdown
Version:
Transform Markdown into JSX or React component modules
110 lines (87 loc) • 2.15 kB
JavaScript
;
var locate = require('../locate/code-inline');
module.exports = inlineCode;
inlineCode.locator = locate;
var lineFeed = 10; // '\n'
var space = 32; // ' '
var graveAccent = 96; // '`'
function inlineCode(eat, value, silent) {
var length = value.length;
var index = 0;
var openingFenceEnd;
var closingFenceStart;
var closingFenceEnd;
var code;
var next;
var found;
while (index < length) {
if (value.charCodeAt(index) !== graveAccent) {
break;
}
index++;
}
if (index === 0 || index === length) {
return;
}
openingFenceEnd = index;
next = value.charCodeAt(index);
while (index < length) {
code = next;
next = value.charCodeAt(index + 1);
if (code === graveAccent) {
if (closingFenceStart === undefined) {
closingFenceStart = index;
}
closingFenceEnd = index + 1;
if (
next !== graveAccent &&
closingFenceEnd - closingFenceStart === openingFenceEnd
) {
found = true;
break;
}
} else if (closingFenceStart !== undefined) {
closingFenceStart = undefined;
closingFenceEnd = undefined;
}
index++;
}
if (!found) {
return;
}
/* istanbul ignore if - never used (yet) */
if (silent) {
return true;
}
// Remove the initial and final space (or line feed), iff they exist and there
// are non-space characters in the content.
index = openingFenceEnd;
length = closingFenceStart;
code = value.charCodeAt(index);
next = value.charCodeAt(length - 1);
found = false;
if (
length - index > 2 &&
(code === space || code === lineFeed) &&
(next === space || next === lineFeed)
) {
index++;
length--;
while (index < length) {
code = value.charCodeAt(index);
if (code !== space && code !== lineFeed) {
found = true;
break;
}
index++;
}
if (found === true) {
openingFenceEnd++;
closingFenceStart--;
}
}
return eat(value.slice(0, closingFenceEnd))({
type: 'inlineCode',
value: value.slice(openingFenceEnd, closingFenceStart),
});
}