template-compile.ts
49 lines
| 1.3 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r56 | import request = require("dojo/request"); | ||
| import m = require("module"); | ||||
| import { TraceSource } from "../log/TraceSource"; | ||||
| import { TemplateCompiler } from "./TemplateCompiler"; | ||||
| import { TemplateParser } from "./TemplateParser"; | ||||
| import { isNullOrEmptyString } from "../safe"; | ||||
| import { MapOf } from "../interfaces"; | ||||
| type TemplateFn = (obj: object) => string; | ||||
| const trace = TraceSource.get(m.id); | ||||
| function compile(str: string) { | ||||
| if (isNullOrEmptyString(str)) | ||||
| return () => ""; | ||||
| const parser = new TemplateParser(str); | ||||
| const compiler = new TemplateCompiler(); | ||||
| return compiler.compile(parser); | ||||
| } | ||||
| const cache: MapOf<TemplateFn> = {}; | ||||
| interface OnLoadFn<T> { | ||||
| (res: T): void; | ||||
| error(e: any): void; | ||||
| } | ||||
| compile.load = (id: string, require: Require, callback: OnLoadFn<TemplateFn>) => { | ||||
| const url = require.toUrl(id); | ||||
| if (url in cache) { | ||||
| trace.debug("{0} -> {1}: cached", id, url); | ||||
| callback(cache[url]); | ||||
| } else { | ||||
| trace.debug("{0} -> {1}: load", id, url); | ||||
| request(url).then(compile).then((tc: TemplateFn) => { | ||||
| trace.debug("{0}: compiled", url); | ||||
| callback(cache[url] = tc); | ||||
| }, (err: any) => { | ||||
| callback.error({ | ||||
| inner: err, | ||||
| src: "@implab/core/text/template-compile" | ||||
| }); | ||||
| }); | ||||
| } | ||||
| }; | ||||
| export = compile; | ||||
