when_exe 0.2.100 → 0.3.1
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/LICENSE.ja.txt +25 -25
- data/LICENSE.txt +31 -31
- data/bin/irb.rc +5 -0
- data/bin/locales.rb +2 -2
- data/bin/when.rb +16 -0
- data/bin/when.rb.config +7 -0
- data/lib/when_exe.rb +616 -14
- data/lib/when_exe/basictypes.rb +615 -0
- data/lib/when_exe/calendartypes.rb +1700 -0
- data/lib/when_exe/coordinates.rb +1936 -0
- data/lib/when_exe/core/compatibility.rb +54 -0
- data/lib/when_exe/core/duration.rb +72 -72
- data/lib/when_exe/core/extension.rb +382 -0
- data/lib/when_exe/ephemeris.rb +1845 -0
- data/lib/when_exe/googlecalendar.rb +140 -0
- data/lib/when_exe/icalendar.rb +1587 -0
- data/lib/when_exe/inspect.rb +1237 -0
- data/lib/when_exe/locales/af.rb +90 -0
- data/lib/when_exe/locales/ar.rb +145 -0
- data/lib/when_exe/locales/az.rb +90 -0
- data/lib/when_exe/locales/bg.rb +90 -0
- data/lib/when_exe/locales/bn.rb +94 -0
- data/lib/when_exe/locales/bs.rb +121 -0
- data/lib/when_exe/locales/ca.rb +92 -0
- data/lib/when_exe/locales/cs.rb +107 -0
- data/lib/when_exe/locales/cy.rb +150 -0
- data/lib/when_exe/locales/da.rb +84 -0
- data/lib/when_exe/locales/de.rb +92 -0
- data/lib/when_exe/locales/de_AT.rb +92 -0
- data/lib/when_exe/locales/de_CH.rb +92 -0
- data/lib/when_exe/locales/el.rb +93 -0
- data/lib/when_exe/locales/en.rb +88 -0
- data/lib/when_exe/locales/en_AU.rb +88 -0
- data/lib/when_exe/locales/en_CA.rb +88 -0
- data/lib/when_exe/locales/en_GB.rb +88 -0
- data/lib/when_exe/locales/en_IN.rb +88 -0
- data/lib/when_exe/locales/en_NZ.rb +88 -0
- data/lib/when_exe/locales/eo.rb +89 -0
- data/lib/when_exe/locales/es.rb +84 -0
- data/lib/when_exe/locales/es_419.rb +84 -0
- data/lib/when_exe/locales/es_AR.rb +84 -0
- data/lib/when_exe/locales/es_CL.rb +84 -0
- data/lib/when_exe/locales/es_CO.rb +84 -0
- data/lib/when_exe/locales/es_MX.rb +84 -0
- data/lib/when_exe/locales/es_PE.rb +85 -0
- data/lib/when_exe/locales/es_VE.rb +84 -0
- data/lib/when_exe/locales/et.rb +94 -0
- data/lib/when_exe/locales/eu.rb +95 -0
- data/lib/when_exe/locales/fa.rb +80 -0
- data/lib/when_exe/locales/fi.rb +89 -0
- data/lib/when_exe/locales/fr.rb +88 -0
- data/lib/when_exe/locales/fr_CA.rb +88 -0
- data/lib/when_exe/locales/fr_CH.rb +88 -0
- data/lib/when_exe/locales/gl.rb +81 -0
- data/lib/when_exe/locales/he.rb +84 -0
- data/lib/when_exe/locales/hi.rb +80 -0
- data/lib/when_exe/locales/hi_IN.rb +84 -0
- data/lib/when_exe/locales/hr.rb +128 -0
- data/lib/when_exe/locales/hu.rb +84 -0
- data/lib/when_exe/locales/id.rb +89 -0
- data/lib/when_exe/locales/is.rb +89 -0
- data/lib/when_exe/locales/it.rb +87 -0
- data/lib/when_exe/locales/it_CH.rb +87 -0
- data/lib/when_exe/locales/ja.rb +78 -0
- data/lib/when_exe/locales/kn.rb +86 -0
- data/lib/when_exe/locales/ko.rb +78 -0
- data/lib/when_exe/locales/links.rb +2342 -0
- data/lib/when_exe/locales/lo.rb +123 -0
- data/lib/when_exe/locales/locales.rb +91 -0
- data/lib/when_exe/locales/lt.rb +111 -0
- data/lib/when_exe/locales/lv.rb +118 -0
- data/lib/when_exe/locales/mk.rb +93 -0
- data/lib/when_exe/locales/mn.rb +80 -0
- data/lib/when_exe/locales/nb.rb +81 -0
- data/lib/when_exe/locales/ne.rb +81 -0
- data/lib/when_exe/locales/nl.rb +92 -0
- data/lib/when_exe/locales/nn.rb +73 -0
- data/lib/when_exe/locales/or.rb +84 -0
- data/lib/when_exe/locales/pl.rb +128 -0
- data/lib/when_exe/locales/pt.rb +88 -0
- data/lib/when_exe/locales/pt_BR.rb +88 -0
- data/lib/when_exe/locales/rm.rb +143 -0
- data/lib/when_exe/locales/ro.rb +105 -0
- data/lib/when_exe/locales/ru.rb +128 -0
- data/lib/when_exe/locales/sk.rb +109 -0
- data/lib/when_exe/locales/sl.rb +122 -0
- data/lib/when_exe/locales/sr.rb +122 -0
- data/lib/when_exe/locales/sv.rb +83 -0
- data/lib/when_exe/locales/sw.rb +89 -0
- data/lib/when_exe/locales/th.rb +78 -0
- data/lib/when_exe/locales/tl.rb +99 -0
- data/lib/when_exe/locales/tr.rb +96 -0
- data/lib/when_exe/locales/uk.rb +128 -0
- data/lib/when_exe/locales/uz.rb +128 -0
- data/lib/when_exe/locales/vi.rb +94 -0
- data/lib/when_exe/locales/wo.rb +82 -0
- data/lib/when_exe/locales/zh_CN.rb +77 -0
- data/lib/when_exe/locales/zh_HK.rb +77 -0
- data/lib/when_exe/locales/zh_TW.rb +77 -0
- data/lib/when_exe/mini_application.rb +252 -0
- data/lib/when_exe/parts/enumerator.rb +472 -0
- data/lib/when_exe/parts/geometric_complex.rb +379 -0
- data/lib/when_exe/parts/locale.rb +513 -0
- data/lib/when_exe/parts/method_cash.rb +207 -0
- data/lib/when_exe/parts/resource.rb +806 -0
- data/lib/when_exe/parts/timezone.rb +182 -0
- data/lib/when_exe/region/bahai.rb +145 -0
- data/lib/when_exe/region/balinese.rb +627 -0
- data/lib/when_exe/region/chinese.rb +896 -0
- data/lib/when_exe/region/chinese_calendar.rb +919 -0
- data/lib/when_exe/region/chinese_epoch.rb +1245 -0
- data/lib/when_exe/region/christian.rb +644 -0
- data/lib/when_exe/region/far_east.rb +192 -0
- data/lib/when_exe/region/french.rb +66 -0
- data/lib/when_exe/region/geologicalage.rb +639 -0
- data/lib/when_exe/region/indian.rb +1066 -0
- data/lib/when_exe/region/iranian.rb +66 -0
- data/lib/when_exe/region/islamic.rb +105 -0
- data/lib/when_exe/region/japanese.rb +851 -0
- data/lib/when_exe/region/japanese_notes.rb +964 -0
- data/lib/when_exe/region/japanese_residues.rb +1149 -0
- data/lib/when_exe/region/javanese.rb +228 -0
- data/lib/when_exe/region/jewish.rb +127 -0
- data/lib/when_exe/region/korean.rb +267 -0
- data/lib/when_exe/region/m17n.rb +115 -0
- data/lib/when_exe/region/martian.rb +215 -0
- data/lib/when_exe/region/mayan.rb +122 -0
- data/lib/when_exe/region/moon.rb +333 -0
- data/lib/when_exe/region/nihon_shoki.rb +73 -0
- data/lib/when_exe/region/planets.rb +585 -0
- data/lib/when_exe/region/pope.rb +298 -0
- data/lib/when_exe/region/residue.rb +229 -0
- data/lib/when_exe/region/roman.rb +325 -0
- data/lib/when_exe/region/ryukyu.rb +98 -0
- data/lib/when_exe/region/shire.rb +254 -0
- data/lib/when_exe/region/sun.rb +210 -0
- data/lib/when_exe/region/thai.rb +227 -0
- data/lib/when_exe/region/tibetan.rb +233 -0
- data/lib/when_exe/region/v50.rb +111 -0
- data/lib/when_exe/region/vietnamese.rb +173 -0
- data/lib/when_exe/region/world.rb +197 -0
- data/lib/when_exe/timestandard.rb +547 -0
- data/lib/when_exe/tmduration.rb +330 -330
- data/lib/when_exe/tmobjects.rb +1295 -0
- data/lib/when_exe/tmposition.rb +1955 -0
- data/lib/when_exe/tmreference.rb +1547 -0
- data/lib/when_exe/version.rb +10 -3
- data/link_to_online_documents +4 -0
- data/test/examples/JapanHolidays.ics +456 -0
- data/test/examples/Millennium.ics +17 -0
- data/test/examples/NewYork.ics +61 -0
- data/test/examples/Residue.m17n +135 -0
- data/test/examples/Spatial.m17n +179 -0
- data/test/examples/Terms.m17n +39 -0
- data/test/examples/Test.ics +53 -0
- data/test/examples/USA-DST.ics +61 -0
- data/test/examples/geometric_complex.rb +41 -0
- data/test/examples/sample.xml +14 -0
- data/test/examples/today.rb +61 -0
- data/test/test.rb +54 -19
- data/test/test.rb.config +1 -0
- data/test/test/basictypes.rb +368 -0
- data/test/test/calendartypes.rb +57 -0
- data/test/test/coordinates.rb +380 -0
- data/test/test/ephemeris.rb +127 -0
- data/test/test/googlecalendar.rb +167 -0
- data/test/test/icalendar.rb +848 -0
- data/test/test/inspect.rb +115 -0
- data/test/test/parts.rb +480 -0
- data/test/test/region/chinese.rb +161 -0
- data/test/test/region/french.rb +33 -0
- data/test/test/region/geologicalage.rb +14 -0
- data/test/test/region/indian.rb +55 -0
- data/test/test/region/iran.rb +54 -0
- data/test/test/region/islamic.rb +18 -0
- data/test/test/region/japanese.rb +62 -0
- data/test/test/region/jewish.rb +61 -0
- data/test/test/region/m17n.rb +181 -0
- data/test/test/region/mayan.rb +78 -0
- data/test/test/region/moon.rb +14 -0
- data/test/test/region/planets.rb +14 -0
- data/test/test/region/residue.rb +123 -0
- data/test/test/region/sun.rb +14 -0
- data/test/test/region/thai.rb +94 -0
- data/test/test/region/tibetan.rb +30 -0
- data/test/test/tmobjects.rb +356 -57
- data/test/test/tmposition.rb +237 -0
- data/test/test/tmreference.rb +95 -0
- data/when_exe.gemspec +2 -2
- metadata +187 -7
- data/doc/COPYING +0 -31
- data/doc/COPYING.ja +0 -25
- data/doc/document_url +0 -1
|
@@ -0,0 +1,615 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
=begin
|
|
3
|
+
Copyright (C) 2011-2013 Takashi SUGA
|
|
4
|
+
|
|
5
|
+
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
|
6
|
+
=end
|
|
7
|
+
|
|
8
|
+
module When
|
|
9
|
+
|
|
10
|
+
# ISO 19108 以外の ISO に規定のある基本的なデータ型
|
|
11
|
+
# およびその subclass
|
|
12
|
+
module BasicTypes
|
|
13
|
+
|
|
14
|
+
#
|
|
15
|
+
# ISO 8601 Date and Time Representation
|
|
16
|
+
#
|
|
17
|
+
# see {xml schema}[link:http://www.w3.org/2001/XMLSchema-datatypes#date_time]
|
|
18
|
+
#
|
|
19
|
+
class DateTime < String
|
|
20
|
+
|
|
21
|
+
class << self
|
|
22
|
+
|
|
23
|
+
# When.exe Standard Representation 形式の表現を分解してArray化する
|
|
24
|
+
#
|
|
25
|
+
# @param [String] date_time 日時を表現する When.exe Standard Representation 形式の文字列
|
|
26
|
+
# @param [Hash] options
|
|
27
|
+
# @option options [String, Array<String, Integer>] :era_name デフォルトの年号(Integerは0年に対応する通年)
|
|
28
|
+
# @option options [Array<Numeric>] :abbr 上位省略形式で使用する上位部分
|
|
29
|
+
#
|
|
30
|
+
# @return [Array] format, date, time, clock, era
|
|
31
|
+
#
|
|
32
|
+
# format (Symbol, nil)
|
|
33
|
+
# nil 通常形式
|
|
34
|
+
# :century 世紀指定形式 ('CC', '+CCCC', '-CCCC')
|
|
35
|
+
# :day 年間通算日形式 ('YYDDD'など)
|
|
36
|
+
# :week 暦週形式 ('YYWNN'など)
|
|
37
|
+
#
|
|
38
|
+
# date (Array<Numeric>) 日付部分
|
|
39
|
+
#
|
|
40
|
+
# time (Array<Numeric>) 時刻部分
|
|
41
|
+
#
|
|
42
|
+
# clock (String) 時間帯
|
|
43
|
+
#
|
|
44
|
+
# era (String, Array<String, Integer>) 年号(Integerは0年に対応する通年)
|
|
45
|
+
#
|
|
46
|
+
def _to_array(date_time, options={})
|
|
47
|
+
raise TypeError, "Argument is not ISO 8601 String" unless date_time.kind_of?(String)
|
|
48
|
+
if options[:abbr].kind_of?(When::TimeValue)
|
|
49
|
+
options[:abbr] = ((options[:frame]||When.Calendar('Gregorian')) ^ options[:abbr]).cal_date
|
|
50
|
+
end
|
|
51
|
+
date_time = date_time.gsub(/_+/, '')
|
|
52
|
+
begin
|
|
53
|
+
return _to_array_basic(date_time, options)
|
|
54
|
+
rescue ArgumentError
|
|
55
|
+
return _to_array_extended(date_time, options)
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
private
|
|
60
|
+
|
|
61
|
+
# ISO 8601 基本形式の表現を分解して配列化する
|
|
62
|
+
def _to_array_basic(date_time, options={})
|
|
63
|
+
|
|
64
|
+
case date_time
|
|
65
|
+
# basic date & time format (ISO 8601)
|
|
66
|
+
when /^([-+W\d]+)(?:(T([.,\d]+)?)([A-Z]+|[-+]\d+)?)?$/
|
|
67
|
+
d, t, time, clock = $~[1..4]
|
|
68
|
+
format, date = Date._to_array_basic_ISO8601(d, options)
|
|
69
|
+
|
|
70
|
+
# basic date & time format (JIS X0301)
|
|
71
|
+
when /^([.\d]+)(?:(T([.,\d]+)?)([A-Z]+|[-+]\d+)?)?$/
|
|
72
|
+
raise ArgumentError, "Wrong date format" unless options[:era_name]
|
|
73
|
+
d, t, time, clock = $~[1..4]
|
|
74
|
+
format, date = Date._to_array_basic_X0301(d, options)
|
|
75
|
+
era = options[:era_name]
|
|
76
|
+
|
|
77
|
+
# basic time format (ISO 8601)
|
|
78
|
+
when /^(T(-{0,2}[.,\d]+)?)([A-Z]+|[-+]\d+)?$/
|
|
79
|
+
t, time, clock = $~[1..3]
|
|
80
|
+
|
|
81
|
+
# not supported
|
|
82
|
+
else
|
|
83
|
+
raise ArgumentError, "Wrong date format: #{date_time}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
return [format, date, Time._to_array_basic(time, t, options),
|
|
87
|
+
Time._to_string_clock(clock), era]
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# ISO 8601 拡張形式の表現を分解して配列化する
|
|
91
|
+
def _to_array_extended(date_time, options={})
|
|
92
|
+
|
|
93
|
+
case date_time
|
|
94
|
+
# extended date & time format (ISO 8601)
|
|
95
|
+
when /^([-+*&%@!>=<?\dW.]+)(?:(T([:*=.,\d]+)?)([A-Z]+|[-+][:\d]+)?)?$/
|
|
96
|
+
d, t, time, clock = $~[1..4]
|
|
97
|
+
format, date = Date._to_array_extended_ISO8601(d, options)
|
|
98
|
+
|
|
99
|
+
# extended date & time format (JIS X0301)
|
|
100
|
+
when /^(\[[^\]]+\]|[^-+\d]+)([-+*&%@!>=<?\dW.\(\)]+)?(?:(T([:*=.,\d]+)?)([A-Z]+|[-+][:\d]+)?)?$/
|
|
101
|
+
era, d, t, time, clock = $~[1..5]
|
|
102
|
+
format, date, era = Date._to_array_extended_X0301(d, era, options)
|
|
103
|
+
era ||= options[:era_name] if (d =~ /\./)
|
|
104
|
+
|
|
105
|
+
# extended time format (ISO 8601)
|
|
106
|
+
when /^(T(-{0,2}[:*=.,\d]+)?)([A-Z]+|[-+][:\d]+)?$/
|
|
107
|
+
t, time, clock = $~[1..3]
|
|
108
|
+
|
|
109
|
+
# not supported
|
|
110
|
+
else
|
|
111
|
+
raise ArgumentError, "Wrong date format: #{date_time}"
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
return [format, date, Time._to_array_extended(time, t, options),
|
|
115
|
+
Time._to_string_clock(clock), era]
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
#
|
|
121
|
+
# ISO 8601 Date Representation
|
|
122
|
+
#
|
|
123
|
+
# see {xml schema}[link:http://www.w3.org/2001/XMLSchema-datatypes#date]
|
|
124
|
+
#
|
|
125
|
+
class Date < DateTime
|
|
126
|
+
|
|
127
|
+
class << self
|
|
128
|
+
# ISO 8601 基本形式の表現を分解して配列化する
|
|
129
|
+
def _to_array_basic_ISO8601(date, options={})
|
|
130
|
+
by, bm, bd = options[:abbr]
|
|
131
|
+
case date
|
|
132
|
+
when nil ; return nil
|
|
133
|
+
when /^(\d{4})(\d{2})(\d{2})$/ ; return nil, [$1.to_i, $2.to_i, $3.to_i] # 5.2.1.1
|
|
134
|
+
when /^(\d{4})-(\d{2})$/ ; return nil, [$1.to_i, $2.to_i] # 5.2.1.2
|
|
135
|
+
when /^(\d{4})$/ ; return nil, [$1.to_i] # 5.2.1.2
|
|
136
|
+
when /^(\d{2})$/ ; return :century,[$1.to_i * 100] # 5.2.1.2
|
|
137
|
+
when /^(\d{4})(\d{3})$/ ; return :day, [$1.to_i, $2.to_i] # 5.2.2.1
|
|
138
|
+
when /^(\d{4})W(\d{2})(\d{1})?$/ ; return :week, [$1.to_i, $2.to_i, _int($3)] # 5.2.3.1-2
|
|
139
|
+
when /^([-+]\d{6})(\d{2})(\d{2})$/ ; return nil, [$1.to_i, $2.to_i, $3.to_i] # 5.2.1.4 a)
|
|
140
|
+
when /^([-+]\d{6})-(\d{2})$/ ; return nil, [$1.to_i, $2.to_i] # 5.2.1.4 b)
|
|
141
|
+
when /^([-+]\d{6})$/ ; return nil, [$1.to_i] # 5.2.1.4 c)
|
|
142
|
+
when /^([-+]\d{6})W(\d{2})(\d{1})?$/; return :week, [$1.to_i, $2.to_i, _int($3)] # 5.2.3.4 a-b)
|
|
143
|
+
when /^([+]\d{4})$/ ; return :century,[$1.to_i * 100] # 5.2.1.4 d)
|
|
144
|
+
when /^([-]\d{4})$/ ; return :century,[$1.to_i * 100] unless by # 5.2.1.4 d)
|
|
145
|
+
when /^([-+]\d{6})(\d{3})$/ ; return :day, [$1.to_i, $2.to_i] # 5.2.2.3 a)
|
|
146
|
+
else ; raise ArgumentError, "Wrong date format" unless by
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
by = by.to_i
|
|
150
|
+
case date
|
|
151
|
+
when /^(\d{2})(\d{2})(\d{2})$/ ; return nil, [_century($1,by), $2.to_i, $3.to_i] # 5.2.1.3 a)
|
|
152
|
+
when /^-(\d{2})(\d{2})?$/ ; return nil, [_century($1,by), _int($2)] # 5.2.1.3 b-c)
|
|
153
|
+
when /^--(\d{2})(\d{2})?$/ ; return nil, [by, $1.to_i, _int($2)] # 5.2.1.3 d-e)
|
|
154
|
+
when /^(\d{2})(\d{3})$/ ; return :day, [_century($1,by), $2.to_i] # 5.2.2.2 a)
|
|
155
|
+
when /^-(\d{3})$/ ; return :day, [by, $1.to_i] # 5.2.2.2 b)
|
|
156
|
+
when /^(\d{2})W(\d{2})(\d{1})?$/ ; return :week, [_century($1,by), $2.to_i, _int($3)] # 5.2.3.3 a-b)
|
|
157
|
+
when /^-(\d{1})W(\d{2})(\d{1})?$/ ; return :week, [_decade($1,by), $2.to_i, _int($3)] # 5.2.3.3 c-d)
|
|
158
|
+
when /^-W(\d{2})(\d{1})?$/ ; return :week, [by, $1.to_i, _int($2)] # 5.2.3.3 e-f)
|
|
159
|
+
else ; raise ArgumentError, "Wrong date format" unless bm
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
bm = bm.to_i
|
|
163
|
+
case date
|
|
164
|
+
when /^---(\d{2})$/ ; return nil, [by, bm, $1.to_i] # 5.2.1.3 f)
|
|
165
|
+
when /^-W-(\d{1})$/ ; return :week, [by, bm, $1.to_i] # 5.2.3.3 g)
|
|
166
|
+
when /^----$/ ; return nil, [by, bm, bd.to_i] if bd # extension
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
raise ArgumentError, "Wrong date format: #{date}"
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# JIS X0301 基本形式の表現を分解して配列化する
|
|
173
|
+
def _to_array_basic_X0301(date, options={})
|
|
174
|
+
raise ArgumentError, "Wrong date format" unless date =~ /\./
|
|
175
|
+
date.scan(/\d+\./) do |part|
|
|
176
|
+
raise ArgumentError, "Wrong date format" unless part.length == 3
|
|
177
|
+
end
|
|
178
|
+
_to_array_basic_ISO8601(date.gsub(/\./, ''), {:abbr=>options[:abbr]||1})
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# ISO 8601 拡張形式の表現を分解して配列化する
|
|
182
|
+
def _to_array_extended_ISO8601(date, options={})
|
|
183
|
+
return nil unless date
|
|
184
|
+
abbr = Array(options[:abbr]).dup
|
|
185
|
+
unless date =~ /^([-+]?\d+#{abbr[0] ? '|-' : ''})([-*=.])?(.*)/
|
|
186
|
+
raise ArgumentError, "Wrong date format: #{date}"
|
|
187
|
+
end
|
|
188
|
+
date = $3
|
|
189
|
+
dd = [Coordinates::Pair._en_pair(_completion($1, abbr.shift), $2)]
|
|
190
|
+
while date =~ /^(\d+#{abbr[0] ? '|-' : ''})([-+*&%@!>=<?.])(.+)/
|
|
191
|
+
date = $3
|
|
192
|
+
dd << Coordinates::Pair._en_pair(_completion($1, abbr.shift), $2)
|
|
193
|
+
end
|
|
194
|
+
case date
|
|
195
|
+
when /^W(\d+#{abbr[0] ? '|-' : ''})([-+*&%@!>=<?.])?(\d+)?([-*=?%@])?$/
|
|
196
|
+
dd << Coordinates::Pair._en_pair(_completion($1, abbr.shift), $2)
|
|
197
|
+
dd << Coordinates::Pair._en_pair($3, $4)
|
|
198
|
+
return :week, dd
|
|
199
|
+
when /^(\d{3})$/
|
|
200
|
+
dd << $1.to_i
|
|
201
|
+
return :day, dd
|
|
202
|
+
when /^(\d+#{abbr[0] ? '|-' : ''})([-+*&%@!>=<?.])?$/
|
|
203
|
+
dd << Coordinates::Pair._en_pair(_completion($1, abbr.shift), $2)
|
|
204
|
+
return nil, dd
|
|
205
|
+
when ''
|
|
206
|
+
return nil, dd
|
|
207
|
+
else
|
|
208
|
+
raise ArgumentError, "Wrong date format: #{date}"
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
# JIS X0301 拡張形式の表現を分解して配列化する
|
|
213
|
+
def _to_array_extended_X0301(date, era, options={})
|
|
214
|
+
if (date =~ /^([-+\d]+)\(([-+\d]+)\)(.*)$/)
|
|
215
|
+
year = $2
|
|
216
|
+
date = $1 + $3
|
|
217
|
+
end
|
|
218
|
+
format, date = _to_array_extended_ISO8601(date, options)
|
|
219
|
+
if (year)
|
|
220
|
+
yy = year.to_i
|
|
221
|
+
ee = date[0] * 1
|
|
222
|
+
era = [era, yy-ee, yy+ee]
|
|
223
|
+
end
|
|
224
|
+
return format, date, era
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
private
|
|
228
|
+
|
|
229
|
+
def _completion(digits, base)
|
|
230
|
+
case digits
|
|
231
|
+
when nil ; return nil
|
|
232
|
+
when /^\d{5}/ ; raise ArgumentError, "Wrong date format: #{digits}"
|
|
233
|
+
else ; return digits.to_i unless base
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
base = base.to_i
|
|
237
|
+
case digits
|
|
238
|
+
when '-' ; return base
|
|
239
|
+
when /^-?(\d{1})$/ ; return _decade( $1, base)
|
|
240
|
+
when /^-?(\d{2})$/ ; return _century($1, base)
|
|
241
|
+
else ; return digits.to_i
|
|
242
|
+
end
|
|
243
|
+
end
|
|
244
|
+
|
|
245
|
+
def _century(year, base)
|
|
246
|
+
quotient, remainder = base.divmod(100)
|
|
247
|
+
year = year.to_i
|
|
248
|
+
quotient += 1 if year < remainder
|
|
249
|
+
return quotient * 100 + year
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
def _decade(year, base)
|
|
253
|
+
quotient, remainder = base.divmod(10)
|
|
254
|
+
year = year.to_i
|
|
255
|
+
quotient += 1 if year < remainder
|
|
256
|
+
return quotient * 10 + year
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
def _int(digits)
|
|
260
|
+
return digits ? digits.to_i : nil
|
|
261
|
+
end
|
|
262
|
+
end
|
|
263
|
+
end
|
|
264
|
+
|
|
265
|
+
#
|
|
266
|
+
# ISO 8601 Time Representation
|
|
267
|
+
#
|
|
268
|
+
# see {xml schema}[link:http://www.w3.org/2001/XMLSchema-datatypes#time]
|
|
269
|
+
#
|
|
270
|
+
class Time < DateTime
|
|
271
|
+
|
|
272
|
+
class << self
|
|
273
|
+
# 基本形式の表現を分解して配列化する
|
|
274
|
+
def _to_array_basic(time, t, options={})
|
|
275
|
+
return nil unless t
|
|
276
|
+
return [0] unless time
|
|
277
|
+
time.sub!(/,/, '.')
|
|
278
|
+
unless (time =~ /^(\d{2}(?:\.\d+)?|-)(\d{2}(?:\.\d+)?|-)?(\d{2}(\.\d+)?)?$/)
|
|
279
|
+
raise ArgumentError, "Wrong time format: #{time}"
|
|
280
|
+
end
|
|
281
|
+
indices = options[:frame] ? options[:frame].indices : Coordinates::DefaultDateIndex
|
|
282
|
+
abbr = Array(options[:abbr]).dup
|
|
283
|
+
abbr[0..indices.length] = []
|
|
284
|
+
return [0, Coordinates::Pair._en_number($1=='-' ? abbr[0] : $1, nil),
|
|
285
|
+
Coordinates::Pair._en_number($2=='-' ? abbr[1] : $2, nil),
|
|
286
|
+
Coordinates::Pair._en_number($3, nil)]
|
|
287
|
+
end
|
|
288
|
+
|
|
289
|
+
# 拡張形式の表現を分解して配列化する
|
|
290
|
+
def _to_array_extended(time, t, options={})
|
|
291
|
+
return nil unless t
|
|
292
|
+
return [0] unless time
|
|
293
|
+
indices = options[:frame] ? options[:frame].indices : Coordinates::DefaultDateIndex
|
|
294
|
+
abbr = Array(options[:abbr]).dup
|
|
295
|
+
abbr[0..indices.length] = []
|
|
296
|
+
time.sub!(/,/, '.')
|
|
297
|
+
tt = [0]
|
|
298
|
+
while time =~ /^(\d{2}(?:\.\d+)?|-)([:*=])(.+)/
|
|
299
|
+
time = $3
|
|
300
|
+
tt << Coordinates::Pair._en_pair($1=='-' ? abbr.shift : $1, $2)
|
|
301
|
+
end
|
|
302
|
+
case time
|
|
303
|
+
when /^(\d{2}(\.\d+)?)$/
|
|
304
|
+
tt << Coordinates::Pair._en_number($1, nil)
|
|
305
|
+
when ''
|
|
306
|
+
else
|
|
307
|
+
raise ArgumentError, "Wrong time format: #{time}"
|
|
308
|
+
end
|
|
309
|
+
return tt
|
|
310
|
+
end
|
|
311
|
+
|
|
312
|
+
# 時間帯の表現を正規化する
|
|
313
|
+
def _to_string_clock(clock)
|
|
314
|
+
return nil unless clock
|
|
315
|
+
return clock if (clock =~ /^[A-Z]+$/)
|
|
316
|
+
raise ArgumentError, "Wrong clock format: #{clock}" unless (clock =~ /^([-+])(\d{2})(?::?(\d{2}))?$/)
|
|
317
|
+
s, h, m = $~[1..3]
|
|
318
|
+
return s + h + ':' + (m||'00')
|
|
319
|
+
end
|
|
320
|
+
end
|
|
321
|
+
end
|
|
322
|
+
|
|
323
|
+
# コード
|
|
324
|
+
#
|
|
325
|
+
# 当該コードを定義している辞書, シソーラスまたは機関への参照を
|
|
326
|
+
# オプショナルな codeSpace 属性に保持することができる文字列
|
|
327
|
+
#
|
|
328
|
+
# see {http://schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd#CodeType gml schema}
|
|
329
|
+
#
|
|
330
|
+
class Code < String
|
|
331
|
+
|
|
332
|
+
# an optional codeSpace
|
|
333
|
+
#
|
|
334
|
+
# @return [String] anyURI (Optional)
|
|
335
|
+
attr_reader :code_space
|
|
336
|
+
alias :codeSpace :code_space
|
|
337
|
+
|
|
338
|
+
# オブジェクトの生成
|
|
339
|
+
#
|
|
340
|
+
# @param [String] code Text token
|
|
341
|
+
# @param [String] namespace code を定義している authority の URI
|
|
342
|
+
#
|
|
343
|
+
def initialize(code, namespace=nil)
|
|
344
|
+
@code_space = namespace
|
|
345
|
+
self[0..-1] = code
|
|
346
|
+
end
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
#
|
|
350
|
+
# == 多言語対応文字列
|
|
351
|
+
#
|
|
352
|
+
# 本ライブラリで用いる諸々の用語を多言語対応で曖昧性なく管理するため
|
|
353
|
+
# Code の subclass として定義する
|
|
354
|
+
#
|
|
355
|
+
# == 内部変数
|
|
356
|
+
# === self[ 0..-1 ] : String
|
|
357
|
+
# インスタンスを代表する文字列
|
|
358
|
+
# 通常の String として振舞う場合は、この文字列として振舞う
|
|
359
|
+
#
|
|
360
|
+
# === @locale : Hash
|
|
361
|
+
# インスタンスがさす言葉の諸言語での表現を文字列として保持する
|
|
362
|
+
# locale指定('lang_country.encoding') => その locale での文字列
|
|
363
|
+
# locale指定の要素に省略がある場合、残った共通の要素によって文字列を特定する
|
|
364
|
+
# Ex. @locale = {'en'=>'March', 'ja'=>'三月'} ならば、locale が
|
|
365
|
+
# 'en_US', 'en_GB' のいずれでもlocale での文字列は 'March'
|
|
366
|
+
#
|
|
367
|
+
# === @namespace : Hash
|
|
368
|
+
# インスタンスがさす言葉の意味を特定するための authority の URI を保持する
|
|
369
|
+
# locale指定('lang_country.encoding') => その locale での authority の URI
|
|
370
|
+
# locale指定の要素に省略がある場合、残った共通の要素によってURIを特定する
|
|
371
|
+
# Ex. @locale = {'en'=>'en:March', 'ja'=>'ja:3%E6%9C%88'} ならば、locale が
|
|
372
|
+
# 'en_US', 'en_GB' のいずれでもlocale での authority の URIは 'en:March'
|
|
373
|
+
# 当該用語が標準管理機関で管理されていない場合、wikipedia の当該項目の URI を用いる
|
|
374
|
+
#
|
|
375
|
+
# === @code_space : String
|
|
376
|
+
# 代表的な authority の URI
|
|
377
|
+
# @namespace[''] である
|
|
378
|
+
#
|
|
379
|
+
# see {When::Parts::Locale}, {When::Parts::Resource}
|
|
380
|
+
#
|
|
381
|
+
class M17n < Code
|
|
382
|
+
include Parts::Locale
|
|
383
|
+
include Parts::Resource
|
|
384
|
+
|
|
385
|
+
# @private
|
|
386
|
+
def self._get_locale(locale, access_key)
|
|
387
|
+
return nil unless access_key
|
|
388
|
+
access_key = access_key.split(/\//).map {|key| key =~ /^[0-9]+$/ ? key.to_i : key}
|
|
389
|
+
locale = locale.sub(/\..*/, '').sub(/-/,'_')
|
|
390
|
+
[locale, locale.sub(/_.*/, '')].each do |loc|
|
|
391
|
+
symbol = ('Locale_' + loc).to_sym
|
|
392
|
+
return {loc=>access_key.inject(const_get(symbol)) {|hash, key| hash = hash[key]}} if (const_defined?(symbol))
|
|
393
|
+
end
|
|
394
|
+
return nil
|
|
395
|
+
end
|
|
396
|
+
|
|
397
|
+
#
|
|
398
|
+
# When::BasicTypes::M17n に変換する - 何もしないで自身を返す
|
|
399
|
+
#
|
|
400
|
+
# @return [When::BasicTypes::M17n]
|
|
401
|
+
#
|
|
402
|
+
def to_m17n
|
|
403
|
+
self
|
|
404
|
+
end
|
|
405
|
+
|
|
406
|
+
#
|
|
407
|
+
# 識別文字列
|
|
408
|
+
#
|
|
409
|
+
# @return [String]
|
|
410
|
+
#
|
|
411
|
+
def label
|
|
412
|
+
@label || to_s
|
|
413
|
+
end
|
|
414
|
+
|
|
415
|
+
#
|
|
416
|
+
# _m17n_form のための要素生成 - 何もしないで自身を返す
|
|
417
|
+
#
|
|
418
|
+
# @param [Hash] options 未使用
|
|
419
|
+
#
|
|
420
|
+
# @return [When::BasicTypes::M17n]
|
|
421
|
+
#
|
|
422
|
+
def _to_hash_value(options={})
|
|
423
|
+
self
|
|
424
|
+
end
|
|
425
|
+
|
|
426
|
+
# オブジェクトの生成
|
|
427
|
+
#
|
|
428
|
+
# @overload initialize(names, namespace={}, locale=[])
|
|
429
|
+
# @param [Array<String>] names
|
|
430
|
+
#
|
|
431
|
+
# [String] '*locale:label=prefix:link'
|
|
432
|
+
# * - 存在すれば、label をインスタンスを代表する文字列とする
|
|
433
|
+
# locale - label に対応する locale指定(なければ、locale 引数の指定を用いる)
|
|
434
|
+
# label - locale 指定に対応する label
|
|
435
|
+
# prefix:link - その locale での authority の URI
|
|
436
|
+
# prefix: - namespace 引数の指定により URI に展開する
|
|
437
|
+
# link - なければ labelをURI encodeして用いる
|
|
438
|
+
#
|
|
439
|
+
# @param [Hash] namespace { prefix=>uri }
|
|
440
|
+
#
|
|
441
|
+
# lables, locale 引数の prefix の展開に用いる
|
|
442
|
+
#
|
|
443
|
+
# @param [Array<String>] locale
|
|
444
|
+
#
|
|
445
|
+
# [String] '*locale=prefix:link'
|
|
446
|
+
# * - 存在すれば、label をインスタンスを代表する文字列とする
|
|
447
|
+
# locale - locale指定
|
|
448
|
+
# prefix:link - authority の URI
|
|
449
|
+
# prefix: - namespace 引数の指定により URI に展開する
|
|
450
|
+
#
|
|
451
|
+
# @example
|
|
452
|
+
# M17n.new(['3月', 'fr:Mars=http://fr.wikipedia.org/wiki/Mars_(mois)', 'March'],
|
|
453
|
+
# {'en_wikipedia'=>'http://en.wikipedia.org/wiki/',
|
|
454
|
+
# 'ja_wikipedia'=>'http://ja.wikipedia.org/wiki/'},
|
|
455
|
+
# ['=ja_wikipedia:', '*en=en_wikipedia:']) を行うと、生成された M17n では、
|
|
456
|
+
# @names = {'' =>'3月', 'fr'=>'Mars', 'en'=>'March'}
|
|
457
|
+
# @namespace = {'' =>'http://ja.wikipedia.org/wiki/3%E6%9C%88',
|
|
458
|
+
# 'fr'=>'http://fr.wikipedia.org/wiki/Mars_(mois)',
|
|
459
|
+
# 'en'=>'http://en.wikipedia.org/wiki/March'}
|
|
460
|
+
# となり、通常の String として振舞う場合は 'March' として振舞う
|
|
461
|
+
#
|
|
462
|
+
def initialize(*args)
|
|
463
|
+
rest, options = _attributes(args)
|
|
464
|
+
_sequence
|
|
465
|
+
|
|
466
|
+
if (_pool[@label])
|
|
467
|
+
_copy_all(_pool[@label])
|
|
468
|
+
|
|
469
|
+
else
|
|
470
|
+
if (rest)
|
|
471
|
+
names, namespace, locale = args
|
|
472
|
+
@names = names if names
|
|
473
|
+
@namespace ||= Parts::Locale._namespace(namespace) if namespace
|
|
474
|
+
@locale ||= Parts::Locale._locale(locale) if locale
|
|
475
|
+
end
|
|
476
|
+
@namespace ||= {}
|
|
477
|
+
@locale ||= []
|
|
478
|
+
|
|
479
|
+
@code_space = @namespace['']
|
|
480
|
+
self[0..-1] = _names(@names, @namespace, @locale)
|
|
481
|
+
end
|
|
482
|
+
end
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
#
|
|
486
|
+
# Abstract class for instance having permanent life with IRI
|
|
487
|
+
#
|
|
488
|
+
# see {When::Parts::Resource}
|
|
489
|
+
# see {http://schemas.opengis.net/gml/3.1.1/base/basicTypes.xsd#ObjectType gml schema}
|
|
490
|
+
#
|
|
491
|
+
class Object
|
|
492
|
+
|
|
493
|
+
include Parts::Resource
|
|
494
|
+
|
|
495
|
+
# 名前
|
|
496
|
+
#
|
|
497
|
+
# @return [String, When::BasicTypes::M17n]
|
|
498
|
+
#
|
|
499
|
+
attr_reader :label
|
|
500
|
+
|
|
501
|
+
# オブジェクトのtap
|
|
502
|
+
unless method_defined?(:tap)
|
|
503
|
+
#
|
|
504
|
+
# tap - yield による処理のチェーン化
|
|
505
|
+
#
|
|
506
|
+
def tap
|
|
507
|
+
yield(self)
|
|
508
|
+
self
|
|
509
|
+
end
|
|
510
|
+
end
|
|
511
|
+
|
|
512
|
+
private
|
|
513
|
+
|
|
514
|
+
# オブジェクトの初期化
|
|
515
|
+
def initialize(*args)
|
|
516
|
+
@_lock_ = Mutex.new if When.multi_thread
|
|
517
|
+
_normalize(*_attributes(args))
|
|
518
|
+
_sequence
|
|
519
|
+
end
|
|
520
|
+
end
|
|
521
|
+
end
|
|
522
|
+
|
|
523
|
+
#
|
|
524
|
+
# RS::Identifier を提供する
|
|
525
|
+
#
|
|
526
|
+
module RS
|
|
527
|
+
|
|
528
|
+
# 参照系の識別子
|
|
529
|
+
#
|
|
530
|
+
# see {http://schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd#IdentifierType gml schema}
|
|
531
|
+
#
|
|
532
|
+
class Identifier
|
|
533
|
+
|
|
534
|
+
# The code or name for this Identifier
|
|
535
|
+
#
|
|
536
|
+
# @return [When::BasicTypes::Code]
|
|
537
|
+
#
|
|
538
|
+
attr_reader :name
|
|
539
|
+
|
|
540
|
+
# Identifier of the version of the associated codeSpace or code
|
|
541
|
+
#
|
|
542
|
+
# @return [Array<String>]
|
|
543
|
+
#
|
|
544
|
+
attr_reader :version
|
|
545
|
+
|
|
546
|
+
# Remarks about this code or alias
|
|
547
|
+
#
|
|
548
|
+
# @return [Array<String>] String は URI/IRI文字列の場合あり
|
|
549
|
+
#
|
|
550
|
+
attr_reader :remarks
|
|
551
|
+
|
|
552
|
+
# オブジェクトの生成
|
|
553
|
+
#
|
|
554
|
+
# @param [When::BasicTypes::Code] name
|
|
555
|
+
# @param [Array<String>] version
|
|
556
|
+
# @param [Array<String>] remarks String は URI/IRI文字列の場合あり
|
|
557
|
+
#
|
|
558
|
+
def initialize(name, version=nil, remarks=nil)
|
|
559
|
+
@name = name
|
|
560
|
+
@version = version
|
|
561
|
+
@remarks = remarks
|
|
562
|
+
end
|
|
563
|
+
|
|
564
|
+
# その他のメソッド
|
|
565
|
+
#
|
|
566
|
+
# @note When::RS::Identifier で定義されていないメソッドは
|
|
567
|
+
# 処理を @name (type: When::BasicTypes::Code) に委譲する
|
|
568
|
+
#
|
|
569
|
+
def method_missing(name, *args, &block)
|
|
570
|
+
@name.send(name.to_sym, *args, &block)
|
|
571
|
+
end
|
|
572
|
+
end
|
|
573
|
+
end
|
|
574
|
+
|
|
575
|
+
#
|
|
576
|
+
# EX::Extent を提供する
|
|
577
|
+
#
|
|
578
|
+
module EX
|
|
579
|
+
|
|
580
|
+
# 参照系の時間的および空間的な使用範囲を記述する
|
|
581
|
+
#
|
|
582
|
+
# 本ライブラリでは、時間的使用範囲を記述ためにのみ使用している
|
|
583
|
+
#
|
|
584
|
+
# see {http://schemas.opengis.net/gml/3.1.1/base/referenceSystems.xsd#ExtentType gml schema}
|
|
585
|
+
#
|
|
586
|
+
class Extent
|
|
587
|
+
|
|
588
|
+
# time periods
|
|
589
|
+
#
|
|
590
|
+
# 時間的使用範囲の上限と下限を示す
|
|
591
|
+
#
|
|
592
|
+
# @return [When::TM::Period]
|
|
593
|
+
#
|
|
594
|
+
attr_reader :temporal_extent
|
|
595
|
+
alias :temporalExtent :temporal_extent
|
|
596
|
+
|
|
597
|
+
# オブジェクトの生成
|
|
598
|
+
#
|
|
599
|
+
# @param [When::TM::Period] extent
|
|
600
|
+
#
|
|
601
|
+
def initialize(extent)
|
|
602
|
+
@temporal_extent = extent
|
|
603
|
+
end
|
|
604
|
+
|
|
605
|
+
# その他のメソッド
|
|
606
|
+
#
|
|
607
|
+
# @note When::EX::Extent で定義されていないメソッドは
|
|
608
|
+
# 処理を @temporal_extent (type: When::TM::Period) に委譲する
|
|
609
|
+
#
|
|
610
|
+
def method_missing(name, *args, &block)
|
|
611
|
+
@temporal_extent.send(name.to_sym, *args, &block)
|
|
612
|
+
end
|
|
613
|
+
end
|
|
614
|
+
end
|
|
615
|
+
end
|