Notes/packages/ckeditor5-admonition/src/admonitionautoformat.ts

42 lines
1.1 KiB
TypeScript

import { Autoformat, blockAutoformatEditing, Plugin } from "ckeditor5";
import { AdmonitionType, ADMONITION_TYPES } from "./admonitioncommand.js";
function tryParseAdmonitionType(match: RegExpMatchArray) {
if (match.length !== 2) {
return;
}
if ((ADMONITION_TYPES as readonly string[]).includes(match[1])) {
return match[1] as AdmonitionType;
}
}
export default class AdmonitionAutoformat extends Plugin {
static get requires() {
return [ Autoformat ];
}
afterInit() {
if (!this.editor.commands.get("admonition")) {
return;
}
const instance = (this as any);
blockAutoformatEditing(this.editor, instance, /^\!\!\[*\! (.+) $/, ({ match }) => {
const type = tryParseAdmonitionType(match);
if (type) {
// User has entered the admonition type, so we insert as-is.
this.editor.execute("admonition", { forceValue: type });
} else {
// User has not entered a valid type, assume it's part of the text of the admonition.
this.editor.execute("admonition");
if (match.length > 1) {
this.editor.execute("insertText", { text: (match[1] ?? "") + " " });
}
}
});
}
}