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