From 7ec75e1ce8361ef1157d0cd537b5f54f33edecc7 Mon Sep 17 00:00:00 2001 From: barsdeveloper Date: Tue, 16 Nov 2021 21:14:03 +0100 Subject: [PATCH] Object reference moved to entity --- .vscode/settings.json | 3 + css/ueblueprint-draggable.css | 6 +- css/ueblueprint-style.css | 451 ++++++++++++++----------- dist/ueblueprint.js | 65 ++-- js/entity/FunctionReferenceEntity.js | 4 +- js/entity/ObjectEntity.js | 6 +- js/entity/ObjectReferenceEntity.js | 13 + js/entity/PinEntity.js | 6 +- js/entity/primitive/ObjectReference.js | 23 -- js/export.js | 12 + js/serialization/CustomSerializer.js | 14 + js/serialization/Grammar.js | 10 +- js/serialization/ObjectSerializer.js | 2 +- 13 files changed, 346 insertions(+), 269 deletions(-) create mode 100644 .vscode/settings.json create mode 100755 js/entity/ObjectReferenceEntity.js delete mode 100755 js/entity/primitive/ObjectReference.js create mode 100644 js/serialization/CustomSerializer.js diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..99daf66 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "prettier.tabWidth": 4 +} \ No newline at end of file diff --git a/css/ueblueprint-draggable.css b/css/ueblueprint-draggable.css index 8d15969..63bf073 100644 --- a/css/ueblueprint-draggable.css +++ b/css/ueblueprint-draggable.css @@ -1,9 +1,9 @@ .ueb-draggable, .ueb-node { /* Indicate the element draggable */ - cursor : move; + cursor: move; /* It will be positioned absolutely */ - position : absolute; + position: absolute; /* Doesn't allow to select the content inside */ user-select: none; -} \ No newline at end of file +} diff --git a/css/ueblueprint-style.css b/css/ueblueprint-style.css index 7a272b7..0747bc6 100644 --- a/css/ueblueprint-style.css +++ b/css/ueblueprint-style.css @@ -1,50 +1,49 @@ @font-face { - font-family: 'Roboto'; - font-style : light; - src : - url('../font/roboto-light.woff2') format('woff2'), - url('../font/roboto-light.woff') format('woff'); + font-family: "Roboto"; + font-style: light; + src: url("../font/roboto-light.woff2") format("woff2"), + url("../font/roboto-light.woff") format("woff"); } @font-face { - font-family: 'Roboto'; - font-style : regular; - src : - url('../font/roboto-regular.woff2') format('woff2'), - url('../font/roboto-regular.woff') format('woff'); + font-family: "Roboto"; + font-style: regular; + src: url("../font/roboto-regular.woff2") format("woff2"), + url("../font/roboto-regular.woff") format("woff"); } :root { - --ueb-fron-size : 13px; - --ueb-viewport-height : 30rem; - --ueb-viewport-width : 100%; - --ueb-grid-size : 16px; - --ueb-grid-line-width : 2px; - --ueb-grid-line-color : #353535; - --ueb-grid-set : 8; - --ueb-grid-set-line-color : #161616; + --ueb-fron-size: 13px; + --ueb-viewport-height: 30rem; + --ueb-viewport-width: 100%; + --ueb-grid-size: 16px; + --ueb-grid-line-width: 2px; + --ueb-grid-line-color: #353535; + --ueb-grid-set: 8; + --ueb-grid-set-line-color: #161616; --ueb-grid-axis-line-color: black; - --ueb-grid-snap : 16px; - --ueb-node-radius : 7px; + --ueb-grid-snap: 16px; + --ueb-node-radius: 7px; } u-blueprint { - display : block; - position : relative; - font-family: Roboto, Noto, Oxygen, Ubuntu, 'Open Sans', 'Helvetica Neue', sans-serif; - font-size : var(--ueb-fron-size); + display: block; + position: relative; + font-family: Roboto, Noto, Oxygen, Ubuntu, "Open Sans", "Helvetica Neue", + sans-serif; + font-size: var(--ueb-fron-size); user-select: none; } .ueb-viewport-header { - display : flex; - position : absolute; - top : 0; - right : 0; - left : 0; - height : 1.5em; + display: flex; + position: absolute; + top: 0; + right: 0; + left: 0; + height: 1.5em; background: rgba(0, 0, 0, 0.5); - z-index : 1; + z-index: 1; } .ueb-viewport-zoom { @@ -52,10 +51,10 @@ u-blueprint { } .ueb-viewport-body { - position : relative; - height : var(--ueb-viewport-height); - width : var(--ueb-viewport-width); - overflow : hidden; + position: relative; + height: var(--ueb-viewport-height); + width: var(--ueb-viewport-width); + overflow: hidden; scrollbar-width: 0; } @@ -64,147 +63,166 @@ u-blueprint[data-focused="true"] .ueb-viewport-body { } .ueb-grid { - --ueb-grid-line-actual-width: calc(var(--ueb-grid-line-width) / var(--ueb-scale)); - position : absolute; - min-width : 100%; - min-height : 100%; - width : calc((100% + var(--ueb-additional-x) * 1px) / var(--ueb-scale)); - height : calc((100% + var(--ueb-additional-y) * 1px) / var(--ueb-scale)); - background-color : #262626; - background-image : - /* Axis lines */ - linear-gradient(var(--ueb-grid-axis-line-color), var(--ueb-grid-axis-line-color)), - linear-gradient(var(--ueb-grid-axis-line-color), var(--ueb-grid-axis-line-color)), + --ueb-grid-line-actual-width: calc( + var(--ueb-grid-line-width) / var(--ueb-scale) + ); + position: absolute; + min-width: 100%; + min-height: 100%; + width: calc((100% + var(--ueb-additional-x) * 1px) / var(--ueb-scale)); + height: calc((100% + var(--ueb-additional-y) * 1px) / var(--ueb-scale)); + background-color: #262626; + background-image: + /* Axis lines */ linear-gradient( + var(--ueb-grid-axis-line-color), + var(--ueb-grid-axis-line-color) + ), + linear-gradient( + var(--ueb-grid-axis-line-color), + var(--ueb-grid-axis-line-color) + ), /* Dark bigger grid */ - linear-gradient(to right, + linear-gradient( + to right, + var(--ueb-grid-set-line-color), + var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), + transparent var(--ueb-grid-line-actual-width), + transparent + ), + linear-gradient( + to bottom, var(--ueb-grid-set-line-color), var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), - transparent), - linear-gradient(to bottom, - var(--ueb-grid-set-line-color), - var(--ueb-grid-set-line-color) var(--ueb-grid-line-actual-width), - transparent var(--ueb-grid-line-actual-width), - transparent), + transparent + ), /* Light grid */ - linear-gradient(to right, + linear-gradient( + to right, + var(--ueb-grid-line-color), + var(--ueb-grid-line-color) var(--ueb-grid-line-actual-width), + transparent var(--ueb-grid-line-actual-width), + transparent + ), + linear-gradient( + to bottom, var(--ueb-grid-line-color), var(--ueb-grid-line-color) var(--ueb-grid-line-actual-width), transparent var(--ueb-grid-line-actual-width), - transparent), - linear-gradient(to bottom, - var(--ueb-grid-line-color), - var(--ueb-grid-line-color)var(--ueb-grid-line-actual-width), - transparent var(--ueb-grid-line-actual-width), - transparent); + transparent + ); background-size: - /* Axis lines */ - 100% var(--ueb-grid-line-actual-width), + /* Axis lines */ 100% + var(--ueb-grid-line-actual-width), var(--ueb-grid-line-actual-width) 100%, /* Dark bigger grid */ - calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)) calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)), - calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)) calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)), - /* Light grid */ - var(--ueb-grid-actual-size) var(--ueb-grid-actual-size), + calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)) + calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)), + calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)) + calc(var(--ueb-grid-set) * var(--ueb-grid-actual-size)), + /* Light grid */ var(--ueb-grid-actual-size) var(--ueb-grid-actual-size), var(--ueb-grid-actual-size) var(--ueb-grid-actual-size); - background-position: calc(var(--ueb-translate-x) * 1px) calc(var(--ueb-translate-y) * 1px); - background-repeat : repeat-x, repeat-y, repeat, repeat, repeat, repeat; - transform : scale(var(--ueb-scale), var(--ueb-scale)); - transform-origin : 0 0; - overflow : hidden; + background-position: calc(var(--ueb-translate-x) * 1px) + calc(var(--ueb-translate-y) * 1px); + background-repeat: repeat-x, repeat-y, repeat, repeat, repeat, repeat; + transform: scale(var(--ueb-scale), var(--ueb-scale)); + transform-origin: 0 0; + overflow: hidden; } .ueb-zoom--.ueb, .ueb { /* 16/16 */ - --ueb-scale : 1; + --ueb-scale: 1; --ueb-grid-actual-size: var(--ueb-grid-size); } .ueb-zoom--1.ueb { /* 14/16 */ - --ueb-scale: 0.875 + --ueb-scale: 0.875; } .ueb-zoom--2.ueb { /* 12/16 */ - --ueb-scale: 0.75 + --ueb-scale: 0.75; } .ueb-zoom--3.ueb { /* 10.8/16 */ - --ueb-scale: 0.675 + --ueb-scale: 0.675; } .ueb-zoom--4.ueb { /* 8/16 */ - --ueb-scale : 0.5; - --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 2) + --ueb-scale: 0.5; + --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 2); } .ueb-zoom--5.ueb { /* 6/16 */ - --ueb-scale : 0.375; + --ueb-scale: 0.375; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 2); } .ueb-zoom--6.ueb { - --ueb-scale : 0.333333; + --ueb-scale: 0.333333; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3); } .ueb-zoom--7.ueb { - --ueb-scale : 0.3; + --ueb-scale: 0.3; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3); } .ueb-zoom--8.ueb { - --ueb-scale : 0.266666; + --ueb-scale: 0.266666; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3); } .ueb-zoom--9.ueb { - --ueb-scale : 0.233333; + --ueb-scale: 0.233333; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3); } .ueb-zoom--10.ueb { /* 12/16 */ - --ueb-scale : 0.2; + --ueb-scale: 0.2; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 3); } .ueb-zoom--11.ueb { /* 12/16 */ - --ueb-scale : 0.166666; + --ueb-scale: 0.166666; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 6); } .ueb-zoom--12.ueb { /* 12/16 */ - --ueb-scale : 0.133333; + --ueb-scale: 0.133333; --ueb-grid-actual-size: calc(var(--ueb-grid-size) * 6); } .ueb-grid-content { - position : relative; - width : 0; - height : 0; - transform: translateX(calc(var(--ueb-translate-x) * 1px)) translateY(calc(var(--ueb-translate-y) * 1px)) + position: relative; + width: 0; + height: 0; + transform: translateX(calc(var(--ueb-translate-x) * 1px)) + translateY(calc(var(--ueb-translate-y) * 1px)); } .ueb-node { - display : block; - position : absolute; - transform : translateX(calc(var(--ueb-position-x) * 1px)) translateY(calc(var(--ueb-position-y) * 1px)); + display: block; + position: absolute; + transform: translateX(calc(var(--ueb-position-x) * 1px)) + translateY(calc(var(--ueb-position-y) * 1px)); border-radius: var(--ueb-node-radius); - box-shadow : 0 0 1px 0 black, 1px 4px 6px 0 rgba(0, 0, 0, 0.3); - will-change : transform; + box-shadow: 0 0 1px 0 black, 1px 4px 6px 0 rgba(0, 0, 0, 0.3); + will-change: transform; } .ueb-node-border { - margin : -3px; - padding : 3px; + margin: -3px; + padding: 3px; border-radius: calc(var(--ueb-node-radius) * 1.4); } @@ -212,45 +230,53 @@ u-blueprint[data-focused="true"] .ueb-viewport-body { z-index: 1; } -.ueb-selected>.ueb-node-border { - background-image: - linear-gradient(to right, #f1b000 0%, #f1b000 100%), +.ueb-selected > .ueb-node-border { + background-image: linear-gradient(to right, #f1b000 0%, #f1b000 100%), linear-gradient(to bottom, #f1b000 0%, #cc6700 100%), linear-gradient(to right, #cc6700 0%, #cc6700 100%), linear-gradient(to bottom, #f1b000 0%, #cc6700 100%); - background-size : 100% 7px, 7px 100%, 100% 7px, 7px 100%; + background-size: 100% 7px, 7px 100%, 100% 7px, 7px 100%; background-position: top, right, bottom, left; - background-repeat : repeat-x, repeat-y, repeat-x, repeat-y; + background-repeat: repeat-x, repeat-y, repeat-x, repeat-y; } .ueb-node-content { - padding : 1px; - box-shadow : inset 0 0 2px 0 black; + padding: 1px; + box-shadow: inset 0 0 2px 0 black; border-radius: var(--ueb-node-radius); - background : rgba(0, 0, 0, 0.7); - overflow : hidden; + background: rgba(0, 0, 0, 0.7); + overflow: hidden; } .ueb-node-header { - padding : 0.2em 0.7em; - box-shadow : inset 0 1px 2px 0 #313631, inset 0 2px 0 0 #92c381; + padding: 0.2em 0.7em; + box-shadow: inset 0 1px 2px 0 #313631, inset 0 2px 0 0 #92c381; border-radius: var(--ueb-node-radius) var(--ueb-node-radius) 0 0; - background : linear-gradient(170deg, #5f815a 0%, #5f815a 50%, transparent 100%); - color : #c0c0c0; - font-weight : 600; - white-space : nowrap; + background: linear-gradient( + 170deg, + #5f815a 0%, + #5f815a 50%, + transparent 100% + ); + color: #c0c0c0; + font-weight: 600; + white-space: nowrap; } .ueb-node-name { - background: radial-gradient(closest-side, rgba(0, 0, 0, 0.5) 0%, transparent 90%); - margin : -0.1em -1.6em; - padding : 0.1em 1.6em; + background: radial-gradient( + closest-side, + rgba(0, 0, 0, 0.5) 0%, + transparent 90% + ); + margin: -0.1em -1.6em; + padding: 0.1em 1.6em; } .ueb-node-body { - display : flex; - padding : 0.6em 0.8em; - color : white; + display: flex; + padding: 6px 0; + color: white; font-weight: 100; white-space: nowrap; } @@ -259,24 +285,30 @@ u-blueprint[data-focused="true"] .ueb-viewport-body { margin-right: auto; } +.ueb-node-input, +.ueb-node-output { + padding: 4px 8px; + cursor: pointer; +} + .ueb-node-value-icon { - display : inline-block; - position : relative; - width : 0.85em; - height : 0.85em; + display: inline-block; + position: relative; + width: 0.85em; + height: 0.85em; vertical-align: baseline; - margin : 0 0.4em -1px 0.3em; + margin: 0 0.4em -1px 0.3em; } .ueb-node-value-icon::before { - content : ""; - display : block; - position : absolute; - top : 0; - right : 0; - bottom : 0; - left : 0; - border : 2px solid var(--ueb-node-value-color); + content: ""; + display: block; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border: 2px solid var(--ueb-node-value-color); border-radius: 50%; } @@ -285,116 +317,129 @@ u-blueprint[data-focused="true"] .ueb-viewport-body { } .ueb-node-value-icon::after { - content : ""; - display : block; - position : absolute; - top : calc(50% - 0.3em); - left : calc(100% + 1px); - width : 0; - height : 0; - border-top : 0.3em solid transparent; + content: ""; + display: block; + position: absolute; + top: calc(50% - 0.3em); + left: calc(100% + 1px); + width: 0; + height: 0; + border-top: 0.3em solid transparent; border-bottom: 0.3em solid transparent; - border-left : 0.3em solid var(--ueb-node-value-color); + border-left: 0.3em solid var(--ueb-node-value-color); } .ueb-selector { - display : block; - position : absolute; + display: block; + position: absolute; visibility: hidden; - top : 0; - left : 0; - width : 0; - height : 0; + top: 0; + left: 0; + width: 0; + height: 0; background-image: - /* Top */ - repeating-linear-gradient(90deg, + /* Top */ repeating-linear-gradient( + 90deg, transparent, transparent calc(1px / var(--ueb-scale)), white calc(2px / var(--ueb-scale)), white calc(7px / var(--ueb-scale)), transparent calc(7px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), - repeating-linear-gradient(90deg, + transparent calc(11px / var(--ueb-scale)) + ), + repeating-linear-gradient( + 90deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), + transparent calc(11px / var(--ueb-scale)) + ), /* Bottom */ - repeating-linear-gradient(90deg, - transparent, - transparent calc(1px / var(--ueb-scale)), - white calc(2px / var(--ueb-scale)), - white calc(7px / var(--ueb-scale)), - transparent calc(7px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), - repeating-linear-gradient(90deg, + repeating-linear-gradient( + 90deg, + transparent, + transparent calc(1px / var(--ueb-scale)), + white calc(2px / var(--ueb-scale)), + white calc(7px / var(--ueb-scale)), + transparent calc(7px / var(--ueb-scale)), + transparent calc(11px / var(--ueb-scale)) + ), + repeating-linear-gradient( + 90deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), + transparent calc(11px / var(--ueb-scale)) + ), /* Left */ - repeating-linear-gradient(180deg, - transparent, - transparent calc(1px / var(--ueb-scale)), - white calc(1px / var(--ueb-scale)), - white calc(7px / var(--ueb-scale)), - transparent calc(7px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), - repeating-linear-gradient(180deg, + repeating-linear-gradient( + 180deg, + transparent, + transparent calc(1px / var(--ueb-scale)), + white calc(1px / var(--ueb-scale)), + white calc(7px / var(--ueb-scale)), + transparent calc(7px / var(--ueb-scale)), + transparent calc(11px / var(--ueb-scale)) + ), + repeating-linear-gradient( + 180deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), + transparent calc(11px / var(--ueb-scale)) + ), /* Right */ - repeating-linear-gradient(0deg, - transparent, - transparent calc(1px / var(--ueb-scale)), - white calc(2px / var(--ueb-scale)), - white calc(7px / var(--ueb-scale)), - transparent calc(7px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))), - repeating-linear-gradient(0deg, + repeating-linear-gradient( + 0deg, + transparent, + transparent calc(1px / var(--ueb-scale)), + white calc(2px / var(--ueb-scale)), + white calc(7px / var(--ueb-scale)), + transparent calc(7px / var(--ueb-scale)), + transparent calc(11px / var(--ueb-scale)) + ), + repeating-linear-gradient( + 0deg, black, black calc(8px / var(--ueb-scale)), transparent calc(9px / var(--ueb-scale)), - transparent calc(11px / var(--ueb-scale))); + transparent calc(11px / var(--ueb-scale)) + ); background-size: - /* Top */ - 100% calc(1px / var(--ueb-scale)), + /* Top */ 100% calc(1px / var(--ueb-scale)), 100% calc(3px / var(--ueb-scale)), - /* Bottom */ - 100% calc(1px / var(--ueb-scale)), + /* Bottom */ 100% calc(1px / var(--ueb-scale)), 100% calc(3px / var(--ueb-scale)), - /* Left */ - calc(1px / var(--ueb-scale)) 100%, + /* Left */ calc(1px / var(--ueb-scale)) 100%, calc(3px / var(--ueb-scale)) 100%, - /* Right */ - calc(1px / var(--ueb-scale)) 100%, + /* Right */ calc(1px / var(--ueb-scale)) 100%, calc(3px / var(--ueb-scale)) 100%; background-position: - /* Top */ - 0 calc(1px / var(--ueb-scale)), - 0 0, - /* Bottom */ - 0 calc(100% - 1px / var(--ueb-scale)), - 0 100%, - /* Left */ - calc(1px / var(--ueb-scale)) 0, - 0 0, - /* Right */ - calc(100% - 1px / var(--ueb-scale)) 0, - 100% 0; + /* Top */ 0 calc(1px / var(--ueb-scale)), 0 0, + /* Bottom */ 0 calc(100% - 1px / var(--ueb-scale)), 0 100%, + /* Left */ calc(1px / var(--ueb-scale)) 0, 0 0, + /* Right */ calc(100% - 1px / var(--ueb-scale)) 0, 100% 0; background-repeat: no-repeat; } -.ueb-selector>* { +.ueb-selector > * { visibility: visible; } .ueb-selector[data-selecting="true"] { visibility: visible; - top : min(var(--ueb-select-from-y) * 1px, var(--ueb-select-to-y) * 1px); - left : min(var(--ueb-select-from-x) * 1px, var(--ueb-select-to-x) * 1px); - width : calc(max(var(--ueb-select-from-x) - var(--ueb-select-to-x), var(--ueb-select-to-x) - var(--ueb-select-from-x)) * 1px); - height : calc(max(var(--ueb-select-from-y) - var(--ueb-select-to-y), var(--ueb-select-to-y) - var(--ueb-select-from-y)) * 1px); -} \ No newline at end of file + top: min(var(--ueb-select-from-y) * 1px, var(--ueb-select-to-y) * 1px); + left: min(var(--ueb-select-from-x) * 1px, var(--ueb-select-to-x) * 1px); + width: calc( + max( + var(--ueb-select-from-x) - var(--ueb-select-to-x), + var(--ueb-select-to-x) - var(--ueb-select-from-x) + ) * 1px + ); + height: calc( + max( + var(--ueb-select-from-y) - var(--ueb-select-to-y), + var(--ueb-select-to-y) - var(--ueb-select-from-y) + ) * 1px + ); +} diff --git a/dist/ueblueprint.js b/dist/ueblueprint.js index fee532e..a6b816a 100644 --- a/dist/ueblueprint.js +++ b/dist/ueblueprint.js @@ -192,32 +192,22 @@ class Entity { } } -class ObjectReference extends Primitive { +class ObjectReferenceEntity extends Entity { - /** - * - * @param {String} type - * @param {String} path - */ - constructor(type, path) { - super(); - this.type = type; - this.path = path; + static attributes = { + type: String, + path: String } - toString() { - return (this.type ?? "") + ( - this.path - ? this.type ? `'"${this.path}"'` : this.path - : "" - ) + getAttributes() { + return ObjectReferenceEntity.attributes } } class FunctionReferenceEntity extends Entity { static attributes = { - MemberParent: ObjectReference, + MemberParent: ObjectReferenceEntity, MemberName: "" } @@ -309,10 +299,10 @@ class PinEntity extends Entity { PinType: { PinCategory: "", PinSubCategory: "", - PinSubCategoryObject: ObjectReference, + PinSubCategoryObject: ObjectReferenceEntity, PinSubCategoryMemberReference: null, PinValueType: null, - ContainerType: ObjectReference, + ContainerType: ObjectReferenceEntity, bIsReference: false, bIsConst: false, bIsWeakPointer: false, @@ -365,12 +355,12 @@ class VariableReferenceEntity extends Entity { class ObjectEntity extends Entity { static attributes = { - Class: ObjectReference, + Class: ObjectReferenceEntity, Name: "", bIsPureFunc: new TypeInitialization(Boolean, false, false), VariableReference: new TypeInitialization(VariableReferenceEntity, false, null), FunctionReference: new TypeInitialization(FunctionReferenceEntity, false, null,), - TargetType: new TypeInitialization(ObjectReference, false, null), + TargetType: new TypeInitialization(ObjectReferenceEntity, false, null), NodePosX: 0, NodePosY: 0, NodeGuid: Guid, @@ -412,7 +402,7 @@ class Grammar { InlineOptWhitespace = _ => P.regex(/[^\S\n]*/).desc("inline optional whitespace") WhitespaceNewline = _ => P.regex(/[^\S\n]*\n\s*/).desc("whitespace with at least a newline") Null = r => P.seq(P.string("("), r.InlineOptWhitespace, P.string(")")).map(_ => null).desc("null: ()") - None = _ => P.string("None").map(_ => new ObjectReference("None", "")).desc("none") + None = _ => P.string("None").map(_ => new ObjectReferenceEntity({ type: "None", path: "" })).desc("none") Boolean = _ => P.alt(P.string("True"), P.string("False")).map(v => v === "True" ? true : false).desc("either True or False") Number = _ => P.regex(/[0-9]+(?:\.[0-9]+)?/).map(Number).desc("a number") Integer = _ => P.regex(/[0-9]+/).map(v => new Integer(v)).desc("an integer") @@ -427,7 +417,7 @@ class Grammar { .desc('a path (words with possibly underscore, separated by ".", separated by "/")') Reference = r => P.alt( r.None, - r.ReferencePath.map(path => new ObjectReference("", path)), + r.ReferencePath.map(path => new ObjectReferenceEntity({ type: "", path: path })), P.seqMap( r.Word, P.optWhitespace, @@ -436,7 +426,7 @@ class Grammar { P.string(result.split("").reverse().join("")) ) ), - (referenceType, _, referencePath) => new ObjectReference(referenceType, referencePath) + (referenceType, _, referencePath) => new ObjectReferenceEntity({ type: referenceType, path: referencePath }) ) ) AttributeName = r => r.Word.sepBy1(P.string(".")).tieWith(".").desc('words separated by ""') @@ -476,7 +466,7 @@ class Grammar { return r.String case Guid: return r.Guid - case ObjectReference: + case ObjectReferenceEntity: return r.Reference case LocalizedTextEntity: return r.LocalizedText @@ -733,7 +723,7 @@ class ObjectSerializer extends Serializer { * @returns */ write(object) { - let result = `Begin Object Class=${object.Class} Name="${object.Name}" + let result = `Begin Object Class=${this.writeValue(object.Class)} Name=${this.writeValue(object.Name)} ${this.subWrite([], object) + object .CustomProperties.map(pin => this.separator + this.prefix + "CustomProperties " + SerializerFactory.getSerializer(PinEntity).write(pin)) @@ -2153,6 +2143,19 @@ class GraphLink extends GraphElement { customElements.define('u-link', GraphLink); +class CustomSerializer extends GeneralSerializer { + + constructor(objectWriter, entityType) { + super(undefined, entityType); + this.objectWriter = objectWriter; + } + + write(object) { + let result = this.objectWriter(object); + return result + } +} + SerializerFactory.registerSerializer( ObjectEntity, new ObjectSerializer() @@ -2172,6 +2175,16 @@ SerializerFactory.registerSerializer( SerializerFactory.registerSerializer( PinReferenceEntity, new GeneralSerializer(v => v, PinReferenceEntity, "", " ", false, "", _ => "") +); +SerializerFactory.registerSerializer( + ObjectReferenceEntity, + new CustomSerializer( + /** @param {ObjectReferenceEntity} objectReference */ + objectReference => (objectReference.type ?? "") + ( + objectReference.path + ? objectReference.type ? `'"${objectReference.path}"'` : objectReference.path + : "" + )) ); export { Blueprint, GraphLink, GraphNode }; diff --git a/js/entity/FunctionReferenceEntity.js b/js/entity/FunctionReferenceEntity.js index e319a9a..87f3440 100755 --- a/js/entity/FunctionReferenceEntity.js +++ b/js/entity/FunctionReferenceEntity.js @@ -1,10 +1,10 @@ import Entity from "./Entity" -import ObjectReference from "./primitive/ObjectReference" +import ObjectReferenceEntity from "./ObjectReferenceEntity" export default class FunctionReferenceEntity extends Entity { static attributes = { - MemberParent: ObjectReference, + MemberParent: ObjectReferenceEntity, MemberName: "" } diff --git a/js/entity/ObjectEntity.js b/js/entity/ObjectEntity.js index ba0a17e..0391540 100755 --- a/js/entity/ObjectEntity.js +++ b/js/entity/ObjectEntity.js @@ -1,7 +1,7 @@ import Entity from "./Entity" import FunctionReferenceEntity from "./FunctionReferenceEntity" import Guid from "./primitive/Guid" -import ObjectReference from "./primitive/ObjectReference" +import ObjectReferenceEntity from "./ObjectReferenceEntity" import PinEntity from "./PinEntity" import TypeInitialization from "./TypeInitialization" import VariableReferenceEntity from "./VariableReferenceEntity" @@ -9,12 +9,12 @@ import VariableReferenceEntity from "./VariableReferenceEntity" export default class ObjectEntity extends Entity { static attributes = { - Class: ObjectReference, + Class: ObjectReferenceEntity, Name: "", bIsPureFunc: new TypeInitialization(Boolean, false, false), VariableReference: new TypeInitialization(VariableReferenceEntity, false, null), FunctionReference: new TypeInitialization(FunctionReferenceEntity, false, null,), - TargetType: new TypeInitialization(ObjectReference, false, null), + TargetType: new TypeInitialization(ObjectReferenceEntity, false, null), NodePosX: 0, NodePosY: 0, NodeGuid: Guid, diff --git a/js/entity/ObjectReferenceEntity.js b/js/entity/ObjectReferenceEntity.js new file mode 100755 index 0000000..d4dfaa3 --- /dev/null +++ b/js/entity/ObjectReferenceEntity.js @@ -0,0 +1,13 @@ +import Entity from "./Entity" + +export default class ObjectReferenceEntity extends Entity { + + static attributes = { + type: String, + path: String + } + + getAttributes() { + return ObjectReferenceEntity.attributes + } +} diff --git a/js/entity/PinEntity.js b/js/entity/PinEntity.js index 542d9fc..48937d2 100755 --- a/js/entity/PinEntity.js +++ b/js/entity/PinEntity.js @@ -1,7 +1,7 @@ import Entity from "./Entity" import Guid from "./primitive/Guid" import LocalizedTextEntity from "./LocalizedTextEntity" -import ObjectReference from "./primitive/ObjectReference" +import ObjectReferenceEntity from "./ObjectReferenceEntity" import PinReferenceEntity from "./PinReferenceEntity" import TypeInitialization from "./TypeInitialization" @@ -16,10 +16,10 @@ export default class PinEntity extends Entity { PinType: { PinCategory: "", PinSubCategory: "", - PinSubCategoryObject: ObjectReference, + PinSubCategoryObject: ObjectReferenceEntity, PinSubCategoryMemberReference: null, PinValueType: null, - ContainerType: ObjectReference, + ContainerType: ObjectReferenceEntity, bIsReference: false, bIsConst: false, bIsWeakPointer: false, diff --git a/js/entity/primitive/ObjectReference.js b/js/entity/primitive/ObjectReference.js deleted file mode 100755 index 8222472..0000000 --- a/js/entity/primitive/ObjectReference.js +++ /dev/null @@ -1,23 +0,0 @@ -import Primitive from "./Primitive" - -export default class ObjectReference extends Primitive { - - /** - * - * @param {String} type - * @param {String} path - */ - constructor(type, path) { - super() - this.type = type - this.path = path - } - - toString() { - return (this.type ?? "") + ( - this.path - ? this.type ? `'"${this.path}"'` : this.path - : "" - ) - } -} diff --git a/js/export.js b/js/export.js index 7562d86..b9d5d09 100755 --- a/js/export.js +++ b/js/export.js @@ -9,6 +9,8 @@ import Blueprint from "./Blueprint" import GraphNode from "./graph/GraphNode" import GraphLink from "./graph/GraphLink" import PinReferenceEntity from "./entity/PinReferenceEntity" +import ObjectReferenceEntity from "./entity/ObjectReferenceEntity" +import CustomSerializer from "./serialization/CustomSerializer" SerializerFactory.registerSerializer( ObjectEntity, @@ -30,5 +32,15 @@ SerializerFactory.registerSerializer( PinReferenceEntity, new GeneralSerializer(v => v, PinReferenceEntity, "", " ", false, "", _ => "") ) +SerializerFactory.registerSerializer( + ObjectReferenceEntity, + new CustomSerializer( + /** @param {ObjectReferenceEntity} objectReference */ + objectReference => (objectReference.type ?? "") + ( + objectReference.path + ? objectReference.type ? `'"${objectReference.path}"'` : objectReference.path + : "" + )) +) export { Blueprint as Blueprint, GraphNode as GraphNode, GraphLink as GraphLink } \ No newline at end of file diff --git a/js/serialization/CustomSerializer.js b/js/serialization/CustomSerializer.js new file mode 100644 index 0000000..d980ca4 --- /dev/null +++ b/js/serialization/CustomSerializer.js @@ -0,0 +1,14 @@ +import GeneralSerializer from "./GeneralSerializer" + +export default class CustomSerializer extends GeneralSerializer { + + constructor(objectWriter, entityType) { + super(undefined, entityType) + this.objectWriter = objectWriter + } + + write(object) { + let result = this.objectWriter(object) + return result + } +} \ No newline at end of file diff --git a/js/serialization/Grammar.js b/js/serialization/Grammar.js index 6ef513c..efcd24a 100755 --- a/js/serialization/Grammar.js +++ b/js/serialization/Grammar.js @@ -3,7 +3,7 @@ import Guid from "../entity/primitive/Guid" import Integer from "../entity/primitive/Integer" import LocalizedTextEntity from "../entity/LocalizedTextEntity" import ObjectEntity from "../entity/ObjectEntity" -import ObjectReference from "../entity/primitive/ObjectReference" +import ObjectReferenceEntity from "../entity/ObjectReferenceEntity" import Parsimmon from "parsimmon" import PinEntity from "../entity/PinEntity" import PinReferenceEntity from "../entity/PinReferenceEntity" @@ -18,7 +18,7 @@ export default class Grammar { InlineOptWhitespace = _ => P.regex(/[^\S\n]*/).desc("inline optional whitespace") WhitespaceNewline = _ => P.regex(/[^\S\n]*\n\s*/).desc("whitespace with at least a newline") Null = r => P.seq(P.string("("), r.InlineOptWhitespace, P.string(")")).map(_ => null).desc("null: ()") - None = _ => P.string("None").map(_ => new ObjectReference("None", "")).desc("none") + None = _ => P.string("None").map(_ => new ObjectReferenceEntity({ type: "None", path: "" })).desc("none") Boolean = _ => P.alt(P.string("True"), P.string("False")).map(v => v === "True" ? true : false).desc("either True or False") Number = _ => P.regex(/[0-9]+(?:\.[0-9]+)?/).map(Number).desc("a number") Integer = _ => P.regex(/[0-9]+/).map(v => new Integer(v)).desc("an integer") @@ -33,7 +33,7 @@ export default class Grammar { .desc('a path (words with possibly underscore, separated by ".", separated by "/")') Reference = r => P.alt( r.None, - r.ReferencePath.map(path => new ObjectReference("", path)), + r.ReferencePath.map(path => new ObjectReferenceEntity({ type: "", path: path })), P.seqMap( r.Word, P.optWhitespace, @@ -42,7 +42,7 @@ export default class Grammar { P.string(result.split("").reverse().join("")) ) ), - (referenceType, _, referencePath) => new ObjectReference(referenceType, referencePath) + (referenceType, _, referencePath) => new ObjectReferenceEntity({ type: referenceType, path: referencePath }) ) ) AttributeName = r => r.Word.sepBy1(P.string(".")).tieWith(".").desc('words separated by ""') @@ -82,7 +82,7 @@ export default class Grammar { return r.String case Guid: return r.Guid - case ObjectReference: + case ObjectReferenceEntity: return r.Reference case LocalizedTextEntity: return r.LocalizedText diff --git a/js/serialization/ObjectSerializer.js b/js/serialization/ObjectSerializer.js index 3ace935..db32b52 100755 --- a/js/serialization/ObjectSerializer.js +++ b/js/serialization/ObjectSerializer.js @@ -49,7 +49,7 @@ export default class ObjectSerializer extends Serializer { * @returns */ write(object) { - let result = `Begin Object Class=${object.Class} Name="${object.Name}" + let result = `Begin Object Class=${this.writeValue(object.Class)} Name=${this.writeValue(object.Name)} ${this.subWrite([], object) + object .CustomProperties.map(pin => this.separator + this.prefix + "CustomProperties " + SerializerFactory.getSerializer(PinEntity).write(pin))