mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-17 05:10:40 -07:00
* feat: static variable analysis * Accept any iterable from `children`, `arguments`, etc. * Test analysis of standard tags * Use `TagToken.tokenizer` instead of creating a new one * Test analysis of netsted tags * Group variables by their root value * Test analysis of nested globals and locals * Analyze included and rendered templates WIP * Use existing tokenizer when constructing `Hash` * Improve test coverage * Analyze variables from `layout` and `block` tags * Test analysis of Jekyll style includes * Handle variables that start with a nested variable * Async analysis * Test non-standard tag end to end * Implement convenience analysis methods on the `Liquid` class * More analysis convenience methods * Accept string or template array * Draft static analysis docs * Deduplicate variables names * Fix isolated scope global variable map * Coerce variables to strings instead of extending String * Private map instead of extending Map * Fix e2e test * Tentatively implement analysis of aliased variables * Fix nested variable segments array * Update docs sidebar
40 lines
1.4 KiB
TypeScript
40 lines
1.4 KiB
TypeScript
import { Filter } from './filter'
|
|
import { Expression } from '../render'
|
|
import { Tokenizer } from '../parser'
|
|
import { assert } from '../util'
|
|
import type { FilteredValueToken } from '../tokens'
|
|
import type { Liquid } from '../liquid'
|
|
import type { Context } from '../context'
|
|
|
|
export class Value {
|
|
public readonly filters: Filter[] = []
|
|
public readonly initial: Expression
|
|
|
|
/**
|
|
* @param str the value to be valuated, eg.: "foobar" | truncate: 3
|
|
*/
|
|
public constructor (input: string | FilteredValueToken, liquid: Liquid) {
|
|
const token: FilteredValueToken = typeof input === 'string'
|
|
? new Tokenizer(input, liquid.options.operators).readFilteredValue()
|
|
: input
|
|
this.initial = token.initial
|
|
this.filters = token.filters.map(token => new Filter(token, this.getFilter(liquid, token.name), liquid))
|
|
}
|
|
|
|
public * value (ctx: Context, lenient?: boolean): Generator<unknown, unknown, unknown> {
|
|
lenient = lenient || (ctx.opts.lenientIf && this.filters.length > 0 && this.filters[0].name === 'default')
|
|
let val = yield this.initial.evaluate(ctx, lenient)
|
|
|
|
for (const filter of this.filters) {
|
|
val = yield filter.render(val, ctx)
|
|
}
|
|
return val
|
|
}
|
|
|
|
private getFilter (liquid: Liquid, name: string) {
|
|
const impl = liquid.filters[name]
|
|
assert(impl || !liquid.options.strictFilters, () => `undefined filter: ${name}`)
|
|
return impl
|
|
}
|
|
}
|