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
|
@@ -4,14 +4,76 @@ module Pubid
|
|
|
4
4
|
module CenCenelec
|
|
5
5
|
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
6
6
|
def generate
|
|
7
|
-
|
|
8
|
-
|
|
7
|
+
urn_for(identifier)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
protected
|
|
11
|
+
|
|
12
|
+
# The URN of +id+, walking the wrapper structure:
|
|
13
|
+
# EN 13250:2000/A1:2005 urn:cen:en:13250:2000:amd:1:2005
|
|
14
|
+
# EN 285:2015+A1:2021 urn:cen:en:285:2015:plus:amd:1:2021
|
|
15
|
+
# EN 60038 AMD1 FRAG2 urn:cen:en:60038:amd:1:frag:2
|
|
16
|
+
# CEN ISO/TS 21003-7:2019 urn:cen:cen:iso:ts:21003-7:2019
|
|
17
|
+
# ENV ISO 11079:1999 urn:cen:env:iso:11079:1999
|
|
18
|
+
# prEN ISO 1234:2020 urn:cen:en:iso:1234:2020:stage.proposal
|
|
19
|
+
# The "plus" marker keeps a consolidated identifier apart from the
|
|
20
|
+
# standalone amendment with the same number and year.
|
|
21
|
+
def urn_for(id)
|
|
22
|
+
case id
|
|
23
|
+
when nil
|
|
24
|
+
"urn:cen"
|
|
25
|
+
when Identifiers::Amendment, Identifiers::Corrigendum,
|
|
26
|
+
Identifiers::Fragment
|
|
27
|
+
[urn_for(id.base), *supplement_segments(id)].join(":")
|
|
28
|
+
when Identifiers::ConsolidatedIdentifier
|
|
29
|
+
base, *supplements = id.identifiers
|
|
30
|
+
[urn_for(base), *supplements.flat_map do |s|
|
|
31
|
+
["plus", *supplement_segments(s)]
|
|
32
|
+
end].join(":")
|
|
9
33
|
else
|
|
10
|
-
|
|
34
|
+
if adoption?(id)
|
|
35
|
+
# The publisher, then the adopted document's MR string with its
|
|
36
|
+
# dot and underscore separators as colons, then a draft stage as
|
|
37
|
+
# the base URN writes it.
|
|
38
|
+
body = [id.mr_publisher, id.adopted&.to_mr_string]
|
|
39
|
+
.compact.reject(&:empty?).join(".").tr("._", "::")
|
|
40
|
+
["urn:cen:#{body}", *stage_segment(id)].join(":")
|
|
41
|
+
else
|
|
42
|
+
self.class.new(id).generate_base_urn
|
|
43
|
+
end
|
|
11
44
|
end
|
|
12
45
|
end
|
|
13
46
|
|
|
14
|
-
|
|
47
|
+
# "EN ISO 8601:2019" or "ENV ISO 11079:1999": the document identity is
|
|
48
|
+
# on the adopted ISO/IEC identifier, not on this one.
|
|
49
|
+
def adoption?(id)
|
|
50
|
+
id.is_a?(Identifiers::AdoptedEuropeanNorm) ||
|
|
51
|
+
(id.is_a?(Identifiers::EuropeanPrestandard) && id.adopted)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# ["stage.proposal"] for a draft stage, [] for a published document.
|
|
55
|
+
def stage_segment(id)
|
|
56
|
+
code = id.typed_stage&.stage_code
|
|
57
|
+
return [] if code.nil? || code.to_s == "published"
|
|
58
|
+
|
|
59
|
+
["stage.#{code}"]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# The segments that a supplement adds to its base: type, number (none
|
|
63
|
+
# for an unnumbered "/AC"), then the date.
|
|
64
|
+
def supplement_segments(id)
|
|
65
|
+
segments = case id
|
|
66
|
+
when Identifiers::Amendment
|
|
67
|
+
["amd", id.number, id.year]
|
|
68
|
+
when Identifiers::Corrigendum
|
|
69
|
+
["cor", id.number, id.supplement_date]
|
|
70
|
+
when Identifiers::Fragment
|
|
71
|
+
["frag", id.number]
|
|
72
|
+
else
|
|
73
|
+
[]
|
|
74
|
+
end
|
|
75
|
+
segments.map(&:to_s).reject(&:empty?)
|
|
76
|
+
end
|
|
15
77
|
|
|
16
78
|
def generate_base_urn
|
|
17
79
|
parts = ["urn", "cen"]
|
|
@@ -75,46 +137,6 @@ module Pubid
|
|
|
75
137
|
parts.join(":")
|
|
76
138
|
end
|
|
77
139
|
|
|
78
|
-
def generate_supplement_urn
|
|
79
|
-
parts = ["urn", "cen"]
|
|
80
|
-
|
|
81
|
-
base_id = maybe(:base_identifier)
|
|
82
|
-
if base_id
|
|
83
|
-
base_gen = self.class.new(base_id)
|
|
84
|
-
base_urn = base_gen.generate_base_urn
|
|
85
|
-
|
|
86
|
-
base_part = base_urn.sub(/^urn:cen:/, "")
|
|
87
|
-
base_parts = base_part.split(":")
|
|
88
|
-
|
|
89
|
-
parts.concat(base_parts)
|
|
90
|
-
|
|
91
|
-
typed_stage = maybe(:typed_stage)
|
|
92
|
-
if typed_stage
|
|
93
|
-
supp_type = typed_stage.type_code.to_s
|
|
94
|
-
parts << supp_type if supp_type
|
|
95
|
-
end
|
|
96
|
-
|
|
97
|
-
amendment_number = maybe(:amendment_number)
|
|
98
|
-
if amendment_number
|
|
99
|
-
parts << amendment_number.to_s
|
|
100
|
-
elsif identifier.number
|
|
101
|
-
number = identifier.number.to_s
|
|
102
|
-
parts << number
|
|
103
|
-
end
|
|
104
|
-
|
|
105
|
-
amendment_year = maybe(:amendment_year)
|
|
106
|
-
if amendment_year
|
|
107
|
-
parts << amendment_year.to_s
|
|
108
|
-
elsif identifier.date&.is_a?(::Pubid::Components::Date) && identifier.date.present?
|
|
109
|
-
parts << identifier.date.render(context: URN_CONTEXT)
|
|
110
|
-
end
|
|
111
|
-
else
|
|
112
|
-
parts << "unknown"
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
parts.join(":")
|
|
116
|
-
end
|
|
117
|
-
|
|
118
140
|
def type_component
|
|
119
141
|
typed_stage = maybe(:typed_stage)
|
|
120
142
|
return nil unless typed_stage
|
data/lib/pubid/cen_cenelec.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module CenCenelec
|
|
5
6
|
extend Pubid::PrefixesSupport
|
|
@@ -9,130 +10,137 @@ module Pubid
|
|
|
9
10
|
# are excluded — they route to their own SDOs, not to CEN.
|
|
10
11
|
PREFIXES = %w[EN CEN CLC CWA HD ES CR ENV].freeze
|
|
11
12
|
|
|
13
|
+
# Publisher tokens that are also the document type. "CWA 14050" has no
|
|
14
|
+
# separate type token, so the builder picks the class from the publisher
|
|
15
|
+
# and the renderer prints the token once, not as "CWA/CWA 14050".
|
|
16
|
+
PUBLISHER_TYPES = %w[CWA HD ES CR ENV].freeze
|
|
17
|
+
|
|
12
18
|
autoload :Builder, "#{__dir__}/cen_cenelec/builder"
|
|
13
19
|
autoload :Identifier, "#{__dir__}/cen_cenelec/identifier"
|
|
14
20
|
autoload :Identifiers, "#{__dir__}/cen_cenelec/identifiers"
|
|
15
21
|
autoload :Parser, "#{__dir__}/cen_cenelec/parser"
|
|
16
22
|
autoload :Renderer, "#{__dir__}/cen_cenelec/renderer"
|
|
17
23
|
autoload :SingleIdentifier, "#{__dir__}/cen_cenelec/single_identifier"
|
|
18
|
-
autoload :SupplementIdentifier,
|
|
19
|
-
"#{__dir__}/cen_cenelec/supplement_identifier"
|
|
20
24
|
autoload :UrnGenerator, "#{__dir__}/cen_cenelec/urn_generator"
|
|
21
25
|
autoload :UrnParser, "#{__dir__}/cen_cenelec/urn_parser"
|
|
22
26
|
|
|
23
27
|
# TYPED_STAGES_REGISTRY for native CEN types
|
|
28
|
+
# Covers the CEN PROJEX stage-code table per issue #251.
|
|
24
29
|
TYPED_STAGES_REGISTRY = [
|
|
25
|
-
# European Norm (EN)
|
|
30
|
+
# === European Norm (EN) lifecycle ===
|
|
31
|
+
# Preliminary (pWI EN): proposal/WI stages
|
|
26
32
|
Pubid::Components::TypedStage.new(
|
|
27
|
-
code: :
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
abbr: ["EN"],
|
|
31
|
-
name: "European Norm",
|
|
32
|
-
harmonized_stages: %w[60.00 60.60],
|
|
33
|
+
code: :pwien, stage_code: :preliminary, type_code: :en,
|
|
34
|
+
abbr: ["pWI EN"], name: "Preliminary Work Item EN",
|
|
35
|
+
harmonized_stages: %w[00.60 10.98 10.99 20.60],
|
|
33
36
|
),
|
|
37
|
+
# Proposal (prEN): working draft stages
|
|
34
38
|
Pubid::Components::TypedStage.new(
|
|
35
|
-
code: :pren,
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
code: :pren, stage_code: :proposal, type_code: :en,
|
|
40
|
+
abbr: ["prEN"], name: "Proposal European Norm",
|
|
41
|
+
harmonized_stages: %w[30.00 30.20 30.60 30.92 30.97 30.98 30.99],
|
|
42
|
+
),
|
|
43
|
+
# Final Proposal (FprEN): enquiry stages
|
|
44
|
+
Pubid::Components::TypedStage.new(
|
|
45
|
+
code: :fpren, stage_code: :final_proposal, type_code: :en,
|
|
46
|
+
abbr: ["FprEN"], name: "Final Proposal European Norm",
|
|
47
|
+
harmonized_stages: %w[40.00 40.20 40.60 40.92 40.97 40.98 40.99],
|
|
48
|
+
),
|
|
49
|
+
# Formal Vote (FV prEN): COCOR + FV dispatch
|
|
50
|
+
Pubid::Components::TypedStage.new(
|
|
51
|
+
code: :fven, stage_code: :formal_vote, type_code: :en,
|
|
52
|
+
abbr: ["FV prEN"], name: "Formal Vote EN",
|
|
53
|
+
harmonized_stages: %w[43.20 43.60 43.97 43.98 45.97 45.98 45.99],
|
|
54
|
+
),
|
|
55
|
+
# Vote (vEN): enquiry/vote
|
|
56
|
+
Pubid::Components::TypedStage.new(
|
|
57
|
+
code: :ven, stage_code: :vote, type_code: :en,
|
|
58
|
+
abbr: ["vEN"], name: "Vote EN",
|
|
59
|
+
harmonized_stages: %w[50.20 50.60 50.97 50.98],
|
|
60
|
+
),
|
|
61
|
+
# Published (EN): ratification + publication milestones
|
|
62
|
+
Pubid::Components::TypedStage.new(
|
|
63
|
+
code: :puben, stage_code: :published, type_code: :en,
|
|
64
|
+
abbr: ["EN"], name: "European Norm",
|
|
65
|
+
harmonized_stages: %w[60.00 60.55 60.60 65.31 65.51 65.62],
|
|
66
|
+
),
|
|
67
|
+
# Review (rvEN): 2-year review
|
|
68
|
+
Pubid::Components::TypedStage.new(
|
|
69
|
+
code: :rven, stage_code: :review, type_code: :en,
|
|
70
|
+
abbr: ["rvEN"], name: "Review EN",
|
|
71
|
+
harmonized_stages: %w[90.00 90.20 90.60 90.92 90.93 90.98],
|
|
72
|
+
),
|
|
73
|
+
# Reactivation (racEN)
|
|
74
|
+
Pubid::Components::TypedStage.new(
|
|
75
|
+
code: :racen, stage_code: :reactivation, type_code: :en,
|
|
76
|
+
abbr: ["racEN"], name: "Re-activated EN",
|
|
77
|
+
harmonized_stages: %w[96.60],
|
|
41
78
|
),
|
|
79
|
+
# Withdrawn (wdEN)
|
|
42
80
|
Pubid::Components::TypedStage.new(
|
|
43
|
-
code: :
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
abbr: ["FprEN"],
|
|
47
|
-
name: "Final Proposal European Norm",
|
|
48
|
-
harmonized_stages: %w[40.00 40.20 40.60 40.92 40.98 40.99],
|
|
81
|
+
code: :wden, stage_code: :withdrawn, type_code: :en,
|
|
82
|
+
abbr: ["wdEN"], name: "Withdrawn EN",
|
|
83
|
+
harmonized_stages: %w[99.60],
|
|
49
84
|
),
|
|
50
85
|
|
|
51
|
-
# Technical Specification (TS)
|
|
86
|
+
# === Technical Specification (TS) ===
|
|
52
87
|
Pubid::Components::TypedStage.new(
|
|
53
|
-
code: :pubts,
|
|
54
|
-
|
|
55
|
-
type_code: :ts,
|
|
56
|
-
abbr: ["TS"],
|
|
57
|
-
name: "Technical Specification",
|
|
88
|
+
code: :pubts, stage_code: :published, type_code: :ts,
|
|
89
|
+
abbr: ["TS"], name: "Technical Specification",
|
|
58
90
|
harmonized_stages: %w[60.00 60.60],
|
|
59
91
|
),
|
|
60
92
|
Pubid::Components::TypedStage.new(
|
|
61
|
-
code: :prts,
|
|
62
|
-
|
|
63
|
-
type_code: :ts,
|
|
64
|
-
abbr: ["prTS"],
|
|
65
|
-
name: "Proposal Technical Specification",
|
|
93
|
+
code: :prts, stage_code: :proposal, type_code: :ts,
|
|
94
|
+
abbr: ["prTS"], name: "Proposal Technical Specification",
|
|
66
95
|
harmonized_stages: %w[30.00 30.20 30.60 30.92 30.98 30.99],
|
|
67
96
|
),
|
|
68
97
|
|
|
69
|
-
# Technical Report (TR)
|
|
98
|
+
# === Technical Report (TR) ===
|
|
70
99
|
Pubid::Components::TypedStage.new(
|
|
71
|
-
code: :pubtr,
|
|
72
|
-
|
|
73
|
-
type_code: :tr,
|
|
74
|
-
abbr: ["TR"],
|
|
75
|
-
name: "Technical Report",
|
|
100
|
+
code: :pubtr, stage_code: :published, type_code: :tr,
|
|
101
|
+
abbr: ["TR"], name: "Technical Report",
|
|
76
102
|
harmonized_stages: %w[60.00 60.60],
|
|
77
103
|
),
|
|
78
104
|
|
|
79
|
-
# CEN Workshop Agreement (CWA)
|
|
105
|
+
# === CEN Workshop Agreement (CWA) ===
|
|
80
106
|
Pubid::Components::TypedStage.new(
|
|
81
|
-
code: :pubcwa,
|
|
82
|
-
|
|
83
|
-
type_code: :cwa,
|
|
84
|
-
abbr: ["CWA"],
|
|
85
|
-
name: "CEN Workshop Agreement",
|
|
107
|
+
code: :pubcwa, stage_code: :published, type_code: :cwa,
|
|
108
|
+
abbr: ["CWA"], name: "CEN Workshop Agreement",
|
|
86
109
|
harmonized_stages: %w[60.00 60.60],
|
|
87
110
|
),
|
|
88
111
|
|
|
89
|
-
# Guide
|
|
112
|
+
# === Guide ===
|
|
90
113
|
Pubid::Components::TypedStage.new(
|
|
91
|
-
code: :pubguide,
|
|
92
|
-
|
|
93
|
-
type_code: :guide,
|
|
94
|
-
abbr: ["Guide"],
|
|
95
|
-
name: "Guide",
|
|
114
|
+
code: :pubguide, stage_code: :published, type_code: :guide,
|
|
115
|
+
abbr: ["Guide"], name: "Guide",
|
|
96
116
|
harmonized_stages: %w[60.00 60.60],
|
|
97
117
|
),
|
|
98
118
|
|
|
99
|
-
# Harmonization Document (HD)
|
|
119
|
+
# === Harmonization Document (HD) ===
|
|
100
120
|
Pubid::Components::TypedStage.new(
|
|
101
|
-
code: :pubhd,
|
|
102
|
-
|
|
103
|
-
type_code: :hd,
|
|
104
|
-
abbr: ["HD"],
|
|
105
|
-
name: "Harmonization Document",
|
|
121
|
+
code: :pubhd, stage_code: :published, type_code: :hd,
|
|
122
|
+
abbr: ["HD"], name: "Harmonization Document",
|
|
106
123
|
harmonized_stages: %w[60.00 60.60],
|
|
107
124
|
),
|
|
108
125
|
|
|
109
|
-
# European Specification (ES)
|
|
126
|
+
# === European Specification (ES) ===
|
|
110
127
|
Pubid::Components::TypedStage.new(
|
|
111
|
-
code: :pubes,
|
|
112
|
-
|
|
113
|
-
type_code: :es,
|
|
114
|
-
abbr: ["ES"],
|
|
115
|
-
name: "European Specification",
|
|
128
|
+
code: :pubes, stage_code: :published, type_code: :es,
|
|
129
|
+
abbr: ["ES"], name: "European Specification",
|
|
116
130
|
harmonized_stages: %w[60.00 60.60],
|
|
117
131
|
),
|
|
118
132
|
|
|
119
|
-
# CEN Report (CR)
|
|
133
|
+
# === CEN Report (CR) ===
|
|
120
134
|
Pubid::Components::TypedStage.new(
|
|
121
|
-
code: :pubcr,
|
|
122
|
-
|
|
123
|
-
type_code: :cr,
|
|
124
|
-
abbr: ["CR"],
|
|
125
|
-
name: "CEN Report",
|
|
135
|
+
code: :pubcr, stage_code: :published, type_code: :cr,
|
|
136
|
+
abbr: ["CR"], name: "CEN Report",
|
|
126
137
|
harmonized_stages: %w[60.00 60.60],
|
|
127
138
|
),
|
|
128
139
|
|
|
129
|
-
# European Prestandard (ENV)
|
|
140
|
+
# === European Prestandard (ENV) ===
|
|
130
141
|
Pubid::Components::TypedStage.new(
|
|
131
|
-
code: :pubenv,
|
|
132
|
-
|
|
133
|
-
type_code: :env,
|
|
134
|
-
abbr: ["ENV"],
|
|
135
|
-
name: "European Prestandard",
|
|
142
|
+
code: :pubenv, stage_code: :published, type_code: :env,
|
|
143
|
+
abbr: ["ENV"], name: "European Prestandard",
|
|
136
144
|
harmonized_stages: %w[60.00 60.60],
|
|
137
145
|
),
|
|
138
146
|
].freeze
|
|
@@ -148,8 +156,13 @@ module Pubid
|
|
|
148
156
|
).freeze
|
|
149
157
|
|
|
150
158
|
def self.parse(identifier)
|
|
159
|
+
unless identifier.is_a?(String)
|
|
160
|
+
raise Pubid::Errors::InvalidInputError,
|
|
161
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
162
|
+
end
|
|
163
|
+
|
|
151
164
|
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
152
|
-
raise
|
|
165
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
153
166
|
end
|
|
154
167
|
|
|
155
168
|
CenCenelec::Identifier.parse(identifier)
|
|
@@ -184,16 +197,25 @@ module Pubid
|
|
|
184
197
|
abbr_str = abbr.to_s.upcase
|
|
185
198
|
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
186
199
|
end
|
|
200
|
+
|
|
201
|
+
# Lookup: typed-stage code -> typed stage ("pren" -> the prEN entry).
|
|
202
|
+
# The serialized form of a draft stage is this code.
|
|
203
|
+
# @param code [String, Symbol] the typed-stage code to find
|
|
204
|
+
# @return [Pubid::Components::TypedStage, nil] the matching typed stage
|
|
205
|
+
def self.locate_stage_by_code(code)
|
|
206
|
+
all_typed_stages.find { |s| s.code.to_s == code.to_s }
|
|
207
|
+
end
|
|
187
208
|
end
|
|
188
209
|
end
|
|
189
210
|
|
|
190
211
|
Pubid::Registry.register(:cen_cenelec, Pubid::CenCenelec)
|
|
191
212
|
Pubid::Registry.register(:cen, Pubid::CenCenelec)
|
|
192
213
|
|
|
193
|
-
# Per-flavor format registry: inherits global formats, overrides :human
|
|
194
|
-
#
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
Pubid::CenCenelec::
|
|
198
|
-
Pubid::
|
|
199
|
-
Pubid::CenCenelec::
|
|
214
|
+
# Per-flavor format registry: inherits global formats, overrides :human.
|
|
215
|
+
# Registered on the shared parent of every CEN/CENELEC class, so it covers
|
|
216
|
+
# SingleIdentifier, Identifiers::Base and the supplement wrappers, which
|
|
217
|
+
# descend from neither.
|
|
218
|
+
Pubid::CenCenelec::Identifier.format_registry =
|
|
219
|
+
Pubid::FormatRegistry.new(parent: Pubid::Identifier.format_registry)
|
|
220
|
+
Pubid::CenCenelec::Identifier.format_registry
|
|
221
|
+
.register(:human, renderer: Pubid::CenCenelec::Renderer)
|
data/lib/pubid/cie/builder.rb
CHANGED
|
@@ -14,12 +14,30 @@ module Pubid
|
|
|
14
14
|
# Determine identifier class based on parsed content
|
|
15
15
|
identifier_class = determine_class(parsed_hash)
|
|
16
16
|
|
|
17
|
+
# Supplement / Corrigendum wrap a nested base.
|
|
18
|
+
if identifier_class == Cie::Identifiers::Corrigendum
|
|
19
|
+
return build_corrigendum(parsed_hash)
|
|
20
|
+
end
|
|
21
|
+
if identifier_class == Cie::Identifiers::Supplement
|
|
22
|
+
return build_supplement(parsed_hash)
|
|
23
|
+
end
|
|
24
|
+
|
|
17
25
|
# Extract attributes with style detection
|
|
18
26
|
attributes = extract_attributes(parsed_hash)
|
|
19
27
|
|
|
20
|
-
# For Bundle
|
|
28
|
+
# For Bundle, parse each comma-separated member and hoist a shared base.
|
|
21
29
|
if parsed_hash[:bundle_items] && original_string
|
|
22
|
-
attributes
|
|
30
|
+
attributes.merge!(build_bundle(original_string))
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# `extract_attributes` builds one attribute hash for every CIE type,
|
|
34
|
+
# but the types do not share one attribute set — only Standard,
|
|
35
|
+
# DualPublished and Identical declare `s_prefix`, while Conference,
|
|
36
|
+
# Bundle, Proceedings and TutorialBundle do not. lutaml used to drop
|
|
37
|
+
# the surplus key without a word; the constructor now refuses it, so
|
|
38
|
+
# the builder has to stop offering it.
|
|
39
|
+
attributes = attributes.select do |key, _|
|
|
40
|
+
identifier_class.attributes.key?(key)
|
|
23
41
|
end
|
|
24
42
|
|
|
25
43
|
# Construct identifier
|
|
@@ -28,6 +46,85 @@ module Pubid
|
|
|
28
46
|
|
|
29
47
|
private
|
|
30
48
|
|
|
49
|
+
# Build a Bundle's attributes from its printed form. Parse each member,
|
|
50
|
+
# then — since a CIE bundle is the parts of one supplement of one standard
|
|
51
|
+
# — hoist the shared base and keep only the differing supplement
|
|
52
|
+
# number/part in each doc. If the members don't share a base (not seen in
|
|
53
|
+
# practice, but the grammar allows it), keep each doc's own base instead.
|
|
54
|
+
def build_bundle(original_string)
|
|
55
|
+
members = split_bundle_members(original_string)
|
|
56
|
+
shared = common_base(members)
|
|
57
|
+
return { ids: members } unless shared
|
|
58
|
+
|
|
59
|
+
ids = members.map do |m|
|
|
60
|
+
Cie::Identifiers::Supplement.new(number: m.number, part: m.part)
|
|
61
|
+
end
|
|
62
|
+
{ base: shared, ids: ids }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# The publisher prefix is written once, so only the first item carries
|
|
66
|
+
# "CIE "; prepend it to the rest before parsing each member.
|
|
67
|
+
def split_bundle_members(original_string)
|
|
68
|
+
original_string.split(",").each_with_index.map do |item, i|
|
|
69
|
+
ref = i.zero? ? item.strip : "CIE #{item.strip}"
|
|
70
|
+
Cie::Identifier.parse(ref)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# The base shared by every member, or nil if they differ (or any is
|
|
75
|
+
# base-less). Compared by canonical hash so structural equality holds.
|
|
76
|
+
def common_base(members)
|
|
77
|
+
bases = members.map(&:base)
|
|
78
|
+
return nil if bases.any?(&:nil?)
|
|
79
|
+
|
|
80
|
+
first = bases.first.to_hash
|
|
81
|
+
bases.all? { |b| b.to_hash == first } ? bases.first : nil
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# Supplement: nest the base Standard (the stage/year/language belong to
|
|
85
|
+
# the base), keep only the -SPN number/part on the wrapper.
|
|
86
|
+
def build_supplement(parsed_hash)
|
|
87
|
+
a = extract_attributes(parsed_hash)
|
|
88
|
+
base = Cie::Identifiers::Standard.new(
|
|
89
|
+
number: a[:base_number],
|
|
90
|
+
stage: a[:stage],
|
|
91
|
+
s_prefix: a.fetch(:s_prefix, false),
|
|
92
|
+
language: a[:language],
|
|
93
|
+
year: a[:year],
|
|
94
|
+
style: "current", # supplements always use the colon style
|
|
95
|
+
)
|
|
96
|
+
Cie::Identifiers::Supplement.new(
|
|
97
|
+
base: base,
|
|
98
|
+
number: a[:supplement_number],
|
|
99
|
+
part: a[:supplement_part],
|
|
100
|
+
)
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
# Corrigendum: nest the base (a Standard, or a Supplement when the base
|
|
104
|
+
# itself carries -SPN), keep only the /CorN number/year on the wrapper.
|
|
105
|
+
def build_corrigendum(parsed_hash)
|
|
106
|
+
a = extract_attributes(parsed_hash)
|
|
107
|
+
base_std = Cie::Identifiers::Standard.new(
|
|
108
|
+
number: a[:base_number],
|
|
109
|
+
year: a[:base_year],
|
|
110
|
+
style: "current",
|
|
111
|
+
)
|
|
112
|
+
base = if a[:base_supplement]
|
|
113
|
+
Cie::Identifiers::Supplement.new(
|
|
114
|
+
base: base_std,
|
|
115
|
+
number: a[:base_supplement],
|
|
116
|
+
part: a[:base_supplement_part],
|
|
117
|
+
)
|
|
118
|
+
else
|
|
119
|
+
base_std
|
|
120
|
+
end
|
|
121
|
+
Cie::Identifiers::Corrigendum.new(
|
|
122
|
+
base: base,
|
|
123
|
+
number: a[:cor_number],
|
|
124
|
+
year: a[:cor_year],
|
|
125
|
+
)
|
|
126
|
+
end
|
|
127
|
+
|
|
31
128
|
# Determine which identifier class to use
|
|
32
129
|
def determine_class(parsed_hash)
|
|
33
130
|
# Tutorial Bundle (special text format)
|
|
@@ -50,6 +147,11 @@ module Pubid
|
|
|
50
147
|
return Cie::Identifiers::Supplement
|
|
51
148
|
end
|
|
52
149
|
|
|
150
|
+
# Proceedings paper (x-prefixed or standalone)
|
|
151
|
+
if parsed_hash[:paper_code]
|
|
152
|
+
return Cie::Identifiers::Proceedings
|
|
153
|
+
end
|
|
154
|
+
|
|
53
155
|
# Conference (x-prefix)
|
|
54
156
|
if parsed_hash[:conference]
|
|
55
157
|
return Cie::Identifiers::Conference
|
|
@@ -179,47 +281,69 @@ module Pubid
|
|
|
179
281
|
date_sep = "slash" # Special format for identical identifiers
|
|
180
282
|
end
|
|
181
283
|
|
|
182
|
-
#
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
284
|
+
# Style is the sole separator field (no date_separator):
|
|
285
|
+
# colon -> current (":") dash -> legacy ("-") slash -> slash ("/")
|
|
286
|
+
style = case date_sep
|
|
287
|
+
when "colon" then "current"
|
|
288
|
+
when "dash" then "legacy"
|
|
289
|
+
when "slash" then "slash"
|
|
290
|
+
else detect_style_fallback(parsed_hash)
|
|
187
291
|
end
|
|
188
292
|
attributes[:style] = style
|
|
189
293
|
|
|
190
|
-
# Set year
|
|
294
|
+
# Set year if present
|
|
191
295
|
attributes[:year] = year_value if year_value
|
|
192
|
-
attributes[:date_separator] = date_sep if date_sep
|
|
193
296
|
|
|
194
|
-
# Extract code
|
|
297
|
+
# Extract code (flat number/part/iteration/part_separator on the
|
|
298
|
+
# identifier; the code's style is the identifier's own `style`).
|
|
195
299
|
if parsed_hash[:number]
|
|
196
|
-
|
|
197
|
-
style: style }
|
|
300
|
+
attributes[:number] = extract_value(parsed_hash[:number])
|
|
198
301
|
if parsed_hash[:part]
|
|
199
|
-
|
|
200
|
-
extract_value(parsed_hash[:part])
|
|
302
|
+
attributes[:part] = extract_value(parsed_hash[:part])
|
|
201
303
|
end
|
|
202
304
|
if parsed_hash[:iteration]
|
|
203
|
-
|
|
204
|
-
extract_value(parsed_hash[:iteration])
|
|
305
|
+
attributes[:iteration] = extract_value(parsed_hash[:iteration])
|
|
205
306
|
end
|
|
206
307
|
|
|
207
308
|
# Detect part separator from parser markers
|
|
208
309
|
if parsed_hash[:slash_sep]
|
|
209
|
-
|
|
310
|
+
attributes[:part_separator] = "slash"
|
|
210
311
|
elsif parsed_hash[:dash_sep]
|
|
211
|
-
|
|
312
|
+
attributes[:part_separator] = "dash"
|
|
212
313
|
end
|
|
213
|
-
|
|
214
|
-
attributes[:code] = Components::Code.new(**code_attrs)
|
|
215
314
|
end
|
|
216
315
|
|
|
217
316
|
# Conference number (separate from regular code)
|
|
218
317
|
if parsed_hash[:conf_number]
|
|
219
|
-
attributes[:
|
|
318
|
+
attributes[:number] =
|
|
220
319
|
extract_value(parsed_hash[:conf_number])
|
|
221
320
|
end
|
|
222
321
|
|
|
322
|
+
# Proceedings paper: the paper itself is the document, so its identity
|
|
323
|
+
# (code + running number, e.g. "OP01") is the flat +number+ for both
|
|
324
|
+
# surface forms. The x-form's parent conference goes to
|
|
325
|
+
# +conference+; the standalone form keeps its +page+ range.
|
|
326
|
+
if parsed_hash[:paper_code]
|
|
327
|
+
attributes[:number] =
|
|
328
|
+
"#{extract_value(parsed_hash[:paper_code])}" \
|
|
329
|
+
"#{extract_value(parsed_hash[:paper_number])}"
|
|
330
|
+
if parsed_hash[:conf_number]
|
|
331
|
+
attributes[:conference] =
|
|
332
|
+
extract_value(parsed_hash[:conf_number])
|
|
333
|
+
end
|
|
334
|
+
end
|
|
335
|
+
if parsed_hash[:page_range]
|
|
336
|
+
attributes[:page] = extract_value(parsed_hash[:page_range])
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
# Conference /slug variant (opaque, verbatim)
|
|
340
|
+
if parsed_hash[:variant]
|
|
341
|
+
attributes[:variant] = extract_value(parsed_hash[:variant])
|
|
342
|
+
end
|
|
343
|
+
|
|
344
|
+
# D-series marker
|
|
345
|
+
attributes[:d_prefix] = true if parsed_hash[:d_prefix]
|
|
346
|
+
|
|
223
347
|
# Extract language (direct lang_code for slash_colon format)
|
|
224
348
|
lang_code = nil
|
|
225
349
|
lang_format = nil
|
|
@@ -325,10 +449,11 @@ module Pubid
|
|
|
325
449
|
extract_value(parsed_hash[:amd_number])
|
|
326
450
|
end
|
|
327
451
|
|
|
328
|
-
#
|
|
452
|
+
# Tutorial bundle: the ordinal is the bundle's own `number` (also its
|
|
453
|
+
# relaton-index key). A comma-list bundle instead keys via its `ids`
|
|
454
|
+
# members through #root, so it needs no stored number.
|
|
329
455
|
if parsed_hash[:bundle_number]
|
|
330
|
-
attributes[:
|
|
331
|
-
extract_value(parsed_hash[:bundle_number])
|
|
456
|
+
attributes[:number] = extract_value(parsed_hash[:bundle_number])
|
|
332
457
|
end
|
|
333
458
|
|
|
334
459
|
# Extract trailing language from legacy_code_with_year
|
data/lib/pubid/cie/identifier.rb
CHANGED
|
@@ -5,14 +5,23 @@ module Pubid
|
|
|
5
5
|
# Base Identifier class for CIE.
|
|
6
6
|
#
|
|
7
7
|
# Inherits the shared Pubid::Identifier contract (format_registry, render,
|
|
8
|
-
# to_urn, exclude, hash, eql?) while allowing CIE-specific attributes
|
|
9
|
-
#
|
|
8
|
+
# to_urn, exclude, hash, eql?) while allowing CIE-specific attributes.
|
|
9
|
+
#
|
|
10
|
+
# +style+ is the sole number<->year separator field (there is no separate
|
|
11
|
+
# date_separator): "current" -> ":", "legacy" -> "-", "slash" -> "/".
|
|
12
|
+
# It defaults to "current" (the dominant value), so canonicalize_hash drops
|
|
13
|
+
# it from the majority of rows and from_hash restores it.
|
|
10
14
|
class Identifier < ::Pubid::Identifier
|
|
11
|
-
attribute :style, :string
|
|
15
|
+
attribute :style, :string, default: -> { "current" }
|
|
12
16
|
|
|
13
17
|
def self.parse(input)
|
|
18
|
+
unless input.is_a?(String)
|
|
19
|
+
raise Pubid::Errors::InvalidInputError,
|
|
20
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
21
|
+
end
|
|
22
|
+
|
|
14
23
|
if input.length > Pubid::MAX_INPUT_LENGTH
|
|
15
|
-
raise
|
|
24
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
16
25
|
end
|
|
17
26
|
|
|
18
27
|
parsed = Parser.parse(input)
|