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