UNPKG

sketch-json-parse

Version:

sketch-json解析

114 lines (113 loc) 4.47 kB
"use strict"; 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;