| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | // lheading (---, ===)'use strict';module.exports = function lheading(state, startLine, endLine/*, silent*/) {  var content, terminate, i, l, token, pos, max, level, marker,      nextLine = startLine + 1, oldParentType,      terminatorRules = state.md.block.ruler.getRules('paragraph');  // if it's indented more than 3 spaces, it should be a code block  if (state.sCount[startLine] - state.blkIndent >= 4) { return false; }  oldParentType = state.parentType;  state.parentType = 'paragraph'; // use paragraph to match terminatorRules  // jump line-by-line until empty one or EOF  for (; nextLine < endLine && !state.isEmpty(nextLine); nextLine++) {    // this would be a code block normally, but after paragraph    // it's considered a lazy continuation regardless of what's there    if (state.sCount[nextLine] - state.blkIndent > 3) { continue; }    //    // Check for underline in setext header    //    if (state.sCount[nextLine] >= state.blkIndent) {      pos = state.bMarks[nextLine] + state.tShift[nextLine];      max = state.eMarks[nextLine];      if (pos < max) {        marker = state.src.charCodeAt(pos);        if (marker === 0x2D/* - */ || marker === 0x3D/* = */) {          pos = state.skipChars(pos, marker);          pos = state.skipSpaces(pos);          if (pos >= max) {            level = (marker === 0x3D/* = */ ? 1 : 2);            break;          }        }      }    }    // quirk for blockquotes, this line should already be checked by that rule    if (state.sCount[nextLine] < 0) { continue; }    // Some tags can terminate paragraph without empty line.    terminate = false;    for (i = 0, l = terminatorRules.length; i < l; i++) {      if (terminatorRules[i](state, nextLine, endLine, true)) {        terminate = true;        break;      }    }    if (terminate) { break; }  }  if (!level) {    // Didn't find valid underline    return false;  }  content = state.getLines(startLine, nextLine, state.blkIndent, false).trim();  state.line = nextLine + 1;  token          = state.push('heading_open', 'h' + String(level), 1);  token.markup   = String.fromCharCode(marker);  token.map      = [ startLine, state.line ];  token          = state.push('inline', '', 0);  token.content  = content;  token.map      = [ startLine, state.line - 1 ];  token.children = [];  token          = state.push('heading_close', 'h' + String(level), -1);  token.markup   = String.fromCharCode(marker);  state.parentType = oldParentType;  return true;};
 |