relaton-ieee 1.9.1 → 1.10.0

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.
@@ -0,0 +1,515 @@
1
+ require "relaton_ieee/pub_id"
2
+
3
+ module RelatonIeee
4
+ module RawbibIdParser
5
+ STAGES = 'DIS\d?|PSI|FCD|FDIS|CD\d?|Pub2|CDV|TS|SI'.freeze
6
+ APPROVAL = '(?:\s(Unapproved|Approved))'.freeze
7
+ APPROV = '(?:\s(?:Unapproved|Approved))?'.freeze
8
+ STD = "(?:\s(?i)Std\.?(?-i))?".freeze
9
+
10
+ #
11
+ # Parse normtitle
12
+ #
13
+ # @param [String] normtitle <description>
14
+ #
15
+ # @return [RelatonIeee::PubId, nil]
16
+ #
17
+ def parse(normtitle) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
18
+ case normtitle
19
+ # when "2012 NESC Handbook, Seventh Edition" then "NESC HBK ED7.2012"
20
+ # when "2017 NESC(R) Handbook, Premier Edition" then "NESC HBK ED1.2017"
21
+ # when "2017 National Electrical Safety Code(R) (NESC(R)) - Redline" then "NESC C2R.2017"
22
+ # when "2017 National Electrical Safety Code(R) (NESC(R))" then "NESC C2.2017"
23
+ # when /^(\d+HistoricalData)-(\d{4})/ then "IEEE #{$1}.#{$2}"
24
+ # when /^(\d+)\.(\w+)\sBattery\sLife\sImprovement/ then "IEEE #{$1}-#{$2}"
25
+ # when /^(\d+)\.(\w+)-(\d{4})\s\(Amendment/ then "IEEE #{$1}-#{$2}.#{$3}"
26
+ when "A.I.E.E. No. 15 May-1928" then PubId.new(publisher: "AIEE", number: "15", year: "1928", month: "05")
27
+ # when "AIEE Nos 72 and 73 - 1932" then "AIEE 72_73.1932"
28
+ when "IEEE Std P1073.1.3.4/D3.0" then PubId.new(publisher: "IEEE", number: "P11073", part: "00101") # "IEEE P11073-00101"
29
+ # when "P1073.1.3.4/D3.0" then PubId.new(publisher: "IEEE", number: "P1073", part: "1-3-4", draft: "3.0") # "IEEE P1073-1-3-4/D3.0"
30
+ when "IEEE P1073.2.1.1/D08" then PubId.new(publisher: "ISO/IEEE", number: "P1073", part: "2-1-1", draft: "08") # "ISO/IEEE P1073-2-1-1/D08"
31
+ when "IEEE P802.1Qbu/03.0, July 2015" # "IEEE P802.1Qbu/D3.0.2015"
32
+ PubId.new(publisher: "IEEE", number: "P802", part: "1Qbu", draft: "3.0", year: "2015")
33
+ when "IEEE P11073-10422/04, November 2015" # "IEEE P11073-10422/D04.2015"
34
+ PubId.new(publiisher: "IEEE", number: "P11073", part: "10422", draft: "04", year: "2015")
35
+ when "IEEE P802.11aqTM/013.0 October 2017" # "IEEE P802-11aqTM/D13.0.2017"
36
+ PubId.new(publisher: "IEEE", number: "P802", part: "11aqTM", draft: "13.0", year: "2017")
37
+ when "IEEE P844.3/C22.2 293.3/D0, August 2018" # "IEEE P844-3/C22.2-293.3/D0.2018"
38
+ PubId.new([{ publisher: "IEEE", number: "P844", part: "3" },
39
+ { number: "C22.2", part: "293.3", dtaft: "0", year: "2018" }])
40
+ when "IEEE P844.3/C22.2 293.3/D1, November 2018" # "IEEE P844.3/C22.2 293.3/D1.2018"
41
+ PubId.new([{ publisher: "IEEE", number: "P844", part: "3" },
42
+ { number: "C22.2", part: "293.3", draft: "1", year: "2018" }])
43
+ when "AIEE No 431 (105) -1958" then PubId.new(publisher: "AIEE", number: "431", year: "1958") # "AIEE 431.1958"
44
+ when "IEEE 1076-CONC-I99O" then PubId.new(publisher: "IEEE", number: "1076", year: "199O") # "IEEE 1076.199O"
45
+ when "IEEE Std 960-1993, IEEE Std 1177-1993" # "IEEE 960/1177.1993"
46
+ PubId.new([{ publisher: "IEEE", number: "960" }, { number: "1177", year: "1993" }])
47
+ when "IEEE P802.11ajD8.0, August 2017" # "IEEE P802-11aj/D8.0.2017"
48
+ PubId.new(publisher: "IEEE", number: "P802", part: "11aj", draft: "8.0", year: "2017")
49
+ when "IEEE P802.11ajD9.0, November 2017" # "IEEE P802-11aj/D9.0.2017"
50
+ PubId.new(publisher: "IEEE", number: "P802", part: "11aj", draft: "9.0", year: "2017")
51
+ when "ISO/IEC/IEEE P29119-4-DISMay2013" # "ISO/IEC/IEEE DIS P29119-4.2013"
52
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "DIS", number: "P29119", part: "4", year: "2013")
53
+ when "IEEE-P15026-3-DIS-January 2015" # "IEEE DIS P15026-3.2015"
54
+ PubId.new(publisher: "IEEE", stage: "DIS", number: "P15026", year: "2015")
55
+ when "ANSI/IEEE PC63.7/D rev17, December 2014" # "ANSI/IEEE PC63-7/D/REV-17.2014"
56
+ PubId.new(publusher: "ANSI/IEEE", number: "PC63", part: "7", draft: "", rev: "17", year: "2014")
57
+ when "IEC/IEEE P62271-37-013:2015 D13.4" # "IEC/IEEE P62271-37-013/D13.4.2015"
58
+ PubId.new(publisher: "IEC/IEEE", number: "P62271", part: "37-013", draft: "13.4", year: "2015")
59
+ when "PC37.30.2/D043 Rev 18, May 2015" # "IEEE PC37-30-2/D043/REV-18.2015"
60
+ PubId.new(publisher: "IEEE", number: "PC37", part: "30-2", draft: "043", rev: "18", year: "2015")
61
+ when "IEC/IEEE FDIS 62582-5 IEC/IEEE 2015" # "IEC/IEEE FDIS 62582-5.2015"
62
+ PubId.new(publisher: "IEC/IEEE", stage: "FDIS", number: "62582", part: "5", year: "2015")
63
+ when "ISO/IEC/IEEE P15289:2016, 3rd Ed FDIS/D2" # "ISO/IEC/IEEE FDIS P15289/E3/D2.2016"
64
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "FDIS", number: "P15289", part: "", edition: "3", draft: "2", year: "2016")
65
+ when "IEEE P802.15.4REVi/D09, April 2011 (Revision of IEEE Std 802.15.4-2006)"
66
+ PubId.new(publisher: "IEEE", number: "P802", part: "15.4", rev: "i", draft: "09", year: "2013", month: "04", approval: true)
67
+ when "Draft IEEE P802.15.4REVi/D09, April 2011 (Revision of IEEE Std 802.15.4-2006)"
68
+ PubId.new(publisher: "IEEE", number: "P802", part: "15.4", rev: "i", draft: "09", year: "2011", month: "04")
69
+ when "ISO/IEC/IEEE DIS P42020:201x(E), June 2017"
70
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "DIS", number: "P42020", year: "2017", month: "06")
71
+ when "IEEE/IEC P62582 CD2 proposal, May 2017"
72
+ PubId.new(publisher: "IEEE/IEC", number: "P62582", stage: "CD2", year: "2017", month: "05")
73
+ when "ISO/IEC/IEEE P16326:201x WD.4a, July 2017"
74
+ PubId.new(publisher: "ISO/IEC/IEEE", number: "P16326", draft: "4a", year: "2017", month: "07")
75
+ when "ISO/IEC/IEEE CD.1 P21839, October 2017"
76
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "CD1", number: "P21839", year: "2017", month: "10")
77
+ when "IEEE P3001.2/D5, August 2017"
78
+ PubId.new(publisher: "IEEE", number: "P3001", part: "2", draft: "5", year: "2017", month: "01")
79
+ when "P3001.2/D5, August 2017"
80
+ PubId.new(publisher: "IEEE", number: "P3001", part: "2", draft: "5", year: "2017", month: "12")
81
+ when "ISO/IEC/IEEE P16326:201x WD5, December 2017"
82
+ PubId.new(publisher: "ISO/IEC/IEEE", number: "P16326", draft: "5", year: "2017", month: "12")
83
+ when "ISO/IEC/IEEE DIS P16326/201x, December 2018"
84
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "DIS", number: "P16326", year: "2018", month: "12")
85
+ when "ISO/IEC/IEEE/P21839, 2019(E)"
86
+ PubId.new(publisher: "ISO/IEC/IEEE", number: "P21839", year: "2019")
87
+ when "ISO/IEC/IEEE P42020/V1.9, August 2018"
88
+ PubId.new(publisher: "ISO/IEC/IEEE", number: "P42020", year: "2018", month: "08")
89
+ when "ISO/IEC/IEEE CD2 P12207-2: 201x(E), February 2019"
90
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "CD2", number: "P12207", part: "2", year: "2019", month: "02")
91
+ when "ISO/IEC/IEEE P42010.WD4:2019(E)"
92
+ PubId.new(publisher: "ISO/IEC/IEEE", number: "P42010", draft: "4", year: "2019")
93
+ when "IEC/IEEE P63195_CDV/V3, February 2020"
94
+ PubId.new(publisher: "IEC/IEEE", number: "P63195", stage: "CDV", year: "2020", month: "02")
95
+ when "ISO /IEC/IEEE P24774_D1, February 2020"
96
+ PubId.new(publisher: "ISO/IEC/IEEE", number: "P24774", draft: "1", year: "2020", month: "02")
97
+ when "IEEE/ISO/IEC P42010.CD1-V1.0, April 2020"
98
+ PubId.new(publisher: "IEEE/ISO/IEC", number: "P42010", stage: "CD1", year: "2020", month: "04")
99
+ when "ISO/IEC/IEEE/P16085_DIS, March 2020"
100
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "DIS", number: "P16085", year: "2020", month: "03")
101
+ when "ISO /IEC/IEEE P24774/DIS, July 2020"
102
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "DIS", number: "P24774", year: "2020", month: "07")
103
+ when "ANSI/ IEEE C37.23-1969" then PubId.new(publisher: "ANSI/IEEE", number: "C37", part:"23", year: "1969")
104
+ when "ANSI/IEEE Std: Outdoor Apparatus Bushings"
105
+ PubId.new(publisher: "ANSI/IEEE", number: "21", year: "1976", month: "11")
106
+ when "ANSI/ IEEE C37.5-1979" then PubId.new(publisher: "ANSI/IEEE", number: "C37", part:"5", year: "1979")
107
+ when "Unapproved Draft Std ISO/IEC FDIS 15288:2007(E) IEEE P15288/D3,"
108
+ PubId.new(publisher: "ISO/IEC/IEEE", stage: "FDIS", number: "P15288", draft: "3", year: "2007")
109
+ when "Draft National Electrical Safety Code, January 2016"
110
+ PubId.new(publisher: "IEEE", number: "PC2", year: "2016", month: "01")
111
+ when "ANSI/ IEEE C62.1-1981 (Revision of IEEE Std 28-1974 and ANSI C62.1-1975)"
112
+ PubId.new(publisher: "ANSI/IEEE", number: "C62", part: "1", year: "1981")
113
+ when "ANSI/IEEE-ANS-7-4.3.2-1982" then PubId.new(publisher: "ANSI/IEEE/ANS", number: "7", part: "4-3-2", year: "1982")
114
+ when "IEEE Unapproved Draft Std P802.1AB/REVD2.2, Dec 2007" # "IEEE P802.1AB/REV/D2.2.2007"
115
+ PubId.new(publisher: "IEEE", number: "P802", part: "1AB", rev: "", draft: "2.2", year: "2007", month: "12")
116
+
117
+ # drop all with <standard_id>0</standard_id>
118
+ # when "IEEE Std P1671/D5, June 2006", "IEEE Std PC37.100.1/D8, Dec 2006",
119
+ # "IEEE Unapproved Draft Std P1578/D17, Mar 2007", "IEEE Approved Draft Std P1115a/D4, Feb 2007",
120
+ # "IEEE Std P802.16g/D6, Nov 06", "IEEE Unapproved Draft Std P1588_D2.2, Jan 2008",
121
+ # "IEEE Unapproved Std P90003/D1, Feb 2007.pdf", "IEEE Unapproved Draft Std PC37.06/D10 Dec 2008",
122
+ # "IEEE P1451.2/D20, February 2011", "IEEE Std P1641.1/D3, July 2006",
123
+ # "IEEE P802.1AR-Rev/D2.2, September 2017 (Draft Revision of IEEE Std 802.1AR\u20132009)",
124
+ # "IEEE Std 108-1955; AIEE No.450-April 1955", "IEEE Std 85-1973 (Revision of IEEE Std 85-1965)",
125
+ # "IEEE Std 1003.1/2003.l/lNT, March 1994 Edition" then nil
126
+
127
+ # publisher1, number1, part1, publisher2, number2, part2, draft, year
128
+ when /^([A-Z\/]+)\s(\w+)[-.](\d+)\/(\w+)\s(\w+)[-.](\d+)_D([\d.]+),\s\w+\s(\d{4})/
129
+ PubId.new([{ publisher: $1, number: $2, part: $3 },
130
+ { publisher: $4, number: $5, part: $6, draft: dn($7), year: $8 }])
131
+
132
+ # publisher1, number1, part1, number2, part2, draft, year, month
133
+ when /^([A-Z\/]+)\s(\w+)[.-]([\w.-]+)\/(\w+)[.-]([[:alnum:].-]+)[\/_]D([\w.]+),\s(\w+)\s(\d{4})/
134
+ PubId.new([{ publisher: $1, number: $2, part: sp($3) }, { number: $4, part: sp($5), draft: dn($6), year: $8, month: mn($7) }])
135
+
136
+ # publisher, approval, number, part, corrigendum, draft, year
137
+ when /^([A-Z\/]+)#{APPROVAL}(?:\sDraft)?\sStd\s(\w+)\.(\d+)-\d{4}[^\/]*\/Cor\s?(\d)\/(D[\d\.]+),\s(?:\w+\s)?(\d{4})/o
138
+ PubId.new(publisher: $1, approval: $2, number: $3, part: sp($4), corr: $5, draft: dn($6), year: $7)
139
+
140
+ # publisher, number, part, corrigendum, draft, year, month
141
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.(\w+)-\d{4}\/Cor\s?(\d(?:-\d+x)?)[\/_]D([\d\.]+),\s?(\w+)\s(\d{4})/o
142
+ PubId.new(publisher: $1, number: $2, part: $3, corr: $4, draft: dn($5), month: mn($6), year: $7)
143
+
144
+ # publidsher1, number1, year1 publisher2, number2, draft, year2
145
+ when /^([A-Z\/]+)\s(\w+)-(\d{4})\/([A-Z]+)\s([[:alnum:]]+)_D([\w.]+),\s(\d{4})/
146
+ PubId.new([{ publisher: $1, number: $2, year: $3 }, { publisher: $4, number: $5, draft: dn($6), year: $7 }])
147
+
148
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)[.-]([[:alnum:].-]+)[\s\/_]ED([\w.]+),\s(\w+)\s(\d{4})/o
149
+ PubId.new(publisher: $1, stage: $2, number: $3, part: sp($4), edition: $5, month: mn($6), year: $7)
150
+
151
+ # publidsher1, number1, publisher2, number2, draft, year
152
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\/([A-Z]+)\s([[:alnum:]]+)_D([\d\.]+),\s\w+\s(\d{4})/o,
153
+ /^([A-Z\/]+)\s(\w+)\sand\s([A-Z]+)(?:\sGuideline)?\s([[:alnum:]]+)\/D([\d\.]+),\s\w+\s(\d{4})/o
154
+ PubId.new([{ publisher: $1, number: $2 }, { publisher: $3, number: $4, draft: dn($5), year: $6 }])
155
+
156
+ # publidsher1, number1, part, publisher2, number2, year
157
+ when /^([A-Z\/]+)\s(\w+)\.(\d+)_(\w+)\s(\w+),\s(\d{4})/ # "#{$1} #{$2}-#{$3}/#{$4} #{$5}.#{$6}"
158
+ PubId.new([{ publisher: $1, number: $2, part: $3 }, { publisher: $4, number: $5, year: $6 }])
159
+
160
+ # publisher, number1, part1, number2, part2, draft
161
+ when /^([A-Z\/]+)\s(\w+)[.-](\d+)\/(\w+)\.(\d+)[\/_]D([\d.]+)/ # "#{$1} #{$2}-#{$3}/#{$4}-#{$5}/D#{$6}"
162
+ PubId.new([{ publisher: $1, number: $2, part: $3 }, { number: $4, part: $5, draft: dn($6) }])
163
+
164
+ # publidsher, number1, part1, number2, part2, year
165
+ when /^([A-Z\/]+)\sStd\s(\w+)\.(\w+)\/(\w+)\.(\w+)\/INT\s\w+\s(\d{4})/
166
+ PubId.new([{ publisher: $1, number: $2, part: $3 }, { number: $4, part: $5, year: $6 }])
167
+
168
+ # publisher, number, part, corrigendum, draft, year
169
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-]([\d-]+)\/Cor\s?(\d)[\/_]D([\d\.]+),\s(?:\w+\s)?(\d{4})/o,
170
+ /^([A-Z\/]+)\s(\w+)[.-](\d+)-\d{4}\/Cor\s?(\d)(?:-|,\s|\/)D([\d.]+),?\s\w+\s(\d{4})/,
171
+ /^([A-Z\/]+)\s(\w+)\.([[:alnum:].]+)[-_]Cor[\s-]?(\d)\/D([\d.]+),?\s\w+\s(\d{4})/
172
+ PubId.new(publisher: $1, number: $2, part: sp($3), corr: $4, draft: dn($5), year: $6)
173
+ when /^([A-Z\/]+)\s(\w+)\.(\d+)-\d{4}\/Cor(\d)-(\d{4})\/D([\d.]+)/ # "#{$1} #{$2}-#{$3}/Cor#{$4}/D#{$6}.#{$5}"
174
+ PubId.new(publisher: $1, number: $2, part: $3, corr: $4, draft: dn($6), year: $5)
175
+
176
+ # publisher, status, number, part, draft, year, month
177
+ when /^([A-Z\/]+)(\sActive)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-]([[:alnum:]\.]+)\s?[\/_]D([\w\.]+),?\s(\w+)(?:\s\d{1,2},)?\s?(\d{2,4})/o
178
+ PubId.new(publisher: $1, status: $2, number: $3, part: sp($4), draft: dn($5), year: $7, month: mn($6))
179
+
180
+ # publisher, approval, number, part, draft, year, month
181
+ when /^([A-Z\/]+)(?:\sActive)?#{APPROVAL}(?:\sDraft)?#{STD}\s(\w+)[.-]([[:alnum:]\.]+)\s?[\/_]D([\w\.-]+),?\s(\w+)(?:\s\d{1,2},)?\s?(\d{2,4})/o
182
+ PubId.new(publisher: $1, approval: $2, number: $3, part: sp($4), draft: dn($5), year: $7, month: mn($6))
183
+ when /^([A-Z\/]+)\s(\w+)\.([\w.]+)\/D([\w.]+),?\s(\w+)[\s_](\d{4})(?:\s-\s\(|\s\(|_)(Unapproved|Approved)/
184
+ PubId.new(publisher: $1, number: $2, part: sp($3), draft: dn($4), year: $6, month: mn($5), approval: $7)
185
+
186
+ # publisher, approval, number, draft, year, month
187
+ when /^([A-Z\/]+)\s(\w+)\/D([\w.]+),\s(\w+)\s(\d{4})\s-\s\(?(Approved|Unapproved)/
188
+ PubId.new(publisher: $1, number: $2, draft: dn($3), year: $5, month: mn($4), approval: $6)
189
+
190
+ # publisher, approval, number, part, draft, year
191
+ when /^([A-Z\/]+)#{APPROVAL}(?:\sDraft)?#{STD}\s(\w+)[.-]([\w.]+)\s?[\/_\s]D([\w\.]+),?\s\w+\s?(\d{4})/o
192
+ PubId.new(publisher: $1, approval: $2, number: $3, part: sp($4), draft: dn($5), year: $6)
193
+ when /^([A-Z\/]+)\s(\w+)\.([\w.]+)\/D([\d.]+),?\s\w+[\s_](\d{4})(?:\s-\s\(|_|\s\()?#{APPROVAL}/o
194
+ PubId.new(publisher: $1, number: $2, part: sp($3), draft: dn($4), year: $5, approval: $6)
195
+
196
+ # publisher, stage, number, part, edition, year, month
197
+ when /^([A-Z\/]+)\s(\w+)[.-]([[:alnum:].-]+)[\/_](#{STAGES})\s(\w+)\sedition,\s(\w+)\s(\d{4})/o
198
+ PubId.new(publisher: $1, number: $2, part: sp($3), stage: $4, edition: en($5), month: mn($6), year: $7)
199
+
200
+ # number, part, corrigendum, draft, year
201
+ when /^(\w+)\.([\w.]+)-\d{4}[_\/]Cor\s?(\d)\/D([\w.]+),?\s\w+\s(?:\d{2},\s)?(\d{4})/
202
+ PubId.new(number: $1, part: sp($2), corr: $3, draft: dn($4), year: $5)
203
+
204
+ # publisher, approval, number, part, draft
205
+ when /^([A-Z\/]+)\s(\w+)\.(\d+)\/D([\d.]+)\s\([^)]+\)\s-#{APPROVAL}/o
206
+ PubId.new(publisher: $1, approval: $5, number: $2, part: $3, draft: dn($4))
207
+
208
+ # publisher, number, part1, rev, draft, part2
209
+ when /^([A-Z\/]+)#{STD}\s(\w+)\.([\d.]+)REV([a-z]+)_D([\w.]+)\sPart\s(\d)/o
210
+ PubId.new(publisher: $1, number: $2, part: "#{sp($3)}-#{$6}", rev: $4, draft: dn($5))
211
+
212
+ # publisher, number, part, draft, year, month
213
+ when /^([A-Z\/]+)#{STD}\s(\w+)[.-]([[:alnum:].]+)[\/\s_]D([\d.]+)(?:,?\s|_)([[:alpha:]]+)[\s_]?(\d{4})/o
214
+ PubId.new(publisher: $1, number: $2, part: sp($3), draft: dn($4), year: $6, month: mn($5))
215
+
216
+ # publisher, stage, number, part, draft, year
217
+ when /^([\w\/]+)\s(#{STAGES})\s(\w+)-([[:alnum:]]+)[\/_\s]D([\d.]+),\s\w+\s(\d{4})/o
218
+ PubId.new(publisher: $1, stage: $2, number: $3, part: sp($4), draft: dn($5), year: $6)
219
+
220
+ # publisher, number, part, rev, draft, year, month
221
+ when /^([A-Z\/]+)\s(\w+)\.([\w.]+)-Rev\/D([\w.]+),\s(\w+)\s(\d{4})/
222
+ PubId.new(publisher: $1, number: $2, part: sp($3), rev: "", draft: dn($4), year: $6, month: mn($5))
223
+
224
+ # publisher, number, part, rev, draft, year
225
+ when /^([A-Z\/]+)\s(\w+)\.([\d.]+)Rev(\w+)-D([\w.]+),\s\w+\s(\d{4})/
226
+ PubId.new(publisher: $1, number: $2, part: sp($3), rev: $4, draft: dn($5), year: $6)
227
+
228
+ # publisher, stage, number, part, edition, year
229
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)[.-]([[:alnum:].-]+)[\/\s_]ED([\d.]+),\s(\d{4})/o
230
+ PubId.new(publisher: $1, stage: $2, number: $3, part: sp($4), edition: $5, year: $6)
231
+
232
+ # publisher, stage, number, draft, year, month
233
+ when /^([A-Z\/]+)\s(\w+)\/(#{STAGES})[\/_]D([\w.]+),\s(\w+)\s(\d{4})/o
234
+ PubId.new(publisher: $1, number: $2, stage: $3, draft: dn($4), year: $6, month: mn($5))
235
+
236
+ # number, part, draft, year, month
237
+ when /(\w+)[.-]([[:alnum:].]+)[\/\s_]D([\d.]+)(?:,?\s|_)([[:alpha:]]+)[\s_]?(\d{4})/
238
+ PubId.new(publisher: "IEEE", number: $1, part: sp($2), draft: dn($3), year: $5, month: mn($4))
239
+
240
+ # number, corrigendum, draft, year, month
241
+ when /^(\w+)-\d{4}[\/_]Cor\s?(\d)[\/_]D([\w.]+),\s(\w+)\s(\d{4})/
242
+ PubId.new(publisher: "IEEE", number: $1, corr: $2, draft: dn($3), month: mn($4), year: $5)
243
+
244
+ # publisher, number, corrigendum, draft, year
245
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?\sStd\s(\w+)(?:-\d{4})?[\/_]Cor\s?(\d)\/D([\d\.]+),\s\w+\s(\d{4})/o
246
+ PubId.new(publisher: $1, number: $2, corr: $3, draft: dn($4), year: $5)
247
+
248
+ # publisher, number, part, rev, corrigendum, draft
249
+ when /^([A-Z\/]+)\s(\w+)\.(\w+)-\d{4}-Rev\/Cor(\d)\/D([\d.]+)/
250
+ PubId.new(publisher: $1, number: $2, part: $3, rev: "", corr: $4, draft: dn($5))
251
+
252
+ # publisher, number, part, corrigendum, draft
253
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.([\w.]+)\/[Cc]or\s?(\d)\/D([\w\.]+)/o,
254
+ /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.(\w+)-\d{4}\/Cor\s?(\d)[\/_]D([\d\.]+)/o
255
+ PubId.new(publisher: $1, number: $2, part: sp($3), corr: $4, draft: dn($5))
256
+
257
+ # publisher, number, part, corrigendum, year
258
+ when /^([A-Z\/]+)#{STD}\s(\w+)[.-]([\w.]+)[:-]\d{4}[\/-]Cor[\s.]?(\d)[:-](\d{4})/o
259
+ PubId.new(publisher: $1, number: $2, part: sp($3), corr: $4, year: $5)
260
+
261
+ # publisher, number, part, draft, year
262
+ when /^([\w\/]+)(?:\sActive)?#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-]([[:alnum:]\.]+)(?:\s?\/\s?|_|,\s|-)D([\w\.]+)\s?,?\s\w+(?:\s\d{1,2},)?\s?(\d{2,4})/o,
263
+ /^([A-Z\/]+)#{STD}\s(\w+)[.-]([\w.-]+)[\/\s]D([\w.]*)(?:-|,\s?\w+\s|\s\w+:|,\s)(\d{4})/o,
264
+ /^([\w\/]+)(?:\sActive)?#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-]([[:alnum:]\.]+)\sDraft\s([\w\.]+),\s\w+\s(\d{4})/o
265
+ PubId.new(publisher: $1, number: $2, part: sp($3), draft: dn($4), year: $5)
266
+
267
+ # publisher, approval, number, draft, year
268
+ when /^([A-Z\/]+)#{APPROVAL}(?:\sDraft)?#{STD}\s([[:alnum:]]+)\s?[\/_]\s?D([\w\.]+),?\s\w+\s(\d{2,4})/o
269
+ PubId.new(publisher: $1, approval: $2, number: $3, draft: dn($4), year: $5)
270
+ when /^([A-Z\/]+)\s(\w+)\/D([\d.]+),\s\w+[\s_](\d{4})(?:\s-\s\(?|_)?#{APPROVAL}/o
271
+ PubId.new(publisher: $1, number: $2, draft: dn($3), year: $4, approval: $5)
272
+
273
+ # publisher, number, part, rev, draft
274
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.([\w.]+)[-\s\/]?REV-?(\w+)\/D([\d.]+)/o
275
+ PubId.new(publisher: $1, number: $2, part: sp($3), rev: $4, draft: dn($5))
276
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.([\w.]+)-REV\/D([\d.]+)/o
277
+ PubId.new(publisher: $1, number: $2, part: sp($3), rev: "", draft: dn($4))
278
+
279
+ # publisher, number, part, rev, year
280
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?\sStd\s(\w+)\.(\d+)\/rev(\d+),\s\w+\s(\d+)/o
281
+ PubId.new(publisher: $1, number: $2, part: sp($3), rev: $4, year: $5)
282
+
283
+ # publisher, stage, number, draft, year
284
+ when /^([\w\/]+)\s(#{STAGES})\s([[:alnum:]]+)[\/_]D([\w.]+),(?:\s\w+)?\s(\d{4})/o
285
+ PubId.new(publisher: $1, stage: $2, number: $3, draft: dn($4), year: $5)
286
+
287
+ # publisher, stage, number, part, year, month
288
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-]([[:alnum:].-]+)(?:[\/_-]|,\s)(#{STAGES}),?\s(\w+)\s(\d{4})/o
289
+ PubId.new(publisher: $1, number: $2, part: sp($3), stage: $4, year: $6, month: mn($5))
290
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)[.-](\w+),\s(\w+)\s(\d{4})/o
291
+ PubId.new(publisher: $1, number: $3, part: sp($4), stage: $2, year: $6, month: mn($5))
292
+
293
+ # publisher, number, part, edition, year, month
294
+ when /^([A-Z\/]+)\s(\w+)[.-]([\w.-]+)[\/\s]ED([\d+]),\s(\w+)\s(\d{4})/
295
+ PubId.new(publisher: $1, number: $2, part: sp($3), edition: $4, month: mn($5), year: $6)
296
+
297
+ # publisher, stage, number, part, year
298
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-](\d+)[\/_-](#{STAGES}),?\s\w+\s(\d{4})/o,
299
+ /^([A-Z\/]+)\s(\w+)-(\d+)[\/-](#{STAGES})(?:_|,\s|-)\w+\s?(\d{4})/o,
300
+ /^([A-Z\/]+)\s(\w+)[.-](\d+)[\/-_](#{STAGES})[\s-](\d{4})/o
301
+ PubId.new(publisher: $1, number: $2, part: sp($3), stage: $4, year: $5)
302
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)-([\w-]+),\s(\d{4})/o
303
+ PubId.new(publisher: $1, number: $3, part: sp($4), stage: $2, year: $5)
304
+
305
+ # publisher, stage, number, year, month
306
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)(?:\s\g<2>)?,\s(\w+)\s(\d{4})/o
307
+ PubId.new(publisher: $1, number: $3, stage: $2, year: $5, month: mn($4))
308
+ when /^([A-Z\/]+)\s([[:alnum:]]+)(?:\s|_|\/\s?)?(#{STAGES}),?\s(\w+)\s(\d{4})/o
309
+ PubId.new(publisher: $1, number: $2, stage: $3, year: $5, month: mn($4))
310
+
311
+ # publisher, stage, number, part, draft
312
+ when /^([A-Z\/]+)[.-]([[:alnum:].-]+)[\/_]D([[:alnum:].]+)[\/_](#{STAGES})/o
313
+ PubId.new(publisher: "IEEE", number: $1, part: sp($2), draft: dn($3), stage: $4)
314
+
315
+ # publisher, stage, number, year
316
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)(?:,\s\w+\s|:)(\d{4})/o
317
+ PubId.new(publisher: $1, number: $3, stage: $2, year: $4)
318
+ when /^([A-Z\/]+)\s(\w+)(?:\/|,\s)(#{STAGES})-(\d{4})/o
319
+ PubId.new(publisher: $1, number: $2, stage: $3, year: $4)
320
+
321
+ # publisher, stage, number, part
322
+ when /^([A-Z\/]+)\s(\w+)-([\w-]+)[\s-](#{STAGES})/o
323
+ PubId.new(publisher: $1, number: $2, part: $3, stage: $4)
324
+ when /^([A-Z\/]+)\s(\w+)-(#{STAGES})-(\w+)/o
325
+ PubId.new(publisher: $1, number: $2, part: $4, stage: $3)
326
+ when /^([A-Z\/]+)\s(#{STAGES})\s(\w+)[.-]([[:alnum:].-]+)/o
327
+ PubId.new(publisher: $1, number: $3, part: sp($4), stage: $2)
328
+
329
+ # publisher, number, corrigendum, year
330
+ when /^([A-Z\/]+)#{STD}\s(\w+)-\d{4}\/Cor\s?(\d)-(\d{4})/o
331
+ PubId.new(publisher: $1, number: $2, corrigendum: $3, year: $4)
332
+
333
+ # publisher, number, rev, draft
334
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)-REV\/D([\d.]+)/o
335
+ PubId.new(publisher: $1, number: $2, rev: "", draft: dn($3))
336
+
337
+ # publisher, number, part, year, month
338
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)-([\w-]+),\s(\w+)\s?(\d{4})/o,
339
+ /^([A-Z\/]+)\sStd\s(\w+)\.(\w+)-\d{4}\/INT,?\s(\w+)\.?\s(\d{4})/
340
+ PubId.new(publisher: $1, number: $2, part: sp($3), year: $5, month: mn($4))
341
+
342
+ # publisher, number, part, amendment, year
343
+ when /^([A-Z\/]+)#{STD}\s(\w+)-(\w+)[:-](\d{4})\/Amd(?:\s|.\s?)?(\d)/o
344
+ PubId.new(publisher: $1, number: $2, part: sp($3), amd: $5, year: $4)
345
+
346
+ # publisher, number, part, year, redline
347
+ when /^([A-Z\/]+)#{STD}\s(\w+)[.-]([\w.]+)[:-](\d{4}).*?\s-\s(Redline)/o,
348
+ /^([A-Z\/]+)#{STD}\s(\w+)[.-]([\w.-]+):(\d{4}).*?\s-\s(Redline)/o
349
+ PubId.new(publisher: $1, number: $2, part: $3, year: $4, redline: true)
350
+
351
+ # publisher, number, part, year
352
+ when /^([A-Z\/]+)\s(\w+)-(\d{1,3}),\s\w+\s(\d{4})/,
353
+ /^([A-Z\/]+)#{STD}\s(\w+)[.-](?!(?:19|20)\d{2}\D)([\w.]+)(?:,\s\w+\s|-|:|,\s|\.|:)(\d{4})/o,
354
+ /^([A-Z\/]+)#{STD}\s(\w+)[.-](?!(?:19|20)\d{2}\D)([\w.-]+)(?:,\s\w+\s|:|,\s|\.|:)(\d{4})/o,
355
+ /^([A-Z\/]+)#{STD}\sNo(?:\.?\s|\.)(\w+)\.(\d+)\s?-(?:\w+\s)?(\d{4})/o
356
+ PubId.new(publisher: $1, number: $2, part: sp($3), year: $4)
357
+
358
+ # publisher, number, edition, year
359
+ when /^([A-Z\/]+)\s(\w+)\s(\w+)\sEdition,\s\w+\s(\d+)/,
360
+ /^([A-Z\/]+)\s(\w+)[\/_]ED([\d.]+),\s(\d{4})/
361
+ PubId.new(publisher: $1, number: $2, edition: en($3), year: $4)
362
+
363
+ # publisher, number, part, conformance, draft
364
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.([[:alnum:].]+)[\/-]Conformance(\d+)[\/_]D([\w\.]+)/o
365
+ PubId.new(publisher: $1, number: $2, part: "#{sp($3)}-#{$4}", draft: dn($5))
366
+
367
+ # publisher, number, part, conformance, year
368
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.([[:alnum:].]+)\s?\/\s?Conformance(\d+)-(\d{4})/o
369
+ PubId.new(publisher: $1, number: $2, part: "#{sp($3)}-#{$4}", year: $5)
370
+
371
+ # publisher, number, part, draft
372
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\.([[:alnum:].]+)[^\/]*\/D([[:alnum:]\.]+)/o,
373
+ /^([A-Z\/]+)\s(\w+)[.-]([[:alnum:]-]+)[\s_]D([\d.]+)/,
374
+ /^([A-Z\/]+)\s(\w+)-(\w+)\/D([\w.]+)/
375
+ PubId.new(publisher: $1, number: $2, part: sp($3), draft: dn($4))
376
+
377
+ # number, part, draft, year
378
+ when /^(\w+)[.-]([[:alnum:].-]+)(?:\/|,\s|_)D([\d.]+),?\s(?:\w+,?\s)?(\d{4})/
379
+ PubId.new(publisher: "IEEE", number: $1, part: sp($2), draft: dn($3), year: $4)
380
+
381
+ # publisher, number, draft, year, month
382
+ when /^([A-Z\/]+)\s(\w+)\/D([\d.]+),\s(\w+)\s(\d{4})/
383
+ PubId.new(publisher: $1, number: $2, draft: dn($3), year: $5, month: mn($4))
384
+
385
+ # publisher, number, draft, year
386
+ when /^([\w\/]+)(?:\sActive)?#{APPROV}(?:\sDraft)?#{STD}\s([[:alnum:]]+)\s?[\/_]\s?D([\w\.-]+),?\s(?:\w+\s)?(\d{2,4})/o,
387
+ /^([\w\/]+)(?:\sActive)?#{APPROV}(?:\sDraft)?#{STD}\s([[:alnum:]]+)\/?D?([\d\.]+),?\s\w+\s(\d{4})/o,
388
+ /^([A-Z\/]+)\s(\w+)\/Draft\s([\d.]+),\s\w+\s(\d{4})/
389
+ PubId.new(publisher: $1, number: $2, draft: dn($3), year: yn($4))
390
+ when /^([A-Z\/]+)\sStd\s(\w+)-(\d{4})\sDraft\s([\d.]+)/
391
+ PubId.new(publisher: $1, number: $2, draft: dn($4), year: $3)
392
+
393
+ # publisher, approval, number, draft
394
+ when /^([A-Z\/]+)#{APPROVAL}(?:\sDraft)?#{STD}\s([[:alnum:]]+)[\/_]D([\w.]+)/o
395
+ PubId.new(publisher: $1, approval: $2, number: $3, draft: dn($4))
396
+
397
+ # number, draft, year
398
+ when /^(\w+)\/D([\w.+]+),?\s\w+,?\s(\d{4})/
399
+ PubId.new(publisher: "IEEE", number: $1, draft: dn($2), year: $3)
400
+
401
+ # number, rev, draft
402
+ when /^(\w+)-REV\/D([\d.]+)/o
403
+ PubId.new(publisher: "IEEE", number: $1, rev: "", draft: dn($2))
404
+
405
+ # publisher, number, draft
406
+ when /^([\w\/]+)#{APPROV}(?:\sDraft)?#{STD}\s([[:alnum:]]+)[\/_]D([\w.]+)/o
407
+ PubId.new(publisher: $1, number: $2, draft: dn($3))
408
+
409
+ # publisher, number, year, month
410
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)(?:-\d{4})?,\s(\w+)\s(\d{4})/o
411
+ PubId.new(publisher: $1, number: $2, year: $4, month: mn($3))
412
+
413
+ # publisher, number, year, redline
414
+ when /^([A-Z\/]+)#{STD}\s(\w+)[:-](\d{4}).*?\s-\s(Redline)/o
415
+ PubId.new(publisher: $1, number: $2, year: $3, redline: true)
416
+
417
+ # publisher, number, year
418
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)(?:-|:|,\s(?:\w+\s)?)(\d{2,4})/o,
419
+ /^(\w+)#{APPROV}(?:\sDraft)?\sStd\s(\w+)\/\w+\s(\d{4})/o,
420
+ /^([\w\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)\/FCD-\w+(\d{4})/o,
421
+ /^(\w+)#{STD}\sNo(?:\.?\s|\.)(\w+)\s?(?:-|,\s)(?:\w+\s)?(\d{4})/o,
422
+ /^([A-Z\/]+)\sStd\s(\w+)\/INT-(\d{4})/
423
+ PubId.new(publisher: $1, number: $2, year: yn($3))
424
+ when /^ANSI\/\sIEEE#{STD}\s(\w+)-(\d{4})/o
425
+ PubId.new(publisher: "ANSI/IEEE", number: $1, year: $2)
426
+
427
+ # publisher, number, part
428
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}\s(\w+)[.-]([\d.]+)/o
429
+ PubId.new(publisher: $1, number: $2, part: sp($3))
430
+
431
+ # number, part, draft
432
+ when /^(\w+)\.([\w.]+)\/D([\w.]+)/
433
+ PubId.new(publisher: "IEEE", number: $1, part: sp($2), draft: dn($3))
434
+
435
+ # number, part, year
436
+ when /^(\d{2})\sIRE\s(\w+)[\s.](\w+)/ # "IRE #{$2}-#{$3}.#{yn $1}"
437
+ PubId.new(publisher: "IRE", number: $2, part: $3, year: yn($1))
438
+ when /^(\w+)\.(\w+)-(|d{4})/ then PubId.new(publisher: "IEEE", number: $1, part: $2, year: $3)
439
+
440
+ # number, year
441
+ when /^(\w+)-(\d{4})\D/ then PubId.new(publisher: "IEEE", number: $1, year: $2)
442
+
443
+ # publisher, number
444
+ when /^([A-Z\/]+)#{APPROV}(?:\sDraft)?#{STD}(?:\sNo\.?)?\s(\w+)/o
445
+ PubId.new(publisher: $1, number: $2)
446
+
447
+ # else
448
+ # warn "Failed to parse normtitle #{normtitle}"
449
+ # nil # normtitle
450
+ end
451
+ rescue ArgumentError => e
452
+ e
453
+ end
454
+
455
+ # replace subpart's delimiter
456
+ #
457
+ # @param parts [Strong]
458
+ #
459
+ # @return [String]
460
+ def sp(parts)
461
+ parts.gsub ".", "-"
462
+ end
463
+
464
+ #
465
+ # Convert 2 digits year to 4 digits
466
+ #
467
+ # @param [String] year
468
+ #
469
+ # @return [String, nil] nil if string's length isn't 2 or 4
470
+ #
471
+ def yn(year)
472
+ return year if year.size == 4
473
+
474
+ case year.to_i
475
+ when 0..25 then "20#{year}"
476
+ when 26..99 then "19#{year}"
477
+ end
478
+ end
479
+
480
+ #
481
+ # Return number of month
482
+ #
483
+ # @param [String] month monthname
484
+ #
485
+ # @return [String] 2 digits month number
486
+ #
487
+ def mn(month)
488
+ n = Date::ABBR_MONTHNAMES.index(month) || Date::MONTHNAMES.index(month)
489
+ return month unless n
490
+
491
+ n.to_s.rjust 2, "0"
492
+ end
493
+
494
+ #
495
+ # Convert edition name to number
496
+ #
497
+ # @param [Strin] edition
498
+ #
499
+ # @return [String]
500
+ #
501
+ def en(edition)
502
+ case edition
503
+ when "First" then 1
504
+ when "Second" then 2
505
+ else edition
506
+ end
507
+ end
508
+
509
+ def dn(draftnum)
510
+ draftnum.sub(/^\./, "").gsub "-", "."
511
+ end
512
+
513
+ extend RawbibIdParser
514
+ end
515
+ end