mirror of
https://github.com/TriliumNext/Notes.git
synced 2025-08-11 19:22:31 +08:00
feat(mermaid): start implementing a basic linter
This commit is contained in:
parent
c416fca88a
commit
44db1545a1
2
src/public/app/types.d.ts
vendored
2
src/public/app/types.d.ts
vendored
@ -207,6 +207,8 @@ declare global {
|
|||||||
modeInfo: ModeInfo[];
|
modeInfo: ModeInfo[];
|
||||||
findModeByMIME(mime: string): ModeInfo;
|
findModeByMIME(mime: string): ModeInfo;
|
||||||
autoLoadMode(instance: CodeMirrorInstance, mode: string)
|
autoLoadMode(instance: CodeMirrorInstance, mode: string)
|
||||||
|
registerHelper(type: string, filter: string | null, callback: (text: string, options: object) => unknown);
|
||||||
|
Pos(line: number, col: number);
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ModeInfo {
|
interface ModeInfo {
|
||||||
|
43
src/public/app/widgets/type_widgets/linters/mermaid.ts
Normal file
43
src/public/app/widgets/type_widgets/linters/mermaid.ts
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
import mermaid from "mermaid";
|
||||||
|
|
||||||
|
interface MermaidParseError extends Error {
|
||||||
|
hash: {
|
||||||
|
text: string;
|
||||||
|
token: string;
|
||||||
|
line: number;
|
||||||
|
loc: {
|
||||||
|
first_line: number;
|
||||||
|
first_column: number;
|
||||||
|
last_line: number;
|
||||||
|
last_column: number;
|
||||||
|
};
|
||||||
|
expected: string[]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default function registerErrorReporter() {
|
||||||
|
CodeMirror.registerHelper("lint", null, (async (text, options) => {
|
||||||
|
if (!text.trim()) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await mermaid.parse(text);
|
||||||
|
} catch (e: unknown) {
|
||||||
|
console.warn("Got validation error", JSON.stringify(e));
|
||||||
|
|
||||||
|
const mermaidError = (e as MermaidParseError);
|
||||||
|
const loc = mermaidError.hash.loc;
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
message: mermaidError.message,
|
||||||
|
severity: "error",
|
||||||
|
from: CodeMirror.Pos(loc.first_line - 1, loc.first_column - 1),
|
||||||
|
to: CodeMirror.Pos(loc.last_line - 1, loc.last_column - 1)
|
||||||
|
}
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}));
|
||||||
|
}
|
@ -1,9 +1,9 @@
|
|||||||
import type { MermaidConfig } from "mermaid";
|
import type { MermaidConfig } from "mermaid";
|
||||||
import library_loader from "../../services/library_loader.js";
|
|
||||||
import { loadElkIfNeeded, postprocessMermaidSvg } from "../../services/mermaid.js";
|
import { loadElkIfNeeded, postprocessMermaidSvg } from "../../services/mermaid.js";
|
||||||
import AbstractSvgSplitTypeWidget from "./abstract_svg_split_type_widget.js";
|
import AbstractSvgSplitTypeWidget from "./abstract_svg_split_type_widget.js";
|
||||||
|
|
||||||
let idCounter = 1;
|
let idCounter = 1;
|
||||||
|
let registeredErrorReporter = false;
|
||||||
|
|
||||||
export class MermaidTypeWidget extends AbstractSvgSplitTypeWidget {
|
export class MermaidTypeWidget extends AbstractSvgSplitTypeWidget {
|
||||||
|
|
||||||
@ -14,19 +14,29 @@ export class MermaidTypeWidget extends AbstractSvgSplitTypeWidget {
|
|||||||
async renderSvg(content: string) {
|
async renderSvg(content: string) {
|
||||||
const mermaid = (await import("mermaid")).default;
|
const mermaid = (await import("mermaid")).default;
|
||||||
await loadElkIfNeeded(mermaid, content);
|
await loadElkIfNeeded(mermaid, content);
|
||||||
|
if (!registeredErrorReporter) {
|
||||||
|
(await import("./linters/mermaid.js")).default();
|
||||||
|
registeredErrorReporter = true;
|
||||||
|
}
|
||||||
|
|
||||||
mermaid.mermaidAPI.initialize({
|
mermaid.initialize({
|
||||||
startOnLoad: false,
|
startOnLoad: false,
|
||||||
...(getMermaidConfig() as any)
|
...(getMermaidConfig() as any),
|
||||||
});
|
});
|
||||||
|
|
||||||
idCounter++;
|
idCounter++;
|
||||||
const { svg } = await mermaid.mermaidAPI.render(`mermaid-graph-${idCounter}`, content);
|
try {
|
||||||
return postprocessMermaidSvg(svg);
|
const { svg } = await mermaid.render(`mermaid-graph-${idCounter}`, content);
|
||||||
|
return postprocessMermaidSvg(svg);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn(JSON.stringify(e));
|
||||||
|
return "";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
export function getMermaidConfig(): MermaidConfig {
|
export function getMermaidConfig(): MermaidConfig {
|
||||||
const documentStyle = window.getComputedStyle(document.documentElement);
|
const documentStyle = window.getComputedStyle(document.documentElement);
|
||||||
const mermaidTheme = documentStyle.getPropertyValue("--mermaid-theme") as "default";
|
const mermaidTheme = documentStyle.getPropertyValue("--mermaid-theme") as "default";
|
||||||
|
Loading…
x
Reference in New Issue
Block a user