pubid 1.15.21 → 2.0.0.alpha.10
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/LICENSE.txt +1 -1
- data/README.adoc +2044 -53
- data/archived-gems/pubid-ccsds/update_codes.yaml +1 -0
- data/archived-gems/pubid-iec/stages.yaml +129 -0
- data/archived-gems/pubid-iec/update_codes.yaml +67 -0
- data/archived-gems/pubid-ieee/update_codes.yaml +104 -0
- data/archived-gems/pubid-iso/stages.yaml +106 -0
- data/archived-gems/pubid-iso/update_codes.yaml +4 -0
- data/archived-gems/pubid-itu/i18n.yaml +13 -0
- data/archived-gems/pubid-itu/series.yaml +42 -0
- data/archived-gems/pubid-nist/publishers.yaml +6 -0
- data/archived-gems/pubid-nist/series.yaml +121 -0
- data/archived-gems/pubid-nist/stages.yaml +16 -0
- data/archived-gems/pubid-nist/update_codes.yaml +93 -0
- data/archived-gems/pubid-plateau/update_codes.yaml +6 -0
- data/data/bipm/update_codes.yaml +9 -0
- data/data/ccsds/update_codes.yaml +1 -0
- data/data/iec/update_codes.yaml +70 -0
- data/data/ieee/update_codes.yaml +210 -0
- data/data/iso/update_codes.yaml +21 -0
- data/data/nist/series.yaml +155 -0
- data/data/nist/update_codes.yaml +122 -0
- data/data/plateau/update_codes.yaml +6 -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 +60 -0
- data/lib/pubid/amca/builder.rb +176 -0
- data/lib/pubid/amca/identifier.rb +4 -0
- data/lib/pubid/amca/identifiers/base.rb +92 -0
- data/lib/pubid/amca/identifiers/interpretation.rb +38 -0
- data/lib/pubid/amca/identifiers/publication.rb +34 -0
- data/lib/pubid/amca/identifiers/standard.rb +20 -0
- data/lib/pubid/amca/identifiers.rb +11 -0
- data/lib/pubid/amca/parser.rb +153 -0
- data/lib/pubid/amca/renderer.rb +82 -0
- data/lib/pubid/amca/single_identifier.rb +10 -0
- data/lib/pubid/amca/urn_generator.rb +51 -0
- data/lib/pubid/amca/urn_parser.rb +28 -0
- data/lib/pubid/amca.rb +73 -0
- data/lib/pubid/ansi/builder.rb +54 -0
- data/lib/pubid/ansi/identifier.rb +31 -0
- data/lib/pubid/ansi/identifiers/american_national_standard.rb +13 -0
- data/lib/pubid/ansi/identifiers/standard.rb +15 -0
- data/lib/pubid/ansi/identifiers.rb +11 -0
- data/lib/pubid/ansi/parser.rb +91 -0
- data/lib/pubid/ansi/renderer.rb +53 -0
- data/lib/pubid/ansi/single_identifier.rb +16 -0
- data/lib/pubid/ansi/urn_generator.rb +41 -0
- data/lib/pubid/ansi/urn_parser.rb +23 -0
- data/lib/pubid/ansi.rb +68 -0
- data/lib/pubid/api/builder.rb +58 -0
- data/lib/pubid/api/components/code.rb +9 -0
- data/lib/pubid/api/identifier.rb +42 -0
- data/lib/pubid/api/identifiers/base.rb +12 -0
- data/lib/pubid/api/identifiers/bulletin.rb +13 -0
- data/lib/pubid/api/identifiers/continuous_operations_standard.rb +13 -0
- data/lib/pubid/api/identifiers/mpms.rb +26 -0
- data/lib/pubid/api/identifiers/publication.rb +13 -0
- data/lib/pubid/api/identifiers/recommended_practice.rb +13 -0
- data/lib/pubid/api/identifiers/specification.rb +13 -0
- data/lib/pubid/api/identifiers/standard.rb +13 -0
- data/lib/pubid/api/identifiers/technical_report.rb +13 -0
- data/lib/pubid/api/identifiers/typeless_standard.rb +11 -0
- data/lib/pubid/api/identifiers.rb +18 -0
- data/lib/pubid/api/parser.rb +140 -0
- data/lib/pubid/api/renderer.rb +98 -0
- data/lib/pubid/api/single_identifier.rb +24 -0
- data/lib/pubid/api/urn_generator.rb +23 -0
- data/lib/pubid/api/urn_parser.rb +35 -0
- data/lib/pubid/api.rb +68 -0
- data/lib/pubid/ashrae/builder.rb +519 -0
- data/lib/pubid/ashrae/identifier.rb +8 -0
- data/lib/pubid/ashrae/identifiers/addenda_package.rb +42 -0
- data/lib/pubid/ashrae/identifiers/addendum.rb +44 -0
- data/lib/pubid/ashrae/identifiers/base.rb +119 -0
- data/lib/pubid/ashrae/identifiers/combined_addenda.rb +43 -0
- data/lib/pubid/ashrae/identifiers/errata.rb +39 -0
- data/lib/pubid/ashrae/identifiers/guideline.rb +41 -0
- data/lib/pubid/ashrae/identifiers/interpretation.rb +45 -0
- data/lib/pubid/ashrae/identifiers/standard.rb +41 -0
- data/lib/pubid/ashrae/identifiers.rb +15 -0
- data/lib/pubid/ashrae/parser.rb +748 -0
- data/lib/pubid/ashrae/renderer.rb +117 -0
- data/lib/pubid/ashrae/single_identifier.rb +10 -0
- data/lib/pubid/ashrae/supplement_identifier.rb +38 -0
- data/lib/pubid/ashrae/urn_generator.rb +57 -0
- data/lib/pubid/ashrae/urn_parser.rb +27 -0
- data/lib/pubid/ashrae.rb +77 -0
- data/lib/pubid/asme/builder.rb +162 -0
- data/lib/pubid/asme/components/code.rb +26 -0
- data/lib/pubid/asme/identifier.rb +24 -0
- data/lib/pubid/asme/identifiers/base.rb +10 -0
- data/lib/pubid/asme/identifiers/standard.rb +96 -0
- data/lib/pubid/asme/identifiers.rb +10 -0
- data/lib/pubid/asme/parser.rb +308 -0
- data/lib/pubid/asme/renderer.rb +66 -0
- data/lib/pubid/asme/single_identifier.rb +38 -0
- data/lib/pubid/asme/urn_generator.rb +133 -0
- data/lib/pubid/asme/urn_parser.rb +31 -0
- data/lib/pubid/asme.rb +67 -0
- data/lib/pubid/astm/builder.rb +166 -0
- data/lib/pubid/astm/components/code.rb +42 -0
- data/lib/pubid/astm/components.rb +9 -0
- data/lib/pubid/astm/identifier.rb +24 -0
- data/lib/pubid/astm/identifiers/adjunct.rb +28 -0
- data/lib/pubid/astm/identifiers/base.rb +13 -0
- data/lib/pubid/astm/identifiers/code_number.rb +81 -0
- data/lib/pubid/astm/identifiers/data_series.rb +13 -0
- data/lib/pubid/astm/identifiers/iso_dual_published.rb +65 -0
- data/lib/pubid/astm/identifiers/manual.rb +23 -0
- data/lib/pubid/astm/identifiers/monograph.rb +13 -0
- data/lib/pubid/astm/identifiers/research_report.rb +21 -0
- data/lib/pubid/astm/identifiers/standard.rb +23 -0
- data/lib/pubid/astm/identifiers/technical_report.rb +12 -0
- data/lib/pubid/astm/identifiers/work_in_progress.rb +12 -0
- data/lib/pubid/astm/identifiers.rb +19 -0
- data/lib/pubid/astm/parser.rb +244 -0
- data/lib/pubid/astm/renderer.rb +172 -0
- data/lib/pubid/astm/single_identifier.rb +47 -0
- data/lib/pubid/astm/urn_generator.rb +101 -0
- data/lib/pubid/astm/urn_parser.rb +30 -0
- data/lib/pubid/astm.rb +55 -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 +91 -0
- data/lib/pubid/bsi/builder.rb +1495 -0
- data/lib/pubid/bsi/components/code.rb +11 -0
- data/lib/pubid/bsi/components/date.rb +11 -0
- data/lib/pubid/bsi/components/publisher.rb +11 -0
- data/lib/pubid/bsi/components/type.rb +11 -0
- data/lib/pubid/bsi/identifier.rb +6 -0
- data/lib/pubid/bsi/identifiers/addendum_document.rb +30 -0
- data/lib/pubid/bsi/identifiers/adopted_european_norm.rb +67 -0
- data/lib/pubid/bsi/identifiers/adopted_international_standard.rb +51 -0
- data/lib/pubid/bsi/identifiers/aerospace_standard.rb +65 -0
- data/lib/pubid/bsi/identifiers/amendment.rb +48 -0
- data/lib/pubid/bsi/identifiers/british_industrial_practice.rb +21 -0
- data/lib/pubid/bsi/identifiers/british_standard.rb +34 -0
- data/lib/pubid/bsi/identifiers/bundled_identifier.rb +40 -0
- data/lib/pubid/bsi/identifiers/committee_document.rb +44 -0
- data/lib/pubid/bsi/identifiers/consolidated_identifier.rb +84 -0
- data/lib/pubid/bsi/identifiers/corrigendum.rb +44 -0
- data/lib/pubid/bsi/identifiers/detailed_specification.rb +33 -0
- data/lib/pubid/bsi/identifiers/disc.rb +27 -0
- data/lib/pubid/bsi/identifiers/draft_document.rb +27 -0
- data/lib/pubid/bsi/identifiers/electronic_book.rb +16 -0
- data/lib/pubid/bsi/identifiers/expert_commentary.rb +36 -0
- data/lib/pubid/bsi/identifiers/explanatory_supplement.rb +35 -0
- data/lib/pubid/bsi/identifiers/flex.rb +30 -0
- data/lib/pubid/bsi/identifiers/handbook.rb +23 -0
- data/lib/pubid/bsi/identifiers/index.rb +30 -0
- data/lib/pubid/bsi/identifiers/method.rb +35 -0
- data/lib/pubid/bsi/identifiers/national_annex.rb +48 -0
- data/lib/pubid/bsi/identifiers/practice_guide.rb +21 -0
- data/lib/pubid/bsi/identifiers/publicly_available_specification.rb +27 -0
- data/lib/pubid/bsi/identifiers/published_document.rb +27 -0
- data/lib/pubid/bsi/identifiers/section.rb +32 -0
- data/lib/pubid/bsi/identifiers/set.rb +40 -0
- data/lib/pubid/bsi/identifiers/standalone_amendment.rb +40 -0
- data/lib/pubid/bsi/identifiers/supplement_document.rb +29 -0
- data/lib/pubid/bsi/identifiers/supplementary_index.rb +35 -0
- data/lib/pubid/bsi/identifiers/technical_specification.rb +34 -0
- data/lib/pubid/bsi/identifiers/test_method.rb +35 -0
- data/lib/pubid/bsi/identifiers/value_added_publication.rb +37 -0
- data/lib/pubid/bsi/identifiers.rb +51 -0
- data/lib/pubid/bsi/model.rb +196 -0
- data/lib/pubid/bsi/parser.rb +673 -0
- data/lib/pubid/bsi/renderer.rb +1064 -0
- data/lib/pubid/bsi/single_identifier.rb +141 -0
- data/lib/pubid/bsi/urn_generator.rb +92 -0
- data/lib/pubid/bsi/urn_parser.rb +52 -0
- data/lib/pubid/bsi.rb +282 -0
- data/lib/pubid/builder/base.rb +187 -0
- data/lib/pubid/bundled_identifier.rb +134 -0
- 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 +82 -0
- data/lib/pubid/ccsds/builder.rb +57 -0
- data/lib/pubid/ccsds/identifier.rb +76 -0
- data/lib/pubid/ccsds/identifiers/base.rb +41 -0
- data/lib/pubid/ccsds/identifiers/base_BASE_88929.rb +70 -0
- data/lib/pubid/ccsds/identifiers/corrigendum.rb +40 -0
- data/lib/pubid/ccsds/identifiers.rb +10 -0
- data/lib/pubid/ccsds/parser.rb +73 -0
- data/lib/pubid/ccsds/single_identifier.rb +77 -0
- data/lib/pubid/ccsds/supplement_identifier.rb +37 -0
- data/lib/pubid/ccsds/urn_generator.rb +115 -0
- data/lib/pubid/ccsds/urn_parser.rb +20 -0
- data/lib/pubid/ccsds.rb +64 -0
- data/lib/pubid/cen_cenelec/builder.rb +362 -0
- data/lib/pubid/cen_cenelec/identifier.rb +38 -0
- data/lib/pubid/cen_cenelec/identifiers/adopted_european_norm.rb +45 -0
- data/lib/pubid/cen_cenelec/identifiers/amendment.rb +19 -0
- data/lib/pubid/cen_cenelec/identifiers/base.rb +34 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_report.rb +29 -0
- data/lib/pubid/cen_cenelec/identifiers/cen_workshop_agreement.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/cenelec_harmonization_document.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/consolidated_identifier.rb +40 -0
- data/lib/pubid/cen_cenelec/identifiers/corrigendum.rb +20 -0
- data/lib/pubid/cen_cenelec/identifiers/european_norm.rb +99 -0
- data/lib/pubid/cen_cenelec/identifiers/european_prestandard.rb +50 -0
- data/lib/pubid/cen_cenelec/identifiers/european_specification.rb +29 -0
- data/lib/pubid/cen_cenelec/identifiers/fragment.rb +18 -0
- data/lib/pubid/cen_cenelec/identifiers/guide.rb +27 -0
- data/lib/pubid/cen_cenelec/identifiers/harmonization_document.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_report.rb +28 -0
- data/lib/pubid/cen_cenelec/identifiers/technical_specification.rb +36 -0
- data/lib/pubid/cen_cenelec/identifiers.rb +32 -0
- data/lib/pubid/cen_cenelec/parser.rb +144 -0
- data/lib/pubid/cen_cenelec/renderer.rb +261 -0
- data/lib/pubid/cen_cenelec/single_identifier.rb +49 -0
- data/lib/pubid/cen_cenelec/supplement_identifier.rb +47 -0
- data/lib/pubid/cen_cenelec/urn_generator.rb +129 -0
- data/lib/pubid/cen_cenelec/urn_parser.rb +28 -0
- data/lib/pubid/cen_cenelec.rb +208 -0
- data/lib/pubid/cie/builder.rb +524 -0
- data/lib/pubid/cie/components/language.rb +58 -0
- data/lib/pubid/cie/identifier.rb +33 -0
- data/lib/pubid/cie/identifiers/bundle.rb +50 -0
- data/lib/pubid/cie/identifiers/code_attributes.rb +52 -0
- data/lib/pubid/cie/identifiers/conference.rb +37 -0
- data/lib/pubid/cie/identifiers/corrigendum.rb +34 -0
- data/lib/pubid/cie/identifiers/dual_published.rb +41 -0
- data/lib/pubid/cie/identifiers/identical.rb +64 -0
- data/lib/pubid/cie/identifiers/joint_published.rb +52 -0
- data/lib/pubid/cie/identifiers/proceedings.rb +41 -0
- data/lib/pubid/cie/identifiers/standard.rb +93 -0
- data/lib/pubid/cie/identifiers/supplement.rb +47 -0
- data/lib/pubid/cie/identifiers/tutorial_bundle.rb +24 -0
- data/lib/pubid/cie/identifiers.rb +19 -0
- data/lib/pubid/cie/parser.rb +396 -0
- data/lib/pubid/cie/single_identifier.rb +69 -0
- data/lib/pubid/cie/supplement_identifier.rb +39 -0
- data/lib/pubid/cie/urn_generator.rb +126 -0
- data/lib/pubid/cie/urn_parser.rb +28 -0
- data/lib/pubid/cie.rb +83 -0
- data/lib/pubid/components/adoption.rb +104 -0
- data/lib/pubid/components/code.rb +47 -0
- data/lib/pubid/components/date.rb +72 -0
- data/lib/pubid/components/edition.rb +35 -0
- data/lib/pubid/components/iteration.rb +32 -0
- data/lib/pubid/components/language.rb +39 -0
- data/lib/pubid/components/locality.rb +19 -0
- data/lib/pubid/components/publisher.rb +39 -0
- data/lib/pubid/components/relationship.rb +151 -0
- data/lib/pubid/components/stage.rb +45 -0
- data/lib/pubid/components/supplement.rb +184 -0
- data/lib/pubid/components/type.rb +48 -0
- data/lib/pubid/components/typed_stage.rb +58 -0
- data/lib/pubid/components.rb +19 -0
- data/lib/pubid/core/pattern_doc_generator.rb +272 -0
- data/lib/pubid/core/update_codes.rb +98 -0
- data/lib/pubid/core.rb +8 -0
- data/lib/pubid/csa/builder.rb +671 -0
- data/lib/pubid/csa/components/code.rb +9 -0
- data/lib/pubid/csa/components.rb +9 -0
- data/lib/pubid/csa/composite_identifier.rb +38 -0
- data/lib/pubid/csa/identifier.rb +570 -0
- data/lib/pubid/csa/identifiers/base.rb +10 -0
- data/lib/pubid/csa/identifiers/bundled.rb +141 -0
- data/lib/pubid/csa/identifiers/canadian_adopted.rb +82 -0
- data/lib/pubid/csa/identifiers/cec.rb +66 -0
- data/lib/pubid/csa/identifiers/combined.rb +158 -0
- data/lib/pubid/csa/identifiers/csa_adopted.rb +78 -0
- data/lib/pubid/csa/identifiers/package.rb +65 -0
- data/lib/pubid/csa/identifiers/series.rb +23 -0
- data/lib/pubid/csa/identifiers/standard.rb +10 -0
- data/lib/pubid/csa/identifiers.rb +17 -0
- data/lib/pubid/csa/parser.rb +449 -0
- data/lib/pubid/csa/renderer.rb +300 -0
- data/lib/pubid/csa/single_identifier.rb +119 -0
- data/lib/pubid/csa/urn_generator.rb +87 -0
- data/lib/pubid/csa/urn_parser.rb +33 -0
- data/lib/pubid/csa/wrapper_identifier.rb +64 -0
- data/lib/pubid/csa.rb +80 -0
- 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 +55 -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 +52 -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 +67 -0
- data/lib/pubid/errors.rb +79 -0
- data/lib/pubid/etsi/builder.rb +142 -0
- data/lib/pubid/etsi/components/code.rb +43 -0
- data/lib/pubid/etsi/components/version.rb +32 -0
- data/lib/pubid/etsi/components.rb +10 -0
- data/lib/pubid/etsi/identifier.rb +4 -0
- data/lib/pubid/etsi/identifiers/amendment.rb +15 -0
- data/lib/pubid/etsi/identifiers/base.rb +74 -0
- data/lib/pubid/etsi/identifiers/corrigendum.rb +15 -0
- data/lib/pubid/etsi/identifiers/etsi_standard.rb +222 -0
- data/lib/pubid/etsi/identifiers/supplement_identifier.rb +123 -0
- data/lib/pubid/etsi/identifiers.rb +13 -0
- data/lib/pubid/etsi/parser.rb +139 -0
- data/lib/pubid/etsi/renderer.rb +48 -0
- data/lib/pubid/etsi/urn_generator.rb +76 -0
- data/lib/pubid/etsi/urn_parser.rb +34 -0
- data/lib/pubid/etsi.rb +71 -0
- data/lib/pubid/export/auditor.rb +89 -0
- data/lib/pubid/export/exporter.rb +33 -0
- data/lib/pubid/export/flavor_exporter.rb +250 -0
- data/lib/pubid/export/result.rb +97 -0
- data/lib/pubid/export.rb +12 -0
- data/lib/pubid/format_detector.rb +16 -0
- data/lib/pubid/format_registry.rb +42 -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 +87 -0
- data/lib/pubid/gost/builder.rb +148 -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 +49 -0
- data/lib/pubid/iala/builder.rb +102 -0
- data/lib/pubid/iala/identifier.rb +90 -0
- data/lib/pubid/iala/identifiers/advice.rb +15 -0
- data/lib/pubid/iala/identifiers/annex.rb +57 -0
- data/lib/pubid/iala/identifiers/general_assembly.rb +19 -0
- data/lib/pubid/iala/identifiers/guideline.rb +17 -0
- data/lib/pubid/iala/identifiers/letter.rb +16 -0
- data/lib/pubid/iala/identifiers/manual.rb +18 -0
- data/lib/pubid/iala/identifiers/model_course.rb +17 -0
- data/lib/pubid/iala/identifiers/recommendation.rb +17 -0
- data/lib/pubid/iala/identifiers/report.rb +16 -0
- data/lib/pubid/iala/identifiers/resolution.rb +16 -0
- data/lib/pubid/iala/identifiers/standard.rb +17 -0
- data/lib/pubid/iala/identifiers.rb +19 -0
- data/lib/pubid/iala/parser.rb +138 -0
- data/lib/pubid/iala/renderer.rb +36 -0
- data/lib/pubid/iala/urn_generator.rb +49 -0
- data/lib/pubid/iala/urn_parser.rb +67 -0
- data/lib/pubid/iala.rb +71 -0
- 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 +69 -0
- data/lib/pubid/identifier.rb +1118 -0
- data/lib/pubid/identifier_metadata.rb +148 -0
- data/lib/pubid/idf/builder.rb +82 -0
- data/lib/pubid/idf/identifier.rb +79 -0
- data/lib/pubid/idf/identifiers/amendment.rb +28 -0
- data/lib/pubid/idf/identifiers/corrigendum.rb +28 -0
- data/lib/pubid/idf/identifiers/international_standard.rb +124 -0
- data/lib/pubid/idf/identifiers/reviewed_method.rb +101 -0
- data/lib/pubid/idf/identifiers.rb +13 -0
- data/lib/pubid/idf/parser.rb +144 -0
- data/lib/pubid/idf/renderer.rb +84 -0
- data/lib/pubid/idf/single_identifier.rb +19 -0
- data/lib/pubid/idf/supplement_identifier.rb +35 -0
- data/lib/pubid/idf/urn_generator.rb +49 -0
- data/lib/pubid/idf/urn_parser.rb +25 -0
- data/lib/pubid/idf.rb +89 -0
- data/lib/pubid/iec/builder.rb +458 -0
- data/lib/pubid/iec/components/code.rb +36 -0
- data/lib/pubid/iec/components/consolidated_amendment.rb +59 -0
- data/lib/pubid/iec/components/publisher.rb +35 -0
- data/lib/pubid/iec/components/sheet.rb +32 -0
- data/lib/pubid/iec/components/trf_info.rb +38 -0
- data/lib/pubid/iec/components/vap_suffix.rb +41 -0
- data/lib/pubid/iec/components.rb +14 -0
- data/lib/pubid/iec/identifier.rb +341 -0
- data/lib/pubid/iec/identifiers/amendment.rb +97 -0
- data/lib/pubid/iec/identifiers/base.rb +54 -0
- data/lib/pubid/iec/identifiers/component_specification.rb +29 -0
- data/lib/pubid/iec/identifiers/conformity_assessment.rb +28 -0
- data/lib/pubid/iec/identifiers/consolidated_identifier.rb +85 -0
- data/lib/pubid/iec/identifiers/corrigendum.rb +93 -0
- data/lib/pubid/iec/identifiers/fragment_identifier.rb +148 -0
- data/lib/pubid/iec/identifiers/guide.rb +86 -0
- data/lib/pubid/iec/identifiers/international_standard.rb +162 -0
- data/lib/pubid/iec/identifiers/interpretation_sheet.rb +103 -0
- data/lib/pubid/iec/identifiers/operational_document.rb +29 -0
- data/lib/pubid/iec/identifiers/publicly_available_specification.rb +88 -0
- data/lib/pubid/iec/identifiers/sheet_identifier.rb +68 -0
- data/lib/pubid/iec/identifiers/societal_technology_trend_report.rb +30 -0
- data/lib/pubid/iec/identifiers/systems_reference_document.rb +29 -0
- data/lib/pubid/iec/identifiers/technical_group.rb +30 -0
- data/lib/pubid/iec/identifiers/technical_report.rb +114 -0
- data/lib/pubid/iec/identifiers/technical_specification.rb +114 -0
- data/lib/pubid/iec/identifiers/technology_report.rb +28 -0
- data/lib/pubid/iec/identifiers/test_report_form.rb +35 -0
- data/lib/pubid/iec/identifiers/vap_identifier.rb +76 -0
- data/lib/pubid/iec/identifiers/white_paper.rb +29 -0
- data/lib/pubid/iec/identifiers/working_document.rb +62 -0
- data/lib/pubid/iec/identifiers.rb +31 -0
- data/lib/pubid/iec/parser.rb +443 -0
- data/lib/pubid/iec/renderer.rb +267 -0
- data/lib/pubid/iec/rendering_style.rb +113 -0
- data/lib/pubid/iec/single_identifier.rb +72 -0
- data/lib/pubid/iec/supplement_identifier.rb +178 -0
- data/lib/pubid/iec/urn_generator.rb +245 -0
- data/lib/pubid/iec/urn_parser.rb +128 -0
- data/lib/pubid/iec.rb +64 -0
- data/lib/pubid/ieee/aiee/builder.rb +85 -0
- data/lib/pubid/ieee/aiee/identifier.rb +89 -0
- data/lib/pubid/ieee/aiee/parser.rb +130 -0
- data/lib/pubid/ieee/aiee.rb +11 -0
- data/lib/pubid/ieee/builder.rb +1554 -0
- data/lib/pubid/ieee/compaction.rb +121 -0
- data/lib/pubid/ieee/components/code.rb +110 -0
- data/lib/pubid/ieee/components/draft.rb +147 -0
- data/lib/pubid/ieee/components/relationship.rb +13 -0
- data/lib/pubid/ieee/components/typed_stage.rb +100 -0
- data/lib/pubid/ieee/identifier.rb +5 -0
- data/lib/pubid/ieee/identifiers/adopted_standard.rb +81 -0
- data/lib/pubid/ieee/identifiers/amendment.rb +40 -0
- data/lib/pubid/ieee/identifiers/base.rb +384 -0
- data/lib/pubid/ieee/identifiers/code_number.rb +82 -0
- data/lib/pubid/ieee/identifiers/conformance_identifier.rb +29 -0
- data/lib/pubid/ieee/identifiers/corrigendum.rb +40 -0
- data/lib/pubid/ieee/identifiers/csa_dual_published.rb +62 -0
- data/lib/pubid/ieee/identifiers/dual_identifier.rb +14 -0
- data/lib/pubid/ieee/identifiers/dual_published.rb +79 -0
- data/lib/pubid/ieee/identifiers/iec_ieee_copublished.rb +115 -0
- data/lib/pubid/ieee/identifiers/interpretation_identifier.rb +48 -0
- data/lib/pubid/ieee/identifiers/joint_development.rb +223 -0
- data/lib/pubid/ieee/identifiers/multi_numbered_identifier.rb +85 -0
- data/lib/pubid/ieee/identifiers/nesc/base.rb +127 -0
- data/lib/pubid/ieee/identifiers/nesc/draft.rb +43 -0
- data/lib/pubid/ieee/identifiers/nesc/edition.rb +32 -0
- data/lib/pubid/ieee/identifiers/nesc/handbook.rb +43 -0
- data/lib/pubid/ieee/identifiers/nesc/redline.rb +35 -0
- data/lib/pubid/ieee/identifiers/nesc/standard.rb +41 -0
- data/lib/pubid/ieee/identifiers/nesc.rb +16 -0
- data/lib/pubid/ieee/identifiers/parenthetical_identifier.rb +14 -0
- data/lib/pubid/ieee/identifiers/project_draft_identifier.rb +49 -0
- data/lib/pubid/ieee/identifiers/redlined_standard.rb +26 -0
- data/lib/pubid/ieee/identifiers/si_standard.rb +38 -0
- data/lib/pubid/ieee/identifiers/standard.rb +44 -0
- data/lib/pubid/ieee/identifiers/supplement_identifier.rb +42 -0
- data/lib/pubid/ieee/identifiers.rb +34 -0
- data/lib/pubid/ieee/ire/builder.rb +62 -0
- data/lib/pubid/ieee/ire/identifier.rb +73 -0
- data/lib/pubid/ieee/ire/parser.rb +91 -0
- data/lib/pubid/ieee/ire.rb +11 -0
- data/lib/pubid/ieee/nesc/builder.rb +114 -0
- data/lib/pubid/ieee/nesc/parser.rb +155 -0
- data/lib/pubid/ieee/nesc.rb +10 -0
- data/lib/pubid/ieee/parser.rb +1644 -0
- data/lib/pubid/ieee/pre_parser.rb +301 -0
- data/lib/pubid/ieee/renderer.rb +408 -0
- data/lib/pubid/ieee/typed_stages.rb +183 -0
- data/lib/pubid/ieee/urn_generator.rb +215 -0
- data/lib/pubid/ieee/urn_parser.rb +34 -0
- data/lib/pubid/ieee.rb +163 -0
- data/lib/pubid/ieee_debug.rb +30 -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 +85 -0
- data/lib/pubid/iho/builder.rb +37 -0
- data/lib/pubid/iho/identifier.rb +7 -0
- data/lib/pubid/iho/identifiers/base.rb +75 -0
- data/lib/pubid/iho/identifiers/bibliographic.rb +16 -0
- data/lib/pubid/iho/identifiers/circular_letter.rb +15 -0
- data/lib/pubid/iho/identifiers/miscellaneous.rb +16 -0
- data/lib/pubid/iho/identifiers/publication.rb +15 -0
- data/lib/pubid/iho/identifiers/standard.rb +15 -0
- data/lib/pubid/iho/identifiers.rb +13 -0
- data/lib/pubid/iho/parser.rb +68 -0
- data/lib/pubid/iho/renderer.rb +30 -0
- data/lib/pubid/iho/urn_generator.rb +29 -0
- data/lib/pubid/iho/urn_parser.rb +58 -0
- data/lib/pubid/iho.rb +77 -0
- 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 +52 -0
- data/lib/pubid/iso/builder.rb +316 -0
- data/lib/pubid/iso/bundled_identifier.rb +138 -0
- data/lib/pubid/iso/combined_identifier.rb +24 -0
- data/lib/pubid/iso/components/code.rb +24 -0
- data/lib/pubid/iso/components/publisher.rb +62 -0
- data/lib/pubid/iso/components.rb +10 -0
- data/lib/pubid/iso/format_resolver.rb +45 -0
- data/lib/pubid/iso/identifier.rb +318 -0
- data/lib/pubid/iso/identifiers/addendum.rb +107 -0
- data/lib/pubid/iso/identifiers/amendment.rb +132 -0
- data/lib/pubid/iso/identifiers/corrigendum.rb +108 -0
- data/lib/pubid/iso/identifiers/data.rb +75 -0
- data/lib/pubid/iso/identifiers/directives.rb +65 -0
- data/lib/pubid/iso/identifiers/directives_supplement.rb +148 -0
- data/lib/pubid/iso/identifiers/extract.rb +30 -0
- data/lib/pubid/iso/identifiers/guide.rb +99 -0
- data/lib/pubid/iso/identifiers/international_standard.rb +168 -0
- data/lib/pubid/iso/identifiers/international_standardized_profile.rb +94 -0
- data/lib/pubid/iso/identifiers/international_workshop_agreement.rb +95 -0
- data/lib/pubid/iso/identifiers/pas.rb +93 -0
- data/lib/pubid/iso/identifiers/recommendation.rb +45 -0
- data/lib/pubid/iso/identifiers/supplement.rb +95 -0
- data/lib/pubid/iso/identifiers/tc_document.rb +137 -0
- data/lib/pubid/iso/identifiers/technical_report.rb +103 -0
- data/lib/pubid/iso/identifiers/technical_specification.rb +102 -0
- data/lib/pubid/iso/identifiers/technology_trends_assessments.rb +95 -0
- data/lib/pubid/iso/identifiers.rb +32 -0
- data/lib/pubid/iso/normalizer.rb +89 -0
- data/lib/pubid/iso/parser.rb +534 -0
- data/lib/pubid/iso/rendering_style.rb +120 -0
- data/lib/pubid/iso/single_identifier.rb +60 -0
- data/lib/pubid/iso/supplement_identifier.rb +53 -0
- data/lib/pubid/iso/urn_generator.rb +313 -0
- data/lib/pubid/iso/urn_parser.rb +442 -0
- data/lib/pubid/iso/utilities.rb +86 -0
- data/lib/pubid/iso.rb +236 -0
- data/lib/pubid/itu/builder.rb +360 -0
- data/lib/pubid/itu/components/code.rb +84 -0
- data/lib/pubid/itu/components/designation.rb +35 -0
- data/lib/pubid/itu/components/sector.rb +46 -0
- data/lib/pubid/itu/components/series.rb +25 -0
- data/lib/pubid/itu/components.rb +12 -0
- data/lib/pubid/itu/i18n.rb +9 -0
- data/lib/pubid/itu/i18n.yaml +30 -0
- data/lib/pubid/itu/identifier.rb +4 -0
- data/lib/pubid/itu/identifiers/addendum.rb +15 -0
- data/lib/pubid/itu/identifiers/amendment.rb +19 -0
- data/lib/pubid/itu/identifiers/annex.rb +83 -0
- 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 +482 -0
- data/lib/pubid/itu/identifiers/combined_identifier.rb +121 -0
- data/lib/pubid/itu/identifiers/corrigendum.rb +35 -0
- 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 +15 -0
- data/lib/pubid/itu/identifiers/report.rb +39 -0
- data/lib/pubid/itu/identifiers/special_publication.rb +31 -0
- data/lib/pubid/itu/identifiers/standard_serialization.rb +58 -0
- data/lib/pubid/itu/identifiers/supplement.rb +149 -0
- data/lib/pubid/itu/identifiers.rb +25 -0
- data/lib/pubid/itu/model.rb +111 -0
- data/lib/pubid/itu/parser.rb +679 -0
- data/lib/pubid/itu/urn_generator.rb +135 -0
- data/lib/pubid/itu/urn_parser.rb +31 -0
- data/lib/pubid/itu.rb +78 -0
- data/lib/pubid/jcgm/builder.rb +106 -0
- data/lib/pubid/jcgm/components/publisher.rb +20 -0
- data/lib/pubid/jcgm/components.rb +9 -0
- data/lib/pubid/jcgm/identifier.rb +21 -0
- data/lib/pubid/jcgm/identifiers/amendment.rb +24 -0
- data/lib/pubid/jcgm/identifiers/corrigendum.rb +34 -0
- data/lib/pubid/jcgm/identifiers/guide.rb +21 -0
- data/lib/pubid/jcgm/identifiers/gum_guide.rb +39 -0
- data/lib/pubid/jcgm/identifiers/meeting.rb +47 -0
- data/lib/pubid/jcgm/identifiers.rb +13 -0
- data/lib/pubid/jcgm/parser.rb +151 -0
- data/lib/pubid/jcgm/renderer.rb +89 -0
- data/lib/pubid/jcgm/single_identifier.rb +118 -0
- data/lib/pubid/jcgm/supplement_identifier.rb +51 -0
- data/lib/pubid/jcgm/urn_generator.rb +116 -0
- data/lib/pubid/jcgm/urn_parser.rb +177 -0
- data/lib/pubid/jcgm.rb +86 -0
- data/lib/pubid/jis/builder.rb +116 -0
- data/lib/pubid/jis/identifier.rb +194 -0
- data/lib/pubid/jis/identifiers/amendment.rb +16 -0
- data/lib/pubid/jis/identifiers/corrigendum.rb +16 -0
- data/lib/pubid/jis/identifiers/explanation.rb +22 -0
- data/lib/pubid/jis/identifiers/japanese_industrial_standard.rb +16 -0
- data/lib/pubid/jis/identifiers/standard.rb +28 -0
- data/lib/pubid/jis/identifiers/technical_report.rb +32 -0
- data/lib/pubid/jis/identifiers/technical_specification.rb +32 -0
- data/lib/pubid/jis/identifiers.rb +17 -0
- data/lib/pubid/jis/parser.rb +135 -0
- data/lib/pubid/jis/renderer.rb +69 -0
- data/lib/pubid/jis/single_identifier.rb +31 -0
- data/lib/pubid/jis/supplement_identifier.rb +50 -0
- data/lib/pubid/jis/urn_generator.rb +25 -0
- data/lib/pubid/jis/urn_parser.rb +23 -0
- data/lib/pubid/jis.rb +69 -0
- data/lib/pubid/lutaml/no_store_registration.rb +30 -0
- data/lib/pubid/nist/builder.rb +481 -0
- data/lib/pubid/nist/caster.rb +1234 -0
- data/lib/pubid/nist/circular_supplement_builder.rb +293 -0
- data/lib/pubid/nist/components/code.rb +27 -0
- data/lib/pubid/nist/components/edition.rb +134 -0
- data/lib/pubid/nist/components/issue_number.rb +28 -0
- data/lib/pubid/nist/components/part.rb +77 -0
- data/lib/pubid/nist/components/stage.rb +53 -0
- data/lib/pubid/nist/components/supplement.rb +191 -0
- data/lib/pubid/nist/components/translation.rb +42 -0
- data/lib/pubid/nist/components/update.rb +103 -0
- data/lib/pubid/nist/components/version.rb +35 -0
- data/lib/pubid/nist/components/volume.rb +32 -0
- data/lib/pubid/nist/components.rb +18 -0
- data/lib/pubid/nist/configuration.rb +87 -0
- data/lib/pubid/nist/identifier.rb +8 -0
- data/lib/pubid/nist/identifiers/base.rb +744 -0
- data/lib/pubid/nist/identifiers/circular.rb +80 -0
- data/lib/pubid/nist/identifiers/circular_supplement.rb +60 -0
- data/lib/pubid/nist/identifiers/commercial_standard.rb +42 -0
- data/lib/pubid/nist/identifiers/commercial_standard_emergency.rb +58 -0
- data/lib/pubid/nist/identifiers/commercial_standards_monthly.rb +69 -0
- data/lib/pubid/nist/identifiers/crpl_report.rb +138 -0
- data/lib/pubid/nist/identifiers/dated_document.rb +49 -0
- data/lib/pubid/nist/identifiers/federal_information_processing_standards.rb +95 -0
- data/lib/pubid/nist/identifiers/grant_contractor_report.rb +36 -0
- data/lib/pubid/nist/identifiers/handbook.rb +58 -0
- data/lib/pubid/nist/identifiers/internal_report.rb +64 -0
- data/lib/pubid/nist/identifiers/letter_circular.rb +46 -0
- data/lib/pubid/nist/identifiers/miscellaneous_publication.rb +74 -0
- data/lib/pubid/nist/identifiers/monograph.rb +80 -0
- data/lib/pubid/nist/identifiers/ncstar.rb +41 -0
- data/lib/pubid/nist/identifiers/nsrds.rb +41 -0
- data/lib/pubid/nist/identifiers/owmwp.rb +35 -0
- data/lib/pubid/nist/identifiers/report.rb +77 -0
- data/lib/pubid/nist/identifiers/special_publication.rb +46 -0
- data/lib/pubid/nist/identifiers/technical_note.rb +91 -0
- data/lib/pubid/nist/identifiers.rb +33 -0
- data/lib/pubid/nist/parser.rb +752 -0
- data/lib/pubid/nist/parser_output_normalizer.rb +233 -0
- data/lib/pubid/nist/preprocessor.rb +443 -0
- data/lib/pubid/nist/renderer.rb +43 -0
- data/lib/pubid/nist/router.rb +149 -0
- data/lib/pubid/nist/series/base.rb +58 -0
- data/lib/pubid/nist/series/crpl.rb +13 -0
- data/lib/pubid/nist/series/fips.rb +14 -0
- data/lib/pubid/nist/series/ir.rb +57 -0
- data/lib/pubid/nist/series/letter_preserving.rb +15 -0
- data/lib/pubid/nist/series/mono.rb +19 -0
- data/lib/pubid/nist/series/ncstar.rb +20 -0
- data/lib/pubid/nist/series.rb +49 -0
- data/lib/pubid/nist/supplement_identifier.rb +84 -0
- data/lib/pubid/nist/urn_generator.rb +133 -0
- data/lib/pubid/nist/urn_parser.rb +67 -0
- data/lib/pubid/nist.rb +138 -0
- 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 +79 -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 +71 -0
- data/lib/pubid/oiml/builder.rb +270 -0
- data/lib/pubid/oiml/components/code.rb +37 -0
- data/lib/pubid/oiml/components.rb +9 -0
- data/lib/pubid/oiml/identifier.rb +64 -0
- data/lib/pubid/oiml/identifiers/amendment.rb +13 -0
- data/lib/pubid/oiml/identifiers/annex.rb +29 -0
- data/lib/pubid/oiml/identifiers/basic_publication.rb +15 -0
- data/lib/pubid/oiml/identifiers/bulletin.rb +137 -0
- data/lib/pubid/oiml/identifiers/code_number.rb +90 -0
- data/lib/pubid/oiml/identifiers/document.rb +15 -0
- data/lib/pubid/oiml/identifiers/errata.rb +15 -0
- data/lib/pubid/oiml/identifiers/expert_report.rb +15 -0
- data/lib/pubid/oiml/identifiers/guide.rb +15 -0
- data/lib/pubid/oiml/identifiers/recommendation.rb +15 -0
- data/lib/pubid/oiml/identifiers/seminar_report.rb +15 -0
- data/lib/pubid/oiml/identifiers/vocabulary.rb +15 -0
- data/lib/pubid/oiml/identifiers.rb +20 -0
- data/lib/pubid/oiml/parser.rb +274 -0
- data/lib/pubid/oiml/renderer.rb +232 -0
- data/lib/pubid/oiml/single_identifier.rb +113 -0
- data/lib/pubid/oiml/supplement_identifier.rb +88 -0
- data/lib/pubid/oiml/urn_generator.rb +78 -0
- data/lib/pubid/oiml/urn_parser.rb +39 -0
- data/lib/pubid/oiml.rb +81 -0
- data/lib/pubid/omg/builder.rb +19 -0
- data/lib/pubid/omg/identifier.rb +47 -0
- data/lib/pubid/omg/identifiers/specification.rb +32 -0
- data/lib/pubid/omg/identifiers.rb +9 -0
- data/lib/pubid/omg/parser.rb +40 -0
- data/lib/pubid/omg/renderer.rb +19 -0
- data/lib/pubid/omg.rb +51 -0
- data/lib/pubid/parser/common_parse_methods.rb +13 -0
- data/lib/pubid/parser/common_parse_rules.rb +56 -0
- data/lib/pubid/parser/grammar.rb +74 -0
- data/lib/pubid/parser.rb +9 -0
- data/lib/pubid/parsers/base.rb +11 -0
- data/lib/pubid/parsers/mr_string.rb +206 -0
- data/lib/pubid/plateau/builder.rb +54 -0
- data/lib/pubid/plateau/identifier.rb +4 -0
- data/lib/pubid/plateau/identifiers/annex.rb +16 -0
- data/lib/pubid/plateau/identifiers/base.rb +55 -0
- data/lib/pubid/plateau/identifiers/handbook.rb +28 -0
- data/lib/pubid/plateau/identifiers/technical_report.rb +16 -0
- data/lib/pubid/plateau/identifiers.rb +11 -0
- data/lib/pubid/plateau/parser.rb +73 -0
- data/lib/pubid/plateau/renderer.rb +51 -0
- data/lib/pubid/plateau/supplement_identifier.rb +68 -0
- data/lib/pubid/plateau/urn_generator.rb +29 -0
- data/lib/pubid/plateau/urn_parser.rb +43 -0
- data/lib/pubid/plateau.rb +82 -0
- data/lib/pubid/prefixes_support.rb +51 -0
- data/lib/pubid/renderers/annotator.rb +233 -0
- data/lib/pubid/renderers/base.rb +66 -0
- data/lib/pubid/renderers/directives_renderer.rb +75 -0
- data/lib/pubid/renderers/guide_renderer.rb +26 -0
- data/lib/pubid/renderers/human_readable.rb +83 -0
- data/lib/pubid/renderers/iwa_renderer.rb +20 -0
- data/lib/pubid/renderers/mr_string.rb +64 -0
- data/lib/pubid/renderers/supplement_renderer.rb +36 -0
- data/lib/pubid/renderers/urn.rb +11 -0
- data/lib/pubid/renderers.rb +15 -0
- data/lib/pubid/rendering/context.rb +168 -0
- data/lib/pubid/rendering/date.rb +27 -0
- data/lib/pubid/rendering/language.rb +21 -0
- data/lib/pubid/rendering/numbering.rb +42 -0
- data/lib/pubid/rendering/publisher.rb +25 -0
- data/lib/pubid/rendering/stage.rb +38 -0
- data/lib/pubid/rendering/supplement.rb +46 -0
- data/lib/pubid/rendering.rb +13 -0
- data/lib/pubid/sae/builder.rb +32 -0
- data/lib/pubid/sae/components/code.rb +9 -0
- data/lib/pubid/sae/components/date.rb +27 -0
- data/lib/pubid/sae/components/type.rb +23 -0
- data/lib/pubid/sae/components.rb +11 -0
- data/lib/pubid/sae/identifier.rb +4 -0
- data/lib/pubid/sae/identifiers/base.rb +47 -0
- data/lib/pubid/sae/identifiers.rb +8 -0
- data/lib/pubid/sae/parser.rb +55 -0
- data/lib/pubid/sae/renderer.rb +36 -0
- data/lib/pubid/sae/urn_generator.rb +30 -0
- data/lib/pubid/sae/urn_parser.rb +36 -0
- data/lib/pubid/sae.rb +66 -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 +83 -0
- data/lib/pubid/type_resolver.rb +59 -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 +46 -0
- data/lib/pubid/urn_generator/base.rb +110 -0
- data/lib/pubid/urn_parser/base.rb +81 -0
- data/lib/pubid/urn_parser/errors.rb +16 -0
- data/lib/pubid/urn_parser.rb +14 -0
- data/lib/pubid/utils/string_normalizer.rb +196 -0
- data/lib/pubid/utils.rb +7 -0
- data/lib/pubid/version.rb +3 -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 +67 -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 +25 -0
- data/lib/pubid/xsf/renderer.rb +23 -0
- data/lib/pubid/xsf/urn_generator.rb +13 -0
- data/lib/pubid/xsf/urn_parser.rb +18 -0
- data/lib/pubid/xsf.rb +81 -0
- data/lib/pubid.rb +551 -13
- data/lib/tasks/docs.rake +37 -0
- data/lib/tasks/export.rake +39 -0
- data/lib/tasks/website-data.json +7546 -0
- metadata +875 -171
- data/lib/pubid/registry.rb +0 -30
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Nist
|
|
5
|
+
# Parses NIST URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits:
|
|
8
|
+
# urn:nist:{type}:{code}[.{revision}].supp
|
|
9
|
+
#
|
|
10
|
+
# type is the lowercase series (sp, fips, ir, nistcir, …). code is the
|
|
11
|
+
# alphanumeric designation. revision is `r{N}` when present. The `.supp`
|
|
12
|
+
# suffix marks the series as supplementable.
|
|
13
|
+
#
|
|
14
|
+
# Examples:
|
|
15
|
+
# - urn:nist:sp:800-53.supp → NIST SP 800-53
|
|
16
|
+
# - urn:nist:sp:800-53.r5.supp → NIST SP 800-53r5
|
|
17
|
+
# - urn:nist:fips:199.supp → NIST FIPS 199
|
|
18
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
19
|
+
TYPE_UPCASE = {
|
|
20
|
+
"sp" => "SP",
|
|
21
|
+
"fips" => "FIPS",
|
|
22
|
+
"ir" => "IR",
|
|
23
|
+
"nistcir" => "NISTCIR",
|
|
24
|
+
"nbs" => "NBS",
|
|
25
|
+
"nistir" => "NISTIR",
|
|
26
|
+
"csf" => "CSF",
|
|
27
|
+
"gcr" => "GCR",
|
|
28
|
+
"itl" => "ITL",
|
|
29
|
+
"jres" => "JRES",
|
|
30
|
+
"lcirc" => "LCIRC",
|
|
31
|
+
"mon" => "MONO",
|
|
32
|
+
"ms" => "MS",
|
|
33
|
+
"nsrds" => "NSRDS",
|
|
34
|
+
"tn" => "TN",
|
|
35
|
+
"wp" => "WP",
|
|
36
|
+
}.freeze
|
|
37
|
+
|
|
38
|
+
def parse_urn(urn)
|
|
39
|
+
body = strip_namespace(urn)
|
|
40
|
+
parts = split_parts(body)
|
|
41
|
+
|
|
42
|
+
type_token, payload = parts
|
|
43
|
+
code, revision = parse_payload(payload)
|
|
44
|
+
|
|
45
|
+
text = "NIST #{type_label(type_token)} #{code}"
|
|
46
|
+
text += revision if revision
|
|
47
|
+
flavor_parse(text)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
|
|
52
|
+
def parse_payload(payload)
|
|
53
|
+
# Strip the trailing ".supp" supplement marker.
|
|
54
|
+
stripped = payload.sub(/\.supp\z/, "")
|
|
55
|
+
# Split revision suffix from code (e.g., "800-53.r5" → ["800-53", "r5"]).
|
|
56
|
+
match = stripped.match(/^(.*)\.(r\d+)$/i)
|
|
57
|
+
return [stripped, nil] unless match
|
|
58
|
+
|
|
59
|
+
[match[1], match[2]]
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def type_label(token)
|
|
63
|
+
TYPE_UPCASE.fetch(token.downcase) { token.upcase }
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
data/lib/pubid/nist.rb
ADDED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Nist
|
|
5
|
+
extend Pubid::PrefixesSupport
|
|
6
|
+
|
|
7
|
+
# Publisher prefixes (NBS/NIST) plus the "simple series" tokens that can
|
|
8
|
+
# *begin* a printed reference on their own — mirrors the parser's
|
|
9
|
+
# `publisher` and `simple_series` rules (lib/pubid/nist/parser.rb). Compound
|
|
10
|
+
# series that only appear glued to a publisher (e.g. "NBS CRPL-F-A") are
|
|
11
|
+
# excluded because they never lead a routable reference by themselves.
|
|
12
|
+
PREFIXES = %w[
|
|
13
|
+
NIST NBS
|
|
14
|
+
AMS VTS BSS BMS BH FIPS GCR HB MONO MP NCSTAR NSRDS IR SP TN CSWP
|
|
15
|
+
AI CIRC CS CSM CRPL LCIRC OWMWP PC RPT SIBS TIBM TTB EAB JPCRD JRES
|
|
16
|
+
CHIPS NWIRP RB
|
|
17
|
+
].freeze
|
|
18
|
+
|
|
19
|
+
autoload :Builder, "#{__dir__}/nist/builder"
|
|
20
|
+
autoload :Caster, "#{__dir__}/nist/caster"
|
|
21
|
+
autoload :CircularSupplementBuilder, "#{__dir__}/nist/circular_supplement_builder"
|
|
22
|
+
autoload :Components, "#{__dir__}/nist/components"
|
|
23
|
+
autoload :Configuration, "#{__dir__}/nist/configuration"
|
|
24
|
+
autoload :Identifier, "#{__dir__}/nist/identifiers/base"
|
|
25
|
+
autoload :Identifiers, "#{__dir__}/nist/identifiers"
|
|
26
|
+
autoload :Parser, "#{__dir__}/nist/parser"
|
|
27
|
+
autoload :ParserOutputNormalizer, "#{__dir__}/nist/parser_output_normalizer"
|
|
28
|
+
autoload :Preprocessor, "#{__dir__}/nist/preprocessor"
|
|
29
|
+
autoload :Renderer, "#{__dir__}/nist/renderer"
|
|
30
|
+
autoload :Router, "#{__dir__}/nist/router"
|
|
31
|
+
autoload :Series, "#{__dir__}/nist/series"
|
|
32
|
+
autoload :SupplementIdentifier, "#{__dir__}/nist/supplement_identifier"
|
|
33
|
+
autoload :UrnGenerator, "#{__dir__}/nist/urn_generator"
|
|
34
|
+
autoload :UrnParser, "#{__dir__}/nist/urn_parser"
|
|
35
|
+
|
|
36
|
+
# Explicit registry of NIST identifier classes.
|
|
37
|
+
#
|
|
38
|
+
# NIST identifier classes use `typed_stages` (not the `self.type` Hash
|
|
39
|
+
# pattern used by CEN/JCGM/ANSI), so they cannot be auto-discovered.
|
|
40
|
+
# Identifier is the fallback for unmapped series (e.g. AMS, VTS)
|
|
41
|
+
# and must be excluded from typed-stage aggregation.
|
|
42
|
+
IDENTIFIER_TYPES = [
|
|
43
|
+
Identifiers::SpecialPublication,
|
|
44
|
+
Identifiers::FederalInformationProcessingStandards,
|
|
45
|
+
Identifiers::InteragencyReport,
|
|
46
|
+
Identifiers::Handbook,
|
|
47
|
+
Identifiers::TechnicalNote,
|
|
48
|
+
Identifiers::Circular,
|
|
49
|
+
Identifiers::CircularSupplement,
|
|
50
|
+
Identifiers::CrplReport,
|
|
51
|
+
Identifiers::Report,
|
|
52
|
+
Identifiers::Monograph,
|
|
53
|
+
Identifiers::MiscellaneousPublication,
|
|
54
|
+
Identifiers::GrantContractorReport,
|
|
55
|
+
Identifiers::Ncstar,
|
|
56
|
+
Identifiers::Owmwp,
|
|
57
|
+
Identifiers::Nsrds,
|
|
58
|
+
Identifiers::LetterCircular,
|
|
59
|
+
Identifiers::CommercialStandard,
|
|
60
|
+
Identifiers::CommercialStandardEmergency,
|
|
61
|
+
Identifiers::CommercialStandardsMonthly,
|
|
62
|
+
Identifiers::DatedDocument,
|
|
63
|
+
Identifier, # Fallback for unmapped series
|
|
64
|
+
].freeze
|
|
65
|
+
|
|
66
|
+
# Parse a NIST identifier string
|
|
67
|
+
# @param identifier [String] the identifier string to parse
|
|
68
|
+
# @return [Identifier] the parsed identifier
|
|
69
|
+
def self.parse(identifier)
|
|
70
|
+
unless identifier.is_a?(String)
|
|
71
|
+
raise Pubid::Errors::InvalidInputError,
|
|
72
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
76
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Use the Parser class's preprocessing method
|
|
80
|
+
# Note: We call the class method directly to ensure preprocessing is applied
|
|
81
|
+
parsed = Parser.class_parse_with_preprocessing(identifier)
|
|
82
|
+
|
|
83
|
+
# Builder is stateless — lookups go through this module (Pubid::Nist)
|
|
84
|
+
builder = Builder.new
|
|
85
|
+
builder.build(parsed)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Get the configuration instance
|
|
89
|
+
# @return [Configuration] the configuration instance
|
|
90
|
+
def self.configuration
|
|
91
|
+
@configuration ||= Configuration.new
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# Per-flavor format registry: inherits global formats, overrides :human
|
|
95
|
+
Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
|
|
96
|
+
Identifier.format_registry.register(:human, renderer: Nist::Renderer)
|
|
97
|
+
|
|
98
|
+
# All identifier classes for external consumption (export, website).
|
|
99
|
+
# Identifier is the fallback for unmapped series and is excluded
|
|
100
|
+
# from external type listings.
|
|
101
|
+
# @return [Array<Class>] identifier classes
|
|
102
|
+
def self.identifier_types
|
|
103
|
+
IDENTIFIER_TYPES.reject { |klass| klass == Identifier }
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# Aggregate TYPED_STAGES from all identifier classes.
|
|
107
|
+
# Identifier is excluded because it has no typed stages and acts
|
|
108
|
+
# as the fallback for unmapped series.
|
|
109
|
+
# @return [Array<Pubid::Components::TypedStage>] all typed stages
|
|
110
|
+
def self.all_typed_stages
|
|
111
|
+
@all_typed_stages ||= identifier_types
|
|
112
|
+
.reject { |klass| klass == Identifier }
|
|
113
|
+
.flat_map(&:typed_stages)
|
|
114
|
+
.freeze
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# Lookup: type code -> identifier class.
|
|
118
|
+
# Identifier is excluded so it never gets selected by type code.
|
|
119
|
+
# @param code [String, Symbol] the type code to find
|
|
120
|
+
# @return [Class, nil] the matching identifier class, or nil
|
|
121
|
+
def self.locate_type(code)
|
|
122
|
+
type_str = code.to_s
|
|
123
|
+
identifier_types
|
|
124
|
+
.reject { |klass| klass == Identifier }
|
|
125
|
+
.find { |klass| klass.typed_stages.any? { |ts| ts.type_code.to_s == type_str } }
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# Lookup: abbreviation -> typed stage
|
|
129
|
+
# @param abbr [String, Symbol] the abbreviation to find
|
|
130
|
+
# @return [Pubid::Components::TypedStage, nil] the matching typed stage
|
|
131
|
+
def self.locate_stage(abbr)
|
|
132
|
+
abbr_str = abbr.to_s.upcase
|
|
133
|
+
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
Pubid::Registry.register(:nist, Pubid::Nist)
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
# Turns the parse tree into an `Identifiers::Standard`: stores the slug
|
|
6
|
+
# verbatim in `original`, then performs a best-effort, ORDER-INDEPENDENT
|
|
7
|
+
# decomposition into number / version / stage / part / label.
|
|
8
|
+
#
|
|
9
|
+
# Decomposition splits `original` on "-" and classifies each *whole*
|
|
10
|
+
# fragment (so a stage-like substring inside a spec name — e.g. "CSDL" — is
|
|
11
|
+
# never mistaken for a stage). `number` is the specification name: the run
|
|
12
|
+
# of leading name fragments before the first recognized fragment, and the
|
|
13
|
+
# key relaton-index sorts and binary-searches on. `version`/`stage`/`part`
|
|
14
|
+
# are the first fragment of each recognized kind; `label` is any name
|
|
15
|
+
# fragment appearing after the first recognized one. Anything the
|
|
16
|
+
# classifier cannot place stays only in `original`, so the printed form
|
|
17
|
+
# always round-trips.
|
|
18
|
+
class Builder
|
|
19
|
+
# A fragment is a version when it is `v?N(.N)+` (e.g. "3.0", "v1.2.1",
|
|
20
|
+
# "V1.0"). Bare integers are deliberately NOT versions (too ambiguous
|
|
21
|
+
# with spec-name tokens).
|
|
22
|
+
VERSION_RE = /\Av?\d+(?:\.\d+)+\z/i
|
|
23
|
+
# OASIS approval-stage tokens (+ optional revision digits). Longest-first
|
|
24
|
+
# so shared prefixes classify correctly (CSPRD/CSD before CS, COS before
|
|
25
|
+
# CS/OS).
|
|
26
|
+
STAGE_RE = /\A(?:CSPRD|CSD|COS|CS|WD|OS|PS|PRD|CD|Errata)\d*\z/
|
|
27
|
+
# Part tokens across the three observed spellings, plus bare "Pt"/"P".
|
|
28
|
+
PART_RE = /\A(?:Part|Pt|part|P)\d*\z/
|
|
29
|
+
|
|
30
|
+
def self.build(parsed_data)
|
|
31
|
+
new.build(parsed_data)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def build(data)
|
|
35
|
+
original = data[:original].to_s
|
|
36
|
+
Identifiers::Standard.new(original: original, **decompose(original))
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
private
|
|
40
|
+
|
|
41
|
+
# @return [Hash] best-effort { number:, version:, stage:, part:, label: }.
|
|
42
|
+
# Each fragment is classified once into a [fragment, kind] pair. `number`
|
|
43
|
+
# is the leading run of name fragments; `label` is any name fragment after
|
|
44
|
+
# the first recognized one; version/stage/part are the first of each kind.
|
|
45
|
+
def decompose(original)
|
|
46
|
+
pairs = original.split("-").map { |f| [f, classify(f)] }
|
|
47
|
+
lead = pairs.take_while { |_, kind| kind.nil? }
|
|
48
|
+
rest = pairs.drop(lead.length)
|
|
49
|
+
{
|
|
50
|
+
number: names(lead),
|
|
51
|
+
version: first_of(rest, :version),
|
|
52
|
+
stage: first_of(rest, :stage),
|
|
53
|
+
part: first_of(rest, :part),
|
|
54
|
+
label: names(rest),
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# @return [Symbol, nil] :version / :stage / :part, or nil for a name token
|
|
59
|
+
def classify(fragment)
|
|
60
|
+
return :version if fragment.match?(VERSION_RE)
|
|
61
|
+
return :stage if fragment.match?(STAGE_RE)
|
|
62
|
+
return :part if fragment.match?(PART_RE)
|
|
63
|
+
|
|
64
|
+
nil
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# First fragment of the given kind among [fragment, kind] pairs, or nil.
|
|
68
|
+
def first_of(pairs, kind)
|
|
69
|
+
pairs.find { |_, k| k == kind }&.first
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
# Name (unclassified) fragments among the pairs, re-joined, or nil.
|
|
73
|
+
def names(pairs)
|
|
74
|
+
fragments = pairs.select { |_, kind| kind.nil? }.map(&:first)
|
|
75
|
+
fragments.empty? ? nil : fragments.join("-")
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
# Base class for every OASIS identifier AND the flavor's parse/create entry
|
|
6
|
+
# point. The single concrete type `Identifiers::Standard` descends from this
|
|
7
|
+
# class, so a parsed OASIS id is an instance of `Pubid::Oasis::Identifier`.
|
|
8
|
+
#
|
|
9
|
+
# OASIS identifiers are free-form slugs with an inconsistent internal
|
|
10
|
+
# structure (spec name + version + approval stage + part + label, in
|
|
11
|
+
# varying order). To guarantee a lossless round-trip we always keep the
|
|
12
|
+
# exact printed slug verbatim in `original` (which alone drives `to_s`); the
|
|
13
|
+
# remaining component fields are a best-effort decomposition for relaton
|
|
14
|
+
# querying and can be nil without ever affecting the rendered string.
|
|
15
|
+
class Identifier < ::Pubid::Identifier
|
|
16
|
+
# The exact slug printed after "OASIS " — always set. Drives `to_s`, so
|
|
17
|
+
# the printed form round-trips verbatim regardless of decomposition.
|
|
18
|
+
attribute :original, :string
|
|
19
|
+
# Best-effort decomposition (any may be nil). `number`/`label` are plain
|
|
20
|
+
# slug fragments; `version`/`stage`/`part` carry the recognized fragment
|
|
21
|
+
# verbatim (e.g. "3.0", "v1.2.1", "PS01", "Errata01", "Pt8", "Part1").
|
|
22
|
+
#
|
|
23
|
+
# `number` holds the specification name ("OSLC-CM", "STIX", "amqp-core").
|
|
24
|
+
# It is the key relaton-index sorts and binary-searches on
|
|
25
|
+
# (`id.root.number.to_s`), and it deliberately CLUSTERS: every version,
|
|
26
|
+
# stage and part of one specification shares it, the same shape as an
|
|
27
|
+
# IETF draft slug or an IANA registry slug.
|
|
28
|
+
#
|
|
29
|
+
# `number`/`stage`/`part` intentionally override the inherited
|
|
30
|
+
# Components::Code / Components::Stage attributes with plain strings (the
|
|
31
|
+
# mechanism JIS uses for `number` and W3C for `date`): OASIS names,
|
|
32
|
+
# stages and parts are opaque tokens that must round-trip exactly and are
|
|
33
|
+
# never re-parsed as structured parts. Redefining an inherited attribute
|
|
34
|
+
# is only deterministic under multi-flavor load because this class body
|
|
35
|
+
# lives in ONE file and is never reopened, so lutaml has finished
|
|
36
|
+
# building the table before `Identifiers::Standard` snapshots it — DO NOT
|
|
37
|
+
# split this class across two files.
|
|
38
|
+
attribute :number, :string
|
|
39
|
+
attribute :version, :string
|
|
40
|
+
attribute :stage, :string
|
|
41
|
+
attribute :part, :string
|
|
42
|
+
attribute :label, :string
|
|
43
|
+
|
|
44
|
+
# Polymorphic type map for lutaml::Model key_value (de)serialization: maps
|
|
45
|
+
# the subclass's polymorphic_name to its class name so a stored hash
|
|
46
|
+
# rebuilds the correct identifier type via from_hash.
|
|
47
|
+
OASIS_TYPE_MAP = {
|
|
48
|
+
"pubid:oasis:standard" => "Pubid::Oasis::Identifiers::Standard",
|
|
49
|
+
}.freeze
|
|
50
|
+
|
|
51
|
+
key_value do
|
|
52
|
+
map "_type", to: :_type, polymorphic_map: OASIS_TYPE_MAP
|
|
53
|
+
map "original", to: :original
|
|
54
|
+
map "number", to: :number
|
|
55
|
+
map "version", to: :version
|
|
56
|
+
map "stage", to: :stage
|
|
57
|
+
map "part", to: :part
|
|
58
|
+
map "label", to: :label
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Publisher is always "OASIS". A plain constant (not a `publisher` method)
|
|
62
|
+
# so it doesn't shadow the inherited lutaml `publisher` attribute, which
|
|
63
|
+
# would otherwise fail serialization type validation.
|
|
64
|
+
PUBLISHER = "OASIS"
|
|
65
|
+
|
|
66
|
+
attr_reader :with_publisher
|
|
67
|
+
|
|
68
|
+
def to_s(with_publisher: true, **opts)
|
|
69
|
+
@with_publisher = with_publisher
|
|
70
|
+
render(format: :human, **opts)
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# The decomposition fields. Excluding any of them must also clear
|
|
74
|
+
# `original`, which still spells the excluded value out verbatim.
|
|
75
|
+
DECOMPOSITION_KEYS = %i[number version stage part label].freeze
|
|
76
|
+
|
|
77
|
+
# Widen a partial reference. `#matches?` is
|
|
78
|
+
# `exclude(*ignore) == other.exclude(*ignore)`, and `original` carries
|
|
79
|
+
# every component verbatim, so without this a bare "OASIS WSDM" could
|
|
80
|
+
# never match "OASIS WSDM-v1.1" however much the caller ignored.
|
|
81
|
+
#
|
|
82
|
+
# `original` is cleared ONLY when the exclusion touches the
|
|
83
|
+
# decomposition — the "reset the whole cluster" rule CSA applies to its
|
|
84
|
+
# year-format siblings. A plain `==` still compares `original`, so two
|
|
85
|
+
# slugs that decompose alike but print differently stay distinct: the
|
|
86
|
+
# decomposition loses fragment order and drops repeated fragments, so it
|
|
87
|
+
# is not by itself an identity.
|
|
88
|
+
def exclude(*args)
|
|
89
|
+
result = super
|
|
90
|
+
result.original = nil if args.intersect?(DECOMPOSITION_KEYS)
|
|
91
|
+
result
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
# MR string hooks. `to_slug` delegates to `to_mr_string` and consumers
|
|
95
|
+
# use it as an output FILENAME, so the slug must be unique per document.
|
|
96
|
+
#
|
|
97
|
+
# The publisher lives in the PUBLISHER constant rather than the inherited
|
|
98
|
+
# lutaml attribute, so the base `mr_publisher` returns nil (the BIPM and
|
|
99
|
+
# IANA case) and is supplied here.
|
|
100
|
+
def mr_publisher
|
|
101
|
+
PUBLISHER.downcase
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# The whole verbatim slug, not the decomposed fields: decomposition loses
|
|
105
|
+
# fragment order and drops repeated fragments, so "x-1.0-os-Pt1" and
|
|
106
|
+
# "x-1.0-Pt1-os" would assemble to one slug. `original` cannot collide.
|
|
107
|
+
def mr_number_with_part
|
|
108
|
+
mr_sanitize(original)
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# from_hash is the shared polymorphic dispatch on Pubid::Identifier;
|
|
112
|
+
# OASIS_TYPE_MAP remains as the key_value polymorphic_map.
|
|
113
|
+
|
|
114
|
+
# Parse an OASIS identifier string into an identifier object
|
|
115
|
+
# @param identifier [String] The OASIS identifier string to parse
|
|
116
|
+
# @return [Identifier] The Standard identifier object
|
|
117
|
+
# @raise [Pubid::Errors::ParseError] If parsing fails
|
|
118
|
+
def self.parse(identifier)
|
|
119
|
+
# Reject pathological inputs before they reach the parser
|
|
120
|
+
# (CodeQL rb/polynomial-redos barrier — inline .length by design).
|
|
121
|
+
unless identifier.is_a?(String)
|
|
122
|
+
raise Pubid::Errors::InvalidInputError,
|
|
123
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
127
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
parsed = Parser.parse(identifier)
|
|
131
|
+
Builder.build(parsed)
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
private
|
|
135
|
+
|
|
136
|
+
# Filter by CHARSET, not by an enumerated escape list, so a field added
|
|
137
|
+
# later cannot leak an unsafe character (the BIPM `mr_slug` precedent).
|
|
138
|
+
# Three characters need it today: the "." in every version —
|
|
139
|
+
# Renderers::MrString joins SEGMENTS with ".", so a dot inside one breaks
|
|
140
|
+
# the documented segment structure — plus the space and "]" of a few
|
|
141
|
+
# malformed records.
|
|
142
|
+
#
|
|
143
|
+
# A RUN of non-alphanumerics collapses to one "-", which is why "-" is
|
|
144
|
+
# outside the kept set (BIPM's form, not ETSI's): "v3.0]-PS01" would
|
|
145
|
+
# otherwise print a bare "--".
|
|
146
|
+
#
|
|
147
|
+
# Caveat, the same one BIPM records: "-" is both the intra-slug join and
|
|
148
|
+
# the substitute, so two slugs differing ONLY in which non-slug character
|
|
149
|
+
# they use collapse onto one MR string. The corpus has exactly one such
|
|
150
|
+
# pair, the malformed "OpenC2-MQTT-v1.0] -CS01" spelled once with a
|
|
151
|
+
# normal space and once with a non-breaking one — two spellings of one
|
|
152
|
+
# document. Every genuinely distinct identifier keeps its own slug.
|
|
153
|
+
def mr_sanitize(value)
|
|
154
|
+
slug = value.to_s.downcase.gsub(/[^a-z0-9]+/, "-")
|
|
155
|
+
.gsub(/\A-+|-+\z/, "")
|
|
156
|
+
slug.empty? ? nil : slug
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
end
|
|
160
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
module Identifiers
|
|
6
|
+
# The sole OASIS identifier type. OASIS records carry no document-type
|
|
7
|
+
# distinction in the printed id (every record is `type: OASIS`); the
|
|
8
|
+
# approval stage lives in the `stage` component field, not in the class.
|
|
9
|
+
# Example: "OASIS OSLC-CoreShapes-3.0-PS01-Pt8".
|
|
10
|
+
class Standard < Identifier
|
|
11
|
+
TYPED_STAGES = [
|
|
12
|
+
Pubid::Components::TypedStage.new(
|
|
13
|
+
code: :oasis,
|
|
14
|
+
stage_code: :published,
|
|
15
|
+
type_code: :oasis,
|
|
16
|
+
abbr: ["OASIS"],
|
|
17
|
+
name: "OASIS Standard",
|
|
18
|
+
harmonized_stages: [],
|
|
19
|
+
),
|
|
20
|
+
].freeze
|
|
21
|
+
|
|
22
|
+
def self.type
|
|
23
|
+
{ key: :oasis, web: :standard, title: "OASIS Standard",
|
|
24
|
+
short: "OASIS" }
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Oasis
|
|
7
|
+
# Parslet grammar for printed OASIS identifiers, e.g.
|
|
8
|
+
# "OASIS OSLC-CoreShapes-3.0-PS01-Pt8"
|
|
9
|
+
# "OASIS amqp-core"
|
|
10
|
+
#
|
|
11
|
+
# OASIS slugs are free-form with a highly inconsistent internal structure
|
|
12
|
+
# (varying fragment order, three part spellings, mixed case, a few
|
|
13
|
+
# malformed records with spaces or stray characters). The grammar therefore
|
|
14
|
+
# only strips the "OASIS " publisher prefix and captures the remainder
|
|
15
|
+
# verbatim; the spec/version/stage/part/label decomposition is done in the
|
|
16
|
+
# Builder with order-independent fragment classification. Keeping
|
|
17
|
+
# decomposition out of the PEG avoids brittle backtracking and guarantees a
|
|
18
|
+
# lossless round-trip.
|
|
19
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
20
|
+
rule(:prefix) { str("OASIS") >> str(" ") }
|
|
21
|
+
|
|
22
|
+
# The whole slug, captured verbatim (any character, incl. spaces / "]").
|
|
23
|
+
rule(:slug) { any.repeat(1).as(:original) }
|
|
24
|
+
|
|
25
|
+
rule(:identifier) { prefix >> slug }
|
|
26
|
+
|
|
27
|
+
rule(:root) { identifier }
|
|
28
|
+
|
|
29
|
+
def self.parse(input)
|
|
30
|
+
new.parse(input)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
# Human-readable renderer for OASIS identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Renders the verbatim slug (`original`), prefixed with the "OASIS "
|
|
8
|
+
# publisher token unless `id.with_publisher == false`. Because rendering is
|
|
9
|
+
# a pure echo of `original`, the printed form always round-trips exactly.
|
|
10
|
+
#
|
|
11
|
+
# "OASIS OSLC-CoreShapes-3.0-PS01-Pt8" (with publisher)
|
|
12
|
+
# "OSLC-CoreShapes-3.0-PS01-Pt8" (without)
|
|
13
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
14
|
+
PUBLISHER = "OASIS"
|
|
15
|
+
|
|
16
|
+
def render(context: nil, **opts)
|
|
17
|
+
id = @id
|
|
18
|
+
body = id.original.to_s
|
|
19
|
+
with_publisher?(id) ? "#{PUBLISHER} #{body}" : body
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def with_publisher?(id)
|
|
25
|
+
id.with_publisher != false
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
# Emits `urn:oasis:<slug>`, echoing the verbatim `original` as a single URN
|
|
6
|
+
# segment (OASIS slugs never contain ":"). The only characters that occur in
|
|
7
|
+
# real records outside the URN-safe set are the space and a stray "]" (both
|
|
8
|
+
# only in a handful of malformed records); these are percent-encoded so the
|
|
9
|
+
# URN stays well-formed, and UrnParser reverses them exactly.
|
|
10
|
+
#
|
|
11
|
+
# "OASIS amqp-core" -> "urn:oasis:amqp-core"
|
|
12
|
+
# "OASIS OSLC-CM-v1.0-CS01" -> "urn:oasis:OSLC-CM-v1.0-CS01"
|
|
13
|
+
class UrnGenerator < Pubid::UrnGenerator::Base
|
|
14
|
+
# Character -> percent-encoding for the non-URN-safe characters that
|
|
15
|
+
# actually appear in OASIS slugs. Kept explicit (not a blanket URI escape)
|
|
16
|
+
# so clean slugs — dots, hyphens, mixed case — pass through unchanged.
|
|
17
|
+
ENCODE = { " " => "%20", "]" => "%5D" }.freeze
|
|
18
|
+
|
|
19
|
+
def generate
|
|
20
|
+
slug = identifier.original.to_s.gsub(/[ \]]/) { |c| ENCODE[c] }
|
|
21
|
+
"urn:oasis:#{slug}"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
# Parses OASIS URNs back into identifiers by reconstructing the printed form
|
|
6
|
+
# and delegating to the flavor's text parser.
|
|
7
|
+
#
|
|
8
|
+
# UrnGenerator emits `urn:oasis:<slug>` (single segment) with the space and
|
|
9
|
+
# "]" characters percent-encoded; reverse exactly those two here.
|
|
10
|
+
#
|
|
11
|
+
# urn:oasis:OSLC-CM-v1.0-CS01 -> OASIS OSLC-CM-v1.0-CS01
|
|
12
|
+
# urn:oasis:amqp-core -> OASIS amqp-core
|
|
13
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
14
|
+
DECODE = { "%20" => " ", "%5D" => "]" }.freeze
|
|
15
|
+
|
|
16
|
+
def parse_urn(urn)
|
|
17
|
+
slug = strip_namespace(urn).gsub(/%20|%5D/, DECODE)
|
|
18
|
+
flavor_parse("OASIS #{slug}")
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
data/lib/pubid/oasis.rb
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Oasis
|
|
5
|
+
extend Pubid::PrefixesSupport
|
|
6
|
+
|
|
7
|
+
# Sole OASIS publisher token (see the parser's `prefix` rule). Everything
|
|
8
|
+
# after "OASIS " is a free-form slug, so there are no leading type tokens to
|
|
9
|
+
# exclude.
|
|
10
|
+
PREFIXES = ["OASIS"].freeze
|
|
11
|
+
|
|
12
|
+
autoload :Builder, "#{__dir__}/oasis/builder"
|
|
13
|
+
autoload :Identifier, "#{__dir__}/oasis/identifier"
|
|
14
|
+
autoload :Identifiers, "#{__dir__}/oasis/identifiers"
|
|
15
|
+
autoload :Parser, "#{__dir__}/oasis/parser"
|
|
16
|
+
autoload :Renderer, "#{__dir__}/oasis/renderer"
|
|
17
|
+
autoload :UrnGenerator, "#{__dir__}/oasis/urn_generator"
|
|
18
|
+
autoload :UrnParser, "#{__dir__}/oasis/urn_parser"
|
|
19
|
+
|
|
20
|
+
# Parse an OASIS identifier string
|
|
21
|
+
def self.parse(identifier)
|
|
22
|
+
# Reject pathological inputs before they reach the parser
|
|
23
|
+
# (CodeQL rb/polynomial-redos barrier — inline .length by design).
|
|
24
|
+
unless identifier.is_a?(String)
|
|
25
|
+
raise Pubid::Errors::InvalidInputError,
|
|
26
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
30
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
Identifier.parse(identifier)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Per-flavor format registry: inherits global formats, overrides :human
|
|
37
|
+
Identifier.format_registry = FormatRegistry.new(parent: Identifier.format_registry)
|
|
38
|
+
Identifier.format_registry.register(:human, renderer: Oasis::Renderer)
|
|
39
|
+
|
|
40
|
+
# Auto-discover all identifier types from the Identifiers namespace
|
|
41
|
+
# @return [Array<Class>] identifier classes that define a self.type Hash
|
|
42
|
+
def self.identifier_types
|
|
43
|
+
@identifier_types ||= Identifiers.constants
|
|
44
|
+
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
45
|
+
.select { |c| c.is_a?(Class) && c.singleton_methods(false).include?(:type) }
|
|
46
|
+
.select { |c| c.type.is_a?(Hash) }
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Build typed stage index from identifier types
|
|
50
|
+
# @return [Array<Pubid::Components::TypedStage>] all typed stages
|
|
51
|
+
def self.all_typed_stages
|
|
52
|
+
@all_typed_stages ||= identifier_types.flat_map do |klass|
|
|
53
|
+
if klass.const_defined?(:TYPED_STAGES)
|
|
54
|
+
klass.const_get(:TYPED_STAGES)
|
|
55
|
+
else
|
|
56
|
+
[]
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Lookup: type code -> identifier class
|
|
62
|
+
# @param code [String, Symbol] the type key to find
|
|
63
|
+
# @return [Class, nil] the matching identifier class
|
|
64
|
+
def self.locate_type(code)
|
|
65
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Lookup: abbreviation -> typed stage
|
|
69
|
+
# @param abbr [String, Symbol] the abbreviation to find
|
|
70
|
+
# @return [Pubid::Components::TypedStage, nil] the matching typed stage
|
|
71
|
+
def self.locate_stage(abbr)
|
|
72
|
+
abbr_str = abbr.to_s.upcase
|
|
73
|
+
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Register OASIS flavor with the registry
|
|
79
|
+
Pubid::Registry.register(:oasis, Pubid::Oasis)
|