relaton-ieee 1.9.2 → 1.9.3
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.
- checksums.yaml +4 -4
- data/lib/relaton_ieee/bibxml_parser.rb +1 -1
- data/lib/relaton_ieee/data_fetcher.rb +20 -4
- data/lib/relaton_ieee/data_parser.rb +11 -3
- data/lib/relaton_ieee/pub_id.rb +149 -0
- data/lib/relaton_ieee/rawbib_id_parser.rb +515 -0
- data/lib/relaton_ieee/version.rb +1 -1
- metadata +4 -2
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: f5ea9caf8eaf59f616cad6b137ff46fbfd0f28d38ad92c457467a3d19032d2a7
         | 
| 4 | 
            +
              data.tar.gz: 88b376e90082b8a6bb730e5a07b96930b292c092ece0ce82850a50a9d9cdeb0e
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: c5eeb5339a3d598da5509de3ffc2bb9231694f9a9edc6603b40cb2634ded16f6ebee01c0ffb222b624426075c7dfd28382bdfac428077097821215a017680f7f
         | 
| 7 | 
            +
              data.tar.gz: 9d8ee0f3c616d91d53ce9bfd54ceaf4a5cd458ac78471e69f7179daf6f5cf225681dadfe409011012f8c4e987e11f87e27a7e82b777aff2138873be5761aa617
         | 
| @@ -1,5 +1,6 @@ | |
| 1 1 | 
             
            require "zip"
         | 
| 2 2 | 
             
            require "relaton_ieee/data_parser"
         | 
| 3 | 
            +
            require "relaton_ieee/rawbib_id_parser"
         | 
| 3 4 |  | 
| 4 5 | 
             
            module RelatonIeee
         | 
| 5 6 | 
             
              class DataFetcher
         | 
| @@ -30,6 +31,7 @@ module RelatonIeee | |
| 30 31 | 
             
                  @ext = format.sub(/^bib/, "")
         | 
| 31 32 | 
             
                  @crossrefs = {}
         | 
| 32 33 | 
             
                  @backrefs = {}
         | 
| 34 | 
            +
                  # @normtitles = []
         | 
| 33 35 | 
             
                end
         | 
| 34 36 |  | 
| 35 37 | 
             
                #
         | 
| @@ -64,6 +66,7 @@ module RelatonIeee | |
| 64 66 | 
             
                    warn e.message
         | 
| 65 67 | 
             
                    warn e.backtrace
         | 
| 66 68 | 
             
                  end
         | 
| 69 | 
            +
                  # File.write "normtitles.txt", @normtitles.join("\n")
         | 
| 67 70 | 
             
                  update_relations
         | 
| 68 71 | 
             
                end
         | 
| 69 72 |  | 
| @@ -87,20 +90,33 @@ module RelatonIeee | |
| 87 90 | 
             
                # @param [String] xml content
         | 
| 88 91 | 
             
                # @param [String] filename source file
         | 
| 89 92 | 
             
                #
         | 
| 90 | 
            -
                def fetch_doc(xml, filename) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
         | 
| 93 | 
            +
                def fetch_doc(xml, filename) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 91 94 | 
             
                  doc = Nokogiri::XML(xml).at("/publication")
         | 
| 92 95 | 
             
                  unless doc
         | 
| 93 96 | 
             
                    warn "Empty file: #{filename}"
         | 
| 94 97 | 
             
                    return
         | 
| 95 98 | 
             
                  end
         | 
| 99 | 
            +
                  stdid = doc.at("./publicationinfo/standard_id").text
         | 
| 100 | 
            +
                  if stdid == "0"
         | 
| 101 | 
            +
                    # nt = doc&.at("./normtitle")&.text
         | 
| 102 | 
            +
                    # ntid = @normtitles.index nt
         | 
| 103 | 
            +
                    # @normtitles << nt if nt && !ntid
         | 
| 104 | 
            +
                    warn "Zero standard_id in #{filename}"
         | 
| 105 | 
            +
                    return
         | 
| 106 | 
            +
                  end
         | 
| 96 107 | 
             
                  bib = DataParser.parse doc, self
         | 
| 108 | 
            +
                  if bib.docnumber.nil?
         | 
| 109 | 
            +
                    nt = doc&.at("./normtitle")&.text
         | 
| 110 | 
            +
                    warn "PubID parse error. Normtitle: #{nt}, file: #{filename}"
         | 
| 111 | 
            +
                    return
         | 
| 112 | 
            +
                  end
         | 
| 97 113 | 
             
                  amsid = doc.at("./publicationinfo/amsid").text
         | 
| 98 114 | 
             
                  if backrefs.value?(bib.docidentifier[0].id) && /updates\.\d+/ !~ filename
         | 
| 99 115 | 
             
                    oamsid = backrefs.key bib.docidentifier[0].id
         | 
