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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Evs
|
|
5
|
+
module Identifiers
|
|
6
|
+
# The EVS national adoption of a European Standard.
|
|
7
|
+
# Example: "EVS-EN 18216:2026"
|
|
8
|
+
class NationalAdoption < ::Pubid::Evs::Identifier
|
|
9
|
+
attribute :type, Components::Type, default: -> { self.class.type[:key] }
|
|
10
|
+
|
|
11
|
+
def self.type
|
|
12
|
+
{ key: :evs_en, title: "EVS National Adoption of a European Standard" }
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Evs
|
|
7
|
+
# Grammar for the printed EVS national-adoption reference, composed with
|
|
8
|
+
# the CEN/CENELEC parser as an embedded atom (the same pattern ISO uses
|
|
9
|
+
# for IDF joint identifiers, and IEEE for AIEE/IRE/NESC):
|
|
10
|
+
#
|
|
11
|
+
# "EVS" ("-" | " ") <CEN identifier>
|
|
12
|
+
#
|
|
13
|
+
# The adopted portion is parsed by the real CEN grammar — publisher,
|
|
14
|
+
# adopted org, number, parts, year, supplements, edition — and captured
|
|
15
|
+
# as a structured :adopted subtree for the CEN builder.
|
|
16
|
+
#
|
|
17
|
+
# "EVS-EN 18216:2026" → {evs_separator, adopted: {publisher, number, year}}
|
|
18
|
+
# "EVS-EN ISO 9001:2015/A1:2024" → {evs_separator, adopted: {publisher, adopted_string, supplements}}
|
|
19
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
20
|
+
rule(:root) do
|
|
21
|
+
str("EVS") >>
|
|
22
|
+
(str("-") | str(" ")).as(:evs_separator) >>
|
|
23
|
+
::Pubid::CenCenelec::Parser.new.identifier.as(:adopted)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Evs
|
|
5
|
+
# Human-readable renderer for EVS identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces strings like:
|
|
8
|
+
# "EVS-EN 18216:2026"
|
|
9
|
+
# "EVS-EN ISO 14001:2026"
|
|
10
|
+
# "EVS-EN ISO/IEC 27017:2026"
|
|
11
|
+
# "EVS-EN ISO 9001:2015/A1:2024"
|
|
12
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
13
|
+
def render(context: nil, **_opts)
|
|
14
|
+
# The adopted identifier renders with its own "EN …" prefix, so the
|
|
15
|
+
# national prefix composes as "EVS" + separator + adopted.
|
|
16
|
+
"EVS#{separator}#{adopted}"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def separator
|
|
22
|
+
@id.separator || "-"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def adopted
|
|
26
|
+
@id.adopted_identifier.to_s
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Evs
|
|
5
|
+
# URNs mirror the CEN adoption namespace with the national-body prefix:
|
|
6
|
+
#
|
|
7
|
+
# "EVS-EN 18216:2026" → urn:evs:en:18216:2026
|
|
8
|
+
# "EVS-EN ISO 14001:2026" → urn:evs:en:iso:14001:2026
|
|
9
|
+
# "EVS-EN ISO/IEC 27017:2026" → urn:evs:en:iso-iec:27017:2026
|
|
10
|
+
# "EVS-EN ISO 9001:2015/A1:2024" → urn:evs:en:iso:9001:2015:amd:1:2024
|
|
11
|
+
#
|
|
12
|
+
# Generation delegates to the adopted CEN identifier's URN and swaps the
|
|
13
|
+
# `urn:cen:` namespace for `urn:evs:`, so the two stay consistent by
|
|
14
|
+
# construction.
|
|
15
|
+
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
16
|
+
CEN_NAMESPACE = "urn:cen:"
|
|
17
|
+
EVS_NAMESPACE = "urn:evs:"
|
|
18
|
+
|
|
19
|
+
def generate
|
|
20
|
+
adopted_urn = identifier.adopted_identifier.to_urn
|
|
21
|
+
unless adopted_urn.start_with?(CEN_NAMESPACE)
|
|
22
|
+
raise Errors::ParseError,
|
|
23
|
+
"expected adopted CEN URN, got #{adopted_urn.inspect}"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
adopted_urn.sub(/\A#{Regexp.escape(CEN_NAMESPACE)}/o, EVS_NAMESPACE)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Evs
|
|
5
|
+
# Parses `urn:evs:…` URNs back into identifiers, following the same
|
|
6
|
+
# pattern as Pubid::CenCenelec::UrnParser: reassemble the adopted
|
|
7
|
+
# identifier's human text and delegate to the real grammar so every
|
|
8
|
+
# structural check happens in parsers, not in this class.
|
|
9
|
+
#
|
|
10
|
+
# urn:evs:en:18216:2026 → EVS-EN 18216:2026
|
|
11
|
+
# urn:evs:en:iso:14001:2026 → EVS-EN ISO 14001:2026
|
|
12
|
+
# urn:evs:en:iso-iec:27017:2026 → EVS-EN ISO/IEC 27017:2026
|
|
13
|
+
# urn:evs:en:iso:9001:2015:amd:1:2024 → EVS-EN ISO 9001:2015/A1:2024
|
|
14
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
15
|
+
ORGS = {
|
|
16
|
+
"iso" => "ISO",
|
|
17
|
+
"iso-iec" => "ISO/IEC",
|
|
18
|
+
"iec" => "IEC",
|
|
19
|
+
"cispr" => "CISPR",
|
|
20
|
+
}.freeze
|
|
21
|
+
|
|
22
|
+
# UrnGenerator emits "urn:evs:" (national-body namespace).
|
|
23
|
+
def flavor_name
|
|
24
|
+
"evs"
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def parse_urn(urn)
|
|
28
|
+
parts = split_parts(strip_namespace(urn))
|
|
29
|
+
|
|
30
|
+
type = parts.shift
|
|
31
|
+
unless /\Aen\z/i.match?(type)
|
|
32
|
+
raise Errors::ParseError, "unsupported type in #{urn.inspect}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
text = +"EN"
|
|
36
|
+
org_parts = []
|
|
37
|
+
org_parts << parts.shift while parts.first&.match?(/\A[a-z][a-z-]*\z/)
|
|
38
|
+
if org_parts.any?
|
|
39
|
+
org = ORGS.fetch(org_parts.join("-")) do
|
|
40
|
+
raise Errors::ParseError, "unknown adopted org in #{urn.inspect}"
|
|
41
|
+
end
|
|
42
|
+
text << " #{org}"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
number = parts.shift
|
|
46
|
+
year = parts.shift
|
|
47
|
+
unless number
|
|
48
|
+
raise Errors::ParseError,
|
|
49
|
+
"missing number in #{urn.inspect}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
text << " #{number}"
|
|
53
|
+
text << ":#{year}" if year
|
|
54
|
+
|
|
55
|
+
append_supplement(text, parts, urn) unless parts.empty?
|
|
56
|
+
|
|
57
|
+
adopted = Pubid::CenCenelec.parse(text)
|
|
58
|
+
::Pubid::Evs::Identifiers::NationalAdoption.new(
|
|
59
|
+
adopted_identifier: adopted,
|
|
60
|
+
)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
private
|
|
64
|
+
|
|
65
|
+
# Appends the trailing `amd|cor : iteration [: year]` in human form.
|
|
66
|
+
def append_supplement(text, parts, urn)
|
|
67
|
+
year = parts.last&.match?(/\A\d{4}\z/) ? parts.pop : nil
|
|
68
|
+
kind = parts.shift
|
|
69
|
+
iteration = parts.shift
|
|
70
|
+
unless %w[amd cor].include?(kind) && iteration && parts.empty?
|
|
71
|
+
raise Errors::ParseError, "malformed supplement in #{urn.inspect}"
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
text << (kind == "amd" ? "/A#{iteration}" : "/AC#{iteration}")
|
|
75
|
+
text << ":#{year}" if year
|
|
76
|
+
text
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
data/lib/pubid/evs.rb
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pubid"
|
|
4
|
+
module Pubid
|
|
5
|
+
module Evs
|
|
6
|
+
extend Pubid::PrefixesSupport
|
|
7
|
+
|
|
8
|
+
# Leading tokens a printed EVS reference can start with, drawn from the
|
|
9
|
+
# reference PDFs in metanorma/mn-samples-evs-private. Longest first so
|
|
10
|
+
# prefix routing picks the most specific claim. Deliberately EXCLUDES the
|
|
11
|
+
# bare adopted forms ("EN …" alone routes to Pubid::CenCenelec).
|
|
12
|
+
PREFIXES = [
|
|
13
|
+
"EVS-EN ISO/IEC", "EVS-EN ISO", "EVS-EN",
|
|
14
|
+
"EVS EN ISO/IEC", "EVS EN ISO", "EVS EN",
|
|
15
|
+
"EVS"
|
|
16
|
+
].freeze
|
|
17
|
+
|
|
18
|
+
autoload :Builder, "#{__dir__}/evs/builder"
|
|
19
|
+
autoload :Identifier, "#{__dir__}/evs/identifier"
|
|
20
|
+
autoload :Identifiers, "#{__dir__}/evs/identifiers"
|
|
21
|
+
autoload :Parser, "#{__dir__}/evs/parser"
|
|
22
|
+
autoload :Renderer, "#{__dir__}/evs/renderer"
|
|
23
|
+
autoload :UrnGenerator, "#{__dir__}/evs/urn_generator"
|
|
24
|
+
autoload :UrnParser, "#{__dir__}/evs/urn_parser"
|
|
25
|
+
|
|
26
|
+
def self.parse(identifier)
|
|
27
|
+
unless identifier.is_a?(String)
|
|
28
|
+
raise Pubid::Errors::InvalidInputError,
|
|
29
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
33
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
parsed = Parser.new.parse(identifier)
|
|
37
|
+
Builder.new.build(parsed)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Build an EVS identifier from a parse-tree hash.
|
|
41
|
+
# @param hash [Hash] parse tree
|
|
42
|
+
# @return [Pubid::Evs::Identifier]
|
|
43
|
+
def self.build_from_parse(hash)
|
|
44
|
+
Builder.new.build(hash)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Per-flavor format registry: inherits global formats, overrides :human.
|
|
48
|
+
Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
|
|
49
|
+
Identifier.format_registry.register(:human, renderer: Evs::Renderer)
|
|
50
|
+
|
|
51
|
+
# Auto-discover all identifier types from the Identifiers namespace.
|
|
52
|
+
# @return [Array<Class>]
|
|
53
|
+
def self.identifier_types
|
|
54
|
+
@identifier_types ||= Identifiers.constants.filter_map do |c|
|
|
55
|
+
begin
|
|
56
|
+
Identifiers.const_get(c)
|
|
57
|
+
rescue NameError
|
|
58
|
+
nil
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
.select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
|
|
62
|
+
.select { |c| c.type.is_a?(Hash) }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# EVS identifiers have no typed stages.
|
|
66
|
+
# @return [Array<Pubid::Components::TypedStage>]
|
|
67
|
+
def self.all_typed_stages
|
|
68
|
+
@all_typed_stages ||= identifier_types.flat_map do |klass|
|
|
69
|
+
klass.const_defined?(:TYPED_STAGES) ? klass.const_get(:TYPED_STAGES) : []
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Lookup: type code -> identifier class
|
|
74
|
+
# @param code [String, Symbol]
|
|
75
|
+
# @return [Class, nil]
|
|
76
|
+
def self.locate_type(code)
|
|
77
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Lookup: abbreviation -> typed stage
|
|
81
|
+
# @param _abbr [String, Symbol]
|
|
82
|
+
# @return [nil] EVS identifiers have no typed stages
|
|
83
|
+
def self.locate_stage(_abbr)
|
|
84
|
+
nil
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Register EVS flavor with the registry
|
|
90
|
+
Pubid::Registry.register(:evs, Pubid::Evs)
|
|
@@ -9,7 +9,8 @@ module Pubid
|
|
|
9
9
|
class Exporter
|
|
10
10
|
FLAVORS = %i[
|
|
11
11
|
iso iec ieee nist bsi itu cen_cenelec etsi ansi astm ashrae asme
|
|
12
|
-
ccsds cie csa jis jcgm oiml idf api amca plateau sae
|
|
12
|
+
ccsds cie csa ecma jis jcgm oiml idf api amca plateau sae ogc ietf tgpp w3c xsf
|
|
13
|
+
bipm iana oasis calconnect
|
|
13
14
|
].freeze
|
|
14
15
|
|
|
15
16
|
# Export all flavors to a hash suitable for JSON serialization.
|
|
@@ -78,10 +78,25 @@ module Pubid
|
|
|
78
78
|
# Scan Identifiers namespace for all Pubid::Identifier subclasses,
|
|
79
79
|
# excluding structural base classes.
|
|
80
80
|
def discover_from_namespace(mod)
|
|
81
|
-
|
|
81
|
+
if mod.const_defined?(:Identifiers)
|
|
82
|
+
classes = collect_identifier_classes(mod.const_get(:Identifiers))
|
|
83
|
+
return classes unless classes.empty?
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Single-class flavors (e.g. SAE) expose no concrete types under
|
|
87
|
+
# Identifiers — the flavor's own Identifier class IS the sole document
|
|
88
|
+
# type (previously discovered via the removed Identifiers::Base alias).
|
|
89
|
+
Array(single_class_flavor_type(mod))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
# The flavor's own `Identifier` class when it is a concrete
|
|
93
|
+
# Pubid::Identifier subclass, else nil (used as the sole type for
|
|
94
|
+
# single-class flavors with an empty Identifiers namespace).
|
|
95
|
+
def single_class_flavor_type(mod)
|
|
96
|
+
return unless mod.const_defined?(:Identifier)
|
|
82
97
|
|
|
83
|
-
|
|
84
|
-
|
|
98
|
+
ident = mod.const_get(:Identifier)
|
|
99
|
+
ident if ident.is_a?(Class) && ident < Pubid::Identifier
|
|
85
100
|
end
|
|
86
101
|
|
|
87
102
|
# Recursively collect all Pubid::Identifier subclasses from a module,
|
data/lib/pubid/export.rb
CHANGED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gb
|
|
5
|
+
# Builds a Pubid::Gb::Identifier from a parse tree.
|
|
6
|
+
#
|
|
7
|
+
# The parser captures the publisher code verbatim (which may already
|
|
8
|
+
# include the "/T" or "/Z" suffix). The builder normalizes: if the
|
|
9
|
+
# suffix is in the publisher_code string, it's split out into the
|
|
10
|
+
# separate +mandate+ attribute so the renderer can recompose either
|
|
11
|
+
# the inline or split form.
|
|
12
|
+
class Builder
|
|
13
|
+
def self.build(parsed_data)
|
|
14
|
+
new.build(parsed_data)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def build(data)
|
|
18
|
+
publisher_code, mandate = split_mandate(data[:publisher_code].to_s)
|
|
19
|
+
|
|
20
|
+
mandate ||= data[:mandate]&.to_s
|
|
21
|
+
|
|
22
|
+
Identifiers::Standard.new(
|
|
23
|
+
publisher_code: publisher_code,
|
|
24
|
+
mandate: mandate,
|
|
25
|
+
number: data[:number].to_s,
|
|
26
|
+
part: data[:part]&.to_s,
|
|
27
|
+
date: data[:year] ? ::Pubid::Components::Date.new(year: data[:year].to_s) : nil,
|
|
28
|
+
all_parts: !data[:all_parts].to_s.empty?,
|
|
29
|
+
)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
private
|
|
33
|
+
|
|
34
|
+
# If the publisher code carries an inline /T or /Z suffix, split it off
|
|
35
|
+
# and return the cleaned code + extracted mandate.
|
|
36
|
+
def split_mandate(code)
|
|
37
|
+
if code =~ %r{\A(.*?)/(T|Z)\z}
|
|
38
|
+
[Regexp.last_match(1), Regexp.last_match(2)]
|
|
39
|
+
else
|
|
40
|
+
[code, nil]
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gb
|
|
5
|
+
# Base class for every Chinese Standard identifier AND the flavor's
|
|
6
|
+
# parse/create entry point. Concrete types under Pubid::Gb::Identifiers
|
|
7
|
+
# descend from this class, so a parsed GB id is always an instance of
|
|
8
|
+
# Pubid::Gb::Identifier.
|
|
9
|
+
class Identifier < ::Pubid::Identifier
|
|
10
|
+
# The issuing body code as printed, e.g. "GB", "JB", "T/GZAEPI".
|
|
11
|
+
# Always non-empty for a valid identifier.
|
|
12
|
+
attribute :publisher_code, :string
|
|
13
|
+
|
|
14
|
+
# Mandate category: "T" (recommended), "Z" (guideline), or nil
|
|
15
|
+
# (mandatory). Carried after the "/" in the printed form.
|
|
16
|
+
attribute :mandate, :string
|
|
17
|
+
|
|
18
|
+
# Document number (digits, possibly dotted with part). Required.
|
|
19
|
+
# Examples: "20223", "5606.1", "001".
|
|
20
|
+
attribute :number, :string
|
|
21
|
+
|
|
22
|
+
# Optional part. Captured separately from #number when the input
|
|
23
|
+
# uses the dotted form (e.g. "5606.1" => number "5606", part "1").
|
|
24
|
+
attribute :part, :string
|
|
25
|
+
|
|
26
|
+
# All-parts flag — true for "GB/T 5606 (all parts)" forms.
|
|
27
|
+
attribute :all_parts, :boolean, default: -> { false }
|
|
28
|
+
|
|
29
|
+
# Polymorphic type map for lutaml key_value (de)serialization.
|
|
30
|
+
GB_TYPE_MAP = {
|
|
31
|
+
"pubid:gb:standard" => "Pubid::Gb::Identifiers::Standard",
|
|
32
|
+
}.freeze
|
|
33
|
+
|
|
34
|
+
key_value do
|
|
35
|
+
map "_type", to: :_type, polymorphic_map: GB_TYPE_MAP
|
|
36
|
+
map "publisher_code", to: :publisher_code
|
|
37
|
+
map "mandate", to: :mandate
|
|
38
|
+
map "number", to: :number
|
|
39
|
+
map "part", to: :part
|
|
40
|
+
map "all_parts", to: :all_parts, render_default: false
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
PUBLISHER = "CN"
|
|
44
|
+
|
|
45
|
+
def to_s(**opts)
|
|
46
|
+
render(format: :human, **opts)
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Parse a Chinese Standard identifier string.
|
|
50
|
+
# @param identifier [String]
|
|
51
|
+
# @return [Pubid::Gb::Identifier]
|
|
52
|
+
def self.parse(identifier)
|
|
53
|
+
unless identifier.is_a?(String)
|
|
54
|
+
raise Pubid::Errors::InvalidInputError,
|
|
55
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
59
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
parsed = Parser.parse(identifier)
|
|
63
|
+
Builder.build(parsed)
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gb
|
|
5
|
+
module Identifiers
|
|
6
|
+
# The default Chinese Standard identifier type. The class name yields
|
|
7
|
+
# the polymorphic _type tag "pubid:gb:standard".
|
|
8
|
+
#
|
|
9
|
+
# Examples:
|
|
10
|
+
# GB/T 20223-2006
|
|
11
|
+
# GB/T 5606.1-2004
|
|
12
|
+
# GB/T 5606 (all parts)
|
|
13
|
+
# JB/T 13368-2018
|
|
14
|
+
# T/GZAEPI 001—2018
|
|
15
|
+
class Standard < Identifier
|
|
16
|
+
TYPED_STAGES = [
|
|
17
|
+
Pubid::Components::TypedStage.new(
|
|
18
|
+
code: :pubgb,
|
|
19
|
+
stage_code: :published,
|
|
20
|
+
type_code: :gb,
|
|
21
|
+
abbr: ["GB"],
|
|
22
|
+
name: "Chinese Standard",
|
|
23
|
+
harmonized_stages: %w[60.00 60.60],
|
|
24
|
+
),
|
|
25
|
+
].freeze
|
|
26
|
+
|
|
27
|
+
def self.type
|
|
28
|
+
{ key: :gb, web: :chinese_standard, title: "Chinese Standard",
|
|
29
|
+
short: "GB" }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Gb
|
|
7
|
+
# Parslet grammar for Chinese Standard identifiers.
|
|
8
|
+
#
|
|
9
|
+
# Accepts the canonical printed form
|
|
10
|
+
#
|
|
11
|
+
# {PUBLISHER}[/{TYPE}] {NUMBER}[.{PART}][-|—{YEAR}] [(all parts)]
|
|
12
|
+
#
|
|
13
|
+
# PUBLISHER is one of the leading tokens from PREFIXES (GB, GB/T, JB,
|
|
14
|
+
# T/GZAEPI, ...). TYPE is T (recommended), Z (guideline), or omitted.
|
|
15
|
+
# YEAR is 4 digits, separated by either ASCII dash or em-dash (Chinese
|
|
16
|
+
# typography uses the em-dash form).
|
|
17
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
18
|
+
rule(:space) { str(" ") }
|
|
19
|
+
rule(:dot) { str(".") }
|
|
20
|
+
rule(:dash) { str("-") | str("—") }
|
|
21
|
+
rule(:digits) { match("[0-9]").repeat(1) }
|
|
22
|
+
|
|
23
|
+
# Publisher token: national/industry codes (1-3 letters, optionally
|
|
24
|
+
# followed by /T or /Z) OR social-group form "T/{ACRONYM}".
|
|
25
|
+
rule(:publisher_code) do
|
|
26
|
+
# Social-group form: "T/" then 2+ uppercase letters/digits.
|
|
27
|
+
(str("T/") >> match("[A-Z0-9]").repeat(1)).as(:publisher_code) |
|
|
28
|
+
# Standard form: 1-3 letters, optional slash-T-or-Z.
|
|
29
|
+
(match("[A-Z]").repeat(1, 3) >>
|
|
30
|
+
(str("/T") | str("/Z")).maybe).as(:publisher_code)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Mandate category captured separately when the publisher token didn't
|
|
34
|
+
# already include it. Allows "GB/T" (inline) and "GB" + " T" (separate)
|
|
35
|
+
# to both parse.
|
|
36
|
+
rule(:mandate_suffix) do
|
|
37
|
+
(str("/") >> (str("T") | str("Z")).as(:mandate)).maybe
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
rule(:number) { digits.as(:number) }
|
|
41
|
+
rule(:part) { dot >> digits.as(:part) }
|
|
42
|
+
rule(:year) { (dash >> match("[0-9]").repeat(4, 4).as(:year)).maybe }
|
|
43
|
+
rule(:all_parts_flag) do
|
|
44
|
+
(space >> str("(") >> str("all parts") >> str(")")).as(:all_parts)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
rule(:identifier) do
|
|
48
|
+
publisher_code >>
|
|
49
|
+
space >>
|
|
50
|
+
number >>
|
|
51
|
+
part.maybe >>
|
|
52
|
+
year >>
|
|
53
|
+
all_parts_flag.maybe
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
rule(:root) { identifier }
|
|
57
|
+
|
|
58
|
+
def self.parse(input)
|
|
59
|
+
new.parse(input)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Gb
|
|
5
|
+
# Human-readable renderer for Chinese Standard identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces the canonical printed form:
|
|
8
|
+
# "GB/T 20223-2006"
|
|
9
|
+
# "GB/T 5606.1-2004"
|
|
10
|
+
# "GB/T 5606 (all parts)"
|
|
11
|
+
# "T/GZAEPI 001—2018" (social-group form, em-dash year)
|
|
12
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
13
|
+
def render(**_opts)
|
|
14
|
+
parts = [publisher_portion, " #{number_portion}"]
|
|
15
|
+
parts << " (all parts)" if @id.all_parts
|
|
16
|
+
parts.join
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def publisher_portion
|
|
22
|
+
code = @id.publisher_code.to_s
|
|
23
|
+
code += "/#{@id.mandate}" if @id.mandate && !@id.publisher_code.include?("/")
|
|
24
|
+
code
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def number_portion
|
|
28
|
+
result = @id.number.to_s
|
|
29
|
+
result += ".#{@id.part}" if @id.part
|
|
30
|
+
result += "-#{@id.year}" if @id.year
|
|
31
|
+
result
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|