|
|
|
// For each opening emphasis-like marker find a matching closing one
|
|
|
|
//
|
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
|
|
module.exports = function link_pairs(state) {
|
|
|
|
var i, j, lastDelim, currDelim,
|
|
|
|
delimiters = state.delimiters,
|
|
|
|
max = state.delimiters.length;
|
|
|
|
|
|
|
|
for (i = 0; i < max; i++) {
|
|
|
|
lastDelim = delimiters[i];
|
|
|
|
|
|
|
|
if (!lastDelim.close) { continue; }
|
|
|
|
|
|
|
|
j = i - lastDelim.jump - 1;
|
|
|
|
|
|
|
|
while (j >= 0) {
|
|
|
|
currDelim = delimiters[j];
|
|
|
|
|
|
|
|
if (currDelim.open &&
|
|
|
|
currDelim.marker === lastDelim.marker &&
|
|
|
|
currDelim.end < 0 &&
|
|
|
|
currDelim.level === lastDelim.level) {
|
|
|
|
|
|
|
|
var odd_match = false;
|
|
|
|
|
|
|
|
// typeofs are for backward compatibility with plugins
|
|
|
|
if ((currDelim.close || lastDelim.open) &&
|
|
|
|
typeof currDelim.length !== 'undefined' &&
|
|
|
|
typeof lastDelim.length !== 'undefined') {
|
|
|
|
|
|
|
|
// from spec:
|
|
|
|
// sum of the lengths [...] must not be a multiple of 3
|
|
|
|
// unless both lengths are multiples of 3
|
|
|
|
if ((currDelim.length + lastDelim.length) % 3 === 0) {
|
|
|
|
if (currDelim.length % 3 !== 0 || lastDelim.length % 3 !== 0) {
|
|
|
|
odd_match = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!odd_match) {
|
|
|
|
lastDelim.jump = i - j;
|
|
|
|
lastDelim.open = false;
|
|
|
|
currDelim.end = i;
|
|
|
|
currDelim.jump = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
j -= currDelim.jump + 1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|