UNPKG

@mapbox/jsxtreme-markdown

Version:
103 lines (79 loc) 1.84 kB
'use strict'; module.exports = setextHeading; var lineFeed = '\n'; var tab = '\t'; var space = ' '; var equalsTo = '='; var dash = '-'; var maxIndent = 3; var equalsToDepth = 1; var dashDepth = 2; function setextHeading(eat, value, silent) { var self = this; var now = eat.now(); var length = value.length; var index = -1; var subvalue = ''; var content; var queue; var character; var marker; var depth; // Eat initial indentation. while (++index < length) { character = value.charAt(index); if (character !== space || index >= maxIndent) { index--; break; } subvalue += character; } // Eat content. content = ''; queue = ''; while (++index < length) { character = value.charAt(index); if (character === lineFeed) { index--; break; } if (character === space || character === tab) { queue += character; } else { content += queue + character; queue = ''; } } now.column += subvalue.length; now.offset += subvalue.length; subvalue += content + queue; // Ensure the content is followed by a newline and a valid marker. character = value.charAt(++index); marker = value.charAt(++index); if (character !== lineFeed || (marker !== equalsTo && marker !== dash)) { return; } subvalue += character; // Eat Setext-line. queue = marker; depth = marker === equalsTo ? equalsToDepth : dashDepth; while (++index < length) { character = value.charAt(index); if (character !== marker) { if (character !== lineFeed) { return; } index--; break; } queue += character; } if (silent) { return true; } return eat(subvalue + queue)({ type: 'heading', depth: depth, children: self.tokenizeInline(content, now), }); }