UNPKG

13.4 kBJavaScriptView Raw
1import { ConcreteBounds, NewElementBuilder } from '@glimmer/runtime';
2const TEXT_NODE = 3;
3const NEEDS_EXTRA_CLOSE = new WeakMap();
4
5function currentNode(cursor) {
6 let {
7 element,
8 nextSibling
9 } = cursor;
10
11 if (nextSibling === null) {
12 return element.lastChild;
13 } else {
14 return nextSibling.previousSibling;
15 }
16}
17
18class SerializeBuilder extends NewElementBuilder {
19 constructor() {
20 super(...arguments);
21 this.serializeBlockDepth = 0;
22 }
23
24 __openBlock() {
25 let {
26 tagName
27 } = this.element;
28
29 if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {
30 let depth = this.serializeBlockDepth++;
31
32 this.__appendComment(`%+b:${depth}%`);
33 }
34
35 super.__openBlock();
36 }
37
38 __closeBlock() {
39 let {
40 tagName
41 } = this.element;
42
43 super.__closeBlock();
44
45 if (tagName !== 'TITLE' && tagName !== 'SCRIPT' && tagName !== 'STYLE') {
46 let depth = --this.serializeBlockDepth;
47
48 this.__appendComment(`%-b:${depth}%`);
49 }
50 }
51
52 __appendHTML(html) {
53 let {
54 tagName
55 } = this.element;
56
57 if (tagName === 'TITLE' || tagName === 'SCRIPT' || tagName === 'STYLE') {
58 return super.__appendHTML(html);
59 } // Do we need to run the html tokenizer here?
60
61
62 let first = this.__appendComment('%glmr%');
63
64 if (tagName === 'TABLE') {
65 let openIndex = html.indexOf('<');
66
67 if (openIndex > -1) {
68 let tr = html.slice(openIndex + 1, openIndex + 3);
69
70 if (tr === 'tr') {
71 html = `<tbody>${html}</tbody>`;
72 }
73 }
74 }
75
76 if (html === '') {
77 this.__appendComment('% %');
78 } else {
79 super.__appendHTML(html);
80 }
81
82 let last = this.__appendComment('%glmr%');
83
84 return new ConcreteBounds(this.element, first, last);
85 }
86
87 __appendText(string) {
88 let {
89 tagName
90 } = this.element;
91 let current = currentNode(this);
92
93 if (tagName === 'TITLE' || tagName === 'SCRIPT' || tagName === 'STYLE') {
94 return super.__appendText(string);
95 } else if (string === '') {
96 return this.__appendComment('% %');
97 } else if (current && current.nodeType === TEXT_NODE) {
98 this.__appendComment('%|%');
99 }
100
101 return super.__appendText(string);
102 }
103
104 closeElement() {
105 if (NEEDS_EXTRA_CLOSE.has(this.element)) {
106 NEEDS_EXTRA_CLOSE.delete(this.element);
107 super.closeElement();
108 }
109
110 return super.closeElement();
111 }
112
113 openElement(tag) {
114 if (tag === 'tr') {
115 if (this.element.tagName !== 'TBODY' && this.element.tagName !== 'THEAD' && this.element.tagName !== 'TFOOT') {
116 this.openElement('tbody'); // This prevents the closeBlock comment from being re-parented
117 // under the auto inserted tbody. Rehydration builder needs to
118 // account for the insertion since it is injected here and not
119 // really in the template.
120
121 NEEDS_EXTRA_CLOSE.set(this.constructing, true);
122 this.flushElement(null);
123 }
124 }
125
126 return super.openElement(tag);
127 }
128
129 pushRemoteElement(element, cursorId, insertBefore = null) {
130 let {
131 dom
132 } = this;
133 let script = dom.createElement('script');
134 script.setAttribute('glmr', cursorId);
135 dom.insertBefore(element, script, insertBefore);
136 return super.pushRemoteElement(element, cursorId, insertBefore);
137 }
138
139}
140
141export function serializeBuilder(env, cursor) {
142 return SerializeBuilder.forInitialRender(env, cursor);
143}
144//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BhY2thZ2VzL0BnbGltbWVyL25vZGUvbGliL3NlcmlhbGl6ZS1idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLFNBQVMsY0FBVCxFQUF5QixpQkFBekIsUUFBa0Qsa0JBQWxEO0FBSUEsTUFBTSxTQUFTLEdBQUcsQ0FBbEI7QUFFQSxNQUFNLGlCQUFpQixHQUFHLElBQUksT0FBSixFQUExQjs7QUFFQSxTQUFTLFdBQVQsQ0FDRSxNQURGLEVBQzhFO0FBRTVFLE1BQUk7QUFBRSxJQUFBLE9BQUY7QUFBVyxJQUFBO0FBQVgsTUFBMkIsTUFBL0I7O0FBRUEsTUFBSSxXQUFXLEtBQUssSUFBcEIsRUFBMEI7QUFDeEIsV0FBTyxPQUFPLENBQUMsU0FBZjtBQUNELEdBRkQsTUFFTztBQUNMLFdBQU8sV0FBVyxDQUFDLGVBQW5CO0FBQ0Q7QUFDRjs7QUFFRCxNQUFNLGdCQUFOLFNBQStCLGlCQUEvQixDQUFnRDtBQUFoRCxFQUFBLFdBQUEsR0FBQTs7QUFDVSxTQUFBLG1CQUFBLEdBQXNCLENBQXRCO0FBMkdUOztBQXpHQyxFQUFBLFdBQVcsR0FBQTtBQUNULFFBQUk7QUFBRSxNQUFBO0FBQUYsUUFBYyxLQUFLLE9BQXZCOztBQUVBLFFBQUksT0FBTyxLQUFLLE9BQVosSUFBdUIsT0FBTyxLQUFLLFFBQW5DLElBQStDLE9BQU8sS0FBSyxPQUEvRCxFQUF3RTtBQUN0RSxVQUFJLEtBQUssR0FBRyxLQUFLLG1CQUFMLEVBQVo7O0FBQ0EsV0FBSyxlQUFMLENBQXFCLE9BQU8sS0FBSyxHQUFqQztBQUNEOztBQUVELFVBQU0sV0FBTjtBQUNEOztBQUVELEVBQUEsWUFBWSxHQUFBO0FBQ1YsUUFBSTtBQUFFLE1BQUE7QUFBRixRQUFjLEtBQUssT0FBdkI7O0FBRUEsVUFBTSxZQUFOOztBQUVBLFFBQUksT0FBTyxLQUFLLE9BQVosSUFBdUIsT0FBTyxLQUFLLFFBQW5DLElBQStDLE9BQU8sS0FBSyxPQUEvRCxFQUF3RTtBQUN0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Q0Y7O0FBRUQsV0FBTyxNQUFNLFdBQU4sQ0FBa0IsR0FBbEIsQ0FBUDtBQUNEOztBQUVELEVBQUEsaUJBQWlCLENBQ2YsT0FEZSxFQUVmLFFBRmUsRUFHZixZQUFBLEdBQWtDLElBSG5CLEVBR3VCO0FBRXRDLFFBQUk7QUFBRSxNQUFBO0FBQUYsUUFBVSxJQUFkO0FBQ0EsUUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLGFBQUosQ0FBa0IsUUFBbEIsQ0FBYjtBQUNBLElBQUEsTUFBTSxDQUFDLFlBQVAsQ0FBb0IsTUFBcEIsRUFBNEIsUUFBNUI7QUFDQSxJQUFBLEdBQUcsQ0FBQyxZQUFKLENBQWlCLE9BQWpCLEVBQTBCLE1BQTFCLEVBQWtDLFlBQWxDO0FBQ0EsV0FBTyxNQUFNLGlCQUFOLENBQXdCLE9BQXhCLEVBQWlDLFFBQWpDLEVBQTJDLFlBQTNDLENBQVA7QUFDRDs7QUEzRzZDOztBQThHaEQsT0FBTSxTQUFVLGdCQUFWLENBQ0osR0FESSxFQUVKLE1BRkksRUFFK0Q7QUFFbkUsU0FBTyxnQkFBZ0IsQ0FBQyxnQkFBakIsQ0FBa0MsR0FBbEMsRUFBdUMsTUFBdkMsQ0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUge1xuICBCb3VuZHMsXG4gIEVudmlyb25tZW50LFxuICBPcHRpb24sXG4gIEVsZW1lbnRCdWlsZGVyLFxuICBNYXliZSxcbiAgTW9kaWZpZXJJbnN0YW5jZSxcbn0gZnJvbSAnQGdsaW1tZXIvaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb25jcmV0ZUJvdW5kcywgTmV3RWxlbWVudEJ1aWxkZXIgfSBmcm9tICdAZ2xpbW1lci9ydW50aW1lJztcbmltcG9ydCB7IFJlbW90ZUxpdmVCbG9jayB9IGZyb20gJ0BnbGltbWVyL3J1bnRpbWUnO1xuaW1wb3J0IHR5cGUgeyBTaW1wbGVFbGVtZW50LCBTaW1wbGVOb2RlLCBTaW1wbGVUZXh0IH0gZnJvbSAnQHNpbXBsZS1kb20vaW50ZXJmYWNlJztcblxuY29uc3QgVEVYVF9OT0RFID0gMztcblxuY29uc3QgTkVFRFNfRVhUUkFfQ0xPU0UgPSBuZXcgV2Vha01hcDxTaW1wbGVOb2RlPigpO1xuXG5mdW5jdGlvbiBjdXJyZW50Tm9kZShcbiAgY3Vyc29yOiBFbGVtZW50QnVpbGRlciB8IHsgZWxlbWVudDogU2ltcGxlRWxlbWVudDsgbmV4dFNpYmxpbmc6IFNpbXBsZU5vZGUgfVxuKTogT3B0aW9uPFNpbXBsZU5vZGU+IHtcbiAgbGV0IHsgZWxlbWVudCwgbmV4dFNpYmxpbmcgfSA9IGN1cnNvcjtcblxuICBpZiAobmV4dFNpYmxpbmcgPT09IG51bGwpIHtcbiAgICByZXR1cm4gZWxlbWVudC5sYXN0Q2hpbGQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5leHRTaWJsaW5nLnByZXZpb3VzU2libGluZztcbiAgfVxufVxuXG5jbGFzcyBTZXJpYWxpemVCdWlsZGVyIGV4dGVuZHMgTmV3RWxlbWVudEJ1aWxkZXIgaW1wbGVtZW50cyBFbGVtZW50QnVpbGRlciB7XG4gIHByaXZhdGUgc2VyaWFsaXplQmxvY2tEZXB0aCA9IDA7XG5cbiAgX19vcGVuQmxvY2soKTogdm9pZCB7XG4gICAgbGV0IHsgdGFnTmFtZSB9ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgaWYgKHRhZ05hbWUgIT09ICdUSVRMRScgJiYgdGFnTmFtZSAhPT0gJ1NDUklQVCcgJiYgdGFnTmFtZSAhPT0gJ1NUWUxFJykge1xuICAgICAgbGV0IGRlcHRoID0gdGhpcy5zZXJpYWxpemVCbG9ja0RlcHRoKys7XG4gICAgICB0aGlzLl9fYXBwZW5kQ29tbWVudChgJStiOiR7ZGVwdGh9JWApO1xuICAgIH1cblxuICAgIHN1cGVyLl9fb3BlbkJsb2NrKCk7XG4gIH1cblxuICBfX2Nsb3NlQmxvY2soKTogdm9pZCB7XG4gICAgbGV0IHsgdGFnTmFtZSB9ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgc3VwZXIuX19jbG9zZUJsb2NrKCk7XG5cbiAgICBpZiAodGFnTmFtZSAhPT0gJ1RJVExFJyAmJiB0YWdOYW1lICE9PSAnU0NSSVBUJyAmJiB0YWdOYW1lICE9PSAnU1RZTEUnKSB7XG4gICAgICBsZXQgZGVwdGggPSAtLXRoaXMuc2VyaWFsaXplQmxvY2tEZXB0aDtcbiAgICAgIHRoaXMuX19hcHBlbmRDb21tZW50KGAlLWI6JHtkZXB0aH0lYCk7XG4gICAgfVxuICB9XG5cbiAgX19hcHBlbmRIVE1MKGh0bWw6IHN0cmluZyk6IEJvdW5kcyB7XG4gICAgbGV0IHsgdGFnTmFtZSB9ID0gdGhpcy5lbGVtZW50O1xuXG4gICAgaWYgKHRhZ05hbWUgPT09ICdUSVRMRScgfHwgdGFnTmFtZSA9PT0gJ1NDUklQVCcgfHwgdGFnTmFtZSA9PT0gJ1NUWUxFJykge1xuICAgICAgcmV0dXJuIHN1cGVyLl9fYXBwZW5kSFRNTChodG1sKTtcbiAgICB9XG5cbiAgICAvLyBEbyB3ZSBuZWVkIHRvIHJ1biB0aGUgaHRtbCB0b2tlbml6ZXIgaGVyZT9cbiAgICBsZXQgZmlyc3QgPSB0aGlzLl9fYXBwZW5kQ29tbWVudCgnJWdsbXIlJyk7XG4gICAgaWYgKHRhZ05hbWUgPT09ICdUQUJMRScpIHtcbiAgICAgIGxldCBvcGVuSW5kZXggPSBodG1sLmluZGV4T2YoJzwnKTtcbiAgICAgIGlmIChvcGVuSW5kZXggPiAtMSkge1xuICAgICAgICBsZXQgdHIgPSBodG1sLnNsaWNlKG9wZW5JbmRleCArIDEsIG9wZW5JbmRleCArIDMpO1xuICAgICAgICBpZiAodHIgPT09ICd0cicpIHtcbiAgICAgICAgICBodG1sID0gYDx0Ym9keT4ke2h0bWx9PC90Ym9keT5gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG1sID09PSAnJykge1xuICAgICAgdGhpcy5fX2FwcGVuZENvbW1lbnQoJyUgJScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdXBlci5fX2FwcGVuZEhUTUwoaHRtbCk7XG4gICAgfVxuXG4gICAgbGV0IGxhc3QgPSB0aGlzLl9fYXBwZW5kQ29tbWVudCgnJWdsbXIlJyk7XG4gICAgcmV0dXJuIG5ldyBDb25jcmV0ZUJvdW5kcyh0aGlzLmVsZW1lbnQsIGZpcnN0LCBsYXN0KTtcbiAgfVxuXG4gIF9fYXBwZW5kVGV4dChzdHJpbmc6IHN0cmluZyk6IFNpbXBsZVRleHQge1xuICAgIGxldCB7IHRhZ05hbWUgfSA9IHRoaXMuZWxlbWVudDtcbiAgICBsZXQgY3VycmVudCA9IGN1cnJlbnROb2RlKHRoaXMpO1xuXG4gICAgaWYgKHRhZ05hbWUgPT09ICdUSVRMRScgfHwgdGFnTmFtZSA9PT0gJ1NDUklQVCcgfHwgdGFnTmFtZSA9PT0gJ1NUWUxFJykge1xuICAgICAgcmV0dXJuIHN1cGVyLl9fYXBwZW5kVGV4dChzdHJpbmcpO1xuICAgIH0gZWxzZSBpZiAoc3RyaW5nID09PSAnJykge1xuICAgICAgcmV0dXJuICh0aGlzLl9fYXBwZW5kQ29tbWVudCgnJSAlJykgYXMgYW55KSBhcyBTaW1wbGVUZXh0O1xuICAgIH0gZWxzZSBpZiAoY3VycmVudCAmJiBjdXJyZW50Lm5vZGVUeXBlID09PSBURVhUX05PREUpIHtcbiAgICAgIHRoaXMuX19hcHBlbmRDb21tZW50KCclfCUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuX19hcHBlbmRUZXh0KHN0cmluZyk7XG4gIH1cblxuICBjbG9zZUVsZW1lbnQoKTogT3B0aW9uPE1vZGlmaWVySW5zdGFuY2VbXT4ge1xuICAgIGlmIChORUVEU19FWFRSQV9DTE9TRS5oYXModGhpcy5lbGVtZW50KSkge1xuICAgICAgTkVFRFNfRVhUUkFfQ0xPU0UuZGVsZXRlKHRoaXMuZWxlbWVudCk7XG4gICAgICBzdXBlci5jbG9zZUVsZW1lbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3VwZXIuY2xvc2VFbGVtZW50KCk7XG4gIH1cblxuICBvcGVuRWxlbWVudCh0YWc6IHN0cmluZykge1xuICAgIGlmICh0YWcgPT09ICd0cicpIHtcbiAgICAgIGlmIChcbiAgICAgICAgdGhpcy5lbGVtZW50LnRhZ05hbWUgIT09ICdUQk9EWScgJiZcbiAgICAgICAgdGhpcy5lbGVtZW50LnRhZ05hbWUgIT09ICdUSEVBRCcgJiZcbiAgICAgICAgdGhpcy5lbGVtZW50LnRhZ05hbWUgIT09ICdURk9PVCdcbiAgICAgICkge1xuICAgICAgICB0aGlzLm9wZW5FbGVtZW50KCd0Ym9keScpO1xuICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHRoZSBjbG9zZUJsb2NrIGNvbW1lbnQgZnJvbSBiZWluZyByZS1wYXJlbnRlZFxuICAgICAgICAvLyB1bmRlciB0aGUgYXV0byBpbnNlcnRlZCB0Ym9keS4gUmVoeWRyYXRpb24gYnVpbGRlciBuZWVkcyB0b1xuICAgICAgICAvLyBhY2NvdW50IGZvciB0aGUgaW5zZXJ0aW9uIHNpbmNlIGl0IGlzIGluamVjdGVkIGhlcmUgYW5kIG5vdFxuICAgICAgICAvLyByZWFsbHkgaW4gdGhlIHRlbXBsYXRlLlxuICAgICAgICBORUVEU19FWFRSQV9DTE9TRS5zZXQodGhpcy5jb25zdHJ1Y3RpbmchLCB0cnVlKTtcbiAgICAgICAgdGhpcy5mbHVzaEVsZW1lbnQobnVsbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLm9wZW5FbGVtZW50KHRhZyk7XG4gIH1cblxuICBwdXNoUmVtb3RlRWxlbWVudChcbiAgICBlbGVtZW50OiBTaW1wbGVFbGVtZW50LFxuICAgIGN1cnNvcklkOiBzdHJpbmcsXG4gICAgaW5zZXJ0QmVmb3JlOiBNYXliZTxTaW1wbGVOb2RlPiA9IG51bGxcbiAgKTogT3B0aW9uPFJlbW90ZUxpdmVCbG9jaz4ge1xuICAgIGxldCB7IGRvbSB9ID0gdGhpcztcbiAgICBsZXQgc2NyaXB0ID0gZG9tLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpO1xuICAgIHNjcmlwdC5zZXRBdHRyaWJ1dGUoJ2dsbXInLCBjdXJzb3JJZCk7XG4gICAgZG9tLmluc2VydEJlZm9yZShlbGVtZW50LCBzY3JpcHQsIGluc2VydEJlZm9yZSk7XG4gICAgcmV0dXJuIHN1cGVyLnB1c2hSZW1vdGVFbGVtZW50KGVsZW1lbnQsIGN1cnNvcklkLCBpbnNlcnRCZWZvcmUpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVCdWlsZGVyKFxuICBlbnY6IEVudmlyb25tZW50LFxuICBjdXJzb3I6IHsgZWxlbWVudDogU2ltcGxlRWxlbWVudDsgbmV4dFNpYmxpbmc6IE9wdGlvbjxTaW1wbGVOb2RlPiB9XG4pOiBFbGVtZW50QnVpbGRlciB7XG4gIHJldHVybiBTZXJpYWxpemVCdWlsZGVyLmZvckluaXRpYWxSZW5kZXIoZW52LCBjdXJzb3IpO1xufVxuIl0sInNvdXJjZVJvb3QiOiIifQ==
\No newline at end of file