Module: Pubid::Ieee

Extended by:
PrefixesSupport
Defined in:
lib/pubid/ieee.rb,
lib/pubid/ieee/ire.rb,
lib/pubid/ieee/aiee.rb,
lib/pubid/ieee/nesc.rb,
lib/pubid/ieee_debug.rb,
lib/pubid/ieee/parser.rb,
lib/pubid/ieee/builder.rb,
lib/pubid/ieee/renderer.rb,
lib/pubid/ieee/compaction.rb,
lib/pubid/ieee/ire/parser.rb,
lib/pubid/ieee/pre_parser.rb,
lib/pubid/ieee/urn_parser.rb,
lib/pubid/ieee/aiee/parser.rb,
lib/pubid/ieee/identifiers.rb,
lib/pubid/ieee/ire/builder.rb,
lib/pubid/ieee/nesc/parser.rb,
lib/pubid/ieee/aiee/builder.rb,
lib/pubid/ieee/nesc/builder.rb,
lib/pubid/ieee/typed_stages.rb,
lib/pubid/ieee/urn_generator.rb,
lib/pubid/ieee/ire/identifier.rb,
lib/pubid/ieee/aiee/identifier.rb,
lib/pubid/ieee/components/code.rb,
lib/pubid/ieee/components/draft.rb,
lib/pubid/ieee/identifiers/base.rb,
lib/pubid/ieee/identifiers/nesc.rb,
lib/pubid/ieee/identifiers/standard.rb,
lib/pubid/ieee/identifiers/amendment.rb,
lib/pubid/ieee/identifiers/nesc/base.rb,
lib/pubid/ieee/components/typed_stage.rb,
lib/pubid/ieee/identifiers/nesc/draft.rb,
lib/pubid/ieee/components/relationship.rb,
lib/pubid/ieee/identifiers/code_number.rb,
lib/pubid/ieee/identifiers/corrigendum.rb,
lib/pubid/ieee/identifiers/si_standard.rb,
lib/pubid/ieee/identifiers/nesc/edition.rb,
lib/pubid/ieee/identifiers/nesc/redline.rb,
lib/pubid/ieee/identifiers/nesc/handbook.rb,
lib/pubid/ieee/identifiers/nesc/standard.rb,
lib/pubid/ieee/identifiers/dual_published.rb,
lib/pubid/ieee/identifiers/dual_identifier.rb,
lib/pubid/ieee/identifiers/adopted_standard.rb,
lib/pubid/ieee/identifiers/joint_development.rb,
lib/pubid/ieee/identifiers/redlined_standard.rb,
lib/pubid/ieee/identifiers/csa_dual_published.rb,
lib/pubid/ieee/identifiers/iec_ieee_copublished.rb,
lib/pubid/ieee/identifiers/supplement_identifier.rb,
lib/pubid/ieee/identifiers/conformance_identifier.rb,
lib/pubid/ieee/identifiers/parenthetical_identifier.rb,
lib/pubid/ieee/identifiers/project_draft_identifier.rb,
lib/pubid/ieee/identifiers/interpretation_identifier.rb,
lib/pubid/ieee/identifiers/multi_numbered_identifier.rb

Defined Under Namespace

Modules: Aiee, Compaction, Components, Identifiers, Ire, Nesc, PreParser, TypedStages Classes: Builder, Identifier, Parser, Renderer, UrnGenerator, UrnParser

Constant Summary collapse

PREFIXES =

Publisher prefix. The private PreParser::PUBLISHERS list also holds adopted co-org names (ANSI, AIEE, ASA, ...) that are not leading routing tokens for an IEEE reference, so they are deliberately excluded. The joint ISO/IEC/IEEE form comes from Pubid::JOINT_PREFIXES.

["IEEE"].freeze
REGISTERED_SERIES =

Document-number series carrying an IEEE registered trademark ("®"). 8802 is the ISO/IEC co-published form of the 802 series.

%w[802 8802 2030].freeze
ISO_ADOPTED_SERIES =

The ISO/IEC adoption of IEEE 802: the number alone identifies the series, whatever publishers are printed.

"8802"
TYPED_STAGES =

Backward compatibility aliases at module level These allow code expecting Pubid::Ieee::TYPED_STAGES to still work

TypedStages::TYPED_STAGES
DEFAULT_TYPED_STAGE =
TypedStages::DEFAULT_TYPED_STAGE

Class Method Summary collapse

Methods included from PrefixesSupport

prefix_flavor_key, prefixes

Class Method Details

.all_typed_stagesArray<Pubid::Components::TypedStage>

Build typed stage index from TypedStages module

Returns:



107
108
109
# File 'lib/pubid/ieee.rb', line 107

def all_typed_stages
  @all_typed_stages ||= TypedStages::TYPED_STAGES
end

.identifier_typesArray<Class>

Auto-discover all identifier types from the Identifiers namespace

Returns:

  • (Array<Class>)

    identifier classes that define a self.type Hash



98
99
100
101
102
103
# File 'lib/pubid/ieee.rb', line 98

