| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 | // ~~strike through~~//'use strict';// Insert each marker as a separate text token, and add it to delimiter list//module.exports.tokenize = function strikethrough(state, silent) {  var i, scanned, token, len, ch,      start = state.pos,      marker = state.src.charCodeAt(start);  if (silent) { return false; }  if (marker !== 0x7E/* ~ */) { return false; }  scanned = state.scanDelims(state.pos, true);  len = scanned.length;  ch = String.fromCharCode(marker);  if (len < 2) { return false; }  if (len % 2) {    token         = state.push('text', '', 0);    token.content = ch;    len--;  }  for (i = 0; i < len; i += 2) {    token         = state.push('text', '', 0);    token.content = ch + ch;    state.delimiters.push({      marker: marker,      length: 0,     // disable "rule of 3" length checks meant for emphasis      token:  state.tokens.length - 1,      end:    -1,      open:   scanned.can_open,      close:  scanned.can_close    });  }  state.pos += scanned.length;  return true;};function postProcess(state, delimiters) {  var i, j,      startDelim,      endDelim,      token,      loneMarkers = [],      max = delimiters.length;  for (i = 0; i < max; i++) {    startDelim = delimiters[i];    if (startDelim.marker !== 0x7E/* ~ */) {      continue;    }    if (startDelim.end === -1) {      continue;    }    endDelim = delimiters[startDelim.end];    token         = state.tokens[startDelim.token];    token.type    = 's_open';    token.tag     = 's';    token.nesting = 1;    token.markup  = '~~';    token.content = '';    token         = state.tokens[endDelim.token];    token.type    = 's_close';    token.tag     = 's';    token.nesting = -1;    token.markup  = '~~';    token.content = '';    if (state.tokens[endDelim.token - 1].type === 'text' &&        state.tokens[endDelim.token - 1].content === '~') {      loneMarkers.push(endDelim.token - 1);    }  }  // If a marker sequence has an odd number of characters, it's splitted  // like this: `~~~~~` -> `~` + `~~` + `~~`, leaving one marker at the  // start of the sequence.  //  // So, we have to move all those markers after subsequent s_close tags.  //  while (loneMarkers.length) {    i = loneMarkers.pop();    j = i + 1;    while (j < state.tokens.length && state.tokens[j].type === 's_close') {      j++;    }    j--;    if (i !== j) {      token = state.tokens[j];      state.tokens[j] = state.tokens[i];      state.tokens[i] = token;    }  }}// Walk through delimiter list and replace text tokens with tags//module.exports.postProcess = function strikethrough(state) {  var curr,      tokens_meta = state.tokens_meta,      max = state.tokens_meta.length;  postProcess(state, state.delimiters);  for (curr = 0; curr < max; curr++) {    if (tokens_meta[curr] && tokens_meta[curr].delimiters) {      postProcess(state, tokens_meta[curr].delimiters);    }  }};
 |