110 lines
2.1 KiB
JavaScript
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)
|
|
})
|
|
}
|