mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-18 14:00:39 -07:00
revert(context): plain {} registers and getRegister ||
Registers are only mutated by tag implementations, not templates; keep null-prototype scopes/createScope for push frames. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -13,7 +13,7 @@ export class Context {
|
|||||||
* for tags like `{% capture %}` `{% assign %}` to operate
|
* for tags like `{% capture %}` `{% assign %}` to operate
|
||||||
*/
|
*/
|
||||||
private scopes: Scope[] = [createScope()]
|
private scopes: Scope[] = [createScope()]
|
||||||
private registers: Record<string, any> = Object.create(null)
|
private registers = {}
|
||||||
/**
|
/**
|
||||||
* user passed in scope
|
* user passed in scope
|
||||||
* `{% increment %}`, `{% decrement %}` changes this scope,
|
* `{% increment %}`, `{% decrement %}` changes this scope,
|
||||||
@@ -49,7 +49,7 @@ export class Context {
|
|||||||
this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit))
|
this.renderLimit = renderLimit ?? new Limiter('template render', getPerformance().now() + (renderOptions.renderLimit ?? opts.renderLimit))
|
||||||
}
|
}
|
||||||
public getRegister<T> (key: string, defaultValue: T = undefined as T): T {
|
public getRegister<T> (key: string, defaultValue: T = undefined as T): T {
|
||||||
return (this.registers[key] = this.registers[key] ?? defaultValue)
|
return (this.registers[key] = this.registers[key] || defaultValue)
|
||||||
}
|
}
|
||||||
public setRegister (key: string, value: any) {
|
public setRegister (key: string, value: any) {
|
||||||
return (this.registers[key] = value)
|
return (this.registers[key] = value)
|
||||||
|
|||||||
+2
-2
@@ -23,7 +23,7 @@ export default class extends Tag {
|
|||||||
* render (ctx: Context, emitter: Emitter) {
|
* render (ctx: Context, emitter: Emitter) {
|
||||||
const blockRender = this.getBlockRender(ctx)
|
const blockRender = this.getBlockRender(ctx)
|
||||||
if (ctx.getRegister('blockMode') === BlockMode.STORE) {
|
if (ctx.getRegister('blockMode') === BlockMode.STORE) {
|
||||||
ctx.getRegister('blocks', createScope() as Record<string, any>)[this.block] = blockRender
|
ctx.getRegister('blocks', {} as Record<string, any>)[this.block] = blockRender
|
||||||
} else {
|
} else {
|
||||||
yield blockRender(new BlockDrop(), emitter)
|
yield blockRender(new BlockDrop(), emitter)
|
||||||
}
|
}
|
||||||
@@ -32,7 +32,7 @@ export default class extends Tag {
|
|||||||
private getBlockRender (ctx: Context) {
|
private getBlockRender (ctx: Context) {
|
||||||
const self = this as Tag
|
const self = this as Tag
|
||||||
const { liquid, templates } = this
|
const { liquid, templates } = this
|
||||||
const renderChild = ctx.getRegister('blocks', createScope() as Record<string, any>)[this.block]
|
const renderChild = ctx.getRegister('blocks', {} as Record<string, any>)[this.block]
|
||||||
const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {
|
const renderCurrent = function * (superBlock: BlockDrop, emitter: Emitter) {
|
||||||
const stack: Tag[] = ctx.getRegister('blockStack', [])
|
const stack: Tag[] = ctx.getRegister('blockStack', [])
|
||||||
if (stack.includes(self)) throw new Error('block tag cannot be nested')
|
if (stack.includes(self)) throw new Error('block tag cannot be nested')
|
||||||
|
|||||||
+2
-2
@@ -1,4 +1,4 @@
|
|||||||
import { TopLevelToken, Liquid, ValueToken, evalToken, Emitter, TagToken, Context, Tag, createScope } from '..'
|
import { TopLevelToken, Liquid, ValueToken, evalToken, Emitter, TagToken, Context, Tag } from '..'
|
||||||
import { Arguments } from '../template'
|
import { Arguments } from '../template'
|
||||||
|
|
||||||
export default class extends Tag {
|
export default class extends Tag {
|
||||||
@@ -27,7 +27,7 @@ export default class extends Tag {
|
|||||||
* render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {
|
* render (ctx: Context, emitter: Emitter): Generator<unknown, unknown, unknown> {
|
||||||
const group = (yield evalToken(this.group, ctx)) as ValueToken
|
const group = (yield evalToken(this.group, ctx)) as ValueToken
|
||||||
const fingerprint = `cycle:${group}:` + this.candidates.join(',')
|
const fingerprint = `cycle:${group}:` + this.candidates.join(',')
|
||||||
const groups = ctx.getRegister('cycle', createScope() as Record<string, number>)
|
const groups = ctx.getRegister('cycle', {} as Record<string, number>)
|
||||||
let idx = groups[fingerprint]
|
let idx = groups[fingerprint]
|
||||||
|
|
||||||
if (idx === undefined) {
|
if (idx === undefined) {
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@ export default class extends Tag {
|
|||||||
assert(filepath, () => `illegal file path "${filepath}"`)
|
assert(filepath, () => `illegal file path "${filepath}"`)
|
||||||
|
|
||||||
const saved = ctx.saveRegister('blocks', 'blockMode')
|
const saved = ctx.saveRegister('blocks', 'blockMode')
|
||||||
ctx.setRegister('blocks', createScope())
|
ctx.setRegister('blocks', {})
|
||||||
ctx.setRegister('blockMode', BlockMode.OUTPUT)
|
ctx.setRegister('blockMode', BlockMode.OUTPUT)
|
||||||
const scope = (yield hash.render(ctx)) as Scope
|
const scope = (yield hash.render(ctx)) as Scope
|
||||||
if (withVar) scope[filepath] = yield evalToken(withVar, ctx)
|
if (withVar) scope[filepath] = yield evalToken(withVar, ctx)
|
||||||
|
|||||||
+1
-1
@@ -32,7 +32,7 @@ export default class extends Tag {
|
|||||||
// render remaining contents and store rendered results
|
// render remaining contents and store rendered results
|
||||||
ctx.setRegister('blockMode', BlockMode.STORE)
|
ctx.setRegister('blockMode', BlockMode.STORE)
|
||||||
const html = yield renderer.renderTemplates(this.templates, ctx)
|
const html = yield renderer.renderTemplates(this.templates, ctx)
|
||||||
const blocks = ctx.getRegister('blocks', createScope() as Record<string, any>)
|
const blocks = ctx.getRegister('blocks', {} as Record<string, any>)
|
||||||
|
|
||||||
// set whole content to anonymous block if anonymous doesn't specified
|
// set whole content to anonymous block if anonymous doesn't specified
|
||||||
if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)
|
if (blocks[''] === undefined) blocks[''] = (parent: BlankDrop, emitter: Emitter) => emitter.write(html)
|
||||||
|
|||||||
Reference in New Issue
Block a user