2022-04-25 08:33:38 +00:00
|
|
|
import {
|
|
|
|
BlockContext,
|
2022-10-10 12:50:21 +00:00
|
|
|
Language,
|
|
|
|
LanguageDescription,
|
|
|
|
LanguageSupport,
|
2022-04-25 08:33:38 +00:00
|
|
|
LeafBlock,
|
|
|
|
LeafBlockParser,
|
2022-10-10 12:50:21 +00:00
|
|
|
markdown,
|
2022-04-25 08:33:38 +00:00
|
|
|
MarkdownConfig,
|
|
|
|
parseCode,
|
2022-10-10 12:50:21 +00:00
|
|
|
styleTags,
|
2022-04-25 08:33:38 +00:00
|
|
|
Table,
|
2022-10-10 12:50:21 +00:00
|
|
|
tags as t,
|
2022-04-25 08:33:38 +00:00
|
|
|
TaskList,
|
2022-10-10 12:50:21 +00:00
|
|
|
} from "./deps.ts";
|
|
|
|
import * as ct from "./customtags.ts";
|
2022-04-25 08:33:38 +00:00
|
|
|
import {
|
|
|
|
MDExt,
|
|
|
|
mdExtensionStyleTags,
|
|
|
|
mdExtensionSyntaxConfig,
|
2022-10-10 12:50:21 +00:00
|
|
|
} from "./markdown_ext.ts";
|
2022-03-20 08:56:28 +00:00
|
|
|
|
2022-04-10 09:04:07 +00:00
|
|
|
export const pageLinkRegex = /^\[\[([^\]]+)\]\]/;
|
2022-04-08 15:46:09 +00:00
|
|
|
|
2022-03-20 08:56:28 +00:00
|
|
|
const WikiLink: MarkdownConfig = {
|
|
|
|
defineNodes: ["WikiLink", "WikiLinkPage"],
|
|
|
|
parseInline: [
|
|
|
|
{
|
|
|
|
name: "WikiLink",
|
|
|
|
parse(cx, next, pos) {
|
|
|
|
let match: RegExpMatchArray | null;
|
|
|
|
if (
|
|
|
|
next != 91 /* '[' */ ||
|
2022-04-10 09:04:07 +00:00
|
|
|
!(match = pageLinkRegex.exec(cx.slice(pos, cx.end)))
|
2022-03-20 08:56:28 +00:00
|
|
|
) {
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
return cx.addElement(
|
2022-04-04 09:51:41 +00:00
|
|
|
cx.elt("WikiLink", pos, pos + match[0].length, [
|
2022-03-20 08:56:28 +00:00
|
|
|
cx.elt("WikiLinkPage", pos + 2, pos + match[0].length - 2),
|
2022-10-10 12:50:21 +00:00
|
|
|
]),
|
2022-03-20 08:56:28 +00:00
|
|
|
);
|
|
|
|
},
|
|
|
|
after: "Emphasis",
|
|
|
|
},
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
2022-07-04 13:07:27 +00:00
|
|
|
const HighlightDelim = { resolve: "Highlight", mark: "HighlightMark" };
|
|
|
|
|
|
|
|
export const Strikethrough: MarkdownConfig = {
|
|
|
|
defineNodes: [
|
|
|
|
{
|
|
|
|
name: "Highlight",
|
|
|
|
style: { "Highlight/...": ct.Highlight },
|
|
|
|
},
|
|
|
|
{
|
|
|
|
name: "HighlightMark",
|
|
|
|
style: t.processingInstruction,
|
|
|
|
},
|
|
|
|
],
|
|
|
|
parseInline: [
|
|
|
|
{
|
|
|
|
name: "Highlight",
|
|
|
|
parse(cx, next, pos) {
|
|
|
|
if (next != 61 /* '=' */ || cx.char(pos + 1) != 61) return -1;
|
|
|
|
return cx.addDelimiter(HighlightDelim, pos, pos + 2, true, true);
|
|
|
|
},
|
|
|
|
after: "Emphasis",
|
|
|
|
},
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
2022-03-20 08:56:28 +00:00
|
|
|
class CommentParser implements LeafBlockParser {
|
|
|
|
nextLine() {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
finish(cx: BlockContext, leaf: LeafBlock) {
|
|
|
|
cx.addLeafElement(
|
|
|
|
leaf,
|
|
|
|
cx.elt("Comment", leaf.start, leaf.start + leaf.content.length, [
|
|
|
|
// cx.elt("CommentMarker", leaf.start, leaf.start + 3),
|
|
|
|
...cx.parser.parseInline(leaf.content.slice(3), leaf.start + 3),
|
2022-10-10 12:50:21 +00:00
|
|
|
]),
|
2022-03-20 08:56:28 +00:00
|
|
|
);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
export const Comment: MarkdownConfig = {
|
|
|
|
defineNodes: [{ name: "Comment", block: true }],
|
|
|
|
parseBlock: [
|
|
|
|
{
|
|
|
|
name: "Comment",
|
|
|
|
leaf(cx, leaf) {
|
|
|
|
return /^%%\s/.test(leaf.content) ? new CommentParser() : null;
|
|
|
|
},
|
|
|
|
after: "SetextHeading",
|
|
|
|
},
|
|
|
|
],
|
|
|
|
};
|
|
|
|
|
2022-04-11 18:34:09 +00:00
|
|
|
export default function buildMarkdown(mdExtensions: MDExt[]): Language {
|
2022-09-13 06:41:01 +00:00
|
|
|
return markdown({
|
|
|
|
extensions: [
|
2022-04-11 18:34:09 +00:00
|
|
|
WikiLink,
|
|
|
|
TaskList,
|
|
|
|
Comment,
|
2022-07-04 13:07:27 +00:00
|
|
|
Strikethrough,
|
2022-04-20 08:56:43 +00:00
|
|
|
Table,
|
2022-04-11 18:34:09 +00:00
|
|
|
...mdExtensions.map(mdExtensionSyntaxConfig),
|
2022-06-14 07:45:22 +00:00
|
|
|
// parseCode({
|
|
|
|
// codeParser: getCodeParser([
|
|
|
|
// LanguageDescription.of({
|
|
|
|
// name: "yaml",
|
|
|
|
// alias: ["meta", "data"],
|
|
|
|
// support: new LanguageSupport(StreamLanguage.define(yaml)),
|
|
|
|
// }),
|
|
|
|
// LanguageDescription.of({
|
|
|
|
// name: "javascript",
|
|
|
|
// alias: ["js"],
|
|
|
|
// support: new LanguageSupport(javascriptLanguage),
|
|
|
|
// }),
|
|
|
|
// LanguageDescription.of({
|
|
|
|
// name: "typescript",
|
|
|
|
// alias: ["ts"],
|
|
|
|
// support: new LanguageSupport(typescriptLanguage),
|
|
|
|
// }),
|
|
|
|
// ]),
|
|
|
|
// }),
|
2022-04-11 18:34:09 +00:00
|
|
|
{
|
|
|
|
props: [
|
|
|
|
styleTags({
|
|
|
|
WikiLink: ct.WikiLinkTag,
|
|
|
|
WikiLinkPage: ct.WikiLinkPageTag,
|
|
|
|
Task: ct.TaskTag,
|
|
|
|
TaskMarker: ct.TaskMarkerTag,
|
|
|
|
Comment: ct.CommentTag,
|
2022-04-20 08:56:43 +00:00
|
|
|
"TableDelimiter SubscriptMark SuperscriptMark StrikethroughMark":
|
|
|
|
t.processingInstruction,
|
|
|
|
"TableHeader/...": t.heading,
|
|
|
|
TableCell: t.content,
|
2022-04-24 16:06:34 +00:00
|
|
|
CodeInfo: ct.CodeInfoTag,
|
2022-08-29 14:48:52 +00:00
|
|
|
HorizontalRule: ct.HorizontalRuleTag,
|
2022-04-11 18:34:09 +00:00
|
|
|
}),
|
|
|
|
...mdExtensions.map((mdExt) =>
|
|
|
|
styleTags(mdExtensionStyleTags(mdExt))
|
|
|
|
),
|
|
|
|
],
|
|
|
|
},
|
2022-09-13 06:41:01 +00:00
|
|
|
],
|
|
|
|
}).language;
|
2022-04-11 18:34:09 +00:00
|
|
|
}
|