From 2f3106d8cda553eae06641f1a1266f513aabd2ca Mon Sep 17 00:00:00 2001 From: Elian Doran Date: Fri, 14 Mar 2025 22:54:46 +0200 Subject: [PATCH] feat(editor): functional autoformat when type is not specified --- .../src/admonitionautoformat.ts | 14 ++++++++++---- .../ckeditor5-admonition/src/admonitioncommand.ts | 1 + .../ckeditor5-admonition/src/admonitionediting.ts | 9 ++++----- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/packages/ckeditor5-admonition/src/admonitionautoformat.ts b/packages/ckeditor5-admonition/src/admonitionautoformat.ts index ab0191e8c..64699cdaa 100644 --- a/packages/ckeditor5-admonition/src/admonitionautoformat.ts +++ b/packages/ckeditor5-admonition/src/admonitionautoformat.ts @@ -26,11 +26,17 @@ export default class AdmonitionAutoformat extends Plugin { const instance = (this as any); blockAutoformatEditing(this.editor, instance, /^\!\!\[*\! (.+) $/, ({ match }) => { const type = tryParseAdmonitionType(match); - if (!type) { - return; - } - this.editor.execute("admonition", { forceValue: type }); + 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] ?? "") + " " }); + } + } }); } } diff --git a/packages/ckeditor5-admonition/src/admonitioncommand.ts b/packages/ckeditor5-admonition/src/admonitioncommand.ts index dd78bdb6e..27d7a471e 100644 --- a/packages/ckeditor5-admonition/src/admonitioncommand.ts +++ b/packages/ckeditor5-admonition/src/admonitioncommand.ts @@ -18,6 +18,7 @@ import type { DocumentFragment, Element, Position, Range, Schema, Writer } from */ export const admonitionTypes = [ "note", "tip", "important", "caution", "warning" ] as const; +export const defaultAdmonitionType = admonitionTypes[0]; export type AdmonitionType = typeof admonitionTypes[number]; interface ExecuteOpts { diff --git a/packages/ckeditor5-admonition/src/admonitionediting.ts b/packages/ckeditor5-admonition/src/admonitionediting.ts index 4c1b7fba0..e28e0d086 100644 --- a/packages/ckeditor5-admonition/src/admonitionediting.ts +++ b/packages/ckeditor5-admonition/src/admonitionediting.ts @@ -11,7 +11,7 @@ import { Plugin } from 'ckeditor5/src/core.js'; import { Enter, type ViewDocumentEnterEvent } from 'ckeditor5/src/enter.js'; import { Delete, type ViewDocumentDeleteEvent } from 'ckeditor5/src/typing.js'; -import AdmonitionCommand from './admonitioncommand.js'; +import AdmonitionCommand, { AdmonitionType, admonitionTypes, defaultAdmonitionType } from './admonitioncommand.js'; import { ADMONITION_TYPES } from './admonitionui.js'; /** @@ -56,11 +56,10 @@ export default class AdmonitionEditing extends Plugin { classes: "admonition", }, model: (viewElement, { writer }) => { - let type = "note"; - const allowedTypes = Object.keys(ADMONITION_TYPES); + let type: AdmonitionType = defaultAdmonitionType; for (const className of viewElement.getClassNames()) { - if (className !== "admonition" && allowedTypes.includes(className)) { - type = className; + if (className !== "admonition" && (admonitionTypes as readonly string[]).includes(className)) { + type = className as AdmonitionType; } }