cometa/src/compiler.ts

76 lines
1.5 KiB
TypeScript

import { Part, error, ActionFunction, ActionReturn, options, Options, Expressions } from './options'
import * as actions from './actions'
export const compileBlock: ActionFunction = (part, optoins, re) => {
const rexp = Object.freeze({
begin: new RegExp(re.begin, 'g'),
end: new RegExp(re.ending, 'g'),
})
interface Next {
start: number
end: number
}
let next: Next
const getNext = (s: string): Next => Object.freeze({
start: s.search(rexp.begin),
end: s.search(rexp.end),
})
let ret: ActionReturn = {
parts: [],
length: NaN
}
function addToRet(item: any) {
ret.parts = ret.parts.concat(item)
}
next = getNext(part)
while (next.start !== -1) {
if (next.start === null || next.end === null)
throw new Error(error.parse.default)
addToRet(part.substr(0, next.start))
part = part.slice(next.start)
let func: ActionFunction
switch (part[re.begin.length]) {
case re.comment:
func = actions.comment
break
case re.if:
func = actions.logic
break
case re.for:
func = actions.loop
break
case re.incude:
func = actions.importer
break
default:
func = actions.variables
break
}
const result = func(part, options, re)
addToRet(result.parts)
part = part.slice(result.length)
next = getNext(part)
}
addToRet(part)
return ret
}
export function process(html: string, options: Options, re: Expressions): Part[] {
const parts: Part[] = compileBlock(html, options, re).parts
return parts
}