109 lines
1.7 KiB
JavaScript
109 lines
1.7 KiB
JavaScript
'use strict'
|
|
|
|
var whitespace = require('is-whitespace-character')
|
|
var locate = require('../locate/code-inline')
|
|
|
|
module.exports = inlineCode
|
|
inlineCode.locator = locate
|
|
|
|
var graveAccent = '`'
|
|
|
|
function inlineCode(eat, value, silent) {
|
|
var length = value.length
|
|
var index = 0
|
|
var queue = ''
|
|
var tickQueue = ''
|
|
var contentQueue
|
|
var subqueue
|
|
var count
|
|
var openingCount
|
|
var subvalue
|
|
var character
|
|
var found
|
|
var next
|
|
|
|
while (index < length) {
|
|
if (value.charAt(index) !== graveAccent) {
|
|
break
|
|
}
|
|
|
|
queue += graveAccent
|
|
index++
|
|
}
|
|
|
|
if (!queue) {
|
|
return
|
|
}
|
|
|
|
subvalue = queue
|
|
openingCount = index
|
|
queue = ''
|
|
next = value.charAt(index)
|
|
count = 0
|
|
|
|
while (index < length) {
|
|
character = next
|
|
next = value.charAt(index + 1)
|
|
|
|
if (character === graveAccent) {
|
|
count++
|
|
tickQueue += character
|
|
} else {
|
|
count = 0
|
|
queue += character
|
|
}
|
|
|
|
if (count && next !== graveAccent) {
|
|
if (count === openingCount) {
|
|
subvalue += queue + tickQueue
|
|
found = true
|
|
break
|
|
}
|
|
|
|
queue += tickQueue
|
|
tickQueue = ''
|
|
}
|
|
|
|
index++
|
|
}
|
|
|
|
if (!found) {
|
|
if (openingCount % 2 !== 0) {
|
|
return
|
|
}
|
|
|
|
queue = ''
|
|
}
|
|
|
|
/* istanbul ignore if - never used (yet) */
|
|
if (silent) {
|
|
return true
|
|
}
|
|
|
|
contentQueue = ''
|
|
subqueue = ''
|
|
length = queue.length
|
|
index = -1
|
|
|
|
while (++index < length) {
|
|
character = queue.charAt(index)
|
|
|
|
if (whitespace(character)) {
|
|
subqueue += character
|
|
continue
|
|
}
|
|
|
|
if (subqueue) {
|
|
if (contentQueue) {
|
|
contentQueue += subqueue
|
|
}
|
|
|
|
subqueue = ''
|
|
}
|
|
|
|
contentQueue += character
|
|
}
|
|
|
|
return eat(subvalue)({type: 'inlineCode', value: contentQueue})
|
|
}
|