@mce/psd 0.24.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,30 @@
1
+ /**
2
+ * PSD → mce 元素的纯转换逻辑(不依赖编辑器 / DOM,便于单测)。
3
+ *
4
+ * 把 PSD 的图层树展平为图片元素(坐标为 PSD 绝对坐标),整体包进一个 Frame 画板。
5
+ * 图层位图如何变成可用 URL 由 `resolveImage` 注入(插件层用 editor.upload,
6
+ * 测试用桩函数)。隐藏图层跳过;组只递归不产出自身节点。
7
+ */
8
+ export interface PsdLayerLike {
9
+ name?: string;
10
+ left?: number;
11
+ top?: number;
12
+ right?: number;
13
+ bottom?: number;
14
+ opacity?: number;
15
+ hidden?: boolean;
16
+ canvas?: {
17
+ width: number;
18
+ height: number;
19
+ };
20
+ children?: PsdLayerLike[];
21
+ }
22
+ export interface PsdLike {
23
+ name?: string;
24
+ width: number;
25
+ height: number;
26
+ children?: PsdLayerLike[];
27
+ }
28
+ /** 把一个图层位图解析为 mce 可用的 foreground 来源(URL / blob 等)。 */
29
+ export type ResolveLayerImage = (canvas: NonNullable<PsdLayerLike['canvas']>, layer: PsdLayerLike) => Promise<any>;
30
+ export declare function psdToFrame(psd: PsdLike, resolveImage: ResolveLayerImage, name?: string): Promise<any>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ import { plugin } from './plugin';
2
+ export * from './convert';
3
+ export * from './plugin';
4
+ export default plugin;
package/dist/index.js ADDED
@@ -0,0 +1,86 @@
1
+ import { definePlugin } from "mce";
2
+ //#region src/convert.ts
3
+ async function psdToFrame(psd, resolveImage, name) {
4
+ const children = [];
5
+ async function walk(layers) {
6
+ for (const layer of layers ?? []) {
7
+ if (layer.hidden) continue;
8
+ if (layer.children?.length) {
9
+ await walk(layer.children);
10
+ continue;
11
+ }
12
+ const canvas = layer.canvas;
13
+ const width = canvas?.width ?? (layer.right ?? 0) - (layer.left ?? 0);
14
+ const height = canvas?.height ?? (layer.bottom ?? 0) - (layer.top ?? 0);
15
+ if (!canvas || width <= 0 || height <= 0) continue;
16
+ const foreground = await resolveImage(canvas, layer);
17
+ children.push({
18
+ name: layer.name || "Layer",
19
+ foreground,
20
+ style: {
21
+ left: layer.left ?? 0,
22
+ top: layer.top ?? 0,
23
+ width,
24
+ height,
25
+ opacity: layer.opacity ?? 1
26
+ },
27
+ meta: { inCanvasIs: "Element2D" }
28
+ });
29
+ }
30
+ }
31
+ await walk(psd.children);
32
+ return {
33
+ name: name ?? psd.name ?? "PSD",
34
+ style: {
35
+ left: 0,
36
+ top: 0,
37
+ width: psd.width,
38
+ height: psd.height
39
+ },
40
+ meta: {
41
+ inCanvasIs: "Element2D",
42
+ inEditorIs: "Frame"
43
+ },
44
+ children
45
+ };
46
+ }
47
+ //#endregion
48
+ //#region src/plugin.ts
49
+ var PSD_RE = /\.psd$/i;
50
+ function canvasToBlob(canvas) {
51
+ return new Promise((resolve, reject) => {
52
+ canvas.toBlob((blob) => blob ? resolve(blob) : reject(/* @__PURE__ */ new Error("PSD layer canvas.toBlob failed")), "image/png");
53
+ });
54
+ }
55
+ function plugin() {
56
+ return definePlugin((editor) => {
57
+ const { upload, log } = editor;
58
+ return {
59
+ name: "mce:psd",
60
+ messages: {
61
+ en: { "load:psd": "Import PSD" },
62
+ zhHans: { "load:psd": "导入 PSD" }
63
+ },
64
+ loaders: [{
65
+ name: "psd",
66
+ accept: ".psd",
67
+ test: (source) => {
68
+ if (source instanceof File) return PSD_RE.test(source.name);
69
+ if (source instanceof Blob) return source.type === "image/vnd.adobe.photoshop" || source.type === "application/x-photoshop";
70
+ return false;
71
+ },
72
+ load: async (source) => {
73
+ const { readPsd } = await import("ag-psd");
74
+ const frame = await psdToFrame(readPsd(await source.arrayBuffer(), { useImageData: false }), async (canvas, layer) => upload(new File([await canvasToBlob(canvas)], `${layer.name || "layer"}.png`, { type: "image/png" })), source.name);
75
+ log?.("load psd", `${frame.children?.length ?? 0} layers`);
76
+ return frame;
77
+ }
78
+ }]
79
+ };
80
+ });
81
+ }
82
+ //#endregion
83
+ //#region src/index.ts
84
+ var src_default = plugin;
85
+ //#endregion
86
+ export { src_default as default, plugin, psdToFrame };
@@ -0,0 +1 @@
1
+ export declare function plugin(): import("mce").Plugin;
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@mce/psd",
3
+ "type": "module",
4
+ "version": "0.24.4",
5
+ "description": "PSD (Photoshop) import plugin for mce",
6
+ "author": "wxm",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/qq15725/mce",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/qq15725/mce.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/qq15725/mce/issues"
15
+ },
16
+ "keywords": [
17
+ "mce",
18
+ "psd",
19
+ "photoshop",
20
+ "plugin"
21
+ ],
22
+ "sideEffects": true,
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js",
27
+ "require": "./dist/index.js"
28
+ },
29
+ "./*.mjs": "./*.js",
30
+ "./*": "./*"
31
+ },
32
+ "main": "./dist/index.js",
33
+ "module": "./dist/index.js",
34
+ "browser": "./dist/index.js",
35
+ "typings": "dist/index.d.ts",
36
+ "types": "dist/index.d.ts",
37
+ "typesVersions": {
38
+ "*": {
39
+ "*": [
40
+ "*",
41
+ "dist/*",
42
+ "dist/*.d.ts"
43
+ ]
44
+ }
45
+ },
46
+ "files": [
47
+ "dist"
48
+ ],
49
+ "dependencies": {
50
+ "ag-psd": "^30.2.0"
51
+ },
52
+ "devDependencies": {
53
+ "mce": "0.24.4"
54
+ },
55
+ "peerDependencies": {
56
+ "mce": "^0"
57
+ },
58
+ "scripts": {
59
+ "build:code": "vite build",
60
+ "build:tsc": "NODE_ENV=production tsc --emitDeclarationOnly --project tsconfig.json",
61
+ "build": "pnpm build:code && pnpm build:tsc",
62
+ "test": "vitest run",
63
+ "lint": "eslint src",
64
+ "typecheck": "tsc --noEmit --project tsconfig.json"
65
+ }
66
+ }