mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-08-23 21:06:22 +08:00
24448659a4
Fix #12284 Close [BS-3517](https://linear.app/affine-design/issue/BS-3517/微软新注音输入法无法使用markdown语法) This PR refactor the markdown transform during inputting, including: - Transfrom markdown syntax input in `inlineEditor.slots.inputting`, where we can detect the space character inputed by IME like Microsoft Bopomofo, but `keydown` event can't. - Remove `markdown-input.ts` which was used in `KeymapExtension` of paragraph, and refactor with `InlineMarkdownExtension` - Adjust existing `InlineMarkdownExtension` since the space is included in text. - Add two `InlineMarkdownExtension` for paragraph and list to impl Heading1-6, number, bullet, to-do list conversion. Other changes: - Improve type hint for parameter of `store.addBlock` <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit ## Summary by CodeRabbit - **New Features** - Added markdown shortcuts for creating code blocks and dividers in the rich text editor. - Introduced enhanced paragraph markdown support for headings and blockquotes with inline markdown patterns. - Integrated new list markdown extension supporting numbered, bulleted, and todo lists with checked states. - **Improvements** - Updated markdown formatting patterns to require trailing spaces for links, LaTeX, and inline styles, improving detection accuracy. - Markdown transformations now respond to input events instead of keydown for smoother editing experience. - Added focus management after markdown transformations to maintain seamless editing flow. - **Bug Fixes** - Removed unnecessary prevention of default behavior on space and shift-space key presses in list and paragraph editors. - **Refactor** - Enhanced event handling and typing for editor input events, improving reliability and maintainability. - Refined internal prefix text extraction logic for markdown processing. <!-- end of auto-generated comment: release notes by coderabbit.ai -->
105 lines
3.0 KiB
TypeScript
105 lines
3.0 KiB
TypeScript
import type { AffineTextAttributes } from '@blocksuite/affine-shared/types';
|
|
import {
|
|
type InlineRootElement,
|
|
InlineSpecExtension,
|
|
} from '@blocksuite/std/inline';
|
|
import type { ExtensionType } from '@blocksuite/store';
|
|
import { html } from 'lit';
|
|
import { z } from 'zod';
|
|
|
|
export type AffineInlineRootElement = InlineRootElement<AffineTextAttributes>;
|
|
|
|
export const BoldInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'bold',
|
|
schema: z.literal(true).optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.bold;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const ItalicInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'italic',
|
|
schema: z.literal(true).optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.italic;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const UnderlineInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'underline',
|
|
schema: z.literal(true).optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.underline;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const StrikeInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'strike',
|
|
schema: z.literal(true).optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.strike;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const CodeInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'inline-code',
|
|
schema: z.literal(true).optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.code;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const BackgroundInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'background',
|
|
schema: z.string().optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.background;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const ColorInlineSpecExtension =
|
|
InlineSpecExtension<AffineTextAttributes>({
|
|
name: 'color',
|
|
schema: z.string().optional().nullable().catch(undefined),
|
|
match: delta => {
|
|
return !!delta.attributes?.color;
|
|
},
|
|
renderer: ({ delta }) => {
|
|
return html`<affine-text .delta=${delta}></affine-text>`;
|
|
},
|
|
});
|
|
|
|
export const InlineSpecExtensions: ExtensionType[] = [
|
|
BoldInlineSpecExtension,
|
|
ItalicInlineSpecExtension,
|
|
UnderlineInlineSpecExtension,
|
|
StrikeInlineSpecExtension,
|
|
CodeInlineSpecExtension,
|
|
BackgroundInlineSpecExtension,
|
|
ColorInlineSpecExtension,
|
|
];
|