diff --git a/docs/source/filters/default.md b/docs/source/filters/default.md index 40fa6a986d..3351525c8c 100644 --- a/docs/source/filters/default.md +++ b/docs/source/filters/default.md @@ -44,4 +44,23 @@ Output 2.99 ``` +## Allowing `false` + +{% since %}v9.32.0{% endsince %} + +To allow variables to return `false` instead of the default value, you can use the `allow_false` parameter. + +Input + +```liquid +{% assign display_price = false %} +{{ display_price | default: true, allow_false: true }} +``` + +Output + +```text +false +``` + [falsy]: ../tutorials/truthy-and-falsy.html diff --git a/docs/source/zh-cn/filters/default.md b/docs/source/zh-cn/filters/default.md index 7ef9e9d351..ad16cf45bc 100644 --- a/docs/source/zh-cn/filters/default.md +++ b/docs/source/zh-cn/filters/default.md @@ -42,4 +42,23 @@ title: default 2.99 ``` +## 允许 `false` + +{% since %}v9.32.0{% endsince %} + +为了允许让 `false` 直接输出而不是用默认值,可以用 `allow_false` 参数。 + +输入 + +```liquid +{% assign display_price = false %} +{{ display_price | default: true, allow_false: true }} +``` + +输出 + +```text +false +``` + [falsy]: ../tutorials/truthy-and-falsy.html diff --git a/src/builtin/filters/object.ts b/src/builtin/filters/object.ts index 26a880724c..474cc54858 100644 --- a/src/builtin/filters/object.ts +++ b/src/builtin/filters/object.ts @@ -2,10 +2,13 @@ import { isFalsy } from '../../render/boolean' import { isArray, isString, toValue } from '../../util/underscore' import { FilterImpl } from '../../template/filter/filter-impl' -export function Default (this: FilterImpl, v: string | T1, arg: T2): string | T1 | T2 { - if (isArray(v) || isString(v)) return v.length ? v : arg - return isFalsy(toValue(v), this.context) ? arg : v +export function Default (this: FilterImpl, value: T1, defaultValue: T2, ...args: Array<[string, any]>): T1 | T2 { + if (isArray(value) || isString(value)) return value.length ? value : defaultValue + value = toValue(value) + if (value === false && (new Map(args)).get('allow_false')) return false as T1 + return isFalsy(value, this.context) ? defaultValue : value } -export function json (v: any) { - return JSON.stringify(v) + +export function json (value: any) { + return JSON.stringify(value) } diff --git a/test/integration/builtin/filters/object.ts b/test/integration/builtin/filters/object.ts index 4716644ba7..5beaf3c720 100644 --- a/test/integration/builtin/filters/object.ts +++ b/test/integration/builtin/filters/object.ts @@ -12,6 +12,9 @@ describe('filters/object', function () { it('undefined should use default', async () => expect(await liquid.parseAndRender('{{not_defined | default: "a"}}')).to.equal('a')) it('true should not use default', async () => expect(await liquid.parseAndRender('{{true | default: "a"}}')).to.equal('true')) it('0 should not use default', async () => expect(await liquid.parseAndRender('{{0 | default: "a"}}')).to.equal('0')) + it('should output false when allow_false=true', async () => expect(await liquid.parseAndRender('{{false | default: true, allow_false: true}}')).to.equal('false')) + it('should output default without allow_false', async () => expect(await liquid.parseAndRender('{{false | default: true}}')).to.equal('true')) + it('should output default when allow_false=false', async () => expect(await liquid.parseAndRender('{{false | default: true, allow_false: false}}')).to.equal('true')) }) describe('json', function () { it('should stringify string', async () => expect(await liquid.parseAndRender('{{"foo" | json}}')).to.equal('"foo"'))