@node-projects/web-component-designer 0.0.75 → 0.0.79

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.
Files changed (71) hide show
  1. package/README.md +2 -2
  2. package/dist/elements/documentContainer.d.ts +3 -0
  3. package/dist/elements/documentContainer.js +13 -3
  4. package/dist/elements/helper/ElementHelper.d.ts +7 -0
  5. package/dist/elements/helper/ElementHelper.js +13 -0
  6. package/dist/elements/helper/IndentedTextWriter.d.ts +1 -0
  7. package/dist/elements/helper/IndentedTextWriter.js +3 -0
  8. package/dist/elements/services/BaseServiceContainer.d.ts +1 -0
  9. package/dist/elements/services/BaseServiceContainer.js +7 -0
  10. package/dist/elements/services/DefaultServiceBootstrap.js +1 -1
  11. package/dist/elements/services/ServiceContainer.d.ts +1 -1
  12. package/dist/elements/services/ServiceContainer.js +2 -2
  13. package/dist/elements/services/demoProviderService/DemoProviderService.d.ts +1 -1
  14. package/dist/elements/services/demoProviderService/DemoProviderService.js +3 -2
  15. package/dist/elements/services/demoProviderService/IDemoProviderService.d.ts +1 -1
  16. package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService copy.d.ts +22 -0
  17. package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService copy.js +125 -0
  18. package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.d.ts +22 -0
  19. package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.js +133 -0
  20. package/dist/elements/services/htmlWriterService/HtmlWriterService copy.d.ts +22 -0
  21. package/dist/elements/services/htmlWriterService/HtmlWriterService copy.js +118 -0
  22. package/dist/elements/services/htmlWriterService/HtmlWriterService.d.ts +2 -2
  23. package/dist/elements/services/htmlWriterService/HtmlWriterService.js +34 -19
  24. package/dist/elements/services/htmlWriterService/IHtmlWriterService.d.ts +5 -6
  25. package/dist/elements/services/htmlWriterService/LitElementWriterService.d.ts +14 -0
  26. package/dist/elements/services/htmlWriterService/LitElementWriterService.js +123 -0
  27. package/dist/elements/services/htmlWriterService/LitTsElementWriterService.d.ts +9 -0
  28. package/dist/elements/services/htmlWriterService/LitTsElementWriterService.js +43 -0
  29. package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService copy.d.ts +22 -0
  30. package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService copy.js +125 -0
  31. package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService.d.ts +27 -0
  32. package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService.js +93 -0
  33. package/dist/elements/services/initializationService/DefaultIntializationService.d.ts +6 -0
  34. package/dist/elements/services/initializationService/DefaultIntializationService.js +22 -0
  35. package/dist/elements/services/initializationService/IIntializationService copy.d.ts +4 -0
  36. package/dist/elements/services/initializationService/IIntializationService copy.js +1 -0
  37. package/dist/elements/services/instanceService/DefaultInstanceService.js +1 -1
  38. package/dist/elements/services/manifestLoaders/WebcomponentManifestParserService.d.ts +26 -0
  39. package/dist/elements/services/manifestLoaders/WebcomponentManifestParserService.js +69 -0
  40. package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.d.ts +25 -0
  41. package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.js +92 -0
  42. package/dist/elements/services/propertiesService/DefaultEditorTypesService.js +0 -1
  43. package/dist/elements/services/propertiesService/IPropertiesService.d.ts +0 -1
  44. package/dist/elements/services/propertiesService/IProperty.d.ts +5 -1
  45. package/dist/elements/services/propertiesService/PropertyType.d.ts +6 -0
  46. package/dist/elements/services/propertiesService/PropertyType.js +7 -0
  47. package/dist/elements/services/propertiesService/services/AbstractBasePropertiesService.js +7 -6
  48. package/dist/elements/services/propertiesService/services/AttributesPropertiesService.js +3 -2
  49. package/dist/elements/services/propertiesService/services/CommonPropertiesService.js +11 -4
  50. package/dist/elements/services/propertiesService/services/CssPropertiesService.js +81 -41
  51. package/dist/elements/services/propertiesService/services/IJsonPropertyDefinition.d.ts +4 -0
  52. package/dist/elements/services/propertiesService/services/ListPropertiesService.js +5 -1
  53. package/dist/elements/services/propertiesService/services/Lit2PropertiesService.js +7 -6
  54. package/dist/elements/services/propertiesService/services/NativeElementsPropertiesService.js +25 -12
  55. package/dist/elements/services/propertiesService/services/UnkownElementPropertiesService.d.ts +1 -2
  56. package/dist/elements/services/propertiesService/services/UnkownElementPropertiesService.js +1 -1
  57. package/dist/elements/services/webcomponentManifestParserService/WebcomponentManifestParserService.1.d.ts +0 -0
  58. package/dist/elements/services/webcomponentManifestParserService/WebcomponentManifestParserService.1.js +1 -0
  59. package/dist/elements/services/webcomponentManifestParserService/webcomponentManifestParserService.d.ts +26 -0
  60. package/dist/elements/services/webcomponentManifestParserService/webcomponentManifestParserService.js +69 -0
  61. package/dist/elements/widgets/demoView/IDemoView.d.ts +1 -1
  62. package/dist/elements/widgets/demoView/demoView.d.ts +1 -1
  63. package/dist/elements/widgets/demoView/demoView.js +2 -2
  64. package/dist/elements/widgets/designerView/DomConverter.js +1 -7
  65. package/dist/elements/widgets/designerView/designerCanvas.js +6 -0
  66. package/dist/elements/widgets/designerView/overlayLayerView.js +1 -2
  67. package/dist/elements/widgets/paletteView/paletteTreeView.js +13 -8
  68. package/dist/elements/widgets/paletteView/paletteView.js +10 -5
  69. package/dist/index.d.ts +4 -0
  70. package/dist/index.js +4 -0
  71. package/package.json +5 -4
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # web-component-designer
2
2
 
