pubid 2.0.0.pre.alpha.1 → 2.0.0.pre.alpha.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/README.adoc +5 -1
- data/data/nist/update_codes.yaml +27 -0
- data/lib/pubid/amca/builder.rb +2 -2
- data/lib/pubid/amca/identifier.rb +7 -0
- data/lib/pubid/amca/identifiers/base.rb +0 -26
- data/lib/pubid/amca/identifiers/interpretation.rb +0 -17
- data/lib/pubid/amca/identifiers/publication.rb +0 -13
- data/lib/pubid/amca/renderer.rb +82 -0
- data/lib/pubid/amca/single_identifier.rb +0 -23
- data/lib/pubid/amca/urn_parser.rb +28 -0
- data/lib/pubid/amca.rb +42 -1
- data/lib/pubid/ansi/builder.rb +5 -3
- data/lib/pubid/ansi/identifier.rb +1 -1
- data/lib/pubid/ansi/identifiers/american_national_standard.rb +2 -1
- data/lib/pubid/ansi/identifiers/standard.rb +2 -3
- data/lib/pubid/ansi/renderer.rb +53 -0
- data/lib/pubid/ansi/single_identifier.rb +2 -31
- data/lib/pubid/ansi/urn_generator.rb +3 -38
- data/lib/pubid/ansi/urn_parser.rb +23 -0
- data/lib/pubid/ansi.rb +38 -3
- data/lib/pubid/api/builder.rb +29 -74
- data/lib/pubid/api/identifier.rb +0 -4
- data/lib/pubid/api/identifiers/base.rb +0 -2
- data/lib/pubid/api/identifiers/bulletin.rb +0 -2
- data/lib/pubid/api/identifiers/continuous_operations_standard.rb +0 -2
- data/lib/pubid/api/identifiers/mpms.rb +1 -17
- data/lib/pubid/api/identifiers/publication.rb +0 -2
- data/lib/pubid/api/identifiers/recommended_practice.rb +0 -2
- data/lib/pubid/api/identifiers/specification.rb +0 -2
- data/lib/pubid/api/identifiers/standard.rb +0 -2
- data/lib/pubid/api/identifiers/technical_report.rb +0 -2
- data/lib/pubid/api/identifiers/typeless_standard.rb +1 -14
- data/lib/pubid/api/identifiers.rb +18 -0
- data/lib/pubid/api/renderer.rb +89 -0
- data/lib/pubid/api/single_identifier.rb +1 -13
- data/lib/pubid/api/urn_generator.rb +0 -18
- data/lib/pubid/api/urn_parser.rb +35 -0
- data/lib/pubid/api.rb +51 -5
- data/lib/pubid/ashrae/builder.rb +3 -3
- data/lib/pubid/ashrae/identifier.rb +6 -0
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +0 -10
- data/lib/pubid/ashrae/identifiers/addendum.rb +0 -19
- data/lib/pubid/ashrae/identifiers/base.rb +3 -0
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +0 -15
- data/lib/pubid/ashrae/identifiers/errata.rb +0 -10
- data/lib/pubid/ashrae/identifiers/interpretation.rb +0 -10
- data/lib/pubid/ashrae/renderer.rb +117 -0
- data/lib/pubid/ashrae/single_identifier.rb +0 -13
- data/lib/pubid/ashrae/urn_generator.rb +0 -8
- data/lib/pubid/ashrae/urn_parser.rb +27 -0
- data/lib/pubid/ashrae.rb +42 -1
- data/lib/pubid/asme/components/code.rb +10 -2
- data/lib/pubid/asme/identifiers/base.rb +0 -60
- data/lib/pubid/asme/renderer.rb +66 -0
- data/lib/pubid/asme/urn_parser.rb +31 -0
- data/lib/pubid/asme.rb +42 -1
- data/lib/pubid/astm/components/code.rb +9 -0
- data/lib/pubid/{jis → astm}/components.rb +1 -1
- data/lib/pubid/astm/identifiers/adjunct.rb +0 -8
- data/lib/pubid/astm/identifiers/data_series.rb +0 -14
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +9 -34
- data/lib/pubid/astm/identifiers/manual.rb +0 -27
- data/lib/pubid/astm/identifiers/monograph.rb +0 -14
- data/lib/pubid/astm/identifiers/research_report.rb +0 -7
- data/lib/pubid/astm/identifiers/standard.rb +0 -39
- data/lib/pubid/astm/identifiers/technical_report.rb +0 -13
- data/lib/pubid/astm/identifiers/work_in_progress.rb +0 -11
- data/lib/pubid/astm/identifiers.rb +18 -0
- data/lib/pubid/astm/renderer.rb +172 -0
- data/lib/pubid/astm/single_identifier.rb +0 -10
- data/lib/pubid/astm/urn_parser.rb +30 -0
- data/lib/pubid/astm.rb +39 -27
- data/lib/pubid/bsi/builder.rb +21 -12
- data/lib/pubid/bsi/identifier.rb +8 -2
- data/lib/pubid/bsi/identifiers/addendum_document.rb +3 -33
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +11 -47
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +11 -38
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +3 -53
- data/lib/pubid/bsi/identifiers/amendment.rb +3 -19
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +2 -4
- data/lib/pubid/bsi/identifiers/british_standard.rb +2 -1
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +3 -84
- data/lib/pubid/bsi/identifiers/committee_document.rb +1 -14
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +3 -84
- data/lib/pubid/bsi/identifiers/corrigendum.rb +3 -7
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +1 -34
- data/lib/pubid/bsi/identifiers/disc.rb +1 -27
- data/lib/pubid/bsi/identifiers/draft_document.rb +3 -44
- data/lib/pubid/bsi/identifiers/electronic_book.rb +3 -36
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +3 -15
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +1 -45
- data/lib/pubid/bsi/identifiers/flex.rb +1 -33
- data/lib/pubid/bsi/identifiers/handbook.rb +2 -13
- data/lib/pubid/bsi/identifiers/index.rb +1 -30
- data/lib/pubid/bsi/identifiers/method.rb +1 -39
- data/lib/pubid/bsi/identifiers/national_annex.rb +5 -27
- data/lib/pubid/bsi/identifiers/practice_guide.rb +2 -4
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +3 -52
- data/lib/pubid/bsi/identifiers/published_document.rb +3 -52
- data/lib/pubid/bsi/identifiers/section.rb +1 -28
- data/lib/pubid/bsi/identifiers/set.rb +3 -17
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +1 -7
- data/lib/pubid/bsi/identifiers/supplement_document.rb +3 -21
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +1 -44
- data/lib/pubid/bsi/identifiers/technical_specification.rb +3 -45
- data/lib/pubid/bsi/identifiers/test_method.rb +1 -30
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +3 -14
- data/lib/pubid/bsi/identifiers.rb +0 -1
- data/lib/pubid/bsi/renderer.rb +1050 -0
- data/lib/pubid/bsi/single_identifier.rb +6 -70
- data/lib/pubid/bsi/urn_generator.rb +2 -3
- data/lib/pubid/bsi/urn_parser.rb +52 -0
- data/lib/pubid/bsi.rb +224 -1
- data/lib/pubid/builder/base.rb +57 -10
- data/lib/pubid/bundled_identifier.rb +0 -1
- data/lib/pubid/ccsds/builder.rb +4 -3
- data/lib/pubid/ccsds/identifier.rb +66 -1
- data/lib/pubid/ccsds/identifiers/base.rb +11 -50
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +7 -6
- data/lib/pubid/ccsds/parser.rb +4 -2
- data/lib/pubid/ccsds/single_identifier.rb +4 -1
- data/lib/pubid/ccsds/supplement_identifier.rb +15 -11
- data/lib/pubid/ccsds/urn_generator.rb +3 -3
- data/lib/pubid/ccsds/urn_parser.rb +20 -0
- data/lib/pubid/ccsds.rb +39 -1
- data/lib/pubid/cen_cenelec/builder.rb +12 -14
- data/lib/pubid/cen_cenelec/identifier.rb +8 -2
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +13 -4
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -8
- data/lib/pubid/cen_cenelec/identifiers/base.rb +5 -41
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +2 -25
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -13
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +4 -7
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +2 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +2 -1
- data/lib/pubid/cen_cenelec/renderer.rb +261 -0
- data/lib/pubid/cen_cenelec/single_identifier.rb +11 -89
- data/lib/pubid/cen_cenelec/urn_generator.rb +6 -6
- data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
- data/lib/pubid/cen_cenelec.rb +168 -1
- data/lib/pubid/cie/components/code.rb +8 -0
- data/lib/pubid/cie/identifier.rb +6 -4
- data/lib/pubid/cie/urn_parser.rb +28 -0
- data/lib/pubid/cie.rb +43 -1
- data/lib/pubid/components/adoption.rb +104 -0
- data/lib/pubid/components/code.rb +22 -8
- data/lib/pubid/components/date.rb +23 -16
- data/lib/pubid/components/edition.rb +9 -6
- data/lib/pubid/components/iteration.rb +32 -0
- data/lib/pubid/components/language.rb +6 -4
- data/lib/pubid/components/locality.rb +10 -1
- data/lib/pubid/components/publisher.rb +9 -6
- data/lib/pubid/components/relationship.rb +151 -0
- data/lib/pubid/components/stage.rb +5 -14
- data/lib/pubid/components/supplement.rb +184 -0
- data/lib/pubid/components/type.rb +5 -15
- data/lib/pubid/components/typed_stage.rb +11 -8
- data/lib/pubid/components.rb +4 -0
- data/lib/pubid/core/update_codes.rb +28 -7
- data/lib/pubid/csa/identifier.rb +0 -3
- data/lib/pubid/csa/identifiers/base.rb +2 -122
- data/lib/pubid/csa/identifiers/cec.rb +2 -101
- data/lib/pubid/csa/identifiers/series.rb +2 -102
- data/lib/pubid/csa/renderer.rb +292 -0
- data/lib/pubid/csa/urn_generator.rb +1 -1
- data/lib/pubid/csa/urn_parser.rb +33 -0
- data/lib/pubid/csa.rb +42 -1
- data/lib/pubid/etsi/components/code.rb +9 -2
- data/lib/pubid/etsi/identifiers/base.rb +1 -4
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +2 -9
- data/lib/pubid/etsi/renderer.rb +42 -0
- data/lib/pubid/etsi/urn_parser.rb +34 -0
- data/lib/pubid/etsi.rb +42 -1
- data/lib/pubid/export/exporter.rb +4 -46
- data/lib/pubid/export/flavor_exporter.rb +111 -278
- data/lib/pubid/export.rb +0 -6
- data/lib/pubid/identifier.rb +10 -18
- data/lib/pubid/identifier_facade.rb +114 -0
- data/lib/pubid/identifier_metadata.rb +1 -1
- data/lib/pubid/idf/builder.rb +3 -3
- data/lib/pubid/idf/identifier.rb +3 -6
- data/lib/pubid/idf/identifiers/amendment.rb +2 -1
- data/lib/pubid/idf/identifiers/corrigendum.rb +2 -1
- data/lib/pubid/idf/identifiers/international_standard.rb +2 -1
- data/lib/pubid/idf/identifiers/reviewed_method.rb +2 -1
- data/lib/pubid/idf/parser.rb +3 -2
- data/lib/pubid/idf/renderer.rb +84 -0
- data/lib/pubid/idf/supplement_identifier.rb +2 -10
- data/lib/pubid/idf/urn_generator.rb +4 -39
- data/lib/pubid/idf/urn_parser.rb +25 -0
- data/lib/pubid/idf.rb +51 -1
- data/lib/pubid/iec/builder.rb +48 -65
- data/lib/pubid/iec/components/code.rb +9 -32
- data/lib/pubid/iec/components/publisher.rb +1 -1
- data/lib/pubid/iec/components.rb +14 -0
- data/lib/pubid/iec/identifier.rb +276 -3
- data/lib/pubid/iec/identifiers/amendment.rb +2 -3
- data/lib/pubid/iec/identifiers/base.rb +8 -28
- data/lib/pubid/iec/identifiers/component_specification.rb +3 -3
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +1 -2
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +27 -30
- data/lib/pubid/iec/identifiers/corrigendum.rb +2 -3
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +37 -26
- data/lib/pubid/iec/identifiers/guide.rb +0 -2
- data/lib/pubid/iec/identifiers/international_standard.rb +2 -3
- data/lib/pubid/iec/identifiers/interpretation_sheet.rb +2 -3
- data/lib/pubid/iec/identifiers/operational_document.rb +3 -3
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +2 -3
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +21 -15
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +3 -3
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +2 -3
- data/lib/pubid/iec/identifiers/technical_report.rb +2 -3
- data/lib/pubid/iec/identifiers/technical_specification.rb +2 -3
- data/lib/pubid/iec/identifiers/technology_report.rb +1 -2
- data/lib/pubid/iec/identifiers/test_report_form.rb +5 -34
- data/lib/pubid/iec/identifiers/vap_identifier.rb +26 -23
- data/lib/pubid/iec/identifiers/white_paper.rb +3 -3
- data/lib/pubid/iec/identifiers/working_document.rb +4 -48
- data/lib/pubid/iec/identifiers.rb +30 -0
- data/lib/pubid/iec/parser.rb +20 -14
- data/lib/pubid/iec/renderer.rb +254 -0
- data/lib/pubid/iec/single_identifier.rb +6 -12
- data/lib/pubid/iec/supplement_identifier.rb +58 -54
- data/lib/pubid/iec/urn_generator.rb +57 -171
- data/lib/pubid/iec/urn_parser.rb +53 -252
- data/lib/pubid/iec.rb +40 -68
- data/lib/pubid/ieee/builder.rb +12 -12
- data/lib/pubid/ieee/components/code.rb +8 -0
- data/lib/pubid/ieee/components/draft.rb +14 -0
- data/lib/pubid/ieee/components/relationship.rb +5 -149
- data/lib/pubid/ieee/identifier.rb +6 -0
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +1 -6
- data/lib/pubid/ieee/identifiers/base.rb +101 -458
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +1 -7
- data/lib/pubid/ieee/identifiers/corrigendum.rb +1 -9
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +1 -7
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +1 -1
- data/lib/pubid/ieee/identifiers/dual_published.rb +1 -1
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +1 -6
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +1 -7
- data/lib/pubid/ieee/identifiers/joint_development.rb +2 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -15
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +1 -3
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +15 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +1 -4
- data/lib/pubid/ieee/identifiers/si_standard.rb +1 -35
- data/lib/pubid/ieee/identifiers/standard.rb +1 -1
- data/lib/pubid/ieee/pre_parser.rb +301 -0
- data/lib/pubid/ieee/renderer.rb +307 -0
- data/lib/pubid/ieee/urn_parser.rb +34 -0
- data/lib/pubid/ieee.rb +62 -1
- data/lib/pubid/ieee_debug.rb +0 -1
- data/lib/pubid/iho/builder.rb +2 -2
- data/lib/pubid/iho/identifier.rb +8 -0
- data/lib/pubid/iho/identifiers/base.rb +49 -10
- data/lib/pubid/iho/identifiers/bibliographic.rb +0 -4
- data/lib/pubid/iho/identifiers/circular_letter.rb +0 -4
- data/lib/pubid/iho/identifiers/miscellaneous.rb +0 -4
- data/lib/pubid/iho/identifiers/publication.rb +0 -4
- data/lib/pubid/iho/identifiers/standard.rb +0 -4
- data/lib/pubid/iho/parser.rb +3 -3
- data/lib/pubid/iho/renderer.rb +30 -0
- data/lib/pubid/iho/urn_generator.rb +3 -3
- data/lib/pubid/iho/urn_parser.rb +58 -0
- data/lib/pubid/iho.rb +50 -1
- data/lib/pubid/iso/builder.rb +59 -53
- data/lib/pubid/iso/bundled_identifier.rb +51 -0
- data/lib/pubid/iso/components/code.rb +7 -19
- data/lib/pubid/iso/components/publisher.rb +10 -8
- data/lib/pubid/iso/components.rb +2 -4
- data/lib/pubid/iso/identifier.rb +233 -6
- data/lib/pubid/iso/identifiers/addendum.rb +9 -6
- data/lib/pubid/iso/identifiers/amendment.rb +8 -4
- data/lib/pubid/iso/identifiers/corrigendum.rb +4 -4
- data/lib/pubid/iso/identifiers/data.rb +0 -1
- data/lib/pubid/iso/identifiers/directives.rb +8 -2
- data/lib/pubid/iso/identifiers/directives_supplement.rb +43 -14
- data/lib/pubid/iso/identifiers/extract.rb +2 -2
- data/lib/pubid/iso/identifiers/guide.rb +0 -1
- data/lib/pubid/iso/identifiers/international_standard.rb +4 -4
- data/lib/pubid/iso/identifiers/international_standardized_profile.rb +4 -4
- data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +10 -4
- data/lib/pubid/iso/identifiers/pas.rb +2 -2
- data/lib/pubid/iso/identifiers/recommendation.rb +2 -2
- data/lib/pubid/iso/identifiers/supplement.rb +11 -3
- data/lib/pubid/iso/identifiers/tc_document.rb +44 -15
- data/lib/pubid/iso/identifiers/technical_report.rb +4 -4
- data/lib/pubid/iso/identifiers/technical_specification.rb +2 -2
- data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +2 -2
- data/lib/pubid/iso/identifiers.rb +0 -1
- data/lib/pubid/iso/normalizer.rb +89 -0
- data/lib/pubid/iso/parser.rb +26 -6
- data/lib/pubid/iso/single_identifier.rb +6 -3
- data/lib/pubid/iso/supplement_identifier.rb +15 -2
- data/lib/pubid/iso/urn_generator.rb +74 -176
- data/lib/pubid/iso/urn_parser.rb +28 -9
- data/lib/pubid/iso.rb +173 -2
- data/lib/pubid/itu/builder.rb +0 -12
- data/lib/pubid/itu/components/code.rb +8 -0
- data/lib/pubid/itu/components.rb +11 -0
- data/lib/pubid/itu/identifier.rb +6 -39
- data/lib/pubid/itu/identifiers/amendment.rb +0 -2
- data/lib/pubid/itu/identifiers/annex.rb +0 -2
- data/lib/pubid/itu/identifiers/base.rb +0 -6
- data/lib/pubid/itu/identifiers/combined_identifier.rb +0 -2
- data/lib/pubid/itu/identifiers/corrigendum.rb +0 -2
- data/lib/pubid/itu/identifiers/recommendation.rb +0 -2
- data/lib/pubid/itu/identifiers/special_publication.rb +0 -2
- data/lib/pubid/itu/identifiers/supplement.rb +0 -2
- data/lib/pubid/itu/urn_parser.rb +23 -0
- data/lib/pubid/itu.rb +42 -1
- data/lib/pubid/jcgm/builder.rb +16 -8
- data/lib/pubid/jcgm/identifiers/amendment.rb +2 -7
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +2 -10
- data/lib/pubid/jcgm/renderer.rb +68 -0
- data/lib/pubid/jcgm/single_identifier.rb +1 -5
- data/lib/pubid/jcgm/urn_generator.rb +4 -6
- data/lib/pubid/jcgm/urn_parser.rb +23 -0
- data/lib/pubid/jcgm.rb +43 -2
- data/lib/pubid/jis/builder.rb +44 -52
- data/lib/pubid/jis/identifier.rb +132 -3
- data/lib/pubid/jis/identifiers/amendment.rb +1 -1
- data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
- data/lib/pubid/jis/identifiers/standard.rb +2 -1
- data/lib/pubid/jis/identifiers/technical_report.rb +2 -1
- data/lib/pubid/jis/identifiers/technical_specification.rb +2 -1
- data/lib/pubid/jis/identifiers.rb +1 -1
- data/lib/pubid/jis/parser.rb +31 -5
- data/lib/pubid/jis/renderer.rb +69 -0
- data/lib/pubid/jis/single_identifier.rb +6 -12
- data/lib/pubid/jis/supplement_identifier.rb +17 -14
- data/lib/pubid/jis/urn_parser.rb +23 -0
- data/lib/pubid/jis.rb +42 -2
- data/lib/pubid/nist/builder.rb +122 -1761
- data/lib/pubid/nist/caster.rb +1272 -0
- data/lib/pubid/nist/circular_supplement_builder.rb +291 -0
- data/lib/pubid/nist/components/code.rb +9 -20
- data/lib/pubid/nist/components/edition.rb +16 -0
- data/lib/pubid/nist/components/supplement.rb +88 -21
- data/lib/pubid/nist/components.rb +0 -1
- data/lib/pubid/nist/identifier.rb +25 -0
- data/lib/pubid/nist/identifiers/base.rb +206 -64
- data/lib/pubid/nist/identifiers/circular.rb +7 -2
- data/lib/pubid/nist/identifiers/circular_supplement.rb +3 -2
- data/lib/pubid/nist/identifiers/commercial_standard.rb +2 -1
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +6 -4
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +10 -3
- data/lib/pubid/nist/identifiers/crpl_report.rb +8 -11
- data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +17 -16
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +2 -1
- data/lib/pubid/nist/identifiers/handbook.rb +2 -1
- data/lib/pubid/nist/identifiers/internal_report.rb +2 -1
- data/lib/pubid/nist/identifiers/letter_circular.rb +2 -1
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +5 -4
- data/lib/pubid/nist/identifiers/monograph.rb +7 -3
- data/lib/pubid/nist/identifiers/report.rb +4 -3
- data/lib/pubid/nist/identifiers/special_publication.rb +2 -1
- data/lib/pubid/nist/identifiers/technical_note.rb +3 -2
- data/lib/pubid/nist/identifiers.rb +1 -0
- data/lib/pubid/nist/parser.rb +67 -424
- data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
- data/lib/pubid/nist/preprocessor.rb +416 -0
- data/lib/pubid/nist/renderer.rb +43 -0
- data/lib/pubid/nist/router.rb +148 -0
- data/lib/pubid/nist/series/base.rb +58 -0
- data/lib/pubid/nist/series/crpl.rb +13 -0
- data/lib/pubid/nist/series/fips.rb +14 -0
- data/lib/pubid/nist/series/ir.rb +60 -0
- data/lib/pubid/nist/series/letter_preserving.rb +15 -0
- data/lib/pubid/nist/series/mono.rb +19 -0
- data/lib/pubid/nist/series/ncstar.rb +20 -0
- data/lib/pubid/nist/series.rb +49 -0
- data/lib/pubid/nist/supplement_identifier.rb +11 -25
- data/lib/pubid/nist/urn_generator.rb +14 -8
- data/lib/pubid/nist/urn_parser.rb +67 -0
- data/lib/pubid/nist.rb +83 -4
- data/lib/pubid/oiml/components/code.rb +10 -0
- data/lib/pubid/oiml/identifiers/annex.rb +3 -45
- data/lib/pubid/oiml/identifiers/base.rb +2 -17
- data/lib/pubid/oiml/renderer.rb +161 -0
- data/lib/pubid/oiml/single_identifier.rb +6 -45
- data/lib/pubid/oiml/supplement_identifier.rb +4 -19
- data/lib/pubid/oiml/urn_generator.rb +0 -8
- data/lib/pubid/oiml/urn_parser.rb +22 -0
- data/lib/pubid/oiml.rb +42 -1
- data/lib/pubid/plateau/identifier.rb +23 -0
- data/lib/pubid/plateau/identifiers/handbook.rb +1 -3
- data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
- data/lib/pubid/plateau/renderer.rb +51 -0
- data/lib/pubid/plateau/supplement_identifier.rb +1 -1
- data/lib/pubid/plateau/urn_parser.rb +43 -0
- data/lib/pubid/plateau.rb +44 -1
- data/lib/pubid/renderers/base.rb +34 -0
- data/lib/pubid/renderers/directives_renderer.rb +27 -14
- data/lib/pubid/renderers/guide_renderer.rb +7 -1
- data/lib/pubid/renderers/human_readable.rb +31 -8
- data/lib/pubid/renderers/iwa_renderer.rb +5 -1
- data/lib/pubid/renderers/supplement_renderer.rb +4 -1
- data/lib/pubid/rendering/context.rb +33 -21
- data/lib/pubid/rendering.rb +0 -3
- data/lib/pubid/sae/components/date.rb +8 -0
- data/lib/pubid/sae/components/type.rb +5 -1
- data/lib/pubid/sae/identifiers/base.rb +2 -16
- data/lib/pubid/sae/renderer.rb +36 -0
- data/lib/pubid/sae/urn_generator.rb +2 -10
- data/lib/pubid/sae/urn_parser.rb +36 -0
- data/lib/pubid/sae.rb +42 -1
- data/lib/pubid/urn_generator/base.rb +12 -12
- data/lib/pubid/urn_parser/base.rb +81 -0
- data/lib/pubid/urn_parser/errors.rb +9 -0
- data/lib/pubid/urn_parser.rb +14 -0
- data/lib/pubid/version.rb +1 -1
- data/lib/pubid.rb +29 -7
- data/lib/tasks/website-data.json +1940 -1882
- metadata +77 -43
- data/lib/pubid/amca/scheme.rb +0 -16
- data/lib/pubid/ansi/scheme.rb +0 -15
- data/lib/pubid/api/scheme.rb +0 -66
- data/lib/pubid/ashrae/scheme.rb +0 -53
- data/lib/pubid/asme/scheme.rb +0 -37
- data/lib/pubid/astm/scheme.rb +0 -55
- data/lib/pubid/bsi/identifiers/base.rb +0 -11
- data/lib/pubid/bsi/scheme.rb +0 -243
- data/lib/pubid/ccsds/scheme.rb +0 -57
- data/lib/pubid/cen_cenelec/scheme.rb +0 -164
- data/lib/pubid/cie/scheme.rb +0 -64
- data/lib/pubid/csa/scheme.rb +0 -44
- data/lib/pubid/etsi/scheme.rb +0 -42
- data/lib/pubid/export/data_class_exporter.rb +0 -59
- data/lib/pubid/export/ieee_exporter.rb +0 -78
- data/lib/pubid/export/itu_exporter.rb +0 -66
- data/lib/pubid/export/nist_exporter.rb +0 -64
- data/lib/pubid/export/registry_exporter.rb +0 -90
- data/lib/pubid/export/scheme_exporter.rb +0 -70
- data/lib/pubid/identifier_registry.rb +0 -198
- data/lib/pubid/idf/scheme.rb +0 -61
- data/lib/pubid/iec/scheme.rb +0 -71
- data/lib/pubid/ieee/scheme.rb +0 -90
- data/lib/pubid/iho/scheme.rb +0 -29
- data/lib/pubid/iso/identifiers/base.rb +0 -115
- data/lib/pubid/iso/scheme.rb +0 -187
- data/lib/pubid/itu/scheme.rb +0 -174
- data/lib/pubid/jcgm/scheme.rb +0 -60
- data/lib/pubid/jis/components/code.rb +0 -59
- data/lib/pubid/jis/identifiers/base.rb +0 -72
- data/lib/pubid/jis/scheme.rb +0 -49
- data/lib/pubid/nist/components/publisher.rb +0 -24
- data/lib/pubid/nist/scheme.rb +0 -199
- data/lib/pubid/oiml/scheme.rb +0 -46
- data/lib/pubid/plateau/scheme.rb +0 -45
- data/lib/pubid/rendering/base.rb +0 -73
- data/lib/pubid/rendering/common.rb +0 -211
- data/lib/pubid/rendering/format.rb +0 -25
- data/lib/pubid/sae/scheme.rb +0 -47
- data/lib/pubid/scheme.rb +0 -207
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module CenCenelec
|
|
5
|
+
# Human-readable renderer for CEN/CENELEC identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces strings like:
|
|
8
|
+
# "EN 196-3:2005"
|
|
9
|
+
# "EN ISO 8601:2019"
|
|
10
|
+
# "prEN 12345:2020"
|
|
11
|
+
# "CEN/TS 12345:2005"
|
|
12
|
+
# "EN 196-3:2005+A1:2008"
|
|
13
|
+
# "EN 60038/AC1:2012"
|
|
14
|
+
# "ENV ISO 8601"
|
|
15
|
+
#
|
|
16
|
+
# The renderer is registered as the +:human+ format in the CEN/CENELEC format
|
|
17
|
+
# registry and invoked via +render(format: :human)+.
|
|
18
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
19
|
+
def render(context: nil, **opts)
|
|
20
|
+
id = @id
|
|
21
|
+
@context = context
|
|
22
|
+
|
|
23
|
+
case id
|
|
24
|
+
when Identifiers::AdoptedEuropeanNorm
|
|
25
|
+
render_adopted_european_norm(id)
|
|
26
|
+
when Identifiers::Amendment
|
|
27
|
+
render_amendment(id)
|
|
28
|
+
when Identifiers::Corrigendum
|
|
29
|
+
render_corrigendum(id)
|
|
30
|
+
when Identifiers::ConsolidatedIdentifier
|
|
31
|
+
render_consolidated(id)
|
|
32
|
+
when Identifiers::Fragment
|
|
33
|
+
render_fragment(id)
|
|
34
|
+
when Identifiers::EuropeanPrestandard
|
|
35
|
+
render_european_prestandard(id, **opts)
|
|
36
|
+
when Identifiers::Base
|
|
37
|
+
# CEN identifiers::Base hierarchy (Amendment, Corrigendum, etc. handled above)
|
|
38
|
+
render_cen_base(id)
|
|
39
|
+
when SingleIdentifier
|
|
40
|
+
render_single(id)
|
|
41
|
+
else
|
|
42
|
+
render_single(id)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
|
|
48
|
+
# SingleIdentifier (EN, Guide, TR, TS, CWA, HD, etc.):
|
|
49
|
+
# Complex rendering with draft stages, copublishers, typed stages
|
|
50
|
+
def render_single(id)
|
|
51
|
+
parts = []
|
|
52
|
+
|
|
53
|
+
# Check if we have a draft stage (prEN, FprEN) - these include both stage and type
|
|
54
|
+
is_draft_stage = id.typed_stage&.abbr && %w[prEN
|
|
55
|
+
FprEN].include?(id.typed_stage.abbr.first)
|
|
56
|
+
|
|
57
|
+
# Get type short name - for draft stages, extract base type
|
|
58
|
+
type_short = if is_draft_stage
|
|
59
|
+
id.typed_stage.type_code.to_s.upcase # :en => "EN"
|
|
60
|
+
elsif id.type.is_a?(Components::Type)
|
|
61
|
+
id.type.abbr
|
|
62
|
+
elsif id.class.type.is_a?(Hash)
|
|
63
|
+
id.class.type[:short]
|
|
64
|
+
else
|
|
65
|
+
"EN" # Default
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Track if we should use slash before type
|
|
69
|
+
use_slash_before_type = false
|
|
70
|
+
|
|
71
|
+
# For CWA/HD, they act as publisher (not EN)
|
|
72
|
+
if %w[CWA HD CR].include?(type_short)
|
|
73
|
+
# Stage prefix OR type as publisher
|
|
74
|
+
parts << if id.typed_stage&.abbr && id.typed_stage.abbr.first != type_short
|
|
75
|
+
id.typed_stage.abbr.first
|
|
76
|
+
else
|
|
77
|
+
type_short
|
|
78
|
+
end
|
|
79
|
+
elsif is_draft_stage
|
|
80
|
+
# Draft stage prefix (prEN, FprEN) OR regular publisher
|
|
81
|
+
parts << id.typed_stage.abbr.first
|
|
82
|
+
elsif id.publisher
|
|
83
|
+
parts << id.publisher.render(context: @context)
|
|
84
|
+
use_slash_before_type = true # When publisher present, use slash before type
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Copublishers - add to last part (publisher) with slash
|
|
88
|
+
if id.copublishers&.any?
|
|
89
|
+
copub_str = id.copublishers.map { |cp| cp.render(context: @context) }.join("/")
|
|
90
|
+
unless copub_str.empty?
|
|
91
|
+
if parts.any?
|
|
92
|
+
parts[-1] = "#{parts[-1]}/#{copub_str}"
|
|
93
|
+
else
|
|
94
|
+
parts << copub_str
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Type for non-EN documents (TS, TR) - but not CWA/HD or Guide
|
|
100
|
+
if type_short != "EN" && !%w[CWA HD CR Guide].include?(type_short)
|
|
101
|
+
if use_slash_before_type && parts.any?
|
|
102
|
+
# Use slash separator for publisher/type combination (TS, TR only)
|
|
103
|
+
parts << "/#{type_short}"
|
|
104
|
+
else
|
|
105
|
+
parts << type_short
|
|
106
|
+
end
|
|
107
|
+
elsif type_short == "Guide"
|
|
108
|
+
# Guide uses SPACE separator, not slash
|
|
109
|
+
parts << "Guide"
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# Number with part (which may be multi-level like "5-1-1")
|
|
113
|
+
if id.number
|
|
114
|
+
number_str = id.number.render(context: @context)
|
|
115
|
+
if id.part
|
|
116
|
+
number_str += "-#{id.part.render(context: @context)}"
|
|
117
|
+
end
|
|
118
|
+
parts << number_str
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Join parts - but handle slash prefix for type
|
|
122
|
+
result = ""
|
|
123
|
+
parts.each_with_index do |part, idx|
|
|
124
|
+
if idx.positive? && !part.start_with?("/")
|
|
125
|
+
result += " "
|
|
126
|
+
end
|
|
127
|
+
result += part
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
# Date
|
|
131
|
+
if id.date
|
|
132
|
+
year_val = id.date.is_a?(::Pubid::Components::Date) ? id.date.render(context: @context) : id.date.to_i
|
|
133
|
+
result += ":#{year_val}"
|
|
134
|
+
end
|
|
135
|
+
|
|
136
|
+
result
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# CEN Identifiers::Base: simple key-value model
|
|
140
|
+
# Format: {PUBLISHER} NUMBER[-PART]:YEAR
|
|
141
|
+
def render_cen_base(id)
|
|
142
|
+
result = ""
|
|
143
|
+
|
|
144
|
+
# Stage or Publisher
|
|
145
|
+
if id.stage
|
|
146
|
+
result += id.stage
|
|
147
|
+
elsif id.publisher&.any?
|
|
148
|
+
result += id.publisher.join("/")
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# If we have adopted_identifier, render it (contains all info)
|
|
152
|
+
if id.adopted_identifier
|
|
153
|
+
result += " #{id.adopted_identifier}"
|
|
154
|
+
# Don't add our own number/parts/year - they're in adopted_identifier
|
|
155
|
+
else
|
|
156
|
+
# Only render our own fields if no adoption
|
|
157
|
+
# Type - use space for Guide, slash for TR/TS
|
|
158
|
+
if id.type
|
|
159
|
+
sep = id.type == "Guide" ? " " : "/"
|
|
160
|
+
result += "#{sep}#{id.type}"
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
result += " #{id.number}"
|
|
164
|
+
result += id.parts.map { |p| "-#{p}" }.join if id.parts&.any?
|
|
165
|
+
result += ":#{id.year}" if id.year
|
|
166
|
+
|
|
167
|
+
# Supplements
|
|
168
|
+
if id.supplements&.any?
|
|
169
|
+
id.supplements.each do |supp|
|
|
170
|
+
sep = supp[:type] == :amendment ? "/" : "+"
|
|
171
|
+
result += "#{sep}#{supp[:type] == :amendment ? 'A' : 'AC'}"
|
|
172
|
+
result += supp[:number] if supp[:number] && !supp[:number].empty?
|
|
173
|
+
result += ":#{supp[:year]}" if supp[:year]
|
|
174
|
+
end
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Edition
|
|
178
|
+
result += " ED#{id.edition}" if id.edition
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
result
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
# AdoptedEuropeanNorm: "EN ISO 8601:2019"
|
|
185
|
+
def render_adopted_european_norm(id)
|
|
186
|
+
result = id.publisher.is_a?(Array) ? id.publisher.join("/") : id.publisher.join("/")
|
|
187
|
+
result += " #{id.adopted_identifier}" if id.adopted_identifier
|
|
188
|
+
result
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
# Amendment: "EN 196-3:2005/A1:2008"
|
|
192
|
+
def render_amendment(id)
|
|
193
|
+
result = if id.base_identifier
|
|
194
|
+
"#{id.base_identifier}/A#{id.amendment_number}"
|
|
195
|
+
else
|
|
196
|
+
"/A#{id.amendment_number}"
|
|
197
|
+
end
|
|
198
|
+
result += ":#{id.amendment_year}" if id.amendment_year
|
|
199
|
+
result
|
|
200
|
+
end
|
|
201
|
+
|
|
202
|
+
# Corrigendum: "EN 60038/AC1:2012"
|
|
203
|
+
def render_corrigendum(id)
|
|
204
|
+
if id.base_identifier
|
|
205
|
+
result = id.base_identifier.to_s
|
|
206
|
+
result += "/AC"
|
|
207
|
+
result += id.corrigendum_number if id.corrigendum_number && !id.corrigendum_number.empty?
|
|
208
|
+
else
|
|
209
|
+
result = "/AC#{id.corrigendum_number}"
|
|
210
|
+
end
|
|
211
|
+
if id.corrigendum_year
|
|
212
|
+
result += ":#{id.corrigendum_year}"
|
|
213
|
+
result += "-#{id.corrigendum_month}" if id.corrigendum_month && !id.corrigendum_month.empty?
|
|
214
|
+
end
|
|
215
|
+
result
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# ConsolidatedIdentifier: "EN 196-3:2005+A1:2008"
|
|
219
|
+
def render_consolidated(id)
|
|
220
|
+
id.identifiers.map.with_index do |sub_id, idx|
|
|
221
|
+
if idx.zero?
|
|
222
|
+
# First identifier renders normally
|
|
223
|
+
sub_id.to_s
|
|
224
|
+
elsif sub_id.is_a?(Identifiers::Amendment)
|
|
225
|
+
# Supplements render with "+" prefix (bundled/consolidated format)
|
|
226
|
+
result = "+A#{sub_id.amendment_number}"
|
|
227
|
+
result += ":#{sub_id.amendment_year}" if sub_id.amendment_year
|
|
228
|
+
result
|
|
229
|
+
# Only render the amendment portion, not the full id.to_s
|
|
230
|
+
elsif sub_id.is_a?(Identifiers::Corrigendum)
|
|
231
|
+
# Only render the corrigendum portion
|
|
232
|
+
result = "+AC"
|
|
233
|
+
result += sub_id.corrigendum_number if sub_id.corrigendum_number && !sub_id.corrigendum_number.empty?
|
|
234
|
+
if sub_id.corrigendum_year
|
|
235
|
+
result += ":#{sub_id.corrigendum_year}"
|
|
236
|
+
result += "-#{sub_id.corrigendum_month}" if sub_id.corrigendum_month && !sub_id.corrigendum_month.empty?
|
|
237
|
+
end
|
|
238
|
+
result
|
|
239
|
+
else
|
|
240
|
+
# Other identifiers (should not happen in typical bundles) render with +
|
|
241
|
+
"+#{sub_id}"
|
|
242
|
+
end
|
|
243
|
+
end.compact.join
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
# Fragment: "EN 60038 AMD1 FRAG2"
|
|
247
|
+
def render_fragment(id)
|
|
248
|
+
"#{id.base_identifier} FRAG#{id.fragment_number}"
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# EuropeanPrestandard: "ENV ISO 8601" or falls through to SingleIdentifier
|
|
252
|
+
def render_european_prestandard(id, **opts)
|
|
253
|
+
if id.adopted_identifier
|
|
254
|
+
"ENV #{id.adopted_identifier}"
|
|
255
|
+
else
|
|
256
|
+
render_single(id)
|
|
257
|
+
end
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module CenCenelec
|
|
5
5
|
class SingleIdentifier < Pubid::Identifier
|
|
6
|
+
# Identity for the Pubid::CenCenelec::Identifier facade. CEN/CENELEC
|
|
7
|
+
# identifiers split between two roots (Identifiers::Base and this
|
|
8
|
+
# SingleIdentifier), both direct subclasses of Pubid::Identifier, so the
|
|
9
|
+
# facade module is included into each to cover every concrete type.
|
|
10
|
+
include Pubid::CenCenelec::Identifier
|
|
11
|
+
|
|
6
12
|
attribute :publisher, Components::Publisher, default: -> {
|
|
7
13
|
Components::Publisher.new(body: "EN")
|
|
8
14
|
}
|
|
@@ -11,96 +17,12 @@ module Pubid
|
|
|
11
17
|
#
|
|
12
18
|
# @return [String] URN representation
|
|
13
19
|
|
|
14
|
-
def
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
# Check if we have a draft stage (prEN, FprEN) - these include both stage and type
|
|
18
|
-
is_draft_stage = typed_stage&.abbr && %w[prEN
|
|
19
|
-
FprEN].include?(typed_stage.abbr.first)
|
|
20
|
-
|
|
21
|
-
# Get type short name - for draft stages, extract base type
|
|
22
|
-
type_short = if is_draft_stage
|
|
23
|
-
typed_stage.type_code.to_s.upcase # :en => "EN"
|
|
24
|
-
elsif type.is_a?(Components::Type)
|
|
25
|
-
type.abbr
|
|
26
|
-
elsif self.class.respond_to?(:type) && self.class.type.is_a?(Hash)
|
|
27
|
-
self.class.type[:short]
|
|
28
|
-
else
|
|
29
|
-
"EN" # Default
|
|
30
|
-
end
|
|
31
|
-
|
|
32
|
-
# Track if we should use slash before type
|
|
33
|
-
use_slash_before_type = false
|
|
34
|
-
|
|
35
|
-
# For CWA/HD, they act as publisher (not EN)
|
|
36
|
-
if %w[CWA HD CR].include?(type_short)
|
|
37
|
-
# Stage prefix OR type as publisher
|
|
38
|
-
parts << if typed_stage&.abbr && typed_stage.abbr.first != type_short
|
|
39
|
-
typed_stage.abbr.first
|
|
40
|
-
else
|
|
41
|
-
type_short
|
|
42
|
-
end
|
|
43
|
-
elsif is_draft_stage
|
|
44
|
-
# Draft stage prefix (prEN, FprEN) OR regular publisher
|
|
45
|
-
parts << typed_stage.abbr.first
|
|
46
|
-
elsif publisher
|
|
47
|
-
parts << (publisher.is_a?(Components::Publisher) ? publisher.body : publisher.to_s)
|
|
48
|
-
use_slash_before_type = true # When publisher present, use slash before type
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
# Copublishers - add to last part (publisher) with slash
|
|
52
|
-
if copublishers&.any?
|
|
53
|
-
copub_str = copublishers.map do |cp|
|
|
54
|
-
cp.is_a?(Components::Publisher) ? cp.body : cp.to_s
|
|
55
|
-
end.join("/")
|
|
56
|
-
unless copub_str.empty?
|
|
57
|
-
if parts.any?
|
|
58
|
-
parts[-1] = "#{parts[-1]}/#{copub_str}"
|
|
59
|
-
else
|
|
60
|
-
parts << copub_str
|
|
61
|
-
end
|
|
62
|
-
end
|
|
63
|
-
end
|
|
64
|
-
|
|
65
|
-
# Type for non-EN documents (TS, TR) - but not CWA/HD or Guide
|
|
66
|
-
if type_short != "EN" && !%w[CWA HD CR Guide].include?(type_short)
|
|
67
|
-
if use_slash_before_type && parts.any?
|
|
68
|
-
# Use slash separator for publisher/type combination (TS, TR only)
|
|
69
|
-
parts << "/#{type_short}"
|
|
70
|
-
else
|
|
71
|
-
parts << type_short
|
|
72
|
-
end
|
|
73
|
-
elsif type_short == "Guide"
|
|
74
|
-
# Guide uses SPACE separator, not slash
|
|
75
|
-
parts << "Guide"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
|
-
# Number with part (which may be multi-level like "5-1-1")
|
|
79
|
-
if number
|
|
80
|
-
number_str = number.is_a?(Components::Code) ? number.value.to_s : number.to_s
|
|
81
|
-
if part
|
|
82
|
-
part_val = part.is_a?(Components::Code) ? part.value : part
|
|
83
|
-
number_str += "-#{part_val}"
|
|
84
|
-
end
|
|
85
|
-
parts << number_str
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
# Join parts - but handle slash prefix for type
|
|
89
|
-
result = ""
|
|
90
|
-
parts.each_with_index do |part, idx|
|
|
91
|
-
if idx.positive? && !part.start_with?("/")
|
|
92
|
-
result += " "
|
|
93
|
-
end
|
|
94
|
-
result += part
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
# Date
|
|
98
|
-
if date
|
|
99
|
-
year_val = date.is_a?(Components::Date) ? date.year : date.to_i
|
|
100
|
-
result += ":#{year_val}"
|
|
101
|
-
end
|
|
20
|
+
def self.type
|
|
21
|
+
nil
|
|
22
|
+
end
|
|
102
23
|
|
|
103
|
-
|
|
24
|
+
def to_s(lang: :en, lang_single: false, **opts)
|
|
25
|
+
render(format: :human, lang: lang, lang_single: lang_single, **opts)
|
|
104
26
|
end
|
|
105
27
|
|
|
106
28
|
def <=>(other)
|
|
@@ -50,9 +50,10 @@ module Pubid
|
|
|
50
50
|
end
|
|
51
51
|
|
|
52
52
|
date = maybe(:date)
|
|
53
|
-
if date
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
if date&.is_a?(::Pubid::Components::Date) && date.present?
|
|
54
|
+
parts << date.render(context: URN_CONTEXT)
|
|
55
|
+
elsif date
|
|
56
|
+
parts << date.to_s
|
|
56
57
|
elsif identifier.year
|
|
57
58
|
parts << identifier.year.to_s
|
|
58
59
|
end
|
|
@@ -104,9 +105,8 @@ module Pubid
|
|
|
104
105
|
amendment_year = maybe(:amendment_year)
|
|
105
106
|
if amendment_year
|
|
106
107
|
parts << amendment_year.to_s
|
|
107
|
-
elsif identifier.date
|
|
108
|
-
|
|
109
|
-
parts << year.to_s
|
|
108
|
+
elsif identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
|
|
109
|
+
parts << identifier.date.render(context: URN_CONTEXT)
|
|
110
110
|
end
|
|
111
111
|
else
|
|
112
112
|
parts << "unknown"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module CenCenelec
|
|
5
|
+
# Parses CEN/CENELEC URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits: `urn:cen:{type}:{number}:{year}` where type is
|
|
8
|
+
# the lowercase document class (en, etsg, ts, tr).
|
|
9
|
+
#
|
|
10
|
+
# Examples:
|
|
11
|
+
# - urn:cen:en:9001:2015 → EN 9001:2015
|
|
12
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
13
|
+
# UrnGenerator uses "cen" rather than "cencenelec" as the namespace.
|
|
14
|
+
def flavor_name
|
|
15
|
+
"cen"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def parse_urn(urn)
|
|
19
|
+
body = strip_namespace(urn)
|
|
20
|
+
parts = split_parts(body)
|
|
21
|
+
type_token, number, year = parts
|
|
22
|
+
text = "#{type_token.upcase} #{number}"
|
|
23
|
+
text += ":#{year}" if year
|
|
24
|
+
flavor_parse(text)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
data/lib/pubid/cen_cenelec.rb
CHANGED
|
@@ -6,16 +6,183 @@ module Pubid
|
|
|
6
6
|
autoload :Identifier, "#{__dir__}/cen_cenelec/identifier"
|
|
7
7
|
autoload :Identifiers, "#{__dir__}/cen_cenelec/identifiers"
|
|
8
8
|
autoload :Parser, "#{__dir__}/cen_cenelec/parser"
|
|
9
|
-
autoload :
|
|
9
|
+
autoload :Renderer, "#{__dir__}/cen_cenelec/renderer"
|
|
10
10
|
autoload :SingleIdentifier, "#{__dir__}/cen_cenelec/single_identifier"
|
|
11
11
|
autoload :SupplementIdentifier,
|
|
12
12
|
"#{__dir__}/cen_cenelec/supplement_identifier"
|
|
13
13
|
autoload :UrnGenerator, "#{__dir__}/cen_cenelec/urn_generator"
|
|
14
|
+
autoload :UrnParser, "#{__dir__}/cen_cenelec/urn_parser"
|
|
15
|
+
|
|
16
|
+
# TYPED_STAGES_REGISTRY for native CEN types
|
|
17
|
+
TYPED_STAGES_REGISTRY = [
|
|
18
|
+
# European Norm (EN)
|
|
19
|
+
Pubid::Components::TypedStage.new(
|
|
20
|
+
code: :puben,
|
|
21
|
+
stage_code: :published,
|
|
22
|
+
type_code: :en,
|
|
23
|
+
abbr: ["EN"],
|
|
24
|
+
name: "European Norm",
|
|
25
|
+
harmonized_stages: %w[60.00 60.60],
|
|
26
|
+
),
|
|
27
|
+
Pubid::Components::TypedStage.new(
|
|
28
|
+
code: :pren,
|
|
29
|
+
stage_code: :proposal,
|
|
30
|
+
type_code: :en,
|
|
31
|
+
abbr: ["prEN"],
|
|
32
|
+
name: "Proposal European Norm",
|
|
33
|
+
harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
|
|
34
|
+
),
|
|
35
|
+
Pubid::Components::TypedStage.new(
|
|
36
|
+
code: :fpren,
|
|
37
|
+
stage_code: :final_proposal,
|
|
38
|
+
type_code: :en,
|
|
39
|
+
abbr: ["FprEN"],
|
|
40
|
+
name: "Final Proposal European Norm",
|
|
41
|
+
harmonized_stages: %w[40.00 40.20 40.60 40.92 40.98 40.99],
|
|
42
|
+
),
|
|
43
|
+
|
|
44
|
+
# Technical Specification (TS)
|
|
45
|
+
Pubid::Components::TypedStage.new(
|
|
46
|
+
code: :pubts,
|
|
47
|
+
stage_code: :published,
|
|
48
|
+
type_code: :ts,
|
|
49
|
+
abbr: ["TS"],
|
|
50
|
+
name: "Technical Specification",
|
|
51
|
+
harmonized_stages: %w[60.00 60.60],
|
|
52
|
+
),
|
|
53
|
+
Pubid::Components::TypedStage.new(
|
|
54
|
+
code: :prts,
|
|
55
|
+
stage_code: :proposal,
|
|
56
|
+
type_code: :ts,
|
|
57
|
+
abbr: ["prTS"],
|
|
58
|
+
name: "Proposal Technical Specification",
|
|
59
|
+
harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
|
|
60
|
+
),
|
|
61
|
+
|
|
62
|
+
# Technical Report (TR)
|
|
63
|
+
Pubid::Components::TypedStage.new(
|
|
64
|
+
code: :pubtr,
|
|
65
|
+
stage_code: :published,
|
|
66
|
+
type_code: :tr,
|
|
67
|
+
abbr: ["TR"],
|
|
68
|
+
name: "Technical Report",
|
|
69
|
+
harmonized_stages: %w[60.00 60.60],
|
|
70
|
+
),
|
|
71
|
+
|
|
72
|
+
# CEN Workshop Agreement (CWA)
|
|
73
|
+
Pubid::Components::TypedStage.new(
|
|
74
|
+
code: :pubcwa,
|
|
75
|
+
stage_code: :published,
|
|
76
|
+
type_code: :cwa,
|
|
77
|
+
abbr: ["CWA"],
|
|
78
|
+
name: "CEN Workshop Agreement",
|
|
79
|
+
harmonized_stages: %w[60.00 60.60],
|
|
80
|
+
),
|
|
81
|
+
|
|
82
|
+
# Guide
|
|
83
|
+
Pubid::Components::TypedStage.new(
|
|
84
|
+
code: :pubguide,
|
|
85
|
+
stage_code: :published,
|
|
86
|
+
type_code: :guide,
|
|
87
|
+
abbr: ["Guide"],
|
|
88
|
+
name: "Guide",
|
|
89
|
+
harmonized_stages: %w[60.00 60.60],
|
|
90
|
+
),
|
|
91
|
+
|
|
92
|
+
# Harmonization Document (HD)
|
|
93
|
+
Pubid::Components::TypedStage.new(
|
|
94
|
+
code: :pubhd,
|
|
95
|
+
stage_code: :published,
|
|
96
|
+
type_code: :hd,
|
|
97
|
+
abbr: ["HD"],
|
|
98
|
+
name: "Harmonization Document",
|
|
99
|
+
harmonized_stages: %w[60.00 60.60],
|
|
100
|
+
),
|
|
101
|
+
|
|
102
|
+
# European Specification (ES)
|
|
103
|
+
Pubid::Components::TypedStage.new(
|
|
104
|
+
code: :pubes,
|
|
105
|
+
stage_code: :published,
|
|
106
|
+
type_code: :es,
|
|
107
|
+
abbr: ["ES"],
|
|
108
|
+
name: "European Specification",
|
|
109
|
+
harmonized_stages: %w[60.00 60.60],
|
|
110
|
+
),
|
|
111
|
+
|
|
112
|
+
# CEN Report (CR)
|
|
113
|
+
Pubid::Components::TypedStage.new(
|
|
114
|
+
code: :pubcr,
|
|
115
|
+
stage_code: :published,
|
|
116
|
+
type_code: :cr,
|
|
117
|
+
abbr: ["CR"],
|
|
118
|
+
name: "CEN Report",
|
|
119
|
+
harmonized_stages: %w[60.00 60.60],
|
|
120
|
+
),
|
|
121
|
+
|
|
122
|
+
# European Prestandard (ENV)
|
|
123
|
+
Pubid::Components::TypedStage.new(
|
|
124
|
+
code: :pubenv,
|
|
125
|
+
stage_code: :published,
|
|
126
|
+
type_code: :env,
|
|
127
|
+
abbr: ["ENV"],
|
|
128
|
+
name: "European Prestandard",
|
|
129
|
+
harmonized_stages: %w[60.00 60.60],
|
|
130
|
+
),
|
|
131
|
+
].freeze
|
|
132
|
+
|
|
133
|
+
# Default typed stage for when no match is found
|
|
134
|
+
DEFAULT_TYPED_STAGE = Pubid::Components::TypedStage.new(
|
|
135
|
+
code: :puben,
|
|
136
|
+
stage_code: :published,
|
|
137
|
+
type_code: :en,
|
|
138
|
+
abbr: ["EN"],
|
|
139
|
+
name: "European Norm",
|
|
140
|
+
harmonized_stages: %w[60.00 60.60],
|
|
141
|
+
).freeze
|
|
14
142
|
|
|
15
143
|
def self.parse(identifier)
|
|
16
144
|
CenCenelec::Identifier.parse(identifier)
|
|
17
145
|
end
|
|
146
|
+
|
|
147
|
+
# Auto-discover all identifier types from the Identifiers namespace
|
|
148
|
+
# @return [Array<Class>] identifier classes that define a self.type Hash
|
|
149
|
+
def self.identifier_types
|
|
150
|
+
@identifier_types ||= Identifiers.constants
|
|
151
|
+
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
152
|
+
.select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
|
|
153
|
+
.select { |c| c.type.is_a?(Hash) }
|
|
154
|
+
end
|
|
155
|
+
|
|
156
|
+
# Build typed stage index from the module's TYPED_STAGES_REGISTRY
|
|
157
|
+
# @return [Array<Pubid::Components::TypedStage>] all typed stages
|
|
158
|
+
def self.all_typed_stages
|
|
159
|
+
TYPED_STAGES_REGISTRY
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
# Lookup: type code -> identifier class
|
|
163
|
+
# @param code [String, Symbol] the type key to find
|
|
164
|
+
# @return [Class, nil] the matching identifier class
|
|
165
|
+
def self.locate_type(code)
|
|
166
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
# Lookup: abbreviation -> typed stage
|
|
170
|
+
# @param abbr [String, Symbol] the abbreviation to find
|
|
171
|
+
# @return [Pubid::Components::TypedStage, nil] the matching typed stage
|
|
172
|
+
def self.locate_stage(abbr)
|
|
173
|
+
abbr_str = abbr.to_s.upcase
|
|
174
|
+
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
175
|
+
end
|
|
18
176
|
end
|
|
19
177
|
end
|
|
20
178
|
|
|
21
179
|
Pubid::Registry.register(:cen_cenelec, Pubid::CenCenelec)
|
|
180
|
+
Pubid::Registry.register(:cen, Pubid::CenCenelec)
|
|
181
|
+
|
|
182
|
+
# Per-flavor format registry: inherits global formats, overrides :human
|
|
183
|
+
# Register on both root hierarchies: SingleIdentifier and Identifiers::Base
|
|
184
|
+
cen_renderer = Pubid::CenCenelec::Renderer
|
|
185
|
+
Pubid::CenCenelec::SingleIdentifier.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
|
|
186
|
+
Pubid::CenCenelec::SingleIdentifier.format_registry.register(:human, renderer: cen_renderer)
|
|
187
|
+
Pubid::CenCenelec::Identifiers::Base.format_registry = Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
|
|
188
|
+
Pubid::CenCenelec::Identifiers::Base.format_registry.register(:human, renderer: cen_renderer)
|
|
@@ -7,6 +7,10 @@ module Pubid
|
|
|
7
7
|
module Components
|
|
8
8
|
# Code component for CIE identifiers
|
|
9
9
|
# Handles number-part-iteration with style awareness
|
|
10
|
+
#
|
|
11
|
+
# Stays independent of Pubid::Components::Code because CIE tracks
|
|
12
|
+
# +style+ ("legacy" / "current") and +part_separator+ to round-trip
|
|
13
|
+
# slash vs dash notation, plus an +iteration+ sub-field.
|
|
10
14
|
class Code < Lutaml::Model::Serializable
|
|
11
15
|
attribute :number, :string # "013", "170", "198"
|
|
12
16
|
attribute :part, :string # "1", "2", "3"
|
|
@@ -66,6 +70,10 @@ module Pubid
|
|
|
66
70
|
new(number: code_str, style: style)
|
|
67
71
|
end
|
|
68
72
|
end
|
|
73
|
+
|
|
74
|
+
def render(context: nil)
|
|
75
|
+
to_s
|
|
76
|
+
end
|
|
69
77
|
end
|
|
70
78
|
end
|
|
71
79
|
end
|
data/lib/pubid/cie/identifier.rb
CHANGED
|
@@ -2,12 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Cie
|
|
5
|
-
# Base Identifier class for CIE
|
|
6
|
-
#
|
|
7
|
-
|
|
5
|
+
# Base Identifier class for CIE.
|
|
6
|
+
#
|
|
7
|
+
# Inherits the shared Pubid::Identifier contract (format_registry, render,
|
|
8
|
+
# to_urn, exclude, hash, eql?) while allowing CIE-specific attributes
|
|
9
|
+
# such as +style+ ("legacy" vs "current" date separator).
|
|
10
|
+
class Identifier < ::Pubid::Identifier
|
|
8
11
|
attribute :style, :string # "legacy" or "current"
|
|
9
12
|
|
|
10
|
-
# Parse CIE identifier string
|
|
11
13
|
def self.parse(input)
|
|
12
14
|
parsed = Parser.parse(input)
|
|
13
15
|
builder = Builder.new
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Cie
|
|
5
|
+
# Parses CIE URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits:
|
|
8
|
+
# urn:cie:cie:{code}:{year}:sep.colon
|
|
9
|
+
#
|
|
10
|
+
# The trailing `sep.colon` token records the code/year separator used
|
|
11
|
+
# in the human-readable form (`:`). The leading `cie` after the
|
|
12
|
+
# namespace is the lowercase publisher.
|
|
13
|
+
#
|
|
14
|
+
# Examples:
|
|
15
|
+
# - urn:cie:cie:015:2018:sep.colon → CIE 015:2018
|
|
16
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
17
|
+
def parse_urn(urn)
|
|
18
|
+
body = strip_namespace(urn)
|
|
19
|
+
parts = split_parts(body).reject { |p| p.start_with?("sep.") }
|
|
20
|
+
|
|
21
|
+
_publisher, code, year = parts
|
|
22
|
+
text = "CIE #{code}"
|
|
23
|
+
text += ":#{year}" if year
|
|
24
|
+
flavor_parse(text)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|