UNPKG

@mapbox/jsxtreme-markdown

Version:
110 lines (87 loc) 2.15 kB
'use strict'; 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), }); }