|
|
|
// Process ~~deleted text~~
|
|
|
|
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
module.exports = function del(state, silent) {
|
|
|
|
var found,
|
|
|
|
pos,
|
|
|
|
stack,
|
|
|
|
max = state.posMax,
|
|
|
|
start = state.pos,
|
|
|
|
lastChar,
|
|
|
|
nextChar;
|
|
|
|
|
|
|
|
if (state.src.charCodeAt(start) !== 0x7E/* ~ */) { return false; }
|
|
|
|
if (silent) { return false; } // don't run any pairs in validation mode
|
|
|
|
if (start + 4 >= max) { return false; }
|
|
|
|
if (state.src.charCodeAt(start + 1) !== 0x7E/* ~ */) { return false; }
|
|
|
|
if (state.level >= state.options.maxNesting) { return false; }
|
|
|
|
|
|
|
|
lastChar = start > 0 ? state.src.charCodeAt(start - 1) : -1;
|
|
|
|
nextChar = state.src.charCodeAt(start + 2);
|
|
|
|
|
|
|
|
if (lastChar === 0x7E/* ~ */) { return false; }
|
|
|
|
if (nextChar === 0x7E/* ~ */) { return false; }
|
|
|
|
if (nextChar === 0x20 || nextChar === 0x0A) { return false; }
|
|
|
|
|
|
|
|
pos = start + 2;
|
|
|
|
while (pos < max && state.src.charCodeAt(pos) === 0x7E/* ~ */) { pos++; }
|
|
|
|
if (pos > start + 3) {
|
|
|
|
// sequence of 4+ markers taking as literal, same as in a emphasis
|
|
|
|
state.pos += pos - start;
|
|
|
|
if (!silent) { state.pending += state.src.slice(start, pos); }
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
state.pos = start + 2;
|
|
|
|
stack = 1;
|
|
|
|
|
|
|
|
while (state.pos + 1 < max) {
|
|
|
|
if (state.src.charCodeAt(state.pos) === 0x7E/* ~ */) {
|
|
|
|
if (state.src.charCodeAt(state.pos + 1) === 0x7E/* ~ */) {
|
|
|
|
lastChar = state.src.charCodeAt(state.pos - 1);
|
|
|
|
nextChar = state.pos + 2 < max ? state.src.charCodeAt(state.pos + 2) : -1;
|
|
|
|
if (nextChar !== 0x7E/* ~ */ && lastChar !== 0x7E/* ~ */) {
|
|
|
|
if (lastChar !== 0x20 && lastChar !== 0x0A) {
|
|
|
|
// closing '~~'
|
|
|
|
stack--;
|
|
|
|
} else if (nextChar !== 0x20 && nextChar !== 0x0A) {
|
|
|
|
// opening '~~'
|
|
|
|
stack++;
|
|
|
|
} // else {
|
|
|
|
// // standalone ' ~~ ' indented with spaces
|
|
|
|
//}
|
|
|
|
if (stack <= 0) {
|
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
state.parser.skipToken(state);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!found) {
|
|
|
|
// parser failed to find ending tag, so it's not valid emphasis
|
|
|
|
state.pos = start;
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
// found!
|
|
|
|
state.posMax = state.pos;
|
|
|
|
state.pos = start + 2;
|
|
|
|
|
|
|
|
if (!silent) {
|
|
|
|
state.push({ type: 'del_open', level: state.level++ });
|
|
|
|
state.parser.tokenize(state);
|
|
|
|
state.push({ type: 'del_close', level: --state.level });
|
|
|
|
}
|
|
|
|
|
|
|
|
state.pos = state.posMax + 2;
|
|
|
|
state.posMax = max;
|
|
|
|
return true;
|
|
|
|
};
|