TemplateParser.ts
69 lines
| 1.4 KiB
| video/mp2t
|
TypeScriptLexer
|
|
r59 | import { argumentNotEmptyString } from "../safe"; | ||
| import { MapOf } from "../interfaces"; | ||||
|
|
r65 | import { TraceSource, DebugLevel } from "../log/TraceSource"; | ||
| import m = require("module"); | ||||
| const trace = TraceSource.get(m.id); | ||||
|
|
r59 | |||
| const splitRx = /(<%=|\[%=|<%|\[%|%\]|%>)/; | ||||
| export enum TokenType { | ||||
| None, | ||||
| Text, | ||||
| OpenInlineBlock, | ||||
| OpenBlock, | ||||
| CloseBlock | ||||
| } | ||||
| const tokenMap: MapOf<TokenType> = { | ||||
| "<%": TokenType.OpenBlock, | ||||
| "[%": TokenType.OpenBlock, | ||||
| "<%=": TokenType.OpenInlineBlock, | ||||
| "[%=": TokenType.OpenInlineBlock, | ||||
| "%>": TokenType.CloseBlock, | ||||
| "%]": TokenType.CloseBlock | ||||
| }; | ||||
| export interface ITemplateParser { | ||||
| next(): boolean; | ||||
| token(): TokenType; | ||||
| value(): string; | ||||
| } | ||||
| export class TemplateParser implements ITemplateParser { | ||||
| _tokens: string[]; | ||||
| _pos = -1; | ||||
| _type: TokenType; | ||||
| _value: string; | ||||
| constructor(text: string) { | ||||
| argumentNotEmptyString(text, "text"); | ||||
| this._tokens = text.split(splitRx); | ||||
| this._type = TokenType.None; | ||||
| } | ||||
| next() { | ||||
| this._pos++; | ||||
| if (this._pos < this._tokens.length) { | ||||
| this._value = this._tokens[this._pos]; | ||||
| this._type = tokenMap[this._value] || TokenType.Text; | ||||
|
|
r65 | |||
|
|
r59 | return true; | ||
| } else { | ||||
| this._type = TokenType.None; | ||||
| this._value = undefined; | ||||
| return false; | ||||
| } | ||||
| } | ||||
| token() { | ||||
| return this._type; | ||||
| } | ||||
| value() { | ||||
| return this._value; | ||||
| } | ||||
| } | ||||