| 100 116 | 
             
                    warn "Document exists ID: \"#{bib.docidentifier[0].id}\" AMSID: "\
         | 
| 101 117 | 
             
                         "\"#{amsid}\" source: \"#{filename}\". Other AMSID: \"#{oamsid}\""
         | 
| 102 | 
            -
                    if bib.docidentifier[0].id.include?( | 
| 103 | 
            -
                      save_doc bib # rewrite file if the PubID  | 
| 118 | 
            +
                    if bib.docidentifier[0].id.include?(doc.at("./publicationinfo/stdnumber").text)
         | 
| 119 | 
            +
                      save_doc bib # rewrite file if the PubID matches to the stdnumber
         | 
| 104 120 | 
             
                      backrefs[amsid] = bib.docidentifier[0].id
         | 
| 105 121 | 
             
                    end
         | 
| 106 122 | 
             
                  else
         | 
| @@ -147,7 +163,7 @@ module RelatonIeee | |
| 147 163 | 
             
                # @return [String] filename
         | 
| 148 164 | 
             
                #
         | 
| 149 165 | 
             
                def file_name(docnumber)
         | 
| 150 | 
            -
                  name = docnumber.gsub(/\s-/, "-").gsub(/[ | 
| 166 | 
            +
                  name = docnumber.gsub(/\s-/, "-").gsub(/[\s,:\/]/, "_").squeeze("_").upcase
         | 
| 151 167 | 
             
                  File.join @output, "#{name}.#{@ext}"
         | 
| 152 168 | 
             
                end
         | 
| 153 169 |  | 
| @@ -110,7 +110,7 @@ module RelatonIeee | |
| 110 110 | 
             
                # @return [Array<RelatonBib::DocumentIdentifier>]
         | 
| 111 111 | 
             
                #
         | 
| 112 112 | 
             
                def parse_docid
         | 
| 113 | 
            -
                  ids = [{ id:  | 
| 113 | 
            +
                  ids = [{ id: pubid.to_s, type: "IEEE" }]
         | 
| 114 114 | 
             
                  isbn = doc.at("./publicationinfo/isbn")
         | 
| 115 115 | 
             
                  ids << { id: isbn.text, type: "ISBN" } if isbn
         | 
| 116 116 | 
             
                  doi = doc.at("./volume/article/articleinfo/articledoi")
         | 
| @@ -120,13 +120,20 @@ module RelatonIeee | |
| 120 120 | 
             
                  end
         | 
| 121 121 | 
             
                end
         | 
| 122 122 |  | 
| 123 | 
            +
                def pubid
         | 
| 124 | 
            +
                  @pubid ||= begin
         | 
| 125 | 
            +
                    nt = doc.at("./normtitle").text
         | 
| 126 | 
            +
                    RawbibIdParser.parse(nt)
         | 
| 127 | 
            +
                  end
         | 
| 128 | 
            +
                end
         | 
| 129 | 
            +
             | 
| 123 130 | 
             
                #
         | 
| 124 131 | 
             
                # Parse docnumber
         | 
| 125 132 | 
             
                #
         | 
| 126 133 | 
             
                # @return [String] PubID
         | 
| 127 134 | 
             
                #
         | 
| 128 135 | 
             
                def docnumber
         | 
| 129 | 
            -
                  @docnumber ||= doc.at("./publicationinfo/stdnumber").text
         | 
| 136 | 
            +
                  @docnumber ||= pubid&.to_id # doc.at("./publicationinfo/stdnumber").text
         | 
| 130 137 | 
             
                end
         | 
| 131 138 |  | 
| 132 139 | 
             
                #
         | 
| @@ -223,7 +230,8 @@ module RelatonIeee | |
| 223 230 | 
             
                    if (ref = fetcher.backrefs[r.text])
         | 
| 224 231 | 
             
                      rel = fetcher.create_relation(r[:type], ref)
         | 
| 225 232 | 
             
                      rels << rel if rel
         | 
| 226 | 
            -
                    elsif !/Inactive Date/.match?(r)  | 
| 233 | 
            +
                    elsif !/Inactive Date/.match?(r) && docnumber
         | 
| 234 | 
            +
                      fetcher.add_crossref(docnumber, r)
         | 
| 227 235 | 
             
                    end
         | 
| 228 236 | 
             
                  end
         | 
| 229 237 | 
             
                  RelatonBib::DocRelationCollection.new rels
         | 
| @@ -0,0 +1,149 @@ | |
| 1 | 
            +
            module RelatonIeee
         | 
| 2 | 
            +
              class PubId
         | 
| 3 | 
            +
                class Id
         | 
| 4 | 
            +
                  # @return [String]
         | 
| 5 | 
            +
                  attr_reader :number
         | 
| 6 | 
            +
             | 
| 7 | 
            +
                  # @return [String, nil]
         | 
| 8 | 
            +
                  attr_reader :publisher, :stage, :part, :status, :approval, :edition,
         | 
| 9 | 
            +
                              :draft, :rev, :corr, :amd, :redline, :year, :month
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                  #
         | 
| 12 | 
            +
                  # PubId constructor
         | 
| 13 | 
            +
                  #
         | 
| 14 | 
            +
                  # @param [String] number
         | 
| 15 | 
            +
                  # @param [<Hash>] **args
         | 
| 16 | 
            +
                  # @option args [String] :number
         | 
| 17 | 
            +
                  # @option args [String] :publisher
         | 
| 18 | 
            +
                  # @option args [String] :stage
         | 
| 19 | 
            +
                  # @option args [String] :part
         | 
| 20 | 
            +
                  # @option args [String] :status
         | 
| 21 | 
            +
                  # @option args [String] :approval
         | 
| 22 | 
            +
                  # @option args [String] :edition
         | 
| 23 | 
            +
                  # @option args [String] :draft
         | 
| 24 | 
            +
                  # @option args [String] :rev
         | 
| 25 | 
            +
                  # @option args [String] :corr
         | 
| 26 | 
            +
                  # @option args [String] :amd
         | 
| 27 | 
            +
                  # @option args [Boolean] :redline
         | 
| 28 | 
            +
                  # @option args [String] :year
         | 
| 29 | 
            +
                  # @option args [String] :month
         | 
| 30 | 
            +
                  #
         | 
| 31 | 
            +
                  def initialize(number:, **args) # rubocop:disable Metrics/MethodLength
         | 
| 32 | 
            +
                    @publisher = args[:publisher]
         | 
| 33 | 
            +
                    @stage = args[:stage]
         | 
| 34 | 
            +
                    @number = number
         | 
| 35 | 
            +
                    @part = args[:part]
         | 
| 36 | 
            +
                    @status = args[:status]
         | 
| 37 | 
            +
                    @approval = args[:approval]
         | 
| 38 | 
            +
                    @edition = args[:edition]
         | 
| 39 | 
            +
                    @draft = args[:draft]
         | 
| 40 | 
            +
                    @rev = args[:rev]
         | 
| 41 | 
            +
                    @corr = args[:corr]
         | 
| 42 | 
            +
                    @amd = args[:amd]
         | 
| 43 | 
            +
                    @year = args[:year]
         | 
| 44 | 
            +
                    @month = args[:month]
         | 
| 45 | 
            +
                    @redline = args[:redline]
         | 
| 46 | 
            +
                  end
         | 
| 47 | 
            +
             | 
| 48 | 
            +
                  #
         | 
| 49 | 
            +
                  # PubId string representation
         | 
| 50 | 
            +
                  #
         | 
| 51 | 
            +
                  # @return [String]
         | 
| 52 | 
            +
                  #
         | 
| 53 | 
            +
                  def to_s # rubocop:disable Metrics/AbcSize
         | 
| 54 | 
            +
                    out = number
         | 
| 55 | 
            +
                    out = "#{stage} #{out}" if stage
         | 
| 56 | 
            +
                    out = "#{approval} #{out}" if approval
         | 
| 57 | 
            +
                    out = "#{status} #{out}" if status
         | 
| 58 | 
            +
                    out = "#{publisher} #{out}" if publisher
         | 
| 59 | 
            +
                    out += "-#{part}" if part
         | 
| 60 | 
            +
                    out += edition_to_s + draft_to_s + rev_to_s + corr_to_s + amd_to_s
         | 
| 61 | 
            +
                    out + year_to_s + month_to_s + redline_to_s
         | 
| 62 | 
            +
                  end
         | 
| 63 | 
            +
             | 
| 64 | 
            +
                  def edition_to_s
         | 
| 65 | 
            +
                    edition ? "/E-#{edition}" : ""
         | 
| 66 | 
            +
                  end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  def draft_to_s
         | 
| 69 | 
            +
                    draft ? "/D-#{draft}" : ""
         | 
| 70 | 
            +
                  end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                  def rev_to_s
         | 
| 73 | 
            +
                    rev ? "/R-#{rev}" : ""
         | 
| 74 | 
            +
                  end
         | 
| 75 | 
            +
             | 
| 76 | 
            +
                  def corr_to_s
         | 
| 77 | 
            +
                    corr ? "/Cor#{corr}" : ""
         | 
| 78 | 
            +
                  end
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                  def amd_to_s
         | 
| 81 | 
            +
                    amd ? "/Amd#{amd}" : ""
         | 
| 82 | 
            +
                  end
         | 
| 83 | 
            +
             | 
| 84 | 
            +
                  def year_to_s
         | 
| 85 | 
            +
                    year ? ".#{year}" : ""
         | 
| 86 | 
            +
                  end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
                  def month_to_s
         | 
| 89 | 
            +
                    month ? "-#{month}" : ""
         | 
| 90 | 
            +
                  end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                  def redline_to_s
         | 
| 93 | 
            +
                    redline ? " Redline" : ""
         | 
| 94 | 
            +
                  end
         | 
| 95 | 
            +
                end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                # @return [Array<RelatonIeee::PubId::Id>]
         | 
| 98 | 
            +
                attr_reader :pubid
         | 
| 99 | 
            +
             | 
| 100 | 
            +
                #
         | 
| 101 | 
            +
                # IEEE publication id
         | 
| 102 | 
            +
                #
         | 
| 103 | 
            +
                # @param [Array<Hash>, Hash] pubid
         | 
| 104 | 
            +
                #
         | 
| 105 | 
            +
                def initialize(pubid)
         | 
| 106 | 
            +
                  @pubid = array(pubid).map { |id| Id.new(**id) }
         | 
| 107 | 
            +
                end
         | 
| 108 | 
            +
             | 
| 109 | 
            +
                #
         | 
| 110 | 
            +
                # Convert to array
         | 
| 111 | 
            +
                #
         | 
| 112 | 
            +
                # @param [Array<Hash>, Hash] pid
         | 
| 113 | 
            +
                #
         | 
| 114 | 
            +
                # @return [Array<Hash>]
         | 
| 115 | 
            +
                #
         | 
| 116 | 
            +
                def array(pid)
         | 
| 117 | 
            +
                  pid.is_a?(Array) ? pid : [pid]
         | 
| 118 | 
            +
                end
         | 
| 119 | 
            +
             | 
| 120 | 
            +
                #
         | 
| 121 | 
            +
                # PubId string representation
         | 
| 122 | 
            +
                #
         | 
| 123 | 
            +
                # @return [String]
         | 
| 124 | 
            +
                #
         | 
| 125 | 
            +
                def to_s
         | 
| 126 | 
            +
                  pubid.map(&:to_s).join("/")
         | 
| 127 | 
            +
                end
         | 
| 128 | 
            +
             | 
| 129 | 
            +
                #
         | 
| 130 | 
            +
                # Generate ID without publisher and second number
         | 
| 131 | 
            +
                #
         | 
| 132 | 
            +
                # @return [String]
         | 
| 133 | 
            +
                #
         | 
| 134 | 
            +
                def to_id # rubocop:disable Metrics/MethodLength,Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
         | 
| 135 | 
            +
                  out = pubid[0].to_s
         | 
| 136 | 
            +
                  if pubid.size > 1
         | 
| 137 | 
            +
                    out += pubid[1].edition_to_s if pubid[0].edition.nil?
         | 
| 138 | 
            +
                    out += pubid[1].draft_to_s if pubid[0].draft.nil?
         | 
| 139 | 
            +
                    out += pubid[1].rev_to_s if pubid[0].rev.nil?
         | 
| 140 | 
            +
                    out += pubid[1].corr_to_s if pubid[0].corr.nil?
         | 
| 141 | 
            +
                    out += pubid[1].amd_to_s if pubid[0].amd.nil?
         | 
| 142 | 
            +
                    out += pubid[1].year_to_s if pubid[0].year.nil?
         | 
| 143 | 
            +
                    out += pubid[1].month_to_s if pubid[0].month.nil?
         | 
| 144 | 
            +
                    out += pubid[1].redline_to_s unless pubid[0].redline
         | 
| 145 | 
            +
                  end
         | 
| 146 | 
            +
                  out
         | 
| 147 | 
            +
                end
         | 
| 148 | 
            +
              end
         | 
| 149 | 
            +
            end
         | 
| @@ -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
         | 
    
        data/lib/relaton_ieee/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: relaton-ieee
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.9. | 
| 4 | 
            +
              version: 1.9.3
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ribose Inc.
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2021- | 
| 11 | 
            +
            date: 2021-11-13 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: equivalent-xml
         | 
| @@ -156,6 +156,8 @@ files: | |
| 156 156 | 
             
            - lib/relaton_ieee/ieee_bibliographic_item.rb
         | 
| 157 157 | 
             
            - lib/relaton_ieee/ieee_bibliography.rb
         | 
| 158 158 | 
             
            - lib/relaton_ieee/processor.rb
         | 
| 159 | 
            +
            - lib/relaton_ieee/pub_id.rb
         | 
| 160 | 
            +
            - lib/relaton_ieee/rawbib_id_parser.rb
         | 
| 159 161 | 
             
            - lib/relaton_ieee/scrapper.rb
         | 
| 160 162 | 
             
            - lib/relaton_ieee/version.rb
         | 
| 161 163 | 
             
            - lib/relaton_ieee/xml_parser.rb
         |