You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
142 lines
3.9 KiB
142 lines
3.9 KiB
|
|
/*! markdown-it-mark 3.0.1 https://github.com/markdown-it/markdown-it-mark @license MIT */ |
|
(function (global, factory) { |
|
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : |
|
typeof define === 'function' && define.amd ? define(factory) : |
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.markdownitMark = factory()); |
|
}(this, (function () { 'use strict'; |
|
|
|
var markdownItMark = function ins_plugin(md) { |
|
// Insert each marker as a separate text token, and add it to delimiter list |
|
// |
|
function tokenize(state, silent) { |
|
var i, scanned, token, len, ch, |
|
start = state.pos, |
|
marker = state.src.charCodeAt(start); |
|
|
|
if (silent) { return false; } |
|
|
|
if (marker !== 0x3D/* = */) { 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; |
|
|
|
if (!scanned.can_open && !scanned.can_close) { continue; } |
|
|
|
state.delimiters.push({ |
|
marker: marker, |
|
length: 0, // disable "rule of 3" length checks meant for emphasis |
|
jump: i / 2, // 1 delimiter = 2 characters |
|
token: state.tokens.length - 1, |
|
end: -1, |
|
open: scanned.can_open, |
|
close: scanned.can_close |
|
}); |
|
} |
|
|
|
state.pos += scanned.length; |
|
|
|
return true; |
|
} |
|
|
|
|
|
// Walk through delimiter list and replace text tokens with tags |
|
// |
|
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 !== 0x3D/* = */) { |
|
continue; |
|
} |
|
|
|
if (startDelim.end === -1) { |
|
continue; |
|
} |
|
|
|
endDelim = delimiters[startDelim.end]; |
|
|
|
token = state.tokens[startDelim.token]; |
|
token.type = 'mark_open'; |
|
token.tag = 'mark'; |
|
token.nesting = 1; |
|
token.markup = '=='; |
|
token.content = ''; |
|
|
|
token = state.tokens[endDelim.token]; |
|
token.type = 'mark_close'; |
|
token.tag = 'mark'; |
|
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 === 'mark_close') { |
|
j++; |
|
} |
|
|
|
j--; |
|
|
|
if (i !== j) { |
|
token = state.tokens[j]; |
|
state.tokens[j] = state.tokens[i]; |
|
state.tokens[i] = token; |
|
} |
|
} |
|
} |
|
|
|
md.inline.ruler.before('emphasis', 'mark', tokenize); |
|
md.inline.ruler2.before('emphasis', 'mark', function (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); |
|
} |
|
} |
|
}); |
|
}; |
|
|
|
return markdownItMark; |
|
|
|
})));
|
|
|