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
|
@@ -8,7 +8,7 @@ module Pubid
|
|
|
8
8
|
# - "NBS CRPL 1-2_3-1" = Reports 1-2 and 3-1 jointly
|
|
9
9
|
# - "NBS CRPL 4-m-5" = Report 4, month m, issue 5
|
|
10
10
|
# - "NBS CRPL c4-4" = Report c4, issue 4
|
|
11
|
-
class CrplReport <
|
|
11
|
+
class CrplReport < Identifier
|
|
12
12
|
TYPED_STAGES = [
|
|
13
13
|
Pubid::Components::TypedStage.new(
|
|
14
14
|
abbr: ["CRPL", "NBS CRPL", "CRPL-F-B", "CRPL-F-A", "NBS CRPL-F-B",
|
|
@@ -88,6 +88,12 @@ module Pubid
|
|
|
88
88
|
end
|
|
89
89
|
|
|
90
90
|
def to_s(format = nil)
|
|
91
|
+
# A caller passing `annotated:` reaches this positional parameter as
|
|
92
|
+
# a Hash — Ruby converts keywords for a method that accepts none.
|
|
93
|
+
# The same idiom `Identifiers::Base#to_s` uses. This renderer
|
|
94
|
+
# ignores `format`, so only the flag is read.
|
|
95
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
96
|
+
|
|
91
97
|
# Use actual series attribute if it contains subseries (e.g., "CRPL-F-B")
|
|
92
98
|
# Otherwise use default series_code ("CRPL")
|
|
93
99
|
series_to_render = if series&.value&.include?("CRPL-F-")
|
|
@@ -124,7 +130,7 @@ module Pubid
|
|
|
124
130
|
result += append_short_components
|
|
125
131
|
|
|
126
132
|
result += range_notation if range_notation
|
|
127
|
-
result
|
|
133
|
+
annotate_plain_render(result, annotated: annotated)
|
|
128
134
|
end
|
|
129
135
|
end
|
|
130
136
|
end
|
|
@@ -7,7 +7,7 @@ module Pubid
|
|
|
7
7
|
# Examples:
|
|
8
8
|
# - "NIST 2022-04-15 001" (short) / "NIST.2022-04-15.001" (mr/doi)
|
|
9
9
|
# DOI 10.6028/NIST.2022-04-15.001
|
|
10
|
-
class DatedDocument <
|
|
10
|
+
class DatedDocument < Identifier
|
|
11
11
|
# Empty so the bare "NIST" abbr never shadows a series lookup; the
|
|
12
12
|
# Router guard (parsed_hash[:dated_date] && :dated_seq) is the dispatch path.
|
|
13
13
|
TYPED_STAGES = [].freeze
|
|
@@ -7,7 +7,7 @@ module Pubid
|
|
|
7
7
|
# Examples:
|
|
8
8
|
# - "FIPS 140-3" (no NIST prefix)
|
|
9
9
|
# - "NIST FIPS 140-3" (also accepted, normalizes to FIPS 140-3)
|
|
10
|
-
class FederalInformationProcessingStandards <
|
|
10
|
+
class FederalInformationProcessingStandards < Identifier
|
|
11
11
|
TYPED_STAGES = [
|
|
12
12
|
Pubid::Components::TypedStage.new(
|
|
13
13
|
abbr: ["FIPS", "NIST FIPS"],
|
|
@@ -7,7 +7,7 @@ module Pubid
|
|
|
7
7
|
# Examples:
|
|
8
8
|
# - "NIST GCR 17-917-45" - Basic 3-part number
|
|
9
9
|
# - "NIST GCR 21-917-48v3B" - With volume and letter suffix
|
|
10
|
-
class GrantContractorReport <
|
|
10
|
+
class GrantContractorReport < Identifier
|
|
11
11
|
TYPED_STAGES = [
|
|
12
12
|
Pubid::Components::TypedStage.new(
|
|
13
13
|
abbr: ["GCR", "NIST GCR"],
|
|
@@ -7,7 +7,7 @@ module Pubid
|
|
|
7
7
|
# Examples:
|
|
8
8
|
# - "NIST HB 130" = Handbook 130
|
|
9
9
|
# - "NBS HB 133" = NBS Handbook 133
|
|
10
|
-
class Handbook <
|
|
10
|
+
class Handbook < Identifier
|
|
11
11
|
TYPED_STAGES = [
|
|
12
12
|
Pubid::Components::TypedStage.new(
|
|
13
13
|
abbr: ["HB", "NIST HB", "NBS HB"],
|
|
@@ -34,8 +34,15 @@ module Pubid
|
|
|
34
34
|
# Override to_s to handle edition+year pattern with dash instead of dot
|
|
35
35
|
# Pattern: "44e2-1955" (dash separator) not "44e2.1955" (dot separator)
|
|
36
36
|
def to_s(format = nil)
|
|
37
|
+
# The rewrite below is `$`-anchored, so it has to run on the PLAIN
|
|
38
|
+
# string: with the flag set, `super` returns a string ending in
|
|
39
|
+
# "</span>" and the anchor no longer matches. Render plain, rewrite,
|
|
40
|
+
# then annotate.
|
|
41
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
42
|
+
format = format[:format] if format.is_a?(Hash)
|
|
43
|
+
|
|
37
44
|
# Use the base to_s method first
|
|
38
|
-
result = super
|
|
45
|
+
result = super(format)
|
|
39
46
|
|
|
40
47
|
# If edition has additional_text (year), replace dot with dash
|
|
41
48
|
if edition&.additional_text && !edition.additional_text.empty?
|
|
@@ -43,7 +50,7 @@ module Pubid
|
|
|
43
50
|
"#{edition.type}#{edition.id}-#{edition.additional_text}")
|
|
44
51
|
end
|
|
45
52
|
|
|
46
|
-
result
|
|
53
|
+
annotate_plain_render(result, annotated: annotated)
|
|
47
54
|
end
|
|
48
55
|
end
|
|
49
56
|
end
|
|
@@ -8,7 +8,7 @@ module Pubid
|
|
|
8
8
|
# - "NIST IR 8115" = Interagency Report 8115
|
|
9
9
|
# - "NIST IR 8115r1" = Interagency Report 8115 revision 1
|
|
10
10
|
# - "NBS IR 73-197" = NBS Interagency Report 73-197
|
|
11
|
-
class InteragencyReport <
|
|
11
|
+
class InteragencyReport < Identifier
|
|
12
12
|
TYPED_STAGES = [
|
|
13
13
|
Pubid::Components::TypedStage.new(
|
|
14
14
|
abbr: ["IR", "NIST IR", "NBS IR"],
|
|
@@ -37,6 +37,11 @@ module Pubid
|
|
|
37
37
|
# @param format [Symbol, Hash, nil] output format
|
|
38
38
|
# @return [String] formatted identifier
|
|
39
39
|
def to_s(format = nil)
|
|
40
|
+
# `super` is handed a SYMBOL below, so the base's annotation hook
|
|
41
|
+
# never sees the flag. Capture it here and wrap what comes back —
|
|
42
|
+
# exactly once, because the base returned plain text.
|
|
43
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
44
|
+
|
|
40
45
|
# Handle both keyword argument (hash) and positional argument (symbol/string)
|
|
41
46
|
effective_format = if format.is_a?(Hash)
|
|
42
47
|
format[:format]
|
|
@@ -45,11 +50,13 @@ module Pubid
|
|
|
45
50
|
end
|
|
46
51
|
|
|
47
52
|
# If explicit format is specified, use it. Otherwise, default to short.
|
|
48
|
-
if effective_format.nil?
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
+
rendered = if effective_format.nil?
|
|
54
|
+
super(:short)
|
|
55
|
+
else
|
|
56
|
+
super(effective_format)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
annotate_plain_render(rendered, annotated: annotated)
|
|
53
60
|
end
|
|
54
61
|
end
|
|
55
62
|
end
|
|
@@ -11,7 +11,7 @@ module Pubid
|
|
|
11
11
|
# - "NBS LC 378sup12/1926" - With supplement date
|
|
12
12
|
# - "NBS LC 378r11/1925" - With revision date
|
|
13
13
|
# - "NBS LC 378(sp)" - With language code
|
|
14
|
-
class LetterCircular <
|
|
14
|
+
class LetterCircular < Identifier
|
|
15
15
|
TYPED_STAGES = [
|
|
16
16
|
Pubid::Components::TypedStage.new(
|
|
17
17
|
abbr: ["LCIRC"], # Single definition of truth
|
|
@@ -8,7 +8,7 @@ module Pubid
|
|
|
8
8
|
# - "NBS MP 39e1" - Edition with "e" notation
|
|
9
9
|
# - "NBS MP 260e1965" - Edition with year as edition ID
|
|
10
10
|
# NOTE: Parenthetical edition format (e.g., "39(1)") does NOT exist for MP identifiers
|
|
11
|
-
class MiscellaneousPublication <
|
|
11
|
+
class MiscellaneousPublication < Identifier
|
|
12
12
|
TYPED_STAGES = [
|
|
13
13
|
Pubid::Components::TypedStage.new(
|
|
14
14
|
abbr: ["MP", "NBS MP"],
|
|
@@ -36,13 +36,21 @@ module Pubid
|
|
|
36
36
|
"MP"
|
|
37
37
|
end
|
|
38
38
|
|
|
39
|
+
# A caller passing `annotated:` reaches this positional parameter as a
|
|
40
|
+
# Hash — Ruby converts keywords for a method that accepts none. The same
|
|
41
|
+
# idiom `Identifiers::Base#to_s` uses.
|
|
39
42
|
def to_s(format = :short)
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
44
|
+
format = format[:format] || :short if format.is_a?(Hash)
|
|
45
|
+
|
|
46
|
+
rendered = case format
|
|
47
|
+
when :mr
|
|
48
|
+
to_mr_style
|
|
49
|
+
else
|
|
50
|
+
to_short_style
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
annotate_plain_render(rendered, annotated: annotated)
|
|
46
54
|
end
|
|
47
55
|
|
|
48
56
|
public
|
|
@@ -10,7 +10,7 @@ module Pubid
|
|
|
10
10
|
# - "NBS MONO 128pt1" - Monograph with part
|
|
11
11
|
# - "NIST MONO 1-1F" - Monograph with letter suffix
|
|
12
12
|
# - "NIST MONO 1-2Bv1" - Monograph with letter suffix and volume
|
|
13
|
-
class Monograph <
|
|
13
|
+
class Monograph < Identifier
|
|
14
14
|
TYPED_STAGES = [
|
|
15
15
|
Pubid::Components::TypedStage.new(
|
|
16
16
|
abbr: ["MONO", "NBS MONO", "NIST MONO"],
|
|
@@ -35,6 +35,11 @@ module Pubid
|
|
|
35
35
|
end
|
|
36
36
|
|
|
37
37
|
def to_s(format = nil)
|
|
38
|
+
# `super` is handed a SYMBOL below, so the base's annotation hook
|
|
39
|
+
# never sees the flag. Capture it here and wrap what comes back —
|
|
40
|
+
# exactly once, because the base returned plain text.
|
|
41
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
42
|
+
|
|
38
43
|
# Handle both keyword argument (hash) and positional argument (symbol/string)
|
|
39
44
|
effective_format = if format.is_a?(Hash)
|
|
40
45
|
format[:format]
|
|
@@ -43,13 +48,15 @@ module Pubid
|
|
|
43
48
|
end
|
|
44
49
|
|
|
45
50
|
# If explicit format is specified, use it. Otherwise, default to short.
|
|
46
|
-
if effective_format.nil?
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
rendered = if effective_format.nil?
|
|
52
|
+
super(:short)
|
|
53
|
+
elsif effective_format == :mr
|
|
54
|
+
to_mr_style
|
|
55
|
+
else
|
|
56
|
+
super(effective_format)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
annotate_plain_render(rendered, annotated: annotated)
|
|
53
60
|
end
|
|
54
61
|
|
|
55
62
|
private
|
|
@@ -8,7 +8,7 @@ module Pubid
|
|
|
8
8
|
# - "NIST NCSTAR 1-1Cv1" → "NIST NCSTAR 1-1Cv1" (round-trips)
|
|
9
9
|
# - "NIST NCSTAR 1-1b" → "NIST NCSTAR 1-1B" (normalizes letter)
|
|
10
10
|
# - "NIST NCSTAR 1-1cv1" → "NIST NCSTAR 1-1Cv1" (normalizes letter, keeps v1 format)
|
|
11
|
-
class Ncstar <
|
|
11
|
+
class Ncstar < Identifier
|
|
12
12
|
TYPED_STAGES = [
|
|
13
13
|
Pubid::Components::TypedStage.new(
|
|
14
14
|
abbr: ["NCSTAR", "NIST NCSTAR"],
|
|
@@ -34,7 +34,7 @@ module Pubid
|
|
|
34
34
|
|
|
35
35
|
# NCSTAR-specific: do NOT expand Cv patterns to ", Volume" format
|
|
36
36
|
# The base class would render "1-1Cv1" as is, which is correct for NCSTAR
|
|
37
|
-
# No custom rendering needed - just inherit from
|
|
37
|
+
# No custom rendering needed - just inherit from Identifier
|
|
38
38
|
end
|
|
39
39
|
end
|
|
40
40
|
end
|
|
@@ -8,7 +8,7 @@ module Pubid
|
|
|
8
8
|
# - "NBS NSRDS 1" - Basic NSRDS
|
|
9
9
|
# - "NSRDS-NBS 1" - With hyphen prefix
|
|
10
10
|
# - "NBS NSRDS 1p1" - With part notation
|
|
11
|
-
class Nsrds <
|
|
11
|
+
class Nsrds < Identifier
|
|
12
12
|
TYPED_STAGES = [
|
|
13
13
|
Pubid::Components::TypedStage.new(
|
|
14
14
|
abbr: ["NSRDS", "NBS NSRDS"],
|
|
@@ -6,7 +6,7 @@ module Pubid
|
|
|
6
6
|
# NIST OWMWP (Office of Weights and Measures Workshop Proceedings)
|
|
7
7
|
# Examples:
|
|
8
8
|
# - "NIST OWMWP 06-13-2018" - Date-based format MM-DD-YYYY
|
|
9
|
-
class Owmwp <
|
|
9
|
+
class Owmwp < Identifier
|
|
10
10
|
TYPED_STAGES = [
|
|
11
11
|
Pubid::Components::TypedStage.new(
|
|
12
12
|
abbr: ["OWMWP", "NIST OWMWP"],
|
|
@@ -11,7 +11,7 @@ module Pubid
|
|
|
11
11
|
# - "NBS RPT ADHOC" - Ad hoc report
|
|
12
12
|
# - "NBS RPT div9" - Division report
|
|
13
13
|
# - "NBS RPT 4817-A" - Report with letter suffix
|
|
14
|
-
class Report <
|
|
14
|
+
class Report < Identifier
|
|
15
15
|
TYPED_STAGES = [
|
|
16
16
|
Pubid::Components::TypedStage.new(
|
|
17
17
|
abbr: ["RPT", "NBS RPT"],
|
|
@@ -39,13 +39,21 @@ module Pubid
|
|
|
39
39
|
"RPT"
|
|
40
40
|
end
|
|
41
41
|
|
|
42
|
+
# A caller passing `annotated:` reaches this positional parameter as a
|
|
43
|
+
# Hash — Ruby converts keywords for a method that accepts none. The same
|
|
44
|
+
# idiom `Identifiers::Base#to_s` uses.
|
|
42
45
|
def to_s(format = :short)
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
46
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
47
|
+
format = format[:format] || :short if format.is_a?(Hash)
|
|
48
|
+
|
|
49
|
+
rendered = case format
|
|
50
|
+
when :mr
|
|
51
|
+
to_mr_style
|
|
52
|
+
else
|
|
53
|
+
to_short_style
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
annotate_plain_render(rendered, annotated: annotated)
|
|
49
57
|
end
|
|
50
58
|
|
|
51
59
|
private
|
|
@@ -8,7 +8,16 @@ module Pubid
|
|
|
8
8
|
# - "NIST SP 800-53" = Special Publication 800-53
|
|
9
9
|
# - "NIST SP 800-53r5" = Special Publication 800-53 revision 5
|
|
10
10
|
# - "NIST SP 800-57pt1r4" = Special Publication 800-57 part 1 revision 4
|
|
11
|
-
class SpecialPublication <
|
|
11
|
+
class SpecialPublication < Identifier
|
|
12
|
+
# Per Appendix A.2 of the NIST PubID Syntax (April 2022), the SP series
|
|
13
|
+
# is subdivided into named subseries. The subseries number is the
|
|
14
|
+
# leading token of a report-num like "800-53" or "1190GB-12". The
|
|
15
|
+
# Builder exposes this as `identifier.subseries` so callers can query
|
|
16
|
+
# which subseries a document belongs to.
|
|
17
|
+
SP_SUBSERIES = %w[
|
|
18
|
+
250 260 300 400 480 500 700 800 823 960 1190GB 1200 1500 1800 1900 2000 2100
|
|
19
|
+
].freeze
|
|
20
|
+
|
|
12
21
|
TYPED_STAGES = [
|
|
13
22
|
Pubid::Components::TypedStage.new(
|
|
14
23
|
abbr: ["SP", "NIST SP", "NBS SP"], # Compound series
|
|
@@ -7,7 +7,7 @@ module Pubid
|
|
|
7
7
|
# Examples:
|
|
8
8
|
# - "NIST TN 1234" = Technical Note 1234
|
|
9
9
|
# - "NBS TN 567" = NBS Technical Note 567
|
|
10
|
-
class TechnicalNote <
|
|
10
|
+
class TechnicalNote < Identifier
|
|
11
11
|
TYPED_STAGES = [
|
|
12
12
|
Pubid::Components::TypedStage.new(
|
|
13
13
|
abbr: ["TN", "NIST TN", "NBS TN"],
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Nist
|
|
5
5
|
module Identifiers
|
|
6
|
-
autoload :Base, "#{__dir__}/identifiers/base"
|
|
7
6
|
autoload :Circular, "#{__dir__}/identifiers/circular"
|
|
8
7
|
autoload :CircularSupplement, "#{__dir__}/identifiers/circular_supplement"
|
|
9
8
|
autoload :CommercialStandard, "#{__dir__}/identifiers/commercial_standard"
|
data/lib/pubid/nist/parser.rb
CHANGED
|
@@ -6,7 +6,7 @@ module Pubid
|
|
|
6
6
|
module Nist
|
|
7
7
|
# Parser class for NIST identifiers
|
|
8
8
|
# Single Responsibility: Parsing NIST identifier syntax
|
|
9
|
-
class Parser <
|
|
9
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
10
10
|
|
|
11
11
|
# Class-level parse method with preprocessing.
|
|
12
12
|
# Delegates all string normalization to Nist::Preprocessor, then
|
|
@@ -346,6 +346,16 @@ module Pubid
|
|
|
346
346
|
match("[0-9]").repeat(1).as(:dated_seq)
|
|
347
347
|
end
|
|
348
348
|
|
|
349
|
+
# "NIST Research Library (YYYY)" — one-off NIST publication that doesn't
|
|
350
|
+
# fit the standard series+number shape (no report number, year in parens).
|
|
351
|
+
# See pubid/pubid#151.
|
|
352
|
+
rule(:research_library_identifier) do
|
|
353
|
+
publisher >> space >>
|
|
354
|
+
str("Research Library").as(:series) >>
|
|
355
|
+
(space >> str("(") >>
|
|
356
|
+
match("[0-9]").repeat(4, 4).as(:year) >> str(")")).maybe
|
|
357
|
+
end
|
|
358
|
+
|
|
349
359
|
# LEGACY EDITION PATTERNS (for backward compatibility during migration)
|
|
350
360
|
# These will be gradually replaced as we migrate to proper Edition/Date components
|
|
351
361
|
rule(:legacy_edition) do
|
|
@@ -438,7 +448,12 @@ module Pubid
|
|
|
438
448
|
|
|
439
449
|
# Volume
|
|
440
450
|
rule(:volume) do
|
|
441
|
-
|
|
451
|
+
# Long-form "Vol." comes FIRST so PEG ordered choice doesn't commit to
|
|
452
|
+
# the bare "v" alternative after consuming the leading space via
|
|
453
|
+
# space.maybe (which would then starve the " Vol. " form). Both
|
|
454
|
+
# "Vol. 4" (period + space) and "Vol.4" (period only) are accepted.
|
|
455
|
+
(space.maybe >>
|
|
456
|
+
(str("Vol. ") | str("Vol.") | str("v"))) >>
|
|
442
457
|
(digits >>
|
|
443
458
|
# Support letter ranges (lowercase normalized in preprocessing)
|
|
444
459
|
(str("a-l") | str("m-z") | str("A-L") | str("M-Z")).maybe >>
|
|
@@ -448,7 +463,8 @@ module Pubid
|
|
|
448
463
|
|
|
449
464
|
# Part - enhanced to support patterns like p1adde1 AND pt3r1 (part with revision)
|
|
450
465
|
rule(:part) do
|
|
451
|
-
(
|
|
466
|
+
(str(" Part. ") | str(" Part.") | str(" Part ") |
|
|
467
|
+
(space.maybe >> (str("pt") | str("p") | str("P")))) >>
|
|
452
468
|
(digits >>
|
|
453
469
|
# NEW: Revision after part number: pt3r1, p1r1 (space.maybe for preprocessing)
|
|
454
470
|
(space.maybe >> str("r") >> digits).maybe >>
|
|
@@ -474,7 +490,8 @@ module Pubid
|
|
|
474
490
|
# Enhanced to accept letter-only revisions and space before r
|
|
475
491
|
# ENHANCED: Accept BOTH lowercase and uppercase letters in suffix
|
|
476
492
|
# ENHANCED: Capture original format prefix for format preservation (e.g., " Rev. 5")
|
|
477
|
-
((str(" rev ") | str("rev") | str(" r") | str("r") | str(" Rev. ") | str(" Revision (r)")).as(:revision_prefix) >>
|
|
493
|
+
((str(" rev ") | str("rev") | str(" r") | str("r") | str(" Rev. ") | str(" Rev.") | str(" Revision (r)")).as(:revision_prefix) >>
|
|
494
|
+
space.maybe >>
|
|
478
495
|
((digits >> match("[a-zA-Z]").maybe) | match("[a-zA-Z]").repeat(1)).as(:revision_id)).as(:revision) |
|
|
479
496
|
# NEW: Standalone 'r' - MUST BE LAST to avoid consuming from other patterns
|
|
480
497
|
# Matches " r" at end of input (after preprocessing: "800-56a r", "800-27 r")
|
|
@@ -656,6 +673,7 @@ module Pubid
|
|
|
656
673
|
circ_supplement_identifier |
|
|
657
674
|
dated_identifier |
|
|
658
675
|
mr_identifier |
|
|
676
|
+
research_library_identifier |
|
|
659
677
|
(
|
|
660
678
|
# Compound series (includes publisher in series name)
|
|
661
679
|
compound_series >> (space | dot) >>
|
|
@@ -690,6 +708,11 @@ module Pubid
|
|
|
690
708
|
# Date range supplement (no base number)
|
|
691
709
|
(str("supp") >> month_abbrev.as(:supp_month_start) >> digits.as(:supp_year_start) >>
|
|
692
710
|
dash >> month_abbrev.as(:supp_month_end) >> digits.as(:supp_year_end)).as(:supplement_date_range) |
|
|
711
|
+
# Year-only date range supplement to the whole series, no months
|
|
712
|
+
# (e.g. "NBS CIRC sup1925-1926" — pubid/pubid#152). Requires two
|
|
713
|
+
# 4-digit years so it can't swallow "sup3/1926" or a base number.
|
|
714
|
+
((str("supp") | str("sup")) >> match("[0-9]").repeat(4, 4).as(:supp_year_start) >>
|
|
715
|
+
dash >> match("[0-9]").repeat(4, 4).as(:supp_year_end)).as(:supplement_date_range) |
|
|
693
716
|
# With base identifier + supplement
|
|
694
717
|
(
|
|
695
718
|
# Capture base portion (everything before "supp" or "sup" or slash+year)
|
|
@@ -343,6 +343,21 @@ module Pubid
|
|
|
343
343
|
revert_handbook_edition!
|
|
344
344
|
revert_owmwp_date!
|
|
345
345
|
revert_report_year_range!
|
|
346
|
+
revert_circ_supplement_year_range!
|
|
347
|
+
end
|
|
348
|
+
|
|
349
|
+
# CIRC/LCIRC year-only series supplements: "NBS CIRC sup1925-1926" is a
|
|
350
|
+
# supplement spanning a year range, so the trailing "-1926" is a range
|
|
351
|
+
# end, not an edition. convert_dashyear_to_edition! would have rewritten
|
|
352
|
+
# it to "sup1925e1926"; restore the dash so the circ_supplement_identifier
|
|
353
|
+
# grammar can read the range (pubid/pubid#152).
|
|
354
|
+
def revert_circ_supplement_year_range!
|
|
355
|
+
return unless @cleaned.include?("CIRC")
|
|
356
|
+
|
|
357
|
+
# Anchor on the series prefix ("CIRC " / "CIRC." / "LCIRC ") so only the
|
|
358
|
+
# whole-series form (sup right after the series, no base number) is
|
|
359
|
+
# reverted — a based "24sup1940e1950" keeps its genuine edition.
|
|
360
|
+
@cleaned = @cleaned.gsub(/(CIRC[ .])(supp?)(\d{4})e(\d{4})(?=\s|$)/, '\1\2\3-\4')
|
|
346
361
|
end
|
|
347
362
|
|
|
348
363
|
# HB handbooks: "HB 130e1979" → "HB 130-1979" (year is part of
|
data/lib/pubid/nist/router.rb
CHANGED
|
@@ -127,10 +127,10 @@ module Pubid
|
|
|
127
127
|
# instead of an injected dependency.
|
|
128
128
|
typed_stage = Pubid::Nist.locate_stage(series)
|
|
129
129
|
if typed_stage
|
|
130
|
-
Pubid::Nist.locate_type(typed_stage.type_code) ||
|
|
130
|
+
Pubid::Nist.locate_type(typed_stage.type_code) || Identifier
|
|
131
131
|
else
|
|
132
132
|
# Fallback to Base for unmapped series (e.g., "AMS", "VTS")
|
|
133
|
-
|
|
133
|
+
Identifier
|
|
134
134
|
end
|
|
135
135
|
end
|
|
136
136
|
|
data/lib/pubid/nist/series/ir.rb
CHANGED
|
@@ -36,8 +36,6 @@ module Pubid
|
|
|
36
36
|
)
|
|
37
37
|
edition_obj = Components::Edition.new(type: "r", id: "1")
|
|
38
38
|
identifier.edition = edition_obj
|
|
39
|
-
identifier.edition_component = edition_obj
|
|
40
|
-
identifier.revision = "r1"
|
|
41
39
|
true
|
|
42
40
|
end
|
|
43
41
|
|
|
@@ -52,7 +50,6 @@ module Pubid
|
|
|
52
50
|
value: "#{match[1]}-#{match[2]}",
|
|
53
51
|
)
|
|
54
52
|
identifier.edition = nil
|
|
55
|
-
identifier.edition_component = nil
|
|
56
53
|
end
|
|
57
54
|
end
|
|
58
55
|
end
|
|
@@ -6,34 +6,49 @@ module Pubid
|
|
|
6
6
|
# Supplements wrap a base identifier with additional edition information
|
|
7
7
|
#
|
|
8
8
|
# Architecture follows ISO pattern:
|
|
9
|
-
# -
|
|
9
|
+
# - base: The base document being supplemented
|
|
10
10
|
# - edition: Edition information for the supplement
|
|
11
11
|
#
|
|
12
12
|
# Examples:
|
|
13
13
|
# - "NBS CIRC 101e2supp" → CircularSupplement(base: "NBS CIRC 101", edition: e2)
|
|
14
14
|
# - "NBS CIRC 25supp-1924" → CircularSupplement(base: "NBS CIRC 25", edition: 1924)
|
|
15
|
-
class SupplementIdentifier <
|
|
16
|
-
attribute :
|
|
15
|
+
class SupplementIdentifier < Identifier
|
|
16
|
+
attribute :base, Identifier, polymorphic: true
|
|
17
17
|
|
|
18
|
-
# Delegate publisher to
|
|
18
|
+
# Delegate publisher to base
|
|
19
19
|
def publisher
|
|
20
|
-
|
|
20
|
+
base&.publisher
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
# Delegate series to
|
|
23
|
+
# Delegate series to base
|
|
24
24
|
def series
|
|
25
|
-
|
|
25
|
+
base&.series
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
+
# Four exits — a date range, a base-less delegation, an update form and
|
|
29
|
+
# the canonical one — so the composition stays whole in its own method
|
|
30
|
+
# and `to_s` wraps its single result. `super` is not reachable from a
|
|
31
|
+
# private method, so it is handed in as a block.
|
|
28
32
|
def to_s(format = :short)
|
|
33
|
+
annotated = format.is_a?(Hash) ? format[:annotated] : nil
|
|
34
|
+
format = format[:format] || :short if format.is_a?(Hash)
|
|
35
|
+
|
|
36
|
+
rendered = render_plain(format) { super(format) }
|
|
37
|
+
|
|
38
|
+
annotate_plain_render(rendered, annotated: annotated)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def render_plain(format)
|
|
29
44
|
# Handle date range supplements (no base identifier)
|
|
30
45
|
if supplement_date_range_start && supplement_date_range_end
|
|
31
46
|
return "NBS CIRC sup#{supplement_date_range_start}-#{supplement_date_range_end}"
|
|
32
47
|
end
|
|
33
48
|
|
|
34
|
-
return
|
|
49
|
+
return yield unless base
|
|
35
50
|
|
|
36
|
-
result =
|
|
51
|
+
result = base.to_s(format)
|
|
37
52
|
|
|
38
53
|
# NEW: Handle update attribute (e.g., "Upd12-1926" for supplement patterns)
|
|
39
54
|
if update
|
data/lib/pubid/nist.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module Nist
|
|
5
6
|
extend Pubid::PrefixesSupport
|
|
@@ -21,7 +22,7 @@ module Pubid
|
|
|
21
22
|
autoload :CircularSupplementBuilder, "#{__dir__}/nist/circular_supplement_builder"
|
|
22
23
|
autoload :Components, "#{__dir__}/nist/components"
|
|
23
24
|
autoload :Configuration, "#{__dir__}/nist/configuration"
|
|
24
|
-
autoload :Identifier, "#{__dir__}/nist/
|
|
25
|
+
autoload :Identifier, "#{__dir__}/nist/identifiers/base"
|
|
25
26
|
autoload :Identifiers, "#{__dir__}/nist/identifiers"
|
|
26
27
|
autoload :Parser, "#{__dir__}/nist/parser"
|
|
27
28
|
autoload :ParserOutputNormalizer, "#{__dir__}/nist/parser_output_normalizer"
|
|
@@ -37,7 +38,7 @@ module Pubid
|
|
|
37
38
|
#
|
|
38
39
|
# NIST identifier classes use `typed_stages` (not the `self.type` Hash
|
|
39
40
|
# pattern used by CEN/JCGM/ANSI), so they cannot be auto-discovered.
|
|
40
|
-
#
|
|
41
|
+
# Identifier is the fallback for unmapped series (e.g. AMS, VTS)
|
|
41
42
|
# and must be excluded from typed-stage aggregation.
|
|
42
43
|
IDENTIFIER_TYPES = [
|
|
43
44
|
Identifiers::SpecialPublication,
|
|
@@ -60,15 +61,20 @@ module Pubid
|
|
|
60
61
|
Identifiers::CommercialStandardEmergency,
|
|
61
62
|
Identifiers::CommercialStandardsMonthly,
|
|
62
63
|
Identifiers::DatedDocument,
|
|
63
|
-
|
|
64
|
+
Identifier, # Fallback for unmapped series
|
|
64
65
|
].freeze
|
|
65
66
|
|
|
66
67
|
# Parse a NIST identifier string
|
|
67
68
|
# @param identifier [String] the identifier string to parse
|
|
68
|
-
# @return [
|
|
69
|
+
# @return [Identifier] the parsed identifier
|
|
69
70
|
def self.parse(identifier)
|
|
71
|
+
unless identifier.is_a?(String)
|
|
72
|
+
raise Pubid::Errors::InvalidInputError,
|
|
73
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
74
|
+
end
|
|
75
|
+
|
|
70
76
|
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
71
|
-
raise
|
|
77
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
72
78
|
end
|
|
73
79
|
|
|
74
80
|
# Use the Parser class's preprocessing method
|
|
@@ -87,36 +93,36 @@ module Pubid
|
|
|
87
93
|
end
|
|
88
94
|
|
|
89
95
|
# Per-flavor format registry: inherits global formats, overrides :human
|
|
90
|
-
|
|
91
|
-
|
|
96
|
+
Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
|
|
97
|
+
Identifier.format_registry.register(:human, renderer: Nist::Renderer)
|
|
92
98
|
|
|
93
99
|
# All identifier classes for external consumption (export, website).
|
|
94
|
-
#
|
|
100
|
+
# Identifier is the fallback for unmapped series and is excluded
|
|
95
101
|
# from external type listings.
|
|
96
102
|
# @return [Array<Class>] identifier classes
|
|
97
103
|
def self.identifier_types
|
|
98
|
-
IDENTIFIER_TYPES.reject { |klass| klass ==
|
|
104
|
+
IDENTIFIER_TYPES.reject { |klass| klass == Identifier }
|
|
99
105
|
end
|
|
100
106
|
|
|
101
107
|
# Aggregate TYPED_STAGES from all identifier classes.
|
|
102
|
-
#
|
|
108
|
+
# Identifier is excluded because it has no typed stages and acts
|
|
103
109
|
# as the fallback for unmapped series.
|
|
104
110
|
# @return [Array<Pubid::Components::TypedStage>] all typed stages
|
|
105
111
|
def self.all_typed_stages
|
|
106
112
|
@all_typed_stages ||= identifier_types
|
|
107
|
-
.reject { |klass| klass ==
|
|
113
|
+
.reject { |klass| klass == Identifier }
|
|
108
114
|
.flat_map(&:typed_stages)
|
|
109
115
|
.freeze
|
|
110
116
|
end
|
|
111
117
|
|
|
112
118
|
# Lookup: type code -> identifier class.
|
|
113
|
-
#
|
|
119
|
+
# Identifier is excluded so it never gets selected by type code.
|
|
114
120
|
# @param code [String, Symbol] the type code to find
|
|
115
121
|
# @return [Class, nil] the matching identifier class, or nil
|
|
116
122
|
def self.locate_type(code)
|
|
117
123
|
type_str = code.to_s
|
|
118
124
|
identifier_types
|
|
119
|
-
.reject { |klass| klass ==
|
|
125
|
+
.reject { |klass| klass == Identifier }
|
|
120
126
|
.find { |klass| klass.typed_stages.any? { |ts| ts.type_code.to_s == type_str } }
|
|
121
127
|
end
|
|
122
128
|
|