79 lines
1.6 KiB
JavaScript
79 lines
1.6 KiB
JavaScript
|
export default function(md) {
|
||
|
function tokenize(state, silent) {
|
||
|
let token;
|
||
|
const start = state.pos;
|
||
|
const marker = state.src.charCodeAt(start);
|
||
|
|
||
|
if (silent) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
// :
|
||
|
if (marker !== 58) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
const scanned = state.scanDelims(state.pos, true);
|
||
|
const len = scanned.length;
|
||
|
const ch = String.fromCharCode(marker);
|
||
|
|
||
|
for (let i = 0; i < len; i += 1) {
|
||
|
token = state.push('text', '', 0);
|
||
|
token.content = ch;
|
||
|
|
||
|
state.delimiters.push({
|
||
|
marker,
|
||
|
jump: i,
|
||
|
token: state.tokens.length - 1,
|
||
|
level: state.level,
|
||
|
end: -1,
|
||
|
open: scanned.can_open,
|
||
|
close: scanned.can_close
|
||
|
});
|
||
|
}
|
||
|
|
||
|
state.pos += scanned.length;
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
function postProcess(state) {
|
||
|
let startDelim;
|
||
|
let endDelim;
|
||
|
let token;
|
||
|
const { delimiters } = state;
|
||
|
const max = delimiters.length;
|
||
|
|
||
|
for (const i = 0; i < max; i++) { // eslint-disable-line
|
||
|
startDelim = delimiters[i];
|
||
|
|
||
|
// :
|
||
|
if (startDelim.marker !== 58) {
|
||
|
continue; // eslint-disable-line
|
||
|
}
|
||
|
|
||
|
if (startDelim.end === -1) {
|
||
|
continue; // eslint-disable-line
|
||
|
}
|
||
|
|
||
|
endDelim = delimiters[startDelim.end];
|
||
|
|
||
|
token = state.tokens[startDelim.token];
|
||
|
token.type = 'emoji_open';
|
||
|
token.tag = 'emoji';
|
||
|
token.nesting = 1;
|
||
|
token.markup = ':';
|
||
|
token.content = '';
|
||
|
|
||
|
token = state.tokens[endDelim.token];
|
||
|
token.type = 'emoji_close';
|
||
|
token.tag = 'emoji';
|
||
|
token.nesting = -1;
|
||
|
token.markup = ':';
|
||
|
token.content = '';
|
||
|
}
|
||
|
}
|
||
|
|
||
|
md.inline.ruler.before('emphasis', 'emoji', tokenize);
|
||
|
md.inline.ruler2.before('emphasis', 'emoji', postProcess);
|
||
|
}
|