122 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
		
		
			
		
	
	
			122 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| 
								 | 
							
								import {ddescribe, describe, it, iit, xit, expect, beforeEach, afterEach} from 'angular2/test_lib';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {HtmlParser} from 'angular2/src/compiler/html_parser';
							 | 
						||
| 
								 | 
							
								import {
							 | 
						||
| 
								 | 
							
								  HtmlAst,
							 | 
						||
| 
								 | 
							
								  HtmlAstVisitor,
							 | 
						||
| 
								 | 
							
								  HtmlElementAst,
							 | 
						||
| 
								 | 
							
								  HtmlAttrAst,
							 | 
						||
| 
								 | 
							
								  HtmlTextAst,
							 | 
						||
| 
								 | 
							
								  htmlVisitAll
							 | 
						||
| 
								 | 
							
								} from 'angular2/src/compiler/html_ast';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function main() {
							 | 
						||
| 
								 | 
							
								  describe('DomParser', () => {
							 | 
						||
| 
								 | 
							
								    var parser: HtmlParser;
							 | 
						||
| 
								 | 
							
								    beforeEach(() => { parser = new HtmlParser(); });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('text nodes', () => {
							 | 
						||
| 
								 | 
							
								      it('should parse root level text nodes', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('a', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([[HtmlTextAst, 'a', 'TestComp > #text(a):nth-child(0)']]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should parse text nodes inside regular elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<div>a</div>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [HtmlTextAst, 'a', 'TestComp > div:nth-child(0) > #text(a):nth-child(0)']
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should parse text nodes inside template elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<template>a</template>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'template', 'TestComp > template:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [HtmlTextAst, 'a', 'TestComp > template:nth-child(0) > #text(a):nth-child(0)']
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('elements', () => {
							 | 
						||
| 
								 | 
							
								      it('should parse root level elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<div></div>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([[HtmlElementAst, 'div', 'TestComp > div:nth-child(0)']]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should parse elements inside of regular elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<div><span></span></div>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'span', 'TestComp > div:nth-child(0) > span:nth-child(0)']
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should parse elements inside of template elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<template><span></span></template>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'template', 'TestComp > template:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'span', 'TestComp > template:nth-child(0) > span:nth-child(0)']
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('attributes', () => {
							 | 
						||
| 
								 | 
							
								      it('should parse attributes on regular elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<div k="v"></div>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [HtmlAttrAst, 'k', 'v', 'TestComp > div:nth-child(0)[k=v]']
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      it('should parse attributes on template elements', () => {
							 | 
						||
| 
								 | 
							
								        expect(humanizeDom(parser.parse('<template k="v"></template>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'template', 'TestComp > template:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [HtmlAttrAst, 'k', 'v', 'TestComp > template:nth-child(0)[k=v]']
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    describe('ng-non-bindable', () => {
							 | 
						||
| 
								 | 
							
								      it('should ignore text nodes and elements inside of elements with ng-non-bindable', () => {
							 | 
						||
| 
								 | 
							
								        expect(
							 | 
						||
| 
								 | 
							
								            humanizeDom(parser.parse('<div ng-non-bindable>hello<span></span></div>', 'TestComp')))
							 | 
						||
| 
								 | 
							
								            .toEqual([
							 | 
						||
| 
								 | 
							
								              [HtmlElementAst, 'div', 'TestComp > div:nth-child(0)'],
							 | 
						||
| 
								 | 
							
								              [
							 | 
						||
| 
								 | 
							
								                HtmlAttrAst,
							 | 
						||
| 
								 | 
							
								                'ng-non-bindable',
							 | 
						||
| 
								 | 
							
								                '',
							 | 
						||
| 
								 | 
							
								                'TestComp > div:nth-child(0)[ng-non-bindable=]'
							 | 
						||
| 
								 | 
							
								              ]
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								      });
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function humanizeDom(asts: HtmlAst[]): any[] {
							 | 
						||
| 
								 | 
							
								  var humanizer = new Humanizer();
							 | 
						||
| 
								 | 
							
								  htmlVisitAll(humanizer, asts);
							 | 
						||
| 
								 | 
							
								  return humanizer.result;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Humanizer implements HtmlAstVisitor {
							 | 
						||
| 
								 | 
							
								  result: any[] = [];
							 | 
						||
| 
								 | 
							
								  visitElement(ast: HtmlElementAst): any {
							 | 
						||
| 
								 | 
							
								    this.result.push([HtmlElementAst, ast.name, ast.sourceInfo]);
							 | 
						||
| 
								 | 
							
								    htmlVisitAll(this, ast.attrs);
							 | 
						||
| 
								 | 
							
								    htmlVisitAll(this, ast.children);
							 | 
						||
| 
								 | 
							
								    return null;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  visitAttr(ast: HtmlAttrAst): any {
							 | 
						||
| 
								 | 
							
								    this.result.push([HtmlAttrAst, ast.name, ast.value, ast.sourceInfo]);
							 | 
						||
| 
								 | 
							
								    return null;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  visitText(ast: HtmlTextAst): any {
							 | 
						||
| 
								 | 
							
								    this.result.push([HtmlTextAst, ast.value, ast.sourceInfo]);
							 | 
						||
| 
								 | 
							
								    return null;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |