pubid 2.0.0.pre.alpha.7 → 2.0.0.pre.alpha.9
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 +9 -50
- 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/data/nist/series.yaml +155 -0
- data/data/nist/update_codes.yaml +8 -0
- data/lib/pubid/adobe/builder.rb +52 -0
- data/lib/pubid/adobe/identifier.rb +49 -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 +128 -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 +60 -0
- data/lib/pubid/amca/builder.rb +2 -2
- data/lib/pubid/amca/identifier.rb +1 -3
- data/lib/pubid/amca/identifiers/base.rb +1 -6
- data/lib/pubid/amca/identifiers/interpretation.rb +1 -1
- data/lib/pubid/amca/identifiers/publication.rb +1 -1
- data/lib/pubid/amca/identifiers/standard.rb +1 -1
- data/lib/pubid/amca/identifiers.rb +0 -1
- data/lib/pubid/amca/single_identifier.rb +1 -1
- data/lib/pubid/amca.rb +3 -3
- data/lib/pubid/ashrae/builder.rb +22 -22
- data/lib/pubid/ashrae/identifier.rb +3 -4
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +1 -1
- data/lib/pubid/ashrae/identifiers/addendum.rb +1 -1
- data/lib/pubid/ashrae/identifiers/base.rb +14 -8
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +1 -1
- data/lib/pubid/ashrae/identifiers.rb +0 -1
- data/lib/pubid/ashrae/parser.rb +14 -9
- data/lib/pubid/ashrae/renderer.rb +19 -19
- data/lib/pubid/ashrae/single_identifier.rb +1 -1
- data/lib/pubid/ashrae/supplement_identifier.rb +6 -6
- data/lib/pubid/ashrae.rb +3 -3
- data/lib/pubid/bipm/builder.rb +107 -0
- data/lib/pubid/bipm/identifier.rb +160 -0
- data/lib/pubid/bipm/identifiers/committee_document.rb +24 -0
- data/lib/pubid/bipm/identifiers/guide.rb +24 -0
- data/lib/pubid/bipm/identifiers/meeting.rb +41 -0
- data/lib/pubid/bipm/identifiers/mep.rb +21 -0
- data/lib/pubid/bipm/identifiers/metrologia_article.rb +24 -0
- data/lib/pubid/bipm/identifiers/si_brochure.rb +20 -0
- data/lib/pubid/bipm/identifiers.rb +15 -0
- data/lib/pubid/bipm/parser.rb +184 -0
- data/lib/pubid/bipm/renderer.rb +110 -0
- data/lib/pubid/bipm/urn_generator.rb +58 -0
- data/lib/pubid/bipm/urn_parser.rb +52 -0
- data/lib/pubid/bipm.rb +86 -0
- data/lib/pubid/bsi/builder.rb +14 -14
- data/lib/pubid/bsi/identifier.rb +0 -1
- data/lib/pubid/bsi/identifiers/addendum_document.rb +2 -2
- data/lib/pubid/bsi/identifiers/amendment.rb +4 -4
- 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/supplement_document.rb +2 -2
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +6 -6
- data/lib/pubid/bsi/renderer.rb +8 -8
- data/lib/pubid/bsi/single_identifier.rb +48 -0
- data/lib/pubid/builder/base.rb +5 -3
- data/lib/pubid/bundled_identifier.rb +3 -3
- data/lib/pubid/calconnect/builder.rb +38 -0
- data/lib/pubid/calconnect/identifier.rb +117 -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 +77 -0
- data/lib/pubid/ccsds/builder.rb +1 -1
- data/lib/pubid/ccsds/identifier.rb +1 -1
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/ccsds/supplement_identifier.rb +6 -6
- data/lib/pubid/ccsds/urn_generator.rb +3 -3
- data/lib/pubid/cen_cenelec/builder.rb +46 -12
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +2 -2
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +6 -0
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +2 -2
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +60 -3
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +2 -2
- data/lib/pubid/cen_cenelec/renderer.rb +5 -5
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +5 -5
- data/lib/pubid/cen_cenelec/urn_generator.rb +1 -1
- data/lib/pubid/cen_cenelec.rb +76 -72
- data/lib/pubid/cie/builder.rb +139 -24
- data/lib/pubid/cie/identifier.rb +7 -3
- data/lib/pubid/cie/identifiers/bundle.rb +32 -4
- data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
- data/lib/pubid/cie/identifiers/conference.rb +9 -4
- data/lib/pubid/cie/identifiers/corrigendum.rb +17 -23
- data/lib/pubid/cie/identifiers/dual_published.rb +4 -4
- data/lib/pubid/cie/identifiers/identical.rb +7 -7
- data/lib/pubid/cie/identifiers/joint_published.rb +8 -8
- data/lib/pubid/cie/identifiers/proceedings.rb +39 -0
- data/lib/pubid/cie/identifiers/standard.rb +33 -7
- data/lib/pubid/cie/identifiers/supplement.rb +24 -22
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +6 -2
- data/lib/pubid/cie/identifiers.rb +2 -0
- data/lib/pubid/cie/parser.rb +54 -5
- 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 +0 -1
- data/lib/pubid/components/date.rb +21 -5
- data/lib/pubid/csa/builder.rb +1 -1
- data/lib/pubid/csa/composite_identifier.rb +17 -1
- data/lib/pubid/csa/identifier.rb +48 -3
- data/lib/pubid/csa/identifiers/bundled.rb +6 -0
- data/lib/pubid/csa/identifiers/combined.rb +6 -0
- data/lib/pubid/csa/identifiers/package.rb +2 -2
- data/lib/pubid/csa/parser.rb +6 -6
- data/lib/pubid/csa/wrapper_identifier.rb +17 -0
- data/lib/pubid/doi/builder.rb +18 -0
- data/lib/pubid/doi/identifier.rb +46 -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 +55 -0
- data/lib/pubid/easc/builder.rb +55 -0
- data/lib/pubid/easc/identifier.rb +61 -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 +80 -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 +52 -0
- data/lib/pubid/ecma/builder.rb +31 -0
- data/lib/pubid/ecma/identifier.rb +76 -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 +41 -0
- data/lib/pubid/ecma/renderer.rb +46 -0
- data/lib/pubid/ecma/urn_generator.rb +25 -0
- data/lib/pubid/ecma/urn_parser.rb +35 -0
- data/lib/pubid/ecma.rb +67 -0
- data/lib/pubid/etsi/builder.rb +7 -3
- data/lib/pubid/etsi/identifier.rb +1 -3
- data/lib/pubid/etsi/identifiers/base.rb +28 -10
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +128 -4
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +35 -3
- data/lib/pubid/etsi/identifiers.rb +0 -1
- data/lib/pubid/etsi/parser.rb +8 -2
- data/lib/pubid/etsi/renderer.rb +8 -2
- data/lib/pubid/etsi.rb +5 -5
- data/lib/pubid/export/exporter.rb +2 -1
- data/lib/pubid/export/flavor_exporter.rb +18 -3
- data/lib/pubid/gb/builder.rb +45 -0
- data/lib/pubid/gb/identifier.rb +64 -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 +87 -0
- data/lib/pubid/gost/builder.rb +148 -0
- data/lib/pubid/gost/identifier.rb +49 -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 +97 -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 +49 -0
- data/lib/pubid/iala/builder.rb +22 -27
- data/lib/pubid/iala/identifier.rb +27 -2
- data/lib/pubid/iala/identifiers/advice.rb +1 -1
- data/lib/pubid/iala/identifiers/annex.rb +14 -12
- 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/renderer.rb +1 -1
- data/lib/pubid/iala/urn_generator.rb +1 -1
- data/lib/pubid/iala/urn_parser.rb +19 -2
- data/lib/pubid/iala.rb +4 -4
- data/lib/pubid/iana/builder.rb +20 -0
- data/lib/pubid/iana/identifier.rb +72 -0
- data/lib/pubid/iana/identifiers/registry.rb +33 -0
- data/lib/pubid/iana/identifiers.rb +9 -0
- data/lib/pubid/iana/parser.rb +38 -0
- data/lib/pubid/iana/renderer.rb +29 -0
- data/lib/pubid/iana/urn_generator.rb +15 -0
- data/lib/pubid/iana/urn_parser.rb +24 -0
- data/lib/pubid/iana.rb +69 -0
- data/lib/pubid/identifier.rb +210 -23
- data/lib/pubid/idf/builder.rb +1 -1
- data/lib/pubid/idf/parser.rb +2 -2
- data/lib/pubid/idf/renderer.rb +1 -1
- data/lib/pubid/idf/supplement_identifier.rb +3 -3
- data/lib/pubid/iec/builder.rb +35 -25
- data/lib/pubid/iec/identifier.rb +47 -2
- data/lib/pubid/iec/identifiers/base.rb +2 -2
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +6 -0
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +11 -11
- data/lib/pubid/iec/identifiers/international_standard.rb +8 -5
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +12 -12
- data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +1 -1
- data/lib/pubid/iec/identifiers/technical_specification.rb +1 -1
- data/lib/pubid/iec/identifiers/vap_identifier.rb +12 -12
- data/lib/pubid/iec/identifiers.rb +1 -0
- data/lib/pubid/iec/parser.rb +51 -10
- data/lib/pubid/iec/renderer.rb +18 -8
- data/lib/pubid/iec/single_identifier.rb +1 -1
- data/lib/pubid/iec/supplement_identifier.rb +32 -19
- data/lib/pubid/iec.rb +1 -6
- data/lib/pubid/ieee/aiee/builder.rb +17 -3
- data/lib/pubid/ieee/aiee/identifier.rb +45 -61
- data/lib/pubid/ieee/builder.rb +341 -68
- 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 +30 -5
- data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
- data/lib/pubid/ieee/identifiers/base.rb +106 -13
- 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 +3 -3
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +3 -3
- data/lib/pubid/ieee/identifiers/dual_published.rb +3 -3
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +102 -5
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +2 -1
- data/lib/pubid/ieee/identifiers/joint_development.rb +56 -11
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +1 -1
- 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/nesc/builder.rb +33 -20
- data/lib/pubid/ieee/nesc/parser.rb +15 -14
- data/lib/pubid/ieee/parser.rb +461 -43
- data/lib/pubid/ieee/pre_parser.rb +1 -1
- data/lib/pubid/ieee/renderer.rb +154 -57
- data/lib/pubid/ieee/typed_stages.rb +12 -1
- data/lib/pubid/ieee/urn_generator.rb +3 -5
- data/lib/pubid/ieee.rb +56 -3
- data/lib/pubid/ietf/builder.rb +62 -0
- data/lib/pubid/ietf/identifier.rb +5 -0
- data/lib/pubid/ietf/identifiers/base.rb +75 -0
- data/lib/pubid/ietf/identifiers/bcp.rb +25 -0
- data/lib/pubid/ietf/identifiers/fyi.rb +25 -0
- data/lib/pubid/ietf/identifiers/internet_draft.rb +29 -0
- data/lib/pubid/ietf/identifiers/rfc.rb +25 -0
- data/lib/pubid/ietf/identifiers/std.rb +25 -0
- data/lib/pubid/ietf/identifiers.rb +13 -0
- data/lib/pubid/ietf/parser.rb +43 -0
- data/lib/pubid/ietf/renderer.rb +26 -0
- data/lib/pubid/ietf/urn_generator.rb +23 -0
- data/lib/pubid/ietf/urn_parser.rb +35 -0
- data/lib/pubid/ietf.rb +76 -0
- data/lib/pubid/iho/identifier.rb +1 -3
- data/lib/pubid/iho/identifiers/base.rb +1 -7
- 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.rb +7 -7
- data/lib/pubid/isbn/builder.rb +44 -0
- data/lib/pubid/isbn/check_digit.rb +53 -0
- data/lib/pubid/isbn/identifier.rb +63 -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 +52 -0
- data/lib/pubid/iso/builder.rb +9 -4
- data/lib/pubid/iso/combined_identifier.rb +2 -2
- data/lib/pubid/iso/identifier.rb +17 -1
- data/lib/pubid/iso/identifiers/directives_supplement.rb +8 -8
- data/lib/pubid/iso/normalizer.rb +2 -2
- data/lib/pubid/iso/parser.rb +16 -12
- 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/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 +6 -28
- 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 +341 -23
- 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 +480 -26
- data/lib/pubid/itu/urn_generator.rb +36 -6
- data/lib/pubid/itu/urn_parser.rb +8 -0
- data/lib/pubid/itu.rb +11 -3
- data/lib/pubid/jcgm/builder.rb +23 -13
- 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 +66 -6
- data/lib/pubid/jcgm/renderer.rb +26 -12
- data/lib/pubid/jcgm/single_identifier.rb +74 -5
- 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 +15 -3
- data/lib/pubid/jis/identifier.rb +52 -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/supplement.rb +5 -2
- data/lib/pubid/nist/configuration.rb +7 -1
- data/lib/pubid/nist/identifier.rb +1 -3
- data/lib/pubid/nist/identifiers/base.rb +121 -37
- data/lib/pubid/nist/identifiers/circular.rb +1 -1
- 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 +1 -1
- data/lib/pubid/nist/identifiers/crpl_report.rb +1 -1
- 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 +1 -1
- data/lib/pubid/nist/identifiers/internal_report.rb +1 -1
- data/lib/pubid/nist/identifiers/letter_circular.rb +1 -1
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +1 -1
- data/lib/pubid/nist/identifiers/monograph.rb +1 -1
- 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 +1 -1
- 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 +29 -4
- data/lib/pubid/nist/preprocessor.rb +15 -0
- data/lib/pubid/nist/router.rb +3 -2
- data/lib/pubid/nist/series/ir.rb +0 -3
- data/lib/pubid/nist/supplement_identifier.rb +9 -9
- data/lib/pubid/nist.rb +13 -12
- data/lib/pubid/oasis/builder.rb +77 -0
- data/lib/pubid/oasis/identifier.rb +82 -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 +74 -0
- data/lib/pubid/ogc/builder.rb +33 -0
- data/lib/pubid/ogc/identifier.rb +77 -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 +71 -0
- data/lib/pubid/oiml/builder.rb +31 -7
- data/lib/pubid/oiml/identifier.rb +9 -1
- data/lib/pubid/oiml/parser.rb +11 -12
- data/lib/pubid/oiml/renderer.rb +13 -13
- data/lib/pubid/oiml/single_identifier.rb +20 -0
- data/lib/pubid/oiml/supplement_identifier.rb +9 -9
- data/lib/pubid/oiml/urn_parser.rb +23 -6
- data/lib/pubid/oiml.rb +4 -0
- data/lib/pubid/omg/builder.rb +19 -0
- data/lib/pubid/omg/identifier.rb +44 -0
- data/lib/pubid/omg/identifiers/specification.rb +32 -0
- data/lib/pubid/omg/identifiers.rb +9 -0
- data/lib/pubid/omg/parser.rb +40 -0
- data/lib/pubid/omg/renderer.rb +19 -0
- data/lib/pubid/omg.rb +51 -0
- data/lib/pubid/parsers/mr_string.rb +101 -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 +15 -5
- data/lib/pubid/plateau/renderer.rb +1 -1
- data/lib/pubid/plateau/supplement_identifier.rb +11 -11
- data/lib/pubid/plateau.rb +4 -4
- data/lib/pubid/renderers/human_readable.rb +3 -1
- data/lib/pubid/renderers/mr_string.rb +46 -4
- data/lib/pubid/renderers/supplement_renderer.rb +1 -1
- data/lib/pubid/rendering/supplement.rb +4 -4
- data/lib/pubid/sae/builder.rb +1 -1
- data/lib/pubid/sae/identifier.rb +1 -3
- data/lib/pubid/sae/identifiers/base.rb +10 -7
- data/lib/pubid/sae/identifiers.rb +0 -1
- data/lib/pubid/sae.rb +3 -3
- data/lib/pubid/tgpp/builder.rb +41 -0
- data/lib/pubid/tgpp/identifier.rb +91 -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 +62 -0
- data/lib/pubid/tgpp/renderer.rb +36 -0
- data/lib/pubid/tgpp/urn_generator.rb +20 -0
- data/lib/pubid/tgpp/urn_parser.rb +28 -0
- data/lib/pubid/tgpp.rb +78 -0
- data/lib/pubid/type_resolver.rb +59 -0
- data/lib/pubid/un/builder.rb +42 -0
- data/lib/pubid/un/identifier.rb +37 -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 +46 -0
- data/lib/pubid/version.rb +1 -1
- data/lib/pubid/w3c/builder.rb +55 -0
- data/lib/pubid/w3c/identifier.rb +101 -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 +67 -0
- data/lib/pubid/xsf/builder.rb +17 -0
- data/lib/pubid/xsf/identifier.rb +62 -0
- data/lib/pubid/xsf/identifiers/xep.rb +31 -0
- data/lib/pubid/xsf/identifiers.rb +9 -0
- data/lib/pubid/xsf/parser.rb +25 -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 +76 -0
- data/lib/pubid.rb +25 -1
- metadata +205 -4
- data/lib/pubid/cie/components/code.rb +0 -80
- data/lib/pubid/iala/identifiers/base.rb +0 -14
data/lib/pubid/gb.rb
ADDED
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
# Chinese Standard (GB) flavor.
|
|
5
|
+
#
|
|
6
|
+
# Covers national (GB), sector/industry (DB, QB, ZB, HB, JB, NY, YY, HJ,
|
|
7
|
+
# CJ, JG, MH, SL, DL, TB, TD, ...) and social-group (T/{ORG}) standards
|
|
8
|
+
# issued under the Chinese standards system. The mandate category is
|
|
9
|
+
# carried after a slash: T (recommended), Z (guideline), or omitted
|
|
10
|
+
# (mandatory).
|
|
11
|
+
module Gb
|
|
12
|
+
extend Pubid::PrefixesSupport
|
|
13
|
+
|
|
14
|
+
# Leading tokens a printed Chinese Standard identifier may start with.
|
|
15
|
+
# Used by relaton to route reference strings to this flavor. National
|
|
16
|
+
# "GB" comes first so PrefixesSupport's longest-match wins.
|
|
17
|
+
PREFIXES = %w[
|
|
18
|
+
GB GB/T GB/Z
|
|
19
|
+
DB DB/T DB/Z
|
|
20
|
+
QB QB/T
|
|
21
|
+
ZB ZB/T
|
|
22
|
+
HB HB/T
|
|
23
|
+
JB JB/T
|
|
24
|
+
NY NY/T
|
|
25
|
+
YY YY/T
|
|
26
|
+
HJ HJ/T
|
|
27
|
+
CJ CJ/T
|
|
28
|
+
JG JG/T
|
|
29
|
+
MH MH/T
|
|
30
|
+
SL SL/T
|
|
31
|
+
DL DL/T
|
|
32
|
+
TB TB/T
|
|
33
|
+
TD TD/T
|
|
34
|
+
T/
|
|
35
|
+
].freeze
|
|
36
|
+
|
|
37
|
+
autoload :Builder, "#{__dir__}/gb/builder"
|
|
38
|
+
autoload :Identifier, "#{__dir__}/gb/identifier"
|
|
39
|
+
autoload :Identifiers, "#{__dir__}/gb/identifiers"
|
|
40
|
+
autoload :Parser, "#{__dir__}/gb/parser"
|
|
41
|
+
autoload :Renderer, "#{__dir__}/gb/renderer"
|
|
42
|
+
|
|
43
|
+
# Parse a Chinese Standard identifier string.
|
|
44
|
+
# @param identifier [String] e.g. "GB/T 20223-2006"
|
|
45
|
+
# @return [Pubid::Gb::Identifier]
|
|
46
|
+
def self.parse(identifier)
|
|
47
|
+
Identifier.parse(identifier)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
|
|
51
|
+
Identifier.format_registry.register(:human, renderer: Gb::Renderer)
|
|
52
|
+
|
|
53
|
+
# Auto-discover concrete identifier types.
|
|
54
|
+
# @return [Array<Class>]
|
|
55
|
+
def self.identifier_types
|
|
56
|
+
@identifier_types ||= Identifiers.constants
|
|
57
|
+
.filter_map do |c|
|
|
58
|
+
|
|
59
|
+
Identifiers.const_get(c); rescue NameError; nil
|
|
60
|
+
|
|
61
|
+
end
|
|
62
|
+
.select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
|
|
63
|
+
.select { |c| c.type.is_a?(Hash) }
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def self.all_typed_stages
|
|
67
|
+
@all_typed_stages ||= identifier_types.flat_map do |klass|
|
|
68
|
+
klass.const_defined?(:TYPED_STAGES) ? klass.const_get(:TYPED_STAGES) : []
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def self.locate_type(code)
|
|
73
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.locate_stage(abbr)
|
|
77
|
+
abbr_str = abbr.to_s.upcase
|
|
78
|
+
all_typed_stages.find do |s|
|
|
79
|
+
s.abbr.any? do |a|
|
|
80
|
+
a.to_s.upcase == abbr_str
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
Pubid::Registry.register(:gb, Pubid::Gb)
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
# Builds a GOST identifier object from the Parslet parse tree.
|
|
6
|
+
class Builder
|
|
7
|
+
NUMBER_YEAR_SPLIT = /\A(.+?)\s*[-—–]\s*(\d{2}|\d{4})\z/.freeze
|
|
8
|
+
|
|
9
|
+
# Cyrillic → Latin copublisher normalization. Compound forms
|
|
10
|
+
# (with /) are included.
|
|
11
|
+
COPUBLISHER_MAP = {
|
|
12
|
+
"ИСО" => "ISO", "МЭК" => "IEC", "ЕН" => "EN",
|
|
13
|
+
"ИСО/МЭК" => "ISO/IEC", "МЭК/ИСО" => "IEC/ISO",
|
|
14
|
+
"ИСО/ТУ" => "ISO/TS", "ИСО/ТО" => "ISO/TR",
|
|
15
|
+
"МЭК/ТУ" => "IEC/TS", "МЭК/ТО" => "IEC/TR",
|
|
16
|
+
"ИСО/МЭК/ТУ" => "ISO/IEC/TS",
|
|
17
|
+
}.freeze
|
|
18
|
+
|
|
19
|
+
# Cyrillic → Latin subtype normalization.
|
|
20
|
+
SUBTYPE_MAP = {
|
|
21
|
+
"МФС" => "ISP",
|
|
22
|
+
"ТУ" => "TS", "ТО" => "TR",
|
|
23
|
+
}.freeze
|
|
24
|
+
|
|
25
|
+
def build(parsed)
|
|
26
|
+
base = build_base(parsed)
|
|
27
|
+
with_foreign_adoption(base, parsed)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.build(parsed)
|
|
31
|
+
new.build(parsed)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def build_base(parsed)
|
|
37
|
+
russian = parsed[:scope_r] ? true : false
|
|
38
|
+
copublisher, subtype = split_prefix(stringify(parsed[:prefix_text]))
|
|
39
|
+
number, year = split_number_year(stringify(parsed[:raw]))
|
|
40
|
+
|
|
41
|
+
klass = russian ? Identifiers::NationalStandard : Identifiers::InterstateStandard
|
|
42
|
+
klass.new(**{
|
|
43
|
+
copublisher: copublisher,
|
|
44
|
+
subtype: subtype,
|
|
45
|
+
number: number,
|
|
46
|
+
year: year,
|
|
47
|
+
}.compact)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Apply the slash (IdenticalAdoption) and/or parens (Harmonized)
|
|
51
|
+
# wrappers around the base standard. Both can apply simultaneously.
|
|
52
|
+
def with_foreign_adoption(base, parsed)
|
|
53
|
+
wrapper = wrap_identical_adoption(base, parsed)
|
|
54
|
+
wrap_harmonized(wrapper, parsed)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def wrap_identical_adoption(base, parsed)
|
|
58
|
+
adopted_raw = stringify(parsed[:adopted_raw])
|
|
59
|
+
return base unless adopted_raw
|
|
60
|
+
|
|
61
|
+
adopted = parse_foreign(adopted_raw)
|
|
62
|
+
Identifiers::IdenticalAdoption.new(base: base, adopted: adopted)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def wrap_harmonized(base, parsed)
|
|
66
|
+
reference_raw = stringify(parsed[:adopted_reference_raw])
|
|
67
|
+
return base unless reference_raw
|
|
68
|
+
|
|
69
|
+
items = reference_raw.split(",").map(&:strip).map { |s| normalize_foreign(s) }
|
|
70
|
+
adopted = items.map { |item| adopt_identifier(item) }
|
|
71
|
+
|
|
72
|
+
Identifiers::Harmonized.new(base: base, adopted_identifiers: adopted)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Parse a single foreign identifier, falling back to a
|
|
76
|
+
# ForeignReference that preserves the raw surface form when no
|
|
77
|
+
# registered flavor recognizes it (e.g. OECD, UNECE STANDARD).
|
|
78
|
+
def adopt_identifier(raw)
|
|
79
|
+
parse_foreign(raw) || Identifiers::ForeignReference.new(raw: raw)
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def split_prefix(text)
|
|
83
|
+
return [nil, nil] unless text
|
|
84
|
+
|
|
85
|
+
tokens = text.strip.split(/\s+/)
|
|
86
|
+
copublisher_raw = tokens.first
|
|
87
|
+
subtype_raw = tokens.size > 1 ? tokens.drop(1).join(" ") : nil
|
|
88
|
+
|
|
89
|
+
[normalize_copublisher(copublisher_raw), normalize_subtype(subtype_raw)]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def normalize_copublisher(raw)
|
|
93
|
+
return nil unless raw
|
|
94
|
+
COPUBLISHER_MAP.fetch(raw) { raw.upcase }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def normalize_subtype(raw)
|
|
98
|
+
return nil unless raw
|
|
99
|
+
SUBTYPE_MAP.fetch(raw) { raw }
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Normalize a leading Cyrillic publisher token (e.g. "ИСО") to its
|
|
103
|
+
# Latin equivalent so a foreign parser can recognize it. Longest
|
|
104
|
+
# keys first so "ИСО/МЭК" wins over "ИСО".
|
|
105
|
+
def normalize_foreign(raw)
|
|
106
|
+
COPUBLISHER_MAP.keys.sort_by(&:length).reverse.each do |cyr|
|
|
107
|
+
next unless raw.start_with?(cyr + " ") || raw.start_with?(cyr + "/")
|
|
108
|
+
|
|
109
|
+
return COPUBLISHER_MAP[cyr] + raw[cyr.length..]
|
|
110
|
+
end
|
|
111
|
+
raw
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def split_number_year(raw)
|
|
115
|
+
return [raw, nil] unless raw
|
|
116
|
+
|
|
117
|
+
m = raw.match(NUMBER_YEAR_SPLIT)
|
|
118
|
+
return [raw, nil] unless m
|
|
119
|
+
|
|
120
|
+
[m[1], m[2]]
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# Try every registered flavor (other than GOST itself) as a parser
|
|
124
|
+
# for a foreign adopted identifier. Returns the first successful
|
|
125
|
+
# parse, or nil if none recognize the string.
|
|
126
|
+
def parse_foreign(raw)
|
|
127
|
+
::Pubid.eager_load_flavors!
|
|
128
|
+
::Pubid::Registry.flavors.each_value do |mod|
|
|
129
|
+
next if mod == ::Pubid::Gost
|
|
130
|
+
|
|
131
|
+
begin
|
|
132
|
+
return mod.parse(raw)
|
|
133
|
+
rescue StandardError
|
|
134
|
+
next
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
nil
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
def stringify(value)
|
|
141
|
+
return nil if value.nil?
|
|
142
|
+
|
|
143
|
+
str = value.to_s
|
|
144
|
+
str.empty? ? nil : str
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
# Base class for all GOST identifiers.
|
|
6
|
+
#
|
|
7
|
+
# GOST identifiers observed in the wild have the shape:
|
|
8
|
+
#
|
|
9
|
+
# GOST [R ][<copublisher> ][<subtype> ]<number>[-<year>][/<adopted>][(<refs>)]
|
|
10
|
+
#
|
|
11
|
+
# Where /<adopted> is the IDT slash form (modeled by IdenticalAdoption)
|
|
12
|
+
# and (<refs>) is the parenthesized harmonization list (modeled by
|
|
13
|
+
# Harmonized). A bare InterstateStandard/NationalStandard has neither.
|
|
14
|
+
class Identifier < ::Pubid::Identifier
|
|
15
|
+
def self.parse(identifier)
|
|
16
|
+
parsed = Parser.parse(identifier)
|
|
17
|
+
Builder.build(parsed)
|
|
18
|
+
rescue Parslet::ParseFailed => e
|
|
19
|
+
raise "Failed to parse GOST identifier '#{identifier}': #{e.message}"
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
attribute :publisher, :string, default: "GOST"
|
|
23
|
+
attribute :copublisher, :string
|
|
24
|
+
attribute :subtype, :string
|
|
25
|
+
attribute :number, :string
|
|
26
|
+
attribute :year, :string
|
|
27
|
+
|
|
28
|
+
GOST_TYPE_MAP = {
|
|
29
|
+
"pubid:gost:interstate-standard" => "Pubid::Gost::Identifiers::InterstateStandard",
|
|
30
|
+
"pubid:gost:national-standard" => "Pubid::Gost::Identifiers::NationalStandard",
|
|
31
|
+
"pubid:gost:identical-adoption" => "Pubid::Gost::Identifiers::IdenticalAdoption",
|
|
32
|
+
"pubid:gost:harmonized" => "Pubid::Gost::Identifiers::Harmonized",
|
|
33
|
+
"pubid:gost:foreign-reference" => "Pubid::Gost::Identifiers::ForeignReference",
|
|
34
|
+
}.freeze
|
|
35
|
+
|
|
36
|
+
key_value do
|
|
37
|
+
map "_type", to: :_type, polymorphic_map: GOST_TYPE_MAP
|
|
38
|
+
map "copublisher", to: :copublisher
|
|
39
|
+
map "subtype", to: :subtype
|
|
40
|
+
map "number", to: :number
|
|
41
|
+
map "year", to: :year
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def to_urn
|
|
45
|
+
UrnGenerator.new(self).generate
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Foreign reference captured verbatim when no registered flavor can
|
|
7
|
+
# parse the adopted identifier (e.g. "OECD 460:2017",
|
|
8
|
+
# "UNECE STANDARD FFV-18:2011"). It preserves the raw surface form
|
|
9
|
+
# for round-trip rendering without modelling the foreign standard's
|
|
10
|
+
# internal structure. Quacks like Pubid::Identifier for rendering
|
|
11
|
+
# and serialization.
|
|
12
|
+
class ForeignReference < Identifier
|
|
13
|
+
attribute :raw, :string
|
|
14
|
+
|
|
15
|
+
def self.type
|
|
16
|
+
{ key: :"foreign-reference", title: "Foreign Reference", short: nil }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_s
|
|
20
|
+
raw.to_s
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Harmonized standard. The GOST has been officially aligned with,
|
|
7
|
+
# modified from, or adopted directly from one or more foreign
|
|
8
|
+
# (typically ISO/IEC) standards. The parenthesized form is the
|
|
9
|
+
# Russian/CIS garmonizatsiya convention.
|
|
10
|
+
#
|
|
11
|
+
# Examples:
|
|
12
|
+
# ГОСТ 25346-2013 (ISO 286-1:2010)
|
|
13
|
+
# ГОСТ 6032-2017 (ISO 3651-1:1998, ISO 3651-2:1998)
|
|
14
|
+
# ГОСТ 6996-66 (ИСО 4136-89, ИСО 5173-81, ИСО 5177-81)
|
|
15
|
+
#
|
|
16
|
+
# One GOST may harmonize with multiple foreign standards at once.
|
|
17
|
+
# The slash form (IdenticalAdoption) is reserved for the strict IDT case.
|
|
18
|
+
class Harmonized < Identifier
|
|
19
|
+
attribute :base, ::Pubid::Gost::Identifier, polymorphic: true
|
|
20
|
+
attribute :adopted_identifiers, ::Pubid::Identifier,
|
|
21
|
+
collection: true, polymorphic: true
|
|
22
|
+
|
|
23
|
+
key_value do
|
|
24
|
+
map "base", to: :base
|
|
25
|
+
map "adopted_identifiers", to: :adopted_identifiers
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.type
|
|
29
|
+
{ key: :harmonized, title: "Harmonized Standard", short: nil }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def number; base&.number; end
|
|
33
|
+
def year; base&.year; end
|
|
34
|
+
def copublisher; base&.copublisher; end
|
|
35
|
+
def subtype; base&.subtype; end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
module Identifiers
|
|
6
|
+
# Identical adoption (IDT per ISO Guide 2). The GOST is
|
|
7
|
+
# structurally and technically identical to the adopted
|
|
8
|
+
# foreign standard. The slash IS part of the official
|
|
9
|
+
# GOST designation.
|
|
10
|
+
#
|
|
11
|
+
# Examples:
|
|
12
|
+
# ГОСТ 31610.18-2016/IEC 60079-18:2014
|
|
13
|
+
# ГОСТ Р 58904-2020/ISO/TR 25901-1:2016
|
|
14
|
+
# ГОСТ 31425.5-2025/ISO 9902-5:2001
|
|
15
|
+
#
|
|
16
|
+
# The MOD and NEQ degrees are NOT modeled here — they're
|
|
17
|
+
# bibliographic metadata (Relaton relations), not part of the
|
|
18
|
+
# identifier.
|
|
19
|
+
class IdenticalAdoption < Identifier
|
|
20
|
+
attribute :base, ::Pubid::Gost::Identifier, polymorphic: true
|
|
21
|
+
attribute :adopted, ::Pubid::Identifier, polymorphic: true
|
|
22
|
+
|
|
23
|
+
key_value do
|
|
24
|
+
map "base", to: :base
|
|
25
|
+
map "adopted", to: :adopted
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def self.type
|
|
29
|
+
{ key: :"identical-adoption", title: "Identical Adoption", short: nil }
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def number; base&.number; end
|
|
33
|
+
def year; base&.year; end
|
|
34
|
+
def copublisher; base&.copublisher; end
|
|
35
|
+
def subtype; base&.subtype; end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
module Identifiers
|
|
6
|
+
# ГОСТ (bare) — interstate standard. Issued by МГС
|
|
7
|
+
# (Межгосударственный совет по стандартизации).
|
|
8
|
+
#
|
|
9
|
+
# Examples:
|
|
10
|
+
# ГОСТ 14946-82 (dated)
|
|
11
|
+
# ГОСТ 2.312 (undated)
|
|
12
|
+
# ГОСТ ISO 9692-1 (copublisher + part, undated)
|
|
13
|
+
class InterstateStandard < Identifier
|
|
14
|
+
def self.type
|
|
15
|
+
{ key: :"interstate-standard", title: "Interstate Standard", short: nil }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
module Identifiers
|
|
6
|
+
# ГОСТ Р — Russian national standard. Issued by Росстандарт.
|
|
7
|
+
#
|
|
8
|
+
# Examples:
|
|
9
|
+
# ГОСТ Р 71039-2023 (dated)
|
|
10
|
+
# ГОСТ Р МЭК 60794-1-23-2017 (copublisher, dated)
|
|
11
|
+
# ГОСТ Р ИСО/МЭК МФС 10609-9-95 (compound copublisher + subtype)
|
|
12
|
+
class NationalStandard < Identifier
|
|
13
|
+
def self.type
|
|
14
|
+
{ key: :"national-standard", title: "National Standard", short: "R" }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
module Identifiers
|
|
6
|
+
autoload :InterstateStandard, "#{__dir__}/identifiers/interstate_standard"
|
|
7
|
+
autoload :NationalStandard, "#{__dir__}/identifiers/national_standard"
|
|
8
|
+
autoload :IdenticalAdoption, "#{__dir__}/identifiers/identical_adoption"
|
|
9
|
+
autoload :Harmonized, "#{__dir__}/identifiers/harmonized"
|
|
10
|
+
autoload :ForeignReference, "#{__dir__}/identifiers/foreign_reference"
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Gost
|
|
7
|
+
# Parslet grammar for GOST identifiers.
|
|
8
|
+
#
|
|
9
|
+
# Accepts the Latin and Cyrillic surface forms observed in the wild:
|
|
10
|
+
#
|
|
11
|
+
# ГОСТ 14946-82 (interstate, dated)
|
|
12
|
+
# ГОСТ 2.312 (interstate, undated)
|
|
13
|
+
# ГОСТ Р 71039— 2023 (national, em-dash + space)
|
|
14
|
+
# ГОСТ ISO 9692-1 (copublisher, undated)
|
|
15
|
+
# ГОСТ Р МЭК 60794-1-23-2017 (Cyrillic copublisher)
|
|
16
|
+
# ГОСТ Р ИСО/МЭК МФС 10609-9-95 (compound copublisher + subtype)
|
|
17
|
+
# ГОСТ ISO Guide 30-2019 (copublisher + subtype "Guide")
|
|
18
|
+
# ГОСТ Р 58904-2020/ISO/TR 25901-1:2016 (IDT adoption, slash form)
|
|
19
|
+
#
|
|
20
|
+
# The parser captures three atoms:
|
|
21
|
+
# * :scope_r — "R"/"Р" if Russian national, nil if interstate
|
|
22
|
+
# * :prefix_text — everything between scope_r and the number
|
|
23
|
+
# (copublisher, subtype, or both) as a raw string
|
|
24
|
+
# * :raw — digit runs separated by dots/dashes (number+year)
|
|
25
|
+
# * :adopted_raw — the foreign identifier after "/" (IDT adoption)
|
|
26
|
+
#
|
|
27
|
+
# The builder interprets prefix_text (splits copublisher vs subtype,
|
|
28
|
+
# normalizes Cyrillic to Latin) and raw (splits number vs year).
|
|
29
|
+
class Parser < Parslet::Parser
|
|
30
|
+
include ::Pubid::Parser::CommonParseRules
|
|
31
|
+
|
|
32
|
+
root :identifier
|
|
33
|
+
|
|
34
|
+
rule(:space) { str(" ") }
|
|
35
|
+
rule(:space?) { space.maybe }
|
|
36
|
+
rule(:dot) { str(".") }
|
|
37
|
+
|
|
38
|
+
rule(:year_sep) do
|
|
39
|
+
(str("-") | str("—") | str("–")) >> space?.maybe
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
rule(:gost_word) do
|
|
43
|
+
(str("GOST") | str("ГОСТ")).as(:gost_word) >> space
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
rule(:scope_r) do
|
|
47
|
+
(match("R") | match("Р")).as(:scope_r) >> space
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# Everything between scope_r and the first digit: copublisher,
|
|
51
|
+
# subtype, or both. Captured as a raw string — the builder splits
|
|
52
|
+
# it into copublisher + subtype. Matches uppercase letters (Latin
|
|
53
|
+
# and Cyrillic), forward slashes, and spaces between words.
|
|
54
|
+
rule(:prefix_text) do
|
|
55
|
+
(match("[A-ZА-Яa-zа-я/]").repeat(1) >>
|
|
56
|
+
(space >> match("[A-ZА-Яa-zа-я/]").repeat(1)).repeat).as(:prefix_text) >> space
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
rule(:digits) do
|
|
60
|
+
match("[0-9]").repeat(1)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
rule(:raw_body) do
|
|
64
|
+
(digits >> ((dot | year_sep) >> digits).repeat).as(:raw)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# IDT adoption suffix: "/<foreign-identifier>". The slash is
|
|
68
|
+
# consumed but NOT captured — only the foreign identifier text
|
|
69
|
+
# goes into :adopted_raw. Captures everything after the first
|
|
70
|
+
# slash, including subsequent slashes (the adopted identifier
|
|
71
|
+
# may itself contain slashes, e.g. "ISO/TR 25901-1:2016").
|
|
72
|
+
rule(:adopted_part) do
|
|
73
|
+
space?.maybe >> str("/") >> match(".").repeat(1).as(:adopted_raw)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Adoption reference in parens: "(<foreign-id>)". The parens
|
|
77
|
+
# themselves are consumed but NOT captured. The content goes
|
|
78
|
+
# into :adopted_reference_raw. This form appears for MOD/NEQ
|
|
79
|
+
# adoptions where the foreign standard is referenced but not
|
|
80
|
+
# identical (IDT would use the slash form instead).
|
|
81
|
+
rule(:adopted_reference_part) do
|
|
82
|
+
space?.maybe >> str("(") >> match("[^)]").repeat(1).as(:adopted_reference_raw) >> str(")")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
rule(:identifier) do
|
|
86
|
+
gost_word >> scope_r.maybe >> prefix_text.maybe >> raw_body >>
|
|
87
|
+
adopted_part.maybe >> adopted_reference_part.maybe
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def self.parse(string)
|
|
91
|
+
raise ArgumentError, ::Pubid::INPUT_TOO_LONG_MESSAGE if string.length > ::Pubid::MAX_INPUT_LENGTH
|
|
92
|
+
|
|
93
|
+
new.parse(string.strip)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
# Human-readable renderer for GOST identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces canonical Latin-script citations:
|
|
8
|
+
# "GOST 14946-82"
|
|
9
|
+
# "GOST R 34.12-2015"
|
|
10
|
+
# "GOST ISO 9692-1"
|
|
11
|
+
# "GOST R ISO/IEC ISP 10609-9-95"
|
|
12
|
+
# "GOST R 58904-2020/ISO/TR 25901-1:2016"
|
|
13
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
14
|
+
def render(context: nil, **_opts)
|
|
15
|
+
id = @id
|
|
16
|
+
|
|
17
|
+
return render_harmonized(id) if id.is_a?(Identifiers::Harmonized)
|
|
18
|
+
return render_identical_adoption(id) if id.is_a?(Identifiers::IdenticalAdoption)
|
|
19
|
+
return render_standard(id)
|
|
20
|
+
|
|
21
|
+
raise ArgumentError, "Unknown GOST identifier class: #{id.class}"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def render_standard(id)
|
|
27
|
+
rendered = +"GOST"
|
|
28
|
+
rendered << " R" if id.is_a?(Identifiers::NationalStandard)
|
|
29
|
+
rendered << " #{id.copublisher}" if id.copublisher
|
|
30
|
+
rendered << " #{id.subtype}" if id.subtype
|
|
31
|
+
rendered << " #{id.number}"
|
|
32
|
+
rendered << "-#{id.year}" if id.year
|
|
33
|
+
rendered
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def render_identical_adoption(id)
|
|
37
|
+
+"#{id.base.to_s}/#{id.adopted.to_s}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def render_harmonized(id)
|
|
41
|
+
rendered = +id.base.to_s
|
|
42
|
+
adopted = id.adopted_identifiers&.map(&:to_s)&.join(", ")
|
|
43
|
+
rendered << " (#{adopted})" unless adopted.nil? || adopted.empty?
|
|
44
|
+
rendered
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
# Generates URN strings for GOST identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Format:
|
|
8
|
+
# urn:gost:std:<number>[:<year>] (interstate)
|
|
9
|
+
# urn:gost:std:r:<number>[:<year>] (Russian national)
|
|
10
|
+
# urn:gost:std:r:<number>[:<year>] (IdenticalAdoption delegates to base)
|
|
11
|
+
class UrnGenerator
|
|
12
|
+
attr_reader :identifier
|
|
13
|
+
|
|
14
|
+
def initialize(identifier)
|
|
15
|
+
@identifier = identifier
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def generate
|
|
19
|
+
id = identifier
|
|
20
|
+
while id.is_a?(Identifiers::Harmonized) || id.is_a?(Identifiers::IdenticalAdoption)
|
|
21
|
+
id = id.base
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
return generate_for_standard(id) if standard?(id)
|
|
25
|
+
|
|
26
|
+
raise ArgumentError,
|
|
27
|
+
"Unknown GOST identifier class: #{identifier.class}"
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
def generate_for_standard(id)
|
|
33
|
+
parts = ["urn:gost:std"]
|
|
34
|
+
parts << "r" if id.is_a?(Identifiers::NationalStandard)
|
|
35
|
+
parts << id.number.to_s
|
|
36
|
+
parts << id.year.to_s if id.year
|
|
37
|
+
parts.join(":")
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def standard?(id)
|
|
41
|
+
id.is_a?(Identifiers::InterstateStandard) ||
|
|
42
|
+
id.is_a?(Identifiers::NationalStandard)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gost
|
|
5
|
+
# Parses GOST URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits:
|
|
8
|
+
# urn:gost:std:<number>[:<year>] (interstate)
|
|
9
|
+
# urn:gost:std:r:<number>[:<year>] (Russian national)
|
|
10
|
+
#
|
|
11
|
+
# Examples:
|
|
12
|
+
# urn:gost:std:14946:82 → GOST 14946-82
|
|
13
|
+
# urn:gost:std:r:34.12:2015 → GOST R 34.12-2015
|
|
14
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
15
|
+
PREFIX = "urn:gost:std:".freeze
|
|
16
|
+
|
|
17
|
+
def parse_urn(urn)
|
|
18
|
+
body = strip_namespace(urn)
|
|
19
|
+
parts = split_parts(body)
|
|
20
|
+
|
|
21
|
+
if parts.first == "r"
|
|
22
|
+
number = parts[1]
|
|
23
|
+
year = parts[2]
|
|
24
|
+
Identifiers::NationalStandard.new(number: number, year: year)
|
|
25
|
+
else
|
|
26
|
+
number = parts[0]
|
|
27
|
+
year = parts[1]
|
|
28
|
+
Identifiers::InterstateStandard.new(number: number, year: year)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
def strip_namespace(urn)
|
|
35
|
+
unless urn.downcase.start_with?(PREFIX)
|
|
36
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
37
|
+
"Invalid GOST URN: #{urn.inspect}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
urn[PREFIX.length..]
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def split_parts(body)
|
|
44
|
+
parts = body.split(":")
|
|
45
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
46
|
+
"GOST URN missing number: #{body.inspect}" if parts.empty?
|
|
47
|
+
|
|
48
|
+
parts
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|