UNPKG

@mapbox/jsxtreme-markdown

Version:
136 lines (104 loc) 2.56 kB
'use strict'; module.exports = atxHeading; var lineFeed = '\n'; var tab = '\t'; var space = ' '; var numberSign = '#'; var maxFenceCount = 6; function atxHeading(eat, value, silent) { var self = this; var pedantic = self.options.pedantic; var length = value.length + 1; var index = -1; var now = eat.now(); var subvalue = ''; var content = ''; var character; var queue; var depth; // Eat initial spacing. while (++index < length) { character = value.charAt(index); if (character !== space && character !== tab) { index--; break; } subvalue += character; } // Eat hashes. depth = 0; while (++index <= length) { character = value.charAt(index); if (character !== numberSign) { index--; break; } subvalue += character; depth++; } if (depth > maxFenceCount) { return; } if (!depth || (!pedantic && value.charAt(index + 1) === numberSign)) { return; } length = value.length + 1; // Eat intermediate white-space. queue = ''; while (++index < length) { character = value.charAt(index); if (character !== space && character !== tab) { index--; break; } queue += character; } // Exit when not in pedantic mode without spacing. if (!pedantic && queue.length === 0 && character && character !== lineFeed) { return; } if (silent) { return true; } // Eat content. subvalue += queue; queue = ''; content = ''; while (++index < length) { character = value.charAt(index); if (!character || character === lineFeed) { break; } if (character !== space && character !== tab && character !== numberSign) { content += queue + character; queue = ''; continue; } while (character === space || character === tab) { queue += character; character = value.charAt(++index); } // `#` without a queue is part of the content. if (!pedantic && content && !queue && character === numberSign) { content += character; continue; } while (character === numberSign) { queue += character; character = value.charAt(++index); } while (character === space || character === tab) { queue += character; character = value.charAt(++index); } index--; } now.column += subvalue.length; now.offset += subvalue.length; subvalue += content + queue; return eat(subvalue)({ type: 'heading', depth: depth, children: self.tokenizeInline(content, now), }); }