This repository has been archived on 2020-11-02. You can view files and clone it, but cannot push or open issues or pull requests.
2020-11-01 22:46:04 +00:00

110 lines
2.1 KiB
JavaScript

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