handle intermixed parsing for tex and comments

This commit is contained in:
Eric Rykwalder 2022-03-11 18:52:43 -05:00
parent 7ed8ebf669
commit 47bed7489e

View file

@ -19,6 +19,8 @@ declare module "@lezer/markdown" {
} }
} }
const CommentDelim = { resolve: "Comment", mark: "CommentMarker" };
export const Comment: MarkdownConfig = { export const Comment: MarkdownConfig = {
defineNodes: ["Comment", "CommentMarker"], defineNodes: ["Comment", "CommentMarker"],
parseBlock: [ parseBlock: [
@ -66,18 +68,17 @@ export const Comment: MarkdownConfig = {
{ {
name: "CommentInline", name: "CommentInline",
parse(cx: InlineContext, next: number, pos: number) { parse(cx: InlineContext, next: number, pos: number) {
let match = /^%%[^\n]*[^\n\\]%%/.exec(cx.text.slice(pos - cx.offset)); if (next == 37 && cx.char(pos + 1) == 37) {
if (!match) { let canClose = true;
return -1; if (
cx.slice(cx.offset, pos).lastIndexOf("\n") >
cx.slice(cx.offset, pos).lastIndexOf("%%")
) {
canClose = false;
}
return cx.addDelimiter(CommentDelim, pos, pos + 2, true, canClose);
} }
const start = pos; return -1;
const end = pos + match[0].length;
return cx.addElement(
cx.elt("Comment", start, end, [
cx.elt("CommentMarker", start, start + 2),
cx.elt("CommentMarker", end - 2, end),
])
);
}, },
}, },
], ],
@ -396,6 +397,8 @@ export const TaskList: MarkdownConfig = {
}; };
/* End Copyright */ /* End Copyright */
const TexDelim = { resolve: "TexInline", mark: "TexMarker" };
export const Tex: MarkdownConfig = { export const Tex: MarkdownConfig = {
defineNodes: ["TexBlock", "TexInline", "TexMarker"], defineNodes: ["TexBlock", "TexInline", "TexMarker"],
parseBlock: [ parseBlock: [
@ -443,21 +446,15 @@ export const Tex: MarkdownConfig = {
parseInline: [ parseInline: [
{ {
name: "TexInline", name: "TexInline",
parse(cx: InlineContext, _, pos: number) { parse(cx: InlineContext, next: number, pos: number) {
let match = /^\$(?:[^$\t ][^$]*)?[^$\t \\]\$(\D|$)/.exec( if (next != 36 /* $ */) {
cx.text.slice(pos - cx.offset)
);
if (!match) {
return -1; return -1;
} }
const start = pos; const before = cx.slice(pos - 1, pos);
const end = start + match[0].length - match[1].length; const after = cx.slice(pos + 1, pos + 2);
return cx.addElement( const canClose = /[^ \t]/.test(before) && !/\d/.test(after);
cx.elt("TexInline", start, end, [ const canOpen = /[^$ \t]/.test(after);
cx.elt("TexMarker", start, start + 1), return cx.addDelimiter(TexDelim, pos, pos + 1, canOpen, canClose);
cx.elt("TexMarker", end - 1, end),
])
);
}, },
}, },
], ],