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,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Adobe
|
|
5
|
+
# Generates URN strings for Adobe identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Format:
|
|
8
|
+
# urn:adobe:tech-note:<number> e.g. urn:adobe:tech-note:5014
|
|
9
|
+
# urn:adobe:publication:<slug>[:v<ver>] e.g. urn:adobe:publication:adobe-glyph-list
|
|
10
|
+
# urn:adobe:publication:adobe-japan1:v7
|
|
11
|
+
class UrnGenerator
|
|
12
|
+
attr_reader :identifier
|
|
13
|
+
|
|
14
|
+
def initialize(identifier)
|
|
15
|
+
@identifier = identifier
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def generate
|
|
19
|
+
if identifier.is_a?(Identifiers::TechNote)
|
|
20
|
+
generate_tech_note
|
|
21
|
+
elsif identifier.is_a?(Identifiers::Publication)
|
|
22
|
+
generate_publication
|
|
23
|
+
else
|
|
24
|
+
raise ArgumentError,
|
|
25
|
+
"Unknown Adobe identifier class: #{identifier.class}"
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
def generate_tech_note
|
|
32
|
+
"urn:adobe:tech-note:#{identifier.number}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def generate_publication
|
|
36
|
+
parts = ["urn:adobe:publication", identifier.slug]
|
|
37
|
+
parts << "v#{identifier.version}" if identifier.version
|
|
38
|
+
parts.join(":")
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Adobe
|
|
5
|
+
# Parses Adobe URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits:
|
|
8
|
+
# urn:adobe:tech-note:<number>
|
|
9
|
+
# urn:adobe:publication:<slug>[:v<version>]
|
|
10
|
+
#
|
|
11
|
+
# Examples:
|
|
12
|
+
# urn:adobe:tech-note:5014 → Adobe Technical Note #5014
|
|
13
|
+
# urn:adobe:publication:adobe-glyph-list → adobe-glyph-list
|
|
14
|
+
# urn:adobe:publication:adobe-japan1:v7 → adobe-japan1-7
|
|
15
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
16
|
+
PREFIX = "urn:adobe:".freeze
|
|
17
|
+
|
|
18
|
+
def parse_urn(urn)
|
|
19
|
+
body = strip_namespace(urn)
|
|
20
|
+
parts = split_parts(body)
|
|
21
|
+
namespace = parts.fetch(0)
|
|
22
|
+
|
|
23
|
+
case namespace
|
|
24
|
+
when "tech-note"
|
|
25
|
+
parse_tech_note(parts)
|
|
26
|
+
when "publication"
|
|
27
|
+
parse_publication(parts)
|
|
28
|
+
else
|
|
29
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
30
|
+
"Unknown Adobe URN namespace: #{namespace.inspect} in #{urn.inspect}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
private
|
|
35
|
+
|
|
36
|
+
def strip_namespace(urn)
|
|
37
|
+
unless urn.downcase.start_with?(PREFIX)
|
|
38
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
39
|
+
"Invalid Adobe URN: #{urn.inspect}"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
urn[PREFIX.length..]
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def parse_tech_note(parts)
|
|
46
|
+
number = parts.fetch(1)
|
|
47
|
+
flavor_parse("Adobe Technical Note ##{number}")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def parse_publication(parts)
|
|
51
|
+
slug = parts.fetch(1)
|
|
52
|
+
version_seg = parts[2]
|
|
53
|
+
if version_seg&.start_with?("v")
|
|
54
|
+
flavor_parse("#{slug}-#{version_seg.sub(/\Av/, "")}")
|
|
55
|
+
else
|
|
56
|
+
flavor_parse(slug)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def split_parts(body)
|
|
61
|
+
body.split(":")
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def flavor_parse(text)
|
|
65
|
+
::Pubid::Adobe.parse(text)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
data/lib/pubid/adobe.rb
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pubid"
|
|
4
|
+
module Pubid
|
|
5
|
+
module Adobe
|
|
6
|
+
extend Pubid::PrefixesSupport
|
|
7
|
+
|
|
8
|
+
# Leading identifier prefix tokens that an Adobe document id can start
|
|
9
|
+
# with. Tech notes appear as both `Adobe Technical Note #<n>` and the
|
|
10
|
+
# short alias `ATN<n>` in citations; both must route to this flavor.
|
|
11
|
+
# Named publications start with `Adobe` (e.g. `Adobe Glyph List`,
|
|
12
|
+
# `Adobe-Japan1-7`).
|
|
13
|
+
PREFIXES = ["Adobe", "ATN"].freeze
|
|
14
|
+
|
|
15
|
+
autoload :Builder, "#{__dir__}/adobe/builder"
|
|
16
|
+
autoload :Identifier, "#{__dir__}/adobe/identifier"
|
|
17
|
+
autoload :Identifiers, "#{__dir__}/adobe/identifiers"
|
|
18
|
+
autoload :Parser, "#{__dir__}/adobe/parser"
|
|
19
|
+
autoload :Renderer, "#{__dir__}/adobe/renderer"
|
|
20
|
+
autoload :UrnGenerator, "#{__dir__}/adobe/urn_generator"
|
|
21
|
+
autoload :UrnParser, "#{__dir__}/adobe/urn_parser"
|
|
22
|
+
|
|
23
|
+
# Parse an Adobe identifier string into an identifier object.
|
|
24
|
+
# @param identifier [String]
|
|
25
|
+
# @return [Pubid::Adobe::Identifier]
|
|
26
|
+
def self.parse(identifier)
|
|
27
|
+
Identifier.parse(identifier)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# Per-flavor format registry: inherits global formats, overrides :human
|
|
31
|
+
# with the Adobe-specific renderer.
|
|
32
|
+
Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
|
|
33
|
+
Identifier.format_registry.register(:human, renderer: Adobe::Renderer)
|
|
34
|
+
|
|
35
|
+
# Auto-discover identifier types from the Identifiers namespace.
|
|
36
|
+
# @return [Array<Class>]
|
|
37
|
+
def self.identifier_types
|
|
38
|
+
@identifier_types ||= Identifiers.constants
|
|
39
|
+
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
40
|
+
.select { |c| c.is_a?(Class) && c < Pubid::Identifier }
|
|
41
|
+
.reject { |c| c == Identifier }
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Lookup: type key → identifier class
|
|
45
|
+
# @param code [String, Symbol]
|
|
46
|
+
# @return [Class, nil]
|
|
47
|
+
def self.locate_type(code)
|
|
48
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Lookup: type short letter (e.g. "ATN") → identifier class
|
|
52
|
+
# @param short [String]
|
|
53
|
+
# @return [Class<Identifier>]
|
|
54
|
+
def self.identifier_klass_for_short(short)
|
|
55
|
+
@by_short ||= identifier_types.to_h { |klass| [klass.type[:short].to_s, klass] }
|
|
56
|
+
@by_short.fetch(short.to_s)
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
Pubid::Registry.register(:adobe, Pubid::Adobe)
|
data/lib/pubid/amca/builder.rb
CHANGED
|
@@ -7,7 +7,7 @@ module Pubid
|
|
|
7
7
|
class Builder
|
|
8
8
|
attr_reader :identifier_class
|
|
9
9
|
|
|
10
|
-
def initialize(identifier_class =
|
|
10
|
+
def initialize(identifier_class = Identifier)
|
|
11
11
|
@identifier_class = identifier_class
|
|
12
12
|
end
|
|
13
13
|
|
|
@@ -46,7 +46,7 @@ module Pubid
|
|
|
46
46
|
|
|
47
47
|
# Class method to build an identifier from parsed data
|
|
48
48
|
# @param parsed [Hash, Array] the parsed identifier data
|
|
49
|
-
# @return [
|
|
49
|
+
# @return [Identifier] the constructed identifier object
|
|
50
50
|
def self.build(parsed)
|
|
51
51
|
new.build(parsed)
|
|
52
52
|
end
|
|
@@ -78,7 +78,7 @@ module Pubid
|
|
|
78
78
|
if parsed[:code_with_year]
|
|
79
79
|
code_year_data = parsed[:code_with_year]
|
|
80
80
|
if code_year_data && code_year_data[:code]
|
|
81
|
-
attributes[:
|
|
81
|
+
attributes[:number] =
|
|
82
82
|
extract_value(code_year_data[:code])
|
|
83
83
|
end
|
|
84
84
|
if code_year_data && code_year_data[:year]
|
|
@@ -86,7 +86,7 @@ module Pubid
|
|
|
86
86
|
extract_value(code_year_data[:year])
|
|
87
87
|
end
|
|
88
88
|
elsif parsed[:code]
|
|
89
|
-
attributes[:
|
|
89
|
+
attributes[:number] = extract_value(parsed[:code])
|
|
90
90
|
end
|
|
91
91
|
|
|
92
92
|
# Extract year if not already extracted from code_with_year
|
|
@@ -1,6 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
3
|
# Pubid::Amca::Identifier is the AMCA base class (a real Pubid::Identifier
|
|
4
|
-
# subclass); its body
|
|
5
|
-
# live in identifiers/base.rb. This file just ensures it is loaded.
|
|
6
|
-
require_relative "identifiers/base"
|
|
4
|
+
# subclass); its body and `.parse` live in identifiers/base.rb. This file just ensures it is loaded.
|
|
@@ -3,15 +3,22 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Amca
|
|
5
5
|
# Base identifier class for AMCA identifiers. Canonical name
|
|
6
|
-
# Pubid::Amca::Identifier
|
|
6
|
+
# Pubid::Amca::Identifier; common
|
|
7
7
|
# functionality for all AMCA identifier types.
|
|
8
8
|
class Identifier < ::Pubid::Identifier
|
|
9
|
-
# @raise [
|
|
9
|
+
# @raise [Pubid::Errors::ParseError] If parsing fails
|
|
10
10
|
def self.parse(identifier)
|
|
11
|
+
unless identifier.is_a?(String)
|
|
12
|
+
raise Pubid::Errors::InvalidInputError,
|
|
13
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
17
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
18
|
+
end
|
|
19
|
+
|
|
11
20
|
parsed = Parser.parse(identifier)
|
|
12
21
|
Builder.build(parsed)
|
|
13
|
-
rescue Parslet::ParseFailed => e
|
|
14
|
-
raise "Failed to parse ACMA identifier '#{identifier}': #{e.message}"
|
|
15
22
|
end
|
|
16
23
|
|
|
17
24
|
# Stored as a plain string (always "AMCA") so it round-trips through
|
|
@@ -19,22 +26,40 @@ module Pubid
|
|
|
19
26
|
# serialize a String against the Components::Publisher attribute and raise.
|
|
20
27
|
attribute :publisher, :string, default: -> { "AMCA" }
|
|
21
28
|
attribute :copublisher, :string
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
# The document number used to live in AMCA's own `code` attribute, leaving
|
|
30
|
+
# the `number` inherited from ::Pubid::Identifier nil — so relaton-index,
|
|
31
|
+
# which sorts and bsearches on `id.root.number.to_s`, keyed every AMCA row
|
|
32
|
+
# on "". `code` is gone; each LEAF now declares `attribute :number,
|
|
33
|
+
# :string` (see standard.rb / publication.rb / interpretation.rb).
|
|
34
|
+
#
|
|
35
|
+
# It is declared on the leaves, never here: this class is inherited by all
|
|
36
|
+
# three of them, and redefining the parent's Components::Code-typed
|
|
37
|
+
# `number` on an inherited-from class resolves nondeterministically under
|
|
38
|
+
# multi-flavor load. Do not reintroduce `code`, and do not move `number`
|
|
39
|
+
# up here.
|
|
40
|
+
#
|
|
41
|
+
# A bare 2-digit edition year ("21", "02"). Declared :string, not
|
|
42
|
+
# Components::Date: the builder assigns a String and lutaml does not cast
|
|
43
|
+
# it, so a Date declaration left the PARSE path holding a String while
|
|
44
|
+
# from_hash produced a Components::Date — making
|
|
45
|
+
# `parse(x) == from_hash(parse(x).to_hash)` false for every AMCA id and
|
|
46
|
+
# breaking #matches?, which is built on ==. to_hash and to_s agreed, so
|
|
47
|
+
# the relaton index gate never caught it.
|
|
48
|
+
attribute :year, :string
|
|
24
49
|
attribute :suffix, :string
|
|
25
50
|
attribute :reaffirmed, :string
|
|
26
51
|
|
|
27
52
|
# Explicit key_value mapping: only these keys serialize (the inherited
|
|
28
53
|
# Pubid::Identifier attributes — including :type, which subclasses expose
|
|
29
54
|
# as a class-metadata Hash via `self.type` — are intentionally dropped).
|
|
30
|
-
#
|
|
31
|
-
# the
|
|
55
|
+
# Every mapped attribute is a plain scalar, so no custom converters are
|
|
56
|
+
# needed; the canonical to_hash already drops empty and default values.
|
|
32
57
|
key_value do
|
|
33
58
|
map "_type", to: :_type
|
|
34
59
|
map "publisher", to: :publisher
|
|
35
60
|
map "copublisher", to: :copublisher
|
|
36
|
-
map "
|
|
37
|
-
map "year",
|
|
61
|
+
map "number", to: :number
|
|
62
|
+
map "year", to: :year
|
|
38
63
|
map "suffix", to: :suffix
|
|
39
64
|
map "reaffirmed", to: :reaffirmed
|
|
40
65
|
end
|
|
@@ -43,33 +68,25 @@ module Pubid
|
|
|
43
68
|
UrnGenerator.new(self).generate
|
|
44
69
|
end
|
|
45
70
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
71
|
+
# AMCA models its document type as class metadata (`self.type`), not as a
|
|
72
|
+
# `typed_stage`, so the base `mr_type` hook found nothing. Without it an
|
|
73
|
+
# interpretation and the standard it interprets share a slug — and
|
|
74
|
+
# `to_slug` is an output FILENAME. Before the index columns landed the
|
|
75
|
+
# whole flavor collapsed onto two slugs ("amca" and "").
|
|
76
|
+
def mr_type
|
|
77
|
+
return nil unless self.class.respond_to?(:type)
|
|
49
78
|
|
|
50
|
-
|
|
79
|
+
self.class.type[:key]&.to_s
|
|
51
80
|
end
|
|
52
81
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
doc.add_child(Lutaml::KeyValue::DataModel::Element.new("year", y.to_s))
|
|
82
|
+
# AMCA keeps the edition in its own `year` string, not in the inherited
|
|
83
|
+
# `date`, so the base `mr_year` hook read nil and two editions of one
|
|
84
|
+
# standard — "ANSI/AMCA 300-14" and "ANSI/AMCA Standard 300-24" —
|
|
85
|
+
# produced the same slug. Same shape as the BIPM year recorded in
|
|
86
|
+
# CLAUDE.md.
|
|
87
|
+
def mr_year
|
|
88
|
+
year&.to_s
|
|
62
89
|
end
|
|
63
|
-
|
|
64
|
-
def year_from_kv(model, value)
|
|
65
|
-
model.year = ::Pubid::Components::Date.new(year: value.to_s)
|
|
66
|
-
end
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
module Identifiers
|
|
70
|
-
# Backward-compatible alias: AMCA's base class used to be
|
|
71
|
-
# Pubid::Amca::Identifiers::Base. It is now Pubid::Amca::Identifier.
|
|
72
|
-
Base = Pubid::Amca::Identifier
|
|
73
90
|
end
|
|
74
91
|
end
|
|
75
92
|
end
|
|
@@ -8,17 +8,25 @@ module Pubid
|
|
|
8
8
|
# - AMCA 99 JW Interp
|
|
9
9
|
# - AMCA 204 – 1
|
|
10
10
|
# - ANSI/AMCA 204 Interp
|
|
11
|
-
class Interpretation <
|
|
12
|
-
|
|
11
|
+
class Interpretation < Identifier
|
|
12
|
+
attribute :number, :string
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
# See Publication: the hand-written keyword initializer bypassed lutaml,
|
|
15
|
+
# costing this class its `_type`, its `publisher` default and the
|
|
16
|
+
# serialization of `interpretation_code`.
|
|
17
|
+
attribute :interpretation_code, :string
|
|
18
|
+
|
|
19
|
+
key_value do
|
|
20
|
+
map "interpretation_code", to: :interpretation_code
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# The interpretation letter is what distinguishes one interpretation of
|
|
24
|
+
# a standard from another ("AMCA 99 JW Interp" vs "AMCA 99 KB Interp" —
|
|
25
|
+
# different documents, and #== agrees). It is in `==` and in `to_s`, so
|
|
26
|
+
# it must reach the slug too, or three interpretations of standard 99
|
|
27
|
+
# share one filename.
|
|
28
|
+
def mr_number_with_part
|
|
29
|
+
mr_join(super, interpretation_code&.to_s&.downcase)
|
|
22
30
|
end
|
|
23
31
|
|
|
24
32
|
def self.type
|
|
@@ -8,17 +8,21 @@ module Pubid
|
|
|
8
8
|
# - AMCA Publication 211-22 (Rev. 01-23)
|
|
9
9
|
# - AMCA Publication 311-16
|
|
10
10
|
# - AMCA Publication 1011-03 (R2010)
|
|
11
|
-
class Publication <
|
|
12
|
-
|
|
11
|
+
class Publication < Identifier
|
|
12
|
+
attribute :number, :string
|
|
13
13
|
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
14
|
+
# Was a hand-written keyword initializer assigning ivars directly,
|
|
15
|
+
# which bypassed lutaml entirely. Three things broke as a result: no
|
|
16
|
+
# `_type` was emitted (so Identifier.from_hash could not route back to
|
|
17
|
+
# this class), the `publisher` default never materialised, and
|
|
18
|
+
# `revision` was a plain attr_reader that to_hash dropped. Removing it
|
|
19
|
+
# — and making `revision` a real attribute — is the AIEE/IRE/NESC
|
|
20
|
+
# migration applied here; the builder already calls `new(**attributes)`
|
|
21
|
+
# exactly as it does for Standard, which never had this problem.
|
|
22
|
+
attribute :revision, :string
|
|
23
|
+
|
|
24
|
+
key_value do
|
|
25
|
+
map "revision", to: :revision
|
|
22
26
|
end
|
|
23
27
|
|
|
24
28
|
def self.type
|
|
@@ -8,7 +8,9 @@ module Pubid
|
|
|
8
8
|
# - ANSI/AMCA 210-16
|
|
9
9
|
# - ANSI/AMCA Standard 99-25
|
|
10
10
|
# - AMCA Standard 803-02 (R2008)
|
|
11
|
-
class Standard <
|
|
11
|
+
class Standard < Identifier
|
|
12
|
+
attribute :number, :string
|
|
13
|
+
|
|
12
14
|
def self.type
|
|
13
15
|
{ key: :standard, title: "Standard", short: nil }
|
|
14
16
|
end
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
module Pubid
|
|
4
4
|
module Amca
|
|
5
5
|
module Identifiers
|
|
6
|
-
autoload :Base, "#{__dir__}/identifiers/base"
|
|
7
6
|
autoload :Interpretation, "#{__dir__}/identifiers/interpretation"
|
|
8
7
|
autoload :Publication, "#{__dir__}/identifiers/publication"
|
|
9
8
|
autoload :Standard, "#{__dir__}/identifiers/standard"
|
data/lib/pubid/amca/parser.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Pubid
|
|
|
4
4
|
module Amca
|
|
5
5
|
# Parser class for ACMA identifiers
|
|
6
6
|
# Single Responsibility: Parsing ACMA identifier syntax
|
|
7
|
-
class Parser <
|
|
7
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
8
8
|
# Basic building blocks
|
|
9
9
|
rule(:space) { str(" ") }
|
|
10
10
|
rule(:space?) { space.maybe }
|
data/lib/pubid/amca/renderer.rb
CHANGED
|
@@ -35,14 +35,14 @@ module Pubid
|
|
|
35
35
|
if t.is_a?(Hash) && t[:title]
|
|
36
36
|
parts << t[:title].to_s
|
|
37
37
|
end
|
|
38
|
-
parts << id.
|
|
38
|
+
parts << id.number.to_s
|
|
39
39
|
parts << "-#{id.year}" if id.year
|
|
40
40
|
|
|
41
41
|
result = parts.compact.join(" ")
|
|
42
42
|
|
|
43
43
|
if id.copublisher&.include?("/") && id.year
|
|
44
44
|
type_title = t.is_a?(Hash) ? t[:title].to_s : ""
|
|
45
|
-
result = "#{id.copublisher} #{type_title} #{id.
|
|
45
|
+
result = "#{id.copublisher} #{type_title} #{id.number}-#{id.year}"
|
|
46
46
|
end
|
|
47
47
|
|
|
48
48
|
result += " (#{id.reaffirmed})" if id.reaffirmed
|
|
@@ -54,7 +54,7 @@ module Pubid
|
|
|
54
54
|
parts = []
|
|
55
55
|
parts << id.copublisher if id.copublisher
|
|
56
56
|
parts << "Publication"
|
|
57
|
-
parts << id.
|
|
57
|
+
parts << id.number.to_s
|
|
58
58
|
parts << "-#{id.year}" if id.year
|
|
59
59
|
parts << " (Rev. #{id.revision})" if id.revision
|
|
60
60
|
parts << " (#{id.reaffirmed})" if id.reaffirmed && !id.revision
|
|
@@ -65,7 +65,7 @@ module Pubid
|
|
|
65
65
|
def render_interpretation(id)
|
|
66
66
|
parts = []
|
|
67
67
|
parts << id.copublisher if id.copublisher
|
|
68
|
-
parts << id.
|
|
68
|
+
parts << id.number.to_s
|
|
69
69
|
|
|
70
70
|
if id.interpretation_code
|
|
71
71
|
parts << "– #{id.interpretation_code}"
|
data/lib/pubid/amca.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module Amca
|
|
5
6
|
extend Pubid::PrefixesSupport
|
|
@@ -8,7 +9,7 @@ module Pubid
|
|
|
8
9
|
# Pubid::JOINT_PREFIXES.
|
|
9
10
|
PREFIXES = ["AMCA"].freeze
|
|
10
11
|
|
|
11
|
-
autoload :Identifier, "#{__dir__}/amca/
|
|
12
|
+
autoload :Identifier, "#{__dir__}/amca/identifiers/base"
|
|
12
13
|
autoload :Identifiers, "#{__dir__}/amca/identifiers"
|
|
13
14
|
autoload :Builder, "#{__dir__}/amca/builder"
|
|
14
15
|
autoload :Parser, "#{__dir__}/amca/parser"
|
|
@@ -20,14 +21,14 @@ module Pubid
|
|
|
20
21
|
# Parse an ACMA identifier string into an identifier object
|
|
21
22
|
# @param identifier [String] The ACMA identifier string to parse
|
|
22
23
|
# @return [Pubid::Amca::Identifier] The appropriate identifier object
|
|
23
|
-
# @raise [
|
|
24
|
+
# @raise [Pubid::Errors::ParseError] If parsing fails
|
|
24
25
|
def self.parse(identifier)
|
|
25
26
|
Identifier.parse(identifier)
|
|
26
27
|
end
|
|
27
28
|
|
|
28
29
|
# Per-flavor format registry: inherits global formats, overrides :human
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
|
|
31
|
+
Identifier.format_registry.register(:human, renderer: Amca::Renderer)
|
|
31
32
|
|
|
32
33
|
# Auto-discover all identifier types from the Identifiers namespace
|
|
33
34
|
# @return [Array<Class>] identifier classes that define a self.type Hash
|
data/lib/pubid/ansi/builder.rb
CHANGED
|
@@ -36,8 +36,8 @@ module Pubid
|
|
|
36
36
|
main_number = main_and_parts[0]
|
|
37
37
|
part_number = main_and_parts[1]
|
|
38
38
|
{
|
|
39
|
-
number:
|
|
40
|
-
part: part_number
|
|
39
|
+
number: main_number,
|
|
40
|
+
part: part_number,
|
|
41
41
|
}.compact
|
|
42
42
|
when :date
|
|
43
43
|
Components::Date.new(year: value.to_s)
|
|
@@ -4,7 +4,25 @@ module Pubid
|
|
|
4
4
|
module Ansi
|
|
5
5
|
# Base ANSI identifier class
|
|
6
6
|
class Identifier < ::Pubid::Identifier
|
|
7
|
+
# `number`/`part`/`subpart` are declared here rather than inherited as a
|
|
8
|
+
# Components::Code: ANSI stores a bare string in every one of them.
|
|
9
|
+
# Declaring on this class is safe because its body lives in this one file
|
|
10
|
+
# and is never reopened, so every subclass body opens after it has run
|
|
11
|
+
# (lutaml deep-dups the parent attribute table at class-definition time).
|
|
12
|
+
attribute :number, :string
|
|
13
|
+
attribute :part, :string
|
|
14
|
+
attribute :subpart, :string
|
|
15
|
+
|
|
7
16
|
def self.parse(string)
|
|
17
|
+
unless string.is_a?(String)
|
|
18
|
+
raise Pubid::Errors::InvalidInputError,
|
|
19
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
if string.length > Pubid::MAX_INPUT_LENGTH
|
|
23
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
24
|
+
end
|
|
25
|
+
|
|
8
26
|
parsed = Pubid::Ansi::Parser.new.parse(string)
|
|
9
27
|
Pubid::Ansi::Builder.new.build(parsed)
|
|
10
28
|
end
|
data/lib/pubid/ansi/parser.rb
CHANGED
|
@@ -4,7 +4,7 @@ module Pubid
|
|
|
4
4
|
module Ansi
|
|
5
5
|
# Parser for ANSI (American National Standards Institute) identifiers
|
|
6
6
|
# Examples: ANSI X3.4-1986, ANSI C63.4-2014, ANSI/ISO 9899:1990
|
|
7
|
-
class Parser <
|
|
7
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
8
8
|
include ::Pubid::Parser::CommonParseRules
|
|
9
9
|
include ::Pubid::Parser::CommonParseMethods
|
|
10
10
|
|
data/lib/pubid/ansi/renderer.rb
CHANGED
|
@@ -37,8 +37,8 @@ module Pubid
|
|
|
37
37
|
|
|
38
38
|
def number_portion(id, context)
|
|
39
39
|
[
|
|
40
|
-
id.number
|
|
41
|
-
(id.part ? "-#{id.part
|
|
40
|
+
id.number,
|
|
41
|
+
(id.part ? "-#{id.part}" : ""),
|
|
42
42
|
(id.date ? ":#{id.date.render(context:)}" : ""),
|
|
43
43
|
].join
|
|
44
44
|
end
|
data/lib/pubid/ansi.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
+
require "pubid"
|
|
3
4
|
module Pubid
|
|
4
5
|
module Ansi
|
|
5
6
|
extend Pubid::PrefixesSupport
|
|
@@ -21,12 +22,11 @@ module Pubid
|
|
|
21
22
|
# Parse an ANSI identifier string
|
|
22
23
|
# @param identifier [String] the identifier string to parse
|
|
23
24
|
# @return [Identifier] the parsed identifier
|
|
25
|
+
# Delegate to the class method rather than repeating the parser/builder
|
|
26
|
+
# sequence, so the input guards live in one place and the two entry points
|
|
27
|
+
# cannot drift apart.
|
|
24
28
|
def self.parse(identifier)
|
|
25
|
-
|
|
26
|
-
builder = Builder.new
|
|
27
|
-
|
|
28
|
-
parsed = parser.parse(identifier)
|
|
29
|
-
builder.build(parsed)
|
|
29
|
+
Identifier.parse(identifier)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
32
|
# Per-flavor format registry: inherits global formats, overrides :human
|
data/lib/pubid/api/builder.rb
CHANGED
|
@@ -30,15 +30,29 @@ module Pubid
|
|
|
30
30
|
# identifier attribute (the concrete class is pinned by `_type`). Drop it
|
|
31
31
|
# so the raw Parslet::Slice never lands in the inherited :type attribute.
|
|
32
32
|
when :type then nil
|
|
33
|
-
when :number then Components::Code.new(value: value.to_s)
|
|
34
33
|
when :reaffirmation
|
|
35
34
|
value.is_a?(Hash) ? (value[:year] || value).to_s : value.to_s
|
|
36
|
-
|
|
35
|
+
# Every remaining key is a bare scalar. `:chapter` is a PARSE-TREE key
|
|
36
|
+
# and keeps its name in the grammar; the ATTRIBUTE it feeds is `number`
|
|
37
|
+
# (see handle_key below), which this branch retyped from
|
|
38
|
+
# Components::Code to :string — so it now casts like the rest.
|
|
39
|
+
when :number, :chapter, :part, :section, :subsection, :year
|
|
37
40
|
value.to_s
|
|
38
41
|
else
|
|
39
42
|
super
|
|
40
43
|
end
|
|
41
44
|
end
|
|
45
|
+
|
|
46
|
+
# Route the MPMS chapter into the `number` attribute. The shared
|
|
47
|
+
# assign_attributes loop uses the parse-tree key as the setter name and
|
|
48
|
+
# silently skips a key that is not an attribute, so without this the
|
|
49
|
+
# chapter would simply vanish once `attribute :chapter` was removed.
|
|
50
|
+
def handle_key(identifier, key, value)
|
|
51
|
+
return super unless key.to_sym == :chapter
|
|
52
|
+
|
|
53
|
+
identifier.number = value
|
|
54
|
+
true
|
|
55
|
+
end
|
|
42
56
|
end
|
|
43
57
|
end
|
|
44
58
|
end
|