Provide powerful data processing capabilities for handlebars, by adding the ramda function as helpers.
Adding r__
before the ramda function name is the handlebars helpers name.
Let see an example:
import * as Handlebars from 'handlebars'
import * as HandlebarsRamdaHelpers from 'handlebars-ramda-helpers'
// register helpers before compile
HandlebarsRamdaHelpers.register(Handlebars)
const view = {
books: [
{ type: 'computer', name: 'C Primer Plus', price: 10 },
{ type: 'computer', name: 'An Introduction to Programming in Go', price: 20 },
{ type: 'computer', name: 'Javascript the definitive guide', price: 100 },
{ type: 'comic', name: 'One Piece', price: 100 },
]
}
const template = `
I have a lot of books:
{{~r__define 'divide' (r__compose (r__join '') (r__repeat '-'))}}
{{r__padRight 40 ' ' 'bookName'}} | bookPrice
{{divide 40}} | {{divide 10}}
{{#each books}}
{{r__padRight 40 ' ' name}} | {{r__padRight 10 ' ' price}}
{{/each}}
{{r__define 'priceList' (r__pluck 'price' books)}}
The total value of these books is approx {{r__sum priceList}}.
I have {{r__count (r__propEq 'type' 'comic') books}} comic books and {{r__count (r__propEq 'type' 'computer') books}} computer books.
`
Handlebars.compile(template)(view)
The Output:
I have a lot of books:
bookName | bookPrice
---------------------------------------- | ----------
C Primer Plus | 10
An Introduction to Programming in Go | 20
Javascript the definitive guide | 100
One Piece | 100
The total value of these books is approx 230.
I have 1 comic books and 3 computer books.
For more functions, please see Ramda Doc.
In order to facilitate the use of ramda in handlebars, some extension functions have been added.
name | description |
---|---|
r__define | Define a variable on context {{r__define "variableName" "variableValue"}}
|
r__Array | Create an array {{r__Array "0" "1" "2"}}
|
r__Object | Create an object {{r__Object "key1"="value1" "key2"="value2"}}
|
r__isObject | R.is(Object) |
r__isNumber | R.is(Number) |
r__isString | R.is(String) |
r__isArray | R.is(Array) |
r__isFunction | R.is(Function) |
r__isBoolean | R.is(Boolean) |
r__isTrue | R.identical(R.T()) |
r__isFalse | R.identical(R.F()) |
r__allIs | R.useWith(R.all, [R.is, R.identity]) |
r__allIsObject | R.all(R.is(Object)) |
r__allIsNumber | R.all(R.is(Number)) |
r__allIsString | R.all(R.is(String)) |
r__allIsArray | R.all(R.is(Array)) |
r__allIsFunction | R.all(R.is(Function)) |
r__allIsBoolean | R.all(R.is(Boolean)) |
r__allIsTrue | R.all(R.identical(R.T())) |
r__allIsFalse | R.all(R.identical(R.F())) |
r__padLeft | R.curry((fillString, maxLength, str) => String(str).padStart(maxLength, fillString)) |
r__padRight | R.curry((fillString, maxLength, str) => String(str).padEnd(maxLength, fillString)) |
r__notEquals | R.complement(R.equals) |
r__pathNotEq | R.complement(R.pathEq) |
r__propNotEq | R.complement(R.propEq) |
If a function was defined by
{{r__define "fn" (r__equals "example")}}
, thefn
should be used like an helper, rather than a variable.Error:
{{r__all fn (r__Array "example" "example")}}
Correct:
{{r__all (fn) (r__Array "example" "example")}}
name | description |
---|---|
r__define | Define a variable on context {{#r__define "variableName"}}"variableValue"{{/r__define}}
|
r__toUpper | R.toUpper |
r__toLower | R.toLower |
r__trim | R.trim |
All block helpers can use as non-block helper
If there is any doubt, it is very welcome to discuss the issue together. Please read Contributor Covenant Code of Conduct and CONTRIBUTING.