feat: redesign Canvas plan and reference flow

This commit is contained in:
inman
2026-09-07 10:06:38 +08:00
parent f8eee430f4
commit 1562a49ff1
18 changed files with 2141 additions and 1057 deletions

View File

@@ -0,0 +1,39 @@
import { describe, expect, it } from 'vitest';
import {
findUnboundReferenceNumbers,
findReferenceMentionRange,
insertReferenceToken,
promptReferencesImage,
removeReferenceTokenAndShift,
} from '@/pages/ImageCanvas/reference-tokens';
describe('Canvas reference tokens', () => {
it('recognizes explicit numbered image aliases only', () => {
expect(promptReferencesImage('参考 @图片1 和 @图2', 0)).toBe(true);
expect(promptReferencesImage('参考 @图片1 和 @图2', 1)).toBe(true);
expect(promptReferencesImage('普通的 @图片 文字', 0)).toBe(false);
});
it('reports aliases that do not have a bound reference', () => {
expect(findUnboundReferenceNumbers('参考 @图片1、@图3 和 @图片2,再看 @图片3', 1))
.toEqual([2, 3]);
expect(findUnboundReferenceNumbers('不要使用 @图片0', 2)).toEqual([0]);
});
it('finds an unfinished @ mention at the cursor', () => {
expect(findReferenceMentionRange('让 @图', 4)).toEqual({ start: 2, end: 4 });
expect(findReferenceMentionRange('让 @图 继续', 7)).toBeNull();
});
it('inserts a token at the mention range', () => {
expect(insertReferenceToken('让 @ 作为主体', 1, { start: 2, end: 3 })).toEqual({
value: '让 @图片2 作为主体',
cursor: 6,
});
});
it('removes the deleted token and shifts later aliases with their bindings', () => {
expect(removeReferenceTokenAndShift('参考 @图片1,结合 @图片2 的光线', 0))
.toBe('参考 结合 @图片1 的光线');
});
});