diff --git a/CHANGELOG.md b/CHANGELOG.md index 769ab2d..ed1d734 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,11 @@ ### Enhancements - You may now register custom template filters which make use of arguments. +- There is now a `default` filter. + + ```html+django + Hello {{ name|default:"World" }} + ``` ### Bug Fixes diff --git a/Sources/Filters.swift b/Sources/Filters.swift index 6a6f3bb..1574a58 100644 --- a/Sources/Filters.swift +++ b/Sources/Filters.swift @@ -31,3 +31,7 @@ func lowercase(_ value: Any?) -> Any? { return value } + +func defaultFilter(value: Any?, arguments: [Any?]) -> Any? { + return value ?? arguments.first as Any +} diff --git a/Sources/Namespace.swift b/Sources/Namespace.swift index ca435d2..2b1d41e 100644 --- a/Sources/Namespace.swift +++ b/Sources/Namespace.swift @@ -45,6 +45,7 @@ public class Namespace { } fileprivate func registerDefaultFilters() { + registerFilter("default", filter: defaultFilter) registerFilter("capitalize", filter: capitalise) registerFilter("uppercase", filter: uppercase) registerFilter("lowercase", filter: lowercase) diff --git a/Tests/StencilTests/FilterSpec.swift b/Tests/StencilTests/FilterSpec.swift index b88e99f..824ba80 100644 --- a/Tests/StencilTests/FilterSpec.swift +++ b/Tests/StencilTests/FilterSpec.swift @@ -89,4 +89,18 @@ func testFilter() { try expect(result) == "kyle" } } + + describe("default filter") { + let template = Template(templateString: "Hello {{ name|default:\"World\" }}") + + $0.it("shows the variable value") { + let result = try template.render(Context(dictionary: ["name": "Kyle"])) + try expect(result) == "Hello Kyle" + } + + $0.it("shows the default value") { + let result = try template.render(Context(dictionary: [:])) + try expect(result) == "Hello World" + } + } } diff --git a/docs/builtins.rst b/docs/builtins.rst index 45127cc..6b3bcbe 100644 --- a/docs/builtins.rst +++ b/docs/builtins.rst @@ -120,3 +120,13 @@ For example, `Stencil` to `stencil`. .. code-block:: html+django {{ "Stencil"|lowercase }} + +``default`` +~~~~~~~~~~~ + +If a variable not present in the context, use given default. Otherwise, use the +value of the variable. For example: + +.. code-block:: html+django + + Hello {{ name|default:"World" }}