Skip to content

Instantly share code, notes, and snippets.

@tekei
Created July 7, 2013 09:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tekei/5942922 to your computer and use it in GitHub Desktop.
Save tekei/5942922 to your computer and use it in GitHub Desktop.
HTML キーボード入力を考慮したフィールド制御 まずは、カレンダフィールドの日付補完部分 (モジュール化前の動作仕様の検討版)
# キーボード入力向け日付補完
# 動作検討版
#
# sugar.jsに依存しています
class DateSuggest
now: new Date()
japan_year:
"m": 1867,
"t": 1911,
"s": 1925,
"h": 1988
constructor: () ->
[@year, @month, @day] = @parse_date(@now) unless @year?
parse_date: (d) ->
[String(now.getFullYear()), String(now.getMonth() + 1), String(now.getDate())]
str_to_date: (str) ->
return [@year, @month, @day] if (str == '0' || str == 't')
return [@year, @month, new Date(@year, @month, 0).getDate()] if (str == '31' || str == 'l')
if (r = /^([mtsh])(\d{1,2})([\/\.].*)$/.exec(str))
return @str_to_date((@japan_year[r[1]] + parseInt(r[2], 10)) + r[3])
return [@year, @month, r[1]] if (r = /^(\d{1,2})$/.exec(str))
return [@year, r[1], r[2]] if (r = /^(\d{1,2})(\d{2})$/.exec(str))
return [@year.slice(0, 2) + r[1], r[2], r[3]] if (r = /^(\d{2})(\d{2})(\d{2})$/.exec(str))
return [r[1], r[2], r[3]] if (r = /^(\d{4})(\d{2})(\d{2})$/.exec(str))
return [@year, r[1], r[2]] if (r = /^(\d{1,2})[\/\.](\d{1,2})$/.exec(str))
if (r = /^(\d{1,4})[\/\.](\d{1,2})[\/\.](\d{1,2})$/.exec(str))
return [@year.slice(0, (4 - r[1].length)) + r[1], r[2], r[3]]
if ((r = /^[\+]?(\d+)[d]?$/.exec(str)) || (r = /^(-\d+)[d]?$/.exec(str)))
return @parse_date(@now.addDays(parseInt(r[1], 10)))
if ((r = /^[\+]?(\d+)w$/.exec(str)) || (r = /^(-\d+)w$/.exec(str)))
return @parse_date(@now.addWeeks(parseInt(r[1], 10)))
if ((r = /^[\+]?(\d+)m$/.exec(str)) || (r = /^(-\d+)m$/.exec(str)))
return @parse_date(@now.addMonths(parseInt(r[1], 10)))
null
check_format: (str) ->
d = new Date(parseInt(str[0], 10), parseInt(str[1], 10) - 1, parseInt(str[2], 10))
!isNaN(d)
get: (str) ->
return null unless str?
d = @str_to_date(str.toLowerCase())
return null if (!d? || !@check_format(d))
"#{d[0]}#{('0' + d[1]).slice(-2)}#{('0' + d[2]).slice(-2)}"
suggest = new DateSuggest
# 1. 区切り文字無しパターン
console.log "5 : #{suggest.get('5')}"
console.log "10 : #{suggest.get('10')}"
console.log "123 : #{suggest.get('123')}"
console.log "1231 : #{suggest.get('1231')}"
console.log "20100310 : #{suggest.get('20110310')}"
console.log "130310 : #{suggest.get('130310')}"
# 2. 区切り文字有りパターン
console.log "---------------------------------"
console.log "1/2 : #{suggest.get('1/2')}"
console.log "10/28 : #{suggest.get('10/28')}"
console.log "11/6 : #{suggest.get('11/6')}"
console.log "05/6/1 : #{suggest.get('05/6/1')}"
console.log "13/3/11 : #{suggest.get('13/3/11')}"
console.log "2012/12/4 : #{suggest.get('2012/12/4')}"
console.log "2008/1/2 : #{suggest.get('2008/1/2')}"
console.log "1.2 : #{suggest.get('1.2')}"
console.log "05.6.1 : #{suggest.get('05.6.1')}"
console.log "2012.12.4 : #{suggest.get('2012.12.4')}"
# 3. 差分入力
console.log "---------------------------------"
console.log "0 : #{suggest.get('0')}"
console.log "0d : #{suggest.get('0d')}"
console.log "+1 : #{suggest.get('+1')}"
console.log "-1 : #{suggest.get('-1')}"
console.log "+1d : #{suggest.get('+1d')}"
console.log "1d : #{suggest.get('1d')}"
console.log "-1d : #{suggest.get('-1d')}"
console.log "+13 : #{suggest.get('+13')}"
console.log "13d : #{suggest.get('13d')}"
console.log "-14 : #{suggest.get('-14')}"
console.log "-14d : #{suggest.get('-14d')}"
console.log "+1w : #{suggest.get('+1w')}"
console.log "1w : #{suggest.get('1w')}"
console.log "-1w : #{suggest.get('-1w')}"
console.log "+1m : #{suggest.get('+1m')}"
console.log "1m : #{suggest.get('1m')}"
console.log "-1m : #{suggest.get('-1m')}"
# 4. 和暦入力
console.log "---------------------------------"
console.log "s2/12/4 : #{suggest.get('s2/12/4')}"
console.log "t13/1/2 : #{suggest.get('t13/1/2')}"
console.log "s53.6.1 : #{suggest.get('s53.6.1')}"
console.log "S10.12.13 : #{suggest.get('S10.12.13')}"
console.log "h11.12.4 : #{suggest.get('h11.12.4')}"
# 5. 特殊
# 月末
console.log "---------------------------------"
console.log "31 : #{suggest.get('31')}"
console.log "l : #{suggest.get('l')}"
# 5. 入力エラー
console.log "---------------------------------"
console.log "12/ : #{suggest.get('12/')}"
console.log "/23 : #{suggest.get('/23')}"
console.log " : #{suggest.get('')}"
console.log "null : #{suggest.get(null)}"
console.log "abc : #{suggest.get('abc')}"
console.log "aaaaaaaa : #{suggest.get('aaaaaaaa')}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment