diff --git a/packages/core/src/constant/element.ts b/packages/core/src/constant/element.ts new file mode 100644 index 0000000..27e107f --- /dev/null +++ b/packages/core/src/constant/element.ts @@ -0,0 +1,6 @@ +export const elementTypes = { + 'text': true, + 'rect': true, + 'image': true, + 'svg': true, +} \ No newline at end of file diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 8a9fb41..d56c2cd 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -16,12 +16,12 @@ import { Element } from './lib/element'; import { Helper } from './lib/helper'; import { mergeConfig } from './lib/config'; import { CoreEvent, TypeCoreEventArgMap } from './lib/core-event'; +import { parseData } from './lib/parse'; const { time } = util; const { deepClone } = util.data; const { createUUID } = util.uuid; - enum Mode { NULL = 'null', SELECT_ELEMENT = 'select-element', @@ -141,7 +141,7 @@ class Core { return deepClone(this[_data]); } - initData(data: TypeData): void { + initData(data: any | TypeData): void { if (this[_hasInitedData] === true) { return; } @@ -150,8 +150,8 @@ class Core { this[_hasInitedData] = true; } - setData(data: TypeData): void { - this[_data] = this[_element].initData(deepClone(data)); + setData(data: any | TypeData): void { + this[_data] = this[_element].initData(deepClone(parseData(data))); this.draw(); } diff --git a/packages/core/src/lib/parse.ts b/packages/core/src/lib/parse.ts new file mode 100644 index 0000000..2e85154 --- /dev/null +++ b/packages/core/src/lib/parse.ts @@ -0,0 +1,36 @@ +import { TypeData, TypeElement, TypeElemDesc } from '@idraw/types'; +import { elementTypes } from './../constant/element'; + +export function parseData(data: any): TypeData { + const result: TypeData = { + elements: [], + }; + if (Array.isArray(data?.elements)) { + data?.elements.forEach((elem: any = {}) => { + if (isElement(elem)) { + result.elements.push(elem); + } + }); + } + if (typeof data.bgColor === 'string') { + result.bgColor = data.bgColor; + } + return result; +} + +function isElement( + elem: TypeElement +): boolean{ + if (!(isNumber(elem.x) && isNumber(elem.y) && isNumber(elem.w) && isNumber(elem.h))) { + return false; + } + if (!(typeof elem.type === 'string' && Object.keys(elementTypes).includes(elem.type))) { + return false; + } + return true; +} + + +function isNumber(num: any) { + return (num >= 0 || num < 0) +} \ No newline at end of file