##// END OF EJS Templates
added provided and configure methods to the fluent container configuration, added applyConfig method to the container
added provided and configure methods to the fluent container configuration, added applyConfig method to the container

File last commit:

r115:691199f665e0 ioc ts support
r142:be7edf08a115 v1.4.0-rc3 default
Show More
TemplateCompiler.ts
136 lines | 3.7 KiB | video/mp2t | TypeScriptLexer
/ src / amd / ts / text / TemplateCompiler.ts
cin
fixed "singleton" activation type handling in container configuration...
r65 import * as format from "./format";
cin
working on support commonjs modules format
r59 import { TraceSource, DebugLevel } from "../log/TraceSource";
import { ITemplateParser, TokenType } from "./TemplateParser";
import m = require("module");
cin
corrected code to support ts strict mode...
r115 import { isKeyof } from "../safe";
cin
working on support commonjs modules format
r59
const trace = TraceSource.get(m.id);
type TemplateFn = (obj: object) => string;
cin
StringBuilder, TextWriter, ConsoleWriter tests
r82 const htmlEscapes = {
"&": "&",
"<": "&lt;",
">": "&gt;",
'"': "&quot;",
"'": "&#x27;",
"/": "&#x2F;"
};
// Regex containing the keys listed immediately above.
const htmlEscaper = /[&<>"'\/]/g;
// Escape a string for HTML interpolation.
function escapeHtml(string: any) {
cin
corrected code to support ts strict mode...
r115 return ("" + string).replace(htmlEscaper, match => isKeyof(match, htmlEscapes) ? htmlEscapes[match] : "");
cin
StringBuilder, TextWriter, ConsoleWriter tests
r82 }
cin
working on support commonjs modules format
r59 export class TemplateCompiler {
_data: string[];
_code: string[];
_wrapWith = true;
constructor() {
this._code = [];
this._data = [];
}
compile(parser: ITemplateParser): TemplateFn {
this.preamble();
this.visitTemplate(parser);
this.postamble();
const text = this._code.join("\n");
try {
// tslint:disable-next-line:function-constructor
cin
StringBuilder, TextWriter, ConsoleWriter tests
r82 const compiled = new Function("obj, format, $data, escapeHtml", text);
cin
working on support commonjs modules format
r59 /**
* Функция форматирования по шаблону
*
* @type{Function}
* @param{Object} obj объект с параметрами для подстановки
*/
cin
StringBuilder, TextWriter, ConsoleWriter tests
r82 return (obj: object) => compiled(obj || {}, format, this._data, escapeHtml);
cin
working on support commonjs modules format
r59 } catch (e) {
trace.traceEvent(DebugLevel, [e, text, this._data]);
throw e;
}
}
preamble() {
this._code.push(
"var $p = [];",
"var print = function(){",
" $p.push(format.apply(null,arguments));",
"};"
);
if (this._wrapWith)
this._code.push("with(obj){");
}
postamble() {
if (this._wrapWith)
this._code.push("}");
this._code.push("return $p.join('');");
}
visitTemplate(parser: ITemplateParser) {
while (parser.next()) {
switch (parser.token()) {
case TokenType.OpenBlock:
this.visitCode(parser);
break;
case TokenType.OpenInlineBlock:
this.visitInline(parser);
break;
cin
StringBuilder, TextWriter, ConsoleWriter tests
r82 case TokenType.OpenFilterBlock:
this.visitFilter(parser);
break;
cin
working on support commonjs modules format
r59 default:
this.visitTextFragment(parser);
break;
}
}
}
visitInline(parser: ITemplateParser) {
const code = ["$p.push("];
while (parser.next()) {
if (parser.token() === TokenType.CloseBlock)
break;
code.push(parser.value());
}
code.push(");");
this._code.push(code.join(""));
}
cin
StringBuilder, TextWriter, ConsoleWriter tests
r82 visitFilter(parser: ITemplateParser) {
const code = ["$p.push(escapeHtml("];
while (parser.next()) {
if (parser.token() === TokenType.CloseBlock)
break;
code.push(parser.value());
}
code.push("));");
this._code.push(code.join(""));
}
cin
working on support commonjs modules format
r59 visitCode(parser: ITemplateParser) {
const code = [];
while (parser.next()) {
if (parser.token() === TokenType.CloseBlock)
break;
code.push(parser.value());
}
this._code.push(code.join(""));
}
visitTextFragment(parser: ITemplateParser) {
cin
fixed "singleton" activation type handling in container configuration...
r65 const i = this._data.push(parser.value()) - 1;
cin
working on support commonjs modules format
r59 this._code.push("$p.push($data[" + i + "]);");
}
}