| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- 'use strict';
- var trim = require('trim-trailing-lines');
- module.exports = fencedCode;
- var C_NEWLINE = '\n';
- var C_TAB = '\t';
- var C_SPACE = ' ';
- var C_TILDE = '~';
- var C_TICK = '`';
- var MIN_FENCE_COUNT = 3;
- var CODE_INDENT_COUNT = 4;
- function fencedCode(eat, value, silent) {
- var self = this;
- var settings = self.options;
- var length = value.length + 1;
- var index = 0;
- var subvalue = '';
- var fenceCount;
- var marker;
- var character;
- var flag;
- var queue;
- var content;
- var exdentedContent;
- var closing;
- var exdentedClosing;
- var indent;
- var now;
- if (!settings.gfm) {
- return;
- }
- /* Eat initial spacing. */
- while (index < length) {
- character = value.charAt(index);
- if (character !== C_SPACE && character !== C_TAB) {
- break;
- }
- subvalue += character;
- index++;
- }
- indent = index;
- /* Eat the fence. */
- character = value.charAt(index);
- if (character !== C_TILDE && character !== C_TICK) {
- return;
- }
- index++;
- marker = character;
- fenceCount = 1;
- subvalue += character;
- while (index < length) {
- character = value.charAt(index);
- if (character !== marker) {
- break;
- }
- subvalue += character;
- fenceCount++;
- index++;
- }
- if (fenceCount < MIN_FENCE_COUNT) {
- return;
- }
- /* Eat spacing before flag. */
- while (index < length) {
- character = value.charAt(index);
- if (character !== C_SPACE && character !== C_TAB) {
- break;
- }
- subvalue += character;
- index++;
- }
- /* Eat flag. */
- flag = '';
- queue = '';
- while (index < length) {
- character = value.charAt(index);
- if (
- character === C_NEWLINE ||
- character === C_TILDE ||
- character === C_TICK
- ) {
- break;
- }
- if (character === C_SPACE || character === C_TAB) {
- queue += character;
- } else {
- flag += queue + character;
- queue = '';
- }
- index++;
- }
- character = value.charAt(index);
- if (character && character !== C_NEWLINE) {
- return;
- }
- if (silent) {
- return true;
- }
- now = eat.now();
- now.column += subvalue.length;
- now.offset += subvalue.length;
- subvalue += flag;
- flag = self.decode.raw(self.unescape(flag), now);
- if (queue) {
- subvalue += queue;
- }
- queue = '';
- closing = '';
- exdentedClosing = '';
- content = '';
- exdentedContent = '';
- /* Eat content. */
- while (index < length) {
- character = value.charAt(index);
- content += closing;
- exdentedContent += exdentedClosing;
- closing = '';
- exdentedClosing = '';
- if (character !== C_NEWLINE) {
- content += character;
- exdentedClosing += character;
- index++;
- continue;
- }
- /* Add the newline to `subvalue` if its the first
- * character. Otherwise, add it to the `closing`
- * queue. */
- if (content) {
- closing += character;
- exdentedClosing += character;
- } else {
- subvalue += character;
- }
- queue = '';
- index++;
- while (index < length) {
- character = value.charAt(index);
- if (character !== C_SPACE) {
- break;
- }
- queue += character;
- index++;
- }
- closing += queue;
- exdentedClosing += queue.slice(indent);
- if (queue.length >= CODE_INDENT_COUNT) {
- continue;
- }
- queue = '';
- while (index < length) {
- character = value.charAt(index);
- if (character !== marker) {
- break;
- }
- queue += character;
- index++;
- }
- closing += queue;
- exdentedClosing += queue;
- if (queue.length < fenceCount) {
- continue;
- }
- queue = '';
- while (index < length) {
- character = value.charAt(index);
- if (character !== C_SPACE && character !== C_TAB) {
- break;
- }
- closing += character;
- exdentedClosing += character;
- index++;
- }
- if (!character || character === C_NEWLINE) {
- break;
- }
- }
- subvalue += content + closing;
- return eat(subvalue)({
- type: 'code',
- lang: flag || null,
- value: trim(exdentedContent)
- });
- }
|