ANTON072
4/24/2013 - 1:33 AM

Handlebars で使うヘルパー関数集

Handlebars で使うヘルパー関数集

##############################
# Formatting
##############################

# Date を "2013年8月31日 (土)" の形式に
Handlebars.registerHelper "d", (date) ->
  return "" unless date
  weekdays = ["日", "月", "火", "水", "木", "金", "土"]
  "#{date.getFullYear()}年#{date.getMonth() + 1}月#{date.getDate()}日 (#{weekdays[date.getDay()]})"

# Date を "2013年8月31日 (土) 12:01:01" の形式に
Handlebars.registerHelper "dt", (date) ->
  return "" unless date
  Handlebars.helpers.d(date) + " #{date.getHours()}:#{date.getMinutes()}:#{date.getSeconds()}"

# true, false を icon-ok, icon-remove に
Handlebars.registerHelper "bool", (value) ->
  switch value
    when true
      new Handlebars.SafeString("<i class='icon-ok'></i>")
    when false
      new Handlebars.SafeString("<i class='icon-remove'></i>")

# 数値に桁区切りを入れる
Handlebars.registerHelper "number_with_delimiter", (n, options) ->
  return unless n?
  n.toString(10).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1" + ",")

# 数値を通貨として表示
Handlebars.registerHelper "number_to_currency", (n, options) ->
  return unless n?
  Handlebars.helpers.number_with_delimiter(n) + "円"

# 数値の範囲 (第 1 引数と第 2 引数) を桁区切りを入れて表示
Handlebars.registerHelper "number_range_with_delimiter", (min, max, options) ->
  return unless min?
  return Handlebars.helpers.number_with_delimiter(min) if !max? || min == max
  Handlebars.helpers.number_with_delimiter(min) + " - " +
  Handlebars.helpers.number_with_delimiter(max)

# 数値の範囲 (第 1 引数と第 2 引数) を通貨の範囲として表示
Handlebars.registerHelper "number_range_to_currency", (min, max, options) ->
  return unless number_range = Handlebars.helpers.number_range_with_delimiter(min, max, options)
  number_range + "円"

# 第 1 引数の各要素を第 2 引数で連結
Handlebars.registerHelper "join", (list, delimiter, options) ->
  return unless list
  list.join delimiter


##############################
# Conditional attribute
##############################

# 第 1 引数に第 2 引数が含まれていれば "checked"
Handlebars.registerHelper "checked_if_include", (list, item, options) ->
  return "checked" if list == item
  return "checked" if _(list).include(item)

# 第 1 引数 == 第 2 引数なら "checked"
Handlebars.registerHelper "checked_if_equal", (a, b, options) ->
  return "checked" if a == b

# 第 1 引数に第 2 引数が含まれていれば "selected"
Handlebars.registerHelper "selected_if_include", (list, item, options) ->
  return "selected" if list == item
  return "selected" if _(list).include(item)

# 第 1 引数 == 第 2 引数なら "selected"
Handlebars.registerHelper "selected_if_equal", (a, b, options) ->
  return "selected" if a == b


##############################
# Block
##############################

# if の再定義
# 真偽値の判定を変更する (null, false, undefined 以外は true)
Handlebars.registerHelper "if", (expr, options) ->
  if expr? && expr != false
    options.fn(this)
  else
    options.inverse(this)

# 第 1 引数と第 2 引数が == ならブロック内を出力
Handlebars.registerHelper "if_equal", (a, b, options) ->
  if a == b
    options.fn(this)
  else
    options.inverse(this)

# 第 1 引数と第 2 引数が != ならブロック内を出力
Handlebars.registerHelper "unless_equal", (a, b, options) ->
  unless a == b
    return options.fn(this)
  else
    options.inverse(this)

# 第 1 引数に第 2 引数が含まれていればブロック内出力
# 判定は _.include を利用
Handlebars.registerHelper "if_include", (list, item, options) ->
  if _(list).include(item)
    options.fn(this)
  else
    options.inverse(this)

# 第 1 引数から第 2 引数まで数え上げながらブロック内をくり返し評価
# 番号は number で参照できる
Handlebars.registerHelper "upto", (first, last, options) ->
  html = ""
  for i in [first..last]
    html += options.fn _(this).extend(number: i)
  new Handlebars.SafeString(html)


##############################
# Function
##############################

# 第 1 引数を関数として呼び出す
# 第 2 引数以降は引数
Handlebars.registerHelper "call", (func, args...) ->
  options = args.pop()
  func.apply(this, args)