mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-07 01:09:54 +08:00
refactor: reorganize specs and adapter extensions (#10359)
### TL;DR Refactored `SpecProvider` singleton access pattern and reorganized adapter/extension code structure. ### What changed? - Changed `SpecProvider.getInstance()` to `SpecProvider._` for cleaner singleton access - Moved adapter/extension code from `_common` directory to dedicated `adapters` and `extensions` folders - Consolidated adapter extensions into a single file - Removed unused dependencies from package.json - Deleted unnecessary schema files - Extracted `MobileSpecsPatches` class into the mobile patching code - Updated all references to use the new `SpecProvider._` accessor ### How to test? - Verify all specs are properly registered and accessible via `SpecProvider._` - Test adapter functionality for HTML, Markdown, Notion HTML and plain text - Check mobile-specific features and patches work correctly - Ensure preview functionality works in both page and edgeless modes ### Why make this change? - Improves code organization by properly separating adapters and extensions - Simplifies singleton access pattern - Removes unnecessary dependencies and files - Makes the codebase more maintainable by consolidating related functionality
This commit is contained in:
@@ -197,7 +197,7 @@ async function renderNoteContent(
|
|||||||
match: ids.map(id => ({ id, viewType: 'display' })),
|
match: ids.map(id => ({ id, viewType: 'display' })),
|
||||||
};
|
};
|
||||||
const previewDoc = doc.doc.getStore({ query });
|
const previewDoc = doc.doc.getStore({ query });
|
||||||
const previewSpec = SpecProvider.getInstance().getSpec('preview:page');
|
const previewSpec = SpecProvider._.getSpec('preview:page');
|
||||||
const previewStd = new BlockStdScope({
|
const previewStd = new BlockStdScope({
|
||||||
store: previewDoc,
|
store: previewDoc,
|
||||||
extensions: previewSpec.value,
|
extensions: previewSpec.value,
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ export class EmbedSyncedDocBlockComponent extends EmbedBlockComponent<EmbedSynce
|
|||||||
|
|
||||||
protected _buildPreviewSpec = (name: 'preview:page' | 'preview:edgeless') => {
|
protected _buildPreviewSpec = (name: 'preview:page' | 'preview:edgeless') => {
|
||||||
const nextDepth = this.depth + 1;
|
const nextDepth = this.depth + 1;
|
||||||
const previewSpecBuilder = SpecProvider.getInstance().getSpec(name);
|
const previewSpecBuilder = SpecProvider._.getSpec(name);
|
||||||
const currentDisposables = this.disposables;
|
const currentDisposables = this.disposables;
|
||||||
const editorSetting =
|
const editorSetting =
|
||||||
this.std.getOptional(EditorSettingProvider) ??
|
this.std.getOptional(EditorSettingProvider) ??
|
||||||
|
|||||||
@@ -80,8 +80,7 @@ export class FramePreview extends WithDisposable(ShadowlessElement) {
|
|||||||
|
|
||||||
private _previewDoc: Store | null = null;
|
private _previewDoc: Store | null = null;
|
||||||
|
|
||||||
private readonly _previewSpec =
|
private readonly _previewSpec = SpecProvider._.getSpec('preview:edgeless');
|
||||||
SpecProvider.getInstance().getSpec('preview:edgeless');
|
|
||||||
|
|
||||||
private readonly _updateFrameViewportWH = () => {
|
private readonly _updateFrameViewportWH = () => {
|
||||||
const [, , w, h] = deserializeXYWH(this.frame.xywh);
|
const [, , w, h] = deserializeXYWH(this.frame.xywh);
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ type ImportHTMLZipOptions = {
|
|||||||
|
|
||||||
function getProvider() {
|
function getProvider() {
|
||||||
const container = new Container();
|
const container = new Container();
|
||||||
const exts = SpecProvider.getInstance().getSpec('store').value;
|
const exts = SpecProvider._.getSpec('store').value;
|
||||||
exts.forEach(ext => {
|
exts.forEach(ext => {
|
||||||
ext.setup(container);
|
ext.setup(container);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import { createAssetsArchive, download, Unzip } from './utils.js';
|
|||||||
|
|
||||||
function getProvider() {
|
function getProvider() {
|
||||||
const container = new Container();
|
const container = new Container();
|
||||||
const exts = SpecProvider.getInstance().getSpec('store').value;
|
const exts = SpecProvider._.getSpec('store').value;
|
||||||
exts.forEach(ext => {
|
exts.forEach(ext => {
|
||||||
ext.setup(container);
|
ext.setup(container);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ type ImportNotionZipOptions = {
|
|||||||
|
|
||||||
function getProvider() {
|
function getProvider() {
|
||||||
const container = new Container();
|
const container = new Container();
|
||||||
const exts = SpecProvider.getInstance().getSpec('store').value;
|
const exts = SpecProvider._.getSpec('store').value;
|
||||||
exts.forEach(ext => {
|
exts.forEach(ext => {
|
||||||
ext.setup(container);
|
ext.setup(container);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ export class SurfaceRefNotePortal extends WithDisposable(ShadowlessElement) {
|
|||||||
query: this.query,
|
query: this.query,
|
||||||
readonly: true,
|
readonly: true,
|
||||||
});
|
});
|
||||||
const previewSpec = SpecProvider.getInstance().getSpec('preview:page');
|
const previewSpec = SpecProvider._.getSpec('preview:page');
|
||||||
return new BlockStdScope({
|
return new BlockStdScope({
|
||||||
store: doc,
|
store: doc,
|
||||||
extensions: previewSpec.value.slice(),
|
extensions: previewSpec.value.slice(),
|
||||||
|
|||||||
@@ -239,8 +239,7 @@ export class SurfaceRefBlockComponent extends BlockComponent<SurfaceRefBlockMode
|
|||||||
|
|
||||||
private _previewDoc: Store | null = null;
|
private _previewDoc: Store | null = null;
|
||||||
|
|
||||||
private readonly _previewSpec =
|
private readonly _previewSpec = SpecProvider._.getSpec('preview:edgeless');
|
||||||
SpecProvider.getInstance().getSpec('preview:edgeless');
|
|
||||||
|
|
||||||
private _referencedModel: GfxModel | null = null;
|
private _referencedModel: GfxModel | null = null;
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export class SpecProvider {
|
|||||||
|
|
||||||
private constructor() {}
|
private constructor() {}
|
||||||
|
|
||||||
static getInstance() {
|
static get _() {
|
||||||
if (!SpecProvider.instance) {
|
if (!SpecProvider.instance) {
|
||||||
SpecProvider.instance = new SpecProvider();
|
SpecProvider.instance = new SpecProvider();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ export class PreviewHelper {
|
|||||||
const editorSetting = std.get(EditorSettingProvider).peek();
|
const editorSetting = std.get(EditorSettingProvider).peek();
|
||||||
const query = this._calculateQuery(blockIds as string[], mode);
|
const query = this._calculateQuery(blockIds as string[], mode);
|
||||||
const store = widget.doc.doc.getStore({ query });
|
const store = widget.doc.doc.getStore({ query });
|
||||||
const previewSpec = SpecProvider.getInstance().getSpec(
|
const previewSpec = SpecProvider._.getSpec(
|
||||||
isEdgeless ? 'preview:edgeless' : 'preview:page'
|
isEdgeless ? 'preview:edgeless' : 'preview:page'
|
||||||
);
|
);
|
||||||
const settingSignal = signal({ ...editorSetting });
|
const settingSignal = signal({ ...editorSetting });
|
||||||
|
|||||||
@@ -47,28 +47,7 @@
|
|||||||
"@blocksuite/global": "workspace:*",
|
"@blocksuite/global": "workspace:*",
|
||||||
"@blocksuite/icons": "^2.2.1",
|
"@blocksuite/icons": "^2.2.1",
|
||||||
"@blocksuite/inline": "workspace:*",
|
"@blocksuite/inline": "workspace:*",
|
||||||
"@blocksuite/store": "workspace:*",
|
"@blocksuite/store": "workspace:*"
|
||||||
"@floating-ui/dom": "^1.6.10",
|
|
||||||
"@lit/context": "^1.1.2",
|
|
||||||
"@preact/signals-core": "^1.8.0",
|
|
||||||
"@toeverything/theme": "^1.1.11",
|
|
||||||
"@vanilla-extract/css": "^1.17.0",
|
|
||||||
"date-fns": "^4.0.0",
|
|
||||||
"dompurify": "^3.2.4",
|
|
||||||
"fflate": "^0.8.2",
|
|
||||||
"file-type": "^20.0.0",
|
|
||||||
"fractional-indexing": "^3.2.0",
|
|
||||||
"html2canvas": "^1.4.1",
|
|
||||||
"katex": "^0.16.11",
|
|
||||||
"lit": "^3.2.0",
|
|
||||||
"lodash-es": "^4.17.21",
|
|
||||||
"lz-string": "^1.5.0",
|
|
||||||
"minimatch": "^10.0.1",
|
|
||||||
"nanoid": "^5.0.7",
|
|
||||||
"shiki": "^2.0.0",
|
|
||||||
"simple-xml-to-json": "^1.2.2",
|
|
||||||
"yjs": "^13.6.21",
|
|
||||||
"zod": "^3.23.8"
|
|
||||||
},
|
},
|
||||||
"exports": {
|
"exports": {
|
||||||
".": "./src/index.ts",
|
".": "./src/index.ts",
|
||||||
@@ -79,13 +58,9 @@
|
|||||||
"src",
|
"src",
|
||||||
"dist",
|
"dist",
|
||||||
"!src/__tests__",
|
"!src/__tests__",
|
||||||
"!dist/__tests__",
|
"!dist/__tests__"
|
||||||
"schemas.d.ts",
|
|
||||||
"schemas.js"
|
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/katex": "^0.16.7",
|
|
||||||
"@types/lodash-es": "^4.17.12",
|
|
||||||
"@vanilla-extract/vite-plugin": "^5.0.0",
|
"@vanilla-extract/vite-plugin": "^5.0.0",
|
||||||
"vitest": "3.0.6"
|
"vitest": "3.0.6"
|
||||||
}
|
}
|
||||||
|
|||||||
Vendored
-2
@@ -1,2 +0,0 @@
|
|||||||
// @ts-expect-error FIXME: ts error
|
|
||||||
export * from './dist/schemas';
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
/// <reference types="./dist/schemas.d.ts" />
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-restricted-imports
|
|
||||||
export * from './dist/schemas.js';
|
|
||||||
@@ -1,13 +1,8 @@
|
|||||||
import {
|
|
||||||
HtmlInlineToDeltaAdapterExtensions,
|
|
||||||
InlineDeltaToHtmlAdapterExtensions,
|
|
||||||
} from '@blocksuite/affine-components/rich-text';
|
|
||||||
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
|
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
|
||||||
import {
|
import {
|
||||||
embedSyncedDocMiddleware,
|
embedSyncedDocMiddleware,
|
||||||
HtmlAdapter,
|
HtmlAdapter,
|
||||||
} from '@blocksuite/affine-shared/adapters';
|
} from '@blocksuite/affine-shared/adapters';
|
||||||
import { Container } from '@blocksuite/global/di';
|
|
||||||
import type {
|
import type {
|
||||||
BlockSnapshot,
|
BlockSnapshot,
|
||||||
DocSnapshot,
|
DocSnapshot,
|
||||||
@@ -16,19 +11,11 @@ import type {
|
|||||||
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
|
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
|
||||||
import { describe, expect, test } from 'vitest';
|
import { describe, expect, test } from 'vitest';
|
||||||
|
|
||||||
import { defaultBlockHtmlAdapterMatchers } from '../../_common/adapters/html/block-matcher.js';
|
|
||||||
import { createJob } from '../utils/create-job.js';
|
import { createJob } from '../utils/create-job.js';
|
||||||
|
import { getProvider } from '../utils/get-provider.js';
|
||||||
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
|
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
|
||||||
|
|
||||||
const container = new Container();
|
const provider = getProvider();
|
||||||
[
|
|
||||||
...HtmlInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockHtmlAdapterMatchers,
|
|
||||||
...InlineDeltaToHtmlAdapterExtensions,
|
|
||||||
].forEach(ext => {
|
|
||||||
ext.setup(container);
|
|
||||||
});
|
|
||||||
const provider = container.provider();
|
|
||||||
|
|
||||||
describe('snapshot to html', () => {
|
describe('snapshot to html', () => {
|
||||||
const template = (html: string, title?: string) => {
|
const template = (html: string, title?: string) => {
|
||||||
|
|||||||
@@ -1,7 +1,3 @@
|
|||||||
import {
|
|
||||||
InlineDeltaToMarkdownAdapterExtensions,
|
|
||||||
MarkdownInlineToDeltaAdapterExtensions,
|
|
||||||
} from '@blocksuite/affine-components/rich-text';
|
|
||||||
import {
|
import {
|
||||||
DefaultTheme,
|
DefaultTheme,
|
||||||
NoteDisplayMode,
|
NoteDisplayMode,
|
||||||
@@ -11,7 +7,6 @@ import {
|
|||||||
embedSyncedDocMiddleware,
|
embedSyncedDocMiddleware,
|
||||||
MarkdownAdapter,
|
MarkdownAdapter,
|
||||||
} from '@blocksuite/affine-shared/adapters';
|
} from '@blocksuite/affine-shared/adapters';
|
||||||
import { Container } from '@blocksuite/global/di';
|
|
||||||
import type {
|
import type {
|
||||||
BlockSnapshot,
|
BlockSnapshot,
|
||||||
DocSnapshot,
|
DocSnapshot,
|
||||||
@@ -21,20 +16,11 @@ import type {
|
|||||||
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
|
import { AssetsManager, MemoryBlobCRUD } from '@blocksuite/store';
|
||||||
import { describe, expect, test } from 'vitest';
|
import { describe, expect, test } from 'vitest';
|
||||||
|
|
||||||
import { defaultBlockMarkdownAdapterMatchers } from '../../_common/adapters/markdown/block-matcher.js';
|
|
||||||
import { createJob } from '../utils/create-job.js';
|
import { createJob } from '../utils/create-job.js';
|
||||||
|
import { getProvider } from '../utils/get-provider.js';
|
||||||
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
|
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
|
||||||
|
|
||||||
const container = new Container();
|
const provider = getProvider();
|
||||||
[
|
|
||||||
...MarkdownInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockMarkdownAdapterMatchers,
|
|
||||||
...InlineDeltaToMarkdownAdapterExtensions,
|
|
||||||
].forEach(ext => {
|
|
||||||
ext.setup(container);
|
|
||||||
});
|
|
||||||
|
|
||||||
const provider = container.provider();
|
|
||||||
|
|
||||||
describe('snapshot to markdown', () => {
|
describe('snapshot to markdown', () => {
|
||||||
test('code', async () => {
|
test('code', async () => {
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import { NotionHtmlInlineToDeltaAdapterExtensions } from '@blocksuite/affine-components/rich-text';
|
|
||||||
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
|
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
|
||||||
import { NotionHtmlAdapter } from '@blocksuite/affine-shared/adapters';
|
import { NotionHtmlAdapter } from '@blocksuite/affine-shared/adapters';
|
||||||
import { Container } from '@blocksuite/global/di';
|
|
||||||
import {
|
import {
|
||||||
AssetsManager,
|
AssetsManager,
|
||||||
type BlockSnapshot,
|
type BlockSnapshot,
|
||||||
@@ -9,19 +7,11 @@ import {
|
|||||||
} from '@blocksuite/store';
|
} from '@blocksuite/store';
|
||||||
import { describe, expect, test } from 'vitest';
|
import { describe, expect, test } from 'vitest';
|
||||||
|
|
||||||
import { defaultBlockNotionHtmlAdapterMatchers } from '../../_common/adapters/notion-html/block-matcher.js';
|
|
||||||
import { createJob } from '../utils/create-job.js';
|
import { createJob } from '../utils/create-job.js';
|
||||||
|
import { getProvider } from '../utils/get-provider.js';
|
||||||
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
|
import { nanoidReplacement } from '../utils/nanoid-replacement.js';
|
||||||
|
|
||||||
const container = new Container();
|
const provider = getProvider();
|
||||||
[
|
|
||||||
...NotionHtmlInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockNotionHtmlAdapterMatchers,
|
|
||||||
].forEach(ext => {
|
|
||||||
ext.setup(container);
|
|
||||||
});
|
|
||||||
|
|
||||||
const provider = container.provider();
|
|
||||||
|
|
||||||
describe('notion html to snapshot', () => {
|
describe('notion html to snapshot', () => {
|
||||||
test('code', async () => {
|
test('code', async () => {
|
||||||
|
|||||||
@@ -1,10 +1,8 @@
|
|||||||
import { InlineDeltaToPlainTextAdapterExtensions } from '@blocksuite/affine-components/rich-text';
|
|
||||||
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
|
import { DefaultTheme, NoteDisplayMode } from '@blocksuite/affine-model';
|
||||||
import {
|
import {
|
||||||
embedSyncedDocMiddleware,
|
embedSyncedDocMiddleware,
|
||||||
PlainTextAdapter,
|
PlainTextAdapter,
|
||||||
} from '@blocksuite/affine-shared/adapters';
|
} from '@blocksuite/affine-shared/adapters';
|
||||||
import { Container } from '@blocksuite/global/di';
|
|
||||||
import type {
|
import type {
|
||||||
BlockSnapshot,
|
BlockSnapshot,
|
||||||
DocSnapshot,
|
DocSnapshot,
|
||||||
@@ -12,17 +10,10 @@ import type {
|
|||||||
} from '@blocksuite/store';
|
} from '@blocksuite/store';
|
||||||
import { describe, expect, test } from 'vitest';
|
import { describe, expect, test } from 'vitest';
|
||||||
|
|
||||||
import { defaultBlockPlainTextAdapterMatchers } from '../../_common/adapters/plain-text/block-matcher.js';
|
|
||||||
import { createJob } from '../utils/create-job.js';
|
import { createJob } from '../utils/create-job.js';
|
||||||
|
import { getProvider } from '../utils/get-provider.js';
|
||||||
|
|
||||||
const container = new Container();
|
const provider = getProvider();
|
||||||
[
|
|
||||||
...defaultBlockPlainTextAdapterMatchers,
|
|
||||||
...InlineDeltaToPlainTextAdapterExtensions,
|
|
||||||
].forEach(ext => {
|
|
||||||
ext.setup(container);
|
|
||||||
});
|
|
||||||
const provider = container.provider();
|
|
||||||
|
|
||||||
describe('snapshot to plain text', () => {
|
describe('snapshot to plain text', () => {
|
||||||
test('paragraph', async () => {
|
test('paragraph', async () => {
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { SpecProvider } from '@blocksuite/affine-shared/utils';
|
||||||
|
import { Container } from '@blocksuite/global/di';
|
||||||
|
|
||||||
|
import { registerSpecs } from '../../extensions/register';
|
||||||
|
|
||||||
|
registerSpecs();
|
||||||
|
|
||||||
|
export function getProvider() {
|
||||||
|
const container = new Container();
|
||||||
|
const exts = SpecProvider._.getSpec('store').value;
|
||||||
|
exts.forEach(ext => {
|
||||||
|
ext.setup(container);
|
||||||
|
});
|
||||||
|
return container.provider();
|
||||||
|
}
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
import {
|
|
||||||
AttachmentAdapterFactoryExtension,
|
|
||||||
HtmlAdapterFactoryExtension,
|
|
||||||
ImageAdapterFactoryExtension,
|
|
||||||
MarkdownAdapterFactoryExtension,
|
|
||||||
MixTextAdapterFactoryExtension,
|
|
||||||
NotionHtmlAdapterFactoryExtension,
|
|
||||||
NotionTextAdapterFactoryExtension,
|
|
||||||
PlainTextAdapterFactoryExtension,
|
|
||||||
} from '@blocksuite/affine-shared/adapters';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
export const AdapterFactoryExtensions: ExtensionType[] = [
|
|
||||||
AttachmentAdapterFactoryExtension,
|
|
||||||
ImageAdapterFactoryExtension,
|
|
||||||
MarkdownAdapterFactoryExtension,
|
|
||||||
PlainTextAdapterFactoryExtension,
|
|
||||||
HtmlAdapterFactoryExtension,
|
|
||||||
NotionTextAdapterFactoryExtension,
|
|
||||||
NotionHtmlAdapterFactoryExtension,
|
|
||||||
MixTextAdapterFactoryExtension,
|
|
||||||
];
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
export * from './common.js';
|
|
||||||
export * from './preset/edgeless-specs.js';
|
|
||||||
export * from './preset/mobile-patch.js';
|
|
||||||
export * from './preset/page-specs.js';
|
|
||||||
export * from './preset/preview-specs.js';
|
|
||||||
export { SpecBuilder, SpecProvider } from '@blocksuite/affine-shared/utils';
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
import {
|
|
||||||
HtmlInlineToDeltaAdapterExtensions,
|
|
||||||
InlineDeltaToHtmlAdapterExtensions,
|
|
||||||
InlineDeltaToMarkdownAdapterExtensions,
|
|
||||||
MarkdownInlineToDeltaAdapterExtensions,
|
|
||||||
NotionHtmlInlineToDeltaAdapterExtensions,
|
|
||||||
} from '@blocksuite/affine-components/rich-text';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
import {
|
|
||||||
defaultBlockHtmlAdapterMatchers,
|
|
||||||
defaultBlockMarkdownAdapterMatchers,
|
|
||||||
defaultBlockNotionHtmlAdapterMatchers,
|
|
||||||
} from '../../_common/adapters';
|
|
||||||
|
|
||||||
export const HtmlAdapterExtension: ExtensionType[] = [
|
|
||||||
...HtmlInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockHtmlAdapterMatchers,
|
|
||||||
...InlineDeltaToHtmlAdapterExtensions,
|
|
||||||
];
|
|
||||||
|
|
||||||
export const MarkdownAdapterExtension: ExtensionType[] = [
|
|
||||||
...MarkdownInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockMarkdownAdapterMatchers,
|
|
||||||
...InlineDeltaToMarkdownAdapterExtensions,
|
|
||||||
];
|
|
||||||
|
|
||||||
export const NotionHtmlAdapterExtension: ExtensionType[] = [
|
|
||||||
...NotionHtmlInlineToDeltaAdapterExtensions,
|
|
||||||
...defaultBlockNotionHtmlAdapterMatchers,
|
|
||||||
];
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { EdgelessBuiltInSpecs } from '@blocksuite/affine-block-root';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
import { EdgelessFirstPartyBlockSpecs } from '../common';
|
|
||||||
|
|
||||||
export const EdgelessEditorBlockSpecs: ExtensionType[] = [
|
|
||||||
EdgelessBuiltInSpecs,
|
|
||||||
EdgelessFirstPartyBlockSpecs,
|
|
||||||
].flat();
|
|
||||||
@@ -1,74 +0,0 @@
|
|||||||
import type { CodeBlockConfig } from '@blocksuite/affine-block-code';
|
|
||||||
import { ParagraphBlockService } from '@blocksuite/affine-block-paragraph';
|
|
||||||
import {
|
|
||||||
type ReferenceNodeConfig,
|
|
||||||
ReferenceNodeConfigIdentifier,
|
|
||||||
} from '@blocksuite/affine-components/rich-text';
|
|
||||||
import { FeatureFlagService } from '@blocksuite/affine-shared/services';
|
|
||||||
import {
|
|
||||||
type BlockStdScope,
|
|
||||||
ConfigIdentifier,
|
|
||||||
LifeCycleWatcher,
|
|
||||||
} from '@blocksuite/block-std';
|
|
||||||
import type { Container } from '@blocksuite/global/di';
|
|
||||||
|
|
||||||
export class MobileSpecsPatches extends LifeCycleWatcher {
|
|
||||||
static override key = 'mobile-patches';
|
|
||||||
|
|
||||||
constructor(std: BlockStdScope) {
|
|
||||||
super(std);
|
|
||||||
const featureFlagService = std.get(FeatureFlagService);
|
|
||||||
|
|
||||||
featureFlagService.setFlag('enable_mobile_keyboard_toolbar', true);
|
|
||||||
featureFlagService.setFlag('enable_mobile_linked_doc_menu', true);
|
|
||||||
}
|
|
||||||
|
|
||||||
static override setup(di: Container) {
|
|
||||||
super.setup(di);
|
|
||||||
|
|
||||||
// Hide reference popup on mobile.
|
|
||||||
{
|
|
||||||
const prev = di.getFactory(ReferenceNodeConfigIdentifier);
|
|
||||||
di.override(ReferenceNodeConfigIdentifier, provider => {
|
|
||||||
return {
|
|
||||||
...prev?.(provider),
|
|
||||||
hidePopup: true,
|
|
||||||
} satisfies ReferenceNodeConfig;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Hide number lines for code block on mobile.
|
|
||||||
{
|
|
||||||
const codeConfigIdentifier = ConfigIdentifier('affine:code');
|
|
||||||
const prev = di.getFactory(codeConfigIdentifier);
|
|
||||||
di.override(codeConfigIdentifier, provider => {
|
|
||||||
return {
|
|
||||||
...prev?.(provider),
|
|
||||||
showLineNumbers: false,
|
|
||||||
} satisfies CodeBlockConfig;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override mounted() {
|
|
||||||
// remove slash placeholder for mobile: `type / ...`
|
|
||||||
{
|
|
||||||
const paragraphService = this.std.get(ParagraphBlockService);
|
|
||||||
if (!paragraphService) return;
|
|
||||||
|
|
||||||
paragraphService.placeholderGenerator = model => {
|
|
||||||
const placeholders = {
|
|
||||||
text: '',
|
|
||||||
h1: 'Heading 1',
|
|
||||||
h2: 'Heading 2',
|
|
||||||
h3: 'Heading 3',
|
|
||||||
h4: 'Heading 4',
|
|
||||||
h5: 'Heading 5',
|
|
||||||
h6: 'Heading 6',
|
|
||||||
quote: '',
|
|
||||||
};
|
|
||||||
return placeholders[model.type];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
import { PageRootBlockSpec } from '@blocksuite/affine-block-root';
|
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
|
||||||
|
|
||||||
import { PageFirstPartyBlockSpecs } from '../common.js';
|
|
||||||
|
|
||||||
export const PageEditorBlockSpecs: ExtensionType[] = [
|
|
||||||
PageRootBlockSpec,
|
|
||||||
...PageFirstPartyBlockSpecs,
|
|
||||||
].flat();
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
import { SpecProvider } from '@blocksuite/affine-shared/utils';
|
|
||||||
|
|
||||||
import { StoreExtensions } from './common.js';
|
|
||||||
import { EdgelessEditorBlockSpecs } from './preset/edgeless-specs.js';
|
|
||||||
import { PageEditorBlockSpecs } from './preset/page-specs.js';
|
|
||||||
import {
|
|
||||||
PreviewEdgelessEditorBlockSpecs,
|
|
||||||
PreviewPageEditorBlockSpecs,
|
|
||||||
} from './preset/preview-specs.js';
|
|
||||||
|
|
||||||
export function registerSpecs() {
|
|
||||||
SpecProvider.getInstance().addSpec('store', StoreExtensions);
|
|
||||||
SpecProvider.getInstance().addSpec('page', PageEditorBlockSpecs);
|
|
||||||
SpecProvider.getInstance().addSpec('edgeless', EdgelessEditorBlockSpecs);
|
|
||||||
SpecProvider.getInstance().addSpec(
|
|
||||||
'preview:page',
|
|
||||||
PreviewPageEditorBlockSpecs
|
|
||||||
);
|
|
||||||
SpecProvider.getInstance().addSpec(
|
|
||||||
'preview:edgeless',
|
|
||||||
PreviewEdgelessEditorBlockSpecs
|
|
||||||
);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
import {
|
||||||
|
HtmlInlineToDeltaAdapterExtensions,
|
||||||
|
InlineDeltaToHtmlAdapterExtensions,
|
||||||
|
InlineDeltaToMarkdownAdapterExtensions,
|
||||||
|
InlineDeltaToPlainTextAdapterExtensions,
|
||||||
|
MarkdownInlineToDeltaAdapterExtensions,
|
||||||
|
NotionHtmlInlineToDeltaAdapterExtensions,
|
||||||
|
} from '@blocksuite/affine-components/rich-text';
|
||||||
|
import {
|
||||||
|
AttachmentAdapterFactoryExtension,
|
||||||
|
HtmlAdapterFactoryExtension,
|
||||||
|
ImageAdapterFactoryExtension,
|
||||||
|
MarkdownAdapterFactoryExtension,
|
||||||
|
MixTextAdapterFactoryExtension,
|
||||||
|
NotionHtmlAdapterFactoryExtension,
|
||||||
|
NotionTextAdapterFactoryExtension,
|
||||||
|
PlainTextAdapterFactoryExtension,
|
||||||
|
} from '@blocksuite/affine-shared/adapters';
|
||||||
|
import type { ExtensionType } from '@blocksuite/store';
|
||||||
|
|
||||||
|
import { defaultBlockHtmlAdapterMatchers } from './html/block-matcher';
|
||||||
|
import { defaultBlockMarkdownAdapterMatchers } from './markdown/block-matcher';
|
||||||
|
import { defaultBlockNotionHtmlAdapterMatchers } from './notion-html/block-matcher';
|
||||||
|
import { defaultBlockPlainTextAdapterMatchers } from './plain-text/block-matcher';
|
||||||
|
|
||||||
|
export const AdapterFactoryExtensions: ExtensionType[] = [
|
||||||
|
AttachmentAdapterFactoryExtension,
|
||||||
|
ImageAdapterFactoryExtension,
|
||||||
|
MarkdownAdapterFactoryExtension,
|
||||||
|
PlainTextAdapterFactoryExtension,
|
||||||
|
HtmlAdapterFactoryExtension,
|
||||||
|
NotionTextAdapterFactoryExtension,
|
||||||
|
NotionHtmlAdapterFactoryExtension,
|
||||||
|
MixTextAdapterFactoryExtension,
|
||||||
|
];
|
||||||
|
|
||||||
|
export const HtmlAdapterExtension: ExtensionType[] = [
|
||||||
|
...HtmlInlineToDeltaAdapterExtensions,
|
||||||
|
...defaultBlockHtmlAdapterMatchers,
|
||||||
|
...InlineDeltaToHtmlAdapterExtensions,
|
||||||
|
];
|
||||||
|
|
||||||
|
export const MarkdownAdapterExtension: ExtensionType[] = [
|
||||||
|
...MarkdownInlineToDeltaAdapterExtensions,
|
||||||
|
...defaultBlockMarkdownAdapterMatchers,
|
||||||
|
...InlineDeltaToMarkdownAdapterExtensions,
|
||||||
|
];
|
||||||
|
|
||||||
|
export const NotionHtmlAdapterExtension: ExtensionType[] = [
|
||||||
|
...NotionHtmlInlineToDeltaAdapterExtensions,
|
||||||
|
...defaultBlockNotionHtmlAdapterMatchers,
|
||||||
|
];
|
||||||
|
|
||||||
|
export const PlainTextAdapterExtension: ExtensionType[] = [
|
||||||
|
...defaultBlockPlainTextAdapterMatchers,
|
||||||
|
...InlineDeltaToPlainTextAdapterExtensions,
|
||||||
|
];
|
||||||
@@ -45,7 +45,7 @@ import { effects as stdEffects } from '@blocksuite/block-std/effects';
|
|||||||
import { effects as dataViewEffects } from '@blocksuite/data-view/effects';
|
import { effects as dataViewEffects } from '@blocksuite/data-view/effects';
|
||||||
import { effects as inlineEffects } from '@blocksuite/inline/effects';
|
import { effects as inlineEffects } from '@blocksuite/inline/effects';
|
||||||
|
|
||||||
import { registerSpecs } from './_specs/register-specs.js';
|
import { registerSpecs } from './extensions/register.js';
|
||||||
|
|
||||||
export function effects() {
|
export function effects() {
|
||||||
registerSpecs();
|
registerSpecs();
|
||||||
@@ -73,6 +73,7 @@ export function effects() {
|
|||||||
blockCodeEffects();
|
blockCodeEffects();
|
||||||
blockTableEffects();
|
blockTableEffects();
|
||||||
blockRootEffects();
|
blockRootEffects();
|
||||||
|
|
||||||
componentCaptionEffects();
|
componentCaptionEffects();
|
||||||
componentContextMenuEffects();
|
componentContextMenuEffects();
|
||||||
componentDatePickerEffects();
|
componentDatePickerEffects();
|
||||||
|
|||||||
@@ -55,12 +55,13 @@ import {
|
|||||||
} from '@blocksuite/block-std';
|
} from '@blocksuite/block-std';
|
||||||
import type { ExtensionType } from '@blocksuite/store';
|
import type { ExtensionType } from '@blocksuite/store';
|
||||||
|
|
||||||
import { AdapterFactoryExtensions } from '../_common/adapters/extension.js';
|
|
||||||
import {
|
import {
|
||||||
|
AdapterFactoryExtensions,
|
||||||
HtmlAdapterExtension,
|
HtmlAdapterExtension,
|
||||||
MarkdownAdapterExtension,
|
MarkdownAdapterExtension,
|
||||||
NotionHtmlAdapterExtension,
|
NotionHtmlAdapterExtension,
|
||||||
} from './preset/adapters.js';
|
PlainTextAdapterExtension,
|
||||||
|
} from '../adapters/extension.js';
|
||||||
|
|
||||||
export const CommonBlockSpecs: ExtensionType[] = [
|
export const CommonBlockSpecs: ExtensionType[] = [
|
||||||
DocDisplayMetaService,
|
DocDisplayMetaService,
|
||||||
@@ -119,4 +120,5 @@ export const StoreExtensions: ExtensionType[] = [
|
|||||||
HtmlAdapterExtension,
|
HtmlAdapterExtension,
|
||||||
MarkdownAdapterExtension,
|
MarkdownAdapterExtension,
|
||||||
NotionHtmlAdapterExtension,
|
NotionHtmlAdapterExtension,
|
||||||
|
PlainTextAdapterExtension,
|
||||||
].flat();
|
].flat();
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import {
|
||||||
|
EdgelessBuiltInSpecs,
|
||||||
|
PageRootBlockSpec,
|
||||||
|
} from '@blocksuite/affine-block-root';
|
||||||
|
import type { ExtensionType } from '@blocksuite/store';
|
||||||
|
|
||||||
|
import {
|
||||||
|
EdgelessFirstPartyBlockSpecs,
|
||||||
|
PageFirstPartyBlockSpecs,
|
||||||
|
} from './common';
|
||||||
|
|
||||||
|
export const EdgelessEditorBlockSpecs: ExtensionType[] = [
|
||||||
|
EdgelessBuiltInSpecs,
|
||||||
|
EdgelessFirstPartyBlockSpecs,
|
||||||
|
].flat();
|
||||||
|
|
||||||
|
export const PageEditorBlockSpecs: ExtensionType[] = [
|
||||||
|
PageRootBlockSpec,
|
||||||
|
PageFirstPartyBlockSpecs,
|
||||||
|
].flat();
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
export * from './common.js';
|
||||||
|
export * from './editor-specs.js';
|
||||||
|
export * from './preview-specs.js';
|
||||||
+1
-1
@@ -7,7 +7,7 @@ import type { ExtensionType } from '@blocksuite/store';
|
|||||||
import {
|
import {
|
||||||
EdgelessFirstPartyBlockSpecs,
|
EdgelessFirstPartyBlockSpecs,
|
||||||
PageFirstPartyBlockSpecs,
|
PageFirstPartyBlockSpecs,
|
||||||
} from '../common.js';
|
} from './common.js';
|
||||||
|
|
||||||
export const PreviewEdgelessEditorBlockSpecs: ExtensionType[] = [
|
export const PreviewEdgelessEditorBlockSpecs: ExtensionType[] = [
|
||||||
PreviewEdgelessRootBlockSpec,
|
PreviewEdgelessRootBlockSpec,
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
import { SpecProvider } from '@blocksuite/affine-shared/utils';
|
||||||
|
|
||||||
|
import { StoreExtensions } from './common.js';
|
||||||
|
import {
|
||||||
|
EdgelessEditorBlockSpecs,
|
||||||
|
PageEditorBlockSpecs,
|
||||||
|
} from './editor-specs.js';
|
||||||
|
import {
|
||||||
|
PreviewEdgelessEditorBlockSpecs,
|
||||||
|
PreviewPageEditorBlockSpecs,
|
||||||
|
} from './preview-specs.js';
|
||||||
|
|
||||||
|
export function registerSpecs() {
|
||||||
|
SpecProvider._.addSpec('store', StoreExtensions);
|
||||||
|
SpecProvider._.addSpec('page', PageEditorBlockSpecs);
|
||||||
|
SpecProvider._.addSpec('edgeless', EdgelessEditorBlockSpecs);
|
||||||
|
SpecProvider._.addSpec('preview:page', PreviewPageEditorBlockSpecs);
|
||||||
|
SpecProvider._.addSpec('preview:edgeless', PreviewEdgelessEditorBlockSpecs);
|
||||||
|
}
|
||||||
@@ -1,8 +1,5 @@
|
|||||||
/* oxlint-disable @typescript-eslint/triple-slash-reference */
|
export * from './adapters/index.js';
|
||||||
/// <reference path="./effects.ts" />
|
export * from './extensions/index.js';
|
||||||
|
|
||||||
export * from './_common/adapters/index.js';
|
|
||||||
export * from './_specs/index.js';
|
|
||||||
export * from './schemas.js';
|
export * from './schemas.js';
|
||||||
export * from '@blocksuite/affine-block-attachment';
|
export * from '@blocksuite/affine-block-attachment';
|
||||||
export * from '@blocksuite/affine-block-bookmark';
|
export * from '@blocksuite/affine-block-bookmark';
|
||||||
@@ -105,6 +102,7 @@ export {
|
|||||||
printToPdf,
|
printToPdf,
|
||||||
referenceToNode,
|
referenceToNode,
|
||||||
type Signal,
|
type Signal,
|
||||||
|
SpecBuilder,
|
||||||
SpecProvider,
|
SpecProvider,
|
||||||
} from '@blocksuite/affine-shared/utils';
|
} from '@blocksuite/affine-shared/utils';
|
||||||
export type { DragBlockPayload } from '@blocksuite/affine-widget-drag-handle';
|
export type { DragBlockPayload } from '@blocksuite/affine-widget-drag-handle';
|
||||||
|
|||||||
@@ -5,8 +5,7 @@ import { TestWorkspace } from '@blocksuite/store/test';
|
|||||||
export function createEmptyDoc() {
|
export function createEmptyDoc() {
|
||||||
const schema = new Schema().register(AffineSchemas);
|
const schema = new Schema().register(AffineSchemas);
|
||||||
const collection = new TestWorkspace({ schema });
|
const collection = new TestWorkspace({ schema });
|
||||||
collection.storeExtensions =
|
collection.storeExtensions = SpecProvider._.getSpec('store').value;
|
||||||
SpecProvider.getInstance().getSpec('store').value;
|
|
||||||
collection.meta.initialize();
|
collection.meta.initialize();
|
||||||
const doc = collection.createDoc();
|
const doc = collection.createDoc();
|
||||||
|
|
||||||
|
|||||||
@@ -56,8 +56,7 @@ export function createStarterDocCollection() {
|
|||||||
blobSources,
|
blobSources,
|
||||||
};
|
};
|
||||||
const collection = new TestWorkspace(options);
|
const collection = new TestWorkspace(options);
|
||||||
collection.storeExtensions =
|
collection.storeExtensions = SpecProvider._.getSpec('store').value;
|
||||||
SpecProvider.getInstance().getSpec('store').value;
|
|
||||||
collection.start();
|
collection.start();
|
||||||
|
|
||||||
// debug info
|
// debug info
|
||||||
|
|||||||
@@ -208,8 +208,7 @@ export class AISlidesRenderer extends WithDisposable(LitElement) {
|
|||||||
>
|
>
|
||||||
${new BlockStdScope({
|
${new BlockStdScope({
|
||||||
store: this._doc,
|
store: this._doc,
|
||||||
extensions:
|
extensions: SpecProvider._.getSpec('preview:edgeless').value,
|
||||||
SpecProvider.getInstance().getSpec('preview:edgeless').value,
|
|
||||||
}).render()}
|
}).render()}
|
||||||
</div>
|
</div>
|
||||||
<div class="mask"></div>
|
<div class="mask"></div>
|
||||||
|
|||||||
+2
-3
@@ -244,11 +244,10 @@ export const extendEdgelessPreviewSpec = (function () {
|
|||||||
if (framework === _framework && _extension) {
|
if (framework === _framework && _extension) {
|
||||||
return _extension;
|
return _extension;
|
||||||
} else {
|
} else {
|
||||||
_extension &&
|
_extension && SpecProvider._.omitSpec('preview:edgeless', _extension);
|
||||||
SpecProvider.getInstance().omitSpec('preview:edgeless', _extension);
|
|
||||||
_extension = getThemeExtension(framework);
|
_extension = getThemeExtension(framework);
|
||||||
_framework = framework;
|
_framework = framework;
|
||||||
SpecProvider.getInstance().extendSpec('preview:edgeless', [_extension]);
|
SpecProvider._.extendSpec('preview:edgeless', [_extension]);
|
||||||
return _extension;
|
return _extension;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
+69
-1
@@ -32,11 +32,15 @@ import { I18n } from '@affine/i18n';
|
|||||||
import { track } from '@affine/track';
|
import { track } from '@affine/track';
|
||||||
import {
|
import {
|
||||||
BlockServiceWatcher,
|
BlockServiceWatcher,
|
||||||
|
type BlockStdScope,
|
||||||
BlockViewIdentifier,
|
BlockViewIdentifier,
|
||||||
|
ConfigIdentifier,
|
||||||
|
LifeCycleWatcher,
|
||||||
type WidgetComponent,
|
type WidgetComponent,
|
||||||
} from '@blocksuite/affine/block-std';
|
} from '@blocksuite/affine/block-std';
|
||||||
import type {
|
import type {
|
||||||
AffineReference,
|
AffineReference,
|
||||||
|
CodeBlockConfig,
|
||||||
DocMode,
|
DocMode,
|
||||||
DocModeProvider,
|
DocModeProvider,
|
||||||
OpenDocConfig,
|
OpenDocConfig,
|
||||||
@@ -44,6 +48,7 @@ import type {
|
|||||||
PeekOptions,
|
PeekOptions,
|
||||||
PeekViewService as BSPeekViewService,
|
PeekViewService as BSPeekViewService,
|
||||||
QuickSearchResult,
|
QuickSearchResult,
|
||||||
|
ReferenceNodeConfig,
|
||||||
RootBlockConfig,
|
RootBlockConfig,
|
||||||
} from '@blocksuite/affine/blocks';
|
} from '@blocksuite/affine/blocks';
|
||||||
import {
|
import {
|
||||||
@@ -52,20 +57,23 @@ import {
|
|||||||
DocModeExtension,
|
DocModeExtension,
|
||||||
EdgelessRootBlockComponent,
|
EdgelessRootBlockComponent,
|
||||||
EmbedLinkedDocBlockComponent,
|
EmbedLinkedDocBlockComponent,
|
||||||
|
FeatureFlagService,
|
||||||
GenerateDocUrlExtension,
|
GenerateDocUrlExtension,
|
||||||
insertLinkByQuickSearchCommand,
|
insertLinkByQuickSearchCommand,
|
||||||
MobileSpecsPatches,
|
|
||||||
NativeClipboardExtension,
|
NativeClipboardExtension,
|
||||||
NoteConfigExtension,
|
NoteConfigExtension,
|
||||||
NotificationExtension,
|
NotificationExtension,
|
||||||
OpenDocExtension,
|
OpenDocExtension,
|
||||||
|
ParagraphBlockService,
|
||||||
ParseDocUrlExtension,
|
ParseDocUrlExtension,
|
||||||
PeekViewExtension,
|
PeekViewExtension,
|
||||||
QuickSearchExtension,
|
QuickSearchExtension,
|
||||||
ReferenceNodeConfigExtension,
|
ReferenceNodeConfigExtension,
|
||||||
|
ReferenceNodeConfigIdentifier,
|
||||||
RootBlockConfigExtension,
|
RootBlockConfigExtension,
|
||||||
SidebarExtension,
|
SidebarExtension,
|
||||||
} from '@blocksuite/affine/blocks';
|
} from '@blocksuite/affine/blocks';
|
||||||
|
import type { Container } from '@blocksuite/affine/global/di';
|
||||||
import { Bound } from '@blocksuite/affine/global/utils';
|
import { Bound } from '@blocksuite/affine/global/utils';
|
||||||
import {
|
import {
|
||||||
type BlockSnapshot,
|
type BlockSnapshot,
|
||||||
@@ -602,6 +610,66 @@ export function patchForSharedPage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function patchForMobile() {
|
export function patchForMobile() {
|
||||||
|
class MobileSpecsPatches extends LifeCycleWatcher {
|
||||||
|
static override key = 'mobile-patches';
|
||||||
|
|
||||||
|
constructor(std: BlockStdScope) {
|
||||||
|
super(std);
|
||||||
|
const featureFlagService = std.get(FeatureFlagService);
|
||||||
|
|
||||||
|
featureFlagService.setFlag('enable_mobile_keyboard_toolbar', true);
|
||||||
|
featureFlagService.setFlag('enable_mobile_linked_doc_menu', true);
|
||||||
|
}
|
||||||
|
|
||||||
|
static override setup(di: Container) {
|
||||||
|
super.setup(di);
|
||||||
|
|
||||||
|
// Hide reference popup on mobile.
|
||||||
|
{
|
||||||
|
const prev = di.getFactory(ReferenceNodeConfigIdentifier);
|
||||||
|
di.override(ReferenceNodeConfigIdentifier, provider => {
|
||||||
|
return {
|
||||||
|
...prev?.(provider),
|
||||||
|
hidePopup: true,
|
||||||
|
} satisfies ReferenceNodeConfig;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hide number lines for code block on mobile.
|
||||||
|
{
|
||||||
|
const codeConfigIdentifier = ConfigIdentifier('affine:code');
|
||||||
|
const prev = di.getFactory(codeConfigIdentifier);
|
||||||
|
di.override(codeConfigIdentifier, provider => {
|
||||||
|
return {
|
||||||
|
...prev?.(provider),
|
||||||
|
showLineNumbers: false,
|
||||||
|
} satisfies CodeBlockConfig;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override mounted() {
|
||||||
|
// remove slash placeholder for mobile: `type / ...`
|
||||||
|
{
|
||||||
|
const paragraphService = this.std.get(ParagraphBlockService);
|
||||||
|
if (!paragraphService) return;
|
||||||
|
|
||||||
|
paragraphService.placeholderGenerator = model => {
|
||||||
|
const placeholders = {
|
||||||
|
text: '',
|
||||||
|
h1: 'Heading 1',
|
||||||
|
h2: 'Heading 2',
|
||||||
|
h3: 'Heading 3',
|
||||||
|
h4: 'Heading 4',
|
||||||
|
h5: 'Heading 5',
|
||||||
|
h6: 'Heading 6',
|
||||||
|
quote: '',
|
||||||
|
};
|
||||||
|
return placeholders[model.type];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
const extensions: ExtensionType[] = [
|
const extensions: ExtensionType[] = [
|
||||||
{
|
{
|
||||||
setup: di => {
|
setup: di => {
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@ export function createEdgelessModeSpecs(
|
|||||||
): SpecBuilder {
|
): SpecBuilder {
|
||||||
const featureFlagService = framework.get(FeatureFlagService);
|
const featureFlagService = framework.get(FeatureFlagService);
|
||||||
const enableAI = featureFlagService.flags.enable_ai.value;
|
const enableAI = featureFlagService.flags.enable_ai.value;
|
||||||
const edgelessSpec = SpecProvider.getInstance().getSpec('edgeless');
|
const edgelessSpec = SpecProvider._.getSpec('edgeless');
|
||||||
enableAffineExtension(framework, edgelessSpec);
|
enableAffineExtension(framework, edgelessSpec);
|
||||||
if (enableAI) {
|
if (enableAI) {
|
||||||
enableAIExtension(edgelessSpec);
|
enableAIExtension(edgelessSpec);
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import { enableAffineExtension, enableAIExtension } from './custom/root-block';
|
|||||||
export function createPageModeSpecs(framework: FrameworkProvider): SpecBuilder {
|
export function createPageModeSpecs(framework: FrameworkProvider): SpecBuilder {
|
||||||
const featureFlagService = framework.get(FeatureFlagService);
|
const featureFlagService = framework.get(FeatureFlagService);
|
||||||
const enableAI = featureFlagService.flags.enable_ai.value;
|
const enableAI = featureFlagService.flags.enable_ai.value;
|
||||||
const provider = SpecProvider.getInstance();
|
const provider = SpecProvider._;
|
||||||
const pageSpec = provider.getSpec('page');
|
const pageSpec = provider.getSpec('page');
|
||||||
enableAffineExtension(framework, pageSpec);
|
enableAffineExtension(framework, pageSpec);
|
||||||
if (enableAI) {
|
if (enableAI) {
|
||||||
|
|||||||
+2
-2
@@ -33,7 +33,7 @@ function patchPreviewSpec(
|
|||||||
id: 'preview:edgeless' | 'preview:page',
|
id: 'preview:edgeless' | 'preview:page',
|
||||||
specs: ExtensionType[]
|
specs: ExtensionType[]
|
||||||
) {
|
) {
|
||||||
const specProvider = SpecProvider.getInstance();
|
const specProvider = SpecProvider._;
|
||||||
specProvider.extendSpec(id, specs);
|
specProvider.extendSpec(id, specs);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,7 +100,7 @@ export function getPagePreviewThemeExtension(framework: FrameworkProvider) {
|
|||||||
export function createPageModePreviewSpecs(
|
export function createPageModePreviewSpecs(
|
||||||
framework: FrameworkProvider
|
framework: FrameworkProvider
|
||||||
): SpecBuilder {
|
): SpecBuilder {
|
||||||
const specProvider = SpecProvider.getInstance();
|
const specProvider = SpecProvider._;
|
||||||
const pagePreviewSpec = specProvider.getSpec('preview:page');
|
const pagePreviewSpec = specProvider.getSpec('preview:page');
|
||||||
// Enable theme extension, doc display meta extension and peek view service
|
// Enable theme extension, doc display meta extension and peek view service
|
||||||
const peekViewService = framework.get(PeekViewService);
|
const peekViewService = framework.get(PeekViewService);
|
||||||
|
|||||||
+1
-1
@@ -92,7 +92,7 @@ export const EdgelessSnapshot = (props: Props) => {
|
|||||||
const editorHost = new BlockStdScope({
|
const editorHost = new BlockStdScope({
|
||||||
store: doc,
|
store: doc,
|
||||||
extensions: [
|
extensions: [
|
||||||
...SpecProvider.getInstance().getSpec('preview:edgeless').value,
|
...SpecProvider._.getSpec('preview:edgeless').value,
|
||||||
getThemeExtension(framework),
|
getThemeExtension(framework),
|
||||||
],
|
],
|
||||||
}).render();
|
}).render();
|
||||||
|
|||||||
@@ -289,7 +289,7 @@ export class DocImpl implements Doc {
|
|||||||
return this._storeMap.get(key) as Store;
|
return this._storeMap.get(key) as Store;
|
||||||
}
|
}
|
||||||
|
|
||||||
const storeExtensions = SpecProvider.getInstance().getSpec('store');
|
const storeExtensions = SpecProvider._.getSpec('store');
|
||||||
const extensionSet = new Set(
|
const extensionSet = new Set(
|
||||||
storeExtensions.value.concat(extensions ?? [])
|
storeExtensions.value.concat(extensions ?? [])
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -4052,31 +4052,8 @@ __metadata:
|
|||||||
"@blocksuite/icons": "npm:^2.2.1"
|
"@blocksuite/icons": "npm:^2.2.1"
|
||||||
"@blocksuite/inline": "workspace:*"
|
"@blocksuite/inline": "workspace:*"
|
||||||
"@blocksuite/store": "workspace:*"
|
"@blocksuite/store": "workspace:*"
|
||||||
"@floating-ui/dom": "npm:^1.6.10"
|
|
||||||
"@lit/context": "npm:^1.1.2"
|
|
||||||
"@preact/signals-core": "npm:^1.8.0"
|
|
||||||
"@toeverything/theme": "npm:^1.1.11"
|
|
||||||
"@types/katex": "npm:^0.16.7"
|
|
||||||
"@types/lodash-es": "npm:^4.17.12"
|
|
||||||
"@vanilla-extract/css": "npm:^1.17.0"
|
|
||||||
"@vanilla-extract/vite-plugin": "npm:^5.0.0"
|
"@vanilla-extract/vite-plugin": "npm:^5.0.0"
|
||||||
date-fns: "npm:^4.0.0"
|
|
||||||
dompurify: "npm:^3.2.4"
|
|
||||||
fflate: "npm:^0.8.2"
|
|
||||||
file-type: "npm:^20.0.0"
|
|
||||||
fractional-indexing: "npm:^3.2.0"
|
|
||||||
html2canvas: "npm:^1.4.1"
|
|
||||||
katex: "npm:^0.16.11"
|
|
||||||
lit: "npm:^3.2.0"
|
|
||||||
lodash-es: "npm:^4.17.21"
|
|
||||||
lz-string: "npm:^1.5.0"
|
|
||||||
minimatch: "npm:^10.0.1"
|
|
||||||
nanoid: "npm:^5.0.7"
|
|
||||||
shiki: "npm:^2.0.0"
|
|
||||||
simple-xml-to-json: "npm:^1.2.2"
|
|
||||||
vitest: "npm:3.0.6"
|
vitest: "npm:3.0.6"
|
||||||
yjs: "npm:^13.6.21"
|
|
||||||
zod: "npm:^3.23.8"
|
|
||||||
languageName: unknown
|
languageName: unknown
|
||||||
linkType: soft
|
linkType: soft
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user