sketch-json-parse
Version:
sketch-json解析
114 lines (113 loc) • 4.47 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const handleOverlap_1 = require("./handleOverlap");
const calculateRow_1 = require("./calculateRow");
const isBlock_1 = require("./isBlock");
const calculateBlock_1 = require("./calculateBlock");
const markIsOnlyText_1 = require("./markIsOnlyText");
const row_1 = require("./row");
// 特殊布局识别
const handleTypeLayout_1 = require("./handleTypeLayout");
// import { getActualWidthOfChars } from "./utils";
/**
* 布局
* @param {Layer[]} data
* @param {string[]} absoluteMatchNames 所在层级使用绝对定位的图层名称
* @param {Layer} parent
* @returns
*/
const handleLayout = (data, absoluteMatchNames, parent) => {
var _a;
// zIndex排序,保证绝对定位的图层顺序
data.sort((a, b) => a.structure.zIndex - b.structure.zIndex);
// 文本的children是指多段文本情况,不做布局处理
if (((_a = parent === null || parent === void 0 ? void 0 : parent.componentName) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) === "text") {
return data;
}
//使用绝对定位的图层数组
let dataIsPositionLayout = [];
//不使用绝对定位的图层数组
let dataIsNotPositionLayout = [];
//图层分组
data.forEach((item) => {
if (parent && item.isPosition) {
dataIsPositionLayout.push(item);
}
else {
dataIsNotPositionLayout.push(item);
}
});
data = dataIsNotPositionLayout;
// 竖向列表-样式布局
// if (isLeftImgRightInfo(data)) {
// data = calculateLeftImgRightInfo(data);
// }
// 样式布局
// if (isVerticalList(data)) {
// data = calculateVerticalList(data);
// } else {
// data = handleContinuousListItem(data);
// }
// fs.writeFileSync('./code_dsl_101.json',JSON.stringify(data,null,2));
switch (true) {
case parent === undefined:
data = (0, calculateRow_1.default)(data);
break;
// 多元素,部分重叠使用绝对定位 Mark 禁用绝对定位
// case isAbsoluteBlock(data, absoluteMatchNames):
// data = absoluteBlock(data, parent);
// break;
// 单子元素纵向居中
// case data.length == 1 && isAlignCenter(data, parent):
// data = layoutColumnCenter(data, parent);
// break;
// 单子元素横向居中
// case isRowCenter(data, parent):
// data = layoutCenter(data, parent);
// break;
// 多元素 纵向排列
case (0, isBlock_1.isHaveBlock)(data):
data = (0, calculateBlock_1.calculateBlock)(data, parent);
break;
// 多元素 横向排列
case (0, row_1.isRow)(data):
// 横向排列主要处理data.length>1的布局
data = (0, row_1.layoutRow)(data, parent);
break;
default:
data = (0, calculateBlock_1.otherBlock)(data, parent);
break;
}
if (parent) {
(0, markIsOnlyText_1.default)(data, parent);
}
//使用绝对定位的布局,使用FixedPointView自由节点组件
data = (0, handleOverlap_1.default)(dataIsPositionLayout, parent, data);
// fs.writeFileSync('./code_dsl_102.json',JSON.stringify(data,null,2));
//递归子集
if (Array.isArray(data)) {
for (let i = 0; i < data.length; i++) {
// 统一处理单行纯文本宽度是去掉
try {
if ((0, handleTypeLayout_1.isSingleText)(data[i])) {
//避免纵向排列的,右对齐的部分,text-align=right 也要去掉
if (data.length > 1 &&
data[i].style.textAlign == "right" &&
parent &&
data[i].structure.width < parent.structure.width * 0.9) {
delete data[i].style.textAlign;
}
}
}
catch (error) {
console.log("文本宽度剔除异常" + error);
}
if (Array.isArray(data[i].children) && data[i].children.length > 0) {
data[i].children = handleLayout(data[i].children, absoluteMatchNames, data[i]);
}
}
}
// fs.writeFileSync('./code_dsl_103.json',JSON.stringify(data,null,2));
return data;
};
exports.default = handleLayout;