Files
AFFiNE-Mirror/blocksuite/affine/blocks/image/src/adapters/notion-html.ts
T
donteatfriedrice 26ece014f1 fix(editor): support relative image reference path when importing zip with images (#12264)
Closes: [BS-3385](https://linear.app/affine-design/issue/BS-3385/markdown类型的导入,支持media文件和md文件不在同目录的情况)

<!-- This is an auto-generated comment: release notes by coderabbit.ai -->
## Summary by CodeRabbit

- **New Features**
  - Added utility functions to resolve and normalize image file paths in markdown and HTML imports.
  - Introduced middleware to provide full file path context during file import and transformation.
  - Added new types for improved asset and file management in zip imports.

- **Refactor**
  - Centralized and simplified image processing logic across HTML, Markdown, and Notion HTML adapters for improved maintainability.
  - Enhanced type safety and clarity in file and asset handling during zip imports.

- **Tests**
  - Added comprehensive tests for image file path resolution utility.

- **Documentation**
  - Improved inline code comments explaining file path resolution logic.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2025-05-14 02:30:30 +00:00

83 lines
2.3 KiB
TypeScript

import { ImageBlockSchema } from '@blocksuite/affine-model';
import {
BlockNotionHtmlAdapterExtension,
type BlockNotionHtmlAdapterMatcher,
HastUtils,
} from '@blocksuite/affine-shared/adapters';
import { processImageNodeToBlock } from './utils';
export const imageBlockNotionHtmlAdapterMatcher: BlockNotionHtmlAdapterMatcher =
{
flavour: ImageBlockSchema.model.flavour,
toMatch: o => {
return (
HastUtils.isElement(o.node) &&
(o.node.tagName === 'img' ||
(o.node.tagName === 'figure' &&
!!HastUtils.querySelector(o.node, '.image')))
);
},
fromMatch: () => false,
toBlockSnapshot: {
enter: async (o, context) => {
if (!HastUtils.isElement(o.node)) {
return;
}
const { assets, walkerContext, configs } = context;
if (!assets) {
return;
}
if (walkerContext.getGlobalContext('hast:disableimg')) {
return;
}
switch (o.node.tagName) {
case 'img': {
const image = o.node;
const imageURL =
typeof image?.properties.src === 'string'
? image.properties.src
: '';
if (imageURL) {
await processImageNodeToBlock(
imageURL,
walkerContext,
assets,
configs
);
}
break;
}
case 'figure': {
const imageFigureWrapper = HastUtils.querySelector(
o.node,
'.image'
);
let imageURL = '';
if (imageFigureWrapper) {
const image = HastUtils.querySelector(imageFigureWrapper, 'img');
imageURL =
typeof image?.properties.src === 'string'
? image.properties.src
: '';
}
if (imageURL) {
await processImageNodeToBlock(
imageURL,
walkerContext,
assets,
configs
);
}
break;
}
}
},
},
fromBlockSnapshot: {},
};
export const ImageBlockNotionHtmlAdapterExtension =
BlockNotionHtmlAdapterExtension(imageBlockNotionHtmlAdapterMatcher);