def identifier_types
  @identifier_types ||= Identifiers.constants
    .filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
    .select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
    .select { |c| c.type.is_a?(Hash) }
end

.locate_stage(abbr) ⇒ Pubid::Components::TypedStage?

Lookup: abbreviation -> typed stage

Parameters:

  • abbr (String, Symbol)

    the abbreviation to find

Returns:



121
122
123
124
# File 'lib/pubid/ieee.rb', line 121

def locate_stage(abbr)
  abbr_str = abbr.to_s.upcase
  all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
end

.locate_stage_by_ieee_draft(draft) ⇒ Pubid::Components::TypedStage?

Lookup: IEEE draft notation -> typed stage

Parameters:

  • draft (String)

    IEEE draft notation (e.g., "D1", "D5", "P")

Returns:



129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/pubid/ieee.rb', line 129

def locate_stage_by_ieee_draft(draft)
  return nil if draft.nil? || draft.to_s.strip.empty?

  draft_str = draft.to_s.strip

  # Try exact match on abbreviation first
  ts = all_typed_stages.find { |t| t.abbr.include?(draft_str) }
  return ts if ts

  # Try match on ieee_draft_equivalent
  all_typed_stages.find { |t| t.ieee_draft_equivalent == draft_str }
end

.locate_stage_by_iso_stage(stage) ⇒ Pubid::Components::TypedStage?

Lookup: ISO stage code -> typed stage

Parameters:

  • stage (String)

    ISO stage code (e.g., "WD", "CD", "DIS", "FDIS")

Returns:



145
146
147
148
149
# File 'lib/pubid/ieee.rb', line 145

def locate_stage_by_iso_stage(stage)
  return nil if stage.nil? || stage.to_s.strip.empty?

  all_typed_stages.find { |ts| ts.iso_stage_equivalent == stage.to_s.strip }
end

.locate_type(code) ⇒ Class?

Lookup: type code -> identifier class

Parameters:

  • code (String, Symbol)

    the type key to find

Returns:

  • (Class, nil)

    the matching identifier class



114
115
116
# File 'lib/pubid/ieee.rb', line 114

def locate_type(code)
  identifier_types.find { |t| t.type[:key].to_s == code.to_s }
end

.parse(input) ⇒ Object



44
45
46
47
48
49
50
# File 'lib/pubid/ieee.rb', line 44

def parse(input)
  if input.length > Pubid::MAX_INPUT_LENGTH
    raise ArgumentError, Pubid::INPUT_TOO_LONG_MESSAGE
  end

  Identifier.parse(input)
end

.registered_series?(number, prefix = nil, publishers: nil) ⇒ Boolean

True when the document number belongs to a registered-trademark series. A project number keeps its series identity, so a leading "P" is stripped. prefix is the code's letter series, which must be absent (or the bare project "P") — "C802.1" is a different series that merely starts with the same digits. publishers guards against claiming an IEEE registered mark for another body that happens to have numbered a document 802 or 2030 — "AIEE Std No. 802" predates the IEEE 802 series by two decades. It is optional: with no publishers given the number decides, which keeps the plain number lookup usable on its own.

Parameters:

  • number (String, nil)

    bare document number ("802", "P802")

  • prefix (String, nil) (defaults to: nil)

    letter series of the code ("C" for C37.09)

  • publishers (Array<String>, String, nil) (defaults to: nil)

    printed publisher tokens

Returns:

  • (Boolean)


64
65
66
67
68
69
70
71
72
73
# File 'lib/pubid/ieee.rb', line 64

def registered_series?(number, prefix = nil, publishers: nil)
  return false unless prefix.nil? || prefix.to_s.empty? ||
    prefix.to_s == "P"

  bare = number.to_s.delete_prefix("P")
  return false unless REGISTERED_SERIES.include?(bare)
  return true if bare == ISO_ADOPTED_SERIES || publishers.nil?

  Array(publishers).any? { |p| p.to_s.split("/").include?("IEEE") }
end

.trademark_symbol(rendered) ⇒ Object

IEEE trademark symbol for a rendered identifier string. Kept for external callers only — every render site inside pubid passes the document number to #trademark_symbol_for instead, because the first numeric token of a rendered string is not reliably the document number (a NESC or IRE string starts with the publication year).



92
93
94
# File 'lib/pubid/ieee.rb', line 92

def trademark_symbol(rendered)
  trademark_symbol_for(rendered.to_s[/(?<![0-9A-Za-z])P?(\d+)/, 1])
end

.trademark_symbol_for(number, prefix = nil, publishers: nil) ⇒ Object

IEEE trademark symbol for a document number: ® for the registered series, ™ for everything else. This is the entry point render sites use, because they hold the identifier and so know its number — the symbol must not depend on where in the rendered string the mark lands.



79
80
81
82
83
84
85
# File 'lib/pubid/ieee.rb', line 79

def trademark_symbol_for(number, prefix = nil, publishers: nil)
  if registered_series?(number, prefix, publishers: publishers)
    "®"
  else
    ""
  end
end