chore: merge blocksuite source code (#9213)

This commit is contained in:
Mirone
2024-12-20 15:38:06 +08:00
committed by GitHub
parent 2c9ef916f4
commit 30200ff86d
2031 changed files with 238888 additions and 229 deletions
@@ -0,0 +1,33 @@
import type { ExtensionType } from '@blocksuite/block-std';
import {
createIdentifier,
type ServiceIdentifier,
} from '@blocksuite/global/di';
import type { BlockAdapterMatcher } from '../types/adapter.js';
import type { HtmlAST } from '../types/hast.js';
import type { NotionHtmlDeltaConverter } from './delta-converter.js';
export type BlockNotionHtmlAdapterMatcher = BlockAdapterMatcher<
HtmlAST,
NotionHtmlDeltaConverter
>;
export const BlockNotionHtmlAdapterMatcherIdentifier =
createIdentifier<BlockNotionHtmlAdapterMatcher>(
'BlockNotionHtmlAdapterMatcher'
);
export function BlockNotionHtmlAdapterExtension(
matcher: BlockNotionHtmlAdapterMatcher
): ExtensionType & {
identifier: ServiceIdentifier<BlockNotionHtmlAdapterMatcher>;
} {
const identifier = BlockNotionHtmlAdapterMatcherIdentifier(matcher.flavour);
return {
setup: di => {
di.addImpl(identifier, () => matcher);
},
identifier,
};
}
@@ -0,0 +1,106 @@
import type { ExtensionType } from '@blocksuite/block-std';
import {
createIdentifier,
type ServiceIdentifier,
} from '@blocksuite/global/di';
import { isEqual } from '@blocksuite/global/utils';
import type { DeltaInsert } from '@blocksuite/inline';
import type { AffineTextAttributes } from '../../types/index.js';
import {
type ASTToDeltaMatcher,
DeltaASTConverter,
type DeltaASTConverterOptions,
type InlineDeltaMatcher,
} from '../types/adapter.js';
import type { HtmlAST, InlineHtmlAST } from '../types/hast.js';
export type InlineDeltaToNotionHtmlAdapterMatcher =
InlineDeltaMatcher<InlineHtmlAST>;
export type NotionHtmlASTToDeltaMatcher = ASTToDeltaMatcher<HtmlAST>;
export const NotionHtmlASTToDeltaMatcherIdentifier =
createIdentifier<NotionHtmlASTToDeltaMatcher>('NotionHtmlASTToDeltaMatcher');
export function NotionHtmlASTToDeltaExtension(
matcher: NotionHtmlASTToDeltaMatcher
): ExtensionType & {
identifier: ServiceIdentifier<NotionHtmlASTToDeltaMatcher>;
} {
const identifier = NotionHtmlASTToDeltaMatcherIdentifier(matcher.name);
return {
setup: di => {
di.addImpl(identifier, () => matcher);
},
identifier,
};
}
export class NotionHtmlDeltaConverter extends DeltaASTConverter<
AffineTextAttributes,
HtmlAST
> {
constructor(
readonly configs: Map<string, string>,
readonly inlineDeltaMatchers: InlineDeltaToNotionHtmlAdapterMatcher[],
readonly htmlASTToDeltaMatchers: NotionHtmlASTToDeltaMatcher[]
) {
super();
}
private _spreadAstToDelta(
ast: HtmlAST,
options: DeltaASTConverterOptions = Object.create(null)
): DeltaInsert<AffineTextAttributes>[] {
const context = {
configs: this.configs,
options,
toDelta: (ast: HtmlAST, options?: DeltaASTConverterOptions) =>
this._spreadAstToDelta(ast, options),
};
for (const matcher of this.htmlASTToDeltaMatchers) {
if (matcher.match(ast)) {
return matcher.toDelta(ast, context);
}
}
const result =
'children' in ast
? ast.children.flatMap(child => this._spreadAstToDelta(child, options))
: [];
if (options.removeLastBr && result.length > 0) {
const lastItem = result[result.length - 1];
if (lastItem.insert === '\n') {
result.pop();
}
}
return result;
}
astToDelta(
ast: HtmlAST,
options: DeltaASTConverterOptions = Object.create(null)
): DeltaInsert<AffineTextAttributes>[] {
return this._spreadAstToDelta(ast, options).reduce((acc, cur) => {
if (acc.length === 0) {
return [cur];
}
const last = acc[acc.length - 1];
if (
typeof last.insert === 'string' &&
typeof cur.insert === 'string' &&
isEqual(last.attributes, cur.attributes)
) {
last.insert += cur.insert;
return acc;
}
return [...acc, cur];
}, [] as DeltaInsert<AffineTextAttributes>[]);
}
deltaToAST(_: DeltaInsert<AffineTextAttributes>[]): InlineHtmlAST[] {
return [];
}
}
@@ -0,0 +1,3 @@
export * from './block-adapter.js';
export * from './delta-converter.js';
export * from './type.js';
@@ -0,0 +1 @@
export type NotionHtml = string;