mirror of https://github.com/lukechilds/node.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
2.0 KiB
120 lines
2.0 KiB
/**
|
|
* @author Titus Wormer
|
|
* @copyright 2015 Titus Wormer
|
|
* @license MIT
|
|
* @module remark:parse:tokenize:code-inline
|
|
* @fileoverview Tokenise inline code.
|
|
*/
|
|
|
|
'use strict';
|
|
|
|
var whitespace = require('is-whitespace-character');
|
|
var locate = require('../locate/code-inline');
|
|
|
|
module.exports = inlineCode;
|
|
inlineCode.locator = locate;
|
|
|
|
var C_TICK = '`';
|
|
|
|
/* Tokenise inline code. */
|
|
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) !== C_TICK) {
|
|
break;
|
|
}
|
|
|
|
queue += C_TICK;
|
|
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 === C_TICK) {
|
|
count++;
|
|
tickQueue += character;
|
|
} else {
|
|
count = 0;
|
|
queue += character;
|
|
}
|
|
|
|
if (count && next !== C_TICK) {
|
|
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
|
|
});
|
|
}
|
|
|