Skip to content

Instantly share code, notes, and snippets.

@labocho
Last active July 10, 2021 13:37
Show Gist options
  • Save labocho/5448924 to your computer and use it in GitHub Desktop.
Save labocho/5448924 to your computer and use it in GitHub Desktop.
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)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment