liquid-node
Version:
Node.js port of Tobias Lütke's Liquid template engine.
118 lines (86 loc) • 2.34 kB
text/coffeescript
_ = require("underscore")._
toNumber = (input) ->
Number(input)
toString = (input) ->
return unless input
if _.isString(input)
input
else if typeof input.toString == "function"
input.toString()
else
Object::toString.call(input)
module.exports =
size: (input) ->
input.length
downcase: (input) ->
toString(input).toLowerCase()
upcase: (input) ->
toString(input).toUpperCase()
append: (input, other) ->
[toString(input), toString(other)].join()
prepend: (input, other) ->
[toString(other), toString(input)].join()
empty: (input) ->
return true unless input
return false unless input.length?
true
## TODO!!!
truncate: (input, length = 50, truncateString = '...') ->
input = toString(input)
truncateString = toString(truncateString)
return unless input?
return unless input.slice
length = toNumber(length)
l = length - truncateString.length
l = 0 if l < 0
if input.length > length then input[..l] + truncateString else input
truncatewords: (input, words = 15, truncateString = '...') ->
input = toString(input)
return unless input?
return unless input.slice
wordlist = input.split(" ")
words = toNumber(words)
l = words - 1
l = 0 if l < 0
if wordlist.length > l
wordlist[..l].join(" ") + truncateString
else
input
split: (input, pattern) ->
input = toString(input)
return unless input
input.split(pattern)
## TODO!!!
join: (input, glue = ' ') ->
_(input).flatten().join(glue)
## TODO!!!
# Get the first element of the passed in array
#
# Example:
# {{ product.images | first | to_img }}
#
first: (array) ->
if array.length > 0
array[0]
else
null
# Get the last element of the passed in array
#
# Example:
# {{ product.images | last | to_img }}
#
last: (array) ->
if array.length > 0
array[array.length-1]
else
null
plus: (input, operand) ->
toNumber(input) + toNumber(operand)
minus: (input, operand) ->
toNumber(input) - toNumber(operand)
times: (input, operand) ->
toNumber(input) * toNumber(operand)
dividedBy: (input, operand) ->
toNumber(input) / toNumber(operand)
modulo: (input, operand) ->
toNumber(input) % toNumber(operand)