Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
P
psd-parse-web
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
劳工
psd-parse-web
Commits
7dd74446
Commit
7dd74446
authored
Nov 03, 2020
by
张九刚
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
U
parent
fb98a2e4
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
318 additions
and
1254 deletions
+318
-1254
index.es.js
dist/index.es.js
+6
-339
index.es.js.map
dist/index.es.js.map
+1
-1
index.js
dist/index.js
+6
-344
index.js.map
dist/index.js.map
+1
-1
index.umd.js
dist/index.umd.js
+16
-353
index.umd.js.map
dist/index.umd.js.map
+1
-1
1f6366eceaa6ebd0f14a749d70a996703f7e94bd.png
imagesPath/1f6366eceaa6ebd0f14a749d70a996703f7e94bd.png
+0
-0
b2af0b52a195e0632471cfc92ee5feb24dec19c7.png
imagesPath/b2af0b52a195e0632471cfc92ee5feb24dec19c7.png
+0
-0
cfbba72b1cb37578be027387c79ae66987f65344.png
imagesPath/cfbba72b1cb37578be027387c79ae66987f65344.png
+0
-0
package-lock.json
package-lock.json
+178
-0
package.json
package.json
+3
-0
index.js
src/index.js
+7
-2
psd-tree.js
src/psd-tree.js
+12
-6
utils.js
src/utils.js
+6
-2
zeroing.js
src/zeroing.js
+72
-205
index.js
test/index.js
+9
-0
No files found.
dist/index.es.js
View file @
7dd74446
import
path
from
'path'
;
import
'color'
;
import
generateUUID
from
'uuid/v4'
;
import
hash
from
'object-hash'
;
import
zlib
from
'zlib'
;
/**
* Created by rockyl on 2019-08-09.
*/
const
PSD
=
window
[
'require'
](
'psd'
);
async
function
getTree
(
file
)
{
let
psd
=
await
PSD
.
fromDroppedFile
(
file
);
const
root
=
{};
walk
(
psd
.
tree
(),
root
);
return
root
;
}
function
walk
(
psNode
,
dataNode
)
{
const
{
left
:
pLeft
=
0
,
top
:
pTop
=
0
,}
=
psNode
.
parent
||
{};
const
{
left
,
top
,
width
,
height
,
name
,
layer
:
{
opacity
,
visible
}}
=
psNode
;
const
x
=
left
-
pLeft
;
const
y
=
top
-
pTop
;
Object
.
assign
(
dataNode
,
{
x
,
y
,
width
,
height
,
opacity
:
opacity
/
255
,
visible
,
name
,
origin
:
psNode
,
label
:
`
${
name
}
> [
${
x
}
,
${
y
}
,
${
width
}
,
${
height
}
]`
});
if
(
psNode
.
children
()
&&
psNode
.
children
().
length
>
0
){
dataNode
.
children
=
[];
}
let
children
=
psNode
.
children
();
for
(
let
i
=
children
.
length
-
1
;
i
>=
0
;
i
--
)
{
const
childPsNode
=
children
[
i
];
const
childDataNode
=
{};
dataNode
.
children
.
push
(
childDataNode
);
walk
(
childPsNode
,
childDataNode
);
}
}
/**
* Created by rockyl on 2019-08-
10
.
* Created by rockyl on 2019-08-
08
.
*/
async
function
walkNode
(
node
,
callback
,
includeSelf
=
false
)
{
if
(
includeSelf
)
{
await
callback
(
node
,
null
);
}
if
(
node
.
children
&&
node
.
children
.
length
>
0
)
{
for
(
let
childNode
of
node
.
children
)
{
await
callback
(
childNode
,
node
);
const
result
=
await
walkNode
(
childNode
,
callback
);
if
(
result
===
true
)
{
break
;
}
}
}
}
/**
* Created by renjianfeng on 2020-06-11.
*
* 导出spark的视图
*/
const
{
getTree
}
=
require
(
'./psd-tree'
);
const
{
execute
}
=
require
(
"./zeroing"
);
const
relativePosPrefixMap
=
{
l
:
{
field
:
'left'
,},
t
:
{
field
:
'top'
,},
r
:
{
field
:
'right'
,},
b
:
{
field
:
'bottom'
,},
h
:
{
field
:
'horizonCenter'
,},
v
:
{
field
:
'verticalCenter'
,},
wp
:
{
field
:
'width'
,
},
hp
:
{
field
:
'height'
,
},
lp
:
{
field
:
'left'
,
},
tp
:
{
field
:
'top'
,
},
rp
:
{
field
:
'right'
,
},
bp
:
{
field
:
'bottom'
,
},
module
.
exports
=
{
getTree
,
execute
};
const
offsetAll
=
176
;
async
function
execute
(
psdFile
,
options
)
{
const
tree
=
await
getTree
(
psdFile
);
const
{
mode
=
'none'
,
singleView
=
true
}
=
options
;
let
offset
=
{
x
:
0
,
y
:
0
};
let
cutSize
=
{
x
:
0
,
y
:
0
};
if
(
mode
!==
'none'
)
{
cutSize
.
y
=
offsetAll
;
}
switch
(
mode
)
{
case
'top'
:
offset
.
y
=
offsetAll
;
break
;
case
'center'
:
offset
.
y
=
offsetAll
/
2
;
break
;
}
const
isCenter
=
mode
===
'center'
;
let
viewRoot
=
{
name
:
path
.
basename
(
psdFile
.
name
,
'.psd'
),
componentName
:
'Div'
,
uuid
:
generateUUID
(),
};
const
assets
=
[];
const
imageHashMap
=
{};
let
{
width
:
stageWidthOrigin
,
height
:
stageHeightOrigin
}
=
tree
;
const
stageWidth
=
stageWidthOrigin
-
cutSize
.
x
||
0
;
const
stageHeight
=
stageHeightOrigin
-
cutSize
.
y
||
0
;
await
walkNode
(
tree
,
async
function
(
node
,
parent
)
{
let
{
name
}
=
node
;
const
{
x
,
y
,
width
,
height
,
opacity
,
display
,
origin
:
{
layer
,
layer
:
{
typeTool
,
solidColor
}}}
=
node
;
//console.log('walk node:', name);
let
properties
=
{
style
:{
width
,
height
,
opacity
,
display
,
},
attrs
:{
},
className
:
""
};
const
isSecondLayer
=
singleView
&&
!
parent
.
origin
.
parent
||
!
singleView
&&
parent
.
origin
.
parent
&&
!
parent
.
origin
.
parent
.
parent
;
const
shouldVerticalCenter
=
isSecondLayer
&&
isCenter
;
if
(
name
.
includes
(
'|'
)
||
shouldVerticalCenter
)
{
try
{
let
arr
=
name
.
split
(
'|'
);
name
=
arr
[
0
];
let
paramsStr
=
arr
[
1
];
let
relativePos
;
if
(
paramsStr
){
let
params
=
paramsStr
.
split
(
';'
);
relativePos
=
params
[
0
];
}
else
if
(
shouldVerticalCenter
){
relativePos
=
'v'
;
}
if
(
relativePos
)
{
let
items
=
relativePos
.
split
(
','
);
for
(
let
item
of
items
)
{
let
result
=
item
.
match
(
/
[
a-zA-Z
]
+/
);
if
(
!
result
){
continue
;
}
let
prefix
=
result
[
0
];
let
mapItem
=
relativePosPrefixMap
[
prefix
];
if
(
mapItem
)
{
let
{
field
,}
=
mapItem
;
let
value
=
item
.
substr
(
prefix
.
length
);
let
hasValue
=
value
.
length
>
0
;
let
fieldChar
=
prefix
[
0
];
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
value
=
x
-
offset
.
x
;
break
;
case
't'
:
value
=
y
-
offset
.
y
;
break
;
case
'r'
:
value
=
stageWidth
-
(
x
-
offset
.
x
)
-
width
;
break
;
case
'b'
:
value
=
stageHeight
-
(
y
-
offset
.
y
)
-
height
;
break
;
case
'h'
:
value
=
x
+
width
/
2
-
stageWidthOrigin
/
2
;
break
;
case
'v'
:
value
=
y
+
height
/
2
-
stageHeightOrigin
/
2
;
break
;
}
}
let
isPercent
=
prefix
.
endsWith
(
'p'
);
if
(
isPercent
)
{
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
case
'r'
:
value
/=
stageWidth
;
break
;
case
't'
:
case
'b'
:
value
/=
stageHeight
;
break
;
}
value
=
Math
.
floor
(
value
*
100
);
}
value
+=
'%'
;
}
else
{
value
=
parseFloat
(
value
);
if
(
isNaN
(
value
))
{
value
=
0
;
}
}
console
.
log
(
properties
);
properties
.
style
[
field
]
=
value
;
}
}
}
}
catch
(
e
)
{
console
.
log
(
e
);
}
}
let
viewNode
=
{
name
,
properties
,
uuid
:
generateUUID
(),
};
let
dealLater
=
true
;
if
(
x
!==
0
)
{
console
.
log
(
properties
);
if
(
!
properties
.
style
.
left
){
properties
.
style
.
left
=
x
-
(
isSecondLayer
?
offset
.
x
:
0
);
}
}
if
(
y
!==
0
)
{
if
(
!
properties
.
style
.
top
){
properties
.
style
.
top
=
y
-
(
isSecondLayer
?
offset
.
y
:
0
);
}
}
properties
.
style
.
position
=
"absolute"
;
properties
.
style
.
transformOrigin
=
"0px 0px 0px"
;
viewNode
.
rect
=
{
x
:
properties
.
style
.
left
?
properties
.
style
.
left
:
0
,
y
:
properties
.
style
.
top
?
properties
.
style
.
top
:
0
,
width
:
properties
.
style
.
width
,
height
:
properties
.
style
.
height
};
if
(
typeTool
)
{
let
fontInfo
=
typeTool
();
properties
.
attrs
.
text
=
fontInfo
.
textValue
;
const
sizes
=
fontInfo
.
sizes
();
const
colors
=
fontInfo
.
colors
();
properties
.
style
.
fontSize
=
sizes
?
sizes
[
0
]
||
20
:
20
;
let
[
r
,
g
,
b
,
a
]
=
colors
[
0
];
console
.
log
(
"color"
,[
r
,
g
,
b
,
a
]);
properties
.
style
.
color
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
,
${
a
/
255
}
)`
;
viewNode
.
componentName
=
'Label'
;
dealLater
=
false
;
}
else
if
(
solidColor
&&
layer
.
vectorMask
)
{
let
paths
=
layer
.
vectorMask
().
paths
;
if
(
paths
[
2
].
numPoints
===
4
)
{
let
isRect
=
true
;
for
(
let
i
=
3
;
i
<
paths
.
length
;
i
++
)
{
if
(
paths
[
i
].
recordType
!==
2
)
{
isRect
=
false
;
break
;
}
}
if
(
isRect
)
{
viewNode
.
componentName
=
'Div'
;
const
{
r
,
g
,
b
}
=
solidColor
();
properties
.
style
.
backgroundColor
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
, 1)`
;
dealLater
=
false
;
}
}
}
if
(
dealLater
)
{
if
(
node
.
hasOwnProperty
(
'children'
))
{
viewNode
.
componentName
=
'Div'
;
}
else
{
viewNode
.
componentName
=
'Image'
;
let
uuid
=
generateUUID
();
const
ext
=
'.png'
;
let
dataUrl
;
try
{
let
img
=
node
.
origin
.
toPng
();
dataUrl
=
img
.
src
;
}
catch
(
e
)
{
}
if
(
dataUrl
)
{
let
base64Data
=
dataUrl
.
replace
(
/^data:image
\/\w
+;base64,/
,
""
);
let
buffer
=
new
Buffer
(
base64Data
,
'base64'
);
const
fileNameHash
=
hash
(
buffer
);
if
(
imageHashMap
.
hasOwnProperty
(
fileNameHash
))
{
uuid
=
imageHashMap
[
fileNameHash
];
}
else
{
imageHashMap
[
fileNameHash
]
=
uuid
;
assets
.
push
({
name
,
ext
,
uuid
,
base64Data
,
hash
:
fileNameHash
,
});
}
properties
.
attrs
.
source
=
'asset://'
+
uuid
;
}
}
}
let
viewParent
=
parent
.
view
||
viewRoot
;
if
(
!
viewParent
.
hasOwnProperty
(
'children'
))
{
viewParent
.
children
=
[];
}
viewParent
.
children
.
push
(
viewNode
);
node
.
view
=
viewNode
;
});
console
.
log
(
psdFile
);
let
data
=
{
pluginVersion
:
"0.0.1"
,
reference
:
"psd"
,
fileName
:
psdFile
.
name
,
assets
,
view
:
viewRoot
,
};
let
dataString
=
JSON
.
stringify
(
data
);
let
buf
=
new
Buffer
(
dataString
);
return
await
new
Promise
((
resolve
,
reject
)
=>
{
zlib
.
gzip
(
buf
,
function
(
err
,
res
)
{
if
(
err
)
{
reject
(
err
);
}
else
{
console
.
log
(
res
.
length
);
resolve
(
res
);
}
});
})
}
export
{
getTree
,
execute
as
toZeroing
};
//# sourceMappingURL=index.es.js.map
dist/index.es.js.map
View file @
7dd74446
{
"version"
:
3
,
"file"
:
"index.es.js"
,
"sources"
:
[
"../src/psd-tree.js"
,
"../src/utils.js"
,
"../src/zeroing.js"
],
"sourcesContent"
:
[
"/**
\n
* Created by rockyl on 2019-08-09.
\n
*/
\n\n
const PSD = window['require']('psd');
\n\n
export async function getTree(file) {\n
\t
let psd = await PSD.fromDroppedFile(file);
\n\n\t
const root = {};
\n\t
walk(psd.tree(), root);
\n\n\t
return root;
\n
}
\n\n
function walk(psNode, dataNode) {\n
\t
const {left: pLeft = 0, top: pTop = 0,} = psNode.parent || {};
\n\t
const {left, top, width, height, name, layer: {opacity, visible}} = psNode;
\n\t
const x = left - pLeft;
\n\t
const y = top - pTop;
\n\n\t
Object.assign(dataNode, {x, y, width, height, opacity: opacity / 255, visible, name, origin: psNode, label: `${name} > [${x}, ${y}, ${width}, ${height}]`});
\n\t
if (psNode.children() && psNode.children().length > 0){\n
\t\t
dataNode.children = [];
\n\t
}
\n\n\t
let children = psNode.children();
\n\t
for (let i = children.length - 1; i >= 0; i--) {\n
\t\t
const childPsNode = children[i];
\n\n\t\t
const childDataNode = {};
\n\t\t
dataNode.children.push(childDataNode);
\n\t\t
walk(childPsNode, childDataNode)
\n\t
}
\n
}
\n
"
,
"/**
\n
* Created by rockyl on 2019-08-10.
\n
*/
\n\n
export async function walkNode(node, callback, includeSelf = false) {\n
\t
if (includeSelf) {\n
\t\t
await callback(node, null);
\n\t
}
\n\t
if (node.children && node.children.length > 0) {\n
\t\t
for (let childNode of node.children) {\n
\t\t\t
await callback(childNode, node);
\n\t\t\t
const result = await walkNode(childNode, callback);
\n\t\t\t
if (result === true)
{
\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n
}
\n\n
export async function walkObject(obj, callback) {\n
\t
if(typeof obj ===
\"
object
\"
){\n
\t\t
for (let key of Object.keys(obj)) {\n
\t\t\t
const value = obj[key];
\n\t\t\t
await callback(key, value, obj);
\n\t\t\t
const result = await walkObject(value, callback);
\n\t\t\t
if (result === true)
{
\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n
}
\n
"
,
"/**
\n
* Created by renjianfeng on 2020-06-11.
\n
*
\n
* 导出spark的视图
\n
*/
\n\n
import
{
getTree
}
from
\"
./psd-tree
\"
;
\n
import
{
walkNode
}
from
\"
./utils
\"
;
\n
import path from 'path'
\n
import Color from 'color'
\n
import generateUUID from 'uuid/v4'
\n
import hash from 'object-hash';
\n
import zlib from 'zlib';
\n\n
const relativePosPrefixMap = {\n
\t
l: {field: 'left',},
\n\t
t: {field: 'top',},
\n\t
r: {field: 'right',},
\n\t
b: {field: 'bottom',},
\n\t
h: {field: 'horizonCenter',},
\n\t
v: {field: 'verticalCenter',},
\n\t
wp: {field: 'width', },
\n\t
hp: {field: 'height', },
\n\t
lp: {field: 'left', },
\n\t
tp: {field: 'top', },
\n\t
rp: {field: 'right', },
\n\t
bp: {field: 'bottom', },
\n
};
\n\n
const offsetAll = 176;
\n\n
export async function execute(psdFile, options) {\n
\t
const tree = await getTree(psdFile);
\n\t
const {mode = 'none', singleView = true} = options;
\n\n\t
let offset = {x: 0, y: 0};
\n\t
let cutSize = {x: 0, y: 0};
\n\n\t
if (mode !== 'none') {\n
\t\t
cutSize.y = offsetAll;
\n\t
}
\n\t
switch (mode) {\n
\t\t
case 'top':
\n\t\t\t
offset.y = offsetAll;
\n\t\t\t
break;
\n\t\t
case 'center':
\n\t\t\t
offset.y = offsetAll / 2;
\n\t\t\t
break;
\n\t
}
\n\n\t
const isCenter = mode === 'center';
\n\n\t
let viewRoot = {\n
\t\t
name: path.basename(psdFile.name, '.psd'),
\n\t\t
componentName : 'Div',
\n\t\t
uuid: generateUUID(),
\n\t
};
\n\n\t
const assets = [];
\n\t
const imageHashMap = {};
\n\n\t
let {width: stageWidthOrigin, height: stageHeightOrigin} = tree;
\n\t
const stageWidth = stageWidthOrigin - cutSize.x || 0;
\n\t
const stageHeight = stageHeightOrigin - cutSize.y || 0;
\n\n\t
await walkNode(tree, async function (node, parent) {\n
\t\t
let
{
name
}
= node;
\n\t\t
const {x, y, width, height, opacity, display, origin: {layer, layer: {typeTool, solidColor}}} = node;
\n\t\t
//console.log('walk node:', name);
\n\t\t
let properties = {\n
\t\t\t
style:{\n
\t\t\t\t
width, height, opacity,display ,
\n\t\t\t
},
\n\t\t\t
attrs:
{
\n\n\t\t\t},\n\t\t\tclassName:\"\"\n\t\t
}
;
\n\t\t
const isSecondLayer = singleView && !parent.origin.parent || !singleView && parent.origin.parent && !parent.origin.parent.parent;
\n\t\t
const shouldVerticalCenter = isSecondLayer && isCenter;
\n\n\t\t
const {width: parentWidth, height: parentHeight} = parent;
\n\n\t\t
if (name.includes('|') || shouldVerticalCenter) {\n
\t\t\t
try {\n
\t\t\t\t
let arr = name.split('|');
\n\t\t\t\t
name = arr[0];
\n\t\t\t\t
let paramsStr = arr[1];
\n\t\t\t\t
let relativePos;
\n\t\t\t\t
if(paramsStr){\n
\t\t\t\t\t
let params = paramsStr.split(';');
\n\t\t\t\t\t
relativePos = params[0];
\n\t\t\t\t
}else if(shouldVerticalCenter){\n
\t\t\t\t\t
relativePos = 'v';
\n\t\t\t\t
}
\n\n\t\t\t\t
if (relativePos) {\n
\t\t\t\t\t
let items = relativePos.split(',');
\n\t\t\t\t\t
for (let item of items) {\n
\t\t\t\t\t\t
let result = item.match(/[a-zA-Z]+/);
\n\t\t\t\t\t\t
if(!result)
{
\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t
}
\n\t\t\t\t\t\t
let prefix = result[0];
\n\t\t\t\t\t\t
let mapItem = relativePosPrefixMap[prefix];
\n\t\t\t\t\t\t
if (mapItem) {\n
\t\t\t\t\t\t\t
let
{
field,
}
= mapItem;
\n\t\t\t\t\t\t\t
let value = item.substr(prefix.length);
\n\t\t\t\t\t\t\t
let hasValue = value.length > 0;
\n\t\t\t\t\t\t\t
let fieldChar = prefix[0];
\n\t\t\t\t\t\t\t
if(!hasValue){\n
\t\t\t\t\t\t\t\t
switch(fieldChar){\n
\t\t\t\t\t\t\t\t\t
case 'l':
\n\t\t\t\t\t\t\t\t\t\t
value = x - offset.x;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 't':
\n\t\t\t\t\t\t\t\t\t\t
value = y - offset.y;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'r':
\n\t\t\t\t\t\t\t\t\t\t
value = stageWidth - (x - offset.x) - width;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'b':
\n\t\t\t\t\t\t\t\t\t\t
value = stageHeight - (y - offset.y) - height;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'h':
\n\t\t\t\t\t\t\t\t\t\t
value = x + width / 2 - stageWidthOrigin / 2;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'v':
\n\t\t\t\t\t\t\t\t\t\t
value = y + height / 2 - stageHeightOrigin / 2;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
let isPercent = prefix.endsWith('p');
\n\t\t\t\t\t\t\t
if (isPercent) {\n
\t\t\t\t\t\t\t\t
if(!hasValue){\n
\t\t\t\t\t\t\t\t\t
switch(fieldChar){\n
\t\t\t\t\t\t\t\t\t\t
case 'l':
\n\t\t\t\t\t\t\t\t\t\t
case 'r':
\n\t\t\t\t\t\t\t\t\t\t\t
value /= stageWidth;
\n\t\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t\t
case 't':
\n\t\t\t\t\t\t\t\t\t\t
case 'b':
\n\t\t\t\t\t\t\t\t\t\t\t
value /= stageHeight;
\n\t\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t\t\t
value = Math.floor(value * 100);
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t\t
value += '%';
\n\t\t\t\t\t\t\t
} else {\n
\t\t\t\t\t\t\t\t
value = parseFloat(value);
\n\t\t\t\t\t\t\t\t
if (isNaN(value)) {\n
\t\t\t\t\t\t\t\t\t
value = 0;
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
console.log(properties)
\n\t\t\t\t\t\t\t
properties.style[field] = value;
\n\t\t\t\t\t\t
}
\n\t\t\t\t\t
}
\n\t\t\t\t
}
\n\t\t\t
}catch (e)
{
\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t
}
\n\n\t\t
let viewNode = {\n
\t\t\t
name,
\n\t\t\t
properties,
\n\t\t\t
uuid: generateUUID(),
\n\t\t
};
\n\t\t
let dealLater = true;
\n\t\t
if (x !== 0) {\n
\t\t\t
console.log(properties)
\n\t\t\t
if(!properties.style.left){\n
\t\t\t\t
properties.style.left = x - (isSecondLayer ? offset.x : 0);
\n\t\t\t
}
\n\t\t\t\n\t\t
}
\n\t\t
if (y !== 0) {\n
\t\t\t
if(!properties.style.top){\n
\t\t\t\t
properties.style.top = y - (isSecondLayer ? offset.y : 0);
\n\t\t\t
}
\n\t\t
}
\n\t\t
properties.style.position=
\"
absolute
\"\n\t\t
properties.style.transformOrigin=
\"
0px 0px 0px
\"
;
\n\t\t
viewNode.rect={\n
\t\t\t
x: properties.style.left?properties.style.left:0,
\n\t\t\t
y: properties.style.top?properties.style.top:0,
\n\t\t\t
width: properties.style.width,
\n\t\t\t
height: properties.style.height
\n\t\t
}
\n\n\t\t
if (typeTool) {\n
\t\t\t
let fontInfo = typeTool();
\n\t\t\t
properties.attrs.text = fontInfo.textValue;
\n\t\t\t
const sizes = fontInfo.sizes();
\n\t\t\t
const colors = fontInfo.colors();
\n\t\t\t
properties.style.fontSize = sizes ? sizes[0] || 20 : 20;
\n\t\t\t
let [r, g, b, a] = colors[0];
\n\t\t\t
console.log(
\"
color
\"
,[r, g, b, a])
\n\t\t\t
properties.style.color = `rgba(${r}, ${g}, ${b}, ${a / 255})`;
\n\t\t\t
viewNode.componentName = 'Label';
\n\t\t\t
dealLater = false;
\n\t\t
} else if (solidColor && layer.vectorMask) {\n
\t\t\t
let paths = layer.vectorMask().paths;
\n\t\t\t
if (paths[2].numPoints === 4) {\n
\t\t\t\t
let isRect = true;
\n\t\t\t\t
for (let i = 3; i < paths.length; i++) {\n
\t\t\t\t\t
if (paths[i].recordType !== 2) {\n
\t\t\t\t\t\t
isRect = false;
\n\t\t\t\t\t\t
break;
\n\t\t\t\t\t
}
\n\t\t\t\t
}
\n\t\t\t\t
if (isRect) {\n
\t\t\t\t\t
viewNode.componentName = 'Div';
\n\t\t\t\t\t
const {r, g, b} = solidColor();
\n\t\t\t\t\t
properties.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 1)`;
\n\t\t\t\t\t
dealLater = false;
\n\t\t\t\t
}
\n\t\t\t
}
\n\t\t
}
\n\n\t\t
if (dealLater) {\n
\t\t\t
if (node.hasOwnProperty('children')) {\n
\t\t\t\t
viewNode.componentName = 'Div';
\n\t\t\t
} else {\n
\t\t\t\t
viewNode.componentName = 'Image';
\n\n\t\t\t\t
let uuid = generateUUID();
\n\t\t\t\t
const ext = '.png';
\n\n\t\t\t\t
let dataUrl;
\n\t\t\t\t
try {\n
\t\t\t\t\t
let img = node.origin.toPng();
\n\t\t\t\t\t
dataUrl = img.src;
\n\t\t\t\t
} catch (e)
{
\n\n\t\t\t\t
}
\n\n\t\t\t\t
if (dataUrl) {\n
\t\t\t\t\t
let base64Data = dataUrl.replace(/^data:image
\\
/
\\
w+;base64,/,
\"\"
);
\n\t\t\t\t\t
let buffer = new Buffer(base64Data, 'base64');
\n\t\t\t\t\t
const fileNameHash = hash(buffer);
\n\t\t\t\t\t
if (imageHashMap.hasOwnProperty(fileNameHash)) {\n
\t\t\t\t\t\t
uuid = imageHashMap[fileNameHash];
\n\t\t\t\t\t
} else {\n
\t\t\t\t\t\t
imageHashMap[fileNameHash] = uuid;
\n\t\t\t\t\t\t
assets.push({\n
\t\t\t\t\t\t\t
name,
\n\t\t\t\t\t\t\t
ext,
\n\t\t\t\t\t\t\t
uuid,
\n\t\t\t\t\t\t\t
base64Data,
\n\t\t\t\t\t\t\t
hash: fileNameHash,
\n\t\t\t\t\t\t
});
\n\t\t\t\t\t
}
\n\n\t\t\t\t\t
properties.attrs.source = 'asset://' + uuid;
\n\t\t\t\t
}
\n\t\t\t
}
\n\t\t
}
\n\n\t\t
let viewParent = parent.view || viewRoot;
\n\t\t
if (!viewParent.hasOwnProperty('children')) {\n
\t\t\t
viewParent.children = [];
\n\t\t
}
\n\t\t
viewParent.children.push(viewNode);
\n\n\t\t
node.view = viewNode;
\n\t
});
\n
console.log(psdFile)
\n\t
let data = {\n
\t\t
pluginVersion:
\"
0.0.1
\"
,
\n\t\t
reference:
\"
psd
\"
,
\n\t\t
fileName:psdFile.name,
\n\t\t
assets,
\n\t\t
view: viewRoot,
\n\t
};
\n\n\t
let dataString = JSON.stringify(data);
\n\n\t
let buf = new Buffer(dataString);
\n\t
return await new Promise((resolve, reject) => {\n
\t\t
zlib.gzip(buf, function (err, res) {\n
\t\t\t
if (err)
{
\n\t\t\t\treject(err);\n\t\t\t
}
else
{
\n\t\t\t\tconsole.log(res.length);\n\t\t\t\tresolve(res);\n\t\t\t}\n\t\t});\n\t})\n}\n"],"names":[],"mappings":"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"
}
\ No newline at end of file
{"version":3,"file":"index.es.js","sources":["../src/index.js"],"sourcesContent":["/**\n * Created by rockyl on 2019-08-08.\n */\n\nconst { getTree } = require('./psd-tree');\nconst { execute } = require(\"./zeroing\");\n\nmodule.exports = {\n getTree,\n execute\n}\n\n"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACzC;AACA,MAAM,CAAC,OAAO,GAAG;AACjB,IAAI,OAAO;AACX,IAAI,OAAO;AACX"}
\ No newline at end of file
dist/index.js
View file @
7dd74446
'use strict'
;
Object
.
defineProperty
(
exports
,
'__esModule'
,
{
value
:
true
});
function
_interopDefault
(
ex
)
{
return
(
ex
&&
(
typeof
ex
===
'object'
)
&&
'default'
in
ex
)
?
ex
[
'default'
]
:
ex
;
}
var
path
=
_interopDefault
(
require
(
'path'
));
require
(
'color'
);
var
generateUUID
=
_interopDefault
(
require
(
'uuid/v4'
));
var
hash
=
_interopDefault
(
require
(
'object-hash'
));
var
zlib
=
_interopDefault
(
require
(
'zlib'
));
/**
* Created by rockyl on 2019-08-0
9
.
* Created by rockyl on 2019-08-0
8
.
*/
const
PSD
=
window
[
'require'
](
'psd'
);
async
function
getTree
(
file
)
{
let
psd
=
await
PSD
.
fromDroppedFile
(
file
);
const
root
=
{};
walk
(
psd
.
tree
(),
root
);
return
root
;
}
const
{
getTree
}
=
require
(
'./psd-tree'
);
const
{
execute
}
=
require
(
"./zeroing"
);
function
walk
(
psNode
,
dataNode
)
{
const
{
left
:
pLeft
=
0
,
top
:
pTop
=
0
,}
=
psNode
.
parent
||
{};
const
{
left
,
top
,
width
,
height
,
name
,
layer
:
{
opacity
,
visible
}}
=
psNode
;
const
x
=
left
-
pLeft
;
const
y
=
top
-
pTop
;
Object
.
assign
(
dataNode
,
{
x
,
y
,
width
,
height
,
opacity
:
opacity
/
255
,
visible
,
name
,
origin
:
psNode
,
label
:
`
${
name
}
> [
${
x
}
,
${
y
}
,
${
width
}
,
${
height
}
]`
});
if
(
psNode
.
children
()
&&
psNode
.
children
().
length
>
0
){
dataNode
.
children
=
[];
}
let
children
=
psNode
.
children
();
for
(
let
i
=
children
.
length
-
1
;
i
>=
0
;
i
--
)
{
const
childPsNode
=
children
[
i
];
const
childDataNode
=
{};
dataNode
.
children
.
push
(
childDataNode
);
walk
(
childPsNode
,
childDataNode
);
}
}
/**
* Created by rockyl on 2019-08-10.
*/
async
function
walkNode
(
node
,
callback
,
includeSelf
=
false
)
{
if
(
includeSelf
)
{
await
callback
(
node
,
null
);
}
if
(
node
.
children
&&
node
.
children
.
length
>
0
)
{
for
(
let
childNode
of
node
.
children
)
{
await
callback
(
childNode
,
node
);
const
result
=
await
walkNode
(
childNode
,
callback
);
if
(
result
===
true
)
{
break
;
}
}
}
}
/**
* Created by renjianfeng on 2020-06-11.
*
* 导出spark的视图
*/
const
relativePosPrefixMap
=
{
l
:
{
field
:
'left'
,},
t
:
{
field
:
'top'
,},
r
:
{
field
:
'right'
,},
b
:
{
field
:
'bottom'
,},
h
:
{
field
:
'horizonCenter'
,},
v
:
{
field
:
'verticalCenter'
,},
wp
:
{
field
:
'width'
,
},
hp
:
{
field
:
'height'
,
},
lp
:
{
field
:
'left'
,
},
tp
:
{
field
:
'top'
,
},
rp
:
{
field
:
'right'
,
},
bp
:
{
field
:
'bottom'
,
},
module
.
exports
=
{
getTree
,
execute
};
const
offsetAll
=
176
;
async
function
execute
(
psdFile
,
options
)
{
const
tree
=
await
getTree
(
psdFile
);
const
{
mode
=
'none'
,
singleView
=
true
}
=
options
;
let
offset
=
{
x
:
0
,
y
:
0
};
let
cutSize
=
{
x
:
0
,
y
:
0
};
if
(
mode
!==
'none'
)
{
cutSize
.
y
=
offsetAll
;
}
switch
(
mode
)
{
case
'top'
:
offset
.
y
=
offsetAll
;
break
;
case
'center'
:
offset
.
y
=
offsetAll
/
2
;
break
;
}
const
isCenter
=
mode
===
'center'
;
let
viewRoot
=
{
name
:
path
.
basename
(
psdFile
.
name
,
'.psd'
),
componentName
:
'Div'
,
uuid
:
generateUUID
(),
};
const
assets
=
[];
const
imageHashMap
=
{};
let
{
width
:
stageWidthOrigin
,
height
:
stageHeightOrigin
}
=
tree
;
const
stageWidth
=
stageWidthOrigin
-
cutSize
.
x
||
0
;
const
stageHeight
=
stageHeightOrigin
-
cutSize
.
y
||
0
;
await
walkNode
(
tree
,
async
function
(
node
,
parent
)
{
let
{
name
}
=
node
;
const
{
x
,
y
,
width
,
height
,
opacity
,
display
,
origin
:
{
layer
,
layer
:
{
typeTool
,
solidColor
}}}
=
node
;
//console.log('walk node:', name);
let
properties
=
{
style
:{
width
,
height
,
opacity
,
display
,
},
attrs
:{
},
className
:
""
};
const
isSecondLayer
=
singleView
&&
!
parent
.
origin
.
parent
||
!
singleView
&&
parent
.
origin
.
parent
&&
!
parent
.
origin
.
parent
.
parent
;
const
shouldVerticalCenter
=
isSecondLayer
&&
isCenter
;
if
(
name
.
includes
(
'|'
)
||
shouldVerticalCenter
)
{
try
{
let
arr
=
name
.
split
(
'|'
);
name
=
arr
[
0
];
let
paramsStr
=
arr
[
1
];
let
relativePos
;
if
(
paramsStr
){
let
params
=
paramsStr
.
split
(
';'
);
relativePos
=
params
[
0
];
}
else
if
(
shouldVerticalCenter
){
relativePos
=
'v'
;
}
if
(
relativePos
)
{
let
items
=
relativePos
.
split
(
','
);
for
(
let
item
of
items
)
{
let
result
=
item
.
match
(
/
[
a-zA-Z
]
+/
);
if
(
!
result
){
continue
;
}
let
prefix
=
result
[
0
];
let
mapItem
=
relativePosPrefixMap
[
prefix
];
if
(
mapItem
)
{
let
{
field
,}
=
mapItem
;
let
value
=
item
.
substr
(
prefix
.
length
);
let
hasValue
=
value
.
length
>
0
;
let
fieldChar
=
prefix
[
0
];
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
value
=
x
-
offset
.
x
;
break
;
case
't'
:
value
=
y
-
offset
.
y
;
break
;
case
'r'
:
value
=
stageWidth
-
(
x
-
offset
.
x
)
-
width
;
break
;
case
'b'
:
value
=
stageHeight
-
(
y
-
offset
.
y
)
-
height
;
break
;
case
'h'
:
value
=
x
+
width
/
2
-
stageWidthOrigin
/
2
;
break
;
case
'v'
:
value
=
y
+
height
/
2
-
stageHeightOrigin
/
2
;
break
;
}
}
let
isPercent
=
prefix
.
endsWith
(
'p'
);
if
(
isPercent
)
{
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
case
'r'
:
value
/=
stageWidth
;
break
;
case
't'
:
case
'b'
:
value
/=
stageHeight
;
break
;
}
value
=
Math
.
floor
(
value
*
100
);
}
value
+=
'%'
;
}
else
{
value
=
parseFloat
(
value
);
if
(
isNaN
(
value
))
{
value
=
0
;
}
}
console
.
log
(
properties
);
properties
.
style
[
field
]
=
value
;
}
}
}
}
catch
(
e
)
{
console
.
log
(
e
);
}
}
let
viewNode
=
{
name
,
properties
,
uuid
:
generateUUID
(),
};
let
dealLater
=
true
;
if
(
x
!==
0
)
{
console
.
log
(
properties
);
if
(
!
properties
.
style
.
left
){
properties
.
style
.
left
=
x
-
(
isSecondLayer
?
offset
.
x
:
0
);
}
}
if
(
y
!==
0
)
{
if
(
!
properties
.
style
.
top
){
properties
.
style
.
top
=
y
-
(
isSecondLayer
?
offset
.
y
:
0
);
}
}
properties
.
style
.
position
=
"absolute"
;
properties
.
style
.
transformOrigin
=
"0px 0px 0px"
;
viewNode
.
rect
=
{
x
:
properties
.
style
.
left
?
properties
.
style
.
left
:
0
,
y
:
properties
.
style
.
top
?
properties
.
style
.
top
:
0
,
width
:
properties
.
style
.
width
,
height
:
properties
.
style
.
height
};
if
(
typeTool
)
{
let
fontInfo
=
typeTool
();
properties
.
attrs
.
text
=
fontInfo
.
textValue
;
const
sizes
=
fontInfo
.
sizes
();
const
colors
=
fontInfo
.
colors
();
properties
.
style
.
fontSize
=
sizes
?
sizes
[
0
]
||
20
:
20
;
let
[
r
,
g
,
b
,
a
]
=
colors
[
0
];
console
.
log
(
"color"
,[
r
,
g
,
b
,
a
]);
properties
.
style
.
color
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
,
${
a
/
255
}
)`
;
viewNode
.
componentName
=
'Label'
;
dealLater
=
false
;
}
else
if
(
solidColor
&&
layer
.
vectorMask
)
{
let
paths
=
layer
.
vectorMask
().
paths
;
if
(
paths
[
2
].
numPoints
===
4
)
{
let
isRect
=
true
;
for
(
let
i
=
3
;
i
<
paths
.
length
;
i
++
)
{
if
(
paths
[
i
].
recordType
!==
2
)
{
isRect
=
false
;
break
;
}
}
if
(
isRect
)
{
viewNode
.
componentName
=
'Div'
;
const
{
r
,
g
,
b
}
=
solidColor
();
properties
.
style
.
backgroundColor
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
, 1)`
;
dealLater
=
false
;
}
}
}
if
(
dealLater
)
{
if
(
node
.
hasOwnProperty
(
'children'
))
{
viewNode
.
componentName
=
'Div'
;
}
else
{
viewNode
.
componentName
=
'Image'
;
let
uuid
=
generateUUID
();
const
ext
=
'.png'
;
let
dataUrl
;
try
{
let
img
=
node
.
origin
.
toPng
();
dataUrl
=
img
.
src
;
}
catch
(
e
)
{
}
if
(
dataUrl
)
{
let
base64Data
=
dataUrl
.
replace
(
/^data:image
\/\w
+;base64,/
,
""
);
let
buffer
=
new
Buffer
(
base64Data
,
'base64'
);
const
fileNameHash
=
hash
(
buffer
);
if
(
imageHashMap
.
hasOwnProperty
(
fileNameHash
))
{
uuid
=
imageHashMap
[
fileNameHash
];
}
else
{
imageHashMap
[
fileNameHash
]
=
uuid
;
assets
.
push
({
name
,
ext
,
uuid
,
base64Data
,
hash
:
fileNameHash
,
});
}
properties
.
attrs
.
source
=
'asset://'
+
uuid
;
}
}
}
let
viewParent
=
parent
.
view
||
viewRoot
;
if
(
!
viewParent
.
hasOwnProperty
(
'children'
))
{
viewParent
.
children
=
[];
}
viewParent
.
children
.
push
(
viewNode
);
node
.
view
=
viewNode
;
});
console
.
log
(
psdFile
);
let
data
=
{
pluginVersion
:
"0.0.1"
,
reference
:
"psd"
,
fileName
:
psdFile
.
name
,
assets
,
view
:
viewRoot
,
};
let
dataString
=
JSON
.
stringify
(
data
);
let
buf
=
new
Buffer
(
dataString
);
return
await
new
Promise
((
resolve
,
reject
)
=>
{
zlib
.
gzip
(
buf
,
function
(
err
,
res
)
{
if
(
err
)
{
reject
(
err
);
}
else
{
console
.
log
(
res
.
length
);
resolve
(
res
);
}
});
})
}
exports
.
getTree
=
getTree
;
exports
.
toZeroing
=
execute
;
//# sourceMappingURL=index.js.map
dist/index.js.map
View file @
7dd74446
{
"version"
:
3
,
"file"
:
"index.js"
,
"sources"
:
[
"../src/psd-tree.js"
,
"../src/utils.js"
,
"../src/zeroing.js"
],
"sourcesContent"
:
[
"/**
\n
* Created by rockyl on 2019-08-09.
\n
*/
\n\n
const PSD = window['require']('psd');
\n\n
export async function getTree(file) {\n
\t
let psd = await PSD.fromDroppedFile(file);
\n\n\t
const root = {};
\n\t
walk(psd.tree(), root);
\n\n\t
return root;
\n
}
\n\n
function walk(psNode, dataNode) {\n
\t
const {left: pLeft = 0, top: pTop = 0,} = psNode.parent || {};
\n\t
const {left, top, width, height, name, layer: {opacity, visible}} = psNode;
\n\t
const x = left - pLeft;
\n\t
const y = top - pTop;
\n\n\t
Object.assign(dataNode, {x, y, width, height, opacity: opacity / 255, visible, name, origin: psNode, label: `${name} > [${x}, ${y}, ${width}, ${height}]`});
\n\t
if (psNode.children() && psNode.children().length > 0){\n
\t\t
dataNode.children = [];
\n\t
}
\n\n\t
let children = psNode.children();
\n\t
for (let i = children.length - 1; i >= 0; i--) {\n
\t\t
const childPsNode = children[i];
\n\n\t\t
const childDataNode = {};
\n\t\t
dataNode.children.push(childDataNode);
\n\t\t
walk(childPsNode, childDataNode)
\n\t
}
\n
}
\n
"
,
"/**
\n
* Created by rockyl on 2019-08-10.
\n
*/
\n\n
export async function walkNode(node, callback, includeSelf = false) {\n
\t
if (includeSelf) {\n
\t\t
await callback(node, null);
\n\t
}
\n\t
if (node.children && node.children.length > 0) {\n
\t\t
for (let childNode of node.children) {\n
\t\t\t
await callback(childNode, node);
\n\t\t\t
const result = await walkNode(childNode, callback);
\n\t\t\t
if (result === true)
{
\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n
}
\n\n
export async function walkObject(obj, callback) {\n
\t
if(typeof obj ===
\"
object
\"
){\n
\t\t
for (let key of Object.keys(obj)) {\n
\t\t\t
const value = obj[key];
\n\t\t\t
await callback(key, value, obj);
\n\t\t\t
const result = await walkObject(value, callback);
\n\t\t\t
if (result === true)
{
\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n
}
\n
"
,
"/**
\n
* Created by renjianfeng on 2020-06-11.
\n
*
\n
* 导出spark的视图
\n
*/
\n\n
import
{
getTree
}
from
\"
./psd-tree
\"
;
\n
import
{
walkNode
}
from
\"
./utils
\"
;
\n
import path from 'path'
\n
import Color from 'color'
\n
import generateUUID from 'uuid/v4'
\n
import hash from 'object-hash';
\n
import zlib from 'zlib';
\n\n
const relativePosPrefixMap = {\n
\t
l: {field: 'left',},
\n\t
t: {field: 'top',},
\n\t
r: {field: 'right',},
\n\t
b: {field: 'bottom',},
\n\t
h: {field: 'horizonCenter',},
\n\t
v: {field: 'verticalCenter',},
\n\t
wp: {field: 'width', },
\n\t
hp: {field: 'height', },
\n\t
lp: {field: 'left', },
\n\t
tp: {field: 'top', },
\n\t
rp: {field: 'right', },
\n\t
bp: {field: 'bottom', },
\n
};
\n\n
const offsetAll = 176;
\n\n
export async function execute(psdFile, options) {\n
\t
const tree = await getTree(psdFile);
\n\t
const {mode = 'none', singleView = true} = options;
\n\n\t
let offset = {x: 0, y: 0};
\n\t
let cutSize = {x: 0, y: 0};
\n\n\t
if (mode !== 'none') {\n
\t\t
cutSize.y = offsetAll;
\n\t
}
\n\t
switch (mode) {\n
\t\t
case 'top':
\n\t\t\t
offset.y = offsetAll;
\n\t\t\t
break;
\n\t\t
case 'center':
\n\t\t\t
offset.y = offsetAll / 2;
\n\t\t\t
break;
\n\t
}
\n\n\t
const isCenter = mode === 'center';
\n\n\t
let viewRoot = {\n
\t\t
name: path.basename(psdFile.name, '.psd'),
\n\t\t
componentName : 'Div',
\n\t\t
uuid: generateUUID(),
\n\t
};
\n\n\t
const assets = [];
\n\t
const imageHashMap = {};
\n\n\t
let {width: stageWidthOrigin, height: stageHeightOrigin} = tree;
\n\t
const stageWidth = stageWidthOrigin - cutSize.x || 0;
\n\t
const stageHeight = stageHeightOrigin - cutSize.y || 0;
\n\n\t
await walkNode(tree, async function (node, parent) {\n
\t\t
let
{
name
}
= node;
\n\t\t
const {x, y, width, height, opacity, display, origin: {layer, layer: {typeTool, solidColor}}} = node;
\n\t\t
//console.log('walk node:', name);
\n\t\t
let properties = {\n
\t\t\t
style:{\n
\t\t\t\t
width, height, opacity,display ,
\n\t\t\t
},
\n\t\t\t
attrs:
{
\n\n\t\t\t},\n\t\t\tclassName:\"\"\n\t\t
}
;
\n\t\t
const isSecondLayer = singleView && !parent.origin.parent || !singleView && parent.origin.parent && !parent.origin.parent.parent;
\n\t\t
const shouldVerticalCenter = isSecondLayer && isCenter;
\n\n\t\t
const {width: parentWidth, height: parentHeight} = parent;
\n\n\t\t
if (name.includes('|') || shouldVerticalCenter) {\n
\t\t\t
try {\n
\t\t\t\t
let arr = name.split('|');
\n\t\t\t\t
name = arr[0];
\n\t\t\t\t
let paramsStr = arr[1];
\n\t\t\t\t
let relativePos;
\n\t\t\t\t
if(paramsStr){\n
\t\t\t\t\t
let params = paramsStr.split(';');
\n\t\t\t\t\t
relativePos = params[0];
\n\t\t\t\t
}else if(shouldVerticalCenter){\n
\t\t\t\t\t
relativePos = 'v';
\n\t\t\t\t
}
\n\n\t\t\t\t
if (relativePos) {\n
\t\t\t\t\t
let items = relativePos.split(',');
\n\t\t\t\t\t
for (let item of items) {\n
\t\t\t\t\t\t
let result = item.match(/[a-zA-Z]+/);
\n\t\t\t\t\t\t
if(!result)
{
\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t
}
\n\t\t\t\t\t\t
let prefix = result[0];
\n\t\t\t\t\t\t
let mapItem = relativePosPrefixMap[prefix];
\n\t\t\t\t\t\t
if (mapItem) {\n
\t\t\t\t\t\t\t
let
{
field,
}
= mapItem;
\n\t\t\t\t\t\t\t
let value = item.substr(prefix.length);
\n\t\t\t\t\t\t\t
let hasValue = value.length > 0;
\n\t\t\t\t\t\t\t
let fieldChar = prefix[0];
\n\t\t\t\t\t\t\t
if(!hasValue){\n
\t\t\t\t\t\t\t\t
switch(fieldChar){\n
\t\t\t\t\t\t\t\t\t
case 'l':
\n\t\t\t\t\t\t\t\t\t\t
value = x - offset.x;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 't':
\n\t\t\t\t\t\t\t\t\t\t
value = y - offset.y;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'r':
\n\t\t\t\t\t\t\t\t\t\t
value = stageWidth - (x - offset.x) - width;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'b':
\n\t\t\t\t\t\t\t\t\t\t
value = stageHeight - (y - offset.y) - height;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'h':
\n\t\t\t\t\t\t\t\t\t\t
value = x + width / 2 - stageWidthOrigin / 2;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'v':
\n\t\t\t\t\t\t\t\t\t\t
value = y + height / 2 - stageHeightOrigin / 2;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
let isPercent = prefix.endsWith('p');
\n\t\t\t\t\t\t\t
if (isPercent) {\n
\t\t\t\t\t\t\t\t
if(!hasValue){\n
\t\t\t\t\t\t\t\t\t
switch(fieldChar){\n
\t\t\t\t\t\t\t\t\t\t
case 'l':
\n\t\t\t\t\t\t\t\t\t\t
case 'r':
\n\t\t\t\t\t\t\t\t\t\t\t
value /= stageWidth;
\n\t\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t\t
case 't':
\n\t\t\t\t\t\t\t\t\t\t
case 'b':
\n\t\t\t\t\t\t\t\t\t\t\t
value /= stageHeight;
\n\t\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t\t\t
value = Math.floor(value * 100);
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t\t
value += '%';
\n\t\t\t\t\t\t\t
} else {\n
\t\t\t\t\t\t\t\t
value = parseFloat(value);
\n\t\t\t\t\t\t\t\t
if (isNaN(value)) {\n
\t\t\t\t\t\t\t\t\t
value = 0;
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
console.log(properties)
\n\t\t\t\t\t\t\t
properties.style[field] = value;
\n\t\t\t\t\t\t
}
\n\t\t\t\t\t
}
\n\t\t\t\t
}
\n\t\t\t
}catch (e)
{
\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t
}
\n\n\t\t
let viewNode = {\n
\t\t\t
name,
\n\t\t\t
properties,
\n\t\t\t
uuid: generateUUID(),
\n\t\t
};
\n\t\t
let dealLater = true;
\n\t\t
if (x !== 0) {\n
\t\t\t
console.log(properties)
\n\t\t\t
if(!properties.style.left){\n
\t\t\t\t
properties.style.left = x - (isSecondLayer ? offset.x : 0);
\n\t\t\t
}
\n\t\t\t\n\t\t
}
\n\t\t
if (y !== 0) {\n
\t\t\t
if(!properties.style.top){\n
\t\t\t\t
properties.style.top = y - (isSecondLayer ? offset.y : 0);
\n\t\t\t
}
\n\t\t
}
\n\t\t
properties.style.position=
\"
absolute
\"\n\t\t
properties.style.transformOrigin=
\"
0px 0px 0px
\"
;
\n\t\t
viewNode.rect={\n
\t\t\t
x: properties.style.left?properties.style.left:0,
\n\t\t\t
y: properties.style.top?properties.style.top:0,
\n\t\t\t
width: properties.style.width,
\n\t\t\t
height: properties.style.height
\n\t\t
}
\n\n\t\t
if (typeTool) {\n
\t\t\t
let fontInfo = typeTool();
\n\t\t\t
properties.attrs.text = fontInfo.textValue;
\n\t\t\t
const sizes = fontInfo.sizes();
\n\t\t\t
const colors = fontInfo.colors();
\n\t\t\t
properties.style.fontSize = sizes ? sizes[0] || 20 : 20;
\n\t\t\t
let [r, g, b, a] = colors[0];
\n\t\t\t
console.log(
\"
color
\"
,[r, g, b, a])
\n\t\t\t
properties.style.color = `rgba(${r}, ${g}, ${b}, ${a / 255})`;
\n\t\t\t
viewNode.componentName = 'Label';
\n\t\t\t
dealLater = false;
\n\t\t
} else if (solidColor && layer.vectorMask) {\n
\t\t\t
let paths = layer.vectorMask().paths;
\n\t\t\t
if (paths[2].numPoints === 4) {\n
\t\t\t\t
let isRect = true;
\n\t\t\t\t
for (let i = 3; i < paths.length; i++) {\n
\t\t\t\t\t
if (paths[i].recordType !== 2) {\n
\t\t\t\t\t\t
isRect = false;
\n\t\t\t\t\t\t
break;
\n\t\t\t\t\t
}
\n\t\t\t\t
}
\n\t\t\t\t
if (isRect) {\n
\t\t\t\t\t
viewNode.componentName = 'Div';
\n\t\t\t\t\t
const {r, g, b} = solidColor();
\n\t\t\t\t\t
properties.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 1)`;
\n\t\t\t\t\t
dealLater = false;
\n\t\t\t\t
}
\n\t\t\t
}
\n\t\t
}
\n\n\t\t
if (dealLater) {\n
\t\t\t
if (node.hasOwnProperty('children')) {\n
\t\t\t\t
viewNode.componentName = 'Div';
\n\t\t\t
} else {\n
\t\t\t\t
viewNode.componentName = 'Image';
\n\n\t\t\t\t
let uuid = generateUUID();
\n\t\t\t\t
const ext = '.png';
\n\n\t\t\t\t
let dataUrl;
\n\t\t\t\t
try {\n
\t\t\t\t\t
let img = node.origin.toPng();
\n\t\t\t\t\t
dataUrl = img.src;
\n\t\t\t\t
} catch (e)
{
\n\n\t\t\t\t
}
\n\n\t\t\t\t
if (dataUrl) {\n
\t\t\t\t\t
let base64Data = dataUrl.replace(/^data:image
\\
/
\\
w+;base64,/,
\"\"
);
\n\t\t\t\t\t
let buffer = new Buffer(base64Data, 'base64');
\n\t\t\t\t\t
const fileNameHash = hash(buffer);
\n\t\t\t\t\t
if (imageHashMap.hasOwnProperty(fileNameHash)) {\n
\t\t\t\t\t\t
uuid = imageHashMap[fileNameHash];
\n\t\t\t\t\t
} else {\n
\t\t\t\t\t\t
imageHashMap[fileNameHash] = uuid;
\n\t\t\t\t\t\t
assets.push({\n
\t\t\t\t\t\t\t
name,
\n\t\t\t\t\t\t\t
ext,
\n\t\t\t\t\t\t\t
uuid,
\n\t\t\t\t\t\t\t
base64Data,
\n\t\t\t\t\t\t\t
hash: fileNameHash,
\n\t\t\t\t\t\t
});
\n\t\t\t\t\t
}
\n\n\t\t\t\t\t
properties.attrs.source = 'asset://' + uuid;
\n\t\t\t\t
}
\n\t\t\t
}
\n\t\t
}
\n\n\t\t
let viewParent = parent.view || viewRoot;
\n\t\t
if (!viewParent.hasOwnProperty('children')) {\n
\t\t\t
viewParent.children = [];
\n\t\t
}
\n\t\t
viewParent.children.push(viewNode);
\n\n\t\t
node.view = viewNode;
\n\t
});
\n
console.log(psdFile)
\n\t
let data = {\n
\t\t
pluginVersion:
\"
0.0.1
\"
,
\n\t\t
reference:
\"
psd
\"
,
\n\t\t
fileName:psdFile.name,
\n\t\t
assets,
\n\t\t
view: viewRoot,
\n\t
};
\n\n\t
let dataString = JSON.stringify(data);
\n\n\t
let buf = new Buffer(dataString);
\n\t
return await new Promise((resolve, reject) => {\n
\t\t
zlib.gzip(buf, function (err, res) {\n
\t\t\t
if (err)
{
\n\t\t\t\treject(err);\n\t\t\t
}
else
{
\n\t\t\t\tconsole.log(res.length);\n\t\t\t\tresolve(res);\n\t\t\t}\n\t\t});\n\t})\n}\n"],"names":[],"mappings":"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"
}
\ No newline at end of file
{"version":3,"file":"index.js","sources":["../src/index.js"],"sourcesContent":["/**\n * Created by rockyl on 2019-08-08.\n */\n\nconst { getTree } = require('./psd-tree');\nconst { execute } = require(\"./zeroing\");\n\nmodule.exports = {\n getTree,\n execute\n}\n\n"],"names":[],"mappings":";;AAAA;AACA;AACA;AACA;AACA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;AAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACzC;AACA,MAAM,CAAC,OAAO,GAAG;AACjB,IAAI,OAAO;AACX,IAAI,OAAO;AACX;;"}
\ No newline at end of file
dist/index.umd.js
View file @
7dd74446
(
function
(
global
,
factory
)
{
typeof
exports
===
'object'
&&
typeof
module
!==
'undefined'
?
factory
(
exports
,
require
(
'path'
),
require
(
'color'
),
require
(
'uuid/v4'
),
require
(
'object-hash'
),
require
(
'zlib'
))
:
typeof
define
===
'function'
&&
define
.
amd
?
define
([
'exports'
,
'path'
,
'color'
,
'uuid/v4'
,
'object-hash'
,
'zlib'
],
factory
)
:
(
global
=
global
||
self
,
factory
(
global
[
'psd-parse-web'
]
=
{},
global
.
path
,
global
.
color
,
global
.
generateUUID
,
global
.
hash
,
global
.
zlib
));
}(
this
,
(
function
(
exports
,
path
,
color
,
generateUUID
,
hash
,
zlib
)
{
'use strict'
;
path
=
path
&&
Object
.
prototype
.
hasOwnProperty
.
call
(
path
,
'default'
)
?
path
[
'default'
]
:
path
;
color
=
color
&&
Object
.
prototype
.
hasOwnProperty
.
call
(
color
,
'default'
)
?
color
[
'default'
]
:
color
;
generateUUID
=
generateUUID
&&
Object
.
prototype
.
hasOwnProperty
.
call
(
generateUUID
,
'default'
)
?
generateUUID
[
'default'
]
:
generateUUID
;
hash
=
hash
&&
Object
.
prototype
.
hasOwnProperty
.
call
(
hash
,
'default'
)
?
hash
[
'default'
]
:
hash
;
zlib
=
zlib
&&
Object
.
prototype
.
hasOwnProperty
.
call
(
zlib
,
'default'
)
?
zlib
[
'default'
]
:
zlib
;
/**
* Created by rockyl on 2019-08-09.
*/
const
PSD
=
window
[
'require'
](
'psd'
);
async
function
getTree
(
file
)
{
let
psd
=
await
PSD
.
fromDroppedFile
(
file
);
const
root
=
{};
walk
(
psd
.
tree
(),
root
);
return
root
;
}
function
walk
(
psNode
,
dataNode
)
{
const
{
left
:
pLeft
=
0
,
top
:
pTop
=
0
,}
=
psNode
.
parent
||
{};
const
{
left
,
top
,
width
,
height
,
name
,
layer
:
{
opacity
,
visible
}}
=
psNode
;
const
x
=
left
-
pLeft
;
const
y
=
top
-
pTop
;
Object
.
assign
(
dataNode
,
{
x
,
y
,
width
,
height
,
opacity
:
opacity
/
255
,
visible
,
name
,
origin
:
psNode
,
label
:
`
${
name
}
> [
${
x
}
,
${
y
}
,
${
width
}
,
${
height
}
]`
});
if
(
psNode
.
children
()
&&
psNode
.
children
().
length
>
0
){
dataNode
.
children
=
[];
}
let
children
=
psNode
.
children
();
for
(
let
i
=
children
.
length
-
1
;
i
>=
0
;
i
--
)
{
const
childPsNode
=
children
[
i
];
const
childDataNode
=
{};
dataNode
.
children
.
push
(
childDataNode
);
walk
(
childPsNode
,
childDataNode
);
}
}
/**
* Created by rockyl on 2019-08-10.
*/
async
function
walkNode
(
node
,
callback
,
includeSelf
=
false
)
{
if
(
includeSelf
)
{
await
callback
(
node
,
null
);
}
if
(
node
.
children
&&
node
.
children
.
length
>
0
)
{
for
(
let
childNode
of
node
.
children
)
{
await
callback
(
childNode
,
node
);
const
result
=
await
walkNode
(
childNode
,
callback
);
if
(
result
===
true
)
{
break
;
}
}
}
}
/**
* Created by renjianfeng on 2020-06-11.
*
* 导出spark的视图
*/
const
relativePosPrefixMap
=
{
l
:
{
field
:
'left'
,},
t
:
{
field
:
'top'
,},
r
:
{
field
:
'right'
,},
b
:
{
field
:
'bottom'
,},
h
:
{
field
:
'horizonCenter'
,},
v
:
{
field
:
'verticalCenter'
,},
wp
:
{
field
:
'width'
,
},
hp
:
{
field
:
'height'
,
},
lp
:
{
field
:
'left'
,
},
tp
:
{
field
:
'top'
,
},
rp
:
{
field
:
'right'
,
},
bp
:
{
field
:
'bottom'
,
},
};
const
offsetAll
=
176
;
async
function
execute
(
psdFile
,
options
)
{
const
tree
=
await
getTree
(
psdFile
);
const
{
mode
=
'none'
,
singleView
=
true
}
=
options
;
let
offset
=
{
x
:
0
,
y
:
0
};
let
cutSize
=
{
x
:
0
,
y
:
0
};
if
(
mode
!==
'none'
)
{
cutSize
.
y
=
offsetAll
;
}
switch
(
mode
)
{
case
'top'
:
offset
.
y
=
offsetAll
;
break
;
case
'center'
:
offset
.
y
=
offsetAll
/
2
;
break
;
}
const
isCenter
=
mode
===
'center'
;
let
viewRoot
=
{
name
:
path
.
basename
(
psdFile
.
name
,
'.psd'
),
componentName
:
'Div'
,
uuid
:
generateUUID
(),
};
const
assets
=
[];
const
imageHashMap
=
{};
let
{
width
:
stageWidthOrigin
,
height
:
stageHeightOrigin
}
=
tree
;
const
stageWidth
=
stageWidthOrigin
-
cutSize
.
x
||
0
;
const
stageHeight
=
stageHeightOrigin
-
cutSize
.
y
||
0
;
await
walkNode
(
tree
,
async
function
(
node
,
parent
)
{
let
{
name
}
=
node
;
const
{
x
,
y
,
width
,
height
,
opacity
,
display
,
origin
:
{
layer
,
layer
:
{
typeTool
,
solidColor
}}}
=
node
;
//console.log('walk node:', name);
let
properties
=
{
style
:{
width
,
height
,
opacity
,
display
,
},
attrs
:{
},
className
:
""
};
const
isSecondLayer
=
singleView
&&
!
parent
.
origin
.
parent
||
!
singleView
&&
parent
.
origin
.
parent
&&
!
parent
.
origin
.
parent
.
parent
;
const
shouldVerticalCenter
=
isSecondLayer
&&
isCenter
;
if
(
name
.
includes
(
'|'
)
||
shouldVerticalCenter
)
{
try
{
let
arr
=
name
.
split
(
'|'
);
name
=
arr
[
0
];
let
paramsStr
=
arr
[
1
];
let
relativePos
;
if
(
paramsStr
){
let
params
=
paramsStr
.
split
(
';'
);
relativePos
=
params
[
0
];
}
else
if
(
shouldVerticalCenter
){
relativePos
=
'v'
;
}
if
(
relativePos
)
{
let
items
=
relativePos
.
split
(
','
);
for
(
let
item
of
items
)
{
let
result
=
item
.
match
(
/
[
a-zA-Z
]
+/
);
if
(
!
result
){
continue
;
}
let
prefix
=
result
[
0
];
let
mapItem
=
relativePosPrefixMap
[
prefix
];
if
(
mapItem
)
{
let
{
field
,}
=
mapItem
;
let
value
=
item
.
substr
(
prefix
.
length
);
let
hasValue
=
value
.
length
>
0
;
let
fieldChar
=
prefix
[
0
];
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
value
=
x
-
offset
.
x
;
break
;
case
't'
:
value
=
y
-
offset
.
y
;
break
;
case
'r'
:
value
=
stageWidth
-
(
x
-
offset
.
x
)
-
width
;
break
;
case
'b'
:
value
=
stageHeight
-
(
y
-
offset
.
y
)
-
height
;
break
;
case
'h'
:
value
=
x
+
width
/
2
-
stageWidthOrigin
/
2
;
break
;
case
'v'
:
value
=
y
+
height
/
2
-
stageHeightOrigin
/
2
;
break
;
}
}
let
isPercent
=
prefix
.
endsWith
(
'p'
);
if
(
isPercent
)
{
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
case
'r'
:
value
/=
stageWidth
;
break
;
case
't'
:
case
'b'
:
value
/=
stageHeight
;
break
;
}
value
=
Math
.
floor
(
value
*
100
);
}
value
+=
'%'
;
}
else
{
value
=
parseFloat
(
value
);
if
(
isNaN
(
value
))
{
value
=
0
;
}
}
console
.
log
(
properties
);
properties
.
style
[
field
]
=
value
;
}
}
}
}
catch
(
e
)
{
console
.
log
(
e
);
}
}
let
viewNode
=
{
name
,
properties
,
uuid
:
generateUUID
(),
};
let
dealLater
=
true
;
if
(
x
!==
0
)
{
console
.
log
(
properties
);
if
(
!
properties
.
style
.
left
){
properties
.
style
.
left
=
x
-
(
isSecondLayer
?
offset
.
x
:
0
);
}
}
if
(
y
!==
0
)
{
if
(
!
properties
.
style
.
top
){
properties
.
style
.
top
=
y
-
(
isSecondLayer
?
offset
.
y
:
0
);
}
}
properties
.
style
.
position
=
"absolute"
;
properties
.
style
.
transformOrigin
=
"0px 0px 0px"
;
viewNode
.
rect
=
{
x
:
properties
.
style
.
left
?
properties
.
style
.
left
:
0
,
y
:
properties
.
style
.
top
?
properties
.
style
.
top
:
0
,
width
:
properties
.
style
.
width
,
height
:
properties
.
style
.
height
};
if
(
typeTool
)
{
let
fontInfo
=
typeTool
();
properties
.
attrs
.
text
=
fontInfo
.
textValue
;
const
sizes
=
fontInfo
.
sizes
();
const
colors
=
fontInfo
.
colors
();
properties
.
style
.
fontSize
=
sizes
?
sizes
[
0
]
||
20
:
20
;
let
[
r
,
g
,
b
,
a
]
=
colors
[
0
];
console
.
log
(
"color"
,[
r
,
g
,
b
,
a
]);
properties
.
style
.
color
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
,
${
a
/
255
}
)`
;
viewNode
.
componentName
=
'Label'
;
dealLater
=
false
;
}
else
if
(
solidColor
&&
layer
.
vectorMask
)
{
let
paths
=
layer
.
vectorMask
().
paths
;
if
(
paths
[
2
].
numPoints
===
4
)
{
let
isRect
=
true
;
for
(
let
i
=
3
;
i
<
paths
.
length
;
i
++
)
{
if
(
paths
[
i
].
recordType
!==
2
)
{
isRect
=
false
;
break
;
}
}
if
(
isRect
)
{
viewNode
.
componentName
=
'Div'
;
const
{
r
,
g
,
b
}
=
solidColor
();
properties
.
style
.
backgroundColor
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
, 1)`
;
dealLater
=
false
;
}
}
}
if
(
dealLater
)
{
if
(
node
.
hasOwnProperty
(
'children'
))
{
viewNode
.
componentName
=
'Div'
;
}
else
{
viewNode
.
componentName
=
'Image'
;
let
uuid
=
generateUUID
();
const
ext
=
'.png'
;
let
dataUrl
;
try
{
let
img
=
node
.
origin
.
toPng
();
dataUrl
=
img
.
src
;
}
catch
(
e
)
{
}
if
(
dataUrl
)
{
let
base64Data
=
dataUrl
.
replace
(
/^data:image
\/\w
+;base64,/
,
""
);
let
buffer
=
new
Buffer
(
base64Data
,
'base64'
);
const
fileNameHash
=
hash
(
buffer
);
if
(
imageHashMap
.
hasOwnProperty
(
fileNameHash
))
{
uuid
=
imageHashMap
[
fileNameHash
];
}
else
{
imageHashMap
[
fileNameHash
]
=
uuid
;
assets
.
push
({
name
,
ext
,
uuid
,
base64Data
,
hash
:
fileNameHash
,
});
}
properties
.
attrs
.
source
=
'asset://'
+
uuid
;
}
}
}
let
viewParent
=
parent
.
view
||
viewRoot
;
if
(
!
viewParent
.
hasOwnProperty
(
'children'
))
{
viewParent
.
children
=
[];
}
viewParent
.
children
.
push
(
viewNode
);
node
.
view
=
viewNode
;
});
console
.
log
(
psdFile
);
let
data
=
{
pluginVersion
:
"0.0.1"
,
reference
:
"psd"
,
fileName
:
psdFile
.
name
,
assets
,
view
:
viewRoot
,
};
let
dataString
=
JSON
.
stringify
(
data
);
let
buf
=
new
Buffer
(
dataString
);
return
await
new
Promise
((
resolve
,
reject
)
=>
{
zlib
.
gzip
(
buf
,
function
(
err
,
res
)
{
if
(
err
)
{
reject
(
err
);
}
else
{
console
.
log
(
res
.
length
);
resolve
(
res
);
}
});
})
}
exports
.
getTree
=
getTree
;
exports
.
toZeroing
=
execute
;
Object
.
defineProperty
(
exports
,
'__esModule'
,
{
value
:
true
});
(
function
(
factory
)
{
typeof
define
===
'function'
&&
define
.
amd
?
define
(
factory
)
:
factory
();
}((
function
()
{
'use strict'
;
/**
* Created by rockyl on 2019-08-08.
*/
const
{
getTree
}
=
require
(
'./psd-tree'
);
const
{
execute
}
=
require
(
"./zeroing"
);
module
.
exports
=
{
getTree
,
execute
};
})));
//# sourceMappingURL=index.umd.js.map
dist/index.umd.js.map
View file @
7dd74446
{
"version"
:
3
,
"file"
:
"index.umd.js"
,
"sources"
:
[
"../src/psd-tree.js"
,
"../src/utils.js"
,
"../src/zeroing.js"
],
"sourcesContent"
:
[
"/**
\n
* Created by rockyl on 2019-08-09.
\n
*/
\n\n
const PSD = window['require']('psd');
\n\n
export async function getTree(file) {\n
\t
let psd = await PSD.fromDroppedFile(file);
\n\n\t
const root = {};
\n\t
walk(psd.tree(), root);
\n\n\t
return root;
\n
}
\n\n
function walk(psNode, dataNode) {\n
\t
const {left: pLeft = 0, top: pTop = 0,} = psNode.parent || {};
\n\t
const {left, top, width, height, name, layer: {opacity, visible}} = psNode;
\n\t
const x = left - pLeft;
\n\t
const y = top - pTop;
\n\n\t
Object.assign(dataNode, {x, y, width, height, opacity: opacity / 255, visible, name, origin: psNode, label: `${name} > [${x}, ${y}, ${width}, ${height}]`});
\n\t
if (psNode.children() && psNode.children().length > 0){\n
\t\t
dataNode.children = [];
\n\t
}
\n\n\t
let children = psNode.children();
\n\t
for (let i = children.length - 1; i >= 0; i--) {\n
\t\t
const childPsNode = children[i];
\n\n\t\t
const childDataNode = {};
\n\t\t
dataNode.children.push(childDataNode);
\n\t\t
walk(childPsNode, childDataNode)
\n\t
}
\n
}
\n
"
,
"/**
\n
* Created by rockyl on 2019-08-10.
\n
*/
\n\n
export async function walkNode(node, callback, includeSelf = false) {\n
\t
if (includeSelf) {\n
\t\t
await callback(node, null);
\n\t
}
\n\t
if (node.children && node.children.length > 0) {\n
\t\t
for (let childNode of node.children) {\n
\t\t\t
await callback(childNode, node);
\n\t\t\t
const result = await walkNode(childNode, callback);
\n\t\t\t
if (result === true)
{
\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n
}
\n\n
export async function walkObject(obj, callback) {\n
\t
if(typeof obj ===
\"
object
\"
){\n
\t\t
for (let key of Object.keys(obj)) {\n
\t\t\t
const value = obj[key];
\n\t\t\t
await callback(key, value, obj);
\n\t\t\t
const result = await walkObject(value, callback);
\n\t\t\t
if (result === true)
{
\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n
}
\n
"
,
"/**
\n
* Created by renjianfeng on 2020-06-11.
\n
*
\n
* 导出spark的视图
\n
*/
\n\n
import
{
getTree
}
from
\"
./psd-tree
\"
;
\n
import
{
walkNode
}
from
\"
./utils
\"
;
\n
import path from 'path'
\n
import Color from 'color'
\n
import generateUUID from 'uuid/v4'
\n
import hash from 'object-hash';
\n
import zlib from 'zlib';
\n\n
const relativePosPrefixMap = {\n
\t
l: {field: 'left',},
\n\t
t: {field: 'top',},
\n\t
r: {field: 'right',},
\n\t
b: {field: 'bottom',},
\n\t
h: {field: 'horizonCenter',},
\n\t
v: {field: 'verticalCenter',},
\n\t
wp: {field: 'width', },
\n\t
hp: {field: 'height', },
\n\t
lp: {field: 'left', },
\n\t
tp: {field: 'top', },
\n\t
rp: {field: 'right', },
\n\t
bp: {field: 'bottom', },
\n
};
\n\n
const offsetAll = 176;
\n\n
export async function execute(psdFile, options) {\n
\t
const tree = await getTree(psdFile);
\n\t
const {mode = 'none', singleView = true} = options;
\n\n\t
let offset = {x: 0, y: 0};
\n\t
let cutSize = {x: 0, y: 0};
\n\n\t
if (mode !== 'none') {\n
\t\t
cutSize.y = offsetAll;
\n\t
}
\n\t
switch (mode) {\n
\t\t
case 'top':
\n\t\t\t
offset.y = offsetAll;
\n\t\t\t
break;
\n\t\t
case 'center':
\n\t\t\t
offset.y = offsetAll / 2;
\n\t\t\t
break;
\n\t
}
\n\n\t
const isCenter = mode === 'center';
\n\n\t
let viewRoot = {\n
\t\t
name: path.basename(psdFile.name, '.psd'),
\n\t\t
componentName : 'Div',
\n\t\t
uuid: generateUUID(),
\n\t
};
\n\n\t
const assets = [];
\n\t
const imageHashMap = {};
\n\n\t
let {width: stageWidthOrigin, height: stageHeightOrigin} = tree;
\n\t
const stageWidth = stageWidthOrigin - cutSize.x || 0;
\n\t
const stageHeight = stageHeightOrigin - cutSize.y || 0;
\n\n\t
await walkNode(tree, async function (node, parent) {\n
\t\t
let
{
name
}
= node;
\n\t\t
const {x, y, width, height, opacity, display, origin: {layer, layer: {typeTool, solidColor}}} = node;
\n\t\t
//console.log('walk node:', name);
\n\t\t
let properties = {\n
\t\t\t
style:{\n
\t\t\t\t
width, height, opacity,display ,
\n\t\t\t
},
\n\t\t\t
attrs:
{
\n\n\t\t\t},\n\t\t\tclassName:\"\"\n\t\t
}
;
\n\t\t
const isSecondLayer = singleView && !parent.origin.parent || !singleView && parent.origin.parent && !parent.origin.parent.parent;
\n\t\t
const shouldVerticalCenter = isSecondLayer && isCenter;
\n\n\t\t
const {width: parentWidth, height: parentHeight} = parent;
\n\n\t\t
if (name.includes('|') || shouldVerticalCenter) {\n
\t\t\t
try {\n
\t\t\t\t
let arr = name.split('|');
\n\t\t\t\t
name = arr[0];
\n\t\t\t\t
let paramsStr = arr[1];
\n\t\t\t\t
let relativePos;
\n\t\t\t\t
if(paramsStr){\n
\t\t\t\t\t
let params = paramsStr.split(';');
\n\t\t\t\t\t
relativePos = params[0];
\n\t\t\t\t
}else if(shouldVerticalCenter){\n
\t\t\t\t\t
relativePos = 'v';
\n\t\t\t\t
}
\n\n\t\t\t\t
if (relativePos) {\n
\t\t\t\t\t
let items = relativePos.split(',');
\n\t\t\t\t\t
for (let item of items) {\n
\t\t\t\t\t\t
let result = item.match(/[a-zA-Z]+/);
\n\t\t\t\t\t\t
if(!result)
{
\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t
}
\n\t\t\t\t\t\t
let prefix = result[0];
\n\t\t\t\t\t\t
let mapItem = relativePosPrefixMap[prefix];
\n\t\t\t\t\t\t
if (mapItem) {\n
\t\t\t\t\t\t\t
let
{
field,
}
= mapItem;
\n\t\t\t\t\t\t\t
let value = item.substr(prefix.length);
\n\t\t\t\t\t\t\t
let hasValue = value.length > 0;
\n\t\t\t\t\t\t\t
let fieldChar = prefix[0];
\n\t\t\t\t\t\t\t
if(!hasValue){\n
\t\t\t\t\t\t\t\t
switch(fieldChar){\n
\t\t\t\t\t\t\t\t\t
case 'l':
\n\t\t\t\t\t\t\t\t\t\t
value = x - offset.x;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 't':
\n\t\t\t\t\t\t\t\t\t\t
value = y - offset.y;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'r':
\n\t\t\t\t\t\t\t\t\t\t
value = stageWidth - (x - offset.x) - width;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'b':
\n\t\t\t\t\t\t\t\t\t\t
value = stageHeight - (y - offset.y) - height;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'h':
\n\t\t\t\t\t\t\t\t\t\t
value = x + width / 2 - stageWidthOrigin / 2;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
case 'v':
\n\t\t\t\t\t\t\t\t\t\t
value = y + height / 2 - stageHeightOrigin / 2;
\n\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
let isPercent = prefix.endsWith('p');
\n\t\t\t\t\t\t\t
if (isPercent) {\n
\t\t\t\t\t\t\t\t
if(!hasValue){\n
\t\t\t\t\t\t\t\t\t
switch(fieldChar){\n
\t\t\t\t\t\t\t\t\t\t
case 'l':
\n\t\t\t\t\t\t\t\t\t\t
case 'r':
\n\t\t\t\t\t\t\t\t\t\t\t
value /= stageWidth;
\n\t\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t\t
case 't':
\n\t\t\t\t\t\t\t\t\t\t
case 'b':
\n\t\t\t\t\t\t\t\t\t\t\t
value /= stageHeight;
\n\t\t\t\t\t\t\t\t\t\t\t
break;
\n\t\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t\t\t
value = Math.floor(value * 100);
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t\t
value += '%';
\n\t\t\t\t\t\t\t
} else {\n
\t\t\t\t\t\t\t\t
value = parseFloat(value);
\n\t\t\t\t\t\t\t\t
if (isNaN(value)) {\n
\t\t\t\t\t\t\t\t\t
value = 0;
\n\t\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
}
\n\t\t\t\t\t\t\t
console.log(properties)
\n\t\t\t\t\t\t\t
properties.style[field] = value;
\n\t\t\t\t\t\t
}
\n\t\t\t\t\t
}
\n\t\t\t\t
}
\n\t\t\t
}catch (e)
{
\n\t\t\t\tconsole.log(e);\n\t\t\t}\n\t\t
}
\n\n\t\t
let viewNode = {\n
\t\t\t
name,
\n\t\t\t
properties,
\n\t\t\t
uuid: generateUUID(),
\n\t\t
};
\n\t\t
let dealLater = true;
\n\t\t
if (x !== 0) {\n
\t\t\t
console.log(properties)
\n\t\t\t
if(!properties.style.left){\n
\t\t\t\t
properties.style.left = x - (isSecondLayer ? offset.x : 0);
\n\t\t\t
}
\n\t\t\t\n\t\t
}
\n\t\t
if (y !== 0) {\n
\t\t\t
if(!properties.style.top){\n
\t\t\t\t
properties.style.top = y - (isSecondLayer ? offset.y : 0);
\n\t\t\t
}
\n\t\t
}
\n\t\t
properties.style.position=
\"
absolute
\"\n\t\t
properties.style.transformOrigin=
\"
0px 0px 0px
\"
;
\n\t\t
viewNode.rect={\n
\t\t\t
x: properties.style.left?properties.style.left:0,
\n\t\t\t
y: properties.style.top?properties.style.top:0,
\n\t\t\t
width: properties.style.width,
\n\t\t\t
height: properties.style.height
\n\t\t
}
\n\n\t\t
if (typeTool) {\n
\t\t\t
let fontInfo = typeTool();
\n\t\t\t
properties.attrs.text = fontInfo.textValue;
\n\t\t\t
const sizes = fontInfo.sizes();
\n\t\t\t
const colors = fontInfo.colors();
\n\t\t\t
properties.style.fontSize = sizes ? sizes[0] || 20 : 20;
\n\t\t\t
let [r, g, b, a] = colors[0];
\n\t\t\t
console.log(
\"
color
\"
,[r, g, b, a])
\n\t\t\t
properties.style.color = `rgba(${r}, ${g}, ${b}, ${a / 255})`;
\n\t\t\t
viewNode.componentName = 'Label';
\n\t\t\t
dealLater = false;
\n\t\t
} else if (solidColor && layer.vectorMask) {\n
\t\t\t
let paths = layer.vectorMask().paths;
\n\t\t\t
if (paths[2].numPoints === 4) {\n
\t\t\t\t
let isRect = true;
\n\t\t\t\t
for (let i = 3; i < paths.length; i++) {\n
\t\t\t\t\t
if (paths[i].recordType !== 2) {\n
\t\t\t\t\t\t
isRect = false;
\n\t\t\t\t\t\t
break;
\n\t\t\t\t\t
}
\n\t\t\t\t
}
\n\t\t\t\t
if (isRect) {\n
\t\t\t\t\t
viewNode.componentName = 'Div';
\n\t\t\t\t\t
const {r, g, b} = solidColor();
\n\t\t\t\t\t
properties.style.backgroundColor = `rgba(${r}, ${g}, ${b}, 1)`;
\n\t\t\t\t\t
dealLater = false;
\n\t\t\t\t
}
\n\t\t\t
}
\n\t\t
}
\n\n\t\t
if (dealLater) {\n
\t\t\t
if (node.hasOwnProperty('children')) {\n
\t\t\t\t
viewNode.componentName = 'Div';
\n\t\t\t
} else {\n
\t\t\t\t
viewNode.componentName = 'Image';
\n\n\t\t\t\t
let uuid = generateUUID();
\n\t\t\t\t
const ext = '.png';
\n\n\t\t\t\t
let dataUrl;
\n\t\t\t\t
try {\n
\t\t\t\t\t
let img = node.origin.toPng();
\n\t\t\t\t\t
dataUrl = img.src;
\n\t\t\t\t
} catch (e)
{
\n\n\t\t\t\t
}
\n\n\t\t\t\t
if (dataUrl) {\n
\t\t\t\t\t
let base64Data = dataUrl.replace(/^data:image
\\
/
\\
w+;base64,/,
\"\"
);
\n\t\t\t\t\t
let buffer = new Buffer(base64Data, 'base64');
\n\t\t\t\t\t
const fileNameHash = hash(buffer);
\n\t\t\t\t\t
if (imageHashMap.hasOwnProperty(fileNameHash)) {\n
\t\t\t\t\t\t
uuid = imageHashMap[fileNameHash];
\n\t\t\t\t\t
} else {\n
\t\t\t\t\t\t
imageHashMap[fileNameHash] = uuid;
\n\t\t\t\t\t\t
assets.push({\n
\t\t\t\t\t\t\t
name,
\n\t\t\t\t\t\t\t
ext,
\n\t\t\t\t\t\t\t
uuid,
\n\t\t\t\t\t\t\t
base64Data,
\n\t\t\t\t\t\t\t
hash: fileNameHash,
\n\t\t\t\t\t\t
});
\n\t\t\t\t\t
}
\n\n\t\t\t\t\t
properties.attrs.source = 'asset://' + uuid;
\n\t\t\t\t
}
\n\t\t\t
}
\n\t\t
}
\n\n\t\t
let viewParent = parent.view || viewRoot;
\n\t\t
if (!viewParent.hasOwnProperty('children')) {\n
\t\t\t
viewParent.children = [];
\n\t\t
}
\n\t\t
viewParent.children.push(viewNode);
\n\n\t\t
node.view = viewNode;
\n\t
});
\n
console.log(psdFile)
\n\t
let data = {\n
\t\t
pluginVersion:
\"
0.0.1
\"
,
\n\t\t
reference:
\"
psd
\"
,
\n\t\t
fileName:psdFile.name,
\n\t\t
assets,
\n\t\t
view: viewRoot,
\n\t
};
\n\n\t
let dataString = JSON.stringify(data);
\n\n\t
let buf = new Buffer(dataString);
\n\t
return await new Promise((resolve, reject) => {\n
\t\t
zlib.gzip(buf, function (err, res) {\n
\t\t\t
if (err)
{
\n\t\t\t\treject(err);\n\t\t\t
}
else
{
\n\t\t\t\tconsole.log(res.length);\n\t\t\t\tresolve(res);\n\t\t\t}\n\t\t});\n\t})\n}\n"],"names":[],"mappings":"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"
}
\ No newline at end of file
{"version":3,"file":"index.umd.js","sources":["../src/index.js"],"sourcesContent":["/**\n * Created by rockyl on 2019-08-08.\n */\n\nconst { getTree } = require('./psd-tree');\nconst { execute } = require(\"./zeroing\");\n\nmodule.exports = {\n getTree,\n execute\n}\n\n"],"names":[],"mappings":";;;;;IAAA;IACA;IACA;AACA;IACA,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;AACzC;IACA,MAAM,CAAC,OAAO,GAAG;IACjB,IAAI,OAAO;IACX,IAAI,OAAO;IACX;;;;;;"}
\ No newline at end of file
imagesPath/1f6366eceaa6ebd0f14a749d70a996703f7e94bd.png
0 → 100644
View file @
7dd74446
1.9 KB
imagesPath/b2af0b52a195e0632471cfc92ee5feb24dec19c7.png
0 → 100644
View file @
7dd74446
1.96 KB
imagesPath/cfbba72b1cb37578be027387c79ae66987f65344.png
0 → 100644
View file @
7dd74446
12.3 KB
package-lock.json
0 → 100644
View file @
7dd74446
{
"name"
:
"psd-parse-web"
,
"version"
:
"1.0.2"
,
"lockfileVersion"
:
1
,
"requires"
:
true
,
"dependencies"
:
{
"at-least-node"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"http://npm.dui88.com:80/at-least-node/-/at-least-node-1.0.0.tgz"
,
"integrity"
:
"sha1-YCzUtG6EStTv/JKoARo8RuAjjcI="
},
"coffee-script"
:
{
"version"
:
"1.7.1"
,
"resolved"
:
"http://npm.dui88.com:80/coffee-script/-/coffee-script-1.7.1.tgz"
,
"integrity"
:
"sha1-YplqhheAx15tUGnROCJyO3NAS/w="
,
"requires"
:
{
"mkdirp"
:
"~0.3.5"
}
},
"coffeescript-module"
:
{
"version"
:
"0.2.1"
,
"resolved"
:
"http://npm.dui88.com:80/coffeescript-module/-/coffeescript-module-0.2.1.tgz"
,
"integrity"
:
"sha1-LGGqhpg8rNImcZ+fHdqSPLCuZ7A="
},
"color"
:
{
"version"
:
"3.1.3"
,
"resolved"
:
"http://npm.dui88.com:80/color/-/color-3.1.3.tgz"
,
"integrity"
:
"sha1-ymf7TnuX1hHc3jns7tQiBn2RWW4="
,
"requires"
:
{
"color-convert"
:
"^1.9.1"
,
"color-string"
:
"^1.5.4"
}
},
"color-convert"
:
{
"version"
:
"1.9.3"
,
"resolved"
:
"http://npm.dui88.com:80/color-convert/-/color-convert-1.9.3.tgz"
,
"integrity"
:
"sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg="
,
"requires"
:
{
"color-name"
:
"1.1.3"
}
},
"color-name"
:
{
"version"
:
"1.1.3"
,
"resolved"
:
"http://npm.dui88.com:80/color-name/-/color-name-1.1.3.tgz"
,
"integrity"
:
"sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
},
"color-string"
:
{
"version"
:
"1.5.4"
,
"resolved"
:
"http://npm.dui88.com:80/color-string/-/color-string-1.5.4.tgz"
,
"integrity"
:
"sha1-3VHNJc/ulT0Tj+QAI3LMPQ5QTLY="
,
"requires"
:
{
"color-name"
:
"^1.0.0"
,
"simple-swizzle"
:
"^0.2.2"
}
},
"fs-extra"
:
{
"version"
:
"9.0.1"
,
"resolved"
:
"http://npm.dui88.com:80/fs-extra/-/fs-extra-9.0.1.tgz"
,
"integrity"
:
"sha1-kQ2gBiQ3ukw5/t2GPxZ1zP78ufw="
,
"requires"
:
{
"at-least-node"
:
"^1.0.0"
,
"graceful-fs"
:
"^4.2.0"
,
"jsonfile"
:
"^6.0.1"
,
"universalify"
:
"^1.0.0"
}
},
"graceful-fs"
:
{
"version"
:
"4.2.4"
,
"resolved"
:
"http://npm.dui88.com:80/graceful-fs/-/graceful-fs-4.2.4.tgz"
,
"integrity"
:
"sha1-Ila94U02MpWMRl68ltxGfKB6Kfs="
},
"iconv-lite"
:
{
"version"
:
"0.4.24"
,
"resolved"
:
"http://npm.dui88.com:80/iconv-lite/-/iconv-lite-0.4.24.tgz"
,
"integrity"
:
"sha1-ICK0sl+93CHS9SSXSkdKr+czkIs="
,
"requires"
:
{
"safer-buffer"
:
">= 2.1.2 < 3"
}
},
"is-arrayish"
:
{
"version"
:
"0.3.2"
,
"resolved"
:
"http://npm.dui88.com:80/is-arrayish/-/is-arrayish-0.3.2.tgz"
,
"integrity"
:
"sha1-RXSirlb3qyBolvtDHq7tBm/fjwM="
},
"jsonfile"
:
{
"version"
:
"6.1.0"
,
"resolved"
:
"http://npm.dui88.com:80/jsonfile/-/jsonfile-6.1.0.tgz"
,
"integrity"
:
"sha1-vFWyY0eTxnnsZAMJTrE2mKbsCq4="
,
"requires"
:
{
"graceful-fs"
:
"^4.1.6"
,
"universalify"
:
"^2.0.0"
},
"dependencies"
:
{
"universalify"
:
{
"version"
:
"2.0.0"
,
"resolved"
:
"http://npm.dui88.com:80/universalify/-/universalify-2.0.0.tgz"
,
"integrity"
:
"sha1-daSYTv7cSwiXXFrrc/Uw0C3yVxc="
}
}
},
"jspack"
:
{
"version"
:
"0.0.4"
,
"resolved"
:
"http://npm.dui88.com:80/jspack/-/jspack-0.0.4.tgz"
,
"integrity"
:
"sha1-Mt01x/3LPjRWwY+7fvntC8YjgXc="
},
"lodash"
:
{
"version"
:
"2.4.2"
,
"resolved"
:
"http://npm.dui88.com:80/lodash/-/lodash-2.4.2.tgz"
,
"integrity"
:
"sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4="
},
"mkdirp"
:
{
"version"
:
"0.3.5"
,
"resolved"
:
"http://npm.dui88.com:80/mkdirp/-/mkdirp-0.3.5.tgz"
,
"integrity"
:
"sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc="
},
"object-hash"
:
{
"version"
:
"2.0.3"
,
"resolved"
:
"http://npm.dui88.com:80/object-hash/-/object-hash-2.0.3.tgz"
,
"integrity"
:
"sha1-0S2wROA80so9d8BXDYciWwLh5uo="
},
"parse-engine-data"
:
{
"version"
:
"0.1.2"
,
"resolved"
:
"http://npm.dui88.com:80/parse-engine-data/-/parse-engine-data-0.1.2.tgz"
,
"integrity"
:
"sha1-UWH2EzyYiPUhVezO1CcWV13+oFI="
,
"requires"
:
{
"iconv-lite"
:
"^0.4.4"
}
},
"pngjs"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"http://npm.dui88.com:80/pngjs/-/pngjs-3.2.0.tgz"
,
"integrity"
:
"sha1-/J/OoaijddpUpRFIAZ1avUHbq94="
},
"psd"
:
{
"version"
:
"3.2.0"
,
"resolved"
:
"http://npm.dui88.com:80/psd/-/psd-3.2.0.tgz"
,
"integrity"
:
"sha1-1yHEAgfUyZ2C/uSuLXz8pPsHPag="
,
"requires"
:
{
"coffee-script"
:
"~ 1.7.1"
,
"coffeescript-module"
:
"~ 0.2.1"
,
"iconv-lite"
:
"~ 0.4.4"
,
"jspack"
:
"~ 0.0.3"
,
"lodash"
:
"~ 2.4"
,
"parse-engine-data"
:
"~ 0.1"
,
"pngjs"
:
"3.2.0"
,
"rsvp"
:
"~ 3.0.6"
}
},
"rsvp"
:
{
"version"
:
"3.0.21"
,
"resolved"
:
"http://npm.dui88.com:80/rsvp/-/rsvp-3.0.21.tgz"
,
"integrity"
:
"sha1-ScWI/hjvKTvNCrn05nVuasQzNZ8="
},
"safer-buffer"
:
{
"version"
:
"2.1.2"
,
"resolved"
:
"http://npm.dui88.com:80/safer-buffer/-/safer-buffer-2.1.2.tgz"
,
"integrity"
:
"sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo="
},
"simple-swizzle"
:
{
"version"
:
"0.2.2"
,
"resolved"
:
"http://npm.dui88.com:80/simple-swizzle/-/simple-swizzle-0.2.2.tgz"
,
"integrity"
:
"sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo="
,
"requires"
:
{
"is-arrayish"
:
"^0.3.1"
}
},
"universalify"
:
{
"version"
:
"1.0.0"
,
"resolved"
:
"http://npm.dui88.com:80/universalify/-/universalify-1.0.0.tgz"
,
"integrity"
:
"sha1-thodoXPoQ1sv48Z9Kbmt+FlL0W0="
},
"uuid"
:
{
"version"
:
"3.4.0"
,
"resolved"
:
"http://npm.dui88.com:80/uuid/-/uuid-3.4.0.tgz"
,
"integrity"
:
"sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4="
}
}
}
package.json
View file @
7dd74446
...
...
@@ -5,12 +5,15 @@
"module"
:
"dist/index.es.js"
,
"license"
:
"
MIT
"
,
"scripts"
:
{
"test"
:
"node test/index.js"
,
"dev"
:
"rollup -c -w"
,
"build"
:
"rollup -c"
},
"dependencies"
:
{
"
color
"
:
"
^3.1.2
"
,
"
fs-extra
"
:
"
^9.0.1
"
,
"
object-hash
"
:
"
^2.0.1
"
,
"
psd
"
:
"
^3.2.0
"
,
"
uuid
"
:
"
^3.3.3
"
}
}
src/index.js
View file @
7dd74446
...
...
@@ -2,6 +2,11 @@
* Created by rockyl on 2019-08-08.
*/
export
{
getTree
}
from
"./psd-tree"
;
const
{
getTree
}
=
require
(
'./psd-tree'
);
const
{
execute
}
=
require
(
"./zeroing"
);
module
.
exports
=
{
getTree
,
execute
}
export
{
execute
as
toZeroing
}
from
"./zeroing"
;
src/psd-tree.js
View file @
7dd74446
...
...
@@ -2,15 +2,17 @@
* Created by rockyl on 2019-08-09.
*/
const
PSD
=
window
[
'require'
](
'psd'
);
export
async
function
getTree
(
file
)
{
let
psd
=
await
PSD
.
fromDroppedFile
(
file
);
var
PSD
=
require
(
'psd'
);
// var psd = PSD.fromFile("path/to/file.psd");
// psd.parse();
async
function
getTree
(
psdFilePath
)
{
const
psd
=
await
PSD
.
open
(
psdFilePath
);
const
root
=
{};
walk
(
psd
.
tree
(),
root
);
return
root
;
}
function
walk
(
psNode
,
dataNode
)
{
...
...
@@ -19,7 +21,7 @@ function walk(psNode, dataNode) {
const
x
=
left
-
pLeft
;
const
y
=
top
-
pTop
;
Object
.
assign
(
dataNode
,
{
x
,
y
,
width
,
height
,
opacity
:
opacity
/
255
,
visible
,
name
,
origin
:
psNode
,
label
:
`
${
name
}
> [
${
x
}
,
${
y
}
,
${
width
}
,
${
height
}
]`
});
Object
.
assign
(
dataNode
,
{
x
,
y
,
width
,
height
,
alpha
:
opacity
/
255
,
visible
,
name
,
origin
:
psNode
,
label
:
`
${
name
}
> [
${
x
}
,
${
y
}
,
${
width
}
,
${
height
}
]`
});
if
(
psNode
.
children
()
&&
psNode
.
children
().
length
>
0
){
dataNode
.
children
=
[];
}
...
...
@@ -32,4 +34,8 @@ function walk(psNode, dataNode) {
dataNode
.
children
.
push
(
childDataNode
);
walk
(
childPsNode
,
childDataNode
)
}
}
module
.
exports
=
{
getTree
}
src/utils.js
View file @
7dd74446
...
...
@@ -2,7 +2,7 @@
* Created by rockyl on 2019-08-10.
*/
export
async
function
walkNode
(
node
,
callback
,
includeSelf
=
false
)
{
async
function
walkNode
(
node
,
callback
,
includeSelf
=
false
)
{
if
(
includeSelf
)
{
await
callback
(
node
,
null
);
}
...
...
@@ -17,7 +17,7 @@ export async function walkNode(node, callback, includeSelf = false) {
}
}
export
async
function
walkObject
(
obj
,
callback
)
{
async
function
walkObject
(
obj
,
callback
)
{
if
(
typeof
obj
===
"object"
){
for
(
let
key
of
Object
.
keys
(
obj
))
{
const
value
=
obj
[
key
];
...
...
@@ -29,3 +29,7 @@ export async function walkObject(obj, callback) {
}
}
}
module
.
exports
=
{
walkNode
,
walkObject
}
\ No newline at end of file
src/zeroing.js
View file @
7dd74446
/**
* Created by r
enjianfeng on 2020-06-11
.
* Created by r
ockyl on 2019-09-26
.
*
* 导出
spark
的视图
* 导出
zeroing
的视图
*/
import
{
getTree
}
from
"./psd-tree"
;
import
{
walkNode
}
from
"./utils"
;
import
path
from
'path'
import
Color
from
'color'
import
generateUUID
from
'uuid/v4'
import
hash
from
'object-hash'
;
import
zlib
from
'zlib'
;
var
{
getTree
}
=
require
(
"./psd-tree"
)
;
var
{
walkNode
}
=
require
(
"./utils"
)
;
var
path
=
require
(
'path'
);
var
Color
=
require
(
'color'
);
var
generateUUID
=
require
(
'uuid/v4'
);
var
fs
=
require
(
"fs-extra"
)
;
var
hash
=
require
(
'object-hash'
)
;
const
relativePosPrefixMap
=
{
l
:
{
field
:
'left'
,},
t
:
{
field
:
'top'
,},
r
:
{
field
:
'right'
,},
b
:
{
field
:
'bottom'
,},
h
:
{
field
:
'horizonCenter'
,},
v
:
{
field
:
'verticalCenter'
,},
wp
:
{
field
:
'width'
,
},
hp
:
{
field
:
'height'
,
},
lp
:
{
field
:
'left'
,
},
tp
:
{
field
:
'top'
,
},
rp
:
{
field
:
'right'
,
},
bp
:
{
field
:
'bottom'
,
},
};
async
function
execute
(
psdFile
,
options
=
{})
{
const
{
imagesPath
=
'imagesPath'
,
}
=
options
;
const
offsetAll
=
176
;
export
async
function
execute
(
psdFile
,
options
)
{
const
tree
=
await
getTree
(
psdFile
);
const
{
mode
=
'none'
,
singleView
=
true
}
=
options
;
let
offset
=
{
x
:
0
,
y
:
0
};
let
cutSize
=
{
x
:
0
,
y
:
0
};
if
(
mode
!==
'none'
)
{
cutSize
.
y
=
offsetAll
;
}
switch
(
mode
)
{
case
'top'
:
offset
.
y
=
offsetAll
;
break
;
case
'center'
:
offset
.
y
=
offsetAll
/
2
;
break
;
}
const
isCenter
=
mode
===
'center'
;
let
viewRoot
=
{
name
:
path
.
basename
(
psdFile
.
name
,
'.psd'
),
componentName
:
'Div
'
,
name
:
path
.
basename
(
psdFile
,
'.psd'
),
type
:
'node
'
,
uuid
:
generateUUID
(),
};
const
assets
=
[];
const
imageHashMap
=
{};
let
{
width
:
stageWidthOrigin
,
height
:
stageHeightOrigin
}
=
tree
;
const
stageWidth
=
stageWidthOrigin
-
cutSize
.
x
||
0
;
const
stageHeight
=
stageHeightOrigin
-
cutSize
.
y
||
0
;
await
walkNode
(
tree
,
async
function
(
node
,
parent
)
{
let
{
name
}
=
node
;
const
{
x
,
y
,
width
,
height
,
opacity
,
display
,
origin
:
{
layer
,
layer
:
{
typeTool
,
solidColor
}}}
=
node
;
//console.log('walk node:', name);
const
{
name
,
x
,
y
,
width
,
height
,
alpha
,
visible
,
origin
:
{
layer
,
layer
:
{
typeTool
,
solidColor
}
}
}
=
node
;
let
properties
=
{
style
:{
width
,
height
,
opacity
,
display
,
},
attrs
:{
},
className
:
""
width
,
height
,
alpha
,
visible
,
};
const
isSecondLayer
=
singleView
&&
!
parent
.
origin
.
parent
||
!
singleView
&&
parent
.
origin
.
parent
&&
!
parent
.
origin
.
parent
.
parent
;
const
shouldVerticalCenter
=
isSecondLayer
&&
isCenter
;
const
{
width
:
parentWidth
,
height
:
parentHeight
}
=
parent
;
if
(
name
.
includes
(
'|'
)
||
shouldVerticalCenter
)
{
try
{
let
arr
=
name
.
split
(
'|'
);
name
=
arr
[
0
];
let
paramsStr
=
arr
[
1
];
let
relativePos
;
if
(
paramsStr
){
let
params
=
paramsStr
.
split
(
';'
);
relativePos
=
params
[
0
];
}
else
if
(
shouldVerticalCenter
){
relativePos
=
'v'
;
}
if
(
relativePos
)
{
let
items
=
relativePos
.
split
(
','
);
for
(
let
item
of
items
)
{
let
result
=
item
.
match
(
/
[
a-zA-Z
]
+/
);
if
(
!
result
){
continue
;
}
let
prefix
=
result
[
0
];
let
mapItem
=
relativePosPrefixMap
[
prefix
];
if
(
mapItem
)
{
let
{
field
,}
=
mapItem
;
let
value
=
item
.
substr
(
prefix
.
length
);
let
hasValue
=
value
.
length
>
0
;
let
fieldChar
=
prefix
[
0
];
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
value
=
x
-
offset
.
x
;
break
;
case
't'
:
value
=
y
-
offset
.
y
;
break
;
case
'r'
:
value
=
stageWidth
-
(
x
-
offset
.
x
)
-
width
;
break
;
case
'b'
:
value
=
stageHeight
-
(
y
-
offset
.
y
)
-
height
;
break
;
case
'h'
:
value
=
x
+
width
/
2
-
stageWidthOrigin
/
2
;
break
;
case
'v'
:
value
=
y
+
height
/
2
-
stageHeightOrigin
/
2
;
break
;
}
}
let
isPercent
=
prefix
.
endsWith
(
'p'
);
if
(
isPercent
)
{
if
(
!
hasValue
){
switch
(
fieldChar
){
case
'l'
:
case
'r'
:
value
/=
stageWidth
;
break
;
case
't'
:
case
'b'
:
value
/=
stageHeight
;
break
;
}
value
=
Math
.
floor
(
value
*
100
);
}
value
+=
'%'
;
}
else
{
value
=
parseFloat
(
value
);
if
(
isNaN
(
value
))
{
value
=
0
;
}
}
console
.
log
(
properties
)
properties
.
style
[
field
]
=
value
;
}
}
}
}
catch
(
e
)
{
console
.
log
(
e
);
}
}
let
viewNode
=
{
name
,
properties
,
...
...
@@ -169,38 +40,33 @@ export async function execute(psdFile, options) {
};
let
dealLater
=
true
;
if
(
x
!==
0
)
{
console
.
log
(
properties
)
if
(
!
properties
.
style
.
left
){
properties
.
style
.
left
=
x
-
(
isSecondLayer
?
offset
.
x
:
0
);
}
properties
.
x
=
x
;
}
if
(
y
!==
0
)
{
if
(
!
properties
.
style
.
top
){
properties
.
style
.
top
=
y
-
(
isSecondLayer
?
offset
.
y
:
0
);
}
}
properties
.
style
.
position
=
"absolute"
properties
.
style
.
transformOrigin
=
"0px 0px 0px"
;
viewNode
.
rect
=
{
x
:
properties
.
style
.
left
?
properties
.
style
.
left
:
0
,
y
:
properties
.
style
.
top
?
properties
.
style
.
top
:
0
,
width
:
properties
.
style
.
width
,
height
:
properties
.
style
.
height
properties
.
y
=
y
;
}
if
(
typeTool
)
{
let
fontInfo
=
typeTool
();
properties
.
attrs
.
text
=
fontInfo
.
textValue
;
//const fonts = fontInfo.fonts();
//const styles = fontInfo.styles();
//const {RunLengthArray} = fontInfo.engineData.EngineDict.StyleRun;
properties
.
text
=
fontInfo
.
textValue
;
const
sizes
=
fontInfo
.
sizes
();
const
colors
=
fontInfo
.
colors
();
properties
.
s
tyle
.
fontS
ize
=
sizes
?
sizes
[
0
]
||
20
:
20
;
properties
.
size
=
sizes
?
sizes
[
0
]
||
20
:
20
;
let
[
r
,
g
,
b
,
a
]
=
colors
[
0
];
console
.
log
(
"color"
,[
r
,
g
,
b
,
a
])
properties
.
style
.
color
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
,
${
a
/
255
}
)`
;
viewNode
.
componentName
=
'Label'
;
properties
.
fillColor
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
,
${
a
/
255
}
)`
;
/*properties.textflow = {
fonts, styles, RunLengthArray,
};*/
viewNode
.
type
=
'label'
;
dealLater
=
false
;
}
else
if
(
solidColor
&&
layer
.
vectorMask
)
{
}
else
if
(
solidColor
)
{
const
{
r
,
g
,
b
}
=
solidColor
();
let
color
=
Color
({
r
,
g
,
b
});
let
paths
=
layer
.
vectorMask
().
paths
;
if
(
paths
[
2
].
numPoints
===
4
)
{
let
isRect
=
true
;
...
...
@@ -211,9 +77,8 @@ export async function execute(psdFile, options) {
}
}
if
(
isRect
)
{
viewNode
.
componentName
=
'Div'
;
const
{
r
,
g
,
b
}
=
solidColor
();
properties
.
style
.
backgroundColor
=
`rgba(
${
r
}
,
${
g
}
,
${
b
}
, 1)`
;
viewNode
.
type
=
'rect'
;
properties
.
fillColor
=
'#'
+
color
.
rgbNumber
().
toString
(
16
);
dealLater
=
false
;
}
}
...
...
@@ -221,24 +86,21 @@ export async function execute(psdFile, options) {
if
(
dealLater
)
{
if
(
node
.
hasOwnProperty
(
'children'
))
{
viewNode
.
componentName
=
'D
iv'
;
viewNode
.
type
=
'd
iv'
;
}
else
{
viewNode
.
componentName
=
'I
mage'
;
viewNode
.
type
=
'i
mage'
;
let
uuid
=
generateUUID
();
const
ext
=
'.png'
;
let
dataUrl
;
try
{
let
img
=
node
.
origin
.
toPng
();
dataUrl
=
img
.
src
;
}
catch
(
e
)
{
const
imageFilePath
=
path
.
join
(
imagesPath
,
uuid
+
ext
);
await
fs
.
ensureDir
(
path
.
dirname
(
imageFilePath
));
let
png
=
node
.
origin
.
toPng
();
let
buffer
=
await
savePng
(
png
,
imageFilePath
).
catch
(
e
=>
{
});
//await node.origin.saveAsPng(imageFilePath);
}
if
(
dataUrl
)
{
let
base64Data
=
dataUrl
.
replace
(
/^data:image
\/\w
+;base64,/
,
""
);
let
buffer
=
new
Buffer
(
base64Data
,
'base64'
);
if
(
buffer
)
{
const
fileNameHash
=
hash
(
buffer
);
if
(
imageHashMap
.
hasOwnProperty
(
fileNameHash
))
{
uuid
=
imageHashMap
[
fileNameHash
];
...
...
@@ -248,12 +110,14 @@ export async function execute(psdFile, options) {
name
,
ext
,
uuid
,
base64Data
,
hash
:
fileNameHash
,
});
}
properties
.
attrs
.
source
=
'asset://'
+
uuid
;
const
hashFilePath
=
path
.
join
(
imagesPath
,
fileNameHash
+
ext
);
await
fs
.
rename
(
imageFilePath
,
hashFilePath
);
properties
.
source
=
'asset://'
+
uuid
;
}
}
}
...
...
@@ -266,26 +130,29 @@ export async function execute(psdFile, options) {
node
.
view
=
viewNode
;
});
console
.
log
(
psdFile
)
let
data
=
{
pluginVersion
:
"0.0.1"
,
reference
:
"psd"
,
fileName
:
psdFile
.
name
,
assets
,
view
:
viewRoot
,
};
let
dataString
=
JSON
.
stringify
(
data
);
return
{
view
:
viewRoot
,
assets
,
}
}
let
buf
=
new
Buffer
(
dataString
);
return
await
new
Promise
((
resolve
,
reject
)
=>
{
zlib
.
gzip
(
buf
,
function
(
err
,
res
)
{
if
(
err
)
{
reject
(
err
);
}
else
{
console
.
log
(
res
.
length
);
resolve
(
res
);
}
});
})
function
savePng
(
png
,
output
)
{
return
new
Promise
((
resolve
,
reject
)
=>
{
let
buffer
,
buffers
=
[];
png
.
pack
()
.
on
(
'error'
,
reject
)
.
on
(
'data'
,
(
data
)
=>
buffers
.
push
(
data
))
.
on
(
'end'
,
()
=>
{
buffer
=
Buffer
.
concat
(
buffers
)
})
.
pipe
(
fs
.
createWriteStream
(
output
))
.
on
(
'finish'
,
()
=>
{
resolve
(
buffer
);
});
});
}
module
.
exports
=
{
execute
}
\ No newline at end of file
test/index.js
0 → 100644
View file @
7dd74446
var
{
execute
}
=
require
(
'../src/index'
);
let
test
=
async
()
=>
{
let
result
=
await
execute
(
'/Users/davezh/Downloads/1.psd'
)
console
.
log
(
"---------"
);
console
.
log
(
JSON
.
stringify
(
result
));
}
test
();
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment