discourse/app/assets/javascripts/pretty-text/engines/discourse-markdown/html-img.js

80 lines
1.8 KiB
JavaScript

// special handling for IMG tags on a line by themselves
// we always have to handle it as so it is an inline
// see: https://talk.commonmark.org/t/newline-and-img-tags/2511
const REGEX = /^<img.*\\?>\s*$/i;
function rule(state, startLine, endLine) {
let nextLine,
token,
lineText,
pos = state.bMarks[startLine] + state.tShift[startLine],
max = state.eMarks[startLine];
// if it's indented more than 3 spaces, it should be a code block
if (state.sCount[startLine] - state.blkIndent >= 4) {
return false;
}
if (!state.md.options.html) {
return false;
}
if (state.src.charCodeAt(pos) !== 0x3c /* < */) {
return false;
}
let pos1 = state.src.charCodeAt(pos + 1);
if (pos1 !== 73 /* I */ && pos1 !== 105 /* i */) {
return false;
}
lineText = state.src.slice(pos, max);
if (!REGEX.test(lineText)) {
return false;
}
let lines = [];
lines.push(lineText);
nextLine = startLine + 1;
for (; nextLine < endLine; nextLine++) {
pos = state.bMarks[nextLine] + state.tShift[nextLine];
max = state.eMarks[nextLine];
lineText = state.src.slice(pos, max);
if (lineText.trim() === "") {
break;
}
if (!REGEX.test(lineText)) {
break;
}
lines.push(lineText);
}
state.line = nextLine;
let oldParentType = state.parentType;
state.parentType = "paragraph";
token = state.push("paragraph_open", "p", 1);
token.map = [startLine, state.line];
token = state.push("inline", "", 0);
token.content = lines.join("\n");
token.map = [startLine, state.line];
token.children = [];
state.push("paragraph_close", "p", -1);
state.parentType = oldParentType;
return true;
}
export function setup(helper) {
helper.registerPlugin((md) => {
md.block.ruler.before("html_block", "html_img", rule, { alt: ["fence"] });
});
}