when_exe 0.3.5 → 0.3.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/irb.rc +1 -0
- data/bin/locales.rb +8 -6
- data/bin/when.rb +1 -1
- data/lib/when_exe.rb +231 -146
- data/lib/when_exe/basictypes.rb +108 -18
- data/lib/when_exe/calendarnote.rb +263 -116
- data/lib/when_exe/calendartypes.rb +413 -22
- data/lib/when_exe/coordinates.rb +58 -36
- data/lib/when_exe/core/compatibility.rb +8 -6
- data/lib/when_exe/core/extension.rb +40 -15
- data/lib/when_exe/ephemeris.rb +20 -19
- data/lib/when_exe/{region → ephemeris}/moon.rb +4 -4
- data/lib/when_exe/{region/ephemeric_notes.rb → ephemeris/notes.rb} +25 -6
- data/lib/when_exe/{region → ephemeris}/planets.rb +0 -0
- data/lib/when_exe/{region → ephemeris}/sun.rb +7 -3
- data/lib/when_exe/{region → ephemeris}/v50.rb +0 -0
- data/lib/when_exe/googlecalendar.rb +2 -2
- data/lib/when_exe/icalendar.rb +3 -3
- data/lib/when_exe/inspect.rb +130 -70
- data/lib/when_exe/locales/af.rb +2 -2
- data/lib/when_exe/locales/akt.rb +176 -0
- data/lib/when_exe/locales/ar.rb +2 -2
- data/lib/when_exe/locales/{locales.rb → autoload.rb} +6 -2
- data/lib/when_exe/locales/az.rb +2 -2
- data/lib/when_exe/locales/bg.rb +2 -2
- data/lib/when_exe/locales/bn.rb +2 -2
- data/lib/when_exe/locales/bs.rb +2 -2
- data/lib/when_exe/locales/ca.rb +2 -2
- data/lib/when_exe/locales/cs.rb +2 -2
- data/lib/when_exe/locales/cy.rb +2 -2
- data/lib/when_exe/locales/da.rb +2 -2
- data/lib/when_exe/locales/de.rb +2 -2
- data/lib/when_exe/locales/de_AT.rb +2 -2
- data/lib/when_exe/locales/de_CH.rb +2 -2
- data/lib/when_exe/locales/el.rb +2 -2
- data/lib/when_exe/locales/en.rb +2 -2
- data/lib/when_exe/locales/en_AU.rb +2 -2
- data/lib/when_exe/locales/en_CA.rb +2 -2
- data/lib/when_exe/locales/en_GB.rb +2 -2
- data/lib/when_exe/locales/en_IE.rb +2 -2
- data/lib/when_exe/locales/en_IN.rb +3 -3
- data/lib/when_exe/locales/en_NZ.rb +2 -2
- data/lib/when_exe/locales/en_US.rb +2 -2
- data/lib/when_exe/locales/en_ZA.rb +88 -0
- data/lib/when_exe/locales/encoding_conversion.rb +126 -0
- data/lib/when_exe/locales/eo.rb +2 -2
- data/lib/when_exe/locales/es.rb +2 -2
- data/lib/when_exe/locales/es_419.rb +2 -2
- data/lib/when_exe/locales/es_AR.rb +2 -2
- data/lib/when_exe/locales/es_CL.rb +2 -2
- data/lib/when_exe/locales/es_CO.rb +2 -2
- data/lib/when_exe/locales/es_CR.rb +2 -2
- data/lib/when_exe/locales/es_EC.rb +2 -2
- data/lib/when_exe/locales/es_MX.rb +2 -2
- data/lib/when_exe/locales/es_PA.rb +2 -2
- data/lib/when_exe/locales/es_PE.rb +2 -2
- data/lib/when_exe/locales/es_US.rb +84 -0
- data/lib/when_exe/locales/es_VE.rb +2 -2
- data/lib/when_exe/locales/et.rb +2 -2
- data/lib/when_exe/locales/eu.rb +2 -2
- data/lib/when_exe/locales/fa.rb +2 -2
- data/lib/when_exe/locales/fi.rb +3 -3
- data/lib/when_exe/locales/fr.rb +2 -2
- data/lib/when_exe/locales/fr_CA.rb +2 -2
- data/lib/when_exe/locales/fr_CH.rb +2 -2
- data/lib/when_exe/locales/gl.rb +2 -2
- data/lib/when_exe/locales/he.rb +3 -3
- data/lib/when_exe/locales/hi.rb +2 -2
- data/lib/when_exe/locales/hi_IN.rb +2 -2
- data/lib/when_exe/locales/hr.rb +2 -2
- data/lib/when_exe/locales/hu.rb +6 -5
- data/lib/when_exe/locales/iast.rb +90 -0
- data/lib/when_exe/locales/id.rb +2 -2
- data/lib/when_exe/locales/is.rb +2 -2
- data/lib/when_exe/locales/it.rb +2 -2
- data/lib/when_exe/locales/it_CH.rb +2 -2
- data/lib/when_exe/locales/ja.rb +2 -2
- data/lib/when_exe/locales/kn.rb +2 -2
- data/lib/when_exe/locales/ko.rb +2 -2
- data/lib/when_exe/locales/links.rb +3 -3
- data/lib/when_exe/locales/lo.rb +2 -2
- data/lib/when_exe/{parts → locales}/locale.rb +77 -49
- data/lib/when_exe/locales/lt.rb +6 -2
- data/lib/when_exe/locales/lv.rb +2 -2
- data/lib/when_exe/locales/mk.rb +2 -2
- data/lib/when_exe/locales/mn.rb +2 -2
- data/lib/when_exe/locales/ms.rb +2 -2
- data/lib/when_exe/locales/nb.rb +2 -2
- data/lib/when_exe/locales/ne.rb +2 -2
- data/lib/when_exe/locales/nl.rb +2 -2
- data/lib/when_exe/locales/nn.rb +2 -2
- data/lib/when_exe/locales/or.rb +2 -2
- data/lib/when_exe/locales/pl.rb +2 -2
- data/lib/when_exe/locales/pt.rb +2 -2
- data/lib/when_exe/locales/pt_BR.rb +2 -2
- data/lib/when_exe/locales/rm.rb +2 -2
- data/lib/when_exe/locales/ro.rb +2 -2
- data/lib/when_exe/locales/ru.rb +2 -2
- data/lib/when_exe/locales/sk.rb +2 -2
- data/lib/when_exe/locales/sl.rb +2 -2
- data/lib/when_exe/locales/sr.rb +2 -2
- data/lib/when_exe/locales/sv.rb +2 -2
- data/lib/when_exe/locales/sw.rb +2 -2
- data/lib/when_exe/locales/ta.rb +95 -0
- data/lib/when_exe/locales/th.rb +2 -2
- data/lib/when_exe/locales/tl.rb +3 -3
- data/lib/when_exe/locales/tr.rb +2 -2
- data/lib/when_exe/locales/transliteration_table.rb +62 -0
- data/lib/when_exe/locales/uk.rb +15 -15
- data/lib/when_exe/locales/ur.rb +2 -2
- data/lib/when_exe/locales/uz.rb +2 -2
- data/lib/when_exe/locales/vi.rb +2 -2
- data/lib/when_exe/locales/wo.rb +2 -2
- data/lib/when_exe/locales/zh_CN.rb +2 -2
- data/lib/when_exe/locales/zh_HK.rb +15 -15
- data/lib/when_exe/locales/zh_TW.rb +2 -2
- data/lib/when_exe/locales/zh_YUE.rb +77 -0
- data/lib/when_exe/mini_application.rb +22 -12
- data/lib/when_exe/parts/geometric_complex.rb +16 -1
- data/lib/when_exe/parts/method_cash.rb +184 -238
- data/lib/when_exe/parts/resource.rb +65 -16
- data/lib/when_exe/region/armenian.rb +56 -0
- data/lib/when_exe/region/bahai.rb +13 -13
- data/lib/when_exe/region/balinese.rb +33 -35
- data/lib/when_exe/region/chinese.rb +82 -78
- data/lib/when_exe/region/{chinese_calendar.rb → chinese/calendars.rb} +59 -40
- data/lib/when_exe/region/{chinese_epoch.rb → chinese/epochs.rb} +3 -4
- data/lib/when_exe/region/{chinese_twin.rb → chinese/twins.rb} +48 -51
- data/lib/when_exe/region/christian.rb +236 -127
- data/lib/when_exe/region/coptic.rb +9 -10
- data/lib/when_exe/region/dee.rb +48 -0
- data/lib/when_exe/region/discordian.rb +225 -0
- data/lib/when_exe/region/far_east.rb +2 -6
- data/lib/when_exe/region/french.rb +7 -17
- data/lib/when_exe/region/geologicalage.rb +0 -1
- data/lib/when_exe/region/goddess.rb +58 -0
- data/lib/when_exe/region/indian.rb +323 -231
- data/lib/when_exe/region/iranian.rb +159 -22
- data/lib/when_exe/region/islamic.rb +7 -9
- data/lib/when_exe/region/japanese.rb +14 -803
- data/lib/when_exe/region/japanese/calendars.rb +397 -0
- data/lib/when_exe/region/japanese/epochs.rb +426 -0
- data/lib/when_exe/region/{nihon_shoki.rb → japanese/nihon_shoki.rb} +0 -2
- data/lib/when_exe/region/{japanese_notes.rb → japanese/notes.rb} +179 -150
- data/lib/when_exe/region/japanese/residues.rb +1306 -0
- data/lib/when_exe/region/{japanese_twin.rb → japanese/twins.rb} +12 -15
- data/lib/when_exe/region/javanese.rb +16 -14
- data/lib/when_exe/region/jewish.rb +8 -9
- data/lib/when_exe/region/korean.rb +146 -35
- data/lib/when_exe/region/m17n.rb +8 -10
- data/lib/when_exe/region/martian.rb +44 -16
- data/lib/when_exe/region/mayan.rb +12 -10
- data/lib/when_exe/region/pope.rb +0 -1
- data/lib/when_exe/region/residue.rb +4 -5
- data/lib/when_exe/region/roman.rb +20 -24
- data/lib/when_exe/region/ryukyu.rb +3 -4
- data/lib/when_exe/region/shire.rb +97 -94
- data/lib/when_exe/region/symmetry.rb +50 -0
- data/lib/when_exe/region/thai.rb +164 -56
- data/lib/when_exe/region/tibetan.rb +86 -86
- data/lib/when_exe/region/vietnamese.rb +9 -12
- data/lib/when_exe/region/weekdate.rb +80 -0
- data/lib/when_exe/region/world.rb +65 -70
- data/lib/when_exe/region/yerm.rb +98 -0
- data/lib/when_exe/region/zoroastrian.rb +203 -0
- data/lib/when_exe/timestandard.rb +4 -4
- data/lib/when_exe/tmobjects.rb +1 -3
- data/lib/when_exe/tmposition.rb +13 -12
- data/lib/when_exe/tmreference.rb +11 -10
- data/lib/when_exe/version.rb +1 -1
- data/link_to_online_documents +3 -3
- data/test/examples/Residue.m17n +1 -1
- data/test/examples/Terms.m17n +1 -1
- data/test/test.rb +2 -1
- data/test/test/basictypes.rb +18 -2
- data/test/test/calendarnote.rb +1 -1
- data/test/test/calendartypes.rb +1 -1
- data/test/test/coordinates.rb +7 -7
- data/test/test/{region → ephemeris}/moon.rb +0 -0
- data/test/test/{region → ephemeris}/planets.rb +0 -0
- data/test/test/{region → ephemeris}/sun.rb +0 -0
- data/test/test/parts.rb +8 -13
- data/test/test/region/christian.rb +245 -0
- data/test/test/region/french.rb +16 -16
- data/test/test/region/iran.rb +34 -34
- data/test/test/region/japanese.rb +6 -4
- data/test/test/region/m17n.rb +8 -7
- data/test/test/region/mayan.rb +12 -12
- data/test/test/region/residue.rb +20 -4
- data/test/test/region/thai.rb +25 -3
- data/test/test/region/yerm.rb +146 -0
- metadata +39 -20
- data/lib/when_exe/region/japanese_residues.rb +0 -1212
- data/test/test/region/civil.rb +0 -124
data/lib/when_exe/basictypes.rb
CHANGED
@@ -27,6 +27,7 @@ module When
|
|
27
27
|
# @option options [String, Array<String, Integer>] :era_name デフォルトの年号(Integerは0年に対応する通年)
|
28
28
|
# @option options [Array<Numeric>] :abbr 上位省略形式で使用する上位部分
|
29
29
|
# @option options [Integer] :extra_year_digits ISO8601拡大表記のための年の構成要素拡大桁数(省略時 1桁)
|
30
|
+
# @option options [Integer] :ordinal_date_digits ISO8601拡大表記の年内通日の桁数(省略時 3桁)
|
30
31
|
#
|
31
32
|
# @return [Array] format, date, time, clock, era
|
32
33
|
#
|
@@ -47,7 +48,7 @@ module When
|
|
47
48
|
def _to_array(date_time, options={})
|
48
49
|
raise TypeError, "Argument is not ISO 8601 String" unless date_time.kind_of?(String)
|
49
50
|
if options[:abbr].kind_of?(When::TimeValue)
|
50
|
-
options[:abbr] = ((options[:frame]||When
|
51
|
+
options[:abbr] = ((options[:frame]||When::Gregorian) ^ options[:abbr]).cal_date
|
51
52
|
end
|
52
53
|
date_time = date_time.gsub(/_([\d])/, '\1')
|
53
54
|
begin
|
@@ -93,8 +94,12 @@ module When
|
|
93
94
|
|
94
95
|
case date_time
|
95
96
|
# extended date & time format (ISO 8601)
|
96
|
-
when /^([-+*&%@!>=<?\dW
|
97
|
+
when /^([-+*&%@!>=<?\dW.\(\)]+)(?:(T([:*=.,\d]+)?)([A-Z]+(\?.+)?|[-+][:\d]+)?)?$/
|
97
98
|
d, t, time, clock = $~[1..4]
|
99
|
+
if d =~ /[\(\)]/
|
100
|
+
d = When::CalendarTypes::Yerm.parse(d, options[:abbr])
|
101
|
+
options[:frame] ||= 'Yerm'
|
102
|
+
end
|
98
103
|
format, date = Date._to_array_extended_ISO8601(d, options)
|
99
104
|
|
100
105
|
# extended date & time format (JIS X0301)
|
@@ -147,6 +152,11 @@ module When
|
|
147
152
|
end
|
148
153
|
}
|
149
154
|
|
155
|
+
# @private
|
156
|
+
Ordinal_Date_Digits = Hash.new {|hash, key|
|
157
|
+
hash[key] = /^(\d{#{(key || 3).to_i}})$/
|
158
|
+
}
|
159
|
+
|
150
160
|
class << self
|
151
161
|
# ISO 8601 基本形式の表現を分解して配列化する
|
152
162
|
def _to_array_basic_ISO8601(date, options={})
|
@@ -220,7 +230,7 @@ module When
|
|
220
230
|
dd << Coordinates::Pair._en_pair(_completion($1, abbr.shift), $2)
|
221
231
|
dd << Coordinates::Pair._en_pair($3, $4)
|
222
232
|
return :week, dd
|
223
|
-
when
|
233
|
+
when Ordinal_Date_Digits[options[:ordinal_date_digits]]
|
224
234
|
dd << $1.to_i
|
225
235
|
return :day, dd
|
226
236
|
when /^(\d+#{abbr[0] ? '|-' : ''})([-+*&%@!>=<?.])?$/
|
@@ -403,26 +413,82 @@ module When
|
|
403
413
|
# 代表的な authority の URI
|
404
414
|
# @namespace[''] である
|
405
415
|
#
|
406
|
-
# see {When::
|
416
|
+
# see {When::Locale}, {When::Parts::Resource}
|
407
417
|
#
|
408
418
|
class M17n < Code
|
409
|
-
include
|
419
|
+
include When::Locale
|
410
420
|
include Parts::Resource
|
411
421
|
|
412
422
|
# @private
|
413
|
-
|
414
|
-
return nil unless access_key
|
415
|
-
access_key = access_key.split(/\//).map {|key| key =~ /^[0-9]+$/ ? key.to_i : key}
|
416
|
-
locale = locale.sub(/\..*/, '').sub(/-/,'_')
|
417
|
-
[locale, locale.sub(/_.*/, '')].each do |loc|
|
418
|
-
symbol = ('Locale_' + loc).to_sym
|
419
|
-
return {loc=>access_key.inject(const_get(symbol)) {|hash, key| hash = hash[key]}} if (const_defined?(symbol))
|
420
|
-
end
|
421
|
-
return nil
|
422
|
-
end
|
423
|
+
HashProperty = [:label, :names, :link, :access_key, :code_space]
|
423
424
|
|
424
425
|
# @private
|
425
|
-
|
426
|
+
LabelTypes = {
|
427
|
+
'Residue' => ['Coordinates', '%s', '_co:%s%s' ],
|
428
|
+
'Week' => ['CalendarNote', '%sWeek', '_n:%sWeek%s' ],
|
429
|
+
'Notes' => ['CalendarNote', '%s', '_n:%s/Notes%s'],
|
430
|
+
nil => ['BasicTypes::M17n', '%s', '_m:%s%s' ]
|
431
|
+
}
|
432
|
+
|
433
|
+
class << self
|
434
|
+
|
435
|
+
#
|
436
|
+
# resource の取得
|
437
|
+
#
|
438
|
+
# @param [When::Parts::Resource, String] source
|
439
|
+
#
|
440
|
+
# @return [When::Parts::Resource]
|
441
|
+
#
|
442
|
+
# @private
|
443
|
+
def _label(source)
|
444
|
+
case source
|
445
|
+
when Parts::Resource, nil ; return source
|
446
|
+
when Parts::Resource::IRIHeader ; return Parts::Resource._instance(source)
|
447
|
+
end
|
448
|
+
iri = Parts::Resource._abbreviation_to_iri(source, LabelTypes)
|
449
|
+
iri ? Parts::Resource._instance(iri) : nil
|
450
|
+
end
|
451
|
+
|
452
|
+
#
|
453
|
+
# label の取得
|
454
|
+
#
|
455
|
+
# @param [When::Parts::Resource, String] source
|
456
|
+
#
|
457
|
+
# @return [When::BasicTypes::M17n, String]
|
458
|
+
#
|
459
|
+
def label(source)
|
460
|
+
resource = _label(source)
|
461
|
+
case resource
|
462
|
+
when nil ; return source
|
463
|
+
when M17n ; return resource
|
464
|
+
when Parts::Resource ; return resource.label
|
465
|
+
else ; return resource
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
469
|
+
#
|
470
|
+
# label の Array の取得
|
471
|
+
#
|
472
|
+
# @param [When::Parts::Resource, Array] source
|
473
|
+
#
|
474
|
+
# @return [Array]
|
475
|
+
#
|
476
|
+
def labels(source)
|
477
|
+
array =
|
478
|
+
if source.kind_of?(Array)
|
479
|
+
source
|
480
|
+
else
|
481
|
+
resource = _label(source)
|
482
|
+
return nil unless resource
|
483
|
+
resource.child
|
484
|
+
end
|
485
|
+
case array[0]
|
486
|
+
when M17n ; return array
|
487
|
+
when Parts::Resource ; return array.map {|v| v.label}
|
488
|
+
else ; return array
|
489
|
+
end
|
490
|
+
end
|
491
|
+
end
|
426
492
|
|
427
493
|
#
|
428
494
|
# 代表名
|
@@ -447,6 +513,30 @@ module When
|
|
447
513
|
self
|
448
514
|
end
|
449
515
|
|
516
|
+
#
|
517
|
+
# 内部エンコーディング文字列化
|
518
|
+
#
|
519
|
+
def to_internal_encoding
|
520
|
+
_copy({:label => When::EncodingConversion.to_internal_encoding(to_s),
|
521
|
+
:names => Hash[*(names.keys.map {|name| [name, When::EncodingConversion.to_internal_encoding(names[name])]}).flatten],
|
522
|
+
:link => link,
|
523
|
+
:access_key => access_key,
|
524
|
+
:code_space => code_space
|
525
|
+
})
|
526
|
+
end
|
527
|
+
|
528
|
+
#
|
529
|
+
# 外部エンコーディング文字列化
|
530
|
+
#
|
531
|
+
def to_external_encoding
|
532
|
+
_copy({:label => When::EncodingConversion.to_external_encoding(to_s),
|
533
|
+
:names => Hash[*(names.keys.map {|name| [name, When::EncodingConversion.to_external_encoding(names[name])]}).flatten],
|
534
|
+
:link => link,
|
535
|
+
:access_key => access_key,
|
536
|
+
:code_space => code_space
|
537
|
+
})
|
538
|
+
end
|
539
|
+
|
450
540
|
# オブジェクトの生成
|
451
541
|
#
|
452
542
|
# @overload initialize(names, namespace={}, locale=[])
|
@@ -512,8 +602,8 @@ module When
|
|
512
602
|
else
|
513
603
|
names, namespace, locale = rest
|
514
604
|
@names = names if names
|
515
|
-
@namespace ||=
|
516
|
-
@locale ||=
|
605
|
+
@namespace ||= When::Locale._namespace(namespace) if namespace
|
606
|
+
@locale ||= When::Locale._locale(locale) if locale
|
517
607
|
end
|
518
608
|
@namespace ||= {}
|
519
609
|
@locale ||= []
|
@@ -53,7 +53,7 @@ module When
|
|
53
53
|
#
|
54
54
|
# 暦注検索結果を保存するコンテナ
|
55
55
|
#
|
56
|
-
module
|
56
|
+
module NotesContainer
|
57
57
|
|
58
58
|
class << self
|
59
59
|
#
|
@@ -83,6 +83,7 @@ module When
|
|
83
83
|
# @private
|
84
84
|
def verify(pattern, value)
|
85
85
|
value = value.label if !value.kind_of?(When::BasicTypes::M17n) && value.respond_to?(:label)
|
86
|
+
pattern = When::EncodingConversion.to_internal_encoding(pattern)
|
86
87
|
pattern.kind_of?(Regexp) ? value =~ pattern : value == pattern
|
87
88
|
end
|
88
89
|
end
|
@@ -91,18 +92,18 @@ module When
|
|
91
92
|
#
|
92
93
|
# @param [Boolean] compact 余分な nil や空配列を除去するか否か
|
93
94
|
#
|
94
|
-
# @return [
|
95
|
+
# @return [NotesContainer]
|
95
96
|
#
|
96
97
|
def simplify(compact=true)
|
97
98
|
if kind_of?(Hash) && !key?(:note)
|
98
|
-
# Persistent
|
99
|
+
# Persistent NotesContainer
|
99
100
|
simplified = {}
|
100
101
|
each_pair do |key, value|
|
101
|
-
value = value.simplify(compact) if value.kind_of?(
|
102
|
+
value = value.simplify(compact) if value.kind_of?(NotesContainer)
|
102
103
|
simplified[key] = value if value
|
103
104
|
end
|
104
105
|
else
|
105
|
-
# Non-Persistent
|
106
|
+
# Non-Persistent NotesContainer
|
106
107
|
simplified = self
|
107
108
|
simplified = _compact(simplified) if compact
|
108
109
|
simplified = simplified[0] while simplified.kind_of?(Array) && simplified.size <= 1
|
@@ -121,13 +122,13 @@ module When
|
|
121
122
|
#
|
122
123
|
def value(compact=true, symbol=:value)
|
123
124
|
if kind_of?(Hash) && !key?(:note)
|
124
|
-
# Persistent
|
125
|
+
# Persistent NotesContainer
|
125
126
|
sliced = {}
|
126
127
|
each_pair do |key, val|
|
127
128
|
sliced[key] = val[symbol]
|
128
129
|
end
|
129
130
|
else
|
130
|
-
# Non-Persistent
|
131
|
+
# Non-Persistent NotesContainer
|
131
132
|
return _bless(slice(symbol)) if symbol.kind_of?(Integer)
|
132
133
|
sliced = _dig(self) {|target| target.fetch(symbol, nil)}
|
133
134
|
end
|
@@ -156,16 +157,16 @@ module When
|
|
156
157
|
#
|
157
158
|
def subset(condition, compact=true)
|
158
159
|
if kind_of?(Hash) && !key?(:note)
|
159
|
-
# Persistent
|
160
|
+
# Persistent NotesContainer
|
160
161
|
result = {}
|
161
162
|
each_pair do |key, value|
|
162
|
-
value = value.subset(condition, compact) if value.kind_of?(
|
163
|
+
value = value.subset(condition, compact) if value.kind_of?(NotesContainer)
|
163
164
|
result[key] = value if value
|
164
165
|
end
|
165
166
|
else
|
166
|
-
# Non-Persistent
|
167
|
+
# Non-Persistent NotesContainer
|
167
168
|
result = _dig(self) {|target|
|
168
|
-
(condition.each_pair {|key, pattern| break nil unless
|
169
|
+
(condition.each_pair {|key, pattern| break nil unless NotesContainer.verify(pattern, target[key])}) ? target : nil
|
169
170
|
}
|
170
171
|
result = _compact(result) if compact
|
171
172
|
end
|
@@ -175,10 +176,10 @@ module When
|
|
175
176
|
private
|
176
177
|
|
177
178
|
#
|
178
|
-
# 対象オブジェクトを
|
179
|
+
# 対象オブジェクトを NotesContainer にする
|
179
180
|
#
|
180
181
|
def _bless(target)
|
181
|
-
target.extend(
|
182
|
+
target.extend(NotesContainer) if target && !equal?(target)
|
182
183
|
target
|
183
184
|
end
|
184
185
|
|
@@ -201,6 +202,11 @@ module When
|
|
201
202
|
end
|
202
203
|
end
|
203
204
|
|
205
|
+
#
|
206
|
+
# 暦法によってイベントの動作を変えるか否か
|
207
|
+
#
|
208
|
+
CalendarDepend = false
|
209
|
+
|
204
210
|
# デフォルトイベント名
|
205
211
|
#
|
206
212
|
# @return [String]
|
@@ -307,13 +313,13 @@ module When
|
|
307
313
|
# see {When::TM::TemporalPosition._instance}
|
308
314
|
#
|
309
315
|
# @note CalendarNoteオブジェクト生成時に _normalize メソッド内で @prime 変数を設定しておけば、
|
310
|
-
# 本メソッドの :prime オプションで参照される。(
|
316
|
+
# 本メソッドの :prime オプションで参照される。(Balinese#_normalize等参照)
|
311
317
|
#
|
312
|
-
# @note 暦注のビットアドレスは、暦注サブクラスの
|
318
|
+
# @note 暦注のビットアドレスは、暦注サブクラスのNotes定数の中の定義順序による。
|
313
319
|
# When::CalendarNote クラスの場合 new の引数とした暦注要素リストの定義順序による。
|
314
320
|
# ビットアドレスの値が 1 の暦注が計算対象となる。
|
315
321
|
#
|
316
|
-
# @return [Array<Array<Hash>>] 暦注計算結果(When::CalendarNote::
|
322
|
+
# @return [Array<Array<Hash>>] 暦注計算結果(When::CalendarNote::NotesContainerモジュールをextendしている)
|
317
323
|
# [ :note => 暦注要素 (When::Coordinates::Residue, String, When::BasicTypes::M17n) ]
|
318
324
|
# [ :value => 暦注の値 (When::Coordinates::Residue, String, When::BasicTypes::M17n, When::TM::TemporalPosition) ]
|
319
325
|
#
|
@@ -325,23 +331,13 @@ module When
|
|
325
331
|
#
|
326
332
|
def notes(date, options={})
|
327
333
|
dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
|
328
|
-
retrieved =
|
334
|
+
retrieved = NotesContainer.retrieve(persistence, date.to_i)
|
329
335
|
return retrieved unless retrieved == false
|
330
|
-
|
336
|
+
NotesContainer.register(indices.map {|i|
|
331
337
|
next [] unless i <= date.precision
|
332
338
|
_note_values(dates, notes[i-1], _all_keys[i-1], _elements[i-1]) do |dates, focused_notes, notes_hash|
|
333
339
|
focused_notes.each do |note|
|
334
|
-
|
335
|
-
void, event, *parameter = note.split(/^([^\d]+)/)
|
336
|
-
method = event.downcase
|
337
|
-
parameter << conditions unless conditions.empty?
|
338
|
-
notes_hash[note] =
|
339
|
-
if respond_to?(method)
|
340
|
-
send(method, dates, *parameter)
|
341
|
-
else
|
342
|
-
_elements[i-1][note].send(When::Coordinates::PRECISION_NAME[i].downcase, dates)
|
343
|
-
end
|
344
|
-
end
|
340
|
+
notes_hash[note] ||= _note_element(note, i, conditions, dates)
|
345
341
|
end
|
346
342
|
notes_hash
|
347
343
|
end
|
@@ -365,7 +361,7 @@ module When
|
|
365
361
|
# [ false - 暦注が不一致 ]
|
366
362
|
#
|
367
363
|
def note?(date, options={})
|
368
|
-
options = _find_note(options) if options.kind_of?(String)
|
364
|
+
options = _find_note(options) if options.kind_of?(String) || options.kind_of?(Regexp)
|
369
365
|
pattern = options.delete(:value) if options.kind_of?(Hash)
|
370
366
|
result = notes(date, options)
|
371
367
|
result.flatten!
|
@@ -373,7 +369,7 @@ module When
|
|
373
369
|
return false unless result.size > 0
|
374
370
|
return true unless pattern
|
375
371
|
result.each do |hash|
|
376
|
-
return true if
|
372
|
+
return true if NotesContainer.verify(pattern, hash[:value])
|
377
373
|
end
|
378
374
|
return false
|
379
375
|
end
|
@@ -404,12 +400,60 @@ module When
|
|
404
400
|
|
405
401
|
private
|
406
402
|
|
403
|
+
#
|
404
|
+
# 年月日暦注計算の共通処理 - コールバック元
|
405
|
+
#
|
406
|
+
def _note_values(dates, focused_notes, all_notes, note_objects)
|
407
|
+
return [] unless dates && all_notes
|
408
|
+
|
409
|
+
# prepare focused notes
|
410
|
+
case focused_notes
|
411
|
+
when Integer
|
412
|
+
bits = ~focused_notes << 1
|
413
|
+
focused_notes = all_notes.dup.delete_if { (bits>>=1)[0] == 1 }
|
414
|
+
when []
|
415
|
+
focused_notes = all_notes
|
416
|
+
when nil
|
417
|
+
focused_notes = []
|
418
|
+
end
|
419
|
+
focused_notes = focused_notes.dup
|
420
|
+
not_focused_notes = all_notes - focused_notes
|
421
|
+
notes = {}
|
422
|
+
not_focused_notes.each do |note|
|
423
|
+
notes[note] = true
|
424
|
+
end
|
425
|
+
focused_notes.each do |note|
|
426
|
+
notes[note] = nil
|
427
|
+
end
|
428
|
+
|
429
|
+
# update notes
|
430
|
+
focused_notes_actual = focused_notes.dup
|
431
|
+
notes = yield(dates, focused_notes_actual, notes)
|
432
|
+
notes.keys.each do |note|
|
433
|
+
notes.delete(note) unless focused_notes_actual.include?(note)
|
434
|
+
end
|
435
|
+
|
436
|
+
# return Array of Hash
|
437
|
+
focused_notes.map {|note|
|
438
|
+
case notes[note]
|
439
|
+
when nil, false ; {}
|
440
|
+
when Hash ; {:note=>note_objects[note].label}.merge(notes[note])
|
441
|
+
else
|
442
|
+
if note_objects[note].respond_to?(:to_note_hash)
|
443
|
+
note_objects[note].to_note_hash(notes[note], dates)
|
444
|
+
else
|
445
|
+
{:note=>note_objects[note].label, :value=>notes[note]}
|
446
|
+
end
|
447
|
+
end
|
448
|
+
}
|
449
|
+
end
|
450
|
+
|
407
451
|
#
|
408
452
|
# オブジェクトの正規化
|
409
453
|
#
|
410
454
|
def _normalize(args=[], options={})
|
411
|
-
@_elements = (args.size == 0 && self.class.const_defined?(:
|
412
|
-
When::Parts::Resource.base_uri + self.class.to_s.split(/::/)[1..-1].join('/') + '/
|
455
|
+
@_elements = (args.size == 0 && self.class.const_defined?(:Notes)) ?
|
456
|
+
When::Parts::Resource.base_uri + self.class.to_s.split(/::/)[1..-1].join('/') + '/Notes' :
|
413
457
|
_to_iri(args, options[:prefix] || '_co:')
|
414
458
|
if @_elements.kind_of?(Array)
|
415
459
|
@_elements.each do |e|
|
@@ -418,6 +462,34 @@ module When
|
|
418
462
|
end
|
419
463
|
end
|
420
464
|
|
465
|
+
#
|
466
|
+
# 再帰的に配列の中を Resource化する
|
467
|
+
#
|
468
|
+
def _to_iri(args, prefix)
|
469
|
+
args.map {|arg|
|
470
|
+
case arg
|
471
|
+
when String
|
472
|
+
arg, method = $1, $2 if (arg =~ /^(.+)#([_A-Z0-9]+)$/i)
|
473
|
+
obj = When.Resource(arg, prefix)
|
474
|
+
obj = obj.copy(method) if method
|
475
|
+
obj
|
476
|
+
when Array
|
477
|
+
_to_iri(arg, prefix)
|
478
|
+
else
|
479
|
+
arg
|
480
|
+
end
|
481
|
+
}
|
482
|
+
end
|
483
|
+
|
484
|
+
#
|
485
|
+
# 暦日を当該暦注計算用クラスに変換
|
486
|
+
#
|
487
|
+
# 基底クラスである本クラスでは何もしないで、引数をそのまま返す
|
488
|
+
#
|
489
|
+
def _to_date_for_note(date)
|
490
|
+
date
|
491
|
+
end
|
492
|
+
|
421
493
|
# 暦注要素
|
422
494
|
#
|
423
495
|
# @return [Array<Array<When::Parts::Resource>>]
|
@@ -457,8 +529,8 @@ module When
|
|
457
529
|
def _parse_note(date, options)
|
458
530
|
options =
|
459
531
|
case options
|
460
|
-
when Hash ; options
|
461
|
-
when String ; {:notes => options}
|
532
|
+
when Hash ; When::EncodingConversion.to_internal_encoding(options)
|
533
|
+
when String ; {:notes => When::EncodingConversion.to_internal_encoding(options)}
|
462
534
|
when Integer ; {:indices => options}
|
463
535
|
else ; {}
|
464
536
|
end
|
@@ -473,12 +545,27 @@ module When
|
|
473
545
|
[_to_date_for_note(date), indices, notes, persistence, conditions, options]
|
474
546
|
end
|
475
547
|
|
548
|
+
#
|
549
|
+
# 暦注を計算する暦座標の配列
|
550
|
+
#
|
551
|
+
# @return [Array<Integer>]
|
552
|
+
#
|
553
|
+
def _indices(indices, notes)
|
554
|
+
case indices
|
555
|
+
when nil ; (0...notes.size).to_a.reverse.map {|i| -i}
|
556
|
+
when Range ; indices.to_a
|
557
|
+
when Array ; indices
|
558
|
+
else ; [indices.to_i]
|
559
|
+
end
|
560
|
+
end
|
561
|
+
|
476
562
|
#
|
477
563
|
# notes メソッドの 文字列引数の意味を解釈する
|
478
564
|
#
|
479
565
|
# @return [Hash] options for note String
|
480
566
|
#
|
481
567
|
def _find_note(note)
|
568
|
+
note = When::EncodingConversion.to_internal_encoding(note)
|
482
569
|
_elements.each_index do |index|
|
483
570
|
return {:notes=>note, :indices => [-index]} if _elements[-1-index]._pool[note]
|
484
571
|
end
|
@@ -501,88 +588,20 @@ module When
|
|
501
588
|
end
|
502
589
|
|
503
590
|
#
|
504
|
-
#
|
505
|
-
#
|
506
|
-
# @return [Array<Integer>]
|
507
|
-
#
|
508
|
-
def _indices(indices, notes)
|
509
|
-
case indices
|
510
|
-
when nil ; (0...notes.size).to_a.reverse.map {|i| -i}
|
511
|
-
when Range ; indices.to_a
|
512
|
-
when Array ; indices
|
513
|
-
else ; [indices.to_i]
|
514
|
-
end
|
515
|
-
end
|
516
|
-
|
517
|
-
#
|
518
|
-
# 年月日暦注計算の共通処理 - コールバック元
|
519
|
-
#
|
520
|
-
def _note_values(dates, focused_notes, all_notes, note_objects)
|
521
|
-
return [] unless dates && all_notes
|
522
|
-
|
523
|
-
# prepare focused notes
|
524
|
-
case focused_notes
|
525
|
-
when Integer
|
526
|
-
bits = ~focused_notes << 1
|
527
|
-
focused_notes = all_notes.dup.delete_if { (bits>>=1)[0] == 1 }
|
528
|
-
when []
|
529
|
-
focused_notes = all_notes
|
530
|
-
when nil
|
531
|
-
focused_notes = []
|
532
|
-
end
|
533
|
-
focused_notes = focused_notes.dup
|
534
|
-
not_focused_notes = all_notes - focused_notes
|
535
|
-
notes = {}
|
536
|
-
not_focused_notes.each do |note|
|
537
|
-
notes[note] = true
|
538
|
-
end
|
539
|
-
focused_notes.each do |note|
|
540
|
-
notes[note] = nil
|
541
|
-
end
|
542
|
-
|
543
|
-
# update notes
|
544
|
-
notes = yield(dates, focused_notes, notes)
|
545
|
-
notes.keys.each do |note|
|
546
|
-
notes.delete(note) unless focused_notes.include?(note)
|
547
|
-
end
|
548
|
-
|
549
|
-
# return Array of Hash
|
550
|
-
focused_notes.map {|note|
|
551
|
-
next {} unless notes[note]
|
552
|
-
if note_objects[note].respond_to?(:to_note_hash)
|
553
|
-
note_objects[note].to_note_hash(notes[note], dates)
|
554
|
-
else
|
555
|
-
{:note=>note_objects[note].label, :value=>notes[note]}
|
556
|
-
end
|
557
|
-
}
|
558
|
-
end
|
559
|
-
|
560
|
-
#
|
561
|
-
# 再帰的に配列の中を Resource化する
|
562
|
-
#
|
563
|
-
def _to_iri(args, prefix)
|
564
|
-
args.map {|arg|
|
565
|
-
case arg
|
566
|
-
when String
|
567
|
-
arg, method = $1, $2 if (arg =~ /^(.+)#([_A-Z0-9]+)$/i)
|
568
|
-
obj = When.Resource(arg, prefix)
|
569
|
-
obj = obj.copy(method) if method
|
570
|
-
obj
|
571
|
-
when Array
|
572
|
-
_to_iri(arg, prefix)
|
573
|
-
else
|
574
|
-
arg
|
575
|
-
end
|
576
|
-
}
|
577
|
-
end
|
578
|
-
|
579
|
-
#
|
580
|
-
# 暦日を当該暦注計算用クラスに変換
|
581
|
-
#
|
582
|
-
# 基底クラスである本クラスでは何もしないで、引数をそのまま返す
|
591
|
+
# 暦注の計算
|
583
592
|
#
|
584
|
-
|
585
|
-
|
593
|
+
# @return [Object] 暦注の値
|
594
|
+
#
|
595
|
+
def _note_element(note, index, conditions, dates)
|
596
|
+
void, event, *parameter = note.split(/^([^\d]+)/)
|
597
|
+
method = event.downcase
|
598
|
+
parameter << conditions unless conditions.empty?
|
599
|
+
return send(method, dates, *parameter) if respond_to?(method)
|
600
|
+
root = _elements[index-1][note]
|
601
|
+
parent, leaf = root.iri.split('/Notes') if root.kind_of?(When::Parts::Resource)
|
602
|
+
parent = When.Resource(parent) if leaf
|
603
|
+
return parent.send(method, dates, *parameter) if parent.respond_to?(method)
|
604
|
+
root.send(When::Coordinates::PRECISION_NAME[index].downcase, dates)
|
586
605
|
end
|
587
606
|
|
588
607
|
#
|
@@ -650,5 +669,133 @@ module When
|
|
650
669
|
super(@parent, date, direction, options)
|
651
670
|
end
|
652
671
|
end
|
672
|
+
|
673
|
+
#
|
674
|
+
# 暦週
|
675
|
+
#
|
676
|
+
class Week < CalendarNote
|
677
|
+
|
678
|
+
#
|
679
|
+
# 暦週要素
|
680
|
+
#
|
681
|
+
class DayOfWeek < When::BasicTypes::M17n
|
682
|
+
|
683
|
+
# 当該暦週要素の標準的な出現間隔
|
684
|
+
#
|
685
|
+
# @return [Integer]
|
686
|
+
#
|
687
|
+
attr_reader :delta
|
688
|
+
|
689
|
+
# 所属する暦週オブジェクト
|
690
|
+
#
|
691
|
+
# @return [When::CalendarNote]
|
692
|
+
#
|
693
|
+
def week_note
|
694
|
+
@week_note ||= When.CalendarNote(iri.split('/Notes').first)
|
695
|
+
end
|
696
|
+
|
697
|
+
# 当日または直前に当該暦週要素が現れる日付
|
698
|
+
#
|
699
|
+
# @return [When::TM::TemporalPosition]
|
700
|
+
#
|
701
|
+
def just_or_last(date)
|
702
|
+
date = week_note._to_date_for_note(date)
|
703
|
+
([parent.child.length, @delta[When::DAY]].max*2).times do
|
704
|
+
if equal?(week_note.week(date))
|
705
|
+
date.events ||= []
|
706
|
+
date.events << self
|
707
|
+
return date
|
708
|
+
end
|
709
|
+
date -= When::P1D
|
710
|
+
end
|
711
|
+
raise ArgumentError, "#{self} not found"
|
712
|
+
end
|
713
|
+
|
714
|
+
private
|
715
|
+
|
716
|
+
#
|
717
|
+
# オブジェクトの正規化
|
718
|
+
#
|
719
|
+
def initialize(*args)
|
720
|
+
super
|
721
|
+
@delta = When::P1D * @delta.to_i if @delta && ! @delta.kind_of?(When::TM::Duration)
|
722
|
+
end
|
723
|
+
end
|
724
|
+
|
725
|
+
#
|
726
|
+
# 曜日の名前の一覧
|
727
|
+
#
|
728
|
+
# @param [When::TM::TemporalPosition] date
|
729
|
+
#
|
730
|
+
# @return [Array<When::CalendarNote::Week::DayOfWeek>]
|
731
|
+
#
|
732
|
+
def week_labels(date)
|
733
|
+
@days_of_week.child[0...week(date)[:position].last]
|
734
|
+
end
|
735
|
+
|
736
|
+
# 七曜
|
737
|
+
#
|
738
|
+
# @param [When::TM::TemporalPosition] date
|
739
|
+
#
|
740
|
+
# @return [When::Coordinates::Residue] 七曜
|
741
|
+
#
|
742
|
+
def standard_week(date)
|
743
|
+
When.Residue('Week')[date.to_i % 7]
|
744
|
+
end
|
745
|
+
|
746
|
+
#
|
747
|
+
# オブジェクトの正規化
|
748
|
+
#
|
749
|
+
def _normalize(args=[], options={})
|
750
|
+
super
|
751
|
+
@days_of_week = When.CalendarNote("#{self.class.to_s.split('::').last}/Notes::day::Week")
|
752
|
+
@days_of_week.child.length.times do |index|
|
753
|
+
name = @days_of_week.child[index].label.to_s.downcase.gsub(/[- ]/, '_')
|
754
|
+
self.class.module_eval %Q{
|
755
|
+
def #{name}(date, parameter=nil)
|
756
|
+
@days_of_week.child[#{index}].just_or_last(date)
|
757
|
+
end
|
758
|
+
} unless respond_to?(name)
|
759
|
+
self.class.module_eval %Q{
|
760
|
+
def #{name}_delta(parameter=nil)
|
761
|
+
@days_of_week.child[#{index}].delta
|
762
|
+
end
|
763
|
+
} unless respond_to?(name + '_delta')
|
764
|
+
end
|
765
|
+
end
|
766
|
+
|
767
|
+
#
|
768
|
+
# イベントを取得する Enumerator
|
769
|
+
#
|
770
|
+
class Enumerator < When::CalendarNote::Enumerator
|
771
|
+
|
772
|
+
#
|
773
|
+
# 次のイベントを得る
|
774
|
+
#
|
775
|
+
# @return [When::TM::TemporalPosition]
|
776
|
+
#
|
777
|
+
def succ
|
778
|
+
value = @current
|
779
|
+
plus = @delta.sign > 0
|
780
|
+
if @current==:first
|
781
|
+
@first = event_eval(@first) unless plus
|
782
|
+
@current = @first
|
783
|
+
else
|
784
|
+
if plus
|
785
|
+
@current = event_eval(@current + @delta)
|
786
|
+
else
|
787
|
+
@last = event_eval(@current - When::P1D)
|
788
|
+
@current = event_eval(@current + @delta)
|
789
|
+
unless [@current.to_i, value.to_i].include?(@last.to_i)
|
790
|
+
@current = @last
|
791
|
+
return value
|
792
|
+
end
|
793
|
+
end
|
794
|
+
@current = event_eval(@current + @delta * 2) if @current.to_i == value.to_i
|
795
|
+
end
|
796
|
+
return value
|
797
|
+
end
|
798
|
+
end
|
799
|
+
end
|
653
800
|
end
|
654
801
|
end
|