pubid 2.0.0.pre.alpha.8 → 2.0.0.pre.alpha.11
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 +33 -11
- data/conformance/pending.yaml +4 -0
- data/data/bipm/update_codes.yaml +9 -0
- data/data/iec/update_codes.yaml +3 -0
- data/data/ieee/update_codes.yaml +107 -1
- data/{archived-gems/pubid-nist → data/nist}/series.yaml +34 -0
- data/data/nist/update_codes.yaml +8 -0
- data/lib/pubid/adobe/builder.rb +52 -0
- data/lib/pubid/adobe/identifier.rb +47 -0
- data/lib/pubid/adobe/identifiers/publication.rb +31 -0
- data/lib/pubid/adobe/identifiers/tech_note.rb +32 -0
- data/lib/pubid/adobe/identifiers.rb +10 -0
- data/lib/pubid/adobe/parser.rb +136 -0
- data/lib/pubid/adobe/renderer.rb +39 -0
- data/lib/pubid/adobe/urn_generator.rb +42 -0
- data/lib/pubid/adobe/urn_parser.rb +69 -0
- data/lib/pubid/adobe.rb +61 -0
- data/lib/pubid/amca/builder.rb +4 -4
- data/lib/pubid/amca/identifier.rb +1 -3
- data/lib/pubid/amca/identifiers/base.rb +50 -33
- data/lib/pubid/amca/identifiers/interpretation.rb +18 -10
- data/lib/pubid/amca/identifiers/publication.rb +14 -10
- data/lib/pubid/amca/identifiers/standard.rb +3 -1
- data/lib/pubid/amca/identifiers.rb +0 -1
- data/lib/pubid/amca/parser.rb +1 -1
- data/lib/pubid/amca/renderer.rb +4 -4
- data/lib/pubid/amca/single_identifier.rb +1 -1
- data/lib/pubid/amca/urn_generator.rb +2 -2
- data/lib/pubid/amca.rb +5 -4
- data/lib/pubid/ansi/builder.rb +2 -2
- data/lib/pubid/ansi/identifier.rb +18 -0
- data/lib/pubid/ansi/parser.rb +1 -1
- data/lib/pubid/ansi/renderer.rb +2 -2
- data/lib/pubid/ansi.rb +5 -5
- data/lib/pubid/api/builder.rb +16 -2
- data/lib/pubid/api/identifier.rb +25 -4
- data/lib/pubid/api/identifiers/mpms.rb +10 -8
- data/lib/pubid/api/parser.rb +1 -1
- data/lib/pubid/api/renderer.rb +16 -7
- data/lib/pubid/api/single_identifier.rb +5 -12
- data/lib/pubid/api.rb +1 -0
- data/lib/pubid/ashrae/builder.rb +53 -32
- data/lib/pubid/ashrae/identifier.rb +3 -4
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +7 -1
- data/lib/pubid/ashrae/identifiers/addendum.rb +9 -1
- data/lib/pubid/ashrae/identifiers/base.rb +94 -12
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +8 -1
- data/lib/pubid/ashrae/identifiers/errata.rb +9 -0
- data/lib/pubid/ashrae/identifiers/guideline.rb +3 -0
- data/lib/pubid/ashrae/identifiers/interpretation.rb +16 -0
- data/lib/pubid/ashrae/identifiers/standard.rb +3 -0
- data/lib/pubid/ashrae/identifiers.rb +0 -1
- data/lib/pubid/ashrae/parser.rb +37 -17
- data/lib/pubid/ashrae/renderer.rb +20 -20
- data/lib/pubid/ashrae/single_identifier.rb +1 -1
- data/lib/pubid/ashrae/supplement_identifier.rb +21 -6
- data/lib/pubid/ashrae/urn_generator.rb +8 -2
- data/lib/pubid/ashrae.rb +10 -4
- data/lib/pubid/asme/builder.rb +11 -2
- data/lib/pubid/asme/identifier.rb +9 -0
- data/lib/pubid/asme/identifiers/standard.rb +86 -2
- data/lib/pubid/asme/parser.rb +1 -1
- data/lib/pubid/asme/renderer.rb +3 -3
- data/lib/pubid/asme/single_identifier.rb +8 -1
- data/lib/pubid/asme/urn_generator.rb +2 -2
- data/lib/pubid/asme.rb +1 -0
- data/lib/pubid/astm/builder.rb +10 -3
- data/lib/pubid/astm/identifier.rb +9 -0
- data/lib/pubid/astm/identifiers/adjunct.rb +16 -1
- data/lib/pubid/astm/identifiers/code_number.rb +81 -0
- data/lib/pubid/astm/identifiers/data_series.rb +2 -0
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +16 -0
- data/lib/pubid/astm/identifiers/manual.rb +10 -0
- data/lib/pubid/astm/identifiers/monograph.rb +2 -0
- data/lib/pubid/astm/identifiers/research_report.rb +10 -0
- data/lib/pubid/astm/identifiers/standard.rb +10 -0
- data/lib/pubid/astm/identifiers/technical_report.rb +2 -0
- data/lib/pubid/astm/identifiers/work_in_progress.rb +2 -0
- data/lib/pubid/astm/identifiers.rb +1 -0
- data/lib/pubid/astm/parser.rb +1 -1
- data/lib/pubid/astm/renderer.rb +1 -1
- data/lib/pubid/astm/single_identifier.rb +31 -1
- data/lib/pubid/astm/urn_generator.rb +7 -5
- data/lib/pubid/astm.rb +1 -0
- data/lib/pubid/bipm/builder.rb +163 -0
- data/lib/pubid/bipm/identifier.rb +285 -0
- data/lib/pubid/bipm/identifiers/committee_document.rb +36 -0
- data/lib/pubid/bipm/identifiers/guide.rb +35 -0
- data/lib/pubid/bipm/identifiers/meeting.rb +53 -0
- data/lib/pubid/bipm/identifiers/mep.rb +33 -0
- data/lib/pubid/bipm/identifiers/metrologia_article.rb +48 -0
- data/lib/pubid/bipm/identifiers/si_brochure.rb +33 -0
- data/lib/pubid/bipm/identifiers.rb +15 -0
- data/lib/pubid/bipm/parser.rb +237 -0
- data/lib/pubid/bipm/renderer.rb +118 -0
- data/lib/pubid/bipm/urn_generator.rb +58 -0
- data/lib/pubid/bipm/urn_parser.rb +60 -0
- data/lib/pubid/bipm.rb +92 -0
- data/lib/pubid/bsi/builder.rb +62 -52
- data/lib/pubid/bsi/identifier.rb +0 -1
- data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +36 -7
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +7 -6
- data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +0 -1
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +10 -0
- data/lib/pubid/bsi/identifiers/committee_document.rb +10 -1
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +6 -0
- data/lib/pubid/bsi/identifiers/corrigendum.rb +4 -4
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +5 -5
- data/lib/pubid/bsi/identifiers/handbook.rb +0 -2
- data/lib/pubid/bsi/identifiers/practice_guide.rb +0 -1
- data/lib/pubid/bsi/identifiers/set.rb +11 -0
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +10 -1
- data/lib/pubid/bsi/identifiers/supplement_document.rb +2 -2
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
- data/lib/pubid/bsi/parser.rb +1 -1
- data/lib/pubid/bsi/renderer.rb +71 -59
- data/lib/pubid/bsi/single_identifier.rb +64 -7
- data/lib/pubid/bsi/urn_generator.rb +11 -2
- data/lib/pubid/bsi.rb +7 -1
- data/lib/pubid/builder/base.rb +23 -11
- data/lib/pubid/bundled_identifier.rb +19 -9
- data/lib/pubid/calconnect/builder.rb +38 -0
- data/lib/pubid/calconnect/identifier.rb +121 -0
- data/lib/pubid/calconnect/identifiers/standard.rb +29 -0
- data/lib/pubid/calconnect/identifiers.rb +9 -0
- data/lib/pubid/calconnect/parser.rb +54 -0
- data/lib/pubid/calconnect/renderer.rb +36 -0
- data/lib/pubid/calconnect/urn_generator.rb +33 -0
- data/lib/pubid/calconnect/urn_parser.rb +34 -0
- data/lib/pubid/calconnect.rb +83 -0
- data/lib/pubid/ccsds/builder.rb +1 -1
- data/lib/pubid/ccsds/identifier.rb +10 -3
- data/lib/pubid/ccsds/identifiers/base.rb +4 -2
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +4 -4
- data/lib/pubid/ccsds/parser.rb +1 -1
- data/lib/pubid/ccsds/single_identifier.rb +2 -2
- data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
- data/lib/pubid/ccsds/urn_generator.rb +3 -3
- data/lib/pubid/ccsds.rb +1 -0
- data/lib/pubid/cen_cenelec/builder.rb +131 -72
- data/lib/pubid/cen_cenelec/identifier.rb +115 -3
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +27 -16
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +46 -6
- data/lib/pubid/cen_cenelec/identifiers/base.rb +8 -9
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +29 -14
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +47 -8
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +27 -2
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +15 -5
- data/lib/pubid/cen_cenelec/identifiers/guide.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +1 -1
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +1 -1
- data/lib/pubid/cen_cenelec/parser.rb +1 -1
- data/lib/pubid/cen_cenelec/renderer.rb +55 -60
- data/lib/pubid/cen_cenelec/single_identifier.rb +20 -2
- data/lib/pubid/cen_cenelec/urn_generator.rb +66 -44
- data/lib/pubid/cen_cenelec.rb +104 -82
- data/lib/pubid/cie/builder.rb +149 -24
- data/lib/pubid/cie/identifier.rb +13 -4
- data/lib/pubid/cie/identifiers/bundle.rb +35 -5
- data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
- data/lib/pubid/cie/identifiers/conference.rb +11 -6
- data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
- data/lib/pubid/cie/identifiers/dual_published.rb +6 -6
- data/lib/pubid/cie/identifiers/identical.rb +9 -9
- data/lib/pubid/cie/identifiers/joint_published.rb +10 -10
- data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
- data/lib/pubid/cie/identifiers/standard.rb +43 -8
- data/lib/pubid/cie/identifiers/supplement.rb +27 -25
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +7 -3
- data/lib/pubid/cie/identifiers.rb +2 -0
- data/lib/pubid/cie/parser.rb +55 -6
- data/lib/pubid/cie/single_identifier.rb +40 -1
- data/lib/pubid/cie/supplement_identifier.rb +29 -16
- data/lib/pubid/cie/urn_generator.rb +11 -8
- data/lib/pubid/cie.rb +7 -2
- data/lib/pubid/components/date.rb +21 -5
- data/lib/pubid/conformance/checks.rb +72 -0
- data/lib/pubid/conformance/corpus/case.rb +55 -0
- data/lib/pubid/conformance/corpus.rb +36 -0
- data/lib/pubid/conformance/generator.rb +212 -0
- data/lib/pubid/conformance/pending.rb +63 -0
- data/lib/pubid/conformance/runner.rb +153 -0
- data/lib/pubid/conformance.rb +55 -0
- data/lib/pubid/core.rb +2 -0
- data/lib/pubid/csa/builder.rb +48 -48
- data/lib/pubid/csa/composite_identifier.rb +18 -7
- data/lib/pubid/csa/identifier.rb +187 -80
- data/lib/pubid/csa/identifiers/bundled.rb +25 -9
- data/lib/pubid/csa/identifiers/canadian_adopted.rb +13 -13
- data/lib/pubid/csa/identifiers/cec.rb +44 -4
- data/lib/pubid/csa/identifiers/combined.rb +97 -69
- data/lib/pubid/csa/identifiers/csa_adopted.rb +4 -4
- data/lib/pubid/csa/identifiers/package.rb +4 -4
- data/lib/pubid/csa/parser.rb +12 -8
- data/lib/pubid/csa/renderer.rb +13 -5
- data/lib/pubid/csa/single_identifier.rb +93 -4
- data/lib/pubid/csa/urn_generator.rb +9 -2
- data/lib/pubid/csa/wrapper_identifier.rb +43 -10
- data/lib/pubid/csa.rb +7 -1
- data/lib/pubid/doi/builder.rb +18 -0
- data/lib/pubid/doi/identifier.rb +49 -0
- data/lib/pubid/doi/identifiers/resource.rb +30 -0
- data/lib/pubid/doi/identifiers.rb +9 -0
- data/lib/pubid/doi/parser.rb +52 -0
- data/lib/pubid/doi/renderer.rb +13 -0
- data/lib/pubid/doi.rb +56 -0
- data/lib/pubid/easc/builder.rb +55 -0
- data/lib/pubid/easc/identifier.rb +59 -0
- data/lib/pubid/easc/identifiers/pmg.rb +20 -0
- data/lib/pubid/easc/identifiers/rmg.rb +19 -0
- data/lib/pubid/easc/identifiers.rb +10 -0
- data/lib/pubid/easc/parser.rb +88 -0
- data/lib/pubid/easc/renderer.rb +48 -0
- data/lib/pubid/easc/urn_generator.rb +46 -0
- data/lib/pubid/easc/urn_parser.rb +57 -0
- data/lib/pubid/easc.rb +53 -0
- data/lib/pubid/ecma/builder.rb +45 -0
- data/lib/pubid/ecma/identifier.rb +147 -0
- data/lib/pubid/ecma/identifiers/memento.rb +30 -0
- data/lib/pubid/ecma/identifiers/standard.rb +31 -0
- data/lib/pubid/ecma/identifiers/technical_report.rb +31 -0
- data/lib/pubid/ecma/identifiers.rb +11 -0
- data/lib/pubid/ecma/parser.rb +76 -0
- data/lib/pubid/ecma/renderer.rb +67 -0
- data/lib/pubid/ecma/urn_generator.rb +46 -0
- data/lib/pubid/ecma/urn_parser.rb +51 -0
- data/lib/pubid/ecma.rb +68 -0
- data/lib/pubid/errors.rb +80 -0
- data/lib/pubid/etsi/builder.rb +13 -4
- data/lib/pubid/etsi/identifier.rb +1 -3
- data/lib/pubid/etsi/identifiers/base.rb +43 -11
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +207 -4
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +45 -3
- data/lib/pubid/etsi/identifiers.rb +0 -1
- data/lib/pubid/etsi/parser.rb +9 -3
- data/lib/pubid/etsi/renderer.rb +8 -2
- data/lib/pubid/etsi.rb +6 -5
- data/lib/pubid/evs/builder.rb +26 -0
- data/lib/pubid/evs/identifier.rb +37 -0
- data/lib/pubid/evs/identifiers/national_adoption.rb +17 -0
- data/lib/pubid/evs/identifiers.rb +9 -0
- data/lib/pubid/evs/parser.rb +27 -0
- data/lib/pubid/evs/renderer.rb +30 -0
- data/lib/pubid/evs/urn_generator.rb +30 -0
- data/lib/pubid/evs/urn_parser.rb +80 -0
- data/lib/pubid/evs.rb +90 -0
- data/lib/pubid/export/exporter.rb +2 -1
- data/lib/pubid/export/flavor_exporter.rb +18 -3
- data/lib/pubid/export.rb +1 -0
- data/lib/pubid/format_detector.rb +1 -0
- data/lib/pubid/gb/builder.rb +45 -0
- data/lib/pubid/gb/identifier.rb +67 -0
- data/lib/pubid/gb/identifiers/standard.rb +34 -0
- data/lib/pubid/gb/identifiers.rb +9 -0
- data/lib/pubid/gb/parser.rb +63 -0
- data/lib/pubid/gb/renderer.rb +35 -0
- data/lib/pubid/gb.rb +88 -0
- data/lib/pubid/gost/builder.rb +185 -0
- data/lib/pubid/gost/identifier.rb +47 -0
- data/lib/pubid/gost/identifiers/foreign_reference.rb +25 -0
- data/lib/pubid/gost/identifiers/harmonized.rb +39 -0
- data/lib/pubid/gost/identifiers/identical_adoption.rb +39 -0
- data/lib/pubid/gost/identifiers/interstate_standard.rb +20 -0
- data/lib/pubid/gost/identifiers/national_standard.rb +19 -0
- data/lib/pubid/gost/identifiers.rb +13 -0
- data/lib/pubid/gost/parser.rb +105 -0
- data/lib/pubid/gost/renderer.rb +48 -0
- data/lib/pubid/gost/urn_generator.rb +46 -0
- data/lib/pubid/gost/urn_parser.rb +52 -0
- data/lib/pubid/gost.rb +50 -0
- data/lib/pubid/iala/builder.rb +22 -27
- data/lib/pubid/iala/identifier.rb +36 -8
- data/lib/pubid/iala/identifiers/advice.rb +1 -1
- data/lib/pubid/iala/identifiers/annex.rb +10 -10
- data/lib/pubid/iala/identifiers/general_assembly.rb +5 -2
- data/lib/pubid/iala/identifiers/guideline.rb +3 -1
- data/lib/pubid/iala/identifiers/letter.rb +1 -1
- data/lib/pubid/iala/identifiers/manual.rb +3 -1
- data/lib/pubid/iala/identifiers/model_course.rb +3 -1
- data/lib/pubid/iala/identifiers/recommendation.rb +3 -1
- data/lib/pubid/iala/identifiers/report.rb +1 -1
- data/lib/pubid/iala/identifiers/resolution.rb +1 -1
- data/lib/pubid/iala/identifiers/standard.rb +3 -1
- data/lib/pubid/iala/identifiers.rb +0 -1
- data/lib/pubid/iala/parser.rb +10 -2
- data/lib/pubid/iala/renderer.rb +1 -1
- data/lib/pubid/iala/urn_generator.rb +1 -1
- data/lib/pubid/iala/urn_parser.rb +24 -3
- data/lib/pubid/iala.rb +5 -4
- data/lib/pubid/iana/builder.rb +22 -0
- data/lib/pubid/iana/identifier.rb +140 -0
- data/lib/pubid/iana/identifiers/registry.rb +69 -0
- data/lib/pubid/iana/identifiers.rb +9 -0
- data/lib/pubid/iana/parser.rb +38 -0
- data/lib/pubid/iana/renderer.rb +32 -0
- data/lib/pubid/iana/urn_generator.rb +19 -0
- data/lib/pubid/iana/urn_parser.rb +24 -0
- data/lib/pubid/iana.rb +70 -0
- data/lib/pubid/identifier.rb +797 -26
- data/lib/pubid/identifier_metadata.rb +1 -0
- data/lib/pubid/idf/builder.rb +4 -4
- data/lib/pubid/idf/identifier.rb +18 -9
- data/lib/pubid/idf/parser.rb +3 -3
- data/lib/pubid/idf/renderer.rb +5 -5
- data/lib/pubid/idf/supplement_identifier.rb +3 -3
- data/lib/pubid/idf/urn_generator.rb +1 -1
- data/lib/pubid/idf.rb +7 -1
- data/lib/pubid/iec/builder.rb +49 -32
- data/lib/pubid/iec/components.rb +0 -1
- data/lib/pubid/iec/identifier.rb +112 -77
- data/lib/pubid/iec/identifiers/amendment.rb +6 -2
- data/lib/pubid/iec/identifiers/base.rb +2 -2
- data/lib/pubid/iec/identifiers/component_specification.rb +0 -10
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +0 -10
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +13 -15
- data/lib/pubid/iec/identifiers/guide.rb +0 -16
- data/lib/pubid/iec/identifiers/international_standard.rb +22 -6
- data/lib/pubid/iec/identifiers/operational_document.rb +0 -10
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +0 -12
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +0 -10
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +0 -10
- data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +1 -18
- data/lib/pubid/iec/identifiers/technical_specification.rb +1 -18
- data/lib/pubid/iec/identifiers/technology_report.rb +0 -10
- data/lib/pubid/iec/identifiers/test_report_form.rb +0 -11
- data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
- data/lib/pubid/iec/identifiers/white_paper.rb +0 -10
- data/lib/pubid/iec/identifiers/working_document.rb +24 -10
- data/lib/pubid/iec/identifiers.rb +1 -0
- data/lib/pubid/iec/parser.rb +53 -28
- data/lib/pubid/iec/renderer.rb +31 -18
- data/lib/pubid/iec/single_identifier.rb +34 -11
- data/lib/pubid/iec/supplement_identifier.rb +32 -19
- data/lib/pubid/iec/urn_generator.rb +227 -61
- data/lib/pubid/iec/urn_parser.rb +42 -4
- data/lib/pubid/iec.rb +2 -6
- data/lib/pubid/ieee/aiee/builder.rb +17 -3
- data/lib/pubid/ieee/aiee/identifier.rb +46 -62
- data/lib/pubid/ieee/aiee/parser.rb +1 -1
- data/lib/pubid/ieee/builder.rb +386 -69
- data/lib/pubid/ieee/compaction.rb +121 -0
- data/lib/pubid/ieee/components/draft.rb +47 -7
- data/lib/pubid/ieee/identifier.rb +1 -3
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +62 -5
- data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
- data/lib/pubid/ieee/identifiers/base.rb +148 -18
- data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +6 -2
- data/lib/pubid/ieee/identifiers/corrigendum.rb +17 -2
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +24 -3
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
- data/lib/pubid/ieee/identifiers/dual_published.rb +58 -3
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +25 -1
- data/lib/pubid/ieee/identifiers/joint_development.rb +64 -15
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +58 -6
- data/lib/pubid/ieee/identifiers/nesc/base.rb +90 -19
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +20 -5
- data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +16 -5
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +11 -2
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +18 -3
- data/lib/pubid/ieee/identifiers/nesc.rb +1 -0
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +3 -3
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +14 -6
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +4 -4
- data/lib/pubid/ieee/identifiers/si_standard.rb +4 -1
- data/lib/pubid/ieee/identifiers/standard.rb +4 -1
- data/lib/pubid/ieee/identifiers/supplement_identifier.rb +26 -7
- data/lib/pubid/ieee/identifiers.rb +2 -1
- data/lib/pubid/ieee/ire/builder.rb +7 -6
- data/lib/pubid/ieee/ire/identifier.rb +48 -33
- data/lib/pubid/ieee/ire/parser.rb +1 -1
- data/lib/pubid/ieee/nesc/builder.rb +33 -20
- data/lib/pubid/ieee/nesc/parser.rb +16 -15
- data/lib/pubid/ieee/parser.rb +462 -44
- data/lib/pubid/ieee/pre_parser.rb +1 -1
- data/lib/pubid/ieee/renderer.rb +158 -57
- data/lib/pubid/ieee/typed_stages.rb +12 -1
- data/lib/pubid/ieee/urn_generator.rb +35 -8
- data/lib/pubid/ieee.rb +63 -4
- data/lib/pubid/ieee_debug.rb +1 -0
- data/lib/pubid/ietf/builder.rb +78 -0
- data/lib/pubid/ietf/identifier.rb +5 -0
- data/lib/pubid/ietf/identifiers/base.rb +72 -0
- data/lib/pubid/ietf/identifiers/bcp.rb +36 -0
- data/lib/pubid/ietf/identifiers/fyi.rb +36 -0
- data/lib/pubid/ietf/identifiers/internet_draft.rb +45 -0
- data/lib/pubid/ietf/identifiers/rfc.rb +27 -0
- data/lib/pubid/ietf/identifiers/serialization.rb +51 -0
- data/lib/pubid/ietf/identifiers/std.rb +36 -0
- data/lib/pubid/ietf/identifiers.rb +14 -0
- data/lib/pubid/ietf/parser.rb +61 -0
- data/lib/pubid/ietf/renderer.rb +64 -0
- data/lib/pubid/ietf/urn_generator.rb +37 -0
- data/lib/pubid/ietf/urn_parser.rb +43 -0
- data/lib/pubid/ietf.rb +86 -0
- data/lib/pubid/iho/identifier.rb +1 -3
- data/lib/pubid/iho/identifiers/base.rb +11 -10
- data/lib/pubid/iho/identifiers/bibliographic.rb +1 -1
- data/lib/pubid/iho/identifiers/circular_letter.rb +1 -1
- data/lib/pubid/iho/identifiers/miscellaneous.rb +1 -1
- data/lib/pubid/iho/identifiers/publication.rb +1 -1
- data/lib/pubid/iho/identifiers/standard.rb +1 -1
- data/lib/pubid/iho/identifiers.rb +0 -1
- data/lib/pubid/iho/parser.rb +1 -1
- data/lib/pubid/iho.rb +8 -7
- data/lib/pubid/isbn/builder.rb +44 -0
- data/lib/pubid/isbn/check_digit.rb +53 -0
- data/lib/pubid/isbn/identifier.rb +81 -0
- data/lib/pubid/isbn/identifiers/book.rb +30 -0
- data/lib/pubid/isbn/identifiers.rb +9 -0
- data/lib/pubid/isbn/parser.rb +45 -0
- data/lib/pubid/isbn/renderer.rb +16 -0
- data/lib/pubid/isbn.rb +53 -0
- data/lib/pubid/iso/builder.rb +9 -4
- data/lib/pubid/iso/bundled_identifier.rb +5 -3
- data/lib/pubid/iso/combined_identifier.rb +6 -4
- data/lib/pubid/iso/identifier.rb +29 -8
- data/lib/pubid/iso/identifiers/directives_supplement.rb +12 -12
- data/lib/pubid/iso/normalizer.rb +2 -2
- data/lib/pubid/iso/parser.rb +17 -13
- data/lib/pubid/iso/supplement_identifier.rb +19 -6
- data/lib/pubid/iso/urn_generator.rb +4 -1
- data/lib/pubid/iso/urn_parser.rb +1 -1
- data/lib/pubid/iso.rb +7 -1
- data/lib/pubid/itu/builder.rb +230 -29
- data/lib/pubid/itu/components/code.rb +48 -5
- data/lib/pubid/itu/components/designation.rb +35 -0
- data/lib/pubid/itu/components.rb +1 -0
- data/lib/pubid/itu/identifier.rb +1 -3
- data/lib/pubid/itu/identifiers/addendum.rb +15 -0
- data/lib/pubid/itu/identifiers/amendment.rb +7 -29
- data/lib/pubid/itu/identifiers/annex.rb +13 -2
- data/lib/pubid/itu/identifiers/annex_of_recommendation.rb +87 -0
- data/lib/pubid/itu/identifiers/appendix_of_recommendation.rb +92 -0
- data/lib/pubid/itu/identifiers/base.rb +357 -25
- data/lib/pubid/itu/identifiers/combined_identifier.rb +99 -23
- data/lib/pubid/itu/identifiers/corrigendum.rb +16 -23
- data/lib/pubid/itu/identifiers/errata.rb +15 -0
- data/lib/pubid/itu/identifiers/handbook.rb +38 -0
- data/lib/pubid/itu/identifiers/question.rb +63 -0
- data/lib/pubid/itu/identifiers/recommendation.rb +3 -2
- data/lib/pubid/itu/identifiers/report.rb +39 -0
- data/lib/pubid/itu/identifiers/special_publication.rb +3 -1
- data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
- data/lib/pubid/itu/identifiers/supplement.rb +119 -14
- data/lib/pubid/itu/identifiers.rb +10 -1
- data/lib/pubid/itu/model.rb +1 -1
- data/lib/pubid/itu/parser.rb +481 -27
- data/lib/pubid/itu/urn_generator.rb +36 -6
- data/lib/pubid/itu/urn_parser.rb +8 -0
- data/lib/pubid/itu.rb +12 -3
- data/lib/pubid/jcgm/builder.rb +24 -14
- data/lib/pubid/jcgm/identifier.rb +10 -0
- data/lib/pubid/jcgm/identifiers/amendment.rb +0 -2
- data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +3 -3
- data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
- data/lib/pubid/jcgm/identifiers.rb +2 -0
- data/lib/pubid/jcgm/parser.rb +74 -7
- data/lib/pubid/jcgm/renderer.rb +33 -12
- data/lib/pubid/jcgm/single_identifier.rb +84 -6
- data/lib/pubid/jcgm/supplement_identifier.rb +39 -4
- data/lib/pubid/jcgm/urn_generator.rb +21 -13
- data/lib/pubid/jcgm/urn_parser.rb +164 -10
- data/lib/pubid/jcgm.rb +10 -0
- data/lib/pubid/jis/identifier.rb +62 -3
- data/lib/pubid/jis/parser.rb +1 -1
- data/lib/pubid/jis.rb +1 -0
- data/lib/pubid/nist/builder.rb +29 -9
- data/lib/pubid/nist/caster.rb +7 -45
- data/lib/pubid/nist/circular_supplement_builder.rb +7 -5
- data/lib/pubid/nist/components/stage.rb +2 -2
- data/lib/pubid/nist/components/supplement.rb +5 -2
- data/lib/pubid/nist/configuration.rb +6 -2
- data/lib/pubid/nist/identifier.rb +1 -3
- data/lib/pubid/nist/identifiers/base.rb +133 -39
- data/lib/pubid/nist/identifiers/circular.rb +10 -3
- data/lib/pubid/nist/identifiers/circular_supplement.rb +14 -5
- data/lib/pubid/nist/identifiers/commercial_standard.rb +1 -1
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +1 -1
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +8 -2
- data/lib/pubid/nist/identifiers/crpl_report.rb +8 -2
- data/lib/pubid/nist/identifiers/dated_document.rb +1 -1
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +1 -1
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +1 -1
- data/lib/pubid/nist/identifiers/handbook.rb +10 -3
- data/lib/pubid/nist/identifiers/internal_report.rb +13 -6
- data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +15 -7
- data/lib/pubid/nist/identifiers/monograph.rb +15 -8
- data/lib/pubid/nist/identifiers/ncstar.rb +2 -2
- data/lib/pubid/nist/identifiers/nsrds.rb +1 -1
- data/lib/pubid/nist/identifiers/owmwp.rb +1 -1
- data/lib/pubid/nist/identifiers/report.rb +15 -7
- data/lib/pubid/nist/identifiers/special_publication.rb +10 -1
- data/lib/pubid/nist/identifiers/technical_note.rb +1 -1
- data/lib/pubid/nist/identifiers.rb +0 -1
- data/lib/pubid/nist/parser.rb +27 -4
- data/lib/pubid/nist/preprocessor.rb +15 -0
- data/lib/pubid/nist/router.rb +2 -2
- data/lib/pubid/nist/series/ir.rb +0 -3
- data/lib/pubid/nist/supplement_identifier.rb +24 -9
- data/lib/pubid/nist.rb +19 -13
- data/lib/pubid/oasis/builder.rb +79 -0
- data/lib/pubid/oasis/identifier.rb +160 -0
- data/lib/pubid/oasis/identifiers/standard.rb +29 -0
- data/lib/pubid/oasis/identifiers.rb +9 -0
- data/lib/pubid/oasis/parser.rb +34 -0
- data/lib/pubid/oasis/renderer.rb +29 -0
- data/lib/pubid/oasis/urn_generator.rb +25 -0
- data/lib/pubid/oasis/urn_parser.rb +22 -0
- data/lib/pubid/oasis.rb +80 -0
- data/lib/pubid/ogc/builder.rb +33 -0
- data/lib/pubid/ogc/identifier.rb +81 -0
- data/lib/pubid/ogc/identifiers/document.rb +26 -0
- data/lib/pubid/ogc/identifiers.rb +10 -0
- data/lib/pubid/ogc/parser.rb +40 -0
- data/lib/pubid/ogc/renderer.rb +33 -0
- data/lib/pubid/ogc/urn_generator.rb +14 -0
- data/lib/pubid/ogc/urn_parser.rb +22 -0
- data/lib/pubid/ogc.rb +72 -0
- data/lib/pubid/oiml/builder.rb +36 -8
- data/lib/pubid/oiml/identifier.rb +9 -1
- data/lib/pubid/oiml/identifiers/basic_publication.rb +2 -0
- data/lib/pubid/oiml/identifiers/bulletin.rb +36 -0
- data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
- data/lib/pubid/oiml/identifiers/document.rb +2 -0
- data/lib/pubid/oiml/identifiers/expert_report.rb +2 -0
- data/lib/pubid/oiml/identifiers/guide.rb +2 -0
- data/lib/pubid/oiml/identifiers/recommendation.rb +2 -0
- data/lib/pubid/oiml/identifiers/seminar_report.rb +2 -0
- data/lib/pubid/oiml/identifiers/vocabulary.rb +2 -0
- data/lib/pubid/oiml/identifiers.rb +1 -0
- data/lib/pubid/oiml/parser.rb +12 -13
- data/lib/pubid/oiml/renderer.rb +13 -13
- data/lib/pubid/oiml/single_identifier.rb +41 -37
- data/lib/pubid/oiml/supplement_identifier.rb +36 -9
- data/lib/pubid/oiml/urn_parser.rb +23 -6
- data/lib/pubid/oiml.rb +10 -0
- data/lib/pubid/omg/builder.rb +20 -0
- data/lib/pubid/omg/identifier.rb +61 -0
- data/lib/pubid/omg/identifiers/specification.rb +32 -0
- data/lib/pubid/omg/identifiers.rb +9 -0
- data/lib/pubid/omg/parser.rb +93 -0
- data/lib/pubid/omg/renderer.rb +31 -0
- data/lib/pubid/omg.rb +52 -0
- data/lib/pubid/parser/grammar.rb +74 -0
- data/lib/pubid/parser.rb +2 -0
- data/lib/pubid/parsers/mr_string.rb +120 -7
- data/lib/pubid/plateau/builder.rb +8 -4
- data/lib/pubid/plateau/identifier.rb +1 -3
- data/lib/pubid/plateau/identifiers/base.rb +1 -6
- data/lib/pubid/plateau/identifiers/handbook.rb +1 -1
- data/lib/pubid/plateau/identifiers/technical_report.rb +1 -1
- data/lib/pubid/plateau/identifiers.rb +0 -1
- data/lib/pubid/plateau/parser.rb +16 -6
- data/lib/pubid/plateau/renderer.rb +1 -1
- data/lib/pubid/plateau/supplement_identifier.rb +11 -11
- data/lib/pubid/plateau.rb +14 -4
- data/lib/pubid/prefixes_support.rb +1 -0
- data/lib/pubid/renderers/annotator.rb +233 -0
- data/lib/pubid/renderers/base.rb +13 -0
- data/lib/pubid/renderers/directives_renderer.rb +3 -3
- data/lib/pubid/renderers/human_readable.rb +6 -4
- data/lib/pubid/renderers/mr_string.rb +54 -6
- data/lib/pubid/renderers/supplement_renderer.rb +1 -1
- data/lib/pubid/renderers.rb +1 -0
- data/lib/pubid/rendering/numbering.rb +25 -7
- data/lib/pubid/rendering/supplement.rb +4 -4
- data/lib/pubid/rendering.rb +1 -0
- data/lib/pubid/sae/builder.rb +1 -1
- data/lib/pubid/sae/identifier.rb +1 -3
- data/lib/pubid/sae/identifiers/base.rb +19 -9
- data/lib/pubid/sae/identifiers.rb +0 -1
- data/lib/pubid/sae/parser.rb +1 -1
- data/lib/pubid/sae.rb +4 -3
- data/lib/pubid/schema/declaration.rb +33 -0
- data/lib/pubid/schema/error.rb +14 -0
- data/lib/pubid/schema/identifier_type.rb +23 -0
- data/lib/pubid/schema/loader.rb +117 -0
- data/lib/pubid/schema/typed_stage.rb +24 -0
- data/lib/pubid/schema.rb +25 -0
- data/lib/pubid/tgpp/builder.rb +41 -0
- data/lib/pubid/tgpp/identifier.rb +107 -0
- data/lib/pubid/tgpp/identifiers/technical_report.rb +32 -0
- data/lib/pubid/tgpp/identifiers/technical_specification.rb +33 -0
- data/lib/pubid/tgpp/identifiers.rb +11 -0
- data/lib/pubid/tgpp/parser.rb +78 -0
- data/lib/pubid/tgpp/renderer.rb +52 -0
- data/lib/pubid/tgpp/urn_generator.rb +39 -0
- data/lib/pubid/tgpp/urn_parser.rb +30 -0
- data/lib/pubid/tgpp.rb +84 -0
- data/lib/pubid/type_resolver.rb +74 -0
- data/lib/pubid/un/builder.rb +42 -0
- data/lib/pubid/un/identifier.rb +40 -0
- data/lib/pubid/un/identifiers/document.rb +24 -0
- data/lib/pubid/un/identifiers.rb +9 -0
- data/lib/pubid/un/parser.rb +25 -0
- data/lib/pubid/un/renderer.rb +11 -0
- data/lib/pubid/un.rb +47 -0
- data/lib/pubid/urn_parser/errors.rb +8 -1
- data/lib/pubid/urn_parser.rb +1 -0
- data/lib/pubid/utils.rb +1 -0
- data/lib/pubid/version.rb +1 -1
- data/lib/pubid/w3c/builder.rb +55 -0
- data/lib/pubid/w3c/identifier.rb +130 -0
- data/lib/pubid/w3c/identifiers/candidate_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/candidate_recommendation_draft.rb +31 -0
- data/lib/pubid/w3c/identifiers/draft_note.rb +31 -0
- data/lib/pubid/w3c/identifiers/note.rb +30 -0
- data/lib/pubid/w3c/identifiers/obsolete_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/proposed_edited_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/proposed_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/standard.rb +12 -0
- data/lib/pubid/w3c/identifiers/superseded_recommendation.rb +31 -0
- data/lib/pubid/w3c/identifiers/working_draft.rb +30 -0
- data/lib/pubid/w3c/identifiers.rb +25 -0
- data/lib/pubid/w3c/parser.rb +43 -0
- data/lib/pubid/w3c/renderer.rb +35 -0
- data/lib/pubid/w3c/urn_generator.rb +18 -0
- data/lib/pubid/w3c/urn_parser.rb +36 -0
- data/lib/pubid/w3c.rb +68 -0
- data/lib/pubid/xsf/builder.rb +17 -0
- data/lib/pubid/xsf/identifier.rb +66 -0
- data/lib/pubid/xsf/identifiers/xep.rb +31 -0
- data/lib/pubid/xsf/identifiers.rb +9 -0
- data/lib/pubid/xsf/parser.rb +38 -0
- data/lib/pubid/xsf/renderer.rb +23 -0
- data/lib/pubid/xsf/urn_generator.rb +13 -0
- data/lib/pubid/xsf/urn_parser.rb +18 -0
- data/lib/pubid/xsf.rb +82 -0
- data/lib/pubid.rb +424 -22
- data/lib/tasks/conformance.rake +34 -0
- data/lib/tasks/docs.rake +3 -3
- data/lib/tasks/schema.rake +88 -0
- data/schema/core/joint_prefixes.yaml +24 -0
- data/schema/iec.yaml +1017 -0
- data/schema/iso.yaml +1586 -0
- data/schema/schema.schema.yaml +96 -0
- metadata +241 -19
- data/archived-gems/pubid-ccsds/update_codes.yaml +0 -1
- data/archived-gems/pubid-iec/stages.yaml +0 -129
- data/archived-gems/pubid-iec/update_codes.yaml +0 -67
- data/archived-gems/pubid-ieee/update_codes.yaml +0 -104
- data/archived-gems/pubid-iso/stages.yaml +0 -106
- data/archived-gems/pubid-iso/update_codes.yaml +0 -4
- data/archived-gems/pubid-itu/i18n.yaml +0 -13
- data/archived-gems/pubid-itu/series.yaml +0 -42
- data/archived-gems/pubid-nist/publishers.yaml +0 -6
- data/archived-gems/pubid-nist/update_codes.yaml +0 -93
- data/archived-gems/pubid-plateau/update_codes.yaml +0 -6
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +0 -48
- data/lib/pubid/cie/components/code.rb +0 -80
- data/lib/pubid/iala/identifiers/base.rb +0 -14
- data/lib/pubid/iec/components/code.rb +0 -36
- /data/{archived-gems/pubid-nist → data/nist}/stages.yaml +0 -0
|
@@ -3,13 +3,48 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Jcgm
|
|
5
5
|
# Base class for JCGM supplement identifiers (amendments, corrigenda, etc.)
|
|
6
|
+
#
|
|
7
|
+
# The supplement's OWN number (the "1" in "/Cor 1", the "2" in "/Amd 2")
|
|
8
|
+
# is stored in the inherited `number` attribute — NOT a separate
|
|
9
|
+
# `iteration` attribute. Each supplement is itself a numbered document,
|
|
10
|
+
# just like the base. The base document's number is accessed via
|
|
11
|
+
# `base.number`. This mirrors how pubid-Iso models supplements.
|
|
6
12
|
class SupplementIdentifier < SingleIdentifier
|
|
7
|
-
attribute :
|
|
8
|
-
attribute :iteration, Pubid::Components::Code
|
|
13
|
+
attribute :base, Identifier, polymorphic: true
|
|
9
14
|
|
|
10
|
-
#
|
|
15
|
+
# The base document nests under the compact key "base" (mirrors ISO/JIS),
|
|
16
|
+
# serialized via its own to_hash so it collapses to {_type, number, year}.
|
|
17
|
+
# On load the sub-hash is re-dispatched through Jcgm::Identifier.from_hash,
|
|
18
|
+
# which resolves `_type` to the concrete Guide/GumGuide — a bare
|
|
19
|
+
# polymorphic cast would rebuild it as a plain Identifier and later fail
|
|
20
|
+
# on publisher_portion. This custom mapping replaces the former
|
|
21
|
+
# self.from_hash override.
|
|
22
|
+
#
|
|
23
|
+
# `number` (the supplement's own number) is mapped by SingleIdentifier's
|
|
24
|
+
# key_value block via number_to_kv / number_from_kv — no override needed.
|
|
25
|
+
key_value do
|
|
26
|
+
map "base", with: { to: :base_to_kv, from: :base_from_kv }
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def base_to_kv(model, doc)
|
|
30
|
+
return unless model.base
|
|
31
|
+
|
|
32
|
+
doc.add_child(
|
|
33
|
+
Lutaml::KeyValue::DataModel::Element.new(
|
|
34
|
+
"base", model.base.to_hash
|
|
35
|
+
),
|
|
36
|
+
)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def base_from_kv(model, value)
|
|
40
|
+
return unless value
|
|
41
|
+
|
|
42
|
+
model.base = ::Pubid::Jcgm::Identifier.from_hash(value)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Delegate publisher to base
|
|
11
46
|
def publisher
|
|
12
|
-
|
|
47
|
+
base&.publisher
|
|
13
48
|
end
|
|
14
49
|
end
|
|
15
50
|
end
|
|
@@ -4,7 +4,9 @@ module Pubid
|
|
|
4
4
|
module Jcgm
|
|
5
5
|
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
6
6
|
def generate
|
|
7
|
-
if identifier.is_a?(
|
|
7
|
+
if identifier.is_a?(Identifiers::Meeting)
|
|
8
|
+
generate_meeting_urn
|
|
9
|
+
elsif identifier.is_a?(SupplementIdentifier)
|
|
8
10
|
generate_supplement_urn
|
|
9
11
|
else
|
|
10
12
|
generate_base_urn
|
|
@@ -13,16 +15,21 @@ module Pubid
|
|
|
13
15
|
|
|
14
16
|
protected
|
|
15
17
|
|
|
18
|
+
# urn:jcgm:meeting:<number>:<year>, e.g. urn:jcgm:meeting:17:2012
|
|
19
|
+
def generate_meeting_urn
|
|
20
|
+
parts = ["urn", "jcgm", "meeting"]
|
|
21
|
+
parts << identifier.number if identifier.number
|
|
22
|
+
parts << identifier.date.year if identifier.date
|
|
23
|
+
parts.join(":")
|
|
24
|
+
end
|
|
25
|
+
|
|
16
26
|
def generate_base_urn
|
|
17
27
|
parts = ["urn", "jcgm"]
|
|
18
28
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
number = gum_number.to_s
|
|
22
|
-
parts << "gum.#{number}"
|
|
29
|
+
if identifier.is_a?(Identifiers::GumGuide) && identifier.number
|
|
30
|
+
parts << "gum.#{identifier.number}"
|
|
23
31
|
elsif identifier.number
|
|
24
|
-
|
|
25
|
-
parts << number
|
|
32
|
+
parts << identifier.number.to_s
|
|
26
33
|
end
|
|
27
34
|
|
|
28
35
|
part = maybe(:part)
|
|
@@ -55,9 +62,11 @@ module Pubid
|
|
|
55
62
|
parts << "iter.#{iter}"
|
|
56
63
|
end
|
|
57
64
|
|
|
65
|
+
# Guide and GUM-guide are already implied by the number form (bare
|
|
66
|
+
# number vs "gum.N"), so their type_code is not appended.
|
|
58
67
|
if identifier.typed_stage
|
|
59
68
|
type_code = identifier.typed_stage.type_code
|
|
60
|
-
if type_code && type_code.to_s
|
|
69
|
+
if type_code && !%w[guide gum_guide].include?(type_code.to_s)
|
|
61
70
|
parts << type_code.to_s
|
|
62
71
|
end
|
|
63
72
|
end
|
|
@@ -73,7 +82,7 @@ module Pubid
|
|
|
73
82
|
def generate_supplement_urn
|
|
74
83
|
parts = ["urn", "jcgm"]
|
|
75
84
|
|
|
76
|
-
base_id = maybe(:
|
|
85
|
+
base_id = maybe(:base)
|
|
77
86
|
if base_id
|
|
78
87
|
base_gen = self.class.new(base_id)
|
|
79
88
|
base_urn = base_gen.generate_base_urn
|
|
@@ -88,10 +97,9 @@ module Pubid
|
|
|
88
97
|
parts << supp_type if supp_type
|
|
89
98
|
end
|
|
90
99
|
|
|
91
|
-
|
|
92
|
-
if
|
|
93
|
-
|
|
94
|
-
parts << iter
|
|
100
|
+
# The supplement's own number (the "1" in "/Cor 1") — NOT iteration.
|
|
101
|
+
if identifier.number
|
|
102
|
+
parts << identifier.number.to_s
|
|
95
103
|
end
|
|
96
104
|
|
|
97
105
|
if identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
|
|
@@ -4,19 +4,173 @@ module Pubid
|
|
|
4
4
|
module Jcgm
|
|
5
5
|
# Parses JCGM URNs back into identifiers.
|
|
6
6
|
#
|
|
7
|
-
#
|
|
7
|
+
# Identifiers are rebuilt **directly from the URN segments** rather than
|
|
8
|
+
# rendered to a human-readable string and re-parsed (the BIPM UrnParser
|
|
9
|
+
# pattern). Round-tripping through the grammar flattened the segments into
|
|
10
|
+
# one string and silently lost everything the string form could not carry:
|
|
11
|
+
# a GUM guide (`urn:jcgm:gum.6:2020`) raised, and the language and
|
|
12
|
+
# supplement segments were dropped, so a corrigendum read back as the
|
|
13
|
+
# standard it amends — a different document, with no error.
|
|
8
14
|
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
15
|
+
# Shapes emitted by UrnGenerator, and read back here:
|
|
16
|
+
# urn:jcgm:200:2008 → JCGM 200:2008
|
|
17
|
+
# urn:jcgm:100:2008:en → JCGM 100:2008(E)
|
|
18
|
+
# urn:jcgm:200:2012:en,fr → JCGM 200:2012(E/F)
|
|
19
|
+
# urn:jcgm:GUM → JCGM GUM
|
|
20
|
+
# urn:jcgm:gum.6:2020 → JCGM GUM-6:2020
|
|
21
|
+
# urn:jcgm:200:2008:corrigendum → JCGM 200:2008 Corrigendum
|
|
22
|
+
# urn:jcgm:101:2008:corrigendum:1:2009 → JCGM 101:2008/Cor 1:2009
|
|
23
|
+
# urn:jcgm:100:2008:amendment:1:2023 → JCGM 100:2008/Amd 1:2023
|
|
24
|
+
# urn:jcgm:meeting:17:2012 → JCGM 17th Meeting (2012)
|
|
25
|
+
# urn:jcgm:meeting:11 → JCGM 11st Meeting
|
|
26
|
+
#
|
|
27
|
+
# KNOWN GAP, on the generator side and unchanged here: a full date is
|
|
28
|
+
# rendered as its year alone (`JCGM GUM-1:2022-11-28` →
|
|
29
|
+
# `urn:jcgm:gum.1:2022`), so a URN cannot restore the month and day.
|
|
30
|
+
# Widening it would change already-published URNs.
|
|
12
31
|
class UrnParser < Pubid::UrnParser::Base
|
|
32
|
+
MEETING_MARKER = "meeting"
|
|
33
|
+
|
|
34
|
+
# The GUM-guide number is written "gum.<n>" by UrnGenerator.
|
|
35
|
+
GUM_PREFIX = "gum."
|
|
36
|
+
|
|
37
|
+
# The supplement marker UrnGenerator writes is the typed stage's
|
|
38
|
+
# `type_code`; the abbreviation is what `Jcgm.locate_stage` matches on.
|
|
39
|
+
SUPPLEMENT_ABBRS = {
|
|
40
|
+
"corrigendum" => "Cor",
|
|
41
|
+
"amendment" => "Amd",
|
|
42
|
+
}.freeze
|
|
43
|
+
|
|
44
|
+
MEETING_ABBR = "Meeting"
|
|
45
|
+
|
|
46
|
+
# Mirrors `year_digits` in the shared parser rules.
|
|
47
|
+
YEAR_PATTERN = /\A(?:19|20)\d{2}\z/
|
|
48
|
+
|
|
49
|
+
# A language segment is one or more comma-joined ISO codes.
|
|
50
|
+
LANGUAGES_PATTERN = /\A[a-z]{2}(?:,[a-z]{2})*\z/
|
|
51
|
+
|
|
52
|
+
# Language codes back to the single-letter form the identifier prints;
|
|
53
|
+
# the builder maps the other way when parsing "(E)" / "(E/F)".
|
|
54
|
+
LANGUAGE_LETTERS = Pubid::Builder::Base::LANG_CHAR_MAP.invert.freeze
|
|
55
|
+
|
|
13
56
|
def parse_urn(urn)
|
|
14
|
-
|
|
15
|
-
parts
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
57
|
+
parts = split_parts(strip_namespace(urn))
|
|
58
|
+
return parse_meeting_urn(parts) if parts.first == MEETING_MARKER
|
|
59
|
+
|
|
60
|
+
parse_document_urn(parts)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
# urn:jcgm:meeting:<number>[:<year>] -> Identifiers::Meeting
|
|
66
|
+
#
|
|
67
|
+
# The reconstruction must agree with a parsed identifier attribute for
|
|
68
|
+
# attribute, so `typed_stage` comes from the same registry lookup
|
|
69
|
+
# `Builder#locate_typed_stage` uses. (The attribute default now agrees
|
|
70
|
+
# too — it no longer sets `original_abbr` — so this mirrors the builder
|
|
71
|
+
# for clarity rather than out of necessity.)
|
|
72
|
+
def parse_meeting_urn(parts)
|
|
73
|
+
_, number, year = parts
|
|
74
|
+
|
|
75
|
+
Identifiers::Meeting.new(
|
|
76
|
+
number: meeting_number(number),
|
|
77
|
+
date: urn_date(year),
|
|
78
|
+
typed_stage: Jcgm.locate_stage(MEETING_ABBR),
|
|
79
|
+
)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
# A guide, a GUM guide, or a supplement wrapping one of those. The
|
|
83
|
+
# supplement marker splits the segments: everything before it describes
|
|
84
|
+
# the base document, everything after is the supplement's own number and
|
|
85
|
+
# date.
|
|
86
|
+
def parse_document_urn(parts)
|
|
87
|
+
marker_at = parts.index { |segment| SUPPLEMENT_ABBRS.key?(segment) }
|
|
88
|
+
return build_document(parts) unless marker_at
|
|
89
|
+
|
|
90
|
+
build_supplement(
|
|
91
|
+
parts[marker_at],
|
|
92
|
+
build_document(parts[0...marker_at]),
|
|
93
|
+
parts[(marker_at + 1)..] || [],
|
|
94
|
+
)
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# The class comes from the same registry the builder uses, so a URN and a
|
|
98
|
+
# parsed reference resolve to one class and one typed_stage.
|
|
99
|
+
def build_supplement(marker, base, tail)
|
|
100
|
+
typed_stage = Jcgm.locate_stage(SUPPLEMENT_ABBRS.fetch(marker))
|
|
101
|
+
number, year = tail
|
|
102
|
+
|
|
103
|
+
Jcgm.locate_type(typed_stage.type_code).new(
|
|
104
|
+
base: base,
|
|
105
|
+
number: (number.nil? || number.empty? ? nil : number.to_s),
|
|
106
|
+
date: urn_date(year),
|
|
107
|
+
typed_stage: typed_stage,
|
|
108
|
+
)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# <number>[:<year>][:<languages>] — the number segment carries the
|
|
112
|
+
# "gum." prefix for a GUM guide, which is what selects the class.
|
|
113
|
+
#
|
|
114
|
+
# Guide and GumGuide deliberately take their `typed_stage` from the
|
|
115
|
+
# attribute default: the grammar emits no type token for them, so
|
|
116
|
+
# `Builder#build` fills it from `published_typed_stage` too, and both
|
|
117
|
+
# paths agree.
|
|
118
|
+
def build_document(parts)
|
|
119
|
+
number, *rest = parts
|
|
120
|
+
require_number!(number)
|
|
121
|
+
gum = number.start_with?(GUM_PREFIX)
|
|
122
|
+
|
|
123
|
+
(gum ? Identifiers::GumGuide : Identifiers::Guide).new(
|
|
124
|
+
number: (gum ? number.delete_prefix(GUM_PREFIX) : number).to_s,
|
|
125
|
+
date: urn_date(segment_matching(rest, YEAR_PATTERN)),
|
|
126
|
+
languages: urn_languages(segment_matching(rest, LANGUAGES_PATTERN)),
|
|
127
|
+
)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def require_number!(segment)
|
|
131
|
+
return unless segment.nil? || segment.empty?
|
|
132
|
+
|
|
133
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
134
|
+
"JCGM URN has no document number"
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def segment_matching(segments, pattern)
|
|
138
|
+
segments.find { |segment| segment.match?(pattern) }
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
# The ordinal, normalized the way `Identifiers::Meeting.ordinal` does it
|
|
142
|
+
# (`number.to_i`), so "011" reads back as "11" and a missing or
|
|
143
|
+
# non-numeric segment as "0" — the behaviour of the previous
|
|
144
|
+
# render-and-re-parse implementation.
|
|
145
|
+
def meeting_number(segment)
|
|
146
|
+
segment.to_i.to_s
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# nil for an absent year; a Date for a well-formed one. The grammar
|
|
150
|
+
# accepts only a 19xx/20xx year, so anything else is a malformed URN and
|
|
151
|
+
# must still be rejected now that no re-parse validates it.
|
|
152
|
+
def urn_date(segment)
|
|
153
|
+
return nil if segment.nil? || segment.empty?
|
|
154
|
+
|
|
155
|
+
unless segment.match?(YEAR_PATTERN)
|
|
156
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
157
|
+
"Invalid year in JCGM URN: #{segment.inspect}"
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
Pubid::Components::Date.new(year: segment)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# "en" -> (E), "en,fr" -> (E/F). `original_code` is what the renderer
|
|
164
|
+
# prints, so it is restored from the code rather than left nil.
|
|
165
|
+
def urn_languages(segment)
|
|
166
|
+
return nil if segment.nil? || segment.empty?
|
|
167
|
+
|
|
168
|
+
segment.split(",").map do |code|
|
|
169
|
+
Pubid::Components::Language.new(
|
|
170
|
+
code: code,
|
|
171
|
+
original_code: LANGUAGE_LETTERS.fetch(code, code),
|
|
172
|
+
)
|
|
173
|
+
end
|
|
20
174
|
end
|
|
21
175
|
end
|
|
22
176
|
end
|
data/lib/pubid/jcgm.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module Jcgm
|
|
5
6
|
extend Pubid::PrefixesSupport
|
|
@@ -22,6 +23,15 @@ module Pubid
|
|
|
22
23
|
# @param identifier [String] the identifier string to parse
|
|
23
24
|
# @return [Identifier] the parsed identifier
|
|
24
25
|
def self.parse(identifier)
|
|
26
|
+
unless identifier.is_a?(String)
|
|
27
|
+
raise Pubid::Errors::InvalidInputError,
|
|
28
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
32
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
33
|
+
end
|
|
34
|
+
|
|
25
35
|
parser = Parser.new
|
|
26
36
|
builder = Builder.new
|
|
27
37
|
|
data/lib/pubid/jis/identifier.rb
CHANGED
|
@@ -117,18 +117,77 @@ module Pubid
|
|
|
117
117
|
render(format: :human, **opts)
|
|
118
118
|
end
|
|
119
119
|
|
|
120
|
+
# JIS exposes its publisher as the `PUBLISHER` constant rather than the
|
|
121
|
+
# inherited `publisher` attribute, so the generic mr_publisher returns
|
|
122
|
+
# nil. Without this override every JIS id would lose its "JIS." prefix.
|
|
123
|
+
# Lowercased to match the all-lowercase MR convention.
|
|
124
|
+
def mr_publisher
|
|
125
|
+
PUBLISHER.downcase
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# JIS stores its identity across `series` (division letter A–Z), `number`
|
|
129
|
+
# (string, may have leading zeros), and `parts` (multi-level). The
|
|
130
|
+
# generic mr_number_with_part only knows about `number`/`part`/`subpart`,
|
|
131
|
+
# so without these overrides every JIS id would collapse onto its
|
|
132
|
+
# document number and drop the division letter (issue #142).
|
|
133
|
+
# Lowercased to match the all-lowercase MR convention.
|
|
134
|
+
def mr_type
|
|
135
|
+
return nil unless respond_to?(:type_prefix)
|
|
136
|
+
|
|
137
|
+
type_prefix&.downcase
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def mr_number_with_part
|
|
141
|
+
segments = []
|
|
142
|
+
segments << series.to_s.downcase if series
|
|
143
|
+
segments << number.to_s if number
|
|
144
|
+
parts&.each { |p| segments << p.to_s }
|
|
145
|
+
return nil if segments.empty?
|
|
146
|
+
|
|
147
|
+
segments.join("-")
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
# JIS stores the year as a bare integer (not a Components::Date), so the
|
|
151
|
+
# inherited mr_year (which reads `date`) returns nil. Emit it directly,
|
|
152
|
+
# including the reaffirmation marker so `JIS X:2019` and `JIS X:2019R`
|
|
153
|
+
# stay distinct in MR.
|
|
154
|
+
def mr_year
|
|
155
|
+
return nil unless year
|
|
156
|
+
|
|
157
|
+
year_with_reaffirmation.to_s
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
def mr_languages
|
|
161
|
+
return nil unless language
|
|
162
|
+
|
|
163
|
+
"(#{language})"
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def mr_all_parts
|
|
167
|
+
return nil unless all_parts?
|
|
168
|
+
|
|
169
|
+
"all-parts"
|
|
170
|
+
end
|
|
171
|
+
|
|
120
172
|
# from_hash is the shared polymorphic dispatch on Pubid::Identifier.
|
|
121
173
|
# JIS_TYPE_MAP remains as the key_value polymorphic_map.
|
|
122
174
|
|
|
123
175
|
# Parse a JIS identifier string into an identifier object
|
|
124
176
|
# @param identifier [String] The JIS identifier string to parse
|
|
125
177
|
# @return [Identifier] The appropriate identifier object
|
|
126
|
-
# @raise [
|
|
178
|
+
# @raise [Pubid::Errors::ParseError] If parsing fails
|
|
127
179
|
def self.parse(identifier)
|
|
180
|
+
unless identifier.is_a?(String)
|
|
181
|
+
raise Pubid::Errors::InvalidInputError,
|
|
182
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
186
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
187
|
+
end
|
|
188
|
+
|
|
128
189
|
parsed = Parser.parse(identifier)
|
|
129
190
|
Builder.build(parsed)
|
|
130
|
-
rescue Parslet::ParseFailed => e
|
|
131
|
-
raise "Failed to parse JIS identifier '#{identifier}': #{e.message}"
|
|
132
191
|
end
|
|
133
192
|
end
|
|
134
193
|
end
|
data/lib/pubid/jis/parser.rb
CHANGED
data/lib/pubid/jis.rb
CHANGED
data/lib/pubid/nist/builder.rb
CHANGED
|
@@ -22,7 +22,7 @@ module Pubid
|
|
|
22
22
|
|
|
23
23
|
# Build an identifier object from parsed data
|
|
24
24
|
# @param parsed [Hash, Array] the parsed identifier data
|
|
25
|
-
# @return [
|
|
25
|
+
# @return [Identifier] the constructed identifier object
|
|
26
26
|
def build(parsed)
|
|
27
27
|
# Parslet can return array of hashes - merge them
|
|
28
28
|
parsed_hash = parsed.is_a?(Array) ? flatten_array(parsed) : parsed
|
|
@@ -287,8 +287,6 @@ module Pubid
|
|
|
287
287
|
|
|
288
288
|
identifier.number = Components::Code.new(value: "#{first_num.value}-#{number_part}")
|
|
289
289
|
identifier.edition = edition_obj
|
|
290
|
-
identifier.edition_component = edition_obj
|
|
291
|
-
identifier.revision = "r#{edition_id}"
|
|
292
290
|
# CS Emergency pattern: e104-43 -> number=104, edition_year=1943
|
|
293
291
|
# Logic: e104-43 means "emergency 104 from 1943" (43 = 1943)
|
|
294
292
|
elsif first_num.value.to_s.match?(/^e(\d{3})$/) &&
|
|
@@ -304,7 +302,6 @@ module Pubid
|
|
|
304
302
|
|
|
305
303
|
identifier.number = Components::Code.new(value: number_part)
|
|
306
304
|
identifier.edition = edition_obj
|
|
307
|
-
identifier.edition_component = edition_obj
|
|
308
305
|
elsif first_num.value.to_s.match?(/^(\d+)e(\d+)$/) &&
|
|
309
306
|
second_num.value.to_s.match?(/^\d{2,4}$/)
|
|
310
307
|
# Pattern: "11e2-1915" OR "123e2-50" parsed as first="11e2"|"123e2", second="1915"|"50"
|
|
@@ -326,7 +323,6 @@ module Pubid
|
|
|
326
323
|
edition_obj = Components::Edition.new(type: "e",
|
|
327
324
|
id: edition_id, additional_text: year_part)
|
|
328
325
|
identifier.edition = edition_obj
|
|
329
|
-
identifier.edition_component = edition_obj
|
|
330
326
|
elsif first_num.value.to_s.match?(/^(\d+)supp?$/) &&
|
|
331
327
|
second_num.value.to_s.match?(/^\d{4}$/)
|
|
332
328
|
# Pattern: "25supp-1924" parsed as first="25supp", second="1924"
|
|
@@ -351,7 +347,6 @@ module Pubid
|
|
|
351
347
|
identifier.number = first_num
|
|
352
348
|
edition_obj = Components::Edition.new(type: "e",
|
|
353
349
|
id: second_num.value.to_s)
|
|
354
|
-
identifier.edition_component = edition_obj
|
|
355
350
|
identifier.edition = edition_obj
|
|
356
351
|
identifier.edition_year = second_num.value.to_s
|
|
357
352
|
elsif part_num && series.part_num_as_component?
|
|
@@ -379,11 +374,34 @@ module Pubid
|
|
|
379
374
|
id: extracted_revision.to_s)
|
|
380
375
|
end
|
|
381
376
|
|
|
377
|
+
# Expose the SP subseries (Appendix A.2 of the NIST PubID Syntax) as
|
|
378
|
+
# a queryable attribute. For "NIST SP 800-53" the subseries is "800"
|
|
379
|
+
# (first_num) and the sequence is "53" (already folded into number).
|
|
380
|
+
# Pure metadata extraction — number is left intact so existing
|
|
381
|
+
# rendering and indexing stay byte-identical.
|
|
382
|
+
if identifier.is_a?(Identifiers::SpecialPublication) &&
|
|
383
|
+
first_num && identifier.respond_to?(:subseries=)
|
|
384
|
+
first_str = first_num.value.to_s
|
|
385
|
+
subseries_code =
|
|
386
|
+
if Identifiers::SpecialPublication::SP_SUBSERIES.include?(first_str)
|
|
387
|
+
first_str
|
|
388
|
+
elsif (m = first_str.match(/\A(\d+GB)\b/)) &&
|
|
389
|
+
Identifiers::SpecialPublication::SP_SUBSERIES.include?(m[1])
|
|
390
|
+
# Parser emits "1190GB-12" as a single first_number token; strip
|
|
391
|
+
# the suffix to surface the bare "1190GB" subseries code.
|
|
392
|
+
m[1]
|
|
393
|
+
end
|
|
394
|
+
if subseries_code
|
|
395
|
+
identifier.subseries =
|
|
396
|
+
Components::Code.new(value: subseries_code)
|
|
397
|
+
end
|
|
398
|
+
end
|
|
399
|
+
|
|
382
400
|
# Series-specific post-processing (e.g., IR reverses the "84e2946"
|
|
383
401
|
# form that preprocessing produced back to "84-2946").
|
|
384
402
|
series.finalize_identifier(identifier, parsed_hash)
|
|
385
403
|
|
|
386
|
-
# publisher_was_parsed defaults to true (see
|
|
404
|
+
# publisher_was_parsed defaults to true (see Identifier), so only
|
|
387
405
|
# the prefix-less case needs recording: assign false when no publisher
|
|
388
406
|
# was parsed/extracted, and leave it unset (default true, omitted from
|
|
389
407
|
# to_hash) when one was. Keeps the common publisher-bearing id lean.
|
|
@@ -437,11 +455,13 @@ module Pubid
|
|
|
437
455
|
component = Components::Supplement.new
|
|
438
456
|
# Split the fused "Jun1925"/"Jun1926" strings into isolated start/end
|
|
439
457
|
# month+year nodes (start reuses :month/:year, end uses *_end).
|
|
440
|
-
|
|
458
|
+
# Each end is either a fused "Jun1925" (month+year) or a bare "1925"
|
|
459
|
+
# (year-only range, no month).
|
|
460
|
+
if range_start && (m = range_start.match(/\A([A-Za-z]{3,9})?(\d{4})\z/))
|
|
441
461
|
component.month = m[1]
|
|
442
462
|
component.year = m[2]
|
|
443
463
|
end
|
|
444
|
-
if range_end && (m = range_end.match(/\A([A-Za-z]{3,9})(\d{4})\z/))
|
|
464
|
+
if range_end && (m = range_end.match(/\A([A-Za-z]{3,9})?(\d{4})\z/))
|
|
445
465
|
component.month_end = m[1]
|
|
446
466
|
component.year_end = m[2]
|
|
447
467
|
end
|