pubid 1.15.19 → 2.0.0.pre.alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/README.adoc +2041 -53
- data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
- data/archived-gems/pubid-iec/stages.yaml +129 -0
- data/archived-gems/pubid-iec/update_codes.yaml +67 -0
- data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
- data/archived-gems/pubid-iso/stages.yaml +106 -0
- data/archived-gems/pubid-iso/update_codes.yaml +4 -0
- data/archived-gems/pubid-itu/i18n.yaml +13 -0
- data/archived-gems/pubid-itu/series.yaml +42 -0
- data/archived-gems/pubid-nist/publishers.yaml +6 -0
- data/archived-gems/pubid-nist/series.yaml +121 -0
- data/archived-gems/pubid-nist/stages.yaml +16 -0
- data/archived-gems/pubid-nist/update_codes.yaml +93 -0
- data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
- data/data/ccsds/update_codes.yaml +1 -0
- data/data/iec/update_codes.yaml +67 -0
- data/data/ieee/update_codes.yaml +104 -0
- data/data/iso/update_codes.yaml +21 -0
- data/data/nist/update_codes.yaml +87 -0
- data/data/plateau/update_codes.yaml +6 -0
- data/lib/pubid/amca/builder.rb +176 -0
- data/lib/pubid/amca/identifier.rb +18 -0
- data/lib/pubid/amca/identifiers/base.rb +64 -0
- data/lib/pubid/amca/identifiers/interpretation.rb +51 -0
- data/lib/pubid/amca/identifiers/publication.rb +47 -0
- data/lib/pubid/amca/identifiers/standard.rb +22 -0
- data/lib/pubid/amca/identifiers.rb +12 -0
- data/lib/pubid/amca/parser.rb +153 -0
- data/lib/pubid/amca/scheme.rb +16 -0
- data/lib/pubid/amca/single_identifier.rb +33 -0
- data/lib/pubid/amca/urn_generator.rb +50 -0
- data/lib/pubid/amca.rb +26 -0
- data/lib/pubid/ansi/builder.rb +52 -0
- data/lib/pubid/ansi/identifier.rb +13 -0
- data/lib/pubid/ansi/identifiers/american_national_standard.rb +12 -0
- data/lib/pubid/ansi/identifiers/standard.rb +16 -0
- data/lib/pubid/ansi/identifiers.rb +11 -0
- data/lib/pubid/ansi/parser.rb +91 -0
- data/lib/pubid/ansi/scheme.rb +15 -0
- data/lib/pubid/ansi/single_identifier.rb +45 -0
- data/lib/pubid/ansi/urn_generator.rb +76 -0
- data/lib/pubid/ansi.rb +27 -0
- data/lib/pubid/api/builder.rb +85 -0
- data/lib/pubid/api/components/code.rb +9 -0
- data/lib/pubid/api/identifier.rb +21 -0
- data/lib/pubid/api/identifiers/base.rb +24 -0
- data/lib/pubid/api/identifiers/bulletin.rb +15 -0
- data/lib/pubid/api/identifiers/continuous_operations_standard.rb +15 -0
- data/lib/pubid/api/identifiers/mpms.rb +44 -0
- data/lib/pubid/api/identifiers/publication.rb +15 -0
- data/lib/pubid/api/identifiers/recommended_practice.rb +15 -0
- data/lib/pubid/api/identifiers/specification.rb +15 -0
- data/lib/pubid/api/identifiers/standard.rb +15 -0
- data/lib/pubid/api/identifiers/technical_report.rb +15 -0
- data/lib/pubid/api/identifiers/typeless_standard.rb +27 -0
- data/lib/pubid/api/parser.rb +140 -0
- data/lib/pubid/api/scheme.rb +66 -0
- data/lib/pubid/api/single_identifier.rb +46 -0
- data/lib/pubid/api/urn_generator.rb +41 -0
- data/lib/pubid/api.rb +17 -0
- data/lib/pubid/ashrae/builder.rb +498 -0
- data/lib/pubid/ashrae/identifier.rb +18 -0
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +46 -0
- data/lib/pubid/ashrae/identifiers/addendum.rb +55 -0
- data/lib/pubid/ashrae/identifiers/base.rb +23 -0
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +51 -0
- data/lib/pubid/ashrae/identifiers/errata.rb +40 -0
- data/lib/pubid/ashrae/identifiers/guideline.rb +38 -0
- data/lib/pubid/ashrae/identifiers/interpretation.rb +39 -0
- data/lib/pubid/ashrae/identifiers/standard.rb +38 -0
- data/lib/pubid/ashrae/identifiers.rb +16 -0
- data/lib/pubid/ashrae/parser.rb +724 -0
- data/lib/pubid/ashrae/scheme.rb +53 -0
- data/lib/pubid/ashrae/single_identifier.rb +23 -0
- data/lib/pubid/ashrae/supplement_identifier.rb +23 -0
- data/lib/pubid/ashrae/urn_generator.rb +59 -0
- data/lib/pubid/ashrae.rb +21 -0
- data/lib/pubid/asme/builder.rb +153 -0
- data/lib/pubid/asme/components/code.rb +18 -0
- data/lib/pubid/asme/identifier.rb +15 -0
- data/lib/pubid/asme/identifiers/base.rb +70 -0
- data/lib/pubid/asme/identifiers/standard.rb +12 -0
- data/lib/pubid/asme/identifiers.rb +10 -0
- data/lib/pubid/asme/parser.rb +308 -0
- data/lib/pubid/asme/scheme.rb +37 -0
- data/lib/pubid/asme/single_identifier.rb +29 -0
- data/lib/pubid/asme/urn_generator.rb +133 -0
- data/lib/pubid/asme.rb +21 -0
- data/lib/pubid/astm/builder.rb +159 -0
- data/lib/pubid/astm/components/code.rb +33 -0
- data/lib/pubid/astm/identifier.rb +15 -0
- data/lib/pubid/astm/identifiers/adjunct.rb +21 -0
- data/lib/pubid/astm/identifiers/base.rb +13 -0
- data/lib/pubid/astm/identifiers/data_series.rb +25 -0
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +74 -0
- data/lib/pubid/astm/identifiers/manual.rb +40 -0
- data/lib/pubid/astm/identifiers/monograph.rb +25 -0
- data/lib/pubid/astm/identifiers/research_report.rb +18 -0
- data/lib/pubid/astm/identifiers/standard.rb +52 -0
- data/lib/pubid/astm/identifiers/technical_report.rb +23 -0
- data/lib/pubid/astm/identifiers/work_in_progress.rb +21 -0
- data/lib/pubid/astm/parser.rb +244 -0
- data/lib/pubid/astm/scheme.rb +55 -0
- data/lib/pubid/astm/single_identifier.rb +25 -0
- data/lib/pubid/astm/urn_generator.rb +99 -0
- data/lib/pubid/astm.rb +38 -0
- data/lib/pubid/bsi/builder.rb +1483 -0
- data/lib/pubid/bsi/components/code.rb +11 -0
- data/lib/pubid/bsi/components/date.rb +11 -0
- data/lib/pubid/bsi/components/publisher.rb +11 -0
- data/lib/pubid/bsi/components/type.rb +11 -0
- data/lib/pubid/bsi/identifier.rb +27 -0
- data/lib/pubid/bsi/identifiers/addendum_document.rb +64 -0
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +95 -0
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +82 -0
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +118 -0
- data/lib/pubid/bsi/identifiers/amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/base.rb +11 -0
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +27 -0
- data/lib/pubid/bsi/identifiers/british_standard.rb +33 -0
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +114 -0
- data/lib/pubid/bsi/identifiers/committee_document.rb +51 -0
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +152 -0
- data/lib/pubid/bsi/identifiers/corrigendum.rb +28 -0
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +69 -0
- data/lib/pubid/bsi/identifiers/disc.rb +56 -0
- data/lib/pubid/bsi/identifiers/draft_document.rb +71 -0
- data/lib/pubid/bsi/identifiers/electronic_book.rb +52 -0
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +47 -0
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +82 -0
- data/lib/pubid/bsi/identifiers/flex.rb +61 -0
- data/lib/pubid/bsi/identifiers/handbook.rb +39 -0
- data/lib/pubid/bsi/identifiers/index.rb +62 -0
- data/lib/pubid/bsi/identifiers/method.rb +76 -0
- data/lib/pubid/bsi/identifiers/national_annex.rb +73 -0
- data/lib/pubid/bsi/identifiers/practice_guide.rb +27 -0
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +79 -0
- data/lib/pubid/bsi/identifiers/published_document.rb +79 -0
- data/lib/pubid/bsi/identifiers/section.rb +62 -0
- data/lib/pubid/bsi/identifiers/set.rb +46 -0
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/supplement_document.rb +51 -0
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +81 -0
- data/lib/pubid/bsi/identifiers/technical_specification.rb +79 -0
- data/lib/pubid/bsi/identifiers/test_method.rb +67 -0
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +52 -0
- data/lib/pubid/bsi/identifiers.rb +52 -0
- data/lib/pubid/bsi/model.rb +196 -0
- data/lib/pubid/bsi/parser.rb +659 -0
- data/lib/pubid/bsi/scheme.rb +243 -0
- data/lib/pubid/bsi/single_identifier.rb +129 -0
- data/lib/pubid/bsi/urn_generator.rb +84 -0
- data/lib/pubid/bsi.rb +32 -0
- data/lib/pubid/builder/base.rb +138 -0
- data/lib/pubid/bundled_identifier.rb +126 -0
- data/lib/pubid/ccsds/builder.rb +56 -0
- data/lib/pubid/ccsds/identifier.rb +16 -0
- data/lib/pubid/ccsds/identifiers/base.rb +78 -0
- data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +39 -0
- data/lib/pubid/ccsds/identifiers.rb +10 -0
- data/lib/pubid/ccsds/parser.rb +71 -0
- data/lib/pubid/ccsds/scheme.rb +57 -0
- data/lib/pubid/ccsds/single_identifier.rb +74 -0
- data/lib/pubid/ccsds/supplement_identifier.rb +33 -0
- data/lib/pubid/ccsds/urn_generator.rb +115 -0
- data/lib/pubid/ccsds.rb +21 -0
- data/lib/pubid/cen_cenelec/builder.rb +330 -0
- data/lib/pubid/cen_cenelec/identifier.rb +15 -0
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +40 -0
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +29 -0
- data/lib/pubid/cen_cenelec/identifiers/base.rb +75 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +61 -0
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +35 -0
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +41 -0
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +37 -0
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +22 -0
- data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +35 -0
- data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
- data/lib/pubid/cen_cenelec/parser.rb +144 -0
- data/lib/pubid/cen_cenelec/scheme.rb +164 -0
- data/lib/pubid/cen_cenelec/single_identifier.rb +130 -0
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +48 -0
- data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
- data/lib/pubid/cen_cenelec.rb +21 -0
- data/lib/pubid/cie/builder.rb +399 -0
- data/lib/pubid/cie/components/code.rb +72 -0
- data/lib/pubid/cie/components/language.rb +58 -0
- data/lib/pubid/cie/identifier.rb +18 -0
- data/lib/pubid/cie/identifiers/bundle.rb +20 -0
- data/lib/pubid/cie/identifiers/conference.rb +32 -0
- data/lib/pubid/cie/identifiers/corrigendum.rb +40 -0
- data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
- data/lib/pubid/cie/identifiers/identical.rb +64 -0
- data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
- data/lib/pubid/cie/identifiers/standard.rb +58 -0
- data/lib/pubid/cie/identifiers/supplement.rb +45 -0
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +20 -0
- data/lib/pubid/cie/identifiers.rb +17 -0
- data/lib/pubid/cie/parser.rb +347 -0
- data/lib/pubid/cie/scheme.rb +64 -0
- data/lib/pubid/cie/single_identifier.rb +30 -0
- data/lib/pubid/cie/supplement_identifier.rb +26 -0
- data/lib/pubid/cie/urn_generator.rb +123 -0
- data/lib/pubid/cie.rb +28 -0
- data/lib/pubid/components/code.rb +33 -0
- data/lib/pubid/components/date.rb +49 -0
- data/lib/pubid/components/edition.rb +32 -0
- data/lib/pubid/components/language.rb +37 -0
- data/lib/pubid/components/locality.rb +10 -0
- data/lib/pubid/components/publisher.rb +36 -0
- data/lib/pubid/components/stage.rb +54 -0
- data/lib/pubid/components/type.rb +58 -0
- data/lib/pubid/components/typed_stage.rb +55 -0
- data/lib/pubid/components.rb +15 -0
- data/lib/pubid/core/pattern_doc_generator.rb +272 -0
- data/lib/pubid/core/update_codes.rb +77 -0
- data/lib/pubid/core.rb +8 -0
- data/lib/pubid/csa/builder.rb +671 -0
- data/lib/pubid/csa/components/code.rb +9 -0
- data/lib/pubid/csa/components.rb +9 -0
- data/lib/pubid/csa/composite_identifier.rb +27 -0
- data/lib/pubid/csa/identifier.rb +457 -0
- data/lib/pubid/csa/identifiers/base.rb +133 -0
- data/lib/pubid/csa/identifiers/bundled.rb +125 -0
- data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
- data/lib/pubid/csa/identifiers/cec.rb +129 -0
- data/lib/pubid/csa/identifiers/combined.rb +130 -0
- data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
- data/lib/pubid/csa/identifiers/package.rb +65 -0
- data/lib/pubid/csa/identifiers/series.rb +127 -0
- data/lib/pubid/csa/identifiers/standard.rb +10 -0
- data/lib/pubid/csa/identifiers.rb +17 -0
- data/lib/pubid/csa/parser.rb +445 -0
- data/lib/pubid/csa/scheme.rb +44 -0
- data/lib/pubid/csa/single_identifier.rb +30 -0
- data/lib/pubid/csa/urn_generator.rb +80 -0
- data/lib/pubid/csa/wrapper_identifier.rb +31 -0
- data/lib/pubid/csa.rb +25 -0
- data/lib/pubid/etsi/builder.rb +133 -0
- data/lib/pubid/etsi/components/code.rb +42 -0
- data/lib/pubid/etsi/components/version.rb +37 -0
- data/lib/pubid/etsi/components.rb +10 -0
- data/lib/pubid/etsi/identifier.rb +14 -0
- data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
- data/lib/pubid/etsi/identifiers/base.rb +38 -0
- data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +19 -0
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +91 -0
- data/lib/pubid/etsi/identifiers.rb +14 -0
- data/lib/pubid/etsi/parser.rb +133 -0
- data/lib/pubid/etsi/scheme.rb +42 -0
- data/lib/pubid/etsi/urn_generator.rb +76 -0
- data/lib/pubid/etsi.rb +21 -0
- data/lib/pubid/export/auditor.rb +89 -0
- data/lib/pubid/export/data_class_exporter.rb +59 -0
- data/lib/pubid/export/exporter.rb +74 -0
- data/lib/pubid/export/flavor_exporter.rb +402 -0
- data/lib/pubid/export/ieee_exporter.rb +78 -0
- data/lib/pubid/export/itu_exporter.rb +66 -0
- data/lib/pubid/export/nist_exporter.rb +64 -0
- data/lib/pubid/export/registry_exporter.rb +90 -0
- data/lib/pubid/export/result.rb +97 -0
- data/lib/pubid/export/scheme_exporter.rb +70 -0
- data/lib/pubid/export.rb +18 -0
- data/lib/pubid/format_detector.rb +16 -0
- data/lib/pubid/format_registry.rb +42 -0
- data/lib/pubid/identifier.rb +235 -0
- data/lib/pubid/identifier_metadata.rb +148 -0
- data/lib/pubid/identifier_registry.rb +198 -0
- data/lib/pubid/idf/builder.rb +82 -0
- data/lib/pubid/idf/identifier.rb +69 -0
- data/lib/pubid/idf/identifiers/amendment.rb +27 -0
- data/lib/pubid/idf/identifiers/corrigendum.rb +27 -0
- data/lib/pubid/idf/identifiers/international_standard.rb +123 -0
- data/lib/pubid/idf/identifiers/reviewed_method.rb +100 -0
- data/lib/pubid/idf/identifiers.rb +13 -0
- data/lib/pubid/idf/parser.rb +143 -0
- data/lib/pubid/idf/scheme.rb +61 -0
- data/lib/pubid/idf/single_identifier.rb +19 -0
- data/lib/pubid/idf/supplement_identifier.rb +43 -0
- data/lib/pubid/idf/urn_generator.rb +84 -0
- data/lib/pubid/idf.rb +25 -0
- data/lib/pubid/iec/builder.rb +457 -0
- data/lib/pubid/iec/components/code.rb +59 -0
- data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
- data/lib/pubid/iec/components/publisher.rb +35 -0
- data/lib/pubid/iec/components/sheet.rb +32 -0
- data/lib/pubid/iec/components/trf_info.rb +38 -0
- data/lib/pubid/iec/components/vap_suffix.rb +41 -0
- data/lib/pubid/iec/identifier.rb +21 -0
- data/lib/pubid/iec/identifiers/amendment.rb +94 -0
- data/lib/pubid/iec/identifiers/base.rb +78 -0
- data/lib/pubid/iec/identifiers/component_specification.rb +39 -0
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +39 -0
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +86 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +94 -0
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +141 -0
- data/lib/pubid/iec/identifiers/guide.rb +104 -0
- data/lib/pubid/iec/identifiers/international_standard.rb +147 -0
- data/lib/pubid/iec/identifiers/interpretation_sheet.rb +104 -0
- data/lib/pubid/iec/identifiers/operational_document.rb +39 -0
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +101 -0
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +66 -0
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +40 -0
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +40 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +132 -0
- data/lib/pubid/iec/identifiers/technical_specification.rb +132 -0
- data/lib/pubid/iec/identifiers/technology_report.rb +39 -0
- data/lib/pubid/iec/identifiers/test_report_form.rb +78 -0
- data/lib/pubid/iec/identifiers/vap_identifier.rb +77 -0
- data/lib/pubid/iec/identifiers/white_paper.rb +39 -0
- data/lib/pubid/iec/identifiers/working_document.rb +96 -0
- data/lib/pubid/iec/parser.rb +412 -0
- data/lib/pubid/iec/rendering_style.rb +113 -0
- data/lib/pubid/iec/scheme.rb +71 -0
- data/lib/pubid/iec/single_identifier.rb +80 -0
- data/lib/pubid/iec/supplement_identifier.rb +161 -0
- data/lib/pubid/iec/urn_generator.rb +193 -0
- data/lib/pubid/iec/urn_parser.rb +289 -0
- data/lib/pubid/iec.rb +85 -0
- data/lib/pubid/ieee/aiee/builder.rb +71 -0
- data/lib/pubid/ieee/aiee/identifier.rb +105 -0
- data/lib/pubid/ieee/aiee/parser.rb +130 -0
- data/lib/pubid/ieee/aiee.rb +11 -0
- data/lib/pubid/ieee/builder.rb +1237 -0
- data/lib/pubid/ieee/components/code.rb +102 -0
- data/lib/pubid/ieee/components/draft.rb +93 -0
- data/lib/pubid/ieee/components/relationship.rb +157 -0
- data/lib/pubid/ieee/components/typed_stage.rb +100 -0
- data/lib/pubid/ieee/identifier.rb +13 -0
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +33 -0
- data/lib/pubid/ieee/identifiers/base.rb +591 -0
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +35 -0
- data/lib/pubid/ieee/identifiers/corrigendum.rb +37 -0
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +51 -0
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +18 -0
- data/lib/pubid/ieee/identifiers/dual_published.rb +28 -0
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +27 -0
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +34 -0
- data/lib/pubid/ieee/identifiers/joint_development.rb +172 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +51 -0
- data/lib/pubid/ieee/identifiers/nesc/base.rb +56 -0
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +28 -0
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +32 -0
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +26 -0
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +26 -0
- data/lib/pubid/ieee/identifiers/nesc.rb +15 -0
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +20 -0
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +26 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +33 -0
- data/lib/pubid/ieee/identifiers/si_standard.rb +73 -0
- data/lib/pubid/ieee/identifiers/standard.rb +41 -0
- data/lib/pubid/ieee/identifiers/supplement_identifier.rb +23 -0
- data/lib/pubid/ieee/identifiers.rb +33 -0
- data/lib/pubid/ieee/ire/builder.rb +61 -0
- data/lib/pubid/ieee/ire/identifier.rb +58 -0
- data/lib/pubid/ieee/ire/parser.rb +91 -0
- data/lib/pubid/ieee/ire.rb +11 -0
- data/lib/pubid/ieee/nesc/builder.rb +101 -0
- data/lib/pubid/ieee/nesc/parser.rb +154 -0
- data/lib/pubid/ieee/nesc.rb +10 -0
- data/lib/pubid/ieee/parser.rb +1226 -0
- data/lib/pubid/ieee/scheme.rb +90 -0
- data/lib/pubid/ieee/typed_stages.rb +172 -0
- data/lib/pubid/ieee/urn_generator.rb +188 -0
- data/lib/pubid/ieee.rb +32 -0
- data/lib/pubid/ieee_debug.rb +31 -0
- data/lib/pubid/iho/builder.rb +37 -0
- data/lib/pubid/iho/identifier.rb +19 -0
- data/lib/pubid/iho/identifiers/base.rb +41 -0
- data/lib/pubid/iho/identifiers/bibliographic.rb +20 -0
- data/lib/pubid/iho/identifiers/circular_letter.rb +19 -0
- data/lib/pubid/iho/identifiers/miscellaneous.rb +20 -0
- data/lib/pubid/iho/identifiers/publication.rb +19 -0
- data/lib/pubid/iho/identifiers/standard.rb +19 -0
- data/lib/pubid/iho/identifiers.rb +14 -0
- data/lib/pubid/iho/parser.rb +68 -0
- data/lib/pubid/iho/scheme.rb +29 -0
- data/lib/pubid/iho/urn_generator.rb +29 -0
- data/lib/pubid/iho.rb +21 -0
- data/lib/pubid/iso/builder.rb +305 -0
- data/lib/pubid/iso/bundled_identifier.rb +85 -0
- data/lib/pubid/iso/combined_identifier.rb +22 -0
- data/lib/pubid/iso/components/code.rb +36 -0
- data/lib/pubid/iso/components/publisher.rb +60 -0
- data/lib/pubid/iso/components.rb +12 -0
- data/lib/pubid/iso/format_resolver.rb +45 -0
- data/lib/pubid/iso/identifier.rb +69 -0
- data/lib/pubid/iso/identifiers/addendum.rb +104 -0
- data/lib/pubid/iso/identifiers/amendment.rb +128 -0
- data/lib/pubid/iso/identifiers/base.rb +115 -0
- data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
- data/lib/pubid/iso/identifiers/data.rb +76 -0
- data/lib/pubid/iso/identifiers/directives.rb +59 -0
- data/lib/pubid/iso/identifiers/directives_supplement.rb +119 -0
- data/lib/pubid/iso/identifiers/extract.rb +30 -0
- data/lib/pubid/iso/identifiers/guide.rb +100 -0
- data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
- data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
- data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +89 -0
- data/lib/pubid/iso/identifiers/pas.rb +93 -0
- data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
- data/lib/pubid/iso/identifiers/supplement.rb +87 -0
- data/lib/pubid/iso/identifiers/tc_document.rb +108 -0
- data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
- data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
- data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
- data/lib/pubid/iso/identifiers.rb +33 -0
- data/lib/pubid/iso/parser.rb +510 -0
- data/lib/pubid/iso/rendering_style.rb +120 -0
- data/lib/pubid/iso/scheme.rb +187 -0
- data/lib/pubid/iso/single_identifier.rb +61 -0
- data/lib/pubid/iso/supplement_identifier.rb +27 -0
- data/lib/pubid/iso/urn_generator.rb +412 -0
- data/lib/pubid/iso/urn_parser.rb +423 -0
- data/lib/pubid/iso/utilities.rb +86 -0
- data/lib/pubid/iso.rb +50 -0
- data/lib/pubid/itu/builder.rb +171 -0
- data/lib/pubid/itu/components/code.rb +39 -0
- data/lib/pubid/itu/components/sector.rb +35 -0
- data/lib/pubid/itu/components/series.rb +29 -0
- data/lib/pubid/itu/i18n.rb +9 -0
- data/lib/pubid/itu/i18n.yaml +30 -0
- data/lib/pubid/itu/identifier.rb +53 -0
- data/lib/pubid/itu/identifiers/amendment.rb +43 -0
- data/lib/pubid/itu/identifiers/annex.rb +74 -0
- data/lib/pubid/itu/identifiers/base.rb +154 -0
- data/lib/pubid/itu/identifiers/combined_identifier.rb +47 -0
- data/lib/pubid/itu/identifiers/corrigendum.rb +44 -0
- data/lib/pubid/itu/identifiers/recommendation.rb +16 -0
- data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
- data/lib/pubid/itu/identifiers/supplement.rb +46 -0
- data/lib/pubid/itu/identifiers.rb +16 -0
- data/lib/pubid/itu/model.rb +111 -0
- data/lib/pubid/itu/parser.rb +225 -0
- data/lib/pubid/itu/scheme.rb +174 -0
- data/lib/pubid/itu/urn_generator.rb +105 -0
- data/lib/pubid/itu.rb +22 -0
- data/lib/pubid/jcgm/builder.rb +88 -0
- data/lib/pubid/jcgm/components/publisher.rb +20 -0
- data/lib/pubid/jcgm/components.rb +9 -0
- data/lib/pubid/jcgm/identifier.rb +11 -0
- data/lib/pubid/jcgm/identifiers/amendment.rb +35 -0
- data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +51 -0
- data/lib/pubid/jcgm/identifiers.rb +11 -0
- data/lib/pubid/jcgm/parser.rb +84 -0
- data/lib/pubid/jcgm/scheme.rb +60 -0
- data/lib/pubid/jcgm/single_identifier.rb +48 -0
- data/lib/pubid/jcgm/supplement_identifier.rb +16 -0
- data/lib/pubid/jcgm/urn_generator.rb +110 -0
- data/lib/pubid/jcgm.rb +31 -0
- data/lib/pubid/jis/builder.rb +124 -0
- data/lib/pubid/jis/components/code.rb +59 -0
- data/lib/pubid/jis/components.rb +9 -0
- data/lib/pubid/jis/identifier.rb +18 -0
- data/lib/pubid/jis/identifiers/amendment.rb +16 -0
- data/lib/pubid/jis/identifiers/base.rb +72 -0
- data/lib/pubid/jis/identifiers/explanation.rb +22 -0
- data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
- data/lib/pubid/jis/identifiers/standard.rb +27 -0
- data/lib/pubid/jis/identifiers/technical_report.rb +31 -0
- data/lib/pubid/jis/identifiers/technical_specification.rb +31 -0
- data/lib/pubid/jis/identifiers.rb +17 -0
- data/lib/pubid/jis/parser.rb +109 -0
- data/lib/pubid/jis/scheme.rb +49 -0
- data/lib/pubid/jis/single_identifier.rb +37 -0
- data/lib/pubid/jis/supplement_identifier.rb +47 -0
- data/lib/pubid/jis/urn_generator.rb +25 -0
- data/lib/pubid/jis.rb +23 -0
- data/lib/pubid/lutaml/no_store_registration.rb +30 -0
- data/lib/pubid/nist/builder.rb +2100 -0
- data/lib/pubid/nist/components/code.rb +38 -0
- data/lib/pubid/nist/components/edition.rb +118 -0
- data/lib/pubid/nist/components/issue_number.rb +28 -0
- data/lib/pubid/nist/components/part.rb +77 -0
- data/lib/pubid/nist/components/publisher.rb +24 -0
- data/lib/pubid/nist/components/stage.rb +53 -0
- data/lib/pubid/nist/components/supplement.rb +121 -0
- data/lib/pubid/nist/components/translation.rb +42 -0
- data/lib/pubid/nist/components/update.rb +103 -0
- data/lib/pubid/nist/components/version.rb +35 -0
- data/lib/pubid/nist/components/volume.rb +32 -0
- data/lib/pubid/nist/components.rb +19 -0
- data/lib/pubid/nist/configuration.rb +77 -0
- data/lib/pubid/nist/identifiers/base.rb +499 -0
- data/lib/pubid/nist/identifiers/circular.rb +68 -0
- data/lib/pubid/nist/identifiers/circular_supplement.rb +50 -0
- data/lib/pubid/nist/identifiers/commercial_standard.rb +41 -0
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +56 -0
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +56 -0
- data/lib/pubid/nist/identifiers/crpl_report.rb +135 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +94 -0
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +35 -0
- data/lib/pubid/nist/identifiers/handbook.rb +50 -0
- data/lib/pubid/nist/identifiers/internal_report.rb +56 -0
- data/lib/pubid/nist/identifiers/letter_circular.rb +45 -0
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +65 -0
- data/lib/pubid/nist/identifiers/monograph.rb +69 -0
- data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
- data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
- data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
- data/lib/pubid/nist/identifiers/report.rb +68 -0
- data/lib/pubid/nist/identifiers/special_publication.rb +36 -0
- data/lib/pubid/nist/identifiers/technical_note.rb +90 -0
- data/lib/pubid/nist/identifiers.rb +33 -0
- data/lib/pubid/nist/parser.rb +1084 -0
- data/lib/pubid/nist/scheme.rb +199 -0
- data/lib/pubid/nist/supplement_identifier.rb +83 -0
- data/lib/pubid/nist/urn_generator.rb +127 -0
- data/lib/pubid/nist.rb +36 -0
- data/lib/pubid/oiml/builder.rb +189 -0
- data/lib/pubid/oiml/components/code.rb +20 -0
- data/lib/pubid/oiml/components.rb +9 -0
- data/lib/pubid/oiml/identifier.rb +11 -0
- data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
- data/lib/pubid/oiml/identifiers/annex.rb +62 -0
- data/lib/pubid/oiml/identifiers/base.rb +36 -0
- data/lib/pubid/oiml/identifiers/basic_publication.rb +13 -0
- data/lib/pubid/oiml/identifiers/document.rb +13 -0
- data/lib/pubid/oiml/identifiers/expert_report.rb +13 -0
- data/lib/pubid/oiml/identifiers/guide.rb +13 -0
- data/lib/pubid/oiml/identifiers/recommendation.rb +13 -0
- data/lib/pubid/oiml/identifiers/seminar_report.rb +13 -0
- data/lib/pubid/oiml/identifiers/vocabulary.rb +13 -0
- data/lib/pubid/oiml/identifiers.rb +18 -0
- data/lib/pubid/oiml/parser.rb +173 -0
- data/lib/pubid/oiml/scheme.rb +46 -0
- data/lib/pubid/oiml/single_identifier.rb +90 -0
- data/lib/pubid/oiml/supplement_identifier.rb +43 -0
- data/lib/pubid/oiml/urn_generator.rb +64 -0
- data/lib/pubid/oiml.rb +26 -0
- data/lib/pubid/parser/common_parse_methods.rb +13 -0
- data/lib/pubid/parser/common_parse_rules.rb +56 -0
- data/lib/pubid/parser.rb +8 -0
- data/lib/pubid/parsers/base.rb +11 -0
- data/lib/pubid/parsers/mr_string.rb +93 -0
- data/lib/pubid/plateau/builder.rb +50 -0
- data/lib/pubid/plateau/identifiers/annex.rb +16 -0
- data/lib/pubid/plateau/identifiers/base.rb +51 -0
- data/lib/pubid/plateau/identifiers/handbook.rb +34 -0
- data/lib/pubid/plateau/identifiers/technical_report.rb +20 -0
- data/lib/pubid/plateau/identifiers.rb +12 -0
- data/lib/pubid/plateau/parser.rb +63 -0
- data/lib/pubid/plateau/scheme.rb +45 -0
- data/lib/pubid/plateau/supplement_identifier.rb +72 -0
- data/lib/pubid/plateau/urn_generator.rb +29 -0
- data/lib/pubid/plateau.rb +25 -0
- data/lib/pubid/renderers/base.rb +19 -0
- data/lib/pubid/renderers/directives_renderer.rb +62 -0
- data/lib/pubid/renderers/guide_renderer.rb +20 -0
- data/lib/pubid/renderers/human_readable.rb +58 -0
- data/lib/pubid/renderers/iwa_renderer.rb +16 -0
- data/lib/pubid/renderers/mr_string.rb +16 -0
- data/lib/pubid/renderers/supplement_renderer.rb +33 -0
- data/lib/pubid/renderers/urn.rb +11 -0
- data/lib/pubid/renderers.rb +14 -0
- data/lib/pubid/rendering/base.rb +73 -0
- data/lib/pubid/rendering/common.rb +211 -0
- data/lib/pubid/rendering/context.rb +156 -0
- data/lib/pubid/rendering/date.rb +27 -0
- data/lib/pubid/rendering/format.rb +25 -0
- data/lib/pubid/rendering/language.rb +21 -0
- data/lib/pubid/rendering/numbering.rb +24 -0
- data/lib/pubid/rendering/publisher.rb +25 -0
- data/lib/pubid/rendering/stage.rb +38 -0
- data/lib/pubid/rendering/supplement.rb +46 -0
- data/lib/pubid/rendering.rb +16 -0
- data/lib/pubid/sae/builder.rb +32 -0
- data/lib/pubid/sae/components/code.rb +9 -0
- data/lib/pubid/sae/components/date.rb +19 -0
- data/lib/pubid/sae/components/type.rb +19 -0
- data/lib/pubid/sae/components.rb +11 -0
- data/lib/pubid/sae/identifier.rb +14 -0
- data/lib/pubid/sae/identifiers/base.rb +42 -0
- data/lib/pubid/sae/identifiers.rb +9 -0
- data/lib/pubid/sae/parser.rb +55 -0
- data/lib/pubid/sae/scheme.rb +47 -0
- data/lib/pubid/sae/urn_generator.rb +38 -0
- data/lib/pubid/sae.rb +19 -0
- data/lib/pubid/scheme.rb +207 -0
- data/lib/pubid/urn_generator/base.rb +110 -0
- data/lib/pubid/utils/string_normalizer.rb +196 -0
- data/lib/pubid/utils.rb +7 -0
- data/lib/pubid/version.rb +3 -1
- data/lib/pubid.rb +137 -13
- data/lib/tasks/docs.rake +37 -0
- data/lib/tasks/export.rake +38 -0
- data/lib/tasks/website-data.json +7488 -0
- metadata +613 -171
- data/lib/pubid/registry.rb +0 -30
|
@@ -0,0 +1,591 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Ieee
|
|
5
|
+
module Components
|
|
6
|
+
# Forward declare component classes
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
module Identifiers
|
|
10
|
+
# Base class for all IEEE identifiers
|
|
11
|
+
class Base < Pubid::Identifier
|
|
12
|
+
# Generate URN for this identifier
|
|
13
|
+
#
|
|
14
|
+
# @return [String] URN representation
|
|
15
|
+
|
|
16
|
+
attribute :publisher, :string, default: -> { "IEEE" }
|
|
17
|
+
attribute :copublisher, :string, collection: true # IEC, ISO, ANSI, etc.
|
|
18
|
+
attribute :code, :string # Will store code as object in initialize
|
|
19
|
+
attribute :year, :string
|
|
20
|
+
attribute :type, :string, default: -> { "Std" } # Std, Draft Std
|
|
21
|
+
attribute :draft_status, :string # Unapproved, Approved, Active Unapproved
|
|
22
|
+
attribute :draft, :string # Will store draft as object
|
|
23
|
+
attribute :edition, :string # Edition 1.0
|
|
24
|
+
attribute :month, :string
|
|
25
|
+
attribute :day, :string
|
|
26
|
+
attribute :redline, :boolean, default: -> { false }
|
|
27
|
+
attribute :amendments, Base, collection: true # Amendment identifiers
|
|
28
|
+
attribute :corrigenda, Base, collection: true # Corrigendum identifiers
|
|
29
|
+
attribute :revision_of, Base # Revision relationships
|
|
30
|
+
attribute :incorporates, Base, collection: true # Incorporated documents
|
|
31
|
+
attribute :supersedes, Base, collection: true # Superseded documents
|
|
32
|
+
attribute :supplement_to, Base # For supplements
|
|
33
|
+
attribute :iso_identifier, :string # For IEC/IEEE formats
|
|
34
|
+
attribute :parenthetical_content, :string # Raw parenthetical content
|
|
35
|
+
attribute :note, :string # Parenthetical notes
|
|
36
|
+
attribute :adoption, :string # Adoption notes
|
|
37
|
+
attribute :amendment_to, :string # Amendment to relationships
|
|
38
|
+
attribute :edition_month, :string # Month part from Edition YYYY-MM
|
|
39
|
+
attribute :space_before_draft, :boolean, default: -> {
|
|
40
|
+
false
|
|
41
|
+
} # Track space before /D
|
|
42
|
+
attribute :typed_stage, Components::TypedStage # TYPED_STAGE integration
|
|
43
|
+
attribute :relationships, Components::Relationship, collection: true # Relationship metadata
|
|
44
|
+
attribute :nickname, :string # Book nickname (e.g., "[The Orange Book]")
|
|
45
|
+
attribute :interpretation, :boolean, default: -> {
|
|
46
|
+
false
|
|
47
|
+
} # /INT notation
|
|
48
|
+
attribute :conf_number, :string # Conformance document number
|
|
49
|
+
attribute :conf_year, :string # Conformance document year
|
|
50
|
+
attribute :ashrae_number, :string # ASHRAE Guideline number
|
|
51
|
+
attribute :ashrae_year, :string # ASHRAE Guideline year
|
|
52
|
+
attribute :crossref, :string # IEEE cross-reference (e.g., /C62.22.1-1996)
|
|
53
|
+
attribute :reaffirmed, :string # Reaffirmed year (e.g., "2010" for (R2010))
|
|
54
|
+
|
|
55
|
+
# Store actual component objects
|
|
56
|
+
attr_accessor :code_obj, :draft_obj
|
|
57
|
+
|
|
58
|
+
def initialize(**args)
|
|
59
|
+
super()
|
|
60
|
+
|
|
61
|
+
# Handle typed_stage if provided
|
|
62
|
+
if args[:typed_stage]
|
|
63
|
+
self.typed_stage = args[:typed_stage]
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Handle code as component object
|
|
67
|
+
if args[:code].is_a?(String)
|
|
68
|
+
self.code_obj = Components::Code.parse(args[:code])
|
|
69
|
+
self.code = args[:code]
|
|
70
|
+
elsif args[:code]
|
|
71
|
+
self.code_obj = args[:code]
|
|
72
|
+
self.code = args[:code].to_s
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Handle draft as component object
|
|
76
|
+
if args[:draft_obj]
|
|
77
|
+
self.draft_obj = args[:draft_obj]
|
|
78
|
+
self.draft = args[:draft_obj].to_s
|
|
79
|
+
elsif args[:draft]
|
|
80
|
+
# If draft is passed as string, try to create Draft object
|
|
81
|
+
if args[:draft].is_a?(String)
|
|
82
|
+
# Try to parse the string to extract version/revision
|
|
83
|
+
if args[:draft] =~ /^D(\d+)(?:\.(\d+))?/
|
|
84
|
+
version = $1
|
|
85
|
+
revision = $2
|
|
86
|
+
self.draft_obj = Components::Draft.new(version: version,
|
|
87
|
+
revision: revision)
|
|
88
|
+
else
|
|
89
|
+
# Simple case - treat as version
|
|
90
|
+
self.draft_obj = Components::Draft.new(version: args[:draft])
|
|
91
|
+
end
|
|
92
|
+
self.draft = draft_obj.to_s
|
|
93
|
+
else
|
|
94
|
+
self.draft_obj = args[:draft]
|
|
95
|
+
self.draft = args[:draft].to_s
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Set other attributes
|
|
100
|
+
attrs = self.class.attributes
|
|
101
|
+
args.each do |key, value|
|
|
102
|
+
next if %i[code draft draft_obj typed_stage].include?(key)
|
|
103
|
+
|
|
104
|
+
setter = :"#{key}="
|
|
105
|
+
public_send(setter, value) if attrs.key?(key)
|
|
106
|
+
end
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Override accessors to return component objects
|
|
110
|
+
def code
|
|
111
|
+
code_obj
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def draft
|
|
115
|
+
draft_obj
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# Expose numeric month from draft if available
|
|
119
|
+
def draft_month
|
|
120
|
+
return nil unless draft_obj.is_a?(Components::Draft)
|
|
121
|
+
|
|
122
|
+
draft_obj.numeric_month
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
# Parse IEEE identifier string
|
|
126
|
+
def self.parse(input)
|
|
127
|
+
# Preprocessing: Convert comma-separated dual standards to "and" format
|
|
128
|
+
# This must happen BEFORE the "and" check below
|
|
129
|
+
# Pattern: "IEEE Std 960-1989, Std 1177-1989" -> "IEEE Std 960-1989 and IEEE Std 1177-1989"
|
|
130
|
+
input = input.gsub(/(\d{4}),\s+Std\s/, '\1 and IEEE Std ')
|
|
131
|
+
|
|
132
|
+
# Check for AIEE identifiers (but NOT those with parentheses which have relationships/adoptions)
|
|
133
|
+
# AIEE has its own parser/builder for simple identifiers
|
|
134
|
+
# AIEE inputs with parentheses are handled by IEEE parser for relationship/adoption parsing
|
|
135
|
+
if input.start_with?("AIEE ") && !input.include?("(")
|
|
136
|
+
return Aiee::Identifier.parse(input)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Check for IEC/IEEE copublished patterns first (before other checks)
|
|
140
|
+
if input.start_with?("IEC/IEEE ")
|
|
141
|
+
return parse_single(input)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# Check for semicolon-separated dual identifiers (IEC-first patterns)
|
|
145
|
+
# Pattern: "IEC 61523-3 First edition 2004-09; IEEE 1497"
|
|
146
|
+
if input.include?("; ")
|
|
147
|
+
parts = input.split("; ")
|
|
148
|
+
if parts.length == 2
|
|
149
|
+
# Try to parse both parts
|
|
150
|
+
begin
|
|
151
|
+
first = parse_single(parts[0].strip)
|
|
152
|
+
second = parse_single(parts[1].strip)
|
|
153
|
+
|
|
154
|
+
return Identifiers::DualPublished.new(
|
|
155
|
+
first_identifier: first,
|
|
156
|
+
second_identifier: second,
|
|
157
|
+
)
|
|
158
|
+
rescue Parslet::ParseFailed
|
|
159
|
+
# If parsing fails, continue with normal flow
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# PREPROCESS: Handle (R####) (Revision of...) pattern
|
|
165
|
+
# Convert to single parenthetical: (Reaffirmed ####, Revision of...)
|
|
166
|
+
# This allows parser to capture both in one parenthetical
|
|
167
|
+
if input =~ /\(R(\d{4})\)\s*\(Revision of ([^)]+)\)/
|
|
168
|
+
year = $1
|
|
169
|
+
$2
|
|
170
|
+
# Replace the two parentheticals with reaffirmed info extracted
|
|
171
|
+
# Parse normally but capture year first
|
|
172
|
+
input_modified = input.sub(
|
|
173
|
+
/\(R(\d{4})\)\s*\(Revision of ([^)]+)\)/, "(Revision of \\2)"
|
|
174
|
+
)
|
|
175
|
+
|
|
176
|
+
# Parse the modified input
|
|
177
|
+
result = parse_single(input_modified)
|
|
178
|
+
# Add reaffirmed attribute
|
|
179
|
+
if result.class.attributes.key?(:reaffirmed)
|
|
180
|
+
result.reaffirmed = year
|
|
181
|
+
end
|
|
182
|
+
return result
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# PREPROCESS: Handle (Reaffirmed ####) (Revision of...) pattern (full word format)
|
|
186
|
+
# Pattern: "ANSI/IEEE Std 101-1987 (Reaffirmed 2010) (Revision of IEEE Std 101-1972)"
|
|
187
|
+
if input =~ /\(Reaffirmed\s+(\d{4})\)\s*\(Revision of ([^)]+)\)/
|
|
188
|
+
year = $1
|
|
189
|
+
$2
|
|
190
|
+
# Replace the two parentheticals
|
|
191
|
+
input_modified = input.sub(
|
|
192
|
+
/\(Reaffirmed\s+(\d{4})\)\s*\(Revision of ([^)]+)\)/, "(Revision of \\2)"
|
|
193
|
+
)
|
|
194
|
+
|
|
195
|
+
# Parse the modified input
|
|
196
|
+
result = parse_single(input_modified)
|
|
197
|
+
# Add reaffirmed attribute
|
|
198
|
+
if result.class.attributes.key?(:reaffirmed)
|
|
199
|
+
result.reaffirmed = year
|
|
200
|
+
end
|
|
201
|
+
return result
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# NEW Session 174: Check for IRE dual published pattern
|
|
205
|
+
# Pattern after preprocessing: "IEEE Std 218-1956 (R1980) (56 IRE 28.S2)"
|
|
206
|
+
# First parenthetical: (Rxxx) reaffirmed
|
|
207
|
+
# Second parenthetical: IRE identifier
|
|
208
|
+
if /\(R\d{4}\)\s*\((\d+\s+IRE[^)]+)\)/.match?(input)
|
|
209
|
+
main_part = input.split(" (R").first.strip # Get "IEEE Std 218-1956"
|
|
210
|
+
reaffirmed_year = input.match(/\(R(\d{4})\)/)[1]
|
|
211
|
+
ire_part = input.match(/\((\d+\s+IRE[^)]+)\)/)[1]
|
|
212
|
+
|
|
213
|
+
begin
|
|
214
|
+
# Parse main identifier
|
|
215
|
+
ieee_id = parse_single(main_part)
|
|
216
|
+
# Add reaffirmed year
|
|
217
|
+
ieee_id.reaffirmed = reaffirmed_year if ieee_id.class.attributes.key?(:reaffirmed)
|
|
218
|
+
|
|
219
|
+
# Parse IRE identifier
|
|
220
|
+
ire_id = parse_single(ire_part)
|
|
221
|
+
|
|
222
|
+
return Identifiers::DualPublished.new(
|
|
223
|
+
first_identifier: ieee_id,
|
|
224
|
+
second_identifier: ire_id,
|
|
225
|
+
)
|
|
226
|
+
rescue Parslet::ParseFailed
|
|
227
|
+
# If parsing fails, fall through to regular processing
|
|
228
|
+
end
|
|
229
|
+
end
|
|
230
|
+
|
|
231
|
+
# Check for space-separated dual identifiers (e.g., "IEC 62014-5 IEEE Std 1734-2011")
|
|
232
|
+
# This must be checked before " and " pattern
|
|
233
|
+
# Look for pattern where a second publisher appears after the first complete identifier
|
|
234
|
+
# Publishers: IEEE, AIEE, ANSI, ASA, IEC, ISO, ASTM, NACE, NSF, ASHRAE, NCTA, AESC
|
|
235
|
+
publishers = %w[IEEE AIEE ANSI ASA IEC ISO ASTM NACE NSF ASHRAE NCTA
|
|
236
|
+
AESC]
|
|
237
|
+
|
|
238
|
+
# Find all positions where publishers appear (but NOT inside parentheses)
|
|
239
|
+
# Publishers inside parentheses are part of relationship clauses, not dual published patterns
|
|
240
|
+
publisher_positions = []
|
|
241
|
+
publishers.each do |pub|
|
|
242
|
+
# Look for publisher at word boundaries (preceded by space or start of string)
|
|
243
|
+
regex = /(?:^|\s)(#{Regexp.escape(pub)})(?:\s|\/)/
|
|
244
|
+
input.scan(regex) do
|
|
245
|
+
match_pos = Regexp.last_match.begin(1)
|
|
246
|
+
|
|
247
|
+
# Check if this publisher is inside parentheses (relationship clause)
|
|
248
|
+
# Count parens before this position
|
|
249
|
+
before_match = input[0...match_pos]
|
|
250
|
+
paren_count = before_match.count("(") - before_match.count(")")
|
|
251
|
+
|
|
252
|
+
# Skip publishers inside parentheses - they're part of relationship clauses
|
|
253
|
+
next if paren_count.positive?
|
|
254
|
+
|
|
255
|
+
publisher_positions << { pos: match_pos, publisher: pub }
|
|
256
|
+
end
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
# If we have 2 or more publishers at distinct positions (not co-publishers with /)
|
|
260
|
+
if publisher_positions.length >= 2
|
|
261
|
+
# Sort by position
|
|
262
|
+
publisher_positions.sort_by! { |p| p[:pos] }
|
|
263
|
+
|
|
264
|
+
# Check if they're not part of a co-published pattern (Publisher1/Publisher2)
|
|
265
|
+
# by ensuring there's no slash between them
|
|
266
|
+
first_pub = publisher_positions[0]
|
|
267
|
+
second_pub = publisher_positions[1]
|
|
268
|
+
|
|
269
|
+
# Get the substring between the two publishers
|
|
270
|
+
between = input[first_pub[:pos]..(second_pub[:pos] - 1)]
|
|
271
|
+
|
|
272
|
+
# If there's no slash and no " and ", this might be space-separated dual
|
|
273
|
+
if !between.include?("/") && !between.include?(" and ")
|
|
274
|
+
# Try to split at the second publisher position
|
|
275
|
+
# Back up to find the space before the second publisher
|
|
276
|
+
split_pos = second_pub[:pos]
|
|
277
|
+
while split_pos.positive? && input[split_pos - 1] == " "
|
|
278
|
+
split_pos -= 1
|
|
279
|
+
end
|
|
280
|
+
|
|
281
|
+
first_part = input[0...split_pos].strip
|
|
282
|
+
second_part = input[split_pos..].strip
|
|
283
|
+
|
|
284
|
+
# Try to parse both parts
|
|
285
|
+
begin
|
|
286
|
+
first = parse_single(first_part)
|
|
287
|
+
second = parse_single(second_part)
|
|
288
|
+
|
|
289
|
+
# Only treat as dual if both parse successfully
|
|
290
|
+
return Identifiers::DualPublished.new(
|
|
291
|
+
first_identifier: first,
|
|
292
|
+
second_identifier: second,
|
|
293
|
+
)
|
|
294
|
+
rescue Parslet::ParseFailed
|
|
295
|
+
# If parsing fails, continue with normal flow
|
|
296
|
+
end
|
|
297
|
+
end
|
|
298
|
+
end
|
|
299
|
+
|
|
300
|
+
# Check for dual published patterns with " and "
|
|
301
|
+
if input.include?(" and ")
|
|
302
|
+
# DON'T split if " and " is inside parentheses (likely a relationship clause)
|
|
303
|
+
# Check if parentheses are balanced and " and " is inside them
|
|
304
|
+
paren_count = 0
|
|
305
|
+
and_outside_parens = false
|
|
306
|
+
and_position = nil
|
|
307
|
+
|
|
308
|
+
input.each_char.with_index do |char, i|
|
|
309
|
+
paren_count += 1 if char == "("
|
|
310
|
+
paren_count -= 1 if char == ")"
|
|
311
|
+
|
|
312
|
+
# Check if " and " starts at this position and we're outside parens
|
|
313
|
+
if paren_count.zero? && input[i..(i + 4)] == " and "
|
|
314
|
+
and_outside_parens = true
|
|
315
|
+
and_position = i
|
|
316
|
+
break
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
# Only split if " and " is outside parentheses
|
|
321
|
+
if and_outside_parens && and_position
|
|
322
|
+
# Split at the found position only (not at all " and " occurrences)
|
|
323
|
+
first_part = input[0...and_position].strip
|
|
324
|
+
second_part = input[(and_position + 5)..].strip
|
|
325
|
+
|
|
326
|
+
# Parse each part separately
|
|
327
|
+
first = parse_single(first_part)
|
|
328
|
+
second = parse_single(second_part)
|
|
329
|
+
|
|
330
|
+
return Identifiers::DualPublished.new(
|
|
331
|
+
first_identifier: first,
|
|
332
|
+
second_identifier: second,
|
|
333
|
+
)
|
|
334
|
+
end
|
|
335
|
+
end
|
|
336
|
+
|
|
337
|
+
# NEW Session 171: Check for dual published patterns with " & " (ampersand)
|
|
338
|
+
if input.include?(" & ")
|
|
339
|
+
# DON'T split if " & " is inside parentheses
|
|
340
|
+
paren_count = 0
|
|
341
|
+
ampersand_outside_parens = false
|
|
342
|
+
|
|
343
|
+
input.each_char.with_index do |char, i|
|
|
344
|
+
paren_count += 1 if char == "("
|
|
345
|
+
paren_count -= 1 if char == ")"
|
|
346
|
+
|
|
347
|
+
# Check if " & " starts at this position and we're outside parens
|
|
348
|
+
if paren_count.zero? && input[i..(i + 2)] == " & "
|
|
349
|
+
ampersand_outside_parens = true
|
|
350
|
+
break
|
|
351
|
+
end
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
# Only split if " & " is outside parentheses
|
|
355
|
+
if ampersand_outside_parens
|
|
356
|
+
parts = input.split(" & ")
|
|
357
|
+
if parts.length == 2
|
|
358
|
+
# Parse each part separately
|
|
359
|
+
first = parse_single(parts[0].strip)
|
|
360
|
+
second = parse_single(parts[1].strip)
|
|
361
|
+
|
|
362
|
+
return Identifiers::DualPublished.new(
|
|
363
|
+
first_identifier: first,
|
|
364
|
+
second_identifier: second,
|
|
365
|
+
)
|
|
366
|
+
end
|
|
367
|
+
end
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
# Special case: AIEE identifiers with ASA parenthetical references
|
|
371
|
+
# Pattern: "AIEE No 18-1934 (ASA C55 1934)"
|
|
372
|
+
if input.match?(/^AIEE\s+/) && input.include?("(") && input.include?("ASA")
|
|
373
|
+
main_part = input.split("(").first.strip
|
|
374
|
+
adoption_match = input.match(/\((ASA[^)]+)\)/)
|
|
375
|
+
|
|
376
|
+
if adoption_match
|
|
377
|
+
adoption_part = adoption_match.captures.first
|
|
378
|
+
# Parse the main AIEE identifier
|
|
379
|
+
begin
|
|
380
|
+
aiee_id = parse_single(main_part)
|
|
381
|
+
# Parse the ASA identifier
|
|
382
|
+
asa_id = parse_single(adoption_part)
|
|
383
|
+
|
|
384
|
+
return Identifiers::AdoptedStandard.new(
|
|
385
|
+
ieee_identifier: aiee_id,
|
|
386
|
+
adopted_identifier: asa_id,
|
|
387
|
+
)
|
|
388
|
+
rescue Parslet::ParseFailed
|
|
389
|
+
# If parsing fails, fall through to regular processing
|
|
390
|
+
end
|
|
391
|
+
end
|
|
392
|
+
end
|
|
393
|
+
|
|
394
|
+
# Check for adopted standards (parenthetical adoptions)
|
|
395
|
+
# Only consider it an adoption if the parenthetical content looks like an identifier
|
|
396
|
+
if input.include?("(") && input.include?(")") && !input.start_with?("IEC/IEEE ")
|
|
397
|
+
# Extract the part before parentheses and the adoption part
|
|
398
|
+
main_part = input.split("(").first.strip
|
|
399
|
+
adoption_match = input.match(/\(([^)]+)\)/)
|
|
400
|
+
adoption_part = adoption_match&.captures&.first
|
|
401
|
+
|
|
402
|
+
# Check if adoption_part looks like an identifier (contains publisher or type keywords)
|
|
403
|
+
# BUT exclude revision/amendment/supersedes notes
|
|
404
|
+
# AND exclude Pattern 4 relationship types
|
|
405
|
+
if main_part && adoption_part &&
|
|
406
|
+
!adoption_part.match?(/^\s*(Revision|Revison|Amendment|Corrigendum|Corrigenda|incorporates|Incorporating|Incorporates|Adoption|Supplement|Draft Amendment|DRAFT Amendment|Draft Revision|Reaffirmation|Redesignation|redesignated as|Supersedes|Supercedes|Includes|Previously designated as|Notebooks|Standard Newspaper)/i) &&
|
|
407
|
+
(adoption_part.match?(/\b(ANSI|ISO|IEC|IEEE|AIEE|IRE|ASA|ASTM|CSA|ASME|NACE|NSF|ASHRAE|NCTA|AESC)\s/) ||
|
|
408
|
+
adoption_part.match?(/^\s*(ANSI|ISO|IEC|IEEE|AIEE|IRE|ASA|ASTM|CSA|ASME|NACE|NSF|ASHRAE|NCTA|AESC)\b/) ||
|
|
409
|
+
adoption_part.match?(/\bStd\s+\d+/))
|
|
410
|
+
# Parse the main IEEE identifier
|
|
411
|
+
ieee_id = parse_single(main_part)
|
|
412
|
+
|
|
413
|
+
# Parse comma-separated adopted identifiers
|
|
414
|
+
adopted_parts = adoption_part.split(",").map(&:strip)
|
|
415
|
+
adopted_ids = adopted_parts.map do |part|
|
|
416
|
+
if part.strip.start_with?("IEC")
|
|
417
|
+
# Use IEC parser for IEC adoptions
|
|
418
|
+
# Preprocess to convert "Edition X.Y" to IEC format
|
|
419
|
+
# Pattern: "IEC 60255-24 Edition 2.0 2013-04" → "IEC 60255-24:2013-04 ED2.0"
|
|
420
|
+
iec_part = part.dup
|
|
421
|
+
# Replace " Edition X.Y YYYY-MM" (or similar) with ":YYYY-MM EDX.Y"
|
|
422
|
+
iec_part.gsub!(/\s+Edition\s+([0-9.]+)\s+([0-9-]+)/,
|
|
423
|
+
':\2 ED\1')
|
|
424
|
+
# Replace " Edition X.Y" at end (no date)
|
|
425
|
+
iec_part.gsub!(/\s+Edition\s+([0-9.]+)\s*$/, ' ED\1')
|
|
426
|
+
Pubid::Iec.parse(iec_part)
|
|
427
|
+
elsif part.strip.start_with?("ANSI")
|
|
428
|
+
# Use ANSI parser for ANSI adoptions
|
|
429
|
+
Pubid::Ansi.parse(part)
|
|
430
|
+
else
|
|
431
|
+
# Use IEEE parser for other adoptions
|
|
432
|
+
parse_single(part)
|
|
433
|
+
end
|
|
434
|
+
end
|
|
435
|
+
|
|
436
|
+
return Identifiers::AdoptedStandard.new(
|
|
437
|
+
ieee_identifier: ieee_id,
|
|
438
|
+
adopted_identifiers: adopted_ids,
|
|
439
|
+
)
|
|
440
|
+
end
|
|
441
|
+
# If it doesn't look like an identifier, let the parser handle it as additional_parameters
|
|
442
|
+
end
|
|
443
|
+
|
|
444
|
+
# Fall back to single identifier parsing
|
|
445
|
+
parse_single(input)
|
|
446
|
+
end
|
|
447
|
+
|
|
448
|
+
# Parse a single IEEE identifier
|
|
449
|
+
def self.parse_single(input)
|
|
450
|
+
# Apply legacy update_codes normalization first, before Parser's extensive preprocessing
|
|
451
|
+
normalized = Core::UpdateCodes.apply(input, :ieee)
|
|
452
|
+
parsed = Parser.parse(normalized) # Use class method for preprocessing
|
|
453
|
+
builder = Builder.new(Base)
|
|
454
|
+
# Pass the original input string to builder for context
|
|
455
|
+
builder.original_input = input
|
|
456
|
+
builder.build(parsed)
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
def to_s
|
|
460
|
+
parts = []
|
|
461
|
+
|
|
462
|
+
# Publisher(s) - handle copublisher array properly
|
|
463
|
+
if copublisher && !copublisher.empty?
|
|
464
|
+
# Copublisher is an array, join all publishers with single slash
|
|
465
|
+
parts << [publisher, *copublisher].join("/")
|
|
466
|
+
else
|
|
467
|
+
parts << publisher
|
|
468
|
+
end
|
|
469
|
+
|
|
470
|
+
# Draft status
|
|
471
|
+
parts << draft_status if draft_status
|
|
472
|
+
|
|
473
|
+
# Type - only render for IEEE/AIEE publishers, and only for non-projects
|
|
474
|
+
# Must come BEFORE code
|
|
475
|
+
should_render_type = publisher&.match?(/^(IEEE|AIEE)/)
|
|
476
|
+
|
|
477
|
+
if should_render_type && !typed_stage&.project_status && type && !type.to_s.strip.empty? && type != "P"
|
|
478
|
+
# Non-project with explicit type (Std, No, etc.)
|
|
479
|
+
type_str = type.dup
|
|
480
|
+
# Remove P prefix if somehow present
|
|
481
|
+
type_str = type_str.sub(/^P/, "") if type_str.start_with?("P")
|
|
482
|
+
parts << type_str unless type_str.strip.empty?
|
|
483
|
+
end
|
|
484
|
+
|
|
485
|
+
# Code - with P prefix for projects (concatenated, not separated)
|
|
486
|
+
if code_obj
|
|
487
|
+
result = code_obj.to_s
|
|
488
|
+
|
|
489
|
+
# Prepend P if this is a project AND code doesn't already have P
|
|
490
|
+
if typed_stage&.project_status && should_render_type && !result.start_with?("P")
|
|
491
|
+
result = "P#{result}"
|
|
492
|
+
end
|
|
493
|
+
|
|
494
|
+
# Only attach year to code if there's no edition, no month, and no draft
|
|
495
|
+
result += "-#{year}" if year && !draft_obj && !edition && !month
|
|
496
|
+
|
|
497
|
+
# Append draft to code - with or without space based on original format
|
|
498
|
+
if draft_obj
|
|
499
|
+
result += space_before_draft ? " #{draft_obj}" : draft_obj.to_s
|
|
500
|
+
end
|
|
501
|
+
|
|
502
|
+
# Append interpretation notation (/INT)
|
|
503
|
+
result += "/INT" if interpretation
|
|
504
|
+
|
|
505
|
+
# Append conformance notation (/ConformanceNN-YYYY)
|
|
506
|
+
if conf_number
|
|
507
|
+
result += "/Conformance#{conf_number}"
|
|
508
|
+
result += "-#{conf_year}" if conf_year
|
|
509
|
+
end
|
|
510
|
+
|
|
511
|
+
# Append ASHRAE joint publication (/ASHRAE Guideline NN-YYYY)
|
|
512
|
+
if ashrae_number
|
|
513
|
+
result += "/ASHRAE Guideline #{ashrae_number}"
|
|
514
|
+
result += "-#{ashrae_year}" if ashrae_year
|
|
515
|
+
end
|
|
516
|
+
|
|
517
|
+
# Append IEEE cross-reference (/C62.22.1-1996)
|
|
518
|
+
result += crossref if crossref
|
|
519
|
+
|
|
520
|
+
parts << result
|
|
521
|
+
elsif should_render_type && typed_stage&.project_status
|
|
522
|
+
# No code but is a project - add standalone P
|
|
523
|
+
parts << "P"
|
|
524
|
+
end
|
|
525
|
+
|
|
526
|
+
# Edition - with year if present (IEC style)
|
|
527
|
+
if edition
|
|
528
|
+
edition_str = "Edition #{edition}"
|
|
529
|
+
if year
|
|
530
|
+
edition_str += " #{year}"
|
|
531
|
+
edition_str += "-#{edition_month}" if edition_month
|
|
532
|
+
end
|
|
533
|
+
parts << edition_str
|
|
534
|
+
end
|
|
535
|
+
|
|
536
|
+
# Build the main identifier (without month yet)
|
|
537
|
+
result = parts.join(" ")
|
|
538
|
+
|
|
539
|
+
# Month/Day - append directly to avoid extra space before comma
|
|
540
|
+
if month
|
|
541
|
+
# Format: ", Month Day, Year" or ", Month, Year"
|
|
542
|
+
result += ", #{month}"
|
|
543
|
+
result += " #{day}" if day
|
|
544
|
+
if year && !edition
|
|
545
|
+
# Add comma after month if year follows
|
|
546
|
+
result += ", #{year}"
|
|
547
|
+
end
|
|
548
|
+
end
|
|
549
|
+
|
|
550
|
+
# Add parenthetical content if present
|
|
551
|
+
# Handle multiple parenthetical clauses (reaffirmed + relationships/revision)
|
|
552
|
+
parentheticals = []
|
|
553
|
+
|
|
554
|
+
reaff = reaffirmed
|
|
555
|
+
if reaff && !reaff.to_s.strip.empty?
|
|
556
|
+
parentheticals << "(R#{reaff})"
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
# Then add relationships/revision/amendment as second parenthetical
|
|
560
|
+
if parenthetical_content
|
|
561
|
+
parentheticals << "(#{parenthetical_content})"
|
|
562
|
+
elsif relationships && !relationships.empty?
|
|
563
|
+
# Render relationships (multiple separated by /)
|
|
564
|
+
relationship_str = relationships.join(" / ")
|
|
565
|
+
parentheticals << "(#{relationship_str})"
|
|
566
|
+
elsif revision_of
|
|
567
|
+
parentheticals << "(Revision of IEEE Std #{revision_of})"
|
|
568
|
+
elsif amendment_to
|
|
569
|
+
parentheticals << "(Amendment to IEEE Std #{amendment_to})"
|
|
570
|
+
elsif adoption
|
|
571
|
+
parentheticals << "(Adoption of #{adoption})"
|
|
572
|
+
elsif note && !note.to_s.strip.empty?
|
|
573
|
+
# Only add note if it doesn't duplicate other content
|
|
574
|
+
parentheticals << "(#{note})"
|
|
575
|
+
end
|
|
576
|
+
|
|
577
|
+
# Append all parentheticals with space separation
|
|
578
|
+
result += " #{parentheticals.join(' ')}" unless parentheticals.empty?
|
|
579
|
+
|
|
580
|
+
# Book nickname - outside parentheses in square brackets
|
|
581
|
+
result += " [#{nickname}]" if nickname && !nickname.to_s.strip.empty?
|
|
582
|
+
|
|
583
|
+
# Redline suffix
|
|
584
|
+
result += " - Redline" if redline
|
|
585
|
+
|
|
586
|
+
result
|
|
587
|
+
end
|
|
588
|
+
end
|
|
589
|
+
end
|
|
590
|
+
end
|
|
591
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Ieee
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Conformance identifier for IEEE standards
|
|
7
|
+
# Represents conformance test documents
|
|
8
|
+
# Example: IEEE Std 802.16/Conformance01-2003
|
|
9
|
+
class ConformanceIdentifier < SupplementIdentifier
|
|
10
|
+
attribute :conf_number, :string
|
|
11
|
+
attribute :conf_year, :string
|
|
12
|
+
|
|
13
|
+
# TYPED_STAGES for conformance
|
|
14
|
+
# Conformance uses "Conformance" abbreviation
|
|
15
|
+
TYPED_STAGES = [
|
|
16
|
+
Components::TypedStage.new(
|
|
17
|
+
abbr: ["Conformance"],
|
|
18
|
+
type_code: "conformance",
|
|
19
|
+
stage_code: "published",
|
|
20
|
+
),
|
|
21
|
+
].freeze
|
|
22
|
+
|
|
23
|
+
def to_s
|
|
24
|
+
return base_identifier.to_s unless base_identifier
|
|
25
|
+
|
|
26
|
+
# Format: BASE/ConformanceNN-YEAR
|
|
27
|
+
result = base_identifier.to_s
|
|
28
|
+
result += "/Conformance#{conf_number}" if conf_number
|
|
29
|
+
result += "-#{conf_year}" if conf_year
|
|
30
|
+
result
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Ieee
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Corrigendum identifier for IEEE standards
|
|
7
|
+
# Represents corrections to published standards
|
|
8
|
+
# Example: IEEE Std 535-2013/Cor. 1-2017
|
|
9
|
+
class Corrigendum < SupplementIdentifier
|
|
10
|
+
attribute :cor_number, :string
|
|
11
|
+
attribute :cor_year, :string
|
|
12
|
+
|
|
13
|
+
# TYPED_STAGES for corrigendum
|
|
14
|
+
# Corrigendum uses "Cor" abbreviation
|
|
15
|
+
TYPED_STAGES = [
|
|
16
|
+
Components::TypedStage.new(
|
|
17
|
+
abbr: ["Cor"],
|
|
18
|
+
type_code: "corrigendum",
|
|
19
|
+
stage_code: "published",
|
|
20
|
+
),
|
|
21
|
+
].freeze
|
|
22
|
+
|
|
23
|
+
def to_s
|
|
24
|
+
return super unless base_identifier
|
|
25
|
+
|
|
26
|
+
# Format: BASE/Cor NUMBER-YEAR or BASE/Cor. NUMBER-YEAR
|
|
27
|
+
result = base_identifier.to_s
|
|
28
|
+
result += "/Cor"
|
|
29
|
+
result += ". " if cor_number # Add period and space for formal format
|
|
30
|
+
result += cor_number if cor_number
|
|
31
|
+
result += "-#{cor_year}" if cor_year
|
|
32
|
+
result
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|