@node-projects/web-component-designer 0.0.78 → 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.
- package/dist/elements/helper/ElementHelper.d.ts +6 -0
- package/dist/elements/helper/ElementHelper.js +10 -0
- package/dist/elements/services/DefaultServiceBootstrap.js +1 -1
- package/dist/elements/services/ServiceContainer.d.ts +1 -1
- package/dist/elements/services/ServiceContainer.js +2 -2
- package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService copy.d.ts +22 -0
- package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService copy.js +125 -0
- package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.d.ts +22 -0
- package/dist/elements/services/htmlWriterService/FormatingHtmlWriterService.js +133 -0
- package/dist/elements/services/htmlWriterService/HtmlWriterService copy.d.ts +15 -5
- package/dist/elements/services/htmlWriterService/HtmlWriterService copy.js +101 -86
- package/dist/elements/services/htmlWriterService/HtmlWriterService.d.ts +2 -2
- package/dist/elements/services/htmlWriterService/HtmlWriterService.js +7 -9
- package/dist/elements/services/htmlWriterService/IHtmlWriterService.d.ts +5 -6
- package/dist/elements/services/htmlWriterService/LitElementWriterService.d.ts +3 -1
- package/dist/elements/services/htmlWriterService/LitElementWriterService.js +17 -1
- package/dist/elements/services/htmlWriterService/LitTsElementWriterService.d.ts +9 -0
- package/dist/elements/services/htmlWriterService/LitTsElementWriterService.js +43 -0
- package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService copy.d.ts +22 -0
- package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService copy.js +125 -0
- package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService.d.ts +27 -0
- package/dist/elements/services/htmlWriterService/SimpleHtmlWriterService.js +93 -0
- package/dist/elements/services/initializationService/DefaultIntializationService.d.ts +6 -0
- package/dist/elements/services/initializationService/DefaultIntializationService.js +22 -0
- package/dist/elements/services/initializationService/IIntializationService copy.d.ts +4 -0
- package/dist/elements/services/initializationService/IIntializationService copy.js +1 -0
- package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.d.ts +3 -1
- package/dist/elements/services/manifestParsers/WebcomponentManifestParserService.js +39 -27
- package/dist/elements/widgets/designerView/DomConverter.js +1 -7
- package/dist/elements/widgets/designerView/overlayLayerView.js +1 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/package.json +4 -4
|
@@ -1,3 +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;
|
|
3
9
|
export declare function isEmptyTextNode(node: Node): boolean;
|
|
@@ -4,9 +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
|
+
}
|
|
10
20
|
export function isEmptyTextNode(node) {
|
|
11
21
|
return node.textContent.trim() == '' && node.textContent.indexOf('\xa0' /* */) < 0;
|
|
12
22
|
}
|
|
@@ -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
|
|
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
|
|
44
|
-
return this.
|
|
43
|
+
get htmlWriterService() {
|
|
44
|
+
return this.getLastService('htmlWriterService');
|
|
45
45
|
}
|
|
46
46
|
get htmlParserService() {
|
|
47
47
|
return this.getLastService('htmlParserService');
|
|
@@ -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
|
+
}
|
|
@@ -3,10 +3,20 @@ import { IHtmlWriterService } from './IHtmlWriterService';
|
|
|
3
3
|
import { IHtmlWriterOptions } from './IHtmlWriterOptions';
|
|
4
4
|
import { IndentedTextWriter } from '../../helper/IndentedTextWriter';
|
|
5
5
|
import { IStringPosition } from './IStringPosition';
|
|
6
|
+
declare enum ElementContainerType {
|
|
7
|
+
block = 0,
|
|
8
|
+
complex = 1
|
|
9
|
+
}
|
|
6
10
|
export declare class HtmlWriterService implements IHtmlWriterService {
|
|
7
|
-
|
|
8
|
-
private
|
|
9
|
-
private
|
|
10
|
-
|
|
11
|
-
private
|
|
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;
|
|
12
21
|
}
|
|
22
|
+
export {};
|
|
@@ -2,102 +2,117 @@ import { DomConverter } from '../../widgets/designerView/DomConverter';
|
|
|
2
2
|
import { CssCombiner } from '../../helper/CssCombiner';
|
|
3
3
|
import { NodeType } from '../../item/NodeType';
|
|
4
4
|
import { PropertiesHelper } from '../propertiesService/services/PropertiesHelper';
|
|
5
|
-
import {
|
|
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 = {}));
|
|
6
11
|
export class HtmlWriterService {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
if ((designItem.element instanceof HTMLElement && !isInline(designItem.element)) ||
|
|
17
|
-
(designItem.element.nextElementSibling instanceof HTMLElement && !isInline(designItem.element.nextElementSibling)))
|
|
18
|
-
indentedTextWriter.writeNewline();
|
|
19
|
-
}
|
|
20
|
-
write(indentedTextWriter, designItem, options, designItemsAssignmentList) {
|
|
21
|
-
let start = indentedTextWriter.position;
|
|
22
|
-
if (designItem.nodeType == NodeType.TextNode) {
|
|
23
|
-
this.writeTextNode(indentedTextWriter, designItem, true);
|
|
24
|
-
}
|
|
25
|
-
else if (designItem.nodeType == NodeType.Comment) {
|
|
26
|
-
this._conditionalyWriteIndent(indentedTextWriter, designItem);
|
|
27
|
-
indentedTextWriter.write('<!--' + designItem.content + '-->');
|
|
28
|
-
this._conditionalyWriteNewline(indentedTextWriter, designItem);
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
this._conditionalyWriteIndent(indentedTextWriter, designItem);
|
|
32
|
-
indentedTextWriter.write('<' + designItem.name);
|
|
33
|
-
if (designItem.hasAttributes) {
|
|
34
|
-
for (const a of designItem.attributes) {
|
|
35
|
-
indentedTextWriter.write(' ');
|
|
36
|
-
if (typeof a[1] === 'string') {
|
|
37
|
-
if (a[1] === "")
|
|
38
|
-
indentedTextWriter.write(a[0]);
|
|
39
|
-
else
|
|
40
|
-
indentedTextWriter.write(a[0] + '="' + DomConverter.normalizeAttributeValue(a[1]) + '"');
|
|
41
|
-
}
|
|
42
|
-
else if (!a[1])
|
|
43
|
-
indentedTextWriter.write(a[0]);
|
|
44
|
-
else {
|
|
45
|
-
//TODO: writing of bindings
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
if (designItem.hasStyles) {
|
|
50
|
-
indentedTextWriter.write(' style="');
|
|
51
|
-
let styles = designItem.styles;
|
|
52
|
-
if (options.compressCssToShorthandProperties)
|
|
53
|
-
styles = CssCombiner.combine(styles);
|
|
54
|
-
for (const s of styles) {
|
|
55
|
-
if (s[0]) {
|
|
56
|
-
indentedTextWriter.write(PropertiesHelper.camelToDashCase(s[0]) + ':' + DomConverter.normalizeAttributeValue(s[1]) + ';');
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
indentedTextWriter.write('"');
|
|
60
|
-
}
|
|
61
|
-
indentedTextWriter.write('>');
|
|
62
|
-
if (designItem.hasChildren) {
|
|
63
|
-
const children = designItem.children();
|
|
64
|
-
const singleTextNode = designItem.childCount === 1 && designItem.firstChild.nodeType === NodeType.TextNode;
|
|
65
|
-
if (singleTextNode) {
|
|
66
|
-
this.writeTextNode(indentedTextWriter, designItem, false);
|
|
12
|
+
writeAttributes(writeContext, designItem) {
|
|
13
|
+
if (designItem.hasAttributes) {
|
|
14
|
+
for (const a of designItem.attributes) {
|
|
15
|
+
writeContext.indentedTextWriter.write(' ');
|
|
16
|
+
if (typeof a[1] === 'string') {
|
|
17
|
+
if (a[1] === "")
|
|
18
|
+
writeContext.indentedTextWriter.write(a[0]);
|
|
19
|
+
else
|
|
20
|
+
writeContext.indentedTextWriter.write(a[0] + '="' + DomConverter.normalizeAttributeValue(a[1]) + '"');
|
|
67
21
|
}
|
|
22
|
+
else if (!a[1])
|
|
23
|
+
writeContext.indentedTextWriter.write(a[0]);
|
|
68
24
|
else {
|
|
69
|
-
indentedTextWriter.writeNewline();
|
|
70
|
-
indentedTextWriter.levelRaise();
|
|
71
|
-
for (const c of children) {
|
|
72
|
-
c.serviceContainer.forSomeServicesTillResult('htmlWriterService', (s) => {
|
|
73
|
-
if (s.canWrite(c)) {
|
|
74
|
-
s.write(indentedTextWriter, c, options, designItemsAssignmentList);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
indentedTextWriter.levelShrink();
|
|
79
|
-
indentedTextWriter.writeIndent();
|
|
80
25
|
}
|
|
81
26
|
}
|
|
82
|
-
else if (designItem.hasContent) {
|
|
83
|
-
indentedTextWriter.write(DomConverter.normalizeContentValue(designItem.content));
|
|
84
|
-
}
|
|
85
|
-
if (!DomConverter.IsSelfClosingElement(designItem.name))
|
|
86
|
-
indentedTextWriter.write('</' + designItem.name + '>');
|
|
87
|
-
this._conditionalyWriteNewline(indentedTextWriter, designItem);
|
|
88
27
|
}
|
|
89
|
-
|
|
90
|
-
|
|
28
|
+
}
|
|
29
|
+
writeStyles(writeContext, designItem) {
|
|
30
|
+
if (designItem.hasStyles) {
|
|
31
|
+
writeContext.indentedTextWriter.write(' style="');
|
|
32
|
+
let styles = designItem.styles;
|
|
33
|
+
if (writeContext.options.compressCssToShorthandProperties)
|
|
34
|
+
styles = CssCombiner.combine(styles);
|
|
35
|
+
for (const s of styles) {
|
|
36
|
+
if (s[0]) {
|
|
37
|
+
writeContext.indentedTextWriter.write(PropertiesHelper.camelToDashCase(s[0]) + ':' + DomConverter.normalizeAttributeValue(s[1]) + ';');
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
writeContext.indentedTextWriter.write('"');
|
|
91
41
|
}
|
|
92
42
|
}
|
|
93
|
-
|
|
43
|
+
_writeTextNode(writeContext, designItem) {
|
|
44
|
+
writeContext.lastElementDisplayType = ElementDisplayType.inline;
|
|
94
45
|
let content = DomConverter.normalizeContentValue(designItem.content).trim();
|
|
95
46
|
if (content) {
|
|
96
|
-
|
|
97
|
-
this._conditionalyWriteIndent(indentedTextWriter, designItem);
|
|
98
|
-
indentedTextWriter.write(content);
|
|
99
|
-
if (indentAndNewline)
|
|
100
|
-
this._conditionalyWriteNewline(indentedTextWriter, designItem);
|
|
47
|
+
writeContext.indentedTextWriter.write(content);
|
|
101
48
|
}
|
|
102
49
|
}
|
|
50
|
+
_writeCommentNode(writeContext, designItem) {
|
|
51
|
+
writeContext.indentedTextWriter.write('<!--' + designItem.content + '-->');
|
|
52
|
+
}
|
|
53
|
+
_writeElementNode(writeContext, designItem) {
|
|
54
|
+
const currentElementDisplayType = getElementDisplaytype(designItem.element);
|
|
55
|
+
writeContext.lastElementDisplayType = currentElementDisplayType;
|
|
56
|
+
writeContext.indentedTextWriter.write('<' + designItem.name);
|
|
57
|
+
this.writeAttributes(writeContext, designItem);
|
|
58
|
+
this.writeStyles(writeContext, designItem);
|
|
59
|
+
writeContext.indentedTextWriter.write('>');
|
|
60
|
+
if (designItem.hasChildren) {
|
|
61
|
+
const children = designItem.children();
|
|
62
|
+
const contentSingleTextNode = designItem.childCount === 1 && designItem.firstChild.nodeType === NodeType.TextNode;
|
|
63
|
+
if (contentSingleTextNode) {
|
|
64
|
+
this._writeInternal(writeContext, designItem.firstChild);
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
let previousContainerDisplayType = writeContext.containerDisplayType;
|
|
68
|
+
writeContext.containerDisplayType = this.getContainerType(designItem.element);
|
|
69
|
+
writeContext.indentedTextWriter.levelRaise();
|
|
70
|
+
this._writeDesignItemList(currentElementDisplayType, writeContext, children);
|
|
71
|
+
writeContext.indentedTextWriter.levelShrink();
|
|
72
|
+
writeContext.containerDisplayType = previousContainerDisplayType;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
else if (designItem.hasContent) {
|
|
76
|
+
writeContext.indentedTextWriter.write(DomConverter.normalizeContentValue(designItem.content));
|
|
77
|
+
}
|
|
78
|
+
if (!DomConverter.IsSelfClosingElement(designItem.name))
|
|
79
|
+
writeContext.indentedTextWriter.write('</' + designItem.name + '>');
|
|
80
|
+
//if (writeContext.writerState === WriterState.block)
|
|
81
|
+
//this._writeNewlineAndIntend(writeContext);
|
|
82
|
+
}
|
|
83
|
+
_writeDesignItemList(currentElementDisplayType, writeContext, children) {
|
|
84
|
+
for (const c of children) {
|
|
85
|
+
if (writeContext.containerDisplayType === ElementContainerType.complex)
|
|
86
|
+
this._writeNewlineAndIntend(writeContext);
|
|
87
|
+
else if (writeContext.lastElementDisplayType !== ElementDisplayType.inline || currentElementDisplayType !== ElementDisplayType.inline)
|
|
88
|
+
this._writeNewlineAndIntend(writeContext);
|
|
89
|
+
this._writeInternal(writeContext, c);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
_writeNewlineAndIntend(writeContext) {
|
|
93
|
+
writeContext.indentedTextWriter.writeNewline();
|
|
94
|
+
writeContext.indentedTextWriter.writeIndent();
|
|
95
|
+
}
|
|
96
|
+
_writeInternal(writeContext, designItem) {
|
|
97
|
+
const start = writeContext.indentedTextWriter.position;
|
|
98
|
+
if (designItem.nodeType === NodeType.TextNode)
|
|
99
|
+
this._writeTextNode(writeContext, designItem);
|
|
100
|
+
else if (designItem.nodeType === NodeType.Comment)
|
|
101
|
+
this._writeCommentNode(writeContext, designItem);
|
|
102
|
+
else if (designItem.nodeType === NodeType.Element)
|
|
103
|
+
this._writeElementNode(writeContext, designItem);
|
|
104
|
+
if (writeContext.designItemsAssignmentList) {
|
|
105
|
+
writeContext.designItemsAssignmentList.set(designItem, { start: start, length: writeContext.indentedTextWriter.position - start - 1 });
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
getContainerType(element) {
|
|
109
|
+
const display = window.getComputedStyle(element).display;
|
|
110
|
+
if (display === 'block' || display === "inline-block" || display == '')
|
|
111
|
+
return ElementContainerType.block;
|
|
112
|
+
return ElementContainerType.complex;
|
|
113
|
+
}
|
|
114
|
+
write(indentedTextWriter, designItems, rootContainerKeepInline, options, designItemsAssignmentList) {
|
|
115
|
+
const context = { indentedTextWriter, options, lastElementDisplayType: ElementDisplayType.none, containerDisplayType: ElementContainerType.block, designItemsAssignmentList };
|
|
116
|
+
this._writeDesignItemList(ElementDisplayType.inline, context, designItems);
|
|
117
|
+
}
|
|
103
118
|
}
|
|
@@ -4,9 +4,9 @@ import { IHtmlWriterOptions } from './IHtmlWriterOptions';
|
|
|
4
4
|
import { IndentedTextWriter } from '../../helper/IndentedTextWriter';
|
|
5
5
|
import { IStringPosition } from './IStringPosition';
|
|
6
6
|
export declare class HtmlWriterService implements IHtmlWriterService {
|
|
7
|
-
canWrite(designItem: IDesignItem): boolean;
|
|
8
7
|
private _conditionalyWriteIndent;
|
|
9
8
|
private _conditionalyWriteNewline;
|
|
10
|
-
write(indentedTextWriter: IndentedTextWriter,
|
|
9
|
+
write(indentedTextWriter: IndentedTextWriter, designItems: IDesignItem[], rootContainerKeepInline: boolean, options: IHtmlWriterOptions, designItemsAssignmentList?: Map<IDesignItem, IStringPosition>): void;
|
|
10
|
+
private internalWrite;
|
|
11
11
|
private writeTextNode;
|
|
12
12
|
}
|