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
|
@@ -35,11 +35,11 @@ module Pubid
|
|
|
35
35
|
|
|
36
36
|
# Delegate base identifier attributes for easier access
|
|
37
37
|
def copublishers
|
|
38
|
-
|
|
38
|
+
base&.copublishers
|
|
39
39
|
end
|
|
40
40
|
|
|
41
41
|
def publisher
|
|
42
|
-
|
|
42
|
+
base&.publisher
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
TYPED_STAGES = [
|
|
@@ -61,19 +61,19 @@ module Pubid
|
|
|
61
61
|
# def render_directives_supplement_identifier(identifier)
|
|
62
62
|
# raise "Not a directives supplement identifier" unless identifier.is_a?(Identifiers::DirectivesSupplement)
|
|
63
63
|
|
|
64
|
-
# render(identifier.
|
|
64
|
+
# render(identifier.base) +
|
|
65
65
|
# " #{identifier.publisher.body}" +
|
|
66
66
|
# " #{identifier.stage.abbr}" +
|
|
67
67
|
# (identifier.date ? ":#{identifier.date.year}" : "")
|
|
68
68
|
# end
|
|
69
69
|
|
|
70
70
|
def to_s(lang: :en, lang_single: false, with_edition: false,
|
|
71
|
-
format: nil, stage_format_long: nil, with_date: nil)
|
|
72
|
-
if
|
|
71
|
+
format: nil, stage_format_long: nil, with_date: nil, **opts)
|
|
72
|
+
if base
|
|
73
73
|
# Full rendering with base identifier
|
|
74
74
|
[
|
|
75
|
-
|
|
76
|
-
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date),
|
|
75
|
+
base.to_s(lang: lang, lang_single: lang_single,
|
|
76
|
+
with_edition: with_edition, format: format, stage_format_long: stage_format_long, with_date: with_date, **opts),
|
|
77
77
|
" #{supplement_publisher.render}",
|
|
78
78
|
" SUP", # Always render as "SUP" even though typed_stage.abbreviation is "DIR SUP"
|
|
79
79
|
(date ? ":#{date.render}" : ""),
|
|
@@ -81,13 +81,13 @@ format: nil, stage_format_long: nil, with_date: nil)
|
|
|
81
81
|
].join
|
|
82
82
|
else
|
|
83
83
|
# Simplified rendering for bundled identifiers (just the supplement part)
|
|
84
|
-
to_supplement_s(lang: lang, lang_single: lang_single)
|
|
84
|
+
to_supplement_s(lang: lang, lang_single: lang_single, **opts)
|
|
85
85
|
end
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
# Render just the supplement part (for use in bundled identifiers)
|
|
89
89
|
def to_supplement_s(lang: :en, lang_single: false, with_edition: false,
|
|
90
|
-
format: nil, stage_format_long: nil, with_date: nil)
|
|
90
|
+
format: nil, stage_format_long: nil, with_date: nil, **_opts)
|
|
91
91
|
date_str = if date
|
|
92
92
|
month_part = date.month ? "-#{date.month}" : ""
|
|
93
93
|
":#{date.render}#{month_part}"
|
|
@@ -107,8 +107,8 @@ format: nil, stage_format_long: nil, with_date: nil)
|
|
|
107
107
|
def to_urn
|
|
108
108
|
urn_ctx = Rendering::RenderingContext.urn
|
|
109
109
|
|
|
110
|
-
# If this is a standalone supplement (no
|
|
111
|
-
unless
|
|
110
|
+
# If this is a standalone supplement (no base), build URN directly
|
|
111
|
+
unless base
|
|
112
112
|
parts = ["urn", "iso", "doc"]
|
|
113
113
|
parts << supplement_publisher.render(context: urn_ctx) if supplement_publisher
|
|
114
114
|
parts << "sup"
|
|
@@ -118,7 +118,7 @@ format: nil, stage_format_long: nil, with_date: nil)
|
|
|
118
118
|
end
|
|
119
119
|
|
|
120
120
|
# Start with base identifier's URN parts (it will use urn:iso:doc scheme)
|
|
121
|
-
base_urn =
|
|
121
|
+
base_urn = base.to_urn
|
|
122
122
|
|
|
123
123
|
# Handle JTC pattern specially
|
|
124
124
|
if supplement_publisher&.body&.match?(/^JTC\s+(\d+)$/i)
|
data/lib/pubid/iso/normalizer.rb
CHANGED
|
@@ -69,10 +69,10 @@ module Pubid
|
|
|
69
69
|
supplement_year = match[4] # "1987" or nil
|
|
70
70
|
|
|
71
71
|
base_parsed = Pubid::Iso.parser.parse(base_str)
|
|
72
|
-
|
|
72
|
+
base = Pubid::Iso.builder.build(base_parsed)
|
|
73
73
|
|
|
74
74
|
addendum = Identifiers::Addendum.new
|
|
75
|
-
addendum.
|
|
75
|
+
addendum.base = base
|
|
76
76
|
addendum.number = Iso::Components::Code.new(value: supplement_number)
|
|
77
77
|
addendum.date = Pubid::Components::Date.new(year: supplement_year) if supplement_year
|
|
78
78
|
|
data/lib/pubid/iso/parser.rb
CHANGED
|
@@ -3,7 +3,7 @@ require "parslet"
|
|
|
3
3
|
|
|
4
4
|
module Pubid
|
|
5
5
|
module Iso
|
|
6
|
-
class Parser <
|
|
6
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
7
7
|
include ::Pubid::Parser::CommonParseRules
|
|
8
8
|
include ::Pubid::Parser::CommonParseMethods
|
|
9
9
|
|
|
@@ -99,7 +99,7 @@ module Pubid
|
|
|
99
99
|
rule(:iso_r_supplement_identifier) do
|
|
100
100
|
(
|
|
101
101
|
str("ISO/R").as(:iso_r_prefix) >> space >> iso_r_second_part
|
|
102
|
-
).as(:
|
|
102
|
+
).as(:base) >>
|
|
103
103
|
iso_r_supplement_separator >>
|
|
104
104
|
supplement_type_with_stage >>
|
|
105
105
|
space? >> second_part >> third_part
|
|
@@ -148,12 +148,16 @@ module Pubid
|
|
|
148
148
|
end
|
|
149
149
|
|
|
150
150
|
rule(:date) do
|
|
151
|
-
# :2005-02
|
|
151
|
+
# :2005-02 or :-- (undated reference — ISO/IEC undated-reference form,
|
|
152
|
+
# e.g. ISO 16634:--, also accepted as the em-dash variant ISO 16634:—)
|
|
152
153
|
(str(":") | dash) >>
|
|
153
|
-
(
|
|
154
|
-
(
|
|
155
|
-
|
|
156
|
-
|
|
154
|
+
(
|
|
155
|
+
(str("--") | str("—")).as(:undated_marker) |
|
|
156
|
+
(year_digits >>
|
|
157
|
+
(dash >> month_digits).maybe >>
|
|
158
|
+
(dash >> day_digits).maybe
|
|
159
|
+
).as(:date)
|
|
160
|
+
).maybe
|
|
157
161
|
end
|
|
158
162
|
|
|
159
163
|
rule(:part_and_subpart) do
|
|
@@ -270,14 +274,14 @@ module Pubid
|
|
|
270
274
|
end
|
|
271
275
|
|
|
272
276
|
# For joint identifiers, we do not treat it as a supplementary identifier
|
|
273
|
-
# (hence not a
|
|
277
|
+
# (hence not a base)
|
|
274
278
|
# ISO only supports IDF in joint identifiers
|
|
275
279
|
# ISO 5537|IDF 26
|
|
276
280
|
# ISO 17678|IDF 202:2010
|
|
277
281
|
# ISO/TS 4985:2023 | IDF/RM 255
|
|
278
282
|
# ISO 4214:2022 | IDF 254:2022
|
|
279
283
|
rule(:joint_identifier) do
|
|
280
|
-
identifier_copublishers_no_third.as(:
|
|
284
|
+
identifier_copublishers_no_third.as(:base) >>
|
|
281
285
|
space? >> str("|") >> space? >>
|
|
282
286
|
scope { idf_identifier }.as(:joint_identifier)
|
|
283
287
|
end
|
|
@@ -336,7 +340,7 @@ module Pubid
|
|
|
336
340
|
# ISO 8601-1:2019/Amd 2:2024
|
|
337
341
|
# ISO/IEC 10646-1:1993/pDCOR.2 (legacy dot-prefixed format)
|
|
338
342
|
rule(:supplement_identifier_no_third) do
|
|
339
|
-
identifier_copublishers_no_third.as(:
|
|
343
|
+
identifier_copublishers_no_third.as(:base) >>
|
|
340
344
|
str("/") >> supplement_type_with_stage >>
|
|
341
345
|
# The trailing number/date is optional: some draft supplements have no
|
|
342
346
|
# number yet, e.g. "ISO/IEC 9579/WD Amd".
|
|
@@ -351,14 +355,14 @@ module Pubid
|
|
|
351
355
|
# ISO/IEC 19794-7:2014/Amd 1:2015/CD Cor 1
|
|
352
356
|
# ISO/IEC 10646-1:1993/pDCOR.2 (legacy dot-prefixed format)
|
|
353
357
|
rule(:supplement_supplement_identifier) do
|
|
354
|
-
supplement_identifier_no_third.as(:
|
|
358
|
+
supplement_identifier_no_third.as(:base) >>
|
|
355
359
|
str("/") >> supplement_type_with_stage >>
|
|
356
360
|
((space? >> second_part >> third_part) | (str(".") >> digits.as(:number) >> third_part))
|
|
357
361
|
end
|
|
358
362
|
|
|
359
363
|
# ISO 12345:2020/Amd 1:2021/Cor 1:2022/Amd 2:2023 (three-level supplement)
|
|
360
364
|
rule(:supplement_supplement_supplement_identifier) do
|
|
361
|
-
supplement_supplement_identifier.as(:
|
|
365
|
+
supplement_supplement_identifier.as(:base) >>
|
|
362
366
|
str("/") >> supplement_type_with_stage >>
|
|
363
367
|
((space? >> second_part >> third_part) | (str(".") >> digits.as(:number) >> third_part))
|
|
364
368
|
end
|
|
@@ -408,7 +412,7 @@ module Pubid
|
|
|
408
412
|
end
|
|
409
413
|
|
|
410
414
|
rule(:directives_supplement_identifier) do
|
|
411
|
-
directives_identifier_no_third.as(:
|
|
415
|
+
directives_identifier_no_third.as(:base) >> space? >> directives_supplement_part
|
|
412
416
|
end
|
|
413
417
|
|
|
414
418
|
DIRECTIVES_SUPPLEMENTS_TYPED_STAGES = Identifiers::DirectivesSupplement::TYPED_STAGES.map(&:abbr).flatten.sort_by(&:length).reverse
|
|
@@ -3,13 +3,13 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Iso
|
|
5
5
|
class SupplementIdentifier < SingleIdentifier
|
|
6
|
-
attribute :
|
|
6
|
+
attribute :base, Identifier,
|
|
7
7
|
polymorphic: true
|
|
8
8
|
|
|
9
9
|
key_value do
|
|
10
10
|
# Serialized key is "base" (matches JIS); the attribute/method stays
|
|
11
|
-
# `
|
|
12
|
-
map "base", to: :
|
|
11
|
+
# `base`, which relaton-index's get_id_number depends on.
|
|
12
|
+
map "base", to: :base, polymorphic: {
|
|
13
13
|
attribute: "_type",
|
|
14
14
|
class_map: Identifier::ISO_TYPE_MAP,
|
|
15
15
|
}
|
|
@@ -20,14 +20,14 @@ module Pubid
|
|
|
20
20
|
# nested supplement (e.g. ".../Amd 1/Cor 1") reads identity from the
|
|
21
21
|
# underlying standard in one hop, regardless of chain depth. This keeps a
|
|
22
22
|
# parsed supplement and a from_hash-deserialized one in agreement (== and
|
|
23
|
-
# index matching compare both). Guard on
|
|
23
|
+
# index matching compare both). Guard on base: `root` returns
|
|
24
24
|
# self when there is no base, which would otherwise recurse forever.
|
|
25
25
|
def publisher
|
|
26
|
-
root.publisher if
|
|
26
|
+
root.publisher if base
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def copublishers
|
|
30
|
-
root.copublishers if
|
|
30
|
+
root.copublishers if base
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def to_s(**opts)
|
|
@@ -35,6 +35,19 @@ module Pubid
|
|
|
35
35
|
Pubid::Renderers::SupplementRenderer.new(self).render(context:,
|
|
36
36
|
**opts.slice(:with_edition))
|
|
37
37
|
end
|
|
38
|
+
|
|
39
|
+
# MR supplement suffix: `/{type}.{number}.{year}` (e.g. "/amd.1.2020").
|
|
40
|
+
# The MrString renderer recurses into `base` and appends this so the
|
|
41
|
+
# full supplement chain round-trips losslessly (issue #142).
|
|
42
|
+
def mr_supplement_suffix
|
|
43
|
+
segments = []
|
|
44
|
+
segments << mr_type if mr_type
|
|
45
|
+
segments << number&.to_s if number
|
|
46
|
+
segments << date&.year&.to_s if date&.year
|
|
47
|
+
return nil if segments.empty?
|
|
48
|
+
|
|
49
|
+
segments.join(".")
|
|
50
|
+
end
|
|
38
51
|
end
|
|
39
52
|
end
|
|
40
53
|
end
|
|
@@ -84,7 +84,7 @@ module Pubid
|
|
|
84
84
|
|
|
85
85
|
while current.is_a?(SupplementIdentifier)
|
|
86
86
|
supplement_chain.unshift(current)
|
|
87
|
-
current = current.
|
|
87
|
+
current = current.base
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
base_id = current
|
|
@@ -258,6 +258,9 @@ module Pubid
|
|
|
258
258
|
|
|
259
259
|
def year_component
|
|
260
260
|
return nil unless identifier.date&.present?
|
|
261
|
+
# Undated references (e.g. ISO 16634:--) drop the year slot in the URN,
|
|
262
|
+
# matching the date-less identifier's URN form (per issue #138).
|
|
263
|
+
return nil if identifier.date&.undated?
|
|
261
264
|
return nil if identifier.is_a?(Pubid::Iso::SingleIdentifier)
|
|
262
265
|
|
|
263
266
|
identifier.date.render(context: URN_CONTEXT)
|
data/lib/pubid/iso/urn_parser.rb
CHANGED
data/lib/pubid/iso.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
require "lutaml/model"
|
|
4
5
|
|
|
5
6
|
module Pubid
|
|
@@ -31,8 +32,13 @@ module Pubid
|
|
|
31
32
|
# @param format [Symbol] :auto, :human, :mr_string, or :urn
|
|
32
33
|
# @return [Identifier] the parsed identifier
|
|
33
34
|
def self.parse(identifier, format: :auto)
|
|
35
|
+
unless identifier.is_a?(String)
|
|
36
|
+
raise Pubid::Errors::InvalidInputError,
|
|
37
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
38
|
+
end
|
|
39
|
+
|
|
34
40
|
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
35
|
-
raise
|
|
41
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
36
42
|
end
|
|
37
43
|
|
|
38
44
|
format = Pubid::FormatDetector.detect(identifier) if format == :auto
|
data/lib/pubid/itu/builder.rb
CHANGED
|
@@ -13,15 +13,59 @@ module Pubid
|
|
|
13
13
|
return build_annex(data[:annex_to])
|
|
14
14
|
end
|
|
15
15
|
|
|
16
|
+
# Common-text twin ("| ISO/IEC ..." suffix) — extract before building
|
|
17
|
+
# the base ITU identifier, then attach to whichever class the base
|
|
18
|
+
# resolves to.
|
|
19
|
+
twin = parse_common_text_twin(data.delete(:common_text_twin))
|
|
20
|
+
|
|
21
|
+
# Labelled annex of a Recommendation — "ITU-T A.23 Annex A (06/2014)".
|
|
22
|
+
# The annexed document is the :base subtree; :year/:month at this level
|
|
23
|
+
# are the annex's own date, not the base's.
|
|
24
|
+
if data[:annex_number]
|
|
25
|
+
annex = build_annex_of_recommendation(data)
|
|
26
|
+
annex.common_text_twin = twin if twin
|
|
27
|
+
return annex
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Labelled appendix of a Recommendation — "ITU-T G.101 App. I
|
|
31
|
+
# (05/2000)". Same shape as the annex above.
|
|
32
|
+
if data[:appendix_number]
|
|
33
|
+
appendix = build_appendix_of_recommendation(data)
|
|
34
|
+
appendix.common_text_twin = twin if twin
|
|
35
|
+
return appendix
|
|
36
|
+
end
|
|
37
|
+
|
|
16
38
|
# Operational Bulletin (Special Publication) — series == "OB" or
|
|
17
39
|
# legacy long form ("Operational Bulletin No. ...").
|
|
18
|
-
|
|
19
|
-
|
|
40
|
+
# The series_dash guard keeps a series-code "ITU-T OB-1" out of this
|
|
41
|
+
# branch, which would drop the dash and render it "ITU OB No. 1".
|
|
42
|
+
# Belt-and-braces: `series_code_body` already refuses "OB" + dash, so
|
|
43
|
+
# nothing reaches here with both set — the guard documents that coupling
|
|
44
|
+
# so removing the parser's `absent?` fails loudly rather than silently
|
|
45
|
+
# rerouting.
|
|
46
|
+
if (data[:series].to_s == "OB" && data[:series_dash].nil?) ||
|
|
47
|
+
data[:_op_bull]
|
|
48
|
+
sp = build_special_publication(data)
|
|
49
|
+
sp.common_text_twin = twin if twin && sp
|
|
50
|
+
return sp
|
|
20
51
|
end
|
|
21
52
|
|
|
22
53
|
# Check if this is a supplement identifier
|
|
23
54
|
if data[:supplement_type]
|
|
24
|
-
|
|
55
|
+
supp = build_supplement(data)
|
|
56
|
+
supp.common_text_twin = twin if twin && supp
|
|
57
|
+
return supp
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Handbook — "ITU-R 42.HDB"
|
|
61
|
+
if data[:handbook_marker]
|
|
62
|
+
return build_handbook(data)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Question — numeric ("ITU-R 234-1/7:") or letter-series
|
|
66
|
+
# ("ITU-R P.3/BL/7"). Both carry a :study_group marker.
|
|
67
|
+
if data[:study_group]
|
|
68
|
+
return build_question(data)
|
|
25
69
|
end
|
|
26
70
|
|
|
27
71
|
# Build basic recommendation or combined identifier
|
|
@@ -30,44 +74,77 @@ module Pubid
|
|
|
30
74
|
code = build_code(data) if data[:number]
|
|
31
75
|
date = build_date(data) if data[:year]
|
|
32
76
|
|
|
33
|
-
#
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
series: data[:combined_series][:series].to_s,
|
|
38
|
-
)
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
if data[:combined_number]
|
|
42
|
-
combined_code = Components::Code.new(
|
|
43
|
-
number: data[:combined_number].to_s,
|
|
44
|
-
subseries: data[:combined_subseries]&.to_s,
|
|
45
|
-
parts: extract_parts(data[:combined_parts]),
|
|
46
|
-
)
|
|
47
|
-
end
|
|
48
|
-
|
|
77
|
+
# Combined (joint) recommendation — one or more additional
|
|
78
|
+
# "/SERIES.CODE" designations after the primary (e.g. "G.780/Y.1351",
|
|
79
|
+
# "G.780/Y.1351/Z.1362"). The primary stays on the base series/code.
|
|
80
|
+
if data[:combined]
|
|
49
81
|
return Identifiers::CombinedIdentifier.new(
|
|
50
82
|
sector: sector,
|
|
51
83
|
series: series,
|
|
52
84
|
code: code,
|
|
53
|
-
|
|
54
|
-
combined_code: combined_code,
|
|
85
|
+
combined: build_designations(data[:combined]),
|
|
55
86
|
date: date,
|
|
87
|
+
version: data[:version]&.to_s,
|
|
88
|
+
# with_series offers these slots on either side of
|
|
89
|
+
# combined_suffixes, so a joint id can carry them too; not
|
|
90
|
+
# forwarding them let "ITU-T H.350/X.1 attachment" compare equal to
|
|
91
|
+
# the un-attached document.
|
|
92
|
+
series_word: !data[:series_word].nil?,
|
|
93
|
+
series_dash: !data[:series_dash].nil?,
|
|
94
|
+
attachment: !data[:attachment].nil?,
|
|
95
|
+
range_end: data[:range_end]&.to_s,
|
|
56
96
|
language: data[:language]&.to_s,
|
|
97
|
+
common_text_twin: twin,
|
|
57
98
|
)
|
|
58
99
|
end
|
|
59
100
|
|
|
60
|
-
|
|
101
|
+
# A Report ("Report ITU-R BT.2020-1") is shaped exactly like a
|
|
102
|
+
# Recommendation — only the leading word, captured as :report_marker,
|
|
103
|
+
# tells the two apart, and it has to, because the two series number
|
|
104
|
+
# independently and the same series/number is two real documents.
|
|
105
|
+
klass = data[:report_marker] ? Identifiers::Report : Identifiers::Recommendation
|
|
106
|
+
|
|
107
|
+
klass.new(
|
|
61
108
|
sector: sector,
|
|
62
109
|
series: series,
|
|
63
110
|
code: code,
|
|
64
111
|
date: date,
|
|
112
|
+
version: data[:version]&.to_s,
|
|
113
|
+
series_word: !data[:series_word].nil?,
|
|
114
|
+
series_dash: !data[:series_dash].nil?,
|
|
115
|
+
attachment: !data[:attachment].nil?,
|
|
116
|
+
range_end: data[:range_end]&.to_s,
|
|
65
117
|
language: data[:language]&.to_s,
|
|
118
|
+
common_text_twin: twin,
|
|
66
119
|
)
|
|
67
120
|
end
|
|
68
121
|
|
|
122
|
+
# Parse the common-text twin string ("| ISO/IEC 13818-1:2022") into
|
|
123
|
+
# the appropriate flavor's identifier object. Returns nil if the twin
|
|
124
|
+
# is empty or unparseable.
|
|
125
|
+
def parse_common_text_twin(twin_raw)
|
|
126
|
+
return nil if twin_raw.nil?
|
|
127
|
+
|
|
128
|
+
twin_str = twin_raw.to_s.strip
|
|
129
|
+
# Strip a leading pipe if the parser captured it
|
|
130
|
+
twin_str = twin_str.sub(/\A\s*\|\s*/, "")
|
|
131
|
+
return nil if twin_str.empty?
|
|
132
|
+
|
|
133
|
+
case twin_str
|
|
134
|
+
when /\AISO\/IEC\b/, /\AISO\b/
|
|
135
|
+
Pubid::Iso.parse(twin_str)
|
|
136
|
+
when /\AIEC\b/
|
|
137
|
+
Pubid::Iec.parse(twin_str)
|
|
138
|
+
end
|
|
139
|
+
rescue StandardError
|
|
140
|
+
# If the twin doesn't parse as a known flavor, leave it as nil
|
|
141
|
+
# rather than blowing up the whole parse — the ITU half is still
|
|
142
|
+
# usable on its own.
|
|
143
|
+
nil
|
|
144
|
+
end
|
|
145
|
+
|
|
69
146
|
# Build Special Publication (OB). Sector is silently dropped — OB is a
|
|
70
|
-
# cross-bureau publication and `
|
|
147
|
+
# cross-bureau publication and `Identifier` rejects sector+OB
|
|
71
148
|
# in its constructor.
|
|
72
149
|
def build_special_publication(data)
|
|
73
150
|
Identifiers::SpecialPublication.new(
|
|
@@ -88,6 +165,59 @@ module Pubid
|
|
|
88
165
|
)
|
|
89
166
|
end
|
|
90
167
|
|
|
168
|
+
# Build a labelled annex of a Recommendation. sector/series/code are
|
|
169
|
+
# deliberately NOT copied from the base: they are not serialized on the
|
|
170
|
+
# wrapper, so copies would make a from_hash-rebuilt annex differ from the
|
|
171
|
+
# parsed one.
|
|
172
|
+
def build_annex_of_recommendation(data)
|
|
173
|
+
Identifiers::AnnexOfRecommendation.new(
|
|
174
|
+
base: build(data[:base]),
|
|
175
|
+
number: data[:annex_number].to_s,
|
|
176
|
+
date: data[:year] ? build_date(data) : nil,
|
|
177
|
+
language: data[:language]&.to_s,
|
|
178
|
+
)
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
# Build a labelled appendix of a Recommendation. Like the annex above,
|
|
182
|
+
# sector/series/code are deliberately NOT copied from the base — they are
|
|
183
|
+
# not serialized on the wrapper, so copies would make a from_hash-rebuilt
|
|
184
|
+
# appendix differ from the parsed one.
|
|
185
|
+
def build_appendix_of_recommendation(data)
|
|
186
|
+
Identifiers::AppendixOfRecommendation.new(
|
|
187
|
+
base: build(data[:base]),
|
|
188
|
+
number: data[:appendix_number].to_s,
|
|
189
|
+
material: data[:appendix_material]&.to_s,
|
|
190
|
+
date: data[:year] ? build_date(data) : nil,
|
|
191
|
+
language: data[:language]&.to_s,
|
|
192
|
+
)
|
|
193
|
+
end
|
|
194
|
+
|
|
195
|
+
# Build Handbook ("ITU-R 42.HDB").
|
|
196
|
+
def build_handbook(data)
|
|
197
|
+
Identifiers::Handbook.new(
|
|
198
|
+
sector: Components::Sector.new(sector: data[:sector].to_s),
|
|
199
|
+
code: build_code(data),
|
|
200
|
+
date: data[:year] ? build_date(data) : nil,
|
|
201
|
+
)
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
# Build Question (numeric or letter-series).
|
|
205
|
+
def build_question(data)
|
|
206
|
+
series = if data[:series]
|
|
207
|
+
Components::Series.new(series: data[:series].to_s)
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
Identifiers::Question.new(
|
|
211
|
+
sector: Components::Sector.new(sector: data[:sector].to_s),
|
|
212
|
+
series: series,
|
|
213
|
+
code: build_code(data),
|
|
214
|
+
study_group: data[:study_group].to_s,
|
|
215
|
+
has_bl: !data[:has_bl].nil?,
|
|
216
|
+
bracketed: !data[:bracketed].nil?,
|
|
217
|
+
has_colon: !data[:question_colon].nil?,
|
|
218
|
+
)
|
|
219
|
+
end
|
|
220
|
+
|
|
91
221
|
def build_supplement(data)
|
|
92
222
|
# Build the base identifier first
|
|
93
223
|
base = build(data[:base]) if data[:base]
|
|
@@ -97,10 +227,22 @@ module Pubid
|
|
|
97
227
|
klass = case supplement_type
|
|
98
228
|
when "Amd"
|
|
99
229
|
Identifiers::Amendment
|
|
230
|
+
when "Add"
|
|
231
|
+
Identifiers::Addendum
|
|
100
232
|
when "Cor"
|
|
101
233
|
Identifiers::Corrigendum
|
|
234
|
+
when "Err"
|
|
235
|
+
Identifiers::Errata
|
|
102
236
|
when "Suppl"
|
|
103
237
|
Identifiers::Supplement
|
|
238
|
+
else
|
|
239
|
+
# Previously fell through to a nil class and died with
|
|
240
|
+
# "undefined method 'new' for nil" one frame later. Any token
|
|
241
|
+
# added to Parser#supplement_type without a class here should
|
|
242
|
+
# say so.
|
|
243
|
+
raise ArgumentError,
|
|
244
|
+
"Unknown ITU supplement type: " \
|
|
245
|
+
"#{data[:supplement_type].inspect}"
|
|
104
246
|
end
|
|
105
247
|
|
|
106
248
|
# Build supplement date (separate from base date)
|
|
@@ -111,25 +253,84 @@ module Pubid
|
|
|
111
253
|
)
|
|
112
254
|
end
|
|
113
255
|
|
|
114
|
-
#
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
256
|
+
# Sector/series are copied from the base when it has them; the fallback
|
|
257
|
+
# to this level's own tokens is guarded because an annex base keeps
|
|
258
|
+
# sector/series/code on *its* base, leaving all three nil here while the
|
|
259
|
+
# supplement level carries no sector token of its own.
|
|
260
|
+
# An annex base keeps sector/series/code on *its* base, so reach through
|
|
261
|
+
# it via #root; otherwise a supplement of an annex would carry none of
|
|
262
|
+
# them and its MR string would collapse to a bare "itu.<date>".
|
|
263
|
+
base_identity = base&.sector ? base : base&.root
|
|
264
|
+
sector = base_identity&.sector ||
|
|
265
|
+
(Components::Sector.new(sector: data[:sector].to_s) if data[:sector])
|
|
266
|
+
series = base_identity&.series ||
|
|
267
|
+
(Components::Series.new(series: data[:series].to_s) if data[:series])
|
|
268
|
+
|
|
269
|
+
attrs = {
|
|
270
|
+
sector: sector,
|
|
271
|
+
series: series,
|
|
272
|
+
code: base_identity&.code,
|
|
119
273
|
base: base,
|
|
120
274
|
number: data[:supplement_number].to_s,
|
|
275
|
+
# The marker is the captured space, so its ABSENCE is the flag.
|
|
276
|
+
number_glued: data[:supplement_space].nil?,
|
|
277
|
+
slash_joined: !data[:supplement_slash].nil?,
|
|
121
278
|
date: supplement_date,
|
|
122
279
|
language: data[:language]&.to_s,
|
|
123
|
-
|
|
280
|
+
}
|
|
281
|
+
# The "series" word rides on the supplement for the base-less,
|
|
282
|
+
# series-only form; with a base it is the base's, and renders from
|
|
283
|
+
# there. It is copied up anyway (like sector/series/code above) so the
|
|
284
|
+
# supplement's own MR slug stays distinct — `render_supplement` and the
|
|
285
|
+
# base-nil-guarded key_value/== only consult it when base is nil, so
|
|
286
|
+
# the copy is render- and serialization-neutral.
|
|
287
|
+
attrs[:series_word] = if base
|
|
288
|
+
!!base_identity&.series_word
|
|
289
|
+
else
|
|
290
|
+
!data[:series_word].nil?
|
|
291
|
+
end
|
|
292
|
+
attrs[:technical] = true if data[:technical] &&
|
|
293
|
+
klass == Identifiers::Corrigendum
|
|
294
|
+
|
|
295
|
+
klass.new(**attrs)
|
|
124
296
|
end
|
|
125
297
|
|
|
126
298
|
private
|
|
127
299
|
|
|
300
|
+
# Build the additional designations of a combined recommendation from the
|
|
301
|
+
# repeated parse subtrees (each `{ designation: { series:, number:, … } }`).
|
|
302
|
+
def build_designations(combined_data)
|
|
303
|
+
Array(combined_data).map do |element|
|
|
304
|
+
d = element[:designation] || element
|
|
305
|
+
Components::Designation.new(
|
|
306
|
+
series: Components::Series.new(series: d[:series].to_s),
|
|
307
|
+
code: Components::Code.new(
|
|
308
|
+
number: d[:number].to_s,
|
|
309
|
+
series_suffix: d[:series_suffix]&.to_s,
|
|
310
|
+
series_suffix_spaced: !d[:series_suffix_spaced].nil?,
|
|
311
|
+
subseries: d[:subseries]&.to_s,
|
|
312
|
+
parts: extract_parts(d[:parts]),
|
|
313
|
+
qualifier: d[:qualifier]&.to_s,
|
|
314
|
+
qualifier_glued: !d[:qualifier].nil? && d[:qualifier_spaced].nil?,
|
|
315
|
+
),
|
|
316
|
+
)
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
128
320
|
def build_code(data)
|
|
129
321
|
Components::Code.new(
|
|
322
|
+
imp_marker: data[:imp_marker]&.to_s,
|
|
130
323
|
number: data[:number].to_s,
|
|
324
|
+
series_suffix: data[:series_suffix]&.to_s,
|
|
325
|
+
# The marker is the captured separating space, so its presence is
|
|
326
|
+
# the flag for the edition word and its ABSENCE is the flag for the
|
|
327
|
+
# qualifier letter (whose majority spelling is spaced).
|
|
328
|
+
series_suffix_spaced: !data[:series_suffix_spaced].nil?,
|
|
131
329
|
subseries: data[:subseries]&.to_s,
|
|
132
330
|
parts: extract_parts(data[:parts]),
|
|
331
|
+
qualifier: data[:qualifier]&.to_s,
|
|
332
|
+
qualifier_glued: !data[:qualifier].nil? &&
|
|
333
|
+
data[:qualifier_spaced].nil?,
|
|
133
334
|
)
|
|
134
335
|
end
|
|
135
336
|
|