Merge pull request #580 from NativeScript/feature/code-cleanup

Template builder code cleanup
This commit is contained in:
Alexander Vakrilov
2015-08-13 15:17:38 +03:00
3 changed files with 33 additions and 20 deletions

View File

@ -75,20 +75,13 @@ function parseInternal(value: string, context: any): componentBuilder.ComponentM
} }
if (templateBuilder) { if (templateBuilder) {
if (args.eventType === xml.ParserEventType.StartElement) { var finished = templateBuilder.handleElement(args);
templateBuilder.addStartElement(args.prefix, args.namespace, args.elementName, args.attributes); if (finished) {
return; // Clean-up and continnue
} else if (args.eventType === xml.ParserEventType.EndElement) { templateBuilder = undefined;
templateBuilder.addEndElement(args.prefix, args.elementName);
if (templateBuilder.hasFinished()) {
templateBuilder.build();
templateBuilder = undefined;
}
else {
return;
}
} }
else { else {
// Skip processing untill the template builder finishes his job.
return; return;
} }
} }

View File

@ -1,15 +1,18 @@
//@private //@private
declare module "ui/builder/template-builder" { declare module "ui/builder/template-builder" {
import xml = require("xml");
import componentBuilder = require("ui/builder/component-builder"); import componentBuilder = require("ui/builder/component-builder");
class TemplateBuilder { class TemplateBuilder {
constructor(templateProperty: TemplateProperty); constructor(templateProperty: TemplateProperty);
elementName: string; elementName: string;
addStartElement(prefix: string, namespace: string, elementName: string, attributes: Object);
addEndElement(prefix: string, elementName: string); /*
build(); * Returns true if the template builder has finished parsing template and the parsing should continue.
hasFinished(); * @param args - ParserEvent argument to handle.
*/
handleElement(args: xml.ParserEvent): boolean;
} }
export function isKnownTemplate(name: string, exports: any): boolean; export function isKnownTemplate(name: string, exports: any): boolean;

View File

@ -1,4 +1,5 @@
import definition = require("ui/builder/template-builder"); import definition = require("ui/builder/template-builder");
import xml = require("xml");
var KNOWNTEMPLATES = "knownTemplates"; var KNOWNTEMPLATES = "knownTemplates";
@ -17,7 +18,23 @@ export class TemplateBuilder {
return this._templateProperty.elementName; 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._nestingLevel++;
this._items.push("<" + this._items.push("<" +
getElementNameWithPrefix(prefix, elementName) + getElementNameWithPrefix(prefix, elementName) +
@ -26,18 +43,18 @@ export class TemplateBuilder {
">"); ">");
} }
public addEndElement(prefix: string, elementName: string) { private addEndElement(prefix: string, elementName: string) {
this._nestingLevel--; this._nestingLevel--;
if (!this.hasFinished()) { if (!this.hasFinished()) {
this._items.push("</" + getElementNameWithPrefix(prefix, elementName) + ">"); this._items.push("</" + getElementNameWithPrefix(prefix, elementName) + ">");
} }
} }
public hasFinished() { private hasFinished() {
return this._nestingLevel < 0; return this._nestingLevel < 0;
} }
public build() { private build() {
if (this._templateProperty.name in this._templateProperty.parent.component) { if (this._templateProperty.name in this._templateProperty.parent.component) {
this._templateProperty.parent.component[this._templateProperty.name] = this._items.join(""); this._templateProperty.parent.component[this._templateProperty.name] = this._items.join("");
} }