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,138 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Iala
|
|
7
|
+
# Parslet grammar for IALA identifiers.
|
|
8
|
+
#
|
|
9
|
+
# Accepts every shape that appears on the IALA website or cover page:
|
|
10
|
+
#
|
|
11
|
+
# S1070
|
|
12
|
+
# S1070 Ed 2.0
|
|
13
|
+
# IALA S1070 Ed 2.0
|
|
14
|
+
# S1070 Ed 2.0 (F)
|
|
15
|
+
# R1016:ed2.0(F)
|
|
16
|
+
# C0103-1
|
|
17
|
+
# C0103-1 Ed 3.0
|
|
18
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
19
|
+
include ::Pubid::Parser::CommonParseRules
|
|
20
|
+
|
|
21
|
+
root :identifier
|
|
22
|
+
|
|
23
|
+
rule(:space) { str(" ") }
|
|
24
|
+
rule(:space?) { space.maybe }
|
|
25
|
+
rule(:dash) { str("-") }
|
|
26
|
+
rule(:colon) { str(":") }
|
|
27
|
+
rule(:dot) { str(".") }
|
|
28
|
+
rule(:lparen) { str("(") }
|
|
29
|
+
rule(:rparen) { str(")") }
|
|
30
|
+
|
|
31
|
+
# Type prefix — IALA document classes. GA must be tried before G so it
|
|
32
|
+
# isn't left with a dangling "A". Captured to route to the right
|
|
33
|
+
# Identifiers::* subclass.
|
|
34
|
+
rule(:type_letter) do
|
|
35
|
+
(str("GA") | str("S") | str("R") | str("G") | str("M") |
|
|
36
|
+
str("C") | str("A") | str("L") | str("X") | str("P")).as(:type_letter)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Document number — one or more decimal digits. The dataset historically
|
|
40
|
+
# zero-pads to 4 (S1070, R0126, M0001) but the canonical form going
|
|
41
|
+
# forward is unpadded (M1, GA1.1). Accept any length so both shapes
|
|
42
|
+
# round-trip; the number attribute preserves whatever was parsed.
|
|
43
|
+
rule(:doc_number) do
|
|
44
|
+
match("[0-9]").repeat(1).as(:doc_number)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Dotted continuation that some prefixes use as part of the number:
|
|
48
|
+
# GA01.01 (series.index), L2.1.11 (series.sub.item). Captured into the
|
|
49
|
+
# same :doc_number atom so the number attribute stays a single string
|
|
50
|
+
# (e.g. "01.01", "2.1.11") and the existing builder needs no changes.
|
|
51
|
+
rule(:dotted_number) do
|
|
52
|
+
dot >> match("[0-9]").repeat(1)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
rule(:number_with_dots) do
|
|
56
|
+
doc_number >> dotted_number.repeat.as(:doc_number_dots)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Numeric sub-part suffix(es): "-1", "-9-10", "-11". The catalogue
|
|
60
|
+
# uses ranges like R0124-9-10 & 11 — that compound is captured
|
|
61
|
+
# verbatim and resolved by the caller, not here.
|
|
62
|
+
rule(:subpart) do
|
|
63
|
+
(dash >> digits.as(:subpart_number)).repeat(1).as(:subpart)
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
rule(:code) do
|
|
67
|
+
type_letter >> number_with_dots >> subpart.maybe
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Edition forms observed on covers and listing pages:
|
|
71
|
+
# " Ed 2.0" — cover-page human form
|
|
72
|
+
# ":ed2.0" — listing-page compact form
|
|
73
|
+
rule(:edition_human) do
|
|
74
|
+
(space >> str("Ed") >> space >> edition_value).as(:edition)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
rule(:edition_compact) do
|
|
78
|
+
(colon >> str("ed") >> edition_value).as(:edition)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
rule(:edition_value) do
|
|
82
|
+
(digits >> (dot >> digits).repeat).as(:edition_value)
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
rule(:edition) do
|
|
86
|
+
edition_human | edition_compact
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Language is a single uppercase letter inside parens: (E), (F), …
|
|
90
|
+
rule(:language) do
|
|
91
|
+
(space? >> lparen >>
|
|
92
|
+
(str("E") | str("F") | str("S") | str("C") | str("A") | str("R")).as(:language) >>
|
|
93
|
+
rparen).as(:language_group)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Optional "IALA " prefix.
|
|
97
|
+
rule(:publisher) do
|
|
98
|
+
(str("IALA") >> space).maybe
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
rule(:identifier) do
|
|
102
|
+
annex_identifier | (publisher >> code >> edition.maybe >> language.maybe)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
# Annex to a base publication. Wraps the base code and adds an
|
|
106
|
+
# "Annex" / "ANNEX" marker (case preserved verbatim), an optional
|
|
107
|
+
# single-letter suffix (A/B/C/D), then the usual edition + language.
|
|
108
|
+
# Tried before the flat `identifier` so the annex marker isn't left
|
|
109
|
+
# dangling after a successful base-code match.
|
|
110
|
+
#
|
|
111
|
+
# The letter suffix uses a negative lookahead for a following lowercase
|
|
112
|
+
# letter so the "E" in "Ed 1" isn't mis-captured as annex letter "E".
|
|
113
|
+
rule(:annex_identifier) do
|
|
114
|
+
(publisher >> type_letter >> number_with_dots >> subpart.maybe).as(:base) >>
|
|
115
|
+
space >> (str("Annex") | str("ANNEX")).as(:annex_marker) >>
|
|
116
|
+
(space >> match("[A-Z]").as(:annex_letter) >> match("[a-z]").absent?).maybe >>
|
|
117
|
+
edition.maybe >> language.maybe
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
# Parse a string and return the raw parslet tree.
|
|
121
|
+
# @param string [String]
|
|
122
|
+
# @return [Hash]
|
|
123
|
+
def self.parse(string)
|
|
124
|
+
unless string.is_a?(String)
|
|
125
|
+
raise ::Pubid::Errors::InvalidInputError,
|
|
126
|
+
::Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
if string.length > ::Pubid::MAX_INPUT_LENGTH
|
|
130
|
+
raise ::Pubid::Errors::InvalidInputError,
|
|
131
|
+
::Pubid::INPUT_TOO_LONG_MESSAGE
|
|
132
|
+
end
|
|
133
|
+
|
|
134
|
+
new.parse(string.strip)
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iala
|
|
5
|
+
# Human-readable renderer for IALA identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces strings like:
|
|
8
|
+
# "IALA S1070"
|
|
9
|
+
# "IALA S1070 Ed 2.0"
|
|
10
|
+
# "IALA R1016 Ed 2.0 (F)"
|
|
11
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
12
|
+
def render(context: nil, **_opts)
|
|
13
|
+
id = @id
|
|
14
|
+
|
|
15
|
+
return render_annex(id) if id.is_a?(Identifiers::Annex)
|
|
16
|
+
|
|
17
|
+
rendered = "#{id.publisher} #{id.type_letter}#{id.number}"
|
|
18
|
+
rendered << " Ed #{id.edition}" if id.edition
|
|
19
|
+
rendered << " (#{id.language})" if id.language
|
|
20
|
+
rendered
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# Render an Annex wrapper. The base identifier is rendered first, then
|
|
24
|
+
# the marker form is preserved verbatim ("Annex" vs "ANNEX"), then the
|
|
25
|
+
# optional letter, edition, and language.
|
|
26
|
+
def render_annex(id)
|
|
27
|
+
base_str = id.base.to_s
|
|
28
|
+
rendered = "#{base_str} #{id.annex_form}"
|
|
29
|
+
rendered << " #{id.letter}" if id.letter
|
|
30
|
+
rendered << " Ed #{id.edition}" if id.edition
|
|
31
|
+
rendered << " (#{id.language})" if id.language
|
|
32
|
+
rendered
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iala
|
|
5
|
+
# Generates URN strings for IALA identifiers using the Maritime Resource
|
|
6
|
+
# Name (MRN) namespace that IALA prints on its cover pages.
|
|
7
|
+
#
|
|
8
|
+
# Format: urn:mrn:iala:pub:<type-lower><number>[:ed<edition>][:<lang-lower>]
|
|
9
|
+
# Example: urn:mrn:iala:pub:s1070:ed2.0
|
|
10
|
+
# urn:mrn:iala:pub:r1016:ed2.0:f
|
|
11
|
+
class UrnGenerator
|
|
12
|
+
attr_reader :identifier
|
|
13
|
+
|
|
14
|
+
def initialize(identifier)
|
|
15
|
+
@identifier = identifier
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def generate
|
|
19
|
+
return generate_annex if identifier.is_a?(Identifiers::Annex)
|
|
20
|
+
|
|
21
|
+
parts = ["urn:mrn:iala:pub", code_segment]
|
|
22
|
+
parts << "ed#{identifier.edition}" if identifier.edition
|
|
23
|
+
parts << identifier.language.downcase if identifier.language
|
|
24
|
+
parts.join(":")
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
# URN for an Annex: embeds the base's code, then an "annex" segment
|
|
30
|
+
# (with optional letter suffix), then the annex's own edition/lang.
|
|
31
|
+
# G1045 Annex Ed 1 → urn:mrn:iala:pub:g1045:annex:ed1
|
|
32
|
+
# G1128 ANNEX A Ed 1.6 (E) → urn:mrn:iala:pub:g1128:annex-a:ed1.6:e
|
|
33
|
+
def generate_annex
|
|
34
|
+
base = identifier.base
|
|
35
|
+
parts = ["urn:mrn:iala:pub",
|
|
36
|
+
"#{base.type_letter.downcase}#{base.number}"]
|
|
37
|
+
annex_seg = identifier.letter ? "annex-#{identifier.letter.downcase}" : "annex"
|
|
38
|
+
parts << annex_seg
|
|
39
|
+
parts << "ed#{identifier.edition}" if identifier.edition
|
|
40
|
+
parts << identifier.language.downcase if identifier.language
|
|
41
|
+
parts.join(":")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def code_segment
|
|
45
|
+
"#{identifier.type_letter.downcase}#{identifier.number}"
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iala
|
|
5
|
+
# Parses IALA MRN URNs back into identifiers.
|
|
6
|
+
#
|
|
7
|
+
# UrnGenerator emits:
|
|
8
|
+
# urn:mrn:iala:pub:<type-lower><number>[:ed<edition>][:<lang-lower>]
|
|
9
|
+
# and for Annex identifiers:
|
|
10
|
+
# urn:mrn:iala:pub:<base-code>:annex[-<letter>][:ed<edition>][:<lang>]
|
|
11
|
+
#
|
|
12
|
+
# Examples:
|
|
13
|
+
# urn:mrn:iala:pub:s1070:ed2.0 → IALA S1070 Ed 2.0
|
|
14
|
+
# urn:mrn:iala:pub:r1016:ed2.0:f → IALA R1016 Ed 2.0 (F)
|
|
15
|
+
# urn:mrn:iala:pub:c0103-1 → IALA C0103-1
|
|
16
|
+
# urn:mrn:iala:pub:g1045:annex:ed1 → IALA G1045 Annex Ed 1
|
|
17
|
+
# urn:mrn:iala:pub:g1128:annex-a:ed1.6 → IALA G1128 ANNEX A Ed 1.6
|
|
18
|
+
class UrnParser < Pubid::UrnParser::Base
|
|
19
|
+
PREFIX = "urn:mrn:iala:pub:".freeze
|
|
20
|
+
|
|
21
|
+
def parse_urn(urn)
|
|
22
|
+
body = strip_namespace(urn)
|
|
23
|
+
parts = split_parts(body)
|
|
24
|
+
code = parts.fetch(0)
|
|
25
|
+
|
|
26
|
+
edition = nil
|
|
27
|
+
language = nil
|
|
28
|
+
annex_form = nil
|
|
29
|
+
annex_letter = nil
|
|
30
|
+
|
|
31
|
+
parts.drop(1).each do |seg|
|
|
32
|
+
case seg
|
|
33
|
+
when /\Aannex(-([a-z]))?\z/i
|
|
34
|
+
# UrnGenerator emits "annex" (bare) for the Annex-without-letter
|
|
35
|
+
# form and "annex-X" (lettered) for the uppercase ANNEX form.
|
|
36
|
+
# The human parser accepts both "Annex" and "ANNEX"; mirror the
|
|
37
|
+
# generator's casing so URN round-trip is exact.
|
|
38
|
+
annex_letter = Regexp.last_match(2)&.upcase
|
|
39
|
+
annex_form = annex_letter ? "ANNEX" : "Annex"
|
|
40
|
+
when /\Aed/
|
|
41
|
+
edition = seg.sub(/\Aed/, "")
|
|
42
|
+
when /\A[a-z]\z/i
|
|
43
|
+
language = seg.upcase
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
text = "IALA #{code.upcase}"
|
|
48
|
+
text += " #{annex_form}" if annex_form
|
|
49
|
+
text += " #{annex_letter}" if annex_letter
|
|
50
|
+
text += " Ed #{edition}" if edition
|
|
51
|
+
text += " (#{language})" if language
|
|
52
|
+
flavor_parse(text)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
private
|
|
56
|
+
|
|
57
|
+
def strip_namespace(urn)
|
|
58
|
+
unless urn.downcase.start_with?(PREFIX)
|
|
59
|
+
raise Pubid::UrnParser::Errors::ParseError,
|
|
60
|
+
"Invalid IALA URN: #{urn.inspect}"
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
urn[PREFIX.length..]
|
|
64
|
+
end
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
data/lib/pubid/iala.rb
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iala
|
|
5
|
+
extend Pubid::PrefixesSupport
|
|
6
|
+
|
|
7
|
+
# Sole IALA publisher token (see the parser's `publisher` rule).
|
|
8
|
+
PREFIXES = ["IALA"].freeze
|
|
9
|
+
|
|
10
|
+
autoload :Builder, "#{__dir__}/iala/builder"
|
|
11
|
+
autoload :Identifier, "#{__dir__}/iala/identifier"
|
|
12
|
+
autoload :Identifiers, "#{__dir__}/iala/identifiers"
|
|
13
|
+
autoload :Parser, "#{__dir__}/iala/parser"
|
|
14
|
+
autoload :Renderer, "#{__dir__}/iala/renderer"
|
|
15
|
+
autoload :UrnGenerator, "#{__dir__}/iala/urn_generator"
|
|
16
|
+
autoload :UrnParser, "#{__dir__}/iala/urn_parser"
|
|
17
|
+
|
|
18
|
+
# Parse an IALA identifier string into an identifier object.
|
|
19
|
+
# @param identifier [String] The IALA identifier string to parse
|
|
20
|
+
# @return [Pubid::Iala::Identifier]
|
|
21
|
+
def self.parse(identifier)
|
|
22
|
+
Identifier.parse(identifier)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Per-flavor format registry: inherits global formats, overrides :human
|
|
26
|
+
Identifier.format_registry = FormatRegistry.new(parent: ::Pubid::Identifier.format_registry)
|
|
27
|
+
Identifier.format_registry.register(:human, renderer: Iala::Renderer)
|
|
28
|
+
|
|
29
|
+
# Auto-discover all identifier types from the Identifiers namespace.
|
|
30
|
+
# @return [Array<Class>] identifier classes (Pubid::Identifier subclasses)
|
|
31
|
+
def self.identifier_types
|
|
32
|
+
@identifier_types ||= Identifiers.constants
|
|
33
|
+
.filter_map { |c| begin; Identifiers.const_get(c); rescue NameError; nil; end }
|
|
34
|
+
.select { |c| c.is_a?(Class) && c < Pubid::Identifier }
|
|
35
|
+
.reject { |c| c == Identifier }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Build typed stage index from identifier types
|
|
39
|
+
# @return [Array<Pubid::Components::TypedStage>]
|
|
40
|
+
def self.all_typed_stages
|
|
41
|
+
@all_typed_stages ||= identifier_types.flat_map do |klass|
|
|
42
|
+
klass.const_defined?(:TYPED_STAGES) ? klass.const_get(:TYPED_STAGES) : []
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Lookup: type code -> identifier class
|
|
47
|
+
# @param code [String, Symbol]
|
|
48
|
+
# @return [Class, nil]
|
|
49
|
+
def self.locate_type(code)
|
|
50
|
+
identifier_types.find { |t| t.type[:key].to_s == code.to_s }
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Lookup: abbreviation -> typed stage
|
|
54
|
+
# @param abbr [String, Symbol]
|
|
55
|
+
# @return [Pubid::Components::TypedStage, nil]
|
|
56
|
+
def self.locate_stage(abbr)
|
|
57
|
+
abbr_str = abbr.to_s.upcase
|
|
58
|
+
all_typed_stages.find { |s| s.abbr.any? { |a| a.to_s.upcase == abbr_str } }
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
# Look up an identifier class by its IALA type letter (S, R, G, M, C, X, P).
|
|
62
|
+
# @param letter [String]
|
|
63
|
+
# @return [Class<Identifier>]
|
|
64
|
+
def self.identifier_klass_for_type_letter(letter)
|
|
65
|
+
@by_letter ||= identifier_types.to_h { |klass| [klass.type[:short], klass] }
|
|
66
|
+
@by_letter.fetch(letter.to_s.upcase)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
Pubid::Registry.register(:iala, Pubid::Iala)
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iana
|
|
5
|
+
# Builds an IANA identifier object from a parse tree. There is a single
|
|
6
|
+
# concrete type (Registry), so the builder just extracts the slug fields.
|
|
7
|
+
class Builder
|
|
8
|
+
def self.build(parsed_data)
|
|
9
|
+
new.build(parsed_data)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def build(data)
|
|
13
|
+
# The top-level slug is stored as `number` — it is the relaton-index
|
|
14
|
+
# key; `Identifier#registry` reads it back.
|
|
15
|
+
Identifiers::Registry.new(
|
|
16
|
+
number: data[:registry].to_s,
|
|
17
|
+
sub_registry: data[:sub_registry]&.to_s,
|
|
18
|
+
)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iana
|
|
5
|
+
# Base class for every IANA identifier AND the flavor's parse/create entry
|
|
6
|
+
# point. Concrete identifiers under Pubid::Iana::Identifiers descend from
|
|
7
|
+
# this class, so a parsed IANA id is an instance of Pubid::Iana::Identifier.
|
|
8
|
+
#
|
|
9
|
+
# IANA entries are protocol registries, not numbered standards: the value is
|
|
10
|
+
# a hierarchical registry slug (`registry` before the single "/", optional
|
|
11
|
+
# `sub_registry` after it). Both are kept verbatim.
|
|
12
|
+
#
|
|
13
|
+
# The top-level slug is stored as `number` on the concrete leaf
|
|
14
|
+
# (Identifiers::Registry) so it can serve as the relaton-index key; see the
|
|
15
|
+
# long comment there for why the attribute lives on the leaf. `registry` is
|
|
16
|
+
# a derived reader over it, so it is NOT a serialized key.
|
|
17
|
+
class Identifier < ::Pubid::Identifier
|
|
18
|
+
# The sub-registry slug (e.g. "lowpan_nhc"). nil for top registries; a nil
|
|
19
|
+
# default means it is dropped from the serialized hash when absent.
|
|
20
|
+
attribute :sub_registry, :string
|
|
21
|
+
|
|
22
|
+
# Polymorphic type map for lutaml::Model key_value (de)serialization: maps
|
|
23
|
+
# the single Registry subclass's polymorphic_name to its class name so a
|
|
24
|
+
# stored hash rebuilds the correct identifier type via from_hash.
|
|
25
|
+
IANA_TYPE_MAP = {
|
|
26
|
+
"pubid:iana:registry" => "Pubid::Iana::Identifiers::Registry",
|
|
27
|
+
}.freeze
|
|
28
|
+
|
|
29
|
+
# Identifiers::Registry merges its own block mapping `number` on top of
|
|
30
|
+
# this one. `number` is intentionally absent here: mapping it on the class
|
|
31
|
+
# the leaf inherits from would re-declare the parent's Components::Code
|
|
32
|
+
# attribute (see Identifiers::Registry).
|
|
33
|
+
key_value do
|
|
34
|
+
map "_type", to: :_type, polymorphic_map: IANA_TYPE_MAP
|
|
35
|
+
map "sub_registry", to: :sub_registry
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
# Publisher is always "IANA". A plain constant (not a `publisher` method)
|
|
39
|
+
# so it doesn't shadow the inherited lutaml `publisher` attribute, which
|
|
40
|
+
# would otherwise fail serialization type validation.
|
|
41
|
+
PUBLISHER = "IANA"
|
|
42
|
+
|
|
43
|
+
# Render-time flag stashed by #to_s; when false, the "IANA " token is
|
|
44
|
+
# dropped so callers can recover the bare index-key slug.
|
|
45
|
+
attr_reader :with_publisher
|
|
46
|
+
|
|
47
|
+
# The top-level registry slug. Derived from `number`, which is where it is
|
|
48
|
+
# stored — a plain method is safe because `registry` is no longer a lutaml
|
|
49
|
+
# attribute, so no generated accessor competes with it (the same shape as
|
|
50
|
+
# Pubid::Ietf::Identifiers::Bcp#series).
|
|
51
|
+
def registry
|
|
52
|
+
number
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# The rendered registry code, e.g. "_6lowpan-parameters/lowpan_nhc".
|
|
56
|
+
def code
|
|
57
|
+
sub_registry ? "#{registry}/#{sub_registry}" : registry
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
# Basic string representation. Delegates to the renderer. Always emits the
|
|
61
|
+
# "IANA " token (the authoritative printed form) unless with_publisher is
|
|
62
|
+
# false, in which case the bare slug is rendered.
|
|
63
|
+
def to_s(with_publisher: true, **opts)
|
|
64
|
+
@with_publisher = with_publisher
|
|
65
|
+
render(format: :human, **opts)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# --- Machine-readable slug -------------------------------------------
|
|
69
|
+
# The shared MrString renderer composes publisher/type/number/... from the
|
|
70
|
+
# inherited attributes, none of which IANA populates: `publisher` is a
|
|
71
|
+
# constant rather than an attribute (see PUBLISHER above) and the builder
|
|
72
|
+
# sets no typed_stage. Without these two overrides every IANA identifier
|
|
73
|
+
# rendered the empty MR string, so all of them collided on `to_mr_string`
|
|
74
|
+
# and `to_slug` (issue #142) — and `to_slug` is used as a filename.
|
|
75
|
+
#
|
|
76
|
+
# Verified over the 3405 published relaton-data-iana rows: the resulting
|
|
77
|
+
# slugs are all distinct and stay inside the documented [a-z0-9._-] MR
|
|
78
|
+
# charset. Note that IANA slugs legitimately contain "_", which is MR's
|
|
79
|
+
# supplement separator, so an IANA MR is not re-parseable by
|
|
80
|
+
# Pubid::Parsers::MrString; uniqueness and filename-safety are what these
|
|
81
|
+
# buy, not MR round-tripping.
|
|
82
|
+
def mr_publisher
|
|
83
|
+
PUBLISHER.downcase
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def mr_number_with_part
|
|
87
|
+
[number, sub_registry].compact.join(".").downcase
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
# The guard below has to cover this surface too: without it a nil number
|
|
91
|
+
# renders the bare publisher token "iana" for every affected row, i.e. one
|
|
92
|
+
# filename shared by all of them.
|
|
93
|
+
def to_mr_string
|
|
94
|
+
require_number!
|
|
95
|
+
super
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# The top-level slug moved from a `registry` key into `number` with no
|
|
99
|
+
# alias, so a row serialized before that change deserializes with a nil
|
|
100
|
+
# number and NO error: lutaml ignores unknown keys, and relaton's
|
|
101
|
+
# Index::FileIO#id_supported? skips its round-trip check for concrete
|
|
102
|
+
# subclasses (every IANA id is an Identifiers::Registry). Failing loudly
|
|
103
|
+
# at render time is the only thing that surfaces a stale index.
|
|
104
|
+
#
|
|
105
|
+
# It is called from all three identity surfaces — to_s (via Renderer),
|
|
106
|
+
# to_urn (via UrnGenerator) and to_mr_string — because guarding only one
|
|
107
|
+
# still lets every stale row collide on the other two ("urn:iana:",
|
|
108
|
+
# "iana"), which is the silent overwrite this whole change exists to
|
|
109
|
+
# prevent.
|
|
110
|
+
def require_number!
|
|
111
|
+
return unless number.nil? || number.to_s.empty?
|
|
112
|
+
|
|
113
|
+
raise ArgumentError,
|
|
114
|
+
"Cannot render #{self.class} with an empty number " \
|
|
115
|
+
"(a pre-`number` index row stored the registry slug under " \
|
|
116
|
+
"`registry`; regenerate the index)"
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
# from_hash is the shared polymorphic dispatch on Pubid::Identifier;
|
|
120
|
+
# IANA_TYPE_MAP remains as the key_value polymorphic_map.
|
|
121
|
+
|
|
122
|
+
# Parse an IANA identifier string into an identifier object
|
|
123
|
+
# @param identifier [String] The IANA identifier string to parse
|
|
124
|
+
# @return [Identifier] The appropriate identifier object
|
|
125
|
+
def self.parse(identifier)
|
|
126
|
+
unless identifier.is_a?(String)
|
|
127
|
+
raise Pubid::Errors::InvalidInputError,
|
|
128
|
+
Pubid::INPUT_NOT_A_STRING_MESSAGE
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
if identifier.length > Pubid::MAX_INPUT_LENGTH
|
|
132
|
+
raise Pubid::Errors::InvalidInputError, Pubid::INPUT_TOO_LONG_MESSAGE
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
parsed = Parser.parse(identifier)
|
|
136
|
+
Builder.build(parsed)
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iana
|
|
5
|
+
module Identifiers
|
|
6
|
+
# The sole IANA identifier type: a protocol registry (optionally with a
|
|
7
|
+
# sub-registry). Its class name yields the polymorphic `_type` tag
|
|
8
|
+
# "pubid:iana:registry".
|
|
9
|
+
#
|
|
10
|
+
# Examples:
|
|
11
|
+
# IANA _6lowpan-parameters
|
|
12
|
+
# IANA _6lowpan-parameters/lowpan_nhc
|
|
13
|
+
class Registry < Identifier
|
|
14
|
+
# The top-level registry slug ("_6lowpan-parameters"), and the index
|
|
15
|
+
# key: relaton-index bsearches on `id.root.number.to_s`, and every IANA
|
|
16
|
+
# identifier is its own root (the flavor has no wrapper or supplement
|
|
17
|
+
# types), so an empty key silently defeats the search for every row.
|
|
18
|
+
#
|
|
19
|
+
# An IANA identifier carries no numeric document number — digits only
|
|
20
|
+
# ever appear glued inside a slug token (`sip-parameters-13`,
|
|
21
|
+
# `idna-tables-11.0.0`), never as a separable component — so the slug
|
|
22
|
+
# itself is the key, exactly as an Internet-Draft's slug is
|
|
23
|
+
# (lib/pubid/ietf/identifiers/serialization.rb). Keying on the TOP-LEVEL
|
|
24
|
+
# slug rather than the full `registry/sub_registry` code means a
|
|
25
|
+
# registry and all of its sub-registries cluster into one bucket, the
|
|
26
|
+
# analogue of a draft clustering with its versions.
|
|
27
|
+
#
|
|
28
|
+
# WHY THIS IS DECLARED HERE AND NOT ON Pubid::Iana::Identifier:
|
|
29
|
+
# it redefines the parent ::Pubid::Identifier's
|
|
30
|
+
# `attribute :number, Components::Code` as a plain :string. Declaring
|
|
31
|
+
# that on a class the concrete type INHERITS from resolves against the
|
|
32
|
+
# parent definition nondeterministically under multi-flavor load — it
|
|
33
|
+
# passes an IANA-only run and can flip `root.number` to "" under the
|
|
34
|
+
# full suite (the IEEE/IETF lesson; see
|
|
35
|
+
# lib/pubid/ieee/identifiers/code_number.rb and CLAUDE.md). Declaring it
|
|
36
|
+
# directly on the leaf removes the ambiguity at the point of use.
|
|
37
|
+
# For the same reason, never define a `#number` *method* — it would
|
|
38
|
+
# collide with lutaml's generated accessor.
|
|
39
|
+
# spec/pubid/iana/root_number_spec.rb guards this and must run under the
|
|
40
|
+
# FULL suite to be meaningful.
|
|
41
|
+
attribute :number, :string
|
|
42
|
+
|
|
43
|
+
# Merged by lutaml with the base's key_value block, which maps `_type`
|
|
44
|
+
# and `sub_registry`. `registry` is deliberately NOT stored — it is the
|
|
45
|
+
# same string as `number`, and the base exposes it as a derived reader.
|
|
46
|
+
key_value do
|
|
47
|
+
map "number", to: :number
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
# IANA registries carry no revision/stage lifecycle; a single published
|
|
51
|
+
# typed stage keeps parity with the other flavors' type registries.
|
|
52
|
+
TYPED_STAGES = [
|
|
53
|
+
Pubid::Components::TypedStage.new(
|
|
54
|
+
code: :pubiana,
|
|
55
|
+
stage_code: :published,
|
|
56
|
+
type_code: :iana,
|
|
57
|
+
abbr: ["IANA"],
|
|
58
|
+
name: "IANA Registry",
|
|
59
|
+
harmonized_stages: [],
|
|
60
|
+
),
|
|
61
|
+
].freeze
|
|
62
|
+
|
|
63
|
+
def self.type
|
|
64
|
+
{ key: :iana, web: :registry, title: "IANA Registry", short: "IANA" }
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "parslet"
|
|
4
|
+
|
|
5
|
+
module Pubid
|
|
6
|
+
module Iana
|
|
7
|
+
# Parslet grammar for IANA registry identifiers.
|
|
8
|
+
#
|
|
9
|
+
# Accepts the authoritative printed form "IANA <slug>[/<sub-slug>]" as well
|
|
10
|
+
# as a bare index-key slug (no "IANA " prefix). The optional prefix is
|
|
11
|
+
# consumed and discarded — the renderer always re-emits it.
|
|
12
|
+
#
|
|
13
|
+
# Slugs use only [a-zA-Z0-9._-] and contain at most one "/", so a plain
|
|
14
|
+
# character-class repeat parses them; there is no ReDoS surface.
|
|
15
|
+
class Parser < ::Pubid::Parser::Grammar
|
|
16
|
+
# A single registry slug: letters, digits, dot, underscore, hyphen.
|
|
17
|
+
rule(:slug) { match['a-zA-Z0-9._\-'].repeat(1) }
|
|
18
|
+
|
|
19
|
+
# Optional publisher prefix. The trailing space is required, so a
|
|
20
|
+
# space-free slug never triggers it; PEG `.maybe` backtracks the whole
|
|
21
|
+
# sequence if the space is absent (e.g. a slug that happens to start
|
|
22
|
+
# "IANA...").
|
|
23
|
+
rule(:iana_prefix) { (str("IANA") >> str(" ")).maybe }
|
|
24
|
+
|
|
25
|
+
rule(:identifier) do
|
|
26
|
+
iana_prefix >>
|
|
27
|
+
slug.as(:registry) >>
|
|
28
|
+
(str("/") >> slug.as(:sub_registry)).maybe
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
rule(:root) { identifier }
|
|
32
|
+
|
|
33
|
+
def self.parse(input)
|
|
34
|
+
new.parse(input)
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Pubid
|
|
4
|
+
module Iana
|
|
5
|
+
# Human-readable renderer for IANA registry identifiers.
|
|
6
|
+
#
|
|
7
|
+
# Produces the authoritative printed form:
|
|
8
|
+
# "IANA _6lowpan-parameters"
|
|
9
|
+
# "IANA _6lowpan-parameters/lowpan_nhc"
|
|
10
|
+
#
|
|
11
|
+
# With `with_publisher: false` on the identifier it renders the bare
|
|
12
|
+
# index-key slug instead (no "IANA " token).
|
|
13
|
+
class Renderer < ::Pubid::Renderers::Base
|
|
14
|
+
PUBLISHER = "IANA"
|
|
15
|
+
|
|
16
|
+
def render(**_opts)
|
|
17
|
+
id = @id
|
|
18
|
+
# A stale (pre-`number`) row must not render as a bare "IANA " or
|
|
19
|
+
# "IANA /lowpan_nhc"; see Identifier#require_number!.
|
|
20
|
+
id.require_number!
|
|
21
|
+
code = id.code
|
|
22
|
+
with_publisher?(id) ? "#{PUBLISHER} #{code}" : code
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
|
|
27
|
+
def with_publisher?(id)
|
|
28
|
+
id.with_publisher != false
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|