mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-07-24 05:48:59 +08:00
45 lines
1.2 KiB
TypeScript
45 lines
1.2 KiB
TypeScript
import type { EmbedCardStyle } from '@blocksuite/affine-model';
|
|
import { Extension } from '@blocksuite/block-std';
|
|
import type { Container } from '@blocksuite/global/di';
|
|
import { createIdentifier } from '@blocksuite/global/di';
|
|
|
|
export type EmbedOptions = {
|
|
flavour: string;
|
|
urlRegex: RegExp;
|
|
styles: EmbedCardStyle[];
|
|
viewType: 'card' | 'embed';
|
|
};
|
|
|
|
export interface EmbedOptionProvider {
|
|
getEmbedBlockOptions(url: string): EmbedOptions | null;
|
|
registerEmbedBlockOptions(options: EmbedOptions): void;
|
|
}
|
|
|
|
export const EmbedOptionProvider = createIdentifier<EmbedOptionProvider>(
|
|
'AffineEmbedOptionProvider'
|
|
);
|
|
|
|
export class EmbedOptionService
|
|
extends Extension
|
|
implements EmbedOptionProvider
|
|
{
|
|
private readonly _embedBlockRegistry = new Set<EmbedOptions>();
|
|
|
|
getEmbedBlockOptions = (url: string): EmbedOptions | null => {
|
|
const entries = this._embedBlockRegistry.entries();
|
|
for (const [options] of entries) {
|
|
const regex = options.urlRegex;
|
|
if (regex.test(url)) return options;
|
|
}
|
|
return null;
|
|
};
|
|
|
|
registerEmbedBlockOptions = (options: EmbedOptions): void => {
|
|
this._embedBlockRegistry.add(options);
|
|
};
|
|
|
|
static override setup(di: Container) {
|
|
di.addImpl(EmbedOptionProvider, EmbedOptionService);
|
|
}
|
|
}
|