lib/when_exe/region/japanese/weeks.rb in when_exe-0.4.1 vs lib/when_exe/region/japanese/weeks.rb in when_exe-0.4.2

- old
+ new

@@ -1,112 +1,112 @@ -# -*- coding: utf-8 -*- -=begin - Copyright (C) 2014 Takashi SUGA - - You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive. -=end - -class When::CalendarNote - - # - # 標準の暦注 + 六曜 - # - CommonWithRokuyo = [['_m:Calendar::Month'], ['Common::Week', '_n:RokuyoWeek/Notes::day::Rokuyo']] - - # - # 六曜 - # - class RokuyoWeek < Week - - # - # 暦注要素の定義 - # - Notes = [When::BasicTypes::M17n, [ - "locale:[=en:, ja=ja:, alias]", - "names:[Rokuyo=]", - - # 日の暦注 ---------------------------- - [When::BasicTypes::M17n, - "names:[day]", - [When::BasicTypes::M17n, - "names:[Rokuyo=, 六曜]", - [DayOfWeek, "label:[Taian=, *大安]", {'delta'=>6}], - [DayOfWeek, "label:[Shakko=, *赤口]", {'delta'=>6}], - [DayOfWeek, "label:[Sensho=, *先勝]", {'delta'=>6}], - [DayOfWeek, "label:[Tomobiki=, *友引]", {'delta'=>6}], - [DayOfWeek, "label:[Sembu=, *先負]", {'delta'=>6}], - [DayOfWeek, "label:[Butsumetsu=, *仏滅]", {'delta'=>6}] - ] - ] - ]] - - # - # この日は何曜? - # - # @param [When::TM::TemporalPosition] date - # @param [When::TM::CalDate] base (not used) - # - # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>] - # - def rokuyo(date, base=nil) - date = _to_date_for_note(date) - y, m, d = date.cal_date - index = rokuyo_index(m,d) - {:value=>@days_of_week[index], :position=>[index, 6]} - end - alias :week :rokuyo - - # @private - def rokuyo_value(m,d) - @days_of_week[rokuyo_index(m,d)] - end - - # @private - def rokuyo_index(m,d) - (m*1 + d) % 6 - end - - # @private - def taian(date, base=nil) - count = 0 - d0 = d1 = _to_date_for_note(date) - r0 = r1 = nil - loop do - y,m,d = d1.cal_date - r1 = rokuyo_index(m,d) - break if r1 == 0 - if r0 && r1 > r0 - r1 = r0 - count -= 1 - break - end - d0 = d1 - r0 = r1 - d1 = d0 - When::P1D - count += 1 - end - date -= count if count > 0 - date.events = [@days_of_week[r1]] - date - end - - # - # 暦日を太陰太陽暦日に変換 - # - # @private - def _to_date_for_note(date) - return date if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar) - return When::Japanese ^ date if date.most_significant_coordinate >= 1873 - return Japanese._to_japanese_date(date) - end - - private - - # オブジェクトの正規化 - # @private - def _normalize(args=[], options={}) - @days_of_week ||= When.CalendarNote("RokuyoWeek/Notes::day::Rokuyo") - @event ||= 'taian' - super - end - end -end +# -*- coding: utf-8 -*- +=begin + Copyright (C) 2014 Takashi SUGA + + You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive. +=end + +class When::CalendarNote + + # + # 標準の暦注 + 六曜 + # + CommonWithRokuyo = [['_m:Calendar::Month'], ['Common::Week', '_n:RokuyoWeek/Notes::day::Rokuyo']] + + # + # 六曜 + # + class RokuyoWeek < Week + + # + # 暦注要素の定義 + # + Notes = [When::BasicTypes::M17n, [ + "locale:[=en:, ja=ja:, zh=ja:, alias]", + "names:[Rokuyo=]", + + # 日の暦注 ---------------------------- + [When::BasicTypes::M17n, + "names:[day]", + [When::BasicTypes::M17n, + "names:[Rokuyo=, 六曜, 六曜=zh:%%<六曜>]", + [DayOfWeek, "label:[Taian=, *大安, 大安]", {'delta'=>6}], + [DayOfWeek, "label:[Shakko=, *赤口, 赤口]", {'delta'=>6}], + [DayOfWeek, "label:[Sensho=, *先勝, 先勝]", {'delta'=>6}], + [DayOfWeek, "label:[Tomobiki=, *友引, 友引]", {'delta'=>6}], + [DayOfWeek, "label:[Sembu=, *先負, 先負]", {'delta'=>6}], + [DayOfWeek, "label:[Butsumetsu=, *仏滅, 仏滅]", {'delta'=>6}] + ] + ] + ]] + + # + # この日は何曜? + # + # @param [When::TM::TemporalPosition] date + # @param [When::TM::CalDate] base (not used) + # + # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>] + # + def rokuyo(date, base=nil) + date = _to_date_for_note(date) + y, m, d = date.cal_date + index = rokuyo_index(m,d) + {:value=>@days_of_week[index], :position=>[index, 6]} + end + alias :week :rokuyo + + # @private + def rokuyo_value(m,d) + @days_of_week[rokuyo_index(m,d)] + end + + # @private + def rokuyo_index(m,d) + (m*1 + d) % 6 + end + + # @private + def taian(date, base=nil) + count = 0 + d0 = d1 = _to_date_for_note(date) + r0 = r1 = nil + loop do + y,m,d = d1.cal_date + r1 = rokuyo_index(m,d) + break if r1 == 0 + if r0 && r1 > r0 + r1 = r0 + count -= 1 + break + end + d0 = d1 + r0 = r1 + d1 = d0 - When::P1D + count += 1 + end + date -= count if count > 0 + date.events = [@days_of_week[r1]] + date + end + + # + # 暦日を太陰太陽暦日に変換 + # + # @private + def _to_date_for_note(date) + return date if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar) + return When::Japanese ^ date if date.most_significant_coordinate >= 1873 + return Japanese._to_japanese_date(date) + end + + private + + # オブジェクトの正規化 + # @private + def _normalize(args=[], options={}) + @days_of_week ||= When.CalendarNote("RokuyoWeek/Notes::day::Rokuyo") + @event ||= 'taian' + super + end + end +end