3
- ## Caution - this is a preview Version, a RC is planed for Q3/2021
3
+ ## Caution - this is a preview Version, a RC is planed for January 2022
4
4
 
5
5
  A HTML WebComponent for Designing Webcomponents and HTML Pages.
6
6
 
@@ -81,4 +81,4 @@ Your addition to your index.html should look like this:
81
81
  The Library uses Images from the Chrome Dev Tools, see
82
82
  https://github.com/ChromeDevTools/devtools-frontend/tree/main/front_end/Images/src
83
83
  and
84
- https://github.com/ChromeDevTools/devtools-frontend/blob/main/LICENSE
84
+ https://github.com/ChromeDevTools/devtools-frontend/blob/main/LICENSE
@@ -13,6 +13,9 @@ export declare class DocumentContainer extends BaseCustomWebComponentLazyAppend
13
13
  codeView: ICodeView & HTMLElement;
14
14
  demoView: IDemoView & HTMLElement;
15
15
  additionalData: any;
16
+ private _additionalStyle;
17
+ set additionalStyleString(style: string);
18
+ get additionalStyleString(): string;
16
19
  private _serviceContainer;
17
20
  private _content;
18
21
  private _tabControl;
@@ -1,4 +1,4 @@
1
- import { BaseCustomWebComponentLazyAppend, css, debounce } from "@node-projects/base-custom-webcomponent";
1
+ import { BaseCustomWebComponentLazyAppend, css, cssFromString, debounce } from "@node-projects/base-custom-webcomponent";
2
2
  import { DesignerTabControl } from "./controls/DesignerTabControl";
3
3
  import { DesignerView } from "./widgets/designerView/designerView";
4
4
  import { SimpleSplitView } from './controls/SimpleSplitView';
@@ -7,6 +7,16 @@ export class DocumentContainer extends BaseCustomWebComponentLazyAppend {
7
7
  codeView;
8
8
  demoView;
9
9
  additionalData;
10
+ _additionalStyle;
11
+ set additionalStyleString(style) {
12
+ this._additionalStyle = style;
13
+ this.designerView.additionalStyle = cssFromString(style);
14
+ }
15
+ ;
16
+ get additionalStyleString() {
17
+ return this._additionalStyle;
18
+ }
19
+ ;
10
20
  _serviceContainer;
11
21
  _content = '';
12
22
  _tabControl;
@@ -136,7 +146,7 @@ export class DocumentContainer extends BaseCustomWebComponentLazyAppend {
136
146
  else if (this._tabControl.selectedIndex === 2) {
137
147
  }
138
148
  else if (this._tabControl.selectedIndex === 3)
139
- this.demoView.display(this._serviceContainer, this.designerView.instanceServiceContainer, this._content);
149
+ this.demoView.display(this._serviceContainer, this.designerView.instanceServiceContainer, this._content, this.additionalStyleString);
140
150
  }
141
151
  }
142
152
  get content() {
@@ -181,7 +191,7 @@ export class DocumentContainer extends BaseCustomWebComponentLazyAppend {
181
191
  this._splitDiv.appendChild(this.codeView);
182
192
  }
183
193
  if (i.newIndex === 3) {
184
- this.demoView.display(this._serviceContainer, this.designerView.instanceServiceContainer, this._content);
194
+ this.demoView.display(this._serviceContainer, this.designerView.instanceServiceContainer, this._content, this.additionalStyleString);
185
195
  }
186
196
  });
187
197
  if (this._content)
@@ -1,2 +1,9 @@
1
1
  export declare function newElementFromString(text: any): Element;
2
+ export declare enum ElementDisplayType {
3
+ none = 0,
4
+ inline = 1,
5
+ block = 2
6
+ }
2
7
  export declare function isInline(element: HTMLElement): boolean;
8
+ export declare function getElementDisplaytype(element: HTMLElement): ElementDisplayType;
9
+ export declare function isEmptyTextNode(node: Node): boolean;
@@ -4,6 +4,19 @@ export function newElementFromString(text) {
4
4
  const fragment = range.createContextualFragment(text);
5
5
  return fragment.firstChild;
6
6
  }
7
+ export var ElementDisplayType;
8
+ (function (ElementDisplayType) {
9
+ ElementDisplayType[ElementDisplayType["none"] = 0] = "none";
10
+ ElementDisplayType[ElementDisplayType["inline"] = 1] = "inline";
11
+ ElementDisplayType[ElementDisplayType["block"] = 2] = "block";
12
+ })(ElementDisplayType || (ElementDisplayType = {}));
7
13
  export function isInline(element) {
8
14
  return element != null && window.getComputedStyle(element).display.startsWith('inline');
9
15
  }
