test(HtmlAst): add a serializer
This commit is contained in:
parent
28e8b2faab
commit
f7258ea52a
|
@ -0,0 +1,81 @@
|
|||
import {HtmlAst, HtmlAstVisitor, HtmlAttrAst, HtmlCommentAst, HtmlElementAst, HtmlExpansionAst, HtmlExpansionCaseAst, HtmlTextAst, htmlVisitAll} from '@angular/compiler/src/html_ast';
|
||||
import {HtmlParser} from '@angular/compiler/src/html_parser';
|
||||
import {beforeEach, ddescribe, describe, expect, it} from '@angular/core/testing/testing_internal';
|
||||
|
||||
export function main() {
|
||||
ddescribe('HtmlAst serilaizer', () => {
|
||||
var parser: HtmlParser;
|
||||
|
||||
beforeEach(() => { parser = new HtmlParser(); });
|
||||
|
||||
it('should support element', () => {
|
||||
const html = '<p></p>';
|
||||
const ast = parser.parse(html, 'url');
|
||||
expect(serializeHtmlAst(ast.rootNodes)).toEqual([html]);
|
||||
});
|
||||
|
||||
it('should support attributes', () => {
|
||||
const html = '<p k="value"></p>';
|
||||
const ast = parser.parse(html, 'url');
|
||||
expect(serializeHtmlAst(ast.rootNodes)).toEqual([html]);
|
||||
});
|
||||
|
||||
it('should support text', () => {
|
||||
const html = 'some text';
|
||||
const ast = parser.parse(html, 'url');
|
||||
expect(serializeHtmlAst(ast.rootNodes)).toEqual([html]);
|
||||
});
|
||||
|
||||
it('should support expansion', () => {
|
||||
const html = '{number, plural, =0 {none} =1 {one} other {many}}';
|
||||
const ast = parser.parse(html, 'url', true);
|
||||
expect(serializeHtmlAst(ast.rootNodes)).toEqual([html]);
|
||||
});
|
||||
|
||||
it('should support comment', () => {
|
||||
const html = '<!--comment-->';
|
||||
const ast = parser.parse(html, 'url', true);
|
||||
expect(serializeHtmlAst(ast.rootNodes)).toEqual([html]);
|
||||
});
|
||||
|
||||
it('should support nesting', () => {
|
||||
const html = `<div i18n="meaning|desc">
|
||||
<span>{{ interpolation }}</span>
|
||||
<!--comment-->
|
||||
<p expansion="true">
|
||||
{number, plural, =0 {{sex, gender, other {<b>?</b>}}}}
|
||||
</p>
|
||||
</div>`;
|
||||
const ast = parser.parse(html, 'url', true);
|
||||
expect(serializeHtmlAst(ast.rootNodes)).toEqual([html]);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
class _SerializerVisitor implements HtmlAstVisitor {
|
||||
visitElement(ast: HtmlElementAst, context: any): any {
|
||||
return `<${ast.name}${this._visitAll(ast.attrs)}>${this._visitAll(ast.children)}</${ast.name}>`;
|
||||
}
|
||||
|
||||
visitAttr(ast: HtmlAttrAst, context: any): any { return ` ${ast.name}="${ast.value}"`; }
|
||||
|
||||
visitText(ast: HtmlTextAst, context: any): any { return ast.value; }
|
||||
|
||||
visitComment(ast: HtmlCommentAst, context: any): any { return `<!--${ast.value}-->`; }
|
||||
|
||||
visitExpansion(ast: HtmlExpansionAst, context: any): any {
|
||||
return `{${ast.switchValue}, ${ast.type},${this._visitAll(ast.cases)}}`;
|
||||
}
|
||||
|
||||
visitExpansionCase(ast: HtmlExpansionCaseAst, context: any): any {
|
||||
return ` ${ast.value} {${this._visitAll(ast.expression)}}`;
|
||||
}
|
||||
|
||||
private _visitAll(ast: HtmlAst[]) { return ast.map(a => a.visit(this, null)).join(''); }
|
||||
}
|
||||
|
||||
const serializerVisitor = new _SerializerVisitor();
|
||||
|
||||
export function serializeHtmlAst(ast: HtmlAst[]) {
|
||||
return ast.map(a => a.visit(serializerVisitor, null));
|
||||
}
|
Loading…
Reference in New Issue