lib/when_exe/region/world.rb in when_exe-0.3.5 vs lib/when_exe/region/world.rb in when_exe-0.3.6

- old
+ new

@@ -7,35 +7,26 @@ module When class BasicTypes::M17n - WorldTerms = [self, [ - "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]", + World = [self, [ "locale:[=en:, ja=ja:, alias]", - "names:[WorldTerms=]", + "names:[World=]", "[World=en:The_World_Calendar, 世界暦]" ]] end - class TM::CalendarEra - - World = [self, [ - "namespace:[en=http://en.wikipedia.org/wiki/]", - "area:[Common=]", - ["[BCE=en:BCE_(disambiguation), alias:BeforeCommonEra]0.1.1"], - ["[CE=en:Common_Era, alias:CommonEra]1.1.1", "Calendar Epoch", "01-01-01^World"] - ]] - end - # # 世界暦の暦週 # - class CalendarNote::WorldWeek < CalendarNote + class CalendarNote::WorldWeek < CalendarNote::Week - NoteObjects = [When::BasicTypes::M17n, [ - "namespace:[en=http://en.wikipedia.org/wiki/, ja=http://ja.wikipedia.org/wiki/]", + # + # 暦注要素の定義 + # + Notes = [When::BasicTypes::M17n, [ "locale:[=en:, ja=ja:, alias]", "names:[World]", # 年の暦注 ---------------------------- [When::BasicTypes::M17n, @@ -53,36 +44,44 @@ # 日の暦注 ---------------------------- [When::BasicTypes::M17n, "names:[day]", [When::BasicTypes::M17n, "names:[Week]", - "[Sunday, 日曜日]", - "[Monday, 月曜日]", - "[Tuesday, 火曜日]", - "[Wednesday, 水曜日]", - "[Thursday, 木曜日]", - "[Friday, 金曜日]", - "[Saturday, 土曜日]", - "[Worldsday, 無曜日]" - ] + [DayOfWeek, "label:[Sunday, 日曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Monday, 月曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Tuesday, 火曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Wednesday, 水曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Thursday, 木曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Friday, 金曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Saturday, 土曜日]", {'delta'=>7}], + [DayOfWeek, "label:[Worldsday, 無曜日]", {'delta'=>183}], + ], + + "[Standard_Week]" ] ]] - # イベントの標準的な間隔を返す # @private - def _delta(parameter=nil) - return When::DurationP1W - end + FirstDayOfWeek = [0, 3, 5] * 4 # @private - def worldsday_delta(parameter=nil) - return When::TM::PeriodDuration.new([0,0,7*26+1]) - end + ExtraDayInYear = { + [ 6, 31] => 7, + [12, 31] => 7 + } + # @private + WeekLength = { + [ 6, 30] => 7, + [ 6, 31] => 8, + [12, 30] => 8, + [12, 31] => 8 + } + # 当日または直前の worldsday の日 - # @param date [When::TM::TemporalPosition] - # @param parameter [nil] 未使用 + # @param [When::TM::TemporalPosition] date + # @param [nil] parameter 未使用 # @return [When::TM::TemporalPosition] # def worldsday(date, parameter=nil) event_name = 'worldsday' date = When.Calendar('World').jul_trans(date, {:events=>event_name}) @@ -96,18 +95,18 @@ date end # 当日または直前の week_day の日 # @method week_day(date, parameter=nil) - # @param date [When::TM::TemporalPosition] - # @param parameter [nil] 未使用 + # @param [When::TM::TemporalPosition] date + # @param [nil] parameter 未使用 # @return [When::TM::TemporalPosition] # @note week_day は sunday, monday, tuesday, wednesday, thursday, friday, saturday に読み替えてください。 # @private 7.times do |k| - name = When.CalendarNote('WorldWeek/NoteObjects::day::Week')[k].to_s.downcase + name = When.CalendarNote('WorldWeek/Notes::day::Week')[k].to_s.downcase module_eval %Q{ def #{name}(date, parameter=nil) event_name = 'from_#{name}' date = When.Calendar('World').jul_trans(date, {:events=>[event_name], :precision=>When::DAY}) y,m,d = date.cal_date @@ -116,59 +115,55 @@ dow += 1 if d <= dow && (m == 1 || m == 7 && When.Calendar('World')._sum([y]) == 366) date += When::TM::PeriodDuration.new([0,0,-dow]) date.events = [event_name] date end - - alias :#{name}_delta :_delta } end - alias :week :sunday + # + # この日は何曜? + # + # @param [When::TM::TemporalPosition] date + # @param [When::TM::CalDate] base (not used) + # + # @return [Hash<:value=>When::CalendarNote::Week::DayOfWeek, :position=>Array<Integer>>] + # + def week(date, base=nil) + date = _to_date_for_note(date) + y, m, d = date.cal_date + index = ExtraDayInYear[[m,d]] || (FirstDayOfWeek[m-1] + d - 1) % 7 + length = WeekLength[[m, date.length(When::MONTH)]] || 7 + {:value=>@days_of_week[index], :position=>[index, length]} + end + # + # 暦日を当該暦注計算用クラスに変換 + # + # @private + def _to_date_for_note(date) + date = When::World ^ date unless date.frame.equal?(When::World) + date + end + + private + # オブジェクトの正規化 # @private def _normalize(args=[], options={}) @event ||= 'sunday' super end - - # - # イベントを取得する Enumerator - # - class Enumerator < When::CalendarNote::Enumerator - - # - # 次のイベントを得る - # - # @return [When::TM::TemporalPosition] - # - def succ - value = @current - if @current==:first - @first = event_eval(@first) if @delta.sign < 0 - @current = @first - else - @current = event_eval(@current + @delta) - @current = event_eval(@current + @delta * 2) if @current.to_i == value.to_i - end - return value - end - end end module CalendarTypes # # World calendar based on Gregorian calendar # World = [CyclicTableBased, { - 'label' => When.Resource('_m:WorldTerms::World'), - 'origin_of_LSC' => 1721060, - 'indices' => [ - Coordinates::Index.new({:unit =>12, :trunk=>When.Resource('_m:CalendarTerms::Month::*')}), - Coordinates::DefaultDayIndex - ], - 'rule_table' => { + 'label' => 'World::World', + 'origin_of_LSC' => 1721060, + 'rule_table' => { 'T' => {'Rule' =>['LC', 'SC', 'SC', 'SC']}, 'SC' => {'Rule' =>[365]*4 + [366, 365, 365, 365]*24}, 'LC' => {'Rule' =>[366, 365, 365, 365]*25}, 365 => {'Length'=>[31,30,30]*3 + [31,30,31]}, 366 => {'Length'=>[31,30,30,31,30,31] *2}