16
+ export function getElementDisplaytype(element) {
17
+ const display = window.getComputedStyle(element).display;
18
+ return display == 'none' ? ElementDisplayType.none : display.startsWith('inline') ? ElementDisplayType.inline : ElementDisplayType.block;
19
+ }
20
+ export function isEmptyTextNode(node) {
21
+ return node.textContent.trim() == '' && node.textContent.indexOf('\xa0' /* &nbsp; */) < 0;
22
+ }
@@ -3,6 +3,7 @@ export declare class IndentedTextWriter {
3
3
  readonly indent: number;
4
4
  level: number;
5
5
  get position(): number;
6
+ isLastCharNewline(): boolean;
6
7
  levelRaise(): void;
7
8
  levelShrink(): void;
8
9
  write(text: string): void;
@@ -5,6 +5,9 @@ export class IndentedTextWriter {
5
5
  get position() {
6
6
  return this._textHolder.length;
7
7
  }
8
+ isLastCharNewline() {
9
+ return this._textHolder[this._textHolder.length - 1] === '\n';
10
+ }
8
11
  levelRaise() {
9
12
  this.level++;
10
13
  }
@@ -4,6 +4,7 @@ export declare class BaseServiceContainer<NameMap> {
4
4
  getLastService<K extends keyof NameMap>(service: K): NameMap[K];
5
5
  getServices<K extends keyof NameMap>(service: K): NameMap[K][];
6
6
  register<K extends keyof NameMap>(name: K, service: NameMap[K]): void;
7
+ registerMultiple<K extends keyof NameMap>(names: K[], service: NameMap[K]): void;
7
8
  forSomeServicesTillResult<K extends keyof NameMap, Y>(service: K, callback: (service: NameMap[K]) => Y): Y;
8
9
  getLastServiceWhere<K extends keyof NameMap, Y>(service: K, callback: (service: NameMap[K]) => Y): NameMap[K];
9
10
  }
@@ -14,6 +14,13 @@ export class BaseServiceContainer {
14
14
  this._services.set(name, []);
15
15
  this._services.get(name).push(service);
16
16
  }
17
+ registerMultiple(names, service) {
18
+ for (const name of names) {
19
+ if (!this._services.has(name))
20
+ this._services.set(name, []);
21
+ this._services.get(name).push(service);
22
+ }
23
+ }
17
24
  forSomeServicesTillResult(service, callback) {
18
25
  let services = this.getServices(service);
19
26
  if (services == null) {
@@ -4,7 +4,6 @@ import { LitElementPropertiesService } from './propertiesService/services/LitEle
4
4
  import { NativeElementsPropertiesService } from './propertiesService/services/NativeElementsPropertiesService.js';
5
5
  import { DefaultInstanceService } from './instanceService/DefaultInstanceService.js';
6
6
  import { DefaultEditorTypesService } from './propertiesService/DefaultEditorTypesService.js';
7
- import { HtmlWriterService } from './htmlWriterService/HtmlWriterService.js';
8
7
  import { BaseCustomWebComponentPropertiesService } from './propertiesService/services/BaseCustomWebComponentPropertiesService.js';
9
8
  import { DefaultPlacementService } from './placementService/DefaultPlacementService.js';
10
9
  import { DefaultHtmlParserService } from './htmlParserService/DefaultHtmlParserService.js';
@@ -52,6 +51,7 @@ import { DemoProviderService } from './demoProviderService/DemoProviderService';
52
51
  import { DrawRectTool } from '../widgets/designerView/tools/DrawRectTool.js';
53
52
  import { DrawEllipsisTool } from '../widgets/designerView/tools/DrawEllipsisTool.js';
54
53
  import { DrawLineTool } from '../widgets/designerView/tools/DrawLineTool.js';
54
+ import { HtmlWriterService } from './htmlWriterService/HtmlWriterService.js';
55
55
  export function createDefaultServiceContainer() {
56
56
  let serviceContainer = new ServiceContainer();
57
57
  serviceContainer.register("propertyService", new PolymerPropertiesService());
@@ -67,7 +67,7 @@ export declare class ServiceContainer extends BaseServiceContainer<ServiceNameMa
67
67
  get elementsServices(): IElementsService[];
68
68
  get instanceServices(): IInstanceService[];
69
69
  get editorTypesServices(): IEditorTypesService[];
70
- get htmlWriterServices(): IHtmlWriterService[];
70
+ get htmlWriterService(): IHtmlWriterService;
71
71
  get htmlParserService(): IHtmlParserService;
72
72
  get intializationService(): IIntializationService;
73
73
  get elementAtPointService(): IElementAtPointService;
@@ -40,8 +40,8 @@ export class ServiceContainer extends BaseServiceContainer {
40
40
  get editorTypesServices() {
41
41
  return this.getServices('editorTypesService');
42
42
  }
43
- get htmlWriterServices() {
44
- return this.getServices('htmlWriterService');
43
+ get htmlWriterService() {
44
+ return this.getLastService('htmlWriterService');
45
45
  }
46
46
  get htmlParserService() {
47
47
  return this.getLastService('htmlParserService');
@@ -2,5 +2,5 @@ import { InstanceServiceContainer } from "../InstanceServiceContainer.js";
2
2
  import { ServiceContainer } from "../ServiceContainer.js";
3
3
  import { IDemoProviderService } from "./IDemoProviderService.js";
4
4
  export declare class DemoProviderService implements IDemoProviderService {
5
- provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string): Promise<void>;
5
+ provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string, style: string): Promise<void>;
6
6
  }
@@ -1,6 +1,6 @@
1
1
  import { DomHelper } from '@node-projects/base-custom-webcomponent/dist/DomHelper';
2
2
  export class DemoProviderService {
3
- provideDemo(container, serviceContainer, instanceServiceContainer, code) {
3
+ provideDemo(container, serviceContainer, instanceServiceContainer, code, style) {
4
4
  return new Promise(resolve => {
5
5
  const iframe = document.createElement('iframe');
6
6
  iframe.style.width = '100%';
@@ -21,7 +21,8 @@ export class DemoProviderService {
21
21
  }
22
22
  doc.write("document.body.style.display='';");
23
23
  doc.write('</script>');
24
- doc.write('<body style="display:none">' + code + '</body>');
24
+ doc.write('<style>' + (style ?? '') + '</style>');
25
+ doc.write('<body style="display:none; width: 100%; height: 100%; margin: 0; padding: 0; position: absolute;">' + code + '</body>');
25
26
  doc.close();
26
27
  });
27
28
  }
@@ -1,5 +1,5 @@
1
1
  import { InstanceServiceContainer } from "../InstanceServiceContainer.js";
2
2
  import { ServiceContainer } from "../ServiceContainer.js";
3
3
  export interface IDemoProviderService {
4
- provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string): any;
4
+ provideDemo(container: HTMLElement, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, code: string, style: string): any;
5
5
  }
@@ -0,0 +1,22 @@
1
+ import { IDesignItem } from '../../item/IDesignItem';
2
+ import { IHtmlWriterService } from './IHtmlWriterService';
3
+ import { IHtmlWriterOptions } from './IHtmlWriterOptions';
4
+ import { IndentedTextWriter } from '../../helper/IndentedTextWriter';
5
+ import { IStringPosition } from './IStringPosition';
6
+ declare enum ElementContainerType {
7
+ block = 0,
8
+ complex = 1
9
+ }
10
+ export declare class FormatingHtmlWriterService implements IHtmlWriterService {
11
+ private writeAttributes;
12
+ private writeStyles;
13
+ private _writeTextNode;
14
+ private _writeCommentNode;
15
+ private _writeElementNode;
16
+ private _writeDesignItemList;
17
+ private _writeNewlineAndIntend;
18
+ private _writeInternal;
19
+ getContainerType(element: HTMLElement): ElementContainerType;
20
+ write(indentedTextWriter: IndentedTextWriter, designItems: IDesignItem[], rootContainerKeepInline: boolean, options: IHtmlWriterOptions, designItemsAssignmentList?: Map<IDesignItem, IStringPosition>): void;
21
+ }
22
+ export {};
@@ -0,0 +1,125 @@
1
+ import { DomConverter } from '../../widgets/designerView/DomConverter';
2
+ import { CssCombiner } from '../../helper/CssCombiner';
3
+ import { NodeType } from '../../item/NodeType';
4
+ import { PropertiesHelper } from '../propertiesService/services/PropertiesHelper';
5
+ import { ElementDisplayType, getElementDisplaytype } from '../../helper/ElementHelper.js';
6
+ var ElementContainerType;
7
+ (function (ElementContainerType) {
8
+ ElementContainerType[ElementContainerType["block"] = 0] = "block";
9
+ ElementContainerType[ElementContainerType["complex"] = 1] = "complex";
10
+ })(ElementContainerType || (ElementContainerType = {}));
11
+ const defaultDisplayNoneContainerDisplayType = ElementContainerType.complex;
12
+ export class FormatingHtmlWriterService {
13
+ writeAttributes(writeContext, designItem) {
14
+ if (designItem.hasAttributes) {
15
+ for (const a of designItem.attributes) {
16
+ writeContext.indentedTextWriter.write(' ');
17
+ if (typeof a[1] === 'string') {
18
+ if (a[1] === "")
19
+ writeContext.indentedTextWriter.write(a[0]);
20
+ else
21
+ writeContext.indentedTextWriter.write(a[0] + '="' + DomConverter.normalizeAttributeValue(a[1]) + '"');
22
+ }
23
+ else if (!a[1])
24
+ writeContext.indentedTextWriter.write(a[0]);
25
+ else {
26
+ }
27
+ }
28
+ }
29
+ }
30
+ writeStyles(writeContext, designItem) {
31
+ if (designItem.hasStyles) {
32
+ writeContext.indentedTextWriter.write(' style="');
33
+ let styles = designItem.styles;
34
+ if (writeContext.options.compressCssToShorthandProperties)
35
+ styles = CssCombiner.combine(styles);
36
+ for (const s of styles) {
37
+ if (s[0]) {
38
+ writeContext.indentedTextWriter.write(PropertiesHelper.camelToDashCase(s[0]) + ':' + DomConverter.normalizeAttributeValue(s[1]) + ';');
39
+ }
40
+ }
41
+ writeContext.indentedTextWriter.write('"');
42
+ }
43
+ }
44
+ _writeTextNode(writeContext, designItem) {
45
+ writeContext.lastElementDisplayType = ElementDisplayType.inline;
46
+ let content = DomConverter.normalizeContentValue(designItem.content).trim();
47
+ if (content) {
48
+ writeContext.indentedTextWriter.write(content);
49
+ }
50
+ }
51
+ _writeCommentNode(writeContext, designItem) {
52
+ writeContext.indentedTextWriter.write('<!--' + designItem.content + '-->');
53
+ }
54
+ _writeElementNode(writeContext, designItem) {
55
+ const currentElementDisplayType = getElementDisplaytype(designItem.element);
56
+ writeContext.lastElementDisplayType = currentElementDisplayType;
57
+ writeContext.indentedTextWriter.write('<' + designItem.name);
58
+ this.writeAttributes(writeContext, designItem);
59
+ this.writeStyles(writeContext, designItem);
60
+ writeContext.indentedTextWriter.write('>');
61
+ if (designItem.hasChildren) {
62
+ const children = designItem.children();
63
+ const contentSingleTextNode = designItem.childCount === 1 && designItem.firstChild.nodeType === NodeType.TextNode;
64
+ if (contentSingleTextNode) {
65
+ this._writeInternal(writeContext, designItem.firstChild);
66
+ }
67
+ else {
68
+ let previousContainerDisplayType = writeContext.containerDisplayType;
69
+ writeContext.containerDisplayType = this.getContainerType(designItem.element);
70
+ writeContext.indentedTextWriter.levelRaise();
71
+ this._writeDesignItemList(currentElementDisplayType, writeContext, children);
72
+ writeContext.indentedTextWriter.levelShrink();
73
+ writeContext.containerDisplayType = previousContainerDisplayType;
74
+ }
75
+ }
76
+ else if (designItem.hasContent) {
77
+ writeContext.indentedTextWriter.write(DomConverter.normalizeContentValue(designItem.content));
78
+ }
79
+ if (!DomConverter.IsSelfClosingElement(designItem.name)) {
80
+ //write newline & intend ???
81
+ writeContext.indentedTextWriter.write('</' + designItem.name + '>');
82
+ if (currentElementDisplayType !== ElementDisplayType.none) {
83
+ writeContext.lastElementDisplayType = currentElementDisplayType;
84
+ }
85
+ }
86
+ }
87
+ _writeDesignItemList(currentElementDisplayType, writeContext, children) {
88
+ for (const c of children) {
89
+ if (writeContext.lastElementDisplayType == null) {
90
+ //first entry, do nothing
91
+ }
92
+ else if (writeContext.containerDisplayType === ElementContainerType.complex)
93
+ this._writeNewlineAndIntend(writeContext);
94
+ else if (writeContext.lastElementDisplayType !== ElementDisplayType.inline || currentElementDisplayType !== ElementDisplayType.inline)
95
+ this._writeNewlineAndIntend(writeContext);
96
+ this._writeInternal(writeContext, c);
97
+ }
98
+ }
99
+ _writeNewlineAndIntend(writeContext) {
100
+ writeContext.indentedTextWriter.writeNewline();
101
+ writeContext.indentedTextWriter.writeIndent();
102
+ }
103
+ _writeInternal(writeContext, designItem) {
104
+ const start = writeContext.indentedTextWriter.position;
105
+ if (designItem.nodeType === NodeType.TextNode)
106
+ this._writeTextNode(writeContext, designItem);
107
+ else if (designItem.nodeType === NodeType.Comment)
108
+ this._writeCommentNode(writeContext, designItem);
109
+ else if (designItem.nodeType === NodeType.Element)
110
+ this._writeElementNode(writeContext, designItem);
111
+ if (writeContext.designItemsAssignmentList) {
112
+ writeContext.designItemsAssignmentList.set(designItem, { start: start, length: writeContext.indentedTextWriter.position - start - 1 });
113
+ }
114
+ }
115
+ getContainerType(element) {
116
+ const display = window.getComputedStyle(element).display;
117
+ if (display === 'block' || display === "inline-block" || display == '')
118
+ return ElementContainerType.block;
119
+ return ElementContainerType.complex;
120
+ }
121
+ write(indentedTextWriter, designItems, rootContainerKeepInline, options, designItemsAssignmentList) {
122
+ const context = { indentedTextWriter, options, lastElementDisplayType: null, containerDisplayType: ElementContainerType.block, designItemsAssignmentList };
123
+ this._writeDesignItemList(ElementDisplayType.inline, context, designItems);
124
+ }
125
+ }
@@ -0,0 +1,22 @@
1
+ import { IDesignItem } from '../../item/IDesignItem';
2
+ import { IHtmlWriterService } from './IHtmlWriterService';
3
+ import { IHtmlWriterOptions } from './IHtmlWriterOptions';
4
+ import { IndentedTextWriter } from '../../helper/IndentedTextWriter';
5
+ import { IStringPosition } from './IStringPosition';
6
+ declare enum ElementContainerType {
7
+ block = 0,
8
+ complex = 1
9
+ }
10
+ export declare class FormatingHtmlWriterService implements IHtmlWriterService {
11
+ private writeAttributes;
12
+ private writeStyles;
13
+ private _writeTextNode;
14
+ private _writeCommentNode;
15
+ private _writeElementNode;
16
+ private _writeDesignItemList;
17
+ private _writeNewlineAndIntend;
18
+ private _writeInternal;
19
+ getContainerType(element: HTMLElement): ElementContainerType;
20
+ write(indentedTextWriter: IndentedTextWriter, designItems: IDesignItem[], rootContainerKeepInline: boolean, options: IHtmlWriterOptions, designItemsAssignmentList?: Map<IDesignItem, IStringPosition>): void;
21
+ }
22
+ export {};
@@ -0,0 +1,133 @@
1
+ import { DomConverter } from '../../widgets/designerView/DomConverter';
2
+ import { CssCombiner } from '../../helper/CssCombiner';
3
+ import { NodeType } from '../../item/NodeType';
4
+ import { PropertiesHelper } from '../propertiesService/services/PropertiesHelper';
5
+ import { ElementDisplayType, getElementDisplaytype } from '../../helper/ElementHelper.js';
6
+ var ElementContainerType;
7
+ (function (ElementContainerType) {
8
+ ElementContainerType[ElementContainerType["block"] = 0] = "block";
9
+ ElementContainerType[ElementContainerType["complex"] = 1] = "complex";
10
+ })(ElementContainerType || (ElementContainerType = {}));
11
+ // const defaultDisplayNoneContainerDisplayType: ElementContainerType = ElementContainerType.complex;
12
+ export class FormatingHtmlWriterService {
13
+ writeAttributes(writeContext, designItem) {
14
+ if (designItem.hasAttributes) {
15
+ for (const a of designItem.attributes) {
16
+ writeContext.indentedTextWriter.write(' ');
17
+ if (typeof a[1] === 'string') {
18
+ if (a[1] === "")
19
+ writeContext.indentedTextWriter.write(a[0]);
20
+ else
21
+ writeContext.indentedTextWriter.write(a[0] + '="' + DomConverter.normalizeAttributeValue(a[1]) + '"');
22
+ }
23
+ else if (!a[1])
24
+ writeContext.indentedTextWriter.write(a[0]);
25
+ else {
26
+ }
27
+ }
28
+ }
29
+ }
30
+ writeStyles(writeContext, designItem) {
31
+ if (designItem.hasStyles) {
32
+ writeContext.indentedTextWriter.write(' style="');
33
+ let styles = designItem.styles;
34
+ if (writeContext.options.compressCssToShorthandProperties)
35
+ styles = CssCombiner.combine(styles);
36
+ for (const s of styles) {
37
+ if (s[0]) {
38
+ writeContext.indentedTextWriter.write(PropertiesHelper.camelToDashCase(s[0]) + ':' + DomConverter.normalizeAttributeValue(s[1]) + ';');
39
+ }
40
+ }
41
+ writeContext.indentedTextWriter.write('"');
42
+ }
43
+ }
44
+ _writeTextNode(writeContext, designItem) {
45
+ writeContext.lastElementDisplayType = ElementDisplayType.inline;
46
+ let content = DomConverter.normalizeContentValue(designItem.content).trim();
47
+ if (content) {
48
+ writeContext.indentedTextWriter.write(content);
49
+ }
50
+ }
51
+ _writeCommentNode(writeContext, designItem) {
52
+ writeContext.indentedTextWriter.write('<!--' + designItem.content + '-->');
53
+ }
54
+ _writeElementNode(writeContext, designItem) {
55
+ // const cs = getComputedStyle(designItem.element);
56
+ //cs.whiteSpace === 'pre'
57
+ //isInPre
58
+ //is in inline?
59
+ const currentElementDisplayType = getElementDisplaytype(designItem.element);
60
+ writeContext.lastElementDisplayType = currentElementDisplayType;
61
+ writeContext.indentedTextWriter.write('<' + designItem.name);
62
+ this.writeAttributes(writeContext, designItem);
63
+ this.writeStyles(writeContext, designItem);
64
+ writeContext.indentedTextWriter.write('>');
65
+ let contentSingleTextNode = false;
66
+ if (designItem.hasChildren) {
67
+ const children = designItem.children();
68
+ contentSingleTextNode = designItem.childCount === 1 && designItem.firstChild.nodeType === NodeType.TextNode;
69
+ if (contentSingleTextNode) {
70
+ this._writeInternal(writeContext, designItem.firstChild);
71
+ }
72
+ else {
73
+ let previousContainerDisplayType = writeContext.containerDisplayType;
74
+ writeContext.containerDisplayType = this.getContainerType(designItem.element);
75
+ writeContext.indentedTextWriter.levelRaise();
76
+ this._writeDesignItemList(currentElementDisplayType, writeContext, children);
77
+ writeContext.indentedTextWriter.levelShrink();
78
+ writeContext.containerDisplayType = previousContainerDisplayType;
79
+ }
80
+ }
81
+ else if (designItem.hasContent) {
82
+ writeContext.indentedTextWriter.write(DomConverter.normalizeContentValue(designItem.content));
83
+ }
84
+ if (!DomConverter.IsSelfClosingElement(designItem.name)) {
85
+ if (currentElementDisplayType === ElementDisplayType.block && designItem.hasChildren && !contentSingleTextNode) {
86
+ this._writeNewlineAndIntend(writeContext);
87
+ }
88
+ //write newline & intend ???
89
+ writeContext.indentedTextWriter.write('</' + designItem.name + '>');
90
+ if (currentElementDisplayType !== ElementDisplayType.none) {
91
+ writeContext.lastElementDisplayType = currentElementDisplayType;
92
+ }
93
+ }
94
+ }
95
+ _writeDesignItemList(currentElementDisplayType, writeContext, children) {
96
+ for (const c of children) {
97
+ if (writeContext.lastElementDisplayType == null) {
98
+ //first entry, do nothing
99
+ }
100
+ else if (writeContext.containerDisplayType === ElementContainerType.complex)
101
+ this._writeNewlineAndIntend(writeContext);
102
+ else if (writeContext.lastElementDisplayType !== ElementDisplayType.inline /*|| currentElementDisplayType !== ElementDisplayType.inline*/)
103
+ this._writeNewlineAndIntend(writeContext);
104
+ this._writeInternal(writeContext, c);
105
+ }
106
+ }
107
+ _writeNewlineAndIntend(writeContext) {
108
+ writeContext.indentedTextWriter.writeNewline();
109
+ writeContext.indentedTextWriter.writeIndent();
110
+ }
111
+ _writeInternal(writeContext, designItem) {
112
+ const start = writeContext.indentedTextWriter.position;
113
+ if (designItem.nodeType === NodeType.TextNode)
114
+ this._writeTextNode(writeContext, designItem);
115
+ else if (designItem.nodeType === NodeType.Comment)
116
+ this._writeCommentNode(writeContext, designItem);
117
+ else if (designItem.nodeType === NodeType.Element)
118
+ this._writeElementNode(writeContext, designItem);
119
+ if (writeContext.designItemsAssignmentList) {
120
+ writeContext.designItemsAssignmentList.set(designItem, { start: start, length: writeContext.indentedTextWriter.position - start - 1 });
121
+ }
122
+ }
123
+ getContainerType(element) {
124
+ const display = window.getComputedStyle(element).display;
125
+ if (display === 'block' || display === "inline-block" || display == '')
126
+ return ElementContainerType.block;
127
+ return ElementContainerType.complex;
128
+ }
129
+ write(indentedTextWriter, designItems, rootContainerKeepInline, options, designItemsAssignmentList) {
130
+ const context = { indentedTextWriter, options, lastElementDisplayType: null, containerDisplayType: ElementContainerType.block, designItemsAssignmentList };
131
+ this._writeDesignItemList(ElementDisplayType.inline, context, designItems);
132
+ }
133
+ }
@@ -0,0 +1,22 @@
1
+ import { IDesignItem } from '../../item/IDesignItem';
2
+ import { IHtmlWriterService } from './IHtmlWriterService';
3
+ import { IHtmlWriterOptions } from './IHtmlWriterOptions';
4
+ import { IndentedTextWriter } from '../../helper/IndentedTextWriter';
5
+ import { IStringPosition } from './IStringPosition';
6
+ declare enum ElementContainerType {
7
+ block = 0,
8
+ complex = 1
9
+ }
10
+ export declare class HtmlWriterService implements IHtmlWriterService {
11
+ private writeAttributes;
12
+ private writeStyles;
13
+ private _writeTextNode;
14
+ private _writeCommentNode;
15
+ private _writeElementNode;
16
+ private _writeDesignItemList;
17
+ private _writeNewlineAndIntend;
18
+ private _writeInternal;
19
+ getContainerType(element: HTMLElement): ElementContainerType;
20
+ write(indentedTextWriter: IndentedTextWriter, designItems: IDesignItem[], rootContainerKeepInline: boolean, options: IHtmlWriterOptions, designItemsAssignmentList?: Map<IDesignItem, IStringPosition>): void;
21
+ }
22
+ export {};