diff --git a/ui/builder/builder.ts b/ui/builder/builder.ts index f3f98cd5a..e1dc9f3c7 100644 --- a/ui/builder/builder.ts +++ b/ui/builder/builder.ts @@ -75,20 +75,13 @@ function parseInternal(value: string, context: any): componentBuilder.ComponentM } if (templateBuilder) { - if (args.eventType === xml.ParserEventType.StartElement) { - templateBuilder.addStartElement(args.prefix, args.namespace, args.elementName, args.attributes); - return; - } else if (args.eventType === xml.ParserEventType.EndElement) { - templateBuilder.addEndElement(args.prefix, args.elementName); - if (templateBuilder.hasFinished()) { - templateBuilder.build(); - templateBuilder = undefined; - } - else { - return; - } + var finished = templateBuilder.handleElement(args); + if (finished) { + // Clean-up and continnue + templateBuilder = undefined; } else { + // Skip processing untill the template builder finishes his job. return; } } diff --git a/ui/builder/template-builder.d.ts b/ui/builder/template-builder.d.ts index 4a8e6439e..39aa94c2f 100644 --- a/ui/builder/template-builder.d.ts +++ b/ui/builder/template-builder.d.ts @@ -1,15 +1,18 @@ //@private declare module "ui/builder/template-builder" { + import xml = require("xml"); import componentBuilder = require("ui/builder/component-builder"); class TemplateBuilder { constructor(templateProperty: TemplateProperty); elementName: string; - addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object); - addEndElement(prefix: string, elementName: string); - build(); - hasFinished(); + + /* + * Returns true if the template builder has finished parsing template and the parsing should continue. + * @param args - ParserEvent argument to handle. + */ + handleElement(args: xml.ParserEvent): boolean; } export function isKnownTemplate(name: string, exports: any): boolean; diff --git a/ui/builder/template-builder.ts b/ui/builder/template-builder.ts index b5dcfbeb2..bb562934b 100644 --- a/ui/builder/template-builder.ts +++ b/ui/builder/template-builder.ts @@ -1,4 +1,5 @@ import definition = require("ui/builder/template-builder"); +import xml = require("xml"); var KNOWNTEMPLATES = "knownTemplates"; @@ -17,7 +18,23 @@ export class TemplateBuilder { return this._templateProperty.elementName; } - public addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object) { + handleElement(args: xml.ParserEvent): boolean { + if (args.eventType === xml.ParserEventType.StartElement) { + this.addStartElement(args.prefix, args.namespace, args.elementName, args.attributes); + } else if (args.eventType === xml.ParserEventType.EndElement) { + this.addEndElement(args.prefix, args.elementName); + } + + if (this.hasFinished()) { + this.build(); + return true; + } + else { + return false; + } + } + + private addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object) { this._nestingLevel++; this._items.push("<" + getElementNameWithPrefix(prefix, elementName) + @@ -26,18 +43,18 @@ export class TemplateBuilder { ">"); } - public addEndElement(prefix: string, elementName: string) { + private addEndElement(prefix: string, elementName: string) { this._nestingLevel--; if (!this.hasFinished()) { this._items.push(""); } } - public hasFinished() { + private hasFinished() { return this._nestingLevel < 0; } - public build() { + private build() { if (this._templateProperty.name in this._templateProperty.parent.component) { this._templateProperty.parent.component[this._templateProperty.name] = this._items.join(""); }