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}