@node-projects/web-component-designer 0.0.217 → 0.0.219

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ @echo off
2
+ echo.
3
+ echo Removes Remote Branches not existing on Server any more
4
+ echo.
5
+ pause
6
+ git remote prune origin
7
+ pause
@@ -2,11 +2,8 @@ import { InstanceServiceContainer } from '../InstanceServiceContainer.js';
2
2
  import { ServiceContainer } from '../ServiceContainer.js';
3
3
  import { IHtmlParserService } from './IHtmlParserService.js';
4
4
  import { IDesignItem } from '../../item/IDesignItem.js';
5
- export declare abstract class AbstractClassElementParserService implements IHtmlParserService {
6
- private _parserUrl;
7
- private _esprimaUrl;
8
- constructor(parserUrl?: string, esprimaUrl?: string);
9
- parse(module: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
10
- private _parseDiv;
11
- _createDesignItemsRecursive(item: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, namespace: string): IDesignItem;
5
+ export declare class AbstractClassElementParserService implements IHtmlParserService {
6
+ private htmlParser;
7
+ constructor(htmlParser: IHtmlParserService);
8
+ parse(code: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
12
9
  }
@@ -1,106 +1,46 @@
1
- import { DesignItem } from '../../item/DesignItem.js';
2
- import { CssAttributeParser } from '../../helper/CssAttributeParser.js';
3
- import { newElementFromString } from '../../helper/ElementHelper.js';
4
- function* getChildNodes(node) {
5
- switch (node.type) {
6
- case 'Program':
7
- yield node.body;
8
- break;
9
- case 'ClassDeclaration':
10
- yield node.body;
11
- break;
12
- case 'MethodDefinition':
13
- yield node.value;
14
- break;
15
- }
1
+ function* findAllNodesOfKind(node, kind) {
2
+ if (node.kind == kind)
3
+ yield node;
4
+ for (const c of node.getChildren())
5
+ yield* findAllNodesOfKind(c, kind);
16
6
  }
17
- //WIP - not yet workin
18
- //Parse HTML inside of Javascript Classes
19
7
  export class AbstractClassElementParserService {
20
- _parserUrl;
21
- _esprimaUrl;
22
- constructor(parserUrl = '../../../../../node-html-parser-esm/dist/index.js', esprimaUrl = '../../../../../esprima-next/dist/esm/esprima.js') {
23
- this._parserUrl = parserUrl;
24
- this._esprimaUrl = esprimaUrl;
8
+ htmlParser;
9
+ constructor(htmlParser) {
10
+ this.htmlParser = htmlParser;
25
11
  }
26
- async parse(module, serviceContainer, instanceServiceContainer, parseSnippet) {
27
- let esprima = await import(this._esprimaUrl);
28
- const parsedModule = esprima.parseModule(module);
29
- const classDecl = parsedModule.body.find(x => x.type == esprima.Syntax.ClassDeclaration);
30
- const renderMethod = classDecl.body.body.find(x => x.type == esprima.Syntax.MethodDefinition && x.key.name == 'render');
31
- const renderMethodStatement = renderMethod.value.body.body[0];
32
- const taggedTemplate = renderMethodStatement.argument;
33
- const templateLiteral = taggedTemplate.quasi;
34
- //@ts-ignore
35
- const tmp = getChildNodes(parsedModule);
36
- const html = templateLiteral.quasis.map(x => x.value.raw).join();
12
+ async parse(code, serviceContainer, instanceServiceContainer, parseSnippet) {
13
+ const compilerHost /*: ts.CompilerHost*/ = {
14
+ fileExists: () => true,
15
+ getCanonicalFileName: filename => filename,
16
+ getCurrentDirectory: () => '',
17
+ getDefaultLibFileName: () => 'lib.d.ts',
18
+ getNewLine: () => '\n',
19
+ getSourceFile: filename => {
20
+ //@ts-ignore
21
+ return ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, true);
22
+ },
23
+ readFile: () => null,
24
+ useCaseSensitiveFileNames: () => true,
25
+ writeFile: () => null,
26
+ };
27
+ const filename = 'aa.ts';
37
28
  //@ts-ignore
38
- let parser = await import(this._parserUrl);
39
- const parsed = parser.parse(html, { comment: true });
40
- let designItems = [];
41
- for (let p of parsed.childNodes) {
42
- let di = this._createDesignItemsRecursive(p, serviceContainer, instanceServiceContainer, null);
43
- if (di != null)
44
- designItems.push(di);
45
- else
46
- console.warn("NodeHtmlParserService - could not parse element", p);
47
- }
48
- return designItems;
49
- }
50
- _parseDiv = document.createElement("div");
51
- _createDesignItemsRecursive(item, serviceContainer, instanceServiceContainer, namespace) {
52
- let designItem = null;
53
- if (item.nodeType == 1) {
54
- let element;
55
- let manualCreatedElement = false;
56
- if (!namespace)
57
- element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
58
- if (!element) {
59
- if (namespace)
60
- element = document.createElementNS(namespace, item.rawTagName);
61
- else
62
- element = document.createElement(item.rawTagName);
63
- manualCreatedElement = true;
64
- }
65
- designItem = new DesignItem(element, item, serviceContainer, instanceServiceContainer);
66
- let style = '';
67
- let attr = item.attributes;
68
- for (let a in attr) {
69
- if (a !== 'style') {
70
- designItem._withoutUndoSetAttribute(a, attr[a]);
71
- if (manualCreatedElement) {
72
- element.setAttribute(a, attr[a]);
73
- }
74
- }
75
- else {
76
- style = attr[a];
77
- }
78
- }
79
- if ((element instanceof HTMLElement || element instanceof SVGElement) && style) {
80
- let styleParser = new CssAttributeParser();
81
- styleParser.parse(style);
82
- for (let s of styleParser.entries) {
83
- designItem._withoutUndoSetStyle(s.name, s.value);
84
- if (manualCreatedElement) {
85
- element.style[s.name] = s.value;
86
- }
87
- }
88
- }
89
- element.draggable = false; //even if it should be true, for better designer exp.
90
- for (let c of item.childNodes) {
91
- let di = this._createDesignItemsRecursive(c, serviceContainer, instanceServiceContainer, element instanceof SVGElement ? 'http://www.w3.org/2000/svg' : null);
92
- designItem._insertChildInternal(di);
93
- }
94
- }
95
- else if (item.nodeType == 3) {
96
- this._parseDiv.innerHTML = item.rawText;
97
- let element = this._parseDiv.childNodes[0];
98
- designItem = new DesignItem(element, item, serviceContainer, instanceServiceContainer);
99
- }
100
- else if (item.nodeType == 8) {
101
- let element = document.createComment(item.rawText);
102
- designItem = new DesignItem(element, item, serviceContainer, instanceServiceContainer);
29
+ const program = ts.createProgram([filename], {
30
+ noResolve: true,
31
+ //@ts-ignore
32
+ target: ts.ScriptTarget.Latest,
33
+ }, compilerHost);
34
+ const sourceFile = program.getSourceFile(filename);
35
+ let htmlCode = "";
36
+ let cssStyle = "";
37
+ const nodes = findAllNodesOfKind(sourceFile, 212);
38
+ for (let nd of nodes) {
39
+ if (nd.tag.escapedText == 'html' && nd.parent.name.escapedText == "template")
40
+ htmlCode = nd.template.rawText;
41
+ if (nd.tag.escapedText == 'css' && nd.parent.name.escapedText == "style")
42
+ cssStyle = nd.template.rawText;
103
43
  }
104
- return designItem;
44
+ return this.htmlParser.parse(htmlCode, serviceContainer, instanceServiceContainer, parseSnippet);
105
45
  }
106
46
  }
@@ -0,0 +1,9 @@
1
+ import { InstanceServiceContainer } from '../InstanceServiceContainer.js';
2
+ import { ServiceContainer } from '../ServiceContainer.js';
3
+ import { IHtmlParserService } from './IHtmlParserService.js';
4
+ import { IDesignItem } from '../../item/IDesignItem.js';
5
+ export declare class BaseCustomWebcomponentParserService implements IHtmlParserService {
6
+ private htmlParser;
7
+ constructor(htmlParser: IHtmlParserService);
8
+ parse(code: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
9
+ }
@@ -0,0 +1,47 @@
1
+ function* findAllNodesOfKind(node, kind) {
2
+ if (node.kind == kind)
3
+ yield node;
4
+ for (const c of node.getChildren())
5
+ yield* findAllNodesOfKind(c, kind);
6
+ }
7
+ export class BaseCustomWebcomponentParserService {
8
+ htmlParser;
9
+ constructor(htmlParser) {
10
+ this.htmlParser = htmlParser;
11
+ }
12
+ async parse(code, serviceContainer, instanceServiceContainer, parseSnippet) {
13
+ const compilerHost = {
14
+ fileExists: () => true,
15
+ getCanonicalFileName: filename => filename,
16
+ getCurrentDirectory: () => '',
17
+ getDefaultLibFileName: () => 'lib.d.ts',
18
+ getNewLine: () => '\n',
19
+ getSourceFile: filename => {
20
+ //@ts-ignore
21
+ return ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, true);
22
+ },
23
+ readFile: () => null,
24
+ useCaseSensitiveFileNames: () => true,
25
+ writeFile: () => null,
26
+ };
27
+ const filename = 'aa.ts';
28
+ //@ts-ignore
29
+ const program = ts.createProgram([filename], {
30
+ noResolve: true,
31
+ //@ts-ignore
32
+ target: ts.ScriptTarget.Latest,
33
+ }, compilerHost);
34
+ const sourceFile = program.getSourceFile(filename);
35
+ let htmlCode = "";
36
+ let cssStyle = "";
37
+ const nodes = findAllNodesOfKind(sourceFile, 212);
38
+ for (let nd of nodes) {
39
+ if (nd.tag.escapedText == 'html' && nd.parent.name.escapedText == "template")
40
+ htmlCode = nd.template.rawText;
41
+ if (nd.tag.escapedText == 'css' && nd.parent.name.escapedText == "style")
42
+ cssStyle = nd.template.rawText;
43
+ }
44
+ instanceServiceContainer.stylesheetService.setStylesheets([{ name: 'css', content: cssStyle }]);
45
+ return this.htmlParser.parse(htmlCode, serviceContainer, instanceServiceContainer, parseSnippet);
46
+ }
47
+ }
@@ -98,6 +98,9 @@ export declare class DesignerCanvas extends BaseCustomWebComponentLazyAppend imp
98
98
  private _onDrop;
99
99
  showDesignItemContextMenu(designItem: IDesignItem, event: MouseEvent): ContextMenu;
100
100
  private _onDblClick;
101
+ private _searchShowOverlay;
102
+ private _searchHideOverlay;
103
+ private _searchRun;
101
104
  private onKeyUp;
102
105
  private onKeyDown;
103
106
  /**
@@ -148,7 +148,86 @@ class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
148
148
  #node-projects-designer-canvas-helper-element {
149
149
  height: 0;
150
150
  width: 0;
151
- }
151
+ }
152
+
153
+ #node-projects-designer-search-container {
154
+ position:absolute;
155
+ display: grid;
156
+ grid-template-columns: 1fr auto auto;
157
+ align-items: center;
158
+ justify-content: left;
159
+ gap: 8px;
160
+ width: auto;
161
+ right: 10px;
162
+ top: 0;
163
+ background:rgb(242, 242, 242);
164
+ padding: 5px 6px;
165
+ border-bottom-left-radius: 5px;
166
+ border-bottom-right-radius: 5px;
167
+ }
168
+
169
+ #node-projects-designer-search-container > #node-projects-designer-search-bar {
170
+ border: 1px solid black;
171
+ padding: 0;
172
+ display: grid;
173
+ grid-template-columns: 1fr auto;
174
+ align-items: center;
175
+ background-color: white;
176
+ padding: 1px 2px;
177
+ }
178
+
179
+ #node-projects-designer-search-container > div > input {
180
+ height:20px;
181
+ padding-left: 6px;
182
+ font-size: 13px;
183
+ border: none;
184
+ outline: none;
185
+ }
186
+
187
+ #node-projects-designer-search-container > div > #node-projects-designer-search-start {
188
+ height:22px;
189
+ border: none;
190
+ background-color: white;
191
+ font-size: 13px;
192
+ }
193
+
194
+ #node-projects-designer-search-container > div > #node-projects-designer-search-start:hover {
195
+ background-color: #D3D3D3;
196
+ transition: 0.9s;
197
+ border-radius: 2px;
198
+ }
199
+
200
+ #node-projects-designer-search-container > #node-projects-designer-search-close {
201
+ position: relative;
202
+ width: 20px;
203
+ height: 20px;
204
+ border: none;
205
+ background-color: transparent;
206
+ }
207
+
208
+ #node-projects-designer-search-container > span {
209
+ font-family:sans-serif;
210
+ font-size: 12px;
211
+ }
212
+
213
+ #node-projects-designer-search-container > #node-projects-designer-search-close::before,
214
+ #node-projects-designer-search-container > #node-projects-designer-search-close::after {
215
+ content: "";
216
+ position: absolute;
217
+ top: 50%;
218
+ left: 50%;
219
+ width: 60%;
220
+ background-color: black;
221
+ height: 1px;
222
+ }
223
+
224
+ #node-projects-designer-search-container > #node-projects-designer-search-close::before {
225
+ transform: translate(-50%, -50%) rotate(45deg);
226
+ }
227
+
228
+ #node-projects-designer-search-container > #node-projects-designer-search-close::after {
229
+ transform: translate(-50%, -50%) rotate(-45deg);
230
+ }
152
231
  `;
153
232
  static template = html `
154
233
  <div style="display: flex;flex-direction: column;width: 100%;height: 100%; margin: 0 !important; padding: 0 !important; border: none !important;">
@@ -161,6 +240,15 @@ class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
161
240
  </div>
162
241
  <div id="node-projects-designer-canvas-clickOverlay" tabindex="0" style="pointer-events: auto; margin: 0 !important; padding: 0 !important; border: none !important;"></div>
163
242
  </div>
243
+
244
+ <div id="node-projects-designer-search-container" style="display: none;">
245
+ <div id="node-projects-designer-search-bar">
246
+ <input id="node-projects-designer-search-input">
247
+ <button id="node-projects-designer-search-start">&darr;</button>
248
+ </div>
249
+ <span id="node-projects-designer-search-result">0 selected</span>
250
+ <button id="node-projects-designer-search-close"></button>
251
+ </div>
164
252
  </div>`;
165
253
  extensionManager;
166
254
  _pointerextensions;
@@ -176,6 +264,12 @@ class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
176
264
  this.onKeyUp = this.onKeyUp.bind(this);
177
265
  this._onDblClick = this._onDblClick.bind(this);
178
266
  this._pointerEventHandler = this._pointerEventHandler.bind(this);
267
+ this._getDomElement('node-projects-designer-search-close').onclick = () => this._searchHideOverlay();
268
+ this._getDomElement('node-projects-designer-search-start').onclick = () => this._searchRun();
269
+ this._getDomElement('node-projects-designer-search-container').onkeydown = (event) => {
270
+ if (event.key === "Enter")
271
+ this._searchRun();
272
+ };
179
273
  this.clickOverlay.oncontextmenu = (e) => e.preventDefault();
180
274
  }
181
275
  get designerWidth() {
@@ -756,6 +850,31 @@ class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
756
850
  event.preventDefault();
757
851
  this.extensionManager.applyExtension(this.instanceServiceContainer.selectionService.primarySelection, ExtensionType.Doubleclick, event);
758
852
  }
853
+ _searchShowOverlay() {
854
+ let divElement = this._getDomElement('node-projects-designer-search-container');
855
+ divElement.style.display = '';
856
+ this._getDomElement('node-projects-designer-search-input').focus();
857
+ }
858
+ _searchHideOverlay() {
859
+ let divElement = this._getDomElement('node-projects-designer-search-container');
860
+ divElement.style.display = 'none';
861
+ }
862
+ _searchRun() {
863
+ let input = this._getDomElement('node-projects-designer-search-input');
864
+ this._getDomElement('node-projects-designer-search-result').innerHTML = "0 selected";
865
+ if (input.value != "") {
866
+ let selectedElements = this.shadowRoot.querySelectorAll(input.value);
867
+ let designItems = [];
868
+ for (let i = 0; i <= selectedElements.length; i++) {
869
+ if (this._canvasContainer.contains(selectedElements[i]))
870
+ designItems.push(DesignItem.GetDesignItem(selectedElements[i]));
871
+ }
872
+ if (designItems.length > 0) {
873
+ this.instanceServiceContainer.selectionService.setSelectedElements(designItems);
874
+ this._getDomElement('node-projects-designer-search-result').innerHTML = designItems.length.toString() + " selected";
875
+ }
876
+ }
877
+ }
759
878
  onKeyUp(event) {
760
879
  if (event.composedPath().indexOf(this.eatEvents) >= 0)
761
880
  return;
@@ -778,6 +897,8 @@ class DesignerCanvas extends BaseCustomWebComponentLazyAppend {
778
897
  this.executeCommand({ type: CommandType.paste, ctrlKey: event.ctrlKey, altKey: event.altKey, shiftKey: event.shiftKey });
779
898
  else if ((event.ctrlKey || event.metaKey) && event.key === 'x')
780
899
  this.executeCommand({ type: CommandType.cut, ctrlKey: event.ctrlKey, altKey: event.altKey, shiftKey: event.shiftKey });
900
+ else if ((event.ctrlKey || event.metaKey) && event.key === 'f')
901
+ this._searchShowOverlay();
781
902
  else {
782
903
  let primarySelection = this.instanceServiceContainer.selectionService.primarySelection;
783
904
  if (!primarySelection) {
package/dist/index.d.ts CHANGED
@@ -57,6 +57,7 @@ export * from "./elements/services/htmlWriterService/AbstractHtmlWriterService.j
57
57
  export * from "./elements/services/htmlWriterService/FormatingHtmlWriterService.js";
58
58
  export * from "./elements/services/htmlWriterService/HtmlWriterService.js";
59
59
  export * from "./elements/services/htmlWriterService/LitTsElementWriterService.js";
60
+ export * from "./elements/services/htmlParserService/BaseCustomWebcomponentParserService.js";
60
61
  export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
61
62
  export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
62
63
  export * from "./elements/services/htmlParserService/LitElementParserService.js";
package/dist/index.js CHANGED
@@ -35,6 +35,7 @@ export * from "./elements/services/htmlWriterService/AbstractHtmlWriterService.j
35
35
  export * from "./elements/services/htmlWriterService/FormatingHtmlWriterService.js";
36
36
  export * from "./elements/services/htmlWriterService/HtmlWriterService.js";
37
37
  export * from "./elements/services/htmlWriterService/LitTsElementWriterService.js";
38
+ export * from "./elements/services/htmlParserService/BaseCustomWebcomponentParserService.js";
38
39
  export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
39
40
  export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
40
41
  export * from "./elements/services/htmlParserService/LitElementParserService.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.217",
4
+ "version": "0.0.219",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",